X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=lib%2FRFID%2FSerial%2F3M810.pm;h=334ffcb52e5f546b755e700be98c90821497118b;hb=bd409be6f99c801b77b14e9a2605c0f5f1735840;hp=50becab6b39ad3f7251fbeb7a4432f5614d148a0;hpb=8910421042293ddb6771a2d0ae16acf576c90f53;p=Biblio-RFID.git diff --git a/lib/RFID/Serial/3M810.pm b/lib/RFID/Serial/3M810.pm index 50becab..334ffcb 100644 --- a/lib/RFID/Serial/3M810.pm +++ b/lib/RFID/Serial/3M810.pm @@ -62,16 +62,27 @@ sub cmd { my $r_len = $port->read(3); - while ( ! $r_len ) { + while ( length($r_len) < 3 ) { wait_device; - $r_len = $port->read(3); + $r_len = $port->read( 3 - length($r_len) ); } wait_device; my $len = ord( substr($r_len,2,1) ); $data = $port->read( $len ); - warn "<< ", as_hex($r_len,$data)," $len\n"; + + while ( length($data) < $len ) { + warn "# short read ", length($data), " < $len\n"; + wait_device; + $data .= $port->read( $len - length($data) ); + } + + warn "<< ", as_hex($r_len,$data), + ' | ', + substr($data,-2,2) eq checksum(substr($r_len,1).substr($data,0,-2)) ? 'OK' : 'ERROR', + " $len bytes\n"; + $coderef->( $data ) if $coderef; @@ -97,7 +108,7 @@ cmd( my $data = shift; my $rest = assert $data => '04 00 11'; my $hw_ver = join('.', unpack('CCCC', $rest)); - print "hardware version $hw_ver\n"; + warn "# 3M 810 hardware version $hw_ver\n"; }); cmd( @@ -181,11 +192,36 @@ sub read_blocks { } elsif ( my $rest = _matched $data => '02 06' ) { warn "ERROR ",as_hex($rest); } else { - die "FIXME unsuported ",as_hex($rest); + warn "FIXME unsuported ",as_hex($rest); } }); warn "# tag_blocks ",dump($tag_blocks); + return $tag_blocks; +} + +sub read_afi { + my $tag = shift; + $tag = shift if ref $tag; + + cmd( + "0A $tag", "read_afi $tag", sub { + my $data = shift; + + if ( my $rest = _matched $data => '0A 00' ) { + + my $tag = hex_tag substr($rest,0,8); + my $afi = substr($rest,8,1); + + warn "# SECURITY ", hex_tag($tag), " AFI: ", as_hex($afi); + + return $afi; + } elsif ( my $rest = _matched $data => '0A 06' ) { + warn "ERROR reading security from $tag ", as_hex($data); + } else { + warn "IGNORED ",as_hex($data); + } + }); } 1