| /* |
| * 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__ */ |
| |