@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,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,31 +1,14 @@
1
- import { MagnetometerDataEvent } from "./magnetometer.js";
1
+ import { BleClient } from "@capacitor-community/bluetooth-le";
2
2
  import { profile } from "./bluetooth-profile.js";
3
- import { BackgroundErrorEvent, DeviceError } from "./device.js";
3
+ import { MagnetometerDataEvent } from "./magnetometer.js";
4
+ import { BackgroundErrorEvent } from "./device.js";
4
5
  export class MagnetometerService {
5
- constructor(magnetometerDataCharacteristic, magnetometerPeriodCharacteristic, magnetometerBearingCharacteristic, magnetometerCalibrationCharacteristic, dispatchTypedEvent, queueGattOperation) {
6
- Object.defineProperty(this, "magnetometerDataCharacteristic", {
6
+ constructor(deviceId, dispatchTypedEvent) {
7
+ Object.defineProperty(this, "deviceId", {
7
8
  enumerable: true,
8
9
  configurable: true,
9
10
  writable: true,
10
- value: magnetometerDataCharacteristic
11
- });
12
- Object.defineProperty(this, "magnetometerPeriodCharacteristic", {
13
- enumerable: true,
14
- configurable: true,
15
- writable: true,
16
- value: magnetometerPeriodCharacteristic
17
- });
18
- Object.defineProperty(this, "magnetometerBearingCharacteristic", {
19
- enumerable: true,
20
- configurable: true,
21
- writable: true,
22
- value: magnetometerBearingCharacteristic
23
- });
24
- Object.defineProperty(this, "magnetometerCalibrationCharacteristic", {
25
- enumerable: true,
26
- configurable: true,
27
- writable: true,
28
- value: magnetometerCalibrationCharacteristic
11
+ value: deviceId
29
12
  });
30
13
  Object.defineProperty(this, "dispatchTypedEvent", {
31
14
  enumerable: true,
@@ -33,40 +16,15 @@ export class MagnetometerService {
33
16
  writable: true,
34
17
  value: dispatchTypedEvent
35
18
  });
36
- Object.defineProperty(this, "queueGattOperation", {
19
+ Object.defineProperty(this, "uuid", {
37
20
  enumerable: true,
38
21
  configurable: true,
39
22
  writable: true,
40
- value: queueGattOperation
41
- });
42
- this.magnetometerDataCharacteristic.addEventListener("characteristicvaluechanged", (event) => {
43
- const target = event.target;
44
- const data = this.dataViewToData(target.value);
45
- this.dispatchTypedEvent("magnetometerdatachanged", new MagnetometerDataEvent(data));
23
+ value: profile.magnetometer.id
46
24
  });
47
25
  }
48
- static async createService(gattServer, dispatcher, queueGattOperation, listenerInit) {
49
- let magnetometerService;
50
- try {
51
- magnetometerService = await gattServer.getPrimaryService(profile.magnetometer.id);
52
- }
53
- catch (err) {
54
- if (listenerInit) {
55
- dispatcher("backgrounderror", new BackgroundErrorEvent(err));
56
- return;
57
- }
58
- else {
59
- throw new DeviceError({
60
- code: "service-missing",
61
- message: err,
62
- });
63
- }
64
- }
65
- const magnetometerDataCharacteristic = await magnetometerService.getCharacteristic(profile.magnetometer.characteristics.data.id);
66
- const magnetometerPeriodCharacteristic = await magnetometerService.getCharacteristic(profile.magnetometer.characteristics.period.id);
67
- const magnetometerBearingCharacteristic = await magnetometerService.getCharacteristic(profile.magnetometer.characteristics.bearing.id);
68
- const magnetometerCalibrationCharacteristic = await magnetometerService.getCharacteristic(profile.magnetometer.characteristics.calibration.id);
69
- return new MagnetometerService(magnetometerDataCharacteristic, magnetometerPeriodCharacteristic, magnetometerBearingCharacteristic, magnetometerCalibrationCharacteristic, dispatcher, queueGattOperation);
26
+ getRelevantEvents() {
27
+ return ["magnetometerdatachanged"];
70
28
  }
71
29
  dataViewToData(dataView) {
72
30
  return {
@@ -76,11 +34,11 @@ export class MagnetometerService {
76
34
  };
77
35
  }
78
36
  async getData() {
79
- const dataView = await this.queueGattOperation(() => this.magnetometerDataCharacteristic.readValue());
37
+ const dataView = await BleClient.read(this.deviceId, profile.magnetometer.id, profile.magnetometer.characteristics.data.id);
80
38
  return this.dataViewToData(dataView);
81
39
  }
82
40
  async getPeriod() {
83
- const dataView = await this.queueGattOperation(() => this.magnetometerPeriodCharacteristic.readValue());
41
+ const dataView = await BleClient.read(this.deviceId, profile.magnetometer.id, profile.magnetometer.characteristics.period.id);
84
42
  return dataView.getUint16(0, true);
85
43
  }
86
44
  async setPeriod(value) {
@@ -94,30 +52,37 @@ export class MagnetometerService {
94
52
  // https://lancaster-university.github.io/microbit-docs/ble/profile/#about-the-magnetometer-service
95
53
  const dataView = new DataView(new ArrayBuffer(2));
96
54
  dataView.setUint16(0, value, true);
97
- return this.queueGattOperation(() => this.magnetometerPeriodCharacteristic.writeValue(dataView));
55
+ await BleClient.write(this.deviceId, profile.magnetometer.id, profile.magnetometer.characteristics.period.id, dataView);
98
56
  }
99
57
  async getBearing() {
100
- const dataView = await this.queueGattOperation(() => this.magnetometerBearingCharacteristic.readValue());
58
+ const dataView = await BleClient.read(this.deviceId, profile.magnetometer.id, profile.magnetometer.characteristics.bearing.id);
101
59
  return dataView.getUint16(0, true);
102
60
  }
103
61
  async triggerCalibration() {
104
62
  const dataView = new DataView(new ArrayBuffer(1));
105
63
  dataView.setUint8(0, 1);
106
- return this.queueGattOperation(() => this.magnetometerCalibrationCharacteristic.writeValue(dataView));
64
+ await BleClient.write(this.deviceId, profile.magnetometer.id, profile.magnetometer.characteristics.calibration.id, dataView);
107
65
  }
108
66
  async startNotifications(type) {
109
- await this.characteristicForEvent(type)?.startNotifications();
67
+ if (type === "magnetometerdatachanged") {
68
+ try {
69
+ await BleClient.startNotifications(this.deviceId, profile.magnetometer.id, profile.magnetometer.characteristics.data.id, (value) => {
70
+ const data = this.dataViewToData(value);
71
+ this.dispatchTypedEvent("magnetometerdatachanged", new MagnetometerDataEvent(data));
72
+ });
73
+ }
74
+ catch (e) {
75
+ this.dispatchTypedEvent("backgrounderror", new BackgroundErrorEvent("Failed to start notifications", e));
76
+ }
77
+ }
110
78
  }
111
79
  async stopNotifications(type) {
112
- await this.characteristicForEvent(type)?.stopNotifications();
113
- }
114
- characteristicForEvent(type) {
115
- switch (type) {
116
- case "magnetometerdatachanged": {
117
- return this.magnetometerDataCharacteristic;
80
+ if (type === "magnetometerdatachanged") {
81
+ try {
82
+ await BleClient.stopNotifications(this.deviceId, profile.magnetometer.id, profile.magnetometer.characteristics.data.id);
118
83
  }
119
- default: {
120
- return undefined;
84
+ catch (e) {
85
+ this.dispatchTypedEvent("backgrounderror", new BackgroundErrorEvent("Failed to stop notifications", e));
121
86
  }
122
87
  }
123
88
  }
@@ -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,106 @@
1
+ /* eslint-disable @typescript-eslint/no-unsafe-enum-comparison */
2
+ import { BleClient, numbersToDataView, } from "@capacitor-community/bluetooth-le";
3
+ import { profile } from "./bluetooth-profile";
4
+ const MICROBIT_RESET_COMMAND = 0xff;
5
+ const REGION_INFO_COMMAND = 0x0;
6
+ const FLASH_COMMAND = 0x1;
7
+ export var MicroBitMode;
8
+ (function (MicroBitMode) {
9
+ MicroBitMode[MicroBitMode["Pairing"] = 0] = "Pairing";
10
+ MicroBitMode[MicroBitMode["Application"] = 1] = "Application";
11
+ })(MicroBitMode || (MicroBitMode = {}));
12
+ export var RegionId;
13
+ (function (RegionId) {
14
+ RegionId[RegionId["SoftDevice"] = 0] = "SoftDevice";
15
+ RegionId[RegionId["Dal"] = 1] = "Dal";
16
+ RegionId[RegionId["MakeCode"] = 2] = "MakeCode";
17
+ })(RegionId || (RegionId = {}));
18
+ export var PacketState;
19
+ (function (PacketState) {
20
+ PacketState[PacketState["Retransmit"] = 170] = "Retransmit";
21
+ PacketState[PacketState["Success"] = 255] = "Success";
22
+ })(PacketState || (PacketState = {}));
23
+ /**
24
+ * Doesn't actually implement service as we don't expose this other than via
25
+ * the flash method.
26
+ */
27
+ export class PartialFlashingService {
28
+ constructor(connection) {
29
+ Object.defineProperty(this, "connection", {
30
+ enumerable: true,
31
+ configurable: true,
32
+ writable: true,
33
+ value: connection
34
+ });
35
+ }
36
+ async startNotifications(options) {
37
+ await this.connection.startInternalNotifications(profile.partialFlashing.id, profile.partialFlashing.characteristics.partialFlash.id, options);
38
+ }
39
+ async stopNotifications() {
40
+ await this.connection.stopInternalNotifications(profile.partialFlashing.id, profile.partialFlashing.characteristics.partialFlash.id);
41
+ }
42
+ async resetToMode(mode) {
43
+ await BleClient.writeWithoutResponse(this.connection.device.deviceId, profile.partialFlashing.id, profile.partialFlashing.characteristics.partialFlash.id, numbersToDataView([MICROBIT_RESET_COMMAND, mode]));
44
+ }
45
+ async getRegionInfo(region) {
46
+ return parseRegionResponse(await this.connection.writeForNotification(profile.partialFlashing.id, profile.partialFlashing.characteristics.partialFlash.id, numbersToDataView([REGION_INFO_COMMAND, region]), REGION_INFO_COMMAND));
47
+ }
48
+ /**
49
+ * Writes a flash chunk.
50
+ * Use writeFlashForNotification for every 4th chunk.
51
+ */
52
+ async writeFlash(source, batchAddress, dataOffset, packetNumber, packetInBatch) {
53
+ return await BleClient.writeWithoutResponse(this.connection.device.deviceId, profile.partialFlashing.id, profile.partialFlashing.characteristics.partialFlash.id, this.createWriteDataCommand(source, batchAddress, dataOffset, packetNumber, packetInBatch));
54
+ }
55
+ /**
56
+ * Write a chunk and wait for a success/retransmit response.
57
+ * The micro:bit notifies on every 4th chunk.
58
+ */
59
+ async writeFlashForNotification(source, batchAddress, dataOffset, packetNumber, packetInBatch) {
60
+ const result = await this.connection.writeForNotification(profile.partialFlashing.id, profile.partialFlashing.characteristics.partialFlash.id, this.createWriteDataCommand(source, batchAddress, dataOffset, packetNumber, packetInBatch), FLASH_COMMAND, (notificationValue) => notificationValue[1] === PacketState.Success ||
61
+ notificationValue[1] === PacketState.Retransmit);
62
+ return result[1];
63
+ }
64
+ async writeEndOfFlashPacket() {
65
+ return await BleClient.writeWithoutResponse(this.connection.device.deviceId, profile.partialFlashing.id, profile.partialFlashing.characteristics.partialFlash.id, numbersToDataView([0x02]));
66
+ }
67
+ createWriteDataCommand(source, batchAddress, dataOffset, packetNumber, packetInBatch) {
68
+ const data = new DataView(new ArrayBuffer(20));
69
+ data.setUint8(0, 0x01);
70
+ // Bytes 1-2: offset encoding
71
+ // Packet 0: low 16 bits of flash address
72
+ // Packet 1: high 16 bits of flash address
73
+ // Packets 2-3: offset within the 64-byte batch being written
74
+ let offsetValue;
75
+ if (packetInBatch === 0) {
76
+ offsetValue = batchAddress & 0xffff;
77
+ }
78
+ else {
79
+ // Note: for packets 2 and 3 the offset is unused.
80
+ offsetValue = (batchAddress >> 16) & 0xffff;
81
+ }
82
+ data.setUint16(1, offsetValue);
83
+ data.setUint8(3, packetNumber);
84
+ const bytes = source.slicePad(dataOffset, 16);
85
+ for (let i = 0; i < 16; ++i) {
86
+ data.setUint8(4 + i, bytes[i]);
87
+ }
88
+ return data;
89
+ }
90
+ }
91
+ const parseRegionResponse = (value) => {
92
+ const dataView = new DataView(value.buffer, value.byteOffset, value.byteLength);
93
+ const start = dataView.getUint32(2, false);
94
+ const end = dataView.getUint32(6, false);
95
+ if (start === 0 || start >= end) {
96
+ return null;
97
+ }
98
+ const hash = value.slice(10, 18);
99
+ return { start, end, hash: bytesToHex(hash) };
100
+ };
101
+ const bytesToHex = (bytes) => {
102
+ return Array.from(bytes)
103
+ .map((byte) => byte.toString(16).padStart(2, "0").toUpperCase())
104
+ .join("");
105
+ };
106
+ //# 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,19 +1,14 @@
1
+ import { BleClient } from "@capacitor-community/bluetooth-le";
1
2
  import { profile } from "./bluetooth-profile.js";
2
- import { BackgroundErrorEvent, DeviceError } from "./device.js";
3
3
  import { UARTDataEvent } from "./uart.js";
4
+ import { BackgroundErrorEvent } from "./device.js";
4
5
  export class UARTService {
5
- constructor(txCharacteristic, rxCharacteristic, dispatchTypedEvent, queueGattOperation) {
6
- Object.defineProperty(this, "txCharacteristic", {
6
+ constructor(deviceId, dispatchTypedEvent) {
7
+ Object.defineProperty(this, "deviceId", {
7
8
  enumerable: true,
8
9
  configurable: true,
9
10
  writable: true,
10
- value: txCharacteristic
11
- });
12
- Object.defineProperty(this, "rxCharacteristic", {
13
- enumerable: true,
14
- configurable: true,
15
- writable: true,
16
- value: rxCharacteristic
11
+ value: deviceId
17
12
  });
18
13
  Object.defineProperty(this, "dispatchTypedEvent", {
19
14
  enumerable: true,
@@ -21,52 +16,36 @@ export class UARTService {
21
16
  writable: true,
22
17
  value: dispatchTypedEvent
23
18
  });
24
- Object.defineProperty(this, "queueGattOperation", {
19
+ Object.defineProperty(this, "uuid", {
25
20
  enumerable: true,
26
21
  configurable: true,
27
22
  writable: true,
28
- value: queueGattOperation
29
- });
30
- this.txCharacteristic.addEventListener("characteristicvaluechanged", (event) => {
31
- const target = event.target;
32
- const value = new Uint8Array(target.value.buffer);
33
- this.dispatchTypedEvent("uartdata", new UARTDataEvent(value));
23
+ value: profile.uart.id
34
24
  });
35
25
  }
36
- static async createService(gattServer, dispatcher, queueGattOperation, listenerInit) {
37
- let uartService;
38
- try {
39
- uartService = await gattServer.getPrimaryService(profile.uart.id);
40
- }
41
- catch (err) {
42
- if (listenerInit) {
43
- dispatcher("backgrounderror", new BackgroundErrorEvent(err));
44
- return;
45
- }
46
- else {
47
- throw new DeviceError({
48
- code: "service-missing",
49
- message: err,
50
- });
51
- }
52
- }
53
- const rxCharacteristic = await uartService.getCharacteristic(profile.uart.characteristics.rx.id);
54
- const txCharacteristic = await uartService.getCharacteristic(profile.uart.characteristics.tx.id);
55
- return new UARTService(txCharacteristic, rxCharacteristic, dispatcher, queueGattOperation);
26
+ getRelevantEvents() {
27
+ return ["uartdata"];
56
28
  }
57
29
  async startNotifications(type) {
58
30
  if (type === "uartdata") {
59
- await this.txCharacteristic.startNotifications();
31
+ try {
32
+ await BleClient.startNotifications(this.deviceId, profile.uart.id, profile.uart.characteristics.tx.id, (value) => {
33
+ this.dispatchTypedEvent("uartdata", new UARTDataEvent(new Uint8Array(value.buffer)));
34
+ });
35
+ }
36
+ catch (e) {
37
+ this.dispatchTypedEvent("backgrounderror", new BackgroundErrorEvent("Failed to start notifications", e));
38
+ }
60
39
  }
61
40
  }
62
41
  async stopNotifications(type) {
63
42
  if (type === "uartdata") {
64
- await this.txCharacteristic.stopNotifications();
43
+ await BleClient.stopNotifications(this.deviceId, profile.uart.id, profile.uart.characteristics.tx.id);
65
44
  }
66
45
  }
67
46
  async writeData(value) {
68
47
  const dataView = new DataView(value.buffer);
69
- return this.queueGattOperation(() => this.rxCharacteristic.writeValueWithoutResponse(dataView));
48
+ await BleClient.writeWithoutResponse(this.deviceId, profile.uart.id, profile.uart.characteristics.rx.id, dataView);
70
49
  }
71
50
  }
72
51
  //# sourceMappingURL=uart-service.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"uart-service.js","sourceRoot":"","sources":["../../lib/uart-service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAMhE,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,OAAO,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,aAAa,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,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACpE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,YAAY,EAAE,CAAC;gBACjB,UAAU,CAAC,iBAAiB,EAAE,IAAI,oBAAoB,CAAC,GAAa,CAAC,CAAC,CAAC;gBACvE,OAAO;YACT,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,WAAW,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,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC,EAAE,CACnC,CAAC;QACF,MAAM,gBAAgB,GAAG,MAAM,WAAW,CAAC,iBAAiB,CAC1D,OAAO,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"}
1
+ {"version":3,"file":"uart-service.js","sourceRoot":"","sources":["../../lib/uart-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAC;AAE9D,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAKjD,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAEnD,MAAM,OAAO,WAAW;IAGtB,YACU,QAAgB,EAChB,kBAA+C;QADvD;;;;mBAAQ,QAAQ;WAAQ;QACxB;;;;mBAAQ,kBAAkB;WAA6B;QAJzD;;;;mBAAO,OAAO,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,SAAS,CAAC,kBAAkB,CAChC,IAAI,CAAC,QAAQ,EACb,OAAO,CAAC,IAAI,CAAC,EAAE,EACf,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC,EAAE,EAClC,CAAC,KAAe,EAAE,EAAE;oBAClB,IAAI,CAAC,kBAAkB,CACrB,UAAU,EACV,IAAI,aAAa,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,oBAAoB,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,SAAS,CAAC,iBAAiB,CAC/B,IAAI,CAAC,QAAQ,EACb,OAAO,CAAC,IAAI,CAAC,EAAE,EACf,OAAO,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,SAAS,CAAC,oBAAoB,CAClC,IAAI,CAAC,QAAQ,EACb,OAAO,CAAC,IAAI,CAAC,EAAE,EACf,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC,EAAE,EAClC,QAAQ,CACT,CAAC;IACJ,CAAC;CACF"}
@@ -8,6 +8,7 @@ const { CortexM: CortexMValue, DAPLink: DAPLinkValue, WebUSB: WebUSBValue, } = d
8
8
  import { ApReg, CortexSpecialReg, Csw, DapCmd, DapVal, FICR, } from "./constants.js";
9
9
  import { apReg, bufferConcat, CoreRegister, regRequest, } from "./usb-partial-flashing-utils.js";
10
10
  import { BoardSerialInfo } from "./board-serial-info.js";
11
+ import { DeviceError } from "./device.js";
11
12
  export class DAPWrapper {
12
13
  constructor(device, logging) {
13
14
  Object.defineProperty(this, "device", {
@@ -79,7 +80,10 @@ export class DAPWrapper {
79
80
  */
80
81
  get pageSize() {
81
82
  if (this._pageSize === undefined) {
82
- throw new Error("pageSize not defined until connected");
83
+ throw new DeviceError({
84
+ code: "reconnect-microbit",
85
+ message: "pageSize not defined until connected",
86
+ });
83
87
  }
84
88
  return this._pageSize;
85
89
  }
@@ -88,7 +92,10 @@ export class DAPWrapper {
88
92
  */
89
93
  get numPages() {
90
94
  if (this._numPages === undefined) {
91
- throw new Error("numPages not defined until connected");
95
+ throw new DeviceError({
96
+ code: "reconnect-microbit",
97
+ message: "numPages not defined until connected",
98
+ });
92
99
  }
93
100
  return this._numPages;
94
101
  }
@@ -195,7 +202,10 @@ export class DAPWrapper {
195
202
  data.unshift(op);
196
203
  const buf = await this.send(data);
197
204
  if (buf[0] !== op) {
198
- throw new Error(`Bad response for ${op} -> ${buf[0]}`);
205
+ throw new DeviceError({
206
+ code: "reconnect-microbit",
207
+ message: `Bad response for ${op} -> ${buf[0]}`,
208
+ });
199
209
  }
200
210
  switch (op) {
201
211
  case DapCmd.DAP_CONNECT:
@@ -205,7 +215,10 @@ export class DAPWrapper {
205
215
  break;
206
216
  default:
207
217
  if (buf[1] !== 0) {
208
- throw new Error(`Bad status for ${op} -> ${buf[1]}`);
218
+ throw new DeviceError({
219
+ code: "reconnect-microbit",
220
+ message: `Bad status for ${op} -> ${buf[1]}`,
221
+ });
209
222
  }
210
223
  }
211
224
  return buf;
@@ -221,10 +234,16 @@ export class DAPWrapper {
221
234
  // Transfer the read requests to the micro:bit and retrieve the data read.
222
235
  const buf = await this.cmdNums(DapCmd.DAP_TRANSFER, sendargs);
223
236
  if (buf[1] !== cnt) {
224
- throw new Error("(many) Bad #trans " + buf[1]);
237
+ throw new DeviceError({
238
+ code: "reconnect-microbit",
239
+ message: "(many) Bad #trans " + buf[1],
240
+ });
225
241
  }
226
242
  else if (buf[2] !== 1) {
227
- throw new Error("(many) Bad transfer status " + buf[2]);
243
+ throw new DeviceError({
244
+ code: "reconnect-microbit",
245
+ message: "(many) Bad transfer status " + buf[2],
246
+ });
228
247
  }
229
248
  return buf.subarray(3, 3 + cnt * 4);
230
249
  }
@@ -240,7 +259,10 @@ export class DAPWrapper {
240
259
  // Transfer the write requests to the micro:bit and retrieve the response status.
241
260
  const buf = await this.cmdNums(DapCmd.DAP_TRANSFER_BLOCK, sendargs);
242
261
  if (buf[3] !== 1) {
243
- throw new Error("(many-wr) Bad transfer status " + buf[2]);
262
+ throw new DeviceError({
263
+ code: "reconnect-microbit",
264
+ message: "(many-wr) Bad transfer status " + buf[2],
265
+ });
244
266
  }
245
267
  }
246
268
  // Core functionality reading a block of data from micro:bit RAM at a specified address.
@@ -340,7 +362,10 @@ export class DAPWrapper {
340
362
  // Recurses otherwise.
341
363
  async waitForHaltCore(halted, deadline) {
342
364
  if (new Date().getTime() > deadline) {
343
- throw new Error("timeout");
365
+ throw new DeviceError({
366
+ code: "timeout-error",
367
+ message: "timeout",
368
+ });
344
369
  }
345
370
  if (!halted) {
346
371
  const isHalted = await this.cortexM.isHalted();