#!/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__