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";
use lib 'lib';
-my @readers = ( '3M810', 'CPRM02' );
+my @readers = ( '3M810', 'CPRM02', 'librfid' );
sub available {
my ( $self, $filter ) = @_;
}
}
+ die "no readers found" unless @rfid;
+
return @rfid;
}
--- /dev/null
+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
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;
{
--- /dev/null
+#!/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;