@microbit/microbit-connection 0.9.0-apps.alpha.17 → 0.9.0-apps.alpha.19

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 (147) hide show
  1. package/build/cjs/async-util.d.ts +3 -1
  2. package/build/cjs/async-util.js +5 -1
  3. package/build/cjs/async-util.js.map +1 -1
  4. package/build/cjs/bluetooth/ble-error.d.ts +10 -0
  5. package/build/cjs/bluetooth/ble-error.js +47 -0
  6. package/build/cjs/bluetooth/ble-error.js.map +1 -0
  7. package/build/cjs/bluetooth/connection.d.ts +263 -3
  8. package/build/cjs/bluetooth/connection.js +78 -21
  9. package/build/cjs/bluetooth/connection.js.map +1 -1
  10. package/build/cjs/bluetooth/device-wrapper.d.ts +6 -0
  11. package/build/cjs/bluetooth/device-wrapper.js +30 -7
  12. package/build/cjs/bluetooth/device-wrapper.js.map +1 -1
  13. package/build/cjs/bluetooth/flashing/flashing-full.js +2 -1
  14. package/build/cjs/bluetooth/flashing/flashing-full.js.map +1 -1
  15. package/build/cjs/bluetooth/flashing/flashing-partial.js +2 -1
  16. package/build/cjs/bluetooth/flashing/flashing-partial.js.map +1 -1
  17. package/build/cjs/bluetooth/flashing/nordic-dfu.js +18 -6
  18. package/build/cjs/bluetooth/flashing/nordic-dfu.js.map +1 -1
  19. package/build/cjs/bluetooth/services/accelerometer-service.js +5 -4
  20. package/build/cjs/bluetooth/services/accelerometer-service.js.map +1 -1
  21. package/build/cjs/bluetooth/services/button-service.js +12 -3
  22. package/build/cjs/bluetooth/services/button-service.js.map +1 -1
  23. package/build/cjs/bluetooth/services/device-information-service.js +7 -12
  24. package/build/cjs/bluetooth/services/device-information-service.js.map +1 -1
  25. package/build/cjs/bluetooth/services/event-service.d.ts +48 -0
  26. package/build/cjs/bluetooth/services/event-service.js +273 -0
  27. package/build/cjs/bluetooth/services/event-service.js.map +1 -0
  28. package/build/cjs/bluetooth/services/event-service.test.d.ts +1 -0
  29. package/build/cjs/bluetooth/services/event-service.test.js +252 -0
  30. package/build/cjs/bluetooth/services/event-service.test.js.map +1 -0
  31. package/build/cjs/bluetooth/services/io-pin-service.d.ts +65 -0
  32. package/build/cjs/bluetooth/services/io-pin-service.js +173 -0
  33. package/build/cjs/bluetooth/services/io-pin-service.js.map +1 -0
  34. package/build/cjs/bluetooth/services/led-service.js +3 -0
  35. package/build/cjs/bluetooth/services/led-service.js.map +1 -1
  36. package/build/cjs/bluetooth/services/magnetometer-service.js +5 -4
  37. package/build/cjs/bluetooth/services/magnetometer-service.js.map +1 -1
  38. package/build/cjs/bluetooth/services/temperature-service.d.ts +14 -0
  39. package/build/cjs/bluetooth/services/temperature-service.js +80 -0
  40. package/build/cjs/bluetooth/services/temperature-service.js.map +1 -0
  41. package/build/cjs/bluetooth/services/uart-service.js +12 -3
  42. package/build/cjs/bluetooth/services/uart-service.js.map +1 -1
  43. package/build/cjs/device.d.ts +73 -58
  44. package/build/cjs/device.js +7 -2
  45. package/build/cjs/device.js.map +1 -1
  46. package/build/cjs/events.d.ts +1 -2
  47. package/build/cjs/events.js.map +1 -1
  48. package/build/cjs/index.d.ts +5 -5
  49. package/build/cjs/index.js +4 -3
  50. package/build/cjs/index.js.map +1 -1
  51. package/build/cjs/microbit-events.d.ts +67 -0
  52. package/build/cjs/microbit-events.js +55 -0
  53. package/build/cjs/microbit-events.js.map +1 -0
  54. package/build/cjs/radio-bridge/connection.d.ts +18 -5
  55. package/build/cjs/radio-bridge/connection.js +30 -12
  56. package/build/cjs/radio-bridge/connection.js.map +1 -1
  57. package/build/cjs/service-events.d.ts +55 -6
  58. package/build/cjs/service-events.js.map +1 -1
  59. package/build/cjs/usb/arm-debug.d.ts +1 -1
  60. package/build/cjs/usb/arm-debug.js +3 -3
  61. package/build/cjs/usb/arm-debug.js.map +1 -1
  62. package/build/cjs/usb/cmsis-dap.js +1 -1
  63. package/build/cjs/usb/cmsis-dap.js.map +1 -1
  64. package/build/cjs/usb/connection.d.ts +18 -3
  65. package/build/cjs/usb/connection.js +17 -10
  66. package/build/cjs/usb/connection.js.map +1 -1
  67. package/build/cjs/usb/index.d.ts +1 -1
  68. package/build/cjs/usb/partial-flashing.d.ts +22 -4
  69. package/build/cjs/usb/partial-flashing.js +108 -18
  70. package/build/cjs/usb/partial-flashing.js.map +1 -1
  71. package/build/cjs/usb/serial-events.d.ts +0 -5
  72. package/build/cjs/usb/transport.js +4 -4
  73. package/build/cjs/usb/transport.js.map +1 -1
  74. package/build/esm/async-util.d.ts +3 -1
  75. package/build/esm/async-util.js +5 -1
  76. package/build/esm/async-util.js.map +1 -1
  77. package/build/esm/bluetooth/ble-error.d.ts +10 -0
  78. package/build/esm/bluetooth/ble-error.js +42 -0
  79. package/build/esm/bluetooth/ble-error.js.map +1 -0
  80. package/build/esm/bluetooth/connection.d.ts +263 -3
  81. package/build/esm/bluetooth/connection.js +79 -22
  82. package/build/esm/bluetooth/connection.js.map +1 -1
  83. package/build/esm/bluetooth/device-wrapper.d.ts +6 -0
  84. package/build/esm/bluetooth/device-wrapper.js +30 -7
  85. package/build/esm/bluetooth/device-wrapper.js.map +1 -1
  86. package/build/esm/bluetooth/flashing/flashing-full.js +2 -1
  87. package/build/esm/bluetooth/flashing/flashing-full.js.map +1 -1
  88. package/build/esm/bluetooth/flashing/flashing-partial.js +2 -1
  89. package/build/esm/bluetooth/flashing/flashing-partial.js.map +1 -1
  90. package/build/esm/bluetooth/flashing/nordic-dfu.js +18 -6
  91. package/build/esm/bluetooth/flashing/nordic-dfu.js.map +1 -1
  92. package/build/esm/bluetooth/services/accelerometer-service.js +5 -4
  93. package/build/esm/bluetooth/services/accelerometer-service.js.map +1 -1
  94. package/build/esm/bluetooth/services/button-service.js +12 -3
  95. package/build/esm/bluetooth/services/button-service.js.map +1 -1
  96. package/build/esm/bluetooth/services/device-information-service.js +7 -12
  97. package/build/esm/bluetooth/services/device-information-service.js.map +1 -1
  98. package/build/esm/bluetooth/services/event-service.d.ts +48 -0
  99. package/build/esm/bluetooth/services/event-service.js +269 -0
  100. package/build/esm/bluetooth/services/event-service.js.map +1 -0
  101. package/build/esm/bluetooth/services/event-service.test.d.ts +1 -0
  102. package/build/esm/bluetooth/services/event-service.test.js +250 -0
  103. package/build/esm/bluetooth/services/event-service.test.js.map +1 -0
  104. package/build/esm/bluetooth/services/io-pin-service.d.ts +65 -0
  105. package/build/esm/bluetooth/services/io-pin-service.js +169 -0
  106. package/build/esm/bluetooth/services/io-pin-service.js.map +1 -0
  107. package/build/esm/bluetooth/services/led-service.js +3 -0
  108. package/build/esm/bluetooth/services/led-service.js.map +1 -1
  109. package/build/esm/bluetooth/services/magnetometer-service.js +5 -4
  110. package/build/esm/bluetooth/services/magnetometer-service.js.map +1 -1
  111. package/build/esm/bluetooth/services/temperature-service.d.ts +14 -0
  112. package/build/esm/bluetooth/services/temperature-service.js +76 -0
  113. package/build/esm/bluetooth/services/temperature-service.js.map +1 -0
  114. package/build/esm/bluetooth/services/uart-service.js +12 -3
  115. package/build/esm/bluetooth/services/uart-service.js.map +1 -1
  116. package/build/esm/device.d.ts +73 -58
  117. package/build/esm/device.js +7 -2
  118. package/build/esm/device.js.map +1 -1
  119. package/build/esm/events.d.ts +1 -2
  120. package/build/esm/events.js.map +1 -1
  121. package/build/esm/index.d.ts +5 -5
  122. package/build/esm/index.js +2 -2
  123. package/build/esm/index.js.map +1 -1
  124. package/build/esm/microbit-events.d.ts +67 -0
  125. package/build/esm/microbit-events.js +52 -0
  126. package/build/esm/microbit-events.js.map +1 -0
  127. package/build/esm/radio-bridge/connection.d.ts +18 -5
  128. package/build/esm/radio-bridge/connection.js +31 -13
  129. package/build/esm/radio-bridge/connection.js.map +1 -1
  130. package/build/esm/service-events.d.ts +55 -6
  131. package/build/esm/service-events.js.map +1 -1
  132. package/build/esm/usb/arm-debug.d.ts +1 -1
  133. package/build/esm/usb/arm-debug.js +3 -3
  134. package/build/esm/usb/arm-debug.js.map +1 -1
  135. package/build/esm/usb/cmsis-dap.js +1 -1
  136. package/build/esm/usb/cmsis-dap.js.map +1 -1
  137. package/build/esm/usb/connection.d.ts +18 -3
  138. package/build/esm/usb/connection.js +18 -11
  139. package/build/esm/usb/connection.js.map +1 -1
  140. package/build/esm/usb/index.d.ts +1 -1
  141. package/build/esm/usb/partial-flashing.d.ts +22 -4
  142. package/build/esm/usb/partial-flashing.js +108 -18
  143. package/build/esm/usb/partial-flashing.js.map +1 -1
  144. package/build/esm/usb/serial-events.d.ts +0 -5
  145. package/build/esm/usb/transport.js +4 -4
  146. package/build/esm/usb/transport.js.map +1 -1
  147. package/package.json +1 -1
@@ -3,7 +3,9 @@
3
3
  *
4
4
  * SPDX-License-Identifier: MIT
5
5
  */
6
- export declare class TimeoutError extends Error {
6
+ import { DeviceError } from "./device.js";
7
+ export declare class TimeoutError extends DeviceError {
8
+ constructor(message?: string);
7
9
  }
8
10
  export declare class DisconnectError extends Error {
9
11
  constructor(message?: string);
@@ -10,7 +10,11 @@ exports.disconnectErrorCallback = disconnectErrorCallback;
10
10
  *
11
11
  * SPDX-License-Identifier: MIT
12
12
  */
13
- class TimeoutError extends Error {
13
+ const device_js_1 = require("./device.js");
14
+ class TimeoutError extends device_js_1.DeviceError {
15
+ constructor(message = "Timeout") {
16
+ super({ code: "timeout", message });
17
+ }
14
18
  }
15
19
  exports.TimeoutError = TimeoutError;
16
20
  class DisconnectError extends Error {
@@ -1 +1 @@
1
- {"version":3,"file":"async-util.js","sourceRoot":"","sources":["../../src/async-util.ts"],"names":[],"mappings":";;;AAkBA,kCAQC;AAED,sBAEC;AAED,8CAMC;AAED,0DAMC;AA9CD;;;;GAIG;AACH,MAAa,YAAa,SAAQ,KAAK;CAAG;AAA1C,oCAA0C;AAE1C,MAAa,eAAgB,SAAQ,KAAK;IACxC,YAAY,UAAkB,YAAY;QACxC,KAAK,CAAC,OAAO,CAAC,CAAC;IACjB,CAAC;CACF;AAJD,0CAIC;AAED;;;;GAIG;AACI,KAAK,UAAU,WAAW,CAC/B,aAAyB,EACzB,OAAe;IAEf,OAAO,OAAO,CAAC,IAAI,CAAC;QAClB,aAAa;QACb,iBAAiB,CAAC,OAAO,CAAC;KAC3B,CAAe,CAAC;AACnB,CAAC;AAEM,KAAK,UAAU,KAAK,CAAC,MAAc;IACxC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;AAC/D,CAAC;AAEM,KAAK,UAAU,iBAAiB,CACrC,MAAc,EACd,UAAkB,SAAS;IAE3B,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC;IACpB,MAAM,IAAI,YAAY,CAAC,OAAO,CAAC,CAAC;AAClC,CAAC;AAED,SAAgB,uBAAuB,CAAI,UAAkB,YAAY;IACvE,IAAI,QAAgC,CAAC;IACrC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAI,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;QAC3C,QAAQ,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IACH,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAS,EAAE,CAAC;AAC1C,CAAC"}
1
+ {"version":3,"file":"async-util.js","sourceRoot":"","sources":["../../src/async-util.ts"],"names":[],"mappings":";;;AAwBA,kCAQC;AAED,sBAEC;AAED,8CAMC;AAED,0DAMC;AApDD;;;;GAIG;AACH,2CAA0C;AAE1C,MAAa,YAAa,SAAQ,uBAAW;IAC3C,YAAY,UAAkB,SAAS;QACrC,KAAK,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAC;IACtC,CAAC;CACF;AAJD,oCAIC;AAED,MAAa,eAAgB,SAAQ,KAAK;IACxC,YAAY,UAAkB,YAAY;QACxC,KAAK,CAAC,OAAO,CAAC,CAAC;IACjB,CAAC;CACF;AAJD,0CAIC;AAED;;;;GAIG;AACI,KAAK,UAAU,WAAW,CAC/B,aAAyB,EACzB,OAAe;IAEf,OAAO,OAAO,CAAC,IAAI,CAAC;QAClB,aAAa;QACb,iBAAiB,CAAC,OAAO,CAAC;KAC3B,CAAe,CAAC;AACnB,CAAC;AAEM,KAAK,UAAU,KAAK,CAAC,MAAc;IACxC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;AAC/D,CAAC;AAEM,KAAK,UAAU,iBAAiB,CACrC,MAAc,EACd,UAAkB,SAAS;IAE3B,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC;IACpB,MAAM,IAAI,YAAY,CAAC,OAAO,CAAC,CAAC;AAClC,CAAC;AAED,SAAgB,uBAAuB,CAAI,UAAkB,YAAY;IACvE,IAAI,QAAgC,CAAC;IACrC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAI,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;QAC3C,QAAQ,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IACH,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAS,EAAE,CAAC;AAC1C,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { DeviceError } from "../device.js";
2
+ /**
3
+ * Maps BLE errors from @capacitor-community/bluetooth-le (and Web Bluetooth)
4
+ * to DeviceError with an appropriate code.
5
+ */
6
+ export declare const mapBleError: (e: unknown) => DeviceError;
7
+ /**
8
+ * Wraps an async operation so that any BLE error is mapped to a DeviceError.
9
+ */
10
+ export declare function withBleErrorMapping<T>(fn: () => Promise<T>): Promise<T>;
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.mapBleError = void 0;
4
+ exports.withBleErrorMapping = withBleErrorMapping;
5
+ const device_js_1 = require("../device.js");
6
+ /**
7
+ * Maps BLE errors from @capacitor-community/bluetooth-le (and Web Bluetooth)
8
+ * to DeviceError with an appropriate code.
9
+ */
10
+ const mapBleError = (e) => {
11
+ if (e instanceof device_js_1.DeviceError) {
12
+ return e;
13
+ }
14
+ const message = e instanceof Error ? e.message : String(e);
15
+ let code = "connection-error";
16
+ if (e instanceof Error) {
17
+ // @capacitor-community/bluetooth-le error messages:
18
+ // https://github.com/capacitor-community/bluetooth-le/blob/main/ios/Plugin/DeviceManager.swift
19
+ // https://github.com/capacitor-community/bluetooth-le/blob/main/ios/Plugin/Device.swift
20
+ if (/timeout/i.test(message)) {
21
+ // BleClient throws plain Errors for its own timeouts:
22
+ // "Connection timeout", "Read timeout.", "Write timeout.",
23
+ // "Service discovery timeout.", "Disconnection timeout." etc.
24
+ code = "timeout";
25
+ }
26
+ else if (/disconnect/i.test(message)) {
27
+ code = "device-disconnected";
28
+ }
29
+ else if (/permission/i.test(message)) {
30
+ code = "permission-denied";
31
+ }
32
+ }
33
+ return new device_js_1.DeviceError({ code, message, cause: e });
34
+ };
35
+ exports.mapBleError = mapBleError;
36
+ /**
37
+ * Wraps an async operation so that any BLE error is mapped to a DeviceError.
38
+ */
39
+ async function withBleErrorMapping(fn) {
40
+ try {
41
+ return await fn();
42
+ }
43
+ catch (e) {
44
+ throw (0, exports.mapBleError)(e);
45
+ }
46
+ }
47
+ //# sourceMappingURL=ble-error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ble-error.js","sourceRoot":"","sources":["../../../src/bluetooth/ble-error.ts"],"names":[],"mappings":";;;AAoCA,kDAMC;AA1CD,4CAA4D;AAE5D;;;GAGG;AACI,MAAM,WAAW,GAAG,CAAC,CAAU,EAAe,EAAE;IACrD,IAAI,CAAC,YAAY,uBAAW,EAAE,CAAC;QAC7B,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,OAAO,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC3D,IAAI,IAAI,GAAoB,kBAAkB,CAAC;IAE/C,IAAI,CAAC,YAAY,KAAK,EAAE,CAAC;QACvB,oDAAoD;QACpD,+FAA+F;QAC/F,wFAAwF;QACxF,IAAI,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC7B,sDAAsD;YACtD,2DAA2D;YAC3D,8DAA8D;YAC9D,IAAI,GAAG,SAAS,CAAC;QACnB,CAAC;aAAM,IAAI,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACvC,IAAI,GAAG,qBAAqB,CAAC;QAC/B,CAAC;aAAM,IAAI,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACvC,IAAI,GAAG,mBAAmB,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,OAAO,IAAI,uBAAW,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;AACtD,CAAC,CAAC;AAzBW,QAAA,WAAW,eAyBtB;AAEF;;GAEG;AACI,KAAK,UAAU,mBAAmB,CAAI,EAAoB;IAC/D,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,EAAE,CAAC;IACpB,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,IAAA,mBAAW,EAAC,CAAC,CAAC,CAAC;IACvB,CAAC;AACH,CAAC"}
@@ -1,12 +1,109 @@
1
- import { DeviceConnection, FlashDataSource, FlashOptions } from "../device.js";
1
+ import { BackgroundErrorData, ConnectionStatusChange, DeviceConnection, FlashDataSource, FlashOptions } from "../device.js";
2
2
  import { Logging } from "../logging.js";
3
- import { AccelerometerData, LedMatrix, MagnetometerData, ServiceConnectionEventMap } from "../service-events.js";
3
+ import { AccelerometerData, ButtonActionData, ButtonData, GestureData, LedMatrix, MagnetometerData, MicrobitEventData, PinData, PinValue, TemperatureData, UartData } from "../service-events.js";
4
4
  import { DeviceBondState } from "./device-bond-state.js";
5
5
  export interface MicrobitBluetoothConnectionOptions {
6
6
  logging?: Logging;
7
7
  deviceBondState?: DeviceBondState;
8
8
  }
9
- export interface MicrobitBluetoothConnection extends DeviceConnection<ServiceConnectionEventMap> {
9
+ /**
10
+ * A Bluetooth connection to a micro:bit device.
11
+ *
12
+ * Events and methods rely on specific BLE services being present in the
13
+ * micro:bit's firmware. Which services are available depends on the firmware
14
+ * build for C++ and for a MakeCode program depends on the service blocks added
15
+ * from the Bluetooth extension.
16
+ *
17
+ * The table below maps each event and method to the BLE service it requires.
18
+ * If a service is not present, the event will silently not fire (no error is
19
+ * raised) and methods that depend on it will throw.
20
+ *
21
+ * ### Accelerometer Service
22
+ * - `accelerometerdatachanged` event
23
+ * - {@link getAccelerometerData}, {@link getAccelerometerPeriod}, {@link setAccelerometerPeriod}
24
+ *
25
+ * ### Button Service
26
+ * - `buttonachanged`, `buttonbchanged` events
27
+ *
28
+ * ### Event Service
29
+ * - `gesturechanged` event — also requires the accelerometer hardware to be
30
+ * active; this happens automatically if the Accelerometer Service is present
31
+ * - `buttonaaction`, `buttonbaction`, `buttonabaction` events
32
+ * - `logoaction` event (V2 only)
33
+ * - `microbitevent` event
34
+ * - {@link subscribeToEvent}, {@link sendEvent}
35
+ *
36
+ * ### IO Pin Service
37
+ * - `pinchanged` event
38
+ * - {@link getAnalogPins}, {@link setAnalogPins}
39
+ * - {@link getInputPins}, {@link setInputPins}
40
+ * - {@link readPins}, {@link writePins}, {@link writePinPwm}
41
+ *
42
+ * ### LED Service
43
+ * - {@link setLedText}, {@link getLedScrollingDelay}, {@link setLedScrollingDelay}
44
+ * - {@link getLedMatrix}, {@link setLedMatrix}
45
+ *
46
+ * ### Magnetometer Service
47
+ * - `magnetometerdatachanged` event
48
+ * - {@link getMagnetometerData}, {@link getMagnetometerBearing}
49
+ * - {@link getMagnetometerPeriod}, {@link setMagnetometerPeriod}
50
+ * - {@link triggerMagnetometerCalibration}
51
+ *
52
+ * ### Temperature Service
53
+ * - `temperaturechanged` event
54
+ * - {@link getTemperature}, {@link getTemperaturePeriod}, {@link setTemperaturePeriod}
55
+ *
56
+ * ### UART Service
57
+ * - `uartdata` event
58
+ * - {@link uartWrite}
59
+ */
60
+ export interface MicrobitBluetoothConnection extends DeviceConnection {
61
+ readonly type: "bluetooth";
62
+ addEventListener(type: "status", listener: (data: ConnectionStatusChange) => void): void;
63
+ addEventListener(type: "backgrounderror", listener: (data: BackgroundErrorData) => void): void;
64
+ addEventListener(type: "beforerequestdevice", listener: () => void): void;
65
+ addEventListener(type: "afterrequestdevice", listener: () => void): void;
66
+ addEventListener(type: "flash", listener: () => void): void;
67
+ /** Requires: Accelerometer Service. */
68
+ addEventListener(type: "accelerometerdatachanged", listener: (data: AccelerometerData) => void): void;
69
+ /** Requires: Button Service. */
70
+ addEventListener(type: "buttonachanged" | "buttonbchanged", listener: (data: ButtonData) => void): void;
71
+ /** Requires: Magnetometer Service. */
72
+ addEventListener(type: "magnetometerdatachanged", listener: (data: MagnetometerData) => void): void;
73
+ /** Requires: Temperature Service. */
74
+ addEventListener(type: "temperaturechanged", listener: (data: TemperatureData) => void): void;
75
+ /** Requires: IO Pin Service. */
76
+ addEventListener(type: "pinchanged", listener: (data: PinData) => void): void;
77
+ /** Requires: Event Service. The accelerometer hardware must also be active (automatic if the Accelerometer Service is present). */
78
+ addEventListener(type: "gesturechanged", listener: (data: GestureData) => void): void;
79
+ /** Requires: Event Service. */
80
+ addEventListener(type: "buttonaaction" | "buttonbaction" | "buttonabaction", listener: (data: ButtonActionData) => void): void;
81
+ /** Requires: Event Service. V2 only. */
82
+ addEventListener(type: "logoaction", listener: (data: ButtonActionData) => void): void;
83
+ /**
84
+ * Requires: Event Service. Receives raw micro:bit message bus events
85
+ * registered via {@link subscribeToEvent}. Higher-level events supported
86
+ * by the event service, like `gesturechanged` and button actions, are not
87
+ * included here unless you subscribe to them using {@link subscribeToEvent}.
88
+ */
89
+ addEventListener(type: "microbitevent", listener: (data: MicrobitEventData) => void): void;
90
+ /** Requires: UART Service. */
91
+ addEventListener(type: "uartdata", listener: (data: UartData) => void): void;
92
+ removeEventListener(type: "status", listener: (data: ConnectionStatusChange) => void): void;
93
+ removeEventListener(type: "backgrounderror", listener: (data: BackgroundErrorData) => void): void;
94
+ removeEventListener(type: "beforerequestdevice", listener: () => void): void;
95
+ removeEventListener(type: "afterrequestdevice", listener: () => void): void;
96
+ removeEventListener(type: "flash", listener: () => void): void;
97
+ removeEventListener(type: "accelerometerdatachanged", listener: (data: AccelerometerData) => void): void;
98
+ removeEventListener(type: "buttonachanged" | "buttonbchanged", listener: (data: ButtonData) => void): void;
99
+ removeEventListener(type: "magnetometerdatachanged", listener: (data: MagnetometerData) => void): void;
100
+ removeEventListener(type: "temperaturechanged", listener: (data: TemperatureData) => void): void;
101
+ removeEventListener(type: "pinchanged", listener: (data: PinData) => void): void;
102
+ removeEventListener(type: "gesturechanged", listener: (data: GestureData) => void): void;
103
+ removeEventListener(type: "buttonaaction" | "buttonbaction" | "buttonabaction", listener: (data: ButtonActionData) => void): void;
104
+ removeEventListener(type: "logoaction", listener: (data: ButtonActionData) => void): void;
105
+ removeEventListener(type: "microbitevent", listener: (data: MicrobitEventData) => void): void;
106
+ removeEventListener(type: "uartdata", listener: (data: UartData) => void): void;
10
107
  /**
11
108
  * Sets micro:bit name filter for device requesting.
12
109
  *
@@ -16,6 +113,8 @@ export interface MicrobitBluetoothConnection extends DeviceConnection<ServiceCon
16
113
  /**
17
114
  * Gets micro:bit accelerometer data.
18
115
  *
116
+ * Requires: Accelerometer Service.
117
+ *
19
118
  * @returns accelerometer data.
20
119
  * @throws {DeviceError} with code `not-connected` if there is no connection.
21
120
  */
@@ -23,6 +122,8 @@ export interface MicrobitBluetoothConnection extends DeviceConnection<ServiceCon
23
122
  /**
24
123
  * Gets micro:bit accelerometer period.
25
124
  *
125
+ * Requires: Accelerometer Service.
126
+ *
26
127
  * @returns accelerometer period.
27
128
  * @throws {DeviceError} with code `not-connected` if there is no connection.
28
129
  */
@@ -30,6 +131,8 @@ export interface MicrobitBluetoothConnection extends DeviceConnection<ServiceCon
30
131
  /**
31
132
  * Sets micro:bit accelerometer period.
32
133
  *
134
+ * Requires: Accelerometer Service.
135
+ *
33
136
  * @param value The accelerometer period.
34
137
  * @throws {DeviceError} with code `not-connected` if there is no connection.
35
138
  */
@@ -37,6 +140,8 @@ export interface MicrobitBluetoothConnection extends DeviceConnection<ServiceCon
37
140
  /**
38
141
  * Sets micro:bit LED text.
39
142
  *
143
+ * Requires: LED Service.
144
+ *
40
145
  * @param text The text displayed on micro:bit LED.
41
146
  * @throws {DeviceError} with code `not-connected` if there is no connection.
42
147
  */
@@ -44,6 +149,8 @@ export interface MicrobitBluetoothConnection extends DeviceConnection<ServiceCon
44
149
  /**
45
150
  * Gets micro:bit LED scrolling delay.
46
151
  *
152
+ * Requires: LED Service.
153
+ *
47
154
  * @returns LED scrolling delay in milliseconds.
48
155
  * @throws {DeviceError} with code `not-connected` if there is no connection.
49
156
  */
@@ -51,6 +158,8 @@ export interface MicrobitBluetoothConnection extends DeviceConnection<ServiceCon
51
158
  /**
52
159
  * Sets micro:bit LED scrolling delay.
53
160
  *
161
+ * Requires: LED Service.
162
+ *
54
163
  * @param delayInMillis LED scrolling delay in milliseconds.
55
164
  * @throws {DeviceError} with code `not-connected` if there is no connection.
56
165
  */
@@ -58,6 +167,8 @@ export interface MicrobitBluetoothConnection extends DeviceConnection<ServiceCon
58
167
  /**
59
168
  * Gets micro:bit LED matrix.
60
169
  *
170
+ * Requires: LED Service.
171
+ *
61
172
  * @returns a boolean matrix representing the micro:bit LED display.
62
173
  * @throws {DeviceError} with code `not-connected` if there is no connection.
63
174
  */
@@ -65,6 +176,8 @@ export interface MicrobitBluetoothConnection extends DeviceConnection<ServiceCon
65
176
  /**
66
177
  * Sets micro:bit LED matrix.
67
178
  *
179
+ * Requires: LED Service.
180
+ *
68
181
  * @param matrix an boolean matrix representing the micro:bit LED display.
69
182
  * @throws {DeviceError} with code `not-connected` if there is no connection.
70
183
  */
@@ -72,6 +185,8 @@ export interface MicrobitBluetoothConnection extends DeviceConnection<ServiceCon
72
185
  /**
73
186
  * Gets micro:bit magnetometer data.
74
187
  *
188
+ * Requires: Magnetometer Service.
189
+ *
75
190
  * @returns magnetometer data.
76
191
  * @throws {DeviceError} with code `not-connected` if there is no connection.
77
192
  */
@@ -79,6 +194,8 @@ export interface MicrobitBluetoothConnection extends DeviceConnection<ServiceCon
79
194
  /**
80
195
  * Gets micro:bit magnetometer bearing.
81
196
  *
197
+ * Requires: Magnetometer Service.
198
+ *
82
199
  * @returns magnetometer bearing.
83
200
  * @throws {DeviceError} with code `not-connected` if there is no connection.
84
201
  */
@@ -86,6 +203,8 @@ export interface MicrobitBluetoothConnection extends DeviceConnection<ServiceCon
86
203
  /**
87
204
  * Gets micro:bit magnetometer period.
88
205
  *
206
+ * Requires: Magnetometer Service.
207
+ *
89
208
  * @returns magnetometer period.
90
209
  * @throws {DeviceError} with code `not-connected` if there is no connection.
91
210
  */
@@ -93,6 +212,8 @@ export interface MicrobitBluetoothConnection extends DeviceConnection<ServiceCon
93
212
  /**
94
213
  * Sets micro:bit magnetometer period.
95
214
  *
215
+ * Requires: Magnetometer Service.
216
+ *
96
217
  * @param value magnetometer period.
97
218
  * @throws {DeviceError} with code `not-connected` if there is no connection.
98
219
  */
@@ -100,12 +221,151 @@ export interface MicrobitBluetoothConnection extends DeviceConnection<ServiceCon
100
221
  /**
101
222
  * Triggers micro:bit magnetometer calibration.
102
223
  *
224
+ * Requires: Magnetometer Service.
225
+ *
103
226
  * @throws {DeviceError} with code `not-connected` if there is no connection.
104
227
  */
105
228
  triggerMagnetometerCalibration(): Promise<void>;
229
+ /**
230
+ * Gets the micro:bit temperature in degrees Celsius.
231
+ *
232
+ * Requires: Temperature Service.
233
+ *
234
+ * @returns temperature in degrees Celsius.
235
+ * @throws {DeviceError} with code `not-connected` if there is no connection.
236
+ */
237
+ getTemperature(): Promise<number>;
238
+ /**
239
+ * Gets the micro:bit temperature sensor period.
240
+ *
241
+ * Requires: Temperature Service.
242
+ *
243
+ * @returns temperature period in milliseconds.
244
+ * @throws {DeviceError} with code `not-connected` if there is no connection.
245
+ */
246
+ getTemperaturePeriod(): Promise<number>;
247
+ /**
248
+ * Sets the micro:bit temperature sensor period.
249
+ *
250
+ * Requires: Temperature Service.
251
+ *
252
+ * @param value period in milliseconds.
253
+ * @throws {DeviceError} with code `not-connected` if there is no connection.
254
+ */
255
+ setTemperaturePeriod(value: number): Promise<void>;
256
+ /**
257
+ * Gets which pins are configured as analog.
258
+ * All other pins are digital (the default).
259
+ *
260
+ * Requires: IO Pin Service.
261
+ *
262
+ * @returns array of pin numbers (0-18) configured as analog.
263
+ * @throws {DeviceError} with code `not-connected` if there is no connection.
264
+ */
265
+ getAnalogPins(): Promise<number[]>;
266
+ /**
267
+ * Sets which pins are configured as analog.
268
+ * All other pins become digital (the default).
269
+ *
270
+ * Requires: IO Pin Service.
271
+ *
272
+ * @param pins array of pin numbers (0-18) to configure as analog.
273
+ * @throws {DeviceError} with code `not-connected` if there is no connection.
274
+ */
275
+ setAnalogPins(pins: number[]): Promise<void>;
276
+ /**
277
+ * Gets which pins are configured as inputs.
278
+ * Input pins are monitored and their values reported via notifications.
279
+ * All other pins are outputs (the default).
280
+ *
281
+ * Requires: IO Pin Service.
282
+ *
283
+ * @returns array of pin numbers (0-18) configured as inputs.
284
+ * @throws {DeviceError} with code `not-connected` if there is no connection.
285
+ */
286
+ getInputPins(): Promise<number[]>;
287
+ /**
288
+ * Sets which pins are configured as inputs.
289
+ * Input pins are monitored and their values reported via notifications.
290
+ * All other pins become outputs (the default).
291
+ *
292
+ * Note: configuring a pin as input overrides any existing pin mode
293
+ * (e.g. touch sensing used by MakeCode "on pin pressed" blocks).
294
+ * The two cannot be used on the same pin simultaneously.
295
+ *
296
+ * Requires: IO Pin Service.
297
+ *
298
+ * @param pins array of pin numbers (0-18) to configure as inputs.
299
+ * @throws {DeviceError} with code `not-connected` if there is no connection.
300
+ */
301
+ setInputPins(pins: number[]): Promise<void>;
302
+ /**
303
+ * Reads current values of input pins. Unlike the `pinchanged` event
304
+ * (which only includes pins whose values changed), this returns every
305
+ * pin configured as an input, up to a firmware limit of 10 pins
306
+ * (lowest-numbered first).
307
+ *
308
+ * Requires: IO Pin Service.
309
+ *
310
+ * @returns array of pin/value pairs.
311
+ * @throws {DeviceError} with code `not-connected` if there is no connection.
312
+ */
313
+ readPins(): Promise<PinValue[]>;
314
+ /**
315
+ * Writes pin data for output pins.
316
+ *
317
+ * Requires: IO Pin Service.
318
+ *
319
+ * @param data array of pin/value pairs.
320
+ * @throws {DeviceError} with code `not-connected` if there is no connection.
321
+ */
322
+ writePins(data: PinValue[]): Promise<void>;
323
+ /**
324
+ * Sets PWM output on a pin.
325
+ *
326
+ * Requires: IO Pin Service.
327
+ *
328
+ * @param pin Pin number (0-18).
329
+ * @param options PWM configuration.
330
+ * @param options.value Analog value (0-1024).
331
+ * @param options.period Period in microseconds.
332
+ * @throws {DeviceError} with code `not-connected` if there is no connection.
333
+ */
334
+ writePinPwm(pin: number, options: {
335
+ value: number;
336
+ period: number;
337
+ }): Promise<void>;
338
+ /**
339
+ * Register interest in a specific micro:bit message bus event.
340
+ * Tells the micro:bit to forward matching message bus traffic over BLE.
341
+ * Matching events are dispatched as `microbitevent`.
342
+ * Use 0 as the value to match all events from a source.
343
+ *
344
+ * For common message bus events, consider the higher-level alternatives:
345
+ * `gesturechanged`, `buttonaaction`, `buttonbaction`, `buttonabaction`.
346
+ *
347
+ * Requires: Event Service.
348
+ *
349
+ * @param source Event source ID.
350
+ * @param value Event value to match, or 0 for any.
351
+ * @throws {DeviceError} with code `not-connected` if there is no connection.
352
+ */
353
+ subscribeToEvent(source: number, value: number): Promise<void>;
354
+ /**
355
+ * Send an event to the micro:bit's message bus.
356
+ *
357
+ * Requires: Event Service.
358
+ *
359
+ * @param source Event source ID.
360
+ * @param value Event value.
361
+ * @throws {DeviceError} with code `not-connected` if there is no connection.
362
+ */
363
+ sendEvent(source: number, value: number): Promise<void>;
106
364
  /**
107
365
  * Write UART messages.
108
366
  *
367
+ * Requires: UART Service.
368
+ *
109
369
  * @param data UART message.
110
370
  * @throws {DeviceError} with code `not-connected` if there is no connection.
111
371
  */
@@ -35,17 +35,18 @@ exports.createBluetoothConnection = void 0;
35
35
  const bluetooth_le_1 = require("@capacitor-community/bluetooth-le");
36
36
  const core_1 = require("@capacitor/core");
37
37
  const nrf_intel_hex_1 = __importDefault(require("nrf-intel-hex"));
38
- const device_wrapper_js_1 = require("./device-wrapper.js");
39
- const profile_js_1 = require("./profile.js");
40
38
  const device_js_1 = require("../device.js");
41
39
  const events_js_1 = require("../events.js");
42
40
  const logging_js_1 = require("../logging.js");
41
+ const device_wrapper_js_1 = require("./device-wrapper.js");
43
42
  const flashing_full_js_1 = require("./flashing/flashing-full.js");
44
43
  const flashing_partial_js_1 = __importStar(require("./flashing/flashing-partial.js"));
44
+ const profile_js_1 = require("./profile.js");
45
+ const async_util_js_1 = require("../async-util.js");
45
46
  const availability_js_1 = require("../availability.js");
46
47
  const hex_util_js_1 = require("../hex-util.js");
48
+ const ble_error_js_1 = require("./ble-error.js");
47
49
  const device_bond_state_js_1 = require("./device-bond-state.js");
48
- const async_util_js_1 = require("../async-util.js");
49
50
  let bleClientInitialized = false;
50
51
  /**
51
52
  * A Bluetooth connection factory.
@@ -58,6 +59,12 @@ exports.createBluetoothConnection = createBluetoothConnection;
58
59
  class MicrobitBluetoothConnectionImpl extends events_js_1.TypedEventTarget {
59
60
  constructor(options = {}) {
60
61
  super();
62
+ Object.defineProperty(this, "type", {
63
+ enumerable: true,
64
+ configurable: true,
65
+ writable: true,
66
+ value: "bluetooth"
67
+ });
61
68
  Object.defineProperty(this, "status", {
62
69
  enumerable: true,
63
70
  configurable: true,
@@ -216,12 +223,14 @@ class MicrobitBluetoothConnectionImpl extends events_js_1.TypedEventTarget {
216
223
  const device = await this.requestDevice(options?.signal);
217
224
  this.device = new device_wrapper_js_1.BluetoothDeviceWrapper(device, this.logging, this.deviceBondState, this.dispatchEvent.bind(this), () => this.getActiveEvents(), {
218
225
  onConnecting: () => this.setStatus(device_js_1.ConnectionStatus.Connecting),
219
- onSuccess: () => this.setStatus(device_js_1.ConnectionStatus.Connected),
226
+ onSuccess: () => {
227
+ this.cachedBoardVersion = this.device.boardVersion;
228
+ this.setStatus(device_js_1.ConnectionStatus.Connected);
229
+ },
220
230
  onDisconnect: () => this.setStatus(device_js_1.ConnectionStatus.Disconnected),
221
231
  });
222
232
  }
223
233
  await this.device.connect(options);
224
- this.cachedBoardVersion = this.device.boardVersion;
225
234
  }
226
235
  async disconnect() {
227
236
  try {
@@ -299,59 +308,107 @@ class MicrobitBluetoothConnectionImpl extends events_js_1.TypedEventTarget {
299
308
  }
300
309
  async getAccelerometerData() {
301
310
  (0, device_js_1.assertConnected)(this.device);
302
- return this.device.accelerometer.getData();
311
+ return (0, ble_error_js_1.withBleErrorMapping)(() => this.device.accelerometer.getData());
303
312
  }
304
313
  async getAccelerometerPeriod() {
305
314
  (0, device_js_1.assertConnected)(this.device);
306
- return this.device.accelerometer.getPeriod();
315
+ return (0, ble_error_js_1.withBleErrorMapping)(() => this.device.accelerometer.getPeriod());
307
316
  }
308
317
  async setAccelerometerPeriod(value) {
309
318
  (0, device_js_1.assertConnected)(this.device);
310
- return this.device.accelerometer.setPeriod(value);
319
+ return (0, ble_error_js_1.withBleErrorMapping)(() => this.device.accelerometer.setPeriod(value));
311
320
  }
312
321
  async setLedText(text) {
313
322
  (0, device_js_1.assertConnected)(this.device);
314
- return this.device.led.setText(text);
323
+ return (0, ble_error_js_1.withBleErrorMapping)(() => this.device.led.setText(text));
315
324
  }
316
325
  async getLedScrollingDelay() {
317
326
  (0, device_js_1.assertConnected)(this.device);
318
- return this.device.led.getScrollingDelay();
327
+ return (0, ble_error_js_1.withBleErrorMapping)(() => this.device.led.getScrollingDelay());
319
328
  }
320
329
  async setLedScrollingDelay(delayInMillis) {
321
330
  (0, device_js_1.assertConnected)(this.device);
322
- await this.device.led.setScrollingDelay(delayInMillis);
331
+ return (0, ble_error_js_1.withBleErrorMapping)(() => this.device.led.setScrollingDelay(delayInMillis));
323
332
  }
324
333
  async getLedMatrix() {
325
334
  (0, device_js_1.assertConnected)(this.device);
326
- return await this.device.led.getLedMatrix();
335
+ return (0, ble_error_js_1.withBleErrorMapping)(() => this.device.led.getLedMatrix());
327
336
  }
328
337
  async setLedMatrix(matrix) {
329
338
  (0, device_js_1.assertConnected)(this.device);
330
- await this.device.led.setLedMatrix(matrix);
339
+ return (0, ble_error_js_1.withBleErrorMapping)(() => this.device.led.setLedMatrix(matrix));
331
340
  }
332
341
  async getMagnetometerData() {
333
342
  (0, device_js_1.assertConnected)(this.device);
334
- return this.device.magnetometer.getData();
343
+ return (0, ble_error_js_1.withBleErrorMapping)(() => this.device.magnetometer.getData());
335
344
  }
336
345
  async getMagnetometerPeriod() {
337
346
  (0, device_js_1.assertConnected)(this.device);
338
- return this.device.magnetometer.getPeriod();
347
+ return (0, ble_error_js_1.withBleErrorMapping)(() => this.device.magnetometer.getPeriod());
339
348
  }
340
349
  async setMagnetometerPeriod(value) {
341
350
  (0, device_js_1.assertConnected)(this.device);
342
- return this.device.magnetometer.setPeriod(value);
351
+ return (0, ble_error_js_1.withBleErrorMapping)(() => this.device.magnetometer.setPeriod(value));
343
352
  }
344
353
  async getMagnetometerBearing() {
345
354
  (0, device_js_1.assertConnected)(this.device);
346
- return this.device.magnetometer.getBearing();
355
+ return (0, ble_error_js_1.withBleErrorMapping)(() => this.device.magnetometer.getBearing());
347
356
  }
348
357
  async triggerMagnetometerCalibration() {
349
358
  (0, device_js_1.assertConnected)(this.device);
350
- await this.device.magnetometer.triggerCalibration();
359
+ return (0, ble_error_js_1.withBleErrorMapping)(() => this.device.magnetometer.triggerCalibration());
360
+ }
361
+ async getTemperature() {
362
+ (0, device_js_1.assertConnected)(this.device);
363
+ return (0, ble_error_js_1.withBleErrorMapping)(() => this.device.temperature.getData());
364
+ }
365
+ async getTemperaturePeriod() {
366
+ (0, device_js_1.assertConnected)(this.device);
367
+ return (0, ble_error_js_1.withBleErrorMapping)(() => this.device.temperature.getPeriod());
368
+ }
369
+ async setTemperaturePeriod(value) {
370
+ (0, device_js_1.assertConnected)(this.device);
371
+ return (0, ble_error_js_1.withBleErrorMapping)(() => this.device.temperature.setPeriod(value));
372
+ }
373
+ async getAnalogPins() {
374
+ (0, device_js_1.assertConnected)(this.device);
375
+ return (0, ble_error_js_1.withBleErrorMapping)(() => this.device.ioPin.getAnalogPins());
376
+ }
377
+ async setAnalogPins(pins) {
378
+ (0, device_js_1.assertConnected)(this.device);
379
+ return (0, ble_error_js_1.withBleErrorMapping)(() => this.device.ioPin.setAnalogPins(pins));
380
+ }
381
+ async getInputPins() {
382
+ (0, device_js_1.assertConnected)(this.device);
383
+ return (0, ble_error_js_1.withBleErrorMapping)(() => this.device.ioPin.getInputPins());
384
+ }
385
+ async setInputPins(pins) {
386
+ (0, device_js_1.assertConnected)(this.device);
387
+ return (0, ble_error_js_1.withBleErrorMapping)(() => this.device.ioPin.setInputPins(pins));
388
+ }
389
+ async readPins() {
390
+ (0, device_js_1.assertConnected)(this.device);
391
+ return (0, ble_error_js_1.withBleErrorMapping)(() => this.device.ioPin.readPins());
392
+ }
393
+ async writePins(data) {
394
+ (0, device_js_1.assertConnected)(this.device);
395
+ return (0, ble_error_js_1.withBleErrorMapping)(() => this.device.ioPin.writePins(data));
396
+ }
397
+ async writePinPwm(pin, options) {
398
+ (0, device_js_1.assertConnected)(this.device);
399
+ return (0, ble_error_js_1.withBleErrorMapping)(() => this.device.ioPin.setPwm(pin, options.value, options.period));
400
+ }
401
+ async subscribeToEvent(source, value) {
402
+ (0, device_js_1.assertConnected)(this.device);
403
+ return (0, ble_error_js_1.withBleErrorMapping)(() => this.device.events.subscribeToEvent(source, value));
404
+ }
405
+ async sendEvent(source, value) {
406
+ (0, device_js_1.assertConnected)(this.device);
407
+ return (0, ble_error_js_1.withBleErrorMapping)(() => this.device.events.sendEvent(source, value));
351
408
  }
352
409
  async uartWrite(data) {
353
410
  (0, device_js_1.assertConnected)(this.device);
354
- await this.device.uart.writeData(data);
411
+ return (0, ble_error_js_1.withBleErrorMapping)(() => this.device.uart.writeData(data));
355
412
  }
356
413
  /**
357
414
  * Flash the micro:bit.
@@ -377,7 +434,7 @@ class MicrobitBluetoothConnectionImpl extends events_js_1.TypedEventTarget {
377
434
  const boardVersion = connection.boardVersion;
378
435
  if (!boardVersion) {
379
436
  throw new device_js_1.DeviceError({
380
- code: "device-disconnected",
437
+ code: "connection-error",
381
438
  message: "No board version found",
382
439
  });
383
440
  }
@@ -387,7 +444,7 @@ class MicrobitBluetoothConnectionImpl extends events_js_1.TypedEventTarget {
387
444
  }
388
445
  if (!this.bleDevice) {
389
446
  throw new device_js_1.DeviceError({
390
- code: "device-disconnected",
447
+ code: "connection-error",
391
448
  message: "No device",
392
449
  });
393
450
  }