#!/usr/bin/perl -w
+use POSIX qw();
use IO::Handle;
use IO::Select;
use Date::Format;
+use Fcntl;
use strict;
-my $url_door_open = "https://www.realraum.at/";
-my $url_door_closed = "https://www.realraum.at/";
+my $url_door_open = 'https://www.realraum.at/cgi/status.cgi?pass=jako16&set=%3Chtml%3E%3Cbody%20bgcolor=%22lime%22%3E%3Ch3%3E%3Ccenter%3ETuer%20ist%20Offen%3C/center%3E%3C/h3%3E%3C/body%3E%3C/html%3E';
+my $url_door_closed = 'https://www.realraum.at/cgi/status.cgi?pass=jako16&set=%3Chtml%3E%3Cbody%20bgcolor=%22red%22%3E%3Ch3%3E%3Ccenter%3ETuer%20ist%20Geschlossen%3C/center%3E%3C/h3%3E%3C/body%3E%3C/html%3E';
-my $door_ttyS = "/dev/ttyUSB0";
+my $door_ttyusb_dev = "/dev/ttyUSB0";
my $fifofile = "/tmp/door_cmd.fifo";
unless( -p $fifofile)
{
$logfile->autoflush(1);
sub door_log
{
- print $logfile Date::Format::time2str("%Y-%m-%d %T: ",time()).shift()."\n";
+ my $msg=shift;
+ chomp($msg);
+ print $logfile Date::Format::time2str("%Y-%m-%d %T: ",time()).$msg."\n";
}
door_log("Door Daemon started");
$main::door_open=1;
$main::door_closed=0;
$main::tuer_status=$main::door_closed;
+$main::tuer_future_status=$main::tuer_status;
#system('wget --no-check-certificate -q -O /dev/null '.$url_door_closed.' &>/dev/null &');
my $fifo=undef;
-my $ttyS=undef;
+my $ttyusb=undef;
sub handler
{
#local($sig) = @_;
+ print $ttyusb "c" if (defined $ttyusb);
door_log("Door Daemon stopped");
close $logfile;
close $fifo if (defined $fifo);
- close $ttyS if (defined $ttyS);
+ close $ttyusb if (defined $ttyusb);
exit(0);
}
$SIG{'INT'} = 'handler';
$SIG{'QUIT'} = 'handler';
$SIG{'KILL'} = 'handler';
-while (1)
+my $read_set = new IO::Select();
+
+sub open_fifo
{
- unless (defined $fifo) { open($fifo,"< $fifofile"); }
- unless (defined $ttyS) { open($ttyS,"< $door_ttyS"); }
- my $read_set = new IO::Select();
+ #print "open fifo\n";
+ sysopen($fifo,$fifofile, O_RDONLY | O_NONBLOCK);
+ #print "x\n";
$read_set->add($fifo);
- $read_set->add($ttyS);
-
- print $ttyS "s\n";
+}
+
+sub open_usb
+{
+ #print "open usb\n";
+ sysopen($ttyusb, $door_ttyusb_dev, O_RDWR | O_NONBLOCK);
+ $ttyusb->autoflush(1);
+ my $termios = POSIX::Termios->new;
+ $termios->getattr(fileno $ttyusb);
+ $termios->setispeed( &POSIX::B9600 );
+ $termios->setospeed( &POSIX::B9600 );
+ #$termios->setcflag( $termios->getcflag & ~(&POSIX::PARENB | &POSIX::PARODD) & (~&POSIX::CSIZE | &POSIX::CS8));
+ $termios->setattr(fileno $ttyusb);
+ #print "x\n";
+ $read_set->add($ttyusb);
+}
+
+sub close_fifo
+{
+ $read_set->remove($fifo);
+ close($fifo);
+}
+
+sub close_usb
+{
+ $read_set->remove($ttyusb);
+ close($ttyusb);
+}
+
+&open_usb;
+&open_fifo;
+
+print $ttyusb "s";
- do
+while(1)
+{
+ my ($rh_set) = IO::Select->select($read_set, undef, undef);
+ #print "tuer_status_start: ".$main::tuer_status,"\n";
+ sleep(1); #give other end time to finish writing... (bad fix)
+ foreach my $fh (@$rh_set)
{
- my ($rh_set) = IO::Select->select($read_set, undef, undef);
- foreach my $fh (@$rh_set)
+ if ($fh == $fifo)
{
- if ($fh == $fifo)
+ my $fifo_msg = readline($fh);
+ unless ($fifo_msg)
{
- my $fifo_msg = <$fh>;
- if ($fifo_msg =~ /^(\w+)\s*(.*)/)
- {
- handle_cmd($1,$2);
- }
+ close_fifo();
+ #sleep(0.1);
+ open_fifo();
+ last;
+ }
+ if ($fifo_msg =~ /^(\w+)\s*(.*)/)
+ {
+ handle_cmd($1,$2);
}
- elsif ($fh == $ttyS)
+ }
+ elsif ($fh == $ttyusb)
+ {
+ my $ttyusb_msg = readline($fh);
+ last unless ($ttyusb_msg);
+ #print($ttyusb_msg);
+ door_log($door_ttyusb_dev.": ".$ttyusb_msg);
+ if ($ttyusb_msg =~ /took too long!/)
{
- my $ttyS_msg = <$fh>;
- #last unless ($ttyS_msg);
- print($ttyS_msg);
- door_log($door_ttyS.": ".$ttyS_msg);
- my $tuer=$main::tuer_status;
- $tuer=$main::door_open if $ttyS_msg =~ /open/;
- $tuer=$main::door_closed if $ttyS_msg =~ /close/;
- if ($tuer != $main::tuer_status)
+ door_log("Got '".$ttyusb_msg."'. Sending Reset..");
+ print $ttyusb "r";
+ $main::tuer_status=$main::door_closed;
+ $main::tuer_future_status=$main::tuer_status;
+ last;
+ }
+ $main::tuer_status = $main::tuer_future_status if $ttyusb_msg =~ /^Ok/;
+ my $tuer=$main::tuer_status;
+ $tuer=$main::door_open if $ttyusb_msg =~ /open/;
+ $tuer=$main::door_closed if $ttyusb_msg =~ /close|closing/;
+ door_log("$tuer");
+ if (not ($tuer == $main::tuer_status))
+ {
+ $main::tuer_status=$tuer;
+ if ($tuer == $main::door_open)
+ {
+ door_log("change to opened");
+ #print "change to open\n";
+ system('wget --no-check-certificate -q -O /dev/null "'.$url_door_open.'" &>/dev/null &');
+ }
+ else
{
- $main::tuer_status=$tuer;
- if ($tuer == $main::door_open)
- {
- system('wget --no-check-certificate -q -O /dev/null '.$url_door_open.' &>/dev/null &');
- }
- else
- {
- system('wget --no-check-certificate -q -O /dev/null '.$url_door_closed.' &>/dev/null &');
- }
+ #print "change to closed\n";
+ door_log("change to closed");
+ system('wget --no-check-certificate -q -O /dev/null "'.$url_door_closed.'" &>/dev/null &');
}
}
}
- } until (eof $fifo or eof $ttyS);
- if (eof $fifo) {close($fifo); $fifo=undef;}
- if (eof $ttyS) {close($ttyS); $ttyS=undef;}
+ }
+ #print "tuer_status_end: ".$main::tuer_status,"\n------------\n";
}
sub handle_cmd
{
my $cmd = shift;
my $who = shift;
- print "c:'$cmd' w:'$who'\n";
+ #print "c:'$cmd' w:'$who'\n";
my $tuer=$main::tuer_status;
if ($cmd eq "open") { $tuer=$main::door_open; }
elsif ($cmd eq "close") {$tuer=$main::door_closed; }
- elsif ($cmd eq "toggle") {$tuer=!$tuer;}
+ elsif ($cmd eq "toggle") {$tuer= !$tuer;}
elsif ($cmd eq "log") {door_log($who)}
else {door_log("Invalid Command: $cmd $who")}
- if ($tuer != $main::tuer_status)
+ if (not $tuer == $main::tuer_status)
{
+ $main::tuer_future_status=$tuer;
if ($tuer == $main::door_open)
{
door_log("Door opened by $who");
- print $ttyS "o\n";
- system('wget --no-check-certificate -q -O /dev/null '.$url_door_open.' &>/dev/null &');
+ print $ttyusb "o";
+ system('wget --no-check-certificate -q -O /dev/null "'.$url_door_open.'" &>/dev/null &');
}
else
{
door_log("Door closed by $who");
- print $ttyS "c\n";
- system('wget --no-check-certificate -q -O /dev/null '.$url_door_closed.' &>/dev/null &');
+ print $ttyusb "c";
+ system('wget --no-check-certificate -q -O /dev/null "'.$url_door_closed.'" &>/dev/null &');
}
}