use Filter;
use Local;
use DXDb;
+use Time::HiRes qw(gettimeofday tv_interval);
use Carp;
$decode_dk0wcy = undef; # if set use this callsign to decode announces from the EU WWV data beacon
$pc11_max_age = 1*3600; # the maximum age for an incoming 'real-time' pc11
$pc23_max_age = 1*3600; # the maximum age for an incoming 'real-time' pc23
-$pc11_dup_age = 24*3600; # the maximum time to keep the spot dup list for
-$pc23_dup_age = 24*3600; # the maximum time to keep the wwv dup list for
-$pc12_dup_age = 12*3600; # the maximum time to keep the ann dup list for
-$pc12_dup_lth = 72; # the length of ANN text to save for deduping
+$pc11_dup_age = 3*3600; # the maximum time to keep the spot dup list for
+$pc23_dup_age = 3*3600; # the maximum time to keep the wwv dup list for
+$pc12_dup_age = 24*3600; # the maximum time to keep the ann dup list for
+$pc12_dup_lth = 60; # the length of ANN text to save for deduping
%spotdup = (); # the pc11 and 26 dup hash
%wwvdup = (); # the pc23 and 27 dup hash
%anndup = (); # the PC12 dup hash
%nodehops = (); # node specific hop control
@baddx = (); # list of illegal spotted callsigns
+
$baddxfn = "$main::data/baddx.pl";
sub init
if (!$self->{outbound}) {
$self->send(pc38()) if DXNode->get_all();
$self->send(pc18());
+ # remove from outstanding connects queue
+ @main::outstanding_connects = grep {$_->{call} ne $call} @main::outstanding_connects;
}
$self->state('init');
$self->pc50_t(time);
+ $self->pingint($user->pingint || 3*60);
+ $self->nopings(3);
+ $self->lastping($main::systime);
+ $self->pingtime([ ]);
Log('DXProt', "$call connected");
}
# it's a reply, look in the ping list for this one
my $ref = $pings{$field[2]};
if ($ref) {
+ my $tochan = DXChannel->get($field[2]);
while (@$ref) {
my $r = shift @$ref;
my $dxchan = DXChannel->get($r->{call});
- $dxchan->send($dxchan->msg('pingi', $field[2], atime($main::systime), $main::systime - $r->{t})) if $dxchan;
+ next unless $dxchan;
+ my $t = tv_interval($r->{t}, [ gettimeofday ]);
+ if ($dxchan->is_user) {
+ my $s = sprintf "%.2f", $t;
+ my $ave = sprintf "%.2f", $tochan ? ($tochan->pingave || $t) : $t;
+ $dxchan->send($dxchan->msg('pingi', $field[2], $s, $ave))
+ } elsif ($dxchan->is_ak1a) {
+ if ($tochan) {
+ $tochan->nopings(3); # pump up the timer
+ push @{$tochan->pingtime}, $t;
+ shift @{$tochan->pingtime} if @{$tochan->pingtime} > 10;
+ my $st;
+ for (@{$tochan->pingtime}) {
+ $st += $_;
+ }
+ $tochan->{pingave} = $st / @{$tochan->pingtime};
+ }
+ }
}
}
}
-
} else {
# route down an appropriate thingy
$self->route($field[1], $line);
$dxchan->send(pc50());
$dxchan->pc50_t($t);
}
+
+ # send a ping out on this channel
+ if ($t >= $dxchan->pingint + $dxchan->lastping) {
+ if ($dxchan->nopings <= 0) {
+ $dxchan->disconnect;
+ } else {
+ addping($main::mycall, $dxchan->call);
+ $dxchan->nopings($dxchan->nopings - 1);
+ $dxchan->lastping($t);
+ }
+ }
}
my $key;
my $call = $self->call;
my $ref = DXCluster->get_exact($call);
+ $self->send_now("D", DXProt::pc39($main::mycall, $self->msg('disc1', "System Op")));
+
# unbusy and stop and outgoing mail
my $mref = DXMsg::get_busy($call);
$mref->stop_msg($call) if $mref;
sub addping
{
my ($from, $to) = @_;
- my $ref = $pings{$to};
- $ref = $pings{$to} = [] if !$ref;
+ my $ref = $pings{$to} || [];
my $r = {};
$r->{call} = $from;
- $r->{t} = $main::systime;
+ $r->{t} = [ gettimeofday ];
route(undef, $to, pc51($to, $main::mycall, 1));
push @$ref, $r;
+ $pings{$to} = $ref;
}
# add a rcmd request to the rcmd queues