add better debugging to pc92 deduping check
[spider.git] / perl / DXProtHandle.pm
index 7db433e5205f8273c6a00bc5d7f9fbc624a0147f..f18089ffaa07db020cfde2bb724ef7e65220cb7f 100644 (file)
@@ -2,7 +2,7 @@
 #
 # This module impliments the handlers for the protocal mode for a dx cluster
 #
-# Copyright (c) 1998-2006 Dirk Koopman G1TLH
+# Copyright (c) 1998-2007 Dirk Koopman G1TLH
 #
 #
 #
@@ -45,6 +45,7 @@ use vars qw($pc11_max_age $pc23_max_age $last_pc50 $eph_restime $eph_info_restim
                        $allowzero $decode_dk0wcy $send_opernam @checklist
                        $eph_pc15_restime $pc9x_past_age $pc9x_future_age
                        $pc10_dupe_age $pc92_slug_changes $last_pc92_slug
+                       $pc92Ain $pc92Cin $pc92Din $pc92Kin
                   );
 
 $pc9x_past_age = 62*60;                        # maximum age in the past of a px9x (a config record might be the only
@@ -1489,25 +1490,33 @@ sub check_pc9x_t
                        if (defined $lastid) {
                                if ($t < $lastid) {
                                        if ($t+86400-$lastid > $pc9x_past_age) {
-                                               dbg("PCPROT: dup id on $t <= lastid $lastid, ignored") if isdbg('chanerr');
-                                               return;
+                                               dbg("PCPROT: dup id on $t <= lastid $lastid, ignored") if isdbg('chanerr') || isdbg('pc92dedupe');
+                                               return undef;
                                        }
                                } elsif ($t == $lastid) {
-                                       dbg("PCPROT: dup id on $t == lastid $lastid, ignored") if isdbg('chanerr');
-                                       return;
+                                       dbg("PCPROT: dup id on $t == lastid $lastid, ignored") if isdbg('chanerr') || isdbg('pc92dedupe');
+                                       return undef;
                                } else {
                                        # $t > $lastid, check that the timestamp offered isn't too far away from 'now'
                                        if ($t-$lastid > $pc9x_future_age ) {
-                                               dbg("PCPROT: id $t too far in the future of lastid $lastid, ignored") if isdbg('chanerr');
-                                               return;
+                                               dbg("PCPROT: id $t too far in the future of lastid $lastid, ignored") if isdbg('chanerr') || isdbg('pc92dedupe');
+                                               return undef;
                                        }
                                }
                        }
                }
        } elsif ($create) {
                $parent = Route::Node->new($call);
+       } else {
+               return undef;
+       }
+       if ('pc92dedupe') {
+               my $exists = exists $parent->{lastid}; # naughty, naughty :-)
+               my $val = $parent->{lastid};
+               my $s = $exists ? (defined $val ? $val : 'exists/undef') : 'undef';
+               dbg("PCPROT: $call pc92 id lastid $s -> $t");
        }
-       $parent->lastid($t) if $parent;
+       $parent->lastid($t);
 
        return $parent;
 }
@@ -1559,7 +1568,7 @@ sub pc92_handle_first_slot
        }
        $parent->here(Route::here($here));
        $parent->version($version || $pc19_version) if $version;
-       $parent->build($build) if $build && $build > $parent->build;
+       $parent->build($build) if $build;
        $parent->PC92C_dxchan($self->{call}) unless $self->{call} eq $parent->call;
        return ($parent, @radd);
 }
@@ -1651,6 +1660,8 @@ sub handle_92
                }
 
        } elsif ($sort eq 'K') {
+               $pc92Kin += length $line if $sort eq 'K';
+
                # remember the last channel we arrived on
                $parent->PC92C_dxchan($self->{call}) unless $self->{call} eq $parent->call;
 
@@ -1664,28 +1675,28 @@ sub handle_92
 
                        push @radd, $add if $add;
                        $parent->reset_obs;
+                       $parent->version($ent[4]) if $ent[4];
+                       $parent->build($ent[5]) if $ent[5];
+
                        dbg("ROUTE: reset obscount on $parent->{call} now " . $parent->obscount) if isdbg('obscount');
                }
        } elsif ($sort eq 'A' || $sort eq 'D' || $sort eq 'C') {
 
+               $pc92Ain += length $line if $sort eq 'A';
+               $pc92Cin += length $line if $sort eq 'C';
+               $pc92Din += length $line if $sort eq 'D';
+
                # remember the last channel we arrived on
                $parent->PC92C_dxchan($self->{call}) unless $self->{call} eq $parent->call;
 
                # this is the main route section
                # here is where all the routes are created and destroyed
 
-               # cope with missing duplicate node calls in the first slot for A or D
+               # cope with missing duplicate node calls in the first slot
                my $me = $_[4] || '';
-               if (($sort eq 'A' || $sort eq 'D')) {
-                       $me ||= _encode_pc92_call($parent) if !$me ;
-               } else {
-                       unless ($me) {
-                               dbg("PCPROT: this type of PC92 *must* have a node call in the first slot, ignored") if is_dbg('chanerr');
-                               return;
-                       }
-               }
+               $me ||= _encode_pc92_call($parent) unless $me ;
 
-               my @ent = map {[ _decode_pc92_call($_) ]} grep {$_ && /^[0-7]/} $me, @_[5 .. $#_];
+               my @ent = map {my @a = _decode_pc92_call($_); @a ? \@a : ()} grep {$_ && /^[0-7]/} $me, @_[5 .. $#_];
 
                if (@ent) {
 
@@ -1705,7 +1716,7 @@ sub handle_92
                # do a pass through removing any references to either locally connected nodes or mycall
                my @nent;
                for (@ent) {
-                       next unless $_;
+                       next unless $_ && @$_;
                        if ($_->[0] eq $main::mycall || DXChannel::get($_->[0])) {
                                dbg("PCPROT: $_->[0] refers to locally connected node, ignored") if isdbg('chanerr');
                                next;