From d6d9a09d505d11148599a95a5be3e1351edbe0ac Mon Sep 17 00:00:00 2001 From: hc Date: Mon, 13 Apr 2026 15:17:52 +0800 Subject: Local iHealth SDK, device detail screen, iOS event fixes --- .../ios/ReactNativeIOSLibrary/ECGUSBModule.m | 258 +++++++++++++++++++++ 1 file changed, 258 insertions(+) create mode 100644 libs/ihealth-sdk/ios/ReactNativeIOSLibrary/ECGUSBModule.m (limited to 'libs/ihealth-sdk/ios/ReactNativeIOSLibrary/ECGUSBModule.m') diff --git a/libs/ihealth-sdk/ios/ReactNativeIOSLibrary/ECGUSBModule.m b/libs/ihealth-sdk/ios/ReactNativeIOSLibrary/ECGUSBModule.m new file mode 100644 index 0000000..10db55d --- /dev/null +++ b/libs/ihealth-sdk/ios/ReactNativeIOSLibrary/ECGUSBModule.m @@ -0,0 +1,258 @@ +// +// ECGUSBModule.m +// ReactNativeIOSLibrary +// +// Created by daiqingquan on 2018/1/5. +// Copyright © 2018年 daiqingquan. All rights reserved. +// + +#import "ECGUSBModule.h" +#import "ECGHeader.h" +#import "ECGProfileModule.h" + +#define EVENT_NOTIFY @"event_notify_ecgusb" + +@implementation ECGUSBModule + + + +RCT_EXPORT_MODULE() +- (NSArray *)supportedEvents { + return @[@"event_notify", @"event_scan_device", @"event_scan_finish", + @"event_device_connected", @"event_device_connect_failed", + @"event_device_disconnect", @"event_authenticate_result", + @"event_notify_ts28b", @"event_notify_bg1", + @"action_connect_result_for_bg1"]; +} + + + +#pragma mark +#pragma mark - constantsToExport +- (NSDictionary *)constantsToExport +{ + return @{@"Event_Notify": EVENT_NOTIFY }; + +} ++ (BOOL)requiresMainQueueSetup +{ + return YES; +} +#pragma mark +#pragma mark - Method + +RCT_EXPORT_METHOD(getAllConnectedDevices){ + + ECG3USB *ecg=[[ECG3USBController shareECG3USBController] getCurrentECG3USBInstace]; + + if (ecg!=nil) { + + NSDictionary* deviceInfo = @{kACTION:kACTION_GET_ALL_CONNECTED_DEVICES,kDEVICES:ecg.serialNumber}; + [self sendEventWithName:EVENT_NOTIFY body:deviceInfo]; + } + + +} +RCT_EXPORT_METHOD(getIdps){ + + + NSMutableDictionary*deviceInfo=[NSMutableDictionary dictionary]; + + [deviceInfo setValue:@(404) forKey:kERROR_NUM_ECGUSB]; + + [deviceInfo setValue:@"This method iOS is not supported" forKey:kERROR_DESCRIPTION_ECGUSB]; + + [self sendEventWithName:EVENT_NOTIFY body:deviceInfo]; +} +/** + Sync Data + + @param startBlock means start + @param progressBlock 0-100 + @param resultBlock You can get filtered data from the NSDocumentDirectory path. + Abnormal Point Marked by User: OBData_FileName.txt + Filtered ECG Data: ECGAnalyseResult_FileName.txt + Lead Off Begin Point: ECGLeadOffBegin_FileName.txt + Lead Off End Point: ECGLeadOffEnd_FileName.txt + ECG HR Information EveryHour: ECGHREveryHour_FileName.txt + Abnormal Point Filtered by Algorithm: ECGOBbyFilter_FileName.txt + ECG HR Information for Day: ECGDetail_FileName.txt + @param errorBlock error + */ + +RCT_EXPORT_METHOD(syncData){ + + ECG3USB *device = [[ECG3USBController shareECG3USBController] getCurrentECG3USBInstace]; + if (device) { + __weak typeof(self) weakSelf = self; + [device syncDataWithStartBlock:^{ + + NSDictionary* deviceInfo = @{kACTION:kACTION_STARTSYNCDATA_ECGUSB,kMAC:device.serialNumber,kType:@"ECG3USB"}; + [weakSelf sendEventWithName:EVENT_NOTIFY body:deviceInfo]; + + } progressBlock:^(NSUInteger progress) { + + NSDictionary* deviceInfo = @{kACTION:kACTION_SYNCDATAPROGRESS_ECGUSB,kPROGRESS:@(progress),kMAC:device.serialNumber,kType:@"ECG3USB"}; + [weakSelf sendEventWithName:EVENT_NOTIFY body:deviceInfo]; + + } resultBlock:^(NSArray *resultArray, BOOL finish) { + + NSDictionary* deviceInfo = @{kACTION:kACTION_SYNCDATAINFO_ECGUSB,kDATAINFO:resultArray,kMAC:device.serialNumber,kType:@"ECG3USB"}; + [weakSelf sendEventWithName:EVENT_NOTIFY body:deviceInfo]; + + } errorBlock:^(ECG3USBError errorID) { + + [weakSelf commandReturnECGUSBError:errorID MAC:device.serialNumber]; + }]; + + }else{ + [self commandReturnECGUSBError:ECG3USBError_DeviceDisconnect MAC:@""]; + } +} + +-(void)commandReturnECGUSBError:(ECG3USBError)errorID MAC:(NSString*)mac{ + + + NSMutableDictionary*deviceInfo=[NSMutableDictionary dictionary]; + [deviceInfo setValue:@"ECG3USB" forKey:kType]; + if (mac) { + [deviceInfo setValue:mac forKey:kMAC]; + } + [deviceInfo setValue:@"ACTION_ERROR_ECGUSB" forKey:kACTION]; + + NSString*errorDes=[NSString string]; + + switch (errorID) { + case ECG3USBError_QuerySDCardInfoTimeout: + errorDes=@"Query command timeout"; + break; + case ECG3USBError_SDCardInfoError: + errorDes=@"Received SD card info is wrong"; + break; + case ECG3USBError_SDCardError: + errorDes=@"Receive devce's error log: SD card error"; + break; + case ECG3USBError_iOSDeviceFlashNotEnough: + errorDes=@"There is not enough space for ECG's offline data"; + break; + case ECG3USBError_AFilePackageIndexNotMatch: + errorDes=@"Receive wrong data"; + break; + case ECG3USBError_BFilePackageIndexNotMatch: + errorDes=@"Receive wrong data"; + break; + case ECG3USBError_ReceiveDataTimeout: + errorDes=@"Receive data timeout"; + break; + case ECG3USBError_SaveFileError: + errorDes=@"Save file error"; + break; + case ECG3USBError_DeviceDisconnect: + errorDes=@"Device is disconnected"; + break; + case ECG3USBError_DeviceReplyFormatFail: + errorDes=@"Format fail"; + break; + case ECG3USBError_DeviceFormatTimeout: + errorDes=@"Format command timeout."; + break; + case ECG3USBError_CommandTimeout: + errorDes=@"Command timeout"; + break; + + default: + break; + } + + [deviceInfo setValue:@(errorID) forKey:kERROR_NUM_ECGUSB]; + + [deviceInfo setValue:errorDes forKey:kERROR_DESCRIPTION_ECGUSB]; + + [self sendEventWithName:EVENT_NOTIFY body:deviceInfo]; +} + +/** + Format SD Card + + @param successBlock Success + @param progressBlock 0-100 + @param failBlock Fail + */ + +RCT_EXPORT_METHOD(deleteData){ + + ECG3USB *device = [[ECG3USBController shareECG3USBController] getCurrentECG3USBInstace]; + if (device) { + __weak typeof(self) weakSelf = self; + [device formatSDCard:^{ + NSDictionary* deviceInfo = @{kACTION:kACTION_DELETEDATA_ECGUSB,kType:@"ECG3USB",kMAC:device.serialNumber}; + [weakSelf sendEventWithName:EVENT_NOTIFY body:deviceInfo]; + } progressBlock:^(NSUInteger progress) { + + } errorBlock:^(ECG3USBError error) { + [weakSelf commandReturnECGUSBError:error MAC:device.serialNumber]; + }]; + + }else{ + [self commandReturnECGUSBError:ECG3USBError_DeviceDisconnect MAC:@""]; + } +} + +/** + Splice data + + @param fileNames An Array with FileName value from ECG3USBSyncResultBlock + @param success a block contains a dictionary with two keys: success(@{@"DataFileName":dataFileName,@"MarkFileName":markFileName}); + @param error a block contains error message + */ +RCT_EXPORT_METHOD(spliceData:(nonnull NSArray*)array){ + __weak typeof(self) weakSelf = self; + [ECG3USB spliceWithFileNames:array successBlock:^(NSDictionary *dic) { + NSDictionary* deviceInfo = @{kACTION:kACTION_SPLICE,kSPLICE_DATA:dic,kType:@"ECG3USB",kMAC:@""}; + [weakSelf sendEventWithName:EVENT_NOTIFY body:deviceInfo]; + } errorBlock:^(ECG3USBError error, NSString *message) { + NSDictionary* deviceInfo = @{kACTION:kACTION_SPLICE,kSPLICE_ERROR_DESCRIPTION:message,kType:@"ECG3USB",kMAC:@""}; + [weakSelf sendEventWithName:EVENT_NOTIFY body:deviceInfo]; + }]; +} + +RCT_EXPORT_METHOD(getCache){ + ECG3USB *device = [[ECG3USBController shareECG3USBController] getCurrentECG3USBInstace]; + if (device) { + __weak typeof(self) weakSelf = self; + [device getCacheDataWithBlock:^(NSArray *array) { + NSDictionary* deviceInfo = @{kACTION:kACTION_GET_CACHE,kGET_CACHE_DATA:array,kMAC:device.serialNumber,kType:@"ECG3USB"}; + [weakSelf sendEventWithName:EVENT_NOTIFY body:deviceInfo]; + }]; + }else{ + [self commandReturnECGUSBError:ECG3USBError_DeviceDisconnect MAC:@""]; + } +} + +RCT_EXPORT_METHOD(getFilterDataByFileName:(nonnull NSString*)dataFileName markName:(nonnull NSString *)markFileName){ + ECG3USB *device = [[ECG3USBController shareECG3USBController] getCurrentECG3USBInstace]; + if (device) { + if (!dataFileName || !markFileName){ + NSString *message = @"input parameter cannot be null"; + NSDictionary* deviceInfo = @{kACTION:kACTION_SPLICE,kFILTER_ERROR_DESCRIPTION:message,kType:@"ECG3USB",kMAC:device.serialNumber}; + [self sendEventWithName:EVENT_NOTIFY body:deviceInfo]; + } else { + __weak typeof(self) weakSelf = self; + [device getFilterDataWithDic:@{@"MarkFileName":markFileName,@"DataFileName":dataFileName} success:^(NSArray *resultArray, BOOL finish) { + NSDictionary* deviceInfo = @{kACTION:kACTION_FILTER,kFILTER_DATA:resultArray,kMAC:device.serialNumber,kType:@"ECG3USB"}; + [weakSelf sendEventWithName:EVENT_NOTIFY body:deviceInfo]; + } error:^(NSString *message) { + NSDictionary* deviceInfo = @{kACTION:kACTION_SPLICE,kFILTER_ERROR_DESCRIPTION:message,kType:@"ECG3USB",kMAC:device.serialNumber}; + [weakSelf sendEventWithName:EVENT_NOTIFY body:deviceInfo]; + + }]; + } + + + + }else{ + [self commandReturnECGUSBError:ECG3USBError_DeviceDisconnect MAC:@""]; + } +} + +@end -- cgit