@ovok/native 1.16.1-dev.2155 → 1.16.1-dev.2157

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 (51) hide show
  1. package/lib/commonjs/modules/bt-management/services/devices/blood-glucose/blood-glucose.device.js +64 -44
  2. package/lib/commonjs/modules/bt-management/services/devices/blood-glucose/blood-glucose.device.js.map +1 -1
  3. package/lib/commonjs/modules/bt-management/services/devices/blood-glucose/telebgm.protocol.js +98 -0
  4. package/lib/commonjs/modules/bt-management/services/devices/blood-glucose/telebgm.protocol.js.map +1 -0
  5. package/lib/commonjs/modules/bt-management/services/devices/blood-glucose/telebgm.sequencer.js +127 -0
  6. package/lib/commonjs/modules/bt-management/services/devices/blood-glucose/telebgm.sequencer.js.map +1 -0
  7. package/lib/commonjs/modules/bt-management/services/devices/cofoe/cofoe.records.js +2 -7
  8. package/lib/commonjs/modules/bt-management/services/devices/cofoe/cofoe.records.js.map +1 -1
  9. package/lib/commonjs/modules/bt-management/services/devices/viatom/viatom.wbp02.protocol.js +3 -7
  10. package/lib/commonjs/modules/bt-management/services/devices/viatom/viatom.wbp02.protocol.js.map +1 -1
  11. package/lib/commonjs/modules/bt-management/utils/calculate-crc-16-modbus.js +23 -0
  12. package/lib/commonjs/modules/bt-management/utils/calculate-crc-16-modbus.js.map +1 -0
  13. package/lib/commonjs/modules/bt-management/utils/tenths-mmol-to-mg-per-dl.js +13 -0
  14. package/lib/commonjs/modules/bt-management/utils/tenths-mmol-to-mg-per-dl.js.map +1 -0
  15. package/lib/module/modules/bt-management/services/devices/blood-glucose/blood-glucose.device.js +64 -44
  16. package/lib/module/modules/bt-management/services/devices/blood-glucose/blood-glucose.device.js.map +1 -1
  17. package/lib/module/modules/bt-management/services/devices/blood-glucose/telebgm.protocol.js +91 -0
  18. package/lib/module/modules/bt-management/services/devices/blood-glucose/telebgm.protocol.js.map +1 -0
  19. package/lib/module/modules/bt-management/services/devices/blood-glucose/telebgm.sequencer.js +123 -0
  20. package/lib/module/modules/bt-management/services/devices/blood-glucose/telebgm.sequencer.js.map +1 -0
  21. package/lib/module/modules/bt-management/services/devices/cofoe/cofoe.records.js +2 -7
  22. package/lib/module/modules/bt-management/services/devices/cofoe/cofoe.records.js.map +1 -1
  23. package/lib/module/modules/bt-management/services/devices/viatom/viatom.wbp02.protocol.js +3 -7
  24. package/lib/module/modules/bt-management/services/devices/viatom/viatom.wbp02.protocol.js.map +1 -1
  25. package/lib/module/modules/bt-management/utils/calculate-crc-16-modbus.js +18 -0
  26. package/lib/module/modules/bt-management/utils/calculate-crc-16-modbus.js.map +1 -0
  27. package/lib/module/modules/bt-management/utils/tenths-mmol-to-mg-per-dl.js +8 -0
  28. package/lib/module/modules/bt-management/utils/tenths-mmol-to-mg-per-dl.js.map +1 -0
  29. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/blood-glucose/blood-glucose.device.d.ts.map +1 -1
  30. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/blood-glucose/telebgm.protocol.d.ts +34 -0
  31. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/blood-glucose/telebgm.protocol.d.ts.map +1 -0
  32. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/blood-glucose/telebgm.sequencer.d.ts +32 -0
  33. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/blood-glucose/telebgm.sequencer.d.ts.map +1 -0
  34. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/cofoe/cofoe.records.d.ts.map +1 -1
  35. package/lib/typescript/commonjs/src/modules/bt-management/services/devices/viatom/viatom.wbp02.protocol.d.ts.map +1 -1
  36. package/lib/typescript/commonjs/src/modules/bt-management/utils/calculate-crc-16-modbus.d.ts +3 -0
  37. package/lib/typescript/commonjs/src/modules/bt-management/utils/calculate-crc-16-modbus.d.ts.map +1 -0
  38. package/lib/typescript/commonjs/src/modules/bt-management/utils/tenths-mmol-to-mg-per-dl.d.ts +3 -0
  39. package/lib/typescript/commonjs/src/modules/bt-management/utils/tenths-mmol-to-mg-per-dl.d.ts.map +1 -0
  40. package/lib/typescript/module/src/modules/bt-management/services/devices/blood-glucose/blood-glucose.device.d.ts.map +1 -1
  41. package/lib/typescript/module/src/modules/bt-management/services/devices/blood-glucose/telebgm.protocol.d.ts +34 -0
  42. package/lib/typescript/module/src/modules/bt-management/services/devices/blood-glucose/telebgm.protocol.d.ts.map +1 -0
  43. package/lib/typescript/module/src/modules/bt-management/services/devices/blood-glucose/telebgm.sequencer.d.ts +32 -0
  44. package/lib/typescript/module/src/modules/bt-management/services/devices/blood-glucose/telebgm.sequencer.d.ts.map +1 -0
  45. package/lib/typescript/module/src/modules/bt-management/services/devices/cofoe/cofoe.records.d.ts.map +1 -1
  46. package/lib/typescript/module/src/modules/bt-management/services/devices/viatom/viatom.wbp02.protocol.d.ts.map +1 -1
  47. package/lib/typescript/module/src/modules/bt-management/utils/calculate-crc-16-modbus.d.ts +3 -0
  48. package/lib/typescript/module/src/modules/bt-management/utils/calculate-crc-16-modbus.d.ts.map +1 -0
  49. package/lib/typescript/module/src/modules/bt-management/utils/tenths-mmol-to-mg-per-dl.d.ts +3 -0
  50. package/lib/typescript/module/src/modules/bt-management/utils/tenths-mmol-to-mg-per-dl.d.ts.map +1 -0
  51. package/package.json +1 -1
@@ -1,54 +1,64 @@
1
1
  "use strict";
2
2
 
3
3
  import { MeasurementTypeKey } from "@ovok/core/next";
4
+ import { NO_PARSING_CASES } from "../../../constants/no-parsing-cases.js";
4
5
  import { CaseType } from "../../../types/case-type.js";
5
6
  import { IntegratedDevices } from "../../../types/integrated-devices.js";
6
- import { hexToByte } from "../../../utils/hex-to-byte.js";
7
7
  import { BTManagedDevice } from "../bt-managed-device.js";
8
8
  import { TAIDOC, TAIDOC_CHARACTERISTIC, TAIDOC_SERVICE, taidocCommand } from "../taidoc/taidoc.protocol.js";
9
9
  import { isPatientGlucoseRecord } from "../taidoc/taidoc.records.js";
10
- const BGM_SERVICE = "0003cdd0-0000-1000-8000-00805f9b0131";
11
- const BGM_CHARACTERISTIC = "0003cdd1-0000-1000-8000-00805f9b0131";
10
+ import { TELEBGM_NOTIFY, TELEBGM_SERVICE, TELEBGM_WRITE, TeleBgmFrameReader } from "./telebgm.protocol.js";
11
+ import { TeleBgmSequencer } from "./telebgm.sequencer.js";
12
12
  const GLUCOSE_REQUEST = taidocCommand(TAIDOC.readingResult).join("");
13
- const servicesFor = device => {
14
- const isBgm = device === IntegratedDevices.BGM;
15
- return [{
16
- uuid: isBgm ? BGM_SERVICE : TAIDOC_SERVICE,
17
- monitorUuids: [{
18
- uuid: isBgm ? BGM_CHARACTERISTIC : TAIDOC_CHARACTERISTIC,
19
- parsingModel: {
20
- caseValuePosition: [isBgm ? 9 : 1],
21
- cases: [...(isBgm ? ["00", "0b", "10", "11", "18", "22", "33", "55"] : ["46", ...(device === IntegratedDevices.GLUCOCHECK ? ["50"] : [])]).map(caseValue => ({
22
- caseType: CaseType.OTHER,
23
- caseValue,
24
- parseDefinitions: []
25
- })), {
26
- measurementTypeKey: MeasurementTypeKey.bloodGlucose,
27
- caseType: CaseType.RESULT,
28
- caseValue: isBgm ? "44" : "26",
29
- parseDefinitions: [{
30
- name: "bloodGlucose",
31
- parseType: "custom",
32
- byteIndexes: isBgm ? [10, 11] : [3, 2],
33
- parseReference: 16,
34
- customParserDefinition: value => {
35
- if (isBgm) {
36
- return hexToByte(value.slice(0, 2)) * 100 + hexToByte(value.slice(2, 4));
37
- }
38
- const raw = parseInt(value, 16);
39
- return device === IntegratedDevices.TAIDOC_GLUCOSE ? Number((raw * 18).toFixed(2)) : raw;
40
- }
41
- }]
13
+ const TELEBGM_SERVICES = [{
14
+ uuid: TELEBGM_SERVICE,
15
+ monitorUuids: [{
16
+ uuid: TELEBGM_NOTIFY,
17
+ parsingModel: NO_PARSING_CASES
18
+ }]
19
+ }];
20
+ const taidocServices = device => [{
21
+ uuid: TAIDOC_SERVICE,
22
+ monitorUuids: [{
23
+ uuid: TAIDOC_CHARACTERISTIC,
24
+ parsingModel: {
25
+ caseValuePosition: [1],
26
+ cases: [...["46", ...(device === IntegratedDevices.GLUCOCHECK ? ["50"] : [])].map(caseValue => ({
27
+ caseType: CaseType.OTHER,
28
+ caseValue,
29
+ parseDefinitions: []
30
+ })), {
31
+ measurementTypeKey: MeasurementTypeKey.bloodGlucose,
32
+ caseType: CaseType.RESULT,
33
+ caseValue: "26",
34
+ parseDefinitions: [{
35
+ name: "bloodGlucose",
36
+ parseType: "custom",
37
+ byteIndexes: [3, 2],
38
+ parseReference: 16,
39
+ customParserDefinition: value => {
40
+ const raw = parseInt(value, 16);
41
+ return device === IntegratedDevices.TAIDOC_GLUCOSE ? Number((raw * 18).toFixed(2)) : raw;
42
+ }
42
43
  }]
43
- }
44
- }],
45
- ...(isBgm ? {} : {
46
- writeUuid: {
47
- uuid: TAIDOC_CHARACTERISTIC,
48
- mainCommandUuid: GLUCOSE_REQUEST
49
- }
50
- })
51
- }];
44
+ }]
45
+ }
46
+ }],
47
+ writeUuid: {
48
+ uuid: TAIDOC_CHARACTERISTIC,
49
+ mainCommandUuid: GLUCOSE_REQUEST
50
+ }
51
+ }];
52
+ const writesWithoutResponse = async device => {
53
+ try {
54
+ const characteristics = await device.characteristicsForService(TELEBGM_SERVICE);
55
+ const write = characteristics.find(({
56
+ uuid
57
+ }) => uuid.toLowerCase() === TELEBGM_WRITE);
58
+ return write?.isWritableWithResponse === false && write.isWritableWithoutResponse;
59
+ } catch {
60
+ return false;
61
+ }
52
62
  };
53
63
 
54
64
  /** Decodes the legacy TaiDoc, GlucoCheck Gold and TeleBGM glucose protocols. */
@@ -56,16 +66,26 @@ export class BloodGlucoseDevice extends BTManagedDevice {
56
66
  stuckDataTimeout = 60_000;
57
67
  constructor(device, params) {
58
68
  super(device, params);
59
- this.mainServices = servicesFor(params.deviceName);
69
+ if (params.deviceName !== IntegratedDevices.BGM) {
70
+ this.mainServices = taidocServices(params.deviceName);
71
+ return;
72
+ }
73
+ this.mainServices = TELEBGM_SERVICES;
74
+ this.frameReader = new TeleBgmFrameReader();
75
+ this.createCommandSequencer = () => new TeleBgmSequencer({
76
+ onResult: this.reportResult,
77
+ writesWithoutResponse: () => writesWithoutResponse(device),
78
+ clockSync: params.clockSync
79
+ });
60
80
  }
61
- validatePackage = pkg => pkg.length >= (this.deviceData.name === IntegratedDevices.BGM ? 12 : 8);
81
+ validatePackage = pkg => pkg.length >= 8;
62
82
  handleSuccessResult(result, frame) {
63
83
  if (result.caseType !== CaseType.RESULT || result.bloodGlucose === 0) {
64
84
  return;
65
85
  }
66
86
 
67
87
  // A ketone, cholesterol or control-solution record decodes to a number too; it is not glucose.
68
- if (this.deviceData.name !== IntegratedDevices.BGM && !isPatientGlucoseRecord(frame)) {
88
+ if (!isPatientGlucoseRecord(frame)) {
69
89
  return;
70
90
  }
71
91
  this.onResult?.(result);
@@ -1 +1 @@
1
- {"version":3,"names":["MeasurementTypeKey","CaseType","IntegratedDevices","hexToByte","BTManagedDevice","TAIDOC","TAIDOC_CHARACTERISTIC","TAIDOC_SERVICE","taidocCommand","isPatientGlucoseRecord","BGM_SERVICE","BGM_CHARACTERISTIC","GLUCOSE_REQUEST","readingResult","join","servicesFor","device","isBgm","BGM","uuid","monitorUuids","parsingModel","caseValuePosition","cases","GLUCOCHECK","map","caseValue","caseType","OTHER","parseDefinitions","measurementTypeKey","bloodGlucose","RESULT","name","parseType","byteIndexes","parseReference","customParserDefinition","value","slice","raw","parseInt","TAIDOC_GLUCOSE","Number","toFixed","writeUuid","mainCommandUuid","BloodGlucoseDevice","stuckDataTimeout","constructor","params","mainServices","deviceName","validatePackage","pkg","length","deviceData","handleSuccessResult","result","frame","onResult"],"sourceRoot":"../../../../../../../src","sources":["modules/bt-management/services/devices/blood-glucose/blood-glucose.device.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["MeasurementTypeKey","NO_PARSING_CASES","CaseType","IntegratedDevices","BTManagedDevice","TAIDOC","TAIDOC_CHARACTERISTIC","TAIDOC_SERVICE","taidocCommand","isPatientGlucoseRecord","TELEBGM_NOTIFY","TELEBGM_SERVICE","TELEBGM_WRITE","TeleBgmFrameReader","TeleBgmSequencer","GLUCOSE_REQUEST","readingResult","join","TELEBGM_SERVICES","uuid","monitorUuids","parsingModel","taidocServices","device","caseValuePosition","cases","GLUCOCHECK","map","caseValue","caseType","OTHER","parseDefinitions","measurementTypeKey","bloodGlucose","RESULT","name","parseType","byteIndexes","parseReference","customParserDefinition","value","raw","parseInt","TAIDOC_GLUCOSE","Number","toFixed","writeUuid","mainCommandUuid","writesWithoutResponse","characteristics","characteristicsForService","write","find","toLowerCase","isWritableWithResponse","isWritableWithoutResponse","BloodGlucoseDevice","stuckDataTimeout","constructor","params","deviceName","BGM","mainServices","frameReader","createCommandSequencer","onResult","reportResult","clockSync","validatePackage","pkg","length","handleSuccessResult","result","frame"],"sourceRoot":"../../../../../../../src","sources":["modules/bt-management/services/devices/blood-glucose/blood-glucose.device.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,91 @@
1
+ "use strict";
2
+
3
+ /* eslint-disable import/group-exports */
4
+
5
+ import { bytesToHex } from "../../../utils/bytes-to-hex.js";
6
+ import { calculateCrc16Modbus } from "../../../utils/calculate-crc-16-modbus.js";
7
+ import { frameBytes } from "../../../utils/frame-bytes.js";
8
+ import { complete, corrupt, incomplete } from "../../../utils/frame-read-results.js";
9
+ export const TELEBGM_SERVICE = "0003cdd0-0000-1000-8000-00805f9b0131";
10
+ export const TELEBGM_NOTIFY = "0003cdd1-0000-1000-8000-00805f9b0131";
11
+ export const TELEBGM_WRITE = "0003cdd2-0000-1000-8000-00805f9b0131";
12
+
13
+ /** Command byte of a frame; the meter answers a request with the same byte. */
14
+ export const TELEBGM_COMMAND = {
15
+ testStatus: 0x12,
16
+ setTime: 0x44,
17
+ softwareVersion: 0x66,
18
+ serial: 0x77,
19
+ units: 0xaa,
20
+ historyEnd: 0xd1,
21
+ history: 0xdd,
22
+ transferEnd: 0xf2
23
+ };
24
+
25
+ /** Parameter byte of a request, a clock write and an acknowledgement. */
26
+ export const TELEBGM_PARAMETER = {
27
+ request: 0x55,
28
+ write: 0x66,
29
+ ack: 0x99
30
+ };
31
+ const START = 0x7b;
32
+ const END = 0x7d;
33
+ const APP_ADDRESS = [0x01, 0x10, 0x01, 0x20];
34
+ const COMMAND_INDEX = 5;
35
+ const LENGTH_INDEX = 7;
36
+ const HEADER_BYTES = 9;
37
+
38
+ /** Four CRC nibbles, then the end byte. */
39
+ const TRAILER_BYTES = 5;
40
+
41
+ /** Longer than any reply; a corrupted length would otherwise hold the buffer for ever. */
42
+ const MAX_PAYLOAD_BYTES = 64;
43
+
44
+ /** The CRC of everything between the start byte and the CRC, as four nibbles. */
45
+ const crcNibbles = body => {
46
+ const crc = calculateCrc16Modbus(body);
47
+ return [crc & 0xff, crc >> 8].flatMap(byte => [byte >> 4, byte & 0x0f]);
48
+ };
49
+
50
+ /** `7B 01 10 01 20 <command> <parameter> <length, 2 bytes> <payload> <CRC nibbles> 7D`. */
51
+ export const telebgmFrame = (command, parameter, payload = []) => {
52
+ const body = [...APP_ADDRESS, command, parameter, payload.length >> 8, payload.length & 0xff, ...payload];
53
+ return bytesToHex([START, ...body, ...crcNibbles(body), END]);
54
+ };
55
+
56
+ /** A frame's command byte and payload. */
57
+ export const unframe = frame => {
58
+ const bytes = frameBytes(frame);
59
+ return {
60
+ command: bytes[COMMAND_INDEX],
61
+ payload: bytes.slice(HEADER_BYTES, -TRAILER_BYTES)
62
+ };
63
+ };
64
+ const isIntact = frame => {
65
+ const crcAt = frame.length - TRAILER_BYTES;
66
+ return frame[frame.length - 1] === END && crcNibbles(frame.slice(1, crcAt)).every((nibble, index) => frame[crcAt + index] === nibble);
67
+ };
68
+
69
+ /** Reads frames by their length field, a record being longer than one notification, and checks their CRC. */
70
+ export class TeleBgmFrameReader {
71
+ readFrame(buffer) {
72
+ const values = frameBytes(buffer);
73
+ const start = values.indexOf(START);
74
+ if (start === -1) {
75
+ return incomplete(values.length);
76
+ }
77
+ if (start + HEADER_BYTES > values.length) {
78
+ return incomplete(start);
79
+ }
80
+ const payloadBytes = (values[start + LENGTH_INDEX] ?? 0) << 8 | (values[start + LENGTH_INDEX + 1] ?? 0);
81
+ const total = HEADER_BYTES + payloadBytes + TRAILER_BYTES;
82
+ if (payloadBytes > MAX_PAYLOAD_BYTES) {
83
+ return corrupt(start + 1);
84
+ }
85
+ if (start + total > values.length) {
86
+ return incomplete(start);
87
+ }
88
+ return isIntact(values.slice(start, start + total)) ? complete(buffer.slice(start, start + total), start + total) : corrupt(start + 1);
89
+ }
90
+ }
91
+ //# sourceMappingURL=telebgm.protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["bytesToHex","calculateCrc16Modbus","frameBytes","complete","corrupt","incomplete","TELEBGM_SERVICE","TELEBGM_NOTIFY","TELEBGM_WRITE","TELEBGM_COMMAND","testStatus","setTime","softwareVersion","serial","units","historyEnd","history","transferEnd","TELEBGM_PARAMETER","request","write","ack","START","END","APP_ADDRESS","COMMAND_INDEX","LENGTH_INDEX","HEADER_BYTES","TRAILER_BYTES","MAX_PAYLOAD_BYTES","crcNibbles","body","crc","flatMap","byte","telebgmFrame","command","parameter","payload","length","unframe","frame","bytes","slice","isIntact","crcAt","every","nibble","index","TeleBgmFrameReader","readFrame","buffer","values","start","indexOf","payloadBytes","total"],"sourceRoot":"../../../../../../../src","sources":["modules/bt-management/services/devices/blood-glucose/telebgm.protocol.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,123 @@
1
+ "use strict";
2
+
3
+ import { MeasurementTypeKey } from "@ovok/core/next";
4
+ import { CaseType } from "../../../types/case-type.js";
5
+ import { getClockParts, isClockSyncEnabled } from "../../../types/clock-sync.js";
6
+ import { tenthsMmolToMgPerDl } from "../../../utils/tenths-mmol-to-mg-per-dl.js";
7
+ import { TELEBGM_COMMAND, TELEBGM_PARAMETER, TELEBGM_SERVICE, TELEBGM_WRITE, telebgmFrame, unframe } from "./telebgm.protocol.js";
8
+
9
+ /** Units reply of a meter showing mg/dL; any other shows mmol/L and reports tenths of a mmol/L. */
10
+ const MG_PER_DL_UNITS = 0x11;
11
+
12
+ /** Result type of a control-solution test, which is not the patient's glucose. */
13
+ const CONTROL_SOLUTION = 0x22;
14
+
15
+ /** `YY MM DD hh mm`, the value as hundreds and units, meal flag, result type. */
16
+ const RECORD_BYTES = 9;
17
+ const RESULT_TYPE_INDEX = 8;
18
+ /** A record's wall-clock time, or undefined when a field is out of range. */
19
+ const recordTime = ([year, month, day, hours, minutes], timezone = "local") => {
20
+ const fields = [2000 + (year ?? 0), (month ?? 0) - 1, day ?? 0, hours ?? 0, minutes ?? 0];
21
+ const time = timezone === "utc" ? new Date(Date.UTC(...fields)) : new Date(...fields);
22
+ const parts = getClockParts(time, timezone);
23
+ return parts.month === month && parts.day === day && parts.hours === hours && parts.minutes === minutes ? time : undefined;
24
+ };
25
+ const readRecord = (payload, reportsMmol, timezone) => {
26
+ if (payload.length < RECORD_BYTES || payload[RESULT_TYPE_INDEX] === CONTROL_SOLUTION) {
27
+ return undefined;
28
+ }
29
+ const value = (payload[5] ?? 0) * 100 + (payload[6] ?? 0);
30
+ const recordedAt = recordTime(payload, timezone);
31
+ return recordedAt && value > 0 ? {
32
+ bloodGlucose: reportsMmol ? tenthsMmolToMgPerDl(value) : value,
33
+ recordedAt
34
+ } : undefined;
35
+ };
36
+
37
+ /**
38
+ * TeleBGM Gen1: reads the serial, version and units, sets the clock, then downloads the stored
39
+ * readings. The meter sends a reading only when asked for its history, and expects every
40
+ * test-status frame and the end of a transfer to be acknowledged.
41
+ */
42
+ export class TeleBgmSequencer {
43
+ withoutResponse = false;
44
+ reportsMmol = false;
45
+ finished = false;
46
+ constructor(params) {
47
+ this.params = params;
48
+ }
49
+ initialCommands = async () => {
50
+ this.withoutResponse = await this.params.writesWithoutResponse();
51
+ return [this.request(TELEBGM_COMMAND.serial)];
52
+ };
53
+ isHistoryTransfer = () => true;
54
+ isNormalDisconnect = () => this.finished;
55
+ nextCommand = frame => {
56
+ const {
57
+ command,
58
+ payload
59
+ } = unframe(frame);
60
+ switch (command) {
61
+ case TELEBGM_COMMAND.testStatus:
62
+ return [this.acknowledge(command)];
63
+ case TELEBGM_COMMAND.serial:
64
+ return [this.request(TELEBGM_COMMAND.softwareVersion)];
65
+ case TELEBGM_COMMAND.softwareVersion:
66
+ return [this.request(TELEBGM_COMMAND.units)];
67
+ case TELEBGM_COMMAND.units:
68
+ this.reportsMmol = payload[0] !== MG_PER_DL_UNITS;
69
+ return [this.setClock() ?? this.request(TELEBGM_COMMAND.history)];
70
+ case TELEBGM_COMMAND.setTime:
71
+ return [this.request(TELEBGM_COMMAND.history)];
72
+ case TELEBGM_COMMAND.history:
73
+ this.report(payload);
74
+ return undefined;
75
+ case TELEBGM_COMMAND.transferEnd:
76
+ this.finished = true;
77
+ return [this.acknowledge(command)];
78
+ case TELEBGM_COMMAND.historyEnd:
79
+ this.finished = true;
80
+ return undefined;
81
+ default:
82
+ return undefined;
83
+ }
84
+ };
85
+ report = payload => {
86
+ const reading = readRecord(payload, this.reportsMmol, this.params.clockSync?.timezone);
87
+ if (reading) {
88
+ this.params.onResult({
89
+ caseType: CaseType.RESULT,
90
+ measurementTypeKey: MeasurementTypeKey.bloodGlucose,
91
+ ...reading
92
+ });
93
+ }
94
+ };
95
+ setClock = () => {
96
+ const {
97
+ clockSync
98
+ } = this.params;
99
+ if (!isClockSyncEnabled(clockSync)) {
100
+ return undefined;
101
+ }
102
+ const {
103
+ year,
104
+ month,
105
+ day,
106
+ hours,
107
+ minutes,
108
+ seconds
109
+ } = getClockParts(clockSync?.now?.() ?? new Date(), clockSync?.timezone);
110
+ return this.command(telebgmFrame(TELEBGM_COMMAND.setTime, TELEBGM_PARAMETER.write, [year % 100, month, day, hours, minutes, seconds]));
111
+ };
112
+ request = command => this.command(telebgmFrame(command, TELEBGM_PARAMETER.request));
113
+ acknowledge = command => this.command(telebgmFrame(command, TELEBGM_PARAMETER.ack));
114
+ command = frame => ({
115
+ serviceUuid: TELEBGM_SERVICE,
116
+ characteristicUuid: TELEBGM_WRITE,
117
+ frame,
118
+ ...(this.withoutResponse ? {
119
+ withoutResponse: true
120
+ } : {})
121
+ });
122
+ }
123
+ //# sourceMappingURL=telebgm.sequencer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["MeasurementTypeKey","CaseType","getClockParts","isClockSyncEnabled","tenthsMmolToMgPerDl","TELEBGM_COMMAND","TELEBGM_PARAMETER","TELEBGM_SERVICE","TELEBGM_WRITE","telebgmFrame","unframe","MG_PER_DL_UNITS","CONTROL_SOLUTION","RECORD_BYTES","RESULT_TYPE_INDEX","recordTime","year","month","day","hours","minutes","timezone","fields","time","Date","UTC","parts","undefined","readRecord","payload","reportsMmol","length","value","recordedAt","bloodGlucose","TeleBgmSequencer","withoutResponse","finished","constructor","params","initialCommands","writesWithoutResponse","request","serial","isHistoryTransfer","isNormalDisconnect","nextCommand","frame","command","testStatus","acknowledge","softwareVersion","units","setClock","history","setTime","report","transferEnd","historyEnd","reading","clockSync","onResult","caseType","RESULT","measurementTypeKey","seconds","now","write","ack","serviceUuid","characteristicUuid"],"sourceRoot":"../../../../../../../src","sources":["modules/bt-management/services/devices/blood-glucose/telebgm.sequencer.ts"],"mappings":"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","ignoreList":[]}
@@ -3,6 +3,7 @@
3
3
  /* eslint-disable import/group-exports */
4
4
 
5
5
  import { frameBytes } from "../../../utils/frame-bytes.js";
6
+ import { tenthsMmolToMgPerDl } from "../../../utils/tenths-mmol-to-mg-per-dl.js";
6
7
 
7
8
  /**
8
9
  * Cofoe record decoders. Times are local wall-clock with no zone; a field out of range drops
@@ -45,14 +46,8 @@ export const readBpRecord = body => {
45
46
  recordedAt
46
47
  };
47
48
  };
48
-
49
- /** One mmol/L of glucose (180.16 g/mol) is 18.016 mg/dL, as in the SIG glucose profile. */
50
- const MG_PER_DL_PER_MMOL_PER_L = 18.016;
51
-
52
- /** Tenths of a mmol/L, rounded to whole mg/dL. */
53
- const mgPerDl = tenthsMmol => Math.round(tenthsMmol / 10 * MG_PER_DL_PER_MMOL_PER_L);
54
49
  const glucose = (tenthsMmol, recordedAt) => recordedAt && tenthsMmol > 0 && tenthsMmol < 0xffff ? {
55
- bloodGlucose: mgPerDl(tenthsMmol),
50
+ bloodGlucose: tenthsMmolToMgPerDl(tenthsMmol),
56
51
  recordedAt
57
52
  } : undefined;
58
53
  const KFB06_GLUCOSE_TYPE = 9;
@@ -1 +1 @@
1
- {"version":3,"names":["frameBytes","fromBcd","value","undefined","localTime","fields","some","field","year","month","day","hour","minute","second","map","index","time","Date","getMonth","getDate","getHours","getMinutes","getSeconds","readPressures","bytes","length","heartRate","systolic","diastolic","flag","irregularHeartbeat","readBpResult","body","readBpRecord","recordedAt","slice","pressures","MG_PER_DL_PER_MMOL_PER_L","mgPerDl","tenthsMmol","Math","round","glucose","bloodGlucose","KFB06_GLUCOSE_TYPE","readKfb06Glucose","readCgh25Glucose","THERMOMETER_TEXT","readThermometerText","frame","text","exec","String","fromCharCode","type","test","hundredths","Number","parseInt"],"sourceRoot":"../../../../../../../src","sources":["modules/bt-management/services/devices/cofoe/cofoe.records.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["frameBytes","tenthsMmolToMgPerDl","fromBcd","value","undefined","localTime","fields","some","field","year","month","day","hour","minute","second","map","index","time","Date","getMonth","getDate","getHours","getMinutes","getSeconds","readPressures","bytes","length","heartRate","systolic","diastolic","flag","irregularHeartbeat","readBpResult","body","readBpRecord","recordedAt","slice","pressures","glucose","tenthsMmol","bloodGlucose","KFB06_GLUCOSE_TYPE","readKfb06Glucose","readCgh25Glucose","THERMOMETER_TEXT","readThermometerText","frame","text","exec","String","fromCharCode","type","test","hundredths","Number","parseInt"],"sourceRoot":"../../../../../../../src","sources":["modules/bt-management/services/devices/cofoe/cofoe.records.ts"],"mappings":"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","ignoreList":[]}
@@ -3,6 +3,8 @@
3
3
  /* eslint-disable import/group-exports */
4
4
 
5
5
  import { byteToHex } from "../../../utils/bytes-to-hex.js";
6
+ import { calculateCrc16Modbus } from "../../../utils/calculate-crc-16-modbus.js";
7
+ import { frameBytes } from "../../../utils/frame-bytes.js";
6
8
  import { complete, corrupt, incomplete, noFrameStart } from "../../../utils/frame-read-results.js";
7
9
  import { hexToByte } from "../../../utils/hex-to-byte.js";
8
10
  export const WBP02_CONTROL_SERVICE = "0000ffe5-0000-1000-8000-00805f9b34fb";
@@ -12,13 +14,7 @@ export const WBP02_NOTIFY = "0000ffe4-0000-1000-8000-00805f9b34fb";
12
14
 
13
15
  /** CRC-16 used by the WBP-02 service, returned low byte first. */
14
16
  export const wbp02Crc = bytes => {
15
- let crc = 0xffff;
16
- for (const value of bytes) {
17
- crc ^= hexToByte(value);
18
- for (let bit = 0; bit < 8; bit += 1) {
19
- crc = (crc & 1) !== 0 ? crc >>> 1 ^ 0xa001 : crc >>> 1;
20
- }
21
- }
17
+ const crc = calculateCrc16Modbus(frameBytes(bytes));
22
18
  return [byteToHex(crc), byteToHex(crc >> 8)];
23
19
  };
24
20
  export const wbp02Command = (command, payload = []) => {
@@ -1 +1 @@
1
- {"version":3,"names":["byteToHex","complete","corrupt","incomplete","noFrameStart","hexToByte","WBP02_CONTROL_SERVICE","WBP02_WRITE","WBP02_DATA_SERVICE","WBP02_NOTIFY","wbp02Crc","bytes","crc","value","bit","wbp02Command","command","payload","body","length","map","wbp02Connect","wbp02SyncTime","date","Date","getFullYear","getMonth","getDate","getHours","getMinutes","wbp02Login","wbp02RecordCount","wbp02Record","index","decodeWbp02Response","frame","undefined","slice","at","content","parseWbp02Record","offset","year","month","day","hour","minute","recordedAt","systolic","diastolic","heartRate","recordingId","toISOString","Wbp02FrameReader","readFrame","buffer","start","findIndex"],"sourceRoot":"../../../../../../../src","sources":["modules/bt-management/services/devices/viatom/viatom.wbp02.protocol.ts"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["byteToHex","calculateCrc16Modbus","frameBytes","complete","corrupt","incomplete","noFrameStart","hexToByte","WBP02_CONTROL_SERVICE","WBP02_WRITE","WBP02_DATA_SERVICE","WBP02_NOTIFY","wbp02Crc","bytes","crc","wbp02Command","command","payload","body","length","map","wbp02Connect","wbp02SyncTime","date","Date","getFullYear","getMonth","getDate","getHours","getMinutes","wbp02Login","wbp02RecordCount","wbp02Record","index","decodeWbp02Response","frame","undefined","slice","at","content","parseWbp02Record","value","offset","year","month","day","hour","minute","recordedAt","systolic","diastolic","heartRate","recordingId","toISOString","Wbp02FrameReader","readFrame","buffer","start","findIndex"],"sourceRoot":"../../../../../../../src","sources":["modules/bt-management/services/devices/viatom/viatom.wbp02.protocol.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+
3
+ const INITIAL_VALUE = 0xffff;
4
+ const REFLECTED_POLYNOMIAL = 0xa001;
5
+ const BITS_PER_BYTE = 8;
6
+
7
+ /** CRC-16/MODBUS (reflected polynomial 0xA001, initial value 0xFFFF); its low byte is the one sent first. */
8
+ export const calculateCrc16Modbus = bytes => {
9
+ let crc = INITIAL_VALUE;
10
+ for (const value of bytes) {
11
+ crc ^= value;
12
+ for (let bit = 0; bit < BITS_PER_BYTE; bit += 1) {
13
+ crc = (crc & 1) !== 0 ? crc >>> 1 ^ REFLECTED_POLYNOMIAL : crc >>> 1;
14
+ }
15
+ }
16
+ return crc;
17
+ };
18
+ //# sourceMappingURL=calculate-crc-16-modbus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["INITIAL_VALUE","REFLECTED_POLYNOMIAL","BITS_PER_BYTE","calculateCrc16Modbus","bytes","crc","value","bit"],"sourceRoot":"../../../../../src","sources":["modules/bt-management/utils/calculate-crc-16-modbus.ts"],"mappings":";;AAAA,MAAMA,aAAa,GAAG,MAAM;AAC5B,MAAMC,oBAAoB,GAAG,MAAM;AACnC,MAAMC,aAAa,GAAG,CAAC;;AAEvB;AACA,OAAO,MAAMC,oBAAoB,GAAIC,KAAwB,IAAa;EACxE,IAAIC,GAAG,GAAGL,aAAa;EAEvB,KAAK,MAAMM,KAAK,IAAIF,KAAK,EAAE;IACzBC,GAAG,IAAIC,KAAK;IACZ,KAAK,IAAIC,GAAG,GAAG,CAAC,EAAEA,GAAG,GAAGL,aAAa,EAAEK,GAAG,IAAI,CAAC,EAAE;MAC/CF,GAAG,GAAG,CAACA,GAAG,GAAG,CAAC,MAAM,CAAC,GAAIA,GAAG,KAAK,CAAC,GAAIJ,oBAAoB,GAAGI,GAAG,KAAK,CAAC;IACxE;EACF;EAEA,OAAOA,GAAG;AACZ,CAAC","ignoreList":[]}
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+
3
+ /** One mmol/L of glucose (180.16 g/mol) is 18.016 mg/dL, as in the SIG glucose profile. */
4
+ const MG_PER_DL_PER_MMOL_PER_L = 18.016;
5
+
6
+ /** Glucose in tenths of a mmol/L, rounded to whole mg/dL. */
7
+ export const tenthsMmolToMgPerDl = tenthsMmol => Math.round(tenthsMmol / 10 * MG_PER_DL_PER_MMOL_PER_L);
8
+ //# sourceMappingURL=tenths-mmol-to-mg-per-dl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["MG_PER_DL_PER_MMOL_PER_L","tenthsMmolToMgPerDl","tenthsMmol","Math","round"],"sourceRoot":"../../../../../src","sources":["modules/bt-management/utils/tenths-mmol-to-mg-per-dl.ts"],"mappings":";;AAAA;AACA,MAAMA,wBAAwB,GAAG,MAAM;;AAEvC;AACA,OAAO,MAAMC,mBAAmB,GAAIC,UAAkB,IACpDC,IAAI,CAACC,KAAK,CAAEF,UAAU,GAAG,EAAE,GAAIF,wBAAwB,CAAC","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"blood-glucose.device.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/modules/bt-management/services/devices/blood-glucose/blood-glucose.device.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAG9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AACzE,OAAO,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAC;AAClF,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,uBAAuB,EAAE,MAAM,2CAA2C,CAAC;AACpF,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAEvD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAavD,KAAK,aAAa,GACd,iBAAiB,CAAC,cAAc,GAChC,iBAAiB,CAAC,UAAU,GAC5B,iBAAiB,CAAC,GAAG,CAAC;AA8D1B,gFAAgF;AAChF,qBAAa,kBAAmB,SAAQ,eAAe,CAAC,aAAa,CAAC;IACpE,SAAS,CAAC,gBAAgB,SAAU;IACpC,SAAS,CAAC,YAAY,EAAE,QAAQ,EAAE,CAAC;gBAGjC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,kBAAkB,CAAC,aAAa,CAAC;IAM3C,SAAS,CAAC,eAAe,GAAI,KAAK,MAAM,EAAE,KAAG,OAAO,CACsB;IAE1E,SAAS,CAAC,mBAAmB,CAC3B,MAAM,EAAE,uBAAuB,CAAC,yBAAyB,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,EAC3E,KAAK,EAAE,MAAM,EAAE,GACd,IAAI;CAeR"}
1
+ {"version":3,"file":"blood-glucose.device.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/modules/bt-management/services/devices/blood-glucose/blood-glucose.device.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAI9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,qCAAqC,CAAC;AACzE,OAAO,EAAE,yBAAyB,EAAE,MAAM,uCAAuC,CAAC;AAClF,OAAO,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AACtE,OAAO,EAAE,uBAAuB,EAAE,MAAM,2CAA2C,CAAC;AACpF,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAcvD,KAAK,aAAa,GACd,iBAAiB,CAAC,cAAc,GAChC,iBAAiB,CAAC,UAAU,GAC5B,iBAAiB,CAAC,GAAG,CAAC;AAmE1B,gFAAgF;AAChF,qBAAa,kBAAmB,SAAQ,eAAe,CAAC,aAAa,CAAC;IACpE,SAAS,CAAC,gBAAgB,SAAU;IACpC,SAAS,CAAC,YAAY,EAAE,QAAQ,EAAE,CAAC;gBAGjC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,kBAAkB,CAAC,aAAa,CAAC;IAoB3C,SAAS,CAAC,eAAe,GAAI,KAAK,MAAM,EAAE,KAAG,OAAO,CAAoB;IAExE,SAAS,CAAC,mBAAmB,CAC3B,MAAM,EAAE,uBAAuB,CAAC,yBAAyB,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,EAC3E,KAAK,EAAE,MAAM,EAAE,GACd,IAAI;CAYR"}
@@ -0,0 +1,34 @@
1
+ import { FrameReadResult } from "../../../types/frame-read-result";
2
+ import { FrameReader } from "../../../types/frame-reader";
3
+ export declare const TELEBGM_SERVICE = "0003cdd0-0000-1000-8000-00805f9b0131";
4
+ export declare const TELEBGM_NOTIFY = "0003cdd1-0000-1000-8000-00805f9b0131";
5
+ export declare const TELEBGM_WRITE = "0003cdd2-0000-1000-8000-00805f9b0131";
6
+ /** Command byte of a frame; the meter answers a request with the same byte. */
7
+ export declare const TELEBGM_COMMAND: {
8
+ readonly testStatus: 18;
9
+ readonly setTime: 68;
10
+ readonly softwareVersion: 102;
11
+ readonly serial: 119;
12
+ readonly units: 170;
13
+ readonly historyEnd: 209;
14
+ readonly history: 221;
15
+ readonly transferEnd: 242;
16
+ };
17
+ /** Parameter byte of a request, a clock write and an acknowledgement. */
18
+ export declare const TELEBGM_PARAMETER: {
19
+ readonly request: 85;
20
+ readonly write: 102;
21
+ readonly ack: 153;
22
+ };
23
+ /** `7B 01 10 01 20 <command> <parameter> <length, 2 bytes> <payload> <CRC nibbles> 7D`. */
24
+ export declare const telebgmFrame: (command: number, parameter: number, payload?: readonly number[]) => string[];
25
+ /** A frame's command byte and payload. */
26
+ export declare const unframe: (frame: readonly string[]) => {
27
+ command?: number;
28
+ payload: number[];
29
+ };
30
+ /** Reads frames by their length field, a record being longer than one notification, and checks their CRC. */
31
+ export declare class TeleBgmFrameReader implements FrameReader {
32
+ readFrame(buffer: readonly string[]): FrameReadResult;
33
+ }
34
+ //# sourceMappingURL=telebgm.protocol.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telebgm.protocol.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/modules/bt-management/services/devices/blood-glucose/telebgm.protocol.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAM1D,eAAO,MAAM,eAAe,yCAAyC,CAAC;AACtE,eAAO,MAAM,cAAc,yCAAyC,CAAC;AACrE,eAAO,MAAM,aAAa,yCAAyC,CAAC;AAEpE,+EAA+E;AAC/E,eAAO,MAAM,eAAe;;;;;;;;;CASlB,CAAC;AAEX,yEAAyE;AACzE,eAAO,MAAM,iBAAiB;;;;CAAqD,CAAC;AAsBpF,2FAA2F;AAC3F,eAAO,MAAM,YAAY,GACvB,SAAS,MAAM,EACf,WAAW,MAAM,EACjB,UAAS,SAAS,MAAM,EAAO,KAC9B,MAAM,EAIR,CAAC;AAEF,0CAA0C;AAC1C,eAAO,MAAM,OAAO,GAAI,OAAO,SAAS,MAAM,EAAE,KAAG;IAAE,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAA;CAIvF,CAAC;AAWF,6GAA6G;AAC7G,qBAAa,kBAAmB,YAAW,WAAW;IAC7C,SAAS,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,GAAG,eAAe;CA2B7D"}