Skip to content
This repository has been archived by the owner. It is now read-only.

Commit

Permalink
Added writing to logFile. Fixed all interfaces
Browse files Browse the repository at this point in the history
MPIBR-kretschmerf committed Oct 18, 2016
1 parent 2f0ed7a commit 08adfd9
Showing 13 changed files with 159 additions and 117 deletions.
Binary file added AudioGame.ico
Binary file not shown.
7 changes: 5 additions & 2 deletions AudioGameGUI.pro
Original file line number Diff line number Diff line change
@@ -10,6 +10,7 @@ greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
CONFIG += c++11

win32 {
RC_FILE = app.rc
QT += axcontainer
TYPELIBS = $$system(dumpcpp -getfile {D323A622-1D13-11D4-8858-444553540000})

@@ -31,7 +32,8 @@ SOURCES += main.cpp\
Mainwindow.cpp \
TimerDialog.cpp \
TDTInterface.cpp \
trialseq.cpp
trialseq.cpp \
LogFileWriter.cpp


HEADERS += \
@@ -41,7 +43,8 @@ HEADERS += \
Mainwindow.h \
SettingStructures.h \
TDTInterface.h \
trialseq.h
trialseq.h \
LogFileWriter.h

#LIBS += -L"C:\\TDT\\lib64" \
# -lRPco
29 changes: 29 additions & 0 deletions LogFileWriter.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
#include "LogFileWriter.h"

LogFileWriter::LogFileWriter(QObject* parent)
: QObject(parent)
{
}

void LogFileWriter::onOpen(QString fileName)
{
logFile.setFileName(fileName);
logFile.open(QIODevice::WriteOnly | QIODevice::Text);
QTextStream out(&logFile);
/*Write header*/
out<<QString("#event\tbit_mask\tstate\ttime\n");
}

void LogFileWriter::onClose()
{
logFile.close();
}

void LogFileWriter::onWrite(QString text, uint id, uint counter, QString timeString)
{
// QString timeString = QTime::currentTime().toString("hh:mm:ss.zzz");
if(logFile.isOpen()){
QTextStream out(&logFile);
out << text << "\t" << id << "\t" << counter << "\t" << timeString << "\n";
}
}
26 changes: 26 additions & 0 deletions LogFileWriter.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
#ifndef LOGFILEWRITER_H
#define LOGFILEWRITER_H

#include <QObject>
#include <QFile>
#include <QThread>
#include <QDataStream>
#include <QDebug>
#include <QTime>

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
6 changes: 4 additions & 2 deletions Mainwindow.cpp
Original file line number Diff line number Diff line change
@@ -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)
1 change: 1 addition & 0 deletions Mainwindow.h
Original file line number Diff line number Diff line change
@@ -44,6 +44,7 @@ private slots:
void onStatusMessage(QString statusMessage);



private:
Ui::MainWindow *ui;

70 changes: 24 additions & 46 deletions NIDAQmxInterface.cpp
Original file line number Diff line number Diff line change
@@ -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<NIDAQmxInterface*>(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<NIDAQmxInterface*>(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;
}
24 changes: 13 additions & 11 deletions NIDAQmxInterface.h
Original file line number Diff line number Diff line change
@@ -1,21 +1,23 @@
#ifndef NIDAQmxInterface_h
#define NIDAQmxInterface_h

#include <QObject>
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <ctype.h>
#include <time.h>
#include <QTime>
#include <QDebug>
#include "C:\Program Files (x86)\National Instruments\Shared\ExternalCompilerSupport\C\include\NIDAQmx.h"


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) */
};
5 changes: 4 additions & 1 deletion SettingStructures.h
Original file line number Diff line number Diff line change
@@ -5,14 +5,17 @@


struct audioGameSettings{

QString logFileName;

/*Sequences*/
QVector<int> trialSequence;
QVector<double> itiSequence;

/*Timing*/
double preDelay = -1;
double iti = -1;
double userReaction = 30; //sec
double userReaction = -1; //sec
double preImaq = -1;

/*Stimulus properties*/

0 comments on commit 08adfd9

Please sign in to comment.