2013-08-09 19:01:51 +03:00
|
|
|
#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;
|
|
|
|
}
|
|
|
|
|
2014-08-10 14:25:54 +03:00
|
|
|
Battery::Battery(SurfaceCollection& sc_)
|
2013-08-09 19:01:51 +03:00
|
|
|
: sc(sc_)
|
|
|
|
{
|
|
|
|
lastUpdate = SDL_GetTicks();
|
|
|
|
update();
|
|
|
|
}
|
|
|
|
|
2014-08-10 14:25:54 +03:00
|
|
|
OffscreenSurface const& Battery::getIcon()
|
2013-08-09 19:01:51 +03:00
|
|
|
{
|
|
|
|
// 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;
|
|
|
|
}
|
|
|
|
}
|