diff --git a/LenaPi/EnergySaver.cpp b/LenaPi/EnergySaver.cpp index d5a508b..556dcbc 100644 --- a/LenaPi/EnergySaver.cpp +++ b/LenaPi/EnergySaver.cpp @@ -1,14 +1,19 @@ #include "EnergySaver.h" #include +#include #include #include -void EnergySaver::init(int interval) +void EnergySaver::init(int interval, const QString &shutdownScript) { - EnergySaver* saver = instance(); - saver->initTimer(interval*1000); - saver->restartTimer(); + QFileInfo script(shutdownScript); + if(script.exists()){ + auto saver = instance(); + saver->setShutdownScript(shutdownScript); + saver->initTimer(interval*1000); + saver->restartTimer(); + } } @@ -39,13 +44,18 @@ void EnergySaver::initTimer(int interval) mTimer.setSingleShot(true); } +void EnergySaver::setShutdownScript(const QString &shutdownScript) +{ + mShutdownScript = shutdownScript; +} + void EnergySaver::onTimeout() { std::cout << "Shutting down."; #ifndef _DEBUG QProcess p; - p.start("/usr/local/sbin/do_shutdown.sh"); + p.start(mShutdownScript); p.waitForFinished(); #endif } diff --git a/LenaPi/EnergySaver.h b/LenaPi/EnergySaver.h index 9d05521..3e14fe4 100644 --- a/LenaPi/EnergySaver.h +++ b/LenaPi/EnergySaver.h @@ -20,18 +20,22 @@ class EnergySaver : public QObject Q_OBJECT protected: - explicit EnergySaver(QObject *parent = nullptr) : QObject(parent) {}; + explicit EnergySaver(QObject *parent = nullptr) : QObject(parent) {} public: /** - * @brief Create instance if necessary and set timeout interval. + * @brief Create instance if necessary, configure it and start timer. * @param interval Timer interval in seconds + * @param shutdownScript Path to shutdown script file * @see EnergySaver::instance + * + * Instance is initialized with timeout interval and shutdown script + * and started if the provided script exists. */ - static void init(int interval); + static void init(int interval, const QString& shutdownScript); /** * @brief Implements the singleton pattern. - * @return Instance + * @return Instance of EnergySaver * * If no instance has been created yet, create new instance. */ @@ -49,7 +53,9 @@ private: * @param interval Timeout interval in millisecond. */ void initTimer(int interval); + void setShutdownScript(const QString& shutdownScript); QTimer mTimer; + QString mShutdownScript; private slots: /** diff --git a/LenaPi/LenaPi.pro.user b/LenaPi/LenaPi.pro.user index a4007fe..e56d4b5 100644 --- a/LenaPi/LenaPi.pro.user +++ b/LenaPi/LenaPi.pro.user @@ -1,6 +1,6 @@ - + EnvironmentId @@ -294,8 +294,8 @@ 2 LenaPi - - Qt4ProjectManager.Qt4RunConfiguration:/home/araemer/source/LenaPi/LenaPi/LenaPi.pro + LenaPi2 + Qt4ProjectManager.Qt4RunConfiguration:/home/ar/source/LenaPi/LenaPi/LenaPi.pro LenaPi.pro 3768 diff --git a/LenaPi/main.cpp b/LenaPi/main.cpp index 9518e51..6394660 100644 --- a/LenaPi/main.cpp +++ b/LenaPi/main.cpp @@ -1,39 +1,46 @@ #include #include +#include #include "controllers/NavigationController.h" #include "MouseEventSpy.h" #include "EnergySaver.h" int main(int argc, char *argv[]) { - /** + /* * @todo Add command line parser to specify a custom config file * https://doc.qt.io/qt-5/qcommandlineparser.html - * Add config handling https://doc.qt.io/qt-5/qsettings.html#QSettings-4 - * - set root path - * ui mode -> pass to NavigationController and store in UiStateModel - * - set mode - * -- RasPi -> no volumeControl or exit Button - * -- Desktop -> volumeControl and exit Button - * -- in future probably also MobileApp - * Energy saving options -> hand over to energy saver on initialization - * - enable energy saving - * - set energy saver timeout - * - set shutdown script path */ QGuiApplication app(argc, argv); QQmlApplicationEngine engine; + /* Read Settings */ + QSettings settings("me", "LenaPi"); + const auto rootPath = settings.value("rootPath", "/home/ar/source/lenaMusic/").toString(); // path to music files + const auto profile = settings.value("profile", "RasPiTouch").toString(); // known modes are "RasPiTouch" and "Desktop" + const auto isEnergySavingEnabled = settings.value("enableEnergySaver", true).toBool(); // enable/disable energy saver + const auto energySaverTimeout = settings.value("timeout", 60).toInt(); //timeout in seconds + const auto shutdownScript = settings.value("shutdownScript", "/usr/local/sbin/do_shutdown.sh").toString(); + + /* @todo Hand over profile to UiStateModel via NavigationController + * Add properties to UiStateModel for showing volume controls and close button. + * Set those properties according to profile and use them to hide/show elements in qml + */ NavigationController navController; navController.setContext(engine.rootContext()); - navController.init("/home/ar/source/lenaMusic/"); + navController.init(rootPath); - // install MouseEventSpy and energy saver used for auto - // shut down of RaspberryPi if not used for a predefined time. - MouseEventSpy::init(); - EnergySaver::init(10); - QObject::connect(MouseEventSpy::instance(), &MouseEventSpy::mouseEventDetected, - EnergySaver::instance(), &EnergySaver::restartTimer); + if(isEnergySavingEnabled){ + /* install MouseEventSpy and energy saver used for auto shut down of device + * if not used for a predefined time. + */ + MouseEventSpy::init(); + EnergySaver::init(energySaverTimeout, shutdownScript); + QObject::connect(MouseEventSpy::instance(), &MouseEventSpy::mouseEventDetected, + EnergySaver::instance(), &EnergySaver::restartTimer); + } + + // load GUI engine.load(QUrl("qrc:/main.qml")); diff --git a/LenaPi/models/UiStateModel.h b/LenaPi/models/UiStateModel.h index 0617e32..0c7fd91 100644 --- a/LenaPi/models/UiStateModel.h +++ b/LenaPi/models/UiStateModel.h @@ -20,6 +20,23 @@ signals: void sourceChanged(); public: + /** + * @brief Provides the possibility to configure UI according to profile. + */ + enum EProfile : uint{ + /** + * @brief Profile designed for running LenaPi as window manager on Raspberry Pi Touch + * + * Start fullscreen and do NOT show close button or volume controls + */ + Profile_RasPiTouch = 0, + /** + * @brief Profiled designed for running LenaPi as a desktop app. + * + * Start fullscreen, show close button and volume controls. + */ + Profile_Desktop + }; explicit UiStateModel(QObject *parent = nullptr); QUrl getSource() const;