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->{_tags} ||= {};
50 $self->{_tags}->{$_}->{inventory} = 0 foreach keys %{$self->{_tags}};
53 foreach my $rfid ( @{ $self->{_readers} } ) {
54 warn "# inventory on $rfid";
55 my @tags = $rfid->inventory;
57 foreach my $tag ( @tags ) {
59 if ( ! exists $self->{_tags}->{$tag} ) {
60 if ( my $blocks = $rfid->read_blocks($tag) ) {
61 $self->{blocks}->{$tag} = $blocks->{$tag} || die "no $tag in ",dump($blocks);
63 $self->_invalidate_tag( $tag );
66 if ( my $afi = $rfid->read_afi($tag) ) {
67 $self->{_tags}->{$tag}->{afi} = $afi;
69 $self->_invalidate_tag( $tag );
74 $triggers->{enter}->( $self, $tag ) if ! $self->{inventory}->{$tag} && $triggers->{enter};
75 $self->{_tags}->{$tag}->{intentory} = $t;
79 foreach my $tag ( grep { $self->{_tags}->{$_}->{inventory} == 0 } keys %{ $self->{_tags} } ) {
80 $triggers->{leave}->( $self, $tag ) if $triggers->{leave};
81 $self->_invalidate_tag( $tag );
86 warn "## _tags ",dump( $self->{_tags} );
88 return grep { $self->{_tags}->{$_}->{inventory} } keys %{ $self->{_tags} };
93 my $blocks_arrayref = $rfid->blocks( $tag );
97 my $afi = $rfid->afi( $tag );
101 sub blocks { $_[0]->{_tags}->{$_[1]}->{ 'blocks' } || die "no blocks for $_[1]"; };
102 sub afi { $_[0]->{_tags}->{$_[1]}->{ 'afi' } || die "no afi for $_[1]"; };
106 =head2 _invalidate_tag
108 $rfid->_invalidate_tag( $tag );
112 sub _invalidate_tag {
113 my ( $self, $tag ) = @_;
114 my $old = delete $self->{_tags}->{$tag};
115 warn "# _invalidate_tag $tag ", dump($old);
120 Probe each RFID reader supported and returns succefull ones
122 my $rfid_readers = RFID::Biblio::Reader->_available( $regex_filter );
126 my @readers = ( '3M810', 'CPRM02', 'librfid' );
129 my ( $self, $filter ) = @_;
131 $filter = '' unless defined $filter;
133 warn "# filter: $filter";
137 foreach my $reader ( @readers ) {
138 next if $filter && $reader !~ /$filter/i;
139 my $module = "RFID::Biblio::Reader::$reader";
142 if ( my $rfid = $module->new( device => '/dev/ttyUSB0' ) ) {
144 warn "# added $module\n";
146 warn "# ignored $module\n";
150 die "no readers found" unless @rfid;
157 On any other function calls, we just marshall to all readers
161 # we don't want DESTROY to fallback into AUTOLOAD
167 my $command = $AUTOLOAD;
172 foreach my $r ( @{ $self->{_readers} } ) {
173 push @out, $r->$command(@_);
176 $self->_invalidate_tag( $_[0] ) if $command =~ m/write/;
186 =head2 RFID reader implementations
188 L<RFID::Biblio::Reader::3M810>
190 L<RFID::Biblio::Reader::CPRM02>
192 L<RFID::Biblio::Reader::librfid>