Ham-APRS-FAP
view release on metacpan or search on metacpan
=cut
sub debug($)
{
my $dval = shift @_;
if ($dval) {
$debug = 1;
} else {
$debug = 0;
}
}
# Return a human readable timestamp in UTC.
# If no parameter is given, use current time,
# else use the unix timestamp given in the parameter.
sub _gettime {
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday);
if (scalar(@_) >= 1) {
my $tstamp = shift @_;
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday) = gmtime($tstamp);
} else {
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday) = gmtime();
}
my $timestring = sprintf('%d-%02d-%02d %02d:%02d:%02d UTC',
$year + 1900,
$mon + 1,
$mday,
$hour,
$min,
$sec);
return $timestring;
}
=over
=item distance($lon0, $lat0, $lon1, $lat1)
Returns the distance in kilometers between two locations
given in decimal degrees. Arguments are given in order as
lon0, lat0, lon1, lat1, east and north positive.
The calculation uses the great circle distance, it
is not too exact, but good enough for us.
=back
=cut
sub distance($$$$) {
my $lon0 = shift @_;
my $lat0 = shift @_;
my $lon1 = shift @_;
my $lat1 = shift @_;
# decimal to radian
$lon0 = deg2rad($lon0);
$lon1 = deg2rad($lon1);
$lat0 = deg2rad($lat0);
$lat1 = deg2rad($lat1);
# Use the haversine formula for distance calculation
# http://mathforum.org/library/drmath/view/51879.html
my $dlon = $lon1 - $lon0;
my $dlat = $lat1 - $lat0;
my $a = (sin($dlat/2)) ** 2 + cos($lat0) * cos($lat1) * (sin($dlon/2)) ** 2;
my $c = 2 * atan2(sqrt($a), sqrt(1-$a));
my $distance = $c * 6366.71; # in kilometers
return $distance;
}
=over
=item direction($lon0, $lat0, $lon1, $lat1)
Returns the initial great circle direction in degrees
from lat0/lon0 to lat1/lon1. Locations are input
in decimal degrees, north and east positive.
=back
=cut
sub direction($$$$) {
my $lon0 = shift @_;
my $lat0 = shift @_;
my $lon1 = shift @_;
my $lat1 = shift @_;
$lon0 = deg2rad($lon0);
$lon1 = deg2rad($lon1);
$lat0 = deg2rad($lat0);
$lat1 = deg2rad($lat1);
# direction from Aviation Formulary V1.42 by Ed Williams
# by way of http://mathforum.org/library/drmath/view/55417.html
my $direction = atan2(sin($lon1-$lon0)*cos($lat1),
cos($lat0)*sin($lat1)-sin($lat0)*cos($lat1)*cos($lon1-$lon0));
if ($direction < 0) {
# make direction positive
$direction += 2 * pi;
}
return rad2deg($direction);
}
=over
=item count_digihops($header)
Count the number of digipeated hops in a (KISS) packet and
return it. Returns -1 in case of error.
The header parameter can contain the full packet or just the header
in TNC2 format. All callsigns in the header must be AX.25 compatible
and remember that the number returned is just an educated guess, not
absolute truth.
=back
=cut
( run in 1.709 second using v1.01-cache-2.11-cpan-f56aa216473 )