1 package RFID::Biblio::Reader;
6 use Data::Dump qw(dump);
13 RFID::Biblio::Reader - simple way to write RFID applications in perl
17 This module will probe all available readers and use calls from
18 L<RFID::Biblio::Reader::API> to invoke correct reader.
24 my $rfid = RFID::Biblio::Reader->new( 'optional reader filter' );
29 my ( $class, $filter ) = @_;
32 $self->{_readers} = [ $self->_available( $filter ) ];
38 my @visible = $rfid->tags(
49 $self->{inventory} ||= {};
50 $self->{inventory}->{$_} = 0 foreach keys %{$self->{inventory}};
53 foreach my $rfid ( @{ $self->{_readers} } ) {
54 warn "# inventory on $rfid";
55 my @tags = $rfid->inventory;
57 foreach my $tag ( @tags ) {
59 $self->{blocks}->{$tag} ||= $rfid->read_blocks( $tag )->{$tag};
60 $self->{afi}->{$tag} ||= $rfid->read_afi( $tag );
62 $triggers->{enter}->( $self, $tag ) if ! $self->{inventory}->{$tag} && $triggers->{enter};
63 $self->{inventory}->{$tag} = $t;
67 foreach my $tag ( grep { $self->{inventory}->{$_} == 0 } keys %{ $self->{inventory} } ) {
68 $triggers->{leave}->( $self, $tag ) if $triggers->{leave};
73 warn "## tags ",dump($self);
75 return grep { $self->{inventory}->{$_} } keys %{ $self->{inventory} };
80 my $blocks_arrayref = $rfid->blocks( $tag );
84 my $afi = $rfid->afi( $tag );
88 sub blocks { $_[0]->{ 'blocks' }->{$_[1]} || die "no blocks for $_[1]"; };
89 sub afi { $_[0]->{ 'afi' }->{$_[1]} || die "no afi for $_[1]"; };
93 =head2 _invalidate_tag
95 $rfid->_invalidate_tag( $tag );
100 my ( $self, $tag ) = @_;
101 delete $self->{'blocks'}->{$tag};
102 delete $self->{'afi'}->{$tag};
103 delete $self->{'inventory'}->{$tag};
104 warn "# _invalidate_tag $tag";
109 Probe each RFID reader supported and returns succefull ones
111 my $rfid_readers = RFID::Biblio::Reader->_available( $regex_filter );
115 my @readers = ( '3M810', 'CPRM02', 'librfid' );
118 my ( $self, $filter ) = @_;
120 $filter = '' unless defined $filter;
122 warn "# filter: $filter";
126 foreach my $reader ( @readers ) {
127 next if $filter && $reader !~ /$filter/i;
128 my $module = "RFID::Biblio::Reader::$reader";
131 if ( my $rfid = $module->new( device => '/dev/ttyUSB0' ) ) {
133 warn "# added $module\n";
135 warn "# ignored $module\n";
139 die "no readers found" unless @rfid;
146 On any other function calls, we just marshall to all readers
150 # we don't want DESTROY to fallback into AUTOLOAD
156 my $command = $AUTOLOAD;
161 foreach my $r ( @{ $self->{_readers} } ) {
162 push @out, $r->$command(@_);
165 $self->_invalidate_tag( $_[0] ) if $command =~ m/write/;
175 =head2 RFID reader implementations
177 L<RFID::Biblio::Reader::3M810>
179 L<RFID::Biblio::Reader::CPRM02>
181 L<RFID::Biblio::Reader::librfid>