added EnergySaver intended to handle shutdown.

Moved timer from MouseEventSpy to EnergySaver.
Connected MouseEventSpy and MusicController to EnergySaver.
This commit is contained in:
Anika Raemer 2019-04-04 12:21:41 +02:00
parent ce8ea8f582
commit 8a8abd6c76
7 changed files with 132 additions and 53 deletions

60
LenaPi/EnergySaver.cpp Normal file
View file

@ -0,0 +1,60 @@
#include "EnergySaver.h"
#include <QDebug>
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.";
}

30
LenaPi/EnergySaver.h Normal file
View file

@ -0,0 +1,30 @@
#ifndef ENERGYSAVER_H
#define ENERGYSAVER_H
#include <QObject>
#include <QTimer>
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

View file

@ -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

View file

@ -3,18 +3,26 @@
#include <QGuiApplication>
#include <QDebug>
/**
* @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,26 +53,9 @@ 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);
}
/**
* @brief Checks whether the event type is a mouse event.
* @param t Event type
@ -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.";
}

View file

@ -2,36 +2,34 @@
#define MOUSEEVENTSPY_H
#include <QObject>
#include <QTimer>
#include <QEvent>
/**
* 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

View file

@ -3,6 +3,7 @@
#include <QDebug>
#include <models/MusicModel.h>
#include <VLCQtCore/MediaPlayer.h>
#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()

View file

@ -2,6 +2,7 @@
#include <QQmlApplicationEngine>
#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"));