@microbit/microbit-connection 0.0.0-alpha.2 → 0.0.0-alpha.21

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.
Files changed (64) hide show
  1. package/build/accelerometer-service.d.ts +8 -9
  2. package/build/accelerometer-service.js +41 -44
  3. package/build/accelerometer-service.js.map +1 -1
  4. package/build/bluetooth-device-wrapper.d.ts +26 -20
  5. package/build/bluetooth-device-wrapper.js +134 -75
  6. package/build/bluetooth-device-wrapper.js.map +1 -1
  7. package/build/bluetooth.d.ts +14 -10
  8. package/build/bluetooth.js +68 -78
  9. package/build/bluetooth.js.map +1 -1
  10. package/build/board-id.d.ts +1 -0
  11. package/build/board-id.js +8 -0
  12. package/build/board-id.js.map +1 -1
  13. package/build/button-service.d.ts +13 -0
  14. package/build/button-service.js +76 -0
  15. package/build/button-service.js.map +1 -0
  16. package/build/buttons.d.ts +10 -0
  17. package/build/buttons.js +18 -0
  18. package/build/buttons.js.map +1 -0
  19. package/build/constants.d.ts +1 -0
  20. package/build/constants.js +1 -0
  21. package/build/constants.js.map +1 -1
  22. package/build/device.d.ts +22 -27
  23. package/build/device.js +29 -3
  24. package/build/device.js.map +1 -1
  25. package/build/events.d.ts +11 -1
  26. package/build/events.js +86 -1
  27. package/build/events.js.map +1 -1
  28. package/build/hex-flash-data-source.d.ts +6 -8
  29. package/build/hex-flash-data-source.js +16 -45
  30. package/build/hex-flash-data-source.js.map +1 -1
  31. package/build/index.d.ts +7 -4
  32. package/build/index.js +3 -2
  33. package/build/index.js.map +1 -1
  34. package/build/led-service.d.ts +20 -0
  35. package/build/led-service.js +116 -0
  36. package/build/led-service.js.map +1 -0
  37. package/build/led.d.ts +6 -0
  38. package/build/led.js +2 -0
  39. package/build/led.js.map +1 -0
  40. package/build/logging.js +3 -1
  41. package/build/logging.js.map +1 -1
  42. package/build/promise-queue.d.ts +27 -0
  43. package/build/promise-queue.js +74 -0
  44. package/build/promise-queue.js.map +1 -0
  45. package/build/service-events.d.ts +6 -2
  46. package/build/service-events.js +12 -0
  47. package/build/service-events.js.map +1 -1
  48. package/build/usb-device-wrapper.d.ts +7 -1
  49. package/build/usb-device-wrapper.js +40 -3
  50. package/build/usb-device-wrapper.js.map +1 -1
  51. package/build/usb-partial-flashing.d.ts +11 -5
  52. package/build/usb-partial-flashing.js +53 -10
  53. package/build/usb-partial-flashing.js.map +1 -1
  54. package/build/usb-radio-bridge.d.ts +31 -18
  55. package/build/usb-radio-bridge.js +351 -187
  56. package/build/usb-radio-bridge.js.map +1 -1
  57. package/build/usb.d.ts +13 -13
  58. package/build/usb.js +98 -46
  59. package/build/usb.js.map +1 -1
  60. package/package.json +6 -4
  61. package/vite.config.ts +10 -8
  62. package/build/bluetooth-utils.d.ts +0 -5
  63. package/build/bluetooth-utils.js +0 -14
  64. package/build/bluetooth-utils.js.map +0 -1
@@ -5,8 +5,9 @@
5
5
  */
6
6
  import { AccelerometerData } from "./accelerometer.js";
7
7
  import { BluetoothDeviceWrapper } from "./bluetooth-device-wrapper.js";
8
- import { BoardVersion, ConnectOptions, ConnectionStatus, DeviceConnection, DeviceConnectionEventMap } from "./device.js";
8
+ import { BoardVersion, ConnectionStatus, DeviceConnection, DeviceConnectionEventMap } from "./device.js";
9
9
  import { TypedEventTarget } from "./events.js";
10
+ import { LedMatrix } from "./led.js";
10
11
  import { Logging } from "./logging.js";
11
12
  import { ServiceConnectionEventMap } from "./service-events.js";
12
13
  export interface MicrobitWebBluetoothConnectionOptions {
@@ -24,27 +25,30 @@ export declare class MicrobitWebBluetoothConnection extends TypedEventTarget<Dev
24
25
  private device;
25
26
  private logging;
26
27
  connection: BluetoothDeviceWrapper | undefined;
27
- private _addEventListener;
28
- private _removeEventListener;
28
+ private availabilityListener;
29
+ private availability;
30
+ private nameFilter;
29
31
  constructor(options?: MicrobitWebBluetoothConnectionOptions);
32
+ protected eventActivated(type: string): void;
33
+ protected eventDeactivated(type: string): void;
30
34
  private log;
31
35
  initialize(): Promise<void>;
32
36
  dispose(): void;
33
- connect(options?: ConnectOptions): Promise<ConnectionStatus>;
37
+ connect(): Promise<ConnectionStatus>;
34
38
  getBoardVersion(): BoardVersion | undefined;
35
- private startSerialInternal;
36
- private stopSerialInternal;
37
39
  disconnect(): Promise<void>;
38
40
  private setStatus;
39
41
  serialWrite(data: string): Promise<void>;
40
42
  clearDevice(): Promise<void>;
41
43
  private connectInternal;
44
+ setNameFilter(name: string): void;
42
45
  private chooseDevice;
43
46
  getAccelerometerData(): Promise<AccelerometerData | undefined>;
44
47
  getAccelerometerPeriod(): Promise<number | undefined>;
45
48
  setAccelerometerPeriod(value: number): Promise<void>;
46
- private startAccelerometerNotifications;
47
- private stopAccelerometerNotifications;
48
- private startNotifications;
49
- private stopNotifications;
49
+ setLedText(text: string): Promise<void>;
50
+ getLedScrollingDelay(): Promise<number | undefined>;
51
+ setLedScrollingDelay(delayInMillis: number): Promise<void>;
52
+ getLedMatrix(): Promise<LedMatrix | undefined>;
53
+ setLedMatrix(matrix: LedMatrix): Promise<void>;
50
54
  }
@@ -1,6 +1,6 @@
1
1
  import { createBluetoothDeviceWrapper, } from "./bluetooth-device-wrapper.js";
2
2
  import { profile } from "./bluetooth-profile.js";
3
- import { AfterRequestDevice, BeforeRequestDevice, ConnectionStatus, ConnectionStatusEvent, SerialResetEvent, } from "./device.js";
3
+ import { AfterRequestDevice, BeforeRequestDevice, ConnectionStatus, ConnectionStatusEvent, } from "./device.js";
4
4
  import { TypedEventTarget } from "./events.js";
5
5
  import { NullLogging } from "./logging.js";
6
6
  const requestDeviceTimeoutDuration = 30000;
@@ -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: navigator.bluetooth
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.
@@ -41,64 +38,56 @@ export class MicrobitWebBluetoothConnection extends TypedEventTarget {
41
38
  writable: true,
42
39
  value: void 0
43
40
  });
44
- Object.defineProperty(this, "_addEventListener", {
41
+ Object.defineProperty(this, "availabilityListener", {
45
42
  enumerable: true,
46
43
  configurable: true,
47
44
  writable: true,
48
- value: this.addEventListener
45
+ value: (e) => {
46
+ // TODO: is this called? is `value` correct?
47
+ const value = e.value;
48
+ this.availability = value;
49
+ }
49
50
  });
50
- Object.defineProperty(this, "_removeEventListener", {
51
+ Object.defineProperty(this, "availability", {
51
52
  enumerable: true,
52
53
  configurable: true,
53
54
  writable: true,
54
- value: this.removeEventListener
55
+ value: void 0
56
+ });
57
+ Object.defineProperty(this, "nameFilter", {
58
+ enumerable: true,
59
+ configurable: true,
60
+ writable: true,
61
+ value: void 0
55
62
  });
56
63
  this.logging = options.logging || new NullLogging();
57
- this.addEventListener = (type, ...args) => {
58
- this._addEventListener(type, ...args);
59
- this.startNotifications(type);
60
- };
61
- this.removeEventListener = (type, ...args) => {
62
- this.stopNotifications(type);
63
- this._removeEventListener(type, ...args);
64
- };
64
+ }
65
+ eventActivated(type) {
66
+ this.connection?.startNotifications(type);
67
+ }
68
+ eventDeactivated(type) {
69
+ this.connection?.stopNotifications(type);
65
70
  }
66
71
  log(v) {
67
72
  this.logging.log(v);
68
73
  }
69
74
  async initialize() {
70
- if (navigator.bluetooth) {
71
- // TODO: availabilitychanged
72
- }
75
+ navigator.bluetooth?.addEventListener("availabilitychanged", this.availabilityListener);
76
+ this.availability = await navigator.bluetooth?.getAvailability();
77
+ this.setStatus(this.availability
78
+ ? ConnectionStatus.NO_AUTHORIZED_DEVICE
79
+ : ConnectionStatus.NOT_SUPPORTED);
73
80
  }
74
81
  dispose() {
75
- if (navigator.bluetooth) {
76
- // TODO: availabilitychanged
77
- }
82
+ navigator.bluetooth?.removeEventListener("availabilitychanged", this.availabilityListener);
78
83
  }
79
- async connect(options = {}) {
80
- await this.connectInternal(options);
84
+ async connect() {
85
+ await this.connectInternal();
81
86
  return this.status;
82
87
  }
83
88
  getBoardVersion() {
84
89
  return this.connection?.boardVersion;
85
90
  }
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
91
  async disconnect() {
103
92
  try {
104
93
  if (this.connection) {
@@ -114,7 +103,7 @@ export class MicrobitWebBluetoothConnection extends TypedEventTarget {
114
103
  }
115
104
  finally {
116
105
  this.connection = undefined;
117
- this.setStatus(ConnectionStatus.NOT_CONNECTED);
106
+ this.setStatus(ConnectionStatus.DISCONNECTED);
118
107
  this.logging.log("Disconnection complete");
119
108
  this.logging.event({
120
109
  type: "Bluetooth-info",
@@ -124,7 +113,7 @@ export class MicrobitWebBluetoothConnection extends TypedEventTarget {
124
113
  }
125
114
  setStatus(newStatus) {
126
115
  this.status = newStatus;
127
- this.log("Device status " + newStatus);
116
+ this.log("Bluetooth connection status " + newStatus);
128
117
  this.dispatchTypedEvent("status", new ConnectionStatusEvent(newStatus));
129
118
  }
130
119
  serialWrite(data) {
@@ -138,20 +127,33 @@ export class MicrobitWebBluetoothConnection extends TypedEventTarget {
138
127
  this.device = undefined;
139
128
  this.setStatus(ConnectionStatus.NO_AUTHORIZED_DEVICE);
140
129
  }
141
- async connectInternal(options) {
130
+ async connectInternal() {
142
131
  if (!this.connection) {
143
- const device = await this.chooseDevice(options);
132
+ const device = await this.chooseDevice();
144
133
  if (!device) {
134
+ this.setStatus(ConnectionStatus.NO_AUTHORIZED_DEVICE);
145
135
  return;
146
136
  }
147
- this.connection = await createBluetoothDeviceWrapper(device, this.logging, this.dispatchTypedEvent.bind(this));
137
+ this.connection = await createBluetoothDeviceWrapper(device, this.logging, this.dispatchTypedEvent.bind(this), () => this.getActiveEvents(), {
138
+ onConnecting: () => this.setStatus(ConnectionStatus.CONNECTING),
139
+ onReconnecting: () => this.setStatus(ConnectionStatus.RECONNECTING),
140
+ onSuccess: () => this.setStatus(ConnectionStatus.CONNECTED),
141
+ onFail: () => {
142
+ this.setStatus(ConnectionStatus.DISCONNECTED);
143
+ this.connection = undefined;
144
+ },
145
+ });
146
+ return;
148
147
  }
149
148
  // TODO: timeout unification?
150
149
  // Connection happens inside createBluetoothDeviceWrapper.
151
150
  // await this.connection?.connect();
152
151
  this.setStatus(ConnectionStatus.CONNECTED);
153
152
  }
154
- async chooseDevice(options) {
153
+ setNameFilter(name) {
154
+ this.nameFilter = name;
155
+ }
156
+ async chooseDevice() {
155
157
  if (this.device) {
156
158
  return this.device;
157
159
  }
@@ -163,8 +165,8 @@ export class MicrobitWebBluetoothConnection extends TypedEventTarget {
163
165
  navigator.bluetooth.requestDevice({
164
166
  filters: [
165
167
  {
166
- namePrefix: options.name
167
- ? `BBC micro:bit [${options.name}]`
168
+ namePrefix: this.nameFilter
169
+ ? `BBC micro:bit [${this.nameFilter}]`
168
170
  : "BBC micro:bit",
169
171
  },
170
172
  ],
@@ -209,39 +211,27 @@ export class MicrobitWebBluetoothConnection extends TypedEventTarget {
209
211
  }
210
212
  async setAccelerometerPeriod(value) {
211
213
  const accelerometerService = await this.connection?.getAccelerometerService();
212
- accelerometerService?.setPeriod(value);
214
+ return accelerometerService?.setPeriod(value);
213
215
  }
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
- }
216
+ async setLedText(text) {
217
+ const ledService = await this.connection?.getLedService();
218
+ return ledService?.setText(text);
221
219
  }
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();
220
+ async getLedScrollingDelay() {
221
+ const ledService = await this.connection?.getLedService();
222
+ return ledService?.getScrollingDelay();
229
223
  }
230
- async startNotifications(type) {
231
- switch (type) {
232
- case "accelerometerdatachanged": {
233
- this.startAccelerometerNotifications();
234
- break;
235
- }
236
- }
224
+ async setLedScrollingDelay(delayInMillis) {
225
+ const ledService = await this.connection?.getLedService();
226
+ await ledService?.setScrollingDelay(delayInMillis);
237
227
  }
238
- async stopNotifications(type) {
239
- switch (type) {
240
- case "accelerometerdatachanged": {
241
- this.stopAccelerometerNotifications();
242
- break;
243
- }
244
- }
228
+ async getLedMatrix() {
229
+ const ledService = await this.connection?.getLedService();
230
+ return ledService?.getLedMatrix();
231
+ }
232
+ async setLedMatrix(matrix) {
233
+ const ledService = await this.connection?.getLedService();
234
+ ledService?.setLedMatrix(matrix);
245
235
  }
246
236
  }
247
237
  //# sourceMappingURL=bluetooth.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"bluetooth.js","sourceRoot":"","sources":["../lib/bluetooth.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bluetooth.js","sourceRoot":"","sources":["../lib/bluetooth.ts"],"names":[],"mappings":"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"}
@@ -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,
@@ -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;;AAlDc;;;;WAAe,IAAI,OAAO,CAAC,MAAM,CAAC;EAAtB,CAAuB;AACnC;;;;WAAe,IAAI,OAAO,CAAC,MAAM,CAAC;EAAtB,CAAuB"}
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"}
@@ -0,0 +1,13 @@
1
+ import { 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: <R>(action: () => Promise<R>) => Promise<R>, 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
+ }
@@ -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"}
@@ -6,6 +6,7 @@
6
6
  export declare const FICR: {
7
7
  CODEPAGESIZE: number;
8
8
  CODESIZE: number;
9
+ DEVICE_ID_1: number;
9
10
  };
10
11
  export declare const DapCmd: {
11
12
  DAP_INFO: number;
@@ -12,6 +12,7 @@
12
12
  export const FICR = {
13
13
  CODEPAGESIZE: 0x10000000 | 0x10,
14
14
  CODESIZE: 0x10000000 | 0x14,
15
+ DEVICE_ID_1: 0x10000000 | 0x64,
15
16
  };
16
17
  export const DapCmd = {
17
18
  DAP_INFO: 0x00,
@@ -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;CAC5B,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"}
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
@@ -4,7 +4,6 @@
4
4
  * SPDX-License-Identifier: MIT
5
5
  */
6
6
  import { TypedEventTarget } from "./events.js";
7
- import { BoardId } from "./board-id.js";
8
7
  /**
9
8
  * Specific identified error types.
10
9
  *
@@ -38,7 +37,11 @@ export type DeviceErrorCode =
38
37
  /**
39
38
  * Error occured during serial or bluetooth communication.
40
39
  */
41
- | "background-comms-error";
40
+ | "background-comms-error"
41
+ /**
42
+ * Bluetooth service is missing on device.
43
+ */
44
+ | "service-missing";
42
45
  /**
43
46
  * Error type used for all interactions with this module.
44
47
  *
@@ -63,7 +66,7 @@ export declare enum ConnectionStatus {
63
66
  * Determining whether the connection type is supported requires
64
67
  * initialize() to complete.
65
68
  */
66
- SUPPORT_NOT_KNOWN = 0,
69
+ SUPPORT_NOT_KNOWN = "SUPPORT_NOT_KNOWN",
67
70
  /**
68
71
  * Not supported.
69
72
  */
@@ -74,41 +77,28 @@ export declare enum ConnectionStatus {
74
77
  * This will be the case even when a device is physically connected
75
78
  * but has not been connected via the browser security UI.
76
79
  */
77
- NO_AUTHORIZED_DEVICE = "NO_DEVICE",
80
+ NO_AUTHORIZED_DEVICE = "NO_AUTHORIZED_DEVICE",
78
81
  /**
79
82
  * Authorized device available but we haven't connected to it.
80
83
  */
81
- NOT_CONNECTED = "NOT_CONNECTED",
84
+ DISCONNECTED = "DISCONNECTED",
82
85
  /**
83
86
  * Connected.
84
87
  */
85
- CONNECTED = "CONNECTED"
86
- }
87
- export declare class FlashDataError extends Error {
88
- }
89
- export interface FlashDataSource {
88
+ CONNECTED = "CONNECTED",
90
89
  /**
91
- * For now we only support partially flashing contiguous data.
92
- * This can be generated from microbit-fs directly (via getIntelHexBytes())
93
- * or from an existing Intel Hex via slicePad.
94
- *
95
- * This interface is quite confusing and worth revisiting.
96
- *
97
- * @param boardId the id of the board.
98
- * @throws FlashDataError if we cannot generate hex data.
90
+ * Connecting.
99
91
  */
100
- partialFlashData(boardId: BoardId): Promise<Uint8Array>;
92
+ CONNECTING = "CONNECTING",
101
93
  /**
102
- * @param boardId the id of the board.
103
- * @returns A board-specific (non-universal) Intel Hex file for the given board id.
104
- * @throws FlashDataError if we cannot generate hex data.
94
+ * Reconnecting. When there is unexpected disruption in the connection,
95
+ * a reconnection is attempted.
105
96
  */
106
- fullFlashData(boardId: BoardId): Promise<string>;
97
+ RECONNECTING = "RECONNECTING"
107
98
  }
108
- export interface ConnectOptions {
109
- serial?: boolean;
110
- name?: string;
99
+ export declare class FlashDataError extends Error {
111
100
  }
101
+ export type FlashDataSource = (boardVersion: BoardVersion) => Promise<string | Uint8Array>;
112
102
  export type BoardVersion = "V1" | "V2";
113
103
  export declare class ConnectionStatusEvent extends Event {
114
104
  readonly status: ConnectionStatus;
@@ -134,6 +124,10 @@ export declare class BeforeRequestDevice extends Event {
134
124
  export declare class AfterRequestDevice extends Event {
135
125
  constructor();
136
126
  }
127
+ export declare class BackgroundErrorEvent extends Event {
128
+ readonly errorMessage: string;
129
+ constructor(errorMessage: string);
130
+ }
137
131
  export declare class DeviceConnectionEventMap {
138
132
  "status": ConnectionStatusEvent;
139
133
  "serialdata": SerialDataEvent;
@@ -142,6 +136,7 @@ export declare class DeviceConnectionEventMap {
142
136
  "flash": Event;
143
137
  "beforerequestdevice": Event;
144
138
  "afterrequestdevice": Event;
139
+ "backgrounderror": BackgroundErrorEvent;
145
140
  }
146
141
  export interface DeviceConnection extends TypedEventTarget<DeviceConnectionEventMap> {
147
142
  status: ConnectionStatus;
@@ -159,7 +154,7 @@ export interface DeviceConnection extends TypedEventTarget<DeviceConnectionEvent
159
154
  *
160
155
  * @returns the final connection status.
161
156
  */
162
- connect(options?: ConnectOptions): Promise<ConnectionStatus>;
157
+ connect(): Promise<ConnectionStatus>;
163
158
  /**
164
159
  * Get the board version.
165
160
  *