Ham-APRS-FAP
view release on metacpan or search on metacpan
'dx_inv_src' => 'Invalid DX spot source callsign',
'dx_inf_freq' => 'Invalid DX spot frequency',
'dx_no_dx' => 'No DX spot callsign found',
'tlm_inv' => 'Invalid telemetry packet',
'tlm_large' => 'Too large telemetry value',
'tlm_unsupp' => 'Unsupported telemetry',
'exp_unsupp' => 'Unsupported experimental',
'sym_inv_table' => 'Invalid symbol table or overlay',
);
=over
=item result_messages( )
Returns a reference to a hash containing all possible
return codes as the keys and their plain english descriptions
as the values of the hash.
_a_err($rh, 'nmea_inv_sign', $sign);
return undef;
}
# all ok
return $value;
}
# return a two element array, first containing
# the symbol table id (or overlay) and second
# containing symbol id. return undef in error
sub _get_symbol_fromdst($) {
my $dstcallsign = shift @_;
my $table = undef;
my $code = undef;
if ($dstcallsign =~ /^(GPS|SPC)([A-Z0-9]{2,3})/o) {
my $leftoverstring = $2;
my $type = substr($leftoverstring, 0, 1);
if ($type eq 'C') {
$table = '/';
} else {
$table = "\\";
}
return ($table, $code);
} else {
return undef;
}
} else {
# secondary symbol table, with overlay
# Check first that we really are in the
# secondary symbol table
my $dsttype = substr($leftoverstring, 0, 2);
my $overlay = substr($leftoverstring, 2, 1);
if (($type eq 'O' ||
$type eq 'A' ||
$type eq 'N' ||
$type eq 'D' ||
$type eq 'S' ||
$type eq 'Q') && $overlay =~ /^[A-Z0-9]$/o) {
if (defined($dstsymbol{$dsttype})) {
$code = substr($dstsymbol{$dsttype}, 1, 1);
return ($overlay, $code);
} else {
return undef;
}
} else {
return undef;
}
}
} else {
# primary or secondary symbol table, no overlay
if (defined($dstsymbol{$leftoverstring})) {
$table = substr($dstsymbol{$leftoverstring}, 0, 1);
$code = substr($dstsymbol{$leftoverstring}, 1, 1);
return ($table, $code);
} else {
return undef;
}
}
} else {
return undef;
Creates an APRS object. Returns a body of an APRS object, i.e. ";OBJECTNAM*DDHHMM/DDMM.hhN/DDDMM.hhW$CSE/SPDcomments..."
or undef on error.
Parameters:
1st: object name, has to be valid APRS object name, does not need to be space-padded
2nd: object timestamp as a unix timestamp, or zero to use current time
3rd: object latitude, decimal degrees
4th: object longitude, decimal degrees
5th: object symbol table (or overlay) and symbol code, two bytes if the given symbole length is zero (""), use point (//)
6th: object speed, -1 if non-moving (km/h)
7th: object course, -1 if non-moving
8th: object altitude, -10000 or less if not used
9th: alive or dead object (0 == dead, 1 == alive)
10th: compressed (1) or uncompressed (0)
11th: position ambiguity (0..4)
12th: object comment text
Note: Course/speed/altitude/compression is not implemented.
=item make_position($lat, $lon, $speed, $course, $altitude, $symbols, $optionref)
Creates an APRS position for position/object/item. Parameters:
1st: latitude in decimal degrees
2nd: longitude in decimal degrees
3rd: speed in km/h, -1 == don't include
4th: course in degrees, -1 == don't include. zero == unknown course, 360 == north
5th: altitude in meters above mean sea level, -10000 or under == don't use
6th: aprs symbol to use, first table/overlay and then code (two bytes). If string length is zero (""), uses default.
7th: hash reference for options:
"compressed": 1 for compressed format
"ambiguity": Use amount (0..4) of position ambiguity. Note that position ambiguity and compression can't be used at the same time.
"dao": Use !DAO! extension for improved precision
Returns a string such as "1234.56N/12345.67E/CSD/SPD" or in
compressed form "F*-X;n_Rv&{-A" or undef on error.
Please note: course/speed/altitude are not supported yet, and neither is compressed format or position ambiguity.
for (my $i = 3; $i >= 0; $i--) {
# latitude character
my $value = int($latval / (91 ** $i));
$latval = $latval % (91 ** $i);
$latstring .= chr($value + 33);
# longitude character
$value = int($lonval / (91 ** $i));
$lonval = $lonval % (91 ** $i);
$lonstring .= chr($value + 33);
}
# encode overlay character if it is a number
$symboltable =~ tr/0-9/a-j/;
# FIXME: no altitude/radiorange encoding
my $retstring = $symboltable . $latstring . $lonstring . $symbolcode;
if ($speed >= 0 && $course > 0 && $course <= 360) {
# In APRS spec unknown course is zero normally (and north is 360),
# but in compressed aprs north is zero and there is no unknown course.
# So round course to nearest 4-degree section and remember
# to do the 360 -> 0 degree transformation.
my $cval = int(($course + 2) / 4);
if ($cval > 89) {
( run in 0.520 second using v1.01-cache-2.11-cpan-49f99fa48dc )