probe usb serial ports
authorDobrica Pavlinusic <dpavlin@rot13.org>
Mon, 9 Aug 2010 17:01:23 +0000 (19:01 +0200)
committerDobrica Pavlinusic <dpavlin@rot13.org>
Mon, 9 Aug 2010 17:01:23 +0000 (19:01 +0200)
lib/RFID/Biblio/Reader.pm
lib/RFID/Biblio/Reader/3M810.pm
lib/RFID/Biblio/Reader/Serial.pm

index 6f3ab8b..5d186e1 100644 (file)
@@ -142,7 +142,7 @@ sub _available {
                my $module = "RFID::Biblio::Reader::$reader";
                eval "use $module";
                die $@ if $@;
-               if ( my $rfid = $module->new( device => '/dev/ttyUSB0' ) ) {
+               if ( my $rfid = $module->new ) {
                        push @rfid, $rfid;
                        warn "# added $module\n";
                } else {
index 2031d8b..9679e68 100644 (file)
@@ -36,7 +36,6 @@ use Time::HiRes;
 use Digest::CRC;
 
 sub serial_settings {{
-       device    => "/dev/ttyUSB1", # FIXME comment out before shipping
        baudrate  => "19200",
        databits  => "8",
        parity    => "none",
index b118fe3..bf89625 100644 (file)
@@ -33,29 +33,37 @@ sub new {
 
 =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} );
+       @devices = glob '/dev/ttyUSB*';
 
-       if ( ! $device ) {
-               warn "# no device, serial port not opened\n";
-               return;
-       }
+       warn "# port devices ",dump(@devices);
+
+       foreach my $device ( @devices ) {
 
-       if ( $self->{port} = Device::SerialPort->new( $settings->{device} ) ) {
-               $self->{port}->$_( $settings->{$_} )
-               foreach ( qw/handshake baudrate databits parity stopbits/ );
-       } else {
-               warn "can't open serial port: $!\n";
-               $self->{port} = 0;
+               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} );
+                       }
+                       warn "found ", ref($self), " $device settings ",dump $settings;
+                       $self->{port} = $port;
+                       $serial_device->{$device} = $port;
+                       last;
+               }
        }
 
-       $self->{port};
+       warn "# serial_device ",dump($serial_device);
+
+       return $self->{port};
 }
 
 1