/* * * NMEA library * URL: http://nmea.sourceforge.net * Author: Tim (xtimor@gmail.com) * Licence: http://www.gnu.org/licenses/lgpl.html * $Id: sentence.h 17 2008-03-11 11:56:11Z xtimor $ * */ /*! \file */ #ifndef __NMEA_INFO_H__ #define __NMEA_INFO_H__ #define NMEA_SIG_BAD (0) #define NMEA_SIG_LOW (1) #define NMEA_SIG_MID (2) #define NMEA_SIG_HIGH (3) #define NMEA_FIX_BAD (1) #define NMEA_FIX_2D (2) #define NMEA_FIX_3D (3) #define NMEA_MAXSAT (12) #define NMEA_SATINPACK (4) #define NMEA_NSATPACKS (NMEA_MAXSAT / NMEA_SATINPACK) #define NMEA_DEF_LAT (5001.2621) #define NMEA_DEF_LON (3613.0595) #ifdef __cplusplus extern "C" { #endif /** * Date and time data * @see nmea_time_now */ typedef struct _nmeaTIME { int year; /**< Years since 1900 */ int mon; /**< Months since January - [0,11] */ int day; /**< Day of the month - [1,31] */ int hour; /**< Hours since midnight - [0,23] */ int min; /**< Minutes after the hour - [0,59] */ int sec; /**< Seconds after the minute - [0,59] */ int hsec; /**< Hundredth part of second - [0,99] */ } nmeaTIME; /** * Position data in fractional degrees or radians */ typedef struct _nmeaPOS { double lat; /**< Latitude */ double lon; /**< Longitude */ } nmeaPOS; /** * Information about satellite * @see nmeaSATINFO * @see nmeaGPGSV */ typedef struct _nmeaSATELLITE { int id; /**< Satellite PRN number */ int in_use; /**< Used in position fix */ int elv; /**< Elevation in degrees, 90 maximum */ int azimuth; /**< Azimuth, degrees from true north, 000 to 359 */ int sig; /**< Signal, 00-99 dB */ } nmeaSATELLITE; /** * Information about all satellites in view * @see nmeaINFO * @see nmeaGPGSV */ typedef struct _nmeaSATINFO { int inuse; /**< Number of satellites in use (not those in view) */ int inview; /**< Total number of satellites in view */ nmeaSATELLITE sat[NMEA_MAXSAT]; /**< Satellites information */ } nmeaSATINFO; /** * Summary GPS information from all parsed packets, * used also for generating NMEA stream * @see nmea_parse * @see nmea_GPGGA2info, nmea_...2info */ typedef struct _nmeaINFO { int smask; /**< Mask specifying types of packages from which data have been obtained */ nmeaTIME utc; /**< UTC of position */ int sig; /**< GPS quality indicator (0 = Invalid; 1 = Fix; 2 = Differential, 3 = Sensitive) */ int fix; /**< Operating mode, used for navigation (1 = Fix not available; 2 = 2D; 3 = 3D) */ double PDOP; /**< Position Dilution Of Precision */ double HDOP; /**< Horizontal Dilution Of Precision */ double VDOP; /**< Vertical Dilution Of Precision */ double lat; /**< Latitude in NDEG - +/-[degree][min].[sec/60] */ double lon; /**< Longitude in NDEG - +/-[degree][min].[sec/60] */ double elv; /**< Antenna altitude above/below mean sea level (geoid) in meters */ double speed; /**< Speed over the ground in kilometers/hour */ double direction; /**< Track angle in degrees True */ double declination; /**< Magnetic variation degrees (Easterly var. subtracts from true course) */ nmeaSATINFO satinfo; /**< Satellites information */ } nmeaINFO; /** * NMEA packets type which parsed and generated by library */ enum nmeaPACKTYPE { GPNON = 0x0000, /**< Unknown packet type. */ GPGGA = 0x0001, /**< GGA - Essential fix data which provide 3D location and accuracy data. */ GPGSA = 0x0002, /**< GSA - GPS receiver operating mode, SVs used for navigation, and DOP values. */ GPGSV = 0x0004, /**< GSV - Number of SVs in view, PRN numbers, elevation, azimuth & SNR values. */ GPRMC = 0x0008, /**< RMC - Recommended Minimum Specific GPS/TRANSIT Data. */ GPVTG = 0x0010 /**< VTG - Actual track made good and speed over ground. */ }; /** * GGA packet information structure (Global Positioning System Fix Data) */ typedef struct _nmeaGPGGA { nmeaTIME utc; /**< UTC of position (just time) */ double lat; /**< Latitude in NDEG - [degree][min].[sec/60] */ char ns; /**< [N]orth or [S]outh */ double lon; /**< Longitude in NDEG - [degree][min].[sec/60] */ char ew; /**< [E]ast or [W]est */ int sig; /**< GPS quality indicator (0 = Invalid; 1 = Fix; 2 = Differential, 3 = Sensitive) */ int satinuse; /**< Number of satellites in use (not those in view) */ double HDOP; /**< Horizontal dilution of precision */ double elv; /**< Antenna altitude above/below mean sea level (geoid) */ char elv_units; /**< [M]eters (Antenna height unit) */ double diff; /**< Geoidal separation (Diff. between WGS-84 earth ellipsoid and mean sea level. '-' = geoid is below WGS-84 ellipsoid) */ char diff_units; /**< [M]eters (Units of geoidal separation) */ double dgps_age; /**< Time in seconds since last DGPS update */ int dgps_sid; /**< DGPS station ID number */ } nmeaGPGGA; /** * GSA packet information structure (Satellite status) */ typedef struct _nmeaGPGSA { char fix_mode; /**< Mode (M = Manual, forced to operate in 2D or 3D; A = Automatic, 3D/2D) */ int fix_type; /**< Type, used for navigation (1 = Fix not available; 2 = 2D; 3 = 3D) */ int sat_prn[NMEA_MAXSAT]; /**< PRNs of satellites used in position fix (null for unused fields) */ double PDOP; /**< Dilution of precision */ double HDOP; /**< Horizontal dilution of precision */ double VDOP; /**< Vertical dilution of precision */ } nmeaGPGSA; /** * GSV packet information structure (Satellites in view) */ typedef struct _nmeaGPGSV { int pack_count; /**< Total number of messages of this type in this cycle */ int pack_index; /**< Message number */ int sat_count; /**< Total number of satellites in view */ nmeaSATELLITE sat_data[NMEA_SATINPACK]; } nmeaGPGSV; /** * RMC packet information structure (Recommended Minimum sentence C) */ typedef struct _nmeaGPRMC { nmeaTIME utc; /**< UTC of position */ char status; /**< Status (A = active or V = void) */ double lat; /**< Latitude in NDEG - [degree][min].[sec/60] */ char ns; /**< [N]orth or [S]outh */ double lon; /**< Longitude in NDEG - [degree][min].[sec/60] */ char ew; /**< [E]ast or [W]est */ double speed; /**< Speed over the ground in knots */ double direction; /**< Track angle in degrees True */ double declination; /**< Magnetic variation degrees (Easterly var. subtracts from true course) */ char declin_ew; /**< [E]ast or [W]est */ char mode; /**< Mode indicator of fix type (A = autonomous, D = differential, E = estimated, N = not valid, S = simulator) */ } nmeaGPRMC; /** * VTG packet information structure (Track made good and ground speed) */ typedef struct _nmeaGPVTG { double dir; /**< True track made good (degrees) */ char dir_t; /**< Fixed text 'T' indicates that track made good is relative to true north */ double dec; /**< Magnetic track made good */ char dec_m; /**< Fixed text 'M' */ double spn; /**< Ground speed, knots */ char spn_n; /**< Fixed text 'N' indicates that speed over ground is in knots */ double spk; /**< Ground speed, kilometers per hour */ char spk_k; /**< Fixed text 'K' indicates that speed over ground is in kilometers/hour */ } nmeaGPVTG; void nmea_zero_INFO(nmeaINFO *info); void nmea_zero_GPGGA(nmeaGPGGA *pack); void nmea_zero_GPGSA(nmeaGPGSA *pack); void nmea_zero_GPGSV(nmeaGPGSV *pack); void nmea_zero_GPRMC(nmeaGPRMC *pack); void nmea_zero_GPVTG(nmeaGPVTG *pack); void nmea_time_now(nmeaTIME *t); int nmea_parse(char *buf, int len, nmeaINFO *info); #ifdef __cplusplus } #endif #endif /* __NMEA_INFO_H__ */