-static char *get_battery_info(const char *path) {
- char buf[1024];
- static char part[512];
- char *walk, *last;
- int fd;
- int full_design = -1,
- remaining = -1,
- present_rate = -1;
- charging_status_t status = CS_DISCHARGING;
-
- if ((fd = open(path, O_RDONLY)) == -1)
- return "No battery found";
-
- memset(part, 0, sizeof(part));
- (void)read(fd, buf, sizeof(buf));
- for (walk = buf, last = buf; (walk-buf) < 1024; walk++)
- if (*walk == '=') {
- if (BEGINS_WITH(last, "POWER_SUPPLY_ENERGY_FULL_DESIGN") ||
- BEGINS_WITH(last, "POWER_SUPPLY_CHARGE_FULL_DESIGN"))
- full_design = atoi(walk+1);
- else if (BEGINS_WITH(last, "POWER_SUPPLY_ENERGY_NOW") ||
- BEGINS_WITH(last, "POWER_SUPPLY_CHARGE_NOW"))
- remaining = atoi(walk+1);
- else if (BEGINS_WITH(last, "POWER_SUPPLY_CURRENT_NOW"))
- present_rate = atoi(walk+1);
- else if (BEGINS_WITH(last, "POWER_SUPPLY_STATUS=Charging"))
- status = CS_CHARGING;
- else if (BEGINS_WITH(last, "POWER_SUPPLY_STATUS=Full"))
- status = CS_FULL;
- } else if (*walk == '\n')
- last = walk+1;
- (void)close(fd);
-
- if ((full_design == 1) || (remaining == -1))
- return part;
-
- if (present_rate > 0) {
- float remaining_time;
- int seconds, hours, minutes;
- if (status == CS_CHARGING)
- remaining_time = ((float)full_design - (float)remaining) / (float)present_rate;
- else if (status == CS_DISCHARGING)
- remaining_time = ((float)remaining / (float)present_rate);
- else remaining_time = 0;
-
- seconds = (int)(remaining_time * 3600.0);
- hours = seconds / 3600;
- seconds -= (hours * 3600);
- minutes = seconds / 60;
- seconds -= (minutes * 60);
-
- (void)snprintf(part, sizeof(part), "%s %.02f%% %02d:%02d:%02d",
- (status == CS_CHARGING ? "CHR" :
- (status == CS_DISCHARGING ? "BAT" : "FULL")),
- (((float)remaining / (float)full_design) * 100),
- hours, minutes, seconds);
- } else {
- (void)snprintf(part, sizeof(part), "%s %.02f%%",
- (status == CS_CHARGING ? "CHR" :
- (status == CS_DISCHARGING ? "BAT" : "FULL")),
- (((float)remaining / (float)full_design) * 100));
- }
- return part;
+static char *get_battery_info(struct battery *bat) {
+ char buf[1024];
+ static char part[512];
+ char *walk, *last;
+ int fd;
+ int full_design = -1,
+ remaining = -1,
+ present_rate = -1;
+ charging_status_t status = CS_DISCHARGING;
+
+ if ((fd = open(bat->path, O_RDONLY)) == -1)
+ return "No battery found";
+
+ memset(part, 0, sizeof(part));
+ (void)read(fd, buf, sizeof(buf));
+ for (walk = buf, last = buf; (walk-buf) < 1024; walk++) {
+ if (*walk == '\n') {
+ last = walk+1;
+ continue;
+ }
+
+ if (*walk != '=')
+ continue;
+
+ if (BEGINS_WITH(last, "POWER_SUPPLY_ENERGY_NOW") ||
+ BEGINS_WITH(last, "POWER_SUPPLY_CHARGE_NOW"))
+ remaining = atoi(walk+1);
+ else if (BEGINS_WITH(last, "POWER_SUPPLY_CURRENT_NOW"))
+ present_rate = atoi(walk+1);
+ else if (BEGINS_WITH(last, "POWER_SUPPLY_STATUS=Charging"))
+ status = CS_CHARGING;
+ else if (BEGINS_WITH(last, "POWER_SUPPLY_STATUS=Full"))
+ status = CS_FULL;
+ else {
+ /* The only thing left is the full capacity */
+ if (bat->use_last_full) {
+ if (!BEGINS_WITH(last, "POWER_SUPPLY_ENERGY_FULL") &&
+ !BEGINS_WITH(last, "POWER_SUPPLY_CHARGE_FULL"))
+ continue;
+ } else {
+ if (!BEGINS_WITH(last, "POWER_SUPPLY_CHARGE_FULL_DESIGN") &&
+ !BEGINS_WITH(last, "POWER_SUPPLY_ENERGY_FULL_DESIGN"))
+ continue;
+ }
+
+ full_design = atoi(walk+1);
+ }
+ }
+ (void)close(fd);
+
+ if ((full_design == 1) || (remaining == -1))
+ return part;
+
+ if (present_rate > 0) {
+ float remaining_time;
+ int seconds, hours, minutes;
+ if (status == CS_CHARGING)
+ remaining_time = ((float)full_design - (float)remaining) / (float)present_rate;
+ else if (status == CS_DISCHARGING)
+ remaining_time = ((float)remaining / (float)present_rate);
+ else remaining_time = 0;
+
+ seconds = (int)(remaining_time * 3600.0);
+ hours = seconds / 3600;
+ seconds -= (hours * 3600);
+ minutes = seconds / 60;
+ seconds -= (minutes * 60);
+
+ (void)snprintf(part, sizeof(part), "%s %.02f%% %02d:%02d:%02d",
+ (status == CS_CHARGING ? "CHR" :
+ (status == CS_DISCHARGING ? "BAT" : "FULL")),
+ (((float)remaining / (float)full_design) * 100),
+ max(hours, 0), max(minutes, 0), max(seconds, 0));
+ } else {
+ (void)snprintf(part, sizeof(part), "%s %.02f%%",
+ (status == CS_CHARGING ? "CHR" :
+ (status == CS_DISCHARGING ? "BAT" : "FULL")),
+ (((float)remaining / (float)full_design) * 100));
+ }
+ return part;