-
- if ((full_design == -1) || (remaining == -1)) {
- OUTPUT_FULL_TEXT(format_down);
- return;
- }
-
- (void)snprintf(statusbuf, sizeof(statusbuf), "%s", BATT_STATUS_NAME(status));
-
- float percentage_remaining = (((float)remaining / (float)full_design) * 100);
- if (integer_battery_capacity) {
- (void)snprintf(percentagebuf, sizeof(percentagebuf), "%.00f%%", percentage_remaining);
- } else {
- (void)snprintf(percentagebuf, sizeof(percentagebuf), "%.02f%%", percentage_remaining);
- }
-
- if (present_rate > 0) {
- float remaining_time;
- int seconds, hours, minutes, seconds_remaining;
- 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_remaining = (int)(remaining_time * 3600.0);
-
- hours = seconds_remaining / 3600;
- seconds = seconds_remaining - (hours * 3600);
- minutes = seconds / 60;
- seconds -= (minutes * 60);
-
- if (status == CS_DISCHARGING && low_threshold > 0) {
- if (strcasecmp(threshold_type, "percentage") == 0
- && percentage_remaining < low_threshold) {
- START_COLOR("color_bad");
- colorful_output = true;
- } else if (strcasecmp(threshold_type, "time") == 0
- && seconds_remaining < 60 * low_threshold) {
- START_COLOR("color_bad");
- colorful_output = true;
- } else {
- colorful_output = false;
- }
- }
-
- if (hide_seconds)
- (void)snprintf(remainingbuf, sizeof(remainingbuf), "%02d:%02d",
- max(hours, 0), max(minutes, 0));
- else
- (void)snprintf(remainingbuf, sizeof(remainingbuf), "%02d:%02d:%02d",
- max(hours, 0), max(minutes, 0), max(seconds, 0));
-
- empty_time = time(NULL);
- empty_time += seconds_remaining;
- empty_tm = localtime(&empty_time);
-
- if (hide_seconds)
- (void)snprintf(emptytimebuf, sizeof(emptytimebuf), "%02d:%02d",
- max(empty_tm->tm_hour, 0), max(empty_tm->tm_min, 0));
- else
- (void)snprintf(emptytimebuf, sizeof(emptytimebuf), "%02d:%02d:%02d",
- max(empty_tm->tm_hour, 0), max(empty_tm->tm_min, 0), max(empty_tm->tm_sec, 0));
-
- (void)snprintf(consumptionbuf, sizeof(consumptionbuf), "%1.2fW",
- ((float)present_rate / 1000.0 / 1000.0));
- } else {
- /* On some systems, present_rate may not exist. Still, make sure
- * we colorize the output if threshold_type is set to percentage
- * (since we don't have any information on remaining time). */
- if (status == CS_DISCHARGING && low_threshold > 0) {
- if (strcasecmp(threshold_type, "percentage") == 0
- && percentage_remaining < low_threshold) {
- START_COLOR("color_bad");
- colorful_output = true;
- }
- }
- }
+ }
+
+ if ((full_design == -1) || (remaining == -1)) {
+ OUTPUT_FULL_TEXT(format_down);
+ return false;
+ }
+
+ batt_info->percentage_remaining = (((float)remaining / (float)full_design) * 100);
+ /* Some batteries report POWER_SUPPLY_CHARGE_NOW=<full_design> when fully
+ * charged, even though that’s plainly wrong. For people who chose to see
+ * the percentage calculated based on the last full capacity, we clamp the
+ * value to 100%, as that makes more sense.
+ * See http://bugs.debian.org/785398 */
+ if (last_full_capacity && batt_info->percentage_remaining > 100) {
+ batt_info->percentage_remaining = 100;
+ }
+
+ if (batt_info->present_rate > 0 && batt_info->status != CS_FULL) {
+ batt_info->seconds_remaining = seconds_remaining_from_rate(batt_info->status, full_design, remaining, batt_info->present_rate);
+ }