ECG Files concurrent reading from device

dev_3.3_BLE
haroon amjad 2 years ago
parent 68b83e5f98
commit 1fd978e0c2

@ -50,6 +50,11 @@ class BleBridge(
private lateinit var Echannel: EventChannel private lateinit var Echannel: EventChannel
private var eventSink: EventChannel.EventSink? = null private var eventSink: EventChannel.EventSink? = null
private var ecgFileNames = arrayListOf<String>()
var ecgList: ArrayList<EcgData> = arrayListOf()
val gson = Gson()
companion object { companion object {
private const val CHANNEL = "BLE-Platform-Bridge" private const val CHANNEL = "BLE-Platform-Bridge"
private const val EVENTCHANNEL = "BLE-Platform-Bridge-Event" private const val EVENTCHANNEL = "BLE-Platform-Bridge-Event"
@ -188,7 +193,6 @@ class BleBridge(
} }
fun scanDevice(methodCall: MethodCall, result: MethodChannel.Result) { fun scanDevice(methodCall: MethodCall, result: MethodChannel.Result) {
println("This is Test of Scanning") println("This is Test of Scanning")
LiveEventBus.get<Boolean>(EventMsgConst.Ble.EventServiceConnectedAndInterfaceInit) LiveEventBus.get<Boolean>(EventMsgConst.Ble.EventServiceConnectedAndInterfaceInit)
.observe(this.mainActivity) { .observe(this.mainActivity) {
@ -232,7 +236,6 @@ class BleBridge(
} }
if (deviceName.contains("DuoEK", ignoreCase = true)) { if (deviceName.contains("DuoEK", ignoreCase = true)) {
val gson = Gson()
LiveEventBus.get<InterfaceEvent>(InterfaceEvent.ER2.EventEr2Info) LiveEventBus.get<InterfaceEvent>(InterfaceEvent.ER2.EventEr2Info)
.observe(this.mainActivity) { .observe(this.mainActivity) {
val data = it.data as DeviceInfo val data = it.data as DeviceInfo
@ -242,12 +245,14 @@ class BleBridge(
} }
LiveEventBus.get<InterfaceEvent>(InterfaceEvent.ER2.EventEr2FileList) LiveEventBus.get<InterfaceEvent>(InterfaceEvent.ER2.EventEr2FileList)
.observe(this.mainActivity) { .observe(this.mainActivity) {
val fileNames = it.data as ArrayList<String> BleServiceHelper.BleServiceHelper.stopRtTask(model)
println("DuoEK FileNames List: $fileNames") ecgFileNames = it.data as ArrayList<String>
val returnData = readFile()
mapOf("type" to "fileList", "data" to fileNames) // val fileNames = it.data as ArrayList<String>
// eventSink?.success(fileNames.toString()) // println("DuoEK FileNames List: ${fileNames}")
eventSink?.success(returnData) // val returnData =
// mapOf("type" to "fileList", "data" to fileNames)
// eventSink?.success(returnData)
} }
LiveEventBus.get<InterfaceEvent>(InterfaceEvent.ER2.EventEr2SetTime) LiveEventBus.get<InterfaceEvent>(InterfaceEvent.ER2.EventEr2SetTime)
@ -255,23 +260,30 @@ class BleBridge(
println("EventEr2SetTime") println("EventEr2SetTime")
// Get Device Info // Get Device Info
BleServiceHelper.BleServiceHelper.er2GetInfo(model) BleServiceHelper.BleServiceHelper.er2GetInfo(model)
ecgRTTask.run() // ecgRTTask.run()
} }
LiveEventBus.get<InterfaceEvent>(InterfaceEvent.ER2.EventEr2ReadFileComplete) LiveEventBus.get<InterfaceEvent>(InterfaceEvent.ER2.EventEr2ReadFileComplete)
.observe(this.mainActivity) { .observe(this.mainActivity) {
println("EventEr2ReadFileComplete") println("EventEr2ReadFileComplete")
val data = it.data as Er2File val data = it.data as Er2File
val file = Er2EcgFile(data.content) if (data.fileName.contains("R")) {
val ecgShorts = Er1Decompress.unCompressAlgECG(file.waveData) val file = Er2EcgFile(data.content)
val ecgData = EcgData() val ecgShorts = Er1Decompress.unCompressAlgECG(file.waveData)
val startTime = DateUtil.getSecondTimestamp(data.fileName.replace("R", "")) val ecgData = EcgData()
ecgData.fileName = data.fileName val startTime = DateUtil.getSecondTimestamp(data.fileName.replace("R", ""))
ecgData.duration = file.recordingTime ecgData.fileName = data.fileName
ecgData.shortData = ecgShorts ecgData.duration = file.recordingTime
ecgData.startTime = startTime ecgData.shortData = ecgShorts
val returnData = ecgData.startTime = startTime
mapOf("type" to "fileDetail", "data" to gson.toJson(ecgData)) ecgList.add(ecgData)
eventSink?.success(returnData) print(ecgList)
// val returnData =
// mapOf("type" to "fileDetail", "data" to gson.toJson(ecgList))
// eventSink?.success(returnData)
}
ecgFileNames.removeAt(0)
readFile()
} }
LiveEventBus.get<InterfaceEvent>(InterfaceEvent.ER2.EventEr2RtData) LiveEventBus.get<InterfaceEvent>(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() { private fun getEKGFilesList() {
//Get EKG File List //Get EKG File List
@ -335,7 +356,8 @@ class BleBridge(
} }
private fun getEKGFileDetail(fileName: String) { private fun getEKGFileDetail(fileName: String) {
BleServiceHelper.BleServiceHelper.er2ReadFile(model, fileName) // readFile()
// BleServiceHelper.BleServiceHelper.er2ReadFile(model, fileName)
} }
} }

@ -31,7 +31,8 @@ class _EKG_BLEState extends State<EKG_BLE> {
List<String> ekgFilesList = []; List<String> ekgFilesList = [];
EKGFileDetailResponseModel ekgFileDetailResponseModel; List<EKGFileDetailResponseModel> ekgFileDetailResponseModelList = [];
EKGRealTimeDataResponseModel ekgRealTimeDataResponseModel; EKGRealTimeDataResponseModel ekgRealTimeDataResponseModel;
List<int> ecgBytesAllDataList = []; List<int> ecgBytesAllDataList = [];
@ -86,7 +87,6 @@ class _EKG_BLEState extends State<EKG_BLE> {
plotAreaBorderWidth: 0, plotAreaBorderWidth: 0,
primaryXAxis: NumericAxis(majorGridLines: const MajorGridLines(width: 0)), primaryXAxis: NumericAxis(majorGridLines: const MajorGridLines(width: 0)),
primaryYAxis: NumericAxis(axisLine: const AxisLine(width: 0), majorTickLines: const MajorTickLines(size: 0)), primaryYAxis: NumericAxis(axisLine: const AxisLine(width: 0), majorTickLines: const MajorTickLines(size: 0)),
series: <LineSeries<_ChartData, int>>[ series: <LineSeries<_ChartData, int>>[
LineSeries<_ChartData, int>( LineSeries<_ChartData, int>(
onRendererCreated: (ChartSeriesController controller) { onRendererCreated: (ChartSeriesController controller) {
@ -181,75 +181,24 @@ class _EKG_BLEState extends State<EKG_BLE> {
], ],
), ),
mHeight(20.0), mHeight(20.0),
_buildLiveLineChart() // _buildLiveLineChart()
// ValueListenableBuilder( ValueListenableBuilder(
// valueListenable: ekgValueNotifier, valueListenable: ekgValueNotifier,
// builder: (context, value, _) { builder: (context, value, _) {
// return Column( return Column(
// crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
// children: [ children: [
// Text( Text(
// value, value,
// style: TextStyle(fontSize: 9.0), style: TextStyle(fontSize: 9.0),
// ), ),
// mHeight(24.0), mHeight(24.0),
// getFilesListWidget(), getFilesListWidget(),
// mHeight(20.0), 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(),
// // ),
// ],
// );
// },
// ),
], ],
), ),
), ),
@ -287,23 +236,28 @@ class _EKG_BLEState extends State<EKG_BLE> {
itemBuilder: (context, index) { itemBuilder: (context, index) {
return InkWell( return InkWell(
onTap: () { onTap: () {
getEKGFileDetails(ekgFilesList[index]); showEKGFileDetails(ekgFileDetailResponseModelList[index]);
}, },
child: Text(ekgFilesList[index])); child: Text(ekgFileDetailResponseModelList[index].fileName));
}, },
itemCount: ekgFilesList.length, itemCount: ekgFilesList.length,
separatorBuilder: (context, index) => SizedBox(height: 14), separatorBuilder: (context, index) => SizedBox(height: 14),
); );
} }
void getEKGFileDetails(String fileName) async { void showEKGFileDetails(EKGFileDetailResponseModel ekgFileDetailResponseModel) async {
print("received file name: $fileName"); print("received file name: ${ekgFileDetailResponseModel.fileName}");
await BleChannel.getEKGFileDetails(fileName); Navigator.push(context, FadePage(page: EKGChartView(ekgFileDetailResponseModel: ekgFileDetailResponseModel)));
// await BleChannel.getEKGFileDetails(fileName);
} }
void parseEKGFileDetailObject(dynamic returnData) { void parseEKGFileDetailObject(dynamic returnData) {
ekgFileDetailResponseModel = EKGFileDetailResponseModel.fromJson(json.decode(returnData)); returnData.forEach((v) {
Navigator.push(context, FadePage(page: EKGChartView(ekgFileDetailResponseModel: ekgFileDetailResponseModel))); 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) { String parseEKGRealTimeDataObject(dynamic returnData) {

Loading…
Cancel
Save