Added rtSportsMode

dev_3.3_BLE
Faiz Hashmi 2 years ago
parent b136f63e40
commit 0830b4d248

@ -31,13 +31,17 @@ import com.cloud.diplomaticquarterapp.utils.UiChannel
import com.google.gson.Gson import com.google.gson.Gson
import com.jeremyliao.liveeventbus.LiveEventBus import com.jeremyliao.liveeventbus.LiveEventBus
import com.jstyle.blesdk2301.Util.BleSDK import com.jstyle.blesdk2301.Util.BleSDK
import com.jstyle.blesdk2301.Util.BleSDK.EnterActivityMode
import com.jstyle.blesdk2301.Util.BleSDK.GetDynamicHRWithMode import com.jstyle.blesdk2301.Util.BleSDK.GetDynamicHRWithMode
import com.jstyle.blesdk2301.Util.BleSDK.GetHRVDataWithMode import com.jstyle.blesdk2301.Util.BleSDK.GetHRVDataWithMode
import com.jstyle.blesdk2301.Util.BleSDK.GetStaticHRWithMode import com.jstyle.blesdk2301.Util.BleSDK.GetStaticHRWithMode
import com.jstyle.blesdk2301.Util.BleSDK.GetTemperature_historyData import com.jstyle.blesdk2301.Util.BleSDK.GetTemperature_historyData
import com.jstyle.blesdk2301.Util.BleSDK.GetTotalActivityDataWithMode
import com.jstyle.blesdk2301.Util.BleSDK.Oxygen_data import com.jstyle.blesdk2301.Util.BleSDK.Oxygen_data
import com.jstyle.blesdk2301.callback.BleConnectionListener import com.jstyle.blesdk2301.callback.BleConnectionListener
import com.jstyle.blesdk2301.constant.BleConst import com.jstyle.blesdk2301.constant.BleConst
import com.jstyle.blesdk2301.constant.DeviceKey
import com.jstyle.blesdk2301.model.ExerciseMode
import com.lepu.blepro.event.EventMsgConst import com.lepu.blepro.event.EventMsgConst
import com.lepu.blepro.event.EventMsgConst.Ble.* import com.lepu.blepro.event.EventMsgConst.Ble.*
import com.lepu.blepro.event.InterfaceEvent import com.lepu.blepro.event.InterfaceEvent
@ -116,6 +120,9 @@ class BleBridge(private var flutterEngine: FlutterEngine, private var mainActivi
private const val GET_STATIC_HEART_RATE_SMART_RING = "getStaticHeartRateSmartRing" private const val GET_STATIC_HEART_RATE_SMART_RING = "getStaticHeartRateSmartRing"
private const val GET_HRV_SMART_RING = "getHRVSmartRing" private const val GET_HRV_SMART_RING = "getHRVSmartRing"
private const val GET_BLOOD_OXYGEN_SMART_RING = "getBloodOxygenSmartRing" private const val GET_BLOOD_OXYGEN_SMART_RING = "getBloodOxygenSmartRing"
private const val GET_TOTAL_STEP_COUNT_SMART_RING = "getTotalStepCountSmartRing"
private const val GET_SPORTS_MODE_DATA_SMART_RING = "getSportsModeDataSmartRing"
private const val STOP_SPORTS_MODE_DATA_SMART_RING = "stopSportsModeDataSmartRing"
val scan = BleScanManager() val scan = BleScanManager()
@ -307,7 +314,7 @@ class BleBridge(private var flutterEngine: FlutterEngine, private var mainActivi
} else if (methodCall.method == DISCONNECT_DEVICE_SMART_RING) { } else if (methodCall.method == DISCONNECT_DEVICE_SMART_RING) {
disConnectDeviceSmartRing() disConnectDeviceSmartRing()
} else if (methodCall.method == GET_BATTERY_LEVEL_SMART_RING) { } else if (methodCall.method == GET_BATTERY_LEVEL_SMART_RING) {
getBatteryLevelSmartRing(); getBatteryLevelSmartRing()
} else if (methodCall.method == GET_TEMPERATURE_SMART_RING) { } else if (methodCall.method == GET_TEMPERATURE_SMART_RING) {
getTemperatureSmartRing(modeStart); getTemperatureSmartRing(modeStart);
} else if (methodCall.method == GET_DYNAMIC_HEART_RATE_SMART_RING) { } else if (methodCall.method == GET_DYNAMIC_HEART_RATE_SMART_RING) {
@ -318,6 +325,12 @@ class BleBridge(private var flutterEngine: FlutterEngine, private var mainActivi
getHRVSmartRing(modeStart); getHRVSmartRing(modeStart);
} else if (methodCall.method == GET_BLOOD_OXYGEN_SMART_RING) { } else if (methodCall.method == GET_BLOOD_OXYGEN_SMART_RING) {
getBloodOxygenSmartRing(modeStart); getBloodOxygenSmartRing(modeStart);
} else if (methodCall.method == GET_TOTAL_STEP_COUNT_SMART_RING) {
getTotalStepCountSmartRing(modeStart);
} else if (methodCall.method == GET_SPORTS_MODE_DATA_SMART_RING) {
getSportsModeDataSmartRing(modeStart);
} else if (methodCall.method == STOP_SPORTS_MODE_DATA_SMART_RING) {
stopSportsModeDataSmartRing(modeStart);
} else { } else {
result.notImplemented() result.notImplemented()
} }
@ -1132,12 +1145,29 @@ class BleBridge(private var flutterEngine: FlutterEngine, private var mainActivi
sendValue(Oxygen_data(mode)) sendValue(Oxygen_data(mode))
} }
private fun getTotalStepCountSmartRing(mode: Byte) {
sendValue(GetTotalActivityDataWithMode(mode, ""))
}
private fun getSportsModeDataSmartRing(mode: Byte) {
// 9 for walt
sendValue(EnterActivityMode(2, 9, ExerciseMode.Status_START))
}
private fun stopSportsModeDataSmartRing(mode: Byte) {
// 9 for walt
sendValue(EnterActivityMode(2, 9, ExerciseMode.Status_FINISH))
}
private var temperatureDataCount = 0 private var temperatureDataCount = 0
private var dynamicHeartRateDataCount = 0 private var dynamicHeartRateDataCount = 0
private var staticHeartRateDataCount = 0 private var staticHeartRateDataCount = 0
private var hrvDataCount = 0 private var hrvDataCount = 0
private var bloodOxygenDataCount = 0 private var bloodOxygenDataCount = 0
private var totalActityDataCount = 0
override fun dataCallback(maps: Map<String?, Any?>?) { override fun dataCallback(maps: Map<String?, Any?>?) {
super.dataCallback(maps) super.dataCallback(maps)
val dataType = getDataType(maps) val dataType = getDataType(maps)
@ -1234,7 +1264,7 @@ class BleBridge(private var flutterEngine: FlutterEngine, private var mainActivi
} }
} }
BleConst.Blood_oxygen -> { BleConst.GetAutomaticSpo2Monitoring -> {
bloodOxygenDataCount++ bloodOxygenDataCount++
if (finish) { if (finish) {
bloodOxygenDataCount = 0 bloodOxygenDataCount = 0
@ -1255,6 +1285,33 @@ class BleBridge(private var flutterEngine: FlutterEngine, private var mainActivi
} }
} }
} }
BleConst.GetTotalActivityData -> {
totalActityDataCount++
if (finish) {
totalActityDataCount = 0
Log.d("TotalStepCountSmartRing", maps.toString())
val returnData = mapOf("type" to "TotalStepCountSmartRing", "data" to gson.toJson(maps))
eventSink?.success(returnData)
}
if (totalActityDataCount == 50) {
totalActityDataCount = 0
if (finish) {
totalActityDataCount = 0
Log.d("TotalStepCountSmartRing", maps.toString())
val returnData = mapOf("type" to "TotalStepCountSmartRing", "data" to gson.toJson(maps))
eventSink?.success(returnData)
} else {
getTotalStepCountSmartRing(modeContinue) //继续读取
}
}
}
BleConst.SportData -> {
Log.d("RTSportDataSmartRing", maps.toString())
val returnData = mapOf("type" to "RTSportDataSmartRing", "data" to gson.toJson(maps))
eventSink?.success(returnData)
}
} }
} }

@ -98,6 +98,7 @@ open class BaseActivity : AppCompatActivity(), DataListener2301 {
} else maps[DeviceKey.DataType] as String? } else maps[DeviceKey.DataType] as String?
} }
@JvmStatic
protected fun getData(maps: Map<String?, Any?>): Map<String, String>? { protected fun getData(maps: Map<String?, Any?>): Map<String, String>? {
return maps[DeviceKey.Data] as Map<String, String>? return maps[DeviceKey.Data] as Map<String, String>?
} }

@ -38,11 +38,14 @@ class _SmartRingAllInOneConnectScreenState extends State<SmartRingAllInOneConnec
case SmartRingOperationsEnum.Temperature: case SmartRingOperationsEnum.Temperature:
return "Temperature"; return "Temperature";
case SmartRingOperationsEnum.HeartRateStatic: case SmartRingOperationsEnum.HeartRate:
return "HR Static"; return "HeartRate";
case SmartRingOperationsEnum.HeartRateDynamic: case SmartRingOperationsEnum.RealTimeHeartRate:
return "HR Dynamic"; return "Realtime HeartRate";
case SmartRingOperationsEnum.TotalStepCount:
return "Total Step Count";
case SmartRingOperationsEnum.HRV: case SmartRingOperationsEnum.HRV:
return "HRV"; return "HRV";
@ -50,6 +53,9 @@ class _SmartRingAllInOneConnectScreenState extends State<SmartRingAllInOneConnec
case SmartRingOperationsEnum.BloodOxygen: case SmartRingOperationsEnum.BloodOxygen:
return "Blood Oxygen"; return "Blood Oxygen";
case SmartRingOperationsEnum.SportsMode:
return "Sports Mode";
case SmartRingOperationsEnum.BatteryLevel: case SmartRingOperationsEnum.BatteryLevel:
return "Battery Level"; return "Battery Level";
} }
@ -62,12 +68,16 @@ class _SmartRingAllInOneConnectScreenState extends State<SmartRingAllInOneConnec
myTrackersViewModel.getTemperatureSmartRing(); myTrackersViewModel.getTemperatureSmartRing();
Navigator.of(context).push(FadePage(page: SmartRingInfoScreen(smartRingOperationsEnum))); Navigator.of(context).push(FadePage(page: SmartRingInfoScreen(smartRingOperationsEnum)));
break; break;
case SmartRingOperationsEnum.HeartRateStatic: case SmartRingOperationsEnum.HeartRate:
myTrackersViewModel.getStaticHeartRateSmartRing(); myTrackersViewModel.getStaticHeartRateSmartRing();
Navigator.of(context).push(FadePage(page: SmartRingInfoScreen(smartRingOperationsEnum))); Navigator.of(context).push(FadePage(page: SmartRingInfoScreen(smartRingOperationsEnum)));
break; break;
case SmartRingOperationsEnum.HeartRateDynamic: case SmartRingOperationsEnum.RealTimeHeartRate:
myTrackersViewModel.getDynamicHeartRateSmartRing(); // myTrackersViewModel.getDynamicHeartRateSmartRing();
// Navigator.of(context).push(FadePage(page: SmartRingInfoScreen(smartRingOperationsEnum)));
break;
case SmartRingOperationsEnum.TotalStepCount:
myTrackersViewModel.getTotalStepCountSmartRing();
Navigator.of(context).push(FadePage(page: SmartRingInfoScreen(smartRingOperationsEnum))); Navigator.of(context).push(FadePage(page: SmartRingInfoScreen(smartRingOperationsEnum)));
break; break;
case SmartRingOperationsEnum.HRV: case SmartRingOperationsEnum.HRV:
@ -76,7 +86,12 @@ class _SmartRingAllInOneConnectScreenState extends State<SmartRingAllInOneConnec
break; break;
case SmartRingOperationsEnum.BloodOxygen: case SmartRingOperationsEnum.BloodOxygen:
myTrackersViewModel.getBloodOxygenSmartRing(); myTrackersViewModel.getBloodOxygenSmartRing();
// Navigator.of(context).push(FadePage(page: SmartRingInfoScreen(smartRingOperationsEnum))); Navigator.of(context).push(FadePage(page: SmartRingInfoScreen(smartRingOperationsEnum)));
break;
case SmartRingOperationsEnum.SportsMode:
myTrackersViewModel.getSportsModeDataSmartRing();
Navigator.of(context).push(FadePage(page: SmartRingInfoScreen(smartRingOperationsEnum)));
break; break;
case SmartRingOperationsEnum.BatteryLevel: case SmartRingOperationsEnum.BatteryLevel:
myTrackersViewModel.getBatteryLevelSmartRing(); myTrackersViewModel.getBatteryLevelSmartRing();

@ -1,25 +1,34 @@
import 'dart:developer';
import 'package:diplomaticquarterapp/config/size_config.dart';
import 'package:diplomaticquarterapp/pages/medical/my_trackers/ble_device_type_screens/checkme_ecg_info_screen.dart';
import 'package:diplomaticquarterapp/pages/medical/my_trackers/ble_models/checkmepro_all_in_one_models/checkme_bp_model.dart';
import 'package:diplomaticquarterapp/pages/medical/my_trackers/ble_models/checkmepro_all_in_one_models/checkme_ecg_model.dart';
import 'package:diplomaticquarterapp/pages/medical/my_trackers/ble_models/checkmepro_all_in_one_models/checkme_glucose_model.dart';
import 'package:diplomaticquarterapp/pages/medical/my_trackers/ble_models/checkmepro_all_in_one_models/checkme_oxi_model.dart';
import 'package:diplomaticquarterapp/pages/medical/my_trackers/ble_models/checkmepro_all_in_one_models/checkme_temperature_model.dart';
import 'package:diplomaticquarterapp/pages/medical/my_trackers/ble_models/smart_ring_models.dart'; import 'package:diplomaticquarterapp/pages/medical/my_trackers/ble_models/smart_ring_models.dart';
import 'package:diplomaticquarterapp/pages/medical/my_trackers/my_trackers_view_model/my_trackers_view_model.dart'; import 'package:diplomaticquarterapp/pages/medical/my_trackers/my_trackers_view_model/my_trackers_view_model.dart';
import 'package:diplomaticquarterapp/uitl/utils_new.dart'; import 'package:diplomaticquarterapp/uitl/utils_new.dart';
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
class SmartRingInfoScreen extends StatelessWidget { class SmartRingInfoScreen extends StatefulWidget {
final SmartRingOperationsEnum smartRingOperationsEnum; final SmartRingOperationsEnum smartRingOperationsEnum;
const SmartRingInfoScreen(this.smartRingOperationsEnum); const SmartRingInfoScreen(this.smartRingOperationsEnum);
@override
State<SmartRingInfoScreen> createState() => _SmartRingInfoScreenState();
}
class _SmartRingInfoScreenState extends State<SmartRingInfoScreen> {
MyTrackersViewModel myTrackersViewModel;
@override
void initState() {
myTrackersViewModel = context.read<MyTrackersViewModel>();
super.initState();
}
@override
void dispose() {
myTrackersViewModel.stopSportsModeDataSmartRing();
super.dispose();
}
String getTrackerNameByEnum(SmartRingOperationsEnum typeEnum) { String getTrackerNameByEnum(SmartRingOperationsEnum typeEnum) {
switch (typeEnum) { switch (typeEnum) {
case SmartRingOperationsEnum.Temperature: case SmartRingOperationsEnum.Temperature:
@ -28,10 +37,10 @@ class SmartRingInfoScreen extends StatelessWidget {
case SmartRingOperationsEnum.BloodOxygen: case SmartRingOperationsEnum.BloodOxygen:
return "Blood Oxygen"; return "Blood Oxygen";
case SmartRingOperationsEnum.HeartRateDynamic: case SmartRingOperationsEnum.RealTimeHeartRate:
return "HeartRate Dynamic"; return "HeartRate Dynamic";
case SmartRingOperationsEnum.HeartRateStatic: case SmartRingOperationsEnum.HeartRate:
return "HeartRate Static"; return "HeartRate Static";
case SmartRingOperationsEnum.HRV: case SmartRingOperationsEnum.HRV:
@ -39,6 +48,12 @@ class SmartRingInfoScreen extends StatelessWidget {
case SmartRingOperationsEnum.BatteryLevel: case SmartRingOperationsEnum.BatteryLevel:
return "Battery Level"; return "Battery Level";
case SmartRingOperationsEnum.TotalStepCount:
return "Total Step Count";
case SmartRingOperationsEnum.SportsMode:
return "Sports Mode";
} }
return "Battery Level"; return "Battery Level";
} }
@ -47,17 +62,21 @@ class SmartRingInfoScreen extends StatelessWidget {
switch (smartRingOperationsEnum) { switch (smartRingOperationsEnum) {
case SmartRingOperationsEnum.Temperature: case SmartRingOperationsEnum.Temperature:
return buildTemperatureWidget(myTrackersVm, context); return buildTemperatureWidget(myTrackersVm, context);
case SmartRingOperationsEnum.HeartRateStatic: case SmartRingOperationsEnum.HeartRate:
return buildHeartRateStaticWidget(myTrackersVm, context); return buildHeartRateStaticWidget(myTrackersVm, context);
case SmartRingOperationsEnum.HeartRateDynamic: case SmartRingOperationsEnum.RealTimeHeartRate:
return buildHeartRateDynamicWidget(myTrackersVm, context); return buildHeartRateDynamicWidget(myTrackersVm, context);
case SmartRingOperationsEnum.TotalStepCount:
return buildTotalStepCountHistoryWidget(myTrackersVm, context);
case SmartRingOperationsEnum.HRV: case SmartRingOperationsEnum.HRV:
return buildHrvWidget(myTrackersVm, context); return buildHrvWidget(myTrackersVm, context);
case SmartRingOperationsEnum.BloodOxygen: case SmartRingOperationsEnum.BloodOxygen:
// TODO: Handle this case. return buildBloodOxygenWidget(myTrackersVm, context);
break;
case SmartRingOperationsEnum.BatteryLevel: case SmartRingOperationsEnum.BatteryLevel:
return buildBatteryLevelWidget(myTrackersVm, context); return buildBatteryLevelWidget(myTrackersVm, context);
case SmartRingOperationsEnum.SportsMode:
return buildRtSportsDataSmartRingWidget(myTrackersVm, context);
break;
} }
return getNoDataWidget(context); return getNoDataWidget(context);
} }
@ -167,6 +186,64 @@ class SmartRingInfoScreen extends StatelessWidget {
} }
} }
Widget buildRtSportsDataSmartRingWidget(MyTrackersViewModel myTrackersVm, BuildContext context) {
if (myTrackersVm.filesLoader) {
return Center(child: CircularProgressIndicator());
} else if (myTrackersVm.rtSportDataSmartRingModel != null) {
return Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
mHeight(24.0),
Row(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
Column(
children: [
Text("Step", style: TextStyle(fontSize: 20)),
Text(myTrackersViewModel.rtSportDataSmartRingModel.step.toString(), style: TextStyle(fontSize: 50, fontWeight: FontWeight.bold)),
Text("", style: TextStyle(fontSize: 10)),
],
),
Column(
children: [
Text("Calories", style: TextStyle(fontSize: 20)),
Text(myTrackersViewModel.rtSportDataSmartRingModel.calories.toString(), style: TextStyle(fontSize: 50, fontWeight: FontWeight.bold)),
Text("kCal", style: TextStyle(fontSize: 10)),
],
),
Column(
children: [
Text("♥︎", style: TextStyle(fontSize: 20)),
Text(myTrackersViewModel.rtSportDataSmartRingModel.heartRate.toString(), style: TextStyle(fontSize: 50, fontWeight: FontWeight.bold)),
Text("/min", style: TextStyle(fontSize: 10)),
],
),
],
),
mHeight(30.0),
Row(
mainAxisAlignment: MainAxisAlignment.start,
children: [
Column(
children: [
Text("Time", style: TextStyle(fontSize: 20)),
Text(myTrackersViewModel.rtSportDataSmartRingModel.exerciseTime.toString(), style: TextStyle(fontSize: 50, fontWeight: FontWeight.bold)),
Text("seconds", style: TextStyle(fontSize: 10)),
],
),
],
),
// buildStatusForBP(myTrackersViewModel.bpRtResultModel.result),
// mHeight(24.0),
],
),
);
} else {
return getNoDataWidget(context);
}
}
Widget buildHrvWidget(MyTrackersViewModel myTrackersVm, BuildContext context) { Widget buildHrvWidget(MyTrackersViewModel myTrackersVm, BuildContext context) {
if (myTrackersVm.filesLoader) { if (myTrackersVm.filesLoader) {
return Center(child: CircularProgressIndicator()); return Center(child: CircularProgressIndicator());
@ -187,6 +264,8 @@ class SmartRingInfoScreen extends StatelessWidget {
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Text("Date: ${smartRingHrvModel.date}"),
mHeight(4.0),
Text("highBP: ${smartRingHrvModel.highBP}"), Text("highBP: ${smartRingHrvModel.highBP}"),
mHeight(4.0), mHeight(4.0),
Text("lowBP: ${smartRingHrvModel.lowBP}"), Text("lowBP: ${smartRingHrvModel.lowBP}"),
@ -210,189 +289,104 @@ class SmartRingInfoScreen extends StatelessWidget {
} }
} }
Widget buildBatteryLevelWidget(MyTrackersViewModel myTrackersVm, BuildContext context) { Widget buildTotalStepCountHistoryWidget(MyTrackersViewModel myTrackersVm, BuildContext context) {
if (myTrackersVm.filesLoader) { if (myTrackersVm.filesLoader) {
return Center(child: CircularProgressIndicator()); return Center(child: CircularProgressIndicator());
} else if (myTrackersVm.smartRingBatteryLevel != null && myTrackersVm.smartRingBatteryLevel.isNotEmpty) { } else if (myTrackersVm.smartRingStepCountHistory != null && myTrackersVm.smartRingStepCountHistory.isNotEmpty) {
return Center( return Expanded(
child: Text("Battery Level: ${myTrackersVm.smartRingBatteryLevel}"), child: ListView.separated(
itemCount: myTrackersVm.smartRingStepCountHistory.length,
separatorBuilder: (context, index) => SizedBox(height: 14),
shrinkWrap: true,
reverse: false,
itemBuilder: (context, index) {
SmartRingStepCountModel smartRingStepCountModel = myTrackersVm.smartRingStepCountHistory[index];
return InkWell(
onTap: () => Navigator.pop(context),
child: Container(
decoration: cardRadius(12),
padding: EdgeInsets.all(12.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text("date: ${smartRingStepCountModel.date}"),
mHeight(4.0),
Text("calories: ${smartRingStepCountModel.calories}"),
mHeight(4.0),
Text("distance: ${smartRingStepCountModel.distance}"),
mHeight(4.0),
Text("exerciseMinutes: ${smartRingStepCountModel.exerciseMinutes}"),
mHeight(4.0),
Text("exerciseTime: ${smartRingStepCountModel.exerciseTime}"),
mHeight(4.0),
Text("distance: ${smartRingStepCountModel.distance}"),
mHeight(4.0),
Text("goal: ${smartRingStepCountModel.goal}"),
mHeight(4.0),
Text("step: ${smartRingStepCountModel.step}"),
],
),
),
);
},
),
); );
} else { } else {
return getNoDataWidget(context); return getNoDataWidget(context);
} }
} }
Widget buildECGWidget(MyTrackersViewModel myTrackersVm, BuildContext context) { Widget buildBloodOxygenWidget(MyTrackersViewModel myTrackersVm, BuildContext context) {
return Column( if (myTrackersVm.filesLoader) {
mainAxisSize: MainAxisSize.max, return Center(child: CircularProgressIndicator());
children: [ } else if (myTrackersVm.smartRingBloodOxygenHistory != null && myTrackersVm.smartRingBloodOxygenHistory.isNotEmpty) {
if (myTrackersVm.filesLoader) ...[ return Expanded(
Center(child: CircularProgressIndicator()) child: ListView.separated(
] else if (myTrackersVm.checkMeEcg != null && myTrackersVm.checkMeEcg.isNotEmpty) ...[ itemCount: myTrackersVm.smartRingBloodOxygenHistory.length,
Material( separatorBuilder: (context, index) => SizedBox(height: 14),
child: ListView.separated( shrinkWrap: true,
itemCount: myTrackersVm.checkMeEcg.length, reverse: false,
separatorBuilder: (context, index) => SizedBox(height: 14), itemBuilder: (context, index) {
shrinkWrap: true, SmartRingGenericModel smartRingGenericModel = myTrackersVm.smartRingBloodOxygenHistory[index];
reverse: false, return InkWell(
itemBuilder: (context, index) { onTap: () => Navigator.pop(context),
CheckMeECGModel checkMeECGModel = myTrackersVm.checkMeEcg[index]; child: Container(
return InkWell( decoration: cardRadius(12),
onTap: () { padding: EdgeInsets.all(12.0),
myTrackersVm.getEcgWaveDataFromCheckMePro(checkMeECGModel.timeString); child: Column(
// Navigator.push(context, MaterialPageRoute(builder: (context) => CheckMeECGInfoScreen(SmartRingOperationsEnum.ECGTracker))); crossAxisAlignment: CrossAxisAlignment.start,
}, children: [
child: Container( Text("Date: ${smartRingGenericModel.date}"),
decoration: cardRadius(12), mHeight(4.0),
padding: EdgeInsets.all(12.0), Text("BloodOxygen: ${smartRingGenericModel.value}"),
child: Column( ],
crossAxisAlignment: CrossAxisAlignment.start, ),
children: [ ),
Text("Date: ${checkMeECGModel.date}"), );
mHeight(8), },
Text("TimeString: ${checkMeECGModel.timeString}"), ),
], );
), } else {
), return getNoDataWidget(context);
); }
},
),
)
] else ...[
getNoDataWidget(context),
]
],
);
}
Widget buildOxiWidget(MyTrackersViewModel myTrackersVm, BuildContext context) {
return Column(
mainAxisSize: MainAxisSize.max,
children: [
if (myTrackersVm.filesLoader) ...[
Center(child: CircularProgressIndicator())
] else if (myTrackersVm.checkMeOxi != null && myTrackersVm.checkMeOxi.isNotEmpty) ...[
Material(
child: ListView.separated(
itemCount: myTrackersVm.checkMeOxi.length,
separatorBuilder: (context, index) => SizedBox(height: 14),
shrinkWrap: true,
reverse: false,
itemBuilder: (context, index) {
CheckMeOxiModel checkMeOxiModel = myTrackersVm.checkMeOxi[index];
return InkWell(
onTap: () => Navigator.pop(context),
child: Container(
decoration: cardRadius(12),
padding: EdgeInsets.all(12.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text("PR: ${checkMeOxiModel.pr} PI: ${checkMeOxiModel.pi}"),
mHeight(4.0),
Text("Oxi: ${checkMeOxiModel.oxy}"),
mHeight(4.0),
Text("Date: ${checkMeOxiModel.date}"),
],
),
),
);
},
),
)
] else ...[
getNoDataWidget(context),
]
],
);
}
Widget buildBPWidget(MyTrackersViewModel myTrackersVm, BuildContext context) {
return Column(
mainAxisSize: MainAxisSize.max,
children: [
if (myTrackersVm.filesLoader) ...[
Center(child: CircularProgressIndicator())
] else if (myTrackersVm.checkMeBP != null && myTrackersVm.checkMeBP.isNotEmpty) ...[
Material(
child: ListView.separated(
itemCount: myTrackersVm.checkMeBP.length,
separatorBuilder: (context, index) => SizedBox(height: 14),
shrinkWrap: true,
reverse: false,
itemBuilder: (context, index) {
CheckMeBPModel checkMeBPModel = myTrackersVm.checkMeBP[index];
return InkWell(
onTap: () => Navigator.pop(context),
child: Container(
decoration: cardRadius(12),
padding: EdgeInsets.all(12.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text("DIA: ${checkMeBPModel.dia} SYS: ${checkMeBPModel.sys}"),
mHeight(4.0),
Text("PR: ${checkMeBPModel.pr}"),
mHeight(4.0),
Text("Date: ${checkMeBPModel.date}"),
],
),
),
);
},
),
)
] else ...[
getNoDataWidget(context),
]
],
);
} }
Widget buildGlucoseWidget(MyTrackersViewModel myTrackersVm, BuildContext context) { Widget buildBatteryLevelWidget(MyTrackersViewModel myTrackersVm, BuildContext context) {
return Column( if (myTrackersVm.filesLoader) {
mainAxisSize: MainAxisSize.max, return Center(child: CircularProgressIndicator());
children: [ } else if (myTrackersVm.smartRingBatteryLevel != null && myTrackersVm.smartRingBatteryLevel.isNotEmpty) {
if (myTrackersVm.filesLoader) ...[ return Center(
Center(child: CircularProgressIndicator()) child: Text("Battery Level: ${myTrackersVm.smartRingBatteryLevel}"),
] else if (myTrackersVm.checkMeGlucose != null && myTrackersVm.checkMeGlucose.isNotEmpty) ...[ );
Material( } else {
child: ListView.separated( return getNoDataWidget(context);
itemCount: myTrackersVm.checkMeGlucose.length, }
separatorBuilder: (context, index) => SizedBox(height: 14),
shrinkWrap: true,
reverse: false,
itemBuilder: (context, index) {
CheckMeGlucoseModel checkMeGlucoseModel = myTrackersVm.checkMeGlucose[index];
return InkWell(
onTap: () => null,
child: Container(
decoration: cardRadius(12),
padding: EdgeInsets.all(12.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text("Glucose: ${checkMeGlucoseModel.glu}"),
mHeight(4.0),
Text("Date: ${checkMeGlucoseModel.date}"),
],
),
),
);
},
),
)
] else ...[
getNoDataWidget(context),
]
],
);
} }
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return AppScaffold( return AppScaffold(
appBarTitle: "${getTrackerNameByEnum(smartRingOperationsEnum)}", appBarTitle: "${getTrackerNameByEnum(widget.smartRingOperationsEnum)}",
showNewAppBar: true, showNewAppBar: true,
isShowDecPage: false, isShowDecPage: false,
showNewAppBarTitle: true, showNewAppBarTitle: true,
@ -403,7 +397,7 @@ class SmartRingInfoScreen extends StatelessWidget {
children: [ children: [
Consumer( Consumer(
builder: (BuildContext context, MyTrackersViewModel myTrackersVm, Widget child) { builder: (BuildContext context, MyTrackersViewModel myTrackersVm, Widget child) {
return getAllInOneOperationWidgets(myTrackersVm, smartRingOperationsEnum, context); return getAllInOneOperationWidgets(myTrackersVm, widget.smartRingOperationsEnum, context);
}, },
), ),
], ],

@ -302,7 +302,7 @@ class BleChannel {
} }
} }
static Future<String> getStaticHeartRateSmartRing() async { static Future<String> getStaticHeartRateSmartRing() async {
try { try {
print("----------Flutter getStaticHeartRateSmartRing -------"); print("----------Flutter getStaticHeartRateSmartRing -------");
final String result = await platform.invokeMethod('getStaticHeartRateSmartRing'); final String result = await platform.invokeMethod('getStaticHeartRateSmartRing');
@ -314,7 +314,7 @@ class BleChannel {
} }
} }
static Future<String> getHRVSmartRing() async { static Future<String> getHRVSmartRing() async {
try { try {
print("----------Flutter getHRVSmartRing -------"); print("----------Flutter getHRVSmartRing -------");
final String result = await platform.invokeMethod('getHRVSmartRing'); final String result = await platform.invokeMethod('getHRVSmartRing');
@ -326,7 +326,7 @@ class BleChannel {
} }
} }
static Future<String> getBloodOxygenSmartRing() async { static Future<String> getBloodOxygenSmartRing() async {
try { try {
print("----------Flutter getBloodOxygenSmartRing -------"); print("----------Flutter getBloodOxygenSmartRing -------");
final String result = await platform.invokeMethod('getBloodOxygenSmartRing'); final String result = await platform.invokeMethod('getBloodOxygenSmartRing');
@ -338,5 +338,39 @@ class BleChannel {
} }
} }
static Future<String> getTotalStepCountSmartRing() async {
try {
print("----------Flutter getTotalStepCountSmartRing -------");
final String result = await platform.invokeMethod('getTotalStepCountSmartRing');
print("----------Flutter getTotalStepCountSmartRing result -------");
return result;
} catch (e) {
return "Error: $e";
}
}
static Future<String> startSportsModeDataSmartRing() async {
try {
print("----------Flutter getSportsModeDataSmartRing -------");
final String result = await platform.invokeMethod('getSportsModeDataSmartRing');
print("----------Flutter getSportsModeDataSmartRing result -------");
return result;
} catch (e) {
return "Error: $e";
}
}
static Future<String> stopSportsModeDataSmartRing() async {
try {
print("----------Flutter stopSportsModeDataSmartRing -------");
final String result = await platform.invokeMethod('stopSportsModeDataSmartRing');
print("----------Flutter stopSportsModeDataSmartRing result -------");
return result;
} catch (e) {
return "Error: $e";
}
}
} }

@ -6,16 +6,14 @@ String getValueKeyBySmartRingOperation(SmartRingOperationsEnum smartRingOperatio
switch (smartRingOperationsEnum) { switch (smartRingOperationsEnum) {
case SmartRingOperationsEnum.Temperature: case SmartRingOperationsEnum.Temperature:
return "temperature"; return "temperature";
case SmartRingOperationsEnum.HeartRateStatic: case SmartRingOperationsEnum.HeartRate:
return "onceHeartValue"; return "onceHeartValue";
case SmartRingOperationsEnum.HeartRateDynamic: case SmartRingOperationsEnum.RealTimeHeartRate:
return "arrayDynamicHR"; return "arrayDynamicHR";
case SmartRingOperationsEnum.HRV: case SmartRingOperationsEnum.HRV:
// TODO: Handle this case.
break; break;
case SmartRingOperationsEnum.BloodOxygen: case SmartRingOperationsEnum.BloodOxygen:
// TODO: Handle this case. return "Blood_oxygen";
break;
case SmartRingOperationsEnum.BatteryLevel: case SmartRingOperationsEnum.BatteryLevel:
return "batteryLevel"; return "batteryLevel";
} }
@ -36,7 +34,41 @@ class SmartRingGenericModel {
Map<String, dynamic> toJson(SmartRingOperationsEnum smartRingOperationsEnum) { Map<String, dynamic> toJson(SmartRingOperationsEnum smartRingOperationsEnum) {
final Map<String, dynamic> data = new Map<String, dynamic>(); final Map<String, dynamic> data = new Map<String, dynamic>();
data['date'] = this.date; data['date'] = this.date;
data['arrayDynamicHR'] = getValueKeyBySmartRingOperation(smartRingOperationsEnum); data['${getValueKeyBySmartRingOperation(smartRingOperationsEnum)}'] = this.value;
return data;
}
}
class SmartRingStepCountModel {
String date;
String goal;
String distance;
String step;
String exerciseTime;
String calories;
String exerciseMinutes;
SmartRingStepCountModel({this.date, this.goal, this.distance, this.step, this.exerciseTime, this.calories, this.exerciseMinutes});
SmartRingStepCountModel.fromJson(Map<String, dynamic> json) {
date = json['date'];
goal = json['goal'];
distance = json['distance'];
step = json['step'];
exerciseTime = json['ExerciseTime'];
calories = json['calories'];
exerciseMinutes = json['exerciseMinutes'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['date'] = this.date;
data['goal'] = this.goal;
data['distance'] = this.distance;
data['step'] = this.step;
data['ExerciseTime'] = this.exerciseTime;
data['calories'] = this.calories;
data['exerciseMinutes'] = this.exerciseMinutes;
return data; return data;
} }
} }
@ -74,3 +106,28 @@ class SmartRingHrvModel {
return data; return data;
} }
} }
class RtSportDataSmartRingModel {
String heartRate;
String step;
String exerciseTime;
String calories;
RtSportDataSmartRingModel({this.heartRate, this.step, this.exerciseTime, this.calories});
RtSportDataSmartRingModel.fromJson(Map<String, dynamic> json) {
heartRate = json['heartRate'];
step = json['step'];
exerciseTime = json['ExerciseTime'];
calories = json['calories'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['heartRate'] = this.heartRate;
data['step'] = this.step;
data['ExerciseTime'] = this.exerciseTime;
data['calories'] = this.calories;
return data;
}
}

@ -34,7 +34,7 @@ import 'package:provider/provider.dart';
enum TrackerTypeEnum { OxymeterTracker, BloodPressureTracker, BloodSugarTracker, ECGTracker, WeightScale, Temperature, Spirometer, SmartRing, AllInOneTracker } enum TrackerTypeEnum { OxymeterTracker, BloodPressureTracker, BloodSugarTracker, ECGTracker, WeightScale, Temperature, Spirometer, SmartRing, AllInOneTracker }
enum SmartRingOperationsEnum { Temperature, HeartRateStatic, HeartRateDynamic, HRV, BloodOxygen, BatteryLevel } enum SmartRingOperationsEnum { Temperature, HeartRate, RealTimeHeartRate, TotalStepCount, HRV, BloodOxygen, SportsMode, BatteryLevel }
//NativeEventNames //NativeEventNames
@ -62,6 +62,8 @@ String kDynamicHeartRateSmartRing = "DynamicHeartRateSmartRing";
String kStaticHeartRateSmartRing = "StaticHeartRateSmartRing"; String kStaticHeartRateSmartRing = "StaticHeartRateSmartRing";
String kHrvSmartRing = "HrvSmartRing"; String kHrvSmartRing = "HrvSmartRing";
String kBloodOxygenSmartRing = "BloodOxygenSmartRing"; String kBloodOxygenSmartRing = "BloodOxygenSmartRing";
String kTotalStepCountSmartRing = "TotalStepCountSmartRing";
String kRTSportDataSmartRing = "RTSportDataSmartRing";
class MyTrackersViewModel extends ChangeNotifier { class MyTrackersViewModel extends ChangeNotifier {
EventChannel eventChannel = EventChannel('BLE-Platform-Bridge-Event'); EventChannel eventChannel = EventChannel('BLE-Platform-Bridge-Event');
@ -145,8 +147,9 @@ class MyTrackersViewModel extends ChangeNotifier {
]; ];
List<SmartRingOperationsEnum> smartRingTrackers = [ List<SmartRingOperationsEnum> smartRingTrackers = [
SmartRingOperationsEnum.Temperature, SmartRingOperationsEnum.Temperature,
SmartRingOperationsEnum.HeartRateStatic, SmartRingOperationsEnum.HeartRate,
SmartRingOperationsEnum.HeartRateDynamic, SmartRingOperationsEnum.TotalStepCount,
SmartRingOperationsEnum.SportsMode,
SmartRingOperationsEnum.HRV, SmartRingOperationsEnum.HRV,
SmartRingOperationsEnum.BloodOxygen, SmartRingOperationsEnum.BloodOxygen,
SmartRingOperationsEnum.BatteryLevel, SmartRingOperationsEnum.BatteryLevel,
@ -1396,6 +1399,7 @@ class MyTrackersViewModel extends ChangeNotifier {
if (event['type'] == kBloodOxygenSmartRing) { if (event['type'] == kBloodOxygenSmartRing) {
logger.i(event['data']); logger.i(event['data']);
updateSmartRingBloodOxygenHistory(json.decode(event['data']));
} }
if (event['type'] == kHrvSmartRing) { if (event['type'] == kHrvSmartRing) {
@ -1412,6 +1416,16 @@ class MyTrackersViewModel extends ChangeNotifier {
logger.i(event['data']); logger.i(event['data']);
updateSmartRingHeartRateDynamicHistory(json.decode(event['data'])); updateSmartRingHeartRateDynamicHistory(json.decode(event['data']));
} }
if (event['type'] == kTotalStepCountSmartRing) {
logger.i(event['data']);
updateSmartRingStepCountHistory(json.decode(event['data']));
}
if (event['type'] == kRTSportDataSmartRing) {
logger.i(event['data']);
updateRtSportDataSmartRingModel(json.decode(event['data']));
}
}); });
await scanForSmartRing(); await scanForSmartRing();
@ -1487,6 +1501,21 @@ class MyTrackersViewModel extends ChangeNotifier {
logger.i(jsonEncode(data.toString())); logger.i(jsonEncode(data.toString()));
} }
Future<void> getTotalStepCountSmartRing() async {
String data = await BleChannel.getTotalStepCountSmartRing();
logger.i(jsonEncode(data.toString()));
}
Future<void> getSportsModeDataSmartRing() async {
String data = await BleChannel.startSportsModeDataSmartRing();
logger.i(jsonEncode(data.toString()));
}
Future<void> stopSportsModeDataSmartRing() async {
String data = await BleChannel.stopSportsModeDataSmartRing();
logger.i(jsonEncode(data.toString()));
}
String smartRingBatteryLevel; String smartRingBatteryLevel;
void updateSmartRingBatteryLevelModel(dynamic returnData) { void updateSmartRingBatteryLevelModel(dynamic returnData) {
@ -1515,6 +1544,23 @@ class MyTrackersViewModel extends ChangeNotifier {
notifyListeners(); notifyListeners();
} }
//BLOOD OXYGEN
List<SmartRingGenericModel> smartRingBloodOxygenHistory;
void updateSmartRingBloodOxygenHistory(dynamic returnData) {
Map<dynamic, dynamic> data = returnData;
List response = (data["dicData"]) as List;
List<SmartRingGenericModel> list = List.generate(response.length, (index) => SmartRingGenericModel.fromJson(response[index], SmartRingOperationsEnum.BloodOxygen));
if (smartRingBloodOxygenHistory == null) {
smartRingBloodOxygenHistory = list;
} else {
smartRingBloodOxygenHistory.addAll(list);
}
notifyListeners();
}
//HEART RATE DYNAMIC //HEART RATE DYNAMIC
List<SmartRingGenericModel> smartRingHeartRateDynamicHistory; List<SmartRingGenericModel> smartRingHeartRateDynamicHistory;
@ -1523,7 +1569,7 @@ class MyTrackersViewModel extends ChangeNotifier {
Map<dynamic, dynamic> data = returnData; Map<dynamic, dynamic> data = returnData;
List response = (data["dicData"]) as List; List response = (data["dicData"]) as List;
List<SmartRingGenericModel> list = List.generate(response.length, (index) => SmartRingGenericModel.fromJson(response[index], SmartRingOperationsEnum.HeartRateDynamic)); List<SmartRingGenericModel> list = List.generate(response.length, (index) => SmartRingGenericModel.fromJson(response[index], SmartRingOperationsEnum.RealTimeHeartRate));
if (smartRingHeartRateDynamicHistory == null) { if (smartRingHeartRateDynamicHistory == null) {
smartRingHeartRateDynamicHistory = list; smartRingHeartRateDynamicHistory = list;
} else { } else {
@ -1539,7 +1585,7 @@ class MyTrackersViewModel extends ChangeNotifier {
Map<dynamic, dynamic> data = returnData; Map<dynamic, dynamic> data = returnData;
List response = (data["dicData"]) as List; List response = (data["dicData"]) as List;
List<SmartRingGenericModel> list = List.generate(response.length, (index) => SmartRingGenericModel.fromJson(response[index], SmartRingOperationsEnum.HeartRateStatic)); List<SmartRingGenericModel> list = List.generate(response.length, (index) => SmartRingGenericModel.fromJson(response[index], SmartRingOperationsEnum.HeartRate));
if (smartRingHeartRateStaticHistory == null) { if (smartRingHeartRateStaticHistory == null) {
smartRingHeartRateStaticHistory = list; smartRingHeartRateStaticHistory = list;
} else { } else {
@ -1564,4 +1610,29 @@ class MyTrackersViewModel extends ChangeNotifier {
log("smartRingHrvHistory: ${smartRingHrvHistory.length}"); log("smartRingHrvHistory: ${smartRingHrvHistory.length}");
notifyListeners(); notifyListeners();
} }
List<SmartRingStepCountModel> smartRingStepCountHistory;
void updateSmartRingStepCountHistory(dynamic returnData) {
Map<dynamic, dynamic> data = returnData;
List response = (data["dicData"]) as List;
List<SmartRingStepCountModel> list = List.generate(response.length, (index) => SmartRingStepCountModel.fromJson(response[index]));
if (smartRingStepCountHistory == null) {
smartRingStepCountHistory = list;
} else {
smartRingStepCountHistory.addAll(list);
}
log("smartRingStepCountHistory: ${smartRingStepCountHistory.length}");
notifyListeners();
}
RtSportDataSmartRingModel rtSportDataSmartRingModel;
void updateRtSportDataSmartRingModel(dynamic returnData) {
Map<dynamic, dynamic> data = returnData;
rtSportDataSmartRingModel = RtSportDataSmartRingModel.fromJson(data["dicData"] as Map);
log("rtSportDataSmartRingModel: ${data.toString()}");
notifyListeners();
}
} }

Loading…
Cancel
Save