mirror of
https://github.com/qgis/QGIS.git
synced 2025-02-23 00:02:38 -05:00
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)
180 lines
6.6 KiB
C
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 */
|