scatch new application level API
authorDobrica Pavlinusic <dpavlin@rot13.org>
Fri, 6 Aug 2010 18:09:25 +0000 (20:09 +0200)
committerDobrica Pavlinusic <dpavlin@rot13.org>
Fri, 6 Aug 2010 18:09:25 +0000 (20:09 +0200)
lib/RFID/Biblio/Readers.pm
scripts/scan.pl
t/50-Readers.t

index 4cac2b3..8078aa1 100644 (file)
@@ -3,7 +3,10 @@ package RFID::Biblio::Readers;
 use warnings;
 use strict;
 
 use warnings;
 use strict;
 
+use Data::Dump qw(dump);
+use Time::HiRes;
 use lib 'lib';
 use lib 'lib';
+use RFID::Biblio;
 
 =head1 NAME
 
 
 =head1 NAME
 
@@ -25,6 +28,60 @@ sub new {
        return $self;
 }
 
        return $self;
 }
 
+=head2 tags
+
+  my @visible = $rfid->tags(
+               enter => sub {},
+               leave => sub {},
+  );
+
+=cut
+
+sub tags {
+       my $self = shift;
+       my $triggers = {@_};
+
+       $self->{inventory} ||= {};
+       $self->{inventory}->{$_} = 0 foreach keys %{$self->{inventory}};
+       my $t = time;
+
+       foreach my $rfid ( @{ $self->{_readers} } ) {
+               warn "# inventory on $rfid";
+               my @tags = $rfid->inventory;
+
+               foreach my $tag ( @tags ) {
+
+                       $self->{blocks}->{$tag} ||= $rfid->read_blocks( $tag );
+                       $self->{afi}->{$tag}    ||= $rfid->read_afi( $tag );
+
+                       $triggers->{enter}->( $self, $tag ) if ! $self->{inventory}->{$tag} && $triggers->{enter};
+                       $self->{inventory}->{$tag} = $t;
+
+               }
+
+               foreach my $tag ( grep { $self->{inventory}->{$_} == 0 } keys %{ $self->{inventory} } ) {
+                       $triggers->{leave}->( $self, $tag ) if $triggers->{leave};
+               }
+
+       }
+
+       warn "## tags ",dump($self);
+
+       return grep { $self->{inventory}->{$_} } keys %{ $self->{inventory} };
+}
+
+=head2 blocks
+
+  my $blocks_arrayref = $rfid->blocks( $tag );
+
+=head2 afi
+
+  my $afi = $rfid->afi( $tag );
+
+=cut
+
+sub blocks { $_[0]->{ 'blocks' }->{$_[1]} || die "no blocks for $_[1]"; };
+sub afi    { $_[0]->{ 'afi'    }->{$_[1]} || die "no afi for $_[1]"; };
 
 =head1 PRIVATE
 
 
 =head1 PRIVATE
 
index 93f521c..9ad003c 100755 (executable)
@@ -17,21 +17,17 @@ GetOptions(
        'reader=s', => \$reader,
 ) || die $!;
 
        'reader=s', => \$reader,
 ) || die $!;
 
-my @rfid = RFID::Biblio::Readers->available( $reader );
+my $rfid = RFID::Biblio::Readers->new( $reader );
 
 do {
 
 do {
-       foreach my $rfid ( @rfid ) {
-               my $visible = $rfid->scan;
-               foreach my $tag ( keys %$visible ) {
-                       my $afi = $rfid->read_afi( $tag );
-                       print ref($rfid)
-                               , " $tag AFI: "
-                               , uc unpack('H2', $afi)
-                               , " "
-                               , dump( RFID::Biblio::RFID501->to_hash( join('', @{ $visible->{$tag} }) ) )
-                               , $/
-                               ;
-               }
+       my @visible = $rfid->tags;
+       foreach my $tag ( @visible ) {
+               print $tag
+                       , " AFI: "
+                       , uc unpack('H2', $rfid->afi($tag))
+                       , " "
+                       , dump( RFID::Biblio::RFID501->to_hash( $rfid->blocks($tag) ) )
+                       , $/
+                       ;
        }
        }
-
 } while $loop;
 } while $loop;
index 175dcc4..1081af8 100755 (executable)
@@ -11,6 +11,13 @@ BEGIN {
 
 ok( my $o = RFID::Biblio::Readers->new( shift @ARGV ), 'new' );
 
 
 ok( my $o = RFID::Biblio::Readers->new( shift @ARGV ), 'new' );
 
+ok( my $tags = $o->tags, 'tags' );
+diag dump( $tags );
+
+done_testing();
+
+__END__
+
 ok( my @tags = $o->inventory, 'inventory' );
 diag dump @tags;
 
 ok( my @tags = $o->inventory, 'inventory' );
 diag dump @tags;