--- 3m-810.pl 2008/09/28 18:19:37 6 +++ 3m-810.pl 2008/09/28 22:10:55 8 @@ -103,7 +103,7 @@ my @tags; push @tags, substr($tags, $_ * 8, 8) foreach ( 0 .. $nr - 1 ); - warn "## tags ",as_hex($tags), " [$tl] = ",dump( $tags ); + warn "## tags ",as_hex($tags), " [$tl] = ",dump( $tags ) if $debug; print "seen $nr tags: ", join(',', map { unpack('H16', $_) } @tags ) , "\n"; } ) } @@ -161,9 +161,10 @@ foreach my $str ( @_ ) { my $hex = unpack( 'H*', $str ); $hex =~ s/(..)/$1 /g if length( $str ) > 2; + $hex =~ s/\s+$//; push @out, $hex; } - return join(' ', @out); + return join(' | ', @out); } sub read_bytes { @@ -218,6 +219,17 @@ } } +# my $checksum = checksum( $bytes ); +# my $checksum = checksum( $bytes, $original_checksum ); +sub checksum { + my ( $bytes, $checksum ) = @_; + my $xor = 0; + + if ( defined $checksum && $xor ne $checksum ) { + printf "checksum doesn't match: %04x != %04x data: %s\n", $xor, $checksum; + } +} + sub readchunk { my ( $parser ) = @_; @@ -228,21 +240,20 @@ my $length = read_bytes( 1, 'length' ); my $len = ord($length); my $data = read_bytes( $len, 'data' ); - my ( $cmd ) = unpack('C', $data ); my $payload = substr( $data, 0, -2 ); my $payload_len = length($data); warn "## payload too short $payload_len != $len\n" if $payload_len != $len; + my $checksum = substr( $data, -2, 2 ); - # FIXME check checksum + checksum( $header . $length . $payload, $checksum ); - print "<< ",as_hex( $header ), " [$len] ", as_hex( $payload ), "checksum: ", as_hex( $checksum ),"\n"; + print "<< ",as_hex( $header ), " [$len] ", as_hex( $payload ), " | sum: ",as_hex($checksum),"\n"; $assert->{len} = $len; $assert->{payload} = $payload; - $assert->{checksum} = $checksum; - $parser->( $len, $payload, $checksum ) if $parser && ref($parser) eq 'CODE'; + $parser->( $len, $payload ) if $parser && ref($parser) eq 'CODE'; return $data; }