remove $Id$ strings from everywhere that I can find
[spider.git] / cmd / show / qra.pl
index 90c5bb1a864231da0fd0fd6b33ef9a8ebea7e10d..574e351a64c85301e0a77b8ba8563f6dff8a411d 100644 (file)
@@ -3,13 +3,25 @@
 #
 # you can enter two qra locators and it will calc the distance between them
 #
-# $Id$
+#
 #
 
 my ($self, $line) = @_;
 my @list = split /\s+/, $line;               # generate a list of callsigns
+return (1, $self->msg('qrashe1')) unless @list > 0;
 
 my @out;
+
+# every thing is dealt with in upper case
+$line = uc $line;
+
+# convert a lat/long into a qra locator if we see a pattern looking like a lat/long
+if (is_latlong($line)) {
+       my ($llat, $llong) = DXBearing::stoll(uc $line);
+       return (1, "QRA $line = " . DXBearing::lltoqra($llat, $llong)); 
+}
+
+# get the user's lat/long else the cluster's (and whinge about it)
 my $lat = $self->user->lat;
 my $long = $self->user->long;
 if (!$long && !$lat) {
@@ -18,35 +30,36 @@ if (!$long && !$lat) {
        $long = $main::mylongitude;
 }
 
-return (1, $self->msg('qrashe1')) unless @list > 0;
-return (1, $self->msg('qrae2', $list[0])) unless (DXBearing::is_qra($list[0]) || $list[0] =~ /^[A-Za-z][A-Za-z]\d\d$/);
+unshift @list, $self->user->qra if @list == 1 && $self->user->qra;
+unshift @list, DXBearing::lltoqra($lat, $long) unless @list > 1;
 
-#print "$lat $long\n";
-
-my $l = uc $list[0];
-my $f;
-
-if (@list > 1) {
-       $f = $l;
-       $f .= 'MM' if $f =~ /^[A-Z][A-Z]\d\d$/;
-       ($lat, $long) = DXBearing::qratoll($f);
-    #print "$lat $long\n";
-       
-       return (1, $self->msg('qrae2', $list[1])) unless (DXBearing::is_qra($list[1]) || $list[1] =~ /^[A-Za-z][A-Za-z]\d\d$/);
-       $l = uc $list[1];
-}
+# check from qra
+my $f = uc $list[0];
+$f .= 'MM' if $f =~ /^[A-Z][A-Z]\d\d$/;
+return (1, $self->msg('qrae2', $f)) unless is_qra($f);
+($lat, $long) = DXBearing::qratoll($f);
 
+# check to qra
+my $l = uc $list[1];
 $l .= 'MM' if $l =~ /^[A-Z][A-Z]\d\d$/;
-               
+return (1, $self->msg('qrae2', $l)) unless is_qra($l);
 my ($qlat, $qlong) = DXBearing::qratoll($l);
-#print "$qlat $qlong\n";
+
+# generate alpha lat/long
+my $fll = DXBearing::lltos($lat, $long);
+$fll =~ s/\s+([NSEW])/$1/g;
+my $tll = DXBearing::lltos($qlat, $qlong);
+$tll =~ s/\s+([NSEW])/$1/g;
+
+# calc bearings and distances 
 my ($b, $dx) = DXBearing::bdist($lat, $long, $qlat, $qlong);
 my ($r, $rdx) = DXBearing::bdist($qlat, $qlong, $lat, $long);
 my $to = '';
 
-$to = " -> $list[1]" if $f;
-my $from = $list[0];
+$to = "->\U$list[1]($tll)" if $f;
+my $from = "\U$list[0]($fll)" ;
 
-push @out, sprintf "$list[0]$to Bearing: %.0f Deg. Recip: %.0f Deg. %.0fMi. %.0fKm.", $b, $r, $dx * 0.62133785, $dx;
+push @out, sprintf "$from$to To: %.0f Fr: %.0f Dst: %.0fMi %.0fKm", $b, $r, $dx * 0.62133785, $dx;
 
 return (1, @out);
+