sub crc {
my $crc = 0xffff;
foreach my $byte ( split(//, join('',@_)) ) {
- $crc = ($crc >> 8) ^ $crc_table[ ($crc ^ $byte) & 0xff ];
+ $crc = ($crc >> 8) ^ $crc_table[ ($crc ^ ord($byte)) & 0xff ];
}
return $crc ^ 0xffff;
}
-my $device = $ENV{DEVICE} || '/dev/ttyUSB2'; # last device! control port!
+my $device = $ARGV[0] || $ENV{DEVICE} || '/dev/ttyUSB2'; # last device! control port!
+my $at_qcdmg = $ARGV[1]; # force AT$QCDMG from command-line
my $port = Device::SerialPort->new( $device ) || die "$device: $!";
$port->baudrate(115200) || die "fail $device baudrate";
$port->read_const_time(3000); # 1 s read timeout
while ( my $drain = $port->input ) {
- warn "# drain $drain\n# /drain\n";
+ warn "# drain $drain\n";
+ $at_qcdmg = 1;
+}
+
+if ( $at_qcdmg ) {
+ $port->write('AT$QCDMG' . "\r");
+ warn "DIAG mode: ", $port->read(9 + 3); # echo, OK+cr/lf
}
my $diag = {
warn "## using $device\n";
-#$port->write('AT$QCDMG');
-#warn "DIAG mode: ", $port->read(2), $port->input; # OK+cr/lf
-
sub as_hex {
my @out;
foreach my $str ( @_ ) {
my $crc = pack('v', crc($data) );
-# $data =~ s/\x7d/\x7d\x5d/;
-# $data =~ s/\x7e/\x7d\x5e/;
+ $data =~ s/\x7d/\x7d\x5d/gs;
+ $data =~ s/\x7e/\x7d\x5e/gs;
my $out = $data . $crc . "\x7e";
my $ret = $port->read(1);
while ( my $c = $port->input ) {
- print STDERR "<<< ",dump($ret . $c), $/;
+ print STDERR "<<< ",as_hex($ret . $c), $/;
$ret .= $c;
# last if $c =~ m/^OK\r/;
}
+ $ret =~ s/\x7d\x5d/\x7d/gs;
+ $ret =~ s/\x7d\x5e/\x7e/gs;
return $ret;
}
diag 'GET_VERSION';
-$port->close || die "can't close port $!";
+diag 'GET_SERIAL_NUMBER';
-while ( block_read() ) {
- warn "# more";
-}
+diag 'EXTENDED_BUILD_ID';
+
+$port->close || die "can't close port $!";
warn "## $device closed\n";