Merge branch 'master' of github.com:dpavlin/RFID-Biblio
authorDobrica Pavlinusic <dpavlin@rot13.org>
Thu, 29 Jul 2010 16:54:59 +0000 (18:54 +0200)
committerDobrica Pavlinusic <dpavlin@rot13.org>
Thu, 29 Jul 2010 16:54:59 +0000 (18:54 +0200)
lib/RFID/Biblio.pm
lib/RFID/Biblio/Readers.pm
lib/RFID/Biblio/librfid.pm [new file with mode: 0644]
scripts/RFID-JSONP-server.pl
t/30-librfid.t [new file with mode: 0755]

index 4f3499d..df44707 100644 (file)
@@ -64,9 +64,14 @@ sub port {
        return $self->{port} if defined $self->{port};
 
        my $settings = $self->serial_settings;
-       $settings->{device} ||= $ENV{RFID_DEVICE};
+       my $device   = $settings->{device} ||= $ENV{RFID_DEVICE};
        warn "# settings ",dump $settings;
 
+       if ( ! $device ) {
+               warn "# no device, serial port not opened\n";
+               return;
+       }
+
        $self->{port} = Device::SerialPort->new( $settings->{device} )
        || die "can't open serial port: $!\n";
 
index b3ff2f4..9a1106a 100644 (file)
@@ -5,7 +5,7 @@ use strict;
 
 use lib 'lib';
 
-my @readers = ( '3M810', 'CPRM02' );
+my @readers = ( '3M810', 'CPRM02', 'librfid' );
 
 sub available {
        my ( $self, $filter ) = @_;
@@ -25,6 +25,8 @@ sub available {
                }
        }
 
+       die "no readers found" unless @rfid;
+
        return @rfid;
 }
 
diff --git a/lib/RFID/Biblio/librfid.pm b/lib/RFID/Biblio/librfid.pm
new file mode 100644 (file)
index 0000000..bd97aa4
--- /dev/null
@@ -0,0 +1,90 @@
+package RFID::Biblio::librfid;
+
+use warnings;
+use strict;
+
+use base 'RFID::Biblio';
+use RFID::Biblio;
+
+use Data::Dump qw(dump);
+
+=head1 NAME
+
+RFID::Biblio::librfid - execute librfid-tool
+
+=head2 DESCRIPTION
+
+This is wrapper around C<librfid-tool> from
+
+L<http://openmrtd.org/projects/librfid/>
+
+=head2 SYOPSYS
+
+
+
+=cut
+
+sub serial_settings {} # don't open serial
+
+our $bin = '/rest/cvs/librfid/utils/librfid-tool';
+
+sub init {
+       my $self = shift;
+       warn "# no $bin found\n" if ! -e $bin;
+}
+
+sub _grep_tool {
+       my ( $param, $coderef ) = @_;
+
+       warn "# _grep_tool $bin $param\n";
+       open(my $s, '-|', "$bin $param") || die $!;
+       while(<$s>) {
+               chomp;
+               warn "## $_\n";
+
+               my $sid;
+               if ( m/success.+:\s+(.+)/ ) {
+                       $sid = $1;
+                       $sid =~ s/\s*'\s*//g;
+                       $sid = uc join('', reverse split(/\s+/, $sid));
+               }
+
+               $coderef->( $sid );
+       }
+
+
+}
+
+sub _cleanup_sid {
+}
+
+sub inventory {
+
+       my @tags; 
+       _grep_tool '--scan' => sub {
+               my $sid = shift;
+               push @tags, $sid if $sid;
+       };
+       warn "# invetory ",dump(@tags);
+       return @tags;
+}
+
+sub read_blocks {
+
+       my $sid;
+       my $blocks;
+       _grep_tool '--read -1' => sub {
+               $sid ||= shift;
+               $blocks->{$sid}->[$1] = hex2bytes($2)
+               if m/block\[\s*(\d+):.+data.+:\s*(.+)/;
+
+       };
+       warn "# read_blocks ",dump($blocks);
+       return $blocks;
+}
+
+sub write_blocks {}
+sub read_afi {}
+sub write_afi {}
+
+1
index d9ea814..7877fca 100755 (executable)
@@ -23,11 +23,12 @@ my $debug = 1;
 my $listen_port = 9000;                  # pick something not in use
 my $server_url  = "http://localhost:$listen_port";
 
+my $reader = shift @ARGV;
 
 use lib 'lib';
 use RFID::Biblio::RFID501;
-use RFID::Biblio::3M810;
-my $rfid = RFID::Biblio::3M810->new;
+use RFID::Biblio::Readers;
+my $rfid = (RFID::Biblio::Readers->available( $reader ))[0]; # FIXME
 
 my $index_html;
 {
diff --git a/t/30-librfid.t b/t/30-librfid.t
new file mode 100755 (executable)
index 0000000..59d8eb9
--- /dev/null
@@ -0,0 +1,40 @@
+#!/usr/bin/perl
+
+use Test::More;
+use Data::Dump qw(dump);
+
+use lib 'lib';
+
+BEGIN {
+       use_ok( 'RFID::Biblio::librfid' );
+}
+
+ok( my $o = RFID::Biblio::librfid->new( tool => '/rest/cvs/librfid/utils/librfid-tool' ), 'new' );
+
+ok( my @tags = $o->inventory, 'inventory' );
+diag dump @tags;
+
+my $old_afi;
+
+foreach my $tag ( @tags ) {
+
+       ok( my $blocks = $o->read_blocks( $tag ), "read_blocks $tag" );
+
+       ok( my $afi = $o->read_afi( $tag ), "read_afi $tag" );
+
+       ok( $o->write_blocks( $tag, $blocks ), "write_blocks $tag" );
+
+       my $new_afi = "\x42";
+
+       ok( $o->write_afi( $tag, $new_afi ), sprintf( "write_afi %s %x", $tag, $new_afi ) );
+
+       cmp_ok( $o->read_afi( $tag ), 'eq', $new_afi, 'AFI check' );
+
+       ok( $o->write_afi( $tag, $afi ), sprintf( "write_afi %s %x", $tag, $afi ) );
+
+}
+
+ok( my $visible = $o->scan, 'scan' );
+diag dump $visible;
+
+done_testing;