@microbit/microbit-connection 0.9.0-apps.alpha.17 → 0.9.0-apps.alpha.19

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 (147) hide show
  1. package/build/cjs/async-util.d.ts +3 -1
  2. package/build/cjs/async-util.js +5 -1
  3. package/build/cjs/async-util.js.map +1 -1
  4. package/build/cjs/bluetooth/ble-error.d.ts +10 -0
  5. package/build/cjs/bluetooth/ble-error.js +47 -0
  6. package/build/cjs/bluetooth/ble-error.js.map +1 -0
  7. package/build/cjs/bluetooth/connection.d.ts +263 -3
  8. package/build/cjs/bluetooth/connection.js +78 -21
  9. package/build/cjs/bluetooth/connection.js.map +1 -1
  10. package/build/cjs/bluetooth/device-wrapper.d.ts +6 -0
  11. package/build/cjs/bluetooth/device-wrapper.js +30 -7
  12. package/build/cjs/bluetooth/device-wrapper.js.map +1 -1
  13. package/build/cjs/bluetooth/flashing/flashing-full.js +2 -1
  14. package/build/cjs/bluetooth/flashing/flashing-full.js.map +1 -1
  15. package/build/cjs/bluetooth/flashing/flashing-partial.js +2 -1
  16. package/build/cjs/bluetooth/flashing/flashing-partial.js.map +1 -1
  17. package/build/cjs/bluetooth/flashing/nordic-dfu.js +18 -6
  18. package/build/cjs/bluetooth/flashing/nordic-dfu.js.map +1 -1
  19. package/build/cjs/bluetooth/services/accelerometer-service.js +5 -4
  20. package/build/cjs/bluetooth/services/accelerometer-service.js.map +1 -1
  21. package/build/cjs/bluetooth/services/button-service.js +12 -3
  22. package/build/cjs/bluetooth/services/button-service.js.map +1 -1
  23. package/build/cjs/bluetooth/services/device-information-service.js +7 -12
  24. package/build/cjs/bluetooth/services/device-information-service.js.map +1 -1
  25. package/build/cjs/bluetooth/services/event-service.d.ts +48 -0
  26. package/build/cjs/bluetooth/services/event-service.js +273 -0
  27. package/build/cjs/bluetooth/services/event-service.js.map +1 -0
  28. package/build/cjs/bluetooth/services/event-service.test.d.ts +1 -0
  29. package/build/cjs/bluetooth/services/event-service.test.js +252 -0
  30. package/build/cjs/bluetooth/services/event-service.test.js.map +1 -0
  31. package/build/cjs/bluetooth/services/io-pin-service.d.ts +65 -0
  32. package/build/cjs/bluetooth/services/io-pin-service.js +173 -0
  33. package/build/cjs/bluetooth/services/io-pin-service.js.map +1 -0
  34. package/build/cjs/bluetooth/services/led-service.js +3 -0
  35. package/build/cjs/bluetooth/services/led-service.js.map +1 -1
  36. package/build/cjs/bluetooth/services/magnetometer-service.js +5 -4
  37. package/build/cjs/bluetooth/services/magnetometer-service.js.map +1 -1
  38. package/build/cjs/bluetooth/services/temperature-service.d.ts +14 -0
  39. package/build/cjs/bluetooth/services/temperature-service.js +80 -0
  40. package/build/cjs/bluetooth/services/temperature-service.js.map +1 -0
  41. package/build/cjs/bluetooth/services/uart-service.js +12 -3
  42. package/build/cjs/bluetooth/services/uart-service.js.map +1 -1
  43. package/build/cjs/device.d.ts +73 -58
  44. package/build/cjs/device.js +7 -2
  45. package/build/cjs/device.js.map +1 -1
  46. package/build/cjs/events.d.ts +1 -2
  47. package/build/cjs/events.js.map +1 -1
  48. package/build/cjs/index.d.ts +5 -5
  49. package/build/cjs/index.js +4 -3
  50. package/build/cjs/index.js.map +1 -1
  51. package/build/cjs/microbit-events.d.ts +67 -0
  52. package/build/cjs/microbit-events.js +55 -0
  53. package/build/cjs/microbit-events.js.map +1 -0
  54. package/build/cjs/radio-bridge/connection.d.ts +18 -5
  55. package/build/cjs/radio-bridge/connection.js +30 -12
  56. package/build/cjs/radio-bridge/connection.js.map +1 -1
  57. package/build/cjs/service-events.d.ts +55 -6
  58. package/build/cjs/service-events.js.map +1 -1
  59. package/build/cjs/usb/arm-debug.d.ts +1 -1
  60. package/build/cjs/usb/arm-debug.js +3 -3
  61. package/build/cjs/usb/arm-debug.js.map +1 -1
  62. package/build/cjs/usb/cmsis-dap.js +1 -1
  63. package/build/cjs/usb/cmsis-dap.js.map +1 -1
  64. package/build/cjs/usb/connection.d.ts +18 -3
  65. package/build/cjs/usb/connection.js +17 -10
  66. package/build/cjs/usb/connection.js.map +1 -1
  67. package/build/cjs/usb/index.d.ts +1 -1
  68. package/build/cjs/usb/partial-flashing.d.ts +22 -4
  69. package/build/cjs/usb/partial-flashing.js +108 -18
  70. package/build/cjs/usb/partial-flashing.js.map +1 -1
  71. package/build/cjs/usb/serial-events.d.ts +0 -5
  72. package/build/cjs/usb/transport.js +4 -4
  73. package/build/cjs/usb/transport.js.map +1 -1
  74. package/build/esm/async-util.d.ts +3 -1
  75. package/build/esm/async-util.js +5 -1
  76. package/build/esm/async-util.js.map +1 -1
  77. package/build/esm/bluetooth/ble-error.d.ts +10 -0
  78. package/build/esm/bluetooth/ble-error.js +42 -0
  79. package/build/esm/bluetooth/ble-error.js.map +1 -0
  80. package/build/esm/bluetooth/connection.d.ts +263 -3
  81. package/build/esm/bluetooth/connection.js +79 -22
  82. package/build/esm/bluetooth/connection.js.map +1 -1
  83. package/build/esm/bluetooth/device-wrapper.d.ts +6 -0
  84. package/build/esm/bluetooth/device-wrapper.js +30 -7
  85. package/build/esm/bluetooth/device-wrapper.js.map +1 -1
  86. package/build/esm/bluetooth/flashing/flashing-full.js +2 -1
  87. package/build/esm/bluetooth/flashing/flashing-full.js.map +1 -1
  88. package/build/esm/bluetooth/flashing/flashing-partial.js +2 -1
  89. package/build/esm/bluetooth/flashing/flashing-partial.js.map +1 -1
  90. package/build/esm/bluetooth/flashing/nordic-dfu.js +18 -6
  91. package/build/esm/bluetooth/flashing/nordic-dfu.js.map +1 -1
  92. package/build/esm/bluetooth/services/accelerometer-service.js +5 -4
  93. package/build/esm/bluetooth/services/accelerometer-service.js.map +1 -1
  94. package/build/esm/bluetooth/services/button-service.js +12 -3
  95. package/build/esm/bluetooth/services/button-service.js.map +1 -1
  96. package/build/esm/bluetooth/services/device-information-service.js +7 -12
  97. package/build/esm/bluetooth/services/device-information-service.js.map +1 -1
  98. package/build/esm/bluetooth/services/event-service.d.ts +48 -0
  99. package/build/esm/bluetooth/services/event-service.js +269 -0
  100. package/build/esm/bluetooth/services/event-service.js.map +1 -0
  101. package/build/esm/bluetooth/services/event-service.test.d.ts +1 -0
  102. package/build/esm/bluetooth/services/event-service.test.js +250 -0
  103. package/build/esm/bluetooth/services/event-service.test.js.map +1 -0
  104. package/build/esm/bluetooth/services/io-pin-service.d.ts +65 -0
  105. package/build/esm/bluetooth/services/io-pin-service.js +169 -0
  106. package/build/esm/bluetooth/services/io-pin-service.js.map +1 -0
  107. package/build/esm/bluetooth/services/led-service.js +3 -0
  108. package/build/esm/bluetooth/services/led-service.js.map +1 -1
  109. package/build/esm/bluetooth/services/magnetometer-service.js +5 -4
  110. package/build/esm/bluetooth/services/magnetometer-service.js.map +1 -1
  111. package/build/esm/bluetooth/services/temperature-service.d.ts +14 -0
  112. package/build/esm/bluetooth/services/temperature-service.js +76 -0
  113. package/build/esm/bluetooth/services/temperature-service.js.map +1 -0
  114. package/build/esm/bluetooth/services/uart-service.js +12 -3
  115. package/build/esm/bluetooth/services/uart-service.js.map +1 -1
  116. package/build/esm/device.d.ts +73 -58
  117. package/build/esm/device.js +7 -2
  118. package/build/esm/device.js.map +1 -1
  119. package/build/esm/events.d.ts +1 -2
  120. package/build/esm/events.js.map +1 -1
  121. package/build/esm/index.d.ts +5 -5
  122. package/build/esm/index.js +2 -2
  123. package/build/esm/index.js.map +1 -1
  124. package/build/esm/microbit-events.d.ts +67 -0
  125. package/build/esm/microbit-events.js +52 -0
  126. package/build/esm/microbit-events.js.map +1 -0
  127. package/build/esm/radio-bridge/connection.d.ts +18 -5
  128. package/build/esm/radio-bridge/connection.js +31 -13
  129. package/build/esm/radio-bridge/connection.js.map +1 -1
  130. package/build/esm/service-events.d.ts +55 -6
  131. package/build/esm/service-events.js.map +1 -1
  132. package/build/esm/usb/arm-debug.d.ts +1 -1
  133. package/build/esm/usb/arm-debug.js +3 -3
  134. package/build/esm/usb/arm-debug.js.map +1 -1
  135. package/build/esm/usb/cmsis-dap.js +1 -1
  136. package/build/esm/usb/cmsis-dap.js.map +1 -1
  137. package/build/esm/usb/connection.d.ts +18 -3
  138. package/build/esm/usb/connection.js +18 -11
  139. package/build/esm/usb/connection.js.map +1 -1
  140. package/build/esm/usb/index.d.ts +1 -1
  141. package/build/esm/usb/partial-flashing.d.ts +22 -4
  142. package/build/esm/usb/partial-flashing.js +108 -18
  143. package/build/esm/usb/partial-flashing.js.map +1 -1
  144. package/build/esm/usb/serial-events.d.ts +0 -5
  145. package/build/esm/usb/transport.js +4 -4
  146. package/build/esm/usb/transport.js.map +1 -1
  147. package/package.json +1 -1
@@ -0,0 +1,273 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EventService = void 0;
4
+ const bluetooth_le_1 = require("@capacitor-community/bluetooth-le");
5
+ const profile_js_1 = require("../profile.js");
6
+ const ble_error_js_1 = require("../ble-error.js");
7
+ const microbit_events_js_1 = require("../../microbit-events.js");
8
+ const NAMED_EVENTS = [
9
+ "gesturechanged",
10
+ "buttonaaction",
11
+ "buttonbaction",
12
+ "buttonabaction",
13
+ "logoaction",
14
+ ];
15
+ function isNamedEvent(type) {
16
+ return NAMED_EVENTS.includes(type);
17
+ }
18
+ class EventService {
19
+ constructor(deviceId, dispatchTypedEvent, getBoardVersion) {
20
+ Object.defineProperty(this, "deviceId", {
21
+ enumerable: true,
22
+ configurable: true,
23
+ writable: true,
24
+ value: deviceId
25
+ });
26
+ Object.defineProperty(this, "dispatchTypedEvent", {
27
+ enumerable: true,
28
+ configurable: true,
29
+ writable: true,
30
+ value: dispatchTypedEvent
31
+ });
32
+ Object.defineProperty(this, "getBoardVersion", {
33
+ enumerable: true,
34
+ configurable: true,
35
+ writable: true,
36
+ value: getBoardVersion
37
+ });
38
+ Object.defineProperty(this, "uuid", {
39
+ enumerable: true,
40
+ configurable: true,
41
+ writable: true,
42
+ value: profile_js_1.profile.event.id
43
+ });
44
+ Object.defineProperty(this, "activeEventTypes", {
45
+ enumerable: true,
46
+ configurable: true,
47
+ writable: true,
48
+ value: new Set()
49
+ });
50
+ /**
51
+ * Filters registered via named events (gestures, buttons), keyed as "source:value".
52
+ * Persists across reconnects so we can replay them.
53
+ */
54
+ Object.defineProperty(this, "namedRequirements", {
55
+ enumerable: true,
56
+ configurable: true,
57
+ writable: true,
58
+ value: new Set()
59
+ });
60
+ /**
61
+ * Filters registered via explicit {@link subscribeToEvent} calls, keyed as "source:value".
62
+ * Only events matching these are dispatched as `microbitevent`.
63
+ * Persists across reconnects so we can replay them.
64
+ */
65
+ Object.defineProperty(this, "explicitSubscriptions", {
66
+ enumerable: true,
67
+ configurable: true,
68
+ writable: true,
69
+ value: new Set()
70
+ });
71
+ /**
72
+ * Tracks which named event types contributed which filter keys,
73
+ * so we can clean up when a named event is stopped.
74
+ */
75
+ Object.defineProperty(this, "namedEventFilters", {
76
+ enumerable: true,
77
+ configurable: true,
78
+ writable: true,
79
+ value: new Map()
80
+ });
81
+ }
82
+ getRelevantEvents() {
83
+ return [
84
+ "gesturechanged",
85
+ "buttonaaction",
86
+ "buttonbaction",
87
+ "buttonabaction",
88
+ "logoaction",
89
+ "microbitevent",
90
+ ];
91
+ }
92
+ async startNotifications(type) {
93
+ if (!this.getRelevantEvents().includes(type)) {
94
+ return;
95
+ }
96
+ this.activeEventTypes.add(type);
97
+ try {
98
+ // Always (re-)register the BLE notification. After a reconnect the
99
+ // previous subscription is gone even though the service instance is
100
+ // reused, so we cannot skip this.
101
+ await bluetooth_le_1.BleClient.startNotifications(this.deviceId, profile_js_1.profile.event.id, profile_js_1.profile.event.characteristics.microBitEvent.id, (value) => this.handleNotification(value));
102
+ if (isNamedEvent(type)) {
103
+ this.writeRequirementsForNamedEvent(type);
104
+ }
105
+ // Replay all filters (handles reconnect case where the micro:bit
106
+ // has lost its listener registrations).
107
+ await this.replayAllRequirements();
108
+ }
109
+ catch (e) {
110
+ this.dispatchTypedEvent("backgrounderror", {
111
+ error: (0, ble_error_js_1.mapBleError)(e),
112
+ event: type,
113
+ });
114
+ }
115
+ }
116
+ async stopNotifications(type) {
117
+ if (!this.getRelevantEvents().includes(type)) {
118
+ return;
119
+ }
120
+ this.activeEventTypes.delete(type);
121
+ // Remove filters contributed by this named event type
122
+ if (isNamedEvent(type)) {
123
+ const keys = this.namedEventFilters.get(type) ?? [];
124
+ for (const key of keys) {
125
+ this.namedRequirements.delete(key);
126
+ }
127
+ this.namedEventFilters.delete(type);
128
+ }
129
+ if (this.activeEventTypes.size === 0) {
130
+ try {
131
+ await bluetooth_le_1.BleClient.stopNotifications(this.deviceId, profile_js_1.profile.event.id, profile_js_1.profile.event.characteristics.microBitEvent.id);
132
+ }
133
+ catch (e) {
134
+ this.dispatchTypedEvent("backgrounderror", {
135
+ error: (0, ble_error_js_1.mapBleError)(e),
136
+ event: type,
137
+ });
138
+ }
139
+ }
140
+ }
141
+ /**
142
+ * Register interest in a specific micro:bit message bus event.
143
+ * Tells the micro:bit to forward matching message bus traffic over BLE.
144
+ * Matching events are dispatched as `microbitevent`.
145
+ * Use 0 as the value to match all events from a source.
146
+ */
147
+ async subscribeToEvent(source, value) {
148
+ const key = filterKey(source, value);
149
+ if (!this.explicitSubscriptions.has(key)) {
150
+ this.explicitSubscriptions.add(key);
151
+ await this.writeClientRequirement(source, value);
152
+ }
153
+ }
154
+ /**
155
+ * Send an event to the micro:bit's message bus.
156
+ */
157
+ async sendEvent(source, value) {
158
+ const data = new DataView(new ArrayBuffer(4));
159
+ data.setUint16(0, source, true);
160
+ data.setUint16(2, value, true);
161
+ await bluetooth_le_1.BleClient.writeWithoutResponse(this.deviceId, profile_js_1.profile.event.id, profile_js_1.profile.event.characteristics.clientEvent.id, data);
162
+ }
163
+ handleNotification(dataView) {
164
+ for (let offset = 0; offset + 4 <= dataView.byteLength; offset += 4) {
165
+ const source = dataView.getUint16(offset, true);
166
+ const value = dataView.getUint16(offset + 2, true);
167
+ if (this.activeEventTypes.has("microbitevent") &&
168
+ this.matchesExplicitSubscription(source, value)) {
169
+ this.dispatchTypedEvent("microbitevent", { source, value });
170
+ }
171
+ this.demuxToNamedEvents(source, value);
172
+ }
173
+ }
174
+ demuxToNamedEvents(source, value) {
175
+ const src = this.getSourceIds();
176
+ if (!src)
177
+ return;
178
+ if (source === src.Gesture && this.activeEventTypes.has("gesturechanged")) {
179
+ this.dispatchTypedEvent("gesturechanged", {
180
+ gesture: value,
181
+ });
182
+ }
183
+ if (source === src.ButtonA && this.activeEventTypes.has("buttonaaction")) {
184
+ this.dispatchTypedEvent("buttonaaction", {
185
+ button: "A",
186
+ action: value,
187
+ });
188
+ }
189
+ if (source === src.ButtonB && this.activeEventTypes.has("buttonbaction")) {
190
+ this.dispatchTypedEvent("buttonbaction", {
191
+ button: "B",
192
+ action: value,
193
+ });
194
+ }
195
+ if (source === src.ButtonAB &&
196
+ this.activeEventTypes.has("buttonabaction")) {
197
+ this.dispatchTypedEvent("buttonabaction", {
198
+ button: "AB",
199
+ action: value,
200
+ });
201
+ }
202
+ if (source === microbit_events_js_1.V2Source.Logo && this.activeEventTypes.has("logoaction")) {
203
+ this.dispatchTypedEvent("logoaction", {
204
+ button: "Logo",
205
+ action: value,
206
+ });
207
+ }
208
+ }
209
+ writeRequirementsForNamedEvent(type) {
210
+ const src = this.getSourceIds();
211
+ if (!src)
212
+ return;
213
+ const filters = [];
214
+ switch (type) {
215
+ case "gesturechanged":
216
+ filters.push([src.Gesture, 0]);
217
+ break;
218
+ case "buttonaaction":
219
+ filters.push([src.ButtonA, 0]);
220
+ break;
221
+ case "buttonbaction":
222
+ filters.push([src.ButtonB, 0]);
223
+ break;
224
+ case "buttonabaction":
225
+ filters.push([src.ButtonAB, 0]);
226
+ break;
227
+ case "logoaction":
228
+ filters.push([microbit_events_js_1.V2Source.Logo, 0]);
229
+ break;
230
+ }
231
+ const keys = [];
232
+ for (const [source, value] of filters) {
233
+ const key = filterKey(source, value);
234
+ keys.push(key);
235
+ this.namedRequirements.add(key);
236
+ }
237
+ this.namedEventFilters.set(type, keys);
238
+ }
239
+ matchesExplicitSubscription(source, value) {
240
+ if (this.explicitSubscriptions.has(filterKey(source, value)))
241
+ return true;
242
+ if (this.explicitSubscriptions.has(filterKey(source, 0)))
243
+ return true;
244
+ return false;
245
+ }
246
+ async replayAllRequirements() {
247
+ for (const key of this.namedRequirements) {
248
+ const [source, value] = key.split(":").map(Number);
249
+ await this.writeClientRequirement(source, value);
250
+ }
251
+ for (const key of this.explicitSubscriptions) {
252
+ const [source, value] = key.split(":").map(Number);
253
+ await this.writeClientRequirement(source, value);
254
+ }
255
+ }
256
+ async writeClientRequirement(source, value) {
257
+ const data = new DataView(new ArrayBuffer(4));
258
+ data.setUint16(0, source, true);
259
+ data.setUint16(2, value, true);
260
+ await bluetooth_le_1.BleClient.write(this.deviceId, profile_js_1.profile.event.id, profile_js_1.profile.event.characteristics.clientRequirements.id, data);
261
+ }
262
+ getSourceIds() {
263
+ const version = this.getBoardVersion();
264
+ if (!version)
265
+ return undefined;
266
+ return version === "V1" ? microbit_events_js_1.EventSource.v1 : microbit_events_js_1.EventSource.v2;
267
+ }
268
+ }
269
+ exports.EventService = EventService;
270
+ function filterKey(source, value) {
271
+ return `${source}:${value}`;
272
+ }
273
+ //# sourceMappingURL=event-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-service.js","sourceRoot":"","sources":["../../../../src/bluetooth/services/event-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,252 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const vitest_1 = require("vitest");
4
+ const bluetooth_le_1 = require("@capacitor-community/bluetooth-le");
5
+ const event_service_js_1 = require("./event-service.js");
6
+ const microbit_events_js_1 = require("../../microbit-events.js");
7
+ vitest_1.vi.mock("@capacitor-community/bluetooth-le", () => ({
8
+ BleClient: {
9
+ startNotifications: vitest_1.vi.fn().mockResolvedValue(undefined),
10
+ stopNotifications: vitest_1.vi.fn().mockResolvedValue(undefined),
11
+ write: vitest_1.vi.fn().mockResolvedValue(undefined),
12
+ writeWithoutResponse: vitest_1.vi.fn().mockResolvedValue(undefined),
13
+ },
14
+ }));
15
+ vitest_1.vi.mock("../ble-error.js", () => ({
16
+ mapBleError: (e) => e,
17
+ }));
18
+ function makeEvent(source, value) {
19
+ const data = new DataView(new ArrayBuffer(4));
20
+ data.setUint16(0, source, true);
21
+ data.setUint16(2, value, true);
22
+ return data;
23
+ }
24
+ function makeMultiEvent(...pairs) {
25
+ const data = new DataView(new ArrayBuffer(pairs.length * 4));
26
+ pairs.forEach(([source, value], i) => {
27
+ data.setUint16(i * 4, source, true);
28
+ data.setUint16(i * 4 + 2, value, true);
29
+ });
30
+ return data;
31
+ }
32
+ /** Captures the notification callback passed to BleClient.startNotifications */
33
+ function captureNotificationCallback() {
34
+ const calls = bluetooth_le_1.BleClient.startNotifications.mock.calls;
35
+ const lastCall = calls[calls.length - 1];
36
+ return lastCall[3];
37
+ }
38
+ (0, vitest_1.describe)("EventService", () => {
39
+ let service;
40
+ let dispatch;
41
+ (0, vitest_1.beforeEach)(() => {
42
+ vitest_1.vi.clearAllMocks();
43
+ dispatch = vitest_1.vi.fn();
44
+ service = new event_service_js_1.EventService("test-device", dispatch, () => "V2");
45
+ });
46
+ (0, vitest_1.describe)("named events", () => {
47
+ (0, vitest_1.it)("dispatches gesturechanged when listening", async () => {
48
+ await service.startNotifications("gesturechanged");
49
+ const notify = captureNotificationCallback();
50
+ notify(makeEvent(microbit_events_js_1.V2Source.Gesture, microbit_events_js_1.GestureEvent.Shake));
51
+ (0, vitest_1.expect)(dispatch).toHaveBeenCalledWith("gesturechanged", {
52
+ gesture: microbit_events_js_1.GestureEvent.Shake,
53
+ });
54
+ });
55
+ (0, vitest_1.it)("dispatches button actions for A, B, AB", async () => {
56
+ await service.startNotifications("buttonaaction");
57
+ await service.startNotifications("buttonbaction");
58
+ await service.startNotifications("buttonabaction");
59
+ const notify = captureNotificationCallback();
60
+ notify(makeEvent(microbit_events_js_1.V2Source.ButtonA, microbit_events_js_1.ButtonAction.Click));
61
+ notify(makeEvent(microbit_events_js_1.V2Source.ButtonB, microbit_events_js_1.ButtonAction.LongClick));
62
+ notify(makeEvent(microbit_events_js_1.V2Source.ButtonAB, microbit_events_js_1.ButtonAction.DoubleClick));
63
+ (0, vitest_1.expect)(dispatch).toHaveBeenCalledWith("buttonaaction", {
64
+ button: "A",
65
+ action: microbit_events_js_1.ButtonAction.Click,
66
+ });
67
+ (0, vitest_1.expect)(dispatch).toHaveBeenCalledWith("buttonbaction", {
68
+ button: "B",
69
+ action: microbit_events_js_1.ButtonAction.LongClick,
70
+ });
71
+ (0, vitest_1.expect)(dispatch).toHaveBeenCalledWith("buttonabaction", {
72
+ button: "AB",
73
+ action: microbit_events_js_1.ButtonAction.DoubleClick,
74
+ });
75
+ });
76
+ (0, vitest_1.it)("dispatches logoaction (V2 only)", async () => {
77
+ await service.startNotifications("logoaction");
78
+ const notify = captureNotificationCallback();
79
+ notify(makeEvent(microbit_events_js_1.V2Source.Logo, microbit_events_js_1.ButtonAction.Click));
80
+ (0, vitest_1.expect)(dispatch).toHaveBeenCalledWith("logoaction", {
81
+ button: "Logo",
82
+ action: microbit_events_js_1.ButtonAction.Click,
83
+ });
84
+ });
85
+ (0, vitest_1.it)("does not dispatch after stopping a named event", async () => {
86
+ await service.startNotifications("gesturechanged");
87
+ const notify = captureNotificationCallback();
88
+ await service.stopNotifications("gesturechanged");
89
+ notify(makeEvent(microbit_events_js_1.V2Source.Gesture, microbit_events_js_1.GestureEvent.Shake));
90
+ (0, vitest_1.expect)(dispatch).not.toHaveBeenCalledWith("gesturechanged", vitest_1.expect.anything());
91
+ });
92
+ (0, vitest_1.it)("handles multiple events packed in one notification", async () => {
93
+ await service.startNotifications("gesturechanged");
94
+ await service.startNotifications("buttonaaction");
95
+ const notify = captureNotificationCallback();
96
+ notify(makeMultiEvent([microbit_events_js_1.V2Source.Gesture, microbit_events_js_1.GestureEvent.FaceUp], [microbit_events_js_1.V2Source.ButtonA, microbit_events_js_1.ButtonAction.Click]));
97
+ (0, vitest_1.expect)(dispatch).toHaveBeenCalledWith("gesturechanged", {
98
+ gesture: microbit_events_js_1.GestureEvent.FaceUp,
99
+ });
100
+ (0, vitest_1.expect)(dispatch).toHaveBeenCalledWith("buttonaaction", {
101
+ button: "A",
102
+ action: microbit_events_js_1.ButtonAction.Click,
103
+ });
104
+ });
105
+ });
106
+ (0, vitest_1.describe)("microbitevent isolation", () => {
107
+ (0, vitest_1.it)("does not dispatch microbitevent for named event traffic", async () => {
108
+ await service.startNotifications("gesturechanged");
109
+ await service.startNotifications("microbitevent");
110
+ const notify = captureNotificationCallback();
111
+ notify(makeEvent(microbit_events_js_1.V2Source.Gesture, microbit_events_js_1.GestureEvent.Shake));
112
+ (0, vitest_1.expect)(dispatch).toHaveBeenCalledWith("gesturechanged", {
113
+ gesture: microbit_events_js_1.GestureEvent.Shake,
114
+ });
115
+ (0, vitest_1.expect)(dispatch).not.toHaveBeenCalledWith("microbitevent", vitest_1.expect.anything());
116
+ });
117
+ (0, vitest_1.it)("dispatches microbitevent only for explicit subscriptions", async () => {
118
+ await service.startNotifications("microbitevent");
119
+ await service.subscribeToEvent(999, 0);
120
+ const notify = captureNotificationCallback();
121
+ notify(makeEvent(999, 42));
122
+ (0, vitest_1.expect)(dispatch).toHaveBeenCalledWith("microbitevent", {
123
+ source: 999,
124
+ value: 42,
125
+ });
126
+ });
127
+ (0, vitest_1.it)("wildcard subscription (value=0) matches all values from that source", async () => {
128
+ await service.startNotifications("microbitevent");
129
+ await service.subscribeToEvent(999, 0);
130
+ const notify = captureNotificationCallback();
131
+ notify(makeEvent(999, 1));
132
+ notify(makeEvent(999, 2));
133
+ notify(makeEvent(888, 1));
134
+ (0, vitest_1.expect)(dispatch).toHaveBeenCalledWith("microbitevent", {
135
+ source: 999,
136
+ value: 1,
137
+ });
138
+ (0, vitest_1.expect)(dispatch).toHaveBeenCalledWith("microbitevent", {
139
+ source: 999,
140
+ value: 2,
141
+ });
142
+ (0, vitest_1.expect)(dispatch).not.toHaveBeenCalledWith("microbitevent", vitest_1.expect.objectContaining({ source: 888 }));
143
+ });
144
+ (0, vitest_1.it)("exact subscription only matches that specific value", async () => {
145
+ await service.startNotifications("microbitevent");
146
+ await service.subscribeToEvent(999, 5);
147
+ const notify = captureNotificationCallback();
148
+ notify(makeEvent(999, 5));
149
+ notify(makeEvent(999, 6));
150
+ (0, vitest_1.expect)(dispatch).toHaveBeenCalledWith("microbitevent", {
151
+ source: 999,
152
+ value: 5,
153
+ });
154
+ (0, vitest_1.expect)(dispatch).not.toHaveBeenCalledWith("microbitevent", vitest_1.expect.objectContaining({ value: 6 }));
155
+ });
156
+ (0, vitest_1.it)("named events and explicit subscriptions work independently", async () => {
157
+ await service.startNotifications("gesturechanged");
158
+ await service.startNotifications("microbitevent");
159
+ await service.subscribeToEvent(999, 0);
160
+ const notify = captureNotificationCallback();
161
+ // Gesture events go to gesturechanged only
162
+ notify(makeEvent(microbit_events_js_1.V2Source.Gesture, microbit_events_js_1.GestureEvent.Shake));
163
+ // Custom events go to microbitevent only
164
+ notify(makeEvent(999, 42));
165
+ (0, vitest_1.expect)(dispatch).toHaveBeenCalledWith("gesturechanged", {
166
+ gesture: microbit_events_js_1.GestureEvent.Shake,
167
+ });
168
+ (0, vitest_1.expect)(dispatch).toHaveBeenCalledWith("microbitevent", {
169
+ source: 999,
170
+ value: 42,
171
+ });
172
+ // Gesture should NOT leak into microbitevent
173
+ (0, vitest_1.expect)(dispatch).not.toHaveBeenCalledWith("microbitevent", vitest_1.expect.objectContaining({ source: microbit_events_js_1.V2Source.Gesture }));
174
+ });
175
+ (0, vitest_1.it)("overlapping named + explicit subscription dispatches both", async () => {
176
+ await service.startNotifications("gesturechanged");
177
+ await service.startNotifications("microbitevent");
178
+ // Explicitly subscribe to the same source as the named event
179
+ await service.subscribeToEvent(microbit_events_js_1.V2Source.Gesture, 0);
180
+ const notify = captureNotificationCallback();
181
+ notify(makeEvent(microbit_events_js_1.V2Source.Gesture, microbit_events_js_1.GestureEvent.Shake));
182
+ // Both fire — you asked for both
183
+ (0, vitest_1.expect)(dispatch).toHaveBeenCalledWith("gesturechanged", {
184
+ gesture: microbit_events_js_1.GestureEvent.Shake,
185
+ });
186
+ (0, vitest_1.expect)(dispatch).toHaveBeenCalledWith("microbitevent", {
187
+ source: microbit_events_js_1.V2Source.Gesture,
188
+ value: microbit_events_js_1.GestureEvent.Shake,
189
+ });
190
+ });
191
+ (0, vitest_1.it)("stopping named event leaves explicit subscription working", async () => {
192
+ await service.startNotifications("gesturechanged");
193
+ await service.startNotifications("microbitevent");
194
+ await service.subscribeToEvent(microbit_events_js_1.V2Source.Gesture, 0);
195
+ const notify = captureNotificationCallback();
196
+ await service.stopNotifications("gesturechanged");
197
+ dispatch.mockClear();
198
+ notify(makeEvent(microbit_events_js_1.V2Source.Gesture, microbit_events_js_1.GestureEvent.Shake));
199
+ // Named event stopped
200
+ (0, vitest_1.expect)(dispatch).not.toHaveBeenCalledWith("gesturechanged", vitest_1.expect.anything());
201
+ // Explicit subscription still works
202
+ (0, vitest_1.expect)(dispatch).toHaveBeenCalledWith("microbitevent", {
203
+ source: microbit_events_js_1.V2Source.Gesture,
204
+ value: microbit_events_js_1.GestureEvent.Shake,
205
+ });
206
+ });
207
+ });
208
+ (0, vitest_1.describe)("BLE notification lifecycle", () => {
209
+ (0, vitest_1.it)("re-registers BLE notifications on each startNotifications call to handle reconnect", async () => {
210
+ await service.startNotifications("gesturechanged");
211
+ await service.startNotifications("buttonaaction");
212
+ await service.startNotifications("microbitevent");
213
+ (0, vitest_1.expect)(bluetooth_le_1.BleClient.startNotifications).toHaveBeenCalledTimes(3);
214
+ });
215
+ (0, vitest_1.it)("stops BLE notifications only when all event types are stopped", async () => {
216
+ await service.startNotifications("gesturechanged");
217
+ await service.startNotifications("buttonaaction");
218
+ await service.stopNotifications("gesturechanged");
219
+ (0, vitest_1.expect)(bluetooth_le_1.BleClient.stopNotifications).not.toHaveBeenCalled();
220
+ await service.stopNotifications("buttonaaction");
221
+ (0, vitest_1.expect)(bluetooth_le_1.BleClient.stopNotifications).toHaveBeenCalledTimes(1);
222
+ });
223
+ (0, vitest_1.it)("ignores irrelevant event types", async () => {
224
+ await service.startNotifications("accelerometerdatachanged");
225
+ (0, vitest_1.expect)(bluetooth_le_1.BleClient.startNotifications).not.toHaveBeenCalled();
226
+ });
227
+ });
228
+ (0, vitest_1.describe)("client requirements", () => {
229
+ (0, vitest_1.it)("writes client requirements for named events", async () => {
230
+ await service.startNotifications("gesturechanged");
231
+ (0, vitest_1.expect)(bluetooth_le_1.BleClient.write).toHaveBeenCalled();
232
+ const calls = bluetooth_le_1.BleClient.write.mock.calls;
233
+ const data = calls[calls.length - 1][3];
234
+ (0, vitest_1.expect)(data.getUint16(0, true)).toBe(microbit_events_js_1.V2Source.Gesture);
235
+ (0, vitest_1.expect)(data.getUint16(2, true)).toBe(0);
236
+ });
237
+ (0, vitest_1.it)("writes client requirements for explicit subscriptions", async () => {
238
+ await service.subscribeToEvent(999, 42);
239
+ (0, vitest_1.expect)(bluetooth_le_1.BleClient.write).toHaveBeenCalled();
240
+ const calls = bluetooth_le_1.BleClient.write.mock.calls;
241
+ const data = calls[calls.length - 1][3];
242
+ (0, vitest_1.expect)(data.getUint16(0, true)).toBe(999);
243
+ (0, vitest_1.expect)(data.getUint16(2, true)).toBe(42);
244
+ });
245
+ (0, vitest_1.it)("does not duplicate explicit subscription writes", async () => {
246
+ await service.subscribeToEvent(999, 42);
247
+ await service.subscribeToEvent(999, 42);
248
+ (0, vitest_1.expect)(bluetooth_le_1.BleClient.write).toHaveBeenCalledTimes(1);
249
+ });
250
+ });
251
+ });
252
+ //# sourceMappingURL=event-service.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-service.test.js","sourceRoot":"","sources":["../../../../src/bluetooth/services/event-service.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ import { Service } from "../device-wrapper.js";
2
+ import { PinValue, TypedServiceEvent, TypedServiceEventDispatcher } from "../../service-events.js";
3
+ export declare class IoPinService implements Service {
4
+ private deviceId;
5
+ private dispatchTypedEvent;
6
+ uuid: string;
7
+ constructor(deviceId: string, dispatchTypedEvent: TypedServiceEventDispatcher);
8
+ getRelevantEvents(): TypedServiceEvent[];
9
+ /**
10
+ * Gets which pins are configured as analog.
11
+ * All other pins are digital (the default).
12
+ *
13
+ * @returns array of pin numbers (0-18) configured as analog.
14
+ */
15
+ getAnalogPins(): Promise<number[]>;
16
+ /**
17
+ * Sets which pins are configured as analog.
18
+ * All other pins become digital (the default).
19
+ *
20
+ * @param pins array of pin numbers (0-18) to configure as analog.
21
+ */
22
+ setAnalogPins(pins: number[]): Promise<void>;
23
+ /**
24
+ * Gets which pins are configured as inputs.
25
+ * Input pins are monitored by the service and their values reported
26
+ * via notifications and reads of the pin data characteristic.
27
+ * All other pins are outputs (the default).
28
+ *
29
+ * @returns array of pin numbers (0-18) configured as inputs.
30
+ */
31
+ getInputPins(): Promise<number[]>;
32
+ /**
33
+ * Sets which pins are configured as inputs.
34
+ * Input pins are monitored by the service and their values reported
35
+ * via notifications and reads of the pin data characteristic.
36
+ * All other pins become outputs (the default).
37
+ *
38
+ * @param pins array of pin numbers (0-18) to configure as inputs.
39
+ */
40
+ setInputPins(pins: number[]): Promise<void>;
41
+ /**
42
+ * Reads pin data for all active input pins.
43
+ * For digital pins, value is 0 or 1.
44
+ * For analog pins, value is 0-255 (10-bit analog value >> 2).
45
+ */
46
+ readPins(): Promise<PinValue[]>;
47
+ /**
48
+ * Writes pin data for output pins.
49
+ * Only pins configured as outputs (not active inputs) will be affected.
50
+ * For digital pins, value is 0 or 1.
51
+ * For analog pins, value 0-255 is scaled to 0-1023 on the device.
52
+ */
53
+ writePins(data: PinValue[]): Promise<void>;
54
+ /**
55
+ * Sets PWM output on a pin.
56
+ *
57
+ * @param pin Pin number (0-18).
58
+ * @param value Analog value (0-1024).
59
+ * @param period Period in microseconds.
60
+ */
61
+ setPwm(pin: number, value: number, period: number): Promise<void>;
62
+ startNotifications(type: TypedServiceEvent): Promise<void>;
63
+ stopNotifications(type: TypedServiceEvent): Promise<void>;
64
+ private dataViewToPinData;
65
+ }