brilliantsole 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (158) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +21 -0
  3. package/build/brilliantsole.cjs +5957 -0
  4. package/build/brilliantsole.cjs.map +1 -0
  5. package/build/brilliantsole.js +5448 -0
  6. package/build/brilliantsole.js.map +1 -0
  7. package/build/brilliantsole.ls.js +4872 -0
  8. package/build/brilliantsole.ls.js.map +1 -0
  9. package/build/brilliantsole.min.js +6 -0
  10. package/build/brilliantsole.min.js.map +1 -0
  11. package/build/brilliantsole.module.d.ts +908 -0
  12. package/build/brilliantsole.module.js +5412 -0
  13. package/build/brilliantsole.module.js.map +1 -0
  14. package/build/brilliantsole.module.min.d.ts +908 -0
  15. package/build/brilliantsole.module.min.js +6 -0
  16. package/build/brilliantsole.module.min.js.map +1 -0
  17. package/build/brilliantsole.node.module.d.ts +908 -0
  18. package/build/brilliantsole.node.module.js +5906 -0
  19. package/build/brilliantsole.node.module.js.map +1 -0
  20. package/build/dts/BS.d.ts +25 -0
  21. package/build/dts/Device.d.ts +136 -0
  22. package/build/dts/DeviceInformationManager.d.ts +56 -0
  23. package/build/dts/DeviceManager.d.ts +67 -0
  24. package/build/dts/FileTransferManager.d.ts +84 -0
  25. package/build/dts/FirmwareManager.d.ts +71 -0
  26. package/build/dts/InformationManager.d.ts +66 -0
  27. package/build/dts/TfliteManager.d.ts +92 -0
  28. package/build/dts/connection/BaseConnectionManager.d.ts +59 -0
  29. package/build/dts/connection/ClientConnectionManager.d.ts +23 -0
  30. package/build/dts/connection/WebSocketClientConnectionManager.d.ts +23 -0
  31. package/build/dts/connection/bluetooth/BluetoothConnectionManager.d.ts +10 -0
  32. package/build/dts/connection/bluetooth/NobleConnectionManager.d.ts +42 -0
  33. package/build/dts/connection/bluetooth/WebBluetoothConnectionManager.d.ts +20 -0
  34. package/build/dts/connection/bluetooth/bluetoothUUIDs.d.ts +14 -0
  35. package/build/dts/connection/webSocket/ClientConnectionManager.d.ts +23 -0
  36. package/build/dts/connection/webSocket/WebSocketClientConnectionManager.d.ts +23 -0
  37. package/build/dts/devicePair/DevicePair.d.ts +60 -0
  38. package/build/dts/devicePair/DevicePairPressureSensorDataManager.d.ts +25 -0
  39. package/build/dts/devicePair/DevicePairSensorDataManager.d.ts +33 -0
  40. package/build/dts/scanner/BaseScanner.d.ts +66 -0
  41. package/build/dts/scanner/NobleScanner.d.ts +17 -0
  42. package/build/dts/scanner/Scanner.d.ts +3 -0
  43. package/build/dts/sensor/BarometerSensorDataManager.d.ts +16 -0
  44. package/build/dts/sensor/MotionSensorDataManager.d.ts +69 -0
  45. package/build/dts/sensor/PressureSensorDataManager.d.ts +36 -0
  46. package/build/dts/sensor/SensorConfigurationManager.d.ts +44 -0
  47. package/build/dts/sensor/SensorDataManager.d.ts +40 -0
  48. package/build/dts/server/BaseClient.d.ts +85 -0
  49. package/build/dts/server/BaseServer.d.ts +48 -0
  50. package/build/dts/server/ServerUtils.d.ts +23 -0
  51. package/build/dts/server/udp/UDPServer.d.ts +11 -0
  52. package/build/dts/server/udp/UDPUtils.d.ts +9 -0
  53. package/build/dts/server/websocket/WebSocketClient.d.ts +17 -0
  54. package/build/dts/server/websocket/WebSocketServer.d.ts +13 -0
  55. package/build/dts/server/websocket/WebSocketUtils.d.ts +9 -0
  56. package/build/dts/utils/ArrayBufferUtils.d.ts +7 -0
  57. package/build/dts/utils/ArrayUtils.d.ts +2 -0
  58. package/build/dts/utils/CenterOfPressureHelper.d.ts +15 -0
  59. package/build/dts/utils/Console.d.ts +34 -0
  60. package/build/dts/utils/EventDispatcher.d.ts +50 -0
  61. package/build/dts/utils/EventUtils.d.ts +6 -0
  62. package/build/dts/utils/MathUtils.d.ts +21 -0
  63. package/build/dts/utils/ParseUtils.d.ts +5 -0
  64. package/build/dts/utils/RangeHelper.d.ts +8 -0
  65. package/build/dts/utils/Text.d.ts +6 -0
  66. package/build/dts/utils/Timer.d.ts +14 -0
  67. package/build/dts/utils/TypeScriptUtils.d.ts +19 -0
  68. package/build/dts/utils/cbor.d.ts +6 -0
  69. package/build/dts/utils/checksum.d.ts +3 -0
  70. package/build/dts/utils/environment.d.ts +13 -0
  71. package/build/dts/utils/mcumgr.d.ts +88 -0
  72. package/build/dts/utils/stringUtils.d.ts +2 -0
  73. package/build/dts/vibration/VibrationManager.d.ts +45 -0
  74. package/build/dts/vibration/VibrationWaveformEffects.d.ts +2 -0
  75. package/build/index.d.ts +908 -0
  76. package/build/index.node.d.ts +908 -0
  77. package/examples/3d/index.html +109 -0
  78. package/examples/3d/scene.html +57 -0
  79. package/examples/3d/script.js +419 -0
  80. package/examples/balance/index.html +138 -0
  81. package/examples/balance/script.js +243 -0
  82. package/examples/basic/index.html +327 -0
  83. package/examples/basic/script.js +1093 -0
  84. package/examples/center-of-pressure/index.html +132 -0
  85. package/examples/center-of-pressure/script.js +207 -0
  86. package/examples/device-pair/index.html +72 -0
  87. package/examples/device-pair/script.js +187 -0
  88. package/examples/edge-impulse/index.html +94 -0
  89. package/examples/edge-impulse/script.js +1033 -0
  90. package/examples/graph/index.html +83 -0
  91. package/examples/graph/script.js +469 -0
  92. package/examples/machine-learning/index.html +366 -0
  93. package/examples/machine-learning/script.js +1774 -0
  94. package/examples/pressure/index.html +145 -0
  95. package/examples/pressure/script.js +201 -0
  96. package/examples/recording/index.html +187 -0
  97. package/examples/recording/script.js +736 -0
  98. package/examples/server/index.html +266 -0
  99. package/examples/server/script.js +925 -0
  100. package/examples/utils/aframe/fingertip-button-component.js +201 -0
  101. package/examples/utils/aframe/fingertip-collider-target-component.js +102 -0
  102. package/examples/utils/aframe/fingertip-colliders-component.js +147 -0
  103. package/examples/utils/three/three.module.min.js +24846 -0
  104. package/examples/webxr/index.html +221 -0
  105. package/examples/webxr/script.js +1127 -0
  106. package/package.json +83 -0
  107. package/src/BS.ts +68 -0
  108. package/src/Device.ts +734 -0
  109. package/src/DeviceInformationManager.ts +146 -0
  110. package/src/DeviceManager.ts +354 -0
  111. package/src/FileTransferManager.ts +452 -0
  112. package/src/FirmwareManager.ts +357 -0
  113. package/src/InformationManager.ts +283 -0
  114. package/src/TfliteManager.ts +450 -0
  115. package/src/connection/BaseConnectionManager.ts +255 -0
  116. package/src/connection/ClientConnectionManager.ts +120 -0
  117. package/src/connection/bluetooth/BluetoothConnectionManager.ts +34 -0
  118. package/src/connection/bluetooth/NobleConnectionManager.ts +302 -0
  119. package/src/connection/bluetooth/WebBluetoothConnectionManager.ts +269 -0
  120. package/src/connection/bluetooth/bluetoothUUIDs.ts +218 -0
  121. package/src/devicePair/DevicePair.ts +253 -0
  122. package/src/devicePair/DevicePairPressureSensorDataManager.ts +82 -0
  123. package/src/devicePair/DevicePairSensorDataManager.ts +90 -0
  124. package/src/scanner/BaseScanner.ts +189 -0
  125. package/src/scanner/NobleScanner.ts +195 -0
  126. package/src/scanner/Scanner.ts +16 -0
  127. package/src/sensor/BarometerSensorDataManager.ts +41 -0
  128. package/src/sensor/MotionSensorDataManager.ts +151 -0
  129. package/src/sensor/PressureSensorDataManager.ts +112 -0
  130. package/src/sensor/SensorConfigurationManager.ts +177 -0
  131. package/src/sensor/SensorDataManager.ts +166 -0
  132. package/src/server/BaseClient.ts +368 -0
  133. package/src/server/BaseServer.ts +344 -0
  134. package/src/server/ServerUtils.ts +93 -0
  135. package/src/server/udp/UDPServer.ts +229 -0
  136. package/src/server/udp/UDPUtils.ts +20 -0
  137. package/src/server/websocket/WebSocketClient.ts +179 -0
  138. package/src/server/websocket/WebSocketServer.ts +184 -0
  139. package/src/server/websocket/WebSocketUtils.ts +20 -0
  140. package/src/utils/ArrayBufferUtils.ts +88 -0
  141. package/src/utils/ArrayUtils.ts +15 -0
  142. package/src/utils/CenterOfPressureHelper.ts +39 -0
  143. package/src/utils/Console.ts +156 -0
  144. package/src/utils/EventDispatcher.ts +153 -0
  145. package/src/utils/EventUtils.ts +41 -0
  146. package/src/utils/MathUtils.ts +53 -0
  147. package/src/utils/ParseUtils.ts +46 -0
  148. package/src/utils/RangeHelper.ts +38 -0
  149. package/src/utils/Text.ts +30 -0
  150. package/src/utils/Timer.ts +72 -0
  151. package/src/utils/TypeScriptUtils.ts +22 -0
  152. package/src/utils/cbor.js +429 -0
  153. package/src/utils/checksum.ts +41 -0
  154. package/src/utils/environment.ts +46 -0
  155. package/src/utils/mcumgr.js +444 -0
  156. package/src/utils/stringUtils.ts +11 -0
  157. package/src/vibration/VibrationManager.ts +308 -0
  158. package/src/vibration/VibrationWaveformEffects.ts +128 -0
@@ -0,0 +1,145 @@
1
+ <html>
2
+ <head>
3
+ <title>Pressure | BrilliantSole JavaScript SDK</title>
4
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
5
+ <link rel="shortcut icon" type="image/x-icon" href="/favicon.ico" />
6
+ <script type="module" src="./script.js"></script>
7
+ </head>
8
+ <style>
9
+ #insoles {
10
+ display: flex;
11
+ flex-direction: row;
12
+ }
13
+ .insole {
14
+ position: relative;
15
+ height: 500px;
16
+ }
17
+ img:not(.overlay) {
18
+ position: relative;
19
+ }
20
+ img.overlay {
21
+ position: absolute;
22
+ }
23
+ .insole.left .viz {
24
+ -webkit-transform: scaleX(-1);
25
+ transform: scaleX(-1);
26
+ }
27
+ .insole img {
28
+ height: 100%;
29
+ }
30
+
31
+ [data-pressure],
32
+ [data-haptics] {
33
+ -webkit-mask-repeat: no-repeat;
34
+ mask-repeat: no-repeat;
35
+ position: absolute;
36
+ width: 100%;
37
+ height: 100%;
38
+ mask-size: 100%;
39
+ z-index: 1;
40
+ }
41
+ [data-pressure] {
42
+ background-color: red;
43
+ opacity: 0;
44
+ }
45
+ [data-haptics] {
46
+ /* background-color: blue;*/
47
+ }
48
+ [data-pressure="0"] {
49
+ -webkit-mask-image: url(../../assets/images/pressure-0.svg);
50
+ mask-image: url(../../assets/images/pressure-0.svg);
51
+ }
52
+ [data-pressure="1"] {
53
+ -webkit-mask-image: url(../../assets/images/pressure-1.svg);
54
+ mask-image: url(../../assets/images/pressure-1.svg);
55
+ }
56
+ [data-pressure="2"] {
57
+ -webkit-mask-image: url(../../assets/images/pressure-2.svg);
58
+ mask-image: url(../../assets/images/pressure-2.svg);
59
+ }
60
+ [data-pressure="3"] {
61
+ -webkit-mask-image: url(../../assets/images/pressure-3.svg);
62
+ mask-image: url(../../assets/images/pressure-3.svg);
63
+ }
64
+ [data-pressure="4"] {
65
+ -webkit-mask-image: url(../../assets/images/pressure-4.svg);
66
+ mask-image: url(../../assets/images/pressure-4.svg);
67
+ }
68
+ [data-pressure="5"] {
69
+ -webkit-mask-image: url(../../assets/images/pressure-5.svg);
70
+ mask-image: url(../../assets/images/pressure-5.svg);
71
+ }
72
+ [data-pressure="6"] {
73
+ -webkit-mask-image: url(../../assets/images/pressure-6.svg);
74
+ mask-image: url(../../assets/images/pressure-6.svg);
75
+ }
76
+ [data-pressure="7"] {
77
+ -webkit-mask-image: url(../../assets/images/pressure-7.svg);
78
+ mask-image: url(../../assets/images/pressure-7.svg);
79
+ }
80
+
81
+ [data-haptics="front"] {
82
+ -webkit-mask-image: url(../../assets/images/haptics-front.svg);
83
+ mask-image: url(../../assets/images/haptics-front.svg);
84
+ }
85
+ [data-haptics="rear"] {
86
+ -webkit-mask-image: url(../../assets/images/haptics-rear.svg);
87
+ mask-image: url(../../assets/images/haptics-rear.svg);
88
+ }
89
+ </style>
90
+ <body>
91
+ <nav>
92
+ <a href="../../">home</a>
93
+ </nav>
94
+
95
+ <h1>Pressure | BrilliantSole JavaScript SDK</h1>
96
+
97
+ <button id="toggleServerConnection">connect to server</button>
98
+
99
+ <div>
100
+ <h2>available devices</h2>
101
+ <div id="availableDevices">
102
+ <template id="availableDeviceTemplate">
103
+ <div class="availableDevice">
104
+ <ul>
105
+ <li><b>name: </b> <span class="name"></span></li>
106
+ <li><b>type: </b> <span class="type"></span></li>
107
+ <li><button class="toggleConnection">connect</button></li>
108
+ </ul>
109
+ </div>
110
+ </template>
111
+ </div>
112
+ </div>
113
+
114
+ <p>
115
+ <button id="addDevice">add device</button>
116
+ </p>
117
+
118
+ <div id="insoles"></div>
119
+
120
+ <template id="insoleTemplate">
121
+ <div class="insole">
122
+ <p>
123
+ <button class="toggleConnection" disabled>disconnect</button>
124
+ <br />
125
+ <button class="togglePressureData" disabled>enable pressure data</button>
126
+ </p>
127
+ <div class="viz">
128
+ <div data-pressure="0"></div>
129
+ <div data-pressure="1"></div>
130
+ <div data-pressure="2"></div>
131
+ <div data-pressure="3"></div>
132
+ <div data-pressure="4"></div>
133
+ <div data-pressure="5"></div>
134
+ <div data-pressure="6"></div>
135
+ <div data-pressure="7"></div>
136
+
137
+ <div data-haptics="front"></div>
138
+ <div data-haptics="rear"></div>
139
+
140
+ <img src="../../assets/images/right-insole.svg" />
141
+ </div>
142
+ </div>
143
+ </template>
144
+ </body>
145
+ </html>
@@ -0,0 +1,201 @@
1
+ import * as BS from "../../build/brilliantsole.module.js";
2
+ window.BS = BS;
3
+ console.log({ BS });
4
+ //BS.setAllConsoleLevelFlags({ log: true });
5
+
6
+ // GET DEVICES
7
+
8
+ /** @type {HTMLTemplateElement} */
9
+ const availableDeviceTemplate = document.getElementById("availableDeviceTemplate");
10
+ const availableDevicesContainer = document.getElementById("availableDevices");
11
+
12
+ /** @param {BS.Device[]} availableDevices */
13
+ function onAvailableDevices(availableDevices) {
14
+ availableDevicesContainer.innerHTML = "";
15
+ if (availableDevices.length == 0) {
16
+ availableDevicesContainer.innerText = "no devices available";
17
+ } else {
18
+ availableDevices.forEach((availableDevice) => {
19
+ let availableDeviceContainer = availableDeviceTemplate.content.cloneNode(true).querySelector(".availableDevice");
20
+ availableDeviceContainer.querySelector(".name").innerText = availableDevice.name;
21
+ availableDeviceContainer.querySelector(".type").innerText = availableDevice.type;
22
+
23
+ /** @type {HTMLButtonElement} */
24
+ const toggleConnectionButton = availableDeviceContainer.querySelector(".toggleConnection");
25
+ toggleConnectionButton.addEventListener("click", () => {
26
+ availableDevice.toggleConnection();
27
+ });
28
+ const onConnectionStatusUpdate = () => {
29
+ switch (availableDevice.connectionStatus) {
30
+ case "connected":
31
+ case "notConnected":
32
+ toggleConnectionButton.disabled = false;
33
+ toggleConnectionButton.innerText = availableDevice.isConnected ? "disconnect" : "connect";
34
+ break;
35
+ case "connecting":
36
+ case "disconnecting":
37
+ toggleConnectionButton.disabled = true;
38
+ toggleConnectionButton.innerText = availableDevice.connectionStatus;
39
+ break;
40
+ }
41
+ };
42
+ availableDevice.addEventListener("connectionStatus", () => onConnectionStatusUpdate());
43
+ onConnectionStatusUpdate();
44
+ availableDevicesContainer.appendChild(availableDeviceContainer);
45
+ });
46
+ }
47
+ }
48
+ async function getDevices() {
49
+ const availableDevices = await BS.DeviceManager.GetDevices();
50
+ if (!availableDevices) {
51
+ return;
52
+ }
53
+ onAvailableDevices(availableDevices);
54
+ }
55
+
56
+ BS.DeviceManager.AddEventListener("availableDevices", (event) => {
57
+ const { availableDevices } = event.message;
58
+ onAvailableDevices(availableDevices);
59
+ });
60
+ getDevices();
61
+
62
+ // ADD DEVICE
63
+
64
+ /** @type {HTMLButtonElement} */
65
+ const addDeviceButton = document.getElementById("addDevice");
66
+ addDeviceButton.addEventListener("click", () => {
67
+ BS.Device.Connect();
68
+ });
69
+
70
+ const devicePair = BS.DevicePair.shared;
71
+ devicePair.addEventListener("isConnected", () => {
72
+ addDeviceButton.disabled = devicePair.isConnected;
73
+ });
74
+
75
+ // PRESSURE VIZUALIZATION
76
+
77
+ const insolesContainer = document.getElementById("insoles");
78
+ /** @type {HTMLTemplateElement} */
79
+ const insoleTemplate = document.getElementById("insoleTemplate");
80
+
81
+ /** @type {Object.<string, HTMLElement>} */
82
+ const insoleContainers = {};
83
+ /** @type {Object.<string, HTMLButtonElement>} */
84
+ const toggleConnectionButtons = {};
85
+ /** @type {Object.<string, HTMLButtonElement>} */
86
+ const togglePressureDataButtons = {};
87
+ /** @type {Object.<string, HTMLElement[]>} */
88
+ const pressureSensorElementsContainers = {};
89
+
90
+ devicePair.sides.forEach((side) => {
91
+ /** @type {HTMLElement} */
92
+ const insoleContainer = insoleTemplate.content.cloneNode(true).querySelector(".insole");
93
+ insoleContainer.classList.add(side);
94
+ insolesContainer.appendChild(insoleContainer);
95
+
96
+ insoleContainers[side] = insoleContainer;
97
+
98
+ /** @type {HTMLButtonElement} */
99
+ const toggleConnectionButton = insoleContainer.querySelector(".toggleConnection");
100
+ toggleConnectionButton.addEventListener("click", () => {
101
+ devicePair[side].toggleConnection();
102
+ });
103
+ toggleConnectionButtons[side] = toggleConnectionButton;
104
+
105
+ /** @type {HTMLButtonElement} */
106
+ const togglePressureDataButton = insoleContainer.querySelector(".togglePressureData");
107
+ togglePressureDataButton.addEventListener("click", () => {
108
+ const isPressureDataEnabled = devicePair[side].sensorConfiguration.pressure > 0;
109
+ if (isPressureDataEnabled) {
110
+ devicePair[side].setSensorConfiguration({ pressure: 0 });
111
+ togglePressureDataButton.innerText = "disabling pressure data...";
112
+ } else {
113
+ devicePair[side].setSensorConfiguration({ pressure: 20 });
114
+ togglePressureDataButton.innerText = "enabling pressure data...";
115
+ }
116
+ togglePressureDataButton.disabled = true;
117
+ });
118
+ togglePressureDataButtons[side] = togglePressureDataButton;
119
+
120
+ /** @type {HTMLElement[]} */
121
+ const pressureSensorElements = Array.from(insoleContainer.querySelectorAll("[data-pressure]"));
122
+ pressureSensorElementsContainers[side] = pressureSensorElements;
123
+ });
124
+
125
+ devicePair.addEventListener("deviceIsConnected", (event) => {
126
+ const { device } = event.message;
127
+
128
+ const toggleConnectionButton = toggleConnectionButtons[device.insoleSide];
129
+ if (device.isConnected) {
130
+ toggleConnectionButton.disabled = false;
131
+ }
132
+ toggleConnectionButton.innerText = device.isConnected ? "disconnect" : "reconnect";
133
+
134
+ togglePressureDataButtons[device.insoleSide].disabled = !device.isConnected;
135
+ });
136
+
137
+ devicePair.addEventListener("deviceConnectionStatus", (event) => {
138
+ const { device } = event.message;
139
+
140
+ const toggleConnectionButton = toggleConnectionButtons[device.insoleSide];
141
+
142
+ switch (device.connectionStatus) {
143
+ case "connected":
144
+ case "notConnected":
145
+ toggleConnectionButton.disabled = false;
146
+ toggleConnectionButton.innerText = device.isConnected ? "disconnect" : "reconnect";
147
+ break;
148
+ case "connecting":
149
+ case "disconnecting":
150
+ toggleConnectionButton.disabled = true;
151
+ toggleConnectionButton.innerText = device.connectionStatus;
152
+ break;
153
+ }
154
+ });
155
+
156
+ devicePair.addEventListener("deviceGetSensorConfiguration", (event) => {
157
+ const { device } = event.message;
158
+
159
+ const togglePressureDataButton = togglePressureDataButtons[device.insoleSide];
160
+ const isPressureDataEnabled = device.sensorConfiguration.pressure > 0;
161
+ if (isPressureDataEnabled) {
162
+ togglePressureDataButton.innerText = "disable pressure data";
163
+ } else {
164
+ togglePressureDataButton.innerText = "enable pressure data";
165
+ }
166
+ togglePressureDataButton.disabled = false;
167
+ });
168
+
169
+ devicePair.addEventListener("devicePressure", (event) => {
170
+ const { pressure, side } = event.message;
171
+
172
+ pressure.sensors.forEach((sensor, index) => {
173
+ pressureSensorElementsContainers[side][index].style.opacity = sensor.normalizedValue;
174
+ });
175
+ });
176
+
177
+ // SERVER
178
+
179
+ const websocketClient = new BS.WebSocketClient();
180
+ /** @type {HTMLButtonElement} */
181
+ const toggleServerConnectionButton = document.getElementById("toggleServerConnection");
182
+ toggleServerConnectionButton.addEventListener("click", () => {
183
+ websocketClient.toggleConnection();
184
+ });
185
+ websocketClient.addEventListener("isConnected", () => {
186
+ toggleServerConnectionButton.innerText = websocketClient.isConnected ? "disconnect from server" : "connect to server";
187
+ });
188
+ websocketClient.addEventListener("connectionStatus", () => {
189
+ let disabled;
190
+ switch (websocketClient.connectionStatus) {
191
+ case "notConnected":
192
+ case "connected":
193
+ disabled = false;
194
+ break;
195
+ case "connecting":
196
+ case "disconnecting":
197
+ disabled = true;
198
+ break;
199
+ }
200
+ toggleServerConnectionButton.disabled = disabled;
201
+ });
@@ -0,0 +1,187 @@
1
+ <html>
2
+ <head>
3
+ <title>Recording | BrilliantSole JavaScript SDK</title>
4
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
5
+ <link rel="shortcut icon" type="image/x-icon" href="/favicon.ico" />
6
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/4.4.1/chart.umd.min.js"></script>
7
+ <script type="module" src="./script.js"></script>
8
+ </head>
9
+
10
+ <style>
11
+ label {
12
+ display: block;
13
+ }
14
+ div {
15
+ margin-top: 1rem;
16
+ }
17
+ .noListStyle {
18
+ margin-top: 0;
19
+ list-style: none;
20
+ padding-left: 0;
21
+ }
22
+ .gap:not(:last-of-type) {
23
+ padding-bottom: 1rem;
24
+ }
25
+ .recording {
26
+ }
27
+
28
+ .hidden {
29
+ display: none;
30
+ }
31
+
32
+ .visualization {
33
+ overflow-x: auto;
34
+ width: 100%;
35
+ }
36
+
37
+ .visualization2 {
38
+ width: 3000px;
39
+ height: 300px;
40
+ }
41
+
42
+ .visualization canvas {
43
+ }
44
+ </style>
45
+
46
+ <body>
47
+ <nav>
48
+ <a href="../../">home</a>
49
+ </nav>
50
+
51
+ <h1>Recording | BrilliantSole JavaScript SDK</h1>
52
+
53
+ <div>
54
+ <h2>available devices</h2>
55
+ <button id="getDevices" disabled hidden>get available devices</button>
56
+ <div id="availableDevices">
57
+ <template id="availableDeviceTemplate">
58
+ <div class="availableDevice">
59
+ <ul class="noListStyle">
60
+ <li><b>name: </b> <span class="name"></span></li>
61
+ <li><b>type: </b> <span class="type"></span></li>
62
+ <li><button class="toggleConnection">connect</button></li>
63
+ </ul>
64
+ </div>
65
+ </template>
66
+ </div>
67
+ </div>
68
+
69
+ <div>
70
+ <h2>connection</h2>
71
+ <button id="addDevice">add device</button>
72
+ </div>
73
+
74
+ <div>
75
+ <h2>connected devices</h2>
76
+ <div id="connectedDevices">
77
+ <template id="connectedDeviceTemplate">
78
+ <div class="connectedDevice">
79
+ <ul class="noListStyle">
80
+ <li><b>name: </b> <span class="name"></span></li>
81
+ <li><b>type: </b> <span class="type"></span></li>
82
+ <li>
83
+ <b>sensor configuration:</b>
84
+ <pre class="sensorConfiguration"></pre>
85
+ </li>
86
+ <li><button class="disconnect">disconnect</button></li>
87
+ </ul>
88
+ </div>
89
+ </template>
90
+ </div>
91
+ </div>
92
+
93
+ <div>
94
+ <h2>sensor configuration</h2>
95
+
96
+ <div id="sensorConfiguration">
97
+ <template id="sensorTypeConfigurationTemplate">
98
+ <label class="sensorTypeConfiguration">
99
+ <b class="sensorType"></b>
100
+ <input class="sensorRate" type="number" min="0" value="" />ms
101
+ </label>
102
+ </template>
103
+ </div>
104
+
105
+ <div>
106
+ <label>enable sensors <input id="toggleSensorData" type="checkbox" disabled /></label>
107
+ </div>
108
+ </div>
109
+
110
+ <div>
111
+ <h2>recording configuration</h2>
112
+ <label>
113
+ countdown (seconds)
114
+ <input type="number" min="0" value="0" max="10" step="1" id="recordingCountdownInput" />
115
+ </label>
116
+
117
+ <label>fixed duration? <input id="isRecordingFixedDuration" type="checkbox" /></label>
118
+ <label>
119
+ duration (seconds)
120
+ <input type="number" min="1" value="1" max="30" step="1" id="recordingDuration" disabled />
121
+ </label>
122
+ </div>
123
+
124
+ <div>
125
+ <h2>recording</h2>
126
+ <button id="toggleRecording" disabled>record</button>
127
+ <h2><span id="recordingCountdownSpan"></span></h2>
128
+ </div>
129
+
130
+ <div>
131
+ <h2>recordings</h2>
132
+
133
+ <div>
134
+ <label>
135
+ load recording (json) <input id="loadAsJSON" type="file" multiple accept="application/json" />
136
+ </label>
137
+ </div>
138
+
139
+ <div>
140
+ <button id="saveAllAsJSON" disabled>save all as json</button>
141
+ <button id="saveAllAsCSV" disabled hidden>save all as CSV</button>
142
+ <button id="deleteAllRecordings" disabled>delete all</button>
143
+ </div>
144
+
145
+ <div id="recordings">
146
+ <template id="recordingTemplate">
147
+ <div class="recording">
148
+ <h3><span class="timestamp"></span> (<span class="duration"></span> seconds)</h3>
149
+ <div>
150
+ <button class="saveAsCSV" hidden>save as csv</button>
151
+ <button class="saveAsJSON">save as json</button>
152
+ <button class="delete">delete</button>
153
+ </div>
154
+ <br />
155
+ <ol class="devices noListStyle"></ol>
156
+ <hr />
157
+ </div>
158
+ </template>
159
+ <template id="deviceRecordingTemplate">
160
+ <li class="deviceRecording gap">
161
+ <ul class="noListStyle">
162
+ <li><b>id:</b> <span class="id"></span></li>
163
+ <li><b>name:</b> <span class="name"></span></li>
164
+ <li><b>type:</b> <span class="type"></span></li>
165
+ <li><b>sensor types:</b> <span class="sensorTypes"></span></li>
166
+ </ul>
167
+ </li>
168
+ </template>
169
+ <template id="sensorTypeRecordingTemplate">
170
+ <li class="sensorTypeRecording gap">
171
+ <ul>
172
+ <li><b>sensor type:</b> <span class="sensorType"></span></li>
173
+ <li><b>data rate:</b> <span class="dataRate"></span>ms</li>
174
+ <li><b>initial timestamp:</b> <span class="initialTimestamp"></span></li>
175
+ <button class="toggleVisualization">visualize</button>
176
+ <div class="hidden visualization">
177
+ <div class="visualization2">
178
+ <canvas></canvas>
179
+ </div>
180
+ </div>
181
+ </ul>
182
+ </li>
183
+ </template>
184
+ </div>
185
+ </div>
186
+ </body>
187
+ </html>