From 1b57e415be4788ae5aaa6f3a037055fd874997d4 Mon Sep 17 00:00:00 2001 From: Raphael Coeffic Date: Mon, 13 Sep 2021 11:10:32 +0200 Subject: [PATCH] Add touch support to simulation --- .../src/simulation/simulateduiwidget.cpp | 1 + companion/src/simulation/simulatorinterface.h | 1 + companion/src/simulation/widgets/lcdwidget.h | 26 ++++++++++- radio/src/targets/simu/opentxsimulator.cpp | 45 +++++++++++++++++++ radio/src/targets/simu/opentxsimulator.h | 7 +++ 5 files changed, 79 insertions(+), 1 deletion(-) diff --git a/companion/src/simulation/simulateduiwidget.cpp b/companion/src/simulation/simulateduiwidget.cpp index c3db6f4ef..a2c257a19 100644 --- a/companion/src/simulation/simulateduiwidget.cpp +++ b/companion/src/simulation/simulateduiwidget.cpp @@ -197,6 +197,7 @@ void SimulatedUIWidget::setLcd(LcdWidget * lcd) m_backLight = 0; m_lcd->setBackgroundColor(m_backlightColors.at(m_backLight)); + connect(m_lcd, &LcdWidget::touchEvent, m_simulator, &SimulatorInterface::touchEvent); } void SimulatedUIWidget::connectScrollActions() diff --git a/companion/src/simulation/simulatorinterface.h b/companion/src/simulation/simulatorinterface.h index 9c641dccd..25adc9c6b 100644 --- a/companion/src/simulation/simulatorinterface.h +++ b/companion/src/simulation/simulatorinterface.h @@ -144,6 +144,7 @@ class SimulatorInterface : public QObject virtual void setTrainerInput(unsigned int inputNumber, int16_t value) = 0; virtual void setInputValue(int type, uint8_t index, int16_t value) = 0; virtual void rotaryEncoderEvent(int steps) = 0; + virtual void touchEvent(int type, int x, int y) = 0; virtual void setTrainerTimeout(uint16_t ms) = 0; virtual void sendTelemetry(const QByteArray data) = 0; virtual void setLuaStateReloadPermanentScripts() = 0; diff --git a/companion/src/simulation/widgets/lcdwidget.h b/companion/src/simulation/widgets/lcdwidget.h index 879ce3236..35f88cf27 100644 --- a/companion/src/simulation/widgets/lcdwidget.h +++ b/companion/src/simulation/widgets/lcdwidget.h @@ -29,6 +29,7 @@ #include #include #include +#include #include "appdata.h" #include "appdebugmessagehandler.h" @@ -41,6 +42,12 @@ class LcdWidget : public QWidget public: + enum TouchEvent { + TouchUp=0, + TouchDown, + TouchSlide + }; + LcdWidget(QWidget * parent = 0): QWidget(parent), lcdBuf(NULL), @@ -117,6 +124,9 @@ class LcdWidget : public QWidget } } + signals: + void touchEvent(int type, int x, int y); + protected: int lcdWidth; @@ -213,12 +223,26 @@ class LcdWidget : public QWidget } - void paintEvent(QPaintEvent*) + void paintEvent(QPaintEvent*) override { QPainter p(this); doPaint(p); } + void mouseMoveEvent(QMouseEvent *event) override + { + emit touchEvent(TouchSlide, event->pos().x(), event->pos().y()); + } + + void mousePressEvent(QMouseEvent *event) override + { + emit touchEvent(TouchDown, event->pos().x(), event->pos().y()); + } + + void mouseReleaseEvent(QMouseEvent *event) override + { + emit touchEvent(TouchUp, event->pos().x(), event->pos().y()); + } }; #endif // _LCDWIDGET_H_ diff --git a/radio/src/targets/simu/opentxsimulator.cpp b/radio/src/targets/simu/opentxsimulator.cpp index 49f58d380..a2cedccb2 100644 --- a/radio/src/targets/simu/opentxsimulator.cpp +++ b/radio/src/targets/simu/opentxsimulator.cpp @@ -299,6 +299,51 @@ void OpenTxSimulator::rotaryEncoderEvent(int steps) #endif // defined(ROTARY_ENCODER_NAVIGATION) } +void OpenTxSimulator::touchEvent(int type, int x, int y) +{ + switch (type) { + case TouchDown: + TRACE_WINDOWS("[Mouse Press] %d %d", x, y); + +#if defined(HARDWARE_TOUCH) + touchState.event = TE_DOWN; + touchState.startX = touchState.x = x; + touchState.startY = touchState.y = y; +#endif + break; + + case TouchUp: + TRACE_WINDOWS("[Mouse Release] %d %d", x, y); + +#if defined(HARDWARE_TOUCH) + if (touchState.event == TE_DOWN) { + touchState.event = TE_UP; + touchState.x = touchState.startX; + touchState.y = touchState.startY; + } else { + touchState.event = TE_SLIDE_END; + } +#endif + break; + + case TouchSlide: + TRACE_WINDOWS("[Mouse Move] %d %d", x, y); + +#if defined(HARDWARE_TOUCH) + touchState.deltaX += x - touchState.x; + touchState.deltaY += y - touchState.y; + if (touchState.event == TE_SLIDE || + abs(touchState.deltaX) >= SLIDE_RANGE || + abs(touchState.deltaY) >= SLIDE_RANGE) { + touchState.event = TE_SLIDE; + touchState.x = x; + touchState.y = y; + } +#endif + break; + } +} + void OpenTxSimulator::setTrainerTimeout(uint16_t ms) { ppmInputValidityTimer = ms; diff --git a/radio/src/targets/simu/opentxsimulator.h b/radio/src/targets/simu/opentxsimulator.h index 7369a56c3..94c4a97a4 100644 --- a/radio/src/targets/simu/opentxsimulator.h +++ b/radio/src/targets/simu/opentxsimulator.h @@ -35,6 +35,12 @@ class DLLEXPORT OpenTxSimulator : public SimulatorInterface public: + enum TouchEvent { + TouchUp=0, + TouchDown, + TouchSlide + }; + OpenTxSimulator(); virtual ~OpenTxSimulator(); @@ -64,6 +70,7 @@ class DLLEXPORT OpenTxSimulator : public SimulatorInterface virtual void setTrainerInput(unsigned int inputNumber, int16_t value); virtual void setInputValue(int type, uint8_t index, int16_t value); virtual void rotaryEncoderEvent(int steps); + virtual void touchEvent(int type, int x, int y); virtual void setTrainerTimeout(uint16_t ms); virtual void sendTelemetry(const QByteArray data); virtual void setLuaStateReloadPermanentScripts();