@neurodevs/node-lsl 23.1.1 → 23.1.2
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__/impl/LslStreamInlet.test.d.ts +4 -5
- package/build/__tests__/impl/LslStreamInlet.test.js +37 -58
- package/build/__tests__/impl/LslStreamInlet.test.js.map +1 -1
- package/build/impl/LslStreamInlet.d.ts +9 -39
- package/build/impl/LslStreamInlet.js +23 -151
- package/build/impl/LslStreamInlet.js.map +1 -1
- package/build/impl/clocks/WindowedClockRegressor.d.ts +2 -2
- package/build/impl/clocks/WindowedClockRegressor.js.map +1 -1
- package/build/impl/controllers/BleGattController.d.ts +3 -3
- package/package.json +3 -4
- package/src/__tests__/impl/LslStreamInlet.test.ts +45 -86
- package/src/impl/LslStreamInlet.ts +38 -218
- package/src/impl/clocks/WindowedClockRegressor.ts +1 -1
- package/src/impl/controllers/BleGattController.ts +2 -2
|
@@ -4,16 +4,14 @@ import AbstractPackageTest from '../AbstractPackageTest.js';
|
|
|
4
4
|
export default class LslStreamInletTest extends AbstractPackageTest {
|
|
5
5
|
private static instance;
|
|
6
6
|
private static callsToOnData;
|
|
7
|
-
private static readonly sampleBufferPtr;
|
|
8
|
-
private static readonly timestampBufferPtr;
|
|
9
|
-
private static readonly errorCodePtr;
|
|
10
7
|
protected static beforeAll(): Promise<void>;
|
|
11
8
|
protected static beforeEach(): Promise<void>;
|
|
12
9
|
protected static createsInstance(): Promise<void>;
|
|
13
10
|
protected static callsBindingsToCreateStreamInlet(): Promise<void>;
|
|
14
11
|
protected static flushInletCallsLslBinding(): Promise<void>;
|
|
15
12
|
protected static destroyCallsLslBinding(): Promise<void>;
|
|
16
|
-
protected static
|
|
13
|
+
protected static destroyDoesNotDestroyInletThatWasNeverCreated(): Promise<void>;
|
|
14
|
+
protected static destroyingTwiceDestroysInletOnce(): Promise<void>;
|
|
17
15
|
protected static destroyCallsStopIfIsRunning(): Promise<void>;
|
|
18
16
|
protected static destroyDoesNotCallStopIfNotRunning(): Promise<void>;
|
|
19
17
|
protected static exposesIsRunningFieldThatIsFalseAtFirst(): Promise<void>;
|
|
@@ -29,7 +27,8 @@ export default class LslStreamInletTest extends AbstractPackageTest {
|
|
|
29
27
|
protected static callsOnDataForChunkSizeOne(): Promise<void>;
|
|
30
28
|
protected static callsPullSampleIfChunkSizeIsOne(): Promise<void>;
|
|
31
29
|
protected static callsPullChunkIfChunkSizeIsNotOne(): Promise<void>;
|
|
32
|
-
protected static
|
|
30
|
+
protected static passesEachPulledSampleToOnData(): Promise<void>;
|
|
31
|
+
protected static passesEachPulledChunkToOnData(): Promise<void>;
|
|
33
32
|
protected static waitsBetweenPullsIfPassedOption(): Promise<void>;
|
|
34
33
|
protected static waitsOneMillisecondBetweenPullsIfNotPassed(): Promise<void>;
|
|
35
34
|
protected static passesTimeoutMsOptionToPullSample(): Promise<void>;
|
|
@@ -6,24 +6,11 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
|
|
|
6
6
|
};
|
|
7
7
|
import { FakeLiblsl } from '@neurodevs/ndx-native';
|
|
8
8
|
import { test, assert } from '@neurodevs/node-tdd';
|
|
9
|
-
import { createPointer, DataType, PointerType, unwrapPointer, } from 'ffi-rs';
|
|
10
9
|
import LslStreamInlet from '../../impl/LslStreamInlet.js';
|
|
11
10
|
import AbstractPackageTest from '../AbstractPackageTest.js';
|
|
12
11
|
export default class LslStreamInletTest extends AbstractPackageTest {
|
|
13
12
|
static instance;
|
|
14
13
|
static callsToOnData;
|
|
15
|
-
static sampleBufferPtr = unwrapPointer(createPointer({
|
|
16
|
-
paramsType: [DataType.U8Array],
|
|
17
|
-
paramsValue: [new Float32Array(this.channelCount * this.chunkSize)],
|
|
18
|
-
}))[0];
|
|
19
|
-
static timestampBufferPtr = unwrapPointer(createPointer({
|
|
20
|
-
paramsType: [DataType.U8Array],
|
|
21
|
-
paramsValue: [new Float64Array(this.chunkSize)],
|
|
22
|
-
}))[0];
|
|
23
|
-
static errorCodePtr = unwrapPointer(createPointer({
|
|
24
|
-
paramsType: [DataType.U8Array],
|
|
25
|
-
paramsValue: [new Int32Array(1)],
|
|
26
|
-
}))[0];
|
|
27
14
|
static async beforeAll() {
|
|
28
15
|
assert.isEqual(LslStreamInlet.waitAfterOpenStreamMs, 100, 'Default waitAfterOpenStreamMs should be 100!');
|
|
29
16
|
}
|
|
@@ -34,7 +21,6 @@ export default class LslStreamInletTest extends AbstractPackageTest {
|
|
|
34
21
|
this.callsToOnData = [];
|
|
35
22
|
LslStreamInlet.waitAfterOpenStreamMs = 0;
|
|
36
23
|
LslStreamInlet.lsl = this.fakeLiblsl;
|
|
37
|
-
LslStreamInlet.freePointer = () => { };
|
|
38
24
|
this.instance = await this.LslStreamInlet();
|
|
39
25
|
}
|
|
40
26
|
static async createsInstance() {
|
|
@@ -46,6 +32,7 @@ export default class LslStreamInletTest extends AbstractPackageTest {
|
|
|
46
32
|
assert.isEqualDeep(this.fakeLiblsl.lastCreateInletOptions, {
|
|
47
33
|
infoHandle: this.inletHandle,
|
|
48
34
|
maxBufferedMs: this.maxBufferedMs,
|
|
35
|
+
chunkSize: this.chunkSize,
|
|
49
36
|
}, 'Should have called createInlet!');
|
|
50
37
|
this.stopPulling();
|
|
51
38
|
}
|
|
@@ -54,25 +41,21 @@ export default class LslStreamInletTest extends AbstractPackageTest {
|
|
|
54
41
|
assert.isEqualDeep(this.fakeLiblsl.lastFlushInletOptions, { inletHandle: this.inletHandle }, 'Should have called flushInlet!');
|
|
55
42
|
}
|
|
56
43
|
static async destroyCallsLslBinding() {
|
|
57
|
-
await this.
|
|
58
|
-
|
|
44
|
+
await this.startPulling();
|
|
45
|
+
const inletHandle = this.inletHandle;
|
|
46
|
+
this.destroy();
|
|
47
|
+
assert.isTrue(inletHandle !== undefined &&
|
|
48
|
+
this.fakeLiblsl.lastDestroyInletOptions?.inletHandle ===
|
|
49
|
+
inletHandle, 'Did not destroy inlet!');
|
|
59
50
|
}
|
|
60
|
-
static async
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
51
|
+
static async destroyDoesNotDestroyInletThatWasNeverCreated() {
|
|
52
|
+
this.destroy();
|
|
53
|
+
assert.isEqual(this.fakeLiblsl.destroyInletHitCount, 0, 'Should not have destroyed an inlet that was never created!');
|
|
54
|
+
}
|
|
55
|
+
static async destroyingTwiceDestroysInletOnce() {
|
|
65
56
|
await this.startPullingThenDestroy();
|
|
66
|
-
|
|
67
|
-
assert.
|
|
68
|
-
paramsType: [
|
|
69
|
-
DataType.U8Array,
|
|
70
|
-
DataType.U8Array,
|
|
71
|
-
DataType.U8Array,
|
|
72
|
-
DataType.U8Array,
|
|
73
|
-
],
|
|
74
|
-
pointerType: PointerType.CPointer,
|
|
75
|
-
}, 'Destroy did not free all pointers!');
|
|
57
|
+
this.destroy();
|
|
58
|
+
assert.isEqual(this.fakeLiblsl.destroyInletHitCount, 1, 'Should have destroyed inlet only once!');
|
|
76
59
|
}
|
|
77
60
|
static async destroyCallsStopIfIsRunning() {
|
|
78
61
|
await this.startPulling();
|
|
@@ -107,7 +90,6 @@ export default class LslStreamInletTest extends AbstractPackageTest {
|
|
|
107
90
|
assert.isEqualDeep(this.fakeLiblsl.lastOpenStreamOptions, {
|
|
108
91
|
inletHandle: this.inletHandle,
|
|
109
92
|
timeoutMs: aboutOneYearInMs,
|
|
110
|
-
errorCodePtr: this.errorCodePtr,
|
|
111
93
|
}, 'Did not open inlet stream!');
|
|
112
94
|
this.stopPulling();
|
|
113
95
|
}
|
|
@@ -120,7 +102,6 @@ export default class LslStreamInletTest extends AbstractPackageTest {
|
|
|
120
102
|
assert.isEqualDeep(this.fakeLiblsl.lastOpenStreamOptions, {
|
|
121
103
|
inletHandle: instance['inletHandle'],
|
|
122
104
|
timeoutMs: openStreamTimeoutMs,
|
|
123
|
-
errorCodePtr: this.errorCodePtr,
|
|
124
105
|
}, 'Did not open inlet stream with passed timeout!');
|
|
125
106
|
instance.stopPulling();
|
|
126
107
|
}
|
|
@@ -160,33 +141,25 @@ export default class LslStreamInletTest extends AbstractPackageTest {
|
|
|
160
141
|
}
|
|
161
142
|
static async callsPullSampleIfChunkSizeIsOne() {
|
|
162
143
|
await this.runChunkSizeOne();
|
|
163
|
-
assert.isEqualDeep(this.fakeLiblsl.lastPullSampleOptions, {
|
|
164
|
-
inletHandle: this.inletHandle,
|
|
165
|
-
sampleBufferPtr: this.sampleBufferPtr,
|
|
166
|
-
sampleBufferElements: this.channelCount,
|
|
167
|
-
timeoutMs: 0,
|
|
168
|
-
errorCodePtr: this.errorCodePtr,
|
|
169
|
-
}, 'Should have called pullSample!');
|
|
144
|
+
assert.isEqualDeep(this.fakeLiblsl.lastPullSampleOptions, { inletHandle: this.inletHandle, timeoutMs: 0 }, 'Should have called pullSample!');
|
|
170
145
|
}
|
|
171
146
|
static async callsPullChunkIfChunkSizeIsNotOne() {
|
|
172
147
|
await this.startThenStop();
|
|
173
|
-
assert.isEqualDeep(this.fakeLiblsl.lastPullChunkOptions, {
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
static async pushSampleHandlesErrorCode() {
|
|
184
|
-
let passedErrorCode;
|
|
185
|
-
LslStreamInlet.handleLslError = (errorCode) => {
|
|
186
|
-
passedErrorCode = errorCode;
|
|
187
|
-
};
|
|
148
|
+
assert.isEqualDeep(this.fakeLiblsl.lastPullChunkOptions, { inletHandle: this.inletHandle, timeoutMs: 0 }, 'Should have called pullChunk!');
|
|
149
|
+
}
|
|
150
|
+
static async passesEachPulledSampleToOnData() {
|
|
151
|
+
await this.runChunkSizeOne();
|
|
152
|
+
assert.isEqualDeep(this.callsToOnData, FakeLiblsl.fakeSamples.map((sample) => ({
|
|
153
|
+
samples: Array.from(sample),
|
|
154
|
+
timestamps: [FakeLiblsl.fakeSampleTimestampSec],
|
|
155
|
+
})), 'Did not pass each pulled sample to onData!');
|
|
156
|
+
}
|
|
157
|
+
static async passesEachPulledChunkToOnData() {
|
|
188
158
|
await this.startThenStop();
|
|
189
|
-
assert.isEqualDeep(
|
|
159
|
+
assert.isEqualDeep(this.callsToOnData, FakeLiblsl.fakeChunks.map((chunk, i) => ({
|
|
160
|
+
samples: Array.from(chunk),
|
|
161
|
+
timestamps: Array.from(FakeLiblsl.fakeTimestamps[i]),
|
|
162
|
+
})), 'Did not pass each pulled chunk to onData!');
|
|
190
163
|
}
|
|
191
164
|
static async waitsBetweenPullsIfPassedOption() {
|
|
192
165
|
const waitBetweenPullsMs = 10;
|
|
@@ -294,7 +267,10 @@ __decorate([
|
|
|
294
267
|
], LslStreamInletTest, "destroyCallsLslBinding", null);
|
|
295
268
|
__decorate([
|
|
296
269
|
test()
|
|
297
|
-
], LslStreamInletTest, "
|
|
270
|
+
], LslStreamInletTest, "destroyDoesNotDestroyInletThatWasNeverCreated", null);
|
|
271
|
+
__decorate([
|
|
272
|
+
test()
|
|
273
|
+
], LslStreamInletTest, "destroyingTwiceDestroysInletOnce", null);
|
|
298
274
|
__decorate([
|
|
299
275
|
test()
|
|
300
276
|
], LslStreamInletTest, "destroyCallsStopIfIsRunning", null);
|
|
@@ -342,7 +318,10 @@ __decorate([
|
|
|
342
318
|
], LslStreamInletTest, "callsPullChunkIfChunkSizeIsNotOne", null);
|
|
343
319
|
__decorate([
|
|
344
320
|
test()
|
|
345
|
-
], LslStreamInletTest, "
|
|
321
|
+
], LslStreamInletTest, "passesEachPulledSampleToOnData", null);
|
|
322
|
+
__decorate([
|
|
323
|
+
test()
|
|
324
|
+
], LslStreamInletTest, "passesEachPulledChunkToOnData", null);
|
|
346
325
|
__decorate([
|
|
347
326
|
test()
|
|
348
327
|
], LslStreamInletTest, "waitsBetweenPullsIfPassedOption", null);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LslStreamInlet.test.js","sourceRoot":"","sources":["../../../src/__tests__/impl/LslStreamInlet.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"LslStreamInlet.test.js","sourceRoot":"","sources":["../../../src/__tests__/impl/LslStreamInlet.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,7 @@
|
|
|
1
|
-
import { handleLslError } from '@neurodevs/ndx-native';
|
|
2
|
-
import { freePointer } from 'ffi-rs';
|
|
3
1
|
export default class LslStreamInlet implements LslInlet {
|
|
4
2
|
static Class?: LslInletConstructor;
|
|
5
3
|
static waitAfterOpenStreamMs: number;
|
|
6
4
|
static lsl: import("@neurodevs/ndx-native").Liblsl;
|
|
7
|
-
static handleLslError: typeof handleLslError;
|
|
8
|
-
static freePointer: typeof freePointer;
|
|
9
5
|
isRunning: boolean;
|
|
10
6
|
private sourceId;
|
|
11
7
|
private chunkSize;
|
|
@@ -16,26 +12,10 @@ export default class LslStreamInlet implements LslInlet {
|
|
|
16
12
|
private flushInletOnStop;
|
|
17
13
|
private onData;
|
|
18
14
|
private infoHandle;
|
|
19
|
-
private inletHandle
|
|
20
|
-
private channelCount;
|
|
15
|
+
private inletHandle?;
|
|
21
16
|
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;
|
|
34
17
|
private readonly sixMinutesInMs;
|
|
35
18
|
private readonly aboutOneYearInMs;
|
|
36
|
-
private readonly bytesPerFloat;
|
|
37
|
-
private readonly bytesPerDouble;
|
|
38
|
-
private readonly bytesPerI32;
|
|
39
19
|
protected constructor(options: LslInletOptions, onData: OnDataCallback);
|
|
40
20
|
static Create(options: LslInletOptions, onData: OnDataCallback): Promise<LslInlet>;
|
|
41
21
|
startPulling(): Promise<void>;
|
|
@@ -45,33 +25,19 @@ export default class LslStreamInlet implements LslInlet {
|
|
|
45
25
|
private throwNoStreamFound;
|
|
46
26
|
private warnMultipleStreamsFound;
|
|
47
27
|
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
28
|
private openStream;
|
|
62
29
|
private pullLoop;
|
|
63
30
|
private pullDataOnce;
|
|
64
|
-
private
|
|
31
|
+
private pullSample;
|
|
32
|
+
private pullChunk;
|
|
33
|
+
private get pullOptions();
|
|
65
34
|
private waitBetweenPulls;
|
|
66
35
|
flushInlet(): void;
|
|
67
36
|
stopPulling(): void;
|
|
68
37
|
private closeStream;
|
|
69
38
|
destroy(): void;
|
|
70
|
-
private
|
|
71
|
-
private freeNativePointers;
|
|
39
|
+
private destroyInletIfCreated;
|
|
72
40
|
private get lsl();
|
|
73
|
-
private get handleLslError();
|
|
74
|
-
private get freePointer();
|
|
75
41
|
}
|
|
76
42
|
export interface LslInlet {
|
|
77
43
|
startPulling(): Promise<void>;
|
|
@@ -90,4 +56,8 @@ export interface LslInletOptions {
|
|
|
90
56
|
waitBetweenPullsMs?: number;
|
|
91
57
|
flushInletOnStop?: boolean;
|
|
92
58
|
}
|
|
59
|
+
export interface PulledData {
|
|
60
|
+
samples: number[];
|
|
61
|
+
timestamps: number[];
|
|
62
|
+
}
|
|
93
63
|
export type OnDataCallback = (samples: number[], timestamps: number[]) => void;
|
|
@@ -1,11 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { unwrapPointer, createPointer, DataType, freePointer, PointerType, } from 'ffi-rs';
|
|
1
|
+
import { LiblslAdapter } from '@neurodevs/ndx-native';
|
|
3
2
|
export default class LslStreamInlet {
|
|
4
3
|
static Class;
|
|
5
4
|
static waitAfterOpenStreamMs = 100;
|
|
6
5
|
static lsl = LiblslAdapter.getInstance();
|
|
7
|
-
static handleLslError = handleLslError;
|
|
8
|
-
static freePointer = freePointer;
|
|
9
6
|
isRunning = false;
|
|
10
7
|
sourceId;
|
|
11
8
|
chunkSize;
|
|
@@ -17,25 +14,9 @@ export default class LslStreamInlet {
|
|
|
17
14
|
onData;
|
|
18
15
|
infoHandle;
|
|
19
16
|
inletHandle;
|
|
20
|
-
channelCount;
|
|
21
17
|
pullMethod;
|
|
22
|
-
sampleBuffer;
|
|
23
|
-
sampleBufferRef;
|
|
24
|
-
sampleBufferPtr;
|
|
25
|
-
timestampBuffer;
|
|
26
|
-
timestampBufferRef;
|
|
27
|
-
timestampBufferPtr;
|
|
28
|
-
pullErrorBuffer;
|
|
29
|
-
pullErrorBufferRef;
|
|
30
|
-
pullErrorBufferPtr;
|
|
31
|
-
openStreamErrorBuffer;
|
|
32
|
-
openStreamErrorBufferRef;
|
|
33
|
-
openStreamErrorBufferPtr;
|
|
34
18
|
sixMinutesInMs = 360 * 1000;
|
|
35
19
|
aboutOneYearInMs = 32000000 * 1000;
|
|
36
|
-
bytesPerFloat = 4;
|
|
37
|
-
bytesPerDouble = 8;
|
|
38
|
-
bytesPerI32 = 4;
|
|
39
20
|
constructor(options, onData) {
|
|
40
21
|
const { sourceId, chunkSize, maxBufferedMs, pullTimeoutMs, openStreamTimeoutMs, waitBetweenPullsMs, flushInletOnStop, } = options ?? {};
|
|
41
22
|
this.sourceId = sourceId;
|
|
@@ -46,6 +27,7 @@ export default class LslStreamInlet {
|
|
|
46
27
|
this.waitBetweenPullsMs = waitBetweenPullsMs ?? 1;
|
|
47
28
|
this.flushInletOnStop = flushInletOnStop ?? true;
|
|
48
29
|
this.onData = onData;
|
|
30
|
+
this.pullMethod = (chunkSize === 1 ? this.pullSample : this.pullChunk).bind(this);
|
|
49
31
|
}
|
|
50
32
|
static async Create(options, onData) {
|
|
51
33
|
return new (this.Class ?? this)(options, onData);
|
|
@@ -62,9 +44,6 @@ export default class LslStreamInlet {
|
|
|
62
44
|
async createInlet() {
|
|
63
45
|
this.infoHandle = this.resolveInfoHandle();
|
|
64
46
|
this.inletHandle = this.doCreateInlet();
|
|
65
|
-
this.channelCount = this.getChannelCount();
|
|
66
|
-
this.allocateWritableBuffers();
|
|
67
|
-
this.setPullMethod();
|
|
68
47
|
this.openStream();
|
|
69
48
|
}
|
|
70
49
|
resolveInfoHandle() {
|
|
@@ -93,106 +72,13 @@ export default class LslStreamInlet {
|
|
|
93
72
|
return this.lsl.createInlet({
|
|
94
73
|
infoHandle: this.infoHandle,
|
|
95
74
|
maxBufferedMs: this.maxBufferedMs,
|
|
75
|
+
chunkSize: this.chunkSize,
|
|
96
76
|
});
|
|
97
77
|
}
|
|
98
|
-
getChannelCount() {
|
|
99
|
-
return this.lsl.getChannelCount({ infoHandle: this.infoHandle });
|
|
100
|
-
}
|
|
101
|
-
allocateWritableBuffers() {
|
|
102
|
-
this.allocateDataBuffer();
|
|
103
|
-
this.allocateTimestampBuffer();
|
|
104
|
-
this.allocatePullErrorBuffer();
|
|
105
|
-
this.allocateOpenStreamErrorBuffer();
|
|
106
|
-
}
|
|
107
|
-
allocateDataBuffer() {
|
|
108
|
-
this.sampleBuffer = Buffer.alloc(this.channelCount * this.chunkSize * this.bytesPerFloat);
|
|
109
|
-
this.sampleBufferRef = createPointer({
|
|
110
|
-
paramsType: [DataType.U8Array],
|
|
111
|
-
paramsValue: [this.sampleBuffer],
|
|
112
|
-
});
|
|
113
|
-
this.sampleBufferPtr = unwrapPointer(this.sampleBufferRef)[0];
|
|
114
|
-
}
|
|
115
|
-
allocateTimestampBuffer() {
|
|
116
|
-
this.timestampBuffer = Buffer.alloc(this.chunkSize * this.bytesPerDouble);
|
|
117
|
-
this.timestampBufferRef = createPointer({
|
|
118
|
-
paramsType: [DataType.U8Array],
|
|
119
|
-
paramsValue: [this.timestampBuffer],
|
|
120
|
-
});
|
|
121
|
-
this.timestampBufferPtr = unwrapPointer(this.timestampBufferRef)[0];
|
|
122
|
-
}
|
|
123
|
-
allocatePullErrorBuffer() {
|
|
124
|
-
this.pullErrorBuffer = Buffer.alloc(this.bytesPerI32);
|
|
125
|
-
this.pullErrorBufferRef = createPointer({
|
|
126
|
-
paramsType: [DataType.U8Array],
|
|
127
|
-
paramsValue: [this.pullErrorBuffer],
|
|
128
|
-
});
|
|
129
|
-
this.pullErrorBufferPtr = unwrapPointer(this.pullErrorBufferRef)[0];
|
|
130
|
-
}
|
|
131
|
-
allocateOpenStreamErrorBuffer() {
|
|
132
|
-
this.openStreamErrorBuffer = Buffer.alloc(this.bytesPerI32);
|
|
133
|
-
this.openStreamErrorBufferRef = createPointer({
|
|
134
|
-
paramsType: [DataType.U8Array],
|
|
135
|
-
paramsValue: [this.openStreamErrorBuffer],
|
|
136
|
-
});
|
|
137
|
-
this.openStreamErrorBufferPtr = unwrapPointer(this.openStreamErrorBufferRef)[0];
|
|
138
|
-
}
|
|
139
|
-
setPullMethod() {
|
|
140
|
-
this.pullMethod =
|
|
141
|
-
this.chunkSize === 1 ? this.pullSample : this.pullChunk;
|
|
142
|
-
}
|
|
143
|
-
pullSample = () => {
|
|
144
|
-
const timestampSec = this.doPullsample();
|
|
145
|
-
if (timestampSec > 0) {
|
|
146
|
-
return {
|
|
147
|
-
samples: this.readSamplesFromBuffer(),
|
|
148
|
-
timestamps: [timestampSec],
|
|
149
|
-
};
|
|
150
|
-
}
|
|
151
|
-
return { samples: undefined, timestamps: undefined };
|
|
152
|
-
};
|
|
153
|
-
doPullsample() {
|
|
154
|
-
return this.lsl.pullSample({
|
|
155
|
-
inletHandle: this.inletHandle,
|
|
156
|
-
sampleBufferPtr: this.sampleBufferPtr,
|
|
157
|
-
sampleBufferElements: this.channelCount,
|
|
158
|
-
timeoutMs: this.pullTimeoutMs,
|
|
159
|
-
errorCodePtr: this.pullErrorBufferPtr,
|
|
160
|
-
});
|
|
161
|
-
}
|
|
162
|
-
readSamplesFromBuffer() {
|
|
163
|
-
const floats = new Float32Array(this.sampleBuffer.buffer, this.sampleBuffer.byteOffset, this.chunkSize * this.channelCount);
|
|
164
|
-
return Array.from(floats);
|
|
165
|
-
}
|
|
166
|
-
pullChunk = () => {
|
|
167
|
-
const firstTimestampSec = this.doPullChunk();
|
|
168
|
-
if (firstTimestampSec > 0) {
|
|
169
|
-
return {
|
|
170
|
-
samples: this.readSamplesFromBuffer(),
|
|
171
|
-
timestamps: this.readTimestampsFromBuffer(),
|
|
172
|
-
};
|
|
173
|
-
}
|
|
174
|
-
return { samples: undefined, timestamps: undefined };
|
|
175
|
-
};
|
|
176
|
-
doPullChunk() {
|
|
177
|
-
return this.lsl.pullChunk({
|
|
178
|
-
inletHandle: this.inletHandle,
|
|
179
|
-
sampleBufferPtr: this.sampleBufferPtr,
|
|
180
|
-
sampleBufferElements: this.chunkSize * this.channelCount,
|
|
181
|
-
timestampBufferPtr: this.timestampBufferPtr,
|
|
182
|
-
timestampBufferElements: this.chunkSize,
|
|
183
|
-
timeoutMs: this.pullTimeoutMs,
|
|
184
|
-
errorCodePtr: this.pullErrorBufferPtr,
|
|
185
|
-
});
|
|
186
|
-
}
|
|
187
|
-
readTimestampsFromBuffer() {
|
|
188
|
-
const doubles = new Float64Array(this.timestampBuffer.buffer, this.timestampBuffer.byteOffset, this.chunkSize);
|
|
189
|
-
return Array.from(doubles);
|
|
190
|
-
}
|
|
191
78
|
openStream() {
|
|
192
79
|
this.lsl.openStream({
|
|
193
80
|
inletHandle: this.inletHandle,
|
|
194
81
|
timeoutMs: this.openStreamTimeoutMs,
|
|
195
|
-
errorCodePtr: this.openStreamErrorBufferPtr,
|
|
196
82
|
});
|
|
197
83
|
}
|
|
198
84
|
async pullLoop() {
|
|
@@ -202,15 +88,22 @@ export default class LslStreamInlet {
|
|
|
202
88
|
}
|
|
203
89
|
}
|
|
204
90
|
async pullDataOnce() {
|
|
205
|
-
const
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
this.onData(samples, timestamps);
|
|
91
|
+
const pulled = this.pullMethod();
|
|
92
|
+
if (pulled) {
|
|
93
|
+
this.onData(pulled.samples, pulled.timestamps);
|
|
209
94
|
}
|
|
210
95
|
}
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
96
|
+
pullSample() {
|
|
97
|
+
return this.lsl.pullSample(this.pullOptions);
|
|
98
|
+
}
|
|
99
|
+
pullChunk() {
|
|
100
|
+
return this.lsl.pullChunk(this.pullOptions);
|
|
101
|
+
}
|
|
102
|
+
get pullOptions() {
|
|
103
|
+
return {
|
|
104
|
+
inletHandle: this.inletHandle,
|
|
105
|
+
timeoutMs: this.pullTimeoutMs,
|
|
106
|
+
};
|
|
214
107
|
}
|
|
215
108
|
async waitBetweenPulls() {
|
|
216
109
|
await new Promise((r) => setTimeout(r, this.waitBetweenPullsMs));
|
|
@@ -232,37 +125,16 @@ export default class LslStreamInlet {
|
|
|
232
125
|
if (this.isRunning) {
|
|
233
126
|
this.stopPulling();
|
|
234
127
|
}
|
|
235
|
-
this.
|
|
236
|
-
this.freeNativePointers();
|
|
237
|
-
}
|
|
238
|
-
doDestroyInlet() {
|
|
239
|
-
this.lsl.destroyInlet({ inletHandle: this.inletHandle });
|
|
128
|
+
this.destroyInletIfCreated();
|
|
240
129
|
}
|
|
241
|
-
|
|
242
|
-
this.
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
DataType.U8Array,
|
|
247
|
-
DataType.U8Array,
|
|
248
|
-
],
|
|
249
|
-
paramsValue: [
|
|
250
|
-
this.openStreamErrorBufferPtr,
|
|
251
|
-
this.sampleBufferPtr,
|
|
252
|
-
this.timestampBufferPtr,
|
|
253
|
-
this.pullErrorBufferPtr,
|
|
254
|
-
],
|
|
255
|
-
pointerType: PointerType.CPointer,
|
|
256
|
-
});
|
|
130
|
+
destroyInletIfCreated() {
|
|
131
|
+
if (this.inletHandle) {
|
|
132
|
+
this.lsl.destroyInlet({ inletHandle: this.inletHandle });
|
|
133
|
+
delete this.inletHandle;
|
|
134
|
+
}
|
|
257
135
|
}
|
|
258
136
|
get lsl() {
|
|
259
137
|
return LslStreamInlet.lsl;
|
|
260
138
|
}
|
|
261
|
-
get handleLslError() {
|
|
262
|
-
return LslStreamInlet.handleLslError;
|
|
263
|
-
}
|
|
264
|
-
get freePointer() {
|
|
265
|
-
return LslStreamInlet.freePointer;
|
|
266
|
-
}
|
|
267
139
|
}
|
|
268
140
|
//# sourceMappingURL=LslStreamInlet.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"LslStreamInlet.js","sourceRoot":"","sources":["../../src/impl/LslStreamInlet.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"LslStreamInlet.js","sourceRoot":"","sources":["../../src/impl/LslStreamInlet.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,8 +6,8 @@ export default class WindowedClockRegressor implements ClockRegressor {
|
|
|
6
6
|
private readonly history;
|
|
7
7
|
private slope;
|
|
8
8
|
protected constructor(nominalHz: number, options?: WindowedClockRegressorOptions);
|
|
9
|
-
static Create(nominalHz: number, options?: WindowedClockRegressorOptions):
|
|
10
|
-
deriveTimestamps(deviceTime: number, earliestLslTime: number, chunkSize: number):
|
|
9
|
+
static Create(nominalHz: number, options?: WindowedClockRegressorOptions): ClockRegressor;
|
|
10
|
+
deriveTimestamps(deviceTime: number, earliestLslTime: number, chunkSize: number): number[];
|
|
11
11
|
private anchorTimeFor;
|
|
12
12
|
private throwIfDeviceTimeDoesNotIncrease;
|
|
13
13
|
private pruneHistoryOutsideWindow;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WindowedClockRegressor.js","sourceRoot":"","sources":["../../../src/impl/clocks/WindowedClockRegressor.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,OAAO,sBAAsB;IAChC,MAAM,CAAC,KAAK,CAA4B;IAE9B,SAAS,CAAQ;IACjB,YAAY,CAAQ;IACpB,mBAAmB,GAAG,EAAE,CAAA;IACxB,OAAO,GAGlB,EAAE,CAAA;IAEA,KAAK,GAAG,CAAC,CAAA,CAAC,qCAAqC;IAEvD,YACI,SAAiB,EACjB,OAAuC;QAEvC,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC,mBAAmB,EAAE,GAAG,OAAO,IAAI,EAAE,CAAA;QAEjE,IAAI,CAAC,SAAS,GAAG,SAAS,CAAA;QAC1B,IAAI,CAAC,YAAY,GAAG,YAAY,CAAA;IACpC,CAAC;IAEM,MAAM,CAAC,MAAM,CAChB,SAAiB,EACjB,OAAuC;QAEvC,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;IACvD,CAAC;IAEM,gBAAgB,CACnB,UAAkB,EAClB,eAAuB,EACvB,SAAiB;QAEjB,IAAI,CAAC,gCAAgC,CAAC,UAAU,CAAC,CAAA;QAEjD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,eAAe,EAAE,CAAC,CAAA;QAClD,IAAI,CAAC,yBAAyB,EAAE,CAAA;QAChC,IAAI,CAAC,UAAU,EAAE,CAAA;QAEjB,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAA;QAE7C,MAAM,UAAU,
|
|
1
|
+
{"version":3,"file":"WindowedClockRegressor.js","sourceRoot":"","sources":["../../../src/impl/clocks/WindowedClockRegressor.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,7 +11,7 @@ export default class BleGattController implements BleGatt {
|
|
|
11
11
|
private onConnected?;
|
|
12
12
|
private readonly ndx;
|
|
13
13
|
protected constructor(options: BleGattOptions);
|
|
14
|
-
static Create(options: BleGattOptions):
|
|
14
|
+
static Create(options: BleGattOptions): BleGatt;
|
|
15
15
|
connect(): Promise<void>;
|
|
16
16
|
private discoverUuid;
|
|
17
17
|
private waitForDiscoveredUuid;
|
|
@@ -29,8 +29,8 @@ export default class BleGattController implements BleGatt {
|
|
|
29
29
|
private requireUuid;
|
|
30
30
|
}
|
|
31
31
|
export interface BleGatt {
|
|
32
|
-
uuid: string;
|
|
33
|
-
name: string;
|
|
32
|
+
readonly uuid: string;
|
|
33
|
+
readonly name: string;
|
|
34
34
|
connect(): Promise<void>;
|
|
35
35
|
subscribeCharacteristics(charCallbacks: CharacteristicCallbacks): Promise<void>;
|
|
36
36
|
writeCharacteristic(charUuid: CharacteristicUuid, value: string): Promise<void>;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@neurodevs/node-lsl",
|
|
3
|
-
"version": "23.1.
|
|
3
|
+
"version": "23.1.2",
|
|
4
4
|
"description": "Lab Streaming Layer (LSL) bindings for Node",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"keywords": [
|
|
@@ -42,12 +42,11 @@
|
|
|
42
42
|
},
|
|
43
43
|
"dependencies": {
|
|
44
44
|
"@neurodevs/generate-id": "^1.1.3",
|
|
45
|
-
"@neurodevs/ndx-native": "^
|
|
46
|
-
"ffi-rs": "^1.3.1",
|
|
45
|
+
"@neurodevs/ndx-native": "^10.0.0",
|
|
47
46
|
"ws": "^8.18.3"
|
|
48
47
|
},
|
|
49
48
|
"devDependencies": {
|
|
50
|
-
"@neurodevs/eslint-config-ndx": "2.0.
|
|
49
|
+
"@neurodevs/eslint-config-ndx": "2.0.3",
|
|
51
50
|
"@neurodevs/node-tdd": "^3.0.3",
|
|
52
51
|
"@neurodevs/prettier-config-ndx": "^1.0.2",
|
|
53
52
|
"@types/ws": "^8.18.1",
|
|
@@ -1,13 +1,5 @@
|
|
|
1
1
|
import { FakeLiblsl } from '@neurodevs/ndx-native'
|
|
2
2
|
import { test, assert } from '@neurodevs/node-tdd'
|
|
3
|
-
import {
|
|
4
|
-
createPointer,
|
|
5
|
-
DataType,
|
|
6
|
-
FieldType,
|
|
7
|
-
JsExternal,
|
|
8
|
-
PointerType,
|
|
9
|
-
unwrapPointer,
|
|
10
|
-
} from 'ffi-rs'
|
|
11
3
|
|
|
12
4
|
import LslStreamInlet, { LslInletOptions } from '../../impl/LslStreamInlet.js'
|
|
13
5
|
import SpyLslInlet from '../../testDoubles/LslInlet/SpyLslInlet.js'
|
|
@@ -21,27 +13,6 @@ export default class LslStreamInletTest extends AbstractPackageTest {
|
|
|
21
13
|
timestamps: number[]
|
|
22
14
|
}[]
|
|
23
15
|
|
|
24
|
-
private static readonly sampleBufferPtr = unwrapPointer(
|
|
25
|
-
createPointer({
|
|
26
|
-
paramsType: [DataType.U8Array],
|
|
27
|
-
paramsValue: [new Float32Array(this.channelCount * this.chunkSize)],
|
|
28
|
-
})
|
|
29
|
-
)[0]
|
|
30
|
-
|
|
31
|
-
private static readonly timestampBufferPtr = unwrapPointer(
|
|
32
|
-
createPointer({
|
|
33
|
-
paramsType: [DataType.U8Array],
|
|
34
|
-
paramsValue: [new Float64Array(this.chunkSize)],
|
|
35
|
-
})
|
|
36
|
-
)[0]
|
|
37
|
-
|
|
38
|
-
private static readonly errorCodePtr = unwrapPointer(
|
|
39
|
-
createPointer({
|
|
40
|
-
paramsType: [DataType.U8Array],
|
|
41
|
-
paramsValue: [new Int32Array(1)],
|
|
42
|
-
})
|
|
43
|
-
)[0]
|
|
44
|
-
|
|
45
16
|
protected static async beforeAll() {
|
|
46
17
|
assert.isEqual(
|
|
47
18
|
LslStreamInlet.waitAfterOpenStreamMs,
|
|
@@ -60,7 +31,6 @@ export default class LslStreamInletTest extends AbstractPackageTest {
|
|
|
60
31
|
|
|
61
32
|
LslStreamInlet.waitAfterOpenStreamMs = 0
|
|
62
33
|
LslStreamInlet.lsl = this.fakeLiblsl
|
|
63
|
-
LslStreamInlet.freePointer = () => {}
|
|
64
34
|
|
|
65
35
|
this.instance = await this.LslStreamInlet()
|
|
66
36
|
}
|
|
@@ -81,6 +51,7 @@ export default class LslStreamInletTest extends AbstractPackageTest {
|
|
|
81
51
|
{
|
|
82
52
|
infoHandle: this.inletHandle,
|
|
83
53
|
maxBufferedMs: this.maxBufferedMs,
|
|
54
|
+
chunkSize: this.chunkSize,
|
|
84
55
|
},
|
|
85
56
|
'Should have called createInlet!'
|
|
86
57
|
)
|
|
@@ -101,46 +72,39 @@ export default class LslStreamInletTest extends AbstractPackageTest {
|
|
|
101
72
|
|
|
102
73
|
@test()
|
|
103
74
|
protected static async destroyCallsLslBinding() {
|
|
104
|
-
await this.
|
|
75
|
+
await this.startPulling()
|
|
76
|
+
const inletHandle = this.inletHandle
|
|
105
77
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
78
|
+
this.destroy()
|
|
79
|
+
|
|
80
|
+
assert.isTrue(
|
|
81
|
+
inletHandle !== undefined &&
|
|
82
|
+
this.fakeLiblsl.lastDestroyInletOptions?.inletHandle ===
|
|
83
|
+
inletHandle,
|
|
109
84
|
'Did not destroy inlet!'
|
|
110
85
|
)
|
|
111
86
|
}
|
|
112
87
|
|
|
113
88
|
@test()
|
|
114
|
-
protected static async
|
|
115
|
-
|
|
116
|
-
paramsType: FieldType[]
|
|
117
|
-
paramsValue: JsExternal[]
|
|
118
|
-
pointerType: PointerType
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
let calls: FreePointerParams[] = []
|
|
89
|
+
protected static async destroyDoesNotDestroyInletThatWasNeverCreated() {
|
|
90
|
+
this.destroy()
|
|
122
91
|
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
92
|
+
assert.isEqual(
|
|
93
|
+
this.fakeLiblsl.destroyInletHitCount,
|
|
94
|
+
0,
|
|
95
|
+
'Should not have destroyed an inlet that was never created!'
|
|
96
|
+
)
|
|
97
|
+
}
|
|
126
98
|
|
|
99
|
+
@test()
|
|
100
|
+
protected static async destroyingTwiceDestroysInletOnce() {
|
|
127
101
|
await this.startPullingThenDestroy()
|
|
102
|
+
this.destroy()
|
|
128
103
|
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
{
|
|
134
|
-
paramsType: [
|
|
135
|
-
DataType.U8Array,
|
|
136
|
-
DataType.U8Array,
|
|
137
|
-
DataType.U8Array,
|
|
138
|
-
DataType.U8Array,
|
|
139
|
-
],
|
|
140
|
-
pointerType: PointerType.CPointer,
|
|
141
|
-
},
|
|
142
|
-
|
|
143
|
-
'Destroy did not free all pointers!'
|
|
104
|
+
assert.isEqual(
|
|
105
|
+
this.fakeLiblsl.destroyInletHitCount,
|
|
106
|
+
1,
|
|
107
|
+
'Should have destroyed inlet only once!'
|
|
144
108
|
)
|
|
145
109
|
}
|
|
146
110
|
|
|
@@ -207,7 +171,6 @@ export default class LslStreamInletTest extends AbstractPackageTest {
|
|
|
207
171
|
{
|
|
208
172
|
inletHandle: this.inletHandle,
|
|
209
173
|
timeoutMs: aboutOneYearInMs,
|
|
210
|
-
errorCodePtr: this.errorCodePtr,
|
|
211
174
|
},
|
|
212
175
|
'Did not open inlet stream!'
|
|
213
176
|
)
|
|
@@ -230,7 +193,6 @@ export default class LslStreamInletTest extends AbstractPackageTest {
|
|
|
230
193
|
{
|
|
231
194
|
inletHandle: instance['inletHandle'],
|
|
232
195
|
timeoutMs: openStreamTimeoutMs,
|
|
233
|
-
errorCodePtr: this.errorCodePtr,
|
|
234
196
|
},
|
|
235
197
|
'Did not open inlet stream with passed timeout!'
|
|
236
198
|
)
|
|
@@ -316,13 +278,7 @@ export default class LslStreamInletTest extends AbstractPackageTest {
|
|
|
316
278
|
|
|
317
279
|
assert.isEqualDeep(
|
|
318
280
|
this.fakeLiblsl.lastPullSampleOptions,
|
|
319
|
-
{
|
|
320
|
-
inletHandle: this.inletHandle,
|
|
321
|
-
sampleBufferPtr: this.sampleBufferPtr,
|
|
322
|
-
sampleBufferElements: this.channelCount,
|
|
323
|
-
timeoutMs: 0,
|
|
324
|
-
errorCodePtr: this.errorCodePtr,
|
|
325
|
-
},
|
|
281
|
+
{ inletHandle: this.inletHandle, timeoutMs: 0 },
|
|
326
282
|
'Should have called pullSample!'
|
|
327
283
|
)
|
|
328
284
|
}
|
|
@@ -333,33 +289,36 @@ export default class LslStreamInletTest extends AbstractPackageTest {
|
|
|
333
289
|
|
|
334
290
|
assert.isEqualDeep(
|
|
335
291
|
this.fakeLiblsl.lastPullChunkOptions,
|
|
336
|
-
{
|
|
337
|
-
inletHandle: this.inletHandle,
|
|
338
|
-
sampleBufferPtr: this.sampleBufferPtr,
|
|
339
|
-
timestampBufferPtr: this.timestampBufferPtr,
|
|
340
|
-
sampleBufferElements: this.chunkSize * this.channelCount,
|
|
341
|
-
timestampBufferElements: this.chunkSize,
|
|
342
|
-
timeoutMs: 0,
|
|
343
|
-
errorCodePtr: this.errorCodePtr,
|
|
344
|
-
},
|
|
292
|
+
{ inletHandle: this.inletHandle, timeoutMs: 0 },
|
|
345
293
|
'Should have called pullChunk!'
|
|
346
294
|
)
|
|
347
295
|
}
|
|
348
296
|
|
|
349
297
|
@test()
|
|
350
|
-
protected static async
|
|
351
|
-
|
|
298
|
+
protected static async passesEachPulledSampleToOnData() {
|
|
299
|
+
await this.runChunkSizeOne()
|
|
352
300
|
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
301
|
+
assert.isEqualDeep(
|
|
302
|
+
this.callsToOnData,
|
|
303
|
+
FakeLiblsl.fakeSamples.map((sample) => ({
|
|
304
|
+
samples: Array.from(sample),
|
|
305
|
+
timestamps: [FakeLiblsl.fakeSampleTimestampSec],
|
|
306
|
+
})),
|
|
307
|
+
'Did not pass each pulled sample to onData!'
|
|
308
|
+
)
|
|
309
|
+
}
|
|
356
310
|
|
|
311
|
+
@test()
|
|
312
|
+
protected static async passesEachPulledChunkToOnData() {
|
|
357
313
|
await this.startThenStop()
|
|
358
314
|
|
|
359
315
|
assert.isEqualDeep(
|
|
360
|
-
|
|
361
|
-
FakeLiblsl.
|
|
362
|
-
|
|
316
|
+
this.callsToOnData,
|
|
317
|
+
FakeLiblsl.fakeChunks.map((chunk, i) => ({
|
|
318
|
+
samples: Array.from(chunk),
|
|
319
|
+
timestamps: Array.from(FakeLiblsl.fakeTimestamps[i]),
|
|
320
|
+
})),
|
|
321
|
+
'Did not pass each pulled chunk to onData!'
|
|
363
322
|
)
|
|
364
323
|
}
|
|
365
324
|
|
|
@@ -1,24 +1,9 @@
|
|
|
1
|
-
import {
|
|
2
|
-
handleLslError,
|
|
3
|
-
InfoHandle,
|
|
4
|
-
InletHandle,
|
|
5
|
-
LiblslAdapter,
|
|
6
|
-
} from '@neurodevs/ndx-native'
|
|
7
|
-
import {
|
|
8
|
-
JsExternal,
|
|
9
|
-
unwrapPointer,
|
|
10
|
-
createPointer,
|
|
11
|
-
DataType,
|
|
12
|
-
freePointer,
|
|
13
|
-
PointerType,
|
|
14
|
-
} from 'ffi-rs'
|
|
1
|
+
import { InfoHandle, InletHandle, LiblslAdapter } from '@neurodevs/ndx-native'
|
|
15
2
|
|
|
16
3
|
export default class LslStreamInlet implements LslInlet {
|
|
17
4
|
public static Class?: LslInletConstructor
|
|
18
5
|
public static waitAfterOpenStreamMs = 100
|
|
19
6
|
public static lsl = LiblslAdapter.getInstance()
|
|
20
|
-
public static handleLslError = handleLslError
|
|
21
|
-
public static freePointer = freePointer
|
|
22
7
|
|
|
23
8
|
public isRunning = false
|
|
24
9
|
|
|
@@ -32,37 +17,12 @@ export default class LslStreamInlet implements LslInlet {
|
|
|
32
17
|
private onData: OnDataCallback
|
|
33
18
|
|
|
34
19
|
private infoHandle!: InfoHandle
|
|
35
|
-
private inletHandle
|
|
36
|
-
private
|
|
37
|
-
|
|
38
|
-
private pullMethod!: () => {
|
|
39
|
-
samples: number[] | undefined
|
|
40
|
-
timestamps: number[] | undefined
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
private sampleBuffer!: Buffer<ArrayBuffer>
|
|
44
|
-
private sampleBufferRef!: JsExternal[]
|
|
45
|
-
private sampleBufferPtr!: JsExternal
|
|
46
|
-
|
|
47
|
-
private timestampBuffer!: Buffer<ArrayBuffer>
|
|
48
|
-
private timestampBufferRef!: JsExternal[]
|
|
49
|
-
private timestampBufferPtr!: JsExternal
|
|
50
|
-
|
|
51
|
-
private pullErrorBuffer!: Buffer<ArrayBuffer>
|
|
52
|
-
private pullErrorBufferRef!: JsExternal[]
|
|
53
|
-
private pullErrorBufferPtr!: JsExternal
|
|
54
|
-
|
|
55
|
-
private openStreamErrorBuffer!: Buffer<ArrayBuffer>
|
|
56
|
-
private openStreamErrorBufferRef!: JsExternal[]
|
|
57
|
-
private openStreamErrorBufferPtr!: JsExternal
|
|
20
|
+
private inletHandle?: InletHandle
|
|
21
|
+
private pullMethod: () => PulledData | undefined
|
|
58
22
|
|
|
59
23
|
private readonly sixMinutesInMs = 360 * 1000
|
|
60
24
|
private readonly aboutOneYearInMs = 32000000 * 1000
|
|
61
25
|
|
|
62
|
-
private readonly bytesPerFloat = 4
|
|
63
|
-
private readonly bytesPerDouble = 8
|
|
64
|
-
private readonly bytesPerI32 = 4
|
|
65
|
-
|
|
66
26
|
protected constructor(options: LslInletOptions, onData: OnDataCallback) {
|
|
67
27
|
const {
|
|
68
28
|
sourceId,
|
|
@@ -82,6 +42,10 @@ export default class LslStreamInlet implements LslInlet {
|
|
|
82
42
|
this.waitBetweenPullsMs = waitBetweenPullsMs ?? 1
|
|
83
43
|
this.flushInletOnStop = flushInletOnStop ?? true
|
|
84
44
|
this.onData = onData
|
|
45
|
+
|
|
46
|
+
this.pullMethod = (
|
|
47
|
+
chunkSize === 1 ? this.pullSample : this.pullChunk
|
|
48
|
+
).bind(this)
|
|
85
49
|
}
|
|
86
50
|
|
|
87
51
|
public static async Create(
|
|
@@ -106,10 +70,6 @@ export default class LslStreamInlet implements LslInlet {
|
|
|
106
70
|
private async createInlet() {
|
|
107
71
|
this.infoHandle = this.resolveInfoHandle()
|
|
108
72
|
this.inletHandle = this.doCreateInlet()
|
|
109
|
-
this.channelCount = this.getChannelCount()
|
|
110
|
-
|
|
111
|
-
this.allocateWritableBuffers()
|
|
112
|
-
this.setPullMethod()
|
|
113
73
|
|
|
114
74
|
this.openStream()
|
|
115
75
|
}
|
|
@@ -146,144 +106,14 @@ export default class LslStreamInlet implements LslInlet {
|
|
|
146
106
|
return this.lsl.createInlet({
|
|
147
107
|
infoHandle: this.infoHandle,
|
|
148
108
|
maxBufferedMs: this.maxBufferedMs,
|
|
109
|
+
chunkSize: this.chunkSize,
|
|
149
110
|
})
|
|
150
111
|
}
|
|
151
112
|
|
|
152
|
-
private getChannelCount() {
|
|
153
|
-
return this.lsl.getChannelCount({ infoHandle: this.infoHandle })
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
private allocateWritableBuffers() {
|
|
157
|
-
this.allocateDataBuffer()
|
|
158
|
-
this.allocateTimestampBuffer()
|
|
159
|
-
this.allocatePullErrorBuffer()
|
|
160
|
-
this.allocateOpenStreamErrorBuffer()
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
private allocateDataBuffer() {
|
|
164
|
-
this.sampleBuffer = Buffer.alloc(
|
|
165
|
-
this.channelCount * this.chunkSize * this.bytesPerFloat
|
|
166
|
-
)
|
|
167
|
-
|
|
168
|
-
this.sampleBufferRef = createPointer({
|
|
169
|
-
paramsType: [DataType.U8Array],
|
|
170
|
-
paramsValue: [this.sampleBuffer],
|
|
171
|
-
})
|
|
172
|
-
|
|
173
|
-
this.sampleBufferPtr = unwrapPointer(this.sampleBufferRef)[0]
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
private allocateTimestampBuffer() {
|
|
177
|
-
this.timestampBuffer = Buffer.alloc(
|
|
178
|
-
this.chunkSize * this.bytesPerDouble
|
|
179
|
-
)
|
|
180
|
-
|
|
181
|
-
this.timestampBufferRef = createPointer({
|
|
182
|
-
paramsType: [DataType.U8Array],
|
|
183
|
-
paramsValue: [this.timestampBuffer],
|
|
184
|
-
})
|
|
185
|
-
|
|
186
|
-
this.timestampBufferPtr = unwrapPointer(this.timestampBufferRef)[0]
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
private allocatePullErrorBuffer() {
|
|
190
|
-
this.pullErrorBuffer = Buffer.alloc(this.bytesPerI32)
|
|
191
|
-
|
|
192
|
-
this.pullErrorBufferRef = createPointer({
|
|
193
|
-
paramsType: [DataType.U8Array],
|
|
194
|
-
paramsValue: [this.pullErrorBuffer],
|
|
195
|
-
})
|
|
196
|
-
|
|
197
|
-
this.pullErrorBufferPtr = unwrapPointer(this.pullErrorBufferRef)[0]
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
private allocateOpenStreamErrorBuffer() {
|
|
201
|
-
this.openStreamErrorBuffer = Buffer.alloc(this.bytesPerI32)
|
|
202
|
-
|
|
203
|
-
this.openStreamErrorBufferRef = createPointer({
|
|
204
|
-
paramsType: [DataType.U8Array],
|
|
205
|
-
paramsValue: [this.openStreamErrorBuffer],
|
|
206
|
-
})
|
|
207
|
-
|
|
208
|
-
this.openStreamErrorBufferPtr = unwrapPointer(
|
|
209
|
-
this.openStreamErrorBufferRef
|
|
210
|
-
)[0]
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
private setPullMethod() {
|
|
214
|
-
this.pullMethod =
|
|
215
|
-
this.chunkSize === 1 ? this.pullSample : this.pullChunk
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
private pullSample = () => {
|
|
219
|
-
const timestampSec = this.doPullsample()
|
|
220
|
-
|
|
221
|
-
if (timestampSec > 0) {
|
|
222
|
-
return {
|
|
223
|
-
samples: this.readSamplesFromBuffer(),
|
|
224
|
-
timestamps: [timestampSec],
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
return { samples: undefined, timestamps: undefined }
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
private doPullsample() {
|
|
231
|
-
return this.lsl.pullSample({
|
|
232
|
-
inletHandle: this.inletHandle,
|
|
233
|
-
sampleBufferPtr: this.sampleBufferPtr,
|
|
234
|
-
sampleBufferElements: this.channelCount,
|
|
235
|
-
timeoutMs: this.pullTimeoutMs,
|
|
236
|
-
errorCodePtr: this.pullErrorBufferPtr,
|
|
237
|
-
})
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
private readSamplesFromBuffer() {
|
|
241
|
-
const floats = new Float32Array(
|
|
242
|
-
this.sampleBuffer.buffer,
|
|
243
|
-
this.sampleBuffer.byteOffset,
|
|
244
|
-
this.chunkSize * this.channelCount
|
|
245
|
-
)
|
|
246
|
-
return Array.from(floats)
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
private pullChunk = () => {
|
|
250
|
-
const firstTimestampSec = this.doPullChunk()
|
|
251
|
-
|
|
252
|
-
if (firstTimestampSec > 0) {
|
|
253
|
-
return {
|
|
254
|
-
samples: this.readSamplesFromBuffer(),
|
|
255
|
-
timestamps: this.readTimestampsFromBuffer(),
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
return { samples: undefined, timestamps: undefined }
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
private doPullChunk() {
|
|
262
|
-
return this.lsl.pullChunk({
|
|
263
|
-
inletHandle: this.inletHandle,
|
|
264
|
-
sampleBufferPtr: this.sampleBufferPtr,
|
|
265
|
-
sampleBufferElements: this.chunkSize * this.channelCount,
|
|
266
|
-
timestampBufferPtr: this.timestampBufferPtr,
|
|
267
|
-
timestampBufferElements: this.chunkSize,
|
|
268
|
-
timeoutMs: this.pullTimeoutMs,
|
|
269
|
-
errorCodePtr: this.pullErrorBufferPtr,
|
|
270
|
-
})
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
private readTimestampsFromBuffer() {
|
|
274
|
-
const doubles = new Float64Array(
|
|
275
|
-
this.timestampBuffer.buffer,
|
|
276
|
-
this.timestampBuffer.byteOffset,
|
|
277
|
-
this.chunkSize
|
|
278
|
-
)
|
|
279
|
-
return Array.from(doubles)
|
|
280
|
-
}
|
|
281
|
-
|
|
282
113
|
private openStream() {
|
|
283
114
|
this.lsl.openStream({
|
|
284
|
-
inletHandle: this.inletHandle
|
|
115
|
+
inletHandle: this.inletHandle!,
|
|
285
116
|
timeoutMs: this.openStreamTimeoutMs,
|
|
286
|
-
errorCodePtr: this.openStreamErrorBufferPtr,
|
|
287
117
|
})
|
|
288
118
|
}
|
|
289
119
|
|
|
@@ -295,17 +125,26 @@ export default class LslStreamInlet implements LslInlet {
|
|
|
295
125
|
}
|
|
296
126
|
|
|
297
127
|
private async pullDataOnce() {
|
|
298
|
-
const
|
|
299
|
-
this.handleLslErrorIfPresent()
|
|
128
|
+
const pulled = this.pullMethod()
|
|
300
129
|
|
|
301
|
-
if (
|
|
302
|
-
this.onData(samples, timestamps)
|
|
130
|
+
if (pulled) {
|
|
131
|
+
this.onData(pulled.samples, pulled.timestamps)
|
|
303
132
|
}
|
|
304
133
|
}
|
|
305
134
|
|
|
306
|
-
private
|
|
307
|
-
|
|
308
|
-
|
|
135
|
+
private pullSample() {
|
|
136
|
+
return this.lsl.pullSample(this.pullOptions)
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
private pullChunk() {
|
|
140
|
+
return this.lsl.pullChunk(this.pullOptions)
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
private get pullOptions() {
|
|
144
|
+
return {
|
|
145
|
+
inletHandle: this.inletHandle!,
|
|
146
|
+
timeoutMs: this.pullTimeoutMs,
|
|
147
|
+
}
|
|
309
148
|
}
|
|
310
149
|
|
|
311
150
|
private async waitBetweenPulls() {
|
|
@@ -313,7 +152,7 @@ export default class LslStreamInlet implements LslInlet {
|
|
|
313
152
|
}
|
|
314
153
|
|
|
315
154
|
public flushInlet() {
|
|
316
|
-
this.lsl.flushInlet({ inletHandle: this.inletHandle })
|
|
155
|
+
this.lsl.flushInlet({ inletHandle: this.inletHandle! })
|
|
317
156
|
}
|
|
318
157
|
|
|
319
158
|
public stopPulling() {
|
|
@@ -326,7 +165,7 @@ export default class LslStreamInlet implements LslInlet {
|
|
|
326
165
|
}
|
|
327
166
|
|
|
328
167
|
private closeStream() {
|
|
329
|
-
this.lsl.closeStream({ inletHandle: this.inletHandle })
|
|
168
|
+
this.lsl.closeStream({ inletHandle: this.inletHandle! })
|
|
330
169
|
}
|
|
331
170
|
|
|
332
171
|
public destroy() {
|
|
@@ -334,43 +173,19 @@ export default class LslStreamInlet implements LslInlet {
|
|
|
334
173
|
this.stopPulling()
|
|
335
174
|
}
|
|
336
175
|
|
|
337
|
-
this.
|
|
338
|
-
this.freeNativePointers()
|
|
339
|
-
}
|
|
340
|
-
|
|
341
|
-
private doDestroyInlet() {
|
|
342
|
-
this.lsl.destroyInlet({ inletHandle: this.inletHandle })
|
|
176
|
+
this.destroyInletIfCreated()
|
|
343
177
|
}
|
|
344
178
|
|
|
345
|
-
private
|
|
346
|
-
this.
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
DataType.U8Array,
|
|
351
|
-
DataType.U8Array,
|
|
352
|
-
],
|
|
353
|
-
paramsValue: [
|
|
354
|
-
this.openStreamErrorBufferPtr,
|
|
355
|
-
this.sampleBufferPtr,
|
|
356
|
-
this.timestampBufferPtr,
|
|
357
|
-
this.pullErrorBufferPtr,
|
|
358
|
-
],
|
|
359
|
-
pointerType: PointerType.CPointer,
|
|
360
|
-
})
|
|
179
|
+
private destroyInletIfCreated() {
|
|
180
|
+
if (this.inletHandle) {
|
|
181
|
+
this.lsl.destroyInlet({ inletHandle: this.inletHandle })
|
|
182
|
+
delete this.inletHandle
|
|
183
|
+
}
|
|
361
184
|
}
|
|
362
185
|
|
|
363
186
|
private get lsl() {
|
|
364
187
|
return LslStreamInlet.lsl
|
|
365
188
|
}
|
|
366
|
-
|
|
367
|
-
private get handleLslError() {
|
|
368
|
-
return LslStreamInlet.handleLslError
|
|
369
|
-
}
|
|
370
|
-
|
|
371
|
-
private get freePointer() {
|
|
372
|
-
return LslStreamInlet.freePointer
|
|
373
|
-
}
|
|
374
189
|
}
|
|
375
190
|
|
|
376
191
|
export interface LslInlet {
|
|
@@ -396,4 +211,9 @@ export interface LslInletOptions {
|
|
|
396
211
|
flushInletOnStop?: boolean
|
|
397
212
|
}
|
|
398
213
|
|
|
214
|
+
export interface PulledData {
|
|
215
|
+
samples: number[]
|
|
216
|
+
timestamps: number[]
|
|
217
|
+
}
|
|
218
|
+
|
|
399
219
|
export type OnDataCallback = (samples: number[], timestamps: number[]) => void
|
|
@@ -41,7 +41,7 @@ export default class WindowedClockRegressor implements ClockRegressor {
|
|
|
41
41
|
|
|
42
42
|
const anchor = this.anchorTimeFor(deviceTime)
|
|
43
43
|
|
|
44
|
-
const timestamps = Array(chunkSize).fill(0)
|
|
44
|
+
const timestamps: number[] = Array(chunkSize).fill(0)
|
|
45
45
|
|
|
46
46
|
for (let i = 0; i <= chunkSize - 1; i++) {
|
|
47
47
|
const stepsFromLast = chunkSize - 1 - i
|