Added SmartRingOperations

dev_3.3_BLE
Faiz Hashmi 1 year ago
parent c1751c05db
commit b136f63e40

@ -116,6 +116,7 @@
<!-- </intent-filter>-->
<!-- </receiver>-->
<service android:name="com.cloud.diplomaticquarterapp.smart_ring_2301.BleService"/>
<!-- Geofencing -->
<service android:name=".geofence.intent_receivers.GeofenceTransitionsJobIntentService" android:exported="true" android:permission="android.permission.BIND_JOB_SERVICE" />
<receiver android:name=".geofence.intent_receivers.GeofenceBroadcastReceiver" android:enabled="true" android:exported="false" />

@ -22,6 +22,7 @@ class MainActivity : FlutterFragmentActivity() {
PlatformBridge(flutterEngine, this).create()
OpenTokPlatformBridge(flutterEngine, this).create()
BleManager.init(this)
BleBridge(flutterEngine, this).createBleBridge(BleScanManager()) { name, bluetoothDevice ->
// Handle the scan result here
Log.d("MainActivity", "Received scan result: $name, $bluetoothDevice")

@ -31,6 +31,11 @@ import com.cloud.diplomaticquarterapp.utils.UiChannel
import com.google.gson.Gson
import com.jeremyliao.liveeventbus.LiveEventBus
import com.jstyle.blesdk2301.Util.BleSDK
import com.jstyle.blesdk2301.Util.BleSDK.GetDynamicHRWithMode
import com.jstyle.blesdk2301.Util.BleSDK.GetHRVDataWithMode
import com.jstyle.blesdk2301.Util.BleSDK.GetStaticHRWithMode
import com.jstyle.blesdk2301.Util.BleSDK.GetTemperature_historyData
import com.jstyle.blesdk2301.Util.BleSDK.Oxygen_data
import com.jstyle.blesdk2301.callback.BleConnectionListener
import com.jstyle.blesdk2301.constant.BleConst
import com.lepu.blepro.event.EventMsgConst
@ -106,6 +111,11 @@ class BleBridge(private var flutterEngine: FlutterEngine, private var mainActivi
private const val CONNECT_DEVICE_SMART_RING = "connectDeviceSmartRing"
private const val DISCONNECT_DEVICE_SMART_RING = "disConnectDeviceSmartRing"
private const val GET_BATTERY_LEVEL_SMART_RING = "getBatteryLevelSmartRing"
private const val GET_TEMPERATURE_SMART_RING = "getTemperatureSmartRing"
private const val GET_DYNAMIC_HEART_RATE_SMART_RING = "getDynamicHeartRateSmartRing"
private const val GET_STATIC_HEART_RATE_SMART_RING = "getStaticHeartRateSmartRing"
private const val GET_HRV_SMART_RING = "getHRVSmartRing"
private const val GET_BLOOD_OXYGEN_SMART_RING = "getBloodOxygenSmartRing"
val scan = BleScanManager()
@ -120,6 +130,11 @@ class BleBridge(private var flutterEngine: FlutterEngine, private var mainActivi
eventSink?.success(deviceInfoString)
}
var modeStart: Byte = 0x00 //开始获取数据 start getting data
var modeContinue: Byte = 0x02 //继续读取数据 continue reading data
var modeDelete = 0x99.toByte()
var mUserData: MutableList<UserBean> = java.util.ArrayList()
@ -243,6 +258,7 @@ class BleBridge(private var flutterEngine: FlutterEngine, private var mainActivi
@SuppressLint("NewApi")
fun createBleBridge(bleScanManager: BleScanManager, scanResultHandler: (String, BluetoothDevice) -> Unit) {
subscribeForSmartRingEvents();
channel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL)
Echannel = EventChannel(flutterEngine.dartExecutor.binaryMessenger, EVENTCHANNEL)
channel.setMethodCallHandler { methodCall: MethodCall, result: MethodChannel.Result ->
@ -292,6 +308,16 @@ class BleBridge(private var flutterEngine: FlutterEngine, private var mainActivi
disConnectDeviceSmartRing()
} else if (methodCall.method == GET_BATTERY_LEVEL_SMART_RING) {
getBatteryLevelSmartRing();
} else if (methodCall.method == GET_TEMPERATURE_SMART_RING) {
getTemperatureSmartRing(modeStart);
} else if (methodCall.method == GET_DYNAMIC_HEART_RATE_SMART_RING) {
getDynamicHeartRateSmartRing(modeStart);
} else if (methodCall.method == GET_STATIC_HEART_RATE_SMART_RING) {
getStaticHeartRateSmartRing(modeStart);
} else if (methodCall.method == GET_HRV_SMART_RING) {
getHRVSmartRing(modeStart);
} else if (methodCall.method == GET_BLOOD_OXYGEN_SMART_RING) {
getBloodOxygenSmartRing(modeStart);
} else {
result.notImplemented()
}
@ -1054,6 +1080,7 @@ class BleBridge(private var flutterEngine: FlutterEngine, private var mainActivi
override fun ConnectionSucceeded() { //连接设备成功 Successfully connected the device
Log.e("BleStatus", "ConnectionSucceeded")
getBatteryLevelSmartRing()
}
override fun Connecting() { //设备连接中 Device is connected
@ -1072,7 +1099,6 @@ class BleBridge(private var flutterEngine: FlutterEngine, private var mainActivi
Log.e("BleStatus", "BluetoothSwitchIsTurnedOff")
}
})
}
private fun disConnectDeviceSmartRing() {
@ -1084,15 +1110,150 @@ class BleBridge(private var flutterEngine: FlutterEngine, private var mainActivi
sendValue(BleSDK.GetDeviceBatteryLevel());
}
private fun getTemperatureSmartRing(mode: Byte) {
sendValue(GetTemperature_historyData(mode, ""))
}
private fun getDynamicHeartRateSmartRing(mode: Byte) {
sendValue(GetDynamicHRWithMode(mode, ""))
}
private fun getStaticHeartRateSmartRing(mode: Byte) {
sendValue(GetStaticHRWithMode(mode, ""))
}
private fun getHRVSmartRing(mode: Byte) {
sendValue(GetHRVDataWithMode(mode, ""))
}
private fun getBloodOxygenSmartRing(mode: Byte) {
sendValue(Oxygen_data(mode))
}
private var temperatureDataCount = 0
private var dynamicHeartRateDataCount = 0
private var staticHeartRateDataCount = 0
private var hrvDataCount = 0
private var bloodOxygenDataCount = 0
override fun dataCallback(maps: Map<String?, Any?>?) {
super.dataCallback(maps)
val dataType = getDataType(maps)
Log.d("dataCallbackType", dataType.toString())
val finish = getEnd(maps!!)
when (dataType) {
BleConst.GetDeviceBatteryLevel -> {
Log.d("BatteryLevel", maps.toString())
val returnData = mapOf("type" to "BatteryLevelSmartRing", "data" to gson.toJson(maps))
eventSink?.success(returnData)
}
BleConst.Temperature_history -> {
temperatureDataCount++
if (finish) {
temperatureDataCount = 0
Log.d("TemperatureSmartRing", maps.toString())
val returnData = mapOf("type" to "TemperatureSmartRing", "data" to gson.toJson(maps))
eventSink?.success(returnData)
}
if (temperatureDataCount == 50) {
temperatureDataCount = 0
if (finish) {
Log.d("TemperatureSmartRing", maps.toString())
val returnData = mapOf("type" to "TemperatureSmartRing", "data" to gson.toJson(maps))
eventSink?.success(returnData)
} else {
getTemperatureSmartRing(modeContinue)
}
}
}
BleConst.GetDynamicHR -> {
dynamicHeartRateDataCount++
if (finish) {
dynamicHeartRateDataCount = 0
Log.d("DynamicHRSmartRing", maps.toString())
val returnData = mapOf("type" to "DynamicHeartRateSmartRing", "data" to gson.toJson(maps))
eventSink?.success(returnData)
}
if (dynamicHeartRateDataCount == 50) {
dynamicHeartRateDataCount = 0
if (finish) {
Log.d("DynamicHRSmartRing", maps.toString())
val returnData = mapOf("type" to "DynamicHeartRateSmartRing", "data" to gson.toJson(maps))
eventSink?.success(returnData)
} else {
getDynamicHeartRateSmartRing(modeContinue)
}
}
}
BleConst.GetStaticHR -> {
staticHeartRateDataCount++
if (finish) {
staticHeartRateDataCount = 0
Log.d("StaticHRSmartRing", maps.toString())
val returnData = mapOf("type" to "StaticHeartRateSmartRing", "data" to gson.toJson(maps))
eventSink?.success(returnData)
}
if (staticHeartRateDataCount == 50) {
staticHeartRateDataCount = 0
if (finish) {
Log.d("StaticHRSmartRing", maps.toString())
val returnData = mapOf("type" to "StaticHeartRateSmartRing", "data" to gson.toJson(maps))
eventSink?.success(returnData)
} else {
getStaticHeartRateSmartRing(modeContinue)
}
}
}
BleConst.GetHRVData -> {
hrvDataCount++
if (finish) {
hrvDataCount = 0
Log.d("HrvSmartRing", maps.toString())
val returnData = mapOf("type" to "HrvSmartRing", "data" to gson.toJson(maps))
eventSink?.success(returnData)
}
if (hrvDataCount == 50) {
if (finish) {
hrvDataCount = 0
Log.d("HrvSmartRing", maps.toString())
val returnData = mapOf("type" to "HrvSmartRing", "data" to gson.toJson(maps))
eventSink?.success(returnData)
} else {
getHRVSmartRing(modeContinue)
}
}
}
BleConst.Blood_oxygen -> {
bloodOxygenDataCount++
if (finish) {
bloodOxygenDataCount = 0
Log.d("BloodOxygenSmartRing", maps.toString())
val returnData = mapOf("type" to "BloodOxygenSmartRing", "data" to gson.toJson(maps))
eventSink?.success(returnData)
}
if (bloodOxygenDataCount == 50) {
bloodOxygenDataCount = 0
if (finish) {
bloodOxygenDataCount = 0
Log.d("BloodOxygenSmartRing", maps.toString())
val returnData = mapOf("type" to "BloodOxygenSmartRing", "data" to gson.toJson(maps))
eventSink?.success(returnData)
} else {
getBloodOxygenSmartRing(modeContinue)
}
}
}
}
}

@ -19,12 +19,12 @@ import javax.annotation.Nullable
open class BaseActivity : AppCompatActivity(), DataListener2301 {
private var subscription: Disposable? = null
override fun onCreate(@Nullable savedInstanceState: Bundle?) {
public override fun onCreate(@Nullable savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
subscribe()
// subscribeForSmartRingEvents()
}
protected open fun subscribe() {
protected open fun subscribeForSmartRingEvents() {
subscription = RxBus.instance.toObservable(BleData::class.java).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe { bleData ->
val action = bleData.action
if (action == BleService.ACTION_DATA_AVAILABLE) {

@ -30,6 +30,7 @@ class _BleDevicesScreenState extends State<BleDevicesScreen> {
@override
void dispose() {
FlutterBluePlus.stopScan();
myTrackersVm.stopNativeScan();
myTrackersVm.resetList();
super.dispose();
}

@ -85,6 +85,7 @@ class _CheckMeAllInOneConnectScreenState extends State<CheckMeAllInOneConnectScr
break;
case TrackerTypeEnum.Spirometer:
case TrackerTypeEnum.WeightScale:
case TrackerTypeEnum.SmartRing:
case TrackerTypeEnum.AllInOneTracker:
break;
}

@ -1,3 +1,4 @@
import 'package:diplomaticquarterapp/pages/medical/my_trackers/ble_device_type_screens/smart_ring_info_screen.dart';
import 'package:diplomaticquarterapp/pages/medical/my_trackers/ble_models/ble_devices_model.dart';
import 'package:diplomaticquarterapp/pages/medical/my_trackers/my_trackers_view_model/my_trackers_view_model.dart';
import 'package:diplomaticquarterapp/widgets/buttons/defaultButton.dart';
@ -5,6 +6,7 @@ import 'package:diplomaticquarterapp/widgets/data_display/medical/medical_profil
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart';
class SmartRingAllInOneConnectScreen extends StatefulWidget {
final BleDeviceModel deviceModel;
@ -31,54 +33,56 @@ class _SmartRingAllInOneConnectScreenState extends State<SmartRingAllInOneConnec
super.dispose();
}
String getTrackerNameByEnum(TrackerTypeEnum trackerTypeEnum) {
switch (trackerTypeEnum) {
case TrackerTypeEnum.OxymeterTracker:
return "Oxymeter";
case TrackerTypeEnum.BloodPressureTracker:
return "Blood Pressure";
case TrackerTypeEnum.BloodSugarTracker:
return "Blood Glucose";
case TrackerTypeEnum.ECGTracker:
return "ECG";
String getTrackerNameByEnum(SmartRingOperationsEnum smartRingOperationsEnum) {
switch (smartRingOperationsEnum) {
case SmartRingOperationsEnum.Temperature:
return "Temperature";
case TrackerTypeEnum.WeightScale:
return "Weight Scale";
case SmartRingOperationsEnum.HeartRateStatic:
return "HR Static";
case TrackerTypeEnum.Temperature:
return "Temperature";
case SmartRingOperationsEnum.HeartRateDynamic:
return "HR Dynamic";
case TrackerTypeEnum.Spirometer:
return "Spirometer";
case SmartRingOperationsEnum.HRV:
return "HRV";
case TrackerTypeEnum.SmartRing:
return "Smart Ring";
case SmartRingOperationsEnum.BloodOxygen:
return "Blood Oxygen";
case TrackerTypeEnum.AllInOneTracker:
return "All in One";
case SmartRingOperationsEnum.BatteryLevel:
return "Battery Level";
}
return "All in One";
}
Future<void> onTrackerTypePressed(TrackerTypeEnum trackerTypeEnum, MyTrackersViewModel myTrackersViewModel) async {
switch (trackerTypeEnum) {
case TrackerTypeEnum.BloodPressureTracker:
case TrackerTypeEnum.BloodSugarTracker:
Future<void> onTrackerTypePressed(SmartRingOperationsEnum smartRingOperationsEnum, MyTrackersViewModel myTrackersViewModel) async {
switch (smartRingOperationsEnum) {
case SmartRingOperationsEnum.Temperature:
myTrackersViewModel.getTemperatureSmartRing();
Navigator.of(context).push(FadePage(page: SmartRingInfoScreen(smartRingOperationsEnum)));
break;
case TrackerTypeEnum.OxymeterTracker:
case SmartRingOperationsEnum.HeartRateStatic:
myTrackersViewModel.getStaticHeartRateSmartRing();
Navigator.of(context).push(FadePage(page: SmartRingInfoScreen(smartRingOperationsEnum)));
break;
case TrackerTypeEnum.ECGTracker:
myTrackersViewModel.getBatteryLevelSmartRing();
case SmartRingOperationsEnum.HeartRateDynamic:
myTrackersViewModel.getDynamicHeartRateSmartRing();
Navigator.of(context).push(FadePage(page: SmartRingInfoScreen(smartRingOperationsEnum)));
break;
case SmartRingOperationsEnum.HRV:
myTrackersViewModel.getHRVSmartRing();
Navigator.of(context).push(FadePage(page: SmartRingInfoScreen(smartRingOperationsEnum)));
break;
case TrackerTypeEnum.Temperature:
case SmartRingOperationsEnum.BloodOxygen:
myTrackersViewModel.getBloodOxygenSmartRing();
// Navigator.of(context).push(FadePage(page: SmartRingInfoScreen(smartRingOperationsEnum)));
break;
case SmartRingOperationsEnum.BatteryLevel:
myTrackersViewModel.getBatteryLevelSmartRing();
Navigator.of(context).push(FadePage(page: SmartRingInfoScreen(smartRingOperationsEnum)));
break;
case TrackerTypeEnum.Spirometer:
case TrackerTypeEnum.WeightScale:
case TrackerTypeEnum.SmartRing:
case TrackerTypeEnum.AllInOneTracker:
default:
break;
}
}
@ -87,7 +91,7 @@ class _SmartRingAllInOneConnectScreenState extends State<SmartRingAllInOneConnec
return Expanded(
child: ListView(
children: [
if (myTrackersViewModel.isAndesfitDeviceConnected == null) ...[
if (myTrackersViewModel.smartRingBatteryLevel == null) ...[
Padding(
padding: const EdgeInsets.all(24.0),
child: Center(
@ -146,7 +150,7 @@ class _SmartRingAllInOneConnectScreenState extends State<SmartRingAllInOneConnec
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
buildSmartRingOperationsUI(myTrackersViewModel),
if (myTrackersViewModel.isAndesfitDeviceConnected != null && myTrackersViewModel.isAndesfitDeviceConnected) ...[
if (myTrackersViewModel.smartRingBatteryLevel != null) ...[
Row(
children: [
Expanded(

@ -0,0 +1,413 @@
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/my_trackers_view_model/my_trackers_view_model.dart';
import 'package:diplomaticquarterapp/uitl/utils_new.dart';
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
import 'package:provider/provider.dart';
class SmartRingInfoScreen extends StatelessWidget {
final SmartRingOperationsEnum smartRingOperationsEnum;
const SmartRingInfoScreen(this.smartRingOperationsEnum);
String getTrackerNameByEnum(SmartRingOperationsEnum typeEnum) {
switch (typeEnum) {
case SmartRingOperationsEnum.Temperature:
return "Temperature";
case SmartRingOperationsEnum.BloodOxygen:
return "Blood Oxygen";
case SmartRingOperationsEnum.HeartRateDynamic:
return "HeartRate Dynamic";
case SmartRingOperationsEnum.HeartRateStatic:
return "HeartRate Static";
case SmartRingOperationsEnum.HRV:
return "HRV";
case SmartRingOperationsEnum.BatteryLevel:
return "Battery Level";
}
return "Battery Level";
}
Widget getAllInOneOperationWidgets(MyTrackersViewModel myTrackersVm, SmartRingOperationsEnum smartRingOperationsEnum, BuildContext context) {
switch (smartRingOperationsEnum) {
case SmartRingOperationsEnum.Temperature:
return buildTemperatureWidget(myTrackersVm, context);
case SmartRingOperationsEnum.HeartRateStatic:
return buildHeartRateStaticWidget(myTrackersVm, context);
case SmartRingOperationsEnum.HeartRateDynamic:
return buildHeartRateDynamicWidget(myTrackersVm, context);
case SmartRingOperationsEnum.HRV:
return buildHrvWidget(myTrackersVm, context);
case SmartRingOperationsEnum.BloodOxygen:
// TODO: Handle this case.
break;
case SmartRingOperationsEnum.BatteryLevel:
return buildBatteryLevelWidget(myTrackersVm, context);
}
return getNoDataWidget(context);
}
Widget buildTemperatureWidget(MyTrackersViewModel myTrackersVm, BuildContext context) {
if (myTrackersVm.filesLoader) {
return Center(child: CircularProgressIndicator());
} else if (myTrackersVm.smartRingTemperatureHistory != null && myTrackersVm.smartRingTemperatureHistory.isNotEmpty) {
return Expanded(
child: ListView.separated(
itemCount: myTrackersVm.smartRingTemperatureHistory.length,
separatorBuilder: (context, index) => SizedBox(height: 14),
shrinkWrap: true,
reverse: false,
itemBuilder: (context, index) {
SmartRingGenericModel smartRingTemp = myTrackersVm.smartRingTemperatureHistory[index];
return InkWell(
onTap: () => Navigator.pop(context),
child: Container(
decoration: cardRadius(12),
padding: EdgeInsets.all(12.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text("Temperature: ${smartRingTemp.value}"),
mHeight(4.0),
Text("Date: ${smartRingTemp.date}"),
],
),
),
);
},
),
);
} else {
return getNoDataWidget(context);
}
}
Widget buildHeartRateDynamicWidget(MyTrackersViewModel myTrackersVm, BuildContext context) {
if (myTrackersVm.filesLoader) {
return Center(child: CircularProgressIndicator());
} else if (myTrackersVm.smartRingHeartRateDynamicHistory != null && myTrackersVm.smartRingHeartRateDynamicHistory.isNotEmpty) {
return Expanded(
child: ListView.separated(
itemCount: myTrackersVm.smartRingHeartRateDynamicHistory.length,
separatorBuilder: (context, index) => SizedBox(height: 14),
shrinkWrap: true,
reverse: false,
itemBuilder: (context, index) {
SmartRingGenericModel smartRingHr = myTrackersVm.smartRingHeartRateDynamicHistory[index];
return InkWell(
onTap: () => Navigator.pop(context),
child: Container(
decoration: cardRadius(12),
padding: EdgeInsets.all(12.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text("arrayDynamicHR: ${smartRingHr.value}"),
mHeight(4.0),
Text("Date: ${smartRingHr.date}"),
],
),
),
);
},
),
);
} else {
return getNoDataWidget(context);
}
}
Widget buildHeartRateStaticWidget(MyTrackersViewModel myTrackersVm, BuildContext context) {
if (myTrackersVm.filesLoader) {
return Center(child: CircularProgressIndicator());
} else if (myTrackersVm.smartRingHeartRateStaticHistory != null && myTrackersVm.smartRingHeartRateStaticHistory.isNotEmpty) {
return Expanded(
child: ListView.separated(
itemCount: myTrackersVm.smartRingHeartRateStaticHistory.length,
separatorBuilder: (context, index) => SizedBox(height: 14),
shrinkWrap: true,
reverse: false,
itemBuilder: (context, index) {
SmartRingGenericModel smartRingHr = myTrackersVm.smartRingHeartRateStaticHistory[index];
return InkWell(
onTap: () => Navigator.pop(context),
child: Container(
decoration: cardRadius(12),
padding: EdgeInsets.all(12.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text("onceHeartValue: ${smartRingHr.value}"),
mHeight(4.0),
Text("Date: ${smartRingHr.date}"),
],
),
),
);
},
),
);
} else {
return getNoDataWidget(context);
}
}
Widget buildHrvWidget(MyTrackersViewModel myTrackersVm, BuildContext context) {
if (myTrackersVm.filesLoader) {
return Center(child: CircularProgressIndicator());
} else if (myTrackersVm.smartRingHrvHistory != null && myTrackersVm.smartRingHrvHistory.isNotEmpty) {
return Expanded(
child: ListView.separated(
itemCount: myTrackersVm.smartRingHrvHistory.length,
separatorBuilder: (context, index) => SizedBox(height: 14),
shrinkWrap: true,
reverse: false,
itemBuilder: (context, index) {
SmartRingHrvModel smartRingHrvModel = myTrackersVm.smartRingHrvHistory[index];
return InkWell(
onTap: () => Navigator.pop(context),
child: Container(
decoration: cardRadius(12),
padding: EdgeInsets.all(12.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text("highBP: ${smartRingHrvModel.highBP}"),
mHeight(4.0),
Text("lowBP: ${smartRingHrvModel.lowBP}"),
mHeight(4.0),
Text("stress: ${smartRingHrvModel.stress}"),
mHeight(4.0),
Text("heartRate: ${smartRingHrvModel.heartRate}"),
mHeight(4.0),
Text("hrv: ${smartRingHrvModel.hrv}"),
mHeight(4.0),
Text("vascularAging: ${smartRingHrvModel.vascularAging}"),
],
),
),
);
},
),
);
} else {
return getNoDataWidget(context);
}
}
Widget buildBatteryLevelWidget(MyTrackersViewModel myTrackersVm, BuildContext context) {
if (myTrackersVm.filesLoader) {
return Center(child: CircularProgressIndicator());
} else if (myTrackersVm.smartRingBatteryLevel != null && myTrackersVm.smartRingBatteryLevel.isNotEmpty) {
return Center(
child: Text("Battery Level: ${myTrackersVm.smartRingBatteryLevel}"),
);
} else {
return getNoDataWidget(context);
}
}
Widget buildECGWidget(MyTrackersViewModel myTrackersVm, BuildContext context) {
return Column(
mainAxisSize: MainAxisSize.max,
children: [
if (myTrackersVm.filesLoader) ...[
Center(child: CircularProgressIndicator())
] else if (myTrackersVm.checkMeEcg != null && myTrackersVm.checkMeEcg.isNotEmpty) ...[
Material(
child: ListView.separated(
itemCount: myTrackersVm.checkMeEcg.length,
separatorBuilder: (context, index) => SizedBox(height: 14),
shrinkWrap: true,
reverse: false,
itemBuilder: (context, index) {
CheckMeECGModel checkMeECGModel = myTrackersVm.checkMeEcg[index];
return InkWell(
onTap: () {
myTrackersVm.getEcgWaveDataFromCheckMePro(checkMeECGModel.timeString);
// Navigator.push(context, MaterialPageRoute(builder: (context) => CheckMeECGInfoScreen(SmartRingOperationsEnum.ECGTracker)));
},
child: Container(
decoration: cardRadius(12),
padding: EdgeInsets.all(12.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text("Date: ${checkMeECGModel.date}"),
mHeight(8),
Text("TimeString: ${checkMeECGModel.timeString}"),
],
),
),
);
},
),
)
] 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) {
return Column(
mainAxisSize: MainAxisSize.max,
children: [
if (myTrackersVm.filesLoader) ...[
Center(child: CircularProgressIndicator())
] else if (myTrackersVm.checkMeGlucose != null && myTrackersVm.checkMeGlucose.isNotEmpty) ...[
Material(
child: ListView.separated(
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
Widget build(BuildContext context) {
return AppScaffold(
appBarTitle: "${getTrackerNameByEnum(smartRingOperationsEnum)}",
showNewAppBar: true,
isShowDecPage: false,
showNewAppBarTitle: true,
backgroundColor: Color(0xffF8F8F8),
body: Padding(
padding: const EdgeInsets.all(24.0),
child: Column(
children: [
Consumer(
builder: (BuildContext context, MyTrackersViewModel myTrackersVm, Widget child) {
return getAllInOneOperationWidgets(myTrackersVm, smartRingOperationsEnum, context);
},
),
],
)),
);
}
}

@ -18,7 +18,7 @@ class BleChannel {
result = await platform.invokeMethod('scanForCheckMePro');
print("----------Flutter scanCheckMeProNative Result -------");
print(result);
return result;
} catch (e) {
return "Error: $e";
@ -33,7 +33,7 @@ class BleChannel {
result = await platform.invokeMethod('scanDevices', deviceType);
print("----------Flutter Result -------");
print(result);
return result;
} catch (e) {
return "Error: $e";
@ -49,7 +49,7 @@ class BleChannel {
result = await platform.invokeMethod('stopScanCheckMe');
print("----------Flutter Result stopNativeScan -------");
print(result);
return result;
} catch (e) {
return "Error: $e";
@ -64,7 +64,7 @@ class BleChannel {
result = await platform.invokeMethod('connectDevice', device);
print("----------Flutter Result connectDevice -------");
print(result);
return result;
} catch (e) {
return "Error: $e";
@ -79,7 +79,7 @@ class BleChannel {
result = await platform.invokeMethod('connectDeviceCheckMe', device);
print("----------Flutter Result connectDeviceCheckMe -------");
print(result);
return result;
} catch (e) {
return "Error: $e";
@ -91,7 +91,7 @@ class BleChannel {
print("----------Flutter getECGFilesList -------");
final String result = await platform.invokeMethod('ecgFilesList', device);
print("----------Flutter Result -------");
print(result);
return result;
} catch (e) {
return "Error: $e";
@ -103,7 +103,7 @@ class BleChannel {
print("----------Flutter duoEkFactoryReset -------");
final String result = await platform.invokeMethod('factoryResetECG', device);
print("----------Flutter Result -------");
print(result);
return result;
} catch (e) {
return "Error: $e";
@ -115,7 +115,7 @@ class BleChannel {
print("----------Flutter getBP2FilesList -------");
final String result = await platform.invokeMethod('bp2FilesList', deviceType);
print("----------Flutter Result -------");
print(result);
return result;
} catch (e) {
return "Error: $e";
@ -128,7 +128,7 @@ class BleChannel {
final String result = await platform.invokeMethod('disconnectDevice');
final String result2 = await platform.invokeMethod('disconnectCheckMe');
print("----------Flutter Result -------");
print(result);
return result;
} catch (e) {
return "Error: $e";
@ -140,7 +140,7 @@ class BleChannel {
print("----------Flutter getDeviceInfoCheckMePro -------");
final String result = await platform.invokeMethod('getDeviceInfoCheckMePro');
print("----------Flutter getDeviceInfoCheckMePro result -------");
print(result);
return result;
} catch (e) {
return "Error: $e";
@ -152,7 +152,7 @@ class BleChannel {
print("----------Flutter getDeviceInfoCheckMePro -------");
final String result = await platform.invokeMethod('getGlucoseDataFromCheckMePro', userId);
print("----------Flutter getDeviceInfoCheckMePro result -------");
print(result);
return result;
} catch (e) {
return "Error: $e";
@ -164,7 +164,7 @@ class BleChannel {
print("----------Flutter getBPDataFromCheckMePro -------");
final String result = await platform.invokeMethod('getBPDataFromCheckMePro', userId);
print("----------Flutter getBPDataFromCheckMePro result -------");
print(result);
return result;
} catch (e) {
return "Error: $e";
@ -176,7 +176,7 @@ class BleChannel {
print("----------Flutter getOxiDataFromCheckMePro -------");
final String result = await platform.invokeMethod('getOxiDataFromCheckMePro');
print("----------Flutter getOxiDataFromCheckMePro result -------");
print(result);
return result;
} catch (e) {
return "Error: $e";
@ -188,7 +188,7 @@ class BleChannel {
print("----------Flutter getTempDataFromCheckMePro -------");
final String result = await platform.invokeMethod('getTempDataFromCheckMePro');
print("----------Flutter getTempDataFromCheckMePro result -------");
print(result);
return result;
} catch (e) {
return "Error: $e";
@ -200,7 +200,7 @@ class BleChannel {
print("----------Flutter getEcgDataFromCheckMePro -------");
final String result = await platform.invokeMethod('getEcgDataFromCheckMePro');
print("----------Flutter getEcgDataFromCheckMePro result -------");
print(result);
return result;
} catch (e) {
return "Error: $e";
@ -212,7 +212,7 @@ class BleChannel {
print("----------Flutter getEcgWaveFromCheckMePro -------");
final String result = await platform.invokeMethod('getEcgWaveFromCheckMePro', timeString);
print("----------Flutter getEcgWaveFromCheckMePro result -------");
print(result);
return result;
} catch (e) {
return "Error: $e";
@ -229,7 +229,7 @@ class BleChannel {
result = await platform.invokeMethod('scanForSmartRing');
print("----------Flutter scanForSmartRing Result -------");
print(result);
return result;
} catch (e) {
return "Error: $e";
@ -244,7 +244,7 @@ class BleChannel {
result = await platform.invokeMethod('connectDeviceSmartRing', deviceAddress);
print("----------Flutter Result connectDeviceSmartRing -------");
print(result);
return result;
} catch (e) {
return "Error: $e";
@ -259,7 +259,7 @@ class BleChannel {
result = await platform.invokeMethod('disConnectDeviceSmartRing');
print("----------Flutter Result disConnectDeviceSmartRing -------");
print(result);
return result;
} catch (e) {
return "Error: $e";
@ -271,10 +271,72 @@ class BleChannel {
print("----------Flutter getBatteryLevelSmartRing -------");
final String result = await platform.invokeMethod('getBatteryLevelSmartRing');
print("----------Flutter getBatteryLevelSmartRing result -------");
print(result);
return result;
} catch (e) {
return "Error: $e";
}
}
static Future<String> getTemperatureSmartRing() async {
try {
print("----------Flutter getTemperatureSmartRing -------");
final String result = await platform.invokeMethod('getTemperatureSmartRing');
print("----------Flutter getTemperatureSmartRing result -------");
return result;
} catch (e) {
return "Error: $e";
}
}
static Future<String> getDynamicHeartRateSmartRing() async {
try {
print("----------Flutter getDynamicHeartRateSmartRing -------");
final String result = await platform.invokeMethod('getDynamicHeartRateSmartRing');
print("----------Flutter getDynamicHeartRateSmartRing result -------");
return result;
} catch (e) {
return "Error: $e";
}
}
static Future<String> getStaticHeartRateSmartRing() async {
try {
print("----------Flutter getStaticHeartRateSmartRing -------");
final String result = await platform.invokeMethod('getStaticHeartRateSmartRing');
print("----------Flutter getStaticHeartRateSmartRing result -------");
return result;
} catch (e) {
return "Error: $e";
}
}
static Future<String> getHRVSmartRing() async {
try {
print("----------Flutter getHRVSmartRing -------");
final String result = await platform.invokeMethod('getHRVSmartRing');
print("----------Flutter getHRVSmartRing result -------");
return result;
} catch (e) {
return "Error: $e";
}
}
static Future<String> getBloodOxygenSmartRing() async {
try {
print("----------Flutter getBloodOxygenSmartRing -------");
final String result = await platform.invokeMethod('getBloodOxygenSmartRing');
print("----------Flutter getBloodOxygenSmartRing result -------");
return result;
} catch (e) {
return "Error: $e";
}
}
}

@ -11,12 +11,12 @@ class BleDeviceModel {
BleDeviceModel({this.macAddr, this.model, this.name, this.rssi, this.andesfitBluetoothDevice});
BleDeviceModel.fromJson(Map<String, dynamic> json) {
BleDeviceModel.fromJson(Map<String, dynamic> json, TrackerTypeEnum trackerType) {
macAddr = json['macAddr'];
model = json['model'];
name = json['name'];
rssi = json['rssi'];
deviceType = TrackerTypeEnum.AllInOneTracker;
deviceType = trackerType;
andesfitBluetoothDevice = null;
}

@ -0,0 +1,76 @@
//TEMPERATURE
import 'package:diplomaticquarterapp/pages/medical/my_trackers/my_trackers_view_model/my_trackers_view_model.dart';
String getValueKeyBySmartRingOperation(SmartRingOperationsEnum smartRingOperationsEnum) {
switch (smartRingOperationsEnum) {
case SmartRingOperationsEnum.Temperature:
return "temperature";
case SmartRingOperationsEnum.HeartRateStatic:
return "onceHeartValue";
case SmartRingOperationsEnum.HeartRateDynamic:
return "arrayDynamicHR";
case SmartRingOperationsEnum.HRV:
// TODO: Handle this case.
break;
case SmartRingOperationsEnum.BloodOxygen:
// TODO: Handle this case.
break;
case SmartRingOperationsEnum.BatteryLevel:
return "batteryLevel";
}
return "batteryLevel";
}
class SmartRingGenericModel {
DateTime date;
String value;
SmartRingGenericModel({this.date, this.value});
SmartRingGenericModel.fromJson(Map<String, dynamic> json, SmartRingOperationsEnum smartRingOperationsEnum) {
date = json['date'] != null ? DateTime.parse(((json["date"] as String).replaceAll(".", "-"))) : DateTime.now();
value = json['${getValueKeyBySmartRingOperation(smartRingOperationsEnum)}'];
}
Map<String, dynamic> toJson(SmartRingOperationsEnum smartRingOperationsEnum) {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['date'] = this.date;
data['arrayDynamicHR'] = getValueKeyBySmartRingOperation(smartRingOperationsEnum);
return data;
}
}
class SmartRingHrvModel {
String date;
String highBP;
String stress;
String lowBP;
String heartRate;
String hrv;
String vascularAging;
SmartRingHrvModel({this.date, this.highBP, this.stress, this.lowBP, this.heartRate, this.hrv, this.vascularAging});
SmartRingHrvModel.fromJson(Map<String, dynamic> json) {
date = json['date'];
highBP = json['highBP'];
stress = json['stress'];
lowBP = json['lowBP'];
heartRate = json['heartRate'];
hrv = json['hrv'];
vascularAging = json['vascularAging'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['date'] = this.date;
data['highBP'] = this.highBP;
data['stress'] = this.stress;
data['lowBP'] = this.lowBP;
data['heartRate'] = this.heartRate;
data['hrv'] = this.hrv;
data['vascularAging'] = this.vascularAging;
return data;
}
}

@ -14,6 +14,7 @@ import 'package:diplomaticquarterapp/pages/medical/my_trackers/ble_models/checkm
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/checkmepro_all_in_one_models/checkme_user_model.dart';
import 'package:diplomaticquarterapp/pages/medical/my_trackers/ble_models/smart_ring_models.dart';
import 'package:diplomaticquarterapp/pages/medical/my_trackers/ble_models/viatom_devices/bp_rt_model.dart';
import 'package:diplomaticquarterapp/pages/medical/my_trackers/ble_models/viatom_devices/ecg_file_detail_model.dart';
import 'package:diplomaticquarterapp/pages/medical/my_trackers/ble_models/viatom_devices/ecg_rt_model.dart';
@ -25,7 +26,6 @@ import 'package:diplomaticquarterapp/uitl/date_uitl.dart';
import 'package:diplomaticquarterapp/uitl/utils_new.dart';
import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart';
import 'package:flutter/services.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter_blue_plus/flutter_blue_plus.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:diplomaticquarterapp/pages/medical/my_trackers/ble_helpers/ble_connect_helper.dart';
@ -34,6 +34,8 @@ import 'package:provider/provider.dart';
enum TrackerTypeEnum { OxymeterTracker, BloodPressureTracker, BloodSugarTracker, ECGTracker, WeightScale, Temperature, Spirometer, SmartRing, AllInOneTracker }
enum SmartRingOperationsEnum { Temperature, HeartRateStatic, HeartRateDynamic, HRV, BloodOxygen, BatteryLevel }
//NativeEventNames
String kRealTimeDataBPMeasuring = "RealTimeDataBPMeasuring";
@ -55,6 +57,11 @@ String kBPCheckMePro = "BPCheckMePro";
String kDevicesListSmartRing = "DevicesListSmartRing";
String kBatteryLevelSmartRing = "BatteryLevelSmartRing";
String kTemperatureSmartRing = "TemperatureSmartRing";
String kDynamicHeartRateSmartRing = "DynamicHeartRateSmartRing";
String kStaticHeartRateSmartRing = "StaticHeartRateSmartRing";
String kHrvSmartRing = "HrvSmartRing";
String kBloodOxygenSmartRing = "BloodOxygenSmartRing";
class MyTrackersViewModel extends ChangeNotifier {
EventChannel eventChannel = EventChannel('BLE-Platform-Bridge-Event');
@ -90,7 +97,7 @@ class MyTrackersViewModel extends ChangeNotifier {
{"model": "BLE-MSA"},
],
"SmartRing": [
{"model": ""},
{"model": "2301A"},
],
"AllInOneTracker": [
{"model": "Checkme 1316"},
@ -120,7 +127,7 @@ class MyTrackersViewModel extends ChangeNotifier {
{"model": "BLE-MSA"},
],
"SmartRing": [
{"model": "2301A"},
{"model": ""},
],
"AllInOneTracker": [
{"model": "Checkme 1316"},
@ -136,11 +143,13 @@ class MyTrackersViewModel extends ChangeNotifier {
TrackerTypeEnum.BloodSugarTracker,
TrackerTypeEnum.ECGTracker,
];
List<TrackerTypeEnum> smartRingTrackers = [
TrackerTypeEnum.Temperature,
TrackerTypeEnum.OxymeterTracker,
TrackerTypeEnum.BloodSugarTracker,
TrackerTypeEnum.ECGTracker,
List<SmartRingOperationsEnum> smartRingTrackers = [
SmartRingOperationsEnum.Temperature,
SmartRingOperationsEnum.HeartRateStatic,
SmartRingOperationsEnum.HeartRateDynamic,
SmartRingOperationsEnum.HRV,
SmartRingOperationsEnum.BloodOxygen,
SmartRingOperationsEnum.BatteryLevel,
];
List<String> andesFitDevices = [
@ -358,7 +367,7 @@ class MyTrackersViewModel extends ChangeNotifier {
// if(Platform.isIOS) {
// parsesDevicesList(json.decode(event['data']));
// } else if(Platform.isAndroid) {
parsesDevicesList(json.decode(event['data']) as List);
parsesDevicesList(json.decode(event['data']) as List, currentSelectedTrackerType);
// }
}
@ -406,8 +415,8 @@ class MyTrackersViewModel extends ChangeNotifier {
await scanDevicesNative(currentSelectedTrackerType);
}
void parsesDevicesList(List returnData) {
var devicesList = List.generate(returnData.length, (index) => BleDeviceModel.fromJson(returnData[index]));
void parsesDevicesList(List returnData, TrackerTypeEnum trackerType) {
var devicesList = List.generate(returnData.length, (index) => BleDeviceModel.fromJson(returnData[index], trackerType));
log("devicesList: ${devicesList.toString()}");
filterOutTheSearchedDevicesNative(devicesList);
}
@ -433,7 +442,7 @@ class MyTrackersViewModel extends ChangeNotifier {
if (currentSelectedTrackerType == TrackerTypeEnum.AllInOneTracker) {
await BleChannel.connectDeviceCheckMe([device.name, device.model.toString(), currentSelectedTrackerType.name]);
} else if (currentSelectedTrackerType == TrackerTypeEnum.SmartRing) {
await BleChannel.connectDeviceSmartRing("CA:59:D9:7E:3E:D6"); //TODO: NEED TO VERIFY IF IT KEEPS CHANGING OR NO
await BleChannel.connectDeviceSmartRing(device.macAddr);
} else {
await BleChannel.connectDevice([device.name, device.model.toString(), currentSelectedTrackerType.name]);
}
@ -1125,9 +1134,9 @@ class MyTrackersViewModel extends ChangeNotifier {
if (event['type'] == kDevicesListCheckMe) {
if (Platform.isAndroid) {
List list = [json.decode(event['data'])];
parsesDevicesList(list);
parsesDevicesList(list, currentSelectedTrackerType);
} else {
parsesDevicesList(json.decode(event['data']));
parsesDevicesList(json.decode(event['data']), currentSelectedTrackerType);
}
}
if (event['type'] == kCheckMeUsersList) {
@ -1372,12 +1381,36 @@ class MyTrackersViewModel extends ChangeNotifier {
if (event['type'] == kDevicesListSmartRing) {
if (Platform.isAndroid) {
List list = [json.decode(event['data'])];
parsesDevicesList(list);
parsesDevicesList(list, currentSelectedTrackerType);
} else {}
}
if (event['type'] == kBatteryLevelSmartRing) {
updateCheckMeTemperatureInfoModel(json.decode(event['data']));
updateSmartRingBatteryLevelModel(json.decode(event['data']));
}
if (event['type'] == kTemperatureSmartRing) {
logger.i(event['data']);
updateSmartRingTemperatureHistory(json.decode(event['data']));
}
if (event['type'] == kBloodOxygenSmartRing) {
logger.i(event['data']);
}
if (event['type'] == kHrvSmartRing) {
logger.i(event['data']);
updateSmartRingHrvHistory(json.decode(event['data']));
}
if (event['type'] == kStaticHeartRateSmartRing) {
logger.i(event['data']);
updateSmartRingHeartRateStaticHistory(json.decode(event['data']));
}
if (event['type'] == kDynamicHeartRateSmartRing) {
logger.i(event['data']);
updateSmartRingHeartRateDynamicHistory(json.decode(event['data']));
}
});
@ -1420,8 +1453,115 @@ class MyTrackersViewModel extends ChangeNotifier {
await device.connect(timeout: Duration(seconds: 35));
}
Future<void> getTemperatureSmartRing() async {
if (smartRingTemperatureHistory != null) {
smartRingTemperatureHistory.clear();
smartRingTemperatureHistory = null;
}
String data = await BleChannel.getTemperatureSmartRing();
logger.i(jsonEncode(data.toString()));
}
Future<void> getBatteryLevelSmartRing() async {
String data = await BleChannel.getBatteryLevelSmartRing();
logger.i(jsonEncode(data.toString()));
}
Future<void> getDynamicHeartRateSmartRing() async {
String data = await BleChannel.getDynamicHeartRateSmartRing();
logger.i(jsonEncode(data.toString()));
}
Future<void> getStaticHeartRateSmartRing() async {
String data = await BleChannel.getStaticHeartRateSmartRing();
logger.i(jsonEncode(data.toString()));
}
Future<void> getHRVSmartRing() async {
String data = await BleChannel.getHRVSmartRing();
logger.i(jsonEncode(data.toString()));
}
Future<void> getBloodOxygenSmartRing() async {
String data = await BleChannel.getBloodOxygenSmartRing();
logger.i(jsonEncode(data.toString()));
}
String smartRingBatteryLevel;
void updateSmartRingBatteryLevelModel(dynamic returnData) {
if (smartRingBatteryLevel != null) {
return;
}
Map<dynamic, dynamic> data = returnData;
smartRingBatteryLevel = (data["dicData"]["batteryLevel"]).toString();
notifyListeners();
}
//TEMPERATURE
List<SmartRingGenericModel> smartRingTemperatureHistory;
void updateSmartRingTemperatureHistory(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.Temperature));
if (smartRingTemperatureHistory == null) {
smartRingTemperatureHistory = list;
} else {
smartRingTemperatureHistory.addAll(list);
}
notifyListeners();
}
//HEART RATE DYNAMIC
List<SmartRingGenericModel> smartRingHeartRateDynamicHistory;
void updateSmartRingHeartRateDynamicHistory(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.HeartRateDynamic));
if (smartRingHeartRateDynamicHistory == null) {
smartRingHeartRateDynamicHistory = list;
} else {
smartRingHeartRateDynamicHistory.addAll(list);
}
log("smartRingHeartRateDynamicHistory: ${smartRingHeartRateDynamicHistory.length}");
notifyListeners();
}
List<SmartRingGenericModel> smartRingHeartRateStaticHistory;
void updateSmartRingHeartRateStaticHistory(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.HeartRateStatic));
if (smartRingHeartRateStaticHistory == null) {
smartRingHeartRateStaticHistory = list;
} else {
smartRingHeartRateStaticHistory.addAll(list);
}
log("smartRingHeartRateStaticHistory: ${smartRingHeartRateStaticHistory.length}");
notifyListeners();
}
List<SmartRingHrvModel> smartRingHrvHistory;
void updateSmartRingHrvHistory(dynamic returnData) {
Map<dynamic, dynamic> data = returnData;
List response = (data["dicData"]) as List;
List<SmartRingHrvModel> list = List.generate(response.length, (index) => SmartRingHrvModel.fromJson(response[index]));
if (smartRingHrvHistory == null) {
smartRingHrvHistory = list;
} else {
smartRingHrvHistory.addAll(list);
}
log("smartRingHrvHistory: ${smartRingHrvHistory.length}");
notifyListeners();
}
}

Loading…
Cancel
Save