@microbit/microbit-connection 0.0.0-alpha.9 → 0.1.0

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 (229) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +94 -5
  3. package/build/{accelerometer-service.d.ts → cjs/accelerometer-service.d.ts} +3 -3
  4. package/build/cjs/accelerometer-service.js +106 -0
  5. package/build/cjs/accelerometer-service.js.map +1 -0
  6. package/build/cjs/accelerometer.js +16 -0
  7. package/build/cjs/accelerometer.js.map +1 -0
  8. package/build/cjs/async-util.js +27 -0
  9. package/build/cjs/async-util.js.map +1 -0
  10. package/build/{bluetooth-device-wrapper.d.ts → cjs/bluetooth-device-wrapper.d.ts} +23 -15
  11. package/build/cjs/bluetooth-device-wrapper.js +467 -0
  12. package/build/cjs/bluetooth-device-wrapper.js.map +1 -0
  13. package/build/cjs/bluetooth-profile.js +86 -0
  14. package/build/cjs/bluetooth-profile.js.map +1 -0
  15. package/build/cjs/bluetooth.d.ts +108 -0
  16. package/build/cjs/bluetooth.js +272 -0
  17. package/build/cjs/bluetooth.js.map +1 -0
  18. package/build/cjs/board-id.js +81 -0
  19. package/build/cjs/board-id.js.map +1 -0
  20. package/build/cjs/board-serial-info.js +51 -0
  21. package/build/cjs/board-serial-info.js.map +1 -0
  22. package/build/{button-service.d.ts → cjs/button-service.d.ts} +2 -2
  23. package/build/cjs/button-service.js +80 -0
  24. package/build/cjs/button-service.js.map +1 -0
  25. package/build/cjs/buttons.js +22 -0
  26. package/build/cjs/buttons.js.map +1 -0
  27. package/build/cjs/constants.js +73 -0
  28. package/build/cjs/constants.js.map +1 -0
  29. package/build/{device.d.ts → cjs/device.d.ts} +35 -46
  30. package/build/cjs/device.js +133 -0
  31. package/build/cjs/device.js.map +1 -0
  32. package/build/{events.d.ts → cjs/events.d.ts} +12 -3
  33. package/build/cjs/events.js +109 -0
  34. package/build/cjs/events.js.map +1 -0
  35. package/build/cjs/hex-flash-data-source.js +26 -0
  36. package/build/cjs/hex-flash-data-source.js.map +1 -0
  37. package/build/cjs/index.d.ts +17 -0
  38. package/build/cjs/index.js +36 -0
  39. package/build/cjs/index.js.map +1 -0
  40. package/build/cjs/led-service.d.ts +20 -0
  41. package/build/cjs/led-service.js +120 -0
  42. package/build/cjs/led-service.js.map +1 -0
  43. package/build/cjs/led.d.ts +6 -0
  44. package/build/cjs/led.js +3 -0
  45. package/build/cjs/led.js.map +1 -0
  46. package/build/{logging.d.ts → cjs/logging.d.ts} +3 -3
  47. package/build/cjs/logging.js +16 -0
  48. package/build/cjs/logging.js.map +1 -0
  49. package/build/cjs/magnetometer-service.d.ts +22 -0
  50. package/build/cjs/magnetometer-service.js +129 -0
  51. package/build/cjs/magnetometer-service.js.map +1 -0
  52. package/build/cjs/magnetometer.d.ts +9 -0
  53. package/build/cjs/magnetometer.js +16 -0
  54. package/build/cjs/magnetometer.js.map +1 -0
  55. package/build/cjs/package.json +1 -0
  56. package/build/cjs/promise-queue.d.ts +27 -0
  57. package/build/cjs/promise-queue.js +78 -0
  58. package/build/cjs/promise-queue.js.map +1 -0
  59. package/build/cjs/serial-events.d.ts +20 -0
  60. package/build/cjs/serial-events.js +69 -0
  61. package/build/cjs/serial-events.js.map +1 -0
  62. package/build/{service-events.d.ts → cjs/service-events.d.ts} +4 -0
  63. package/build/cjs/service-events.js +39 -0
  64. package/build/cjs/service-events.js.map +1 -0
  65. package/build/cjs/setupTests.js.map +1 -0
  66. package/build/cjs/uart-service.d.ts +13 -0
  67. package/build/cjs/uart-service.js +76 -0
  68. package/build/cjs/uart-service.js.map +1 -0
  69. package/build/cjs/uart.d.ts +4 -0
  70. package/build/cjs/uart.js +16 -0
  71. package/build/cjs/uart.js.map +1 -0
  72. package/build/{usb-device-wrapper.d.ts → cjs/usb-device-wrapper.d.ts} +2 -6
  73. package/build/cjs/usb-device-wrapper.js +412 -0
  74. package/build/cjs/usb-device-wrapper.js.map +1 -0
  75. package/build/cjs/usb-partial-flashing-utils.js +133 -0
  76. package/build/cjs/usb-partial-flashing-utils.js.map +1 -0
  77. package/build/{usb-partial-flashing.d.ts → cjs/usb-partial-flashing.d.ts} +3 -3
  78. package/build/cjs/usb-partial-flashing.js +341 -0
  79. package/build/cjs/usb-partial-flashing.js.map +1 -0
  80. package/build/cjs/usb-radio-bridge.d.ts +24 -0
  81. package/build/cjs/usb-radio-bridge.js +516 -0
  82. package/build/cjs/usb-radio-bridge.js.map +1 -0
  83. package/build/cjs/usb-serial-protocol.js +183 -0
  84. package/build/cjs/usb-serial-protocol.js.map +1 -0
  85. package/build/cjs/usb.d.ts +64 -0
  86. package/build/cjs/usb.js +647 -0
  87. package/build/cjs/usb.js.map +1 -0
  88. package/build/esm/accelerometer-service.d.ts +18 -0
  89. package/build/{accelerometer-service.js → esm/accelerometer-service.js} +4 -20
  90. package/build/esm/accelerometer-service.js.map +1 -0
  91. package/build/esm/accelerometer.d.ts +9 -0
  92. package/build/esm/accelerometer.js.map +1 -0
  93. package/build/esm/async-util.d.ts +13 -0
  94. package/build/esm/async-util.js.map +1 -0
  95. package/build/esm/bluetooth-device-wrapper.d.ts +63 -0
  96. package/build/{bluetooth-device-wrapper.js → esm/bluetooth-device-wrapper.js} +105 -75
  97. package/build/esm/bluetooth-device-wrapper.js.map +1 -0
  98. package/build/esm/bluetooth-profile.d.ts +139 -0
  99. package/build/esm/bluetooth-profile.js.map +1 -0
  100. package/build/esm/bluetooth.d.ts +108 -0
  101. package/build/{bluetooth.js → esm/bluetooth.js} +73 -36
  102. package/build/esm/bluetooth.js.map +1 -0
  103. package/build/esm/board-id.d.ts +36 -0
  104. package/build/esm/board-id.js.map +1 -0
  105. package/build/esm/board-serial-info.d.ts +14 -0
  106. package/build/esm/board-serial-info.js.map +1 -0
  107. package/build/esm/button-service.d.ts +13 -0
  108. package/build/esm/button-service.js.map +1 -0
  109. package/build/esm/buttons.d.ts +10 -0
  110. package/build/esm/buttons.js.map +1 -0
  111. package/build/esm/constants.d.ts +48 -0
  112. package/build/esm/constants.js.map +1 -0
  113. package/build/esm/device.d.ts +181 -0
  114. package/build/{device.js → esm/device.js} +11 -58
  115. package/build/esm/device.js.map +1 -0
  116. package/build/esm/events.d.ts +110 -0
  117. package/build/esm/events.js +104 -0
  118. package/build/esm/events.js.map +1 -0
  119. package/build/esm/hex-flash-data-source.d.ts +7 -0
  120. package/build/esm/hex-flash-data-source.js.map +1 -0
  121. package/build/esm/index.d.ts +17 -0
  122. package/build/esm/index.js +12 -0
  123. package/build/esm/index.js.map +1 -0
  124. package/build/esm/led-service.d.ts +20 -0
  125. package/build/esm/led-service.js +116 -0
  126. package/build/esm/led-service.js.map +1 -0
  127. package/build/esm/led.d.ts +6 -0
  128. package/build/esm/led.js +2 -0
  129. package/build/esm/led.js.map +1 -0
  130. package/build/esm/logging.d.ts +21 -0
  131. package/build/esm/logging.js.map +1 -0
  132. package/build/esm/magnetometer-service.d.ts +22 -0
  133. package/build/esm/magnetometer-service.js +125 -0
  134. package/build/esm/magnetometer-service.js.map +1 -0
  135. package/build/esm/magnetometer.d.ts +9 -0
  136. package/build/esm/magnetometer.js +12 -0
  137. package/build/esm/magnetometer.js.map +1 -0
  138. package/build/esm/package.json +1 -0
  139. package/build/esm/promise-queue.d.ts +27 -0
  140. package/build/esm/promise-queue.js +74 -0
  141. package/build/esm/promise-queue.js.map +1 -0
  142. package/build/esm/serial-events.d.ts +20 -0
  143. package/build/esm/serial-events.js +61 -0
  144. package/build/esm/serial-events.js.map +1 -0
  145. package/build/esm/service-events.d.ts +17 -0
  146. package/build/{service-events.js → esm/service-events.js} +12 -0
  147. package/build/esm/service-events.js.map +1 -0
  148. package/build/esm/setupTests.d.ts +6 -0
  149. package/build/{setupTests.js.map → esm/setupTests.js.map} +1 -1
  150. package/build/esm/uart-service.d.ts +13 -0
  151. package/build/esm/uart-service.js +72 -0
  152. package/build/esm/uart-service.js.map +1 -0
  153. package/build/esm/uart.d.ts +4 -0
  154. package/build/esm/uart.js +12 -0
  155. package/build/esm/uart.js.map +1 -0
  156. package/build/esm/usb-device-wrapper.d.ts +47 -0
  157. package/build/{usb-device-wrapper.js → esm/usb-device-wrapper.js} +36 -12
  158. package/build/esm/usb-device-wrapper.js.map +1 -0
  159. package/build/esm/usb-partial-flashing-utils.d.ts +17 -0
  160. package/build/esm/usb-partial-flashing-utils.js.map +1 -0
  161. package/build/esm/usb-partial-flashing.d.ts +69 -0
  162. package/build/{usb-partial-flashing.js → esm/usb-partial-flashing.js} +8 -10
  163. package/build/esm/usb-partial-flashing.js.map +1 -0
  164. package/build/esm/usb-radio-bridge.d.ts +24 -0
  165. package/build/{usb-radio-bridge.js → esm/usb-radio-bridge.js} +133 -47
  166. package/build/esm/usb-radio-bridge.js.map +1 -0
  167. package/build/esm/usb-serial-protocol.d.ts +66 -0
  168. package/build/esm/usb-serial-protocol.js.map +1 -0
  169. package/build/esm/usb.d.ts +64 -0
  170. package/build/{usb.js → esm/usb.js} +188 -67
  171. package/build/esm/usb.js.map +1 -0
  172. package/package.json +23 -9
  173. package/typedoc.json +14 -0
  174. package/build/accelerometer-service.js.map +0 -1
  175. package/build/accelerometer.js.map +0 -1
  176. package/build/async-util.js.map +0 -1
  177. package/build/bluetooth-device-wrapper.js.map +0 -1
  178. package/build/bluetooth-profile.js.map +0 -1
  179. package/build/bluetooth-utils.d.ts +0 -5
  180. package/build/bluetooth-utils.js +0 -14
  181. package/build/bluetooth-utils.js.map +0 -1
  182. package/build/bluetooth.d.ts +0 -49
  183. package/build/bluetooth.js.map +0 -1
  184. package/build/board-id.js.map +0 -1
  185. package/build/board-serial-info.js.map +0 -1
  186. package/build/button-service.js.map +0 -1
  187. package/build/buttons.js.map +0 -1
  188. package/build/constants.js.map +0 -1
  189. package/build/device.js.map +0 -1
  190. package/build/events.js +0 -19
  191. package/build/events.js.map +0 -1
  192. package/build/hex-flash-data-source.js.map +0 -1
  193. package/build/index.d.ts +0 -10
  194. package/build/index.js +0 -8
  195. package/build/index.js.map +0 -1
  196. package/build/logging.js.map +0 -1
  197. package/build/service-events.js.map +0 -1
  198. package/build/usb-device-wrapper.js.map +0 -1
  199. package/build/usb-partial-flashing-utils.js.map +0 -1
  200. package/build/usb-partial-flashing.js.map +0 -1
  201. package/build/usb-radio-bridge.d.ts +0 -37
  202. package/build/usb-radio-bridge.js.map +0 -1
  203. package/build/usb-serial-protocol.js.map +0 -1
  204. package/build/usb.d.ts +0 -60
  205. package/build/usb.js.map +0 -1
  206. package/vite.config.ts +0 -32
  207. /package/build/{accelerometer.d.ts → cjs/accelerometer.d.ts} +0 -0
  208. /package/build/{async-util.d.ts → cjs/async-util.d.ts} +0 -0
  209. /package/build/{bluetooth-profile.d.ts → cjs/bluetooth-profile.d.ts} +0 -0
  210. /package/build/{board-id.d.ts → cjs/board-id.d.ts} +0 -0
  211. /package/build/{board-serial-info.d.ts → cjs/board-serial-info.d.ts} +0 -0
  212. /package/build/{buttons.d.ts → cjs/buttons.d.ts} +0 -0
  213. /package/build/{constants.d.ts → cjs/constants.d.ts} +0 -0
  214. /package/build/{hex-flash-data-source.d.ts → cjs/hex-flash-data-source.d.ts} +0 -0
  215. /package/build/{setupTests.d.ts → cjs/setupTests.d.ts} +0 -0
  216. /package/build/{usb-partial-flashing-utils.d.ts → cjs/usb-partial-flashing-utils.d.ts} +0 -0
  217. /package/build/{usb-serial-protocol.d.ts → cjs/usb-serial-protocol.d.ts} +0 -0
  218. /package/build/{accelerometer.js → esm/accelerometer.js} +0 -0
  219. /package/build/{async-util.js → esm/async-util.js} +0 -0
  220. /package/build/{bluetooth-profile.js → esm/bluetooth-profile.js} +0 -0
  221. /package/build/{board-id.js → esm/board-id.js} +0 -0
  222. /package/build/{board-serial-info.js → esm/board-serial-info.js} +0 -0
  223. /package/build/{button-service.js → esm/button-service.js} +0 -0
  224. /package/build/{buttons.js → esm/buttons.js} +0 -0
  225. /package/build/{constants.js → esm/constants.js} +0 -0
  226. /package/build/{hex-flash-data-source.js → esm/hex-flash-data-source.js} +0 -0
  227. /package/build/{logging.js → esm/logging.js} +0 -0
  228. /package/build/{usb-partial-flashing-utils.js → esm/usb-partial-flashing-utils.js} +0 -0
  229. /package/build/{usb-serial-protocol.js → esm/usb-serial-protocol.js} +0 -0
@@ -0,0 +1,18 @@
1
+ import { AccelerometerData } from "./accelerometer.js";
2
+ import { Service } from "./bluetooth-device-wrapper.js";
3
+ import { TypedServiceEvent, TypedServiceEventDispatcher } from "./service-events.js";
4
+ export declare class AccelerometerService implements Service {
5
+ private accelerometerDataCharacteristic;
6
+ private accelerometerPeriodCharacteristic;
7
+ private dispatchTypedEvent;
8
+ private queueGattOperation;
9
+ constructor(accelerometerDataCharacteristic: BluetoothRemoteGATTCharacteristic, accelerometerPeriodCharacteristic: BluetoothRemoteGATTCharacteristic, dispatchTypedEvent: TypedServiceEventDispatcher, queueGattOperation: <R>(action: () => Promise<R>) => Promise<R>);
10
+ static createService(gattServer: BluetoothRemoteGATTServer, dispatcher: TypedServiceEventDispatcher, queueGattOperation: <R>(action: () => Promise<R>) => Promise<R>, listenerInit: boolean): Promise<AccelerometerService | undefined>;
11
+ private dataViewToData;
12
+ getData(): Promise<AccelerometerData>;
13
+ getPeriod(): Promise<number>;
14
+ setPeriod(value: number): Promise<void>;
15
+ startNotifications(type: TypedServiceEvent): Promise<void>;
16
+ stopNotifications(type: TypedServiceEvent): Promise<void>;
17
+ private characteristicForEvent;
18
+ }
@@ -1,6 +1,5 @@
1
1
  import { AccelerometerDataEvent } from "./accelerometer.js";
2
2
  import { profile } from "./bluetooth-profile.js";
3
- import { createGattOperationPromise } from "./bluetooth-utils.js";
4
3
  import { BackgroundErrorEvent, DeviceError } from "./device.js";
5
4
  export class AccelerometerService {
6
5
  constructor(accelerometerDataCharacteristic, accelerometerPeriodCharacteristic, dispatchTypedEvent, queueGattOperation) {
@@ -63,21 +62,11 @@ export class AccelerometerService {
63
62
  };
64
63
  }
65
64
  async getData() {
66
- const { callback, gattOperationPromise } = createGattOperationPromise();
67
- this.queueGattOperation({
68
- callback,
69
- operation: () => this.accelerometerDataCharacteristic.readValue(),
70
- });
71
- const dataView = (await gattOperationPromise);
65
+ const dataView = await this.queueGattOperation(() => this.accelerometerDataCharacteristic.readValue());
72
66
  return this.dataViewToData(dataView);
73
67
  }
74
68
  async getPeriod() {
75
- const { callback, gattOperationPromise } = createGattOperationPromise();
76
- this.queueGattOperation({
77
- callback,
78
- operation: () => this.accelerometerPeriodCharacteristic.readValue(),
79
- });
80
- const dataView = (await gattOperationPromise);
69
+ const dataView = await this.queueGattOperation(() => this.accelerometerPeriodCharacteristic.readValue());
81
70
  return dataView.getUint16(0, true);
82
71
  }
83
72
  async setPeriod(value) {
@@ -88,15 +77,10 @@ export class AccelerometerService {
88
77
  // Allowed values: 2, 5, 10, 20, 40, 100, 1000
89
78
  // Values passed are rounded up to the allowed values on device.
90
79
  // Documentation for allowed values looks wrong.
91
- // https://lancaster-university.github.io/microbit-docs/resources/bluetooth/bluetooth_profile.html
92
- const { callback, gattOperationPromise } = createGattOperationPromise();
80
+ // https://lancaster-university.github.io/microbit-docs/ble/profile/#about-the-accelerometer-service
93
81
  const dataView = new DataView(new ArrayBuffer(2));
94
82
  dataView.setUint16(0, value, true);
95
- this.queueGattOperation({
96
- callback,
97
- operation: () => this.accelerometerPeriodCharacteristic.writeValueWithoutResponse(dataView),
98
- });
99
- await gattOperationPromise;
83
+ return this.queueGattOperation(() => this.accelerometerPeriodCharacteristic.writeValue(dataView));
100
84
  }
101
85
  async startNotifications(type) {
102
86
  await this.characteristicForEvent(type)?.startNotifications();
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accelerometer-service.js","sourceRoot":"","sources":["../../lib/accelerometer-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export interface AccelerometerData {
2
+ x: number;
3
+ y: number;
4
+ z: number;
5
+ }
6
+ export declare class AccelerometerDataEvent extends Event {
7
+ readonly data: AccelerometerData;
8
+ constructor(data: AccelerometerData);
9
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accelerometer.js","sourceRoot":"","sources":["../../lib/accelerometer.ts"],"names":[],"mappings":"AAMA,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAC/C,YAA4B,IAAuB;QACjD,KAAK,CAAC,0BAA0B,CAAC,CAAC;QADxB;;;;mBAAgB,IAAI;WAAmB;IAEnD,CAAC;CACF"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * (c) 2021, Micro:bit Educational Foundation and contributors
3
+ *
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ export declare class TimeoutError extends Error {
7
+ }
8
+ /**
9
+ * Utility to time out an action after a delay.
10
+ *
11
+ * The action cannot be cancelled; it may still proceed after the timeout.
12
+ */
13
+ export declare function withTimeout<T>(actionPromise: Promise<T>, timeout: number): Promise<T>;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"async-util.js","sourceRoot":"","sources":["../../lib/async-util.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,OAAO,YAAa,SAAQ,KAAK;CAAG;AAE1C;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,aAAyB,EACzB,OAAe;IAEf,MAAM,cAAc,GAAG,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;QAC/C,UAAU,CAAC,GAAG,EAAE;YACd,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC,CAAC;QAC7B,CAAC,EAAE,OAAO,CAAC,CAAC;IACd,CAAC,CAAC,CAAC;IACH,8DAA8D;IAC9D,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,cAAc,CAAC,CAAe,CAAC;AACrE,CAAC"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * (c) 2023, Center for Computational Thinking and Design at Aarhus University and contributors
3
+ *
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ import { AccelerometerService } from "./accelerometer-service.js";
7
+ import { BoardVersion } from "./device.js";
8
+ import { LedService } from "./led-service.js";
9
+ import { Logging } from "./logging.js";
10
+ import { MagnetometerService } from "./magnetometer-service.js";
11
+ import { ServiceConnectionEventMap, TypedServiceEvent, TypedServiceEventDispatcher } from "./service-events.js";
12
+ import { UARTService } from "./uart-service.js";
13
+ export interface Service {
14
+ startNotifications(type: TypedServiceEvent): Promise<void>;
15
+ stopNotifications(type: TypedServiceEvent): Promise<void>;
16
+ }
17
+ interface ConnectCallbacks {
18
+ onConnecting: () => void;
19
+ onReconnecting: () => void;
20
+ onFail: () => void;
21
+ onSuccess: () => void;
22
+ }
23
+ export declare class BluetoothDeviceWrapper {
24
+ readonly device: BluetoothDevice;
25
+ private logging;
26
+ private dispatchTypedEvent;
27
+ private currentEvents;
28
+ private callbacks;
29
+ private duringExplicitConnectDisconnect;
30
+ private gattConnectPromise;
31
+ private disconnectPromise;
32
+ private connecting;
33
+ private isReconnect;
34
+ private connectReadyPromise;
35
+ private accelerometer;
36
+ private buttons;
37
+ private led;
38
+ private magnetometer;
39
+ private uart;
40
+ private serviceInfo;
41
+ boardVersion: BoardVersion | undefined;
42
+ private disconnectedRejectionErrorFactory;
43
+ private gattOperations;
44
+ constructor(device: BluetoothDevice, logging: Logging, dispatchTypedEvent: TypedServiceEventDispatcher, currentEvents: () => Array<keyof ServiceConnectionEventMap>, callbacks: ConnectCallbacks);
45
+ connect(): Promise<void>;
46
+ disconnect(): Promise<void>;
47
+ private disconnectInternal;
48
+ reconnect(): Promise<void>;
49
+ handleDisconnectEvent: () => Promise<void>;
50
+ private assertGattServer;
51
+ private getBoardVersion;
52
+ private queueGattOperation;
53
+ private createIfNeeded;
54
+ getAccelerometerService(): Promise<AccelerometerService | undefined>;
55
+ getLedService(): Promise<LedService | undefined>;
56
+ getMagnetometerService(): Promise<MagnetometerService | undefined>;
57
+ getUARTService(): Promise<UARTService | undefined>;
58
+ startNotifications(type: TypedServiceEvent): Promise<void>;
59
+ stopNotifications(type: TypedServiceEvent): Promise<void>;
60
+ private disposeServices;
61
+ }
62
+ export declare const createBluetoothDeviceWrapper: (device: BluetoothDevice, logging: Logging, dispatchTypedEvent: TypedServiceEventDispatcher, currentEvents: () => Array<keyof ServiceConnectionEventMap>, callbacks: ConnectCallbacks) => Promise<BluetoothDeviceWrapper | undefined>;
63
+ export {};
@@ -7,7 +7,11 @@ import { AccelerometerService } from "./accelerometer-service.js";
7
7
  import { profile } from "./bluetooth-profile.js";
8
8
  import { ButtonService } from "./button-service.js";
9
9
  import { DeviceError } from "./device.js";
10
+ import { LedService } from "./led-service.js";
10
11
  import { NullLogging } from "./logging.js";
12
+ import { MagnetometerService } from "./magnetometer-service.js";
13
+ import { PromiseQueue } from "./promise-queue.js";
14
+ import { UARTService } from "./uart-service.js";
11
15
  const deviceIdToWrapper = new Map();
12
16
  const connectTimeoutDuration = 10000;
13
17
  function findPlatform() {
@@ -59,9 +63,7 @@ class ServiceInfo {
59
63
  }
60
64
  }
61
65
  export class BluetoothDeviceWrapper {
62
- constructor(device, logging = new NullLogging(), dispatchTypedEvent,
63
- // We recreate this for the same connection and need to re-setup notifications for the old events
64
- events) {
66
+ constructor(device, logging = new NullLogging(), dispatchTypedEvent, currentEvents, callbacks) {
65
67
  Object.defineProperty(this, "device", {
66
68
  enumerable: true,
67
69
  configurable: true,
@@ -80,11 +82,17 @@ export class BluetoothDeviceWrapper {
80
82
  writable: true,
81
83
  value: dispatchTypedEvent
82
84
  });
83
- Object.defineProperty(this, "events", {
85
+ Object.defineProperty(this, "currentEvents", {
84
86
  enumerable: true,
85
87
  configurable: true,
86
88
  writable: true,
87
- value: events
89
+ value: currentEvents
90
+ });
91
+ Object.defineProperty(this, "callbacks", {
92
+ enumerable: true,
93
+ configurable: true,
94
+ writable: true,
95
+ value: callbacks
88
96
  });
89
97
  // Used to avoid automatic reconnection during user triggered connect/disconnect
90
98
  // or reconnection itself.
@@ -127,7 +135,7 @@ export class BluetoothDeviceWrapper {
127
135
  writable: true,
128
136
  value: false
129
137
  });
130
- Object.defineProperty(this, "reconnectReadyPromise", {
138
+ Object.defineProperty(this, "connectReadyPromise", {
131
139
  enumerable: true,
132
140
  configurable: true,
133
141
  writable: true,
@@ -150,11 +158,37 @@ export class BluetoothDeviceWrapper {
150
158
  "buttonbchanged",
151
159
  ])
152
160
  });
161
+ Object.defineProperty(this, "led", {
162
+ enumerable: true,
163
+ configurable: true,
164
+ writable: true,
165
+ value: new ServiceInfo(LedService.createService, [])
166
+ });
167
+ Object.defineProperty(this, "magnetometer", {
168
+ enumerable: true,
169
+ configurable: true,
170
+ writable: true,
171
+ value: new ServiceInfo(MagnetometerService.createService, [
172
+ "magnetometerdatachanged",
173
+ ])
174
+ });
175
+ Object.defineProperty(this, "uart", {
176
+ enumerable: true,
177
+ configurable: true,
178
+ writable: true,
179
+ value: new ServiceInfo(UARTService.createService, ["uartdata"])
180
+ });
153
181
  Object.defineProperty(this, "serviceInfo", {
154
182
  enumerable: true,
155
183
  configurable: true,
156
184
  writable: true,
157
- value: [this.accelerometer, this.buttons]
185
+ value: [
186
+ this.accelerometer,
187
+ this.buttons,
188
+ this.led,
189
+ this.magnetometer,
190
+ this.uart,
191
+ ]
158
192
  });
159
193
  Object.defineProperty(this, "boardVersion", {
160
194
  enumerable: true,
@@ -162,15 +196,30 @@ export class BluetoothDeviceWrapper {
162
196
  writable: true,
163
197
  value: void 0
164
198
  });
165
- Object.defineProperty(this, "gattOperations", {
199
+ Object.defineProperty(this, "disconnectedRejectionErrorFactory", {
166
200
  enumerable: true,
167
201
  configurable: true,
168
202
  writable: true,
169
- value: {
170
- busy: false,
171
- queue: [],
203
+ value: () => {
204
+ return new DeviceError({
205
+ code: "device-disconnected",
206
+ message: "Error processing gatt operations queue - device disconnected",
207
+ });
172
208
  }
173
209
  });
210
+ Object.defineProperty(this, "gattOperations", {
211
+ enumerable: true,
212
+ configurable: true,
213
+ writable: true,
214
+ value: new PromiseQueue({
215
+ abortCheck: () => {
216
+ if (!this.device.gatt?.connected) {
217
+ return this.disconnectedRejectionErrorFactory;
218
+ }
219
+ return undefined;
220
+ },
221
+ })
222
+ });
174
223
  Object.defineProperty(this, "handleDisconnectEvent", {
175
224
  enumerable: true,
176
225
  configurable: true,
@@ -192,41 +241,6 @@ export class BluetoothDeviceWrapper {
192
241
  }
193
242
  }
194
243
  });
195
- Object.defineProperty(this, "processGattOperationQueue", {
196
- enumerable: true,
197
- configurable: true,
198
- writable: true,
199
- value: () => {
200
- if (!this.device.gatt?.connected) {
201
- // No longer connected. Drop queue.
202
- this.clearGattQueueOnDisconnect();
203
- return;
204
- }
205
- if (this.gattOperations.busy) {
206
- // We will finish processing the current operation, then
207
- // pick up processing the queue in the finally block.
208
- return;
209
- }
210
- const gattOperation = this.gattOperations.queue.shift();
211
- if (!gattOperation) {
212
- return;
213
- }
214
- this.gattOperations.busy = true;
215
- gattOperation
216
- .operation()
217
- .then((result) => {
218
- gattOperation.callback.resolve(result);
219
- })
220
- .catch((err) => {
221
- gattOperation.callback.reject(new DeviceError({ code: "background-comms-error", message: err }));
222
- this.logging.error("Error processing gatt operations queue", err);
223
- })
224
- .finally(() => {
225
- this.gattOperations.busy = false;
226
- this.processGattOperationQueue();
227
- });
228
- }
229
- });
230
244
  device.addEventListener("gattserverdisconnected", this.handleDisconnectEvent);
231
245
  }
232
246
  async connect() {
@@ -242,10 +256,23 @@ export class BluetoothDeviceWrapper {
242
256
  await this.gattConnectPromise;
243
257
  return;
244
258
  }
259
+ if (this.isReconnect) {
260
+ this.callbacks.onReconnecting();
261
+ }
262
+ else {
263
+ this.callbacks.onConnecting();
264
+ }
245
265
  this.duringExplicitConnectDisconnect++;
246
266
  if (this.device.gatt === undefined) {
247
267
  throw new Error("BluetoothRemoteGATTServer for micro:bit device is undefined");
248
268
  }
269
+ if (isWindowsOS) {
270
+ // On Windows, the micro:bit can take around 3 seconds to respond to gatt.disconnect().
271
+ // Attempting to connect/reconnect before the micro:bit has responded results in another
272
+ // gattserverdisconnected event being fired. We then fail to get primaryService on a
273
+ // disconnected GATT server.
274
+ await this.connectReadyPromise;
275
+ }
249
276
  try {
250
277
  // A previous connect might have completed in the background as a device was replugged etc.
251
278
  await this.disconnectPromise;
@@ -299,11 +326,12 @@ export class BluetoothDeviceWrapper {
299
326
  finally {
300
327
  this.connecting = false;
301
328
  }
302
- Object.keys(this.events).forEach((e) => this.startNotifications(e));
329
+ this.currentEvents().forEach((e) => this.startNotifications(e));
303
330
  this.logging.event({
304
331
  type: this.isReconnect ? "Reconnect" : "Connect",
305
332
  message: "Bluetooth connect success",
306
333
  });
334
+ this.callbacks.onSuccess();
307
335
  }
308
336
  catch (e) {
309
337
  this.logging.error("Bluetooth connect error", e);
@@ -312,10 +340,13 @@ export class BluetoothDeviceWrapper {
312
340
  message: "Bluetooth connect failed",
313
341
  });
314
342
  await this.disconnectInternal(false);
343
+ this.callbacks.onFail();
315
344
  throw new Error("Failed to establish a connection!");
316
345
  }
317
346
  finally {
318
347
  this.duringExplicitConnectDisconnect--;
348
+ // Reset isReconnect for next time
349
+ this.isReconnect = false;
319
350
  }
320
351
  }
321
352
  async disconnect() {
@@ -337,18 +368,11 @@ export class BluetoothDeviceWrapper {
337
368
  this.disposeServices();
338
369
  this.duringExplicitConnectDisconnect--;
339
370
  }
340
- this.reconnectReadyPromise = new Promise((resolve) => setTimeout(resolve, 3_500));
371
+ this.connectReadyPromise = new Promise((resolve) => setTimeout(resolve, 3_500));
341
372
  }
342
373
  async reconnect() {
343
374
  this.logging.log("Bluetooth reconnect");
344
375
  this.isReconnect = true;
345
- if (isWindowsOS) {
346
- // On Windows, the micro:bit can take around 3 seconds to respond to gatt.disconnect().
347
- // Attempting to reconnect before the micro:bit has responded results in another
348
- // gattserverdisconnected event being fired. We then fail to get primaryService on a
349
- // disconnected GATT server.
350
- await this.reconnectReadyPromise;
351
- }
352
376
  await this.connect();
353
377
  }
354
378
  assertGattServer() {
@@ -378,18 +402,10 @@ export class BluetoothDeviceWrapper {
378
402
  throw new Error("Could not read model number");
379
403
  }
380
404
  }
381
- queueGattOperation(gattOperation) {
382
- this.gattOperations.queue.push(gattOperation);
383
- this.processGattOperationQueue();
384
- }
385
- clearGattQueueOnDisconnect() {
386
- this.gattOperations.queue.forEach((op) => {
387
- op.callback.reject(new DeviceError({
388
- code: "device-disconnected",
389
- message: "Error processing gatt operations queue - device disconnected",
390
- }));
391
- });
392
- this.gattOperations = { busy: false, queue: [] };
405
+ queueGattOperation(action) {
406
+ // Previously we wrapped rejections with:
407
+ // new DeviceError({ code: "background-comms-error", message: err }),
408
+ return this.gattOperations.add(action);
393
409
  }
394
410
  createIfNeeded(info, listenerInit) {
395
411
  const gattServer = this.assertGattServer();
@@ -398,34 +414,48 @@ export class BluetoothDeviceWrapper {
398
414
  async getAccelerometerService() {
399
415
  return this.createIfNeeded(this.accelerometer, false);
400
416
  }
417
+ async getLedService() {
418
+ return this.createIfNeeded(this.led, false);
419
+ }
420
+ async getMagnetometerService() {
421
+ return this.createIfNeeded(this.magnetometer, false);
422
+ }
423
+ async getUARTService() {
424
+ return this.createIfNeeded(this.uart, false);
425
+ }
401
426
  async startNotifications(type) {
402
427
  const serviceInfo = this.serviceInfo.find((s) => s.events.includes(type));
403
428
  if (serviceInfo) {
404
- // TODO: type cheat! why?
405
- const service = await this.createIfNeeded(serviceInfo, true);
406
- service?.startNotifications(type);
429
+ this.queueGattOperation(async () => {
430
+ // TODO: type cheat! why?
431
+ const service = await this.createIfNeeded(serviceInfo, true);
432
+ await service?.startNotifications(type);
433
+ });
407
434
  }
408
435
  }
409
436
  async stopNotifications(type) {
410
- const serviceInfo = this.serviceInfo.find((s) => s.events.includes(type));
411
- serviceInfo?.get()?.stopNotifications(type);
437
+ this.queueGattOperation(async () => {
438
+ const serviceInfo = this.serviceInfo.find((s) => s.events.includes(type));
439
+ await serviceInfo?.get()?.stopNotifications(type);
440
+ });
412
441
  }
413
442
  disposeServices() {
414
443
  this.serviceInfo.forEach((s) => s.dispose());
415
- this.clearGattQueueOnDisconnect();
444
+ this.gattOperations.clear(this.disconnectedRejectionErrorFactory);
416
445
  }
417
446
  }
418
- export const createBluetoothDeviceWrapper = async (device, logging, dispatchTypedEvent, addedServiceListeners) => {
447
+ export const createBluetoothDeviceWrapper = async (device, logging, dispatchTypedEvent, currentEvents, callbacks) => {
419
448
  try {
420
449
  // Reuse our connection objects for the same device as they
421
450
  // track the GATT connect promise that never resolves.
422
451
  const bluetooth = deviceIdToWrapper.get(device.id) ??
423
- new BluetoothDeviceWrapper(device, logging, dispatchTypedEvent, addedServiceListeners);
452
+ new BluetoothDeviceWrapper(device, logging, dispatchTypedEvent, currentEvents, callbacks);
424
453
  deviceIdToWrapper.set(device.id, bluetooth);
425
454
  await bluetooth.connect();
426
455
  return bluetooth;
427
456
  }
428
457
  catch (e) {
458
+ logging.error("Bluetooth connect error", e);
429
459
  return undefined;
430
460
  }
431
461
  };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bluetooth-device-wrapper.js","sourceRoot":"","sources":["../../lib/bluetooth-device-wrapper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,139 @@
1
+ export declare const profile: {
2
+ uart: {
3
+ id: string;
4
+ characteristics: {
5
+ tx: {
6
+ id: string;
7
+ };
8
+ rx: {
9
+ id: string;
10
+ };
11
+ };
12
+ };
13
+ accelerometer: {
14
+ id: string;
15
+ characteristics: {
16
+ data: {
17
+ id: string;
18
+ };
19
+ period: {
20
+ id: string;
21
+ };
22
+ };
23
+ };
24
+ deviceInformation: {
25
+ id: string;
26
+ characteristics: {
27
+ modelNumber: {
28
+ id: string;
29
+ };
30
+ serialNumber: {
31
+ id: string;
32
+ };
33
+ firmwareRevision: {
34
+ id: string;
35
+ };
36
+ hardwareRevision: {
37
+ id: string;
38
+ };
39
+ manufacturer: {
40
+ id: string;
41
+ };
42
+ };
43
+ };
44
+ dfuControl: {
45
+ id: string;
46
+ characteristics: {
47
+ control: {
48
+ id: string;
49
+ };
50
+ };
51
+ };
52
+ led: {
53
+ id: string;
54
+ characteristics: {
55
+ matrixState: {
56
+ id: string;
57
+ };
58
+ text: {
59
+ id: string;
60
+ };
61
+ scrollingDelay: {
62
+ id: string;
63
+ };
64
+ };
65
+ };
66
+ ioPin: {
67
+ id: string;
68
+ characteristics: {
69
+ pinData: {
70
+ id: string;
71
+ };
72
+ pinAdConfiguration: {
73
+ id: string;
74
+ };
75
+ pinIoConfiguration: {
76
+ id: string;
77
+ };
78
+ pwmControl: {
79
+ id: string;
80
+ };
81
+ };
82
+ };
83
+ button: {
84
+ id: string;
85
+ characteristics: {
86
+ a: {
87
+ id: string;
88
+ };
89
+ b: {
90
+ id: string;
91
+ };
92
+ };
93
+ };
94
+ event: {
95
+ id: string;
96
+ characteristics: {
97
+ microBitRequirements: {
98
+ id: string;
99
+ };
100
+ microBitEvent: {
101
+ id: string;
102
+ };
103
+ clientRequirements: {
104
+ id: string;
105
+ };
106
+ clientEvent: {
107
+ id: string;
108
+ };
109
+ };
110
+ };
111
+ magnetometer: {
112
+ id: string;
113
+ characteristics: {
114
+ data: {
115
+ id: string;
116
+ };
117
+ period: {
118
+ id: string;
119
+ };
120
+ bearing: {
121
+ id: string;
122
+ };
123
+ calibration: {
124
+ id: string;
125
+ };
126
+ };
127
+ };
128
+ temperature: {
129
+ id: string;
130
+ characteristics: {
131
+ data: {
132
+ id: string;
133
+ };
134
+ period: {
135
+ id: string;
136
+ };
137
+ };
138
+ };
139
+ };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bluetooth-profile.js","sourceRoot":"","sources":["../../lib/bluetooth-profile.ts"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,IAAI,EAAE;QACJ,EAAE,EAAE,sCAAsC;QAC1C,eAAe,EAAE;YACf,EAAE,EAAE,EAAE,EAAE,EAAE,sCAAsC,EAAE;YAClD,EAAE,EAAE,EAAE,EAAE,EAAE,sCAAsC,EAAE;SACnD;KACF;IACD,aAAa,EAAE;QACb,EAAE,EAAE,sCAAsC;QAC1C,eAAe,EAAE;YACf,IAAI,EAAE,EAAE,EAAE,EAAE,sCAAsC,EAAE;YACpD,MAAM,EAAE,EAAE,EAAE,EAAE,sCAAsC,EAAE;SACvD;KACF;IACD,iBAAiB,EAAE;QACjB,EAAE,EAAE,sCAAsC;QAC1C,eAAe,EAAE;YACf,WAAW,EAAE,EAAE,EAAE,EAAE,sCAAsC,EAAE;YAC3D,YAAY,EAAE,EAAE,EAAE,EAAE,sCAAsC,EAAE;YAC5D,gBAAgB,EAAE,EAAE,EAAE,EAAE,sCAAsC,EAAE;YAChE,gBAAgB,EAAE,EAAE,EAAE,EAAE,sCAAsC,EAAE;YAChE,YAAY,EAAE,EAAE,EAAE,EAAE,sCAAsC,EAAE;SAC7D;KACF;IACD,UAAU,EAAE;QACV,EAAE,EAAE,sCAAsC;QAC1C,eAAe,EAAE;YACf,OAAO,EAAE,EAAE,EAAE,EAAE,sCAAsC,EAAE;SACxD;KACF;IACD,GAAG,EAAE;QACH,EAAE,EAAE,sCAAsC;QAC1C,eAAe,EAAE;YACf,WAAW,EAAE,EAAE,EAAE,EAAE,sCAAsC,EAAE;YAC3D,IAAI,EAAE,EAAE,EAAE,EAAE,sCAAsC,EAAE;YACpD,cAAc,EAAE,EAAE,EAAE,EAAE,sCAAsC,EAAE;SAC/D;KACF;IACD,KAAK,EAAE;QACL,EAAE,EAAE,sCAAsC;QAC1C,eAAe,EAAE;YACf,OAAO,EAAE,EAAE,EAAE,EAAE,sCAAsC,EAAE;YACvD,kBAAkB,EAAE,EAAE,EAAE,EAAE,sCAAsC,EAAE;YAClE,kBAAkB,EAAE,EAAE,EAAE,EAAE,sCAAsC,EAAE;YAClE,UAAU,EAAE,EAAE,EAAE,EAAE,sCAAsC,EAAE;SAC3D;KACF;IACD,MAAM,EAAE;QACN,EAAE,EAAE,sCAAsC;QAC1C,eAAe,EAAE;YACf,CAAC,EAAE,EAAE,EAAE,EAAE,sCAAsC,EAAE;YACjD,CAAC,EAAE,EAAE,EAAE,EAAE,sCAAsC,EAAE;SAClD;KACF;IACD,KAAK,EAAE;QACL,EAAE,EAAE,sCAAsC;QAC1C,eAAe,EAAE;YACf,oBAAoB,EAAE,EAAE,EAAE,EAAE,sCAAsC,EAAE;YACpE,aAAa,EAAE,EAAE,EAAE,EAAE,sCAAsC,EAAE;YAC7D,kBAAkB,EAAE,EAAE,EAAE,EAAE,sCAAsC,EAAE;YAClE,WAAW,EAAE,EAAE,EAAE,EAAE,sCAAsC,EAAE;SAC5D;KACF;IACD,YAAY,EAAE;QACZ,EAAE,EAAE,sCAAsC;QAC1C,eAAe,EAAE;YACf,IAAI,EAAE,EAAE,EAAE,EAAE,sCAAsC,EAAE;YACpD,MAAM,EAAE,EAAE,EAAE,EAAE,sCAAsC,EAAE;YACtD,OAAO,EAAE,EAAE,EAAE,EAAE,sCAAsC,EAAE;YACvD,WAAW,EAAE,EAAE,EAAE,EAAE,sCAAsC,EAAE;SAC5D;KACF;IACD,WAAW,EAAE;QACX,EAAE,EAAE,sCAAsC;QAC1C,eAAe,EAAE;YACf,IAAI,EAAE,EAAE,EAAE,EAAE,sCAAsC,EAAE;YACpD,MAAM,EAAE,EAAE,EAAE,EAAE,sCAAsC,EAAE;SACvD;KACF;CACF,CAAC"}