Some time ago I wanted to get the battery information in my linux box. I knew of sys-power/acpi, and I checked if there was anything I could use in Perl. There is the Acpi::Battery module, but this module gets information from the deprecated directory /proc/acpi. Improving the module looked like an affordable task for a beginner and I ended up writing a general module, Acpi::Class, that could read information from the directory /sys/class.
Acpi::Class has been my first module, and I have recently been able to emulate the sys-power/acpi after learning to "read" some C. This is the code:
#!/usr/bin/env perl
# {{{ Description
#=====================================================================
+==========
# Print Battery Information using Acpi::Class
# Emulate acpiclient: http://sourceforge.net/projects/acpiclient/
#=====================================================================
+==========
# }}}
# {{{ Modules
use strict;
use warnings;
use Acpi::Class;
# }}}
# {{{ Define Variables
# We will get information of BAT1: /sys/class/power_supply/BAT1
my $my_class = "power_supply";
my $my_device = "BAT1";
my $class = Acpi::Class->new( class => $my_class, device => $my_device
+);
my $values = $class->g_values;
my @attributes = qw(energy_now charge_now
power_now current_now
energy_full charge_full
energy_full_design charge_full_design
status
capacity);
# }}}
# {{{ Obtain and calculate values
my %att_value;
foreach my $attribute (@attributes) {
$att_value{$attribute} = $values->{$attribute};
}
my $remaining_capacity = $att_value{'energy_now'} // $att_value{'charg
+e_now'};
my $last_capacity = $att_value{'energy_full'} // $att_value{'char
+ge_full'};
my $present_rate = $att_value{'power_now'} // $att_value{'curren
+t_now'};
my $design_capacity = $att_value{'energy_full_design'} // $att_valu
+e{'charge_full_design'};
my $percentage = $att_value{'capacity'} // $remaining_capacity
+ * 100 / $last_capacity;
my $battery_loss = 100 - $last_capacity * 100 / $design_capacity
+;
my $status = $att_value{'status'};
my $seconds = 0;
my $message = "";
if ( $status =~ /Discharging/ ) {
$seconds = 3600 * $remaining_capacity / $present_rate;
$message = "Remaining";
}
elsif ( $status =~ /Charging/ ) {
$seconds = 3600 * ($last_capacity - $remaining_capacity) / $presen
+t_rate;
$message = "Until Charged";
if ($remaining_capacity > $last_capacity) {
$seconds = 3600 * $remaining_capacity / $present_rate;
$message = "Remaining, Charging on top last recorded full capa
+city";
}
}
elsif ( $status =~ /Unknown/ ) {
$status = "Full";
}
else {
die "status = $att_value{'status'} and current_now = $present_rate
+"
}
my $there_are_seconds = $seconds;
my $there_is_battery_loss = $battery_loss;
my $minutes = int($seconds / 60);
$seconds = $seconds % 60;
my $hours = int($minutes / 60);
$minutes = $minutes % 60;
# }}}
# {{{ Print values
my $time = "";
$time = sprintf("%02d:%02d:%02d", $hours, $minutes, $seconds)
+if ($there_are_seconds);
$percentage = sprintf("%.0f%%", $percentage);
$battery_loss = sprintf("%.1f%%", $battery_loss);
print "$my_device: $status $percentage, ";
print "$time $message, " if ($there_are_seconds);
print "$battery_loss Battery Loss \n" if ($battery_loss);
# }}}
I would very much appreciate some indications on which should be the right direction to follow. Here some options I have thought about:
- Improve the Acpi::Class module. Much more needs to be done.
- Improve the submitted code. Much more needs to be done.
- Transform this code into a module, so other people can use the module to get battery information and see how they can use Acpi::Class to develop code to get information on other devices.
- Improve the documentation. It is very difficult to understand what this is all about
- More time should be spend in more important Perl modules.
- There are other areas, like learning English or gardening, that could make people happier than seeing this code.
- All of the above
Actually, I am considering the three first points ;-) . I would very much appreciate if you have some suggestions on how to improve the code of if you think this should be transformed into a module.
Thanks and happy Perling!
P.S.: I have been able to grasp "some basic" C after learning "some" Perl. I have just realised how Perl makes life easier in understanding other languages and producing some code ;-).
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.
|