@microbit/microbit-connection 0.1.0 → 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 (148) hide show
  1. package/README.md +4 -4
  2. package/build/cjs/accelerometer-service.d.ts +5 -5
  3. package/build/cjs/accelerometer-service.js +41 -42
  4. package/build/cjs/accelerometer-service.js.map +1 -1
  5. package/build/cjs/async-util.d.ts +9 -0
  6. package/build/cjs/async-util.js +27 -7
  7. package/build/cjs/async-util.js.map +1 -1
  8. package/build/cjs/bluetooth-device-wrapper.d.ts +61 -27
  9. package/build/cjs/bluetooth-device-wrapper.js +285 -266
  10. package/build/cjs/bluetooth-device-wrapper.js.map +1 -1
  11. package/build/cjs/bluetooth-profile.d.ts +43 -35
  12. package/build/cjs/bluetooth-profile.js +35 -29
  13. package/build/cjs/bluetooth-profile.js.map +1 -1
  14. package/build/cjs/bluetooth.d.ts +10 -6
  15. package/build/cjs/bluetooth.js +286 -100
  16. package/build/cjs/bluetooth.js.map +1 -1
  17. package/build/cjs/button-service.d.ts +5 -5
  18. package/build/cjs/button-service.js +31 -45
  19. package/build/cjs/button-service.js.map +1 -1
  20. package/build/cjs/device-information-service.d.ts +6 -0
  21. package/build/cjs/device-information-service.js +34 -0
  22. package/build/cjs/device-information-service.js.map +1 -0
  23. package/build/cjs/device.d.ts +65 -8
  24. package/build/cjs/device.js +16 -2
  25. package/build/cjs/device.js.map +1 -1
  26. package/build/cjs/dfu-service.d.ts +9 -0
  27. package/build/cjs/dfu-service.js +26 -0
  28. package/build/cjs/dfu-service.js.map +1 -0
  29. package/build/cjs/flashing/flashing-full.d.ts +14 -0
  30. package/build/cjs/flashing/flashing-full.js +87 -0
  31. package/build/cjs/flashing/flashing-full.js.map +1 -0
  32. package/build/cjs/flashing/flashing-makecode.d.ts +6 -0
  33. package/build/cjs/flashing/flashing-makecode.js +48 -0
  34. package/build/cjs/flashing/flashing-makecode.js.map +1 -0
  35. package/build/cjs/flashing/flashing-partial.d.ts +9 -0
  36. package/build/cjs/flashing/flashing-partial.js +98 -0
  37. package/build/cjs/flashing/flashing-partial.js.map +1 -0
  38. package/build/cjs/flashing/flashing-v1.d.ts +11 -0
  39. package/build/cjs/flashing/flashing-v1.js +24 -0
  40. package/build/cjs/flashing/flashing-v1.js.map +1 -0
  41. package/build/cjs/flashing/nordic-dfu.d.ts +3 -0
  42. package/build/cjs/flashing/nordic-dfu.js +214 -0
  43. package/build/cjs/flashing/nordic-dfu.js.map +1 -0
  44. package/build/cjs/flashing/zip.d.ts +12 -0
  45. package/build/cjs/flashing/zip.js +177 -0
  46. package/build/cjs/flashing/zip.js.map +1 -0
  47. package/build/cjs/index.d.ts +3 -3
  48. package/build/cjs/index.js +2 -1
  49. package/build/cjs/index.js.map +1 -1
  50. package/build/cjs/led-service.d.ts +5 -7
  51. package/build/cjs/led-service.js +13 -44
  52. package/build/cjs/led-service.js.map +1 -1
  53. package/build/cjs/logging.d.ts +1 -1
  54. package/build/cjs/logging.js +3 -3
  55. package/build/cjs/logging.js.map +1 -1
  56. package/build/cjs/magnetometer-service.d.ts +5 -9
  57. package/build/cjs/magnetometer-service.js +30 -65
  58. package/build/cjs/magnetometer-service.js.map +1 -1
  59. package/build/cjs/partial-flashing-service.d.ts +45 -0
  60. package/build/cjs/partial-flashing-service.js +110 -0
  61. package/build/cjs/partial-flashing-service.js.map +1 -0
  62. package/build/cjs/uart-service.d.ts +4 -5
  63. package/build/cjs/uart-service.js +19 -40
  64. package/build/cjs/uart-service.js.map +1 -1
  65. package/build/cjs/usb-device-wrapper.js +33 -8
  66. package/build/cjs/usb-device-wrapper.js.map +1 -1
  67. package/build/cjs/usb-partial-flashing.d.ts +1 -3
  68. package/build/cjs/usb-partial-flashing.js +4 -3
  69. package/build/cjs/usb-partial-flashing.js.map +1 -1
  70. package/build/cjs/usb-radio-bridge.js +1 -2
  71. package/build/cjs/usb-radio-bridge.js.map +1 -1
  72. package/build/cjs/usb.d.ts +4 -2
  73. package/build/cjs/usb.js +31 -16
  74. package/build/cjs/usb.js.map +1 -1
  75. package/build/esm/accelerometer-service.d.ts +5 -5
  76. package/build/esm/accelerometer-service.js +42 -43
  77. package/build/esm/accelerometer-service.js.map +1 -1
  78. package/build/esm/async-util.d.ts +9 -0
  79. package/build/esm/async-util.js +22 -6
  80. package/build/esm/async-util.js.map +1 -1
  81. package/build/esm/bluetooth-device-wrapper.d.ts +61 -27
  82. package/build/esm/bluetooth-device-wrapper.js +284 -265
  83. package/build/esm/bluetooth-device-wrapper.js.map +1 -1
  84. package/build/esm/bluetooth-profile.d.ts +43 -35
  85. package/build/esm/bluetooth-profile.js +35 -29
  86. package/build/esm/bluetooth-profile.js.map +1 -1
  87. package/build/esm/bluetooth.d.ts +10 -6
  88. package/build/esm/bluetooth.js +263 -103
  89. package/build/esm/bluetooth.js.map +1 -1
  90. package/build/esm/button-service.d.ts +5 -5
  91. package/build/esm/button-service.js +32 -46
  92. package/build/esm/button-service.js.map +1 -1
  93. package/build/esm/device-information-service.d.ts +6 -0
  94. package/build/esm/device-information-service.js +30 -0
  95. package/build/esm/device-information-service.js.map +1 -0
  96. package/build/esm/device.d.ts +65 -8
  97. package/build/esm/device.js +15 -1
  98. package/build/esm/device.js.map +1 -1
  99. package/build/esm/dfu-service.d.ts +9 -0
  100. package/build/esm/dfu-service.js +22 -0
  101. package/build/esm/dfu-service.js.map +1 -0
  102. package/build/esm/flashing/flashing-full.d.ts +14 -0
  103. package/build/esm/flashing/flashing-full.js +84 -0
  104. package/build/esm/flashing/flashing-full.js.map +1 -0
  105. package/build/esm/flashing/flashing-makecode.d.ts +6 -0
  106. package/build/esm/flashing/flashing-makecode.js +44 -0
  107. package/build/esm/flashing/flashing-makecode.js.map +1 -0
  108. package/build/esm/flashing/flashing-partial.d.ts +9 -0
  109. package/build/esm/flashing/flashing-partial.js +95 -0
  110. package/build/esm/flashing/flashing-partial.js.map +1 -0
  111. package/build/esm/flashing/flashing-v1.d.ts +11 -0
  112. package/build/esm/flashing/flashing-v1.js +20 -0
  113. package/build/esm/flashing/flashing-v1.js.map +1 -0
  114. package/build/esm/flashing/nordic-dfu.d.ts +3 -0
  115. package/build/esm/flashing/nordic-dfu.js +211 -0
  116. package/build/esm/flashing/nordic-dfu.js.map +1 -0
  117. package/build/esm/flashing/zip.d.ts +12 -0
  118. package/build/esm/flashing/zip.js +174 -0
  119. package/build/esm/flashing/zip.js.map +1 -0
  120. package/build/esm/index.d.ts +3 -3
  121. package/build/esm/index.js +2 -2
  122. package/build/esm/index.js.map +1 -1
  123. package/build/esm/led-service.d.ts +5 -7
  124. package/build/esm/led-service.js +13 -44
  125. package/build/esm/led-service.js.map +1 -1
  126. package/build/esm/logging.d.ts +1 -1
  127. package/build/esm/logging.js +1 -1
  128. package/build/esm/logging.js.map +1 -1
  129. package/build/esm/magnetometer-service.d.ts +5 -9
  130. package/build/esm/magnetometer-service.js +31 -66
  131. package/build/esm/magnetometer-service.js.map +1 -1
  132. package/build/esm/partial-flashing-service.d.ts +45 -0
  133. package/build/esm/partial-flashing-service.js +106 -0
  134. package/build/esm/partial-flashing-service.js.map +1 -0
  135. package/build/esm/uart-service.d.ts +4 -5
  136. package/build/esm/uart-service.js +19 -40
  137. package/build/esm/uart-service.js.map +1 -1
  138. package/build/esm/usb-device-wrapper.js +33 -8
  139. package/build/esm/usb-device-wrapper.js.map +1 -1
  140. package/build/esm/usb-partial-flashing.d.ts +1 -3
  141. package/build/esm/usb-partial-flashing.js +4 -3
  142. package/build/esm/usb-partial-flashing.js.map +1 -1
  143. package/build/esm/usb-radio-bridge.js +2 -3
  144. package/build/esm/usb-radio-bridge.js.map +1 -1
  145. package/build/esm/usb.d.ts +4 -2
  146. package/build/esm/usb.js +33 -18
  147. package/build/esm/usb.js.map +1 -1
  148. package/package.json +5 -1
@@ -1 +1 @@
1
- {"version":3,"file":"logging.js","sourceRoot":"","sources":["../../lib/logging.ts"],"names":[],"mappings":";;;AAkBA,MAAa,WAAW;IACtB,KAAK,CAAC,MAAoB;QACxB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACtB,CAAC;IACD,KAAK,CAAC,EAAU,EAAE,EAAW;QAC3B,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IACxB,CAAC;IACD,GAAG,CAAC,EAAO;QACT,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;CACF;AAVD,kCAUC"}
1
+ {"version":3,"file":"logging.js","sourceRoot":"","sources":["../../lib/logging.ts"],"names":[],"mappings":";;;AAkBA,MAAa,cAAc;IACzB,KAAK,CAAC,MAAoB;QACxB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACtB,CAAC;IACD,KAAK,CAAC,EAAU,EAAE,EAAW;QAC3B,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IACxB,CAAC;IACD,GAAG,CAAC,EAAO;QACT,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;CACF;AAVD,wCAUC"}
@@ -1,15 +1,12 @@
1
- import { MagnetometerData } from "./magnetometer.js";
2
1
  import { Service } from "./bluetooth-device-wrapper.js";
2
+ import { MagnetometerData } from "./magnetometer.js";
3
3
  import { TypedServiceEvent, TypedServiceEventDispatcher } from "./service-events.js";
4
4
  export declare class MagnetometerService implements Service {
5
- private magnetometerDataCharacteristic;
6
- private magnetometerPeriodCharacteristic;
7
- private magnetometerBearingCharacteristic;
8
- private magnetometerCalibrationCharacteristic;
5
+ private deviceId;
9
6
  private dispatchTypedEvent;
10
- private queueGattOperation;
11
- constructor(magnetometerDataCharacteristic: BluetoothRemoteGATTCharacteristic, magnetometerPeriodCharacteristic: BluetoothRemoteGATTCharacteristic, magnetometerBearingCharacteristic: BluetoothRemoteGATTCharacteristic, magnetometerCalibrationCharacteristic: BluetoothRemoteGATTCharacteristic, dispatchTypedEvent: TypedServiceEventDispatcher, queueGattOperation: <R>(action: () => Promise<R>) => Promise<R>);
12
- static createService(gattServer: BluetoothRemoteGATTServer, dispatcher: TypedServiceEventDispatcher, queueGattOperation: <R>(action: () => Promise<R>) => Promise<R>, listenerInit: boolean): Promise<MagnetometerService | undefined>;
7
+ uuid: string;
8
+ constructor(deviceId: string, dispatchTypedEvent: TypedServiceEventDispatcher);
9
+ getRelevantEvents(): TypedServiceEvent[];
13
10
  private dataViewToData;
14
11
  getData(): Promise<MagnetometerData>;
15
12
  getPeriod(): Promise<number>;
@@ -18,5 +15,4 @@ export declare class MagnetometerService implements Service {
18
15
  triggerCalibration(): Promise<void>;
19
16
  startNotifications(type: TypedServiceEvent): Promise<void>;
20
17
  stopNotifications(type: TypedServiceEvent): Promise<void>;
21
- private characteristicForEvent;
22
18
  }
@@ -1,34 +1,17 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.MagnetometerService = void 0;
4
- const magnetometer_js_1 = require("./magnetometer.js");
4
+ const bluetooth_le_1 = require("@capacitor-community/bluetooth-le");
5
5
  const bluetooth_profile_js_1 = require("./bluetooth-profile.js");
6
+ const magnetometer_js_1 = require("./magnetometer.js");
6
7
  const device_js_1 = require("./device.js");
7
8
  class MagnetometerService {
8
- constructor(magnetometerDataCharacteristic, magnetometerPeriodCharacteristic, magnetometerBearingCharacteristic, magnetometerCalibrationCharacteristic, dispatchTypedEvent, queueGattOperation) {
9
- Object.defineProperty(this, "magnetometerDataCharacteristic", {
9
+ constructor(deviceId, dispatchTypedEvent) {
10
+ Object.defineProperty(this, "deviceId", {
10
11
  enumerable: true,
11
12
  configurable: true,
12
13
  writable: true,
13
- value: magnetometerDataCharacteristic
14
- });
15
- Object.defineProperty(this, "magnetometerPeriodCharacteristic", {
16
- enumerable: true,
17
- configurable: true,
18
- writable: true,
19
- value: magnetometerPeriodCharacteristic
20
- });
21
- Object.defineProperty(this, "magnetometerBearingCharacteristic", {
22
- enumerable: true,
23
- configurable: true,
24
- writable: true,
25
- value: magnetometerBearingCharacteristic
26
- });
27
- Object.defineProperty(this, "magnetometerCalibrationCharacteristic", {
28
- enumerable: true,
29
- configurable: true,
30
- writable: true,
31
- value: magnetometerCalibrationCharacteristic
14
+ value: deviceId
32
15
  });
33
16
  Object.defineProperty(this, "dispatchTypedEvent", {
34
17
  enumerable: true,
@@ -36,40 +19,15 @@ class MagnetometerService {
36
19
  writable: true,
37
20
  value: dispatchTypedEvent
38
21
  });
39
- Object.defineProperty(this, "queueGattOperation", {
22
+ Object.defineProperty(this, "uuid", {
40
23
  enumerable: true,
41
24
  configurable: true,
42
25
  writable: true,
43
- value: queueGattOperation
44
- });
45
- this.magnetometerDataCharacteristic.addEventListener("characteristicvaluechanged", (event) => {
46
- const target = event.target;
47
- const data = this.dataViewToData(target.value);
48
- this.dispatchTypedEvent("magnetometerdatachanged", new magnetometer_js_1.MagnetometerDataEvent(data));
26
+ value: bluetooth_profile_js_1.profile.magnetometer.id
49
27
  });
50
28
  }
51
- static async createService(gattServer, dispatcher, queueGattOperation, listenerInit) {
52
- let magnetometerService;
53
- try {
54
- magnetometerService = await gattServer.getPrimaryService(bluetooth_profile_js_1.profile.magnetometer.id);
55
- }
56
- catch (err) {
57
- if (listenerInit) {
58
- dispatcher("backgrounderror", new device_js_1.BackgroundErrorEvent(err));
59
- return;
60
- }
61
- else {
62
- throw new device_js_1.DeviceError({
63
- code: "service-missing",
64
- message: err,
65
- });
66
- }
67
- }
68
- const magnetometerDataCharacteristic = await magnetometerService.getCharacteristic(bluetooth_profile_js_1.profile.magnetometer.characteristics.data.id);
69
- const magnetometerPeriodCharacteristic = await magnetometerService.getCharacteristic(bluetooth_profile_js_1.profile.magnetometer.characteristics.period.id);
70
- const magnetometerBearingCharacteristic = await magnetometerService.getCharacteristic(bluetooth_profile_js_1.profile.magnetometer.characteristics.bearing.id);
71
- const magnetometerCalibrationCharacteristic = await magnetometerService.getCharacteristic(bluetooth_profile_js_1.profile.magnetometer.characteristics.calibration.id);
72
- return new MagnetometerService(magnetometerDataCharacteristic, magnetometerPeriodCharacteristic, magnetometerBearingCharacteristic, magnetometerCalibrationCharacteristic, dispatcher, queueGattOperation);
29
+ getRelevantEvents() {
30
+ return ["magnetometerdatachanged"];
73
31
  }
74
32
  dataViewToData(dataView) {
75
33
  return {
@@ -79,11 +37,11 @@ class MagnetometerService {
79
37
  };
80
38
  }
81
39
  async getData() {
82
- const dataView = await this.queueGattOperation(() => this.magnetometerDataCharacteristic.readValue());
40
+ const dataView = await bluetooth_le_1.BleClient.read(this.deviceId, bluetooth_profile_js_1.profile.magnetometer.id, bluetooth_profile_js_1.profile.magnetometer.characteristics.data.id);
83
41
  return this.dataViewToData(dataView);
84
42
  }
85
43
  async getPeriod() {
86
- const dataView = await this.queueGattOperation(() => this.magnetometerPeriodCharacteristic.readValue());
44
+ const dataView = await bluetooth_le_1.BleClient.read(this.deviceId, bluetooth_profile_js_1.profile.magnetometer.id, bluetooth_profile_js_1.profile.magnetometer.characteristics.period.id);
87
45
  return dataView.getUint16(0, true);
88
46
  }
89
47
  async setPeriod(value) {
@@ -97,30 +55,37 @@ class MagnetometerService {
97
55
  // https://lancaster-university.github.io/microbit-docs/ble/profile/#about-the-magnetometer-service
98
56
  const dataView = new DataView(new ArrayBuffer(2));
99
57
  dataView.setUint16(0, value, true);
100
- return this.queueGattOperation(() => this.magnetometerPeriodCharacteristic.writeValue(dataView));
58
+ await bluetooth_le_1.BleClient.write(this.deviceId, bluetooth_profile_js_1.profile.magnetometer.id, bluetooth_profile_js_1.profile.magnetometer.characteristics.period.id, dataView);
101
59
  }
102
60
  async getBearing() {
103
- const dataView = await this.queueGattOperation(() => this.magnetometerBearingCharacteristic.readValue());
61
+ const dataView = await bluetooth_le_1.BleClient.read(this.deviceId, bluetooth_profile_js_1.profile.magnetometer.id, bluetooth_profile_js_1.profile.magnetometer.characteristics.bearing.id);
104
62
  return dataView.getUint16(0, true);
105
63
  }
106
64
  async triggerCalibration() {
107
65
  const dataView = new DataView(new ArrayBuffer(1));
108
66
  dataView.setUint8(0, 1);
109
- return this.queueGattOperation(() => this.magnetometerCalibrationCharacteristic.writeValue(dataView));
67
+ await bluetooth_le_1.BleClient.write(this.deviceId, bluetooth_profile_js_1.profile.magnetometer.id, bluetooth_profile_js_1.profile.magnetometer.characteristics.calibration.id, dataView);
110
68
  }
111
69
  async startNotifications(type) {
112
- await this.characteristicForEvent(type)?.startNotifications();
70
+ if (type === "magnetometerdatachanged") {
71
+ try {
72
+ await bluetooth_le_1.BleClient.startNotifications(this.deviceId, bluetooth_profile_js_1.profile.magnetometer.id, bluetooth_profile_js_1.profile.magnetometer.characteristics.data.id, (value) => {
73
+ const data = this.dataViewToData(value);
74
+ this.dispatchTypedEvent("magnetometerdatachanged", new magnetometer_js_1.MagnetometerDataEvent(data));
75
+ });
76
+ }
77
+ catch (e) {
78
+ this.dispatchTypedEvent("backgrounderror", new device_js_1.BackgroundErrorEvent("Failed to start notifications", e));
79
+ }
80
+ }
113
81
  }
114
82
  async stopNotifications(type) {
115
- await this.characteristicForEvent(type)?.stopNotifications();
116
- }
117
- characteristicForEvent(type) {
118
- switch (type) {
119
- case "magnetometerdatachanged": {
120
- return this.magnetometerDataCharacteristic;
83
+ if (type === "magnetometerdatachanged") {
84
+ try {
85
+ await bluetooth_le_1.BleClient.stopNotifications(this.deviceId, bluetooth_profile_js_1.profile.magnetometer.id, bluetooth_profile_js_1.profile.magnetometer.characteristics.data.id);
121
86
  }
122
- default: {
123
- return undefined;
87
+ catch (e) {
88
+ this.dispatchTypedEvent("backgrounderror", new device_js_1.BackgroundErrorEvent("Failed to stop notifications", e));
124
89
  }
125
90
  }
126
91
  }
@@ -1 +1 @@
1
- {"version":3,"file":"magnetometer-service.js","sourceRoot":"","sources":["../../lib/magnetometer-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"magnetometer-service.js","sourceRoot":"","sources":["../../lib/magnetometer-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import { TimeoutOptions } from "@capacitor-community/bluetooth-le";
2
+ import MemoryMap from "nrf-intel-hex";
3
+ import { BluetoothDeviceWrapper } from "./bluetooth-device-wrapper";
4
+ export declare const enum MicroBitMode {
5
+ Pairing = 0,
6
+ Application = 1
7
+ }
8
+ export declare const enum RegionId {
9
+ SoftDevice = 0,
10
+ Dal = 1,
11
+ MakeCode = 2
12
+ }
13
+ export interface RegionInfo {
14
+ start: number;
15
+ end: number;
16
+ hash: string;
17
+ }
18
+ export declare const enum PacketState {
19
+ Retransmit = 170,
20
+ Success = 255
21
+ }
22
+ /**
23
+ * Doesn't actually implement service as we don't expose this other than via
24
+ * the flash method.
25
+ */
26
+ export declare class PartialFlashingService {
27
+ private connection;
28
+ constructor(connection: BluetoothDeviceWrapper);
29
+ startNotifications(options?: TimeoutOptions): Promise<void>;
30
+ stopNotifications(): Promise<void>;
31
+ resetToMode(mode: MicroBitMode): Promise<void>;
32
+ getRegionInfo(region: RegionId): Promise<RegionInfo | null>;
33
+ /**
34
+ * Writes a flash chunk.
35
+ * Use writeFlashForNotification for every 4th chunk.
36
+ */
37
+ writeFlash(source: MemoryMap, batchAddress: number, dataOffset: number, packetNumber: number, packetInBatch: number): Promise<void>;
38
+ /**
39
+ * Write a chunk and wait for a success/retransmit response.
40
+ * The micro:bit notifies on every 4th chunk.
41
+ */
42
+ writeFlashForNotification(source: MemoryMap, batchAddress: number, dataOffset: number, packetNumber: number, packetInBatch: number): Promise<PacketState>;
43
+ writeEndOfFlashPacket(): Promise<void>;
44
+ private createWriteDataCommand;
45
+ }
@@ -0,0 +1,110 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PartialFlashingService = exports.PacketState = exports.RegionId = exports.MicroBitMode = void 0;
4
+ /* eslint-disable @typescript-eslint/no-unsafe-enum-comparison */
5
+ const bluetooth_le_1 = require("@capacitor-community/bluetooth-le");
6
+ const bluetooth_profile_1 = require("./bluetooth-profile");
7
+ const MICROBIT_RESET_COMMAND = 0xff;
8
+ const REGION_INFO_COMMAND = 0x0;
9
+ const FLASH_COMMAND = 0x1;
10
+ var MicroBitMode;
11
+ (function (MicroBitMode) {
12
+ MicroBitMode[MicroBitMode["Pairing"] = 0] = "Pairing";
13
+ MicroBitMode[MicroBitMode["Application"] = 1] = "Application";
14
+ })(MicroBitMode || (exports.MicroBitMode = MicroBitMode = {}));
15
+ var RegionId;
16
+ (function (RegionId) {
17
+ RegionId[RegionId["SoftDevice"] = 0] = "SoftDevice";
18
+ RegionId[RegionId["Dal"] = 1] = "Dal";
19
+ RegionId[RegionId["MakeCode"] = 2] = "MakeCode";
20
+ })(RegionId || (exports.RegionId = RegionId = {}));
21
+ var PacketState;
22
+ (function (PacketState) {
23
+ PacketState[PacketState["Retransmit"] = 170] = "Retransmit";
24
+ PacketState[PacketState["Success"] = 255] = "Success";
25
+ })(PacketState || (exports.PacketState = PacketState = {}));
26
+ /**
27
+ * Doesn't actually implement service as we don't expose this other than via
28
+ * the flash method.
29
+ */
30
+ class PartialFlashingService {
31
+ constructor(connection) {
32
+ Object.defineProperty(this, "connection", {
33
+ enumerable: true,
34
+ configurable: true,
35
+ writable: true,
36
+ value: connection
37
+ });
38
+ }
39
+ async startNotifications(options) {
40
+ await this.connection.startInternalNotifications(bluetooth_profile_1.profile.partialFlashing.id, bluetooth_profile_1.profile.partialFlashing.characteristics.partialFlash.id, options);
41
+ }
42
+ async stopNotifications() {
43
+ await this.connection.stopInternalNotifications(bluetooth_profile_1.profile.partialFlashing.id, bluetooth_profile_1.profile.partialFlashing.characteristics.partialFlash.id);
44
+ }
45
+ async resetToMode(mode) {
46
+ await bluetooth_le_1.BleClient.writeWithoutResponse(this.connection.device.deviceId, bluetooth_profile_1.profile.partialFlashing.id, bluetooth_profile_1.profile.partialFlashing.characteristics.partialFlash.id, (0, bluetooth_le_1.numbersToDataView)([MICROBIT_RESET_COMMAND, mode]));
47
+ }
48
+ async getRegionInfo(region) {
49
+ return parseRegionResponse(await this.connection.writeForNotification(bluetooth_profile_1.profile.partialFlashing.id, bluetooth_profile_1.profile.partialFlashing.characteristics.partialFlash.id, (0, bluetooth_le_1.numbersToDataView)([REGION_INFO_COMMAND, region]), REGION_INFO_COMMAND));
50
+ }
51
+ /**
52
+ * Writes a flash chunk.
53
+ * Use writeFlashForNotification for every 4th chunk.
54
+ */
55
+ async writeFlash(source, batchAddress, dataOffset, packetNumber, packetInBatch) {
56
+ return await bluetooth_le_1.BleClient.writeWithoutResponse(this.connection.device.deviceId, bluetooth_profile_1.profile.partialFlashing.id, bluetooth_profile_1.profile.partialFlashing.characteristics.partialFlash.id, this.createWriteDataCommand(source, batchAddress, dataOffset, packetNumber, packetInBatch));
57
+ }
58
+ /**
59
+ * Write a chunk and wait for a success/retransmit response.
60
+ * The micro:bit notifies on every 4th chunk.
61
+ */
62
+ async writeFlashForNotification(source, batchAddress, dataOffset, packetNumber, packetInBatch) {
63
+ const result = await this.connection.writeForNotification(bluetooth_profile_1.profile.partialFlashing.id, bluetooth_profile_1.profile.partialFlashing.characteristics.partialFlash.id, this.createWriteDataCommand(source, batchAddress, dataOffset, packetNumber, packetInBatch), FLASH_COMMAND, (notificationValue) => notificationValue[1] === PacketState.Success ||
64
+ notificationValue[1] === PacketState.Retransmit);
65
+ return result[1];
66
+ }
67
+ async writeEndOfFlashPacket() {
68
+ return await bluetooth_le_1.BleClient.writeWithoutResponse(this.connection.device.deviceId, bluetooth_profile_1.profile.partialFlashing.id, bluetooth_profile_1.profile.partialFlashing.characteristics.partialFlash.id, (0, bluetooth_le_1.numbersToDataView)([0x02]));
69
+ }
70
+ createWriteDataCommand(source, batchAddress, dataOffset, packetNumber, packetInBatch) {
71
+ const data = new DataView(new ArrayBuffer(20));
72
+ data.setUint8(0, 0x01);
73
+ // Bytes 1-2: offset encoding
74
+ // Packet 0: low 16 bits of flash address
75
+ // Packet 1: high 16 bits of flash address
76
+ // Packets 2-3: offset within the 64-byte batch being written
77
+ let offsetValue;
78
+ if (packetInBatch === 0) {
79
+ offsetValue = batchAddress & 0xffff;
80
+ }
81
+ else {
82
+ // Note: for packets 2 and 3 the offset is unused.
83
+ offsetValue = (batchAddress >> 16) & 0xffff;
84
+ }
85
+ data.setUint16(1, offsetValue);
86
+ data.setUint8(3, packetNumber);
87
+ const bytes = source.slicePad(dataOffset, 16);
88
+ for (let i = 0; i < 16; ++i) {
89
+ data.setUint8(4 + i, bytes[i]);
90
+ }
91
+ return data;
92
+ }
93
+ }
94
+ exports.PartialFlashingService = PartialFlashingService;
95
+ const parseRegionResponse = (value) => {
96
+ const dataView = new DataView(value.buffer, value.byteOffset, value.byteLength);
97
+ const start = dataView.getUint32(2, false);
98
+ const end = dataView.getUint32(6, false);
99
+ if (start === 0 || start >= end) {
100
+ return null;
101
+ }
102
+ const hash = value.slice(10, 18);
103
+ return { start, end, hash: bytesToHex(hash) };
104
+ };
105
+ const bytesToHex = (bytes) => {
106
+ return Array.from(bytes)
107
+ .map((byte) => byte.toString(16).padStart(2, "0").toUpperCase())
108
+ .join("");
109
+ };
110
+ //# sourceMappingURL=partial-flashing-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"partial-flashing-service.js","sourceRoot":"","sources":["../../lib/partial-flashing-service.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,11 @@
1
1
  import { Service } from "./bluetooth-device-wrapper.js";
2
2
  import { TypedServiceEvent, TypedServiceEventDispatcher } from "./service-events.js";
3
3
  export declare class UARTService implements Service {
4
- private txCharacteristic;
5
- private rxCharacteristic;
4
+ private deviceId;
6
5
  private dispatchTypedEvent;
7
- private queueGattOperation;
8
- constructor(txCharacteristic: BluetoothRemoteGATTCharacteristic, rxCharacteristic: BluetoothRemoteGATTCharacteristic, dispatchTypedEvent: TypedServiceEventDispatcher, queueGattOperation: <R>(action: () => Promise<R>) => Promise<R>);
9
- static createService(gattServer: BluetoothRemoteGATTServer, dispatcher: TypedServiceEventDispatcher, queueGattOperation: <R>(action: () => Promise<R>) => Promise<R>, listenerInit: boolean): Promise<UARTService | undefined>;
6
+ uuid: string;
7
+ constructor(deviceId: string, dispatchTypedEvent: TypedServiceEventDispatcher);
8
+ getRelevantEvents(): TypedServiceEvent[];
10
9
  startNotifications(type: TypedServiceEvent): Promise<void>;
11
10
  stopNotifications(type: TypedServiceEvent): Promise<void>;
12
11
  writeData(value: Uint8Array): Promise<void>;
@@ -1,22 +1,17 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.UARTService = void 0;
4
+ const bluetooth_le_1 = require("@capacitor-community/bluetooth-le");
4
5
  const bluetooth_profile_js_1 = require("./bluetooth-profile.js");
5
- const device_js_1 = require("./device.js");
6
6
  const uart_js_1 = require("./uart.js");
7
+ const device_js_1 = require("./device.js");
7
8
  class UARTService {
8
- constructor(txCharacteristic, rxCharacteristic, dispatchTypedEvent, queueGattOperation) {
9
- Object.defineProperty(this, "txCharacteristic", {
10
- enumerable: true,
11
- configurable: true,
12
- writable: true,
13
- value: txCharacteristic
14
- });
15
- Object.defineProperty(this, "rxCharacteristic", {
9
+ constructor(deviceId, dispatchTypedEvent) {
10
+ Object.defineProperty(this, "deviceId", {
16
11
  enumerable: true,
17
12
  configurable: true,
18
13
  writable: true,
19
- value: rxCharacteristic
14
+ value: deviceId
20
15
  });
21
16
  Object.defineProperty(this, "dispatchTypedEvent", {
22
17
  enumerable: true,
@@ -24,52 +19,36 @@ class UARTService {
24
19
  writable: true,
25
20
  value: dispatchTypedEvent
26
21
  });
27
- Object.defineProperty(this, "queueGattOperation", {
22
+ Object.defineProperty(this, "uuid", {
28
23
  enumerable: true,
29
24
  configurable: true,
30
25
  writable: true,
31
- value: queueGattOperation
32
- });
33
- this.txCharacteristic.addEventListener("characteristicvaluechanged", (event) => {
34
- const target = event.target;
35
- const value = new Uint8Array(target.value.buffer);
36
- this.dispatchTypedEvent("uartdata", new uart_js_1.UARTDataEvent(value));
26
+ value: bluetooth_profile_js_1.profile.uart.id
37
27
  });
38
28
  }
39
- static async createService(gattServer, dispatcher, queueGattOperation, listenerInit) {
40
- let uartService;
41
- try {
42
- uartService = await gattServer.getPrimaryService(bluetooth_profile_js_1.profile.uart.id);
43
- }
44
- catch (err) {
45
- if (listenerInit) {
46
- dispatcher("backgrounderror", new device_js_1.BackgroundErrorEvent(err));
47
- return;
48
- }
49
- else {
50
- throw new device_js_1.DeviceError({
51
- code: "service-missing",
52
- message: err,
53
- });
54
- }
55
- }
56
- const rxCharacteristic = await uartService.getCharacteristic(bluetooth_profile_js_1.profile.uart.characteristics.rx.id);
57
- const txCharacteristic = await uartService.getCharacteristic(bluetooth_profile_js_1.profile.uart.characteristics.tx.id);
58
- return new UARTService(txCharacteristic, rxCharacteristic, dispatcher, queueGattOperation);
29
+ getRelevantEvents() {
30
+ return ["uartdata"];
59
31
  }
60
32
  async startNotifications(type) {
61
33
  if (type === "uartdata") {
62
- await this.txCharacteristic.startNotifications();
34
+ try {
35
+ await bluetooth_le_1.BleClient.startNotifications(this.deviceId, bluetooth_profile_js_1.profile.uart.id, bluetooth_profile_js_1.profile.uart.characteristics.tx.id, (value) => {
36
+ this.dispatchTypedEvent("uartdata", new uart_js_1.UARTDataEvent(new Uint8Array(value.buffer)));
37
+ });
38
+ }
39
+ catch (e) {
40
+ this.dispatchTypedEvent("backgrounderror", new device_js_1.BackgroundErrorEvent("Failed to start notifications", e));
41
+ }
63
42
  }
64
43
  }
65
44
  async stopNotifications(type) {
66
45
  if (type === "uartdata") {
67
- await this.txCharacteristic.stopNotifications();
46
+ await bluetooth_le_1.BleClient.stopNotifications(this.deviceId, bluetooth_profile_js_1.profile.uart.id, bluetooth_profile_js_1.profile.uart.characteristics.tx.id);
68
47
  }
69
48
  }
70
49
  async writeData(value) {
71
50
  const dataView = new DataView(value.buffer);
72
- return this.queueGattOperation(() => this.rxCharacteristic.writeValueWithoutResponse(dataView));
51
+ await bluetooth_le_1.BleClient.writeWithoutResponse(this.deviceId, bluetooth_profile_js_1.profile.uart.id, bluetooth_profile_js_1.profile.uart.characteristics.rx.id, dataView);
73
52
  }
74
53
  }
75
54
  exports.UARTService = UARTService;
@@ -1 +1 @@
1
- {"version":3,"file":"uart-service.js","sourceRoot":"","sources":["../../lib/uart-service.ts"],"names":[],"mappings":";;;AACA,iEAAiD;AACjD,2CAAgE;AAMhE,uCAA0C;AAE1C,MAAa,WAAW;IACtB,YACU,gBAAmD,EACnD,gBAAmD,EACnD,kBAA+C,EAC/C,kBAA+D;QAHvE;;;;mBAAQ,gBAAgB;WAAmC;QAC3D;;;;mBAAQ,gBAAgB;WAAmC;QAC3D;;;;mBAAQ,kBAAkB;WAA6B;QACvD;;;;mBAAQ,kBAAkB;WAA6C;QAEvE,IAAI,CAAC,gBAAgB,CAAC,gBAAgB,CACpC,4BAA4B,EAC5B,CAAC,KAAY,EAAE,EAAE;YACf,MAAM,MAAM,GAAG,KAAK,CAAC,MAAkC,CAAC;YACxD,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAClD,IAAI,CAAC,kBAAkB,CAAC,UAAU,EAAE,IAAI,uBAAa,CAAC,KAAK,CAAC,CAAC,CAAC;QAChE,CAAC,CACF,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,aAAa,CACxB,UAAqC,EACrC,UAAuC,EACvC,kBAA+D,EAC/D,YAAqB;QAErB,IAAI,WAAuC,CAAC;QAC5C,IAAI,CAAC;YACH,WAAW,GAAG,MAAM,UAAU,CAAC,iBAAiB,CAAC,8BAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACpE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,YAAY,EAAE,CAAC;gBACjB,UAAU,CAAC,iBAAiB,EAAE,IAAI,gCAAoB,CAAC,GAAa,CAAC,CAAC,CAAC;gBACvE,OAAO;YACT,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,uBAAW,CAAC;oBACpB,IAAI,EAAE,iBAAiB;oBACvB,OAAO,EAAE,GAAa;iBACvB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,MAAM,gBAAgB,GAAG,MAAM,WAAW,CAAC,iBAAiB,CAC1D,8BAAO,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC,EAAE,CACnC,CAAC;QACF,MAAM,gBAAgB,GAAG,MAAM,WAAW,CAAC,iBAAiB,CAC1D,8BAAO,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC,EAAE,CACnC,CAAC;QACF,OAAO,IAAI,WAAW,CACpB,gBAAgB,EAChB,gBAAgB,EAChB,UAAU,EACV,kBAAkB,CACnB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,IAAuB;QAC9C,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;YACxB,MAAM,IAAI,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,CAAC;QACnD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,IAAuB;QAC7C,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;YACxB,MAAM,IAAI,CAAC,gBAAgB,CAAC,iBAAiB,EAAE,CAAC;QAClD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,KAAiB;QAC/B,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC5C,OAAO,IAAI,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAClC,IAAI,CAAC,gBAAgB,CAAC,yBAAyB,CAAC,QAAQ,CAAC,CAC1D,CAAC;IACJ,CAAC;CACF;AArED,kCAqEC"}
1
+ {"version":3,"file":"uart-service.js","sourceRoot":"","sources":["../../lib/uart-service.ts"],"names":[],"mappings":";;;AAAA,oEAA8D;AAE9D,iEAAiD;AAKjD,uCAA0C;AAC1C,2CAAmD;AAEnD,MAAa,WAAW;IAGtB,YACU,QAAgB,EAChB,kBAA+C;QADvD;;;;mBAAQ,QAAQ;WAAQ;QACxB;;;;mBAAQ,kBAAkB;WAA6B;QAJzD;;;;mBAAO,8BAAO,CAAC,IAAI,CAAC,EAAE;WAAC;IAKpB,CAAC;IAEJ,iBAAiB;QACf,OAAO,CAAC,UAAU,CAAC,CAAC;IACtB,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,IAAuB;QAC9C,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;YACxB,IAAI,CAAC;gBACH,MAAM,wBAAS,CAAC,kBAAkB,CAChC,IAAI,CAAC,QAAQ,EACb,8BAAO,CAAC,IAAI,CAAC,EAAE,EACf,8BAAO,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC,EAAE,EAClC,CAAC,KAAe,EAAE,EAAE;oBAClB,IAAI,CAAC,kBAAkB,CACrB,UAAU,EACV,IAAI,uBAAa,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAChD,CAAC;gBACJ,CAAC,CACF,CAAC;YACJ,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,IAAI,CAAC,kBAAkB,CACrB,iBAAiB,EACjB,IAAI,gCAAoB,CAAC,+BAA+B,EAAE,CAAC,CAAC,CAC7D,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,IAAuB;QAC7C,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;YACxB,MAAM,wBAAS,CAAC,iBAAiB,CAC/B,IAAI,CAAC,QAAQ,EACb,8BAAO,CAAC,IAAI,CAAC,EAAE,EACf,8BAAO,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC,EAAE,CACnC,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,KAAiB;QAC/B,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,wBAAS,CAAC,oBAAoB,CAClC,IAAI,CAAC,QAAQ,EACb,8BAAO,CAAC,IAAI,CAAC,EAAE,EACf,8BAAO,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC,EAAE,EAClC,QAAQ,CACT,CAAC;IACJ,CAAC;CACF;AAtDD,kCAsDC"}
@@ -34,6 +34,7 @@ const { CortexM: CortexMValue, DAPLink: DAPLinkValue, WebUSB: WebUSBValue, } = d
34
34
  const constants_js_1 = require("./constants.js");
35
35
  const usb_partial_flashing_utils_js_1 = require("./usb-partial-flashing-utils.js");
36
36
  const board_serial_info_js_1 = require("./board-serial-info.js");
37
+ const device_js_1 = require("./device.js");
37
38
  class DAPWrapper {
38
39
  constructor(device, logging) {
39
40
  Object.defineProperty(this, "device", {
@@ -105,7 +106,10 @@ class DAPWrapper {
105
106
  */
106
107
  get pageSize() {
107
108
  if (this._pageSize === undefined) {
108
- throw new Error("pageSize not defined until connected");
109
+ throw new device_js_1.DeviceError({
110
+ code: "reconnect-microbit",
111
+ message: "pageSize not defined until connected",
112
+ });
109
113
  }
110
114
  return this._pageSize;
111
115
  }
@@ -114,7 +118,10 @@ class DAPWrapper {
114
118
  */
115
119
  get numPages() {
116
120
  if (this._numPages === undefined) {
117
- throw new Error("numPages not defined until connected");
121
+ throw new device_js_1.DeviceError({
122
+ code: "reconnect-microbit",
123
+ message: "numPages not defined until connected",
124
+ });
118
125
  }
119
126
  return this._numPages;
120
127
  }
@@ -221,7 +228,10 @@ class DAPWrapper {
221
228
  data.unshift(op);
222
229
  const buf = await this.send(data);
223
230
  if (buf[0] !== op) {
224
- throw new Error(`Bad response for ${op} -> ${buf[0]}`);
231
+ throw new device_js_1.DeviceError({
232
+ code: "reconnect-microbit",
233
+ message: `Bad response for ${op} -> ${buf[0]}`,
234
+ });
225
235
  }
226
236
  switch (op) {
227
237
  case constants_js_1.DapCmd.DAP_CONNECT:
@@ -231,7 +241,10 @@ class DAPWrapper {
231
241
  break;
232
242
  default:
233
243
  if (buf[1] !== 0) {
234
- throw new Error(`Bad status for ${op} -> ${buf[1]}`);
244
+ throw new device_js_1.DeviceError({
245
+ code: "reconnect-microbit",
246
+ message: `Bad status for ${op} -> ${buf[1]}`,
247
+ });
235
248
  }
236
249
  }
237
250
  return buf;
@@ -247,10 +260,16 @@ class DAPWrapper {
247
260
  // Transfer the read requests to the micro:bit and retrieve the data read.
248
261
  const buf = await this.cmdNums(constants_js_1.DapCmd.DAP_TRANSFER, sendargs);
249
262
  if (buf[1] !== cnt) {
250
- throw new Error("(many) Bad #trans " + buf[1]);
263
+ throw new device_js_1.DeviceError({
264
+ code: "reconnect-microbit",
265
+ message: "(many) Bad #trans " + buf[1],
266
+ });
251
267
  }
252
268
  else if (buf[2] !== 1) {
253
- throw new Error("(many) Bad transfer status " + buf[2]);
269
+ throw new device_js_1.DeviceError({
270
+ code: "reconnect-microbit",
271
+ message: "(many) Bad transfer status " + buf[2],
272
+ });
254
273
  }
255
274
  return buf.subarray(3, 3 + cnt * 4);
256
275
  }
@@ -266,7 +285,10 @@ class DAPWrapper {
266
285
  // Transfer the write requests to the micro:bit and retrieve the response status.
267
286
  const buf = await this.cmdNums(constants_js_1.DapCmd.DAP_TRANSFER_BLOCK, sendargs);
268
287
  if (buf[3] !== 1) {
269
- throw new Error("(many-wr) Bad transfer status " + buf[2]);
288
+ throw new device_js_1.DeviceError({
289
+ code: "reconnect-microbit",
290
+ message: "(many-wr) Bad transfer status " + buf[2],
291
+ });
270
292
  }
271
293
  }
272
294
  // Core functionality reading a block of data from micro:bit RAM at a specified address.
@@ -366,7 +388,10 @@ class DAPWrapper {
366
388
  // Recurses otherwise.
367
389
  async waitForHaltCore(halted, deadline) {
368
390
  if (new Date().getTime() > deadline) {
369
- throw new Error("timeout");
391
+ throw new device_js_1.DeviceError({
392
+ code: "timeout-error",
393
+ message: "timeout",
394
+ });
370
395
  }
371
396
  if (!halted) {
372
397
  const isHalted = await this.cortexM.isHalted();