1. Sort out PC41 handling to include type 5 records for QRA locators and also
[spider.git] / cmd / set / location.pl
index 25db6ba609259c4c3f2f803f4edfe7decd4ca4a4..f4ee0358a496c0654937cc67d5482fb56b841db3 100644 (file)
@@ -15,21 +15,30 @@ $line =~ s/^\s+//;
 $line =~ s/\s+$//;
 
 return (1, $self->msg('loce1')) if !$line;
-return (1, $self->msg('loce3', uc $line)) if DXBearing::is_qra($line);
-return (1, $self->msg('loce2', $line)) unless $line =~ /\d+ \d+ [NnSs] \d+ \d+ [EeWw]/o;
+return (1, $self->msg('loce3', uc $line)) if is_qra($line);
+return (1, $self->msg('loce2', $line)) unless is_latlong($line);
 
 $user = DXUser->get_current($call);
 if ($user) {
        $line = uc $line;
        my ($lat, $long) = DXBearing::stoll($line);
-       $user->lat($lat);
-       $user->long($long);
-       my $s = DXProt::pc41($call, 3, $line);
-       DXProt::eph_dup($s);
-       DXProt::broadcast_all_ak1a($s, $DXProt::me) ;
-       unless ($user->qra && DXBearing::is_qra($user->qra) ) {
-               my $qra = DXBearing::lltoqra($lat, $long);
+       my $oldlat = $user->lat || 0;
+       my $oldlong = $user->long || 0;
+       if ($oldlat != $lat || $oldlong != $long) {
+               $user->lat($lat);
+               $user->long($long);
+               my $l = DXBearing::lltos($lat, $long);
+               my $s = DXProt::pc41($call, 3, $l);
+               DXProt::eph_dup($s);
+               DXProt::broadcast_all_ak1a($s, $DXProt::me) ;
+       }
+       my $qra = DXBearing::lltoqra($lat, $long);
+       my $oldqra = $user->qra || "";
+       if ($oldqra ne $qra) {
                $user->qra($qra);
+               my $s = DXProt::pc41($call, 5, $qra);
+               DXProt::eph_dup($s);
+               DXProt::broadcast_all_ak1a($s, $DXProt::me);
        }
        
        $user->put();