brilliantsole 0.0.26 → 0.0.28

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 (215) hide show
  1. package/README.md +16 -10
  2. package/assets/3d/anchor.glb +0 -0
  3. package/assets/3d/coin.glb +0 -0
  4. package/assets/3d/glasses.glb +0 -0
  5. package/assets/3d/rightHand.glb +0 -0
  6. package/assets/audio/bounceMedium.wav +0 -0
  7. package/assets/audio/bounceStrong.wav +0 -0
  8. package/assets/audio/bounceWeak.wav +0 -0
  9. package/assets/audio/coin.wav +0 -0
  10. package/assets/audio/getUp.wav +0 -0
  11. package/assets/audio/grab.wav +0 -0
  12. package/assets/audio/kick.wav +0 -0
  13. package/assets/audio/platterFadeIn old.wav +0 -0
  14. package/assets/audio/platterFadeIn.wav +0 -0
  15. package/assets/audio/platterFadeOut.wav +0 -0
  16. package/assets/audio/punch.wav +0 -0
  17. package/assets/audio/punchSqueak.wav +0 -0
  18. package/assets/audio/purr.wav +0 -0
  19. package/assets/audio/purrFadeOut.wav +0 -0
  20. package/assets/audio/release.wav +0 -0
  21. package/assets/audio/splat.wav +0 -0
  22. package/assets/audio/stomp.wav +0 -0
  23. package/assets/images/ukaton-pressure-0.svg +9 -0
  24. package/assets/images/ukaton-pressure-1.svg +9 -0
  25. package/assets/images/ukaton-pressure-10.svg +9 -0
  26. package/assets/images/ukaton-pressure-11.svg +9 -0
  27. package/assets/images/ukaton-pressure-12.svg +9 -0
  28. package/assets/images/ukaton-pressure-13.svg +9 -0
  29. package/assets/images/ukaton-pressure-14.svg +9 -0
  30. package/assets/images/ukaton-pressure-15.svg +9 -0
  31. package/assets/images/ukaton-pressure-2.svg +9 -0
  32. package/assets/images/ukaton-pressure-3.svg +9 -0
  33. package/assets/images/ukaton-pressure-4.svg +9 -0
  34. package/assets/images/ukaton-pressure-5.svg +9 -0
  35. package/assets/images/ukaton-pressure-6.svg +9 -0
  36. package/assets/images/ukaton-pressure-7.svg +9 -0
  37. package/assets/images/ukaton-pressure-8.svg +9 -0
  38. package/assets/images/ukaton-pressure-9.svg +9 -0
  39. package/assets/images/ukaton-right-insole.svg +798 -0
  40. package/build/brilliantsole.cjs +2870 -882
  41. package/build/brilliantsole.cjs.map +1 -1
  42. package/build/brilliantsole.js +2477 -782
  43. package/build/brilliantsole.js.map +1 -1
  44. package/build/brilliantsole.ls.js +2260 -592
  45. package/build/brilliantsole.ls.js.map +1 -1
  46. package/build/brilliantsole.min.js +1 -1
  47. package/build/brilliantsole.min.js.map +1 -1
  48. package/build/brilliantsole.module.d.ts +302 -116
  49. package/build/brilliantsole.module.js +2468 -782
  50. package/build/brilliantsole.module.js.map +1 -1
  51. package/build/brilliantsole.module.min.d.ts +302 -116
  52. package/build/brilliantsole.module.min.js +1 -1
  53. package/build/brilliantsole.module.min.js.map +1 -1
  54. package/build/brilliantsole.node.module.d.ts +295 -113
  55. package/build/brilliantsole.node.module.js +2860 -882
  56. package/build/brilliantsole.node.module.js.map +1 -1
  57. package/build/dts/BS-output.d.ts +10 -0
  58. package/build/dts/BS.d.ts +21 -9
  59. package/build/dts/CameraManager.d.ts +72 -0
  60. package/build/dts/Device.d.ts +53 -16
  61. package/build/dts/DeviceInformationManager.d.ts +4 -4
  62. package/build/dts/DeviceManager.d.ts +3 -0
  63. package/build/dts/FileTransferManager.d.ts +18 -8
  64. package/build/dts/InformationManager.d.ts +8 -5
  65. package/build/dts/TfliteManager.d.ts +22 -2
  66. package/build/dts/WifiManager.d.ts +61 -0
  67. package/build/dts/connection/BaseConnectionManager.d.ts +37 -3
  68. package/build/dts/connection/ClientConnectionManager.d.ts +11 -2
  69. package/build/dts/connection/bluetooth/BluetoothConnectionManager.d.ts +1 -0
  70. package/build/dts/connection/bluetooth/NobleConnectionManager.d.ts +3 -1
  71. package/build/dts/connection/bluetooth/WebBluetoothConnectionManager.d.ts +2 -0
  72. package/build/dts/connection/bluetooth/bluetoothUUIDs.d.ts +2 -2
  73. package/build/dts/connection/udp/UDPConnectionManager.d.ts +28 -0
  74. package/build/dts/connection/webSocket/WebSocketConnectionManager.d.ts +25 -0
  75. package/build/dts/devicePair/DevicePair.d.ts +14 -10
  76. package/build/dts/devicePair/DevicePairPressureSensorDataManager.d.ts +8 -4
  77. package/build/dts/devicePair/DevicePairSensorDataManager.d.ts +2 -2
  78. package/build/dts/scanner/BaseScanner.d.ts +4 -1
  79. package/build/dts/scanner/NobleScanner.d.ts +2 -1
  80. package/build/dts/sensor/MotionSensorDataManager.d.ts +5 -2
  81. package/build/dts/sensor/SensorDataManager.d.ts +5 -4
  82. package/build/dts/server/BaseClient.d.ts +6 -3
  83. package/build/dts/server/ServerUtils.d.ts +1 -1
  84. package/build/dts/server/websocket/WebSocketUtils.d.ts +1 -1
  85. package/build/dts/utils/CenterOfPressureHelper.d.ts +2 -2
  86. package/build/dts/utils/Console.d.ts +2 -0
  87. package/build/dts/utils/MathUtils.d.ts +2 -0
  88. package/build/dts/utils/ThrottleUtils.d.ts +2 -0
  89. package/build/dts/vibration/VibrationManager.d.ts +19 -2
  90. package/build/index.d.ts +299 -113
  91. package/build/index.node.d.ts +292 -110
  92. package/examples/3d/scene.html +19 -5
  93. package/examples/3d/script.js +90 -17
  94. package/examples/3d-generic/index.html +144 -0
  95. package/examples/3d-generic/script.js +266 -0
  96. package/examples/balance/script.js +2 -1
  97. package/examples/basic/index.html +232 -18
  98. package/examples/basic/script.js +746 -106
  99. package/examples/bottango/index.html +11 -1
  100. package/examples/bottango/script.js +2 -2
  101. package/examples/center-of-pressure/index.html +114 -114
  102. package/examples/center-of-pressure/script.js +1 -1
  103. package/examples/device-pair/index.html +58 -58
  104. package/examples/device-pair/script.js +12 -8
  105. package/examples/edge-impulse/script.js +135 -44
  106. package/examples/edge-impulse-test/README.md +11 -0
  107. package/examples/edge-impulse-test/edge-impulse-standalone.js +7228 -0
  108. package/examples/edge-impulse-test/edge-impulse-standalone.wasm +0 -0
  109. package/examples/edge-impulse-test/index.html +75 -0
  110. package/examples/edge-impulse-test/run-impulse.js +135 -0
  111. package/examples/edge-impulse-test/script.js +200 -0
  112. package/examples/gloves/edge-impulse-standalone.js +7228 -0
  113. package/examples/gloves/edge-impulse-standalone.wasm +0 -0
  114. package/examples/gloves/index.html +119 -0
  115. package/examples/gloves/run-impulse.js +135 -0
  116. package/examples/gloves/scene.html +124 -0
  117. package/examples/gloves/script.js +931 -0
  118. package/examples/graph/index.html +11 -1
  119. package/examples/graph/script.js +94 -37
  120. package/examples/pressure/index.html +180 -12
  121. package/examples/pressure/script.js +144 -7
  122. package/examples/punch/index.html +135 -0
  123. package/examples/punch/punch.tflite +0 -0
  124. package/examples/punch/script.js +169 -0
  125. package/examples/recording/index.html +191 -183
  126. package/examples/server/index.html +109 -23
  127. package/examples/server/script.js +322 -111
  128. package/examples/ukaton-firmware-update/index.html +20 -0
  129. package/examples/ukaton-firmware-update/manifest.json +11 -0
  130. package/examples/ukaton-firmware-update/merged-firmware.bin +0 -0
  131. package/examples/utils/aframe/aframe-master.min.js +2 -0
  132. package/examples/utils/aframe/bs-vibration.js +150 -0
  133. package/examples/utils/aframe/force-pushable.js +80 -0
  134. package/examples/utils/aframe/grabbable-anchor.js +46 -0
  135. package/examples/utils/aframe/grabbable-listener.js +31 -0
  136. package/examples/utils/aframe/grabbable-physics-body.js +190 -0
  137. package/examples/utils/aframe/grow-shrink.js +25 -0
  138. package/examples/utils/aframe/hand-punch.js +119 -0
  139. package/examples/utils/aframe/my-obb-collider.js +293 -0
  140. package/examples/utils/aframe/occlude-hand-tracking-controls.js +47 -0
  141. package/examples/utils/aframe/occlude-mesh.js +42 -0
  142. package/examples/utils/aframe/palm-up-detector.js +47 -0
  143. package/examples/utils/aframe/shadow-material.js +20 -0
  144. package/examples/utils/aframe/soft-shadow-light.js +9 -0
  145. package/examples/webxr/script.js +3 -3
  146. package/examples/webxr-2/assets/3d/soccerBall.glb +0 -0
  147. package/examples/webxr-2/assets/audio/shellBounce.wav +0 -0
  148. package/examples/webxr-2/assets/audio/shellHit.wav +0 -0
  149. package/examples/webxr-2/assets/audio/shellKick.wav +0 -0
  150. package/examples/webxr-2/assets/audio/soccerBounce.wav +0 -0
  151. package/examples/webxr-2/assets/audio/soccerKick.mp3 +0 -0
  152. package/examples/webxr-2/assets/images/shellTexture.png +0 -0
  153. package/examples/webxr-2/components/bs-ankle.js +337 -0
  154. package/examples/webxr-2/components/coin.js +84 -0
  155. package/examples/webxr-2/components/custom-wrap.js +17 -0
  156. package/examples/webxr-2/components/goomba.js +3250 -0
  157. package/examples/webxr-2/components/init-shell-material.js +215 -0
  158. package/examples/webxr-2/components/platter.js +172 -0
  159. package/examples/webxr-2/components/shell.js +374 -0
  160. package/examples/webxr-2/components/soccer-ball.js +250 -0
  161. package/examples/webxr-2/components/squashed-goomba.js +249 -0
  162. package/examples/webxr-2/edge-impulse-standalone.js +7228 -0
  163. package/examples/webxr-2/edge-impulse-standalone.wasm +0 -0
  164. package/examples/webxr-2/index.html +996 -0
  165. package/examples/webxr-2/kick.tflite +0 -0
  166. package/examples/webxr-2/kick2.tflite +0 -0
  167. package/examples/webxr-2/run-impulse.js +135 -0
  168. package/examples/webxr-2/script.js +384 -0
  169. package/package.json +2 -1
  170. package/src/.prettierrc +4 -0
  171. package/src/BS.ts +66 -9
  172. package/src/CameraManager.ts +499 -0
  173. package/src/Device.ts +620 -92
  174. package/src/DeviceInformationManager.ts +22 -11
  175. package/src/DeviceManager.ts +94 -25
  176. package/src/FileTransferManager.ts +146 -21
  177. package/src/FirmwareManager.ts +1 -1
  178. package/src/InformationManager.ts +62 -20
  179. package/src/TfliteManager.ts +172 -26
  180. package/src/WifiManager.ts +323 -0
  181. package/src/connection/BaseConnectionManager.ts +145 -30
  182. package/src/connection/ClientConnectionManager.ts +47 -11
  183. package/src/connection/bluetooth/BluetoothConnectionManager.ts +14 -3
  184. package/src/connection/bluetooth/NobleConnectionManager.ts +155 -42
  185. package/src/connection/bluetooth/WebBluetoothConnectionManager.ts +104 -35
  186. package/src/connection/bluetooth/bluetoothUUIDs.ts +40 -13
  187. package/src/connection/udp/UDPConnectionManager.ts +356 -0
  188. package/src/connection/websocket/WebSocketConnectionManager.ts +282 -0
  189. package/src/devicePair/DevicePair.ts +145 -49
  190. package/src/devicePair/DevicePairPressureSensorDataManager.ts +72 -24
  191. package/src/devicePair/DevicePairSensorDataManager.ts +5 -5
  192. package/src/scanner/BaseScanner.ts +49 -11
  193. package/src/scanner/NobleScanner.ts +81 -17
  194. package/src/sensor/BarometerSensorDataManager.ts +1 -1
  195. package/src/sensor/MotionSensorDataManager.ts +22 -7
  196. package/src/sensor/PressureSensorDataManager.ts +47 -13
  197. package/src/sensor/SensorConfigurationManager.ts +75 -24
  198. package/src/sensor/SensorDataManager.ts +107 -26
  199. package/src/server/BaseClient.ts +192 -37
  200. package/src/server/BaseServer.ts +201 -43
  201. package/src/server/ServerUtils.ts +39 -9
  202. package/src/server/udp/UDPServer.ts +74 -23
  203. package/src/server/udp/UDPUtils.ts +9 -2
  204. package/src/server/websocket/WebSocketClient.ts +30 -9
  205. package/src/server/websocket/WebSocketServer.ts +1 -1
  206. package/src/server/websocket/WebSocketUtils.ts +4 -2
  207. package/src/utils/CenterOfPressureHelper.ts +5 -5
  208. package/src/utils/Console.ts +62 -9
  209. package/src/utils/MathUtils.ts +31 -1
  210. package/src/utils/ParseUtils.ts +25 -6
  211. package/src/utils/ThrottleUtils.ts +62 -0
  212. package/src/utils/Timer.ts +1 -1
  213. package/src/utils/checksum.ts +1 -1
  214. package/src/utils/mcumgr.js +1 -1
  215. package/src/vibration/VibrationManager.ts +166 -40
@@ -20,7 +20,12 @@ function setUrlParam(key, value) {
20
20
  searchParams.delete(key);
21
21
  }
22
22
  let newUrl =
23
- window.location.protocol + "//" + window.location.host + window.location.pathname + "?" + searchParams.toString();
23
+ window.location.protocol +
24
+ "//" +
25
+ window.location.host +
26
+ window.location.pathname +
27
+ "?" +
28
+ searchParams.toString();
24
29
  window.history.pushState({ path: newUrl }, "", newUrl);
25
30
  }
26
31
  }
@@ -61,7 +66,9 @@ client.addEventListener("connectionStatus", () => {
61
66
  case "connected":
62
67
  case "notConnected":
63
68
  toggleConnectionButton.disabled = false;
64
- toggleConnectionButton.innerText = client.isConnected ? "disconnect" : "connect";
69
+ toggleConnectionButton.innerText = client.isConnected
70
+ ? "disconnect"
71
+ : "connect";
65
72
  break;
66
73
  case "connecting":
67
74
  case "disconnecting":
@@ -74,7 +81,9 @@ client.addEventListener("connectionStatus", () => {
74
81
  // SCANNER
75
82
 
76
83
  /** @type {HTMLInputElement} */
77
- const isScanningAvailableCheckbox = document.getElementById("isScanningAvailable");
84
+ const isScanningAvailableCheckbox = document.getElementById(
85
+ "isScanningAvailable"
86
+ );
78
87
  client.addEventListener("isScanningAvailable", () => {
79
88
  isScanningAvailableCheckbox.checked = client.isScanningAvailable;
80
89
  });
@@ -94,7 +103,9 @@ client.addEventListener("isScanning", () => {
94
103
  // DISCOVERED DEVICES
95
104
 
96
105
  /** @type {HTMLTemplateElement} */
97
- const discoveredDeviceTemplate = document.getElementById("discoveredDeviceTemplate");
106
+ const discoveredDeviceTemplate = document.getElementById(
107
+ "discoveredDeviceTemplate"
108
+ );
98
109
  const discoveredDevicesContainer = document.getElementById("discoveredDevices");
99
110
  /** @type {Object.<string, HTMLElement>} */
100
111
  let discoveredDeviceContainers = {};
@@ -102,20 +113,56 @@ let discoveredDeviceContainers = {};
102
113
  client.addEventListener("discoveredDevice", (event) => {
103
114
  const discoveredDevice = event.message.discoveredDevice;
104
115
 
105
- let discoveredDeviceContainer = discoveredDeviceContainers[discoveredDevice.bluetoothId];
116
+ let discoveredDeviceContainer =
117
+ discoveredDeviceContainers[discoveredDevice.bluetoothId];
106
118
  if (!discoveredDeviceContainer) {
107
- discoveredDeviceContainer = discoveredDeviceTemplate.content.cloneNode(true).querySelector(".discoveredDevice");
119
+ discoveredDeviceContainer = discoveredDeviceTemplate.content
120
+ .cloneNode(true)
121
+ .querySelector(".discoveredDevice");
108
122
 
109
123
  /** @type {HTMLButtonElement} */
110
- const toggleConnectionButton = discoveredDeviceContainer.querySelector(".toggleConnection");
124
+ const toggleConnectionButton =
125
+ discoveredDeviceContainer.querySelector(".toggleConnection");
111
126
  toggleConnectionButton.addEventListener("click", () => {
112
127
  let device = client.devices[discoveredDevice.bluetoothId];
113
128
  if (device) {
114
129
  device.toggleConnection();
115
130
  } else {
116
131
  device = client.connectToDevice(discoveredDevice.bluetoothId);
132
+ onDevice(device);
117
133
  }
118
- onDevice(device);
134
+ });
135
+
136
+ /** @type {HTMLButtonElement} */
137
+ const connectViaWebSocketsButton = discoveredDeviceContainer.querySelector(
138
+ ".connectViaWebSockets"
139
+ );
140
+ connectViaWebSocketsButton.addEventListener("click", () => {
141
+ let device = client.devices[discoveredDevice.bluetoothId];
142
+ if (device) {
143
+ device.connect({ type: "client", subType: "webSocket" });
144
+ } else {
145
+ device = client.connectToDevice(
146
+ discoveredDevice.bluetoothId,
147
+ "webSocket"
148
+ );
149
+ onDevice(device);
150
+ }
151
+ connectViaWebSocketsButton.disabled = true;
152
+ });
153
+
154
+ /** @type {HTMLButtonElement} */
155
+ const connectViaUDPButton =
156
+ discoveredDeviceContainer.querySelector(".connectViaUDP");
157
+ connectViaUDPButton.addEventListener("click", () => {
158
+ let device = client.devices[discoveredDevice.bluetoothId];
159
+ if (device) {
160
+ device.connect({ type: "client", subType: "udp" });
161
+ } else {
162
+ device = client.connectToDevice(discoveredDevice.bluetoothId, "udp");
163
+ onDevice(device);
164
+ }
165
+ connectViaUDPButton.disabled = true;
119
166
  });
120
167
 
121
168
  /** @param {BS.Device} device */
@@ -135,7 +182,9 @@ client.addEventListener("discoveredDevice", (event) => {
135
182
  switch (device.connectionStatus) {
136
183
  case "connected":
137
184
  case "notConnected":
138
- toggleConnectionButton.innerText = device.isConnected ? "disconnect" : "connect";
185
+ toggleConnectionButton.innerText = device.isConnected
186
+ ? "disconnect"
187
+ : "connect";
139
188
  toggleConnectionButton.disabled = false;
140
189
  break;
141
190
  case "connecting":
@@ -144,9 +193,12 @@ client.addEventListener("discoveredDevice", (event) => {
144
193
  toggleConnectionButton.disabled = true;
145
194
  break;
146
195
  }
196
+ connectViaWebSocketsButton.disabled = device.isConnected;
197
+ connectViaUDPButton.disabled = device.isConnected;
147
198
  };
148
199
 
149
- discoveredDeviceContainers[discoveredDevice.bluetoothId] = discoveredDeviceContainer;
200
+ discoveredDeviceContainers[discoveredDevice.bluetoothId] =
201
+ discoveredDeviceContainer;
150
202
  discoveredDevicesContainer.appendChild(discoveredDeviceContainer);
151
203
  }
152
204
 
@@ -155,21 +207,58 @@ client.addEventListener("discoveredDevice", (event) => {
155
207
 
156
208
  /** @param {BS.DiscoveredDevice} discoveredDevice */
157
209
  function updateDiscoveredDeviceContainer(discoveredDevice) {
158
- const discoveredDeviceContainer = discoveredDeviceContainers[discoveredDevice.bluetoothId];
210
+ const discoveredDeviceContainer =
211
+ discoveredDeviceContainers[discoveredDevice.bluetoothId];
159
212
  if (!discoveredDeviceContainer) {
160
- console.warn(`no discoveredDeviceContainer for device id ${discoveredDevice.bluetoothId}`);
213
+ console.warn(
214
+ `no discoveredDeviceContainer for device id ${discoveredDevice.bluetoothId}`
215
+ );
161
216
  return;
162
217
  }
163
- discoveredDeviceContainer.querySelector(".name").innerText = discoveredDevice.name;
164
- discoveredDeviceContainer.querySelector(".rssi").innerText = discoveredDevice.rssi;
165
- discoveredDeviceContainer.querySelector(".deviceType").innerText = discoveredDevice.deviceType;
218
+ discoveredDeviceContainer.querySelector(".name").innerText =
219
+ discoveredDevice.name;
220
+ discoveredDeviceContainer.querySelector(".rssi").innerText =
221
+ discoveredDevice.rssi;
222
+ discoveredDeviceContainer.querySelector(".deviceType").innerText =
223
+ discoveredDevice.deviceType;
224
+
225
+ const connectViaWebSocketsButton = discoveredDeviceContainer.querySelector(
226
+ ".connectViaWebSockets"
227
+ );
228
+ const connectViaUDPButton =
229
+ discoveredDeviceContainer.querySelector(".connectViaUDP");
230
+
231
+ const ipAddressSpan = discoveredDeviceContainer.querySelector(".ipAddress");
232
+ if (discoveredDevice.ipAddress) {
233
+ ipAddressSpan.closest("label").classList.remove("hidden");
234
+ ipAddressSpan.innerText = discoveredDevice.ipAddress;
235
+ connectViaWebSocketsButton.classList.remove("hidden");
236
+ connectViaUDPButton.classList.remove("hidden");
237
+ } else {
238
+ ipAddressSpan.closest("label").classList.add("hidden");
239
+ connectViaWebSocketsButton.classList.add("hidden");
240
+ connectViaUDPButton.classList.add("hidden");
241
+ }
242
+
243
+ const isWifiSecureSpan =
244
+ discoveredDeviceContainer.querySelector(".isWifiSecure");
245
+ discoveredDeviceContainer.querySelector(".isWifiSecure");
246
+ if (discoveredDevice.isWifiSecure) {
247
+ isWifiSecureSpan.closest("label").classList.remove("hidden");
248
+ ipAddressSpan.innerText = discoveredDevice.isWifiSecure;
249
+ } else {
250
+ isWifiSecureSpan.closest("label").classList.add("hidden");
251
+ }
166
252
  }
167
253
 
168
254
  /** @param {BS.DiscoveredDevice} discoveredDevice */
169
255
  function removeDiscoveredDeviceContainer(discoveredDevice) {
170
- const discoveredDeviceContainer = discoveredDeviceContainers[discoveredDevice.bluetoothId];
256
+ const discoveredDeviceContainer =
257
+ discoveredDeviceContainers[discoveredDevice.bluetoothId];
171
258
  if (!discoveredDeviceContainer) {
172
- console.warn(`no discoveredDeviceContainer for device id ${discoveredDevice.bluetoothId}`);
259
+ console.warn(
260
+ `no discoveredDeviceContainer for device id ${discoveredDevice.bluetoothId}`
261
+ );
173
262
  return;
174
263
  }
175
264
 
@@ -200,7 +289,8 @@ client.addEventListener("isScanning", () => {
200
289
  BS.DeviceManager.AddEventListener("deviceIsConnected", (event) => {
201
290
  const device = event.message.device;
202
291
  console.log("deviceIsConnected", device);
203
- const discoveredDeviceContainer = discoveredDeviceContainers[device.bluetoothId];
292
+ const discoveredDeviceContainer =
293
+ discoveredDeviceContainers[device.bluetoothId];
204
294
  if (!discoveredDeviceContainer) {
205
295
  return;
206
296
  }
@@ -210,7 +300,9 @@ BS.DeviceManager.AddEventListener("deviceIsConnected", (event) => {
210
300
  // AVAILABLE DEVICES
211
301
 
212
302
  /** @type {HTMLTemplateElement} */
213
- const connectedDeviceTemplate = document.getElementById("connectedDeviceTemplate");
303
+ const connectedDeviceTemplate = document.getElementById(
304
+ "connectedDeviceTemplate"
305
+ );
214
306
  const connectedDevicesContainer = document.getElementById("connectedDevices");
215
307
  /** @type {Object.<string, HTMLElement>} */
216
308
  let connectedDeviceContainers = {};
@@ -223,21 +315,33 @@ BS.DeviceManager.AddEventListener("connectedDevices", (event) => {
223
315
  if (device.connectionType != "client" || !device.bluetoothId) {
224
316
  return;
225
317
  }
226
- let connectedDeviceContainer = connectedDeviceContainers[device.bluetoothId];
318
+ let connectedDeviceContainer =
319
+ connectedDeviceContainers[device.bluetoothId];
227
320
  if (!connectedDeviceContainer) {
228
- connectedDeviceContainer = connectedDeviceTemplate.content.cloneNode(true).querySelector(".connectedDevice");
321
+ connectedDeviceContainer = connectedDeviceTemplate.content
322
+ .cloneNode(true)
323
+ .querySelector(".connectedDevice");
229
324
  connectedDeviceContainers[device.bluetoothId] = connectedDeviceContainer;
230
325
 
231
326
  /** @type {HTMLPreElement} */
232
- const deviceInformationPre = connectedDeviceContainer.querySelector(".deviceInformation");
327
+ const deviceInformationPre =
328
+ connectedDeviceContainer.querySelector(".deviceInformation");
233
329
  const setDeviceInformationPre = () =>
234
- (deviceInformationPre.textContent = JSON.stringify(device.deviceInformation, null, 2));
330
+ (deviceInformationPre.textContent = JSON.stringify(
331
+ device.deviceInformation,
332
+ null,
333
+ 2
334
+ ));
235
335
  setDeviceInformationPre();
236
- device.addEventListener("deviceInformation", () => setDeviceInformationPre());
336
+ device.addEventListener("deviceInformation", () =>
337
+ setDeviceInformationPre()
338
+ );
237
339
 
238
340
  /** @type {HTMLSpanElement} */
239
- const batteryLevelSpan = connectedDeviceContainer.querySelector(".batteryLevel");
240
- const setBatteryLevelSpan = () => (batteryLevelSpan.innerText = device.batteryLevel);
341
+ const batteryLevelSpan =
342
+ connectedDeviceContainer.querySelector(".batteryLevel");
343
+ const setBatteryLevelSpan = () =>
344
+ (batteryLevelSpan.innerText = device.batteryLevel);
241
345
  setBatteryLevelSpan();
242
346
  device.addEventListener("batteryLevel", () => setBatteryLevelSpan());
243
347
 
@@ -248,13 +352,15 @@ BS.DeviceManager.AddEventListener("connectedDevices", (event) => {
248
352
  device.addEventListener("getName", () => setNameSpan());
249
353
 
250
354
  /** @type {HTMLInputElement} */
251
- const setNameInput = connectedDeviceContainer.querySelector(".setNameInput");
355
+ const setNameInput =
356
+ connectedDeviceContainer.querySelector(".setNameInput");
252
357
  setNameInput.minLength = BS.MinNameLength;
253
358
  setNameInput.maxLength = BS.MaxNameLength;
254
359
  setNameInput.disabled = !device.isConnected;
255
360
 
256
361
  /** @type {HTMLButtonElement} */
257
- const setNameButton = connectedDeviceContainer.querySelector(".setNameButton");
362
+ const setNameButton =
363
+ connectedDeviceContainer.querySelector(".setNameButton");
258
364
  setNameButton.disabled = !device.isConnected;
259
365
 
260
366
  device.addEventListener("isConnected", () => {
@@ -265,7 +371,8 @@ BS.DeviceManager.AddEventListener("connectedDevices", (event) => {
265
371
  });
266
372
 
267
373
  setNameInput.addEventListener("input", () => {
268
- setNameButton.disabled = setNameInput.value.length < device.minNameLength;
374
+ setNameButton.disabled =
375
+ setNameInput.value.length < device.minNameLength;
269
376
  });
270
377
 
271
378
  setNameButton.addEventListener("click", () => {
@@ -276,16 +383,19 @@ BS.DeviceManager.AddEventListener("connectedDevices", (event) => {
276
383
  });
277
384
 
278
385
  /** @type {HTMLSpanElement} */
279
- const deviceTypeSpan = connectedDeviceContainer.querySelector(".deviceType");
386
+ const deviceTypeSpan =
387
+ connectedDeviceContainer.querySelector(".deviceType");
280
388
  const setDeviceTypeSpan = () => (deviceTypeSpan.innerText = device.type);
281
389
  setDeviceTypeSpan();
282
390
  device.addEventListener("getType", () => setDeviceTypeSpan());
283
391
 
284
392
  /** @type {HTMLButtonElement} */
285
- const setTypeButton = connectedDeviceContainer.querySelector(".setTypeButton");
393
+ const setTypeButton =
394
+ connectedDeviceContainer.querySelector(".setTypeButton");
286
395
 
287
396
  /** @type {HTMLSelectElement} */
288
- const setTypeSelect = connectedDeviceContainer.querySelector(".setTypeSelect");
397
+ const setTypeSelect =
398
+ connectedDeviceContainer.querySelector(".setTypeSelect");
289
399
  /** @type {HTMLOptGroupElement} */
290
400
  const setTypeSelectOptgroup = setTypeSelect.querySelector("optgroup");
291
401
  BS.DeviceTypes.forEach((type) => {
@@ -312,24 +422,37 @@ BS.DeviceManager.AddEventListener("connectedDevices", (event) => {
312
422
  });
313
423
 
314
424
  /** @type {HTMLPreElement} */
315
- const sensorConfigurationPre = connectedDeviceContainer.querySelector(".sensorConfiguration");
425
+ const sensorConfigurationPre = connectedDeviceContainer.querySelector(
426
+ ".sensorConfiguration"
427
+ );
316
428
  const setSensorConfigurationPre = () =>
317
- (sensorConfigurationPre.textContent = JSON.stringify(device.sensorConfiguration, null, 2));
429
+ (sensorConfigurationPre.textContent = JSON.stringify(
430
+ device.sensorConfiguration,
431
+ null,
432
+ 2
433
+ ));
318
434
  setSensorConfigurationPre();
319
- device.addEventListener("getSensorConfiguration", () => setSensorConfigurationPre());
435
+ device.addEventListener("getSensorConfiguration", () =>
436
+ setSensorConfigurationPre()
437
+ );
320
438
 
321
439
  /** @type {HTMLTemplateElement} */
322
- const sensorTypeConfigurationTemplate = connectedDeviceContainer.querySelector(
323
- ".sensorTypeConfigurationTemplate"
324
- );
440
+ const sensorTypeConfigurationTemplate =
441
+ connectedDeviceContainer.querySelector(
442
+ ".sensorTypeConfigurationTemplate"
443
+ );
325
444
  device.sensorTypes.forEach((sensorType) => {
326
- const sensorTypeConfigurationContainer = sensorTypeConfigurationTemplate.content
327
- .cloneNode(true)
328
- .querySelector(".sensorTypeConfiguration");
329
- sensorTypeConfigurationContainer.querySelector(".sensorType").innerText = sensorType;
445
+ const sensorTypeConfigurationContainer =
446
+ sensorTypeConfigurationTemplate.content
447
+ .cloneNode(true)
448
+ .querySelector(".sensorTypeConfiguration");
449
+ sensorTypeConfigurationContainer.querySelector(
450
+ ".sensorType"
451
+ ).innerText = sensorType;
330
452
 
331
453
  /** @type {HTMLInputElement} */
332
- const sensorRateInput = sensorTypeConfigurationContainer.querySelector(".sensorRate");
454
+ const sensorRateInput =
455
+ sensorTypeConfigurationContainer.querySelector(".sensorRate");
333
456
  sensorRateInput.value = 0;
334
457
  sensorRateInput.max = BS.MaxSensorRate;
335
458
  sensorRateInput.step = BS.SensorRateStep;
@@ -348,24 +471,29 @@ BS.DeviceManager.AddEventListener("connectedDevices", (event) => {
348
471
  });
349
472
 
350
473
  device.addEventListener("isConnected", () => {
351
- connectedDeviceContainer.querySelectorAll("input").forEach((input) => (input.disabled = !device.isConnected));
474
+ connectedDeviceContainer
475
+ .querySelectorAll("input")
476
+ .forEach((input) => (input.disabled = !device.isConnected));
352
477
  });
353
478
 
354
479
  device.addEventListener("getSensorConfiguration", () => {
355
480
  for (const sensorType in device.sensorConfiguration) {
356
481
  connectedDeviceContainer.querySelector(
357
- `.sensorTypeConfiguration[data-sensor-type="${sensorType}"] input`
482
+ `.sensorTypeConfiguration[data-sensor-type="${sensorType}"] .input`
358
483
  ).value = device.sensorConfiguration[sensorType];
359
484
  }
360
485
  });
361
486
 
362
487
  /** @type {HTMLPreElement} */
363
- const sensorDataPre = connectedDeviceContainer.querySelector(".sensorData");
364
- const setSensorDataPre = (event) => (sensorDataPre.textContent = JSON.stringify(event.message, null, 2));
488
+ const sensorDataPre =
489
+ connectedDeviceContainer.querySelector(".sensorData");
490
+ const setSensorDataPre = (event) =>
491
+ (sensorDataPre.textContent = JSON.stringify(event.message, null, 2));
365
492
  device.addEventListener("sensorData", (event) => setSensorDataPre(event));
366
493
 
367
494
  /** @type {HTMLButtonElement} */
368
- const triggerVibrationButton = connectedDeviceContainer.querySelector(".triggerVibration");
495
+ const triggerVibrationButton =
496
+ connectedDeviceContainer.querySelector(".triggerVibration");
369
497
  triggerVibrationButton.addEventListener("click", () => {
370
498
  device.triggerVibration([
371
499
  {
@@ -380,7 +508,8 @@ BS.DeviceManager.AddEventListener("connectedDevices", (event) => {
380
508
  triggerVibrationButton.disabled = !device.isConnected;
381
509
 
382
510
  /** @type {HTMLButtonElement} */
383
- const toggleConnectionButton = connectedDeviceContainer.querySelector(".toggleConnection");
511
+ const toggleConnectionButton =
512
+ connectedDeviceContainer.querySelector(".toggleConnection");
384
513
  toggleConnectionButton.addEventListener("click", () => {
385
514
  device.toggleConnection();
386
515
  });
@@ -389,7 +518,9 @@ BS.DeviceManager.AddEventListener("connectedDevices", (event) => {
389
518
  case "connected":
390
519
  case "notConnected":
391
520
  toggleConnectionButton.disabled = false;
392
- toggleConnectionButton.innerText = device.isConnected ? "disconnect" : "connect";
521
+ toggleConnectionButton.innerText = device.isConnected
522
+ ? "disconnect"
523
+ : "connect";
393
524
  break;
394
525
  case "connecting":
395
526
  case "disconnecting":
@@ -399,7 +530,9 @@ BS.DeviceManager.AddEventListener("connectedDevices", (event) => {
399
530
  }
400
531
  };
401
532
  updateToggleConnectionButton();
402
- device.addEventListener("connectionStatus", () => updateToggleConnectionButton());
533
+ device.addEventListener("connectionStatus", () =>
534
+ updateToggleConnectionButton()
535
+ );
403
536
 
404
537
  /** @type {File?} */
405
538
  let file;
@@ -416,9 +549,12 @@ BS.DeviceManager.AddEventListener("connectedDevices", (event) => {
416
549
  updateToggleFileTransferButton();
417
550
  });
418
551
 
419
- const maxFileLengthSpan = connectedDeviceContainer.querySelector(".maxFileLength");
552
+ const maxFileLengthSpan =
553
+ connectedDeviceContainer.querySelector(".maxFileLength");
420
554
  const updateMaxFileLengthSpan = () => {
421
- maxFileLengthSpan.innerText = (device.maxFileLength / 1024).toLocaleString();
555
+ maxFileLengthSpan.innerText = (
556
+ device.maxFileLength / 1024
557
+ ).toLocaleString();
422
558
  };
423
559
  updateMaxFileLengthSpan();
424
560
  device.addEventListener("isConnected", () => {
@@ -429,7 +565,8 @@ BS.DeviceManager.AddEventListener("connectedDevices", (event) => {
429
565
  let fileType;
430
566
 
431
567
  /** @type {HTMLSelectElement} */
432
- const fileTransferTypesSelect = connectedDeviceContainer.querySelector(".fileTransferTypes");
568
+ const fileTransferTypesSelect =
569
+ connectedDeviceContainer.querySelector(".fileTransferTypes");
433
570
  fileTransferTypesSelect.addEventListener("input", () => {
434
571
  fileType = fileTransferTypesSelect.value;
435
572
  console.log({ fileType });
@@ -440,14 +577,17 @@ BS.DeviceManager.AddEventListener("connectedDevices", (event) => {
440
577
  }
441
578
  });
442
579
  /** @type {HTMLOptGroupElement} */
443
- const fileTransferTypesOptgroup = fileTransferTypesSelect.querySelector("optgroup");
580
+ const fileTransferTypesOptgroup =
581
+ fileTransferTypesSelect.querySelector("optgroup");
444
582
  BS.FileTypes.forEach((fileType) => {
445
583
  fileTransferTypesOptgroup.appendChild(new Option(fileType));
446
584
  });
447
585
  fileTransferTypesSelect.dispatchEvent(new Event("input"));
448
586
 
449
587
  /** @type {HTMLProgressElement} */
450
- const fileTransferProgress = connectedDeviceContainer.querySelector(".fileTransferProgress");
588
+ const fileTransferProgress = connectedDeviceContainer.querySelector(
589
+ ".fileTransferProgress"
590
+ );
451
591
  console.log("fileTransferProgress", fileTransferProgress);
452
592
 
453
593
  device.addEventListener("fileTransferProgress", (event) => {
@@ -462,7 +602,9 @@ BS.DeviceManager.AddEventListener("connectedDevices", (event) => {
462
602
  });
463
603
 
464
604
  /** @type {HTMLButtonElement} */
465
- const toggleFileTransferButton = connectedDeviceContainer.querySelector(".toggleFileTransfer");
605
+ const toggleFileTransferButton = connectedDeviceContainer.querySelector(
606
+ ".toggleFileTransfer"
607
+ );
466
608
  toggleFileTransferButton.addEventListener("click", async () => {
467
609
  if (device.fileTransferStatus == "idle") {
468
610
  if (fileTransferDirection == "send") {
@@ -478,7 +620,8 @@ BS.DeviceManager.AddEventListener("connectedDevices", (event) => {
478
620
  }
479
621
  });
480
622
  const updateToggleFileTransferButton = () => {
481
- const enabled = device.isConnected && (file || fileTransferDirection == "receive");
623
+ const enabled =
624
+ device.isConnected && (file || fileTransferDirection == "receive");
482
625
  toggleFileTransferButton.disabled = !enabled;
483
626
 
484
627
  /** @type {String} */
@@ -506,7 +649,8 @@ BS.DeviceManager.AddEventListener("connectedDevices", (event) => {
506
649
  /** @type {BS.FileTransferDirection} */
507
650
  let fileTransferDirection;
508
651
  /** @type {HTMLSelectElement} */
509
- const fileTransferDirectionSelect = connectedDeviceContainer.querySelector(".fileTransferDirection");
652
+ const fileTransferDirectionSelect =
653
+ connectedDeviceContainer.querySelector(".fileTransferDirection");
510
654
  fileTransferDirectionSelect.addEventListener("input", () => {
511
655
  fileTransferDirection = fileTransferDirectionSelect.value;
512
656
  console.log({ fileTransferDirection });
@@ -534,11 +678,16 @@ BS.DeviceManager.AddEventListener("connectedDevices", (event) => {
534
678
  // TFLITE
535
679
 
536
680
  /** @type {HTMLSpanElement} */
537
- const tfliteNameSpan = connectedDeviceContainer.querySelector(".tfliteName");
681
+ const tfliteNameSpan =
682
+ connectedDeviceContainer.querySelector(".tfliteName");
538
683
  /** @type {HTMLInputElement} */
539
- const setTfliteNameInput = connectedDeviceContainer.querySelector(".setTfliteNameInput");
684
+ const setTfliteNameInput = connectedDeviceContainer.querySelector(
685
+ ".setTfliteNameInput"
686
+ );
540
687
  /** @type {HTMLButtonElement} */
541
- const setTfliteNameButton = connectedDeviceContainer.querySelector(".setTfliteNameButton");
688
+ const setTfliteNameButton = connectedDeviceContainer.querySelector(
689
+ ".setTfliteNameButton"
690
+ );
542
691
 
543
692
  device.addEventListener("getTfliteName", () => {
544
693
  tfliteNameSpan.innerText = device.tfliteName;
@@ -561,13 +710,19 @@ BS.DeviceManager.AddEventListener("connectedDevices", (event) => {
561
710
  });
562
711
 
563
712
  /** @type {HTMLSpanElement} */
564
- const tfliteTaskSpan = connectedDeviceContainer.querySelector(".tfliteTask");
713
+ const tfliteTaskSpan =
714
+ connectedDeviceContainer.querySelector(".tfliteTask");
565
715
  /** @type {HTMLSelectElement} */
566
- const setTfliteTaskSelect = connectedDeviceContainer.querySelector(".setTfliteTaskSelect");
716
+ const setTfliteTaskSelect = connectedDeviceContainer.querySelector(
717
+ ".setTfliteTaskSelect"
718
+ );
567
719
  /** @type {HTMLOptGroupElement} */
568
- const setTfliteTaskOptgroup = setTfliteTaskSelect.querySelector("optgroup");
720
+ const setTfliteTaskOptgroup =
721
+ setTfliteTaskSelect.querySelector("optgroup");
569
722
  /** @type {HTMLButtonElement} */
570
- const setTfliteTaskButton = connectedDeviceContainer.querySelector(".setTfliteTaskButton");
723
+ const setTfliteTaskButton = connectedDeviceContainer.querySelector(
724
+ ".setTfliteTaskButton"
725
+ );
571
726
 
572
727
  BS.TfliteTasks.forEach((task) => {
573
728
  setTfliteTaskOptgroup.appendChild(new Option(task));
@@ -589,11 +744,16 @@ BS.DeviceManager.AddEventListener("connectedDevices", (event) => {
589
744
  });
590
745
 
591
746
  /** @type {HTMLSpanElement} */
592
- const tfliteSampleRateSpan = connectedDeviceContainer.querySelector(".tfliteSampleRate");
747
+ const tfliteSampleRateSpan =
748
+ connectedDeviceContainer.querySelector(".tfliteSampleRate");
593
749
  /** @type {HTMLInputElement} */
594
- const setTfliteSampleRateInput = connectedDeviceContainer.querySelector(".setTfliteSampleRateInput");
750
+ const setTfliteSampleRateInput = connectedDeviceContainer.querySelector(
751
+ ".setTfliteSampleRateInput"
752
+ );
595
753
  /** @type {HTMLButtonElement} */
596
- const setTfliteSampleRateButton = connectedDeviceContainer.querySelector(".setTfliteSampleRateButton");
754
+ const setTfliteSampleRateButton = connectedDeviceContainer.querySelector(
755
+ ".setTfliteSampleRateButton"
756
+ );
597
757
 
598
758
  device.addEventListener("getTfliteSampleRate", () => {
599
759
  tfliteSampleRateSpan.innerText = device.tfliteSampleRate;
@@ -618,22 +778,30 @@ BS.DeviceManager.AddEventListener("connectedDevices", (event) => {
618
778
  setTfliteSampleRateButton.disabled = device.tfliteInferencingEnabled;
619
779
  });
620
780
 
621
- const tfliteSensorTypesContainer = connectedDeviceContainer.querySelector(".tfliteSensorTypes");
781
+ const tfliteSensorTypesContainer =
782
+ connectedDeviceContainer.querySelector(".tfliteSensorTypes");
622
783
  /** @type {HTMLTemplateElement} */
623
- const tfliteSensorTypeTemplate = connectedDeviceContainer.querySelector(".tfliteSensorTypeTemplate");
784
+ const tfliteSensorTypeTemplate = connectedDeviceContainer.querySelector(
785
+ ".tfliteSensorTypeTemplate"
786
+ );
624
787
  /** @type {Object.<string, HTMLElement>} */
625
788
  const tfliteSensorTypeContainers = {};
626
789
  /** @type {BS.SensorType[]} */
627
790
  let tfliteSensorTypes = [];
628
791
  /** @type {HTMLButtonElement} */
629
- const setTfliteSensorTypesButton = connectedDeviceContainer.querySelector(".setTfliteSensorTypes");
792
+ const setTfliteSensorTypesButton = connectedDeviceContainer.querySelector(
793
+ ".setTfliteSensorTypes"
794
+ );
630
795
 
631
796
  BS.TfliteSensorTypes.forEach((sensorType) => {
632
- const sensorTypeContainer = tfliteSensorTypeTemplate.content.cloneNode(true).querySelector(".sensorType");
797
+ const sensorTypeContainer = tfliteSensorTypeTemplate.content
798
+ .cloneNode(true)
799
+ .querySelector(".sensorType");
633
800
  sensorTypeContainer.querySelector(".name").innerText = sensorType;
634
801
 
635
802
  /** @type {HTMLInputElement} */
636
- const isSensorEnabledInput = sensorTypeContainer.querySelector(".enabled");
803
+ const isSensorEnabledInput =
804
+ sensorTypeContainer.querySelector(".enabled");
637
805
  isSensorEnabledInput.addEventListener("input", () => {
638
806
  if (isSensorEnabledInput.checked) {
639
807
  tfliteSensorTypes.push(sensorType);
@@ -644,9 +812,11 @@ BS.DeviceManager.AddEventListener("connectedDevices", (event) => {
644
812
  });
645
813
 
646
814
  device.addEventListener("getTfliteSensorTypes", () => {
647
- isSensorEnabledInput.checked = device.tfliteSensorTypes.includes(sensorType);
815
+ isSensorEnabledInput.checked =
816
+ device.tfliteSensorTypes.includes(sensorType);
648
817
  });
649
- isSensorEnabledInput.checked = device.tfliteSensorTypes.includes(sensorType);
818
+ isSensorEnabledInput.checked =
819
+ device.tfliteSensorTypes.includes(sensorType);
650
820
 
651
821
  tfliteSensorTypeContainers[sensorType] = sensorTypeContainer;
652
822
 
@@ -672,18 +842,24 @@ BS.DeviceManager.AddEventListener("connectedDevices", (event) => {
672
842
  setTfliteSensorTypesButton.disabled = false;
673
843
 
674
844
  /** @type {HTMLInputElement} */
675
- const setTfliteIsReadyInput = connectedDeviceContainer.querySelector(".tfliteIsReady");
845
+ const setTfliteIsReadyInput =
846
+ connectedDeviceContainer.querySelector(".tfliteIsReady");
676
847
  device.addEventListener("tfliteIsReady", () => {
677
848
  setTfliteIsReadyInput.checked = device.tfliteIsReady;
678
849
  });
679
850
  setTfliteIsReadyInput.checked = device.tfliteIsReady;
680
851
 
681
852
  /** @type {HTMLSpanElement} */
682
- const tfliteThresholdSpan = connectedDeviceContainer.querySelector(".tfliteThreshold");
853
+ const tfliteThresholdSpan =
854
+ connectedDeviceContainer.querySelector(".tfliteThreshold");
683
855
  /** @type {HTMLInputElement} */
684
- const setTfliteThresholdInput = connectedDeviceContainer.querySelector(".setTfliteThresholdInput");
856
+ const setTfliteThresholdInput = connectedDeviceContainer.querySelector(
857
+ ".setTfliteThresholdInput"
858
+ );
685
859
  /** @type {HTMLButtonElement} */
686
- const setTfliteThresholdButton = connectedDeviceContainer.querySelector(".setTfliteThresholdButton");
860
+ const setTfliteThresholdButton = connectedDeviceContainer.querySelector(
861
+ ".setTfliteThresholdButton"
862
+ );
687
863
 
688
864
  device.addEventListener("getTfliteThreshold", () => {
689
865
  tfliteThresholdSpan.innerText = device.tfliteThreshold;
@@ -706,11 +882,16 @@ BS.DeviceManager.AddEventListener("connectedDevices", (event) => {
706
882
  });
707
883
 
708
884
  /** @type {HTMLSpanElement} */
709
- const tfliteCaptureDelaySpan = connectedDeviceContainer.querySelector(".tfliteCaptureDelay");
885
+ const tfliteCaptureDelaySpan = connectedDeviceContainer.querySelector(
886
+ ".tfliteCaptureDelay"
887
+ );
710
888
  /** @type {HTMLInputElement} */
711
- const setTfliteCaptureDelayInput = connectedDeviceContainer.querySelector(".setTfliteCaptureDelayInput");
889
+ const setTfliteCaptureDelayInput = connectedDeviceContainer.querySelector(
890
+ ".setTfliteCaptureDelayInput"
891
+ );
712
892
  /** @type {HTMLButtonElement} */
713
- const setTfliteCaptureDelayButton = connectedDeviceContainer.querySelector(".setTfliteCaptureDelayButton");
893
+ const setTfliteCaptureDelayButton =
894
+ connectedDeviceContainer.querySelector(".setTfliteCaptureDelayButton");
714
895
 
715
896
  device.addEventListener("getTfliteCaptureDelay", () => {
716
897
  tfliteCaptureDelaySpan.innerText = device.tfliteCaptureDelay;
@@ -733,19 +914,22 @@ BS.DeviceManager.AddEventListener("connectedDevices", (event) => {
733
914
  });
734
915
 
735
916
  /** @type {HTMLInputElement} */
736
- const tfliteInferencingEnabledInput = connectedDeviceContainer.querySelector(".tfliteInferencingEnabled");
917
+ const tfliteInferencingEnabledInput =
918
+ connectedDeviceContainer.querySelector(".tfliteInferencingEnabled");
737
919
  /** @type {HTMLButtonElement} */
738
- const toggleTfliteInferencingEnabledButton = connectedDeviceContainer.querySelector(
739
- ".toggleTfliteInferencingEnabled"
740
- );
920
+ const toggleTfliteInferencingEnabledButton =
921
+ connectedDeviceContainer.querySelector(
922
+ ".toggleTfliteInferencingEnabled"
923
+ );
741
924
 
742
925
  const updateTfliteInferencingUI = () => {
743
926
  toggleTfliteInferencingEnabledButton.disabled = !device.tfliteIsReady;
744
927
 
745
928
  tfliteInferencingEnabledInput.checked = device.tfliteInferencingEnabled;
746
- toggleTfliteInferencingEnabledButton.innerText = device.tfliteInferencingEnabled
747
- ? "disable inferencing"
748
- : "enable inferencing";
929
+ toggleTfliteInferencingEnabledButton.innerText =
930
+ device.tfliteInferencingEnabled
931
+ ? "disable inferencing"
932
+ : "enable inferencing";
749
933
  };
750
934
 
751
935
  device.addEventListener("tfliteIsReady", () => {
@@ -753,9 +937,10 @@ BS.DeviceManager.AddEventListener("connectedDevices", (event) => {
753
937
  });
754
938
  device.addEventListener("getTfliteInferencingEnabled", () => {
755
939
  tfliteInferencingEnabledInput.checked = device.tfliteInferencingEnabled;
756
- toggleTfliteInferencingEnabledButton.innerText = device.tfliteInferencingEnabled
757
- ? "disable inferencing"
758
- : "enable inferencing";
940
+ toggleTfliteInferencingEnabledButton.innerText =
941
+ device.tfliteInferencingEnabled
942
+ ? "disable inferencing"
943
+ : "enable inferencing";
759
944
  });
760
945
  updateTfliteInferencingUI();
761
946
 
@@ -764,10 +949,15 @@ BS.DeviceManager.AddEventListener("connectedDevices", (event) => {
764
949
  });
765
950
 
766
951
  /** @type {HTMLPreElement} */
767
- const tfliteInferencePre = connectedDeviceContainer.querySelector(".tfliteInference");
952
+ const tfliteInferencePre =
953
+ connectedDeviceContainer.querySelector(".tfliteInference");
768
954
  device.addEventListener("tfliteInference", (event) => {
769
955
  console.log("inference", event.message.tfliteInference);
770
- tfliteInferencePre.textContent = JSON.stringify(event.message.tfliteInference, null, 2);
956
+ tfliteInferencePre.textContent = JSON.stringify(
957
+ event.message.tfliteInference,
958
+ null,
959
+ 2
960
+ );
771
961
  });
772
962
 
773
963
  const updateTfliteUI = () => {
@@ -798,13 +988,16 @@ BS.DeviceManager.AddEventListener("connectedDevices", (event) => {
798
988
  let firmware;
799
989
 
800
990
  /** @type {HTMLInputElement} */
801
- const firmwareInput = connectedDeviceContainer.querySelector(".firmwareInput");
991
+ const firmwareInput =
992
+ connectedDeviceContainer.querySelector(".firmwareInput");
802
993
  firmwareInput.addEventListener("input", () => {
803
994
  firmware = firmwareInput.files[0];
804
995
  updateToggleFirmwareUploadButton();
805
996
  });
806
997
  /** @type {HTMLButtonElement} */
807
- const toggleFirmwareUploadButton = connectedDeviceContainer.querySelector(".toggleFirmwareUpload");
998
+ const toggleFirmwareUploadButton = connectedDeviceContainer.querySelector(
999
+ ".toggleFirmwareUpload"
1000
+ );
808
1001
  toggleFirmwareUploadButton.addEventListener("click", () => {
809
1002
  device.uploadFirmware(firmware);
810
1003
  });
@@ -817,26 +1010,34 @@ BS.DeviceManager.AddEventListener("connectedDevices", (event) => {
817
1010
  });
818
1011
 
819
1012
  /** @type {HTMLProgressElement} */
820
- const firmwareUploadProgress = connectedDeviceContainer.querySelector(".firmwareUploadProgress");
821
- /** @type {HTMLSpanElement} */
822
- const firmwareUploadProgressPercentageSpan = connectedDeviceContainer.querySelector(
823
- ".firmwareUploadProgressPercentage"
1013
+ const firmwareUploadProgress = connectedDeviceContainer.querySelector(
1014
+ ".firmwareUploadProgress"
824
1015
  );
1016
+ /** @type {HTMLSpanElement} */
1017
+ const firmwareUploadProgressPercentageSpan =
1018
+ connectedDeviceContainer.querySelector(
1019
+ ".firmwareUploadProgressPercentage"
1020
+ );
825
1021
  device.addEventListener("firmwareUploadProgress", (event) => {
826
1022
  const progress = event.message.firmwareUploadProgress;
827
1023
  firmwareUploadProgress.value = progress;
828
- firmwareUploadProgressPercentageSpan.innerText = `${Math.floor(100 * progress)}%`;
1024
+ firmwareUploadProgressPercentageSpan.innerText = `${Math.floor(
1025
+ 100 * progress
1026
+ )}%`;
829
1027
  });
830
1028
  device.addEventListener("firmwareUploadComplete", () => {
831
1029
  firmwareUploadProgress.value = 0;
832
1030
  });
833
1031
  device.addEventListener("firmwareStatus", () => {
834
1032
  const isUploading = device.firmwareStatus == "uploading";
835
- firmwareUploadProgressPercentageSpan.style.display = isUploading ? "" : "none";
1033
+ firmwareUploadProgressPercentageSpan.style.display = isUploading
1034
+ ? ""
1035
+ : "none";
836
1036
  });
837
1037
 
838
1038
  /** @type {HTMLPreElement} */
839
- const firmwareImagesPre = connectedDeviceContainer.querySelector(".firmwareImages");
1039
+ const firmwareImagesPre =
1040
+ connectedDeviceContainer.querySelector(".firmwareImages");
840
1041
  device.addEventListener("firmwareImages", () => {
841
1042
  firmwareImagesPre.textContent = JSON.stringify(
842
1043
  device.firmwareImages,
@@ -846,13 +1047,14 @@ BS.DeviceManager.AddEventListener("connectedDevices", (event) => {
846
1047
  });
847
1048
 
848
1049
  device.addEventListener("isConnected", () => {
849
- if (device.isConnected) {
1050
+ if (device.isConnected && device.canUpdateFirmware) {
850
1051
  device.getFirmwareImages();
851
1052
  }
852
1053
  });
853
1054
 
854
1055
  /** @type {HTMLSpanElement} */
855
- const firmwareStatusSpan = connectedDeviceContainer.querySelector(".firmwareStatus");
1056
+ const firmwareStatusSpan =
1057
+ connectedDeviceContainer.querySelector(".firmwareStatus");
856
1058
 
857
1059
  /** @type {HTMLButtonElement} */
858
1060
  const resetButton = connectedDeviceContainer.querySelector(".reset");
@@ -867,7 +1069,8 @@ BS.DeviceManager.AddEventListener("connectedDevices", (event) => {
867
1069
  };
868
1070
 
869
1071
  /** @type {HTMLButtonElement} */
870
- const testFirmwareImageButton = connectedDeviceContainer.querySelector(".testFirmwareImage");
1072
+ const testFirmwareImageButton =
1073
+ connectedDeviceContainer.querySelector(".testFirmwareImage");
871
1074
  testFirmwareImageButton.addEventListener("click", () => {
872
1075
  device.testFirmwareImage();
873
1076
  });
@@ -877,7 +1080,9 @@ BS.DeviceManager.AddEventListener("connectedDevices", (event) => {
877
1080
  };
878
1081
 
879
1082
  /** @type {HTMLButtonElement} */
880
- const confirmFirmwareImageButton = connectedDeviceContainer.querySelector(".confirmFirmwareImage");
1083
+ const confirmFirmwareImageButton = connectedDeviceContainer.querySelector(
1084
+ ".confirmFirmwareImage"
1085
+ );
881
1086
  confirmFirmwareImageButton.addEventListener("click", () => {
882
1087
  device.confirmFirmwareImage();
883
1088
  });
@@ -887,7 +1092,9 @@ BS.DeviceManager.AddEventListener("connectedDevices", (event) => {
887
1092
  };
888
1093
 
889
1094
  /** @type {HTMLButtonElement} */
890
- const eraseFirmwareImageButton = connectedDeviceContainer.querySelector(".eraseFirmwareImage");
1095
+ const eraseFirmwareImageButton = connectedDeviceContainer.querySelector(
1096
+ ".eraseFirmwareImage"
1097
+ );
891
1098
  eraseFirmwareImageButton.addEventListener("click", () => {
892
1099
  device.eraseFirmwareImage();
893
1100
  });
@@ -909,13 +1116,17 @@ BS.DeviceManager.AddEventListener("connectedDevices", (event) => {
909
1116
  });
910
1117
  updateFirmwareUI();
911
1118
 
912
- device.getFirmwareImages();
1119
+ if (device.canUpdateFirmware) {
1120
+ device.getFirmwareImages();
1121
+ }
913
1122
  }
914
1123
  connectedDevicesContainer.appendChild(connectedDeviceContainer);
915
1124
  });
916
1125
 
917
1126
  for (const id in connectedDeviceContainers) {
918
- const connectedDevice = connectedDevices.find((connectedDevice) => connectedDevice.bluetoothId == id);
1127
+ const connectedDevice = connectedDevices.find(
1128
+ (connectedDevice) => connectedDevice.bluetoothId == id
1129
+ );
919
1130
  if (!connectedDevice) {
920
1131
  console.log("remove", id);
921
1132
  connectedDeviceContainers[id].remove();