X-Git-Url: http://git.rot13.org/?p=Biblio-RFID.git;a=blobdiff_plain;f=lib%2FRFID%2FBiblio%2FReaders.pm;h=8078aa14b30d4fd0bc0abec2a3c01cfc622ae802;hp=82503416ccca901a4767f8a15ac963e9d3413212;hb=8da60cfabcba9320cf5649439aa8b482147de5bf;hpb=cf69953de8909641f4b4124410e7d29f9592eadc diff --git a/lib/RFID/Biblio/Readers.pm b/lib/RFID/Biblio/Readers.pm index 8250341..8078aa1 100644 --- a/lib/RFID/Biblio/Readers.pm +++ b/lib/RFID/Biblio/Readers.pm @@ -1,33 +1,111 @@ package RFID::Biblio::Readers; +use warnings; +use strict; + +use Data::Dump qw(dump); +use Time::HiRes; +use lib 'lib'; +use RFID::Biblio; + =head1 NAME RFID::Biblio::Readers - autodetect supported readers =head1 FUNCTIONS -=head2 available +=head2 new -Probe each RFID reader supported and returns succefull ones + my $rfid = RFID::Biblio::Readers->new( 'optional reader filter' ); - my @rfid = RFID::Biblio::Readers->available( $regex_filter ); +=cut + +sub new { + my ( $class, $filter ) = @_; + my $self = {}; + bless $self, $class; + $self->{_readers} = [ $self->_available( $filter ) ]; + return $self; +} + +=head2 tags + + my @visible = $rfid->tags( + enter => sub {}, + leave => sub {}, + ); =cut -use warnings; -use strict; +sub tags { + my $self = shift; + my $triggers = {@_}; -use lib 'lib'; + $self->{inventory} ||= {}; + $self->{inventory}->{$_} = 0 foreach keys %{$self->{inventory}}; + my $t = time; + + foreach my $rfid ( @{ $self->{_readers} } ) { + warn "# inventory on $rfid"; + my @tags = $rfid->inventory; + + foreach my $tag ( @tags ) { + + $self->{blocks}->{$tag} ||= $rfid->read_blocks( $tag ); + $self->{afi}->{$tag} ||= $rfid->read_afi( $tag ); + + $triggers->{enter}->( $self, $tag ) if ! $self->{inventory}->{$tag} && $triggers->{enter}; + $self->{inventory}->{$tag} = $t; + + } + + foreach my $tag ( grep { $self->{inventory}->{$_} == 0 } keys %{ $self->{inventory} } ) { + $triggers->{leave}->( $self, $tag ) if $triggers->{leave}; + } + + } + + warn "## tags ",dump($self); + + return grep { $self->{inventory}->{$_} } keys %{ $self->{inventory} }; +} + +=head2 blocks + + my $blocks_arrayref = $rfid->blocks( $tag ); + +=head2 afi + + my $afi = $rfid->afi( $tag ); + +=cut + +sub blocks { $_[0]->{ 'blocks' }->{$_[1]} || die "no blocks for $_[1]"; }; +sub afi { $_[0]->{ 'afi' }->{$_[1]} || die "no afi for $_[1]"; }; + +=head1 PRIVATE + +=head2 _available + +Probe each RFID reader supported and returns succefull ones + + my $rfid_readers = RFID::Biblio::Readers->_available( $regex_filter ); + +=cut my @readers = ( '3M810', 'CPRM02', 'librfid' ); -sub available { +sub _available { my ( $self, $filter ) = @_; + $filter = '' unless defined $filter; + + warn "# filter: $filter"; + my @rfid; foreach my $reader ( @readers ) { - next if $reader !~ /$filter/i; + next if $filter && $reader !~ /$filter/i; my $module = "RFID::Biblio::$reader"; eval "use $module"; die $@ if $@; @@ -44,3 +122,40 @@ sub available { return @rfid; } +=head1 AUTOLOAD + +On any other function calls, we just marshall to all readers + +=cut + +# we don't want DESTROY to fallback into AUTOLOAD +sub DESTROY {} + +our $AUTOLOAD; +sub AUTOLOAD { + my $self = shift; + my $command = $AUTOLOAD; + $command =~ s/.*://; + + my @out; + + foreach my $r ( @{ $self->{_readers} } ) { + push @out, $r->$command(@_); + } + + return @out; +} + +1 +__END__ + +=head1 SEE ALSO + +=head2 RFID reader implementations + +L + +L + +L +