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-feature android:name="android.hardware.camera" android:required="true"/>
<uses-permission android:name="android.permission.RECORD_AUDIO" /> <uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> <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.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_CALENDAR" /> <uses-permission android:name="android.permission.READ_CALENDAR" />

@ -1,5 +1,6 @@
package com.cloud.diplomaticquarterapp.ble package com.cloud.diplomaticquarterapp.ble
import TmpInfo
import android.annotation.SuppressLint import android.annotation.SuppressLint
import android.bluetooth.BluetoothDevice import android.bluetooth.BluetoothDevice
import android.os.Build import android.os.Build
@ -13,7 +14,6 @@ import android.util.SparseArray
import androidx.annotation.RequiresApi import androidx.annotation.RequiresApi
import com.cloud.diplomaticquarterapp.ble.utils.EcgData import com.cloud.diplomaticquarterapp.ble.utils.EcgData
import com.cloud.diplomaticquarterapp.ble.utils.HexString 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.BleBean
import com.cloud.diplomaticquarterapp.check_me_pro.bean.UserBean import com.cloud.diplomaticquarterapp.check_me_pro.bean.UserBean
import com.cloud.diplomaticquarterapp.check_me_pro.ble.format.UserInfo 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.check_me_pro.ble.worker.BleDataWorker
import com.cloud.diplomaticquarterapp.utils.Constant import com.cloud.diplomaticquarterapp.utils.Constant
import com.cloud.diplomaticquarterapp.MainActivity 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 import com.google.gson.Gson
@ -56,6 +62,8 @@ import kotlinx.coroutines.withTimeoutOrNull
import org.apache.commons.io.FileUtils import org.apache.commons.io.FileUtils
import org.json.JSONObject import org.json.JSONObject
import java.io.File import java.io.File
import java.text.SimpleDateFormat
import java.util.Locale
class BleBridge(private var flutterEngine: FlutterEngine, private var mainActivity: MainActivity) { 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() var mUserData: MutableList<UserBean> = java.util.ArrayList()
private val userChannel = Channel<Int>(Channel.CONFLATED) 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) @RequiresApi(Build.VERSION_CODES.M)
private fun scanForCheckMePro(bleScanManager: BleScanManager, scanResultHandler: (String, BluetoothDevice) -> Unit) { private fun scanForCheckMePro(bleScanManager: BleScanManager, scanResultHandler: (String, BluetoothDevice) -> Unit) {
initVar()
bleScanManager.initScan(this.mainActivity) bleScanManager.initScan(this.mainActivity)
bleScanManager.setCallBack(object : BleScanManager.Scan { bleScanManager.setCallBack(object : BleScanManager.Scan {
override fun scanReturn(name: String, bluetoothDevice: BluetoothDevice) { 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") @SuppressLint("MissingPermission")
fun onScanResult(name: String, bluetoothDevice: BluetoothDevice) { fun onScanResult(name: String, bluetoothDevice: BluetoothDevice) {
@ -356,7 +368,8 @@ class BleBridge(private var flutterEngine: FlutterEngine, private var mainActivi
private suspend fun readUserFromCheckMePro() { private suspend fun readUserFromCheckMePro() {
userChannel.receive() userChannel.receive()
val userTemp = File(Constant.getPathX("usr.dat")).readBytes()
val userTemp = File(Constant.getPathX("usr.dat")).readBytes() // CRASHES HERE
userTemp.apply { userTemp.apply {
userInfo = UserInfo(this) userInfo = UserInfo(this)
@ -369,6 +382,7 @@ class BleBridge(private var flutterEngine: FlutterEngine, private var mainActivi
tIndex++ tIndex++
UiChannel.progressChannel.send(tIndex * 100 / total) UiChannel.progressChannel.send(tIndex * 100 / total)
} }
mUserData.add(user)
} }
for (f in commonFileName) { for (f in commonFileName) {
bleWorker.getFile(f) bleWorker.getFile(f)
@ -378,7 +392,105 @@ class BleBridge(private var flutterEngine: FlutterEngine, private var mainActivi
delay(300) delay(300)
UiChannel.progressChannel.close() 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}") Log.d("DeviceFound", "This is the Device i have : ${currentBluetoothDevice.name}")
// stopScanForCheckMePro() // stopScanForCheckMePro()
bleWorker.initWorker(this.mainActivity, currentBluetoothDevice.bluetoothDevice) bleWorker.initWorker(this.mainActivity, currentBluetoothDevice.bluetoothDevice)
dataScope.launch {
uiScope.launch {
val a = withTimeoutOrNull(10000) { val a = withTimeoutOrNull(10000) {
bleWorker.waitConnect() 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 { // a?.let {
// val b = withTimeoutOrNull(10000) { // val b = withTimeoutOrNull(10000) {
// bleWorker.getFile("usr.dat") // bleWorker.getFile("usr.dat")
// } // }
// b?.let {
// userChannel.send(1)
// }
// } // }
} // }
// uiScope.launch { // uiScope.launch {
//// readUserFromCheckMePro() ////
// getCheckMeProDeviceInfo() // getCheckMeProDeviceInfo()
// } // }

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

@ -1,5 +1,6 @@
package com.cloud.diplomaticquarterapp.check_me_pro.bean package com.cloud.diplomaticquarterapp.check_me_pro.bean
import com.google.gson.Gson
import java.util.* import java.util.*
data class UserBean( data class UserBean(
@ -12,3 +13,7 @@ data class UserBean(
var height: Int = 0, var height: Int = 0,
var color: 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) { class OxyInfo constructor(var bytes: ByteArray) {
var size: Int = bytes.size / 12 var size: Int = bytes.size / 12
var Oxy: ArrayList<OxyBean> = arrayListOf<OxyBean>() var Oxy: ArrayList<OxyBean> = arrayListOf()
init { init {
var start: Int var start: Int
for (k in 0 until size) { for (k in 0 until size) {
start = k * 12 start = k * 12
@ -48,17 +46,11 @@ class OxyInfo constructor(var bytes: ByteArray) {
face = toUInt(setRange(start + 11, 1)) face = toUInt(setRange(start + 11, 1))
if (face > 2) face = 2 if (face > 2) face = 2
} }
} }
} }
private fun setRange(start: Int, len: Int): ByteArray { private fun setRange(start: Int, len: Int): ByteArray {
return bytes.copyOfRange(start, start + len) return bytes.copyOfRange(start, start + len)
} }
} }

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

@ -2,9 +2,11 @@ package com.cloud.diplomaticquarterapp.check_me_pro.ble.worker
import android.bluetooth.BluetoothDevice import android.bluetooth.BluetoothDevice
import android.content.Context import android.content.Context
import android.os.Environment
import android.util.Log import android.util.Log
import com.cloud.diplomaticquarterapp.check_me_pro.ble.format.CheckMeResponse 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.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.manager.BleDataManager
import com.cloud.diplomaticquarterapp.check_me_pro.ble.pkg.EndReadPkg import com.cloud.diplomaticquarterapp.check_me_pro.ble.pkg.EndReadPkg
import com.cloud.diplomaticquarterapp.check_me_pro.ble.pkg.GetDeviceInfoPkg 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 result = 0
Log.i("file", "receive $currentFileName") Log.i("file", "receive $currentFileName")
File(Constant.getPathX(currentFileName)).writeBytes(this) File(Constant.getPathX(currentFileName)).writeBytes(this)
} }
val pkg = EndReadPkg() val pkg = EndReadPkg()
Log.i("file", "bytes ${pkg.buf}") Log.i("file", "bytes ${pkg.buf}")
sendCmd(pkg.buf) sendCmd(pkg.buf)
cmdState = 3 cmdState = 3
} else { } else {
val pkg = ReadContentPkg(currentPkg) val pkg = ReadContentPkg(currentPkg)
sendCmd(pkg.buf) sendCmd(pkg.buf)
@ -157,7 +162,6 @@ class BleDataWorker(private val updateEventSink: (Map<String, Any>) -> Unit) {
s += "$k: " s += "$k: "
s += "${json.get(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)) val returnData = mapOf("type" to "infoDataCheckMe", "data" to gson.toJson(json))
updateEventSink(returnData) updateEventSink(returnData)
} }
@ -184,8 +188,6 @@ class BleDataWorker(private val updateEventSink: (Map<String, Any>) -> Unit) {
myBleDataManager?.setNotifyListener(comeData) myBleDataManager?.setNotifyListener(comeData)
bluetoothDevice?.let { bluetoothDevice?.let {
myBleDataManager?.connect(it)?.useAutoConnect(false)?.retry(150, 100)?.done { myBleDataManager?.connect(it)?.useAutoConnect(false)?.retry(150, 100)?.done {
Log.i("BLE", "连接成功了.>>.....>>>>")
getDeviceInfo();
dataScope.launch { dataScope.launch {
connectChannel.send("yes") connectChannel.send("yes")
} }
@ -202,7 +204,7 @@ class BleDataWorker(private val updateEventSink: (Map<String, Any>) -> Unit) {
this.currentFileName = name this.currentFileName = name
cmdState = 1 cmdState = 1
val pkg = StartReadPkg(name) val pkg = StartReadPkg(name)
Log.i("----- Current PKG -----", pkg.toString()); Log.i("----- Current PKG -----", pkg.buf.toString());
sendCmd(pkg.buf) sendCmd(pkg.buf)
return fileChannel.receive() 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/pages/medical/my_trackers/my_trackers_view_model/my_trackers_view_model.dart';
import 'package:diplomaticquarterapp/uitl/utils_new.dart'; import 'package:diplomaticquarterapp/uitl/utils_new.dart';
import 'package:diplomaticquarterapp/widgets/buttons/defaultButton.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:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
@ -31,11 +32,62 @@ class _AndesAllInOneConnectScreenState extends State<AndesAllInOneConnectScreen>
super.dispose(); 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( return Expanded(
child: ListView( child: ListView(
children: [ children: [
if (myTrackersViewModel.checkMeInfo == null) ...[ if (myTrackersViewModel.checkMeProUsersList == null) ...[
Padding( Padding(
padding: const EdgeInsets.all(24.0), padding: const EdgeInsets.all(24.0),
child: Center( child: Center(
@ -46,15 +98,30 @@ class _AndesAllInOneConnectScreenState extends State<AndesAllInOneConnectScreen>
), ),
) )
] else ...[ ] else ...[
Padding( Center(
padding: const EdgeInsets.all(24.0), child: Column(
child: Center( children: [
child: Text( GridView.builder(
"${myTrackersViewModel.checkMeInfo.toString()}", shrinkWrap: true,
style: TextStyle(fontSize: 9.0), 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, crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
buildWeightScaleUI(myTrackersViewModel), buildAllInOneUI(myTrackersViewModel),
if (myTrackersViewModel.isAndesfitDeviceConnected != null && myTrackersViewModel.isAndesfitDeviceConnected) ...[ if (myTrackersViewModel.checkMeProUsersList != null) ...[
Row( Row(
children: [ children: [
Expanded( Expanded(

@ -16,6 +16,7 @@ import 'package:diplomaticquarterapp/widgets/others/app_scaffold_widget.dart';
import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart'; import 'package:diplomaticquarterapp/widgets/transitions/fade_page.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_blue_plus/flutter_blue_plus.dart'; import 'package:flutter_blue_plus/flutter_blue_plus.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:provider/provider.dart'; import 'package:provider/provider.dart';
class BleDevicesScreen extends StatefulWidget { class BleDevicesScreen extends StatefulWidget {
@ -118,7 +119,22 @@ class _BleDevicesScreenState extends State<BleDevicesScreen> {
if (myTrackersVm.isDeviceFromAndesFit(device.name)) { if (myTrackersVm.isDeviceFromAndesFit(device.name)) {
return; 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; break;
} }
} }

@ -324,7 +324,6 @@ class _BloodPressureConnectScreenState extends State<BloodPressureConnectScreen>
if (myTrackersVm.isECGSelected) ...[ if (myTrackersVm.isECGSelected) ...[
IconButton( IconButton(
onPressed: () async { onPressed: () async {
myTrackersVm.updateFilesLoader(true); myTrackersVm.updateFilesLoader(true);
showHistoryDialog(context); showHistoryDialog(context);
await myTrackersVm.getEcgFilesList(widget.deviceModel); 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/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/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/data_display/medical/medical_profile_item.dart';
@ -10,7 +9,6 @@ import 'package:provider/provider.dart';
class SelectTrackerType extends StatelessWidget { class SelectTrackerType extends StatelessWidget {
const SelectTrackerType(); const SelectTrackerType();
List<Widget> myTrackersTypeList({BuildContext context}) { List<Widget> myTrackersTypeList({BuildContext context}) {
List<Widget> medical = []; List<Widget> medical = [];
medical.add(InkWell( medical.add(InkWell(
@ -25,90 +23,104 @@ class SelectTrackerType extends StatelessWidget {
isEnable: true, isEnable: true,
), ),
)); ));
medical.add(InkWell( medical.add(
onTap: () { InkWell(
context.read<MyTrackersViewModel>().updateSelectedTrackerType(TrackerTypeEnum.BloodPressureTracker); onTap: () {
Navigator.of(context).push(FadePage(page: BleDevicesScreen())); context.read<MyTrackersViewModel>().updateSelectedTrackerType(TrackerTypeEnum.BloodPressureTracker);
}, Navigator.of(context).push(FadePage(page: BleDevicesScreen()));
child: MedicalProfileItem( },
title: "Blood Pressure", child: MedicalProfileItem(
imagePath: 'tracker.svg', title: "Blood Pressure",
subTitle: "Tracker", imagePath: 'tracker.svg',
isEnable: true, subTitle: "Tracker",
isEnable: true,
),
), ),
)); );
medical.add(InkWell( medical.add(
onTap: () { InkWell(
context.read<MyTrackersViewModel>().updateSelectedTrackerType(TrackerTypeEnum.BloodSugarTracker); onTap: () {
Navigator.of(context).push(FadePage(page: BleDevicesScreen())); context.read<MyTrackersViewModel>().updateSelectedTrackerType(TrackerTypeEnum.BloodSugarTracker);
}, Navigator.of(context).push(FadePage(page: BleDevicesScreen()));
child: MedicalProfileItem( },
title: "Blood Sugar", child: MedicalProfileItem(
imagePath: 'tracker.svg', title: "Blood Sugar",
subTitle: "Tracker", imagePath: 'tracker.svg',
isEnable: true, subTitle: "Tracker",
isEnable: true,
),
), ),
)); );
medical.add(InkWell( medical.add(
onTap: () { InkWell(
context.read<MyTrackersViewModel>().updateSelectedTrackerType(TrackerTypeEnum.ECGTracker); onTap: () {
Navigator.of(context).push(FadePage(page: BleDevicesScreen())); context.read<MyTrackersViewModel>().updateSelectedTrackerType(TrackerTypeEnum.ECGTracker);
}, Navigator.of(context).push(FadePage(page: BleDevicesScreen()));
child: MedicalProfileItem( },
title: "ECG", child: MedicalProfileItem(
imagePath: 'tracker.svg', title: "ECG",
subTitle: "Tracker", imagePath: 'tracker.svg',
isEnable: true, subTitle: "Tracker",
isEnable: true,
),
), ),
)); );
medical.add(InkWell( medical.add(
onTap: () { InkWell(
context.read<MyTrackersViewModel>().updateSelectedTrackerType(TrackerTypeEnum.WeightScale); onTap: () {
Navigator.of(context).push(FadePage(page: BleDevicesScreen())); context.read<MyTrackersViewModel>().updateSelectedTrackerType(TrackerTypeEnum.WeightScale);
}, Navigator.of(context).push(FadePage(page: BleDevicesScreen()));
child: MedicalProfileItem( },
title: "Weight", child: MedicalProfileItem(
imagePath: 'tracker.svg', title: "Weight",
subTitle: "Scale", imagePath: 'tracker.svg',
isEnable: true, subTitle: "Scale",
isEnable: true,
),
), ),
)); );
medical.add(InkWell( medical.add(
onTap: () { InkWell(
context.read<MyTrackersViewModel>().updateSelectedTrackerType(TrackerTypeEnum.Temperature); onTap: () {
Navigator.of(context).push(FadePage(page: BleDevicesScreen())); context.read<MyTrackersViewModel>().updateSelectedTrackerType(TrackerTypeEnum.Temperature);
}, Navigator.of(context).push(FadePage(page: BleDevicesScreen()));
child: MedicalProfileItem( },
title: "Temperature", child: MedicalProfileItem(
imagePath: 'tracker.svg', title: "Temperature",
subTitle: "Scale", imagePath: 'tracker.svg',
isEnable: true, subTitle: "Scale",
isEnable: true,
),
), ),
)); );
medical.add(InkWell( medical.add(
onTap: () { InkWell(
context.read<MyTrackersViewModel>().updateSelectedTrackerType(TrackerTypeEnum.Spirometer); onTap: () {
Navigator.of(context).push(FadePage(page: BleDevicesScreen())); context.read<MyTrackersViewModel>().updateSelectedTrackerType(TrackerTypeEnum.Spirometer);
}, Navigator.of(context).push(FadePage(page: BleDevicesScreen()));
child: MedicalProfileItem( },
title: "Spirometer", child: MedicalProfileItem(
imagePath: 'tracker.svg', title: "Spirometer",
subTitle: "Tracker", imagePath: 'tracker.svg',
isEnable: true, subTitle: "Tracker",
isEnable: true,
),
), ),
)); );
medical.add(InkWell( medical.add(
onTap: () { InkWell(
context.read<MyTrackersViewModel>().updateSelectedTrackerType(TrackerTypeEnum.AllInOneTracker); onTap: () {
Navigator.of(context).push(FadePage(page: BleDevicesScreen())); context.read<MyTrackersViewModel>().updateSelectedTrackerType(TrackerTypeEnum.AllInOneTracker);
}, Navigator.of(context).push(FadePage(page: BleDevicesScreen()));
child: MedicalProfileItem( },
title: "All in one Monitor", child: MedicalProfileItem(
imagePath: 'tracker.svg', title: "All in one Monitor",
subTitle: "Tracker", imagePath: 'tracker.svg',
isEnable: true, subTitle: "Tracker",
isEnable: true,
),
), ),
)); );
return medical; 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:async';
import 'dart:convert'; import 'dart:convert';
import 'dart:developer'; 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/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/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/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/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/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_file_detail_model.dart';
import 'package:diplomaticquarterapp/pages/medical/my_trackers/ble_models/viatom_devices/ecg_rt_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/ble_utils.dart';
import 'package:diplomaticquarterapp/uitl/date_uitl.dart'; import 'package:diplomaticquarterapp/uitl/date_uitl.dart';
import 'package:diplomaticquarterapp/uitl/utils_new.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:diplomaticquarterapp/widgets/transitions/fade_page.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter/cupertino.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:permission_handler/permission_handler.dart';
import 'package:diplomaticquarterapp/pages/medical/my_trackers/ble_helpers/ble_connect_helper.dart'; import 'package:diplomaticquarterapp/pages/medical/my_trackers/ble_helpers/ble_connect_helper.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
enum TrackerTypeEnum { OxymeterTracker, BloodPressureTracker, BloodSugarTracker, ECGTracker, WeightScale, Temperature, Spirometer, AllInOneTracker } enum TrackerTypeEnum { OxymeterTracker, BloodPressureTracker, BloodSugarTracker, ECGTracker, WeightScale, Temperature, Spirometer, AllInOneTracker }
@ -31,7 +35,7 @@ String kRealTimeDataBPResult = "RealTimeDataBPResult";
String kOxyRtParam = "OxyRtParam"; String kOxyRtParam = "OxyRtParam";
String kDevicesList = "DevicesList"; String kDevicesList = "DevicesList";
String kDevicesListCheckMe = "DevicesListCheckMe"; 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 kRealTimeDataECGMeasuring = "RealTimeDataECGMeasuring"; // This is for the device that measures BP and ECG also Like BP2 0567
String kRealTimeDataECGResult = "RealTimeDataECGResult"; String kRealTimeDataECGResult = "RealTimeDataECGResult";
String kRealTimeDataECG = "RealTimeDataECG"; String kRealTimeDataECG = "RealTimeDataECG";
@ -103,6 +107,13 @@ class MyTrackersViewModel extends ChangeNotifier {
}; };
List<String> ecgEnabledDevices = ["BP2 0567", "DuoEK", "ER1", "PM101897"]; List<String> ecgEnabledDevices = ["BP2 0567", "DuoEK", "ER1", "PM101897"];
List<TrackerTypeEnum> checkMeProTrackers = [
TrackerTypeEnum.Temperature,
TrackerTypeEnum.BloodPressureTracker,
TrackerTypeEnum.OxymeterTracker,
TrackerTypeEnum.BloodSugarTracker,
TrackerTypeEnum.ECGTracker,
];
List<String> andesFitDevices = [ List<String> andesFitDevices = [
"BPM", "BPM",
"PM101897", "PM101897",
@ -211,13 +222,102 @@ class MyTrackersViewModel extends ChangeNotifier {
notifyListeners(); 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(); 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) { Widget getFilesListWidget(List<ECGFileDetailModel> filesList, BuildContext context) {
return Material( return Material(
child: SizedBox( child: SizedBox(
@ -323,8 +423,8 @@ class MyTrackersViewModel extends ChangeNotifier {
parsesDevicesList(list); parsesDevicesList(list);
} }
if (event['type'] == kInfoDataCheckMe) { if (event['type'] == kCheckMeUsersList) {
updateCheckMeInfoModel(event['data'].toString()); updateCheckMeUserInfoModel(event['data']);
} }
}); });
@ -651,8 +751,6 @@ class MyTrackersViewModel extends ChangeNotifier {
String resultSet1 = ""; String resultSet1 = "";
String resultSet2 = ""; String resultSet2 = "";
String resultSetCheckMeProUsers = "";
Future<void> connectAndesfitWeightDevice(BluetoothDevice device) async { Future<void> connectAndesfitWeightDevice(BluetoothDevice device) async {
log("deviceToConnect: ${device.toString()}"); log("deviceToConnect: ${device.toString()}");
@ -1093,16 +1191,10 @@ class MyTrackersViewModel extends ChangeNotifier {
bool isDeviceSelected = false; 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 { Future<void> connectAndesfitAllInOneDevice(BluetoothDevice device) async {
log("deviceToConnect: ${device.toString()}"); log("deviceToConnect: ${device.toString()}");
} }
//// --> CHECK ME PRO
} }

Loading…
Cancel
Save