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};
69 $self->_invalidate_tag( $tag );
74 warn "## tags ",dump($self);
76 return grep { $self->{inventory}->{$_} } keys %{ $self->{inventory} };
81 my $blocks_arrayref = $rfid->blocks( $tag );
85 my $afi = $rfid->afi( $tag );
89 sub blocks { $_[0]->{ 'blocks' }->{$_[1]} || die "no blocks for $_[1]"; };
90 sub afi { $_[0]->{ 'afi' }->{$_[1]} || die "no afi for $_[1]"; };
94 =head2 _invalidate_tag
96 $rfid->_invalidate_tag( $tag );
100 sub _invalidate_tag {
101 my ( $self, $tag ) = @_;
102 delete $self->{'blocks'}->{$tag};
103 delete $self->{'afi'}->{$tag};
104 delete $self->{'inventory'}->{$tag};
105 warn "# _invalidate_tag $tag";
110 Probe each RFID reader supported and returns succefull ones
112 my $rfid_readers = RFID::Biblio::Reader->_available( $regex_filter );
116 my @readers = ( '3M810', 'CPRM02', 'librfid' );
119 my ( $self, $filter ) = @_;
121 $filter = '' unless defined $filter;
123 warn "# filter: $filter";
127 foreach my $reader ( @readers ) {
128 next if $filter && $reader !~ /$filter/i;
129 my $module = "RFID::Biblio::Reader::$reader";
132 if ( my $rfid = $module->new( device => '/dev/ttyUSB0' ) ) {
134 warn "# added $module\n";
136 warn "# ignored $module\n";
140 die "no readers found" unless @rfid;
147 On any other function calls, we just marshall to all readers
151 # we don't want DESTROY to fallback into AUTOLOAD
157 my $command = $AUTOLOAD;
162 foreach my $r ( @{ $self->{_readers} } ) {
163 push @out, $r->$command(@_);
166 $self->_invalidate_tag( $_[0] ) if $command =~ m/write/;
176 =head2 RFID reader implementations
178 L<RFID::Biblio::Reader::3M810>
180 L<RFID::Biblio::Reader::CPRM02>
182 L<RFID::Biblio::Reader::librfid>