--- /dev/null
+#include "SetupMenu.h"\r
+\r
+\r
+SetupMenu::SetupMenu(QWidget *parent, Qt::WFlags flags)\r
+: QMainWindow(parent, flags)\r
+{\r
+ setupUi(this);\r
+\r
+ connect(_start, SIGNAL(clicked()), this, SLOT(init()));\r
+}\r
+\r
+\r
+SetupMenu::~SetupMenu(void)\r
+{\r
+}\r
+\r
+void SetupMenu::init()\r
+{\r
+ _tactileMenus = new TactileMenus();\r
+ _tactileMenus->init(_user->text(), _condition->currentText(), \r
+ _nbItems->value(), _repetitions->value(), \r
+ _widths->value(), _marginStep->value(), \r
+ _hoverFeedback->checkState() == Qt::Checked, \r
+ _leaveFeedback->checkState() == Qt::Checked,\r
+ _triggerFeedback->checkState() == Qt::Checked);\r
+ _tactileMenus->show();\r
+ this->hide();\r
+}
\ No newline at end of file
--- /dev/null
+#ifndef __SETUPMENU__\r
+#define __SETUPMENU__\r
+\r
+#include <QtGui/QMainWindow>\r
+#include "ui_SetupMenu.h"\r
+\r
+#include "TactileMenus.h"\r
+\r
+class SetupMenu: public QMainWindow, public Ui::SetupMenu\r
+{\r
+ Q_OBJECT\r
+\r
+ public:\r
+ SetupMenu(QWidget *parent = NULL, Qt::WFlags flags = NULL);\r
+ ~SetupMenu();\r
+\r
+ public slots:\r
+ void init();\r
+\r
+ private:\r
+ TactileMenus *_tactileMenus;\r
+};\r
+\r
+#endif\r
<?xml version="1.0" encoding="UTF-8"?>\r
<ui version="4.0">\r
- <class>MainWindow</class>\r
- <widget class="QMainWindow" name="MainWindow">\r
+ <class>SetupMenu</class>\r
+ <widget class="QMainWindow" name="SetupMenu">\r
<property name="geometry">\r
<rect>\r
<x>0</x>\r
<y>0</y>\r
<width>252</width>\r
- <height>256</height>\r
+ <height>260</height>\r
</rect>\r
</property>\r
<property name="windowTitle">\r
<number>100</number>\r
</property>\r
<property name="value">\r
- <number>10</number>\r
+ <number>2</number>\r
</property>\r
</widget>\r
</item>\r
<number>1</number>\r
</property>\r
<property name="value">\r
- <number>10</number>\r
+ <number>20</number>\r
</property>\r
</widget>\r
</item>\r
</layout>\r
</item>\r
<item>\r
- <widget class="QPushButton" name="pushButton">\r
+ <widget class="QPushButton" name="_start">\r
<property name="font">\r
<font>\r
<pointsize>12</pointsize>\r
TMenu::TMenu(TactonPlayer *tactonPlayer, QWidget *parent)\r
:QMenu(parent), _tactonPlayer(tactonPlayer)\r
{\r
- this->setStyleSheet(" QMenu {\\r
- background-color: #bbbbbb;\\r
- border: 1px solid black;\\r
- font-size: 30pt;\\r
- }\\r
- QMenu::item {\\r
- background-color: transparent;\\r
- padding: 10px 50px 10px 50px;\\r
- }\\r
- QMenu::item:selected {\\r
- background-color: #eeeeee;\\r
- }");\r
+ setWidth(0);\r
}\r
\r
\r
QAction *a;\r
if ((a = activeAction()) != NULL)\r
a->trigger();\r
+ else\r
+ emit cancelled();\r
close();\r
-}
\ No newline at end of file
+}\r
+\r
+void TMenu::leaveEvent (QEvent *)\r
+{\r
+ emit left();\r
+}\r
+\r
+void TMenu::setWidth(int w)\r
+{\r
+ this->setStyleSheet(" QMenu {\\r
+ background-color: #bbbbbb;\\r
+ border: 1px solid black;\\r
+ font-size: 30pt;\\r
+ }\\r
+ QMenu::item {\\r
+ background-color: transparent;\\r
+ padding: 0px " + QString::number(w) + "px 0px " + QString::number(w) + "px;\\r
+ }\\r
+ QMenu::item:selected {\\r
+ background-color: #eeeeee;\\r
+ }");\r
+}\r
\r
class TMenu : public QMenu\r
{\r
+ Q_OBJECT\r
+\r
public:\r
TMenu(TactonPlayer *_tactonPlayer, QWidget *parent=NULL);\r
~TMenu();\r
\r
void mouseReleaseEvent(QMouseEvent * event);\r
+ void leaveEvent (QEvent *);\r
+\r
+ void setWidth(int w);\r
+\r
+ signals:\r
+ void left();\r
+ void cancelled();\r
+\r
\r
private:\r
TactonPlayer *_tactonPlayer;\r
\r
#include <QMouseEvent>\r
#include <QDebug>\r
+#include <QDate>\r
\r
TactileMenus::TactileMenus(QWidget *parent, Qt::WFlags flags)\r
- : QMainWindow(parent, flags), _menu(NULL)\r
+ : QMainWindow(parent, flags), _menu(NULL), _signalMapper(NULL), _currenttrial(0)\r
{\r
setupUi(this);\r
QWidget::showMaximized();\r
qDebug() << "Cannot find the touchscreen or the wristband";\r
_tactonPlayer = NULL;\r
}\r
+}\r
+\r
+TactileMenus::~TactileMenus()\r
+{\r
+ if (_tactonPlayer)\r
+ delete _tactonPlayer;\r
+\r
+ if (_signalMapper)\r
+ delete _signalMapper;\r
+}\r
+\r
+void TactileMenus::init(QString user, QString condition, \r
+ int nbItems, int repetitions, \r
+ int widths, int marginStep, \r
+ bool hoverFeedback, bool leaveFeedback, bool triggerFeedback)\r
+{\r
+ //store values\r
+ _user = user;\r
+ _condition = condition; \r
+ _nbItems = nbItems;\r
+ _repetitions = repetitions;\r
+ _widths = widths;\r
+ _marginStep = marginStep; \r
+ _hoverFeedback = hoverFeedback;\r
+ _leaveFeedback = leaveFeedback;\r
+ _triggerFeedback = triggerFeedback;\r
\r
- _menu = new TMenu(_tactonPlayer, this);\r
\r
+ //populate menu\r
+ _menu = new TMenu(_tactonPlayer, this);\r
_signalMapper = new QSignalMapper(this);\r
\r
- for (int i = 1 ; i < 8 ; i++) \r
+ for (int i = 1 ; i <= nbItems ; i++) \r
{\r
QAction *a = new QAction(QString::number(i), this);\r
_menu->addAction(a);\r
connect(a, SIGNAL(triggered()), _signalMapper, SLOT(map()));\r
- connect(a, SIGNAL(hovered()), this, SLOT(pouet()));\r
+\r
+ //activate hover feedback\r
+ if (hoverFeedback)\r
+ connect(a, SIGNAL(hovered()), this, SLOT(pouet()));\r
_signalMapper->setMapping(a, i);\r
}\r
-\r
connect(_signalMapper, SIGNAL(mapped(int)), this, SLOT(execute(int)));\r
-}\r
\r
+ //log when release out of the menu\r
+ connect(_menu, SIGNAL(cancelled()), this, SLOT(menuCancel()));\r
\r
+ //leave feedback\r
+ if (leaveFeedback)\r
+ connect(_menu, SIGNAL(left()), this, SLOT(pouet()));\r
\r
-TactileMenus::~TactileMenus()\r
+ //create log file\r
+ QString date = QDate::currentDate().toString("yyyy-MM-dd") + "-" + QTime::currentTime().toString("HH-mm-ss");\r
+ QString logfilename = user + "-" + condition + "-" + QString::number(repetitions) + "-" + QString::number(nbItems) + "-" + QString::number(widths) + "-" + QString::number(marginStep) + "-" + date + ".csv";\r
+ _logfile = fopen(logfilename.toStdString().c_str(), "w");\r
+ qDebug() << "log: " << logfilename;\r
+ if (_logfile)\r
+ fprintf(_logfile, "TotalTime,SelectionTime,User,Condition,Block,HFeedback,LFeedback,TFeedback,Width,Item,Selected\n");\r
+\r
+\r
+ //generate the block\r
+ // /!\ currently we only manage 1 direction\r
+ for (int i = 0 ; i < repetitions ; i++)\r
+ {\r
+ QList<QPair<int, int> > temp;\r
+ //generate the block\r
+ for (int j = 1 ; j <= nbItems ; j++)\r
+ for (int k = 0 ; k < widths ; k++)\r
+ temp.push_back(QPair<int, int>(j, k * marginStep));\r
+ //shuffle\r
+ for (int j = 0; j < temp.count(); j++)\r
+ temp.swap(j, (rand() % (temp.count() - j)) + j);\r
+ //add the block to the trial\r
+ _trials.append(temp);\r
+ }\r
+ _progress->setMaximum(_trials.size());\r
+\r
+ _timer.start();\r
+ _timer2.start();\r
+\r
+ runTrial();\r
+}\r
+\r
+void TactileMenus::runTrial()\r
{\r
- if (_tactonPlayer)\r
- delete _tactonPlayer;\r
+ _text->setText(QString::number(_trials.at(_currenttrial).first));\r
+ _menu->setWidth(_trials.at(_currenttrial).second);\r
+ _timer.restart();\r
+ //_timer2.restart();\r
+}\r
+\r
+void TactileMenus::log(int val)\r
+{\r
+ if (_logfile)\r
+ fprintf(_logfile, "%lld,%lld,%s,%s,%d,%d,%d,%d,%d,%d,%d\n",\r
+ _timer.elapsed(),\r
+ _timer2.elapsed(),\r
+ _user.toStdString().c_str(),\r
+ _condition.toStdString().c_str(),\r
+ _currenttrial / _repetitions,\r
+ _hoverFeedback,\r
+ _leaveFeedback,\r
+ _triggerFeedback,\r
+ _trials.at(_currenttrial).second,\r
+ _trials.at(_currenttrial).first,\r
+ val);\r
}\r
\r
void TactileMenus::mousePressEvent(QMouseEvent *evt)\r
{\r
//pouet();\r
- _menu->exec(evt->globalPos());\r
+ if (_currenttrial < _trials.size())\r
+ {\r
+ _menu->exec(evt->globalPos());\r
+ //timer2 is for selection time\r
+ _timer2.restart();\r
+ }\r
+}\r
+\r
+void TactileMenus::menuCancel()\r
+{\r
+ //log outside the menu\r
+ log(-1);\r
+// _timer2.restart();\r
}\r
\r
void TactileMenus::execute(int val)\r
{\r
- if (_tactonPlayer)\r
+ log(val);\r
+\r
+ //feedback?\r
+ if (_triggerFeedback && _tactonPlayer)\r
_tactonPlayer->play(Tacton(0x0f, 15, 250, 255));\r
- _text->setText(QString::number(val));\r
+\r
+ //No progress if it is not the right item\r
+ if (val != _trials.at(_currenttrial).first)\r
+ return;\r
+\r
+ _currenttrial++;\r
+ _progress->setValue(_currenttrial);\r
+\r
+ if (_currenttrial >= _trials.size())\r
+ {\r
+ _text->setText("Finished");\r
+ if (_logfile)\r
+ {\r
+ fclose(_logfile);\r
+ _logfile = NULL;\r
+ }\r
+ return;\r
+ }\r
+\r
+ runTrial();\r
}\r
\r
void TactileMenus::pouet()\r
#include "ui_tactilemenus.h"\r
#include "TMenu.h"\r
#include <QSignalMApper>\r
+#include <QElapsedTimer>\r
\r
#include <TactonPlayer/TactonPlayer.hpp>\r
\r
~TactileMenus();\r
\r
void mousePressEvent(QMouseEvent * event);\r
- //void mouseReleaseEvent(QMouseEvent * event);\r
+ \r
+ void init(QString user, QString condition, \r
+ int nbItems, int repetitions, \r
+ int widths, int marginStep, \r
+ bool hoverFeedback, bool leaveFeedback, bool triggerFeedback);\r
\r
public slots:\r
void execute(int);\r
void pouet();\r
+ void menuCancel();\r
\r
signals:\r
void selected(int);\r
\r
private:\r
+ void runTrial();\r
+ void log(int val);\r
+\r
TMenu *_menu;\r
QSignalMapper *_signalMapper;\r
TactonPlayer *_tactonPlayer;\r
+\r
+ //setup variables\r
+ QString _user;\r
+ QString _condition; \r
+ int _nbItems;\r
+ int _repetitions;\r
+ int _widths;\r
+ int _marginStep; \r
+ bool _hoverFeedback;\r
+ bool _leaveFeedback;\r
+ bool _triggerFeedback;\r
+\r
+ FILE *_logfile;\r
+ QList<QPair<int, int> > _trials;\r
+ int _currenttrial;\r
+ QElapsedTimer _timer, _timer2;\r
};\r
\r
#endif // TACTILEMENUS_H\r
</Link>\r
</ItemDefinitionGroup>\r
<ItemGroup>\r
+ <ClCompile Include="GeneratedFiles\Debug\moc_SetupMenu.cpp">\r
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>\r
+ </ClCompile>\r
<ClCompile Include="GeneratedFiles\Debug\moc_TactileMenus.cpp">\r
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>\r
</ClCompile>\r
+ <ClCompile Include="GeneratedFiles\Debug\moc_TMenu.cpp">\r
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>\r
+ </ClCompile>\r
<ClCompile Include="GeneratedFiles\qrc_tactilemenus.cpp">\r
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">\r
</PrecompiledHeader>\r
<PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">\r
</PrecompiledHeader>\r
</ClCompile>\r
+ <ClCompile Include="GeneratedFiles\Release\moc_SetupMenu.cpp">\r
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>\r
+ </ClCompile>\r
<ClCompile Include="GeneratedFiles\Release\moc_TactileMenus.cpp">\r
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>\r
</ClCompile>\r
+ <ClCompile Include="GeneratedFiles\Release\moc_TMenu.cpp">\r
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>\r
+ </ClCompile>\r
<ClCompile Include="main.cpp" />\r
+ <ClCompile Include="SetupMenu.cpp" />\r
<ClCompile Include="TMenu.cpp" />\r
<ClCompile Include="TactileMenus.cpp" />\r
</ItemGroup>\r
</CustomBuild>\r
</ItemGroup>\r
<ItemGroup>\r
+ <ClInclude Include="GeneratedFiles\ui_SetupMenu.h" />\r
<ClInclude Include="GeneratedFiles\ui_tactilemenus.h" />\r
- <ClInclude Include="TMenu.h" />\r
+ <CustomBuild Include="SetupMenu.h">\r
+ <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>\r
+ <Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing SetupMenu.h...</Message>\r
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>\r
+ <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui"</Command>\r
+ <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>\r
+ <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing SetupMenu.h...</Message>\r
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>\r
+ <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui"</Command>\r
+ </CustomBuild>\r
+ <CustomBuild Include="TMenu.h">\r
+ <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>\r
+ <Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Moc%27ing TMenu.h...</Message>\r
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>\r
+ <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_CORE_LIB -DQT_GUI_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui"</Command>\r
+ <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\moc.exe;%(FullPath)</AdditionalInputs>\r
+ <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Moc%27ing TMenu.h...</Message>\r
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp</Outputs>\r
+ <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">"$(QTDIR)\bin\moc.exe" "%(FullPath)" -o ".\GeneratedFiles\$(ConfigurationName)\moc_%(Filename).cpp" -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_NO_DEBUG -DNDEBUG -DQT_CORE_LIB -DQT_GUI_LIB "-I.\GeneratedFiles" "-I." "-I$(QTDIR)\include" "-I.\GeneratedFiles\$(ConfigurationName)\." "-I$(QTDIR)\include\QtCore" "-I$(QTDIR)\include\QtGui"</Command>\r
+ </CustomBuild>\r
</ItemGroup>\r
<ItemGroup>\r
<CustomBuild Include="tactilemenus.qrc">\r
<Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">"$(QTDIR)\bin\rcc.exe" -name "%(Filename)" -no-compress "%(FullPath)" -o .\GeneratedFiles\qrc_%(Filename).cpp</Command>\r
</CustomBuild>\r
</ItemGroup>\r
+ <ItemGroup>\r
+ <CustomBuild Include="SetupMenu.ui">\r
+ <FileType>Document</FileType>\r
+ <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(QTDIR)\bin\uic.exe;%(AdditionalInputs)</AdditionalInputs>\r
+ <Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Uic%27ing %(Identity)...</Message>\r
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\GeneratedFiles\ui_%(Filename).h;%(Outputs)</Outputs>\r
+ <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">"$(QTDIR)\bin\uic.exe" -o ".\GeneratedFiles\ui_%(Filename).h" "%(FullPath)"</Command>\r
+ <AdditionalInputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(QTDIR)\bin\uic.exe;%(AdditionalInputs)</AdditionalInputs>\r
+ <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Uic%27ing %(Identity)...</Message>\r
+ <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\GeneratedFiles\ui_%(Filename).h;%(Outputs)</Outputs>\r
+ <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">"$(QTDIR)\bin\uic.exe" -o ".\GeneratedFiles\ui_%(Filename).h" "%(FullPath)"</Command>\r
+ </CustomBuild>\r
+ </ItemGroup>\r
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />\r
<ImportGroup Label="ExtensionTargets">\r
</ImportGroup>\r
-#include "TactileMenus.h"\r
+#include "SetupMenu.h"\r
#include <QtGui/QApplication>\r
\r
int main(int argc, char *argv[])\r
{\r
QApplication a(argc, argv);\r
- TactileMenus w;\r
+ SetupMenu w;\r
w.show();\r
return a.exec();\r
}\r
</property>\r
</spacer>\r
</item>\r
+ <item>\r
+ <widget class="QProgressBar" name="_progress">\r
+ <property name="value">\r
+ <number>0</number>\r
+ </property>\r
+ </widget>\r
+ </item>\r
</layout>\r
</widget>\r
</widget>\r