@hangtime/grip-connect 0.8.6 → 0.9.0
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/README.md +7 -5
- package/dist/cjs/index.d.ts +3 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +14 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/interfaces/base.interface.d.ts +18 -0
- package/dist/cjs/interfaces/base.interface.d.ts.map +1 -0
- package/dist/cjs/interfaces/base.interface.js +3 -0
- package/dist/cjs/interfaces/base.interface.js.map +1 -0
- package/dist/cjs/interfaces/callback.interface.d.ts +56 -0
- package/dist/cjs/interfaces/callback.interface.d.ts.map +1 -0
- package/dist/cjs/interfaces/callback.interface.js +3 -0
- package/dist/cjs/interfaces/callback.interface.js.map +1 -0
- package/dist/cjs/interfaces/command.interface.d.ts +92 -0
- package/dist/cjs/interfaces/command.interface.d.ts.map +1 -0
- package/dist/cjs/interfaces/command.interface.js +3 -0
- package/dist/cjs/interfaces/command.interface.js.map +1 -0
- package/dist/cjs/interfaces/device/climbro.interface.d.ts +12 -0
- package/dist/cjs/interfaces/device/climbro.interface.d.ts.map +1 -0
- package/dist/cjs/interfaces/device/climbro.interface.js +3 -0
- package/dist/cjs/interfaces/device/climbro.interface.js.map +1 -0
- package/dist/cjs/interfaces/device/entralpi.interface.d.ts +53 -0
- package/dist/cjs/interfaces/device/entralpi.interface.d.ts.map +1 -0
- package/dist/cjs/interfaces/device/entralpi.interface.js +3 -0
- package/dist/cjs/interfaces/device/entralpi.interface.js.map +1 -0
- package/dist/cjs/interfaces/device/forceboard.interface.d.ts +64 -0
- package/dist/cjs/interfaces/device/forceboard.interface.d.ts.map +1 -0
- package/dist/cjs/interfaces/device/forceboard.interface.js +3 -0
- package/dist/cjs/interfaces/device/forceboard.interface.js.map +1 -0
- package/dist/cjs/interfaces/device/kilterboard.interface.d.ts +16 -0
- package/dist/cjs/interfaces/device/kilterboard.interface.d.ts.map +1 -0
- package/dist/cjs/interfaces/device/kilterboard.interface.js +3 -0
- package/dist/cjs/interfaces/device/kilterboard.interface.js.map +1 -0
- package/dist/cjs/interfaces/device/motherboard.interface.d.ts +54 -0
- package/dist/cjs/interfaces/device/motherboard.interface.d.ts.map +1 -0
- package/dist/cjs/interfaces/device/motherboard.interface.js +3 -0
- package/dist/cjs/interfaces/device/motherboard.interface.js.map +1 -0
- package/dist/cjs/interfaces/device/mysmartboard.interface.d.ts +7 -0
- package/dist/cjs/interfaces/device/mysmartboard.interface.d.ts.map +1 -0
- package/dist/cjs/interfaces/device/mysmartboard.interface.js +3 -0
- package/dist/cjs/interfaces/device/mysmartboard.interface.js.map +1 -0
- package/dist/cjs/interfaces/device/progressor.interface.d.ts +28 -0
- package/dist/cjs/interfaces/device/progressor.interface.d.ts.map +1 -0
- package/dist/cjs/interfaces/device/progressor.interface.js +3 -0
- package/dist/cjs/interfaces/device/progressor.interface.js.map +1 -0
- package/dist/cjs/interfaces/device/smartboard-pro.interface.d.ts +7 -0
- package/dist/cjs/interfaces/device/smartboard-pro.interface.d.ts.map +1 -0
- package/dist/cjs/interfaces/device/smartboard-pro.interface.js +3 -0
- package/dist/cjs/interfaces/device/smartboard-pro.interface.js.map +1 -0
- package/dist/cjs/interfaces/device/wh-c06.interface.d.ts +7 -0
- package/dist/cjs/interfaces/device/wh-c06.interface.d.ts.map +1 -0
- package/dist/cjs/interfaces/device/wh-c06.interface.js +3 -0
- package/dist/cjs/interfaces/device/wh-c06.interface.js.map +1 -0
- package/dist/cjs/interfaces/device.interface.d.ts +203 -0
- package/dist/cjs/interfaces/device.interface.d.ts.map +1 -0
- package/dist/cjs/interfaces/device.interface.js +3 -0
- package/dist/cjs/interfaces/device.interface.js.map +1 -0
- package/dist/cjs/interfaces/download.interface.d.ts +16 -0
- package/dist/cjs/interfaces/download.interface.d.ts.map +1 -0
- package/dist/cjs/interfaces/download.interface.js +3 -0
- package/dist/cjs/interfaces/download.interface.js.map +1 -0
- package/dist/cjs/interfaces/index.d.ts +10 -0
- package/dist/cjs/interfaces/index.d.ts.map +1 -0
- package/dist/cjs/interfaces/index.js +3 -0
- package/dist/cjs/interfaces/index.js.map +1 -0
- package/dist/cjs/models/base.model.d.ts +13 -0
- package/dist/cjs/models/base.model.d.ts.map +1 -0
- package/dist/cjs/models/base.model.js +24 -0
- package/dist/cjs/models/base.model.js.map +1 -0
- package/dist/cjs/models/device/climbro.model.d.ts +42 -0
- package/dist/cjs/models/device/climbro.model.d.ts.map +1 -0
- package/dist/cjs/models/device/climbro.model.js +149 -0
- package/dist/cjs/models/device/climbro.model.js.map +1 -0
- package/dist/cjs/models/device/entralpi.model.d.ts +64 -0
- package/dist/cjs/models/device/entralpi.model.d.ts.map +1 -0
- package/dist/cjs/models/device/entralpi.model.js +244 -0
- package/dist/cjs/models/device/entralpi.model.js.map +1 -0
- package/dist/cjs/models/device/forceboard.model.d.ts +73 -0
- package/dist/cjs/models/device/forceboard.model.d.ts.map +1 -0
- package/dist/cjs/models/device/forceboard.model.js +316 -0
- package/dist/cjs/models/device/forceboard.model.js.map +1 -0
- package/dist/cjs/models/device/kilterboard.model.d.ts +144 -0
- package/dist/cjs/models/device/kilterboard.model.d.ts.map +1 -0
- package/dist/cjs/models/device/kilterboard.model.js +291 -0
- package/dist/cjs/models/device/kilterboard.model.js.map +1 -0
- package/dist/cjs/models/device/motherboard.model.d.ts +110 -0
- package/dist/cjs/models/device/motherboard.model.d.ts.map +1 -0
- package/dist/cjs/models/device/motherboard.model.js +382 -0
- package/dist/cjs/models/device/motherboard.model.js.map +1 -0
- package/dist/cjs/models/device/mysmartboard.model.d.ts +11 -0
- package/dist/cjs/models/device/mysmartboard.model.d.ts.map +1 -0
- package/dist/cjs/models/device/mysmartboard.model.js +19 -0
- package/dist/cjs/models/device/mysmartboard.model.js.map +1 -0
- package/dist/cjs/models/device/progressor.model.d.ts +39 -0
- package/dist/cjs/models/device/progressor.model.d.ts.map +1 -0
- package/dist/cjs/models/device/progressor.model.js +220 -0
- package/dist/cjs/models/device/progressor.model.js.map +1 -0
- package/dist/cjs/models/device/smartboard-pro.model.d.ts +11 -0
- package/dist/cjs/models/device/smartboard-pro.model.d.ts.map +1 -0
- package/dist/cjs/models/device/smartboard-pro.model.js +56 -0
- package/dist/cjs/models/device/smartboard-pro.model.js.map +1 -0
- package/dist/cjs/models/device/wh-c06.model.d.ts +57 -0
- package/dist/cjs/models/device/wh-c06.model.d.ts.map +1 -0
- package/dist/cjs/models/device/wh-c06.model.js +171 -0
- package/dist/cjs/models/device/wh-c06.model.js.map +1 -0
- package/dist/cjs/models/device.model.d.ts +408 -0
- package/dist/cjs/models/device.model.d.ts.map +1 -0
- package/dist/cjs/models/device.model.js +665 -0
- package/dist/cjs/models/device.model.js.map +1 -0
- package/dist/cjs/models/index.d.ts +10 -0
- package/dist/cjs/models/index.d.ts.map +1 -0
- package/dist/cjs/models/index.js +22 -0
- package/dist/cjs/models/index.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/interfaces/base.interface.d.ts +18 -0
- package/dist/interfaces/base.interface.d.ts.map +1 -0
- package/dist/interfaces/base.interface.js +2 -0
- package/dist/interfaces/base.interface.js.map +1 -0
- package/dist/interfaces/callback.interface.d.ts +56 -0
- package/dist/interfaces/callback.interface.d.ts.map +1 -0
- package/dist/interfaces/callback.interface.js +2 -0
- package/dist/interfaces/callback.interface.js.map +1 -0
- package/dist/interfaces/command.interface.d.ts +92 -0
- package/dist/interfaces/command.interface.d.ts.map +1 -0
- package/dist/interfaces/command.interface.js +2 -0
- package/dist/interfaces/command.interface.js.map +1 -0
- package/dist/interfaces/device/climbro.interface.d.ts +12 -0
- package/dist/interfaces/device/climbro.interface.d.ts.map +1 -0
- package/dist/interfaces/device/climbro.interface.js +2 -0
- package/dist/interfaces/device/climbro.interface.js.map +1 -0
- package/dist/interfaces/device/entralpi.interface.d.ts +53 -0
- package/dist/interfaces/device/entralpi.interface.d.ts.map +1 -0
- package/dist/interfaces/device/entralpi.interface.js +2 -0
- package/dist/interfaces/device/entralpi.interface.js.map +1 -0
- package/dist/interfaces/device/forceboard.interface.d.ts +64 -0
- package/dist/interfaces/device/forceboard.interface.d.ts.map +1 -0
- package/dist/interfaces/device/forceboard.interface.js +2 -0
- package/dist/interfaces/device/forceboard.interface.js.map +1 -0
- package/dist/interfaces/device/kilterboard.interface.d.ts +16 -0
- package/dist/interfaces/device/kilterboard.interface.d.ts.map +1 -0
- package/dist/interfaces/device/kilterboard.interface.js +2 -0
- package/dist/interfaces/device/kilterboard.interface.js.map +1 -0
- package/dist/interfaces/device/motherboard.interface.d.ts +54 -0
- package/dist/interfaces/device/motherboard.interface.d.ts.map +1 -0
- package/dist/interfaces/device/motherboard.interface.js +2 -0
- package/dist/interfaces/device/motherboard.interface.js.map +1 -0
- package/dist/interfaces/device/mysmartboard.interface.d.ts +7 -0
- package/dist/interfaces/device/mysmartboard.interface.d.ts.map +1 -0
- package/dist/interfaces/device/mysmartboard.interface.js +2 -0
- package/dist/interfaces/device/mysmartboard.interface.js.map +1 -0
- package/dist/interfaces/device/progressor.interface.d.ts +28 -0
- package/dist/interfaces/device/progressor.interface.d.ts.map +1 -0
- package/dist/interfaces/device/progressor.interface.js +2 -0
- package/dist/interfaces/device/progressor.interface.js.map +1 -0
- package/dist/interfaces/device/smartboard-pro.interface.d.ts +7 -0
- package/dist/interfaces/device/smartboard-pro.interface.d.ts.map +1 -0
- package/dist/interfaces/device/smartboard-pro.interface.js +2 -0
- package/dist/interfaces/device/smartboard-pro.interface.js.map +1 -0
- package/dist/interfaces/device/wh-c06.interface.d.ts +7 -0
- package/dist/interfaces/device/wh-c06.interface.d.ts.map +1 -0
- package/dist/interfaces/device/wh-c06.interface.js +2 -0
- package/dist/interfaces/device/wh-c06.interface.js.map +1 -0
- package/dist/interfaces/device.interface.d.ts +203 -0
- package/dist/interfaces/device.interface.d.ts.map +1 -0
- package/dist/interfaces/device.interface.js +2 -0
- package/dist/interfaces/device.interface.js.map +1 -0
- package/dist/interfaces/download.interface.d.ts +16 -0
- package/dist/interfaces/download.interface.d.ts.map +1 -0
- package/dist/interfaces/download.interface.js +2 -0
- package/dist/interfaces/download.interface.js.map +1 -0
- package/dist/interfaces/index.d.ts +10 -0
- package/dist/interfaces/index.d.ts.map +1 -0
- package/dist/interfaces/index.js +2 -0
- package/dist/interfaces/index.js.map +1 -0
- package/dist/models/base.model.d.ts +13 -0
- package/dist/models/base.model.d.ts.map +1 -0
- package/dist/models/base.model.js +22 -0
- package/dist/models/base.model.js.map +1 -0
- package/dist/models/device/climbro.model.d.ts +42 -0
- package/dist/models/device/climbro.model.d.ts.map +1 -0
- package/dist/models/device/climbro.model.js +143 -0
- package/dist/models/device/climbro.model.js.map +1 -0
- package/dist/models/device/entralpi.model.d.ts +64 -0
- package/dist/models/device/entralpi.model.d.ts.map +1 -0
- package/dist/models/device/entralpi.model.js +240 -0
- package/dist/models/device/entralpi.model.js.map +1 -0
- package/dist/models/device/forceboard.model.d.ts +73 -0
- package/dist/models/device/forceboard.model.d.ts.map +1 -0
- package/dist/models/device/forceboard.model.js +312 -0
- package/dist/models/device/forceboard.model.js.map +1 -0
- package/dist/models/device/kilterboard.model.d.ts +144 -0
- package/dist/models/device/kilterboard.model.d.ts.map +1 -0
- package/dist/models/device/kilterboard.model.js +287 -0
- package/dist/models/device/kilterboard.model.js.map +1 -0
- package/dist/models/device/motherboard.model.d.ts +110 -0
- package/dist/models/device/motherboard.model.d.ts.map +1 -0
- package/dist/models/device/motherboard.model.js +378 -0
- package/dist/models/device/motherboard.model.js.map +1 -0
- package/dist/models/device/mysmartboard.model.d.ts +11 -0
- package/dist/models/device/mysmartboard.model.d.ts.map +1 -0
- package/dist/models/device/mysmartboard.model.js +15 -0
- package/dist/models/device/mysmartboard.model.js.map +1 -0
- package/dist/models/device/progressor.model.d.ts +39 -0
- package/dist/models/device/progressor.model.d.ts.map +1 -0
- package/dist/models/device/progressor.model.js +216 -0
- package/dist/models/device/progressor.model.js.map +1 -0
- package/dist/models/device/smartboard-pro.model.d.ts +11 -0
- package/dist/models/device/smartboard-pro.model.d.ts.map +1 -0
- package/dist/models/device/smartboard-pro.model.js +52 -0
- package/dist/models/device/smartboard-pro.model.js.map +1 -0
- package/dist/models/device/wh-c06.model.d.ts +57 -0
- package/dist/models/device/wh-c06.model.d.ts.map +1 -0
- package/dist/models/device/wh-c06.model.js +167 -0
- package/dist/models/device/wh-c06.model.js.map +1 -0
- package/dist/models/device.model.d.ts +408 -0
- package/dist/models/device.model.d.ts.map +1 -0
- package/dist/models/device.model.js +720 -0
- package/dist/models/device.model.js.map +1 -0
- package/dist/models/index.d.ts +10 -0
- package/dist/models/index.d.ts.map +1 -0
- package/dist/models/index.js +10 -0
- package/dist/models/index.js.map +1 -0
- package/dist/tsconfig.cjs.tsbuildinfo +1 -0
- package/package.json +5 -1
- package/src/interfaces/device/climbro.interface.ts +8 -2
- package/src/models/device/climbro.model.ts +150 -3
- package/deno.json +0 -8
- package/tsconfig.cjs.json +0 -15
- package/tsconfig.json +0 -13
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Progressor = void 0;
|
|
4
|
+
const device_model_js_1 = require("../device.model.js");
|
|
5
|
+
/**
|
|
6
|
+
* Progressor responses
|
|
7
|
+
*/
|
|
8
|
+
var ProgressorResponses;
|
|
9
|
+
(function (ProgressorResponses) {
|
|
10
|
+
/**
|
|
11
|
+
* Response received after sending a command to the device.
|
|
12
|
+
* This could include acknowledgment or specific data related to the command sent.
|
|
13
|
+
*/
|
|
14
|
+
ProgressorResponses[ProgressorResponses["COMMAND_RESPONSE"] = 0] = "COMMAND_RESPONSE";
|
|
15
|
+
/**
|
|
16
|
+
* Data representing a weight measurement from the device.
|
|
17
|
+
* Typically used for tracking load or force applied.
|
|
18
|
+
*/
|
|
19
|
+
ProgressorResponses[ProgressorResponses["WEIGHT_MEASURE"] = 1] = "WEIGHT_MEASURE";
|
|
20
|
+
/**
|
|
21
|
+
* Peak rate of force development (RFD) measurement.
|
|
22
|
+
* This measures how quickly the force is applied over time.
|
|
23
|
+
*/
|
|
24
|
+
ProgressorResponses[ProgressorResponses["PEAK_RFD_MEAS"] = 2] = "PEAK_RFD_MEAS";
|
|
25
|
+
/**
|
|
26
|
+
* Series of peak rate of force development (RFD) measurements.
|
|
27
|
+
* This could be used for analyzing force trends over multiple data points.
|
|
28
|
+
*/
|
|
29
|
+
ProgressorResponses[ProgressorResponses["PEAK_RFD_MEAS_SERIES"] = 3] = "PEAK_RFD_MEAS_SERIES";
|
|
30
|
+
/**
|
|
31
|
+
* Low battery warning from the device.
|
|
32
|
+
* Indicates that the battery level is below a critical threshold.
|
|
33
|
+
*/
|
|
34
|
+
ProgressorResponses[ProgressorResponses["LOW_BATTERY_WARNING"] = 4] = "LOW_BATTERY_WARNING";
|
|
35
|
+
})(ProgressorResponses || (ProgressorResponses = {}));
|
|
36
|
+
/**
|
|
37
|
+
* Represents a Tindeq Progressor device.
|
|
38
|
+
* {@link https://tindeq.com}
|
|
39
|
+
*/
|
|
40
|
+
class Progressor extends device_model_js_1.Device {
|
|
41
|
+
constructor() {
|
|
42
|
+
super({
|
|
43
|
+
filters: [{ namePrefix: "Progressor" }],
|
|
44
|
+
services: [
|
|
45
|
+
{
|
|
46
|
+
name: "Progressor Service",
|
|
47
|
+
id: "progressor",
|
|
48
|
+
uuid: "7e4e1701-1ea6-40c9-9dcc-13d34ffead57",
|
|
49
|
+
characteristics: [
|
|
50
|
+
{
|
|
51
|
+
name: "Notify",
|
|
52
|
+
id: "rx",
|
|
53
|
+
uuid: "7e4e1702-1ea6-40c9-9dcc-13d34ffead57",
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
name: "Write",
|
|
57
|
+
id: "tx",
|
|
58
|
+
uuid: "7e4e1703-1ea6-40c9-9dcc-13d34ffead57",
|
|
59
|
+
},
|
|
60
|
+
],
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
name: "Nordic Device Firmware Update (DFU) Service",
|
|
64
|
+
id: "dfu",
|
|
65
|
+
uuid: "0000fe59-0000-1000-8000-00805f9b34fb",
|
|
66
|
+
characteristics: [
|
|
67
|
+
{
|
|
68
|
+
name: "Buttonless DFU",
|
|
69
|
+
id: "dfu",
|
|
70
|
+
uuid: "8ec90003-f315-4f60-9fb8-838830daea50",
|
|
71
|
+
},
|
|
72
|
+
],
|
|
73
|
+
},
|
|
74
|
+
],
|
|
75
|
+
commands: {
|
|
76
|
+
TARE_SCALE: "d", // 0x64
|
|
77
|
+
START_WEIGHT_MEAS: "e", // 0x65
|
|
78
|
+
STOP_WEIGHT_MEAS: "f", // 0x66
|
|
79
|
+
START_PEAK_RFD_MEAS: "g", // 0x67
|
|
80
|
+
START_PEAK_RFD_MEAS_SERIES: "h", // 0x68
|
|
81
|
+
ADD_CALIB_POINT: "i", // 0x69
|
|
82
|
+
SAVE_CALIB: "j", // 0x6a
|
|
83
|
+
GET_FW_VERSION: "k", // 0x6b
|
|
84
|
+
GET_ERR_INFO: "l", // 0x6c
|
|
85
|
+
CLR_ERR_INFO: "m", // 0x6d
|
|
86
|
+
SLEEP: "n", // 0x6e
|
|
87
|
+
GET_BATT_VLTG: "o", // 0x6f
|
|
88
|
+
},
|
|
89
|
+
});
|
|
90
|
+
/**
|
|
91
|
+
* Retrieves battery or voltage information from the device.
|
|
92
|
+
* @returns {Promise<string | undefined>} A Promise that resolves with the battery or voltage information,
|
|
93
|
+
*/
|
|
94
|
+
this.battery = async () => {
|
|
95
|
+
let response = undefined;
|
|
96
|
+
await this.write("progressor", "tx", this.commands.GET_BATT_VLTG, 250, (data) => {
|
|
97
|
+
response = data;
|
|
98
|
+
});
|
|
99
|
+
return response;
|
|
100
|
+
};
|
|
101
|
+
/**
|
|
102
|
+
* Retrieves firmware version from the device.
|
|
103
|
+
* @returns {Promise<string>} A Promise that resolves with the firmware version,
|
|
104
|
+
*/
|
|
105
|
+
this.firmware = async () => {
|
|
106
|
+
let response = undefined;
|
|
107
|
+
await this.write("progressor", "tx", this.commands.GET_FW_VERSION, 250, (data) => {
|
|
108
|
+
response = data;
|
|
109
|
+
});
|
|
110
|
+
return response;
|
|
111
|
+
};
|
|
112
|
+
/**
|
|
113
|
+
* Handles data received from the device, processes weight measurements,
|
|
114
|
+
* and updates mass data including maximum and average values.
|
|
115
|
+
* It also handles command responses for retrieving device information.
|
|
116
|
+
*
|
|
117
|
+
* @param {DataView} value - The notification event.
|
|
118
|
+
*/
|
|
119
|
+
this.handleNotifications = (value) => {
|
|
120
|
+
if (value) {
|
|
121
|
+
// Update timestamp
|
|
122
|
+
this.updateTimestamp();
|
|
123
|
+
if (value.buffer) {
|
|
124
|
+
const receivedTime = Date.now();
|
|
125
|
+
// Read the first byte of the buffer to determine the kind of message
|
|
126
|
+
const kind = value.getInt8(0);
|
|
127
|
+
// Check if the message is a weight measurement
|
|
128
|
+
if (kind === ProgressorResponses.WEIGHT_MEASURE) {
|
|
129
|
+
// Start parsing data from the 3rd byte (index 2)
|
|
130
|
+
let offset = 2;
|
|
131
|
+
// Continue parsing while there's data left in the buffer
|
|
132
|
+
while (offset < value.byteLength) {
|
|
133
|
+
// Read a 32-bit float (4 bytes) for the weight, using little-endian
|
|
134
|
+
const weight = value.getFloat32(offset, true);
|
|
135
|
+
// Move the offset by 4 bytes
|
|
136
|
+
offset += 4;
|
|
137
|
+
// Read a 32-bit integer (4 bytes) for the seconds, using little-endian
|
|
138
|
+
const seconds = value.getInt32(offset, true);
|
|
139
|
+
// Move the offset by 4 bytes
|
|
140
|
+
offset += 4;
|
|
141
|
+
// Check if both weight and seconds are valid numbers
|
|
142
|
+
if (!isNaN(weight) && !isNaN(seconds)) {
|
|
143
|
+
// Tare correction
|
|
144
|
+
const numericData = weight - this.applyTare(weight);
|
|
145
|
+
// Add data to downloadable Array
|
|
146
|
+
this.downloadPackets.push({
|
|
147
|
+
received: receivedTime,
|
|
148
|
+
sampleNum: seconds,
|
|
149
|
+
battRaw: 0,
|
|
150
|
+
samples: [weight],
|
|
151
|
+
masses: [numericData],
|
|
152
|
+
});
|
|
153
|
+
// Check for max weight
|
|
154
|
+
this.massMax = Math.max(Number(this.massMax), Number(numericData)).toFixed(1);
|
|
155
|
+
// Update running sum and count
|
|
156
|
+
const currentMassTotal = Math.max(-1000, Number(numericData));
|
|
157
|
+
this.massTotalSum += currentMassTotal;
|
|
158
|
+
this.dataPointCount++;
|
|
159
|
+
// Calculate the average dynamically
|
|
160
|
+
this.massAverage = (this.massTotalSum / this.dataPointCount).toFixed(1);
|
|
161
|
+
// Check if device is being used
|
|
162
|
+
this.activityCheck(numericData);
|
|
163
|
+
this.notifyCallback({
|
|
164
|
+
massMax: this.massMax,
|
|
165
|
+
massAverage: this.massAverage,
|
|
166
|
+
massTotal: Math.max(-1000, numericData).toFixed(1),
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
else if (kind === ProgressorResponses.COMMAND_RESPONSE) {
|
|
172
|
+
if (!this.writeLast)
|
|
173
|
+
return;
|
|
174
|
+
let output = "";
|
|
175
|
+
if (this.writeLast === this.commands.GET_BATT_VLTG) {
|
|
176
|
+
output = new DataView(value.buffer, 2).getUint32(0, true).toString();
|
|
177
|
+
}
|
|
178
|
+
else if (this.writeLast === this.commands.GET_FW_VERSION) {
|
|
179
|
+
output = new TextDecoder().decode(new Uint8Array(value.buffer).slice(2));
|
|
180
|
+
}
|
|
181
|
+
else if (this.writeLast === this.commands.GET_ERR_INFO) {
|
|
182
|
+
output = new TextDecoder().decode(new Uint8Array(value.buffer.slice(2)));
|
|
183
|
+
}
|
|
184
|
+
this.writeCallback(output);
|
|
185
|
+
}
|
|
186
|
+
else if (kind === ProgressorResponses.LOW_BATTERY_WARNING) {
|
|
187
|
+
console.warn("⚠️ Low power detected. Please consider connecting to a power source.");
|
|
188
|
+
}
|
|
189
|
+
else {
|
|
190
|
+
throw new Error(`Unknown message kind detected: ${kind}`);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
};
|
|
195
|
+
/**
|
|
196
|
+
* Stops the data stream on the specified device.
|
|
197
|
+
* @returns {Promise<void>} A promise that resolves when the stream is stopped.
|
|
198
|
+
*/
|
|
199
|
+
this.stop = async () => {
|
|
200
|
+
await this.write("progressor", "tx", this.commands.STOP_WEIGHT_MEAS, 0);
|
|
201
|
+
};
|
|
202
|
+
/**
|
|
203
|
+
* Starts streaming data from the specified device.
|
|
204
|
+
* @param {number} [duration=0] - The duration of the stream in milliseconds. If set to 0, stream will continue indefinitely.
|
|
205
|
+
* @returns {Promise<void>} A promise that resolves when the streaming operation is completed.
|
|
206
|
+
*/
|
|
207
|
+
this.stream = async (duration = 0) => {
|
|
208
|
+
// Reset download packets
|
|
209
|
+
this.downloadPackets.length = 0;
|
|
210
|
+
// Start streaming data
|
|
211
|
+
await this.write("progressor", "tx", this.commands.START_WEIGHT_MEAS, duration);
|
|
212
|
+
// Stop streaming if duration is set
|
|
213
|
+
if (duration !== 0) {
|
|
214
|
+
await this.stop();
|
|
215
|
+
}
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
exports.Progressor = Progressor;
|
|
220
|
+
//# sourceMappingURL=progressor.model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progressor.model.js","sourceRoot":"","sources":["../../../../src/models/device/progressor.model.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Device } from "../device.model.js";
|
|
2
|
+
import type { ISmartBoardPro } from "../../interfaces/device/smartboard-pro.interface.js";
|
|
3
|
+
/**
|
|
4
|
+
* Represents a Smartboard Climbing SmartBoard Pro device.
|
|
5
|
+
* TODO: Figure out services, do you own a SmartBoard Pro? Help us!
|
|
6
|
+
* {@link https://www.smartboard-climbing.com}
|
|
7
|
+
*/
|
|
8
|
+
export declare class SmartBoardPro extends Device implements ISmartBoardPro {
|
|
9
|
+
constructor();
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=smartboard-pro.model.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"smartboard-pro.model.d.ts","sourceRoot":"","sources":["../../../../src/models/device/smartboard-pro.model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAC3C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qDAAqD,CAAA;AAEzF;;;;GAIG;AACH,qBAAa,aAAc,SAAQ,MAAO,YAAW,cAAc;;CA4ClE"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SmartBoardPro = void 0;
|
|
4
|
+
const device_model_js_1 = require("../device.model.js");
|
|
5
|
+
/**
|
|
6
|
+
* Represents a Smartboard Climbing SmartBoard Pro device.
|
|
7
|
+
* TODO: Figure out services, do you own a SmartBoard Pro? Help us!
|
|
8
|
+
* {@link https://www.smartboard-climbing.com}
|
|
9
|
+
*/
|
|
10
|
+
class SmartBoardPro extends device_model_js_1.Device {
|
|
11
|
+
constructor() {
|
|
12
|
+
super({
|
|
13
|
+
filters: [{ name: "SMARTBOARD" }],
|
|
14
|
+
services: [
|
|
15
|
+
{
|
|
16
|
+
name: "Basic Audio Announcement",
|
|
17
|
+
id: "audio",
|
|
18
|
+
uuid: "00001851-0000-1000-8000-00805f9b34fb",
|
|
19
|
+
characteristics: [
|
|
20
|
+
{
|
|
21
|
+
name: "",
|
|
22
|
+
id: "",
|
|
23
|
+
uuid: "0000937d-0000-1000-8000-00805f9b34fb",
|
|
24
|
+
},
|
|
25
|
+
],
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
name: "Read + Notify",
|
|
29
|
+
id: "",
|
|
30
|
+
uuid: "0000403d-0000-1000-8000-00805f9b34fb",
|
|
31
|
+
characteristics: [
|
|
32
|
+
{
|
|
33
|
+
name: "",
|
|
34
|
+
id: "",
|
|
35
|
+
uuid: "00001583-0000-1000-8000-00805f9b34fb",
|
|
36
|
+
},
|
|
37
|
+
],
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
name: "Generic Attribute",
|
|
41
|
+
id: "attribute",
|
|
42
|
+
uuid: "00001801-0000-1000-8000-00805f9b34fb",
|
|
43
|
+
characteristics: [
|
|
44
|
+
{
|
|
45
|
+
name: "Service Changed",
|
|
46
|
+
id: "service",
|
|
47
|
+
uuid: "00002a05-0000-1000-8000-00805f9b34fb",
|
|
48
|
+
},
|
|
49
|
+
],
|
|
50
|
+
},
|
|
51
|
+
],
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
exports.SmartBoardPro = SmartBoardPro;
|
|
56
|
+
//# sourceMappingURL=smartboard-pro.model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"smartboard-pro.model.js","sourceRoot":"","sources":["../../../../src/models/device/smartboard-pro.model.ts"],"names":[],"mappings":";;;AAAA,wDAA2C;AAG3C;;;;GAIG;AACH,MAAa,aAAc,SAAQ,wBAAM;IACvC;QACE,KAAK,CAAC;YACJ,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;YACjC,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,0BAA0B;oBAChC,EAAE,EAAE,OAAO;oBACX,IAAI,EAAE,sCAAsC;oBAC5C,eAAe,EAAE;wBACf;4BACE,IAAI,EAAE,EAAE;4BACR,EAAE,EAAE,EAAE;4BACN,IAAI,EAAE,sCAAsC;yBAC7C;qBACF;iBACF;gBACD;oBACE,IAAI,EAAE,eAAe;oBACrB,EAAE,EAAE,EAAE;oBACN,IAAI,EAAE,sCAAsC;oBAC5C,eAAe,EAAE;wBACf;4BACE,IAAI,EAAE,EAAE;4BACR,EAAE,EAAE,EAAE;4BACN,IAAI,EAAE,sCAAsC;yBAC7C;qBACF;iBACF;gBACD;oBACE,IAAI,EAAE,mBAAmB;oBACzB,EAAE,EAAE,WAAW;oBACf,IAAI,EAAE,sCAAsC;oBAC5C,eAAe,EAAE;wBACf;4BACE,IAAI,EAAE,iBAAiB;4BACvB,EAAE,EAAE,SAAS;4BACb,IAAI,EAAE,sCAAsC;yBAC7C;qBACF;iBACF;aACF;SACF,CAAC,CAAA;IACJ,CAAC;CACF;AA5CD,sCA4CC"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { Device } from "../device.model.js";
|
|
2
|
+
import type { IWHC06 } from "../../interfaces/device/wh-c06.interface.js";
|
|
3
|
+
/**
|
|
4
|
+
* Represents a Weiheng - WH-C06 (or MAT Muscle Meter) device.
|
|
5
|
+
* To use this device enable: `chrome://flags/#enable-experimental-web-platform-features`.
|
|
6
|
+
* {@link https://googlechrome.github.io/samples/web-bluetooth/scan.html| Web Bluetooth}
|
|
7
|
+
* {@link https://weihengmanufacturer.com}
|
|
8
|
+
*/
|
|
9
|
+
export declare class WHC06 extends Device implements IWHC06 {
|
|
10
|
+
/**
|
|
11
|
+
* Offset for the byte location in the manufacturer data to extract the weight.
|
|
12
|
+
* @type {number}
|
|
13
|
+
* @static
|
|
14
|
+
* @readonly
|
|
15
|
+
* @constant
|
|
16
|
+
*/
|
|
17
|
+
private static readonly weightOffset;
|
|
18
|
+
/**
|
|
19
|
+
* Company identifier for WH-C06, also used by 'TomTom International BV': https://www.bluetooth.com/specifications/assigned-numbers/
|
|
20
|
+
* @type {number}
|
|
21
|
+
* @static
|
|
22
|
+
* @readonly
|
|
23
|
+
* @constant
|
|
24
|
+
*/
|
|
25
|
+
private static readonly manufacturerId;
|
|
26
|
+
/**
|
|
27
|
+
* To track disconnection timeout.
|
|
28
|
+
* @type {number|null}
|
|
29
|
+
* @private
|
|
30
|
+
*/
|
|
31
|
+
private advertisementTimeout;
|
|
32
|
+
/**
|
|
33
|
+
* The limit in seconds when timeout is triggered
|
|
34
|
+
* @type {number}
|
|
35
|
+
* @private
|
|
36
|
+
* @readonly
|
|
37
|
+
*/
|
|
38
|
+
private readonly advertisementTimeoutTime;
|
|
39
|
+
constructor();
|
|
40
|
+
/**
|
|
41
|
+
* Connects to a Bluetooth device.
|
|
42
|
+
* @param {Function} [onSuccess] - Optional callback function to execute on successful connection. Default logs success.
|
|
43
|
+
* @param {Function} [onError] - Optional callback function to execute on error. Default logs the error.
|
|
44
|
+
*/
|
|
45
|
+
connect: (onSuccess?: () => void, onError?: (error: Error) => void) => Promise<void>;
|
|
46
|
+
/**
|
|
47
|
+
* Custom check if a Bluetooth device is connected.
|
|
48
|
+
* For the WH-C06 device, the `gatt.connected` property remains `false` even after the device is connected.
|
|
49
|
+
* @returns {boolean} A boolean indicating whether the device is connected.
|
|
50
|
+
*/
|
|
51
|
+
isConnected: () => boolean;
|
|
52
|
+
/**
|
|
53
|
+
* Resets the timeout that checks if the device is still advertising.
|
|
54
|
+
*/
|
|
55
|
+
private resetAdvertisementTimeout;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=wh-c06.model.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wh-c06.model.d.ts","sourceRoot":"","sources":["../../../../src/models/device/wh-c06.model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAC3C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,6CAA6C,CAAA;AAEzE;;;;;GAKG;AACH,qBAAa,KAAM,SAAQ,MAAO,YAAW,MAAM;IACjD;;;;;;OAMG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAa;IAEjD;;;;;;OAMG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAc;IAEpD;;;;OAIG;IACH,OAAO,CAAC,oBAAoB,CAA6C;IAEzE;;;;;OAKG;IACH,OAAO,CAAC,QAAQ,CAAC,wBAAwB,CAAa;;IA0BtD;;;;OAIG;IACM,OAAO,GACd,YAAW,MAAM,IAAkD,EACnE,UAAS,CAAC,KAAK,EAAE,KAAK,KAAK,IAAsC,KAChE,OAAO,CAAC,IAAI,CAAC,CAqFf;IAED;;;;OAIG;IACM,WAAW,QAAO,OAAO,CAEjC;IAED;;OAEG;IACH,OAAO,CAAC,yBAAyB,CAkBhC;CACF"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WHC06 = void 0;
|
|
4
|
+
const device_model_js_1 = require("../device.model.js");
|
|
5
|
+
/**
|
|
6
|
+
* Represents a Weiheng - WH-C06 (or MAT Muscle Meter) device.
|
|
7
|
+
* To use this device enable: `chrome://flags/#enable-experimental-web-platform-features`.
|
|
8
|
+
* {@link https://googlechrome.github.io/samples/web-bluetooth/scan.html| Web Bluetooth}
|
|
9
|
+
* {@link https://weihengmanufacturer.com}
|
|
10
|
+
*/
|
|
11
|
+
class WHC06 extends device_model_js_1.Device {
|
|
12
|
+
// /**
|
|
13
|
+
// * Offset for the byte location in the manufacturer data to determine weight stability.
|
|
14
|
+
// * @type {number}
|
|
15
|
+
// * @static
|
|
16
|
+
// * @readonly
|
|
17
|
+
// * @constant
|
|
18
|
+
// */
|
|
19
|
+
// private static readonly stableOffset: number = 14
|
|
20
|
+
constructor() {
|
|
21
|
+
super({
|
|
22
|
+
filters: [
|
|
23
|
+
{
|
|
24
|
+
// name: "IF_B7",
|
|
25
|
+
manufacturerData: [
|
|
26
|
+
{
|
|
27
|
+
companyIdentifier: 0x0100, // 256
|
|
28
|
+
},
|
|
29
|
+
],
|
|
30
|
+
},
|
|
31
|
+
],
|
|
32
|
+
services: [],
|
|
33
|
+
});
|
|
34
|
+
/**
|
|
35
|
+
* To track disconnection timeout.
|
|
36
|
+
* @type {number|null}
|
|
37
|
+
* @private
|
|
38
|
+
*/
|
|
39
|
+
this.advertisementTimeout = null;
|
|
40
|
+
/**
|
|
41
|
+
* The limit in seconds when timeout is triggered
|
|
42
|
+
* @type {number}
|
|
43
|
+
* @private
|
|
44
|
+
* @readonly
|
|
45
|
+
*/
|
|
46
|
+
this.advertisementTimeoutTime = 10;
|
|
47
|
+
/**
|
|
48
|
+
* Connects to a Bluetooth device.
|
|
49
|
+
* @param {Function} [onSuccess] - Optional callback function to execute on successful connection. Default logs success.
|
|
50
|
+
* @param {Function} [onError] - Optional callback function to execute on error. Default logs the error.
|
|
51
|
+
*/
|
|
52
|
+
this.connect = async (onSuccess = () => console.log("Connected successfully"), onError = (error) => console.error(error)) => {
|
|
53
|
+
try {
|
|
54
|
+
// Only data matching the optionalManufacturerData parameter to requestDevice is included in the advertisement event: https://github.com/WebBluetoothCG/web-bluetooth/issues/598
|
|
55
|
+
const optionalManufacturerData = this.filters.flatMap((filter) => { var _a; return ((_a = filter.manufacturerData) === null || _a === void 0 ? void 0 : _a.map((data) => data.companyIdentifier)) || []; });
|
|
56
|
+
const bluetooth = await this.getBluetooth();
|
|
57
|
+
this.bluetooth = await bluetooth.requestDevice({
|
|
58
|
+
filters: this.filters,
|
|
59
|
+
optionalManufacturerData,
|
|
60
|
+
});
|
|
61
|
+
if (!this.bluetooth.gatt) {
|
|
62
|
+
throw new Error("GATT is not available on this device");
|
|
63
|
+
}
|
|
64
|
+
// Update timestamp
|
|
65
|
+
this.updateTimestamp();
|
|
66
|
+
// Device has no services / characteristics, so we directly call onSuccess
|
|
67
|
+
onSuccess();
|
|
68
|
+
this.bluetooth.addEventListener("advertisementreceived", (event) => {
|
|
69
|
+
const data = event.manufacturerData.get(WHC06.manufacturerId);
|
|
70
|
+
if (data) {
|
|
71
|
+
// Handle recieved data
|
|
72
|
+
const weight = (data.getUint8(WHC06.weightOffset) << 8) | data.getUint8(WHC06.weightOffset + 1);
|
|
73
|
+
// const stable = (data.getUint8(STABLE_OFFSET) & 0xf0) >> 4
|
|
74
|
+
// const unit = data.getUint8(STABLE_OFFSET) & 0x0f
|
|
75
|
+
const receivedTime = Date.now();
|
|
76
|
+
const receivedData = weight / 100;
|
|
77
|
+
const numericData = receivedData - this.applyTare(receivedData) * -1;
|
|
78
|
+
// Add data to downloadable Array
|
|
79
|
+
this.downloadPackets.push({
|
|
80
|
+
received: receivedTime,
|
|
81
|
+
sampleNum: this.dataPointCount,
|
|
82
|
+
battRaw: 0,
|
|
83
|
+
samples: [numericData],
|
|
84
|
+
masses: [numericData],
|
|
85
|
+
});
|
|
86
|
+
// Update massMax
|
|
87
|
+
this.massMax = Math.max(Number(this.massMax), numericData).toFixed(1);
|
|
88
|
+
// Update running sum and count
|
|
89
|
+
const currentMassTotal = Math.max(-1000, numericData);
|
|
90
|
+
this.massTotalSum += currentMassTotal;
|
|
91
|
+
this.dataPointCount++;
|
|
92
|
+
// Calculate the average dynamically
|
|
93
|
+
this.massAverage = (this.massTotalSum / this.dataPointCount).toFixed(1);
|
|
94
|
+
// Check if device is being used
|
|
95
|
+
this.activityCheck(numericData);
|
|
96
|
+
// Notify with weight data
|
|
97
|
+
this.notifyCallback({
|
|
98
|
+
massMax: this.massMax,
|
|
99
|
+
massAverage: this.massAverage,
|
|
100
|
+
massTotal: Math.max(-1000, numericData).toFixed(1),
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
// Reset "still advertising" counter
|
|
104
|
+
this.resetAdvertisementTimeout();
|
|
105
|
+
});
|
|
106
|
+
// When the companyIdentifier is provided we want to get manufacturerData using watchAdvertisements.
|
|
107
|
+
if (optionalManufacturerData.length) {
|
|
108
|
+
// Receive events when the system receives an advertisement packet from a watched device.
|
|
109
|
+
// To use this function in Chrome: chrome://flags/#enable-experimental-web-platform-features has to be enabled.
|
|
110
|
+
// More info: https://chromestatus.com/feature/5180688812736512
|
|
111
|
+
if (typeof this.bluetooth.watchAdvertisements === "function") {
|
|
112
|
+
await this.bluetooth.watchAdvertisements();
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
throw new Error("watchAdvertisements isn't supported. For Chrome, enable it at chrome://flags/#enable-experimental-web-platform-features.");
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
onError(error);
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
/**
|
|
124
|
+
* Custom check if a Bluetooth device is connected.
|
|
125
|
+
* For the WH-C06 device, the `gatt.connected` property remains `false` even after the device is connected.
|
|
126
|
+
* @returns {boolean} A boolean indicating whether the device is connected.
|
|
127
|
+
*/
|
|
128
|
+
this.isConnected = () => {
|
|
129
|
+
return !!this.bluetooth;
|
|
130
|
+
};
|
|
131
|
+
/**
|
|
132
|
+
* Resets the timeout that checks if the device is still advertising.
|
|
133
|
+
*/
|
|
134
|
+
this.resetAdvertisementTimeout = () => {
|
|
135
|
+
// Clear the previous timeout
|
|
136
|
+
if (this.advertisementTimeout) {
|
|
137
|
+
clearTimeout(this.advertisementTimeout);
|
|
138
|
+
}
|
|
139
|
+
// Set a new timeout to stop tracking if no advertisement is received
|
|
140
|
+
this.advertisementTimeout = globalThis.setTimeout(() => {
|
|
141
|
+
// Mimic a disconnect
|
|
142
|
+
const disconnectedEvent = new Event("gattserverdisconnected");
|
|
143
|
+
Object.defineProperty(disconnectedEvent, "target", {
|
|
144
|
+
value: this.bluetooth,
|
|
145
|
+
writable: false,
|
|
146
|
+
});
|
|
147
|
+
// Print error to the console
|
|
148
|
+
console.error(`No advertisement received for ${this.advertisementTimeoutTime} seconds, stopping tracking..`);
|
|
149
|
+
this.onDisconnected(disconnectedEvent);
|
|
150
|
+
}, this.advertisementTimeoutTime * 1000); // 10 seconds
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
exports.WHC06 = WHC06;
|
|
155
|
+
/**
|
|
156
|
+
* Offset for the byte location in the manufacturer data to extract the weight.
|
|
157
|
+
* @type {number}
|
|
158
|
+
* @static
|
|
159
|
+
* @readonly
|
|
160
|
+
* @constant
|
|
161
|
+
*/
|
|
162
|
+
WHC06.weightOffset = 10;
|
|
163
|
+
/**
|
|
164
|
+
* Company identifier for WH-C06, also used by 'TomTom International BV': https://www.bluetooth.com/specifications/assigned-numbers/
|
|
165
|
+
* @type {number}
|
|
166
|
+
* @static
|
|
167
|
+
* @readonly
|
|
168
|
+
* @constant
|
|
169
|
+
*/
|
|
170
|
+
WHC06.manufacturerId = 256;
|
|
171
|
+
//# sourceMappingURL=wh-c06.model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wh-c06.model.js","sourceRoot":"","sources":["../../../../src/models/device/wh-c06.model.ts"],"names":[],"mappings":"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"}
|