#!/usr/bin/perl -w
use strict;


# battmon.pl, copyright (C) 2001 by Guillem Cantallops Ramis.
#
# This is Free Software distributed under the terms of the GNU GPL.
#
# It reads all raw data under /proc/acpi/battery and prints one cooked
# line for each battery using this format:
#
# NUM: %DC %LFC CAPA STATE REM
#
# NUM   = Battery Number
# %DC   = charge (% of Design Capacity)
# %LFC  = charge (% of Last Full Capacity)
# CAPA  = capacity warning (ok/warning/low)
# STATE = state (charging/discharging)
# REM   = remaining time (in hours:minutes, only when discharging)


my %battery;


sub read_acpi_battery_raw_data {
	my $battdir = "/proc/acpi/battery";
	opendir BATTDIR, $battdir;
	while (my $batt = readdir BATTDIR) {
		next if ($batt =~ /^\./);
		opendir FILEDIR, "$battdir/$batt";
		while (my $file = readdir FILEDIR) {
			next if ($file =~ /^\./);
			open FILE, "$battdir/$batt/$file";
			while (my $line = <FILE>) {
				if ($line =~ /^([^:]+):\s*(.+)$/) {
					$battery{$batt}{$1} = $2;
				}
			}
			close FILE;
		}
		closedir FILEDIR;
	}
	closedir BATTDIR;
}


sub print_acpi_battery_raw_data {
	foreach my $num (keys %battery) {
		foreach my $par (keys %{$battery{$num}}) {
			print "\$battery{\"$num\"}{\"$par\"} = \"$battery{$num}{$par}\"\n";
		}
	}
}


sub print_acpi_battery_cooked_data {
	sub nu {
		return (split / /,$_[0])[0];
	}
	foreach my $num (keys %battery) {
		next if ($battery{$num}{"Present"} eq "no");

		my $pct_dc =
			&nu($battery{$num}{"Remaining Capacity"}) /
			&nu($battery{$num}{"Design Capacity"}) *
			100;

		my $pct_lfc =
			&nu($battery{$num}{"Remaining Capacity"}) /
			&nu($battery{$num}{"Last Full Capacity"}) *
			100;

		my $capa = "ok";
		if (&nu($battery{$num}{"Remaining Capacity"}) <
			&nu($battery{$num}{"Design Capacity Low"})
		) { $capa = "low" }
		elsif (&nu($battery{$num}{"Remaining Capacity"}) <
			&nu($battery{$num}{"Design Capacity Warning"})
		) { $capa = "warning" }

		my $state = $battery{$num}{"State"};

		my %rem = (
			h => -1,
			m => -1
		);
		if ($state eq "discharging") {
			my $t =
				&nu($battery{$num}{"Remaining Capacity"}) /
				&nu($battery{$num}{"Present Rate"});
			$rem{h} = int $t;
			$rem{m} = int (($t-$rem{h})*60);
		}

		printf "%2d: %5.2f%%DC %5.2f%%LFC %s %s %02d:%02d\n",
			$num, $pct_dc, $pct_lfc, $capa, $state, $rem{h}, $rem{m};
	}
}


&read_acpi_battery_raw_data;
#&print_acpi_battery_raw_data;
&print_acpi_battery_cooked_data;


exit 0;


#EOF
