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;
} 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);
}
});
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