@microbit/microbit-connection 0.0.0-tab.change.177 → 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 (227) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +94 -5
  3. package/build/cjs/accelerometer-service.js +106 -0
  4. package/build/cjs/accelerometer-service.js.map +1 -0
  5. package/build/cjs/accelerometer.js +16 -0
  6. package/build/cjs/accelerometer.js.map +1 -0
  7. package/build/cjs/async-util.js +27 -0
  8. package/build/cjs/async-util.js.map +1 -0
  9. package/build/{bluetooth-device-wrapper.d.ts → cjs/bluetooth-device-wrapper.d.ts} +7 -1
  10. package/build/cjs/bluetooth-device-wrapper.js +467 -0
  11. package/build/cjs/bluetooth-device-wrapper.js.map +1 -0
  12. package/build/cjs/bluetooth-profile.js +86 -0
  13. package/build/cjs/bluetooth-profile.js.map +1 -0
  14. package/build/cjs/bluetooth.d.ts +108 -0
  15. package/build/cjs/bluetooth.js +272 -0
  16. package/build/cjs/bluetooth.js.map +1 -0
  17. package/build/cjs/board-id.js +81 -0
  18. package/build/cjs/board-id.js.map +1 -0
  19. package/build/cjs/board-serial-info.js +51 -0
  20. package/build/cjs/board-serial-info.js.map +1 -0
  21. package/build/cjs/button-service.js +80 -0
  22. package/build/cjs/button-service.js.map +1 -0
  23. package/build/cjs/buttons.js +22 -0
  24. package/build/cjs/buttons.js.map +1 -0
  25. package/build/cjs/constants.js +73 -0
  26. package/build/cjs/constants.js.map +1 -0
  27. package/build/{device.d.ts → cjs/device.d.ts} +6 -31
  28. package/build/cjs/device.js +133 -0
  29. package/build/cjs/device.js.map +1 -0
  30. package/build/{events.d.ts → cjs/events.d.ts} +1 -2
  31. package/build/cjs/events.js +109 -0
  32. package/build/cjs/events.js.map +1 -0
  33. package/build/cjs/hex-flash-data-source.js +26 -0
  34. package/build/cjs/hex-flash-data-source.js.map +1 -0
  35. package/build/cjs/index.d.ts +17 -0
  36. package/build/cjs/index.js +36 -0
  37. package/build/cjs/index.js.map +1 -0
  38. package/build/cjs/led-service.js +120 -0
  39. package/build/{led-service.js.map → cjs/led-service.js.map} +1 -1
  40. package/build/cjs/led.js +3 -0
  41. package/build/cjs/led.js.map +1 -0
  42. package/build/{logging.d.ts → cjs/logging.d.ts} +3 -3
  43. package/build/cjs/logging.js +16 -0
  44. package/build/cjs/logging.js.map +1 -0
  45. package/build/cjs/magnetometer-service.d.ts +22 -0
  46. package/build/cjs/magnetometer-service.js +129 -0
  47. package/build/cjs/magnetometer-service.js.map +1 -0
  48. package/build/cjs/magnetometer.d.ts +9 -0
  49. package/build/cjs/magnetometer.js +16 -0
  50. package/build/cjs/magnetometer.js.map +1 -0
  51. package/build/cjs/package.json +1 -0
  52. package/build/cjs/promise-queue.js +78 -0
  53. package/build/cjs/promise-queue.js.map +1 -0
  54. package/build/cjs/serial-events.d.ts +20 -0
  55. package/build/cjs/serial-events.js +69 -0
  56. package/build/cjs/serial-events.js.map +1 -0
  57. package/build/{service-events.d.ts → cjs/service-events.d.ts} +4 -0
  58. package/build/cjs/service-events.js +39 -0
  59. package/build/cjs/service-events.js.map +1 -0
  60. package/build/cjs/setupTests.js.map +1 -0
  61. package/build/cjs/uart-service.d.ts +13 -0
  62. package/build/cjs/uart-service.js +76 -0
  63. package/build/cjs/uart-service.js.map +1 -0
  64. package/build/cjs/uart.d.ts +4 -0
  65. package/build/cjs/uart.js +16 -0
  66. package/build/cjs/uart.js.map +1 -0
  67. package/build/{usb-device-wrapper.d.ts → cjs/usb-device-wrapper.d.ts} +1 -6
  68. package/build/cjs/usb-device-wrapper.js +412 -0
  69. package/build/cjs/usb-device-wrapper.js.map +1 -0
  70. package/build/cjs/usb-partial-flashing-utils.js +133 -0
  71. package/build/cjs/usb-partial-flashing-utils.js.map +1 -0
  72. package/build/{usb-partial-flashing.d.ts → cjs/usb-partial-flashing.d.ts} +3 -3
  73. package/build/cjs/usb-partial-flashing.js +341 -0
  74. package/build/cjs/usb-partial-flashing.js.map +1 -0
  75. package/build/cjs/usb-radio-bridge.d.ts +24 -0
  76. package/build/cjs/usb-radio-bridge.js +516 -0
  77. package/build/cjs/usb-radio-bridge.js.map +1 -0
  78. package/build/cjs/usb-serial-protocol.js +183 -0
  79. package/build/cjs/usb-serial-protocol.js.map +1 -0
  80. package/build/cjs/usb.d.ts +64 -0
  81. package/build/cjs/usb.js +647 -0
  82. package/build/cjs/usb.js.map +1 -0
  83. package/build/esm/accelerometer-service.d.ts +18 -0
  84. package/build/{accelerometer-service.js → esm/accelerometer-service.js} +1 -1
  85. package/build/esm/accelerometer-service.js.map +1 -0
  86. package/build/esm/accelerometer.d.ts +9 -0
  87. package/build/esm/accelerometer.js.map +1 -0
  88. package/build/esm/async-util.d.ts +13 -0
  89. package/build/esm/async-util.js.map +1 -0
  90. package/build/esm/bluetooth-device-wrapper.d.ts +63 -0
  91. package/build/{bluetooth-device-wrapper.js → esm/bluetooth-device-wrapper.js} +39 -10
  92. package/build/esm/bluetooth-device-wrapper.js.map +1 -0
  93. package/build/esm/bluetooth-profile.d.ts +139 -0
  94. package/build/esm/bluetooth-profile.js.map +1 -0
  95. package/build/esm/bluetooth.d.ts +108 -0
  96. package/build/{bluetooth.js → esm/bluetooth.js} +29 -4
  97. package/build/esm/bluetooth.js.map +1 -0
  98. package/build/esm/board-id.d.ts +36 -0
  99. package/build/esm/board-id.js.map +1 -0
  100. package/build/esm/board-serial-info.d.ts +14 -0
  101. package/build/esm/board-serial-info.js.map +1 -0
  102. package/build/esm/button-service.d.ts +13 -0
  103. package/build/esm/button-service.js.map +1 -0
  104. package/build/esm/buttons.d.ts +10 -0
  105. package/build/esm/buttons.js.map +1 -0
  106. package/build/esm/constants.d.ts +48 -0
  107. package/build/esm/constants.js.map +1 -0
  108. package/build/esm/device.d.ts +181 -0
  109. package/build/{device.js → esm/device.js} +1 -57
  110. package/build/esm/device.js.map +1 -0
  111. package/build/esm/events.d.ts +110 -0
  112. package/build/esm/events.js.map +1 -0
  113. package/build/esm/hex-flash-data-source.d.ts +7 -0
  114. package/build/esm/hex-flash-data-source.js.map +1 -0
  115. package/build/esm/index.d.ts +17 -0
  116. package/build/esm/index.js +12 -0
  117. package/build/esm/index.js.map +1 -0
  118. package/build/esm/led-service.d.ts +20 -0
  119. package/build/esm/led-service.js.map +1 -0
  120. package/build/esm/led.d.ts +6 -0
  121. package/build/esm/led.js.map +1 -0
  122. package/build/esm/logging.d.ts +21 -0
  123. package/build/esm/logging.js.map +1 -0
  124. package/build/esm/magnetometer-service.d.ts +22 -0
  125. package/build/esm/magnetometer-service.js +125 -0
  126. package/build/esm/magnetometer-service.js.map +1 -0
  127. package/build/esm/magnetometer.d.ts +9 -0
  128. package/build/esm/magnetometer.js +12 -0
  129. package/build/esm/magnetometer.js.map +1 -0
  130. package/build/esm/package.json +1 -0
  131. package/build/esm/promise-queue.d.ts +27 -0
  132. package/build/esm/promise-queue.js.map +1 -0
  133. package/build/esm/serial-events.d.ts +20 -0
  134. package/build/esm/serial-events.js +61 -0
  135. package/build/esm/serial-events.js.map +1 -0
  136. package/build/esm/service-events.d.ts +17 -0
  137. package/build/{service-events.js → esm/service-events.js} +12 -0
  138. package/build/esm/service-events.js.map +1 -0
  139. package/build/esm/setupTests.d.ts +6 -0
  140. package/build/{setupTests.js.map → esm/setupTests.js.map} +1 -1
  141. package/build/esm/uart-service.d.ts +13 -0
  142. package/build/esm/uart-service.js +72 -0
  143. package/build/esm/uart-service.js.map +1 -0
  144. package/build/esm/uart.d.ts +4 -0
  145. package/build/esm/uart.js +12 -0
  146. package/build/esm/uart.js.map +1 -0
  147. package/build/esm/usb-device-wrapper.d.ts +47 -0
  148. package/build/{usb-device-wrapper.js → esm/usb-device-wrapper.js} +10 -9
  149. package/build/esm/usb-device-wrapper.js.map +1 -0
  150. package/build/esm/usb-partial-flashing-utils.d.ts +17 -0
  151. package/build/esm/usb-partial-flashing-utils.js.map +1 -0
  152. package/build/esm/usb-partial-flashing.d.ts +69 -0
  153. package/build/{usb-partial-flashing.js → esm/usb-partial-flashing.js} +8 -10
  154. package/build/esm/usb-partial-flashing.js.map +1 -0
  155. package/build/esm/usb-radio-bridge.d.ts +24 -0
  156. package/build/{usb-radio-bridge.js → esm/usb-radio-bridge.js} +11 -4
  157. package/build/esm/usb-radio-bridge.js.map +1 -0
  158. package/build/esm/usb-serial-protocol.d.ts +66 -0
  159. package/build/esm/usb-serial-protocol.js.map +1 -0
  160. package/build/esm/usb.d.ts +64 -0
  161. package/build/{usb.js → esm/usb.js} +228 -35
  162. package/build/esm/usb.js.map +1 -0
  163. package/package.json +21 -8
  164. package/typedoc.json +14 -0
  165. package/build/accelerometer-service.js.map +0 -1
  166. package/build/accelerometer.js.map +0 -1
  167. package/build/async-util.js.map +0 -1
  168. package/build/bluetooth-device-wrapper.js.map +0 -1
  169. package/build/bluetooth-profile.js.map +0 -1
  170. package/build/bluetooth.d.ts +0 -54
  171. package/build/bluetooth.js.map +0 -1
  172. package/build/board-id.js.map +0 -1
  173. package/build/board-serial-info.js.map +0 -1
  174. package/build/button-service.js.map +0 -1
  175. package/build/buttons.js.map +0 -1
  176. package/build/constants.js.map +0 -1
  177. package/build/device.js.map +0 -1
  178. package/build/events.js.map +0 -1
  179. package/build/hex-flash-data-source.js.map +0 -1
  180. package/build/index.d.ts +0 -10
  181. package/build/index.js +0 -8
  182. package/build/index.js.map +0 -1
  183. package/build/led.js.map +0 -1
  184. package/build/logging.js.map +0 -1
  185. package/build/promise-queue.js.map +0 -1
  186. package/build/service-events.js.map +0 -1
  187. package/build/usb-device-wrapper.js.map +0 -1
  188. package/build/usb-partial-flashing-utils.js.map +0 -1
  189. package/build/usb-partial-flashing.js.map +0 -1
  190. package/build/usb-radio-bridge.d.ts +0 -41
  191. package/build/usb-radio-bridge.js.map +0 -1
  192. package/build/usb-serial-protocol.js.map +0 -1
  193. package/build/usb.d.ts +0 -54
  194. package/build/usb.js.map +0 -1
  195. package/vite.config.ts +0 -34
  196. /package/build/{accelerometer-service.d.ts → cjs/accelerometer-service.d.ts} +0 -0
  197. /package/build/{accelerometer.d.ts → cjs/accelerometer.d.ts} +0 -0
  198. /package/build/{async-util.d.ts → cjs/async-util.d.ts} +0 -0
  199. /package/build/{bluetooth-profile.d.ts → cjs/bluetooth-profile.d.ts} +0 -0
  200. /package/build/{board-id.d.ts → cjs/board-id.d.ts} +0 -0
  201. /package/build/{board-serial-info.d.ts → cjs/board-serial-info.d.ts} +0 -0
  202. /package/build/{button-service.d.ts → cjs/button-service.d.ts} +0 -0
  203. /package/build/{buttons.d.ts → cjs/buttons.d.ts} +0 -0
  204. /package/build/{constants.d.ts → cjs/constants.d.ts} +0 -0
  205. /package/build/{hex-flash-data-source.d.ts → cjs/hex-flash-data-source.d.ts} +0 -0
  206. /package/build/{led-service.d.ts → cjs/led-service.d.ts} +0 -0
  207. /package/build/{led.d.ts → cjs/led.d.ts} +0 -0
  208. /package/build/{promise-queue.d.ts → cjs/promise-queue.d.ts} +0 -0
  209. /package/build/{setupTests.d.ts → cjs/setupTests.d.ts} +0 -0
  210. /package/build/{usb-partial-flashing-utils.d.ts → cjs/usb-partial-flashing-utils.d.ts} +0 -0
  211. /package/build/{usb-serial-protocol.d.ts → cjs/usb-serial-protocol.d.ts} +0 -0
  212. /package/build/{accelerometer.js → esm/accelerometer.js} +0 -0
  213. /package/build/{async-util.js → esm/async-util.js} +0 -0
  214. /package/build/{bluetooth-profile.js → esm/bluetooth-profile.js} +0 -0
  215. /package/build/{board-id.js → esm/board-id.js} +0 -0
  216. /package/build/{board-serial-info.js → esm/board-serial-info.js} +0 -0
  217. /package/build/{button-service.js → esm/button-service.js} +0 -0
  218. /package/build/{buttons.js → esm/buttons.js} +0 -0
  219. /package/build/{constants.js → esm/constants.js} +0 -0
  220. /package/build/{events.js → esm/events.js} +0 -0
  221. /package/build/{hex-flash-data-source.js → esm/hex-flash-data-source.js} +0 -0
  222. /package/build/{led-service.js → esm/led-service.js} +0 -0
  223. /package/build/{led.js → esm/led.js} +0 -0
  224. /package/build/{logging.js → esm/logging.js} +0 -0
  225. /package/build/{promise-queue.js → esm/promise-queue.js} +0 -0
  226. /package/build/{usb-partial-flashing-utils.js → esm/usb-partial-flashing-utils.js} +0 -0
  227. /package/build/{usb-serial-protocol.js → esm/usb-serial-protocol.js} +0 -0
@@ -0,0 +1,467 @@
1
+ "use strict";
2
+ /**
3
+ * (c) 2023, Center for Computational Thinking and Design at Aarhus University and contributors
4
+ *
5
+ * SPDX-License-Identifier: MIT
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.createBluetoothDeviceWrapper = exports.BluetoothDeviceWrapper = void 0;
9
+ const accelerometer_service_js_1 = require("./accelerometer-service.js");
10
+ const bluetooth_profile_js_1 = require("./bluetooth-profile.js");
11
+ const button_service_js_1 = require("./button-service.js");
12
+ const device_js_1 = require("./device.js");
13
+ const led_service_js_1 = require("./led-service.js");
14
+ const logging_js_1 = require("./logging.js");
15
+ const magnetometer_service_js_1 = require("./magnetometer-service.js");
16
+ const promise_queue_js_1 = require("./promise-queue.js");
17
+ const uart_service_js_1 = require("./uart-service.js");
18
+ const deviceIdToWrapper = new Map();
19
+ const connectTimeoutDuration = 10000;
20
+ function findPlatform() {
21
+ const navigator = typeof window !== "undefined" ? window.navigator : undefined;
22
+ if (!navigator) {
23
+ return "unknown";
24
+ }
25
+ const platform = navigator.userAgentData?.platform;
26
+ if (platform) {
27
+ return platform;
28
+ }
29
+ const isAndroid = /android/.test(navigator.userAgent.toLowerCase());
30
+ return isAndroid ? "android" : navigator.platform ?? "unknown";
31
+ }
32
+ const platform = findPlatform();
33
+ const isWindowsOS = platform && /^Win/.test(platform);
34
+ class ServiceInfo {
35
+ constructor(serviceFactory, events) {
36
+ Object.defineProperty(this, "serviceFactory", {
37
+ enumerable: true,
38
+ configurable: true,
39
+ writable: true,
40
+ value: serviceFactory
41
+ });
42
+ Object.defineProperty(this, "events", {
43
+ enumerable: true,
44
+ configurable: true,
45
+ writable: true,
46
+ value: events
47
+ });
48
+ Object.defineProperty(this, "service", {
49
+ enumerable: true,
50
+ configurable: true,
51
+ writable: true,
52
+ value: void 0
53
+ });
54
+ }
55
+ get() {
56
+ return this.service;
57
+ }
58
+ async createIfNeeded(gattServer, dispatcher, queueGattOperation, listenerInit) {
59
+ this.service =
60
+ this.service ??
61
+ (await this.serviceFactory(gattServer, dispatcher, queueGattOperation, listenerInit));
62
+ return this.service;
63
+ }
64
+ dispose() {
65
+ this.service = undefined;
66
+ }
67
+ }
68
+ class BluetoothDeviceWrapper {
69
+ constructor(device, logging = new logging_js_1.NullLogging(), dispatchTypedEvent, currentEvents, callbacks) {
70
+ Object.defineProperty(this, "device", {
71
+ enumerable: true,
72
+ configurable: true,
73
+ writable: true,
74
+ value: device
75
+ });
76
+ Object.defineProperty(this, "logging", {
77
+ enumerable: true,
78
+ configurable: true,
79
+ writable: true,
80
+ value: logging
81
+ });
82
+ Object.defineProperty(this, "dispatchTypedEvent", {
83
+ enumerable: true,
84
+ configurable: true,
85
+ writable: true,
86
+ value: dispatchTypedEvent
87
+ });
88
+ Object.defineProperty(this, "currentEvents", {
89
+ enumerable: true,
90
+ configurable: true,
91
+ writable: true,
92
+ value: currentEvents
93
+ });
94
+ Object.defineProperty(this, "callbacks", {
95
+ enumerable: true,
96
+ configurable: true,
97
+ writable: true,
98
+ value: callbacks
99
+ });
100
+ // Used to avoid automatic reconnection during user triggered connect/disconnect
101
+ // or reconnection itself.
102
+ Object.defineProperty(this, "duringExplicitConnectDisconnect", {
103
+ enumerable: true,
104
+ configurable: true,
105
+ writable: true,
106
+ value: 0
107
+ });
108
+ // On ChromeOS and Mac there's no timeout and no clear way to abort
109
+ // device.gatt.connect(), so we accept that sometimes we'll still
110
+ // be trying to connect when we'd rather not be. If it succeeds when
111
+ // we no longer intend to be connected then we disconnect at that
112
+ // point. If we try to connect when a previous connection attempt is
113
+ // still around then we wait for it for our timeout period.
114
+ //
115
+ // On Windows it times out after 7s.
116
+ // https://bugs.chromium.org/p/chromium/issues/detail?id=684073
117
+ Object.defineProperty(this, "gattConnectPromise", {
118
+ enumerable: true,
119
+ configurable: true,
120
+ writable: true,
121
+ value: void 0
122
+ });
123
+ Object.defineProperty(this, "disconnectPromise", {
124
+ enumerable: true,
125
+ configurable: true,
126
+ writable: true,
127
+ value: void 0
128
+ });
129
+ Object.defineProperty(this, "connecting", {
130
+ enumerable: true,
131
+ configurable: true,
132
+ writable: true,
133
+ value: false
134
+ });
135
+ Object.defineProperty(this, "isReconnect", {
136
+ enumerable: true,
137
+ configurable: true,
138
+ writable: true,
139
+ value: false
140
+ });
141
+ Object.defineProperty(this, "connectReadyPromise", {
142
+ enumerable: true,
143
+ configurable: true,
144
+ writable: true,
145
+ value: void 0
146
+ });
147
+ Object.defineProperty(this, "accelerometer", {
148
+ enumerable: true,
149
+ configurable: true,
150
+ writable: true,
151
+ value: new ServiceInfo(accelerometer_service_js_1.AccelerometerService.createService, [
152
+ "accelerometerdatachanged",
153
+ ])
154
+ });
155
+ Object.defineProperty(this, "buttons", {
156
+ enumerable: true,
157
+ configurable: true,
158
+ writable: true,
159
+ value: new ServiceInfo(button_service_js_1.ButtonService.createService, [
160
+ "buttonachanged",
161
+ "buttonbchanged",
162
+ ])
163
+ });
164
+ Object.defineProperty(this, "led", {
165
+ enumerable: true,
166
+ configurable: true,
167
+ writable: true,
168
+ value: new ServiceInfo(led_service_js_1.LedService.createService, [])
169
+ });
170
+ Object.defineProperty(this, "magnetometer", {
171
+ enumerable: true,
172
+ configurable: true,
173
+ writable: true,
174
+ value: new ServiceInfo(magnetometer_service_js_1.MagnetometerService.createService, [
175
+ "magnetometerdatachanged",
176
+ ])
177
+ });
178
+ Object.defineProperty(this, "uart", {
179
+ enumerable: true,
180
+ configurable: true,
181
+ writable: true,
182
+ value: new ServiceInfo(uart_service_js_1.UARTService.createService, ["uartdata"])
183
+ });
184
+ Object.defineProperty(this, "serviceInfo", {
185
+ enumerable: true,
186
+ configurable: true,
187
+ writable: true,
188
+ value: [
189
+ this.accelerometer,
190
+ this.buttons,
191
+ this.led,
192
+ this.magnetometer,
193
+ this.uart,
194
+ ]
195
+ });
196
+ Object.defineProperty(this, "boardVersion", {
197
+ enumerable: true,
198
+ configurable: true,
199
+ writable: true,
200
+ value: void 0
201
+ });
202
+ Object.defineProperty(this, "disconnectedRejectionErrorFactory", {
203
+ enumerable: true,
204
+ configurable: true,
205
+ writable: true,
206
+ value: () => {
207
+ return new device_js_1.DeviceError({
208
+ code: "device-disconnected",
209
+ message: "Error processing gatt operations queue - device disconnected",
210
+ });
211
+ }
212
+ });
213
+ Object.defineProperty(this, "gattOperations", {
214
+ enumerable: true,
215
+ configurable: true,
216
+ writable: true,
217
+ value: new promise_queue_js_1.PromiseQueue({
218
+ abortCheck: () => {
219
+ if (!this.device.gatt?.connected) {
220
+ return this.disconnectedRejectionErrorFactory;
221
+ }
222
+ return undefined;
223
+ },
224
+ })
225
+ });
226
+ Object.defineProperty(this, "handleDisconnectEvent", {
227
+ enumerable: true,
228
+ configurable: true,
229
+ writable: true,
230
+ value: async () => {
231
+ try {
232
+ if (!this.duringExplicitConnectDisconnect) {
233
+ this.logging.log("Bluetooth GATT disconnected... automatically trying reconnect");
234
+ // stateOnReconnectionAttempt();
235
+ this.disposeServices();
236
+ await this.reconnect();
237
+ }
238
+ else {
239
+ this.logging.log("Bluetooth GATT disconnect ignored during explicit disconnect");
240
+ }
241
+ }
242
+ catch (e) {
243
+ this.logging.error("Bluetooth connect triggered by disconnect listener failed", e);
244
+ }
245
+ }
246
+ });
247
+ device.addEventListener("gattserverdisconnected", this.handleDisconnectEvent);
248
+ }
249
+ async connect() {
250
+ this.logging.event({
251
+ type: this.isReconnect ? "Reconnect" : "Connect",
252
+ message: "Bluetooth connect start",
253
+ });
254
+ if (this.duringExplicitConnectDisconnect) {
255
+ this.logging.log("Skipping connect attempt when one is already in progress");
256
+ // Wait for the gattConnectPromise while showing a "connecting" dialog.
257
+ // If the user clicks disconnect while the automatic reconnect is in progress,
258
+ // then clicks reconnect, we need to wait rather than return immediately.
259
+ await this.gattConnectPromise;
260
+ return;
261
+ }
262
+ if (this.isReconnect) {
263
+ this.callbacks.onReconnecting();
264
+ }
265
+ else {
266
+ this.callbacks.onConnecting();
267
+ }
268
+ this.duringExplicitConnectDisconnect++;
269
+ if (this.device.gatt === undefined) {
270
+ throw new Error("BluetoothRemoteGATTServer for micro:bit device is undefined");
271
+ }
272
+ if (isWindowsOS) {
273
+ // On Windows, the micro:bit can take around 3 seconds to respond to gatt.disconnect().
274
+ // Attempting to connect/reconnect before the micro:bit has responded results in another
275
+ // gattserverdisconnected event being fired. We then fail to get primaryService on a
276
+ // disconnected GATT server.
277
+ await this.connectReadyPromise;
278
+ }
279
+ try {
280
+ // A previous connect might have completed in the background as a device was replugged etc.
281
+ await this.disconnectPromise;
282
+ this.gattConnectPromise =
283
+ this.gattConnectPromise ??
284
+ this.device.gatt
285
+ .connect()
286
+ .then(async () => {
287
+ // We always do this even if we might immediately disconnect as disconnecting
288
+ // without using services causes getPrimaryService calls to hang on subsequent
289
+ // reconnect - probably a device-side issue.
290
+ this.boardVersion = await this.getBoardVersion();
291
+ // This connection could be arbitrarily later when our manual timeout may have passed.
292
+ // Do we still want to be connected?
293
+ if (!this.connecting) {
294
+ this.logging.log("Bluetooth GATT server connect after timeout, triggering disconnect");
295
+ this.disconnectPromise = (async () => {
296
+ await this.disconnectInternal(false);
297
+ this.disconnectPromise = undefined;
298
+ })();
299
+ }
300
+ else {
301
+ this.logging.log("Bluetooth GATT server connected when connecting");
302
+ }
303
+ })
304
+ .catch((e) => {
305
+ if (this.connecting) {
306
+ // Error will be logged by main connect error handling.
307
+ throw e;
308
+ }
309
+ else {
310
+ this.logging.error("Bluetooth GATT server connect error after our timeout", e);
311
+ return undefined;
312
+ }
313
+ })
314
+ .finally(() => {
315
+ this.logging.log("Bluetooth GATT server promise field cleared");
316
+ this.gattConnectPromise = undefined;
317
+ });
318
+ this.connecting = true;
319
+ try {
320
+ const gattConnectResult = await Promise.race([
321
+ this.gattConnectPromise,
322
+ new Promise((resolve) => setTimeout(() => resolve("timeout"), connectTimeoutDuration)),
323
+ ]);
324
+ if (gattConnectResult === "timeout") {
325
+ this.logging.log("Bluetooth GATT server connect timeout");
326
+ throw new Error("Bluetooth GATT server connect timeout");
327
+ }
328
+ }
329
+ finally {
330
+ this.connecting = false;
331
+ }
332
+ this.currentEvents().forEach((e) => this.startNotifications(e));
333
+ this.logging.event({
334
+ type: this.isReconnect ? "Reconnect" : "Connect",
335
+ message: "Bluetooth connect success",
336
+ });
337
+ this.callbacks.onSuccess();
338
+ }
339
+ catch (e) {
340
+ this.logging.error("Bluetooth connect error", e);
341
+ this.logging.event({
342
+ type: this.isReconnect ? "Reconnect" : "Connect",
343
+ message: "Bluetooth connect failed",
344
+ });
345
+ await this.disconnectInternal(false);
346
+ this.callbacks.onFail();
347
+ throw new Error("Failed to establish a connection!");
348
+ }
349
+ finally {
350
+ this.duringExplicitConnectDisconnect--;
351
+ // Reset isReconnect for next time
352
+ this.isReconnect = false;
353
+ }
354
+ }
355
+ async disconnect() {
356
+ return this.disconnectInternal(true);
357
+ }
358
+ async disconnectInternal(userTriggered) {
359
+ this.logging.log(`Bluetooth disconnect ${userTriggered ? "(user triggered)" : "(programmatic)"}`);
360
+ this.duringExplicitConnectDisconnect++;
361
+ try {
362
+ if (this.device.gatt?.connected) {
363
+ this.device.gatt?.disconnect();
364
+ }
365
+ }
366
+ catch (e) {
367
+ this.logging.error("Bluetooth GATT disconnect error (ignored)", e);
368
+ // We might have already lost the connection.
369
+ }
370
+ finally {
371
+ this.disposeServices();
372
+ this.duringExplicitConnectDisconnect--;
373
+ }
374
+ this.connectReadyPromise = new Promise((resolve) => setTimeout(resolve, 3_500));
375
+ }
376
+ async reconnect() {
377
+ this.logging.log("Bluetooth reconnect");
378
+ this.isReconnect = true;
379
+ await this.connect();
380
+ }
381
+ assertGattServer() {
382
+ if (!this.device.gatt?.connected) {
383
+ throw new Error("Could not listen to services, no microbit connected!");
384
+ }
385
+ return this.device.gatt;
386
+ }
387
+ async getBoardVersion() {
388
+ this.assertGattServer();
389
+ const serviceMeta = bluetooth_profile_js_1.profile.deviceInformation;
390
+ try {
391
+ const deviceInfo = await this.assertGattServer().getPrimaryService(serviceMeta.id);
392
+ const characteristic = await deviceInfo.getCharacteristic(serviceMeta.characteristics.modelNumber.id);
393
+ const modelNumberBytes = await characteristic.readValue();
394
+ const modelNumber = new TextDecoder().decode(modelNumberBytes);
395
+ if (modelNumber.toLowerCase() === "BBC micro:bit".toLowerCase()) {
396
+ return "V1";
397
+ }
398
+ if (modelNumber.toLowerCase().includes("BBC micro:bit v2".toLowerCase())) {
399
+ return "V2";
400
+ }
401
+ throw new Error(`Unexpected model number ${modelNumber}`);
402
+ }
403
+ catch (e) {
404
+ this.logging.error("Could not read model number", e);
405
+ throw new Error("Could not read model number");
406
+ }
407
+ }
408
+ queueGattOperation(action) {
409
+ // Previously we wrapped rejections with:
410
+ // new DeviceError({ code: "background-comms-error", message: err }),
411
+ return this.gattOperations.add(action);
412
+ }
413
+ createIfNeeded(info, listenerInit) {
414
+ const gattServer = this.assertGattServer();
415
+ return info.createIfNeeded(gattServer, this.dispatchTypedEvent, this.queueGattOperation.bind(this), listenerInit);
416
+ }
417
+ async getAccelerometerService() {
418
+ return this.createIfNeeded(this.accelerometer, false);
419
+ }
420
+ async getLedService() {
421
+ return this.createIfNeeded(this.led, false);
422
+ }
423
+ async getMagnetometerService() {
424
+ return this.createIfNeeded(this.magnetometer, false);
425
+ }
426
+ async getUARTService() {
427
+ return this.createIfNeeded(this.uart, false);
428
+ }
429
+ async startNotifications(type) {
430
+ const serviceInfo = this.serviceInfo.find((s) => s.events.includes(type));
431
+ if (serviceInfo) {
432
+ this.queueGattOperation(async () => {
433
+ // TODO: type cheat! why?
434
+ const service = await this.createIfNeeded(serviceInfo, true);
435
+ await service?.startNotifications(type);
436
+ });
437
+ }
438
+ }
439
+ async stopNotifications(type) {
440
+ this.queueGattOperation(async () => {
441
+ const serviceInfo = this.serviceInfo.find((s) => s.events.includes(type));
442
+ await serviceInfo?.get()?.stopNotifications(type);
443
+ });
444
+ }
445
+ disposeServices() {
446
+ this.serviceInfo.forEach((s) => s.dispose());
447
+ this.gattOperations.clear(this.disconnectedRejectionErrorFactory);
448
+ }
449
+ }
450
+ exports.BluetoothDeviceWrapper = BluetoothDeviceWrapper;
451
+ const createBluetoothDeviceWrapper = async (device, logging, dispatchTypedEvent, currentEvents, callbacks) => {
452
+ try {
453
+ // Reuse our connection objects for the same device as they
454
+ // track the GATT connect promise that never resolves.
455
+ const bluetooth = deviceIdToWrapper.get(device.id) ??
456
+ new BluetoothDeviceWrapper(device, logging, dispatchTypedEvent, currentEvents, callbacks);
457
+ deviceIdToWrapper.set(device.id, bluetooth);
458
+ await bluetooth.connect();
459
+ return bluetooth;
460
+ }
461
+ catch (e) {
462
+ logging.error("Bluetooth connect error", e);
463
+ return undefined;
464
+ }
465
+ };
466
+ exports.createBluetoothDeviceWrapper = createBluetoothDeviceWrapper;
467
+ //# sourceMappingURL=bluetooth-device-wrapper.js.map
@@ -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,86 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.profile = void 0;
4
+ // Very incomplete BT profile
5
+ exports.profile = {
6
+ uart: {
7
+ id: "6e400001-b5a3-f393-e0a9-e50e24dcca9e",
8
+ characteristics: {
9
+ tx: { id: "6e400002-b5a3-f393-e0a9-e50e24dcca9e" },
10
+ rx: { id: "6e400003-b5a3-f393-e0a9-e50e24dcca9e" },
11
+ },
12
+ },
13
+ accelerometer: {
14
+ id: "e95d0753-251d-470a-a062-fa1922dfa9a8",
15
+ characteristics: {
16
+ data: { id: "e95dca4b-251d-470a-a062-fa1922dfa9a8" },
17
+ period: { id: "e95dfb24-251d-470a-a062-fa1922dfa9a8" },
18
+ },
19
+ },
20
+ deviceInformation: {
21
+ id: "0000180a-0000-1000-8000-00805f9b34fb",
22
+ characteristics: {
23
+ modelNumber: { id: "00002a24-0000-1000-8000-00805f9b34fb" },
24
+ serialNumber: { id: "00002a25-0000-1000-8000-00805f9b34fb" },
25
+ firmwareRevision: { id: "00002a26-0000-1000-8000-00805f9b34fb" },
26
+ hardwareRevision: { id: "00002a27-0000-1000-8000-00805f9b34fb" },
27
+ manufacturer: { id: "00002a29-0000-1000-8000-00805f9b34fb" },
28
+ },
29
+ },
30
+ dfuControl: {
31
+ id: "e95d93b0-251d-470a-a062-fa1922dfa9a8",
32
+ characteristics: {
33
+ control: { id: "e95d93b1-251d-470a-a062-fa1922dfa9a8" },
34
+ },
35
+ },
36
+ led: {
37
+ id: "e95dd91d-251d-470a-a062-fa1922dfa9a8",
38
+ characteristics: {
39
+ matrixState: { id: "e95d7b77-251d-470a-a062-fa1922dfa9a8" },
40
+ text: { id: "e95d93ee-251d-470a-a062-fa1922dfa9a8" },
41
+ scrollingDelay: { id: "e95d0d2d-251d-470a-a062-fa1922dfa9a8" },
42
+ },
43
+ },
44
+ ioPin: {
45
+ id: "e95d127b-251d-470a-a062-fa1922dfa9a8",
46
+ characteristics: {
47
+ pinData: { id: "e95d8d00-251d-470a-a062-fa1922dfa9a8" },
48
+ pinAdConfiguration: { id: "e95d5899-251d-470a-a062-fa1922dfa9a8" },
49
+ pinIoConfiguration: { id: "e95db9fe-251d-470a-a062-fa1922dfa9a8" },
50
+ pwmControl: { id: "e95dd822-251d-470a-a062-fa1922dfa9a8" },
51
+ },
52
+ },
53
+ button: {
54
+ id: "e95d9882-251d-470a-a062-fa1922dfa9a8",
55
+ characteristics: {
56
+ a: { id: "e95dda90-251d-470a-a062-fa1922dfa9a8" },
57
+ b: { id: "e95dda91-251d-470a-a062-fa1922dfa9a8" },
58
+ },
59
+ },
60
+ event: {
61
+ id: "e95d93af-251d-470a-a062-fa1922dfa9a8",
62
+ characteristics: {
63
+ microBitRequirements: { id: "e95db84c-251d-470a-a062-fa1922dfa9a8" },
64
+ microBitEvent: { id: "e95d9775-251d-470a-a062-fa1922dfa9a8" },
65
+ clientRequirements: { id: "e95d23c4-251d-470a-a062-fa1922dfa9a8" },
66
+ clientEvent: { id: "e95d5404-251d-470a-a062-fa1922dfa9a8" },
67
+ },
68
+ },
69
+ magnetometer: {
70
+ id: "e95df2d8-251d-470a-a062-fa1922dfa9a8",
71
+ characteristics: {
72
+ data: { id: "e95dfb11-251d-470a-a062-fa1922dfa9a8" },
73
+ period: { id: "e95d386c-251d-470a-a062-fa1922dfa9a8" },
74
+ bearing: { id: "e95d9715-251d-470a-a062-fa1922dfa9a8" },
75
+ calibration: { id: "e95db358-251d-470a-a062-fa1922dfa9a8" },
76
+ },
77
+ },
78
+ temperature: {
79
+ id: "e95d6100-251d-470a-a062-fa1922dfa9a8",
80
+ characteristics: {
81
+ data: { id: "e95d9250-251d-470a-a062-fa1922dfa9a8" },
82
+ period: { id: "e95d1b25-251d-470a-a062-fa1922dfa9a8" },
83
+ },
84
+ },
85
+ };
86
+ //# sourceMappingURL=bluetooth-profile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bluetooth-profile.js","sourceRoot":"","sources":["../../lib/bluetooth-profile.ts"],"names":[],"mappings":";;;AAAA,6BAA6B;AAChB,QAAA,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"}