QGIS/external/nmea/sentence.h
Nyall Dawson 41553459d8 [gps] Be tolerant to talker IDs which don't start with 'G'
From the nmea specifications it is clear that the talker ID
does not have to start with 'G'. Accordingly remove ALL these
incorrect hardcoded checks against (a very small subset) of
known talker IDs, and permit any two-character string
as a valid talker ID

Fixes connection to NMEA devices which use "IN" for
talker ID (and others)
2024-10-19 06:21:20 +10:00

180 lines
6.6 KiB
C

/*
*
* 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
{
char talkerId[2]; //!< Talker ID
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
{
char talkerId[2]; //!< Talker ID
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 talkerId[2]; //!< Talker ID
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
{
char talkerId[2]; //!< Talker ID
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
{
char talkerId[2]; //!< Talker ID
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)
char navstatus; //!< NMEA v4.1 - Navigation Status type (S = Safe, C = Caution, U = Unsafe, V = Navigational status not valid)
} nmeaGPRMC;
/**
* VTG packet information structure (Track made good and ground speed)
*/
typedef struct _nmeaGPVTG
{
char talkerId[2]; //!< Talker ID
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
{
char talkerId[2]; //!< Talker ID
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
{
char talkerId[2]; //!< Talker ID
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;
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 */