added Steve's (K9AN) new versions
authorminima <minima>
Sun, 23 Sep 2001 15:42:09 +0000 (15:42 +0000)
committerminima <minima>
Sun, 23 Sep 2001 15:42:09 +0000 (15:42 +0000)
Changes
cmd/Commands_en.hlp
cmd/show/moon.pl
cmd/show/sun.pl
perl/Messages
perl/Sun.pm

diff --git a/Changes b/Changes
index 8363ca58964814ceb1b33eca6fe150bf736d56e1..be0a097805c49a0d1160878226fe5fad3ef318db 100644 (file)
--- a/Changes
+++ b/Changes
@@ -1,3 +1,11 @@
+23Sep01=======================================================================
+1. I have incorporated Steve's (K9AN) lastest sh/sun and sh/moon stuff which
+copes much better with some of the end effects that occur in these calc-
+ulations. You can now also see up to a year into the past or future. The 
+results compare favourably with the US Naval Obs (unlike certain other
+software's output which "I would not want to use their results to aim my 
+moon rocket..."). It also fixes some ambiguity about which day the results
+are actually for.
 21Sep01=======================================================================
 1. fix set/lockout so that it is possible to lock out all SSIDs except those
 specifically unlocked and so that you don't need to lock the non-SSID call in
index 095b7764cfa6977964bfc82873a00542fa91d1c7..b6e41a03233f76b688ea0fe767f40545cf0b4c40 100644 (file)
@@ -1514,6 +1514,15 @@ For example:-
   SH/MOON
   SH/MOON G1TLH W5UN
 
+You can also use this command to see into the past or the future, so
+if you want to see yesterday's times then do:-
+
+  SH/MOON -1 
+
+or in three days time:-
+
+  SH/MOON +3 W9
+
 === 0^SHOW/MUF <prefix> [<hours>][long]^Show the likely propagation to a prefix
 This command allow you to estimate the likelihood of you contacting
 a station with the prefix you have specified. The output assumes a modest
@@ -1673,7 +1682,7 @@ that callsign is connected to the cluster.
 
 If no callsign is given then show the information for yourself.
 
-=== 0^SHOW/SUN [<prefix>|<callsign>]^Show sun rise and set times
+=== 0^SHOW/SUN [+/- days][<prefix>|<callsign>]^Show sun rise and set times
 Show the sun rise and set times for a (list of) prefixes or callsigns, 
 together with the azimuth and elevation of the sun currently at those
 locations.
@@ -1690,6 +1699,15 @@ For example:-
   SH/SUN
   SH/SUN G1TLH K9CW ZS
 
+You can also use this command to see into the past or the future, so
+if you want to see yesterday's times then do:-
+
+  SH/SUN -1 
+
+or in three days time:-
+
+  SH/SUN +3 W9
+
 === 0^SHOW/TIME [<prefix>|<callsign>]^Show the local time 
 If no prefixes or callsigns are given then this command returns the local
 time and UTC as the computer has it right now. If you give some prefixes
index ef1ba4573a9516695c0dc89ce5979f5100492ae0..8013345a1407cdfd061a2f293533e646e76185d7 100644 (file)
@@ -4,14 +4,34 @@
 #
 # 1999/11/9 Steve Franke K9AN
 # 2000/10/27 fixed bug involving degree to radian conversion.
+# 2001/09/15 accept prefix/call and number of days from today (+ or -). 
+#            e.g. sh/moon 2 w0 w9      shows rise/set 2 days hence for w0, w9
+#                 sh/moon w0 w9 2      same thing
+#            az and el are shown only when day offset is zero (i.e. today).
 
 my ($self, $line) = @_;
-my @list = split /\s+/, $line;
+my @f = split /\s+/, $line;
 
-my $l;
 my @out;
+my $f;
+my $l;
+my $n_offset;
+my @list;
+
+while ($f = shift @f){
+       if(!$n_offset){
+               ($n_offset) = $f =~ /^([-+]?\d+)$/;
+               next if $n_offset;
+       }
+       push @list, $f;
+}
+$n_offset = 0 unless defined $n_offset;
+$n_offset = 0 if $n_offset > 365;  # can request moon rise/set up to 1 year ago or from now... 
+$n_offset = 0 if $n_offset < -365;
+
 my ($lat, $lon);              # lats and longs in radians
-my ($sec, $min, $hr, $day, $month, $yr) = (gmtime($main::systime))[0,1,2,3,4,5];
+my ($sec, $min, $hr, $day, $month, $yr) = (gmtime($main::systime+$n_offset*24*60*60))[0,1,2,3,4,5];
+
 $month++;
 $yr += 1900;
 
@@ -43,12 +63,20 @@ if (@list) {
        }
 }
 
-push @out, $self->msg('moon');
+if( !$n_offset ) {
+       push @out, $self->msg('moon_with_azel');
+} else {
+       push @out, $self->msg('moon');
+}
 
 foreach $l (@in) {
        my ($rise, $set, $az, $dec, $loss )=Sun::rise_set($yr,$month,$day,$hr,$min,$l->[1],$l->[2],1);
        $l->[3] =~ s{(-\d+|/\w+)$}{};
-       push @out,sprintf("%-6.6s %-30.30s %s %s %6.1f %6.1f      %3.1f", $l->[3], $l->[0], $rise, $set, $az, $dec, $loss);
+       if( !$n_offset ) {      
+       push @out,sprintf("%-6.6s %-30.30s %02d/%02d/%4d %s %s %6.1f %6.1f", $l->[3], $l->[0], $day, $month, $yr, $rise, $set, $az, $dec);
+       } else {
+       push @out,sprintf("%-6.6s %-30.30s %02d/%02d/%4d %s %s", $l->[3], $l->[0], $day, $month, $yr, $rise, $set);
+       }
 }
 
                        
index 07172ce05b34cafaa794bf840b9d7d6a2fc51fa0..d7c9766ccdcfea78a475007dbecc39b225c3bf6f 100644 (file)
@@ -4,14 +4,34 @@
 #
 # 1999/11/9 Steve Franke K9AN
 # 2000/10/27 fixed bug involving degree to radian conversion.
+# 2001/09/15 accept prefix/call and number of days from today (+ or -).
+#            e.g. sh/moon 2 w0 w9      shows rise/set 2 days hence for w0, w9
+#                 sh/moon w0 w9 2      same thing
+#            az and el are shown only when day offset is zero (i.e. today).
 
 my ($self, $line) = @_;
-my @list = split /\s+/, $line;
+my @f = split /\s+/, $line;
 
-my $l;
 my @out;
+my $f;
+my $l;
+my $n_offset;
+my @list;
+
+while ($f = shift @f){
+        if(!$n_offset){
+                ($n_offset) = $f =~ /^([-+]?\d+)$/;
+                next if $n_offset;
+        }
+        push @list, $f;
+}
+$n_offset = 0 unless defined $n_offset;
+$n_offset = 0 if $n_offset > 365;  # can request moon rise/set up to 1 year ago or from now...
+$n_offset = 0 if $n_offset < -365;
+
 my ($lat, $lon);              # lats and longs in radians
-my ($sec, $min, $hr, $day, $month, $yr) = (gmtime($main::systime))[0,1,2,3,4,5];
+my ($sec, $min, $hr, $day, $month, $yr) = (gmtime($main::systime+$n_offset*24*60*60))[0,1,2,3,4,5];
+
 $month++;
 $yr += 1900;
 
@@ -43,13 +63,21 @@ if (@list) {
        }
 }
 
-push @out, $self->msg('sun');
+if( !$n_offset ) {
+        push @out, $self->msg('sun_with_azel');
+} else {
+        push @out, $self->msg('sun');
+}
+
 foreach $l (@in) {
-       my ($rise, $set, $az, $dec )=Sun::rise_set($yr,$month,$day,$hr,$min,$l->[1],$l->[2],0);
-       $l->[3] =~ s{(-\d+|/\w+)$}{};
-       push @out,sprintf("%-6.6s %-30.30s %s %s %6.1f %6.1f ", $l->[3], $l->[0], $rise, $set, $az, $dec);
+        my ($rise, $set, $az, $dec, $loss )=Sun::rise_set($yr,$month,$day,$hr,$min,$l->[1],$l->[2],0);
+        $l->[3] =~ s{(-\d+|/\w+)$}{};
+        if( !$n_offset ) {
+        push @out,sprintf("%-6.6s %-30.30s %02d/%02d/%4d %s %s %6.1f %6.1f", $l->[3], $l->[0], $day, $month, $yr, $rise, $set, $az, $dec);
+        } else {
+        push @out,sprintf("%-6.6s %-30.30s %02d/%02d/%4d %s %s", $l->[3], $l->[0], $day, $month, $yr, $rise, $set);
+        }
 }
 
-                       
 
 return (1, @out);
index 0f9c0e136e6deb6fc1cb2d439fe6d24716674968..e4ee79c68a2df186f2ccd664cb6a3c1e90bb0283 100644 (file)
@@ -160,7 +160,8 @@ package DXM;
                                msg3 => 'Msg $_[0]: $_[1] changed from $_[2] to $_[3]',
                                msgu => 'usage: msg <cmd> <msgno> data...',
                                merge1 => 'Merge request for $_[1] spots and $_[2] WWV sent to $_[0]',
-                               moon => 'Location                              Rise   Set      Azim   Elev RGain dB',
+                               moon => 'Location                              dd/mm/yyyy Rise   Set',
+                               moon_with_azel => 'Location                              dd/mm/yyyy Rise   Set      Azim   Elev',
                                mond => 'Monitoring Disabled',
                                mone => 'Monitoring Enabled',
                                namee1 => 'Please enter your name, set/name <your name>',
@@ -233,7 +234,8 @@ package DXM;
                                statvhf => 'VHF+ DX Spot Stats, last 31 days',
                                statvhft => 'VHF+ DX Spot Stats, last 31 days for DXCC $_[0]',
                                statdx => 'Total DX Spots last 31 days',
-                               sun => 'Location                              Rise   Set      Azim   Elev',
+                               sun => 'Location                              dd/mm/yyyy Rise   Set',
+                               sun_with_azel => 'Location                              dd/mm/yyyy Rise   Set      Azim   Elev',
                                suser1 => 'usage: callsign user_field_name value',
                                suser2 => 'User $_[0] not found',
                                suser3 => 'User field \'$_[0]\' was \'$_[1]\' now set to \'$_[2]\'',
index 13f7d20cdc1bc7cb60cca01cae1466bfd20bf144..2fe033cd8e42911c37209f430120f402312dea98 100644 (file)
@@ -18,6 +18,8 @@
 #
 # $Id$
 # 
+# 2001/09/15 some changes to take care of cases where the object 
+#            doesn't rise or set on a given day... 
 
 package Sun;
 
@@ -160,6 +162,10 @@ sub rise_set
        my $lon = shift;
        my $sun0_moon1=shift;           # 0 for sun, 1 for moon, 2 for venus...
 
+       my $norise = 0;
+       my $noset = 0;
+       my ($risehr,$risemin,$risetime,$sethr,$setmin,$settime);
+
        my ($alpha1,$alpha2,$alpha3,$delta1,$delta2,$delta3);
        my ($m0,$m1,$m2,$theta,$alpha,$delta,$H,$az,$h,$h0,$aznow,$hnow,$corr);
        my ($i,$arg,$argtest,$H0,$alphanow,$deltanow,$distance,$distancenow);
@@ -205,14 +211,10 @@ sub rise_set
        }
 
        $arg = (sindeg($h0)-sindeg($lat)*sindeg($delta2))/(cosdeg($lat)*cosdeg($delta2));
-       $argtest = tandeg($lat)*tandeg($delta2);
-
-       if ( $argtest < -1. ) {
-               return sprintf("Doesn't rise.");
-       }
-       if ( $argtest > 1. ) {
-               return sprintf("Doesn't set.");
-       }
+       if ( abs($arg) > 1. ) {    # either up all day or down all day 
+               $norise = 1;       # leave it to the user to examine 
+               $noset = 1;        # the elevation angle (or look outside!) 
+       }                          # to figure out which.
 
        $H0 = acos($arg)*$r2d;
        my $aa=$alpha2-$alpha1;
@@ -248,56 +250,71 @@ sub rise_set
                $m0=$m0-1 if( $m0 > 1 );
        }
 
-       $m1 = $m0 - $H0/360.;
-       $m1=$m1+1 if( $m1 < 0 );
-       $m1=$m1-1 if( $m1 > 1 );
-       for ($i=1; $i<=2; $i++) {
-               $theta = $theta0+360.985647*$m1;
-               $alpha=$alpha2+$m1*($aa+$ba+$m1*$ca)/2;
-               $delta=$delta2+$m1*($ad+$bd+$m1*$cd)/2;
-               $H=$theta-$lon-$alpha;
-               $H=reduce_angle_to_360($H);
-               ($az,$h)=get_az_el($H,$delta,$lat);
-               $corr=($h-$h0)/(360*(cosdeg($delta)*cosdeg($lat)*sindeg($H)));
-               $m1=$m1+$corr;
+
+       if( !$norise ){
+               $m1 = $m0 - $H0/360.;
                $m1=$m1+1 if( $m1 < 0 );
                $m1=$m1-1 if( $m1 > 1 );
+               for ($i=1; $i<=2; $i++) {
+                       $theta = $theta0+360.985647*$m1;
+                       $alpha=$alpha2+$m1*($aa+$ba+$m1*$ca)/2;
+                       $delta=$delta2+$m1*($ad+$bd+$m1*$cd)/2;
+                       $H=$theta-$lon-$alpha;
+                       $H=reduce_angle_to_360($H);
+                       ($az,$h)=get_az_el($H,$delta,$lat);
+                       $corr=($h-$h0)/(360*(cosdeg($delta)*cosdeg($lat)*sindeg($H)));
+                       $m1=$m1+$corr;
+                       $norise=1 if( $m1 < 0 || $m1 > 1); 
+               }
        }
 
-       $m2 = $m0 + $H0/360.;
-       $m2=$m2+1 if( $m2 < 0 );
-       $m2=$m2-1 if( $m2 > 1 );
-       for ($i=1; $i<=2; $i++) {
-               $theta = $theta0+360.985647*$m2;
-               $alpha=$alpha2+$m2*($aa+$ba+$m2*$ca)/2;
-               $delta=$delta2+$m2*($ad+$bd+$m2*$cd)/2;
-               $H=$theta-$lon-$alpha;
-               $H=reduce_angle_to_360($H);
-               ($az,$h)=get_az_el($H,$delta,$lat);
-               $corr=($h-$h0)/(360*(cosdeg($delta)*cosdeg($lat)*sindeg($H)));
-               $m2 = $m2 + $corr;
+       if( !$norise ) {
+               $risehr=int($m1*24);
+               $risemin=($m1*24-int($m1*24))*60+0.5;
+               if ( $risemin >= 60 ) {
+                       $risemin=$risemin-60;
+                       $risehr=$risehr+1;
+               }
+               $risetime=sprintf("%02d:%02dZ",$risehr,$risemin);
+       } else {
+               $risetime="NoRise";
+       }
+
+       if( !$noset ){
+               $m2 = $m0 + $H0/360.;
                $m2=$m2+1 if( $m2 < 0 );
                $m2=$m2-1 if( $m2 > 1 );
+               for ($i=1; $i<=2; $i++) {
+                       $theta = $theta0+360.985647*$m2;
+                       $alpha=$alpha2+$m2*($aa+$ba+$m2*$ca)/2;
+                       $delta=$delta2+$m2*($ad+$bd+$m2*$cd)/2;
+                       $H=$theta-$lon-$alpha;
+                       $H=reduce_angle_to_360($H);
+                       ($az,$h)=get_az_el($H,$delta,$lat);
+                       $corr=($h-$h0)/(360*(cosdeg($delta)*cosdeg($lat)*sindeg($H)));
+                       $m2 = $m2 + $corr;
+                       $noset=1 if( $m2 < 0 || $m2 > 1); 
+               }
        }
-       my ($risehr,$risemin,$sethr,$setmin);
-       $risehr=int($m1*24);
-       $risemin=($m1*24-int($m1*24))*60+0.5;
-       if ( $risemin >= 60 ) {
-               $risemin=$risemin-60;
-               $risehr=$risehr+1;
-       }
-       $sethr=int($m2*24);
-       $setmin=($m2*24-int($m2*24))*60+0.5;
-       if ( $setmin >= 60 ) {
-               $setmin=$setmin-60;
-               $sethr=$sethr+1;
-       }
+
+       if( !$noset ) {
+               $sethr=int($m2*24);
+               $setmin=($m2*24-int($m2*24))*60+0.5;
+               if ( $setmin >= 60 ) {
+                       $setmin=$setmin-60;
+                       $sethr=$sethr+1;
+               }
+               $settime=sprintf("%02d:%02dZ",$sethr,$setmin);
+       } else {
+               $settime="NoSet ";
+       }                       
+
 
        if ( $sun0_moon1 == 0 ) {
-               return (sprintf("%02d:%02dZ", $risehr,$risemin), sprintf("%02d:%02dZ",$sethr,$setmin),$aznow+180,$hnow);
+               return (sprintf("%s", $risetime), sprintf("%s",$settime),$aznow+180,$hnow);
        }
        if ( $sun0_moon1 == 1 ) {
-               return (sprintf("%02d:%02dZ", $risehr,$risemin), sprintf("%02d:%02dZ",$sethr,$setmin), 
+               return (sprintf("%s", $risetime), sprintf("%s",$settime), 
                                $aznow+180,$hnow, -40*log10($distance/385000) );
        }
 }