brilliantsole 0.0.27 → 0.0.29

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 (202) hide show
  1. package/assets/3d/anchor.glb +0 -0
  2. package/assets/3d/coin.glb +0 -0
  3. package/assets/3d/glasses.glb +0 -0
  4. package/assets/audio/bounceMedium.wav +0 -0
  5. package/assets/audio/bounceStrong.wav +0 -0
  6. package/assets/audio/bounceWeak.wav +0 -0
  7. package/assets/audio/coin.wav +0 -0
  8. package/assets/audio/getUp.wav +0 -0
  9. package/assets/audio/grab.wav +0 -0
  10. package/assets/audio/kick.wav +0 -0
  11. package/assets/audio/platterFadeIn old.wav +0 -0
  12. package/assets/audio/platterFadeIn.wav +0 -0
  13. package/assets/audio/platterFadeOut.wav +0 -0
  14. package/assets/audio/punch.wav +0 -0
  15. package/assets/audio/punchSqueak.wav +0 -0
  16. package/assets/audio/purr.wav +0 -0
  17. package/assets/audio/purrFadeOut.wav +0 -0
  18. package/assets/audio/release.wav +0 -0
  19. package/assets/audio/splat.wav +0 -0
  20. package/assets/audio/stomp.wav +0 -0
  21. package/build/brilliantsole.cjs +3091 -741
  22. package/build/brilliantsole.cjs.map +1 -1
  23. package/build/brilliantsole.js +2759 -709
  24. package/build/brilliantsole.js.map +1 -1
  25. package/build/brilliantsole.ls.js +2602 -543
  26. package/build/brilliantsole.ls.js.map +1 -1
  27. package/build/brilliantsole.min.js +1 -1
  28. package/build/brilliantsole.min.js.map +1 -1
  29. package/build/brilliantsole.module.d.ts +295 -65
  30. package/build/brilliantsole.module.js +2749 -710
  31. package/build/brilliantsole.module.js.map +1 -1
  32. package/build/brilliantsole.module.min.d.ts +295 -65
  33. package/build/brilliantsole.module.min.js +1 -1
  34. package/build/brilliantsole.module.min.js.map +1 -1
  35. package/build/brilliantsole.node.module.d.ts +289 -62
  36. package/build/brilliantsole.node.module.js +3080 -742
  37. package/build/brilliantsole.node.module.js.map +1 -1
  38. package/build/dts/BS-output.d.ts +10 -0
  39. package/build/dts/BS.d.ts +21 -8
  40. package/build/dts/CameraManager.d.ts +72 -0
  41. package/build/dts/Device.d.ts +64 -13
  42. package/build/dts/DeviceInformationManager.d.ts +4 -4
  43. package/build/dts/DeviceManager.d.ts +2 -0
  44. package/build/dts/FileTransferManager.d.ts +18 -8
  45. package/build/dts/InformationManager.d.ts +2 -0
  46. package/build/dts/MicrophoneManager.d.ts +88 -0
  47. package/build/dts/TfliteManager.d.ts +22 -2
  48. package/build/dts/WifiManager.d.ts +61 -0
  49. package/build/dts/connection/BaseConnectionManager.d.ts +35 -3
  50. package/build/dts/connection/ClientConnectionManager.d.ts +7 -2
  51. package/build/dts/connection/bluetooth/NobleConnectionManager.d.ts +2 -1
  52. package/build/dts/connection/bluetooth/WebBluetoothConnectionManager.d.ts +1 -0
  53. package/build/dts/connection/bluetooth/bluetoothUUIDs.d.ts +2 -2
  54. package/build/dts/connection/udp/UDPConnectionManager.d.ts +28 -0
  55. package/build/dts/connection/webSocket/WebSocketConnectionManager.d.ts +25 -0
  56. package/build/dts/devicePair/DevicePair.d.ts +5 -5
  57. package/build/dts/scanner/BaseScanner.d.ts +4 -1
  58. package/build/dts/scanner/NobleScanner.d.ts +2 -1
  59. package/build/dts/sensor/MotionSensorDataManager.d.ts +5 -2
  60. package/build/dts/sensor/SensorDataManager.d.ts +5 -4
  61. package/build/dts/server/BaseClient.d.ts +5 -3
  62. package/build/dts/server/ServerUtils.d.ts +1 -1
  63. package/build/dts/server/websocket/WebSocketUtils.d.ts +1 -1
  64. package/build/dts/utils/AudioUtils.d.ts +2 -0
  65. package/build/dts/utils/Console.d.ts +2 -0
  66. package/build/dts/utils/ThrottleUtils.d.ts +2 -0
  67. package/build/dts/vibration/VibrationManager.d.ts +19 -2
  68. package/build/index.d.ts +292 -62
  69. package/build/index.node.d.ts +286 -59
  70. package/examples/3d/scene.html +19 -5
  71. package/examples/3d-generic/index.html +144 -0
  72. package/examples/3d-generic/script.js +266 -0
  73. package/examples/basic/index.html +267 -17
  74. package/examples/basic/script.js +958 -105
  75. package/examples/camera/barcode-detector.js +109 -0
  76. package/examples/camera/depth-estimation.js +71 -0
  77. package/examples/camera/face-detector.js +119 -0
  78. package/examples/camera/face-landmark.js +111 -0
  79. package/examples/camera/gesture-recognition.js +97 -0
  80. package/examples/camera/hand-landmark.js +74 -0
  81. package/examples/camera/image-segmentation.js +98 -0
  82. package/examples/camera/image-to-text.js +43 -0
  83. package/examples/camera/image-upscale.js +75 -0
  84. package/examples/camera/index.html +129 -0
  85. package/examples/camera/object-detection.js +98 -0
  86. package/examples/camera/pose-landmark.js +60 -0
  87. package/examples/camera/script.js +316 -0
  88. package/examples/camera/utils.js +165 -0
  89. package/examples/camera/yolo-tiny.js +54 -0
  90. package/examples/camera/yolo.js +119 -0
  91. package/examples/edge-impulse/script.js +157 -48
  92. package/examples/edge-impulse-test/README.md +11 -0
  93. package/examples/edge-impulse-test/edge-impulse-standalone.js +7228 -0
  94. package/examples/edge-impulse-test/edge-impulse-standalone.wasm +0 -0
  95. package/examples/edge-impulse-test/index.html +75 -0
  96. package/examples/edge-impulse-test/run-impulse.js +135 -0
  97. package/examples/edge-impulse-test/script.js +200 -0
  98. package/examples/glasses-gestures/README.md +11 -0
  99. package/examples/glasses-gestures/edge-impulse-standalone.js +7228 -0
  100. package/examples/glasses-gestures/edge-impulse-standalone.wasm +0 -0
  101. package/examples/glasses-gestures/index.html +69 -0
  102. package/examples/glasses-gestures/run-impulse.js +135 -0
  103. package/examples/glasses-gestures/script.js +226 -0
  104. package/examples/gloves/edge-impulse-standalone.js +7228 -0
  105. package/examples/gloves/edge-impulse-standalone.wasm +0 -0
  106. package/examples/gloves/index.html +4 -1
  107. package/examples/gloves/run-impulse.js +135 -0
  108. package/examples/gloves/script.js +367 -51
  109. package/examples/graph/script.js +94 -37
  110. package/examples/microphone/gender.js +54 -0
  111. package/examples/microphone/index.html +102 -0
  112. package/examples/microphone/script.js +394 -0
  113. package/examples/microphone/utils.js +45 -0
  114. package/examples/microphone/whisper-realtime.js +166 -0
  115. package/examples/microphone/whisper.js +132 -0
  116. package/examples/punch/index.html +135 -0
  117. package/examples/punch/punch.tflite +0 -0
  118. package/examples/punch/script.js +169 -0
  119. package/examples/server/index.html +98 -22
  120. package/examples/server/script.js +317 -109
  121. package/examples/ukaton-firmware-update/merged-firmware.bin +0 -0
  122. package/examples/utils/aframe/aframe-master.min.js +2 -0
  123. package/examples/utils/aframe/bs-vibration.js +150 -0
  124. package/examples/utils/aframe/force-pushable.js +80 -0
  125. package/examples/utils/aframe/grabbable-anchor.js +46 -0
  126. package/examples/utils/aframe/grabbable-listener.js +31 -0
  127. package/examples/utils/aframe/grabbable-physics-body.js +190 -0
  128. package/examples/utils/aframe/grow-shrink.js +25 -0
  129. package/examples/utils/aframe/hand-punch.js +119 -0
  130. package/examples/utils/aframe/my-obb-collider.js +293 -0
  131. package/examples/utils/aframe/occlude-hand-tracking-controls.js +47 -0
  132. package/examples/utils/aframe/occlude-mesh.js +42 -0
  133. package/examples/utils/aframe/palm-up-detector.js +47 -0
  134. package/examples/utils/aframe/shadow-material.js +20 -0
  135. package/examples/utils/aframe/soft-shadow-light.js +9 -0
  136. package/examples/webxr-2/assets/3d/soccerBall.glb +0 -0
  137. package/examples/webxr-2/assets/audio/shellBounce.wav +0 -0
  138. package/examples/webxr-2/assets/audio/shellHit.wav +0 -0
  139. package/examples/webxr-2/assets/audio/shellKick.wav +0 -0
  140. package/examples/webxr-2/assets/audio/soccerBounce.wav +0 -0
  141. package/examples/webxr-2/assets/audio/soccerKick.mp3 +0 -0
  142. package/examples/webxr-2/assets/images/shellTexture.png +0 -0
  143. package/examples/webxr-2/components/bs-ankle.js +337 -0
  144. package/examples/webxr-2/components/coin.js +84 -0
  145. package/examples/webxr-2/components/custom-wrap.js +17 -0
  146. package/examples/webxr-2/components/goomba.js +3250 -0
  147. package/examples/webxr-2/components/init-shell-material.js +215 -0
  148. package/examples/webxr-2/components/platter.js +172 -0
  149. package/examples/webxr-2/components/shell.js +374 -0
  150. package/examples/webxr-2/components/soccer-ball.js +250 -0
  151. package/examples/webxr-2/components/squashed-goomba.js +249 -0
  152. package/examples/webxr-2/edge-impulse-standalone.js +7228 -0
  153. package/examples/webxr-2/edge-impulse-standalone.wasm +0 -0
  154. package/examples/webxr-2/index.html +996 -0
  155. package/examples/webxr-2/kick.tflite +0 -0
  156. package/examples/webxr-2/kick2.tflite +0 -0
  157. package/examples/webxr-2/run-impulse.js +135 -0
  158. package/examples/webxr-2/script.js +384 -0
  159. package/examples/webxr-3/components/bs-camera.js +65 -0
  160. package/examples/webxr-3/index.html +134 -0
  161. package/examples/webxr-3/script.js +432 -0
  162. package/package.json +2 -1
  163. package/src/.prettierrc +4 -0
  164. package/src/BS.ts +79 -8
  165. package/src/CameraManager.ts +497 -0
  166. package/src/Device.ts +691 -86
  167. package/src/DeviceInformationManager.ts +19 -10
  168. package/src/DeviceManager.ts +85 -25
  169. package/src/FileTransferManager.ts +145 -20
  170. package/src/InformationManager.ts +40 -15
  171. package/src/MicrophoneManager.ts +599 -0
  172. package/src/TfliteManager.ts +171 -25
  173. package/src/WifiManager.ts +323 -0
  174. package/src/connection/BaseConnectionManager.ts +130 -30
  175. package/src/connection/ClientConnectionManager.ts +34 -10
  176. package/src/connection/bluetooth/BluetoothConnectionManager.ts +8 -2
  177. package/src/connection/bluetooth/NobleConnectionManager.ts +147 -41
  178. package/src/connection/bluetooth/WebBluetoothConnectionManager.ts +99 -34
  179. package/src/connection/bluetooth/bluetoothUUIDs.ts +40 -13
  180. package/src/connection/udp/UDPConnectionManager.ts +356 -0
  181. package/src/connection/websocket/WebSocketConnectionManager.ts +282 -0
  182. package/src/devicePair/DevicePair.ts +95 -25
  183. package/src/devicePair/DevicePairPressureSensorDataManager.ts +27 -7
  184. package/src/scanner/BaseScanner.ts +49 -11
  185. package/src/scanner/NobleScanner.ts +76 -14
  186. package/src/sensor/MotionSensorDataManager.ts +21 -6
  187. package/src/sensor/PressureSensorDataManager.ts +37 -8
  188. package/src/sensor/SensorConfigurationManager.ts +73 -22
  189. package/src/sensor/SensorDataManager.ts +109 -23
  190. package/src/server/BaseClient.ts +150 -36
  191. package/src/server/BaseServer.ts +50 -2
  192. package/src/server/ServerUtils.ts +39 -9
  193. package/src/server/udp/UDPServer.ts +73 -22
  194. package/src/server/udp/UDPUtils.ts +9 -2
  195. package/src/server/websocket/WebSocketClient.ts +27 -7
  196. package/src/server/websocket/WebSocketUtils.ts +4 -2
  197. package/src/utils/AudioUtils.ts +65 -0
  198. package/src/utils/Console.ts +62 -9
  199. package/src/utils/ParseUtils.ts +24 -5
  200. package/src/utils/ThrottleUtils.ts +62 -0
  201. package/src/utils/Timer.ts +1 -1
  202. package/src/vibration/VibrationManager.ts +166 -40
@@ -5,21 +5,70 @@ import { FileTransferMessageTypes } from "../FileTransferManager.ts";
5
5
  import { TfliteMessageTypes } from "../TfliteManager.ts";
6
6
  import { concatenateArrayBuffers } from "../utils/ArrayBufferUtils.ts";
7
7
  import { parseMessage } from "../utils/ParseUtils.ts";
8
- import { DeviceInformationMessageTypes } from "../DeviceInformationManager.ts";
8
+ import { DeviceInformationTypes } from "../DeviceInformationManager.ts";
9
9
  import { InformationMessageTypes } from "../InformationManager.ts";
10
10
  import { VibrationMessageTypes } from "../vibration/VibrationManager.ts";
11
11
  import { SensorConfigurationMessageTypes } from "../sensor/SensorConfigurationManager.ts";
12
12
  import { SensorDataMessageTypes } from "../sensor/SensorDataManager.ts";
13
+ import { WifiMessageTypes } from "../WifiManager.ts";
14
+ import { CameraMessageTypes } from "../CameraManager.ts";
15
+ import { MicrophoneMessageTypes } from "../MicrophoneManager.ts";
13
16
 
14
17
  const _console = createConsole("BaseConnectionManager", { log: false });
15
18
 
16
- export const ConnectionTypes = ["webBluetooth", "noble", "client"] as const;
19
+ export const ConnectionTypes = [
20
+ "webBluetooth",
21
+ "noble",
22
+ "client",
23
+ "webSocket",
24
+ "udp",
25
+ ] as const;
17
26
  export type ConnectionType = (typeof ConnectionTypes)[number];
18
27
 
19
- export const ConnectionStatuses = ["notConnected", "connecting", "connected", "disconnecting"] as const;
28
+ export const ClientConnectionTypes = ["noble", "webSocket", "udp"] as const;
29
+ export type ClientConnectionType = (typeof ClientConnectionTypes)[number];
30
+
31
+ interface BaseConnectOptions {
32
+ type: "client" | "webBluetooth" | "webSocket" | "udp";
33
+ }
34
+ export interface WebBluetoothConnectOptions extends BaseConnectOptions {
35
+ type: "webBluetooth";
36
+ }
37
+ interface BaseWifiConnectOptions extends BaseConnectOptions {
38
+ ipAddress: string;
39
+ }
40
+ export interface ClientConnectOptions extends BaseConnectOptions {
41
+ type: "client";
42
+ subType?: "noble" | "webSocket" | "udp";
43
+ }
44
+ export interface WebSocketConnectOptions extends BaseWifiConnectOptions {
45
+ type: "webSocket";
46
+ isWifiSecure?: boolean;
47
+ }
48
+ export interface UDPConnectOptions extends BaseWifiConnectOptions {
49
+ type: "udp";
50
+ //sendPort: number;
51
+ receivePort?: number;
52
+ }
53
+ export type ConnectOptions =
54
+ | WebBluetoothConnectOptions
55
+ | WebSocketConnectOptions
56
+ | UDPConnectOptions
57
+ | ClientConnectOptions;
58
+
59
+ export const ConnectionStatuses = [
60
+ "notConnected",
61
+ "connecting",
62
+ "connected",
63
+ "disconnecting",
64
+ ] as const;
20
65
  export type ConnectionStatus = (typeof ConnectionStatuses)[number];
21
66
 
22
- export const ConnectionEventTypes = [...ConnectionStatuses, "connectionStatus", "isConnected"] as const;
67
+ export const ConnectionEventTypes = [
68
+ ...ConnectionStatuses,
69
+ "connectionStatus",
70
+ "isConnected",
71
+ ] as const;
23
72
  export type ConnectionEventType = (typeof ConnectionEventTypes)[number];
24
73
 
25
74
  export interface ConnectionStatusEventMessages {
@@ -41,8 +90,11 @@ export const TxRxMessageTypes = [
41
90
  ...SensorConfigurationMessageTypes,
42
91
  ...SensorDataMessageTypes,
43
92
  ...VibrationMessageTypes,
44
- ...TfliteMessageTypes,
45
93
  ...FileTransferMessageTypes,
94
+ ...TfliteMessageTypes,
95
+ ...WifiMessageTypes,
96
+ ...CameraMessageTypes,
97
+ ...MicrophoneMessageTypes,
46
98
  ] as const;
47
99
  export type TxRxMessageType = (typeof TxRxMessageTypes)[number];
48
100
 
@@ -53,11 +105,12 @@ export const BatteryLevelMessageTypes = ["batteryLevel"] as const;
53
105
  export type BatteryLevelMessageType = (typeof BatteryLevelMessageTypes)[number];
54
106
 
55
107
  export const MetaConnectionMessageTypes = ["rx", "tx"] as const;
56
- export type MetaConnectionMessageType = (typeof MetaConnectionMessageTypes)[number];
108
+ export type MetaConnectionMessageType =
109
+ (typeof MetaConnectionMessageTypes)[number];
57
110
 
58
111
  export const ConnectionMessageTypes = [
59
112
  ...BatteryLevelMessageTypes,
60
- ...DeviceInformationMessageTypes,
113
+ ...DeviceInformationTypes,
61
114
  ...MetaConnectionMessageTypes,
62
115
  ...TxRxMessageTypes,
63
116
  ...SMPMessageTypes,
@@ -65,7 +118,10 @@ export const ConnectionMessageTypes = [
65
118
  export type ConnectionMessageType = (typeof ConnectionMessageTypes)[number];
66
119
 
67
120
  export type ConnectionStatusCallback = (status: ConnectionStatus) => void;
68
- export type MessageReceivedCallback = (messageType: ConnectionMessageType, dataView: DataView) => void;
121
+ export type MessageReceivedCallback = (
122
+ messageType: ConnectionMessageType,
123
+ dataView: DataView
124
+ ) => void;
69
125
  export type MessagesReceivedCallback = () => void;
70
126
 
71
127
  abstract class BaseConnectionManager {
@@ -101,7 +157,10 @@ abstract class BaseConnectionManager {
101
157
 
102
158
  /** @throws {Error} if not supported */
103
159
  #assertIsSupported() {
104
- _console.assertWithError(this.isSupported, `${this.constructor.name} is not supported`);
160
+ _console.assertWithError(
161
+ this.isSupported,
162
+ `${this.constructor.name} is not supported`
163
+ );
105
164
  }
106
165
 
107
166
  constructor() {
@@ -115,7 +174,9 @@ abstract class BaseConnectionManager {
115
174
  protected set status(newConnectionStatus) {
116
175
  _console.assertEnumWithError(newConnectionStatus, ConnectionStatuses);
117
176
  if (this.#status == newConnectionStatus) {
118
- _console.log(`tried to assign same connection status "${newConnectionStatus}"`);
177
+ _console.log(
178
+ `tried to assign same connection status "${newConnectionStatus}"`
179
+ );
119
180
  return;
120
181
  }
121
182
  _console.log(`new connection status "${newConnectionStatus}"`);
@@ -129,7 +190,7 @@ abstract class BaseConnectionManager {
129
190
  }
130
191
 
131
192
  if (this.#status == "notConnected") {
132
- this.mtu = this.#defaultMtu;
193
+ this.mtu = this.defaultMtu;
133
194
  }
134
195
  }
135
196
 
@@ -142,29 +203,35 @@ abstract class BaseConnectionManager {
142
203
  }
143
204
 
144
205
  /** @throws {Error} if connected */
145
- #assertIsNotConnected() {
206
+ protected assertIsNotConnected() {
146
207
  _console.assertWithError(!this.isConnected, "device is already connected");
147
208
  }
148
209
  /** @throws {Error} if connecting */
149
210
  #assertIsNotConnecting() {
150
- _console.assertWithError(this.status != "connecting", "device is already connecting");
211
+ _console.assertWithError(
212
+ this.status != "connecting",
213
+ "device is already connecting"
214
+ );
151
215
  }
152
216
  /** @throws {Error} if not connected */
153
- #assertIsConnected() {
217
+ protected assertIsConnected() {
154
218
  _console.assertWithError(this.isConnected, "device is not connected");
155
219
  }
156
220
  /** @throws {Error} if disconnecting */
157
221
  #assertIsNotDisconnecting() {
158
- _console.assertWithError(this.status != "disconnecting", "device is already disconnecting");
222
+ _console.assertWithError(
223
+ this.status != "disconnecting",
224
+ "device is already disconnecting"
225
+ );
159
226
  }
160
227
  /** @throws {Error} if not connected or is disconnecting */
161
- #assertIsConnectedAndNotDisconnecting() {
162
- this.#assertIsConnected();
228
+ assertIsConnectedAndNotDisconnecting() {
229
+ this.assertIsConnected();
163
230
  this.#assertIsNotDisconnecting();
164
231
  }
165
232
 
166
233
  async connect() {
167
- this.#assertIsNotConnected();
234
+ this.assertIsNotConnected();
168
235
  this.#assertIsNotConnecting();
169
236
  this.status = "connecting";
170
237
  }
@@ -172,26 +239,31 @@ abstract class BaseConnectionManager {
172
239
  return false;
173
240
  }
174
241
  async reconnect() {
175
- this.#assertIsNotConnected();
242
+ this.assertIsNotConnected();
176
243
  this.#assertIsNotConnecting();
177
- _console.assert(this.canReconnect, "unable to reconnect");
244
+ _console.assertWithError(this.canReconnect, "unable to reconnect");
245
+ this.status = "connecting";
246
+ _console.log("attempting to reconnect...");
178
247
  }
179
248
  async disconnect() {
180
- this.#assertIsConnected();
249
+ this.assertIsConnected();
181
250
  this.#assertIsNotDisconnecting();
182
251
  this.status = "disconnecting";
183
252
  _console.log("disconnecting from device...");
184
253
  }
185
254
 
186
255
  async sendSmpMessage(data: ArrayBuffer) {
187
- this.#assertIsConnectedAndNotDisconnecting();
256
+ this.assertIsConnectedAndNotDisconnecting();
188
257
  _console.log("sending smp message", data);
189
258
  }
190
259
 
191
260
  #pendingMessages: TxMessage[] = [];
192
261
  #isSendingMessages = false;
193
- async sendTxMessages(messages: TxMessage[] | undefined, sendImmediately: boolean = true) {
194
- this.#assertIsConnectedAndNotDisconnecting();
262
+ async sendTxMessages(
263
+ messages: TxMessage[] | undefined,
264
+ sendImmediately: boolean = true
265
+ ) {
266
+ this.assertIsConnectedAndNotDisconnecting();
195
267
 
196
268
  if (messages) {
197
269
  this.#pendingMessages.push(...messages);
@@ -207,6 +279,10 @@ abstract class BaseConnectionManager {
207
279
  _console.log("already sending messages - waiting until later");
208
280
  return;
209
281
  }
282
+ if (this.#pendingMessages.length == 0) {
283
+ _console.log("no pendingMessages");
284
+ return;
285
+ }
210
286
  this.#isSendingMessages = true;
211
287
 
212
288
  _console.log("sendTxMessages", this.#pendingMessages.slice());
@@ -222,7 +298,11 @@ abstract class BaseConnectionManager {
222
298
 
223
299
  if (this.mtu) {
224
300
  while (arrayBuffers.length > 0) {
225
- if (arrayBuffers.every((arrayBuffer) => arrayBuffer.byteLength > this.mtu! - 3)) {
301
+ if (
302
+ arrayBuffers.every(
303
+ (arrayBuffer) => arrayBuffer.byteLength > this.mtu! - 3
304
+ )
305
+ ) {
226
306
  _console.log("every arrayBuffer is too big to send");
227
307
  break;
228
308
  }
@@ -231,10 +311,14 @@ abstract class BaseConnectionManager {
231
311
  let arrayBufferCount = 0;
232
312
  arrayBuffers.some((arrayBuffer) => {
233
313
  if (arrayBufferByteLength + arrayBuffer.byteLength > this.mtu! - 3) {
234
- _console.log(`stopping appending arrayBuffers ( length ${arrayBuffer.byteLength} too much)`);
314
+ _console.log(
315
+ `stopping appending arrayBuffers ( length ${arrayBuffer.byteLength} too much)`
316
+ );
235
317
  return true;
236
318
  }
237
- _console.log(`allowing arrayBuffer with length ${arrayBuffer.byteLength}`);
319
+ _console.log(
320
+ `allowing arrayBuffer with length ${arrayBuffer.byteLength}`
321
+ );
238
322
  arrayBufferCount++;
239
323
  arrayBufferByteLength += arrayBuffer.byteLength;
240
324
  });
@@ -252,18 +336,26 @@ abstract class BaseConnectionManager {
252
336
  }
253
337
 
254
338
  this.#isSendingMessages = false;
339
+
340
+ this.sendTxMessages(undefined, true);
255
341
  }
256
342
 
257
- #defaultMtu = 23;
343
+ protected defaultMtu = 23;
258
344
  //mtu?: number;
259
- mtu?: number = this.#defaultMtu;
345
+ mtu?: number = this.defaultMtu;
260
346
 
261
347
  async sendTxData(data: ArrayBuffer) {
262
348
  _console.log("sendTxData", data);
263
349
  }
264
350
 
265
351
  parseRxMessage(dataView: DataView) {
266
- parseMessage(dataView, TxRxMessageTypes, this.#onRxMessage.bind(this), null, true);
352
+ parseMessage(
353
+ dataView,
354
+ TxRxMessageTypes,
355
+ this.#onRxMessage.bind(this),
356
+ null,
357
+ true
358
+ );
267
359
  this.onMessagesReceived!();
268
360
  }
269
361
 
@@ -285,6 +377,14 @@ abstract class BaseConnectionManager {
285
377
  this.#isSendingMessages = false;
286
378
  this.#pendingMessages.length = 0;
287
379
  }
380
+
381
+ remove() {
382
+ this.clear();
383
+
384
+ this.onStatusUpdated = undefined;
385
+ this.onMessageReceived = undefined;
386
+ this.onMessagesReceived = undefined;
387
+ }
288
388
  }
289
389
 
290
390
  export default BaseConnectionManager;
@@ -1,18 +1,32 @@
1
1
  import { createConsole } from "../utils/Console.ts";
2
2
  import { isInBrowser } from "../utils/environment.ts";
3
- import BaseConnectionManager, { ConnectionType, ConnectionMessageType } from "./BaseConnectionManager.ts";
3
+ import BaseConnectionManager, {
4
+ ConnectionType,
5
+ ConnectionMessageType,
6
+ ClientConnectionType,
7
+ } from "./BaseConnectionManager.ts";
4
8
  import { DeviceEventTypes } from "../Device.ts";
5
9
  import { parseMessage } from "../utils/ParseUtils.ts";
6
- import { DeviceInformationMessageTypes } from "../DeviceInformationManager.ts";
10
+ import { DeviceInformationTypes } from "../DeviceInformationManager.ts";
7
11
  import { DeviceEventType } from "../Device.ts";
8
12
  import { ClientDeviceMessage } from "../server/ServerUtils.ts";
9
13
  import BaseClient from "../server/BaseClient.ts";
14
+ import { DiscoveredDevice } from "../BS.ts";
10
15
 
11
16
  const _console = createConsole("ClientConnectionManager", { log: false });
12
17
 
13
- export type SendClientMessageCallback = (...messages: ClientDeviceMessage[]) => void;
18
+ export type SendClientMessageCallback = (
19
+ ...messages: ClientDeviceMessage[]
20
+ ) => void;
14
21
 
15
- const ClientDeviceInformationMessageTypes: ConnectionMessageType[] = [...DeviceInformationMessageTypes, "batteryLevel"];
22
+ export type SendClientConnectMessageCallback = (
23
+ connectionType?: ClientConnectionType
24
+ ) => void;
25
+
26
+ const ClientDeviceInformationMessageTypes: ConnectionMessageType[] = [
27
+ ...DeviceInformationTypes,
28
+ "batteryLevel",
29
+ ];
16
30
 
17
31
  class ClientConnectionManager extends BaseConnectionManager {
18
32
  static get isSupported() {
@@ -22,12 +36,15 @@ class ClientConnectionManager extends BaseConnectionManager {
22
36
  return "client";
23
37
  }
24
38
 
39
+ subType?: ClientConnectionType;
40
+
25
41
  get canUpdateFirmware() {
26
42
  // FIX - how to know if it has an smp characteristic?
27
43
  return false;
28
44
  }
29
45
 
30
46
  client!: BaseClient;
47
+ discoveredDevice!: DiscoveredDevice;
31
48
 
32
49
  #bluetoothId!: string;
33
50
  get bluetoothId() {
@@ -67,7 +84,7 @@ class ClientConnectionManager extends BaseConnectionManager {
67
84
 
68
85
  async connect() {
69
86
  await super.connect();
70
- this.sendClientConnectMessage();
87
+ this.sendClientConnectMessage(this.subType);
71
88
  }
72
89
  async disconnect() {
73
90
  await super.disconnect();
@@ -79,13 +96,13 @@ class ClientConnectionManager extends BaseConnectionManager {
79
96
  }
80
97
  async reconnect() {
81
98
  await super.reconnect();
82
- _console.log("attempting to reconnect...");
83
- this.connect();
99
+ this.sendClientConnectMessage();
84
100
  }
85
101
 
86
102
  sendClientMessage!: SendClientMessageCallback;
87
- sendClientConnectMessage!: Function;
103
+ sendClientConnectMessage!: SendClientConnectMessageCallback;
88
104
  sendClientDisconnectMessage!: Function;
105
+ sendRequiredDeviceInformationMessage!: Function;
89
106
 
90
107
  async sendSmpMessage(data: ArrayBuffer) {
91
108
  super.sendSmpMessage(data);
@@ -101,12 +118,19 @@ class ClientConnectionManager extends BaseConnectionManager {
101
118
  }
102
119
 
103
120
  #requestDeviceInformation() {
104
- this.sendClientMessage(...ClientDeviceInformationMessageTypes);
121
+ //this.sendClientMessage(...ClientDeviceInformationMessageTypes);
122
+ this.sendRequiredDeviceInformationMessage();
105
123
  }
106
124
 
107
125
  onClientMessage(dataView: DataView) {
108
126
  _console.log({ dataView });
109
- parseMessage(dataView, DeviceEventTypes, this.#onClientMessageCallback.bind(this), null, true);
127
+ parseMessage(
128
+ dataView,
129
+ DeviceEventTypes,
130
+ this.#onClientMessageCallback.bind(this),
131
+ null,
132
+ true
133
+ );
110
134
  this.onMessagesReceived!();
111
135
  }
112
136
 
@@ -13,7 +13,10 @@ abstract class BluetoothConnectionManager extends BaseConnectionManager {
13
13
 
14
14
  isInRange = true;
15
15
 
16
- protected onCharacteristicValueChanged(characteristicName: BluetoothCharacteristicName, dataView: DataView) {
16
+ protected onCharacteristicValueChanged(
17
+ characteristicName: BluetoothCharacteristicName,
18
+ dataView: DataView
19
+ ) {
17
20
  if (characteristicName == "rx") {
18
21
  this.parseRxMessage(dataView);
19
22
  } else {
@@ -21,7 +24,10 @@ abstract class BluetoothConnectionManager extends BaseConnectionManager {
21
24
  }
22
25
  }
23
26
 
24
- protected async writeCharacteristic(characteristicName: BluetoothCharacteristicName, data: ArrayBuffer) {
27
+ protected async writeCharacteristic(
28
+ characteristicName: BluetoothCharacteristicName,
29
+ data: ArrayBuffer
30
+ ) {
25
31
  _console.log("writeCharacteristic", ...arguments);
26
32
  }
27
33