2011-10-23 07:56:01 +03:00
|
|
|
#include "powersaver.h"
|
|
|
|
#include "debug.h"
|
|
|
|
|
2011-06-02 06:04:35 +03:00
|
|
|
#include <errno.h>
|
|
|
|
#include <fcntl.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <unistd.h>
|
|
|
|
|
2011-10-23 07:56:01 +03:00
|
|
|
PowerSaver *PowerSaver::instance = NULL;
|
|
|
|
|
2012-02-03 00:36:26 +02:00
|
|
|
Uint32 screenTimerCallback(Uint32 timeout, void *d) {
|
|
|
|
unsigned int * old_ticks = (unsigned int *) d;
|
|
|
|
unsigned int new_ticks = SDL_GetTicks();
|
|
|
|
|
|
|
|
if (new_ticks > *old_ticks + timeout + 1000) {
|
|
|
|
DEBUG("Suspend occured, restarting timer\n");
|
|
|
|
*old_ticks = new_ticks;
|
|
|
|
return timeout;
|
|
|
|
}
|
|
|
|
|
2011-10-23 07:56:01 +03:00
|
|
|
DEBUG("Disable Backlight Event\n");
|
|
|
|
PowerSaver::getInstance()->disableScreen();
|
|
|
|
return 0;
|
2011-06-02 06:04:35 +03:00
|
|
|
}
|
|
|
|
|
2011-10-23 07:56:01 +03:00
|
|
|
PowerSaver *PowerSaver::getInstance() {
|
|
|
|
if (instance == NULL) {
|
|
|
|
instance = new PowerSaver();
|
|
|
|
}
|
|
|
|
return instance;
|
2011-06-02 06:04:35 +03:00
|
|
|
}
|
|
|
|
|
2011-08-17 01:44:45 +03:00
|
|
|
bool PowerSaver::isRunning() {
|
|
|
|
return instance != NULL;
|
|
|
|
}
|
|
|
|
|
2011-10-23 07:56:01 +03:00
|
|
|
PowerSaver::PowerSaver() {
|
|
|
|
setScreenTimeout(0);
|
|
|
|
screenTimer = NULL;
|
2011-06-02 06:04:35 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
PowerSaver::~PowerSaver() {
|
2011-08-16 03:17:21 +03:00
|
|
|
SDL_RemoveTimer(screenTimer);
|
2011-08-17 01:44:45 +03:00
|
|
|
instance = NULL;
|
2011-06-02 06:04:35 +03:00
|
|
|
}
|
|
|
|
|
2011-10-23 07:56:01 +03:00
|
|
|
void PowerSaver::setScreenTimeout(unsigned int seconds) {
|
|
|
|
screenTimeout = seconds;
|
|
|
|
resetScreenTimer();
|
2011-06-02 06:04:35 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
void PowerSaver::resetScreenTimer() {
|
2011-10-23 07:56:01 +03:00
|
|
|
if (screenTimer != NULL) {
|
|
|
|
SDL_RemoveTimer(screenTimer);
|
|
|
|
}
|
|
|
|
|
|
|
|
addScreenTimer();
|
|
|
|
// If display is off, turn on it.
|
|
|
|
if (!screenState) {
|
|
|
|
enableScreen();
|
|
|
|
}
|
2011-06-02 06:04:35 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
void PowerSaver::addScreenTimer() {
|
2011-10-23 07:56:01 +03:00
|
|
|
// If timeout is zero, don't set timeout.
|
|
|
|
if (screenTimeout == 0) {
|
|
|
|
screenTimer = NULL;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2012-02-03 00:36:26 +02:00
|
|
|
timeout_startms = SDL_GetTicks();
|
|
|
|
screenTimer = SDL_AddTimer(screenTimeout * 1000, screenTimerCallback, &timeout_startms);
|
2011-10-23 07:56:01 +03:00
|
|
|
if (screenTimer == NULL) {
|
2011-06-02 06:04:35 +03:00
|
|
|
ERROR("Could not initialize SDLTimer: %s\n", SDL_GetError());
|
2011-10-23 07:56:01 +03:00
|
|
|
}
|
2011-06-02 06:04:35 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
#define SCREEN_BLANK_PATH "/sys/class/graphics/fb0/blank"
|
2011-10-23 07:56:01 +03:00
|
|
|
void PowerSaver::setScreenBlanking(bool state) {
|
|
|
|
const char *path = SCREEN_BLANK_PATH;
|
|
|
|
const char *blank = state ? "0" : "1";
|
2011-06-02 06:04:35 +03:00
|
|
|
|
|
|
|
int fd = open(path, O_RDWR);
|
|
|
|
if (fd == -1) {
|
|
|
|
WARNING("Failed to open '%s': %s\n", path, strerror(errno));
|
|
|
|
} else {
|
|
|
|
ssize_t written = write(fd, blank, strlen(blank));
|
|
|
|
if (written == -1) {
|
|
|
|
WARNING("Error writing '%s': %s\n", path, strerror(errno));
|
|
|
|
}
|
|
|
|
close(fd);
|
|
|
|
}
|
2011-10-23 07:56:01 +03:00
|
|
|
screenState = state;
|
2011-06-02 06:04:35 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
void PowerSaver::enableScreen() {
|
2011-10-23 07:56:01 +03:00
|
|
|
if (!screenState) {
|
|
|
|
setScreenBlanking(true);
|
|
|
|
}
|
2011-06-02 06:04:35 +03:00
|
|
|
}
|
2011-10-23 07:56:01 +03:00
|
|
|
|
2011-06-02 06:04:35 +03:00
|
|
|
void PowerSaver::disableScreen() {
|
2011-10-23 07:56:01 +03:00
|
|
|
if (screenState) {
|
|
|
|
setScreenBlanking(false);
|
|
|
|
}
|
2011-06-02 06:04:35 +03:00
|
|
|
}
|