Hello.I wrote a patch that (IMHO) improves the reporting of the ETA in acpi (sorry for the late mail).
Advantages:- Default behavior is backward compatible (same as version 1.7-1.3); ETA is show only if the corresponding option is activated.
- Formatting available New options: -r: show remaining time (default behavior) -e: show ETA -re: show both -F: format ETA according to strftime. Please, find attached this patch. Best regards, Davide ManiniPS My registration on Salsa is still pending. This is my first contribution to Debian.
diff --git a/acpi.1 b/acpi.1 index 11ea3ec..b27bae7 100644 --- a/acpi.1 +++ b/acpi.1 @@ -14,6 +14,12 @@ or thermal information. show battery information .IP "\fB-a | --ac-adapter\fP " 10 show ac adapter information +.IP "\fB-r | --remaining-time\fP " 10 +show remaining time of (dis)charge +.IP "\fB-e | --end-time\fP " 10 +show end time of (dis)charge +.IP "\fB-F | --format-time\fP " 10 +chose the format for the end time of (dis)charge, using the syntax of \fBstrftime\fP(3) .IP "\fB-t | --thermal\fP " 10 show thermal information .IP "\fB-c | --cooling\fP " 10 diff --git a/acpi.c b/acpi.c index 7967828..365ad18 100644 --- a/acpi.c +++ b/acpi.c @@ -26,6 +26,7 @@ #include <getopt.h> #include <string.h> #include <errno.h> +#include <time.h> #include "list.h" #include "acpi.h" @@ -247,7 +248,7 @@ static int get_unit_value(char *value) return n; } -void print_battery_information(struct list *batteries, int show_empty_slots, int show_capacity) +void print_battery_information(struct list *batteries, int show_empty_slots, int show_capacity, int show_remaining_time, int show_end_time, char *end_time_format) { struct list *battery = batteries; struct list *fields; @@ -265,9 +266,12 @@ void print_battery_information(struct list *batteries, int show_empty_slots, int int last_capacity_unit = -1; int hours, minutes, seconds; int percentage; - char *state = NULL, *poststr; + char *state = NULL, *poststr, *prestr; int type_battery = TRUE; char capacity_unit[4] = "mAh"; + char stm[BUF_SIZE]; + time_t end_time; + struct tm end_time_tm; fields = battery->data; while (fields) { @@ -365,6 +369,7 @@ void print_battery_information(struct list *batteries, int show_empty_slots, int if (present_rate > MIN_PRESENT_RATE) { seconds = 3600 * (last_capacity - remaining_capacity) / present_rate; poststr = " until charged"; + prestr = " fully charged at"; } else { poststr = "charging at zero rate - will never fully charge."; seconds = -1; @@ -373,6 +378,7 @@ void print_battery_information(struct list *batteries, int show_empty_slots, int if (present_rate > MIN_PRESENT_RATE) { seconds = 3600 * remaining_capacity / present_rate; poststr = " remaining"; + prestr = " fully discharged at"; } else { poststr = "discharging at zero rate - will never fully discharge."; seconds = -1; @@ -383,11 +389,22 @@ void print_battery_information(struct list *batteries, int show_empty_slots, int } if (seconds > 0) { - hours = seconds / 3600; - seconds -= 3600 * hours; - minutes = seconds / 60; - seconds -= 60 * minutes; - printf(", %02d:%02d:%02d%s", hours, minutes, seconds, poststr); + if (show_remaining_time) { + hours = seconds / 3600; + seconds -= 3600 * hours; + minutes = seconds / 60; + seconds -= 60 * minutes; + printf(", %02d:%02d:%02d%s", hours, minutes, seconds, poststr); + } + + end_time = time(NULL) + seconds; + if (show_end_time && localtime_r(&end_time, &end_time_tm)) { + if (end_time_format && strftime(stm, sizeof(stm), end_time_format, &end_time_tm)) { + printf(",%s %s", prestr, stm); + } else { + printf(",%s %02i:%02d:%02d", prestr, end_time_tm.tm_hour, end_time_tm.tm_min, end_time_tm.tm_sec); + } + } } else if (poststr != NULL) { printf(", %s", poststr); } diff --git a/acpi.h b/acpi.h index 178f82d..dc5480d 100644 --- a/acpi.h +++ b/acpi.h @@ -60,7 +60,7 @@ struct list *find_devices(char *acpi_path, int device_nr, int proc_interface); void free_devices(struct list *devices); -void print_battery_information(struct list *batteries, int show_empty_slots, int show_capacity); +void print_battery_information(struct list *batteries, int show_empty_slots, int show_capacity, int show_remaining_time, int show_end_time, char *end_time_format); void print_ac_adapter_information(struct list *batteries, int show_empty_slots); diff --git a/main.c b/main.c index c47b3e0..662193a 100644 --- a/main.c +++ b/main.c @@ -32,12 +32,12 @@ struct device device[4] = { { COOLING_DEV, "fan", "thermal", "cooling_device" } }; -static void do_show_batteries(char *acpi_path, int show_empty_slots, int show_details, int proc_interface) +static void do_show_batteries(char *acpi_path, int show_empty_slots, int show_details, int show_remaining_time, int show_end_time, char *end_time_format, int proc_interface) { struct list *batteries; batteries = find_devices(acpi_path, BATTERY, proc_interface); - print_battery_information(batteries, show_empty_slots, show_details); + print_battery_information(batteries, show_empty_slots, show_details, show_remaining_time, show_end_time, end_time_format); free_devices(batteries); } @@ -90,6 +90,9 @@ static int usage(char *argv[]) " - battery capacity information\n" " - temperature trip points\n" " -a, --ac-adapter ac adapter information\n" +" -r, --remaining-time show remaining time for (dis)charge\n" +" -e, --end-time show end time for (dis)charge\n" +" -F, --format-time <str> specify end-time format string\n" " -t, --thermal thermal information\n" " -c, --cooling cooling information\n" " -V, --everything show every device, overrides above options\n" @@ -125,6 +128,9 @@ static struct option long_options[] = { { "everything", 0, 0, 'V' }, { "proc", 0, 0, 'p' }, { "details", 0, 0, 'i' }, + { "remaining-time", 0, 0, 'r' }, + { "end-time", 0, 0, 'e' }, + { "format-time", 1, 0, 'F' }, { 0, 0, 0, 0 }, }; @@ -136,17 +142,20 @@ int main(int argc, char *argv[]) int show_cooling = FALSE; int show_empty_slots = FALSE; int show_details = FALSE; + int show_remaining_time = 2; + int show_end_time = FALSE; int proc_interface = FALSE; int temperature_units = TEMP_CELSIUS; int ch, option_index; char *acpi_path = strdup(ACPI_PATH_SYS); + char *end_time_format = NULL; if (!acpi_path) { fprintf(stderr, "Out of memory in main()\n"); return -1; } - while ((ch = getopt_long(argc, argv, "ipVbtashvfkcd:", long_options, &option_index)) != -1) { + while ((ch = getopt_long(argc, argv, "F:eripVbtashvfkcd:", long_options, &option_index)) != -1) { switch (ch) { case 'V': show_batteries = show_ac_adapter = show_thermal = show_cooling = show_details = TRUE; @@ -178,6 +187,22 @@ int main(int argc, char *argv[]) case 'k': temperature_units = TEMP_KELVIN; break; + case 'r': + show_remaining_time = TRUE; + break; + case 'e': + show_end_time = TRUE; + if (show_remaining_time==2) { + show_remaining_time = FALSE; + } + break; + case 'F': + end_time_format = strdup(optarg); + if (!end_time_format) { + fprintf(stderr, "Out of memory in main()\n"); + return -1; + } + break; case 'p': proc_interface = TRUE; free(acpi_path); @@ -201,12 +226,22 @@ int main(int argc, char *argv[]) } } + + /* if neither -e nor -r was chosen, show remaining time, for backward compatibility */ + if (show_remaining_time==2) { + show_remaining_time = TRUE; + } + + if (end_time_format && !show_end_time) { + fprintf(stderr, "Warning: ignoring the time format since option -e is not specfied"); + } + /* if nothing was chosen, we show the battery information */ if (!show_batteries && !show_ac_adapter && !show_thermal && !show_cooling) show_batteries = TRUE; if (show_batteries) { - do_show_batteries(acpi_path, show_empty_slots, show_details, proc_interface); + do_show_batteries(acpi_path, show_empty_slots, show_details, show_remaining_time, show_end_time, end_time_format, proc_interface); } if (show_ac_adapter) { do_show_ac_adapter(acpi_path, show_empty_slots, proc_interface);
OpenPGP_signature.asc
Description: OpenPGP digital signature