@microbit/microbit-connection 0.0.0-alpha.7 → 0.0.0-alpha.9

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.
@@ -1,23 +1,161 @@
1
- // @ts-nocheck
2
1
  /**
3
2
  * (c) 2023, Center for Computational Thinking and Design at Aarhus University and contributors
4
3
  *
5
4
  * SPDX-License-Identifier: MIT
6
5
  */
6
+ import { AccelerometerDataEvent } from "./accelerometer.js";
7
+ import { ButtonEvent, ButtonState } from "./buttons.js";
8
+ import { ConnectionStatus, ConnectionStatusEvent, } from "./device.js";
9
+ import { TypedEventTarget } from "./events.js";
10
+ import { NullLogging } from "./logging.js";
7
11
  import * as protocol from "./usb-serial-protocol.js";
8
12
  const connectTimeoutDuration = 10000;
9
13
  class BridgeError extends Error {
10
14
  }
11
15
  class RemoteError extends Error {
12
16
  }
13
- export class MicrobitRadioBridgeConnection {
14
- constructor(usb, logging, remoteDeviceId) {
15
- Object.defineProperty(this, "usb", {
17
+ /**
18
+ * Wraps around a USB connection to implement a subset of services over a serial protocol.
19
+ *
20
+ * When it connects/disconnects it affects the delegate connection.
21
+ */
22
+ export class MicrobitRadioBridgeConnection extends TypedEventTarget {
23
+ constructor(delegate, options) {
24
+ super();
25
+ Object.defineProperty(this, "delegate", {
26
+ enumerable: true,
27
+ configurable: true,
28
+ writable: true,
29
+ value: delegate
30
+ });
31
+ Object.defineProperty(this, "status", {
32
+ enumerable: true,
33
+ configurable: true,
34
+ writable: true,
35
+ value: void 0
36
+ });
37
+ Object.defineProperty(this, "logging", {
38
+ enumerable: true,
39
+ configurable: true,
40
+ writable: true,
41
+ value: void 0
42
+ });
43
+ Object.defineProperty(this, "serialSession", {
44
+ enumerable: true,
45
+ configurable: true,
46
+ writable: true,
47
+ value: void 0
48
+ });
49
+ Object.defineProperty(this, "remoteDeviceId", {
16
50
  enumerable: true,
17
51
  configurable: true,
18
52
  writable: true,
19
- value: usb
53
+ value: void 0
54
+ });
55
+ Object.defineProperty(this, "delegateStatusListner", {
56
+ enumerable: true,
57
+ configurable: true,
58
+ writable: true,
59
+ value: (e) => {
60
+ if (e.status !== ConnectionStatus.CONNECTED) {
61
+ this.setStatus(e.status);
62
+ }
63
+ else {
64
+ this.status = ConnectionStatus.NOT_CONNECTED;
65
+ }
66
+ }
67
+ });
68
+ this.logging = options?.logging ?? new NullLogging();
69
+ this.status = this.statusFromDelegate();
70
+ }
71
+ getBoardVersion() {
72
+ return this.delegate.getBoardVersion();
73
+ }
74
+ serialWrite(data) {
75
+ return this.delegate.serialWrite(data);
76
+ }
77
+ async initialize() {
78
+ await this.delegate.initialize();
79
+ this.setStatus(this.statusFromDelegate());
80
+ this.delegate.addEventListener("status", this.delegateStatusListner);
81
+ }
82
+ dispose() {
83
+ this.delegate.removeEventListener("status", this.delegateStatusListner);
84
+ this.delegate.dispose();
85
+ }
86
+ clearDevice() {
87
+ this.delegate.clearDevice();
88
+ }
89
+ setRemoteDeviceId(remoteDeviceId) {
90
+ this.remoteDeviceId = remoteDeviceId;
91
+ }
92
+ async connect() {
93
+ // TODO: previously this skipped overlapping connect attempts but that seems awkward
94
+ // can we... just not do that? or wait?
95
+ if (this.remoteDeviceId === undefined) {
96
+ throw new BridgeError(`Missing remote micro:bit ID`);
97
+ }
98
+ this.logging.event({
99
+ type: "Connect",
100
+ message: "Serial connect start",
20
101
  });
102
+ await this.delegate.connect();
103
+ try {
104
+ this.serialSession = new RadioBridgeSerialSession(this.logging, this.remoteDeviceId, this.delegate, this.dispatchTypedEvent.bind(this), this.setStatus.bind(this), () => {
105
+ // Remote connection lost
106
+ this.logging.event({
107
+ type: "Serial",
108
+ message: "Serial connection lost 1",
109
+ });
110
+ this.serialSession?.dispose();
111
+ }, () => {
112
+ // Remote connection... even more lost?
113
+ this.logging.event({
114
+ type: "Serial",
115
+ message: "Serial connection lost 2",
116
+ });
117
+ this.serialSession?.dispose();
118
+ });
119
+ await this.serialSession.connect();
120
+ this.logging.event({
121
+ type: "Connect",
122
+ message: "Serial connect success",
123
+ });
124
+ return this.status;
125
+ }
126
+ catch (e) {
127
+ this.logging.error("Failed to initialise serial protocol", e);
128
+ this.logging.event({
129
+ type: "Connect",
130
+ message: "Serial connect failed",
131
+ });
132
+ throw e;
133
+ }
134
+ }
135
+ async disconnect() {
136
+ await this.serialSession?.dispose();
137
+ }
138
+ setStatus(status) {
139
+ this.status = status;
140
+ this.dispatchTypedEvent("status", new ConnectionStatusEvent(status));
141
+ }
142
+ statusFromDelegate() {
143
+ return this.delegate.status == ConnectionStatus.CONNECTED
144
+ ? ConnectionStatus.NOT_CONNECTED
145
+ : this.delegate.status;
146
+ }
147
+ }
148
+ /**
149
+ * Wraps a connected delegate for a single session from attempted serial handshake to error/dispose.
150
+ */
151
+ class RadioBridgeSerialSession {
152
+ processButton(button, type, sensorData) {
153
+ if (sensorData[button] !== this.previousButtonState[button]) {
154
+ this.previousButtonState[button] = sensorData[button];
155
+ this.dispatchTypedEvent(type, new ButtonEvent(type, sensorData[button] ? ButtonState.ShortPress : ButtonState.NotPressed));
156
+ }
157
+ }
158
+ constructor(logging, remoteDeviceId, delegate, dispatchTypedEvent, onStatusChanged, onRemoteConnectionLost1, onRemoteConnectionLost2) {
21
159
  Object.defineProperty(this, "logging", {
22
160
  enumerable: true,
23
161
  configurable: true,
@@ -30,20 +168,49 @@ export class MicrobitRadioBridgeConnection {
30
168
  writable: true,
31
169
  value: remoteDeviceId
32
170
  });
33
- Object.defineProperty(this, "responseMap", {
171
+ Object.defineProperty(this, "delegate", {
34
172
  enumerable: true,
35
173
  configurable: true,
36
174
  writable: true,
37
- value: new Map()
175
+ value: delegate
38
176
  });
39
- // To avoid concurrent connect attempts
40
- Object.defineProperty(this, "isConnecting", {
177
+ Object.defineProperty(this, "dispatchTypedEvent", {
41
178
  enumerable: true,
42
179
  configurable: true,
43
180
  writable: true,
44
- value: false
181
+ value: dispatchTypedEvent
45
182
  });
46
- Object.defineProperty(this, "connectionCheckIntervalId", {
183
+ Object.defineProperty(this, "onStatusChanged", {
184
+ enumerable: true,
185
+ configurable: true,
186
+ writable: true,
187
+ value: onStatusChanged
188
+ });
189
+ Object.defineProperty(this, "onRemoteConnectionLost1", {
190
+ enumerable: true,
191
+ configurable: true,
192
+ writable: true,
193
+ value: onRemoteConnectionLost1
194
+ });
195
+ Object.defineProperty(this, "onRemoteConnectionLost2", {
196
+ enumerable: true,
197
+ configurable: true,
198
+ writable: true,
199
+ value: onRemoteConnectionLost2
200
+ });
201
+ Object.defineProperty(this, "unprocessedData", {
202
+ enumerable: true,
203
+ configurable: true,
204
+ writable: true,
205
+ value: ""
206
+ });
207
+ Object.defineProperty(this, "previousButtonState", {
208
+ enumerable: true,
209
+ configurable: true,
210
+ writable: true,
211
+ value: { buttonA: 0, buttonB: 0 }
212
+ });
213
+ Object.defineProperty(this, "onPeriodicMessageReceived", {
47
214
  enumerable: true,
48
215
  configurable: true,
49
216
  writable: true,
@@ -55,95 +222,71 @@ export class MicrobitRadioBridgeConnection {
55
222
  writable: true,
56
223
  value: void 0
57
224
  });
58
- Object.defineProperty(this, "isReconnect", {
225
+ Object.defineProperty(this, "connectionCheckIntervalId", {
59
226
  enumerable: true,
60
227
  configurable: true,
61
228
  writable: true,
62
- value: false
229
+ value: void 0
63
230
  });
64
- // Whether this is the final reconnection attempt.
65
- Object.defineProperty(this, "finalAttempt", {
231
+ Object.defineProperty(this, "serialErrorListener", {
66
232
  enumerable: true,
67
233
  configurable: true,
68
234
  writable: true,
69
- value: false
70
- });
71
- }
72
- async connect() {
73
- this.logging.event({
74
- type: this.isReconnect ? "Reconnect" : "Connect",
75
- message: "Serial connect start",
235
+ value: (e) => {
236
+ this.logging.error("Serial error", e);
237
+ void this.dispose();
238
+ }
76
239
  });
77
- if (this.isConnecting) {
78
- this.logging.log("Skipping connect attempt when one is already in progress");
79
- return;
80
- }
81
- this.isConnecting = true;
82
- let unprocessedData = "";
83
- let previousButtonState = { A: 0, B: 0 };
84
- let onPeriodicMessageRecieved;
85
- const handleError = (e) => {
86
- this.logging.error("Serial error", e);
87
- void this.disconnectInternal(false, "bridge");
88
- };
89
- const processMessage = (data) => {
90
- const messages = protocol.splitMessages(unprocessedData + data);
91
- unprocessedData = messages.remainingInput;
92
- messages.messages.forEach(async (msg) => {
93
- this.lastReceivedMessageTimestamp = Date.now();
94
- // Messages are either periodic sensor data or command/response
95
- const sensorData = protocol.processPeriodicMessage(msg);
96
- if (sensorData) {
97
- // stateOnReconnected();
98
- // if (onPeriodicMessageRecieved) {
99
- // onPeriodicMessageRecieved();
100
- // onPeriodicMessageRecieved = undefined;
101
- // }
102
- // onAccelerometerChange(
103
- // sensorData.accelerometerX,
104
- // sensorData.accelerometerY,
105
- // sensorData.accelerometerZ
106
- // );
107
- // if (sensorData.buttonA !== previousButtonState.A) {
108
- // previousButtonState.A = sensorData.buttonA;
109
- // onButtonChange(sensorData.buttonA, "A");
110
- // }
111
- // if (sensorData.buttonB !== previousButtonState.B) {
112
- // previousButtonState.B = sensorData.buttonB;
113
- // onButtonChange(sensorData.buttonB, "B");
114
- // }
115
- }
116
- else {
117
- const messageResponse = protocol.processResponseMessage(msg);
118
- if (!messageResponse) {
119
- return;
240
+ Object.defineProperty(this, "serialDataListener", {
241
+ enumerable: true,
242
+ configurable: true,
243
+ writable: true,
244
+ value: (event) => {
245
+ const { data } = event;
246
+ const messages = protocol.splitMessages(this.unprocessedData + data);
247
+ this.unprocessedData = messages.remainingInput;
248
+ messages.messages.forEach(async (msg) => {
249
+ this.lastReceivedMessageTimestamp = Date.now();
250
+ // Messages are either periodic sensor data or command/response
251
+ const sensorData = protocol.processPeriodicMessage(msg);
252
+ if (sensorData) {
253
+ this.onPeriodicMessageReceived?.();
254
+ this.dispatchTypedEvent("accelerometerdatachanged", new AccelerometerDataEvent({
255
+ x: sensorData.accelerometerX,
256
+ y: sensorData.accelerometerY,
257
+ z: sensorData.accelerometerZ,
258
+ }));
259
+ this.processButton("buttonA", "buttonachanged", sensorData);
260
+ this.processButton("buttonB", "buttonbchanged", sensorData);
120
261
  }
121
- const responseResolve = this.responseMap.get(messageResponse.messageId);
122
- if (responseResolve) {
123
- this.responseMap.delete(messageResponse.messageId);
124
- responseResolve(messageResponse);
262
+ else {
263
+ const messageResponse = protocol.processResponseMessage(msg);
264
+ if (!messageResponse) {
265
+ return;
266
+ }
267
+ const responseResolve = this.responseMap.get(messageResponse.messageId);
268
+ if (responseResolve) {
269
+ this.responseMap.delete(messageResponse.messageId);
270
+ responseResolve(messageResponse);
271
+ }
125
272
  }
126
- }
127
- });
128
- };
273
+ });
274
+ }
275
+ });
276
+ Object.defineProperty(this, "responseMap", {
277
+ enumerable: true,
278
+ configurable: true,
279
+ writable: true,
280
+ value: new Map()
281
+ });
282
+ }
283
+ async connect() {
284
+ this.delegate.addEventListener("serialdata", this.serialDataListener);
285
+ this.delegate.addEventListener("serialerror", this.serialErrorListener);
129
286
  try {
130
- await this.usb.startSerial(processMessage, handleError);
287
+ await this.delegate.softwareReset();
131
288
  await this.handshake();
132
- // stateOnConnected(DeviceRequestStates.INPUT);
133
- // Check for connection lost
134
- if (this.connectionCheckIntervalId === undefined) {
135
- this.connectionCheckIntervalId = setInterval(async () => {
136
- if (this.lastReceivedMessageTimestamp &&
137
- Date.now() - this.lastReceivedMessageTimestamp > 1_000) {
138
- // stateOnReconnectionAttempt();
139
- }
140
- if (this.lastReceivedMessageTimestamp &&
141
- Date.now() - this.lastReceivedMessageTimestamp >
142
- connectTimeoutDuration) {
143
- await this.handleReconnect();
144
- }
145
- }, 1000);
146
- }
289
+ this.onStatusChanged(ConnectionStatus.CONNECTED);
147
290
  this.logging.log(`Serial: using remote device id ${this.remoteDeviceId}`);
148
291
  const remoteMbIdCommand = protocol.generateCmdRemoteMbId(this.remoteDeviceId);
149
292
  const remoteMbIdResponse = await this.sendCmdWaitResponse(remoteMbIdCommand);
@@ -151,67 +294,31 @@ export class MicrobitRadioBridgeConnection {
151
294
  remoteMbIdResponse.value !== this.remoteDeviceId) {
152
295
  throw new BridgeError(`Failed to set remote micro:bit ID. Expected ${this.remoteDeviceId}, got ${remoteMbIdResponse.value}`);
153
296
  }
154
- // For now we only support input state.
155
- // TODO: when do we do this?
156
- if (false) {
157
- // Request the micro:bit to start sending the periodic messages
158
- const startCmd = protocol.generateCmdStart({
159
- accelerometer: true,
160
- buttons: true,
161
- });
162
- const periodicMessagePromise = new Promise((resolve, reject) => {
163
- onPeriodicMessageRecieved = resolve;
164
- setTimeout(() => {
165
- onPeriodicMessageRecieved = undefined;
166
- reject(new Error("Failed to receive data from remote micro:bit"));
167
- }, 500);
168
- });
169
- const startCmdResponse = await this.sendCmdWaitResponse(startCmd);
170
- if (startCmdResponse.type === protocol.ResponseTypes.Error) {
171
- throw new RemoteError(`Failed to start streaming sensors data. Error response received: ${startCmdResponse.message}`);
172
- }
173
- if (this.isReconnect) {
174
- await periodicMessagePromise;
175
- }
176
- else {
177
- periodicMessagePromise.catch(async (e) => {
178
- this.logging.error("Failed to initialise serial protocol", e);
179
- await this.disconnectInternal(false, "remote");
180
- this.isConnecting = false;
181
- });
182
- }
183
- }
184
- // stateOnAssigned(DeviceRequestStates.INPUT, this.usb.getModelNumber());
185
- // stateOnReady(DeviceRequestStates.INPUT);
186
- this.logging.event({
187
- type: this.isReconnect ? "Reconnect" : "Connect",
188
- message: "Serial connect success",
297
+ // Request the micro:bit to start sending the periodic messages
298
+ const startCmd = protocol.generateCmdStart({
299
+ accelerometer: true,
300
+ buttons: true,
189
301
  });
190
- }
191
- catch (e) {
192
- this.logging.error("Failed to initialise serial protocol", e);
193
- this.logging.event({
194
- type: this.isReconnect ? "Reconnect" : "Connect",
195
- message: "Serial connect failed",
302
+ const periodicMessagePromise = new Promise((resolve, reject) => {
303
+ this.onPeriodicMessageReceived = resolve;
304
+ setTimeout(() => {
305
+ this.onPeriodicMessageReceived = undefined;
306
+ reject(new Error("Failed to receive data from remote micro:bit"));
307
+ }, 500);
196
308
  });
197
- const reconnectHelp = e instanceof BridgeError ? "bridge" : "remote";
198
- await this.disconnectInternal(false, reconnectHelp);
199
- throw e;
309
+ const startCmdResponse = await this.sendCmdWaitResponse(startCmd);
310
+ if (startCmdResponse.type === protocol.ResponseTypes.Error) {
311
+ throw new RemoteError(`Failed to start streaming sensors data. Error response received: ${startCmdResponse.message}`);
312
+ }
313
+ // TODO: in the first-time connection case we used to move the error/disconnect to the background here, why? timing?
314
+ await periodicMessagePromise;
315
+ this.startConnectionCheck();
200
316
  }
201
- finally {
202
- this.finalAttempt = false;
203
- this.isConnecting = false;
317
+ catch (e) {
318
+ this.dispose();
204
319
  }
205
320
  }
206
- async disconnect() {
207
- return this.disconnectInternal(true, "bridge");
208
- }
209
- stopConnectionCheck() {
210
- clearInterval(this.connectionCheckIntervalId);
211
- this.connectionCheckIntervalId = undefined;
212
- this.lastReceivedMessageTimestamp = undefined;
213
- }
214
- async disconnectInternal(userDisconnect) {
321
+ async dispose() {
215
322
  this.stopConnectionCheck();
216
323
  try {
217
324
  await this.sendCmdWaitResponse(protocol.generateCmdStop());
@@ -220,42 +327,9 @@ export class MicrobitRadioBridgeConnection {
220
327
  // If this fails the remote micro:bit has already gone away.
221
328
  }
222
329
  this.responseMap.clear();
223
- await this.usb.stopSerial();
224
- // stateOnDisconnected(
225
- // DeviceRequestStates.INPUT,
226
- // userDisconnect || this.finalAttempt
227
- // ? false
228
- // : this.isReconnect
229
- // ? "autoReconnect"
230
- // : "connect",
231
- // reconnectHelp
232
- // );
233
- }
234
- async handleReconnect() {
235
- if (this.isConnecting) {
236
- this.logging.log("Serial disconnect ignored... reconnect already in progress");
237
- return;
238
- }
239
- try {
240
- this.stopConnectionCheck();
241
- this.logging.log("Serial disconnected... automatically trying to reconnect");
242
- this.responseMap.clear();
243
- await this.usb.stopSerial();
244
- await this.usb.softwareReset();
245
- await this.reconnect();
246
- }
247
- catch (e) {
248
- this.logging.error("Serial connect triggered by disconnect listener failed", e);
249
- }
250
- finally {
251
- this.isConnecting = false;
252
- }
253
- }
254
- async reconnect(finalAttempt = false) {
255
- this.finalAttempt = finalAttempt;
256
- this.logging.log("Serial reconnect");
257
- this.isReconnect = true;
258
- await this.connect();
330
+ this.delegate.removeEventListener("serialdata", this.serialDataListener);
331
+ this.delegate.removeEventListener("serialerror", this.serialErrorListener);
332
+ this.onStatusChanged(ConnectionStatus.NOT_CONNECTED);
259
333
  }
260
334
  async sendCmdWaitResponse(cmd) {
261
335
  const responsePromise = new Promise((resolve, reject) => {
@@ -265,9 +339,30 @@ export class MicrobitRadioBridgeConnection {
265
339
  reject(new Error(`Timeout waiting for response ${cmd.messageId}`));
266
340
  }, 1_000);
267
341
  });
268
- await this.usb.serialWrite(cmd.message);
342
+ await this.delegate.serialWrite(cmd.message);
269
343
  return responsePromise;
270
344
  }
345
+ startConnectionCheck() {
346
+ // Check for connection lost
347
+ if (this.connectionCheckIntervalId === undefined) {
348
+ this.connectionCheckIntervalId = setInterval(async () => {
349
+ if (this.lastReceivedMessageTimestamp &&
350
+ Date.now() - this.lastReceivedMessageTimestamp > 1_000) {
351
+ this.onRemoteConnectionLost1();
352
+ }
353
+ if (this.lastReceivedMessageTimestamp &&
354
+ Date.now() - this.lastReceivedMessageTimestamp >
355
+ connectTimeoutDuration) {
356
+ this.onRemoteConnectionLost2();
357
+ }
358
+ }, 1000);
359
+ }
360
+ }
361
+ stopConnectionCheck() {
362
+ clearInterval(this.connectionCheckIntervalId);
363
+ this.connectionCheckIntervalId = undefined;
364
+ this.lastReceivedMessageTimestamp = undefined;
365
+ }
271
366
  async handshake() {
272
367
  // There is an issue where we cannot read data out from the micro:bit serial
273
368
  // buffer until the buffer has been filled.
@@ -305,14 +400,4 @@ export class MicrobitRadioBridgeConnection {
305
400
  }
306
401
  }
307
402
  }
308
- export const startSerialConnection = async (logging, usb, remoteDeviceId) => {
309
- try {
310
- const serial = new MicrobitRadioBridgeConnection(usb, logging, remoteDeviceId);
311
- await serial.connect();
312
- return serial;
313
- }
314
- catch (e) {
315
- return undefined;
316
- }
317
- };
318
403
  //# sourceMappingURL=usb-radio-bridge.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"usb-radio-bridge.js","sourceRoot":"","sources":["../lib/usb-radio-bridge.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"usb-radio-bridge.js","sourceRoot":"","sources":["../lib/usb-radio-bridge.ts"],"names":[],"mappings":"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"}
package/build/usb.d.ts CHANGED
@@ -50,6 +50,7 @@ export declare class MicrobitWebUSBConnection extends TypedEventTarget<DeviceCon
50
50
  private setStatus;
51
51
  private withEnrichedErrors;
52
52
  serialWrite(data: string): Promise<void>;
53
+ softwareReset(): Promise<void>;
53
54
  private handleDisconnect;
54
55
  clearDevice(): Promise<void>;
55
56
  private connectInternal;
package/build/usb.js CHANGED
@@ -409,6 +409,9 @@ export class MicrobitWebUSBConnection extends TypedEventTarget {
409
409
  }
410
410
  });
411
411
  }
412
+ async softwareReset() {
413
+ await this.connection?.softwareReset();
414
+ }
412
415
  async clearDevice() {
413
416
  await this.disconnect();
414
417
  this.device = undefined;