#include <QString>\r
\r
AnswerPosition::AnswerPosition(QWidget *parent, Qt::WFlags flags)\r
-:QMainWindow(parent, flags), _currentdirection(-1), _currenttrial(0)\r
+:QMainWindow(parent, flags), _currentdirection(-1), _currenttrial(0), _logfile(NULL)\r
{\r
try\r
{\r
_logfile = fopen(logfilename.toStdString().c_str(), "w");\r
qDebug() << "log: " << logfilename;\r
if (_logfile)\r
- fprintf(_logfile, "Degrees,Direction,Answer,Error\n");\r
+ fprintf(_logfile, "Time,Degrees,Direction,Answer,Delta,DeltaDegrees,Error\n");\r
\r
_player->setFrequency(frequency);\r
\r
}\r
_progress->setMaximum(_trials.size());\r
\r
+ _timer.start();\r
+\r
runTrial();\r
}\r
\r
void AnswerPosition::answer()\r
{\r
if (_logfile)\r
- fprintf(_logfile, "%d,%d,%d\n", (_trials.at(_currenttrial) * 90) / 4, _trials.at(_currenttrial), _currentdirection, _trials.at(_currenttrial) == _currentdirection);\r
+ {\r
+ //fprintf(_logfile, "Time,Degrees,Direction,Answer,Delta,Error\n");\r
+\r
+ int delta = std::min(abs(_trials.at(_currenttrial) - _currentdirection),\r
+ abs(16 + _trials.at(_currenttrial) - _currentdirection));\r
+ fprintf(_logfile, "%lld,%d,%d,%d,%d,%d,%d\n", \r
+ _timer.elapsed(), \r
+ (_trials.at(_currenttrial) * 90) / 4, \r
+ _trials.at(_currenttrial), \r
+ _currentdirection,\r
+ delta,\r
+ delta * 90 / 4,\r
+ _trials.at(_currenttrial) != _currentdirection);\r
+ }\r
\r
QAbstractButton* checked = _group.checkedButton();\r
if (checked)\r
\r
void AnswerPosition::stop()\r
{\r
- _player->stop();\r
+ unsigned char amp[] = {0, 0, 0, 0};\r
+ _player->setAmplitudes(4, amp);\r
}
\ No newline at end of file
#include <QDebug>\r
\r
AnswerDeltaTime::AnswerDeltaTime(QWidget *parent)\r
-: QMainWindow(parent), _logfile(NULL), _goodanswer(-1), _currentconfig(0)\r
+: QMainWindow(parent), _goodanswer(-1), _currentconfig(0), _logfile(NULL), _logfile2(NULL)\r
{\r
try\r
{\r
//delete _animation;\r
}\r
\r
-void AnswerDeltaTime::init(QString user, int frequency, int timegap, int duration, double delta, int reversals)\r
+void AnswerDeltaTime::init(QString user, int frequency, int timegap, int duration, int delta, int reversals)\r
{\r
//two vibrators alone\r
_configurations[0][0] = 0;\r
_reversals = reversals;\r
_frequency = frequency;\r
_delta = delta;\r
-\r
- _animation = new QTimeLine(duration, this);\r
- _animation->setFrameRange(0, duration/timegap);\r
-// _animation->setUpdateInterval(timegap);\r
- connect(_animation, SIGNAL(frameChanged(int)), this, SLOT(playTest(int)));\r
- connect(_animation, SIGNAL(finished()), this, SLOT(stop()));\r
+ _duration = duration;\r
\r
//create log file\r
QString date = QDate::currentDate().toString("yyyy-MM-dd") + "-" + QTime::currentTime().toString("HH-mm-ss");\r
- QString logfilename = user + "-" + date + "-answers";\r
+ QString logfilename = user + "-" + date + "-answers.csv";\r
if (_logfile = fopen(logfilename.toStdString().c_str(), "w"))\r
- fprintf(_logfile, "Angle1,Angle2,Duration,Interval,GoodAnswer,UserAnswer,Error\n");\r
- logfilename = user + "-" + date + "-jnd";\r
+ fprintf(_logfile, "Time,Angle1,Angle2,Duration,Interval,GoodAnswer,UserAnswer,Error\n");\r
+ logfilename = user + "-" + date + "-jnd.csv";\r
if (_logfile2 = fopen(logfilename.toStdString().c_str(), "w"))\r
- fprintf(_logfile2, "A1,A2,JND\n");\r
+ fprintf(_logfile2, "Time,A1,A2,JND\n");\r
\r
for (int i = 0 ; i < 4 ; i++)\r
{\r
- _currenttest[i] = 1.0;\r
+ _currenttest[i] = timegap;\r
_configfinished[i] = false;\r
}\r
\r
unsigned char amp[] = {0, 0, 0, 0};\r
_tactonPlayer->setAmplitudes(4, amp);\r
_tactonPlayer->setFrequency(frequency);\r
-\r
+ \r
+ _timer.start();\r
runTrial();\r
}\r
\r
-void AnswerDeltaTime::setAngle(int angle)\r
+void AnswerDeltaTime::playTest()\r
{\r
- unsigned char amplitudes[4];\r
- memset(amplitudes, 0, 4);\r
-\r
- //vertical\r
- if (angle < 180)\r
- amplitudes[1] = 255 * sin(angle * M_PI / 180.0);\r
- else\r
- amplitudes[3] = - 255 * sin(angle * M_PI / 180.0);\r
-\r
- //horizontal\r
- if (angle < 90 || angle > 270)\r
- amplitudes[0] = 255 * cos(angle * M_PI / 180.0);\r
- else\r
- amplitudes[2] = - 255 * cos(angle * M_PI / 180.0);\r
-\r
- _tactonPlayer->setAmplitudes(4, amplitudes);\r
-}\r
+ if (_currenttest[_currentconfig] == 0)\r
+ {\r
+ playOther();\r
+ return;\r
+ }\r
\r
-void AnswerDeltaTime::playTest(int frame)\r
-{\r
- qDebug() << "f" << frame << "\n";\r
- setAngle(_configurations[_currentconfig][frame % 2]);\r
+ unsigned int angles[2] = { _configurations[_currentconfig][0], _configurations[_currentconfig][1]};\r
+ _tactonPlayer->playAngleSequence(\r
+ 2, \r
+ _currenttest[_currentconfig], \r
+ _duration / _currenttest[_currentconfig], \r
+ angles);\r
}\r
\r
void AnswerDeltaTime::playOther()\r
amplitudes[0] = amplitudes[1] = 255;\r
break;\r
case 2:\r
- amplitudes[0] = amplitudes[1] = amplitudes[2] = amplitudes[3] = 255;\r
+ amplitudes[0] = amplitudes[1] = amplitudes[2] = amplitudes[3] = 127;\r
break;\r
case 3:\r
- amplitudes[0] = amplitudes[1] = amplitudes[3] = 255;\r
+ amplitudes[0] = amplitudes[1] = amplitudes[3] = 170;\r
break;\r
}\r
\r
_tactonPlayer->setAmplitudes(4, amplitudes);\r
\r
- QTimer::singleShot(_animation->duration(), this, SLOT(stop()));\r
+ QTimer::singleShot(_duration, this, SLOT(stop()));\r
}\r
\r
void AnswerDeltaTime::stop()\r
if (val)\r
{\r
_currenttest[_currentconfig] -= _delta;\r
- if (_currenttest[_currentconfig] < 0.0)\r
- _currenttest[_currentconfig] = 0.0;\r
+ if (_currenttest[_currentconfig] < 0)\r
+ _currenttest[_currentconfig] = 0;\r
}\r
//wrong answer: increase the gap\r
else\r
{\r
_currenttest[_currentconfig] += _delta;\r
- if (_currenttest[_currentconfig] > 1.0)\r
- _currenttest[_currentconfig] = 1.0;\r
+/* if (_currenttest[_currentconfig] > 1.0)\r
+ _currenttest[_currentconfig] = 1.0;*/\r
}\r
}\r
}\r
if (val)\r
{\r
_currenttest[_currentconfig] -= _delta;\r
- if (_currenttest[_currentconfig] < 0.0)\r
- _currenttest[_currentconfig] = 0.0;\r
+ if (_currenttest[_currentconfig] < 0)\r
+ _currenttest[_currentconfig] = 0;\r
}\r
//wrong answer: increase the gap\r
else\r
{\r
_currenttest[_currentconfig] += _delta;\r
- if (_currenttest[_currentconfig] > 1.0)\r
- _currenttest[_currentconfig] = 1.0;\r
+/* if (_currenttest[_currentconfig] > 1.0)\r
+ _currenttest[_currentconfig] = 1.0;*/\r
}\r
}\r
lastval[_currentconfig] = val;\r
{\r
if (_logfile == NULL)\r
return;\r
- fprintf(_logfile, "%d,%d,%0.2f,%d,%d,%d,%d\n", \r
- _configurations[_currentconfig][0], _configurations[_currentconfig][1], _animation->duration(), _currenttest[_currentconfig], _goodanswer, answer, _goodanswer == answer);\r
+ fprintf(_logfile, "%lld,%d,%d,%d,%d,%d,%d,%d\n", \r
+ _timer.elapsed(), \r
+ _configurations[_currentconfig][0], \r
+ _configurations[_currentconfig][1], \r
+ _duration, \r
+ _currenttest[_currentconfig], \r
+ _goodanswer, \r
+ answer, \r
+ _goodanswer != answer);\r
}\r
\r
void AnswerDeltaTime::log2() const\r
{\r
if (_logfile2 == NULL)\r
return;\r
- fprintf(_logfile2, "%d,%d,%0.2f\n", _configurations[_currentconfig][0], _configurations[_currentconfig][1], _jnd[_currentconfig]);\r
+ fprintf(_logfile2, "%lld,%d,%d,%0.2f\n", \r
+ _timer.elapsed(), \r
+ _configurations[_currentconfig][0], \r
+ _configurations[_currentconfig][1], \r
+ _jnd[_currentconfig]);\r
}\r
\r
void AnswerDeltaTime::runTrial()\r
{\r
_goodanswer = rand() % 3;\r
\r
- qDebug() << "good: " << _goodanswer << "\n";\r
- _animation->setFrameRange(0, _animation->duration()/_currenttest[_currentconfig]);\r
+// qDebug() << "good: " << _goodanswer << "\n";\r
+// _animation->setFrameRange(0, _duration/_currenttest[_currentconfig]);\r
\r
\r
switch(_goodanswer)\r
{\r
case 0:\r
- QTimer::singleShot(500, _animation, SLOT(start()));\r
- QTimer::singleShot(1500 + _animation->duration(), this, SLOT(playOther()));\r
- QTimer::singleShot(2500 + 2 * _animation->duration(), this, SLOT(playOther()));\r
+ QTimer::singleShot(500, this, SLOT(playTest()));\r
+ QTimer::singleShot(1500 + _duration, this, SLOT(playOther()));\r
+ QTimer::singleShot(2500 + 2 * _duration, this, SLOT(playOther()));\r
break;\r
case 1:\r
QTimer::singleShot(500, this, SLOT(playOther()));\r
- QTimer::singleShot(1500 + _animation->duration(), _animation, SLOT(start()));\r
- QTimer::singleShot(2500 + 2 * _animation->duration(), this, SLOT(playOther()));\r
+ QTimer::singleShot(1500 + _duration, this, SLOT(playTest()));\r
+ QTimer::singleShot(2500 + 2 * _duration, this, SLOT(playOther()));\r
break;\r
case 2:\r
QTimer::singleShot(500, this, SLOT(playOther()));\r
- QTimer::singleShot(1500 + _animation->duration(), this, SLOT(playOther()));\r
- QTimer::singleShot(2500 + 2 * _animation->duration(), _animation, SLOT(start()));\r
+ QTimer::singleShot(1500 + _duration, this, SLOT(playOther()));\r
+ QTimer::singleShot(2500 + 2 * _duration, this, SLOT(playTest()));\r
break;\r
}\r
}\r