@microbit/microbit-connection 0.0.0-alpha.9 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +21 -0
- package/README.md +94 -5
- package/build/{accelerometer-service.d.ts → cjs/accelerometer-service.d.ts} +3 -3
- package/build/cjs/accelerometer-service.js +106 -0
- package/build/cjs/accelerometer-service.js.map +1 -0
- package/build/cjs/accelerometer.js +16 -0
- package/build/cjs/accelerometer.js.map +1 -0
- package/build/cjs/async-util.js +27 -0
- package/build/cjs/async-util.js.map +1 -0
- package/build/{bluetooth-device-wrapper.d.ts → cjs/bluetooth-device-wrapper.d.ts} +23 -15
- package/build/cjs/bluetooth-device-wrapper.js +467 -0
- package/build/cjs/bluetooth-device-wrapper.js.map +1 -0
- package/build/cjs/bluetooth-profile.js +86 -0
- package/build/cjs/bluetooth-profile.js.map +1 -0
- package/build/cjs/bluetooth.d.ts +108 -0
- package/build/cjs/bluetooth.js +272 -0
- package/build/cjs/bluetooth.js.map +1 -0
- package/build/cjs/board-id.js +81 -0
- package/build/cjs/board-id.js.map +1 -0
- package/build/cjs/board-serial-info.js +51 -0
- package/build/cjs/board-serial-info.js.map +1 -0
- package/build/{button-service.d.ts → cjs/button-service.d.ts} +2 -2
- package/build/cjs/button-service.js +80 -0
- package/build/cjs/button-service.js.map +1 -0
- package/build/cjs/buttons.js +22 -0
- package/build/cjs/buttons.js.map +1 -0
- package/build/cjs/constants.js +73 -0
- package/build/cjs/constants.js.map +1 -0
- package/build/{device.d.ts → cjs/device.d.ts} +35 -46
- package/build/cjs/device.js +133 -0
- package/build/cjs/device.js.map +1 -0
- package/build/{events.d.ts → cjs/events.d.ts} +12 -3
- package/build/cjs/events.js +109 -0
- package/build/cjs/events.js.map +1 -0
- package/build/cjs/hex-flash-data-source.js +26 -0
- package/build/cjs/hex-flash-data-source.js.map +1 -0
- package/build/cjs/index.d.ts +17 -0
- package/build/cjs/index.js +36 -0
- package/build/cjs/index.js.map +1 -0
- package/build/cjs/led-service.d.ts +20 -0
- package/build/cjs/led-service.js +120 -0
- package/build/cjs/led-service.js.map +1 -0
- package/build/cjs/led.d.ts +6 -0
- package/build/cjs/led.js +3 -0
- package/build/cjs/led.js.map +1 -0
- package/build/{logging.d.ts → cjs/logging.d.ts} +3 -3
- package/build/cjs/logging.js +16 -0
- package/build/cjs/logging.js.map +1 -0
- package/build/cjs/magnetometer-service.d.ts +22 -0
- package/build/cjs/magnetometer-service.js +129 -0
- package/build/cjs/magnetometer-service.js.map +1 -0
- package/build/cjs/magnetometer.d.ts +9 -0
- package/build/cjs/magnetometer.js +16 -0
- package/build/cjs/magnetometer.js.map +1 -0
- package/build/cjs/package.json +1 -0
- package/build/cjs/promise-queue.d.ts +27 -0
- package/build/cjs/promise-queue.js +78 -0
- package/build/cjs/promise-queue.js.map +1 -0
- package/build/cjs/serial-events.d.ts +20 -0
- package/build/cjs/serial-events.js +69 -0
- package/build/cjs/serial-events.js.map +1 -0
- package/build/{service-events.d.ts → cjs/service-events.d.ts} +4 -0
- package/build/cjs/service-events.js +39 -0
- package/build/cjs/service-events.js.map +1 -0
- package/build/cjs/setupTests.js.map +1 -0
- package/build/cjs/uart-service.d.ts +13 -0
- package/build/cjs/uart-service.js +76 -0
- package/build/cjs/uart-service.js.map +1 -0
- package/build/cjs/uart.d.ts +4 -0
- package/build/cjs/uart.js +16 -0
- package/build/cjs/uart.js.map +1 -0
- package/build/{usb-device-wrapper.d.ts → cjs/usb-device-wrapper.d.ts} +2 -6
- package/build/cjs/usb-device-wrapper.js +412 -0
- package/build/cjs/usb-device-wrapper.js.map +1 -0
- package/build/cjs/usb-partial-flashing-utils.js +133 -0
- package/build/cjs/usb-partial-flashing-utils.js.map +1 -0
- package/build/{usb-partial-flashing.d.ts → cjs/usb-partial-flashing.d.ts} +3 -3
- package/build/cjs/usb-partial-flashing.js +341 -0
- package/build/cjs/usb-partial-flashing.js.map +1 -0
- package/build/cjs/usb-radio-bridge.d.ts +24 -0
- package/build/cjs/usb-radio-bridge.js +516 -0
- package/build/cjs/usb-radio-bridge.js.map +1 -0
- package/build/cjs/usb-serial-protocol.js +183 -0
- package/build/cjs/usb-serial-protocol.js.map +1 -0
- package/build/cjs/usb.d.ts +64 -0
- package/build/cjs/usb.js +647 -0
- package/build/cjs/usb.js.map +1 -0
- package/build/esm/accelerometer-service.d.ts +18 -0
- package/build/{accelerometer-service.js → esm/accelerometer-service.js} +4 -20
- package/build/esm/accelerometer-service.js.map +1 -0
- package/build/esm/accelerometer.d.ts +9 -0
- package/build/esm/accelerometer.js.map +1 -0
- package/build/esm/async-util.d.ts +13 -0
- package/build/esm/async-util.js.map +1 -0
- package/build/esm/bluetooth-device-wrapper.d.ts +63 -0
- package/build/{bluetooth-device-wrapper.js → esm/bluetooth-device-wrapper.js} +105 -75
- package/build/esm/bluetooth-device-wrapper.js.map +1 -0
- package/build/esm/bluetooth-profile.d.ts +139 -0
- package/build/esm/bluetooth-profile.js.map +1 -0
- package/build/esm/bluetooth.d.ts +108 -0
- package/build/{bluetooth.js → esm/bluetooth.js} +73 -36
- package/build/esm/bluetooth.js.map +1 -0
- package/build/esm/board-id.d.ts +36 -0
- package/build/esm/board-id.js.map +1 -0
- package/build/esm/board-serial-info.d.ts +14 -0
- package/build/esm/board-serial-info.js.map +1 -0
- package/build/esm/button-service.d.ts +13 -0
- package/build/esm/button-service.js.map +1 -0
- package/build/esm/buttons.d.ts +10 -0
- package/build/esm/buttons.js.map +1 -0
- package/build/esm/constants.d.ts +48 -0
- package/build/esm/constants.js.map +1 -0
- package/build/esm/device.d.ts +181 -0
- package/build/{device.js → esm/device.js} +11 -58
- package/build/esm/device.js.map +1 -0
- package/build/esm/events.d.ts +110 -0
- package/build/esm/events.js +104 -0
- package/build/esm/events.js.map +1 -0
- package/build/esm/hex-flash-data-source.d.ts +7 -0
- package/build/esm/hex-flash-data-source.js.map +1 -0
- package/build/esm/index.d.ts +17 -0
- package/build/esm/index.js +12 -0
- package/build/esm/index.js.map +1 -0
- package/build/esm/led-service.d.ts +20 -0
- package/build/esm/led-service.js +116 -0
- package/build/esm/led-service.js.map +1 -0
- package/build/esm/led.d.ts +6 -0
- package/build/esm/led.js +2 -0
- package/build/esm/led.js.map +1 -0
- package/build/esm/logging.d.ts +21 -0
- package/build/esm/logging.js.map +1 -0
- package/build/esm/magnetometer-service.d.ts +22 -0
- package/build/esm/magnetometer-service.js +125 -0
- package/build/esm/magnetometer-service.js.map +1 -0
- package/build/esm/magnetometer.d.ts +9 -0
- package/build/esm/magnetometer.js +12 -0
- package/build/esm/magnetometer.js.map +1 -0
- package/build/esm/package.json +1 -0
- package/build/esm/promise-queue.d.ts +27 -0
- package/build/esm/promise-queue.js +74 -0
- package/build/esm/promise-queue.js.map +1 -0
- package/build/esm/serial-events.d.ts +20 -0
- package/build/esm/serial-events.js +61 -0
- package/build/esm/serial-events.js.map +1 -0
- package/build/esm/service-events.d.ts +17 -0
- package/build/{service-events.js → esm/service-events.js} +12 -0
- package/build/esm/service-events.js.map +1 -0
- package/build/esm/setupTests.d.ts +6 -0
- package/build/{setupTests.js.map → esm/setupTests.js.map} +1 -1
- package/build/esm/uart-service.d.ts +13 -0
- package/build/esm/uart-service.js +72 -0
- package/build/esm/uart-service.js.map +1 -0
- package/build/esm/uart.d.ts +4 -0
- package/build/esm/uart.js +12 -0
- package/build/esm/uart.js.map +1 -0
- package/build/esm/usb-device-wrapper.d.ts +47 -0
- package/build/{usb-device-wrapper.js → esm/usb-device-wrapper.js} +36 -12
- package/build/esm/usb-device-wrapper.js.map +1 -0
- package/build/esm/usb-partial-flashing-utils.d.ts +17 -0
- package/build/esm/usb-partial-flashing-utils.js.map +1 -0
- package/build/esm/usb-partial-flashing.d.ts +69 -0
- package/build/{usb-partial-flashing.js → esm/usb-partial-flashing.js} +8 -10
- package/build/esm/usb-partial-flashing.js.map +1 -0
- package/build/esm/usb-radio-bridge.d.ts +24 -0
- package/build/{usb-radio-bridge.js → esm/usb-radio-bridge.js} +133 -47
- package/build/esm/usb-radio-bridge.js.map +1 -0
- package/build/esm/usb-serial-protocol.d.ts +66 -0
- package/build/esm/usb-serial-protocol.js.map +1 -0
- package/build/esm/usb.d.ts +64 -0
- package/build/{usb.js → esm/usb.js} +188 -67
- package/build/esm/usb.js.map +1 -0
- package/package.json +23 -9
- package/typedoc.json +14 -0
- package/build/accelerometer-service.js.map +0 -1
- package/build/accelerometer.js.map +0 -1
- package/build/async-util.js.map +0 -1
- package/build/bluetooth-device-wrapper.js.map +0 -1
- package/build/bluetooth-profile.js.map +0 -1
- package/build/bluetooth-utils.d.ts +0 -5
- package/build/bluetooth-utils.js +0 -14
- package/build/bluetooth-utils.js.map +0 -1
- package/build/bluetooth.d.ts +0 -49
- package/build/bluetooth.js.map +0 -1
- package/build/board-id.js.map +0 -1
- package/build/board-serial-info.js.map +0 -1
- package/build/button-service.js.map +0 -1
- package/build/buttons.js.map +0 -1
- package/build/constants.js.map +0 -1
- package/build/device.js.map +0 -1
- package/build/events.js +0 -19
- package/build/events.js.map +0 -1
- package/build/hex-flash-data-source.js.map +0 -1
- package/build/index.d.ts +0 -10
- package/build/index.js +0 -8
- package/build/index.js.map +0 -1
- package/build/logging.js.map +0 -1
- package/build/service-events.js.map +0 -1
- package/build/usb-device-wrapper.js.map +0 -1
- package/build/usb-partial-flashing-utils.js.map +0 -1
- package/build/usb-partial-flashing.js.map +0 -1
- package/build/usb-radio-bridge.d.ts +0 -37
- package/build/usb-radio-bridge.js.map +0 -1
- package/build/usb-serial-protocol.js.map +0 -1
- package/build/usb.d.ts +0 -60
- package/build/usb.js.map +0 -1
- package/vite.config.ts +0 -32
- /package/build/{accelerometer.d.ts → cjs/accelerometer.d.ts} +0 -0
- /package/build/{async-util.d.ts → cjs/async-util.d.ts} +0 -0
- /package/build/{bluetooth-profile.d.ts → cjs/bluetooth-profile.d.ts} +0 -0
- /package/build/{board-id.d.ts → cjs/board-id.d.ts} +0 -0
- /package/build/{board-serial-info.d.ts → cjs/board-serial-info.d.ts} +0 -0
- /package/build/{buttons.d.ts → cjs/buttons.d.ts} +0 -0
- /package/build/{constants.d.ts → cjs/constants.d.ts} +0 -0
- /package/build/{hex-flash-data-source.d.ts → cjs/hex-flash-data-source.d.ts} +0 -0
- /package/build/{setupTests.d.ts → cjs/setupTests.d.ts} +0 -0
- /package/build/{usb-partial-flashing-utils.d.ts → cjs/usb-partial-flashing-utils.d.ts} +0 -0
- /package/build/{usb-serial-protocol.d.ts → cjs/usb-serial-protocol.d.ts} +0 -0
- /package/build/{accelerometer.js → esm/accelerometer.js} +0 -0
- /package/build/{async-util.js → esm/async-util.js} +0 -0
- /package/build/{bluetooth-profile.js → esm/bluetooth-profile.js} +0 -0
- /package/build/{board-id.js → esm/board-id.js} +0 -0
- /package/build/{board-serial-info.js → esm/board-serial-info.js} +0 -0
- /package/build/{button-service.js → esm/button-service.js} +0 -0
- /package/build/{buttons.js → esm/buttons.js} +0 -0
- /package/build/{constants.js → esm/constants.js} +0 -0
- /package/build/{hex-flash-data-source.js → esm/hex-flash-data-source.js} +0 -0
- /package/build/{logging.js → esm/logging.js} +0 -0
- /package/build/{usb-partial-flashing-utils.js → esm/usb-partial-flashing-utils.js} +0 -0
- /package/build/{usb-serial-protocol.js → esm/usb-serial-protocol.js} +0 -0
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { MagnetometerDataEvent } from "./magnetometer.js";
|
|
2
|
+
import { profile } from "./bluetooth-profile.js";
|
|
3
|
+
import { BackgroundErrorEvent, DeviceError } from "./device.js";
|
|
4
|
+
export class MagnetometerService {
|
|
5
|
+
constructor(magnetometerDataCharacteristic, magnetometerPeriodCharacteristic, magnetometerBearingCharacteristic, magnetometerCalibrationCharacteristic, dispatchTypedEvent, queueGattOperation) {
|
|
6
|
+
Object.defineProperty(this, "magnetometerDataCharacteristic", {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
configurable: true,
|
|
9
|
+
writable: true,
|
|
10
|
+
value: magnetometerDataCharacteristic
|
|
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
|
|
29
|
+
});
|
|
30
|
+
Object.defineProperty(this, "dispatchTypedEvent", {
|
|
31
|
+
enumerable: true,
|
|
32
|
+
configurable: true,
|
|
33
|
+
writable: true,
|
|
34
|
+
value: dispatchTypedEvent
|
|
35
|
+
});
|
|
36
|
+
Object.defineProperty(this, "queueGattOperation", {
|
|
37
|
+
enumerable: true,
|
|
38
|
+
configurable: true,
|
|
39
|
+
writable: true,
|
|
40
|
+
value: queueGattOperation
|
|
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));
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
static async createService(gattServer, dispatcher, queueGattOperation, listenerInit) {
|
|
49
|
+
let magnetometerService;
|
|
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);
|
|
70
|
+
}
|
|
71
|
+
dataViewToData(dataView) {
|
|
72
|
+
return {
|
|
73
|
+
x: dataView.getInt16(0, true),
|
|
74
|
+
y: dataView.getInt16(2, true),
|
|
75
|
+
z: dataView.getInt16(4, true),
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
async getData() {
|
|
79
|
+
const dataView = await this.queueGattOperation(() => this.magnetometerDataCharacteristic.readValue());
|
|
80
|
+
return this.dataViewToData(dataView);
|
|
81
|
+
}
|
|
82
|
+
async getPeriod() {
|
|
83
|
+
const dataView = await this.queueGattOperation(() => this.magnetometerPeriodCharacteristic.readValue());
|
|
84
|
+
return dataView.getUint16(0, true);
|
|
85
|
+
}
|
|
86
|
+
async setPeriod(value) {
|
|
87
|
+
if (value === 0) {
|
|
88
|
+
// Writing 0 causes the device to crash.
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
// Allowed values: 10, 20, 50, 100
|
|
92
|
+
// Values passed are rounded up to the allowed values on device.
|
|
93
|
+
// Documentation for allowed values looks wrong.
|
|
94
|
+
// https://lancaster-university.github.io/microbit-docs/ble/profile/#about-the-magnetometer-service
|
|
95
|
+
const dataView = new DataView(new ArrayBuffer(2));
|
|
96
|
+
dataView.setUint16(0, value, true);
|
|
97
|
+
return this.queueGattOperation(() => this.magnetometerPeriodCharacteristic.writeValue(dataView));
|
|
98
|
+
}
|
|
99
|
+
async getBearing() {
|
|
100
|
+
const dataView = await this.queueGattOperation(() => this.magnetometerBearingCharacteristic.readValue());
|
|
101
|
+
return dataView.getUint16(0, true);
|
|
102
|
+
}
|
|
103
|
+
async triggerCalibration() {
|
|
104
|
+
const dataView = new DataView(new ArrayBuffer(1));
|
|
105
|
+
dataView.setUint8(0, 1);
|
|
106
|
+
return this.queueGattOperation(() => this.magnetometerCalibrationCharacteristic.writeValue(dataView));
|
|
107
|
+
}
|
|
108
|
+
async startNotifications(type) {
|
|
109
|
+
await this.characteristicForEvent(type)?.startNotifications();
|
|
110
|
+
}
|
|
111
|
+
async stopNotifications(type) {
|
|
112
|
+
await this.characteristicForEvent(type)?.stopNotifications();
|
|
113
|
+
}
|
|
114
|
+
characteristicForEvent(type) {
|
|
115
|
+
switch (type) {
|
|
116
|
+
case "magnetometerdatachanged": {
|
|
117
|
+
return this.magnetometerDataCharacteristic;
|
|
118
|
+
}
|
|
119
|
+
default: {
|
|
120
|
+
return undefined;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=magnetometer-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"magnetometer-service.js","sourceRoot":"","sources":["../../lib/magnetometer-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export class MagnetometerDataEvent extends Event {
|
|
2
|
+
constructor(data) {
|
|
3
|
+
super("magnetometerdatachanged");
|
|
4
|
+
Object.defineProperty(this, "data", {
|
|
5
|
+
enumerable: true,
|
|
6
|
+
configurable: true,
|
|
7
|
+
writable: true,
|
|
8
|
+
value: data
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=magnetometer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"magnetometer.js","sourceRoot":"","sources":["../../lib/magnetometer.ts"],"names":[],"mappings":"AAMA,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IAC9C,YAA4B,IAAsB;QAChD,KAAK,CAAC,yBAAyB,CAAC,CAAC;QADvB;;;;mBAAgB,IAAI;WAAkB;IAElD,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"type": "module"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
interface Options {
|
|
2
|
+
/**
|
|
3
|
+
* If we should clear the queue return a function to create errors to reject all promises.
|
|
4
|
+
* Otherwise return undefined. Called before processing each entry.
|
|
5
|
+
*/
|
|
6
|
+
abortCheck?: () => (() => Error) | undefined;
|
|
7
|
+
}
|
|
8
|
+
export declare class PromiseQueue {
|
|
9
|
+
private busy;
|
|
10
|
+
private entries;
|
|
11
|
+
private abortCheck;
|
|
12
|
+
constructor(options?: Options);
|
|
13
|
+
/**
|
|
14
|
+
* Queue an action.
|
|
15
|
+
*
|
|
16
|
+
* @param action Async action to perform.
|
|
17
|
+
* @returns A promise that resolves when all prior added actions and this action have been performed.
|
|
18
|
+
*/
|
|
19
|
+
add<T>(action: () => Promise<T>): Promise<T>;
|
|
20
|
+
private processQueue;
|
|
21
|
+
/**
|
|
22
|
+
* Skips any queued actions that aren't in progress and rejects their
|
|
23
|
+
* promises with errors created with the supplied function.
|
|
24
|
+
*/
|
|
25
|
+
clear(rejection: () => Error): void;
|
|
26
|
+
}
|
|
27
|
+
export {};
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
export class PromiseQueue {
|
|
2
|
+
constructor(options = {}) {
|
|
3
|
+
Object.defineProperty(this, "busy", {
|
|
4
|
+
enumerable: true,
|
|
5
|
+
configurable: true,
|
|
6
|
+
writable: true,
|
|
7
|
+
value: false
|
|
8
|
+
});
|
|
9
|
+
Object.defineProperty(this, "entries", {
|
|
10
|
+
enumerable: true,
|
|
11
|
+
configurable: true,
|
|
12
|
+
writable: true,
|
|
13
|
+
value: []
|
|
14
|
+
});
|
|
15
|
+
Object.defineProperty(this, "abortCheck", {
|
|
16
|
+
enumerable: true,
|
|
17
|
+
configurable: true,
|
|
18
|
+
writable: true,
|
|
19
|
+
value: void 0
|
|
20
|
+
});
|
|
21
|
+
this.abortCheck = options.abortCheck ?? (() => undefined);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Queue an action.
|
|
25
|
+
*
|
|
26
|
+
* @param action Async action to perform.
|
|
27
|
+
* @returns A promise that resolves when all prior added actions and this action have been performed.
|
|
28
|
+
*/
|
|
29
|
+
add(action) {
|
|
30
|
+
return new Promise((resolve, reject) => {
|
|
31
|
+
const entry = {
|
|
32
|
+
resolve,
|
|
33
|
+
reject,
|
|
34
|
+
action,
|
|
35
|
+
};
|
|
36
|
+
this.entries.push(entry);
|
|
37
|
+
if (!this.busy) {
|
|
38
|
+
void this.processQueue();
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
async processQueue() {
|
|
43
|
+
const rejection = this.abortCheck();
|
|
44
|
+
if (rejection) {
|
|
45
|
+
this.clear(rejection);
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
const entry = this.entries.shift();
|
|
49
|
+
if (!entry) {
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
this.busy = true;
|
|
53
|
+
try {
|
|
54
|
+
entry.resolve(await entry.action());
|
|
55
|
+
}
|
|
56
|
+
catch (e) {
|
|
57
|
+
entry.reject(e);
|
|
58
|
+
}
|
|
59
|
+
this.busy = false;
|
|
60
|
+
return this.processQueue();
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Skips any queued actions that aren't in progress and rejects their
|
|
64
|
+
* promises with errors created with the supplied function.
|
|
65
|
+
*/
|
|
66
|
+
clear(rejection) {
|
|
67
|
+
const entries = this.entries;
|
|
68
|
+
this.entries = [];
|
|
69
|
+
entries.forEach((e) => {
|
|
70
|
+
e.reject(rejection());
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=promise-queue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"promise-queue.js","sourceRoot":"","sources":["../../lib/promise-queue.ts"],"names":[],"mappings":"AAcA,MAAM,OAAO,YAAY;IAKvB,YAAY,UAAmB,EAAE;QAJzB;;;;mBAAgB,KAAK;WAAC;QACtB;;;;mBAA6B,EAAE;WAAC;QAChC;;;;;WAA4C;QAGlD,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAC5D,CAAC;IAED;;;;;OAKG;IACI,GAAG,CAAI,MAAwB;QACpC,OAAO,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACxC,MAAM,KAAK,GAAkB;gBAC3B,OAAO;gBACP,MAAM;gBACN,MAAM;aACP,CAAC;YACF,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACf,KAAK,IAAI,CAAC,YAAY,EAAE,CAAC;YAC3B,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,YAAY;QACxB,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QACpC,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YACtB,OAAO;QACT,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACnC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO;QACT,CAAC;QACD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC;YACH,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QACtC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;QAClB,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC;IAC7B,CAAC;IAED;;;OAGG;IACI,KAAK,CAAC,SAAsB;QACjC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC7B,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;QAClB,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YACpB,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;QACxB,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export declare class SerialDataEvent extends Event {
|
|
2
|
+
readonly data: string;
|
|
3
|
+
constructor(data: string);
|
|
4
|
+
}
|
|
5
|
+
export declare class SerialResetEvent extends Event {
|
|
6
|
+
constructor();
|
|
7
|
+
}
|
|
8
|
+
export declare class SerialErrorEvent extends Event {
|
|
9
|
+
readonly error: unknown;
|
|
10
|
+
constructor(error: unknown);
|
|
11
|
+
}
|
|
12
|
+
export declare class FlashEvent extends Event {
|
|
13
|
+
constructor();
|
|
14
|
+
}
|
|
15
|
+
export declare class SerialConnectionEventMap {
|
|
16
|
+
"serialdata": SerialDataEvent;
|
|
17
|
+
"serialreset": SerialResetEvent;
|
|
18
|
+
"serialerror": SerialErrorEvent;
|
|
19
|
+
"flash": FlashEvent;
|
|
20
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
export class SerialDataEvent extends Event {
|
|
2
|
+
constructor(data) {
|
|
3
|
+
super("serialdata");
|
|
4
|
+
Object.defineProperty(this, "data", {
|
|
5
|
+
enumerable: true,
|
|
6
|
+
configurable: true,
|
|
7
|
+
writable: true,
|
|
8
|
+
value: data
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
export class SerialResetEvent extends Event {
|
|
13
|
+
constructor() {
|
|
14
|
+
super("serialreset");
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export class SerialErrorEvent extends Event {
|
|
18
|
+
constructor(error) {
|
|
19
|
+
super("serialerror");
|
|
20
|
+
Object.defineProperty(this, "error", {
|
|
21
|
+
enumerable: true,
|
|
22
|
+
configurable: true,
|
|
23
|
+
writable: true,
|
|
24
|
+
value: error
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
export class FlashEvent extends Event {
|
|
29
|
+
constructor() {
|
|
30
|
+
super("flash");
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
export class SerialConnectionEventMap {
|
|
34
|
+
constructor() {
|
|
35
|
+
Object.defineProperty(this, "serialdata", {
|
|
36
|
+
enumerable: true,
|
|
37
|
+
configurable: true,
|
|
38
|
+
writable: true,
|
|
39
|
+
value: void 0
|
|
40
|
+
});
|
|
41
|
+
Object.defineProperty(this, "serialreset", {
|
|
42
|
+
enumerable: true,
|
|
43
|
+
configurable: true,
|
|
44
|
+
writable: true,
|
|
45
|
+
value: void 0
|
|
46
|
+
});
|
|
47
|
+
Object.defineProperty(this, "serialerror", {
|
|
48
|
+
enumerable: true,
|
|
49
|
+
configurable: true,
|
|
50
|
+
writable: true,
|
|
51
|
+
value: void 0
|
|
52
|
+
});
|
|
53
|
+
Object.defineProperty(this, "flash", {
|
|
54
|
+
enumerable: true,
|
|
55
|
+
configurable: true,
|
|
56
|
+
writable: true,
|
|
57
|
+
value: void 0
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=serial-events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"serial-events.js","sourceRoot":"","sources":["../../lib/serial-events.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,eAAgB,SAAQ,KAAK;IACxC,YAA4B,IAAY;QACtC,KAAK,CAAC,YAAY,CAAC,CAAC;QADV;;;;mBAAgB,IAAI;WAAQ;IAExC,CAAC;CACF;AAED,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IACzC;QACE,KAAK,CAAC,aAAa,CAAC,CAAC;IACvB,CAAC;CACF;AAED,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IACzC,YAA4B,KAAc;QACxC,KAAK,CAAC,aAAa,CAAC,CAAC;QADX;;;;mBAAgB,KAAK;WAAS;IAE1C,CAAC;CACF;AAED,MAAM,OAAO,UAAW,SAAQ,KAAK;IACnC;QACE,KAAK,CAAC,OAAO,CAAC,CAAC;IACjB,CAAC;CACF;AAED,MAAM,OAAO,wBAAwB;IAArC;QACE,4BAAA,YAAY;;;;;WAAkB;QAC9B,4BAAA,aAAa;;;;;WAAmB;QAChC,4BAAA,aAAa;;;;;WAAmB;QAChC,4BAAA,OAAO;;;;;WAAa;IACtB,CAAC;CAAA"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { AccelerometerDataEvent } from "./accelerometer.js";
|
|
2
|
+
import { ButtonEvent } from "./buttons.js";
|
|
3
|
+
import { DeviceConnectionEventMap } from "./device.js";
|
|
4
|
+
import { MagnetometerDataEvent } from "./magnetometer.js";
|
|
5
|
+
import { UARTDataEvent } from "./uart.js";
|
|
6
|
+
export declare class ServiceConnectionEventMap {
|
|
7
|
+
"accelerometerdatachanged": AccelerometerDataEvent;
|
|
8
|
+
"buttonachanged": ButtonEvent;
|
|
9
|
+
"buttonbchanged": ButtonEvent;
|
|
10
|
+
"magnetometerdatachanged": MagnetometerDataEvent;
|
|
11
|
+
"uartdata": UARTDataEvent;
|
|
12
|
+
}
|
|
13
|
+
export type CharacteristicDataTarget = EventTarget & {
|
|
14
|
+
value: DataView;
|
|
15
|
+
};
|
|
16
|
+
export type TypedServiceEvent = keyof (ServiceConnectionEventMap & DeviceConnectionEventMap);
|
|
17
|
+
export type TypedServiceEventDispatcher = (_type: TypedServiceEvent, event: (ServiceConnectionEventMap & DeviceConnectionEventMap)[TypedServiceEvent]) => boolean;
|
|
@@ -18,6 +18,18 @@ export class ServiceConnectionEventMap {
|
|
|
18
18
|
writable: true,
|
|
19
19
|
value: void 0
|
|
20
20
|
});
|
|
21
|
+
Object.defineProperty(this, "magnetometerdatachanged", {
|
|
22
|
+
enumerable: true,
|
|
23
|
+
configurable: true,
|
|
24
|
+
writable: true,
|
|
25
|
+
value: void 0
|
|
26
|
+
});
|
|
27
|
+
Object.defineProperty(this, "uartdata", {
|
|
28
|
+
enumerable: true,
|
|
29
|
+
configurable: true,
|
|
30
|
+
writable: true,
|
|
31
|
+
value: void 0
|
|
32
|
+
});
|
|
21
33
|
}
|
|
22
34
|
}
|
|
23
35
|
//# sourceMappingURL=service-events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service-events.js","sourceRoot":"","sources":["../../lib/service-events.ts"],"names":[],"mappings":"AAMA,MAAM,OAAO,yBAAyB;IAAtC;QACE,4BAAA,0BAA0B;;;;;WAAyB;QACnD,4BAAA,gBAAgB;;;;;WAAc;QAC9B,4BAAA,gBAAgB;;;;;WAAc;QAC9B,4BAAA,yBAAyB;;;;;WAAwB;QACjD,4BAAA,UAAU;;;;;WAAgB;IAC5B,CAAC;CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setupTests.js","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"setupTests.js","sourceRoot":"","sources":["../../lib/setupTests.ts"],"names":[],"mappings":";AAAA;;;;GAIG"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Service } from "./bluetooth-device-wrapper.js";
|
|
2
|
+
import { TypedServiceEvent, TypedServiceEventDispatcher } from "./service-events.js";
|
|
3
|
+
export declare class UARTService implements Service {
|
|
4
|
+
private txCharacteristic;
|
|
5
|
+
private rxCharacteristic;
|
|
6
|
+
private dispatchTypedEvent;
|
|
7
|
+
private queueGattOperation;
|
|
8
|
+
constructor(txCharacteristic: BluetoothRemoteGATTCharacteristic, rxCharacteristic: BluetoothRemoteGATTCharacteristic, dispatchTypedEvent: TypedServiceEventDispatcher, queueGattOperation: <R>(action: () => Promise<R>) => Promise<R>);
|
|
9
|
+
static createService(gattServer: BluetoothRemoteGATTServer, dispatcher: TypedServiceEventDispatcher, queueGattOperation: <R>(action: () => Promise<R>) => Promise<R>, listenerInit: boolean): Promise<UARTService | undefined>;
|
|
10
|
+
startNotifications(type: TypedServiceEvent): Promise<void>;
|
|
11
|
+
stopNotifications(type: TypedServiceEvent): Promise<void>;
|
|
12
|
+
writeData(value: Uint8Array): Promise<void>;
|
|
13
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { profile } from "./bluetooth-profile.js";
|
|
2
|
+
import { BackgroundErrorEvent, DeviceError } from "./device.js";
|
|
3
|
+
import { UARTDataEvent } from "./uart.js";
|
|
4
|
+
export class UARTService {
|
|
5
|
+
constructor(txCharacteristic, rxCharacteristic, dispatchTypedEvent, queueGattOperation) {
|
|
6
|
+
Object.defineProperty(this, "txCharacteristic", {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
configurable: true,
|
|
9
|
+
writable: true,
|
|
10
|
+
value: txCharacteristic
|
|
11
|
+
});
|
|
12
|
+
Object.defineProperty(this, "rxCharacteristic", {
|
|
13
|
+
enumerable: true,
|
|
14
|
+
configurable: true,
|
|
15
|
+
writable: true,
|
|
16
|
+
value: rxCharacteristic
|
|
17
|
+
});
|
|
18
|
+
Object.defineProperty(this, "dispatchTypedEvent", {
|
|
19
|
+
enumerable: true,
|
|
20
|
+
configurable: true,
|
|
21
|
+
writable: true,
|
|
22
|
+
value: dispatchTypedEvent
|
|
23
|
+
});
|
|
24
|
+
Object.defineProperty(this, "queueGattOperation", {
|
|
25
|
+
enumerable: true,
|
|
26
|
+
configurable: true,
|
|
27
|
+
writable: true,
|
|
28
|
+
value: queueGattOperation
|
|
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));
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
static async createService(gattServer, dispatcher, queueGattOperation, listenerInit) {
|
|
37
|
+
let uartService;
|
|
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);
|
|
56
|
+
}
|
|
57
|
+
async startNotifications(type) {
|
|
58
|
+
if (type === "uartdata") {
|
|
59
|
+
await this.txCharacteristic.startNotifications();
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
async stopNotifications(type) {
|
|
63
|
+
if (type === "uartdata") {
|
|
64
|
+
await this.txCharacteristic.stopNotifications();
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
async writeData(value) {
|
|
68
|
+
const dataView = new DataView(value.buffer);
|
|
69
|
+
return this.queueGattOperation(() => this.rxCharacteristic.writeValueWithoutResponse(dataView));
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=uart-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uart-service.js","sourceRoot":"","sources":["../../lib/uart-service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAMhE,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,OAAO,WAAW;IACtB,YACU,gBAAmD,EACnD,gBAAmD,EACnD,kBAA+C,EAC/C,kBAA+D;QAHvE;;;;mBAAQ,gBAAgB;WAAmC;QAC3D;;;;mBAAQ,gBAAgB;WAAmC;QAC3D;;;;mBAAQ,kBAAkB;WAA6B;QACvD;;;;mBAAQ,kBAAkB;WAA6C;QAEvE,IAAI,CAAC,gBAAgB,CAAC,gBAAgB,CACpC,4BAA4B,EAC5B,CAAC,KAAY,EAAE,EAAE;YACf,MAAM,MAAM,GAAG,KAAK,CAAC,MAAkC,CAAC;YACxD,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAClD,IAAI,CAAC,kBAAkB,CAAC,UAAU,EAAE,IAAI,aAAa,CAAC,KAAK,CAAC,CAAC,CAAC;QAChE,CAAC,CACF,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,aAAa,CACxB,UAAqC,EACrC,UAAuC,EACvC,kBAA+D,EAC/D,YAAqB;QAErB,IAAI,WAAuC,CAAC;QAC5C,IAAI,CAAC;YACH,WAAW,GAAG,MAAM,UAAU,CAAC,iBAAiB,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACpE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,YAAY,EAAE,CAAC;gBACjB,UAAU,CAAC,iBAAiB,EAAE,IAAI,oBAAoB,CAAC,GAAa,CAAC,CAAC,CAAC;gBACvE,OAAO;YACT,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,WAAW,CAAC;oBACpB,IAAI,EAAE,iBAAiB;oBACvB,OAAO,EAAE,GAAa;iBACvB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,MAAM,gBAAgB,GAAG,MAAM,WAAW,CAAC,iBAAiB,CAC1D,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC,EAAE,CACnC,CAAC;QACF,MAAM,gBAAgB,GAAG,MAAM,WAAW,CAAC,iBAAiB,CAC1D,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC,EAAE,CACnC,CAAC;QACF,OAAO,IAAI,WAAW,CACpB,gBAAgB,EAChB,gBAAgB,EAChB,UAAU,EACV,kBAAkB,CACnB,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,IAAuB;QAC9C,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;YACxB,MAAM,IAAI,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,CAAC;QACnD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,IAAuB;QAC7C,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;YACxB,MAAM,IAAI,CAAC,gBAAgB,CAAC,iBAAiB,EAAE,CAAC;QAClD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,KAAiB;QAC/B,MAAM,QAAQ,GAAG,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC5C,OAAO,IAAI,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAClC,IAAI,CAAC,gBAAgB,CAAC,yBAAyB,CAAC,QAAQ,CAAC,CAC1D,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uart.js","sourceRoot":"","sources":["../../lib/uart.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,aAAc,SAAQ,KAAK;IACtC,YAA4B,KAAiB;QAC3C,KAAK,CAAC,UAAU,CAAC,CAAC;QADR;;;;mBAAgB,KAAK;WAAY;IAE7C,CAAC;CACF"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { CortexM, DAPLink, WebUSB } from "dapjs";
|
|
2
|
+
import { Logging } from "./logging.js";
|
|
3
|
+
import { BoardSerialInfo } from "./board-serial-info.js";
|
|
4
|
+
export declare class DAPWrapper {
|
|
5
|
+
device: USBDevice;
|
|
6
|
+
private logging;
|
|
7
|
+
transport: WebUSB;
|
|
8
|
+
daplink: DAPLink;
|
|
9
|
+
cortexM: CortexM;
|
|
10
|
+
_pageSize: number | undefined;
|
|
11
|
+
_numPages: number | undefined;
|
|
12
|
+
_deviceId: number | undefined;
|
|
13
|
+
private loggedBoardSerialInfo;
|
|
14
|
+
private initialConnectionComplete;
|
|
15
|
+
constructor(device: USBDevice, logging: Logging);
|
|
16
|
+
/**
|
|
17
|
+
* The page size. Throws if we've not connected.
|
|
18
|
+
*/
|
|
19
|
+
get pageSize(): number;
|
|
20
|
+
/**
|
|
21
|
+
* The number of pages. Throws if we've not connected.
|
|
22
|
+
*/
|
|
23
|
+
get numPages(): number;
|
|
24
|
+
/**
|
|
25
|
+
* The number of pages. Undefined if we've not connected.
|
|
26
|
+
*/
|
|
27
|
+
get deviceId(): number | undefined;
|
|
28
|
+
get boardSerialInfo(): BoardSerialInfo;
|
|
29
|
+
reconnectAsync(): Promise<void>;
|
|
30
|
+
readMem32WaitOnError(register: number): Promise<number>;
|
|
31
|
+
startSerial(listener: (data: string) => void): Promise<void>;
|
|
32
|
+
stopSerial(listener: (data: string) => void): void;
|
|
33
|
+
disconnectAsync(): Promise<void>;
|
|
34
|
+
private send;
|
|
35
|
+
private cmdNums;
|
|
36
|
+
private readRegRepeat;
|
|
37
|
+
private writeRegRepeat;
|
|
38
|
+
private readBlockCore;
|
|
39
|
+
private writeBlockCore;
|
|
40
|
+
readBlockAsync(addr: number, words: number): Promise<Uint8Array>;
|
|
41
|
+
writeBlockAsync(address: number, data: Uint32Array): Promise<void>;
|
|
42
|
+
executeAsync(address: number, code: Uint32Array, sp: number, pc: number, lr: number, ...registers: number[]): Promise<void>;
|
|
43
|
+
private waitForHaltCore;
|
|
44
|
+
waitForHalt(timeToWait?: number): Promise<void>;
|
|
45
|
+
softwareReset(): Promise<void>;
|
|
46
|
+
reset(halt?: boolean): Promise<void>;
|
|
47
|
+
}
|