Permalink
Browse files

Merge remote-tracking branch 'upstream/master' into cmake_fix

  • Loading branch information...
2 parents 9c809e9 + 975fa06 commit 322512a616fb6be156c5ed253e6712b57baae7da @cboulay cboulay committed Mar 29, 2017
Showing with 5,464 additions and 1,534 deletions.
  1. +4 −2 Apps/BrainProducts/ActiChamp/ActiChamp.vcproj
  2. +1 −1 Apps/BrainProducts/ActiChamp/ActiChamp_config.cfg
  3. BIN Apps/BrainProducts/ActiChamp/explanation_of_trigger_marker_types.pdf
  4. +102 −14 Apps/BrainProducts/ActiChamp/mainwindow.cpp
  5. +4 −0 Apps/BrainProducts/ActiChamp/mainwindow.h
  6. +73 −4 Apps/BrainProducts/ActiChamp/mainwindow.ui
  7. +394 −0 Apps/BrainProducts/ActiChamp/ui_mainwindow.h
  8. BIN Apps/BrainProducts/ActiChamp/vc90.idb
  9. +2 −1 Apps/BrainProducts/BrainAmpSeries/BrainAmpSeries.vcproj
  10. +1 −1 Apps/BrainProducts/BrainAmpSeries/BrainAmpSeries_config.cfg
  11. BIN Apps/BrainProducts/BrainAmpSeries/explanation_of_trigger_marker_types.pdf
  12. +359 −0 Apps/BrainProducts/BrainAmpSeries/mainwindow-rev.cpp
  13. +122 −15 Apps/BrainProducts/BrainAmpSeries/mainwindow.cpp
  14. +8 −0 Apps/BrainProducts/BrainAmpSeries/mainwindow.h
  15. +64 −4 Apps/BrainProducts/BrainAmpSeries/mainwindow.ui
  16. +404 −0 Apps/BrainProducts/BrainAmpSeries/ui_mainwindow.h
  17. BIN Apps/BrainProducts/BrainAmpSeries/vc90.idb
  18. +447 −0 Apps/BrainProducts/LiveAmp/LiveAmp.cpp
  19. +85 −0 Apps/BrainProducts/LiveAmp/LiveAmp.h
  20. +1 −1 Apps/BrainProducts/LiveAmp/{LiveAmp2010.sln → LiveAmp.sln}
  21. +14 −12 Apps/BrainProducts/LiveAmp/{LiveAmp2010.vcxproj → LiveAmp.vcxproj}
  22. +26 −23 Apps/BrainProducts/LiveAmp/{LiveAmp2010.vcxproj.filters → LiveAmp.vcxproj.filters}
  23. +525 −0 Apps/BrainProducts/LiveAmp/LiveAmpHelperFuncs-ratko.cpp
  24. +1 −1 Apps/BrainProducts/LiveAmp/LiveAmp_config.cfg
  25. BIN Apps/BrainProducts/LiveAmp/explanation_of_trigger_marker_types.pdf
  26. +319 −658 Apps/BrainProducts/LiveAmp/mainwindow.cpp
  27. +31 −10 Apps/BrainProducts/LiveAmp/mainwindow.h
  28. +236 −40 Apps/BrainProducts/LiveAmp/mainwindow.ui
  29. +242 −49 Apps/BrainProducts/LiveAmp/ui_mainwindow.h
  30. BIN Apps/BrainProducts/LiveAmp/vc100.idb
  31. +17 −0 Apps/BrainProducts/VAmp/README.txt
  32. +271 −0 Apps/BrainProducts/VAmp/Resampler.h
  33. +5 −5 Apps/BrainProducts/VAmp/{VAmp2010.sln → VAmp.sln}
  34. +60 −61 Apps/BrainProducts/VAmp/{VAmp2010.vcxproj → VAmp.vcxproj}
  35. +14 −13 Apps/BrainProducts/VAmp/{VAmp2010.vcxproj.filters → VAmp.vcxproj.filters}
  36. BIN Apps/BrainProducts/VAmp/VAmp2010.rc
  37. +1 −1 Apps/BrainProducts/VAmp/VAmp_config.cfg
  38. BIN Apps/BrainProducts/VAmp/explanation_of_trigger_marker_types.pdf
  39. +5 −1 Apps/BrainProducts/VAmp/main.cpp
  40. +197 −543 Apps/BrainProducts/VAmp/mainwindow.cpp
  41. +9 −5 Apps/BrainProducts/VAmp/mainwindow.h
  42. +75 −38 Apps/BrainProducts/VAmp/mainwindow.ui
  43. +71 −28 Apps/BrainProducts/VAmp/ui_mainwindow.h
  44. +1 −0 Apps/OpenVR/.gitignore
  45. +109 −0 Apps/OpenVR/CMakeLists.txt
  46. +62 −0 Apps/OpenVR/README.md
  47. +74 −0 Apps/OpenVR/cmake/FindLSL.cmake
  48. +88 −0 Apps/OpenVR/cmake/FindOpenVR.cmake
  49. +5 −0 Apps/OpenVR/openvr_config.cfg
  50. +84 −0 Apps/OpenVR/src/CMakeLists.txt
  51. +23 −0 Apps/OpenVR/src/main.cpp
  52. +130 −0 Apps/OpenVR/src/mainwindow.cpp
  53. +42 −0 Apps/OpenVR/src/mainwindow.h
  54. +169 −0 Apps/OpenVR/src/mainwindow.ui
  55. +425 −0 Apps/OpenVR/src/openvrthread.cpp
  56. +52 −0 Apps/OpenVR/src/openvrthread.h
  57. +1 −0 LSL/liblsl/src/api_config.cpp
  58. +3 −1 LSL/liblsl/src/api_config.h
  59. +6 −2 LSL/liblsl/src/stream_outlet_impl.h
@@ -1,9 +1,10 @@
<?xml version="1.0" encoding="Windows-1252"?>
<VisualStudioProject
ProjectType="Visual C++"
- Version="9.00"
+ Version="9,00"
Name="ActiChamp"
ProjectGUID="{F63650CA-477B-3725-8C9E-DF4E4A710E9C}"
+ RootNamespace="ActiChamp"
Keyword="Qt4VSv1.0"
TargetFrameworkVersion="0"
>
@@ -229,7 +230,7 @@
<Tool
Name="VCCLCompilerTool"
AdditionalOptions="-Zm200 -w34100 -w34189"
- Optimization="2"
+ Optimization="0"
AdditionalIncludeDirectories="&quot;$(QTSDK)\include\QtCore&quot;;&quot;$(QTSDK)\include\QtGui&quot;;&quot;$(QTSDK)\include&quot;;&quot;$(BOOST_ROOT)&quot;;&quot;$(QTSDK)\include\ActiveQt&quot;;debug;.;&quot;$(QTSDK)\mkspecs\default&quot;;..\..\..\LSL\liblsl\include"
PreprocessorDefinitions="_WINDOWS;UNICODE;WIN32;QT_LARGEFILE_SUPPORT;QT_DLL;QT_NO_DEBUG;QT_GUI_LIB;QT_CORE_LIB;QT_HAVE_MMX;QT_HAVE_3DNOW;QT_HAVE_SSE;QT_HAVE_MMXEXT;QT_HAVE_SSE2;QT_THREAD_SUPPORT;NDEBUG;_SCL_SECURE_NO_WARNINGS"
GeneratePreprocessedFile="0"
@@ -266,6 +267,7 @@
AdditionalLibraryDirectories="..\..\..\LSL\liblsl\bin;&quot;$(QTSDK)\lib&quot;;&quot;$(BOOST_ROOT)\lib&quot;"
IgnoreAllDefaultLibraries="false"
GenerateDebugInformation="false"
+ AssemblyDebug="2"
ProgramDatabaseFile=""
SubSystem="2"
LinkTimeCodeGeneration="0"
@@ -1,2 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
-<settings><devicenumber>0</devicenumber><channelcount>32</channelcount><chunksize>10</chunksize><samplingrate>2</samplingrate><useaux>false</useaux><activeshield>true</activeshield></settings><channels><labels><label>Fp1</label><label>Fp2</label><label>F7</label><label>F3</label><label>Fz</label><label>F4</label><label>F8</label><label>FC5</label><label>FC1</label><label>FC2</label><label>FC6</label><label>T7</label><label>C3</label><label>Cz</label><label>C4</label><label>T8</label><label>TP9</label><label>CP5</label><label>CP1</label><label>CP2</label><label>CP6</label><label>TP10</label><label>P7</label><label>P3</label><label>Pz</label><label>P4</label><label>P8</label><label>PO9</label><label>O1</label><label>Oz</label><label>O2</label><label>PO10 </label></labels></channels>
+<settings><devicenumber>0</devicenumber><channelcount>32</channelcount><chunksize>10</chunksize><samplingrate>2</samplingrate><useaux>false</useaux><activeshield>true</activeshield><unsampledmarkers>false</unsampledmarkers><sampledmarkers>true</sampledmarkers><sampledmarkersEEG>false</sampledmarkersEEG></settings><channels><labels><label>Fp1</label><label>Fp2</label><label>F7</label><label>F3</label><label>Fz</label><label>F4</label><label>F8</label><label>FC5</label><label>FC1</label><label>FC2</label><label>FC6</label><label>T7</label><label>C3</label><label>Cz</label><label>C4</label><label>T8</label><label>TP9</label><label>CP5</label><label>CP1</label><label>CP2</label><label>CP6</label><label>TP10</label><label>P7</label><label>P3</label><label>Pz</label><label>P4</label><label>P8</label><label>PO9</label><label>O1</label><label>Oz</label><label>O2</label><label>PO10 </label></labels></channels>
@@ -573,6 +573,12 @@ void MainWindow::load_config(const std::string &filename) {
setMinChunk(ui->samplingRate->currentIndex());
ui->useAUX->setCheckState(pt.get<bool>("settings.useaux",false) ? Qt::Checked : Qt::Unchecked);
ui->activeShield->setCheckState(pt.get<bool>("settings.activeshield",true) ? Qt::Checked : Qt::Unchecked);
+ ui->unsampledMarkers->setCheckState(pt.get<bool>("settings.unsampledmarkers",false) ? Qt::Checked : Qt::Unchecked);
+ ui->sampledMarkers->setCheckState(pt.get<bool>("settings.sampledmarkers",true) ? Qt::Checked : Qt::Unchecked);
+ ui->sampledMarkersEEG->setCheckState(pt.get<bool>("settings.sampledmarkersEEG",false) ? Qt::Checked : Qt::Unchecked);
+ ui->unsampledMarkers->setCheckState(pt.get<bool>("settings.unsampledmarkers",false) ? Qt::Checked : Qt::Unchecked);
+ ui->sampledMarkers->setCheckState(pt.get<bool>("settings.sampledmarkers",true) ? Qt::Checked : Qt::Unchecked);
+ ui->sampledMarkersEEG->setCheckState(pt.get<bool>("settings.sampledmarkersEEG",false) ? Qt::Checked : Qt::Unchecked);
ui->channelLabels->clear();
BOOST_FOREACH(ptree::value_type &v, pt.get_child("channels.labels"))
ui->channelLabels->appendPlainText(v.second.data().c_str());
@@ -594,6 +600,12 @@ void MainWindow::save_config(const std::string &filename) {
pt.put("settings.samplingrate",ui->samplingRate->currentIndex());
pt.put("settings.useaux",ui->useAUX->checkState()==Qt::Checked);
pt.put("settings.activeshield",ui->activeShield->checkState()==Qt::Checked);
+ pt.put("settings.unsampledmarkers",ui->unsampledMarkers->checkState()==Qt::Checked);
+ pt.put("settings.sampledmarkers",ui->sampledMarkers->checkState()==Qt::Checked);
+ pt.put("settings.sampledmarkersEEG",ui->sampledMarkersEEG->checkState()==Qt::Checked);
+ pt.put("settings.unsampledmarkers",ui->unsampledMarkers->checkState()==Qt::Checked);
+ pt.put("settings.sampledmarkers",ui->sampledMarkers->checkState()==Qt::Checked);
+ pt.put("settings.sampledmarkersEEG",ui->sampledMarkersEEG->checkState()==Qt::Checked);
std::vector<std::string> channelLabels;
boost::algorithm::split(channelLabels,ui->channelLabels->toPlainText().toStdString(),boost::algorithm::is_any_of("\n"));
BOOST_FOREACH(std::string &v, channelLabels)
@@ -638,6 +650,11 @@ void MainWindow::link() {
int samplingRate = sampling_rates[ui->samplingRate->currentIndex()];
bool useAUX = ui->useAUX->checkState()==Qt::Checked;
bool activeShield = ui->activeShield->checkState()==Qt::Checked;
+
+ g_unsampledMarkers = ui->unsampledMarkers->checkState()==Qt::Checked;
+ g_sampledMarkers = ui->sampledMarkers->checkState()==Qt::Checked;
+ g_sampledMarkersEEG = ui->sampledMarkersEEG->checkState()==Qt::Checked;
+
std::vector<std::string> channelLabels;
boost::algorithm::split(channelLabels,ui->channelLabels->toPlainText().toStdString(),boost::algorithm::is_any_of("\n"));
if (channelLabels.size() != channelCount)
@@ -726,12 +743,18 @@ void MainWindow::link() {
}
}
-bool _resample = false;
+
// background data reader thread
void MainWindow::read_thread(int deviceNumber, int channelCount, int chunkSize, int samplingRate, bool useAUX, bool activeShield, std::vector<std::string> channelLabels) {
HANDLE hDevice = NULL;
bool started = false;
+ bool _resample = false;
+
+ // set thread priority to high in order to ensure we don't lose data during sleep periods
+ int res = SetPriorityClass(GetCurrentProcess(), HIGH_PRIORITY_CLASS);
+ std::string threadId = boost::lexical_cast<std::string>(boost::this_thread::get_id());
+
try {
// try to open the device again (we're doing everything in the same thread to not confuse the driver)
hDevice = champOpen(deviceNumber);
@@ -783,12 +806,17 @@ void MainWindow::read_thread(int deviceNumber, int channelCount, int chunkSize,
// reserve buffers to receive and send data
int buffer_bytes = chunkSize*sampleSize;
char *recv_buffer = new char[buffer_bytes*10];
- std::vector<std::vector<double> > temp_buffer(chunkSize,std::vector<double>(channelCount));
- std::vector<std::vector<double> > send_buffer(chunkSize,std::vector<double>(channelCount));
+ std::vector<std::vector<double> > temp_buffer(chunkSize,std::vector<double>(channelCount+(g_sampledMarkersEEG?1:0)));
+ std::vector<std::vector<double> > send_buffer(chunkSize,std::vector<double>(channelCount+(g_sampledMarkersEEG?1:0)));
std::vector<unsigned> trigger_buffer(chunkSize);
std::vector<std::vector<double>> rs_temp_in,rs_temp_out;
+ // containers for the marker streams
+ std::vector<std::vector<std::string>> marker_buffer(chunkSize, std::vector<std::string>(1));
+ std::vector<std::string> s_mrkr;
+ float f_mrkr;
+
// allocate resampler
//Resampler<double,double,double> *resampler = NULL;
//switch (samplingRate) {
@@ -803,7 +831,7 @@ void MainWindow::read_thread(int deviceNumber, int channelCount, int chunkSize,
_resample = true;
std::vector<Resampler<double,double,double>*> resamplers;
- for (unsigned c=0;c<channelCount;c++) {
+ for (unsigned c=0;c<channelCount+(g_sampledMarkersEEG?1:0);c++) {
switch (samplingRate) {
case 125:
resamplers.push_back(new Resampler<double,double,double>(1,80,coeffs_10000_to_125,sizeof(coeffs_10000_to_125)/sizeof(coeffs_10000_to_125[0])));
@@ -821,13 +849,20 @@ void MainWindow::read_thread(int deviceNumber, int channelCount, int chunkSize,
}
// create data streaminfo and append some meta-data
- lsl::stream_info data_info("ActiChamp-" + boost::lexical_cast<std::string>(deviceNumber),"EEG",channelCount,samplingRate,lsl::cf_float32,"ActiChamp_" + boost::lexical_cast<std::string>(deviceNumber));
+ lsl::stream_info data_info("ActiChamp-" + boost::lexical_cast<std::string>(deviceNumber),"EEG",channelCount+(g_sampledMarkersEEG?1:0),samplingRate,lsl::cf_float32,"ActiChamp_" + boost::lexical_cast<std::string>(deviceNumber));
lsl::xml_element channels = data_info.desc().append_child("channels");
for (std::size_t k=0;k<channelLabels.size();k++)
channels.append_child("channel")
.append_child_value("label",channelLabels[k].c_str())
.append_child_value("type","EEG")
.append_child_value("unit","microvolts");
+
+ if(g_sampledMarkersEEG)
+ channels.append_child("channel")
+ .append_child_value("label","triggerStream")
+ .append_child_value("type","EEG")
+ .append_child_value("unit","codes");
+
data_info.desc().append_child("acquisition")
.append_child_value("manufacturer","Brain Products")
.append_child_value("dll_version",boost::lexical_cast<std::string>(version.Dll).c_str())
@@ -838,22 +873,47 @@ void MainWindow::read_thread(int deviceNumber, int channelCount, int chunkSize,
// make a data outlet
lsl::stream_outlet data_outlet(data_info);
+
+ lsl::stream_outlet *marker_outlet;
+ if(g_unsampledMarkers) {
+ lsl::stream_info marker_info("ActiChamp-" + boost::lexical_cast<std::string>(deviceNumber) + "-Markers","Markers", 1, 0, lsl::cf_string,"ActiChamp_" + boost::lexical_cast<std::string>(deviceNumber) + "_markers");
+ marker_outlet = new lsl::stream_outlet(marker_info);
+ }
+
+ lsl::stream_outlet *s_marker_outlet;
+ if(g_sampledMarkers) {
+ lsl::stream_info s_marker_info("ActiChamp-" + boost::lexical_cast<std::string>(deviceNumber) + "-Sampled-Markers","sampledMarkers", 1, (samplingRate > 1000 ? samplingRate : 10000), lsl::cf_string,"ActiChamp_" + boost::lexical_cast<std::string>(deviceNumber) + "_sampled_markers");
+ s_marker_outlet = new lsl::stream_outlet(s_marker_info);
+ // ditch the outlet if we don't need it (need to do it this way in order to trick C++ compiler into using this object conditionally)
+ }
+
// create marker streaminfo and outlet
- lsl::stream_info marker_info("ActiChamp-" + boost::lexical_cast<std::string>(deviceNumber) + "-Markers","Markers",1,0,lsl::cf_string,"ActiChamp_" + boost::lexical_cast<std::string>(deviceNumber) + "_markers");
- lsl::stream_outlet marker_outlet(marker_info);
+ //lsl::stream_info marker_info("ActiChamp-" + boost::lexical_cast<std::string>(deviceNumber) + "-Markers","Markers",1,0,lsl::cf_string,"ActiChamp_" + boost::lexical_cast<std::string>(deviceNumber) + "_markers");
+ //lsl::stream_outlet marker_outlet(marker_info);
// enter transmission loop
+
+ // for keeping track of changes to the trigger signal
int last_mrk = 0;
+ int prev_markerSampled = 0;
+ int prev_markerEEG = 0;
+
int bytes_read, samples_read;
while (!stop_) {
// read chunk into recv_buffer
bytes_read = champGetDataBlocking(hDevice,recv_buffer,buffer_bytes);
samples_read = bytes_read/sampleSize;
+
+ if (samples_read <= 0 && samplingRate < 50000){
+ boost::this_thread::sleep(boost::posix_time::milliseconds(1));
+ continue;
+ }
+
if (samples_read > 0) {
double now = lsl::local_clock();
// copy data into trigger_buffer and temp_buffer, and scale to microvolts
trigger_buffer.resize(samples_read);
- temp_buffer.resize(samples_read,std::vector<double>(channelCount));
+ temp_buffer.resize(samples_read,std::vector<double>(channelCount+(g_sampledMarkersEEG?1:0)));
switch(sampleSize) {
case sizeof(t_champDataModelAux):
{
@@ -927,6 +987,28 @@ void MainWindow::read_thread(int deviceNumber, int channelCount, int chunkSize,
}
}
+ for (int s=0;s<samples_read;s++) {
+ if (g_sampledMarkersEEG) {
+ //if(trigger_buffer[s] != prev_markerEEG)
+ // std::cout << "EEG: " << now << " " << s << " " << boost::lexical_cast<float>(trigger_buffer[s]) << std::endl;
+ f_mrkr = (trigger_buffer[s] == prev_markerEEG ? 0.0 : boost::lexical_cast<float>(trigger_buffer[s]));
+ prev_markerEEG = trigger_buffer[s];
+ temp_buffer[s][channelCount] = f_mrkr;
+ }
+
+ if (g_sampledMarkers) {
+ s_mrkr.clear();
+ //if(trigger_buffer[s] != prev_markerSampled)
+ // std::cout << " smrkr: " << now << " " << s << " " << boost::lexical_cast<std::string>(trigger_buffer[s]) << std::endl;
+ s_mrkr.push_back(trigger_buffer[s] == prev_markerSampled ? "" : boost::lexical_cast<std::string>(trigger_buffer[s]));
+ marker_buffer.at(s) = s_mrkr;
+ //std::cout << "s: " << s << std::endl;
+ prev_markerSampled = trigger_buffer[s];
+ }
+ }
+ // this never gets resampled, do it now
+ if (g_sampledMarkers) s_marker_outlet->push_chunk(marker_buffer, now);
+
// optionally resample
if (_resample) {
//resampler->apply_multichannel(temp_buffer,send_buffer);
@@ -967,17 +1049,23 @@ void MainWindow::read_thread(int deviceNumber, int channelCount, int chunkSize,
}
// push markers into outlet
- for (int s=0;s<samples_read;s++) {
- if (int mrk=trigger_buffer[s]) {
- if (mrk != last_mrk) {
- std::string mrk_string = boost::lexical_cast<std::string>(mrk);
- marker_outlet.push_sample(&mrk_string,now + (s + 1 - samples_read)/samplingRate);
- last_mrk = mrk;
+ if(g_unsampledMarkers) {
+ for (int s=0;s<samples_read;s++) {
+ if (int mrk=trigger_buffer[s]) {
+ if (mrk != last_mrk) {
+ std::string mrk_string = boost::lexical_cast<std::string>(mrk);
+ //std::cout << " mrkr: " << now << " " << s << " " << boost::lexical_cast<std::string>(trigger_buffer[s]) << std::endl;
+ marker_outlet->push_sample(&mrk_string,now + (s + 1 - samples_read)/samplingRate);
+ last_mrk = mrk;
+ }
}
}
}
}
}
+ // need to explicitly delete these objects
+ if(g_unsampledMarkers)delete(marker_outlet);
+ if(g_sampledMarkers)delete(s_marker_outlet);
}
catch(boost::thread_interrupted &) {
// thread was interrupted: no error
@@ -58,6 +58,10 @@ private slots:
bool stop_; // whether the reader thread is supposed to stop
boost::shared_ptr<boost::thread> reader_thread_; // our reader thread
+ bool g_unsampledMarkers;
+ bool g_sampledMarkers;
+ bool g_sampledMarkersEEG;
+
Ui::MainWindow *ui;
};
@@ -6,13 +6,16 @@
<rect>
<x>0</x>
<y>0</y>
- <width>357</width>
- <height>274</height>
+ <width>360</width>
+ <height>411</height>
</rect>
</property>
<property name="windowTitle">
<string>ActiChamp Connector</string>
</property>
+ <property name="toolTip">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;For an explanation of trigger marker types please read 'explanation_of_trigger_marker_types.pdf'.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
<widget class="QWidget" name="centralWidget">
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
@@ -237,6 +240,72 @@ PO10 </string>
</property>
</widget>
</item>
+ <item row="6" column="0" colspan="2">
+ <widget class="QGroupBox" name="groupBox_3">
+ <property name="title">
+ <string>LSL Trigger Output Style</string>
+ </property>
+ <layout class="QFormLayout" name="formLayout_2">
+ <property name="fieldGrowthPolicy">
+ <enum>QFormLayout::AllNonFixedFieldsGrow</enum>
+ </property>
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_5">
+ <property name="text">
+ <string>Unsampled String Markers</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="label_6">
+ <property name="text">
+ <string>Sampled String Markers</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QCheckBox" name="sampledMarkers">
+ <property name="toolTip">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;For an explanation of trigger marker types please read 'explanation_of_trigger_marker_types.pdf'.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="text">
+ <string>(check)</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QLabel" name="label_9">
+ <property name="text">
+ <string>Floating Point EEG Channel</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QCheckBox" name="sampledMarkersEEG">
+ <property name="toolTip">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;For an explanation of trigger marker types please read 'explanation_of_trigger_marker_types.pdf'.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="text">
+ <string>(check)</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QCheckBox" name="unsampledMarkers">
+ <property name="toolTip">
+ <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;For an explanation of trigger marker types please read 'explanation_of_trigger_marker_types.pdf'.&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
+ </property>
+ <property name="text">
+ <string>(check)</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
</layout>
</widget>
</item>
@@ -286,8 +355,8 @@ PO10 </string>
<rect>
<x>0</x>
<y>0</y>
- <width>357</width>
- <height>18</height>
+ <width>360</width>
+ <height>21</height>
</rect>
</property>
<widget class="QMenu" name="menuFile">
Oops, something went wrong.

0 comments on commit 322512a

Please sign in to comment.