Basic implementation of Tactile DM
authorThomas Pietrzak <thomas.pietrzak@gmail.com>
Wed, 27 Apr 2022 21:22:57 +0000 (23:22 +0200)
committerThomas Pietrzak <thomas.pietrzak@gmail.com>
Wed, 27 Apr 2022 21:22:57 +0000 (23:22 +0200)
TactonDebug/AngleTester/CMakeLists.txt
TactonDebug/AngleTester/DMTactileDisplay.cpp [new file with mode: 0644]
TactonDebug/AngleTester/DMTactileDisplay.h [new file with mode: 0644]
TactonDebug/AngleTester/angletester.h
TactonDebug/AngleTester/angletester.ui [deleted file]
TactonDebug/AngleTester/main.cpp

index 81a8fbd216d6cc5adb116bc05c83f97d29d82e9e..02e29bdf4dfef9b9c6599bdab38b3b738a3534d6 100644 (file)
@@ -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 (file)
index 0000000..6a35635
--- /dev/null
@@ -0,0 +1,86 @@
+#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);
+}
diff --git a/TactonDebug/AngleTester/DMTactileDisplay.h b/TactonDebug/AngleTester/DMTactileDisplay.h
new file mode 100644 (file)
index 0000000..0392775
--- /dev/null
@@ -0,0 +1,52 @@
+#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;
+};
index c0ba7146f5c220bb38eeae651b6e6ebf056ed44a..ba2c4360a16757a4a5a02b4e456a862806733875 100644 (file)
@@ -1,24 +1,34 @@
 #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
diff --git a/TactonDebug/AngleTester/angletester.ui b/TactonDebug/AngleTester/angletester.ui
deleted file mode 100644 (file)
index 8448e58..0000000
+++ /dev/null
@@ -1,86 +0,0 @@
-<?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
index 8c1597fdae0793d1b54c224b87f2491ffa5177e8..0120985dbf6f1a40cf2e8e9b7bac6dd0b97b3e92 100644 (file)
@@ -1,4 +1,4 @@
-#include "angletester.h"\r
+#include "AngleTester.h"\r
 #include <QApplication>\r
 \r
 int main(int argc, char *argv[])\r