#!/usr/bin/perl -w # Shows remaining battery time for my Sony Vaio PCG-GR214EP. # Based on instant evaluation, the real time depends on future load. # May or may not work on other laptops. # 2002-05-25 Jean Delvare use strict; # Returns a hash with the folling keys: # state {charging,discharging,unknown} # rate (undefined if state is unknown) # remaining # capacity sub get_battery_info { my ($n)=@_; if(-e "/proc/acpi/battery/BAT$n") { my %ret=('state'=>'unknown'); open(INFO,"/proc/acpi/battery/BAT$n/info"); while() { if(m/^design capacity:\s+(\d+) mWh/) { $ret{'capacity'}=$1; } } close(INFO); open(STATE,"/proc/acpi/battery/BAT$n/state"); while() { if(m/^charging state:\s+(\w+)/) { $ret{'state'}=$1; } elsif(($ret{'state'} ne 'unknown') && m/^present rate:\s+(\d+) mW/) { $ret{'rate'}=$1; } elsif(m/^remaining capacity:\s+(\d+) mWh/) { $ret{'remaining'}=$1; } } close(STATE); return(%ret); } else { return(()); } } sub print_info { my $n=1; my $remaining=my $capacity=0; my $battery='AC'; my ($rate,$remainp,$batteryc); while((my %s=get_battery_info($n))) { if(defined($s{'remaining'})) { $remaining+=$s{'remaining'}; } if(defined($s{'capacity'})) { $capacity+=$s{'capacity'}; } if($s{'state'} eq 'discharging') { $rate=$s{'rate'}; $battery=$n; $remainp=$s{'remaining'}*100/$s{'capacity'}; } elsif($s{'state'} eq 'charging') { $rate=$s{'rate'}; $batteryc=$n; $remainp=$s{'remaining'}*100/$s{'capacity'}; } $n++; } if($battery eq 'AC') { print("On: AC adapter\n"); if(defined($batteryc)) { my $min=($capacity-$remaining)*60/$rate; printf("Charging: battery \%s (\%u\%\% \@ %u mW)\n",$batteryc,$remainp,$rate); if ($min != 0) { printf("Full charge time: \%uh\%02u (\%u\%\%)\n",$min/60,$min%60,$remaining*100/$capacity); } } } else { my $min=$remaining*60/$rate; printf("On: battery \%s (\%u\%\%)\n",$battery,$remainp); printf("Remaining time: \%uh\%02u (\%u\%\%)\n",$min/60,$min%60,$remaining*100/$capacity); } } print_info();