/*
 *
 * 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_SENTENCE_H
#define NMEA_SENTENCE_H

#include "info.h"

#ifdef  __cplusplus
extern "C"
{
#endif

/**
 * 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.
  GPGST   = 0x0012,   //!< GST - GPS Pseudorange Noise Statistics
  HCHDG   = 0x0020,   //!< HDG - Heading, Deviation and Variation
  HCHDT   = 0x0100,   //!< HDT - Heading reference to true north
};

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

/**
 * GST packet information structure (GPS Pseudorange Noise Statistics)
 */
typedef struct _nmeaGPGST
{
  nmeaTIME utc;       //!< UTC of position fix
  double  rms_pr;     //!< RMS value of the pseudorange residuals; Includes carrier phase residuals during periods of RTK (float) and RTK (fixed) processing
  double  err_major;  //!< Error ellipse semi-major axis 1 sigma error, in meters
  double  err_minor;  //!< Error ellipse semi-minor axis 1 sigma error, in meters
  double  err_ori;    //!< Error ellipse orientation, degrees from true north
  double  sig_lat;    //!< Latitude 1 sigma error, in meters
  double  sig_lon;    //!< Longitude 1 sigma error, in meters
  double  sig_alt;    //!< Height 1 sigma error, in meters

} nmeaGPGST;

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

/**
 * HDT packet information structure (Heading from True North)
 */
typedef struct _nmeaGPHDT
{
  double  heading;    //!< Heading in degrees
  char    t_flag;      //!< Fixed text 'T' indicates that heading is relative to true north

} nmeaGPHDT;

/**
 * HCHDG packet information structure (magnetic heading)
 */
typedef struct _nmeaHCHDG
{
  double mag_heading;   //!< Magnetic sensor heading (degrees)
  double mag_deviation; //!< Magnetic deviation (degrees)
  char ew_deviation;     //!< [E]ast or [W]est
  double mag_variation; //!< Magnetic variation (degrees)
  char ew_variation;    //!< [E]ast or [W]est
} nmeaHCHDG;

/**
 * HDT packet information structure (Heading, )
 */
typedef struct _nmeaHCHDT
{
  double direction;   //!< Heading respect to true north (degrees)
  char t_flag;    //!< Static text [T]
} nmeaHCHDT;

void nmea_zero_GPGGA( nmeaGPGGA *pack );
void nmea_zero_GPGST( nmeaGPGST *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 );

#ifdef  __cplusplus
}
#endif

#endif /* NMEA_SENTENCE_H */
