allow norad keps to be translated
[spider.git] / perl / convkeps.pl
index 5102e3d22c65d6071f23294f7d181e10a9b468ae..5b546ca7839d5a05979ccfea3d0830f1dfe15bc1 100755 (executable)
@@ -8,7 +8,8 @@
 # It will write a file called /spider/local/Keps.pm, this means that
 # the latest version will be read in every time you restart the 
 # cluster.pl. You can also call Sun::load from a cron line if
-# you like to re-read it automatically.
+# you like to re-read it automatically. If you update it manually
+# load/keps will load the latest version into the cluster
 #
 # This program is designed to be called from /etc/aliases or
 # a .forward file so you can get yourself on the keps mailing
 #
 # http://www.amsat.org/amsat/ftp/keps/current/nasa.all
 #
+# Please note that this will UPDATE your keps file
+# 
+# Usage: 
+#    email | convkeps.pl        (in amsat email format)  
+#    convkeps.pl -p keps.in     (a file with just plain keps)
+# 
+# if you add the -c flag then the %keps hash will be cleared down
+# before adding the new ones.
+#
 # Copyright (c) 2000 Dirk Koopman G1TLH
 #
 # $Id$
 #
 
 require 5.004;
+package Sun;
 
 # search local then perl directories
 BEGIN {
@@ -38,34 +49,66 @@ BEGIN {
 }
 
 use strict;
-use Data::Dumper;
+use vars qw($root %keps);
 
-use vars qw($root);
+use Data::Dumper;
+require Keps;
 
 my $fn = "$root/local/Keps.pm";
 my $state = 0;
 my $name;
-my %keps;
 my $ref;
 my $line;
+my $count = 0;
+
+my %lookup = (
+       'AO-5' => 'AO-05',
+       'AO-6' => 'AO-06',
+       'AO-7' => 'AO-07',
+       'AO-8' => 'AO-08',
+       
+);
+
+my $f = \*STDIN;
 
-while (<STDIN>) {
+while (@ARGV) {
+       my $arg = shift @ARGV;
+       if ($arg eq '-p') {
+               $state = 1;
+       } elsif ($arg eq '-e') {
+               $state = 0;
+       } elsif ($arg eq '-c') {
+               %keps = ();
+       } elsif ($arg =~ /^-/) {
+               die "Usage: convkeps.pl [-c] [-e|-p] [<filename>]\n\t-p - plain file just containing keps\n\t-e - amsat email format input file (default)\n\t-c - clear Keps data before adding this lot\n";
+       } else {
+               open (IN, $arg) or die "cannot open $arg (!$)";
+               $f = \*IN;
+       }
+}
+
+while (<$f>) {
        ++$line;
+#    print;
        chomp;
+       last if m{^-};
+
        s/^\s+//;
-    s/\s+$//;
+    s/[\s\r]+$//;
        next unless $_;
        last if m{^/EX}i;
-       last if m{^-};
        
-       if ($state == 0 && /^TO ALL/) {
+       if ($state == 0 && /^Decode/i) {
                $state = 1;
        } elsif ($state == 1) {
-               last if m{^/EX/i};
+               last if m{^-};
+               next if m{^To\s+all}i;
                
-               if (/^\w+/) {
-                       s/\s/-/g;
-                       $name = $_;
+               if (/^([- \w]+)(?:\s+\[[-+\w]\])$/) {
+                       my $n = uc $1;
+                       $n =~ s/\s/-/g;
+                       $name = $lookup{$n};
+                       $name ||= $n;
                        $ref = $keps{$name} = {}; 
                        $state = 2;
                }
@@ -79,12 +122,12 @@ while (<STDIN>) {
                        $ref->{mm2} = genenum($mm2);
                        $ref->{bstar} = genenum($bstar);
                        $ref->{elset} = $elset - 0;
-#                      print "$id $number $epoch $decay $mm2 $bstar $elset\n"; 
-#                      print "mm2: $ref->{mm2} bstar: $ref->{bstar}\n";
+                       #print "$id $number $epoch $decay $mm2 $bstar $elset\n"; 
+                       #print "mm2: $ref->{mm2} bstar: $ref->{bstar}\n";
                        
                        $state = 3;
                } else {
-                       print "out of order on line $line\n";
+                       #print "out of order on line $line\n";
                        undef $ref;
                        delete $keps{$name};
                        $state = 1;
@@ -99,8 +142,9 @@ while (<STDIN>) {
                        $ref->{argperigee} = $peri - 0;
                        $ref->{raan} = $raan - 0;
                        $ref->{orbit} = $orbit - 0;
+                       $count++;
                } else {
-                       print "out of order on line $line\n";
+                       #print "out of order on line $line\n";
                        delete $keps{$name};
                }
                undef $ref;
@@ -108,21 +152,28 @@ while (<STDIN>) {
        }
 }
 
-my $dd = new Data::Dumper([\%keps], [qw(*keps)]);
-$dd->Indent(1);
-$dd->Quotekeys(0);
-open(OUT, ">$fn") or die "$fn $!";
-print OUT "#\n# this file is automatically produced by convkeps.pl\n#\n";
-print OUT "\npackage Sun;\n\n";
-print OUT $dd->Dumpxs;
-print OUT "\n";
-close(OUT);
+if ($count) {
+       my $dd = new Data::Dumper([\%keps], [qw(*keps)]);
+       $dd->Indent(1);
+       $dd->Quotekeys(0);
+       open(OUT, ">$fn") or die "$fn $!";
+       print OUT "#\n# this file is automatically produced by convkeps.pl\n#\n";
+       print OUT "# Last update: ", scalar gmtime, "\n#\n";
+       print OUT "\npackage Sun;\n\n";
+       print OUT $dd->Dumpxs;
+       print OUT "1;\n";
+       close(OUT);
+}
+
+print "$count keps converted\n";
+exit($count ? 0 : -1);
 
 
 # convert (+/-)00000-0 to (+/-).00000e-0
 sub genenum
 {
        my ($sign, $frac, $esign, $exp) = unpack "aa5aa", shift;
+       $esign = '+' if $esign eq ' ';
        my $n = $sign . "." . $frac . 'e' . $esign . $exp;
        return $n - 0;
 }