find_package(Qt6 REQUIRED COMPONENTS Widgets)
-add_executable(AngleTester main.cpp angletester.cpp)
+add_executable(AngleTester main.cpp AngleTester.cpp DMTactileDisplay.cpp)
target_link_libraries(AngleTester PRIVATE TactonPlayer Qt6::Core Qt6::Gui Qt6::Widgets)
--- /dev/null
+#include "DMTactileDisplay.h"
+
+#include <cmath>
+#include <algorithm>
+using namespace std;
+
+#include <QPainter>
+#include <QPoint>
+
+
+Target::Target(int start, int end)
+:_start(start), _end(end)
+{
+}
+
+Target::Target(const Target & t)
+:Target(t._start, t._end)
+{
+}
+
+Target& Target::operator =(const Target& t)
+{
+ _start = t._start;
+ _end = t._end;
+ return *this;
+}
+
+DMTactileDisplay::DMTactileDisplay(QWidget *parent)
+: QDial(parent), _timer(this)
+{
+ _timer.setSingleShot(true);
+
+ connect(this, SIGNAL(valueChanged(int)), this, SLOT(updateAngle(int)));
+ connect(&_timer, SIGNAL(timeout()), this, SLOT(released()));
+}
+
+void DMTactileDisplay::updateAngle(int value)
+{
+ _timer.start(500);
+ bool onatarget = false;
+ for (QList<Target>::const_iterator i = _targets.begin() ; i != _targets.end() ; i++)
+ {
+ if (value >= i->getStart() && value <= i->getEnd())
+ {
+ onatarget = true;
+ break;
+ }
+ }
+ if (onatarget)
+ emit updateAll(value, OnTarget);
+ else
+ emit updateAll(value, OnBackground);
+}
+
+void DMTactileDisplay::released()
+{
+ emit stop();
+}
+
+void DMTactileDisplay::paintEvent(QPaintEvent *e)
+{
+ int margin = 10;
+ int thickness = 10;
+ int rhandle = 10;
+
+ int r = (min(size().width(), size().height()) - margin - thickness) / 2;
+ QPoint c(size().width() / 2, size().height() / 2);
+ int angle = value() + 90;
+
+ QPainter p(this);
+ p.setRenderHint(QPainter::Antialiasing);
+
+ //Display
+ p.setPen(QPen(QColor(200,200,200), thickness));
+ p.drawEllipse(c, r, r);
+
+ //Targets
+ p.setPen(QPen(QColor(43,153,255), thickness));
+ for (QList<Target>::const_iterator i = _targets.begin() ; i != _targets.end() ; i++)
+ p.drawArc(c.x() - r, c.y() - r, 2 * r, 2 * r, 16 * (- i->getStart() - 90), -16 * (i->getEnd() - i->getStart()));
+
+ // Pointer
+ p.setPen(Qt::NoPen);
+ p.setBrush(QColor(250,43,38));
+ p.drawEllipse(c + r * QPointF(cos(angle * M_PI / 180.0), sin(angle * M_PI / 180.0)), rhandle, rhandle);
+}
--- /dev/null
+#pragma once
+
+#include <QDial>
+#include <QTimer>
+#include <QList>
+//#include "ui_DMTactileDisplayClass.h"
+
+class Target: QObject
+{
+ Q_OBJECT
+
+ public:
+ Target(int start, int end);
+ Target(const Target & t);
+ ~Target() {}
+
+ Target& operator =(const Target& t);
+
+ inline int getStart() const { return _start; }
+ inline int getEnd() const { return _end; }
+ inline void move(int delta) { _start += delta; _end += delta; }
+
+ private:
+ int _start, _end;
+};
+
+class DMTactileDisplay : public QDial//, Ui::DMTactileDisplayClass
+{
+ Q_OBJECT
+
+ public:
+ DMTactileDisplay(QWidget *parent = 0);
+ ~DMTactileDisplay() {}
+
+ inline void addTarget(const Target &target) { _targets.append(target); }
+
+ void paintEvent(QPaintEvent *);
+
+ enum Hover {OnBackground, OnTarget};
+
+ public slots:
+ void updateAngle(int value);
+ void released();
+
+ signals:
+ void updateAll(int angle, DMTactileDisplay::Hover h);
+ void stop();
+
+ private:
+ QList<Target> _targets;
+ QTimer _timer;
+};
#pragma once\r
\r
#include <QMainWindow>\r
-#include "ui_angletester.h"\r
+#include <QSpinBox>\r
+#include <QPushButton>\r
+#include <QDial>\r
+//#include "ui_angletester.h"\r
\r
#include <TactonPlayer.hpp>\r
\r
-class AngleTester : public QMainWindow, Ui::AngleTesterClass\r
+#include "DMTactileDisplay.h"\r
+\r
+class AngleTester : public QMainWindow//, Ui::AngleTesterClass\r
{\r
- Q_OBJECT\r
+ Q_OBJECT\r
+\r
+ public:\r
+ AngleTester(QWidget *parent = 0, Qt::WindowFlags flags = Qt::Widget);\r
+ ~AngleTester();\r
\r
- public:\r
- AngleTester(QWidget *parent = 0, Qt::WindowFlags flags = Qt::Widget);\r
- ~AngleTester();\r
+ public slots:\r
+ void play(bool);\r
+ void stop(bool=false);\r
+ void setFrequency(int frequency);\r
+ void setOutput(int angle, DMTactileDisplay::Hover hover);\r
\r
- public slots:\r
- void play(bool);\r
- void stop(bool);\r
- void setFrequency(int frequency);\r
- void setAngle(int angle);\r
+ private:\r
+ DMTactileDisplay *_angle;\r
+ QSpinBox *_frequency, *_tfrequency;\r
+ QPushButton *_play, *_stop;\r
+ int _tfreq, _bfreq;\r
\r
- private:\r
- TactonPlayer *_tactonPlayer;\r
+ TactonPlayer *_tactonPlayer;\r
};\r
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>\r
-<ui version="4.0">\r
- <class>AngleTesterClass</class>\r
- <widget class="QMainWindow" name="AngleTesterClass">\r
- <property name="geometry">\r
- <rect>\r
- <x>0</x>\r
- <y>0</y>\r
- <width>176</width>\r
- <height>176</height>\r
- </rect>\r
- </property>\r
- <property name="windowTitle">\r
- <string>AngleTester</string>\r
- </property>\r
- <widget class="QWidget" name="centralWidget">\r
- <layout class="QVBoxLayout" name="verticalLayout">\r
- <item>\r
- <widget class="QDial" name="_angle">\r
- <property name="maximum">\r
- <number>359</number>\r
- </property>\r
- <property name="tracking">\r
- <bool>true</bool>\r
- </property>\r
- <property name="invertedAppearance">\r
- <bool>false</bool>\r
- </property>\r
- <property name="invertedControls">\r
- <bool>false</bool>\r
- </property>\r
- <property name="wrapping">\r
- <bool>true</bool>\r
- </property>\r
- <property name="notchTarget">\r
- <double>30.000000000000000</double>\r
- </property>\r
- <property name="notchesVisible">\r
- <bool>true</bool>\r
- </property>\r
- </widget>\r
- </item>\r
- <item>\r
- <layout class="QFormLayout" name="formLayout">\r
- <item row="0" column="0">\r
- <widget class="QLabel" name="frequencyLabel">\r
- <property name="text">\r
- <string>Frequency</string>\r
- </property>\r
- </widget>\r
- </item>\r
- <item row="0" column="1">\r
- <widget class="QSpinBox" name="_frequency">\r
- <property name="maximum">\r
- <number>500</number>\r
- </property>\r
- <property name="value">\r
- <number>300</number>\r
- </property>\r
- </widget>\r
- </item>\r
- <item row="1" column="1">\r
- <widget class="QPushButton" name="_play">\r
- <property name="text">\r
- <string>Play</string>\r
- </property>\r
- </widget>\r
- </item>\r
- <item row="1" column="0">\r
- <widget class="QPushButton" name="_stop">\r
- <property name="text">\r
- <string>Stop</string>\r
- </property>\r
- </widget>\r
- </item>\r
- </layout>\r
- </item>\r
- </layout>\r
- </widget>\r
- </widget>\r
- <layoutdefault spacing="6" margin="11"/>\r
- <resources>\r
- <include location="angletester.qrc"/>\r
- </resources>\r
- <connections/>\r
-</ui>\r
-#include "angletester.h"\r
+#include "AngleTester.h"\r
#include <QApplication>\r
\r
int main(int argc, char *argv[])\r