diff --git a/contrib/applications/demos/p300-speller-unsupervised/share/p300_Initialize.m b/contrib/applications/demos/p300-speller-unsupervised/share/p300_Initialize.m index 8f8a5b470a9dacbbbad8606b85a14f61bc152ad0..4992153f937bc334604b68ea87c9b9bb8e87c0cf 100755 --- a/contrib/applications/demos/p300-speller-unsupervised/share/p300_Initialize.m +++ b/contrib/applications/demos/p300-speller-unsupervised/share/p300_Initialize.m @@ -16,18 +16,17 @@ function box_out = p300_Initialize(box_in) % We carry settings in this structure instead of using global variables box_in.user_data.flashes_per_trial = box_in.settings(1).value; box_in.user_data.debug = box_in.settings(2).value; - box_in.user_data.max_trials = 15; - box_in.user_data.keyboard_cols = 7; % @FIXME bad hardcoding + box_in.user_data.max_trials = 15; % max number of trials retained for building the classifier + % and how many past letters can be affected + box_in.user_data.keyboard_cols = 7; % @FIXME bad hardcoding box_in.user_data.previous_time = 0; box_in.user_data.gfeatures = []; + box_in.user_data.oldSelections = []; % set of letter predictions from before max_trials was reached box_in.user_data.total_flashes = 0; box_in.user_data.total_trials = 0; box_in.user_data.C = []; % classifier % fprintf(1,'%d\n', box_in.settings(1).value); - - % declare some identifiers - % OV_stimulations(); box_out = box_in; diff --git a/contrib/applications/demos/p300-speller-unsupervised/share/p300_Process.m b/contrib/applications/demos/p300-speller-unsupervised/share/p300_Process.m index 46699897b7047b52b7265f1367917a0c895d6407..7fdcba993f357c74df9a2f4acf0225f8a860d73f 100755 --- a/contrib/applications/demos/p300-speller-unsupervised/share/p300_Process.m +++ b/contrib/applications/demos/p300-speller-unsupervised/share/p300_Process.m @@ -117,16 +117,19 @@ function box_out = p300_Process(box_in) box_in.user_data.gsequence, ... [],box_in.user_data.flashes_per_trial,A,gamma,1:numTrials,false); - % predict - % output prediction (2 stim pair?), print letter + % predict which letter was selected [~,select]=max(box_in.user_data.C.classifier.probs,[],2); + % Include predictions from before maxFeatures was reached + box_in.user_data.selection = select; + select = [box_in.user_data.oldSelections;select]; + if(box_in.user_data.debug) fprintf(1,'Trial %03d end (at %f s, %d flashes total, %d trls used, fd %d): Spelled so far: %s\n', ... box_in.user_data.total_trials, end_time, ... box_in.user_data.total_flashes, numTrials, size(features,2), convert_position_to_letter(select)); end - + % Convert select to stimulations select = select - 1; rowidx = floor(select / box_in.user_data.keyboard_cols); @@ -140,6 +143,11 @@ function box_out = p300_Process(box_in) stim_set = [stim_set, [double(OVTK_StimulationId_SegmentStop); time_now; 0]]; box_in = OV_addOutputBuffer(box_in,1,box_in.user_data.previous_time,time_now,stim_set); + + if(box_in.user_data.total_flashes >= maxFeatures) + box_in.user_data.oldSelections = [box_in.user_data.oldSelections;box_in.user_data.selection(1)]; + end + else box_in = OV_addOutputBuffer(box_in,1,box_in.user_data.previous_time,time_now,[]); end diff --git a/contrib/applications/demos/p300-speller-unsupervised/share/start-stimulator.lua b/contrib/applications/demos/p300-speller-unsupervised/share/start-stimulator.lua new file mode 100755 index 0000000000000000000000000000000000000000..099017d02b47e7aceca6759d5d03647e5b5d5b60 --- /dev/null +++ b/contrib/applications/demos/p300-speller-unsupervised/share/start-stimulator.lua @@ -0,0 +1,21 @@ +delay = 1 + +function initialize(box) + s_delay = box:get_setting(2); + + io.write(string.format("Delay : [%s]\n", s_delay)) + + if (s_delay:find("^%d+$") ~= nil) then + delay = tonumber(s_delay) + else + io.write("[ERROR] The parameter should be a numeric value\n") + end + +end + +function uninitialize(box) +end + +function process(box) + box:send_stimulation(1, 0x00008001, delay, 0) +end diff --git a/contrib/applications/demos/p300-speller-unsupervised/share/unsupervised-p300-online-1.xml b/contrib/applications/demos/p300-speller-unsupervised/share/unsupervised-p300-online-1.xml index 6b647b6cd0723491eca65703ebc3adfb59da79a0..52138b6b38e6cc797fced6240a0129f0d84faa24 100755 --- a/contrib/applications/demos/p300-speller-unsupervised/share/unsupervised-p300-online-1.xml +++ b/contrib/applications/demos/p300-speller-unsupervised/share/unsupervised-p300-online-1.xml @@ -1,7 +1,7 @@ <OpenViBE-Scenario> <FormatVersion>1</FormatVersion> <Creator>OpenViBE Designer</Creator> - <CreatorVersion>2.0.0</CreatorVersion> + <CreatorVersion>2.0.1</CreatorVersion> <Settings></Settings> <Inputs></Inputs> <Outputs></Outputs> @@ -136,6 +136,71 @@ </Attribute> </Attributes> </Box> + <Box> + <Identifier>(0x00002684, 0x00005b3b)</Identifier> + <Name>Lua Stimulator</Name> + <AlgorithmClassIdentifier>(0x0b5a2787, 0x02750621)</AlgorithmClassIdentifier> + <Outputs> + <Output> + <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> + <Name>Stimulations</Name> + </Output> + </Outputs> + <Settings> + <Setting> + <TypeIdentifier>(0xb0d0db45, 0x49cbc34a)</TypeIdentifier> + <Name>Lua Script</Name> + <DefaultValue></DefaultValue> + <Value>${Player_ScenarioDirectory}/start-stimulator.lua</Value> + <Modifiability>false</Modifiability> + </Setting> + <Setting> + <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> + <Name>Start delay (secs)</Name> + <DefaultValue>5</DefaultValue> + <Value>5</Value> + <Modifiability>false</Modifiability> + </Setting> + </Settings> + <Attributes> + <Attribute> + <Identifier>(0x17ee7c08, 0x94c14893)</Identifier> + <Value></Value> + </Attribute> + <Attribute> + <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> + <Value>-144</Value> + </Attribute> + <Attribute> + <Identifier>(0x207c9054, 0x3c841b63)</Identifier> + <Value>896</Value> + </Attribute> + <Attribute> + <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> + <Value>(0xd6e3f48b, 0xbee3523a)</Value> + </Attribute> + <Attribute> + <Identifier>(0x61d11811, 0x71e65362)</Identifier> + <Value></Value> + </Attribute> + <Attribute> + <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> + <Value>1</Value> + </Attribute> + <Attribute> + <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> + <Value>1</Value> + </Attribute> + <Attribute> + <Identifier>(0xf191c1c8, 0xa0123976)</Identifier> + <Value></Value> + </Attribute> + <Attribute> + <Identifier>(0xfba64161, 0x65304e21)</Identifier> + <Value></Value> + </Attribute> + </Attributes> + </Box> <Box> <Identifier>(0x00002bb3, 0x0000133c)</Identifier> <Name>Acquisition client</Name> @@ -301,6 +366,10 @@ <Identifier>(0x207c9054, 0x3c841b63)</Identifier> <Value>560</Value> </Attribute> + <Attribute> + <Identifier>(0x341d3912, 0x1478de86)</Identifier> + <Value>1</Value> + </Attribute> <Attribute> <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> <Value>(0x92c056a7, 0x2dc71aff)</Value> @@ -319,55 +388,6 @@ </Attribute> </Attributes> </Box> - <Box> - <Identifier>(0x00003a0e, 0x0000636c)</Identifier> - <Name>Clock stimulator</Name> - <AlgorithmClassIdentifier>(0x4f756d3f, 0x29ff0b96)</AlgorithmClassIdentifier> - <Outputs> - <Output> - <TypeIdentifier>(0x6f752dd0, 0x082a321e)</TypeIdentifier> - <Name>Generated stimulations</Name> - </Output> - </Outputs> - <Settings> - <Setting> - <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> - <Name>Interstimulation interval (in sec)</Name> - <DefaultValue>1.0</DefaultValue> - <Value>5</Value> - <Modifiability>false</Modifiability> - </Setting> - <Setting> - <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> - <Name>Stimulation</Name> - <DefaultValue>OVTK_StimulationId_Label_00</DefaultValue> - <Value>OVTK_StimulationId_Label_00</Value> - <Modifiability>false</Modifiability> - </Setting> - </Settings> - <Attributes> - <Attribute> - <Identifier>(0x1fa7a38f, 0x54edbe0b)</Identifier> - <Value>-128</Value> - </Attribute> - <Attribute> - <Identifier>(0x207c9054, 0x3c841b63)</Identifier> - <Value>896</Value> - </Attribute> - <Attribute> - <Identifier>(0x4e7b798a, 0x183beafb)</Identifier> - <Value>(0x27b3ee3c, 0xc50527e6)</Value> - </Attribute> - <Attribute> - <Identifier>(0xc80ce8af, 0xf699f813)</Identifier> - <Value>1</Value> - </Attribute> - <Attribute> - <Identifier>(0xce18836a, 0x9c0eb403)</Identifier> - <Value>2</Value> - </Attribute> - </Attributes> - </Box> <Box> <Identifier>(0x00003d0e, 0x000025ef)</Identifier> <Name>Player Controller</Name> @@ -836,7 +856,7 @@ <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> <Name>Flash font size</Name> <DefaultValue>100</DefaultValue> - <Value>95</Value> + <Value>60</Value> <Modifiability>false</Modifiability> </Setting> <Setting> @@ -857,7 +877,7 @@ <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> <Name>No flash font size</Name> <DefaultValue>75</DefaultValue> - <Value>75</Value> + <Value>60</Value> <Modifiability>false</Modifiability> </Setting> <Setting> @@ -878,7 +898,7 @@ <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> <Name>Target font size</Name> <DefaultValue>100</DefaultValue> - <Value>75</Value> + <Value>60</Value> <Modifiability>false</Modifiability> </Setting> <Setting> @@ -899,7 +919,7 @@ <TypeIdentifier>(0x007deef9, 0x2f3e95c6)</TypeIdentifier> <Name>Selected font size</Name> <DefaultValue>100</DefaultValue> - <Value>75</Value> + <Value>60</Value> <Modifiability>false</Modifiability> </Setting> </Settings> @@ -968,14 +988,14 @@ <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> <Name>Low Cut-off Frequency (Hz)</Name> <DefaultValue>1</DefaultValue> - <Value>1</Value> + <Value>0.5</Value> <Modifiability>false</Modifiability> </Setting> <Setting> <TypeIdentifier>(0x512a166f, 0x5c3ef83f)</TypeIdentifier> <Name>High Cut-off Frequency (Hz)</Name> <DefaultValue>40</DefaultValue> - <Value>40</Value> + <Value>12</Value> <Modifiability>false</Modifiability> </Setting> <Setting> @@ -1042,7 +1062,7 @@ <TypeIdentifier>(0x2c132d6e, 0x44ab0d97)</TypeIdentifier> <Name>Start stimulation</Name> <DefaultValue>OVTK_StimulationId_Label_00</DefaultValue> - <Value>OVTK_StimulationId_Label_00</Value> + <Value>OVTK_StimulationId_ExperimentStart</Value> <Modifiability>false</Modifiability> </Setting> <Setting> @@ -1140,7 +1160,7 @@ <TypeIdentifier>(0x79a9edeb, 0x245d83fc)</TypeIdentifier> <Name>Text to spell</Name> <DefaultValue>quick_brown_fox</DefaultValue> - <Value>quick_brown_fox</Value> + <Value>quick_brown_fox_jumps_over_the_lazy_dog</Value> <Modifiability>false</Modifiability> </Setting> </Settings> @@ -1559,17 +1579,6 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> - <Link> - <Identifier>(0x00003417, 0x00005898)</Identifier> - <Source> - <BoxIdentifier>(0x00003a0e, 0x0000636c)</BoxIdentifier> - <BoxOutputIndex>0</BoxOutputIndex> - </Source> - <Target> - <BoxIdentifier>(0x00007262, 0x00006c13)</BoxIdentifier> - <BoxInputIndex>0</BoxInputIndex> - </Target> - </Link> <Link> <Identifier>(0x00003659, 0x000038f5)</Identifier> <Source> @@ -1669,6 +1678,17 @@ <BoxInputIndex>0</BoxInputIndex> </Target> </Link> + <Link> + <Identifier>(0x00005fd4, 0x00005832)</Identifier> + <Source> + <BoxIdentifier>(0x00002684, 0x00005b3b)</BoxIdentifier> + <BoxOutputIndex>0</BoxOutputIndex> + </Source> + <Target> + <BoxIdentifier>(0x00007262, 0x00006c13)</BoxIdentifier> + <BoxInputIndex>0</BoxInputIndex> + </Target> + </Link> <Link> <Identifier>(0x00006a33, 0x00004bb6)</Identifier> <Source> diff --git a/plugins/processing/simple-visualisation/src/box-algorithms/ovpCBoxAlgorithmP300SpellerVisualisation2.cpp b/plugins/processing/simple-visualisation/src/box-algorithms/ovpCBoxAlgorithmP300SpellerVisualisation2.cpp index 3b6902878fbfd4b90d61345e52a403d71f71a410..d24c9b895474813bed1c62e3ccf316cd796408d0 100755 --- a/plugins/processing/simple-visualisation/src/box-algorithms/ovpCBoxAlgorithmP300SpellerVisualisation2.cpp +++ b/plugins/processing/simple-visualisation/src/box-algorithms/ovpCBoxAlgorithmP300SpellerVisualisation2.cpp @@ -159,16 +159,28 @@ bool CBoxAlgorithmP300SpellerVisualisation2::initialize(void) l_ui64MaxSize=std::max(l_ui64MaxSize, m_ui64TargetFontSize); l_ui64MaxSize=std::max(l_ui64MaxSize, m_ui64SelectedFontSize); + ::PangoFontDescription *l_pTmp = pango_context_get_font_description(gtk_widget_get_pango_context(GTK_WIDGET(m_pTarget))); + pango_font_description_set_family(l_pTmp, "mono"); + l_pTmp = pango_context_get_font_description(gtk_widget_get_pango_context(GTK_WIDGET(m_pResult))); + pango_font_description_set_family(l_pTmp, "mono"); + l_pTmp = pango_context_get_font_description(gtk_widget_get_pango_context(GTK_WIDGET(gtk_builder_get_object(m_pMainWidgetInterface, "label-target-title")))); + pango_font_description_set_family(l_pTmp, "mono"); + l_pTmp = pango_context_get_font_description(gtk_widget_get_pango_context(GTK_WIDGET(gtk_builder_get_object(m_pMainWidgetInterface, "label-result-title")))); + pango_font_description_set_family(l_pTmp, "mono"); + pango_font_description_set_size(l_pMaxFontDescription, (gint)(l_ui64MaxSize * PANGO_SCALE)); pango_font_description_set_size(m_pFlashFontDescription, (gint)(m_ui64FlashFontSize * PANGO_SCALE)); pango_font_description_set_size(m_pNoFlashFontDescription, (gint)(m_ui64NoFlashFontSize * PANGO_SCALE)); pango_font_description_set_size(m_pTargetFontDescription, (gint)(m_ui64TargetFontSize * PANGO_SCALE)); pango_font_description_set_size(m_pSelectedFontDescription, (gint)(m_ui64SelectedFontSize * PANGO_SCALE)); + pango_font_description_set_weight(m_pFlashFontDescription, PANGO_WEIGHT_SEMIBOLD); + pango_font_description_set_weight(m_pNoFlashFontDescription, PANGO_WEIGHT_LIGHT); + this->_cache_build_from_table_(m_pTable); this->_cache_for_each_(&CBoxAlgorithmP300SpellerVisualisation2::_cache_change_background_cb_, &m_oNoFlashBackgroundColor); this->_cache_for_each_(&CBoxAlgorithmP300SpellerVisualisation2::_cache_change_foreground_cb_, &m_oNoFlashForegroundColor); - this->_cache_for_each_(&CBoxAlgorithmP300SpellerVisualisation2::_cache_change_font_cb_, l_pMaxFontDescription); + this->_cache_for_each_(&CBoxAlgorithmP300SpellerVisualisation2::_cache_change_font_cb_, m_pFlashFontDescription); pango_font_description_free(l_pMaxFontDescription);