Connected the SmartRing

dev_3.3_BLE
Faiz Hashmi 2 years ago
parent 55b93feda3
commit 6fd429c883

@ -1,6 +1,6 @@
import 'dart:developer'; import 'dart:developer';
import 'package:diplomaticquarterapp/pages/medical/my_trackers/ble_device_type_screens/andesfit_device_types/andesfit_all_in-one_connect_screen.dart'; import 'package:diplomaticquarterapp/pages/medical/my_trackers/ble_device_type_screens/checkme_all_in-one_connect_screen.dart';
import 'package:diplomaticquarterapp/pages/medical/my_trackers/ble_device_type_screens/andesfit_device_types/andesfit_blood_pressure_connect_screen.dart'; import 'package:diplomaticquarterapp/pages/medical/my_trackers/ble_device_type_screens/andesfit_device_types/andesfit_blood_pressure_connect_screen.dart';
import 'package:diplomaticquarterapp/pages/medical/my_trackers/ble_device_type_screens/andesfit_device_types/andesfit_blood_sugar_connect_screen.dart'; import 'package:diplomaticquarterapp/pages/medical/my_trackers/ble_device_type_screens/andesfit_device_types/andesfit_blood_sugar_connect_screen.dart';
import 'package:diplomaticquarterapp/pages/medical/my_trackers/ble_device_type_screens/andesfit_device_types/andesfit_spirometer_connect_screen.dart'; import 'package:diplomaticquarterapp/pages/medical/my_trackers/ble_device_type_screens/andesfit_device_types/andesfit_spirometer_connect_screen.dart';
@ -9,6 +9,7 @@ import 'package:diplomaticquarterapp/pages/medical/my_trackers/ble_device_type_s
import 'package:diplomaticquarterapp/pages/medical/my_trackers/ble_device_type_screens/lepu_device_types/bloodpressure_connect_screen.dart'; import 'package:diplomaticquarterapp/pages/medical/my_trackers/ble_device_type_screens/lepu_device_types/bloodpressure_connect_screen.dart';
import 'package:diplomaticquarterapp/pages/medical/my_trackers/ble_device_type_screens/lepu_device_types/ecg_connect_screen.dart'; import 'package:diplomaticquarterapp/pages/medical/my_trackers/ble_device_type_screens/lepu_device_types/ecg_connect_screen.dart';
import 'package:diplomaticquarterapp/pages/medical/my_trackers/ble_device_type_screens/lepu_device_types/oxymeter_connect_screen.dart'; import 'package:diplomaticquarterapp/pages/medical/my_trackers/ble_device_type_screens/lepu_device_types/oxymeter_connect_screen.dart';
import 'package:diplomaticquarterapp/pages/medical/my_trackers/ble_device_type_screens/smart_ring_connect_screen.dart';
import 'package:diplomaticquarterapp/pages/medical/my_trackers/ble_models/ble_devices_model.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/pages/medical/my_trackers/my_trackers_view_model/my_trackers_view_model.dart';
import 'package:diplomaticquarterapp/widgets/data_display/medical/medical_profile_item.dart'; import 'package:diplomaticquarterapp/widgets/data_display/medical/medical_profile_item.dart';
@ -16,7 +17,6 @@ import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_blue_plus/flutter_blue_plus.dart'; import 'package:flutter_blue_plus/flutter_blue_plus.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
class BleDevicesScreen extends StatefulWidget { class BleDevicesScreen extends StatefulWidget {
@ -39,6 +39,9 @@ class _BleDevicesScreenState extends State<BleDevicesScreen> {
myTrackersVm = context.read<MyTrackersViewModel>(); myTrackersVm = context.read<MyTrackersViewModel>();
if (myTrackersVm.currentSelectedTrackerType == TrackerTypeEnum.AllInOneTracker) { if (myTrackersVm.currentSelectedTrackerType == TrackerTypeEnum.AllInOneTracker) {
myTrackersVm.startSearchingForCheckMePro(); myTrackersVm.startSearchingForCheckMePro();
}
if (myTrackersVm.currentSelectedTrackerType == TrackerTypeEnum.SmartRing) {
myTrackersVm.startFlutterScan();
} else { } else {
myTrackersVm.startSearchingForTracker(); myTrackersVm.startSearchingForTracker();
myTrackersVm.startTimerForNativeScan(); myTrackersVm.startTimerForNativeScan();
@ -115,13 +118,19 @@ class _BleDevicesScreenState extends State<BleDevicesScreen> {
return; return;
} }
break; break;
case TrackerTypeEnum.AllInOneTracker:
case TrackerTypeEnum.SmartRing:
if (myTrackersVm.isDeviceFromAndesFit(device.name)) { if (myTrackersVm.isDeviceFromAndesFit(device.name)) {
Navigator.pushReplacement(context, FadePage(page: SmartRingAllInOneConnectScreen(deviceModel: device.andesfitBluetoothDevice)));
return; return;
} }
break;
Navigator.pushReplacement(context, FadePage(page: AndesAllInOneConnectScreen(deviceModel: device))); case TrackerTypeEnum.AllInOneTracker:
if (myTrackersVm.isDeviceFromAndesFit(device.name)) {
return;
}
Navigator.pushReplacement(context, FadePage(page: CheckMeAllInOneConnectScreen(deviceModel: device)));
break; break;
} }
} }

@ -1,4 +1,3 @@
import 'package:diplomaticquarterapp/pages/medical/my_trackers/ble_device_type_screens/ble_devices_screen.dart';
import 'package:diplomaticquarterapp/pages/medical/my_trackers/ble_device_type_screens/checkme_all_in_one_info_screen.dart'; import 'package:diplomaticquarterapp/pages/medical/my_trackers/ble_device_type_screens/checkme_all_in_one_info_screen.dart';
import 'package:diplomaticquarterapp/pages/medical/my_trackers/ble_models/ble_devices_model.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/pages/medical/my_trackers/my_trackers_view_model/my_trackers_view_model.dart';
@ -9,16 +8,16 @@ import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
class AndesAllInOneConnectScreen extends StatefulWidget { class CheckMeAllInOneConnectScreen extends StatefulWidget {
final BleDeviceModel deviceModel; final BleDeviceModel deviceModel;
const AndesAllInOneConnectScreen({this.deviceModel}); const CheckMeAllInOneConnectScreen({this.deviceModel});
@override @override
State<AndesAllInOneConnectScreen> createState() => _AndesAllInOneConnectScreenState(); State<CheckMeAllInOneConnectScreen> createState() => _CheckMeAllInOneConnectScreenState();
} }
class _AndesAllInOneConnectScreenState extends State<AndesAllInOneConnectScreen> { class _CheckMeAllInOneConnectScreenState extends State<CheckMeAllInOneConnectScreen> {
MyTrackersViewModel myTrackersVm; MyTrackersViewModel myTrackersVm;
@override @override
@ -57,6 +56,9 @@ class _AndesAllInOneConnectScreenState extends State<AndesAllInOneConnectScreen>
case TrackerTypeEnum.Spirometer: case TrackerTypeEnum.Spirometer:
return "Spirometer"; return "Spirometer";
case TrackerTypeEnum.SmartRing:
return "Smart Ring";
case TrackerTypeEnum.AllInOneTracker: case TrackerTypeEnum.AllInOneTracker:
return "All in One"; return "All in One";
} }

@ -41,6 +41,8 @@ class CheckMeAllInOneInfoScreen extends StatelessWidget {
case TrackerTypeEnum.AllInOneTracker: case TrackerTypeEnum.AllInOneTracker:
return "All in One"; return "All in One";
case TrackerTypeEnum.SmartRing:
return "Smart Ring";
} }
return "All in One"; return "All in One";
} }
@ -65,7 +67,9 @@ class CheckMeAllInOneInfoScreen extends StatelessWidget {
case TrackerTypeEnum.Spirometer: case TrackerTypeEnum.Spirometer:
case TrackerTypeEnum.WeightScale: case TrackerTypeEnum.WeightScale:
case TrackerTypeEnum.AllInOneTracker: case TrackerTypeEnum.AllInOneTracker:
case TrackerTypeEnum.SmartRing:
return getNoDataWidget(context); return getNoDataWidget(context);
break;
} }
return getNoDataWidget(context); return getNoDataWidget(context);
} }

@ -107,6 +107,20 @@ class SelectTrackerType extends StatelessWidget {
), ),
), ),
); );
medical.add(
InkWell(
onTap: () {
context.read<MyTrackersViewModel>().updateSelectedTrackerType(TrackerTypeEnum.SmartRing);
Navigator.of(context).push(FadePage(page: BleDevicesScreen()));
},
child: MedicalProfileItem(
title: "SmartRing",
imagePath: 'tracker.svg',
subTitle: "Tracker",
isEnable: true,
),
),
);
medical.add( medical.add(
InkWell( InkWell(
onTap: () { onTap: () {
@ -128,7 +142,6 @@ class SelectTrackerType extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
List<Widget> myMedicalList = myTrackersTypeList(context: context); List<Widget> myMedicalList = myTrackersTypeList(context: context);
return AppScaffold( return AppScaffold(
isShowDecPage: false, isShowDecPage: false,
isShowAppBar: false, isShowAppBar: false,

@ -0,0 +1,181 @@
import 'package:diplomaticquarterapp/pages/medical/my_trackers/ble_device_type_screens/checkme_all_in_one_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/transitions/fade_page.dart';
import 'package:diplomaticquarterapp/widgets/buttons/defaultButton.dart';
import 'package:diplomaticquarterapp/widgets/data_display/medical/medical_profile_item.dart';
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
import 'package:flutter/material.dart';
import 'package:flutter_blue_plus/flutter_blue_plus.dart';
import 'package:provider/provider.dart';
class SmartRingAllInOneConnectScreen extends StatefulWidget {
final BluetoothDevice deviceModel;
const SmartRingAllInOneConnectScreen({this.deviceModel});
@override
State<SmartRingAllInOneConnectScreen> createState() => _SmartRingAllInOneConnectScreenState();
}
class _SmartRingAllInOneConnectScreenState extends State<SmartRingAllInOneConnectScreen> {
MyTrackersViewModel myTrackersVm;
@override
void initState() {
myTrackersVm = context.read<MyTrackersViewModel>();
myTrackersVm.connectSmartRingDevice(widget.deviceModel);
super.initState();
}
@override
void dispose() {
myTrackersVm.disConnectAndesfitDevice(widget.deviceModel);
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";
case TrackerTypeEnum.WeightScale:
return "Weight Scale";
case TrackerTypeEnum.Temperature:
return "Temperature";
case TrackerTypeEnum.Spirometer:
return "Spirometer";
case TrackerTypeEnum.SmartRing:
return "Smart Ring";
case TrackerTypeEnum.AllInOneTracker:
return "All in One";
}
return "All in One";
}
Future<void> onTrackerTypePressed(TrackerTypeEnum trackerTypeEnum, MyTrackersViewModel myTrackersViewModel) async {
switch (trackerTypeEnum) {
case TrackerTypeEnum.BloodPressureTracker:
case TrackerTypeEnum.BloodSugarTracker:
myTrackersViewModel.getCheckMeUsersListDialog(trackerTypeEnum, context);
break;
case TrackerTypeEnum.OxymeterTracker:
myTrackersViewModel.getOxiDataFromCheckMePro();
Navigator.of(context).push(FadePage(page: CheckMeAllInOneInfoScreen(trackerTypeEnum)));
break;
case TrackerTypeEnum.ECGTracker:
myTrackersViewModel.getECGDataFromCheckMePro();
Navigator.of(context).push(FadePage(page: CheckMeAllInOneInfoScreen(trackerTypeEnum)));
break;
case TrackerTypeEnum.Temperature:
myTrackersViewModel.getTempDataFromCheckMePro();
Navigator.of(context).push(FadePage(page: CheckMeAllInOneInfoScreen(trackerTypeEnum)));
break;
case TrackerTypeEnum.Spirometer:
case TrackerTypeEnum.WeightScale:
case TrackerTypeEnum.SmartRing:
case TrackerTypeEnum.AllInOneTracker:
break;
}
}
Widget buildAllInOneUI(MyTrackersViewModel myTrackersViewModel) {
return Expanded(
child: ListView(
children: [
if (myTrackersViewModel.checkMeProUsersList == null) ...[
Padding(
padding: const EdgeInsets.all(24.0),
child: Center(
child: Text(
"Some animation with the instruction",
style: TextStyle(fontSize: 9.0),
),
),
)
] else ...[
Center(
child: Column(
children: [
GridView.builder(
shrinkWrap: true,
primary: false,
physics: NeverScrollableScrollPhysics(),
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 3, childAspectRatio: 2 / 2, crossAxisSpacing: 12, mainAxisSpacing: 12),
padding: EdgeInsets.zero,
itemCount: myTrackersViewModel.checkMeProTrackers.length,
itemBuilder: (BuildContext context, int index) {
return InkWell(
onTap: () => onTrackerTypePressed(myTrackersViewModel.checkMeProTrackers[index], myTrackersViewModel),
child: MedicalProfileItem(
title: getTrackerNameByEnum(myTrackersViewModel.checkMeProTrackers[index]),
imagePath: 'tracker.svg',
subTitle: "",
isEnable: true,
),
);
},
),
],
),
)
]
],
),
);
}
@override
Widget build(BuildContext context) {
return AppScaffold(
appBarTitle: "${widget.deviceModel.name}",
showNewAppBar: true,
isShowDecPage: false,
showNewAppBarTitle: true,
backgroundColor: Color(0xffF8F8F8),
body: Padding(
padding: const EdgeInsets.all(24.0),
child: Consumer(
builder: (BuildContext context, MyTrackersViewModel myTrackersViewModel, Widget child) {
return Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
buildAllInOneUI(myTrackersViewModel),
if (myTrackersViewModel.checkMeProUsersList != null) ...[
Row(
children: [
Expanded(
child: DefaultButton(
"Disconnect with ${widget.deviceModel.name}",
() async {
myTrackersVm.disConnectDevice();
Navigator.pop(context);
},
textColor: Colors.white,
),
),
],
),
]
],
);
},
),
),
);
}
}

@ -30,7 +30,7 @@ import 'package:diplomaticquarterapp/pages/medical/my_trackers/ble_helpers/ble_c
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
enum TrackerTypeEnum { OxymeterTracker, BloodPressureTracker, BloodSugarTracker, ECGTracker, WeightScale, Temperature, Spirometer, AllInOneTracker } enum TrackerTypeEnum { OxymeterTracker, BloodPressureTracker, BloodSugarTracker, ECGTracker, WeightScale, Temperature, Spirometer, SmartRing, AllInOneTracker }
//NativeEventNames //NativeEventNames
@ -84,6 +84,9 @@ class MyTrackersViewModel extends ChangeNotifier {
"Spirometer": [ "Spirometer": [
{"model": "BLE-MSA"}, {"model": "BLE-MSA"},
], ],
"SmartRing": [
{"model": ""},
],
"AllInOneTracker": [ "AllInOneTracker": [
{"model": "Checkme 1316"}, {"model": "Checkme 1316"},
], ],
@ -111,12 +114,16 @@ class MyTrackersViewModel extends ChangeNotifier {
"Spirometer": [ "Spirometer": [
{"model": "BLE-MSA"}, {"model": "BLE-MSA"},
], ],
"SmartRing": [
{"model": "2301A"},
],
"AllInOneTracker": [ "AllInOneTracker": [
{"model": "Checkme 1316"}, {"model": "Checkme 1316"},
], ],
}; };
List<String> ecgEnabledDevices = ["BP2 0567", "DuoEK", "ER1", "PM101897"]; List<String> ecgEnabledDevices = ["BP2 0567", "DuoEK", "ER1", "PM101897"];
List<TrackerTypeEnum> checkMeProTrackers = [ List<TrackerTypeEnum> checkMeProTrackers = [
TrackerTypeEnum.Temperature, TrackerTypeEnum.Temperature,
TrackerTypeEnum.BloodPressureTracker, TrackerTypeEnum.BloodPressureTracker,
@ -124,6 +131,7 @@ class MyTrackersViewModel extends ChangeNotifier {
TrackerTypeEnum.BloodSugarTracker, TrackerTypeEnum.BloodSugarTracker,
TrackerTypeEnum.ECGTracker, TrackerTypeEnum.ECGTracker,
]; ];
List<String> andesFitDevices = [ List<String> andesFitDevices = [
"BPM", "BPM",
"PM101897", "PM101897",
@ -131,6 +139,7 @@ class MyTrackersViewModel extends ChangeNotifier {
"TEMP", "TEMP",
"Samico GL", "Samico GL",
"BLE-MSA", "BLE-MSA",
"2301A",
]; ];
StreamSubscription bleDevicesStream; StreamSubscription bleDevicesStream;
@ -1082,6 +1091,42 @@ class MyTrackersViewModel extends ChangeNotifier {
bool isDeviceSelected = false; bool isDeviceSelected = false;
Future<void> connectSmartRingDevice(BluetoothDevice device) async {
device.connectionState.listen((BluetoothConnectionState state) async {
if (state == BluetoothConnectionState.disconnected) {
isAndesfitDeviceConnected = false;
notifyListeners();
}
if (state == BluetoothConnectionState.connected) {
isAndesfitDeviceConnected = true;
notifyListeners();
bleDevicesStream.cancel();
List<BluetoothService> services = await device.discoverServices();
services.forEach((service) {
if (service.serviceUuid.toString().toLowerCase() == BLEUtils.TEMPERATURE_SERVICE) {
print(service.serviceUuid);
service.characteristics.forEach((characteristic) async {
if (characteristic.characteristicUuid.toString().toLowerCase() == BLEUtils.TEMPERATURE_CHARACTERISTIC) {
print(characteristic.characteristicUuid);
characteristic.onValueReceived.listen((event) {
print("onValueReceived Stream");
print(event);
updateCurrentTempInCelsius(convertIntListToHexTemp(event));
String currentTempInFahrenheit = ((num.parse(currentTempInCelsius) * 1.8) + 32).toStringAsFixed(1);
String tempCurrentTempInCelsius = currentTempInCelsius + "\u2103" + " / " + currentTempInFahrenheit + "\u2109";
updateCurrentTempInCelsius(tempCurrentTempInCelsius);
});
await characteristic.setNotifyValue(true);
}
});
return true;
}
});
}
});
await device.connect(timeout: Duration(seconds: 35));
}
Future<void> connectAndesfitAllInOneDevice(BluetoothDevice device) async { Future<void> connectAndesfitAllInOneDevice(BluetoothDevice device) async {
log("deviceToConnect: ${device.toString()}"); log("deviceToConnect: ${device.toString()}");
} }

Loading…
Cancel
Save