@ovok/native 0.4.3 → 0.4.5
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/lib/commonjs/modules/bt-management/services/devices/bp2/bp2.device.js +8 -23
- package/lib/commonjs/modules/bt-management/services/devices/bp2/bp2.device.js.map +1 -1
- package/lib/commonjs/modules/bt-management/services/devices/bp2/bp2.frame-reader.js +89 -0
- package/lib/commonjs/modules/bt-management/services/devices/bp2/bp2.frame-reader.js.map +1 -0
- package/lib/commonjs/modules/bt-management/services/devices/bp2/bp2.main-services.js +50 -21
- package/lib/commonjs/modules/bt-management/services/devices/bp2/bp2.main-services.js.map +1 -1
- package/lib/commonjs/modules/bt-management/services/devices/bt-connection-handler.js +25 -1
- package/lib/commonjs/modules/bt-management/services/devices/bt-connection-handler.js.map +1 -1
- package/lib/commonjs/modules/bt-management/services/devices/bt-data-processor.js +80 -85
- package/lib/commonjs/modules/bt-management/services/devices/bt-data-processor.js.map +1 -1
- package/lib/commonjs/modules/bt-management/services/devices/bt-managed-device.js +25 -3
- package/lib/commonjs/modules/bt-management/services/devices/bt-managed-device.js.map +1 -1
- package/lib/commonjs/modules/bt-management/services/devices/frame-parser.js +54 -0
- package/lib/commonjs/modules/bt-management/services/devices/frame-parser.js.map +1 -0
- package/lib/commonjs/modules/bt-management/services/devices/measurement-state-machine.js +63 -0
- package/lib/commonjs/modules/bt-management/services/devices/measurement-state-machine.js.map +1 -0
- package/lib/commonjs/modules/bt-management/types/frame-read-result.js +6 -0
- package/lib/commonjs/modules/bt-management/types/frame-read-result.js.map +1 -0
- package/lib/commonjs/modules/bt-management/types/frame-read-status.js +17 -0
- package/lib/commonjs/modules/bt-management/types/frame-read-status.js.map +1 -0
- package/lib/commonjs/modules/bt-management/types/frame-reader.js +6 -0
- package/lib/commonjs/modules/bt-management/types/frame-reader.js.map +1 -0
- package/lib/commonjs/modules/bt-management/utils/calculate-crc-8.js +43 -0
- package/lib/commonjs/modules/bt-management/utils/calculate-crc-8.js.map +1 -0
- package/lib/commonjs/modules/bt-management/utils/convert-bp-state-flag.js +8 -1
- package/lib/commonjs/modules/bt-management/utils/convert-bp-state-flag.js.map +1 -1
- package/lib/commonjs/modules/bt-management/utils/le-16-from-hex.js.map +1 -1
- package/lib/commonjs/modules/data-sync/components/android/android-health-sync.js +11 -1
- package/lib/commonjs/modules/data-sync/components/android/android-health-sync.js.map +1 -1
- package/lib/commonjs/modules/data-sync/components/apple/apple-health-sync.js +33 -1
- package/lib/commonjs/modules/data-sync/components/apple/apple-health-sync.js.map +1 -1
- package/lib/commonjs/modules/data-sync/services/base-health-sync-service.js +4 -0
- package/lib/commonjs/modules/data-sync/services/base-health-sync-service.js.map +1 -1
- package/lib/commonjs/modules/data-sync/services/managers/storage-manager.js +30 -2
- package/lib/commonjs/modules/data-sync/services/managers/storage-manager.js.map +1 -1
- package/lib/commonjs/modules/data-sync/services/managers/sync-state-manager.js +19 -0
- package/lib/commonjs/modules/data-sync/services/managers/sync-state-manager.js.map +1 -1
- package/lib/module/modules/bt-management/services/devices/bp2/bp2.device.js +9 -23
- package/lib/module/modules/bt-management/services/devices/bp2/bp2.device.js.map +1 -1
- package/lib/module/modules/bt-management/services/devices/bp2/bp2.frame-reader.js +84 -0
- package/lib/module/modules/bt-management/services/devices/bp2/bp2.frame-reader.js.map +1 -0
- package/lib/module/modules/bt-management/services/devices/bp2/bp2.main-services.js +50 -21
- package/lib/module/modules/bt-management/services/devices/bp2/bp2.main-services.js.map +1 -1
- package/lib/module/modules/bt-management/services/devices/bt-connection-handler.js +25 -1
- package/lib/module/modules/bt-management/services/devices/bt-connection-handler.js.map +1 -1
- package/lib/module/modules/bt-management/services/devices/bt-data-processor.js +80 -85
- package/lib/module/modules/bt-management/services/devices/bt-data-processor.js.map +1 -1
- package/lib/module/modules/bt-management/services/devices/bt-managed-device.js +25 -3
- package/lib/module/modules/bt-management/services/devices/bt-managed-device.js.map +1 -1
- package/lib/module/modules/bt-management/services/devices/frame-parser.js +50 -0
- package/lib/module/modules/bt-management/services/devices/frame-parser.js.map +1 -0
- package/lib/module/modules/bt-management/services/devices/measurement-state-machine.js +58 -0
- package/lib/module/modules/bt-management/services/devices/measurement-state-machine.js.map +1 -0
- package/lib/module/modules/bt-management/types/frame-read-result.js +4 -0
- package/lib/module/modules/bt-management/types/frame-read-result.js.map +1 -0
- package/lib/module/modules/bt-management/types/frame-read-status.js +13 -0
- package/lib/module/modules/bt-management/types/frame-read-status.js.map +1 -0
- package/lib/module/modules/bt-management/types/frame-reader.js +4 -0
- package/lib/module/modules/bt-management/types/frame-reader.js.map +1 -0
- package/lib/module/modules/bt-management/utils/calculate-crc-8.js +38 -0
- package/lib/module/modules/bt-management/utils/calculate-crc-8.js.map +1 -0
- package/lib/module/modules/bt-management/utils/convert-bp-state-flag.js +9 -1
- package/lib/module/modules/bt-management/utils/convert-bp-state-flag.js.map +1 -1
- package/lib/module/modules/bt-management/utils/le-16-from-hex.js.map +1 -1
- package/lib/module/modules/data-sync/components/android/android-health-sync.js +11 -1
- package/lib/module/modules/data-sync/components/android/android-health-sync.js.map +1 -1
- package/lib/module/modules/data-sync/components/apple/apple-health-sync.js +33 -1
- package/lib/module/modules/data-sync/components/apple/apple-health-sync.js.map +1 -1
- package/lib/module/modules/data-sync/services/base-health-sync-service.js +4 -0
- package/lib/module/modules/data-sync/services/base-health-sync-service.js.map +1 -1
- package/lib/module/modules/data-sync/services/managers/storage-manager.js +30 -2
- package/lib/module/modules/data-sync/services/managers/storage-manager.js.map +1 -1
- package/lib/module/modules/data-sync/services/managers/sync-state-manager.js +19 -0
- package/lib/module/modules/data-sync/services/managers/sync-state-manager.js.map +1 -1
- package/lib/typescript/commonjs/src/modules/bt-management/services/devices/bp2/bp2.device.d.ts +3 -1
- package/lib/typescript/commonjs/src/modules/bt-management/services/devices/bp2/bp2.device.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/modules/bt-management/services/devices/bp2/bp2.frame-reader.d.ts +14 -0
- package/lib/typescript/commonjs/src/modules/bt-management/services/devices/bp2/bp2.frame-reader.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/modules/bt-management/services/devices/bp2/bp2.main-services.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/modules/bt-management/services/devices/bt-connection-handler.d.ts +9 -1
- package/lib/typescript/commonjs/src/modules/bt-management/services/devices/bt-connection-handler.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/modules/bt-management/services/devices/bt-data-processor.d.ts +27 -10
- package/lib/typescript/commonjs/src/modules/bt-management/services/devices/bt-data-processor.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/modules/bt-management/services/devices/bt-managed-device.d.ts +23 -1
- package/lib/typescript/commonjs/src/modules/bt-management/services/devices/bt-managed-device.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/modules/bt-management/services/devices/frame-parser.d.ts +19 -0
- package/lib/typescript/commonjs/src/modules/bt-management/services/devices/frame-parser.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/modules/bt-management/services/devices/measurement-state-machine.d.ts +30 -0
- package/lib/typescript/commonjs/src/modules/bt-management/services/devices/measurement-state-machine.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/modules/bt-management/types/frame-read-result.d.ts +21 -0
- package/lib/typescript/commonjs/src/modules/bt-management/types/frame-read-result.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/modules/bt-management/types/frame-read-status.d.ts +10 -0
- package/lib/typescript/commonjs/src/modules/bt-management/types/frame-read-status.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/modules/bt-management/types/frame-reader.d.ts +13 -0
- package/lib/typescript/commonjs/src/modules/bt-management/types/frame-reader.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/modules/bt-management/utils/calculate-crc-8.d.ts +10 -0
- package/lib/typescript/commonjs/src/modules/bt-management/utils/calculate-crc-8.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/modules/bt-management/utils/convert-bp-state-flag.d.ts +7 -0
- package/lib/typescript/commonjs/src/modules/bt-management/utils/convert-bp-state-flag.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/modules/bt-management/utils/le-16-from-hex.d.ts +1 -1
- package/lib/typescript/commonjs/src/modules/bt-management/utils/le-16-from-hex.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/modules/data-sync/components/android/android-health-sync.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/modules/data-sync/components/apple/apple-health-sync.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/modules/data-sync/services/base-health-sync-service.d.ts +2 -0
- package/lib/typescript/commonjs/src/modules/data-sync/services/base-health-sync-service.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/modules/data-sync/services/managers/storage-manager.d.ts +20 -0
- package/lib/typescript/commonjs/src/modules/data-sync/services/managers/storage-manager.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/modules/data-sync/services/managers/sync-state-manager.d.ts +13 -0
- package/lib/typescript/commonjs/src/modules/data-sync/services/managers/sync-state-manager.d.ts.map +1 -1
- package/lib/typescript/module/src/modules/bt-management/services/devices/bp2/bp2.device.d.ts +3 -1
- package/lib/typescript/module/src/modules/bt-management/services/devices/bp2/bp2.device.d.ts.map +1 -1
- package/lib/typescript/module/src/modules/bt-management/services/devices/bp2/bp2.frame-reader.d.ts +14 -0
- package/lib/typescript/module/src/modules/bt-management/services/devices/bp2/bp2.frame-reader.d.ts.map +1 -0
- package/lib/typescript/module/src/modules/bt-management/services/devices/bp2/bp2.main-services.d.ts.map +1 -1
- package/lib/typescript/module/src/modules/bt-management/services/devices/bt-connection-handler.d.ts +9 -1
- package/lib/typescript/module/src/modules/bt-management/services/devices/bt-connection-handler.d.ts.map +1 -1
- package/lib/typescript/module/src/modules/bt-management/services/devices/bt-data-processor.d.ts +27 -10
- package/lib/typescript/module/src/modules/bt-management/services/devices/bt-data-processor.d.ts.map +1 -1
- package/lib/typescript/module/src/modules/bt-management/services/devices/bt-managed-device.d.ts +23 -1
- package/lib/typescript/module/src/modules/bt-management/services/devices/bt-managed-device.d.ts.map +1 -1
- package/lib/typescript/module/src/modules/bt-management/services/devices/frame-parser.d.ts +19 -0
- package/lib/typescript/module/src/modules/bt-management/services/devices/frame-parser.d.ts.map +1 -0
- package/lib/typescript/module/src/modules/bt-management/services/devices/measurement-state-machine.d.ts +30 -0
- package/lib/typescript/module/src/modules/bt-management/services/devices/measurement-state-machine.d.ts.map +1 -0
- package/lib/typescript/module/src/modules/bt-management/types/frame-read-result.d.ts +21 -0
- package/lib/typescript/module/src/modules/bt-management/types/frame-read-result.d.ts.map +1 -0
- package/lib/typescript/module/src/modules/bt-management/types/frame-read-status.d.ts +10 -0
- package/lib/typescript/module/src/modules/bt-management/types/frame-read-status.d.ts.map +1 -0
- package/lib/typescript/module/src/modules/bt-management/types/frame-reader.d.ts +13 -0
- package/lib/typescript/module/src/modules/bt-management/types/frame-reader.d.ts.map +1 -0
- package/lib/typescript/module/src/modules/bt-management/utils/calculate-crc-8.d.ts +10 -0
- package/lib/typescript/module/src/modules/bt-management/utils/calculate-crc-8.d.ts.map +1 -0
- package/lib/typescript/module/src/modules/bt-management/utils/convert-bp-state-flag.d.ts +7 -0
- package/lib/typescript/module/src/modules/bt-management/utils/convert-bp-state-flag.d.ts.map +1 -1
- package/lib/typescript/module/src/modules/bt-management/utils/le-16-from-hex.d.ts +1 -1
- package/lib/typescript/module/src/modules/bt-management/utils/le-16-from-hex.d.ts.map +1 -1
- package/lib/typescript/module/src/modules/data-sync/components/android/android-health-sync.d.ts.map +1 -1
- package/lib/typescript/module/src/modules/data-sync/components/apple/apple-health-sync.d.ts.map +1 -1
- package/lib/typescript/module/src/modules/data-sync/services/base-health-sync-service.d.ts +2 -0
- package/lib/typescript/module/src/modules/data-sync/services/base-health-sync-service.d.ts.map +1 -1
- package/lib/typescript/module/src/modules/data-sync/services/managers/storage-manager.d.ts +20 -0
- package/lib/typescript/module/src/modules/data-sync/services/managers/storage-manager.d.ts.map +1 -1
- package/lib/typescript/module/src/modules/data-sync/services/managers/sync-state-manager.d.ts +13 -0
- package/lib/typescript/module/src/modules/data-sync/services/managers/sync-state-manager.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
|
|
3
3
|
import { MeasurementTypeKey, EcgDiagnosticFlag } from "@ovok/core";
|
|
4
4
|
import { BloodPressureStates } from "@ovok/core/dist/client/observation/types/measurement/BloodPressureStates";
|
|
5
|
-
import { sentryLogger } from "../../../../helpers/utils/sentry-logger.js";
|
|
6
5
|
import { bloodPressureTranslatedExceptionMap } from "../../../constants/blood-pressure-translated-exception-map.js";
|
|
7
6
|
import { CaseType } from "../../../types/case-type.js";
|
|
8
7
|
import { hexToByte } from "../../../utils/hex-to-byte.js";
|
|
@@ -10,7 +9,14 @@ import { i16FromHex } from "../../../utils/i-16-from-hex.js";
|
|
|
10
9
|
import { le16FromHex } from "../../../utils/le-16-from-hex.js";
|
|
11
10
|
import { le32FromHex } from "../../../utils/le-32-from-hex.js";
|
|
12
11
|
import { BTManagedDevice } from "../bt-managed-device.js";
|
|
12
|
+
import { BP2FrameReader } from "./bp2.frame-reader.js";
|
|
13
13
|
import { bp2MainServices } from "./bp2.main-services.js";
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Leaves a 244 byte payload, enough for an ECG waveform frame to arrive in far fewer
|
|
17
|
+
* notifications than the 23 byte default allows.
|
|
18
|
+
*/
|
|
19
|
+
const BP2_PREFERRED_MTU = 247;
|
|
14
20
|
export class BP2Device extends BTManagedDevice {
|
|
15
21
|
collectedValues = [];
|
|
16
22
|
diagramPoints = [];
|
|
@@ -22,28 +28,8 @@ export class BP2Device extends BTManagedDevice {
|
|
|
22
28
|
this.diagramPoints = [];
|
|
23
29
|
this.duration = 0;
|
|
24
30
|
};
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
sentryLogger("info", "BP2_DEVICE: Package does not start with a5");
|
|
28
|
-
const headIndex = pkg.indexOf("a5");
|
|
29
|
-
if (headIndex > 0) {
|
|
30
|
-
pkg = pkg.slice(headIndex);
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
if (pkg.length < 7) {
|
|
34
|
-
sentryLogger("info", "BP2_DEVICE: Package is shorter than 7 bytes");
|
|
35
|
-
return false;
|
|
36
|
-
}
|
|
37
|
-
const toNum = hex => parseInt(hex, 16);
|
|
38
|
-
const lenL = toNum(pkg[5] || "0");
|
|
39
|
-
const lenH = toNum(pkg[6] || "0");
|
|
40
|
-
const dataLen = lenL | lenH << 8;
|
|
41
|
-
const totalLen = 7 + dataLen + 1;
|
|
42
|
-
if (pkg.length < totalLen) {
|
|
43
|
-
return false;
|
|
44
|
-
}
|
|
45
|
-
return true;
|
|
46
|
-
};
|
|
31
|
+
frameReader = new BP2FrameReader();
|
|
32
|
+
preferredMtu = BP2_PREFERRED_MTU;
|
|
47
33
|
handleSuccessResult(successResult, collectedValues) {
|
|
48
34
|
this.collectedValues = collectedValues;
|
|
49
35
|
if (!successResult.measurementTypeKey || !successResult.caseType) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["MeasurementTypeKey","EcgDiagnosticFlag","BloodPressureStates","
|
|
1
|
+
{"version":3,"names":["MeasurementTypeKey","EcgDiagnosticFlag","BloodPressureStates","bloodPressureTranslatedExceptionMap","CaseType","hexToByte","i16FromHex","le16FromHex","le32FromHex","BTManagedDevice","BP2FrameReader","bp2MainServices","BP2_PREFERRED_MTU","BP2Device","collectedValues","diagramPoints","duration","mainServices","stuckDataTimeout","onStreamStart","frameReader","preferredMtu","handleSuccessResult","successResult","measurementTypeKey","caseType","onError","Error","ecg","handleEcgResult","bloodPressure","handleBloodPressureResult","RESULT","error","checkIfHasErrorForEcg","onResult","handleEcgStream","lenL","lenH","dataLen","dataStart","dataEnd","data","slice","samplingNum","samplesStart","i","byteIndexInData","sampleVal","push","checkIfHasErrorForBloodPressure","bpMeasurement","status","undefined","diastolic","systolic","heartRate","REGULAR","errorString","get","DEVICE_ERROR","ecgMeasurement","diagnosticResult","POOR_WAVEFORM","LEAD_OFF","length"],"sourceRoot":"../../../../../../../src","sources":["modules/bt-management/services/devices/bp2/bp2.device.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { FrameReadStatus } from "../../../types/frame-read-status.js";
|
|
4
|
+
import { calculateCrc8 } from "../../../utils/calculate-crc-8.js";
|
|
5
|
+
import { hexToByte } from "../../../utils/hex-to-byte.js";
|
|
6
|
+
import { le16FromHex } from "../../../utils/le-16-from-hex.js";
|
|
7
|
+
const FRAME_START_BYTE = "a5";
|
|
8
|
+
const COMMAND_INDEX = 1;
|
|
9
|
+
const COMMAND_COMPLEMENT_INDEX = 2;
|
|
10
|
+
const PAYLOAD_LENGTH_INDEX = 5;
|
|
11
|
+
const HEADER_BYTES = 7;
|
|
12
|
+
const CHECKSUM_BYTES = 1;
|
|
13
|
+
const BYTE_MASK = 0xff;
|
|
14
|
+
|
|
15
|
+
/** Start byte, command and its complement: the shortest run that can identify a start. */
|
|
16
|
+
const START_PATTERN_BYTES = 3;
|
|
17
|
+
const isFrameStart = (buffer, index) => {
|
|
18
|
+
if ((buffer[index] || "").toLowerCase() !== FRAME_START_BYTE) {
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
const command = hexToByte(buffer[index + COMMAND_INDEX] || "0");
|
|
22
|
+
const complement = hexToByte(buffer[index + COMMAND_COMPLEMENT_INDEX] || "0");
|
|
23
|
+
return command === (~complement & BYTE_MASK);
|
|
24
|
+
};
|
|
25
|
+
const findFrameStart = buffer => {
|
|
26
|
+
const lastCandidate = buffer.length - START_PATTERN_BYTES;
|
|
27
|
+
for (let index = 0; index <= lastCandidate; index++) {
|
|
28
|
+
if (isFrameStart(buffer, index)) {
|
|
29
|
+
return index;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return -1;
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Bytes that cannot begin a frame start, and are therefore safe to drop when no start
|
|
37
|
+
* was found. The trailing bytes are kept because a start pattern may still be arriving.
|
|
38
|
+
*/
|
|
39
|
+
const droppableLeadingBytes = buffer => Math.max(0, buffer.length - (START_PATTERN_BYTES - 1));
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Reads Lepu protocol frames as used by the BP2.
|
|
43
|
+
*
|
|
44
|
+
* Layout: `a5 | cmd | ~cmd | type | seq | lenLow lenHigh | payload | crc8`, where the
|
|
45
|
+
* checksum covers every byte before it. The complement of the command byte only narrows
|
|
46
|
+
* the search for a start; the checksum is what actually decides a frame is trustworthy.
|
|
47
|
+
*/
|
|
48
|
+
export class BP2FrameReader {
|
|
49
|
+
readFrame(buffer) {
|
|
50
|
+
const start = findFrameStart(buffer);
|
|
51
|
+
if (start === -1) {
|
|
52
|
+
return {
|
|
53
|
+
status: FrameReadStatus.INCOMPLETE,
|
|
54
|
+
consumedBytes: droppableLeadingBytes(buffer)
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
const payloadLength = le16FromHex(buffer, start + PAYLOAD_LENGTH_INDEX);
|
|
58
|
+
const frameLength = HEADER_BYTES + payloadLength + CHECKSUM_BYTES;
|
|
59
|
+
if (start + frameLength > buffer.length) {
|
|
60
|
+
return {
|
|
61
|
+
status: FrameReadStatus.INCOMPLETE,
|
|
62
|
+
consumedBytes: start
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
const frame = buffer.slice(start, start + frameLength);
|
|
66
|
+
if (!this.hasValidChecksum(frame)) {
|
|
67
|
+
return {
|
|
68
|
+
status: FrameReadStatus.CORRUPT,
|
|
69
|
+
consumedBytes: start + START_PATTERN_BYTES
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
return {
|
|
73
|
+
status: FrameReadStatus.COMPLETE,
|
|
74
|
+
consumedBytes: start + frameLength,
|
|
75
|
+
frame
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
hasValidChecksum(frame) {
|
|
79
|
+
const checksummedBytes = frame.length - CHECKSUM_BYTES;
|
|
80
|
+
const declared = hexToByte(frame[checksummedBytes] || "0");
|
|
81
|
+
return declared === calculateCrc8(frame, checksummedBytes);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=bp2.frame-reader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["FrameReadStatus","calculateCrc8","hexToByte","le16FromHex","FRAME_START_BYTE","COMMAND_INDEX","COMMAND_COMPLEMENT_INDEX","PAYLOAD_LENGTH_INDEX","HEADER_BYTES","CHECKSUM_BYTES","BYTE_MASK","START_PATTERN_BYTES","isFrameStart","buffer","index","toLowerCase","command","complement","findFrameStart","lastCandidate","length","droppableLeadingBytes","Math","max","BP2FrameReader","readFrame","start","status","INCOMPLETE","consumedBytes","payloadLength","frameLength","frame","slice","hasValidChecksum","CORRUPT","COMPLETE","checksummedBytes","declared"],"sourceRoot":"../../../../../../../src","sources":["modules/bt-management/services/devices/bp2/bp2.frame-reader.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -4,6 +4,27 @@ import { MeasurementTypeKey } from "@ovok/core";
|
|
|
4
4
|
import { CaseType } from "../../../types/case-type.js";
|
|
5
5
|
import { convertBpStateFlag } from "../../../utils/convert-bp-state-flag.js";
|
|
6
6
|
import { convertEcgDiagnosticFlag } from "../../../utils/convert-ecg-diagnostic-flag.js";
|
|
7
|
+
const bloodPressureResultFields = [{
|
|
8
|
+
name: "systolic",
|
|
9
|
+
parseType: "number",
|
|
10
|
+
byteIndexes: [21, 20],
|
|
11
|
+
parseReference: 16
|
|
12
|
+
}, {
|
|
13
|
+
name: "diastolic",
|
|
14
|
+
parseType: "number",
|
|
15
|
+
byteIndexes: [23, 22],
|
|
16
|
+
parseReference: 16
|
|
17
|
+
}, {
|
|
18
|
+
name: "heartRate",
|
|
19
|
+
parseType: "number",
|
|
20
|
+
byteIndexes: [27, 26],
|
|
21
|
+
parseReference: 16
|
|
22
|
+
}, {
|
|
23
|
+
name: "status",
|
|
24
|
+
parseType: "custom",
|
|
25
|
+
byteIndexes: [28],
|
|
26
|
+
customParserDefinition: a => convertBpStateFlag(a)
|
|
27
|
+
}];
|
|
7
28
|
export const bp2MainServices = [{
|
|
8
29
|
uuid: "14839ac4-7d7e-415c-9a42-167340cf2339",
|
|
9
30
|
monitorUuids: [{
|
|
@@ -48,27 +69,35 @@ export const bp2MainServices = [{
|
|
|
48
69
|
measurementTypeKey: MeasurementTypeKey.bloodPressure,
|
|
49
70
|
caseType: CaseType.RESULT,
|
|
50
71
|
caseValue: "a50805",
|
|
51
|
-
parseDefinitions: [
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
+
parseDefinitions: [...bloodPressureResultFields]
|
|
73
|
+
}, {
|
|
74
|
+
measurementTypeKey: MeasurementTypeKey.bloodPressure,
|
|
75
|
+
caseType: CaseType.STREAM,
|
|
76
|
+
caseValue: "a5080f",
|
|
77
|
+
parseDefinitions: [],
|
|
78
|
+
description: "Averaging run: a measurement is in progress"
|
|
79
|
+
}, {
|
|
80
|
+
measurementTypeKey: MeasurementTypeKey.bloodPressure,
|
|
81
|
+
caseType: CaseType.STREAM,
|
|
82
|
+
caseValue: "a50810",
|
|
83
|
+
parseDefinitions: [],
|
|
84
|
+
description: "Averaging run: waiting between measurements, run not finished"
|
|
85
|
+
}, {
|
|
86
|
+
measurementTypeKey: MeasurementTypeKey.bloodPressure,
|
|
87
|
+
caseType: CaseType.RESULT,
|
|
88
|
+
caseValue: "a50811",
|
|
89
|
+
parseDefinitions: bloodPressureResultFields,
|
|
90
|
+
description: "Averaging run finished. Carries the same payload as a single measurement"
|
|
91
|
+
}, {
|
|
92
|
+
caseType: CaseType.OTHER,
|
|
93
|
+
caseValue: "a50814",
|
|
94
|
+
parseDefinitions: [],
|
|
95
|
+
description: "Venous congestion detected, measurement abandoned"
|
|
96
|
+
}, {
|
|
97
|
+
caseType: CaseType.OTHER,
|
|
98
|
+
caseValue: "a508ff",
|
|
99
|
+
parseDefinitions: [],
|
|
100
|
+
description: "Device reports an invalid state"
|
|
72
101
|
}, {
|
|
73
102
|
measurementTypeKey: MeasurementTypeKey.ecg,
|
|
74
103
|
caseType: CaseType.STREAM,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["MeasurementTypeKey","CaseType","convertBpStateFlag","convertEcgDiagnosticFlag","
|
|
1
|
+
{"version":3,"names":["MeasurementTypeKey","CaseType","convertBpStateFlag","convertEcgDiagnosticFlag","bloodPressureResultFields","name","parseType","byteIndexes","parseReference","customParserDefinition","a","bp2MainServices","uuid","monitorUuids","parsingModel","caseValuePosition","cases","caseType","OTHER","caseValue","parseDefinitions","description","measurementTypeKey","bloodPressure","STREAM","RESULT","ecg","writeUuid","mainCommandUuid"],"sourceRoot":"../../../../../../../src","sources":["modules/bt-management/services/devices/bp2/bp2.main-services.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -9,14 +9,16 @@ export class BTConnectionHandler {
|
|
|
9
9
|
characteristicSubscriptions = [];
|
|
10
10
|
isSendingCommand = false;
|
|
11
11
|
retryCount = 0;
|
|
12
|
-
constructor(device, mainServices, callbacks) {
|
|
12
|
+
constructor(device, mainServices, callbacks, preferredMtu) {
|
|
13
13
|
this.device = device;
|
|
14
14
|
this.mainServices = mainServices;
|
|
15
15
|
this.callbacks = callbacks;
|
|
16
|
+
this.preferredMtu = preferredMtu;
|
|
16
17
|
}
|
|
17
18
|
connect = async () => {
|
|
18
19
|
try {
|
|
19
20
|
await this.connectWithRetries();
|
|
21
|
+
await this.requestPreferredMtu();
|
|
20
22
|
this.callbacks.onStatusChanged?.(DeviceStatus.CONNECTED);
|
|
21
23
|
await this.device.discoverAllServicesAndCharacteristics();
|
|
22
24
|
this.onDisconnectSubscription = this.device.onDisconnected(this.onDeviceDisconnected);
|
|
@@ -50,6 +52,28 @@ export class BTConnectionHandler {
|
|
|
50
52
|
this.isSendingCommand = false;
|
|
51
53
|
this.retryCount = 0;
|
|
52
54
|
};
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Asks for a larger MTU so a frame arrives in fewer notifications.
|
|
58
|
+
*
|
|
59
|
+
* A device or platform that will not grant it keeps working at the default, so a
|
|
60
|
+
* refusal is recorded and the connection continues.
|
|
61
|
+
*/
|
|
62
|
+
requestPreferredMtu = async () => {
|
|
63
|
+
if (!this.preferredMtu) {
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
try {
|
|
67
|
+
await this.device.requestMTU(this.preferredMtu);
|
|
68
|
+
} catch (error) {
|
|
69
|
+
sentryLogger("info", "DEVICE: MTU request was not granted", {
|
|
70
|
+
deviceId: this.device.id,
|
|
71
|
+
deviceName: this.device.name,
|
|
72
|
+
requestedMtu: this.preferredMtu,
|
|
73
|
+
error: error instanceof Error ? error.message : String(error)
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
};
|
|
53
77
|
connectWithRetries = async () => {
|
|
54
78
|
const maxRetries = 5;
|
|
55
79
|
const retryDelay = 1000;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["slog","sentryLogger","DeviceStatus","base64ToHex","hexToBase64","BTConnectionHandler","characteristicSubscriptions","isSendingCommand","retryCount","constructor","device","mainServices","callbacks","connect","connectWithRetries","onStatusChanged","CONNECTED","discoverAllServicesAndCharacteristics","onDisconnectSubscription","onDisconnected","onDeviceDisconnected","subscribeToAllCharacteristics","error","Error","message","deviceName","name","onError","DISCONNECTED","destroy","forEach","sub","remove","sendCommandToDevice","mainService","writeUuid","sendCommand","
|
|
1
|
+
{"version":3,"names":["slog","sentryLogger","DeviceStatus","base64ToHex","hexToBase64","BTConnectionHandler","characteristicSubscriptions","isSendingCommand","retryCount","constructor","device","mainServices","callbacks","preferredMtu","connect","connectWithRetries","requestPreferredMtu","onStatusChanged","CONNECTED","discoverAllServicesAndCharacteristics","onDisconnectSubscription","onDisconnected","onDeviceDisconnected","subscribeToAllCharacteristics","error","Error","message","deviceName","name","onError","DISCONNECTED","destroy","forEach","sub","remove","sendCommandToDevice","mainService","writeUuid","sendCommand","requestMTU","deviceId","id","requestedMtu","String","maxRetries","retryDelay","maxDelay","connected","isConnected","errorCode","willRetry","Promise","resolve","setTimeout","Math","min","pow","monitorUuid","monitorUuids","subscription","monitorCharacteristicForService","uuid","result","value","hexValue","onDataReceived","push","command","mainCommandUuid","writeCharacteristicWithResponseForService"],"sourceRoot":"../../../../../../src","sources":["modules/bt-management/services/devices/bt-connection-handler.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
+
import { sentryLogger } from "../../../helpers/utils/sentry-logger.js";
|
|
3
4
|
import { CaseType } from "../../types/case-type.js";
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
5
|
+
import { FrameReadStatus } from "../../types/frame-read-status.js";
|
|
6
|
+
import { FrameParser } from "./frame-parser.js";
|
|
7
|
+
import { MeasurementStateMachine } from "./measurement-state-machine.js";
|
|
6
8
|
export class BTDataProcessor {
|
|
7
9
|
/**
|
|
8
10
|
* One buffer per characteristic.
|
|
@@ -14,21 +16,23 @@ export class BTDataProcessor {
|
|
|
14
16
|
* error. Keeping the buffers apart makes that impossible.
|
|
15
17
|
*/
|
|
16
18
|
buffers = new Map();
|
|
17
|
-
|
|
18
|
-
constructor(device, mainServices, stuckDataTimeoutDuration, callbacks) {
|
|
19
|
+
constructor(device, mainServices, stuckDataTimeoutDuration, callbacks, frameReader) {
|
|
19
20
|
this.device = device;
|
|
20
|
-
this.mainServices = mainServices;
|
|
21
21
|
this.stuckDataTimeoutDuration = stuckDataTimeoutDuration;
|
|
22
22
|
this.callbacks = callbacks;
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
23
|
+
this.frameReader = frameReader;
|
|
24
|
+
this.frameParser = new FrameParser(mainServices);
|
|
25
|
+
this.measurementState = new MeasurementStateMachine({
|
|
26
|
+
onStatusChanged: callbacks.onStatusChanged,
|
|
27
|
+
onStreamStart: callbacks.onStreamStart,
|
|
28
|
+
onResult: callbacks.onResult
|
|
29
|
+
});
|
|
26
30
|
}
|
|
27
31
|
currentUuid = "";
|
|
28
32
|
destroy = () => {
|
|
29
33
|
this.buffers.clear();
|
|
30
34
|
this.currentUuid = "";
|
|
31
|
-
this.
|
|
35
|
+
this.measurementState.reset();
|
|
32
36
|
clearTimeout(this.stuckDataTimeout);
|
|
33
37
|
this.stuckDataTimeout = undefined;
|
|
34
38
|
};
|
|
@@ -38,13 +42,61 @@ export class BTDataProcessor {
|
|
|
38
42
|
buffer.push(...hexValue);
|
|
39
43
|
this.buffers.set(this.currentUuid, buffer);
|
|
40
44
|
this.startStuckTimeout();
|
|
41
|
-
|
|
42
|
-
|
|
45
|
+
if (this.frameReader) {
|
|
46
|
+
this.readFramesFromBuffer(this.frameReader, uuid, buffer);
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
this.readWholeBuffer(uuid, buffer);
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Drains every complete frame the buffer holds.
|
|
54
|
+
*
|
|
55
|
+
* One notification can complete several frames and can also carry bytes that belong to
|
|
56
|
+
* no frame at all, so the reader is asked repeatedly until it stops making progress.
|
|
57
|
+
* A frame that fails its integrity check is reported and skipped rather than parsed.
|
|
58
|
+
*/
|
|
59
|
+
readFramesFromBuffer = (reader, uuid, buffer) => {
|
|
60
|
+
let hasReadFrame = false;
|
|
61
|
+
while (buffer.length > 0) {
|
|
62
|
+
const result = reader.readFrame(buffer);
|
|
63
|
+
const hasProgressed = result.consumedBytes > 0;
|
|
64
|
+
buffer.splice(0, result.consumedBytes);
|
|
65
|
+
if (result.status === FrameReadStatus.COMPLETE) {
|
|
66
|
+
hasReadFrame = true;
|
|
67
|
+
this.handleFrame(uuid, result.frame);
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
if (result.status === FrameReadStatus.CORRUPT) {
|
|
71
|
+
this.reportCorruptFrame();
|
|
72
|
+
}
|
|
73
|
+
if (result.status === FrameReadStatus.INCOMPLETE || !hasProgressed) {
|
|
74
|
+
break;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
if (hasReadFrame) {
|
|
78
|
+
this.callbacks.onSendCommandToDevice?.();
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Treats the whole buffer as one frame, for devices that have not declared a reader.
|
|
84
|
+
*/
|
|
85
|
+
readWholeBuffer = (uuid, buffer) => {
|
|
86
|
+
if (!this.callbacks.validatePackage(buffer, uuid)) {
|
|
43
87
|
return;
|
|
44
88
|
}
|
|
45
|
-
|
|
89
|
+
this.handleFrame(uuid, buffer);
|
|
90
|
+
this.buffers.set(this.currentUuid, []);
|
|
91
|
+
this.callbacks.onSendCommandToDevice?.();
|
|
92
|
+
};
|
|
93
|
+
handleFrame = (uuid, frame) => {
|
|
94
|
+
const data = this.frameParser.parse(uuid, frame);
|
|
46
95
|
if (!data) {
|
|
47
|
-
|
|
96
|
+
sentryLogger("info", "BT_MANAGER: Frame matched no declared case", {
|
|
97
|
+
uuid,
|
|
98
|
+
frame: frame.join("")
|
|
99
|
+
});
|
|
48
100
|
return;
|
|
49
101
|
}
|
|
50
102
|
|
|
@@ -56,81 +108,24 @@ export class BTDataProcessor {
|
|
|
56
108
|
if (data.parsingCase.caseType === CaseType.DEPENDENT) {
|
|
57
109
|
dependentData = this.callbacks.handleDependentResult?.(data);
|
|
58
110
|
}
|
|
59
|
-
this.
|
|
60
|
-
this.resetDataAndSendCommandToDevice();
|
|
111
|
+
this.measurementState.advance(dependentData || data, frame);
|
|
61
112
|
};
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
}
|
|
67
|
-
const value = parsingModel.caseValuePosition?.map(index => this.collectedValues[index]).join("") || "";
|
|
68
|
-
const parsingCase = this.findParsingCase(value, parsingModel);
|
|
69
|
-
if (!parsingCase) {
|
|
70
|
-
return;
|
|
71
|
-
}
|
|
72
|
-
const parsedData = this.parseData(this.collectedValues, parsingCase);
|
|
73
|
-
if (!parsedData) {
|
|
74
|
-
return;
|
|
75
|
-
}
|
|
76
|
-
const measurementTypeKey = parsingCase.measurementTypeKey;
|
|
77
|
-
return {
|
|
78
|
-
parsingCase,
|
|
79
|
-
measurementTypeKey,
|
|
80
|
-
parsedData: parsedData
|
|
81
|
-
};
|
|
82
|
-
}
|
|
83
|
-
findParsingModel(uuid) {
|
|
84
|
-
let parsingModel;
|
|
85
|
-
for (const mainService of this.mainServices) {
|
|
86
|
-
const characteristic = mainService.monitorUuids.find(e => e.uuid.toLowerCase() === uuid.toLowerCase());
|
|
87
|
-
if (characteristic) {
|
|
88
|
-
parsingModel = characteristic.parsingModel;
|
|
89
|
-
break;
|
|
113
|
+
reportCorruptFrame = () => {
|
|
114
|
+
this.callbacks.onError?.(new Error("feedback-messages.measurement.corrupt-frame-error", {
|
|
115
|
+
cause: {
|
|
116
|
+
message: "Frame failed its integrity check"
|
|
90
117
|
}
|
|
91
|
-
}
|
|
92
|
-
return parsingModel;
|
|
93
|
-
}
|
|
94
|
-
findParsingCase(caseValue, parsingModel) {
|
|
95
|
-
if (!parsingModel) {
|
|
96
|
-
return;
|
|
97
|
-
}
|
|
98
|
-
const parsingCase = parsingModel.cases?.find(e => e.caseValue === caseValue);
|
|
99
|
-
return parsingCase;
|
|
100
|
-
}
|
|
101
|
-
parseData(successResult, parsingCase) {
|
|
102
|
-
if (!parsingCase) {
|
|
103
|
-
return;
|
|
104
|
-
}
|
|
105
|
-
return parseMeasurement(successResult, parsingCase);
|
|
106
|
-
}
|
|
107
|
-
handleStatusChanges({
|
|
108
|
-
parsingCase,
|
|
109
|
-
measurementTypeKey,
|
|
110
|
-
parsedData
|
|
111
|
-
}) {
|
|
112
|
-
if (parsingCase.caseType === CaseType.STREAM && !this.isMeasuring) {
|
|
113
|
-
this.callbacks.onStreamStart?.();
|
|
114
|
-
this.callbacks.onStatusChanged?.(DeviceStatus.MEASURING, measurementTypeKey);
|
|
115
|
-
this.isMeasuring = true;
|
|
116
|
-
}
|
|
117
|
-
if (this.isMeasuring && parsingCase.caseType === CaseType.OTHER) {
|
|
118
|
-
this.callbacks.onStatusChanged?.(DeviceStatus.CONNECTED, measurementTypeKey);
|
|
119
|
-
this.isMeasuring = false;
|
|
120
|
-
}
|
|
121
|
-
let skipConnectedChange = false;
|
|
122
|
-
if (this.isMeasuring) {
|
|
123
|
-
skipConnectedChange = this.callbacks.onResult?.(parsedData, this.collectedValues) ?? false;
|
|
124
|
-
}
|
|
125
|
-
if (parsingCase.caseType === CaseType.RESULT && this.isMeasuring && !skipConnectedChange) {
|
|
126
|
-
this.isMeasuring = false;
|
|
127
|
-
this.callbacks.onStatusChanged?.(DeviceStatus.CONNECTED, measurementTypeKey);
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
resetDataAndSendCommandToDevice = () => {
|
|
131
|
-
this.buffers.set(this.currentUuid, []);
|
|
132
|
-
this.callbacks.onSendCommandToDevice?.();
|
|
118
|
+
}));
|
|
133
119
|
};
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Reports a parsed frame and moves the device between measuring and connected.
|
|
123
|
+
*
|
|
124
|
+
* A result is reported whether or not a stream preceded it, because a device already
|
|
125
|
+
* holding a finished measurement when the app connects has a real reading to hand over.
|
|
126
|
+
* Repeats are suppressed on the case transition rather than on the values, so a second
|
|
127
|
+
* measurement that happens to read the same is still reported.
|
|
128
|
+
*/
|
|
134
129
|
startStuckTimeout = () => {
|
|
135
130
|
if (this.stuckDataTimeout) {
|
|
136
131
|
clearTimeout(this.stuckDataTimeout);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["CaseType","
|
|
1
|
+
{"version":3,"names":["sentryLogger","CaseType","FrameReadStatus","FrameParser","MeasurementStateMachine","BTDataProcessor","buffers","Map","constructor","device","mainServices","stuckDataTimeoutDuration","callbacks","frameReader","frameParser","measurementState","onStatusChanged","onStreamStart","onResult","currentUuid","destroy","clear","reset","clearTimeout","stuckDataTimeout","undefined","processData","uuid","hexValue","String","toLowerCase","buffer","get","push","set","startStuckTimeout","readFramesFromBuffer","readWholeBuffer","reader","hasReadFrame","length","result","readFrame","hasProgressed","consumedBytes","splice","status","COMPLETE","handleFrame","frame","CORRUPT","reportCorruptFrame","INCOMPLETE","onSendCommandToDevice","validatePackage","data","parse","join","dependentData","parsingCase","caseType","DEPENDENT","handleDependentResult","advance","onError","Error","cause","message","setTimeout","cancelConnection"],"sourceRoot":"../../../../../../src","sources":["modules/bt-management/services/devices/bt-data-processor.ts"],"mappings":"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","ignoreList":[]}
|