direwolf/telemetry-toolkit/telem-data91.pl

65 lines
1.3 KiB
Perl

#!/usr/bin/perl
# Part of Dire Wolf APRS Telemetry Toolkit, WB2OSZ, 2015
# For explanation of encoding see:
# http://he.fi/doc/aprs-base91-comment-telemetry.txt
if ($#ARGV+1 < 2 || $#ARGV+1 > 7) {
print STDERR "2 to 7 command line arguments must be provided.\n";
usage();
}
if ($#ARGV+1 == 7) {
if ( ! ($ARGV[6] =~ m/^[01]{8}$/)) {
print STDERR "The sixth value must be 8 binary digits.\n";
usage();
}
# Convert binary digits to value.
$ARGV[6] = oct("0b" . reverse($ARGV[6]));
}
$result = "|";
for ($n = 0 ; $n <= $#ARGV; $n++) {
#print $n . " = " . $ARGV[$n] . "\n";
$v = $ARGV[$n];
if ($v != int($v) || $v < 0 || $v > 8280) {
print STDERR "$v is not an integer in range of 0 to 8280.\n";
usage();
}
$result .= base91($v);
}
$result .= "|";
print "$result\n";
exit 0;
sub base91 ()
{
my $x = @_[0];
my $d1 = int ($x / 91);
my $d2 = $x % 91;
return chr($d1+33) . chr($d2+33);
}
sub usage ()
{
print STDERR "\n";
print STDERR "telem-data91.pl - Format data into compressed base 91 telemetry.\n";
print STDERR "\n";
print STDERR "Usage: telem-data91.pl sequence value1 [ value2 ... ]\n";
print STDERR "\n";
print STDERR "A sequence number and up to 5 analog values can be specified.\n";
print STDERR "Any sixth value must be 8 binary digits.\n";
print STDERR "Values must be integers in range of 0 to 8280.\n";
exit 1;
}