diff --git a/CHANGELOG.txt b/CHANGELOG.txt deleted file mode 100644 index 9dc3238..0000000 --- a/CHANGELOG.txt +++ /dev/null @@ -1,65 +0,0 @@ --->TODO: -Interface Box erstellen(UDP,Serial,(BT),...) - -Offline Test - -Online Test - -06.05.2022: --->ui files für unterschiedliche Anzahl von Tactilos erstellt (p300-tactile-2.ui, p300-tactile-3.ui, ...) --->Lua files der szenarios angepasst, um die Variation der Tactiloanzahl zu ermöglichen --->arduino Firmware auf zehn mögliche Tactilos erweitert --->arduino Firmware ports angepasst (nutzung der PWM-fähigen ports) - -02.05.2022: --->FindThirdPartyBoost_System aus Cmakelist.txt entfernt (entfaellt mit OpenViBE3.3) --->Szenarios angepasst (einige Boxen wurden mit OpenViBE3.3 ueberarbeitet) --->UDPSender, TactileVisualization und TactiloStimulator Boxen erweitert um die Möglichkeit die Anzahl der Tactilos des Systems einzustellen - -28.02.2022: --->Box für die Ansteuerung der Tactilos über die Lattepanda GPIOs hinzugefügt - -11.02.2022: -Änderungen am TactileBCI SourceCode: --->neue Box P300 Tactile Visualization für die Organisation von Menüs/Submenüs des Tactilen BCIs erstellt(Basierend auf der P300 Speller Visualization) - --->Das LogLevel der Nachrichten in der UDPStimCodeSender Box auf Debug gesetzt um nicht standardmäßig die große Menge an Nachrichten anzuzeigen - -Änderungen an den Szenarios: --->In 1-Acquisition und 4-Online P300 Speller Visualization durch die neue Box P300 Tactile Visualization ersetzt - -Änderungen in OV_TACTILE.conf: --->Schriftgröße von Target, Flash und Selected angepasst - - - -05.02.2022: --->die verschiedenen repositories zu einem zusammengefasst - - - -29.01.2022: -Änderungen an den Szenarios: -1.Szenario Acquisition: --->Die Filterung des Signals erfolgt jetzt hier, statt in den Szenarien für die filterkonfiguration --->In der UI des Szenarios gibt es jetzt einen zweiten reiter zur anzeige des EEG-Signals - -2.Szenario Train xDAWN: --->Das aufgezeichnete signal ist jetzt bereits gefiltert, dementsprechend entfällt die filterung hier - -3.Szenario Train p300-classifier: --->Das aufgezeichnete signal ist jetzt bereits gefiltert, dementsprechend entfällt die filterung hier - -4.Szenario Online: --->Analog zu acquisition wird auch hier das gefilterte signal aufgezeichnet und nicht mehr das ungefilterte --->Auch hier lässt sich jetzt in einem zusätzlichen Reiter das EEG Signal anzeigen - -Änderungen an Scripts: -p300-tactile-stimulator.lua: --->Da die Box derzeit keinen Input hat, wurde eine Zeile entfernt, welche die letzten erhaltenen daten löscht - -Änderungen an der UDPSender Box: --->Die weitergabe der Daten am boxoutput wurde verändert, um ein timingproblem zu beheben - -Änderungen im OpenVibe Sourcecode: -\meta\sdk\plugins\processing\signal-processing\src\box-algorithms\ovpCBoxAlgorithmXDAWNTrainer.cpp: --->Z.338-339 geändert, damit die cfg mit gültigen werten gefüllt wird: fprintf(file, "\t%u\n", (unsigned int)m_filterDim); - fprintf(file, "\t%u\n", (unsigned int)nChannel); - diff --git a/CMakeLists.txt b/CMakeLists.txt deleted file mode 100644 index 4a4d440..0000000 --- a/CMakeLists.txt +++ /dev/null @@ -1,46 +0,0 @@ -if(OV_DISABLE_GTK) - message(STATUS "Skipping Plugins: Simple Visualization, no GTK") - return() -endif(OV_DISABLE_GTK) - -project(openvibe-plugins-tactile-bci VERSION ${OPENVIBE_MAJOR_VERSION}.${OPENVIBE_MINOR_VERSION}.${OPENVIBE_PATCH_VERSION}) - -file(GLOB_RECURSE SRC_FILES src/*.cpp src/*.h src/*.inl) - -add_library(${PROJECT_NAME} SHARED ${SRC_FILES}) - -target_link_libraries(${PROJECT_NAME} - openvibe - openvibe-common - openvibe-toolkit - openvibe-module-ebml - openvibe-module-system - openvibe-visualization-toolkit -) - -set_target_properties(${PROJECT_NAME} PROPERTIES - VERSION ${PROJECT_VERSION} - SOVERSION ${PROJECT_VERSION_MAJOR} - FOLDER ${PLUGINS_FOLDER} - COMPILE_FLAGS "-DOVP_Exports -DOVP_Shared") - -add_definitions(-DTARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines) -add_definitions(-DBOOST_DATE_TIME_NO_LIB) -if(WIN32) - add_definitions(-D_WIN32_WINNT=0x0501) -endif(WIN32) - -include("FindOpenViBEModuleTCPTagging") -include("FindThirdPartyGTK") -# need boost for UDPStimcodeSender and TactileStimulation -include("FindThirdPartyBoost") - -# ----------------------------- -# Install files -# ----------------------------- -install(TARGETS ${PROJECT_NAME} - RUNTIME DESTINATION ${DIST_BINDIR} - LIBRARY DESTINATION ${DIST_LIBDIR} - ARCHIVE DESTINATION ${DIST_LIBDIR}) - -install(DIRECTORY scenarios/ DESTINATION ${DIST_DATADIR}/openvibe/thn_bci/scenarios) diff --git a/README.md b/README.md index 4c3aed2..8ec1f05 100644 --- a/README.md +++ b/README.md @@ -1,24 +1 @@ -# TactileBCI - - -Enthält alle für das Taktile BCI der THN benötigten Box-Codes und Designer-Szenarien, sowie eine Anleitung zu deren Verwendung (s. TactileBCI/scenarios/manuals/). - -Bei diesem taktilen BCI der THN, haben wir ein Hauptmenü mit 6 Elementen wovon 4 in untermenüs führen und die anderen 2 die antwortmöglichkeiten ja/nein darstellen. - -Dabei wird jeder Menüpunkt von einem kleinen Vibrationsmotor ("Tactilo") repräsentiert. - -Die Tactilos werden, über eine festgelegte Anzahl von Wiederholungen und Trials, in zufälliger Reihenfolge angesteuert um so sensorisch ein P300-Signal zu erzeugen. - -Mit dieser vorgehensweise soll es möglich gemacht werden durch die Menüs der UI zu navigieren. - ---------------------------------------------------------------------------------------------------------------------------------------------------------------- - -Verwendung: - -**WICHTIG:** Das Plugin ist fuer die Verwendung mit OpenViBE 3.3 gemacht - -1) git clone https://git.efi.th-nuernberg.de/gitea/baumannto57992/TactileBCI/ - -2) das erstellte verzeichniss "TactileBCI" nach /meta/extras/plugins/processing/ kopieren - -3) Danach OpenViBE kompilieren +Hier angepassten OpenVIbe Porgrammcode für das visuelle BCI und eine entsprechende Readme einfügen diff --git a/arduino/README.md b/arduino/README.md deleted file mode 100644 index e0b0ddb..0000000 --- a/arduino/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# TactiloControllerPanda -Dieses Programm empfaengt Daten von der Korrespondierenden OpenViBE Box ueber eine serielle Schnittstelle.
-Auf Basis der erhaltenen Daten, werden die bis zu zehn Tactilos des Taktilen Brain Computer Interface angesteuert. Das Timing wird dabei komplett von OpenViBE uebernommen. diff --git a/arduino/TactiloControllerPanda.ino b/arduino/TactiloControllerPanda.ino deleted file mode 100644 index ef16498..0000000 --- a/arduino/TactiloControllerPanda.ino +++ /dev/null @@ -1,144 +0,0 @@ - -///------------------------------------------------------------------------------------------------- -/// -/// \file TactiloControllerPanda.ino -/// \brief Controlls the Tactilos on the Leonardos GPIOs, based on the messages from OpenVibes TactiloController Box Algorithm -/// Hochladen mit der Arduino IDE -/// \author Tobias Baumann (TH-Nürnberg). -/// \version 1.0. -/// \date Mon Mar 7 14:02:56 2022. -/// -///------------------------------------------------------------------------------------------------- - -//define used GPIO pins -#define TAC1 13 //PWM -#define TAC2 11 //PWM -#define TAC3 10 //PWM -#define TAC4 9 //PWM -#define TAC5 6 //PWM -#define TAC6 5 //PWM -//reserve -#define TAC7 3 //PWM -#define TAC8 2 -#define TAC9 1 -#define TAC10 0 - - - -void setup() -{ - //init serial - Serial.begin(115200); - - //init GPIOs - Serial.println("...init GPIOs"); - set_PinMode(); - set_AllLow(); -} - -void loop() -{ - char SerialData; - - if(Serial.available() > 0) - { - SerialData = Serial.read(); - processSerialData(SerialData); - } -} - -void set_PinMode() -{ - //set all pins to OUTPUT - pinMode(TAC1, OUTPUT); - pinMode(TAC2, OUTPUT); - pinMode(TAC3, OUTPUT); - pinMode(TAC4, OUTPUT); - pinMode(TAC5, OUTPUT); - pinMode(TAC6, OUTPUT); - pinMode(TAC7, OUTPUT); - pinMode(TAC8, OUTPUT); - pinMode(TAC9, OUTPUT); - pinMode(TAC10, OUTPUT); -} - -void set_AllLow() -{ - //set all pins to LOW - digitalWrite(TAC1, LOW); - digitalWrite(TAC2, LOW); - digitalWrite(TAC3, LOW); - digitalWrite(TAC4, LOW); - digitalWrite(TAC5, LOW); - digitalWrite(TAC6, LOW); - digitalWrite(TAC7, LOW); - digitalWrite(TAC8, LOW); - digitalWrite(TAC9, LOW); - digitalWrite(TAC10, LOW); -} - -void processSerialData(char SerialData) -{ - switch(SerialData) - { - case '0': - digitalWrite(TAC1, !digitalRead(TAC1)); - //Serial.print("Tactilo 1: "); - //Serial.println(digitalRead(TAC1)); - break; - case '1': - digitalWrite(TAC2, !digitalRead(TAC2)); - //Serial.print("Tactilo 2: "); - //Serial.println(digitalRead(TAC2)); - break; - case '2': - digitalWrite(TAC3, !digitalRead(TAC3)); - //Serial.print("Tactilo 3: "); - //Serial.println(digitalRead(TAC3)); - break; - case '3': - digitalWrite(TAC4, !digitalRead(TAC4)); - //Serial.print("Tactilo 4: "); - //Serial.println(digitalRead(TAC4)); - break; - case '4': - digitalWrite(TAC5, !digitalRead(TAC5)); - //Serial.print("Tactilo 5: "); - //Serial.println(digitalRead(TAC5)); - break; - case '5': - digitalWrite(TAC6, !digitalRead(TAC6)); - //Serial.print("Tactilo 6: "); - //Serial.println(digitalRead(TAC6)); - break; - case '6': - digitalWrite(TAC7, !digitalRead(TAC7)); - //Serial.print("Tactilo 7: "); - //Serial.println(digitalRead(TAC7)); - break; - case '7': - digitalWrite(TAC8, !digitalRead(TAC8)); - //Serial.print("Tactilo 8: "); - //Serial.println(digitalRead(TAC8)); - break; - case '8': - digitalWrite(TAC9, !digitalRead(TAC9)); - //Serial.print("Tactilo 9: "); - //Serial.println(digitalRead(TAC9)); - break; - case '9': - digitalWrite(TAC10, !digitalRead(TAC10)); - //Serial.print("Tactilo 10: "); - //Serial.println(digitalRead(TAC10)); - break; - case 'b': - Serial.println("...Begin Tactile Session"); - break; - case 'e': - set_AllLow(); - Serial.println("...End Tactile Session"); - break; - default: - break; - } -} diff --git a/scenarios/cfg/OV_TACTILE_PANDA.conf b/scenarios/cfg/OV_TACTILE_PANDA.conf deleted file mode 100644 index 3900f93..0000000 --- a/scenarios/cfg/OV_TACTILE_PANDA.conf +++ /dev/null @@ -1,124 +0,0 @@ -######################################################################################################################## -# This configuration file contains declarations of variables used by the scenarios of the tactile BCI System # -# # -# Add --config PATH_TO_THIS_FILE when starting the designer from the command line # -# USE --define TOKEN VALUE to assign a different value to a token without changing the default configuration # -# # -# # -# Scenarios requiring this configuration file: p300-tactile-0-signal-monitoring.xml, p300-tactile-1-acquisition.xml, # -# p300-tactile-2-train-xDAWN.xml, p300-tactile-3-train-classifier.xml, # -# p300-tactile-4-online.xml # -# # -# Author : Tobias Baumann # -# Date : 2021-12-27 # -######################################################################################################################## - - -######################################################################################################################## -# General Settings # -######################################################################################################################## -PATH_CONFIG = ${Player_ScenarioDirectory}/cfg -PATH_SCRIPTS = ${Player_ScenarioDirectory}/scripts -PATH_SIGNALS = ${Player_ScenarioDirectory}/signals -PATH_UI = ${Player_ScenarioDirectory}/ui - -ROW_BASE = OVTK_StimulationId_Label_01 -N_TACTILOS = 6 -FREE_SPELLING = true - - -######################################################################################################################## -# Acquisition and Signal Processing # -######################################################################################################################## -ACQUISITION_SERVER_HOST_NAME = ${AcquisitionServer_HostName} -ACQUISITION_SERVER_PORT = 1024 -CHANNEL_SELECTION = 1;2;3;4;5;6;7;8 -SIGNAL_DECIMATION_FACTOR = 2 -FILTER_TYPE = Band Pass -FILTER_ORDER = 4 -LOW_CUT_FREQUENCY = 1.000000 -HIGH_CUT_FREQUENCY = 20.000000 - - - -######################################################################################################################## -# Stimulation # -######################################################################################################################## -SCRIPT_TACTILE_STIMULATOR = ${PATH_SCRIPTS}/p300-tactile-stimulator.lua -N_REPETITIONS = 4 -N_TRIALS = 4 -STIM_DURATION = 0.2 -NO_STIM_DURATION = 0.1 -INTER_REPETITION_DELAY = 1.0 -INTER_TRIAL_DELAY = 4.0 -START_STIMULATION = OVTK_StimulationId_Label_00 -START_DELAY = 20 - - -######################################################################################################################## -# Tactilo Control # -######################################################################################################################## -SERIAL_PORT = /dev/ttyACM0 - - -######################################################################################################################## -# Target Generation # -######################################################################################################################## -SCRIPT_TARGET_GENERATION = ${PATH_SCRIPTS}/p300-tactile-target.lua -SEND_DELAY = 2 - - -######################################################################################################################## -# FILE I/O # -######################################################################################################################## -OUTPUT_FILE_NAME = ${PATH_SIGNALS}/p300-tactile-session.ov -INPUT_FILE_NAME = ${PATH_SIGNALS}/p300-tactile-session.ov - - -######################################################################################################################## -# xDAWN Spatial Filter # -######################################################################################################################## -SPATIAL_TRAIN_TRIGGER = OVTK_StimulationId_ExperimentStop -SPATIAL_FILTER_CONFIG = ${PATH_CONFIG}/p300-spatial-filter.cfg -FILTER_DIMENSION = 2 - - -######################################################################################################################## -# P300 Classifier # -######################################################################################################################## -CLASSIFIER_TRAIN_TRIGGER = OVTK_StimulationId_ExperimentStop -CLASSIFIER_CONFIG = ${PATH_CONFIG}/p300-classifier.cfg -MULTICLASS_STRATEGY = Native -CLASS_1 = OVTK_StimulationId_Target -CLASS_2 = OVTK_StimulationId_NonTarget -ALGORITHM = Linear Discrimimant Analysis (LDA) -USE_SHRINKAGE = false -SHRINKAGE_COEFFICIENT = -1.000000 -SHRINKAGE_FORCE_DIAGONAL_COV = false -N_PARTITIONS = 5 -CLASS_BALANCE = false - - -######################################################################################################################## -# P300 ACCUMULATOR # -######################################################################################################################## -SCRIPT_P300_ACCUMULATOR = ${PATH_SCRIPTS}/p300-tactile-accumulator.lua - - -######################################################################################################################## -# Tactile Visualization # -######################################################################################################################## -TACTILE_UI = ${PATH_UI}/p300-tactile-6.ui -FLASH_BG = 5,5,5 -FLASH_FG = 100,100,100 -FLASH_FONT_SIZE = 50 -NO_FLASH_BG = 0,0,0 -NO_FLASH_FG = 25,25,25 -NO_FLASH_FONT_SIZE = 50 -TARGET_BG = 20,20,70 -TARGET_FG = 10,10,30 -TARGET_FONT_SIZE = 50 -SELECTED_BG = 10,40,10 -SELECTED_FG = 60,100,60 -SELECTED_FONT_SIZE = 50 - diff --git a/scenarios/cfg/p300-epoch-average.cfg b/scenarios/cfg/p300-epoch-average.cfg deleted file mode 100644 index f6b5fdd..0000000 --- a/scenarios/cfg/p300-epoch-average.cfg +++ /dev/null @@ -1,4 +0,0 @@ - - Epoch block average - 1 - diff --git a/scenarios/manuals/Commands_TactileBCI.txt b/scenarios/manuals/Commands_TactileBCI.txt deleted file mode 100644 index 0fc2787..0000000 --- a/scenarios/manuals/Commands_TactileBCI.txt +++ /dev/null @@ -1,58 +0,0 @@ -############################################################################################################################################################################################################################################# -# OpenViBE Command Lines Tactile-BCI # -# # -# Author : Tobias Baumann # -# Date : 2022-01-18 # -############################################################################################################################################################################################################################################# - -############################################################################################################################################################################################################################################# -# Start Acquisition Server # -############################################################################################################################################################################################################################################# - -OV_PATH\openvibe-acquisition-server.cmd --define AcquisitionServer_DefaultDriver DRIVER_NAME --define AcquisitionServer_DefaultSampleCountPerBuffer N_SAMPLES_PER_BUFFER --define AcquisitionServer_DefaultConnectionPort PORT_NUMBER - -OV_PATH --> Pfad zur openvibe-acquisition-server.sh -DRIVER_NAME --> Bezeichnung des zu verwendenden Treibers z.B.: "g.tec Unicorn Gipsa-lab" -N_SAMPLES_PER_BUFFER --> Anzahl der Samples pro Buffer (4,8,16,32,64,128,256,512) (default: 32) -PORT_NUMBER --> Vom Acquisition Server verwendeter Port (default: 1024) - - -############################################################################################################################################################################################################################################# -# Wiedergabe der Szenarios ohne Designer GUI und mit der Konfiguration für das Taktile BCI # -############################################################################################################################################################################################################################################# - -1. Allgemeiner Aufruf: - - OV_PATH\openvibe-designer.cmd --no-gui --config CONFIG_PATH\OV_TACTILE_PANDA.conf --play SCENARIO_PATH\SCENARIO_NAME.xml - - OV_PATH --> Pfad zur openvibe-designer.sh - SCENARIO_PATH --> Pfad zu den Szenarios für das Taktile BCI - SCENARIO_NAME --> Name des zu startenden Szenarios - CONFIG_PATH --> Pfad zur Config für das Taktile BCI (=SCENARIO_PATH\cfg) - -2. Szenario 0 - Signal Monitoring: - - OV_PATH\openvibe-designer.sh --no-gui --config CONFIG_PATH\OV_TACTILE_PANDA.conf --play SCENARIO_PATH\p300-tactile-0-signal-monitoring.xml - -3. Szenario 1 - Acquisition: - - OV_PATH\openvibe-designer.sh --no-gui --config CONFIG_PATH\OV_TACTILE_PANDA.conf --play SCENARIO_PATH\p300-tactile-1-acquisition.xml - -4. Szenario 2 - Train xDAWN Filter: - - OV_PATH\openvibe-designer.sh --no-gui --config CONFIG_PATH\OV_TACTILE_PANDA.conf --playfast SCENARIO_PATH\p300-tactile-2-train-xDAWN.xml - -4. Szenario 3 - Train P300 Classifier: - - OV_PATH\openvibe-designer.sh --no-gui --config CONFIG_PATH\OV_TACTILE_PANDA.conf --playfast SCENARIO_PATH\p300-tactile-3-train-classifier.xml - -5. Szenario 4 - Online(Free_Spelling): - - OV_PATH\openvibe-designer.sh --no-gui --config CONFIG_PATH\OV_TACTILE_PANDA.conf --define FREE_SPELLING true --play SCENARIO_PATH\p300-tactile-4-online.xml - -6. Szenario 4 - Online(Copy_Spelling): - - OV_PATH\openvibe-designer.sh --no-gui --config CONFIG_PATH\OV_TACTILE_PANDA.conf --define FREE_SPELLING false --play SCENARIO_PATH\p300-tactile-4-online.xml - - - \ No newline at end of file diff --git a/scenarios/manuals/README.txt b/scenarios/manuals/README.txt deleted file mode 100644 index e4a9b72..0000000 --- a/scenarios/manuals/README.txt +++ /dev/null @@ -1,7 +0,0 @@ -p300-tactile: - -- Die Szenarien für das Taktile BCI basieren auf dem OpenVibeSzenrio p300-speller-xDAWN. -- Die Ausführungsreihenfolge ist Acquisition -> train-xDAWN -> train-classifier -> online. - -- der Designer muss mit --config CONFIG_PATH\OV_TACTILE_PANDA.conf von der konsole gestartet werden um die im config file festgelegten Tokens verwenden zu können -- weitere Informationen zum ausführen der Szenarios sind in "Commands_TactileBCI.txt" zu finden \ No newline at end of file diff --git a/scenarios/p300-tactile-0-signal-monitoring.xml b/scenarios/p300-tactile-0-signal-monitoring.xml deleted file mode 100644 index 0fe6116..0000000 --- a/scenarios/p300-tactile-0-signal-monitoring.xml +++ /dev/null @@ -1,743 +0,0 @@ - - 2 - OpenViBE Designer - 3.3.0 - - - - - - (0x000014bf, 0x000034db) - Identity - (0x5dffe431, 0x35215c50) - - - (0x5ba36127, 0x195feae1) - Input stream 1 - - - (0x5ba36127, 0x195feae1) - Input stream 2 - - - (0x6f752dd0, 0x082a321e) - Input stream 3 - - - - - (0x5ba36127, 0x195feae1) - Output stream 1 - - - (0x5ba36127, 0x195feae1) - Output stream 2 - - - (0x6f752dd0, 0x082a321e) - Output stream 3 - - - - - (0x17ee7c08, 0x94c14893) - - - - (0x1fa7a38f, 0x54edbe0b) - 432 - - - (0x207c9054, 0x3c841b63) - 928 - - - (0x30a4e5c9, 0x83502953) - - - - (0x4e7b798a, 0x183beafb) - (0xa8ffe2a3, 0x27038f03) - - - (0x527ad68d, 0x16d746a0) - - - - (0xac367a9c, 0x2da95abe) - 6 - - - (0xfba64161, 0x65304e21) - - - - - - (0x00003f1b, 0x00003c78) - Signal Decimation - (0x012f4bea, 0x3be37c66) - - - (0x5ba36127, 0x195feae1) - Input signal - - - - - (0x5ba36127, 0x195feae1) - Output signal - - - - - (0x007deef9, 0x2f3e95c6) - Decimation factor - 8 - ${SIGNAL_DECIMATION_FACTOR} - false - - - - - (0x1fa7a38f, 0x54edbe0b) - 336 - - - (0x207c9054, 0x3c841b63) - 816 - - - (0x4e7b798a, 0x183beafb) - (0x5082af41, 0xd0fbf4cb) - - - - - (0x000046bc, 0x00003f08) - Temporal Filter - (0xb4f9d042, 0x9d79f2e5) - - - (0x5ba36127, 0x195feae1) - Input signal - - - - - (0x5ba36127, 0x195feae1) - Output signal - - - - - (0xfa20178e, 0x4cba62e9) - Filter Type - Band Pass - ${FILTER_TYPE} - false - - - (0x007deef9, 0x2f3e95c6) - Filter Order - 4 - ${FILTER_ORDER} - false - - - (0x512a166f, 0x5c3ef83f) - Low Cut-off Frequency (Hz) - 1 - ${LOW_CUT_FREQUENCY} - false - - - (0x512a166f, 0x5c3ef83f) - High Cut-off Frequency (Hz) - 40 - ${HIGH_CUT_FREQUENCY} - false - - - - - (0x17ee7c08, 0x94c14893) - - - - (0x1fa7a38f, 0x54edbe0b) - 256 - - - (0x207c9054, 0x3c841b63) - 816 - - - (0x4e7b798a, 0x183beafb) - (0x6a7c1e9b, 0x6b00b5c5) - - - (0xc80ce8af, 0xf699f813) - 1 - - - (0xce18836a, 0x9c0eb403) - 4 - - - (0xcfad85b0, 0x7c6d841c) - 1 - - - - - (0x00005c5c, 0x00007610) - Raw - (0x0055be5f, 0x087bdd12) - - - (0x5ba36127, 0x195feae1) - Data - - - (0x6f752dd0, 0x082a321e) - Stimulations - - - (0x6ab26b81, 0x0f8c02f3) - Channel Units - - - - - (0x5de046a6, 0x086340aa) - Display Mode - Scan - Scan - false - - - (0x33a30739, 0x00d5299b) - Auto vertical scale - Per channel - Per channel - false - - - (0x512a166f, 0x5c3ef83f) - Scale refresh interval (secs) - 5 - 0.000000 - false - - - (0x512a166f, 0x5c3ef83f) - Vertical Scale - 100 - 100 - false - - - (0x512a166f, 0x5c3ef83f) - Vertical Offset - 0 - 0 - false - - - (0x512a166f, 0x5c3ef83f) - Time Scale - 10 - 5.000000 - false - - - (0x2cdb2f0b, 0x12f231ea) - Horizontal ruler - true - true - false - - - (0x2cdb2f0b, 0x12f231ea) - Vertical ruler - false - false - false - - - (0x2cdb2f0b, 0x12f231ea) - Multiview - false - false - false - - - - - (0x1fa7a38f, 0x54edbe0b) - 560 - - - (0x207c9054, 0x3c841b63) - 1024 - - - (0x4e7b798a, 0x183beafb) - (0x92c056a7, 0x2dc71aff) - - - (0x527ad68d, 0x16d746a0) - - - - (0xc73e83ec, 0xf855c5bc) - false - - - (0xce18836a, 0x9c0eb403) - 9 - - - (0xcfad85b0, 0x7c6d841c) - 3 - - - - - (0x00006b6d, 0x00002690) - Acquisition client - (0x35d225cb, 0x3e6e3a5f) - - - (0x403488e7, 0x565d70b6) - Experiment information - - - (0x5ba36127, 0x195feae1) - Signal stream - - - (0x6f752dd0, 0x082a321e) - Stimulations - - - (0x013df452, 0xa3a8879a) - Channel localisation - - - (0x6ab26b81, 0x0f8c02f3) - Channel units - - - - - (0x79a9edeb, 0x245d83fc) - Acquisition server hostname - ${AcquisitionServer_HostName} - ${ACQUISITION_SERVER_HOST_NAME} - false - - - (0x007deef9, 0x2f3e95c6) - Acquisition server port - 1024 - ${ACQUISITION_SERVER_PORT} - false - - - - - (0x1fa7a38f, 0x54edbe0b) - 64 - - - (0x207c9054, 0x3c841b63) - 944 - - - (0x4e7b798a, 0x183beafb) - (0x0d4656c0, 0xc95b1fa8) - - - (0xc73e83ec, 0xf855c5bc) - false - - - (0xc80ce8af, 0xf699f813) - 5 - - - (0xce18836a, 0x9c0eb403) - 2 - - - - - (0x00007e4e, 0x00006b7b) - Filtered - (0x0055be5f, 0x087bdd12) - - - (0x5ba36127, 0x195feae1) - Data - - - (0x6f752dd0, 0x082a321e) - Stimulations - - - (0x6ab26b81, 0x0f8c02f3) - Channel Units - - - - - (0x5de046a6, 0x086340aa) - Display Mode - Scan - Scan - false - - - (0x33a30739, 0x00d5299b) - Auto vertical scale - Per channel - Per channel - false - - - (0x512a166f, 0x5c3ef83f) - Scale refresh interval (secs) - 5 - 0.000000 - false - - - (0x512a166f, 0x5c3ef83f) - Vertical Scale - 100 - 100 - false - - - (0x512a166f, 0x5c3ef83f) - Vertical Offset - 0 - 0 - false - - - (0x512a166f, 0x5c3ef83f) - Time Scale - 10 - 5.000000 - false - - - (0x2cdb2f0b, 0x12f231ea) - Horizontal ruler - true - true - false - - - (0x2cdb2f0b, 0x12f231ea) - Vertical ruler - false - false - false - - - (0x2cdb2f0b, 0x12f231ea) - Multiview - false - false - false - - - - - (0x1fa7a38f, 0x54edbe0b) - 560 - - - (0x207c9054, 0x3c841b63) - 832 - - - (0x4e7b798a, 0x183beafb) - (0x92c056a7, 0x2dc71aff) - - - (0x527ad68d, 0x16d746a0) - - - - (0xc73e83ec, 0xf855c5bc) - false - - - (0xce18836a, 0x9c0eb403) - 9 - - - (0xcfad85b0, 0x7c6d841c) - 3 - - - - - (0x4ff47ca1, 0x133bd33b) - EEG Signal Selection - (0x361722e8, 0x311574e8) - - - (0x5ba36127, 0x195feae1) - Input signal - - - - - (0x5ba36127, 0x195feae1) - Output signal - - - - - (0x79a9edeb, 0x245d83fc) - Channel List - : - ${CHANNEL_SELECTION} - false - - - (0x3bcf9e67, 0x0c23994d) - Action - Select - Select - false - - - (0x666f25e9, 0x3e5738d6) - Channel Matching Method - Smart - Index - false - - - - - (0x1fa7a38f, 0x54edbe0b) - 176 - - - (0x207c9054, 0x3c841b63) - 864 - - - (0x30a4e5c9, 0x83502953) - - - - (0x4e7b798a, 0x183beafb) - (0x277826e1, 0xa30a3bd0) - - - (0x527ad68d, 0x16d746a0) - - - - (0xc80ce8af, 0xf699f813) - 1 - - - (0xce18836a, 0x9c0eb403) - 3 - - - (0xcfad85b0, 0x7c6d841c) - 1 - - - - - - - (0x000003a7, 0x000034db) - - (0x000014bf, 0x000034db) - 2 - - - (0x00005c5c, 0x00007610) - 1 - - - - (0x00000554, 0x0000661a) - - (0x000014bf, 0x000034db) - 2 - - - (0x00007e4e, 0x00006b7b) - 1 - - - - (0x00001d33, 0x00002bb0) - - (0x00006b6d, 0x00002690) - 2 - - - (0x000014bf, 0x000034db) - 2 - - - - (0x00003f04, 0x000045c3) - - (0x000014bf, 0x000034db) - 1 - - - (0x00005c5c, 0x00007610) - 0 - - - - (0x00004b11, 0x00006a43) - - (0x00003f1b, 0x00003c78) - 0 - - - (0x000014bf, 0x000034db) - 0 - - - - (0x000056fd, 0x00004795) - - (0x000014bf, 0x000034db) - 0 - - - (0x00007e4e, 0x00006b7b) - 0 - - - - (0x2336eb7d, 0x44803e51) - - (0x4ff47ca1, 0x133bd33b) - 0 - - - (0x000046bc, 0x00003f08) - 0 - - - - (0x384b6f31, 0x639fff7d) - - (0x4ff47ca1, 0x133bd33b) - 0 - - - (0x000014bf, 0x000034db) - 1 - - - - (0x771fd1ca, 0x72794515) - - (0x000046bc, 0x00003f08) - 0 - - - (0x00003f1b, 0x00003c78) - 0 - - - - (0x7c0285ed, 0x7aaf8bb7) - - (0x00006b6d, 0x00002690) - 1 - - - (0x4ff47ca1, 0x133bd33b) - 0 - - - - - - (0x000028e8, 0x00003dee) - <u><b><big>Scenario Overview</big></b></u> - -This scenario can be used in order -to check the quality of the signals -before starting an experiment. - -One should <u>definitely</u> -check the quality of the signals -and ensure that : - -- <b>eye blinks</b> are visible -- <b>jaw clenching</b> are visible -- <b>alpha waves</b> are visible when closing eyes - -Two Signals are displayed, one is the raw EEG-Signal -and the other one is the filtered signal. -The filtered signal is the one, that will actually be used -in other scenarios. - - - (0x473d9a43, 0x97fc0a97) - 576 - - - (0x7234b86b, 0x2b8651a5) - 272 - - - - - - - (0x0000775c, 0x000078ff) - (0x3bcce5d2, 0x43f2d968) - [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"height":635,"identifier":"(0x000077ee, 0x0000254d)","name":"default","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":783},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00004579, 0x00005fcb)","index":0,"name":"Default tab","parentIdentifier":"(0x000077ee, 0x0000254d)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"dividerPosition":293,"identifier":"(0x00005446, 0x000043a1)","index":0,"maxDividerPosition":590,"name":"Vertical split","parentIdentifier":"(0x00004579, 0x00005fcb)","type":4},{"boxIdentifier":"(0x00005c5c, 0x00007610)","childCount":0,"identifier":"(0x00000e42, 0x000074b8)","index":0,"parentIdentifier":"(0x00005446, 0x000043a1)","type":3},{"boxIdentifier":"(0x00007e4e, 0x00006b7b)","childCount":0,"identifier":"(0x00005db7, 0x000032ad)","index":1,"parentIdentifier":"(0x00005446, 0x000043a1)","type":3}] - - - - - (0x790d75b8, 0x3bb90c33) - Yann Renard - - - (0x8c1fc55b, 0x7b433dc2) - - - - (0x9f5c4075, 0x4a0d3666) - Signal Monitoring - - - (0xf36a1567, 0xd13c53da) - http://openvibe.inria.fr/p300-speller-xdawn/ - - - (0xf6b2e3fa, 0x7bd43926) - xDAWN P300 Speller - - - (0xf8034a49, 0x8b3f37cc) - INRIA - - - \ No newline at end of file diff --git a/scenarios/p300-tactile-1-acquisition.xml b/scenarios/p300-tactile-1-acquisition.xml deleted file mode 100644 index f6ecde8..0000000 --- a/scenarios/p300-tactile-1-acquisition.xml +++ /dev/null @@ -1,1210 +0,0 @@ - - 2 - OpenViBE Designer - 3.3.0 - - - - - - (0x0000356c, 0x00004381) - Generic stream writer - (0x09c92218, 0x7c1216f8) - - - (0x403488e7, 0x565d70b6) - Input stream 1 - - - (0x5ba36127, 0x195feae1) - Input stream 2 - - - (0x6f752dd0, 0x082a321e) - Input stream 3 - - - - - (0x330306dd, 0x74a95f98) - Filename - - ${OUTPUT_FILE_NAME} - false - - - (0x2cdb2f0b, 0x12f231ea) - Use compression - false - false - false - - - - - (0x1fa7a38f, 0x54edbe0b) - 832 - - - (0x207c9054, 0x3c841b63) - 576 - - - (0x4e7b798a, 0x183beafb) - (0x89a08108, 0xc8d1fac1) - - - (0x527ad68d, 0x16d746a0) - - - - (0xc46b3d00, 0x3e0454e1) - (0x00000000, 0x0350a9f0) - - - (0xfba64161, 0x65304e21) - - - - - - (0x00003f1b, 0x00003c78) - Signal Decimation - (0x012f4bea, 0x3be37c66) - - - (0x5ba36127, 0x195feae1) - Input signal - - - - - (0x5ba36127, 0x195feae1) - Output signal - - - - - (0x007deef9, 0x2f3e95c6) - Decimation factor - 8 - ${SIGNAL_DECIMATION_FACTOR} - false - - - - - (0x1fa7a38f, 0x54edbe0b) - 688 - - - (0x207c9054, 0x3c841b63) - 544 - - - (0x4e7b798a, 0x183beafb) - (0x5082af41, 0xd0fbf4cb) - - - - - (0x000046bc, 0x00003f08) - Temporal Filter - (0xb4f9d042, 0x9d79f2e5) - - - (0x5ba36127, 0x195feae1) - Input signal - - - - - (0x5ba36127, 0x195feae1) - Output signal - - - - - (0xfa20178e, 0x4cba62e9) - Filter Type - Band Pass - ${FILTER_TYPE} - false - - - (0x007deef9, 0x2f3e95c6) - Filter Order - 4 - ${FILTER_ORDER} - false - - - (0x512a166f, 0x5c3ef83f) - Low Cut-off Frequency (Hz) - 1 - ${LOW_CUT_FREQUENCY} - false - - - (0x512a166f, 0x5c3ef83f) - High Cut-off Frequency (Hz) - 40 - ${HIGH_CUT_FREQUENCY} - false - - - - - (0x17ee7c08, 0x94c14893) - - - - (0x1fa7a38f, 0x54edbe0b) - 640 - - - (0x207c9054, 0x3c841b63) - 544 - - - (0x4e7b798a, 0x183beafb) - (0x6a7c1e9b, 0x6b00b5c5) - - - (0xc80ce8af, 0xf699f813) - 1 - - - (0xce18836a, 0x9c0eb403) - 4 - - - (0xcfad85b0, 0x7c6d841c) - 1 - - - - - (0x0000470b, 0x00001b1d) - Tactile Stimulator - (0x0b5a2787, 0x02750621) - - - (0x6f752dd0, 0x082a321e) - Stimulations - - - - - (0xb0d0db45, 0x49cbc34a) - Lua Script - - ${SCRIPT_TACTILE_STIMULATOR} - false - - - (0x00000000, 0xbae13066) - (0x2c132d6e, 0x44ab0d97) - Row Stimulation Base - OVTK_StimulationId_Label_01 - ${ROW_BASE} - false - - - (0x00000000, 0xc152613d) - (0x007deef9, 0x2f3e95c6) - Number of Tactilos - 6 - ${N_TACTILOS} - false - - - (0x00000000, 0xa0308929) - (0x007deef9, 0x2f3e95c6) - Number of Repetitions - 6 - ${N_REPETITIONS} - false - - - (0x00000000, 0xcde95a6f) - (0x007deef9, 0x2f3e95c6) - Number of Trials - 6 - ${N_TRIALS} - false - - - (0x00000000, 0x9b3f9b7b) - (0x512a166f, 0x5c3ef83f) - Stimulus Duration (in sec) - 0.2 - ${STIM_DURATION} - false - - - (0x00000000, 0x583ad367) - (0x512a166f, 0x5c3ef83f) - No Stimulus Duration (in sec) - 0.1 - ${NO_STIM_DURATION} - false - - - (0x00000000, 0xfc1c2fb6) - (0x512a166f, 0x5c3ef83f) - Inter-Repetition Delay (in sec) - 1.0 - ${INTER_REPETITION_DELAY} - false - - - (0x00000000, 0x0d9a1e18) - (0x512a166f, 0x5c3ef83f) - Inter-Trial Delay (in sec) - 3.0 - ${INTER_TRIAL_DELAY} - false - - - (0x00000000, 0xaeefd500) - (0x2c132d6e, 0x44ab0d97) - Start Stimulation - OVTK_StimulationId_Label_00 - ${START_STIMULATION} - false - - - (0x00000000, 0xef5eb0e5) - (0x2cdb2f0b, 0x12f231ea) - Free Spelling - false - false - false - - - (0x00000000, 0x4ead155d) - (0x007deef9, 0x2f3e95c6) - Start Delay - 20 - ${START_DELAY} - false - - - - - (0x17ee7c08, 0x94c14893) - - - - (0x1fa7a38f, 0x54edbe0b) - 160 - - - (0x207c9054, 0x3c841b63) - 624 - - - (0x4e7b798a, 0x183beafb) - (0xd6e3f48b, 0xbee3523a) - - - (0x61d11811, 0x71e65362) - - - - (0xc80ce8af, 0xf699f813) - 1 - - - (0xce18836a, 0x9c0eb403) - 1 - - - (0xf191c1c8, 0xa0123976) - - - - (0xfba64161, 0x65304e21) - - - - - - (0x00004eca, 0x00003f33) - Player Controller - (0x5f426dce, 0x08456e13) - - - (0x6f752dd0, 0x082a321e) - Stimulations - - - - - (0x2c132d6e, 0x44ab0d97) - Stimulation name - OVTK_StimulationId_Label_00 - OVTK_StimulationId_ExperimentStop - false - - - (0xcc14d8d6, 0xf27ecb73) - Action to perform - Pause - Stop - false - - - - - (0x1fa7a38f, 0x54edbe0b) - 624 - - - (0x207c9054, 0x3c841b63) - 720 - - - (0x4e7b798a, 0x183beafb) - (0x568d148e, 0x650792b3) - - - (0xc46b3d00, 0x3e0454e1) - (0x00000000, 0x01070ba6) - - - (0xc73e83ec, 0xf855c5bc) - false - - - (0xce18836a, 0x9c0eb403) - 2 - - - (0xcfad85b0, 0x7c6d841c) - 1 - - - - - (0x0000599b, 0x000026ba) - Acquisition client - (0x35d225cb, 0x3e6e3a5f) - - - (0x403488e7, 0x565d70b6) - Experiment information - - - (0x5ba36127, 0x195feae1) - Signal stream - - - (0x6f752dd0, 0x082a321e) - Stimulations - - - (0x013df452, 0xa3a8879a) - Channel localisation - - - (0x6ab26b81, 0x0f8c02f3) - Channel units - - - - - (0x79a9edeb, 0x245d83fc) - Acquisition server hostname - ${AcquisitionServer_HostName} - ${ACQUISITION_SERVER_HOST_NAME} - false - - - (0x007deef9, 0x2f3e95c6) - Acquisition server port - 1024 - ${ACQUISITION_SERVER_PORT} - false - - - - - (0x1fa7a38f, 0x54edbe0b) - 480 - - - (0x207c9054, 0x3c841b63) - 624 - - - (0x4e7b798a, 0x183beafb) - (0x0d4656c0, 0xc95b1fa8) - - - (0xc46b3d00, 0x3e0454e1) - (0x00000000, 0x02909b75) - - - (0xc73e83ec, 0xf855c5bc) - false - - - (0xc80ce8af, 0xf699f813) - 5 - - - (0xce18836a, 0x9c0eb403) - 2 - - - - - (0x00006d0d, 0x000031da) - Tactile Target Generation - (0x0b5a2787, 0x02750621) - - - (0x6f752dd0, 0x082a321e) - New input - - - - - (0x6f752dd0, 0x082a321e) - Stimulations - - - - - (0xb0d0db45, 0x49cbc34a) - Lua Script - - ${SCRIPT_TARGET_GENERATION} - false - - - (0x2c132d6e, 0x44ab0d97) - Row Stimulation Base - OVTK_StimulationId_Label_01 - ${ROW_BASE} - false - - - (0x00000000, 0xeb4fffa2) - (0x007deef9, 0x2f3e95c6) - Number of Tactilos - 6 - ${N_TACTILOS} - false - - - (0xf33dddda, 0xfd2c04a3) - (0x007deef9, 0x2f3e95c6) - Delay Before Sending (in sec) - 2 - ${SEND_DELAY} - false - - - (0xa95b0b1d, 0x12aa8207) - (0x2cdb2f0b, 0x12f231ea) - Free Spelling - false - false - false - - - - - (0x17ee7c08, 0x94c14893) - - - - (0x1fa7a38f, 0x54edbe0b) - 288 - - - (0x207c9054, 0x3c841b63) - 720 - - - (0x4e7b798a, 0x183beafb) - (0xd6e3f48b, 0xbee3523a) - - - (0x61d11811, 0x71e65362) - - - - (0xc46b3d00, 0x3e0454e1) - (0x00000000, 0x0334c6b7) - - - (0xc80ce8af, 0xf699f813) - 1 - - - (0xce18836a, 0x9c0eb403) - 1 - - - (0xf191c1c8, 0xa0123976) - - - - (0xfba64161, 0x65304e21) - - - - - - (0x00007e4e, 0x00006b7c) - EEG Signal - (0x0055be5f, 0x087bdd12) - - - (0x5ba36127, 0x195feae1) - Data - - - (0x6f752dd0, 0x082a321e) - Stimulations - - - (0x6ab26b81, 0x0f8c02f3) - Channel Units - - - - - (0x5de046a6, 0x086340aa) - Display Mode - Scan - Scan - false - - - (0x33a30739, 0x00d5299b) - Auto vertical scale - Per channel - Per channel - false - - - (0x512a166f, 0x5c3ef83f) - Scale refresh interval (secs) - 5 - 0.000000 - false - - - (0x512a166f, 0x5c3ef83f) - Vertical Scale - 100 - 100 - false - - - (0x512a166f, 0x5c3ef83f) - Vertical Offset - 0 - 0 - false - - - (0x512a166f, 0x5c3ef83f) - Time Scale - 10 - 5.000000 - false - - - (0x2cdb2f0b, 0x12f231ea) - Horizontal ruler - true - true - false - - - (0x2cdb2f0b, 0x12f231ea) - Vertical ruler - false - false - false - - - (0x2cdb2f0b, 0x12f231ea) - Multiview - false - false - false - - - - - (0x1fa7a38f, 0x54edbe0b) - 832 - - - (0x207c9054, 0x3c841b63) - 704 - - - (0x4e7b798a, 0x183beafb) - (0x92c056a7, 0x2dc71aff) - - - (0x527ad68d, 0x16d746a0) - - - - (0xc73e83ec, 0xf855c5bc) - false - - - (0xce18836a, 0x9c0eb403) - 9 - - - (0xcfad85b0, 0x7c6d841c) - 3 - - - - - (0x2ae25693, 0x5aacdae0) - P300TactileVisualization - (0xd463df86, 0x7fbfdd81) - - - (0x6f752dd0, 0x082a321e) - Sequence - - - (0x6f752dd0, 0x082a321e) - Target - - - (0x6f752dd0, 0x082a321e) - Result - - - - - (0x6f752dd0, 0x082a321e) - Result - - - - - (0x330306dd, 0x74a95f98) - Interface Filename - /ui/p300-tactile-6.ui - ${TACTILE_UI} - false - - - (0x2c132d6e, 0x44ab0d97) - Row Stimulation Base - OVTK_StimulationId_Label_01 - ${ROW_BASE} - false - - - (0x007deef9, 0x2f3e95c6) - Number of Tactilos - 6 - ${N_TACTILOS} - false - - - (0x2cdb2f0b, 0x12f231ea) - Free Spelling - false - false - false - - - - - (0x1fa7a38f, 0x54edbe0b) - 400 - - - (0x207c9054, 0x3c841b63) - 608 - - - (0x4e7b798a, 0x183beafb) - (0x4b4912a1, 0xc1409d95) - - - (0x666fffff, 0x666fffff) - - - - (0xc80ce8af, 0xf699f813) - 1 - - - (0xce18836a, 0x9c0eb403) - 4 - - - (0xcfad85b0, 0x7c6d841c) - 3 - - - - - (0x4ade5889, 0x17459601) - Identity - (0x5dffe431, 0x35215c50) - - - (0x5ba36127, 0x195feae1) - EEG Signal - - - (0x637728e4, 0xba606dd1) - (0x6f752dd0, 0x082a321e) - Stimulation - - - - - (0x5ba36127, 0x195feae1) - Output stream 1 - - - (0x4634ca30, 0x4eba507b) - (0x6f752dd0, 0x082a321e) - Output stream 2 - - - - - (0x17ee7c08, 0x94c14893) - - - - (0x1fa7a38f, 0x54edbe0b) - 736 - - - (0x207c9054, 0x3c841b63) - 624 - - - (0x30a4e5c9, 0x83502953) - - - - (0x4e7b798a, 0x183beafb) - (0xa8ffe2a3, 0x27038f03) - - - (0x527ad68d, 0x16d746a0) - - - - (0xc80ce8af, 0xf699f813) - 1 - - - (0xcfad85b0, 0x7c6d841c) - 1 - - - (0xfba64161, 0x65304e21) - - - - - - (0x4ff47ca1, 0x133bd33c) - EEG Channel Selection - (0x361722e8, 0x311574e8) - - - (0x5ba36127, 0x195feae1) - Input signal - - - - - (0x5ba36127, 0x195feae1) - Output signal - - - - - (0x79a9edeb, 0x245d83fc) - Channel List - : - ${CHANNEL_SELECTION} - false - - - (0x3bcf9e67, 0x0c23994d) - Action - Select - Select - false - - - (0x666f25e9, 0x3e5738d6) - Channel Matching Method - Smart - Index - false - - - - - (0x1fa7a38f, 0x54edbe0b) - 576 - - - (0x207c9054, 0x3c841b63) - 544 - - - (0x30a4e5c9, 0x83502953) - - - - (0x4e7b798a, 0x183beafb) - (0x277826e1, 0xa30a3bd0) - - - (0x527ad68d, 0x16d746a0) - - - - (0xc80ce8af, 0xf699f813) - 1 - - - (0xce18836a, 0x9c0eb403) - 3 - - - (0xcfad85b0, 0x7c6d841c) - 1 - - - - - (0x75c23c9b, 0x31b0f712) - Tactilo Controller - (0x823bbe28, 0x0daf2111) - - - (0x6f752dd0, 0x082a321e) - StimInput - - - - - (0x6f752dd0, 0x082a321e) - StimOutput - - - - - (0x79a9edeb, 0x245d83fc) - Serial Port Name - /dev/ttyACM0 - ${SERIAL_PORT} - false - - - (0x2c132d6e, 0x44ab0d97) - Row Stimulation Base - OVTK_StimulationId_Label_01 - ${ROW_BASE} - false - - - (0x007deef9, 0x2f3e95c6) - Number of Tactilos - 6 - ${N_TACTILOS} - false - - - - - (0x1fa7a38f, 0x54edbe0b) - 288 - - - (0x207c9054, 0x3c841b63) - 560 - - - (0x4e7b798a, 0x183beafb) - (0xa638e513, 0x9a753d4b) - - - (0x666fffff, 0x666fffff) - - - - (0xc80ce8af, 0xf699f813) - 1 - - - (0xce18836a, 0x9c0eb403) - 3 - - - (0xcfad85b0, 0x7c6d841c) - 1 - - - - - - - (0x00001e35, 0x00003016) - - (0x0000599b, 0x000026ba) - 2 - - - (0x00004eca, 0x00003f33) - 0 - - - - (0x000048ba, 0x0000793e) - - (0x0000470b, 0x00001b1d) - 0 - - - (0x00006d0d, 0x000031da) - 0 - - - - (0x1a70f30d, 0x50647e8c) - - (0x0000470b, 0x00001b1d) - 0 - - - (0x75c23c9b, 0x31b0f712) - 0 - - - - (0x27893ae2, 0x55f4a507) - - (0x00003f1b, 0x00003c78) - 0 - - - (0x4ade5889, 0x17459601) - 0 - - - - (0x2a77405b, 0x472854cc) - - (0x000046bc, 0x00003f08) - 0 - - - (0x00003f1b, 0x00003c78) - 0 - - - - (0x2c26a8b6, 0x6188bc2d) - - (0x4ade5889, 0x17459601) - (0x4634ca30, 0x4eba507b) - - - (0x0000356c, 0x00004381) - 2 - - - - (0x3071bbd6, 0x1170b46f) - - (0x75c23c9b, 0x31b0f712) - 0 - - - (0x2ae25693, 0x5aacdae0) - 0 - - - - (0x39f52e7c, 0x285a7107) - - (0x0000599b, 0x000026ba) - 1 - - - (0x4ff47ca1, 0x133bd33c) - 0 - - - - (0x478989f0, 0x1b494dfc) - - (0x00006d0d, 0x000031da) - 0 - - - (0x2ae25693, 0x5aacdae0) - 1 - - - - (0x4d4cba8a, 0x5cbf79c7) - - (0x4ade5889, 0x17459601) - 0 - - - (0x00007e4e, 0x00006b7c) - 0 - - - - (0x5d9ef0f2, 0x40736918) - - (0x4ff47ca1, 0x133bd33c) - 0 - - - (0x000046bc, 0x00003f08) - 0 - - - - (0x6552e5c0, 0x2866044c) - - (0x0000599b, 0x000026ba) - 2 - - - (0x4ade5889, 0x17459601) - (0x637728e4, 0xba606dd1) - - - - (0x6eb8c286, 0x24e6b63f) - - (0x4ade5889, 0x17459601) - (0x4634ca30, 0x4eba507b) - - - (0x00007e4e, 0x00006b7c) - 1 - - - - (0x70d4fe7b, 0x57913744) - - (0x4ade5889, 0x17459601) - 0 - - - (0x0000356c, 0x00004381) - 1 - - - - - - (0x0000363f, 0x00001c2b) - The P300 Speller Visualization -sends the markers (stimulations) directly to -Acquisition Server using TCP Tagging. - - - (0x473d9a43, 0x97fc0a97) - 864 - - - (0x7234b86b, 0x2b8651a5) - 400 - - - - - (0x19b8795c, 0x039f26f7) - <u><b><big>Scenario Overview</big></b></u> - -This scenario is used as a first step to -collect some training data. The data -will later be used to train a spatial -filter and a classifier for online use of -the Tactile BCI System. - -Spelling automatically starts delayed to the start -of scenario execution. - -First the target Tactilo will vibrate and flash in the -<i>Speller Visualization</i>(Copy Spelling Only). -After that you have to Focus on your chosen -(or the predetermined Target), while all Tactilos -will vibrate (flash) several times. -This will be repeated for a defined number of trials. -After each Trial, the detected Tactilo will be presented -in the <i>Speller Visualization</i> - - - (0x473d9a43, 0x97fc0a97) - 320 - - - (0x7234b86b, 0x2b8651a5) - 288 - - - - - - - (0x0000775c, 0x000078ff) - (0x3bcce5d2, 0x43f2d968) - [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"height":320,"identifier":"(0x00003bb5, 0x00006280)","name":"Acquisition","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":477},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x0000339c, 0x00002646)","index":0,"name":"Tactile Visualization","parentIdentifier":"(0x00003bb5, 0x00006280)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00003667, 0x00007632)","index":1,"name":"EEG Signal","parentIdentifier":"(0x00003bb5, 0x00006280)","type":2},{"boxIdentifier":"(0x2ae25693, 0x5aacdae0)","childCount":0,"identifier":"(0x2859de2f, 0x369b7e62)","index":0,"parentIdentifier":"(0x0000339c, 0x00002646)","type":3},{"boxIdentifier":"(0x00007e4e, 0x00006b7c)","childCount":0,"identifier":"(0x00004ac1, 0x000015aa)","index":0,"parentIdentifier":"(0x00003667, 0x00007632)","type":3}] - - - - - (0x790d75b8, 0x3bb90c33) - Yann Renard, Jussi T. Lindgren - - - (0x8c1fc55b, 0x7b433dc2) - - - - (0x9f5c4075, 0x4a0d3666) - Data Acquisition - - - (0xf36a1567, 0xd13c53da) - http://openvibe.inria.fr/p300-speller-xdawn/ - - - (0xf6b2e3fa, 0x7bd43926) - xDAWN P300 Speller - - - (0xf8034a49, 0x8b3f37cc) - INRIA - - - \ No newline at end of file diff --git a/scenarios/p300-tactile-2-train-xDAWN.xml b/scenarios/p300-tactile-2-train-xDAWN.xml deleted file mode 100644 index 445a9e4..0000000 --- a/scenarios/p300-tactile-2-train-xDAWN.xml +++ /dev/null @@ -1,438 +0,0 @@ - - 2 - OpenViBE Designer - 3.3.0 - - - - - - (0x00001db8, 0x00001848) - xDAWN Trainer - (0x27542f6e, 0x14aa3548) - - - (0x6f752dd0, 0x082a321e) - Stimulations - - - (0x5ba36127, 0x195feae1) - Session signal - - - (0x5ba36127, 0x195feae1) - Evoked potential epochs - - - - - (0x6f752dd0, 0x082a321e) - Train-completed Flag - - - - - (0x2c132d6e, 0x44ab0d97) - Train stimulation - OVTK_StimulationId_Train - ${SPATIAL_TRAIN_TRIGGER} - false - - - (0x330306dd, 0x74a95f98) - Spatial filter configuration - - ${SPATIAL_FILTER_CONFIG} - false - - - (0x007deef9, 0x2f3e95c6) - Filter dimension - 4 - ${FILTER_DIMENSION} - false - - - (0x2cdb2f0b, 0x12f231ea) - Save as box config - true - true - false - - - - - (0x1fa7a38f, 0x54edbe0b) - 176 - - - (0x207c9054, 0x3c841b63) - 288 - - - (0x4e7b798a, 0x183beafb) - (0x4b49a133, 0x42f38d94) - - - (0xc80ce8af, 0xf699f813) - - - - (0xce18836a, 0x9c0eb403) - - - - (0xcfad85b0, 0x7c6d841c) - - - - - - (0x00002514, 0x00001614) - Generic stream reader - (0x6468099f, 0x0370095a) - - - (0x403488e7, 0x565d70b6) - Output stream 1 - - - (0x5ba36127, 0x195feae1) - Output stream 2 - - - (0x6f752dd0, 0x082a321e) - Output stream 3 - - - - - (0x330306dd, 0x74a95f98) - Filename - - ${INPUT_FILE_NAME} - false - - - - - (0x17ee7c08, 0x94c14893) - - - - (0x1fa7a38f, 0x54edbe0b) - -128 - - - (0x207c9054, 0x3c841b63) - 400 - - - (0x30a4e5c9, 0x83502953) - - - - (0x4e7b798a, 0x183beafb) - (0xf37b8e7a, 0x1bc33e4e) - - - - - (0x0000267a, 0x0000427f) - Time based epoching - (0x00777fa0, 0x5dc3f560) - - - (0x5ba36127, 0x195feae1) - Input signal - - - - - (0x5ba36127, 0x195feae1) - Epoched signal 1 - - - - - (0x512a166f, 0x5c3ef83f) - Epoch 1 duration (in sec) - 1 - 0.250000 - false - - - (0x512a166f, 0x5c3ef83f) - Epoch 1 intervals (in sec) - 0.5 - 0.250000 - false - - - - - (0x17ee7c08, 0x94c14893) - - - - (0x1fa7a38f, 0x54edbe0b) - -16 - - - (0x207c9054, 0x3c841b63) - 288 - - - (0x4e7b798a, 0x183beafb) - (0xc5ff41e9, 0xccc59a01) - - - - - (0x00004aea, 0x00001465) - Player Controller - (0x5f426dce, 0x08456e13) - - - (0x6f752dd0, 0x082a321e) - Stimulations - - - - - (0x2c132d6e, 0x44ab0d97) - Stimulation name - OVTK_StimulationId_Label_00 - OVTK_StimulationId_TrainCompleted - false - - - (0xcc14d8d6, 0xf27ecb73) - Action to perform - Pause - Stop - false - - - - - (0x1fa7a38f, 0x54edbe0b) - 240 - - - (0x207c9054, 0x3c841b63) - 288 - - - (0x4e7b798a, 0x183beafb) - (0x568d148e, 0x650792b3) - - - (0xce18836a, 0x9c0eb403) - 2 - - - (0xcfad85b0, 0x7c6d841c) - 1 - - - - - (0x00006fa4, 0x00003c77) - Target Selection - (0x426163d1, 0x324237b0) - - - (0x5ba36127, 0x195feae1) - Input signal - - - (0x6f752dd0, 0x082a321e) - Input stimulations - - - - - (0x5ba36127, 0x195feae1) - Epoched signal - - - - - (0x512a166f, 0x5c3ef83f) - Epoch duration (in sec) - 1 - 0.6 - false - - - (0x512a166f, 0x5c3ef83f) - Epoch offset (in sec) - 0.5 - 0 - false - - - (0x2c132d6e, 0x44ab0d97) - Stimulation to epoch from - OVTK_GDF_VEP - OVTK_StimulationId_Target - false - - - - - (0x1fa7a38f, 0x54edbe0b) - 64 - - - (0x207c9054, 0x3c841b63) - 416 - - - (0x4e7b798a, 0x183beafb) - (0x5de31172, 0xa1304456) - - - - - - - (0x00003920, 0x00007a30) - - (0x0000267a, 0x0000427f) - 0 - - - (0x00001db8, 0x00001848) - 1 - - - - (0x00004bf5, 0x00007908) - - (0x00001db8, 0x00001848) - 0 - - - (0x00004aea, 0x00001465) - 0 - - - - (0x000059e8, 0x00000032) - - (0x00002514, 0x00001614) - 2 - - - (0x00001db8, 0x00001848) - 0 - - - - (0x00006913, 0x00003182) - - (0x00002514, 0x00001614) - 1 - - - (0x0000267a, 0x0000427f) - 0 - - - - (0x074b170c, 0x37e84571) - - (0x0000267a, 0x0000427f) - 0 - - - (0x00006fa4, 0x00003c77) - 0 - - - - (0x188f2058, 0x7ac23f09) - - (0x00006fa4, 0x00003c77) - 0 - - - (0x00001db8, 0x00001848) - 2 - - - - (0x2b245a90, 0x47f6e438) - - (0x00002514, 0x00001614) - 2 - - - (0x00006fa4, 0x00003c77) - 1 - - - - - - (0x000049d6, 0x00006e67) - <u><b><big>Scenario Overview</big></b></u> - -This scenario should be used to train -the spatial filter using the xDAWN algorithm. - -At the end of the training, you will have line in -the console about eigen values. -Using a <i>Player Controller</i> the scenario will -automatically pause at the end of the training. - -If you want details on this values, you should read -<u>http://www.icp.inpg.fr/~rivetber/Publications/references/Rivet2009a.pdf</u> - - - (0x473d9a43, 0x97fc0a97) - 704 - - - (0x7234b86b, 0x2b8651a5) - -32 - - - - - - - (0x0000775c, 0x000078ff) - (0x3bcce5d2, 0x43f2d968) - [] - - - - - (0x790d75b8, 0x3bb90c33) - Yann Renard - - - (0x8c1fc55b, 0x7b433dc2) - - - - (0x9f5c4075, 0x4a0d3666) - Spatial Filter Training - - - (0xf36a1567, 0xd13c53da) - http://openvibe.inria.fr/p300-speller-xdawn/ - - - (0xf6b2e3fa, 0x7bd43926) - xDAWN P300 Speller - - - (0xf8034a49, 0x8b3f37cc) - INRIA - - - \ No newline at end of file diff --git a/scenarios/p300-tactile-3-train-classifier.xml b/scenarios/p300-tactile-3-train-classifier.xml deleted file mode 100644 index 00b22e9..0000000 --- a/scenarios/p300-tactile-3-train-classifier.xml +++ /dev/null @@ -1,898 +0,0 @@ - - 2 - OpenViBE Designer - 3.3.0 - - - - - - (0x00000b2d, 0x00006d61) - Feature aggregator - (0x00682417, 0x453635f9) - - - (0x544a003e, 0x6dcba5f6) - Input stream 1 - - - - - (0x17341935, 0x152ff448) - Feature vector stream - - - - - (0x1fa7a38f, 0x54edbe0b) - 240 - - - (0x207c9054, 0x3c841b63) - 336 - - - (0x4e7b798a, 0x183beafb) - (0xb5d15cc9, 0x6c8c28fb) - - - (0xc46b3d00, 0x3e0454e1) - (0x00000000, 0x002bb807) - - - (0xc80ce8af, 0xf699f813) - 1 - - - (0xcfad85b0, 0x7c6d841c) - 1 - - - (0xfba64161, 0x65304e21) - - - - - - (0x00000d41, 0x000013b7) - Feature aggregator - (0x00682417, 0x453635f9) - - - (0x544a003e, 0x6dcba5f6) - Input stream 1 - - - - - (0x17341935, 0x152ff448) - Feature vector stream - - - - - (0x1fa7a38f, 0x54edbe0b) - 240 - - - (0x207c9054, 0x3c841b63) - 528 - - - (0x4e7b798a, 0x183beafb) - (0xb5d15cc9, 0x6c8c28fb) - - - (0xc46b3d00, 0x3e0454e1) - (0x00000000, 0x002b7d6e) - - - (0xc80ce8af, 0xf699f813) - 1 - - - (0xcfad85b0, 0x7c6d841c) - 1 - - - (0xfba64161, 0x65304e21) - - - - - - (0x00001f83, 0x00004e32) - Generic stream reader - (0x6468099f, 0x0370095a) - - - (0x403488e7, 0x565d70b6) - Output stream 1 - - - (0x5ba36127, 0x195feae1) - Output stream 2 - - - (0x6f752dd0, 0x082a321e) - Output stream 3 - - - - - (0x330306dd, 0x74a95f98) - Filename - - ${INPUT_FILE_NAME} - false - - - - - (0x17ee7c08, 0x94c14893) - - - - (0x1fa7a38f, 0x54edbe0b) - -160 - - - (0x207c9054, 0x3c841b63) - 400 - - - (0x30a4e5c9, 0x83502953) - - - - (0x4e7b798a, 0x183beafb) - (0xf37b8e7a, 0x1bc33e4e) - - - (0xc46b3d00, 0x3e0454e1) - (0x00000000, 0x008e34c7) - - - - - (0x00002c8b, 0x000001d5) - Player Controller - (0x5f426dce, 0x08456e13) - - - (0x6f752dd0, 0x082a321e) - Stimulations - - - - - (0x2c132d6e, 0x44ab0d97) - Stimulation name - OVTK_StimulationId_Label_00 - OVTK_StimulationId_TrainCompleted - false - - - (0xcc14d8d6, 0xf27ecb73) - Action to perform - Pause - Stop - false - - - - - (0x1fa7a38f, 0x54edbe0b) - 416 - - - (0x207c9054, 0x3c841b63) - 448 - - - (0x4e7b798a, 0x183beafb) - (0x568d148e, 0x650792b3) - - - (0xc46b3d00, 0x3e0454e1) - (0x00000000, 0x00301c7f) - - - (0xc73e83ec, 0xf855c5bc) - false - - - (0xce18836a, 0x9c0eb403) - 2 - - - (0xcfad85b0, 0x7c6d841c) - 1 - - - - - (0x00002f94, 0x00000342) - Non Target Selection - (0x426163d1, 0x324237b0) - - - (0x5ba36127, 0x195feae1) - Input signal - - - (0x6f752dd0, 0x082a321e) - Input stimulations - - - - - (0x5ba36127, 0x195feae1) - Epoched signal - - - - - (0x512a166f, 0x5c3ef83f) - Epoch duration (in sec) - 1 - 0.6 - false - - - (0x512a166f, 0x5c3ef83f) - Epoch offset (in sec) - 0.5 - 0 - false - - - (0x2c132d6e, 0x44ab0d97) - Stimulation to epoch from - OVTK_GDF_VEP - OVTK_StimulationId_NonTarget - false - - - - - (0x1fa7a38f, 0x54edbe0b) - 112 - - - (0x207c9054, 0x3c841b63) - 528 - - - (0x4e7b798a, 0x183beafb) - (0x5de31172, 0xa1304456) - - - (0xc46b3d00, 0x3e0454e1) - (0x00000000, 0x002bbddf) - - - - - (0x000063a5, 0x0000197d) - Target Selection - (0x426163d1, 0x324237b0) - - - (0x5ba36127, 0x195feae1) - Input signal - - - (0x6f752dd0, 0x082a321e) - Input stimulations - - - - - (0x5ba36127, 0x195feae1) - Epoched signal - - - - - (0x512a166f, 0x5c3ef83f) - Epoch duration (in sec) - 1 - 0.6 - false - - - (0x512a166f, 0x5c3ef83f) - Epoch offset (in sec) - 0.5 - 0 - false - - - (0x2c132d6e, 0x44ab0d97) - Stimulation to epoch from - OVTK_GDF_VEP - OVTK_StimulationId_Target - false - - - - - (0x1fa7a38f, 0x54edbe0b) - 112 - - - (0x207c9054, 0x3c841b63) - 336 - - - (0x4e7b798a, 0x183beafb) - (0x5de31172, 0xa1304456) - - - (0xc46b3d00, 0x3e0454e1) - (0x00000000, 0x002b4e91) - - - - - (0x000078d0, 0x000029bc) - Epoch average - (0x21283d9f, 0xe76ff640) - - - (0x5ba36127, 0x195feae1) - Input epochs - - - - - (0x5ba36127, 0x195feae1) - Averaged epochs - - - - - (0x6530bdb1, 0xd057bbfe) - Averaging type - Epoch block average - Epoch block average - false - - - (0x007deef9, 0x2f3e95c6) - Epoch count - 4 - 1 - false - - - - - (0x1fa7a38f, 0x54edbe0b) - 176 - - - (0x207c9054, 0x3c841b63) - 336 - - - (0x30a4e5c9, 0x83502953) - - - - (0x4e7b798a, 0x183beafb) - (0xb73cee83, 0xf7215d60) - - - (0x527ad68d, 0x16d746a0) - - - - (0x8d21ff41, 0xdf6afe7e) - ${Player_ScenarioDirectory}/cfg/p300-epoch-average.cfg - - - (0xc46b3d00, 0x3e0454e1) - (0x00000000, 0x002b5470) - - - - - (0x000078f9, 0x000063eb) - xDAWN Spatial Filter - (0xdd332c6c, 0x195b4fd4) - - - (0x5ba36127, 0x195feae1) - Input Signal - - - - - (0x5ba36127, 0x195feae1) - Output Signal - - - - - (0x79a9edeb, 0x245d83fc) - Spatial Filter Coefficients - 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 - 9.970221e-001 -3.729500e-002 -1.177390e-002 2.814447e-002 -3.772446e-003 3.371324e-002 -5.480030e-003 8.893039e-003 -1.565213e-002 -9.956694e-003 -2.347757e-002 -2.312669e-003 -1.847227e-002 -7.550644e-004 -8.423513e-003 3.243223e-002 2.079848e-002 5.079737e-001 -2.835127e-002 8.259231e-002 -3.621803e-001 -2.004259e-001 -2.432480e-001 -1.861558e-001 -3.798139e-001 9.614762e-002 3.407766e-001 -2.158597e-001 3.720552e-001 7.500469e-002 -8.628774e-002 -3.182367e-002 5.923482e-002 4.124707e-001 2.083913e-001 -2.629501e-001 2.023081e-001 -2.658446e-001 4.022738e-001 -1.785569e-001 4.450742e-001 3.549239e-001 1.550204e-002 3.750389e-002 3.114249e-002 9.273764e-002 -7.093797e-002 -2.610929e-001 - false - - - (0x007deef9, 0x2f3e95c6) - Number of Output Channels - 4 - 3 - false - - - (0x007deef9, 0x2f3e95c6) - Number of Input Channels - 4 - 16 - false - - - (0x330306dd, 0x74a95f98) - Filter matrix file - - - false - - - - - (0x1fa7a38f, 0x54edbe0b) - -32 - - - (0x207c9054, 0x3c841b63) - 304 - - - (0x30a4e5c9, 0x83502953) - - - - (0x4e7b798a, 0x183beafb) - (0x81db9bf9, 0xf1cf4ed7) - - - (0x527ad68d, 0x16d746a0) - - - - (0x8d21ff41, 0xdf6afe7e) - ${SPATIAL_FILTER_CONFIG} - - - (0xc46b3d00, 0x3e0454e1) - (0x00000000, 0x002b601f) - - - (0xc80ce8af, 0xf699f813) - 1 - - - (0xce18836a, 0x9c0eb403) - 3 - - - (0xcfad85b0, 0x7c6d841c) - 1 - - - - - (0x00007b56, 0x000033f9) - Epoch average - (0x21283d9f, 0xe76ff640) - - - (0x5ba36127, 0x195feae1) - Input epochs - - - - - (0x5ba36127, 0x195feae1) - Averaged epochs - - - - - (0x6530bdb1, 0xd057bbfe) - Averaging type - Epoch block average - Epoch block average - false - - - (0x007deef9, 0x2f3e95c6) - Epoch count - 4 - 1 - false - - - - - (0x1fa7a38f, 0x54edbe0b) - 176 - - - (0x207c9054, 0x3c841b63) - 528 - - - (0x30a4e5c9, 0x83502953) - - - - (0x4e7b798a, 0x183beafb) - (0xb73cee83, 0xf7215d60) - - - (0x527ad68d, 0x16d746a0) - - - - (0x8d21ff41, 0xdf6afe7e) - ${Player_ScenarioDirectory}/cfg/p300-epoch-average.cfg - - - (0xc46b3d00, 0x3e0454e1) - (0x00000000, 0x002c2168) - - - - - (0x0a5a6a4a, 0x1d92a778) - Classifier trainer - (0xf3dae8a8, 0x3b444154) - - - (0x6f752dd0, 0x082a321e) - Stimulations - - - (0x17341935, 0x152ff448) - Features for class 1 - - - (0x17341935, 0x152ff448) - Features for class 2 - - - - - (0x6f752dd0, 0x082a321e) - Train-completed Flag - - - - - (0x2c132d6e, 0x44ab0d97) - Train trigger - OVTK_StimulationId_Train - ${CLASSIFIER_TRAIN_TRIGGER} - false - - - (0x330306dd, 0x74a95f98) - Filename to save configuration to - ${Path_UserData}/my-classifier.xml - ${CLASSIFIER_CONFIG} - false - - - (0xbe9eba5c, 0xa8415d37) - Multiclass strategy to apply - Native - ${MULTICLASS_STRATEGY} - false - - - (0x2c132d6e, 0x44ab0d97) - Class 1 label - OVTK_StimulationId_Label_01 - ${CLASS_1} - false - - - (0x2c132d6e, 0x44ab0d97) - Class 2 label - OVTK_StimulationId_Label_02 - ${CLASS_2} - false - - - (0xd765a736, 0xed708c65) - Algorithm to use - Linear Discrimimant Analysis (LDA) - ${ALGORITHM} - false - - - (0x2cdb2f0b, 0x12f231ea) - Use shrinkage - false - ${USE_SHRINKAGE} - false - - - (0x512a166f, 0x5c3ef83f) - Shrinkage coefficient (-1 == auto) - -1.000000 - ${SHRINKAGE_COEFFICIENT} - false - - - (0x2cdb2f0b, 0x12f231ea) - Shrinkage: Force diagonal cov (DDA) - false - ${SHRINKAGE_FORCE_DIAGONAL_COV} - false - - - (0x007deef9, 0x2f3e95c6) - Number of partitions for k-fold cross-validation test - 10 - ${N_PARTITIONS} - false - - - (0x2cdb2f0b, 0x12f231ea) - Balance classes - false - ${CLASS_BALANCE} - false - - - - - (0x1fa7a38f, 0x54edbe0b) - 336 - - - (0x207c9054, 0x3c841b63) - 448 - - - (0x4e7b798a, 0x183beafb) - (0x9de21779, 0x37776c89) - - - (0xc73e83ec, 0xf855c5bc) - false - - - (0xc80ce8af, 0xf699f813) - 1 - - - (0xce18836a, 0x9c0eb403) - 6 - - - (0xcfad85b0, 0x7c6d841c) - 3 - - - (0xfba64161, 0x65304e21) - - - - - - - - (0x00000192, 0x0000714e) - - (0x00001f83, 0x00004e32) - 1 - - - (0x000078f9, 0x000063eb) - 0 - - - - (0x00001717, 0x00003cf9) - - (0x000078d0, 0x000029bc) - 0 - - - (0x00000b2d, 0x00006d61) - 0 - - - - (0x00004674, 0x000061af) - - (0x00007b56, 0x000033f9) - 0 - - - (0x00000d41, 0x000013b7) - 0 - - - - (0x0ac1c4d1, 0x0a9429d6) - - (0x000063a5, 0x0000197d) - 0 - - - (0x000078d0, 0x000029bc) - 0 - - - - (0x0f719dbe, 0x6b9207ad) - - (0x000078f9, 0x000063eb) - 0 - - - (0x00002f94, 0x00000342) - 0 - - - - (0x175e412c, 0x0692f4ee) - - (0x00000d41, 0x000013b7) - 0 - - - (0x0a5a6a4a, 0x1d92a778) - 2 - - - - (0x26545f2f, 0x4e793786) - - (0x000078f9, 0x000063eb) - 0 - - - (0x000063a5, 0x0000197d) - 0 - - - - (0x26dbc15a, 0x2ae965d4) - - (0x00001f83, 0x00004e32) - 2 - - - (0x000063a5, 0x0000197d) - 1 - - - - (0x33c4df2d, 0x7548b76f) - - (0x00001f83, 0x00004e32) - 2 - - - (0x00002f94, 0x00000342) - 1 - - - - (0x431fd3b9, 0x43484889) - - (0x00002f94, 0x00000342) - 0 - - - (0x00007b56, 0x000033f9) - 0 - - - - (0x5a67b7d8, 0x1cf07f9a) - - (0x00001f83, 0x00004e32) - 2 - - - (0x0a5a6a4a, 0x1d92a778) - 0 - - - - (0x616495af, 0x5c020b32) - - (0x0a5a6a4a, 0x1d92a778) - 0 - - - (0x00002c8b, 0x000001d5) - 0 - - - - (0x63fa63da, 0x0e447c5b) - - (0x00000b2d, 0x00006d61) - 0 - - - (0x0a5a6a4a, 0x1d92a778) - 1 - - - - - - (0x00005277, 0x00007fbe) - <u><b><big>Scenario Overview</big></b></u> - -This scenario should be used to train -the LDA classifier. - -At the end of the training, you will have an estimation -of the classifier performance printed in the console. -If this performance is lower than 70%, just run a new -<i>4-online</i> session to have better results. - -<u><b>Note:</b></u> in order to run this scenario, -the spatial filter should have been trained using -<i>2-train-xDAWN</i> ! - - - (0x473d9a43, 0x97fc0a97) - 688 - - - (0x7234b86b, 0x2b8651a5) - -64 - - - - - - - (0x0000775c, 0x000078ff) - (0x3bcce5d2, 0x43f2d968) - [] - - - - - (0x790d75b8, 0x3bb90c33) - Yann Renard - - - (0x8c1fc55b, 0x7b433dc2) - - - - (0x9f5c4075, 0x4a0d3666) - LDA Classifier Trainer - - - (0xf36a1567, 0xd13c53da) - http://openvibe.inria.fr/p300-speller-xdawn/ - - - (0xf6b2e3fa, 0x7bd43926) - xDAWN P300 Speller - - - (0xf8034a49, 0x8b3f37cc) - INRIA - - - \ No newline at end of file diff --git a/scenarios/p300-tactile-4-online.xml b/scenarios/p300-tactile-4-online.xml deleted file mode 100644 index 8ec6b05..0000000 --- a/scenarios/p300-tactile-4-online.xml +++ /dev/null @@ -1,1772 +0,0 @@ - - 2 - OpenViBE Designer - 3.3.0 - - - - - - (0x00002bb3, 0x0000133c) - Acquisition client - (0x35d225cb, 0x3e6e3a5f) - - - (0x403488e7, 0x565d70b6) - Experiment information - - - (0x5ba36127, 0x195feae1) - Signal stream - - - (0x6f752dd0, 0x082a321e) - Stimulations - - - (0x013df452, 0xa3a8879a) - Channel localisation - - - (0x6ab26b81, 0x0f8c02f3) - Channel units - - - - - (0x79a9edeb, 0x245d83fc) - Acquisition server hostname - ${AcquisitionServer_HostName} - ${ACQUISITION_SERVER_HOST_NAME} - false - - - (0x007deef9, 0x2f3e95c6) - Acquisition server port - 1024 - ${ACQUISITION_SERVER_PORT} - false - - - - - (0x1fa7a38f, 0x54edbe0b) - -224 - - - (0x207c9054, 0x3c841b63) - 592 - - - (0x4e7b798a, 0x183beafb) - (0x0d4656c0, 0xc95b1fa8) - - - (0xc46b3d00, 0x3e0454e1) - (0x00000000, 0x007036bf) - - - (0xc73e83ec, 0xf855c5bc) - false - - - (0xc80ce8af, 0xf699f813) - 5 - - - (0xce18836a, 0x9c0eb403) - 2 - - - - - (0x00003d0e, 0x000025ef) - Player Controller - (0x5f426dce, 0x08456e13) - - - (0x6f752dd0, 0x082a321e) - Stimulations - - - - - (0x2c132d6e, 0x44ab0d97) - Stimulation name - OVTK_StimulationId_Label_00 - OVTK_StimulationId_ExperimentStop - false - - - (0xcc14d8d6, 0xf27ecb73) - Action to perform - Pause - Stop - false - - - - - (0x1fa7a38f, 0x54edbe0b) - 240 - - - (0x207c9054, 0x3c841b63) - 896 - - - (0x4e7b798a, 0x183beafb) - (0x568d148e, 0x650792b3) - - - (0xc73e83ec, 0xf855c5bc) - false - - - (0xce18836a, 0x9c0eb403) - 2 - - - (0xcfad85b0, 0x7c6d841c) - 1 - - - - - (0x00003dec, 0x00004c7c) - Stimulation based epoching - (0x426163d1, 0x324237b0) - - - (0x5ba36127, 0x195feae1) - Input signal - - - (0x6f752dd0, 0x082a321e) - Input stimulations - - - - - (0x5ba36127, 0x195feae1) - Epoched signal - - - - - (0x512a166f, 0x5c3ef83f) - Epoch duration (in sec) - 1 - 0.6 - false - - - (0x512a166f, 0x5c3ef83f) - Epoch offset (in sec) - 0.5 - 0 - false - - - (0x2c132d6e, 0x44ab0d97) - Stimulation to epoch from - OVTK_GDF_VEP - OVTK_StimulationId_VisualStimulationStart - false - - - - - (0x1fa7a38f, 0x54edbe0b) - 208 - - - (0x207c9054, 0x3c841b63) - 512 - - - (0x4e7b798a, 0x183beafb) - (0x5de31172, 0xa1304456) - - - (0xc46b3d00, 0x3e0454e1) - (0x00000000, 0x005ced91) - - - (0xc73e83ec, 0xf855c5bc) - false - - - (0xc80ce8af, 0xf699f813) - 2 - - - (0xce18836a, 0x9c0eb403) - 3 - - - (0xcfad85b0, 0x7c6d841c) - 2 - - - - - (0x0000445b, 0x000068e3) - P300 accumulator - (0x0b5a2787, 0x02750621) - - - (0x6f752dd0, 0x082a321e) - New input - - - (0x6f752dd0, 0x082a321e) - New input(1) - - - - - (0x6f752dd0, 0x082a321e) - Stimulations - - - - - (0xb0d0db45, 0x49cbc34a) - Lua Script - - ${SCRIPT_P300_ACCUMULATOR} - false - - - (0x2c132d6e, 0x44ab0d97) - Row stimulation base - OVTK_StimulationId_Label_01 - ${ROW_BASE} - false - - - (0x007deef9, 0x2f3e95c6) - Number of Tactilos - OVTK_StimulationId_Label_07 - ${N_TACTILOS} - false - - - (0x2c132d6e, 0x44ab0d97) - Segment start - OVTK_StimulationId_SegmentStart - OVTK_StimulationId_TrialStart - false - - - (0x2c132d6e, 0x44ab0d97) - Segment stop - OVTK_StimulationId_SegmentStop - OVTK_StimulationId_TrialStop - false - - - - - (0x17ee7c08, 0x94c14893) - - - - (0x1fa7a38f, 0x54edbe0b) - 480 - - - (0x207c9054, 0x3c841b63) - 640 - - - (0x4e7b798a, 0x183beafb) - (0xd6e3f48b, 0xbee3523a) - - - (0x61d11811, 0x71e65362) - - - - (0xc46b3d00, 0x3e0454e1) - (0x00000000, 0x0304fb88) - - - (0xc73e83ec, 0xf855c5bc) - false - - - (0xc80ce8af, 0xf699f813) - 1 - - - (0xce18836a, 0x9c0eb403) - 1 - - - (0xf191c1c8, 0xa0123976) - - - - (0xfba64161, 0x65304e21) - - - - - - (0x000046bc, 0x00003f08) - Temporal Filter - (0xb4f9d042, 0x9d79f2e5) - - - (0x5ba36127, 0x195feae1) - Input signal - - - - - (0x5ba36127, 0x195feae1) - Output signal - - - - - (0xfa20178e, 0x4cba62e9) - Filter Type - Band Pass - ${FILTER_TYPE} - false - - - (0x007deef9, 0x2f3e95c6) - Filter Order - 4 - ${FILTER_ORDER} - false - - - (0x512a166f, 0x5c3ef83f) - Low Cut-off Frequency (Hz) - 1 - ${LOW_CUT_FREQUENCY} - false - - - (0x512a166f, 0x5c3ef83f) - High Cut-off Frequency (Hz) - 40 - ${HIGH_CUT_FREQUENCY} - false - - - - - (0x17ee7c08, 0x94c14893) - - - - (0x1fa7a38f, 0x54edbe0b) - -32 - - - (0x207c9054, 0x3c841b63) - 480 - - - (0x4e7b798a, 0x183beafb) - (0x6a7c1e9b, 0x6b00b5c5) - - - (0xc80ce8af, 0xf699f813) - 1 - - - (0xce18836a, 0x9c0eb403) - 4 - - - (0xcfad85b0, 0x7c6d841c) - 1 - - - - - (0x0000470b, 0x00001b1d) - Tactile Stimulator - (0x0b5a2787, 0x02750621) - - - (0x6f752dd0, 0x082a321e) - Stimulations - - - - - (0xb0d0db45, 0x49cbc34a) - Lua Script - - ${SCRIPT_TACTILE_STIMULATOR} - false - - - (0x00000000, 0xbae13066) - (0x2c132d6e, 0x44ab0d97) - Row Stimulation Base - OVTK_StimulationId_Label_01 - ${ROW_BASE} - false - - - (0x00000000, 0xc152613d) - (0x007deef9, 0x2f3e95c6) - Number of Tactilos - 6 - ${N_TACTILOS} - false - - - (0x00000000, 0xa0308929) - (0x007deef9, 0x2f3e95c6) - Number of Repetitions - 6 - ${N_REPETITIONS} - false - - - (0x00000000, 0xcde95a6f) - (0x007deef9, 0x2f3e95c6) - Number of Trials - 6 - ${N_TRIALS} - false - - - (0x00000000, 0x9b3f9b7b) - (0x512a166f, 0x5c3ef83f) - Stimulus Duration (in sec) - 0.2 - ${STIM_DURATION} - false - - - (0x00000000, 0x583ad367) - (0x512a166f, 0x5c3ef83f) - No Stimulus Duration (in sec) - 0.1 - ${NO_STIM_DURATION} - false - - - (0x00000000, 0xfc1c2fb6) - (0x512a166f, 0x5c3ef83f) - Inter-Repetition Delay (in sec) - 1.0 - ${INTER_REPETITION_DELAY} - false - - - (0x00000000, 0x0d9a1e18) - (0x512a166f, 0x5c3ef83f) - Inter-Trial Delay (in sec) - 3.0 - ${INTER_TRIAL_DELAY} - false - - - (0x00000000, 0xaeefd500) - (0x2c132d6e, 0x44ab0d97) - Start Stimulation - OVTK_StimulationId_Label_00 - ${START_STIMULATION} - false - - - (0x00000000, 0xef5eb0e5) - (0x2cdb2f0b, 0x12f231ea) - Free Spelling - false - ${FREE_SPELLING} - false - - - (0x00000000, 0x4ead155d) - (0x007deef9, 0x2f3e95c6) - Start Delay - 20 - ${START_DELAY} - false - - - - - (0x17ee7c08, 0x94c14893) - - - - (0x1fa7a38f, 0x54edbe0b) - 336 - - - (0x207c9054, 0x3c841b63) - 352 - - - (0x4e7b798a, 0x183beafb) - (0xd6e3f48b, 0xbee3523a) - - - (0x61d11811, 0x71e65362) - - - - (0xc80ce8af, 0xf699f813) - 1 - - - (0xce18836a, 0x9c0eb403) - 1 - - - (0xf191c1c8, 0xa0123976) - - - - (0xfba64161, 0x65304e21) - - - - - - (0x00006d0d, 0x000031da) - Tactile Target Generation - (0x0b5a2787, 0x02750621) - - - (0x6f752dd0, 0x082a321e) - New input - - - - - (0x6f752dd0, 0x082a321e) - Stimulations - - - - - (0xb0d0db45, 0x49cbc34a) - Lua Script - - ${SCRIPT_TARGET_GENERATION} - false - - - (0x2c132d6e, 0x44ab0d97) - Row Stimulation Base - OVTK_StimulationId_Label_01 - ${ROW_BASE} - false - - - (0x00000000, 0xeb4fffa2) - (0x007deef9, 0x2f3e95c6) - Number of Tactilos - 6 - ${N_TACTILOS} - false - - - (0xf33dddda, 0xfd2c04a3) - (0x007deef9, 0x2f3e95c6) - Delay Before Sending (in sec) - 2 - ${SEND_DELAY} - false - - - (0xa95b0b1d, 0x12aa8207) - (0x2cdb2f0b, 0x12f231ea) - Free Spelling - false - ${FREE_SPELLING} - false - - - - - (0x17ee7c08, 0x94c14893) - - - - (0x1fa7a38f, 0x54edbe0b) - 496 - - - (0x207c9054, 0x3c841b63) - 432 - - - (0x4e7b798a, 0x183beafb) - (0xd6e3f48b, 0xbee3523a) - - - (0x61d11811, 0x71e65362) - - - - (0xc46b3d00, 0x3e0454e1) - (0x00000000, 0x0334c6b7) - - - (0xc80ce8af, 0xf699f813) - 1 - - - (0xce18836a, 0x9c0eb403) - 1 - - - (0xf191c1c8, 0xa0123976) - - - - (0xfba64161, 0x65304e21) - - - - - - (0x00007e4e, 0x00006b7c) - EEG Signal - (0x0055be5f, 0x087bdd12) - - - (0x5ba36127, 0x195feae1) - Data - - - (0x6f752dd0, 0x082a321e) - Stimulations - - - (0x6ab26b81, 0x0f8c02f3) - Channel Units - - - - - (0x5de046a6, 0x086340aa) - Display Mode - Scan - Scan - false - - - (0x33a30739, 0x00d5299b) - Auto vertical scale - Per channel - Per channel - false - - - (0x512a166f, 0x5c3ef83f) - Scale refresh interval (secs) - 5 - 0.000000 - false - - - (0x512a166f, 0x5c3ef83f) - Vertical Scale - 100 - 100 - false - - - (0x512a166f, 0x5c3ef83f) - Vertical Offset - 0 - 0 - false - - - (0x512a166f, 0x5c3ef83f) - Time Scale - 10 - 5.000000 - false - - - (0x2cdb2f0b, 0x12f231ea) - Horizontal ruler - true - true - false - - - (0x2cdb2f0b, 0x12f231ea) - Vertical ruler - false - false - false - - - (0x2cdb2f0b, 0x12f231ea) - Multiview - false - false - false - - - - - (0x1fa7a38f, 0x54edbe0b) - 304 - - - (0x207c9054, 0x3c841b63) - 832 - - - (0x4e7b798a, 0x183beafb) - (0x92c056a7, 0x2dc71aff) - - - (0x527ad68d, 0x16d746a0) - - - - (0xc73e83ec, 0xf855c5bc) - false - - - (0xce18836a, 0x9c0eb403) - 9 - - - (0xcfad85b0, 0x7c6d841c) - 3 - - - - - (0x008f57e1, 0x2790537b) - Generic stream writer - (0x09c92218, 0x7c1216f8) - - - (0x403488e7, 0x565d70b6) - Input stream 1 - - - (0x5ba36127, 0x195feae1) - Input stream 2 - - - (0x6f752dd0, 0x082a321e) - Input stream 3 - - - - - (0x330306dd, 0x74a95f98) - Filename - - ${OUTPUT_FILE_NAME} - false - - - (0x2cdb2f0b, 0x12f231ea) - Use compression - false - false - false - - - - - (0x1fa7a38f, 0x54edbe0b) - 368 - - - (0x207c9054, 0x3c841b63) - 768 - - - (0x4e7b798a, 0x183beafb) - (0x89a08108, 0xc8d1fac1) - - - (0x527ad68d, 0x16d746a0) - - - - (0xc46b3d00, 0x3e0454e1) - (0x00000000, 0x007b2629) - - - (0xfba64161, 0x65304e21) - - - - - - (0x09c41dd7, 0x09f2e37b) - Epoch average - (0x21283d9f, 0xe76ff640) - - - (0x5ba36127, 0x195feae1) - Input epochs - - - - - (0x5ba36127, 0x195feae1) - Averaged epochs - - - - - (0x6530bdb1, 0xd057bbfe) - Averaging type - Epoch block average - Epoch block average - false - - - (0x007deef9, 0x2f3e95c6) - Epoch count - 4 - 1 - false - - - - - (0x1fa7a38f, 0x54edbe0b) - 272 - - - (0x207c9054, 0x3c841b63) - 512 - - - (0x30a4e5c9, 0x83502953) - - - - (0x4e7b798a, 0x183beafb) - (0xb73cee83, 0xf7215d60) - - - (0x527ad68d, 0x16d746a0) - - - - (0x8d21ff41, 0xdf6afe7e) - ${Player_ScenarioDirectory}/cfg/p300-epoch-average.cfg - - - (0xc46b3d00, 0x3e0454e1) - (0x00000000, 0x000eaa12) - - - - - (0x0e30a73f, 0x7ae6d95a) - Feature aggregator - (0x00682417, 0x453635f9) - - - (0x544a003e, 0x6dcba5f6) - Input stream 1 - - - - - (0x17341935, 0x152ff448) - Feature vector stream - - - - - (0x1fa7a38f, 0x54edbe0b) - 336 - - - (0x207c9054, 0x3c841b63) - 512 - - - (0x4e7b798a, 0x183beafb) - (0xb5d15cc9, 0x6c8c28fb) - - - (0xc46b3d00, 0x3e0454e1) - (0x00000000, 0x000f9a38) - - - (0xc80ce8af, 0xf699f813) - 1 - - - (0xcfad85b0, 0x7c6d841c) - 1 - - - (0xfba64161, 0x65304e21) - - - - - - (0x1d17831e, 0x729cda7c) - Tactilo Controller - (0x823bbe28, 0x0daf2111) - - - (0x6f752dd0, 0x082a321e) - StimInput - - - - - (0x6f752dd0, 0x082a321e) - StimOutput - - - - - (0x79a9edeb, 0x245d83fc) - Serial Port Name - /dev/ttyACM0 - ${SERIAL_PORT} - false - - - (0x2c132d6e, 0x44ab0d97) - Row Stimulation Base - OVTK_StimulationId_Label_01 - ${ROW_BASE} - false - - - (0x007deef9, 0x2f3e95c6) - Number of Tactilos - 6 - ${N_TACTILOS} - false - - - - - (0x1fa7a38f, 0x54edbe0b) - 496 - - - (0x207c9054, 0x3c841b63) - 272 - - - (0x4e7b798a, 0x183beafb) - (0xa638e513, 0x9a753d4b) - - - (0x666fffff, 0x666fffff) - - - - (0xc80ce8af, 0xf699f813) - 1 - - - (0xce18836a, 0x9c0eb403) - 3 - - - (0xcfad85b0, 0x7c6d841c) - 1 - - - - - (0x28b5e192, 0x37431137) - Classifier processor - (0x5fe23d17, 0x95b0452c) - - - (0x17341935, 0x152ff448) - Features - - - (0x6f752dd0, 0x082a321e) - Commands - - - - - (0x6f752dd0, 0x082a321e) - Labels - - - (0x544a003e, 0x6dcba5f6) - Hyperplane distance - - - (0x544a003e, 0x6dcba5f6) - Probability values - - - - - (0x330306dd, 0x74a95f98) - Filename to load configuration from - - ${CLASSIFIER_CONFIG} - false - - - - - (0x1fa7a38f, 0x54edbe0b) - 400 - - - (0x207c9054, 0x3c841b63) - 576 - - - (0x4e7b798a, 0x183beafb) - (0xa6c8e548, 0x9e3e405b) - - - (0xc73e83ec, 0xf855c5bc) - false - - - (0xc80ce8af, 0xf699f813) - 3 - - - (0xce18836a, 0x9c0eb403) - 1 - - - (0xcfad85b0, 0x7c6d841c) - 2 - - - - - (0x2ae25693, 0x5aacdae0) - P300TactileVisualization - (0xd463df86, 0x7fbfdd81) - - - (0x6f752dd0, 0x082a321e) - Sequence - - - (0x6f752dd0, 0x082a321e) - Target - - - (0x6f752dd0, 0x082a321e) - Result - - - - - (0x6f752dd0, 0x082a321e) - Result - - - - - (0x330306dd, 0x74a95f98) - Interface Filename - /ui/p300-tactile-6.ui - ${TACTILE_UI} - false - - - (0x2c132d6e, 0x44ab0d97) - Row Stimulation Base - OVTK_StimulationId_Label_01 - ${ROW_BASE} - false - - - (0x007deef9, 0x2f3e95c6) - Number of Tactilos - 6 - ${N_TACTILOS} - false - - - (0x2cdb2f0b, 0x12f231ea) - Free Spelling - false - ${FREE_SPELLING} - false - - - - - (0x1fa7a38f, 0x54edbe0b) - 640 - - - (0x207c9054, 0x3c841b63) - 368 - - - (0x4e7b798a, 0x183beafb) - (0x4b4912a1, 0xc1409d95) - - - (0x666fffff, 0x666fffff) - - - - (0xc80ce8af, 0xf699f813) - 1 - - - (0xce18836a, 0x9c0eb403) - 4 - - - (0xcfad85b0, 0x7c6d841c) - 3 - - - - - (0x40e41bf9, 0x5c44b1b1) - Signal Decimation - (0x012f4bea, 0x3be37c66) - - - (0x5ba36127, 0x195feae1) - Input signal - - - - - (0x5ba36127, 0x195feae1) - Output signal - - - - - (0x007deef9, 0x2f3e95c6) - Decimation factor - 8 - ${SIGNAL_DECIMATION_FACTOR} - false - - - - - (0x1fa7a38f, 0x54edbe0b) - 32 - - - (0x207c9054, 0x3c841b63) - 480 - - - (0x4e7b798a, 0x183beafb) - (0x5082af41, 0xd0fbf4cb) - - - (0xc46b3d00, 0x3e0454e1) - (0x00000000, 0x002cae02) - - - - - (0x4ff47ca1, 0x133bd33c) - EEG Channel Selection - (0x361722e8, 0x311574e8) - - - (0x5ba36127, 0x195feae1) - Input signal - - - - - (0x5ba36127, 0x195feae1) - Output signal - - - - - (0x79a9edeb, 0x245d83fc) - Channel List - : - ${CHANNEL_SELECTION} - false - - - (0x3bcf9e67, 0x0c23994d) - Action - Select - Select - false - - - (0x666f25e9, 0x3e5738d6) - Channel Matching Method - Smart - Index - false - - - - - (0x1fa7a38f, 0x54edbe0b) - -112 - - - (0x207c9054, 0x3c841b63) - 480 - - - (0x30a4e5c9, 0x83502953) - - - - (0x4e7b798a, 0x183beafb) - (0x277826e1, 0xa30a3bd0) - - - (0x527ad68d, 0x16d746a0) - - - - (0xc80ce8af, 0xf699f813) - 1 - - - (0xce18836a, 0x9c0eb403) - 3 - - - (0xcfad85b0, 0x7c6d841c) - 1 - - - - - (0x6d03daab, 0x55fdea78) - xDAWN Spatial Filter - (0xdd332c6c, 0x195b4fd4) - - - (0x5ba36127, 0x195feae1) - Input Signal - - - - - (0x5ba36127, 0x195feae1) - Output Signal - - - - - (0x79a9edeb, 0x245d83fc) - Spatial Filter Coefficients - 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 - 1;0;0;0;0;1;0;0;0;0;1;0;0;0;0;1 - false - - - (0x007deef9, 0x2f3e95c6) - Number of Output Channels - 4 - 4 - false - - - (0x007deef9, 0x2f3e95c6) - Number of Input Channels - 4 - 4 - false - - - (0x330306dd, 0x74a95f98) - Filter matrix file - - - false - - - - - (0x1fa7a38f, 0x54edbe0b) - 112 - - - (0x207c9054, 0x3c841b63) - 480 - - - (0x30a4e5c9, 0x83502953) - - - - (0x4e7b798a, 0x183beafb) - (0x81db9bf9, 0xf1cf4ed7) - - - (0x527ad68d, 0x16d746a0) - - - - (0x8d21ff41, 0xdf6afe7e) - ${SPATIAL_FILTER_CONFIG} - - - (0xc80ce8af, 0xf699f813) - 1 - - - (0xce18836a, 0x9c0eb403) - 3 - - - (0xcfad85b0, 0x7c6d841c) - 1 - - - - - (0x6f54afd0, 0x5f2e0f65) - Identity - (0x5dffe431, 0x35215c50) - - - (0x5ba36127, 0x195feae1) - Input stream 1 - - - (0x6f752dd0, 0x082a321e) - Input stream 2 - - - - - (0x5ba36127, 0x195feae1) - Output stream 1 - - - (0x6f752dd0, 0x082a321e) - Output stream 2 - - - - - (0x17ee7c08, 0x94c14893) - - - - (0x1fa7a38f, 0x54edbe0b) - 112 - - - (0x207c9054, 0x3c841b63) - 640 - - - (0x30a4e5c9, 0x83502953) - - - - (0x4e7b798a, 0x183beafb) - (0xa8ffe2a3, 0x27038f03) - - - (0x527ad68d, 0x16d746a0) - - - - (0xc46b3d00, 0x3e0454e1) - (0x00000000, 0x005f48d2) - - - (0xfba64161, 0x65304e21) - - - - - - - - (0x000077c1, 0x00007142) - - (0x0000470b, 0x00001b1d) - 0 - - - (0x00006d0d, 0x000031da) - 0 - - - - (0x00f1a11e, 0x4a813bb8) - - (0x09c41dd7, 0x09f2e37b) - 0 - - - (0x0e30a73f, 0x7ae6d95a) - 0 - - - - (0x03185e43, 0x2d6b648b) - - (0x00002bb3, 0x0000133c) - 1 - - - (0x4ff47ca1, 0x133bd33c) - 0 - - - - (0x0d9c8913, 0x36d55346) - - (0x6f54afd0, 0x5f2e0f65) - 1 - - - (0x00003dec, 0x00004c7c) - 1 - - - - (0x11e063ca, 0x16409346) - - (0x6f54afd0, 0x5f2e0f65) - 1 - - - (0x008f57e1, 0x2790537b) - 2 - - - - (0x136dcee0, 0x20dbb005) - - (0x28b5e192, 0x37431137) - 0 - - - (0x0000445b, 0x000068e3) - 0 - - - - (0x1b32ea4c, 0x7ba0dd1f) - - (0x00006d0d, 0x000031da) - 0 - - - (0x2ae25693, 0x5aacdae0) - 1 - - - - (0x1cd8fa10, 0x3aaa591e) - - (0x1d17831e, 0x729cda7c) - 0 - - - (0x2ae25693, 0x5aacdae0) - 0 - - - - (0x1e3b6579, 0x3618d582) - - (0x0000445b, 0x000068e3) - 0 - - - (0x2ae25693, 0x5aacdae0) - 2 - - - - (0x2dd9e520, 0x7fb52ca6) - - (0x6f54afd0, 0x5f2e0f65) - 1 - - - (0x00003d0e, 0x000025ef) - 0 - - - - (0x365ba47b, 0x4e08a9a6) - - (0x6f54afd0, 0x5f2e0f65) - 1 - - - (0x00007e4e, 0x00006b7c) - 1 - - - - (0x3aa31050, 0x44840533) - - (0x00003dec, 0x00004c7c) - 0 - - - (0x09c41dd7, 0x09f2e37b) - 0 - - - - (0x3ccbcbed, 0x529f3e1d) - - (0x0e30a73f, 0x7ae6d95a) - 0 - - - (0x28b5e192, 0x37431137) - 0 - - - - (0x58177d03, 0x27416662) - - (0x40e41bf9, 0x5c44b1b1) - 0 - - - (0x6f54afd0, 0x5f2e0f65) - 0 - - - - (0x5f9d3b5e, 0x40ac0989) - - (0x000046bc, 0x00003f08) - 0 - - - (0x40e41bf9, 0x5c44b1b1) - 0 - - - - (0x650a90ae, 0x221065dd) - - (0x6f54afd0, 0x5f2e0f65) - 0 - - - (0x00007e4e, 0x00006b7c) - 0 - - - - (0x6b1a8e7e, 0x29bad5ad) - - (0x6f54afd0, 0x5f2e0f65) - 0 - - - (0x008f57e1, 0x2790537b) - 1 - - - - (0x6f474af0, 0x51e7edd2) - - (0x6f54afd0, 0x5f2e0f65) - 1 - - - (0x0000445b, 0x000068e3) - 1 - - - - (0x734979ea, 0x23bfc8a8) - - (0x6d03daab, 0x55fdea78) - 0 - - - (0x00003dec, 0x00004c7c) - 0 - - - - (0x7513c06a, 0x64166fa5) - - (0x0000470b, 0x00001b1d) - 0 - - - (0x1d17831e, 0x729cda7c) - 0 - - - - (0x798e3c9f, 0x6cbe6777) - - (0x40e41bf9, 0x5c44b1b1) - 0 - - - (0x6d03daab, 0x55fdea78) - 0 - - - - (0x7b323c0e, 0x1ee91fad) - - (0x4ff47ca1, 0x133bd33c) - 0 - - - (0x000046bc, 0x00003f08) - 0 - - - - (0x7cd9ce5c, 0x13f0d05b) - - (0x00002bb3, 0x0000133c) - 2 - - - (0x6f54afd0, 0x5f2e0f65) - 1 - - - - - - (0x0000363f, 0x00001c2b) - The P300 Speller Visualization -sends the markers (stimulations) directly to -Acquisition Server using TCP Tagging. - - - (0x473d9a43, 0x97fc0a97) - 624 - - - (0x7234b86b, 0x2b8651a5) - 640 - - - - - (0x1012e1de, 0x78e57c3e) - The stimulation part of the scenario is -similar to scenario <i>p300-tactile-1-acquisition</i>. - -If set to <i>Free Spelling</i>, -the <i>Target Generation</i> is inactive. - -If set to <i>Copy Spelling</i>, you can train the spatial-filter -and p300-classifier again on the recorded data - - - - (0x473d9a43, 0x97fc0a97) - 64 - - - (0x7234b86b, 0x2b8651a5) - 480 - - - - - (0x3726b6f5, 0x3dea5d78) - <u><b><big>Scenario Overview</big></b></u> - -This scenario can be used online once the -spatial filter and the classifiers are trained. - -Can be used for <i>Copy Spelling</i> to retrain -the <i>spatial filter</i> and <i>classifier</i>, if the -performance doesn't fit the requirements. -Can be used for a <i>Free Spelling</i> Session. - -Spelling automatically starts delayed to the start -of scenario execution. - -First the target Tactilo will vibrate and flash in the -<i>Speller Visualization</i>(Copy Spelling Only). -After that you have to Focus on your chosen -(or the predetermined Target), while all Tactilos -will vibrate (flash) several times. -This will be repeated for a defined number of trials. -After each Trial, the detected Tactilo will be presented -in the <i>Speller Visualization</i> - - - (0x473d9a43, 0x97fc0a97) - 80 - - - (0x7234b86b, 0x2b8651a5) - 0 - - - - - - - (0x0000775c, 0x000078ff) - (0x3bcce5d2, 0x43f2d968) - [{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":2,"height":320,"identifier":"(0x00001d01, 0x00007b57)","name":"OV Tactile Online","parentIdentifier":"(0xffffffff, 0xffffffff)","type":1,"width":477},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00001590, 0x00005323)","index":0,"name":"Tactile Visualization","parentIdentifier":"(0x00001d01, 0x00007b57)","type":2},{"boxIdentifier":"(0xffffffff, 0xffffffff)","childCount":1,"identifier":"(0x00002e00, 0x00003101)","index":1,"name":"EEG Signal","parentIdentifier":"(0x00001d01, 0x00007b57)","type":2},{"boxIdentifier":"(0x2ae25693, 0x5aacdae0)","childCount":0,"identifier":"(0x01033ddc, 0x12635d14)","index":0,"parentIdentifier":"(0x00001590, 0x00005323)","type":3},{"boxIdentifier":"(0x00007e4e, 0x00006b7c)","childCount":0,"identifier":"(0x00001aa9, 0x000006f8)","index":0,"parentIdentifier":"(0x00002e00, 0x00003101)","type":3}] - - - - - (0x790d75b8, 0x3bb90c33) - Jussi T. Lindgren - - - (0x8c1fc55b, 0x7b433dc2) - - - - (0x9f5c4075, 0x4a0d3666) - Online Use - - - (0xf36a1567, 0xd13c53da) - http://openvibe.inria.fr/p300-speller-xdawn/ - - - (0xf6b2e3fa, 0x7bd43926) - xDAWN P300 Speller - - - (0xf8034a49, 0x8b3f37cc) - INRIA - - - \ No newline at end of file diff --git a/scenarios/scripts/p300-tactile-accumulator.lua b/scenarios/scripts/p300-tactile-accumulator.lua deleted file mode 100644 index 94130c2..0000000 --- a/scenarios/scripts/p300-tactile-accumulator.lua +++ /dev/null @@ -1,202 +0,0 @@ - -function arrayMax(a) - if #a == 0 then return nil, nil end - local maxIdx, maxValue = 0, a[0] - for i = 1, (#a -1 ) do - if maxValue < a[i] then - maxIdx, maxValue = i, a[i] - end - end - return maxIdx, maxValue -end - --- For handling target fifo - -List = {} -function List.new () - return {first = 0, last = -1} -end - -function List.pushright (list, value) - local last = list.last + 1 - list.last = last - list[last] = value -end - -function List.popleft (list) - local first = list.first - if first > list.last then - error("list is empty") - end - local value = list[first] - list[first] = nil -- to allow garbage collection - list.first = first + 1 - return value -end - -function List.isempty (list) - if list.first > list.last then - return true - else - return false - end -end - --- this function is called when the box is initialized -function initialize(box) - - dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua") - - row_base = _G[box:get_setting(2)] - n_tactilos = box:get_setting(3) - segment_start = _G[box:get_setting(4)] - segment_stop = _G[box:get_setting(5)] - - col_base = row_base + n_tactilos - - -- 0 inactive, 1 segment started, 2 segment stopped (can vote) - segment_status = 0 - - -- the idea is to push the flash states to the fifo, and when predictions arrive (with some delay), they are matched in oldest-first fashion. - target_fifo = List.new() - - -- box:log("Info", string.format("pop %d %d", id[1], id[2])) - - row_votes = {} - col_votes = {} - - do_debug = false - -end - --- this function is called when the box is uninitialized -function uninitialize(box) - -end - -function process(box) - -- loops until box is stopped - while box:keep_processing() do - - -- first, parse the timeline stream - for stimulation = 1, box:get_stimulation_count(2) do - -- gets the received stimulation - local identifier, date, duration = box:get_stimulation(2, 1) - -- discards it - box:remove_stimulation(2, 1) - - if identifier == segment_start then - if do_debug then - box:log("Info", string.format("Trial start")) - box:log("Info", string.format("Clear votes")) - end - -- zero the votes - col_votes = {} - row_votes = {} - target_fifo = List.new() - -- fixme fixed 20 - for i = 0,20 do - col_votes[i] = 0 - row_votes[i] = 0 - end - segment_status = 1 - end - - -- Does the identifier code a flash? if so, put into fifo - if segment_status == 1 and identifier >= row_base and identifier <= OVTK_StimulationId_LabelEnd then - - -- assume rows before cols - if identifier < col_base then - local t = {"row", identifier - row_base} - List.pushright(target_fifo,t) - if do_debug then - box:log("Info", string.format("Push row target %d", identifier - row_base )) - end - else - local t = {"col", identifier - col_base} - List.pushright(target_fifo,t) - if do_debug then - box:log("Info", string.format("Push col target %d", identifier - col_base )) - end - end - - - end - - if identifier == segment_stop then - if do_debug then - box:log("Info", string.format("Trial stop")) - end - segment_status = 2 - end - - end - - -- then parse the classifications - for stimulation = 1, box:get_stimulation_count(1) do - - -- gets the received stimulation - local identifier, date, duration = box:get_stimulation(1, 1) - -- discards it - box:remove_stimulation(1, 1) - - -- Is it an in-class prediction? - if identifier == OVTK_StimulationId_Target then - local t = List.popleft(target_fifo) - if do_debug then - box:log("Info", string.format("Pred fifo %s %d is target", t[1], t[2])) - end - if t[1]=="row" then - row_votes[t[2]] = row_votes[t[2]] + 1 - else - col_votes[t[2]] = col_votes[t[2]] + 1 - end - end - - if identifier == OVTK_StimulationId_NonTarget then - local t = List.popleft(target_fifo) - if do_debug then - box:log("Info", string.format("Pred fifo %s %d is nontarget", t[1], t[2])) - end - end - - end - - if segment_status == 2 and List.isempty(target_fifo) then - -- output the vote after the segment end when we've matched all predictions - - local maxRowIdx, maxRowValue = arrayMax(row_votes) - local maxColIdx, maxColValue = arrayMax(col_votes) - - if maxRowValue == 0 and maxColValue == 0 then - box:log("Warning", string.format("Classifier predicted 'no p300' for all flashes of the trial")); - end - - if do_debug then - local rowVotes = 0 - local colVotes = 0 - for ir, val in pairs(row_votes) do - rowVotes = rowVotes + val - end - for ir, val in pairs(col_votes) do - colVotes = colVotes + val - end - - box:log("Info", string.format("Vote [%d %d] wt [%d,%d]", maxRowIdx+row_base, maxColIdx+col_base, maxRowValue, maxColValue)) - box:log("Info", string.format(" Total [%d %d]", rowVotes, colVotes)) - end - - - - local now = box:get_current_time() - - box:send_stimulation(1, maxRowIdx + row_base, now, 0) - -- box:send_stimulation(2, maxColIdx + col_base, now, 0) - - segment_status = 0 - end - - box:sleep() - end -end - diff --git a/scenarios/scripts/p300-tactile-filter-flash.lua b/scenarios/scripts/p300-tactile-filter-flash.lua deleted file mode 100644 index 846bd55..0000000 --- a/scenarios/scripts/p300-tactile-filter-flash.lua +++ /dev/null @@ -1,61 +0,0 @@ - --- Picks out 'flashes' from a stimulation stream - --- this function is called when the box is initialized -function initialize(box) - - dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua") - - box:set_filter_mode(1); - - state = 0 - - do_debug = false -end - --- this function is called when the box is uninitialized -function uninitialize(box) -end - --- this function is called once by the box -function process(box) - - -- loop until box:keep_processing() returns zero - -- cpu will be released with a call to sleep - -- at the end of the loop - while box:keep_processing() do - - -- gets current simulated time - t = box:get_current_time() - - -- loops on every received stimulation for a given input - for stimulation = 1, box:get_stimulation_count(1) do - - -- gets stimulation - stimulation_id, stimulation_time, stimulation_duration = box:get_stimulation(1, 1) - - if stimulation_id == OVTK_StimulationId_SegmentStart then - state = 1 - elseif stimulation_id == OVTK_StimulationId_SegmentStop then - state = 0 - end - - -- If we're between 'rest start' and 'rest_stop', this specifies a target - if state == 1 and stimulation_id >= OVTK_StimulationId_LabelStart and stimulation_id <= OVTK_StimulationId_LabelEnd then - - box:send_stimulation(1, stimulation_id, stimulation_time, 0) - - if do_debug then - box:log("Info", string.format("Push a target %d at %f (now %f)", stimulation_id, stimulation_time, t)) - end - end - - -- discards it - box:remove_stimulation(1, 1) - - end - - -- releases cpu - box:sleep() - end -end diff --git a/scenarios/scripts/p300-tactile-filter-target.lua b/scenarios/scripts/p300-tactile-filter-target.lua deleted file mode 100644 index 3a67c76..0000000 --- a/scenarios/scripts/p300-tactile-filter-target.lua +++ /dev/null @@ -1,61 +0,0 @@ - --- Picks out 'targets' from a stimulation stream - --- this function is called when the box is initialized -function initialize(box) - - dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua") - - state = 0 - - box:set_filter_mode(1); - - do_debug = false -end - --- this function is called when the box is uninitialized -function uninitialize(box) -end - --- this function is called once by the box -function process(box) - - -- loop until box:keep_processing() returns zero - -- cpu will be released with a call to sleep - -- at the end of the loop - while box:keep_processing() do - - -- gets current simulated time - t = box:get_current_time() - - -- loops on every received stimulation for a given input - for stimulation = 1, box:get_stimulation_count(1) do - - -- gets stimulation - stimulation_id, stimulation_time, stimulation_duration = box:get_stimulation(1, 1) - - if stimulation_id == OVTK_StimulationId_RestStart then - state = 1 - elseif stimulation_id == OVTK_StimulationId_RestStop then - state = 0 - end - - -- If we're between 'rest start' and 'rest_stop', this specifies a target - if state == 1 and stimulation_id >= OVTK_StimulationId_LabelStart and stimulation_id <= OVTK_StimulationId_LabelEnd then - - box:send_stimulation(1, stimulation_id, stimulation_time, 0) - - if do_debug then - box:log("Info", string.format("Push a target %d at %f (now = %f)", stimulation_id, stimulation_time, t)) - end - end - - -- discards it - box:remove_stimulation(1, 1) - - end - - -- releases cpu - box:sleep() - end -end diff --git a/scenarios/scripts/p300-tactile-launch.lua b/scenarios/scripts/p300-tactile-launch.lua deleted file mode 100644 index 8c65efb..0000000 --- a/scenarios/scripts/p300-tactile-launch.lua +++ /dev/null @@ -1,21 +0,0 @@ - --- this function is called when the box is initialized -function initialize(box) - - dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua") - - stim = _G[box:get_setting(2)] - launchTime = box:get_setting(3) - -end - --- this function is called when the box is uninitialized -function uninitialize(box) -end - --- this function is called once by the box -function process(box) - - box:send_stimulation(1, stim, launchTime, 0) - -end diff --git a/scenarios/scripts/p300-tactile-stimulator.lua b/scenarios/scripts/p300-tactile-stimulator.lua deleted file mode 100644 index f3be955..0000000 --- a/scenarios/scripts/p300-tactile-stimulator.lua +++ /dev/null @@ -1,138 +0,0 @@ --- This Lua script sends Stimulations to the speller visualization box for a tactile p300-System with 6 stimulators --- --- Author : Tobias Baumann --- Date : 2021-12-06 --- Revised: 2021-19-11 - ---This function lets the box sleep until a fixed moment -function wait_until(box, time) - while box:get_current_time() < time do - box:sleep() - end -end - ---This function lets the box wait for a fixed duration -function wait_for(box, duration) - wait_until(box, box:get_current_time() + duration) -end - ---this function checks, wether value already is an element of the given stim_matrix -function is_element(matrix, value) - for i = 1, #matrix do - if #matrix == 0 then - return(false) - elseif value == matrix[i] then - return(true) - end - end - return(false) -end ---this function creates a sequence of stimulations by shuffeling the values of the given stim_matrix -function create_sequence(matrix) - local stim_matrix = {} - local stim_code = 0 - local i = 1 - while i <= #matrix do - stim_code = matrix[math.random(1,#matrix)] - if is_element(stim_matrix, stim_code) == false then - stim_matrix[i] = stim_code - i = i + 1 - end - end - return(stim_matrix) -end - --- this function is called when the box is initialized -function initialize(box) - --randomseed - math.randomseed(os.time()) - - --load stimulation codes - dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua") - - --load box settings - row_base = _G[box:get_setting(2)] - n_tactilos = box:get_setting(3) - n_repetitions = box:get_setting(4) - n_trials = box:get_setting(5) - flash_duration = box:get_setting(6) - noflash_duration = box:get_setting(7) - inter_repetition_delay = box:get_setting(8) - inter_trial_delay = box:get_setting(9) - send_toggle = _G[box:get_setting(10)] - free_spelling = box:get_setting(11) - time_to_send = box:get_setting(12) - - --Set number of trials to 1 in free spelling mode - if free_spelling == 'true' then - n_trials = 1 - end - - --Lua variables - send = false - experiment_end = false - tactilo_stimcodes = {} - for x = 1, n_tactilos do - tactilo_stimcodes[x] = row_base + x - 1 - end -end - --- this function is called when the box is uninitialized -function uninitialize(box) - -end - --- this function is called once by the box -function process(box) - while box:keep_processing() do - - if send and not experiment_end then - -- iterate over the number of trials - for trial = 1, n_trials do - box:send_stimulation(1, OVTK_StimulationId_RestStart, box:get_current_time() , 0) - wait_for(box, inter_trial_delay) - box:send_stimulation(1, OVTK_StimulationId_RestStop, box:get_current_time() , 0) - box:send_stimulation(1, OVTK_StimulationId_TrialStart ,box:get_current_time() , 0) - - -- iterate over the number of repetitions - for segment = 1, n_repetitions do - tactilo_stimcodes = create_sequence(tactilo_stimcodes) - box:send_stimulation(1, OVTK_StimulationId_SegmentStart ,box:get_current_time() , 0) - - -- iterate over the number of tactilos - for i = 1, #tactilo_stimcodes do - box:send_stimulation(1, tactilo_stimcodes[i] ,box:get_current_time() , 0) - box:send_stimulation(1, OVTK_StimulationId_VisualStimulationStart ,box:get_current_time() , 0) - wait_for(box, flash_duration) - box:send_stimulation(1, OVTK_StimulationId_VisualStimulationStop ,box:get_current_time() , 0) - wait_for(box, noflash_duration) - end - - box:send_stimulation(1, OVTK_StimulationId_SegmentStop ,box:get_current_time() , 0) - wait_for(box, inter_repetition_delay) - end - - box:send_stimulation(1, OVTK_StimulationId_TrialStop ,box:get_current_time() , 0) - - end - - if free_spelling == 'false' then - -- end experiment if set to copy spelling - box:send_stimulation(1, OVTK_StimulationId_ExperimentStop ,box:get_current_time() , 0) - send = false - experiment_end = true - end - - else if not send and not experiment_end then - -- delay the start of the experiment by t = time_to_send - wait_for(box, time_to_send) - send = true - box:send_stimulation(1, OVTK_StimulationId_ExperimentStart ,box:get_current_time() , 0) - end - - end - -- releases cpu - box:sleep() - end - -end diff --git a/scenarios/scripts/p300-tactile-target.lua b/scenarios/scripts/p300-tactile-target.lua deleted file mode 100644 index 35d2f1e..0000000 --- a/scenarios/scripts/p300-tactile-target.lua +++ /dev/null @@ -1,61 +0,0 @@ --- This Lua script generates target stimulations the 1x6 p300-tactile matrix --- --- Author : Tobias Baumann --- Date : 2021-06-09 - --- this function is called when the box is initialized -function initialize(box) - - dofile(box:get_config("${Path_Data}") .. "/plugins/stimulation/lua-stimulator-stim-codes.lua") - - math.randomseed(os.time()) - row_base = _G[box:get_setting(2)] - n_tactilos = box:get_setting(3) - delay = box:get_setting(4) - free_spelling = box:get_setting(5) - -end - --- this function is called when the box is uninitialized -function uninitialize(box) -end - --- this function is called once by the box -function process(box) - - -- loop until box:keep_processing() returns zero - -- cpu will be released with a call to sleep - -- at the end of the loop - while box:keep_processing() do - - -- gets current simulated time - t = box:get_current_time() - - -- loops on every received stimulation for a given input - for stimulation = 1, box:get_stimulation_count(1) do - - -- gets stimulation - stimulation_id, stimulation_time, stimulation_duration = box:get_stimulation(1, 1) - - if free_spelling == 'false' then - if stimulation_id == OVTK_StimulationId_RestStart then - - -- triggers the target - box:send_stimulation(1, row_base+math.random(1,n_tactilos)-1, t+delay, 0) - - elseif stimulation_id == OVTK_StimulationId_ExperimentStop then - - -- triggers train stimulation - box:send_stimulation(1, OVTK_StimulationId_Train, t+delay+1, 0) - - end - end - -- discards it - box:remove_stimulation(1, 1) - - end - - -- releases cpu - box:sleep() - end -end diff --git a/scenarios/signals/README.txt b/scenarios/signals/README.txt deleted file mode 100644 index 8eaa204..0000000 --- a/scenarios/signals/README.txt +++ /dev/null @@ -1,3 +0,0 @@ - -The scenario will record its signals here. - diff --git a/scenarios/ui/p300-tactile-10.ui b/scenarios/ui/p300-tactile-10.ui deleted file mode 100644 index cff860b..0000000 --- a/scenarios/ui/p300-tactile-10.ui +++ /dev/null @@ -1,321 +0,0 @@ - - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - True - 3 - 4 - - - True - 10 - 1 - True - - - True - - - True - Tactilo1 - True - center - - - - - 1 - 1 - - - - - True - - - True - Tactilo2 - True - center - - - - - 1 - 2 - - - - - True - - - True - Tactilo3 - True - center - - - - - 2 - 3 - - - - - True - - - True - Tactilo4 - True - center - - - - - 3 - 4 - - - - - True - - - True - Tactilo5 - True - center - - - - - 4 - 5 - - - - - True - - - True - Tactilo6 - True - center - - - - - 5 - 6 - - - - - True - - - True - Tactilo7 - True - center - - - - - 6 - 7 - - - - - True - - - True - Tactilo8 - True - center - - - - - 7 - 8 - - - - - True - - - True - Tactilo9 - True - center - - - - - 8 - 9 - - - - - True - - - True - Tactilo10 - True - center - - - - - 9 - 10 - - - - - - - True - 2 - 3 - 4 - 4 - - - True - 0 - True - - - 2 - 3 - 1 - 2 - GTK_FILL - - - - - True - 0 - True - - - 2 - 3 - GTK_FILL - - - - - True - 0 - Result : - True - - - 1 - 2 - 1 - 2 - GTK_FILL - GTK_FILL - - - - - True - 0 - Target : - True - - - 1 - 2 - GTK_FILL - GTK_FILL - - - - - True - gtk-select-font - - - 2 - - - - - - - 2 - 3 - GTK_FILL - - - - - True - - - 1 - 2 - GTK_FILL - GTK_FILL - - - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - P300 tactile - dialog - - - 640 - True - both - - - True - Show Target Text - gtk-info - True - - - False - True - - - - - True - Show Result Text - gtk-info - True - - - False - True - - - - - - diff --git a/scenarios/ui/p300-tactile-2.ui b/scenarios/ui/p300-tactile-2.ui deleted file mode 100644 index 87a2999..0000000 --- a/scenarios/ui/p300-tactile-2.ui +++ /dev/null @@ -1,185 +0,0 @@ - - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - True - 3 - 4 - - - True - 2 - 1 - True - - - True - - - True - Tactilo1 - True - center - - - - - 1 - 1 - - - - - True - - - True - Tactilo2 - True - center - - - - - 1 - 2 - - - - - - - True - 2 - 3 - 4 - 4 - - - True - 0 - True - - - 2 - 3 - 1 - 2 - GTK_FILL - - - - - True - 0 - True - - - 2 - 3 - GTK_FILL - - - - - True - 0 - Result : - True - - - 1 - 2 - 1 - 2 - GTK_FILL - GTK_FILL - - - - - True - 0 - Target : - True - - - 1 - 2 - GTK_FILL - GTK_FILL - - - - - True - gtk-select-font - - - 2 - - - - - - - 2 - 3 - GTK_FILL - - - - - True - - - 1 - 2 - GTK_FILL - GTK_FILL - - - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - P300 tactile - dialog - - - 640 - True - both - - - True - Show Target Text - gtk-info - True - - - False - True - - - - - True - Show Result Text - gtk-info - True - - - False - True - - - - - - diff --git a/scenarios/ui/p300-tactile-3.ui b/scenarios/ui/p300-tactile-3.ui deleted file mode 100644 index efed83e..0000000 --- a/scenarios/ui/p300-tactile-3.ui +++ /dev/null @@ -1,202 +0,0 @@ - - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - True - 3 - 4 - - - True - 3 - 1 - True - - - True - - - True - Tactilo1 - True - center - - - - - 1 - 1 - - - - - True - - - True - Tactilo2 - True - center - - - - - 1 - 2 - - - - - True - - - True - Tactilo3 - True - center - - - - - 2 - 3 - - - - - - - True - 2 - 3 - 4 - 4 - - - True - 0 - True - - - 2 - 3 - 1 - 2 - GTK_FILL - - - - - True - 0 - True - - - 2 - 3 - GTK_FILL - - - - - True - 0 - Result : - True - - - 1 - 2 - 1 - 2 - GTK_FILL - GTK_FILL - - - - - True - 0 - Target : - True - - - 1 - 2 - GTK_FILL - GTK_FILL - - - - - True - gtk-select-font - - - 2 - - - - - - - 2 - 3 - GTK_FILL - - - - - True - - - 1 - 2 - GTK_FILL - GTK_FILL - - - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - P300 tactile - dialog - - - 640 - True - both - - - True - Show Target Text - gtk-info - True - - - False - True - - - - - True - Show Result Text - gtk-info - True - - - False - True - - - - - - diff --git a/scenarios/ui/p300-tactile-4.ui b/scenarios/ui/p300-tactile-4.ui deleted file mode 100644 index 46a12f7..0000000 --- a/scenarios/ui/p300-tactile-4.ui +++ /dev/null @@ -1,219 +0,0 @@ - - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - True - 3 - 4 - - - True - 4 - 1 - True - - - True - - - True - Tactilo1 - True - center - - - - - 1 - 1 - - - - - True - - - True - Tactilo2 - True - center - - - - - 1 - 2 - - - - - True - - - True - Tactilo3 - True - center - - - - - 2 - 3 - - - - - True - - - True - Tactilo4 - True - center - - - - - 3 - 4 - - - - - - - True - 2 - 3 - 4 - 4 - - - True - 0 - True - - - 2 - 3 - 1 - 2 - GTK_FILL - - - - - True - 0 - True - - - 2 - 3 - GTK_FILL - - - - - True - 0 - Result : - True - - - 1 - 2 - 1 - 2 - GTK_FILL - GTK_FILL - - - - - True - 0 - Target : - True - - - 1 - 2 - GTK_FILL - GTK_FILL - - - - - True - gtk-select-font - - - 2 - - - - - - - 2 - 3 - GTK_FILL - - - - - True - - - 1 - 2 - GTK_FILL - GTK_FILL - - - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - P300 tactile - dialog - - - 640 - True - both - - - True - Show Target Text - gtk-info - True - - - False - True - - - - - True - Show Result Text - gtk-info - True - - - False - True - - - - - - diff --git a/scenarios/ui/p300-tactile-5.ui b/scenarios/ui/p300-tactile-5.ui deleted file mode 100644 index a7783c4..0000000 --- a/scenarios/ui/p300-tactile-5.ui +++ /dev/null @@ -1,235 +0,0 @@ - - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - True - 3 - 4 - - - True - 5 - 1 - True - - - True - - - True - Tactilo1 - True - center - - - - - 1 - 1 - - - - - True - - - True - Tactilo2 - True - center - - - - - 1 - 2 - - - - - True - - - True - Tactilo3 - True - center - - - - - 2 - 3 - - - - - True - - - True - Tactilo4 - True - center - - - - - 3 - 4 - - - - - True - - - True - Tactilo5 - True - center - - - - - 4 - 5 - - - - - - True - 2 - 3 - 4 - 4 - - - True - 0 - True - - - 2 - 3 - 1 - 2 - GTK_FILL - - - - - True - 0 - True - - - 2 - 3 - GTK_FILL - - - - - True - 0 - Result : - True - - - 1 - 2 - 1 - 2 - GTK_FILL - GTK_FILL - - - - - True - 0 - Target : - True - - - 1 - 2 - GTK_FILL - GTK_FILL - - - - - True - gtk-select-font - - - 2 - - - - - - - 2 - 3 - GTK_FILL - - - - - True - - - 1 - 2 - GTK_FILL - GTK_FILL - - - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - P300 tactile - dialog - - - 640 - True - both - - - True - Show Target Text - gtk-info - True - - - False - True - - - - - True - Show Result Text - gtk-info - True - - - False - True - - - - - - diff --git a/scenarios/ui/p300-tactile-6.ui b/scenarios/ui/p300-tactile-6.ui deleted file mode 100644 index f78ed23..0000000 --- a/scenarios/ui/p300-tactile-6.ui +++ /dev/null @@ -1,253 +0,0 @@ - - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - True - 3 - 4 - - - True - 6 - 1 - True - - - True - - - True - Tactilo1 - True - center - - - - - 1 - 1 - - - - - True - - - True - Tactilo2 - True - center - - - - - 1 - 2 - - - - - True - - - True - Tactilo3 - True - center - - - - - 2 - 3 - - - - - True - - - True - Tactilo4 - True - center - - - - - 3 - 4 - - - - - True - - - True - Tactilo5 - True - center - - - - - 4 - 5 - - - - - True - - - True - Tactilo6 - True - center - - - - - 5 - 6 - - - - - - - True - 2 - 3 - 4 - 4 - - - True - 0 - True - - - 2 - 3 - 1 - 2 - GTK_FILL - - - - - True - 0 - True - - - 2 - 3 - GTK_FILL - - - - - True - 0 - Result : - True - - - 1 - 2 - 1 - 2 - GTK_FILL - GTK_FILL - - - - - True - 0 - Target : - True - - - 1 - 2 - GTK_FILL - GTK_FILL - - - - - True - gtk-select-font - - - 2 - - - - - - - 2 - 3 - GTK_FILL - - - - - True - - - 1 - 2 - GTK_FILL - GTK_FILL - - - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - P300 tactile - dialog - - - 640 - True - both - - - True - Show Target Text - gtk-info - True - - - False - True - - - - - True - Show Result Text - gtk-info - True - - - False - True - - - - - - diff --git a/scenarios/ui/p300-tactile-7.ui b/scenarios/ui/p300-tactile-7.ui deleted file mode 100644 index 38447aa..0000000 --- a/scenarios/ui/p300-tactile-7.ui +++ /dev/null @@ -1,270 +0,0 @@ - - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - True - 3 - 4 - - - True - 7 - 1 - True - - - True - - - True - Tactilo1 - True - center - - - - - 1 - 1 - - - - - True - - - True - Tactilo2 - True - center - - - - - 1 - 2 - - - - - True - - - True - Tactilo3 - True - center - - - - - 2 - 3 - - - - - True - - - True - Tactilo4 - True - center - - - - - 3 - 4 - - - - - True - - - True - Tactilo5 - True - center - - - - - 4 - 5 - - - - - True - - - True - Tactilo6 - True - center - - - - - 5 - 6 - - - - - True - - - True - Tactilo7 - True - center - - - - - 6 - 7 - - - - - - - True - 2 - 3 - 4 - 4 - - - True - 0 - True - - - 2 - 3 - 1 - 2 - GTK_FILL - - - - - True - 0 - True - - - 2 - 3 - GTK_FILL - - - - - True - 0 - Result : - True - - - 1 - 2 - 1 - 2 - GTK_FILL - GTK_FILL - - - - - True - 0 - Target : - True - - - 1 - 2 - GTK_FILL - GTK_FILL - - - - - True - gtk-select-font - - - 2 - - - - - - - 2 - 3 - GTK_FILL - - - - - True - - - 1 - 2 - GTK_FILL - GTK_FILL - - - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - P300 tactile - dialog - - - 640 - True - both - - - True - Show Target Text - gtk-info - True - - - False - True - - - - - True - Show Result Text - gtk-info - True - - - False - True - - - - - - diff --git a/scenarios/ui/p300-tactile-8.ui b/scenarios/ui/p300-tactile-8.ui deleted file mode 100644 index af79af2..0000000 --- a/scenarios/ui/p300-tactile-8.ui +++ /dev/null @@ -1,287 +0,0 @@ - - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - True - 3 - 4 - - - True - 8 - 1 - True - - - True - - - True - Tactilo1 - True - center - - - - - 1 - 1 - - - - - True - - - True - Tactilo2 - True - center - - - - - 1 - 2 - - - - - True - - - True - Tactilo3 - True - center - - - - - 2 - 3 - - - - - True - - - True - Tactilo4 - True - center - - - - - 3 - 4 - - - - - True - - - True - Tactilo5 - True - center - - - - - 4 - 5 - - - - - True - - - True - Tactilo6 - True - center - - - - - 5 - 6 - - - - - True - - - True - Tactilo7 - True - center - - - - - 6 - 7 - - - - - True - - - True - Tactilo8 - True - center - - - - - 7 - 8 - - - - - - - True - 2 - 3 - 4 - 4 - - - True - 0 - True - - - 2 - 3 - 1 - 2 - GTK_FILL - - - - - True - 0 - True - - - 2 - 3 - GTK_FILL - - - - - True - 0 - Result : - True - - - 1 - 2 - 1 - 2 - GTK_FILL - GTK_FILL - - - - - True - 0 - Target : - True - - - 1 - 2 - GTK_FILL - GTK_FILL - - - - - True - gtk-select-font - - - 2 - - - - - - - 2 - 3 - GTK_FILL - - - - - True - - - 1 - 2 - GTK_FILL - GTK_FILL - - - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - P300 tactile - dialog - - - 640 - True - both - - - True - Show Target Text - gtk-info - True - - - False - True - - - - - True - Show Result Text - gtk-info - True - - - False - True - - - - - - diff --git a/scenarios/ui/p300-tactile-9.ui b/scenarios/ui/p300-tactile-9.ui deleted file mode 100644 index 31ea839..0000000 --- a/scenarios/ui/p300-tactile-9.ui +++ /dev/null @@ -1,304 +0,0 @@ - - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - - - True - 3 - 4 - - - True - 9 - 1 - True - - - True - - - True - Tactilo1 - True - center - - - - - 1 - 1 - - - - - True - - - True - Tactilo2 - True - center - - - - - 1 - 2 - - - - - True - - - True - Tactilo3 - True - center - - - - - 2 - 3 - - - - - True - - - True - Tactilo4 - True - center - - - - - 3 - 4 - - - - - True - - - True - Tactilo5 - True - center - - - - - 4 - 5 - - - - - True - - - True - Tactilo6 - True - center - - - - - 5 - 6 - - - - - True - - - True - Tactilo7 - True - center - - - - - 6 - 7 - - - - - True - - - True - Tactilo8 - True - center - - - - - 7 - 8 - - - - - True - - - True - Tactilo9 - True - center - - - - - 8 - 9 - - - - - - - True - 2 - 3 - 4 - 4 - - - True - 0 - True - - - 2 - 3 - 1 - 2 - GTK_FILL - - - - - True - 0 - True - - - 2 - 3 - GTK_FILL - - - - - True - 0 - Result : - True - - - 1 - 2 - 1 - 2 - GTK_FILL - GTK_FILL - - - - - True - 0 - Target : - True - - - 1 - 2 - GTK_FILL - GTK_FILL - - - - - True - gtk-select-font - - - 2 - - - - - - - 2 - 3 - GTK_FILL - - - - - True - - - 1 - 2 - GTK_FILL - GTK_FILL - - - - - - - GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK - P300 tactile - dialog - - - 640 - True - both - - - True - Show Target Text - gtk-info - True - - - False - True - - - - - True - Show Result Text - gtk-info - True - - - False - True - - - - - - diff --git a/src/TactileVisualization/TactileMenu.cpp b/src/TactileVisualization/TactileMenu.cpp deleted file mode 100644 index 9194244..0000000 --- a/src/TactileVisualization/TactileMenu.cpp +++ /dev/null @@ -1,52 +0,0 @@ -///------------------------------------------------------------------------------------------------- -/// -/// \file TactileMenu.cpp -/// \brief Definitions for class TactileMenu -/// \author Tobias Baumann (TH Nuernberg). -/// \version 1.0. -/// \date Mon Feb 10 17:11:34 2022. -/// \copyright GNU Affero General Public License v3.0. -/// -///------------------------------------------------------------------------------------------------- - -//includes -#include "TactileMenu.h" - - -namespace OpenViBE { -namespace Plugins { -namespace Tactilebci { - -//TactileMenu Memberfunctions -TactileMenu::TactileMenu(int n_Tactilos) -{ - for(int i = 1; i <= n_Tactilos; i++) - { - m_LabelText.push_back("Tactilo" + std::to_string(i)); - m_SubMenu.push_back(nullptr); - } -} - -void TactileMenu::set_LabelText(int i, std::string Text) -{ - m_LabelText[i] = Text; -} - -void TactileMenu::set_SubMenu(int i, TactileMenu* Menu) -{ - m_SubMenu[i] = Menu; -} - -std::string TactileMenu::get_LabelText(int i) -{ - return(m_LabelText[i]); -} - -TactileMenu* TactileMenu::get_SubMenu(int i) -{ - return(m_SubMenu[i]); -} - -} // namespace Tactilebci -} // namespace Plugins -} // namespace OpenViBE \ No newline at end of file diff --git a/src/TactileVisualization/TactileMenu.h b/src/TactileVisualization/TactileMenu.h deleted file mode 100644 index 3f0712d..0000000 --- a/src/TactileVisualization/TactileMenu.h +++ /dev/null @@ -1,46 +0,0 @@ -///------------------------------------------------------------------------------------------------- -/// -/// \file TactileMenu.h -/// \brief Class for the Menues of the Tactile P300 System -/// \author Tobias Baumann (TH Nuernberg). -/// \version 1.0. -/// \date Mon Feb 10 17:10:32 2022. -/// \copyright GNU Affero General Public License v3.0. -/// -///------------------------------------------------------------------------------------------------- -//includes -#pragma once - -#include "../ovp_defines.h" - -#include -#include -#include - -#include -#include - -namespace OpenViBE { -namespace Plugins { -namespace Tactilebci { - -//Class TactileMenu -class TactileMenu -{ - private: - std::vector m_LabelText; - std::vector m_SubMenu; - - public: - TactileMenu(int n_Tactilos); - - std::string get_LabelText(int i); - TactileMenu* get_SubMenu(int i); - - void set_LabelText(int i, std::string Text); - void set_SubMenu(int i, TactileMenu* Menu); -}; - -} // namespace Tactilebci -} // namespace Plugins -} // namespace OpenViBE \ No newline at end of file diff --git a/src/TactileVisualization/ovpCBoxAlgorithmP300TactileVisualization.cpp b/src/TactileVisualization/ovpCBoxAlgorithmP300TactileVisualization.cpp deleted file mode 100644 index 2dda5a7..0000000 --- a/src/TactileVisualization/ovpCBoxAlgorithmP300TactileVisualization.cpp +++ /dev/null @@ -1,480 +0,0 @@ -#include "ovpCBoxAlgorithmP300TactileVisualization.h" - -using namespace OpenViBE; -using namespace /*OpenViBE::*/Kernel; -using namespace /*OpenViBE::*/Plugins; -using namespace /*OpenViBE::Plugins::*/Tactilebci; - -// This callback flushes all accumulated stimulations to the TCP Tagging -// after the rendering has completed. -static gboolean FlushCB(gpointer data) -{ - (static_cast(data))->flushQueue(); - - return false; // Only run once -} - -bool CBoxAlgorithmP300TactileVisualization::initialize() -{ - // ------ Init decoder/encoder - m_SequenceInputDecoder.initialize(*this, 0); - m_TargetInputDecoder.initialize(*this, 1); - m_ResultInputDecoder.initialize(*this, 2); - m_ResultOutputEncoder.initialize(*this, 0); - - // ------ Get box settings - m_InterfaceFilename = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); - m_RowBase = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); - m_nTactilos = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 2); - m_FreeSpelling = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 3); - - //set m_nTactilos minimum number of 2, if lower - if(m_nTactilos < 2) - { - m_nTactilos = 2; - } - - //set m_nTactilos maximum number of MAX_TACTILOS(10), if higher - if(m_nTactilos > MAX_TACTILOS) - { - m_nTactilos = MAX_TACTILOS; - } - - // ------ Setup acquisition server TCP tagging - m_stimuliQueue.clear(); - m_stimulusSender = TCPTagging::CreateStimulusSender(); - if(!m_stimulusSender->connect("localhost", "15361")) - { - this->getLogManager() << LogLevel_Warning << "Failed to connect to acquisition server TCP tagging.\n"; - } - - // ------ Gtk variables - // Build main UI elements - m_MainWidgetInterface = gtk_builder_new(); - if(!gtk_builder_add_from_file(m_MainWidgetInterface, m_InterfaceFilename.toASCIIString(), nullptr))//error - { - this->getLogManager() << LogLevel_ImportantWarning << "Failed to load UI file [" << m_InterfaceFilename << "]\n"; - this->getLogManager() << LogLevel_ImportantWarning << "Make sure, that the given filename and path are correct\n"; - return(false); - } - m_MainWindow = GTK_WIDGET(gtk_builder_get_object(m_MainWidgetInterface, "p300-tactile-main")); - m_Table = GTK_TABLE(gtk_builder_get_object(m_MainWidgetInterface, "p300-tactile-table")); - m_ResultLabel = GTK_LABEL(gtk_builder_get_object(m_MainWidgetInterface, "label-result")); - m_TargetLabel = GTK_LABEL(gtk_builder_get_object(m_MainWidgetInterface, "label-target")); - - // Create font description - m_FontDesc = pango_font_description_copy(pango_context_get_font_description(gtk_widget_get_pango_context(m_MainWindow))); - pango_font_description_set_size(m_FontDesc, gint(FontSize*PANGO_SCALE)); - - // test if the UI-file fits the number of tactilos - guint nRow = 0; - g_object_get(m_Table, "n-rows", &nRow, nullptr); - if(m_nTactilos != nRow) - { - this->getLogManager() << LogLevel_ImportantWarning << "The number of tactilos " << m_nTactilos<<" used and the number of rows "<< nRow << " in the ui file must be the same.\n"; - this->getLogManager() << LogLevel_ImportantWarning << "Make sure to choose the right UI-File, e.g. p300-tactile-6.ui for 6 tactilos\n"; - return(false); - } - else - { - for(uint64_t i = 0; i < m_nTactilos; i++) - { - std::string eventbox_id = "eventbox-" + std::to_string(i+1); - - m_EventBox.push_back(GTK_WIDGET(gtk_builder_get_object(m_MainWidgetInterface, eventbox_id.c_str()))); - } - } - - // ------ Setup tactile UI - //Create UI for m_nTactilos = 6 - if(m_nTactilos == 6) - { - //create free spelling UI for 6 tactilos - if(m_FreeSpelling) - { - //mainmenu - m_Menu.push_back(TactileMenu(6)); - m_Menu[0].set_LabelText(0, "Ja"); - m_Menu[0].set_LabelText(1, "Nein"); - m_Menu[0].set_LabelText(2, "Geräte"); - m_Menu[0].set_LabelText(3, "Körper"); - m_Menu[0].set_LabelText(4, "Hilfe"); - m_Menu[0].set_LabelText(5, "Schmerzen"); - //submenu Geräte - m_Menu.push_back(TactileMenu(6)); - m_Menu[1].set_LabelText(0, "Ja"); - m_Menu[1].set_LabelText(1, "Nein"); - m_Menu[1].set_LabelText(2, "Atemgerät"); - m_Menu[1].set_LabelText(3, "Computer"); - m_Menu[1].set_LabelText(4, "Rollstuhl"); - m_Menu[1].set_LabelText(5, "Hauptmenü"); - //submenu Körper - m_Menu.push_back(TactileMenu(6)); - m_Menu[2].set_LabelText(0, "Ja"); - m_Menu[2].set_LabelText(1, "Nein"); - m_Menu[2].set_LabelText(2, "Hunger/Durst"); - m_Menu[2].set_LabelText(3, "warm/kalt"); - m_Menu[2].set_LabelText(4, "Müdigkeit"); - m_Menu[2].set_LabelText(5, "Hauptmenü"); - //submenu Hilfe - m_Menu.push_back(TactileMenu(6)); - m_Menu[3].set_LabelText(0, "Ja"); - m_Menu[3].set_LabelText(1, "Nein"); - m_Menu[3].set_LabelText(2, "Lage"); - m_Menu[3].set_LabelText(3, "Atemnot"); - m_Menu[3].set_LabelText(4, "Anderes Problem"); - m_Menu[3].set_LabelText(5, "Hauptmenü"); - //submenu Schmerzen - m_Menu.push_back(TactileMenu(6)); - m_Menu[3].set_LabelText(0, "Ja"); - m_Menu[3].set_LabelText(1, "Nein"); - m_Menu[3].set_LabelText(2, "Kopf"); - m_Menu[3].set_LabelText(3, "Torso"); - m_Menu[3].set_LabelText(4, "Glieder"); - m_Menu[3].set_LabelText(5, "Hauptmenü"); - - //set SubMenu ptr - m_Menu[0].set_SubMenu(2, &m_Menu[1]);//main --> Geräte - m_Menu[0].set_SubMenu(3, &m_Menu[2]);//main --> Körper - m_Menu[0].set_SubMenu(4, &m_Menu[3]);//main --> Hilfe - m_Menu[0].set_SubMenu(5, &m_Menu[4]);//main --> Schmerzen - m_Menu[1].set_SubMenu(5, &m_Menu[0]);//Geräte --> main - m_Menu[2].set_SubMenu(5, &m_Menu[0]);//Körper --> main - m_Menu[3].set_SubMenu(5, &m_Menu[0]);//Hilfe --> main - m_Menu[3].set_SubMenu(5, &m_Menu[0]);//Schmerzen --> main - - //set curr Menu ptr to main menu - m_CurrMenu = &m_Menu[0]; - } - //create copy spelling UI for 6 tactilos - else - { - m_Menu.push_back(TactileMenu(6)); - m_Menu[0].set_LabelText(0, "Bein links"); - m_Menu[0].set_LabelText(1, "Bein rechts"); - m_Menu[0].set_LabelText(2, "Arm links"); - m_Menu[0].set_LabelText(3, "Arm rechts"); - m_Menu[0].set_LabelText(4, "Brust"); - m_Menu[0].set_LabelText(5, "Rücken"); - - m_CurrMenu = &m_Menu[0]; - } - } - //Create default UI for m_nTactilos != 6 - else - { - m_Menu.push_back(TactileMenu(m_nTactilos)); - m_CurrMenu = &m_Menu[0]; - } - - // ------ Init UI - m_visualizationCtx = dynamic_cast(this->createPluginObject(OVP_ClassId_Plugin_VisualizationCtx)); - m_visualizationCtx->setWidget(*this, m_MainWindow); - - for(uint64_t i = 0; i < m_nTactilos; ++i) - { - resetColor(); - gtk_widget_modify_font(gtk_bin_get_child(GTK_BIN(m_EventBox[i])), m_FontDesc); - } - - toggleLabelText(); - - return(true); -} -/*******************************************************************************/ - -bool CBoxAlgorithmP300TactileVisualization::uninitialize() -{ - // ------ uninitialize decoder/encoder - m_SequenceInputDecoder.uninitialize(); - m_TargetInputDecoder.uninitialize(); - m_ResultInputDecoder.uninitialize(); - m_ResultOutputEncoder.uninitialize(); - - // ------ uninitialize GTK UI - if (m_MainWidgetInterface) - { - g_object_unref(m_MainWidgetInterface); - m_MainWidgetInterface = nullptr; - } - if (m_visualizationCtx) - { - this->releasePluginObject(m_visualizationCtx); - } - - // ------ uinitialize TCP Tagging - if (m_idleFuncTag != 0) - { - m_stimuliQueue.clear(); - g_source_remove(m_idleFuncTag); - m_idleFuncTag = 0; - } - if (m_stimulusSender) - { - delete m_stimulusSender; - m_stimulusSender = nullptr; - } - - return(true); -} -/*******************************************************************************/ - - -bool CBoxAlgorithmP300TactileVisualization::processInput(const size_t index) -{ - // ------ ready to process - getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); - - return(true); -} - -/*******************************************************************************/ - - -bool CBoxAlgorithmP300TactileVisualization::process() -{ - const IBox& staticBoxContext=this->getStaticBoxContext(); - IBoxIO& boxContext = this->getDynamicBoxContext(); - - //variables for processing of input chunks - uint64_t SequenceID = 0; - uint64_t TargetID = 0; - uint64_t ResultID = 0; - int Row = -1; - bool IsTarget = false; - bool TargetReceived = false; - bool ResultReceived = false; - - //variables for forwarding of target stimulations - uint64_t ChunkStartTime = 0; - uint64_t ChunkEndTime = 0; - uint64_t Size = 0; - const uint8_t* Buffer = nullptr; - - - // ------ Sequence stimulation - for(uint64_t i = 0; i < boxContext.getInputChunkCount(0); ++i) - { - m_SequenceInputDecoder.decode(i); - m_LastTime = boxContext.getInputChunkEndTime(0, i); - - // if header received - if(m_SequenceInputDecoder.isHeaderReceived()) - {} - - // if buffer received - if(m_SequenceInputDecoder.isBufferReceived()) - { - //check received stimulations on sequence input - CStimulationSet* SequenceStimulationSet = m_SequenceInputDecoder.getOutputStimulationSet(); - for(uint64_t j = 0; j < SequenceStimulationSet->size(); ++j) - { - SequenceID = SequenceStimulationSet->getId(j); - - if(SequenceID >= m_RowBase && SequenceID < m_RowBase + m_nTactilos) - { - Row = SequenceID - m_RowBase; - IsTarget = (Row == (int)m_LastTarget); - } - if(SequenceID == OVTK_StimulationId_VisualStimulationStart) - { - resetColor(); - toggleFlashColor(Row); - if (IsTarget) - { - m_stimuliQueue.push_back(OVTK_StimulationId_Target); - } - else - { - m_stimuliQueue.push_back(OVTK_StimulationId_NonTarget); - } - } - if(SequenceID == OVTK_StimulationId_VisualStimulationStop) - { - resetColor(); - } - if(SequenceID == OVTK_StimulationId_SegmentStart) - { - toggleLabelText(); - } - - m_stimuliQueue.push_back(SequenceID); - } - } - - // if end received - if(m_SequenceInputDecoder.isEndReceived()) - {} - - boxContext.markInputAsDeprecated(0, i); - } - - // ------ Target stimulation - for(uint64_t i = 0; i < boxContext.getInputChunkCount(1); ++i) - { - if(m_LastTime >= boxContext.getInputChunkStartTime(1, i)) - { - m_TargetInputDecoder.decode(i); - - // if header received - if(m_SequenceInputDecoder.isHeaderReceived()) - {} - - // if buffer received - if(m_SequenceInputDecoder.isBufferReceived()) - { - // check received dtimulations on Target input - CStimulationSet* TargetStimulationSet = m_TargetInputDecoder.getOutputStimulationSet(); - for(uint64_t j = 0; j < TargetStimulationSet->size(); ++j) - { - TargetID = TargetStimulationSet->getId(j); - - if(TargetID >= m_RowBase && TargetID < m_RowBase + m_nTactilos) - { - Row = TargetID - m_RowBase; - TargetReceived = true; - } - if(TargetReceived) - { - toggleTargetColor(Row); - m_stimuliQueue.push_back(TargetID); - - std::string TargetLabel = gtk_label_get_text(m_TargetLabel); - TargetLabel += gtk_label_get_text(GTK_LABEL(gtk_bin_get_child(GTK_BIN(m_EventBox[Row])))); - gtk_label_set_text(m_TargetLabel, TargetLabel.c_str()); - - m_LastTarget = Row; - } - } - } - - // if end received - if(m_SequenceInputDecoder.isEndReceived()) - {} - - boxContext.markInputAsDeprecated(1, i); - } - } - - // ------ Result stimulation - for(uint64_t i = 0; i < boxContext.getInputChunkCount(2); ++i) - { - if(m_LastTime >= boxContext.getInputChunkStartTime(2, i)) - { - m_ResultInputDecoder.decode(i); - - // if header received - if(m_SequenceInputDecoder.isHeaderReceived()) - {} - - // if buffer received - if(m_SequenceInputDecoder.isBufferReceived()) - { - // check received stimulations on result input - CStimulationSet* ResultStimulationSet = m_ResultInputDecoder.getOutputStimulationSet(); - for(uint64_t j = 0; j < ResultStimulationSet->size(); ++j) - { - ResultID = ResultStimulationSet->getId(j); - - if(ResultID >= m_RowBase && ResultID < m_RowBase + m_nTactilos) - { - Row = ResultID - m_RowBase; - ResultReceived = true; - } - if(ResultReceived) - { - toggleResultColor(Row); - - std::string ResultLabel = gtk_label_get_text(m_ResultLabel); - ResultLabel += gtk_label_get_text(GTK_LABEL(gtk_bin_get_child(GTK_BIN(m_EventBox[Row])))); - gtk_label_set_text(m_ResultLabel, ResultLabel.c_str()); - - //switch current menu ptr to submenu - if(m_CurrMenu->get_SubMenu(Row) != nullptr) - { - m_CurrMenu = m_CurrMenu->get_SubMenu(Row); - } - } - } - } - - // if end received - if(m_SequenceInputDecoder.isEndReceived()) - {} - - // forward target stimulations - boxContext.getInputChunk(2, i, ChunkStartTime, ChunkEndTime, Size, Buffer); - boxContext.appendOutputChunkData(0, Buffer, Size); - boxContext.markOutputAsReadyToSend(0, ChunkStartTime, ChunkEndTime); - boxContext.markInputAsDeprecated(2, i); - - } - } - - // ------ Send accumulated stimuli to the acquisition server - if(m_idleFuncTag == 0) - { - m_idleFuncTag = g_idle_add(FlushCB, this); - } - - return(true); -} - - - -// ------ Function Definitions - - -// Sends all accumulated stimuli to the TCP Tagging -void CBoxAlgorithmP300TactileVisualization::flushQueue() -{ - for (const auto& stimulation : m_stimuliQueue) - { - m_stimulusSender->sendStimulation(stimulation); - } - m_stimuliQueue.clear(); - - // This function will be automatically removed after completion, so set to 0 - m_idleFuncTag = 0; -} - - -// Change labels fore-/background -void CBoxAlgorithmP300TactileVisualization::toggleFlashColor(uint64_t id) -{ - gtk_widget_modify_fg(gtk_bin_get_child(GTK_BIN(m_EventBox[id])), GTK_STATE_NORMAL, &m_FlashFG); - gtk_widget_modify_bg(m_EventBox[id], GTK_STATE_NORMAL, &m_FlashBG); -} - -void CBoxAlgorithmP300TactileVisualization::toggleTargetColor(uint64_t id) -{ - gtk_widget_modify_fg(gtk_bin_get_child(GTK_BIN(m_EventBox[id])), GTK_STATE_NORMAL, &m_TargetFG); - gtk_widget_modify_bg(m_EventBox[id], GTK_STATE_NORMAL, &m_TargetBG); -} - -void CBoxAlgorithmP300TactileVisualization::toggleResultColor(uint64_t id) -{ - gtk_widget_modify_fg(gtk_bin_get_child(GTK_BIN(m_EventBox[id])), GTK_STATE_NORMAL, &m_ResultFG); - gtk_widget_modify_bg(m_EventBox[id], GTK_STATE_NORMAL, &m_ResultBG); -} - -void CBoxAlgorithmP300TactileVisualization::resetColor() -{ - for(uint64_t i = 0; i < m_nTactilos; i++) - { - gtk_widget_modify_fg(gtk_bin_get_child(GTK_BIN(m_EventBox[i])), GTK_STATE_NORMAL, &m_NoFlashFG); - gtk_widget_modify_bg(m_EventBox[i], GTK_STATE_NORMAL, &m_NoFlashBG); - } -} - - -// Change label text -void CBoxAlgorithmP300TactileVisualization::toggleLabelText() -{ - for(uint64_t i = 0; i < m_nTactilos; i++) - { - std::string label_text = m_CurrMenu->get_LabelText(i); - - gtk_label_set_text(GTK_LABEL(gtk_bin_get_child(GTK_BIN(m_EventBox[i]))), label_text.c_str()); - } -} \ No newline at end of file diff --git a/src/TactileVisualization/ovpCBoxAlgorithmP300TactileVisualization.h b/src/TactileVisualization/ovpCBoxAlgorithmP300TactileVisualization.h deleted file mode 100644 index 0cff75b..0000000 --- a/src/TactileVisualization/ovpCBoxAlgorithmP300TactileVisualization.h +++ /dev/null @@ -1,162 +0,0 @@ -///------------------------------------------------------------------------------------------------- -/// -/// \file CBoxAlgorithmP300TactileVisualization.h -/// \brief Classes of the Box P300TactileVisualization. -/// \author Tobias Baumann (TH Nuernberg). -/// \version 1.0. -/// \date Sat May 07 14:20:29 2022. -/// \copyright GNU Affero General Public License v3.0. -/// -///------------------------------------------------------------------------------------------------- -#pragma once - -//You may have to change this path to match your folder organisation -#include "../ovp_defines.h" -#include "TactileMenu.h" -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include "../utils.h" - - -namespace TCPTagging { -class IStimulusSender; // fwd declare -} - -namespace OpenViBE -{ - namespace Plugins - { - namespace Tactilebci - { - /// The class CBoxAlgorithmP300TactileVisualization describes the box P300TactileVisualization. - class CBoxAlgorithmP300TactileVisualization final : virtual public Toolkit::TBoxAlgorithm - { - public: - // ------ OV base functions - void release() override { delete this; } - - bool initialize() override; - bool uninitialize() override; - - //Process Callback on new input received (the most common behaviour for signal processing) : - bool processInput(const size_t index) override; - - bool process() override; - - // As we do with any class in openvibe, we use the macro below to associate this box to an unique identifier. - // The inheritance information is also made available, as we provide the superclass Toolkit::TBoxAlgorithm < IBoxAlgorithm > - _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_P300TactileVisualization) - - // ------ TCP Tagging - void flushQueue(); - - // ------ UI Functions - void toggleFlashColor(uint64_t id); - void toggleTargetColor(uint64_t id); - void toggleResultColor(uint64_t id); - void resetColor(); - void toggleLabelText(); - - protected: - // ------ Input decoder: - Toolkit::TStimulationDecoder m_SequenceInputDecoder; - Toolkit::TStimulationDecoder m_TargetInputDecoder; - Toolkit::TStimulationDecoder m_ResultInputDecoder; - // ------ Output decoder: - Toolkit::TStimulationEncoder m_ResultOutputEncoder; - - private: - uint64_t m_LastTarget = 0; - uint64_t m_LastTime = 0; - - // ------ Box setting variables - CString m_InterfaceFilename; - uint64_t m_RowBase = 0; - uint64_t m_nTactilos = 6; - bool m_FreeSpelling = false; - - // ------TactileMenu variables - std::vector m_Menu; - TactileMenu* m_CurrMenu = nullptr; - - // ------ GTK variables - GtkBuilder* m_MainWidgetInterface = nullptr; - GtkWidget* m_MainWindow = nullptr; - GtkTable* m_Table = nullptr; - std::vector m_EventBox; - GtkLabel* m_ResultLabel = nullptr; - GtkLabel* m_TargetLabel = nullptr; - - GdkColor m_FlashBG = InitGDKColor(0, 3276, 3276, 3276); - GdkColor m_FlashFG = InitGDKColor(0, 65535, 65535, 65535); - GdkColor m_NoFlashBG = InitGDKColor(0, 0, 0, 0); - GdkColor m_NoFlashFG = InitGDKColor(0, 16383, 16383, 16383); - GdkColor m_TargetBG = InitGDKColor(0, 13107, 13107, 45874); - GdkColor m_TargetFG = InitGDKColor(0, 6553, 6553, 19660); - GdkColor m_ResultBG = InitGDKColor(0, 6553, 26214, 6553); - GdkColor m_ResultFG = InitGDKColor(0, 39321, 65535, 39321); - - uint64_t FontSize = 50; - PangoFontDescription* m_FontDesc = nullptr; - - // ------ TCP Tagging - std::vector m_stimuliQueue; - guint m_idleFuncTag = 0; - TCPTagging::IStimulusSender* m_stimulusSender = nullptr; - - // ------ Box visualization - VisualizationToolkit::IVisualizationContext* m_visualizationCtx = nullptr; - }; - - /// Descriptor of the box P300TactileVisualization. - class CBoxAlgorithmP300TactileVisualizationDesc final : virtual public IBoxAlgorithmDesc - { - public: - - void release() override { } - - CString getName() const override { return CString("P300TactileVisualization"); } - CString getAuthorName() const override { return CString("Tobias Baumann"); } - CString getAuthorCompanyName() const override { return CString("TH Nuernberg"); } - CString getShortDescription() const override { return CString(""); } - CString getDetailedDescription() const override { return CString(""); } - CString getCategory() const override { return CString("TactileBCI"); } - CString getVersion() const override { return CString("1.0"); } - CString getStockItemName() const override { return CString("gtk-underline"); } - - CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_P300TactileVisualization; } - IPluginObject* create() override { return new CBoxAlgorithmP300TactileVisualization; } - - bool hasFunctionality(const EPluginFunctionality functionality) const override { return functionality == EPluginFunctionality::Visualization; } - - bool getBoxPrototype(Kernel::IBoxProto& prototype) const override - { - prototype.addInput("Sequence",OV_TypeId_Stimulations); - prototype.addInput("Target",OV_TypeId_Stimulations); - prototype.addInput("Result",OV_TypeId_Stimulations); - - prototype.addOutput("Result",OV_TypeId_Stimulations); - - prototype.addSetting("Interface Filename",OV_TypeId_Filename,"${Player_ScenarioDirectory}/ui/p300-tactile-6.ui"); - prototype.addSetting("Row Stimulation Base",OV_TypeId_Stimulation,"OVTK_StimulationId_Label_01"); - prototype.addSetting("Number of Tactilos",OV_TypeId_Integer,"6"); - prototype.addSetting("Free Spelling",OV_TypeId_Boolean,"false"); - - prototype.addFlag(OV_AttributeId_Box_FlagIsUnstable); - - return true; - } - _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_P300TactileVisualizationDesc) - }; - } // namespace Tactilebci - } // namespace Plugins -} // namespace OpenViBE diff --git a/src/TactiloController/ovpCBoxAlgorithmTactiloController.cpp b/src/TactiloController/ovpCBoxAlgorithmTactiloController.cpp deleted file mode 100644 index b2f66f8..0000000 --- a/src/TactiloController/ovpCBoxAlgorithmTactiloController.cpp +++ /dev/null @@ -1,140 +0,0 @@ -///------------------------------------------------------------------------------------------------- -/// -/// \file ovpCBoxAlgorithmTactiloController.cpp -/// \brief Functions of the Box Tactilo Controller. -/// \author Tobias Baumann (TH-Nürnberg). -/// \version 1.0. -/// \date Mon Feb 21 14:59:56 2022. -/// \copyright GNU Affero General Public License v3.0. -/// -///------------------------------------------------------------------------------------------------- - -//includes -#include "ovpCBoxAlgorithmTactiloController.h" - -using namespace OpenViBE; -using namespace /*OpenViBE::*/Kernel; -using namespace /*OpenViBE::*/Plugins; -using namespace /*OpenViBE::Plugins::*/Tactilebci; - -/*******************************************************************************/ - -bool CBoxAlgorithmTactiloController::initialize() -{ - m_StimDecoder.initialize(*this, 0); - m_StimEncoder.initialize(*this, 0); - - //get Box Settings - m_PortName = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); - m_RowBase = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); - m_nTactilos = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 2); - - //set m_nTactilos to 2 if lower than 2 - if(m_nTactilos < 2) - { - m_nTactilos = 2; - } - //set m_nTactilos to MAX if greater than MAX_TACTILOS - if(m_nTactilos > MAX_TACTILOS) - { - m_nTactilos = MAX_TACTILOS; - } - - //open serial port and set baudrate to 115200 - m_Port.open(m_PortName.toASCIIString()); - m_Port.set_option(boost::asio::serial_port::baud_rate(115200)); - - if(m_Port.is_open()) - { - this->getLogManager() << LogLevel_Info << "Connected to Serial Port: " << m_PortName << "\n"; - m_Port.write_some(boost::asio::buffer("b")); - } - - return true; -} - -/*******************************************************************************/ - -bool CBoxAlgorithmTactiloController::uninitialize() -{ - this->getLogManager() << LogLevel_Info << "Disconnect from Serial Port: " << m_PortName << "\n"; - m_Port.write_some(boost::asio::buffer("e")); - m_Port.close(); - - m_StimDecoder.uninitialize(); - m_StimEncoder.uninitialize(); - - return true; -} - -/*******************************************************************************/ - -bool CBoxAlgorithmTactiloController::processInput(const size_t index) -{ - // some pre-processing code if needed... - - // ready to process ! - getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); - - return true; -} - -/*******************************************************************************/ -bool CBoxAlgorithmTactiloController::process() -{ - - // the static box context describes the box inputs, outputs, settings structures - const IBox& staticBoxContext = this->getStaticBoxContext(); - // the dynamic box context describes the current state of the box inputs and outputs (i.e. the chunks) - IBoxIO& boxContext = this->getDynamicBoxContext(); - - uint64_t ChunkStartTime = 0; - uint64_t ChunkEndTime = 0; - uint64_t Size = 0; - const uint8_t* Buffer = nullptr; - - //iterate over all chunk on input 0 - for (uint64_t i = 0; i < boxContext.getInputChunkCount(0); ++i) - { - // decode the chunk i - m_StimDecoder.decode(i); - - if(m_StimDecoder.isBufferReceived()) - { - //check received stimulations - CStimulationSet* StimSet = m_StimDecoder.getOutputStimulationSet(); - for(uint64_t j=0; jsize(); j++) - { - uint64_t StimulationID = StimSet->getId(j); - - if(StimulationID >= m_RowBase && StimulationID < (m_RowBase + m_nTactilos)) - { - m_currTactiloID = StimulationID-m_RowBase; - } - if(StimulationID == OVTK_StimulationId_VisualStimulationStart || StimulationID == OVTK_StimulationId_VisualStimulationStop) - { - boost::asio::async_write(m_Port, boost::asio::buffer(std::to_string(m_currTactiloID), 1), boost::bind(&CBoxAlgorithmTactiloController::handler, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)); - } - } - } - - // forward input chunks - boxContext.getInputChunk(0, i, ChunkStartTime, ChunkEndTime, Size, Buffer); - boxContext.appendOutputChunkData(0, Buffer, Size); - boxContext.markOutputAsReadyToSend(0, ChunkStartTime, ChunkEndTime); - boxContext.markInputAsDeprecated(0, i); - - } - - return true; -} - -/*******************************************************************************/ - -void CBoxAlgorithmTactiloController::handler(const boost::system::error_code& error, std::size_t bytes_transferred) -{ - if(error) - { - this->getLogManager() << LogLevel_Warning << error.message() << "\n"; - } -} \ No newline at end of file diff --git a/src/TactiloController/ovpCBoxAlgorithmTactiloController.h b/src/TactiloController/ovpCBoxAlgorithmTactiloController.h deleted file mode 100644 index 63cc9c9..0000000 --- a/src/TactiloController/ovpCBoxAlgorithmTactiloController.h +++ /dev/null @@ -1,113 +0,0 @@ -///------------------------------------------------------------------------------------------------- -/// -/// \file ovpCBoxAlgorithmTactiloController.h -/// \brief Classes of the Box Tactilo Controller. -/// \author Tobias Baumann (TH-Nürnberg). -/// \version 1.0. -/// \date Mon Feb 21 14:59:56 2022. -/// \copyright GNU Affero General Public License v3.0. -/// -///------------------------------------------------------------------------------------------------- - -//includes -#pragma once - -#include "../ovp_defines.h" - -#include -#include -#include -#include -#include - -namespace OpenViBE -{ - namespace Plugins - { - namespace Tactilebci - { - /// The class CBoxAlgorithmTactiloController describes the box Tactilo Controller. - class CBoxAlgorithmTactiloController final : virtual public Toolkit::TBoxAlgorithm - { - public: - void release() override { delete this; } - - bool initialize() override; - bool uninitialize() override; - bool processInput(const size_t index) override; - bool process() override; - - // write handler - void handler(const boost::system::error_code& error, std::size_t bytes_transferred); - - // As we do with any class in openvibe, we use the macro below to associate this box to an unique identifier. - // The inheritance information is also made available, as we provide the superclass Toolkit::TBoxAlgorithm < IBoxAlgorithm > - _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_TactiloController) - - protected: - // Input decoder: - Toolkit::TStimulationDecoder m_StimDecoder; - // Output decoder: - Toolkit::TStimulationEncoder m_StimEncoder; - - private: - //variable to store the current TactiloNr - uint64_t m_currTactiloID = 0; - //Box Settings - CString m_PortName = ""; - uint64_t m_RowBase = 0; - uint64_t m_nTactilos = 0; - - //Serial Port - boost::asio::io_service m_IOService; - boost::asio::serial_port m_Port{m_IOService}; - }; - - /// Descriptor of the box Tactilo Controller. - class CBoxAlgorithmTactiloControllerDesc final : virtual public IBoxAlgorithmDesc - { - public: - - void release() override { } - - CString getName() const override { return CString("Tactilo Controller"); } - CString getAuthorName() const override { return CString("Tobias Baumann"); } - CString getAuthorCompanyName() const override { return CString("TH-Nürnberg"); } - CString getShortDescription() const override { return CString("Controls the Tactilos on the Lattepandas GPIOs"); } - CString getDetailedDescription() const override { return CString("Communicates with the Arduino Coprocessor of the Lattepanda over a Serial Inteface, to control the Tactilos connected to the Arduinos GPIOs"); } - CString getCategory() const override { return CString("TactileBCI"); } - CString getVersion() const override { return CString("1.0"); } - CString getStockItemName() const override { return CString("gtk-network"); } - - CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_TactiloController; } - IPluginObject* create() override { return new CBoxAlgorithmTactiloController; } - - bool getBoxPrototype(Kernel::IBoxProto& prototype) const override - { - prototype.addInput("StimInput",OV_TypeId_Stimulations); - - //prototype.addFlag(Kernel::BoxFlag_CanModifyInput); - //prototype.addFlag(Kernel::BoxFlag_CanAddInput); - - prototype.addOutput("StimOutput",OV_TypeId_Stimulations); - - //prototype.addFlag(Kernel::BoxFlag_CanModifyOutput); - //prototype.addFlag(Kernel::BoxFlag_CanAddOutput); - - //Box Settings - prototype.addSetting("Serial Port Name",OV_TypeId_String,"/dev/ttyACM0"); - prototype.addSetting("Row Stimulation Base",OV_TypeId_Stimulation,"OVTK_StimulationId_Label_01"); - prototype.addSetting("Number of Tactilos",OV_TypeId_Integer,"6"); - - //prototype.addFlag(Kernel::BoxFlag_CanModifySetting); - //prototype.addFlag(Kernel::BoxFlag_CanAddSetting); - - prototype.addFlag(OV_AttributeId_Box_FlagIsUnstable); - - return true; - } - _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_TactiloControllerDesc) - }; - } // namespace Tactilebci - } // namespace Plugins -} // namespace OpenViBE diff --git a/src/UDPStimCodeSender/ovpCBoxAlgorithmUDPStimcodeSender.cpp b/src/UDPStimCodeSender/ovpCBoxAlgorithmUDPStimcodeSender.cpp deleted file mode 100644 index 0e0412f..0000000 --- a/src/UDPStimCodeSender/ovpCBoxAlgorithmUDPStimcodeSender.cpp +++ /dev/null @@ -1,113 +0,0 @@ -///------------------------------------------------------------------------------------------------- -/// -/// \file CBoxAlgorithmUDPStimcodeSender.cpp -/// \brief Functions of Class UDP-StimCode-Sender -/// \author Tobias Baumann (TH Nuernberg). -/// \version 1.2. -/// \date Mon Oct 04 12:43:53 2021. -/// \copyright GNU Affero General Public License v3.0. -/// -///------------------------------------------------------------------------------------------------- - -//includes -#include "ovpCBoxAlgorithmUDPStimcodeSender.h" - -using namespace OpenViBE; -using namespace /*OpenViBE::*/Kernel; -using namespace /*OpenViBE::*/Plugins; -using namespace /*OpenViBE::Plugins::*/Tactilebci; - -bool CBoxAlgorithmUDPStimcodeSender::initialize() -{ - m_StimDecoder.initialize(*this, 0); - m_StimEncoder.initialize(*this, 0); - - // retrieve box settings - m_IP = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 0); - m_Port = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 1); - m_RowBase = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 2); - m_nTactilos = FSettingValueAutoCast(*this->getBoxAlgorithmContext(), 3); - - //set m_nTactilos to 2 if lower than 2 - if(m_nTactilos < 2) - { - m_nTactilos = 2; - } - //set m_nTactilos to MAX if greater than MAX_TACTILOS - if(m_nTactilos > MAX_TACTILOS) - { - m_nTactilos = MAX_TACTILOS; - } - - // connect UDP socket - boost::asio::ip::udp::endpoint m_Endpoint(boost::asio::ip::address::from_string(m_IP), m_Port); - m_Socket.connect(m_Endpoint); - - return true; -} -/*******************************************************************************/ - -bool CBoxAlgorithmUDPStimcodeSender::uninitialize() -{ - m_StimDecoder.uninitialize(); - m_StimEncoder.uninitialize(); - - return true; -} -/*******************************************************************************/ - -bool CBoxAlgorithmUDPStimcodeSender::processInput(const size_t index) -{ - // some pre-processing code if needed... - - // ready to process ! - getBoxAlgorithmContext()->markAlgorithmAsReadyToProcess(); - - return true; -} - -/*******************************************************************************/ - - -bool CBoxAlgorithmUDPStimcodeSender::process() -{ - - // the static box context describes the box inputs, outputs, settings structures - const IBox& staticBoxContext = this->getStaticBoxContext(); - // the dynamic box context describes the current state of the box inputs and outputs (i.e. the chunks) - IBoxIO& boxContext = this->getDynamicBoxContext(); - uint64_t StimulationID = 0; - uint64_t ChunkStartTime = 0; - uint64_t ChunkEndTime = 0; - uint64_t Size = 0; - const uint8_t* Buffer = nullptr; - - //iterate over all chunk on input 0 - for (uint64_t i = 0; i < boxContext.getInputChunkCount(0); ++i) - { - // decode the chunk i - m_StimDecoder.decode(i); - if(m_StimDecoder.isBufferReceived()) - { - //check received stimulations - IStimulationSet* StimSet = m_StimDecoder.getOutputStimulationSet(); - for(uint64_t j=0; jgetStimulationCount(); j++) - { - StimulationID = StimSet->getStimulationIdentifier(j); - - if(StimulationID >= m_RowBase && StimulationID < (m_RowBase + m_nTactilos)) - { - this->getLogManager() << LogLevel_Debug << "send udp : [StimulusCode " << (StimulationID-m_RowBase+1) << "]\n"; - m_Socket.send(boost::asio::buffer(std::to_string(StimulationID-m_RowBase+1))); - } - } - } - // forward input chunks - boxContext.getInputChunk(0, i, ChunkStartTime, ChunkEndTime, Size, Buffer); - boxContext.appendOutputChunkData(0, Buffer, Size); - boxContext.markOutputAsReadyToSend(0, ChunkStartTime, ChunkEndTime); - boxContext.markInputAsDeprecated(0, i); - } - - return true; -} diff --git a/src/UDPStimCodeSender/ovpCBoxAlgorithmUDPStimcodeSender.h b/src/UDPStimCodeSender/ovpCBoxAlgorithmUDPStimcodeSender.h deleted file mode 100644 index 223b330..0000000 --- a/src/UDPStimCodeSender/ovpCBoxAlgorithmUDPStimcodeSender.h +++ /dev/null @@ -1,107 +0,0 @@ -///------------------------------------------------------------------------------------------------- -/// -/// \file CBoxAlgorithmUDPStimcodeSender.h -/// \brief Classes of the Box UDPStimcodeSender. -/// \author Tobias Baumann (TH Nuernberg). -/// \version 1.1. -/// \date Mon Oct 04 12:43:53 2021. -/// \copyright GNU Affero General Public License v3.0. -/// -///------------------------------------------------------------------------------------------------- - -//includes -#pragma once -//You may have to change this path to match your folder organisation -#include "../ovp_defines.h" - -#include -#include -#include - - -namespace OpenViBE -{ - namespace Plugins - { - namespace Tactilebci - { - /// The class CBoxAlgorithmUDPStimcodeSender describes the box UDPStimcodeSender. - class CBoxAlgorithmUDPStimcodeSender final : virtual public Toolkit::TBoxAlgorithm - { - public: - void release() override { delete this; } - - bool initialize() override; - bool uninitialize() override; - bool processInput(const size_t index) override; - bool process() override; - - // As we do with any class in openvibe, we use the macro below to associate this box to an unique identifier. - // The inheritance information is also made available, as we provide the superclass Toolkit::TBoxAlgorithm < IBoxAlgorithm > - _IsDerivedFromClass_Final_(Toolkit::TBoxAlgorithm, OVP_ClassId_BoxAlgorithm_UDPStimcodeSender) - - protected: - // Input decoder: - Toolkit::TStimulationDecoder m_StimDecoder; - // Output decoder: - Toolkit::TStimulationEncoder m_StimEncoder; - private: - // Box setting variables - CString m_IP = ""; - uint64_t m_Port = 0; - uint64_t m_RowBase = 0; - uint64_t m_nTactilos = 0; - // Socket - boost::asio::io_service m_IOService; - boost::asio::ip::udp::socket m_Socket{m_IOService}; - }; - - - /// Descriptor of the box UDPStimcodeSender. - class CBoxAlgorithmUDPStimcodeSenderDesc final : virtual public IBoxAlgorithmDesc - { - public: - - void release() override { } - - CString getName() const override { return CString("UDPStimcodeSender"); } - CString getAuthorName() const override { return CString("Tobias Baumann"); } - CString getAuthorCompanyName() const override { return CString("TH Nuernberg"); } - CString getShortDescription() const override { return CString("Sends Stimulationcodes via UDP"); } - CString getDetailedDescription() const override { return CString("Sends the received Stimulationcodes the Adafruit Feather, using UDP. The Input Stimulation will be passed to the Output unchanged."); } - CString getCategory() const override { return CString("TactileBCI"); } - CString getVersion() const override { return CString("1.1"); } - CString getStockItemName() const override { return CString("gtk-network"); } - - CIdentifier getCreatedClass() const override { return OVP_ClassId_BoxAlgorithm_UDPStimcodeSender; } - IPluginObject* create() override { return new CBoxAlgorithmUDPStimcodeSender; } - - bool getBoxPrototype(Kernel::IBoxProto& prototype) const override - { - prototype.addInput("StimcodeIn",OV_TypeId_Stimulations); - - //prototype.addFlag(Kernel::BoxFlag_CanModifyInput); - //prototype.addFlag(Kernel::BoxFlag_CanAddInput); - - prototype.addOutput("StimcodeOut",OV_TypeId_Stimulations); - - //prototype.addFlag(Kernel::BoxFlag_CanModifyOutput); - //prototype.addFlag(Kernel::BoxFlag_CanAddOutput); - - prototype.addSetting("FeatherIP",OV_TypeId_String,"192.168.4.1"); - prototype.addSetting("FeatherPort",OV_TypeId_Integer,"8888"); - prototype.addSetting("RowStimulationBase",OV_TypeId_Stimulation,"OVTK_StimulationId_Label_01"); - prototype.addSetting("Number of Tactilos",OV_TypeId_Integer,"6"); - - prototype.addFlag(Kernel::BoxFlag_CanModifySetting); - //prototype.addFlag(Kernel::BoxFlag_CanAddSetting); - - prototype.addFlag(OV_AttributeId_Box_FlagIsUnstable); - - return true; - } - _IsDerivedFromClass_Final_(IBoxAlgorithmDesc, OVP_ClassId_BoxAlgorithm_UDPStimcodeSenderDesc) - }; - } // namespace Tactilebci - } // namespace Plugins -} // namespace OpenViBE diff --git a/src/ovp_defines.h b/src/ovp_defines.h deleted file mode 100644 index dd2aa11..0000000 --- a/src/ovp_defines.h +++ /dev/null @@ -1,36 +0,0 @@ -///------------------------------------------------------------------------------------------------- -/// -/// \file ovp_defines.h -/// \brief defines for the TactileBCI Plugin -/// \author Tobias Baumann (TH-Nürnberg). -/// \date Mon Feb 04 14:59:56 2022. -/// \copyright GNU Affero General Public License v3.0. -/// -///------------------------------------------------------------------------------------------------- - -#pragma once - -// Boxes -// The unique identifiers for the boxes and their descriptors. -// Identifier are randomly chosen by the skeleton-generator. -//--------------------------------------------------------------------------------------------------- -#define OVP_ClassId_BoxAlgorithm_P300TactileVisualization OpenViBE::CIdentifier(0xd463df86, 0x7fbfdd81) -#define OVP_ClassId_BoxAlgorithm_P300TactileVisualizationDesc OpenViBE::CIdentifier(0x3e7f0ef5, 0x5ca2a1fc) - -#define OVP_ClassId_BoxAlgorithm_UDPStimcodeSender OpenViBE::CIdentifier(0xc326e786, 0xcd512965) -#define OVP_ClassId_BoxAlgorithm_UDPStimcodeSenderDesc OpenViBE::CIdentifier(0x82aeb3c9, 0x37303d0e) - -#define OVP_ClassId_BoxAlgorithm_TactiloController OpenViBE::CIdentifier(0x823bbe28, 0x0daf2111) -#define OVP_ClassId_BoxAlgorithm_TactiloControllerDesc OpenViBE::CIdentifier(0xdb6e9c60, 0x4ce98ac3) - -// Global defines -//--------------------------------------------------------------------------------------------------- -#define MAX_TACTILOS 10 - -#ifdef TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines -#include "ovp_global_defines.h" -#endif // TARGET_HAS_ThirdPartyOpenViBEPluginsGlobalDefines - -#define OV_AttributeId_Box_FlagIsUnstable OpenViBE::CIdentifier(0x666FFFFF, 0x666FFFFF) - - diff --git a/src/ovp_main.cpp b/src/ovp_main.cpp deleted file mode 100644 index 7c6bc37..0000000 --- a/src/ovp_main.cpp +++ /dev/null @@ -1,34 +0,0 @@ -///------------------------------------------------------------------------------------------------- -/// -/// \file ovp_main.cpp -/// \brief Declarations/Includes for the TactileBCI Plugin -/// \author Tobias Baumann (TH-Nürnberg). -/// \date Mon Feb 07 14:59:56 2022. -/// \copyright GNU Affero General Public License v3.0. -/// -///------------------------------------------------------------------------------------------------- - -//Tactile BCI Includes -#include -#include -#include "ovp_defines.h" - -#include "TactileVisualization/ovpCBoxAlgorithmP300TactileVisualization.h" -#include "UDPStimCodeSender/ovpCBoxAlgorithmUDPStimcodeSender.h" -#include "TactiloController/ovpCBoxAlgorithmTactiloController.h" - -namespace OpenViBE { - namespace Plugins { - namespace Tactilebci { - - OVP_Declare_Begin() - - OVP_Declare_New(CBoxAlgorithmP300TactileVisualizationDesc); - OVP_Declare_New(CBoxAlgorithmUDPStimcodeSenderDesc); - OVP_Declare_New(CBoxAlgorithmTactiloControllerDesc); - - OVP_Declare_End() - - } // namespace Tactilebci - } // namespace Plugins -} // namespace OpenViBE diff --git a/src/utils.h b/src/utils.h deleted file mode 100644 index b24a234..0000000 --- a/src/utils.h +++ /dev/null @@ -1,50 +0,0 @@ -#pragma once - -#include -#include -#include - -//--------------------------------------------------------------------------------------------------- -/// Initializes the color of the GDK. with old compiler as vs2013 we can't initialize structure easily..... -/// For allocated colors, the pixel value used to draw this color on the screen.Not used anymore. -/// The red component of the color. This is a value between 0 and 65535, with 65535 indicating full intensity. -/// The green component of the color. -/// The blue component of the color. -/// The initialized color ( -inline GdkColor InitGDKColor(const guint32 pixel = 0, const guint16 r = 0, const guint16 g = 0, const guint16 b = 0) -{ - GdkColor c; - c.pixel = pixel; - c.red = r; - c.green = g; - c.blue = b; - return c; -} -//--------------------------------------------------------------------------------------------------- - -//--------------------------------------------------------------------------------------------------- -class CGdkcolorAutoCast -{ -public: - CGdkcolorAutoCast(const OpenViBE::Kernel::IBox& box, OpenViBE::Kernel::IConfigurationManager& configManager, const size_t index) - : m_configManager(configManager) - { - box.getSettingValue(index, m_settingValue); - m_settingValue = m_configManager.expand(m_settingValue); - } - - operator GdkColor() const - { - std::stringstream ss(m_settingValue.toASCIIString()); - int r = 0, g = 0, b = 0; - char c; - ss >> r >> c >> g >> c >> b; - return InitGDKColor(0, guint16(r * 655.35), guint16(g * 655.35), guint16(b * 655.35)); - } - -protected: - OpenViBE::Kernel::IConfigurationManager& m_configManager; - OpenViBE::CString m_settingValue; -}; - -//---------------------------------------------------------------------------------------------------