@neurodevs/node-lsl 18.1.0 → 19.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/build/__tests__/AbstractPackageTest.d.ts +12 -10
  2. package/build/__tests__/AbstractPackageTest.js +33 -14
  3. package/build/__tests__/AbstractPackageTest.js.map +1 -1
  4. package/build/__tests__/impl/BleDeviceController.test.d.ts +5 -0
  5. package/build/__tests__/impl/BleDeviceController.test.js +36 -5
  6. package/build/__tests__/impl/BleDeviceController.test.js.map +1 -1
  7. package/build/__tests__/impl/LslStreamOutlet.test.js +2 -4
  8. package/build/__tests__/impl/LslStreamOutlet.test.js.map +1 -1
  9. package/build/__tests__/impl/UsbDeviceController.test.d.ts +17 -0
  10. package/build/__tests__/impl/UsbDeviceController.test.js +81 -0
  11. package/build/__tests__/impl/UsbDeviceController.test.js.map +1 -0
  12. package/build/__tests__/impl/WindowedClockRegressor.test.d.ts +19 -0
  13. package/build/__tests__/impl/WindowedClockRegressor.test.js +172 -0
  14. package/build/__tests__/impl/WindowedClockRegressor.test.js.map +1 -0
  15. package/build/impl/LslStreamInlet.d.ts +1 -0
  16. package/build/impl/LslStreamInlet.js +2 -1
  17. package/build/impl/LslStreamInlet.js.map +1 -1
  18. package/build/impl/LslStreamOutlet.d.ts +1 -0
  19. package/build/impl/LslStreamOutlet.js +2 -1
  20. package/build/impl/LslStreamOutlet.js.map +1 -1
  21. package/build/impl/WindowedClockRegressor.d.ts +24 -0
  22. package/build/impl/WindowedClockRegressor.js +73 -0
  23. package/build/impl/WindowedClockRegressor.js.map +1 -0
  24. package/build/impl/controllers/BleDeviceController.d.ts +2 -0
  25. package/build/impl/controllers/BleDeviceController.js +8 -0
  26. package/build/impl/controllers/BleDeviceController.js.map +1 -1
  27. package/build/impl/controllers/UsbDeviceController.d.ts +23 -0
  28. package/build/impl/controllers/UsbDeviceController.js +40 -0
  29. package/build/impl/controllers/UsbDeviceController.js.map +1 -0
  30. package/build/index.d.ts +8 -0
  31. package/build/index.js +10 -0
  32. package/build/index.js.map +1 -1
  33. package/build/scripts/runUsb.d.ts +1 -0
  34. package/build/scripts/runUsb.js +14 -0
  35. package/build/scripts/runUsb.js.map +1 -0
  36. package/build/testDoubles/BleController/FakeBleController.d.ts +3 -1
  37. package/build/testDoubles/BleController/FakeBleController.js +5 -0
  38. package/build/testDoubles/BleController/FakeBleController.js.map +1 -1
  39. package/build/testDoubles/ClockRegressor/FakeClockRegressor.d.ts +17 -0
  40. package/build/testDoubles/ClockRegressor/FakeClockRegressor.js +23 -0
  41. package/build/testDoubles/ClockRegressor/FakeClockRegressor.js.map +1 -0
  42. package/build/testDoubles/UsbController/FakeUsbController.d.ts +12 -0
  43. package/build/testDoubles/UsbController/FakeUsbController.js +25 -0
  44. package/build/testDoubles/UsbController/FakeUsbController.js.map +1 -0
  45. package/build/testDoubles/WebSocketBridge/FakeWebSocketBridge.js.map +1 -1
  46. package/package.json +4 -4
  47. package/src/__tests__/AbstractPackageTest.ts +59 -21
  48. package/src/__tests__/impl/BleDeviceController.test.ts +51 -8
  49. package/src/__tests__/impl/LslStreamOutlet.test.ts +5 -4
  50. package/src/__tests__/impl/UsbDeviceController.test.ts +109 -0
  51. package/src/__tests__/impl/WindowedClockRegressor.test.ts +262 -0
  52. package/src/impl/LslStreamInlet.ts +4 -1
  53. package/src/impl/LslStreamOutlet.ts +2 -1
  54. package/src/impl/WindowedClockRegressor.ts +136 -0
  55. package/src/impl/controllers/BleDeviceController.ts +17 -0
  56. package/src/impl/controllers/UsbDeviceController.ts +65 -0
  57. package/src/index.ts +16 -0
  58. package/src/scripts/runUsb.ts +20 -0
  59. package/src/testDoubles/BleController/FakeBleController.ts +11 -0
  60. package/src/testDoubles/ClockRegressor/FakeClockRegressor.ts +46 -0
  61. package/src/testDoubles/UsbController/FakeUsbController.ts +34 -0
  62. package/src/testDoubles/WebSocketBridge/FakeWebSocketBridge.ts +1 -2
@@ -0,0 +1,172 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { randomInt } from 'node:crypto';
8
+ import { test, assert } from '@neurodevs/node-tdd';
9
+ import WindowedClockRegressor from '../../impl/WindowedClockRegressor.js';
10
+ import AbstractPackageTest from '../AbstractPackageTest.js';
11
+ export default class WindowedClockRegressorTest extends AbstractPackageTest {
12
+ static instance;
13
+ static chunkSize = randomInt(10, 20);
14
+ static nominalHz = 50 + Math.random() * 50;
15
+ static deviceTime = Math.random();
16
+ static earliestLslTime = Math.random();
17
+ static async beforeEach() {
18
+ await super.beforeEach();
19
+ this.instance = this.WindowedClockRegressor();
20
+ }
21
+ static async createsInstance() {
22
+ assert.isTruthy(this.instance, 'Failed to create instance!');
23
+ }
24
+ static async deriveReturnsChunkSizeEntries() {
25
+ const timestamps = this.deriveTimestamps();
26
+ assert.isEqual(timestamps.length, this.chunkSize, 'Should return an array with chunkSize entries!');
27
+ }
28
+ static async deriveAnchorsLastTimestampOnRegressionLine() {
29
+ const nominalChunkStep = this.chunkSize / this.nominalHz;
30
+ let deviceTime = this.deviceTime;
31
+ let lslTime = this.earliestLslTime;
32
+ for (let i = 0; i < 100; i++) {
33
+ deviceTime += nominalChunkStep;
34
+ lslTime += nominalChunkStep;
35
+ this.deriveTimestamps(deviceTime, lslTime);
36
+ }
37
+ deviceTime += nominalChunkStep;
38
+ lslTime += nominalChunkStep;
39
+ const jitter = nominalChunkStep * Math.random();
40
+ const timestamps = this.deriveTimestamps(deviceTime, lslTime + jitter);
41
+ for (let i = 0; i < timestamps.length; i++) {
42
+ const stepsFromLast = timestamps.length - 1 - i;
43
+ const expected = lslTime - stepsFromLast / this.nominalHz;
44
+ assert.isBetweenInclusive(timestamps[i], expected - jitter * 0.1, expected + jitter * 0.1, `Timestamp at index ${i} should be anchored on the fitted regression line, not the jittery arrival time!`);
45
+ }
46
+ }
47
+ static async deriveSpacesEntriesByNominalHz() {
48
+ const timestamps = this.deriveTimestamps();
49
+ const expected = Array(this.chunkSize)
50
+ .fill(0)
51
+ .map((_, i) => {
52
+ return (this.earliestLslTime -
53
+ (this.chunkSize - 1 - i) / this.nominalHz);
54
+ });
55
+ assert.isEqualDeep(timestamps, expected, 'Entries should be spaced 1/nominalHz apart, working backward from earliestLslTime!');
56
+ }
57
+ static async deriveUsesFittedSlopeOnceHistoryAccumulates() {
58
+ const trueSlope = 2;
59
+ const nominalStep = this.chunkSize / this.nominalHz;
60
+ const lslStep = nominalStep * trueSlope;
61
+ let deviceTime = this.deviceTime;
62
+ let earliestLslTime = this.earliestLslTime;
63
+ for (let i = 0; i < 50; i++) {
64
+ deviceTime += nominalStep;
65
+ earliestLslTime += lslStep;
66
+ this.deriveTimestamps(deviceTime, earliestLslTime);
67
+ }
68
+ deviceTime += nominalStep;
69
+ earliestLslTime += lslStep;
70
+ const timestamps = this.deriveTimestamps(deviceTime, earliestLslTime);
71
+ const expectedSpacing = trueSlope / this.nominalHz;
72
+ for (let i = 1; i < timestamps.length; i++) {
73
+ const actualSpacing = timestamps[i] - timestamps[i - 1];
74
+ assert.isBetweenInclusive(actualSpacing, expectedSpacing * 0.99, expectedSpacing * 1.01, `Spacing at index ${i} should reflect the fitted slope once history has accumulated!`);
75
+ }
76
+ }
77
+ static async deriveThrowsWhenDeviceTimeDoesNotIncreaseMonotonically() {
78
+ this.deriveTimestamps();
79
+ assert.doesThrow(() => this.deriveTimestamps(this.deviceTime, this.earliestLslTime + Math.random()), `\nDevice time (${this.deviceTime}) did not increase from the previous device time (${this.deviceTime})! Device time is expected to always increase between calls, so this likely indicates a bug in the calling code.\n`);
80
+ }
81
+ static async deriveForgetsHistoryOutsideWindowLenSec() {
82
+ const nominalChunkStep = this.chunkSize / this.nominalHz;
83
+ // With chunkSize in [10, 20) and nominalHz in [50, 100), nominalChunkStep
84
+ // stays within [0.1, 0.4). A fixed 700 iterations always spans at least
85
+ // 70 device-seconds — comfortably more than 2x the 30s windowLenSec.
86
+ const oldPhaseCount = 700;
87
+ const newPhaseCount = 700;
88
+ let deviceTime = this.deviceTime;
89
+ let earliestLslTime = this.earliestLslTime;
90
+ const oldSlope = 2;
91
+ for (let i = 0; i < oldPhaseCount; i++) {
92
+ deviceTime += nominalChunkStep;
93
+ earliestLslTime += nominalChunkStep * oldSlope;
94
+ this.deriveTimestamps(deviceTime, earliestLslTime);
95
+ }
96
+ const newSlope = 5;
97
+ let timestamps = [];
98
+ for (let i = 0; i < newPhaseCount; i++) {
99
+ deviceTime += nominalChunkStep;
100
+ earliestLslTime += nominalChunkStep * newSlope;
101
+ timestamps = this.deriveTimestamps(deviceTime, earliestLslTime);
102
+ }
103
+ const expectedSpacing = newSlope / this.nominalHz;
104
+ for (let i = 1; i < timestamps.length; i++) {
105
+ const actualSpacing = timestamps[i] - timestamps[i - 1];
106
+ assert.isBetweenInclusive(actualSpacing, expectedSpacing * 0.99, expectedSpacing * 1.01, `Spacing at index ${i} should reflect the new slope once old history falls outside windowLenSec!`);
107
+ }
108
+ }
109
+ static async deriveAllowsOverridingWindowLenSec() {
110
+ const nominalChunkStep = this.chunkSize / this.nominalHz;
111
+ const customWindowLenSec = 5;
112
+ // With nominalChunkStep in [0.1, 0.4), 150 iterations always spans at
113
+ // least 15 device-seconds — more than 2x the 5s customWindowLenSec,
114
+ // but well short of 2x the 30s default, so this only passes if the
115
+ // override actually takes effect.
116
+ const phaseCount = 150;
117
+ const instance = WindowedClockRegressor.Create(this.nominalHz, {
118
+ windowLenSec: customWindowLenSec,
119
+ });
120
+ let deviceTime = this.deviceTime;
121
+ let earliestLslTime = this.earliestLslTime;
122
+ const oldSlope = 2;
123
+ for (let i = 0; i < phaseCount; i++) {
124
+ deviceTime += nominalChunkStep;
125
+ earliestLslTime += nominalChunkStep * oldSlope;
126
+ instance.deriveTimestamps(deviceTime, earliestLslTime, this.chunkSize);
127
+ }
128
+ const newSlope = 5;
129
+ let timestamps = [];
130
+ for (let i = 0; i < phaseCount; i++) {
131
+ deviceTime += nominalChunkStep;
132
+ earliestLslTime += nominalChunkStep * newSlope;
133
+ timestamps = instance.deriveTimestamps(deviceTime, earliestLslTime, this.chunkSize);
134
+ }
135
+ const expectedSpacing = newSlope / this.nominalHz;
136
+ for (let i = 1; i < timestamps.length; i++) {
137
+ const actualSpacing = timestamps[i] - timestamps[i - 1];
138
+ assert.isBetweenInclusive(actualSpacing, expectedSpacing * 0.99, expectedSpacing * 1.01, `Spacing at index ${i} should reflect the new slope once old history falls outside the custom windowLenSec!`);
139
+ }
140
+ }
141
+ static deriveTimestamps(deviceTime = this.deviceTime, earliestLslTime = this.earliestLslTime) {
142
+ return this.instance.deriveTimestamps(deviceTime, earliestLslTime, this.chunkSize);
143
+ }
144
+ static WindowedClockRegressor() {
145
+ return WindowedClockRegressor.Create(this.nominalHz);
146
+ }
147
+ }
148
+ __decorate([
149
+ test()
150
+ ], WindowedClockRegressorTest, "createsInstance", null);
151
+ __decorate([
152
+ test()
153
+ ], WindowedClockRegressorTest, "deriveReturnsChunkSizeEntries", null);
154
+ __decorate([
155
+ test()
156
+ ], WindowedClockRegressorTest, "deriveAnchorsLastTimestampOnRegressionLine", null);
157
+ __decorate([
158
+ test()
159
+ ], WindowedClockRegressorTest, "deriveSpacesEntriesByNominalHz", null);
160
+ __decorate([
161
+ test()
162
+ ], WindowedClockRegressorTest, "deriveUsesFittedSlopeOnceHistoryAccumulates", null);
163
+ __decorate([
164
+ test()
165
+ ], WindowedClockRegressorTest, "deriveThrowsWhenDeviceTimeDoesNotIncreaseMonotonically", null);
166
+ __decorate([
167
+ test()
168
+ ], WindowedClockRegressorTest, "deriveForgetsHistoryOutsideWindowLenSec", null);
169
+ __decorate([
170
+ test()
171
+ ], WindowedClockRegressorTest, "deriveAllowsOverridingWindowLenSec", null);
172
+ //# sourceMappingURL=WindowedClockRegressor.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WindowedClockRegressor.test.js","sourceRoot":"","sources":["../../../src/__tests__/impl/WindowedClockRegressor.test.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,7 @@ export default class LslStreamInlet implements StreamInlet {
3
3
  static Class?: StreamInletConstructor;
4
4
  static Worker: typeof Worker;
5
5
  static waitAfterOpenStreamMs: number;
6
+ static setTimeout: typeof setTimeout;
6
7
  private sourceId;
7
8
  private chunkSize;
8
9
  private maxBufferedMs;
@@ -3,6 +3,7 @@ export default class LslStreamInlet {
3
3
  static Class;
4
4
  static Worker = Worker;
5
5
  static waitAfterOpenStreamMs = 100;
6
+ static setTimeout = setTimeout;
6
7
  sourceId;
7
8
  chunkSize;
8
9
  maxBufferedMs;
@@ -62,7 +63,7 @@ export default class LslStreamInlet {
62
63
  this.isRunning = true;
63
64
  this.postCreate();
64
65
  while (!this.workerReady) {
65
- await new Promise((resolve) => setTimeout(resolve, 10));
66
+ await new Promise((resolve) => LslStreamInlet.setTimeout(resolve, 10));
66
67
  }
67
68
  this.postStartPulling();
68
69
  }
@@ -1 +1 @@
1
- {"version":3,"file":"LslStreamInlet.js","sourceRoot":"","sources":["../../src/impl/LslStreamInlet.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"LslStreamInlet.js","sourceRoot":"","sources":["../../src/impl/LslStreamInlet.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,7 @@ import { ChannelFormat, LslSample } from '@neurodevs/ndx-native';
3
3
  export default class LslStreamOutlet implements StreamOutlet {
4
4
  static Class?: StreamOutletConstructor;
5
5
  static Worker: typeof Worker;
6
+ static setTimeout: typeof setTimeout;
6
7
  readonly name: string;
7
8
  readonly type: string;
8
9
  readonly sourceId: string;
@@ -3,6 +3,7 @@ import { assertValidChannelCount, assertValidChannelFormat, assertValidChunkSize
3
3
  export default class LslStreamOutlet {
4
4
  static Class;
5
5
  static Worker = Worker;
6
+ static setTimeout = setTimeout;
6
7
  name;
7
8
  type;
8
9
  sourceId;
@@ -104,7 +105,7 @@ export default class LslStreamOutlet {
104
105
  return LslStreamOutlet.Worker;
105
106
  }
106
107
  static async waitForSetup(waitAfterConstructionMs) {
107
- await new Promise((resolve) => setTimeout(resolve, waitAfterConstructionMs));
108
+ await new Promise((resolve) => LslStreamOutlet.setTimeout(resolve, waitAfterConstructionMs));
108
109
  }
109
110
  }
110
111
  //# sourceMappingURL=LslStreamOutlet.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"LslStreamOutlet.js","sourceRoot":"","sources":["../../src/impl/LslStreamOutlet.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"LslStreamOutlet.js","sourceRoot":"","sources":["../../src/impl/LslStreamOutlet.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ export default class WindowedClockRegressor implements ClockRegressor {
2
+ static Class?: ClockRegressorConstructor;
3
+ private readonly nominalHz;
4
+ private readonly windowLenSec;
5
+ private readonly defaultWindowLenSec;
6
+ private readonly history;
7
+ private slope;
8
+ protected constructor(nominalHz: number, options?: WindowedClockRegressorOptions);
9
+ static Create(nominalHz: number, options?: WindowedClockRegressorOptions): WindowedClockRegressor | ClockRegressor;
10
+ deriveTimestamps(deviceTime: number, earliestLslTime: number, chunkSize: number): any[];
11
+ private anchorTimeFor;
12
+ private throwIfDeviceTimeDoesNotIncrease;
13
+ private pruneHistoryOutsideWindow;
14
+ private refitSlope;
15
+ private get currentMeanDeviceTime();
16
+ private get currentMeanLslTime();
17
+ }
18
+ export interface ClockRegressor {
19
+ deriveTimestamps(deviceTime: number, earliestLslTime: number, chunkSize: number): number[];
20
+ }
21
+ export type ClockRegressorConstructor = new (nominalHz: number, options?: WindowedClockRegressorOptions) => ClockRegressor;
22
+ export interface WindowedClockRegressorOptions {
23
+ windowLenSec?: number;
24
+ }
@@ -0,0 +1,73 @@
1
+ export default class WindowedClockRegressor {
2
+ static Class;
3
+ nominalHz;
4
+ windowLenSec;
5
+ defaultWindowLenSec = 30;
6
+ history = [];
7
+ slope = 1; // lsl-host-seconds per device-second
8
+ constructor(nominalHz, options) {
9
+ const { windowLenSec = this.defaultWindowLenSec } = options ?? {};
10
+ this.nominalHz = nominalHz;
11
+ this.windowLenSec = windowLenSec;
12
+ }
13
+ static Create(nominalHz, options) {
14
+ return new (this.Class ?? this)(nominalHz, options);
15
+ }
16
+ deriveTimestamps(deviceTime, earliestLslTime, chunkSize) {
17
+ this.throwIfDeviceTimeDoesNotIncrease(deviceTime);
18
+ this.history.push({ deviceTime, earliestLslTime });
19
+ this.pruneHistoryOutsideWindow();
20
+ this.refitSlope();
21
+ const anchor = this.anchorTimeFor(deviceTime);
22
+ const timestamps = Array(chunkSize).fill(0);
23
+ for (let i = 0; i <= chunkSize - 1; i++) {
24
+ const stepsFromLast = chunkSize - 1 - i;
25
+ const deviceTimeOffset = -stepsFromLast / this.nominalHz;
26
+ const lslTimeOffset = deviceTimeOffset * this.slope;
27
+ timestamps[i] = anchor + lslTimeOffset;
28
+ }
29
+ return timestamps;
30
+ }
31
+ anchorTimeFor(deviceTime) {
32
+ const xMean = this.currentMeanDeviceTime;
33
+ const yMean = this.currentMeanLslTime;
34
+ return yMean + this.slope * (deviceTime - xMean);
35
+ }
36
+ throwIfDeviceTimeDoesNotIncrease(deviceTime) {
37
+ const last = this.history[this.history.length - 1];
38
+ if (last && deviceTime <= last.deviceTime) {
39
+ throw new Error(`\nDevice time (${deviceTime}) did not increase from the previous device time (${last.deviceTime})! Device time is expected to always increase between calls, so this likely indicates a bug in the calling code.\n`);
40
+ }
41
+ }
42
+ pruneHistoryOutsideWindow() {
43
+ const { deviceTime: latest } = this.history[this.history.length - 1];
44
+ const cutoff = latest - this.windowLenSec;
45
+ while (this.history.length > 0 && this.history[0].deviceTime < cutoff) {
46
+ this.history.shift();
47
+ }
48
+ }
49
+ refitSlope() {
50
+ if (this.history.length < 2) {
51
+ return;
52
+ }
53
+ const xMean = this.currentMeanDeviceTime;
54
+ const yMean = this.currentMeanLslTime;
55
+ let numerator = 0;
56
+ let denominator = 0;
57
+ for (const { deviceTime, earliestLslTime } of this.history) {
58
+ const xCentered = deviceTime - xMean;
59
+ numerator += xCentered * (earliestLslTime - yMean);
60
+ denominator += xCentered * xCentered;
61
+ }
62
+ this.slope = numerator / denominator;
63
+ }
64
+ get currentMeanDeviceTime() {
65
+ const totalDeviceTime = this.history.reduce((sum, { deviceTime }) => sum + deviceTime, 0);
66
+ return totalDeviceTime / this.history.length;
67
+ }
68
+ get currentMeanLslTime() {
69
+ const totalLslTime = this.history.reduce((sum, { earliestLslTime }) => sum + earliestLslTime, 0);
70
+ return totalLslTime / this.history.length;
71
+ }
72
+ }
73
+ //# sourceMappingURL=WindowedClockRegressor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WindowedClockRegressor.js","sourceRoot":"","sources":["../../src/impl/WindowedClockRegressor.ts"],"names":[],"mappings":"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"}
@@ -26,6 +26,7 @@ export default class BleDeviceController implements BleController {
26
26
  private waitForOnConnected;
27
27
  private waitToDiscoverServices;
28
28
  writeCharacteristic(charUuid: CharacteristicUuid, value: string): Promise<void>;
29
+ subscribeCharacteristics(charCallbacks: CharacteristicCallbacks): Promise<void>;
29
30
  disconnect(): Promise<void>;
30
31
  get uuid(): string;
31
32
  get name(): string;
@@ -35,6 +36,7 @@ export interface BleController {
35
36
  uuid: string;
36
37
  name: string;
37
38
  connect(): Promise<void>;
39
+ subscribeCharacteristics(charCallbacks: CharacteristicCallbacks): Promise<void>;
38
40
  writeCharacteristic(charUuid: CharacteristicUuid, value: string): Promise<void>;
39
41
  disconnect(): Promise<void>;
40
42
  }
@@ -125,6 +125,14 @@ export default class BleDeviceController {
125
125
  });
126
126
  this.throwIfError(status, error);
127
127
  }
128
+ async subscribeCharacteristics(charCallbacks) {
129
+ const { status, error } = this.ndx.addBleCharCallbacks({
130
+ deviceUuid: this.uuid,
131
+ charCallbacks,
132
+ });
133
+ this.throwIfError(status, error);
134
+ this.charCallbacks = [...this.charCallbacks, ...charCallbacks];
135
+ }
128
136
  async disconnect() {
129
137
  const { status, error } = this.ndx.stopBleBackend({
130
138
  deviceUuid: this.uuid,
@@ -1 +1 @@
1
- {"version":3,"file":"BleDeviceController.js","sourceRoot":"","sources":["../../../src/impl/controllers/BleDeviceController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAA4B,MAAM,uBAAuB,CAAA;AAE/E,MAAM,CAAC,OAAO,OAAO,mBAAmB;IAC7B,MAAM,CAAC,KAAK,CAA2B;IACvC,MAAM,CAAC,UAAU,GAAG,UAAU,CAAA;IAC9B,MAAM,CAAC,WAAW,GAAG,IAAI,CAAA;IAExB,MAAM,CAAC,IAAI,CAAS;IAErB,MAAM,KAAK,GAAG;QACjB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACb,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC,WAAW,EAAE,CAAA;QAC3C,CAAC;QACD,OAAO,IAAI,CAAC,IAAI,CAAA;IACpB,CAAC;IAEM,MAAM,KAAK,GAAG,CAAC,KAAa;QAC/B,IAAI,CAAC,IAAI,GAAG,KAAK,CAAA;IACrB,CAAC;IAES,aAAa,CAAyB;IACtC,cAAc,CAAS;IACvB,SAAS,GAAG,KAAK,CAAA;IACjB,GAAG,GAAG,OAAO,CAAA;IAEf,UAAU,CAAS;IACnB,gBAAgB,CAAS;IACzB,UAAU,CAAS;IACnB,WAAW,CAAyC;IAE5D,YAAsB,OAA6B;QAC/C,MAAM,EACF,UAAU,EACV,gBAAgB,EAChB,aAAa,EACb,WAAW,EACX,cAAc,GACjB,GAAG,OAAO,CAAA;QAEX,IAAI,CAAC,UAAU,GAAG,UAAU,CAAA;QAC5B,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,CAAA;QACxC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAA;QAClC,IAAI,CAAC,WAAW,GAAG,WAAW,CAAA;QAC9B,IAAI,CAAC,cAAc,GAAG,cAAc,CAAA;IACxC,CAAC;IAEM,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAA6B;QACpD,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,OAAO,CAAC,CAAA;IAC5C,CAAC;IAEM,KAAK,CAAC,OAAO;QAChB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACnB,MAAM,IAAI,CAAC,YAAY,EAAE,CAAA;QAC7B,CAAC;QAED,IAAI,CAAC,gBAAgB,EAAE,CAAA;QACvB,IAAI,CAAC,eAAe,EAAE,CAAA;QAEtB,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAA;QAC/B,MAAM,IAAI,CAAC,sBAAsB,EAAE,CAAA;QAEnC,IAAI,CAAC,kBAAkB,EAAE,CAAA;IAC7B,CAAC;IAEO,KAAK,CAAC,YAAY;QACtB,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC;YAC/C,UAAU,EAAE,IAAI,CAAC,gBAA0B;YAC3C,YAAY,EAAE,CAAC,IAAY,EAAE,EAAE;gBAC3B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAA;YAC1B,CAAC;SACJ,CAAC,CAAA;QAEF,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;QAEhC,MAAM,IAAI,CAAC,qBAAqB,EAAE,CAAA;IACtC,CAAC;IAEO,KAAK,CAAC,qBAAqB;QAC/B,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAChC,MAAM,eAAe,GAAG,GAAG,EAAE;gBACzB,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;oBAClB,OAAO,EAAE,CAAA;gBACb,CAAC;qBAAM,CAAC;oBACJ,mBAAmB,CAAC,UAAU,CAAC,eAAe,EAAE,GAAG,CAAC,CAAA;gBACxD,CAAC;YACL,CAAC,CAAA;YACD,eAAe,EAAE,CAAA;QACrB,CAAC,CAAC,CAAA;IACN,CAAC;IAEO,gBAAgB;QACpB,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC;YAChD,UAAU,EAAE,IAAI,CAAC,IAAI;SACxB,CAAC,CAAA;QAEF,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;IACpC,CAAC;IAEO,YAAY,CAAC,MAAc,EAAE,KAAyB;QAC1D,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,WAAW,KAAK,IAAI,eAAe,EAAE,CAAC,CAAA;QACnE,CAAC;IACL,CAAC;IAEO,kBAAkB;QACtB,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACtB,IAAI,CAAC,GAAG,CAAC,kBAAkB,CAAC;gBACxB,UAAU,EAAE,IAAI,CAAC,IAAI;gBACrB,UAAU,EAAE,IAAI,CAAC,cAAc;gBAC/B,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE;oBACrB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,GAAG,CAAC,CAAA;gBACnC,CAAC;aACJ,CAAC,CAAA;QACN,CAAC;IACL,CAAC;IAEO,eAAe;QACnB,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC;YAC/C,UAAU,EAAE,IAAI,CAAC,IAAI;YACrB,WAAW,EAAE,CAAC,UAA4B,EAAE,EAAE;gBAC1C,MAAM,EAAE,IAAI,EAAE,GAAG,UAAU,CAAA;gBAC3B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAA;gBACtB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAA;gBACrB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,uBAAuB,IAAI,CAAC,IAAI,GAAG,CAAC,CAAA;gBAClD,IAAI,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,CAAA;YAClC,CAAC;YACD,aAAa,EAAE,IAAI,CAAC,aAAa;SACpC,CAAC,CAAA;QAEF,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;IACpC,CAAC;IAEO,KAAK,CAAC,kBAAkB;QAC5B,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAChC,MAAM,cAAc,GAAG,GAAG,EAAE;gBACxB,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;oBACjB,OAAO,EAAE,CAAA;gBACb,CAAC;qBAAM,CAAC;oBACJ,mBAAmB,CAAC,UAAU,CAAC,cAAc,EAAE,GAAG,CAAC,CAAA;gBACvD,CAAC;YACL,CAAC,CAAA;YACD,cAAc,EAAE,CAAA;QACpB,CAAC,CAAC,CAAA;IACN,CAAC;IAEO,KAAK,CAAC,sBAAsB;QAChC,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAChC,mBAAmB,CAAC,UAAU,CAC1B,OAAO,EACP,mBAAmB,CAAC,WAAW,CAClC,CACJ,CAAA;IACL,CAAC;IAEM,KAAK,CAAC,mBAAmB,CAC5B,QAA4B,EAC5B,KAAa;QAEb,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,sBAAsB,CAAC;YACtD,UAAU,EAAE,IAAI,CAAC,IAAI;YACrB,QAAQ;YACR,KAAK;SACR,CAAC,CAAA;QAEF,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;IACpC,CAAC;IAEM,KAAK,CAAC,UAAU;QACnB,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC;YAC9C,UAAU,EAAE,IAAI,CAAC,IAAI;SACxB,CAAC,CAAA;QAEF,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,KAAK,CAAC,CAAA;QAChC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAA;IAC1B,CAAC;IAED,IAAW,IAAI;QACX,OAAO,IAAI,CAAC,UAAU,IAAI,EAAE,CAAA;IAChC,CAAC;IAED,IAAW,IAAI;QACX,OAAO,IAAI,CAAC,UAAU,IAAI,KAAK,CAAA;IACnC,CAAC;IAED,IAAY,GAAG;QACX,OAAO,mBAAmB,CAAC,GAAG,CAAA;IAClC,CAAC"}
1
+ {"version":3,"file":"BleDeviceController.js","sourceRoot":"","sources":["../../../src/impl/controllers/BleDeviceController.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ export default class UsbDeviceController implements UsbController {
2
+ static Class?: UsbControllerConstructor;
3
+ private onData;
4
+ private serialNumber;
5
+ private ndx;
6
+ protected constructor(options: UsbControllerOptions);
7
+ static Create(options: UsbControllerOptions): UsbController;
8
+ connect(): Promise<void>;
9
+ private get usbControllerOptions();
10
+ private get startUsbControllerOptions();
11
+ writeUsb(value: string): Promise<void>;
12
+ disconnect(): Promise<void>;
13
+ }
14
+ export interface UsbController {
15
+ connect(): Promise<void>;
16
+ writeUsb(value: string): Promise<void>;
17
+ disconnect(): Promise<void>;
18
+ }
19
+ export interface UsbControllerOptions {
20
+ onData: (data: Buffer, length: number, timestampSec: number) => void;
21
+ serialNumber?: string;
22
+ }
23
+ export type UsbControllerConstructor = new (options?: UsbControllerOptions) => UsbController;
@@ -0,0 +1,40 @@
1
+ import { LibndxAdapter } from '@neurodevs/ndx-native';
2
+ export default class UsbDeviceController {
3
+ static Class;
4
+ onData;
5
+ serialNumber;
6
+ ndx = LibndxAdapter.getInstance();
7
+ constructor(options) {
8
+ const { onData, serialNumber } = options ?? {};
9
+ this.onData = onData;
10
+ this.serialNumber = serialNumber ?? '';
11
+ }
12
+ static Create(options) {
13
+ return new (this.Class ?? this)(options);
14
+ }
15
+ async connect() {
16
+ this.ndx.createUsbBackend(this.usbControllerOptions);
17
+ this.ndx.startUsbBackend(this.startUsbControllerOptions);
18
+ }
19
+ get usbControllerOptions() {
20
+ return {
21
+ serialNumber: this.serialNumber,
22
+ };
23
+ }
24
+ get startUsbControllerOptions() {
25
+ return {
26
+ ...this.usbControllerOptions,
27
+ onData: this.onData,
28
+ };
29
+ }
30
+ async writeUsb(value) {
31
+ this.ndx.writeUsbBackend({
32
+ ...this.usbControllerOptions,
33
+ value,
34
+ });
35
+ }
36
+ async disconnect() {
37
+ this.ndx.stopUsbBackend(this.usbControllerOptions);
38
+ }
39
+ }
40
+ //# sourceMappingURL=UsbDeviceController.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UsbDeviceController.js","sourceRoot":"","sources":["../../../src/impl/controllers/UsbDeviceController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAErD,MAAM,CAAC,OAAO,OAAO,mBAAmB;IAC7B,MAAM,CAAC,KAAK,CAA2B;IAEtC,MAAM,CAA8D;IACpE,YAAY,CAAQ;IAEpB,GAAG,GAAG,aAAa,CAAC,WAAW,EAAE,CAAA;IAEzC,YAAsB,OAA6B;QAC/C,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,OAAO,IAAI,EAAE,CAAA;QAE9C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;QACpB,IAAI,CAAC,YAAY,GAAG,YAAY,IAAI,EAAE,CAAA;IAC1C,CAAC;IAEM,MAAM,CAAC,MAAM,CAAC,OAA6B;QAC9C,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,OAAO,CAAC,CAAA;IAC5C,CAAC;IAEM,KAAK,CAAC,OAAO;QAChB,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAA;QACpD,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAA;IAC5D,CAAC;IAED,IAAY,oBAAoB;QAC5B,OAAO;YACH,YAAY,EAAE,IAAI,CAAC,YAAY;SAClC,CAAA;IACL,CAAC;IAED,IAAY,yBAAyB;QACjC,OAAO;YACH,GAAG,IAAI,CAAC,oBAAoB;YAC5B,MAAM,EAAE,IAAI,CAAC,MAAM;SACtB,CAAA;IACL,CAAC;IAEM,KAAK,CAAC,QAAQ,CAAC,KAAa;QAC/B,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC;YACrB,GAAG,IAAI,CAAC,oBAAoB;YAC5B,KAAK;SACR,CAAC,CAAA;IACN,CAAC;IAEM,KAAK,CAAC,UAAU;QACnB,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAA;IACtD,CAAC;CACJ"}
package/build/index.d.ts CHANGED
@@ -1,3 +1,7 @@
1
+ export { default as WindowedClockRegressor } from './impl/WindowedClockRegressor.js';
2
+ export * from './impl/WindowedClockRegressor.js';
3
+ export { default as FakeClockRegressor } from './testDoubles/ClockRegressor/FakeClockRegressor.js';
4
+ export * from './testDoubles/ClockRegressor/FakeClockRegressor.js';
1
5
  export { default as BleDeviceController } from './impl/controllers/BleDeviceController.js';
2
6
  export * from './impl/controllers/BleDeviceController.js';
3
7
  export { default as FakeBleController } from './testDoubles/BleController/FakeBleController.js';
@@ -26,6 +30,10 @@ export { default as LslStreamOutlet } from './impl/LslStreamOutlet.js';
26
30
  export * from './impl/LslStreamOutlet.js';
27
31
  export { default as FakeStreamOutlet } from './testDoubles/StreamOutlet/FakeStreamOutlet.js';
28
32
  export * from './testDoubles/StreamOutlet/FakeStreamOutlet.js';
33
+ export { default as UsbDeviceController } from './impl/controllers/UsbDeviceController.js';
34
+ export * from './impl/controllers/UsbDeviceController.js';
35
+ export { default as FakeUsbController } from './testDoubles/UsbController/FakeUsbController.js';
36
+ export * from './testDoubles/UsbController/FakeUsbController.js';
29
37
  export { default as LslWebSocketBridge } from './impl/LslWebSocketBridge.js';
30
38
  export * from './impl/LslWebSocketBridge.js';
31
39
  export { default as FakeWebSocketBridge } from './testDoubles/WebSocketBridge/FakeWebSocketBridge.js';
package/build/index.js CHANGED
@@ -1,3 +1,8 @@
1
+ // ClockRegressor
2
+ export { default as WindowedClockRegressor } from './impl/WindowedClockRegressor.js';
3
+ export * from './impl/WindowedClockRegressor.js';
4
+ export { default as FakeClockRegressor } from './testDoubles/ClockRegressor/FakeClockRegressor.js';
5
+ export * from './testDoubles/ClockRegressor/FakeClockRegressor.js';
1
6
  // DeviceController
2
7
  export { default as BleDeviceController } from './impl/controllers/BleDeviceController.js';
3
8
  export * from './impl/controllers/BleDeviceController.js';
@@ -31,6 +36,11 @@ export { default as LslStreamOutlet } from './impl/LslStreamOutlet.js';
31
36
  export * from './impl/LslStreamOutlet.js';
32
37
  export { default as FakeStreamOutlet } from './testDoubles/StreamOutlet/FakeStreamOutlet.js';
33
38
  export * from './testDoubles/StreamOutlet/FakeStreamOutlet.js';
39
+ // UsbController
40
+ export { default as UsbDeviceController } from './impl/controllers/UsbDeviceController.js';
41
+ export * from './impl/controllers/UsbDeviceController.js';
42
+ export { default as FakeUsbController } from './testDoubles/UsbController/FakeUsbController.js';
43
+ export * from './testDoubles/UsbController/FakeUsbController.js';
34
44
  // WebSocketBridge
35
45
  export { default as LslWebSocketBridge } from './impl/LslWebSocketBridge.js';
36
46
  export * from './impl/LslWebSocketBridge.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,mBAAmB;AAEnB,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,2CAA2C,CAAA;AAC1F,cAAc,2CAA2C,CAAA;AAEzD,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,kDAAkD,CAAA;AAC/F,cAAc,kDAAkD,CAAA;AAEhE,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,iDAAiD,CAAA;AAC7F,cAAc,iDAAiD,CAAA;AAE/D,qBAAqB;AAErB,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,iCAAiC,CAAA;AAClF,cAAc,iCAAiC,CAAA;AAE/C,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,4DAA4D,CAAA;AAC9G,cAAc,4DAA4D,CAAA;AAE1E,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,2DAA2D,CAAA;AAC5G,cAAc,2DAA2D,CAAA;AAEzE,OAAO,EAAE,OAAO,IAAI,0BAA0B,EAAE,MAAM,gEAAgE,CAAA;AACtH,cAAc,gEAAgE,CAAA;AAE9E,aAAa;AAEb,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,yBAAyB,CAAA;AAClE,cAAc,yBAAyB,CAAA;AAEvC,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,2CAA2C,CAAA;AACpF,cAAc,2CAA2C,CAAA;AAEzD,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,4CAA4C,CAAA;AACtF,cAAc,4CAA4C,CAAA;AAE1D,cAAc;AAEd,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,0BAA0B,CAAA;AACpE,cAAc,0BAA0B,CAAA;AAExC,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,8CAA8C,CAAA;AACzF,cAAc,8CAA8C,CAAA;AAE5D,eAAe;AAEf,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,2BAA2B,CAAA;AACtE,cAAc,2BAA2B,CAAA;AAEzC,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,gDAAgD,CAAA;AAC5F,cAAc,gDAAgD,CAAA;AAE9D,kBAAkB;AAElB,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,8BAA8B,CAAA;AAC5E,cAAc,8BAA8B,CAAA;AAE5C,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,sDAAsD,CAAA;AACrG,cAAc,sDAAsD,CAAA;AAEpE,QAAQ;AAER,OAAO,EAAE,OAAO,IAAI,2BAA2B,EAAE,MAAM,8CAA8C,CAAA;AAErG,aAAa;AAEb,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,2CAA2C,CAAA;AACpF,cAAc,2CAA2C,CAAA;AAEzD,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,iDAAiD,CAAA;AAChG,cAAc,iDAAiD,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,iBAAiB;AAEjB,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,kCAAkC,CAAA;AACpF,cAAc,kCAAkC,CAAA;AAEhD,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,oDAAoD,CAAA;AAClG,cAAc,oDAAoD,CAAA;AAElE,mBAAmB;AAEnB,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,2CAA2C,CAAA;AAC1F,cAAc,2CAA2C,CAAA;AAEzD,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,kDAAkD,CAAA;AAC/F,cAAc,kDAAkD,CAAA;AAEhE,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,iDAAiD,CAAA;AAC7F,cAAc,iDAAiD,CAAA;AAE/D,qBAAqB;AAErB,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,iCAAiC,CAAA;AAClF,cAAc,iCAAiC,CAAA;AAE/C,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAE,MAAM,4DAA4D,CAAA;AAC9G,cAAc,4DAA4D,CAAA;AAE1E,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,2DAA2D,CAAA;AAC5G,cAAc,2DAA2D,CAAA;AAEzE,OAAO,EAAE,OAAO,IAAI,0BAA0B,EAAE,MAAM,gEAAgE,CAAA;AACtH,cAAc,gEAAgE,CAAA;AAE9E,aAAa;AAEb,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,yBAAyB,CAAA;AAClE,cAAc,yBAAyB,CAAA;AAEvC,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,2CAA2C,CAAA;AACpF,cAAc,2CAA2C,CAAA;AAEzD,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,4CAA4C,CAAA;AACtF,cAAc,4CAA4C,CAAA;AAE1D,cAAc;AAEd,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,0BAA0B,CAAA;AACpE,cAAc,0BAA0B,CAAA;AAExC,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,8CAA8C,CAAA;AACzF,cAAc,8CAA8C,CAAA;AAE5D,eAAe;AAEf,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,2BAA2B,CAAA;AACtE,cAAc,2BAA2B,CAAA;AAEzC,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,gDAAgD,CAAA;AAC5F,cAAc,gDAAgD,CAAA;AAE9D,gBAAgB;AAEhB,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,2CAA2C,CAAA;AAC1F,cAAc,2CAA2C,CAAA;AAEzD,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,kDAAkD,CAAA;AAC/F,cAAc,kDAAkD,CAAA;AAEhE,kBAAkB;AAElB,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,8BAA8B,CAAA;AAC5E,cAAc,8BAA8B,CAAA;AAE5C,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,sDAAsD,CAAA;AACrG,cAAc,sDAAsD,CAAA;AAEpE,QAAQ;AAER,OAAO,EAAE,OAAO,IAAI,2BAA2B,EAAE,MAAM,8CAA8C,CAAA;AAErG,aAAa;AAEb,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,2CAA2C,CAAA;AACpF,cAAc,2CAA2C,CAAA;AAEzD,OAAO,EAAE,OAAO,IAAI,mBAAmB,EAAE,MAAM,iDAAiD,CAAA;AAChG,cAAc,iDAAiD,CAAA"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,14 @@
1
+ import UsbDeviceController from '../impl/controllers/UsbDeviceController.js';
2
+ console.info('\nCreating UsbDeviceController...');
3
+ const controller = UsbDeviceController.Create({
4
+ serialNumber: 'DP04WG8J',
5
+ onData: (_data, length, timestampSec) => {
6
+ console.info(`[${timestampSec}] Buffer length: ${length}`);
7
+ },
8
+ });
9
+ console.info('Connecting to UsbDeviceController...');
10
+ await controller.connect();
11
+ console.info('Waiting for 10 seconds...');
12
+ await new Promise((resolve) => setTimeout(resolve, 10000));
13
+ console.info('Done!');
14
+ //# sourceMappingURL=runUsb.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runUsb.js","sourceRoot":"","sources":["../../src/scripts/runUsb.ts"],"names":[],"mappings":"AAAA,OAAO,mBAAmB,MAAM,4CAA4C,CAAA;AAE5E,OAAO,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAA;AAEjD,MAAM,UAAU,GAAG,mBAAmB,CAAC,MAAM,CAAC;IAC1C,YAAY,EAAE,UAAU;IACxB,MAAM,EAAE,CAAC,KAAa,EAAE,MAAc,EAAE,YAAoB,EAAE,EAAE;QAC5D,OAAO,CAAC,IAAI,CAAC,IAAI,YAAY,oBAAoB,MAAM,EAAE,CAAC,CAAA;IAC9D,CAAC;CACJ,CAAC,CAAA;AAEF,OAAO,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAA;AAEpD,MAAM,UAAU,CAAC,OAAO,EAAE,CAAA;AAE1B,OAAO,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAA;AAEzC,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAA;AAE1D,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA"}
@@ -1,4 +1,4 @@
1
- import { BleController, BleControllerOptions } from '../../impl/controllers/BleDeviceController.js';
1
+ import { BleController, BleControllerOptions, CharacteristicCallbacks } from '../../impl/controllers/BleDeviceController.js';
2
2
  export default class FakeBleController implements BleController {
3
3
  static callsToConstructor: (BleControllerOptions | undefined)[];
4
4
  static numCallsToConnect: number;
@@ -6,6 +6,7 @@ export default class FakeBleController implements BleController {
6
6
  characteristicUuid: string;
7
7
  value: string;
8
8
  }[];
9
+ static callsToSubscribeCharacteristics: CharacteristicCallbacks[];
9
10
  static numCallsToDisconnect: number;
10
11
  static fakeCharacteristics: Record<string, unknown>;
11
12
  static fakeName: string;
@@ -14,6 +15,7 @@ export default class FakeBleController implements BleController {
14
15
  constructor(options?: BleControllerOptions);
15
16
  connect(): Promise<void>;
16
17
  writeCharacteristic(characteristicUuid: string, value: string): Promise<void>;
18
+ subscribeCharacteristics(charCallbacks: CharacteristicCallbacks): Promise<void>;
17
19
  disconnect(): Promise<void>;
18
20
  get uuid(): string;
19
21
  get name(): string;