From 87b929ff4c6b55c832059bd45d938bb6954949de Mon Sep 17 00:00:00 2001 From: Petr Baudis Date: Tue, 26 Apr 2011 23:19:00 +0200 Subject: [PATCH] brmd: Support for manual status override using web button --- brmd/brmd.pl | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/brmd/brmd.pl b/brmd/brmd.pl index 1838b05..d51fb21 100755 --- a/brmd/brmd.pl +++ b/brmd/brmd.pl @@ -7,11 +7,14 @@ use POE qw(Component::IRC Component::IRC::Plugin::Connector Component::Server::H use Symbol qw(gensym); use Device::SerialPort; use HTTP::Status qw/RC_OK/; +use CGI; our $channel = "#brmlab"; our $device = "/dev/ttyUSB0"; our ($status, $record, $topic) = (0, 0, 'BRMLAB OPEN'); +my $serial; + my $irc = POE::Component::IRC->spawn( nick => 'brmbot', ircname => 'The Brmlab Automaton', @@ -25,6 +28,7 @@ my $web = POE::Component::Server::HTTP->new( "/brmstatus.js" => \&web_brmstatus_js, "/brmstatus.png" => \&web_brmstatus_png, "/brmstatus.txt" => \&web_brmstatus_txt, + "/brmstatus-switch" => \&web_brmstatus_switch, "/" => \&web_index }, Headers => {Server => 'brmd/xxx'}, @@ -48,7 +52,7 @@ $poe_kernel->run(); sub _start { my $heap = $_[HEAP]; - $heap->{serial} = POE::Wheel::ReadWrite->new( + $serial = $heap->{serial} = POE::Wheel::ReadWrite->new( Handle => serial_open($device), Filter => POE::Filter::Line->new( InputLiteral => "\x0A", # Received line endings. @@ -219,6 +223,17 @@ sub web_brmstatus_html { brmstatus

brmlab is $st

+
+

Manual Override

+

Manual override persists until the next time the physical button is switched.

+

+

+Perpetrator: + + +
+

+
EOT ); @@ -275,6 +290,27 @@ sub web_brmstatus_png { return RC_OK; } +sub web_brmstatus_switch { + my ($request, $response) = @_; + + my $q = new CGI($request->content); + my $nick = $q->param('nick'); + + my $newstatus = not $status; + + $serial->put('s'.$newstatus); + $serial->flush(); + + $irc->yield (privmsg => $channel => "[brmstatus] Manual override by $nick (web)" ); + status_update($newstatus); + + $response->protocol("HTTP/1.1"); + $response->code(302); + $response->header('Location' => 'brmstatus.html'); + + return RC_OK; +} + ## IRC