added crc implementation
[vrDialog] / dialog.pl
1 #!/usr/bin/perl
2 use warnings;
3 use strict;
4
5 use Data::Dump qw(dump);
6 use Device::SerialPort qw(:STAT);
7
8 my $port = Device::SerialPort->new('/dev/ttyUSB0');
9 $port->baudrate(9600);
10 $port->databits(8);
11 $port->parity('none');
12 $port->stopbits(1);
13 $port->handshake('none');
14
15 $port->read_char_time(500);
16 $port->read_const_time(1000);
17
18 sub as_hex {
19         my @out;
20         foreach my $str ( @_ ) {
21                 my $hex = uc unpack( 'H*', $str );
22                 $hex =~ s/(..)/$1 /g if length( $str ) > 2;
23                 $hex =~ s/\s+$//;
24                 push @out, $hex;
25         }
26         return join(' | ', @out);
27 }
28
29 sub hex2bytes {
30         my $bytes;
31         $bytes .= pack('C', hex('0x' . $_)) foreach split(/\s+/,join(' ',@_));
32         return $bytes;
33 }
34
35 sub crc {
36         my $data = shift;
37         my $crc = 0;
38         for my $i ( 0 .. length($data) - 2 ) {
39                 if ( $crc & 0x80 ) {
40                         $crc = ( $crc << 1 ) ^ 25;
41                 } else {
42                         $crc = $crc << 1;
43                 }
44                 $crc = $crc & 0xff;
45                 my $byte = ord(substr($data,$i,1));
46                 $crc = $crc ^ $byte;
47 #               warn "## ", as_hex(chr($byte)), " crc = ", $crc, " ", as_hex(chr($crc));
48         }
49         if ( chr($crc) ne substr($data,-1,1) ) {
50                 warn "CRC error for ",as_hex($data), " calulated ", as_hex(chr($crc));
51         }
52 }
53
54 sub v {
55         my ($hex,$desc) = @_;
56         my $bytes = hex2bytes( $hex );
57         warn "# $desc\n";
58 retry:
59         warn ">> ",as_hex( $bytes );
60         crc( $bytes );
61         $port->write( $bytes );
62
63         my $data = $port->read(1);
64         warn "<< len: ",ord($data);
65
66         goto retry if ord($data) == 0;
67
68         $data .= $port->read(ord($data) - 1);
69         crc($data);
70         warn "<< ",as_hex($data);
71
72 }
73
74 v '07 02 00 00 00 04 C4', "hardware version";
75
76 v '07 0A 00 00 00 04 44', 'software version';
77
78 v '07 00 01 00 06 0E EA', 'temperatures';
79