@ovok/native 0.4.10 → 1.0.0

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.
Files changed (48) hide show
  1. package/LICENSE +667 -8
  2. package/lib/commonjs/modules/bt-management/services/bt-manager.js +13 -15
  3. package/lib/commonjs/modules/bt-management/services/bt-manager.js.map +1 -1
  4. package/lib/commonjs/modules/bt-management/services/device-creator.js +1 -7
  5. package/lib/commonjs/modules/bt-management/services/device-creator.js.map +1 -1
  6. package/lib/commonjs/modules/bt-management/services/devices/bc01/bc01.device.js +51 -113
  7. package/lib/commonjs/modules/bt-management/services/devices/bc01/bc01.device.js.map +1 -1
  8. package/lib/commonjs/modules/bt-management/services/devices/bc01/bc01.main-services.js +77 -41
  9. package/lib/commonjs/modules/bt-management/services/devices/bc01/bc01.main-services.js.map +1 -1
  10. package/lib/module/modules/bt-management/services/bt-manager.js +13 -15
  11. package/lib/module/modules/bt-management/services/bt-manager.js.map +1 -1
  12. package/lib/module/modules/bt-management/services/device-creator.js +1 -7
  13. package/lib/module/modules/bt-management/services/device-creator.js.map +1 -1
  14. package/lib/module/modules/bt-management/services/devices/bc01/bc01.device.js +51 -113
  15. package/lib/module/modules/bt-management/services/devices/bc01/bc01.device.js.map +1 -1
  16. package/lib/module/modules/bt-management/services/devices/bc01/bc01.main-services.js +77 -41
  17. package/lib/module/modules/bt-management/services/devices/bc01/bc01.main-services.js.map +1 -1
  18. package/lib/typescript/commonjs/src/modules/bt-management/services/bt-manager.d.ts +1 -0
  19. package/lib/typescript/commonjs/src/modules/bt-management/services/bt-manager.d.ts.map +1 -1
  20. package/lib/typescript/commonjs/src/modules/bt-management/services/device-creator.d.ts.map +1 -1
  21. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/bc01/bc01.device.d.ts +13 -33
  22. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/bc01/bc01.device.d.ts.map +1 -1
  23. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/bc01/bc01.main-services.d.ts +17 -11
  24. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/bc01/bc01.main-services.d.ts.map +1 -1
  25. package/lib/typescript/module/src/modules/bt-management/services/bt-manager.d.ts +1 -0
  26. package/lib/typescript/module/src/modules/bt-management/services/bt-manager.d.ts.map +1 -1
  27. package/lib/typescript/module/src/modules/bt-management/services/device-creator.d.ts.map +1 -1
  28. package/lib/typescript/module/src/modules/bt-management/services/devices/bc01/bc01.device.d.ts +13 -33
  29. package/lib/typescript/module/src/modules/bt-management/services/devices/bc01/bc01.device.d.ts.map +1 -1
  30. package/lib/typescript/module/src/modules/bt-management/services/devices/bc01/bc01.main-services.d.ts +17 -11
  31. package/lib/typescript/module/src/modules/bt-management/services/devices/bc01/bc01.main-services.d.ts.map +1 -1
  32. package/package.json +13 -12
  33. package/lib/commonjs/modules/bt-management/services/devices/bc01/bc01-command-sequencer.js +0 -184
  34. package/lib/commonjs/modules/bt-management/services/devices/bc01/bc01-command-sequencer.js.map +0 -1
  35. package/lib/commonjs/modules/bt-management/services/devices/bc01/bc01-frame-parser.js +0 -114
  36. package/lib/commonjs/modules/bt-management/services/devices/bc01/bc01-frame-parser.js.map +0 -1
  37. package/lib/module/modules/bt-management/services/devices/bc01/bc01-command-sequencer.js +0 -180
  38. package/lib/module/modules/bt-management/services/devices/bc01/bc01-command-sequencer.js.map +0 -1
  39. package/lib/module/modules/bt-management/services/devices/bc01/bc01-frame-parser.js +0 -110
  40. package/lib/module/modules/bt-management/services/devices/bc01/bc01-frame-parser.js.map +0 -1
  41. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/bc01/bc01-command-sequencer.d.ts +0 -53
  42. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/bc01/bc01-command-sequencer.d.ts.map +0 -1
  43. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/bc01/bc01-frame-parser.d.ts +0 -53
  44. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/bc01/bc01-frame-parser.d.ts.map +0 -1
  45. package/lib/typescript/module/src/modules/bt-management/services/devices/bc01/bc01-command-sequencer.d.ts +0 -53
  46. package/lib/typescript/module/src/modules/bt-management/services/devices/bc01/bc01-command-sequencer.d.ts.map +0 -1
  47. package/lib/typescript/module/src/modules/bt-management/services/devices/bc01/bc01-frame-parser.d.ts +0 -53
  48. package/lib/typescript/module/src/modules/bt-management/services/devices/bc01/bc01-frame-parser.d.ts.map +0 -1
@@ -15,6 +15,7 @@ class BTManager {
15
15
  static MAX_DEVICES = 15; // Safety limit to prevent unbounded growth
16
16
  devices = new Map();
17
17
  eventSubscriptions = [];
18
+ lastScanTimestamp = 0;
18
19
  constructor(bleManager, acceptedDevices) {
19
20
  this.bleManager = bleManager;
20
21
  this.acceptedDevices = acceptedDevices;
@@ -29,6 +30,7 @@ class BTManager {
29
30
  this.stateChangeListener.remove();
30
31
  this.stateChangeListener = undefined;
31
32
  }
33
+ this.lastScanTimestamp = 0;
32
34
 
33
35
  // Then clear all callbacks
34
36
  this.onErrorCallback = undefined;
@@ -42,6 +44,12 @@ class BTManager {
42
44
  this.deviceCreator.destroy();
43
45
  };
44
46
  startScan = () => {
47
+ if (Date.now() - this.lastScanTimestamp < 60_000) {
48
+ (0, _sentryLogger.sentryLogger)("warning", "BT_MANAGER: startScan called too frequently, skipping (within 1 min window)");
49
+ return;
50
+ }
51
+ this.lastScanTimestamp = Date.now();
52
+
45
53
  // Remove previous state change listener to prevent accumulation
46
54
  if (this.stateChangeListener) {
47
55
  this.stateChangeListener.remove();
@@ -64,14 +72,12 @@ class BTManager {
64
72
  }
65
73
  (0, _sentryLogger.sentryLogger)("warning", "BT_MANAGER: State is not PoweredOn, sending intent to enable Bluetooth");
66
74
 
67
- // Only send intent on Android — iOS has no programmatic way to power on
68
- // Bluetooth, and `bleManager.enable()` there returns an unsupported-op
69
- // promise that would surface as an unhandled rejection.
75
+ // Only send intent on Android
70
76
  if (_reactNative.Platform.OS === "android") {
71
77
  _reactNative.Linking.sendIntent("android.bluetooth.adapter.action.REQUEST_ENABLE");
72
- return;
78
+ } else {
79
+ this.bleManager.enable();
73
80
  }
74
- (0, _sentryLogger.sentryLogger)("warning", "BT_MANAGER: Bluetooth is off; on iOS the user must enable it from Settings");
75
81
  }, true);
76
82
 
77
83
  // Track subscription for proper cleanup
@@ -130,21 +136,13 @@ class BTManager {
130
136
  });
131
137
  return;
132
138
  }
133
-
134
- /**
135
- * On iOS the advertised name arrives as `localName` while `name` stays null until the
136
- * device is connected. Dropping every ad without a `name` therefore hides real BC401
137
- * and other Contec hardware from the scan list. Fall back to `localName` so the same
138
- * matcher runs against the string the peripheral actually advertised.
139
- */
140
- const advertisedName = device?.name?.trim() || device?.localName?.trim() || "";
141
- if (!device || !advertisedName) {
139
+ if (!device || !device.name) {
142
140
  return;
143
141
  }
144
142
  if (this.devices.has(device.id)) {
145
143
  return;
146
144
  }
147
- const deviceName = this.deviceCreator.getDeviceName(advertisedName);
145
+ const deviceName = this.deviceCreator.getDeviceName(device.name);
148
146
  if (!deviceName) {
149
147
  return;
150
148
  }
@@ -1 +1 @@
1
- {"version":3,"names":["_reactNative","require","_reactNativeBlePlx","_index","_sentryLogger","_deviceCreator","BTManager","MAX_DEVICES","devices","Map","eventSubscriptions","constructor","bleManager","acceptedDevices","deviceCreator","DeviceCreator","destroy","sentryLogger","stopScan","stateChangeListener","remove","undefined","onErrorCallback","onDeviceFoundCallback","onResultCallback","onDeviceStatusChangedCallback","forEach","device","clear","startScan","onStateChange","state","State","PoweredOn","index","indexOf","splice","startDeviceScan","scanMode","ScanMode","Balanced","onScanResult","Platform","OS","Linking","sendIntent","push","stopDeviceScan","sub","onDeviceFound","callback","onError","onDeviceStatusChanged","onResult","error","Error","message","slog","advertisedName","name","trim","localName","has","id","deviceName","getDeviceName","size","deviceId","currentSize","deviceClass","createDevice","bind","onDeviceDisconnected","removeDeviceFromFoundedDevices","set","get","delete","exports"],"sourceRoot":"../../../../../src","sources":["modules/bt-management/services/bt-manager.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_reactNative","require","_reactNativeBlePlx","_index","_sentryLogger","_deviceCreator","BTManager","MAX_DEVICES","devices","Map","eventSubscriptions","lastScanTimestamp","constructor","bleManager","acceptedDevices","deviceCreator","DeviceCreator","destroy","sentryLogger","stopScan","stateChangeListener","remove","undefined","onErrorCallback","onDeviceFoundCallback","onResultCallback","onDeviceStatusChangedCallback","forEach","device","clear","startScan","Date","now","onStateChange","state","State","PoweredOn","index","indexOf","splice","startDeviceScan","scanMode","ScanMode","Balanced","onScanResult","Platform","OS","Linking","sendIntent","enable","push","stopDeviceScan","sub","onDeviceFound","callback","onError","onDeviceStatusChanged","onResult","error","Error","message","slog","name","has","id","deviceName","getDeviceName","size","deviceId","currentSize","deviceClass","createDevice","bind","onDeviceDisconnected","removeDeviceFromFoundedDevices","set","get","delete","exports"],"sourceRoot":"../../../../../src","sources":["modules/bt-management/services/bt-manager.ts"],"mappings":"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","ignoreList":[]}
@@ -77,13 +77,7 @@ class DeviceCreator {
77
77
  if (!params.device) {
78
78
  throw new Error("Device is required");
79
79
  }
80
-
81
- /**
82
- * On iOS the peripheral's `name` is null in scan callbacks until it is connected —
83
- * `localName` carries the advertised name instead. Accept either so a scan-time
84
- * `createDevice` call for a real iOS ad is not rejected before it can connect.
85
- */
86
- if (!params.device.name?.trim() && !params.device.localName?.trim()) {
80
+ if (!params.device.name?.trim()) {
87
81
  throw new Error("Device name is required");
88
82
  }
89
83
  if (!params.device.id) {
@@ -1 +1 @@
1
- {"version":3,"names":["_integratedDevicesMap","require","_integratedDevices","_isCustomDeviceDefinition","_bc01Device","_bp2Device","_customDevice","_f4Device","_spo2Device","_verovalDuoControlDevice","_verovalEcgDevice","DEVICE_CLASSES","IntegratedDevices","BP2","BP2Device","F4","F4Device","PC60WF","SPO2Device","BC01","BC01Device","VEROVAL_DUO_CONTROL","VerovalDuoControlDevice","VEROVAL_ECG","VerovalEcgDevice","collectCustomDevices","acceptedDevices","customDevices","Map","matchers","Set","forEach","entry","index","isCustomDeviceDefinition","Error","has","id","nameMatch","source","set","add","DeviceCreator","deviceNameCache","CACHE_MAX_SIZE","constructor","acceptedDeviceNames","getDeviceName","foundName","undefined","get","matched","matchDeviceName","cacheDeviceName","createDevice","params","String","deviceName","trim","device","name","localName","custom","CustomDevice","deviceClass","Object","keys","join","destroy","clear","regex","deviceType","integratedDevicesMap","test","some","values","size","firstKey","next","value","delete","exports"],"sourceRoot":"../../../../../src","sources":["modules/bt-management/services/device-creator.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_integratedDevicesMap","require","_integratedDevices","_isCustomDeviceDefinition","_bc01Device","_bp2Device","_customDevice","_f4Device","_spo2Device","_verovalDuoControlDevice","_verovalEcgDevice","DEVICE_CLASSES","IntegratedDevices","BP2","BP2Device","F4","F4Device","PC60WF","SPO2Device","BC01","BC01Device","VEROVAL_DUO_CONTROL","VerovalDuoControlDevice","VEROVAL_ECG","VerovalEcgDevice","collectCustomDevices","acceptedDevices","customDevices","Map","matchers","Set","forEach","entry","index","isCustomDeviceDefinition","Error","has","id","nameMatch","source","set","add","DeviceCreator","deviceNameCache","CACHE_MAX_SIZE","constructor","acceptedDeviceNames","getDeviceName","foundName","undefined","get","matched","matchDeviceName","cacheDeviceName","createDevice","params","String","deviceName","trim","device","name","custom","CustomDevice","deviceClass","Object","keys","join","destroy","clear","regex","deviceType","integratedDevicesMap","test","some","values","size","firstKey","next","value","delete","exports"],"sourceRoot":"../../../../../src","sources":["modules/bt-management/services/device-creator.ts"],"mappings":"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","ignoreList":[]}
@@ -4,43 +4,16 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.BC01Device = void 0;
7
- var _core = require("@ovok/core");
8
7
  var _caseType = require("../../../types/case-type.js");
9
- var _hexToByte = require("../../../utils/hex-to-byte.js");
10
8
  var _btManagedDevice = require("../bt-managed-device.js");
11
- var _bc01CommandSequencer = require("./bc01-command-sequencer.js");
12
- var _bc01FrameParser = require("./bc01-frame-parser.js");
13
9
  var _bc01MainServices = require("./bc01.main-services.js");
14
- /** Minimum bytes a complete frame carries, keyed by its opening opcode. */
15
- const BC01_FRAME_MIN_LENGTH = {
16
- 0xf0: 2,
17
- // ACK
18
- 0xf2: 8,
19
- // Version reply (variable — 8 is the minimum PHMS reads before answering)
20
- 0xf3: 3,
21
- // Time-sync ack
22
- 0xe0: 7,
23
- // Record-count reply
24
- 0xe1: 16,
25
- // Stored URS record
26
- 0xe2: 16,
27
- // Paginated URS record
28
- 0xe3: 3,
29
- // Finish
30
- 0xe4: 36,
31
- // Quantitative record (optional path)
32
- 0xe5: 36 // Quantitative record (optional path)
33
- };
34
-
35
10
  /**
36
11
  * Contec BC401 (BC01) urine analyzer driver.
37
12
  *
38
- * The BC401 is a memory device, not a live stream: every measurement the
39
- * patient takes is written to onboard 500-slot flash the moment the strip
40
- * finishes reacting, and the app pulls stored records over BLE only after the
41
- * host walks the reset → version → set-time → count → get-records handshake
42
- * documented in `bc01-command-sequencer.ts`. Every record arrives as one
43
- * 16-byte E1/E2 frame on 0xFF02.
13
+ * The BC401 is a single-shot device: the patient dips a URS-7 strip, presses
14
+ * the button, and the device pushes exactly one result frame on 0xFF01. There
15
+ * is no streaming state, no per-tick updates, and no measurement session to
16
+ * open — the device auto-starts on button press.
44
17
  */
45
18
  class BC01Device extends _btManagedDevice.BTManagedDevice {
46
19
  onStreamStart = () => {};
@@ -48,101 +21,66 @@ class BC01Device extends _btManagedDevice.BTManagedDevice {
48
21
 
49
22
  /**
50
23
  * 90 s covers the maximum firmware-side reagent-pad settle time on a URS-7
51
- * strip and leaves headroom for a bulk memory dump of every stored record.
52
- * If the device does not push a frame within that window the data processor
53
- * times out and the driver surfaces "device unreachable".
24
+ * strip. If the device does not push a result frame within that window the
25
+ * data-processor times out and the driver surfaces "device unreachable".
54
26
  */
55
27
  stuckDataTimeout = 90_000;
56
- constructor(device, params) {
57
- super(device, params);
58
-
59
- /**
60
- * The BC401 answers one command with one frame and picks the next command
61
- * by the first byte of that frame. The sequencer walks reset → version →
62
- * set-time → count → records, and acknowledges the last record of every
63
- * set. The parent's default `pollingSequencerFor` would only re-send the
64
- * declared reset forever, which the firmware ignores after the first one.
65
- */
66
- this.createCommandSequencer = () => new _bc01CommandSequencer.Bc01CommandSequencer({
67
- write: {
68
- serviceUuid: _bc01MainServices.bc01MainServices[0].uuid,
69
- characteristicUuid: _bc01MainServices.bc01MainServices[0].writeUuid.uuid
70
- },
71
- onRefused: reason => this.onError?.(new Error(`BC401 handshake: ${reason}`))
72
- });
73
- }
74
-
75
- /**
76
- * Returns true once the notification buffer holds a complete BC401 frame,
77
- * classified by its opening opcode. Anything else — a heartbeat opcode we
78
- * do not recognise, or a partial buffer — is held back until enough bytes
79
- * arrive to make sense of it. There is no aa55 header on this hardware.
80
- */
81
28
  validatePackage = pkg => {
82
- if (pkg.length === 0) {
29
+ pkg = pkg.map(b => b.toLowerCase());
30
+ let headIndex = -1;
31
+ for (let i = 0; i < pkg.length - 1; i++) {
32
+ if (pkg[i] === "aa" && pkg[i + 1] === "55") {
33
+ headIndex = i;
34
+ break;
35
+ }
36
+ }
37
+ if (headIndex === -1) {
83
38
  return false;
84
39
  }
85
- const opcode = (0, _hexToByte.hexToByte)(pkg[0] ?? "");
86
- const minLength = BC01_FRAME_MIN_LENGTH[opcode];
87
- if (minLength === undefined) {
40
+ if (headIndex > 0) {
41
+ pkg = pkg.slice(headIndex);
42
+ }
43
+ if (pkg.length < 5) {
88
44
  return false;
89
45
  }
90
- return pkg.length >= minLength;
91
- };
92
-
93
- /**
94
- * The parsing model declares every E1/E2 frame as `DEPENDENT`, so this hook
95
- * runs for each record. We decode the raw bytes here — the packed 3-bits-per
96
- * -pad layout is not expressible in the declaration parser — and report the
97
- * reading directly through `onResult`. The frame is then handed back as
98
- * `OTHER` so the state machine does not report it a second time and does
99
- * not dedupe consecutive records that happen to share the same opcode.
100
- */
101
- handleDependentResult = data => {
102
- if (data.frame) {
103
- this.reportUrsRecord(data.frame);
46
+ const lengthByte = parseInt(pkg[2] ?? "0", 16) || 0;
47
+ const totalLen = 3 + lengthByte;
48
+ if (pkg.length < totalLen) {
49
+ return false;
104
50
  }
105
- return {
106
- ...data,
107
- parsingCase: {
108
- ...data.parsingCase,
109
- caseType: _caseType.CaseType.OTHER
110
- }
111
- };
51
+ return true;
112
52
  };
113
-
114
- /**
115
- * Nothing to do here for the BC401. Every reading arrives through the
116
- * dependent-result path, and the state machine sees only the `OTHER`-typed
117
- * echo we return from `handleDependentResult`.
118
- */
119
- handleSuccessResult() {
120
- return;
121
- }
122
- reportUrsRecord(frame) {
123
- const parsed = (0, _bc01FrameParser.parseBc01Record)(frame);
124
- if (!parsed) {
53
+ handleSuccessResult(successResult) {
54
+ if (successResult.caseType !== _caseType.CaseType.RESULT) {
125
55
  return;
126
56
  }
127
- const measuredValues = _bc01FrameParser.BC01_ANALYTE_ORDER.reduce((acc, analyte) => {
128
- const value = parsed.values[analyte];
129
- if (value !== undefined) {
130
- acc[analyte] = value;
131
- }
132
- return acc;
133
- }, {});
134
- if (Object.keys(measuredValues).length === 0) {
135
- this.onError?.("feedback-messages.measurement.disturb-detected-error");
57
+ if (!successResult.measurementTypeKey) {
58
+ this.onError?.(new Error(`Measurement type is undefined for case ${successResult.caseType}`));
59
+ return;
60
+ }
61
+ this.handleUrinalysisResult(successResult);
62
+ }
63
+ handleUrinalysisResult(successResult) {
64
+ const error = this.checkIfHasError(successResult);
65
+ if (error) {
66
+ this.onError?.(error);
136
67
  return;
137
68
  }
138
- const reading = {
139
- caseType: _caseType.CaseType.RESULT,
140
- measurementTypeKey: _core.MeasurementTypeKey.uricAcid,
141
- urineValues: [],
142
- recordedAt: parsed.timestamp,
143
- ...measuredValues
144
- };
145
- this.onResult?.(reading);
69
+ this.onResult?.(successResult);
70
+ }
71
+
72
+ /**
73
+ * A well-formed frame with all analyte fields still undefined means the
74
+ * device produced an empty read — typically a strip inserted upside down or
75
+ * removed before the reagent-pad timer completed.
76
+ */
77
+ checkIfHasError(successResult) {
78
+ const analytes = ["uro", "bld", "bil", "ket", "glu", "pro", "ph", "nit", "leu", "sg", "vc"];
79
+ const hasAnyReading = analytes.some(key => successResult[key] !== undefined);
80
+ if (!hasAnyReading) {
81
+ return "feedback-messages.measurement.disturb-detected-error";
82
+ }
83
+ return undefined;
146
84
  }
147
85
  }
148
86
  exports.BC01Device = BC01Device;
@@ -1 +1 @@
1
- {"version":3,"names":["_core","require","_caseType","_hexToByte","_btManagedDevice","_bc01CommandSequencer","_bc01FrameParser","_bc01MainServices","BC01_FRAME_MIN_LENGTH","BC01Device","BTManagedDevice","onStreamStart","mainServices","bc01MainServices","stuckDataTimeout","constructor","device","params","createCommandSequencer","Bc01CommandSequencer","write","serviceUuid","uuid","characteristicUuid","writeUuid","onRefused","reason","onError","Error","validatePackage","pkg","length","opcode","hexToByte","minLength","undefined","handleDependentResult","data","frame","reportUrsRecord","parsingCase","caseType","CaseType","OTHER","handleSuccessResult","parsed","parseBc01Record","measuredValues","BC01_ANALYTE_ORDER","reduce","acc","analyte","value","values","Object","keys","reading","RESULT","measurementTypeKey","MeasurementTypeKey","uricAcid","urineValues","recordedAt","timestamp","onResult","exports"],"sourceRoot":"../../../../../../../src","sources":["modules/bt-management/services/devices/bc01/bc01.device.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_caseType","require","_btManagedDevice","_bc01MainServices","BC01Device","BTManagedDevice","onStreamStart","mainServices","bc01MainServices","stuckDataTimeout","validatePackage","pkg","map","b","toLowerCase","headIndex","i","length","slice","lengthByte","parseInt","totalLen","handleSuccessResult","successResult","caseType","CaseType","RESULT","measurementTypeKey","onError","Error","handleUrinalysisResult","error","checkIfHasError","onResult","analytes","hasAnyReading","some","key","undefined","exports"],"sourceRoot":"../../../../../../../src","sources":["modules/bt-management/services/devices/bc01/bc01.device.ts"],"mappings":";;;;;;AAEA,IAAAA,SAAA,GAAAC,OAAA;AAKA,IAAAC,gBAAA,GAAAD,OAAA;AAEA,IAAAE,iBAAA,GAAAF,OAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMG,UAAU,SAASC,gCAAe,CAAyB;EAC5DC,aAAa,GAAeA,CAAA,KAAM,CAAC,CAAC;EAEpCC,YAAY,GAAeC,kCAAgB;;EAErD;AACF;AACA;AACA;AACA;EACYC,gBAAgB,GAAG,MAAM;EAEzBC,eAAe,GAAgCC,GAAG,IAAK;IAC/DA,GAAG,GAAGA,GAAG,CAACC,GAAG,CAAEC,CAAC,IAAKA,CAAC,CAACC,WAAW,CAAC,CAAC,CAAC;IAErC,IAAIC,SAAS,GAAG,CAAC,CAAC;IAElB,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGL,GAAG,CAACM,MAAM,GAAG,CAAC,EAAED,CAAC,EAAE,EAAE;MACvC,IAAIL,GAAG,CAACK,CAAC,CAAC,KAAK,IAAI,IAAIL,GAAG,CAACK,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,EAAE;QAC1CD,SAAS,GAAGC,CAAC;QACb;MACF;IACF;IAEA,IAAID,SAAS,KAAK,CAAC,CAAC,EAAE;MACpB,OAAO,KAAK;IACd;IAEA,IAAIA,SAAS,GAAG,CAAC,EAAE;MACjBJ,GAAG,GAAGA,GAAG,CAACO,KAAK,CAACH,SAAS,CAAC;IAC5B;IAEA,IAAIJ,GAAG,CAACM,MAAM,GAAG,CAAC,EAAE;MAClB,OAAO,KAAK;IACd;IAEA,MAAME,UAAU,GAAGC,QAAQ,CAACT,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC;IACnD,MAAMU,QAAQ,GAAG,CAAC,GAAGF,UAAU;IAE/B,IAAIR,GAAG,CAACM,MAAM,GAAGI,QAAQ,EAAE;MACzB,OAAO,KAAK;IACd;IAEA,OAAO,IAAI;EACb,CAAC;EAESC,mBAAmBA,CAC3BC,aAEC,EACe;IAChB,IAAIA,aAAa,CAACC,QAAQ,KAAKC,kBAAQ,CAACC,MAAM,EAAE;MAC9C;IACF;IAEA,IAAI,CAACH,aAAa,CAACI,kBAAkB,EAAE;MACrC,IAAI,CAACC,OAAO,GACV,IAAIC,KAAK,CACP,0CAA0CN,aAAa,CAACC,QAAQ,EAClE,CACF,CAAC;MAED;IACF;IAEA,IAAI,CAACM,sBAAsB,CAACP,aAAa,CAAC;EAC5C;EAEQO,sBAAsBA,CAC5BP,aAA+D,EACzD;IACN,MAAMQ,KAAK,GAAG,IAAI,CAACC,eAAe,CAACT,aAAa,CAAC;IAEjD,IAAIQ,KAAK,EAAE;MACT,IAAI,CAACH,OAAO,GAAGG,KAAK,CAAC;MAErB;IACF;IAEA,IAAI,CAACE,QAAQ,GAAGV,aAAa,CAAC;EAChC;;EAEA;AACF;AACA;AACA;AACA;EACUS,eAAeA,CACrBT,aAA+D,EAC3C;IACpB,MAAMW,QAA8C,GAAG,CACrD,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,IAAI,EACJ,KAAK,EACL,KAAK,EACL,IAAI,EACJ,IAAI,CACL;IAED,MAAMC,aAAa,GAAGD,QAAQ,CAACE,IAAI,CAChCC,GAAG,IAAKd,aAAa,CAACc,GAAG,CAAC,KAAKC,SAClC,CAAC;IAED,IAAI,CAACH,aAAa,EAAE;MAClB,OAAO,sDAAsD;IAC/D;IAEA,OAAOG,SAAS;EAClB;AACF;AAACC,OAAA,CAAAnC,UAAA,GAAAA,UAAA","ignoreList":[]}
@@ -9,57 +9,93 @@ var _caseType = require("../../../types/case-type.js");
9
9
  /**
10
10
  * Contec BC401 (a.k.a. BC01) urine analyzer — GATT profile.
11
11
  *
12
- * The BC401 uses Contec's proprietary FF12 service, shared across their
13
- * consumer medical devices. Every stored URS-7 measurement is pushed as a
14
- * 16-byte record on 0xFF02 after the host has walked the handshake documented
15
- * in `bc01-command-sequencer.ts`.
12
+ * The BC401 uses Contec's proprietary FF12 service, shared across their consumer
13
+ * medical devices. A single result notification carries a 7-parameter URS-7
14
+ * strip readout expanded into eleven analyte values on the wire.
16
15
  *
17
16
  * Service 0xFF12
18
- * Notify (result) 0xFF02 — CCCD 0x2902 must be written 01 00 to enable
19
- * Write (command) 0xFF01 — RESET / SET_TIME / GET_COUNT / GET_RECORDS
17
+ * Notify (result) 0xFF01 — CCCD 0x2902 must be written 01 00 to enable
18
+ * Write (command) 0xFF02 — RESET / SET_UNIT / REQUEST_HISTORY
20
19
  *
21
- * On the wire a stored URS record opens with 0xE1 (single) or 0xE2 (paginated).
22
- * The remaining fifteen bytes carry the flags nibble, timestamp, seven bytes of
23
- * packed 3-bit analyte indices, and a checksum. `bc01-frame-parser.ts` decodes
24
- * them; this file just declares the GATT surface and hands every E1/E2 frame
25
- * to the driver's dependent-result path so the parser can run.
20
+ * Wire layout of a result frame (Contec URS-7 firmware ≥ 1.2.x):
21
+ * [0..1] header "aa 55" — Contec sentinel
22
+ * [2] length byte after header
23
+ * [3] command "a1" == RESULT_URS7
24
+ * [4] strip type "07" == 7-panel
25
+ * [5..15] values one byte per analyte, encoding the discrete
26
+ * level index into diagnosticResults[key]
27
+ * [16] checksum xor over [2..15]
28
+ *
29
+ * Byte positions calibrated against PHMS 3.0.03 Android app; older firmware
30
+ * (< 1.2.x) uses a different command byte and is not supported by this driver
31
+ * (the validator will reject those frames).
26
32
  */
27
33
  const bc01MainServices = exports.bc01MainServices = [{
28
34
  uuid: "0000ff12-0000-1000-8000-00805f9b34fb",
29
- /**
30
- * PHMS 3.0.03 writes `[0x80, 0x00]` to 0xFF01 the moment its GATT
31
- * subscription is up — decompiled at L1/f.java:694 ("发送复位命令" — "send
32
- * reset command"). The device answers nothing until this reset lands. The
33
- * `Bc01CommandSequencer` returns the same reset from `initialCommands()`
34
- * so the SDK sends it whether or not the polling default is in play.
35
- */
36
- writeUuid: {
37
- uuid: "0000ff01-0000-1000-8000-00805f9b34fb",
38
- mainCommandUuid: "8000"
39
- },
40
35
  monitorUuids: [{
41
- uuid: "0000ff02-0000-1000-8000-00805f9b34fb",
42
- /**
43
- * We key on the first byte only. A `DEPENDENT` case fires
44
- * `handleDependentResult` in the driver, which runs the real decoder
45
- * (`parseBc01Record`) against the raw frame bytes and calls
46
- * `onResult` directly. The parsing case itself carries no field
47
- * definitions — the packed 3-bits-per-pad layout is not expressible
48
- * with the ordinary declaration parser and would need the vendor's
49
- * own decoding table pinned in a declaration to be so.
50
- */
36
+ uuid: "0000ff01-0000-1000-8000-00805f9b34fb",
51
37
  parsingModel: {
52
- caseValuePosition: [0],
38
+ caseValuePosition: [0, 1, 3, 4],
53
39
  cases: [{
54
40
  measurementTypeKey: _core.MeasurementTypeKey.uricAcid,
55
- caseType: _caseType.CaseType.DEPENDENT,
56
- caseValue: "e1",
57
- parseDefinitions: []
58
- }, {
59
- measurementTypeKey: _core.MeasurementTypeKey.uricAcid,
60
- caseType: _caseType.CaseType.DEPENDENT,
61
- caseValue: "e2",
62
- parseDefinitions: []
41
+ caseType: _caseType.CaseType.RESULT,
42
+ caseValue: "aa55a107",
43
+ parseDefinitions: [{
44
+ name: "uro",
45
+ parseType: "number",
46
+ byteIndexes: [5],
47
+ parseReference: 16
48
+ }, {
49
+ name: "bld",
50
+ parseType: "number",
51
+ byteIndexes: [6],
52
+ parseReference: 16
53
+ }, {
54
+ name: "bil",
55
+ parseType: "number",
56
+ byteIndexes: [7],
57
+ parseReference: 16
58
+ }, {
59
+ name: "ket",
60
+ parseType: "number",
61
+ byteIndexes: [8],
62
+ parseReference: 16
63
+ }, {
64
+ name: "glu",
65
+ parseType: "number",
66
+ byteIndexes: [9],
67
+ parseReference: 16
68
+ }, {
69
+ name: "pro",
70
+ parseType: "number",
71
+ byteIndexes: [10],
72
+ parseReference: 16
73
+ }, {
74
+ name: "ph",
75
+ parseType: "number",
76
+ byteIndexes: [11],
77
+ parseReference: 16
78
+ }, {
79
+ name: "nit",
80
+ parseType: "number",
81
+ byteIndexes: [12],
82
+ parseReference: 16
83
+ }, {
84
+ name: "leu",
85
+ parseType: "number",
86
+ byteIndexes: [13],
87
+ parseReference: 16
88
+ }, {
89
+ name: "sg",
90
+ parseType: "number",
91
+ byteIndexes: [14],
92
+ parseReference: 16
93
+ }, {
94
+ name: "vc",
95
+ parseType: "number",
96
+ byteIndexes: [15],
97
+ parseReference: 16
98
+ }]
63
99
  }]
64
100
  }
65
101
  }]
@@ -1 +1 @@
1
- {"version":3,"names":["_core","require","_caseType","bc01MainServices","exports","uuid","writeUuid","mainCommandUuid","monitorUuids","parsingModel","caseValuePosition","cases","measurementTypeKey","MeasurementTypeKey","uricAcid","caseType","CaseType","DEPENDENT","caseValue","parseDefinitions"],"sourceRoot":"../../../../../../../src","sources":["modules/bt-management/services/devices/bc01/bc01.main-services.ts"],"mappings":";;;;;;AAAA,IAAAA,KAAA,GAAAC,OAAA;AAEA,IAAAC,SAAA,GAAAD,OAAA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAME,gBAA4B,GAAAC,OAAA,CAAAD,gBAAA,GAAG,CAC1C;EACEE,IAAI,EAAE,sCAAsC;EAE5C;AACJ;AACA;AACA;AACA;AACA;AACA;EACIC,SAAS,EAAE;IACTD,IAAI,EAAE,sCAAsC;IAC5CE,eAAe,EAAE;EACnB,CAAC;EACDC,YAAY,EAAE,CACZ;IACEH,IAAI,EAAE,sCAAsC;IAE5C;AACR;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IACQI,YAAY,EAAE;MACZC,iBAAiB,EAAE,CAAC,CAAC,CAAC;MACtBC,KAAK,EAAE,CACL;QACEC,kBAAkB,EAAEC,wBAAkB,CAACC,QAAQ;QAC/CC,QAAQ,EAAEC,kBAAQ,CAACC,SAAS;QAC5BC,SAAS,EAAE,IAAI;QACfC,gBAAgB,EAAE;MACpB,CAAC,EACD;QACEP,kBAAkB,EAAEC,wBAAkB,CAACC,QAAQ;QAC/CC,QAAQ,EAAEC,kBAAQ,CAACC,SAAS;QAC5BC,SAAS,EAAE,IAAI;QACfC,gBAAgB,EAAE;MACpB,CAAC;IAEL;EACF,CAAC;AAEL,CAAC,CACF","ignoreList":[]}
1
+ {"version":3,"names":["_core","require","_caseType","bc01MainServices","exports","uuid","monitorUuids","parsingModel","caseValuePosition","cases","measurementTypeKey","MeasurementTypeKey","uricAcid","caseType","CaseType","RESULT","caseValue","parseDefinitions","name","parseType","byteIndexes","parseReference"],"sourceRoot":"../../../../../../../src","sources":["modules/bt-management/services/devices/bc01/bc01.main-services.ts"],"mappings":";;;;;;AAAA,IAAAA,KAAA,GAAAC,OAAA;AAEA,IAAAC,SAAA,GAAAD,OAAA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAME,gBAA4B,GAAAC,OAAA,CAAAD,gBAAA,GAAG,CAC1C;EACEE,IAAI,EAAE,sCAAsC;EAC5CC,YAAY,EAAE,CACZ;IACED,IAAI,EAAE,sCAAsC;IAC5CE,YAAY,EAAE;MACZC,iBAAiB,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;MAC/BC,KAAK,EAAE,CACL;QACEC,kBAAkB,EAAEC,wBAAkB,CAACC,QAAQ;QAC/CC,QAAQ,EAAEC,kBAAQ,CAACC,MAAM;QACzBC,SAAS,EAAE,UAAU;QACrBC,gBAAgB,EAAE,CAChB;UACEC,IAAI,EAAE,KAAK;UACXC,SAAS,EAAE,QAAQ;UACnBC,WAAW,EAAE,CAAC,CAAC,CAAC;UAChBC,cAAc,EAAE;QAClB,CAAC,EACD;UACEH,IAAI,EAAE,KAAK;UACXC,SAAS,EAAE,QAAQ;UACnBC,WAAW,EAAE,CAAC,CAAC,CAAC;UAChBC,cAAc,EAAE;QAClB,CAAC,EACD;UACEH,IAAI,EAAE,KAAK;UACXC,SAAS,EAAE,QAAQ;UACnBC,WAAW,EAAE,CAAC,CAAC,CAAC;UAChBC,cAAc,EAAE;QAClB,CAAC,EACD;UACEH,IAAI,EAAE,KAAK;UACXC,SAAS,EAAE,QAAQ;UACnBC,WAAW,EAAE,CAAC,CAAC,CAAC;UAChBC,cAAc,EAAE;QAClB,CAAC,EACD;UACEH,IAAI,EAAE,KAAK;UACXC,SAAS,EAAE,QAAQ;UACnBC,WAAW,EAAE,CAAC,CAAC,CAAC;UAChBC,cAAc,EAAE;QAClB,CAAC,EACD;UACEH,IAAI,EAAE,KAAK;UACXC,SAAS,EAAE,QAAQ;UACnBC,WAAW,EAAE,CAAC,EAAE,CAAC;UACjBC,cAAc,EAAE;QAClB,CAAC,EACD;UACEH,IAAI,EAAE,IAAI;UACVC,SAAS,EAAE,QAAQ;UACnBC,WAAW,EAAE,CAAC,EAAE,CAAC;UACjBC,cAAc,EAAE;QAClB,CAAC,EACD;UACEH,IAAI,EAAE,KAAK;UACXC,SAAS,EAAE,QAAQ;UACnBC,WAAW,EAAE,CAAC,EAAE,CAAC;UACjBC,cAAc,EAAE;QAClB,CAAC,EACD;UACEH,IAAI,EAAE,KAAK;UACXC,SAAS,EAAE,QAAQ;UACnBC,WAAW,EAAE,CAAC,EAAE,CAAC;UACjBC,cAAc,EAAE;QAClB,CAAC,EACD;UACEH,IAAI,EAAE,IAAI;UACVC,SAAS,EAAE,QAAQ;UACnBC,WAAW,EAAE,CAAC,EAAE,CAAC;UACjBC,cAAc,EAAE;QAClB,CAAC,EACD;UACEH,IAAI,EAAE,IAAI;UACVC,SAAS,EAAE,QAAQ;UACnBC,WAAW,EAAE,CAAC,EAAE,CAAC;UACjBC,cAAc,EAAE;QAClB,CAAC;MAEL,CAAC;IAEL;EACF,CAAC;AAEL,CAAC,CACF","ignoreList":[]}
@@ -10,6 +10,7 @@ export class BTManager {
10
10
  static MAX_DEVICES = 15; // Safety limit to prevent unbounded growth
11
11
  devices = new Map();
12
12
  eventSubscriptions = [];
13
+ lastScanTimestamp = 0;
13
14
  constructor(bleManager, acceptedDevices) {
14
15
  this.bleManager = bleManager;
15
16
  this.acceptedDevices = acceptedDevices;
@@ -24,6 +25,7 @@ export class BTManager {
24
25
  this.stateChangeListener.remove();
25
26
  this.stateChangeListener = undefined;
26
27
  }
28
+ this.lastScanTimestamp = 0;
27
29
 
28
30
  // Then clear all callbacks
29
31
  this.onErrorCallback = undefined;
@@ -37,6 +39,12 @@ export class BTManager {
37
39
  this.deviceCreator.destroy();
38
40
  };
39
41
  startScan = () => {
42
+ if (Date.now() - this.lastScanTimestamp < 60_000) {
43
+ sentryLogger("warning", "BT_MANAGER: startScan called too frequently, skipping (within 1 min window)");
44
+ return;
45
+ }
46
+ this.lastScanTimestamp = Date.now();
47
+
40
48
  // Remove previous state change listener to prevent accumulation
41
49
  if (this.stateChangeListener) {
42
50
  this.stateChangeListener.remove();
@@ -59,14 +67,12 @@ export class BTManager {
59
67
  }
60
68
  sentryLogger("warning", "BT_MANAGER: State is not PoweredOn, sending intent to enable Bluetooth");
61
69
 
62
- // Only send intent on Android — iOS has no programmatic way to power on
63
- // Bluetooth, and `bleManager.enable()` there returns an unsupported-op
64
- // promise that would surface as an unhandled rejection.
70
+ // Only send intent on Android
65
71
  if (Platform.OS === "android") {
66
72
  Linking.sendIntent("android.bluetooth.adapter.action.REQUEST_ENABLE");
67
- return;
73
+ } else {
74
+ this.bleManager.enable();
68
75
  }
69
- sentryLogger("warning", "BT_MANAGER: Bluetooth is off; on iOS the user must enable it from Settings");
70
76
  }, true);
71
77
 
72
78
  // Track subscription for proper cleanup
@@ -125,21 +131,13 @@ export class BTManager {
125
131
  });
126
132
  return;
127
133
  }
128
-
129
- /**
130
- * On iOS the advertised name arrives as `localName` while `name` stays null until the
131
- * device is connected. Dropping every ad without a `name` therefore hides real BC401
132
- * and other Contec hardware from the scan list. Fall back to `localName` so the same
133
- * matcher runs against the string the peripheral actually advertised.
134
- */
135
- const advertisedName = device?.name?.trim() || device?.localName?.trim() || "";
136
- if (!device || !advertisedName) {
134
+ if (!device || !device.name) {
137
135
  return;
138
136
  }
139
137
  if (this.devices.has(device.id)) {
140
138
  return;
141
139
  }
142
- const deviceName = this.deviceCreator.getDeviceName(advertisedName);
140
+ const deviceName = this.deviceCreator.getDeviceName(device.name);
143
141
  if (!deviceName) {
144
142
  return;
145
143
  }