@microbit/microbit-connection 0.0.0-tab.change.177 → 0.9.0-apps.alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +21 -0
- package/README.md +94 -5
- package/build/cjs/accelerometer-service.d.ts +18 -0
- package/build/cjs/accelerometer-service.js +105 -0
- package/build/cjs/accelerometer-service.js.map +1 -0
- package/build/cjs/accelerometer.js +16 -0
- package/build/cjs/accelerometer.js.map +1 -0
- package/build/{async-util.d.ts → cjs/async-util.d.ts} +9 -0
- package/build/cjs/async-util.js +47 -0
- package/build/cjs/async-util.js.map +1 -0
- package/build/cjs/bluetooth-device-wrapper.d.ts +97 -0
- package/build/cjs/bluetooth-device-wrapper.js +486 -0
- package/build/cjs/bluetooth-device-wrapper.js.map +1 -0
- package/build/{bluetooth-profile.d.ts → cjs/bluetooth-profile.d.ts} +43 -35
- package/build/cjs/bluetooth-profile.js +92 -0
- package/build/cjs/bluetooth-profile.js.map +1 -0
- package/build/cjs/bluetooth.d.ts +112 -0
- package/build/cjs/bluetooth.js +458 -0
- package/build/cjs/bluetooth.js.map +1 -0
- package/build/cjs/board-id.js +81 -0
- package/build/cjs/board-id.js.map +1 -0
- package/build/cjs/board-serial-info.js +51 -0
- package/build/cjs/board-serial-info.js.map +1 -0
- package/build/cjs/button-service.d.ts +13 -0
- package/build/cjs/button-service.js +66 -0
- package/build/cjs/button-service.js.map +1 -0
- package/build/cjs/buttons.js +22 -0
- package/build/cjs/buttons.js.map +1 -0
- package/build/cjs/constants.js +73 -0
- package/build/cjs/constants.js.map +1 -0
- package/build/cjs/device-information-service.d.ts +6 -0
- package/build/cjs/device-information-service.js +34 -0
- package/build/cjs/device-information-service.js.map +1 -0
- package/build/{device.d.ts → cjs/device.d.ts} +71 -39
- package/build/cjs/device.js +147 -0
- package/build/cjs/device.js.map +1 -0
- package/build/cjs/dfu-service.d.ts +9 -0
- package/build/cjs/dfu-service.js +26 -0
- package/build/cjs/dfu-service.js.map +1 -0
- package/build/{events.d.ts → cjs/events.d.ts} +1 -2
- package/build/cjs/events.js +109 -0
- package/build/cjs/events.js.map +1 -0
- package/build/cjs/flashing/flashing-full.d.ts +14 -0
- package/build/cjs/flashing/flashing-full.js +87 -0
- package/build/cjs/flashing/flashing-full.js.map +1 -0
- package/build/cjs/flashing/flashing-makecode.d.ts +6 -0
- package/build/cjs/flashing/flashing-makecode.js +48 -0
- package/build/cjs/flashing/flashing-makecode.js.map +1 -0
- package/build/cjs/flashing/flashing-partial.d.ts +9 -0
- package/build/cjs/flashing/flashing-partial.js +98 -0
- package/build/cjs/flashing/flashing-partial.js.map +1 -0
- package/build/cjs/flashing/flashing-v1.d.ts +11 -0
- package/build/cjs/flashing/flashing-v1.js +24 -0
- package/build/cjs/flashing/flashing-v1.js.map +1 -0
- package/build/cjs/flashing/nordic-dfu.d.ts +3 -0
- package/build/cjs/flashing/nordic-dfu.js +214 -0
- package/build/cjs/flashing/nordic-dfu.js.map +1 -0
- package/build/cjs/flashing/zip.d.ts +12 -0
- package/build/cjs/flashing/zip.js +177 -0
- package/build/cjs/flashing/zip.js.map +1 -0
- package/build/cjs/hex-flash-data-source.js +26 -0
- package/build/cjs/hex-flash-data-source.js.map +1 -0
- package/build/cjs/index.d.ts +17 -0
- package/build/cjs/index.js +37 -0
- package/build/cjs/index.js.map +1 -0
- package/build/cjs/led-service.d.ts +18 -0
- package/build/cjs/led-service.js +89 -0
- package/build/cjs/led-service.js.map +1 -0
- package/build/cjs/led.js +3 -0
- package/build/cjs/led.js.map +1 -0
- package/build/{logging.d.ts → cjs/logging.d.ts} +4 -4
- package/build/cjs/logging.js +16 -0
- package/build/cjs/logging.js.map +1 -0
- package/build/cjs/magnetometer-service.d.ts +18 -0
- package/build/cjs/magnetometer-service.js +94 -0
- package/build/cjs/magnetometer-service.js.map +1 -0
- package/build/cjs/magnetometer.d.ts +9 -0
- package/build/cjs/magnetometer.js +16 -0
- package/build/cjs/magnetometer.js.map +1 -0
- package/build/cjs/package.json +1 -0
- package/build/cjs/partial-flashing-service.d.ts +45 -0
- package/build/cjs/partial-flashing-service.js +110 -0
- package/build/cjs/partial-flashing-service.js.map +1 -0
- package/build/cjs/promise-queue.js +78 -0
- package/build/cjs/promise-queue.js.map +1 -0
- package/build/cjs/serial-events.d.ts +20 -0
- package/build/cjs/serial-events.js +69 -0
- package/build/cjs/serial-events.js.map +1 -0
- package/build/{service-events.d.ts → cjs/service-events.d.ts} +4 -0
- package/build/cjs/service-events.js +39 -0
- package/build/cjs/service-events.js.map +1 -0
- package/build/cjs/setupTests.js.map +1 -0
- package/build/cjs/uart-service.d.ts +12 -0
- package/build/cjs/uart-service.js +55 -0
- package/build/cjs/uart-service.js.map +1 -0
- package/build/cjs/uart.d.ts +4 -0
- package/build/cjs/uart.js +16 -0
- package/build/cjs/uart.js.map +1 -0
- package/build/{usb-device-wrapper.d.ts → cjs/usb-device-wrapper.d.ts} +1 -6
- package/build/cjs/usb-device-wrapper.js +437 -0
- package/build/cjs/usb-device-wrapper.js.map +1 -0
- package/build/cjs/usb-partial-flashing-utils.js +133 -0
- package/build/cjs/usb-partial-flashing-utils.js.map +1 -0
- package/build/{usb-partial-flashing.d.ts → cjs/usb-partial-flashing.d.ts} +3 -5
- package/build/cjs/usb-partial-flashing.js +342 -0
- package/build/cjs/usb-partial-flashing.js.map +1 -0
- package/build/cjs/usb-radio-bridge.d.ts +24 -0
- package/build/cjs/usb-radio-bridge.js +515 -0
- package/build/cjs/usb-radio-bridge.js.map +1 -0
- package/build/cjs/usb-serial-protocol.js +183 -0
- package/build/cjs/usb-serial-protocol.js.map +1 -0
- package/build/cjs/usb.d.ts +66 -0
- package/build/cjs/usb.js +662 -0
- package/build/cjs/usb.js.map +1 -0
- package/build/esm/accelerometer-service.d.ts +18 -0
- package/build/esm/accelerometer-service.js +101 -0
- package/build/esm/accelerometer-service.js.map +1 -0
- package/build/esm/accelerometer.d.ts +9 -0
- package/build/esm/accelerometer.js.map +1 -0
- package/build/esm/async-util.d.ts +22 -0
- package/build/esm/async-util.js +38 -0
- package/build/esm/async-util.js.map +1 -0
- package/build/esm/bluetooth-device-wrapper.d.ts +97 -0
- package/build/esm/bluetooth-device-wrapper.js +481 -0
- package/build/esm/bluetooth-device-wrapper.js.map +1 -0
- package/build/esm/bluetooth-profile.d.ts +147 -0
- package/build/{bluetooth-profile.js → esm/bluetooth-profile.js} +35 -29
- package/build/esm/bluetooth-profile.js.map +1 -0
- package/build/esm/bluetooth.d.ts +112 -0
- package/build/esm/bluetooth.js +428 -0
- package/build/esm/bluetooth.js.map +1 -0
- package/build/esm/board-id.d.ts +36 -0
- package/build/esm/board-id.js.map +1 -0
- package/build/esm/board-serial-info.d.ts +14 -0
- package/build/esm/board-serial-info.js.map +1 -0
- package/build/esm/button-service.d.ts +13 -0
- package/build/esm/button-service.js +62 -0
- package/build/esm/button-service.js.map +1 -0
- package/build/esm/buttons.d.ts +10 -0
- package/build/esm/buttons.js.map +1 -0
- package/build/esm/constants.d.ts +48 -0
- package/build/esm/constants.js.map +1 -0
- package/build/esm/device-information-service.d.ts +6 -0
- package/build/esm/device-information-service.js +30 -0
- package/build/esm/device-information-service.js.map +1 -0
- package/build/esm/device.d.ts +238 -0
- package/build/{device.js → esm/device.js} +16 -58
- package/build/esm/device.js.map +1 -0
- package/build/esm/dfu-service.d.ts +9 -0
- package/build/esm/dfu-service.js +22 -0
- package/build/esm/dfu-service.js.map +1 -0
- package/build/esm/events.d.ts +110 -0
- package/build/esm/events.js.map +1 -0
- package/build/esm/flashing/flashing-full.d.ts +14 -0
- package/build/esm/flashing/flashing-full.js +84 -0
- package/build/esm/flashing/flashing-full.js.map +1 -0
- package/build/esm/flashing/flashing-makecode.d.ts +6 -0
- package/build/esm/flashing/flashing-makecode.js +44 -0
- package/build/esm/flashing/flashing-makecode.js.map +1 -0
- package/build/esm/flashing/flashing-partial.d.ts +9 -0
- package/build/esm/flashing/flashing-partial.js +95 -0
- package/build/esm/flashing/flashing-partial.js.map +1 -0
- package/build/esm/flashing/flashing-v1.d.ts +11 -0
- package/build/esm/flashing/flashing-v1.js +20 -0
- package/build/esm/flashing/flashing-v1.js.map +1 -0
- package/build/esm/flashing/nordic-dfu.d.ts +3 -0
- package/build/esm/flashing/nordic-dfu.js +211 -0
- package/build/esm/flashing/nordic-dfu.js.map +1 -0
- package/build/esm/flashing/zip.d.ts +12 -0
- package/build/esm/flashing/zip.js +174 -0
- package/build/esm/flashing/zip.js.map +1 -0
- package/build/esm/hex-flash-data-source.d.ts +7 -0
- package/build/esm/hex-flash-data-source.js.map +1 -0
- package/build/esm/index.d.ts +17 -0
- package/build/esm/index.js +12 -0
- package/build/esm/index.js.map +1 -0
- package/build/esm/led-service.d.ts +18 -0
- package/build/esm/led-service.js +85 -0
- package/build/esm/led-service.js.map +1 -0
- package/build/esm/led.d.ts +6 -0
- package/build/esm/led.js.map +1 -0
- package/build/esm/logging.d.ts +21 -0
- package/build/{logging.js → esm/logging.js} +1 -1
- package/build/esm/logging.js.map +1 -0
- package/build/esm/magnetometer-service.d.ts +18 -0
- package/build/esm/magnetometer-service.js +90 -0
- package/build/esm/magnetometer-service.js.map +1 -0
- package/build/esm/magnetometer.d.ts +9 -0
- package/build/esm/magnetometer.js +12 -0
- package/build/esm/magnetometer.js.map +1 -0
- package/build/esm/package.json +1 -0
- package/build/esm/partial-flashing-service.d.ts +45 -0
- package/build/esm/partial-flashing-service.js +106 -0
- package/build/esm/partial-flashing-service.js.map +1 -0
- package/build/esm/promise-queue.d.ts +27 -0
- package/build/esm/promise-queue.js.map +1 -0
- package/build/esm/serial-events.d.ts +20 -0
- package/build/esm/serial-events.js +61 -0
- package/build/esm/serial-events.js.map +1 -0
- package/build/esm/service-events.d.ts +17 -0
- package/build/{service-events.js → esm/service-events.js} +12 -0
- package/build/esm/service-events.js.map +1 -0
- package/build/esm/setupTests.d.ts +6 -0
- package/build/{setupTests.js.map → esm/setupTests.js.map} +1 -1
- package/build/esm/uart-service.d.ts +12 -0
- package/build/esm/uart-service.js +51 -0
- package/build/esm/uart-service.js.map +1 -0
- package/build/esm/uart.d.ts +4 -0
- package/build/esm/uart.js +12 -0
- package/build/esm/uart.js.map +1 -0
- package/build/esm/usb-device-wrapper.d.ts +47 -0
- package/build/{usb-device-wrapper.js → esm/usb-device-wrapper.js} +43 -17
- package/build/esm/usb-device-wrapper.js.map +1 -0
- package/build/esm/usb-partial-flashing-utils.d.ts +17 -0
- package/build/esm/usb-partial-flashing-utils.js.map +1 -0
- package/build/esm/usb-partial-flashing.d.ts +67 -0
- package/build/{usb-partial-flashing.js → esm/usb-partial-flashing.js} +12 -13
- package/build/esm/usb-partial-flashing.js.map +1 -0
- package/build/esm/usb-radio-bridge.d.ts +24 -0
- package/build/{usb-radio-bridge.js → esm/usb-radio-bridge.js} +13 -7
- package/build/esm/usb-radio-bridge.js.map +1 -0
- package/build/esm/usb-serial-protocol.d.ts +66 -0
- package/build/esm/usb-serial-protocol.js.map +1 -0
- package/build/esm/usb.d.ts +66 -0
- package/build/{usb.js → esm/usb.js} +257 -49
- package/build/esm/usb.js.map +1 -0
- package/package.json +25 -8
- package/typedoc.json +14 -0
- package/build/accelerometer-service.d.ts +0 -18
- package/build/accelerometer-service.js +0 -102
- package/build/accelerometer-service.js.map +0 -1
- package/build/accelerometer.js.map +0 -1
- package/build/async-util.js +0 -22
- package/build/async-util.js.map +0 -1
- package/build/bluetooth-device-wrapper.d.ts +0 -57
- package/build/bluetooth-device-wrapper.js +0 -433
- package/build/bluetooth-device-wrapper.js.map +0 -1
- package/build/bluetooth-profile.js.map +0 -1
- package/build/bluetooth.d.ts +0 -54
- package/build/bluetooth.js +0 -243
- package/build/bluetooth.js.map +0 -1
- package/build/board-id.js.map +0 -1
- package/build/board-serial-info.js.map +0 -1
- package/build/button-service.d.ts +0 -13
- package/build/button-service.js +0 -76
- package/build/button-service.js.map +0 -1
- package/build/buttons.js.map +0 -1
- package/build/constants.js.map +0 -1
- package/build/device.js.map +0 -1
- package/build/events.js.map +0 -1
- package/build/hex-flash-data-source.js.map +0 -1
- package/build/index.d.ts +0 -10
- package/build/index.js +0 -8
- package/build/index.js.map +0 -1
- package/build/led-service.d.ts +0 -20
- package/build/led-service.js +0 -116
- package/build/led-service.js.map +0 -1
- package/build/led.js.map +0 -1
- package/build/logging.js.map +0 -1
- package/build/promise-queue.js.map +0 -1
- package/build/service-events.js.map +0 -1
- package/build/usb-device-wrapper.js.map +0 -1
- package/build/usb-partial-flashing-utils.js.map +0 -1
- package/build/usb-partial-flashing.js.map +0 -1
- package/build/usb-radio-bridge.d.ts +0 -41
- package/build/usb-radio-bridge.js.map +0 -1
- package/build/usb-serial-protocol.js.map +0 -1
- package/build/usb.d.ts +0 -54
- package/build/usb.js.map +0 -1
- package/vite.config.ts +0 -34
- /package/build/{accelerometer.d.ts → cjs/accelerometer.d.ts} +0 -0
- /package/build/{board-id.d.ts → cjs/board-id.d.ts} +0 -0
- /package/build/{board-serial-info.d.ts → cjs/board-serial-info.d.ts} +0 -0
- /package/build/{buttons.d.ts → cjs/buttons.d.ts} +0 -0
- /package/build/{constants.d.ts → cjs/constants.d.ts} +0 -0
- /package/build/{hex-flash-data-source.d.ts → cjs/hex-flash-data-source.d.ts} +0 -0
- /package/build/{led.d.ts → cjs/led.d.ts} +0 -0
- /package/build/{promise-queue.d.ts → cjs/promise-queue.d.ts} +0 -0
- /package/build/{setupTests.d.ts → cjs/setupTests.d.ts} +0 -0
- /package/build/{usb-partial-flashing-utils.d.ts → cjs/usb-partial-flashing-utils.d.ts} +0 -0
- /package/build/{usb-serial-protocol.d.ts → cjs/usb-serial-protocol.d.ts} +0 -0
- /package/build/{accelerometer.js → esm/accelerometer.js} +0 -0
- /package/build/{board-id.js → esm/board-id.js} +0 -0
- /package/build/{board-serial-info.js → esm/board-serial-info.js} +0 -0
- /package/build/{buttons.js → esm/buttons.js} +0 -0
- /package/build/{constants.js → esm/constants.js} +0 -0
- /package/build/{events.js → esm/events.js} +0 -0
- /package/build/{hex-flash-data-source.js → esm/hex-flash-data-source.js} +0 -0
- /package/build/{led.js → esm/led.js} +0 -0
- /package/build/{promise-queue.js → esm/promise-queue.js} +0 -0
- /package/build/{usb-partial-flashing-utils.js → esm/usb-partial-flashing-utils.js} +0 -0
- /package/build/{usb-serial-protocol.js → esm/usb-serial-protocol.js} +0 -0
|
@@ -4,10 +4,11 @@
|
|
|
4
4
|
* SPDX-License-Identifier: MIT
|
|
5
5
|
*/
|
|
6
6
|
import { TimeoutError, withTimeout } from "./async-util.js";
|
|
7
|
-
import { AfterRequestDevice, BeforeRequestDevice, ConnectionStatus, ConnectionStatusEvent, DeviceError, FlashDataError,
|
|
7
|
+
import { AfterRequestDevice, BeforeRequestDevice, ConnectionStatus, ConnectionStatusEvent, DeviceError, FlashDataError, ProgressStage, } from "./device.js";
|
|
8
8
|
import { TypedEventTarget } from "./events.js";
|
|
9
|
-
import {
|
|
9
|
+
import { ConsoleLogging } from "./logging.js";
|
|
10
10
|
import { PromiseQueue } from "./promise-queue.js";
|
|
11
|
+
import { FlashEvent, SerialDataEvent, SerialErrorEvent, SerialResetEvent, } from "./serial-events.js";
|
|
11
12
|
import { DAPWrapper } from "./usb-device-wrapper.js";
|
|
12
13
|
import { PartialFlashing } from "./usb-partial-flashing.js";
|
|
13
14
|
// Temporary workaround for ChromeOS 105 bug.
|
|
@@ -16,11 +17,29 @@ export const isChromeOS105 = () => {
|
|
|
16
17
|
const userAgent = navigator.userAgent;
|
|
17
18
|
return /CrOS/.test(userAgent) && /Chrome\/105\b/.test(userAgent);
|
|
18
19
|
};
|
|
20
|
+
const defaultFilters = [{ vendorId: 0x0d28, productId: 0x0204 }];
|
|
21
|
+
export var DeviceSelectionMode;
|
|
22
|
+
(function (DeviceSelectionMode) {
|
|
23
|
+
/**
|
|
24
|
+
* Attempts to connect to known device, otherwise asks which device to
|
|
25
|
+
* connect to.
|
|
26
|
+
*/
|
|
27
|
+
DeviceSelectionMode["AlwaysAsk"] = "AlwaysAsk";
|
|
28
|
+
/**
|
|
29
|
+
* Attempts to connect to known device, otherwise attempts to connect to any
|
|
30
|
+
* allowed devices. If that fails, asks which device to connect to.
|
|
31
|
+
*/
|
|
32
|
+
DeviceSelectionMode["UseAnyAllowed"] = "UseAnyAllowed";
|
|
33
|
+
})(DeviceSelectionMode || (DeviceSelectionMode = {}));
|
|
34
|
+
/**
|
|
35
|
+
* A WebUSB connection factory.
|
|
36
|
+
*/
|
|
37
|
+
export const createWebUSBConnection = (options) => new MicrobitWebUSBConnectionImpl(options);
|
|
19
38
|
/**
|
|
20
39
|
* A WebUSB connection to a micro:bit device.
|
|
21
40
|
*/
|
|
22
|
-
|
|
23
|
-
constructor(options = {
|
|
41
|
+
class MicrobitWebUSBConnectionImpl extends TypedEventTarget {
|
|
42
|
+
constructor(options = {}) {
|
|
24
43
|
super();
|
|
25
44
|
Object.defineProperty(this, "status", {
|
|
26
45
|
enumerable: true,
|
|
@@ -81,6 +100,56 @@ export class MicrobitWebUSBConnection extends TypedEventTarget {
|
|
|
81
100
|
writable: true,
|
|
82
101
|
value: false
|
|
83
102
|
});
|
|
103
|
+
Object.defineProperty(this, "disconnectAfterFlash", {
|
|
104
|
+
enumerable: true,
|
|
105
|
+
configurable: true,
|
|
106
|
+
writable: true,
|
|
107
|
+
value: false
|
|
108
|
+
});
|
|
109
|
+
Object.defineProperty(this, "visibilityReconnect", {
|
|
110
|
+
enumerable: true,
|
|
111
|
+
configurable: true,
|
|
112
|
+
writable: true,
|
|
113
|
+
value: false
|
|
114
|
+
});
|
|
115
|
+
Object.defineProperty(this, "visibilityChangeListener", {
|
|
116
|
+
enumerable: true,
|
|
117
|
+
configurable: true,
|
|
118
|
+
writable: true,
|
|
119
|
+
value: () => {
|
|
120
|
+
if (document.visibilityState === "visible") {
|
|
121
|
+
if (this.visibilityReconnect &&
|
|
122
|
+
this.status !== ConnectionStatus.CONNECTED) {
|
|
123
|
+
this.disconnectAfterFlash = false;
|
|
124
|
+
this.visibilityReconnect = false;
|
|
125
|
+
if (!this.flashing) {
|
|
126
|
+
this.log("Reconnecting visible tab");
|
|
127
|
+
this.connect();
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
if (!this.unloading && this.status === ConnectionStatus.CONNECTED) {
|
|
133
|
+
if (!this.flashing) {
|
|
134
|
+
this.log("Disconnecting hidden tab");
|
|
135
|
+
this.disconnect().then(() => {
|
|
136
|
+
this.visibilityReconnect = true;
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
this.log("Scheduling disconnect of hidden tab for after flash");
|
|
141
|
+
this.disconnectAfterFlash = true;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
Object.defineProperty(this, "unloading", {
|
|
148
|
+
enumerable: true,
|
|
149
|
+
configurable: true,
|
|
150
|
+
writable: true,
|
|
151
|
+
value: false
|
|
152
|
+
});
|
|
84
153
|
Object.defineProperty(this, "beforeUnloadListener", {
|
|
85
154
|
enumerable: true,
|
|
86
155
|
configurable: true,
|
|
@@ -90,12 +159,14 @@ export class MicrobitWebUSBConnection extends TypedEventTarget {
|
|
|
90
159
|
// then it'll fail to reconnect with mismatched command/response errors.
|
|
91
160
|
// Try hard to disconnect as a workaround.
|
|
92
161
|
// https://github.com/microbit-foundation/python-editor-v3/issues/89
|
|
162
|
+
this.unloading = true;
|
|
93
163
|
this.stopSerialInternal();
|
|
94
164
|
// The user might stay on the page if they have unsaved changes and there's another beforeunload listener.
|
|
95
165
|
window.addEventListener("focus", () => {
|
|
96
166
|
const assumePageIsStayingOpenDelay = 1000;
|
|
97
167
|
setTimeout(() => {
|
|
98
168
|
if (this.status === ConnectionStatus.CONNECTED) {
|
|
169
|
+
this.unloading = false;
|
|
99
170
|
if (this.addedListeners.serialdata) {
|
|
100
171
|
this.startSerialInternal();
|
|
101
172
|
}
|
|
@@ -110,6 +181,12 @@ export class MicrobitWebUSBConnection extends TypedEventTarget {
|
|
|
110
181
|
writable: true,
|
|
111
182
|
value: void 0
|
|
112
183
|
});
|
|
184
|
+
Object.defineProperty(this, "deviceSelectionMode", {
|
|
185
|
+
enumerable: true,
|
|
186
|
+
configurable: true,
|
|
187
|
+
writable: true,
|
|
188
|
+
value: void 0
|
|
189
|
+
});
|
|
113
190
|
Object.defineProperty(this, "addedListeners", {
|
|
114
191
|
enumerable: true,
|
|
115
192
|
configurable: true,
|
|
@@ -130,7 +207,9 @@ export class MicrobitWebUSBConnection extends TypedEventTarget {
|
|
|
130
207
|
}
|
|
131
208
|
}
|
|
132
209
|
});
|
|
133
|
-
this.logging = options.logging;
|
|
210
|
+
this.logging = options.logging || new ConsoleLogging();
|
|
211
|
+
this.deviceSelectionMode =
|
|
212
|
+
options.deviceSelectionMode || DeviceSelectionMode.AlwaysAsk;
|
|
134
213
|
}
|
|
135
214
|
log(v) {
|
|
136
215
|
this.logging.log(v);
|
|
@@ -141,6 +220,9 @@ export class MicrobitWebUSBConnection extends TypedEventTarget {
|
|
|
141
220
|
}
|
|
142
221
|
if (typeof window !== "undefined") {
|
|
143
222
|
window.addEventListener("beforeunload", this.beforeUnloadListener);
|
|
223
|
+
if (window.document) {
|
|
224
|
+
window.document.addEventListener("visibilitychange", this.visibilityChangeListener);
|
|
225
|
+
}
|
|
144
226
|
}
|
|
145
227
|
}
|
|
146
228
|
dispose() {
|
|
@@ -149,14 +231,17 @@ export class MicrobitWebUSBConnection extends TypedEventTarget {
|
|
|
149
231
|
}
|
|
150
232
|
if (typeof window !== "undefined") {
|
|
151
233
|
window.removeEventListener("beforeunload", this.beforeUnloadListener);
|
|
234
|
+
if (window.document) {
|
|
235
|
+
window.document.removeEventListener("visibilitychange", this.visibilityChangeListener);
|
|
236
|
+
}
|
|
152
237
|
}
|
|
153
238
|
}
|
|
154
239
|
setRequestDeviceExclusionFilters(exclusionFilters) {
|
|
155
240
|
this.exclusionFilters = exclusionFilters;
|
|
156
241
|
}
|
|
157
|
-
async connect() {
|
|
158
|
-
|
|
159
|
-
await this.connectInternal();
|
|
242
|
+
async connect(options) {
|
|
243
|
+
await this.withEnrichedErrors(async () => {
|
|
244
|
+
await this.connectInternal(options?.progress);
|
|
160
245
|
return this.status;
|
|
161
246
|
});
|
|
162
247
|
}
|
|
@@ -188,16 +273,20 @@ export class MicrobitWebUSBConnection extends TypedEventTarget {
|
|
|
188
273
|
this.flashing = false;
|
|
189
274
|
}
|
|
190
275
|
}
|
|
191
|
-
async flashInternal(dataSource, options) {
|
|
276
|
+
async flashInternal(dataSource, options = {}) {
|
|
277
|
+
const partial = options.partial ?? true;
|
|
278
|
+
const progress = rateLimitProgress(options.minimumProgressIncrement ?? 0.0025, options.progress || (() => { }));
|
|
192
279
|
this.log("Stopping serial before flash");
|
|
193
280
|
await this.stopSerialInternal();
|
|
194
281
|
this.log("Reconnecting before flash");
|
|
195
|
-
await this.connectInternal();
|
|
282
|
+
await this.connectInternal(progress);
|
|
196
283
|
if (!this.connection) {
|
|
197
|
-
throw new
|
|
284
|
+
throw new DeviceError({
|
|
285
|
+
code: "device-disconnected",
|
|
286
|
+
message: "Must be connected now",
|
|
287
|
+
});
|
|
198
288
|
}
|
|
199
|
-
|
|
200
|
-
const progress = rateLimitProgress(options.minimumProgressIncrement ?? 0.0025, options.progress || (() => { }));
|
|
289
|
+
progress(ProgressStage.Initializing, undefined);
|
|
201
290
|
const boardId = this.connection.boardSerialInfo.id;
|
|
202
291
|
const boardVersion = boardId.toBoardVersion();
|
|
203
292
|
const data = await dataSource(boardVersion);
|
|
@@ -212,12 +301,20 @@ export class MicrobitWebUSBConnection extends TypedEventTarget {
|
|
|
212
301
|
}
|
|
213
302
|
}
|
|
214
303
|
finally {
|
|
215
|
-
progress(
|
|
216
|
-
if (this.
|
|
217
|
-
this.log("
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
304
|
+
progress(wasPartial ? ProgressStage.PartialFlashing : ProgressStage.FullFlashing, undefined);
|
|
305
|
+
if (this.disconnectAfterFlash) {
|
|
306
|
+
this.log("Disconnecting after flash due to tab visibility");
|
|
307
|
+
this.disconnectAfterFlash = false;
|
|
308
|
+
await this.disconnect();
|
|
309
|
+
this.visibilityReconnect = true;
|
|
310
|
+
}
|
|
311
|
+
else {
|
|
312
|
+
if (this.addedListeners.serialdata) {
|
|
313
|
+
this.log("Reinstating serial after flash");
|
|
314
|
+
if (this.connection.daplink) {
|
|
315
|
+
await this.connection.daplink.connect();
|
|
316
|
+
await this.startSerialInternal();
|
|
317
|
+
}
|
|
221
318
|
}
|
|
222
319
|
}
|
|
223
320
|
}
|
|
@@ -251,7 +348,7 @@ export class MicrobitWebUSBConnection extends TypedEventTarget {
|
|
|
251
348
|
this.dispatchTypedEvent("serialreset", new SerialResetEvent());
|
|
252
349
|
});
|
|
253
350
|
}
|
|
254
|
-
async disconnect() {
|
|
351
|
+
async disconnect(quiet) {
|
|
255
352
|
try {
|
|
256
353
|
if (this.connection) {
|
|
257
354
|
await this.stopSerialInternal();
|
|
@@ -259,24 +356,29 @@ export class MicrobitWebUSBConnection extends TypedEventTarget {
|
|
|
259
356
|
}
|
|
260
357
|
}
|
|
261
358
|
catch (e) {
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
359
|
+
if (!quiet) {
|
|
360
|
+
this.log("Error during disconnection:\r\n" + e);
|
|
361
|
+
this.logging.event({
|
|
362
|
+
type: "WebUSB-error",
|
|
363
|
+
message: "error-disconnecting",
|
|
364
|
+
});
|
|
365
|
+
}
|
|
267
366
|
}
|
|
268
367
|
finally {
|
|
269
368
|
this.connection = undefined;
|
|
270
369
|
this.setStatus(ConnectionStatus.DISCONNECTED);
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
370
|
+
if (!quiet) {
|
|
371
|
+
this.logging.log("Disconnection complete");
|
|
372
|
+
this.logging.event({
|
|
373
|
+
type: "WebUSB-info",
|
|
374
|
+
message: "disconnected",
|
|
375
|
+
});
|
|
376
|
+
}
|
|
276
377
|
}
|
|
277
378
|
}
|
|
278
379
|
setStatus(newStatus) {
|
|
279
380
|
this.status = newStatus;
|
|
381
|
+
this.visibilityReconnect = false;
|
|
280
382
|
this.log("USB connection status " + newStatus);
|
|
281
383
|
this.dispatchTypedEvent("status", new ConnectionStatusEvent(newStatus));
|
|
282
384
|
}
|
|
@@ -288,6 +390,9 @@ export class MicrobitWebUSBConnection extends TypedEventTarget {
|
|
|
288
390
|
if (e instanceof FlashDataError) {
|
|
289
391
|
throw e;
|
|
290
392
|
}
|
|
393
|
+
if (e instanceof DeviceError) {
|
|
394
|
+
throw e;
|
|
395
|
+
}
|
|
291
396
|
// Log error to console for feedback
|
|
292
397
|
this.log("An error occurred whilst attempting to use WebUSB.");
|
|
293
398
|
this.log("Details of the error can be found below, and may be useful when trying to replicate and debug the error.");
|
|
@@ -295,7 +400,7 @@ export class MicrobitWebUSBConnection extends TypedEventTarget {
|
|
|
295
400
|
// Disconnect from the microbit.
|
|
296
401
|
// Any new connection reallocates all the internals.
|
|
297
402
|
// Use the top-level API so any listeners reflect that we're disconnected.
|
|
298
|
-
await this.disconnect();
|
|
403
|
+
await this.disconnect(true);
|
|
299
404
|
const enriched = enrichedError(e);
|
|
300
405
|
// Sanitise error message, replace all special chars with '-', if last char is '-' remove it
|
|
301
406
|
const errorMessage = e.message
|
|
@@ -332,33 +437,87 @@ export class MicrobitWebUSBConnection extends TypedEventTarget {
|
|
|
332
437
|
this.device = undefined;
|
|
333
438
|
this.setStatus(ConnectionStatus.NO_AUTHORIZED_DEVICE);
|
|
334
439
|
}
|
|
335
|
-
async connectInternal() {
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
440
|
+
async connectInternal(progress) {
|
|
441
|
+
const reportProgress = progress ?? (() => { });
|
|
442
|
+
if (!this.connection && this.device) {
|
|
443
|
+
reportProgress(ProgressStage.Connecting);
|
|
444
|
+
this.connection = new DAPWrapper(this.device, this.logging);
|
|
445
|
+
await withTimeout(this.connection.reconnectAsync(), 10_000);
|
|
446
|
+
}
|
|
447
|
+
else if (!this.connection) {
|
|
448
|
+
await this.connectWithOtherDevice(reportProgress);
|
|
449
|
+
}
|
|
450
|
+
else {
|
|
451
|
+
reportProgress(ProgressStage.Connecting);
|
|
452
|
+
await withTimeout(this.connection.reconnectAsync(), 10_000);
|
|
339
453
|
}
|
|
340
|
-
await withTimeout(this.connection.reconnectAsync(), 10_000);
|
|
341
454
|
if (this.addedListeners.serialdata && !this.flashing) {
|
|
342
455
|
this.startSerialInternal();
|
|
343
456
|
}
|
|
344
457
|
this.setStatus(ConnectionStatus.CONNECTED);
|
|
345
458
|
}
|
|
346
|
-
async
|
|
347
|
-
if (this.
|
|
348
|
-
|
|
459
|
+
async connectWithOtherDevice(progress) {
|
|
460
|
+
if (this.deviceSelectionMode === DeviceSelectionMode.UseAnyAllowed) {
|
|
461
|
+
await this.attemptConnectAllowedDevices();
|
|
462
|
+
}
|
|
463
|
+
if (!this.connection) {
|
|
464
|
+
progress(ProgressStage.FindingDevice);
|
|
465
|
+
this.device = await this.chooseDevice();
|
|
466
|
+
progress(ProgressStage.Connecting);
|
|
467
|
+
this.connection = new DAPWrapper(this.device, this.logging);
|
|
468
|
+
await withTimeout(this.connection.reconnectAsync(), 10_000);
|
|
349
469
|
}
|
|
470
|
+
}
|
|
471
|
+
// Based on: https://github.com/microsoft/pxt/blob/ab97a2422879824c730f009b15d4bf446b0e8547/pxtlib/webusb.ts#L361
|
|
472
|
+
async attemptConnectAllowedDevices() {
|
|
473
|
+
const pairedDevices = await this.getFilteredAllowedDevices();
|
|
474
|
+
for (const device of pairedDevices) {
|
|
475
|
+
const connection = await this.attemptDeviceConnection(device);
|
|
476
|
+
if (connection) {
|
|
477
|
+
this.device = device;
|
|
478
|
+
this.connection = connection;
|
|
479
|
+
return;
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
// Based on: https://github.com/microsoft/pxt/blob/ab97a2422879824c730f009b15d4bf446b0e8547/pxtlib/webusb.ts#L530
|
|
484
|
+
async getFilteredAllowedDevices() {
|
|
485
|
+
this.log("Retrieving previously paired USB devices");
|
|
486
|
+
const devices = await navigator.usb?.getDevices();
|
|
487
|
+
if (devices === undefined) {
|
|
488
|
+
return [];
|
|
489
|
+
}
|
|
490
|
+
const filteredDevices = devices.filter((device) => applyDeviceFilters(device, defaultFilters, this.exclusionFilters ?? []));
|
|
491
|
+
return filteredDevices;
|
|
492
|
+
}
|
|
493
|
+
async attemptDeviceConnection(device) {
|
|
494
|
+
this.log(`Attempting connection to: ${device.manufacturerName} ${device.productName}`);
|
|
495
|
+
this.log(`Serial number: ${device.serialNumber}`);
|
|
496
|
+
const connection = new DAPWrapper(device, this.logging);
|
|
497
|
+
await withTimeout(connection.reconnectAsync(), 10_000);
|
|
498
|
+
return connection;
|
|
499
|
+
}
|
|
500
|
+
async chooseDevice() {
|
|
350
501
|
this.dispatchTypedEvent("beforerequestdevice", new BeforeRequestDevice());
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
502
|
+
try {
|
|
503
|
+
this.device = await navigator.usb.requestDevice({
|
|
504
|
+
exclusionFilters: this.exclusionFilters,
|
|
505
|
+
filters: defaultFilters,
|
|
506
|
+
});
|
|
507
|
+
}
|
|
508
|
+
finally {
|
|
509
|
+
this.dispatchTypedEvent("afterrequestdevice", new AfterRequestDevice());
|
|
510
|
+
}
|
|
356
511
|
return this.device;
|
|
357
512
|
}
|
|
358
513
|
eventActivated(type) {
|
|
359
514
|
switch (type) {
|
|
360
515
|
case "serialdata": {
|
|
361
|
-
|
|
516
|
+
// Prevent starting serial if already started and when flashing.
|
|
517
|
+
if (!this.addedListeners.serialdata && !this.flashing) {
|
|
518
|
+
this.startSerialInternal();
|
|
519
|
+
}
|
|
520
|
+
this.addedListeners.serialdata++;
|
|
362
521
|
break;
|
|
363
522
|
}
|
|
364
523
|
}
|
|
@@ -366,12 +525,58 @@ export class MicrobitWebUSBConnection extends TypedEventTarget {
|
|
|
366
525
|
async eventDeactivated(type) {
|
|
367
526
|
switch (type) {
|
|
368
527
|
case "serialdata": {
|
|
369
|
-
this.
|
|
528
|
+
this.addedListeners.serialdata--;
|
|
529
|
+
if (!this.addedListeners.serialdata) {
|
|
530
|
+
this.stopSerialInternal();
|
|
531
|
+
}
|
|
370
532
|
break;
|
|
371
533
|
}
|
|
372
534
|
}
|
|
373
535
|
}
|
|
374
536
|
}
|
|
537
|
+
/**
|
|
538
|
+
* Applying WebUSB device filter. Exported for testing.
|
|
539
|
+
* Based on: https://wicg.github.io/webusb/#enumeration
|
|
540
|
+
*/
|
|
541
|
+
export const applyDeviceFilters = (device, filters, exclusionFilters) => {
|
|
542
|
+
return ((filters.length === 0 ||
|
|
543
|
+
filters.some((filter) => matchFilter(device, filter))) &&
|
|
544
|
+
(exclusionFilters.length === 0 ||
|
|
545
|
+
exclusionFilters.every((filter) => !matchFilter(device, filter))));
|
|
546
|
+
};
|
|
547
|
+
const matchFilter = (device, filter) => {
|
|
548
|
+
if (filter.vendorId && device.vendorId !== filter.vendorId) {
|
|
549
|
+
return false;
|
|
550
|
+
}
|
|
551
|
+
if (filter.productId && device.productId !== filter.productId) {
|
|
552
|
+
return false;
|
|
553
|
+
}
|
|
554
|
+
if (filter.serialNumber && device.serialNumber !== filter.serialNumber) {
|
|
555
|
+
return false;
|
|
556
|
+
}
|
|
557
|
+
return hasMatchingInterface(device, filter);
|
|
558
|
+
};
|
|
559
|
+
const hasMatchingInterface = (device, filter) => {
|
|
560
|
+
if (filter.classCode === undefined &&
|
|
561
|
+
filter.subclassCode === undefined &&
|
|
562
|
+
filter.protocolCode === undefined) {
|
|
563
|
+
return true;
|
|
564
|
+
}
|
|
565
|
+
if (!device.configuration?.interfaces) {
|
|
566
|
+
return false;
|
|
567
|
+
}
|
|
568
|
+
return device.configuration.interfaces.some((configInterface) => {
|
|
569
|
+
return configInterface.alternates?.some((alternate) => {
|
|
570
|
+
const classCodeNotMatch = filter.classCode !== undefined &&
|
|
571
|
+
alternate.interfaceClass !== filter.classCode;
|
|
572
|
+
const subClassCodeNotMatch = filter.subclassCode !== undefined &&
|
|
573
|
+
alternate.interfaceSubclass !== filter.subclassCode;
|
|
574
|
+
const protocolCodeNotMatch = filter.protocolCode !== undefined &&
|
|
575
|
+
alternate.interfaceProtocol !== filter.protocolCode;
|
|
576
|
+
return (!classCodeNotMatch || !subClassCodeNotMatch || !protocolCodeNotMatch);
|
|
577
|
+
});
|
|
578
|
+
});
|
|
579
|
+
};
|
|
375
580
|
const genericErrorSuggestingReconnect = (e) => new DeviceError({
|
|
376
581
|
code: "reconnect-microbit",
|
|
377
582
|
message: e.message,
|
|
@@ -435,13 +640,16 @@ const enrichedError = (err) => {
|
|
|
435
640
|
};
|
|
436
641
|
const rateLimitProgress = (minimumProgressIncrement, callback) => {
|
|
437
642
|
let lastCallValue = -1;
|
|
438
|
-
|
|
439
|
-
|
|
643
|
+
let lastStage;
|
|
644
|
+
return (stage, value) => {
|
|
645
|
+
if (lastStage !== stage ||
|
|
646
|
+
value === undefined ||
|
|
440
647
|
value === 0 ||
|
|
441
648
|
value === 1 ||
|
|
442
649
|
value >= lastCallValue + minimumProgressIncrement) {
|
|
650
|
+
lastStage = stage;
|
|
443
651
|
lastCallValue = value ?? -1;
|
|
444
|
-
callback(
|
|
652
|
+
callback(stage, value);
|
|
445
653
|
}
|
|
446
654
|
};
|
|
447
655
|
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usb.js","sourceRoot":"","sources":["../../lib/usb.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,17 +1,29 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@microbit/microbit-connection",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"module": "./build/index.js",
|
|
3
|
+
"version": "0.9.0-apps.alpha.0",
|
|
4
|
+
"main": "./build/cjs/index.js",
|
|
5
|
+
"module": "./build/esm/index.js",
|
|
6
|
+
"types": "./build/esm/index.d.ts",
|
|
6
7
|
"exports": {
|
|
7
8
|
".": {
|
|
8
|
-
"import":
|
|
9
|
+
"import": {
|
|
10
|
+
"types": "./build/esm/index.d.js",
|
|
11
|
+
"default": "./build/esm/index.js"
|
|
12
|
+
},
|
|
13
|
+
"require": {
|
|
14
|
+
"types": "./build/cjs/index.d.js",
|
|
15
|
+
"default": "./build/cjs/index.js"
|
|
16
|
+
}
|
|
9
17
|
}
|
|
10
18
|
},
|
|
11
19
|
"scripts": {
|
|
12
20
|
"dev": "vite",
|
|
13
|
-
"build:
|
|
21
|
+
"build:esm": "tsc -p tsconfig.json && echo '{\"type\": \"module\"}' > build/esm/package.json",
|
|
22
|
+
"build:cjs": "tsc -p tsconfig.cjs.json && echo '{\"type\": \"commonjs\"}' > build/cjs/package.json",
|
|
23
|
+
"build:lib": "npm run build:esm && npm run build:cjs",
|
|
14
24
|
"build:demo": "vite build --mode=demo",
|
|
25
|
+
"build": "npm run build:lib && npm run build:demo",
|
|
26
|
+
"docs": "typedoc",
|
|
15
27
|
"ci": "npm run build:lib && npm run test && npx prettier --check lib src",
|
|
16
28
|
"test": "vitest",
|
|
17
29
|
"preview": "vite preview"
|
|
@@ -20,15 +32,20 @@
|
|
|
20
32
|
"@types/node": "^20.14.10",
|
|
21
33
|
"jsdom": "^24.1.0",
|
|
22
34
|
"prettier": "3.3.2",
|
|
35
|
+
"typedoc": "^0.27.6",
|
|
23
36
|
"typescript": "^5.2.2",
|
|
24
|
-
"vite": "^
|
|
25
|
-
"vitest": "^2.
|
|
37
|
+
"vite": "^6.3.5",
|
|
38
|
+
"vitest": "^3.2.4"
|
|
26
39
|
},
|
|
27
40
|
"dependencies": {
|
|
41
|
+
"@capacitor-community/bluetooth-le": "^7.3.0",
|
|
42
|
+
"@capacitor/core": "^7.4.4",
|
|
43
|
+
"@capacitor/filesystem": "^7.1.6",
|
|
44
|
+
"@microbit/capacitor-community-nordic-dfu": "^7.0.0-microbit.3",
|
|
28
45
|
"@microbit/microbit-universal-hex": "^0.2.2",
|
|
29
46
|
"@types/web-bluetooth": "^0.0.20",
|
|
30
47
|
"crelt": "^1.0.6",
|
|
31
|
-
"dapjs": "
|
|
48
|
+
"dapjs": "^2.3.0",
|
|
32
49
|
"nrf-intel-hex": "^1.4.0"
|
|
33
50
|
}
|
|
34
51
|
}
|
package/typedoc.json
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "micro:bit connection library",
|
|
3
|
+
"navigationLinks": {
|
|
4
|
+
"micro:bit tech site": "https://tech.microbit.org",
|
|
5
|
+
"GitHub": "https://github.com/microbit-foundation/microbit-connection"
|
|
6
|
+
},
|
|
7
|
+
"entryPoints": ["./lib/index.ts"],
|
|
8
|
+
"out": "./docs/build",
|
|
9
|
+
"readme": "./README.md",
|
|
10
|
+
"headings": {
|
|
11
|
+
"readme": false
|
|
12
|
+
},
|
|
13
|
+
"customCss": "./docs/custom.css"
|
|
14
|
+
}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { AccelerometerData } from "./accelerometer.js";
|
|
2
|
-
import { Service } from "./bluetooth-device-wrapper.js";
|
|
3
|
-
import { TypedServiceEvent, TypedServiceEventDispatcher } from "./service-events.js";
|
|
4
|
-
export declare class AccelerometerService implements Service {
|
|
5
|
-
private accelerometerDataCharacteristic;
|
|
6
|
-
private accelerometerPeriodCharacteristic;
|
|
7
|
-
private dispatchTypedEvent;
|
|
8
|
-
private queueGattOperation;
|
|
9
|
-
constructor(accelerometerDataCharacteristic: BluetoothRemoteGATTCharacteristic, accelerometerPeriodCharacteristic: BluetoothRemoteGATTCharacteristic, dispatchTypedEvent: TypedServiceEventDispatcher, queueGattOperation: <R>(action: () => Promise<R>) => Promise<R>);
|
|
10
|
-
static createService(gattServer: BluetoothRemoteGATTServer, dispatcher: TypedServiceEventDispatcher, queueGattOperation: <R>(action: () => Promise<R>) => Promise<R>, listenerInit: boolean): Promise<AccelerometerService | undefined>;
|
|
11
|
-
private dataViewToData;
|
|
12
|
-
getData(): Promise<AccelerometerData>;
|
|
13
|
-
getPeriod(): Promise<number>;
|
|
14
|
-
setPeriod(value: number): Promise<void>;
|
|
15
|
-
startNotifications(type: TypedServiceEvent): Promise<void>;
|
|
16
|
-
stopNotifications(type: TypedServiceEvent): Promise<void>;
|
|
17
|
-
private characteristicForEvent;
|
|
18
|
-
}
|