Completed the oxymeter category
parent
0a700270f4
commit
70ca4071fc
@ -0,0 +1,22 @@
|
||||
package com.cloud.diplomaticquarterapp.ble;
|
||||
|
||||
public class OxymeterModel {
|
||||
|
||||
public int spo2;
|
||||
public int pr;
|
||||
public float pi;
|
||||
public boolean isProbeOff;
|
||||
public boolean isPulseSearching;
|
||||
public boolean isCheckProbe;
|
||||
public int battery;
|
||||
|
||||
public OxymeterModel(int spo2, int pr, float pi, boolean isProbeOff, boolean isPulseSearching, boolean isCheckProbe, int battery) {
|
||||
this.spo2 = spo2;
|
||||
this.pr = pr;
|
||||
this.pi = pi;
|
||||
this.isProbeOff = isProbeOff;
|
||||
this.isPulseSearching = isPulseSearching;
|
||||
this.isCheckProbe = isCheckProbe;
|
||||
this.battery = battery;
|
||||
}
|
||||
}
|
||||
@ -1,24 +0,0 @@
|
||||
class BpRtDataMeasuringModel {
|
||||
bool deflate;
|
||||
int pr;
|
||||
int pressure;
|
||||
bool pulse;
|
||||
|
||||
BpRtDataMeasuringModel({this.deflate, this.pr, this.pressure, this.pulse});
|
||||
|
||||
BpRtDataMeasuringModel.fromJson(Map<String, dynamic> json) {
|
||||
deflate = json['deflate'];
|
||||
pr = json['pr'];
|
||||
pressure = json['pressure'];
|
||||
pulse = json['pulse'];
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||
data['deflate'] = this.deflate;
|
||||
data['pr'] = this.pr;
|
||||
data['pressure'] = this.pressure;
|
||||
data['pulse'] = this.pulse;
|
||||
return data;
|
||||
}
|
||||
}
|
||||
@ -1,33 +0,0 @@
|
||||
class BpRtDataResultModel {
|
||||
bool deflate;
|
||||
int dia;
|
||||
int mean;
|
||||
int pr;
|
||||
int pressure;
|
||||
int result;
|
||||
int sys;
|
||||
|
||||
BpRtDataResultModel({this.deflate, this.dia, this.mean, this.pr, this.pressure, this.result, this.sys});
|
||||
|
||||
BpRtDataResultModel.fromJson(Map<String, dynamic> json) {
|
||||
deflate = json['deflate'];
|
||||
dia = json['dia'];
|
||||
mean = json['mean'];
|
||||
pr = json['pr'];
|
||||
pressure = json['pressure'];
|
||||
result = json['result'];
|
||||
sys = json['sys'];
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||
data['deflate'] = this.deflate;
|
||||
data['dia'] = this.dia;
|
||||
data['mean'] = this.mean;
|
||||
data['pr'] = this.pr;
|
||||
data['pressure'] = this.pressure;
|
||||
data['result'] = this.result;
|
||||
data['sys'] = this.sys;
|
||||
return data;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,93 @@
|
||||
import 'dart:developer';
|
||||
|
||||
import 'package:diplomaticquarterapp/pages/medical/my_trackers/ble_device_type_screens/device_types/oxymeter_connect_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/data_display/medical/medical_profile_item.dart';
|
||||
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
|
||||
import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
class BleDevicesScreen extends StatefulWidget {
|
||||
@override
|
||||
State<BleDevicesScreen> createState() => _BleDevicesScreenState();
|
||||
}
|
||||
|
||||
class _BleDevicesScreenState extends State<BleDevicesScreen> {
|
||||
MyTrackersViewModel myTrackersVm;
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
myTrackersVm.resetList();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
myTrackersVm = context.read<MyTrackersViewModel>();
|
||||
myTrackersVm.startSearchingForTracker();
|
||||
super.initState();
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return AppScaffold(
|
||||
appBarTitle: "BLE Tracker",
|
||||
showNewAppBar: true,
|
||||
isShowDecPage: false,
|
||||
showNewAppBarTitle: true,
|
||||
backgroundColor: Color(0xffF8F8F8),
|
||||
body: Container(
|
||||
child: SingleChildScrollView(
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: <Widget>[
|
||||
Consumer(
|
||||
builder: (BuildContext context, MyTrackersViewModel myTrackerVm, Widget child) {
|
||||
if (myTrackerVm.devicesList.isEmpty) {
|
||||
return Padding(
|
||||
padding: const EdgeInsets.all(24.0),
|
||||
child: Center(
|
||||
child: Text(
|
||||
"Searching for Devices Animation",
|
||||
style: TextStyle(fontSize: 9.0),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
return Padding(
|
||||
padding: EdgeInsets.only(left: 12, right: 12, top: 20),
|
||||
child: GridView.builder(
|
||||
shrinkWrap: true,
|
||||
primary: false,
|
||||
physics: NeverScrollableScrollPhysics(),
|
||||
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 3, childAspectRatio: 2 / 2, crossAxisSpacing: 12, mainAxisSpacing: 12),
|
||||
padding: EdgeInsets.zero,
|
||||
itemCount: myTrackerVm.devicesList.length,
|
||||
itemBuilder: (BuildContext context, int index) {
|
||||
BleDeviceModel device = myTrackerVm.devicesList[index];
|
||||
return InkWell(
|
||||
onTap: () {
|
||||
myTrackerVm.oxyRtModel = null;
|
||||
Navigator.pushReplacement(context, FadePage(page: OxymeterConnectScreen(deviceModel: device)));
|
||||
},
|
||||
child: MedicalProfileItem(
|
||||
title: "${device.name}",
|
||||
imagePath: 'tracker.svg',
|
||||
subTitle: "",
|
||||
isEnable: true,
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
);
|
||||
},
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,140 @@
|
||||
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/uitl/utils_new.dart';
|
||||
import 'package:diplomaticquarterapp/widgets/buttons/defaultButton.dart';
|
||||
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
class BloodPressureConnectScreen extends StatefulWidget {
|
||||
final BleDeviceModel deviceModel;
|
||||
|
||||
const BloodPressureConnectScreen({this.deviceModel});
|
||||
|
||||
@override
|
||||
State<BloodPressureConnectScreen> createState() => _BloodPressureConnectScreenState();
|
||||
}
|
||||
|
||||
class _BloodPressureConnectScreenState extends State<BloodPressureConnectScreen> {
|
||||
MyTrackersViewModel myTrackersVm;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
myTrackersVm = context.read<MyTrackersViewModel>();
|
||||
myTrackersVm.connectDevice(widget.deviceModel);
|
||||
super.initState();
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
myTrackersVm.disConnectDevice();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@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.start,
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Expanded(
|
||||
child: ListView(
|
||||
children: [
|
||||
if (myTrackersViewModel.bpCurrentStatus == "RealTimeDataBP2Measuring") ...[
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
mHeight(24.0),
|
||||
Column(
|
||||
children: [
|
||||
Text(myTrackersViewModel.bpRtMeasuringModel.pressure.toString(), style: TextStyle(fontSize: 100, fontWeight: FontWeight.bold)),
|
||||
Text("Pressure", style: TextStyle(fontSize: 20)),
|
||||
],
|
||||
),
|
||||
mHeight(24.0),
|
||||
],
|
||||
),
|
||||
] else if (myTrackersViewModel.bpCurrentStatus == "RealTimeDataBP2Result") ...[
|
||||
Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
mHeight(24.0),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
||||
children: [
|
||||
Column(
|
||||
children: [
|
||||
Text("Dia", style: TextStyle(fontSize: 20)),
|
||||
Text(myTrackersViewModel.bpRtResultModel.dia.toString(), style: TextStyle(fontSize: 50, fontWeight: FontWeight.bold)),
|
||||
Text("mmHg", style: TextStyle(fontSize: 10)),
|
||||
],
|
||||
),
|
||||
Column(
|
||||
children: [
|
||||
Text("Sys", style: TextStyle(fontSize: 20)),
|
||||
Text(myTrackersViewModel.bpRtResultModel.sys.toString(), style: TextStyle(fontSize: 50, fontWeight: FontWeight.bold)),
|
||||
Text("mmHg", style: TextStyle(fontSize: 10)),
|
||||
],
|
||||
),
|
||||
Column(
|
||||
children: [
|
||||
Text("♥︎", style: TextStyle(fontSize: 20)),
|
||||
Text(myTrackersViewModel.bpRtResultModel.pr.toString(), style: TextStyle(fontSize: 50, fontWeight: FontWeight.bold)),
|
||||
Text("/min", style: TextStyle(fontSize: 10)),
|
||||
],
|
||||
),
|
||||
],
|
||||
),
|
||||
mHeight(24.0),
|
||||
],
|
||||
),
|
||||
] else ...[
|
||||
Padding(
|
||||
padding: const EdgeInsets.all(24.0),
|
||||
child: Center(
|
||||
child: Text(
|
||||
"Some animation with the instruction",
|
||||
style: TextStyle(fontSize: 9.0),
|
||||
),
|
||||
),
|
||||
)
|
||||
],
|
||||
],
|
||||
),
|
||||
),
|
||||
if (myTrackersViewModel.bpCurrentStatus != null) ...[
|
||||
Row(
|
||||
children: [
|
||||
Expanded(
|
||||
child: DefaultButton(
|
||||
"Disconnect with ${widget.deviceModel.name}",
|
||||
() async {
|
||||
myTrackersVm.bpCurrentStatus = null;
|
||||
myTrackersVm.bpRtMeasuringModel = null;
|
||||
myTrackersVm.bpRtResultModel = null;
|
||||
Navigator.pop(context);
|
||||
},
|
||||
textColor: Colors.white,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
]
|
||||
],
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,129 @@
|
||||
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/uitl/utils_new.dart';
|
||||
import 'package:diplomaticquarterapp/widgets/buttons/defaultButton.dart';
|
||||
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
class OxymeterConnectScreen extends StatefulWidget {
|
||||
final BleDeviceModel deviceModel;
|
||||
|
||||
const OxymeterConnectScreen({this.deviceModel});
|
||||
|
||||
@override
|
||||
State<OxymeterConnectScreen> createState() => _OxymeterConnectScreenState();
|
||||
}
|
||||
|
||||
class _OxymeterConnectScreenState extends State<OxymeterConnectScreen> {
|
||||
MyTrackersViewModel myTrackersVm;
|
||||
|
||||
@override
|
||||
void initState() {
|
||||
myTrackersVm = context.read<MyTrackersViewModel>();
|
||||
myTrackersVm.connectDevice(widget.deviceModel);
|
||||
super.initState();
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
myTrackersVm.disConnectDevice();
|
||||
super.dispose();
|
||||
}
|
||||
|
||||
@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.start,
|
||||
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||
children: [
|
||||
Expanded(
|
||||
child: ListView(
|
||||
children: [
|
||||
if (myTrackersViewModel.oxyRtModel != null) ...[
|
||||
Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: [
|
||||
mHeight(24.0),
|
||||
Row(
|
||||
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
|
||||
children: [
|
||||
if (myTrackersViewModel.oxyRtModel.isProbeOff) ...[
|
||||
Text("Check Probe", style: TextStyle(fontSize: 50, fontWeight: FontWeight.bold)),
|
||||
] else ...[
|
||||
Column(
|
||||
children: [
|
||||
Text("SPO₂", style: TextStyle(fontSize: 20)),
|
||||
Text(myTrackersViewModel.oxyRtModel.spo2.toString(), style: TextStyle(fontSize: 50, fontWeight: FontWeight.bold)),
|
||||
Text("%", style: TextStyle(fontSize: 10)),
|
||||
],
|
||||
),
|
||||
Column(
|
||||
children: [
|
||||
Text("Pulse", style: TextStyle(fontSize: 20)),
|
||||
Text(myTrackersViewModel.oxyRtModel.pr.toString(), style: TextStyle(fontSize: 50, fontWeight: FontWeight.bold)),
|
||||
Text("bpm", style: TextStyle(fontSize: 10)),
|
||||
],
|
||||
),
|
||||
Column(
|
||||
children: [
|
||||
Text("PI", style: TextStyle(fontSize: 20)),
|
||||
Text(myTrackersViewModel.oxyRtModel.pi.toString(), style: TextStyle(fontSize: 50, fontWeight: FontWeight.bold)),
|
||||
Text("%", style: TextStyle(fontSize: 10)),
|
||||
],
|
||||
),
|
||||
],
|
||||
],
|
||||
),
|
||||
mHeight(24.0),
|
||||
],
|
||||
)
|
||||
],
|
||||
if (myTrackersViewModel.oxyRtModel == null) ...[
|
||||
Padding(
|
||||
padding: const EdgeInsets.all(24.0),
|
||||
child: Center(
|
||||
child: Text(
|
||||
"Some animation with the instruction",
|
||||
style: TextStyle(fontSize: 9.0),
|
||||
),
|
||||
),
|
||||
),
|
||||
]
|
||||
],
|
||||
),
|
||||
),
|
||||
if (myTrackersViewModel.oxyRtModel != null) ...[
|
||||
Row(
|
||||
children: [
|
||||
Expanded(
|
||||
child: DefaultButton(
|
||||
"Disconnect with ${widget.deviceModel.name}",
|
||||
() async {
|
||||
myTrackersVm.oxyRtModel = null;
|
||||
Navigator.pop(context);
|
||||
},
|
||||
textColor: Colors.white,
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
]
|
||||
],
|
||||
);
|
||||
},
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,114 @@
|
||||
import 'package:diplomaticquarterapp/pages/medical/my_trackers/ble_device_type_screens/ble_devices_screen.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/others/app_scaffold_widget.dart';
|
||||
import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
class SelectTrackerType extends StatelessWidget {
|
||||
const SelectTrackerType();
|
||||
|
||||
List<Widget> myTrackersTypeList({BuildContext context}) {
|
||||
List<Widget> medical = [];
|
||||
medical.add(InkWell(
|
||||
onTap: () {
|
||||
context.read<MyTrackersViewModel>().updateSelectedTrackerType(TrackerTypeEnum.OxymeterTracker);
|
||||
Navigator.of(context).push(FadePage(page: BleDevicesScreen()));
|
||||
},
|
||||
child: MedicalProfileItem(
|
||||
title: "Oxymeter",
|
||||
imagePath: 'tracker.svg',
|
||||
subTitle: "Tracker",
|
||||
isEnable: true,
|
||||
),
|
||||
));
|
||||
medical.add(InkWell(
|
||||
onTap: () {
|
||||
context.read<MyTrackersViewModel>().updateSelectedTrackerType(TrackerTypeEnum.BloodPressureTracker);
|
||||
Navigator.of(context).push(FadePage(page: BleDevicesScreen()));
|
||||
},
|
||||
child: MedicalProfileItem(
|
||||
title: "Blood Pressure",
|
||||
imagePath: 'tracker.svg',
|
||||
subTitle: "Tracker",
|
||||
isEnable: true,
|
||||
),
|
||||
));
|
||||
medical.add(InkWell(
|
||||
onTap: () {
|
||||
context.read<MyTrackersViewModel>().updateSelectedTrackerType(TrackerTypeEnum.BloodSugarTracker);
|
||||
Navigator.of(context).push(FadePage(page: BleDevicesScreen()));
|
||||
},
|
||||
child: MedicalProfileItem(
|
||||
title: "Blood Sugar",
|
||||
imagePath: 'tracker.svg',
|
||||
subTitle: "Tracker",
|
||||
isEnable: true,
|
||||
),
|
||||
));
|
||||
medical.add(InkWell(
|
||||
onTap: () {
|
||||
context.read<MyTrackersViewModel>().updateSelectedTrackerType(TrackerTypeEnum.ECGTracker);
|
||||
Navigator.of(context).push(FadePage(page: BleDevicesScreen()));
|
||||
},
|
||||
child: MedicalProfileItem(
|
||||
title: "ECG",
|
||||
imagePath: 'tracker.svg',
|
||||
subTitle: "Tracker",
|
||||
isEnable: true,
|
||||
),
|
||||
));
|
||||
medical.add(InkWell(
|
||||
onTap: () {
|
||||
context.read<MyTrackersViewModel>().updateSelectedTrackerType(TrackerTypeEnum.AllInOneTracker);
|
||||
Navigator.of(context).push(FadePage(page: BleDevicesScreen()));
|
||||
},
|
||||
child: MedicalProfileItem(
|
||||
title: "All in one Monitor",
|
||||
imagePath: 'tracker.svg',
|
||||
subTitle: "Tracker",
|
||||
isEnable: true,
|
||||
),
|
||||
));
|
||||
|
||||
return medical;
|
||||
}
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
List<Widget> myMedicalList = myTrackersTypeList(context: context);
|
||||
|
||||
return AppScaffold(
|
||||
isShowDecPage: false,
|
||||
isShowAppBar: false,
|
||||
showNewAppBar: true,
|
||||
isHelp: true,
|
||||
showNewAppBarTitle: true,
|
||||
appBarTitle: "Select Tracker",
|
||||
body: Container(
|
||||
child: SingleChildScrollView(
|
||||
child: Column(
|
||||
crossAxisAlignment: CrossAxisAlignment.start,
|
||||
children: <Widget>[
|
||||
Padding(
|
||||
padding: EdgeInsets.only(left: 12, right: 12, top: 20),
|
||||
child: GridView.builder(
|
||||
shrinkWrap: true,
|
||||
primary: false,
|
||||
physics: NeverScrollableScrollPhysics(),
|
||||
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(crossAxisCount: 3, childAspectRatio: 2 / 2, crossAxisSpacing: 12, mainAxisSpacing: 12),
|
||||
padding: EdgeInsets.zero,
|
||||
itemCount: myMedicalList.length,
|
||||
itemBuilder: (BuildContext context, int index) {
|
||||
return myMedicalList[index];
|
||||
},
|
||||
),
|
||||
),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,29 @@
|
||||
class BleDeviceModel {
|
||||
String macAddr;
|
||||
int model;
|
||||
String name;
|
||||
int rssi;
|
||||
|
||||
BleDeviceModel({this.macAddr, this.model, this.name, this.rssi});
|
||||
|
||||
BleDeviceModel.fromJson(Map<String, dynamic> json) {
|
||||
macAddr = json['macAddr'];
|
||||
model = json['model'];
|
||||
name = json['name'];
|
||||
rssi = json['rssi'];
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||
data['macAddr'] = this.macAddr;
|
||||
data['model'] = this.model;
|
||||
data['name'] = this.name;
|
||||
data['rssi'] = this.rssi;
|
||||
return data;
|
||||
}
|
||||
|
||||
@override
|
||||
String toString() {
|
||||
return 'BleDeviceModel{macAddr: $macAddr, model: $model, name: $name, rssi: $rssi}';
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,58 @@
|
||||
class BpRtMeasuringModel {
|
||||
bool deflate;
|
||||
int pr;
|
||||
int pressure;
|
||||
bool pulse;
|
||||
|
||||
BpRtMeasuringModel({this.deflate, this.pr, this.pressure, this.pulse});
|
||||
|
||||
BpRtMeasuringModel.fromJson(Map<String, dynamic> json) {
|
||||
deflate = json['deflate'];
|
||||
pr = json['pr'];
|
||||
pressure = json['pressure'];
|
||||
pulse = json['pulse'];
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||
data['deflate'] = this.deflate;
|
||||
data['pr'] = this.pr;
|
||||
data['pressure'] = this.pressure;
|
||||
data['pulse'] = this.pulse;
|
||||
return data;
|
||||
}
|
||||
}
|
||||
|
||||
class BpRtResultModel {
|
||||
bool deflate;
|
||||
int dia;
|
||||
int mean;
|
||||
int pr;
|
||||
int pressure;
|
||||
int result;
|
||||
int sys;
|
||||
|
||||
BpRtResultModel({this.deflate, this.dia, this.mean, this.pr, this.pressure, this.result, this.sys});
|
||||
|
||||
BpRtResultModel.fromJson(Map<String, dynamic> json) {
|
||||
deflate = json['deflate'];
|
||||
dia = json['dia'];
|
||||
mean = json['mean'];
|
||||
pr = json['pr'];
|
||||
pressure = json['pressure'];
|
||||
result = json['result'];
|
||||
sys = json['sys'];
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = new Map<String, dynamic>();
|
||||
data['deflate'] = this.deflate;
|
||||
data['dia'] = this.dia;
|
||||
data['mean'] = this.mean;
|
||||
data['pr'] = this.pr;
|
||||
data['pressure'] = this.pressure;
|
||||
data['result'] = this.result;
|
||||
data['sys'] = this.sys;
|
||||
return data;
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,171 @@
|
||||
import 'dart:convert';
|
||||
import 'dart:developer';
|
||||
import 'package:diplomaticquarterapp/pages/medical/my_trackers/ble_models/ble_devices_model.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/oxy_rt_param_model.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:permission_handler/permission_handler.dart';
|
||||
import 'package:diplomaticquarterapp/pages/medical/my_trackers/ble_helpers/ble_connect_helper.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
enum TrackerTypeEnum { OxymeterTracker, BloodPressureTracker, BloodSugarTracker, ECGTracker, AllInOneTracker }
|
||||
|
||||
class MyTrackersViewModel extends ChangeNotifier {
|
||||
EventChannel eventChannel = EventChannel('BLE-Platform-Bridge-Event');
|
||||
|
||||
List<BleDeviceModel> devicesList = [];
|
||||
|
||||
var devicesInfoJson = {
|
||||
"OxymeterTracker": [
|
||||
{"model": "SP-20"}, // DONE
|
||||
{"model": "POD-1"}, // DONE
|
||||
{"model": "O2M"}, // DONE
|
||||
{"model": "PC-60"}, //DONE
|
||||
{"model": "O2Ring"}, // DONE
|
||||
],
|
||||
"BloodPressureTracker": [
|
||||
{"model": "BP2"},
|
||||
{"model": ""},
|
||||
{"model": ""},
|
||||
{"model": ""},
|
||||
],
|
||||
"BloodSugarTracker": [
|
||||
{"model": ""},
|
||||
{"model": ""},
|
||||
{"model": ""},
|
||||
{"model": ""},
|
||||
],
|
||||
"ECGTracker": [
|
||||
{"model": "DuoEK"},
|
||||
{"model": ""},
|
||||
{"model": ""},
|
||||
{"model": ""},
|
||||
],
|
||||
"AllInOneTracker": [
|
||||
{"model": ""},
|
||||
{"model": ""},
|
||||
{"model": ""},
|
||||
{"model": ""},
|
||||
],
|
||||
};
|
||||
|
||||
//************************************* OXYMETER *************************************
|
||||
|
||||
OxyRtParamModel oxyRtModel;
|
||||
|
||||
void updateOxyRtModel(Map<String, dynamic> mapData) {
|
||||
oxyRtModel = OxyRtParamModel.fromJson(mapData);
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
// ************************************* BLOOD PRESSURE *************************************
|
||||
|
||||
BpRtMeasuringModel bpRtMeasuringModel;
|
||||
|
||||
void updateBpRtMeasuringModel(Map<String, dynamic> mapData) {
|
||||
bpRtMeasuringModel = BpRtMeasuringModel.fromJson(mapData);
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
BpRtResultModel bpRtResultModel;
|
||||
|
||||
void updateBpRtResultModel(Map<String, dynamic> mapData) {
|
||||
bpRtResultModel = BpRtResultModel.fromJson(mapData);
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
String bpCurrentStatus;
|
||||
|
||||
updateBpCurrentStatus(var value) {
|
||||
bpCurrentStatus = value;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
void filterOutTheSearchedDevices(List<BleDeviceModel> allDevices) {
|
||||
devicesList.clear();
|
||||
notifyListeners();
|
||||
if (devicesInfoJson.containsKey(currentSelectedTrackerType.name)) {
|
||||
allDevices.forEach((foundDevice) {
|
||||
List devicesInSelectedType = devicesInfoJson[currentSelectedTrackerType.name];
|
||||
for (var device in devicesInSelectedType) {
|
||||
log("foundDevice.name: ${foundDevice.name.toString()}");
|
||||
log("device['model']: ${device['model']}");
|
||||
if (device['model'] != "" && foundDevice.name.contains(device['model'])) {
|
||||
devicesList.add(foundDevice);
|
||||
}
|
||||
}
|
||||
});
|
||||
notifyListeners();
|
||||
}
|
||||
}
|
||||
|
||||
TrackerTypeEnum currentSelectedTrackerType = TrackerTypeEnum.OxymeterTracker;
|
||||
|
||||
updateSelectedTrackerType(var value) {
|
||||
devicesList.clear();
|
||||
currentSelectedTrackerType = value;
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
Future checkBLEPermissions() async {
|
||||
return [Permission.location, Permission.storage, Permission.bluetooth, Permission.bluetoothConnect, Permission.bluetoothScan].request();
|
||||
}
|
||||
|
||||
Future<void> startSearchingForTracker() async {
|
||||
log("selectedStracker: ${currentSelectedTrackerType.name}");
|
||||
|
||||
await checkBLEPermissions();
|
||||
eventChannel.receiveBroadcastStream().listen((event) {
|
||||
print('Received event---: $event');
|
||||
print(event['type']);
|
||||
|
||||
if (event['type'] == "devicesList") {
|
||||
parsesDevicesList(json.decode(event['data']) as List);
|
||||
}
|
||||
|
||||
if (event['type'] == "OxyRtParam") {
|
||||
updateOxyRtModel(json.decode(event['data']));
|
||||
}
|
||||
|
||||
if (event['type'] == "fileList") {
|
||||
print(event['data']);
|
||||
}
|
||||
if (event['type'] == 'fileDetail') {
|
||||
print(event['data']);
|
||||
}
|
||||
if (event['type'] == "RealTimeDataBP2Measuring") {
|
||||
updateBpRtMeasuringModel(json.decode(event['data']));
|
||||
updateBpCurrentStatus("RealTimeDataBP2Measuring");
|
||||
}
|
||||
if (event['type'] == "RealTimeDataBP2Result") {
|
||||
updateBpRtResultModel(json.decode(event['data']));
|
||||
updateBpCurrentStatus("RealTimeDataBP2Result");
|
||||
}
|
||||
});
|
||||
|
||||
await scanDevices();
|
||||
}
|
||||
|
||||
void parsesDevicesList(List returnData) {
|
||||
var devicesList = List.generate(returnData.length, (index) => BleDeviceModel.fromJson(returnData[index]));
|
||||
filterOutTheSearchedDevices(devicesList);
|
||||
}
|
||||
|
||||
void resetList() {
|
||||
devicesList.clear();
|
||||
// BleChannel.disconnect();
|
||||
}
|
||||
|
||||
Future<void> connectDevice(BleDeviceModel device) async {
|
||||
await BleChannel.connectDevice([device.name, device.model.toString()]);
|
||||
}
|
||||
|
||||
Future<void> disConnectDevice() async {
|
||||
await BleChannel.disconnect();
|
||||
}
|
||||
|
||||
Future<void> scanDevices() async {
|
||||
await BleChannel.scanResults([]);
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue