@microbit/microbit-connection 0.0.0-alpha.1 → 0.0.0-alpha.11
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/build/accelerometer-service.d.ts +10 -9
- package/build/accelerometer-service.js +61 -27
- package/build/accelerometer-service.js.map +1 -1
- package/build/bluetooth-device-wrapper.d.ts +30 -14
- package/build/bluetooth-device-wrapper.js +143 -27
- package/build/bluetooth-device-wrapper.js.map +1 -1
- package/build/bluetooth-utils.d.ts +5 -0
- package/build/bluetooth-utils.js +14 -0
- package/build/bluetooth-utils.js.map +1 -0
- package/build/bluetooth.d.ts +12 -13
- package/build/bluetooth.js +59 -75
- package/build/bluetooth.js.map +1 -1
- package/build/board-id.d.ts +2 -1
- package/build/board-id.js +8 -0
- package/build/board-id.js.map +1 -1
- package/build/board-serial-info.d.ts +1 -1
- package/build/board-serial-info.js +1 -1
- package/build/board-serial-info.js.map +1 -1
- package/build/button-service.d.ts +13 -0
- package/build/button-service.js +76 -0
- package/build/button-service.js.map +1 -0
- package/build/buttons.d.ts +10 -0
- package/build/buttons.js +18 -0
- package/build/buttons.js.map +1 -0
- package/build/constants.d.ts +1 -0
- package/build/constants.js +1 -0
- package/build/constants.js.map +1 -1
- package/build/device.d.ts +19 -29
- package/build/device.js +19 -2
- package/build/device.js.map +1 -1
- package/build/hex-flash-data-source.d.ts +7 -9
- package/build/hex-flash-data-source.js +16 -44
- package/build/hex-flash-data-source.js.map +1 -1
- package/build/index.d.ts +10 -7
- package/build/index.js +7 -6
- package/build/index.js.map +1 -1
- package/build/logging.js +3 -1
- package/build/logging.js.map +1 -1
- package/build/service-events.d.ts +7 -3
- package/build/service-events.js +12 -0
- package/build/service-events.js.map +1 -1
- package/build/usb-device-wrapper.d.ts +9 -3
- package/build/usb-device-wrapper.js +41 -4
- package/build/usb-device-wrapper.js.map +1 -1
- package/build/usb-partial-flashing-utils.js +1 -1
- package/build/usb-partial-flashing-utils.js.map +1 -1
- package/build/usb-partial-flashing.d.ts +13 -7
- package/build/usb-partial-flashing.js +55 -12
- package/build/usb-partial-flashing.js.map +1 -1
- package/build/usb-radio-bridge.d.ts +28 -19
- package/build/usb-radio-bridge.js +284 -192
- package/build/usb-radio-bridge.js.map +1 -1
- package/build/usb.d.ts +13 -14
- package/build/usb.js +117 -48
- package/build/usb.js.map +1 -1
- package/package.json +3 -2
- package/vite.config.ts +1 -1
package/build/bluetooth.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { createBluetoothDeviceWrapper, } from "./bluetooth-device-wrapper";
|
|
2
|
-
import { profile } from "./bluetooth-profile";
|
|
3
|
-
import { AfterRequestDevice, BeforeRequestDevice, ConnectionStatus, ConnectionStatusEvent,
|
|
4
|
-
import { TypedEventTarget } from "./events";
|
|
5
|
-
import { NullLogging } from "./logging";
|
|
1
|
+
import { createBluetoothDeviceWrapper, } from "./bluetooth-device-wrapper.js";
|
|
2
|
+
import { profile } from "./bluetooth-profile.js";
|
|
3
|
+
import { AfterRequestDevice, BeforeRequestDevice, ConnectionStatus, ConnectionStatusEvent, } from "./device.js";
|
|
4
|
+
import { TypedEventTarget } from "./events.js";
|
|
5
|
+
import { NullLogging } from "./logging.js";
|
|
6
6
|
const requestDeviceTimeoutDuration = 30000;
|
|
7
7
|
/**
|
|
8
8
|
* A Bluetooth connection to a micro:bit device.
|
|
@@ -10,14 +10,11 @@ const requestDeviceTimeoutDuration = 30000;
|
|
|
10
10
|
export class MicrobitWebBluetoothConnection extends TypedEventTarget {
|
|
11
11
|
constructor(options = {}) {
|
|
12
12
|
super();
|
|
13
|
-
// TODO: when do we call getAvailable() ?
|
|
14
13
|
Object.defineProperty(this, "status", {
|
|
15
14
|
enumerable: true,
|
|
16
15
|
configurable: true,
|
|
17
16
|
writable: true,
|
|
18
|
-
value:
|
|
19
|
-
? ConnectionStatus.NO_AUTHORIZED_DEVICE
|
|
20
|
-
: ConnectionStatus.NOT_SUPPORTED
|
|
17
|
+
value: ConnectionStatus.SUPPORT_NOT_KNOWN
|
|
21
18
|
});
|
|
22
19
|
/**
|
|
23
20
|
* The USB device we last connected to.
|
|
@@ -53,13 +50,45 @@ export class MicrobitWebBluetoothConnection extends TypedEventTarget {
|
|
|
53
50
|
writable: true,
|
|
54
51
|
value: this.removeEventListener
|
|
55
52
|
});
|
|
53
|
+
Object.defineProperty(this, "activeEvents", {
|
|
54
|
+
enumerable: true,
|
|
55
|
+
configurable: true,
|
|
56
|
+
writable: true,
|
|
57
|
+
value: {
|
|
58
|
+
accelerometerdatachanged: false,
|
|
59
|
+
buttonachanged: false,
|
|
60
|
+
buttonbchanged: false,
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
Object.defineProperty(this, "availabilityListener", {
|
|
64
|
+
enumerable: true,
|
|
65
|
+
configurable: true,
|
|
66
|
+
writable: true,
|
|
67
|
+
value: (e) => {
|
|
68
|
+
// TODO: is this called? is `value` correct?
|
|
69
|
+
const value = e.value;
|
|
70
|
+
this.availability = value;
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
Object.defineProperty(this, "availability", {
|
|
74
|
+
enumerable: true,
|
|
75
|
+
configurable: true,
|
|
76
|
+
writable: true,
|
|
77
|
+
value: void 0
|
|
78
|
+
});
|
|
79
|
+
Object.defineProperty(this, "nameFilter", {
|
|
80
|
+
enumerable: true,
|
|
81
|
+
configurable: true,
|
|
82
|
+
writable: true,
|
|
83
|
+
value: void 0
|
|
84
|
+
});
|
|
56
85
|
this.logging = options.logging || new NullLogging();
|
|
57
86
|
this.addEventListener = (type, ...args) => {
|
|
58
87
|
this._addEventListener(type, ...args);
|
|
59
|
-
this.startNotifications(type);
|
|
88
|
+
this.connection?.startNotifications(type);
|
|
60
89
|
};
|
|
61
90
|
this.removeEventListener = (type, ...args) => {
|
|
62
|
-
this.stopNotifications(type);
|
|
91
|
+
this.connection?.stopNotifications(type);
|
|
63
92
|
this._removeEventListener(type, ...args);
|
|
64
93
|
};
|
|
65
94
|
}
|
|
@@ -67,38 +96,22 @@ export class MicrobitWebBluetoothConnection extends TypedEventTarget {
|
|
|
67
96
|
this.logging.log(v);
|
|
68
97
|
}
|
|
69
98
|
async initialize() {
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
99
|
+
navigator.bluetooth?.addEventListener("availabilitychanged", this.availabilityListener);
|
|
100
|
+
this.availability = await navigator.bluetooth?.getAvailability();
|
|
101
|
+
this.setStatus(this.availability
|
|
102
|
+
? ConnectionStatus.NO_AUTHORIZED_DEVICE
|
|
103
|
+
: ConnectionStatus.NOT_SUPPORTED);
|
|
73
104
|
}
|
|
74
105
|
dispose() {
|
|
75
|
-
|
|
76
|
-
// TODO: availabilitychanged
|
|
77
|
-
}
|
|
106
|
+
navigator.bluetooth?.removeEventListener("availabilitychanged", this.availabilityListener);
|
|
78
107
|
}
|
|
79
|
-
async connect(
|
|
80
|
-
await this.connectInternal(
|
|
108
|
+
async connect() {
|
|
109
|
+
await this.connectInternal();
|
|
81
110
|
return this.status;
|
|
82
111
|
}
|
|
83
112
|
getBoardVersion() {
|
|
84
113
|
return this.connection?.boardVersion;
|
|
85
114
|
}
|
|
86
|
-
// @ts-ignore
|
|
87
|
-
async startSerialInternal() {
|
|
88
|
-
if (!this.connection) {
|
|
89
|
-
// As connecting then starting serial are async we could disconnect between them,
|
|
90
|
-
// so handle this gracefully.
|
|
91
|
-
return;
|
|
92
|
-
}
|
|
93
|
-
// TODO
|
|
94
|
-
}
|
|
95
|
-
// @ts-ignore
|
|
96
|
-
async stopSerialInternal() {
|
|
97
|
-
if (this.connection) {
|
|
98
|
-
// TODO
|
|
99
|
-
this.dispatchTypedEvent("serialreset", new SerialResetEvent());
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
115
|
async disconnect() {
|
|
103
116
|
try {
|
|
104
117
|
if (this.connection) {
|
|
@@ -124,7 +137,7 @@ export class MicrobitWebBluetoothConnection extends TypedEventTarget {
|
|
|
124
137
|
}
|
|
125
138
|
setStatus(newStatus) {
|
|
126
139
|
this.status = newStatus;
|
|
127
|
-
this.log("
|
|
140
|
+
this.log("Bluetooth connection status " + newStatus);
|
|
128
141
|
this.dispatchTypedEvent("status", new ConnectionStatusEvent(newStatus));
|
|
129
142
|
}
|
|
130
143
|
serialWrite(data) {
|
|
@@ -138,20 +151,23 @@ export class MicrobitWebBluetoothConnection extends TypedEventTarget {
|
|
|
138
151
|
this.device = undefined;
|
|
139
152
|
this.setStatus(ConnectionStatus.NO_AUTHORIZED_DEVICE);
|
|
140
153
|
}
|
|
141
|
-
async connectInternal(
|
|
154
|
+
async connectInternal() {
|
|
142
155
|
if (!this.connection) {
|
|
143
|
-
const device = await this.chooseDevice(
|
|
156
|
+
const device = await this.chooseDevice();
|
|
144
157
|
if (!device) {
|
|
145
158
|
return;
|
|
146
159
|
}
|
|
147
|
-
this.connection = await createBluetoothDeviceWrapper(device, this.logging,
|
|
160
|
+
this.connection = await createBluetoothDeviceWrapper(device, this.logging, this.dispatchTypedEvent.bind(this), this.activeEvents);
|
|
148
161
|
}
|
|
149
162
|
// TODO: timeout unification?
|
|
150
163
|
// Connection happens inside createBluetoothDeviceWrapper.
|
|
151
164
|
// await this.connection?.connect();
|
|
152
165
|
this.setStatus(ConnectionStatus.CONNECTED);
|
|
153
166
|
}
|
|
154
|
-
|
|
167
|
+
setNameFilter(name) {
|
|
168
|
+
this.nameFilter = name;
|
|
169
|
+
}
|
|
170
|
+
async chooseDevice() {
|
|
155
171
|
if (this.device) {
|
|
156
172
|
return this.device;
|
|
157
173
|
}
|
|
@@ -163,8 +179,8 @@ export class MicrobitWebBluetoothConnection extends TypedEventTarget {
|
|
|
163
179
|
navigator.bluetooth.requestDevice({
|
|
164
180
|
filters: [
|
|
165
181
|
{
|
|
166
|
-
namePrefix:
|
|
167
|
-
? `BBC micro:bit [${
|
|
182
|
+
namePrefix: this.nameFilter
|
|
183
|
+
? `BBC micro:bit [${this.nameFilter}]`
|
|
168
184
|
: "BBC micro:bit",
|
|
169
185
|
},
|
|
170
186
|
],
|
|
@@ -209,39 +225,7 @@ export class MicrobitWebBluetoothConnection extends TypedEventTarget {
|
|
|
209
225
|
}
|
|
210
226
|
async setAccelerometerPeriod(value) {
|
|
211
227
|
const accelerometerService = await this.connection?.getAccelerometerService();
|
|
212
|
-
accelerometerService?.setPeriod(value);
|
|
213
|
-
}
|
|
214
|
-
async startAccelerometerNotifications() {
|
|
215
|
-
const accelerometerService = await this.connection?.getAccelerometerService();
|
|
216
|
-
accelerometerService?.startNotifications();
|
|
217
|
-
if (this.connection) {
|
|
218
|
-
this.connection.serviceListeners.accelerometerdatachanged.notifying =
|
|
219
|
-
true;
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
async stopAccelerometerNotifications() {
|
|
223
|
-
const accelerometerService = await this.connection?.getAccelerometerService();
|
|
224
|
-
if (this.connection) {
|
|
225
|
-
this.connection.serviceListeners.accelerometerdatachanged.notifying =
|
|
226
|
-
false;
|
|
227
|
-
}
|
|
228
|
-
accelerometerService?.stopNotifications();
|
|
229
|
-
}
|
|
230
|
-
async startNotifications(type) {
|
|
231
|
-
switch (type) {
|
|
232
|
-
case "accelerometerdatachanged": {
|
|
233
|
-
this.startAccelerometerNotifications();
|
|
234
|
-
break;
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
async stopNotifications(type) {
|
|
239
|
-
switch (type) {
|
|
240
|
-
case "accelerometerdatachanged": {
|
|
241
|
-
this.stopAccelerometerNotifications();
|
|
242
|
-
break;
|
|
243
|
-
}
|
|
244
|
-
}
|
|
228
|
+
return accelerometerService?.setPeriod(value);
|
|
245
229
|
}
|
|
246
230
|
}
|
|
247
231
|
//# sourceMappingURL=bluetooth.js.map
|
package/build/bluetooth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bluetooth.js","sourceRoot":"","sources":["../lib/bluetooth.ts"],"names":[],"mappings":"AAMA,OAAO,EAEL,4BAA4B,GAC7B,MAAM,
|
|
1
|
+
{"version":3,"file":"bluetooth.js","sourceRoot":"","sources":["../lib/bluetooth.ts"],"names":[],"mappings":"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"}
|
package/build/board-id.d.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* SPDX-License-Identifier: MIT
|
|
5
5
|
*/
|
|
6
|
-
import { BoardVersion } from "./device";
|
|
6
|
+
import { BoardVersion } from "./device.js";
|
|
7
7
|
/**
|
|
8
8
|
* Validates micro:bit board IDs.
|
|
9
9
|
*/
|
|
@@ -32,4 +32,5 @@ export declare class BoardId {
|
|
|
32
32
|
* @throws if the ID isn't known.
|
|
33
33
|
*/
|
|
34
34
|
static parse(value: string): BoardId;
|
|
35
|
+
static forVersion(boardVersion: BoardVersion): BoardId;
|
|
35
36
|
}
|
package/build/board-id.js
CHANGED
|
@@ -53,6 +53,14 @@ export class BoardId {
|
|
|
53
53
|
static parse(value) {
|
|
54
54
|
return new BoardId(parseInt(value, 16));
|
|
55
55
|
}
|
|
56
|
+
static forVersion(boardVersion) {
|
|
57
|
+
switch (boardVersion) {
|
|
58
|
+
case "V1":
|
|
59
|
+
return this.v1Normalized;
|
|
60
|
+
case "V2":
|
|
61
|
+
return this.v2Normalized;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
56
64
|
}
|
|
57
65
|
Object.defineProperty(BoardId, "v1Normalized", {
|
|
58
66
|
enumerable: true,
|
package/build/board-id.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"board-id.js","sourceRoot":"","sources":["../lib/board-id.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH;;GAEG;AACH,MAAM,OAAO,OAAO;IAIlB,YAAmB,EAAU;QAAjB;;;;mBAAO,EAAE;WAAQ;QAC3B,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,oCAAoC,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;IAED,cAAc;QACZ,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IACnC,CAAC;IAED,IAAI;QACF,OAAO,IAAI,CAAC,EAAE,KAAK,MAAM,IAAI,IAAI,CAAC,EAAE,KAAK,MAAM,CAAC;IAClD,CAAC;IAED,IAAI;QACF,OAAO,CACL,IAAI,CAAC,EAAE,KAAK,MAAM;YAClB,IAAI,CAAC,EAAE,KAAK,MAAM;YAClB,IAAI,CAAC,EAAE,KAAK,MAAM;YAClB,IAAI,CAAC,EAAE,KAAK,MAAM,CACnB,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,SAAS;QACP,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC;IACnE,CAAC;IAED;;;;OAIG;IACH,QAAQ;QACN,OAAO,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC9B,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,KAAK,CAAC,KAAa;QACxB,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;IAC1C,CAAC;;
|
|
1
|
+
{"version":3,"file":"board-id.js","sourceRoot":"","sources":["../lib/board-id.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH;;GAEG;AACH,MAAM,OAAO,OAAO;IAIlB,YAAmB,EAAU;QAAjB;;;;mBAAO,EAAE;WAAQ;QAC3B,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YACjC,MAAM,IAAI,KAAK,CAAC,oCAAoC,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACzE,CAAC;IACH,CAAC;IAED,cAAc;QACZ,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IACnC,CAAC;IAED,IAAI;QACF,OAAO,IAAI,CAAC,EAAE,KAAK,MAAM,IAAI,IAAI,CAAC,EAAE,KAAK,MAAM,CAAC;IAClD,CAAC;IAED,IAAI;QACF,OAAO,CACL,IAAI,CAAC,EAAE,KAAK,MAAM;YAClB,IAAI,CAAC,EAAE,KAAK,MAAM;YAClB,IAAI,CAAC,EAAE,KAAK,MAAM;YAClB,IAAI,CAAC,EAAE,KAAK,MAAM,CACnB,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,SAAS;QACP,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC;IACnE,CAAC;IAED;;;;OAIG;IACH,QAAQ;QACN,OAAO,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC9B,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,KAAK,CAAC,KAAa;QACxB,OAAO,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC;IAC1C,CAAC;IAED,MAAM,CAAC,UAAU,CAAC,YAA0B;QAC1C,QAAQ,YAAY,EAAE,CAAC;YACrB,KAAK,IAAI;gBACP,OAAO,IAAI,CAAC,YAAY,CAAC;YAC3B,KAAK,IAAI;gBACP,OAAO,IAAI,CAAC,YAAY,CAAC;QAC7B,CAAC;IACH,CAAC;;AA3Dc;;;;WAAe,IAAI,OAAO,CAAC,MAAM,CAAC;EAAtB,CAAuB;AACnC;;;;WAAe,IAAI,OAAO,CAAC,MAAM,CAAC;EAAtB,CAAuB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"board-serial-info.js","sourceRoot":"","sources":["../lib/board-serial-info.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"board-serial-info.js","sourceRoot":"","sources":["../lib/board-serial-info.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC,MAAM,OAAO,eAAe;IAC1B,YACS,EAAW,EACX,QAAgB,EAChB,GAAW;QAFlB;;;;mBAAO,EAAE;WAAS;QAClB;;;;mBAAO,QAAQ;WAAQ;QACvB;;;;mBAAO,GAAG;WAAQ;IACjB,CAAC;IACJ,MAAM,CAAC,KAAK,CAAC,MAAiB,EAAE,GAA0B;QACxD,MAAM,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC;QACnC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACjE,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;YACzB,GAAG,CAAC,wCAAwC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;QAC/D,CAAC;QACD,MAAM,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAClC,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACxC,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7B,OAAO,IAAI,eAAe,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC;IAC/D,CAAC;IAED,EAAE,CAAC,KAAsB;QACvB,OAAO,CACL,KAAK,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE;YACpB,KAAK,CAAC,QAAQ,KAAK,IAAI,CAAC,QAAQ;YAChC,KAAK,CAAC,GAAG,KAAK,IAAI,CAAC,GAAG,CACvB,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { GattOperation, Service } from "./bluetooth-device-wrapper.js";
|
|
2
|
+
import { TypedServiceEvent, TypedServiceEventDispatcher } from "./service-events.js";
|
|
3
|
+
export declare class ButtonService implements Service {
|
|
4
|
+
private buttonACharacteristic;
|
|
5
|
+
private buttonBCharacteristic;
|
|
6
|
+
private dispatchTypedEvent;
|
|
7
|
+
constructor(buttonACharacteristic: BluetoothRemoteGATTCharacteristic, buttonBCharacteristic: BluetoothRemoteGATTCharacteristic, dispatchTypedEvent: TypedServiceEventDispatcher);
|
|
8
|
+
static createService(gattServer: BluetoothRemoteGATTServer, dispatcher: TypedServiceEventDispatcher, queueGattOperation: (gattOperation: GattOperation) => void, listenerInit: boolean): Promise<ButtonService | undefined>;
|
|
9
|
+
private dataViewToButtonState;
|
|
10
|
+
startNotifications(type: TypedServiceEvent): Promise<void>;
|
|
11
|
+
stopNotifications(type: TypedServiceEvent): Promise<void>;
|
|
12
|
+
private characteristicForEvent;
|
|
13
|
+
}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { profile } from "./bluetooth-profile.js";
|
|
2
|
+
import { ButtonEvent } from "./buttons.js";
|
|
3
|
+
import { BackgroundErrorEvent, DeviceError } from "./device.js";
|
|
4
|
+
export class ButtonService {
|
|
5
|
+
constructor(buttonACharacteristic, buttonBCharacteristic, dispatchTypedEvent) {
|
|
6
|
+
Object.defineProperty(this, "buttonACharacteristic", {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
configurable: true,
|
|
9
|
+
writable: true,
|
|
10
|
+
value: buttonACharacteristic
|
|
11
|
+
});
|
|
12
|
+
Object.defineProperty(this, "buttonBCharacteristic", {
|
|
13
|
+
enumerable: true,
|
|
14
|
+
configurable: true,
|
|
15
|
+
writable: true,
|
|
16
|
+
value: buttonBCharacteristic
|
|
17
|
+
});
|
|
18
|
+
Object.defineProperty(this, "dispatchTypedEvent", {
|
|
19
|
+
enumerable: true,
|
|
20
|
+
configurable: true,
|
|
21
|
+
writable: true,
|
|
22
|
+
value: dispatchTypedEvent
|
|
23
|
+
});
|
|
24
|
+
for (const type of ["buttonachanged", "buttonbchanged"]) {
|
|
25
|
+
this.characteristicForEvent(type)?.addEventListener("characteristicvaluechanged", (event) => {
|
|
26
|
+
const target = event.target;
|
|
27
|
+
const data = this.dataViewToButtonState(target.value);
|
|
28
|
+
this.dispatchTypedEvent(type, new ButtonEvent(type, data));
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
static async createService(gattServer, dispatcher, queueGattOperation, listenerInit) {
|
|
33
|
+
let buttonService;
|
|
34
|
+
try {
|
|
35
|
+
buttonService = await gattServer.getPrimaryService(profile.button.id);
|
|
36
|
+
}
|
|
37
|
+
catch (err) {
|
|
38
|
+
if (listenerInit) {
|
|
39
|
+
dispatcher("backgrounderror", new BackgroundErrorEvent(err));
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
throw new DeviceError({
|
|
44
|
+
code: "service-missing",
|
|
45
|
+
message: err,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
const buttonACharacteristic = await buttonService.getCharacteristic(profile.button.characteristics.a.id);
|
|
50
|
+
const buttonBCharacteristic = await buttonService.getCharacteristic(profile.button.characteristics.b.id);
|
|
51
|
+
return new ButtonService(buttonACharacteristic, buttonBCharacteristic, dispatcher);
|
|
52
|
+
}
|
|
53
|
+
dataViewToButtonState(dataView) {
|
|
54
|
+
return dataView.getUint8(0);
|
|
55
|
+
}
|
|
56
|
+
async startNotifications(type) {
|
|
57
|
+
await this.characteristicForEvent(type)?.startNotifications();
|
|
58
|
+
}
|
|
59
|
+
async stopNotifications(type) {
|
|
60
|
+
await this.characteristicForEvent(type)?.stopNotifications();
|
|
61
|
+
}
|
|
62
|
+
characteristicForEvent(type) {
|
|
63
|
+
switch (type) {
|
|
64
|
+
case "buttonachanged": {
|
|
65
|
+
return this.buttonACharacteristic;
|
|
66
|
+
}
|
|
67
|
+
case "buttonbchanged": {
|
|
68
|
+
return this.buttonBCharacteristic;
|
|
69
|
+
}
|
|
70
|
+
default: {
|
|
71
|
+
return undefined;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=button-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"button-service.js","sourceRoot":"","sources":["../lib/button-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare enum ButtonState {
|
|
2
|
+
NotPressed = 0,
|
|
3
|
+
ShortPress = 1,
|
|
4
|
+
LongPress = 2
|
|
5
|
+
}
|
|
6
|
+
export type ButtonEventType = "buttonachanged" | "buttonbchanged";
|
|
7
|
+
export declare class ButtonEvent extends Event {
|
|
8
|
+
readonly state: ButtonState;
|
|
9
|
+
constructor(type: ButtonEventType, state: ButtonState);
|
|
10
|
+
}
|
package/build/buttons.js
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export var ButtonState;
|
|
2
|
+
(function (ButtonState) {
|
|
3
|
+
ButtonState[ButtonState["NotPressed"] = 0] = "NotPressed";
|
|
4
|
+
ButtonState[ButtonState["ShortPress"] = 1] = "ShortPress";
|
|
5
|
+
ButtonState[ButtonState["LongPress"] = 2] = "LongPress";
|
|
6
|
+
})(ButtonState || (ButtonState = {}));
|
|
7
|
+
export class ButtonEvent extends Event {
|
|
8
|
+
constructor(type, state) {
|
|
9
|
+
super(type);
|
|
10
|
+
Object.defineProperty(this, "state", {
|
|
11
|
+
enumerable: true,
|
|
12
|
+
configurable: true,
|
|
13
|
+
writable: true,
|
|
14
|
+
value: state
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=buttons.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"buttons.js","sourceRoot":"","sources":["../lib/buttons.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,WAIX;AAJD,WAAY,WAAW;IACrB,yDAAc,CAAA;IACd,yDAAc,CAAA;IACd,uDAAa,CAAA;AACf,CAAC,EAJW,WAAW,KAAX,WAAW,QAItB;AAID,MAAM,OAAO,WAAY,SAAQ,KAAK;IACpC,YACE,IAAqB,EACL,KAAkB;QAElC,KAAK,CAAC,IAAI,CAAC,CAAC;QAFZ;;;;mBAAgB,KAAK;WAAa;IAGpC,CAAC;CACF"}
|
package/build/constants.d.ts
CHANGED
package/build/constants.js
CHANGED
package/build/constants.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../lib/constants.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,sGAAsG;AACtG,yGAAyG;AAEzG,sGAAsG;AACtG,kEAAkE;AAClE,0EAA0E;AAE1E,iBAAiB;AACjB,MAAM,CAAC,MAAM,IAAI,GAAG;IAClB,YAAY,EAAE,UAAU,GAAG,IAAI;IAC/B,QAAQ,EAAE,UAAU,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../lib/constants.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,sGAAsG;AACtG,yGAAyG;AAEzG,sGAAsG;AACtG,kEAAkE;AAClE,0EAA0E;AAE1E,iBAAiB;AACjB,MAAM,CAAC,MAAM,IAAI,GAAG;IAClB,YAAY,EAAE,UAAU,GAAG,IAAI;IAC/B,QAAQ,EAAE,UAAU,GAAG,IAAI;IAE3B,WAAW,EAAE,UAAU,GAAG,IAAI;CAC/B,CAAC;AAEF,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,QAAQ,EAAE,IAAI;IACd,WAAW,EAAE,IAAI;IACjB,cAAc,EAAE,IAAI;IACpB,YAAY,EAAE,IAAI;IAClB,kBAAkB,EAAE,IAAI;IACxB,aAAa;CACd,CAAC;AAEF,MAAM,CAAC,MAAM,GAAG,GAAG;IACjB,QAAQ,EAAE,UAAU;IACpB,UAAU,EAAE,UAAU;IACtB,WAAW,EAAE,UAAU;IACvB,YAAY,EAAE,UAAU;IACxB,WAAW,EAAE,UAAU;IACvB,SAAS,EAAE,UAAU;IACrB,WAAW,EAAE,UAAU;IACvB,YAAY,EAAE,UAAU;IACxB,SAAS,EAAE,CAAC,CAAC,EAAE,YAAY;IAC3B,aAAa;CACd,CAAC;AACF,GAAG,CAAC,SAAS;IACX,GAAG,CAAC,YAAY;QAChB,GAAG,CAAC,WAAW;QACf,GAAG,CAAC,SAAS;QACb,GAAG,CAAC,WAAW;QACf,GAAG,CAAC,YAAY,CAAC;AAEnB,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,MAAM,EAAE,CAAC,IAAI,CAAC;IACd,IAAI,EAAE,CAAC,IAAI,CAAC;IACZ,KAAK,EAAE,CAAC,IAAI,CAAC;IACb,QAAQ;CACT,CAAC;AAEF,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,GAAG,EAAE,IAAI;IACT,GAAG,EAAE,IAAI;IACT,GAAG,EAAE,IAAI;IACT,QAAQ;CACT,CAAC;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,+CAA+C;IAC/C,KAAK,EAAE,UAAU;IACjB,gDAAgD;IAChD,kBAAkB,EAAE,CAAC,IAAI,CAAC;IAE1B,iBAAiB;IACjB,KAAK,EAAE,UAAU;IAEjB,4CAA4C;IAC5C,KAAK,EAAE,UAAU;IACjB,UAAU,EAAE,CAAC,IAAI,EAAE;IAEnB,UAAU,EAAE,UAAU;IACtB,kBAAkB,EAAE,KAAK,IAAI,EAAE;IAC/B,sBAAsB,EAAE,CAAC,IAAI,CAAC;IAE9B,aAAa;CACd,CAAC"}
|
package/build/device.d.ts
CHANGED
|
@@ -3,8 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* SPDX-License-Identifier: MIT
|
|
5
5
|
*/
|
|
6
|
-
import { TypedEventTarget } from "./events";
|
|
7
|
-
import { BoardId } from "./board-id";
|
|
6
|
+
import { TypedEventTarget } from "./events.js";
|
|
8
7
|
/**
|
|
9
8
|
* Specific identified error types.
|
|
10
9
|
*
|
|
@@ -34,7 +33,15 @@ export type DeviceErrorCode =
|
|
|
34
33
|
/**
|
|
35
34
|
* This is the fallback error case suggesting that the user reconnects their device.
|
|
36
35
|
*/
|
|
37
|
-
| "reconnect-microbit"
|
|
36
|
+
| "reconnect-microbit"
|
|
37
|
+
/**
|
|
38
|
+
* Error occured during serial or bluetooth communication.
|
|
39
|
+
*/
|
|
40
|
+
| "background-comms-error"
|
|
41
|
+
/**
|
|
42
|
+
* Bluetooth service is missing on device.
|
|
43
|
+
*/
|
|
44
|
+
| "service-missing";
|
|
38
45
|
/**
|
|
39
46
|
* Error type used for all interactions with this module.
|
|
40
47
|
*
|
|
@@ -59,7 +66,7 @@ export declare enum ConnectionStatus {
|
|
|
59
66
|
* Determining whether the connection type is supported requires
|
|
60
67
|
* initialize() to complete.
|
|
61
68
|
*/
|
|
62
|
-
SUPPORT_NOT_KNOWN =
|
|
69
|
+
SUPPORT_NOT_KNOWN = "SUPPORT_NOT_KNOWN",
|
|
63
70
|
/**
|
|
64
71
|
* Not supported.
|
|
65
72
|
*/
|
|
@@ -70,7 +77,7 @@ export declare enum ConnectionStatus {
|
|
|
70
77
|
* This will be the case even when a device is physically connected
|
|
71
78
|
* but has not been connected via the browser security UI.
|
|
72
79
|
*/
|
|
73
|
-
NO_AUTHORIZED_DEVICE = "
|
|
80
|
+
NO_AUTHORIZED_DEVICE = "NO_AUTHORIZED_DEVICE",
|
|
74
81
|
/**
|
|
75
82
|
* Authorized device available but we haven't connected to it.
|
|
76
83
|
*/
|
|
@@ -82,29 +89,7 @@ export declare enum ConnectionStatus {
|
|
|
82
89
|
}
|
|
83
90
|
export declare class FlashDataError extends Error {
|
|
84
91
|
}
|
|
85
|
-
export
|
|
86
|
-
/**
|
|
87
|
-
* For now we only support partially flashing contiguous data.
|
|
88
|
-
* This can be generated from microbit-fs directly (via getIntelHexBytes())
|
|
89
|
-
* or from an existing Intel Hex via slicePad.
|
|
90
|
-
*
|
|
91
|
-
* This interface is quite confusing and worth revisiting.
|
|
92
|
-
*
|
|
93
|
-
* @param boardId the id of the board.
|
|
94
|
-
* @throws FlashDataError if we cannot generate hex data.
|
|
95
|
-
*/
|
|
96
|
-
partialFlashData(boardId: BoardId): Promise<Uint8Array>;
|
|
97
|
-
/**
|
|
98
|
-
* @param boardId the id of the board.
|
|
99
|
-
* @returns A board-specific (non-universal) Intel Hex file for the given board id.
|
|
100
|
-
* @throws FlashDataError if we cannot generate hex data.
|
|
101
|
-
*/
|
|
102
|
-
fullFlashData(boardId: BoardId): Promise<string>;
|
|
103
|
-
}
|
|
104
|
-
export interface ConnectOptions {
|
|
105
|
-
serial?: boolean;
|
|
106
|
-
name?: string;
|
|
107
|
-
}
|
|
92
|
+
export type FlashDataSource = (boardVersion: BoardVersion) => Promise<string | Uint8Array>;
|
|
108
93
|
export type BoardVersion = "V1" | "V2";
|
|
109
94
|
export declare class ConnectionStatusEvent extends Event {
|
|
110
95
|
readonly status: ConnectionStatus;
|
|
@@ -130,6 +115,10 @@ export declare class BeforeRequestDevice extends Event {
|
|
|
130
115
|
export declare class AfterRequestDevice extends Event {
|
|
131
116
|
constructor();
|
|
132
117
|
}
|
|
118
|
+
export declare class BackgroundErrorEvent extends Event {
|
|
119
|
+
readonly errorMessage: string;
|
|
120
|
+
constructor(errorMessage: string);
|
|
121
|
+
}
|
|
133
122
|
export declare class DeviceConnectionEventMap {
|
|
134
123
|
"status": ConnectionStatusEvent;
|
|
135
124
|
"serialdata": SerialDataEvent;
|
|
@@ -138,6 +127,7 @@ export declare class DeviceConnectionEventMap {
|
|
|
138
127
|
"flash": Event;
|
|
139
128
|
"beforerequestdevice": Event;
|
|
140
129
|
"afterrequestdevice": Event;
|
|
130
|
+
"backgrounderror": BackgroundErrorEvent;
|
|
141
131
|
}
|
|
142
132
|
export interface DeviceConnection extends TypedEventTarget<DeviceConnectionEventMap> {
|
|
143
133
|
status: ConnectionStatus;
|
|
@@ -155,7 +145,7 @@ export interface DeviceConnection extends TypedEventTarget<DeviceConnectionEvent
|
|
|
155
145
|
*
|
|
156
146
|
* @returns the final connection status.
|
|
157
147
|
*/
|
|
158
|
-
connect(
|
|
148
|
+
connect(): Promise<ConnectionStatus>;
|
|
159
149
|
/**
|
|
160
150
|
* Get the board version.
|
|
161
151
|
*
|
package/build/device.js
CHANGED
|
@@ -28,7 +28,7 @@ export var ConnectionStatus;
|
|
|
28
28
|
* Determining whether the connection type is supported requires
|
|
29
29
|
* initialize() to complete.
|
|
30
30
|
*/
|
|
31
|
-
ConnectionStatus[
|
|
31
|
+
ConnectionStatus["SUPPORT_NOT_KNOWN"] = "SUPPORT_NOT_KNOWN";
|
|
32
32
|
/**
|
|
33
33
|
* Not supported.
|
|
34
34
|
*/
|
|
@@ -39,7 +39,7 @@ export var ConnectionStatus;
|
|
|
39
39
|
* This will be the case even when a device is physically connected
|
|
40
40
|
* but has not been connected via the browser security UI.
|
|
41
41
|
*/
|
|
42
|
-
ConnectionStatus["NO_AUTHORIZED_DEVICE"] = "
|
|
42
|
+
ConnectionStatus["NO_AUTHORIZED_DEVICE"] = "NO_AUTHORIZED_DEVICE";
|
|
43
43
|
/**
|
|
44
44
|
* Authorized device available but we haven't connected to it.
|
|
45
45
|
*/
|
|
@@ -104,6 +104,17 @@ export class AfterRequestDevice extends Event {
|
|
|
104
104
|
super("afterrequestdevice");
|
|
105
105
|
}
|
|
106
106
|
}
|
|
107
|
+
export class BackgroundErrorEvent extends Event {
|
|
108
|
+
constructor(errorMessage) {
|
|
109
|
+
super("backgrounderror");
|
|
110
|
+
Object.defineProperty(this, "errorMessage", {
|
|
111
|
+
enumerable: true,
|
|
112
|
+
configurable: true,
|
|
113
|
+
writable: true,
|
|
114
|
+
value: errorMessage
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
}
|
|
107
118
|
export class DeviceConnectionEventMap {
|
|
108
119
|
constructor() {
|
|
109
120
|
Object.defineProperty(this, "status", {
|
|
@@ -148,6 +159,12 @@ export class DeviceConnectionEventMap {
|
|
|
148
159
|
writable: true,
|
|
149
160
|
value: void 0
|
|
150
161
|
});
|
|
162
|
+
Object.defineProperty(this, "backgrounderror", {
|
|
163
|
+
enumerable: true,
|
|
164
|
+
configurable: true,
|
|
165
|
+
writable: true,
|
|
166
|
+
value: void 0
|
|
167
|
+
});
|
|
151
168
|
}
|
|
152
169
|
}
|
|
153
170
|
//# sourceMappingURL=device.js.map
|
package/build/device.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"device.js","sourceRoot":"","sources":["../lib/device.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"device.js","sourceRoot":"","sources":["../lib/device.ts"],"names":[],"mappings":"AA8CA;;;;;;;;GAQG;AACH,MAAM,OAAO,WAAY,SAAQ,KAAK;IAEpC,YAAY,EAAE,IAAI,EAAE,OAAO,EAA+C;QACxE,KAAK,CAAC,OAAO,CAAC,CAAC;QAFjB;;;;;WAAsB;QAGpB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAED;;GAEG;AACH,MAAM,CAAN,IAAY,gBAyBX;AAzBD,WAAY,gBAAgB;IAC1B;;;OAGG;IACH,2DAAuC,CAAA;IACvC;;OAEG;IACH,mDAA+B,CAAA;IAC/B;;;;;OAKG;IACH,iEAA6C,CAAA;IAC7C;;OAEG;IACH,mDAA+B,CAAA;IAC/B;;OAEG;IACH,2CAAuB,CAAA;AACzB,CAAC,EAzBW,gBAAgB,KAAhB,gBAAgB,QAyB3B;AAED,MAAM,OAAO,cAAe,SAAQ,KAAK;CAAG;AAQ5C,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IAC9C,YAA4B,MAAwB;QAClD,KAAK,CAAC,QAAQ,CAAC,CAAC;QADN;;;;mBAAgB,MAAM;WAAkB;IAEpD,CAAC;CACF;AAED,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,mBAAoB,SAAQ,KAAK;IAC5C;QACE,KAAK,CAAC,qBAAqB,CAAC,CAAC;IAC/B,CAAC;CACF;AAED,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAC3C;QACE,KAAK,CAAC,oBAAoB,CAAC,CAAC;IAC9B,CAAC;CACF;AAED,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IAC7C,YAA4B,YAAoB;QAC9C,KAAK,CAAC,iBAAiB,CAAC,CAAC;QADf;;;;mBAAgB,YAAY;WAAQ;IAEhD,CAAC;CACF;AAED,MAAM,OAAO,wBAAwB;IAArC;QACE,4BAAA,QAAQ;;;;;WAAwB;QAChC,4BAAA,YAAY;;;;;WAAkB;QAC9B,4BAAA,aAAa;;;;;WAAQ;QACrB,4BAAA,aAAa;;;;;WAAQ;QACrB,4BAAA,OAAO;;;;;WAAQ;QACf,4BAAA,qBAAqB;;;;;WAAQ;QAC7B,4BAAA,oBAAoB;;;;;WAAQ;QAC5B,4BAAA,iBAAiB;;;;;WAAuB;IAC1C,CAAC;CAAA"}
|
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
private matchingPart;
|
|
9
|
-
}
|
|
1
|
+
import { FlashDataSource } from "./device.js";
|
|
2
|
+
/**
|
|
3
|
+
* A flash data source that converts universal hex files as needed.
|
|
4
|
+
*
|
|
5
|
+
* @param universalHex A hex file, potentially universal.
|
|
6
|
+
*/
|
|
7
|
+
export declare const createUniversalHexFlashDataSource: (universalHex: string) => FlashDataSource;
|