/*
 * gps.h
 *
 * Header to deal with low level GPS data
 *
 *
 * Copyright (C) 2009  Sylvain Munaut <tnt@246tNt.com>
 *
 * 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, see <http://www.gnu.org/licenses/>.
 */

#ifndef __GPS_H__
#define __GPS_H__

#ifdef __cplusplus
extern "C" {
#endif

#include <stdint.h>


#define MAX_SV	64


/* Ionosperic model data */
struct gps_ionosphere_model {
			/* #bits  Scale factor  Effective  Units            */
			/*           (LSB)       range                      */

	int alpha_0;	/* s 8       2^-30                 seconds          */
	int alpha_1;	/* s 8       2^-27                 s / semi-circles */
	int alpha_2;	/* s 8       2^-24                 s / (semi-circles)^2 */
	int alpha_3;	/* s 8       2^-24                 s / (semi-circles)^3 */
	int beta_0;	/* s 8       2^11                  seconds          */
	int beta_1;	/* s 8       2^14                  s / semi-circles */
	int beta_2;	/* s 8       2^16                  s / (semi-circles)^2 */
	int beta_3;	/* s 8       2^16                  s / (semi-circles)^3 */
};


/* UTC model data */
struct gps_utc_model {
			/* #bits  Scale factor  Effective  Units            */
			/*           (LSB)       range                      */

	int a0;		/* s 32      2^-30                 seconds          */
	int a1;		/* s 24      2^-50                 seconds / seconds */
	int delta_t_ls;	/* s  8      1                     seconds          */
	int t_ot;	/* u  8      2^12       602,112    seconds          */
	int wn_t;	/* u  8      1                     weeks            */
	int wn_lsf;	/* u  8      1                     weeks            */
	int dn;		/* u  8      1                7    days             */
	int delta_t_lsf;/* s  8      1                     seconds          */
};


/* Almanach data */
struct gps_almanac_sv {
	int sv_id;
	int sv_health;

			/* #bits  Scale factor  Effective  Units            */
			/*           (LSB)       range                      */

	int e;		/* u 16      2^-21                                  */
	int t_oa;	/* u  8      2^12       602,112    seconds          */
	int ksii;	/* s 16      2^-19                 semi-circles     */
	int omega_dot;	/* s 16      2^-38                 semi-circles / s */
	int a_powhalf;	/* u 24      2^-11                 meters           */
	int omega_0;	/* s 24      2^-23                 semi-circles     */
	int w;		/* s 24      2^-23                 semi-circles     */
	int m_0;	/* s 24      2^-23                 semi-circles     */
	int a_f0;	/* s 11      2^-20                 seconds          */
	int a_f1;	/* s 11      2^-38                 seconds / seconds */
};

struct gps_almanac {
	int wna;
	int n_sv;
	struct gps_almanac_sv svs[MAX_SV];
};


/* Ephemeris data */
struct gps_ephemeris_sv {
	int sv_id;

			/* #bits  Scale factor  Effective  Units            */
			/*           (LSB)       range                      */

	int code_on_l2;	/* u  2      1                     /                */
	int week_no;	/* u 10      1                     week             */
	int l2_p_flag;	/* u  1      1                     /                */
	int sv_ura;	/* u  4      /                     /                */
	int sv_health;	/* u  6      /                     /                */
	int t_gd;	/* s  8      2^-31                 seconds          */
	int iodc;	/* u 10      /                     /                */
	int t_oc;	/* u 16      2^4        604,784    seconds          */
	int a_f2;	/* s  8      2^-55                 sec / sec^2      */
	int a_f1;	/* s 16      2^-43                 sec / sec        */
	int a_f0;	/* s 22      2^-31                 seconds          */

	int c_rs;	/* s 16      2^-5                  meters           */
	int delta_n;	/* s 16      2^-43                 semi-circles / s */
	int m_0;	/* s 32      2^-31                 semi-circles     */
	int c_uc;	/* s 16      2^-29                 radians          */
	unsigned int e;	/* u 32      2^-33      0.03       /                */
	int c_us;	/* s 16      2^-29                 radians          */
	unsigned int a_powhalf; /* u 32  2^-19             meters^(1/2)     */
	int t_oe;	/* u 16      2^4        604,784    seconds          */
	int fit_flag;	/* u  1      /                     /                */

	int c_ic;	/* s 16      2^-29                 radians          */
	int omega_0;	/* s 32      2^-31                 semi-circles     */
	int c_is;	/* s 16      2^-29                 radians          */
	int i_0;	/* s 32      2^-31                 semi-circles     */
	int c_rc;	/* s 16      2^-5                  meters           */
	int w;		/* s 32      2^-31                 semi-circles     */
	int omega_dot;	/* s 24      2^-43                 semi-circles / s */
	int idot;	/* s 14      2^-43                 semi-circles / s */

	int _rsvd1;	/* 23 bits */
	int _rsvd2;	/* 24 bits */
	int _rsvd3;	/* 24 bits */
	int _rsvd4;	/* 16 bits */
	int aodo;	/* 8 bits  Not sure it needs to be here ... */
};

struct gps_ephemeris {
	int n_sv;
	struct gps_ephemeris_sv svs[MAX_SV];
};


/* Reference position */
struct gps_ref_pos {	/* WSG84 ellipsoid */
	double latitude;	/* deg */
	double longitude;	/* deg */
	double altitude;	/* m above ellipsoid */
};


/* Reference time */
struct gps_ref_time {
	int wn;			/* GPS week number */
	double tow;		/* in seconds */
};


/* All assist data */
#define GPS_FIELD_IONOSPHERE	(1<<0)
#define GPS_FIELD_UTC		(1<<1)
#define GPS_FIELD_ALMANAC	(1<<2)
#define GPS_FIELD_EPHEMERIS	(1<<3)
#define GPS_FIELD_REFPOS	(1<<4)
#define GPS_FIELD_REFTIME	(1<<5)

struct gps_assist_data {
	int fields;
	struct gps_ionosphere_model	ionosphere;
	struct gps_utc_model		utc;
	struct gps_almanac		almanac;
	struct gps_ephemeris		ephemeris;
	struct gps_ref_pos		ref_pos;
	struct gps_ref_time		ref_time;
};


/* GPS Subframe utility methods (see gps.c for details) */
int gps_unpack_sf123(uint32_t *sf, struct gps_ephemeris_sv *eph);
int gps_unpack_sf45_almanac(uint32_t *sf, struct gps_almanac_sv *alm);


#ifdef __cplusplus
}
#endif

#endif /* __GPS_H__ */

