use DXUtil;
use DXLog;
use Julian;
-use FileHandle;
-use Carp;
+use IO::File;
+use DXDebug;
+use DXDupe;
use strict;
-use vars qw($date $sfi $k $a $forecast @allowed @denied $fp $node $from);
+
+use vars qw($VERSION $BRANCH);
+$VERSION = sprintf( "%d.%03d", q$Revision$ =~ /(\d+)\.(\d+)/ );
+$BRANCH = sprintf( "%d.%03d", q$Revision$ =~ /\d+\.\d+\.(\d+)\.(\d+)/ ) || 0;
+$main::build += $VERSION;
+$main::branch += $BRANCH;
+
+use vars qw($date $sfi $k $a $r $forecast @allowed @denied $fp $node $from
+ $dirprefix $param
+ $duplth $dupage $filterdef);
$fp = 0; # the DXLog fcb
$date = 0; # the unix time of the WWV (notional)
$sfi = 0; # the current SFI value
$k = 0; # the current K value
$a = 0; # the current A value
+$r = 0; # the current R value
$forecast = ""; # the current geomagnetic forecast
$node = ""; # originating node
$from = ""; # who this came from
@allowed = (); # if present only these callsigns are regarded as valid WWV updators
@denied = (); # if present ignore any wwv from these callsigns
-my $dirprefix = "$main::data/wwv";
-my $param = "$dirprefix/param";
+$duplth = 20; # the length of text to use in the deduping
+$dupage = 12*3600; # the length of time to hold spot dups
+
+$dirprefix = "$main::data/wwv";
+$param = "$dirprefix/param";
+
+$filterdef = bless ([
+ # tag, sort, field, priv, special parser
+ ['by', 'c', 7],
+ ['origin', 'c', 8],
+ ['channel', 'c', 9],
+ ['by_dxcc', 'nc', 10],
+ ['by_itu', 'ni', 11],
+ ['by_zone', 'nz', 12],
+ ['origin_dxcc', 'nc', 13],
+ ['origin_itu', 'ni', 14],
+ ['origin_zone', 'nz', 15],
+ ], 'Filter::Cmd');
sub init
{
$fp = DXLog::new('wwv', 'dat', 'm');
- mkdir $dirprefix, 0777 if !-e $dirprefix; # now unnecessary DXLog will create it
do "$param" if -e "$param";
confess $@ if $@;
}
# write the current data away
sub store
{
- my $fh = new FileHandle;
+ my $fh = new IO::File;
open $fh, "> $param" or confess "can't open $param $!";
print $fh "# Geomagnetic data parameter file last mod:", scalar gmtime, "\n";
print $fh "\$date = $date;\n";
print $fh "\$sfi = $sfi;\n";
print $fh "\$a = $a;\n";
print $fh "\$k = $k;\n";
+ print $fh "\$r = $r;\n";
print $fh "\$from = '$from';\n";
print $fh "\$node = '$node';\n";
print $fh "\@denied = qw(", join(' ', @denied), ");\n" if @denied > 0;
close $fh;
# log it
- $fp->writeunix($date, "$from^$date^$sfi^$a^$k^$forecast^$node");
+ $fp->writeunix($date, "$from^$date^$sfi^$a^$k^$forecast^$node^$r");
}
# update WWV info in one go (usually from a PC23)
sub update
{
- my ($mydate, $mytime, $mysfi, $mya, $myk, $myforecast, $myfrom, $mynode) = @_;
- if ((@allowed && grep {$_ eq $from} @allowed) ||
- (@denied && !grep {$_ eq $from} @denied) ||
+ my ($mydate, $mytime, $mysfi, $mya, $myk, $myforecast, $myfrom, $mynode, $myr) = @_;
+ $myfrom =~ s/-\d+$//;
+ if ((@allowed && grep {$_ eq $myfrom} @allowed) ||
+ (@denied && !grep {$_ eq $myfrom} @denied) ||
(@allowed == 0 && @denied == 0)) {
# my $trydate = cltounix($mydate, sprintf("%02d18Z", $mytime));
if ($mydate >= $date) {
+ if ($myr) {
+ $r = 0 + $myr;
+ } else {
+ $r = 0 unless abs ($mysfi - $sfi) > 3;
+ }
$sfi = 0 + $mysfi;
$k = 0 + $myk;
$a = 0 + $mya;
@_ ? $k = shift : $k ;
}
+sub r
+{
+ @_ ? $r = shift : $r ;
+}
+
sub a
{
@_ ? $a = shift : $a ;
@_ ? $forecast = shift : $forecast ;
}
+
#
# print some items from the log backwards in time
#
{
my $from = shift;
my $to = shift;
- my @date = $fp->unixtoj(shift);
+ my $date = $fp->unixtoj(shift);
my $pattern = shift;
my $search;
my @out;
$eval = qq(
my \$c;
my \$ref;
- for (\$c = \$ #in; \$c >= 0; \$c--) {
+ for (\$c = \$#in; \$c >= 0; \$c--) {
\$ref = \$in[\$c];
if ($search) {
\$count++;
$fp->close; # close any open files
- my $fh = $fp->open(@date);
+ my $fh = $fp->open($date);
for ($count = 0; $count < $to; ) {
my @in = ();
if ($fh) {
#
sub readfile
{
- my @date = $fp->unixtoj(shift);
- my $fh = $fp->open(@date);
+ my $date = $fp->unixtoj(shift);
+ my $fh = $fp->open($date);
my @spots = ();
my @in;
}
return @in;
}
+
+# enter the spot for dup checking and return true if it is already a dup
+sub dup
+{
+ my ($d, $sfi, $k, $a, $text) = @_;
+
+ # dump if too old
+ return 2 if $d < $main::systime - $dupage;
+
+ my $dupkey = "W$d|$sfi|$k|$a";
+ return DXDupe::check($dupkey, $main::systime+$dupage);
+}
+
+sub listdups
+{
+ return DXDupe::listdups('W', $dupage, @_);
+}
1;
__END__;
+