From 1fd978e0c224fa05f2d43ec8ca249e5f07c13688 Mon Sep 17 00:00:00 2001 From: haroon amjad Date: Thu, 14 Dec 2023 14:34:11 +0300 Subject: [PATCH] ECG Files concurrent reading from device --- .../diplomaticquarterapp/ble/BleBridge.kt | 64 ++++++---- .../viatom_devices/ekg_tracker_ble.dart | 110 +++++------------- 2 files changed, 75 insertions(+), 99 deletions(-) diff --git a/android/app/src/main/kotlin/com/cloud/diplomaticquarterapp/ble/BleBridge.kt b/android/app/src/main/kotlin/com/cloud/diplomaticquarterapp/ble/BleBridge.kt index fdceabd8..0e2e32e8 100644 --- a/android/app/src/main/kotlin/com/cloud/diplomaticquarterapp/ble/BleBridge.kt +++ b/android/app/src/main/kotlin/com/cloud/diplomaticquarterapp/ble/BleBridge.kt @@ -50,6 +50,11 @@ class BleBridge( private lateinit var Echannel: EventChannel private var eventSink: EventChannel.EventSink? = null + private var ecgFileNames = arrayListOf() + var ecgList: ArrayList = arrayListOf() + + val gson = Gson() + companion object { private const val CHANNEL = "BLE-Platform-Bridge" private const val EVENTCHANNEL = "BLE-Platform-Bridge-Event" @@ -188,7 +193,6 @@ class BleBridge( } fun scanDevice(methodCall: MethodCall, result: MethodChannel.Result) { - println("This is Test of Scanning") LiveEventBus.get(EventMsgConst.Ble.EventServiceConnectedAndInterfaceInit) .observe(this.mainActivity) { @@ -232,7 +236,6 @@ class BleBridge( } if (deviceName.contains("DuoEK", ignoreCase = true)) { - val gson = Gson() LiveEventBus.get(InterfaceEvent.ER2.EventEr2Info) .observe(this.mainActivity) { val data = it.data as DeviceInfo @@ -242,12 +245,14 @@ class BleBridge( } LiveEventBus.get(InterfaceEvent.ER2.EventEr2FileList) .observe(this.mainActivity) { - val fileNames = it.data as ArrayList - println("DuoEK FileNames List: $fileNames") - val returnData = - mapOf("type" to "fileList", "data" to fileNames) -// eventSink?.success(fileNames.toString()) - eventSink?.success(returnData) + BleServiceHelper.BleServiceHelper.stopRtTask(model) + ecgFileNames = it.data as ArrayList + readFile() +// val fileNames = it.data as ArrayList +// println("DuoEK FileNames List: ${fileNames}") +// val returnData = +// mapOf("type" to "fileList", "data" to fileNames) +// eventSink?.success(returnData) } LiveEventBus.get(InterfaceEvent.ER2.EventEr2SetTime) @@ -255,23 +260,30 @@ class BleBridge( println("EventEr2SetTime") // Get Device Info BleServiceHelper.BleServiceHelper.er2GetInfo(model) - ecgRTTask.run() +// ecgRTTask.run() } LiveEventBus.get(InterfaceEvent.ER2.EventEr2ReadFileComplete) .observe(this.mainActivity) { println("EventEr2ReadFileComplete") val data = it.data as Er2File - val file = Er2EcgFile(data.content) - val ecgShorts = Er1Decompress.unCompressAlgECG(file.waveData) - val ecgData = EcgData() - val startTime = DateUtil.getSecondTimestamp(data.fileName.replace("R", "")) - ecgData.fileName = data.fileName - ecgData.duration = file.recordingTime - ecgData.shortData = ecgShorts - ecgData.startTime = startTime - val returnData = - mapOf("type" to "fileDetail", "data" to gson.toJson(ecgData)) - eventSink?.success(returnData) + if (data.fileName.contains("R")) { + val file = Er2EcgFile(data.content) + val ecgShorts = Er1Decompress.unCompressAlgECG(file.waveData) + val ecgData = EcgData() + val startTime = DateUtil.getSecondTimestamp(data.fileName.replace("R", "")) + ecgData.fileName = data.fileName + ecgData.duration = file.recordingTime + ecgData.shortData = ecgShorts + ecgData.startTime = startTime + ecgList.add(ecgData) + print(ecgList) +// val returnData = +// mapOf("type" to "fileDetail", "data" to gson.toJson(ecgList)) +// eventSink?.success(returnData) + + } + ecgFileNames.removeAt(0) + readFile() } LiveEventBus.get(InterfaceEvent.ER2.EventEr2RtData) @@ -328,6 +340,15 @@ class BleBridge( } } + private fun readFile() { + if (ecgFileNames.size == 0) { + val returnData = + mapOf("type" to "fileDetail", "data" to gson.toJson(ecgList)) + eventSink?.success(returnData) + } else { + BleServiceHelper.BleServiceHelper.er2ReadFile(model, ecgFileNames[0]) + } + } private fun getEKGFilesList() { //Get EKG File List @@ -335,7 +356,8 @@ class BleBridge( } private fun getEKGFileDetail(fileName: String) { - BleServiceHelper.BleServiceHelper.er2ReadFile(model, fileName) +// readFile() +// BleServiceHelper.BleServiceHelper.er2ReadFile(model, fileName) } } \ No newline at end of file diff --git a/lib/pages/medical/my_trackers/viatom_devices/ekg_tracker_ble.dart b/lib/pages/medical/my_trackers/viatom_devices/ekg_tracker_ble.dart index 29526c39..3136d4c5 100644 --- a/lib/pages/medical/my_trackers/viatom_devices/ekg_tracker_ble.dart +++ b/lib/pages/medical/my_trackers/viatom_devices/ekg_tracker_ble.dart @@ -31,7 +31,8 @@ class _EKG_BLEState extends State { List ekgFilesList = []; - EKGFileDetailResponseModel ekgFileDetailResponseModel; + List ekgFileDetailResponseModelList = []; + EKGRealTimeDataResponseModel ekgRealTimeDataResponseModel; List ecgBytesAllDataList = []; @@ -86,7 +87,6 @@ class _EKG_BLEState extends State { plotAreaBorderWidth: 0, primaryXAxis: NumericAxis(majorGridLines: const MajorGridLines(width: 0)), primaryYAxis: NumericAxis(axisLine: const AxisLine(width: 0), majorTickLines: const MajorTickLines(size: 0)), - series: >[ LineSeries<_ChartData, int>( onRendererCreated: (ChartSeriesController controller) { @@ -181,75 +181,24 @@ class _EKG_BLEState extends State { ], ), mHeight(20.0), - _buildLiveLineChart() - // ValueListenableBuilder( - // valueListenable: ekgValueNotifier, - // builder: (context, value, _) { - // return Column( - // crossAxisAlignment: CrossAxisAlignment.start, - // children: [ - // Text( - // value, - // style: TextStyle(fontSize: 9.0), - // ), - // mHeight(24.0), - // getFilesListWidget(), - // mHeight(20.0), - // // SizedBox( - // // height: 150.0, - // // width: MediaQuery.of(context).size.width, - // // child: (ekgRealTimeDataResponseModel != null && ekgRealTimeDataResponseModel.wave != null) - // // ? LineChart( - // // LineChartData( - // // lineTouchData: LineTouchData(handleBuiltInTouches: false), - // // gridData: FlGridData( - // // show: true, - // // verticalInterval: 30, - // // horizontalInterval: 30, - // // getDrawingVerticalLine: (value) { - // // return FlLine( - // // color: Colors.red[300], - // // strokeWidth: 0.4, - // // ); - // // }, - // // getDrawingHorizontalLine: (value) { - // // return FlLine( - // // color: Colors.red[300], - // // strokeWidth: 0.4, - // // ); - // // }, - // // ), - // // titlesData: FlTitlesData(show: true), - // // borderData: FlBorderData( - // // show: false, - // // border: Border.all(color: const Color(0xff37434d), width: 1), - // // ), - // // minX: 0, - // // // maxX: (ekgRealTimeDataResponseModel.wave.ecgBytes.length.toDouble() - 1), - // // maxX: ecgBytesAllDataList.length.toDouble(), - // // minY: ekgRealTimeDataResponseModel.wave.ecgBytes.reduce((value, element) => value < element ? value : element).toDouble(), - // // maxY: ekgRealTimeDataResponseModel.wave.ecgBytes.reduce((value, element) => value > element ? value : element).toDouble(), - // // lineBarsData: [ - // // LineChartBarData( - // // isCurved: false, - // // preventCurveOverShooting: true, - // // barWidth: 0.5, - // // dotData: FlDotData(show: false), - // // // spots: getDataList(ekgRealTimeDataResponseModel.wave.ecgBytes), - // // spots: getDataList(ekgRealTimeDataResponseModel.wave.ecgBytes), - // // colors: [Colors.grey[800]], - // // isStrokeCapRound: true, - // // belowBarData: BarAreaData(show: false), - // // ), - // // ], - // // ), - // // ) - // // : Container(), - // // ), - // ], - // ); - // }, - // ), + // _buildLiveLineChart() + ValueListenableBuilder( + valueListenable: ekgValueNotifier, + builder: (context, value, _) { + return Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + Text( + value, + style: TextStyle(fontSize: 9.0), + ), + mHeight(24.0), + getFilesListWidget(), + mHeight(20.0), + ], + ); + }, + ), ], ), ), @@ -287,23 +236,28 @@ class _EKG_BLEState extends State { itemBuilder: (context, index) { return InkWell( onTap: () { - getEKGFileDetails(ekgFilesList[index]); + showEKGFileDetails(ekgFileDetailResponseModelList[index]); }, - child: Text(ekgFilesList[index])); + child: Text(ekgFileDetailResponseModelList[index].fileName)); }, itemCount: ekgFilesList.length, separatorBuilder: (context, index) => SizedBox(height: 14), ); } - void getEKGFileDetails(String fileName) async { - print("received file name: $fileName"); - await BleChannel.getEKGFileDetails(fileName); + void showEKGFileDetails(EKGFileDetailResponseModel ekgFileDetailResponseModel) async { + print("received file name: ${ekgFileDetailResponseModel.fileName}"); + Navigator.push(context, FadePage(page: EKGChartView(ekgFileDetailResponseModel: ekgFileDetailResponseModel))); + // await BleChannel.getEKGFileDetails(fileName); } void parseEKGFileDetailObject(dynamic returnData) { - ekgFileDetailResponseModel = EKGFileDetailResponseModel.fromJson(json.decode(returnData)); - Navigator.push(context, FadePage(page: EKGChartView(ekgFileDetailResponseModel: ekgFileDetailResponseModel))); + returnData.forEach((v) { + ekgFileDetailResponseModelList.add(new EKGFileDetailResponseModel.fromJson(v)); + }); + print(ekgFileDetailResponseModelList.length); + // ekgFileDetailResponseModel = EKGFileDetailResponseModel.fromJson(json.decode(returnData)); + // Navigator.push(context, FadePage(page: EKGChartView(ekgFileDetailResponseModel: ekgFileDetailResponseModel))); } String parseEKGRealTimeDataObject(dynamic returnData) {