@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.
Files changed (232) hide show
  1. package/README.md +7 -5
  2. package/dist/cjs/index.d.ts +3 -0
  3. package/dist/cjs/index.d.ts.map +1 -0
  4. package/dist/cjs/index.js +14 -0
  5. package/dist/cjs/index.js.map +1 -0
  6. package/dist/cjs/interfaces/base.interface.d.ts +18 -0
  7. package/dist/cjs/interfaces/base.interface.d.ts.map +1 -0
  8. package/dist/cjs/interfaces/base.interface.js +3 -0
  9. package/dist/cjs/interfaces/base.interface.js.map +1 -0
  10. package/dist/cjs/interfaces/callback.interface.d.ts +56 -0
  11. package/dist/cjs/interfaces/callback.interface.d.ts.map +1 -0
  12. package/dist/cjs/interfaces/callback.interface.js +3 -0
  13. package/dist/cjs/interfaces/callback.interface.js.map +1 -0
  14. package/dist/cjs/interfaces/command.interface.d.ts +92 -0
  15. package/dist/cjs/interfaces/command.interface.d.ts.map +1 -0
  16. package/dist/cjs/interfaces/command.interface.js +3 -0
  17. package/dist/cjs/interfaces/command.interface.js.map +1 -0
  18. package/dist/cjs/interfaces/device/climbro.interface.d.ts +12 -0
  19. package/dist/cjs/interfaces/device/climbro.interface.d.ts.map +1 -0
  20. package/dist/cjs/interfaces/device/climbro.interface.js +3 -0
  21. package/dist/cjs/interfaces/device/climbro.interface.js.map +1 -0
  22. package/dist/cjs/interfaces/device/entralpi.interface.d.ts +53 -0
  23. package/dist/cjs/interfaces/device/entralpi.interface.d.ts.map +1 -0
  24. package/dist/cjs/interfaces/device/entralpi.interface.js +3 -0
  25. package/dist/cjs/interfaces/device/entralpi.interface.js.map +1 -0
  26. package/dist/cjs/interfaces/device/forceboard.interface.d.ts +64 -0
  27. package/dist/cjs/interfaces/device/forceboard.interface.d.ts.map +1 -0
  28. package/dist/cjs/interfaces/device/forceboard.interface.js +3 -0
  29. package/dist/cjs/interfaces/device/forceboard.interface.js.map +1 -0
  30. package/dist/cjs/interfaces/device/kilterboard.interface.d.ts +16 -0
  31. package/dist/cjs/interfaces/device/kilterboard.interface.d.ts.map +1 -0
  32. package/dist/cjs/interfaces/device/kilterboard.interface.js +3 -0
  33. package/dist/cjs/interfaces/device/kilterboard.interface.js.map +1 -0
  34. package/dist/cjs/interfaces/device/motherboard.interface.d.ts +54 -0
  35. package/dist/cjs/interfaces/device/motherboard.interface.d.ts.map +1 -0
  36. package/dist/cjs/interfaces/device/motherboard.interface.js +3 -0
  37. package/dist/cjs/interfaces/device/motherboard.interface.js.map +1 -0
  38. package/dist/cjs/interfaces/device/mysmartboard.interface.d.ts +7 -0
  39. package/dist/cjs/interfaces/device/mysmartboard.interface.d.ts.map +1 -0
  40. package/dist/cjs/interfaces/device/mysmartboard.interface.js +3 -0
  41. package/dist/cjs/interfaces/device/mysmartboard.interface.js.map +1 -0
  42. package/dist/cjs/interfaces/device/progressor.interface.d.ts +28 -0
  43. package/dist/cjs/interfaces/device/progressor.interface.d.ts.map +1 -0
  44. package/dist/cjs/interfaces/device/progressor.interface.js +3 -0
  45. package/dist/cjs/interfaces/device/progressor.interface.js.map +1 -0
  46. package/dist/cjs/interfaces/device/smartboard-pro.interface.d.ts +7 -0
  47. package/dist/cjs/interfaces/device/smartboard-pro.interface.d.ts.map +1 -0
  48. package/dist/cjs/interfaces/device/smartboard-pro.interface.js +3 -0
  49. package/dist/cjs/interfaces/device/smartboard-pro.interface.js.map +1 -0
  50. package/dist/cjs/interfaces/device/wh-c06.interface.d.ts +7 -0
  51. package/dist/cjs/interfaces/device/wh-c06.interface.d.ts.map +1 -0
  52. package/dist/cjs/interfaces/device/wh-c06.interface.js +3 -0
  53. package/dist/cjs/interfaces/device/wh-c06.interface.js.map +1 -0
  54. package/dist/cjs/interfaces/device.interface.d.ts +203 -0
  55. package/dist/cjs/interfaces/device.interface.d.ts.map +1 -0
  56. package/dist/cjs/interfaces/device.interface.js +3 -0
  57. package/dist/cjs/interfaces/device.interface.js.map +1 -0
  58. package/dist/cjs/interfaces/download.interface.d.ts +16 -0
  59. package/dist/cjs/interfaces/download.interface.d.ts.map +1 -0
  60. package/dist/cjs/interfaces/download.interface.js +3 -0
  61. package/dist/cjs/interfaces/download.interface.js.map +1 -0
  62. package/dist/cjs/interfaces/index.d.ts +10 -0
  63. package/dist/cjs/interfaces/index.d.ts.map +1 -0
  64. package/dist/cjs/interfaces/index.js +3 -0
  65. package/dist/cjs/interfaces/index.js.map +1 -0
  66. package/dist/cjs/models/base.model.d.ts +13 -0
  67. package/dist/cjs/models/base.model.d.ts.map +1 -0
  68. package/dist/cjs/models/base.model.js +24 -0
  69. package/dist/cjs/models/base.model.js.map +1 -0
  70. package/dist/cjs/models/device/climbro.model.d.ts +42 -0
  71. package/dist/cjs/models/device/climbro.model.d.ts.map +1 -0
  72. package/dist/cjs/models/device/climbro.model.js +149 -0
  73. package/dist/cjs/models/device/climbro.model.js.map +1 -0
  74. package/dist/cjs/models/device/entralpi.model.d.ts +64 -0
  75. package/dist/cjs/models/device/entralpi.model.d.ts.map +1 -0
  76. package/dist/cjs/models/device/entralpi.model.js +244 -0
  77. package/dist/cjs/models/device/entralpi.model.js.map +1 -0
  78. package/dist/cjs/models/device/forceboard.model.d.ts +73 -0
  79. package/dist/cjs/models/device/forceboard.model.d.ts.map +1 -0
  80. package/dist/cjs/models/device/forceboard.model.js +316 -0
  81. package/dist/cjs/models/device/forceboard.model.js.map +1 -0
  82. package/dist/cjs/models/device/kilterboard.model.d.ts +144 -0
  83. package/dist/cjs/models/device/kilterboard.model.d.ts.map +1 -0
  84. package/dist/cjs/models/device/kilterboard.model.js +291 -0
  85. package/dist/cjs/models/device/kilterboard.model.js.map +1 -0
  86. package/dist/cjs/models/device/motherboard.model.d.ts +110 -0
  87. package/dist/cjs/models/device/motherboard.model.d.ts.map +1 -0
  88. package/dist/cjs/models/device/motherboard.model.js +382 -0
  89. package/dist/cjs/models/device/motherboard.model.js.map +1 -0
  90. package/dist/cjs/models/device/mysmartboard.model.d.ts +11 -0
  91. package/dist/cjs/models/device/mysmartboard.model.d.ts.map +1 -0
  92. package/dist/cjs/models/device/mysmartboard.model.js +19 -0
  93. package/dist/cjs/models/device/mysmartboard.model.js.map +1 -0
  94. package/dist/cjs/models/device/progressor.model.d.ts +39 -0
  95. package/dist/cjs/models/device/progressor.model.d.ts.map +1 -0
  96. package/dist/cjs/models/device/progressor.model.js +220 -0
  97. package/dist/cjs/models/device/progressor.model.js.map +1 -0
  98. package/dist/cjs/models/device/smartboard-pro.model.d.ts +11 -0
  99. package/dist/cjs/models/device/smartboard-pro.model.d.ts.map +1 -0
  100. package/dist/cjs/models/device/smartboard-pro.model.js +56 -0
  101. package/dist/cjs/models/device/smartboard-pro.model.js.map +1 -0
  102. package/dist/cjs/models/device/wh-c06.model.d.ts +57 -0
  103. package/dist/cjs/models/device/wh-c06.model.d.ts.map +1 -0
  104. package/dist/cjs/models/device/wh-c06.model.js +171 -0
  105. package/dist/cjs/models/device/wh-c06.model.js.map +1 -0
  106. package/dist/cjs/models/device.model.d.ts +408 -0
  107. package/dist/cjs/models/device.model.d.ts.map +1 -0
  108. package/dist/cjs/models/device.model.js +665 -0
  109. package/dist/cjs/models/device.model.js.map +1 -0
  110. package/dist/cjs/models/index.d.ts +10 -0
  111. package/dist/cjs/models/index.d.ts.map +1 -0
  112. package/dist/cjs/models/index.js +22 -0
  113. package/dist/cjs/models/index.js.map +1 -0
  114. package/dist/index.d.ts +3 -0
  115. package/dist/index.d.ts.map +1 -0
  116. package/dist/index.js +2 -0
  117. package/dist/index.js.map +1 -0
  118. package/dist/interfaces/base.interface.d.ts +18 -0
  119. package/dist/interfaces/base.interface.d.ts.map +1 -0
  120. package/dist/interfaces/base.interface.js +2 -0
  121. package/dist/interfaces/base.interface.js.map +1 -0
  122. package/dist/interfaces/callback.interface.d.ts +56 -0
  123. package/dist/interfaces/callback.interface.d.ts.map +1 -0
  124. package/dist/interfaces/callback.interface.js +2 -0
  125. package/dist/interfaces/callback.interface.js.map +1 -0
  126. package/dist/interfaces/command.interface.d.ts +92 -0
  127. package/dist/interfaces/command.interface.d.ts.map +1 -0
  128. package/dist/interfaces/command.interface.js +2 -0
  129. package/dist/interfaces/command.interface.js.map +1 -0
  130. package/dist/interfaces/device/climbro.interface.d.ts +12 -0
  131. package/dist/interfaces/device/climbro.interface.d.ts.map +1 -0
  132. package/dist/interfaces/device/climbro.interface.js +2 -0
  133. package/dist/interfaces/device/climbro.interface.js.map +1 -0
  134. package/dist/interfaces/device/entralpi.interface.d.ts +53 -0
  135. package/dist/interfaces/device/entralpi.interface.d.ts.map +1 -0
  136. package/dist/interfaces/device/entralpi.interface.js +2 -0
  137. package/dist/interfaces/device/entralpi.interface.js.map +1 -0
  138. package/dist/interfaces/device/forceboard.interface.d.ts +64 -0
  139. package/dist/interfaces/device/forceboard.interface.d.ts.map +1 -0
  140. package/dist/interfaces/device/forceboard.interface.js +2 -0
  141. package/dist/interfaces/device/forceboard.interface.js.map +1 -0
  142. package/dist/interfaces/device/kilterboard.interface.d.ts +16 -0
  143. package/dist/interfaces/device/kilterboard.interface.d.ts.map +1 -0
  144. package/dist/interfaces/device/kilterboard.interface.js +2 -0
  145. package/dist/interfaces/device/kilterboard.interface.js.map +1 -0
  146. package/dist/interfaces/device/motherboard.interface.d.ts +54 -0
  147. package/dist/interfaces/device/motherboard.interface.d.ts.map +1 -0
  148. package/dist/interfaces/device/motherboard.interface.js +2 -0
  149. package/dist/interfaces/device/motherboard.interface.js.map +1 -0
  150. package/dist/interfaces/device/mysmartboard.interface.d.ts +7 -0
  151. package/dist/interfaces/device/mysmartboard.interface.d.ts.map +1 -0
  152. package/dist/interfaces/device/mysmartboard.interface.js +2 -0
  153. package/dist/interfaces/device/mysmartboard.interface.js.map +1 -0
  154. package/dist/interfaces/device/progressor.interface.d.ts +28 -0
  155. package/dist/interfaces/device/progressor.interface.d.ts.map +1 -0
  156. package/dist/interfaces/device/progressor.interface.js +2 -0
  157. package/dist/interfaces/device/progressor.interface.js.map +1 -0
  158. package/dist/interfaces/device/smartboard-pro.interface.d.ts +7 -0
  159. package/dist/interfaces/device/smartboard-pro.interface.d.ts.map +1 -0
  160. package/dist/interfaces/device/smartboard-pro.interface.js +2 -0
  161. package/dist/interfaces/device/smartboard-pro.interface.js.map +1 -0
  162. package/dist/interfaces/device/wh-c06.interface.d.ts +7 -0
  163. package/dist/interfaces/device/wh-c06.interface.d.ts.map +1 -0
  164. package/dist/interfaces/device/wh-c06.interface.js +2 -0
  165. package/dist/interfaces/device/wh-c06.interface.js.map +1 -0
  166. package/dist/interfaces/device.interface.d.ts +203 -0
  167. package/dist/interfaces/device.interface.d.ts.map +1 -0
  168. package/dist/interfaces/device.interface.js +2 -0
  169. package/dist/interfaces/device.interface.js.map +1 -0
  170. package/dist/interfaces/download.interface.d.ts +16 -0
  171. package/dist/interfaces/download.interface.d.ts.map +1 -0
  172. package/dist/interfaces/download.interface.js +2 -0
  173. package/dist/interfaces/download.interface.js.map +1 -0
  174. package/dist/interfaces/index.d.ts +10 -0
  175. package/dist/interfaces/index.d.ts.map +1 -0
  176. package/dist/interfaces/index.js +2 -0
  177. package/dist/interfaces/index.js.map +1 -0
  178. package/dist/models/base.model.d.ts +13 -0
  179. package/dist/models/base.model.d.ts.map +1 -0
  180. package/dist/models/base.model.js +22 -0
  181. package/dist/models/base.model.js.map +1 -0
  182. package/dist/models/device/climbro.model.d.ts +42 -0
  183. package/dist/models/device/climbro.model.d.ts.map +1 -0
  184. package/dist/models/device/climbro.model.js +143 -0
  185. package/dist/models/device/climbro.model.js.map +1 -0
  186. package/dist/models/device/entralpi.model.d.ts +64 -0
  187. package/dist/models/device/entralpi.model.d.ts.map +1 -0
  188. package/dist/models/device/entralpi.model.js +240 -0
  189. package/dist/models/device/entralpi.model.js.map +1 -0
  190. package/dist/models/device/forceboard.model.d.ts +73 -0
  191. package/dist/models/device/forceboard.model.d.ts.map +1 -0
  192. package/dist/models/device/forceboard.model.js +312 -0
  193. package/dist/models/device/forceboard.model.js.map +1 -0
  194. package/dist/models/device/kilterboard.model.d.ts +144 -0
  195. package/dist/models/device/kilterboard.model.d.ts.map +1 -0
  196. package/dist/models/device/kilterboard.model.js +287 -0
  197. package/dist/models/device/kilterboard.model.js.map +1 -0
  198. package/dist/models/device/motherboard.model.d.ts +110 -0
  199. package/dist/models/device/motherboard.model.d.ts.map +1 -0
  200. package/dist/models/device/motherboard.model.js +378 -0
  201. package/dist/models/device/motherboard.model.js.map +1 -0
  202. package/dist/models/device/mysmartboard.model.d.ts +11 -0
  203. package/dist/models/device/mysmartboard.model.d.ts.map +1 -0
  204. package/dist/models/device/mysmartboard.model.js +15 -0
  205. package/dist/models/device/mysmartboard.model.js.map +1 -0
  206. package/dist/models/device/progressor.model.d.ts +39 -0
  207. package/dist/models/device/progressor.model.d.ts.map +1 -0
  208. package/dist/models/device/progressor.model.js +216 -0
  209. package/dist/models/device/progressor.model.js.map +1 -0
  210. package/dist/models/device/smartboard-pro.model.d.ts +11 -0
  211. package/dist/models/device/smartboard-pro.model.d.ts.map +1 -0
  212. package/dist/models/device/smartboard-pro.model.js +52 -0
  213. package/dist/models/device/smartboard-pro.model.js.map +1 -0
  214. package/dist/models/device/wh-c06.model.d.ts +57 -0
  215. package/dist/models/device/wh-c06.model.d.ts.map +1 -0
  216. package/dist/models/device/wh-c06.model.js +167 -0
  217. package/dist/models/device/wh-c06.model.js.map +1 -0
  218. package/dist/models/device.model.d.ts +408 -0
  219. package/dist/models/device.model.d.ts.map +1 -0
  220. package/dist/models/device.model.js +720 -0
  221. package/dist/models/device.model.js.map +1 -0
  222. package/dist/models/index.d.ts +10 -0
  223. package/dist/models/index.d.ts.map +1 -0
  224. package/dist/models/index.js +10 -0
  225. package/dist/models/index.js.map +1 -0
  226. package/dist/tsconfig.cjs.tsbuildinfo +1 -0
  227. package/package.json +5 -1
  228. package/src/interfaces/device/climbro.interface.ts +8 -2
  229. package/src/models/device/climbro.model.ts +150 -3
  230. package/deno.json +0 -8
  231. package/tsconfig.cjs.json +0 -15
  232. 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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"}