lena_pi/LenaPi/EnergySaver.cpp
2023-11-12 15:47:16 +01:00

147 lines
3.3 KiB
C++

#include "EnergySaver.h"
#include <QDebug>
#include <QFileInfo>
#include <QProcess>
#include <iostream>
EnergySaver::~EnergySaver()
{
#ifdef ANDROID
releaseAndroidLock();
#endif
}
void EnergySaver::init()
{
auto saver = instance();
saver->mIsAutoShutDownEnabled = false;
#ifdef ANDROID
saver->initAdroidLocks();
#endif
}
void EnergySaver::init(int interval, const QString &shutdownScript)
{
auto saver = instance();
saver->mIsAutoShutDownEnabled = true;
QFileInfo script(shutdownScript);
if(script.exists()){
saver->setShutdownScript(shutdownScript);
saver->initTimer(interval*1000);
saver->restartTimer();
}
#ifdef ANDROID
saver->initAdroidLocks();
#endif
}
EnergySaver *EnergySaver::instance()
{
static EnergySaver* inst;
if (!inst)
{
inst = new EnergySaver();
}
return inst;
}
void EnergySaver::deactivate()
{
mIsActive = false;
mTimer.stop();
setAndroidLock();
}
void EnergySaver::activate()
{
mIsActive = true;
restartTimer();
releaseAndroidLock();
}
void EnergySaver::restartTimer()
{
// Energy saver is currently deactivated -> Do NOT start timer
if(!mIsActive) return;
if(mTimer.isActive()){
mTimer.stop();
}
mTimer.start();
}
void EnergySaver::initTimer(int interval)
{
connect(&mTimer, &QTimer::timeout, this, &EnergySaver::onTimeout);
mTimer.setInterval(interval);
mTimer.setSingleShot(true);
}
void EnergySaver::setShutdownScript(const QString &shutdownScript)
{
mShutdownScript = shutdownScript;
}
void EnergySaver::initAdroidLocks()
{
#ifdef ANDROID
QAndroidJniObject activity = QAndroidJniObject::callStaticObjectMethod("org/qtproject/qt5/android/QtNative", "activity", "()Landroid/app/Activity;");
if ( activity.isValid() )
{
QAndroidJniObject serviceName = QAndroidJniObject::getStaticObjectField<jstring>("android/content/Context","POWER_SERVICE");
if ( serviceName.isValid() )
{
QAndroidJniObject powerMgr = activity.callObjectMethod("getSystemService", "(Ljava/lang/String;)Ljava/lang/Object;",serviceName.object<jobject>());
if ( powerMgr.isValid() )
{
jint levelAndFlags = QAndroidJniObject::getStaticField<jint>("android/os/PowerManager","PARTIAL_WAKE_LOCK");
QAndroidJniObject tag = QAndroidJniObject::fromString( "My Tag" );
m_wakeLock = powerMgr.callObjectMethod("newWakeLock", "(ILjava/lang/String;)Landroid/os/PowerManager$WakeLock;", levelAndFlags,tag.object<jstring>());
}
}
}
#endif
}
void EnergySaver::setAndroidLock()
{
#ifdef ANDROID
if ( m_wakeLock.isValid() )
{
m_wakeLock.callMethod<void>("acquire", "()V");
qDebug() << "Locked device, can't go to standby anymore";
}
else
{
assert( false );
}
#endif
}
void EnergySaver::releaseAndroidLock()
{
#ifdef ANDROID
if ( m_wakeLock.isValid() )
{
m_wakeLock.callMethod<void>("release", "()V");
qDebug() << "Unlocked device, can now go to standby";
}
#endif
}
void EnergySaver::onTimeout()
{
if(!mIsAutoShutDownEnabled) return;
std::cout << "Shutting down.";
#ifndef _DEBUG
QProcess p;
p.start(mShutdownScript);
p.waitForFinished();
#endif
}