@ovok/native 0.4.0 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/commonjs/modules/bt-management/services/device-creator.js +3 -1
- package/lib/commonjs/modules/bt-management/services/device-creator.js.map +1 -1
- package/lib/commonjs/modules/bt-management/services/devices/bc01/bc01.device.js +87 -0
- package/lib/commonjs/modules/bt-management/services/devices/bc01/bc01.device.js.map +1 -0
- package/lib/commonjs/modules/bt-management/services/devices/bc01/bc01.main-services.js +103 -0
- package/lib/commonjs/modules/bt-management/services/devices/bc01/bc01.main-services.js.map +1 -0
- package/lib/commonjs/modules/bt-management/types/device-measurement-map.js.map +1 -1
- package/lib/module/modules/bt-management/services/device-creator.js +3 -1
- package/lib/module/modules/bt-management/services/device-creator.js.map +1 -1
- package/lib/module/modules/bt-management/services/devices/bc01/bc01.device.js +83 -0
- package/lib/module/modules/bt-management/services/devices/bc01/bc01.device.js.map +1 -0
- package/lib/module/modules/bt-management/services/devices/bc01/bc01.main-services.js +99 -0
- package/lib/module/modules/bt-management/services/devices/bc01/bc01.main-services.js.map +1 -0
- package/lib/module/modules/bt-management/types/device-measurement-map.js.map +1 -1
- package/lib/typescript/commonjs/src/modules/bt-management/services/device-creator.d.ts.map +1 -1
- package/lib/typescript/commonjs/src/modules/bt-management/services/devices/bc01/bc01.device.d.ts +33 -0
- package/lib/typescript/commonjs/src/modules/bt-management/services/devices/bc01/bc01.device.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/modules/bt-management/services/devices/bc01/bc01.main-services.d.ts +27 -0
- package/lib/typescript/commonjs/src/modules/bt-management/services/devices/bc01/bc01.main-services.d.ts.map +1 -0
- package/lib/typescript/commonjs/src/modules/bt-management/types/device-measurement-map.d.ts +2 -2
- package/lib/typescript/commonjs/src/modules/bt-management/types/device-measurement-map.d.ts.map +1 -1
- package/lib/typescript/module/src/modules/bt-management/services/device-creator.d.ts.map +1 -1
- package/lib/typescript/module/src/modules/bt-management/services/devices/bc01/bc01.device.d.ts +33 -0
- package/lib/typescript/module/src/modules/bt-management/services/devices/bc01/bc01.device.d.ts.map +1 -0
- package/lib/typescript/module/src/modules/bt-management/services/devices/bc01/bc01.main-services.d.ts +27 -0
- package/lib/typescript/module/src/modules/bt-management/services/devices/bc01/bc01.main-services.d.ts.map +1 -0
- package/lib/typescript/module/src/modules/bt-management/types/device-measurement-map.d.ts +2 -2
- package/lib/typescript/module/src/modules/bt-management/types/device-measurement-map.d.ts.map +1 -1
- package/package.json +4 -1
|
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports.DeviceCreator = void 0;
|
|
7
7
|
var _integratedDevicesMap = require("../constants/integrated-devices-map.js");
|
|
8
8
|
var _integratedDevices = require("../types/integrated-devices.js");
|
|
9
|
+
var _bc01Device = require("./devices/bc01/bc01.device.js");
|
|
9
10
|
var _bp2Device = require("./devices/bp2/bp2.device.js");
|
|
10
11
|
var _f4Device = require("./devices/f4/f4.device.js");
|
|
11
12
|
var _spo2Device = require("./devices/spo/spo2.device.js");
|
|
@@ -41,7 +42,8 @@ class DeviceCreator {
|
|
|
41
42
|
const deviceMap = {
|
|
42
43
|
[_integratedDevices.IntegratedDevices.BP2]: _bp2Device.BP2Device,
|
|
43
44
|
[_integratedDevices.IntegratedDevices.F4]: _f4Device.F4Device,
|
|
44
|
-
[_integratedDevices.IntegratedDevices.PC60WF]: _spo2Device.SPO2Device
|
|
45
|
+
[_integratedDevices.IntegratedDevices.PC60WF]: _spo2Device.SPO2Device,
|
|
46
|
+
[_integratedDevices.IntegratedDevices.BC01]: _bc01Device.BC01Device
|
|
45
47
|
};
|
|
46
48
|
const deviceClass = deviceMap[params.deviceName];
|
|
47
49
|
if (!deviceClass) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_integratedDevicesMap","require","_integratedDevices","_bp2Device","_f4Device","_spo2Device","DeviceCreator","deviceNameCache","Map","CACHE_MAX_SIZE","constructor","acceptedDeviceNames","getDeviceName","foundName","deviceName","getIntegratedDeviceName","some","name","createDevice","params","trim","Error","device","id","deviceMap","IntegratedDevices","BP2","BP2Device","F4","F4Device","PC60WF","SPO2Device","deviceClass","destroy","clear","undefined","has","cached","get","matchedDevice","regex","deviceType","integratedDevicesMap","test","cacheDeviceName","size","firstKey","keys","next","value","delete","set","exports"],"sourceRoot":"../../../../../src","sources":["modules/bt-management/services/device-creator.ts"],"mappings":";;;;;;AAAA,IAAAA,qBAAA,GAAAC,OAAA;AAEA,IAAAC,kBAAA,GAAAD,OAAA;AAEA,IAAAE,
|
|
1
|
+
{"version":3,"names":["_integratedDevicesMap","require","_integratedDevices","_bc01Device","_bp2Device","_f4Device","_spo2Device","DeviceCreator","deviceNameCache","Map","CACHE_MAX_SIZE","constructor","acceptedDeviceNames","getDeviceName","foundName","deviceName","getIntegratedDeviceName","some","name","createDevice","params","trim","Error","device","id","deviceMap","IntegratedDevices","BP2","BP2Device","F4","F4Device","PC60WF","SPO2Device","BC01","BC01Device","deviceClass","destroy","clear","undefined","has","cached","get","matchedDevice","regex","deviceType","integratedDevicesMap","test","cacheDeviceName","size","firstKey","keys","next","value","delete","set","exports"],"sourceRoot":"../../../../../src","sources":["modules/bt-management/services/device-creator.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.BC01Device = void 0;
|
|
7
|
+
var _caseType = require("../../../types/case-type.js");
|
|
8
|
+
var _btManagedDevice = require("../bt-managed-device.js");
|
|
9
|
+
var _bc01MainServices = require("./bc01.main-services.js");
|
|
10
|
+
/**
|
|
11
|
+
* Contec BC401 (BC01) urine analyzer driver.
|
|
12
|
+
*
|
|
13
|
+
* The BC401 is a single-shot device: the patient dips a URS-7 strip, presses
|
|
14
|
+
* the button, and the device pushes exactly one result frame on 0xFF01. There
|
|
15
|
+
* is no streaming state, no per-tick updates, and no measurement session to
|
|
16
|
+
* open — the device auto-starts on button press.
|
|
17
|
+
*/
|
|
18
|
+
class BC01Device extends _btManagedDevice.BTManagedDevice {
|
|
19
|
+
onStreamStart = () => {};
|
|
20
|
+
mainServices = _bc01MainServices.bc01MainServices;
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* 90 s covers the maximum firmware-side reagent-pad settle time on a URS-7
|
|
24
|
+
* strip. If the device does not push a result frame within that window the
|
|
25
|
+
* data-processor times out and the driver surfaces "device unreachable".
|
|
26
|
+
*/
|
|
27
|
+
stuckDataTimeout = 90_000;
|
|
28
|
+
validatePackage = pkg => {
|
|
29
|
+
pkg = pkg.map(b => b.toLowerCase());
|
|
30
|
+
let headIndex = -1;
|
|
31
|
+
for (let i = 0; i < pkg.length - 1; i++) {
|
|
32
|
+
if (pkg[i] === "aa" && pkg[i + 1] === "55") {
|
|
33
|
+
headIndex = i;
|
|
34
|
+
break;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
if (headIndex === -1) {
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
if (headIndex > 0) {
|
|
41
|
+
pkg = pkg.slice(headIndex);
|
|
42
|
+
}
|
|
43
|
+
if (pkg.length < 5) {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
const lengthByte = parseInt(pkg[2] ?? "0", 16) || 0;
|
|
47
|
+
const totalLen = 3 + lengthByte;
|
|
48
|
+
if (pkg.length < totalLen) {
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
return true;
|
|
52
|
+
};
|
|
53
|
+
handleSuccessResult(successResult) {
|
|
54
|
+
if (successResult.caseType !== _caseType.CaseType.RESULT) {
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
if (!successResult.measurementTypeKey) {
|
|
58
|
+
this.onError?.(new Error(`Measurement type is undefined for case ${successResult.caseType}`));
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
this.handleUrinalysisResult(successResult);
|
|
62
|
+
}
|
|
63
|
+
handleUrinalysisResult(successResult) {
|
|
64
|
+
const error = this.checkIfHasError(successResult);
|
|
65
|
+
if (error) {
|
|
66
|
+
this.onError?.(error);
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
this.onResult?.(successResult);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* A well-formed frame with all analyte fields still undefined means the
|
|
74
|
+
* device produced an empty read — typically a strip inserted upside down or
|
|
75
|
+
* removed before the reagent-pad timer completed.
|
|
76
|
+
*/
|
|
77
|
+
checkIfHasError(successResult) {
|
|
78
|
+
const analytes = ["uro", "bld", "bil", "ket", "glu", "pro", "ph", "nit", "leu", "sg", "vc"];
|
|
79
|
+
const hasAnyReading = analytes.some(key => successResult[key] !== undefined);
|
|
80
|
+
if (!hasAnyReading) {
|
|
81
|
+
return "feedback-messages.measurement.disturb-detected-error";
|
|
82
|
+
}
|
|
83
|
+
return undefined;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
exports.BC01Device = BC01Device;
|
|
87
|
+
//# sourceMappingURL=bc01.device.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_caseType","require","_btManagedDevice","_bc01MainServices","BC01Device","BTManagedDevice","onStreamStart","mainServices","bc01MainServices","stuckDataTimeout","validatePackage","pkg","map","b","toLowerCase","headIndex","i","length","slice","lengthByte","parseInt","totalLen","handleSuccessResult","successResult","caseType","CaseType","RESULT","measurementTypeKey","onError","Error","handleUrinalysisResult","error","checkIfHasError","onResult","analytes","hasAnyReading","some","key","undefined","exports"],"sourceRoot":"../../../../../../../src","sources":["modules/bt-management/services/devices/bc01/bc01.device.ts"],"mappings":";;;;;;AAEA,IAAAA,SAAA,GAAAC,OAAA;AAKA,IAAAC,gBAAA,GAAAD,OAAA;AAEA,IAAAE,iBAAA,GAAAF,OAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMG,UAAU,SAASC,gCAAe,CAAyB;EAC5DC,aAAa,GAAeA,CAAA,KAAM,CAAC,CAAC;EAEpCC,YAAY,GAAeC,kCAAgB;;EAErD;AACF;AACA;AACA;AACA;EACYC,gBAAgB,GAAG,MAAM;EAEzBC,eAAe,GAAgCC,GAAG,IAAK;IAC/DA,GAAG,GAAGA,GAAG,CAACC,GAAG,CAAEC,CAAC,IAAKA,CAAC,CAACC,WAAW,CAAC,CAAC,CAAC;IAErC,IAAIC,SAAS,GAAG,CAAC,CAAC;IAElB,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGL,GAAG,CAACM,MAAM,GAAG,CAAC,EAAED,CAAC,EAAE,EAAE;MACvC,IAAIL,GAAG,CAACK,CAAC,CAAC,KAAK,IAAI,IAAIL,GAAG,CAACK,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,EAAE;QAC1CD,SAAS,GAAGC,CAAC;QACb;MACF;IACF;IAEA,IAAID,SAAS,KAAK,CAAC,CAAC,EAAE;MACpB,OAAO,KAAK;IACd;IAEA,IAAIA,SAAS,GAAG,CAAC,EAAE;MACjBJ,GAAG,GAAGA,GAAG,CAACO,KAAK,CAACH,SAAS,CAAC;IAC5B;IAEA,IAAIJ,GAAG,CAACM,MAAM,GAAG,CAAC,EAAE;MAClB,OAAO,KAAK;IACd;IAEA,MAAME,UAAU,GAAGC,QAAQ,CAACT,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC;IACnD,MAAMU,QAAQ,GAAG,CAAC,GAAGF,UAAU;IAE/B,IAAIR,GAAG,CAACM,MAAM,GAAGI,QAAQ,EAAE;MACzB,OAAO,KAAK;IACd;IAEA,OAAO,IAAI;EACb,CAAC;EAESC,mBAAmBA,CAC3BC,aAEC,EACe;IAChB,IAAIA,aAAa,CAACC,QAAQ,KAAKC,kBAAQ,CAACC,MAAM,EAAE;MAC9C;IACF;IAEA,IAAI,CAACH,aAAa,CAACI,kBAAkB,EAAE;MACrC,IAAI,CAACC,OAAO,GACV,IAAIC,KAAK,CACP,0CAA0CN,aAAa,CAACC,QAAQ,EAClE,CACF,CAAC;MAED;IACF;IAEA,IAAI,CAACM,sBAAsB,CAACP,aAAa,CAAC;EAC5C;EAEQO,sBAAsBA,CAC5BP,aAA+D,EACzD;IACN,MAAMQ,KAAK,GAAG,IAAI,CAACC,eAAe,CAACT,aAAa,CAAC;IAEjD,IAAIQ,KAAK,EAAE;MACT,IAAI,CAACH,OAAO,GAAGG,KAAK,CAAC;MAErB;IACF;IAEA,IAAI,CAACE,QAAQ,GAAGV,aAAa,CAAC;EAChC;;EAEA;AACF;AACA;AACA;AACA;EACUS,eAAeA,CACrBT,aAA+D,EAC3C;IACpB,MAAMW,QAA8C,GAAG,CACrD,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,IAAI,EACJ,KAAK,EACL,KAAK,EACL,IAAI,EACJ,IAAI,CACL;IAED,MAAMC,aAAa,GAAGD,QAAQ,CAACE,IAAI,CAChCC,GAAG,IAAKd,aAAa,CAACc,GAAG,CAAC,KAAKC,SAClC,CAAC;IAED,IAAI,CAACH,aAAa,EAAE;MAClB,OAAO,sDAAsD;IAC/D;IAEA,OAAOG,SAAS;EAClB;AACF;AAACC,OAAA,CAAAnC,UAAA,GAAAA,UAAA","ignoreList":[]}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.bc01MainServices = void 0;
|
|
7
|
+
var _core = require("@ovok/core");
|
|
8
|
+
var _caseType = require("../../../types/case-type.js");
|
|
9
|
+
/**
|
|
10
|
+
* Contec BC401 (a.k.a. BC01) urine analyzer — GATT profile.
|
|
11
|
+
*
|
|
12
|
+
* The BC401 uses Contec's proprietary FF12 service, shared across their consumer
|
|
13
|
+
* medical devices. A single result notification carries a 7-parameter URS-7
|
|
14
|
+
* strip readout expanded into eleven analyte values on the wire.
|
|
15
|
+
*
|
|
16
|
+
* Service 0xFF12
|
|
17
|
+
* Notify (result) 0xFF01 — CCCD 0x2902 must be written 01 00 to enable
|
|
18
|
+
* Write (command) 0xFF02 — RESET / SET_UNIT / REQUEST_HISTORY
|
|
19
|
+
*
|
|
20
|
+
* Wire layout of a result frame (Contec URS-7 firmware ≥ 1.2.x):
|
|
21
|
+
* [0..1] header "aa 55" — Contec sentinel
|
|
22
|
+
* [2] length byte after header
|
|
23
|
+
* [3] command "a1" == RESULT_URS7
|
|
24
|
+
* [4] strip type "07" == 7-panel
|
|
25
|
+
* [5..15] values one byte per analyte, encoding the discrete
|
|
26
|
+
* level index into diagnosticResults[key]
|
|
27
|
+
* [16] checksum xor over [2..15]
|
|
28
|
+
*
|
|
29
|
+
* Byte positions calibrated against PHMS 3.0.03 Android app; older firmware
|
|
30
|
+
* (< 1.2.x) uses a different command byte and is not supported by this driver
|
|
31
|
+
* (the validator will reject those frames).
|
|
32
|
+
*/
|
|
33
|
+
const bc01MainServices = exports.bc01MainServices = [{
|
|
34
|
+
uuid: "0000ff12-0000-1000-8000-00805f9b34fb",
|
|
35
|
+
monitorUuids: [{
|
|
36
|
+
uuid: "0000ff01-0000-1000-8000-00805f9b34fb",
|
|
37
|
+
parsingModel: {
|
|
38
|
+
caseValuePosition: [0, 1, 3, 4],
|
|
39
|
+
cases: [{
|
|
40
|
+
measurementTypeKey: _core.MeasurementTypeKey.uricAcid,
|
|
41
|
+
caseType: _caseType.CaseType.RESULT,
|
|
42
|
+
caseValue: "aa55a107",
|
|
43
|
+
parseDefinitions: [{
|
|
44
|
+
name: "uro",
|
|
45
|
+
parseType: "number",
|
|
46
|
+
byteIndexes: [5],
|
|
47
|
+
parseReference: 16
|
|
48
|
+
}, {
|
|
49
|
+
name: "bld",
|
|
50
|
+
parseType: "number",
|
|
51
|
+
byteIndexes: [6],
|
|
52
|
+
parseReference: 16
|
|
53
|
+
}, {
|
|
54
|
+
name: "bil",
|
|
55
|
+
parseType: "number",
|
|
56
|
+
byteIndexes: [7],
|
|
57
|
+
parseReference: 16
|
|
58
|
+
}, {
|
|
59
|
+
name: "ket",
|
|
60
|
+
parseType: "number",
|
|
61
|
+
byteIndexes: [8],
|
|
62
|
+
parseReference: 16
|
|
63
|
+
}, {
|
|
64
|
+
name: "glu",
|
|
65
|
+
parseType: "number",
|
|
66
|
+
byteIndexes: [9],
|
|
67
|
+
parseReference: 16
|
|
68
|
+
}, {
|
|
69
|
+
name: "pro",
|
|
70
|
+
parseType: "number",
|
|
71
|
+
byteIndexes: [10],
|
|
72
|
+
parseReference: 16
|
|
73
|
+
}, {
|
|
74
|
+
name: "ph",
|
|
75
|
+
parseType: "number",
|
|
76
|
+
byteIndexes: [11],
|
|
77
|
+
parseReference: 16
|
|
78
|
+
}, {
|
|
79
|
+
name: "nit",
|
|
80
|
+
parseType: "number",
|
|
81
|
+
byteIndexes: [12],
|
|
82
|
+
parseReference: 16
|
|
83
|
+
}, {
|
|
84
|
+
name: "leu",
|
|
85
|
+
parseType: "number",
|
|
86
|
+
byteIndexes: [13],
|
|
87
|
+
parseReference: 16
|
|
88
|
+
}, {
|
|
89
|
+
name: "sg",
|
|
90
|
+
parseType: "number",
|
|
91
|
+
byteIndexes: [14],
|
|
92
|
+
parseReference: 16
|
|
93
|
+
}, {
|
|
94
|
+
name: "vc",
|
|
95
|
+
parseType: "number",
|
|
96
|
+
byteIndexes: [15],
|
|
97
|
+
parseReference: 16
|
|
98
|
+
}]
|
|
99
|
+
}]
|
|
100
|
+
}
|
|
101
|
+
}]
|
|
102
|
+
}];
|
|
103
|
+
//# sourceMappingURL=bc01.main-services.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_core","require","_caseType","bc01MainServices","exports","uuid","monitorUuids","parsingModel","caseValuePosition","cases","measurementTypeKey","MeasurementTypeKey","uricAcid","caseType","CaseType","RESULT","caseValue","parseDefinitions","name","parseType","byteIndexes","parseReference"],"sourceRoot":"../../../../../../../src","sources":["modules/bt-management/services/devices/bc01/bc01.main-services.ts"],"mappings":";;;;;;AAAA,IAAAA,KAAA,GAAAC,OAAA;AAEA,IAAAC,SAAA,GAAAD,OAAA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAME,gBAA4B,GAAAC,OAAA,CAAAD,gBAAA,GAAG,CAC1C;EACEE,IAAI,EAAE,sCAAsC;EAC5CC,YAAY,EAAE,CACZ;IACED,IAAI,EAAE,sCAAsC;IAC5CE,YAAY,EAAE;MACZC,iBAAiB,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;MAC/BC,KAAK,EAAE,CACL;QACEC,kBAAkB,EAAEC,wBAAkB,CAACC,QAAQ;QAC/CC,QAAQ,EAAEC,kBAAQ,CAACC,MAAM;QACzBC,SAAS,EAAE,UAAU;QACrBC,gBAAgB,EAAE,CAChB;UACEC,IAAI,EAAE,KAAK;UACXC,SAAS,EAAE,QAAQ;UACnBC,WAAW,EAAE,CAAC,CAAC,CAAC;UAChBC,cAAc,EAAE;QAClB,CAAC,EACD;UACEH,IAAI,EAAE,KAAK;UACXC,SAAS,EAAE,QAAQ;UACnBC,WAAW,EAAE,CAAC,CAAC,CAAC;UAChBC,cAAc,EAAE;QAClB,CAAC,EACD;UACEH,IAAI,EAAE,KAAK;UACXC,SAAS,EAAE,QAAQ;UACnBC,WAAW,EAAE,CAAC,CAAC,CAAC;UAChBC,cAAc,EAAE;QAClB,CAAC,EACD;UACEH,IAAI,EAAE,KAAK;UACXC,SAAS,EAAE,QAAQ;UACnBC,WAAW,EAAE,CAAC,CAAC,CAAC;UAChBC,cAAc,EAAE;QAClB,CAAC,EACD;UACEH,IAAI,EAAE,KAAK;UACXC,SAAS,EAAE,QAAQ;UACnBC,WAAW,EAAE,CAAC,CAAC,CAAC;UAChBC,cAAc,EAAE;QAClB,CAAC,EACD;UACEH,IAAI,EAAE,KAAK;UACXC,SAAS,EAAE,QAAQ;UACnBC,WAAW,EAAE,CAAC,EAAE,CAAC;UACjBC,cAAc,EAAE;QAClB,CAAC,EACD;UACEH,IAAI,EAAE,IAAI;UACVC,SAAS,EAAE,QAAQ;UACnBC,WAAW,EAAE,CAAC,EAAE,CAAC;UACjBC,cAAc,EAAE;QAClB,CAAC,EACD;UACEH,IAAI,EAAE,KAAK;UACXC,SAAS,EAAE,QAAQ;UACnBC,WAAW,EAAE,CAAC,EAAE,CAAC;UACjBC,cAAc,EAAE;QAClB,CAAC,EACD;UACEH,IAAI,EAAE,KAAK;UACXC,SAAS,EAAE,QAAQ;UACnBC,WAAW,EAAE,CAAC,EAAE,CAAC;UACjBC,cAAc,EAAE;QAClB,CAAC,EACD;UACEH,IAAI,EAAE,IAAI;UACVC,SAAS,EAAE,QAAQ;UACnBC,WAAW,EAAE,CAAC,EAAE,CAAC;UACjBC,cAAc,EAAE;QAClB,CAAC,EACD;UACEH,IAAI,EAAE,IAAI;UACVC,SAAS,EAAE,QAAQ;UACnBC,WAAW,EAAE,CAAC,EAAE,CAAC;UACjBC,cAAc,EAAE;QAClB,CAAC;MAEL,CAAC;IAEL;EACF,CAAC;AAEL,CAAC,CACF","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_integratedDevices","require"],"sourceRoot":"../../../../../src","sources":["modules/bt-management/types/device-measurement-map.ts"],"mappings":";;
|
|
1
|
+
{"version":3,"names":["_integratedDevices","require"],"sourceRoot":"../../../../../src","sources":["modules/bt-management/types/device-measurement-map.ts"],"mappings":";;AASA,IAAAA,kBAAA,GAAAC,OAAA","ignoreList":[]}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import { integratedDevicesMap } from "../constants/integrated-devices-map.js";
|
|
4
4
|
import { IntegratedDevices } from "../types/integrated-devices.js";
|
|
5
|
+
import { BC01Device } from "./devices/bc01/bc01.device.js";
|
|
5
6
|
import { BP2Device } from "./devices/bp2/bp2.device.js";
|
|
6
7
|
import { F4Device } from "./devices/f4/f4.device.js";
|
|
7
8
|
import { SPO2Device } from "./devices/spo/spo2.device.js";
|
|
@@ -37,7 +38,8 @@ export class DeviceCreator {
|
|
|
37
38
|
const deviceMap = {
|
|
38
39
|
[IntegratedDevices.BP2]: BP2Device,
|
|
39
40
|
[IntegratedDevices.F4]: F4Device,
|
|
40
|
-
[IntegratedDevices.PC60WF]: SPO2Device
|
|
41
|
+
[IntegratedDevices.PC60WF]: SPO2Device,
|
|
42
|
+
[IntegratedDevices.BC01]: BC01Device
|
|
41
43
|
};
|
|
42
44
|
const deviceClass = deviceMap[params.deviceName];
|
|
43
45
|
if (!deviceClass) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["integratedDevicesMap","IntegratedDevices","BP2Device","F4Device","SPO2Device","DeviceCreator","deviceNameCache","Map","CACHE_MAX_SIZE","constructor","acceptedDeviceNames","getDeviceName","foundName","deviceName","getIntegratedDeviceName","some","name","createDevice","params","trim","Error","device","id","deviceMap","BP2","F4","PC60WF","deviceClass","destroy","clear","undefined","has","cached","get","matchedDevice","regex","deviceType","test","cacheDeviceName","size","firstKey","keys","next","value","delete","set"],"sourceRoot":"../../../../../src","sources":["modules/bt-management/services/device-creator.ts"],"mappings":";;AAAA,SAASA,oBAAoB,QAAQ,wCAAqC;AAE1E,SAASC,iBAAiB,QAAQ,gCAA6B;AAE/D,SAASC,SAAS,QAAQ,6BAA0B;AAEpD,SAASC,QAAQ,QAAQ,2BAAwB;AACjD,SAASC,UAAU,QAAQ,8BAA2B;AAEtD,OAAO,MAAMC,aAAa,CAAyC;EACzDC,eAAe,GAAG,IAAIC,GAAG,CAAmC,CAAC;EACpDC,cAAc,GAAG,GAAG;EAErCC,WAAWA,CAAkBC,mBAAsB,EAAE;IAAA,KAAxBA,mBAAsB,GAAtBA,mBAAsB;EAAG;EAE/CC,aAAa,GAAIC,SAAiB,IAAoC;IAC3E,MAAMC,UAAU,GAAG,IAAI,CAACC,uBAAuB,CAACF,SAAS,CAAC;IAE1D,IAAI,CAACC,UAAU,EAAE;MACf;IACF;IAEA,IAAI,CAAC,IAAI,CAACH,mBAAmB,CAACK,IAAI,CAAEC,IAAI,IAAKA,IAAI,KAAKH,UAAU,CAAC,EAAE;MACjE;IACF;IAEA,OAAOA,UAAU;EACnB,CAAC;EAEMI,YAAYA,CACjBC,MAA6B,EACT;IACpB,IAAI,CAACA,MAAM,CAACL,UAAU,CAACM,IAAI,CAAC,CAAC,EAAE;MAC7B,MAAM,IAAIC,KAAK,CAAC,yBAAyB,CAAC;IAC5C;IAEA,IAAI,CAACF,MAAM,CAACG,MAAM,EAAE;MAClB,MAAM,IAAID,KAAK,CAAC,oBAAoB,CAAC;IACvC;IAEA,IAAI,CAACF,MAAM,CAACG,MAAM,CAACL,IAAI,EAAEG,IAAI,CAAC,CAAC,EAAE;MAC/B,MAAM,IAAIC,KAAK,CAAC,yBAAyB,CAAC;IAC5C;IACA,IAAI,CAACF,MAAM,CAACG,MAAM,CAACC,EAAE,EAAE;MACrB,MAAM,IAAIF,KAAK,CAAC,uBAAuB,CAAC;IAC1C;IAEA,MAAMG,SAAS,GAAG;MAChB,
|
|
1
|
+
{"version":3,"names":["integratedDevicesMap","IntegratedDevices","BC01Device","BP2Device","F4Device","SPO2Device","DeviceCreator","deviceNameCache","Map","CACHE_MAX_SIZE","constructor","acceptedDeviceNames","getDeviceName","foundName","deviceName","getIntegratedDeviceName","some","name","createDevice","params","trim","Error","device","id","deviceMap","BP2","F4","PC60WF","BC01","deviceClass","destroy","clear","undefined","has","cached","get","matchedDevice","regex","deviceType","test","cacheDeviceName","size","firstKey","keys","next","value","delete","set"],"sourceRoot":"../../../../../src","sources":["modules/bt-management/services/device-creator.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { CaseType } from "../../../types/case-type.js";
|
|
4
|
+
import { BTManagedDevice } from "../bt-managed-device.js";
|
|
5
|
+
import { bc01MainServices } from "./bc01.main-services.js";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Contec BC401 (BC01) urine analyzer driver.
|
|
9
|
+
*
|
|
10
|
+
* The BC401 is a single-shot device: the patient dips a URS-7 strip, presses
|
|
11
|
+
* the button, and the device pushes exactly one result frame on 0xFF01. There
|
|
12
|
+
* is no streaming state, no per-tick updates, and no measurement session to
|
|
13
|
+
* open — the device auto-starts on button press.
|
|
14
|
+
*/
|
|
15
|
+
export class BC01Device extends BTManagedDevice {
|
|
16
|
+
onStreamStart = () => {};
|
|
17
|
+
mainServices = bc01MainServices;
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* 90 s covers the maximum firmware-side reagent-pad settle time on a URS-7
|
|
21
|
+
* strip. If the device does not push a result frame within that window the
|
|
22
|
+
* data-processor times out and the driver surfaces "device unreachable".
|
|
23
|
+
*/
|
|
24
|
+
stuckDataTimeout = 90_000;
|
|
25
|
+
validatePackage = pkg => {
|
|
26
|
+
pkg = pkg.map(b => b.toLowerCase());
|
|
27
|
+
let headIndex = -1;
|
|
28
|
+
for (let i = 0; i < pkg.length - 1; i++) {
|
|
29
|
+
if (pkg[i] === "aa" && pkg[i + 1] === "55") {
|
|
30
|
+
headIndex = i;
|
|
31
|
+
break;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
if (headIndex === -1) {
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
37
|
+
if (headIndex > 0) {
|
|
38
|
+
pkg = pkg.slice(headIndex);
|
|
39
|
+
}
|
|
40
|
+
if (pkg.length < 5) {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
const lengthByte = parseInt(pkg[2] ?? "0", 16) || 0;
|
|
44
|
+
const totalLen = 3 + lengthByte;
|
|
45
|
+
if (pkg.length < totalLen) {
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
return true;
|
|
49
|
+
};
|
|
50
|
+
handleSuccessResult(successResult) {
|
|
51
|
+
if (successResult.caseType !== CaseType.RESULT) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
if (!successResult.measurementTypeKey) {
|
|
55
|
+
this.onError?.(new Error(`Measurement type is undefined for case ${successResult.caseType}`));
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
this.handleUrinalysisResult(successResult);
|
|
59
|
+
}
|
|
60
|
+
handleUrinalysisResult(successResult) {
|
|
61
|
+
const error = this.checkIfHasError(successResult);
|
|
62
|
+
if (error) {
|
|
63
|
+
this.onError?.(error);
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
this.onResult?.(successResult);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* A well-formed frame with all analyte fields still undefined means the
|
|
71
|
+
* device produced an empty read — typically a strip inserted upside down or
|
|
72
|
+
* removed before the reagent-pad timer completed.
|
|
73
|
+
*/
|
|
74
|
+
checkIfHasError(successResult) {
|
|
75
|
+
const analytes = ["uro", "bld", "bil", "ket", "glu", "pro", "ph", "nit", "leu", "sg", "vc"];
|
|
76
|
+
const hasAnyReading = analytes.some(key => successResult[key] !== undefined);
|
|
77
|
+
if (!hasAnyReading) {
|
|
78
|
+
return "feedback-messages.measurement.disturb-detected-error";
|
|
79
|
+
}
|
|
80
|
+
return undefined;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=bc01.device.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["CaseType","BTManagedDevice","bc01MainServices","BC01Device","onStreamStart","mainServices","stuckDataTimeout","validatePackage","pkg","map","b","toLowerCase","headIndex","i","length","slice","lengthByte","parseInt","totalLen","handleSuccessResult","successResult","caseType","RESULT","measurementTypeKey","onError","Error","handleUrinalysisResult","error","checkIfHasError","onResult","analytes","hasAnyReading","some","key","undefined"],"sourceRoot":"../../../../../../../src","sources":["modules/bt-management/services/devices/bc01/bc01.device.ts"],"mappings":";;AAEA,SAASA,QAAQ,QAAQ,6BAA0B;AAKnD,SAASC,eAAe,QAAQ,yBAAsB;AAEtD,SAASC,gBAAgB,QAAQ,yBAAsB;;AAEvD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,UAAU,SAASF,eAAe,CAAyB;EAC5DG,aAAa,GAAeA,CAAA,KAAM,CAAC,CAAC;EAEpCC,YAAY,GAAeH,gBAAgB;;EAErD;AACF;AACA;AACA;AACA;EACYI,gBAAgB,GAAG,MAAM;EAEzBC,eAAe,GAAgCC,GAAG,IAAK;IAC/DA,GAAG,GAAGA,GAAG,CAACC,GAAG,CAAEC,CAAC,IAAKA,CAAC,CAACC,WAAW,CAAC,CAAC,CAAC;IAErC,IAAIC,SAAS,GAAG,CAAC,CAAC;IAElB,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGL,GAAG,CAACM,MAAM,GAAG,CAAC,EAAED,CAAC,EAAE,EAAE;MACvC,IAAIL,GAAG,CAACK,CAAC,CAAC,KAAK,IAAI,IAAIL,GAAG,CAACK,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,EAAE;QAC1CD,SAAS,GAAGC,CAAC;QACb;MACF;IACF;IAEA,IAAID,SAAS,KAAK,CAAC,CAAC,EAAE;MACpB,OAAO,KAAK;IACd;IAEA,IAAIA,SAAS,GAAG,CAAC,EAAE;MACjBJ,GAAG,GAAGA,GAAG,CAACO,KAAK,CAACH,SAAS,CAAC;IAC5B;IAEA,IAAIJ,GAAG,CAACM,MAAM,GAAG,CAAC,EAAE;MAClB,OAAO,KAAK;IACd;IAEA,MAAME,UAAU,GAAGC,QAAQ,CAACT,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC;IACnD,MAAMU,QAAQ,GAAG,CAAC,GAAGF,UAAU;IAE/B,IAAIR,GAAG,CAACM,MAAM,GAAGI,QAAQ,EAAE;MACzB,OAAO,KAAK;IACd;IAEA,OAAO,IAAI;EACb,CAAC;EAESC,mBAAmBA,CAC3BC,aAEC,EACe;IAChB,IAAIA,aAAa,CAACC,QAAQ,KAAKrB,QAAQ,CAACsB,MAAM,EAAE;MAC9C;IACF;IAEA,IAAI,CAACF,aAAa,CAACG,kBAAkB,EAAE;MACrC,IAAI,CAACC,OAAO,GACV,IAAIC,KAAK,CACP,0CAA0CL,aAAa,CAACC,QAAQ,EAClE,CACF,CAAC;MAED;IACF;IAEA,IAAI,CAACK,sBAAsB,CAACN,aAAa,CAAC;EAC5C;EAEQM,sBAAsBA,CAC5BN,aAA+D,EACzD;IACN,MAAMO,KAAK,GAAG,IAAI,CAACC,eAAe,CAACR,aAAa,CAAC;IAEjD,IAAIO,KAAK,EAAE;MACT,IAAI,CAACH,OAAO,GAAGG,KAAK,CAAC;MAErB;IACF;IAEA,IAAI,CAACE,QAAQ,GAAGT,aAAa,CAAC;EAChC;;EAEA;AACF;AACA;AACA;AACA;EACUQ,eAAeA,CACrBR,aAA+D,EAC3C;IACpB,MAAMU,QAA8C,GAAG,CACrD,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,KAAK,EACL,IAAI,EACJ,KAAK,EACL,KAAK,EACL,IAAI,EACJ,IAAI,CACL;IAED,MAAMC,aAAa,GAAGD,QAAQ,CAACE,IAAI,CAChCC,GAAG,IAAKb,aAAa,CAACa,GAAG,CAAC,KAAKC,SAClC,CAAC;IAED,IAAI,CAACH,aAAa,EAAE;MAClB,OAAO,sDAAsD;IAC/D;IAEA,OAAOG,SAAS;EAClB;AACF","ignoreList":[]}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { MeasurementTypeKey } from "@ovok/core";
|
|
4
|
+
import { CaseType } from "../../../types/case-type.js";
|
|
5
|
+
/**
|
|
6
|
+
* Contec BC401 (a.k.a. BC01) urine analyzer — GATT profile.
|
|
7
|
+
*
|
|
8
|
+
* The BC401 uses Contec's proprietary FF12 service, shared across their consumer
|
|
9
|
+
* medical devices. A single result notification carries a 7-parameter URS-7
|
|
10
|
+
* strip readout expanded into eleven analyte values on the wire.
|
|
11
|
+
*
|
|
12
|
+
* Service 0xFF12
|
|
13
|
+
* Notify (result) 0xFF01 — CCCD 0x2902 must be written 01 00 to enable
|
|
14
|
+
* Write (command) 0xFF02 — RESET / SET_UNIT / REQUEST_HISTORY
|
|
15
|
+
*
|
|
16
|
+
* Wire layout of a result frame (Contec URS-7 firmware ≥ 1.2.x):
|
|
17
|
+
* [0..1] header "aa 55" — Contec sentinel
|
|
18
|
+
* [2] length byte after header
|
|
19
|
+
* [3] command "a1" == RESULT_URS7
|
|
20
|
+
* [4] strip type "07" == 7-panel
|
|
21
|
+
* [5..15] values one byte per analyte, encoding the discrete
|
|
22
|
+
* level index into diagnosticResults[key]
|
|
23
|
+
* [16] checksum xor over [2..15]
|
|
24
|
+
*
|
|
25
|
+
* Byte positions calibrated against PHMS 3.0.03 Android app; older firmware
|
|
26
|
+
* (< 1.2.x) uses a different command byte and is not supported by this driver
|
|
27
|
+
* (the validator will reject those frames).
|
|
28
|
+
*/
|
|
29
|
+
export const bc01MainServices = [{
|
|
30
|
+
uuid: "0000ff12-0000-1000-8000-00805f9b34fb",
|
|
31
|
+
monitorUuids: [{
|
|
32
|
+
uuid: "0000ff01-0000-1000-8000-00805f9b34fb",
|
|
33
|
+
parsingModel: {
|
|
34
|
+
caseValuePosition: [0, 1, 3, 4],
|
|
35
|
+
cases: [{
|
|
36
|
+
measurementTypeKey: MeasurementTypeKey.uricAcid,
|
|
37
|
+
caseType: CaseType.RESULT,
|
|
38
|
+
caseValue: "aa55a107",
|
|
39
|
+
parseDefinitions: [{
|
|
40
|
+
name: "uro",
|
|
41
|
+
parseType: "number",
|
|
42
|
+
byteIndexes: [5],
|
|
43
|
+
parseReference: 16
|
|
44
|
+
}, {
|
|
45
|
+
name: "bld",
|
|
46
|
+
parseType: "number",
|
|
47
|
+
byteIndexes: [6],
|
|
48
|
+
parseReference: 16
|
|
49
|
+
}, {
|
|
50
|
+
name: "bil",
|
|
51
|
+
parseType: "number",
|
|
52
|
+
byteIndexes: [7],
|
|
53
|
+
parseReference: 16
|
|
54
|
+
}, {
|
|
55
|
+
name: "ket",
|
|
56
|
+
parseType: "number",
|
|
57
|
+
byteIndexes: [8],
|
|
58
|
+
parseReference: 16
|
|
59
|
+
}, {
|
|
60
|
+
name: "glu",
|
|
61
|
+
parseType: "number",
|
|
62
|
+
byteIndexes: [9],
|
|
63
|
+
parseReference: 16
|
|
64
|
+
}, {
|
|
65
|
+
name: "pro",
|
|
66
|
+
parseType: "number",
|
|
67
|
+
byteIndexes: [10],
|
|
68
|
+
parseReference: 16
|
|
69
|
+
}, {
|
|
70
|
+
name: "ph",
|
|
71
|
+
parseType: "number",
|
|
72
|
+
byteIndexes: [11],
|
|
73
|
+
parseReference: 16
|
|
74
|
+
}, {
|
|
75
|
+
name: "nit",
|
|
76
|
+
parseType: "number",
|
|
77
|
+
byteIndexes: [12],
|
|
78
|
+
parseReference: 16
|
|
79
|
+
}, {
|
|
80
|
+
name: "leu",
|
|
81
|
+
parseType: "number",
|
|
82
|
+
byteIndexes: [13],
|
|
83
|
+
parseReference: 16
|
|
84
|
+
}, {
|
|
85
|
+
name: "sg",
|
|
86
|
+
parseType: "number",
|
|
87
|
+
byteIndexes: [14],
|
|
88
|
+
parseReference: 16
|
|
89
|
+
}, {
|
|
90
|
+
name: "vc",
|
|
91
|
+
parseType: "number",
|
|
92
|
+
byteIndexes: [15],
|
|
93
|
+
parseReference: 16
|
|
94
|
+
}]
|
|
95
|
+
}]
|
|
96
|
+
}
|
|
97
|
+
}]
|
|
98
|
+
}];
|
|
99
|
+
//# sourceMappingURL=bc01.main-services.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["MeasurementTypeKey","CaseType","bc01MainServices","uuid","monitorUuids","parsingModel","caseValuePosition","cases","measurementTypeKey","uricAcid","caseType","RESULT","caseValue","parseDefinitions","name","parseType","byteIndexes","parseReference"],"sourceRoot":"../../../../../../../src","sources":["modules/bt-management/services/devices/bc01/bc01.main-services.ts"],"mappings":";;AAAA,SAASA,kBAAkB,QAAQ,YAAY;AAE/C,SAASC,QAAQ,QAAQ,6BAA0B;AAGnD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,gBAA4B,GAAG,CAC1C;EACEC,IAAI,EAAE,sCAAsC;EAC5CC,YAAY,EAAE,CACZ;IACED,IAAI,EAAE,sCAAsC;IAC5CE,YAAY,EAAE;MACZC,iBAAiB,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;MAC/BC,KAAK,EAAE,CACL;QACEC,kBAAkB,EAAER,kBAAkB,CAACS,QAAQ;QAC/CC,QAAQ,EAAET,QAAQ,CAACU,MAAM;QACzBC,SAAS,EAAE,UAAU;QACrBC,gBAAgB,EAAE,CAChB;UACEC,IAAI,EAAE,KAAK;UACXC,SAAS,EAAE,QAAQ;UACnBC,WAAW,EAAE,CAAC,CAAC,CAAC;UAChBC,cAAc,EAAE;QAClB,CAAC,EACD;UACEH,IAAI,EAAE,KAAK;UACXC,SAAS,EAAE,QAAQ;UACnBC,WAAW,EAAE,CAAC,CAAC,CAAC;UAChBC,cAAc,EAAE;QAClB,CAAC,EACD;UACEH,IAAI,EAAE,KAAK;UACXC,SAAS,EAAE,QAAQ;UACnBC,WAAW,EAAE,CAAC,CAAC,CAAC;UAChBC,cAAc,EAAE;QAClB,CAAC,EACD;UACEH,IAAI,EAAE,KAAK;UACXC,SAAS,EAAE,QAAQ;UACnBC,WAAW,EAAE,CAAC,CAAC,CAAC;UAChBC,cAAc,EAAE;QAClB,CAAC,EACD;UACEH,IAAI,EAAE,KAAK;UACXC,SAAS,EAAE,QAAQ;UACnBC,WAAW,EAAE,CAAC,CAAC,CAAC;UAChBC,cAAc,EAAE;QAClB,CAAC,EACD;UACEH,IAAI,EAAE,KAAK;UACXC,SAAS,EAAE,QAAQ;UACnBC,WAAW,EAAE,CAAC,EAAE,CAAC;UACjBC,cAAc,EAAE;QAClB,CAAC,EACD;UACEH,IAAI,EAAE,IAAI;UACVC,SAAS,EAAE,QAAQ;UACnBC,WAAW,EAAE,CAAC,EAAE,CAAC;UACjBC,cAAc,EAAE;QAClB,CAAC,EACD;UACEH,IAAI,EAAE,KAAK;UACXC,SAAS,EAAE,QAAQ;UACnBC,WAAW,EAAE,CAAC,EAAE,CAAC;UACjBC,cAAc,EAAE;QAClB,CAAC,EACD;UACEH,IAAI,EAAE,KAAK;UACXC,SAAS,EAAE,QAAQ;UACnBC,WAAW,EAAE,CAAC,EAAE,CAAC;UACjBC,cAAc,EAAE;QAClB,CAAC,EACD;UACEH,IAAI,EAAE,IAAI;UACVC,SAAS,EAAE,QAAQ;UACnBC,WAAW,EAAE,CAAC,EAAE,CAAC;UACjBC,cAAc,EAAE;QAClB,CAAC,EACD;UACEH,IAAI,EAAE,IAAI;UACVC,SAAS,EAAE,QAAQ;UACnBC,WAAW,EAAE,CAAC,EAAE,CAAC;UACjBC,cAAc,EAAE;QAClB,CAAC;MAEL,CAAC;IAEL;EACF,CAAC;AAEL,CAAC,CACF","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["IntegratedDevices"],"sourceRoot":"../../../../../src","sources":["modules/bt-management/types/device-measurement-map.ts"],"mappings":";;
|
|
1
|
+
{"version":3,"names":["IntegratedDevices"],"sourceRoot":"../../../../../src","sources":["modules/bt-management/types/device-measurement-map.ts"],"mappings":";;AASA,SAASA,iBAAiB,QAAQ,yBAAsB","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"device-creator.d.ts","sourceRoot":"","sources":["../../../../../../../src/modules/bt-management/services/device-creator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"device-creator.d.ts","sourceRoot":"","sources":["../../../../../../../src/modules/bt-management/services/device-creator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAIhE,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAI9D,qBAAa,aAAa,CAAC,CAAC,SAAS,SAAS,iBAAiB,EAAE;IAInD,OAAO,CAAC,QAAQ,CAAC,mBAAmB;IAHhD,OAAO,CAAC,eAAe,CAA+C;IACtE,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAO;gBAET,mBAAmB,EAAE,CAAC;IAE5C,aAAa,GAAI,WAAW,MAAM,KAAG,iBAAiB,GAAG,SAAS,CAYvE;IAEK,YAAY,CAAC,CAAC,SAAS,iBAAiB,EAC7C,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAC5B,eAAe,CAAC,CAAC,CAAC;IAiCd,OAAO,aAEZ;IAEF,OAAO,CAAC,uBAAuB,CA4B7B;IAEF,OAAO,CAAC,eAAe;CAexB"}
|
package/lib/typescript/commonjs/src/modules/bt-management/services/devices/bc01/bc01.device.d.ts
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { MeasurementTypeForDevices } from "../../../types/device-measurement-map";
|
|
2
|
+
import { IntegratedDevices } from "../../../types/integrated-devices";
|
|
3
|
+
import { MeasurementWithCaseType } from "../../../types/measurement-with-case-type";
|
|
4
|
+
import { IService } from "../../../types/service.type";
|
|
5
|
+
import { BTManagedDevice } from "../bt-managed-device";
|
|
6
|
+
/**
|
|
7
|
+
* Contec BC401 (BC01) urine analyzer driver.
|
|
8
|
+
*
|
|
9
|
+
* The BC401 is a single-shot device: the patient dips a URS-7 strip, presses
|
|
10
|
+
* the button, and the device pushes exactly one result frame on 0xFF01. There
|
|
11
|
+
* is no streaming state, no per-tick updates, and no measurement session to
|
|
12
|
+
* open — the device auto-starts on button press.
|
|
13
|
+
*/
|
|
14
|
+
export declare class BC01Device extends BTManagedDevice<IntegratedDevices.BC01> {
|
|
15
|
+
protected onStreamStart: () => void;
|
|
16
|
+
protected mainServices: IService[];
|
|
17
|
+
/**
|
|
18
|
+
* 90 s covers the maximum firmware-side reagent-pad settle time on a URS-7
|
|
19
|
+
* strip. If the device does not push a result frame within that window the
|
|
20
|
+
* data-processor times out and the driver surfaces "device unreachable".
|
|
21
|
+
*/
|
|
22
|
+
protected stuckDataTimeout: number;
|
|
23
|
+
protected validatePackage: (pkg: string[]) => boolean;
|
|
24
|
+
protected handleSuccessResult(successResult: MeasurementWithCaseType<MeasurementTypeForDevices<[IntegratedDevices.BC01]>>): void | boolean;
|
|
25
|
+
private handleUrinalysisResult;
|
|
26
|
+
/**
|
|
27
|
+
* A well-formed frame with all analyte fields still undefined means the
|
|
28
|
+
* device produced an empty read — typically a strip inserted upside down or
|
|
29
|
+
* removed before the reagent-pad timer completed.
|
|
30
|
+
*/
|
|
31
|
+
private checkIfHasError;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=bc01.device.d.ts.map
|
package/lib/typescript/commonjs/src/modules/bt-management/services/devices/bc01/bc01.device.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bc01.device.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/modules/bt-management/services/devices/bc01/bc01.device.ts"],"names":[],"mappings":"AAGA,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;AAIvD;;;;;;;GAOG;AACH,qBAAa,UAAW,SAAQ,eAAe,CAAC,iBAAiB,CAAC,IAAI,CAAC;IACrE,SAAS,CAAC,aAAa,EAAE,MAAM,IAAI,CAAY;IAE/C,SAAS,CAAC,YAAY,EAAE,QAAQ,EAAE,CAAoB;IAEtD;;;;OAIG;IACH,SAAS,CAAC,gBAAgB,SAAU;IAEpC,SAAS,CAAC,eAAe,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,OAAO,CAgCnD;IAEF,SAAS,CAAC,mBAAmB,CAC3B,aAAa,EAAE,uBAAuB,CACpC,yBAAyB,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CACpD,GACA,IAAI,GAAG,OAAO;IAkBjB,OAAO,CAAC,sBAAsB;IAc9B;;;;OAIG;IACH,OAAO,CAAC,eAAe;CA2BxB"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { IService } from "../../../types/service.type";
|
|
2
|
+
/**
|
|
3
|
+
* Contec BC401 (a.k.a. BC01) urine analyzer — GATT profile.
|
|
4
|
+
*
|
|
5
|
+
* The BC401 uses Contec's proprietary FF12 service, shared across their consumer
|
|
6
|
+
* medical devices. A single result notification carries a 7-parameter URS-7
|
|
7
|
+
* strip readout expanded into eleven analyte values on the wire.
|
|
8
|
+
*
|
|
9
|
+
* Service 0xFF12
|
|
10
|
+
* Notify (result) 0xFF01 — CCCD 0x2902 must be written 01 00 to enable
|
|
11
|
+
* Write (command) 0xFF02 — RESET / SET_UNIT / REQUEST_HISTORY
|
|
12
|
+
*
|
|
13
|
+
* Wire layout of a result frame (Contec URS-7 firmware ≥ 1.2.x):
|
|
14
|
+
* [0..1] header "aa 55" — Contec sentinel
|
|
15
|
+
* [2] length byte after header
|
|
16
|
+
* [3] command "a1" == RESULT_URS7
|
|
17
|
+
* [4] strip type "07" == 7-panel
|
|
18
|
+
* [5..15] values one byte per analyte, encoding the discrete
|
|
19
|
+
* level index into diagnosticResults[key]
|
|
20
|
+
* [16] checksum xor over [2..15]
|
|
21
|
+
*
|
|
22
|
+
* Byte positions calibrated against PHMS 3.0.03 Android app; older firmware
|
|
23
|
+
* (< 1.2.x) uses a different command byte and is not supported by this driver
|
|
24
|
+
* (the validator will reject those frames).
|
|
25
|
+
*/
|
|
26
|
+
export declare const bc01MainServices: IService[];
|
|
27
|
+
//# sourceMappingURL=bc01.main-services.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bc01.main-services.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/modules/bt-management/services/devices/bc01/bc01.main-services.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAEvD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,eAAO,MAAM,gBAAgB,EAAE,QAAQ,EAuFtC,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { BloodPressureMeasurement, BodyWeightMeasurement, EcgMeasurement, PulseOximeterMeasurement } from "@ovok/core";
|
|
1
|
+
import { BloodPressureMeasurement, BodyWeightMeasurement, EcgMeasurement, PulseOximeterMeasurement, UrineAnalyzeMeasurement } from "@ovok/core";
|
|
2
2
|
import { CaseType } from "./case-type";
|
|
3
3
|
import { IntegratedDevices } from "./integrated-devices";
|
|
4
4
|
interface DeviceMeasurementMap {
|
|
@@ -12,7 +12,7 @@ interface DeviceMeasurementMap {
|
|
|
12
12
|
[IntegratedDevices.ANDESFITTEMP]: never;
|
|
13
13
|
[IntegratedDevices.FORATEMP]: never;
|
|
14
14
|
[IntegratedDevices.COSINUSS]: never;
|
|
15
|
-
[IntegratedDevices.BC01]:
|
|
15
|
+
[IntegratedDevices.BC01]: UrineAnalyzeMeasurement;
|
|
16
16
|
[IntegratedDevices.FORA_SCALE]: never;
|
|
17
17
|
[IntegratedDevices.RPM_SCALE]: never;
|
|
18
18
|
[IntegratedDevices.CLEVERTEMP]: never;
|
package/lib/typescript/commonjs/src/modules/bt-management/types/device-measurement-map.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"device-measurement-map.d.ts","sourceRoot":"","sources":["../../../../../../../src/modules/bt-management/types/device-measurement-map.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EACxB,qBAAqB,EACrB,cAAc,EACd,wBAAwB,
|
|
1
|
+
{"version":3,"file":"device-measurement-map.d.ts","sourceRoot":"","sources":["../../../../../../../src/modules/bt-management/types/device-measurement-map.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EACxB,qBAAqB,EACrB,cAAc,EACd,wBAAwB,EACxB,uBAAuB,EACxB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEzD,UAAU,oBAAoB;IAC5B,CAAC,iBAAiB,CAAC,EAAE,CAAC,EAAE,qBAAqB,CAAC;IAC9C,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,wBAAwB,GAAG,cAAc,CAAC;IACnE,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,wBAAwB,CAAC;IACnD,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC;IAClC,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAE,wBAAwB,CAAC;IACrD,CAAC,iBAAiB,CAAC,cAAc,CAAC,EAAE,KAAK,CAAC;IAC1C,CAAC,iBAAiB,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC;IACtC,CAAC,iBAAiB,CAAC,YAAY,CAAC,EAAE,KAAK,CAAC;IACxC,CAAC,iBAAiB,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC;IACpC,CAAC,iBAAiB,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC;IACpC,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,uBAAuB,CAAC;IAClD,CAAC,iBAAiB,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC;IACtC,CAAC,iBAAiB,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC;IACrC,CAAC,iBAAiB,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC;IACtC,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC;IAChC,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;IACjC,CAAC,iBAAiB,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC;IAC9B,CAAC,iBAAiB,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC;IACrC,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC;CAChC;AAED,MAAM,MAAM,yBAAyB,CAAC,CAAC,SAAS,SAAS,iBAAiB,EAAE,IAC1E;KACG,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,GAAG,oBAAoB,CAAC,CAAC,CAAC,GAAG;QAAE,QAAQ,EAAE,QAAQ,CAAA;KAAE;CACnE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"device-creator.d.ts","sourceRoot":"","sources":["../../../../../../../src/modules/bt-management/services/device-creator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;
|
|
1
|
+
{"version":3,"file":"device-creator.d.ts","sourceRoot":"","sources":["../../../../../../../src/modules/bt-management/services/device-creator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAIhE,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAI9D,qBAAa,aAAa,CAAC,CAAC,SAAS,SAAS,iBAAiB,EAAE;IAInD,OAAO,CAAC,QAAQ,CAAC,mBAAmB;IAHhD,OAAO,CAAC,eAAe,CAA+C;IACtE,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAO;gBAET,mBAAmB,EAAE,CAAC;IAE5C,aAAa,GAAI,WAAW,MAAM,KAAG,iBAAiB,GAAG,SAAS,CAYvE;IAEK,YAAY,CAAC,CAAC,SAAS,iBAAiB,EAC7C,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAC5B,eAAe,CAAC,CAAC,CAAC;IAiCd,OAAO,aAEZ;IAEF,OAAO,CAAC,uBAAuB,CA4B7B;IAEF,OAAO,CAAC,eAAe;CAexB"}
|
package/lib/typescript/module/src/modules/bt-management/services/devices/bc01/bc01.device.d.ts
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { MeasurementTypeForDevices } from "../../../types/device-measurement-map";
|
|
2
|
+
import { IntegratedDevices } from "../../../types/integrated-devices";
|
|
3
|
+
import { MeasurementWithCaseType } from "../../../types/measurement-with-case-type";
|
|
4
|
+
import { IService } from "../../../types/service.type";
|
|
5
|
+
import { BTManagedDevice } from "../bt-managed-device";
|
|
6
|
+
/**
|
|
7
|
+
* Contec BC401 (BC01) urine analyzer driver.
|
|
8
|
+
*
|
|
9
|
+
* The BC401 is a single-shot device: the patient dips a URS-7 strip, presses
|
|
10
|
+
* the button, and the device pushes exactly one result frame on 0xFF01. There
|
|
11
|
+
* is no streaming state, no per-tick updates, and no measurement session to
|
|
12
|
+
* open — the device auto-starts on button press.
|
|
13
|
+
*/
|
|
14
|
+
export declare class BC01Device extends BTManagedDevice<IntegratedDevices.BC01> {
|
|
15
|
+
protected onStreamStart: () => void;
|
|
16
|
+
protected mainServices: IService[];
|
|
17
|
+
/**
|
|
18
|
+
* 90 s covers the maximum firmware-side reagent-pad settle time on a URS-7
|
|
19
|
+
* strip. If the device does not push a result frame within that window the
|
|
20
|
+
* data-processor times out and the driver surfaces "device unreachable".
|
|
21
|
+
*/
|
|
22
|
+
protected stuckDataTimeout: number;
|
|
23
|
+
protected validatePackage: (pkg: string[]) => boolean;
|
|
24
|
+
protected handleSuccessResult(successResult: MeasurementWithCaseType<MeasurementTypeForDevices<[IntegratedDevices.BC01]>>): void | boolean;
|
|
25
|
+
private handleUrinalysisResult;
|
|
26
|
+
/**
|
|
27
|
+
* A well-formed frame with all analyte fields still undefined means the
|
|
28
|
+
* device produced an empty read — typically a strip inserted upside down or
|
|
29
|
+
* removed before the reagent-pad timer completed.
|
|
30
|
+
*/
|
|
31
|
+
private checkIfHasError;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=bc01.device.d.ts.map
|
package/lib/typescript/module/src/modules/bt-management/services/devices/bc01/bc01.device.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bc01.device.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/modules/bt-management/services/devices/bc01/bc01.device.ts"],"names":[],"mappings":"AAGA,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;AAIvD;;;;;;;GAOG;AACH,qBAAa,UAAW,SAAQ,eAAe,CAAC,iBAAiB,CAAC,IAAI,CAAC;IACrE,SAAS,CAAC,aAAa,EAAE,MAAM,IAAI,CAAY;IAE/C,SAAS,CAAC,YAAY,EAAE,QAAQ,EAAE,CAAoB;IAEtD;;;;OAIG;IACH,SAAS,CAAC,gBAAgB,SAAU;IAEpC,SAAS,CAAC,eAAe,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,OAAO,CAgCnD;IAEF,SAAS,CAAC,mBAAmB,CAC3B,aAAa,EAAE,uBAAuB,CACpC,yBAAyB,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CACpD,GACA,IAAI,GAAG,OAAO;IAkBjB,OAAO,CAAC,sBAAsB;IAc9B;;;;OAIG;IACH,OAAO,CAAC,eAAe;CA2BxB"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { IService } from "../../../types/service.type";
|
|
2
|
+
/**
|
|
3
|
+
* Contec BC401 (a.k.a. BC01) urine analyzer — GATT profile.
|
|
4
|
+
*
|
|
5
|
+
* The BC401 uses Contec's proprietary FF12 service, shared across their consumer
|
|
6
|
+
* medical devices. A single result notification carries a 7-parameter URS-7
|
|
7
|
+
* strip readout expanded into eleven analyte values on the wire.
|
|
8
|
+
*
|
|
9
|
+
* Service 0xFF12
|
|
10
|
+
* Notify (result) 0xFF01 — CCCD 0x2902 must be written 01 00 to enable
|
|
11
|
+
* Write (command) 0xFF02 — RESET / SET_UNIT / REQUEST_HISTORY
|
|
12
|
+
*
|
|
13
|
+
* Wire layout of a result frame (Contec URS-7 firmware ≥ 1.2.x):
|
|
14
|
+
* [0..1] header "aa 55" — Contec sentinel
|
|
15
|
+
* [2] length byte after header
|
|
16
|
+
* [3] command "a1" == RESULT_URS7
|
|
17
|
+
* [4] strip type "07" == 7-panel
|
|
18
|
+
* [5..15] values one byte per analyte, encoding the discrete
|
|
19
|
+
* level index into diagnosticResults[key]
|
|
20
|
+
* [16] checksum xor over [2..15]
|
|
21
|
+
*
|
|
22
|
+
* Byte positions calibrated against PHMS 3.0.03 Android app; older firmware
|
|
23
|
+
* (< 1.2.x) uses a different command byte and is not supported by this driver
|
|
24
|
+
* (the validator will reject those frames).
|
|
25
|
+
*/
|
|
26
|
+
export declare const bc01MainServices: IService[];
|
|
27
|
+
//# sourceMappingURL=bc01.main-services.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bc01.main-services.d.ts","sourceRoot":"","sources":["../../../../../../../../../src/modules/bt-management/services/devices/bc01/bc01.main-services.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAEvD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,eAAO,MAAM,gBAAgB,EAAE,QAAQ,EAuFtC,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { BloodPressureMeasurement, BodyWeightMeasurement, EcgMeasurement, PulseOximeterMeasurement } from "@ovok/core";
|
|
1
|
+
import { BloodPressureMeasurement, BodyWeightMeasurement, EcgMeasurement, PulseOximeterMeasurement, UrineAnalyzeMeasurement } from "@ovok/core";
|
|
2
2
|
import { CaseType } from "./case-type";
|
|
3
3
|
import { IntegratedDevices } from "./integrated-devices";
|
|
4
4
|
interface DeviceMeasurementMap {
|
|
@@ -12,7 +12,7 @@ interface DeviceMeasurementMap {
|
|
|
12
12
|
[IntegratedDevices.ANDESFITTEMP]: never;
|
|
13
13
|
[IntegratedDevices.FORATEMP]: never;
|
|
14
14
|
[IntegratedDevices.COSINUSS]: never;
|
|
15
|
-
[IntegratedDevices.BC01]:
|
|
15
|
+
[IntegratedDevices.BC01]: UrineAnalyzeMeasurement;
|
|
16
16
|
[IntegratedDevices.FORA_SCALE]: never;
|
|
17
17
|
[IntegratedDevices.RPM_SCALE]: never;
|
|
18
18
|
[IntegratedDevices.CLEVERTEMP]: never;
|
package/lib/typescript/module/src/modules/bt-management/types/device-measurement-map.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"device-measurement-map.d.ts","sourceRoot":"","sources":["../../../../../../../src/modules/bt-management/types/device-measurement-map.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EACxB,qBAAqB,EACrB,cAAc,EACd,wBAAwB,
|
|
1
|
+
{"version":3,"file":"device-measurement-map.d.ts","sourceRoot":"","sources":["../../../../../../../src/modules/bt-management/types/device-measurement-map.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EACxB,qBAAqB,EACrB,cAAc,EACd,wBAAwB,EACxB,uBAAuB,EACxB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEzD,UAAU,oBAAoB;IAC5B,CAAC,iBAAiB,CAAC,EAAE,CAAC,EAAE,qBAAqB,CAAC;IAC9C,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,wBAAwB,GAAG,cAAc,CAAC;IACnE,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,wBAAwB,CAAC;IACnD,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC;IAClC,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAE,wBAAwB,CAAC;IACrD,CAAC,iBAAiB,CAAC,cAAc,CAAC,EAAE,KAAK,CAAC;IAC1C,CAAC,iBAAiB,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC;IACtC,CAAC,iBAAiB,CAAC,YAAY,CAAC,EAAE,KAAK,CAAC;IACxC,CAAC,iBAAiB,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC;IACpC,CAAC,iBAAiB,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC;IACpC,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,uBAAuB,CAAC;IAClD,CAAC,iBAAiB,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC;IACtC,CAAC,iBAAiB,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC;IACrC,CAAC,iBAAiB,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC;IACtC,CAAC,iBAAiB,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC;IAChC,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC;IACjC,CAAC,iBAAiB,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC;IAC9B,CAAC,iBAAiB,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC;IACrC,CAAC,iBAAiB,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC;CAChC;AAED,MAAM,MAAM,yBAAyB,CAAC,CAAC,SAAS,SAAS,iBAAiB,EAAE,IAC1E;KACG,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,GAAG,oBAAoB,CAAC,CAAC,CAAC,GAAG;QAAE,QAAQ,EAAE,QAAQ,CAAA;KAAE;CACnE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ovok/native",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.1",
|
|
4
4
|
"description": "React native component sdk for OVOK",
|
|
5
5
|
"source": "./src/index.tsx",
|
|
6
6
|
"main": "./lib/commonjs/index.js",
|
|
@@ -69,7 +69,9 @@
|
|
|
69
69
|
"@react-native-community/datetimepicker": "^9.1.0",
|
|
70
70
|
"@react-native-community/netinfo": "^12.0.1",
|
|
71
71
|
"@react-native-google-signin/google-signin": "^16.1.2",
|
|
72
|
+
"@react-native/babel-preset": "^0.85.0",
|
|
72
73
|
"@react-native/eslint-config": "^0.73.1",
|
|
74
|
+
"@react-native/jest-preset": "^0.85.0",
|
|
73
75
|
"@release-it/conventional-changelog": "^5.0.0",
|
|
74
76
|
"@sentry/react-native": "~7.11.0",
|
|
75
77
|
"@shopify/flash-list": "2.0.2",
|
|
@@ -125,6 +127,7 @@
|
|
|
125
127
|
"react-native-render-html": "^6.3.4",
|
|
126
128
|
"react-native-safe-area-context": "5.7.0",
|
|
127
129
|
"react-native-svg": "15.15.4",
|
|
130
|
+
"react-native-worklets": "0.8.x",
|
|
128
131
|
"react-test-renderer": "19.2.3",
|
|
129
132
|
"release-it": "^19.0.6",
|
|
130
133
|
"socket.io-client": "^4.8.3",
|