react-native-mytatva-rn-sdk 1.2.51 → 1.2.52
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/android/src/main/java/cgmblelib/base/BApplication.java +57 -57
- package/android/src/main/java/cgmblelib/ble/BleService.java +1 -1
- package/android/src/main/java/cgmblelib/ble/gattcallback/BleGattCallback.java +1 -1
- package/android/src/main/java/cgmblelib/database/dao/DaoDevice.java +4 -0
- package/android/src/main/java/cgmblelib/database/dao/DaoGlucose.java +334 -332
- package/android/src/main/java/cgmblelib/database/repository/RepositoryDevice.java +5 -0
- package/android/src/main/java/cgmblelib/database/repository/RepositoryGlucose.java +167 -162
- package/android/src/main/java/cgmblelib/database/source/SourceDevice.java +2 -0
- package/android/src/main/java/cgmblelib/database/source/SourceGlucose.java +2 -0
- package/android/src/main/java/cgmblelib/database/source/db/DeviceDBDataSource.java +171 -165
- package/android/src/main/java/cgmblelib/database/source/db/GlucoseDBDataSource.java +305 -296
- package/android/src/main/java/cgmblelib/utils/SharedPreferencesLibraryUtil.java +66 -44
- package/android/src/main/java/com/mytatvarnsdk/CgmTrackyLibModule.kt +13 -9
- package/android/src/main/java/com/mytatvarnsdk/MainApplication.kt +2 -2
- package/android/src/main/java/com/mytatvarnsdk/model/BaseViewModel.java +88 -84
- package/ios/Database/KLTBluetoothManager.m +4 -0
- package/ios/Database/KLTDatabaseHandler.m +77 -7
- package/ios/ViewModel/FinalViewModel.swift +6 -1
- package/lib/commonjs/CGMConnect.js +2 -2
- package/lib/commonjs/CGMConnect.js.map +1 -1
- package/lib/module/CGMConnect.js +3 -3
- package/lib/module/CGMConnect.js.map +1 -1
- package/lib/typescript/CGMConnect.d.ts +2 -2
- package/package.json +1 -1
- package/src/CGMConnect.ts +63 -54
|
@@ -10,60 +10,82 @@ import cgmblelib.qr.QRInformation;
|
|
|
10
10
|
|
|
11
11
|
public class SharedPreferencesLibraryUtil {
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
BSharedPreferences prefsHelper;
|
|
14
|
+
private final String QRInfo = "QRInformation";
|
|
15
|
+
private final String SyncMeta = "SyncMeta";
|
|
16
|
+
private final String PatientId = "PatientId";
|
|
16
17
|
|
|
17
18
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
public SharedPreferencesLibraryUtil(Context context) {
|
|
20
|
+
prefsHelper = BSharedPreferences.getInstance(context);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
public QRInformation getQRInformation() {
|
|
24
|
+
try {
|
|
25
|
+
String message = prefsHelper.getData(QRInfo);
|
|
26
|
+
if (message == null || message.isEmpty()) {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
return new Gson().fromJson(message, QRInformation.class);
|
|
30
|
+
} catch (Exception e) {
|
|
31
|
+
Log.d("Error => ", "getQRInformation: " + e.getMessage());
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
21
35
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
Log.d("Error => ", "getQRInformation: " + e.getMessage());
|
|
31
|
-
return null;
|
|
36
|
+
|
|
37
|
+
public void setQRInformation(String transmitterName, String qrmessage, float K, float R, String sensor) {
|
|
38
|
+
try {
|
|
39
|
+
Log.d("Error => ", "setQRInformation: " + transmitterName + qrmessage + K + R + sensor);
|
|
40
|
+
prefsHelper.saveData(QRInfo, new Gson().toJson(new QRInformation(transmitterName, qrmessage, R, K, sensor)));
|
|
41
|
+
} catch (Exception e) {
|
|
42
|
+
Log.d("Error => ", "setQRInformation: " + e.getMessage());
|
|
43
|
+
}
|
|
32
44
|
}
|
|
33
|
-
}
|
|
34
45
|
|
|
46
|
+
public void setLastSyncData(SyncMeta syncMeta) {
|
|
47
|
+
try {
|
|
48
|
+
prefsHelper.saveData(SyncMeta, new Gson().toJson(syncMeta));
|
|
49
|
+
} catch (Exception e) {
|
|
50
|
+
Log.d("Error => ", "setLastSyncData: " + e.getMessage());
|
|
51
|
+
}
|
|
52
|
+
}
|
|
35
53
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
54
|
+
public SyncMeta getLastSyncData() {
|
|
55
|
+
try {
|
|
56
|
+
String message = prefsHelper.getData(SyncMeta);
|
|
57
|
+
if (message == null || message.isEmpty()) {
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
return new Gson().fromJson(message, SyncMeta.class);
|
|
61
|
+
} catch (Exception e) {
|
|
62
|
+
Log.d("Error => ", "getLastSyncData: " + e.getMessage());
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
42
65
|
}
|
|
43
|
-
}
|
|
44
66
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
67
|
+
public void setLastPatientId(String patientId) {
|
|
68
|
+
try {
|
|
69
|
+
prefsHelper.saveData(PatientId, patientId);
|
|
70
|
+
} catch (Exception e) {
|
|
71
|
+
Log.d("Error => ", "setLastUserId: " + e.getMessage());
|
|
72
|
+
}
|
|
50
73
|
}
|
|
51
|
-
}
|
|
52
74
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
75
|
+
public String getLastPatientId() {
|
|
76
|
+
try {
|
|
77
|
+
String message = prefsHelper.getData(PatientId);
|
|
78
|
+
if (message == null || message.isEmpty()) {
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
return message;
|
|
82
|
+
} catch (Exception e) {
|
|
83
|
+
Log.d("Error => ", "getLastUserId: " + e.getMessage());
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
63
86
|
}
|
|
64
|
-
}
|
|
65
87
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
88
|
+
public void clearQRInformation() {
|
|
89
|
+
prefsHelper.saveData(QRInfo, null);
|
|
90
|
+
}
|
|
69
91
|
}
|
|
@@ -2,15 +2,10 @@ package com.mytatvarnsdk
|
|
|
2
2
|
|
|
3
3
|
import android.app.Application
|
|
4
4
|
import android.bluetooth.BluetoothAdapter
|
|
5
|
-
import android.bluetooth.BluetoothManager
|
|
6
|
-
import android.content.Context
|
|
7
5
|
import android.content.Intent
|
|
8
|
-
import android.content.pm.PackageManager
|
|
9
|
-
import android.os.Build
|
|
10
6
|
import android.os.Handler
|
|
11
7
|
import android.os.Looper
|
|
12
8
|
import android.util.Log
|
|
13
|
-
import androidx.core.content.ContextCompat
|
|
14
9
|
import androidx.lifecycle.Observer
|
|
15
10
|
import androidx.lifecycle.ViewModelProvider
|
|
16
11
|
import androidx.lifecycle.ViewModelStore
|
|
@@ -31,9 +26,6 @@ import com.facebook.react.modules.core.DeviceEventManagerModule
|
|
|
31
26
|
import com.google.gson.Gson
|
|
32
27
|
import com.google.gson.GsonBuilder
|
|
33
28
|
import com.mytatvarnsdk.activity.HelpActivity
|
|
34
|
-
import com.mytatvarnsdk.activity.PermissionActivity
|
|
35
|
-
import com.mytatvarnsdk.activity.PermissionUtils
|
|
36
|
-
import com.mytatvarnsdk.activity.SearchTransmitterActivity
|
|
37
29
|
import com.mytatvarnsdk.activity.StartCGMActivity
|
|
38
30
|
import com.mytatvarnsdk.model.AllCGMLogRequest
|
|
39
31
|
import com.mytatvarnsdk.model.CgmLog
|
|
@@ -123,7 +115,7 @@ class CgmTrackyLibModule(reactContext: ReactApplicationContext) :
|
|
|
123
115
|
}
|
|
124
116
|
|
|
125
117
|
@ReactMethod
|
|
126
|
-
fun observeTransmitterUnbindStatus(token: String, apiResponse: String
|
|
118
|
+
fun observeTransmitterUnbindStatus(token: String, apiResponse: String?, patientId: String) {
|
|
127
119
|
try {
|
|
128
120
|
if (apiResponse != null && apiResponse.isNotEmpty()) {
|
|
129
121
|
userToken = token
|
|
@@ -192,6 +184,15 @@ class CgmTrackyLibModule(reactContext: ReactApplicationContext) :
|
|
|
192
184
|
val startDate = sensor.startDate
|
|
193
185
|
val endDate = sensor.endDate
|
|
194
186
|
val sensorId = sensor.sensorId
|
|
187
|
+
val currentPatientId = patientId
|
|
188
|
+
|
|
189
|
+
val lastPatientId = prefsHelper.lastPatientId
|
|
190
|
+
val lastSensorId = prefsHelper.qrInformation.sensor
|
|
191
|
+
|
|
192
|
+
if (lastPatientId != null && lastSensorId != null && (lastPatientId != currentPatientId || lastSensorId != sensorId)) {
|
|
193
|
+
mModel.clearAllGlucoseAndDeviceData()
|
|
194
|
+
return
|
|
195
|
+
}
|
|
195
196
|
|
|
196
197
|
if (isCurrentDateInRange(startDate, endDate)) {
|
|
197
198
|
println("Current date is in range")
|
|
@@ -206,6 +207,9 @@ class CgmTrackyLibModule(reactContext: ReactApplicationContext) :
|
|
|
206
207
|
DeviceStatus.TRANSMITTER_DISCONNECT.id,
|
|
207
208
|
pocDevice.qrMessage
|
|
208
209
|
)
|
|
210
|
+
} else {
|
|
211
|
+
prefsHelper.lastPatientId = currentPatientId
|
|
212
|
+
prefsHelper.qrInformation.sensor = sensorId
|
|
209
213
|
}
|
|
210
214
|
} else {
|
|
211
215
|
postEventDataToAPI(
|
|
@@ -39,8 +39,8 @@ class MainApplication : BApplication(), ReactApplication {
|
|
|
39
39
|
super.onCreate()
|
|
40
40
|
Log.d("MainApplication", "MainApplication onCreate called")
|
|
41
41
|
SoLoader.init(this, false)
|
|
42
|
-
BleService.startService(this)
|
|
43
|
-
BSharedPreferences.init(this)
|
|
42
|
+
// BleService.startService(this)
|
|
43
|
+
// BSharedPreferences.init(this)
|
|
44
44
|
}
|
|
45
45
|
|
|
46
46
|
override fun getReactNativeHost(): ReactNativeHost {
|
|
@@ -8,7 +8,6 @@ import androidx.lifecycle.LiveData;
|
|
|
8
8
|
import androidx.lifecycle.MediatorLiveData;
|
|
9
9
|
import androidx.lifecycle.Transformations;
|
|
10
10
|
|
|
11
|
-
import java.util.Date;
|
|
12
11
|
import java.util.List;
|
|
13
12
|
|
|
14
13
|
import cgmblelib.database.entity.PocDevice;
|
|
@@ -22,88 +21,93 @@ import cgmblelib.database.repository.RepositoryGlucose;
|
|
|
22
21
|
* @author minyuchun
|
|
23
22
|
*/
|
|
24
23
|
public class BaseViewModel extends AndroidViewModel {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
24
|
+
/**
|
|
25
|
+
* 设备信息储存库
|
|
26
|
+
*/
|
|
27
|
+
private RepositoryDevice mRepositoryDevice;
|
|
28
|
+
/**
|
|
29
|
+
* 血糖信息储存库
|
|
30
|
+
*/
|
|
31
|
+
private RepositoryGlucose mRepositoryGlucose;
|
|
32
|
+
/**
|
|
33
|
+
* 最新的设备(数据库中最大Id的设备,无论是绑定还是非绑定)
|
|
34
|
+
*/
|
|
35
|
+
private LiveData<PocDevice> mDevice;
|
|
36
|
+
/**
|
|
37
|
+
* 血糖数据集列表持久化
|
|
38
|
+
*/
|
|
39
|
+
private LiveData<List<PocGlucose>> mGlucoseList;
|
|
40
|
+
/**
|
|
41
|
+
* 最新的血糖数据持久化,当发射器绑定时,获取最新的,若发射器解除绑定则无
|
|
42
|
+
*/
|
|
43
|
+
private LiveData<PocGlucose> mLatestGlucose;
|
|
44
|
+
/***
|
|
45
|
+
* 设备是否绑定
|
|
46
|
+
*/
|
|
47
|
+
private MediatorLiveData<Integer> mBindDeviceId = new MediatorLiveData<>();
|
|
48
|
+
|
|
49
|
+
public BaseViewModel(@NonNull Application application) {
|
|
50
|
+
super(application);
|
|
51
|
+
mRepositoryDevice = RepositoryDevice.getInstance(application);
|
|
52
|
+
mRepositoryGlucose = RepositoryGlucose.getInstance(application);
|
|
53
|
+
mDevice = mRepositoryDevice.getLiveDataLatestDeviceIoThread();
|
|
54
|
+
mBindDeviceId.addSource(mDevice, device -> {
|
|
55
|
+
if (device != null && device.isBound()) {
|
|
56
|
+
if (mBindDeviceId.getValue() == null || mBindDeviceId.getValue() != device.getId()) {
|
|
57
|
+
mBindDeviceId.setValue(device.getId());
|
|
58
|
+
}
|
|
59
|
+
} else {
|
|
60
|
+
mBindDeviceId.setValue(0);
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
LoadGlucose();
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* 获取持久化设备数据,获取最新的设备的所有信息
|
|
68
|
+
*/
|
|
69
|
+
public synchronized LiveData<PocDevice> getDevice() {
|
|
70
|
+
return mDevice;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
public synchronized LiveData<List<PocGlucose>> getAllGlucose() {
|
|
74
|
+
return mGlucoseList;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
public synchronized LiveData<PocGlucose> getLatestGlucose() {
|
|
78
|
+
return mLatestGlucose;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* 获取血糖数据
|
|
83
|
+
*/
|
|
84
|
+
private synchronized void LoadGlucose() {
|
|
85
|
+
mGlucoseList = Transformations.switchMap(mBindDeviceId, input -> mRepositoryGlucose.getLiveDataGlucoseListByDeviceId(input));
|
|
86
|
+
mLatestGlucose = Transformations.map(mGlucoseList, input -> {
|
|
87
|
+
if (input != null && input.size() > 0) {
|
|
88
|
+
return input.get(input.size() - 1);
|
|
89
|
+
} else {
|
|
90
|
+
return null;
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
public List<PocGlucose> getGlucoseByTime() {
|
|
97
|
+
return mRepositoryGlucose.getGlucoseByDeviceIdAndTimeMillis(7, 1748005587474L);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
public List<PocGlucose> getGlucoseBetweenTime(long startTime) {
|
|
101
|
+
return mRepositoryGlucose.getGlucoseByTimeMillis(startTime, System.currentTimeMillis());
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
public PocDevice getDeviceInfo(int deviceId) {
|
|
105
|
+
return mRepositoryDevice.getDeviceByIdIoThread(deviceId);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
public void clearAllGlucoseAndDeviceData() {
|
|
109
|
+
mRepositoryGlucose.deleteAllGlucoseData();
|
|
110
|
+
mRepositoryDevice.deleteAllDeviceData();
|
|
111
|
+
}
|
|
108
112
|
|
|
109
113
|
}
|
|
@@ -265,6 +265,7 @@
|
|
|
265
265
|
}
|
|
266
266
|
|
|
267
267
|
// 获取外设发来的数据,不论是read还是notify,获取数据都是从这个方法中读取。
|
|
268
|
+
//To receive data sent from the peripheral, whether through read or notify, the data is obtained from this method.
|
|
268
269
|
- (void)peripheral:(CBPeripheral *)peripheral didUpdateValueForCharacteristic:(CBCharacteristic *)characteristic error:(NSError *)error {
|
|
269
270
|
if (error) {
|
|
270
271
|
return;
|
|
@@ -421,6 +422,7 @@
|
|
|
421
422
|
}
|
|
422
423
|
|
|
423
424
|
// 发射器处理单条血糖数据的通用解析
|
|
425
|
+
//Generic parsing of a single blood glucose data packet by the transmitter
|
|
424
426
|
- (ReceiveData *)handleCommonReceiveGluData:(Glucose *)gluData commandText:(NSString *)commandText {
|
|
425
427
|
Device *currentDevice = self.currentDevice;
|
|
426
428
|
//接收到的数据先存放到ReceiveDataInfo表
|
|
@@ -488,6 +490,7 @@
|
|
|
488
490
|
[self closeBleSensor];
|
|
489
491
|
} else {
|
|
490
492
|
// 数据没拉取完继续拉取蓝牙断开期间的数据(0x22拉取协议)
|
|
493
|
+
//Continue retrieving the remaining data that wasn't pulled before, including the data generated during the Bluetooth disconnection (using the 0x22 retrieval protocol).
|
|
491
494
|
NSInteger pullNums = 20;
|
|
492
495
|
if (remain_points < pullNums) {
|
|
493
496
|
pullNums = remain_points;
|
|
@@ -518,6 +521,7 @@
|
|
|
518
521
|
[self handleCommonCT3GlucoseDataWithReceiveData:receive];
|
|
519
522
|
}
|
|
520
523
|
|
|
524
|
+
|
|
521
525
|
[Notification_Center postNotificationName:KLTUpdateDataNotify object:NULL];
|
|
522
526
|
NSLog(@"----------------------------------------------called handleResendDataWithPrefix22 for KLTUpdateDataNotify");
|
|
523
527
|
NSInteger maxGlucoseId = [KLTDatabaseHandler.shared getLatestAndMaxGlucoseIdOfDevice:self.currentDevice];
|
|
@@ -130,6 +130,20 @@
|
|
|
130
130
|
glucose.temperature = data.temperature;
|
|
131
131
|
float algo_k = [[User_Defaults objectForKey:@"algo_k"] floatValue];
|
|
132
132
|
float algo_r = [[User_Defaults objectForKey:@"algo_r"] floatValue];
|
|
133
|
+
|
|
134
|
+
NSString *dateString = data.receiveDateTime;
|
|
135
|
+
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
|
|
136
|
+
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm"];
|
|
137
|
+
[dateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
|
|
138
|
+
NSDate *date = [dateFormatter dateFromString:dateString];
|
|
139
|
+
if (date) {
|
|
140
|
+
NSTimeInterval timeMillis = [date timeIntervalSince1970] * 1000; // Convert to milliseconds
|
|
141
|
+
NSLog(@"Milliseconds since epoch: %.0f", timeMillis);
|
|
142
|
+
NSNumber *numberFromTimeMillis = [NSNumber numberWithDouble:timeMillis]; // Wrap the NSTimeInterval into an NSNumber
|
|
143
|
+
} else {
|
|
144
|
+
NSLog(@"Invalid date string format");
|
|
145
|
+
}
|
|
146
|
+
|
|
133
147
|
|
|
134
148
|
LatestData *d = nil;
|
|
135
149
|
NSString *localName = data.device.advertise.localName;
|
|
@@ -137,13 +151,24 @@
|
|
|
137
151
|
if (userBG > 0) {
|
|
138
152
|
d = [[LatestData alloc] initWithParameters:glucose.dataId.intValue andIw:[glucose.operatingCurrent floatValue] andIb:[glucose.blankCurrent floatValue] andT:[glucose.temperature floatValue] andK0:algo_k andR:algo_r andDay:[data.day intValue] andHour:[data.hour intValue] andMinute:[data.minute intValue] andNewBgToGlucoseId:glucose.dataId.intValue andNewBgValue:userBG andName:localName];
|
|
139
153
|
} else {
|
|
140
|
-
d = [[LatestData alloc] initWithParameters:([glucose.dataId intValue]) andIw:[glucose.operatingCurrent floatValue] andIb:[glucose.blankCurrent floatValue] andT:[glucose.temperature floatValue] andK0:algo_k andR:algo_r andDay:[data.day intValue] andHour:[data.hour intValue] andMinute:[data.minute intValue] andName:localName];
|
|
154
|
+
d = [[LatestData alloc] initWithParameters:([glucose.dataId intValue]) andIw:[glucose.operatingCurrent floatValue] andIb:[glucose.blankCurrent floatValue] andT:[glucose.temperature floatValue] andK0:algo_k andR:algo_r andDay:[data.day intValue] andHour:[data.hour intValue] andMinute:[data.minute intValue] andName:localName ];
|
|
141
155
|
}
|
|
142
156
|
d.algorithm = AlgorithmType_CT4;
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
NSLog( @"sensorInfosensorInf %f", d.R);
|
|
161
|
+
|
|
162
|
+
NSLog( @"sensorInfosensorInfosensorInfosensorInfo %@", d.sensorInfo);
|
|
163
|
+
|
|
164
|
+
NSLog(@"算法入参dataId=%@, operatingCurrent=%@, blankCurrent=%@, temperature=%@, algo_k=%@, algo_r=%@, day=%@, hour=%@, minute=%@, localName=%@, algorithm=%@, year=%@, milles=%@", @(d.glucoseId), @(d.Iw), @(d.Ib), @(d.T), @(d.K0), @(d.R), @(d.day), @(d.hour), @(d.minute), d.name, @(d.algorithm), @(d.year), @(d.timeMillis));
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
|
|
143
168
|
|
|
144
|
-
KLTLog(@"算法入参dataId=%@, operatingCurrent=%@, blankCurrent=%@, temperature=%@, algo_k=%@, algo_r=%@, day=%@, hour=%@, minute=%@, localName=%@, newBgValue=%@, algorithm=%@", @(d.glucoseId), @(d.Iw), @(d.Ib), @(d.T), @(d.K0), @(d.R), @(d.day), @(d.hour), @(d.minute), d.name, @(d.newBgValue), @(d.algorithm));
|
|
145
169
|
CurrentGlucose *currentGlucose = [AlgorithmTools algorithmLatestGlucose:d];
|
|
146
170
|
|
|
171
|
+
|
|
147
172
|
if (currentGlucose.errorCode == ERROR_CODE_ALGORITHM_DATA) {
|
|
148
173
|
[self reloadQueryHistoryData];
|
|
149
174
|
|
|
@@ -153,11 +178,35 @@
|
|
|
153
178
|
d = [[LatestData alloc] initWithParameters:([glucose.dataId intValue]) andIw:[glucose.operatingCurrent floatValue] andIb:[glucose.blankCurrent floatValue] andT:[glucose.temperature floatValue] andK0:algo_k andR:algo_r andDay:[data.day intValue] andHour:[data.hour intValue] andMinute:[data.minute intValue] andName:localName];
|
|
154
179
|
}
|
|
155
180
|
d.algorithm = AlgorithmType_CT4;
|
|
181
|
+
|
|
156
182
|
|
|
157
|
-
|
|
183
|
+
NSLog(@"ERROR_CODE_ALGORITHM_DATA:dataId=%@, operatingCurrent=%@, blankCurrent=%@, temperature=%@, algo_k=%@, algo_r=%@, day=%@, hour=%@, minute=%@, localName=%@, newBgValue=%@, algorithm=%@", @(d.glucoseId), @(d.Iw), @(d.Ib), @(d.T), @(d.K0), @(d.R), @(d.day), @(d.hour), @(d.minute), d.name, @(d.newBgValue), @(d.algorithm));
|
|
158
184
|
currentGlucose = [AlgorithmTools algorithmLatestGlucose:d];
|
|
185
|
+
|
|
186
|
+
NSString *logString = [NSString stringWithFormat:@"glucoseId=%@, Iw=%@, Ib=%@, T=%@,dayCount=%@, hour=%@, minute=%@, milles=%@, GluMG=%@,BGCount=%@, BGICount=%@, errorCode=%@ trend=%@ calibrationStatus=%@, countdownDays=%@, countdownHours=%@, countdownMinutes=%@ ",
|
|
187
|
+
@(d.glucoseId),
|
|
188
|
+
@(d.Iw),
|
|
189
|
+
@(d.Ib),
|
|
190
|
+
@(d.T),
|
|
191
|
+
@(d.day),
|
|
192
|
+
@(d.hour),
|
|
193
|
+
@(d.minute),
|
|
194
|
+
@(d.timeMillis),
|
|
195
|
+
@(currentGlucose.GluMG),
|
|
196
|
+
@(currentGlucose.BGCount),
|
|
197
|
+
@(currentGlucose.BGICount),
|
|
198
|
+
@(currentGlucose.errorCode),
|
|
199
|
+
@(currentGlucose.trend),
|
|
200
|
+
@(currentGlucose.BGMG),
|
|
201
|
+
@(currentGlucose.countdownDays),
|
|
202
|
+
@(currentGlucose.countdownHours),
|
|
203
|
+
@(currentGlucose.countdownHours)
|
|
204
|
+
|
|
205
|
+
];
|
|
206
|
+
|
|
159
207
|
}
|
|
160
208
|
|
|
209
|
+
|
|
161
210
|
glucose.errorCode = @(currentGlucose.errorCode);
|
|
162
211
|
glucose.trend = @(currentGlucose.trend);
|
|
163
212
|
/* glucose.glu 保存 ADC 算法结果 单位mmol */
|
|
@@ -172,11 +221,29 @@
|
|
|
172
221
|
data.calibration = @(currentGlucose.BGMG);
|
|
173
222
|
data.error = @(currentGlucose.errorCode);
|
|
174
223
|
data.trend = @(currentGlucose.trend);
|
|
175
|
-
data.countdownDays = @(currentGlucose.countdownDays);
|
|
176
|
-
data.countdownHours = @(currentGlucose.countdownHours);
|
|
177
|
-
data.countdownMinutes = @(currentGlucose.countdownMinutes);
|
|
178
224
|
|
|
179
|
-
[
|
|
225
|
+
NSString *logString = [NSString stringWithFormat:@"glucoseId=%@, Iw=%@, Ib=%@, T=%@,dayCount=%@, hour=%@, minute=%@, milles=%@, GluMG=%@,BGCount=%@, BGICount=%@, errorCode=%@ trend=%@ calibrationStatus=%@, countdownDays=%@, countdownHours=%@, countdownMinutes=%@ ",
|
|
226
|
+
@(d.glucoseId),
|
|
227
|
+
@(d.Iw),
|
|
228
|
+
@(d.Ib),
|
|
229
|
+
@(d.T),
|
|
230
|
+
@(d.day),
|
|
231
|
+
@(d.hour),
|
|
232
|
+
@(d.minute),
|
|
233
|
+
@(d.timeMillis),
|
|
234
|
+
@(currentGlucose.GluMG),
|
|
235
|
+
@(currentGlucose.BGCount),
|
|
236
|
+
@(currentGlucose.BGICount),
|
|
237
|
+
@(currentGlucose.errorCode),
|
|
238
|
+
@(currentGlucose.trend),
|
|
239
|
+
@(currentGlucose.BGMG),
|
|
240
|
+
@(currentGlucose.countdownDays),
|
|
241
|
+
@(currentGlucose.countdownHours),
|
|
242
|
+
@(currentGlucose.countdownHours)
|
|
243
|
+
|
|
244
|
+
];
|
|
245
|
+
|
|
246
|
+
|
|
180
247
|
[self.appDelegate saveContext];
|
|
181
248
|
return glucose;
|
|
182
249
|
}
|
|
@@ -327,6 +394,8 @@
|
|
|
327
394
|
}
|
|
328
395
|
|
|
329
396
|
resendDatas = [resendDatas sortedArrayUsingDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"receiveDateTime" ascending:YES]]];
|
|
397
|
+
NSLog(@"entity: %@", entity);
|
|
398
|
+
NSLog(@"predicate: %@", predicate);
|
|
330
399
|
NSLog(@"📡 resendDatas: %@", resendDatas);
|
|
331
400
|
|
|
332
401
|
return resendDatas;
|
|
@@ -379,6 +448,7 @@
|
|
|
379
448
|
}
|
|
380
449
|
|
|
381
450
|
// 查询最近一次连接的最大的血糖ID
|
|
451
|
+
//Query the highest blood glucose ID from the most recent connection
|
|
382
452
|
- (NSInteger)getLatestAndMaxGlucoseIdOfDevice:(Device *)currentDevice {
|
|
383
453
|
NSArray *array = [self queryReceiveDataWithDevice:currentDevice needUserBG:NO];
|
|
384
454
|
if (array.count > 0) {
|
|
@@ -486,6 +486,7 @@ class FinalViewModel: NSObject {
|
|
|
486
486
|
switch status {
|
|
487
487
|
|
|
488
488
|
case .disconnected:
|
|
489
|
+
print("----device is disconnected--------")
|
|
489
490
|
print("lastBluetoothStatus-------->> \(lastBluetoothStatus)")
|
|
490
491
|
if lastBluetoothStatus == .connected {
|
|
491
492
|
print("===> Previously connected, delaying disconnect for 1 minute")
|
|
@@ -523,10 +524,11 @@ class FinalViewModel: NSObject {
|
|
|
523
524
|
startScanTimer = nil
|
|
524
525
|
print("--------------------------- startScanTimer is nil")
|
|
525
526
|
}
|
|
526
|
-
|
|
527
|
+
print("---device is connected--------")
|
|
527
528
|
debouncer.update(with: CGMConnectionStatus.connected)
|
|
528
529
|
|
|
529
530
|
case .timeOut:
|
|
531
|
+
print("----device is timeOut--------")
|
|
530
532
|
lastBluetoothStatus = .timeOut
|
|
531
533
|
if !KLTLocalSettingManager.shareInstance().canConnectOtherDevice {
|
|
532
534
|
startScanTimer = Timer.scheduledTimer(timeInterval: 20,
|
|
@@ -537,14 +539,17 @@ class FinalViewModel: NSObject {
|
|
|
537
539
|
}
|
|
538
540
|
|
|
539
541
|
case .sensorLostPower:
|
|
542
|
+
print("----device is sensorLostPower--------")
|
|
540
543
|
lastBluetoothStatus = .sensorLostPower
|
|
541
544
|
sensorLostPower()
|
|
542
545
|
|
|
543
546
|
case .updateBindWatchSuccess:
|
|
547
|
+
print("----device is updateBindWatchSuccess--------")
|
|
544
548
|
lastBluetoothStatus = .updateBindWatchSuccess
|
|
545
549
|
startCountDown()
|
|
546
550
|
|
|
547
551
|
case .closed:
|
|
552
|
+
print("----device is closed--------")
|
|
548
553
|
lastBluetoothStatus = .closed
|
|
549
554
|
debouncer.update(with: CGMConnectionStatus.transmitterDisconnect)
|
|
550
555
|
|
|
@@ -102,10 +102,10 @@ const helpCGM = async token => {
|
|
|
102
102
|
}
|
|
103
103
|
};
|
|
104
104
|
exports.helpCGM = helpCGM;
|
|
105
|
-
const observeTransmitterUnbindStatusHandler = async (token, apiResponse) => {
|
|
105
|
+
const observeTransmitterUnbindStatusHandler = async (token, apiResponse, patientId) => {
|
|
106
106
|
console.log('observeTransmitterUnbindStatusHandler====');
|
|
107
107
|
try {
|
|
108
|
-
const result = await cgmLib.observeTransmitterUnbindStatus(token, apiResponse);
|
|
108
|
+
const result = await cgmLib.observeTransmitterUnbindStatus(token, apiResponse, patientId);
|
|
109
109
|
console.log(result);
|
|
110
110
|
} catch (error) {
|
|
111
111
|
console.error(error);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_reactNative","require","eventSubscription","LINKING_ERROR","Platform","select","ios","default","cgmLib","NativeModules","CgmTrackyLib","Proxy","get","Error","initializeCGMEventListener","callback","iosEventEmitter","NativeEventEmitter","remove","OS","DeviceEventEmitter","addListener","eventData","status","removeCGMEventListener","startCGM","token","console","log","result","startCgmTracky","error","exports","reconnectCGM","reconnectCgmTracky","observeAllGlucoseDataHandler","observeAllGlucoseData","deviceStatus","observeDeviceStatus","helpCGM","openHelpSupport","observeTransmitterUnbindStatusHandler","apiResponse","observeTransmitterUnbindStatus","observeResetLogoutHandler","resetCgmState","stopCGM"],"sources":["CGMConnect.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"names":["_reactNative","require","eventSubscription","LINKING_ERROR","Platform","select","ios","default","cgmLib","NativeModules","CgmTrackyLib","Proxy","get","Error","initializeCGMEventListener","callback","iosEventEmitter","NativeEventEmitter","remove","OS","DeviceEventEmitter","addListener","eventData","status","removeCGMEventListener","startCGM","token","console","log","result","startCgmTracky","error","exports","reconnectCGM","reconnectCgmTracky","observeAllGlucoseDataHandler","observeAllGlucoseData","deviceStatus","observeDeviceStatus","helpCGM","openHelpSupport","observeTransmitterUnbindStatusHandler","apiResponse","patientId","observeTransmitterUnbindStatus","observeResetLogoutHandler","resetCgmState","stopCGM"],"sources":["CGMConnect.ts"],"sourcesContent":["import {\n DeviceEventEmitter,\n EmitterSubscription,\n NativeEventEmitter,\n NativeModules,\n Platform,\n} from 'react-native';\n\nlet eventSubscription: EmitterSubscription | null = null;\n\nconst LINKING_ERROR =\n `The package 'react-native-mytatva-rn-sdk' doesn't seem to be linked. Make sure: \\n\\n` +\n Platform.select({ ios: \"- You have run 'pod install'\\n\", default: '' }) +\n '- You rebuilt the app after installing the package\\n' +\n '- You are not using Expo Go\\n';\n\nconst cgmLib = NativeModules.CgmTrackyLib\n ? NativeModules.CgmTrackyLib\n : new Proxy(\n {},\n {\n get() {\n throw new Error(LINKING_ERROR);\n },\n }\n );\n\nfunction initializeCGMEventListener(callback: (eventData: any) => void) {\n const iosEventEmitter = new NativeEventEmitter(cgmLib);\n if (eventSubscription) {\n eventSubscription.remove();\n }\n\n if (Platform.OS === 'android') {\n eventSubscription = DeviceEventEmitter.addListener(\n 'cgmDeviceEvent',\n (eventData: any) => {\n const { status } = eventData;\n if (status === 'WARM_PERIOD_STARTED') {\n callback(eventData);\n } else {\n callback(eventData);\n }\n }\n );\n } else if (Platform.OS === 'ios' && iosEventEmitter) {\n eventSubscription = iosEventEmitter.addListener(\n 'cgmDeviceEvent',\n (eventData: any) => {\n const { status } = eventData;\n if (status === 'WARM_PERIOD_STARTED') {\n callback(eventData);\n } else {\n callback(eventData);\n }\n }\n );\n }\n}\n\nfunction removeCGMEventListener() {\n if (eventSubscription) {\n eventSubscription.remove();\n eventSubscription = null;\n }\n}\n\nconst startCGM = async (token: string) => {\n console.log('token====startCGM', token);\n try {\n const result = await cgmLib.startCgmTracky(token);\n console.log(result);\n } catch (error) {\n console.error(error);\n }\n};\n\nconst reconnectCGM = async (token: string) => {\n console.log('reconnectCGM====');\n try {\n const result = await cgmLib.reconnectCgmTracky(token);\n console.log(result);\n } catch (error) {\n console.error(error);\n }\n};\n\nconst observeAllGlucoseDataHandler = async (token: string) => {\n console.log('observeAllGlucoseDataHandler====');\n try {\n if (Platform.OS === 'android') {\n const result = await cgmLib.observeAllGlucoseData(token);\n const deviceStatus = await cgmLib.observeDeviceStatus(token);\n console.log(result);\n console.log(deviceStatus);\n } else if (Platform.OS === 'ios') {\n const result = await cgmLib.observeAllGlucoseData(token);\n console.log(result);\n }\n } catch (error) {\n console.log('error====', error);\n console.error(error);\n }\n};\n\nconst helpCGM = async (token: string) => {\n console.log('helpCGM====');\n try {\n const result = await cgmLib.openHelpSupport();\n console.log(result);\n } catch (error) {\n console.error(error);\n }\n};\n\nconst observeTransmitterUnbindStatusHandler = async (\n token: string,\n apiResponse: string,\n patientId: string\n) => {\n console.log('observeTransmitterUnbindStatusHandler====');\n try {\n const result = await cgmLib.observeTransmitterUnbindStatus(\n token,\n apiResponse,\n patientId\n );\n console.log(result);\n } catch (error) {\n console.error(error);\n }\n};\n\nconst observeResetLogoutHandler = async () => {\n console.log('observeResetLogoutHandler====');\n try {\n const result = await cgmLib.resetCgmState();\n console.log(result);\n } catch (error) {\n console.error(error);\n }\n};\n\nconst stopCGM = async () => {\n // Implementation\n};\n\nexport {\n startCGM,\n stopCGM,\n initializeCGMEventListener,\n removeCGMEventListener,\n observeAllGlucoseDataHandler,\n reconnectCGM,\n helpCGM,\n observeTransmitterUnbindStatusHandler,\n observeResetLogoutHandler,\n};\n"],"mappings":"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","ignoreList":[]}
|