Made data models for checkme pro operations

dev_3.3_BLE
Faiz Hashmi 2 years ago
parent 4d74d2143f
commit cd3783d9f6

@ -20,6 +20,9 @@
<uses-feature android:name="android.hardware.camera" android:required="true"/>
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_CALENDAR" />

@ -1,5 +1,6 @@
package com.cloud.diplomaticquarterapp.ble
import TmpInfo
import android.annotation.SuppressLint
import android.bluetooth.BluetoothDevice
import android.os.Build
@ -13,7 +14,6 @@ import android.util.SparseArray
import androidx.annotation.RequiresApi
import com.cloud.diplomaticquarterapp.ble.utils.EcgData
import com.cloud.diplomaticquarterapp.ble.utils.HexString
import com.cloud.diplomaticquarterapp.check_me_pro.UiChannel
import com.cloud.diplomaticquarterapp.check_me_pro.bean.BleBean
import com.cloud.diplomaticquarterapp.check_me_pro.bean.UserBean
import com.cloud.diplomaticquarterapp.check_me_pro.ble.format.UserInfo
@ -21,6 +21,12 @@ import com.cloud.diplomaticquarterapp.check_me_pro.ble.manager.BleScanManager
import com.cloud.diplomaticquarterapp.check_me_pro.ble.worker.BleDataWorker
import com.cloud.diplomaticquarterapp.utils.Constant
import com.cloud.diplomaticquarterapp.MainActivity
import com.cloud.diplomaticquarterapp.check_me_pro.bean.toJson
import com.cloud.diplomaticquarterapp.check_me_pro.ble.format.BpInfo
import com.cloud.diplomaticquarterapp.check_me_pro.ble.format.EcgInfo
import com.cloud.diplomaticquarterapp.check_me_pro.ble.format.GluInfo
import com.cloud.diplomaticquarterapp.check_me_pro.ble.format.OxyInfo
import com.cloud.diplomaticquarterapp.utils.UiChannel
import com.google.gson.Gson
@ -56,6 +62,8 @@ import kotlinx.coroutines.withTimeoutOrNull
import org.apache.commons.io.FileUtils
import org.json.JSONObject
import java.io.File
import java.text.SimpleDateFormat
import java.util.Locale
class BleBridge(private var flutterEngine: FlutterEngine, private var mainActivity: MainActivity) {
@ -102,7 +110,6 @@ class BleBridge(private var flutterEngine: FlutterEngine, private var mainActivi
var mUserData: MutableList<UserBean> = java.util.ArrayList()
private val userChannel = Channel<Int>(Channel.CONFLATED)
@ -311,6 +318,7 @@ class BleBridge(private var flutterEngine: FlutterEngine, private var mainActivi
@RequiresApi(Build.VERSION_CODES.M)
private fun scanForCheckMePro(bleScanManager: BleScanManager, scanResultHandler: (String, BluetoothDevice) -> Unit) {
initVar()
bleScanManager.initScan(this.mainActivity)
bleScanManager.setCallBack(object : BleScanManager.Scan {
override fun scanReturn(name: String, bluetoothDevice: BluetoothDevice) {
@ -319,6 +327,10 @@ class BleBridge(private var flutterEngine: FlutterEngine, private var mainActivi
})
}
private fun initVar() {
Constant.initVar(this.mainActivity)
}
@SuppressLint("MissingPermission")
fun onScanResult(name: String, bluetoothDevice: BluetoothDevice) {
@ -356,7 +368,8 @@ class BleBridge(private var flutterEngine: FlutterEngine, private var mainActivi
private suspend fun readUserFromCheckMePro() {
userChannel.receive()
val userTemp = File(Constant.getPathX("usr.dat")).readBytes()
val userTemp = File(Constant.getPathX("usr.dat")).readBytes() // CRASHES HERE
userTemp.apply {
userInfo = UserInfo(this)
@ -369,6 +382,7 @@ class BleBridge(private var flutterEngine: FlutterEngine, private var mainActivi
tIndex++
UiChannel.progressChannel.send(tIndex * 100 / total)
}
mUserData.add(user)
}
for (f in commonFileName) {
bleWorker.getFile(f)
@ -378,7 +392,105 @@ class BleBridge(private var flutterEngine: FlutterEngine, private var mainActivi
delay(300)
UiChannel.progressChannel.close()
sendUsersDataToFlutter()
}
}
private fun sendUsersDataToFlutter() {
if (mUserData.isNotEmpty()) {
val jsonDataList = mutableListOf<String>()
for (user in mUserData) {
val jsonData = user.toJson()
jsonDataList.add(jsonData)
}
Log.d("userBeanJSON", jsonDataList.toString())
val returnData = mapOf("type" to "CheckMeUsersList", "data" to jsonDataList)
eventSink?.success(returnData)
}
}
private fun getBPDataFromCheckMePro(s: String) {
val file = File(Constant.getPathX(s + "nibp.dat"))
if (file.exists()) {
val temp = file.readBytes()
if (temp.isNotEmpty()) {
temp.let {
val f = BpInfo(it)
val json = gson.toJson(f.Bp)
Log.d("BPMeter", json.toString())
}
}
} else {
// HANDLE FAILURE HERE WITH A GENERIC DATA MAP TO FLUTTER
}
}
private fun getGlucoseDataFromCheckMePro(s: String) {
val file = File(Constant.getPathX(s + "glu.dat"))
if (file.exists()) {
val temp = file.readBytes()
if (temp.isNotEmpty()) {
temp.let {
val f = GluInfo(it)
val json = gson.toJson(f.Glu)
Log.d("BloodGlucoseMeter", json.toString())
}
}
} else {
// HANDLE FAILURE HERE WITH A GENERIC DATA MAP TO FLUTTER
}
}
private fun getOxyDataFromCheckMePro() {
val file = File(Constant.getPathX("oxi.dat"))
if (file.exists()) {
val temp = file.readBytes()
if (temp.isNotEmpty()) {
temp.let {
val f = OxyInfo(it)
val json = gson.toJson(f.Oxy)
Log.d("Oximeter", json.toString())
}
}
} else {
// HANDLE FAILURE HERE WITH A GENERIC DATA MAP TO FLUTTER
}
}
private fun getECGDataFromCheckMePro() {
val file = File(Constant.getPathX("ecg.dat"))
if (file.exists()) {
val temp = file.readBytes()
if (temp.isNotEmpty()) {
temp.let {
val f = EcgInfo(it)
val json = gson.toJson(f.ecg)
Log.d("ECGMeter", json.toString())
}
}
} else {
// HANDLE FAILURE HERE WITH A GENERIC DATA MAP TO FLUTTER
}
}
private fun getTemperatureDataFromCheckMePro() {
val file = File(Constant.getPathX("tmp.dat"))
if (file.exists()) {
val temp = file.readBytes()
if (temp.isNotEmpty()) {
temp.let {
val f = TmpInfo(it)
val json = gson.toJson(f.Tmp)
Log.d("TempMeter", json.toString())
}
}
} else {
// HANDLE FAILURE HERE WITH A GENERIC DATA MAP TO FLUTTER
}
}
@ -709,24 +821,41 @@ class BleBridge(private var flutterEngine: FlutterEngine, private var mainActivi
Log.d("DeviceFound", "This is the Device i have : ${currentBluetoothDevice.name}")
// stopScanForCheckMePro()
bleWorker.initWorker(this.mainActivity, currentBluetoothDevice.bluetoothDevice)
uiScope.launch {
dataScope.launch {
val a = withTimeoutOrNull(10000) {
bleWorker.waitConnect()
}
a?.let {
val b = withTimeoutOrNull(10000) {
Log.d("getFile", "getFile 718")
bleWorker.getFile("usr.dat")
}
b?.let {
userChannel.send(1)
}
}
}
uiScope.launch {
readUserFromCheckMePro()
}
// uiScope.launch {
// val a = withTimeoutOrNull(10000) {
// bleWorker.waitConnect()
// }
// a?.let {
// val b = withTimeoutOrNull(10000) {
// bleWorker.getFile("usr.dat")
// }
// b?.let {
// userChannel.send(1)
// }
// }
}
// }
// uiScope.launch {
//// readUserFromCheckMePro()
////
// getCheckMeProDeviceInfo()
// }

@ -2,6 +2,6 @@ package com.cloud.diplomaticquarterapp.check_me_pro
import kotlinx.coroutines.channels.Channel
object UiChannel {
val progressChannel = Channel<Int>(Channel.CONFLATED)
}
//object UiChannel {
// val progressChannel = Channel<Int>(Channel.CONFLATED)
//}

@ -1,5 +1,6 @@
package com.cloud.diplomaticquarterapp.check_me_pro.bean
import com.google.gson.Gson
import java.util.*
data class UserBean(
@ -12,3 +13,7 @@ data class UserBean(
var height: Int = 0,
var color: Int = 0
)
fun UserBean.toJson(): String {
return Gson().toJson(this)
}

@ -7,11 +7,9 @@ import java.util.*
class OxyInfo constructor(var bytes: ByteArray) {
var size: Int = bytes.size / 12
var Oxy: ArrayList<OxyBean> = arrayListOf<OxyBean>()
var Oxy: ArrayList<OxyBean> = arrayListOf()
init {
var start: Int
for (k in 0 until size) {
start = k * 12
@ -48,17 +46,11 @@ class OxyInfo constructor(var bytes: ByteArray) {
face = toUInt(setRange(start + 11, 1))
if (face > 2) face = 2
}
}
}
private fun setRange(start: Int, len: Int): ByteArray {
return bytes.copyOfRange(start, start + len)
}
}

@ -12,6 +12,7 @@ import android.content.Context
import android.os.Build
import android.util.Log
import androidx.annotation.RequiresApi
import com.cloud.diplomaticquarterapp.utils.Constant
class BleScanManager {

@ -2,9 +2,11 @@ package com.cloud.diplomaticquarterapp.check_me_pro.ble.worker
import android.bluetooth.BluetoothDevice
import android.content.Context
import android.os.Environment
import android.util.Log
import com.cloud.diplomaticquarterapp.check_me_pro.ble.format.CheckMeResponse
import com.cloud.diplomaticquarterapp.check_me_pro.ble.format.DeviceInfo
import com.cloud.diplomaticquarterapp.check_me_pro.ble.format.UserInfo
import com.cloud.diplomaticquarterapp.check_me_pro.ble.manager.BleDataManager
import com.cloud.diplomaticquarterapp.check_me_pro.ble.pkg.EndReadPkg
import com.cloud.diplomaticquarterapp.check_me_pro.ble.pkg.GetDeviceInfoPkg
@ -124,11 +126,14 @@ class BleDataWorker(private val updateEventSink: (Map<String, Any>) -> Unit) {
result = 0
Log.i("file", "receive $currentFileName")
File(Constant.getPathX(currentFileName)).writeBytes(this)
}
val pkg = EndReadPkg()
Log.i("file", "bytes ${pkg.buf}")
sendCmd(pkg.buf)
cmdState = 3
} else {
val pkg = ReadContentPkg(currentPkg)
sendCmd(pkg.buf)
@ -157,7 +162,6 @@ class BleDataWorker(private val updateEventSink: (Map<String, Any>) -> Unit) {
s += "$k: "
s += "${json.get(k)} "
}
Log.d("DeviceInfoFaiz", "This is the DeviceInfo: ${gson.toJson(json)}");
val returnData = mapOf("type" to "infoDataCheckMe", "data" to gson.toJson(json))
updateEventSink(returnData)
}
@ -184,8 +188,6 @@ class BleDataWorker(private val updateEventSink: (Map<String, Any>) -> Unit) {
myBleDataManager?.setNotifyListener(comeData)
bluetoothDevice?.let {
myBleDataManager?.connect(it)?.useAutoConnect(false)?.retry(150, 100)?.done {
Log.i("BLE", "连接成功了.>>.....>>>>")
getDeviceInfo();
dataScope.launch {
connectChannel.send("yes")
}
@ -202,7 +204,7 @@ class BleDataWorker(private val updateEventSink: (Map<String, Any>) -> Unit) {
this.currentFileName = name
cmdState = 1
val pkg = StartReadPkg(name)
Log.i("----- Current PKG -----", pkg.toString());
Log.i("----- Current PKG -----", pkg.buf.toString());
sendCmd(pkg.buf)
return fileChannel.receive()
}

@ -0,0 +1,7 @@
package com.cloud.diplomaticquarterapp.utils
import kotlinx.coroutines.channels.Channel
object UiChannel {
val progressChannel = Channel<Int>(Channel.CONFLATED)
}

@ -2,6 +2,7 @@ import 'package:diplomaticquarterapp/pages/medical/my_trackers/ble_models/ble_de
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/data_display/medical/medical_profile_item.dart';
import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
@ -31,11 +32,62 @@ class _AndesAllInOneConnectScreenState extends State<AndesAllInOneConnectScreen>
super.dispose();
}
Widget buildWeightScaleUI(MyTrackersViewModel myTrackersViewModel) {
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.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(context);
break;
case TrackerTypeEnum.OxymeterTracker:
// TODO: Handle this case.
break;
case TrackerTypeEnum.ECGTracker:
// TODO: Handle this case.
break;
case TrackerTypeEnum.Temperature:
// TODO: Handle this case.
break;
case TrackerTypeEnum.Spirometer:
case TrackerTypeEnum.WeightScale:
case TrackerTypeEnum.AllInOneTracker:
break;
}
}
Widget buildAllInOneUI(MyTrackersViewModel myTrackersViewModel) {
return Expanded(
child: ListView(
children: [
if (myTrackersViewModel.checkMeInfo == null) ...[
if (myTrackersViewModel.checkMeProUsersList == null) ...[
Padding(
padding: const EdgeInsets.all(24.0),
child: Center(
@ -46,15 +98,30 @@ class _AndesAllInOneConnectScreenState extends State<AndesAllInOneConnectScreen>
),
)
] else ...[
Padding(
padding: const EdgeInsets.all(24.0),
child: Center(
child: Text(
"${myTrackersViewModel.checkMeInfo.toString()}",
style: TextStyle(fontSize: 9.0),
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,
),
);
},
),
),
)
],
))
]
],
),
@ -77,8 +144,8 @@ class _AndesAllInOneConnectScreenState extends State<AndesAllInOneConnectScreen>
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
buildWeightScaleUI(myTrackersViewModel),
if (myTrackersViewModel.isAndesfitDeviceConnected != null && myTrackersViewModel.isAndesfitDeviceConnected) ...[
buildAllInOneUI(myTrackersViewModel),
if (myTrackersViewModel.checkMeProUsersList != null) ...[
Row(
children: [
Expanded(

@ -16,6 +16,7 @@ import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart';
import 'package:flutter/material.dart';
import 'package:flutter_blue_plus/flutter_blue_plus.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:provider/provider.dart';
class BleDevicesScreen extends StatefulWidget {
@ -118,7 +119,22 @@ class _BleDevicesScreenState extends State<BleDevicesScreen> {
if (myTrackersVm.isDeviceFromAndesFit(device.name)) {
return;
}
Navigator.pushReplacement(context, FadePage(page: AndesAllInOneConnectScreen(deviceModel: device)));
Permission.storage.isGranted.then((isGranted) {
log("isGranted: $isGranted");
if (!isGranted) {
Permission.manageExternalStorage.request().then((granted) {
log("status: $granted");
if (granted == PermissionStatus.granted) {
Navigator.pushReplacement(context, FadePage(page: AndesAllInOneConnectScreen(deviceModel: device)));
}
});
} else {
Navigator.pushReplacement(context, FadePage(page: AndesAllInOneConnectScreen(deviceModel: device)));
}
});
break;
}
}

@ -324,7 +324,6 @@ class _BloodPressureConnectScreenState extends State<BloodPressureConnectScreen>
if (myTrackersVm.isECGSelected) ...[
IconButton(
onPressed: () async {
myTrackersVm.updateFilesLoader(true);
showHistoryDialog(context);
await myTrackersVm.getEcgFilesList(widget.deviceModel);

@ -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/my_trackers_view_model/my_trackers_view_model.dart';
import 'package:diplomaticquarterapp/widgets/data_display/medical/medical_profile_item.dart';
@ -10,7 +9,6 @@ import 'package:provider/provider.dart';
class SelectTrackerType extends StatelessWidget {
const SelectTrackerType();
List<Widget> myTrackersTypeList({BuildContext context}) {
List<Widget> medical = [];
medical.add(InkWell(
@ -25,90 +23,104 @@ class SelectTrackerType extends StatelessWidget {
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.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.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.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.WeightScale);
Navigator.of(context).push(FadePage(page: BleDevicesScreen()));
},
child: MedicalProfileItem(
title: "Weight",
imagePath: 'tracker.svg',
subTitle: "Scale",
isEnable: true,
);
medical.add(
InkWell(
onTap: () {
context.read<MyTrackersViewModel>().updateSelectedTrackerType(TrackerTypeEnum.WeightScale);
Navigator.of(context).push(FadePage(page: BleDevicesScreen()));
},
child: MedicalProfileItem(
title: "Weight",
imagePath: 'tracker.svg',
subTitle: "Scale",
isEnable: true,
),
),
));
medical.add(InkWell(
onTap: () {
context.read<MyTrackersViewModel>().updateSelectedTrackerType(TrackerTypeEnum.Temperature);
Navigator.of(context).push(FadePage(page: BleDevicesScreen()));
},
child: MedicalProfileItem(
title: "Temperature",
imagePath: 'tracker.svg',
subTitle: "Scale",
isEnable: true,
);
medical.add(
InkWell(
onTap: () {
context.read<MyTrackersViewModel>().updateSelectedTrackerType(TrackerTypeEnum.Temperature);
Navigator.of(context).push(FadePage(page: BleDevicesScreen()));
},
child: MedicalProfileItem(
title: "Temperature",
imagePath: 'tracker.svg',
subTitle: "Scale",
isEnable: true,
),
),
));
medical.add(InkWell(
onTap: () {
context.read<MyTrackersViewModel>().updateSelectedTrackerType(TrackerTypeEnum.Spirometer);
Navigator.of(context).push(FadePage(page: BleDevicesScreen()));
},
child: MedicalProfileItem(
title: "Spirometer",
imagePath: 'tracker.svg',
subTitle: "Tracker",
isEnable: true,
);
medical.add(
InkWell(
onTap: () {
context.read<MyTrackersViewModel>().updateSelectedTrackerType(TrackerTypeEnum.Spirometer);
Navigator.of(context).push(FadePage(page: BleDevicesScreen()));
},
child: MedicalProfileItem(
title: "Spirometer",
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,
);
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;
}

@ -0,0 +1,27 @@
class CheckMeBPModel {
String date;
int dia;
int pr;
int sys;
String timeString;
CheckMeBPModel({this.date, this.dia, this.pr, this.sys, this.timeString});
CheckMeBPModel.fromJson(Map<String, dynamic> json) {
date = json['date'];
dia = json['dia'];
pr = json['pr'];
sys = json['sys'];
timeString = json['timeString'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['date'] = this.date;
data['dia'] = this.dia;
data['pr'] = this.pr;
data['sys'] = this.sys;
data['timeString'] = this.timeString;
return data;
}
}

@ -0,0 +1,27 @@
class CheckMeECGModel {
String date;
int face;
String timeString;
int voice;
int way;
CheckMeECGModel({this.date, this.face, this.timeString, this.voice, this.way});
CheckMeECGModel.fromJson(Map<String, dynamic> json) {
date = json['date'];
face = json['face'];
timeString = json['timeString'];
voice = json['voice'];
way = json['way'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['date'] = this.date;
data['face'] = this.face;
data['timeString'] = this.timeString;
data['voice'] = this.voice;
data['way'] = this.way;
return data;
}
}

@ -0,0 +1,24 @@
class CheckMeGlucoseModel {
String date;
double glu;
String note;
String timeString;
CheckMeGlucoseModel({this.date, this.glu, this.note, this.timeString});
CheckMeGlucoseModel.fromJson(Map<String, dynamic> json) {
date = json['date'];
glu = json['glu'];
note = json['note'];
timeString = json['timeString'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['date'] = this.date;
data['glu'] = this.glu;
data['note'] = this.note;
data['timeString'] = this.timeString;
return data;
}
}

@ -0,0 +1,36 @@
class CheckMeOxiModel {
String date;
int face;
int oxy;
int pi;
int pr;
String timeString;
int way;
CheckMeOxiModel({this.date, this.face, this.oxy, this.pi, this.pr, this.timeString, this.way});
CheckMeOxiModel.fromJson(Map<String, dynamic> json) {
date = json['date'];
face = json['face'];
oxy = json['oxy'];
pi = json['pi'];
pr = json['pr'];
timeString = json['timeString'];
way = json['way'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['date'] = this.date;
data['face'] = this.face;
data['oxy'] = this.oxy;
data['pi'] = this.pi;
data['pr'] = this.pr;
data['timeString'] = this.timeString;
data['way'] = this.way;
return data;
}
}

@ -0,0 +1,29 @@
class CheckMeTemperatureModel {
String date;
int face;
String timeString;
double tmp;
int way;
CheckMeTemperatureModel({this.date, this.face, this.timeString, this.tmp, this.way});
CheckMeTemperatureModel.fromJson(Map<String, dynamic> json) {
date = json['date'];
face = json['face'];
timeString = json['timeString'];
tmp = json['tmp'];
way = json['way'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['date'] = this.date;
data['face'] = this.face;
data['timeString'] = this.timeString;
data['tmp'] = this.tmp;
data['way'] = this.way;
return data;
}
}

@ -0,0 +1,36 @@
class CheckMeUserInfoModel {
String birthday;
int color;
int height;
int ico;
String id;
String name;
int sex;
int weight;
CheckMeUserInfoModel({this.birthday, this.color, this.height, this.ico, this.id, this.name, this.sex, this.weight});
CheckMeUserInfoModel.fromJson(Map<String, dynamic> json) {
birthday = json['birthday'];
color = json['color'];
height = json['height'];
ico = json['ico'];
id = json['id'];
name = json['name'];
sex = json['sex'];
weight = json['weight'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['birthday'] = this.birthday;
data['color'] = this.color;
data['height'] = this.height;
data['ico'] = this.ico;
data['id'] = this.id;
data['name'] = this.name;
data['sex'] = this.sex;
data['weight'] = this.weight;
return data;
}
}

@ -1,10 +1,12 @@
import 'dart:async';
import 'dart:convert';
import 'dart:developer';
import 'package:diplomaticquarterapp/config/size_config.dart';
import 'package:diplomaticquarterapp/pages/medical/my_trackers/ble_models/andesfit_devices/all_in_one_monitor/check_me_info_model.dart';
import 'package:diplomaticquarterapp/pages/medical/my_trackers/ble_models/andesfit_devices/bt_constants.dart';
import 'package:diplomaticquarterapp/pages/medical/my_trackers/ble_models/andesfit_devices/weight_data_model.dart';
import 'package:diplomaticquarterapp/pages/medical/my_trackers/ble_models/ble_devices_model.dart';
import 'package:diplomaticquarterapp/pages/medical/my_trackers/ble_models/checkmepro_all_in_one_models/checkme_user_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/ecg_file_detail_model.dart';
import 'package:diplomaticquarterapp/pages/medical/my_trackers/ble_models/viatom_devices/ecg_rt_model.dart';
@ -14,6 +16,7 @@ import 'package:diplomaticquarterapp/uitl/app_toast.dart';
import 'package:diplomaticquarterapp/uitl/ble_utils.dart';
import 'package:diplomaticquarterapp/uitl/date_uitl.dart';
import 'package:diplomaticquarterapp/uitl/utils_new.dart';
import 'package:diplomaticquarterapp/widgets/buttons/defaultButton.dart';
import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart';
import 'package:flutter/services.dart';
import 'package:flutter/cupertino.dart';
@ -21,6 +24,7 @@ import 'package:flutter_blue_plus/flutter_blue_plus.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';
import 'package:provider/provider.dart';
enum TrackerTypeEnum { OxymeterTracker, BloodPressureTracker, BloodSugarTracker, ECGTracker, WeightScale, Temperature, Spirometer, AllInOneTracker }
@ -31,7 +35,7 @@ String kRealTimeDataBPResult = "RealTimeDataBPResult";
String kOxyRtParam = "OxyRtParam";
String kDevicesList = "DevicesList";
String kDevicesListCheckMe = "DevicesListCheckMe";
String kInfoDataCheckMe = "infoDataCheckMe";
String kCheckMeUsersList = "CheckMeUsersList";
String kRealTimeDataECGMeasuring = "RealTimeDataECGMeasuring"; // This is for the device that measures BP and ECG also Like BP2 0567
String kRealTimeDataECGResult = "RealTimeDataECGResult";
String kRealTimeDataECG = "RealTimeDataECG";
@ -103,6 +107,13 @@ class MyTrackersViewModel extends ChangeNotifier {
};
List<String> ecgEnabledDevices = ["BP2 0567", "DuoEK", "ER1", "PM101897"];
List<TrackerTypeEnum> checkMeProTrackers = [
TrackerTypeEnum.Temperature,
TrackerTypeEnum.BloodPressureTracker,
TrackerTypeEnum.OxymeterTracker,
TrackerTypeEnum.BloodSugarTracker,
TrackerTypeEnum.ECGTracker,
];
List<String> andesFitDevices = [
"BPM",
"PM101897",
@ -211,13 +222,102 @@ class MyTrackersViewModel extends ChangeNotifier {
notifyListeners();
}
String checkMeInfo;
List<CheckMeUserInfoModel> checkMeProUsersList;
void updateCheckMeUserInfoModel(List returnData) {
if (checkMeProUsersList != null) {
checkMeProUsersList.clear();
}
checkMeProUsersList = List.generate(returnData.length, (index) => CheckMeUserInfoModel.fromJson(jsonDecode(returnData[index])));
void updateCheckMeInfoModel(String mapData) {
checkMeInfo = mapData;
notifyListeners();
}
getCheckMeUsersListDialog(BuildContext context) {
return showDialog(
context: context,
builder: (context) => Container(
decoration: BoxDecoration(borderRadius: BorderRadius.all(Radius.circular(15)), color: Colors.white),
padding: const EdgeInsets.all(20),
margin: const EdgeInsets.symmetric(vertical: 35, horizontal: 30),
child: SingleChildScrollView(
child: Consumer(builder: (BuildContext context, MyTrackersViewModel myTrackersVm, Widget child) {
return Column(
mainAxisSize: MainAxisSize.max,
mainAxisAlignment: MainAxisAlignment.center,
children: [
Material(
child: Center(
child: Text(
"Users List",
style: TextStyle(
fontSize: SizeConfig.textMultiplier * 1.8,
fontWeight: FontWeight.w600,
letterSpacing: -0.3,
height: 13 / 10,
),
),
),
),
if (myTrackersVm.filesLoader) ...[
Center(child: CircularProgressIndicator())
] else if (myTrackersVm.checkMeProUsersList != null && myTrackersVm.checkMeProUsersList.isNotEmpty) ...[
Material(
child: SizedBox(
height: MediaQuery.of(context).size.height * 0.7,
child: ListView.separated(
itemCount: checkMeProUsersList.length,
separatorBuilder: (context, index) => SizedBox(height: 14),
shrinkWrap: true,
reverse: false,
itemBuilder: (context, index) {
CheckMeUserInfoModel userModel = checkMeProUsersList[index];
return InkWell(
onTap: () => Navigator.pop(context),
child: Container(
decoration: cardRadius(12),
padding: EdgeInsets.all(12.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text("${userModel.id}. ${userModel.name}"),
mHeight(4.0),
Text("Gender: ${userModel.sex == 1 ? "Female" : "Male"}"),
mHeight(4.0),
Text("Height: ${userModel.height}"),
mHeight(4.0),
Text("Weight: ${userModel.height}"),
],
),
),
);
},
),
),
)
] else ...[
Material(
child: Center(
child: Text(
"No Users to show",
style: TextStyle(
fontSize: SizeConfig.textMultiplier * 1.6,
fontWeight: FontWeight.w600,
letterSpacing: -0.3,
height: 13 / 10,
),
),
),
),
]
],
);
}),
),
),
);
}
Widget getFilesListWidget(List<ECGFileDetailModel> filesList, BuildContext context) {
return Material(
child: SizedBox(
@ -323,8 +423,8 @@ class MyTrackersViewModel extends ChangeNotifier {
parsesDevicesList(list);
}
if (event['type'] == kInfoDataCheckMe) {
updateCheckMeInfoModel(event['data'].toString());
if (event['type'] == kCheckMeUsersList) {
updateCheckMeUserInfoModel(event['data']);
}
});
@ -651,8 +751,6 @@ class MyTrackersViewModel extends ChangeNotifier {
String resultSet1 = "";
String resultSet2 = "";
String resultSetCheckMeProUsers = "";
Future<void> connectAndesfitWeightDevice(BluetoothDevice device) async {
log("deviceToConnect: ${device.toString()}");
@ -1093,16 +1191,10 @@ class MyTrackersViewModel extends ChangeNotifier {
bool isDeviceSelected = false;
List<int> listOutput = [];
int cmdState = 0;
String currentFileName = "usr.dat";
var currentFileSize = 0;
int pkgTotal = 0;
int result = 0;
int currentPkg = 0;
Future<void> connectAndesfitAllInOneDevice(BluetoothDevice device) async {
log("deviceToConnect: ${device.toString()}");
}
//// --> CHECK ME PRO
}

Loading…
Cancel
Save