From 168c399196db9aa43e3ff827d8d7e979ee1783b9 Mon Sep 17 00:00:00 2001 From: Thomas Pietrzak Date: Wed, 27 Apr 2022 23:22:57 +0200 Subject: [PATCH] Basic implementation of Tactile DM --- TactonDebug/AngleTester/CMakeLists.txt | 2 +- TactonDebug/AngleTester/DMTactileDisplay.cpp | 86 ++++++++++++++++++++ TactonDebug/AngleTester/DMTactileDisplay.h | 52 ++++++++++++ TactonDebug/AngleTester/angletester.h | 36 +++++--- TactonDebug/AngleTester/angletester.ui | 86 -------------------- TactonDebug/AngleTester/main.cpp | 2 +- 6 files changed, 163 insertions(+), 101 deletions(-) create mode 100644 TactonDebug/AngleTester/DMTactileDisplay.cpp create mode 100644 TactonDebug/AngleTester/DMTactileDisplay.h delete mode 100644 TactonDebug/AngleTester/angletester.ui diff --git a/TactonDebug/AngleTester/CMakeLists.txt b/TactonDebug/AngleTester/CMakeLists.txt index 81a8fbd..02e29bd 100644 --- a/TactonDebug/AngleTester/CMakeLists.txt +++ b/TactonDebug/AngleTester/CMakeLists.txt @@ -8,6 +8,6 @@ endif() 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) diff --git a/TactonDebug/AngleTester/DMTactileDisplay.cpp b/TactonDebug/AngleTester/DMTactileDisplay.cpp new file mode 100644 index 0000000..6a35635 --- /dev/null +++ b/TactonDebug/AngleTester/DMTactileDisplay.cpp @@ -0,0 +1,86 @@ +#include "DMTactileDisplay.h" + +#include +#include +using namespace std; + +#include +#include + + +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::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::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); +} diff --git a/TactonDebug/AngleTester/DMTactileDisplay.h b/TactonDebug/AngleTester/DMTactileDisplay.h new file mode 100644 index 0000000..0392775 --- /dev/null +++ b/TactonDebug/AngleTester/DMTactileDisplay.h @@ -0,0 +1,52 @@ +#pragma once + +#include +#include +#include +//#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 _targets; + QTimer _timer; +}; diff --git a/TactonDebug/AngleTester/angletester.h b/TactonDebug/AngleTester/angletester.h index c0ba714..ba2c436 100644 --- a/TactonDebug/AngleTester/angletester.h +++ b/TactonDebug/AngleTester/angletester.h @@ -1,24 +1,34 @@ #pragma once #include -#include "ui_angletester.h" +#include +#include +#include +//#include "ui_angletester.h" #include -class AngleTester : public QMainWindow, Ui::AngleTesterClass +#include "DMTactileDisplay.h" + +class AngleTester : public QMainWindow//, Ui::AngleTesterClass { - Q_OBJECT + Q_OBJECT + + public: + AngleTester(QWidget *parent = 0, Qt::WindowFlags flags = Qt::Widget); + ~AngleTester(); - public: - AngleTester(QWidget *parent = 0, Qt::WindowFlags flags = Qt::Widget); - ~AngleTester(); + public slots: + void play(bool); + void stop(bool=false); + void setFrequency(int frequency); + void setOutput(int angle, DMTactileDisplay::Hover hover); - public slots: - void play(bool); - void stop(bool); - void setFrequency(int frequency); - void setAngle(int angle); + private: + DMTactileDisplay *_angle; + QSpinBox *_frequency, *_tfrequency; + QPushButton *_play, *_stop; + int _tfreq, _bfreq; - private: - TactonPlayer *_tactonPlayer; + TactonPlayer *_tactonPlayer; }; diff --git a/TactonDebug/AngleTester/angletester.ui b/TactonDebug/AngleTester/angletester.ui deleted file mode 100644 index 8448e58..0000000 --- a/TactonDebug/AngleTester/angletester.ui +++ /dev/null @@ -1,86 +0,0 @@ - - - AngleTesterClass - - - - 0 - 0 - 176 - 176 - - - - AngleTester - - - - - - - 359 - - - true - - - false - - - false - - - true - - - 30.000000000000000 - - - true - - - - - - - - - Frequency - - - - - - - 500 - - - 300 - - - - - - - Play - - - - - - - Stop - - - - - - - - - - - - - - diff --git a/TactonDebug/AngleTester/main.cpp b/TactonDebug/AngleTester/main.cpp index 8c1597f..0120985 100644 --- a/TactonDebug/AngleTester/main.cpp +++ b/TactonDebug/AngleTester/main.cpp @@ -1,4 +1,4 @@ -#include "angletester.h" +#include "AngleTester.h" #include int main(int argc, char *argv[]) -- 2.30.2