X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=lib%2FRFID%2FBiblio%2FReader.pm;h=c4d31dc721e866527192f285c9168c0333b4cfb9;hb=08d631fc323bcc750cddfc243a364d81a2df233f;hp=58683114475b1846aeb8c97ec4183d4f57e261e6;hpb=9169bf2f8daa31ad3beab0a890ee8d762c92c810;p=Biblio-RFID.git diff --git a/lib/RFID/Biblio/Reader.pm b/lib/RFID/Biblio/Reader.pm index 5868311..c4d31dc 100644 --- a/lib/RFID/Biblio/Reader.pm +++ b/lib/RFID/Biblio/Reader.pm @@ -10,7 +10,12 @@ use RFID::Biblio; =head1 NAME -RFID::Biblio::Reader - autodetect supported readers +RFID::Biblio::Reader - simple way to write RFID applications in perl + +=head1 DESCRIPTION + +This module will probe all available readers and use calls from +L to invoke correct reader. =head1 FUNCTIONS @@ -41,8 +46,8 @@ sub tags { my $self = shift; my $triggers = {@_}; - $self->{inventory} ||= {}; - $self->{inventory}->{$_} = 0 foreach keys %{$self->{inventory}}; + $self->{_tags} ||= {}; + $self->{_tags}->{$_}->{inventory} = 0 foreach keys %{$self->{_tags}}; my $t = time; foreach my $rfid ( @{ $self->{_readers} } ) { @@ -51,23 +56,36 @@ sub tags { foreach my $tag ( @tags ) { - $self->{blocks}->{$tag} ||= $rfid->read_blocks( $tag )->{$tag}; - $self->{afi}->{$tag} ||= $rfid->read_afi( $tag ); + if ( ! exists $self->{_tags}->{$tag} ) { + if ( my $blocks = $rfid->read_blocks($tag) ) { + $self->{blocks}->{$tag} = $blocks->{$tag} || die "no $tag in ",dump($blocks); + } else { + $self->_invalidate_tag( $tag ); + next; + } + if ( my $afi = $rfid->read_afi($tag) ) { + $self->{_tags}->{$tag}->{afi} = $afi; + } else { + $self->_invalidate_tag( $tag ); + next; + } + } $triggers->{enter}->( $self, $tag ) if ! $self->{inventory}->{$tag} && $triggers->{enter}; - $self->{inventory}->{$tag} = $t; + $self->{_tags}->{$tag}->{intentory} = $t; } - foreach my $tag ( grep { $self->{inventory}->{$_} == 0 } keys %{ $self->{inventory} } ) { + foreach my $tag ( grep { $self->{_tags}->{$_}->{inventory} == 0 } keys %{ $self->{_tags} } ) { $triggers->{leave}->( $self, $tag ) if $triggers->{leave}; + $self->_invalidate_tag( $tag ); } } - warn "## tags ",dump($self); + warn "## _tags ",dump( $self->{_tags} ); - return grep { $self->{inventory}->{$_} } keys %{ $self->{inventory} }; + return grep { $self->{_tags}->{$_}->{inventory} } keys %{ $self->{_tags} }; } =head2 blocks @@ -80,11 +98,23 @@ sub tags { =cut -sub blocks { $_[0]->{ 'blocks' }->{$_[1]} || die "no blocks for $_[1]"; }; -sub afi { $_[0]->{ 'afi' }->{$_[1]} || die "no afi for $_[1]"; }; +sub blocks { $_[0]->{_tags}->{$_[1]}->{ 'blocks' } || die "no blocks for $_[1]"; }; +sub afi { $_[0]->{_tags}->{$_[1]}->{ 'afi' } || die "no afi for $_[1]"; }; =head1 PRIVATE +=head2 _invalidate_tag + + $rfid->_invalidate_tag( $tag ); + +=cut + +sub _invalidate_tag { + my ( $self, $tag ) = @_; + my $old = delete $self->{_tags}->{$tag}; + warn "# _invalidate_tag $tag ", dump($old); +} + =head2 _available Probe each RFID reader supported and returns succefull ones @@ -106,7 +136,7 @@ sub _available { foreach my $reader ( @readers ) { next if $filter && $reader !~ /$filter/i; - my $module = "RFID::Biblio::$reader"; + my $module = "RFID::Biblio::Reader::$reader"; eval "use $module"; die $@ if $@; if ( my $rfid = $module->new( device => '/dev/ttyUSB0' ) ) { @@ -143,6 +173,8 @@ sub AUTOLOAD { push @out, $r->$command(@_); } + $self->_invalidate_tag( $_[0] ) if $command =~ m/write/; + return @out; }