From 8da60cfabcba9320cf5649439aa8b482147de5bf Mon Sep 17 00:00:00 2001 From: Dobrica Pavlinusic Date: Fri, 6 Aug 2010 20:09:25 +0200 Subject: [PATCH] scatch new application level API --- lib/RFID/Biblio/Readers.pm | 57 ++++++++++++++++++++++++++++++++++++++ scripts/scan.pl | 24 +++++++--------- t/50-Readers.t | 7 +++++ 3 files changed, 74 insertions(+), 14 deletions(-) diff --git a/lib/RFID/Biblio/Readers.pm b/lib/RFID/Biblio/Readers.pm index 4cac2b3..8078aa1 100644 --- a/lib/RFID/Biblio/Readers.pm +++ b/lib/RFID/Biblio/Readers.pm @@ -3,7 +3,10 @@ package RFID::Biblio::Readers; use warnings; use strict; +use Data::Dump qw(dump); +use Time::HiRes; use lib 'lib'; +use RFID::Biblio; =head1 NAME @@ -25,6 +28,60 @@ sub new { 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 diff --git a/scripts/scan.pl b/scripts/scan.pl index 93f521c..9ad003c 100755 --- a/scripts/scan.pl +++ b/scripts/scan.pl @@ -17,21 +17,17 @@ GetOptions( 'reader=s', => \$reader, ) || die $!; -my @rfid = RFID::Biblio::Readers->available( $reader ); +my $rfid = RFID::Biblio::Readers->new( $reader ); 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; diff --git a/t/50-Readers.t b/t/50-Readers.t index 175dcc4..1081af8 100755 --- a/t/50-Readers.t +++ b/t/50-Readers.t @@ -11,6 +11,13 @@ BEGIN { 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; -- 2.20.1