=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<RFID::Biblio::Reader::API> to invoke correct reader.
=head1 FUNCTIONS
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} } ) {
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
=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
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' ) ) {
push @out, $r->$command(@_);
}
+ $self->_invalidate_tag( $_[0] ) if $command =~ m/write/;
+
return @out;
}