X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=lib%2FRFID%2FBiblio.pm;h=88014a41199c4aa807699d464428c933de19927f;hb=4dee69b23eb8e5feda0984e447ad0d7a1e1d54d3;hp=c7adf9e0799daf5c60259cfa7c3d15b0af55de7d;hpb=c9d9bc0b6122329c897c6d6079c21471d897ee75;p=Biblio-RFID.git diff --git a/lib/RFID/Biblio.pm b/lib/RFID/Biblio.pm index c7adf9e..88014a4 100644 --- a/lib/RFID/Biblio.pm +++ b/lib/RFID/Biblio.pm @@ -4,150 +4,62 @@ use warnings; use strict; use base 'Exporter'; -our @EXPORT = qw( hex2bytes as_hex hex_tag ); +our @EXPORT = qw( hex2bytes as_hex hex_tag $debug ); -use Device::SerialPort qw(:STAT); use Data::Dump qw(dump); =head1 NAME -RFID::Biblio - support serial RFID devices +RFID::Biblio - perl tools to use different RFID readers for library use =cut -our $VERSION = '0.01'; +our $VERSION = '0.02'; -my $debug = 0; +our $debug = 0; -=head1 SYNOPSIS +=head1 DESCRIPTION -This module tries to support USB serial RFID readers wsing simple API -which is sutable for direct mapping to REST JSONP service. +Main idea is to develop simple API to reader, and than provide useful +abstractions on top of it to quickly write applications to respond on +tags which come in range of RFID reader using L. -Perhaps a little code snippet. +Writing support for new RFID readers should be easy. +L provides documentation on writing support +for different readers. - use RFID::Biblio; +Currently, two serial RFID readers based on L +are implemented: - my $rfid = RFID::Biblio->new( - device => '/dev/ttyUSB0', # with fallback to RFID_DEVICE - ); - my $visible = $rfid->scan; - -=head1 SUBROUTINES/METHODS - -=head2 new - -=cut - -sub new { - my $class = shift; - my $self = {@_}; - bless $self, $class; - - $self->port; - - $self->init; - - return $self; -} - -=head2 port - - my $serial_obj = $self->port; - -=cut - -sub port { - my $self = shift; - - return $self->{port} if defined $self->{port}; - - my $settings = $self->serial_settings; - 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"; - - $self->{port}->$_( $settings->{$_} ) - foreach ( qw/handshake baudrate databits parity stopbits/ ); - -} - -=head2 scan - - my $visible = $rfid->scan; - -Returns hash with keys which match tag UID and values with blocks - -=cut - -sub scan { - my $self = shift; - - warn "# scan tags in reader range\n"; - my @tags = $self->inventory; - - my $visible; - # FIXME this is naive implementation which just discards other tags - foreach my $tag ( @tags ) { - my $blocks = $self->read_blocks( $tag ); - if ( ! $blocks ) { - warn "ERROR: can't read tag $tag\n"; - delete $visible->{$tag}; - } else { - $visible->{$tag} = $blocks->{$tag}; - } - } - - return $visible; -} - - -=head1 MANDATORY IMPLEMENTATIONS - -Each reader must implement following hooks as sub-classes. - -=head2 init - - $self->init; - -=head2 inventory - - my @tags = $self->invetory; - -=head2 read_blocks - - my $hash = $self->read_blocks( $tag ); - -All blocks are under key which is tag UID with array of blocks returned from reader +=over 4 - $hash = { 'E000000123456789' => [ 'blk1', 'blk2', ... ] }; +=item * -L sends tag UID with data payload, so we might expect -to receive response from other tags from protocol specification, +L -=head2 write_blocks +=item * - $self->write_blocks( $tag => $bytes ); +L - $self->write_blocks( $tag => [ 'blk1', 'blk2', ... ] ); +=back -=head2 read_afi +There is also simple read-only reader using shell commands in +L. - my $afi = $self->read_afi( $tag ); +For implementing application take a look at L -=head2 write_afi +C is example of such application. It's local +interface to RFID reader and JSONP REST server. - $self->write_afi( $tag => $afi ); +C is jQuery based JavaScript code which can be inserted +in Koha Library System to provide overlay with tags in range and +check-in/check-out form-fill functionality. +Applications can use L which is some kind of +semi-standard 3M layout or blocks on RFID tags. +=for readme stop =head1 EXPORT @@ -196,30 +108,50 @@ sub as_hex { sub hex_tag { uc(unpack('H16', shift)) } +=head1 WARN -=head1 SUPPORTED READERS +We are installing L handler to controll debug output +based on C<$Biblio::RFID::debug> level -Support for different RFID readers is implemented in subclasses: +=cut + +BEGIN { + $SIG{'__WARN__'} = sub { + my $msg = join(' ', @_); + if ( $msg =~ m/^(#+)/ ) { + my $l = length $1; + return if $l > $debug; + } + warn join(' ', @_); + } +} + +=for readme continue + +=head1 HARDWARE SUPPORT =head2 3M 810 -L +L =head2 CPR-M02 -L +L =head2 librfid -L +L + =head1 AUTHOR Dobrica Pavlinusic, C<< >> +L + =head1 BUGS -Please report any bugs or feature requests to C, or through +Please report any bugs or feature requests to C, or through the web interface at L. I will be notified, and then you'll automatically be notified of progress on your bug as I make changes. @@ -231,6 +163,8 @@ automatically be notified of progress on your bug as I make changes. You can find documentation for this module with the perldoc command. perldoc RFID::Biblio + perldoc RFID::Biblio::Reader + perldoc RFID::Biblio::Reader::API You can also look for information at: