diff --git a/LenaPi/EnergySaver.cpp b/LenaPi/EnergySaver.cpp new file mode 100644 index 0000000..9fa35de --- /dev/null +++ b/LenaPi/EnergySaver.cpp @@ -0,0 +1,60 @@ +#include "EnergySaver.h" + +#include + +EnergySaver::EnergySaver(QObject *parent) : QObject(parent) +{ + +} + +void EnergySaver::init(int interval) +{ + EnergySaver* saver = instance(); + saver->initTimer(interval); + saver->restartTimer(); +} + + +/** + * @brief Implements the singleton pattern. + * @return Instance + * + * If no instance has been created yet, create new instance. + */ +EnergySaver *EnergySaver::instance() +{ + static EnergySaver* inst; + if (inst == nullptr) + { + inst = new EnergySaver(); + } + return inst; +} + +void EnergySaver::restartTimer() +{ + if(mTimer.isActive()){ + mTimer.stop(); + } + mTimer.start(); +} + +/** + * @brief Initialize and connect timer. + * @param interval Timeout interval in millisecond. + */ +void EnergySaver::initTimer(int interval) +{ + connect(&mTimer, &QTimer::timeout, this, &EnergySaver::onTimeout); + mTimer.setInterval(interval); + mTimer.setSingleShot(true); +} + +/** + * @brief Behavior on timeout: shut down RaspberryPi. + * @todo Call shutdown script. + */ +void EnergySaver::onTimeout() +{ + qDebug() << "shutting down."; +} diff --git a/LenaPi/EnergySaver.h b/LenaPi/EnergySaver.h new file mode 100644 index 0000000..171a57d --- /dev/null +++ b/LenaPi/EnergySaver.h @@ -0,0 +1,30 @@ +#ifndef ENERGYSAVER_H +#define ENERGYSAVER_H + +#include +#include + +class EnergySaver : public QObject +{ + Q_OBJECT + +protected: + EnergySaver(QObject *parent = 0); + +public: + static void init(int intervall); + static EnergySaver *instance(); + +public slots: + void restartTimer(); + +private: + void initTimer(int interval); + QTimer mTimer; + +private slots: + void onTimeout(); + +}; + +#endif // ENERGYSAVER_H diff --git a/LenaPi/LenaPi.pro b/LenaPi/LenaPi.pro index 390855c..adf38c6 100644 --- a/LenaPi/LenaPi.pro +++ b/LenaPi/LenaPi.pro @@ -11,7 +11,8 @@ SOURCES += main.cpp \ models/UiStateModel.cpp \ controllers/MusicController.cpp \ models/MusicModel.cpp \ - MouseEventSpy.cpp + MouseEventSpy.cpp \ + EnergySaver.cpp RESOURCES += qml.qrc \ lenapi.qrc @@ -45,6 +46,7 @@ HEADERS += \ models/UiStateModel.h \ controllers/MusicController.h \ models/MusicModel.h \ - MouseEventSpy.h + MouseEventSpy.h \ + EnergySaver.h INCLUDEPATH+=/usr/local/include diff --git a/LenaPi/MouseEventSpy.cpp b/LenaPi/MouseEventSpy.cpp index caa5913..f6ca02a 100644 --- a/LenaPi/MouseEventSpy.cpp +++ b/LenaPi/MouseEventSpy.cpp @@ -3,18 +3,26 @@ #include #include -/** - * @brief Initialize timer. - * @param parent Parent object - */ MouseEventSpy::MouseEventSpy(QObject *parent) : QObject(parent) { - initTimer(10000); - mTimer.start(); } /** - * @brief Implements the singleton pattern + * @brief Create instance if necessary. + * + * If no instance has been created yet, create new instance and install it as event filter + * in QGuiApplication. + * + * @see MouseEventSpy::instance() + */ +void MouseEventSpy::init() +{ + instance(); +} + +/** + * @brief Implements the singleton pattern. + * @return Instance * * If no instance has been created yet, create new instance and install it as event filter * in QGuiApplication. @@ -45,24 +53,7 @@ bool MouseEventSpy::eventFilter(QObject* watched, QEvent* event) { emit mouseEventDetected(); } - - if(mTimer.isActive()){ - mTimer.stop(); - } - mTimer.start(); - - return QObject::eventFilter(watched, event); -} - -/** - * @brief Initialize and connect timer. - * @param interval Timeout interval in millisecond. - */ -void MouseEventSpy::initTimer(int interval) -{ - connect(&mTimer, &QTimer::timeout, this, &MouseEventSpy::onTimeout); - mTimer.setInterval(interval); - mTimer.setSingleShot(true); + return QObject::eventFilter(watched, event); } /** @@ -77,12 +68,3 @@ bool MouseEventSpy::isMouseEvent(QEvent::Type t) || t == QEvent::MouseButtonRelease || t == QEvent::MouseMove); } - -/** - * @brief Behavior on timeout: shut down RaspberryPi. - * @todo Call shutdown script. - */ -void MouseEventSpy::onTimeout() -{ - qDebug() << "shutting down."; -} diff --git a/LenaPi/MouseEventSpy.h b/LenaPi/MouseEventSpy.h index 34e9a3f..6c6db15 100644 --- a/LenaPi/MouseEventSpy.h +++ b/LenaPi/MouseEventSpy.h @@ -2,36 +2,34 @@ #define MOUSEEVENTSPY_H #include -#include #include /** - * Catches all mouse event and starts timer -- basically behaves like a screensaver. -* Based on -* https://stackoverflow.com/questions/46173105/how-can-i-reset-a-timer-every-time-i-receive-a-touch-event-from-a-qml-page -* -* @todo implement timer and behavior on timeout. -*/ + * @brief Catches all mouse event and reports them via signal. + * + * Based on + * https://stackoverflow.com/questions/46173105/how-can-i-reset-a-timer-every-time-i-receive-a-touch-event-from-a-qml-page + */ class MouseEventSpy : public QObject { Q_OBJECT -public: + +protected: explicit MouseEventSpy(QObject *parent = 0); + +signals: + void mouseEventDetected(); + +public: + static void init(); static MouseEventSpy* instance(); protected: bool eventFilter(QObject* watched, QEvent* event); private: - void initTimer(int interval); bool isMouseEvent(QEvent::Type t); - QTimer mTimer; -private slots: - void onTimeout(); - -signals: - void mouseEventDetected(); }; #endif // MOUSEEVENTSPY_H diff --git a/LenaPi/controllers/MusicController.cpp b/LenaPi/controllers/MusicController.cpp index 00ec739..e5c256a 100644 --- a/LenaPi/controllers/MusicController.cpp +++ b/LenaPi/controllers/MusicController.cpp @@ -3,6 +3,7 @@ #include #include #include +#include "EnergySaver.h" MusicController::MusicController(QObject *parent) : QObject(parent) { @@ -24,6 +25,8 @@ MusicController::MusicController(QObject *parent) : QObject(parent) connect(mPlayer, SIGNAL(nextItemSet(VlcMedia*)), mModel, SLOT(onNextMediaSet(VlcMedia*))); connect(mPlayer->mediaPlayer(), &VlcMediaPlayer::lengthChanged, mModel, &MusicModel::onLengthChanged); connect(mPlayer->mediaPlayer(), &VlcMediaPlayer::timeChanged, mModel, &MusicModel::onTimeChanged); + + connect(mPlayer->mediaPlayer(), &VlcMediaPlayer::timeChanged, EnergySaver::instance(), &EnergySaver::restartTimer); } MusicController::~MusicController() diff --git a/LenaPi/main.cpp b/LenaPi/main.cpp index f8ce39a..b05cf46 100644 --- a/LenaPi/main.cpp +++ b/LenaPi/main.cpp @@ -2,6 +2,7 @@ #include #include "controllers/NavigationController.h" #include "MouseEventSpy.h" +#include "EnergySaver.h" int main(int argc, char *argv[]) { @@ -29,8 +30,11 @@ int main(int argc, char *argv[]) navController.setContext(engine.rootContext()); navController.init("/home/ar/source/lenaMusic/"); - // install MouseEventSpy used for auto shut down of RaspberryPi if not used for a predefined time. - MouseEventSpy::instance(); + // install MouseEventSpy and energy saver used for auto + // shut down of RaspberryPi if not used for a predefined time. + MouseEventSpy::init(); + EnergySaver::init(10000); + QObject::connect(MouseEventSpy::instance(), &MouseEventSpy::mouseEventDetected, EnergySaver::instance(), &EnergySaver::restartTimer); engine.load(QUrl("qrc:/main.qml"));