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,138 @@
1
+ <html>
2
+ <head>
3
+ <title>Balance | 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
+ #balanceContainer {
11
+ width: 500px;
12
+ height: 80%;
13
+ margin: 1rem auto;
14
+ display: flex;
15
+ flex-direction: row;
16
+ justify-content: space-evenly;
17
+ gap: 50px;
18
+ }
19
+
20
+ .balanceSide {
21
+ height: 100%;
22
+ width: 40%;
23
+ position: relative;
24
+ display: flex;
25
+ justify-content: center;
26
+ }
27
+ .balanceSide .meter {
28
+ height: 100%;
29
+ width: 100%;
30
+ border-radius: 40px;
31
+ border: solid black thick;
32
+ overflow: hidden;
33
+ box-sizing: border-box;
34
+ position: relative;
35
+ }
36
+
37
+ .balanceSide .meter .fill {
38
+ background-color: red;
39
+ width: 100%;
40
+ bottom: 0;
41
+ position: absolute;
42
+ height: 0%;
43
+ }
44
+
45
+ .balanceSide .target {
46
+ width: calc(100% + 50px);
47
+ position: absolute;
48
+ background-color: yellow;
49
+ margin: auto;
50
+ z-index: 1;
51
+ opacity: 0.5;
52
+ border-radius: 15px;
53
+ height: 20%;
54
+ bottom: 50%;
55
+ display: flex;
56
+ }
57
+ #balanceContainer.hover .balanceSide .target {
58
+ background-color: limegreen;
59
+ }
60
+ #balanceContainer:not(.game) .balanceSide .target {
61
+ display: none;
62
+ }
63
+ .balanceSide .target .ring {
64
+ margin: auto;
65
+ box-sizing: border-box;
66
+ border: solid thick blue;
67
+ width: 100%;
68
+ height: 100%;
69
+ border-radius: 15px;
70
+ }
71
+ #balanceContainer:not(.hover) .balanceSide .target .ring {
72
+ display: none;
73
+ }
74
+
75
+ @keyframes shrink {
76
+ from {
77
+ width: 100%;
78
+ height: 100%;
79
+ }
80
+ to {
81
+ width: 0%;
82
+ height: 0%;
83
+ }
84
+ }
85
+ #balanceContainer.hover .balanceSide .target .ring {
86
+ animation-name: shrink;
87
+ animation-duration: 3s;
88
+ animation-timing-function: linear;
89
+ }
90
+ </style>
91
+
92
+ <body>
93
+ <nav>
94
+ <a href="../../">home</a>
95
+ </nav>
96
+
97
+ <h1>Balance | BrilliantSole JavaScript SDK</h1>
98
+
99
+ <button id="toggleServerConnection">connect to server</button>
100
+
101
+ <div>
102
+ <h2>available devices</h2>
103
+ <div id="availableDevices">
104
+ <template id="availableDeviceTemplate">
105
+ <div class="availableDevice">
106
+ <ul>
107
+ <li><b>name: </b> <span class="name"></span></li>
108
+ <li><b>type: </b> <span class="type"></span></li>
109
+ <li><button class="toggleConnection">connect</button></li>
110
+ </ul>
111
+ </div>
112
+ </template>
113
+ </div>
114
+ </div>
115
+
116
+ <br />
117
+
118
+ <div>
119
+ <button id="addDevice">add device</button>
120
+ <button id="togglePressureData" disabled>enable pressure data</button>
121
+ <button id="resetPressureRange" disabled>recalibrate</button>
122
+ <button id="toggleGame">start game</button>
123
+ </div>
124
+
125
+ <div id="balanceContainer">
126
+ <template id="balanceSideTemplate">
127
+ <div class="balanceSide">
128
+ <div class="target">
129
+ <div class="ring"></div>
130
+ </div>
131
+ <div class="meter">
132
+ <div class="fill"></div>
133
+ </div>
134
+ </div>
135
+ </template>
136
+ </div>
137
+ </body>
138
+ </html>
@@ -0,0 +1,243 @@
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
+ // BALANCE VISUALIZATION
74
+
75
+ const balanceContainer = document.getElementById("balanceContainer");
76
+ /** @type {HTMLTemplateElement} */
77
+ const balanceSideTemplate = document.getElementById("balanceSideTemplate");
78
+
79
+ const balanceSideElements = {};
80
+ window.balanceSideElements = balanceSideElements;
81
+
82
+ devicePair.sides.forEach((side) => {
83
+ /** @type {HTMLElement} */
84
+ const balanceSideContainer = balanceSideTemplate.content.cloneNode(true).querySelector(".balanceSide");
85
+ balanceSideContainer.classList.add(side);
86
+ balanceContainer.appendChild(balanceSideContainer);
87
+ const target = balanceSideContainer.querySelector(".target");
88
+ const fill = balanceSideContainer.querySelector(".fill");
89
+ balanceSideElements[side] = { target, fill };
90
+ });
91
+
92
+ let isPressureDataEnabled = false;
93
+
94
+ /** @type {HTMLButtonElement} */
95
+ const togglePressureDataButton = document.getElementById("togglePressureData");
96
+ devicePair.addEventListener("isConnected", () => {
97
+ togglePressureDataButton.disabled = !devicePair.isConnected;
98
+ });
99
+ togglePressureDataButton.addEventListener("click", () => {
100
+ isPressureDataEnabled = !isPressureDataEnabled;
101
+ console.log({ isPressureDataEnabled });
102
+ togglePressureDataButton.innerText = isPressureDataEnabled ? "disable pressure data" : "enable pressure data";
103
+ devicePair.setSensorConfiguration({ pressure: isPressureDataEnabled ? 20 : 0 });
104
+ });
105
+
106
+ /** @type {HTMLButtonElement} */
107
+ const resetPressureRangeButton = document.getElementById("resetPressureRange");
108
+ devicePair.addEventListener("isConnected", () => {
109
+ resetPressureRangeButton.disabled = !devicePair.isConnected;
110
+ });
111
+ resetPressureRangeButton.addEventListener("click", () => {
112
+ devicePair.resetPressureRange();
113
+ });
114
+
115
+ /** @param {BS.CenterOfPressure} center */
116
+ function updateUIOnCenterOfPressure(center) {
117
+ devicePair.sides.forEach((side) => {
118
+ let height = center.x;
119
+ if (side == "left") {
120
+ height = 1 - height;
121
+ }
122
+ balanceSideElements[side].fill.style.height = `${height * 100}%`;
123
+ });
124
+ }
125
+ window.updateUIOnCenterOfPressure = updateUIOnCenterOfPressure;
126
+
127
+ let isPlayingGame = false;
128
+
129
+ /** @type {HTMLButtonElement} */
130
+ const toggleGameButton = document.getElementById("toggleGame");
131
+ devicePair.addEventListener("isConnected", () => {
132
+ //toggleGameButton.disabled = !devicePair.isConnected;
133
+ });
134
+ toggleGameButton.addEventListener("click", () => {
135
+ isPlayingGame = !isPlayingGame;
136
+ toggleGameButton.innerText = isPlayingGame ? "stop game" : "start game";
137
+
138
+ if (isPlayingGame) {
139
+ target.reset();
140
+ balanceContainer.classList.add("game");
141
+ } else {
142
+ balanceContainer.classList.remove("game");
143
+ }
144
+ });
145
+
146
+ /**
147
+ * @param {number} min
148
+ * @param {number} max
149
+ */
150
+ function randomValueBetween(min, max) {
151
+ const range = max - min;
152
+ return min + Math.random() * range;
153
+ }
154
+
155
+ const target = {
156
+ height: 0,
157
+ start: 0,
158
+
159
+ /** @param {BS.CenterOfPressure} center */
160
+ isInside(center) {
161
+ console.log(center, this);
162
+ return center.x >= this.start && center.x <= this.start + this.height;
163
+ },
164
+
165
+ reset() {
166
+ balanceContainer.classList.remove("hover");
167
+
168
+ this.height = randomValueBetween(0.2, 0.3);
169
+ this.start = randomValueBetween(0, 1 - this.height);
170
+
171
+ devicePair.sides.forEach((side) => {
172
+ let bottom = this.start;
173
+ if (side == "left") {
174
+ bottom = 1 - bottom - this.height;
175
+ }
176
+ balanceSideElements[side].target.style.bottom = `${bottom * 100}%`;
177
+ balanceSideElements[side].target.style.height = `${this.height * 100}%`;
178
+ });
179
+ },
180
+ };
181
+
182
+ let isCenterOfPressureInsideTarget = false;
183
+ let insideTargetTimeoutId;
184
+
185
+ devicePair.addEventListener("pressure", (event) => {
186
+ const { pressure } = event.message;
187
+ console.log({ pressure });
188
+ if (pressure.normalizedCenter) {
189
+ console.log("center", pressure.normalizedCenter);
190
+ onCenterOfPressure(pressure.normalizedCenter);
191
+ }
192
+ });
193
+
194
+ /** @param {BS.CenterOfPressure} center */
195
+ function onCenterOfPressure(center) {
196
+ updateUIOnCenterOfPressure(center);
197
+
198
+ if (isPlayingGame) {
199
+ isCenterOfPressureInsideTarget = target.isInside(center);
200
+ console.log({ isCenterOfPressureInsideTarget });
201
+ if (isCenterOfPressureInsideTarget) {
202
+ if (insideTargetTimeoutId == undefined) {
203
+ balanceContainer.classList.add("hover");
204
+ insideTargetTimeoutId = setTimeout(() => {
205
+ target.reset();
206
+ }, 3000);
207
+ }
208
+ } else {
209
+ if (insideTargetTimeoutId != undefined) {
210
+ balanceContainer.classList.remove("hover");
211
+ clearTimeout(insideTargetTimeoutId);
212
+ insideTargetTimeoutId = undefined;
213
+ }
214
+ }
215
+ }
216
+ }
217
+ window.onCenterOfPressure = onCenterOfPressure; // for manual testing
218
+
219
+ // SERVER
220
+
221
+ const websocketClient = new BS.WebSocketClient();
222
+ /** @type {HTMLButtonElement} */
223
+ const toggleServerConnectionButton = document.getElementById("toggleServerConnection");
224
+ toggleServerConnectionButton.addEventListener("click", () => {
225
+ websocketClient.toggleConnection();
226
+ });
227
+ websocketClient.addEventListener("isConnected", () => {
228
+ toggleServerConnectionButton.innerText = websocketClient.isConnected ? "disconnect from server" : "connect to server";
229
+ });
230
+ websocketClient.addEventListener("connectionStatus", () => {
231
+ let disabled;
232
+ switch (websocketClient.connectionStatus) {
233
+ case "notConnected":
234
+ case "connected":
235
+ disabled = false;
236
+ break;
237
+ case "connecting":
238
+ case "disconnecting":
239
+ disabled = true;
240
+ break;
241
+ }
242
+ toggleServerConnectionButton.disabled = disabled;
243
+ });