User Tutorial:BCI2000Remote: Difference between revisions
No edit summary |
No edit summary |
||
| Line 18: | Line 18: | ||
<li> | <li> | ||
Find where in your Python code you wish to integrate BCI2000. In this example I will show the minimum requirements for integration with BCI2000: | Find where in your Python code you wish to integrate BCI2000. In this example I will show the minimum requirements for integration with BCI2000: | ||
< | <pre> | ||
import sys | import sys | ||
sys.path.append('C:\\BCI2000\\prog') | sys.path.append('C:\\BCI2000\\prog') | ||
| Line 33: | Line 33: | ||
bci.Execute('Wait for Connected') | bci.Execute('Wait for Connected') | ||
bci.SetConfig() | bci.SetConfig() | ||
</ | </pre> | ||
Here is how you import BCI2000Remote: | Here is how you import BCI2000Remote: | ||
[[File:BCIRemote.jpg]] | [[File:BCIRemote.jpg]] | ||
Revision as of 01:11, 11 October 2021
Description
BCI2000Remote is a proxy interface class to the BCI2000 Operator module, and allows to start up, configure, and control BCI2000 from other applications. Internally, it maintains a telnet connection to the Operator module, and sends Operator Scripting commands to control it. However, no knowledge of these scripting commands is required in order to use the BCI2000Remote class from your own application.
BCI2000Remote is most useful when writing applications in C++, or in another language for which bindings to the BCI2000RemoteLib library exist, such as Python, or MATLAB.
Note
BCI2000Remote is a means of interfacing with the BCI2000 Operator module meaning that there are potentially hundreds of ways we leverage this tool to have a meaningful interface with BCI2000. Because of this we will illustrate a few different integrations using different languages. This "How-to" will be separated into three separate sections: Python, C++, and Matlab.
Python Tutorial
- Find your Python folder. If you have an existing Python environment with your code find it using the Sys Library like this: import sys locate_python = sys.exec_prefix print(locate_python)
- Locate your BCI2000Remote.py file which should have compiled into your prog folder.
-
Find where in your Python code you wish to integrate BCI2000. In this example I will show the minimum requirements for integration with BCI2000:
import sys sys.path.append('C:\\BCI2000\\prog') import BCI2000Remote bci = BCI2000Remote.BCI2000Remote() //print('Operator path:', bci.OperatorPath) bci.WindowVisible = True bci.WindowTitle = 'Python controlled' bci.SubjectID = 'pysub' bci.Connect() bci.Execute('cd ${BCI2000LAUNCHDIR}') bci.Execute('ADD STATE score 16 0') bci.StartupModules(('SignalGenerator', 'DummySignalprocessing', 'DummyApplication')) bci.Execute('Wait for Connected') bci.SetConfig()Here is how you import BCI2000Remote: File:BCIRemote.jpg Here is how you instantiate the operator object: File:BCIRemote 2.jpg Here is how to customize the operator and connect to it: File:BCIRemote 3.jpg Here is how you add your states: File:BCIRemote 4.jpg How to specify your signal source, signal processing, and application modules: File:BCIRemote 5.jpg How to connect and issue commands to BCI2000: File:BCIRemote 6.jpg And finally, how to tell BCI2000 to set states to a value during runtime: File:BCIRemote 6.jpg
- Now that you've added those components to your code all you have to do is run your code. You should see the BCI2000 operator along with the system log, source watcher, and the timing window. File:BCIRemote 7.jpg
C++ Tutorial
#include "BCI2000Remote.h"
#include <string>
#include <vector>
#include <iostream>
int main( int argc, char* argv[] )
{
// Instantiate a BCI2000Remote object
BCI2000Remote bci;
// Assume that Operator executable resides in the same directory as this program.
std::string path = ( argc > 0 ) ? argv[0] : "";
size_t pos = path.find_last_of( "\\/" );
path = ( pos != std::string::npos ) ? path.substr( 0, pos + 1 ) : "";
// Start the Operator module, and connect
bci.OperatorPath( path + "Operator" );
if( !bci.Connect() )
{
std::cerr << bci.Result();
return -1;
}
// Startup modules
const char* modules[] = { "SignalGenerator --LogMouse=1", "ARSignalProcessing", "CursorTask" };
std::vector<std::string> vModules( &modules[0], &modules[0] + sizeof( modules ) / sizeof( *modules ) );
if( !bci.StartupModules( vModules ) )
{
std::cerr << bci.Result();
return -1;
}
// Load a parameter file, and set subject information
bci.LoadParametersRemote( "../parms/examples/CursorTask_SignalGenerator.prm" );
bci.SubjectID( "SUB" );
// Start a run
if( !bci.Start() )
{
std::cerr << bci.Result();
return -1;
}
// Print feedback signal
std::string state;
while( bci.GetSystemState( state ) && state == "Running" )
{
double value = 0;
bci.GetControlSignal( 1, 1, value );
std::cout << "Control signal: " << value << ", press Enter to proceed" << std::flush;
std::string line;
std::getline( std::cin, line );
}
return 0;
}
Video
Also see the PsychoPy page for more details on the installation process, APIs, and hooks.