--- cpr-m02.pl 2010/07/16 09:31:56 86 +++ cpr-m02.pl 2010/07/16 13:05:24 87 @@ -287,6 +287,11 @@ return pack('v', $crc); } +sub cpr_psst_wait { + # Protocol Start Synchronization Time (PSST): 5ms < data timeout 12 ms + Time::HiRes::sleep 0.005; +} + sub cpr { my ( $hex, $description, $coderef ) = @_; my $bytes = str2bytes($hex); @@ -298,29 +303,24 @@ warn ">> ", as_hex( $send ), "\t\t[$description]\n"; $port->write( $send ); + cpr_psst_wait; + my $r_len = $port->read(1); while ( ! $r_len ) { - warn "# wait for response length 0.050\n"; - Time::HiRes::sleep 0.050; + warn "# wait for response length 5ms\n"; + cpr_psst_wait; $r_len = $port->read(1); } - warn "<< response len: ", as_hex($r_len), "\n"; - $r_len = ord($r_len) - 1; - my $data = $port->read( $r_len ); - warn "<< ", as_hex( $data ); - - my $t = Time::HiRes::time; + my $data_len = ord($r_len) - 1; + my $data = $port->read( $data_len ); + warn "<< ", as_hex( $r_len . $data ),"\n"; + + cpr_psst_wait; $coderef->( $data ) if $coderef; - my $dt = Time::HiRes::time - $t; - if ( $dt < 0.050 ) { - my $s = 0.050 - $dt; - warn "# sleep for more $s\n"; - Time::HiRes::sleep $s; - } } # FF = COM-ADDR any @@ -333,6 +333,16 @@ cpr( 'FF 69', 'RF Reset' ); + +sub cpr_read { + my $uid = shift; + my $hex_uid = as_hex($uid); + + cpr( "FF B0 23 01 $hex_uid 00 04", "Read Multiple Blocks $hex_uid" ); +# cpr( "FF B0 2B 01 $hex_uid", "Get System Information $hex_uid" ); +} + + my $inventory; while(1) { @@ -343,11 +353,14 @@ $data = substr($data,4); foreach ( 1 .. $data_sets ) { my $tr_type = substr($data,0,1); + die "FIXME only TR-TYPE=3 ISO 15693 supported" unless $tr_type eq "\x03"; my $dsfid = substr($data,1,1); my $uid = substr($data,2,8); $inventory->{$uid}++; $data = substr($data,10); warn "# TAG $_ ",as_hex( $tr_type, $dsfid, $uid ),$/; + + cpr_read( $uid ); } warn "inventory: ",dump($inventory); });