#include "answer3AFC.h"\r
\r
#include <QTimer>\r
+#include <QDate>\r
+#include <QTime>\r
#include <QDebug>\r
#include <cmath>\r
\r
-#define RESETVAL (3)\r
-\r
Answer3AFC::Answer3AFC(QWidget *parent, Qt::WFlags flags)\r
:QDialog(parent, flags),\r
-_logfile(NULL), _tactonPlayer("COM3"), _defaulttacton(0x0f, 50, 205, 100), \r
+_logfile(NULL), _tactonPlayer("COM3"), _defaulttacton(0x0f, 100, 205, 100), \r
_currenttest(0.0), _goodanswer(-1), _block(0)\r
{\r
//init the window\r
_tactonPlayer.stop();\r
}\r
\r
-void Answer3AFC::init(QString user, int repetitions, int reversals, double tinc, double finc, int tseries, int fseries, QString experiment, QString gesture)\r
+void Answer3AFC::init(QString user, int repetitions, int reversals, double initval, double tinc, double finc, double threshold, double smalltinc, double smallfinc, int tseries, int fseries, QString experiment, QString gesture)\r
{\r
_user = user;\r
_repetitions = repetitions;\r
_reversals = reversals;\r
+ _initval = initval;\r
_tinc = tinc;\r
_finc = finc;\r
+ _threshold = threshold;\r
+ _smalltinc = smalltinc;\r
+ _smallfinc = smallfinc;\r
_tseries = tseries;\r
_fseries = fseries;\r
_experiment = experiment;\r
_gesture = gesture;\r
\r
//create log file\r
- QString logfilename = user + "-" + experiment + "-" + gesture + "-";\r
- _logfile = fopen(logfilename.toStdString().c_str(), "w");\r
+ QString date = QDate::currentDate().toString("yyyy-MM-dd") + "-" + QTime::currentTime().toString("HH-mm-ss");\r
+ QString logfilename = user + "-" + experiment + "-" + gesture + "-" + date + "-answers";\r
+ if (_logfile = fopen(logfilename.toStdString().c_str(), "w"))\r
+ fprintf(_logfile, "TRIAL,VALUE,TESTVALUE,DIFF,GOODANSWER,USERANSWER,NBPRESSED1,NBPRESSED2,NBPRESSED3\n");\r
+ logfilename = user + "-" + experiment + "-" + gesture + "-" + date + "-jnd";\r
+ if (_logfile2 = fopen(logfilename.toStdString().c_str(), "w"))\r
+ fprintf(_logfile2, "TRIAL,VALUE,JND\n");\r
+\r
\r
//load icons\r
FILE *f = fopen((experiment + ".txt").toAscii().data(), "r");\r
{\r
if (val)\r
{\r
- if (_tseries == 1 && _currenttest >= _tinc)\r
+ if (_tseries == 1)\r
{\r
//change \r
- _currenttest -= _tinc;\r
- nb = 0;\r
+ if (_currenttest < _threshold)\r
+ {\r
+ if (_currenttest > _smalltinc)\r
+ {\r
+ _currenttest -= _smalltinc;\r
+ nb = 0;\r
+ }\r
+ }\r
+ else if (_currenttest > _tinc)\r
+ {\r
+ _currenttest -= _tinc;\r
+ nb = 0;\r
+ }\r
}\r
}\r
//wrong answer: increase the gap\r
- else\r
+ else if (_fseries == 1)// && _currenttest < _initval)\r
{\r
- if (_fseries == 1)// && _currenttest < RESETVAL)\r
- {\r
- //change \r
+ //change \r
+ if (_currenttest < _threshold)\r
+ _currenttest += _smallfinc;\r
+ else\r
_currenttest += _finc;\r
- nb = 0;\r
- }\r
+ nb = 0;\r
}\r
}\r
}\r
//good answer: reduce the gap\r
if (val)\r
{\r
- if (nb >= _tseries && _currenttest >= _tinc)\r
+ if (nb >= _tseries)\r
{\r
//change \r
- _currenttest -= _tinc;\r
- nb = 0;\r
+ if (_currenttest < _threshold)\r
+ {\r
+ if (_currenttest > _smalltinc)\r
+ {\r
+ _currenttest -= _smalltinc;\r
+ nb = 0;\r
+ }\r
+ }\r
+ else if (_currenttest > _tinc)\r
+ {\r
+ _currenttest -= _tinc;\r
+ nb = 0;\r
+ }\r
}\r
}\r
//wrong answer: increase the gap\r
- else\r
+ else if (nb >= _fseries)// && _currenttest < _initval)\r
{\r
- if (nb >= _fseries)// && _currenttest < RESETVAL)\r
- {\r
- //change \r
+ //change \r
+ if (_currenttest < _threshold)\r
+ _currenttest += _smallfinc;\r
+ else\r
_currenttest += _finc;\r
- nb = 0;\r
- }\r
+ nb = 0;\r
}\r
}\r
lastval = val;\r
{\r
if (_logfile == NULL)\r
return;\r
- fprintf(_logfile, "ANSWER,%d,%d,%0.2f,%d,%d,%d,%d,%d\n", _block, _trials[_block], _currenttest, _goodanswer, answer, _tplayed[0], _tplayed[1], _tplayed[2]);\r
+ fprintf(_logfile, "%d,%d,%d,%0.2f,%d,%d,%d,%d,%d\n", _block, _trials[_block], testValue(_trials[_block], _currenttest), _currenttest, _goodanswer, answer, _tplayed[0], _tplayed[1], _tplayed[2]);\r
}\r
\r
void Answer3AFC::log2() const\r
{\r
- if (_logfile == NULL)\r
+ if (_logfile2 == NULL)\r
return;\r
- fprintf(_logfile, "JND,%d,%d,%0.2f\n", _block, _trials[_block], _jnd[_block]);\r
+ fprintf(_logfile2, "%d,%d,%0.2f\n", _block, _trials[_block], _jnd[_block]);\r
}\r
\r
void Answer3AFC::runBlock()\r
label->setText("Finished!");\r
}\r
\r
- _currenttest = RESETVAL;\r
+ _currenttest = _initval;\r
runTrial();\r
}\r
\r
Answer3AFC(QWidget *parent = 0, Qt::WFlags flags = 0);\r
~Answer3AFC();\r
\r
- void init(QString user, int repetitions, int reversals, double tinc, double finc, int tseries, int fseries, QString experiment, QString gesture);\r
+ void init(QString user, int repetitions, int reversals, double initval, double tinc, double finc, double threshold, double smalltinc, double smallfinc, int tseries, int fseries, QString experiment, QString gesture);\r
\r
void setAnswer(bool same);\r
\r
void runBlock();\r
unsigned int testValue(unsigned int value, double db) const;\r
\r
- FILE *_logfile;\r
+ FILE *_logfile, *_logfile2;\r
TactonPlayer _tactonPlayer;\r
Tacton _defaulttacton;\r
\r
//exp parameters\r
QString _user;\r
int _repetitions, _reversals, _tseries, _fseries;\r
- double _tinc, _finc;\r
+ double _initval, _tinc, _finc, _threshold, _smalltinc, _smallfinc;\r
QString _experiment;\r
QString _gesture;\r
\r
{\r
this->hide();\r
w.init(username->text(), repetitions->value(), \r
- reversals->value(), tinc->value(), finc->value(), tseries->value(), fseries->value(), \r
+ reversals->value(), initval->value(), tinc->value(), finc->value(), threshold->value(), \r
+ smalltinc->value(), smallfinc->value(), tseries->value(), fseries->value(), \r
experiment->currentText(), gesture->currentText());\r
w.show();\r
}\r
<rect>\r
<x>0</x>\r
<y>0</y>\r
- <width>231</width>\r
- <height>279</height>\r
+ <width>230</width>\r
+ <height>357</height>\r
</rect>\r
</property>\r
<property name="windowTitle">\r
<item row="0" column="0">\r
<layout class="QGridLayout" name="gridLayout_2">\r
<item row="1" column="0">\r
- <layout class="QGridLayout" name="gridLayout" rowstretch="0,0,0,0,0,0,0,0,0">\r
+ <layout class="QGridLayout" name="gridLayout" rowstretch="0,0,0,0,0,0,0,0,0,0,0,0,0">\r
<item row="0" column="0">\r
<widget class="QLabel" name="labeluser">\r
<property name="text">\r
</property>\r
</widget>\r
</item>\r
- <item row="3" column="0">\r
+ <item row="12" column="1">\r
+ <widget class="QComboBox" name="gesture"/>\r
+ </item>\r
+ <item row="11" column="1">\r
+ <widget class="QComboBox" name="experiment"/>\r
+ </item>\r
+ <item row="10" column="1">\r
+ <widget class="QSpinBox" name="fseries">\r
+ <property name="minimum">\r
+ <number>1</number>\r
+ </property>\r
+ <property name="maximum">\r
+ <number>20</number>\r
+ </property>\r
+ </widget>\r
+ </item>\r
+ <item row="9" column="1">\r
+ <widget class="QSpinBox" name="tseries">\r
+ <property name="minimum">\r
+ <number>1</number>\r
+ </property>\r
+ <property name="maximum">\r
+ <number>20</number>\r
+ </property>\r
+ </widget>\r
+ </item>\r
+ <item row="12" column="0">\r
+ <widget class="QLabel" name="labelgesture">\r
+ <property name="text">\r
+ <string>Gesture:</string>\r
+ </property>\r
+ </widget>\r
+ </item>\r
+ <item row="11" column="0">\r
+ <widget class="QLabel" name="labelexperiment">\r
+ <property name="text">\r
+ <string>Experiment:</string>\r
+ </property>\r
+ </widget>\r
+ </item>\r
+ <item row="10" column="0">\r
+ <widget class="QLabel" name="fserieslabel">\r
+ <property name="text">\r
+ <string>F Series</string>\r
+ </property>\r
+ </widget>\r
+ </item>\r
+ <item row="9" column="0">\r
+ <widget class="QLabel" name="tserieslabel">\r
+ <property name="text">\r
+ <string>T Series</string>\r
+ </property>\r
+ </widget>\r
+ </item>\r
+ <item row="8" column="0">\r
+ <widget class="QLabel" name="labelsmallfinc">\r
+ <property name="text">\r
+ <string>Small F inc</string>\r
+ </property>\r
+ </widget>\r
+ </item>\r
+ <item row="7" column="0">\r
+ <widget class="QLabel" name="labelsmalltinc">\r
+ <property name="text">\r
+ <string>Small T inc</string>\r
+ </property>\r
+ </widget>\r
+ </item>\r
+ <item row="6" column="0">\r
+ <widget class="QLabel" name="labelthreshold">\r
+ <property name="text">\r
+ <string>Threshold</string>\r
+ </property>\r
+ </widget>\r
+ </item>\r
+ <item row="4" column="0">\r
<widget class="QLabel" name="tinclabel">\r
<property name="text">\r
<string>T Inc</string>\r
</property>\r
</widget>\r
</item>\r
- <item row="3" column="1">\r
+ <item row="5" column="0">\r
+ <widget class="QLabel" name="finclabel">\r
+ <property name="text">\r
+ <string>F Inc</string>\r
+ </property>\r
+ </widget>\r
+ </item>\r
+ <item row="4" column="1">\r
<widget class="QDoubleSpinBox" name="tinc">\r
<property name="maximum">\r
<double>10.000000000000000</double>\r
</property>\r
</widget>\r
</item>\r
- <item row="4" column="0">\r
- <widget class="QLabel" name="finclabel">\r
- <property name="text">\r
- <string>F Inc</string>\r
- </property>\r
- </widget>\r
- </item>\r
- <item row="4" column="1">\r
+ <item row="5" column="1">\r
<widget class="QDoubleSpinBox" name="finc">\r
<property name="minimum">\r
<double>0.000000000000000</double>\r
</property>\r
</widget>\r
</item>\r
- <item row="5" column="0">\r
- <widget class="QLabel" name="tserieslabel">\r
- <property name="text">\r
- <string>T Series</string>\r
+ <item row="6" column="1">\r
+ <widget class="QDoubleSpinBox" name="threshold">\r
+ <property name="maximum">\r
+ <double>10.000000000000000</double>\r
</property>\r
- </widget>\r
- </item>\r
- <item row="6" column="0">\r
- <widget class="QLabel" name="fserieslabel">\r
- <property name="text">\r
- <string>F Series</string>\r
+ <property name="singleStep">\r
+ <double>0.100000000000000</double>\r
</property>\r
</widget>\r
</item>\r
- <item row="7" column="0">\r
- <widget class="QLabel" name="labelexperiment">\r
- <property name="text">\r
- <string>Experiment:</string>\r
+ <item row="7" column="1">\r
+ <widget class="QDoubleSpinBox" name="smalltinc">\r
+ <property name="minimum">\r
+ <double>0.100000000000000</double>\r
</property>\r
- </widget>\r
- </item>\r
- <item row="8" column="0">\r
- <widget class="QLabel" name="labelgesture">\r
- <property name="text">\r
- <string>Gesture:</string>\r
+ <property name="maximum">\r
+ <double>10.000000000000000</double>\r
+ </property>\r
+ <property name="singleStep">\r
+ <double>0.100000000000000</double>\r
+ </property>\r
+ <property name="value">\r
+ <double>0.100000000000000</double>\r
</property>\r
</widget>\r
</item>\r
- <item row="5" column="1">\r
- <widget class="QSpinBox" name="tseries">\r
+ <item row="8" column="1">\r
+ <widget class="QDoubleSpinBox" name="smallfinc">\r
<property name="minimum">\r
- <number>1</number>\r
+ <double>0.100000000000000</double>\r
</property>\r
<property name="maximum">\r
- <number>20</number>\r
+ <double>10.000000000000000</double>\r
+ </property>\r
+ <property name="singleStep">\r
+ <double>0.100000000000000</double>\r
</property>\r
</widget>\r
</item>\r
- <item row="6" column="1">\r
- <widget class="QSpinBox" name="fseries">\r
- <property name="minimum">\r
- <number>1</number>\r
+ <item row="3" column="0">\r
+ <widget class="QLabel" name="label">\r
+ <property name="text">\r
+ <string>Init val</string>\r
</property>\r
+ </widget>\r
+ </item>\r
+ <item row="3" column="1">\r
+ <widget class="QDoubleSpinBox" name="initval">\r
<property name="maximum">\r
- <number>20</number>\r
+ <double>20.000000000000000</double>\r
+ </property>\r
+ <property name="singleStep">\r
+ <double>0.250000000000000</double>\r
+ </property>\r
+ <property name="value">\r
+ <double>6.000000000000000</double>\r
</property>\r
</widget>\r
</item>\r
- <item row="7" column="1">\r
- <widget class="QComboBox" name="experiment"/>\r
- </item>\r
- <item row="8" column="1">\r
- <widget class="QComboBox" name="gesture"/>\r
- </item>\r
</layout>\r
</item>\r
</layout>\r