@ovok/native 1.6.40 → 1.6.42

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 (141) hide show
  1. package/lib/commonjs/modules/bt-device/constants/device-instruction-pdfs.js +3 -1
  2. package/lib/commonjs/modules/bt-device/constants/device-instruction-pdfs.js.map +1 -1
  3. package/lib/commonjs/modules/bt-device/constants/supported-devices.js +13 -1
  4. package/lib/commonjs/modules/bt-device/constants/supported-devices.js.map +1 -1
  5. package/lib/commonjs/modules/bt-management/constants/integrated-devices-map.js +1 -1
  6. package/lib/commonjs/modules/bt-management/constants/integrated-devices-map.js.map +1 -1
  7. package/lib/commonjs/modules/bt-management/index.js +33 -0
  8. package/lib/commonjs/modules/bt-management/index.js.map +1 -1
  9. package/lib/commonjs/modules/bt-management/services/custom/compile-custom-tmb.js +34 -0
  10. package/lib/commonjs/modules/bt-management/services/custom/compile-custom-tmb.js.map +1 -0
  11. package/lib/commonjs/modules/bt-management/services/custom/define-custom-device.js +5 -0
  12. package/lib/commonjs/modules/bt-management/services/custom/define-custom-device.js.map +1 -1
  13. package/lib/commonjs/modules/bt-management/services/device-creator.js +4 -1
  14. package/lib/commonjs/modules/bt-management/services/device-creator.js.map +1 -1
  15. package/lib/commonjs/modules/bt-management/services/devices/checkme/checkme-pod.device.js +50 -0
  16. package/lib/commonjs/modules/bt-management/services/devices/checkme/checkme-pod.device.js.map +1 -0
  17. package/lib/commonjs/modules/bt-management/services/devices/checkme/checkme-pod.protocol.js +113 -0
  18. package/lib/commonjs/modules/bt-management/services/devices/checkme/checkme-pod.protocol.js.map +1 -0
  19. package/lib/commonjs/modules/bt-management/services/devices/checkme/checkme-pod.sequencer.js +74 -0
  20. package/lib/commonjs/modules/bt-management/services/devices/checkme/checkme-pod.sequencer.js.map +1 -0
  21. package/lib/commonjs/modules/bt-management/services/devices/custom/custom.device.js +16 -0
  22. package/lib/commonjs/modules/bt-management/services/devices/custom/custom.device.js.map +1 -1
  23. package/lib/commonjs/modules/bt-management/services/devices/tmb/tmb.bp-handler.js +70 -0
  24. package/lib/commonjs/modules/bt-management/services/devices/tmb/tmb.bp-handler.js.map +1 -0
  25. package/lib/commonjs/modules/bt-management/services/devices/tmb/tmb.command-sequencer.js +100 -0
  26. package/lib/commonjs/modules/bt-management/services/devices/tmb/tmb.command-sequencer.js.map +1 -0
  27. package/lib/commonjs/modules/bt-management/services/devices/tmb/tmb.frame-reader.js +54 -0
  28. package/lib/commonjs/modules/bt-management/services/devices/tmb/tmb.frame-reader.js.map +1 -0
  29. package/lib/commonjs/modules/bt-management/services/devices/viatom/viatom.bp-monitors.js +51 -2
  30. package/lib/commonjs/modules/bt-management/services/devices/viatom/viatom.bp-monitors.js.map +1 -1
  31. package/lib/commonjs/modules/bt-management/types/custom-tmb-spec.js +2 -0
  32. package/lib/commonjs/modules/bt-management/types/custom-tmb-spec.js.map +1 -0
  33. package/lib/commonjs/modules/bt-management/types/integrated-devices.js +2 -0
  34. package/lib/commonjs/modules/bt-management/types/integrated-devices.js.map +1 -1
  35. package/lib/module/modules/bt-device/constants/device-instruction-pdfs.js +3 -1
  36. package/lib/module/modules/bt-device/constants/device-instruction-pdfs.js.map +1 -1
  37. package/lib/module/modules/bt-device/constants/supported-devices.js +14 -2
  38. package/lib/module/modules/bt-device/constants/supported-devices.js.map +1 -1
  39. package/lib/module/modules/bt-management/constants/integrated-devices-map.js +1 -1
  40. package/lib/module/modules/bt-management/constants/integrated-devices-map.js.map +1 -1
  41. package/lib/module/modules/bt-management/index.js +3 -0
  42. package/lib/module/modules/bt-management/index.js.map +1 -1
  43. package/lib/module/modules/bt-management/services/custom/compile-custom-tmb.js +30 -0
  44. package/lib/module/modules/bt-management/services/custom/compile-custom-tmb.js.map +1 -0
  45. package/lib/module/modules/bt-management/services/custom/define-custom-device.js +5 -0
  46. package/lib/module/modules/bt-management/services/custom/define-custom-device.js.map +1 -1
  47. package/lib/module/modules/bt-management/services/device-creator.js +4 -1
  48. package/lib/module/modules/bt-management/services/device-creator.js.map +1 -1
  49. package/lib/module/modules/bt-management/services/devices/checkme/checkme-pod.device.js +45 -0
  50. package/lib/module/modules/bt-management/services/devices/checkme/checkme-pod.device.js.map +1 -0
  51. package/lib/module/modules/bt-management/services/devices/checkme/checkme-pod.protocol.js +104 -0
  52. package/lib/module/modules/bt-management/services/devices/checkme/checkme-pod.protocol.js.map +1 -0
  53. package/lib/module/modules/bt-management/services/devices/checkme/checkme-pod.sequencer.js +69 -0
  54. package/lib/module/modules/bt-management/services/devices/checkme/checkme-pod.sequencer.js.map +1 -0
  55. package/lib/module/modules/bt-management/services/devices/custom/custom.device.js +16 -0
  56. package/lib/module/modules/bt-management/services/devices/custom/custom.device.js.map +1 -1
  57. package/lib/module/modules/bt-management/services/devices/tmb/tmb.bp-handler.js +65 -0
  58. package/lib/module/modules/bt-management/services/devices/tmb/tmb.bp-handler.js.map +1 -0
  59. package/lib/module/modules/bt-management/services/devices/tmb/tmb.command-sequencer.js +96 -0
  60. package/lib/module/modules/bt-management/services/devices/tmb/tmb.command-sequencer.js.map +1 -0
  61. package/lib/module/modules/bt-management/services/devices/tmb/tmb.frame-reader.js +49 -0
  62. package/lib/module/modules/bt-management/services/devices/tmb/tmb.frame-reader.js.map +1 -0
  63. package/lib/module/modules/bt-management/services/devices/viatom/viatom.bp-monitors.js +49 -1
  64. package/lib/module/modules/bt-management/services/devices/viatom/viatom.bp-monitors.js.map +1 -1
  65. package/lib/module/modules/bt-management/types/custom-device-definition.js.map +1 -1
  66. package/lib/module/modules/bt-management/types/custom-tmb-spec.js +2 -0
  67. package/lib/module/modules/bt-management/types/custom-tmb-spec.js.map +1 -0
  68. package/lib/module/modules/bt-management/types/device-measurement-map.js.map +1 -1
  69. package/lib/module/modules/bt-management/types/integrated-devices.js +2 -0
  70. package/lib/module/modules/bt-management/types/integrated-devices.js.map +1 -1
  71. package/lib/typescript/commonjs/src/modules/bt-device/constants/device-instruction-pdfs.d.ts.map +1 -1
  72. package/lib/typescript/commonjs/src/modules/bt-device/constants/supported-devices.d.ts.map +1 -1
  73. package/lib/typescript/commonjs/src/modules/bt-management/constants/integrated-devices-map.d.ts.map +1 -1
  74. package/lib/typescript/commonjs/src/modules/bt-management/index.d.ts +3 -0
  75. package/lib/typescript/commonjs/src/modules/bt-management/index.d.ts.map +1 -1
  76. package/lib/typescript/commonjs/src/modules/bt-management/services/custom/compile-custom-tmb.d.ts +5 -0
  77. package/lib/typescript/commonjs/src/modules/bt-management/services/custom/compile-custom-tmb.d.ts.map +1 -0
  78. package/lib/typescript/commonjs/src/modules/bt-management/services/custom/define-custom-device.d.ts.map +1 -1
  79. package/lib/typescript/commonjs/src/modules/bt-management/services/device-creator.d.ts.map +1 -1
  80. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/checkme/checkme-pod.device.d.ts +22 -0
  81. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/checkme/checkme-pod.device.d.ts.map +1 -0
  82. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/checkme/checkme-pod.protocol.d.ts +37 -0
  83. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/checkme/checkme-pod.protocol.d.ts.map +1 -0
  84. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/checkme/checkme-pod.sequencer.d.ts +26 -0
  85. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/checkme/checkme-pod.sequencer.d.ts.map +1 -0
  86. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/custom/custom.device.d.ts +2 -0
  87. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/custom/custom.device.d.ts.map +1 -1
  88. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/tmb/tmb.bp-handler.d.ts +4 -0
  89. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/tmb/tmb.bp-handler.d.ts.map +1 -0
  90. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/tmb/tmb.command-sequencer.d.ts +28 -0
  91. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/tmb/tmb.command-sequencer.d.ts.map +1 -0
  92. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/tmb/tmb.frame-reader.d.ts +8 -0
  93. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/tmb/tmb.frame-reader.d.ts.map +1 -0
  94. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/viatom/viatom.bp-monitors.d.ts +4 -1
  95. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/viatom/viatom.bp-monitors.d.ts.map +1 -1
  96. package/lib/typescript/commonjs/src/modules/bt-management/types/custom-device-definition.d.ts +3 -0
  97. package/lib/typescript/commonjs/src/modules/bt-management/types/custom-device-definition.d.ts.map +1 -1
  98. package/lib/typescript/commonjs/src/modules/bt-management/types/custom-device-spec.d.ts +3 -0
  99. package/lib/typescript/commonjs/src/modules/bt-management/types/custom-device-spec.d.ts.map +1 -1
  100. package/lib/typescript/commonjs/src/modules/bt-management/types/custom-tmb-spec.d.ts +7 -0
  101. package/lib/typescript/commonjs/src/modules/bt-management/types/custom-tmb-spec.d.ts.map +1 -0
  102. package/lib/typescript/commonjs/src/modules/bt-management/types/device-measurement-map.d.ts +2 -0
  103. package/lib/typescript/commonjs/src/modules/bt-management/types/device-measurement-map.d.ts.map +1 -1
  104. package/lib/typescript/commonjs/src/modules/bt-management/types/integrated-devices.d.ts +3 -1
  105. package/lib/typescript/commonjs/src/modules/bt-management/types/integrated-devices.d.ts.map +1 -1
  106. package/lib/typescript/module/src/modules/bt-device/constants/device-instruction-pdfs.d.ts.map +1 -1
  107. package/lib/typescript/module/src/modules/bt-device/constants/supported-devices.d.ts.map +1 -1
  108. package/lib/typescript/module/src/modules/bt-management/constants/integrated-devices-map.d.ts.map +1 -1
  109. package/lib/typescript/module/src/modules/bt-management/index.d.ts +3 -0
  110. package/lib/typescript/module/src/modules/bt-management/index.d.ts.map +1 -1
  111. package/lib/typescript/module/src/modules/bt-management/services/custom/compile-custom-tmb.d.ts +5 -0
  112. package/lib/typescript/module/src/modules/bt-management/services/custom/compile-custom-tmb.d.ts.map +1 -0
  113. package/lib/typescript/module/src/modules/bt-management/services/custom/define-custom-device.d.ts.map +1 -1
  114. package/lib/typescript/module/src/modules/bt-management/services/device-creator.d.ts.map +1 -1
  115. package/lib/typescript/module/src/modules/bt-management/services/devices/checkme/checkme-pod.device.d.ts +22 -0
  116. package/lib/typescript/module/src/modules/bt-management/services/devices/checkme/checkme-pod.device.d.ts.map +1 -0
  117. package/lib/typescript/module/src/modules/bt-management/services/devices/checkme/checkme-pod.protocol.d.ts +37 -0
  118. package/lib/typescript/module/src/modules/bt-management/services/devices/checkme/checkme-pod.protocol.d.ts.map +1 -0
  119. package/lib/typescript/module/src/modules/bt-management/services/devices/checkme/checkme-pod.sequencer.d.ts +26 -0
  120. package/lib/typescript/module/src/modules/bt-management/services/devices/checkme/checkme-pod.sequencer.d.ts.map +1 -0
  121. package/lib/typescript/module/src/modules/bt-management/services/devices/custom/custom.device.d.ts +2 -0
  122. package/lib/typescript/module/src/modules/bt-management/services/devices/custom/custom.device.d.ts.map +1 -1
  123. package/lib/typescript/module/src/modules/bt-management/services/devices/tmb/tmb.bp-handler.d.ts +4 -0
  124. package/lib/typescript/module/src/modules/bt-management/services/devices/tmb/tmb.bp-handler.d.ts.map +1 -0
  125. package/lib/typescript/module/src/modules/bt-management/services/devices/tmb/tmb.command-sequencer.d.ts +28 -0
  126. package/lib/typescript/module/src/modules/bt-management/services/devices/tmb/tmb.command-sequencer.d.ts.map +1 -0
  127. package/lib/typescript/module/src/modules/bt-management/services/devices/tmb/tmb.frame-reader.d.ts +8 -0
  128. package/lib/typescript/module/src/modules/bt-management/services/devices/tmb/tmb.frame-reader.d.ts.map +1 -0
  129. package/lib/typescript/module/src/modules/bt-management/services/devices/viatom/viatom.bp-monitors.d.ts +4 -1
  130. package/lib/typescript/module/src/modules/bt-management/services/devices/viatom/viatom.bp-monitors.d.ts.map +1 -1
  131. package/lib/typescript/module/src/modules/bt-management/types/custom-device-definition.d.ts +3 -0
  132. package/lib/typescript/module/src/modules/bt-management/types/custom-device-definition.d.ts.map +1 -1
  133. package/lib/typescript/module/src/modules/bt-management/types/custom-device-spec.d.ts +3 -0
  134. package/lib/typescript/module/src/modules/bt-management/types/custom-device-spec.d.ts.map +1 -1
  135. package/lib/typescript/module/src/modules/bt-management/types/custom-tmb-spec.d.ts +7 -0
  136. package/lib/typescript/module/src/modules/bt-management/types/custom-tmb-spec.d.ts.map +1 -0
  137. package/lib/typescript/module/src/modules/bt-management/types/device-measurement-map.d.ts +2 -0
  138. package/lib/typescript/module/src/modules/bt-management/types/device-measurement-map.d.ts.map +1 -1
  139. package/lib/typescript/module/src/modules/bt-management/types/integrated-devices.d.ts +3 -1
  140. package/lib/typescript/module/src/modules/bt-management/types/integrated-devices.d.ts.map +1 -1
  141. package/package.json +1 -1
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+
3
+ /* eslint-disable import/group-exports */
4
+
5
+ import { FrameReadStatus } from "../../../types/frame-read-status.js";
6
+ import { calculateCrc8 } from "../../../utils/calculate-crc-8.js";
7
+ import { hexToByte } from "../../../utils/hex-to-byte.js";
8
+ export const CHECKME_POD_SERVICE = "14839ac4-7d7e-415c-9a42-167340cf2339";
9
+ export const CHECKME_POD_WRITE = "8b00ace7-eb0b-49b0-bbe9-9aee0a26e1a3";
10
+ export const CHECKME_POD_NOTIFY = "0734594a-a8e7-4b1a-a6b1-cd5243059a57";
11
+ export const CheckmePodCommand = {
12
+ info: 0x14,
13
+ syncParameters: 0x16,
14
+ realtimeData: 0x20
15
+ };
16
+ const byte = value => (value & 0xff).toString(16).padStart(2, "0");
17
+ const littleEndian16 = (bytes, offset) => hexToByte(bytes[offset] ?? "00") | hexToByte(bytes[offset + 1] ?? "00") << 8;
18
+ const ascii = value => [...value].map(character => byte(character.charCodeAt(0)));
19
+
20
+ /** Builds the AA command envelope used by Checkme Pod and Checkme Pod-WPS. */
21
+ export const checkmePodCommand = (command, payload = [], sequence = 0) => {
22
+ const frame = ["aa", byte(command), byte(~command), byte(sequence), byte(sequence >> 8), byte(payload.length), byte(payload.length >> 8), ...payload, "00"];
23
+ frame[frame.length - 1] = byte(calculateCrc8(frame, frame.length - 1));
24
+ return frame;
25
+ };
26
+ export const checkmePodSyncTime = (now = new Date()) => {
27
+ const pad = value => value.toString().padStart(2, "0");
28
+ const time = `${now.getFullYear().toString().padStart(4, "0")}-${pad(now.getMonth() + 1)}-${pad(now.getDate())},${pad(now.getHours())}:${pad(now.getMinutes())}:${pad(now.getSeconds())}`;
29
+ return checkmePodCommand(CheckmePodCommand.syncParameters, ascii(JSON.stringify({
30
+ SetTIME: time
31
+ })));
32
+ };
33
+ export const decodeCheckmePodResponse = frame => {
34
+ if (hexToByte(frame[0] ?? "00") !== 0x55) {
35
+ return undefined;
36
+ }
37
+ const length = littleEndian16(frame, 5);
38
+ if (frame.length !== length + 8) {
39
+ return undefined;
40
+ }
41
+ return {
42
+ state: hexToByte(frame[1] ?? "01") === 0,
43
+ sequence: littleEndian16(frame, 3),
44
+ content: frame.slice(7, 7 + length)
45
+ };
46
+ };
47
+ /** Decodes the 20-byte RtParam prefix used by the vendor's realtime response. */
48
+ export const parseCheckmePodRealtimeReading = content => {
49
+ if (content.length < 20) {
50
+ return undefined;
51
+ }
52
+ const state = hexToByte(content[7] ?? "00");
53
+ return {
54
+ pulseRate: littleEndian16(content, 0),
55
+ bloodOxygen: littleEndian16(content, 2),
56
+ perfusionIndex: hexToByte(content[4] ?? "00") / 10,
57
+ temperature: littleEndian16(content, 5) / 10,
58
+ oxygenState: state & 0x03,
59
+ temperatureState: (state & 0x0c) >> 2,
60
+ batteryState: hexToByte(content[8] ?? "00"),
61
+ battery: hexToByte(content[9] ?? "00"),
62
+ runStatus: hexToByte(content[10] ?? "00")
63
+ };
64
+ };
65
+
66
+ /** Reads split and concatenated Checkme Pod notifications with CRC validation. */
67
+ export class CheckmePodFrameReader {
68
+ readFrame(buffer) {
69
+ const start = buffer.findIndex((value, index) => hexToByte(value) === 0x55 && index + 2 < buffer.length && hexToByte(buffer[index + 1] ?? "00") === (~hexToByte(buffer[index + 2] ?? "00") & 0xff));
70
+ if (start < 0) {
71
+ return {
72
+ status: FrameReadStatus.INCOMPLETE,
73
+ consumedBytes: Math.max(0, buffer.length - 1)
74
+ };
75
+ }
76
+ const payloadLength = littleEndian16(buffer, start + 5);
77
+ const frameLength = payloadLength + 8;
78
+ if (frameLength < 8) {
79
+ return {
80
+ status: FrameReadStatus.CORRUPT,
81
+ consumedBytes: start + 1
82
+ };
83
+ }
84
+ if (start + frameLength > buffer.length) {
85
+ return {
86
+ status: FrameReadStatus.INCOMPLETE,
87
+ consumedBytes: start
88
+ };
89
+ }
90
+ const frame = buffer.slice(start, start + frameLength);
91
+ if (calculateCrc8([...frame], frame.length - 1) !== hexToByte(frame.at(-1) ?? "00")) {
92
+ return {
93
+ status: FrameReadStatus.CORRUPT,
94
+ consumedBytes: start + 1
95
+ };
96
+ }
97
+ return {
98
+ status: FrameReadStatus.COMPLETE,
99
+ consumedBytes: start + frameLength,
100
+ frame
101
+ };
102
+ }
103
+ }
104
+ //# sourceMappingURL=checkme-pod.protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["FrameReadStatus","calculateCrc8","hexToByte","CHECKME_POD_SERVICE","CHECKME_POD_WRITE","CHECKME_POD_NOTIFY","CheckmePodCommand","info","syncParameters","realtimeData","byte","value","toString","padStart","littleEndian16","bytes","offset","ascii","map","character","charCodeAt","checkmePodCommand","command","payload","sequence","frame","length","checkmePodSyncTime","now","Date","pad","time","getFullYear","getMonth","getDate","getHours","getMinutes","getSeconds","JSON","stringify","SetTIME","decodeCheckmePodResponse","undefined","state","content","slice","parseCheckmePodRealtimeReading","pulseRate","bloodOxygen","perfusionIndex","temperature","oxygenState","temperatureState","batteryState","battery","runStatus","CheckmePodFrameReader","readFrame","buffer","start","findIndex","index","status","INCOMPLETE","consumedBytes","Math","max","payloadLength","frameLength","CORRUPT","at","COMPLETE"],"sourceRoot":"../../../../../../../src","sources":["modules/bt-management/services/devices/checkme/checkme-pod.protocol.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+
3
+ import { MeasurementTypeKey } from "@ovok/core";
4
+ import { CaseType } from "../../../types/case-type.js";
5
+ import { CheckmePodCommand, checkmePodCommand, checkmePodSyncTime, decodeCheckmePodResponse, parseCheckmePodRealtimeReading } from "./checkme-pod.protocol.js";
6
+ const command = (write, frame) => ({
7
+ ...write,
8
+ frame,
9
+ withoutResponse: true
10
+ });
11
+ const valid = value => Number.isFinite(value) && value > 0;
12
+
13
+ /** Drives the info -> clock sync -> realtime exchange used by Checkme Pod. */
14
+ export class CheckmePodSequencer {
15
+ phase = "info";
16
+ constructor(params) {
17
+ this.params = params;
18
+ }
19
+ initialCommands = () => [this.write(checkmePodCommand(CheckmePodCommand.info))];
20
+ nextCommand = frame => {
21
+ const response = decodeCheckmePodResponse(frame);
22
+ if (!response?.state) {
23
+ return undefined;
24
+ }
25
+ if (this.phase === "info") {
26
+ this.phase = "sync";
27
+ return [this.write(checkmePodSyncTime(this.params.now?.() ?? new Date()))];
28
+ }
29
+ if (this.phase === "sync") {
30
+ this.phase = "realtime";
31
+ return [this.write(checkmePodCommand(CheckmePodCommand.realtimeData))];
32
+ }
33
+ this.report(response);
34
+ return [this.write(checkmePodCommand(CheckmePodCommand.realtimeData))];
35
+ };
36
+ write = frame => command(this.params.write, frame);
37
+ report = response => {
38
+ const reading = parseCheckmePodRealtimeReading(response.content);
39
+ if (!reading) {
40
+ return;
41
+ }
42
+ const recordedAt = this.params.now?.() ?? new Date();
43
+ if (valid(reading.bloodOxygen) || valid(reading.pulseRate)) {
44
+ this.params.onResult({
45
+ caseType: CaseType.RESULT,
46
+ measurementTypeKey: MeasurementTypeKey.bloodOxygenPulseRate,
47
+ ...(valid(reading.bloodOxygen) ? {
48
+ bloodOxygen: reading.bloodOxygen
49
+ } : {}),
50
+ ...(valid(reading.pulseRate) ? {
51
+ pulseRate: reading.pulseRate
52
+ } : {}),
53
+ ...(valid(reading.perfusionIndex) ? {
54
+ perfusionIndex: reading.perfusionIndex
55
+ } : {}),
56
+ recordedAt
57
+ });
58
+ }
59
+ if (valid(reading.temperature)) {
60
+ this.params.onResult({
61
+ caseType: CaseType.RESULT,
62
+ measurementTypeKey: MeasurementTypeKey.temperature,
63
+ bodyTemp: reading.temperature,
64
+ recordedAt
65
+ });
66
+ }
67
+ };
68
+ }
69
+ //# sourceMappingURL=checkme-pod.sequencer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["MeasurementTypeKey","CaseType","CheckmePodCommand","checkmePodCommand","checkmePodSyncTime","decodeCheckmePodResponse","parseCheckmePodRealtimeReading","command","write","frame","withoutResponse","valid","value","Number","isFinite","CheckmePodSequencer","phase","constructor","params","initialCommands","info","nextCommand","response","state","undefined","now","Date","realtimeData","report","reading","content","recordedAt","bloodOxygen","pulseRate","onResult","caseType","RESULT","measurementTypeKey","bloodOxygenPulseRate","perfusionIndex","temperature","bodyTemp"],"sourceRoot":"../../../../../../../src","sources":["modules/bt-management/services/devices/checkme/checkme-pod.sequencer.ts"],"mappings":"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","ignoreList":[]}
@@ -11,6 +11,8 @@ import { BTManagedDevice } from "../bt-managed-device.js";
11
11
  import { LepuCommandBuilder } from "../lepu/lepu.command-builder.js";
12
12
  import { LepuEcgTransferSequencer } from "../lepu/lepu.ecg-transfer.js";
13
13
  import { LepuFrameReader } from "../lepu/lepu.frame-reader.js";
14
+ import { TmbCommandSequencer } from "../tmb/tmb.command-sequencer.js";
15
+ import { TmbFrameReader } from "../tmb/tmb.frame-reader.js";
14
16
  import { decodeViatomBp3File } from "../viatom/viatom.bp3-files.js";
15
17
  import { decodeViatomEcgRecording, recordedAtFromViatomFileName } from "../viatom/viatom.ecg-files.js";
16
18
  import { createLepuSequencer, recordLepuIdentity, selectLepu } from "./custom-lepu-sequencer.js";
@@ -46,11 +48,25 @@ export class CustomDevice extends BTManagedDevice {
46
48
  this.preferredMtu = definition.preferredMtu;
47
49
  }
48
50
  this.declareLepuProtocol(definition, params.clockSync);
51
+ this.declareTmbProtocol(definition, params.clockSync);
49
52
  definition.frames.forEach((frame, uuid) => {
50
53
  this.validators.set(uuid, createFrameValidator(frame));
51
54
  });
52
55
  }
53
56
 
57
+ /** Gives a TMB declaration its length-prefixed reader and history command sequence. */
58
+ declareTmbProtocol(definition, clockSync) {
59
+ const tmb = definition.tmb;
60
+ if (!tmb) {
61
+ return;
62
+ }
63
+ this.frameReader = new TmbFrameReader();
64
+ this.createCommandSequencer = () => new TmbCommandSequencer({
65
+ protocol: tmb,
66
+ clockSync
67
+ });
68
+ }
69
+
54
70
  /**
55
71
  * Gives a Lepu declaration its frame reader and its command sequence.
56
72
  *
@@ -1 +1 @@
1
- {"version":3,"names":["MeasurementTypeKey","CaseType","createFrameValidator","parseMeasurement","discardedReadingError","rejectCustomReading","decodeBP2File","BTManagedDevice","LepuCommandBuilder","LepuEcgTransferSequencer","LepuFrameReader","decodeViatomBp3File","decodeViatomEcgRecording","recordedAtFromViatomFileName","createLepuSequencer","recordLepuIdentity","selectLepu","CustomDevice","reportedHistoryIds","Set","validators","Map","sessionAggregates","constructor","device","params","definition","oneReadingPerConnection","frameHandler","createFrameHandler","sessionPolicy","deviceData","clockSync","deliveredFileNames","deliveredEcgFileNames","selectedLepu","lepu","manufacturerData","undefined","mainServices","manufacturerDataProtocol","filter","service","uuid","write","serviceUuid","frameReader","stuckDataTimeout","reportsBondedEvent","preferredMtu","declareLepuProtocol","frames","forEach","frame","set","startBytes","createCommandSequencer","fileTransfer","clear","characteristicUuid","builder","rejectEncryptionAtBytes","expectedDeviceTypes","onIdentified","onRefused","onIdentityRefused","onFile","reportViatomEcgFile","reportViatomBp2File","reportViatomBp3File","skipFiles","acceptFile","name","ecgFileDecoder","test","pollCommand","pollIntervalMs","afterTransfer","build","onError","reason","Error","onProgress","progress","onConnectionEvent","kind","current","receivedBytes","total","totalBytes","file","decoded","content","samples","length","onResult","measurementTypeKey","ecg","caseType","RESULT","diagramPoints","duration","recordedAt","recordingId","has","add","info","id","validatePackage","pkg","validate","get","String","toLowerCase","handleDependentResult","data","parsingCase","requiresStream","isMeasuring","OTHER","handleFrame","parsedData","handlerOnly","captureSessionSample","STREAM","shouldReportDependentResult","reportFrame","error","_data","handleSuccessResult","successResult","collectedValues","emit","reading","handleMeasurementEnd","policy","aggregates","values","sessionStartedAt","aggregate","count","minSamples","summary","sample","Object","fromEntries","sums","entries","map","sessionAverage","decorateReading","value","decimals","fields","Math","trunc","Number","toFixed","measurements","frameRecordedAt","Date","measurement","createMeasurement","rejection","measurementRejection","key","existing","fieldNames","recordOffset","repeated","repeatedRecords","report","records","floor","from","recordBytes","record","discard","reportMeasurement","find","message"],"sourceRoot":"../../../../../../../src","sources":["modules/bt-management/services/devices/custom/custom.device.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["MeasurementTypeKey","CaseType","createFrameValidator","parseMeasurement","discardedReadingError","rejectCustomReading","decodeBP2File","BTManagedDevice","LepuCommandBuilder","LepuEcgTransferSequencer","LepuFrameReader","TmbCommandSequencer","TmbFrameReader","decodeViatomBp3File","decodeViatomEcgRecording","recordedAtFromViatomFileName","createLepuSequencer","recordLepuIdentity","selectLepu","CustomDevice","reportedHistoryIds","Set","validators","Map","sessionAggregates","constructor","device","params","definition","oneReadingPerConnection","frameHandler","createFrameHandler","sessionPolicy","deviceData","clockSync","deliveredFileNames","deliveredEcgFileNames","selectedLepu","lepu","manufacturerData","undefined","mainServices","manufacturerDataProtocol","filter","service","uuid","write","serviceUuid","frameReader","stuckDataTimeout","reportsBondedEvent","preferredMtu","declareLepuProtocol","declareTmbProtocol","frames","forEach","frame","set","tmb","createCommandSequencer","protocol","startBytes","fileTransfer","clear","characteristicUuid","builder","rejectEncryptionAtBytes","expectedDeviceTypes","onIdentified","onRefused","onIdentityRefused","onFile","reportViatomEcgFile","reportViatomBp2File","reportViatomBp3File","skipFiles","acceptFile","name","ecgFileDecoder","test","pollCommand","pollIntervalMs","afterTransfer","build","onError","reason","Error","onProgress","progress","onConnectionEvent","kind","current","receivedBytes","total","totalBytes","file","decoded","content","samples","length","onResult","measurementTypeKey","ecg","caseType","RESULT","diagramPoints","duration","recordedAt","recordingId","has","add","info","id","validatePackage","pkg","validate","get","String","toLowerCase","handleDependentResult","data","parsingCase","requiresStream","isMeasuring","OTHER","handleFrame","parsedData","handlerOnly","captureSessionSample","STREAM","shouldReportDependentResult","reportFrame","error","_data","handleSuccessResult","successResult","collectedValues","emit","reading","handleMeasurementEnd","policy","aggregates","values","sessionStartedAt","aggregate","count","minSamples","summary","sample","Object","fromEntries","sums","entries","map","sessionAverage","decorateReading","value","decimals","fields","Math","trunc","Number","toFixed","measurements","frameRecordedAt","Date","measurement","createMeasurement","rejection","measurementRejection","key","existing","fieldNames","recordOffset","repeated","repeatedRecords","report","records","floor","from","recordBytes","record","discard","reportMeasurement","find","message"],"sourceRoot":"../../../../../../../src","sources":["modules/bt-management/services/devices/custom/custom.device.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+
3
+ import { MeasurementTypeKey } from "@ovok/core";
4
+ import { CaseType } from "../../../types/case-type.js";
5
+ import { hexToByte } from "../../../utils/hex-to-byte.js";
6
+ import { recordedAtFromLocalSeconds } from "../bp2/bp2.files.js";
7
+ import { TMB_EPOCH_SECONDS } from "./tmb.command-sequencer.js";
8
+ const RECORD_BYTES = 21;
9
+ const RECORD_RESPONSE = 0x4902;
10
+ const uint16 = (values, offset) => hexToByte(values[offset] ?? "00") << 8 | hexToByte(values[offset + 1] ?? "00");
11
+ const uint32 = (values, offset) => hexToByte(values[offset] ?? "00") << 24 | hexToByte(values[offset + 1] ?? "00") << 16 | hexToByte(values[offset + 2] ?? "00") << 8 | hexToByte(values[offset + 3] ?? "00");
12
+ const commandOf = frame => {
13
+ const head = hexToByte(frame[0] ?? "00");
14
+ if (head === 0x21 || head === 0) {
15
+ return 0;
16
+ }
17
+ return hexToByte(frame[2] ?? "00") << 8 | hexToByte(frame[3] ?? "00");
18
+ };
19
+ const payload = frame => frame.slice(hexToByte(frame[0] ?? "00") === 0x21 ? 2 : 4);
20
+
21
+ /** Decodes the fixed 21-byte TMB blood-pressure history records. */
22
+ export const createTmbBloodPressureFrameHandler = () => {
23
+ const pending = [];
24
+ const reported = new Set();
25
+ return ({
26
+ frame,
27
+ emit
28
+ }) => {
29
+ const head = hexToByte(frame[0] ?? "00");
30
+ const opcode = commandOf(frame);
31
+ if (head !== 0x21 && opcode !== RECORD_RESPONSE) {
32
+ return;
33
+ }
34
+ pending.push(...payload(frame));
35
+ while (pending.length >= RECORD_BYTES) {
36
+ const record = pending.splice(0, RECORD_BYTES);
37
+ const timestamp = uint32(record, 17) + TMB_EPOCH_SECONDS;
38
+ const systolic = uint16(record, 6);
39
+ const diastolic = uint16(record, 8);
40
+ const meanArterialPressure = uint16(record, 10);
41
+ const heartRate = uint16(record, 14);
42
+ const userId = hexToByte(record[16] ?? "00");
43
+ const recordingId = `tmb:${userId}:${timestamp}:${systolic}:${diastolic}`;
44
+ if (reported.has(recordingId) || systolic < 50 || systolic > 300 || diastolic < 30 || diastolic > 200 || meanArterialPressure < 30 || meanArterialPressure > 250 || heartRate < 20 || heartRate > 240) {
45
+ continue;
46
+ }
47
+ reported.add(recordingId);
48
+ const recordedAt = recordedAtFromLocalSeconds(timestamp);
49
+ emit({
50
+ measurementTypeKey: MeasurementTypeKey.bloodPressure,
51
+ caseType: CaseType.RESULT,
52
+ systolic,
53
+ diastolic,
54
+ meanArterialPressure,
55
+ heartRate,
56
+ memorySlot: userId,
57
+ ...(recordedAt ? {
58
+ recordedAt
59
+ } : {}),
60
+ recordingId
61
+ });
62
+ }
63
+ };
64
+ };
65
+ //# sourceMappingURL=tmb.bp-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["MeasurementTypeKey","CaseType","hexToByte","recordedAtFromLocalSeconds","TMB_EPOCH_SECONDS","RECORD_BYTES","RECORD_RESPONSE","uint16","values","offset","uint32","commandOf","frame","head","payload","slice","createTmbBloodPressureFrameHandler","pending","reported","Set","emit","opcode","push","length","record","splice","timestamp","systolic","diastolic","meanArterialPressure","heartRate","userId","recordingId","has","add","recordedAt","measurementTypeKey","bloodPressure","caseType","RESULT","memorySlot"],"sourceRoot":"../../../../../../../src","sources":["modules/bt-management/services/devices/tmb/tmb.bp-handler.ts"],"mappings":";;AAAA,SAAmCA,kBAAkB,QAAQ,YAAY;AAEzE,SAASC,QAAQ,QAAQ,6BAA0B;AAEnD,SAASC,SAAS,QAAQ,+BAA4B;AACtD,SAASC,0BAA0B,QAAQ,qBAAkB;AAE7D,SAASC,iBAAiB,QAAQ,4BAAyB;AAE3D,MAAMC,YAAY,GAAG,EAAE;AACvB,MAAMC,eAAe,GAAG,MAAM;AAE9B,MAAMC,MAAM,GAAGA,CAACC,MAAyB,EAAEC,MAAc,KACtDP,SAAS,CAACM,MAAM,CAACC,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,GAAIP,SAAS,CAACM,MAAM,CAACC,MAAM,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC;AAElF,MAAMC,MAAM,GAAGA,CAACF,MAAyB,EAAEC,MAAc,KACtDP,SAAS,CAACM,MAAM,CAACC,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,GACvCP,SAAS,CAACM,MAAM,CAACC,MAAM,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,EAAG,GAC5CP,SAAS,CAACM,MAAM,CAACC,MAAM,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAE,GAC5CP,SAAS,CAACM,MAAM,CAACC,MAAM,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC;AAEvC,MAAME,SAAS,GAAIC,KAAwB,IAAa;EACtD,MAAMC,IAAI,GAAGX,SAAS,CAACU,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;EAExC,IAAIC,IAAI,KAAK,IAAI,IAAIA,IAAI,KAAK,CAAC,EAAE;IAC/B,OAAO,CAAC;EACV;EAEA,OAAQX,SAAS,CAACU,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,GAAIV,SAAS,CAACU,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AACzE,CAAC;AAED,MAAME,OAAO,GAAIF,KAAwB,IACvCA,KAAK,CAACG,KAAK,CAACb,SAAS,CAACU,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;;AAE3D;AACA,OAAO,MAAMI,kCAA6D,GAAGA,CAAA,KAAM;EACjF,MAAMC,OAAiB,GAAG,EAAE;EAC5B,MAAMC,QAAQ,GAAG,IAAIC,GAAG,CAAS,CAAC;EAElC,OAAO,CAAC;IAAEP,KAAK;IAAEQ;EAAK,CAAC,KAAK;IAC1B,MAAMP,IAAI,GAAGX,SAAS,CAACU,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;IACxC,MAAMS,MAAM,GAAGV,SAAS,CAACC,KAAK,CAAC;IAE/B,IAAIC,IAAI,KAAK,IAAI,IAAIQ,MAAM,KAAKf,eAAe,EAAE;MAC/C;IACF;IAEAW,OAAO,CAACK,IAAI,CAAC,GAAGR,OAAO,CAACF,KAAK,CAAC,CAAC;IAE/B,OAAOK,OAAO,CAACM,MAAM,IAAIlB,YAAY,EAAE;MACrC,MAAMmB,MAAM,GAAGP,OAAO,CAACQ,MAAM,CAAC,CAAC,EAAEpB,YAAY,CAAC;MAC9C,MAAMqB,SAAS,GAAGhB,MAAM,CAACc,MAAM,EAAE,EAAE,CAAC,GAAGpB,iBAAiB;MACxD,MAAMuB,QAAQ,GAAGpB,MAAM,CAACiB,MAAM,EAAE,CAAC,CAAC;MAClC,MAAMI,SAAS,GAAGrB,MAAM,CAACiB,MAAM,EAAE,CAAC,CAAC;MACnC,MAAMK,oBAAoB,GAAGtB,MAAM,CAACiB,MAAM,EAAE,EAAE,CAAC;MAC/C,MAAMM,SAAS,GAAGvB,MAAM,CAACiB,MAAM,EAAE,EAAE,CAAC;MACpC,MAAMO,MAAM,GAAG7B,SAAS,CAACsB,MAAM,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC;MAC5C,MAAMQ,WAAW,GAAG,OAAOD,MAAM,IAAIL,SAAS,IAAIC,QAAQ,IAAIC,SAAS,EAAE;MAEzE,IACEV,QAAQ,CAACe,GAAG,CAACD,WAAW,CAAC,IACzBL,QAAQ,GAAG,EAAE,IACbA,QAAQ,GAAG,GAAG,IACdC,SAAS,GAAG,EAAE,IACdA,SAAS,GAAG,GAAG,IACfC,oBAAoB,GAAG,EAAE,IACzBA,oBAAoB,GAAG,GAAG,IAC1BC,SAAS,GAAG,EAAE,IACdA,SAAS,GAAG,GAAG,EACf;QACA;MACF;MAEAZ,QAAQ,CAACgB,GAAG,CAACF,WAAW,CAAC;MACzB,MAAMG,UAAU,GAAGhC,0BAA0B,CAACuB,SAAS,CAAC;MAExDN,IAAI,CAAC;QACHgB,kBAAkB,EAAEpC,kBAAkB,CAACqC,aAAa;QACpDC,QAAQ,EAAErC,QAAQ,CAACsC,MAAM;QACzBZ,QAAQ;QACRC,SAAS;QACTC,oBAAoB;QACpBC,SAAS;QACTU,UAAU,EAAET,MAAM;QAClB,IAAII,UAAU,GAAG;UAAEA;QAAW,CAAC,GAAG,CAAC,CAAC,CAAC;QACrCH;MACF,CAA6B,CAAC;IAChC;EACF,CAAC;AACH,CAAC","ignoreList":[]}
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+
3
+ import { isClockSyncEnabled } from "../../../types/clock-sync.js";
4
+ import { hexToByte } from "../../../utils/hex-to-byte.js";
5
+ const TMB_EPOCH_SECONDS = 1_262_304_000;
6
+ const LOGIN_RESPONSE = 7;
7
+ const SETTING_RESPONSE = 0x1100;
8
+ const SET_TIME = 0x1102;
9
+ const GET_RECORD = 0x4901;
10
+ const GET_RECORD_RESPONSE = 0x4902;
11
+ const ACK_SUCCESS = ["00", "01", "01"];
12
+ const bytes = frame => frame.map(hexToByte);
13
+ const byte = value => (value & 0xff).toString(16).padStart(2, "0");
14
+ const command = (opcode, content) => {
15
+ const payload = [opcode >> 8 & 0xff, opcode & 0xff, ...content];
16
+ return [0x10, payload.length, ...payload].map(byte);
17
+ };
18
+ const responseCommand = frame => {
19
+ const head = hexToByte(frame[0] ?? "00");
20
+ if (head === 0x21 || head === 0) {
21
+ return 0;
22
+ }
23
+ return hexToByte(frame[2] ?? "00") << 8 | hexToByte(frame[3] ?? "00");
24
+ };
25
+ const content = frame => {
26
+ const head = hexToByte(frame[0] ?? "00");
27
+ return bytes(frame.slice(head === 0x21 || head === 0 ? 2 : 4));
28
+ };
29
+ const nowSeconds = clockSync => {
30
+ const now = clockSync?.now?.() ?? new Date();
31
+ const offsetSeconds = clockSync?.timezone === "utc" ? 0 : -now.getTimezoneOffset() * 60;
32
+ return Math.floor(now.getTime() / 1000) - TMB_EPOCH_SECONDS + offsetSeconds;
33
+ };
34
+ const syncTime = clockSync => {
35
+ const seconds = nowSeconds(clockSync);
36
+ return command(SET_TIME, [0x01, seconds >>> 24 & 0xff, seconds >>> 16 & 0xff, seconds >>> 8 & 0xff, seconds & 0xff]);
37
+ };
38
+
39
+ /** Drives login, clock synchronisation, acknowledgements and history download for TMB. */
40
+ class TmbCommandSequencer {
41
+ phase = "login";
42
+ userId = 0;
43
+ constructor(params) {
44
+ this.params = params;
45
+ }
46
+ initialCommands = () => [];
47
+ nextCommand = frame => {
48
+ const opcode = responseCommand(frame);
49
+ const frameContent = content(frame);
50
+ if (opcode === LOGIN_RESPONSE && frameContent.length >= 8) {
51
+ this.userId = frameContent[6] ?? 0;
52
+ this.phase = "login";
53
+ return [this.ack(true), this.write(command(8, [1, ...frameContent.slice(0, 6), 0, 2]))];
54
+ }
55
+ if (this.phase === "login" && opcode === 0 && frameContent[0] === 1) {
56
+ this.phase = "clock";
57
+ return isClockSyncEnabled(this.params.clockSync) ? [this.write(syncTime(this.params.clockSync))] : [this.history()];
58
+ }
59
+ if (opcode === SETTING_RESPONSE && frameContent.length >= 3) {
60
+ const setting = frameContent[0] << 8 | frameContent[1];
61
+ const success = frameContent[2] === 1;
62
+ if (setting === SET_TIME && success) {
63
+ this.phase = "history";
64
+ return [this.ack(true), this.history()];
65
+ }
66
+ return [this.ack(success)];
67
+ }
68
+ if (opcode === GET_RECORD_RESPONSE) {
69
+ this.phase = "history";
70
+ return undefined;
71
+ }
72
+ if (hexToByte(frame[0] ?? "00") === 0x21) {
73
+ return [this.ack(true)];
74
+ }
75
+ return undefined;
76
+ };
77
+ commandTimeoutMs = () => 15_000;
78
+ onCommandTimeout = () => ({
79
+ terminal: true
80
+ });
81
+ commandProgress = frame => hexToByte(frame[0] ?? "00") === 0x21 ? "partial" : "complete";
82
+ isHistoryTransfer = () => true;
83
+ write = frame => ({
84
+ serviceUuid: this.params.protocol.serviceUuid,
85
+ characteristicUuid: this.params.protocol.writeUuid,
86
+ frame
87
+ });
88
+ ack = success => ({
89
+ serviceUuid: this.params.protocol.serviceUuid,
90
+ characteristicUuid: this.params.protocol.ackUuid,
91
+ frame: success ? ACK_SUCCESS : ["00", "01", "02"]
92
+ });
93
+ history = () => this.write(command(GET_RECORD, [this.userId, 1]));
94
+ }
95
+ export { TmbCommandSequencer, TMB_EPOCH_SECONDS };
96
+ //# sourceMappingURL=tmb.command-sequencer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["isClockSyncEnabled","hexToByte","TMB_EPOCH_SECONDS","LOGIN_RESPONSE","SETTING_RESPONSE","SET_TIME","GET_RECORD","GET_RECORD_RESPONSE","ACK_SUCCESS","bytes","frame","map","byte","value","toString","padStart","command","opcode","content","payload","length","responseCommand","head","slice","nowSeconds","clockSync","now","Date","offsetSeconds","timezone","getTimezoneOffset","Math","floor","getTime","syncTime","seconds","TmbCommandSequencer","phase","userId","constructor","params","initialCommands","nextCommand","frameContent","ack","write","history","setting","success","undefined","commandTimeoutMs","onCommandTimeout","terminal","commandProgress","isHistoryTransfer","serviceUuid","protocol","characteristicUuid","writeUuid","ackUuid"],"sourceRoot":"../../../../../../../src","sources":["modules/bt-management/services/devices/tmb/tmb.command-sequencer.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+
3
+ import { FrameReadStatus } from "../../../types/frame-read-status.js";
4
+ import { hexToByte } from "../../../utils/hex-to-byte.js";
5
+ const HEADS = new Set([0x10, 0x20, 0x21]);
6
+ const isHead = (buffer, index) => {
7
+ const head = hexToByte(buffer[index] ?? "00");
8
+ return HEADS.has(head) || head === 0 && hexToByte(buffer[index + 1] ?? "00") === 1;
9
+ };
10
+
11
+ /** Reads the length-prefixed frames emitted by Viatom's TMB blood-pressure family. */
12
+ export class TmbFrameReader {
13
+ readFrame(buffer) {
14
+ const start = this.findStart(buffer);
15
+ if (start < 0) {
16
+ return {
17
+ status: FrameReadStatus.INCOMPLETE,
18
+ consumedBytes: Math.max(0, buffer.length - 1)
19
+ };
20
+ }
21
+ if (start + 2 > buffer.length) {
22
+ return {
23
+ status: FrameReadStatus.INCOMPLETE,
24
+ consumedBytes: start
25
+ };
26
+ }
27
+ const frameLength = 2 + hexToByte(buffer[start + 1] ?? "00");
28
+ if (start + frameLength > buffer.length) {
29
+ return {
30
+ status: FrameReadStatus.INCOMPLETE,
31
+ consumedBytes: start
32
+ };
33
+ }
34
+ return {
35
+ status: FrameReadStatus.COMPLETE,
36
+ consumedBytes: start + frameLength,
37
+ frame: buffer.slice(start, start + frameLength)
38
+ };
39
+ }
40
+ findStart(buffer) {
41
+ for (let index = 0; index < buffer.length; index++) {
42
+ if (isHead(buffer, index)) {
43
+ return index;
44
+ }
45
+ }
46
+ return -1;
47
+ }
48
+ }
49
+ //# sourceMappingURL=tmb.frame-reader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["FrameReadStatus","hexToByte","HEADS","Set","isHead","buffer","index","head","has","TmbFrameReader","readFrame","start","findStart","status","INCOMPLETE","consumedBytes","Math","max","length","frameLength","COMPLETE","frame","slice"],"sourceRoot":"../../../../../../../src","sources":["modules/bt-management/services/devices/tmb/tmb.frame-reader.ts"],"mappings":";;AACA,SAASA,eAAe,QAAQ,qCAAkC;AAElE,SAASC,SAAS,QAAQ,+BAA4B;AAEtD,MAAMC,KAAK,GAAG,IAAIC,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAEzC,MAAMC,MAAM,GAAGA,CAACC,MAAyB,EAAEC,KAAa,KAAc;EACpE,MAAMC,IAAI,GAAGN,SAAS,CAACI,MAAM,CAACC,KAAK,CAAC,IAAI,IAAI,CAAC;EAE7C,OAAOJ,KAAK,CAACM,GAAG,CAACD,IAAI,CAAC,IAAKA,IAAI,KAAK,CAAC,IAAIN,SAAS,CAACI,MAAM,CAACC,KAAK,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAE;AACtF,CAAC;;AAED;AACA,OAAO,MAAMG,cAAc,CAAwB;EAC1CC,SAASA,CAACL,MAAyB,EAAmB;IAC3D,MAAMM,KAAK,GAAG,IAAI,CAACC,SAAS,CAACP,MAAM,CAAC;IAEpC,IAAIM,KAAK,GAAG,CAAC,EAAE;MACb,OAAO;QACLE,MAAM,EAAEb,eAAe,CAACc,UAAU;QAClCC,aAAa,EAAEC,IAAI,CAACC,GAAG,CAAC,CAAC,EAAEZ,MAAM,CAACa,MAAM,GAAG,CAAC;MAC9C,CAAC;IACH;IAEA,IAAIP,KAAK,GAAG,CAAC,GAAGN,MAAM,CAACa,MAAM,EAAE;MAC7B,OAAO;QAAEL,MAAM,EAAEb,eAAe,CAACc,UAAU;QAAEC,aAAa,EAAEJ;MAAM,CAAC;IACrE;IAEA,MAAMQ,WAAW,GAAG,CAAC,GAAGlB,SAAS,CAACI,MAAM,CAACM,KAAK,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC;IAE5D,IAAIA,KAAK,GAAGQ,WAAW,GAAGd,MAAM,CAACa,MAAM,EAAE;MACvC,OAAO;QAAEL,MAAM,EAAEb,eAAe,CAACc,UAAU;QAAEC,aAAa,EAAEJ;MAAM,CAAC;IACrE;IAEA,OAAO;MACLE,MAAM,EAAEb,eAAe,CAACoB,QAAQ;MAChCL,aAAa,EAAEJ,KAAK,GAAGQ,WAAW;MAClCE,KAAK,EAAEhB,MAAM,CAACiB,KAAK,CAACX,KAAK,EAAEA,KAAK,GAAGQ,WAAW;IAChD,CAAC;EACH;EAEQP,SAASA,CAACP,MAAyB,EAAU;IACnD,KAAK,IAAIC,KAAK,GAAG,CAAC,EAAEA,KAAK,GAAGD,MAAM,CAACa,MAAM,EAAEZ,KAAK,EAAE,EAAE;MAClD,IAAIF,MAAM,CAACC,MAAM,EAAEC,KAAK,CAAC,EAAE;QACzB,OAAOA,KAAK;MACd;IACF;IAEA,OAAO,CAAC,CAAC;EACX;AACF","ignoreList":[]}
@@ -1,9 +1,11 @@
1
1
  "use strict";
2
2
 
3
3
  import { le32FromHex } from "../../../utils/le-32-from-hex.js";
4
+ import { defineCustomDevice } from "../../custom/define-custom-device.js";
4
5
  import { recordedAtFromLocalSeconds } from "../bp2/bp2.files.js";
5
6
  import { lepuNameMatch } from "../lepu/lepu.name-match.js";
6
7
  import { lepuDevice } from "../lepu/lepu.transports.js";
8
+ import { createTmbBloodPressureFrameHandler } from "../tmb/tmb.bp-handler.js";
7
9
  import { createViatomFrameHandler } from "./viatom.bp-ecg-handler.js";
8
10
  import { BP2_CASES, BP2_ECG_CASES, BP3_CASES, BP3_ECG_CASES } from "./viatom.bp-monitor-cases.js";
9
11
 
@@ -86,6 +88,51 @@ const bp2tMonitor = params => viatomBpMonitor("BP2T", params);
86
88
 
87
89
  /** BP2W. Documented in its own section, but decoding the same realtime struct. */
88
90
  const bp2wMonitor = params => viatomBpMonitor("BP2W", params);
91
+ const TMB_SERVICE = "0000a610-0000-1000-8000-00805f9b34fb";
92
+ const TMB_WRITE = "0000a624-0000-1000-8000-00805f9b34fb";
93
+ const TMB_ACK = "0000a622-0000-1000-8000-00805f9b34fb";
94
+ const TMB_NOTIFY = "0000a621-0000-1000-8000-00805f9b34fb";
95
+ const TMB_INDICATE = "0000a620-0000-1000-8000-00805f9b34fb";
96
+
97
+ /** Declares a Viatom TMB monitor, whose history protocol is separate from the BP3 Lepu flow. */
98
+ const tmbBpMonitor = (advertisedName, params) => defineCustomDevice({
99
+ id: params.id ?? `viatom-tmb-${advertisedName.toLowerCase().replace(/[^a-z0-9]+/g, "-")}`,
100
+ nameMatch: params.nameMatch ?? lepuNameMatch(advertisedName),
101
+ clockSync: "supported",
102
+ stuckDataTimeoutMs: 120_000,
103
+ preferredMtu: 247,
104
+ tmb: {
105
+ serviceUuid: TMB_SERVICE,
106
+ writeUuid: TMB_WRITE,
107
+ ackUuid: TMB_ACK
108
+ },
109
+ services: [{
110
+ uuid: TMB_SERVICE,
111
+ monitor: [{
112
+ uuid: TMB_NOTIFY,
113
+ caseSelectorBytes: [0],
114
+ frame: {
115
+ minLengthBytes: 2
116
+ },
117
+ cases: [{
118
+ selector: "*",
119
+ kind: "event"
120
+ }]
121
+ }, {
122
+ uuid: TMB_INDICATE,
123
+ caseSelectorBytes: [0],
124
+ frame: {
125
+ minLengthBytes: 2
126
+ },
127
+ cases: [{
128
+ selector: "*",
129
+ kind: "event"
130
+ }]
131
+ }]
132
+ }]
133
+ }, {
134
+ createFrameHandler: createTmbBloodPressureFrameHandler
135
+ });
89
136
 
90
137
  /**
91
138
  * The names the BP3 range advertises.
@@ -100,5 +147,6 @@ const bp2wMonitor = params => viatomBpMonitor("BP2W", params);
100
147
  * ```
101
148
  */
102
149
  const BP3_MODEL_NAMES = ["BP3", "BP3-B", "BP3-C1", "BP3-C2", "BP3A", "BP3B", "BP3C", "BP3D", "BP3E", "BP3F", "BP3G", "BP3H", "BP3K", "BP3L", "BP3Z", "HDM3D", "HDM3G"];
103
- export { bp2aMonitor, bp2tMonitor, bp2wMonitor, BP3_MODEL_NAMES, viatomBpMonitor };
150
+ const TMB_MODEL_NAMES = ["BP3-B", "BP3-C1", "BP3-C2", "BP2A Nexus", "BP4 Flex", "TMB-2288", "TMB_2088"];
151
+ export { bp2aMonitor, bp2tMonitor, bp2wMonitor, BP3_MODEL_NAMES, TMB_MODEL_NAMES, tmbBpMonitor, viatomBpMonitor };
104
152
  //# sourceMappingURL=viatom.bp-monitors.js.map