#ifndef _sgp4unit_
#define _sgp4unit_
/*     ----------------------------------------------------------------
 *
 *                                 sgp4unit.h
 *
 *    this file contains the sgp4 procedures for analytical propagation
 *    of a satellite. the code was originally released in the 1980 and 1986
 *    spacetrack papers. a detailed discussion of the theory and history
 *    may be found in the 2006 aiaa paper by vallado, crawford, hujsak,
 *    and kelso.
 *
 *                            companion code for
 *               fundamentals of astrodynamics and applications
 *                                    2007
 *                              by david vallado
 *
 *       (w) 719-573-2600, email dvallado@agi.com
 *
 *    current :
 *              30 Dec 11  david vallado
 *                           consolidate updated code version
 *              30 Aug 10  david vallado
 *                           delete unused variables in initl
 *                           replace pow inetger 2, 3 with multiplies for speed
 *    changes :
 *               3 Nov 08  david vallado
 *                           put returns in for error codes
 *              29 sep 08  david vallado
 *                           fix atime for faster operation in dspace
 *                           add operationmode for afspc (a) or improved (i)
 *                           performance mode
 *              20 apr 07  david vallado
 *                           misc fixes for constants
 *              11 aug 06  david vallado
 *                           chg lyddane choice back to strn3, constants, misc
 * doc 15 dec 05  david vallado misc fixes 26 jul 05  david vallado fixes for
 * paper note that each fix is preceded by a comment with "sgp4fix" and an
 * explanation of what was changed 10 aug 04  david vallado 2nd printing
 * baseline working 14 may 01  david vallado 2nd edition baseline 80  norad
 *                           original baseline
 *       ---------------------------------------------------------------- */

#include <math.h>
#include <stdio.h>
#define SGP4Version "SGP4 Version 2011-12-30"

#define pi 3.14159265358979323846

// -------------------------- structure declarations
// ----------------------------
typedef enum { wgs72old, wgs72, wgs84 } gravconsttype;

typedef struct elsetrec {
  long int satnum;
  int epochyr, epochtynumrev;
  int error;
  char operationmode;
  char init, method;

  /* Near Earth */
  int isimp;
  double aycof, con41, cc1, cc4, cc5, d2, d3, d4, delmo, eta, argpdot, omgcof,
    sinmao, t, t2cof, t3cof, t4cof, t5cof, x1mth2, x7thm1, mdot, nodedot,
    xlcof, xmcof, nodecf;

  /* Deep Space */
  int irez;
  double d2201, d2211, d3210, d3222, d4410, d4422, d5220, d5232, d5421, d5433,
    dedt, del1, del2, del3, didt, dmdt, dnodt, domdt, e3, ee2, peo, pgho, pho,
    pinco, plo, se2, se3, sgh2, sgh3, sgh4, sh2, sh3, si2, si3, sl2, sl3, sl4,
    gsto, xfact, xgh2, xgh3, xgh4, xh2, xh3, xi2, xi3, xl2, xl3, xl4, xlamo,
    zmol, zmos, atime, xli, xni;

  double a, altp, alta, epochdays, jdsatepoch, nddot, ndot, bstar, rcse, inclo,
    nodeo, ecco, argpo, mo, no;
} elsetrec;

// --------------------------- function declarations
// ----------------------------
extern "C" {
  bool sgp4init(gravconsttype whichconst, char opsmode, const int satn,
                const double epoch, const double xbstar,
                const double xecco, const double xargpo,
                const double xinclo, const double xmo,
                const double xno, const double xnodeo,
                elsetrec &satrec);

  bool sgp4(gravconsttype whichconst, elsetrec &satrec, double tsince,
            double r[3], double v[3]);

  double gstime(double jdut1);

  void getgravconst(gravconsttype whichconst, double &tumin,
                    double &mu, double &radiusearthkm, double &xke,
                    double &j2, double &j3, double &j4, double &j3oj2);
}
#endif
