1
0
mirror of git://projects.qi-hardware.com/gmenu2x.git synced 2024-11-20 20:05:20 +02:00
gmenu2x/src/battery.cpp

79 lines
1.7 KiB
C++
Raw Normal View History

#include "battery.h"
#include "surfacecollection.h"
#include <SDL.h>
#include <cstdio>
#include <sstream>
/**
* Reads the current battery state and returns a number representing its level
* of charge.
* @return A number representing battery charge: 0 means fully discharged,
* 5 means fully charged, 6 represents running on external power.
*/
static unsigned short getBatteryLevel()
{
FILE *batteryHandle = NULL, *usbHandle = NULL;
#if defined(PLATFORM_A320) || defined(PLATFORM_GCW0) || defined(PLATFORM_NANONOTE)
usbHandle = fopen("/sys/class/power_supply/usb/online", "r");
#endif
if (usbHandle) {
int usbval = 0;
fscanf(usbHandle, "%d", &usbval);
fclose(usbHandle);
if (usbval == 1)
return 6;
}
#if defined(PLATFORM_A320) || defined(PLATFORM_GCW0) || defined(PLATFORM_NANONOTE)
batteryHandle = fopen("/sys/class/power_supply/battery/capacity", "r");
#endif
if (batteryHandle) {
int battval = 0;
fscanf(batteryHandle, "%d", &battval);
fclose(batteryHandle);
if (battval>90) return 5;
if (battval>70) return 4;
if (battval>50) return 3;
if (battval>30) return 2;
if (battval>10) return 1;
}
return 0;
}
Battery::Battery(SurfaceCollection& sc_)
: sc(sc_)
{
lastUpdate = SDL_GetTicks();
update();
}
OffscreenSurface const& Battery::getIcon()
{
// Check battery status every 60 seconds.
unsigned int now = SDL_GetTicks();
if (now - lastUpdate >= 60000) {
lastUpdate = now;
update();
}
return *sc.skinRes(iconPath);
}
void Battery::update()
{
unsigned short battlevel = getBatteryLevel();
if (battlevel > 5) {
iconPath = "imgs/battery/ac.png";
} else {
std::stringstream ss;
ss << "imgs/battery/" << battlevel << ".png";
ss >> iconPath;
}
}