| verzia 1.2, 2007/02/11 15:46:00 |
verzia 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); |
| Riadok 98 sub make_refresh() |
|
| Riadok 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); |
| |
|
| } # }}} |
} # }}} |
| |
|