|
|
|
|
@ -1,5 +1,8 @@
|
|
|
|
|
import 'dart:convert';
|
|
|
|
|
import 'dart:io';
|
|
|
|
|
|
|
|
|
|
import 'package:diplomaticquarterapp/models/ble_devices/viatom_devices/bp_rt_data_measuring_model.dart';
|
|
|
|
|
import 'package:diplomaticquarterapp/models/ble_devices/viatom_devices/bp_rt_data_result_model.dart';
|
|
|
|
|
import 'package:diplomaticquarterapp/uitl/utils_new.dart';
|
|
|
|
|
import 'package:diplomaticquarterapp/viatom_ble/ble_connect.dart';
|
|
|
|
|
import 'package:diplomaticquarterapp/widgets/buttons/defaultButton.dart';
|
|
|
|
|
@ -15,16 +18,18 @@ class BpTrackerBLE extends StatefulWidget {
|
|
|
|
|
|
|
|
|
|
class _BpTrackerBLEState extends State<BpTrackerBLE> {
|
|
|
|
|
EventChannel eventChannel = EventChannel('BLE-Platform-Bridge-Event');
|
|
|
|
|
String receivedData = '';
|
|
|
|
|
|
|
|
|
|
final bpDataNotifier = ValueNotifier<String>("start");
|
|
|
|
|
|
|
|
|
|
// String deviceName = "CheckMeO2";
|
|
|
|
|
final bpDataNotifierMeasuring = ValueNotifier<BpRtDataMeasuringModel>(BpRtDataMeasuringModel());
|
|
|
|
|
final bpDataNotifierResult = ValueNotifier<BpRtDataResultModel>(BpRtDataResultModel());
|
|
|
|
|
final bpStatusNotifier = ValueNotifier<String>("status");
|
|
|
|
|
final bpDeviceDataNotifier = ValueNotifier<String>("");
|
|
|
|
|
String deviceName = "BP2";
|
|
|
|
|
|
|
|
|
|
@override
|
|
|
|
|
void dispose() {
|
|
|
|
|
bpDataNotifier.dispose();
|
|
|
|
|
bpDataNotifierMeasuring.dispose();
|
|
|
|
|
bpDataNotifierResult.dispose();
|
|
|
|
|
bpStatusNotifier.dispose();
|
|
|
|
|
super.dispose();
|
|
|
|
|
BleChannel.disconnect();
|
|
|
|
|
}
|
|
|
|
|
@ -43,56 +48,162 @@ class _BpTrackerBLEState extends State<BpTrackerBLE> {
|
|
|
|
|
isShowDecPage: false,
|
|
|
|
|
showNewAppBarTitle: true,
|
|
|
|
|
backgroundColor: Color(0xffF8F8F8),
|
|
|
|
|
body: SingleChildScrollView(
|
|
|
|
|
child: Padding(
|
|
|
|
|
padding: const EdgeInsets.all(24.0),
|
|
|
|
|
child: Column(
|
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
|
|
|
children: [
|
|
|
|
|
Row(
|
|
|
|
|
body: Padding(
|
|
|
|
|
padding: const EdgeInsets.all(24.0),
|
|
|
|
|
child: Column(
|
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
|
|
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
|
|
|
|
children: [
|
|
|
|
|
Expanded(
|
|
|
|
|
child: ListView(
|
|
|
|
|
children: [
|
|
|
|
|
Expanded(
|
|
|
|
|
child: DefaultButton(
|
|
|
|
|
"Get Info",
|
|
|
|
|
() async {
|
|
|
|
|
checkBLEPermissions();
|
|
|
|
|
},
|
|
|
|
|
textColor: Colors.white,
|
|
|
|
|
),
|
|
|
|
|
ValueListenableBuilder(
|
|
|
|
|
valueListenable: bpDeviceDataNotifier,
|
|
|
|
|
builder: (context, value, _) {
|
|
|
|
|
return Row(
|
|
|
|
|
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
|
|
|
|
children: [
|
|
|
|
|
Text(
|
|
|
|
|
value == null || value.isEmpty ? "" : "Connected",
|
|
|
|
|
style: TextStyle(fontSize: 18),
|
|
|
|
|
),
|
|
|
|
|
Text(
|
|
|
|
|
"$value",
|
|
|
|
|
style: TextStyle(fontSize: 18),
|
|
|
|
|
),
|
|
|
|
|
],
|
|
|
|
|
);
|
|
|
|
|
},
|
|
|
|
|
),
|
|
|
|
|
mWidth(16.0),
|
|
|
|
|
Expanded(
|
|
|
|
|
child: DefaultButton(
|
|
|
|
|
"Get Files List",
|
|
|
|
|
() async {
|
|
|
|
|
await BleChannel.getBP2FilesList(["bloodpressure", "BP2"]);
|
|
|
|
|
},
|
|
|
|
|
textColor: Colors.white,
|
|
|
|
|
),
|
|
|
|
|
ValueListenableBuilder(
|
|
|
|
|
valueListenable: bpStatusNotifier,
|
|
|
|
|
builder: (context, value, _) {
|
|
|
|
|
if (value == "RealTimeDataBP2Measuring") {
|
|
|
|
|
return ValueListenableBuilder(
|
|
|
|
|
valueListenable: bpDataNotifierMeasuring,
|
|
|
|
|
builder: (context, BpRtDataMeasuringModel bpRtDataMeasuringModel, _) {
|
|
|
|
|
return Row(
|
|
|
|
|
mainAxisAlignment: MainAxisAlignment.center,
|
|
|
|
|
children: [
|
|
|
|
|
mHeight(24.0),
|
|
|
|
|
Column(
|
|
|
|
|
children: [
|
|
|
|
|
Text(bpRtDataMeasuringModel.pressure.toString(), style: TextStyle(fontSize: 100, fontWeight: FontWeight.bold)),
|
|
|
|
|
Text("Pressure", style: TextStyle(fontSize: 20)),
|
|
|
|
|
],
|
|
|
|
|
),
|
|
|
|
|
mHeight(24.0),
|
|
|
|
|
],
|
|
|
|
|
);
|
|
|
|
|
},
|
|
|
|
|
);
|
|
|
|
|
} else if (value == "RealTimeDataBP2Result") {
|
|
|
|
|
return ValueListenableBuilder(
|
|
|
|
|
valueListenable: bpDataNotifierResult,
|
|
|
|
|
builder: (context, BpRtDataResultModel bpRtDataResultModel, _) {
|
|
|
|
|
return Column(
|
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
|
|
|
children: [
|
|
|
|
|
mHeight(24.0),
|
|
|
|
|
Row(
|
|
|
|
|
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
|
|
|
|
children: [
|
|
|
|
|
Column(
|
|
|
|
|
children: [
|
|
|
|
|
Text("Dia", style: TextStyle(fontSize: 20)),
|
|
|
|
|
Text(bpRtDataResultModel.dia.toString(), style: TextStyle(fontSize: 50, fontWeight: FontWeight.bold)),
|
|
|
|
|
Text("mmHg", style: TextStyle(fontSize: 10)),
|
|
|
|
|
],
|
|
|
|
|
),
|
|
|
|
|
Column(
|
|
|
|
|
children: [
|
|
|
|
|
Text("Sys", style: TextStyle(fontSize: 20)),
|
|
|
|
|
Text(bpRtDataResultModel.sys.toString(), style: TextStyle(fontSize: 50, fontWeight: FontWeight.bold)),
|
|
|
|
|
Text("mmHg", style: TextStyle(fontSize: 10)),
|
|
|
|
|
],
|
|
|
|
|
),
|
|
|
|
|
Column(
|
|
|
|
|
children: [
|
|
|
|
|
Text("♥︎", style: TextStyle(fontSize: 20)),
|
|
|
|
|
Text(bpRtDataResultModel.pr.toString(), style: TextStyle(fontSize: 50, fontWeight: FontWeight.bold)),
|
|
|
|
|
Text("/min", style: TextStyle(fontSize: 10)),
|
|
|
|
|
],
|
|
|
|
|
),
|
|
|
|
|
],
|
|
|
|
|
),
|
|
|
|
|
mHeight(24.0),
|
|
|
|
|
],
|
|
|
|
|
);
|
|
|
|
|
},
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return Padding(
|
|
|
|
|
padding: const EdgeInsets.all(24.0),
|
|
|
|
|
child: Center(
|
|
|
|
|
child: Text(
|
|
|
|
|
"Some animation with the instruction",
|
|
|
|
|
style: TextStyle(fontSize: 9.0),
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
);
|
|
|
|
|
},
|
|
|
|
|
),
|
|
|
|
|
],
|
|
|
|
|
),
|
|
|
|
|
mHeight(20.0),
|
|
|
|
|
// _buildLiveLineChart()
|
|
|
|
|
ValueListenableBuilder(
|
|
|
|
|
valueListenable: bpDataNotifier,
|
|
|
|
|
builder: (context, value, _) {
|
|
|
|
|
return Column(
|
|
|
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
|
|
|
),
|
|
|
|
|
ValueListenableBuilder(
|
|
|
|
|
valueListenable: bpDeviceDataNotifier,
|
|
|
|
|
builder: (context, value, _) {
|
|
|
|
|
if (value == null || value.isEmpty) {
|
|
|
|
|
return Row(
|
|
|
|
|
children: [
|
|
|
|
|
Text(
|
|
|
|
|
value,
|
|
|
|
|
style: TextStyle(fontSize: 9.0),
|
|
|
|
|
Expanded(
|
|
|
|
|
child: DefaultButton(
|
|
|
|
|
"Start Scan",
|
|
|
|
|
() async {
|
|
|
|
|
checkBLEPermissions();
|
|
|
|
|
},
|
|
|
|
|
textColor: Colors.white,
|
|
|
|
|
color: Colors.green,
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
mHeight(24.0),
|
|
|
|
|
getFilesListWidget(),
|
|
|
|
|
mHeight(20.0),
|
|
|
|
|
],
|
|
|
|
|
);
|
|
|
|
|
},
|
|
|
|
|
),
|
|
|
|
|
],
|
|
|
|
|
),
|
|
|
|
|
}
|
|
|
|
|
return Row(
|
|
|
|
|
children: [
|
|
|
|
|
Expanded(
|
|
|
|
|
child: DefaultButton(
|
|
|
|
|
"Disconnect with $value",
|
|
|
|
|
() async {
|
|
|
|
|
bpDataNotifierMeasuring.dispose();
|
|
|
|
|
bpDataNotifierResult.dispose();
|
|
|
|
|
|
|
|
|
|
bpStatusNotifier.dispose();
|
|
|
|
|
BleChannel.disconnect();
|
|
|
|
|
},
|
|
|
|
|
textColor: Colors.white,
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
],
|
|
|
|
|
);
|
|
|
|
|
return Row(
|
|
|
|
|
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
|
|
|
|
children: [
|
|
|
|
|
Text(
|
|
|
|
|
value != null || value.isEmpty ? "" : "Connected",
|
|
|
|
|
style: TextStyle(fontSize: 18),
|
|
|
|
|
),
|
|
|
|
|
Text(
|
|
|
|
|
"$value",
|
|
|
|
|
style: TextStyle(fontSize: 18),
|
|
|
|
|
),
|
|
|
|
|
],
|
|
|
|
|
);
|
|
|
|
|
},
|
|
|
|
|
),
|
|
|
|
|
],
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
);
|
|
|
|
|
@ -125,7 +236,8 @@ class _BpTrackerBLEState extends State<BpTrackerBLE> {
|
|
|
|
|
print('Received event---: $event');
|
|
|
|
|
print(event['type']);
|
|
|
|
|
if (event['type'] == "infoData") {
|
|
|
|
|
bpDataNotifier.value = event['data'];
|
|
|
|
|
bpStatusNotifier.value = "infoData";
|
|
|
|
|
bpDeviceDataNotifier.value = event['deviceName'];
|
|
|
|
|
}
|
|
|
|
|
if (event['type'] == "fileList") {
|
|
|
|
|
// parseEKGFilesList(event['data']);
|
|
|
|
|
@ -133,49 +245,25 @@ class _BpTrackerBLEState extends State<BpTrackerBLE> {
|
|
|
|
|
if (event['type'] == 'fileDetail') {
|
|
|
|
|
print("Received file data ---:");
|
|
|
|
|
print(event['data']);
|
|
|
|
|
// parseEKGFileDetailObject(event['data']);
|
|
|
|
|
}
|
|
|
|
|
if (event['type'] == "RealTimeDataBP2") {
|
|
|
|
|
bpDataNotifier.value = event['data'];
|
|
|
|
|
// parseEKGRealTimeDataObject(event['data']);
|
|
|
|
|
if (event['type'] == "RealTimeDataBP2Measuring") {
|
|
|
|
|
parseBpRtMeasuringObject(event['data']);
|
|
|
|
|
bpStatusNotifier.value = "RealTimeDataBP2Measuring";
|
|
|
|
|
}
|
|
|
|
|
if (event['type'] == "RealTimeDataBP2Result") {
|
|
|
|
|
parseBpRtResultObject(event['data']);
|
|
|
|
|
bpStatusNotifier.value = "RealTimeDataBP2Result";
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
await BleChannel.getScanningResult(["bloodpressure", "BP2"]);
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
String getSPO2(String value) {
|
|
|
|
|
return "SpO2: " + value.split(",")[0].replaceAll("{spo2=", "");
|
|
|
|
|
void parseBpRtMeasuringObject(dynamic returnData) {
|
|
|
|
|
bpDataNotifierMeasuring.value = BpRtDataMeasuringModel.fromJson(json.decode(returnData));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
String getPR(String value) {
|
|
|
|
|
return "Pulse Rate: " + value.split(",")[1].replaceAll("pr=", "");
|
|
|
|
|
void parseBpRtResultObject(dynamic returnData) {
|
|
|
|
|
bpDataNotifierResult.value = BpRtDataResultModel.fromJson(json.decode(returnData));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
String getPI(String value) {
|
|
|
|
|
return "Perfusion Index: " + value.split(",")[2].replaceAll("pi=", "") + "%";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
String getSPO2iOS(String value) {
|
|
|
|
|
return "SpO2: " + value.split(",")[0];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
String getPRiOS(String value) {
|
|
|
|
|
return "Pulse Rate: " + value.split(",")[1];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 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;
|
|
|
|
|
// }
|
|
|
|
|
}
|
|
|
|
|
|