User Reference:SignalSharing: Difference between revisions
| Line 21: | Line 21: | ||
==Client Examples== | ==Client Examples== | ||
* An example for a ''SignalSharing'' client application in C++: [[Programming_Reference:SignalSharingDemoClient C%2B%2B App| | * An example for a ''SignalSharing'' client application in C++: [[Programming_Reference:SignalSharingDemoClient C%2B%2B App|SignalSharingDemoClient C++ App]] | ||
* An example for a ''SignalSharing'' client application in Python: [[Programming_Reference:SignalSharing_Python_Demo|SignalSharing Python Demo]] | * An example for a ''SignalSharing'' client application in Python: [[Programming_Reference:SignalSharing_Python_Demo|SignalSharing Python Demo]] | ||
Revision as of 14:21, 2 August 2024
Synopsis
SignalSharing allows to tap into BCI2000 processing by receiving any filter output signal through a combination of a TCP connection, and shared memory.
Function
The SignalSharing component in BCI2000 shares its input signal through a GenericSignal object which has been linked to a shared memory block using GenericSignal::ShareAcrossModules(). A dedicated thread waits for signal updates, and sends signal data out to a separate application waiting on a TCP/IP connection.
When the client application is running on a separate machine, full signal data are sent over the network. When the client is running on the same machine, only a reference to a shared memory block is sent. On the client side, a flag in the signal data block indicates whether full signal data is transmitted, or just the name of a shared memory block to which the client may connect in order to read data.
To facilitate consistency with the BCI2000 model of operation, SignalSharing is operating as a TCP client rather than a server. When BCI2000 goes into Initialization state, the client tries to connect to a TCP server that will receive the data. This will appear confusing at first because the client application needs to act as a server, but it is more flexible as the BCI2000 SignalSharing component may open and close connections, and send data, as it fits the current BCI2000 state of operation.
Data Transmission
Immediately after opening the connection, SignalSharing sends a SignalProperties message to announce meta-information about the filter's output signal, such as channel names, physical units, etc.
Subsequently, signal data are sent whenever a signal leaves the filter for which SignalSharing is enabled.
Configuration
Similar to visualizations, the system creates a parameter for each active filter, and places it under the SignalSharing tab in the Operator's config dialog (or multiple SignalSharing tabs in more complex signal processing configurations).
By default, these parameters are empty strings; to activate SignalSharing for a certain filter, set the parameter Share<FilterName> to an ip address and port to connect to, e.g.
localhost:1879
Client Examples
- An example for a SignalSharing client application in C++: SignalSharingDemoClient C++ App
- An example for a SignalSharing client application in Python: SignalSharing Python Demo
See also
Technical Reference:BCI2000 Messages, User Tutorial:BCI2000Remote, Programming Reference:GenericSignal Class, Programming Reference:SignalSharingDemoClient C++ App, SignalSharing Python Demo