DataHub: Difference between revisions
Jump to navigation
Jump to search
Wiki-admin (talk | contribs) |
mNo edit summary |
||
| (40 intermediate revisions by 3 users not shown) | |||
| Line 1: | Line 1: | ||
{{Infobox software | {{Infobox software | ||
| name = | | name = Lab Streaming Layer | ||
| developer = Christian Kothe; Chadwick Boulay. | | developer = Christian Kothe; Chadwick Boulay. | ||
| status = -in development- | | status = -in development- | ||
| programming language = C, C++, Python, Java, C#, MATLAB | | programming language = C, C++, Python, Java, C#, MATLAB | ||
| operating system = Windows, Linux, MacOS, Android, iOS | | operating system = Windows, Linux, MacOS, Android, iOS | ||
| genre = Data collection | | genre = Data collection | ||
| license = Open source | | license = Open source | ||
| website = [https://labstreaminglayer.readthedocs.io/info/intro.html LSL webpage] | | website = [https://labstreaminglayer.readthedocs.io/info/intro.html LSL webpage] | ||
}} | |||
=== Resources === | |||
{{Infobox tsg | |||
| downloads = {{bulleted list | |||
| {{Surfdrive|https://surfdrive.surf.nl/s/GLSnbBaYsbEWjPX|Viewer & Streamer}} | |||
}} | }} | ||
| manuals = {{bulleted list | |||
| [https://labstreaminglayer.readthedocs.io/ Documentation] | |||
| [https://sccn.ucsd.edu/~mgrivich/LSL_Validation.html LSL Validation] | |||
| [https://labstreaminglayer.readthedocs.io/info/supported_devices.html Supported Devices and Tools] | |||
}} | |||
| templates = {{bulleted list | |||
| {{Surfdrive|https://surfdrive.surf.nl/s/gPenWNAqq8AXa7x|Example Scripts}} | |||
}} | }} | ||
}} | }} | ||
| Line 46: | Line 39: | ||
===Versions=== | ===Versions=== | ||
Pylsl version 1.16.2 is installed on our [[Lab Computer]]s. Open a command and type the following to find the version used: | |||
<code style="background-color:#000; color:#fff; padding:1px 3px;">c:>python</code><br/> | <code style="background-color:#000; color:#fff; padding:1px 3px;">c:>python</code><br/> | ||
| Line 53: | Line 46: | ||
==Usage== | ==Usage== | ||
''( | === Python === | ||
Example demonstrating how to send LSL stream and marker data: | |||
<syntaxhighlight lang="python" line> | |||
#!/usr/bin/env python3.10 | |||
# -*- coding: utf-8 -*- | |||
import time | |||
import random | |||
import keyboard | |||
from pylsl import StreamInfo, StreamOutlet | |||
from pylsl import local_clock | |||
# --- Setup Marker Stream --- | |||
print("Setting up marker stream...") | |||
marker_info = StreamInfo( | |||
name="MarkerStream", | |||
type="Markers", | |||
channel_count=1, | |||
nominal_srate=0, # Irregular sampling | |||
channel_format="string", | |||
source_id="MarkerSource" | |||
) | |||
marker_outlet = StreamOutlet(marker_info, chunk_size=1) | |||
# --- Setup Data Stream --- | |||
print("Setting up data stream...") | |||
data_info = StreamInfo( | |||
name="TestStream", | |||
type="TestData", | |||
channel_count=4, | |||
nominal_srate=100, | |||
channel_format="float32", | |||
source_id="TestStream_Source" | |||
) | |||
channels = data_info.desc().append_child("channels") | |||
for name in ["A", "B", "C", "D"]: | |||
chan = channels.append_child("channel") | |||
chan.append_child_value("name", name) | |||
chan.append_child_value("unit", "unitless") | |||
chan.append_child_value("type", "TestData") | |||
data_outlet = StreamOutlet(data_info, chunk_size=1) | |||
# --- Start Streaming --- | |||
print("Start streaming... Press 'q' to stop.") | |||
marker_outlet.push_sample(["Start"]) | |||
while not keyboard.is_pressed('q'): | |||
random_numbers = [random.randint(1, 2) for _ in range(4)] | |||
data_outlet.push_sample(random_numbers) | |||
time.sleep(0.01) | |||
marker_outlet.push_sample(["Stop"]) | |||
print("Streaming stopped.") | |||
</syntaxhighlight> | |||
=== Matlab === | |||
Please, read the instructions on the GitHub labstreaminglayer website (https://github.com/labstreaminglayer/liblsl-Matlab) on how to prepare Matlab to work with LSL. You can either use the latest release for your Matlab version, or if that doesn't workout well, build it from the source files. Make sure to add the liblsl-Matlab folder to your path recursively to make it available to your own scripts. | |||
A short example for sending lsl streaming data: | |||
<syntaxhighlight lang="matlab" line> | |||
%% instantiate the library | |||
disp('Loading library...'); | |||
lib = lsl_loadlib(); | |||
% make a new stream outlet | |||
disp('Creating a new streaminfo...'); | |||
info = lsl_streaminfo(lib,'BioSemi','EEG',8,100,'cf_float32','sdfwerr32432'); | |||
disp('Opening an outlet...'); | |||
outlet = lsl_outlet(info); | |||
% send data into the outlet, sample by sample | |||
disp('Now transmitting data...'); | |||
while true | |||
outlet.push_sample(randn(8,1)); | |||
pause(0.01); | |||
end | |||
</syntaxhighlight> | |||
A short example for receiving lsl streaming data: | |||
<syntaxhighlight lang="matlab" line> | |||
%% instantiate the library | |||
disp('Loading the library...'); | |||
lib = lsl_loadlib(); | |||
== | % resolve a stream... | ||
disp('Resolving an EEG stream...'); | |||
result = {}; | |||
while isempty(result) | |||
result = lsl_resolve_byprop(lib,'type','EEG'); end | |||
= | % create a new inlet | ||
disp('Opening an inlet...'); | |||
inlet = lsl_inlet(result{1}); | |||
= | disp('Now receiving data...'); | ||
while true | |||
% get data from the inlet | |||
[vec,ts] = inlet.pull_sample(); | |||
% and display it | |||
fprintf('%.2f\t',vec); | |||
fprintf('%.5f\n',ts); | |||
end</syntaxhighlight> | |||