Root/src/powersaver.cpp

1#include "powersaver.h"
2#include "debug.h"
3
4#include <errno.h>
5#include <fcntl.h>
6#include <stdio.h>
7#include <string.h>
8#include <unistd.h>
9
10PowerSaver *PowerSaver::instance = NULL;
11
12Uint32 screenTimerCallback(Uint32 timeout, void *d) {
13    unsigned int * old_ticks = (unsigned int *) d;
14    unsigned int new_ticks = SDL_GetTicks();
15
16    if (new_ticks > *old_ticks + timeout + 1000) {
17        DEBUG("Suspend occured, restarting timer\n");
18        *old_ticks = new_ticks;
19        return timeout;
20    }
21
22    DEBUG("Disable Backlight Event\n");
23    PowerSaver::getInstance()->disableScreen();
24    return 0;
25}
26
27PowerSaver *PowerSaver::getInstance() {
28    if (instance == NULL) {
29        instance = new PowerSaver();
30    }
31    return instance;
32}
33
34bool PowerSaver::isRunning() {
35    return instance != NULL;
36}
37
38PowerSaver::PowerSaver() {
39    setScreenTimeout(0);
40    screenTimer = NULL;
41}
42
43PowerSaver::~PowerSaver() {
44    SDL_RemoveTimer(screenTimer);
45    instance = NULL;
46}
47
48void PowerSaver::setScreenTimeout(unsigned int seconds) {
49    screenTimeout = seconds;
50    resetScreenTimer();
51}
52
53void PowerSaver::resetScreenTimer() {
54    if (screenTimer != NULL) {
55        SDL_RemoveTimer(screenTimer);
56    }
57
58    addScreenTimer();
59    // If display is off, turn on it.
60    if (!screenState) {
61        enableScreen();
62    }
63}
64
65void PowerSaver::addScreenTimer() {
66    // If timeout is zero, don't set timeout.
67    if (screenTimeout == 0) {
68        screenTimer = NULL;
69        return;
70    }
71
72    timeout_startms = SDL_GetTicks();
73    screenTimer = SDL_AddTimer(screenTimeout * 1000, screenTimerCallback, &timeout_startms);
74    if (screenTimer == NULL) {
75        ERROR("Could not initialize SDLTimer: %s\n", SDL_GetError());
76    }
77}
78
79#define SCREEN_BLANK_PATH "/sys/class/graphics/fb0/blank"
80void PowerSaver::setScreenBlanking(bool state) {
81    const char *path = SCREEN_BLANK_PATH;
82    const char *blank = state ? "0" : "1";
83
84    int fd = open(path, O_RDWR);
85    if (fd == -1) {
86        WARNING("Failed to open '%s': %s\n", path, strerror(errno));
87    } else {
88        ssize_t written = write(fd, blank, strlen(blank));
89        if (written == -1) {
90            WARNING("Error writing '%s': %s\n", path, strerror(errno));
91        }
92        close(fd);
93    }
94    screenState = state;
95}
96
97void PowerSaver::enableScreen() {
98    if (!screenState) {
99        setScreenBlanking(true);
100    }
101}
102
103void PowerSaver::disableScreen() {
104    if (screenState) {
105        setScreenBlanking(false);
106    }
107}
108

Archive Download this file



interactive