Implement flags for batteries to use the last full capacity. This breaks configfiles.

This commit is contained in:
Michael Stapelberg 2009-05-01 17:53:27 +02:00
parent ac39765685
commit b7bf1dd722
4 changed files with 92 additions and 40 deletions

View File

@ -6,6 +6,7 @@ CFLAGS+=-DPREFIX=\"\"
ifeq ($(shell uname),Linux)
CFLAGS+=-DLINUX
CFLAGS+=-D_GNU_SOURCE
endif
# Define this if you want i3status to spit out dzen2-compatible output on stdout

View File

@ -8,7 +8,7 @@
.fi
..
.TH i3status 1 "APRIL 2009" Linux "User Manuals"
.TH i3status 1 "MAY 2009" Linux "User Manuals"
.SH NAME
i3status \- Generates a status line for dzen2 or wmii
@ -25,7 +25,7 @@ its 9P pseudo filesystem. It is designed to be very efficient by issuing a very
small number of systemcalls (as the bar should be updated every second or at
your specified interval). This ensures that even under high load, your status bar
is updated correctly and it saves a little bit of battery life by not spawning
new processes every second like shell scripts do.
new processes every second like shell scripts does.
.SH CONFIGURATION
.TP
@ -49,11 +49,19 @@ Format for the time/date to be displayed. See strftime(3) or date(1). Don't
specify it if you don't want the time to be shown.
.TP
.B battery_path
The path to your battery's uevent file in /sys, e.g.
/sys/class/power_supply/BAT0/uevent. You can specify this directive multiple
times to display data of more than one battery. Don't specify if you don't have
a battery.
.B battery
The number of the battery you want to display. This option can be specified
multiple times to display multiple batteries. Don't specify it if you don't
have a battery. To get the number of the specific battery, see
/sys/class/power_supply/BAT*
If you want i3status to use the last full capacity instead of the design capacity
of the battery, specify the f-flag, like this:
.Vb 10
# Use the last full capacity
battery 0,f
.Ve
.TP
.B run_watch
@ -107,7 +115,8 @@ System-wide configuration file.
\&eth eth0
\&wmii_path /mnt/wmii/rbar/
\&time_format %d.%m.%Y %H:%M:%S
\&battery_path /sys/class/power_supply/BAT0/uevent
\&battery 0
\&battery 1,f
\&run_watch DHCP /var/run/dhclient*.pid
\&run_watch VPN /var/run/vpnc*.pid
\&order run,wlan,eth,battery,load,time

View File

@ -71,7 +71,9 @@
#define BAR "^fg(#333333)^p(5;-2)^ro(2)^p()^fg()^p(5)"
struct battery {
const char *path;
char *path;
/* Use last full capacity instead of design capacity */
bool use_last_full;
SIMPLEQ_ENTRY(battery) batteries;
};
@ -84,7 +86,6 @@ static const char *wlan_interface;
static const char *eth_interface;
static char *wmii_path;
static const char *time_format;
static const char *battery_path;
static bool use_colors;
static bool get_ethspeed;
static const char *wmii_normcolors = "#222222 #333333";
@ -199,8 +200,6 @@ static void setup(void) {
create_file(concat(order[ORDER_WLAN],"wlan"));
if (eth_interface)
create_file(concat(order[ORDER_ETH],"eth"));
if (battery_path)
create_file(concat(order[ORDER_BATTERY],"battery"));
create_file(concat(order[ORDER_LOAD],"load"));
if (time_format)
create_file(concat(order[ORDER_TIME],"time"));
@ -254,15 +253,16 @@ static void write_error_to_statusbar(const char *message) {
*
*/
void die(const char *fmt, ...) {
if (wmii_path != NULL) {
char buffer[512];
va_list ap;
va_start(ap, fmt);
(void)vsnprintf(buffer, sizeof(buffer), fmt, ap);
va_end(ap);
if (wmii_path != NULL)
write_error_to_statusbar(buffer);
}
else
fprintf(stderr, "%s", buffer);
exit(EXIT_FAILURE);
}
@ -289,7 +289,7 @@ static char *skip_character(char *input, char character, int amount) {
* worn off your battery is.
*
*/
static char *get_battery_info(const char *path) {
static char *get_battery_info(struct battery *bat) {
char buf[1024];
static char part[512];
char *walk, *last;
@ -299,17 +299,21 @@ static char *get_battery_info(const char *path) {
present_rate = -1;
charging_status_t status = CS_DISCHARGING;
if ((fd = open(path, O_RDONLY)) == -1)
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 == '=') {
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") ||
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"))
@ -318,8 +322,21 @@ static char *get_battery_info(const char *path) {
status = CS_CHARGING;
else if (BEGINS_WITH(last, "POWER_SUPPLY_STATUS=Full"))
status = CS_FULL;
} else if (*walk == '\n')
last = walk+1;
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))
@ -536,11 +553,20 @@ static int load_configuration(const char *configfile) {
eth_interface = strdup(dest_value);
OPT("time_format")
time_format = strdup(dest_value);
OPT("battery_path") {
OPT("battery") {
struct battery *new = calloc(1, sizeof(struct battery));
if (new == NULL)
die("Could not allocate memory\n");
new->path = strdup(dest_value);
if (asprintf(&(new->path), "/sys/class/power_supply/BAT%d/uevent", atoi(dest_value)) == -1)
die("Could not build battery path\n");
/* check if flags were specified for this battery */
if (strstr(dest_value, ",") != NULL) {
char *flags = strstr(dest_value, ",");
flags++;
if (*flags == 'f')
new->use_last_full = true;
}
SIMPLEQ_INSERT_TAIL(&batteries, new, batteries);
} OPT("color")
use_colors = true;
@ -669,7 +695,7 @@ int main(int argc, char *argv[]) {
write_to_statusbar(concat(order[ORDER_ETH], "eth"), get_eth_info(), false);
struct battery *current_battery;
SIMPLEQ_FOREACH(current_battery, &batteries, batteries) {
write_to_statusbar(concat(order[ORDER_BATTERY], "battery"), get_battery_info(current_battery->path), false);
write_to_statusbar(concat(order[ORDER_BATTERY], "battery"), get_battery_info(current_battery), false);
}
/* Get load */

View File

@ -1,11 +1,27 @@
# Name of wlan/ethernet devices
wlan wlan0
eth eth0
# Path to wmii (not relevant for dzen mode)
wmii_path /mnt/wmii/rbar/
# Format of date/time, see strftime(3)
time_format %d.%m.%Y %H:%M:%S
battery_path /sys/class/power_supply/BAT0/uevent
# Use battery 0,f to use the last full capacity instead of the design capacity
battery 0
# Check if DHCP/VPN clients are running
run_watch DHCP /var/run/dhclient*.pid
run_watch VPN /var/run/vpnc/pid
order run,wlan,eth,battery,load,time
# Specifies background and border color
normcolors #000000 #333333
# Enables colors
color
# Checks ethernet interface speed (this needs root privileges)
get_ethspeed