From 8e11af992aa725f591b24dd22e78ff553d3c6fb5 Mon Sep 17 00:00:00 2001 From: MPIBR-kretschmerf Date: Thu, 8 Sep 2016 13:58:40 +0200 Subject: [PATCH] Untangled some spaghetti --- AudioGameGUI.pro | 14 +-- AudioGameGUI.pro.user | 136 ++++++++++++++++++++++++++--- mainwindow.cpp => Mainwindow.cpp | 121 +++++++++++++------------ mainwindow.h => Mainwindow.h | 26 ++---- SettingStructures.h | 32 +++++++ StateMachineController.cpp | 100 +++++++++++++++------ StateMachineController.h | 29 +++--- timerdialog.cpp => TimerDialog.cpp | 2 +- timerdialog.h => TimerDialog.h | 0 helpers.h | 21 ++++- mainwindow.ui | 20 ++--- 11 files changed, 352 insertions(+), 149 deletions(-) rename mainwindow.cpp => Mainwindow.cpp (56%) rename mainwindow.h => Mainwindow.h (84%) create mode 100644 SettingStructures.h rename timerdialog.cpp => TimerDialog.cpp (97%) rename timerdialog.h => TimerDialog.h (100%) diff --git a/AudioGameGUI.pro b/AudioGameGUI.pro index 63227a5..ec63ced 100644 --- a/AudioGameGUI.pro +++ b/AudioGameGUI.pro @@ -14,14 +14,16 @@ TEMPLATE = app SOURCES += main.cpp\ - mainwindow.cpp \ - timerdialog.cpp \ - StateMachineController.cpp + StateMachineController.cpp \ + Mainwindow.cpp \ + TimerDialog.cpp -HEADERS += mainwindow.h \ +HEADERS += \ helpers.h \ - timerdialog.h \ - StateMachineController.h + StateMachineController.h \ + TimerDialog.h \ + Mainwindow.h \ + SettingStructures.h FORMS += mainwindow.ui \ timerdialog.ui diff --git a/AudioGameGUI.pro.user b/AudioGameGUI.pro.user index 441184a..107cc57 100644 --- a/AudioGameGUI.pro.user +++ b/AudioGameGUI.pro.user @@ -1,7 +1,11 @@ - + + + EnvironmentId + {2ed301e3-4f04-4cfb-b8ea-e4f5caa11dd8} + ProjectExplorer.Project.ActiveTarget 0 @@ -29,9 +33,12 @@ false 4 false + 80 + true true 1 true + false 0 true 0 @@ -58,17 +65,18 @@ 0 0 - /home/kretschmerf/projectsbuild-AudioGameGUI-Desktop-Debug + /local/disk1/home/kretschmerf/projects/Developer/build-AudioGameGUI-Desktop-Debug true qmake QtProjectManager.QMakeBuildStep - false - true + true false + false + false true @@ -117,7 +125,7 @@ true - /home/kretschmerf/projectsbuild-AudioGameGUI-Desktop-Release + /local/disk1/home/kretschmerf/projects/Developer/build-AudioGameGUI-Desktop-Release true @@ -125,9 +133,10 @@ QtProjectManager.QMakeBuildStep false - true false + false + false true @@ -175,7 +184,67 @@ 0 true - 2 + + /local/disk1/home/kretschmerf/projects/Developer/build-AudioGameGUI-Desktop-Profile + + + true + qmake + + QtProjectManager.QMakeBuildStep + true + + false + true + false + + + true + Make + + Qt4ProjectManager.MakeStep + + -w + -r + + false + + + + 2 + Build + + ProjectExplorer.BuildSteps.Build + + + + true + Make + + Qt4ProjectManager.MakeStep + + -w + -r + + true + clean + + + 1 + Clean + + ProjectExplorer.BuildSteps.Clean + + 2 + false + + Profile + + Qt4ProjectManager.Qt4BuildConfiguration + 0 + true + + 3 0 @@ -191,19 +260,58 @@ 1 + false + 1000 + + true + + false + false + false + false + true + 0.01 + 10 + true + 1 + 25 + + 1 + true + false + true + valgrind + + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 2 AudioGameGUI - Qt4ProjectManager.Qt4RunConfiguration:/storage/scic/Data/External/Developer/AudioGameGUI/AudioGameGUI.pro + Qt4ProjectManager.Qt4RunConfiguration:/local/disk1/home/kretschmerf/projects/Developer/AudioGameGUI/AudioGameGUI.pro + true AudioGameGUI.pro false false 3768 - true - false + false + true false false true @@ -216,11 +324,11 @@ 1 - ProjectExplorer.Project.Updater.EnvironmentId - {2ed301e3-4f04-4cfb-b8ea-e4f5caa11dd8} + ProjectExplorer.Project.Updater.FileVersion + 18 - ProjectExplorer.Project.Updater.FileVersion - 15 + Version + 18 diff --git a/mainwindow.cpp b/Mainwindow.cpp similarity index 56% rename from mainwindow.cpp rename to Mainwindow.cpp index 88a0e0e..7013133 100644 --- a/mainwindow.cpp +++ b/Mainwindow.cpp @@ -1,4 +1,4 @@ -#include "mainwindow.h" +#include "Mainwindow.h" #include "ui_mainwindow.h" #include "helpers.h" @@ -9,6 +9,40 @@ MainWindow::MainWindow(QWidget *parent) : { ui->setupUi(this); + + /*Load defaults from settings*/ + ui->lineEdit_repeatPositive->setText(appSettings.value("defaults/repeatPositive", 10).toString()); + ui->lineEdit_repeatNegative->setText(appSettings.value("defaults/repeatNegative", 10).toString()); + ui->lineEdit_soundDurationPositive->setText(appSettings.value("defaults/soundDurationPositive", .5).toString()); + ui->lineEdit_soundDurationNegative->setText(appSettings.value("defaults/soundDurationNegative", .5).toString()); + + ui->lineEdit_preDelay->setText(appSettings.value("defaults/preDelay", 0).toString()); + ui->lineEdit_preImaq->setText(appSettings.value("defaults/preImaq", 0).toString()); + ui->lineEdit_licksToReward->setText(appSettings.value("defaults/licksToReward", 10).toString()); + ui->lineEdit_iti->setText(appSettings.value("defaults/iti", 30).toString()); + + ui->lineEdit_outputFolder->setText(appSettings.value("defaults/outputFolder", QStandardPaths::writableLocation(QStandardPaths::HomeLocation)).toString()); + + if(appSettings.value("defaults/autoFilename", true).toBool()){ + ui->checkBox_autoFilename->click(); + } + + /*Set Validators*/ + QValidator *doubleValidator = new QDoubleValidator(0,1000,2, this); + QValidator *intValidator = new QIntValidator(0,1000, this); + + ui->lineEdit_repeatPositive->setValidator(intValidator); + ui->lineEdit_repeatNegative->setValidator(intValidator); + ui->lineEdit_soundDurationPositive->setValidator(doubleValidator); + ui->lineEdit_soundDurationNegative->setValidator(doubleValidator); + ui->lineEdit_preDelay->setValidator(doubleValidator); + ui->lineEdit_preImaq->setValidator(doubleValidator); + ui->lineEdit_licksToReward->setValidator(intValidator); + ui->lineEdit_iti->setValidator(doubleValidator); + + + connect(this,SIGNAL(paused()), &smc, SIGNAL(pauseRequested())); + } MainWindow::~MainWindow() @@ -37,19 +71,27 @@ void MainWindow::on_pushButton_Run_clicked() sorting = ORDERED; } -// int trialsTotal = trialSequence.length(); + /*Populate settings with GUI values*/ + audioGameSettings settings; + settings.preImaq = ui->lineEdit_preImaq->text().toDouble(); + settings.preDelay = ui->lineEdit_preDelay->text().toDouble(); + settings.soundDurationPositive = ui->lineEdit_soundDurationPositive->text().toDouble(); + settings.soundDurationNegative = ui->lineEdit_soundDurationNegative->text().toDouble(); + settings.userReaction = userReaction; + settings.trialSequence = generateTrialSequence(sorting, ui->lineEdit_repeatPositive->text().toInt(), ui->lineEdit_repeatNegative->text().toInt()); + + if(ui->checkBox_itiExternal->isChecked()){ + qDebug()<<"Using iti from file"; + settings.itiSequence = loadExternalItiSequence("/Users/davidunzue/iti_external.txt", ui->lineEdit_repeatPositive->text().toInt(), ui->lineEdit_repeatNegative->text().toInt()); + }else{ + settings.itiSequence = generateItiSequence(userReaction, ui->lineEdit_iti->text(), ui->lineEdit_preImaq->text().toDouble(), ui->lineEdit_repeatPositive->text().toInt(), ui->lineEdit_repeatNegative->text().toInt()); + } + qDebug()<< settings.itiSequence; - smc.preImaq = ui->lineEdit_preImaq->text().toDouble(); - smc.preDelay = ui->lineEdit_preDelay->text().toDouble(); - smc.soundDurationPositive = ui->lineEdit_soundDurationPositive->text().toDouble(); - smc.soundDurationNegative = ui->lineEdit_soundDurationNegative->text().toDouble(); - smc.userReaction = userReaction; - smc.trialSequence = generateTrialSequence(sorting, ui->lineEdit_repeatPositive->text().toDouble(), ui->lineEdit_repeatNegative->text().toDouble()); - smc.itiSequence = generateItiSequence(userReaction, ui->lineEdit_iti->text(), ui->lineEdit_preImaq->text().toDouble(), ui->lineEdit_repeatPositive->text().toDouble(), ui->lineEdit_repeatNegative->text().toDouble()); - smc.runStateMachine(); + smc.runStateMachine(settings); } void MainWindow::on_pushButton_Pause_toggled(bool checked) @@ -58,37 +100,18 @@ void MainWindow::on_pushButton_Pause_toggled(bool checked) qDebug() << "Paused"; ui->statusBar->showMessage("Paused"); ui->pushButton_Pause->setText("Resume"); - timerDialog->removeTimer(); - pause(); + emit(paused()); + } else { qDebug() << "Resumed"; ui->statusBar->showMessage("Resumed"); ui->pushButton_Pause->setText("Pause"); - pause(); - + emit(resumed()); } } -bool MainWindow::paused() const -{ - return false;//m_paused; -} - -void MainWindow::setPaused(bool paused) -{ -// if (m_paused != paused) { -// m_paused = paused; -// emit pausedChanged(); -// } -} - -void MainWindow::pause() -{ - //emit pauseRequested(); -} - void MainWindow::on_pushButton_Stop_clicked() { // timerDialog->removeTimer(); @@ -97,11 +120,12 @@ void MainWindow::on_pushButton_Stop_clicked() qDebug() << "Stopped and terminated"; ui->statusBar->showMessage("Stopped and terminated"); ui->pushButton_Run->setDisabled(false); + emit(stopped()); } -void MainWindow::on_buttonSelectDir_clicked() +void MainWindow::on_pushButton_selectOutputFolder_clicked() { selectedDirectory = QFileDialog::getExistingDirectory(this, tr("Select Directory"), @@ -115,20 +139,20 @@ void MainWindow::on_buttonSelectDir_clicked() appSettings.setValue(DEFAULT_DIR_KEY, currentDir.absoluteFilePath(selectedDirectory)); - ui->inputDirPath->setText(selectedDirectory); + ui->lineEdit_outputFolder->setText(selectedDirectory); } } -void MainWindow::on_autoFilename_clicked(bool checked) +void MainWindow::on_checkBox_autoFilename_clicked(bool checked) { // auto option checked if(checked) { time_t rawtime; struct tm * timeinfo; // ensure buffer is big enought - char buffer[80]; + char buffer[42]; // current date/time based on current system time(&rawtime); @@ -136,16 +160,16 @@ void MainWindow::on_autoFilename_clicked(bool checked) timeinfo = localtime(&rawtime); // write date/time info into formatted string - strftime(buffer,80,"%Y%m%d%H%M%S_AudioGame_events",timeinfo); + strftime(buffer,42,"%Y%m%d%H%M%S_AudioGame_events",timeinfo); QString autoFilename(buffer); // write to input field and disable it - ui->inputFilename->setText(autoFilename); - ui->inputFilename->setDisabled(true); + ui->lineEdit_outputFilename->setText(autoFilename); + ui->lineEdit_outputFilename->setDisabled(true); } else { // clear input field and enable it - ui->inputFilename->clear(); - ui->inputFilename->setDisabled(false); + ui->lineEdit_outputFilename->clear(); + ui->lineEdit_outputFilename->setDisabled(false); } } @@ -184,16 +208,6 @@ void MainWindow::on_checkBox_itiExternal_clicked(bool checked) { if(checked) { ui->lineEdit_iti->setDisabled(true); - // get iti duration value from external file - QFile file("/Users/davidunzue/iti_external.txt"); - if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) - return; - QTextStream in(&file); - while (!in.atEnd()) { - QString line = in.readLine(); - qDebug() << line; - ui->lineEdit_iti->setText(line); - } } else { ui->lineEdit_iti->setDisabled(false); } @@ -206,7 +220,6 @@ void MainWindow::on_lineEdit_iti_editingFinished() void MainWindow::on_lineEdit_preImaq_editingFinished() { - updateIti(); } @@ -218,8 +231,8 @@ void MainWindow::updateIti() if(!lineEdit_iti_str.isEmpty()) { if(lineEdit_iti_str.contains(',')) { QStringList iti_range = lineEdit_iti_str.split(','); - double iti = randomMinMax(iti_range.first().toDouble(), iti_range.last().toDouble()); - if(iti < userReaction + preImaq){ + if((iti_range.first().toDouble() < userReaction + preImaq) | + iti_range.last().toDouble() < userReaction + preImaq){ ui->lineEdit_iti->setText(QString("%1,%2").arg(QString::number(iti_range.first().toDouble() + userReaction + preImaq), QString::number(iti_range.last().toDouble() + userReaction + preImaq))); } } else { diff --git a/mainwindow.h b/Mainwindow.h similarity index 84% rename from mainwindow.h rename to Mainwindow.h index 1483799..6840c46 100644 --- a/mainwindow.h +++ b/Mainwindow.h @@ -6,8 +6,10 @@ #include #include #include -#include "timerdialog.h" +#include +#include "TimerDialog.h" #include "StateMachineController.h" +#include "SettingStructures.h" // values for trial sequence sorting enum SORTING {ORDERED, SORTED, SHUFFLED}; @@ -28,29 +30,17 @@ class MainWindow : public QMainWindow explicit MainWindow(QWidget *parent = 0); ~MainWindow(); - bool paused() const; - void setPaused(bool paused); - private slots: - void on_buttonSelectDir_clicked(); - - void on_autoFilename_clicked(bool checked); - + void on_pushButton_selectOutputFolder_clicked(); + void on_checkBox_autoFilename_clicked(bool checked); void on_pushButton_selectFilePositive_clicked(); - void on_pushButton_selectFileNegative_clicked(); - - void pause(); - void on_pushButton_Run_clicked(); void on_pushButton_Pause_toggled(bool checked); void on_pushButton_Stop_clicked(); - void on_checkBox_itiExternal_clicked(bool checked); - void on_lineEdit_iti_editingFinished(); - void on_lineEdit_preImaq_editingFinished(); @@ -72,8 +62,10 @@ private slots: QString selectedPositiveFileName; QString selectedNegativeFileName; - - +signals: + void paused(); + void resumed(); + void stopped(); }; diff --git a/SettingStructures.h b/SettingStructures.h new file mode 100644 index 0000000..e758bbf --- /dev/null +++ b/SettingStructures.h @@ -0,0 +1,32 @@ +#ifndef SETTINGSTRUCTURES_H +#define SETTINGSTRUCTURES_H +#include +#include + + +struct audioGameSettings{ + /*Sequences*/ + QVector trialSequence; + QVector itiSequence; + + /*Timing*/ + double preDelay = -1; + double iti = -1; + double userReaction = 30; //sec + double preImaq = -1; + + /*Stimulus properties*/ + double soundDurationPositive = -1; + double soundDurationNegative = -1; + QString fileNamePositive; + QString fileNameNegative; + + /*Reward*/ + int licksToReward; +}; + + + + + +#endif // SETTINGSTRUCTURES_H diff --git a/StateMachineController.cpp b/StateMachineController.cpp index 97f1c2b..a83098a 100644 --- a/StateMachineController.cpp +++ b/StateMachineController.cpp @@ -1,21 +1,14 @@ #include "StateMachineController.h" -StateMachineController::StateMachineController(QWidget *parent) +StateMachineController::StateMachineController(QObject *parent) { // seed randomizer srand(time(0)); -// //timerDialog = new TimerDialog(); + timerDialog = new TimerDialog(); mainTimer = new QTimer(this); mainTimer->setSingleShot(true); - // Create and start the state machine - setupStateMachine(); - -} - -void StateMachineController::setupStateMachine() -{ stateMachine = new QStateMachine(this); // Create the two top-level states @@ -68,8 +61,8 @@ void StateMachineController::setupStateMachine() //connect(state_iti, SIGNAL(entered()), mainTimer, SLOT(start())); // state user reaction connect(state_userReaction, SIGNAL(entered()), this, SLOT(onStateUserReactionEntered())); - /////connect(state_userReaction, SIGNAL(exited()), timerDialog, SLOT(removeTimer())); - //connect(state_userReaction, SIGNAL(entered()), mainTimer, SLOT(start())); + /////connect(state_settings.userReaction, SIGNAL(exited()), timerDialog, SLOT(removeTimer())); + //connect(state_settings.userReaction, SIGNAL(entered()), mainTimer, SLOT(start())); // state baseline connect(state_acquisitionBaseline, SIGNAL(entered()), this, SLOT(onStateAcquisitionBaselineEntered())); //connect(state_acquisitionBaseline, SIGNAL(entered()), mainTimer, SLOT(start())); @@ -80,13 +73,35 @@ void StateMachineController::setupStateMachine() } -void StateMachineController::runStateMachine() +void StateMachineController::runStateMachine(audioGameSettings settings) { + this->settings = settings; trialsCurrent = 1; // set index for first trial (1-based) - trialsTotal = trialSequence.length(); + trialsTotal = settings.trialSequence.length(); + + +// /* set default values */ +// sm->state = STATE_IDLE; +// sm->duration = 0; +// sm->rcx_file = SM_RCX_POSITIVE; +// sm->snd_bit = 0x00; +// sm->trigger_count = 0; + +// /* interface SDL */ +// //SDLInitialize(); + +// /* interface TDT */ +// TDTInitializeInterface(); + +// /* allocate DAQ */ +// daq = (DAQmxEngine *)malloc(sizeof(DAQmxEngine)); +// DAQmxInitializeInterface(daq); +// DAQmxLogToFile(daq->fp_log, "INIT", 0, 0); // start state machine stateMachine->start(); +// /qDebug() << settings.itiSequence + } @@ -95,7 +110,7 @@ void StateMachineController::onStatePreDelayEntered() qDebug() << "Pre delay"; emit(statusMessage("Pre delay running")); - mainTimer->setInterval(preDelay * 1000); + mainTimer->setInterval(settings.preDelay * 1000); mainTimer->start(); } @@ -104,23 +119,22 @@ void StateMachineController::onStateItiEntered() qDebug() << "Entered Iti"; emit(statusMessage("Starting trial begin")); - double nextItiValue = itiSequence.at(trialsCurrent - 1); // -1 because trialsCurrent is 1-based + double nextItiValue = settings.itiSequence.at(trialsCurrent - 1); // -1 because trialsCurrent is 1-based mainTimer->setInterval(nextItiValue * 1000); mainTimer->start(); - } void StateMachineController::onStateUserReactionEntered() { // timerDialog->removeTimer(); // remove previous timer dialog -// timerDialog->setUpTimer(userReaction); +// timerDialog->setUpTimer(settings.userReaction); // timerDialog->show(); // timerDialog->startTimer(); qDebug()<< "Starting user reaction"; emit(statusMessage("Starting user reaction")); - mainTimer->setInterval(userReaction * 1000); + mainTimer->setInterval(settings.userReaction * 1000); mainTimer->start(); } @@ -130,24 +144,36 @@ void StateMachineController::onStateAcquisitionBaselineEntered() emit(statusMessage("Starting baseline")); - mainTimer->setInterval(preImaq * 1000); + mainTimer->setInterval(settings.preImaq * 1000); mainTimer->start(); } void StateMachineController::onStateSoundEntered() { - int soundType = trialSequence.first(); - trialSequence.pop_front(); + int soundType = settings.trialSequence.first(); + settings.trialSequence.pop_front(); + + switch(soundType){ + case 0: + mainTimer->setInterval(settings.soundDurationNegative * 1000); + //state_sound->assignProperty(mainTimer, "interval", (settings.soundDurationNegative * 1000)); + qDebug() << "Loading negative sound file:" << settings.fileNameNegative; + + //TDTLoadRCXCircuit(settings.fileNameNegative); + break; + case 1: + mainTimer->setInterval(settings.soundDurationPositive * 1000); + //state_sound->assignProperty(mainTimer, "interval", (settings.soundDurationPositive * 1000)); + qDebug() << "Loading positive sound file:" << settings.fileNamePositive; + //TDTLoadRCXCircuit(settings.fileNamePositive); - if (soundType == 1) { - mainTimer->setInterval(soundDurationPositive * 1000); - //state_sound->assignProperty(mainTimer, "interval", (soundDurationPositive * 1000)); - } else if (soundType == 0) { - mainTimer->setInterval(soundDurationNegative * 1000); - //state_sound->assignProperty(mainTimer, "interval", (soundDurationNegative * 1000)); + break; } + mainTimer->start(); + //DAQmxTriggerDO(daq, DAQ_PORT_DO_SOUND, true); + qDebug()<< "Starting sound"; emit(statusMessage("Starting sound")); @@ -171,3 +197,23 @@ void StateMachineController::onStateSoundExited() //ui->pushButton_Run->setText("Run"); } } + + +//timerDialog->removeTimer(); +//bool MainWindow::paused() const +//{ +// return false;//m_paused; +//} + +//void MainWindow::setPaused(bool paused) +//{ +//// if (m_paused != paused) { +//// m_paused = paused; +//// emit pausedChanged(); +//// } +//} + +//void MainWindow::pause() +//{ +// //emit pauseRequested(); +//} diff --git a/StateMachineController.h b/StateMachineController.h index a6cb390..0400d45 100644 --- a/StateMachineController.h +++ b/StateMachineController.h @@ -12,25 +12,17 @@ #include #include //std::random_shuffle +#include "SettingStructures.h" +#include "TimerDialog.h" + class StateMachineController : public QObject { Q_OBJECT public: - explicit StateMachineController(QWidget *parent = 0); - - double preDelay = -1; - double iti = -1; - double userReaction = 30; //sec - double preImaq = -1; - double soundDurationPositive = -1; - double soundDurationNegative = -1; - - QVector trialSequence; - QVector itiSequence; - - void setupStateMachine(); - void runStateMachine(); + explicit StateMachineController(QObject *parent = 0); + audioGameSettings settings; + void runStateMachine(audioGameSettings); private: // state machine @@ -45,6 +37,9 @@ class StateMachineController : public QObject // the timer that triggers the state changes QTimer *mainTimer; + TimerDialog *timerDialog; + + //DAQmxEngine *daq; int trialsTotal = -1; int trialsCurrent = -1; // is gonna be 1-based, so first trial has index 1 @@ -58,13 +53,9 @@ public slots: void onStateSoundEntered(); void onStateSoundExited(); - - - signals: void statusMessage(QString); - -Q_SIGNALS: +//Q_SIGNALS: // change notification signals for the state properties void pausedChanged(); /** diff --git a/timerdialog.cpp b/TimerDialog.cpp similarity index 97% rename from timerdialog.cpp rename to TimerDialog.cpp index eecbf4a..45a7fea 100644 --- a/timerdialog.cpp +++ b/TimerDialog.cpp @@ -1,4 +1,4 @@ -#include "timerdialog.h" +#include "TimerDialog.h" #include "ui_timerdialog.h" TimerDialog::TimerDialog(QWidget *parent) : diff --git a/timerdialog.h b/TimerDialog.h similarity index 100% rename from timerdialog.h rename to TimerDialog.h diff --git a/helpers.h b/helpers.h index 27a49ca..e2fdfd3 100644 --- a/helpers.h +++ b/helpers.h @@ -4,6 +4,9 @@ #include #include #include +#include +#include +#include // random generator function: int randomGenerator (int i) { return rand()%i; } @@ -73,7 +76,6 @@ QVector generateItiSequence(double userReaction, QString itiList, double { QVector itiSequence; int itiSequenceLength = repeatPositive + repeatNegative; - if(!itiList.isEmpty()) { if(itiList.contains(',')) { QStringList iti_range = itiList.split(','); @@ -94,5 +96,22 @@ QVector generateItiSequence(double userReaction, QString itiList, double } +QVector loadExternalItiSequence(QString fileName, int repeatPositive, int repeatNegative) +{ + QVector itiSequence; + + // get iti duration value from external file + QFile file(fileName); + if (file.open(QIODevice::ReadOnly | QIODevice::Text)){ + QTextStream in(&file); + while (!in.atEnd()) { + QString line = in.readLine(); + itiSequence.append(10); /*Get proper value*/ + qDebug() << line; + } + } + return itiSequence; +} + #endif // HELPERS_H diff --git a/mainwindow.ui b/mainwindow.ui index eeb583a..96c6a96 100644 --- a/mainwindow.ui +++ b/mainwindow.ui @@ -7,7 +7,7 @@ 0 0 472 - 782 + 833 @@ -85,10 +85,10 @@ 0 - + - + Select @@ -109,10 +109,10 @@ 10 - + - + auto @@ -415,7 +415,7 @@ 0 0 472 - 22 + 27 @@ -437,10 +437,10 @@ - inputDirPath - buttonSelectDir - inputFilename - autoFilename + lineEdit_outputFolder + pushButton_selectOutputFolder + lineEdit_outputFilename + checkBox_autoFilename lineEdit_selectFilePositive pushButton_selectFilePositive lineEdit_soundDurationPositive