@microbit/microbit-connection 0.1.0 → 0.9.0-apps.alpha.1

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 (148) hide show
  1. package/README.md +4 -4
  2. package/build/cjs/accelerometer-service.d.ts +5 -5
  3. package/build/cjs/accelerometer-service.js +41 -42
  4. package/build/cjs/accelerometer-service.js.map +1 -1
  5. package/build/cjs/async-util.d.ts +9 -0
  6. package/build/cjs/async-util.js +27 -7
  7. package/build/cjs/async-util.js.map +1 -1
  8. package/build/cjs/bluetooth-device-wrapper.d.ts +61 -27
  9. package/build/cjs/bluetooth-device-wrapper.js +285 -266
  10. package/build/cjs/bluetooth-device-wrapper.js.map +1 -1
  11. package/build/cjs/bluetooth-profile.d.ts +43 -35
  12. package/build/cjs/bluetooth-profile.js +35 -29
  13. package/build/cjs/bluetooth-profile.js.map +1 -1
  14. package/build/cjs/bluetooth.d.ts +10 -6
  15. package/build/cjs/bluetooth.js +286 -100
  16. package/build/cjs/bluetooth.js.map +1 -1
  17. package/build/cjs/button-service.d.ts +5 -5
  18. package/build/cjs/button-service.js +31 -45
  19. package/build/cjs/button-service.js.map +1 -1
  20. package/build/cjs/device-information-service.d.ts +6 -0
  21. package/build/cjs/device-information-service.js +34 -0
  22. package/build/cjs/device-information-service.js.map +1 -0
  23. package/build/cjs/device.d.ts +65 -8
  24. package/build/cjs/device.js +16 -2
  25. package/build/cjs/device.js.map +1 -1
  26. package/build/cjs/dfu-service.d.ts +9 -0
  27. package/build/cjs/dfu-service.js +26 -0
  28. package/build/cjs/dfu-service.js.map +1 -0
  29. package/build/cjs/flashing/flashing-full.d.ts +14 -0
  30. package/build/cjs/flashing/flashing-full.js +87 -0
  31. package/build/cjs/flashing/flashing-full.js.map +1 -0
  32. package/build/cjs/flashing/flashing-makecode.d.ts +6 -0
  33. package/build/cjs/flashing/flashing-makecode.js +48 -0
  34. package/build/cjs/flashing/flashing-makecode.js.map +1 -0
  35. package/build/cjs/flashing/flashing-partial.d.ts +9 -0
  36. package/build/cjs/flashing/flashing-partial.js +98 -0
  37. package/build/cjs/flashing/flashing-partial.js.map +1 -0
  38. package/build/cjs/flashing/flashing-v1.d.ts +11 -0
  39. package/build/cjs/flashing/flashing-v1.js +24 -0
  40. package/build/cjs/flashing/flashing-v1.js.map +1 -0
  41. package/build/cjs/flashing/nordic-dfu.d.ts +3 -0
  42. package/build/cjs/flashing/nordic-dfu.js +214 -0
  43. package/build/cjs/flashing/nordic-dfu.js.map +1 -0
  44. package/build/cjs/flashing/zip.d.ts +12 -0
  45. package/build/cjs/flashing/zip.js +177 -0
  46. package/build/cjs/flashing/zip.js.map +1 -0
  47. package/build/cjs/index.d.ts +3 -3
  48. package/build/cjs/index.js +2 -1
  49. package/build/cjs/index.js.map +1 -1
  50. package/build/cjs/led-service.d.ts +5 -7
  51. package/build/cjs/led-service.js +13 -44
  52. package/build/cjs/led-service.js.map +1 -1
  53. package/build/cjs/logging.d.ts +1 -1
  54. package/build/cjs/logging.js +3 -3
  55. package/build/cjs/logging.js.map +1 -1
  56. package/build/cjs/magnetometer-service.d.ts +5 -9
  57. package/build/cjs/magnetometer-service.js +30 -65
  58. package/build/cjs/magnetometer-service.js.map +1 -1
  59. package/build/cjs/partial-flashing-service.d.ts +45 -0
  60. package/build/cjs/partial-flashing-service.js +110 -0
  61. package/build/cjs/partial-flashing-service.js.map +1 -0
  62. package/build/cjs/uart-service.d.ts +4 -5
  63. package/build/cjs/uart-service.js +19 -40
  64. package/build/cjs/uart-service.js.map +1 -1
  65. package/build/cjs/usb-device-wrapper.js +33 -8
  66. package/build/cjs/usb-device-wrapper.js.map +1 -1
  67. package/build/cjs/usb-partial-flashing.d.ts +1 -3
  68. package/build/cjs/usb-partial-flashing.js +4 -3
  69. package/build/cjs/usb-partial-flashing.js.map +1 -1
  70. package/build/cjs/usb-radio-bridge.js +1 -2
  71. package/build/cjs/usb-radio-bridge.js.map +1 -1
  72. package/build/cjs/usb.d.ts +4 -2
  73. package/build/cjs/usb.js +31 -16
  74. package/build/cjs/usb.js.map +1 -1
  75. package/build/esm/accelerometer-service.d.ts +5 -5
  76. package/build/esm/accelerometer-service.js +42 -43
  77. package/build/esm/accelerometer-service.js.map +1 -1
  78. package/build/esm/async-util.d.ts +9 -0
  79. package/build/esm/async-util.js +22 -6
  80. package/build/esm/async-util.js.map +1 -1
  81. package/build/esm/bluetooth-device-wrapper.d.ts +61 -27
  82. package/build/esm/bluetooth-device-wrapper.js +284 -265
  83. package/build/esm/bluetooth-device-wrapper.js.map +1 -1
  84. package/build/esm/bluetooth-profile.d.ts +43 -35
  85. package/build/esm/bluetooth-profile.js +35 -29
  86. package/build/esm/bluetooth-profile.js.map +1 -1
  87. package/build/esm/bluetooth.d.ts +10 -6
  88. package/build/esm/bluetooth.js +263 -103
  89. package/build/esm/bluetooth.js.map +1 -1
  90. package/build/esm/button-service.d.ts +5 -5
  91. package/build/esm/button-service.js +32 -46
  92. package/build/esm/button-service.js.map +1 -1
  93. package/build/esm/device-information-service.d.ts +6 -0
  94. package/build/esm/device-information-service.js +30 -0
  95. package/build/esm/device-information-service.js.map +1 -0
  96. package/build/esm/device.d.ts +65 -8
  97. package/build/esm/device.js +15 -1
  98. package/build/esm/device.js.map +1 -1
  99. package/build/esm/dfu-service.d.ts +9 -0
  100. package/build/esm/dfu-service.js +22 -0
  101. package/build/esm/dfu-service.js.map +1 -0
  102. package/build/esm/flashing/flashing-full.d.ts +14 -0
  103. package/build/esm/flashing/flashing-full.js +84 -0
  104. package/build/esm/flashing/flashing-full.js.map +1 -0
  105. package/build/esm/flashing/flashing-makecode.d.ts +6 -0
  106. package/build/esm/flashing/flashing-makecode.js +44 -0
  107. package/build/esm/flashing/flashing-makecode.js.map +1 -0
  108. package/build/esm/flashing/flashing-partial.d.ts +9 -0
  109. package/build/esm/flashing/flashing-partial.js +95 -0
  110. package/build/esm/flashing/flashing-partial.js.map +1 -0
  111. package/build/esm/flashing/flashing-v1.d.ts +11 -0
  112. package/build/esm/flashing/flashing-v1.js +20 -0
  113. package/build/esm/flashing/flashing-v1.js.map +1 -0
  114. package/build/esm/flashing/nordic-dfu.d.ts +3 -0
  115. package/build/esm/flashing/nordic-dfu.js +211 -0
  116. package/build/esm/flashing/nordic-dfu.js.map +1 -0
  117. package/build/esm/flashing/zip.d.ts +12 -0
  118. package/build/esm/flashing/zip.js +174 -0
  119. package/build/esm/flashing/zip.js.map +1 -0
  120. package/build/esm/index.d.ts +3 -3
  121. package/build/esm/index.js +2 -2
  122. package/build/esm/index.js.map +1 -1
  123. package/build/esm/led-service.d.ts +5 -7
  124. package/build/esm/led-service.js +13 -44
  125. package/build/esm/led-service.js.map +1 -1
  126. package/build/esm/logging.d.ts +1 -1
  127. package/build/esm/logging.js +1 -1
  128. package/build/esm/logging.js.map +1 -1
  129. package/build/esm/magnetometer-service.d.ts +5 -9
  130. package/build/esm/magnetometer-service.js +31 -66
  131. package/build/esm/magnetometer-service.js.map +1 -1
  132. package/build/esm/partial-flashing-service.d.ts +45 -0
  133. package/build/esm/partial-flashing-service.js +106 -0
  134. package/build/esm/partial-flashing-service.js.map +1 -0
  135. package/build/esm/uart-service.d.ts +4 -5
  136. package/build/esm/uart-service.js +19 -40
  137. package/build/esm/uart-service.js.map +1 -1
  138. package/build/esm/usb-device-wrapper.js +33 -8
  139. package/build/esm/usb-device-wrapper.js.map +1 -1
  140. package/build/esm/usb-partial-flashing.d.ts +1 -3
  141. package/build/esm/usb-partial-flashing.js +4 -3
  142. package/build/esm/usb-partial-flashing.js.map +1 -1
  143. package/build/esm/usb-radio-bridge.js +2 -3
  144. package/build/esm/usb-radio-bridge.js.map +1 -1
  145. package/build/esm/usb.d.ts +4 -2
  146. package/build/esm/usb.js +33 -18
  147. package/build/esm/usb.js.map +1 -1
  148. package/package.json +7 -3
package/README.md CHANGED
@@ -38,8 +38,8 @@ import { createUniversalHexFlashDataSource } from "@microbit/microbit-connection
38
38
 
39
39
  await usb.flash(createUniversalHexFlashDataSource(universalHexString), {
40
40
  partial: true,
41
- progress: (percentage: number | undefined) => {
42
- console.log(percentage);
41
+ progress: (stage, percentage) => {
42
+ console.log(stage, percentage);
43
43
  },
44
44
  });
45
45
  ```
@@ -67,8 +67,8 @@ await usb.flash(
67
67
  },
68
68
  {
69
69
  partial: true,
70
- progress: (percentage: number | undefined) => {
71
- console.log(percentage);
70
+ progress: (stage, percentage) => {
71
+ console.log(stage, percentage);
72
72
  },
73
73
  },
74
74
  );
@@ -2,12 +2,12 @@ import { AccelerometerData } from "./accelerometer.js";
2
2
  import { Service } from "./bluetooth-device-wrapper.js";
3
3
  import { TypedServiceEvent, TypedServiceEventDispatcher } from "./service-events.js";
4
4
  export declare class AccelerometerService implements Service {
5
- private accelerometerDataCharacteristic;
6
- private accelerometerPeriodCharacteristic;
5
+ private deviceId;
7
6
  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>;
7
+ uuid: string;
8
+ static createService(deviceId: string, dispatchTypedEvent: TypedServiceEventDispatcher): AccelerometerService;
9
+ constructor(deviceId: string, dispatchTypedEvent: TypedServiceEventDispatcher);
10
+ getRelevantEvents(): TypedServiceEvent[];
11
11
  private dataViewToData;
12
12
  getData(): Promise<AccelerometerData>;
13
13
  getPeriod(): Promise<number>;
@@ -1,22 +1,20 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.AccelerometerService = void 0;
4
+ const bluetooth_le_1 = require("@capacitor-community/bluetooth-le");
4
5
  const accelerometer_js_1 = require("./accelerometer.js");
5
6
  const bluetooth_profile_js_1 = require("./bluetooth-profile.js");
6
7
  const device_js_1 = require("./device.js");
7
8
  class AccelerometerService {
8
- constructor(accelerometerDataCharacteristic, accelerometerPeriodCharacteristic, dispatchTypedEvent, queueGattOperation) {
9
- Object.defineProperty(this, "accelerometerDataCharacteristic", {
10
- enumerable: true,
11
- configurable: true,
12
- writable: true,
13
- value: accelerometerDataCharacteristic
14
- });
15
- Object.defineProperty(this, "accelerometerPeriodCharacteristic", {
9
+ static createService(deviceId, dispatchTypedEvent) {
10
+ return new AccelerometerService(deviceId, dispatchTypedEvent);
11
+ }
12
+ constructor(deviceId, dispatchTypedEvent) {
13
+ Object.defineProperty(this, "deviceId", {
16
14
  enumerable: true,
17
15
  configurable: true,
18
16
  writable: true,
19
- value: accelerometerPeriodCharacteristic
17
+ value: deviceId
20
18
  });
21
19
  Object.defineProperty(this, "dispatchTypedEvent", {
22
20
  enumerable: true,
@@ -24,38 +22,15 @@ class AccelerometerService {
24
22
  writable: true,
25
23
  value: dispatchTypedEvent
26
24
  });
27
- Object.defineProperty(this, "queueGattOperation", {
25
+ Object.defineProperty(this, "uuid", {
28
26
  enumerable: true,
29
27
  configurable: true,
30
28
  writable: true,
31
- value: queueGattOperation
32
- });
33
- this.accelerometerDataCharacteristic.addEventListener("characteristicvaluechanged", (event) => {
34
- const target = event.target;
35
- const data = this.dataViewToData(target.value);
36
- this.dispatchTypedEvent("accelerometerdatachanged", new accelerometer_js_1.AccelerometerDataEvent(data));
29
+ value: bluetooth_profile_js_1.profile.accelerometer.id
37
30
  });
38
31
  }
39
- static async createService(gattServer, dispatcher, queueGattOperation, listenerInit) {
40
- let accelerometerService;
41
- try {
42
- accelerometerService = await gattServer.getPrimaryService(bluetooth_profile_js_1.profile.accelerometer.id);
43
- }
44
- catch (err) {
45
- if (listenerInit) {
46
- dispatcher("backgrounderror", new device_js_1.BackgroundErrorEvent(err));
47
- return;
48
- }
49
- else {
50
- throw new device_js_1.DeviceError({
51
- code: "service-missing",
52
- message: err,
53
- });
54
- }
55
- }
56
- const accelerometerDataCharacteristic = await accelerometerService.getCharacteristic(bluetooth_profile_js_1.profile.accelerometer.characteristics.data.id);
57
- const accelerometerPeriodCharacteristic = await accelerometerService.getCharacteristic(bluetooth_profile_js_1.profile.accelerometer.characteristics.period.id);
58
- return new AccelerometerService(accelerometerDataCharacteristic, accelerometerPeriodCharacteristic, dispatcher, queueGattOperation);
32
+ getRelevantEvents() {
33
+ return ["accelerometerdatachanged"];
59
34
  }
60
35
  dataViewToData(dataView) {
61
36
  return {
@@ -65,11 +40,11 @@ class AccelerometerService {
65
40
  };
66
41
  }
67
42
  async getData() {
68
- const dataView = await this.queueGattOperation(() => this.accelerometerDataCharacteristic.readValue());
43
+ const dataView = await bluetooth_le_1.BleClient.read(this.deviceId, bluetooth_profile_js_1.profile.accelerometer.id, bluetooth_profile_js_1.profile.accelerometer.characteristics.data.id);
69
44
  return this.dataViewToData(dataView);
70
45
  }
71
46
  async getPeriod() {
72
- const dataView = await this.queueGattOperation(() => this.accelerometerPeriodCharacteristic.readValue());
47
+ const dataView = await bluetooth_le_1.BleClient.read(this.deviceId, bluetooth_profile_js_1.profile.accelerometer.id, bluetooth_profile_js_1.profile.accelerometer.characteristics.period.id);
73
48
  return dataView.getUint16(0, true);
74
49
  }
75
50
  async setPeriod(value) {
@@ -83,18 +58,42 @@ class AccelerometerService {
83
58
  // https://lancaster-university.github.io/microbit-docs/ble/profile/#about-the-accelerometer-service
84
59
  const dataView = new DataView(new ArrayBuffer(2));
85
60
  dataView.setUint16(0, value, true);
86
- return this.queueGattOperation(() => this.accelerometerPeriodCharacteristic.writeValue(dataView));
61
+ await bluetooth_le_1.BleClient.write(this.deviceId, bluetooth_profile_js_1.profile.accelerometer.id, bluetooth_profile_js_1.profile.accelerometer.characteristics.period.id, dataView);
87
62
  }
88
63
  async startNotifications(type) {
89
- await this.characteristicForEvent(type)?.startNotifications();
64
+ const result = this.characteristicForEvent(type);
65
+ if (result) {
66
+ const { service, characteristic } = result;
67
+ try {
68
+ await bluetooth_le_1.BleClient.startNotifications(this.deviceId, service, characteristic, (value) => {
69
+ const data = this.dataViewToData(value);
70
+ this.dispatchTypedEvent("accelerometerdatachanged", new accelerometer_js_1.AccelerometerDataEvent(data));
71
+ });
72
+ }
73
+ catch (e) {
74
+ this.dispatchTypedEvent("backgrounderror", new device_js_1.BackgroundErrorEvent("Failed to start notifications", e));
75
+ }
76
+ }
90
77
  }
91
78
  async stopNotifications(type) {
92
- await this.characteristicForEvent(type)?.stopNotifications();
79
+ const result = this.characteristicForEvent(type);
80
+ if (result) {
81
+ const { service, characteristic } = result;
82
+ try {
83
+ await bluetooth_le_1.BleClient.stopNotifications(this.deviceId, service, characteristic);
84
+ }
85
+ catch (e) {
86
+ this.dispatchTypedEvent("backgrounderror", new device_js_1.BackgroundErrorEvent("Failed to stop notifications", e));
87
+ }
88
+ }
93
89
  }
94
90
  characteristicForEvent(type) {
95
91
  switch (type) {
96
92
  case "accelerometerdatachanged": {
97
- return this.accelerometerDataCharacteristic;
93
+ return {
94
+ service: bluetooth_profile_js_1.profile.accelerometer.id,
95
+ characteristic: bluetooth_profile_js_1.profile.accelerometer.characteristics.data.id,
96
+ };
98
97
  }
99
98
  default: {
100
99
  return undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"accelerometer-service.js","sourceRoot":"","sources":["../../lib/accelerometer-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"accelerometer-service.js","sourceRoot":"","sources":["../../lib/accelerometer-service.ts"],"names":[],"mappings":"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"}
@@ -5,9 +5,18 @@
5
5
  */
6
6
  export declare class TimeoutError extends Error {
7
7
  }
8
+ export declare class DisconnectError extends Error {
9
+ constructor(message?: string);
10
+ }
8
11
  /**
9
12
  * Utility to time out an action after a delay.
10
13
  *
11
14
  * The action cannot be cancelled; it may still proceed after the timeout.
12
15
  */
13
16
  export declare function withTimeout<T>(actionPromise: Promise<T>, timeout: number): Promise<T>;
17
+ export declare function delay(millis: number): Promise<unknown>;
18
+ export declare function timeoutErrorAfter<T>(millis: number, message?: string): Promise<T>;
19
+ export declare function disconnectErrorCallback<T>(message?: string): {
20
+ promise: Promise<T>;
21
+ callback: () => void | undefined;
22
+ };
@@ -1,7 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.TimeoutError = void 0;
3
+ exports.DisconnectError = exports.TimeoutError = void 0;
4
4
  exports.withTimeout = withTimeout;
5
+ exports.delay = delay;
6
+ exports.timeoutErrorAfter = timeoutErrorAfter;
7
+ exports.disconnectErrorCallback = disconnectErrorCallback;
5
8
  /**
6
9
  * (c) 2021, Micro:bit Educational Foundation and contributors
7
10
  *
@@ -10,18 +13,35 @@ exports.withTimeout = withTimeout;
10
13
  class TimeoutError extends Error {
11
14
  }
12
15
  exports.TimeoutError = TimeoutError;
16
+ class DisconnectError extends Error {
17
+ constructor(message = "Disconnect") {
18
+ super(message);
19
+ }
20
+ }
21
+ exports.DisconnectError = DisconnectError;
13
22
  /**
14
23
  * Utility to time out an action after a delay.
15
24
  *
16
25
  * The action cannot be cancelled; it may still proceed after the timeout.
17
26
  */
18
27
  async function withTimeout(actionPromise, timeout) {
19
- const timeoutPromise = new Promise((_, reject) => {
20
- setTimeout(() => {
21
- reject(new TimeoutError());
22
- }, timeout);
28
+ return Promise.race([
29
+ actionPromise,
30
+ timeoutErrorAfter(timeout),
31
+ ]);
32
+ }
33
+ async function delay(millis) {
34
+ return new Promise((resolve) => setTimeout(resolve, millis));
35
+ }
36
+ async function timeoutErrorAfter(millis, message = "Timeout") {
37
+ await delay(millis);
38
+ throw new TimeoutError(message);
39
+ }
40
+ function disconnectErrorCallback(message = "Disconnect") {
41
+ let callback;
42
+ const promise = new Promise((_, reject) => {
43
+ callback = () => reject(new DisconnectError(message));
23
44
  });
24
- // timeoutPromise never resolves so result must be from action
25
- return Promise.race([actionPromise, timeoutPromise]);
45
+ return { promise, callback: callback };
26
46
  }
27
47
  //# sourceMappingURL=async-util.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"async-util.js","sourceRoot":"","sources":["../../lib/async-util.ts"],"names":[],"mappings":";;;AAYA,kCAWC;AAvBD;;;;GAIG;AACH,MAAa,YAAa,SAAQ,KAAK;CAAG;AAA1C,oCAA0C;AAE1C;;;;GAIG;AACI,KAAK,UAAU,WAAW,CAC/B,aAAyB,EACzB,OAAe;IAEf,MAAM,cAAc,GAAG,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;QAC/C,UAAU,CAAC,GAAG,EAAE;YACd,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC,CAAC;QAC7B,CAAC,EAAE,OAAO,CAAC,CAAC;IACd,CAAC,CAAC,CAAC;IACH,8DAA8D;IAC9D,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,cAAc,CAAC,CAAe,CAAC;AACrE,CAAC"}
1
+ {"version":3,"file":"async-util.js","sourceRoot":"","sources":["../../lib/async-util.ts"],"names":[],"mappings":";;;AAkBA,kCAQC;AAED,sBAEC;AAED,8CAMC;AAED,0DAMC;AA9CD;;;;GAIG;AACH,MAAa,YAAa,SAAQ,KAAK;CAAG;AAA1C,oCAA0C;AAE1C,MAAa,eAAgB,SAAQ,KAAK;IACxC,YAAY,UAAkB,YAAY;QACxC,KAAK,CAAC,OAAO,CAAC,CAAC;IACjB,CAAC;CACF;AAJD,0CAIC;AAED;;;;GAIG;AACI,KAAK,UAAU,WAAW,CAC/B,aAAyB,EACzB,OAAe;IAEf,OAAO,OAAO,CAAC,IAAI,CAAC;QAClB,aAAa;QACb,iBAAiB,CAAC,OAAO,CAAC;KAC3B,CAAe,CAAC;AACnB,CAAC;AAEM,KAAK,UAAU,KAAK,CAAC,MAAc;IACxC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;AAC/D,CAAC;AAEM,KAAK,UAAU,iBAAiB,CACrC,MAAc,EACd,UAAkB,SAAS;IAE3B,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC;IACpB,MAAM,IAAI,YAAY,CAAC,OAAO,CAAC,CAAC;AAClC,CAAC;AAED,SAAgB,uBAAuB,CAAI,UAAkB,YAAY;IACvE,IAAI,QAAgC,CAAC;IACrC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAI,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;QAC3C,QAAQ,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IACH,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAS,EAAE,CAAC;AAC1C,CAAC"}
@@ -3,14 +3,23 @@
3
3
  *
4
4
  * SPDX-License-Identifier: MIT
5
5
  */
6
+ import { BleDevice, TimeoutOptions } from "@capacitor-community/bluetooth-le";
6
7
  import { AccelerometerService } from "./accelerometer-service.js";
8
+ import { ButtonService } from "./button-service.js";
9
+ import { DeviceInformationService } from "./device-information-service.js";
7
10
  import { BoardVersion } from "./device.js";
8
11
  import { LedService } from "./led-service.js";
9
- import { Logging } from "./logging.js";
12
+ import { Logging, LoggingEvent } from "./logging.js";
10
13
  import { MagnetometerService } from "./magnetometer-service.js";
11
14
  import { ServiceConnectionEventMap, TypedServiceEvent, TypedServiceEventDispatcher } from "./service-events.js";
12
15
  import { UARTService } from "./uart-service.js";
16
+ export declare const bondingTimeoutInMs = 40000;
17
+ export declare const connectTimeoutInMs = 10000;
18
+ export declare const scanningTimeoutInMs = 10000;
19
+ export declare const isAndroid: () => boolean;
13
20
  export interface Service {
21
+ readonly uuid: string;
22
+ getRelevantEvents(): TypedServiceEvent[];
14
23
  startNotifications(type: TypedServiceEvent): Promise<void>;
15
24
  stopNotifications(type: TypedServiceEvent): Promise<void>;
16
25
  }
@@ -20,44 +29,69 @@ interface ConnectCallbacks {
20
29
  onFail: () => void;
21
30
  onSuccess: () => void;
22
31
  }
23
- export declare class BluetoothDeviceWrapper {
24
- readonly device: BluetoothDevice;
32
+ export declare class BluetoothDeviceWrapper implements Logging {
33
+ readonly device: BleDevice;
25
34
  private logging;
26
- private dispatchTypedEvent;
27
35
  private currentEvents;
28
36
  private callbacks;
29
37
  private duringExplicitConnectDisconnect;
30
- private gattConnectPromise;
31
- private disconnectPromise;
32
- private connecting;
38
+ private connected;
33
39
  private isReconnect;
34
- private connectReadyPromise;
35
- private accelerometer;
36
- private buttons;
37
- private led;
38
- private magnetometer;
39
- private uart;
40
- private serviceInfo;
40
+ private serviceIds;
41
+ accelerometer: AccelerometerService;
42
+ buttons: ButtonService;
43
+ deviceInformation: DeviceInformationService;
44
+ led: LedService;
45
+ magnetometer: MagnetometerService;
46
+ uart: UARTService;
47
+ /**
48
+ * Only defined after connection.
49
+ */
41
50
  boardVersion: BoardVersion | undefined;
42
- private disconnectedRejectionErrorFactory;
43
- private gattOperations;
44
- constructor(device: BluetoothDevice, logging: Logging, dispatchTypedEvent: TypedServiceEventDispatcher, currentEvents: () => Array<keyof ServiceConnectionEventMap>, callbacks: ConnectCallbacks);
51
+ private services;
52
+ private waitingForDisconnectEventCallbacks;
53
+ private internalNotificationListeners;
54
+ constructor(device: BleDevice, logging: Logging, dispatchTypedEvent: TypedServiceEventDispatcher, currentEvents: () => Array<keyof ServiceConnectionEventMap>, callbacks: ConnectCallbacks);
45
55
  connect(): Promise<void>;
56
+ private connectInternal;
46
57
  disconnect(): Promise<void>;
47
58
  private disconnectInternal;
48
59
  reconnect(): Promise<void>;
49
60
  handleDisconnectEvent: () => Promise<void>;
50
- private assertGattServer;
51
- private getBoardVersion;
52
- private queueGattOperation;
53
- private createIfNeeded;
54
- getAccelerometerService(): Promise<AccelerometerService | undefined>;
55
- getLedService(): Promise<LedService | undefined>;
56
- getMagnetometerService(): Promise<MagnetometerService | undefined>;
57
- getUARTService(): Promise<UARTService | undefined>;
61
+ getBoardVersion(): Promise<BoardVersion>;
58
62
  startNotifications(type: TypedServiceEvent): Promise<void>;
59
63
  stopNotifications(type: TypedServiceEvent): Promise<void>;
60
- private disposeServices;
64
+ private getServicesForEvent;
65
+ startInternalNotifications(serviceId: string, characteristicId: string, options?: TimeoutOptions): Promise<void>;
66
+ subscribe(serviceId: string, characteristicId: string, callback: (data: Uint8Array) => void): void;
67
+ unsubscribe(serviceId: string, characteristicId: string, callback: (data: Uint8Array) => void): void;
68
+ stopInternalNotifications(serviceId: string, characteristicId: string): Promise<void>;
69
+ /**
70
+ * Write to characteristic and wait for a notification response.
71
+ *
72
+ * It is the responsibility of the caller to have started notifications
73
+ * for the characteristic.
74
+ */
75
+ writeForNotification(serviceId: string, characteristicId: string, value: DataView, notificationId: number, isFinalNotification?: (p: Uint8Array) => boolean): Promise<Uint8Array>;
76
+ waitForDisconnect(timeout: number): Promise<void>;
77
+ /**
78
+ * Suitable for running a series of BLE interactions with an overall timeout
79
+ * and general disconnection
80
+ */
81
+ raceDisconnectAndTimeout<T>(promise: Promise<T>, options?: {
82
+ actionName?: string;
83
+ timeout?: number;
84
+ }): Promise<T>;
85
+ private disconnectErrorPromise;
86
+ event(event: LoggingEvent): void;
87
+ log(message: string): void;
88
+ error(message: string, e?: unknown): void;
89
+ private getNotificationKey;
90
+ /**
91
+ * Bonds with device and handles the post-bond device state only returning
92
+ * when we can reattempt a connection with the device.
93
+ */
94
+ private connectHandlingBond;
95
+ private bondConnectDeviceInternal;
61
96
  }
62
- export declare const createBluetoothDeviceWrapper: (device: BluetoothDevice, logging: Logging, dispatchTypedEvent: TypedServiceEventDispatcher, currentEvents: () => Array<keyof ServiceConnectionEventMap>, callbacks: ConnectCallbacks) => Promise<BluetoothDeviceWrapper | undefined>;
63
97
  export {};