dev_3.3_BLE
haroon amjad 3 years ago
parent 22d6a415c7
commit efba7faa78

@ -20,8 +20,8 @@ var PACKAGES_ORDERS = '/api/orders';
var PACKAGES_ORDER_HISTORY = '/api/orders/items'; var PACKAGES_ORDER_HISTORY = '/api/orders/items';
var PACKAGES_TAMARA_OPT = '/api/orders/paymentoptions/tamara'; var PACKAGES_TAMARA_OPT = '/api/orders/paymentoptions/tamara';
// var BASE_URL = 'http://10.50.100.198:2018/'; // var BASE_URL = 'http://10.50.100.198:2018/';
// var BASE_URL = 'https://uat.hmgwebservices.com/'; var BASE_URL = 'https://uat.hmgwebservices.com/';
var BASE_URL = 'https://hmgwebservices.com/'; // var BASE_URL = 'https://hmgwebservices.com/';
// var BASE_URL = 'https://orash.cloudsolutions.com.sa/'; // var BASE_URL = 'https://orash.cloudsolutions.com.sa/';
// var BASE_URL = 'https://vidauat.cloudsolutions.com.sa/'; // var BASE_URL = 'https://vidauat.cloudsolutions.com.sa/';

@ -0,0 +1,9 @@
class WeightScaleData {
String weight;
String bmi;
String fat;
String bone;
String water;
String muscle;
String bmr;
}

@ -10,9 +10,8 @@ class BLEScreen extends StatefulWidget {
} }
class _BLEScreenState extends State<BLEScreen> { class _BLEScreenState extends State<BLEScreen> {
String abc = "";
EventChannel eventChannel = EventChannel('BLE-Platform-Bridge-Event'); EventChannel eventChannel = EventChannel('BLE-Platform-Bridge-Event');
String recivedData = ''; String receivedData = '';
@override @override
void initState() { void initState() {
@ -23,7 +22,7 @@ class _BLEScreenState extends State<BLEScreen> {
print('Received event---: $event'); print('Received event---: $event');
setState(() { setState(() {
recivedData = event; receivedData = event;
}); });
// You can update your UI or perform any other actions based on the event. // You can update your UI or perform any other actions based on the event.
}); });
@ -40,7 +39,7 @@ class _BLEScreenState extends State<BLEScreen> {
Center( Center(
child: GestureDetector( child: GestureDetector(
onTap: () async { onTap: () async {
abc = await BleChannel.getScanningResult(); await BleChannel.getScanningResult();
}, },
child: Container( child: Container(
width: 50, width: 50,
@ -49,7 +48,7 @@ class _BLEScreenState extends State<BLEScreen> {
), ),
), ),
), ),
Center(child: Text(recivedData)) Center(child: Text(receivedData))
], ],
), ),
), ),

@ -17,6 +17,7 @@ import 'package:diplomaticquarterapp/pages/DrawerPages/family/my-family.dart';
import 'package:diplomaticquarterapp/pages/ToDoList/ToDo.dart'; import 'package:diplomaticquarterapp/pages/ToDoList/ToDo.dart';
import 'package:diplomaticquarterapp/pages/landing/home_page_2.dart'; import 'package:diplomaticquarterapp/pages/landing/home_page_2.dart';
import 'package:diplomaticquarterapp/pages/medical/medical_profile_page_new.dart'; import 'package:diplomaticquarterapp/pages/medical/medical_profile_page_new.dart';
import 'package:diplomaticquarterapp/pages/medical/my_trackers/weight_scale_ble.dart';
import 'package:diplomaticquarterapp/pages/videocall-webrtc-rnd/webrtc/start_video_call.dart'; import 'package:diplomaticquarterapp/pages/videocall-webrtc-rnd/webrtc/start_video_call.dart';
import 'package:diplomaticquarterapp/services/authentication/auth_provider.dart'; import 'package:diplomaticquarterapp/services/authentication/auth_provider.dart';
import 'package:diplomaticquarterapp/services/clinic_services/get_clinic_service.dart'; import 'package:diplomaticquarterapp/services/clinic_services/get_clinic_service.dart';
@ -36,6 +37,7 @@ import 'package:diplomaticquarterapp/widgets/buttons/floatingActionButton.dart';
import 'package:diplomaticquarterapp/widgets/drawer/app_drawer_widget.dart'; import 'package:diplomaticquarterapp/widgets/drawer/app_drawer_widget.dart';
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart'; import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
import 'package:diplomaticquarterapp/widgets/others/not_auh_page.dart'; import 'package:diplomaticquarterapp/widgets/others/not_auh_page.dart';
import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart';
import 'package:firebase_messaging/firebase_messaging.dart'; import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/cupertino.dart'; import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
@ -565,7 +567,8 @@ class _LandingPageState extends State<LandingPage> with WidgetsBindingObserver {
changeCurrentTab(1); changeCurrentTab(1);
}, },
onLoginClick: () { onLoginClick: () {
login(); // login();
Navigator.push(context, FadePage(page: WeightScaleBLE()));
}, },
onMedicalFileClick: () { onMedicalFileClick: () {
changeCurrentTab(1); changeCurrentTab(1);

@ -6,6 +6,7 @@ import 'package:diplomaticquarterapp/pages/medical/my_trackers/blood_suger/blood
import 'package:diplomaticquarterapp/pages/medical/my_trackers/ecg_ble.dart'; import 'package:diplomaticquarterapp/pages/medical/my_trackers/ecg_ble.dart';
import 'package:diplomaticquarterapp/pages/medical/my_trackers/spirometer.dart'; import 'package:diplomaticquarterapp/pages/medical/my_trackers/spirometer.dart';
import 'package:diplomaticquarterapp/pages/medical/my_trackers/temperature.dart'; import 'package:diplomaticquarterapp/pages/medical/my_trackers/temperature.dart';
import 'package:diplomaticquarterapp/pages/medical/my_trackers/viatom_devices/oxymeter_ble.dart';
import 'package:diplomaticquarterapp/pages/medical/my_trackers/weight_scale_ble.dart'; import 'package:diplomaticquarterapp/pages/medical/my_trackers/weight_scale_ble.dart';
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
import 'package:diplomaticquarterapp/widgets/data_display/medical/medical_profile_item.dart'; import 'package:diplomaticquarterapp/widgets/data_display/medical/medical_profile_item.dart';
@ -154,6 +155,19 @@ class MyTrackers extends StatelessWidget {
height: 45.0, height: 45.0,
), ),
), ),
InkWell(
onTap: () {
Navigator.push(context, FadePage(page: Oxymeter_BLE()));
},
child: MedicalProfileItem(
title: "Oxymeter BLE",
imagePath: 'assets/tracker/weight.png',
subTitle: null,
isPngImage: true,
width: 45.0,
height: 45.0,
),
),
], ],
), ),
), ),

@ -0,0 +1,116 @@
import 'package:diplomaticquarterapp/viatom_ble/ble_connect.dart';
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
class Oxymeter_BLE extends StatefulWidget {
@override
State<Oxymeter_BLE> createState() => _Oxymeter_BLEState();
}
class _Oxymeter_BLEState extends State<Oxymeter_BLE> {
EventChannel eventChannel = EventChannel('BLE-Platform-Bridge-Event');
String receivedData = '';
final oxymeterValueNotifier = ValueNotifier<String>("start");
@override
void dispose() {
oxymeterValueNotifier.dispose();
super.dispose();
}
@override
void initState() {
// TODO: implement initState
super.initState();
eventChannel.receiveBroadcastStream().listen((event) {
print('Received event---: $event');
oxymeterValueNotifier.value = event;
});
}
@override
Widget build(BuildContext context) {
return AppScaffold(
appBarTitle: "Oxymeter",
showNewAppBar: true,
isShowDecPage: true,
showNewAppBarTitle: true,
backgroundColor: Color(0xffF8F8F8),
body: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Center(
child: GestureDetector(
onTap: () async {
await BleChannel.getScanningResult();
},
child: Container(
width: 50,
height: 50,
color: Colors.blueAccent,
),
),
),
ValueListenableBuilder(
valueListenable: oxymeterValueNotifier,
builder: (context, value, _) {
return value != "start"
? Column(
children: [
Text(
getSPO2(
value.toString().replaceAll("RtParam", ""),
),
),
Text(
getPR(
value.toString().replaceAll("RtParam", ""),
),
),
Text(
getPI(
value.toString().replaceAll("RtParam", ""),
),
),
],
)
: Text(value);
},
),
],
),
),
);
}
String getSPO2(String value) {
return "SpO2: " + value.split(",")[0].replaceAll("{spo2=", "");
}
String getPR(String value) {
return "Pulse Rate: " + value.split(",")[1].replaceAll("pr=", "");
}
String getPI(String value) {
return "Perfusion Index: " + value.split(",")[2].replaceAll("pi=", "") + "%";
}
// List<String> setResult(String value) {
// List<String> values = value.split(",");
//
// print(values[0].replaceAll("{spo2=", ""));
// print(values[1].replaceAll("pr=", ""));
// print(values[2].replaceAll("pi=", ""));
//
// values.clear();
// values.add(values[0].replaceAll("{spo2=", ""));
// values.add(values[1].replaceAll("pr=", ""));
// values.add(values[2].replaceAll("pi=", ""));
//
// return values;
// }
}

@ -1,6 +1,8 @@
import 'dart:async'; import 'dart:async';
import 'package:diplomaticquarterapp/models/ble_devices/weight_scale_data.dart';
import 'package:diplomaticquarterapp/theme/colors.dart'; import 'package:diplomaticquarterapp/theme/colors.dart';
import 'package:diplomaticquarterapp/uitl/app_toast.dart';
import 'package:diplomaticquarterapp/uitl/ble_utils.dart'; import 'package:diplomaticquarterapp/uitl/ble_utils.dart';
import 'package:diplomaticquarterapp/uitl/bluetooth_off.dart'; import 'package:diplomaticquarterapp/uitl/bluetooth_off.dart';
import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart'; import 'package:diplomaticquarterapp/uitl/translations_delegate_base.dart';
@ -17,18 +19,39 @@ class WeightScaleBLE extends StatefulWidget {
class _WeightScaleBLEState extends State<WeightScaleBLE> { class _WeightScaleBLEState extends State<WeightScaleBLE> {
String connectionStatus = "disconnected"; String connectionStatus = "disconnected";
String currentBloodGlucose = "0.0"; String currentWeight = "0.0";
BluetoothDevice currentConnectedDevice; BluetoothDevice currentConnectedDevice;
StreamSubscription bleDevicesStream; StreamSubscription bleDevicesStream;
StreamSubscription weightValuesStream;
WeightScaleData weightScaleData = WeightScaleData();
final bleConnectionStatus = ValueNotifier<String>("Disconnected");
BluetoothCharacteristic ble_fff1;
BluetoothCharacteristic ble_fff2;
BluetoothCharacteristic ble_fff3;
String resultSet1 = "";
String resultSet2 = "";
@override
void dispose() {
super.dispose();
bleConnectionStatus.dispose();
bleDevicesStream.cancel();
weightValuesStream.cancel();
currentConnectedDevice.disconnect();
}
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return AppScaffold( return AppScaffold(
appBarTitle: TranslationBase.of(context).weight, appBarTitle: TranslationBase.of(context).weight,
showNewAppBar: true, showNewAppBar: true,
isShowDecPage: true, isShowDecPage: false,
showNewAppBarTitle: true, showNewAppBarTitle: true,
backgroundColor: Color(0xffF8F8F8), backgroundColor: Color(0xffF8F8F8),
body: SingleChildScrollView( body: SingleChildScrollView(
@ -47,6 +70,7 @@ class _WeightScaleBLEState extends State<WeightScaleBLE> {
TranslationBase.of(context).start.toUpperCase(), TranslationBase.of(context).start.toUpperCase(),
() { () {
checkBLEPermissions(); checkBLEPermissions();
// parseResultData();
}, },
color: CustomColors.green, color: CustomColors.green,
), ),
@ -54,11 +78,27 @@ class _WeightScaleBLEState extends State<WeightScaleBLE> {
SizedBox( SizedBox(
height: 50.0, height: 50.0,
), ),
Text("Connection state: $connectionStatus"), ValueListenableBuilder(
valueListenable: bleConnectionStatus,
builder: (context, value, _) {
return Text("Connection state: $value");
},
),
SizedBox( SizedBox(
height: 50.0, height: 50.0,
), ),
Text("Current Temp: $currentBloodGlucose" + " mg/dL"), Column(
children: [
Text("Current Weight: ${weightScaleData.weight}" + " kg"),
Text("Current BMI: ${weightScaleData.bmi}"),
Text("Current Body Fat: ${weightScaleData.fat}" + "%"),
Text("Current Bone Weight: ${weightScaleData.bone}" + " kg"),
Text("Current Water: ${weightScaleData.water}" + "%"),
Text("Current Muscle: ${weightScaleData.muscle}" + "%"),
Text("Current BMR: ${weightScaleData.bmr}" + " calories/day"),
],
),
// })
], ],
), ),
); );
@ -79,9 +119,7 @@ class _WeightScaleBLEState extends State<WeightScaleBLE> {
void startBLEConnection() { void startBLEConnection() {
if (FlutterBluePlus.isScanningNow == false) { if (FlutterBluePlus.isScanningNow == false) {
setState(() { bleConnectionStatus.value = "Connecting...";
connectionStatus = "Connecting...";
});
bleDevicesStream = FlutterBluePlus.scanResults.listen( bleDevicesStream = FlutterBluePlus.scanResults.listen(
(results) { (results) {
@ -89,45 +127,92 @@ class _WeightScaleBLEState extends State<WeightScaleBLE> {
blueToothDevices.forEach((element) async { blueToothDevices.forEach((element) async {
if (element.device.localName.isNotEmpty) { if (element.device.localName.isNotEmpty) {
if (element.device.localName.toLowerCase() == "sdic") { if (element.device.localName.toLowerCase() == "sdic") {
element.device.connectionState.listen((BluetoothConnectionState state) async { bleDevicesStream.cancel();
setState(() { element.device.connect(timeout: Duration(seconds: 5), autoConnect: false).then((value) async {
connectionStatus = state.toString(); bleConnectionStatus.value = "Connected...";
}); print("Device Connected-------");
if (state == BluetoothConnectionState.disconnected) { currentConnectedDevice = element.device;
// typically, start a periodic timer that tries to periodically reconnect. FlutterBluePlus.stopScan();
// Note: you must always re-discover services after disconnection! // await currentConnectedDevice.clearGattCache();
} List<BluetoothService> services = await element.device.discoverServices(timeout: 5);
if (state == BluetoothConnectionState.connected) { services.forEach((service) {
currentConnectedDevice = element.device; if (service.serviceUuid.toString().toLowerCase() == BLEUtils.WEIGHT_MEASUREMENT_SERVICE) {
bleDevicesStream.cancel(); print(service.serviceUuid);
List<BluetoothService> services = await element.device.discoverServices(); service.characteristics.forEach((characteristic) async {
services.forEach((service) { if (characteristic.characteristicUuid.toString().toLowerCase() == BLEUtils.WEIGHT_MEASUREMENT_CHARACTERISTIC_FFF1) {
if (service.serviceUuid.toString().toLowerCase() == BLEUtils.WEIGHT_MEASUREMENT_SERVICE) { ble_fff1 = characteristic;
print(service.serviceUuid); print(characteristic.characteristicUuid);
service.characteristics.forEach((characteristic) async { print(characteristic.properties.toString());
// if (characteristic.characteristicUuid.toString().toLowerCase() == BLEUtils.WEIGHT_MEASUREMENT_CHARACTERISTIC_FFF3) { characteristic.onValueReceived.listen((event) {
// print(characteristic.characteristicUuid); print("onValueReceived fff1 Stream");
// characteristic.onValueReceived.listen((event) { print(event);
// print("onValueReceived fff3 Stream"); if (event[0] == 129) {
// print(event); // Issue result ack command
// }); Future.delayed(Duration(milliseconds: 1000)).then((value) async {
// await characteristic.setNotifyValue(true); characteristic.write([0x01]).then((value) {
// } print("----fff1 result ack data written----");
if (characteristic.characteristicUuid.toString().toLowerCase() == BLEUtils.WEIGHT_MEASUREMENT_CHARACTERISTIC_FFF1) { });
print(characteristic.characteristicUuid); });
characteristic.onValueReceived.listen((event) { }
print("onValueReceived fff1 Stream"); // Error
print(event); else if (event[0] == 65) {
AppToast.showErrorToast(message: "Measurement Error Occurred!");
} else {
//Sample Results
// ----------Result Set 1----------: 42;0;1;0;0;0;0;65;9;b0;d2;0;7f;3;44;0;ac;1;cc;0
// ----------Result Set 2----------: 42;1;32;0;2c;0;1;3;84;9;1b;0;29;2;9c;0;10;0;e9
if (event[1] == 0) {
resultSet1 = convertResultSetToString(event);
print("----------Result Set 1----------: $resultSet1");
print("----------Result Set 2----------: $resultSet2");
} else {
resultSet2 = convertResultSetToString(event);
print("----------Result Set 1----------: $resultSet1");
print("----------Result Set 2----------: $resultSet2");
parseResultData();
}
}
});
await Future.delayed(Duration(milliseconds: 500)).then((value) async {
print("Delayed fff1 done");
if (!characteristic.isNotifying) await characteristic.setNotifyValue(true).catchError((err) {});
});
}
if (characteristic.characteristicUuid.toString().toLowerCase() == BLEUtils.WEIGHT_MEASUREMENT_CHARACTERISTIC_FFF2) {
ble_fff2 = characteristic;
print(characteristic.characteristicUuid);
print(characteristic.properties.toString());
characteristic.onValueReceived.listen((event) {
print("onValueReceived fff2 Stream");
print(event);
});
await Future.delayed(Duration(milliseconds: 1000)).then((value) async {
print("Delayed fff2 done");
if (!characteristic.isNotifying) await characteristic.setNotifyValue(true).catchError((err) {});
});
// Write user data to fff2
await Future.delayed(Duration(milliseconds: 1000)).then((value) async {
characteristic.write([0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x19, 0x01, 0x00, 0x00], withoutResponse: true).then((value) {
print("----fff2 user data written----");
}); });
await characteristic.setNotifyValue(true);
} // Issue get result command
}); await Future.delayed(Duration(milliseconds: 1000)).then((value) async {
return true; characteristic.write([0x41, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00], withoutResponse: true).then((value) {
} print("----fff2 get result data written----");
}); });
} });
});
}
});
return true;
}
});
}); });
await element.device.connect(timeout: Duration(seconds: 35));
return true; return true;
} }
} }
@ -139,4 +224,62 @@ class _WeightScaleBLEState extends State<WeightScaleBLE> {
FlutterBluePlus.startScan(timeout: const Duration(seconds: 5), androidUsesFineLocation: false); FlutterBluePlus.startScan(timeout: const Duration(seconds: 5), androidUsesFineLocation: false);
} }
} }
void parseResultData() {
// resultSet1 = "42;0;1;0;0;0;0;65;9;b0;d2;0;7f;3;44;0;ac;1;cc;0";
// resultSet2 = "42;1;32;0;2c;0;1;3;84;9;1b;0;29;2;9c;0;10;0;e9";
List<String> hexStringResSet1 = resultSet1.split(";");
List<String> hexStringResSet2 = resultSet2.split(";");
String hexStringWeight = hexStringResSet1[13] + hexStringResSet1[14];
String hexStringBMI = hexStringResSet1[15] + hexStringResSet1[16];
String hexStringFat = hexStringResSet2[3] + hexStringResSet2[4];
String hexStringBone = hexStringResSet2[11] + hexStringResSet2[12];
String hexStringWater = hexStringResSet2[13] + hexStringResSet2[14];
String hexStringMuscle = hexStringResSet2[7] + hexStringResSet2[8];
String hexStringBMR = hexStringResSet2[9] + hexStringResSet2[10];
print((int.parse(hexStringWeight, radix: 16) * 0.1).toStringAsFixed(1));
print((int.parse(hexStringBMI, radix: 16) * 0.1).toStringAsFixed(1));
print((int.parse(hexStringFat, radix: 16) * 0.1).toStringAsFixed(1));
print((int.parse(hexStringMuscle, radix: 16) * 0.1).toStringAsFixed(1));
print((int.parse(hexStringBMR, radix: 16)));
print((int.parse(hexStringBone, radix: 16) * 0.1).toStringAsFixed(1));
print((int.parse(hexStringWater, radix: 16) * 0.1).toStringAsFixed(1));
setState(() {
weightScaleData.weight = (int.parse(hexStringWeight, radix: 16) * 0.1).toStringAsFixed(1);
weightScaleData.bmi = (int.parse(hexStringBMI, radix: 16) * 0.1).toStringAsFixed(1);
weightScaleData.fat = (int.parse(hexStringFat, radix: 16) * 0.1).toStringAsFixed(1);
weightScaleData.muscle = (int.parse(hexStringMuscle, radix: 16) * 0.1).toStringAsFixed(1);
weightScaleData.bmr = (int.parse(hexStringBMR, radix: 16)).toString();
weightScaleData.bone = (int.parse(hexStringBone, radix: 16) * 0.1).toStringAsFixed(1);
weightScaleData.water = (int.parse(hexStringWater, radix: 16) * 0.1).toStringAsFixed(1);
});
}
String convertResultSetToString(List<int> byteArray) {
String resSet;
resSet = (byteArray.map(
(x) {
return x.toRadixString(16);
},
)).join(";");
return resSet;
}
String convertIntListToHex(List<int> byteArray) {
String b = (byteArray.map((x) {
return x.toRadixString(16);
})).join(";");
List<String> hexString = b.split(";");
print("HexString: $hexString");
String returnString = hexString[2] + hexString[3];
print("Temp Hex String: $returnString");
final number = int.parse(returnString, radix: 16);
print("Temp Number: ${number * 0.1}");
return (number * 0.1).toStringAsFixed(1);
}
} }

@ -210,7 +210,7 @@ dependencies:
# open_file: ^3.2.1 # open_file: ^3.2.1
open_filex: ^4.3.2 open_filex: ^4.3.2
path_provider: ^2.0.8 path_provider: ^2.0.8
flutter_blue_plus: ^1.15.5 flutter_blue_plus: 1.15.7
# flutter_callkit_incoming: ^1.0.3+3 # flutter_callkit_incoming: ^1.0.3+3
# firebase_core: 1.12.0 # firebase_core: 1.12.0

Loading…
Cancel
Save