@microbit/microbit-connection 0.0.0-alpha.9 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (229) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +94 -5
  3. package/build/{accelerometer-service.d.ts → cjs/accelerometer-service.d.ts} +3 -3
  4. package/build/cjs/accelerometer-service.js +106 -0
  5. package/build/cjs/accelerometer-service.js.map +1 -0
  6. package/build/cjs/accelerometer.js +16 -0
  7. package/build/cjs/accelerometer.js.map +1 -0
  8. package/build/cjs/async-util.js +27 -0
  9. package/build/cjs/async-util.js.map +1 -0
  10. package/build/{bluetooth-device-wrapper.d.ts → cjs/bluetooth-device-wrapper.d.ts} +23 -15
  11. package/build/cjs/bluetooth-device-wrapper.js +467 -0
  12. package/build/cjs/bluetooth-device-wrapper.js.map +1 -0
  13. package/build/cjs/bluetooth-profile.js +86 -0
  14. package/build/cjs/bluetooth-profile.js.map +1 -0
  15. package/build/cjs/bluetooth.d.ts +108 -0
  16. package/build/cjs/bluetooth.js +272 -0
  17. package/build/cjs/bluetooth.js.map +1 -0
  18. package/build/cjs/board-id.js +81 -0
  19. package/build/cjs/board-id.js.map +1 -0
  20. package/build/cjs/board-serial-info.js +51 -0
  21. package/build/cjs/board-serial-info.js.map +1 -0
  22. package/build/{button-service.d.ts → cjs/button-service.d.ts} +2 -2
  23. package/build/cjs/button-service.js +80 -0
  24. package/build/cjs/button-service.js.map +1 -0
  25. package/build/cjs/buttons.js +22 -0
  26. package/build/cjs/buttons.js.map +1 -0
  27. package/build/cjs/constants.js +73 -0
  28. package/build/cjs/constants.js.map +1 -0
  29. package/build/{device.d.ts → cjs/device.d.ts} +35 -46
  30. package/build/cjs/device.js +133 -0
  31. package/build/cjs/device.js.map +1 -0
  32. package/build/{events.d.ts → cjs/events.d.ts} +12 -3
  33. package/build/cjs/events.js +109 -0
  34. package/build/cjs/events.js.map +1 -0
  35. package/build/cjs/hex-flash-data-source.js +26 -0
  36. package/build/cjs/hex-flash-data-source.js.map +1 -0
  37. package/build/cjs/index.d.ts +17 -0
  38. package/build/cjs/index.js +36 -0
  39. package/build/cjs/index.js.map +1 -0
  40. package/build/cjs/led-service.d.ts +20 -0
  41. package/build/cjs/led-service.js +120 -0
  42. package/build/cjs/led-service.js.map +1 -0
  43. package/build/cjs/led.d.ts +6 -0
  44. package/build/cjs/led.js +3 -0
  45. package/build/cjs/led.js.map +1 -0
  46. package/build/{logging.d.ts → cjs/logging.d.ts} +3 -3
  47. package/build/cjs/logging.js +16 -0
  48. package/build/cjs/logging.js.map +1 -0
  49. package/build/cjs/magnetometer-service.d.ts +22 -0
  50. package/build/cjs/magnetometer-service.js +129 -0
  51. package/build/cjs/magnetometer-service.js.map +1 -0
  52. package/build/cjs/magnetometer.d.ts +9 -0
  53. package/build/cjs/magnetometer.js +16 -0
  54. package/build/cjs/magnetometer.js.map +1 -0
  55. package/build/cjs/package.json +1 -0
  56. package/build/cjs/promise-queue.d.ts +27 -0
  57. package/build/cjs/promise-queue.js +78 -0
  58. package/build/cjs/promise-queue.js.map +1 -0
  59. package/build/cjs/serial-events.d.ts +20 -0
  60. package/build/cjs/serial-events.js +69 -0
  61. package/build/cjs/serial-events.js.map +1 -0
  62. package/build/{service-events.d.ts → cjs/service-events.d.ts} +4 -0
  63. package/build/cjs/service-events.js +39 -0
  64. package/build/cjs/service-events.js.map +1 -0
  65. package/build/cjs/setupTests.js.map +1 -0
  66. package/build/cjs/uart-service.d.ts +13 -0
  67. package/build/cjs/uart-service.js +76 -0
  68. package/build/cjs/uart-service.js.map +1 -0
  69. package/build/cjs/uart.d.ts +4 -0
  70. package/build/cjs/uart.js +16 -0
  71. package/build/cjs/uart.js.map +1 -0
  72. package/build/{usb-device-wrapper.d.ts → cjs/usb-device-wrapper.d.ts} +2 -6
  73. package/build/cjs/usb-device-wrapper.js +412 -0
  74. package/build/cjs/usb-device-wrapper.js.map +1 -0
  75. package/build/cjs/usb-partial-flashing-utils.js +133 -0
  76. package/build/cjs/usb-partial-flashing-utils.js.map +1 -0
  77. package/build/{usb-partial-flashing.d.ts → cjs/usb-partial-flashing.d.ts} +3 -3
  78. package/build/cjs/usb-partial-flashing.js +341 -0
  79. package/build/cjs/usb-partial-flashing.js.map +1 -0
  80. package/build/cjs/usb-radio-bridge.d.ts +24 -0
  81. package/build/cjs/usb-radio-bridge.js +516 -0
  82. package/build/cjs/usb-radio-bridge.js.map +1 -0
  83. package/build/cjs/usb-serial-protocol.js +183 -0
  84. package/build/cjs/usb-serial-protocol.js.map +1 -0
  85. package/build/cjs/usb.d.ts +64 -0
  86. package/build/cjs/usb.js +647 -0
  87. package/build/cjs/usb.js.map +1 -0
  88. package/build/esm/accelerometer-service.d.ts +18 -0
  89. package/build/{accelerometer-service.js → esm/accelerometer-service.js} +4 -20
  90. package/build/esm/accelerometer-service.js.map +1 -0
  91. package/build/esm/accelerometer.d.ts +9 -0
  92. package/build/esm/accelerometer.js.map +1 -0
  93. package/build/esm/async-util.d.ts +13 -0
  94. package/build/esm/async-util.js.map +1 -0
  95. package/build/esm/bluetooth-device-wrapper.d.ts +63 -0
  96. package/build/{bluetooth-device-wrapper.js → esm/bluetooth-device-wrapper.js} +105 -75
  97. package/build/esm/bluetooth-device-wrapper.js.map +1 -0
  98. package/build/esm/bluetooth-profile.d.ts +139 -0
  99. package/build/esm/bluetooth-profile.js.map +1 -0
  100. package/build/esm/bluetooth.d.ts +108 -0
  101. package/build/{bluetooth.js → esm/bluetooth.js} +73 -36
  102. package/build/esm/bluetooth.js.map +1 -0
  103. package/build/esm/board-id.d.ts +36 -0
  104. package/build/esm/board-id.js.map +1 -0
  105. package/build/esm/board-serial-info.d.ts +14 -0
  106. package/build/esm/board-serial-info.js.map +1 -0
  107. package/build/esm/button-service.d.ts +13 -0
  108. package/build/esm/button-service.js.map +1 -0
  109. package/build/esm/buttons.d.ts +10 -0
  110. package/build/esm/buttons.js.map +1 -0
  111. package/build/esm/constants.d.ts +48 -0
  112. package/build/esm/constants.js.map +1 -0
  113. package/build/esm/device.d.ts +181 -0
  114. package/build/{device.js → esm/device.js} +11 -58
  115. package/build/esm/device.js.map +1 -0
  116. package/build/esm/events.d.ts +110 -0
  117. package/build/esm/events.js +104 -0
  118. package/build/esm/events.js.map +1 -0
  119. package/build/esm/hex-flash-data-source.d.ts +7 -0
  120. package/build/esm/hex-flash-data-source.js.map +1 -0
  121. package/build/esm/index.d.ts +17 -0
  122. package/build/esm/index.js +12 -0
  123. package/build/esm/index.js.map +1 -0
  124. package/build/esm/led-service.d.ts +20 -0
  125. package/build/esm/led-service.js +116 -0
  126. package/build/esm/led-service.js.map +1 -0
  127. package/build/esm/led.d.ts +6 -0
  128. package/build/esm/led.js +2 -0
  129. package/build/esm/led.js.map +1 -0
  130. package/build/esm/logging.d.ts +21 -0
  131. package/build/esm/logging.js.map +1 -0
  132. package/build/esm/magnetometer-service.d.ts +22 -0
  133. package/build/esm/magnetometer-service.js +125 -0
  134. package/build/esm/magnetometer-service.js.map +1 -0
  135. package/build/esm/magnetometer.d.ts +9 -0
  136. package/build/esm/magnetometer.js +12 -0
  137. package/build/esm/magnetometer.js.map +1 -0
  138. package/build/esm/package.json +1 -0
  139. package/build/esm/promise-queue.d.ts +27 -0
  140. package/build/esm/promise-queue.js +74 -0
  141. package/build/esm/promise-queue.js.map +1 -0
  142. package/build/esm/serial-events.d.ts +20 -0
  143. package/build/esm/serial-events.js +61 -0
  144. package/build/esm/serial-events.js.map +1 -0
  145. package/build/esm/service-events.d.ts +17 -0
  146. package/build/{service-events.js → esm/service-events.js} +12 -0
  147. package/build/esm/service-events.js.map +1 -0
  148. package/build/esm/setupTests.d.ts +6 -0
  149. package/build/{setupTests.js.map → esm/setupTests.js.map} +1 -1
  150. package/build/esm/uart-service.d.ts +13 -0
  151. package/build/esm/uart-service.js +72 -0
  152. package/build/esm/uart-service.js.map +1 -0
  153. package/build/esm/uart.d.ts +4 -0
  154. package/build/esm/uart.js +12 -0
  155. package/build/esm/uart.js.map +1 -0
  156. package/build/esm/usb-device-wrapper.d.ts +47 -0
  157. package/build/{usb-device-wrapper.js → esm/usb-device-wrapper.js} +36 -12
  158. package/build/esm/usb-device-wrapper.js.map +1 -0
  159. package/build/esm/usb-partial-flashing-utils.d.ts +17 -0
  160. package/build/esm/usb-partial-flashing-utils.js.map +1 -0
  161. package/build/esm/usb-partial-flashing.d.ts +69 -0
  162. package/build/{usb-partial-flashing.js → esm/usb-partial-flashing.js} +8 -10
  163. package/build/esm/usb-partial-flashing.js.map +1 -0
  164. package/build/esm/usb-radio-bridge.d.ts +24 -0
  165. package/build/{usb-radio-bridge.js → esm/usb-radio-bridge.js} +133 -47
  166. package/build/esm/usb-radio-bridge.js.map +1 -0
  167. package/build/esm/usb-serial-protocol.d.ts +66 -0
  168. package/build/esm/usb-serial-protocol.js.map +1 -0
  169. package/build/esm/usb.d.ts +64 -0
  170. package/build/{usb.js → esm/usb.js} +188 -67
  171. package/build/esm/usb.js.map +1 -0
  172. package/package.json +23 -9
  173. package/typedoc.json +14 -0
  174. package/build/accelerometer-service.js.map +0 -1
  175. package/build/accelerometer.js.map +0 -1
  176. package/build/async-util.js.map +0 -1
  177. package/build/bluetooth-device-wrapper.js.map +0 -1
  178. package/build/bluetooth-profile.js.map +0 -1
  179. package/build/bluetooth-utils.d.ts +0 -5
  180. package/build/bluetooth-utils.js +0 -14
  181. package/build/bluetooth-utils.js.map +0 -1
  182. package/build/bluetooth.d.ts +0 -49
  183. package/build/bluetooth.js.map +0 -1
  184. package/build/board-id.js.map +0 -1
  185. package/build/board-serial-info.js.map +0 -1
  186. package/build/button-service.js.map +0 -1
  187. package/build/buttons.js.map +0 -1
  188. package/build/constants.js.map +0 -1
  189. package/build/device.js.map +0 -1
  190. package/build/events.js +0 -19
  191. package/build/events.js.map +0 -1
  192. package/build/hex-flash-data-source.js.map +0 -1
  193. package/build/index.d.ts +0 -10
  194. package/build/index.js +0 -8
  195. package/build/index.js.map +0 -1
  196. package/build/logging.js.map +0 -1
  197. package/build/service-events.js.map +0 -1
  198. package/build/usb-device-wrapper.js.map +0 -1
  199. package/build/usb-partial-flashing-utils.js.map +0 -1
  200. package/build/usb-partial-flashing.js.map +0 -1
  201. package/build/usb-radio-bridge.d.ts +0 -37
  202. package/build/usb-radio-bridge.js.map +0 -1
  203. package/build/usb-serial-protocol.js.map +0 -1
  204. package/build/usb.d.ts +0 -60
  205. package/build/usb.js.map +0 -1
  206. package/vite.config.ts +0 -32
  207. /package/build/{accelerometer.d.ts → cjs/accelerometer.d.ts} +0 -0
  208. /package/build/{async-util.d.ts → cjs/async-util.d.ts} +0 -0
  209. /package/build/{bluetooth-profile.d.ts → cjs/bluetooth-profile.d.ts} +0 -0
  210. /package/build/{board-id.d.ts → cjs/board-id.d.ts} +0 -0
  211. /package/build/{board-serial-info.d.ts → cjs/board-serial-info.d.ts} +0 -0
  212. /package/build/{buttons.d.ts → cjs/buttons.d.ts} +0 -0
  213. /package/build/{constants.d.ts → cjs/constants.d.ts} +0 -0
  214. /package/build/{hex-flash-data-source.d.ts → cjs/hex-flash-data-source.d.ts} +0 -0
  215. /package/build/{setupTests.d.ts → cjs/setupTests.d.ts} +0 -0
  216. /package/build/{usb-partial-flashing-utils.d.ts → cjs/usb-partial-flashing-utils.d.ts} +0 -0
  217. /package/build/{usb-serial-protocol.d.ts → cjs/usb-serial-protocol.d.ts} +0 -0
  218. /package/build/{accelerometer.js → esm/accelerometer.js} +0 -0
  219. /package/build/{async-util.js → esm/async-util.js} +0 -0
  220. /package/build/{bluetooth-profile.js → esm/bluetooth-profile.js} +0 -0
  221. /package/build/{board-id.js → esm/board-id.js} +0 -0
  222. /package/build/{board-serial-info.js → esm/board-serial-info.js} +0 -0
  223. /package/build/{button-service.js → esm/button-service.js} +0 -0
  224. /package/build/{buttons.js → esm/buttons.js} +0 -0
  225. /package/build/{constants.js → esm/constants.js} +0 -0
  226. /package/build/{hex-flash-data-source.js → esm/hex-flash-data-source.js} +0 -0
  227. /package/build/{logging.js → esm/logging.js} +0 -0
  228. /package/build/{usb-partial-flashing-utils.js → esm/usb-partial-flashing-utils.js} +0 -0
  229. /package/build/{usb-serial-protocol.js → esm/usb-serial-protocol.js} +0 -0
@@ -3,7 +3,8 @@
3
3
  *
4
4
  * SPDX-License-Identifier: MIT
5
5
  */
6
- import { CortexM, DAPLink, WebUSB } from "dapjs";
6
+ import * as dapjs from "dapjs";
7
+ const { CortexM: CortexMValue, DAPLink: DAPLinkValue, WebUSB: WebUSBValue, } = dapjs;
7
8
  import { ApReg, CortexSpecialReg, Csw, DapCmd, DapVal, FICR, } from "./constants.js";
8
9
  import { apReg, bufferConcat, CoreRegister, regRequest, } from "./usb-partial-flashing-utils.js";
9
10
  import { BoardSerialInfo } from "./board-serial-info.js";
@@ -69,9 +70,9 @@ export class DAPWrapper {
69
70
  writable: true,
70
71
  value: false
71
72
  });
72
- this.transport = new WebUSB(this.device);
73
- this.daplink = new DAPLink(this.transport);
74
- this.cortexM = new CortexM(this.transport);
73
+ this.transport = new WebUSBValue(this.device);
74
+ this.daplink = new DAPLinkValue(this.transport);
75
+ this.cortexM = new CortexMValue(this.transport);
75
76
  }
76
77
  /**
77
78
  * The page size. Throws if we've not connected.
@@ -104,9 +105,9 @@ export class DAPWrapper {
104
105
  async reconnectAsync() {
105
106
  if (this.initialConnectionComplete) {
106
107
  await this.disconnectAsync();
107
- this.transport = new WebUSB(this.device);
108
- this.daplink = new DAPLink(this.transport);
109
- this.cortexM = new CortexM(this.transport);
108
+ this.transport = new WebUSBValue(this.device);
109
+ this.daplink = new DAPLinkValue(this.transport);
110
+ this.cortexM = new CortexMValue(this.transport);
110
111
  }
111
112
  else {
112
113
  this.initialConnectionComplete = true;
@@ -133,10 +134,33 @@ export class DAPWrapper {
133
134
  this.boardSerialInfo.hic,
134
135
  });
135
136
  }
136
- this._pageSize = await this.cortexM.readMem32(FICR.CODEPAGESIZE);
137
- this._numPages = await this.cortexM.readMem32(FICR.CODESIZE);
138
137
  // https://support.microbit.org/support/solutions/articles/19000067679-how-to-find-the-name-of-your-micro-bit
139
- this._deviceId = await this.cortexM.readMem32(FICR.DEVICE_ID_1);
138
+ // We wait on errors as immediately after flash the micro:bit won't be ready to respond
139
+ this._deviceId = await this.readMem32WaitOnError(FICR.DEVICE_ID_1);
140
+ this._pageSize = await this.readMem32WaitOnError(FICR.CODEPAGESIZE);
141
+ this._numPages = await this.readMem32WaitOnError(FICR.CODESIZE);
142
+ }
143
+ async readMem32WaitOnError(register) {
144
+ let retries = 0;
145
+ let lastError;
146
+ while (retries < 20) {
147
+ try {
148
+ return await this.cortexM.readMem32(register);
149
+ }
150
+ catch (e) {
151
+ if (e instanceof Error) {
152
+ lastError = e;
153
+ if (/^Transfer/.test(e.message)) {
154
+ retries++;
155
+ await new Promise((resolve) => setTimeout(resolve, 20));
156
+ }
157
+ else {
158
+ throw e;
159
+ }
160
+ }
161
+ }
162
+ }
163
+ throw lastError;
140
164
  }
141
165
  async startSerial(listener) {
142
166
  const currentBaud = await this.daplink.getSerialBaudrate();
@@ -144,12 +168,12 @@ export class DAPWrapper {
144
168
  // Changing the baud rate causes a micro:bit reset, so only do it if necessary
145
169
  await this.daplink.setSerialBaudrate(115200);
146
170
  }
147
- this.daplink.addListener(DAPLink.EVENT_SERIAL_DATA, listener);
171
+ this.daplink.addListener(DAPLinkValue.EVENT_SERIAL_DATA, listener);
148
172
  await this.daplink.startSerialRead(1);
149
173
  }
150
174
  stopSerial(listener) {
151
175
  this.daplink.stopSerialRead();
152
- this.daplink.removeListener(DAPLink.EVENT_SERIAL_DATA, listener);
176
+ this.daplink.removeListener(DAPLinkValue.EVENT_SERIAL_DATA, listener);
153
177
  }
154
178
  async disconnectAsync() {
155
179
  if (this.device.opened &&
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usb-device-wrapper.js","sourceRoot":"","sources":["../../lib/usb-device-wrapper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ export declare const CoreRegister: {
2
+ SP: number;
3
+ LR: number;
4
+ PC: number;
5
+ };
6
+ export declare const read32FromUInt8Array: (data: Uint8Array, i: number) => number;
7
+ export declare const bufferConcat: (bufs: Uint8Array[]) => Uint8Array;
8
+ export declare const murmur3_core: (data: Uint8Array) => [number, number];
9
+ export declare const apReg: (r: number, mode: number) => number;
10
+ export declare const regRequest: (regId: number, isWrite?: boolean) => number;
11
+ export declare class Page {
12
+ readonly targetAddr: number;
13
+ readonly data: Uint8Array;
14
+ constructor(targetAddr: number, data: Uint8Array);
15
+ }
16
+ export declare const pageAlignBlocks: (buffer: Uint8Array, targetAddr: number, pageSize: number) => Page[];
17
+ export declare const onlyChanged: (pages: Page[], checksums: Uint8Array, pageSize: number) => Page[];
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usb-partial-flashing-utils.js","sourceRoot":"","sources":["../../lib/usb-partial-flashing-utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * (c) 2021, Micro:bit Educational Foundation and contributors
3
+ *
4
+ * SPDX-License-Identifier: MIT
5
+ *
6
+ * This file is made up of a combination of original code, along with code
7
+ * extracted from the following repositories:
8
+ *
9
+ * https://github.com/mmoskal/dapjs/tree/a32f11f54e9e76a9c61896ddd425c1cb1a29c143
10
+ * https://github.com/microsoft/pxt-microbit
11
+ *
12
+ * The pxt-microbit license is included below.
13
+ *
14
+ * PXT - Programming Experience Toolkit
15
+ *
16
+ * The MIT License (MIT)
17
+ *
18
+ * Copyright (c) Microsoft Corporation
19
+ *
20
+ * All rights reserved.
21
+ *
22
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
23
+ * of this software and associated documentation files (the "Software"), to deal
24
+ * in the Software without restriction, including without limitation the rights
25
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
26
+ * copies of the Software, and to permit persons to whom the Software is
27
+ * furnished to do so, subject to the following conditions:
28
+ *
29
+ * The above copyright notice and this permission notice shall be included in all
30
+ * copies or substantial portions of the Software.
31
+ *
32
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
33
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
34
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
35
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
36
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
37
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
38
+ * SOFTWARE.
39
+ */
40
+ import { Logging } from "./logging.js";
41
+ import { DAPWrapper } from "./usb-device-wrapper.js";
42
+ import { BoardVersion } from "./device.js";
43
+ import MemoryMap from "nrf-intel-hex";
44
+ type ProgressCallback = (n: number, partial: boolean) => void;
45
+ /**
46
+ * Uses a DAPWrapper to flash the micro:bit.
47
+ *
48
+ * Intented to be used for a single flash with a pre-connected DAPWrapper.
49
+ */
50
+ export declare class PartialFlashing {
51
+ private dapwrapper;
52
+ private logging;
53
+ private boardVersion;
54
+ constructor(dapwrapper: DAPWrapper, logging: Logging, boardVersion: BoardVersion);
55
+ private log;
56
+ private getFlashChecksumsAsync;
57
+ private runFlash;
58
+ private partialFlashPageAsync;
59
+ private partialFlashCoreAsync;
60
+ private partialFlashAsync;
61
+ fullFlashAsync(data: string | Uint8Array | MemoryMap, updateProgress: ProgressCallback): Promise<void>;
62
+ flashAsync(data: string | Uint8Array | MemoryMap, updateProgress: ProgressCallback): Promise<boolean>;
63
+ private convertDataToHexString;
64
+ private convertDataToPaddedBytes;
65
+ private hexStringToPaddedBytes;
66
+ private paddedBytesToHexString;
67
+ private memoryMapToPaddedBytes;
68
+ }
69
+ export {};
@@ -43,7 +43,9 @@
43
43
  * Latest Microsoft implementation is here:
44
44
  * https://github.com/microsoft/pxt-microbit/blob/master/editor/flash.ts
45
45
  */
46
- import { DAPLink } from "dapjs";
46
+ // dapjs import faff needed for Vitest https://github.com/ARMmbed/dapjs/issues/118
47
+ import * as dapjs from "dapjs";
48
+ const { DAPLink: DAPLinkValue } = dapjs;
47
49
  import { withTimeout, TimeoutError } from "./async-util.js";
48
50
  import { CoreRegister, onlyChanged, pageAlignBlocks, read32FromUInt8Array, } from "./usb-partial-flashing-utils.js";
49
51
  import MemoryMap from "nrf-intel-hex";
@@ -217,7 +219,7 @@ export class PartialFlashing {
217
219
  const fullFlashProgress = (progress) => {
218
220
  updateProgress(progress, false);
219
221
  };
220
- this.dapwrapper.daplink.on(DAPLink.EVENT_PROGRESS, fullFlashProgress);
222
+ this.dapwrapper.daplink.on(DAPLinkValue.EVENT_PROGRESS, fullFlashProgress);
221
223
  try {
222
224
  data = this.convertDataToHexString(data);
223
225
  await this.dapwrapper.transport.open();
@@ -228,7 +230,7 @@ export class PartialFlashing {
228
230
  });
229
231
  }
230
232
  finally {
231
- this.dapwrapper.daplink.removeListener(DAPLink.EVENT_PROGRESS, fullFlashProgress);
233
+ this.dapwrapper.daplink.removeListener(DAPLinkValue.EVENT_PROGRESS, fullFlashProgress);
232
234
  }
233
235
  }
234
236
  // Flash the micro:bit's ROM with the provided image, resetting the micro:bit first.
@@ -292,15 +294,11 @@ export class PartialFlashing {
292
294
  return this.memoryMapToPaddedBytes(data);
293
295
  }
294
296
  hexStringToPaddedBytes(hex) {
295
- // Cludge for a packaging issue
296
- const fromHex = MemoryMap.fromHex ?? MemoryMap.default.fromHex;
297
- return this.memoryMapToPaddedBytes(fromHex(hex));
297
+ const m = MemoryMap.fromHex(hex);
298
+ return this.memoryMapToPaddedBytes(m);
298
299
  }
299
300
  paddedBytesToHexString(data) {
300
- // Cludge for a packaging issue
301
- const fromPaddedUint8Array = MemoryMap.fromPaddedUint8Array ??
302
- MemoryMap.default.fromPaddedUint8Array;
303
- return fromPaddedUint8Array(data).asHexString();
301
+ return MemoryMap.fromPaddedUint8Array(data).asHexString();
304
302
  }
305
303
  memoryMapToPaddedBytes(memoryMap) {
306
304
  const flashSize = {
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usb-partial-flashing.js","sourceRoot":"","sources":["../../lib/usb-partial-flashing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * (c) 2023, Center for Computational Thinking and Design at Aarhus University and contributors
3
+ *
4
+ * SPDX-License-Identifier: MIT
5
+ */
6
+ import { DeviceConnection } from "./device.js";
7
+ import { Logging } from "./logging.js";
8
+ import { ServiceConnectionEventMap } from "./service-events.js";
9
+ import { MicrobitWebUSBConnection } from "./usb.js";
10
+ export interface MicrobitRadioBridgeConnectionOptions {
11
+ logging: Logging;
12
+ }
13
+ export interface MicrobitRadioBridgeConnection extends DeviceConnection<ServiceConnectionEventMap> {
14
+ /**
15
+ * Sets remote device.
16
+ *
17
+ * @param deviceId The device id of remote micro:bit.
18
+ */
19
+ setRemoteDeviceId(deviceId: number): void;
20
+ }
21
+ /**
22
+ * A radio bridge connection factory.
23
+ */
24
+ export declare const createRadioBridgeConnection: (delegate: MicrobitWebUSBConnection, options?: MicrobitRadioBridgeConnectionOptions) => MicrobitRadioBridgeConnection;
@@ -14,12 +14,16 @@ class BridgeError extends Error {
14
14
  }
15
15
  class RemoteError extends Error {
16
16
  }
17
+ /**
18
+ * A radio bridge connection factory.
19
+ */
20
+ export const createRadioBridgeConnection = (delegate, options) => new MicrobitRadioBridgeConnectionImpl(delegate, options);
17
21
  /**
18
22
  * Wraps around a USB connection to implement a subset of services over a serial protocol.
19
23
  *
20
24
  * When it connects/disconnects it affects the delegate connection.
21
25
  */
22
- export class MicrobitRadioBridgeConnection extends TypedEventTarget {
26
+ class MicrobitRadioBridgeConnectionImpl extends TypedEventTarget {
23
27
  constructor(delegate, options) {
24
28
  super();
25
29
  Object.defineProperty(this, "delegate", {
@@ -52,16 +56,46 @@ export class MicrobitRadioBridgeConnection extends TypedEventTarget {
52
56
  writable: true,
53
57
  value: void 0
54
58
  });
55
- Object.defineProperty(this, "delegateStatusListner", {
59
+ Object.defineProperty(this, "disconnectPromise", {
60
+ enumerable: true,
61
+ configurable: true,
62
+ writable: true,
63
+ value: void 0
64
+ });
65
+ Object.defineProperty(this, "serialSessionOpen", {
66
+ enumerable: true,
67
+ configurable: true,
68
+ writable: true,
69
+ value: false
70
+ });
71
+ Object.defineProperty(this, "ignoreDelegateStatus", {
72
+ enumerable: true,
73
+ configurable: true,
74
+ writable: true,
75
+ value: false
76
+ });
77
+ Object.defineProperty(this, "delegateStatusListener", {
56
78
  enumerable: true,
57
79
  configurable: true,
58
80
  writable: true,
59
81
  value: (e) => {
82
+ if (this.ignoreDelegateStatus) {
83
+ return;
84
+ }
85
+ const currentStatus = this.status;
60
86
  if (e.status !== ConnectionStatus.CONNECTED) {
61
87
  this.setStatus(e.status);
88
+ if (this.serialSessionOpen) {
89
+ // If the session is already closed we don't need to dispose.
90
+ this.serialSession?.dispose();
91
+ }
62
92
  }
63
93
  else {
64
- this.status = ConnectionStatus.NOT_CONNECTED;
94
+ this.status = ConnectionStatus.DISCONNECTED;
95
+ if (currentStatus === ConnectionStatus.DISCONNECTED &&
96
+ this.serialSessionOpen) {
97
+ this.serialSession?.connect();
98
+ }
65
99
  }
66
100
  }
67
101
  });
@@ -77,10 +111,10 @@ export class MicrobitRadioBridgeConnection extends TypedEventTarget {
77
111
  async initialize() {
78
112
  await this.delegate.initialize();
79
113
  this.setStatus(this.statusFromDelegate());
80
- this.delegate.addEventListener("status", this.delegateStatusListner);
114
+ this.delegate.addEventListener("status", this.delegateStatusListener);
81
115
  }
82
116
  dispose() {
83
- this.delegate.removeEventListener("status", this.delegateStatusListner);
117
+ this.delegate.removeEventListener("status", this.delegateStatusListener);
84
118
  this.delegate.dispose();
85
119
  }
86
120
  clearDevice() {
@@ -90,6 +124,9 @@ export class MicrobitRadioBridgeConnection extends TypedEventTarget {
90
124
  this.remoteDeviceId = remoteDeviceId;
91
125
  }
92
126
  async connect() {
127
+ if (this.disconnectPromise) {
128
+ await this.disconnectPromise;
129
+ }
93
130
  // TODO: previously this skipped overlapping connect attempts but that seems awkward
94
131
  // can we... just not do that? or wait?
95
132
  if (this.remoteDeviceId === undefined) {
@@ -99,22 +136,36 @@ export class MicrobitRadioBridgeConnection extends TypedEventTarget {
99
136
  type: "Connect",
100
137
  message: "Serial connect start",
101
138
  });
139
+ this.ignoreDelegateStatus = false;
102
140
  await this.delegate.connect();
103
141
  try {
104
- this.serialSession = new RadioBridgeSerialSession(this.logging, this.remoteDeviceId, this.delegate, this.dispatchTypedEvent.bind(this), this.setStatus.bind(this), () => {
105
- // Remote connection lost
106
- this.logging.event({
107
- type: "Serial",
108
- message: "Serial connection lost 1",
109
- });
110
- this.serialSession?.dispose();
111
- }, () => {
112
- // Remote connection... even more lost?
113
- this.logging.event({
114
- type: "Serial",
115
- message: "Serial connection lost 2",
116
- });
117
- this.serialSession?.dispose();
142
+ this.serialSession = new RadioBridgeSerialSession(this.logging, this.remoteDeviceId, this.delegate, this.dispatchTypedEvent.bind(this), {
143
+ onConnecting: () => this.setStatus(ConnectionStatus.CONNECTING),
144
+ onReconnecting: () => {
145
+ // Leave serial connection running in case the remote device comes back.
146
+ if (this.status !== ConnectionStatus.RECONNECTING) {
147
+ this.setStatus(ConnectionStatus.RECONNECTING);
148
+ }
149
+ },
150
+ onRestartConnection: () => {
151
+ // So that serial session does not get repetitively disposed in
152
+ // delegate status listener when delegate is disconnected for restarting connection
153
+ this.ignoreDelegateStatus = true;
154
+ },
155
+ onFail: () => {
156
+ if (this.status !== ConnectionStatus.DISCONNECTED) {
157
+ this.setStatus(ConnectionStatus.DISCONNECTED);
158
+ }
159
+ this.ignoreDelegateStatus = false;
160
+ this.serialSessionOpen = false;
161
+ },
162
+ onSuccess: () => {
163
+ if (this.status !== ConnectionStatus.CONNECTED) {
164
+ this.setStatus(ConnectionStatus.CONNECTED);
165
+ }
166
+ this.ignoreDelegateStatus = false;
167
+ this.serialSessionOpen = true;
168
+ },
118
169
  });
119
170
  await this.serialSession.connect();
120
171
  this.logging.event({
@@ -124,6 +175,7 @@ export class MicrobitRadioBridgeConnection extends TypedEventTarget {
124
175
  return this.status;
125
176
  }
126
177
  catch (e) {
178
+ this.serialSessionOpen = false;
127
179
  this.logging.error("Failed to initialise serial protocol", e);
128
180
  this.logging.event({
129
181
  type: "Connect",
@@ -133,15 +185,26 @@ export class MicrobitRadioBridgeConnection extends TypedEventTarget {
133
185
  }
134
186
  }
135
187
  async disconnect() {
136
- await this.serialSession?.dispose();
188
+ if (this.disconnectPromise) {
189
+ return this.disconnectPromise;
190
+ }
191
+ this.serialSessionOpen = false;
192
+ this.disconnectPromise = (async () => {
193
+ await this.serialSession?.dispose(true);
194
+ this.disconnectPromise = undefined;
195
+ })();
196
+ }
197
+ log(v) {
198
+ this.logging.log(v);
137
199
  }
138
200
  setStatus(status) {
139
201
  this.status = status;
202
+ this.log("Radio connection status " + status);
140
203
  this.dispatchTypedEvent("status", new ConnectionStatusEvent(status));
141
204
  }
142
205
  statusFromDelegate() {
143
206
  return this.delegate.status == ConnectionStatus.CONNECTED
144
- ? ConnectionStatus.NOT_CONNECTED
207
+ ? ConnectionStatus.DISCONNECTED
145
208
  : this.delegate.status;
146
209
  }
147
210
  }
@@ -155,7 +218,7 @@ class RadioBridgeSerialSession {
155
218
  this.dispatchTypedEvent(type, new ButtonEvent(type, sensorData[button] ? ButtonState.ShortPress : ButtonState.NotPressed));
156
219
  }
157
220
  }
158
- constructor(logging, remoteDeviceId, delegate, dispatchTypedEvent, onStatusChanged, onRemoteConnectionLost1, onRemoteConnectionLost2) {
221
+ constructor(logging, remoteDeviceId, delegate, dispatchTypedEvent, callbacks) {
159
222
  Object.defineProperty(this, "logging", {
160
223
  enumerable: true,
161
224
  configurable: true,
@@ -180,23 +243,11 @@ class RadioBridgeSerialSession {
180
243
  writable: true,
181
244
  value: dispatchTypedEvent
182
245
  });
183
- Object.defineProperty(this, "onStatusChanged", {
184
- enumerable: true,
185
- configurable: true,
186
- writable: true,
187
- value: onStatusChanged
188
- });
189
- Object.defineProperty(this, "onRemoteConnectionLost1", {
190
- enumerable: true,
191
- configurable: true,
192
- writable: true,
193
- value: onRemoteConnectionLost1
194
- });
195
- Object.defineProperty(this, "onRemoteConnectionLost2", {
246
+ Object.defineProperty(this, "callbacks", {
196
247
  enumerable: true,
197
248
  configurable: true,
198
249
  writable: true,
199
- value: onRemoteConnectionLost2
250
+ value: callbacks
200
251
  });
201
252
  Object.defineProperty(this, "unprocessedData", {
202
253
  enumerable: true,
@@ -228,12 +279,18 @@ class RadioBridgeSerialSession {
228
279
  writable: true,
229
280
  value: void 0
230
281
  });
282
+ Object.defineProperty(this, "isRestartingConnection", {
283
+ enumerable: true,
284
+ configurable: true,
285
+ writable: true,
286
+ value: false
287
+ });
231
288
  Object.defineProperty(this, "serialErrorListener", {
232
289
  enumerable: true,
233
290
  configurable: true,
234
291
  writable: true,
235
- value: (e) => {
236
- this.logging.error("Serial error", e);
292
+ value: (event) => {
293
+ this.logging.error("Serial error", event.error);
237
294
  void this.dispose();
238
295
  }
239
296
  });
@@ -284,9 +341,13 @@ class RadioBridgeSerialSession {
284
341
  this.delegate.addEventListener("serialdata", this.serialDataListener);
285
342
  this.delegate.addEventListener("serialerror", this.serialErrorListener);
286
343
  try {
287
- await this.delegate.softwareReset();
344
+ if (this.isRestartingConnection) {
345
+ this.callbacks.onReconnecting();
346
+ }
347
+ else {
348
+ this.callbacks.onConnecting();
349
+ }
288
350
  await this.handshake();
289
- this.onStatusChanged(ConnectionStatus.CONNECTED);
290
351
  this.logging.log(`Serial: using remote device id ${this.remoteDeviceId}`);
291
352
  const remoteMbIdCommand = protocol.generateCmdRemoteMbId(this.remoteDeviceId);
292
353
  const remoteMbIdResponse = await this.sendCmdWaitResponse(remoteMbIdCommand);
@@ -312,13 +373,16 @@ class RadioBridgeSerialSession {
312
373
  }
313
374
  // TODO: in the first-time connection case we used to move the error/disconnect to the background here, why? timing?
314
375
  await periodicMessagePromise;
315
- this.startConnectionCheck();
376
+ this.isRestartingConnection = false;
377
+ await this.startConnectionCheck();
378
+ this.callbacks.onSuccess();
316
379
  }
317
380
  catch (e) {
318
- this.dispose();
381
+ this.callbacks.onFail();
382
+ await this.dispose();
319
383
  }
320
384
  }
321
- async dispose() {
385
+ async dispose(disconnect = false) {
322
386
  this.stopConnectionCheck();
323
387
  try {
324
388
  await this.sendCmdWaitResponse(protocol.generateCmdStop());
@@ -329,7 +393,10 @@ class RadioBridgeSerialSession {
329
393
  this.responseMap.clear();
330
394
  this.delegate.removeEventListener("serialdata", this.serialDataListener);
331
395
  this.delegate.removeEventListener("serialerror", this.serialErrorListener);
332
- this.onStatusChanged(ConnectionStatus.NOT_CONNECTED);
396
+ if (disconnect) {
397
+ await this.delegate.disconnect();
398
+ }
399
+ await this.delegate.softwareReset();
333
400
  }
334
401
  async sendCmdWaitResponse(cmd) {
335
402
  const responsePromise = new Promise((resolve, reject) => {
@@ -342,22 +409,41 @@ class RadioBridgeSerialSession {
342
409
  await this.delegate.serialWrite(cmd.message);
343
410
  return responsePromise;
344
411
  }
345
- startConnectionCheck() {
412
+ async startConnectionCheck() {
346
413
  // Check for connection lost
347
414
  if (this.connectionCheckIntervalId === undefined) {
348
415
  this.connectionCheckIntervalId = setInterval(async () => {
416
+ if (this.lastReceivedMessageTimestamp &&
417
+ Date.now() - this.lastReceivedMessageTimestamp <= 1_000) {
418
+ this.callbacks.onSuccess();
419
+ }
349
420
  if (this.lastReceivedMessageTimestamp &&
350
421
  Date.now() - this.lastReceivedMessageTimestamp > 1_000) {
351
- this.onRemoteConnectionLost1();
422
+ this.logging.event({
423
+ type: "Serial",
424
+ message: "Serial connection lost...attempt to reconnect",
425
+ });
426
+ this.callbacks.onReconnecting();
352
427
  }
353
428
  if (this.lastReceivedMessageTimestamp &&
354
429
  Date.now() - this.lastReceivedMessageTimestamp >
355
430
  connectTimeoutDuration) {
356
- this.onRemoteConnectionLost2();
431
+ await this.restartConnection();
357
432
  }
358
433
  }, 1000);
359
434
  }
360
435
  }
436
+ async restartConnection() {
437
+ this.isRestartingConnection = true;
438
+ this.logging.event({
439
+ type: "Serial",
440
+ message: "Serial connection lost...restart connection",
441
+ });
442
+ this.callbacks.onRestartConnection();
443
+ await this.dispose(true);
444
+ await this.delegate.connect();
445
+ await this.connect();
446
+ }
361
447
  stopConnectionCheck() {
362
448
  clearInterval(this.connectionCheckIntervalId);
363
449
  this.connectionCheckIntervalId = undefined;