Larky: Snyggt! Displayramen gjord i en cnc-fräs/liknande?
Som syns nedan så är inte koden helt klar än, fick slut på tid. Lite funktioner som inte används, lite bortkommenterat och ändrat här och varstans. Koden som uppdaterar displayen:
Kod: Markera allt
#!/usr/bin/perl
use IO::Handle;
use LWP::Simple;
use strict;
my $line1 = '/mnt/owfs/FF.8A0400000300/line16.0';
my $line2 = '/mnt/owfs/FF.8A0400000300/line16.1';
my $lcdon = '/mnt/owfs/FF.8A0400000300/LCDon';
#på dessa signaler, kör funktionerna:
$SIG{INT} = "closeandexit";
$SIG{USR1} = "updatelines";
$|=1;
resetdisplay();
my $time = time();
while(1){
updatelines();
sleep(60);
}
sub updatelines {
if(time()-$time > 1800){
resetdisplay();
$time = time();
}
my $line1_fh = openline($line1);
my $line2_fh = openline($line2);
my $out_temp = get("http://www.temperatur.nu/termo/jagarvallen/temp.txt");
chomp($out_temp);
my $in_temp = `cat /mnt/owfs/uncached/10.1B5350020800/temperature | tr -d ' '`;
$in_temp =~ s/(..\..).*/$1/;
my $line1 = "Ute:$out_tempß";
my $line1 = $line1 . ' ';
$line1 = substr($line1,0,11);
my @timearr = localtime(time());
$line1 = $line1 . $timearr[2] . ':' . $timearr[1];
my $line2 = "Inne: $in_tempß";
my $doorlock = `cat /mnt/owfs/12.776B45000000/sensed.A`;
if ($doorlock == 0){
$line2 = $line2 . ' ';
$line2 = substr($line2,0,15);
$line2 = $line2 . 'ô';
}
printaline($line1_fh, $line1);
printaline($line2_fh, $line2);
close($line1_fh);
close($line2_fh);
}
sub resetdisplay {
system("echo '0' > $lcdon; sleep 2; echo '1' > $lcdon");
sleep(10);
}
sub openline {
open(my $fh, '>', $_[0]) or die $!;
autoflush $fh,1;
return $fh;
}
sub printaline {
my $padding = ' ';
my $fh = $_[0];
my $string = substr($_[1],0,16);
print $fh $string;
}
sub clearscreen {
#printaline($line1_fh, ' ');
#printaline($line2_fh, ' ');
}
sub closeandexit {
#print 'closing filehandles' . "\n";
#close($line1_fh);
#close($line2_fh);
exit(0);
}
Kod nedanför kollar dörren och skickar USR1-signal till koden ovan. Hade hoppats på att inotify eller något skulle kunna skicka signalen istället, så man slipper polla filen så ofta som jag gör nedan.. Men inotify verkar inte kunna känna av uppdateringar i owfs, och då jag inte ville lägga mer tid så fick det bli nedan ful-lösning. Poängen är iallafall att dörren-är-låst-visningen i högra hörnet av displayen ska uppdateras så fort en förändring sker, istället för att vänta de 60s som är displayens normala uppdateringsintervall.
Kod: Markera allt
#!/usr/bin/perl
use strict;
my $prev_door = `cat /mnt/owfs/uncached/12.776B45000000/sensed.A`;
while(1){
my $door = `cat /mnt/owfs/uncached/12.776B45000000/sensed.A`;
if ( $prev_door != $door ){
my $pid = `ps -ef | grep display.pl | grep -v grep`;
#system('kill -s SIGUSR1 `ps -ef | grep display.pl | grep -v grep | awk "{print $2}"`');
my @split_array=split(/\s+/, $pid);
#print "sending USR1 to $split_array[1]\n";
kill('USR1', $split_array[1]);
}
$prev_door = $door;
sleep(1);
}