#! /usr/bin/perl -w use strict; use IO::File; use POSIX qw(floor); use Term::ANSIColor qw(:constants); sub catfile{ my $temp = IO::File->new($_[0],'r') or die "Unable to open $_[0] for reading: $!"; my $foo = <$temp>; chomp $foo; return $foo; } my %bat_inf; if (-r '/proc/pmu/battery_0') { my $bat_inf_fh = new IO::File '/proc/pmu/battery_0'; my $max_out = -1300; my $max_in = 1700; my $battery_info = {}; while (<$bat_inf_fh>) { if (/(.+?)\s*:\s*(-?\d+)/) { $battery_info->{$1} = int $2; } } undef $bat_inf_fh; $bat_inf{charging} = hex $battery_info->{flags} & 2; $bat_inf{current} = 0; if ($battery_info->{current} > 0) { $bat_inf{current} = floor($battery_info->{current}/$max_in*1000)/10; } else { $bat_inf{current} = floor($battery_info->{current}/$max_out*1000)/10; } $bat_inf{percent} = floor($battery_info->{'charge'}/$battery_info->{'max_charge'}*1000)/10; $bat_inf{time_rem} = $battery_info->{'time rem.'}; } elsif (-r '/sys/devices/platform/smapi/BAT0/remaining_capacity') { $bat_inf{percent} = catfile('/sys/devices/platform/smapi/BAT0/remaining_percent'); $bat_inf{charging} = catfile('/sys/devices/platform/smapi/BAT0/state') ne 'discharging'; $bat_inf{time_rem} = $bat_inf{charging} ? catfile('/sys/devices/platform/smapi/BAT0/remaining_charging_time') : catfile('/sys/devices/platform/smapi/BAT0/remaining_running_time'); $bat_inf{time_rem} !~ /\d/ and $bat_inf{time_rem} = 0; $bat_inf{time_rem} *= 60; $bat_inf{current} = -catfile('/sys/devices/platform/smapi/BAT0/current_now') / 10;} else { print STDERR "No battery information\n"; exit 1; } #use Data::Dumper; #print Dumper($battery_info); my $hours = int $bat_inf{time_rem}/3600; my $minutes = (int $bat_inf{time_rem}/60)%60; my $seconds = $bat_inf{time_rem}%60; my $current = $bat_inf{current}; my $charge_state = $bat_inf{charging}?'Charging':'Discharging'; my $percentage = $bat_inf{percent}; if ($bat_inf{charging}) { print BOLD GREEN; } else { print BOLD RED; } print "$charge_state at $current\%: $hours hours, $minutes minutes, and $seconds seconds remaining. [$percentage\%]\n"; print RESET;