@ovok/native 0.4.4 → 0.4.6
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 +32 -2
- 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/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 +32 -2
- 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/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/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/package.json +12 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["
|
|
1
|
+
{"version":3,"names":["_sentryLogger","require","_caseType","_frameReadStatus","_frameParser","_measurementStateMachine","BTDataProcessor","buffers","Map","constructor","device","mainServices","stuckDataTimeoutDuration","callbacks","frameReader","frameParser","FrameParser","measurementState","MeasurementStateMachine","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","FrameReadStatus","COMPLETE","handleFrame","frame","CORRUPT","reportCorruptFrame","INCOMPLETE","onSendCommandToDevice","validatePackage","data","parse","sentryLogger","join","dependentData","parsingCase","caseType","CaseType","DEPENDENT","handleDependentResult","advance","onError","Error","cause","message","setTimeout","cancelConnection","exports"],"sourceRoot":"../../../../../../src","sources":["modules/bt-management/services/devices/bt-data-processor.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -22,6 +22,28 @@ class BTManagedDevice {
|
|
|
22
22
|
* @returns The handled data.
|
|
23
23
|
*/
|
|
24
24
|
|
|
25
|
+
/**
|
|
26
|
+
* Locates frame boundaries inside the notification buffer.
|
|
27
|
+
*
|
|
28
|
+
* A device that leaves this undefined has its whole buffer handed to
|
|
29
|
+
* `validatePackage` and parsed as a single frame, which only holds while a
|
|
30
|
+
* notification can neither split a frame nor carry more than one.
|
|
31
|
+
*/
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* MTU to ask for once connected.
|
|
35
|
+
*
|
|
36
|
+
* A larger MTU carries a frame in fewer notifications, which matters most for the
|
|
37
|
+
* long payloads. Devices that leave this undefined keep the platform default.
|
|
38
|
+
*/
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Decides whether the buffer holds a parseable frame.
|
|
42
|
+
*
|
|
43
|
+
* Only consulted for devices that declare no frameReader. A device that declares
|
|
44
|
+
* neither parses nothing, so an unknown buffer is never decoded on trust.
|
|
45
|
+
*/
|
|
46
|
+
|
|
25
47
|
constructor(device, {
|
|
26
48
|
deviceName,
|
|
27
49
|
onError: onErrorCallback,
|
|
@@ -113,11 +135,11 @@ class BTManagedDevice {
|
|
|
113
135
|
onDataReceived: (uuid, hexValue) => {
|
|
114
136
|
this.dataProcessor?.processData(uuid, hexValue);
|
|
115
137
|
}
|
|
116
|
-
});
|
|
138
|
+
}, this.preferredMtu);
|
|
117
139
|
this.dataProcessor = new _btDataProcessor.BTDataProcessor(this.device, this.mainServices, this.stuckDataTimeout, {
|
|
118
140
|
onStatusChanged: this.onDeviceStatusChanged?.bind(this),
|
|
119
141
|
onStreamStart: this.onStreamStart?.bind(this),
|
|
120
|
-
validatePackage: this.validatePackage
|
|
142
|
+
validatePackage: this.validatePackage?.bind(this) ?? (() => false),
|
|
121
143
|
onResult: (parsedData, collectedValues) => {
|
|
122
144
|
try {
|
|
123
145
|
return this.handleSuccessResult.bind(this)(parsedData, collectedValues);
|
|
@@ -128,7 +150,7 @@ class BTManagedDevice {
|
|
|
128
150
|
onSendCommandToDevice: this.connectionHandler?.sendCommandToDevice?.bind(this),
|
|
129
151
|
onError: this.onError?.bind(this),
|
|
130
152
|
handleDependentResult: this.handleDependentResult?.bind(this)
|
|
131
|
-
});
|
|
153
|
+
}, this.frameReader);
|
|
132
154
|
await this.connectionHandler.connect();
|
|
133
155
|
};
|
|
134
156
|
getSupportedMeasurementTypeKeys = () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_sentryLogger","require","_deviceStatus","_btConnectionHandler","_btDataProcessor","BTManagedDevice","constructor","device","deviceName","onError","onErrorCallback","onDeviceStatusChanged","onDeviceStatusChangedCallback","onResult","onResultCallback","onDeviceDisconnected","onDeviceDisconnectedCallback","sentryLogger","deviceId","id","deviceData","name","localName","manufacturerData","sn","measurementTypes","status","measurementTypeKey","error","Error","message","caseType","_","data","diagramPoints","length","undefined","destroy","connectionHandler","dataProcessor","connect","getSupportedMeasurementTypeKeys","BTConnectionHandler","mainServices","onStatusChanged","bind","DeviceStatus","DISCONNECTED","onDataReceived","uuid","hexValue","processData","BTDataProcessor","stuckDataTimeout","onStreamStart","validatePackage","parsedData","collectedValues","handleSuccessResult","onSendCommandToDevice","sendCommandToDevice","handleDependentResult","flatMap","service","monitorUuids","parsingModel","cases","map","c","filter","type","uniqueMeasurementTypes","Set","flat","exports"],"sourceRoot":"../../../../../../src","sources":["modules/bt-management/services/devices/bt-managed-device.ts"],"mappings":";;;;;;AAGA,IAAAA,aAAA,GAAAC,OAAA;AAMA,IAAAC,aAAA,GAAAD,OAAA;
|
|
1
|
+
{"version":3,"names":["_sentryLogger","require","_deviceStatus","_btConnectionHandler","_btDataProcessor","BTManagedDevice","constructor","device","deviceName","onError","onErrorCallback","onDeviceStatusChanged","onDeviceStatusChangedCallback","onResult","onResultCallback","onDeviceDisconnected","onDeviceDisconnectedCallback","sentryLogger","deviceId","id","deviceData","name","localName","manufacturerData","sn","measurementTypes","status","measurementTypeKey","error","Error","message","caseType","_","data","diagramPoints","length","undefined","destroy","connectionHandler","dataProcessor","connect","getSupportedMeasurementTypeKeys","BTConnectionHandler","mainServices","onStatusChanged","bind","DeviceStatus","DISCONNECTED","onDataReceived","uuid","hexValue","processData","preferredMtu","BTDataProcessor","stuckDataTimeout","onStreamStart","validatePackage","parsedData","collectedValues","handleSuccessResult","onSendCommandToDevice","sendCommandToDevice","handleDependentResult","frameReader","flatMap","service","monitorUuids","parsingModel","cases","map","c","filter","type","uniqueMeasurementTypes","Set","flat","exports"],"sourceRoot":"../../../../../../src","sources":["modules/bt-management/services/devices/bt-managed-device.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.FrameParser = void 0;
|
|
7
|
+
var _parseMeasurement = require("../../utils/parse-measurement.js");
|
|
8
|
+
/**
|
|
9
|
+
* Turns a verified frame into a measurement, by selecting the parsing case the frame
|
|
10
|
+
* matches and applying that case's field definitions.
|
|
11
|
+
*
|
|
12
|
+
* A frame whose characteristic is unknown, whose selector bytes match no declared case,
|
|
13
|
+
* or whose fields do not parse yields nothing: it is the caller's decision whether that
|
|
14
|
+
* is worth reporting.
|
|
15
|
+
*/
|
|
16
|
+
class FrameParser {
|
|
17
|
+
constructor(mainServices) {
|
|
18
|
+
this.mainServices = mainServices;
|
|
19
|
+
}
|
|
20
|
+
parse(uuid, frame) {
|
|
21
|
+
const parsingModel = this.findParsingModel(uuid);
|
|
22
|
+
if (!parsingModel) {
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
const caseValue = this.readCaseValue(parsingModel, frame);
|
|
26
|
+
const parsingCase = parsingModel.cases?.find(declared => declared.caseValue === caseValue);
|
|
27
|
+
if (!parsingCase) {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
const parsedData = (0, _parseMeasurement.parseMeasurement)(frame, parsingCase);
|
|
31
|
+
if (!parsedData) {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
return {
|
|
35
|
+
parsingCase,
|
|
36
|
+
measurementTypeKey: parsingCase.measurementTypeKey,
|
|
37
|
+
parsedData: parsedData
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
findParsingModel(uuid) {
|
|
41
|
+
for (const mainService of this.mainServices) {
|
|
42
|
+
const characteristic = mainService.monitorUuids.find(monitored => monitored.uuid.toLowerCase() === uuid.toLowerCase());
|
|
43
|
+
if (characteristic) {
|
|
44
|
+
return characteristic.parsingModel;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return undefined;
|
|
48
|
+
}
|
|
49
|
+
readCaseValue(parsingModel, frame) {
|
|
50
|
+
return parsingModel.caseValuePosition?.map(index => frame[index]).join("") || "";
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
exports.FrameParser = FrameParser;
|
|
54
|
+
//# sourceMappingURL=frame-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_parseMeasurement","require","FrameParser","constructor","mainServices","parse","uuid","frame","parsingModel","findParsingModel","caseValue","readCaseValue","parsingCase","cases","find","declared","parsedData","parseMeasurement","measurementTypeKey","mainService","characteristic","monitorUuids","monitored","toLowerCase","undefined","caseValuePosition","map","index","join","exports"],"sourceRoot":"../../../../../../src","sources":["modules/bt-management/services/devices/frame-parser.ts"],"mappings":";;;;;;AAMA,IAAAA,iBAAA,GAAAC,OAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMC,WAAW,CAAwB;EAC9CC,WAAWA,CAAkBC,YAA2C,EAAE;IAAA,KAA7CA,YAA2C,GAA3CA,YAA2C;EAAG;EAEpEC,KAAKA,CACVC,IAAY,EACZC,KAAe,EAC8B;IAC7C,MAAMC,YAAY,GAAG,IAAI,CAACC,gBAAgB,CAACH,IAAI,CAAC;IAEhD,IAAI,CAACE,YAAY,EAAE;MACjB;IACF;IAEA,MAAME,SAAS,GAAG,IAAI,CAACC,aAAa,CAACH,YAAY,EAAED,KAAK,CAAC;IAEzD,MAAMK,WAAW,GAAGJ,YAAY,CAACK,KAAK,EAAEC,IAAI,CACzCC,QAAQ,IAAKA,QAAQ,CAACL,SAAS,KAAKA,SACvC,CAAC;IAED,IAAI,CAACE,WAAW,EAAE;MAChB;IACF;IAEA,MAAMI,UAAU,GAAG,IAAAC,kCAAgB,EAACV,KAAK,EAAEK,WAAW,CAAC;IAEvD,IAAI,CAACI,UAAU,EAAE;MACf;IACF;IAEA,OAAO;MACLJ,WAAW;MACXM,kBAAkB,EAAEN,WAAW,CAACM,kBAAkB;MAClDF,UAAU,EAAEA;IACd,CAAC;EACH;EAEQP,gBAAgBA,CAACH,IAAY,EAA4B;IAC/D,KAAK,MAAMa,WAAW,IAAI,IAAI,CAACf,YAAY,EAAE;MAC3C,MAAMgB,cAAc,GAAGD,WAAW,CAACE,YAAY,CAACP,IAAI,CACjDQ,SAAS,IAAKA,SAAS,CAAChB,IAAI,CAACiB,WAAW,CAAC,CAAC,KAAKjB,IAAI,CAACiB,WAAW,CAAC,CACnE,CAAC;MAED,IAAIH,cAAc,EAAE;QAClB,OAAOA,cAAc,CAACZ,YAAY;MACpC;IACF;IAEA,OAAOgB,SAAS;EAClB;EAEQb,aAAaA,CAACH,YAA0B,EAAED,KAAe,EAAU;IACzE,OACEC,YAAY,CAACiB,iBAAiB,EAAEC,GAAG,CAAEC,KAAK,IAAKpB,KAAK,CAACoB,KAAK,CAAC,CAAC,CAACC,IAAI,CAAC,EAAE,CAAC,IACrE,EAAE;EAEN;AACF;AAACC,OAAA,CAAA3B,WAAA,GAAAA,WAAA","ignoreList":[]}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.MeasurementStateMachine = void 0;
|
|
7
|
+
var _caseType = require("../../types/case-type.js");
|
|
8
|
+
var _deviceStatus = require("../../types/device-status.js");
|
|
9
|
+
/**
|
|
10
|
+
* Moves a device between measuring and connected as parsed frames arrive, and decides
|
|
11
|
+
* which of them is worth reporting.
|
|
12
|
+
*
|
|
13
|
+
* A result is reported whether or not a stream preceded it, because a device already
|
|
14
|
+
* holding a finished measurement when the app connects has a real reading to hand over.
|
|
15
|
+
* Repeats are suppressed on the case transition rather than on the values, so a second
|
|
16
|
+
* measurement that happens to read the same as the first is still reported.
|
|
17
|
+
*/
|
|
18
|
+
class MeasurementStateMachine {
|
|
19
|
+
isMeasuring = false;
|
|
20
|
+
constructor(callbacks) {
|
|
21
|
+
this.callbacks = callbacks;
|
|
22
|
+
}
|
|
23
|
+
reset = () => {
|
|
24
|
+
this.isMeasuring = false;
|
|
25
|
+
this.lastCaseValue = undefined;
|
|
26
|
+
};
|
|
27
|
+
advance = ({
|
|
28
|
+
parsingCase,
|
|
29
|
+
measurementTypeKey,
|
|
30
|
+
parsedData
|
|
31
|
+
}, frame) => {
|
|
32
|
+
const isResult = parsingCase.caseType === _caseType.CaseType.RESULT;
|
|
33
|
+
const isRepeatedResult = isResult && parsingCase.caseValue === this.lastCaseValue;
|
|
34
|
+
this.lastCaseValue = parsingCase.caseValue;
|
|
35
|
+
if (parsingCase.caseType === _caseType.CaseType.STREAM && !this.isMeasuring) {
|
|
36
|
+
this.startMeasuring(measurementTypeKey);
|
|
37
|
+
}
|
|
38
|
+
if (this.isMeasuring && parsingCase.caseType === _caseType.CaseType.OTHER) {
|
|
39
|
+
this.stopMeasuring(measurementTypeKey);
|
|
40
|
+
}
|
|
41
|
+
if (isRepeatedResult) {
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
let keepMeasuring = false;
|
|
45
|
+
if (this.isMeasuring || isResult) {
|
|
46
|
+
keepMeasuring = this.callbacks.onResult?.(parsedData, frame) ?? false;
|
|
47
|
+
}
|
|
48
|
+
if (isResult && !keepMeasuring) {
|
|
49
|
+
this.stopMeasuring(measurementTypeKey);
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
startMeasuring = measurementTypeKey => {
|
|
53
|
+
this.callbacks.onStreamStart?.();
|
|
54
|
+
this.callbacks.onStatusChanged?.(_deviceStatus.DeviceStatus.MEASURING, measurementTypeKey);
|
|
55
|
+
this.isMeasuring = true;
|
|
56
|
+
};
|
|
57
|
+
stopMeasuring = measurementTypeKey => {
|
|
58
|
+
this.isMeasuring = false;
|
|
59
|
+
this.callbacks.onStatusChanged?.(_deviceStatus.DeviceStatus.CONNECTED, measurementTypeKey);
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
exports.MeasurementStateMachine = MeasurementStateMachine;
|
|
63
|
+
//# sourceMappingURL=measurement-state-machine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_caseType","require","_deviceStatus","MeasurementStateMachine","isMeasuring","constructor","callbacks","reset","lastCaseValue","undefined","advance","parsingCase","measurementTypeKey","parsedData","frame","isResult","caseType","CaseType","RESULT","isRepeatedResult","caseValue","STREAM","startMeasuring","OTHER","stopMeasuring","keepMeasuring","onResult","onStreamStart","onStatusChanged","DeviceStatus","MEASURING","CONNECTED","exports"],"sourceRoot":"../../../../../../src","sources":["modules/bt-management/services/devices/measurement-state-machine.ts"],"mappings":";;;;;;AAEA,IAAAA,SAAA,GAAAC,OAAA;AAEA,IAAAC,aAAA,GAAAD,OAAA;AAeA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAME,uBAAuB,CAAwB;EAClDC,WAAW,GAAY,KAAK;EAGpCC,WAAWA,CAAkBC,SAAoC,EAAE;IAAA,KAAtCA,SAAoC,GAApCA,SAAoC;EAAG;EAE7DC,KAAK,GAAGA,CAAA,KAAY;IACzB,IAAI,CAACH,WAAW,GAAG,KAAK;IACxB,IAAI,CAACI,aAAa,GAAGC,SAAS;EAChC,CAAC;EAEMC,OAAO,GAAGA,CACf;IACEC,WAAW;IACXC,kBAAkB;IAClBC;EAC+B,CAAC,EAClCC,KAAe,KACN;IACT,MAAMC,QAAQ,GAAGJ,WAAW,CAACK,QAAQ,KAAKC,kBAAQ,CAACC,MAAM;IAEzD,MAAMC,gBAAgB,GACpBJ,QAAQ,IAAIJ,WAAW,CAACS,SAAS,KAAK,IAAI,CAACZ,aAAa;IAE1D,IAAI,CAACA,aAAa,GAAGG,WAAW,CAACS,SAAS;IAE1C,IAAIT,WAAW,CAACK,QAAQ,KAAKC,kBAAQ,CAACI,MAAM,IAAI,CAAC,IAAI,CAACjB,WAAW,EAAE;MACjE,IAAI,CAACkB,cAAc,CAACV,kBAAkB,CAAC;IACzC;IAEA,IAAI,IAAI,CAACR,WAAW,IAAIO,WAAW,CAACK,QAAQ,KAAKC,kBAAQ,CAACM,KAAK,EAAE;MAC/D,IAAI,CAACC,aAAa,CAACZ,kBAAkB,CAAC;IACxC;IAEA,IAAIO,gBAAgB,EAAE;MACpB;IACF;IAEA,IAAIM,aAAa,GAAG,KAAK;IAEzB,IAAI,IAAI,CAACrB,WAAW,IAAIW,QAAQ,EAAE;MAChCU,aAAa,GAAG,IAAI,CAACnB,SAAS,CAACoB,QAAQ,GAAGb,UAAU,EAAEC,KAAK,CAAC,IAAI,KAAK;IACvE;IAEA,IAAIC,QAAQ,IAAI,CAACU,aAAa,EAAE;MAC9B,IAAI,CAACD,aAAa,CAACZ,kBAAkB,CAAC;IACxC;EACF,CAAC;EAEOU,cAAc,GAAIV,kBAAuC,IAAW;IAC1E,IAAI,CAACN,SAAS,CAACqB,aAAa,GAAG,CAAC;IAChC,IAAI,CAACrB,SAAS,CAACsB,eAAe,GAAGC,0BAAY,CAACC,SAAS,EAAElB,kBAAkB,CAAC;IAC5E,IAAI,CAACR,WAAW,GAAG,IAAI;EACzB,CAAC;EAEOoB,aAAa,GAAIZ,kBAAuC,IAAW;IACzE,IAAI,CAACR,WAAW,GAAG,KAAK;IACxB,IAAI,CAACE,SAAS,CAACsB,eAAe,GAC5BC,0BAAY,CAACE,SAAS,EACtBnB,kBACF,CAAC;EACH,CAAC;AACH;AAACoB,OAAA,CAAA7B,uBAAA,GAAAA,uBAAA","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sourceRoot":"../../../../../src","sources":["modules/bt-management/types/frame-read-result.ts"],"mappings":"","ignoreList":[]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.FrameReadStatus = void 0;
|
|
7
|
+
/** Outcome of trying to read one frame from a notification buffer. */
|
|
8
|
+
let FrameReadStatus = exports.FrameReadStatus = /*#__PURE__*/function (FrameReadStatus) {
|
|
9
|
+
/** No complete frame yet. The buffer must keep growing. */
|
|
10
|
+
FrameReadStatus["INCOMPLETE"] = "incomplete";
|
|
11
|
+
/** A frame was found but failed its integrity check and must not be parsed. */
|
|
12
|
+
FrameReadStatus["CORRUPT"] = "corrupt";
|
|
13
|
+
/** A complete, verified frame was isolated. */
|
|
14
|
+
FrameReadStatus["COMPLETE"] = "complete";
|
|
15
|
+
return FrameReadStatus;
|
|
16
|
+
}({});
|
|
17
|
+
//# sourceMappingURL=frame-read-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["FrameReadStatus","exports"],"sourceRoot":"../../../../../src","sources":["modules/bt-management/types/frame-read-status.ts"],"mappings":";;;;;;AAAA;AAAA,IACYA,eAAe,GAAAC,OAAA,CAAAD,eAAA,0BAAfA,eAAe;EAEzB;EAFUA,eAAe;EAKzB;EALUA,eAAe;EAQzB;EARUA,eAAe;EAAA,OAAfA,eAAe;AAAA","ignoreList":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sourceRoot":"../../../../../src","sources":["modules/bt-management/types/frame-reader.ts"],"mappings":"","ignoreList":[]}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.calculateCrc8 = void 0;
|
|
7
|
+
var _hexToByte = require("./hex-to-byte.js");
|
|
8
|
+
const CRC8_POLYNOMIAL = 0x07;
|
|
9
|
+
const BYTE_VALUE_COUNT = 256;
|
|
10
|
+
const BITS_PER_BYTE = 8;
|
|
11
|
+
const HIGH_BIT = 0x80;
|
|
12
|
+
const BYTE_MASK = 0xff;
|
|
13
|
+
const buildLookupTable = () => {
|
|
14
|
+
const table = new Uint8Array(BYTE_VALUE_COUNT);
|
|
15
|
+
for (let value = 0; value < BYTE_VALUE_COUNT; value++) {
|
|
16
|
+
let remainder = value;
|
|
17
|
+
for (let bit = 0; bit < BITS_PER_BYTE; bit++) {
|
|
18
|
+
const isHighBitSet = (remainder & HIGH_BIT) !== 0;
|
|
19
|
+
remainder = isHighBitSet ? (remainder << 1 ^ CRC8_POLYNOMIAL) & BYTE_MASK : remainder << 1 & BYTE_MASK;
|
|
20
|
+
}
|
|
21
|
+
table[value] = remainder;
|
|
22
|
+
}
|
|
23
|
+
return table;
|
|
24
|
+
};
|
|
25
|
+
const LOOKUP_TABLE = buildLookupTable();
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* CRC-8/ATM (polynomial 0x07, initial value 0x00) over the first `byteCount` bytes.
|
|
29
|
+
*
|
|
30
|
+
* Lepu devices store a frame's checksum in its final byte, so a frame is verified by
|
|
31
|
+
* running this over every byte except that one and comparing the result against it.
|
|
32
|
+
* The byte count is explicit rather than implied so the caller states which bytes are
|
|
33
|
+
* covered instead of relying on a convention hidden in here.
|
|
34
|
+
*/
|
|
35
|
+
const calculateCrc8 = (hex, byteCount) => {
|
|
36
|
+
let remainder = 0;
|
|
37
|
+
for (let index = 0; index < byteCount; index++) {
|
|
38
|
+
remainder = LOOKUP_TABLE[remainder ^ (0, _hexToByte.hexToByte)(hex[index] || "0")] || 0;
|
|
39
|
+
}
|
|
40
|
+
return remainder;
|
|
41
|
+
};
|
|
42
|
+
exports.calculateCrc8 = calculateCrc8;
|
|
43
|
+
//# sourceMappingURL=calculate-crc-8.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_hexToByte","require","CRC8_POLYNOMIAL","BYTE_VALUE_COUNT","BITS_PER_BYTE","HIGH_BIT","BYTE_MASK","buildLookupTable","table","Uint8Array","value","remainder","bit","isHighBitSet","LOOKUP_TABLE","calculateCrc8","hex","byteCount","index","hexToByte","exports"],"sourceRoot":"../../../../../src","sources":["modules/bt-management/utils/calculate-crc-8.ts"],"mappings":";;;;;;AAAA,IAAAA,UAAA,GAAAC,OAAA;AAEA,MAAMC,eAAe,GAAG,IAAI;AAC5B,MAAMC,gBAAgB,GAAG,GAAG;AAC5B,MAAMC,aAAa,GAAG,CAAC;AACvB,MAAMC,QAAQ,GAAG,IAAI;AACrB,MAAMC,SAAS,GAAG,IAAI;AAEtB,MAAMC,gBAAgB,GAAGA,CAAA,KAAkB;EACzC,MAAMC,KAAK,GAAG,IAAIC,UAAU,CAACN,gBAAgB,CAAC;EAE9C,KAAK,IAAIO,KAAK,GAAG,CAAC,EAAEA,KAAK,GAAGP,gBAAgB,EAAEO,KAAK,EAAE,EAAE;IACrD,IAAIC,SAAS,GAAGD,KAAK;IAErB,KAAK,IAAIE,GAAG,GAAG,CAAC,EAAEA,GAAG,GAAGR,aAAa,EAAEQ,GAAG,EAAE,EAAE;MAC5C,MAAMC,YAAY,GAAG,CAACF,SAAS,GAAGN,QAAQ,MAAM,CAAC;MAEjDM,SAAS,GAAGE,YAAY,GACpB,CAAEF,SAAS,IAAI,CAAC,GAAIT,eAAe,IAAII,SAAS,GAC/CK,SAAS,IAAI,CAAC,GAAIL,SAAS;IAClC;IAEAE,KAAK,CAACE,KAAK,CAAC,GAAGC,SAAS;EAC1B;EAEA,OAAOH,KAAK;AACd,CAAC;AAED,MAAMM,YAAY,GAAGP,gBAAgB,CAAC,CAAC;;AAEvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMQ,aAAa,GAAGA,CAACC,GAAa,EAAEC,SAAiB,KAAa;EACzE,IAAIN,SAAS,GAAG,CAAC;EAEjB,KAAK,IAAIO,KAAK,GAAG,CAAC,EAAEA,KAAK,GAAGD,SAAS,EAAEC,KAAK,EAAE,EAAE;IAC9CP,SAAS,GAAGG,YAAY,CAACH,SAAS,GAAG,IAAAQ,oBAAS,EAACH,GAAG,CAACE,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC;EACzE;EAEA,OAAOP,SAAS;AAClB,CAAC;AAACS,OAAA,CAAAL,aAAA,GAAAA,aAAA","ignoreList":[]}
|
|
@@ -5,6 +5,13 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.convertBpStateFlag = void 0;
|
|
7
7
|
var _bloodPressureStates = require("../types/blood-pressure-states.js");
|
|
8
|
+
/**
|
|
9
|
+
* Maps the device's measurement status byte onto a known state.
|
|
10
|
+
*
|
|
11
|
+
* An unrecognised flag reports a device error rather than a regular reading: firmware
|
|
12
|
+
* may report a failure this SDK has not seen, and treating that as a good measurement
|
|
13
|
+
* would publish a reading the device did not vouch for.
|
|
14
|
+
*/
|
|
8
15
|
const convertBpStateFlag = stateFlag => {
|
|
9
16
|
switch (stateFlag) {
|
|
10
17
|
case "00":
|
|
@@ -18,7 +25,7 @@ const convertBpStateFlag = stateFlag => {
|
|
|
18
25
|
case "04":
|
|
19
26
|
return _bloodPressureStates.BloodPressureStates.DEVICE_ERROR;
|
|
20
27
|
default:
|
|
21
|
-
return _bloodPressureStates.BloodPressureStates.
|
|
28
|
+
return _bloodPressureStates.BloodPressureStates.DEVICE_ERROR;
|
|
22
29
|
}
|
|
23
30
|
};
|
|
24
31
|
exports.convertBpStateFlag = convertBpStateFlag;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_bloodPressureStates","require","convertBpStateFlag","stateFlag","BloodPressureStates","REGULAR","LOOSE_SLEEVE","DISTURB_DETECTED","WEAK_SIGNAL","DEVICE_ERROR","exports"],"sourceRoot":"../../../../../src","sources":["modules/bt-management/utils/convert-bp-state-flag.ts"],"mappings":";;;;;;AAAA,IAAAA,oBAAA,GAAAC,OAAA;
|
|
1
|
+
{"version":3,"names":["_bloodPressureStates","require","convertBpStateFlag","stateFlag","BloodPressureStates","REGULAR","LOOSE_SLEEVE","DISTURB_DETECTED","WEAK_SIGNAL","DEVICE_ERROR","exports"],"sourceRoot":"../../../../../src","sources":["modules/bt-management/utils/convert-bp-state-flag.ts"],"mappings":";;;;;;AAAA,IAAAA,oBAAA,GAAAC,OAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMC,kBAAkB,GAAIC,SAAiB,IAA0B;EAC5E,QAAQA,SAAS;IACf,KAAK,IAAI;MACP,OAAOC,wCAAmB,CAACC,OAAO;IACpC,KAAK,IAAI;MACP,OAAOD,wCAAmB,CAACE,YAAY;IACzC,KAAK,IAAI;MACP,OAAOF,wCAAmB,CAACG,gBAAgB;IAC7C,KAAK,IAAI;MACP,OAAOH,wCAAmB,CAACI,WAAW;IACxC,KAAK,IAAI;MACP,OAAOJ,wCAAmB,CAACK,YAAY;IACzC;MACE,OAAOL,wCAAmB,CAACK,YAAY;EAC3C;AACF,CAAC;AAACC,OAAA,CAAAR,kBAAA,GAAAA,kBAAA","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_hexToByte","require","le16FromHex","hex","i","lo","hexToByte","hi","exports"],"sourceRoot":"../../../../../src","sources":["modules/bt-management/utils/le-16-from-hex.ts"],"mappings":";;;;;;AAAA,IAAAA,UAAA,GAAAC,OAAA;AAEA;AACO,MAAMC,WAAW,GAAGA,CAACC,
|
|
1
|
+
{"version":3,"names":["_hexToByte","require","le16FromHex","hex","i","lo","hexToByte","hi","exports"],"sourceRoot":"../../../../../src","sources":["modules/bt-management/utils/le-16-from-hex.ts"],"mappings":";;;;;;AAAA,IAAAA,UAAA,GAAAC,OAAA;AAEA;AACO,MAAMC,WAAW,GAAGA,CAACC,GAAsB,EAAEC,CAAS,KAAa;EACxE,MAAMC,EAAE,GAAG,IAAAC,oBAAS,EAACH,GAAG,CAACC,CAAC,CAAC,IAAI,GAAG,CAAC;EACnC,MAAMG,EAAE,GAAG,IAAAD,oBAAS,EAACH,GAAG,CAACC,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC;EAEvC,OAAOC,EAAE,GAAIE,EAAE,IAAI,CAAE;AACvB,CAAC;AAACC,OAAA,CAAAN,WAAA,GAAAA,WAAA","ignoreList":[]}
|
|
@@ -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":[]}
|