From 08adfd9bb1f9594996ea08db341943f255aabfb4 Mon Sep 17 00:00:00 2001 From: MPIBR-kretschmerf Date: Tue, 18 Oct 2016 09:33:27 +0200 Subject: [PATCH] Added writing to logFile. Fixed all interfaces --- AudioGame.ico | Bin 0 -> 370070 bytes AudioGameGUI.pro | 7 ++-- LogFileWriter.cpp | 29 +++++++++++++++ LogFileWriter.h | 26 ++++++++++++++ Mainwindow.cpp | 6 ++-- Mainwindow.h | 1 + NIDAQmxInterface.cpp | 70 +++++++++++++------------------------ NIDAQmxInterface.h | 24 +++++++------ SettingStructures.h | 5 ++- StateMachineController.cpp | 51 ++++++++++++++++++++------- StateMachineController.h | 13 +++++-- app.rc | 1 + mainwindow.ui | 43 ++--------------------- 13 files changed, 159 insertions(+), 117 deletions(-) create mode 100644 AudioGame.ico create mode 100644 LogFileWriter.cpp create mode 100644 LogFileWriter.h create mode 100644 app.rc diff --git a/AudioGame.ico b/AudioGame.ico new file mode 100644 index 0000000000000000000000000000000000000000..f451afd71676c0a09ae5efe58f6e23c7772aa128 GIT binary patch literal 370070 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 z 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 +#include +#include +#include +#include +#include + +class LogFileWriter : public QObject +{ + Q_OBJECT +public: + LogFileWriter(QObject *parent = 0); +private: + QFile logFile; + QIODevice* device; + QTime qTime; +private slots: + void onOpen(QString fileName); + void onClose(); + void onWrite(QString text, uint id, uint counter, QString timeString); +}; + +#endif // LOGFILEWRITER_H diff --git a/Mainwindow.cpp b/Mainwindow.cpp index 723c19d..b921173 100644 --- a/Mainwindow.cpp +++ b/Mainwindow.cpp @@ -40,8 +40,8 @@ MainWindow::MainWindow(QWidget *parent) : ui->lineEdit_licksToReward->setValidator(intValidator); ui->lineEdit_iti->setValidator(doubleValidator); - ui->lineEdit_fileNegative->setText("C:/Users/superuser.D-01477/Desktop/attentionGame/20160812_AttentionGame/20160812_AttentionGame/Audio/negative_state.rcx"); - ui->lineEdit_filePositive->setText("C:/Users/superuser.D-01477/Desktop/attentionGame/20160812_AttentionGame/20160812_AttentionGame/Audio/positive_state.rcx"); + //ui->lineEdit_fileNegative->setText("C:/Users/superuser.D-01477/Desktop/attentionGame/20160812_AttentionGame/20160812_AttentionGame/Audio/negative_state.rcx"); + //ui->lineEdit_filePositive->setText("C:/Users/superuser.D-01477/Desktop/attentionGame/20160812_AttentionGame/20160812_AttentionGame/Audio/positive_state.rcx"); connect(&smc, SIGNAL(statusMessage(QString)), this, SLOT(onStatusMessage(QString))); connect(&smc, SIGNAL(terminated()), this, SLOT(onStateMachineTerminated())); @@ -83,6 +83,7 @@ void MainWindow::on_pushButton_Run_clicked() settings.trialSequence = TrialSeq::generateTrialSequence(sorting, ui->lineEdit_repeatPositive->text().toInt(), ui->lineEdit_repeatNegative->text().toInt()); settings.fileNameNegative = ui->lineEdit_filePositive->text(); settings.fileNamePositive = ui->lineEdit_filePositive->text(); + settings.logFileName = ui->lineEdit_outputFolder->text() + "/" + ui->lineEdit_outputFilename->text() + ".csv"; if(ui->checkBox_itiExternal->isChecked()){ qDebug()<<"Using iti from file"; @@ -220,6 +221,7 @@ void MainWindow::on_lineEdit_preImaq_editingFinished() void MainWindow::onStateMachineTerminated() { ui->pushButton_Run->setText("Run"); + ui->pushButton_Run->setDisabled(false); } void MainWindow::onStatusMessage(QString statusMessage) diff --git a/Mainwindow.h b/Mainwindow.h index 8d28230..e42e693 100644 --- a/Mainwindow.h +++ b/Mainwindow.h @@ -44,6 +44,7 @@ private slots: void onStatusMessage(QString statusMessage); + private: Ui::MainWindow *ui; diff --git a/NIDAQmxInterface.cpp b/NIDAQmxInterface.cpp index 0454b6b..13e8045 100644 --- a/NIDAQmxInterface.cpp +++ b/NIDAQmxInterface.cpp @@ -4,16 +4,16 @@ /*Indirection for C function pointer to method pointer */ int32 CVICALLBACK ChangeDetectionCallbackWrapper(TaskHandle taskHandle, int32 signalID, void *callbackData) { NIDAQmxInterface * this_ = reinterpret_cast(callbackData); - return this_->FcnCbckDetectDI(taskHandle, signalID, callbackData); + return this_->FcnCbckDetectDI(taskHandle, signalID); } /*Indirection for C function pointer to method pointer */ int32 CVICALLBACK ChangeTriggerStopCallbackWrapper(TaskHandle taskHandle, int32 signalID, void *callbackData) { NIDAQmxInterface * this_ = reinterpret_cast(callbackData); - return this_->FcnCbckTriggerStopDO(taskHandle, signalID, callbackData); + return this_->FcnCbckTriggerStopDO(taskHandle, signalID); } -NIDAQmxInterface::NIDAQmxInterface() +NIDAQmxInterface::NIDAQmxInterface(QObject* parent) : QObject(parent) { daq = new DAQmxEngine(); } @@ -32,7 +32,8 @@ void NIDAQmxInterface::DAQmxInitializeInterface() DAQmxErrChk(DAQmxCreateTask("DigIn", &daq->di_port)); DAQmxErrChk(DAQmxCreateDIChan(daq->di_port, "Dev1/port0", "", DAQmx_Val_ChanForAllLines)); DAQmxErrChk(DAQmxCfgChangeDetectionTiming(daq->di_port, "Dev1/port0/line2,Dev1/port0/line6", "Dev1/port0/line2,Dev1/port0/line6", DAQmx_Val_ContSamps, 1)); - DAQmxErrChk(DAQmxRegisterSignalEvent(daq->di_port, DAQmx_Val_ChangeDetectionEvent, 0, ChangeDetectionCallbackWrapper, daq)); + //DAQmxErrChk(DAQmxRegisterSignalEvent(daq->di_port, DAQmx_Val_ChangeDetectionEvent, 0, ChangeDetectionCallbackWrapper, daq)); + DAQmxErrChk(DAQmxRegisterSignalEvent(daq->di_port, DAQmx_Val_ChangeDetectionEvent, 0, ChangeDetectionCallbackWrapper, this)); /* configure digital write task */ @@ -45,7 +46,8 @@ void NIDAQmxInterface::DAQmxInitializeInterface() DAQmxErrChk(DAQmxCreateCOPulseChanTime(daq->do_clk, "Dev1/ctr0", "", DAQmx_Val_Seconds, DAQmx_Val_Low, 0, 0.05, 0.08)); DAQmxErrChk(DAQmxCfgImplicitTiming(daq->do_clk, DAQmx_Val_FiniteSamps, 1)); - DAQmxErrChk(DAQmxRegisterDoneEvent(daq->do_clk, 0, ChangeTriggerStopCallbackWrapper, daq)); + //DAQmxErrChk(DAQmxRegisterDoneEvent(daq->do_clk, 0, ChangeTriggerStopCallbackWrapper, daq)); + DAQmxErrChk(DAQmxRegisterDoneEvent(daq->do_clk, 0, ChangeTriggerStopCallbackWrapper, this)); /* initialize query performance timer QPC */ //QPCInitialize(); @@ -59,14 +61,6 @@ void NIDAQmxInterface::DAQmxInitializeInterface() /* allocate engine pointer */ void NIDAQmxInterface::DAQmxSetDefaultEngine() { - char file_out[256]; - char date_str[32]; - time_t now = time(NULL); - struct tm *t = localtime(&now); - strftime(date_str, sizeof(date_str), "%Y%m%d_%H%M", t); - sprintf(file_out, "..\\Logs\\%s_TriggerTasks_logFile.txt", date_str); - - /* ports TaskHandle */ daq->di_port = 0; daq->di_error = 0; @@ -84,15 +78,6 @@ void NIDAQmxInterface::DAQmxSetDefaultEngine() daq->di_cntr_frame = 0; daq->di_cntr_imaq = 0; - /* log file pointer */ -// daq->fp_log = fopen(file_out, "w"); -// if (daq->fp_log == NULL) -// { -// fprintf(stderr, "DAQmxError:NIDAQmxInterface/DAQmxSetDefaultEngine:\n\tfailed to open %s to write!\n", file_out); -// exit(EXIT_FAILURE); -// } -// fprintf(daq->fp_log, "#event\tbit_mask\tstate\ttick[usec]\n"); - return; } @@ -157,10 +142,6 @@ void NIDAQmxInterface::DAQmxDestroyInterface() DAQmxErrChk(DAQmxClearTask(daq->do_clk)); daq->do_clk = 0; - /* close file */ - if (daq->fp_log) - fclose(daq->fp_log); - return; } @@ -230,23 +211,16 @@ void NIDAQmxInterface::DAQmxTriggerDO(uInt8 qry_port_bit, bool arm_timer) DAQmxErrChk(DAQmxStartTask(daq->do_clk)); } /* log trigger */ - //DAQmxLogToFile(daq->fp_log, "TRIGGER", qry_port_bit, (qry_port_bit & daq->do_bit_wrt) == qry_port_bit); + QString timeString = QTime::currentTime().toString("hh:mm:ss.zzz"); + emit(writeToLogFile("TRIGGER", qry_port_bit, (qry_port_bit & daq->do_bit_wrt) == qry_port_bit, timeString)); return; } -/* log NIDAQmx events to file */ -void NIDAQmxInterface::DAQmxLogToFile(FILE *fp, const char *msg, uInt32 id, uInt32 counter) -{ - if (fp) - //fprintf(fp, "%s\t%d\t%d\t%ld\n", msg, id, counter, QPCReadTick()); - return; -} - /* Detect Input Callback */ -int32 CVICALLBACK NIDAQmxInterface::FcnCbckDetectDI(TaskHandle taskHandle, int32 signalID, void* callbackData) +int32 CVICALLBACK NIDAQmxInterface::FcnCbckDetectDI(TaskHandle taskHandle, int32 signalID) { - DAQmxEngine *daq = (DAQmxEngine *)callbackData; + //DAQmxEngine *daq = (DAQmxEngine *)callbackData; int32 read = 0; if (taskHandle != 0) @@ -264,7 +238,7 @@ int32 CVICALLBACK NIDAQmxInterface::FcnCbckDetectDI(TaskHandle taskHandle, int32 daq->di_cntr_frame = 0; /* switch OFF box internal resonance generator */ - //DAQmxTriggerDO(DAQ_PORT_DO_FREQGEN, FALSE); + DAQmxTriggerDO(DAQ_PORT_DO_FREQGEN, FALSE); } /* SHUTTER OFF condition, SHUTTER line changes from 1 to 0 */ @@ -275,26 +249,29 @@ int32 CVICALLBACK NIDAQmxInterface::FcnCbckDetectDI(TaskHandle taskHandle, int32 daq->flag_scanner = DAQ_PORT_NULL; /* switch ON box internal resonance generator */ - //DAQmxTriggerDO(DAQ_PORT_DO_FREQGEN, FALSE); + DAQmxTriggerDO(DAQ_PORT_DO_FREQGEN, FALSE); } /* FRAME condition, line 2 changes from 1 to 0 */ if (((daq->di_bit_prev & DAQ_PORT_DI_FRAME) == DAQ_PORT_DI_FRAME) & ((daq->di_bit_now & DAQ_PORT_DI_FRAME) == DAQ_PORT_NULL)) { daq->di_cntr_frame++; - DAQmxLogToFile(daq->fp_log, "FRAME", daq->di_cntr_imaq, daq->di_cntr_frame); + QString timeString = QTime::currentTime().toString("hh:mm:ss.zzz"); + emit(writeToLogFile("FRAME", daq->di_cntr_imaq, daq->di_cntr_frame, timeString)); } /* LICK condition, line 6 changes from 0 to 1 */ if (((daq->di_bit_prev & DAQ_PORT_DI_LICK) == DAQ_PORT_NULL) & ((daq->di_bit_now & DAQ_PORT_DI_LICK) == DAQ_PORT_DI_LICK)) { daq->di_cntr_lick++; - DAQmxLogToFile(daq->fp_log, "LICK", DAQ_PORT_DI_LICK, daq->di_cntr_lick); + QString timeString = QTime::currentTime().toString("hh:mm:ss.zzz"); + emit(writeToLogFile("LICK", DAQ_PORT_DI_LICK, daq->di_cntr_lick, timeString)); /* every N licks give a reward */ - if ((daq->di_cntr_lick % 16) == 0){ + if ((daq->di_cntr_lick % licksToReward) == 0){ + DAQmxTriggerDO(DAQ_PORT_DO_WATER, TRUE); + qDebug()<<"Water reward!"; } - //DAQmxTriggerDO(DAQ_PORT_DO_WATER, TRUE); } @@ -306,9 +283,9 @@ int32 CVICALLBACK NIDAQmxInterface::FcnCbckDetectDI(TaskHandle taskHandle, int32 } /* Timer Digital Out is Done */ -int32 CVICALLBACK NIDAQmxInterface::FcnCbckTriggerStopDO(TaskHandle taskHandle, int32 signalID, void* callbackData) +int32 CVICALLBACK NIDAQmxInterface::FcnCbckTriggerStopDO(TaskHandle taskHandle, int32 signalID) { - DAQmxEngine *daq = (DAQmxEngine *)callbackData; + //DAQmxEngine *daq = (DAQmxEngine *)callbackData; int32 written = 0; /* flip query bit, to switch off pulse */ @@ -326,7 +303,8 @@ int32 CVICALLBACK NIDAQmxInterface::FcnCbckTriggerStopDO(TaskHandle taskHandle, } /* log trigger */ - //DAQmxLogToFile(daq->fp_log, "TRIGGER", daq->do_bit_qry, (daq->do_bit_qry & daq->do_bit_wrt) == daq->do_bit_qry); + QString timeString = QTime::currentTime().toString("hh:mm:ss.zzz"); + emit(writeToLogFile("TRIGGER", daq->do_bit_qry, (daq->do_bit_qry & daq->do_bit_wrt) == daq->do_bit_qry, timeString)); return 0; } diff --git a/NIDAQmxInterface.h b/NIDAQmxInterface.h index f0d41e9..c2c0d88 100644 --- a/NIDAQmxInterface.h +++ b/NIDAQmxInterface.h @@ -1,11 +1,13 @@ #ifndef NIDAQmxInterface_h #define NIDAQmxInterface_h +#include #include #include #include #include #include +#include #include #include "C:\Program Files (x86)\National Instruments\Shared\ExternalCompilerSupport\C\include\NIDAQmx.h" @@ -13,9 +15,9 @@ int32 CVICALLBACK ChangeDetectionCallbackWrapper(TaskHandle taskHandle, int32 signalID, void *callbackData); int32 CVICALLBACK ChangeTriggerStopCallbackWrapper(TaskHandle taskHandle, int32 signalID, void *callbackData); -class NIDAQmxInterface +class NIDAQmxInterface: public QObject { - + Q_OBJECT /* define DAQmxErrChk macro */ #define DAQmxErrChk(functionCall)\ @@ -42,7 +44,6 @@ class NIDAQmxInterface uInt32 di_cntr_lick; uInt32 di_cntr_frame; uInt32 di_cntr_imaq; - FILE *fp_log; } DAQmxEngine; @@ -72,8 +73,9 @@ class NIDAQmxInterface static const int DAQ_PORT_DE_WATER = 0x04; const double DO_PULSE_WIDTH = 0.08;// in seconds + int licksToReward = 16; - explicit NIDAQmxInterface(); + explicit NIDAQmxInterface(QObject *parent = 0); /* function prototypes */ void DAQmxInitializeInterface(); void DAQmxDestroyInterface(); @@ -83,17 +85,17 @@ class NIDAQmxInterface void DAQmxStopCustomTask(TaskHandle); void DAQmxTriggerDO(uInt8, bool); void DAQmxWriteDO(uInt8); - void DAQmxLogToFile(FILE *, const char *, uInt32, uInt32); - DAQmxEngine* daq; /*MAKE PRIVATE*/ +signals: + void writeToLogFile(QString text, uint id, uint counter, QString stringTime); + private: /* events callback functions */ - int32 CVICALLBACK FcnCbckDetectDI(TaskHandle, int32, void *callback_data); - int32 CVICALLBACK FcnCbckTriggerStopDO(TaskHandle, int32, void *callback_data); - friend int32 CVICALLBACK ChangeDetectionCallbackWrapper(TaskHandle taskHandle, int32 signalID, void *callbackData); - friend int32 CVICALLBACK ChangeTriggerStopCallbackWrapper(TaskHandle taskHandle, int32 signalID, void *callbackData); - + int32 CVICALLBACK FcnCbckDetectDI(TaskHandle, int32); + int32 CVICALLBACK FcnCbckTriggerStopDO(TaskHandle, int32); + friend int32 CVICALLBACK ChangeDetectionCallbackWrapper(TaskHandle taskHandle, int32 signalID, void *callback_dat); + friend int32 CVICALLBACK ChangeTriggerStopCallbackWrapper(TaskHandle taskHandle, int32 signalID, void *callback_dat); #endif /* define (NIDAQmxInterface_h) */ }; diff --git a/SettingStructures.h b/SettingStructures.h index e758bbf..93f869c 100644 --- a/SettingStructures.h +++ b/SettingStructures.h @@ -5,6 +5,9 @@ struct audioGameSettings{ + + QString logFileName; + /*Sequences*/ QVector trialSequence; QVector itiSequence; @@ -12,7 +15,7 @@ struct audioGameSettings{ /*Timing*/ double preDelay = -1; double iti = -1; - double userReaction = 30; //sec + double userReaction = -1; //sec double preImaq = -1; /*Stimulus properties*/ diff --git a/StateMachineController.cpp b/StateMachineController.cpp index 0c90998..26232eb 100644 --- a/StateMachineController.cpp +++ b/StateMachineController.cpp @@ -5,8 +5,6 @@ StateMachineController::StateMachineController(QObject *parent) // seed randomizer srand(time(0)); timerDialog = new TimerDialog(); - //TDTInitializeInterface(); - mainTimer = new QTimer(this); mainTimer->setSingleShot(true); @@ -52,20 +50,34 @@ StateMachineController::StateMachineController(QObject *parent) connect(state_iti, SIGNAL(entered()), this, SLOT(onStateItiEntered())); // state user reaction connect(state_userReaction, SIGNAL(entered()), this, SLOT(onStateUserReactionEntered())); + connect(state_userReaction, SIGNAL(exited()), this, SLOT(onStateUserReactionExited())); connect(state_userReaction, SIGNAL(exited()), timerDialog, SLOT(removeTimer())); // state baseline connect(state_acquisitionBaseline, SIGNAL(entered()), this, SLOT(onStateAcquisitionBaselineEntered())); // state sound connect(state_sound, SIGNAL(entered()), this, SLOT(onStateSoundEntered())); - connect(state_sound, SIGNAL(exited()), this, SLOT(onStateSoundExited())); connect(pausedState, SIGNAL(entered()), this, SLOT(onStatePauseEntered())); + nidaq = new NIDAQmxInterface(); nidaq->DAQmxSetDefaultEngine(); nidaq->DAQmxInitializeInterface(); tdt = new TDTInterface(); tdt->initializeInterface(); + + logFileThread = new QThread(this); + logFileWriter = new LogFileWriter(); + + /*Thread-safe event communication*/ + connect(this, SIGNAL(openLogFile(QString)), logFileWriter, SLOT(onOpen(QString))); + connect(this, SIGNAL(closeLogFile()), logFileWriter, SLOT(onClose())); + connect(this, SIGNAL(writeToLogFile(QString, uint, uint, QString)), logFileWriter, SLOT(onWrite(QString, uint, uint, QString))); + connect(nidaq, SIGNAL(writeToLogFile(QString, uint, uint, QString)), logFileWriter, SLOT(onWrite(QString, uint, uint, QString))); + logFileWriter->moveToThread(logFileThread); + logFileThread->start(); + + } StateMachineController::~StateMachineController() @@ -82,6 +94,11 @@ void StateMachineController::startStateMachine(audioGameSettings settings) this->settings = settings; trialsCurrent = 1; // set index for first trial (1-based) trialsTotal = settings.trialSequence.length(); + nidaq->licksToReward = settings.licksToReward; + + emit(openLogFile(settings.logFileName)); + QString timeString = QTime::currentTime().toString("hh:mm:ss.zzz"); + emit(writeToLogFile("INIT",0,0,timeString)); // start state machine stateMachine->start(); @@ -97,6 +114,9 @@ void StateMachineController::stopStateMachine() timerDialog->removeTimer(); mainTimer->stop(); stateMachine->stop(); + QString timeString = QTime::currentTime().toString("hh:mm:ss.zzz"); + emit(writeToLogFile("EXIT",0,0,timeString)); + emit(closeLogFile()); } @@ -104,7 +124,8 @@ void StateMachineController::onStatePreDelayEntered() { qDebug() << "Pre delay"; emit(statusMessage("Pre delay running")); - + QString timeString = QTime::currentTime().toString("hh:mm:ss.zzz"); + emit(writeToLogFile("IDLE", 0, trialsCurrent,timeString)); mainTimer->setInterval(settings.preDelay * 1000); mainTimer->start(); } @@ -133,6 +154,12 @@ void StateMachineController::onStateUserReactionEntered() mainTimer->start(); } +void StateMachineController::onStateUserReactionExited() +{ + qDebug()<<"Triggering microscope"; + nidaq->DAQmxTriggerDO(NIDAQmxInterface::DAQ_PORT_DO_IMGAQ, true); +} + void StateMachineController::onStateAcquisitionBaselineEntered() { qDebug()<< "Starting baseline"; @@ -161,16 +188,10 @@ void StateMachineController::onStateSoundEntered() break; } - mainTimer->start(); - nidaq->DAQmxTriggerDO(NIDAQmxInterface::DAQ_PORT_DO_SOUND, true); - qDebug()<< "Starting sound"; emit(statusMessage("Starting sound")); - -} - -void StateMachineController::onStateSoundExited() -{ + mainTimer->start(); + nidaq->DAQmxTriggerDO(NIDAQmxInterface::DAQ_PORT_DO_SOUND, true); qDebug()<< "Finished sound"; emit(statusMessage("Finished sound")); // go to next trial @@ -184,11 +205,15 @@ void StateMachineController::onStateSoundExited() qDebug() << "Terminated"; emit(statusMessage("Terminated")); emit(terminated()); + QString timeString = QTime::currentTime().toString("hh:mm:ss.zzz"); + emit(writeToLogFile("EXIT",0,0,timeString)); + emit(closeLogFile()); } + } void StateMachineController::onStatePauseEntered() { qDebug()<<"Pause state entered"; - timerDialog->removeTimer(); + timerDialog->removeTimer(); } diff --git a/StateMachineController.h b/StateMachineController.h index 9b70496..5bc3fef 100644 --- a/StateMachineController.h +++ b/StateMachineController.h @@ -9,6 +9,7 @@ #include #include #include +#include #include #include //std::random_shuffle @@ -17,6 +18,7 @@ #include "TimerDialog.h" #include "NIDAQmxInterface.h" #include "TDTInterface.h" +#include "LogFileWriter.h" //#include "TDTInterface.h" #include "rpcoxlib.h" @@ -49,24 +51,31 @@ class StateMachineController : public QObject //RPCOXLib::RPcoX* rp; NIDAQmxInterface* nidaq; TDTInterface* tdt; + QThread* logFileThread; + LogFileWriter* logFileWriter; int trialsTotal = -1; int trialsCurrent = -1; // is gonna be 1-based, so first trial has index 1 -public slots: +private slots: void onStatePreDelayEntered(); void onStateItiEntered(); void onStateUserReactionEntered(); + void onStateUserReactionExited(); void onStateAcquisitionBaselineEntered(); void onStateSoundEntered(); - void onStateSoundExited(); void onStatePauseEntered(); + signals: void statusMessage(QString); void terminated(); void pauseRequested(); + void openLogFile(QString fileName); + void closeLogFile(); + void writeToLogFile(QString text, uint id, uint counter, QString stringTime); + }; diff --git a/app.rc b/app.rc new file mode 100644 index 0000000..d207ed4 --- /dev/null +++ b/app.rc @@ -0,0 +1 @@ +IDI_ICON1 ICON DISCARDABLE "AudioGame.ico" diff --git a/mainwindow.ui b/mainwindow.ui index 6993f49..ff86386 100644 --- a/mainwindow.ui +++ b/mainwindow.ui @@ -7,7 +7,7 @@ 0 0 472 - 833 + 614 @@ -218,7 +218,7 @@ - pre-imaq [sec] + pre-stimulus [sec] @@ -270,7 +270,7 @@ - ordered + alternating @@ -394,45 +394,8 @@ - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - 0 - 0 - 472 - 21 - - - - false - - - - - false - - - TopToolBarArea - - - false - -