From: Dobrica Pavlinusic Date: Mon, 26 Jul 2010 17:29:20 +0000 (+0200) Subject: drain device on startup X-Git-Tag: RFID-Biblio-0.02~164 X-Git-Url: http://git.rot13.org/?p=Biblio-RFID.git;a=commitdiff_plain;h=45e4058fb35787bad561bad1b57435efec1bbc83 drain device on startup --- diff --git a/lib/RFID/Serial/3M810.pm b/lib/RFID/Serial/3M810.pm index 129f02f..8cf0a5c 100644 --- a/lib/RFID/Serial/3M810.pm +++ b/lib/RFID/Serial/3M810.pm @@ -3,8 +3,11 @@ package RFID::Serial::3M810; use base 'RFID::Serial'; use RFID::Serial; +use Carp qw(confess); +use Time::HiRes; + sub serial_settings {{ - device => "/dev/ttyUSB0", + device => "/dev/ttyUSB1", # FIXME comment out before shipping baudrate => "19200", databits => "8", parity => "none", @@ -12,10 +15,28 @@ sub serial_settings {{ handshake => "none", }} +my $port; +sub init { + my $self = shift; + $port = $self->port; + + # drain on startup + my ( $count, $str ) = $port->read(3); + my $data = $port->read( ord(substr($str,2,1)) ); + warn "drain ",as_hex( $str, $data ),"\n"; + + setup(); + +} + +sub wait_device { + Time::HiRes::sleep 0.015; +} + sub cmd { my ( $hex, $description, $coderef ) = @_; my $bytes = hex2bytes($hex); - if ( substr($bytes,0,1) ne "\xD5" ) { + if ( substr($bytes,0,1) !~ /(\xD5|\xD6)/ ) { my $len = pack( 'c', length( $bytes ) + 3 ); $bytes = $len . $bytes; my $checksum = checksum($bytes); @@ -25,16 +46,18 @@ sub cmd { warn ">> ", as_hex( $bytes ), "\t\t[$description]\n"; $port->write( $bytes ); + wait_device; + my $r_len = $port->read(3); while ( ! $r_len ) { - warn "# wait for response length 5ms\n"; + wait_device; $r_len = $port->read(3); } - my $data_len = ord(substr($r_len,2,1)) - 1; - my $data = $port->read( $data_len ); - warn "<< ", as_hex( $r_len . $data ),"\n"; + my $len = ord( substr($r_len,2,1) ); + $data = $port->read( $len ); + warn "<< ", as_hex($r_len,$data)," $len\n"; $coderef->( $data ) if $coderef; @@ -42,23 +65,28 @@ sub cmd { sub assert { my ( $got, $expected ) = @_; - die "got ", as_hex($got), " expected ", as_hex($expected) - unless substr($expected,0,length($got)) eq $got; + $expected = hex2bytes($expected); + + my $len = length($got); + $len = length($expected) if length $expected < $len; + + confess "got ", as_hex($got), " expected ", as_hex($expected) + unless substr($got,0,$len) eq substr($expected,0,$len); } -sub init { - my $self = shift; +sub setup { -cmd( 'D5 00 05 04 00 11' => 'hw version' . sub { +cmd( +'D5 00 05 04 00 11 8C66', 'hw version', sub { my $data = shift; - assert $data => '04 00 01'; + assert $data => '04 00 11'; my $hw_ver = join('.', unpack('CCCC', substr($data,3))); print "hardware version $hw_ver\n"; }); cmd( -'13 04 01 00 02 00 03 00 04 00', 'FIXME: stats?', sub { assert(shift, -'13 00 02 01 01 03 02 02 03 00' +'D6 00 0C 13 04 01 00 02 00 03 00 04 00 AAF2','FIXME: stats?', sub { assert(shift, +' 13 00 02 01 01 03 02 02 03 00 E778' )}); } diff --git a/t/10-3M-810.t b/t/10-3M-810.t index 7555b78..bd48bdb 100755 --- a/t/10-3M-810.t +++ b/t/10-3M-810.t @@ -1,6 +1,6 @@ #!/usr/bin/perl -use Test::More tests => 16; +use Test::More tests => 2; use Data::Dump qw(dump); use lib 'lib';