@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
package/build/cjs/logging.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logging.js","sourceRoot":"","sources":["../../lib/logging.ts"],"names":[],"mappings":";;;AAkBA,MAAa,
|
|
1
|
+
{"version":3,"file":"logging.js","sourceRoot":"","sources":["../../lib/logging.ts"],"names":[],"mappings":";;;AAkBA,MAAa,cAAc;IACzB,KAAK,CAAC,MAAoB;QACxB,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACtB,CAAC;IACD,KAAK,CAAC,EAAU,EAAE,EAAW;QAC3B,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IACxB,CAAC;IACD,GAAG,CAAC,EAAO;QACT,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;CACF;AAVD,wCAUC"}
|
|
@@ -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,34 +1,17 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.MagnetometerService = void 0;
|
|
4
|
-
const
|
|
4
|
+
const bluetooth_le_1 = require("@capacitor-community/bluetooth-le");
|
|
5
5
|
const bluetooth_profile_js_1 = require("./bluetooth-profile.js");
|
|
6
|
+
const magnetometer_js_1 = require("./magnetometer.js");
|
|
6
7
|
const device_js_1 = require("./device.js");
|
|
7
8
|
class MagnetometerService {
|
|
8
|
-
constructor(
|
|
9
|
-
Object.defineProperty(this, "
|
|
9
|
+
constructor(deviceId, dispatchTypedEvent) {
|
|
10
|
+
Object.defineProperty(this, "deviceId", {
|
|
10
11
|
enumerable: true,
|
|
11
12
|
configurable: true,
|
|
12
13
|
writable: true,
|
|
13
|
-
value:
|
|
14
|
-
});
|
|
15
|
-
Object.defineProperty(this, "magnetometerPeriodCharacteristic", {
|
|
16
|
-
enumerable: true,
|
|
17
|
-
configurable: true,
|
|
18
|
-
writable: true,
|
|
19
|
-
value: magnetometerPeriodCharacteristic
|
|
20
|
-
});
|
|
21
|
-
Object.defineProperty(this, "magnetometerBearingCharacteristic", {
|
|
22
|
-
enumerable: true,
|
|
23
|
-
configurable: true,
|
|
24
|
-
writable: true,
|
|
25
|
-
value: magnetometerBearingCharacteristic
|
|
26
|
-
});
|
|
27
|
-
Object.defineProperty(this, "magnetometerCalibrationCharacteristic", {
|
|
28
|
-
enumerable: true,
|
|
29
|
-
configurable: true,
|
|
30
|
-
writable: true,
|
|
31
|
-
value: magnetometerCalibrationCharacteristic
|
|
14
|
+
value: deviceId
|
|
32
15
|
});
|
|
33
16
|
Object.defineProperty(this, "dispatchTypedEvent", {
|
|
34
17
|
enumerable: true,
|
|
@@ -36,40 +19,15 @@ class MagnetometerService {
|
|
|
36
19
|
writable: true,
|
|
37
20
|
value: dispatchTypedEvent
|
|
38
21
|
});
|
|
39
|
-
Object.defineProperty(this, "
|
|
22
|
+
Object.defineProperty(this, "uuid", {
|
|
40
23
|
enumerable: true,
|
|
41
24
|
configurable: true,
|
|
42
25
|
writable: true,
|
|
43
|
-
value:
|
|
44
|
-
});
|
|
45
|
-
this.magnetometerDataCharacteristic.addEventListener("characteristicvaluechanged", (event) => {
|
|
46
|
-
const target = event.target;
|
|
47
|
-
const data = this.dataViewToData(target.value);
|
|
48
|
-
this.dispatchTypedEvent("magnetometerdatachanged", new magnetometer_js_1.MagnetometerDataEvent(data));
|
|
26
|
+
value: bluetooth_profile_js_1.profile.magnetometer.id
|
|
49
27
|
});
|
|
50
28
|
}
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
try {
|
|
54
|
-
magnetometerService = await gattServer.getPrimaryService(bluetooth_profile_js_1.profile.magnetometer.id);
|
|
55
|
-
}
|
|
56
|
-
catch (err) {
|
|
57
|
-
if (listenerInit) {
|
|
58
|
-
dispatcher("backgrounderror", new device_js_1.BackgroundErrorEvent(err));
|
|
59
|
-
return;
|
|
60
|
-
}
|
|
61
|
-
else {
|
|
62
|
-
throw new device_js_1.DeviceError({
|
|
63
|
-
code: "service-missing",
|
|
64
|
-
message: err,
|
|
65
|
-
});
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
const magnetometerDataCharacteristic = await magnetometerService.getCharacteristic(bluetooth_profile_js_1.profile.magnetometer.characteristics.data.id);
|
|
69
|
-
const magnetometerPeriodCharacteristic = await magnetometerService.getCharacteristic(bluetooth_profile_js_1.profile.magnetometer.characteristics.period.id);
|
|
70
|
-
const magnetometerBearingCharacteristic = await magnetometerService.getCharacteristic(bluetooth_profile_js_1.profile.magnetometer.characteristics.bearing.id);
|
|
71
|
-
const magnetometerCalibrationCharacteristic = await magnetometerService.getCharacteristic(bluetooth_profile_js_1.profile.magnetometer.characteristics.calibration.id);
|
|
72
|
-
return new MagnetometerService(magnetometerDataCharacteristic, magnetometerPeriodCharacteristic, magnetometerBearingCharacteristic, magnetometerCalibrationCharacteristic, dispatcher, queueGattOperation);
|
|
29
|
+
getRelevantEvents() {
|
|
30
|
+
return ["magnetometerdatachanged"];
|
|
73
31
|
}
|
|
74
32
|
dataViewToData(dataView) {
|
|
75
33
|
return {
|
|
@@ -79,11 +37,11 @@ class MagnetometerService {
|
|
|
79
37
|
};
|
|
80
38
|
}
|
|
81
39
|
async getData() {
|
|
82
|
-
const dataView = await this.
|
|
40
|
+
const dataView = await bluetooth_le_1.BleClient.read(this.deviceId, bluetooth_profile_js_1.profile.magnetometer.id, bluetooth_profile_js_1.profile.magnetometer.characteristics.data.id);
|
|
83
41
|
return this.dataViewToData(dataView);
|
|
84
42
|
}
|
|
85
43
|
async getPeriod() {
|
|
86
|
-
const dataView = await this.
|
|
44
|
+
const dataView = await bluetooth_le_1.BleClient.read(this.deviceId, bluetooth_profile_js_1.profile.magnetometer.id, bluetooth_profile_js_1.profile.magnetometer.characteristics.period.id);
|
|
87
45
|
return dataView.getUint16(0, true);
|
|
88
46
|
}
|
|
89
47
|
async setPeriod(value) {
|
|
@@ -97,30 +55,37 @@ class MagnetometerService {
|
|
|
97
55
|
// https://lancaster-university.github.io/microbit-docs/ble/profile/#about-the-magnetometer-service
|
|
98
56
|
const dataView = new DataView(new ArrayBuffer(2));
|
|
99
57
|
dataView.setUint16(0, value, true);
|
|
100
|
-
|
|
58
|
+
await bluetooth_le_1.BleClient.write(this.deviceId, bluetooth_profile_js_1.profile.magnetometer.id, bluetooth_profile_js_1.profile.magnetometer.characteristics.period.id, dataView);
|
|
101
59
|
}
|
|
102
60
|
async getBearing() {
|
|
103
|
-
const dataView = await this.
|
|
61
|
+
const dataView = await bluetooth_le_1.BleClient.read(this.deviceId, bluetooth_profile_js_1.profile.magnetometer.id, bluetooth_profile_js_1.profile.magnetometer.characteristics.bearing.id);
|
|
104
62
|
return dataView.getUint16(0, true);
|
|
105
63
|
}
|
|
106
64
|
async triggerCalibration() {
|
|
107
65
|
const dataView = new DataView(new ArrayBuffer(1));
|
|
108
66
|
dataView.setUint8(0, 1);
|
|
109
|
-
|
|
67
|
+
await bluetooth_le_1.BleClient.write(this.deviceId, bluetooth_profile_js_1.profile.magnetometer.id, bluetooth_profile_js_1.profile.magnetometer.characteristics.calibration.id, dataView);
|
|
110
68
|
}
|
|
111
69
|
async startNotifications(type) {
|
|
112
|
-
|
|
70
|
+
if (type === "magnetometerdatachanged") {
|
|
71
|
+
try {
|
|
72
|
+
await bluetooth_le_1.BleClient.startNotifications(this.deviceId, bluetooth_profile_js_1.profile.magnetometer.id, bluetooth_profile_js_1.profile.magnetometer.characteristics.data.id, (value) => {
|
|
73
|
+
const data = this.dataViewToData(value);
|
|
74
|
+
this.dispatchTypedEvent("magnetometerdatachanged", new magnetometer_js_1.MagnetometerDataEvent(data));
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
catch (e) {
|
|
78
|
+
this.dispatchTypedEvent("backgrounderror", new device_js_1.BackgroundErrorEvent("Failed to start notifications", e));
|
|
79
|
+
}
|
|
80
|
+
}
|
|
113
81
|
}
|
|
114
82
|
async stopNotifications(type) {
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
switch (type) {
|
|
119
|
-
case "magnetometerdatachanged": {
|
|
120
|
-
return this.magnetometerDataCharacteristic;
|
|
83
|
+
if (type === "magnetometerdatachanged") {
|
|
84
|
+
try {
|
|
85
|
+
await bluetooth_le_1.BleClient.stopNotifications(this.deviceId, bluetooth_profile_js_1.profile.magnetometer.id, bluetooth_profile_js_1.profile.magnetometer.characteristics.data.id);
|
|
121
86
|
}
|
|
122
|
-
|
|
123
|
-
|
|
87
|
+
catch (e) {
|
|
88
|
+
this.dispatchTypedEvent("backgrounderror", new device_js_1.BackgroundErrorEvent("Failed to stop notifications", e));
|
|
124
89
|
}
|
|
125
90
|
}
|
|
126
91
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"magnetometer-service.js","sourceRoot":"","sources":["../../lib/magnetometer-service.ts"],"names":[],"mappings":";;;AAAA,
|
|
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,110 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PartialFlashingService = exports.PacketState = exports.RegionId = exports.MicroBitMode = void 0;
|
|
4
|
+
/* eslint-disable @typescript-eslint/no-unsafe-enum-comparison */
|
|
5
|
+
const bluetooth_le_1 = require("@capacitor-community/bluetooth-le");
|
|
6
|
+
const bluetooth_profile_1 = require("./bluetooth-profile");
|
|
7
|
+
const MICROBIT_RESET_COMMAND = 0xff;
|
|
8
|
+
const REGION_INFO_COMMAND = 0x0;
|
|
9
|
+
const FLASH_COMMAND = 0x1;
|
|
10
|
+
var MicroBitMode;
|
|
11
|
+
(function (MicroBitMode) {
|
|
12
|
+
MicroBitMode[MicroBitMode["Pairing"] = 0] = "Pairing";
|
|
13
|
+
MicroBitMode[MicroBitMode["Application"] = 1] = "Application";
|
|
14
|
+
})(MicroBitMode || (exports.MicroBitMode = MicroBitMode = {}));
|
|
15
|
+
var RegionId;
|
|
16
|
+
(function (RegionId) {
|
|
17
|
+
RegionId[RegionId["SoftDevice"] = 0] = "SoftDevice";
|
|
18
|
+
RegionId[RegionId["Dal"] = 1] = "Dal";
|
|
19
|
+
RegionId[RegionId["MakeCode"] = 2] = "MakeCode";
|
|
20
|
+
})(RegionId || (exports.RegionId = RegionId = {}));
|
|
21
|
+
var PacketState;
|
|
22
|
+
(function (PacketState) {
|
|
23
|
+
PacketState[PacketState["Retransmit"] = 170] = "Retransmit";
|
|
24
|
+
PacketState[PacketState["Success"] = 255] = "Success";
|
|
25
|
+
})(PacketState || (exports.PacketState = PacketState = {}));
|
|
26
|
+
/**
|
|
27
|
+
* Doesn't actually implement service as we don't expose this other than via
|
|
28
|
+
* the flash method.
|
|
29
|
+
*/
|
|
30
|
+
class PartialFlashingService {
|
|
31
|
+
constructor(connection) {
|
|
32
|
+
Object.defineProperty(this, "connection", {
|
|
33
|
+
enumerable: true,
|
|
34
|
+
configurable: true,
|
|
35
|
+
writable: true,
|
|
36
|
+
value: connection
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
async startNotifications(options) {
|
|
40
|
+
await this.connection.startInternalNotifications(bluetooth_profile_1.profile.partialFlashing.id, bluetooth_profile_1.profile.partialFlashing.characteristics.partialFlash.id, options);
|
|
41
|
+
}
|
|
42
|
+
async stopNotifications() {
|
|
43
|
+
await this.connection.stopInternalNotifications(bluetooth_profile_1.profile.partialFlashing.id, bluetooth_profile_1.profile.partialFlashing.characteristics.partialFlash.id);
|
|
44
|
+
}
|
|
45
|
+
async resetToMode(mode) {
|
|
46
|
+
await bluetooth_le_1.BleClient.writeWithoutResponse(this.connection.device.deviceId, bluetooth_profile_1.profile.partialFlashing.id, bluetooth_profile_1.profile.partialFlashing.characteristics.partialFlash.id, (0, bluetooth_le_1.numbersToDataView)([MICROBIT_RESET_COMMAND, mode]));
|
|
47
|
+
}
|
|
48
|
+
async getRegionInfo(region) {
|
|
49
|
+
return parseRegionResponse(await this.connection.writeForNotification(bluetooth_profile_1.profile.partialFlashing.id, bluetooth_profile_1.profile.partialFlashing.characteristics.partialFlash.id, (0, bluetooth_le_1.numbersToDataView)([REGION_INFO_COMMAND, region]), REGION_INFO_COMMAND));
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Writes a flash chunk.
|
|
53
|
+
* Use writeFlashForNotification for every 4th chunk.
|
|
54
|
+
*/
|
|
55
|
+
async writeFlash(source, batchAddress, dataOffset, packetNumber, packetInBatch) {
|
|
56
|
+
return await bluetooth_le_1.BleClient.writeWithoutResponse(this.connection.device.deviceId, bluetooth_profile_1.profile.partialFlashing.id, bluetooth_profile_1.profile.partialFlashing.characteristics.partialFlash.id, this.createWriteDataCommand(source, batchAddress, dataOffset, packetNumber, packetInBatch));
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Write a chunk and wait for a success/retransmit response.
|
|
60
|
+
* The micro:bit notifies on every 4th chunk.
|
|
61
|
+
*/
|
|
62
|
+
async writeFlashForNotification(source, batchAddress, dataOffset, packetNumber, packetInBatch) {
|
|
63
|
+
const result = await this.connection.writeForNotification(bluetooth_profile_1.profile.partialFlashing.id, bluetooth_profile_1.profile.partialFlashing.characteristics.partialFlash.id, this.createWriteDataCommand(source, batchAddress, dataOffset, packetNumber, packetInBatch), FLASH_COMMAND, (notificationValue) => notificationValue[1] === PacketState.Success ||
|
|
64
|
+
notificationValue[1] === PacketState.Retransmit);
|
|
65
|
+
return result[1];
|
|
66
|
+
}
|
|
67
|
+
async writeEndOfFlashPacket() {
|
|
68
|
+
return await bluetooth_le_1.BleClient.writeWithoutResponse(this.connection.device.deviceId, bluetooth_profile_1.profile.partialFlashing.id, bluetooth_profile_1.profile.partialFlashing.characteristics.partialFlash.id, (0, bluetooth_le_1.numbersToDataView)([0x02]));
|
|
69
|
+
}
|
|
70
|
+
createWriteDataCommand(source, batchAddress, dataOffset, packetNumber, packetInBatch) {
|
|
71
|
+
const data = new DataView(new ArrayBuffer(20));
|
|
72
|
+
data.setUint8(0, 0x01);
|
|
73
|
+
// Bytes 1-2: offset encoding
|
|
74
|
+
// Packet 0: low 16 bits of flash address
|
|
75
|
+
// Packet 1: high 16 bits of flash address
|
|
76
|
+
// Packets 2-3: offset within the 64-byte batch being written
|
|
77
|
+
let offsetValue;
|
|
78
|
+
if (packetInBatch === 0) {
|
|
79
|
+
offsetValue = batchAddress & 0xffff;
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
// Note: for packets 2 and 3 the offset is unused.
|
|
83
|
+
offsetValue = (batchAddress >> 16) & 0xffff;
|
|
84
|
+
}
|
|
85
|
+
data.setUint16(1, offsetValue);
|
|
86
|
+
data.setUint8(3, packetNumber);
|
|
87
|
+
const bytes = source.slicePad(dataOffset, 16);
|
|
88
|
+
for (let i = 0; i < 16; ++i) {
|
|
89
|
+
data.setUint8(4 + i, bytes[i]);
|
|
90
|
+
}
|
|
91
|
+
return data;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
exports.PartialFlashingService = PartialFlashingService;
|
|
95
|
+
const parseRegionResponse = (value) => {
|
|
96
|
+
const dataView = new DataView(value.buffer, value.byteOffset, value.byteLength);
|
|
97
|
+
const start = dataView.getUint32(2, false);
|
|
98
|
+
const end = dataView.getUint32(6, false);
|
|
99
|
+
if (start === 0 || start >= end) {
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
const hash = value.slice(10, 18);
|
|
103
|
+
return { start, end, hash: bytesToHex(hash) };
|
|
104
|
+
};
|
|
105
|
+
const bytesToHex = (bytes) => {
|
|
106
|
+
return Array.from(bytes)
|
|
107
|
+
.map((byte) => byte.toString(16).padStart(2, "0").toUpperCase())
|
|
108
|
+
.join("");
|
|
109
|
+
};
|
|
110
|
+
//# 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,22 +1,17 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.UARTService = void 0;
|
|
4
|
+
const bluetooth_le_1 = require("@capacitor-community/bluetooth-le");
|
|
4
5
|
const bluetooth_profile_js_1 = require("./bluetooth-profile.js");
|
|
5
|
-
const device_js_1 = require("./device.js");
|
|
6
6
|
const uart_js_1 = require("./uart.js");
|
|
7
|
+
const device_js_1 = require("./device.js");
|
|
7
8
|
class UARTService {
|
|
8
|
-
constructor(
|
|
9
|
-
Object.defineProperty(this, "
|
|
10
|
-
enumerable: true,
|
|
11
|
-
configurable: true,
|
|
12
|
-
writable: true,
|
|
13
|
-
value: txCharacteristic
|
|
14
|
-
});
|
|
15
|
-
Object.defineProperty(this, "rxCharacteristic", {
|
|
9
|
+
constructor(deviceId, dispatchTypedEvent) {
|
|
10
|
+
Object.defineProperty(this, "deviceId", {
|
|
16
11
|
enumerable: true,
|
|
17
12
|
configurable: true,
|
|
18
13
|
writable: true,
|
|
19
|
-
value:
|
|
14
|
+
value: deviceId
|
|
20
15
|
});
|
|
21
16
|
Object.defineProperty(this, "dispatchTypedEvent", {
|
|
22
17
|
enumerable: true,
|
|
@@ -24,52 +19,36 @@ class UARTService {
|
|
|
24
19
|
writable: true,
|
|
25
20
|
value: dispatchTypedEvent
|
|
26
21
|
});
|
|
27
|
-
Object.defineProperty(this, "
|
|
22
|
+
Object.defineProperty(this, "uuid", {
|
|
28
23
|
enumerable: true,
|
|
29
24
|
configurable: true,
|
|
30
25
|
writable: true,
|
|
31
|
-
value:
|
|
32
|
-
});
|
|
33
|
-
this.txCharacteristic.addEventListener("characteristicvaluechanged", (event) => {
|
|
34
|
-
const target = event.target;
|
|
35
|
-
const value = new Uint8Array(target.value.buffer);
|
|
36
|
-
this.dispatchTypedEvent("uartdata", new uart_js_1.UARTDataEvent(value));
|
|
26
|
+
value: bluetooth_profile_js_1.profile.uart.id
|
|
37
27
|
});
|
|
38
28
|
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
try {
|
|
42
|
-
uartService = await gattServer.getPrimaryService(bluetooth_profile_js_1.profile.uart.id);
|
|
43
|
-
}
|
|
44
|
-
catch (err) {
|
|
45
|
-
if (listenerInit) {
|
|
46
|
-
dispatcher("backgrounderror", new device_js_1.BackgroundErrorEvent(err));
|
|
47
|
-
return;
|
|
48
|
-
}
|
|
49
|
-
else {
|
|
50
|
-
throw new device_js_1.DeviceError({
|
|
51
|
-
code: "service-missing",
|
|
52
|
-
message: err,
|
|
53
|
-
});
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
const rxCharacteristic = await uartService.getCharacteristic(bluetooth_profile_js_1.profile.uart.characteristics.rx.id);
|
|
57
|
-
const txCharacteristic = await uartService.getCharacteristic(bluetooth_profile_js_1.profile.uart.characteristics.tx.id);
|
|
58
|
-
return new UARTService(txCharacteristic, rxCharacteristic, dispatcher, queueGattOperation);
|
|
29
|
+
getRelevantEvents() {
|
|
30
|
+
return ["uartdata"];
|
|
59
31
|
}
|
|
60
32
|
async startNotifications(type) {
|
|
61
33
|
if (type === "uartdata") {
|
|
62
|
-
|
|
34
|
+
try {
|
|
35
|
+
await bluetooth_le_1.BleClient.startNotifications(this.deviceId, bluetooth_profile_js_1.profile.uart.id, bluetooth_profile_js_1.profile.uart.characteristics.tx.id, (value) => {
|
|
36
|
+
this.dispatchTypedEvent("uartdata", new uart_js_1.UARTDataEvent(new Uint8Array(value.buffer)));
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
catch (e) {
|
|
40
|
+
this.dispatchTypedEvent("backgrounderror", new device_js_1.BackgroundErrorEvent("Failed to start notifications", e));
|
|
41
|
+
}
|
|
63
42
|
}
|
|
64
43
|
}
|
|
65
44
|
async stopNotifications(type) {
|
|
66
45
|
if (type === "uartdata") {
|
|
67
|
-
await
|
|
46
|
+
await bluetooth_le_1.BleClient.stopNotifications(this.deviceId, bluetooth_profile_js_1.profile.uart.id, bluetooth_profile_js_1.profile.uart.characteristics.tx.id);
|
|
68
47
|
}
|
|
69
48
|
}
|
|
70
49
|
async writeData(value) {
|
|
71
50
|
const dataView = new DataView(value.buffer);
|
|
72
|
-
|
|
51
|
+
await bluetooth_le_1.BleClient.writeWithoutResponse(this.deviceId, bluetooth_profile_js_1.profile.uart.id, bluetooth_profile_js_1.profile.uart.characteristics.rx.id, dataView);
|
|
73
52
|
}
|
|
74
53
|
}
|
|
75
54
|
exports.UARTService = UARTService;
|
|
@@ -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,oEAA8D;AAE9D,iEAAiD;AAKjD,uCAA0C;AAC1C,2CAAmD;AAEnD,MAAa,WAAW;IAGtB,YACU,QAAgB,EAChB,kBAA+C;QADvD;;;;mBAAQ,QAAQ;WAAQ;QACxB;;;;mBAAQ,kBAAkB;WAA6B;QAJzD;;;;mBAAO,8BAAO,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,wBAAS,CAAC,kBAAkB,CAChC,IAAI,CAAC,QAAQ,EACb,8BAAO,CAAC,IAAI,CAAC,EAAE,EACf,8BAAO,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC,EAAE,EAClC,CAAC,KAAe,EAAE,EAAE;oBAClB,IAAI,CAAC,kBAAkB,CACrB,UAAU,EACV,IAAI,uBAAa,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,gCAAoB,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,wBAAS,CAAC,iBAAiB,CAC/B,IAAI,CAAC,QAAQ,EACb,8BAAO,CAAC,IAAI,CAAC,EAAE,EACf,8BAAO,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,wBAAS,CAAC,oBAAoB,CAClC,IAAI,CAAC,QAAQ,EACb,8BAAO,CAAC,IAAI,CAAC,EAAE,EACf,8BAAO,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC,EAAE,EAClC,QAAQ,CACT,CAAC;IACJ,CAAC;CACF;AAtDD,kCAsDC"}
|
|
@@ -34,6 +34,7 @@ const { CortexM: CortexMValue, DAPLink: DAPLinkValue, WebUSB: WebUSBValue, } = d
|
|
|
34
34
|
const constants_js_1 = require("./constants.js");
|
|
35
35
|
const usb_partial_flashing_utils_js_1 = require("./usb-partial-flashing-utils.js");
|
|
36
36
|
const board_serial_info_js_1 = require("./board-serial-info.js");
|
|
37
|
+
const device_js_1 = require("./device.js");
|
|
37
38
|
class DAPWrapper {
|
|
38
39
|
constructor(device, logging) {
|
|
39
40
|
Object.defineProperty(this, "device", {
|
|
@@ -105,7 +106,10 @@ class DAPWrapper {
|
|
|
105
106
|
*/
|
|
106
107
|
get pageSize() {
|
|
107
108
|
if (this._pageSize === undefined) {
|
|
108
|
-
throw new
|
|
109
|
+
throw new device_js_1.DeviceError({
|
|
110
|
+
code: "reconnect-microbit",
|
|
111
|
+
message: "pageSize not defined until connected",
|
|
112
|
+
});
|
|
109
113
|
}
|
|
110
114
|
return this._pageSize;
|
|
111
115
|
}
|
|
@@ -114,7 +118,10 @@ class DAPWrapper {
|
|
|
114
118
|
*/
|
|
115
119
|
get numPages() {
|
|
116
120
|
if (this._numPages === undefined) {
|
|
117
|
-
throw new
|
|
121
|
+
throw new device_js_1.DeviceError({
|
|
122
|
+
code: "reconnect-microbit",
|
|
123
|
+
message: "numPages not defined until connected",
|
|
124
|
+
});
|
|
118
125
|
}
|
|
119
126
|
return this._numPages;
|
|
120
127
|
}
|
|
@@ -221,7 +228,10 @@ class DAPWrapper {
|
|
|
221
228
|
data.unshift(op);
|
|
222
229
|
const buf = await this.send(data);
|
|
223
230
|
if (buf[0] !== op) {
|
|
224
|
-
throw new
|
|
231
|
+
throw new device_js_1.DeviceError({
|
|
232
|
+
code: "reconnect-microbit",
|
|
233
|
+
message: `Bad response for ${op} -> ${buf[0]}`,
|
|
234
|
+
});
|
|
225
235
|
}
|
|
226
236
|
switch (op) {
|
|
227
237
|
case constants_js_1.DapCmd.DAP_CONNECT:
|
|
@@ -231,7 +241,10 @@ class DAPWrapper {
|
|
|
231
241
|
break;
|
|
232
242
|
default:
|
|
233
243
|
if (buf[1] !== 0) {
|
|
234
|
-
throw new
|
|
244
|
+
throw new device_js_1.DeviceError({
|
|
245
|
+
code: "reconnect-microbit",
|
|
246
|
+
message: `Bad status for ${op} -> ${buf[1]}`,
|
|
247
|
+
});
|
|
235
248
|
}
|
|
236
249
|
}
|
|
237
250
|
return buf;
|
|
@@ -247,10 +260,16 @@ class DAPWrapper {
|
|
|
247
260
|
// Transfer the read requests to the micro:bit and retrieve the data read.
|
|
248
261
|
const buf = await this.cmdNums(constants_js_1.DapCmd.DAP_TRANSFER, sendargs);
|
|
249
262
|
if (buf[1] !== cnt) {
|
|
250
|
-
throw new
|
|
263
|
+
throw new device_js_1.DeviceError({
|
|
264
|
+
code: "reconnect-microbit",
|
|
265
|
+
message: "(many) Bad #trans " + buf[1],
|
|
266
|
+
});
|
|
251
267
|
}
|
|
252
268
|
else if (buf[2] !== 1) {
|
|
253
|
-
throw new
|
|
269
|
+
throw new device_js_1.DeviceError({
|
|
270
|
+
code: "reconnect-microbit",
|
|
271
|
+
message: "(many) Bad transfer status " + buf[2],
|
|
272
|
+
});
|
|
254
273
|
}
|
|
255
274
|
return buf.subarray(3, 3 + cnt * 4);
|
|
256
275
|
}
|
|
@@ -266,7 +285,10 @@ class DAPWrapper {
|
|
|
266
285
|
// Transfer the write requests to the micro:bit and retrieve the response status.
|
|
267
286
|
const buf = await this.cmdNums(constants_js_1.DapCmd.DAP_TRANSFER_BLOCK, sendargs);
|
|
268
287
|
if (buf[3] !== 1) {
|
|
269
|
-
throw new
|
|
288
|
+
throw new device_js_1.DeviceError({
|
|
289
|
+
code: "reconnect-microbit",
|
|
290
|
+
message: "(many-wr) Bad transfer status " + buf[2],
|
|
291
|
+
});
|
|
270
292
|
}
|
|
271
293
|
}
|
|
272
294
|
// Core functionality reading a block of data from micro:bit RAM at a specified address.
|
|
@@ -366,7 +388,10 @@ class DAPWrapper {
|
|
|
366
388
|
// Recurses otherwise.
|
|
367
389
|
async waitForHaltCore(halted, deadline) {
|
|
368
390
|
if (new Date().getTime() > deadline) {
|
|
369
|
-
throw new
|
|
391
|
+
throw new device_js_1.DeviceError({
|
|
392
|
+
code: "timeout-error",
|
|
393
|
+
message: "timeout",
|
|
394
|
+
});
|
|
370
395
|
}
|
|
371
396
|
if (!halted) {
|
|
372
397
|
const isHalted = await this.cortexM.isHalted();
|