8f36272fe08b010119b401848f0ea9ef01478af8
[olsrd.git] / lib / pud / nmealib / include / nmea / sentence.h
1 /*
2  * This file is part of nmealib.
3  *
4  * Copyright (c) 2008 Timur Sinitsyn
5  * Copyright (c) 2011 Ferry Huberts
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program. If not, see <http://www.gnu.org/licenses/>.
19  */
20
21 /*! \file */
22
23 #ifndef __NMEA_SENTENCE_H__
24 #define __NMEA_SENTENCE_H__
25
26 #include <nmea/info.h>
27 #include <nmea/time.h>
28
29 #ifdef  __cplusplus
30 extern "C" {
31 #endif
32
33 /**
34  * NMEA packets type which parsed and generated by library
35  */
36 enum nmeaPACKTYPE
37 {
38     GPNON   = 0x0000,   /**< Unknown packet type. */
39     GPGGA   = 0x0001,   /**< GGA - Essential fix data which provide 3D location and accuracy data. */
40     GPGSA   = 0x0002,   /**< GSA - GPS receiver operating mode, SVs used for navigation, and DOP values. */
41     GPGSV   = 0x0004,   /**< GSV - Number of SVs in view, PRN numbers, elevation, azimuth & SNR values. */
42     GPRMC   = 0x0008,   /**< RMC - Recommended Minimum Specific GPS/TRANSIT Data. */
43     GPVTG   = 0x0010    /**< VTG - Actual track made good and speed over ground. */
44 };
45
46 /**
47  * GGA packet information structure (Global Positioning System Fix Data)
48  */
49 typedef struct _nmeaGPGGA
50 {
51     nmeaTIME utc;       /**< UTC of position (just time) */
52         double  lat;        /**< Latitude in NDEG - [degree][min].[sec/60] */
53     char    ns;         /**< [N]orth or [S]outh */
54         double  lon;        /**< Longitude in NDEG - [degree][min].[sec/60] */
55     char    ew;         /**< [E]ast or [W]est */
56     int     sig;        /**< GPS quality indicator (0 = Invalid; 1 = Fix; 2 = Differential, 3 = Sensitive) */
57         int     satinuse;   /**< Number of satellites in use (not those in view) */
58     double  HDOP;       /**< Horizontal dilution of precision */
59     double  elv;        /**< Antenna altitude above/below mean sea level (geoid) */
60     char    elv_units;  /**< [M]eters (Antenna height unit) */
61     double  diff;       /**< Geoidal separation (Diff. between WGS-84 earth ellipsoid and mean sea level. '-' = geoid is below WGS-84 ellipsoid) */
62     char    diff_units; /**< [M]eters (Units of geoidal separation) */
63     double  dgps_age;   /**< Time in seconds since last DGPS update */
64     int     dgps_sid;   /**< DGPS station ID number */
65
66 } nmeaGPGGA;
67
68 /**
69  * GSA packet information structure (Satellite status)
70  */
71 typedef struct _nmeaGPGSA
72 {
73     char    fix_mode;   /**< Mode (M = Manual, forced to operate in 2D or 3D; A = Automatic, 3D/2D) */
74     int     fix_type;   /**< Type, used for navigation (1 = Fix not available; 2 = 2D; 3 = 3D) */
75     int     sat_prn[NMEA_MAXSAT]; /**< PRNs of satellites used in position fix (null for unused fields) */
76     double  PDOP;       /**< Dilution of precision */
77     double  HDOP;       /**< Horizontal dilution of precision */
78     double  VDOP;       /**< Vertical dilution of precision */
79
80 } nmeaGPGSA;
81
82 /**
83  * GSV packet information structure (Satellites in view)
84  */
85 typedef struct _nmeaGPGSV
86 {
87     int     pack_count; /**< Total number of messages of this type in this cycle */
88     int     pack_index; /**< Message number */
89     int     sat_count;  /**< Total number of satellites in view */
90     nmeaSATELLITE sat_data[NMEA_SATINPACK];
91
92 } nmeaGPGSV;
93
94 /**
95  * RMC packet information structure (Recommended Minimum sentence C)
96  */
97 typedef struct _nmeaGPRMC
98 {
99     nmeaTIME utc;       /**< UTC of position */
100     char    status;     /**< Status (A = active or V = void) */
101         double  lat;        /**< Latitude in NDEG - [degree][min].[sec/60] */
102     char    ns;         /**< [N]orth or [S]outh */
103         double  lon;        /**< Longitude in NDEG - [degree][min].[sec/60] */
104     char    ew;         /**< [E]ast or [W]est */
105     double  speed;      /**< Speed over the ground in knots */
106     double  direction;  /**< Track angle in degrees True */
107     double  declination; /**< Magnetic variation degrees (Easterly var. subtracts from true course) */
108     char    declin_ew;  /**< [E]ast or [W]est */
109     char    mode;       /**< Mode indicator of fix type (A = autonomous, D = differential, E = estimated, N = not valid, S = simulator) */
110
111 } nmeaGPRMC;
112
113 /**
114  * VTG packet information structure (Track made good and ground speed)
115  */
116 typedef struct _nmeaGPVTG
117 {
118     double  dir;        /**< True track made good (degrees) */
119     char    dir_t;      /**< Fixed text 'T' indicates that track made good is relative to true north */
120     double  dec;        /**< Magnetic track made good */
121     char    dec_m;      /**< Fixed text 'M' */
122     double  spn;        /**< Ground speed, knots */
123     char    spn_n;      /**< Fixed text 'N' indicates that speed over ground is in knots */
124     double  spk;        /**< Ground speed, kilometers per hour */
125     char    spk_k;      /**< Fixed text 'K' indicates that speed over ground is in kilometers/hour */
126
127 } nmeaGPVTG;
128
129 void nmea_zero_GPGGA(nmeaGPGGA *pack);
130 void nmea_zero_GPGSA(nmeaGPGSA *pack);
131 void nmea_zero_GPGSV(nmeaGPGSV *pack);
132 void nmea_zero_GPRMC(nmeaGPRMC *pack);
133 void nmea_zero_GPVTG(nmeaGPVTG *pack);
134
135 #ifdef  __cplusplus
136 }
137 #endif
138
139 #endif /* __NMEA_SENTENCE_H__ */