@ovok/native 1.6.24 → 1.6.25
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-device/constants/supported-device-catalog-entries.js +1 -1
- package/lib/commonjs/modules/bt-device/constants/supported-device-catalog-entries.js.map +1 -1
- package/lib/commonjs/modules/bt-device/constants/supported-devices.js +1 -1
- package/lib/commonjs/modules/bt-device/constants/supported-devices.js.map +1 -1
- package/lib/commonjs/modules/bt-management/services/devices/bp2/bp2.device.js +7 -1
- package/lib/commonjs/modules/bt-management/services/devices/bp2/bp2.device.js.map +1 -1
- package/lib/commonjs/modules/bt-management/services/devices/bt-data-processor.js +37 -0
- 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 +7 -1
- package/lib/commonjs/modules/bt-management/services/devices/bt-managed-device.js.map +1 -1
- package/lib/commonjs/modules/bt-management/services/devices/lepu/lepu.device-names.js +13 -4
- package/lib/commonjs/modules/bt-management/services/devices/lepu/lepu.device-names.js.map +1 -1
- package/lib/commonjs/modules/bt-management/services/devices/lepu/lepu.name-match.js +3 -0
- package/lib/commonjs/modules/bt-management/services/devices/lepu/lepu.name-match.js.map +1 -1
- package/lib/commonjs/modules/bt-management/services/devices/lepu/lepu.transports.js +2 -0
- package/lib/commonjs/modules/bt-management/services/devices/lepu/lepu.transports.js.map +1 -1
- package/lib/commonjs/modules/bt-management/services/devices/veroval/veroval.ecg-device.js +24 -3
- package/lib/commonjs/modules/bt-management/services/devices/veroval/veroval.ecg-device.js.map +1 -1
- package/lib/commonjs/modules/bt-management/services/devices/veroval/veroval.ecg-record.js +98 -0
- package/lib/commonjs/modules/bt-management/services/devices/veroval/veroval.ecg-record.js.map +1 -0
- package/lib/commonjs/modules/bt-management/services/devices/veroval/veroval.ecg-transfer.js +215 -55
- package/lib/commonjs/modules/bt-management/services/devices/veroval/veroval.ecg-transfer.js.map +1 -1
- package/lib/commonjs/modules/bt-management/services/devices/viatom/viatom.bp-monitors.js +16 -3
- package/lib/commonjs/modules/bt-management/services/devices/viatom/viatom.bp-monitors.js.map +1 -1
- package/lib/commonjs/modules/bt-management/types/clock-sync.js +1 -0
- package/lib/commonjs/modules/bt-management/types/clock-sync.js.map +1 -1
- package/lib/commonjs/modules/bt-management/utils/convert-ecg-diagnostic-flag.js +19 -27
- package/lib/commonjs/modules/bt-management/utils/convert-ecg-diagnostic-flag.js.map +1 -1
- package/lib/module/modules/bt-device/constants/supported-device-catalog-entries.js +2 -2
- package/lib/module/modules/bt-device/constants/supported-device-catalog-entries.js.map +1 -1
- package/lib/module/modules/bt-device/constants/supported-devices.js +1 -1
- package/lib/module/modules/bt-device/constants/supported-devices.js.map +1 -1
- package/lib/module/modules/bt-management/services/devices/bp2/bp2.device.js +7 -1
- package/lib/module/modules/bt-management/services/devices/bp2/bp2.device.js.map +1 -1
- package/lib/module/modules/bt-management/services/devices/bt-data-processor.js +37 -0
- 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 +7 -1
- package/lib/module/modules/bt-management/services/devices/bt-managed-device.js.map +1 -1
- package/lib/module/modules/bt-management/services/devices/lepu/lepu.device-names.js +13 -3
- package/lib/module/modules/bt-management/services/devices/lepu/lepu.device-names.js.map +1 -1
- package/lib/module/modules/bt-management/services/devices/lepu/lepu.name-match.js +4 -1
- package/lib/module/modules/bt-management/services/devices/lepu/lepu.name-match.js.map +1 -1
- package/lib/module/modules/bt-management/services/devices/lepu/lepu.transports.js +2 -0
- package/lib/module/modules/bt-management/services/devices/lepu/lepu.transports.js.map +1 -1
- package/lib/module/modules/bt-management/services/devices/veroval/veroval.ecg-device.js +24 -3
- package/lib/module/modules/bt-management/services/devices/veroval/veroval.ecg-device.js.map +1 -1
- package/lib/module/modules/bt-management/services/devices/veroval/veroval.ecg-record.js +92 -0
- package/lib/module/modules/bt-management/services/devices/veroval/veroval.ecg-record.js.map +1 -0
- package/lib/module/modules/bt-management/services/devices/veroval/veroval.ecg-transfer.js +211 -50
- package/lib/module/modules/bt-management/services/devices/veroval/veroval.ecg-transfer.js.map +1 -1
- package/lib/module/modules/bt-management/services/devices/viatom/viatom.bp-monitors.js +16 -3
- package/lib/module/modules/bt-management/services/devices/viatom/viatom.bp-monitors.js.map +1 -1
- package/lib/module/modules/bt-management/types/clock-sync.js +1 -0
- package/lib/module/modules/bt-management/types/clock-sync.js.map +1 -1
- package/lib/module/modules/bt-management/types/device-measurement-map.js.map +1 -1
- package/lib/module/modules/bt-management/utils/convert-ecg-diagnostic-flag.js +19 -27
- package/lib/module/modules/bt-management/utils/convert-ecg-diagnostic-flag.js.map +1 -1
- package/lib/typescript/commonjs/src/modules/bt-device/constants/supported-device-catalog-entries.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/modules/bt-device/constants/supported-devices.d.ts.map +1 -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/bt-data-processor.d.ts +8 -0
- 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.map +1 -1
- package/lib/typescript/commonjs/src/modules/bt-management/services/devices/lepu/lepu.device-names.d.ts +9 -3
- package/lib/typescript/commonjs/src/modules/bt-management/services/devices/lepu/lepu.device-names.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/modules/bt-management/services/devices/lepu/lepu.name-match.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/modules/bt-management/services/devices/lepu/lepu.transports.d.ts +3 -1
- package/lib/typescript/commonjs/src/modules/bt-management/services/devices/lepu/lepu.transports.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/modules/bt-management/services/devices/veroval/veroval.ecg-device.d.ts +2 -1
- package/lib/typescript/commonjs/src/modules/bt-management/services/devices/veroval/veroval.ecg-device.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/modules/bt-management/services/devices/veroval/veroval.ecg-record.d.ts +41 -0
- package/lib/typescript/commonjs/src/modules/bt-management/services/devices/veroval/veroval.ecg-record.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/modules/bt-management/services/devices/veroval/veroval.ecg-transfer.d.ts +50 -18
- package/lib/typescript/commonjs/src/modules/bt-management/services/devices/veroval/veroval.ecg-transfer.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/modules/bt-management/services/devices/viatom/viatom.bp-monitors.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/modules/bt-management/types/clock-sync.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/modules/bt-management/types/command-sequencer.d.ts +10 -0
- package/lib/typescript/commonjs/src/modules/bt-management/types/command-sequencer.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/modules/bt-management/types/device-measurement-map.d.ts +4 -1
- package/lib/typescript/commonjs/src/modules/bt-management/types/device-measurement-map.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/modules/bt-management/utils/convert-ecg-diagnostic-flag.d.ts.map +1 -1
- package/lib/typescript/module/src/modules/bt-device/constants/supported-device-catalog-entries.d.ts.map +1 -1
- package/lib/typescript/module/src/modules/bt-device/constants/supported-devices.d.ts.map +1 -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/bt-data-processor.d.ts +8 -0
- 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.map +1 -1
- package/lib/typescript/module/src/modules/bt-management/services/devices/lepu/lepu.device-names.d.ts +9 -3
- package/lib/typescript/module/src/modules/bt-management/services/devices/lepu/lepu.device-names.d.ts.map +1 -1
- package/lib/typescript/module/src/modules/bt-management/services/devices/lepu/lepu.name-match.d.ts.map +1 -1
- package/lib/typescript/module/src/modules/bt-management/services/devices/lepu/lepu.transports.d.ts +3 -1
- package/lib/typescript/module/src/modules/bt-management/services/devices/lepu/lepu.transports.d.ts.map +1 -1
- package/lib/typescript/module/src/modules/bt-management/services/devices/veroval/veroval.ecg-device.d.ts +2 -1
- package/lib/typescript/module/src/modules/bt-management/services/devices/veroval/veroval.ecg-device.d.ts.map +1 -1
- package/lib/typescript/module/src/modules/bt-management/services/devices/veroval/veroval.ecg-record.d.ts +41 -0
- package/lib/typescript/module/src/modules/bt-management/services/devices/veroval/veroval.ecg-record.d.ts.map +1 -0
- package/lib/typescript/module/src/modules/bt-management/services/devices/veroval/veroval.ecg-transfer.d.ts +50 -18
- package/lib/typescript/module/src/modules/bt-management/services/devices/veroval/veroval.ecg-transfer.d.ts.map +1 -1
- package/lib/typescript/module/src/modules/bt-management/services/devices/viatom/viatom.bp-monitors.d.ts.map +1 -1
- package/lib/typescript/module/src/modules/bt-management/types/clock-sync.d.ts.map +1 -1
- package/lib/typescript/module/src/modules/bt-management/types/command-sequencer.d.ts +10 -0
- package/lib/typescript/module/src/modules/bt-management/types/command-sequencer.d.ts.map +1 -1
- package/lib/typescript/module/src/modules/bt-management/types/device-measurement-map.d.ts +4 -1
- package/lib/typescript/module/src/modules/bt-management/types/device-measurement-map.d.ts.map +1 -1
- package/lib/typescript/module/src/modules/bt-management/utils/convert-ecg-diagnostic-flag.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["defineCustomDevice","STANDARD_SERVICE","STANDARD_WRITE","STANDARD_NOTIFY","AW1_SERVICE","AW1_WRITE","AW1_NOTIFY","DING_SERVICE","DING_WRITE","DING_NOTIFY","AI_TELE_SERVICE","AI_TELE_WRITE","AI_TELE_NOTIFY","PREFERRED_MTU","MINIMUM_MTU","DEFAULT_STUCK_TIMEOUT_MS","START_BYTE","lepuTransports","standard","serviceUuid","notifyUuid","writeUuid","preferredMtu","standardSmallMtu","aw1","ding","aiTele","COMMAND_BYTE","lepuDevice","params","transport","viatomOxygen","protocol","id","nameMatch","matchByService","undefined","stuckDataTimeoutMs","lepu","startBytes","requestStartByte","write","characteristicUuid","expectedDeviceTypes","fileTransfer","pollCommand","writeWithoutResponse","setClockBeforeInfo","services","uuid","monitor","frame","minLengthBytes","caseSelectorBytes","cases"],"sourceRoot":"../../../../../../../src","sources":["modules/bt-management/services/devices/lepu/lepu.transports.ts"],"mappings":";;
|
|
1
|
+
{"version":3,"names":["defineCustomDevice","STANDARD_SERVICE","STANDARD_WRITE","STANDARD_NOTIFY","AW1_SERVICE","AW1_WRITE","AW1_NOTIFY","DING_SERVICE","DING_WRITE","DING_NOTIFY","AI_TELE_SERVICE","AI_TELE_WRITE","AI_TELE_NOTIFY","PREFERRED_MTU","MINIMUM_MTU","DEFAULT_STUCK_TIMEOUT_MS","START_BYTE","lepuTransports","standard","serviceUuid","notifyUuid","writeUuid","preferredMtu","standardSmallMtu","aw1","ding","aiTele","COMMAND_BYTE","lepuDevice","params","transport","viatomOxygen","protocol","id","nameMatch","matchByService","undefined","stuckDataTimeoutMs","lepu","startBytes","requestStartByte","write","characteristicUuid","expectedDeviceTypes","fileTransfer","pollCommand","writeWithoutResponse","setClockBeforeInfo","services","uuid","monitor","frame","minLengthBytes","caseSelectorBytes","cases","decorateReading"],"sourceRoot":"../../../../../../../src","sources":["modules/bt-management/services/devices/lepu/lepu.transports.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
import { MeasurementTypeKey } from "@ovok/core";
|
|
4
4
|
import { CaseType } from "../../../types/case-type.js";
|
|
5
5
|
import { BTManagedDevice } from "../bt-managed-device.js";
|
|
6
|
+
import { parseVerovalBloodPressureRecord } from "./veroval.ecg-record.js";
|
|
6
7
|
import { decodeVerovalEcgSamples, VEROVAL_ECG_SAMPLE_RATE_HZ } from "./veroval.ecg-samples.js";
|
|
7
8
|
import { VerovalEcgTransfer } from "./veroval.ecg-transfer.js";
|
|
8
9
|
const SERVICE = "0000a000-0000-1000-8000-00805f9b34fb";
|
|
@@ -60,18 +61,33 @@ export class VerovalEcgDevice extends BTManagedDevice {
|
|
|
60
61
|
serviceUuid: SERVICE,
|
|
61
62
|
characteristicUuid: CONTROL_POINT
|
|
62
63
|
},
|
|
63
|
-
|
|
64
|
+
onRecord: this.reportRecord,
|
|
65
|
+
clockSync: this.clockSync
|
|
64
66
|
});
|
|
65
67
|
constructor(device, params) {
|
|
66
68
|
super(device, params);
|
|
69
|
+
this.clockSync = params.clockSync;
|
|
67
70
|
}
|
|
68
71
|
|
|
69
72
|
/** Nothing is reported per packet; the transfer reports the recording when it is whole. */
|
|
70
73
|
handleSuccessResult() {
|
|
71
74
|
return;
|
|
72
75
|
}
|
|
73
|
-
|
|
74
|
-
|
|
76
|
+
reportRecord = record => {
|
|
77
|
+
if (!record.header.isEcg) {
|
|
78
|
+
const bloodPressure = parseVerovalBloodPressureRecord(record.header);
|
|
79
|
+
if (bloodPressure) {
|
|
80
|
+
this.onResult?.({
|
|
81
|
+
caseType: CaseType.RESULT,
|
|
82
|
+
...bloodPressure
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
if (!record.raw || record.header.heartRate === 0) {
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
const diagramPoints = decodeVerovalEcgSamples(record.raw, record.header.calibration);
|
|
75
91
|
if (diagramPoints.length === 0) {
|
|
76
92
|
this.onError?.(new Error("Veroval ECG: the recording held no samples."));
|
|
77
93
|
return;
|
|
@@ -79,6 +95,11 @@ export class VerovalEcgDevice extends BTManagedDevice {
|
|
|
79
95
|
this.onResult?.({
|
|
80
96
|
measurementTypeKey: MeasurementTypeKey.ecg,
|
|
81
97
|
caseType: CaseType.RESULT,
|
|
98
|
+
id: `veroval-${record.header.memorySlot}-${record.header.sequence}-${record.header.recordedAt?.getTime() ?? "unknown"}`,
|
|
99
|
+
memorySlot: record.header.memorySlot,
|
|
100
|
+
recordedAt: record.header.recordedAt,
|
|
101
|
+
heartRate: record.header.heartRate,
|
|
102
|
+
diagnosticResult: record.header.diagnosticResult,
|
|
82
103
|
diagramPoints,
|
|
83
104
|
duration: diagramPoints.length / VEROVAL_ECG_SAMPLE_RATE_HZ
|
|
84
105
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["MeasurementTypeKey","CaseType","BTManagedDevice","decodeVerovalEcgSamples","VEROVAL_ECG_SAMPLE_RATE_HZ","VerovalEcgTransfer","SERVICE","CONTROL_POINT","NOTIFY","STUCK_TIMEOUT_MS","PREFERRED_MTU","acceptEverything","caseValuePosition","cases","caseValue","caseType","OTHER","parseDefinitions","description","VerovalEcgDevice","stuckDataTimeout","preferredMtu","onStreamStart","undefined","mainServices","uuid","monitorUuids","parsingModel","validatePackage","createCommandSequencer","write","serviceUuid","characteristicUuid","
|
|
1
|
+
{"version":3,"names":["MeasurementTypeKey","CaseType","BTManagedDevice","parseVerovalBloodPressureRecord","decodeVerovalEcgSamples","VEROVAL_ECG_SAMPLE_RATE_HZ","VerovalEcgTransfer","SERVICE","CONTROL_POINT","NOTIFY","STUCK_TIMEOUT_MS","PREFERRED_MTU","acceptEverything","caseValuePosition","cases","caseValue","caseType","OTHER","parseDefinitions","description","VerovalEcgDevice","stuckDataTimeout","preferredMtu","onStreamStart","undefined","mainServices","uuid","monitorUuids","parsingModel","validatePackage","createCommandSequencer","write","serviceUuid","characteristicUuid","onRecord","reportRecord","clockSync","constructor","device","params","handleSuccessResult","record","header","isEcg","bloodPressure","onResult","RESULT","raw","heartRate","diagramPoints","calibration","length","onError","Error","measurementTypeKey","ecg","id","memorySlot","sequence","recordedAt","getTime","diagnosticResult","duration"],"sourceRoot":"../../../../../../../src","sources":["modules/bt-management/services/devices/veroval/veroval.ecg-device.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { EcgDiagnosticFlag, MeasurementTypeKey } from "@ovok/core";
|
|
4
|
+
import { hexToByte } from "../../../utils/hex-to-byte.js";
|
|
5
|
+
const HEADER_BYTES = 80;
|
|
6
|
+
const ECG_RECORD_TYPE = 38;
|
|
7
|
+
const ECG_ERROR_OFFSET = 30;
|
|
8
|
+
const RECORD_TYPE_OFFSET = 71;
|
|
9
|
+
const RAW_SIZE_OFFSET = 40;
|
|
10
|
+
const USER_OFFSET = 44;
|
|
11
|
+
const HEART_RATE_OFFSET = 47;
|
|
12
|
+
const BP_ERROR_OFFSET = 62;
|
|
13
|
+
const BP_PULSE_OFFSET = 63;
|
|
14
|
+
const BP_SYSTOLIC_OFFSET = 64;
|
|
15
|
+
const BP_DIASTOLIC_OFFSET = 66;
|
|
16
|
+
const TIMESTAMP_OFFSET = 20;
|
|
17
|
+
const TIMESTAMP_BYTES = 6;
|
|
18
|
+
const byteAt = (bytes, offset) => {
|
|
19
|
+
const value = hexToByte(bytes[offset] ?? "00");
|
|
20
|
+
return Number.isFinite(value) ? value : 0;
|
|
21
|
+
};
|
|
22
|
+
const littleEndianAt = (bytes, offset, count) => bytes.slice(offset, offset + count).reduce((value, byte, index) => value | byteAt([byte], 0) << index * 8, 0);
|
|
23
|
+
const signed16At = (bytes, offset) => {
|
|
24
|
+
const value = littleEndianAt(bytes, offset, 2);
|
|
25
|
+
return value & 0x8000 ? value - 0x10000 : value;
|
|
26
|
+
};
|
|
27
|
+
const dateFromHeader = bytes => {
|
|
28
|
+
const [year = 0, month = 0, day = 0, hours = 0, minutes = 0, seconds = 0] = Array.from({
|
|
29
|
+
length: TIMESTAMP_BYTES
|
|
30
|
+
}, (_, index) => byteAt(bytes, TIMESTAMP_OFFSET + index));
|
|
31
|
+
const recordedAt = new Date(2000 + year, month - 1, day, hours, minutes, seconds);
|
|
32
|
+
return recordedAt.getFullYear() === 2000 + year && recordedAt.getMonth() === month - 1 && recordedAt.getDate() === day && recordedAt.getHours() === hours && recordedAt.getMinutes() === minutes && recordedAt.getSeconds() === seconds ? recordedAt : undefined;
|
|
33
|
+
};
|
|
34
|
+
const diagnosticFromHeader = bytes => {
|
|
35
|
+
if (byteAt(bytes, 48) > 0 || littleEndianAt(bytes, 56, 2) > 0) {
|
|
36
|
+
return EcgDiagnosticFlag.HIGH_HR;
|
|
37
|
+
}
|
|
38
|
+
if (byteAt(bytes, 49) > 0 || littleEndianAt(bytes, 58, 2) > 0) {
|
|
39
|
+
return EcgDiagnosticFlag.LOW_HR;
|
|
40
|
+
}
|
|
41
|
+
if (byteAt(bytes, 50) > 0 || byteAt(bytes, 52) > 0) {
|
|
42
|
+
return EcgDiagnosticFlag.RR_IRREGULAR;
|
|
43
|
+
}
|
|
44
|
+
return byteAt(bytes, 53) > 0 ? EcgDiagnosticFlag.POOR_WAVEFORM : undefined;
|
|
45
|
+
};
|
|
46
|
+
const calibrationFromHeader = bytes => {
|
|
47
|
+
const physicalMinimumMicrovolts = signed16At(bytes, 31);
|
|
48
|
+
const physicalMaximumMicrovolts = signed16At(bytes, 33);
|
|
49
|
+
const digitalMinimum = signed16At(bytes, 35);
|
|
50
|
+
const digitalMaximum = signed16At(bytes, 37);
|
|
51
|
+
return physicalMinimumMicrovolts < physicalMaximumMicrovolts && digitalMinimum < digitalMaximum ? {
|
|
52
|
+
physicalMinimumMicrovolts,
|
|
53
|
+
physicalMaximumMicrovolts,
|
|
54
|
+
digitalMinimum,
|
|
55
|
+
digitalMaximum
|
|
56
|
+
} : undefined;
|
|
57
|
+
};
|
|
58
|
+
const parseVerovalEcgHeader = bytes => {
|
|
59
|
+
if (bytes.length < HEADER_BYTES) {
|
|
60
|
+
return undefined;
|
|
61
|
+
}
|
|
62
|
+
const isEcg = byteAt(bytes, RECORD_TYPE_OFFSET) === ECG_RECORD_TYPE;
|
|
63
|
+
return {
|
|
64
|
+
bytes: [...bytes.slice(0, HEADER_BYTES)],
|
|
65
|
+
sequence: byteAt(bytes, 0),
|
|
66
|
+
recordedAt: dateFromHeader(bytes),
|
|
67
|
+
memorySlot: byteAt(bytes, USER_OFFSET) === 0 ? 1 : 2,
|
|
68
|
+
rawSize: littleEndianAt(bytes, RAW_SIZE_OFFSET, 4),
|
|
69
|
+
heartRate: byteAt(bytes, HEART_RATE_OFFSET),
|
|
70
|
+
diagnosticResult: diagnosticFromHeader(bytes),
|
|
71
|
+
calibration: calibrationFromHeader(bytes),
|
|
72
|
+
isEcg,
|
|
73
|
+
hasError: isEcg ? byteAt(bytes, ECG_ERROR_OFFSET) !== 0 : byteAt(bytes, BP_ERROR_OFFSET) !== 0
|
|
74
|
+
};
|
|
75
|
+
};
|
|
76
|
+
const verovalRecordId = header => `veroval-${header.memorySlot}-${header.sequence}-${header.recordedAt?.getTime() ?? "unknown"}`;
|
|
77
|
+
const parseVerovalBloodPressureRecord = header => {
|
|
78
|
+
if (header.isEcg || header.hasError) {
|
|
79
|
+
return undefined;
|
|
80
|
+
}
|
|
81
|
+
return {
|
|
82
|
+
id: verovalRecordId(header),
|
|
83
|
+
measurementTypeKey: MeasurementTypeKey.bloodPressure,
|
|
84
|
+
systolic: littleEndianAt(header.bytes, BP_SYSTOLIC_OFFSET, 2),
|
|
85
|
+
diastolic: littleEndianAt(header.bytes, BP_DIASTOLIC_OFFSET, 2),
|
|
86
|
+
heartRate: byteAt(header.bytes, BP_PULSE_OFFSET),
|
|
87
|
+
recordedAt: header.recordedAt,
|
|
88
|
+
memorySlot: header.memorySlot
|
|
89
|
+
};
|
|
90
|
+
};
|
|
91
|
+
export { BP_DIASTOLIC_OFFSET, BP_ERROR_OFFSET, BP_PULSE_OFFSET, BP_SYSTOLIC_OFFSET, ECG_RECORD_TYPE, HEADER_BYTES, parseVerovalBloodPressureRecord, parseVerovalEcgHeader, RECORD_TYPE_OFFSET, RAW_SIZE_OFFSET, USER_OFFSET, verovalRecordId };
|
|
92
|
+
//# sourceMappingURL=veroval.ecg-record.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["EcgDiagnosticFlag","MeasurementTypeKey","hexToByte","HEADER_BYTES","ECG_RECORD_TYPE","ECG_ERROR_OFFSET","RECORD_TYPE_OFFSET","RAW_SIZE_OFFSET","USER_OFFSET","HEART_RATE_OFFSET","BP_ERROR_OFFSET","BP_PULSE_OFFSET","BP_SYSTOLIC_OFFSET","BP_DIASTOLIC_OFFSET","TIMESTAMP_OFFSET","TIMESTAMP_BYTES","byteAt","bytes","offset","value","Number","isFinite","littleEndianAt","count","slice","reduce","byte","index","signed16At","dateFromHeader","year","month","day","hours","minutes","seconds","Array","from","length","_","recordedAt","Date","getFullYear","getMonth","getDate","getHours","getMinutes","getSeconds","undefined","diagnosticFromHeader","HIGH_HR","LOW_HR","RR_IRREGULAR","POOR_WAVEFORM","calibrationFromHeader","physicalMinimumMicrovolts","physicalMaximumMicrovolts","digitalMinimum","digitalMaximum","parseVerovalEcgHeader","isEcg","sequence","memorySlot","rawSize","heartRate","diagnosticResult","calibration","hasError","verovalRecordId","header","getTime","parseVerovalBloodPressureRecord","id","measurementTypeKey","bloodPressure","systolic","diastolic"],"sourceRoot":"../../../../../../../src","sources":["modules/bt-management/services/devices/veroval/veroval.ecg-record.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,32 +1,49 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
/* eslint-disable max-lines */
|
|
4
|
+
import { getClockParts, isClockSyncEnabled } from "../../../types/clock-sync.js";
|
|
5
|
+
import { hexToByte } from "../../../utils/hex-to-byte.js";
|
|
6
|
+
import { parseVerovalEcgHeader } from "./veroval.ecg-record.js";
|
|
7
|
+
|
|
8
|
+
/** Every request is a fixed twenty-byte packet, zero filled after its command data. */
|
|
4
9
|
const PACKET_BYTES = 20;
|
|
5
10
|
const GROUP_INDEX = 1;
|
|
6
11
|
const COMMAND_INDEX = 2;
|
|
7
12
|
const PARAMETER_INDEX = 3;
|
|
8
13
|
const DOWNLOAD_GROUP = 4;
|
|
14
|
+
const DOWNLOAD_WAIT = 0;
|
|
9
15
|
const DOWNLOAD_MODE = 1;
|
|
10
16
|
const DOWNLOAD_HEADER = 2;
|
|
11
17
|
const DOWNLOAD_RAW = 3;
|
|
18
|
+
const SETTINGS_GROUP = 7;
|
|
19
|
+
const SET_TIME_GROUP = 5;
|
|
20
|
+
const SETTINGS_COMMAND = 2;
|
|
12
21
|
const FRAME_GROUP_INDEX = 1;
|
|
13
22
|
const FRAME_COMMAND_INDEX = 2;
|
|
14
23
|
const FRAME_PACKET_INDEX = 3;
|
|
24
|
+
const MODE_USER_ONE_COUNT_INDEX = 3;
|
|
25
|
+
const MODE_USER_TWO_COUNT_INDEX = 4;
|
|
15
26
|
|
|
16
|
-
/** The
|
|
27
|
+
/** The device answers a header with five notifications of sixteen bytes each. */
|
|
17
28
|
const PAYLOAD_FROM = 4;
|
|
18
29
|
const PAYLOAD_BYTES = 16;
|
|
19
30
|
const HEADER_PACKETS = 5;
|
|
20
31
|
const PACKETS_PER_SEGMENT = 16;
|
|
21
|
-
const
|
|
32
|
+
const SEGMENT_BYTES = PAYLOAD_BYTES * PACKETS_PER_SEGMENT;
|
|
33
|
+
const COMMAND_TIMEOUT_MS = 3_000;
|
|
34
|
+
const RAW_TIMEOUT_MS = 2_000;
|
|
35
|
+
const MAX_RETRIES = 2;
|
|
36
|
+
const SET_TIME_DELAY_MS = 1_500;
|
|
22
37
|
const BYTE_MASK = 0xff;
|
|
23
|
-
const
|
|
38
|
+
const byteAt = (frame, index) => {
|
|
39
|
+
const value = hexToByte(frame[index] ?? "00");
|
|
40
|
+
return Number.isFinite(value) ? value : 0;
|
|
41
|
+
};
|
|
24
42
|
const toHex = byte => (byte & BYTE_MASK).toString(16).padStart(2, "0");
|
|
25
|
-
const
|
|
26
|
-
const
|
|
27
|
-
const packet = (write, command, parameters = []) => {
|
|
43
|
+
const isFrame = (frame, group, command) => byteAt(frame, FRAME_GROUP_INDEX) === group && byteAt(frame, FRAME_COMMAND_INDEX) === command;
|
|
44
|
+
const packet = (write, group, command, parameters = [], delayBeforeWriteMs) => {
|
|
28
45
|
const bytes = new Array(PACKET_BYTES).fill(0);
|
|
29
|
-
bytes[GROUP_INDEX] =
|
|
46
|
+
bytes[GROUP_INDEX] = group;
|
|
30
47
|
bytes[COMMAND_INDEX] = command;
|
|
31
48
|
parameters.forEach((value, index) => {
|
|
32
49
|
bytes[PARAMETER_INDEX + index] = value;
|
|
@@ -34,72 +51,216 @@ const packet = (write, command, parameters = []) => {
|
|
|
34
51
|
return {
|
|
35
52
|
...write,
|
|
36
53
|
frame: bytes.map(toHex),
|
|
37
|
-
withoutResponse: true
|
|
54
|
+
withoutResponse: true,
|
|
55
|
+
...(delayBeforeWriteMs === undefined ? {} : {
|
|
56
|
+
delayBeforeWriteMs
|
|
57
|
+
})
|
|
38
58
|
};
|
|
39
59
|
};
|
|
40
|
-
const
|
|
60
|
+
const payloadOf = frame => [...frame.slice(PAYLOAD_FROM, PAYLOAD_FROM + PAYLOAD_BYTES)];
|
|
61
|
+
const settingsCommand = write => packet(write, SETTINGS_GROUP, SETTINGS_COMMAND, [], SET_TIME_DELAY_MS);
|
|
62
|
+
const setTimeCommand = (write, clockSync, settings) => {
|
|
63
|
+
const parts = getClockParts(clockSync?.now?.() ?? new Date(), clockSync?.timezone);
|
|
64
|
+
return packet(write, SET_TIME_GROUP, SETTINGS_COMMAND, [parts.year % 100, parts.month, parts.day, parts.hours, parts.minutes, parts.seconds, settings[0] ?? 0, settings[1] ?? 0, settings[2] ?? 0]);
|
|
65
|
+
};
|
|
41
66
|
/**
|
|
42
|
-
* Downloads
|
|
43
|
-
*
|
|
44
|
-
* The exchange is a fixed walk rather than a conversation: ask for the download mode, then
|
|
45
|
-
* the header, then each second of the recording in turn. The device answers each request
|
|
46
|
-
* with a known number of twenty-byte packets, sixteen payload bytes each, so the transfer is
|
|
47
|
-
* paced by counting them. Notifications for live measurements, standby and device settings
|
|
48
|
-
* share the characteristic, so only the download group and command advance the transfer.
|
|
67
|
+
* Downloads all records from the Veroval ECG/BP monitor.
|
|
49
68
|
*
|
|
50
|
-
*
|
|
51
|
-
*
|
|
52
|
-
*
|
|
69
|
+
* The mode reply gives the number of records in each user memory. Headers are collected first;
|
|
70
|
+
* only then does the device enter raw-download mode. This matters because a blood-pressure
|
|
71
|
+
* record is complete in its header while an ECG needs one or more raw segments.
|
|
53
72
|
*/
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
73
|
+
class VerovalEcgTransfer {
|
|
74
|
+
headerPacket = 0;
|
|
75
|
+
headerBytes = [];
|
|
76
|
+
recordIndex = 0;
|
|
77
|
+
expectedRecords = 0;
|
|
78
|
+
headers = [];
|
|
79
|
+
ecgHeaders = [];
|
|
80
|
+
ecgIndex = 0;
|
|
81
|
+
segment = 1;
|
|
82
|
+
rawPacket = 0;
|
|
83
|
+
segmentBytes = [];
|
|
84
|
+
rawBytes = [];
|
|
85
|
+
pendingTimeout = COMMAND_TIMEOUT_MS;
|
|
86
|
+
retries = 0;
|
|
87
|
+
settings = [0, 0, 0];
|
|
59
88
|
constructor(params) {
|
|
60
89
|
this.params = params;
|
|
90
|
+
this.phase = isClockSyncEnabled(params.clockSync) ? "settings" : "mode";
|
|
61
91
|
}
|
|
62
|
-
initialCommands = () => [
|
|
92
|
+
initialCommands = () => this.phase === "settings" ? this.remember([settingsCommand(this.params.write)], COMMAND_TIMEOUT_MS, true) : this.requestMode();
|
|
63
93
|
nextCommand = frame => {
|
|
64
94
|
if (this.phase === "done") {
|
|
65
95
|
return undefined;
|
|
66
96
|
}
|
|
97
|
+
if (this.phase === "settings") {
|
|
98
|
+
return this.nextSettings(frame);
|
|
99
|
+
}
|
|
67
100
|
if (this.phase === "mode") {
|
|
68
|
-
|
|
69
|
-
return undefined;
|
|
70
|
-
}
|
|
71
|
-
this.phase = "header";
|
|
72
|
-
this.packets = 0;
|
|
73
|
-
return [packet(this.params.write, DOWNLOAD_HEADER)];
|
|
101
|
+
return this.nextMode(frame);
|
|
74
102
|
}
|
|
75
103
|
if (this.phase === "header") {
|
|
76
|
-
|
|
77
|
-
|
|
104
|
+
return this.nextHeader(frame);
|
|
105
|
+
}
|
|
106
|
+
return this.nextRaw(frame);
|
|
107
|
+
};
|
|
108
|
+
commandTimeoutMs = () => this.phase === "done" ? undefined : this.pendingTimeout;
|
|
109
|
+
onCommandTimeout = () => {
|
|
110
|
+
if (!this.lastCommand || this.phase === "done") {
|
|
111
|
+
return {
|
|
112
|
+
terminal: true
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
if (this.retries >= MAX_RETRIES) {
|
|
116
|
+
this.phase = "done";
|
|
117
|
+
return {
|
|
118
|
+
terminal: true
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
this.retries += 1;
|
|
122
|
+
if (this.phase === "header") {
|
|
123
|
+
this.headerPacket = 0;
|
|
124
|
+
this.headerBytes = [];
|
|
125
|
+
}
|
|
126
|
+
if (this.phase === "raw") {
|
|
127
|
+
this.rawPacket = 0;
|
|
128
|
+
this.segmentBytes = [];
|
|
129
|
+
}
|
|
130
|
+
return {
|
|
131
|
+
commands: [this.lastCommand]
|
|
132
|
+
};
|
|
133
|
+
};
|
|
134
|
+
commandProgress = frame => {
|
|
135
|
+
if (this.phase === "settings") {
|
|
136
|
+
return isFrame(frame, SETTINGS_GROUP, SETTINGS_COMMAND) ? "complete" : "ignored";
|
|
137
|
+
}
|
|
138
|
+
if (this.phase === "mode") {
|
|
139
|
+
return isFrame(frame, DOWNLOAD_GROUP, DOWNLOAD_MODE) ? "complete" : "ignored";
|
|
140
|
+
}
|
|
141
|
+
if (this.phase === "header") {
|
|
142
|
+
if (!isFrame(frame, DOWNLOAD_GROUP, DOWNLOAD_HEADER) || byteAt(frame, FRAME_PACKET_INDEX) !== this.headerPacket) {
|
|
143
|
+
return "ignored";
|
|
78
144
|
}
|
|
79
|
-
this.
|
|
80
|
-
|
|
145
|
+
return this.headerPacket + 1 === HEADER_PACKETS ? "complete" : "partial";
|
|
146
|
+
}
|
|
147
|
+
if (!isFrame(frame, DOWNLOAD_GROUP, DOWNLOAD_RAW) || byteAt(frame, FRAME_PACKET_INDEX) !== this.rawPacket) {
|
|
148
|
+
return "ignored";
|
|
81
149
|
}
|
|
82
|
-
|
|
150
|
+
return this.rawPacket + 1 === PACKETS_PER_SEGMENT ? "complete" : "partial";
|
|
151
|
+
};
|
|
152
|
+
nextSettings = frame => {
|
|
153
|
+
if (!isFrame(frame, SETTINGS_GROUP, SETTINGS_COMMAND)) {
|
|
83
154
|
return undefined;
|
|
84
155
|
}
|
|
85
|
-
this.
|
|
86
|
-
this.
|
|
87
|
-
return this.
|
|
156
|
+
this.settings = [byteAt(frame, 5), byteAt(frame, 6), byteAt(frame, 7)];
|
|
157
|
+
this.phase = "mode";
|
|
158
|
+
return this.remember([setTimeCommand(this.params.write, this.params.clockSync, this.settings), packet(this.params.write, DOWNLOAD_GROUP, DOWNLOAD_MODE)], COMMAND_TIMEOUT_MS);
|
|
88
159
|
};
|
|
89
|
-
|
|
160
|
+
nextMode = frame => {
|
|
161
|
+
if (!isFrame(frame, DOWNLOAD_GROUP, DOWNLOAD_MODE)) {
|
|
162
|
+
return undefined;
|
|
163
|
+
}
|
|
164
|
+
const userOne = byteAt(frame, MODE_USER_ONE_COUNT_INDEX);
|
|
165
|
+
const userTwo = byteAt(frame, MODE_USER_TWO_COUNT_INDEX);
|
|
166
|
+
this.expectedRecords = userOne + userTwo;
|
|
167
|
+
if (this.expectedRecords === 0) {
|
|
168
|
+
this.phase = "done";
|
|
169
|
+
return undefined;
|
|
170
|
+
}
|
|
171
|
+
this.headers = [];
|
|
172
|
+
this.recordIndex = 0;
|
|
173
|
+
return this.requestHeader(this.recordIndex);
|
|
174
|
+
};
|
|
175
|
+
nextHeader = frame => {
|
|
176
|
+
if (!isFrame(frame, DOWNLOAD_GROUP, DOWNLOAD_HEADER) || byteAt(frame, FRAME_PACKET_INDEX) !== this.headerPacket) {
|
|
177
|
+
return undefined;
|
|
178
|
+
}
|
|
179
|
+
this.headerBytes.push(...payloadOf(frame));
|
|
180
|
+
this.headerPacket += 1;
|
|
181
|
+
if (this.headerPacket < HEADER_PACKETS) {
|
|
182
|
+
return undefined;
|
|
183
|
+
}
|
|
184
|
+
const header = parseVerovalEcgHeader(this.headerBytes);
|
|
185
|
+
if (header) {
|
|
186
|
+
this.headers.push(header);
|
|
187
|
+
}
|
|
188
|
+
this.recordIndex += 1;
|
|
189
|
+
if (this.recordIndex < this.expectedRecords) {
|
|
190
|
+
return this.requestHeader(this.recordIndex);
|
|
191
|
+
}
|
|
192
|
+
this.ecgHeaders = this.headers.filter(candidate => candidate.isEcg && !candidate.hasError && candidate.rawSize > 0);
|
|
193
|
+
this.headers.filter(candidate => !candidate.isEcg && !candidate.hasError).forEach(candidate => this.params.onRecord({
|
|
194
|
+
header: candidate
|
|
195
|
+
}));
|
|
196
|
+
if (this.ecgHeaders.length === 0) {
|
|
197
|
+
this.phase = "done";
|
|
198
|
+
return undefined;
|
|
199
|
+
}
|
|
200
|
+
this.ecgIndex = 0;
|
|
201
|
+
return this.remember([packet(this.params.write, DOWNLOAD_GROUP, DOWNLOAD_WAIT), ...this.requestRaw(this.ecgHeaders[0])], RAW_TIMEOUT_MS);
|
|
202
|
+
};
|
|
203
|
+
nextRaw = frame => {
|
|
204
|
+
if (!isFrame(frame, DOWNLOAD_GROUP, DOWNLOAD_RAW) || byteAt(frame, FRAME_PACKET_INDEX) !== this.rawPacket) {
|
|
205
|
+
return undefined;
|
|
206
|
+
}
|
|
207
|
+
this.segmentBytes.push(...payloadOf(frame));
|
|
208
|
+
this.rawPacket += 1;
|
|
209
|
+
if (this.rawPacket < PACKETS_PER_SEGMENT) {
|
|
210
|
+
return undefined;
|
|
211
|
+
}
|
|
212
|
+
this.rawBytes.push(...this.segmentBytes);
|
|
213
|
+
const header = this.ecgHeaders[this.ecgIndex];
|
|
214
|
+
if (!header) {
|
|
215
|
+
this.phase = "done";
|
|
216
|
+
return undefined;
|
|
217
|
+
}
|
|
218
|
+
if (this.rawBytes.length >= header.rawSize) {
|
|
219
|
+
this.params.onRecord({
|
|
220
|
+
header,
|
|
221
|
+
raw: this.rawBytes.slice(0, header.rawSize)
|
|
222
|
+
});
|
|
223
|
+
this.ecgIndex += 1;
|
|
224
|
+
if (this.ecgIndex >= this.ecgHeaders.length) {
|
|
225
|
+
this.phase = "done";
|
|
226
|
+
return undefined;
|
|
227
|
+
}
|
|
228
|
+
return this.remember(this.requestRaw(this.ecgHeaders[this.ecgIndex]), RAW_TIMEOUT_MS);
|
|
229
|
+
}
|
|
90
230
|
this.segment += 1;
|
|
91
|
-
|
|
92
|
-
|
|
231
|
+
return this.remember(this.requestSegment(header), RAW_TIMEOUT_MS);
|
|
232
|
+
};
|
|
233
|
+
requestMode = () => this.remember([packet(this.params.write, DOWNLOAD_GROUP, DOWNLOAD_MODE)], COMMAND_TIMEOUT_MS);
|
|
234
|
+
requestHeader = index => {
|
|
235
|
+
this.phase = "header";
|
|
236
|
+
this.headerPacket = 0;
|
|
237
|
+
this.headerBytes = [];
|
|
238
|
+
return this.remember([packet(this.params.write, DOWNLOAD_GROUP, DOWNLOAD_HEADER, [index])], COMMAND_TIMEOUT_MS);
|
|
239
|
+
};
|
|
240
|
+
requestRaw = header => {
|
|
241
|
+
if (!header) {
|
|
242
|
+
this.phase = "done";
|
|
243
|
+
return [];
|
|
93
244
|
}
|
|
94
|
-
this.
|
|
95
|
-
this.
|
|
96
|
-
return
|
|
245
|
+
this.segment = 1;
|
|
246
|
+
this.rawBytes = [];
|
|
247
|
+
return this.requestSegment(header);
|
|
97
248
|
};
|
|
98
|
-
requestSegment =
|
|
249
|
+
requestSegment = header => {
|
|
99
250
|
this.phase = "raw";
|
|
100
|
-
this.
|
|
101
|
-
this.
|
|
102
|
-
return [packet(this.params.write, DOWNLOAD_RAW,
|
|
251
|
+
this.rawPacket = 0;
|
|
252
|
+
this.segmentBytes = [];
|
|
253
|
+
return [packet(this.params.write, DOWNLOAD_GROUP, DOWNLOAD_RAW, [header.memorySlot - 1, header.sequence, this.segment])];
|
|
254
|
+
};
|
|
255
|
+
remember = (commands, timeout, preserveRetryCount = false) => {
|
|
256
|
+
const last = commands[commands.length - 1];
|
|
257
|
+
this.lastCommand = last;
|
|
258
|
+
this.pendingTimeout = timeout;
|
|
259
|
+
if (!preserveRetryCount) {
|
|
260
|
+
this.retries = 0;
|
|
261
|
+
}
|
|
262
|
+
return commands;
|
|
103
263
|
};
|
|
104
264
|
}
|
|
265
|
+
export { COMMAND_TIMEOUT_MS, DOWNLOAD_HEADER, DOWNLOAD_MODE, DOWNLOAD_RAW, DOWNLOAD_WAIT, HEADER_PACKETS, PACKETS_PER_SEGMENT, RAW_TIMEOUT_MS, SEGMENT_BYTES, SET_TIME_DELAY_MS, VerovalEcgTransfer };
|
|
105
266
|
//# sourceMappingURL=veroval.ecg-transfer.js.map
|
package/lib/module/modules/bt-management/services/devices/veroval/veroval.ecg-transfer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["PACKET_BYTES","GROUP_INDEX","COMMAND_INDEX","PARAMETER_INDEX","DOWNLOAD_GROUP","DOWNLOAD_MODE","DOWNLOAD_HEADER","DOWNLOAD_RAW","FRAME_GROUP_INDEX","FRAME_COMMAND_INDEX","FRAME_PACKET_INDEX","PAYLOAD_FROM","PAYLOAD_BYTES","HEADER_PACKETS","PACKETS_PER_SEGMENT","SEGMENTS","BYTE_MASK","BYTE_BITS","toHex","byte","toString","padStart","isDownloadFrame","frame","command","toLowerCase","isExpectedRawPacket","packetIndex","packet","write","parameters","bytes","Array","fill","forEach","value","index","map","withoutResponse","segmentParameters","segment","VerovalEcgTransfer","phase","packets","recording","constructor","params","initialCommands","nextCommand","undefined","requestSegment","push","slice","finishSegment","onRecording"],"sourceRoot":"../../../../../../../src","sources":["modules/bt-management/services/devices/veroval/veroval.ecg-transfer.ts"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["getClockParts","isClockSyncEnabled","hexToByte","parseVerovalEcgHeader","PACKET_BYTES","GROUP_INDEX","COMMAND_INDEX","PARAMETER_INDEX","DOWNLOAD_GROUP","DOWNLOAD_WAIT","DOWNLOAD_MODE","DOWNLOAD_HEADER","DOWNLOAD_RAW","SETTINGS_GROUP","SET_TIME_GROUP","SETTINGS_COMMAND","FRAME_GROUP_INDEX","FRAME_COMMAND_INDEX","FRAME_PACKET_INDEX","MODE_USER_ONE_COUNT_INDEX","MODE_USER_TWO_COUNT_INDEX","PAYLOAD_FROM","PAYLOAD_BYTES","HEADER_PACKETS","PACKETS_PER_SEGMENT","SEGMENT_BYTES","COMMAND_TIMEOUT_MS","RAW_TIMEOUT_MS","MAX_RETRIES","SET_TIME_DELAY_MS","BYTE_MASK","byteAt","frame","index","value","Number","isFinite","toHex","byte","toString","padStart","isFrame","group","command","packet","write","parameters","delayBeforeWriteMs","bytes","Array","fill","forEach","map","withoutResponse","undefined","payloadOf","slice","settingsCommand","setTimeCommand","clockSync","settings","parts","now","Date","timezone","year","month","day","hours","minutes","seconds","VerovalEcgTransfer","headerPacket","headerBytes","recordIndex","expectedRecords","headers","ecgHeaders","ecgIndex","segment","rawPacket","segmentBytes","rawBytes","pendingTimeout","retries","constructor","params","phase","initialCommands","remember","requestMode","nextCommand","nextSettings","nextMode","nextHeader","nextRaw","commandTimeoutMs","onCommandTimeout","lastCommand","terminal","commands","commandProgress","userOne","userTwo","requestHeader","push","header","filter","candidate","isEcg","hasError","rawSize","onRecord","length","requestRaw","raw","requestSegment","memorySlot","sequence","timeout","preserveRetryCount","last"],"sourceRoot":"../../../../../../../src","sources":["modules/bt-management/services/devices/veroval/veroval.ecg-transfer.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -28,8 +28,9 @@ const RT_DATA = 0x08;
|
|
|
28
28
|
*/
|
|
29
29
|
const CASE_SELECTOR_BYTES = [1, 7];
|
|
30
30
|
|
|
31
|
-
/** Header, realtime state,
|
|
32
|
-
const MIN_LENGTH_BYTES =
|
|
31
|
+
/** Header, realtime state, the result struct and its result code. */
|
|
32
|
+
const MIN_LENGTH_BYTES = 29;
|
|
33
|
+
const RESULT_CODE_INDEX = 28;
|
|
33
34
|
const READING = [{
|
|
34
35
|
name: "systolic",
|
|
35
36
|
byteIndexes: [20, 21],
|
|
@@ -61,6 +62,13 @@ const measuring = (selector, description) => ({
|
|
|
61
62
|
kind: "stream",
|
|
62
63
|
description
|
|
63
64
|
});
|
|
65
|
+
const rejectFailedResult = (reading, frame) => {
|
|
66
|
+
const resultCode = Number.parseInt(frame?.[RESULT_CODE_INDEX] ?? "00", 16);
|
|
67
|
+
if (resultCode !== 0) {
|
|
68
|
+
throw new Error(`Viatom blood-pressure measurement failed with result code 0x${resultCode.toString(16).padStart(2, "0")}`);
|
|
69
|
+
}
|
|
70
|
+
return reading;
|
|
71
|
+
};
|
|
64
72
|
|
|
65
73
|
/**
|
|
66
74
|
* The states the series reports, and what each means for a reading.
|
|
@@ -70,7 +78,11 @@ const measuring = (selector, description) => ({
|
|
|
70
78
|
* separates one measurement from the next, which is why the states in between are declared
|
|
71
79
|
* rather than ignored.
|
|
72
80
|
*/
|
|
73
|
-
const BP2_CASES = [
|
|
81
|
+
const BP2_CASES = [...["00", "01", "02", "03", "0a", "14", "ff"].map(state => ({
|
|
82
|
+
selector: `08${state}`,
|
|
83
|
+
kind: "idle",
|
|
84
|
+
description: "Monitor is connected but not measuring"
|
|
85
|
+
})), measuring("0804", "Cuff inflating or deflating"), result("0805", "Measurement finished"), measuring("080f", "Averaging run: a measurement is in progress"), measuring("0810", "Averaging run: waiting between measurements"), result("0811", "Averaging run finished, carrying the same payload")];
|
|
74
86
|
/**
|
|
75
87
|
* Declares one monitor of the BP2 series.
|
|
76
88
|
*
|
|
@@ -87,6 +99,7 @@ const viatomBpMonitor = (advertisedName, params) => lepuDevice({
|
|
|
87
99
|
cases: BP2_CASES.map(each => ({
|
|
88
100
|
...each
|
|
89
101
|
})),
|
|
102
|
+
decorateReading: rejectFailedResult,
|
|
90
103
|
...(params.expectedDeviceTypes ? {
|
|
91
104
|
expectedDeviceTypes: params.expectedDeviceTypes
|
|
92
105
|
} : {})
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["MeasurementTypeKey","lepuNameMatch","lepuDevice","RT_DATA","CASE_SELECTOR_BYTES","MIN_LENGTH_BYTES","READING","name","byteIndexes","byteOrder","encoding","unit","result","selector","description","kind","measurementTypeKey","bloodPressure","fields","measuring","BP2_CASES","viatomBpMonitor","advertisedName","params","id","toLowerCase","replace","nameMatch","pollCommand","minLengthBytes","caseSelectorBytes","cases","
|
|
1
|
+
{"version":3,"names":["MeasurementTypeKey","lepuNameMatch","lepuDevice","RT_DATA","CASE_SELECTOR_BYTES","MIN_LENGTH_BYTES","RESULT_CODE_INDEX","READING","name","byteIndexes","byteOrder","encoding","unit","result","selector","description","kind","measurementTypeKey","bloodPressure","fields","measuring","rejectFailedResult","reading","frame","resultCode","Number","parseInt","Error","toString","padStart","BP2_CASES","map","state","viatomBpMonitor","advertisedName","params","id","toLowerCase","replace","nameMatch","pollCommand","minLengthBytes","caseSelectorBytes","cases","each","decorateReading","expectedDeviceTypes","bp2aMonitor","bp2tMonitor","bp2wMonitor","BP3_MODEL_NAMES"],"sourceRoot":"../../../../../../../src","sources":["modules/bt-management/services/devices/viatom/viatom.bp-monitors.ts"],"mappings":"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","ignoreList":[]}
|