rename module to Biblio::RFID
[Biblio-RFID.git] / lib / RFID / Biblio / Reader / Serial.pm
index 74f8cfa..39282f0 100644 (file)
@@ -1,4 +1,4 @@
-package RFID::Biblio::Reader::Serial;
+package Biblio::RFID::Reader::Serial;
 
 use warnings;
 use strict;
@@ -8,7 +8,7 @@ use Data::Dump qw(dump);
 
 =head1 NAME
 
-RFID::Biblio::Reader::Serial - base class for serial RFID readers
+Biblio::RFID::Reader::Serial - base class for serial RFID readers
 
 =head1 METHODS
 
@@ -23,38 +23,57 @@ sub new {
        my $self = {@_};
        bless $self, $class;
 
-       $self->port;
-
-       $self->init && return $self;
+       $self->port && return $self;
 }
 
 
 =head2 port
 
+Tries to open usb serial ports C</dev/ttyUSB*>
+
   my $serial_obj = $self->port;
 
+To try just one device use C<RFID_DEVICE=/dev/ttyUSB1> enviroment variable
+
 =cut
 
+our $serial_device;
+
 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;
+       my @devices  = $ENV{RFID_DEVICE} ? ( $ENV{RFID_DEVICE} ) : glob '/dev/ttyUSB*';
+       warn "# port devices ",dump(@devices);
 
-       if ( ! $device ) {
-               warn "# no device, serial port not opened\n";
-               return;
-       }
+       foreach my $device ( @devices ) {
 
-       $self->{port} = Device::SerialPort->new( $settings->{device} )
-       || die "can't open serial port: $!\n";
+               next if $serial_device->{$device};
+
+               if ( my $port = Device::SerialPort->new($device) ) {
+
+                       foreach my $opt ( qw/handshake baudrate databits parity stopbits/ ) {
+                               $port->$opt( $settings->{$opt} );
+                       }
+
+                       $self->{port} = $port;
+
+                       warn "# probe by init $device ",ref($self);
+                       if ( $self->init ) {
+                               warn "init OK ", ref($self), " $device settings ",dump $settings;
+                               $serial_device->{$device} = $port;
+                               last;
+                       } else {
+                               $self->{port} = 0;
+                       }
+               }
+       }
 
-       $self->{port}->$_( $settings->{$_} )
-       foreach ( qw/handshake baudrate databits parity stopbits/ );
+       warn "# serial_device ",dump($serial_device);
 
+       return $self->{port};
 }
 
 1
@@ -62,9 +81,9 @@ __END__
 
 =head1 SEE ALSO
 
-L<RFID::Biblio::Reader::3M810>
+L<Biblio::RFID::Reader::3M810>
 
-L<RFID::Biblio::Reader::CPRM01>
+L<Biblio::RFID::Reader::CPRM01>
 
-L<RFID::Biblio::Reader::API>
+L<Biblio::RFID::Reader::API>