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
@@ -67,7 +67,17 @@
67
67
  <template id="sensorTypeConfigurationTemplate">
68
68
  <label class="sensorTypeConfiguration">
69
69
  <b class="sensorType"></b>
70
- <input class="sensorRate" type="number" min="0" value="" disabled />
70
+ <!-- <input class="sensorRate" type="number" min="0" value="" disabled /> -->
71
+ <select class="sensorRate input">
72
+ <optgroup label="sensor rate (ms)">
73
+ <option value="0">0ms</option>
74
+ <option value="5">5ms</option>
75
+ <option value="10">10ms</option>
76
+ <option value="20">20ms</option>
77
+ <option value="40">40ms</option>
78
+ <option value="100">100ms</option>
79
+ </optgroup>
80
+ </select>
71
81
  </label>
72
82
  </template>
73
83
  </div>
@@ -12,7 +12,9 @@ window.device = device;
12
12
  // GET DEVICES
13
13
 
14
14
  /** @type {HTMLTemplateElement} */
15
- const availableDeviceTemplate = document.getElementById("availableDeviceTemplate");
15
+ const availableDeviceTemplate = document.getElementById(
16
+ "availableDeviceTemplate"
17
+ );
16
18
  const availableDevicesContainer = document.getElementById("availableDevices");
17
19
  /** @param {BS.Device[]} availableDevices */
18
20
  function onAvailableDevices(availableDevices) {
@@ -24,19 +26,24 @@ function onAvailableDevices(availableDevices) {
24
26
  const availableDeviceContainer = availableDeviceTemplate.content
25
27
  .cloneNode(true)
26
28
  .querySelector(".availableDevice");
27
- availableDeviceContainer.querySelector(".name").innerText = availableDevice.name;
28
- availableDeviceContainer.querySelector(".type").innerText = availableDevice.type;
29
+ availableDeviceContainer.querySelector(".name").innerText =
30
+ availableDevice.name;
31
+ availableDeviceContainer.querySelector(".type").innerText =
32
+ availableDevice.type;
29
33
 
30
34
  /** @type {HTMLButtonElement} */
31
- const toggleConnectionButton = availableDeviceContainer.querySelector(".toggleConnection");
35
+ const toggleConnectionButton =
36
+ availableDeviceContainer.querySelector(".toggleConnection");
32
37
  toggleConnectionButton.addEventListener("click", () => {
33
38
  device.connectionManager = availableDevice.connectionManager;
34
39
  device.reconnect();
35
40
  });
36
41
  device.addEventListener("connectionStatus", () => {
37
- toggleConnectionButton.disabled = device.connectionStatus != "notConnected";
42
+ toggleConnectionButton.disabled =
43
+ device.connectionStatus != "notConnected";
38
44
  });
39
- toggleConnectionButton.disabled = device.connectionStatus != "notConnected";
45
+ toggleConnectionButton.disabled =
46
+ device.connectionStatus != "notConnected";
40
47
 
41
48
  availableDevicesContainer.appendChild(availableDeviceContainer);
42
49
  });
@@ -75,7 +82,9 @@ device.addEventListener("connectionStatus", () => {
75
82
  case "connected":
76
83
  case "notConnected":
77
84
  toggleConnectionButton.disabled = false;
78
- toggleConnectionButton.innerText = device.isConnected ? "disconnect" : "connect";
85
+ toggleConnectionButton.innerText = device.isConnected
86
+ ? "disconnect"
87
+ : "connect";
79
88
  break;
80
89
  case "connecting":
81
90
  case "disconnecting":
@@ -99,15 +108,20 @@ function onConnectedDevice(connectedDevice) {
99
108
  // SENSOR CONFIGURATION
100
109
 
101
110
  /** @type {HTMLTemplateElement} */
102
- const sensorTypeConfigurationTemplate = document.getElementById("sensorTypeConfigurationTemplate");
111
+ const sensorTypeConfigurationTemplate = document.getElementById(
112
+ "sensorTypeConfigurationTemplate"
113
+ );
103
114
  BS.ContinuousSensorTypes.forEach((sensorType) => {
104
- const sensorTypeConfigurationContainer = sensorTypeConfigurationTemplate.content
105
- .cloneNode(true)
106
- .querySelector(".sensorTypeConfiguration");
107
- sensorTypeConfigurationContainer.querySelector(".sensorType").innerText = sensorType;
115
+ const sensorTypeConfigurationContainer =
116
+ sensorTypeConfigurationTemplate.content
117
+ .cloneNode(true)
118
+ .querySelector(".sensorTypeConfiguration");
119
+ sensorTypeConfigurationContainer.querySelector(".sensorType").innerText =
120
+ sensorType;
108
121
 
109
122
  /** @type {HTMLInputElement} */
110
- const sensorRateInput = sensorTypeConfigurationContainer.querySelector(".sensorRate");
123
+ const sensorRateInput =
124
+ sensorTypeConfigurationContainer.querySelector(".sensorRate");
111
125
  sensorRateInput.value = 0;
112
126
  sensorRateInput.max = BS.MaxSensorRate;
113
127
  sensorRateInput.step = BS.SensorRateStep;
@@ -117,15 +131,20 @@ BS.ContinuousSensorTypes.forEach((sensorType) => {
117
131
  device.setSensorConfiguration({ [sensorType]: sensorRate });
118
132
  });
119
133
 
120
- sensorTypeConfigurationTemplate.parentElement.appendChild(sensorTypeConfigurationContainer);
134
+ sensorTypeConfigurationTemplate.parentElement.appendChild(
135
+ sensorTypeConfigurationContainer
136
+ );
121
137
  sensorTypeConfigurationContainer.dataset.sensorType = sensorType;
122
138
  });
123
139
  /** @param {BS.Device} device */
124
140
  function onSensorConfiguration(device) {
125
- for (const sensorType in device.sensorConfiguration) {
126
- const sensorRate = device.sensorConfiguration[sensorType];
141
+ BS.SensorTypes.forEach((sensorType) => {
142
+ const sensorRate = device.sensorConfiguration[sensorType] ?? 0;
143
+
127
144
  /** @type {HTMLInputElement?} */
128
- const input = document.querySelector(`.sensorTypeConfiguration[data-sensor-type="${sensorType}"] input`);
145
+ const input = document.querySelector(
146
+ `.sensorTypeConfiguration[data-sensor-type="${sensorType}"] .input`
147
+ );
129
148
  if (input) {
130
149
  input.value = sensorRate;
131
150
  }
@@ -146,17 +165,21 @@ function onSensorConfiguration(device) {
146
165
  chartContainer.style.display = display;
147
166
  });
148
167
  }
149
- }
168
+ });
150
169
  }
151
170
  /** @param {BS.Device} device */
152
171
  function updateSensorRateInputs(device) {
153
- for (const sensorType in device.sensorConfiguration) {
172
+ BS.SensorTypes.forEach((sensorType) => {
154
173
  /** @type {HTMLInputElement?} */
155
- const input = document.querySelector(`[data-sensor-type="${sensorType}"] input`);
174
+ const input = document.querySelector(
175
+ `[data-sensor-type="${sensorType}"] .input`
176
+ );
156
177
  if (input) {
157
- input.disabled = !device.isConnected;
178
+ const containsSensorType = sensorType in device.sensorConfiguration;
179
+ input.closest("label").style.display = containsSensorType ? "" : "none";
180
+ input.disabled = !device.isConnected || !containsSensorType;
158
181
  }
159
- }
182
+ });
160
183
  }
161
184
 
162
185
  // GRAPHING
@@ -276,7 +299,9 @@ window.chartContainers = chartContainers;
276
299
  /** @type {HTMLTemplateElement} */
277
300
  const chartTemplate = document.getElementById("chartTemplate");
278
301
  BS.ContinuousSensorTypes.forEach((sensorType) => {
279
- const chartContainer = chartTemplate.content.cloneNode(true).querySelector(".chart");
302
+ const chartContainer = chartTemplate.content
303
+ .cloneNode(true)
304
+ .querySelector(".chart");
280
305
  chartsContainer.appendChild(chartContainer);
281
306
  chartContainers[sensorType] = chartContainer;
282
307
 
@@ -299,6 +324,12 @@ BS.ContinuousSensorTypes.forEach((sensorType) => {
299
324
  case "rotation":
300
325
  axesLabels = ["x", "y", "z", "w"];
301
326
  break;
327
+ case "orientation":
328
+ axesLabels = ["heading", "pitch", "roll"];
329
+ break;
330
+ case "barometer":
331
+ axesLabels = ["barometer"];
332
+ break;
302
333
  default:
303
334
  console.warn(`uncaught sensorType "${sensorType}"`);
304
335
  return;
@@ -323,36 +354,53 @@ BS.ContinuousSensorTypes.forEach((sensorType) => {
323
354
  yRange = { min: -360, max: 360 };
324
355
  break;
325
356
  case "magnetometer":
326
- // FILL
357
+ yRange = { min: -100, max: 100 };
327
358
  break;
328
359
  case "gameRotation":
329
360
  case "rotation":
330
361
  yRange = { min: -1, max: 1 };
331
362
  break;
363
+ case "orientation":
364
+ yRange = { min: -360, max: 360 };
365
+ break;
332
366
  }
333
367
 
334
368
  switch (sensorType) {
335
369
  case "gameRotation":
336
370
  case "rotation":
337
371
  {
338
- const eulerChartContainer = chartTemplate.content.cloneNode(true).querySelector(".chart");
372
+ const eulerChartContainer = chartTemplate.content
373
+ .cloneNode(true)
374
+ .querySelector(".chart");
339
375
  chartsContainer.appendChild(eulerChartContainer);
340
376
  chartContainers[`${sensorType}.euler`] = eulerChartContainer;
341
- createChart(eulerChartContainer.querySelector("canvas"), sensorType + "Euler", ["yaw", "pitch", "roll"], {
342
- min: -Math.PI,
343
- max: Math.PI,
344
- });
377
+ createChart(
378
+ eulerChartContainer.querySelector("canvas"),
379
+ sensorType + "Euler",
380
+ ["yaw", "pitch", "roll"],
381
+ {
382
+ min: -Math.PI,
383
+ max: Math.PI,
384
+ }
385
+ );
345
386
  }
346
387
  break;
347
388
  case "pressure":
348
389
  {
349
- const pressureMetadataChartContainer = chartTemplate.content.cloneNode(true).querySelector(".chart");
390
+ const pressureMetadataChartContainer = chartTemplate.content
391
+ .cloneNode(true)
392
+ .querySelector(".chart");
350
393
  chartsContainer.appendChild(pressureMetadataChartContainer);
351
394
  chartContainers["pressureMetadata"] = pressureMetadataChartContainer;
352
- createChart(pressureMetadataChartContainer.querySelector("canvas"), "pressureMetadata", ["sum", "x", "y"], {
353
- min: 0,
354
- max: 1,
355
- });
395
+ createChart(
396
+ pressureMetadataChartContainer.querySelector("canvas"),
397
+ "pressureMetadata",
398
+ ["sum", "x", "y"],
399
+ {
400
+ min: 0,
401
+ max: 1,
402
+ }
403
+ );
356
404
  }
357
405
  break;
358
406
  }
@@ -361,7 +409,12 @@ BS.ContinuousSensorTypes.forEach((sensorType) => {
361
409
  const euler = new THREE.Euler();
362
410
  euler.reorder("YXZ");
363
411
 
364
- createChart(chartContainer.querySelector("canvas"), sensorType, axesLabels, yRange);
412
+ createChart(
413
+ chartContainer.querySelector("canvas"),
414
+ sensorType,
415
+ axesLabels,
416
+ yRange
417
+ );
365
418
  });
366
419
 
367
420
  /** @param {BS.Device} device */
@@ -437,12 +490,16 @@ if (false)
437
490
 
438
491
  const websocketClient = new BS.WebSocketClient();
439
492
  /** @type {HTMLButtonElement} */
440
- const toggleServerConnectionButton = document.getElementById("toggleServerConnection");
493
+ const toggleServerConnectionButton = document.getElementById(
494
+ "toggleServerConnection"
495
+ );
441
496
  toggleServerConnectionButton.addEventListener("click", () => {
442
497
  websocketClient.toggleConnection();
443
498
  });
444
499
  websocketClient.addEventListener("isConnected", () => {
445
- toggleServerConnectionButton.innerText = websocketClient.isConnected ? "disconnect from server" : "connect to server";
500
+ toggleServerConnectionButton.innerText = websocketClient.isConnected
501
+ ? "disconnect from server"
502
+ : "connect to server";
446
503
  });
447
504
  websocketClient.addEventListener("connectionStatus", () => {
448
505
  let disabled;
@@ -12,7 +12,6 @@
12
12
  }
13
13
  .insole {
14
14
  position: relative;
15
- height: 500px;
16
15
  }
17
16
  img:not(.overlay) {
18
17
  position: relative;
@@ -20,7 +19,9 @@
20
19
  img.overlay {
21
20
  position: absolute;
22
21
  }
23
- .insole.left .viz {
22
+ .insole.left * [data-pressure],
23
+ .insole.left * [data-haptics],
24
+ .insole.left * img {
24
25
  -webkit-transform: scaleX(-1);
25
26
  transform: scaleX(-1);
26
27
  }
@@ -45,47 +46,180 @@
45
46
  [data-haptics] {
46
47
  /* background-color: blue;*/
47
48
  }
48
- [data-pressure="0"] {
49
+
50
+ /* Default pressure images */
51
+ .viz:not(.ukaton) [data-pressure="0"] {
49
52
  -webkit-mask-image: url(../../assets/images/pressure-0.svg);
50
53
  mask-image: url(../../assets/images/pressure-0.svg);
51
54
  }
52
- [data-pressure="1"] {
55
+ .viz:not(.ukaton) [data-pressure="1"] {
53
56
  -webkit-mask-image: url(../../assets/images/pressure-1.svg);
54
57
  mask-image: url(../../assets/images/pressure-1.svg);
55
58
  }
56
- [data-pressure="2"] {
59
+ .viz:not(.ukaton) [data-pressure="2"] {
57
60
  -webkit-mask-image: url(../../assets/images/pressure-2.svg);
58
61
  mask-image: url(../../assets/images/pressure-2.svg);
59
62
  }
60
- [data-pressure="3"] {
63
+ .viz:not(.ukaton) [data-pressure="3"] {
61
64
  -webkit-mask-image: url(../../assets/images/pressure-3.svg);
62
65
  mask-image: url(../../assets/images/pressure-3.svg);
63
66
  }
64
- [data-pressure="4"] {
67
+ .viz:not(.ukaton) [data-pressure="4"] {
65
68
  -webkit-mask-image: url(../../assets/images/pressure-4.svg);
66
69
  mask-image: url(../../assets/images/pressure-4.svg);
67
70
  }
68
- [data-pressure="5"] {
71
+ .viz:not(.ukaton) [data-pressure="5"] {
69
72
  -webkit-mask-image: url(../../assets/images/pressure-5.svg);
70
73
  mask-image: url(../../assets/images/pressure-5.svg);
71
74
  }
72
- [data-pressure="6"] {
75
+ .viz:not(.ukaton) [data-pressure="6"] {
73
76
  -webkit-mask-image: url(../../assets/images/pressure-6.svg);
74
77
  mask-image: url(../../assets/images/pressure-6.svg);
75
78
  }
76
- [data-pressure="7"] {
79
+ .viz:not(.ukaton) [data-pressure="7"] {
77
80
  -webkit-mask-image: url(../../assets/images/pressure-7.svg);
78
81
  mask-image: url(../../assets/images/pressure-7.svg);
79
82
  }
83
+ .viz:not(.ukaton) [data-pressure="8"] {
84
+ display: none;
85
+ }
86
+ .viz:not(.ukaton) [data-pressure="9"] {
87
+ display: none;
88
+ }
89
+ .viz:not(.ukaton) [data-pressure="10"] {
90
+ display: none;
91
+ }
92
+ .viz:not(.ukaton) [data-pressure="11"] {
93
+ display: none;
94
+ }
95
+ .viz:not(.ukaton) [data-pressure="12"] {
96
+ display: none;
97
+ }
98
+ .viz:not(.ukaton) [data-pressure="13"] {
99
+ display: none;
100
+ }
101
+ .viz:not(.ukaton) [data-pressure="14"] {
102
+ display: none;
103
+ }
104
+ .viz:not(.ukaton) [data-pressure="15"] {
105
+ display: none;
106
+ }
107
+
108
+ /* Ukaton-specific pressure images */
109
+ .viz.ukaton [data-pressure="0"] {
110
+ -webkit-mask-image: url(../../assets/images/ukaton-pressure-0.svg);
111
+ mask-image: url(../../assets/images/ukaton-pressure-0.svg);
112
+ }
113
+ .viz.ukaton [data-pressure="1"] {
114
+ -webkit-mask-image: url(../../assets/images/ukaton-pressure-1.svg);
115
+ mask-image: url(../../assets/images/ukaton-pressure-1.svg);
116
+ }
117
+ .viz.ukaton [data-pressure="2"] {
118
+ -webkit-mask-image: url(../../assets/images/ukaton-pressure-2.svg);
119
+ mask-image: url(../../assets/images/ukaton-pressure-2.svg);
120
+ }
121
+ .viz.ukaton [data-pressure="3"] {
122
+ -webkit-mask-image: url(../../assets/images/ukaton-pressure-3.svg);
123
+ mask-image: url(../../assets/images/ukaton-pressure-3.svg);
124
+ }
125
+ .viz.ukaton [data-pressure="4"] {
126
+ -webkit-mask-image: url(../../assets/images/ukaton-pressure-4.svg);
127
+ mask-image: url(../../assets/images/ukaton-pressure-4.svg);
128
+ }
129
+ .viz.ukaton [data-pressure="5"] {
130
+ -webkit-mask-image: url(../../assets/images/ukaton-pressure-5.svg);
131
+ mask-image: url(../../assets/images/ukaton-pressure-5.svg);
132
+ }
133
+ .viz.ukaton [data-pressure="6"] {
134
+ -webkit-mask-image: url(../../assets/images/ukaton-pressure-6.svg);
135
+ mask-image: url(../../assets/images/ukaton-pressure-6.svg);
136
+ }
137
+ .viz.ukaton [data-pressure="7"] {
138
+ -webkit-mask-image: url(../../assets/images/ukaton-pressure-7.svg);
139
+ mask-image: url(../../assets/images/ukaton-pressure-7.svg);
140
+ }
141
+ .viz.ukaton [data-pressure="8"] {
142
+ -webkit-mask-image: url(../../assets/images/ukaton-pressure-8.svg);
143
+ mask-image: url(../../assets/images/ukaton-pressure-8.svg);
144
+ }
145
+ .viz.ukaton [data-pressure="9"] {
146
+ -webkit-mask-image: url(../../assets/images/ukaton-pressure-9.svg);
147
+ mask-image: url(../../assets/images/ukaton-pressure-9.svg);
148
+ }
149
+ .viz.ukaton [data-pressure="10"] {
150
+ -webkit-mask-image: url(../../assets/images/ukaton-pressure-10.svg);
151
+ mask-image: url(../../assets/images/ukaton-pressure-10.svg);
152
+ }
153
+ .viz.ukaton [data-pressure="11"] {
154
+ -webkit-mask-image: url(../../assets/images/ukaton-pressure-11.svg);
155
+ mask-image: url(../../assets/images/ukaton-pressure-11.svg);
156
+ }
157
+ .viz.ukaton [data-pressure="12"] {
158
+ -webkit-mask-image: url(../../assets/images/ukaton-pressure-12.svg);
159
+ mask-image: url(../../assets/images/ukaton-pressure-12.svg);
160
+ }
161
+ .viz.ukaton [data-pressure="13"] {
162
+ -webkit-mask-image: url(../../assets/images/ukaton-pressure-13.svg);
163
+ mask-image: url(../../assets/images/ukaton-pressure-13.svg);
164
+ }
165
+ .viz.ukaton [data-pressure="14"] {
166
+ -webkit-mask-image: url(../../assets/images/ukaton-pressure-14.svg);
167
+ mask-image: url(../../assets/images/ukaton-pressure-14.svg);
168
+ }
169
+ .viz.ukaton [data-pressure="15"] {
170
+ -webkit-mask-image: url(../../assets/images/ukaton-pressure-15.svg);
171
+ mask-image: url(../../assets/images/ukaton-pressure-15.svg);
172
+ }
80
173
 
81
- [data-haptics="front"] {
174
+ .viz [data-haptics="front"] {
82
175
  -webkit-mask-image: url(../../assets/images/haptics-front.svg);
83
176
  mask-image: url(../../assets/images/haptics-front.svg);
84
177
  }
85
- [data-haptics="rear"] {
178
+ .viz [data-haptics="rear"] {
86
179
  -webkit-mask-image: url(../../assets/images/haptics-rear.svg);
87
180
  mask-image: url(../../assets/images/haptics-rear.svg);
88
181
  }
182
+ .viz:not(.ukaton) [data-haptics] {
183
+ display: none;
184
+ }
185
+
186
+ .viz {
187
+ position: relative;
188
+ height: 500px;
189
+ }
190
+
191
+ .center,
192
+ .devicePairCenter {
193
+ position: absolute;
194
+ left: 0%;
195
+ bottom: 0%;
196
+ width: 20px;
197
+ height: 20px;
198
+ opacity: 0;
199
+ z-index: 2;
200
+ }
201
+ .center > div,
202
+ .devicePairCenter > div {
203
+ border-radius: 50%;
204
+ position: relative;
205
+ top: 50%;
206
+ left: -50%;
207
+ width: 100%;
208
+ height: 100%;
209
+ }
210
+ .center > div {
211
+ background-color: green;
212
+ }
213
+ .devicePairCenter > div {
214
+ background-color: orange;
215
+ }
216
+
217
+ .viz:not(.ukaton) img.ukaton {
218
+ display: none;
219
+ }
220
+ .viz.ukaton img:not(.ukaton) {
221
+ display: none;
222
+ }
89
223
  </style>
90
224
  <body>
91
225
  <nav>
@@ -115,6 +249,24 @@
115
249
  <button id="addDevice">add device</button>
116
250
  </p>
117
251
 
252
+ <p>
253
+ <label>
254
+ pressure visualization
255
+ <select id="pressureVisualizationMode">
256
+ <optgroup label="pressure visualization mode"></optgroup>
257
+ </select>
258
+ </label>
259
+ </p>
260
+
261
+ <p>
262
+ <label>
263
+ center of pressure visualization
264
+ <select id="centerOfPressureVisualizationMode">
265
+ <optgroup label="center of pressure visualization mode"></optgroup>
266
+ </select>
267
+ </label>
268
+ </p>
269
+
118
270
  <div id="insoles"></div>
119
271
 
120
272
  <template id="insoleTemplate">
@@ -125,6 +277,12 @@
125
277
  <button class="togglePressureData" disabled>enable pressure data</button>
126
278
  </p>
127
279
  <div class="viz">
280
+ <div class="center">
281
+ <div></div>
282
+ </div>
283
+ <div class="devicePairCenter">
284
+ <div></div>
285
+ </div>
128
286
  <div data-pressure="0"></div>
129
287
  <div data-pressure="1"></div>
130
288
  <div data-pressure="2"></div>
@@ -134,10 +292,20 @@
134
292
  <div data-pressure="6"></div>
135
293
  <div data-pressure="7"></div>
136
294
 
295
+ <div data-pressure="8" class="ukaton"></div>
296
+ <div data-pressure="9" class="ukaton"></div>
297
+ <div data-pressure="10" class="ukaton"></div>
298
+ <div data-pressure="11" class="ukaton"></div>
299
+ <div data-pressure="12" class="ukaton"></div>
300
+ <div data-pressure="13" class="ukaton"></div>
301
+ <div data-pressure="14" class="ukaton"></div>
302
+ <div data-pressure="15" class="ukaton"></div>
303
+
137
304
  <div data-haptics="front"></div>
138
305
  <div data-haptics="rear"></div>
139
306
 
140
307
  <img src="../../assets/images/right-insole.svg" />
308
+ <img class="ukaton" src="../../assets/images/ukaton-right-insole.svg" />
141
309
  </div>
142
310
  </div>
143
311
  </template>