@ovok/native 0.4.4 → 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.
Files changed (109) hide show
  1. package/lib/commonjs/modules/bt-management/services/devices/bp2/bp2.device.js +8 -23
  2. package/lib/commonjs/modules/bt-management/services/devices/bp2/bp2.device.js.map +1 -1
  3. package/lib/commonjs/modules/bt-management/services/devices/bp2/bp2.frame-reader.js +89 -0
  4. package/lib/commonjs/modules/bt-management/services/devices/bp2/bp2.frame-reader.js.map +1 -0
  5. package/lib/commonjs/modules/bt-management/services/devices/bp2/bp2.main-services.js +50 -21
  6. package/lib/commonjs/modules/bt-management/services/devices/bp2/bp2.main-services.js.map +1 -1
  7. package/lib/commonjs/modules/bt-management/services/devices/bt-connection-handler.js +25 -1
  8. package/lib/commonjs/modules/bt-management/services/devices/bt-connection-handler.js.map +1 -1
  9. package/lib/commonjs/modules/bt-management/services/devices/bt-data-processor.js +80 -85
  10. package/lib/commonjs/modules/bt-management/services/devices/bt-data-processor.js.map +1 -1
  11. package/lib/commonjs/modules/bt-management/services/devices/bt-managed-device.js +25 -3
  12. package/lib/commonjs/modules/bt-management/services/devices/bt-managed-device.js.map +1 -1
  13. package/lib/commonjs/modules/bt-management/services/devices/frame-parser.js +54 -0
  14. package/lib/commonjs/modules/bt-management/services/devices/frame-parser.js.map +1 -0
  15. package/lib/commonjs/modules/bt-management/services/devices/measurement-state-machine.js +63 -0
  16. package/lib/commonjs/modules/bt-management/services/devices/measurement-state-machine.js.map +1 -0
  17. package/lib/commonjs/modules/bt-management/types/frame-read-result.js +6 -0
  18. package/lib/commonjs/modules/bt-management/types/frame-read-result.js.map +1 -0
  19. package/lib/commonjs/modules/bt-management/types/frame-read-status.js +17 -0
  20. package/lib/commonjs/modules/bt-management/types/frame-read-status.js.map +1 -0
  21. package/lib/commonjs/modules/bt-management/types/frame-reader.js +6 -0
  22. package/lib/commonjs/modules/bt-management/types/frame-reader.js.map +1 -0
  23. package/lib/commonjs/modules/bt-management/utils/calculate-crc-8.js +43 -0
  24. package/lib/commonjs/modules/bt-management/utils/calculate-crc-8.js.map +1 -0
  25. package/lib/commonjs/modules/bt-management/utils/convert-bp-state-flag.js +8 -1
  26. package/lib/commonjs/modules/bt-management/utils/convert-bp-state-flag.js.map +1 -1
  27. package/lib/commonjs/modules/bt-management/utils/le-16-from-hex.js.map +1 -1
  28. package/lib/module/modules/bt-management/services/devices/bp2/bp2.device.js +9 -23
  29. package/lib/module/modules/bt-management/services/devices/bp2/bp2.device.js.map +1 -1
  30. package/lib/module/modules/bt-management/services/devices/bp2/bp2.frame-reader.js +84 -0
  31. package/lib/module/modules/bt-management/services/devices/bp2/bp2.frame-reader.js.map +1 -0
  32. package/lib/module/modules/bt-management/services/devices/bp2/bp2.main-services.js +50 -21
  33. package/lib/module/modules/bt-management/services/devices/bp2/bp2.main-services.js.map +1 -1
  34. package/lib/module/modules/bt-management/services/devices/bt-connection-handler.js +25 -1
  35. package/lib/module/modules/bt-management/services/devices/bt-connection-handler.js.map +1 -1
  36. package/lib/module/modules/bt-management/services/devices/bt-data-processor.js +80 -85
  37. package/lib/module/modules/bt-management/services/devices/bt-data-processor.js.map +1 -1
  38. package/lib/module/modules/bt-management/services/devices/bt-managed-device.js +25 -3
  39. package/lib/module/modules/bt-management/services/devices/bt-managed-device.js.map +1 -1
  40. package/lib/module/modules/bt-management/services/devices/frame-parser.js +50 -0
  41. package/lib/module/modules/bt-management/services/devices/frame-parser.js.map +1 -0
  42. package/lib/module/modules/bt-management/services/devices/measurement-state-machine.js +58 -0
  43. package/lib/module/modules/bt-management/services/devices/measurement-state-machine.js.map +1 -0
  44. package/lib/module/modules/bt-management/types/frame-read-result.js +4 -0
  45. package/lib/module/modules/bt-management/types/frame-read-result.js.map +1 -0
  46. package/lib/module/modules/bt-management/types/frame-read-status.js +13 -0
  47. package/lib/module/modules/bt-management/types/frame-read-status.js.map +1 -0
  48. package/lib/module/modules/bt-management/types/frame-reader.js +4 -0
  49. package/lib/module/modules/bt-management/types/frame-reader.js.map +1 -0
  50. package/lib/module/modules/bt-management/utils/calculate-crc-8.js +38 -0
  51. package/lib/module/modules/bt-management/utils/calculate-crc-8.js.map +1 -0
  52. package/lib/module/modules/bt-management/utils/convert-bp-state-flag.js +9 -1
  53. package/lib/module/modules/bt-management/utils/convert-bp-state-flag.js.map +1 -1
  54. package/lib/module/modules/bt-management/utils/le-16-from-hex.js.map +1 -1
  55. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/bp2/bp2.device.d.ts +3 -1
  56. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/bp2/bp2.device.d.ts.map +1 -1
  57. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/bp2/bp2.frame-reader.d.ts +14 -0
  58. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/bp2/bp2.frame-reader.d.ts.map +1 -0
  59. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/bp2/bp2.main-services.d.ts.map +1 -1
  60. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/bt-connection-handler.d.ts +9 -1
  61. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/bt-connection-handler.d.ts.map +1 -1
  62. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/bt-data-processor.d.ts +27 -10
  63. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/bt-data-processor.d.ts.map +1 -1
  64. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/bt-managed-device.d.ts +23 -1
  65. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/bt-managed-device.d.ts.map +1 -1
  66. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/frame-parser.d.ts +19 -0
  67. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/frame-parser.d.ts.map +1 -0
  68. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/measurement-state-machine.d.ts +30 -0
  69. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/measurement-state-machine.d.ts.map +1 -0
  70. package/lib/typescript/commonjs/src/modules/bt-management/types/frame-read-result.d.ts +21 -0
  71. package/lib/typescript/commonjs/src/modules/bt-management/types/frame-read-result.d.ts.map +1 -0
  72. package/lib/typescript/commonjs/src/modules/bt-management/types/frame-read-status.d.ts +10 -0
  73. package/lib/typescript/commonjs/src/modules/bt-management/types/frame-read-status.d.ts.map +1 -0
  74. package/lib/typescript/commonjs/src/modules/bt-management/types/frame-reader.d.ts +13 -0
  75. package/lib/typescript/commonjs/src/modules/bt-management/types/frame-reader.d.ts.map +1 -0
  76. package/lib/typescript/commonjs/src/modules/bt-management/utils/calculate-crc-8.d.ts +10 -0
  77. package/lib/typescript/commonjs/src/modules/bt-management/utils/calculate-crc-8.d.ts.map +1 -0
  78. package/lib/typescript/commonjs/src/modules/bt-management/utils/convert-bp-state-flag.d.ts +7 -0
  79. package/lib/typescript/commonjs/src/modules/bt-management/utils/convert-bp-state-flag.d.ts.map +1 -1
  80. package/lib/typescript/commonjs/src/modules/bt-management/utils/le-16-from-hex.d.ts +1 -1
  81. package/lib/typescript/commonjs/src/modules/bt-management/utils/le-16-from-hex.d.ts.map +1 -1
  82. package/lib/typescript/module/src/modules/bt-management/services/devices/bp2/bp2.device.d.ts +3 -1
  83. package/lib/typescript/module/src/modules/bt-management/services/devices/bp2/bp2.device.d.ts.map +1 -1
  84. package/lib/typescript/module/src/modules/bt-management/services/devices/bp2/bp2.frame-reader.d.ts +14 -0
  85. package/lib/typescript/module/src/modules/bt-management/services/devices/bp2/bp2.frame-reader.d.ts.map +1 -0
  86. package/lib/typescript/module/src/modules/bt-management/services/devices/bp2/bp2.main-services.d.ts.map +1 -1
  87. package/lib/typescript/module/src/modules/bt-management/services/devices/bt-connection-handler.d.ts +9 -1
  88. package/lib/typescript/module/src/modules/bt-management/services/devices/bt-connection-handler.d.ts.map +1 -1
  89. package/lib/typescript/module/src/modules/bt-management/services/devices/bt-data-processor.d.ts +27 -10
  90. package/lib/typescript/module/src/modules/bt-management/services/devices/bt-data-processor.d.ts.map +1 -1
  91. package/lib/typescript/module/src/modules/bt-management/services/devices/bt-managed-device.d.ts +23 -1
  92. package/lib/typescript/module/src/modules/bt-management/services/devices/bt-managed-device.d.ts.map +1 -1
  93. package/lib/typescript/module/src/modules/bt-management/services/devices/frame-parser.d.ts +19 -0
  94. package/lib/typescript/module/src/modules/bt-management/services/devices/frame-parser.d.ts.map +1 -0
  95. package/lib/typescript/module/src/modules/bt-management/services/devices/measurement-state-machine.d.ts +30 -0
  96. package/lib/typescript/module/src/modules/bt-management/services/devices/measurement-state-machine.d.ts.map +1 -0
  97. package/lib/typescript/module/src/modules/bt-management/types/frame-read-result.d.ts +21 -0
  98. package/lib/typescript/module/src/modules/bt-management/types/frame-read-result.d.ts.map +1 -0
  99. package/lib/typescript/module/src/modules/bt-management/types/frame-read-status.d.ts +10 -0
  100. package/lib/typescript/module/src/modules/bt-management/types/frame-read-status.d.ts.map +1 -0
  101. package/lib/typescript/module/src/modules/bt-management/types/frame-reader.d.ts +13 -0
  102. package/lib/typescript/module/src/modules/bt-management/types/frame-reader.d.ts.map +1 -0
  103. package/lib/typescript/module/src/modules/bt-management/utils/calculate-crc-8.d.ts +10 -0
  104. package/lib/typescript/module/src/modules/bt-management/utils/calculate-crc-8.d.ts.map +1 -0
  105. package/lib/typescript/module/src/modules/bt-management/utils/convert-bp-state-flag.d.ts +7 -0
  106. package/lib/typescript/module/src/modules/bt-management/utils/convert-bp-state-flag.d.ts.map +1 -1
  107. package/lib/typescript/module/src/modules/bt-management/utils/le-16-from-hex.d.ts +1 -1
  108. package/lib/typescript/module/src/modules/bt-management/utils/le-16-from-hex.d.ts.map +1 -1
  109. package/package.json +1 -1
@@ -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.bind(this),
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":"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","ignoreList":[]}
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,6 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ //# sourceMappingURL=frame-read-result.js.map
@@ -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,6 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ //# sourceMappingURL=frame-reader.js.map
@@ -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.REGULAR;
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;AAEO,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,CAACC,OAAO;EACtC;AACF,CAAC;AAACK,OAAA,CAAAR,kBAAA,GAAAA,kBAAA","ignoreList":[]}
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,GAAa,EAAEC,CAAS,KAAa;EAC/D,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":[]}
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
- validatePackage = pkg => {
26
- if (pkg[0] !== "a5") {
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","sentryLogger","bloodPressureTranslatedExceptionMap","CaseType","hexToByte","i16FromHex","le16FromHex","le32FromHex","BTManagedDevice","bp2MainServices","BP2Device","collectedValues","diagramPoints","duration","mainServices","stuckDataTimeout","onStreamStart","validatePackage","pkg","headIndex","indexOf","slice","length","toNum","hex","parseInt","lenL","lenH","dataLen","totalLen","handleSuccessResult","successResult","measurementTypeKey","caseType","onError","Error","ecg","handleEcgResult","bloodPressure","handleBloodPressureResult","RESULT","error","checkIfHasErrorForEcg","onResult","handleEcgStream","dataStart","dataEnd","data","samplingNum","samplesStart","i","byteIndexInData","sampleVal","push","checkIfHasErrorForBloodPressure","bpMeasurement","status","undefined","diastolic","systolic","heartRate","REGULAR","errorString","get","DEVICE_ERROR","ecgMeasurement","diagnosticResult","POOR_WAVEFORM","LEAD_OFF"],"sourceRoot":"../../../../../../../src","sources":["modules/bt-management/services/devices/bp2/bp2.device.ts"],"mappings":"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","ignoreList":[]}
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
- name: "systolic",
53
- parseType: "number",
54
- byteIndexes: [21, 20],
55
- parseReference: 16
56
- }, {
57
- name: "diastolic",
58
- parseType: "number",
59
- byteIndexes: [23, 22],
60
- parseReference: 16
61
- }, {
62
- name: "heartRate",
63
- parseType: "number",
64
- byteIndexes: [27, 26],
65
- parseReference: 16
66
- }, {
67
- name: "status",
68
- parseType: "custom",
69
- byteIndexes: [28],
70
- customParserDefinition: a => convertBpStateFlag(a)
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,