@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.
- package/LICENSE.md +21 -0
- package/README.md +94 -5
- package/build/{accelerometer-service.d.ts → cjs/accelerometer-service.d.ts} +3 -3
- package/build/cjs/accelerometer-service.js +106 -0
- package/build/cjs/accelerometer-service.js.map +1 -0
- package/build/cjs/accelerometer.js +16 -0
- package/build/cjs/accelerometer.js.map +1 -0
- package/build/cjs/async-util.js +27 -0
- package/build/cjs/async-util.js.map +1 -0
- package/build/{bluetooth-device-wrapper.d.ts → cjs/bluetooth-device-wrapper.d.ts} +23 -15
- package/build/cjs/bluetooth-device-wrapper.js +467 -0
- package/build/cjs/bluetooth-device-wrapper.js.map +1 -0
- package/build/cjs/bluetooth-profile.js +86 -0
- package/build/cjs/bluetooth-profile.js.map +1 -0
- package/build/cjs/bluetooth.d.ts +108 -0
- package/build/cjs/bluetooth.js +272 -0
- package/build/cjs/bluetooth.js.map +1 -0
- package/build/cjs/board-id.js +81 -0
- package/build/cjs/board-id.js.map +1 -0
- package/build/cjs/board-serial-info.js +51 -0
- package/build/cjs/board-serial-info.js.map +1 -0
- package/build/{button-service.d.ts → cjs/button-service.d.ts} +2 -2
- package/build/cjs/button-service.js +80 -0
- package/build/cjs/button-service.js.map +1 -0
- package/build/cjs/buttons.js +22 -0
- package/build/cjs/buttons.js.map +1 -0
- package/build/cjs/constants.js +73 -0
- package/build/cjs/constants.js.map +1 -0
- package/build/{device.d.ts → cjs/device.d.ts} +35 -46
- package/build/cjs/device.js +133 -0
- package/build/cjs/device.js.map +1 -0
- package/build/{events.d.ts → cjs/events.d.ts} +12 -3
- package/build/cjs/events.js +109 -0
- package/build/cjs/events.js.map +1 -0
- package/build/cjs/hex-flash-data-source.js +26 -0
- package/build/cjs/hex-flash-data-source.js.map +1 -0
- package/build/cjs/index.d.ts +17 -0
- package/build/cjs/index.js +36 -0
- package/build/cjs/index.js.map +1 -0
- package/build/cjs/led-service.d.ts +20 -0
- package/build/cjs/led-service.js +120 -0
- package/build/cjs/led-service.js.map +1 -0
- package/build/cjs/led.d.ts +6 -0
- package/build/cjs/led.js +3 -0
- package/build/cjs/led.js.map +1 -0
- package/build/{logging.d.ts → cjs/logging.d.ts} +3 -3
- package/build/cjs/logging.js +16 -0
- package/build/cjs/logging.js.map +1 -0
- package/build/cjs/magnetometer-service.d.ts +22 -0
- package/build/cjs/magnetometer-service.js +129 -0
- package/build/cjs/magnetometer-service.js.map +1 -0
- package/build/cjs/magnetometer.d.ts +9 -0
- package/build/cjs/magnetometer.js +16 -0
- package/build/cjs/magnetometer.js.map +1 -0
- package/build/cjs/package.json +1 -0
- package/build/cjs/promise-queue.d.ts +27 -0
- package/build/cjs/promise-queue.js +78 -0
- package/build/cjs/promise-queue.js.map +1 -0
- package/build/cjs/serial-events.d.ts +20 -0
- package/build/cjs/serial-events.js +69 -0
- package/build/cjs/serial-events.js.map +1 -0
- package/build/{service-events.d.ts → cjs/service-events.d.ts} +4 -0
- package/build/cjs/service-events.js +39 -0
- package/build/cjs/service-events.js.map +1 -0
- package/build/cjs/setupTests.js.map +1 -0
- package/build/cjs/uart-service.d.ts +13 -0
- package/build/cjs/uart-service.js +76 -0
- package/build/cjs/uart-service.js.map +1 -0
- package/build/cjs/uart.d.ts +4 -0
- package/build/cjs/uart.js +16 -0
- package/build/cjs/uart.js.map +1 -0
- package/build/{usb-device-wrapper.d.ts → cjs/usb-device-wrapper.d.ts} +2 -6
- package/build/cjs/usb-device-wrapper.js +412 -0
- package/build/cjs/usb-device-wrapper.js.map +1 -0
- package/build/cjs/usb-partial-flashing-utils.js +133 -0
- package/build/cjs/usb-partial-flashing-utils.js.map +1 -0
- package/build/{usb-partial-flashing.d.ts → cjs/usb-partial-flashing.d.ts} +3 -3
- package/build/cjs/usb-partial-flashing.js +341 -0
- package/build/cjs/usb-partial-flashing.js.map +1 -0
- package/build/cjs/usb-radio-bridge.d.ts +24 -0
- package/build/cjs/usb-radio-bridge.js +516 -0
- package/build/cjs/usb-radio-bridge.js.map +1 -0
- package/build/cjs/usb-serial-protocol.js +183 -0
- package/build/cjs/usb-serial-protocol.js.map +1 -0
- package/build/cjs/usb.d.ts +64 -0
- package/build/cjs/usb.js +647 -0
- package/build/cjs/usb.js.map +1 -0
- package/build/esm/accelerometer-service.d.ts +18 -0
- package/build/{accelerometer-service.js → esm/accelerometer-service.js} +4 -20
- package/build/esm/accelerometer-service.js.map +1 -0
- package/build/esm/accelerometer.d.ts +9 -0
- package/build/esm/accelerometer.js.map +1 -0
- package/build/esm/async-util.d.ts +13 -0
- package/build/esm/async-util.js.map +1 -0
- package/build/esm/bluetooth-device-wrapper.d.ts +63 -0
- package/build/{bluetooth-device-wrapper.js → esm/bluetooth-device-wrapper.js} +105 -75
- package/build/esm/bluetooth-device-wrapper.js.map +1 -0
- package/build/esm/bluetooth-profile.d.ts +139 -0
- package/build/esm/bluetooth-profile.js.map +1 -0
- package/build/esm/bluetooth.d.ts +108 -0
- package/build/{bluetooth.js → esm/bluetooth.js} +73 -36
- package/build/esm/bluetooth.js.map +1 -0
- package/build/esm/board-id.d.ts +36 -0
- package/build/esm/board-id.js.map +1 -0
- package/build/esm/board-serial-info.d.ts +14 -0
- package/build/esm/board-serial-info.js.map +1 -0
- package/build/esm/button-service.d.ts +13 -0
- package/build/esm/button-service.js.map +1 -0
- package/build/esm/buttons.d.ts +10 -0
- package/build/esm/buttons.js.map +1 -0
- package/build/esm/constants.d.ts +48 -0
- package/build/esm/constants.js.map +1 -0
- package/build/esm/device.d.ts +181 -0
- package/build/{device.js → esm/device.js} +11 -58
- package/build/esm/device.js.map +1 -0
- package/build/esm/events.d.ts +110 -0
- package/build/esm/events.js +104 -0
- package/build/esm/events.js.map +1 -0
- package/build/esm/hex-flash-data-source.d.ts +7 -0
- package/build/esm/hex-flash-data-source.js.map +1 -0
- package/build/esm/index.d.ts +17 -0
- package/build/esm/index.js +12 -0
- package/build/esm/index.js.map +1 -0
- package/build/esm/led-service.d.ts +20 -0
- package/build/esm/led-service.js +116 -0
- package/build/esm/led-service.js.map +1 -0
- package/build/esm/led.d.ts +6 -0
- package/build/esm/led.js +2 -0
- package/build/esm/led.js.map +1 -0
- package/build/esm/logging.d.ts +21 -0
- package/build/esm/logging.js.map +1 -0
- package/build/esm/magnetometer-service.d.ts +22 -0
- package/build/esm/magnetometer-service.js +125 -0
- package/build/esm/magnetometer-service.js.map +1 -0
- package/build/esm/magnetometer.d.ts +9 -0
- package/build/esm/magnetometer.js +12 -0
- package/build/esm/magnetometer.js.map +1 -0
- package/build/esm/package.json +1 -0
- package/build/esm/promise-queue.d.ts +27 -0
- package/build/esm/promise-queue.js +74 -0
- package/build/esm/promise-queue.js.map +1 -0
- package/build/esm/serial-events.d.ts +20 -0
- package/build/esm/serial-events.js +61 -0
- package/build/esm/serial-events.js.map +1 -0
- package/build/esm/service-events.d.ts +17 -0
- package/build/{service-events.js → esm/service-events.js} +12 -0
- package/build/esm/service-events.js.map +1 -0
- package/build/esm/setupTests.d.ts +6 -0
- package/build/{setupTests.js.map → esm/setupTests.js.map} +1 -1
- package/build/esm/uart-service.d.ts +13 -0
- package/build/esm/uart-service.js +72 -0
- package/build/esm/uart-service.js.map +1 -0
- package/build/esm/uart.d.ts +4 -0
- package/build/esm/uart.js +12 -0
- package/build/esm/uart.js.map +1 -0
- package/build/esm/usb-device-wrapper.d.ts +47 -0
- package/build/{usb-device-wrapper.js → esm/usb-device-wrapper.js} +36 -12
- package/build/esm/usb-device-wrapper.js.map +1 -0
- package/build/esm/usb-partial-flashing-utils.d.ts +17 -0
- package/build/esm/usb-partial-flashing-utils.js.map +1 -0
- package/build/esm/usb-partial-flashing.d.ts +69 -0
- package/build/{usb-partial-flashing.js → esm/usb-partial-flashing.js} +8 -10
- package/build/esm/usb-partial-flashing.js.map +1 -0
- package/build/esm/usb-radio-bridge.d.ts +24 -0
- package/build/{usb-radio-bridge.js → esm/usb-radio-bridge.js} +133 -47
- package/build/esm/usb-radio-bridge.js.map +1 -0
- package/build/esm/usb-serial-protocol.d.ts +66 -0
- package/build/esm/usb-serial-protocol.js.map +1 -0
- package/build/esm/usb.d.ts +64 -0
- package/build/{usb.js → esm/usb.js} +188 -67
- package/build/esm/usb.js.map +1 -0
- package/package.json +23 -9
- package/typedoc.json +14 -0
- package/build/accelerometer-service.js.map +0 -1
- package/build/accelerometer.js.map +0 -1
- package/build/async-util.js.map +0 -1
- package/build/bluetooth-device-wrapper.js.map +0 -1
- package/build/bluetooth-profile.js.map +0 -1
- package/build/bluetooth-utils.d.ts +0 -5
- package/build/bluetooth-utils.js +0 -14
- package/build/bluetooth-utils.js.map +0 -1
- package/build/bluetooth.d.ts +0 -49
- package/build/bluetooth.js.map +0 -1
- package/build/board-id.js.map +0 -1
- package/build/board-serial-info.js.map +0 -1
- package/build/button-service.js.map +0 -1
- package/build/buttons.js.map +0 -1
- package/build/constants.js.map +0 -1
- package/build/device.js.map +0 -1
- package/build/events.js +0 -19
- package/build/events.js.map +0 -1
- package/build/hex-flash-data-source.js.map +0 -1
- package/build/index.d.ts +0 -10
- package/build/index.js +0 -8
- package/build/index.js.map +0 -1
- package/build/logging.js.map +0 -1
- package/build/service-events.js.map +0 -1
- package/build/usb-device-wrapper.js.map +0 -1
- package/build/usb-partial-flashing-utils.js.map +0 -1
- package/build/usb-partial-flashing.js.map +0 -1
- package/build/usb-radio-bridge.d.ts +0 -37
- package/build/usb-radio-bridge.js.map +0 -1
- package/build/usb-serial-protocol.js.map +0 -1
- package/build/usb.d.ts +0 -60
- package/build/usb.js.map +0 -1
- package/vite.config.ts +0 -32
- /package/build/{accelerometer.d.ts → cjs/accelerometer.d.ts} +0 -0
- /package/build/{async-util.d.ts → cjs/async-util.d.ts} +0 -0
- /package/build/{bluetooth-profile.d.ts → cjs/bluetooth-profile.d.ts} +0 -0
- /package/build/{board-id.d.ts → cjs/board-id.d.ts} +0 -0
- /package/build/{board-serial-info.d.ts → cjs/board-serial-info.d.ts} +0 -0
- /package/build/{buttons.d.ts → cjs/buttons.d.ts} +0 -0
- /package/build/{constants.d.ts → cjs/constants.d.ts} +0 -0
- /package/build/{hex-flash-data-source.d.ts → cjs/hex-flash-data-source.d.ts} +0 -0
- /package/build/{setupTests.d.ts → cjs/setupTests.d.ts} +0 -0
- /package/build/{usb-partial-flashing-utils.d.ts → cjs/usb-partial-flashing-utils.d.ts} +0 -0
- /package/build/{usb-serial-protocol.d.ts → cjs/usb-serial-protocol.d.ts} +0 -0
- /package/build/{accelerometer.js → esm/accelerometer.js} +0 -0
- /package/build/{async-util.js → esm/async-util.js} +0 -0
- /package/build/{bluetooth-profile.js → esm/bluetooth-profile.js} +0 -0
- /package/build/{board-id.js → esm/board-id.js} +0 -0
- /package/build/{board-serial-info.js → esm/board-serial-info.js} +0 -0
- /package/build/{button-service.js → esm/button-service.js} +0 -0
- /package/build/{buttons.js → esm/buttons.js} +0 -0
- /package/build/{constants.js → esm/constants.js} +0 -0
- /package/build/{hex-flash-data-source.js → esm/hex-flash-data-source.js} +0 -0
- /package/build/{logging.js → esm/logging.js} +0 -0
- /package/build/{usb-partial-flashing-utils.js → esm/usb-partial-flashing-utils.js} +0 -0
- /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
|
|
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
|
|
73
|
-
this.daplink = new
|
|
74
|
-
this.cortexM = new
|
|
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
|
|
108
|
-
this.daplink = new
|
|
109
|
-
this.cortexM = new
|
|
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
|
-
|
|
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(
|
|
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(
|
|
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
|
|
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(
|
|
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(
|
|
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
|
-
|
|
296
|
-
|
|
297
|
-
return this.memoryMapToPaddedBytes(fromHex(hex));
|
|
297
|
+
const m = MemoryMap.fromHex(hex);
|
|
298
|
+
return this.memoryMapToPaddedBytes(m);
|
|
298
299
|
}
|
|
299
300
|
paddedBytesToHexString(data) {
|
|
300
|
-
|
|
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
|
-
|
|
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, "
|
|
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.
|
|
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.
|
|
114
|
+
this.delegate.addEventListener("status", this.delegateStatusListener);
|
|
81
115
|
}
|
|
82
116
|
dispose() {
|
|
83
|
-
this.delegate.removeEventListener("status", this.
|
|
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),
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
}
|
|
117
|
-
|
|
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
|
-
|
|
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.
|
|
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,
|
|
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, "
|
|
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:
|
|
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: (
|
|
236
|
-
this.logging.error("Serial error",
|
|
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
|
-
|
|
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.
|
|
376
|
+
this.isRestartingConnection = false;
|
|
377
|
+
await this.startConnectionCheck();
|
|
378
|
+
this.callbacks.onSuccess();
|
|
316
379
|
}
|
|
317
380
|
catch (e) {
|
|
318
|
-
this.
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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;
|