brmd: Separate serial interface to the brmd::Door package

This commit is contained in:
Petr Baudis 2011-05-07 00:32:00 +02:00
parent 11272e7748
commit 4c3fb05acf

View file

@ -2,9 +2,7 @@
use strict; use strict;
use warnings; use warnings;
use POE qw(Wheel::ReadWrite Filter::Line); use POE;
use Symbol qw(gensym);
use Device::SerialPort;
use HTTP::Status qw/RC_OK/; use HTTP::Status qw/RC_OK/;
use CGI; use CGI;
@ -12,21 +10,17 @@ our $channel = "#brmlab";
our $streamurl = "http://nat.brmlab.cz:8090/brmstream.asf"; our $streamurl = "http://nat.brmlab.cz:8090/brmstream.asf";
our $device = $ARGV[0]; $device ||= "/dev/ttyUSB0"; our $device = $ARGV[0]; $device ||= "/dev/ttyUSB0";
our ($status, $record, $topic) = (0, 0, 'BRMLAB OPEN'); our ($status, $record, $topic) = (0, 0, 'BRMLAB OPEN');
our $serial;
my $serial;
my $irc = brmd::IRC->new(); my $irc = brmd::IRC->new();
my $web = brmd::WWW->new(); my $web = brmd::WWW->new();
my $door = brmd::Door->new();
POE::Session->create( POE::Session->create(
package_states => [ package_states => [
main => [ qw(_default _start) ], main => [ qw(_default _start) ],
], ],
inline_states => {
serial_input => \&serial_input,
serial_error => \&serial_error,
},
heap => { irc => $irc, web => $web }, heap => { irc => $irc, web => $web },
); );
@ -34,17 +28,6 @@ $poe_kernel->run();
sub _start { sub _start {
my $heap = $_[HEAP];
$serial = $heap->{serial} = POE::Wheel::ReadWrite->new(
Handle => serial_open($device),
Filter => POE::Filter::Line->new(
InputLiteral => "\x0A", # Received line endings.
OutputLiteral => "\x0A", # Sent line endings.
),
InputEvent => "serial_input",
ErrorEvent => "serial_error",
) or die "Oh ooops! $!";
} }
sub _default { sub _default {
@ -102,7 +85,56 @@ sub record_update {
} }
## Brmdoor serial ## Door serial
package brmd::Door;
use POE qw(Wheel::ReadWrite Filter::Line);
use Symbol qw(gensym);
use Device::SerialPort;
sub new {
my $class = shift;
my $self = bless { }, $class;
POE::Session->create(
object_states => [
$self => [ qw(_start _default
serial_input serial_error) ],
],
);
return $self;
}
sub _start {
$_[KERNEL]->alias_set("$_[OBJECT]");
$serial = $_[HEAP]->{serial} = POE::Wheel::ReadWrite->new(
Handle => serial_open($device),
Filter => POE::Filter::Line->new(
InputLiteral => "\x0A", # Received line endings.
OutputLiteral => "\x0A", # Sent line endings.
),
InputEvent => "serial_input",
ErrorEvent => "serial_error",
) or die "Door fail: $!";
}
sub _default {
my ($event, $args) = @_[ARG0 .. $#_];
my @output = ( (scalar localtime), "Door $event: " );
for my $arg (@$args) {
if ( ref $arg eq 'ARRAY' ) {
push( @output, '[' . join(', ', @$arg ) . ']' );
}
else {
push( @output, "'$arg'" );
}
}
print join ' ', @output, "\n";
}
sub serial_open { sub serial_open {
my ($device) = @_; my ($device) = @_;
@ -132,11 +164,11 @@ sub serial_input {
record_update($cur_record); record_update($cur_record);
} }
if ($brm =~ s/^CARD //) { if ($brm =~ s/^CARD //) {
print "from brmdoor: $input\n"; print "from door: $input\n";
if ($brm =~ /^UNKNOWN/) { if ($brm =~ /^UNKNOWN/) {
$poe_kernel->post( $irc, 'notify' => "[brmdoor] unauthorized access denied!" ); $poe_kernel->post( $irc, 'notify' => "[door] unauthorized access denied!" );
} else { } else {
$poe_kernel->post( $irc, 'notify' => "[brmdoor] unlocked by: \002$brm" ); $poe_kernel->post( $irc, 'notify' => "[door] unlocked by: \002$brm" );
} }
} }
} }