brmd status_update, record_update: Transform to events, introduce event registration

This commit is contained in:
Petr Baudis 2011-05-07 02:00:42 +02:00
parent dbdd8e706b
commit 69cdcabd1e

View file

@ -18,15 +18,18 @@ my $stream = brmd::Stream->new();
POE::Session->create( POE::Session->create(
package_states => [ package_states => [
main => [ qw(_default _start) ], main => [ qw(_default _start
status_update record_update) ],
], ],
heap => { irc => $irc, web => $web, stream => $stream }, heap => { irc => $irc, web => $web, door => $door, stream => $stream },
); );
$poe_kernel->run(); $poe_kernel->run();
sub _start { sub _start {
$poe_kernel->post($_[HEAP]->{web}, 'register');
$poe_kernel->post($_[HEAP]->{door}, 'register');
} }
sub _default { sub _default {
@ -53,14 +56,14 @@ sub record_str {
} }
sub status_update { sub status_update {
my ($newstatus) = @_; my ($self, $newstatus) = @_[OBJECT, ARG0];
$status = $newstatus; $status = $newstatus;
my $st = status_str(); my $st = status_str();
$poe_kernel->post( $irc, 'notify_update', 'brmstatus', $st ); $poe_kernel->post( $irc, 'notify_update', 'brmstatus', $st );
} }
sub record_update { sub record_update {
my ($newrecord) = @_; my ($self, $newrecord) = @_[OBJECT, ARG0];
$record = $newrecord; $record = $newrecord;
if ($record) { if ($record) {
$poe_kernel->post( $stream, 'stream_start' ); $poe_kernel->post( $stream, 'stream_start' );
@ -88,7 +91,7 @@ sub new {
POE::Session->create( POE::Session->create(
object_states => [ object_states => [
$self => [ qw(_start _default $self => [ qw(_start _default register
serial_input serial_error) ], serial_input serial_error) ],
], ],
); );
@ -125,6 +128,13 @@ sub _default {
print join ' ', @output, "\n"; print join ' ', @output, "\n";
} }
sub register {
my ($self, $sender) = @_[OBJECT, SENDER];
my $sid = $sender->ID;
$poe_kernel->refcount_increment($sid, 'observer_WWW'); # XXX: No decrement
push (@{$self->{'observers'}}, $sid);
}
sub serial_open { sub serial_open {
my ($device) = @_; my ($device) = @_;
# Open a serial port, and tie it to a file handle for POE. # Open a serial port, and tie it to a file handle for POE.
@ -142,15 +152,19 @@ sub serial_open {
} }
sub serial_input { sub serial_input {
my ($input) = ($_[ARG0]); my ($self, $input) = @_[OBJECT, ARG0];
print ((scalar localtime)." $input\n"); print ((scalar localtime)." $input\n");
$input =~ /^(\d) (\d) (.*)$/ or return; $input =~ /^(\d) (\d) (.*)$/ or return;
my ($cur_status, $cur_record, $brm) = ($1, $2, $3); my ($cur_status, $cur_record, $brm) = ($1, $2, $3);
if ($cur_status != $status) { if ($cur_status != $status) {
status_update($cur_status); foreach (@{$self->{observers}}) {
$poe_kernel->post($_, 'status_update', $cur_status);
}
} }
if ($cur_record != $record) { if ($cur_record != $record) {
record_update($cur_record); foreach (@{$self->{observers}}) {
$poe_kernel->post($_, 'record_update', $cur_record);
}
} }
if ($brm =~ s/^CARD //) { if ($brm =~ s/^CARD //) {
print "from door: $input\n"; print "from door: $input\n";
@ -188,7 +202,7 @@ sub new {
"/brmstatus.js" => \&web_brmstatus_js, "/brmstatus.js" => \&web_brmstatus_js,
"/brmstatus.png" => \&web_brmstatus_png, "/brmstatus.png" => \&web_brmstatus_png,
"/brmstatus.txt" => \&web_brmstatus_txt, "/brmstatus.txt" => \&web_brmstatus_txt,
"/brmstatus-switch" => \&web_brmstatus_switch, "/brmstatus-switch" => sub { $self->web_brmstatus_switch(@_) },
"/" => \&web_index "/" => \&web_index
}, },
Headers => {Server => 'brmd/xxx'}, Headers => {Server => 'brmd/xxx'},
@ -196,7 +210,7 @@ sub new {
POE::Session->create( POE::Session->create(
object_states => [ object_states => [
$self => [ qw(_start _default) ], $self => [ qw(_start _default register) ],
], ],
heap => { web => $web }, heap => { web => $web },
); );
@ -223,6 +237,13 @@ sub _default {
print join ' ', @output, "\n"; print join ' ', @output, "\n";
} }
sub register {
my ($self, $sender) = @_[OBJECT, SENDER];
my $sid = $sender->ID;
$poe_kernel->refcount_increment($sid, 'observer_WWW'); # XXX: No decrement
push (@{$self->{'observers'}}, $sid);
}
sub disable_caching { sub disable_caching {
my ($response) = @_; my ($response) = @_;
$response->push_header("Cache-Control", "no-cache, must-revalidate"); $response->push_header("Cache-Control", "no-cache, must-revalidate");
@ -345,7 +366,7 @@ sub web_brmstatus_png {
} }
sub web_brmstatus_switch { sub web_brmstatus_switch {
my ($request, $response) = @_; my ($self, $request, $response) = @_;
my $q = new CGI($request->content); my $q = new CGI($request->content);
my $nick = $q->param('nick'); my $nick = $q->param('nick');
@ -356,7 +377,9 @@ sub web_brmstatus_switch {
$serial->flush(); $serial->flush();
$poe_kernel->post($irc, 'notify_manual_update', 'brmstatus', $nick ); $poe_kernel->post($irc, 'notify_manual_update', 'brmstatus', $nick );
main::status_update($newstatus); foreach (@{$self->{observers}}) {
$poe_kernel->post($_, 'status_update', $newstatus);
}
$response->protocol("HTTP/1.1"); $response->protocol("HTTP/1.1");
$response->code(302); $response->code(302);