added retry
[vrDialog] / dialog.pl
index 8f50b5e..47bfe21 100755 (executable)
--- a/dialog.pl
+++ b/dialog.pl
@@ -12,24 +12,48 @@ $port->parity('none');
 $port->stopbits(1);
 $port->handshake('none');
 
-# disable timeouts
 $port->read_char_time(500);
 $port->read_const_time(1000);
 
-sub v {
-       my ($hex,$desc) = @_;
+sub as_hex {
+       my @out;
+       foreach my $str ( @_ ) {
+               my $hex = uc unpack( 'H*', $str );
+               $hex =~ s/(..)/$1 /g if length( $str ) > 2;
+               $hex =~ s/\s+$//;
+               push @out, $hex;
+       }
+       return join(' | ', @out);
+}
+
+sub hex2bytes {
        my $bytes;
-       $bytes .= pack('C', hex('0x' . $_)) foreach split(/\s+/,$hex);
+       $bytes .= pack('C', hex('0x' . $_)) foreach split(/\s+/,join(' ',@_));
+       return $bytes;
+}
+
+sub v {
+       my ($hex,$expect,$desc) = @_;
+       my $bytes = hex2bytes( $hex );
        warn "# $desc\n";
-       warn ">> $hex ",dump( $bytes );
+retry:
+       warn ">> ",as_hex( $bytes );
        $port->write( $bytes );
 
-       my $len = $port->read(1);
-       warn "<< len: ",ord($len);
-       my $data = $port->read(ord($len) - 1);
-       warn "<< ",dump($data);
+       my $data = $port->read(1);
+       warn "<< len: ",ord($data);
+
+       goto retry if ord($data) == 0;
+
+       $data .= $port->read(ord($data) - 1);
+       warn "<< ",as_hex($data);
+       warn "?? $expect\n" if $expect;
 
 }
 
 v '07 02 00 00 00 04 C4', "hardware version";
 
+v '07 0A 00 00 00 04 44', 'software version';
+
+v '07 00 01 00 06 0E EA', 'temperatures';
+