@neurodevs/node-lsl 18.1.0 → 20.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.
- package/build/__tests__/AbstractPackageTest.d.ts +19 -17
- package/build/__tests__/AbstractPackageTest.js +54 -39
- package/build/__tests__/AbstractPackageTest.js.map +1 -1
- package/build/__tests__/impl/BleDeviceController.test.d.ts +6 -1
- package/build/__tests__/impl/BleDeviceController.test.js +44 -15
- package/build/__tests__/impl/BleDeviceController.test.js.map +1 -1
- package/build/__tests__/impl/LslEventMarkerEmitter.test.js +13 -13
- package/build/__tests__/impl/LslEventMarkerEmitter.test.js.map +1 -1
- package/build/__tests__/impl/LslStreamInfo.test.js +2 -2
- package/build/__tests__/impl/LslStreamInfo.test.js.map +1 -1
- package/build/__tests__/impl/LslStreamInlet.test.d.ts +3 -5
- package/build/__tests__/impl/LslStreamInlet.test.js +13 -46
- package/build/__tests__/impl/LslStreamInlet.test.js.map +1 -1
- package/build/__tests__/impl/LslStreamOutlet.test.js +9 -16
- package/build/__tests__/impl/LslStreamOutlet.test.js.map +1 -1
- package/build/__tests__/impl/LslWebSocketBridge.test.js +9 -10
- package/build/__tests__/impl/LslWebSocketBridge.test.js.map +1 -1
- package/build/__tests__/impl/UsbDeviceController.test.d.ts +17 -0
- package/build/__tests__/impl/UsbDeviceController.test.js +81 -0
- package/build/__tests__/impl/UsbDeviceController.test.js.map +1 -0
- package/build/__tests__/impl/WindowedClockRegressor.test.d.ts +19 -0
- package/build/__tests__/impl/WindowedClockRegressor.test.js +172 -0
- package/build/__tests__/impl/WindowedClockRegressor.test.js.map +1 -0
- package/build/assertions.js +1 -1
- package/build/assertions.js.map +1 -1
- package/build/impl/LslEventMarkerEmitter.d.ts +12 -12
- package/build/impl/LslEventMarkerEmitter.js.map +1 -1
- package/build/impl/LslStreamInfo.d.ts +7 -7
- package/build/impl/LslStreamInfo.js.map +1 -1
- package/build/impl/LslStreamInlet.d.ts +63 -20
- package/build/impl/LslStreamInlet.js +221 -64
- package/build/impl/LslStreamInlet.js.map +1 -1
- package/build/impl/LslStreamOutlet.d.ts +16 -14
- package/build/impl/LslStreamOutlet.js +34 -37
- package/build/impl/LslStreamOutlet.js.map +1 -1
- package/build/impl/LslWebSocketBridge.d.ts +10 -10
- package/build/impl/LslWebSocketBridge.js.map +1 -1
- package/build/impl/clocks/WindowedClockRegressor.d.ts +24 -0
- package/build/impl/clocks/WindowedClockRegressor.js +73 -0
- package/build/impl/clocks/WindowedClockRegressor.js.map +1 -0
- package/build/impl/controllers/BleDeviceController.d.ts +3 -1
- package/build/impl/controllers/BleDeviceController.js +9 -1
- package/build/impl/controllers/BleDeviceController.js.map +1 -1
- package/build/impl/controllers/UsbDeviceController.d.ts +23 -0
- package/build/impl/controllers/UsbDeviceController.js +40 -0
- package/build/impl/controllers/UsbDeviceController.js.map +1 -0
- package/build/index.d.ts +32 -20
- package/build/index.js +39 -26
- package/build/index.js.map +1 -1
- package/build/scripts/{runLslEventMarkerEmitter.js → runLslEmitter.js} +5 -4
- package/build/scripts/runLslEmitter.js.map +1 -0
- package/build/scripts/{runLslStreamOutlet.js → runLslOutlet.js} +1 -1
- package/build/scripts/runLslOutlet.js.map +1 -0
- package/build/scripts/runMuse.js +1 -1
- package/build/scripts/runMuse.js.map +1 -1
- package/build/scripts/runUsb.js +14 -0
- package/build/scripts/runUsb.js.map +1 -0
- package/build/testDoubles/BleController/FakeBleController.d.ts +3 -1
- package/build/testDoubles/BleController/FakeBleController.js +5 -0
- package/build/testDoubles/BleController/FakeBleController.js.map +1 -1
- package/build/testDoubles/ClockRegressor/FakeClockRegressor.d.ts +17 -0
- package/build/testDoubles/ClockRegressor/FakeClockRegressor.js +23 -0
- package/build/testDoubles/ClockRegressor/FakeClockRegressor.js.map +1 -0
- package/build/testDoubles/{EventMarkerEmitter/FakeEventMarkerEmitter.d.ts → LslEmitter/FakeLslEmitter.d.ts} +4 -4
- package/build/testDoubles/{EventMarkerEmitter/FakeEventMarkerEmitter.js → LslEmitter/FakeLslEmitter.js} +7 -7
- package/build/testDoubles/LslEmitter/FakeLslEmitter.js.map +1 -0
- package/build/testDoubles/{EventMarkerEmitter/SpyEventMarkerEmitter.d.ts → LslEmitter/SpyLslEmitter.d.ts} +4 -4
- package/build/testDoubles/{EventMarkerEmitter/SpyEventMarkerEmitter.js → LslEmitter/SpyLslEmitter.js} +3 -3
- package/build/testDoubles/LslEmitter/SpyLslEmitter.js.map +1 -0
- package/build/testDoubles/LslEmitter/ThrowingLslEmitter.d.ts +9 -0
- package/build/testDoubles/{EventMarkerEmitter/ThrowingEventMarkerEmitter.js → LslEmitter/ThrowingLslEmitter.js} +2 -2
- package/build/testDoubles/LslEmitter/ThrowingLslEmitter.js.map +1 -0
- package/build/testDoubles/{StreamInfo/FakeStreamInfo.d.ts → LslInfo/FakeLslInfo.d.ts} +4 -4
- package/build/testDoubles/{StreamInfo/FakeStreamInfo.js → LslInfo/FakeLslInfo.js} +7 -7
- package/build/testDoubles/LslInfo/FakeLslInfo.js.map +1 -0
- package/build/testDoubles/LslInfo/SpyLslInfo.d.ts +10 -0
- package/build/testDoubles/{StreamInfo/SpyStreamInfo.js → LslInfo/SpyLslInfo.js} +4 -4
- package/build/testDoubles/LslInfo/SpyLslInfo.js.map +1 -0
- package/build/testDoubles/{StreamInlet/FakeStreamInlet.d.ts → LslInlet/FakeLslInlet.d.ts} +4 -4
- package/build/testDoubles/{StreamInlet/FakeStreamInlet.js → LslInlet/FakeLslInlet.js} +12 -11
- package/build/testDoubles/LslInlet/FakeLslInlet.js.map +1 -0
- package/build/testDoubles/LslInlet/SpyLslInlet.d.ts +4 -0
- package/build/testDoubles/{StreamInlet/SpyStreamInlet.js → LslInlet/SpyLslInlet.js} +2 -2
- package/build/testDoubles/LslInlet/SpyLslInlet.js.map +1 -0
- package/build/testDoubles/{StreamOutlet/FakeStreamOutlet.d.ts → LslOutlet/FakeLslOutlet.d.ts} +5 -5
- package/build/testDoubles/{StreamOutlet/FakeStreamOutlet.js → LslOutlet/FakeLslOutlet.js} +8 -8
- package/build/testDoubles/LslOutlet/FakeLslOutlet.js.map +1 -0
- package/build/testDoubles/LslWsBridge/FakeLslWsBridge.d.ts +14 -0
- package/build/testDoubles/{WebSocketBridge/FakeWebSocketBridge.js → LslWsBridge/FakeLslWsBridge.js} +14 -14
- package/build/testDoubles/LslWsBridge/FakeLslWsBridge.js.map +1 -0
- package/build/testDoubles/LslWsBridge/SpyLslWsBridge.d.ts +4 -0
- package/build/testDoubles/{WebSocketBridge/SpyLslWebSocketBridge.js → LslWsBridge/SpyLslWsBridge.js} +2 -2
- package/build/testDoubles/LslWsBridge/SpyLslWsBridge.js.map +1 -0
- package/build/testDoubles/UsbController/FakeUsbController.d.ts +12 -0
- package/build/testDoubles/UsbController/FakeUsbController.js +25 -0
- package/build/testDoubles/UsbController/FakeUsbController.js.map +1 -0
- package/build/testDoubles/consts.d.ts +2 -12
- package/build/testDoubles/consts.js +0 -20
- package/build/testDoubles/consts.js.map +1 -1
- package/build/testDoubles/generateRandomOutletOptions.d.ts +2 -2
- package/build/testDoubles/generateRandomOutletOptions.js.map +1 -1
- package/package.json +6 -5
- package/src/__tests__/AbstractPackageTest.ts +78 -49
- package/src/__tests__/impl/BleDeviceController.test.ts +59 -18
- package/src/__tests__/impl/LslEventMarkerEmitter.test.ts +19 -24
- package/src/__tests__/impl/LslStreamInfo.test.ts +8 -8
- package/src/__tests__/impl/LslStreamInlet.test.ts +21 -78
- package/src/__tests__/impl/LslStreamOutlet.test.ts +22 -28
- package/src/__tests__/impl/LslWebSocketBridge.test.ts +15 -18
- package/src/__tests__/impl/UsbDeviceController.test.ts +109 -0
- package/src/__tests__/impl/WindowedClockRegressor.test.ts +262 -0
- package/src/assertions.ts +1 -2
- package/src/impl/LslEventMarkerEmitter.ts +15 -17
- package/src/impl/LslStreamInfo.ts +7 -9
- package/src/impl/LslStreamInlet.ts +304 -77
- package/src/impl/LslStreamOutlet.ts +59 -57
- package/src/impl/LslWebSocketBridge.ts +15 -18
- package/src/impl/clocks/WindowedClockRegressor.ts +136 -0
- package/src/impl/controllers/BleDeviceController.ts +18 -1
- package/src/impl/controllers/UsbDeviceController.ts +65 -0
- package/src/index.ts +48 -28
- package/src/scripts/{runLslEventMarkerEmitter.ts → runLslEmitter.ts} +4 -3
- package/src/scripts/runMuse.ts +1 -1
- package/src/scripts/runUsb.ts +20 -0
- package/src/testDoubles/BleController/FakeBleController.ts +11 -0
- package/src/testDoubles/ClockRegressor/FakeClockRegressor.ts +46 -0
- package/src/testDoubles/{EventMarkerEmitter/FakeEventMarkerEmitter.ts → LslEmitter/FakeLslEmitter.ts} +10 -10
- package/src/testDoubles/{EventMarkerEmitter/SpyEventMarkerEmitter.ts → LslEmitter/SpyLslEmitter.ts} +4 -4
- package/src/testDoubles/{EventMarkerEmitter/ThrowingEventMarkerEmitter.ts → LslEmitter/ThrowingLslEmitter.ts} +4 -4
- package/src/testDoubles/{StreamInfo/FakeStreamInfo.ts → LslInfo/FakeLslInfo.ts} +9 -9
- package/src/testDoubles/{StreamInfo/SpyStreamInfo.ts → LslInfo/SpyLslInfo.ts} +5 -5
- package/src/testDoubles/{StreamInlet/FakeStreamInlet.ts → LslInlet/FakeLslInlet.ts} +15 -14
- package/src/testDoubles/LslInlet/SpyLslInlet.ts +10 -0
- package/src/testDoubles/{StreamOutlet/FakeStreamOutlet.ts → LslOutlet/FakeLslOutlet.ts} +11 -14
- package/src/testDoubles/{WebSocketBridge/FakeWebSocketBridge.ts → LslWsBridge/FakeLslWsBridge.ts} +19 -20
- package/src/testDoubles/LslWsBridge/SpyLslWsBridge.ts +9 -0
- package/src/testDoubles/UsbController/FakeUsbController.ts +34 -0
- package/src/testDoubles/consts.ts +3 -23
- package/src/testDoubles/generateRandomOutletOptions.ts +2 -2
- package/build/consts.d.ts +0 -11
- package/build/consts.js +0 -21
- package/build/consts.js.map +0 -1
- package/build/impl/workers/inlet/LslStreamInlet.worker.d.ts +0 -22
- package/build/impl/workers/inlet/LslStreamInlet.worker.js +0 -42
- package/build/impl/workers/inlet/LslStreamInlet.worker.js.map +0 -1
- package/build/impl/workers/inlet/StreamInletWorker.d.ts +0 -73
- package/build/impl/workers/inlet/StreamInletWorker.js +0 -253
- package/build/impl/workers/inlet/StreamInletWorker.js.map +0 -1
- package/build/impl/workers/outlet/LslStreamOutlet.worker.d.ts +0 -32
- package/build/impl/workers/outlet/LslStreamOutlet.worker.js +0 -82
- package/build/impl/workers/outlet/LslStreamOutlet.worker.js.map +0 -1
- package/build/scripts/discoverMuse.js +0 -40
- package/build/scripts/discoverMuse.js.map +0 -1
- package/build/scripts/runLslEventMarkerEmitter.js.map +0 -1
- package/build/scripts/runLslStreamOutlet.js.map +0 -1
- package/build/scripts/testDestroyOutlet.d.ts +0 -1
- package/build/scripts/testDestroyOutlet.js +0 -4
- package/build/scripts/testDestroyOutlet.js.map +0 -1
- package/build/testDoubles/EventMarkerEmitter/FakeEventMarkerEmitter.js.map +0 -1
- package/build/testDoubles/EventMarkerEmitter/SpyEventMarkerEmitter.js.map +0 -1
- package/build/testDoubles/EventMarkerEmitter/ThrowingEventMarkerEmitter.d.ts +0 -9
- package/build/testDoubles/EventMarkerEmitter/ThrowingEventMarkerEmitter.js.map +0 -1
- package/build/testDoubles/StreamInfo/FakeStreamInfo.js.map +0 -1
- package/build/testDoubles/StreamInfo/SpyStreamInfo.d.ts +0 -10
- package/build/testDoubles/StreamInfo/SpyStreamInfo.js.map +0 -1
- package/build/testDoubles/StreamInlet/FakeStreamInlet.js.map +0 -1
- package/build/testDoubles/StreamInlet/SpyStreamInlet.d.ts +0 -4
- package/build/testDoubles/StreamInlet/SpyStreamInlet.js.map +0 -1
- package/build/testDoubles/StreamOutlet/FakeStreamOutlet.js.map +0 -1
- package/build/testDoubles/WebSocketBridge/FakeWebSocketBridge.d.ts +0 -14
- package/build/testDoubles/WebSocketBridge/FakeWebSocketBridge.js.map +0 -1
- package/build/testDoubles/WebSocketBridge/SpyLslWebSocketBridge.d.ts +0 -4
- package/build/testDoubles/WebSocketBridge/SpyLslWebSocketBridge.js.map +0 -1
- package/build/testDoubles/WorkerThreads/FakeWorker.d.ts +0 -27
- package/build/testDoubles/WorkerThreads/FakeWorker.js +0 -67
- package/build/testDoubles/WorkerThreads/FakeWorker.js.map +0 -1
- package/src/consts.ts +0 -21
- package/src/impl/workers/inlet/LslStreamInlet.worker.ts +0 -74
- package/src/impl/workers/inlet/StreamInletWorker.ts +0 -348
- package/src/impl/workers/outlet/LslStreamOutlet.worker.ts +0 -144
- package/src/scripts/discoverMuse.ts +0 -50
- package/src/scripts/testDestroyOutlet.ts +0 -5
- package/src/testDoubles/StreamInlet/SpyStreamInlet.ts +0 -10
- package/src/testDoubles/WebSocketBridge/SpyLslWebSocketBridge.ts +0 -9
- package/src/testDoubles/WorkerThreads/FakeWorker.ts +0 -99
- /package/build/scripts/{discoverMuse.d.ts → runLslEmitter.d.ts} +0 -0
- /package/build/scripts/{runLslEventMarkerEmitter.d.ts → runLslOutlet.d.ts} +0 -0
- /package/build/scripts/{runLslStreamOutlet.d.ts → runUsb.d.ts} +0 -0
- /package/src/scripts/{runLslStreamOutlet.ts → runLslOutlet.ts} +0 -0
|
@@ -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/clocks/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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"}
|
package/build/assertions.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { CHANNEL_FORMATS } from '
|
|
1
|
+
import { CHANNEL_FORMATS } from '@neurodevs/ndx-native';
|
|
2
2
|
import { isGreaterThanOrEqualToZero, isPositiveInteger, isPositiveIntegerOrZero, isStringInArray, } from './validations.js';
|
|
3
3
|
export function assertValidChunkSize(chunkSize) {
|
|
4
4
|
if (!isPositiveIntegerOrZero(chunkSize)) {
|
package/build/assertions.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assertions.js","sourceRoot":"","sources":["../src/assertions.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"assertions.js","sourceRoot":"","sources":["../src/assertions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAiB,MAAM,uBAAuB,CAAA;AAEtE,OAAO,EACH,0BAA0B,EAC1B,iBAAiB,EACjB,uBAAuB,EACvB,eAAe,GAClB,MAAM,kBAAkB,CAAA;AAEzB,MAAM,UAAU,oBAAoB,CAAC,SAAiB;IAClD,IAAI,CAAC,uBAAuB,CAAC,SAAS,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CACX,gEAAgE,SAAS,GAAG,CAC/E,CAAA;IACL,CAAC;AACL,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,aAAqB;IAC1D,IAAI,CAAC,uBAAuB,CAAC,aAAa,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,KAAK,CACX,kEAAkE,aAAa,GAAG,CACrF,CAAA;IACL,CAAC;AACL,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,aAA4B;IACjE,IAAI,CAAC,eAAe,CAAC,aAAa,EAAE,eAAe,CAAC,EAAE,CAAC;QACnD,MAAM,IAAI,KAAK,CACX,2CAA2C,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,aAAa,GAAG,CACjG,CAAA;IACL,CAAC;AACL,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,YAAoB;IACxD,IAAI,CAAC,0BAA0B,CAAC,YAAY,CAAC,EAAE,CAAC;QAC5C,MAAM,IAAI,KAAK,CACX,gEAAgE,YAAY,GAAG,CAClF,CAAA;IACL,CAAC;AACL,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,YAAoB;IACxD,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CACX,2DAA2D,YAAY,GAAG,CAC7E,CAAA;IACL,CAAC;AACL,CAAC"}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export default class LslEventMarkerEmitter implements
|
|
3
|
-
static Class?:
|
|
4
|
-
protected outlet:
|
|
1
|
+
import { LslOutletOptions, LslOutlet } from './LslStreamOutlet.js';
|
|
2
|
+
export default class LslEventMarkerEmitter implements LslEmitter {
|
|
3
|
+
static Class?: LslEmitterConstructor;
|
|
4
|
+
protected outlet: LslOutlet;
|
|
5
5
|
private isRunning;
|
|
6
6
|
private waitResolve?;
|
|
7
7
|
private timeout?;
|
|
8
|
-
protected constructor(outlet:
|
|
9
|
-
static Create(options?:
|
|
10
|
-
emit(markerName: string, options?:
|
|
8
|
+
protected constructor(outlet: LslOutlet);
|
|
9
|
+
static Create(options?: LslEmitterOptions): Promise<LslEmitter>;
|
|
10
|
+
emit(markerName: string, options?: EmitOptions): Promise<void>;
|
|
11
11
|
private throwIfAlreadyRunning;
|
|
12
12
|
emitMany(markers: TimedEventMarker[]): Promise<void>;
|
|
13
13
|
private pushMarkerToOutlet;
|
|
@@ -18,15 +18,15 @@ export default class LslEventMarkerEmitter implements EventMarkerEmitter {
|
|
|
18
18
|
private static generateDefaultOutletOptions;
|
|
19
19
|
private static LslStreamOutlet;
|
|
20
20
|
}
|
|
21
|
-
export interface
|
|
22
|
-
emit(markerName: string, options?:
|
|
21
|
+
export interface LslEmitter {
|
|
22
|
+
emit(markerName: string, options?: EmitOptions): Promise<void>;
|
|
23
23
|
emitMany(markers: TimedEventMarker[]): Promise<void>;
|
|
24
24
|
interrupt(): void;
|
|
25
25
|
destroy(): void;
|
|
26
26
|
}
|
|
27
|
-
export type
|
|
28
|
-
export type
|
|
29
|
-
export interface
|
|
27
|
+
export type LslEmitterOptions = Partial<LslOutletOptions>;
|
|
28
|
+
export type LslEmitterConstructor = new (outlet: LslOutlet) => LslEmitter;
|
|
29
|
+
export interface EmitOptions {
|
|
30
30
|
waitAfterMs?: number;
|
|
31
31
|
}
|
|
32
32
|
export interface TimedEventMarker {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LslEventMarkerEmitter.js","sourceRoot":"","sources":["../../src/impl/LslEventMarkerEmitter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAExD,OAAO,eAGN,MAAM,sBAAsB,CAAA;AAE7B,MAAM,CAAC,OAAO,OAAO,qBAAqB;IAC/B,MAAM,CAAC,KAAK,
|
|
1
|
+
{"version":3,"file":"LslEventMarkerEmitter.js","sourceRoot":"","sources":["../../src/impl/LslEventMarkerEmitter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ChannelFormat, InfoHandle } from '@neurodevs/ndx-native';
|
|
2
|
-
export default class LslStreamInfo implements
|
|
3
|
-
static Class?:
|
|
2
|
+
export default class LslStreamInfo implements LslInfo {
|
|
3
|
+
static Class?: LslInfoConstructor;
|
|
4
4
|
readonly name: string;
|
|
5
5
|
readonly type: string;
|
|
6
6
|
readonly sourceId: string;
|
|
@@ -11,14 +11,14 @@ export default class LslStreamInfo implements StreamInfo {
|
|
|
11
11
|
readonly units: string;
|
|
12
12
|
readonly infoHandle: InfoHandle;
|
|
13
13
|
private lsl;
|
|
14
|
-
protected constructor(options:
|
|
15
|
-
static Create(options:
|
|
14
|
+
protected constructor(options: LslInfoOptions);
|
|
15
|
+
static Create(options: LslInfoOptions): LslInfo;
|
|
16
16
|
private createStreamInfo;
|
|
17
17
|
private get lslChannelFormat();
|
|
18
18
|
private appendChannelsToStreamInfo;
|
|
19
19
|
destroy(): void;
|
|
20
20
|
}
|
|
21
|
-
export interface
|
|
21
|
+
export interface LslInfo {
|
|
22
22
|
destroy(): void;
|
|
23
23
|
readonly name: string;
|
|
24
24
|
readonly type: string;
|
|
@@ -30,8 +30,8 @@ export interface StreamInfo {
|
|
|
30
30
|
readonly sampleRateHz: number;
|
|
31
31
|
readonly infoHandle: InfoHandle;
|
|
32
32
|
}
|
|
33
|
-
export type
|
|
34
|
-
export interface
|
|
33
|
+
export type LslInfoConstructor = new (options: LslInfoOptions) => LslInfo;
|
|
34
|
+
export interface LslInfoOptions {
|
|
35
35
|
channelNames: string[];
|
|
36
36
|
channelFormat: ChannelFormat;
|
|
37
37
|
sampleRateHz: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LslStreamInfo.js","sourceRoot":"","sources":["../../src/impl/LslStreamInfo.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,wBAAwB,CAAA;AAC/C,OAAO,EAGH,aAAa,EACb,mBAAmB,GACtB,MAAM,uBAAuB,CAAA;AAE9B,MAAM,CAAC,OAAO,OAAO,aAAa;IACvB,MAAM,CAAC,KAAK,
|
|
1
|
+
{"version":3,"file":"LslStreamInfo.js","sourceRoot":"","sources":["../../src/impl/LslStreamInfo.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,wBAAwB,CAAA;AAC/C,OAAO,EAGH,aAAa,EACb,mBAAmB,GACtB,MAAM,uBAAuB,CAAA;AAE9B,MAAM,CAAC,OAAO,OAAO,aAAa;IACvB,MAAM,CAAC,KAAK,CAAqB;IAExB,IAAI,CAAQ;IACZ,IAAI,CAAQ;IACZ,QAAQ,CAAQ;IAChB,YAAY,CAAU;IACtB,YAAY,CAAQ;IACpB,aAAa,CAAe;IAC5B,YAAY,CAAQ;IACpB,KAAK,CAAQ;IAEb,UAAU,CAAY;IAE9B,GAAG,GAAG,aAAa,CAAC,WAAW,EAAE,CAAA;IAEzC,YAAsB,OAAuB;QACzC,MAAM,EACF,IAAI,GAAG,mBAAmB,UAAU,EAAE,EAAE,EACxC,IAAI,GAAG,UAAU,EAAE,EACnB,QAAQ,GAAG,UAAU,EAAE,EACvB,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,KAAK,GAAG,KAAK,GAChB,GAAG,OAAO,CAAA;QAEX,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAA;QAChB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;QACxB,IAAI,CAAC,YAAY,GAAG,YAAY,CAAA;QAChC,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC,MAAM,CAAA;QACvC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAA;QAClC,IAAI,CAAC,YAAY,GAAG,YAAY,CAAA;QAChC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;QAElB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAA;QACzC,IAAI,CAAC,0BAA0B,EAAE,CAAA;IACrC,CAAC;IAEM,MAAM,CAAC,MAAM,CAAC,OAAuB;QACxC,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,OAAO,CAAC,CAAA;IAC5C,CAAC;IAEO,gBAAgB;QACpB,OAAO,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC;YAC7B,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,aAAa,EAAE,IAAI,CAAC,gBAAgB;YACpC,YAAY,EAAE,IAAI,CAAC,YAAY;SAClC,CAAC,CAAA;IACN,CAAC;IAED,IAAY,gBAAgB;QACxB,OAAO,mBAAmB,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;IAClD,CAAC;IAEO,0BAA0B;QAC9B,IAAI,CAAC,GAAG,CAAC,0BAA0B,CAAC;YAChC,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,KAAa,EAAE,EAAE,CAAC,CAAC;gBAChD,KAAK;gBACL,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,IAAI,EAAE,IAAI,CAAC,IAAI;aAClB,CAAC,CAAC;SACN,CAAC,CAAA;IACN,CAAC;IAEM,OAAO;QACV,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC,CAAA;IAC/D,CAAC;CACJ"}
|
|
@@ -1,48 +1,91 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
static
|
|
1
|
+
import { handleLslError } from '@neurodevs/ndx-native';
|
|
2
|
+
import { freePointer } from 'ffi-rs';
|
|
3
|
+
export default class LslStreamInlet implements LslInlet {
|
|
4
|
+
static Class?: LslInletConstructor;
|
|
5
5
|
static waitAfterOpenStreamMs: number;
|
|
6
|
+
static lsl: import("@neurodevs/ndx-native").Liblsl;
|
|
7
|
+
static handleLslError: typeof handleLslError;
|
|
8
|
+
static freePointer: typeof freePointer;
|
|
9
|
+
isRunning: boolean;
|
|
6
10
|
private sourceId;
|
|
7
11
|
private chunkSize;
|
|
8
12
|
private maxBufferedMs;
|
|
9
13
|
private pullTimeoutMs;
|
|
10
14
|
private openStreamTimeoutMs;
|
|
11
|
-
private waitAfterOpenStreamMs;
|
|
12
15
|
private waitBetweenPullsMs;
|
|
13
16
|
private flushInletOnStop;
|
|
14
17
|
private onData;
|
|
15
|
-
private
|
|
16
|
-
private
|
|
18
|
+
private infoHandle;
|
|
19
|
+
private inletHandle;
|
|
20
|
+
private channelCount;
|
|
21
|
+
private pullMethod;
|
|
22
|
+
private sampleBuffer;
|
|
23
|
+
private sampleBufferRef;
|
|
24
|
+
private sampleBufferPtr;
|
|
25
|
+
private timestampBuffer;
|
|
26
|
+
private timestampBufferRef;
|
|
27
|
+
private timestampBufferPtr;
|
|
28
|
+
private pullErrorBuffer;
|
|
29
|
+
private pullErrorBufferRef;
|
|
30
|
+
private pullErrorBufferPtr;
|
|
31
|
+
private openStreamErrorBuffer;
|
|
32
|
+
private openStreamErrorBufferRef;
|
|
33
|
+
private openStreamErrorBufferPtr;
|
|
17
34
|
private readonly sixMinutesInMs;
|
|
18
35
|
private readonly aboutOneYearInMs;
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
36
|
+
private readonly bytesPerFloat;
|
|
37
|
+
private readonly bytesPerDouble;
|
|
38
|
+
private readonly bytesPerI32;
|
|
39
|
+
protected constructor(options: LslInletOptions, onData: OnDataCallback);
|
|
40
|
+
static Create(options: LslInletOptions, onData: OnDataCallback): Promise<LslInlet>;
|
|
23
41
|
startPulling(): Promise<void>;
|
|
24
|
-
private
|
|
25
|
-
private
|
|
26
|
-
|
|
42
|
+
private createInlet;
|
|
43
|
+
private resolveInfoHandle;
|
|
44
|
+
private resolveByProp;
|
|
45
|
+
private throwNoStreamFound;
|
|
46
|
+
private warnMultipleStreamsFound;
|
|
47
|
+
private doCreateInlet;
|
|
48
|
+
private getChannelCount;
|
|
49
|
+
private allocateWritableBuffers;
|
|
50
|
+
private allocateDataBuffer;
|
|
51
|
+
private allocateTimestampBuffer;
|
|
52
|
+
private allocatePullErrorBuffer;
|
|
53
|
+
private allocateOpenStreamErrorBuffer;
|
|
54
|
+
private setPullMethod;
|
|
55
|
+
private pullSample;
|
|
56
|
+
private doPullsample;
|
|
57
|
+
private readSamplesFromBuffer;
|
|
58
|
+
private pullChunk;
|
|
59
|
+
private doPullChunk;
|
|
60
|
+
private readTimestampsFromBuffer;
|
|
61
|
+
private openStream;
|
|
62
|
+
private pullLoop;
|
|
63
|
+
private pullDataOnce;
|
|
64
|
+
private handleLslErrorIfPresent;
|
|
65
|
+
private waitBetweenPulls;
|
|
27
66
|
flushInlet(): void;
|
|
67
|
+
stopPulling(): void;
|
|
68
|
+
private closeStream;
|
|
28
69
|
destroy(): void;
|
|
29
|
-
private
|
|
30
|
-
private
|
|
70
|
+
private doDestroyInlet;
|
|
71
|
+
private freeNativePointers;
|
|
72
|
+
private get lsl();
|
|
73
|
+
private get handleLslError();
|
|
74
|
+
private get freePointer();
|
|
31
75
|
}
|
|
32
|
-
export interface
|
|
76
|
+
export interface LslInlet {
|
|
33
77
|
startPulling(): Promise<void>;
|
|
34
78
|
stopPulling(): void;
|
|
35
79
|
flushInlet(): void;
|
|
36
80
|
destroy(): void;
|
|
37
81
|
readonly isRunning: boolean;
|
|
38
82
|
}
|
|
39
|
-
export type
|
|
40
|
-
export interface
|
|
83
|
+
export type LslInletConstructor = new (options: LslInletOptions, onData: OnDataCallback) => LslInlet;
|
|
84
|
+
export interface LslInletOptions {
|
|
41
85
|
sourceId: string;
|
|
42
86
|
chunkSize: number;
|
|
43
87
|
maxBufferedMs?: number;
|
|
44
88
|
openStreamTimeoutMs?: number;
|
|
45
|
-
waitAfterOpenStreamMs?: number;
|
|
46
89
|
pullTimeoutMs?: number;
|
|
47
90
|
waitBetweenPullsMs?: number;
|
|
48
91
|
flushInletOnStop?: boolean;
|