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,132 @@
1
+ <html>
2
+ <head>
3
+ <title>Center of 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
+
9
+ <style>
10
+ #centerOfPressureContainer {
11
+ width: calc(100% - 1rem);
12
+ height: 80%;
13
+ border: solid black;
14
+ margin: 1rem auto;
15
+ border-radius: 20px;
16
+ overflow: hidden;
17
+ display: flex;
18
+ }
19
+
20
+ #centerOfPressureRange {
21
+ width: calc(100% - 2rem);
22
+ height: calc(100% - 2rem);
23
+ margin: auto;
24
+ position: relative;
25
+ }
26
+
27
+ #centerOfPressure {
28
+ position: absolute;
29
+ }
30
+
31
+ #centerOfPressure .visual {
32
+ border-radius: 50%;
33
+ background-color: red;
34
+ width: 2rem;
35
+ height: 2rem;
36
+ left: -1rem;
37
+ top: -1rem;
38
+ position: relative;
39
+ z-index: 1;
40
+ }
41
+
42
+ #target {
43
+ position: absolute;
44
+ display: none;
45
+ }
46
+ #target .visual {
47
+ border-radius: 15px;
48
+ background-color: yellow;
49
+ width: 100%;
50
+ height: 100%;
51
+ display: flex;
52
+ }
53
+ #target .ring {
54
+ box-sizing: border-box;
55
+ border: solid blue thick;
56
+ border-radius: 15px;
57
+ width: 100%;
58
+ height: 100%;
59
+ margin: auto;
60
+ }
61
+
62
+ #target.hover .visual {
63
+ background-color: limegreen;
64
+ }
65
+
66
+ #target:not(.hover) .ring {
67
+ display: none;
68
+ }
69
+
70
+ @keyframes shrink {
71
+ from {
72
+ width: 100%;
73
+ height: 100%;
74
+ }
75
+ to {
76
+ width: 0%;
77
+ height: 0%;
78
+ }
79
+ }
80
+
81
+ #target.hover .ring {
82
+ animation-name: shrink;
83
+ animation-duration: 3s;
84
+ animation-timing-function: linear;
85
+ }
86
+ </style>
87
+
88
+ <body>
89
+ <nav>
90
+ <a href="../../">home</a>
91
+ </nav>
92
+
93
+ <h1>Center of Pressure | BrilliantSole JavaScript SDK</h1>
94
+
95
+ <div>
96
+ <h2>available devices</h2>
97
+ <div id="availableDevices">
98
+ <template id="availableDeviceTemplate">
99
+ <div class="availableDevice">
100
+ <ul>
101
+ <li><b>name: </b> <span class="name"></span></li>
102
+ <li><b>type: </b> <span class="type"></span></li>
103
+ <li><button class="toggleConnection">connect</button></li>
104
+ </ul>
105
+ </div>
106
+ </template>
107
+ </div>
108
+ </div>
109
+
110
+ <br />
111
+
112
+ <div>
113
+ <button id="addDevice">add device</button>
114
+ <button id="togglePressureData" disabled>enable pressure data</button>
115
+ <button id="resetPressureRange" disabled>recalibrate</button>
116
+ <button id="toggleGame">start game</button>
117
+ </div>
118
+
119
+ <div id="centerOfPressureContainer">
120
+ <div id="centerOfPressureRange">
121
+ <div id="centerOfPressure">
122
+ <div class="visual"></div>
123
+ </div>
124
+ <div id="target">
125
+ <div class="visual">
126
+ <div class="ring"></div>
127
+ </div>
128
+ </div>
129
+ </div>
130
+ </div>
131
+ </body>
132
+ </html>
@@ -0,0 +1,207 @@
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
+ /** @param {BS.Device[]} availableDevices */
12
+ function onAvailableDevices(availableDevices) {
13
+ availableDevicesContainer.innerHTML = "";
14
+ if (availableDevices.length == 0) {
15
+ availableDevicesContainer.innerText = "no devices available";
16
+ } else {
17
+ availableDevices.forEach((availableDevice) => {
18
+ let availableDeviceContainer = availableDeviceTemplate.content.cloneNode(true).querySelector(".availableDevice");
19
+ availableDeviceContainer.querySelector(".name").innerText = availableDevice.name;
20
+ availableDeviceContainer.querySelector(".type").innerText = availableDevice.type;
21
+
22
+ /** @type {HTMLButtonElement} */
23
+ const toggleConnectionButton = availableDeviceContainer.querySelector(".toggleConnection");
24
+ toggleConnectionButton.addEventListener("click", () => {
25
+ availableDevice.toggleConnection();
26
+ });
27
+ const onConnectionStatusUpdate = () => {
28
+ switch (availableDevice.connectionStatus) {
29
+ case "connected":
30
+ case "notConnected":
31
+ toggleConnectionButton.disabled = false;
32
+ toggleConnectionButton.innerText = availableDevice.isConnected ? "disconnect" : "connect";
33
+ break;
34
+ case "connecting":
35
+ case "disconnecting":
36
+ toggleConnectionButton.disabled = true;
37
+ toggleConnectionButton.innerText = availableDevice.connectionStatus;
38
+ break;
39
+ }
40
+ };
41
+ availableDevice.addEventListener("connectionStatus", () => onConnectionStatusUpdate());
42
+ onConnectionStatusUpdate();
43
+ availableDevicesContainer.appendChild(availableDeviceContainer);
44
+ });
45
+ }
46
+ }
47
+ async function getDevices() {
48
+ const availableDevices = await BS.DeviceManager.GetDevices();
49
+ if (!availableDevices) {
50
+ return;
51
+ }
52
+ onAvailableDevices(availableDevices);
53
+ }
54
+
55
+ BS.DeviceManager.AddEventListener("availableDevices", (event) => {
56
+ const devices = event.message.availableDevices;
57
+ onAvailableDevices(devices);
58
+ });
59
+ getDevices();
60
+
61
+ // CONNECTION
62
+ const devicePair = BS.DevicePair.shared;
63
+
64
+ /** @type {HTMLButtonElement} */
65
+ const addDeviceButton = document.getElementById("addDevice");
66
+ devicePair.addEventListener("isConnected", () => {
67
+ addDeviceButton.disabled = devicePair.isConnected;
68
+ });
69
+ addDeviceButton.addEventListener("click", () => {
70
+ BS.Device.Connect();
71
+ });
72
+
73
+ // PRESSURE VISUALIZATION
74
+
75
+ let isPressureDataEnabled = false;
76
+
77
+ /** @type {HTMLButtonElement} */
78
+ const togglePressureDataButton = document.getElementById("togglePressureData");
79
+ devicePair.addEventListener("isConnected", () => {
80
+ togglePressureDataButton.disabled = !devicePair.isConnected;
81
+ });
82
+ togglePressureDataButton.addEventListener("click", () => {
83
+ isPressureDataEnabled = !isPressureDataEnabled;
84
+ console.log({ isPressureDataEnabled });
85
+ togglePressureDataButton.innerText = isPressureDataEnabled ? "disable pressure data" : "enable pressure data";
86
+ devicePair.setSensorConfiguration({ pressure: isPressureDataEnabled ? 20 : 0 });
87
+ });
88
+
89
+ /** @type {HTMLButtonElement} */
90
+ const resetPressureRangeButton = document.getElementById("resetPressureRange");
91
+ devicePair.addEventListener("isConnected", () => {
92
+ resetPressureRangeButton.disabled = !devicePair.isConnected;
93
+ });
94
+ resetPressureRangeButton.addEventListener("click", () => {
95
+ devicePair.resetPressureRange();
96
+ });
97
+
98
+ const centerOfPressureElement = document.getElementById("centerOfPressure");
99
+ /** @param {BS.CenterOfPressure} center */
100
+ function updateCenterOfPressureElement(center) {
101
+ centerOfPressureElement.style.left = `${center.x * 100}%`;
102
+ centerOfPressureElement.style.top = `${(1 - center.y) * 100}%`;
103
+ }
104
+ window.updateCenterOfPressureElement = updateCenterOfPressureElement;
105
+
106
+ let isPlayingGame = false;
107
+
108
+ /** @type {HTMLButtonElement} */
109
+ const toggleGameButton = document.getElementById("toggleGame");
110
+ devicePair.addEventListener("isConnected", () => {
111
+ //toggleGameButton.disabled = !devicePair.isConnected;
112
+ });
113
+ toggleGameButton.addEventListener("click", () => {
114
+ isPlayingGame = !isPlayingGame;
115
+ toggleGameButton.innerText = isPlayingGame ? "stop game" : "start game";
116
+ if (isPlayingGame) {
117
+ target.reset();
118
+ target.element.style.display = "block";
119
+ } else {
120
+ target.element.style.display = "none";
121
+ }
122
+ });
123
+
124
+ /**
125
+ * @param {number} min
126
+ * @param {number} max
127
+ */
128
+ function randomValueBetween(min, max) {
129
+ const range = max - min;
130
+ return min + Math.random() * range;
131
+ }
132
+
133
+ const target = {
134
+ width: 0,
135
+ height: 0,
136
+ left: 0,
137
+ top: 0,
138
+ bottom: 0,
139
+ element: document.getElementById("target"),
140
+
141
+ /** @param {BS.CenterOfPressure} center */
142
+ isInside(center) {
143
+ return (
144
+ center.x >= this.left &&
145
+ center.x <= this.left + this.width &&
146
+ center.y <= this.bottom &&
147
+ center.y >= this.bottom - this.height
148
+ );
149
+ },
150
+
151
+ reset() {
152
+ this.element.classList.remove("hover");
153
+
154
+ this.width = randomValueBetween(0.1, 0.3);
155
+ this.height = randomValueBetween(0.1, 0.3);
156
+
157
+ this.left = randomValueBetween(0, 1 - this.width);
158
+ this.top = randomValueBetween(0, 1 - this.height);
159
+ this.bottom = 1 - this.top;
160
+
161
+ console.log("target", { ...target });
162
+
163
+ this.element.style.width = `${this.width * 100}%`;
164
+ this.element.style.height = `${this.height * 100}%`;
165
+
166
+ this.element.style.left = `${this.left * 100}%`;
167
+ this.element.style.top = `${this.top * 100}%`;
168
+ },
169
+ };
170
+
171
+ let isCenterOfPressureInsideTarget = false;
172
+ let insideTargetTimeoutId;
173
+
174
+ devicePair.addEventListener("pressure", (event) => {
175
+ /** @type {BS.DevicePairPressureData} */
176
+ const pressure = event.message.pressure;
177
+ console.log({ pressure });
178
+ if (pressure.normalizedCenter) {
179
+ //console.log(pressure.normalizedCenter);
180
+ onCenterOfPressure(pressure.normalizedCenter);
181
+ }
182
+ });
183
+
184
+ /** @param {BS.CenterOfPressure} center */
185
+ function onCenterOfPressure(center) {
186
+ updateCenterOfPressureElement(center);
187
+
188
+ if (isPlayingGame) {
189
+ isCenterOfPressureInsideTarget = target.isInside(center);
190
+ console.log({ isCenterOfPressureInsideTarget });
191
+ if (isCenterOfPressureInsideTarget) {
192
+ if (insideTargetTimeoutId == undefined) {
193
+ target.element.classList.add("hover");
194
+ insideTargetTimeoutId = setTimeout(() => {
195
+ target.reset();
196
+ }, 3000);
197
+ }
198
+ } else {
199
+ if (insideTargetTimeoutId != undefined) {
200
+ target.element.classList.remove("hover");
201
+ clearTimeout(insideTargetTimeoutId);
202
+ insideTargetTimeoutId = undefined;
203
+ }
204
+ }
205
+ }
206
+ }
207
+ window.onCenterOfPressure = onCenterOfPressure; // for manual testing
@@ -0,0 +1,72 @@
1
+ <html>
2
+ <head>
3
+ <title>Device Pair | 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
+
9
+ <style>
10
+ #devices {
11
+ display: flex;
12
+ flex-direction: row;
13
+ gap: 1rem;
14
+ }
15
+
16
+ .pressure {
17
+ height: 6rem;
18
+ }
19
+ </style>
20
+
21
+ <body>
22
+ <nav>
23
+ <a href="../../">home</a>
24
+ </nav>
25
+
26
+ <h1>Device Pair | BrilliantSole JavaScript SDK</h1>
27
+
28
+ <div>
29
+ <h2>available devices</h2>
30
+ <div id="availableDevices">
31
+ <template id="availableDeviceTemplate">
32
+ <div class="availableDevice">
33
+ <ul>
34
+ <li><b>name: </b> <span class="name"></span></li>
35
+ <li><b>type: </b> <span class="type"></span></li>
36
+ <li><button class="toggleConnection">connect</button></li>
37
+ </ul>
38
+ </div>
39
+ </template>
40
+ </div>
41
+ </div>
42
+
43
+ <br />
44
+
45
+ <div>
46
+ <button id="addDevice">add device</button>
47
+ <button id="togglePressureData" disabled>enable pressure data</button>
48
+ <button id="resetPressureRange" disabled>recalibrate</button>
49
+ </div>
50
+
51
+ <div id="devicePair">
52
+ <h2>Device Pair</h2>
53
+
54
+ <h3>pressure</h3>
55
+ <pre class="pressure"></pre>
56
+ </div>
57
+
58
+ <div id="devices"></div>
59
+
60
+ <template id="deviceTemplate">
61
+ <div class="device">
62
+ <h2><span class="side"></span> side</h2>
63
+ <p>
64
+ <button class="toggleConnection" disabled>disconnect</button>
65
+ </p>
66
+
67
+ <h3>pressure</h3>
68
+ <pre class="pressure"></pre>
69
+ </div>
70
+ </template>
71
+ </body>
72
+ </html>
@@ -0,0 +1,187 @@
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
+ /** @param {BS.Device[]} availableDevices */
12
+ function onAvailableDevices(availableDevices) {
13
+ availableDevicesContainer.innerHTML = "";
14
+ if (availableDevices.length == 0) {
15
+ availableDevicesContainer.innerText = "no devices available";
16
+ } else {
17
+ availableDevices.forEach((availableDevice) => {
18
+ let availableDeviceContainer = availableDeviceTemplate.content.cloneNode(true).querySelector(".availableDevice");
19
+ availableDeviceContainer.querySelector(".name").innerText = availableDevice.name;
20
+ availableDeviceContainer.querySelector(".type").innerText = availableDevice.type;
21
+
22
+ /** @type {HTMLButtonElement} */
23
+ const toggleConnectionButton = availableDeviceContainer.querySelector(".toggleConnection");
24
+ toggleConnectionButton.addEventListener("click", () => {
25
+ availableDevice.toggleConnection();
26
+ });
27
+ const onConnectionStatusUpdate = () => {
28
+ switch (availableDevice.connectionStatus) {
29
+ case "connected":
30
+ case "notConnected":
31
+ toggleConnectionButton.disabled = false;
32
+ toggleConnectionButton.innerText = availableDevice.isConnected ? "disconnect" : "connect";
33
+ break;
34
+ case "connecting":
35
+ case "disconnecting":
36
+ toggleConnectionButton.disabled = true;
37
+ toggleConnectionButton.innerText = availableDevice.connectionStatus;
38
+ break;
39
+ }
40
+ };
41
+ availableDevice.addEventListener("connectionStatus", () => onConnectionStatusUpdate());
42
+ onConnectionStatusUpdate();
43
+ availableDevicesContainer.appendChild(availableDeviceContainer);
44
+ });
45
+ }
46
+ }
47
+ async function getDevices() {
48
+ const availableDevices = await BS.DeviceManager.GetDevices();
49
+ if (!availableDevices) {
50
+ return;
51
+ }
52
+ onAvailableDevices(availableDevices);
53
+ }
54
+
55
+ BS.DeviceManager.AddEventListener("availableDevices", (event) => {
56
+ const { availableDevices } = event.message;
57
+ onAvailableDevices(availableDevices);
58
+ });
59
+ getDevices();
60
+
61
+ // CONNECTION
62
+ const devicePair = BS.DevicePair.shared;
63
+
64
+ /** @type {HTMLButtonElement} */
65
+ const addDeviceButton = document.getElementById("addDevice");
66
+ devicePair.addEventListener("isConnected", () => {
67
+ addDeviceButton.disabled = devicePair.isConnected;
68
+ });
69
+ addDeviceButton.addEventListener("click", () => {
70
+ BS.Device.Connect();
71
+ });
72
+
73
+ // PRESSURE
74
+
75
+ let isPressureDataEnabled = false;
76
+
77
+ /** @type {HTMLButtonElement} */
78
+ const togglePressureDataButton = document.getElementById("togglePressureData");
79
+ devicePair.addEventListener("isConnected", () => {
80
+ togglePressureDataButton.disabled = !devicePair.isConnected;
81
+ });
82
+ togglePressureDataButton.addEventListener("click", () => {
83
+ isPressureDataEnabled = !isPressureDataEnabled;
84
+ togglePressureDataButton.innerText = isPressureDataEnabled ? "disable pressure data" : "enable pressure data";
85
+ devicePair.setSensorConfiguration({ pressure: isPressureDataEnabled ? 20 : 0 });
86
+ });
87
+
88
+ /** @type {HTMLButtonElement} */
89
+ const resetPressureRangeButton = document.getElementById("resetPressureRange");
90
+ devicePair.addEventListener("isConnected", () => {
91
+ resetPressureRangeButton.disabled = !devicePair.isConnected;
92
+ });
93
+ resetPressureRangeButton.addEventListener("click", () => {
94
+ devicePair.resetPressureRange();
95
+ });
96
+
97
+ // DEVICES
98
+
99
+ const devicesContainer = document.getElementById("devices");
100
+ /** @type {HTMLTemplateElement} */
101
+ const deviceTemplate = document.getElementById("deviceTemplate");
102
+
103
+ devicePair.sides.forEach((side) => {
104
+ /** @type {HTMLElement} */
105
+ const deviceContainer = deviceTemplate.content.cloneNode(true).querySelector(".device");
106
+ deviceContainer.classList.add(side);
107
+ devicesContainer.appendChild(deviceContainer);
108
+
109
+ deviceContainer.querySelector(".side").innerText = side;
110
+
111
+ /** @type {HTMLButtonElement} */
112
+ const toggleConnectionButton = deviceContainer.querySelector(".toggleConnection");
113
+ toggleConnectionButton.addEventListener("click", () => {
114
+ devicePair[side].toggleConnection();
115
+ });
116
+
117
+ devicePair.addEventListener("deviceIsConnected", (event) => {
118
+ const { device } = event.message;
119
+ if (device.insoleSide != side) {
120
+ return;
121
+ }
122
+
123
+ if (device.isConnected) {
124
+ toggleConnectionButton.disabled = false;
125
+ }
126
+ toggleConnectionButton.innerText = device.isConnected ? "disconnect" : "reconnect";
127
+ });
128
+
129
+ devicePair.addEventListener("deviceConnectionStatus", (event) => {
130
+ const { device } = event.message;
131
+ if (device.insoleSide != side) {
132
+ return;
133
+ }
134
+
135
+ switch (device.connectionStatus) {
136
+ case "connected":
137
+ case "notConnected":
138
+ toggleConnectionButton.disabled = false;
139
+ toggleConnectionButton.innerText = device.isConnected ? "disconnect" : "reconnect";
140
+ break;
141
+ case "connecting":
142
+ case "disconnecting":
143
+ toggleConnectionButton.disabled = true;
144
+ toggleConnectionButton.innerText = device.connectionStatus;
145
+ break;
146
+ }
147
+ });
148
+
149
+ /** @type {HTMLPreElement} */
150
+ const pressurePre = deviceContainer.querySelector(".pressure");
151
+ devicePair.addEventListener("devicePressure", (event) => {
152
+ const { device } = event.message;
153
+ if (device.insoleSide != side) {
154
+ return;
155
+ }
156
+
157
+ const { pressure } = event.message;
158
+
159
+ pressurePre.textContent = JSON.stringify(
160
+ {
161
+ center: pressure.normalizedCenter,
162
+ sum: pressure.normalizedSum,
163
+ },
164
+ (key, value) => value?.toFixed?.(3) || value,
165
+ 2
166
+ );
167
+ });
168
+ });
169
+
170
+ // DEVICE PAIR
171
+
172
+ const devicePairContainer = document.getElementById("devicePair");
173
+ /** @type {HTMLPreElement} */
174
+ const devicePairPressurePre = devicePairContainer.querySelector(".pressure");
175
+
176
+ devicePair.addEventListener("pressure", (event) => {
177
+ const { pressure } = event.message;
178
+
179
+ devicePairPressurePre.textContent = JSON.stringify(
180
+ {
181
+ center: pressure.normalizedCenter,
182
+ sum: pressure.normalizedSum,
183
+ },
184
+ (key, value) => value?.toFixed?.(3) || value,
185
+ 2
186
+ );
187
+ });
@@ -0,0 +1,94 @@
1
+ <html>
2
+ <head>
3
+ <title>Edge Impulse | 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
+ .column {
10
+ display: flex;
11
+ flex-direction: column;
12
+ }
13
+ </style>
14
+ <body>
15
+ <nav>
16
+ <a href="../../">home</a>
17
+ </nav>
18
+
19
+ <h1>Edge Impulse | BrilliantSole JavaScript SDK</h1>
20
+
21
+ <h3>Available Devices</h3>
22
+ <div id="availableDevices">
23
+ <template id="availableDeviceTemplate">
24
+ <div class="availableDevice">
25
+ <ul>
26
+ <li><b>name: </b> <span class="name"></span></li>
27
+ <li><b>type: </b> <span class="type"></span></li>
28
+ <li><button class="toggleConnection">connect</button></li>
29
+ </ul>
30
+ </div>
31
+ </template>
32
+ </div>
33
+
34
+ <h3>Device Connection</h3>
35
+ <button id="toggleConnection">connect</button>
36
+ <button id="reconnect" disabled>reconnect</button>
37
+ <label>reconnect on disconnection? <input id="reconnectOnDisconnection" type="checkbox" /></label>
38
+
39
+ <h3>Device Information</h3>
40
+ <pre id="deviceInformationPre"></pre>
41
+ <div class="column">
42
+ <label>name: <span id="name"></span></label>
43
+ <label>battery level: <span id="batteryLevel">_</span>%</label>
44
+ <label>type: <span id="type"></span></label>
45
+ </div>
46
+ <label>
47
+ sensor configuration:
48
+ <pre id="sensorConfigurationPre"></pre>
49
+ </label>
50
+
51
+ <h3>Keys</h3>
52
+
53
+ <div class="column">
54
+ <label>api key <input type="string" id="apiKey" size="70" /></label>
55
+ <label>project id <input type="string" id="projectId" size="8" /></label>
56
+ </div>
57
+
58
+ <h3>Remote Management</h3>
59
+
60
+ <button id="toggleRemoteManagementConnection" disabled>connect</button>
61
+ <label>
62
+ reconnect on disconnection? <input id="reconnectRemoteManagementOnDisconnection" type="checkbox" />
63
+ </label>
64
+
65
+ <h3>Sensor Types</h3>
66
+
67
+ <div id="sensorTypes" class="column">
68
+ <template id="sensorTypeTemplate">
69
+ <label class="sensorType">
70
+ <b class="name"></b>
71
+ <input class="enabled" type="checkbox" />
72
+ </label>
73
+ </template>
74
+ </div>
75
+
76
+ <h3>Sampling</h3>
77
+
78
+ <div class="column">
79
+ <label>path <input id="path" type="text" readonly /></label>
80
+ <label>label <input id="label" type="text" /></label>
81
+ <label>
82
+ interval (ms) <input id="samplingInterval" type="number" min="10" value="20" step="5" max="1000" />
83
+ </label>
84
+ <label>number of samples <input id="numberOfSamples" type="number" min="1" value="1" step="1" /></label>
85
+ <label>
86
+ length (ms)
87
+ <input id="samplingLength" readonly type="number" min="10" value="20" step="5" max="60000" />
88
+ </label>
89
+ </div>
90
+
91
+ <button id="getHmacKey" disabled>get hmacKey</button>
92
+ <button id="toggleSampling" disabled>start sampling</button>
93
+ </body>
94
+ </html>