Skip to content

Commit

Permalink
Fixed bug 4920 - Wider support for seconds of battery life left on Li…
Browse files Browse the repository at this point in the history
…nux platforms using sys interface

Murad

On my system, SDL_GetPowerInfo() returns -1 seconds of battery life left. I have quickly investigated that in my case SDL uses sys interface to get battery data. It tries to read "time_to_empty_now" file which is not always present. However, it is still possible to calculate remaining lifetime using "energy_now" and "power_now" files. This is what my simple patch (included as attachment) tries to accomplish.
Best wishes.
  • Loading branch information
slouken committed Dec 30, 2019
1 parent 8b0660b commit 58a11d3
Showing 1 changed file with 10 additions and 3 deletions.
13 changes: 10 additions & 3 deletions src/power/linux/SDL_syspower.c
Expand Up @@ -451,6 +451,8 @@ SDL_GetPowerInfo_Linux_sys_class_power_supply(SDL_PowerState *state, int *second
SDL_PowerState st;
int secs;
int pct;
int energy;
int power;

if ((SDL_strcmp(name, ".") == 0) || (SDL_strcmp(name, "..") == 0)) {
continue; /* skip these, of course. */
Expand Down Expand Up @@ -492,11 +494,16 @@ SDL_GetPowerInfo_Linux_sys_class_power_supply(SDL_PowerState *state, int *second
pct = (pct > 100) ? 100 : pct; /* clamp between 0%, 100% */
}

if (!read_power_file(base, name, "time_to_empty_now", str, sizeof (str))) {
secs = -1;
} else {
if (read_power_file(base, name, "time_to_empty_now", str, sizeof (str))) {
secs = SDL_atoi(str);
secs = (secs <= 0) ? -1 : secs; /* 0 == unknown */
} else if (st == SDL_POWERSTATE_ON_BATTERY) {
/* energy is Watt*hours and power is Watts */
energy = (read_power_file(base, name, "energy_now", str, sizeof (str))) ? SDL_atoi(str) : -1;
power = (read_power_file(base, name, "power_now", str, sizeof (str))) ? SDL_atoi(str) : -1;
secs = (energy >= 0 && power > 0) ? (3600LL * energy) / power : -1;
} else {
secs = -1;
}

/*
Expand Down

0 comments on commit 58a11d3

Please sign in to comment.