@microbit/microbit-connection 0.0.0-tab.change.177 → 0.9.0-apps.alpha.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 (292) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +94 -5
  3. package/build/cjs/accelerometer-service.d.ts +18 -0
  4. package/build/cjs/accelerometer-service.js +105 -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/{async-util.d.ts → cjs/async-util.d.ts} +9 -0
  9. package/build/cjs/async-util.js +47 -0
  10. package/build/cjs/async-util.js.map +1 -0
  11. package/build/cjs/bluetooth-device-wrapper.d.ts +97 -0
  12. package/build/cjs/bluetooth-device-wrapper.js +486 -0
  13. package/build/cjs/bluetooth-device-wrapper.js.map +1 -0
  14. package/build/{bluetooth-profile.d.ts → cjs/bluetooth-profile.d.ts} +43 -35
  15. package/build/cjs/bluetooth-profile.js +92 -0
  16. package/build/cjs/bluetooth-profile.js.map +1 -0
  17. package/build/cjs/bluetooth.d.ts +112 -0
  18. package/build/cjs/bluetooth.js +458 -0
  19. package/build/cjs/bluetooth.js.map +1 -0
  20. package/build/cjs/board-id.js +81 -0
  21. package/build/cjs/board-id.js.map +1 -0
  22. package/build/cjs/board-serial-info.js +51 -0
  23. package/build/cjs/board-serial-info.js.map +1 -0
  24. package/build/cjs/button-service.d.ts +13 -0
  25. package/build/cjs/button-service.js +66 -0
  26. package/build/cjs/button-service.js.map +1 -0
  27. package/build/cjs/buttons.js +22 -0
  28. package/build/cjs/buttons.js.map +1 -0
  29. package/build/cjs/constants.js +73 -0
  30. package/build/cjs/constants.js.map +1 -0
  31. package/build/cjs/device-information-service.d.ts +6 -0
  32. package/build/cjs/device-information-service.js +34 -0
  33. package/build/cjs/device-information-service.js.map +1 -0
  34. package/build/{device.d.ts → cjs/device.d.ts} +71 -39
  35. package/build/cjs/device.js +147 -0
  36. package/build/cjs/device.js.map +1 -0
  37. package/build/cjs/dfu-service.d.ts +9 -0
  38. package/build/cjs/dfu-service.js +26 -0
  39. package/build/cjs/dfu-service.js.map +1 -0
  40. package/build/{events.d.ts → cjs/events.d.ts} +1 -2
  41. package/build/cjs/events.js +109 -0
  42. package/build/cjs/events.js.map +1 -0
  43. package/build/cjs/flashing/flashing-full.d.ts +14 -0
  44. package/build/cjs/flashing/flashing-full.js +87 -0
  45. package/build/cjs/flashing/flashing-full.js.map +1 -0
  46. package/build/cjs/flashing/flashing-makecode.d.ts +6 -0
  47. package/build/cjs/flashing/flashing-makecode.js +48 -0
  48. package/build/cjs/flashing/flashing-makecode.js.map +1 -0
  49. package/build/cjs/flashing/flashing-partial.d.ts +9 -0
  50. package/build/cjs/flashing/flashing-partial.js +98 -0
  51. package/build/cjs/flashing/flashing-partial.js.map +1 -0
  52. package/build/cjs/flashing/flashing-v1.d.ts +11 -0
  53. package/build/cjs/flashing/flashing-v1.js +24 -0
  54. package/build/cjs/flashing/flashing-v1.js.map +1 -0
  55. package/build/cjs/flashing/nordic-dfu.d.ts +3 -0
  56. package/build/cjs/flashing/nordic-dfu.js +214 -0
  57. package/build/cjs/flashing/nordic-dfu.js.map +1 -0
  58. package/build/cjs/flashing/zip.d.ts +12 -0
  59. package/build/cjs/flashing/zip.js +177 -0
  60. package/build/cjs/flashing/zip.js.map +1 -0
  61. package/build/cjs/hex-flash-data-source.js +26 -0
  62. package/build/cjs/hex-flash-data-source.js.map +1 -0
  63. package/build/cjs/index.d.ts +17 -0
  64. package/build/cjs/index.js +37 -0
  65. package/build/cjs/index.js.map +1 -0
  66. package/build/cjs/led-service.d.ts +18 -0
  67. package/build/cjs/led-service.js +89 -0
  68. package/build/cjs/led-service.js.map +1 -0
  69. package/build/cjs/led.js +3 -0
  70. package/build/cjs/led.js.map +1 -0
  71. package/build/{logging.d.ts → cjs/logging.d.ts} +4 -4
  72. package/build/cjs/logging.js +16 -0
  73. package/build/cjs/logging.js.map +1 -0
  74. package/build/cjs/magnetometer-service.d.ts +18 -0
  75. package/build/cjs/magnetometer-service.js +94 -0
  76. package/build/cjs/magnetometer-service.js.map +1 -0
  77. package/build/cjs/magnetometer.d.ts +9 -0
  78. package/build/cjs/magnetometer.js +16 -0
  79. package/build/cjs/magnetometer.js.map +1 -0
  80. package/build/cjs/package.json +1 -0
  81. package/build/cjs/partial-flashing-service.d.ts +45 -0
  82. package/build/cjs/partial-flashing-service.js +110 -0
  83. package/build/cjs/partial-flashing-service.js.map +1 -0
  84. package/build/cjs/promise-queue.js +78 -0
  85. package/build/cjs/promise-queue.js.map +1 -0
  86. package/build/cjs/serial-events.d.ts +20 -0
  87. package/build/cjs/serial-events.js +69 -0
  88. package/build/cjs/serial-events.js.map +1 -0
  89. package/build/{service-events.d.ts → cjs/service-events.d.ts} +4 -0
  90. package/build/cjs/service-events.js +39 -0
  91. package/build/cjs/service-events.js.map +1 -0
  92. package/build/cjs/setupTests.js.map +1 -0
  93. package/build/cjs/uart-service.d.ts +12 -0
  94. package/build/cjs/uart-service.js +55 -0
  95. package/build/cjs/uart-service.js.map +1 -0
  96. package/build/cjs/uart.d.ts +4 -0
  97. package/build/cjs/uart.js +16 -0
  98. package/build/cjs/uart.js.map +1 -0
  99. package/build/{usb-device-wrapper.d.ts → cjs/usb-device-wrapper.d.ts} +1 -6
  100. package/build/cjs/usb-device-wrapper.js +437 -0
  101. package/build/cjs/usb-device-wrapper.js.map +1 -0
  102. package/build/cjs/usb-partial-flashing-utils.js +133 -0
  103. package/build/cjs/usb-partial-flashing-utils.js.map +1 -0
  104. package/build/{usb-partial-flashing.d.ts → cjs/usb-partial-flashing.d.ts} +3 -5
  105. package/build/cjs/usb-partial-flashing.js +342 -0
  106. package/build/cjs/usb-partial-flashing.js.map +1 -0
  107. package/build/cjs/usb-radio-bridge.d.ts +24 -0
  108. package/build/cjs/usb-radio-bridge.js +515 -0
  109. package/build/cjs/usb-radio-bridge.js.map +1 -0
  110. package/build/cjs/usb-serial-protocol.js +183 -0
  111. package/build/cjs/usb-serial-protocol.js.map +1 -0
  112. package/build/cjs/usb.d.ts +66 -0
  113. package/build/cjs/usb.js +662 -0
  114. package/build/cjs/usb.js.map +1 -0
  115. package/build/esm/accelerometer-service.d.ts +18 -0
  116. package/build/esm/accelerometer-service.js +101 -0
  117. package/build/esm/accelerometer-service.js.map +1 -0
  118. package/build/esm/accelerometer.d.ts +9 -0
  119. package/build/esm/accelerometer.js.map +1 -0
  120. package/build/esm/async-util.d.ts +22 -0
  121. package/build/esm/async-util.js +38 -0
  122. package/build/esm/async-util.js.map +1 -0
  123. package/build/esm/bluetooth-device-wrapper.d.ts +97 -0
  124. package/build/esm/bluetooth-device-wrapper.js +481 -0
  125. package/build/esm/bluetooth-device-wrapper.js.map +1 -0
  126. package/build/esm/bluetooth-profile.d.ts +147 -0
  127. package/build/{bluetooth-profile.js → esm/bluetooth-profile.js} +35 -29
  128. package/build/esm/bluetooth-profile.js.map +1 -0
  129. package/build/esm/bluetooth.d.ts +112 -0
  130. package/build/esm/bluetooth.js +428 -0
  131. package/build/esm/bluetooth.js.map +1 -0
  132. package/build/esm/board-id.d.ts +36 -0
  133. package/build/esm/board-id.js.map +1 -0
  134. package/build/esm/board-serial-info.d.ts +14 -0
  135. package/build/esm/board-serial-info.js.map +1 -0
  136. package/build/esm/button-service.d.ts +13 -0
  137. package/build/esm/button-service.js +62 -0
  138. package/build/esm/button-service.js.map +1 -0
  139. package/build/esm/buttons.d.ts +10 -0
  140. package/build/esm/buttons.js.map +1 -0
  141. package/build/esm/constants.d.ts +48 -0
  142. package/build/esm/constants.js.map +1 -0
  143. package/build/esm/device-information-service.d.ts +6 -0
  144. package/build/esm/device-information-service.js +30 -0
  145. package/build/esm/device-information-service.js.map +1 -0
  146. package/build/esm/device.d.ts +238 -0
  147. package/build/{device.js → esm/device.js} +16 -58
  148. package/build/esm/device.js.map +1 -0
  149. package/build/esm/dfu-service.d.ts +9 -0
  150. package/build/esm/dfu-service.js +22 -0
  151. package/build/esm/dfu-service.js.map +1 -0
  152. package/build/esm/events.d.ts +110 -0
  153. package/build/esm/events.js.map +1 -0
  154. package/build/esm/flashing/flashing-full.d.ts +14 -0
  155. package/build/esm/flashing/flashing-full.js +84 -0
  156. package/build/esm/flashing/flashing-full.js.map +1 -0
  157. package/build/esm/flashing/flashing-makecode.d.ts +6 -0
  158. package/build/esm/flashing/flashing-makecode.js +44 -0
  159. package/build/esm/flashing/flashing-makecode.js.map +1 -0
  160. package/build/esm/flashing/flashing-partial.d.ts +9 -0
  161. package/build/esm/flashing/flashing-partial.js +95 -0
  162. package/build/esm/flashing/flashing-partial.js.map +1 -0
  163. package/build/esm/flashing/flashing-v1.d.ts +11 -0
  164. package/build/esm/flashing/flashing-v1.js +20 -0
  165. package/build/esm/flashing/flashing-v1.js.map +1 -0
  166. package/build/esm/flashing/nordic-dfu.d.ts +3 -0
  167. package/build/esm/flashing/nordic-dfu.js +211 -0
  168. package/build/esm/flashing/nordic-dfu.js.map +1 -0
  169. package/build/esm/flashing/zip.d.ts +12 -0
  170. package/build/esm/flashing/zip.js +174 -0
  171. package/build/esm/flashing/zip.js.map +1 -0
  172. package/build/esm/hex-flash-data-source.d.ts +7 -0
  173. package/build/esm/hex-flash-data-source.js.map +1 -0
  174. package/build/esm/index.d.ts +17 -0
  175. package/build/esm/index.js +12 -0
  176. package/build/esm/index.js.map +1 -0
  177. package/build/esm/led-service.d.ts +18 -0
  178. package/build/esm/led-service.js +85 -0
  179. package/build/esm/led-service.js.map +1 -0
  180. package/build/esm/led.d.ts +6 -0
  181. package/build/esm/led.js.map +1 -0
  182. package/build/esm/logging.d.ts +21 -0
  183. package/build/{logging.js → esm/logging.js} +1 -1
  184. package/build/esm/logging.js.map +1 -0
  185. package/build/esm/magnetometer-service.d.ts +18 -0
  186. package/build/esm/magnetometer-service.js +90 -0
  187. package/build/esm/magnetometer-service.js.map +1 -0
  188. package/build/esm/magnetometer.d.ts +9 -0
  189. package/build/esm/magnetometer.js +12 -0
  190. package/build/esm/magnetometer.js.map +1 -0
  191. package/build/esm/package.json +1 -0
  192. package/build/esm/partial-flashing-service.d.ts +45 -0
  193. package/build/esm/partial-flashing-service.js +106 -0
  194. package/build/esm/partial-flashing-service.js.map +1 -0
  195. package/build/esm/promise-queue.d.ts +27 -0
  196. package/build/esm/promise-queue.js.map +1 -0
  197. package/build/esm/serial-events.d.ts +20 -0
  198. package/build/esm/serial-events.js +61 -0
  199. package/build/esm/serial-events.js.map +1 -0
  200. package/build/esm/service-events.d.ts +17 -0
  201. package/build/{service-events.js → esm/service-events.js} +12 -0
  202. package/build/esm/service-events.js.map +1 -0
  203. package/build/esm/setupTests.d.ts +6 -0
  204. package/build/{setupTests.js.map → esm/setupTests.js.map} +1 -1
  205. package/build/esm/uart-service.d.ts +12 -0
  206. package/build/esm/uart-service.js +51 -0
  207. package/build/esm/uart-service.js.map +1 -0
  208. package/build/esm/uart.d.ts +4 -0
  209. package/build/esm/uart.js +12 -0
  210. package/build/esm/uart.js.map +1 -0
  211. package/build/esm/usb-device-wrapper.d.ts +47 -0
  212. package/build/{usb-device-wrapper.js → esm/usb-device-wrapper.js} +43 -17
  213. package/build/esm/usb-device-wrapper.js.map +1 -0
  214. package/build/esm/usb-partial-flashing-utils.d.ts +17 -0
  215. package/build/esm/usb-partial-flashing-utils.js.map +1 -0
  216. package/build/esm/usb-partial-flashing.d.ts +67 -0
  217. package/build/{usb-partial-flashing.js → esm/usb-partial-flashing.js} +12 -13
  218. package/build/esm/usb-partial-flashing.js.map +1 -0
  219. package/build/esm/usb-radio-bridge.d.ts +24 -0
  220. package/build/{usb-radio-bridge.js → esm/usb-radio-bridge.js} +13 -7
  221. package/build/esm/usb-radio-bridge.js.map +1 -0
  222. package/build/esm/usb-serial-protocol.d.ts +66 -0
  223. package/build/esm/usb-serial-protocol.js.map +1 -0
  224. package/build/esm/usb.d.ts +66 -0
  225. package/build/{usb.js → esm/usb.js} +257 -49
  226. package/build/esm/usb.js.map +1 -0
  227. package/package.json +25 -8
  228. package/typedoc.json +14 -0
  229. package/build/accelerometer-service.d.ts +0 -18
  230. package/build/accelerometer-service.js +0 -102
  231. package/build/accelerometer-service.js.map +0 -1
  232. package/build/accelerometer.js.map +0 -1
  233. package/build/async-util.js +0 -22
  234. package/build/async-util.js.map +0 -1
  235. package/build/bluetooth-device-wrapper.d.ts +0 -57
  236. package/build/bluetooth-device-wrapper.js +0 -433
  237. package/build/bluetooth-device-wrapper.js.map +0 -1
  238. package/build/bluetooth-profile.js.map +0 -1
  239. package/build/bluetooth.d.ts +0 -54
  240. package/build/bluetooth.js +0 -243
  241. package/build/bluetooth.js.map +0 -1
  242. package/build/board-id.js.map +0 -1
  243. package/build/board-serial-info.js.map +0 -1
  244. package/build/button-service.d.ts +0 -13
  245. package/build/button-service.js +0 -76
  246. package/build/button-service.js.map +0 -1
  247. package/build/buttons.js.map +0 -1
  248. package/build/constants.js.map +0 -1
  249. package/build/device.js.map +0 -1
  250. package/build/events.js.map +0 -1
  251. package/build/hex-flash-data-source.js.map +0 -1
  252. package/build/index.d.ts +0 -10
  253. package/build/index.js +0 -8
  254. package/build/index.js.map +0 -1
  255. package/build/led-service.d.ts +0 -20
  256. package/build/led-service.js +0 -116
  257. package/build/led-service.js.map +0 -1
  258. package/build/led.js.map +0 -1
  259. package/build/logging.js.map +0 -1
  260. package/build/promise-queue.js.map +0 -1
  261. package/build/service-events.js.map +0 -1
  262. package/build/usb-device-wrapper.js.map +0 -1
  263. package/build/usb-partial-flashing-utils.js.map +0 -1
  264. package/build/usb-partial-flashing.js.map +0 -1
  265. package/build/usb-radio-bridge.d.ts +0 -41
  266. package/build/usb-radio-bridge.js.map +0 -1
  267. package/build/usb-serial-protocol.js.map +0 -1
  268. package/build/usb.d.ts +0 -54
  269. package/build/usb.js.map +0 -1
  270. package/vite.config.ts +0 -34
  271. /package/build/{accelerometer.d.ts → cjs/accelerometer.d.ts} +0 -0
  272. /package/build/{board-id.d.ts → cjs/board-id.d.ts} +0 -0
  273. /package/build/{board-serial-info.d.ts → cjs/board-serial-info.d.ts} +0 -0
  274. /package/build/{buttons.d.ts → cjs/buttons.d.ts} +0 -0
  275. /package/build/{constants.d.ts → cjs/constants.d.ts} +0 -0
  276. /package/build/{hex-flash-data-source.d.ts → cjs/hex-flash-data-source.d.ts} +0 -0
  277. /package/build/{led.d.ts → cjs/led.d.ts} +0 -0
  278. /package/build/{promise-queue.d.ts → cjs/promise-queue.d.ts} +0 -0
  279. /package/build/{setupTests.d.ts → cjs/setupTests.d.ts} +0 -0
  280. /package/build/{usb-partial-flashing-utils.d.ts → cjs/usb-partial-flashing-utils.d.ts} +0 -0
  281. /package/build/{usb-serial-protocol.d.ts → cjs/usb-serial-protocol.d.ts} +0 -0
  282. /package/build/{accelerometer.js → esm/accelerometer.js} +0 -0
  283. /package/build/{board-id.js → esm/board-id.js} +0 -0
  284. /package/build/{board-serial-info.js → esm/board-serial-info.js} +0 -0
  285. /package/build/{buttons.js → esm/buttons.js} +0 -0
  286. /package/build/{constants.js → esm/constants.js} +0 -0
  287. /package/build/{events.js → esm/events.js} +0 -0
  288. /package/build/{hex-flash-data-source.js → esm/hex-flash-data-source.js} +0 -0
  289. /package/build/{led.js → esm/led.js} +0 -0
  290. /package/build/{promise-queue.js → esm/promise-queue.js} +0 -0
  291. /package/build/{usb-partial-flashing-utils.js → esm/usb-partial-flashing-utils.js} +0 -0
  292. /package/build/{usb-serial-protocol.js → esm/usb-serial-protocol.js} +0 -0
@@ -1,12 +1,5 @@
1
- // Very incomplete BT profile
2
1
  export const profile = {
3
- uart: {
4
- id: "6e400001-b5a3-f393-e0a9-e50e24dcca9e",
5
- characteristics: {
6
- tx: { id: "6e400002-b5a3-f393-e0a9-e50e24dcca9e" },
7
- rx: { id: "6e400003-b5a3-f393-e0a9-e50e24dcca9e" },
8
- },
9
- },
2
+ // Alphabetised
10
3
  accelerometer: {
11
4
  id: "e95d0753-251d-470a-a062-fa1922dfa9a8",
12
5
  characteristics: {
@@ -14,14 +7,21 @@ export const profile = {
14
7
  period: { id: "e95dfb24-251d-470a-a062-fa1922dfa9a8" },
15
8
  },
16
9
  },
10
+ button: {
11
+ id: "e95d9882-251d-470a-a062-fa1922dfa9a8",
12
+ characteristics: {
13
+ a: { id: "e95dda90-251d-470a-a062-fa1922dfa9a8" },
14
+ b: { id: "e95dda91-251d-470a-a062-fa1922dfa9a8" },
15
+ },
16
+ },
17
17
  deviceInformation: {
18
18
  id: "0000180a-0000-1000-8000-00805f9b34fb",
19
19
  characteristics: {
20
- modelNumber: { id: "00002a24-0000-1000-8000-00805f9b34fb" },
21
- serialNumber: { id: "00002a25-0000-1000-8000-00805f9b34fb" },
22
20
  firmwareRevision: { id: "00002a26-0000-1000-8000-00805f9b34fb" },
23
21
  hardwareRevision: { id: "00002a27-0000-1000-8000-00805f9b34fb" },
24
22
  manufacturer: { id: "00002a29-0000-1000-8000-00805f9b34fb" },
23
+ modelNumber: { id: "00002a24-0000-1000-8000-00805f9b34fb" },
24
+ serialNumber: { id: "00002a25-0000-1000-8000-00805f9b34fb" },
25
25
  },
26
26
  },
27
27
  dfuControl: {
@@ -30,37 +30,30 @@ export const profile = {
30
30
  control: { id: "e95d93b1-251d-470a-a062-fa1922dfa9a8" },
31
31
  },
32
32
  },
33
- led: {
34
- id: "e95dd91d-251d-470a-a062-fa1922dfa9a8",
33
+ event: {
34
+ id: "e95d93af-251d-470a-a062-fa1922dfa9a8",
35
35
  characteristics: {
36
- matrixState: { id: "e95d7b77-251d-470a-a062-fa1922dfa9a8" },
37
- text: { id: "e95d93ee-251d-470a-a062-fa1922dfa9a8" },
38
- scrollingDelay: { id: "e95d0d2d-251d-470a-a062-fa1922dfa9a8" },
36
+ clientEvent: { id: "e95d5404-251d-470a-a062-fa1922dfa9a8" },
37
+ clientRequirements: { id: "e95d23c4-251d-470a-a062-fa1922dfa9a8" },
38
+ microBitEvent: { id: "e95d9775-251d-470a-a062-fa1922dfa9a8" },
39
+ microBitRequirements: { id: "e95db84c-251d-470a-a062-fa1922dfa9a8" },
39
40
  },
40
41
  },
41
42
  ioPin: {
42
43
  id: "e95d127b-251d-470a-a062-fa1922dfa9a8",
43
44
  characteristics: {
44
- pinData: { id: "e95d8d00-251d-470a-a062-fa1922dfa9a8" },
45
45
  pinAdConfiguration: { id: "e95d5899-251d-470a-a062-fa1922dfa9a8" },
46
+ pinData: { id: "e95d8d00-251d-470a-a062-fa1922dfa9a8" },
46
47
  pinIoConfiguration: { id: "e95db9fe-251d-470a-a062-fa1922dfa9a8" },
47
48
  pwmControl: { id: "e95dd822-251d-470a-a062-fa1922dfa9a8" },
48
49
  },
49
50
  },
50
- button: {
51
- id: "e95d9882-251d-470a-a062-fa1922dfa9a8",
52
- characteristics: {
53
- a: { id: "e95dda90-251d-470a-a062-fa1922dfa9a8" },
54
- b: { id: "e95dda91-251d-470a-a062-fa1922dfa9a8" },
55
- },
56
- },
57
- event: {
58
- id: "e95d93af-251d-470a-a062-fa1922dfa9a8",
51
+ led: {
52
+ id: "e95dd91d-251d-470a-a062-fa1922dfa9a8",
59
53
  characteristics: {
60
- microBitRequirements: { id: "e95db84c-251d-470a-a062-fa1922dfa9a8" },
61
- microBitEvent: { id: "e95d9775-251d-470a-a062-fa1922dfa9a8" },
62
- clientRequirements: { id: "e95d23c4-251d-470a-a062-fa1922dfa9a8" },
63
- clientEvent: { id: "e95d5404-251d-470a-a062-fa1922dfa9a8" },
54
+ matrixState: { id: "e95d7b77-251d-470a-a062-fa1922dfa9a8" },
55
+ scrollingDelay: { id: "e95d0d2d-251d-470a-a062-fa1922dfa9a8" },
56
+ text: { id: "e95d93ee-251d-470a-a062-fa1922dfa9a8" },
64
57
  },
65
58
  },
66
59
  magnetometer: {
@@ -72,6 +65,12 @@ export const profile = {
72
65
  calibration: { id: "e95db358-251d-470a-a062-fa1922dfa9a8" },
73
66
  },
74
67
  },
68
+ partialFlashing: {
69
+ id: "e97dd91d-251d-470a-a062-fa1922dfa9a8",
70
+ characteristics: {
71
+ partialFlash: { id: "e97d3b10-251d-470a-a062-fa1922dfa9a8" },
72
+ },
73
+ },
75
74
  temperature: {
76
75
  id: "e95d6100-251d-470a-a062-fa1922dfa9a8",
77
76
  characteristics: {
@@ -79,5 +78,12 @@ export const profile = {
79
78
  period: { id: "e95d1b25-251d-470a-a062-fa1922dfa9a8" },
80
79
  },
81
80
  },
81
+ uart: {
82
+ id: "6e400001-b5a3-f393-e0a9-e50e24dcca9e",
83
+ characteristics: {
84
+ rx: { id: "6e400003-b5a3-f393-e0a9-e50e24dcca9e" },
85
+ tx: { id: "6e400002-b5a3-f393-e0a9-e50e24dcca9e" },
86
+ },
87
+ },
82
88
  };
83
89
  //# sourceMappingURL=bluetooth-profile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bluetooth-profile.js","sourceRoot":"","sources":["../../lib/bluetooth-profile.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,112 @@
1
+ import { AccelerometerData } from "./accelerometer.js";
2
+ import { DeviceConnection, FlashDataSource, FlashOptions } from "./device.js";
3
+ import { LedMatrix } from "./led.js";
4
+ import { Logging } from "./logging.js";
5
+ import { MagnetometerData } from "./magnetometer.js";
6
+ import { ServiceConnectionEventMap } from "./service-events.js";
7
+ export interface MicrobitWebBluetoothConnectionOptions {
8
+ logging?: Logging;
9
+ }
10
+ export interface MicrobitWebBluetoothConnection extends DeviceConnection<ServiceConnectionEventMap> {
11
+ /**
12
+ * Sets micro:bit name filter for device requesting.
13
+ *
14
+ * @param name The name of the micro:bit.
15
+ */
16
+ setNameFilter(name: string): void;
17
+ /**
18
+ * Gets micro:bit accelerometer data.
19
+ *
20
+ * @returns accelerometer data or undefined if there is no connection.
21
+ */
22
+ getAccelerometerData(): Promise<AccelerometerData | undefined>;
23
+ /**
24
+ * Gets micro:bit accelerometer period.
25
+ *
26
+ * @returns accelerometer period or undefined if there is no connection.
27
+ */
28
+ getAccelerometerPeriod(): Promise<number | undefined>;
29
+ /**
30
+ * Sets micro:bit accelerometer period.
31
+ *
32
+ * @param value The accelerometer period.
33
+ */
34
+ setAccelerometerPeriod(value: number): Promise<void>;
35
+ /**
36
+ * Sets micro:bit LED text.
37
+ *
38
+ * @param text The text displayed on micro:bit LED.
39
+ */
40
+ setLedText(text: string): Promise<void>;
41
+ /**
42
+ * Gets micro:bit LED scrolling delay.
43
+ *
44
+ * @returns LED scrolling delay in milliseconds.
45
+ */
46
+ getLedScrollingDelay(): Promise<number | undefined>;
47
+ /**
48
+ * Sets micro:bit LED scrolling delay.
49
+ *
50
+ * @param delayInMillis LED scrolling delay in milliseconds.
51
+ */
52
+ setLedScrollingDelay(delayInMillis: number): Promise<void>;
53
+ /**
54
+ * Gets micro:bit LED matrix.
55
+ *
56
+ * @returns a boolean matrix representing the micro:bit LED display.
57
+ */
58
+ getLedMatrix(): Promise<LedMatrix | undefined>;
59
+ /**
60
+ * Sets micro:bit LED matrix.
61
+ *
62
+ * @param matrix an boolean matrix representing the micro:bit LED display.
63
+ */
64
+ setLedMatrix(matrix: LedMatrix): Promise<void>;
65
+ /**
66
+ * Gets micro:bit magnetometer data.
67
+ *
68
+ * @returns magnetometer data.
69
+ */
70
+ getMagnetometerData(): Promise<MagnetometerData | undefined>;
71
+ /**
72
+ * Gets micro:bit magnetometer bearing.
73
+ *
74
+ * @returns magnetometer bearing.
75
+ */
76
+ getMagnetometerBearing(): Promise<number | undefined>;
77
+ /**
78
+ * Gets micro:bit magnetometer period.
79
+ *
80
+ * @returns magnetometer period.
81
+ */
82
+ getMagnetometerPeriod(): Promise<number | undefined>;
83
+ /**
84
+ * Sets micro:bit magnetometer period.
85
+ *
86
+ * @param value magnetometer period.
87
+ */
88
+ setMagnetometerPeriod(value: number): Promise<void>;
89
+ /**
90
+ * Triggers micro:bit magnetometer calibration.
91
+ */
92
+ triggerMagnetometerCalibration(): Promise<void>;
93
+ /**
94
+ * Write UART messages.
95
+ *
96
+ * @param data UART message.
97
+ */
98
+ uartWrite(data: Uint8Array): Promise<void>;
99
+ /**
100
+ * Flash the micro:bit.
101
+ *
102
+ * @param dataSource The data to use.
103
+ * @param options Flash options and progress callback.
104
+ * @throws {DeviceError} On flash failure. The error.code property indicates the failure type.
105
+ * @throws {FlashDataError} If data preparation fails.
106
+ */
107
+ flash(dataSource: FlashDataSource, options: FlashOptions): Promise<void>;
108
+ }
109
+ /**
110
+ * A Bluetooth connection factory.
111
+ */
112
+ export declare const createWebBluetoothConnection: (options?: MicrobitWebBluetoothConnectionOptions) => MicrobitWebBluetoothConnection;
@@ -0,0 +1,428 @@
1
+ /**
2
+ * (c) 2021, Micro:bit Educational Foundation and contributors
3
+ *
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ import { BleClient } from "@capacitor-community/bluetooth-le";
7
+ import { Capacitor } from "@capacitor/core";
8
+ import MemoryMap from "nrf-intel-hex";
9
+ import { BluetoothDeviceWrapper, isAndroid, scanningTimeoutInMs, } from "./bluetooth-device-wrapper.js";
10
+ import { profile } from "./bluetooth-profile.js";
11
+ import { AfterRequestDevice, BeforeRequestDevice, ConnectionStatus, ConnectionStatusEvent, DeviceError, FlashDataError, ProgressStage, } from "./device.js";
12
+ import { TypedEventTarget } from "./events.js";
13
+ import { ConsoleLogging } from "./logging.js";
14
+ import { fullFlash } from "./flashing/flashing-full.js";
15
+ import partialFlash, { PartialFlashResult, } from "./flashing/flashing-partial.js";
16
+ let bleClientInitialized = false;
17
+ /**
18
+ * A Bluetooth connection factory.
19
+ */
20
+ export const createWebBluetoothConnection = (options) => new MicrobitWebBluetoothConnectionImpl(options);
21
+ /**
22
+ * A Bluetooth connection to a micro:bit device.
23
+ */
24
+ class MicrobitWebBluetoothConnectionImpl extends TypedEventTarget {
25
+ constructor(options = {}) {
26
+ super();
27
+ Object.defineProperty(this, "status", {
28
+ enumerable: true,
29
+ configurable: true,
30
+ writable: true,
31
+ value: ConnectionStatus.SUPPORT_NOT_KNOWN
32
+ });
33
+ /**
34
+ * The USB device we last connected to.
35
+ * Cleared if it is disconnected.
36
+ */
37
+ Object.defineProperty(this, "device", {
38
+ enumerable: true,
39
+ configurable: true,
40
+ writable: true,
41
+ value: void 0
42
+ });
43
+ Object.defineProperty(this, "logging", {
44
+ enumerable: true,
45
+ configurable: true,
46
+ writable: true,
47
+ value: void 0
48
+ });
49
+ Object.defineProperty(this, "connection", {
50
+ enumerable: true,
51
+ configurable: true,
52
+ writable: true,
53
+ value: void 0
54
+ });
55
+ Object.defineProperty(this, "availabilityListener", {
56
+ enumerable: true,
57
+ configurable: true,
58
+ writable: true,
59
+ value: (e) => {
60
+ // TODO: is this called? is `value` correct?
61
+ const value = e.value;
62
+ this.availability = value;
63
+ }
64
+ });
65
+ Object.defineProperty(this, "availability", {
66
+ enumerable: true,
67
+ configurable: true,
68
+ writable: true,
69
+ value: void 0
70
+ });
71
+ Object.defineProperty(this, "nameFilter", {
72
+ enumerable: true,
73
+ configurable: true,
74
+ writable: true,
75
+ value: void 0
76
+ });
77
+ Object.defineProperty(this, "deferStatusUpdates", {
78
+ enumerable: true,
79
+ configurable: true,
80
+ writable: true,
81
+ value: false
82
+ });
83
+ this.logging = options.logging || new ConsoleLogging();
84
+ }
85
+ eventActivated(type) {
86
+ this.connection?.startNotifications(type);
87
+ }
88
+ eventDeactivated(type) {
89
+ this.connection?.stopNotifications(type);
90
+ }
91
+ log(v) {
92
+ this.logging.log(v);
93
+ }
94
+ error(message, e) {
95
+ this.logging.error(message, e);
96
+ }
97
+ async initialize() {
98
+ navigator.bluetooth?.addEventListener("availabilitychanged", this.availabilityListener);
99
+ this.availability = await navigator.bluetooth?.getAvailability();
100
+ this.setStatus(this.availability
101
+ ? ConnectionStatus.NO_AUTHORIZED_DEVICE
102
+ : ConnectionStatus.NOT_SUPPORTED);
103
+ }
104
+ dispose() {
105
+ navigator.bluetooth?.removeEventListener("availabilitychanged", this.availabilityListener);
106
+ }
107
+ getBoardVersion() {
108
+ return this.connection?.boardVersion;
109
+ }
110
+ async connect(options) {
111
+ const progress = options?.progress ?? (() => { });
112
+ progress(ProgressStage.Initializing);
113
+ await this.preConnectInitialization();
114
+ if (!this.connection) {
115
+ progress(ProgressStage.FindingDevice);
116
+ const device = await this.requestDevice();
117
+ this.connection = new BluetoothDeviceWrapper(device, this.logging, this.dispatchTypedEvent.bind(this), () => this.getActiveEvents(), {
118
+ onConnecting: () => this.setStatus(ConnectionStatus.CONNECTING),
119
+ onReconnecting: () => this.setStatus(ConnectionStatus.RECONNECTING),
120
+ onSuccess: () => this.setStatus(ConnectionStatus.CONNECTED),
121
+ onFail: () => {
122
+ this.setStatus(ConnectionStatus.DISCONNECTED);
123
+ this.connection = undefined;
124
+ },
125
+ });
126
+ }
127
+ progress(ProgressStage.Connecting);
128
+ await this.connection.connect();
129
+ }
130
+ /**
131
+ * Initializes BLE.
132
+ *
133
+ * This must happen before requesting a device or connecting.
134
+ *
135
+ * We do this just before use not at connection initialize because on Android/iOS
136
+ * that's the appropriate time to ask for permissions.
137
+ */
138
+ async preConnectInitialization() {
139
+ try {
140
+ if (isAndroid()) {
141
+ const isLocationEnabled = await BleClient.isLocationEnabled();
142
+ if (!isLocationEnabled) {
143
+ throw new DeviceError({
144
+ code: "bluetooth-missing-permissions",
145
+ message: "Location services is disabled",
146
+ });
147
+ }
148
+ }
149
+ if (!bleClientInitialized) {
150
+ await BleClient.initialize({ androidNeverForLocation: true });
151
+ bleClientInitialized = true;
152
+ }
153
+ const isBluetoothEnabled = await BleClient.isEnabled();
154
+ if (!isBluetoothEnabled) {
155
+ throw new DeviceError({
156
+ code: "bluetooth-disabled",
157
+ message: "Bluetooth is disabled",
158
+ });
159
+ }
160
+ }
161
+ catch (e) {
162
+ this.error("Error initializing Bluetooth", e);
163
+ const error = e;
164
+ if (error.message === "BLE permission denied") {
165
+ // Error thrown for iOS platform.
166
+ throw new DeviceError({
167
+ code: "bluetooth-disabled",
168
+ message: "Bluetooth is disabled",
169
+ });
170
+ }
171
+ throw new DeviceError({
172
+ code: "bluetooth-missing-permissions",
173
+ message: "Missing permissions",
174
+ });
175
+ }
176
+ }
177
+ async disconnect() {
178
+ try {
179
+ if (this.connection) {
180
+ await this.connection.disconnect();
181
+ }
182
+ }
183
+ catch (e) {
184
+ this.logging.event({
185
+ type: "Bluetooth-error",
186
+ message: "error-disconnecting",
187
+ });
188
+ }
189
+ finally {
190
+ this.connection = undefined;
191
+ this.setStatus(ConnectionStatus.DISCONNECTED);
192
+ this.logging.event({
193
+ type: "Bluetooth-info",
194
+ message: "disconnected",
195
+ });
196
+ }
197
+ }
198
+ setStatus(newStatus) {
199
+ this.status = newStatus;
200
+ this.log("Bluetooth connection status " + newStatus);
201
+ if (!this.deferStatusUpdates) {
202
+ this.dispatchTypedEvent("status", new ConnectionStatusEvent(newStatus));
203
+ }
204
+ }
205
+ serialWrite(data) {
206
+ if (this.connection) {
207
+ // TODO
208
+ }
209
+ return Promise.resolve();
210
+ }
211
+ async clearDevice() {
212
+ await this.disconnect();
213
+ this.device = undefined;
214
+ this.setStatus(ConnectionStatus.NO_AUTHORIZED_DEVICE);
215
+ }
216
+ setNameFilter(name) {
217
+ this.nameFilter = name;
218
+ }
219
+ async requestDevice() {
220
+ if (this.device) {
221
+ return this.device;
222
+ }
223
+ this.dispatchTypedEvent("beforerequestdevice", new BeforeRequestDevice());
224
+ try {
225
+ const namePrefix = this.nameFilter
226
+ ? `BBC micro:bit [${this.nameFilter}]`
227
+ : "BBC micro:bit";
228
+ if (Capacitor.isNativePlatform()) {
229
+ this.device = await this.requestDeviceNative(namePrefix);
230
+ }
231
+ else {
232
+ this.device = await this.requestDeviceWeb(namePrefix);
233
+ }
234
+ if (!this.device) {
235
+ this.setStatus(ConnectionStatus.NO_AUTHORIZED_DEVICE);
236
+ throw new DeviceError({
237
+ code: "timeout-error",
238
+ message: "Timeout scanning for device",
239
+ });
240
+ }
241
+ return this.device;
242
+ }
243
+ finally {
244
+ this.dispatchTypedEvent("afterrequestdevice", new AfterRequestDevice());
245
+ }
246
+ }
247
+ async getAccelerometerData() {
248
+ return this.connection?.accelerometer.getData();
249
+ }
250
+ async getAccelerometerPeriod() {
251
+ return this.connection?.accelerometer.getPeriod();
252
+ }
253
+ async setAccelerometerPeriod(value) {
254
+ return this.connection?.accelerometer.setPeriod(value);
255
+ }
256
+ async setLedText(text) {
257
+ return this.connection?.led.setText(text);
258
+ }
259
+ async getLedScrollingDelay() {
260
+ return this.connection?.led.getScrollingDelay();
261
+ }
262
+ async setLedScrollingDelay(delayInMillis) {
263
+ await this.connection?.led.setScrollingDelay(delayInMillis);
264
+ }
265
+ async getLedMatrix() {
266
+ return await this.connection?.led.getLedMatrix();
267
+ }
268
+ async setLedMatrix(matrix) {
269
+ await this.connection?.led.setLedMatrix(matrix);
270
+ }
271
+ async getMagnetometerData() {
272
+ return this.connection?.magnetometer.getData();
273
+ }
274
+ async getMagnetometerPeriod() {
275
+ return this.connection?.magnetometer.getPeriod();
276
+ }
277
+ async setMagnetometerPeriod(value) {
278
+ return this.connection?.magnetometer.setPeriod(value);
279
+ }
280
+ async getMagnetometerBearing() {
281
+ return this.connection?.magnetometer.getBearing();
282
+ }
283
+ async triggerMagnetometerCalibration() {
284
+ await this.connection?.magnetometer.triggerCalibration();
285
+ }
286
+ async uartWrite(data) {
287
+ await this.connection?.uart.writeData(data);
288
+ }
289
+ /**
290
+ * Flash the micro:bit.
291
+ *
292
+ * Note that this will always leave the connection disconnected.
293
+ *
294
+ * @param dataSource The data to use.
295
+ * @param options Flash options and progress callback.
296
+ */
297
+ async flash(dataSource, options = {}) {
298
+ const progress = options.progress ?? (() => { });
299
+ try {
300
+ // We'll disconnect/reconnect multiple times due to device resets, but reporting this is unhelpful.
301
+ this.deferStatusUpdates = true;
302
+ if (this.status !== ConnectionStatus.CONNECTED) {
303
+ await this.connect({ progress });
304
+ }
305
+ const connection = this.connection;
306
+ try {
307
+ const boardVersion = connection.boardVersion;
308
+ if (!boardVersion) {
309
+ throw new DeviceError({
310
+ code: "device-disconnected",
311
+ message: "No board version found",
312
+ });
313
+ }
314
+ const memoryMap = convertDataToMemoryMap(await dataSource(boardVersion));
315
+ if (!memoryMap) {
316
+ throw new FlashDataError("Could not convert hex to memory map");
317
+ }
318
+ if (!this.device) {
319
+ throw new DeviceError({
320
+ code: "device-disconnected",
321
+ message: "No device",
322
+ });
323
+ }
324
+ this.log(`Got board version ${boardVersion}`);
325
+ const partialFlashResult = await partialFlash(connection, memoryMap, progress);
326
+ if (partialFlashResult === PartialFlashResult.AttemptFullFlash) {
327
+ await fullFlash(connection, boardVersion, memoryMap, progress);
328
+ }
329
+ }
330
+ catch (e) {
331
+ this.error("Failed to flash", e);
332
+ throw e;
333
+ }
334
+ finally {
335
+ await this.disconnect();
336
+ }
337
+ }
338
+ finally {
339
+ this.deferStatusUpdates = false;
340
+ this.dispatchTypedEvent("status", new ConnectionStatusEvent(this.status));
341
+ }
342
+ }
343
+ async requestDeviceWeb(namePrefix) {
344
+ return await BleClient.requestDevice({
345
+ namePrefix: this.nameFilter
346
+ ? `BBC micro:bit [${namePrefix}]`
347
+ : "BBC micro:bit",
348
+ // TODO: is this possible to reinstate?
349
+ // See https://github.com/bsiever/microbit-pxt-blehid/issues/31
350
+ //namePrefix: this.nameFilter
351
+ // ? `uBit [${this.nameFilter}]`
352
+ // : "uBit",
353
+ optionalServices: [
354
+ profile.accelerometer.id,
355
+ profile.button.id,
356
+ profile.deviceInformation.id,
357
+ profile.dfuControl.id,
358
+ profile.event.id,
359
+ profile.ioPin.id,
360
+ profile.led.id,
361
+ profile.magnetometer.id,
362
+ profile.temperature.id,
363
+ profile.uart.id,
364
+ ],
365
+ });
366
+ }
367
+ /**
368
+ * Finds device with specified name prefix.
369
+ *
370
+ * @returns device or undefined if none can be found.
371
+ */
372
+ async requestDeviceNative(namePrefix) {
373
+ // Check for existing bonded devices.
374
+ const bonded = await this.checkBondedDevices((device) => {
375
+ const name = device.name;
376
+ return !!name && name.startsWith(namePrefix);
377
+ });
378
+ if (bonded) {
379
+ return bonded;
380
+ }
381
+ this.log(`Scanning for device - ${namePrefix}`);
382
+ let found = false;
383
+ const scanPromise = new Promise((resolve) =>
384
+ // This only resolves when we stop the scan.
385
+ void BleClient.requestLEScan({}, async (result) => {
386
+ // For a V1 in the Nordic bootloader, we see a name of "DfuTarg" that
387
+ // isn't matched by the name filter but the advertising name is in the
388
+ // localName on the device. So we filter here instead. This happens on
389
+ // iOS if DFU fails / is interrupted.
390
+ if (result.device.name?.startsWith(namePrefix) ||
391
+ result.localName?.startsWith(namePrefix)) {
392
+ found = true;
393
+ await BleClient.stopLEScan();
394
+ resolve(result.device);
395
+ }
396
+ }));
397
+ const scanTimeoutPromise = new Promise((resolve) => setTimeout(async () => {
398
+ if (!found) {
399
+ await BleClient.stopLEScan();
400
+ this.log("Timeout scanning for device");
401
+ resolve(undefined);
402
+ }
403
+ }, scanningTimeoutInMs));
404
+ return await Promise.race([scanPromise, scanTimeoutPromise]);
405
+ }
406
+ async checkBondedDevices(predicate) {
407
+ if (!isAndroid()) {
408
+ // Not supported.
409
+ return undefined;
410
+ }
411
+ const bondedDevices = await BleClient.getBondedDevices();
412
+ const result = bondedDevices.find(predicate);
413
+ this.log(result === undefined
414
+ ? "No matching bonded device"
415
+ : "Found matching bonded device");
416
+ return result;
417
+ }
418
+ }
419
+ const convertDataToMemoryMap = (data) => {
420
+ if (data instanceof MemoryMap) {
421
+ return data;
422
+ }
423
+ if (data instanceof Uint8Array) {
424
+ return MemoryMap.fromPaddedUint8Array(data);
425
+ }
426
+ return MemoryMap.fromHex(data);
427
+ };
428
+ //# sourceMappingURL=bluetooth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bluetooth.js","sourceRoot":"","sources":["../../lib/bluetooth.ts"],"names":[],"mappings":"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"}