#!/usr/bin/perl -w
# vim: set sw=4 ts=4 si et:
#
use strict;
use vars qw($opt_h);
use Getopt::Std;
#
my $oldstr="";
my $str="";
my $subres;
#
&getopts("h")||die "ERROR: No such option. -h for help.n";
&help if ($opt_h);
system("mtxorb /dev/lcd")&&die "ERROR: initialisation failed. Could not run mtxorb /dev/lcd\n";
# called before program termination by init script:
sub catch_sig{
print LCD chr(0xFE),"X"; # clear the display
$str="shutdown\n\n";
print LCD "$str";
exit 0;
}
$SIG{INT} = \&catch_sig;
$SIG{HUP} = \&catch_sig;
$SIG{TERM} = \&catch_sig;
$SIG{QUIT} = \&catch_sig;
#
open(LCD,">/dev/lcd")||die "ERROR in lcdwriter: can not write to /dev/lcd\n";
$|=1;
my $i=0;
while(1){
$i++;
if ($i < 5){
$subres=&getuptime;
}elsif($i < 9){
$subres=&getswap;
}else{
$subres=&getswap;
$i=0;
}
$str="LinuxFocus\n$subres\n"; # you can replace LinuxFocus with any string
if ($str ne $oldstr){
sleep(1);
print LCD chr(0xFE),"X"; # clear the display
$oldstr=$str;
}else{
sleep(3);
}
# write, just to be sure:
print LCD "$str";
}
#
sub getuptime{
my ($ld,$ut,$uptime);
$ut="?";
$ld="?";
open(UPT,"/proc/uptime")||die "ERROR in lcdwriter: while reading /proc/uptime\n";
while(){
if (/(\d+)/){
# uptime is in seconds:
$ut=$1 / 360;
$ut=int $ut;
$ut=$ut / 10;
last;
}
}
close UPT;
open(LDT,"/proc/loadavg")||die "ERROR in lcdwriter: while reading /proc/loadavg\n";
while(){
if (/^([\.\d]+)/){
$ld=$1;
last;
}
}
close LDT;
"u:$ut l:$ld";
}
#
sub getswap{
my ($total,$used,$free);
open(SWP,"/proc/meminfo")||die "ERROR in lcdwriter: while reading /proc/meminfo\n";
while(){
if (/SwapTotal: *(\d+)/){
$total=$1;
}
if (/SwapFree: *(\d+)/){
$free=$1;
}
if ($free && $total){
$used=$total-$free;
}else{
$used="";
}
}
close SWP;
return "swp:$used Kb";
}
#
sub help{
print "lcdwriter -- perl script to update the lcd display with
some information on uptime, load and swap usage.
USAGE: lcdwriter [-h]
lcdwriter runs at startup the program mtxorb to initialize the
serial line.
\n";
exit;
}
__END__