version 1.2, 2007/02/11 15:46:00 |
version 1.3, 2007/02/16 00:25:42 |
|
|
# 2007-02-11 - created |
# 2007-02-11 - created |
# |
# |
|
|
# $Platon$ |
# $Platon: thinkpad-status/thinkpad.pl,v 1.2 2007-02-11 15:46:00 rajo Exp $ |
|
|
use strict; |
use strict; |
use warnings; |
use warnings; |
|
|
use Time::HiRes qw( gettimeofday ); |
use Time::HiRes qw( gettimeofday ); |
use POSIX qw(strftime); |
use POSIX qw(strftime); |
|
|
undef $/; |
|
|
|
use vars qw ( |
use vars qw ( |
$glade |
$glade |
$x_mainwin $x_status $x_preferences $x_about |
$x_mainwin $x_status $x_preferences $x_about |
|
|
|
|
$glib_refresh $refresh_interval $default_update_interval |
$glib_refresh $refresh_interval $default_update_interval |
|
|
$xx_temperatures $x_temperatures @temperatures |
$x_cpu_scaling_driver $cpu_scaling_driver |
|
$x_cpu_scaling_governor $cpu_scaling_governor |
|
|
|
$xx_battery $x_battery @battery |
|
$xx_thermals $x_thermals @thermals |
|
$xx_fan $x_fan @fan |
); |
); |
|
|
$default_update_interval = 1; # 1 second |
$default_update_interval = 1; # 1 second |
|
|
|
|
# refresh interval |
# refresh interval |
$x_refresh_interval = $glade->get_widget('refresh_interval'); |
$x_refresh_interval = $glade->get_widget('refresh_interval'); |
# temperatures |
|
$xx_temperatures = $glade->get_widget('temperatures'); |
# CPU {{{ |
$x_temperatures = Gtk2::SimpleList->new_from_treeview( |
$x_cpu_scaling_driver = $glade->get_widget('cpu_scaling_driver'); |
$xx_temperatures, |
$cpu_scaling_driver = grab_data('/sys/devices/system/cpu/cpu0/cpufreq/scaling_driver'); |
|
|
|
$x_cpu_scaling_governor = $glade->get_widget('cpu_scaling_governor'); |
|
$cpu_scaling_governor = grab_data('/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor'); |
|
|
|
# }}} |
|
|
|
# battery # {{{ |
|
$xx_battery = $glade->get_widget('battery'); |
|
$x_battery = Gtk2::SimpleList->new_from_treeview( |
|
$xx_battery, |
|
'Param' => 'text', |
|
'Value' => 'text', |
|
); |
|
# set some useful SimpleList properties |
|
$x_battery->set_headers_clickable(0); |
|
foreach ($x_battery->get_columns()) { |
|
$_->set_resizable(1); |
|
$_->set_sizing('grow-only'); |
|
} |
|
# }}} |
|
|
|
# thermal # {{{ |
|
$xx_thermals = $glade->get_widget('thermals'); |
|
$x_thermals = Gtk2::SimpleList->new_from_treeview( |
|
$xx_thermals, |
'Name' => 'text', |
'Name' => 'text', |
'Temperature' => 'text', |
'Temperature' => 'text', |
); |
); |
# set some useful SimpleList properties |
# set some useful SimpleList properties |
$x_temperatures->set_headers_clickable(0); |
$x_thermals->set_headers_clickable(0); |
foreach ($x_temperatures->get_columns()) { |
foreach ($x_thermals->get_columns()) { |
$_->set_resizable(1); |
$_->set_resizable(1); |
$_->set_sizing('grow-only'); |
$_->set_sizing('grow-only'); |
} |
} |
|
# }}} |
|
|
|
# fan {{{ |
|
$xx_fan = $glade->get_widget('fan'); |
|
$x_fan = Gtk2::SimpleList->new_from_treeview( |
|
$xx_fan, |
|
'Param' => 'text', |
|
'Value' => 'text', |
|
); |
|
# set some useful SimpleList properties |
|
$x_fan->set_headers_clickable(0); |
|
foreach ($x_fan->get_columns()) { |
|
$_->set_resizable(1); |
|
$_->set_sizing('grow-only'); |
|
} |
|
# }}} |
|
|
# set up a 'refresh' timer |
# set up a 'refresh' timer |
$x_refresh_interval->set_text($default_update_interval); |
$x_refresh_interval->set_text($default_update_interval); |
Line 98 sub make_refresh() |
|
Line 142 sub make_refresh() |
|
{ # {{{ |
{ # {{{ |
print_info("make_refresh() called"); |
print_info("make_refresh() called"); |
|
|
refresh_temperature(); |
refresh_cpu(); |
|
refresh_battery(); |
|
refresh_thermal(); |
|
refresh_fan(); |
|
|
return 1; |
return 1; |
|
|
} # }}} |
} # }}} |
|
|
# refresh data for tab 'Fan' |
# refresh data for tab 'CPU' |
sub refresh_fan() |
sub refresh_cpu() |
{ # {{{ |
{ # {{{ |
@{$x_temperatures->{data}} = (); |
|
|
|
open(FAN, "</proc/acpi/ibm/fan") or die "Can't open /proc/acpi/ibm/fan: $!"; |
$cpu_scaling_driver = grab_data('/sys/devices/system/cpu/cpu0/cpufreq/scaling_driver'); |
shift @temperatures; # remove description |
$x_cpu_scaling_driver->set_text($cpu_scaling_driver); |
close (FAN); |
|
|
|
foreach my $desc ('Processor', 'Mini-PCI', 'Harddisk', 'Graphics', 'System battery', 'UltraBay battery', 'System battery', 'UltraBay battery') { |
$cpu_scaling_governor = grab_data('/sys/devices/system/cpu/cpu0/cpufreq/scaling_governor'); |
push @{$x_temperatures->{data}}, [$desc, shift(@temperatures)]; |
$x_cpu_scaling_governor->set_text($cpu_scaling_governor); |
} |
|
|
} # }}} |
|
|
|
# refresh data for tab 'Battery' |
|
sub refresh_battery() |
|
{ # {{{ |
|
|
|
grab_data_by_colon('/proc/acpi/battery/BAT0/state', $x_battery->{data}); |
|
|
} # }}} |
} # }}} |
|
|
# refresh data for tab 'Thermal' |
# refresh data for tab 'Thermal' |
sub refresh_temperature() |
sub refresh_thermal() |
{ # {{{ |
{ # {{{ |
@{$x_temperatures->{data}} = (); |
@{$x_thermals->{data}} = (); |
|
|
open(THERMAL, "</proc/acpi/ibm/thermal") or die "Can't open /proc/acpi/ibm/thermal: $!"; |
open(THERMAL, "</proc/acpi/ibm/thermal") or do { warn "Can't open /proc/acpi/ibm/thermal: $!"; return ; }; |
@temperatures = split(/\s+/, <THERMAL>, 9); |
@thermals = split(/\s+/, <THERMAL>, 9); |
shift @temperatures; # remove description |
shift @thermals; # remove description |
close (THERMAL); |
close (THERMAL); |
|
|
# http://www.thinkwiki.org/wiki/Thermal_sensors |
# http://www.thinkwiki.org/wiki/Thermal_sensors |
foreach my $desc ('Processor', 'Mini-PCI', 'Harddisk', 'Graphics', 'System battery', 'UltraBay battery', 'System battery', 'UltraBay battery') { |
foreach my $desc ('Processor', 'Mini-PCI', 'Harddisk', 'Graphics', 'System battery', 'UltraBay battery', 'System battery', 'UltraBay battery') { |
push @{$x_temperatures->{data}}, [$desc, shift(@temperatures)]; |
push @{$x_thermals->{data}}, [$desc, shift(@thermals)]; |
|
} |
|
|
|
} # }}} |
|
|
|
# refresh data for tab 'Fan' |
|
sub refresh_fan() |
|
{ # {{{ |
|
|
|
grab_data_by_colon('/proc/acpi/ibm/fan', $x_fan->{data}); |
|
|
|
} # }}} |
|
|
|
sub grab_data($) |
|
{ # {{{ |
|
my ($file) = @_; |
|
my $data; |
|
|
|
open(FILE, "<$file") or do { warn "Can't open '$file': $!"; return; }; |
|
{ |
|
local $/; |
|
$data = <FILE>; |
|
} |
|
close(FILE); |
|
|
|
$data =~ s/[^\p{IsPrint}]//g; |
|
|
|
return $data; |
|
|
|
} # }}} |
|
|
|
sub grab_data_by_colon($$) |
|
{ # {{{ |
|
my ($file, $arr) = @_; |
|
@$arr = (); |
|
|
|
open(COLON, "<$file") or do { warn "Can't open '$file': $!"; return; }; |
|
while (my $line = <COLON>) { |
|
chomp $line; |
|
my ($name, $val) = split(/:\s+/, $line, 2); |
|
push @{$arr}, [$name, $val]; |
} |
} |
|
close(COLON); |
|
|
} # }}} |
} # }}} |
|
|