improve documentation
[Biblio-RFID.git] / lib / RFID / Biblio.pm
index 29c06a9..daccc32 100644 (file)
@@ -6,152 +6,57 @@ use strict;
 use base 'Exporter';
 our @EXPORT = qw( hex2bytes as_hex hex_tag );
 
-use Device::SerialPort qw(:STAT);
 use Data::Dump qw(dump);
 
 =head1 NAME
 
-RFID::Biblio - easy to use API for writing RFID enabled appliaction
+RFID::Biblio - perl tools to use different RFID readers for library use 
 
 =cut
 
-our $VERSION = '0.01';
+our $VERSION = '0.02';
 
 my $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<RFID::Biblio::Reader>.
 
-Perhaps a little code snippet.
+Writing support for new RFID readers should be easy.
+L<RFID::Biblio::Reader::API> provides documentation on writing support
+for different readers.
 
-       use RFID::Biblio;
+Currently, two serial RFID readers based on L<RFID::Biblio::Reader::Serial>
+are implemented:
 
-       my $rfid = RFID::Biblio->new(
-               device => '/dev/ttyUSB0', # with fallback to RFID_DEVICE
-       );
-
-       # invetory tags in reader range and read data from them
-       my $visible = $rfid->scan;
-
-=head1 METHODS
-
-=head2 new
-
-Open serial port (if needed) and init reader
-
-=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 READER IMPLEMENTATION
-
-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
-
-  $hash = { 'E000000123456789' => [ 'blk1', 'blk2', ... ] };
+=over 4
 
-L<RFID::Biblio::3M810> sends tag UID with data payload, so we might expect
-to receive response from other tags from protocol specification, 
+=item *
 
-=head2 write_blocks
+L<RFID::Biblio::Reader::3M810>
 
-  $self->write_blocks( $tag => $bytes );
+=item *
 
-  $self->write_blocks( $tag => [ 'blk1', 'blk2', ... ] );
+L<RFID::Biblio::Reader::CPRM02>
 
-=head2 read_afi
+=back
 
-  my $afi = $self->read_afi( $tag );
+There is also simple read-only reader using shell commands in
+L<RFID::Biblio::Reader::librfid>.
 
-=head2 write_afi
+For implementing application take a look at L<RFID::Biblio::Reader>
 
-  $self->write_afi( $tag => $afi );
+C<scripts/RFID-JSONP-server.pl> is example of such application. It's local
+interface to RFID reader and JSONP REST server.
 
+C<examples/koha-rfid.js> 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.
 
+=for readme stop
 
 =head1 EXPORT
 
@@ -200,22 +105,22 @@ sub as_hex {
 
 sub hex_tag { uc(unpack('H16', shift)) }
 
+=for readme continue
 
-=head1 SUPPORTED READERS
-
-Support for different RFID readers is implemented in subclasses:
+=head1 HARDWARE SUPPORT
 
 =head2 3M 810
 
-L<RFID::Biblio::3M810>
+L<RFID::Biblio::Reader::3M810>
 
 =head2 CPR-M02
 
-L<RFID::Biblio::CPRM02>
+L<RFID::Biblio::Reader::CPRM02>
 
 =head2 librfid
 
-L<RFID::Biblio::librfid>
+L<RFID::Biblio::Reader::librfid>
+
 
 =head1 AUTHOR
 
@@ -223,7 +128,7 @@ Dobrica Pavlinusic, C<< <dpavlin at rot13.org> >>
 
 =head1 BUGS
 
-Please report any bugs or feature requests to C<bug-rfid-serial at rt.cpan.org>, or through
+Please report any bugs or feature requests to C<bug-rfid-biblio at rt.cpan.org>, or through
 the web interface at L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=RFID-Biblio>.  I will be notified, and then you'll
 automatically be notified of progress on your bug as I make changes.
 
@@ -235,6 +140,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: