port detection will now run init to probe reader
authorDobrica Pavlinusic <dpavlin@rot13.org>
Mon, 9 Aug 2010 17:27:52 +0000 (19:27 +0200)
committerDobrica Pavlinusic <dpavlin@rot13.org>
Mon, 9 Aug 2010 17:27:52 +0000 (19:27 +0200)
This means that init shouldn't block forever to responed

lib/RFID/Biblio/Reader/3M810.pm
lib/RFID/Biblio/Reader/Serial.pm

index 421dd9b..c8b566f 100644 (file)
@@ -43,6 +43,8 @@ sub serial_settings {{
        handshake => "none",
 }}
 
+sub assert;
+
 my $port;
 sub init {
        my $self = shift;
@@ -60,8 +62,25 @@ sub init {
        $port->read_char_time(100);      # 0.1 s char timeout
        $port->read_const_time(500); # 0.5 s read timeout
 
-       setup();
+       $port->write( hex2bytes( 'D5 00  05   04 00 11   8C66' ) );
+       # hw-version     expect: 'D5 00  09   04 00 11   0A 05 00 02   7250'
+       my $data = $port->read( 12 );
+       return unless $data;
+
+       warn "# probe response: ",as_hex($data);
+       if ( my $rest = assert $data => 'D5 00  09   04 00 11' ) {
+               my $hw_ver = join('.', unpack('CCCC', $rest));
+               warn "# 3M 810 hardware version $hw_ver\n";
+
+               cmd(
+'13  04 01 00 02 00 03 00 04 00','FIXME: stats? rf-on?', sub { assert(shift,
+'13  00 02 01 01 03 02 02 03 00'
+               )});
+
+               return $hw_ver;
+       }
 
+       return;
 }
 
 sub checksum {
@@ -119,21 +138,6 @@ sub assert {
        return substr($got,$len);
 }
 
-sub setup {
-
-cmd(
-'D5 00  05   04 00 11   8C66', 'hw version', sub {
-       my $data = shift;
-       my $rest = assert $data => '04 00 11';
-       my $hw_ver = join('.', unpack('CCCC', $rest));
-       warn "# 3M 810 hardware version $hw_ver\n";
-});
-
-cmd(
-'13  04 01 00 02 00 03 00 04 00','FIXME: stats? rf-on?', sub { assert(shift,
-'13  00 02 01 01 03 02 02 03 00'
-)});
-}
 
 sub inventory {
 
index 6525913..b09875f 100644 (file)
@@ -23,7 +23,7 @@ sub new {
        my $self = {@_};
        bless $self, $class;
 
-       $self->port && $self->init && return $self;
+       $self->port && return $self;
 }
 
 
@@ -53,13 +53,21 @@ sub port {
                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;
+
+                       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;
+                       }
                }
        }