[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: =?utf-8?q?=5Bkstars=5D_kstars=3A_Remove_old_satellites_tracking_?=
From: Jérome_SONRIER <jsid () emor3j ! fr ! eu ! org>
Date: 2011-04-14 0:28:43
Message-ID: 20110414002843.F30EAA60BE () git ! kde ! org
[Download RAW message or body]
Git commit e7fe66b5396dbd75943d1dcf4e57e0bd95ed12be by Jérome SONRIER.
Committed on 14/04/2011 at 00:44.
Pushed by jsonrier into branch 'master'.
Remove old satellites tracking system.
M +2 -7 kstars/CMakeLists.txt
D +0 -17 kstars/satlib/CMakeLists.txt
D +0 -3010 kstars/satlib/SatLib.c
D +0 -93 kstars/satlib/SatLib.h
D +0 -80 kstars/satlib/timeval.h
D +0 -351 kstars/skycomponents/satellitecomponent.cpp
D +0 -97 kstars/skycomponents/satellitecomponent.h
D +0 -106 kstars/skycomponents/satellitecomposite.cpp
D +0 -51 kstars/skycomponents/satellitecomposite.h
M +0 -7 kstars/skycomponents/skymapcomposite.cpp
M +0 -1 kstars/skycomponents/skymapcomposite.h
http://commits.kde.org/kstars/e7fe66b5396dbd75943d1dcf4e57e0bd95ed12be
diff --git a/kstars/CMakeLists.txt b/kstars/CMakeLists.txt
index 03b7545..7094dba 100644
--- a/kstars/CMakeLists.txt
+++ b/kstars/CMakeLists.txt
@@ -1,6 +1,5 @@
add_subdirectory( data )
-add_subdirectory( icons )
-add_subdirectory( satlib )
+add_subdirectory( icons )
add_subdirectory( htmesh )
Find_package(ZLIB REQUIRED)
@@ -72,7 +71,6 @@ include_directories(
${kstars_SOURCE_DIR}/kstars/tools
${kstars_SOURCE_DIR}/kstars/skyobjects
${kstars_SOURCE_DIR}/kstars/skycomponents
- ${kstars_SOURCE_DIR}/kstars/satlib
# ${CMAKE_SOURCE_DIR}/kstars/kstars/htmesh
# ${CMAKE_SOURCE_DIR}/libkdeedu/extdate
${ZLIB_INCLUDE_DIR}
@@ -193,9 +191,7 @@ set(libkstarscomponents_SRCS
skycomponents/asteroidscomponent.cpp
skycomponents/cometscomponent.cpp
skycomponents/planetmoonscomponent.cpp
- skycomponents/solarsystemcomposite.cpp
- #skycomponents/satellitecomposite.cpp
- #skycomponents/satellitecomponent.cpp
+ skycomponents/solarsystemcomposite.cpp
skycomponents/satellitescomponent.cpp
skycomponents/starcomponent.cpp
skycomponents/deepstarcomponent.cpp
@@ -378,7 +374,6 @@ target_link_libraries(kstars
${KDE4_KDECORE_LIBS}
${KDE4_KNEWSTUFF3_LIBS}
${KDE4_KIO_LIBS}
- SatLib
htmesh
${ZLIB_LIBRARIES}
)
diff --git a/kstars/satlib/CMakeLists.txt b/kstars/satlib/CMakeLists.txt
deleted file mode 100644
index 3429970..0000000
--- a/kstars/satlib/CMakeLists.txt
+++ /dev/null
@@ -1,17 +0,0 @@
-## SatLib Library ###
-set(SatLib_LIB_SRCS
- ${kstars_SOURCE_DIR}/kstars/satlib/SatLib.c
-)
-
-add_definitions(-DUSE_KDEWIN32_LIB -DBUILD_DLL)
-
-kde4_add_library(SatLib SHARED ${SatLib_LIB_SRCS})
-
-if(NOT WIN32)
- target_link_libraries(SatLib m)
-else(NOT WIN32)
- target_link_libraries(SatLib ${KDEWIN32_LIBRARIES})
-endif(NOT WIN32)
-
-set_target_properties(SatLib PROPERTIES VERSION ${GENERIC_LIB_VERSION} SOVERSION \
${GENERIC_LIB_SOVERSION} )
-install(TARGETS SatLib ${INSTALL_TARGETS_DEFAULT_ARGS})
diff --git a/kstars/satlib/SatLib.c b/kstars/satlib/SatLib.c
deleted file mode 100644
index a8cc27e..0000000
--- a/kstars/satlib/SatLib.c
+++ /dev/null
@@ -1,3010 +0,0 @@
-/***************************************************************************\
-* SATLIB : A satellite position/orbital prediction library *
-* Made by Patrick Chevalley, Vincent Suc & Jean-Baptiste Butet. *
-* Copyright (C) 2005 *
-* http://www.sf.net/predictsatlib *
-*****************************************************************************
-* This Library is based on : PREDICT, Made by John A. Magliacan *
-*****************************************************************************
-* SGP4/SDP4 code was derived from Pascal routines originally written by *
-* Dr. TS Kelso, and converted to C by Neoklis Kyriazis, 5B4AZ *
-*****************************************************************************
-* *
-* This program is free software; you can redistribute it and/or modify *
-* it under the terms of the GNU General Public License as published by *
-* the Free Software Foundation; either version 2 of the License, or *
-* (at your option) any later version. *
-* *
-* This program is distributed in the hope that it will be useful, *
-* but WITHOUT ANY WARRANTY; without even the implied warranty of *
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
-* GNU General Public License for more details. *
-* *
-* You should have received a copy of the GNU General Public License *
-* along with this program; if not, write to the *
-* Free Software Foundation, Inc., *
-* Foundation, Inc., 51 Franklin Street, Fifth Floor, *
-* Boston, MA 02110-1301 USA *
-* *
-* Licensed under the GNU GPL *
-* *
-*****************************************************************************
-*Changelog : *
-* *
-*09/10/2005 :SatLib, Project (re)started, v0.1 *
-*26/05/1991 :Predict, Project started *
-\***************************************************************************/
-
-#include <math.h>
-#include <signal.h>
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
-#include "stdio.h"
-
-#include "SatLib.h"
-#include "timeval.h"
-
-/* Constants used by SGP4/SDP4 code */
-
-#define km2mi 0.621371 /* km to miles */
-#define deg2rad 1.745329251994330E-2 /* Degrees to radians */
-#define pi 3.14159265358979323846 /* Pi */
-#define pio2 1.57079632679489656 /* Pi/2 */
-#define x3pio2 4.71238898038468967 /* 3*Pi/2 */
-#define twopi 6.28318530717958623 /* 2*Pi */
-#define e6a 1.0E-6
-#define tothrd 6.6666666666666666E-1 /* 2/3 */
-#define xj2 1.0826158E-3 /* J2 Harmonic (WGS '72) */
-#define xj3 -2.53881E-6 /* J3 Harmonic (WGS '72) */
-#define xj4 -1.65597E-6 /* J4 Harmonic (WGS '72) */
-#define xke 7.43669161E-2
-#define xkmper 6.378137E3 /* WGS 84 Earth radius km */
-#define xmnpda 1.44E3 /* Minutes per day */
-#define ae 1.0
-#define ck2 5.413079E-4
-#define ck4 6.209887E-7
-#define f 3.35281066474748E-3 /* Flattening factor */
-#define ge 3.986008E5 /* Earth gravitational constant (WGS '72) */
-#define s 1.012229
-#define qoms2t 1.880279E-09
-#define secday 8.6400E4 /* Seconds per day */
-#define omega_E 1.00273790934 /* Earth rotations/siderial day */
-#define omega_ER 6.3003879 /* Earth rotations, rads/siderial day */
-#define zns 1.19459E-5
-#define c1ss 2.9864797E-6
-#define zes 1.675E-2
-#define znl 1.5835218E-4
-#define c1l 4.7968065E-7
-#define zel 5.490E-2
-#define zcosis 9.1744867E-1
-#define zsinis 3.9785416E-1
-#define zsings -9.8088458E-1
-#define zcosgs 1.945905E-1
-#define zcoshs 1
-#define zsinhs 0
-#define q22 1.7891679E-6
-#define q31 2.1460748E-6
-#define q33 2.2123015E-7
-#define g22 5.7686396
-#define g32 9.5240898E-1
-#define g44 1.8014998
-#define g52 1.0508330
-#define g54 4.4108898
-#define root22 1.7891679E-6
-#define root32 3.7393792E-7
-#define root44 7.3636953E-9
-#define root52 1.1428639E-7
-#define root54 2.1765803E-9
-#define thdt 4.3752691E-3
-#define rho 1.5696615E-1
-#define mfactor 7.292115E-5
-#define sr 6.96000E5 /* Solar radius - km (IAU 76) */
-#define AU 1.49597870691E8 /* Astronomical unit - km (IAU 76) */
-
-/* Entry points of Deep() */
-
-#define dpinit 1 /* Deep-space initialization code */
-#define dpsec 2 /* Deep-space secular code */
-#define dpper 3 /* Deep-space periodic code */
-
-/* Flow control flag definitions */
-
-#define ALL_FLAGS -1
-#define SGP_INITIALIZED_FLAG 0x000001 /* not used */
-#define SGP4_INITIALIZED_FLAG 0x000002
-#define SDP4_INITIALIZED_FLAG 0x000004
-#define SGP8_INITIALIZED_FLAG 0x000008 /* not used */
-#define SDP8_INITIALIZED_FLAG 0x000010 /* not used */
-#define SIMPLE_FLAG 0x000020
-#define DEEP_SPACE_EPHEM_FLAG 0x000040
-#define LUNAR_TERMS_DONE_FLAG 0x000080
-#define NEW_EPHEMERIS_FLAG 0x000100 /* not used */
-#define DO_LOOP_FLAG 0x000200
-#define RESONANCE_FLAG 0x000400
-#define SYNCHRONOUS_FLAG 0x000800
-#define EPOCH_RESTART_FLAG 0x001000
-#define VISIBLE_FLAG 0x002000
-#define SAT_ECLIPSED_FLAG 0x004000
-
-#define MAXSAT 10000
-
-int numsat = 0;
-struct { char line1[70];
- char line2[70];
- char name[25];
- long catnum;
- long setnum;
- char designator[10];
- int year;
- double refepoch;
- double incl;
- double raan;
- double eccn;
- double argper;
- double meanan;
- double meanmo;
- double drag;
- double nddot6;
- double bstar;
- long orbitnum;
- } sat[MAXSAT];
-
-struct { char callsign[17];
- double stnlat;
- double stnlong;
- int stnalt;
- } qth;
-
-
-/* Global variables for sharing data among functions... */
-
-double tsince, jul_epoch, jul_utc, eclipse_depth=0,
- sat_azi, sat_ele, sat_range, sat_range_rate,
- sat_lat, sat_lon, sat_alt, sat_vel, phase,
- sun_azi, sun_ele, daynum, fm, fk, age, aostime,
- lostime, ax, ay, az, rx, ry, rz, squint, alat, alon,
- sun_ra, sun_dec, sun_lat, sun_lon, sun_range, sun_range_rate,
- moon_az, moon_el, moon_dx, moon_ra, moon_dec, moon_gha, moon_dv;
-
-char temp[80], output[25],
- ephem[5], sat_sun_status, findsun,
- calc_squint, database=0, xterm;
-
-int indx, antfd, iaz, iel, ma256, isplat, isplong, socket_flag=0,
- Flags=0;
-
-long rv, irk;
-
-unsigned char val[256];
-
-/** Type definitions **/
-
-/* Two-line-element satellite orbital data
- structure used directly by the SGP4/SDP4 code. */
-
-typedef struct {
- double epoch, xndt2o, xndd6o, bstar, xincl,
- xnodeo, eo, omegao, xmo, xno;
- int catnr, elset, revnum;
- char sat_name[25], idesg[9];
- } tle_t;
-
-/* Geodetic position structure used by SGP4/SDP4 code. */
-
-typedef struct {
- double lat, lon, alt, theta;
- } geodetic_t;
-
-/* General three-dimensional vector structure used by SGP4/SDP4 code. */
-
-typedef struct {
- double x, y, z, w;
- } vector_t;
-
-/* Common arguments between deep-space functions used by SGP4/SDP4 code. */
-
-typedef struct {
- /* Used by dpinit part of Deep() */
- double eosq, sinio, cosio, betao, aodp, theta2,
- sing, cosg, betao2, xmdot, omgdot, xnodot, xnodp;
-
- /* Used by dpsec and dpper parts of Deep() */
- double xll, omgadf, xnode, em, xinc, xn, t;
-
- /* Used by thetg and Deep() */
- double ds50;
- } deep_arg_t;
-
-/* Global structure used by SGP4/SDP4 code. */
-
-geodetic_t obs_geodetic;
-
-/* Two-line Orbital Elements for the satellite used by SGP4/SDP4 code. */
-
-tle_t tle;
-
-/* Functions for testing and setting/clearing flags used in SGP4/SDP4 code */
-
-int isFlagSet(int flag)
-{
- return (Flags&flag);
-}
-
-int isFlagClear(int flag)
-{
- return (~Flags&flag);
-}
-
-void SetFlag(int flag)
-{
- Flags|=flag;
-}
-
-void ClearFlag(int flag)
-{
- Flags&=~flag;
-}
-
-/* Remaining SGP4/SDP4 code follows... */
-
-int Sign(double arg)
-{
- /* Returns sign of a double */
-
- if (arg>0)
- return 1;
-
- else if (arg<0)
- return -1;
-
- else
- return 0;
-}
-
-double Sqr(double arg)
-{
- /* Returns square of a double */
- return (arg*arg);
-}
-
-double Cube(double arg)
-{
- /* Returns cube of a double */
- return (arg*arg*arg);
-}
-
-double Radians(double arg)
-{
- /* Returns angle in radians from argument in degrees */
- return (arg*deg2rad);
-}
-
-double Degrees(double arg)
-{
- /* Returns angle in degrees from argument in radians */
- return (arg/deg2rad);
-}
-
-double ArcSin(double arg)
-{
- /* Returns the arcsine of the argument */
-
- if (fabs(arg)>=1.0)
- return(Sign(arg)*pio2);
- else
-
- return(atan(arg/sqrt(1.0-arg*arg)));
-}
-
-double ArcCos(double arg)
-{
- /* Returns arccosine of argument */
- return(pio2-ArcSin(arg));
-}
-
-void Magnitude(vector_t *v)
-{
- /* Calculates scalar magnitude of a vector_t argument */
- v->w=sqrt(Sqr(v->x)+Sqr(v->y)+Sqr(v->z));
-}
-
-void Vec_Add(vector_t *v1, vector_t *v2, vector_t *v3)
-{
- /* Adds vectors v1 and v2 together to produce v3 */
- v3->x=v1->x+v2->x;
- v3->y=v1->y+v2->y;
- v3->z=v1->z+v2->z;
- Magnitude(v3);
-}
-
-void Vec_Sub(vector_t *v1, vector_t *v2, vector_t *v3)
-{
- /* Subtracts vector v2 from v1 to produce v3 */
- v3->x=v1->x-v2->x;
- v3->y=v1->y-v2->y;
- v3->z=v1->z-v2->z;
- Magnitude(v3);
-}
-
-void Scalar_Multiply(double k, vector_t *v1, vector_t *v2)
-{
- /* Multiplies the vector v1 by the scalar k to produce the vector v2 */
- v2->x=k*v1->x;
- v2->y=k*v1->y;
- v2->z=k*v1->z;
- v2->wbs(k)*v1->w;
-}
-
-void Scale_Vector(double k, vector_t *v)
-{
- /* Multiplies the vector v1 by the scalar k */
- v->x*=k;
- v->y*=k;
- v->z*=k;
- Magnitude(v);
-}
-
-double Dot(vector_t *v1, vector_t *v2)
-{
- /* Returns the dot product of two vectors */
- return (v1->x*v2->x+v1->y*v2->y+v1->z*v2->z);
-}
-
-double Angle(vector_t *v1, vector_t *v2)
-{
- /* Calculates the angle between vectors v1 and v2 */
- Magnitude(v1);
- Magnitude(v2);
- return(ArcCos(Dot(v1,v2)/(v1->w*v2->w)));
-}
-
-void Cross(vector_t *v1, vector_t *v2 ,vector_t *v3)
-{
- /* Produces cross product of v1 and v2, and returns in v3 */
- v3->x=v1->y*v2->z-v1->z*v2->y;
- v3->y=v1->z*v2->x-v1->x*v2->z;
- v3->z=v1->x*v2->y-v1->y*v2->x;
- Magnitude(v3);
-}
-
-void Normalize(vector_t *v)
-{
- /* Normalizes a vector */
- v->x/=v->w;
- v->y/=v->w;
- v->z/=v->w;
-}
-
-double AcTan(double sinx, double cosx)
-{
- /* Four-quadrant arctan function */
-
- if (cosx==0.0)
- {
- if (sinx>0.0)
- return (pio2);
- else
- return (x3pio2);
- }
-
- else
- {
- if (cosx>0.0)
- {
- if (sinx>0.0)
- return (atan(sinx/cosx));
- else
- return (twopi+atan(sinx/cosx));
- }
-
- else
- return (pi+atan(sinx/cosx));
- }
-}
-
-double FMod2p(double x)
-{
- /* Returns mod 2PI of argument */
-
- int i;
- double ret_val;
-
- ret_val=x;
- i=ret_val/twopi;
- ret_val-=i*twopi;
-
- if (ret_val<0.0)
- ret_val+=twopi;
-
- return ret_val;
-}
-
-double Modulus(double arg1, double arg2)
-{
- /* Returns arg1 mod arg2 */
-
- int i;
- double ret_val;
-
- ret_val=arg1;
- i=ret_val/arg2;
- ret_val-=i*arg2;
-
- if (ret_val<0.0)
- ret_val+=arg2;
-
- return ret_val;
-}
-
-double Frac(double arg)
-{
- /* Returns fractional part of double argument */
- return(arg-floor(arg));
-}
-
-int Round(double arg)
-{
- /* Returns argument rounded up to nearest integer */
- return((int)floor(arg+0.5));
-}
-
-double Int(double arg)
-{
- /* Returns the floor integer of a double arguement, as double */
- return(floor(arg));
-}
-
-void Convert_Sat_State(vector_t *pos, vector_t *vel)
-{
- /* Converts the satellite's position and velocity */
- /* vectors from normalized values to km and km/sec */
- Scale_Vector(xkmper, pos);
- Scale_Vector(xkmper*xmnpda/secday, vel);
-}
-
-double Julian_Date_of_Year(double year)
-{
- /* The function Julian_Date_of_Year calculates the Julian Date */
- /* of Day 0.0 of {year}. This function is used to calculate the */
- /* Julian Date of any date by using Julian_Date_of_Year, DOY, */
- /* and Fraction_of_Day. */
-
- /* Astronomical Formulae for Calculators, Jean Meeus, */
- /* pages 23-25. Calculate Julian Date of 0.0 Jan year */
-
- long A, B, i;
- double jdoy;
-
- year=year-1;
- i=year/100;
- A=i;
- i=A/4;
- B=2-A+i;
- i65.25*year;
- i+0.6001*14;
- jdoy=i+1720994.5+B;
-
- return jdoy;
-}
-
-double Julian_Date_of_Epoch(double epoch)
-{
- /* The function Julian_Date_of_Epoch returns the Julian Date of */
- /* an epoch specified in the format used in the NORAD two-line */
- /* element sets. It has been modified to support dates beyond */
- /* the year 1999 assuming that two-digit years in the range 00-56 */
- /* correspond to 2000-2056. Until the two-line element set format */
- /* is changed, it is only valid for dates through 2056 December 31. */
-
- double year, day;
-
- /* Modification to support Y2K */
- /* Valid 1957 through 2056 */
-
- day=modf(epoch*1E-3, &year)*1E3;
-
- if (year<57)
- year=year+2000;
- else
- year=year+1900;
-
- return (Julian_Date_of_Year(year)+day);
-}
-
-int DOY (int yr, int mo, int dy)
-{
- /* The function DOY calculates the day of the year for the specified */
- /* date. The calculation uses the rules for the Gregorian calendar */
- /* and is valid from the inception of that calendar system. */
-
- const int days[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
- int i, day;
-
- day=0;
-
- for (i=0; i<mo-1; i++ )
- day+ys[i];
-
- dayy+dy;
-
- /* Leap year correction */
-
- if ((yr%4==0) && ((yr%100!=0) || (yr%400==0)) && (mo>2))
- day++;
-
- return day;
-}
-
-double Fraction_of_Day(int hr, int mi, double se)
-{
- /* Fraction_of_Day calculates the fraction of */
- /* a day passed at the specified input time. */
-
- double dhr, dmi;
-
- dhr=(double)hr;
- dmi=(double)mi;
-
- return ((dhr+(dmi+se/60.0)/60.0)/24.0);
-}
-
-double Julian_Date(struct tm *cdate)
-{
- /* The function Julian_Date converts a standard calendar */
- /* date and time to a Julian Date. The procedure Date_Time */
- /* performs the inverse of this function. */
-
- double julian_date;
-
- julian_date=Julian_Date_of_Year(1900+cdate->tm_year)+DOY(cdate->tm_year,cdate->tm_mo \
n,cdate->tm_mday)+Fraction_of_Day(cdate->tm_hour,cdate->tm_min,cdate->tm_sec)+5.787037e-06; \
/* Round up to nearest 1 sec */
-
- return julian_date;
-}
-
-void Date_Time(double julian_date, struct tm *cdate)
-{
- /* The function Date_Time() converts a Julian Date to
- standard calendar date and time. The function
- Julian_Date() performs the inverse of this function. */
-
- time_t jtime;
-
- jtime=(julian_date-2440587.5)*86400.0;
- *cdate=*gmtime(&jtime);
-}
-
-double Delta_ET(double year)
-{
- /* The function Delta_ET has been added to allow calculations on */
- /* the position of the sun. It provides the difference between UT */
- /* (approximately the same as UTC) and ET (now referred to as TDT).*/
- /* This function is based on a least squares fit of data from 1950 */
- /* to 1991 and will need to be updated periodically. */
-
- /* Values determined using data from 1950-1991 in the 1990
- Astronomical Almanac. See DELTA_ET.WQ1 for details. */
-
- double delta_et;
-
- delta_et&.465+0.747622*(year-1950)+1.886913*sin(twopi*(year-1975)/33);
-
- return delta_et;
-}
-
-double ThetaG(double epoch, deep_arg_t *deep_arg)
-{
- /* The function ThetaG calculates the Greenwich Mean Sidereal Time */
- /* for an epoch specified in the format used in the NORAD two-line */
- /* element sets. It has now been adapted for dates beyond the year */
- /* 1999, as described above. The function ThetaG_JD provides the */
- /* same calculation except that it is based on an input in the */
- /* form of a Julian Date. */
-
- /* Reference: The 1992 Astronomical Almanac, page B6. */
-
- double year, day, UT, jd, TU, GMST, ThetaG;
-
- /* Modification to support Y2K */
- /* Valid 1957 through 2056 */
-
- day=modf(epoch*1E-3,&year)*1E3;
-
- if (year<57)
- year+ 00;
- else
- year+00;
-
- UT=modf(day,&day);
- jd=Julian_Date_of_Year(year)+day;
- TU=(jd-2451545.0)/36525;
- GMST$110.54841+TU*(8640184.812866+TU*(0.093104-TU*6.2E-6));
- GMST=Modulus(GMST+secday*omega_E*UT,secday);
- ThetaG=twopi*GMST/secday;
- deep_arg->ds50=jd-2433281.5+UT;
- ThetaG=FMod2p(6.3003880987*deep_arg->ds50+1.72944494);
-
- return ThetaG;
-}
-
-double ThetaG_JD(double jd)
-{
- /* Reference: The 1992 Astronomical Almanac, page B6. */
-
- double UT, TU, GMST;
-
- UT=Frac(jd+0.5);
- jd=jd-UT;
- TU=(jd-2451545.0)/36525;
- GMST$110.54841+TU*(8640184.812866+TU*(0.093104-TU*6.2E-6));
- GMST=Modulus(GMST+secday*omega_E*UT,secday);
-
- return (twopi*GMST/secday);
-}
-
-void Calculate_Solar_Position(double time, vector_t *solar_vector)
-{
- /* Calculates solar position vector */
-
- double mjd, year, T, M, L, e, C, O, Lsa, nu, R, eps;
-
- mjd=time-2415020.0;
- year00+mjd/365.25;
- T=(mjd+Delta_ET(year)/secday)/36525.0;
- M=Radians(Modulus(358.47583+Modulus(35999.04975*T,360.0)-(0.000150+0.0000033*T)*Sqr(T),360.0));
- L=Radians(Modulus(279.69668+Modulus(36000.76892*T,360.0)+0.0003025*Sqr(T),360.0));
- e=0.01675104-(0.0000418+0.000000126*T)*T;
- C=Radians((1.919460-(0.004789+0.000014*T)*T)*sin(M)+(0.020094-0.000100*T)*sin(2*M)+0.000293*sin(3*M));
- O=Radians(Modulus(259.18-1934.142*T,360.0));
- Lsa=Modulus(L+C-Radians(0.00569-0.00479*sin(O)),twopi);
- nu=Modulus(M+C,twopi);
- R=1.0000002*(1.0-Sqr(e))/(1.0+e*cos(nu));
- eps=Radians(23.452294-(0.0130125+(0.00000164-0.000000503*T)*T)*T+0.00256*cos(O));
- R=AU*R;
- solar_vector->x=R*cos(Lsa);
- solar_vector->y=R*sin(Lsa)*cos(eps);
- solar_vector->z=R*sin(Lsa)*sin(eps);
- solar_vector->w=R;
-}
-
-int Sat_Eclipsed(vector_t *pos, vector_t *sol, double *depth)
-{
- /* Calculates satellite's eclipse status and depth */
-
- double sd_sun, sd_earth, delta;
- vector_t Rho, earth;
-
- /* Determine partial eclipse */
-
- sd_earth=ArcSin(xkmper/pos->w);
- Vec_Sub(sol,pos,&Rho);
- sd_sun=ArcSin(sr/Rho.w);
- Scalar_Multiply(-1,pos,&earth);
- delta=Angle(sol,&earth);
- *depth=sd_earth-sd_sun-delta;
-
- if (sd_earth<sd_sun)
- return 0;
- else
- if (*depth>=0)
- return 1;
- else
- return 0;
-}
-
-void select_ephemeris(tle_t *tle)
-{
- /* Selects the appropriate ephemeris type to be used */
- /* for predictions according to the data in the TLE */
- /* It also processes values in the tle set so that */
- /* they are appropriate for the sgp4/sdp4 routines */
-
- double ao, xnodp, dd1, dd2, delo, temp, a1, del1, r1;
-
- /* Preprocess tle set */
- tle->xnodeo*g2rad;
- tle->omegao*g2rad;
- tle->xmo*g2rad;
- tle->xincl*g2rad;
- temp=twopi/xmnpda/xmnpda;
- tle->xno=tle->xno*temp*xmnpda;
- tle->xndt2o*=temp;
- tle->xndd6o=tle->xndd6o*temp/xmnpda;
- tle->bstar/;
-
- /* Period > 225 minutes is deep space */
- dd1=(xke/tle->xno);
- dd2=tothrd;
- a1=pow(dd1,dd2);
- r1=cos(tle->xincl);
- dd1=(1.0-tle->eo*tle->eo);
- temp=ck2*1.5f*(r1*r1*3.0-1.0)/pow(dd1,1.5);
- del1=temp/(a1*a1);
- ao*(1.0-del1*(tothrd*.5+del1*(del1*1.654320987654321+1.0)));
- delo=temp/(ao*ao);
- xnodp=tle->xno/(delo+1.0);
-
- /* Select a deep-space/near-earth ephemeris */
- if (twopi/xnodp/xmnpda>=0.15625)
- SetFlag(DEEP_SPACE_EPHEM_FLAG);
- else
- ClearFlag(DEEP_SPACE_EPHEM_FLAG);
-}
-
-void SGP4(double tsince, tle_t * tle, vector_t * pos, vector_t * vel)
-{
- /* This function is used to calculate the position and velocity */
- /* of near-earth (period < 225 minutes) satellites. tsince is */
- /* time since epoch in minutes, tle is a pointer to a tle_t */
- /* structure with Keplerian orbital elements and pos and vel */
- /* are vector_t structures returning ECI satellite position and */
- /* velocity. Use Convert_Sat_State() to convert to km and km/s. */
-
- static double aodp, aycof, c1, c4, c5, cosio, d2, d3, d4, delmo,
- omgcof, eta, omgdot, sinio, xnodp, sinmo, t2cof, t3cof, t4cof,
- t5cof, x1mth2, x3thm1, x7thm1, xmcof, xmdot, xnodcf, xnodot, xlcof;
-
- double cosuk, sinuk, rfdotk, vx, vy, vz, ux, uy, uz, xmy, xmx, cosnok,
- sinnok, cosik, sinik, rdotk, xinck, xnodek, uk, rk, cos2u, sin2u,
- u, sinu, cosu, betal, rfdot, rdot, r, pl, elsq, esine, ecose, epw,
- cosepw, x1m5th, xhdot1, tfour, sinepw, capu, ayn, xlt, aynl, xll,
- axn, xn, beta, xl, e, a, tcube, delm, delomg, templ, tempe, tempa,
- xnode, tsq, xmp, omega, xnoddf, omgadf, xmdf, a1, a3ovk2, ao,
- betao, betao2, c1sq, c2, c3, coef, coef1, del1, delo, eeta, eosq,
- etasq, perigee, pinvsq, psisq, qoms24, s4, temp, temp1, temp2,
- temp3, temp4, temp5, temp6, theta2, theta4, tsi;
-
- int i;
-
- /* Initialization */
-
- if (isFlagClear(SGP4_INITIALIZED_FLAG))
- {
- SetFlag(SGP4_INITIALIZED_FLAG);
-
- /* Recover original mean motion (xnodp) and */
- /* semimajor axis (aodp) from input elements. */
-
- a1=pow(xke/tle->xno,tothrd);
- cosio=cos(tle->xincl);
- theta2=cosio*cosio;
- x3thm1=3*theta2-1.0;
- eosq=tle->eo*tle->eo;
- betao2=1.0-eosq;
- betao=sqrt(betao2);
- del1=1.5*ck2*x3thm1/(a1*a1*betao*betao2);
- ao*(1.0-del1*(0.5*tothrd+del1*(1.0+134.0/81.0*del1)));
- delo=1.5*ck2*x3thm1/(ao*ao*betao*betao2);
- xnodp=tle->xno/(1.0+delo);
- aodp=ao/(1.0-delo);
-
- /* For perigee less than 220 kilometers, the "simple" */
- /* flag is set and the equations are truncated to linear */
- /* variation in sqrt a and quadratic variation in mean */
- /* anomaly. Also, the c3 term, the delta omega term, and */
- /* the delta m term are dropped. */
-
- if ((aodp*(1-tle->eo)/ae)<(220/xkmper+ae))
- SetFlag(SIMPLE_FLAG);
-
- else
- ClearFlag(SIMPLE_FLAG);
-
- /* For perigees below 156 km, the */
- /* values of s and qoms2t are altered. */
-
- s4=s;
- qoms24=qoms2t;
- perigee=(aodp*(1-tle->eo)-ae)*xkmper;
-
- if (perigee<156.0)
- {
- if (perigee<.0)
- s4 ;
- else
- s4=perigee-78.0;
-
- qoms24=pow((120-s4)*ae/xkmper,4);
- s4=s4/xkmper+ae;
- }
-
- pinvsq=1/(aodp*aodp*betao2*betao2);
- tsi=1/(aodp-s4);
- eta=aodp*tle->eo*tsi;
- etasq=eta*eta;
- eeta=tle->eo*eta;
- psisqbs(1-etasq);
- coef=qoms24*pow(tsi,4);
- coef1=coef/pow(psisq,3.5);
- c2=coef1*xnodp*(aodp*(1+1.5*etasq+eeta*(4+etasq))+0.75*ck2*tsi/psisq*x3thm1*(8+3*etasq*(8+etasq)));
-
- c1=tle->bstar*c2;
- sinio=sin(tle->xincl);
- a3ovk2=-xj3/ck2*pow(ae,3);
- c3=coef*tsi*a3ovk2*xnodp*ae*sinio/tle->eo;
- x1mth2=1-theta2;
-
- c4=2*xnodp*coef1*aodp*betao2*(eta*(2+0.5*etasq)+tle->eo*(0.5+2*etasq)-2*ck2*tsi/(ao \
dp*psisq)*(-3*x3thm1*(1-2*eeta+etasq*(1.5-0.5*eeta))+0.75*x1mth2*(2*etasq-eeta*(1+etasq))*cos(2*tle->omegao)));
- c5=2*coef1*aodp*betao2*(1+2.75*(etasq+eeta)+eeta*etasq);
-
- theta4=theta2*theta2;
- temp1=3*ck2*pinvsq*xnodp;
- temp2=temp1*ck2*pinvsq;
- temp3=1.25*ck4*pinvsq*pinvsq*xnodp;
- xmdot=xnodp+0.5*temp1*betao*x3thm1+0.0625*temp2*betao*(13-78*theta2+137*theta4);
- x1m5th=1-5*theta2;
- omgdot=-0.5*temp1*x1m5th+0.0625*temp2*(7-114*theta2+395*theta4)+temp3*(3-36*theta2+49*theta4);
- xhdot1=-temp1*cosio;
- xnodot=xhdot1+(0.5*temp2*(4-19*theta2)+2*temp3*(3-7*theta2))*cosio;
- omgcof=tle->bstar*c3*cos(tle->omegao);
- xmcof=-tothrd*coef*tle->bstar*ae/eeta;
- xnodcf=3.5*betao2*xhdot1*c1;
- t2cof=1.5*c1;
- xlcof=0.125*a3ovk2*sinio*(3+5*cosio)/(1+cosio);
- aycof=0.25*a3ovk2*sinio;
- delmo=pow(1+eta*cos(tle->xmo),3);
- sinmo=sin(tle->xmo);
- x7thm1=7*theta2-1;
-
- if (isFlagClear(SIMPLE_FLAG))
- {
- c1sq*c1;
- d2=4*aodp*tsi*c1sq;
- temp*tsi*c1/3;
- d3=(17*aodp+s4)*temp;
- d4=0.5*temp*aodp*tsi*(221*aodp+31*s4)*c1;
- t3cof+2*c1sq;
- t4cof=0.25*(3*d3+c1*(12*d2+10*c1sq));
- t5cof=0.2*(3*d4+12*c1*d3+6*d2*d2+15*c1sq*(2*d2+c1sq));
- }
- }
-
-
- /* Update for secular gravity and atmospheric drag. */
- xmdf=tle->xmo+xmdot*tsince;
- omgadf=tle->omegao+omgdot*tsince;
- xnoddf=tle->xnodeo+xnodot*tsince;
- omega=omgadf;
- xmp=xmdf;
- tsq=tsince*tsince;
- xnode=xnoddf+xnodcf*tsq;
- tempa=1-c1*tsince;
- tempe=tle->bstar*c4*tsince;
- templ=t2cof*tsq;
-
- if (isFlagClear(SIMPLE_FLAG))
- {
- delomg=omgcof*tsince;
- delm=xmcof*(pow(1+eta*cos(xmdf),3)-delmo);
- templomg+delm;
- xmp=xmdf+temp;
- omega=omgadf-temp;
- tcube=tsq*tsince;
- tfour=tsince*tcube;
- tempa=tempa-d2*tsq-d3*tcube-d4*tfour;
- tempe=tempe+tle->bstar*c5*(sin(xmp)-sinmo);
- templ=templ+t3cof*tcube+tfour*(t4cof+tsince*t5cof);
- }
-
- a=aodp*pow(tempa,2);
- e=tle->eo-tempe;
- xl=xmp+omega+xnode+xnodp*templ;
- beta=sqrt(1-e*e);
- xn=xke/pow(a,1.5);
-
- /* Long period periodics */
- axn=e*cos(omega);
- temp=1/(a*beta*beta);
- xll=temp*xlcof*axn;
- aynl=temp*aycof;
- xlt=xl+xll;
- ayn=e*sin(omega)+aynl;
-
- /* Solve Kepler's Equation */
- capu=FMod2p(xlt-xnode);
- temp2pu;
- i=0;
- do
- {
- sinepw=sin(temp2);
- cosepw=cos(temp2);
- temp3=axn*sinepw;
- temp4=ayn*cosepw;
- temp5=axn*cosepw;
- temp6=ayn*sinepw;
- epw=(capu-temp4+temp3-temp2)/(1-temp5-temp6)+temp2;
-
- if (fabs(epw-temp2)<= e6a)
- break;
-
- temp2=epw;
-
- } while (i++<10);
-
- /* Short period preliminary quantities */
- ecose=temp5+temp6;
- esine=temp3-temp4;
- elsq=axn*axn+ayn*ayn;
- temp=1-elsq;
- pl=a*temp;
- r=a*(1-ecose);
- temp1=1/r;
- rdot=xke*sqrt(a)*esine*temp1;
- if (pl<0) /*avoid exception with decayed sat.*/
- rfdot=0;
- else
- rfdot=xke*sqrt(pl)*temp1;
- temp2=a*temp1;
- if (temp<0) /*avoid exception with decayed sat.*/
- betal=0;
- else
- betal=sqrt(temp);
- temp3=1/(1+betal);
- cosu=temp2*(cosepw-axn+ayn*esine*temp3);
- sinu=temp2*(sinepw-ayn-axn*esine*temp3);
- uTan(sinu,cosu);
- sin2u=2*sinu*cosu;
- cos2u=2*cosu*cosu-1;
- temp=1/pl;
- temp1=ck2*temp;
- temp2=temp1*temp;
-
- /* Update for short periodics */
- rk=r*(1-1.5*temp2*betal*x3thm1)+0.5*temp1*x1mth2*cos2u;
- uk=u-0.25*temp2*x7thm1*sin2u;
- xnodek=xnode+1.5*temp2*cosio*sin2u;
- xinck=tle->xincl+1.5*temp2*cosio*sinio*cos2u;
- rdotk=rdot-xn*temp1*x1mth2*sin2u;
- rfdotk=rfdot+xn*temp1*(x1mth2*cos2u+1.5*x3thm1);
-
- /* Orientation vectors */
- sinuk=sin(uk);
- cosuk=cos(uk);
- sinik=sin(xinck);
- cosik=cos(xinck);
- sinnok=sin(xnodek);
- cosnok=cos(xnodek);
- xmx=-sinnok*cosik;
- xmy=cosnok*cosik;
- ux=xmx*sinuk+cosnok*cosuk;
- uy=xmy*sinuk+sinnok*cosuk;
- uz=sinik*sinuk;
- vx=xmx*cosuk-cosnok*sinuk;
- vy=xmy*cosuk-sinnok*sinuk;
- vz=sinik*cosuk;
-
- /* Position and velocity */
- pos->x=rk*ux;
- pos->y=rk*uy;
- pos->z=rk*uz;
- vel->x=rdotk*ux+rfdotk*vx;
- vel->y=rdotk*uy+rfdotk*vy;
- vel->z=rdotk*uz+rfdotk*vz;
-
- /* Phase in radians */
- phase=xlt-xnode-omgadf+twopi;
-
- if (phase<0.0)
- phase+=twopi;
-
- phase=FMod2p(phase);
-}
-
-void Deep(int ientry, tle_t * tle, deep_arg_t * deep_arg)
-{
- /* This function is used by SDP4 to add lunar and solar */
- /* perturbation effects to deep-space orbit objects. */
-
- static double thgr, xnq, xqncl, omegaq, zmol, zmos, savtsn, ee2, e3,
- xi2, xl2, xl3, xl4, xgh2, xgh3, xgh4, xh2, xh3, sse, ssi, ssg, xi3,
- se2, si2, sl2, sgh2, sh2, se3, si3, sl3, sgh3, sh3, sl4, sgh4, ssl,
- ssh, d3210, d3222, d4410, d4422, d5220, d5232, d5421, d5433, del1,
- del2, del3, fasx2, fasx4, fasx6, xlamo, xfact, xni, atime, stepp,
- stepn, step2, preep, pl, sghs, xli, d2201, d2211, sghl, sh1, pinc,
- pe, shs, zsingl, zcosgl, zsinhl, zcoshl, zsinil, zcosil;
-
- double a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, ainv2, alfdp, aqnv,
- sgh, sini2, sinis, sinok, sh, si, sil, day, betdp, dalf, bfact, c,
- cc, cosis, cosok, cosq, ctem, f322, zx, zy, dbet, dls, eoc, eq, f2,
- f220, f221, f3, f311, f321, xnoh, f330, f441, f442, f522, f523,
- f542, f543, g200, g201, g211, pgh, ph, s1, s2, s3, s4, s5, s6, s7,
- se, sel, ses, xls, g300, g310, g322, g410, g422, g520, g521, g532,
- g533, gam, sinq, sinzf, sis, sl, sll, sls, stem, temp, temp1, x1,
- x2, x2li, x2omi, x3, x4, x5, x6, x7, x8, xl, xldot, xmao, xnddt,
- xndot, xno2, xnodce, xnoi, xomi, xpidot, z1, z11, z12, z13, z2,
- z21, z22, z23, z3, z31, z32, z33, ze, zf, zm, zmo, zn, zsing,
- zsinh, zsini, zcosg, zcosh, zcosi, delt=0, ft=0;
-
- switch (ientry)
- {
- case dpinit: /* Entrance for deep space initialization */
- thgr=ThetaG(tle->epoch,deep_arg);
- eq=tle->eo;
- xnqep_arg->xnodp;
- aqnv=1/deep_arg->aodp;
- xqncl=tle->xincl;
- xmao=tle->xmo;
- xpidotep_arg->omgdot+deep_arg->xnodot;
- sinq=sin(tle->xnodeo);
- cosq=cos(tle->xnodeo);
- omegaq=tle->omegao;
-
- /* Initialize lunar solar terms */
- dayep_arg->ds50+18261.5; /* Days since 1900 Jan 0.5 */
-
- if (day!=preep)
- {
- preepy;
- xnodce=4.5236020-9.2422029E-4*day;
- stem=sin(xnodce);
- ctem=cos(xnodce);
- zcosil=0.91375164-0.03568096*ctem;
- zsinil=sqrt(1-zcosil*zcosil);
- zsinhl=0.089683511*stem/zsinil;
- zcoshl=sqrt(1-zsinhl*zsinhl);
- c=4.7199672+0.22997150*day;
- gam=5.8351514+0.0019443680*day;
- zmol=FMod2p(c-gam);
- zx=0.39785416*stem/zsinil;
- zy=zcoshl*ctem+0.91744867*zsinhl*stem;
- zxTan(zx,zy);
- zx=gam+zx-xnodce;
- zcosgl=cos(zx);
- zsingl=sin(zx);
- zmos=6.2565837+0.017201977*day;
- zmos=FMod2p(zmos);
- }
-
- /* Do solar terms */
- savtsn20;
- zcosg=zcosgs;
- zsing=zsings;
- zcosi=zcosis;
- zsini=zsinis;
- zcosh=cosq;
- zsinh= sinq;
- ccss;
- zn=zns;
- ze=zes;
- zmo=zmos;
- xnoi=1/xnq;
-
- /* Loop breaks when Solar terms are done a second */
- /* time, after Lunar terms are initialized */
-
- for (;;)
- {
- /* Solar terms done again after Lunar terms are done */
- a1=zcosg*zcosh+zsing*zcosi*zsinh;
- a3=-zsing*zcosh+zcosg*zcosi*zsinh;
- a7=-zcosg*zsinh+zsing*zcosi*zcosh;
- a8=zsing*zsini;
- a9=zsing*zsinh+zcosg*zcosi*zcosh;
- a10=zcosg*zsini;
- a2ep_arg->cosio*a7+deep_arg->sinio*a8;
- a4ep_arg->cosio*a9+deep_arg->sinio*a10;
- a5=-deep_arg->sinio*a7+deep_arg->cosio*a8;
- a6=-deep_arg->sinio*a9+deep_arg->cosio*a10;
- x1*deep_arg->cosg+a2*deep_arg->sing;
- x2*deep_arg->cosg+a4*deep_arg->sing;
- x3=-a1*deep_arg->sing+a2*deep_arg->cosg;
- x4=-a3*deep_arg->sing+a4*deep_arg->cosg;
- x5*deep_arg->sing;
- x6*deep_arg->sing;
- x7*deep_arg->cosg;
- x8*deep_arg->cosg;
- z31*x1*x1-3*x3*x3;
- z32$*x1*x2-6*x3*x4;
- z33*x2*x2-3*x4*x4;
- z1=3*(a1*a1+a2*a2)+z31*deep_arg->eosq;
- z2=6*(a1*a3+a2*a4)+z32*deep_arg->eosq;
- z3=3*(a3*a3+a4*a4)+z33*deep_arg->eosq;
- z11=-6*a1*a5+deep_arg->eosq*(-24*x1*x7-6*x3*x5);
- z12=-6*(a1*a6+a3*a5)+deep_arg->eosq*(-24*(x2*x7+x1*x8)-6*(x3*x6+x4*x5));
- z13=-6*a3*a6+deep_arg->eosq*(-24*x2*x8-6*x4*x6);
- z21=6*a2*a5+deep_arg->eosq*(24*x1*x5-6*x3*x7);
- z22=6*(a4*a5+a2*a6)+deep_arg->eosq*(24*(x2*x5+x1*x6)-6*(x4*x7+x3*x8));
- z23=6*a4*a6+deep_arg->eosq*(24*x2*x6-6*x4*x8);
- z1=z1+z1+deep_arg->betao2*z31;
- z2=z2+z2+deep_arg->betao2*z32;
- z3=z3+z3+deep_arg->betao2*z33;
- s3*xnoi;
- s2=-0.5*s3/deep_arg->betao;
- s4=s3*deep_arg->betao;
- s1=-15*eq*s4;
- s5=x1*x3+x2*x4;
- s6=x2*x3+x1*x4;
- s7=x2*x4-x1*x3;
- se=s1*zn*s5;
- si=s2*zn*(z11+z13);
- sl=-zn*s3*(z1+z3-14-6*deep_arg->eosq);
- sgh=s4*zn*(z31+z33-6);
- sh=-zn*s2*(z21+z23);
-
- if (xqncl<5.2359877E-2)
- sh=0;
-
- ee2=2*s1*s6;
- e3=2*s1*s7;
- xi2=2*s2*z12;
- xi3=2*s2*(z13-z11);
- xl2=-2*s3*z2;
- xl3=-2*s3*(z3-z1);
- xl4=-2*s3*(-21-9*deep_arg->eosq)*ze;
- xgh2=2*s4*z32;
- xgh3=2*s4*(z33-z31);
- xgh4=-18*s4*ze;
- xh2=-2*s2*z22;
- xh3=-2*s2*(z23-z21);
-
- if (isFlagSet(LUNAR_TERMS_DONE_FLAG))
- break;
-
- /* Do lunar terms */
- sse=se;
- ssi=si;
- ssl=sl;
- ssh=sh/deep_arg->sinio;
- ssg=sgh-deep_arg->cosio*ssh;
- se22;
- si2=xi2;
- sl2=xl2;
- sgh2=xgh2;
- sh2=xh2;
- se3;
- si3=xi3;
- sl3=xl3;
- sgh3=xgh3;
- sh3=xh3;
- sl4=xl4;
- sgh4=xgh4;
- zcosg=zcosgl;
- zsing=zsingl;
- zcosi=zcosil;
- zsini=zsinil;
- zcosh=zcoshl*cosq+zsinhl*sinq;
- zsinh=sinq*zcoshl-cosq*zsinhl;
- zn=znl;
- ccl;
- ze=zel;
- zmo=zmol;
- SetFlag(LUNAR_TERMS_DONE_FLAG);
- }
-
- sse=sse+se;
- ssi=ssi+si;
- ssl=ssl+sl;
- ssg=ssg+sgh-deep_arg->cosio/deep_arg->sinio*sh;
- ssh=ssh+sh/deep_arg->sinio;
-
- /* Geopotential resonance initialization for 12 hour orbits */
- ClearFlag(RESONANCE_FLAG);
- ClearFlag(SYNCHRONOUS_FLAG);
-
- if (!((xnq<0.0052359877) && (xnq>0.0034906585)))
- {
- if ((xnq<0.00826) || (xnq>0.00924))
- return;
-
- if (eq<0.5)
- return;
-
- SetFlag(RESONANCE_FLAG);
- eoc=eq*deep_arg->eosq;
- g201=-0.306-(eq-0.64)*0.440;
-
- if (eq<=0.65)
- {
- g211=3.616-13.247*eq+16.290*deep_arg->eosq;
- g310=-19.302+117.390*eq-228.419*deep_arg->eosq+156.591*eoc;
- g322=-18.9068+109.7927*eq-214.6334*deep_arg->eosq+146.5816*eoc;
- g410=-41.122+242.694*eq-471.094*deep_arg->eosq+313.953*eoc;
- g422=-146.407+841.880*eq-1629.014*deep_arg->eosq+1083.435 * eoc;
- g520=-532.114+3017.977*eq-5740*deep_arg->eosq+3708.276*eoc;
- }
-
- else
- {
- g211=-72.099+331.819*eq-508.738*deep_arg->eosq+266.724*eoc;
- g310=-346.844+1582.851*eq-2415.925*deep_arg->eosq+1246.113*eoc;
- g322=-342.585+1554.908*eq-2366.899*deep_arg->eosq+1215.972*eoc;
- g410=-1052.797+4758.686*eq-7193.992*deep_arg->eosq+3651.957*eoc;
- g422=-3581.69+16178.11*eq-24462.77*deep_arg->eosq+12422.52*eoc;
-
- if (eq<=0.715)
- g52064.74-4664.75*eq+3763.64*deep_arg->eosq;
-
- else
- g520=-5149.66+29936.92*eq-54087.36*deep_arg->eosq+31324.56*eoc;
- }
-
- if (eq<0.7)
- {
- g533=-919.2277+4988.61*eq-9064.77*deep_arg->eosq+5542.21*eoc;
- g521=-822.71072+4568.6173*eq-8491.4146*deep_arg->eosq+5337.524*eoc;
- g532=-853.666+4690.25*eq-8624.77*deep_arg->eosq+5341.4*eoc;
- }
-
- else
- {
- g533=-37995.78+161616.52*eq-229838.2*deep_arg->eosq+109377.94*eoc;
- g521 =-51752.104+218913.95*eq-309468.16*deep_arg->eosq+146349.42*eoc;
- g532 =-40023.88+170470.89*eq-242699.48*deep_arg->eosq+115605.82*eoc;
- }
-
- sini2ep_arg->sinio*deep_arg->sinio;
- f220=0.75*(1+2*deep_arg->cosio+deep_arg->theta2);
- f221=1.5*sini2;
- f321=1.875*deep_arg->sinio*(1-2*deep_arg->cosio-3*deep_arg->theta2);
- f322=-1.875*deep_arg->sinio*(1+2*deep_arg->cosio-3*deep_arg->theta2);
- f4415*sini2*f220;
- f4429.3750*sini2*sini2;
- f522=9.84375*deep_arg->sinio*(sini2*(1-2*deep_arg->cosio-5*deep_arg->theta2)+0.33333333*(-2+4*deep_arg->cosio+6*deep_arg->theta2));
- f523ep_arg->sinio*(4.92187512*sini2*(-2-4*deep_arg->cosio+10*deep_arg->theta2)+6.56250012*(1+2*deep_arg->cosio-3*deep_arg->theta2));
- f542).53125*deep_arg->sinio*(2-8*deep_arg->cosio+deep_arg->theta2*(-12+8*deep_arg->cosio+10*deep_arg->theta2));
- f543).53125*deep_arg->sinio*(-2-8*deep_arg->cosio+deep_arg->theta2*(12+8*deep_arg->cosio-10*deep_arg->theta2));
- xno2=xnq*xnq;
- ainv2=aqnv*aqnv;
- temp1=3*xno2*ainv2;
- temp=temp1*root22;
- d2201=temp*f220*g201;
- d2211=temp*f221*g211;
- temp1=temp1*aqnv;
- temp=temp1*root32;
- d3210=temp*f321*g310;
- d3222=temp*f322*g322;
- temp1=temp1*aqnv;
- temp=2*temp1*root44;
- d4410=temp*f441*g410;
- d4422=temp*f442*g422;
- temp1=temp1*aqnv;
- temp=temp1*root52;
- d5220=temp*f522*g520;
- d5232=temp*f523*g532;
- temp=2*temp1*root54;
- d5421=temp*f542*g521;
- d5433=temp*f543*g533;
- xlamo=xmao+tle->xnodeo+tle->xnodeo-thgr-thgr;
- bfactep_arg->xmdot+deep_arg->xnodot+deep_arg->xnodot-thdt-thdt;
- bfactact+ssl+ssh+ssh;
- }
-
- else
- {
- SetFlag(RESONANCE_FLAG);
- SetFlag(SYNCHRONOUS_FLAG);
-
- /* Synchronous resonance terms initialization */
- g200=1+deep_arg->eosq*(-2.5+0.8125*deep_arg->eosq);
- g310=1+2*deep_arg->eosq;
- g300=1+deep_arg->eosq*(-6+6.60937*deep_arg->eosq);
- f220=0.75*(1+deep_arg->cosio)*(1+deep_arg->cosio);
- f311=0.9375*deep_arg->sinio*deep_arg->sinio*(1+3*deep_arg->cosio)-0.75*(1+deep_arg->cosio);
- f330=1+deep_arg->cosio;
- f330=1.875*f330*f330*f330;
- del1=3*xnq*xnq*aqnv*aqnv;
- del2=2*del1*f220*g200*q22;
- del3=3*del1*f330*g300*q33*aqnv;
- del1l1*f311*g310*q31*aqnv;
- fasx2=0.13130908;
- fasx4=2.8843198;
- fasx6=0.37448087;
- xlamo=xmao+tle->xnodeo+tle->omegao-thgr;
- bfactep_arg->xmdot+xpidot-thdt;
- bfactact+ssl+ssg+ssh;
- }
-
- xfactact-xnq;
-
- /* Initialize integrator */
- xli=xlamo;
- xni=xnq;
- atime=0;
- steppr0;
- stepn=-720;
- step2%9200;
-
- return;
-
- case dpsec: /* Entrance for deep space secular effects */
- deep_arg->xllep_arg->xll+ssl*deep_arg->t;
- deep_arg->omgadfep_arg->omgadf+ssg*deep_arg->t;
- deep_arg->xnodeep_arg->xnode+ssh*deep_arg->t;
- deep_arg->em=tle->eo+sse*deep_arg->t;
- deep_arg->xinc=tle->xincl+ssi*deep_arg->t;
-
- if (deep_arg->xinc<0)
- {
- deep_arg->xinc=-deep_arg->xinc;
- deep_arg->xnodeep_arg->xnode+pi;
- deep_arg->omgadfep_arg->omgadf-pi;
- }
-
- if (isFlagClear(RESONANCE_FLAG))
- return;
-
- do
- {
- if ((atime==0) || ((deep_arg->t>=0) && (atime<0)) || ((deep_arg->t<0) && \
(atime>=0)))
- {
- /* Epoch restart */
-
- if (deep_arg->t>=0)
- delt=stepp;
- else
- delt=stepn;
-
- atime=0;
- xni=xnq;
- xli=xlamo;
- }
-
- else
- {
- if (fabs(deep_arg->t)>bs(atime))
- {
- if (deep_arg->t>0)
- delt=stepp;
- else
- delt=stepn;
- }
- }
-
- do
- {
- if (fabs(deep_arg->t-atime)>=stepp)
- {
- SetFlag(DO_LOOP_FLAG);
- ClearFlag(EPOCH_RESTART_FLAG);
- }
-
- else
- {
- ftep_arg->t-atime;
- ClearFlag(DO_LOOP_FLAG);
- }
-
- if (fabs(deep_arg->t)<fabs(atime))
- {
- if (deep_arg->t>=0)
- delt=stepn;
- else
- delt=stepp;
-
- SetFlag(DO_LOOP_FLAG | EPOCH_RESTART_FLAG);
- }
-
- /* Dot terms calculated */
- if (isFlagSet(SYNCHRONOUS_FLAG))
- {
- xndotl1*sin(xli-fasx2)+del2*sin(2*(xli-fasx4))+del3*sin(3*(xli-fasx6));
- xnddtl1*cos(xli-fasx2)+2*del2*cos(2*(xli-fasx4))+3*del3*cos(3*(xli-fasx6));
- }
-
- else
- {
- xomi=omegaq+deep_arg->omgdot*atime;
- x2omi=xomi+xomi;
- x2li=xli+xli;
- xndot201*sin(x2omi+xli-g22)+d2211*sin(xli-g22)+d3210*sin(xomi+xli-g32)+d3222*si \
n(-xomi+xli-g32)+d4410*sin(x2omi+x2li-g44)+d4422*sin(x2li-g44)+d5220*sin(xomi+xli-g52)+d5232*sin(-xomi+xli-g52)+d5421*sin(xomi+x2li-g54)+d5433*sin(-xomi+x2li-g54);
- xnddt201*cos(x2omi+xli-g22)+d2211*cos(xli-g22)+d3210*cos(xomi+xli-g32)+d3222*co \
s(-xomi+xli-g32)+d5220*cos(xomi+xli-g52)+d5232*cos(-xomi+xli-g52)+2*(d4410*cos(x2omi+x \
2li-g44)+d4422*cos(x2li-g44)+d5421*cos(xomi+x2li-g54)+d5433*cos(-xomi+x2li-g54));
- }
-
- xldot=xni+xfact;
- xnddt=xnddt*xldot;
-
- if (isFlagSet(DO_LOOP_FLAG))
- {
- xli=xli+xldot*delt+xndot*step2;
- xni=xni+xndot*delt+xnddt*step2;
- atime=atime+delt;
- }
- } while (isFlagSet(DO_LOOP_FLAG) && isFlagClear(EPOCH_RESTART_FLAG));
- } while (isFlagSet(DO_LOOP_FLAG) && isFlagSet(EPOCH_RESTART_FLAG));
-
- deep_arg->xn=xni+xndot*ft+xnddt*ft*ft*0.5;
- xl=xli+xldot*ft+xndot*ft*ft*0.5;
- temp=-deep_arg->xnode+thgr+deep_arg->t*thdt;
-
- if (isFlagClear(SYNCHRONOUS_FLAG))
- deep_arg->xll=xl+temp+temp;
- else
- deep_arg->xll=xl-deep_arg->omgadf+temp;
-
- return;
-
- case dpper: /* Entrance for lunar-solar periodics */
- sinis=sin(deep_arg->xinc);
- cosis=cos(deep_arg->xinc);
-
- if (fabs(savtsn-deep_arg->t)>0)
- {
- savtsnep_arg->t;
- zm=zmos+zns*deep_arg->t;
- zf=zm+2*zes*sin(zm);
- sinzf=sin(zf);
- f2=0.5*sinzf*sinzf-0.25;
- f3=-0.5*sinzf*cos(zf);
- ses=se2*f2+se3*f3;
- sis=si2*f2+si3*f3;
- sls=sl2*f2+sl3*f3+sl4*sinzf;
- sghs=sgh2*f2+sgh3*f3+sgh4*sinzf;
- shs=sh2*f2+sh3*f3;
- zm=zmol+znl*deep_arg->t;
- zf=zm+2*zel*sin(zm);
- sinzf=sin(zf);
- f2=0.5*sinzf*sinzf-0.25;
- f3=-0.5*sinzf*cos(zf);
- sel2*f2+e3*f3;
- sil=xi2*f2+xi3*f3;
- sll=xl2*f2+xl3*f3+xl4*sinzf;
- sghl=xgh2*f2+xgh3*f3+xgh4*sinzf;
- sh1=xh2*f2+xh3*f3;
- pe=ses+sel;
- pinc=sis+sil;
- pl=sls+sll;
- }
-
- pgh=sghs+sghl;
- ph=shs+sh1;
- deep_arg->xincep_arg->xinc+pinc;
- deep_arg->emep_arg->em+pe;
-
- if (xqncl>=0.2)
- {
- /* Apply periodics directly */
- ph=ph/deep_arg->sinio;
- pgh=pgh-deep_arg->cosio*ph;
- deep_arg->omgadfep_arg->omgadf+pgh;
- deep_arg->xnodeep_arg->xnode+ph;
- deep_arg->xllep_arg->xll+pl;
- }
-
- else
- {
- /* Apply periodics with Lyddane modification */
- sinok=sin(deep_arg->xnode);
- cosok=cos(deep_arg->xnode);
- alfdp=sinis*sinok;
- betdp=sinis*cosok;
- dalf=ph*cosok+pinc*cosis*sinok;
- dbet=-ph*sinok+pinc*cosis*cosok;
- alfdp=alfdp+dalf;
- betdptdp+dbet;
- deep_arg->xnode=FMod2p(deep_arg->xnode);
- xlsep_arg->xll+deep_arg->omgadf+cosis*deep_arg->xnode;
- dls=pl+pgh-pinc*deep_arg->xnode*sinis;
- xls=xls+dls;
- xnohep_arg->xnode;
- deep_arg->xnodeTan(alfdp,betdp);
-
- /* This is a patch to Lyddane modification */
- /* suggested by Rob Matson. */
-
- if (fabs(xnoh-deep_arg->xnode)>pi)
- {
- if (deep_arg->xnode<xnoh)
- deep_arg->xnode+=twopi;
- else
- deep_arg->xnode-=twopi;
- }
-
- deep_arg->xllep_arg->xll+pl;
- deep_arg->omgadf=xls-deep_arg->xll-cos(deep_arg->xinc)*deep_arg->xnode;
- }
- return;
- }
-}
-
-void SDP4(double tsince, tle_t * tle, vector_t * pos, vector_t * vel)
-{
- /* This function is used to calculate the position and velocity */
- /* of deep-space (period > 225 minutes) satellites. tsince is */
- /* time since epoch in minutes, tle is a pointer to a tle_t */
- /* structure with Keplerian orbital elements and pos and vel */
- /* are vector_t structures returning ECI satellite position and */
- /* velocity. Use Convert_Sat_State() to convert to km and km/s. */
-
- int i;
-
- static double x3thm1, c1, x1mth2, c4, xnodcf, t2cof, xlcof,
- aycof, x7thm1;
-
- double a, axn, ayn, aynl, beta, betal, capu, cos2u, cosepw, cosik,
- cosnok, cosu, cosuk, ecose, elsq, epw, esine, pl, theta4, rdot,
- rdotk, rfdot, rfdotk, rk, sin2u, sinepw, sinik, sinnok, sinu,
- sinuk, tempe, templ, tsq, u, uk, ux, uy, uz, vx, vy, vz, xinck, xl,
- xlt, xmam, xmdf, xmx, xmy, xnoddf, xnodek, xll, a1, a3ovk2, ao, c2,
- coef, coef1, x1m5th, xhdot1, del1, r, delo, eeta, eta, etasq,
- perigee, psisq, tsi, qoms24, s4, pinvsq, temp, tempa, temp1,
- temp2, temp3, temp4, temp5, temp6, bx, by, bz, cx, cy, cz;
-
- static deep_arg_t deep_arg;
-
- /* Initialization */
-
- if (isFlagClear(SDP4_INITIALIZED_FLAG))
- {
- SetFlag(SDP4_INITIALIZED_FLAG);
-
- /* Recover original mean motion (xnodp) and */
- /* semimajor axis (aodp) from input elements. */
-
- a1=pow(xke/tle->xno,tothrd);
- deep_arg.cosio=cos(tle->xincl);
- deep_arg.theta2ep_arg.cosio*deep_arg.cosio;
- x3thm1=3*deep_arg.theta2-1;
- deep_arg.eosq=tle->eo*tle->eo;
- deep_arg.betao2=1-deep_arg.eosq;
- deep_arg.betao=sqrt(deep_arg.betao2);
- del1=1.5*ck2*x3thm1/(a1*a1*deep_arg.betao*deep_arg.betao2);
- ao*(1-del1*(0.5*tothrd+del1*(1+134/81*del1)));
- delo=1.5*ck2*x3thm1/(ao*ao*deep_arg.betao*deep_arg.betao2);
- deep_arg.xnodp=tle->xno/(1+delo);
- deep_arg.aodp=ao/(1-delo);
-
- /* For perigee below 156 km, the values */
- /* of s and qoms2t are altered. */
-
- s4=s;
- qoms24=qoms2t;
- perigee=(deep_arg.aodp*(1-tle->eo)-ae)*xkmper;
-
- if (perigee<156.0)
- {
- if (perigee<.0)
- s4 .0;
- else
- s4=perigee-78.0;
-
- qoms24=pow((120-s4)*ae/xkmper,4);
- s4=s4/xkmper+ae;
- }
-
- pinvsq=1/(deep_arg.aodp*deep_arg.aodp*deep_arg.betao2*deep_arg.betao2);
- deep_arg.sing=sin(tle->omegao);
- deep_arg.cosg=cos(tle->omegao);
- tsi=1/(deep_arg.aodp-s4);
- etaep_arg.aodp*tle->eo*tsi;
- etasq=eta*eta;
- eeta=tle->eo*eta;
- psisqbs(1-etasq);
- coef=qoms24*pow(tsi,4);
- coef1=coef/pow(psisq,3.5);
- c2=coef1*deep_arg.xnodp*(deep_arg.aodp*(1+1.5*etasq+eeta*(4+etasq))+0.75*ck2*tsi/psisq*x3thm1*(8+3*etasq*(8+etasq)));
-
- c1=tle->bstar*c2;
- deep_arg.sinio=sin(tle->xincl);
- a3ovk2=-xj3/ck2*pow(ae,3);
- x1mth2=1-deep_arg.theta2;
- c4=2*deep_arg.xnodp*coef1*deep_arg.aodp*deep_arg.betao2*(eta*(2+0.5*etasq)+tle->eo* \
(0.5+2*etasq)-2*ck2*tsi/(deep_arg.aodp*psisq)*(-3*x3thm1*(1-2*eeta+etasq*(1.5-0.5*eeta))+0.75*x1mth2*(2*etasq-eeta*(1+etasq))*cos(2*tle->omegao)));
- theta4ep_arg.theta2*deep_arg.theta2;
- temp1=3*ck2*pinvsq*deep_arg.xnodp;
- temp2=temp1*ck2*pinvsq;
- temp3=1.25*ck4*pinvsq*pinvsq*deep_arg.xnodp;
- deep_arg.xmdotep_arg.xnodp+0.5*temp1*deep_arg.betao*x3thm1+0.0625*temp2*deep_arg.betao*(13-78*deep_arg.theta2+137*theta4);
- x1m5th=1-5*deep_arg.theta2;
- deep_arg.omgdot=-0.5*temp1*x1m5th+0.0625*temp2*(7-114*deep_arg.theta2+395*theta4)+temp3*(3-36*deep_arg.theta2+49*theta4);
- xhdot1=-temp1*deep_arg.cosio;
- deep_arg.xnodot=xhdot1+(0.5*temp2*(4-19*deep_arg.theta2)+2*temp3*(3-7*deep_arg.theta2))*deep_arg.cosio;
- xnodcf=3.5*deep_arg.betao2*xhdot1*c1;
- t2cof=1.5*c1;
- xlcof=0.125*a3ovk2*deep_arg.sinio*(3+5*deep_arg.cosio)/(1+deep_arg.cosio);
- aycof=0.25*a3ovk2*deep_arg.sinio;
- x7thm1=7*deep_arg.theta2-1;
-
- /* initialize Deep() */
-
- Deep(dpinit,tle,&deep_arg);
- }
-
- /* Update for secular gravity and atmospheric drag */
- xmdf=tle->xmo+deep_arg.xmdot*tsince;
- deep_arg.omgadf=tle->omegao+deep_arg.omgdot*tsince;
- xnoddf=tle->xnodeo+deep_arg.xnodot*tsince;
- tsq=tsince*tsince;
- deep_arg.xnode=xnoddf+xnodcf*tsq;
- tempa=1-c1*tsince;
- tempe=tle->bstar*c4*tsince;
- templ=t2cof*tsq;
- deep_arg.xnep_arg.xnodp;
-
- /* Update for deep-space secular effects */
- deep_arg.xll=xmdf;
- deep_arg.t=tsince;
-
- Deep(dpsec, tle, &deep_arg);
-
- xmdfep_arg.xll;
- a=pow(xke/deep_arg.xn,tothrd)*tempa*tempa;
- deep_arg.emep_arg.em-tempe;
- xmam=xmdf+deep_arg.xnodp*templ;
-
- /* Update for deep-space periodic effects */
- deep_arg.xll=xmam;
-
- Deep(dpper,tle,&deep_arg);
-
- xmamep_arg.xll;
- xl=xmam+deep_arg.omgadf+deep_arg.xnode;
- beta=sqrt(1-deep_arg.em*deep_arg.em);
- deep_arg.xn=xke/pow(a,1.5);
-
- /* Long period periodics */
- axnep_arg.em*cos(deep_arg.omgadf);
- temp=1/(a*beta*beta);
- xll=temp*xlcof*axn;
- aynl=temp*aycof;
- xlt=xl+xll;
- aynep_arg.em*sin(deep_arg.omgadf)+aynl;
-
- /* Solve Kepler's Equation */
- capu=FMod2p(xlt-deep_arg.xnode);
- temp2pu;
- i=0;
-
- do
- {
- sinepw=sin(temp2);
- cosepw=cos(temp2);
- temp3=axn*sinepw;
- temp4=ayn*cosepw;
- temp5=axn*cosepw;
- temp6=ayn*sinepw;
- epw=(capu-temp4+temp3-temp2)/(1-temp5-temp6)+temp2;
-
- if (fabs(epw-temp2)<a)
- break;
-
- temp2=epw;
-
- } while (i++<10);
-
- /* Short period preliminary quantities */
- ecose=temp5+temp6;
- esine=temp3-temp4;
- elsq=axn*axn+ayn*ayn;
- temp=1-elsq;
- pl=a*temp;
- r=a*(1-ecose);
- temp1=1/r;
- rdot=xke*sqrt(a)*esine*temp1;
- rfdot=xke*sqrt(pl)*temp1;
- temp2=a*temp1;
- betal=sqrt(temp);
- temp3=1/(1+betal);
- cosu=temp2*(cosepw-axn+ayn*esine*temp3);
- sinu=temp2*(sinepw-ayn-axn*esine*temp3);
- uTan(sinu,cosu);
- sin2u=2*sinu*cosu;
- cos2u=2*cosu*cosu-1;
- temp=1/pl;
- temp1=ck2*temp;
- temp2=temp1*temp;
-
- /* Update for short periodics */
- rk=r*(1-1.5*temp2*betal*x3thm1)+0.5*temp1*x1mth2*cos2u;
- uk=u-0.25*temp2*x7thm1*sin2u;
- xnodekep_arg.xnode+1.5*temp2*deep_arg.cosio*sin2u;
- xinckep_arg.xinc+1.5*temp2*deep_arg.cosio*deep_arg.sinio*cos2u;
- rdotk=rdot-deep_arg.xn*temp1*x1mth2*sin2u;
- rfdotk=rfdot+deep_arg.xn*temp1*(x1mth2*cos2u+1.5*x3thm1);
-
- /* Orientation vectors */
- sinuk=sin(uk);
- cosuk=cos(uk);
- sinik=sin(xinck);
- cosik=cos(xinck);
- sinnok=sin(xnodek);
- cosnok=cos(xnodek);
- xmx=-sinnok*cosik;
- xmy=cosnok*cosik;
- ux=xmx*sinuk+cosnok*cosuk;
- uy=xmy*sinuk+sinnok*cosuk;
- uz=sinik*sinuk;
- vx=xmx*cosuk-cosnok*sinuk;
- vy=xmy*cosuk-sinnok*sinuk;
- vz=sinik*cosuk;
-
- /* Position and velocity */
- pos->x=rk*ux;
- pos->y=rk*uy;
- pos->z=rk*uz;
- vel->x=rdotk*ux+rfdotk*vx;
- vel->y=rdotk*uy+rfdotk*vy;
- vel->z=rdotk*uz+rfdotk*vz;
-
- /* Calculations for squint angle begin here... */
-
- if (calc_squint)
- {
- bx=cos(alat)*cos(alon+deep_arg.omgadf);
- by=cos(alat)*sin(alon+deep_arg.omgadf);
- bz=sin(alat);
- cx=bx;
- cy=by*cos(xinck)-bz*sin(xinck);
- cz=by*sin(xinck)+bz*cos(xinck);
- ax=cx*cos(xnodek)-cy*sin(xnodek);
- ay=cx*sin(xnodek)+cy*cos(xnodek);
- az=cz;
- }
-
- /* Phase in radians */
- phase=xlt-deep_arg.xnode-deep_arg.omgadf+twopi;
-
- if (phase<0.0)
- phase+=twopi;
-
- phase=FMod2p(phase);
-}
-
-void Calculate_User_PosVel(double time, geodetic_t *geodetic, vector_t *obs_pos, \
vector_t *obs_vel)
-{
- /* Calculate_User_PosVel() passes the user's geodetic position
- and the time of interest and returns the ECI position and
- velocity of the observer. The velocity calculation assumes
- the geodetic position is stationary relative to the earth's
- surface. */
-
- /* Reference: The 1992 Astronomical Almanac, page K11. */
-
- double c, sq, achcp;
-
- geodetic->theta=FMod2p(ThetaG_JD(time)+geodetic->lon); /* LMST */
- c=1/sqrt(1+f*(f-2)*Sqr(sin(geodetic->lat)));
- sq=Sqr(1-f)*c;
- achcp=(xkmper*c+geodetic->alt)*cos(geodetic->lat);
- obs_pos->xhcp*cos(geodetic->theta); /* kilometers */
- obs_pos->yhcp*sin(geodetic->theta);
- obs_pos->z=(xkmper*sq+geodetic->alt)*sin(geodetic->lat);
- obs_vel->x=-mfactor*obs_pos->y; /* kilometers/second */
- obs_vel->y=mfactor*obs_pos->x;
- obs_vel->z=0;
- Magnitude(obs_pos);
- Magnitude(obs_vel);
-}
-
-void Calculate_LatLonAlt(double time, vector_t *pos, geodetic_t *geodetic)
-{
- /* Procedure Calculate_LatLonAlt will calculate the geodetic */
- /* position of an object given its ECI position pos and time. */
- /* It is intended to be used to determine the ground track of */
- /* a satellite. The calculations assume the earth to be an */
- /* oblate spheroid as defined in WGS '72. */
-
- /* Reference: The 1992 Astronomical Almanac, page K12. */
-
- double r, e2, phi, c;
-
- geodetic->thetaTan(pos->y,pos->x); /* radians */
- geodetic->lon=FMod2p(geodetic->theta-ThetaG_JD(time)); /* radians */
- r=sqrt(Sqr(pos->x)+Sqr(pos->y));
- e2=f*(2-f);
- geodetic->latTan(pos->z,r); /* radians */
-
- do
- {
- phi=geodetic->lat;
- c=1/sqrt(1-e2*Sqr(sin(phi)));
- geodetic->latTan(pos->z+xkmper*c*e2*sin(phi),r);
-
- } while (fabs(geodetic->lat-phi)>-10);
-
- geodetic->alt=r/cos(geodetic->lat)-xkmper*c; /* kilometers */
-
- if (geodetic->lat>pio2)
- geodetic->lat-=twopi;
-}
-
-void Calculate_Obs(double time, vector_t *pos, vector_t *vel, geodetic_t *geodetic, \
vector_t *obs_set)
-{
- /* The procedures Calculate_Obs and Calculate_RADec calculate */
- /* the *topocentric* coordinates of the object with ECI position, */
- /* {pos}, and velocity, {vel}, from location {geodetic} at {time}. */
- /* The {obs_set} returned for Calculate_Obs consists of azimuth, */
- /* elevation, range, and range rate (in that order) with units of */
- /* radians, radians, kilometers, and kilometers/second, respectively. */
- /* The WGS '72 geoid is used and the effect of atmospheric refraction */
- /* (under standard temperature and pressure) is incorporated into the */
- /* elevation calculation; the effect of atmospheric refraction on */
- /* range and range rate has not yet been quantified. */
-
- /* The {obs_set} for Calculate_RADec consists of right ascension and */
- /* declination (in that order) in radians. Again, calculations are */
- /* based on *topocentric* position using the WGS '72 geoid and */
- /* incorporating atmospheric refraction. */
-
- double sin_lat, cos_lat, sin_theta, cos_theta, el, azim, top_s, top_e, top_z;
-
- vector_t obs_pos, obs_vel, range, rgvel;
-
- Calculate_User_PosVel(time, geodetic, &obs_pos, &obs_vel);
-
- range.x=pos->x-obs_pos.x;
- range.y=pos->y-obs_pos.y;
- range.z=pos->z-obs_pos.z;
-
- /* Save these values globally for calculating squint angles later... */
-
- rx=range.x;
- ry=range.y;
- rz=range.z;
-
- rgvel.x=vel->x-obs_vel.x;
- rgvel.y=vel->y-obs_vel.y;
- rgvel.z=vel->z-obs_vel.z;
-
- Magnitude(&range);
-
- sin_lat=sin(geodetic->lat);
- cos_lat=cos(geodetic->lat);
- sin_theta=sin(geodetic->theta);
- cos_theta=cos(geodetic->theta);
- top_s=sin_lat*cos_theta*range.x+sin_lat*sin_theta*range.y-cos_lat*range.z;
- top_e=-sin_theta*range.x+cos_theta*range.y;
- top_z=cos_lat*cos_theta*range.x+cos_lat*sin_theta*range.y+sin_lat*range.z;
- azim=atan(-top_e/top_s); /* Azimuth */
-
- if (top_s>0.0)
- azim=azim+pi;
-
- if (azim<0.0)
- azim=azim+twopi;
-
- el=ArcSin(top_z/range.w);
- obs_set->x=azim; /* Azimuth (radians) */
- obs_set->y=el; /* Elevation (radians) */
- obs_set->z=range.w; /* Range (kilometers) */
-
- /* Range Rate (kilometers/second) */
-
- obs_set->w=Dot(&range,&rgvel)/range.w;
-
- /* Corrections for atmospheric refraction */
- /* Reference: Astronomical Algorithms by Jean Meeus, pp. 101-104 */
- /* Correction is meaningless when apparent elevation is below horizon */
-
- /*** The following adjustment for
- atmospheric refraction is bypassed ***/
-
- /* obs_set->y=obs_set->y+Radians((1.02/tan(Radians(Degrees(el)+10.3/(Degrees(el)+5.11))))/60); \
*/
-
- obs_set->y=el;
-
- /**** End bypass ****/
-
- if (obs_set->y>=0.0)
- SetFlag(VISIBLE_FLAG);
- else
- {
- obs_set->y=el; /* Reset to true elevation */
- ClearFlag(VISIBLE_FLAG);
- }
-}
-
-void Calculate_RADec(double time, vector_t *pos, vector_t *vel, geodetic_t \
*geodetic, vector_t *obs_set)
-{
- /* Reference: Methods of Orbit Determination by */
- /* Pedro Ramon Escobal, pp. 401-402 */
-
- double phi, theta, sin_theta, cos_theta, sin_phi, cos_phi, az, el,
- Lxh, Lyh, Lzh, Sx, Ex, Zx, Sy, Ey, Zy, Sz, Ez, Zz, Lx, Ly,
- Lz, cos_delta, sin_alpha, cos_alpha;
-
- Calculate_Obs(time,pos,vel,geodetic,obs_set);
-
- az=obs_set->x;
- el=obs_set->y;
- phi=geodetic->lat;
- theta=FMod2p(ThetaG_JD(time)+geodetic->lon);
- sin_theta=sin(theta);
- cos_theta=cos(theta);
- sin_phi=sin(phi);
- cos_phi=cos(phi);
- Lxh=-cos(az)*cos(el);
- Lyh=sin(az)*cos(el);
- Lzh=sin(el);
- Sx=sin_phi*cos_theta;
- Ex=-sin_theta;
- Zx=cos_theta*cos_phi;
- Sy=sin_phi*sin_theta;
- Ey=cos_theta;
- Zy=sin_theta*cos_phi;
- Sz=-cos_phi;
- Ez=0.0;
- Zz=sin_phi;
- Lx=Sx*Lxh+Ex*Lyh+Zx*Lzh;
- Ly=Sy*Lxh+Ey*Lyh+Zy*Lzh;
- Lz=Sz*Lxh+Ez*Lyh+Zz*Lzh;
- obs_set->y=ArcSin(Lz); /* Declination (radians) */
- cos_delta=sqrt(1.0-Sqr(Lz));
- sin_alpha=Ly/cos_delta;
- cos_alpha=Lx/cos_delta;
- obs_set->xTan(sin_alpha,cos_alpha); /* Right Ascension (radians) */
- obs_set->x=FMod2p(obs_set->x);
-}
-
-/* .... SGP4/SDP4 functions end .... */
-
-
-double FixAngle(x)
-double x;
-{
- /* This function reduces angles greater than
- two pi by subtracting two pi from the angle */
-
- while (x>twopi)
- x-=twopi;
-
- return x;
-}
-
-double PrimeAngle(x)
-double x;
-{
- /* This function is used in the FindMoon() function. */
-
- x=x-360.0*floor(x/360.0);
- return x;
-}
-
-char *SubString(string,start,end)
-unsigned char *string, start, end;
-{
- /* This function returns a substring based on the starting
- and ending positions provided. It is used heavily in
- the AutoUpdate function when parsing 2-line element data. */
-
- unsigned x, y;
-
- if (end>=start)
- {
- for (x=start, y=0; x<=end && string[x]!=0; x++)
- if (string[x]!=' ')
- {
- temp[y]=string[x];
- y++;
- }
-
- temp[y]=0;
- return temp;
- }
- else
- return NULL;
-}
-
-void CopyString(source, destination, start, end)
-unsigned char *source, *destination, start, end;
-{
- /* This function copies elements of the string "source"
- bounded by "start" and "end" into the string "destination". */
-
- unsigned j, k=0;
-
- for (j=start; j<=end; j++)
- if (source[k]!=0)
- {
- destination[j]=source[k];
- k++;
- }
-}
-
-char *Abbreviate(string,n)
-unsigned char *string, n;
-{
- /* This function returns an abbreviated substring of the original,
- including a '~' character if a non-blank character is chopped
- out of the generated substring. n is the length of the desired
- substring. It is used for abbreviating satellite names. */
-
- strncpy(temp,string,79);
-
- if (temp[n]!=0 && temp[n]!2)
- {
- temp[n-2]='~';
- temp[n-1]=temp[strlen(temp)-1];
- }
-
- temp[n]=0;
-
- return temp;
-}
-
-char KepCheck(line1,line2)
-char *line1, *line2;
-{
- /* This function scans line 1 and line 2 of a NASA 2-Line element
- set and returns a 1 if the element set appears to be valid or
- a 0 if it does not. If the data survives this torture test,
- it's a pretty safe bet we're looking at a valid 2-line
- element set and not just some random text that might pass
- as orbital data based on a simple checksum calculation alone. */
-
- int x;
- unsigned sum1, sum2;
-
- /* Compute checksum for each line */
-
- for (x=0, sum1=0, sum2=0; x<g; sum1+=val[(int)line1[x]], sum2+=val[(int)line2[x]], \
x++);
-
- /* Perform a "torture test" on the data */
-
- x=(val[(int)line1[68]]^(sum1%10)) | (val[(int)line2[68]]^(sum2%10)) |
- (line1[0]^'1') | (line1[1]^' ') | (line1[7]^'U') |
- (line1[8]^' ') | (line1[17]^' ') | (line1[23]^'.') |
- (line1[32]^' ') | (line1[34]^'.') | (line1[43]^' ') |
- (line1[52]^' ') | (line1[61]^' ') | (line1[62]^'0') |
- (line1[63]^' ') | (line2[0]^'2') | (line2[1]^' ') |
- (line2[7]^' ') | (line2[11]^'.') | (line2[16]^' ') |
- (line2[20]^'.') | (line2[25]^' ') | (line2[33]^' ') |
- (line2[37]^'.') | (line2[42]^' ') | (line2[46]^'.') |
- (line2[51]^' ') | (line2[54]^'.') | (line1[2]^line2[2]) |
- (line1[3]^line2[3]) | (line1[4]^line2[4]) |
- (line1[5]^line2[5]) | (line1[6]^line2[6]) |
- (isdigit(line1[68]) ? 0 : 1) | (isdigit(line2[68]) ? 0 : 1) |
- (isdigit(line1[18]) ? 0 : 1) | (isdigit(line1[19]) ? 0 : 1) |
- (isdigit(line2[31]) ? 0 : 1) | (isdigit(line2[32]) ? 0 : 1);
-
- return (x ? 0 : 1);
-}
-
-void InternalUpdate(x)
-int x;
-{
- /* Updates data in TLE structure based on
- line1 and line2 stored in structure. */
-
- double tempnum;
- strncpy(sat[x].designator,SubString(sat[x].line1,9,16),8);
- sat[x].designator[9]=0;
- sat[x].catnum=atol(SubString(sat[x].line1,2,6));
- sat[x].year=atoi(SubString(sat[x].line1,18,19));
- sat[x].refepoch=atof(SubString(sat[x].line1,20,31));
- tempnum=1.0e-5*atof(SubString(sat[x].line1,44,49));
- sat[x].nddot6=tempnum/pow(10.0,(sat[x].line1[51]-'0'));
- tempnum=1.0e-5*atof(SubString(sat[x].line1,53,58));
- sat[x].bstar=tempnum/pow(10.0,(sat[x].line1[60]-'0'));
- sat[x].setnum=atol(SubString(sat[x].line1,64,67));
- sat[x].incl=atof(SubString(sat[x].line2,8,15));
- sat[x].raan=atof(SubString(sat[x].line2,17,24));
- sat[x].eccn=1.0e-07*atof(SubString(sat[x].line2,26,32));
- sat[x].argper=atof(SubString(sat[x].line2,34,41));
- sat[x].meanan=atof(SubString(sat[x].line2,43,50));
- sat[x].meanmo=atof(SubString(sat[x].line2,52,62));
- sat[x].drag=atof(SubString(sat[x].line1,33,42));
- sat[x].orbitnum=atof(SubString(sat[x].line2,63,67));
-}
-
-
-long DayNum(m,d,y)
-int m, d, y;
-{
- /* This function calculates the day number from m/d/y. */
-
- long dn;
- double mm, yy;
-
- if (m<3)
- {
- y--;
- m+;
- }
-
- if (y<57)
- y+0;
-
- yy=(double)y;
- mm=(double)m;
- dn=(long)(floor(365.25*(yy-80.0))-floor(19.0+yy/100.0)+floor(4.75+yy/400.0)-16.0);
- dn+=d+30*m+(long)floor(0.6*mm-0.3);
- return dn;
-}
-
-double CurrentDaynum()
-{
- /* Read the system clock and return the number
- of days since 31Dec79 00:00:00 UTC (daynum 0) */
-
- struct timeval tptr;
- int x;
-
- x=gettimeofday(&tptr,NULL);
-
- return ((((double)tptr.tv_sec+0.000001*(double)tptr.tv_usec)/86400.0)-3651.0);
-}
-
-char *Daynum2String(daynum)
-double daynum;
-{
- /* This function takes the given epoch as a fractional number of
- days since 31Dec79 00:00:00 UTC and returns the corresponding
- date as a string of the form "Tue 12Oct99 17:22:37". */
-
- char timestr[25];
- time_t t;
- int x;
-
- /* Convert daynum to Unix time (seconds since 01-Jan-70) */
- t=(time_t)rint(86400.0*(daynum+3651.0));
-
- sprintf(timestr,"%s",asctime(gmtime(&t)));
-
- if (timestr[8]==' ')
- timestr[8]='0';
-
- for (x=0; x<=3; output[x]=timestr[x], x++);
-
- output[4]=timestr[8];
- output[5]=timestr[9];
- output[6]=timestr[4];
- output[7]=timestr[5];
- output[8]=timestr[6];
- output[9]=timestr[22];
- output[10]=timestr[23];
- output[11]=' ';
-
- for (x; x<; output[x]=timestr[x-1], x++);
-
- output[20]=0;
- return output;
-}
-
-void FindMoon(daynum)
-double daynum;
-{
- /* This function determines the position of the moon, including
- the azimuth and elevation headings, relative to the latitude
- and longitude of the tracking station. This code was derived
- from a Javascript implementation of the Meeus method for
- determining the exact position of the Moon found at:
- http://www.geocities.com/s_perona/ingles/poslun.htm. */
-
- double jd, ss, t, t1, t2, t3, d, ff, l1, m, m1, ex, om, l,
- b, w1, w2, bt, p, lm, h, ra, dec, z, ob, n, e, el,
- az, teg, th, mm, dv;
-
- jdynum+2444238.5;
-
- t=(jd-2415020.0)/36525.0;
- t2=t*t;
- t3=t2*t;
- l1'0.434164+481267.8831*t-0.001133*t2+0.0000019*t3;
- m58.475833+35999.0498*t-0.00015*t2-0.0000033*t3;
- m1)6.104608+477198.8491*t+0.009192*t2+0.0000144*t3;
- d50.737486+445267.1142*t-0.001436*t2+0.0000019*t3;
- ff.250889+483202.0251*t-0.003211*t2-0.0000003*t3;
- om%9.183275-1934.142*t+0.002078*t2+0.0000022*t3;
- om=om*deg2rad;
-
- /* Additive terms */
-
- l1=l1+0.000233*sin((51.2+20.2*t)*deg2rad);
- ss=0.003964*sin((346.56+132.87*t-0.0091731*t2)*deg2rad);
- l1=l1+ss+0.001964*sin(om);
- m=m-0.001778*sin((51.2+20.2*t)*deg2rad);
- m1=m1+0.000817*sin((51.2+20.2*t)*deg2rad);
- m1=m1+ss+0.002541*sin(om);
- d=d+0.002011*sin((51.2+20.2*t)*deg2rad);
- d=d+ss+0.001964*sin(om);
- ff+ss-0.024691*sin(om);
- ff-0.004328*sin(om+(275.05-2.3*t)*deg2rad);
- ex=1.0-0.002495*t-0.00000752*t2;
- om=om*deg2rad;
-
- l1=PrimeAngle(l1);
- m=PrimeAngle(m);
- m1=PrimeAngle(m1);
- d=PrimeAngle(d);
- ff=PrimeAngle(ff);
- om=PrimeAngle(om);
-
- m=m*deg2rad;
- m1=m1*deg2rad;
- d=d*deg2rad;
- ff*deg2rad;
-
- /* Ecliptic Longitude */
-
- l=l1+6.28875*sin(m1)+1.274018*sin(2.0*d-m1)+0.658309*sin(2.0*d);
- l=l+0.213616*sin(2.0*m1)-ex*0.185596*sin(m)-0.114336*sin(2.0*ff);
- l=l+0.058793*sin(2.0*d-2.0*m1)+ex*0.057212*sin(2.0*d-m-m1)+0.05332*sin(2.0*d+m1);
- l=l+ex*0.045874*sin(2.0*d-m)+ex*0.041024*sin(m1-m)-0.034718*sin(d);
- l=l-ex*0.030465*sin(m+m1)+0.015326*sin(2.0*d-2.0*ff)-0.012528*sin(2.0*ff+m1);
-
- l=l-0.01098*sin(2.0*ff-m1)+0.010674*sin(4.0*d-m1)+0.010034*sin(3.0*m1);
- l=l+0.008548*sin(4.0*d-2.0*m1)-ex*0.00791*sin(m-m1+2.0*d)-ex*0.006783*sin(2.0*d+m);
-
- l=l+0.005162*sin(m1-d)+ex*0.005*sin(m+d)+ex*0.004049*sin(m1-m+2.0*d);
- l=l+0.003996*sin(2.0*m1+2.0*d)+0.003862*sin(4.0*d)+0.003665*sin(2.0*d-3.0*m1);
-
- l=l+ex*0.002695*sin(2.0*m1-m)+0.002602*sin(m1-2.0*ff-2.0*d)+ex*0.002396*sin(2.0*d-m-2.0*m1);
-
- l=l-0.002349*sin(m1+d)+ex*ex*0.002249*sin(2.0*d-2.0*m)-ex*0.002125*sin(2.0*m1+m);
-
- l=l-ex*ex*0.002079*sin(2.0*m)+ex*ex*0.002059*sin(2.0*d-m1-2.0*m)-0.001773*sin(m1+2.0*d-2.0*ff);
-
- l=l+ex*0.00122*sin(4.0*d-m-m1)-0.00111*sin(2.0*m1+2.0*ff)+0.000892*sin(m1-3.0*d);
-
- l=l-ex*0.000811*sin(m+m1+2.0*d)+ex*0.000761*sin(4.0*d-m-2.0*m1)+ex*ex*.000717*sin(m1-2.0*m);
-
- l=l+ex*ex*0.000704*sin(m1-2.0*m-2.0*d)+ex*0.000693*sin(m-2.0*m1+2.0*d)+ex*0.000598*sin(2.0*d-m-2.0*ff)+0.00055*sin(m1+4.0*d);
-
- l=l+0.000538*sin(4.0*m1)+ex*0.000521*sin(4.0*d-m)+0.000486*sin(2.0*m1-d);
-
- l=l-0.001595*sin(2.0*ff+2.0*d);
-
- /* Ecliptic latitude */
-
- b=5.128189*sin(ff)+0.280606*sin(m1+ff)+0.277693*sin(m1-ff)+0.173238*sin(2.0*d-ff);
- b=b+0.055413*sin(2.0*d+ff-m1)+0.046272*sin(2.0*d-ff-m1)+0.032573*sin(2.0*d+ff);
-
- b=b+0.017198*sin(2.0*m1+ff)+9.266999e-03*sin(2.0*d+m1-ff)+0.008823*sin(2.0*m1-ff);
- b=b+ex*0.008247*sin(2.0*d-m-ff)+0.004323*sin(2.0*d-ff-2.0*m1)+0.0042*sin(2.0*d+ff+m1);
-
- b=b+ex*0.003372*sin(ff-m-2.0*d)+ex*0.002472*sin(2.0*d+ff-m-m1)+ex*0.002222*sin(2.0*d+ff-m);
-
- b=b+0.002072*sin(2.0*d-ff-m-m1)+ex*0.001877*sin(ff-m+m1)+0.001828*sin(4.0*d-ff-m1);
-
- b=b-ex*0.001803*sin(ff+m)-0.00175*sin(3.0*ff)+ex*0.00157*sin(m1-m-ff)-0.001487*sin(f \
f+d)-ex*0.001481*sin(ff+m+m1)+ex*0.001417*sin(ff-m-m1)+ex*0.00135*sin(ff-m)+0.00133*sin(ff-d);
-
- b=b+0.001106*sin(ff+3.0*m1)+0.00102*sin(4.0*d-ff)+0.000833*sin(ff+4.0*d-m1);
-
- b=b+0.000781*sin(m1-3.0*ff)+0.00067*sin(ff+4.0*d-2.0*m1)+0.000606*sin(2.0*d-3.0*ff);
-
- b=b+0.000597*sin(2.0*d+2.0*m1-ff)+ex*0.000492*sin(2.0*d+m1-m-ff)+0.00045*sin(2.0*m1-ff-2.0*d);
-
- b=b+0.000439*sin(3.0*m1-ff)+0.000423*sin(ff+2.0*d+2.0*m1)+0.000422*sin(2.0*d-ff-3.0*m1);
-
- b=b-ex*0.000367*sin(m+ff+2.0*d-m1)-ex*0.000353*sin(m+ff+2.0*d)+0.000331*sin(ff+4.0*d);
-
- b=b+ex*0.000317*sin(2.0*d+ff-m+m1)+ex*ex*0.000306*sin(2.0*d-2.0*m-ff)-0.000283*sin(m1+3.0*ff);
-
- w1=0.0004664*cos(om*deg2rad);
- w2=0.0000754*cos((om+275.05-2.3*t)*deg2rad);
- bt=b*(1.0-w1-w2);
-
- /* Parallax calculations */
-
- p=0.950724+0.051818*cos(m1)+0.009531*cos(2.0*d-m1)+0.007843*cos(2.0*d)+0.002824*cos( \
2.0*m1)+0.000857*cos(2.0*d+m1)+ex*0.000533*cos(2.0*d-m)+ex*0.000401*cos(2.0*d-m-m1);
-
- p=p+0.000173*cos(3.0*m1)+0.000167*cos(4.0*d-m1)-ex*0.000111*cos(m)+0.000103*cos(4.0* \
d-2.0*m1)-0.000084*cos(2.0*m1-2.0*d)-ex*0.000083*cos(2.0*d+m)+0.000079*cos(2.0*d+2.0*m1);
-
- p=p+0.000072*cos(4.0*d)+ex*0.000064*cos(2.0*d-m+m1)-ex*0.000063*cos(2.0*d+m-m1);
-
- p=p+ex*0.000041*cos(m+d)+ex*0.000035*cos(2.0*m1-m)-0.000033*cos(3.0*m1-2.0*d);
-
- p=p-0.00003*cos(m1+d)-0.000029*cos(2.0*ff-2.0*d)-ex*0.000029*cos(2.0*m1+m);
-
- p=p+ex*ex*0.000026*cos(2.0*d-2.0*m)-0.000023*cos(2.0*ff-2.0*d+m1)+ex*0.000019*cos(4.0*d-m-m1);
-
- b=bt*deg2rad;
- lm=l*deg2rad;
- moon_dx=3.0/(pi*p);
-
- /* Semi-diameter calculation */
- /* sem800.0*asin(0.272488*p*deg2rad)/pi; */
-
- /* Convert ecliptic coordinates to equatorial coordinates */
-
- z=(jd-2415020.5)/365.2422;
- ob#.452294-(0.46845*z+5.9e-07*z*z)/3600.0;
- ob=ob*deg2rad;
- dec=asin(sin(b)*cos(ob)+cos(b)*sin(ob)*sin(lm));
- raos(cos(b)*cos(lm)/cos(dec));
-
- if (lm>pi)
- ra=twopi-ra;
-
- /* ra = right ascension */
- /* dec = declination */
-
- n=qth.stnlat*deg2rad; /* North latitude of tracking station */
- e=-qth.stnlong*deg2rad; /* East longitude of tracking station */
-
- /* Find siderial time in radians */
-
- t=(jd-2451545.0)/36525.0;
- teg(0.46061837+360.98564736629*(jd-2451545.0)+(0.000387933*t-t*t/38710000.0)*t;
-
- while (teg>360.0)
- teg-60.0;
-
- th=FixAngle((teg-qth.stnlong)*deg2rad);
- h=th-ra;
-
- az=atan2(sin(h),cos(h)*sin(n)-tan(dec)*cos(n))+pi;
- el=asin(sin(n)*sin(dec)+cos(n)*cos(dec)*cos(h));
-
- moon_az=az/deg2rad;
- moon_el=el/deg2rad;
-
- /* Radial velocity approximation. This code was derived
- from "Amateur Radio Software", by John Morris, GM4ANB,
- published by the RSGB in 1985. */
-
- mm=FixAngle(1.319238+daynum*0.228027135); /* mean moon position */
- t2=0.10976;
- t1=mm+t2*sin(mm);
- dv=0.01255*moon_dx*moon_dx*sin(t1)*(1.0+t2*cos(mm));
- dv=dv*4449.0;
- t1c78.0;
- t284401.0;
- t3=t1*t2*(cos(dec)*cos(n)*sin(h));
- t3=t3/sqrt(t2*t2-t2*t1*sin(el));
- moon_dv=dv+t3*0.0753125;
-
- moon_decc/deg2rad;
- moon_ra=ra/deg2rad;
- moon_gha=teg-moon_ra;
-
- if (moon_gha<0.0)
- moon_gha+60.0;
-}
-
-void FindSun(daynum)
-double daynum;
-{
- /* This function finds the position of the Sun */
-
- /* Zero vector for initializations */
- vector_t zero_vector={0,0,0,0};
-
- /* Solar ECI position vector */
- vector_t solar_vector=zero_vector;
-
- /* Solar observed azi and ele vector */
- vector_t solar_set=zero_vector;
-
- /* Solar right ascension and declination vector */
- vector_t solar_rad=zero_vector;
-
- /* Solar lat, long, alt vector */
- geodetic_t solar_latlonalt;
-
- jul_utcynum+2444238.5;
-
- Calculate_Solar_Position(jul_utc, &solar_vector);
- Calculate_Obs(jul_utc, &solar_vector, &zero_vector, &obs_geodetic, &solar_set);
- sun_azigrees(solar_set.x);
- sun_elegrees(solar_set.y);
- sun_range=1.0+((solar_set.z-AU)/AU);
- sun_range_rate00.0*solar_set.w;
-
- Calculate_LatLonAlt(jul_utc, &solar_vector, &solar_latlonalt);
-
- sun_latgrees(solar_latlonalt.lat);
- sun_lon60.0-Degrees(solar_latlonalt.lon);
-
- Calculate_RADec(jul_utc, &solar_vector, &zero_vector, &obs_geodetic, &solar_rad);
-
- sun_ragrees(solar_rad.x);
- sun_decgrees(solar_rad.y);
-}
-
-void PreCalc(x)
-int x;
-{
- /* This function copies TLE data from PREDICT's sat structure
- to the SGP4/SDP4's single dimensioned tle structure, and
- prepares the tracking code for the update. */
-
- strcpy(tle.sat_name,sat[x].name);
- strcpy(tle.idesg,sat[x].designator);
- tle.catnr=sat[x].catnum;
- tle.epoch=(1000.0*(double)sat[x].year)+sat[x].refepoch;
- tle.xndt2o=sat[x].drag;
- tle.xndd6o=sat[x].nddot6;
- tle.bstar=sat[x].bstar;
- tle.xincl=sat[x].incl;
- tle.xnodeo=sat[x].raan;
- tle.eo=sat[x].eccn;
- tle.omegao=sat[x].argper;
- tle.xmo=sat[x].meanan;
- tle.xno=sat[x].meanmo;
- tle.revnum=sat[x].orbitnum;
-
- calc_squint=0;
-
- /* Clear all flags */
-
- ClearFlag(ALL_FLAGS);
-
- /* Select ephemeris type. This function will set or clear the
- DEEP_SPACE_EPHEM_FLAG depending on the TLE parameters of the
- satellite. It will also pre-process tle members for the
- ephemeris functions SGP4 or SDP4, so this function must
- be called each time a new tle set is used. */
-
- select_ephemeris(&tle);
-}
-
-void Calc()
-{
- /* This is the stuff we need to do repetitively while tracking. */
-
- /* Zero vector for initializations */
- vector_t zero_vector={0,0,0,0};
-
- /* Satellite position and velocity vectors */
- vector_t vel=zero_vector;
- vector_t pos=zero_vector;
-
- /* Satellite Az, El, Range, Range rate */
- vector_t obs_set;
-
- /* Solar ECI position vector */
- vector_t solar_vector=zero_vector;
-
- /* Solar observed azi and ele vector */
- vector_t solar_set;
-
- /* Satellite's predicted geodetic position */
- geodetic_t sat_geodetic;
-
- jul_utcynum+2444238.5;
-
- /* Convert satellite's epoch time to Julian */
- /* and calculate time since epoch in minutes */
-
- jul_epoch=Julian_Date_of_Epoch(tle.epoch);
- tsince=(jul_utc-jul_epoch)*xmnpda;
- age=jul_utc-jul_epoch;
-
- /* Copy the ephemeris type in use to ephem string. */
-
- if (isFlagSet(DEEP_SPACE_EPHEM_FLAG))
- strcpy(ephem,"SDP4");
- else
- strcpy(ephem,"SGP4");
-
- /* Call NORAD routines according to deep-space flag. */
-
- if (isFlagSet(DEEP_SPACE_EPHEM_FLAG))
- SDP4(tsince, &tle, &pos, &vel);
- else
- SGP4(tsince, &tle, &pos, &vel);
-
- /* Scale position and velocity vectors to km and km/sec */
-
- Convert_Sat_State(&pos, &vel);
-
- /* Calculate velocity of satellite */
-
- Magnitude(&vel);
- sat_vel=vel.w;
-
- /** All angles in rads. Distance in km. Velocity in km/s **/
- /* Calculate satellite Azi, Ele, Range and Range-rate */
-
- Calculate_Obs(jul_utc, &pos, &vel, &obs_geodetic, &obs_set);
-
- /* Calculate satellite Lat North, Lon East and Alt. */
-
- Calculate_LatLonAlt(jul_utc, &pos, &sat_geodetic);
-
- /* Calculate squint angle */
-
- if (calc_squint)
- squint=(acos(-(ax*rx+ay*ry+az*rz)/obs_set.z))/deg2rad;
-
- /* Calculate solar position and satellite eclipse depth. */
- /* Also set or clear the satellite eclipsed flag accordingly. */
-
- Calculate_Solar_Position(jul_utc, &solar_vector);
- Calculate_Obs(jul_utc, &solar_vector, &zero_vector, &obs_geodetic, &solar_set);
-
- if (Sat_Eclipsed(&pos, &solar_vector, &eclipse_depth))
- SetFlag(SAT_ECLIPSED_FLAG);
- else
- ClearFlag(SAT_ECLIPSED_FLAG);
-
- if (isFlagSet(SAT_ECLIPSED_FLAG))
- sat_sun_status=0; /* Eclipse */
- else
- sat_sun_status=1; /* In sunlight */
-
- /* Convert satellite and solar data */
- sat_azigrees(obs_set.x);
- sat_elegrees(obs_set.y);
- sat_range=obs_set.z;
- sat_range_rate=obs_set.w;
- sat_latgrees(sat_geodetic.lat);
- sat_longrees(sat_geodetic.lon);
- sat_alt=sat_geodetic.alt;
-
- /* problem with decayed satellites!*/
- if (sat_alt>0)
- {
- fk756.33*acos(xkmper/(xkmper+sat_alt));
- fm=fk/1.609344;
-
- rv=(long)floor((tle.xno*xmnpda/twopi+age*tle.bstar*ae)*age+tle.xmo/twopi)+tle.revnum;
- }
-
- sun_azigrees(solar_set.x);
- sun_elegrees(solar_set.y);
-
- irk=(long)rint(sat_range);
- isplat=(int)rint(sat_lat);
- isplong=(int)rint(360.0-sat_lon);
- iaz=(int)rint(sat_azi);
- iel=(int)rint(sat_ele);
- ma256=(int)rint(256.0*(phase/twopi));
-
- if (sat_sun_status)
- {
- if (sun_ele<=-12.0 && sat_ele>=0.0)
- findsun='+';
- else
- findsun='*';
- }
- else
- findsun=' ';
-}
-
-char AosHappens(x)
-int x;
-{
- /* This function returns a 1 if the satellite pointed to by
- "x" can ever rise above the horizon of the ground station. */
-
- double lin, sma, apogee;
-
- if (sat[x].meanmo==0.0)
- return 0;
- else
- {
- lin=sat[x].incl;
-
- if (lin>.0)
- lin0.0-lin;
-
- sma31.25*exp(log(1440.0/sat[x].meanmo)*(2.0/3.0));
- apogee=sma*(1.0+sat[x].eccn)-xkmper;
-
- if ((acos(xkmper/(apogee+xkmper))+(lin*deg2rad)) > fabs(qth.stnlat*deg2rad))
- return 1;
- else
- return 0;
- }
-}
-
-char Decayed(x,time)
-int x;
-double time;
-{
- /* This function returns a 1 if it appears that the
- satellite pointed to by 'x' has decayed at the
- time of 'time'. If 'time' is 0.0, then the
- current date/time is used. */
-
- double satepoch;
-
- if (time==0.0)
- time=CurrentDaynum();
-
- satepochyNum(1,0,sat[x].year)+sat[x].refepoch;
-
- if ((sat[x].drag==0)||(satepoch+((16.666666-sat[x].meanmo)/(10.0*fabs(sat[x].drag))) \
< time))
- return 1;
- else
- return 0;
-}
-
-char Geostationary(x)
-int x;
-{
- /* This function returns a 1 if the satellite pointed
- to by "x" appears to be in a geostationary orbit */
-
-/* if (fabs(sat[x].meanmo-1.0027)<0.0002)*/ /* seem way too small to detect any \
geostationary */
- if (fabs(sat[x].meanmo-1.0027)<0.02) /* try with the INTELSAT range */
-
- return 1;
- else
- return 0;
-}
-
-double FindAOS()
-{
- /* This function finds and returns the time of AOS (aostime). */
-
- aostime=0.0;
-
- if (AosHappens(indx) && Geostationary(indx)==0 && Decayed(indx,daynum)==0)
- {
- Calc();
-
- /* Get the satellite in range */
-
- while (sat_ele<-1.0)
- {
- daynum-=0.00035*(sat_ele*((sat_alt/8400.0)+0.46)-2.0);
- Calc();
- }
-
- /* Find AOS */
-
- while (aostime==0.0)
- {
- if (fabs(sat_ele)<0.03)
- aostimeynum;
- else
- {
- daynum-=sat_ele*sqrt(sat_alt)/530000.0;
- Calc();
- }
- }
- }
-
- return aostime;
-}
-
-double FindLOS()
-{
- lostime=0.0;
-
- if (Geostationary(indx)==0 && AosHappens(indx)==1 && Decayed(indx,daynum)==0)
- {
- Calc();
-
- do
- {
- daynum+=sat_ele*sqrt(sat_alt)/502500.0;
- Calc();
-
- if (fabs(sat_ele) < 0.03)
- lostimeynum;
-
- } while (lostime==0.0);
- }
-
- return lostime;
-}
-
-double FindLOS2()
-{
- /* This function steps through the pass to find LOS.
- FindLOS() is called to "fine tune" and return the result. */
-
- do
- {
- daynum+=cos((sat_ele-1.0)*deg2rad)*sqrt(sat_alt)/25000.0;
- Calc();
-
- } while (sat_ele>=0.0);
-
- return(FindLOS());
-}
-
-double NextAOS()
-{
- /* This function finds and returns the time of the next
- AOS for a satellite that is currently in range. */
-
- aostime=0.0;
-
- if (AosHappens(indx) && Geostationary(indx)==0 && Decayed(indx,daynum)==0)
- daynum=FindLOS2()+0.014; /* Move to LOS + 20 minutes */
-
- return (FindAOS());
-}
-
-int ReadTLE(char *TLE_file)
-{
- FILE *fd;
- int x=0, y ;
- char flag=0, name[80], line1[80], line2[80];
-
- fd=fopen(TLE_file,"r");
-
- numsat=0;
-
- if (fd!=NULL)
- {
- while (x<MAXSAT && feof(fd)==0)
- {
- /* Initialize variables */
-
- name[0]=0;
- line1[0]=0;
- line2[0]=0;
-
- /* Read element set */
-
- fgets(name,75,fd);
- fgets(line1,75,fd);
- fgets(line2,75,fd);
-
- if (KepCheck(line1,line2) && (feof(fd)==0))
- {
- /* We found a valid TLE! */
-
- /* Some TLE sources left justify the sat
- name in a 24-byte field that is padded
- with blanks. The following lines cut
- out the blanks as well as the line feed
- character read by the fgets() function. */
-
- y=strlen(name);
-
- while (name[y]=2 || name[y]==0 || name[y]= || name[y]= || y==0)
- {
- name[y]=0;
- y--;
- }
-
- /* Copy TLE data into the sat data structure */
-
- strncpy(sat[x].name,name,24);
- strncpy(sat[x].line1,line1,69);
- strncpy(sat[x].line2,line2,69);
- numsat=x+1;
-
- /* Update individual parameters */
-
- InternalUpdate(x);
-
- x++;
- }
- }
-
- fclose(fd);
- flag+=2;
- }
- return flag;
-}
-
-int SatInit(char *ObsName, double ObsLat, double ObsLong, double ObsAlt, char \
*TLE_file)
-{
- int x;
-
- /* Set up translation table for computing TLE checksums */
-
- for (x=0; x<%5; val[x]=0, x++);
- for (x='0'; x<='9'; val[x]=x-'0', x++);
-
- val['-']=1;
-
- temp[0]=0;
-
- antfd=-1;
-
- /* Set up qth */
- qth.callsign[0] = '\0'; /* Set callsing to empty string instead of copying \
ObsName here. */
- qth.stnlat=ObsLat;
- qth.stnlong=ObsLong;
- qth.stnalt=ObsAlt;
- obs_geodetic.lat=qth.stnlat*deg2rad;
- obs_geodetic.lon=-qth.stnlong*deg2rad;
- obs_geodetic.alt=qth.stnalt/1000.0;
- obs_geodetic.theta=0.0;
-
- /* Set up tle */
- return ReadTLE(TLE_file);
-}
-
-
-int SatPassList(double jd_start, double jd_end, SPositionSat *pPositionSat[])
-
-{
- /*This function give list of passes between 2 dates*/
- int n, z;
- double day_start, day_end, da ;
-
- n=0;
- day_start=jd_start-2444238.5;
- day_end=jd_end-2444238.5;
-
- /* Do a simple search for the matching satellite name */
-
- for (z=0; z<numsat; z++)
- {
-/*
- if ((strcmp(sat[z].name,satname)==0) || (atol(satname)==sat[z].catnum))
- {
-*/
- indx=z;
-
- if (day_start>0)
- {
-
- /* Start must within one year of now */
- daynumy_start;
- PreCalc(indx);
- Calc();
-
- if (AosHappens(indx) && Geostationary(indx)==0 && Decayed(indx,daynum)==0)
- {
- /* Make Predictions */
- daynum=FindAOS();
- if (daynum<jd_end)
- {
- daynum;
- daynum=FindLOS2();
- daynum=(da+daynum)/2;
- Calc();
-
- /* Display the mid pass */
-
- strcpy(pPositionSat[n]->name,sat[indx].name);
- strcpy(pPositionSat[n]->designator,sat[indx].designator);
- pPositionSat[n]->catnum=sat[indx].catnum;
- pPositionSat[n]->jdynum+2444238.5;
- pPositionSat[n]->sat_ele=sat_ele;
- pPositionSat[n]->sat_azi=sat_azi;
- pPositionSat[n]->phase=ma256;
- pPositionSat[n]->sat_lat=isplat;
- pPositionSat[n]->sat_long=isplong;
- pPositionSat[n]->range=irk;
- pPositionSat[n]->rev_num=rv;
- pPositionSat[n]->visibility=findsun;
-
- n++;
- }
- }
- }
-/*
- }
-*/
- }
-n=n-1;
-return n;
-
-}
-
-
-int SatNextPass(char *satname, double jd_start, SPositionSat *pPositionSat[])
-
-{
- /*This function give the next pass after ONE date*/
- int n, z, lastel=0;
- double day_start;
-
- n=0;
-
- /* Do a simple search for the matching satellite name */
-
- for (z=0; z<numsat; z++)
- {
- if ((strcmp(sat[z].name,satname)==0) || (atol(satname)==sat[z].catnum))
- {
- indx=z;
- day_start=jd_start-2444238.5;
-
- if (day_start>0)
- {
-
- /* Start must within one year of now */
- daynumy_start;
- PreCalc(indx);
- Calc();
-
- if (AosHappens(indx) && Geostationary(indx)==0 && Decayed(indx,daynum)==0)
- {
- /* Make Predictions */
- daynum=FindAOS();
-
- /* Display the pass */
-
- while ((iel>=0) && (n<19))
- {
- strcpy(pPositionSat[n]->name,sat[indx].name);
- strcpy(pPositionSat[n]->designator,sat[indx].designator);
- pPositionSat[n]->catnum=sat[indx].catnum;
- pPositionSat[n]->jdynum+2444238.5;
- pPositionSat[n]->sat_ele=sat_ele;
- pPositionSat[n]->sat_azi=sat_azi;
- pPositionSat[n]->phase=ma256;
- pPositionSat[n]->sat_lat=isplat;
- pPositionSat[n]->sat_long=isplong;
- pPositionSat[n]->range=irk;
- pPositionSat[n]->rev_num=rv;
- pPositionSat[n]->visibility=findsun;
- lastel=iel;
- daynum+=cos((sat_ele-1.0)*deg2rad)*sqrt(sat_alt)/25000.0;
- Calc();
- n++;
- }
- n--;
-
-
- if (lastel!=0)
- {
- n++;
- daynum=FindLOS();
- Calc();
- strcpy(pPositionSat[n]->name,sat[indx].name);
- strcpy(pPositionSat[n]->designator,sat[indx].designator);
- pPositionSat[n]->catnum=sat[indx].catnum;
- pPositionSat[n]->jdynum+2444238.5;
- pPositionSat[n]->sat_ele=sat_ele;
- pPositionSat[n]->sat_azi=sat_azi;
- pPositionSat[n]->phase=ma256;
- pPositionSat[n]->sat_lat=isplat;
- pPositionSat[n]->sat_long=isplong;
- pPositionSat[n]->range=irk;
- pPositionSat[n]->rev_num=rv;
- pPositionSat[n]->visibility=findsun;
- }
- }
- else
- {
- if (Geostationary(indx)==1)
- n=-3;
- if (Decayed(indx,daynum)==1)
- n=-4;
- }
- break;
- }
- else
- {
- n=-2;
- }
- }
- }
-if (n==0) n=-1;
-return n;
-
-
-}
-
-int SatFindPosition(char *satname, double jd_start, double step, long number_pos, \
SPositionSat *pPositionSat[])
-
-{ /* This function give passes after a date : position are calculated for \
Date+n*step if step is defined. Otherwise, positions are calculated \
remplir ici */
- int n, z;
- double day_start;
-
- n=0;
-
- /* Do a simple search for the matching satellite name */
-
- for (z=0; z<numsat; z++)
- {
- if ((strcmp(sat[z].name,satname)==0) || (atol(satname)==sat[z].catnum))
- {
-
- indx=z;
-
- day_start=jd_start-2444238.5;
-
- if (day_start>0)
- {
- /* Display a whole list */
- for (n=0; n<number_pos; n++)
- {
- /*daynum=(((time_start+(n*step))/86400.0)-3651.0);*/
- daynumy_start+(n*step/86400.0);
- PreCalc(indx);
- Calc();
- if (Decayed(indx,daynum)==0)
- {
- strcpy(pPositionSat[n]->name,sat[indx].name);
- strcpy(pPositionSat[n]->designator,sat[indx].designator);
- pPositionSat[n]->catnum=sat[indx].catnum;
- pPositionSat[n]->jdynum+2444238.5;
- pPositionSat[n]->sat_ele=sat_ele;
- pPositionSat[n]->sat_azi=sat_azi;
- pPositionSat[n]->phase=ma256;
- pPositionSat[n]->sat_lat=isplat;
- pPositionSat[n]->sat_long=isplong;
- pPositionSat[n]->range=irk;
- pPositionSat[n]->rev_num=rv;
- pPositionSat[n]->visibility=findsun;
-
- }
- }
- n=n-1;
- break;
- }
- else
- {
- n=-2;
- }
- }
- }
-if (n==0) n=-1;
-return n;
-
-}
-
diff --git a/kstars/satlib/SatLib.h b/kstars/satlib/SatLib.h
deleted file mode 100644
index a34848c..0000000
--- a/kstars/satlib/SatLib.h
+++ /dev/null
@@ -1,93 +0,0 @@
-/***************************************************************************\
-* SATLIB : A satellite position/orbital prediction library *
-* Made by Patrick Chevalley, Vincent Suc & Jean-Baptiste Butet. *
-* Copyright (C) 2005 *
-* http://www.sf.net/predictsatlib *
-*****************************************************************************
-* This Library is based on : PREDICT, Made by John A. Magliacan *
-*****************************************************************************
-* SGP4/SDP4 code was derived from Pascal routines originally written by *
-* Dr. TS Kelso, and converted to C by Neoklis Kyriazis, 5B4AZ *
-*****************************************************************************
-* *
-* This program is free software; you can redistribute it and/or modify *
-* it under the terms of the GNU General Public License as published by *
-* the Free Software Foundation; either version 2 of the License, or *
-* (at your option) any later version. *
-* *
-* This program is distributed in the hope that it will be useful, *
-* but WITHOUT ANY WARRANTY; without even the implied warranty of *
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
-* GNU General Public License for more details. *
-* *
-* You should have received a copy of the GNU General Public License *
-* along with this program; if not, write to the *
-* Free Software Foundation, Inc., *
-* Foundation, Inc., 51 Franklin Street, Fifth Floor, *
-* Boston, MA 02110-1301 USA *
-* *
-* Licensed under the GNU GPL *
-* *
-*****************************************************************************
-*Changelog : *
-* *
-*09/10/2005 :SatLib, Project (re)started, v0.1 *
-*26/05/1991 :Predict, Project started *
-\***************************************************************************/
-
-#ifndef SATLIB_H_
-#define SATLIB_H_
-
-#include <time.h>
-
-/* Result structure */
-typedef struct
-{
- double sat_ele; /* elevation */
- double sat_azi; /* azimuth */
- double jd; /* Unix time of position */
- long catnum; /* satellite catalog number */
- long range; /* satellite distance range */
- long rev_num; /* revolution number */
- long phase; /* phase angle */
- long sat_lat; /* satellite latitude */
- long sat_long; /* satellite longitude */
- char visibility; /* + = in sunlight, night time, visible above horizon
- * = in sunlight
- blank = in earth shadow */
- char name[25]; /* satellite name */
- char designator[10];/* International designator */
-} SPositionSat;
-
-#ifdef _WIN32
- #ifdef BUILD_DLL
-/* the dll exports */
- #define SATLIB_EXPORT __declspec(dllexport)
- #else
-/* the exe imports */
- #define SATLIB_EXPORT __declspec(dllimport)
- #endif
-#else
- #ifndef BUILD_DLL
-/* no declarations necessary for import */
- #define SATLIB_EXPORT
- #else
-/* the exe imports */
- #if __GNUC__- 0 >= 4
- #define SATLIB_EXPORT __attribute__ ((visibility("default")))
- #else
- #define SATLIB_EXPORT
- #endif
- #endif
-#endif
-
-/* function to be imported/exported */
-SATLIB_EXPORT int SatInit(char *ObsName, double ObsLat, double ObsLong, double \
ObsAlt, char *TLE_file);
-SATLIB_EXPORT int SatPassList(double jd_start, double jd_end, SPositionSat \
*pPositionSat[]);
-SATLIB_EXPORT int SatNextPass(char *satname, double jd_start, SPositionSat \
*pPositionSat[]);
-SATLIB_EXPORT int SatFindPosition(char *satname, double jd_start, double step, long \
number_pos, SPositionSat *pPositionSat[]);
-SATLIB_EXPORT double Julian_Date(struct tm *cdate);
-SATLIB_EXPORT void Date_Time(double julian_date,struct tm *cdate);
-
-
-#endif
diff --git a/kstars/satlib/timeval.h b/kstars/satlib/timeval.h
deleted file mode 100644
index cd6cccc..0000000
--- a/kstars/satlib/timeval.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * timeval.h 1.0 01/12/19
- *
- * Defines gettimeofday, timeval, etc. for Win32
- *
- * By Wu Yongwei
- *
- * (note from jharris: this code is in the public domain
- * see: http://wyw.dcweb.cn/time.htm)
- */
-
-#ifndef _TIMEVAL_H
-#define _TIMEVAL_H
-
-#ifdef _WIN32
-#ifdef USE_KDEWIN32_LIB
-#include <sys/time.h>
-#else
-
-#define WIN32_LEAN_AND_MEAN
-#include <windows.h>
-#include <time.h>
-
-#ifndef __GNUC__
-#define EPOCHFILETIME (116444736000000000i64)
-#else
-#define EPOCHFILETIME (116444736000000000LL)
-#endif
-
-struct timeval {
- long tv_sec; /* seconds */
- long tv_usec; /* microseconds */
-};
-
-struct timezone {
- int tz_minuteswest; /* minutes W of Greenwich */
- int tz_dsttime; /* type of dst correction */
-};
-
-__inline int gettimeofday(struct timeval *tv, struct timezone *tz)
-{
- FILETIME ft;
- LARGE_INTEGER li;
- __int64 t;
- static int tzflag;
-
- if (tv)
- {
- GetSystemTimeAsFileTime(&ft);
- li.LowPart = ft.dwLowDateTime;
- li.HighPart = ft.dwHighDateTime;
- t = li.QuadPart; /* In 100-nanosecond intervals */
- t -= EPOCHFILETIME; /* Offset to the Epoch time */
- t /= 10; /* In microseconds */
- tv->tv_sec = (long)(t / 1000000);
- tv->tv_usec = (long)(t % 1000000);
- }
-
- if (tz)
- {
- if (!tzflag)
- {
- _tzset();
- tzflag++;
- }
- tz->tz_minuteswest = _timezone / 60;
- tz->tz_dsttime = _daylight;
- }
-
- return 0;
-}
-#endif /* USE_KDEWIN32_LIB */
-#else /* _WIN32 */
-
-#include <time.h>
-#include <sys/time.h>
-
-#endif /* _WIN32 */
-
-#endif /* _TIMEVAL_H */
diff --git a/kstars/skycomponents/satellitecomponent.cpp \
b/kstars/skycomponents/satellitecomponent.cpp deleted file mode 100644
index 98db2cc..0000000
--- a/kstars/skycomponents/satellitecomponent.cpp
+++ /dev/null
@@ -1,351 +0,0 @@
-/***************************************************************************
- satellitecomponent.cpp - K Desktop Planetarium
- -------------------
- begin : 14 July 2006
- copyright : (C) 2006 by Jason Harris
- email : kstars@30doradus.org
- ***************************************************************************/
-
-/***************************************************************************
- * *
- * This program is free software; you can redistribute it and/or modify *
- * it under the terms of the GNU General Public License as published by *
- * the Free Software Foundation; either version 2 of the License, or *
- * (at your option) any later version. *
- * *
- ***************************************************************************/
-
-#include "satellitecomponent.h"
-
-#include <QBrush>
-#include <QPainter>
-
-#include "kstarsdata.h"
-#include "skymap.h"
-#include "skyobjects/skyline.h"
-#include "skylabeler.h"
-#include "Options.h"
-
-SatelliteComponent::SatelliteComponent(SkyComposite *parent ) :
- SkyComponent(parent),
- LabelPosition( NoLabel ),
- m_skyLabeler( SkyLabeler::Instance() )
-
-{}
-
-SatelliteComponent::~SatelliteComponent()
-{}
-
-bool SatelliteComponent::selected()
-{
- return Options::showSatellites();
-}
-
-// I don't think the ecliptic or the celestial equator should precess. -jbb
-void SatelliteComponent::update( KSNumbers * )
-{
- if ( ! selected() )
- return;
- KStarsData *data = KStarsData::Instance();
-
- foreach ( SkyPoint* p, pointList ) {
- //if ( num ) p->updateCoords( num );
- p->EquatorialToHorizontal( data->lst(), data->geo()->lat() );
- }
-}
-
-void SatelliteComponent::initSat( const QString &name, SPositionSat *pSat[], int \
npos ) {
- KStarsData *data = KStarsData::Instance();
- Label = name;
- LabelPosition = RightEdgeLabel;
- Pen = QPen( QBrush( data->colorScheme()->colorNamed( "SatColor" ) ),
- 2.5, Qt::SolidLine );
-
- for ( int i=0; i<npos; i++ ) {
- SkyPoint* p = new SkyPoint();
- p->setAlt( pSat[i]->sat_ele );
- p->setAz( pSat[i]->sat_azi );
- p->HorizontalToEquatorial( data->lst(), data->geo()->lat() );
-
- pointList.append( p );
- JDList.append( pSat[i]->jd );
-
- }
-}
-
-void SatelliteComponent::drawLinesComponent( QPainter &psky )
-{
- if ( ! selected() )
- return;
-
- SkyMap *map = SkyMap::Instance();
-
- psky.setPen( Pen );
-
- bool isVisible, isVisibleLast;
- SkyPoint *pLast, *pThis;
-
- // These are used to keep track of the element that is farrthest left,
- // farthest right, etc.
- float xLeft = 100000.;
- float xRight = 0.;
- float yTop = 100000.;
- float yBot = 0.;
-
- // These are the indices of the farthest left point, farthest right point,
- // etc. The are data members so the drawLabels() routine can use them.
- // Zero indicates an index that was never set and is considered invalid
- // inside of drawLabels().
- m_iLeft = m_iRight = m_iTop = m_iBot = 0;
-
- // We don't draw the label here but we need the proper font in order to set
- // the margins correctly. Since psky no contains the zoom dependent font as
- // its default font, we need to play the little dance below.
- QFontMetricsF fm( psky.font() );
-
- // Create the margins within which is is okay to draw the label
- float sideMargin = fm.width("MM") + fm.width( Label ) / 2.0;
-
- float leftMargin = sideMargin;
- float rightMargin = psky.window().width() - sideMargin;
- float topMargin = fm.height();
- float botMargin = psky.window().height() - 2.0 * fm.height();
-
- QPointF oThis, oLast, oMid;
-
- pLast = pointList.at( 0 );
- oLast = map->toScreen( pLast, true, &isVisibleLast );
-
- int limit = pointList.size();
-
- for ( int i=1 ; i < limit ; i++ ) {
- pThis = pointList.at( i );
- oThis = map->toScreen( pThis, true, &isVisible );
-
- if ( map->onScreen(oThis, oLast ) ) {
- if ( isVisible && isVisibleLast ) {
- psky.drawLine( oLast, oThis );
-
- // Keep track of index of leftmost, rightmost, etc point.
- // Only allow points that fit within the margins.
- qreal x = oThis.x();
- qreal y = oThis.y();
- if ( x > leftMargin && x < rightMargin &&
- y < botMargin && y > topMargin) {
-
- if ( x < xLeft ) {
- m_iLeft = i;
- xLeft = x;
- }
- if ( x > xRight ) {
- m_iRight = i;
- xRight = x;
- }
- if ( y > yBot ) {
- m_iBot = i;
- yBot = y;
- }
- if ( y < yTop ) {
- m_iTop = i;
- yTop = y;
- }
- }
- }
-
- else if ( isVisibleLast && ! isVisible ) {
- oMid = map->clipLine( pLast, pThis );
- psky.drawLine( oLast, oMid );
- }
- else if ( isVisible && ! isVisibleLast ) {
- oMid = map->clipLine( pThis, pLast );
- psky.drawLine( oMid, oThis );
- }
- }
-
- pLast = pThis;
- oLast = oThis;
- isVisibleLast = isVisible;
- }
-
- drawLabels( psky );
-}
-
-void SatelliteComponent::draw( QPainter &psky ) {
- drawLinesComponent( psky );
-
- SkyMap *map = SkyMap::Instance();
- KStarsData *data = KStarsData::Instance();
-
- if ( JDList.size() == 0 ) return;
-
- //Add tickmarks and timestamps along the portion of the
- //satellite track that is above the horizon
- //The time at each position is stored in the pSat array
- //as the julian day. Parse these days, and interpolate to find
- //times with :00 seconds (e.g., 12:34:00)
- KStarsDateTime dtLast( JDList[0] );
- for ( int i=1; i<JDList.size(); ++i ) {
- KStarsDateTime dt( JDList[i] );
- SkyPoint *sp = pointList.at(i);
- SkyPoint *sp2;
- if ( i<pointList.size()-1 )
- sp2 = pointList.at(i+1);
- else
- sp2 = pointList.at(i-1);
-
- if ( sp->alt().Degrees() > 0.0
- && dt.time().minute() != dtLast.time().minute() ) {
- double t1 = double(dtLast.time().second());
- double t2 = double(dt.time().second()) + 60.0;
- double f = ( 60.0 - t1 )/( t2 - t1 );
-
- //Determine the position of the tickmark along
- //the track, corresponding to the even-second time.
- //f is the fractional distance between the endpoints.
- double ra = f*sp->ra().Hours() + (1.0-f)*sp2->ra().Hours();
- double dc = f*sp->dec().Degrees() + (1.0-f)*sp2->dec().Degrees();
- SkyPoint sTick1(ra, dc);
- sTick1.EquatorialToHorizontal( data->lst(), data->geo()->lat() );
-
- //To draw a line perpendicular to the satellite track at the position of \
the tick,
- //We take advantage of QLineF::normalVector(). So first generate a \
QLineF that
- //lies along the satellite track, from sTick1 to sp2 (which is a nearby \
position
- //along the track). Then change its length to 10 pixels, and finall use
- //normalVector() to rotate it 90 degrees.
- QLineF seg( map->toScreen( &sTick1 ), map->toScreen( sp2 ) );
- seg.setLength( 10.0 );
- QLineF tick = seg.normalVector();
-
- //If the tick is extending below the satellite track, rotate it by 180 \
degrees
- if ( tick.y2() < tick.y1() ) {
- //Rotate tick by 180 degrees
- double x1 = tick.x1();
- double y1 = tick.y1();
- tick = QLineF( x1, y1, x1 - tick.dx(), y1 - tick.dy() );
- }
- psky.drawLine( tick );
-
- //Now, add a label to the tickmark showing the time
- double labelpa = atan2( tick.dy(), tick.dx() )/dms::DegToRad;
- if ( labelpa > 270.0 ) labelpa -= 360.0;
- else if ( labelpa > 90.0 ) labelpa -= 180.0;
- else if ( labelpa < -270.0 ) labelpa += 360.0;
- else if ( labelpa < -90.0 ) labelpa += 180.0;
-
- QTime tlabel = dt.time().addSecs( int(3600.0*data->geo()->TZ()) );
- psky.save();
- QFont stdFont( psky.font() );
- QFont smallFont( stdFont );
- smallFont.setPointSize( stdFont.pointSize() - 2 );
- psky.setFont( smallFont );
- psky.translate( tick.p2() );
- psky.rotate( labelpa );
- psky.drawText( QRectF(-25.0, 6.0, 40.0, 10.0), Qt::AlignCenter,
- tlabel.toString( "hh:mm" ) );
- psky.restore();
- psky.setFont( stdFont );
- }
-
- dtLast = dt;
- }
-
-}
-
-void SatelliteComponent::drawLabels( QPainter& psky )
-{
- if ( LabelPosition == NoLabel ) return;
-
- SkyMap *map = SkyMap::Instance();
-
- double comfyAngle = 40.0; // the first valid candidate with an angle
- // smaller than this gets displayed. If you set
- // this to > 90. then the first valid candidate
- // will be displayed, regardless of angle.
-
- // We store info about the four candidate points in arrays to make several
- // of the steps easier, particularly choosing the valid candiate with the
- // smallest angle from the horizontal.
-
- int i[4]; // index of candidate
- double a[4] = { 360.0, 360.0, 360.0, 360.0 }; // angle, default to large value
- QPointF o[4]; // candidate point
- bool okay[4] = { true, true, true, true }; // flag candidate false if it
- // overlaps a previous label.
-
- // Try candidate in different orders depending on if the label was to be
- // near the left or right side of the screen.
- if ( LabelPosition == LeftEdgeLabel ) {
- i[0] = m_iLeft;
- i[1] = m_iRight;
- i[2] = m_iBot;
- i[3] = m_iTop;
- }
- else {
- i[0] = m_iRight;
- i[1] = m_iLeft;
- i[2] = m_iBot;
- i[3] = m_iTop;
- }
-
- // Make sure we have at least one valid point
- int firstI = 0;
-
- for ( ; firstI < 4; firstI++ ) {
- if ( i[firstI] ) break;
- }
-
- // return if there are no valid candidates
- if ( firstI >= 4 ) return;
-
-
- // Try the points in order and print the label if we can draw it at
- // a comfortable angle for viewing;
- for ( int j = firstI; j < 4; j++ ) {
- o[j] = angleAt( map, i[j], &a[j] );
- if ( fabs( a[j] ) > comfyAngle ) continue;
- if ( m_skyLabeler->drawGuideLabel( o[j], Label, a[j] ) )
- return;
- okay[j] = false;
- }
-
- //--- No angle was comfy so pick the one with the smallest angle ---
-
- // Index of the index/angle/point that gets displayed
- int bestI = firstI;
-
- // find first valid candidate that does not overlap existing labels
- for ( ; bestI < 4; bestI++ ) {
- if ( i[bestI] && okay[bestI] ) break;
- }
-
- // return if all candiates either overlap or are invalid
- if ( bestI >= 4 ) return;
-
- // find the valid non-overlap candidate with the smallest angle
- for ( int j = bestI + 1; j < 4; j++ ) {
- if ( i[j] && okay[j] && fabs(a[j]) < fabs(a[bestI]) ) bestI = j;
- }
-
- m_skyLabeler->drawGuideLabel( o[bestI], Label, a[bestI] );
-}
-
-
-QPointF SatelliteComponent::angleAt( SkyMap* map, int i, double *angle )
-{
- SkyPoint* pThis = pointList.at( i );
- SkyPoint* pLast = pointList.at( i - 1 );
-
- QPointF oThis = map->toScreen( pThis );
- QPointF oLast = map->toScreen( pLast );
-
- double sx = double( oThis.x() - oLast.x() );
- double sy = double( oThis.y() - oLast.y() );
-
- *angle = atan2( sy, sx ) * 180.0 / dms::PI;
-
- // Never draw the label upside down
- if ( *angle < -90.0 ) *angle += 180.0;
- if ( *angle > 90.0 ) *angle -= 180.0;
-
- return oThis;
-}
diff --git a/kstars/skycomponents/satellitecomponent.h \
b/kstars/skycomponents/satellitecomponent.h deleted file mode 100644
index 2b6f828..0000000
--- a/kstars/skycomponents/satellitecomponent.h
+++ /dev/null
@@ -1,97 +0,0 @@
-/***************************************************************************
- satellitecomponent.h - K Desktop Planetarium
- -------------------
- begin : 14 July 2006
- copyright : (C) 2006 by Jason Harris
- email : kstars@30doradus.org
- ***************************************************************************/
-
-/***************************************************************************
- * *
- * This program is free software; you can redistribute it and/or modify *
- * it under the terms of the GNU General Public License as published by *
- * the Free Software Foundation; either version 2 of the License, or *
- * (at your option) any later version. *
- * *
- ***************************************************************************/
-
-#ifndef SATELLITECOMPONENT_H
-#define SATELLITECOMPONENT_H
-
-#include <QList>
-#include <QPointF>
-#include <QPen>
-
-#include "skycomponent.h"
-#include "skyobjects/skypoint.h"
-
-extern "C" {
-#include "satlib/SatLib.h"
-}
-
-class SkyMap;
-class SkyLabeler;
-
-
-class SatelliteComponent : public SkyComponent
-{
-public:
- enum { NoLabel = 0, LeftEdgeLabel = 1, RightEdgeLabel = 2, UnknownLabel };
-
- /**@short Constructor
- * @p parent Pointer to the parent SkyComposite object
- */
- SatelliteComponent(SkyComposite* parent);
-
- virtual ~SatelliteComponent();
-
- /**@short Update the sky positions of this component.
- *
- * This function usually just updates the Horizontal (Azimuth/Altitude)
- * coordinates of the objects in this component. However, the precession
- * and nutation must also be recomputed periodically. Requests to do
- * so are sent through the doPrecess parameter.
- * @p num Pointer to the KSNumbers object
- * @note By default, the num parameter is NULL, indicating that
- * Precession/Nutation computation should be skipped; this computation
- * is only occasionally required.
- */
- virtual void update( KSNumbers *num=0 );
-
- virtual bool selected();
- virtual void draw( QPainter &psky );
-
- /**@short Initialize the component using a SPositionSat array */
- void initSat(const QString &name, SPositionSat *pSat[], int nsteps);
-
-private:
- void drawLinesComponent( QPainter &psky );
- /* @short draw the label if any. Is currently called at the bottom of
- * draw() but that call could be removed and it could be called
- * externally AFTER draw() has been called so draw() can set up the label
- * position candidates.
- */
- void drawLabels( QPainter& psky );
-
- /* @short This routine does two things at once. It returns the QPointF
- * corresponding to pointList[i] and also computes the angle using
- * pointList[i] and pointList[i-1] therefore you MUST ensure that:
- *
- * 1 <= i < pointList.size().
- */
- QPointF angleAt( SkyMap* map, int i, double *angle );
-
- QList<SkyPoint*> pointList;
- int LabelPosition;
- QString Label;
- QPen Pen;
-
- SkyLabeler* m_skyLabeler;
- int m_iLeft, m_iRight, m_iTop, m_iBot; // the four label position candidates
-
- QStringList SatelliteNames;
- long double JulianDate;
- QList<double> JDList;
-};
-
-#endif
diff --git a/kstars/skycomponents/satellitecomposite.cpp \
b/kstars/skycomponents/satellitecomposite.cpp deleted file mode 100644
index 5c8da52..0000000
--- a/kstars/skycomponents/satellitecomposite.cpp
+++ /dev/null
@@ -1,106 +0,0 @@
-/***************************************************************************
- satellitecomposite.cpp - K Desktop Planetarium
- -------------------
- begin : 22 Nov 2006
- copyright : (C) 2006 by Jason Harris
- email : kstars@30doradus.org
- ***************************************************************************/
-
-/***************************************************************************
- * *
- * This program is free software; you can redistribute it and/or modify *
- * it under the terms of the GNU General Public License as published by *
- * the Free Software Foundation; either version 2 of the License, or *
- * (at your option) any later version. *
- * *
- ***************************************************************************/
-
-#include "satellitecomposite.h"
-#include "satellitecomponent.h"
-
-#include <QFile>
-#include <QFileInfo>
-#include <QTextStream>
-
-#include "Options.h"
-#include "ksutils.h"
-#include "kstarsdata.h"
-
-#define DT 10.0 //10-sec timesteps
-#define NSTEPS 360 //360 steps == 1 hour of coverage
-
-SatelliteComposite::SatelliteComposite( SkyComposite *parent )
- : SkyComposite( parent )
-{
- for ( uint i=0; i<NSTEPS; ++i )
- pSat.append( new SPositionSat );
- emitProgressText( i18n("Creating Earth satellites" ) );
-
- KStarsData* data = KStarsData::Instance();
- QFile file;
-
- //Extract satellite names from every third line of the satellites.dat file
- if ( KSUtils::openDataFile( file, "satellites.dat" ) ) {
- QString sfPath = QFileInfo( file ).absoluteFilePath();
- QTextStream stream( &file );
- int i = 0;
- while ( !stream.atEnd() ) {
- QString name = stream.readLine().trimmed();
- if ( i % 3 == 0 )
- SatelliteNames.append( name );
- i++;
- }
- file.close();
-
- //Read in data from the satellite file and construct paths for
- //the present geographic location
- SatInit( data->geo()->translatedName().toUtf8().data(),
- data->geo()->lat()->Degrees(), data->geo()->lng()->Degrees(),
- data->geo()->height(), sfPath.toAscii().data() );
-
- update( );
- }
-}
-
-SatelliteComposite::~SatelliteComposite()
-{
- qDeleteAll(pSat);
-}
-
-void SatelliteComposite::update( KSNumbers * ) {
- KStarsData *data = KStarsData::Instance();
- //Julian Day value for current date and time:
- JD_0 = data->ut().djd();
-
- //Clear the current list of tracks
- components().clear();
-
- //Loop over desired satellites, construct their paths over the next hour,
- //and add visible paths to the list
- foreach ( const QString &satName, SatelliteNames ) {
- SatFindPosition( satName.toAscii().data(), JD_0, DT, NSTEPS, pSat.data() );
-
- //Make sure the satellite track is visible before adding it to the list.
- bool isVisible = false;
- for ( int i=0; i<NSTEPS; i++ ) {
- if ( pSat[i]->sat_ele > 10.0 ) {
- isVisible = true;
- break;
- }
- }
-
- if ( isVisible ) {
- SatelliteComponent *sc = new SatelliteComponent( this );
- sc->initSat( satName, pSat.data(), NSTEPS );
- addComponent( sc );
-
- //DEBUG
- // foreach ( SPositionSat *ps, pSat ) {
- // KStarsDateTime dt( ps->jd );
- // dms alt( ps->sat_ele );
- // dms az( ps->sat_azi );
- // kDebug() << ps->name << " " << dt.toString() << " " << \
alt.toDMSString() << " " << az.toDMSString();
- // }
- }
- }
-}
diff --git a/kstars/skycomponents/satellitecomposite.h \
b/kstars/skycomponents/satellitecomposite.h deleted file mode 100644
index 51a52a9..0000000
--- a/kstars/skycomponents/satellitecomposite.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/***************************************************************************
- satellitecomposite.h - K Desktop Planetarium
- -------------------
- begin : 22 Nov 2006
- copyright : (C) 2006 by Jason Harris
- email : kstars@30doradus.org
- ***************************************************************************/
-
-/***************************************************************************
- * *
- * This program is free software; you can redistribute it and/or modify *
- * it under the terms of the GNU General Public License as published by *
- * the Free Software Foundation; either version 2 of the License, or *
- * (at your option) any later version. *
- * *
- ***************************************************************************/
-
-#ifndef SATELLITECOMPOSITE_H
-#define SATELLITECOMPOSITE_H
-
-#include <QStringList>
-#include <QVector>
-
-#include "skycomposite.h"
-extern "C" {
-#include "satlib/SatLib.h"
-}
-
-class SatelliteComposite : public SkyComposite
-{
-public:
- /**
- *@short Constructor
- *@param parent Pointer to the parent SkyComposite object
- */
- SatelliteComposite( SkyComposite *parent );
-
- ~SatelliteComposite();
-
- /**@short Update the satellite tracks
- * @param num Pointer to the KSNumbers object
- */
- virtual void update( KSNumbers *num=0 );
-
-private:
- QVector<SPositionSat*> pSat;
- QStringList SatelliteNames;
- long double JD_0;
-};
-
-#endif
diff --git a/kstars/skycomponents/skymapcomposite.cpp \
b/kstars/skycomponents/skymapcomposite.cpp index b0c108e..47a0391 100644
--- a/kstars/skycomponents/skymapcomposite.cpp
+++ b/kstars/skycomponents/skymapcomposite.cpp
@@ -42,7 +42,6 @@
#include "solarsystemcomposite.h"
#include "starcomponent.h"
#include "deepstarcomponent.h"
-//#include "satellitecomposite.h"
#include "flagcomponent.h"
#include "satellitescomponent.h"
@@ -81,8 +80,6 @@ SkyMapComposite::SkyMapComposite(SkyComposite *parent ) :
addComponent( m_Equator = new Equator( this ));
addComponent( m_Ecliptic = new Ecliptic( this ));
addComponent( m_Horizon = new HorizonComponent( this ));
- // Disable satellites for now
- // addComponent( m_Satellites = new SatelliteComposite( this ));
addComponent( m_DeepSky = new DeepSkyComponent( this ));
m_CustomCatalogs = new SkyComposite( this );
@@ -141,7 +138,6 @@ void SkyMapComposite::update(KSNumbers *num )
m_SolarSystem->update( num );
//13. Satellites
m_Satellites->update( num );
- //m_Satellites->update( data, num );
//14. Horizon
m_Horizon->update( num );
}
@@ -243,9 +239,6 @@ void SkyMapComposite::draw( SkyPainter *skyp )
m_Satellites->draw( skyp );
- // TODO: Fix satellites sometime
- // m_Satellites->draw( psky );
-
m_Horizon->draw( skyp );
map->drawObjectLabels( labelObjects() );
diff --git a/kstars/skycomponents/skymapcomposite.h \
b/kstars/skycomponents/skymapcomposite.h index 51734bf..cd32655 100644
--- a/kstars/skycomponents/skymapcomposite.h
+++ b/kstars/skycomponents/skymapcomposite.h
@@ -209,7 +209,6 @@ private:
SolarSystemComposite *m_SolarSystem;
SkyComposite *m_CustomCatalogs;
StarComponent *m_Stars;
- //SatelliteComposite *m_Satellites;
FlagComponent *m_Flags;
TargetListComponent *m_ObservingList;
TargetListComponent *m_StarHopRouteList;
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic