#include #include #include #include #include #include #include "sgdp4h.h" #define LIM 128 #define D2R M_PI/180.0 #define R2D 180.0/M_PI #define XKMPER 6378.135 // Earth radius in km long Isat = 0; long Isatsel = 0; extern double SGDP4_jd0; struct map { long satno; double mjd; char nfd[LIM], tlefile[LIM], observer[32]; char datadir[LIM], tledir[LIM]; } m; // Compute Julian Day from Date double date2mjd (int year, int month, double day) { int a, b; double jd; if (month < 3) { year--; month += 12; } a = floor (year / 100.); b = 2. - a + floor (a / 4.); if (year < 1582) b = 0; if (year == 1582 && month < 10) b = 0; if (year == 1582 && month == 10 && day <= 4) b = 0; jd = floor (365.25 * (year + 4716)) + floor (30.6001 * (month + 1)) + day + b - 1524.5; return jd - 2400000.5; } // nfd2mjd double nfd2mjd (char *date) { int year, month, day, hour, min, sec; double mjd, dday; sscanf (date, "%04d-%02d-%02dT%02d:%02d:%02d", &year, &month, &day, &hour, &min, &sec); dday = day + hour / 24.0 + min / 1440.0 + sec / 86400.0; mjd = date2mjd (year, month, dday); return mjd; } void usage () { printf ("Usage goes here.\n"); return; } // Return x modulo y [0,y) double modulo (double x, double y) { x = fmod (x, y); if (x < 0.0) x += y; return x; } // Greenwich Mean Sidereal Time double gmst (double mjd) { double t, gmst; t = (mjd - 51544.5) / 36525.0; gmst = modulo (280.46061837 + 360.98564736629 * (mjd - 51544.5) + t * t * (0.000387933 - t / 38710000), 360.0); return gmst; } // Present nfd void nfd_now (char *s) { time_t rawtime; struct tm *ptm; // Get UTC time time (&rawtime); ptm = gmtime (&rawtime); sprintf (s, "%04d-%02d-%02dT%02d:%02d:%02d", ptm->tm_year + 1900, ptm->tm_mon + 1, ptm->tm_mday, ptm->tm_hour, ptm->tm_min, ptm->tm_sec); return; } // Compute longitude void compute_longitude (char *tlefile, long satno, double mjd) { FILE *fp = NULL; orbit_t orb; xyz_t satpos, satvel; double jd, h, l, b, r; long imode; // Open TLE file fp = fopen (tlefile, "rb"); if (fp == NULL) fatal_error ("File open failed for reading \"%s\"", tlefile); // Loop over elements while (read_twoline (fp, satno, &orb) == 0) { Isat = orb.satno; imode = init_sgdp4 (&orb); if (imode == SGDP4_ERROR) continue; // Skip objects with mean motions outside of 0.8 to 1.2 revs/day if (orb.rev < 0.8 || orb.rev > 1.2) continue; // Get Julian Date jd = mjd + 2400000.5; // Get positions satpos_xyz (jd, &satpos, &satvel); // Greenwich Mean Sidereal time h = gmst (mjd); // Celestial position r = sqrt (satpos.x * satpos.x + satpos.y * satpos.y + satpos.z * satpos.z); l = atan2 (satpos.y, satpos.x) * R2D; l = modulo (l - h, 360.0); b = asin (satpos.z / r) * R2D; if (l > 180.0) l -= 360.0; if (l < -180.0) l += 360.0; printf ("%05d %10s %8.3lf %8.3lf %6.0lf\n", orb.satno, orb.desig, l, b, r - XKMPER); } fclose (fp); return; } int main (int argc, char *argv[]) { int arg = 0; long satno = 0; double mjd; char nfd[LIM], tlefile[LIM]; nfd_now (nfd); mjd = nfd2mjd (nfd); // Decode options if (argc > 1) { while ((arg = getopt (argc, argv, "t:c:i:h")) != -1) { switch (arg) { case 't': strcpy (nfd, optarg); mjd = nfd2mjd (nfd); break; case 'c': strcpy (tlefile, optarg); break; case 'i': satno = atoi (optarg); break; case 'h': usage (); return 0; break; default: usage (); return 0; } } } else { usage (); return 0; } // Compute longitudes of satellites compute_longitude (tlefile, satno, mjd); return 0; }