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