DataHub: Difference between revisions

Jump to navigation Jump to search
No edit summary
mNo edit summary
 
(28 intermediate revisions by 3 users not shown)
Line 1: Line 1:
{{Infobox software
{{Infobox software
| name                  = DataHub
| name                  = Lab Streaming Layer
| logo                  =
| screenshot            =
| caption                =
| developer              = Christian Kothe; Chadwick Boulay.
| developer              = Christian Kothe; Chadwick Boulay.
| released              = <!-- {{Start date and age|YYYY|MM|DD|df=yes}} -->
| discontinued          =
| latest release version =
| latest release date    = <!-- {{Start date and age|YYYY|MM|DD|df=yes}} -->
| latest preview version =
| latest preview date    = <!-- {{Start date and age|YYYY|MM|DD|df=yes}} -->
| installed version      =
| installed version date = <!-- {{Start date and age|YYYY|MM|DD|df=yes}} -->
| 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
| platform              =
| size                  =
| language              =
| 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
 
    | child              = yes
=== Resources ===
    | downloads          = {{bulleted list
{{Infobox tsg
        | [https://docs.openbci.com/ Documentation]
  | downloads          = {{bulleted list
      | {{Surfdrive|https://surfdrive.surf.nl/s/GLSnbBaYsbEWjPX|Viewer & Streamer}}
     }}
     }}
    | manuals            = {{bulleted list
  | manuals            = {{bulleted list
        | [https://docs.openbci.com/ Documentation]
      | [https://labstreaminglayer.readthedocs.io/ Documentation]
    }}
      | [https://sccn.ucsd.edu/~mgrivich/LSL_Validation.html LSL Validation]
    | header2            = Templates
      | [https://labstreaminglayer.readthedocs.io/info/supported_devices.html Supported Devices and Tools]
    | data2              = *[https://surfdrive.surf.nl/files/index.php/s/LN5KRN9cB3mvPp3 Template 2017 (zip)]]
  }}
  | templates            = {{bulleted list
      | {{Surfdrive|https://surfdrive.surf.nl/s/gPenWNAqq8AXa7x|Example Scripts}}
   }}
   }}
}}
}}
Line 50: Line 39:


===Versions===
===Versions===
The TSG uses the version 1.15.0. Open a command and type the following to find the version used:
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 58: Line 47:
==Usage==
==Usage==
=== Python ===
=== Python ===
A short example for sending lsl streaming data:
Example demonstrating how to send LSL stream and marker data:
<syntaxhighlight lang="python" line>
<syntaxhighlight lang="python" line>
#!/usr/bin/env python
#!/usr/bin/env python3.10
# -*- coding: utf-8 -*-


import threading
import time
import random
import keyboard
from pylsl import StreamInfo, StreamOutlet
from pylsl import StreamInfo, StreamOutlet


def getData():
from pylsl import local_clock
     while running:
 
        buffer_in = getSensorData()
# --- Setup Marker Stream ---
        send_data = True
print("Setting up marker stream...")
        time.sleep(0.001)
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"
)


info = StreamInfo(
channels = data_info.desc().append_child("channels")
    name='MyStream',  
for name in ["A", "B", "C", "D"]:
     type='COP',
     chan = channels.append_child("channel")
     channel_count=4,  
     chan.append_child_value("name", name)
     nominal_srate = 200,  
     chan.append_child_value("unit", "unitless")
     source_id='BalanceBoard_stream'
     chan.append_child_value("type", "TestData")
    )
outlet = StreamOutlet(info)  


threading.Thread(target=getData).start()
data_outlet = StreamOutlet(data_info, chunk_size=1)
while running == True:
 
if send_data:
# --- Start Streaming ---
outlet.push_chunk(buffer_in)
print("Start streaming... Press 'q' to stop.")
send_data = False
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>
</syntaxhighlight>


A short example for receiving lsl data:
=== Matlab ===
<syntaxhighlight lang="python" line>
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.
#!/usr/bin/env python
 
A short example for sending lsl streaming data:
<syntaxhighlight lang="matlab" line>
%% instantiate the library
disp('Loading library...');
lib = lsl_loadlib();


from pylsl import StreamInlet, resolve_stream
% make a new stream outlet
disp('Creating a new streaminfo...');
info = lsl_streaminfo(lib,'BioSemi','EEG',8,100,'cf_float32','sdfwerr32432');


streams = resolve_stream('name', 'MyStream')
disp('Opening an outlet...');
#streams = resolve_streams()
outlet = lsl_outlet(info);


inlet = StreamInlet(streams[0])
% send data into the outlet, sample by sample
while True:
disp('Now transmitting data...');
     sample, timestamp = inlet.pull_sample()
while true
     print(timestamp, sample)
     outlet.push_sample(randn(8,1));
     pause(0.01);
end
</syntaxhighlight>
</syntaxhighlight>


==References==  
A short example for receiving lsl streaming data:
<references />
<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});


==External Links== <!-- Optional -->
disp('Now receiving data...');
*{{Official website|https://unity3d.com}}
while true
*[https://docs.unity3d.com/Manual/index.html Official Documentation]
    % get data from the inlet
    [vec,ts] = inlet.pull_sample();
    % and display it
    fprintf('%.2f\t',vec);
    fprintf('%.5f\n',ts);
end</syntaxhighlight>