@microbit/microbit-connection 0.0.0-tab.change.177 → 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.
- package/LICENSE.md +21 -0
- package/README.md +94 -5
- package/build/cjs/accelerometer-service.d.ts +18 -0
- package/build/cjs/accelerometer-service.js +105 -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/{async-util.d.ts → cjs/async-util.d.ts} +9 -0
- package/build/cjs/async-util.js +47 -0
- package/build/cjs/async-util.js.map +1 -0
- package/build/cjs/bluetooth-device-wrapper.d.ts +97 -0
- package/build/cjs/bluetooth-device-wrapper.js +486 -0
- package/build/cjs/bluetooth-device-wrapper.js.map +1 -0
- package/build/{bluetooth-profile.d.ts → cjs/bluetooth-profile.d.ts} +43 -35
- package/build/cjs/bluetooth-profile.js +92 -0
- package/build/cjs/bluetooth-profile.js.map +1 -0
- package/build/cjs/bluetooth.d.ts +112 -0
- package/build/cjs/bluetooth.js +458 -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/cjs/button-service.d.ts +13 -0
- package/build/cjs/button-service.js +66 -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/cjs/device-information-service.d.ts +6 -0
- package/build/cjs/device-information-service.js +34 -0
- package/build/cjs/device-information-service.js.map +1 -0
- package/build/{device.d.ts → cjs/device.d.ts} +71 -39
- package/build/cjs/device.js +147 -0
- package/build/cjs/device.js.map +1 -0
- package/build/cjs/dfu-service.d.ts +9 -0
- package/build/cjs/dfu-service.js +26 -0
- package/build/cjs/dfu-service.js.map +1 -0
- package/build/{events.d.ts → cjs/events.d.ts} +1 -2
- package/build/cjs/events.js +109 -0
- package/build/cjs/events.js.map +1 -0
- package/build/cjs/flashing/flashing-full.d.ts +14 -0
- package/build/cjs/flashing/flashing-full.js +87 -0
- package/build/cjs/flashing/flashing-full.js.map +1 -0
- package/build/cjs/flashing/flashing-makecode.d.ts +6 -0
- package/build/cjs/flashing/flashing-makecode.js +48 -0
- package/build/cjs/flashing/flashing-makecode.js.map +1 -0
- package/build/cjs/flashing/flashing-partial.d.ts +9 -0
- package/build/cjs/flashing/flashing-partial.js +98 -0
- package/build/cjs/flashing/flashing-partial.js.map +1 -0
- package/build/cjs/flashing/flashing-v1.d.ts +11 -0
- package/build/cjs/flashing/flashing-v1.js +24 -0
- package/build/cjs/flashing/flashing-v1.js.map +1 -0
- package/build/cjs/flashing/nordic-dfu.d.ts +3 -0
- package/build/cjs/flashing/nordic-dfu.js +214 -0
- package/build/cjs/flashing/nordic-dfu.js.map +1 -0
- package/build/cjs/flashing/zip.d.ts +12 -0
- package/build/cjs/flashing/zip.js +177 -0
- package/build/cjs/flashing/zip.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 +37 -0
- package/build/cjs/index.js.map +1 -0
- package/build/cjs/led-service.d.ts +18 -0
- package/build/cjs/led-service.js +89 -0
- package/build/cjs/led-service.js.map +1 -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} +4 -4
- package/build/cjs/logging.js +16 -0
- package/build/cjs/logging.js.map +1 -0
- package/build/cjs/magnetometer-service.d.ts +18 -0
- package/build/cjs/magnetometer-service.js +94 -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/partial-flashing-service.d.ts +45 -0
- package/build/cjs/partial-flashing-service.js +110 -0
- package/build/cjs/partial-flashing-service.js.map +1 -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 +12 -0
- package/build/cjs/uart-service.js +55 -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} +1 -6
- package/build/cjs/usb-device-wrapper.js +437 -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 -5
- package/build/cjs/usb-partial-flashing.js +342 -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 +515 -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 +66 -0
- package/build/cjs/usb.js +662 -0
- package/build/cjs/usb.js.map +1 -0
- package/build/esm/accelerometer-service.d.ts +18 -0
- package/build/esm/accelerometer-service.js +101 -0
- 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 +22 -0
- package/build/esm/async-util.js +38 -0
- package/build/esm/async-util.js.map +1 -0
- package/build/esm/bluetooth-device-wrapper.d.ts +97 -0
- package/build/esm/bluetooth-device-wrapper.js +481 -0
- package/build/esm/bluetooth-device-wrapper.js.map +1 -0
- package/build/esm/bluetooth-profile.d.ts +147 -0
- package/build/{bluetooth-profile.js → esm/bluetooth-profile.js} +35 -29
- package/build/esm/bluetooth-profile.js.map +1 -0
- package/build/esm/bluetooth.d.ts +112 -0
- package/build/esm/bluetooth.js +428 -0
- 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 +62 -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-information-service.d.ts +6 -0
- package/build/esm/device-information-service.js +30 -0
- package/build/esm/device-information-service.js.map +1 -0
- package/build/esm/device.d.ts +238 -0
- package/build/{device.js → esm/device.js} +16 -58
- package/build/esm/device.js.map +1 -0
- package/build/esm/dfu-service.d.ts +9 -0
- package/build/esm/dfu-service.js +22 -0
- package/build/esm/dfu-service.js.map +1 -0
- package/build/esm/events.d.ts +110 -0
- package/build/esm/events.js.map +1 -0
- package/build/esm/flashing/flashing-full.d.ts +14 -0
- package/build/esm/flashing/flashing-full.js +84 -0
- package/build/esm/flashing/flashing-full.js.map +1 -0
- package/build/esm/flashing/flashing-makecode.d.ts +6 -0
- package/build/esm/flashing/flashing-makecode.js +44 -0
- package/build/esm/flashing/flashing-makecode.js.map +1 -0
- package/build/esm/flashing/flashing-partial.d.ts +9 -0
- package/build/esm/flashing/flashing-partial.js +95 -0
- package/build/esm/flashing/flashing-partial.js.map +1 -0
- package/build/esm/flashing/flashing-v1.d.ts +11 -0
- package/build/esm/flashing/flashing-v1.js +20 -0
- package/build/esm/flashing/flashing-v1.js.map +1 -0
- package/build/esm/flashing/nordic-dfu.d.ts +3 -0
- package/build/esm/flashing/nordic-dfu.js +211 -0
- package/build/esm/flashing/nordic-dfu.js.map +1 -0
- package/build/esm/flashing/zip.d.ts +12 -0
- package/build/esm/flashing/zip.js +174 -0
- package/build/esm/flashing/zip.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 +18 -0
- package/build/esm/led-service.js +85 -0
- package/build/esm/led-service.js.map +1 -0
- package/build/esm/led.d.ts +6 -0
- package/build/esm/led.js.map +1 -0
- package/build/esm/logging.d.ts +21 -0
- package/build/{logging.js → esm/logging.js} +1 -1
- package/build/esm/logging.js.map +1 -0
- package/build/esm/magnetometer-service.d.ts +18 -0
- package/build/esm/magnetometer-service.js +90 -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/partial-flashing-service.d.ts +45 -0
- package/build/esm/partial-flashing-service.js +106 -0
- package/build/esm/partial-flashing-service.js.map +1 -0
- package/build/esm/promise-queue.d.ts +27 -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 +12 -0
- package/build/esm/uart-service.js +51 -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} +43 -17
- 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 +67 -0
- package/build/{usb-partial-flashing.js → esm/usb-partial-flashing.js} +12 -13
- 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} +13 -7
- 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 +66 -0
- package/build/{usb.js → esm/usb.js} +257 -49
- package/build/esm/usb.js.map +1 -0
- package/package.json +25 -8
- package/typedoc.json +14 -0
- package/build/accelerometer-service.d.ts +0 -18
- package/build/accelerometer-service.js +0 -102
- package/build/accelerometer-service.js.map +0 -1
- package/build/accelerometer.js.map +0 -1
- package/build/async-util.js +0 -22
- package/build/async-util.js.map +0 -1
- package/build/bluetooth-device-wrapper.d.ts +0 -57
- package/build/bluetooth-device-wrapper.js +0 -433
- package/build/bluetooth-device-wrapper.js.map +0 -1
- package/build/bluetooth-profile.js.map +0 -1
- package/build/bluetooth.d.ts +0 -54
- package/build/bluetooth.js +0 -243
- 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.d.ts +0 -13
- package/build/button-service.js +0 -76
- 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.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/led-service.d.ts +0 -20
- package/build/led-service.js +0 -116
- package/build/led-service.js.map +0 -1
- package/build/led.js.map +0 -1
- package/build/logging.js.map +0 -1
- package/build/promise-queue.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 -41
- package/build/usb-radio-bridge.js.map +0 -1
- package/build/usb-serial-protocol.js.map +0 -1
- package/build/usb.d.ts +0 -54
- package/build/usb.js.map +0 -1
- package/vite.config.ts +0 -34
- /package/build/{accelerometer.d.ts → cjs/accelerometer.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/{led.d.ts → cjs/led.d.ts} +0 -0
- /package/build/{promise-queue.d.ts → cjs/promise-queue.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/{board-id.js → esm/board-id.js} +0 -0
- /package/build/{board-serial-info.js → esm/board-serial-info.js} +0 -0
- /package/build/{buttons.js → esm/buttons.js} +0 -0
- /package/build/{constants.js → esm/constants.js} +0 -0
- /package/build/{events.js → esm/events.js} +0 -0
- /package/build/{hex-flash-data-source.js → esm/hex-flash-data-source.js} +0 -0
- /package/build/{led.js → esm/led.js} +0 -0
- /package/build/{promise-queue.js → esm/promise-queue.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
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { BluetoothDeviceWrapper } from "../bluetooth-device-wrapper";
|
|
2
|
+
import { BoardVersion, ProgressCallback } from "../device";
|
|
3
|
+
export declare function flashDfu(connection: BluetoothDeviceWrapper, boardVersion: BoardVersion, appBin: Uint8Array, progress: ProgressCallback): Promise<void>;
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.flashDfu = flashDfu;
|
|
4
|
+
const core_1 = require("@capacitor/core");
|
|
5
|
+
const filesystem_1 = require("@capacitor/filesystem");
|
|
6
|
+
const capacitor_community_nordic_dfu_1 = require("@microbit/capacitor-community-nordic-dfu");
|
|
7
|
+
const zip_1 = require("./zip");
|
|
8
|
+
const device_1 = require("../device");
|
|
9
|
+
const appBinFilename = "application.bin";
|
|
10
|
+
const appDatFilename = "application.dat";
|
|
11
|
+
const manifestData = JSON.stringify({
|
|
12
|
+
manifest: {
|
|
13
|
+
application: {
|
|
14
|
+
bin_file: appBinFilename,
|
|
15
|
+
dat_file: appDatFilename,
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
|
+
});
|
|
19
|
+
function uint8ArrayToBase64(uint8Array) {
|
|
20
|
+
let binary = "";
|
|
21
|
+
const len = uint8Array.byteLength;
|
|
22
|
+
for (let i = 0; i < len; i++) {
|
|
23
|
+
binary += String.fromCharCode(uint8Array[i]);
|
|
24
|
+
}
|
|
25
|
+
return btoa(binary);
|
|
26
|
+
}
|
|
27
|
+
async function writeCacheFile(options) {
|
|
28
|
+
const directory = filesystem_1.Directory.Cache;
|
|
29
|
+
const { uri } = await filesystem_1.Filesystem.writeFile({ directory, ...options });
|
|
30
|
+
return uri;
|
|
31
|
+
}
|
|
32
|
+
async function createDfuZipFile(boardVersion, appBin) {
|
|
33
|
+
const createInitPacket = boardVersion === "V1" ? createLegacyInitPacketV1 : createInitPacketV2;
|
|
34
|
+
const encoder = new TextEncoder();
|
|
35
|
+
const zipData = (0, zip_1.createZip)([
|
|
36
|
+
{ name: appDatFilename, data: createInitPacket(appBin) },
|
|
37
|
+
{ name: appBinFilename, data: appBin },
|
|
38
|
+
{ name: "manifest.json", data: encoder.encode(manifestData) },
|
|
39
|
+
]);
|
|
40
|
+
return await writeCacheFile({
|
|
41
|
+
path: "dfu.zip",
|
|
42
|
+
data: uint8ArrayToBase64(zipData),
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
async function getFilePath(boardVersion, appBin) {
|
|
46
|
+
const uri = await createDfuZipFile(boardVersion, appBin);
|
|
47
|
+
return { uri, filename: "dfu.zip" };
|
|
48
|
+
}
|
|
49
|
+
async function cleanupTemporaryFile(connection, filename) {
|
|
50
|
+
try {
|
|
51
|
+
await filesystem_1.Filesystem.deleteFile({
|
|
52
|
+
directory: filesystem_1.Directory.Cache,
|
|
53
|
+
path: filename,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
// File might not exist or already deleted, ignore errors
|
|
58
|
+
connection.error(`Could not delete temporary file ${filename}`, error);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
async function flashDfu(connection, boardVersion, appBin, progress) {
|
|
62
|
+
const { device } = connection;
|
|
63
|
+
const { uri: filePath, filename } = await getFilePath(boardVersion, appBin);
|
|
64
|
+
let listener;
|
|
65
|
+
try {
|
|
66
|
+
// eslint-disable-next-line no-async-promise-executor
|
|
67
|
+
await new Promise(async (resolve, reject) => {
|
|
68
|
+
listener = await capacitor_community_nordic_dfu_1.NordicDfu.addListener("DFUStateChanged", ({ state, data }) => {
|
|
69
|
+
switch (state) {
|
|
70
|
+
case capacitor_community_nordic_dfu_1.DfuState.DFU_COMPLETED: {
|
|
71
|
+
progress(device_1.ProgressStage.FullFlashing, 1);
|
|
72
|
+
resolve();
|
|
73
|
+
break;
|
|
74
|
+
}
|
|
75
|
+
case capacitor_community_nordic_dfu_1.DfuState.DFU_ABORTED: {
|
|
76
|
+
reject(new device_1.DeviceError({
|
|
77
|
+
code: "flash-cancelled",
|
|
78
|
+
message: "Flash operation was cancelled",
|
|
79
|
+
}));
|
|
80
|
+
break;
|
|
81
|
+
}
|
|
82
|
+
case capacitor_community_nordic_dfu_1.DfuState.DFU_PROGRESS: {
|
|
83
|
+
if (typeof data.percent === "number") {
|
|
84
|
+
progress(device_1.ProgressStage.FullFlashing, data.percent / 100);
|
|
85
|
+
}
|
|
86
|
+
break;
|
|
87
|
+
}
|
|
88
|
+
case capacitor_community_nordic_dfu_1.DfuState.DFU_FAILED: {
|
|
89
|
+
reject(new device_1.DeviceError({
|
|
90
|
+
code: "flash-full-failed",
|
|
91
|
+
message: "Full flash via DFU failed",
|
|
92
|
+
}));
|
|
93
|
+
break;
|
|
94
|
+
}
|
|
95
|
+
default: {
|
|
96
|
+
connection.log(`DFU state: ${state}`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
// Note this doesn't await the whole DFU process, just its initialization
|
|
101
|
+
const error = await capacitor_community_nordic_dfu_1.NordicDfu.startDFU({
|
|
102
|
+
deviceName: device.name,
|
|
103
|
+
deviceAddress: device.deviceId,
|
|
104
|
+
filePath,
|
|
105
|
+
dfuOptions: core_1.Capacitor.getPlatform() === "android"
|
|
106
|
+
? {
|
|
107
|
+
...{
|
|
108
|
+
V1: { forceDfu: true },
|
|
109
|
+
V2: {
|
|
110
|
+
unsafeExperimentalButtonlessServiceInSecureDfuEnabled: true,
|
|
111
|
+
disableNotification: true,
|
|
112
|
+
restoreBond: true,
|
|
113
|
+
},
|
|
114
|
+
}[boardVersion],
|
|
115
|
+
startAsForegroundService: false,
|
|
116
|
+
keepBond: true,
|
|
117
|
+
packetReceiptNotificationsEnabled: true,
|
|
118
|
+
}
|
|
119
|
+
: {},
|
|
120
|
+
});
|
|
121
|
+
if (error) {
|
|
122
|
+
connection.error(`DFU Error: ${error.message}`, error);
|
|
123
|
+
reject(new device_1.DeviceError({
|
|
124
|
+
code: "flash-full-failed",
|
|
125
|
+
message: error.message || "Full flash via DFU failed",
|
|
126
|
+
}));
|
|
127
|
+
}
|
|
128
|
+
// Final resolution will come from listener callbacks.
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
finally {
|
|
132
|
+
await listener?.remove();
|
|
133
|
+
await cleanupTemporaryFile(connection, filename);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
const createLegacyInitPacketV1 = (appData) => {
|
|
137
|
+
// Legacy DFU init packet structure for micro:bit V1
|
|
138
|
+
// Based on: dev-type 0xFFFF, dev-revision 0xFFFFFFFF, application-version 0xFFFFFFFF, sd-req 0x64
|
|
139
|
+
const buffer = new ArrayBuffer(14);
|
|
140
|
+
const view = new DataView(buffer);
|
|
141
|
+
const uint8View = new Uint8Array(buffer);
|
|
142
|
+
let offset = 0;
|
|
143
|
+
// Device Type (2 bytes, little-endian) - 0xFFFF (wildcard)
|
|
144
|
+
view.setUint16(offset, 0xffff, true);
|
|
145
|
+
offset += 2;
|
|
146
|
+
// Device Revision (2 bytes, little-endian) - 0xFFFF (wildcard, truncated from 0xFFFFFFFF)
|
|
147
|
+
view.setUint16(offset, 0xffff, true);
|
|
148
|
+
offset += 2;
|
|
149
|
+
// Application Version (4 bytes, little-endian) - 0xFFFFFFFF (wildcard)
|
|
150
|
+
view.setUint32(offset, 0xffffffff, true);
|
|
151
|
+
offset += 4;
|
|
152
|
+
// SoftDevice length (2 bytes, little-endian) - 1 (one SoftDevice requirement)
|
|
153
|
+
view.setUint16(offset, 1, true);
|
|
154
|
+
offset += 2;
|
|
155
|
+
// SoftDevice requirement (2 bytes, little-endian) - 0x0064 (S110 v10.0)
|
|
156
|
+
view.setUint16(offset, 0x0064, true);
|
|
157
|
+
offset += 2;
|
|
158
|
+
// CRC-16 of the application (2 bytes, little-endian)
|
|
159
|
+
const crc16 = calculateCRC16(appData);
|
|
160
|
+
view.setUint16(offset, crc16, true);
|
|
161
|
+
return uint8View;
|
|
162
|
+
};
|
|
163
|
+
const calculateCRC16 = (data) => {
|
|
164
|
+
// CRC-16/CCITT-FALSE (polynomial 0x1021, initial value 0xFFFF)
|
|
165
|
+
let crc = 0xffff;
|
|
166
|
+
for (let i = 0; i < data.length; i++) {
|
|
167
|
+
crc ^= data[i] << 8;
|
|
168
|
+
for (let j = 0; j < 8; j++) {
|
|
169
|
+
if (crc & 0x8000) {
|
|
170
|
+
crc = (crc << 1) ^ 0x1021;
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
crc = crc << 1;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
return crc & 0xffff;
|
|
178
|
+
};
|
|
179
|
+
const createInitPacketV2 = (appBin) => {
|
|
180
|
+
//typedef struct {
|
|
181
|
+
// uint8_t magic[12]; // identify this struct "microbit_app"
|
|
182
|
+
// uint32_t version; // version of this struct == 1
|
|
183
|
+
// uint32_t app_size; // only used for DFU_FW_TYPE_APPLICATION
|
|
184
|
+
// uint32_t hash_size; // 32 => DFU_HASH_TYPE_SHA256 or zero to bypass hash check
|
|
185
|
+
// uint8_t hash_bytes[32]; // hash of whole DFU download
|
|
186
|
+
//} microbit_dfu_app_t;
|
|
187
|
+
const appSize = appBin.length;
|
|
188
|
+
const magic = "microbit_app";
|
|
189
|
+
const version = 1;
|
|
190
|
+
const hashSize = 0;
|
|
191
|
+
const hash = new Uint8Array(32).fill(0);
|
|
192
|
+
const buffer = new ArrayBuffer(12 + 4 + 4 + 4 + 32); // total: 56 bytes
|
|
193
|
+
const view = new DataView(buffer);
|
|
194
|
+
const uint8View = new Uint8Array(buffer);
|
|
195
|
+
let offset = 0;
|
|
196
|
+
// Write magic string (12 bytes)
|
|
197
|
+
const encoder = new TextEncoder();
|
|
198
|
+
const magicBytes = encoder.encode(magic);
|
|
199
|
+
uint8View.set(magicBytes, offset);
|
|
200
|
+
offset += 12;
|
|
201
|
+
// Write version (4 bytes, little-endian)
|
|
202
|
+
view.setUint32(offset, version, true);
|
|
203
|
+
offset += 4;
|
|
204
|
+
// Write appSize (4 bytes, little-endian)
|
|
205
|
+
view.setUint32(offset, appSize, true);
|
|
206
|
+
offset += 4;
|
|
207
|
+
// Write hashSize (4 bytes, little-endian)
|
|
208
|
+
view.setUint32(offset, hashSize, true);
|
|
209
|
+
offset += 4;
|
|
210
|
+
// Write hash (32 bytes)
|
|
211
|
+
uint8View.set(hash, offset);
|
|
212
|
+
return uint8View;
|
|
213
|
+
};
|
|
214
|
+
//# sourceMappingURL=nordic-dfu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nordic-dfu.js","sourceRoot":"","sources":["../../../lib/flashing/nordic-dfu.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimal ZIP file creator using STORE method (no compression).
|
|
3
|
+
* Sufficient for creating Nordic DFU packages.
|
|
4
|
+
*/
|
|
5
|
+
export interface ZipEntry {
|
|
6
|
+
name: string;
|
|
7
|
+
data: Uint8Array;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Creates a ZIP file containing the given entries with no compression.
|
|
11
|
+
*/
|
|
12
|
+
export declare function createZip(entries: ZipEntry[]): Uint8Array;
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Minimal ZIP file creator using STORE method (no compression).
|
|
4
|
+
* Sufficient for creating Nordic DFU packages.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.createZip = createZip;
|
|
8
|
+
/**
|
|
9
|
+
* Creates a ZIP file containing the given entries with no compression.
|
|
10
|
+
*/
|
|
11
|
+
function createZip(entries) {
|
|
12
|
+
const encoder = new TextEncoder();
|
|
13
|
+
// Calculate total size needed
|
|
14
|
+
let totalSize = 22; // End of central directory
|
|
15
|
+
for (const entry of entries) {
|
|
16
|
+
const nameBytes = encoder.encode(entry.name);
|
|
17
|
+
totalSize += 30 + nameBytes.length + entry.data.length; // Local file header + data
|
|
18
|
+
totalSize += 46 + nameBytes.length; // Central directory entry
|
|
19
|
+
}
|
|
20
|
+
const buffer = new ArrayBuffer(totalSize);
|
|
21
|
+
const view = new DataView(buffer);
|
|
22
|
+
const bytes = new Uint8Array(buffer);
|
|
23
|
+
let localOffset = 0;
|
|
24
|
+
const centralDirectoryEntries = [];
|
|
25
|
+
// Write local file headers and data
|
|
26
|
+
for (const entry of entries) {
|
|
27
|
+
const nameBytes = encoder.encode(entry.name);
|
|
28
|
+
const crc = crc32(entry.data);
|
|
29
|
+
const fileOffset = localOffset;
|
|
30
|
+
// Local file header signature
|
|
31
|
+
view.setUint32(localOffset, 0x04034b50, true);
|
|
32
|
+
localOffset += 4;
|
|
33
|
+
// Version needed to extract (2.0)
|
|
34
|
+
view.setUint16(localOffset, 20, true);
|
|
35
|
+
localOffset += 2;
|
|
36
|
+
// General purpose bit flag
|
|
37
|
+
view.setUint16(localOffset, 0, true);
|
|
38
|
+
localOffset += 2;
|
|
39
|
+
// Compression method (0 = STORE)
|
|
40
|
+
view.setUint16(localOffset, 0, true);
|
|
41
|
+
localOffset += 2;
|
|
42
|
+
// Last mod file time (0)
|
|
43
|
+
view.setUint16(localOffset, 0, true);
|
|
44
|
+
localOffset += 2;
|
|
45
|
+
// Last mod file date (0)
|
|
46
|
+
view.setUint16(localOffset, 0, true);
|
|
47
|
+
localOffset += 2;
|
|
48
|
+
// CRC-32
|
|
49
|
+
view.setUint32(localOffset, crc, true);
|
|
50
|
+
localOffset += 4;
|
|
51
|
+
// Compressed size (same as uncompressed for STORE)
|
|
52
|
+
view.setUint32(localOffset, entry.data.length, true);
|
|
53
|
+
localOffset += 4;
|
|
54
|
+
// Uncompressed size
|
|
55
|
+
view.setUint32(localOffset, entry.data.length, true);
|
|
56
|
+
localOffset += 4;
|
|
57
|
+
// File name length
|
|
58
|
+
view.setUint16(localOffset, nameBytes.length, true);
|
|
59
|
+
localOffset += 2;
|
|
60
|
+
// Extra field length
|
|
61
|
+
view.setUint16(localOffset, 0, true);
|
|
62
|
+
localOffset += 2;
|
|
63
|
+
// File name
|
|
64
|
+
bytes.set(nameBytes, localOffset);
|
|
65
|
+
localOffset += nameBytes.length;
|
|
66
|
+
// File data
|
|
67
|
+
bytes.set(entry.data, localOffset);
|
|
68
|
+
localOffset += entry.data.length;
|
|
69
|
+
centralDirectoryEntries.push({
|
|
70
|
+
nameBytes,
|
|
71
|
+
crc,
|
|
72
|
+
size: entry.data.length,
|
|
73
|
+
offset: fileOffset,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
const centralDirectoryOffset = localOffset;
|
|
77
|
+
// Write central directory
|
|
78
|
+
for (const entry of centralDirectoryEntries) {
|
|
79
|
+
// Central file header signature
|
|
80
|
+
view.setUint32(localOffset, 0x02014b50, true);
|
|
81
|
+
localOffset += 4;
|
|
82
|
+
// Version made by (2.0, DOS)
|
|
83
|
+
view.setUint16(localOffset, 20, true);
|
|
84
|
+
localOffset += 2;
|
|
85
|
+
// Version needed to extract (2.0)
|
|
86
|
+
view.setUint16(localOffset, 20, true);
|
|
87
|
+
localOffset += 2;
|
|
88
|
+
// General purpose bit flag
|
|
89
|
+
view.setUint16(localOffset, 0, true);
|
|
90
|
+
localOffset += 2;
|
|
91
|
+
// Compression method (0 = STORE)
|
|
92
|
+
view.setUint16(localOffset, 0, true);
|
|
93
|
+
localOffset += 2;
|
|
94
|
+
// Last mod file time
|
|
95
|
+
view.setUint16(localOffset, 0, true);
|
|
96
|
+
localOffset += 2;
|
|
97
|
+
// Last mod file date
|
|
98
|
+
view.setUint16(localOffset, 0, true);
|
|
99
|
+
localOffset += 2;
|
|
100
|
+
// CRC-32
|
|
101
|
+
view.setUint32(localOffset, entry.crc, true);
|
|
102
|
+
localOffset += 4;
|
|
103
|
+
// Compressed size
|
|
104
|
+
view.setUint32(localOffset, entry.size, true);
|
|
105
|
+
localOffset += 4;
|
|
106
|
+
// Uncompressed size
|
|
107
|
+
view.setUint32(localOffset, entry.size, true);
|
|
108
|
+
localOffset += 4;
|
|
109
|
+
// File name length
|
|
110
|
+
view.setUint16(localOffset, entry.nameBytes.length, true);
|
|
111
|
+
localOffset += 2;
|
|
112
|
+
// Extra field length
|
|
113
|
+
view.setUint16(localOffset, 0, true);
|
|
114
|
+
localOffset += 2;
|
|
115
|
+
// File comment length
|
|
116
|
+
view.setUint16(localOffset, 0, true);
|
|
117
|
+
localOffset += 2;
|
|
118
|
+
// Disk number start
|
|
119
|
+
view.setUint16(localOffset, 0, true);
|
|
120
|
+
localOffset += 2;
|
|
121
|
+
// Internal file attributes
|
|
122
|
+
view.setUint16(localOffset, 0, true);
|
|
123
|
+
localOffset += 2;
|
|
124
|
+
// External file attributes
|
|
125
|
+
view.setUint32(localOffset, 0, true);
|
|
126
|
+
localOffset += 4;
|
|
127
|
+
// Relative offset of local header
|
|
128
|
+
view.setUint32(localOffset, entry.offset, true);
|
|
129
|
+
localOffset += 4;
|
|
130
|
+
// File name
|
|
131
|
+
bytes.set(entry.nameBytes, localOffset);
|
|
132
|
+
localOffset += entry.nameBytes.length;
|
|
133
|
+
}
|
|
134
|
+
const centralDirectorySize = localOffset - centralDirectoryOffset;
|
|
135
|
+
// End of central directory record
|
|
136
|
+
// Signature
|
|
137
|
+
view.setUint32(localOffset, 0x06054b50, true);
|
|
138
|
+
localOffset += 4;
|
|
139
|
+
// Number of this disk
|
|
140
|
+
view.setUint16(localOffset, 0, true);
|
|
141
|
+
localOffset += 2;
|
|
142
|
+
// Disk where central directory starts
|
|
143
|
+
view.setUint16(localOffset, 0, true);
|
|
144
|
+
localOffset += 2;
|
|
145
|
+
// Number of central directory records on this disk
|
|
146
|
+
view.setUint16(localOffset, entries.length, true);
|
|
147
|
+
localOffset += 2;
|
|
148
|
+
// Total number of central directory records
|
|
149
|
+
view.setUint16(localOffset, entries.length, true);
|
|
150
|
+
localOffset += 2;
|
|
151
|
+
// Size of central directory
|
|
152
|
+
view.setUint32(localOffset, centralDirectorySize, true);
|
|
153
|
+
localOffset += 4;
|
|
154
|
+
// Offset of start of central directory
|
|
155
|
+
view.setUint32(localOffset, centralDirectoryOffset, true);
|
|
156
|
+
localOffset += 4;
|
|
157
|
+
// Comment length
|
|
158
|
+
view.setUint16(localOffset, 0, true);
|
|
159
|
+
return bytes;
|
|
160
|
+
}
|
|
161
|
+
// CRC-32 lookup table
|
|
162
|
+
const crc32Table = new Uint32Array(256);
|
|
163
|
+
for (let i = 0; i < 256; i++) {
|
|
164
|
+
let c = i;
|
|
165
|
+
for (let j = 0; j < 8; j++) {
|
|
166
|
+
c = c & 1 ? 0xedb88320 ^ (c >>> 1) : c >>> 1;
|
|
167
|
+
}
|
|
168
|
+
crc32Table[i] = c;
|
|
169
|
+
}
|
|
170
|
+
function crc32(data) {
|
|
171
|
+
let crc = 0xffffffff;
|
|
172
|
+
for (let i = 0; i < data.length; i++) {
|
|
173
|
+
crc = crc32Table[(crc ^ data[i]) & 0xff] ^ (crc >>> 8);
|
|
174
|
+
}
|
|
175
|
+
return (crc ^ 0xffffffff) >>> 0;
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=zip.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zip.js","sourceRoot":"","sources":["../../../lib/flashing/zip.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createUniversalHexFlashDataSource = void 0;
|
|
4
|
+
const board_id_js_1 = require("./board-id.js");
|
|
5
|
+
const device_js_1 = require("./device.js");
|
|
6
|
+
const microbit_universal_hex_1 = require("@microbit/microbit-universal-hex");
|
|
7
|
+
/**
|
|
8
|
+
* A flash data source that converts universal hex files as needed.
|
|
9
|
+
*
|
|
10
|
+
* @param universalHex A hex file, potentially universal.
|
|
11
|
+
*/
|
|
12
|
+
const createUniversalHexFlashDataSource = (universalHex) => {
|
|
13
|
+
return (boardVersion) => {
|
|
14
|
+
if ((0, microbit_universal_hex_1.isUniversalHex)(universalHex)) {
|
|
15
|
+
const parts = (0, microbit_universal_hex_1.separateUniversalHex)(universalHex);
|
|
16
|
+
const matching = parts.find((p) => p.boardId == board_id_js_1.BoardId.forVersion(boardVersion).id);
|
|
17
|
+
if (!matching) {
|
|
18
|
+
throw new device_js_1.FlashDataError("No matching part");
|
|
19
|
+
}
|
|
20
|
+
return Promise.resolve(matching.hex);
|
|
21
|
+
}
|
|
22
|
+
return Promise.resolve(universalHex);
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
exports.createUniversalHexFlashDataSource = createUniversalHexFlashDataSource;
|
|
26
|
+
//# sourceMappingURL=hex-flash-data-source.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hex-flash-data-source.js","sourceRoot":"","sources":["../../lib/hex-flash-data-source.ts"],"names":[],"mappings":";;;AAAA,+CAAwC;AACxC,2CAIqB;AACrB,6EAG0C;AAE1C;;;;GAIG;AACI,MAAM,iCAAiC,GAAG,CAC/C,YAAoB,EACH,EAAE;IACnB,OAAO,CAAC,YAA0B,EAAE,EAAE;QACpC,IAAI,IAAA,uCAAc,EAAC,YAAY,CAAC,EAAE,CAAC;YACjC,MAAM,KAAK,GAAG,IAAA,6CAAoB,EAAC,YAAY,CAAC,CAAC;YACjD,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CACzB,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,IAAI,qBAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,EAAE,CACxD,CAAC;YACF,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,MAAM,IAAI,0BAAc,CAAC,kBAAkB,CAAC,CAAC;YAC/C,CAAC;YACD,OAAO,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACvC,CAAC;QACD,OAAO,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IACvC,CAAC,CAAC;AACJ,CAAC,CAAC;AAhBW,QAAA,iCAAiC,qCAgB5C"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { AccelerometerData, AccelerometerDataEvent } from "./accelerometer.js";
|
|
2
|
+
import { createWebBluetoothConnection, MicrobitWebBluetoothConnection, MicrobitWebBluetoothConnectionOptions } from "./bluetooth.js";
|
|
3
|
+
import { BoardId } from "./board-id.js";
|
|
4
|
+
import { ButtonEvent, ButtonEventType, ButtonState } from "./buttons.js";
|
|
5
|
+
import { AfterRequestDevice, BackgroundErrorEvent, BeforeRequestDevice, BoardVersion, ConnectOptions, ConnectionStatus, ConnectionStatusEvent, DeviceConnection, DeviceConnectionEventMap, DeviceError, DeviceErrorCode, FlashDataError, FlashDataSource, FlashOptions, ProgressCallback, ProgressStage } from "./device.js";
|
|
6
|
+
import { TypedEventTarget } from "./events.js";
|
|
7
|
+
import { createUniversalHexFlashDataSource } from "./hex-flash-data-source.js";
|
|
8
|
+
import { LedMatrix } from "./led.js";
|
|
9
|
+
import { Logging, LoggingEvent } from "./logging.js";
|
|
10
|
+
import { MagnetometerData, MagnetometerDataEvent } from "./magnetometer.js";
|
|
11
|
+
import { FlashEvent, SerialConnectionEventMap, SerialDataEvent, SerialErrorEvent, SerialResetEvent } from "./serial-events.js";
|
|
12
|
+
import { ServiceConnectionEventMap } from "./service-events.js";
|
|
13
|
+
import { UARTDataEvent } from "./uart.js";
|
|
14
|
+
import { createRadioBridgeConnection, MicrobitRadioBridgeConnection, MicrobitRadioBridgeConnectionOptions } from "./usb-radio-bridge.js";
|
|
15
|
+
import { createWebUSBConnection, DeviceSelectionMode, MicrobitWebUSBConnection, MicrobitWebUSBConnectionOptions } from "./usb.js";
|
|
16
|
+
export { AfterRequestDevice, BackgroundErrorEvent, BeforeRequestDevice, BoardId, ConnectionStatus, ConnectionStatusEvent, createRadioBridgeConnection, createUniversalHexFlashDataSource, createWebBluetoothConnection, createWebUSBConnection, DeviceConnectionEventMap, DeviceSelectionMode, DeviceError, FlashDataError, FlashEvent, ProgressStage, SerialConnectionEventMap, SerialDataEvent, SerialErrorEvent, SerialResetEvent, ServiceConnectionEventMap, TypedEventTarget, UARTDataEvent, };
|
|
17
|
+
export type { AccelerometerData, AccelerometerDataEvent, BoardVersion, ButtonEvent, ButtonEventType, ButtonState, ConnectOptions, DeviceConnection, DeviceErrorCode, FlashDataSource, FlashOptions, LedMatrix, Logging, LoggingEvent, MagnetometerData, MagnetometerDataEvent, MicrobitRadioBridgeConnection, MicrobitRadioBridgeConnectionOptions, MicrobitWebBluetoothConnection, MicrobitWebBluetoothConnectionOptions, MicrobitWebUSBConnection, MicrobitWebUSBConnectionOptions, ProgressCallback, };
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.UARTDataEvent = exports.TypedEventTarget = exports.ServiceConnectionEventMap = exports.SerialResetEvent = exports.SerialErrorEvent = exports.SerialDataEvent = exports.SerialConnectionEventMap = exports.ProgressStage = exports.FlashEvent = exports.FlashDataError = exports.DeviceError = exports.DeviceSelectionMode = exports.DeviceConnectionEventMap = exports.createWebUSBConnection = exports.createWebBluetoothConnection = exports.createUniversalHexFlashDataSource = exports.createRadioBridgeConnection = exports.ConnectionStatusEvent = exports.ConnectionStatus = exports.BoardId = exports.BeforeRequestDevice = exports.BackgroundErrorEvent = exports.AfterRequestDevice = void 0;
|
|
4
|
+
const bluetooth_js_1 = require("./bluetooth.js");
|
|
5
|
+
Object.defineProperty(exports, "createWebBluetoothConnection", { enumerable: true, get: function () { return bluetooth_js_1.createWebBluetoothConnection; } });
|
|
6
|
+
const board_id_js_1 = require("./board-id.js");
|
|
7
|
+
Object.defineProperty(exports, "BoardId", { enumerable: true, get: function () { return board_id_js_1.BoardId; } });
|
|
8
|
+
const device_js_1 = require("./device.js");
|
|
9
|
+
Object.defineProperty(exports, "AfterRequestDevice", { enumerable: true, get: function () { return device_js_1.AfterRequestDevice; } });
|
|
10
|
+
Object.defineProperty(exports, "BackgroundErrorEvent", { enumerable: true, get: function () { return device_js_1.BackgroundErrorEvent; } });
|
|
11
|
+
Object.defineProperty(exports, "BeforeRequestDevice", { enumerable: true, get: function () { return device_js_1.BeforeRequestDevice; } });
|
|
12
|
+
Object.defineProperty(exports, "ConnectionStatus", { enumerable: true, get: function () { return device_js_1.ConnectionStatus; } });
|
|
13
|
+
Object.defineProperty(exports, "ConnectionStatusEvent", { enumerable: true, get: function () { return device_js_1.ConnectionStatusEvent; } });
|
|
14
|
+
Object.defineProperty(exports, "DeviceConnectionEventMap", { enumerable: true, get: function () { return device_js_1.DeviceConnectionEventMap; } });
|
|
15
|
+
Object.defineProperty(exports, "DeviceError", { enumerable: true, get: function () { return device_js_1.DeviceError; } });
|
|
16
|
+
Object.defineProperty(exports, "FlashDataError", { enumerable: true, get: function () { return device_js_1.FlashDataError; } });
|
|
17
|
+
Object.defineProperty(exports, "ProgressStage", { enumerable: true, get: function () { return device_js_1.ProgressStage; } });
|
|
18
|
+
const events_js_1 = require("./events.js");
|
|
19
|
+
Object.defineProperty(exports, "TypedEventTarget", { enumerable: true, get: function () { return events_js_1.TypedEventTarget; } });
|
|
20
|
+
const hex_flash_data_source_js_1 = require("./hex-flash-data-source.js");
|
|
21
|
+
Object.defineProperty(exports, "createUniversalHexFlashDataSource", { enumerable: true, get: function () { return hex_flash_data_source_js_1.createUniversalHexFlashDataSource; } });
|
|
22
|
+
const serial_events_js_1 = require("./serial-events.js");
|
|
23
|
+
Object.defineProperty(exports, "FlashEvent", { enumerable: true, get: function () { return serial_events_js_1.FlashEvent; } });
|
|
24
|
+
Object.defineProperty(exports, "SerialConnectionEventMap", { enumerable: true, get: function () { return serial_events_js_1.SerialConnectionEventMap; } });
|
|
25
|
+
Object.defineProperty(exports, "SerialDataEvent", { enumerable: true, get: function () { return serial_events_js_1.SerialDataEvent; } });
|
|
26
|
+
Object.defineProperty(exports, "SerialErrorEvent", { enumerable: true, get: function () { return serial_events_js_1.SerialErrorEvent; } });
|
|
27
|
+
Object.defineProperty(exports, "SerialResetEvent", { enumerable: true, get: function () { return serial_events_js_1.SerialResetEvent; } });
|
|
28
|
+
const service_events_js_1 = require("./service-events.js");
|
|
29
|
+
Object.defineProperty(exports, "ServiceConnectionEventMap", { enumerable: true, get: function () { return service_events_js_1.ServiceConnectionEventMap; } });
|
|
30
|
+
const uart_js_1 = require("./uart.js");
|
|
31
|
+
Object.defineProperty(exports, "UARTDataEvent", { enumerable: true, get: function () { return uart_js_1.UARTDataEvent; } });
|
|
32
|
+
const usb_radio_bridge_js_1 = require("./usb-radio-bridge.js");
|
|
33
|
+
Object.defineProperty(exports, "createRadioBridgeConnection", { enumerable: true, get: function () { return usb_radio_bridge_js_1.createRadioBridgeConnection; } });
|
|
34
|
+
const usb_js_1 = require("./usb.js");
|
|
35
|
+
Object.defineProperty(exports, "createWebUSBConnection", { enumerable: true, get: function () { return usb_js_1.createWebUSBConnection; } });
|
|
36
|
+
Object.defineProperty(exports, "DeviceSelectionMode", { enumerable: true, get: function () { return usb_js_1.DeviceSelectionMode; } });
|
|
37
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../lib/index.ts"],"names":[],"mappings":";;;AACA,iDAIwB;AAwDtB,6GA3DA,2CAA4B,OA2DA;AAvD9B,+CAAwC;AAkDtC,wFAlDO,qBAAO,OAkDP;AAhDT,2CAiBqB;AA4BnB,mGA5CA,8BAAkB,OA4CA;AAClB,qGA5CA,gCAAoB,OA4CA;AACpB,oGA5CA,+BAAmB,OA4CA;AAEnB,iGA3CA,4BAAgB,OA2CA;AAChB,sGA3CA,iCAAqB,OA2CA;AAKrB,yGA9CA,oCAAwB,OA8CA;AAExB,4FA/CA,uBAAW,OA+CA;AACX,+FA9CA,0BAAc,OA8CA;AAEd,8FA5CA,yBAAa,OA4CA;AA1Cf,2CAA+C;AAgD7C,iGAhDO,4BAAgB,OAgDP;AA/ClB,yEAA+E;AAiC7E,kHAjCO,4DAAiC,OAiCP;AA7BnC,yDAM4B;AA8B1B,2FAnCA,6BAAU,OAmCA;AAEV,yGApCA,2CAAwB,OAoCA;AACxB,gGApCA,kCAAe,OAoCA;AACf,iGApCA,mCAAgB,OAoCA;AAChB,iGApCA,mCAAgB,OAoCA;AAlClB,2DAAgE;AAmC9D,0GAnCO,6CAAyB,OAmCP;AAlC3B,uCAA0C;AAoCxC,8FApCO,uBAAa,OAoCP;AAnCf,+DAI+B;AAe7B,4GAlBA,iDAA2B,OAkBA;AAd7B,qCAKkB;AAYhB,uGAhBA,+BAAsB,OAgBA;AAEtB,oGAjBA,4BAAmB,OAiBA"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Service } from "./bluetooth-device-wrapper.js";
|
|
2
|
+
import { LedMatrix } from "./led.js";
|
|
3
|
+
import { TypedServiceEvent } from "./service-events.js";
|
|
4
|
+
export declare class LedService implements Service {
|
|
5
|
+
private deviceId;
|
|
6
|
+
uuid: string;
|
|
7
|
+
constructor(deviceId: string);
|
|
8
|
+
getRelevantEvents(): TypedServiceEvent[];
|
|
9
|
+
getLedMatrix(): Promise<LedMatrix>;
|
|
10
|
+
setLedMatrix(value: LedMatrix): Promise<void>;
|
|
11
|
+
private dataViewToLedMatrix;
|
|
12
|
+
private ledMatrixToDataView;
|
|
13
|
+
setText(text: string): Promise<void>;
|
|
14
|
+
setScrollingDelay(value: number): Promise<void>;
|
|
15
|
+
getScrollingDelay(): Promise<number>;
|
|
16
|
+
startNotifications(type: TypedServiceEvent): Promise<void>;
|
|
17
|
+
stopNotifications(type: TypedServiceEvent): Promise<void>;
|
|
18
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.LedService = void 0;
|
|
4
|
+
const bluetooth_le_1 = require("@capacitor-community/bluetooth-le");
|
|
5
|
+
const bluetooth_profile_js_1 = require("./bluetooth-profile.js");
|
|
6
|
+
const createLedMatrix = () => {
|
|
7
|
+
return [
|
|
8
|
+
[false, false, false, false, false],
|
|
9
|
+
[false, false, false, false, false],
|
|
10
|
+
[false, false, false, false, false],
|
|
11
|
+
[false, false, false, false, false],
|
|
12
|
+
[false, false, false, false, false],
|
|
13
|
+
];
|
|
14
|
+
};
|
|
15
|
+
class LedService {
|
|
16
|
+
constructor(deviceId) {
|
|
17
|
+
Object.defineProperty(this, "deviceId", {
|
|
18
|
+
enumerable: true,
|
|
19
|
+
configurable: true,
|
|
20
|
+
writable: true,
|
|
21
|
+
value: deviceId
|
|
22
|
+
});
|
|
23
|
+
Object.defineProperty(this, "uuid", {
|
|
24
|
+
enumerable: true,
|
|
25
|
+
configurable: true,
|
|
26
|
+
writable: true,
|
|
27
|
+
value: bluetooth_profile_js_1.profile.led.id
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
getRelevantEvents() {
|
|
31
|
+
return [];
|
|
32
|
+
}
|
|
33
|
+
async getLedMatrix() {
|
|
34
|
+
const dataView = await bluetooth_le_1.BleClient.read(this.deviceId, bluetooth_profile_js_1.profile.led.id, bluetooth_profile_js_1.profile.led.characteristics.matrixState.id);
|
|
35
|
+
return this.dataViewToLedMatrix(dataView);
|
|
36
|
+
}
|
|
37
|
+
async setLedMatrix(value) {
|
|
38
|
+
const dataView = this.ledMatrixToDataView(value);
|
|
39
|
+
await bluetooth_le_1.BleClient.write(this.deviceId, bluetooth_profile_js_1.profile.led.id, bluetooth_profile_js_1.profile.led.characteristics.matrixState.id, dataView);
|
|
40
|
+
}
|
|
41
|
+
dataViewToLedMatrix(dataView) {
|
|
42
|
+
if (dataView.byteLength !== 5) {
|
|
43
|
+
throw new Error("Unexpected LED matrix byte length");
|
|
44
|
+
}
|
|
45
|
+
const matrix = createLedMatrix();
|
|
46
|
+
for (let row = 0; row < 5; ++row) {
|
|
47
|
+
const rowByte = dataView.getUint8(row);
|
|
48
|
+
for (let column = 0; column < 5; ++column) {
|
|
49
|
+
const columnMask = 0x1 << (4 - column);
|
|
50
|
+
matrix[row][column] = (rowByte & columnMask) != 0;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return matrix;
|
|
54
|
+
}
|
|
55
|
+
ledMatrixToDataView(matrix) {
|
|
56
|
+
const dataView = new DataView(new ArrayBuffer(5));
|
|
57
|
+
for (let row = 0; row < 5; ++row) {
|
|
58
|
+
let rowByte = 0;
|
|
59
|
+
for (let column = 0; column < 5; ++column) {
|
|
60
|
+
const columnMask = 0x1 << (4 - column);
|
|
61
|
+
if (matrix[row][column]) {
|
|
62
|
+
rowByte |= columnMask;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
dataView.setUint8(row, rowByte);
|
|
66
|
+
}
|
|
67
|
+
return dataView;
|
|
68
|
+
}
|
|
69
|
+
async setText(text) {
|
|
70
|
+
const bytes = new TextEncoder().encode(text);
|
|
71
|
+
if (bytes.length > 20) {
|
|
72
|
+
throw new Error("Text must be <= 20 bytes when encoded as UTF-8");
|
|
73
|
+
}
|
|
74
|
+
await bluetooth_le_1.BleClient.write(this.deviceId, bluetooth_profile_js_1.profile.led.id, bluetooth_profile_js_1.profile.led.characteristics.text.id, new DataView(bytes.buffer));
|
|
75
|
+
}
|
|
76
|
+
async setScrollingDelay(value) {
|
|
77
|
+
const dataView = new DataView(new ArrayBuffer(2));
|
|
78
|
+
dataView.setUint16(0, value, true);
|
|
79
|
+
await bluetooth_le_1.BleClient.write(this.deviceId, bluetooth_profile_js_1.profile.led.id, bluetooth_profile_js_1.profile.led.characteristics.scrollingDelay.id, dataView);
|
|
80
|
+
}
|
|
81
|
+
async getScrollingDelay() {
|
|
82
|
+
const dataView = await bluetooth_le_1.BleClient.read(this.deviceId, bluetooth_profile_js_1.profile.led.id, bluetooth_profile_js_1.profile.led.characteristics.scrollingDelay.id);
|
|
83
|
+
return dataView.getUint16(0, true);
|
|
84
|
+
}
|
|
85
|
+
async startNotifications(type) { }
|
|
86
|
+
async stopNotifications(type) { }
|
|
87
|
+
}
|
|
88
|
+
exports.LedService = LedService;
|
|
89
|
+
//# sourceMappingURL=led-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"led-service.js","sourceRoot":"","sources":["../../lib/led-service.ts"],"names":[],"mappings":"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"}
|