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