eive-obsw/bsp_mib/include/gps.h

2161 lines
80 KiB
C
Raw Normal View History

2022-08-18 19:04:49 +02:00
/* gps.h -- interface of the libgps library */
/*
* This file is Copyright (c) 2010 by the GPSD project
* BSD terms apply: see the file COPYING in the distribution root for details.
*/
#ifndef _GPSD_GPS_H_
#define _GPSD_GPS_H_
#ifdef __cplusplus
extern "C" {
#endif
#include <sys/types.h>
#include <sys/time.h>
#include <stdbool.h>
#include <inttypes.h> /* stdint.h would be smaller but not all have it */
#include <limits.h>
#include <time.h>
#include <signal.h>
#include <stdio.h>
#include <pthread.h> /* pacifies OpenBSD's compiler */
/*
* 4.1 - Base version for initial JSON protocol (Dec 2009, release 2.90)
* 4.2 - AIS application IDs split into DAC and FID (July 2010, release 2.95)
* 5.0 - MAXCHANNELS bumped from 20 to 32 for GLONASS (Mar 2011, release 2.96)
* gps_open() becomes reentrant, what gps_open_r() used to be.
* gps_poll() removed in favor of gps_read(). The raw hook is gone.
* (Aug 2011, release 3.0)
* 5.1 - GPS_PATH_MAX uses system PATH_MAX; split24 flag added. New
* model and serial members in part B of AIS type 24, conforming
* with ITU-R 1371-4. New timedrift structure (Nov 2013, release 3.10).
* 6.0 - AIS type 6 and 8 get 'structured' flag; GPS_PATH_MAX
* shortened because devices has moved out of the tail union. Sentence
* tag fields dropped from emitted JSON. The shape of the skyview
* structure has changed to make working with the satellites-used
* bits less confusing. (January 2015, release 3.12).
* 6.1 - Add navdata_t for more (nmea2000) info.
*/
#define GPSD_API_MAJOR_VERSION 6 /* bump on incompatible changes */
#define GPSD_API_MINOR_VERSION 1 /* bump on compatible changes */
#define MAXCHANNELS 72 /* must be > 12 GPS + 12 GLONASS + 2 WAAS */
#define MAXUSERDEVS 4 /* max devices per user */
#define GPS_PATH_MAX 128 /* for names like /dev/serial/by-id/... */
/*
* The structure describing an uncertainty volume in kinematic space.
* This is what GPSes are meant to produce; all the other info is
* technical impedimenta.
*
* All double values use NAN to indicate data not available.
*
* All the information in this structure was considered valid
* by the GPS at the time of update.
*
* Error estimates are at 95% confidence.
*/
/* WARNING! potential loss of precision in timestamp_t
* a double is 53 significant bits.
* UNIX time to nanoSec precision is 62 significant bits
* UNIX time to nanoSec precision after 2038 is 63 bits
* timestamp_t is only microSec precision
* timestamp_t and PPS do not play well together
*/
/* we want cm accuracy and 0.0000001 degrees is 1.11 cm at the equator
* the equator is best case for longitude. At 45lat cut that in half.
* at 85lat make it 0.00000001
*
* this easily fits in a C double which has 15.95 digits of precision
* printf() format %f defaults to %.6f, which will truncate the result.
* so print with %.7f if you have a survey grade GPS.
*
* ref: https://en.wikipedia.org/wiki/Decimal_degrees
*/
typedef double timestamp_t; /* Unix time in seconds with fractional part */
struct gps_fix_t {
timestamp_t time; /* Time of update */
int mode; /* Mode of fix */
#define MODE_NOT_SEEN 0 /* mode update not seen yet */
#define MODE_NO_FIX 1 /* none */
#define MODE_2D 2 /* good for latitude/longitude */
#define MODE_3D 3 /* good for altitude/climb too */
double ept; /* Expected time uncertainty */
double latitude; /* Latitude in degrees (valid if mode >= 2) */
double epy; /* Latitude position uncertainty, meters */
double longitude; /* Longitude in degrees (valid if mode >= 2) */
double epx; /* Longitude position uncertainty, meters */
double altitude; /* Altitude in meters (valid if mode == 3) */
double epv; /* Vertical position uncertainty, meters */
double track; /* Course made good (relative to true north) */
double epd; /* Track uncertainty, degrees */
double speed; /* Speed over ground, meters/sec */
double eps; /* Speed uncertainty, meters/sec */
double climb; /* Vertical speed, meters/sec */
double epc; /* Vertical speed uncertainty */
};
/*
* Satellite ID classes.
* According to IS-GPS-200 Revision H paragraph 6.3.6, and earlier revisions
* at least back to E, the upper bound of U.S. GPS PRNs is actually 64. However,
* NMEA0183 only allocates 1-32 for U.S. GPS IDs; it uses 33-64 for IDs ub the
* SBAS range.
*/
#define GPS_PRN(n) (((n) >= 1) && ((n) <= 32)) /* U.S. GPS satellite */
#define GBAS_PRN(n) ((n) >= 64 && ((n) <= 119)) /* Other GNSS (GLONASS) and Ground Based Augmentation System (eg WAAS)*/
#define SBAS_PRN(n) ((n) >= 120 && ((n) <= 158)) /* Satellite Based Augmentation System (eg GAGAN)*/
#define GNSS_PRN(n) ((n) >= 159 && ((n) <= 210)) /* other GNSS (eg BeiDou) */
/*
* GLONASS birds reuse GPS PRNs.
* It is an NMEA0183 convention to map them to pseudo-PRNs 65..96.
* (some other programs push them to 33 and above).
* The US GPS constellation plans to use the 33-63 range.
*/
#define GLONASS_PRN_OFFSET 64
/*
* The structure describing the pseudorange errors (GPGST)
*/
struct gst_t {
double utctime;
double rms_deviation;
double smajor_deviation;
double sminor_deviation;
double smajor_orientation;
double lat_err_deviation;
double lon_err_deviation;
double alt_err_deviation;
};
/*
* From the RCTM104 2.x standard:
*
* "The 30 bit words (as opposed to 32 bit words) coupled with a 50 Hz
* transmission rate provides a convenient timing capability where the
* times of word boundaries are a rational multiple of 0.6 seconds."
*
* "Each frame is N+2 words long, where N is the number of message data
* words. For example, a filler message (type 6 or 34) with no message
* data will have N=0, and will consist only of two header words. The
* maximum number of data words allowed by the format is 31, so that
* the longest possible message will have a total of 33 words."
*/
#define RTCM2_WORDS_MAX 33
#define MAXCORRECTIONS 18 /* max correction count in type 1 or 9 */
#define MAXSTATIONS 10 /* maximum stations in almanac, type 5 */
/* RTCM104 doesn't specify this, so give it the largest reasonable value */
#define MAXHEALTH (RTCM2_WORDS_MAX-2)
/*
* A nominally 30-bit word (24 bits of data, 6 bits of parity)
* used both in the GPS downlink protocol described in IS-GPS-200
* and in the format for DGPS corrections used in RTCM-104v2.
*/
typedef uint32_t isgps30bits_t;
/*
* Values for "system" fields. Note, the encoding logic is senstive to the
* actual values of these; it's not sufficient that they're distinct.
*/
#define NAVSYSTEM_GPS 0
#define NAVSYSTEM_GLONASS 1
#define NAVSYSTEM_GALILEO 2
#define NAVSYSTEM_UNKNOWN 3
struct rtcm2_t {
/* header contents */
unsigned type; /* RTCM message type */
unsigned length; /* length (words) */
double zcount; /* time within hour: GPS time, no leap secs */
unsigned refstaid; /* reference station ID */
unsigned seqnum; /* message sequence number (modulo 8) */
unsigned stathlth; /* station health */
/* message data in decoded form */
union {
struct {
unsigned int nentries;
struct gps_rangesat_t { /* data from messages 1 & 9 */
unsigned ident; /* satellite ID */
unsigned udre; /* user diff. range error */
unsigned iod; /* issue of data */
double prc; /* range error */
double rrc; /* range error rate */
} sat[MAXCORRECTIONS];
} gps_ranges;
struct { /* data for type 3 messages */
bool valid; /* is message well-formed? */
double x, y, z;
} ecef;
struct { /* data from type 4 messages */
bool valid; /* is message well-formed? */
int system;
int sense;
#define SENSE_INVALID 0
#define SENSE_GLOBAL 1
#define SENSE_LOCAL 2
char datum[6];
double dx, dy, dz;
} reference;
struct { /* data from type 5 messages */
unsigned int nentries;
struct consat_t {
unsigned ident; /* satellite ID */
bool iodl; /* issue of data */
unsigned int health; /* is satellite healthy? */
#define HEALTH_NORMAL (0) /* Radiobeacon operation normal */
#define HEALTH_UNMONITORED (1) /* No integrity monitor operating */
#define HEALTH_NOINFO (2) /* No information available */
#define HEALTH_DONOTUSE (3) /* Do not use this radiobeacon */
int snr; /* signal-to-noise ratio, dB */
#define SNR_BAD -1 /* not reported */
bool health_en; /* health enabled */
bool new_data; /* new data? */
bool los_warning; /* line-of-sight warning */
unsigned int tou; /* time to unhealth, seconds */
} sat[MAXHEALTH];
} conhealth;
struct { /* data from type 7 messages */
unsigned int nentries;
struct station_t {
double latitude, longitude; /* location */
unsigned int range; /* range in km */
double frequency; /* broadcast freq */
unsigned int health; /* station health */
unsigned int station_id; /* of the transmitter */
unsigned int bitrate; /* of station transmissions */
} station[MAXSTATIONS];
} almanac;
struct { /* data for type 13 messages */
bool status; /* expect a text message */
bool rangeflag; /* station range altered? */
double lat, lon; /* station longitude/latitude */
unsigned int range; /* transmission range in km */
} xmitter;
struct { /* data from type 14 messages */
unsigned int week; /* GPS week (0-1023) */
unsigned int hour; /* Hour in week (0-167) */
unsigned int leapsecs; /* Leap seconds (0-63) */
} gpstime;
struct {
unsigned int nentries;
struct glonass_rangesat_t { /* data from message type 31 */
unsigned ident; /* satellite ID */
unsigned udre; /* user diff. range error */
unsigned tod; /* issue of data */
bool change; /* ephemeris change bit */
double prc; /* range error */
double rrc; /* range error rate */
} sat[MAXCORRECTIONS];
} glonass_ranges;
/* data from type 16 messages */
char message[(RTCM2_WORDS_MAX-2) * sizeof(isgps30bits_t)];
/* data from messages of unknown type */
isgps30bits_t words[RTCM2_WORDS_MAX-2];
};
};
/* RTCM3 report structures begin here */
#define RTCM3_MAX_SATELLITES 64
#define RTCM3_MAX_DESCRIPTOR 31
#define RTCM3_MAX_ANNOUNCEMENTS 32
struct rtcm3_rtk_hdr { /* header data from 1001, 1002, 1003, 1004 */
/* Used for both GPS and GLONASS, but their timebases differ */
unsigned int station_id; /* Reference Station ID */
time_t tow; /* GPS Epoch Time (TOW) in ms,
or GLONASS Epoch Time in ms */
bool sync; /* Synchronous GNSS Message Flag */
unsigned short satcount; /* # Satellite Signals Processed */
bool smoothing; /* Divergence-free Smoothing Indicator */
unsigned int interval; /* Smoothing Interval */
};
struct rtcm3_basic_rtk {
unsigned char indicator; /* Indicator */
unsigned int channel; /* Satellite Frequency Channel Number
(GLONASS only) */
double pseudorange; /* Pseudorange */
double rangediff; /* PhaseRange - Pseudorange in meters */
unsigned char locktime; /* Lock time Indicator */
};
struct rtcm3_extended_rtk {
unsigned char indicator; /* Indicator */
unsigned int channel; /* Satellite Frequency Channel Number
(GLONASS only) */
double pseudorange; /* Pseudorange */
double rangediff; /* PhaseRange - L1 Pseudorange */
unsigned char locktime; /* Lock time Indicator */
unsigned char ambiguity; /* Integer Pseudorange
Modulus Ambiguity */
double CNR; /* Carrier-to-Noise Ratio */
};
struct rtcm3_network_rtk_header {
unsigned int network_id; /* Network ID */
unsigned int subnetwork_id; /* Subnetwork ID */
time_t time; /* GPS Epoch Time (TOW) in ms */
bool multimesg; /* GPS Multiple Message Indicator */
unsigned master_id; /* Master Reference Station ID */
unsigned aux_id; /* Auxilary Reference Station ID */
unsigned char satcount; /* count of GPS satellites */
};
struct rtcm3_correction_diff {
unsigned char ident; /* satellite ID */
enum {reserved, correct, widelane, uncertain} ambiguity;
unsigned char nonsync;
double geometric_diff; /* Geometric Carrier Phase
Correction Difference (1016, 1017) */
unsigned char iode; /* GPS IODE (1016, 1017) */
double ionospheric_diff; /* Ionospheric Carrier Phase
Correction Difference (1015, 1017) */
};
struct rtcm3_t {
/* header contents */
unsigned type; /* RTCM 3.x message type */
unsigned length; /* payload length, inclusive of checksum */
union {
/* 1001-1013 were present in the 3.0 version */
struct {
struct rtcm3_rtk_hdr header;
struct rtcm3_1001_t {
unsigned ident; /* Satellite ID */
struct rtcm3_basic_rtk L1;
} rtk_data[RTCM3_MAX_SATELLITES];
} rtcm3_1001;
struct {
struct rtcm3_rtk_hdr header;
struct rtcm3_1002_t {
unsigned ident; /* Satellite ID */
struct rtcm3_extended_rtk L1;
} rtk_data[RTCM3_MAX_SATELLITES];
} rtcm3_1002;
struct rtcm3_1003_t {
struct rtcm3_rtk_hdr header;
struct {
unsigned ident; /* Satellite ID */
struct rtcm3_basic_rtk L1;
struct rtcm3_basic_rtk L2;
} rtk_data[RTCM3_MAX_SATELLITES];
} rtcm3_1003;
struct rtcm3_1004_t {
struct rtcm3_rtk_hdr header;
struct {
unsigned ident; /* Satellite ID */
struct rtcm3_extended_rtk L1;
struct rtcm3_extended_rtk L2;
} rtk_data[RTCM3_MAX_SATELLITES];
} rtcm3_1004;
struct rtcm3_1005_t {
unsigned int station_id; /* Reference Station ID */
int system; /* Which system is it? */
bool reference_station; /* Reference-station indicator */
bool single_receiver; /* Single Receiver Oscillator */
double ecef_x, ecef_y, ecef_z; /* ECEF antenna location */
} rtcm3_1005;
struct rtcm3_1006_t {
unsigned int station_id; /* Reference Station ID */
int system; /* Which system is it? */
bool reference_station; /* Reference-station indicator */
bool single_receiver; /* Single Receiver Oscillator */
double ecef_x, ecef_y, ecef_z; /* ECEF antenna location */
double height; /* Antenna height */
} rtcm3_1006;
struct {
unsigned int station_id; /* Reference Station ID */
char descriptor[RTCM3_MAX_DESCRIPTOR+1]; /* Description string */
unsigned int setup_id;
} rtcm3_1007;
struct {
unsigned int station_id; /* Reference Station ID */
char descriptor[RTCM3_MAX_DESCRIPTOR+1]; /* Description string */
unsigned int setup_id;
char serial[RTCM3_MAX_DESCRIPTOR+1]; /* Serial # string */
} rtcm3_1008;
struct {
struct rtcm3_rtk_hdr header;
struct rtcm3_1009_t {
unsigned ident; /* Satellite ID */
struct rtcm3_basic_rtk L1;
} rtk_data[RTCM3_MAX_SATELLITES];
} rtcm3_1009;
struct {
struct rtcm3_rtk_hdr header;
struct rtcm3_1010_t {
unsigned ident; /* Satellite ID */
struct rtcm3_extended_rtk L1;
} rtk_data[RTCM3_MAX_SATELLITES];
} rtcm3_1010;
struct {
struct rtcm3_rtk_hdr header;
struct rtcm3_1011_t {
unsigned ident; /* Satellite ID */
struct rtcm3_extended_rtk L1;
struct rtcm3_extended_rtk L2;
} rtk_data[RTCM3_MAX_SATELLITES];
} rtcm3_1011;
struct {
struct rtcm3_rtk_hdr header;
struct rtcm3_1012_t {
unsigned ident; /* Satellite ID */
struct rtcm3_extended_rtk L1;
struct rtcm3_extended_rtk L2;
} rtk_data[RTCM3_MAX_SATELLITES];
} rtcm3_1012;
struct {
unsigned int station_id; /* Reference Station ID */
unsigned short mjd; /* Modified Julian Day (MJD) Number */
unsigned int sod; /* Seconds of Day (UTC) */
unsigned char leapsecs; /* Leap Seconds, GPS-UTC */
unsigned char ncount; /* Count of announcements to follow */
struct rtcm3_1013_t {
unsigned short id; /* message type ID */
bool sync;
unsigned short interval; /* interval in 0.1sec units */
} announcements[RTCM3_MAX_ANNOUNCEMENTS];
} rtcm3_1013;
/* 1014-1017 were added in the 3.1 version */
struct rtcm3_1014_t {
unsigned int network_id; /* Network ID */
unsigned int subnetwork_id; /* Subnetwork ID */
unsigned int stationcount; /* # auxiliary stations transmitted */
unsigned int master_id; /* Master Reference Station ID */
unsigned int aux_id; /* Auxilary Reference Station ID */
double d_lat, d_lon, d_alt; /* Aux-master location delta */
} rtcm3_1014;
struct rtcm3_1015_t {
struct rtcm3_network_rtk_header header;
struct rtcm3_correction_diff corrections[RTCM3_MAX_SATELLITES];
} rtcm3_1015;
struct rtcm3_1016_t {
struct rtcm3_network_rtk_header header;
struct rtcm3_correction_diff corrections[RTCM3_MAX_SATELLITES];
} rtcm3_1016;
struct rtcm3_1017_t {
struct rtcm3_network_rtk_header header;
struct rtcm3_correction_diff corrections[RTCM3_MAX_SATELLITES];
} rtcm3_1017;
/* 1018-1029 were in the 3.0 version */
struct rtcm3_1019_t {
unsigned int ident; /* Satellite ID */
unsigned int week; /* GPS Week Number */
unsigned char sv_accuracy; /* GPS SV ACCURACY */
enum {reserved_code, p, ca, l2c} code;
double idot;
unsigned char iode;
/* ephemeris fields, not scaled */
unsigned int t_sub_oc;
signed int a_sub_f2;
signed int a_sub_f1;
signed int a_sub_f0;
unsigned int iodc;
signed int C_sub_rs;
signed int delta_sub_n;
signed int M_sub_0;
signed int C_sub_uc;
unsigned int e;
signed int C_sub_us;
unsigned int sqrt_sub_A;
unsigned int t_sub_oe;
signed int C_sub_ic;
signed int OMEGA_sub_0;
signed int C_sub_is;
signed int i_sub_0;
signed int C_sub_rc;
signed int argument_of_perigee;
signed int omegadot;
signed int t_sub_GD;
unsigned char sv_health;
bool p_data;
bool fit_interval;
} rtcm3_1019;
struct rtcm3_1020_t {
unsigned int ident; /* Satellite ID */
unsigned short channel; /* Satellite Frequency Channel Number */
/* ephemeris fields, not scaled */
bool C_sub_n;
bool health_avAilability_indicator;
unsigned char P1;
unsigned short t_sub_k;
bool msb_of_B_sub_n;
bool P2;
bool t_sub_b;
signed int x_sub_n_t_of_t_sub_b_prime;
signed int x_sub_n_t_of_t_sub_b;
signed int x_sub_n_t_of_t_sub_b_prime_prime;
signed int y_sub_n_t_of_t_sub_b_prime;
signed int y_sub_n_t_of_t_sub_b;
signed int y_sub_n_t_of_t_sub_b_prime_prime;
signed int z_sub_n_t_of_t_sub_b_prime;
signed int z_sub_n_t_of_t_sub_b;
signed int z_sub_n_t_of_t_sub_b_prime_prime;
bool P3;
signed int gamma_sub_n_of_t_sub_b;
unsigned char MP;
bool Ml_n;
signed int tau_n_of_t_sub_b;
signed int M_delta_tau_sub_n;
unsigned int E_sub_n;
bool MP4;
unsigned char MF_sub_T;
unsigned char MN_sub_T;
unsigned char MM;
bool additioinal_data_availability;
unsigned int N_sup_A;
unsigned int tau_sub_c;
unsigned int M_N_sub_4;
signed int M_tau_sub_GPS;
bool M_l_sub_n;
} rtcm3_1020;
struct rtcm3_1029_t {
unsigned int station_id; /* Reference Station ID */
unsigned short mjd; /* Modified Julian Day (MJD) Number */
unsigned int sod; /* Seconds of Day (UTC) */
size_t len; /* # chars to follow */
size_t unicode_units; /* # Unicode units in text */
unsigned char text[128];
} rtcm3_1029;
struct rtcm3_1033_t {
unsigned int station_id; /* Reference Station ID */
char descriptor[RTCM3_MAX_DESCRIPTOR+1]; /* Description string */
unsigned int setup_id;
char serial[RTCM3_MAX_DESCRIPTOR+1]; /* Serial # string */
char receiver[RTCM3_MAX_DESCRIPTOR+1]; /* Receiver string */
char firmware[RTCM3_MAX_DESCRIPTOR+1]; /* Firmware string */
} rtcm3_1033;
unsigned char data[1024]; /* Max RTCM3 msg length is 1023 bytes */
} rtcmtypes;
};
/* RTCM3 scaling constants */
#define GPS_AMBIGUITY_MODULUS 299792.458 /* 1004, DF014*/
#define GLONASS_AMBIGUITY_MODULUS 599584.916 /* 1012, DF044 */
#define MESSAGE_INTERVAL_UNITS 0.1 /* 1013, DF047 */
/*
* Raw IS_GPS subframe data
*/
/* The almanac is a subset of the clock and ephemeris data, with reduced
* precision. See IS-GPS-200E, Table 20-VI */
struct almanac_t
{
uint8_t sv; /* The satellite this refers to */
/* toa, almanac reference time, 8 bits unsigned, seconds */
uint8_t toa;
long l_toa;
/* SV health data, 8 bit unsigned bit map */
uint8_t svh;
/* deltai, correction to inclination, 16 bits signed, semi-circles */
int16_t deltai;
double d_deltai;
/* M0, Mean Anomaly at Reference Time, 24 bits signed, semi-circles */
int32_t M0;
double d_M0;
/* Omega0, Longitude of Ascending Node of Orbit Plane at Weekly Epoch,
* 24 bits signed, semi-circles */
int32_t Omega0;
double d_Omega0;
/* omega, Argument of Perigee, 24 bits signed, semi-circles */
int32_t omega;
double d_omega;
/* af0, SV clock correction constant term
* 11 bits signed, seconds */
int16_t af0;
double d_af0;
/* af1, SV clock correction first order term
* 11 bits signed, seconds/second */
int16_t af1;
double d_af1;
/* eccentricity, 16 bits, unsigned, dimensionless */
uint16_t e;
double d_eccentricity;
/* sqrt A, Square Root of the Semi-Major Axis
* 24 bits unsigned, square_root(meters) */
uint32_t sqrtA;
double d_sqrtA;
/* Omega dot, Rate of Right Ascension, 16 bits signed, semi-circles/sec */
int16_t Omegad;
double d_Omegad;
};
struct subframe_t {
/* subframe number, 3 bits, unsigned, 1 to 5 */
uint8_t subframe_num;
/* data_id, denotes the NAV data structure of D(t), 2 bits, in
* IS-GPS-200E always == 0x1 */
uint8_t data_id;
/* SV/page id used for subframes 4 & 5, 6 bits */
uint8_t pageid;
/* tSVID, SV ID of the sat that transmitted this frame, 6 bits unsigned */
uint8_t tSVID;
/* TOW, Time of Week of NEXT message, 17 bits unsigned, scale 6, seconds */
uint32_t TOW17;
long l_TOW17;
/* integrity, URA bounds flag, 1 bit */
bool integrity;
/* alert, alert flag, SV URA and/or the SV User Differential Range
* Accuracy (UDRA) may be worse than indicated, 1 bit */
bool alert;
/* antispoof, A-S mode is ON in that SV, 1 bit */
bool antispoof;
int is_almanac;
union {
/* subframe 1, part of ephemeris, see IS-GPS-200E, Table 20-II
* and Table 20-I */
struct {
/* WN, Week Number, 10 bits unsigned, scale 1, weeks */
uint16_t WN;
/* IODC, Issue of Data, Clock, 10 bits, unsigned,
* issued in 8 data ranges at the same time */
uint16_t IODC;
/* toc, clock data reference time, 16 bits, unsigned, seconds
* scale 2**4, issued in 8 data ranges at the same time */
uint16_t toc;
long l_toc;
/* l2, code on L2, 2 bits, bit map */
uint8_t l2;
/* l2p, L2 P data flag, 1 bit */
uint8_t l2p;
/* ura, SV accuracy, 4 bits unsigned index */
unsigned int ura;
/* hlth, SV health, 6 bits unsigned bitmap */
unsigned int hlth;
/* af0, SV clock correction constant term
* 22 bits signed, scale 2**-31, seconds */
int32_t af0;
double d_af0;
/* af1, SV clock correction first order term
* 22 bits signed, scale 2**-43, seconds/second */
int16_t af1;
double d_af1;
/* af2, SV clock correction second order term
* 8 bits signed, scale 2**-55, seconds/second**2 */
int8_t af2;
double d_af2;
/* Tgd, L1-L2 correction term, 8 bits signed, scale 2**-31,
* seconds */
int8_t Tgd;
double d_Tgd;
} sub1;
/* subframe 2, part of ephemeris, see IS-GPS-200E, Table 20-II
* and Table 20-III */
struct {
/* Issue of Data (Ephemeris),
* equal to the 8 LSBs of the 10 bit IODC of the same data set */
uint8_t IODE;
/* Age of Data Offset for the NMCT, 6 bits, scale 900,
* ignore if all ones, seconds */
uint8_t AODO;
uint16_t u_AODO;
/* fit, FIT interval flag, indicates a fit interval greater than
* 4 hour, 1 bit */
uint8_t fit;
/* toe, Reference Time Ephemeris, 16 bits unsigned, scale 2**4,
* seconds */
uint16_t toe;
long l_toe;
/* Crs, Amplitude of the Sine Harmonic Correction Term to the
* Orbit Radius, 16 bits, scale 2**-5, signed, meters */
int16_t Crs;
double d_Crs;
/* Cus, Amplitude of the Sine Harmonic Correction Term to the
* Argument of Latitude, 16 bits, signed, scale 2**-29, radians */
int16_t Cus;
double d_Cus;
/* Cuc, Amplitude of the Cosine Harmonic Correction Term to the
* Argument of Latitude, 16 bits, signed, scale 2**-29, radians */
int16_t Cuc;
double d_Cuc;
/* deltan, Mean Motion Difference From Computed Value
* Mean Motion Difference From Computed Value
* 16 bits, signed, scale 2**-43, semi-circles/sec */
int16_t deltan;
double d_deltan;
/* M0, Mean Anomaly at Reference Time, 32 bits signed,
* scale 2**-31, semi-circles */
int32_t M0;
double d_M0;
/* eccentricity, 32 bits, unsigned, scale 2**-33, dimensionless */
uint32_t e;
double d_eccentricity;
/* sqrt A, Square Root of the Semi-Major Axis
* 32 bits unsigned, scale 2**-19, square_root(meters) */
uint32_t sqrtA;
double d_sqrtA;
} sub2;
/* subframe 3, part of ephemeris, see IS-GPS-200E, Table 20-II,
* Table 20-III */
struct {
/* Issue of Data (Ephemeris), 8 bits, unsigned
* equal to the 8 LSBs of the 10 bit IODC of the same data set */
uint8_t IODE;
/* Rate of Inclination Angle, 14 bits signed, scale2**-43,
* semi-circles/sec */
int16_t IDOT;
double d_IDOT;
/* Cic, Amplitude of the Cosine Harmonic Correction Term to the
* Angle of Inclination, 16 bits signed, scale 2**-29, radians*/
int16_t Cic;
double d_Cic;
/* Cis, Amplitude of the Sine Harmonic Correction Term to the
* Angle of Inclination, 16 bits, unsigned, scale 2**-29, radians */
int16_t Cis;
double d_Cis;
/* Crc, Amplitude of the Cosine Harmonic Correction Term to the
* Orbit Radius, 16 bits signed, scale 2**-5, meters */
int16_t Crc;
double d_Crc;
/* i0, Inclination Angle at Reference Time, 32 bits, signed,
* scale 2**-31, semi-circles */
int32_t i0;
double d_i0;
/* Omega0, Longitude of Ascending Node of Orbit Plane at Weekly
* Epoch, 32 bits signed, semi-circles */
int32_t Omega0;
double d_Omega0;
/* omega, Argument of Perigee, 32 bits signed, scale 2**-31,
* semi-circles */
int32_t omega;
double d_omega;
/* Omega dot, Rate of Right Ascension, 24 bits signed,
* scale 2**-43, semi-circles/sec */
int32_t Omegad;
double d_Omegad;
} sub3;
struct {
struct almanac_t almanac;
} sub4;
/* subframe 4, page 13 */
struct {
/* mapping ord ERD# to SV # is non trivial
* leave it alone. See IS-GPS-200E Section 20.3.3.5.1.9 */
/* Estimated Range Deviation, 6 bits signed, meters */
char ERD[33];
/* ai, Availability Indicator, 2bits, bit map */
unsigned char ai;
} sub4_13;
/* subframe 4, page 17, system message, 23 chars, plus nul */
struct {
char str[24];
} sub4_17;
/* subframe 4, page 18 */
struct {
/* ionospheric and UTC data */
/* A0, Bias coefficient of GPS time scale relative to UTC time
* scale, 32 bits signed, scale 2**-30, seconds */
int32_t A0;
double d_A0;
/* A1, Drift coefficient of GPS time scale relative to UTC time
* scale, 24 bits signed, scale 2**-50, seconds/second */
int32_t A1;
double d_A1;
/* alphaX, the four coefficients of a cubic equation representing
* the amplitude of the vertical delay */
/* alpha0, 8 bits signed, scale w**-30, seconds */
int8_t alpha0;
double d_alpha0;
/* alpha1, 8 bits signed, scale w**-27, seconds/semi-circle */
int8_t alpha1;
double d_alpha1;
/* alpha2, 8 bits signed, scale w**-24, seconds/semi-circle**2 */
int8_t alpha2;
double d_alpha2;
/* alpha3, 8 bits signed, scale w**-24, seconds/semi-circle**3 */
int8_t alpha3;
double d_alpha3;
/* betaX, the four coefficients of a cubic equation representing
* the period of the model */
/* beta0, 8 bits signed, scale w**11, seconds */
int8_t beta0;
double d_beta0;
/* beta1, 8 bits signed, scale w**14, seconds/semi-circle */
int8_t beta1;
double d_beta1;
/* beta2, 8 bits signed, scale w**16, seconds/semi-circle**2 */
int8_t beta2;
double d_beta2;
/* beta3, 8 bits signed, scale w**16, seconds/semi-circle**3 */
int8_t beta3;
double d_beta3;
/* leap (delta t ls), current leap second, 8 bits signed,
* scale 1, seconds */
int8_t leap;
/* lsf (delta t lsf), future leap second, 8 bits signed,
* scale 1, seconds */
int8_t lsf;
/* tot, reference time for UTC data,
* 8 bits unsigned, scale 2**12, seconds */
uint8_t tot;
double d_tot;
/* WNt, UTC reference week number, 8 bits unsigned, scale 1,
* weeks */
uint8_t WNt;
/* WNlsf, Leap second reference Week Number,
* 8 bits unsigned, scale 1, weeks */
uint8_t WNlsf;
/* DN, Leap second reference Day Number , 8 bits unsigned,
* scale 1, days */
uint8_t DN;
} sub4_18;
/* subframe 4, page 25 */
struct {
/* svf, A-S status and the configuration code of each SV
* 4 bits unsigned, bitmap */
unsigned char svf[33];
/* svh, SV health data for SV 25 through 32
* 6 bits unsigned bitmap */
uint8_t svhx[8];
} sub4_25;
struct {
struct almanac_t almanac;
} sub5;
struct {
/* toa, Almanac reference Time, 8 bits unsigned, scale 2**12,
* seconds */
uint8_t toa;
long l_toa;
/* WNa, Week Number almanac, 8 bits, scale 2, GPS Week
* Number % 256 */
uint8_t WNa;
/* sv, SV health status, 6 bits, bitmap */
uint8_t sv[25];
} sub5_25;
};
};
typedef uint64_t gps_mask_t;
/*
* Is an MMSI number that of an auxiliary associated with a mother ship?
* We need to be able to test this for decoding AIS Type 24 messages.
* According to <http://www.navcen.uscg.gov/marcomms/gmdss/mmsi.htm#format>,
* auxiliary-craft MMSIs have the form 98MIDXXXX, where MID is a country
* code and XXXX the vessel ID.
*/
#define AIS_AUXILIARY_MMSI(n) ((n) / 10000000 == 98)
/* N/A values and scaling constant for 25/24 bit lon/lat pairs */
#define AIS_LON3_NOT_AVAILABLE 181000
#define AIS_LAT3_NOT_AVAILABLE 91000
#define AIS_LATLON3_DIV 60000.0
/* N/A values and scaling constant for 28/27 bit lon/lat pairs */
#define AIS_LON4_NOT_AVAILABLE 1810000
#define AIS_LAT4_NOT_AVAILABLE 910000
#define AIS_LATLON4_DIV 600000.0
struct route_info {
unsigned int linkage; /* Message Linkage ID */
unsigned int sender; /* Sender Class */
unsigned int rtype; /* Route Type */
unsigned int month; /* Start month */
unsigned int day; /* Start day */
unsigned int hour; /* Start hour */
unsigned int minute; /* Start minute */
unsigned int duration; /* Duration */
int waycount; /* Waypoint count */
struct waypoint_t {
signed int lon; /* Longitude */
signed int lat; /* Latitude */
} waypoints[16];
};
struct ais_t
{
unsigned int type; /* message type */
unsigned int repeat; /* Repeat indicator */
unsigned int mmsi; /* MMSI */
union {
/* Types 1-3 Common navigation info */
struct {
unsigned int status; /* navigation status */
signed turn; /* rate of turn */
#define AIS_TURN_HARD_LEFT -127
#define AIS_TURN_HARD_RIGHT 127
#define AIS_TURN_NOT_AVAILABLE 128
unsigned int speed; /* speed over ground in deciknots */
#define AIS_SPEED_NOT_AVAILABLE 1023
#define AIS_SPEED_FAST_MOVER 1022 /* >= 102.2 knots */
bool accuracy; /* position accuracy */
#define AIS_LATLON_DIV 600000.0
int lon; /* longitude */
#define AIS_LON_NOT_AVAILABLE 0x6791AC0
int lat; /* latitude */
#define AIS_LAT_NOT_AVAILABLE 0x3412140
unsigned int course; /* course over ground */
#define AIS_COURSE_NOT_AVAILABLE 3600
unsigned int heading; /* true heading */
#define AIS_HEADING_NOT_AVAILABLE 511
unsigned int second; /* seconds of UTC timestamp */
#define AIS_SEC_NOT_AVAILABLE 60
#define AIS_SEC_MANUAL 61
#define AIS_SEC_ESTIMATED 62
#define AIS_SEC_INOPERATIVE 63
unsigned int maneuver; /* maneuver indicator */
//unsigned int spare; spare bits */
bool raim; /* RAIM flag */
unsigned int radio; /* radio status bits */
} type1;
/* Type 4 - Base Station Report & Type 11 - UTC and Date Response */
struct {
unsigned int year; /* UTC year */
#define AIS_YEAR_NOT_AVAILABLE 0
unsigned int month; /* UTC month */
#define AIS_MONTH_NOT_AVAILABLE 0
unsigned int day; /* UTC day */
#define AIS_DAY_NOT_AVAILABLE 0
unsigned int hour; /* UTC hour */
#define AIS_HOUR_NOT_AVAILABLE 24
unsigned int minute; /* UTC minute */
#define AIS_MINUTE_NOT_AVAILABLE 60
unsigned int second; /* UTC second */
#define AIS_SECOND_NOT_AVAILABLE 60
bool accuracy; /* fix quality */
int lon; /* longitude */
int lat; /* latitude */
unsigned int epfd; /* type of position fix device */
//unsigned int spare; spare bits */
bool raim; /* RAIM flag */
unsigned int radio; /* radio status bits */
} type4;
/* Type 5 - Ship static and voyage related data */
struct {
unsigned int ais_version; /* AIS version level */
unsigned int imo; /* IMO identification */
// cppcheck-suppress arrayIndexOutOfBounds
char callsign[7+1]; /* callsign */
#define AIS_SHIPNAME_MAXLEN 20
// cppcheck-suppress arrayIndexOutOfBounds
char shipname[AIS_SHIPNAME_MAXLEN+1]; /* vessel name */
unsigned int shiptype; /* ship type code */
unsigned int to_bow; /* dimension to bow */
unsigned int to_stern; /* dimension to stern */
unsigned int to_port; /* dimension to port */
unsigned int to_starboard; /* dimension to starboard */
unsigned int epfd; /* type of position fix deviuce */
unsigned int month; /* UTC month */
unsigned int day; /* UTC day */
unsigned int hour; /* UTC hour */
unsigned int minute; /* UTC minute */
unsigned int draught; /* draft in meters */
char destination[20+1]; /* ship destination */
unsigned int dte; /* data terminal enable */
//unsigned int spare; spare bits */
} type5;
/* Type 6 - Addressed Binary Message */
struct {
unsigned int seqno; /* sequence number */
unsigned int dest_mmsi; /* destination MMSI */
bool retransmit; /* retransmit flag */
//unsigned int spare; spare bit(s) */
unsigned int dac; /* Application ID */
unsigned int fid; /* Functional ID */
bool structured; /* True match for DAC/FID? */
#define AIS_TYPE6_BINARY_MAX 920 /* 920 bits */
size_t bitcount; /* bit count of the data */
union {
// cppcheck-suppress arrayIndexOutOfBounds
char bitdata[(AIS_TYPE6_BINARY_MAX + 7) / 8];
/* Inland AIS - ETA at lock/bridge/terminal */
struct {
char country[2+1]; /* UN Country Code */
char locode[3+1]; /* UN/LOCODE */
char section[5+1]; /* Fairway section */
char terminal[5+1]; /* Terminal code */
char hectometre[5+1]; /* Fairway hectometre */
unsigned int month; /* ETA month */
unsigned int day; /* ETA day */
unsigned int hour; /* ETA hour */
unsigned int minute; /* ETA minute */
unsigned int tugs; /* Assisting Tugs */
unsigned int airdraught; /* Air Draught */
} dac200fid21;
/* Inland AIS - ETA at lock/bridge/terminal */
struct {
char country[2+1]; /* UN Country Code */
char locode[3+1]; /* UN/LOCODE */
char section[5+1]; /* Fairway section */
char terminal[5+1]; /* Terminal code */
char hectometre[5+1]; /* Fairway hectometre */
unsigned int month; /* RTA month */
unsigned int day; /* RTA day */
unsigned int hour; /* RTA hour */
unsigned int minute; /* RTA minute */
unsigned int status; /* Status */
#define DAC200FID22_STATUS_OPERATIONAL 0
#define DAC200FID22_STATUS_LIMITED 1
#define DAC200FID22_STATUS_OUT_OF_ORDER 2
#define DAC200FID22_STATUS_NOT_AVAILABLE 0
} dac200fid22;
/* Inland AIS - Number of persons on board */
struct {
unsigned int crew; /* # crew on board */
unsigned int passengers; /* # passengers on board */
unsigned int personnel; /* # personnel on board */
#define DAC200FID55_COUNT_NOT_AVAILABLE 255
} dac200fid55;
/* GLA - AtoN monitoring data (UK/ROI) */
struct {
unsigned int ana_int; /* Analogue (internal) */
unsigned int ana_ext1; /* Analogue (external #1) */
unsigned int ana_ext2; /* Analogue (external #2) */
unsigned int racon; /* RACON status */
unsigned int light; /* Light status */
bool alarm; /* Health alarm*/
unsigned int stat_ext; /* Status bits (external) */
bool off_pos; /* Off position status */
} dac235fid10;
/* IMO236 - Dangerous Cargo Indication */
struct {
char lastport[5+1]; /* Last Port Of Call */
unsigned int lmonth; /* ETA month */
unsigned int lday; /* ETA day */
unsigned int lhour; /* ETA hour */
unsigned int lminute; /* ETA minute */
char nextport[5+1]; /* Next Port Of Call */
unsigned int nmonth; /* ETA month */
unsigned int nday; /* ETA day */
unsigned int nhour; /* ETA hour */
unsigned int nminute; /* ETA minute */
char dangerous[20+1]; /* Main Dangerous Good */
char imdcat[4+1]; /* IMD Category */
unsigned int unid; /* UN Number */
unsigned int amount; /* Amount of Cargo */
unsigned int unit; /* Unit of Quantity */
} dac1fid12;
/* IMO236 - Extended Ship Static and Voyage Related Data */
struct {
unsigned int airdraught; /* Air Draught */
} dac1fid15;
/* IMO236 - Number of Persons on board */
struct {
unsigned persons; /* number of persons */
} dac1fid16;
/* IMO289 - Clearance Time To Enter Port */
struct {
unsigned int linkage; /* Message Linkage ID */
unsigned int month; /* Month (UTC) */
unsigned int day; /* Day (UTC) */
unsigned int hour; /* Hour (UTC) */
unsigned int minute; /* Minute (UTC) */
char portname[20+1]; /* Name of Port & Berth */
char destination[5+1]; /* Destination */
signed int lon; /* Longitude */
signed int lat; /* Latitude */
} dac1fid18;
/* IMO289 - Berthing Data (addressed) */
struct {
unsigned int linkage; /* Message Linkage ID */
unsigned int berth_length; /* Berth length */
unsigned int berth_depth; /* Berth Water Depth */
unsigned int position; /* Mooring Position */
unsigned int month; /* Month (UTC) */
unsigned int day; /* Day (UTC) */
unsigned int hour; /* Hour (UTC) */
unsigned int minute; /* Minute (UTC) */
unsigned int availability; /* Services Availability */
unsigned int agent; /* Agent */
unsigned int fuel; /* Bunker/fuel */
unsigned int chandler; /* Chandler */
unsigned int stevedore; /* Stevedore */
unsigned int electrical; /* Electrical */
unsigned int water; /* Potable water */
unsigned int customs; /* Customs house */
unsigned int cartage; /* Cartage */
unsigned int crane; /* Crane(s) */
unsigned int lift; /* Lift(s) */
unsigned int medical; /* Medical facilities */
unsigned int navrepair; /* Navigation repair */
unsigned int provisions; /* Provisions */
unsigned int shiprepair; /* Ship repair */
unsigned int surveyor; /* Surveyor */
unsigned int steam; /* Steam */
unsigned int tugs; /* Tugs */
unsigned int solidwaste; /* Waste disposal (solid) */
unsigned int liquidwaste; /* Waste disposal (liquid) */
unsigned int hazardouswaste; /* Waste disposal (hazardous) */
unsigned int ballast; /* Reserved ballast exchange */
unsigned int additional; /* Additional services */
unsigned int regional1; /* Regional reserved 1 */
unsigned int regional2; /* Regional reserved 2 */
unsigned int future1; /* Reserved for future */
unsigned int future2; /* Reserved for future */
char berth_name[20+1]; /* Name of Berth */
signed int berth_lon; /* Longitude */
signed int berth_lat; /* Latitude */
} dac1fid20;
/* IMO289 - Weather observation report from ship */
/*** WORK IN PROGRESS - NOT YET DECODED ***/
struct {
bool wmo; /* true if WMO variant */
union {
struct {
char location[20+1]; /* Location */
signed int lon; /* Longitude */
signed int lat; /* Latitude */
unsigned int day; /* Report day */
unsigned int hour; /* Report hour */
unsigned int minute; /* Report minute */
bool vislimit; /* Max range? */
unsigned int visibility; /* Units of 0.1 nm */
#define DAC1FID21_VISIBILITY_NOT_AVAILABLE 127
#define DAC1FID21_VISIBILITY_SCALE 10.0
unsigned humidity; /* units of 1% */
unsigned int wspeed; /* average wind speed */
unsigned int wgust; /* wind gust */
#define DAC1FID21_WSPEED_NOT_AVAILABLE 127
unsigned int wdir; /* wind direction */
#define DAC1FID21_WDIR_NOT_AVAILABLE 360
unsigned int pressure; /* air pressure, hpa */
#define DAC1FID21_NONWMO_PRESSURE_NOT_AVAILABLE 403
#define DAC1FID21_NONWMO_PRESSURE_HIGH 402 /* > 1200hPa */
#define DAC1FID21_NONWMO_PRESSURE_OFFSET 400 /* N/A */
unsigned int pressuretend; /* tendency */
int airtemp; /* temp, units 0.1C */
#define DAC1FID21_AIRTEMP_NOT_AVAILABLE -1024
#define DAC1FID21_AIRTEMP_SCALE 10.0
unsigned int watertemp; /* units 0.1degC */
#define DAC1FID21_WATERTEMP_NOT_AVAILABLE 501
#define DAC1FID21_WATERTEMP_SCALE 10.0
unsigned int waveperiod; /* in seconds */
#define DAC1FID21_WAVEPERIOD_NOT_AVAILABLE 63
unsigned int wavedir; /* direction in deg */
#define DAC1FID21_WAVEDIR_NOT_AVAILABLE 360
unsigned int swellheight; /* in decimeters */
unsigned int swellperiod; /* in seconds */
unsigned int swelldir; /* direction in deg */
} nonwmo_obs;
struct {
signed int lon; /* Longitude */
signed int lat; /* Latitude */
unsigned int month; /* UTC month */
unsigned int day; /* Report day */
unsigned int hour; /* Report hour */
unsigned int minute; /* Report minute */
unsigned int course; /* course over ground */
unsigned int speed; /* speed, m/s */
#define DAC1FID21_SOG_NOT_AVAILABLE 31
#define DAC1FID21_SOG_HIGH_SPEED 30
#define DAC1FID21_SOG_SCALE 2.0
unsigned int heading; /* true heading */
#define DAC1FID21_HDG_NOT_AVAILABLE 127
#define DAC1FID21_HDG_SCALE 5.0
unsigned int pressure; /* units of hPa * 0.1 */
#define DAC1FID21_WMO_PRESSURE_SCALE 10
#define DAC1FID21_WMO_PRESSURE_OFFSET 90.0
unsigned int pdelta; /* units of hPa * 0.1 */
#define DAC1FID21_PDELTA_SCALE 10
#define DAC1FID21_PDELTA_OFFSET 50.0
unsigned int ptend; /* enumerated */
unsigned int twinddir; /* in 5 degree steps */
#define DAC1FID21_TWINDDIR_NOT_AVAILABLE 127
unsigned int twindspeed; /* meters per second */
#define DAC1FID21_TWINDSPEED_SCALE 2
#define DAC1FID21_RWINDSPEED_NOT_AVAILABLE 255
unsigned int rwinddir; /* in 5 degree steps */
#define DAC1FID21_RWINDDIR_NOT_AVAILABLE 127
unsigned int rwindspeed; /* meters per second */
#define DAC1FID21_RWINDSPEED_SCALE 2
#define DAC1FID21_RWINDSPEED_NOT_AVAILABLE 255
unsigned int mgustspeed; /* meters per second */
#define DAC1FID21_MGUSTSPEED_SCALE 2
#define DAC1FID21_MGUSTSPEED_NOT_AVAILABLE 255
unsigned int mgustdir; /* in 5 degree steps */
#define DAC1FID21_MGUSTDIR_NOT_AVAILABLE 127
unsigned int airtemp; /* degress K */
#define DAC1FID21_AIRTEMP_OFFSET 223
unsigned humidity; /* units of 1% */
#define DAC1FID21_HUMIDITY_NOT_VAILABLE 127
/* some trailing fields are missing */
} wmo_obs;
};
} dac1fid21;
/*** WORK IN PROGRESS ENDS HERE ***/
/* IMO289 - Dangerous Cargo Indication */
struct {
unsigned int unit; /* Unit of Quantity */
unsigned int amount; /* Amount of Cargo */
int ncargos;
struct cargo_t {
unsigned int code; /* Cargo code */
unsigned int subtype; /* Cargo subtype */
} cargos[28];
} dac1fid25;
/* IMO289 - Route info (addressed) */
struct route_info dac1fid28;
/* IMO289 - Text message (addressed) */
struct {
unsigned int linkage;
#define AIS_DAC1FID30_TEXT_MAX 154 /* 920 bits of six-bit, plus NUL */
char text[AIS_DAC1FID30_TEXT_MAX];
} dac1fid30;
/* IMO289 & IMO236 - Tidal Window */
struct {
unsigned int month; /* Month */
unsigned int day; /* Day */
signed int ntidals;
struct tidal_t {
signed int lon; /* Longitude */
signed int lat; /* Latitude */
unsigned int from_hour; /* From UTC Hour */
unsigned int from_min; /* From UTC Minute */
unsigned int to_hour; /* To UTC Hour */
unsigned int to_min; /* To UTC Minute */
#define DAC1FID32_CDIR_NOT_AVAILABLE 360
unsigned int cdir; /* Current Dir. Predicted */
#define DAC1FID32_CSPEED_NOT_AVAILABLE 127
unsigned int cspeed; /* Current Speed Predicted */
} tidals[3];
} dac1fid32;
};
} type6;
/* Type 7 - Binary Acknowledge */
struct {
unsigned int mmsi1;
unsigned int mmsi2;
unsigned int mmsi3;
unsigned int mmsi4;
/* spares ignored, they're only padding here */
} type7;
/* Type 8 - Broadcast Binary Message */
struct {
unsigned int dac; /* Designated Area Code */
unsigned int fid; /* Functional ID */
#define AIS_TYPE8_BINARY_MAX 952 /* 952 bits */
size_t bitcount; /* bit count of the data */
bool structured; /* True match for DAC/FID? */
union {
// cppcheck-suppress arrayIndexOutOfBounds
char bitdata[(AIS_TYPE8_BINARY_MAX + 7) / 8];
/* Inland static ship and voyage-related data */
struct {
char vin[8+1]; /* European Vessel ID */
unsigned int length; /* Length of ship */
unsigned int beam; /* Beam of ship */
unsigned int shiptype; /* Ship/combination type */
unsigned int hazard; /* Hazardous cargo */
#define DAC200FID10_HAZARD_MAX 5
unsigned int draught; /* Draught */
unsigned int loaded; /* Loaded/Unloaded */
bool speed_q; /* Speed inf. quality */
bool course_q; /* Course inf. quality */
bool heading_q; /* Heading inf. quality */
} dac200fid10;
/* Inland AIS EMMA Warning */
struct {
unsigned int start_year; /* Start Year */
unsigned int start_month; /* Start Month */
unsigned int start_day; /* Start Day */
unsigned int end_year; /* End Year */
unsigned int end_month; /* End Month */
unsigned int end_day; /* End Day */
unsigned int start_hour; /* Start Hour */
unsigned int start_minute; /* Start Minute */
unsigned int end_hour; /* End Hour */
unsigned int end_minute; /* End Minute */
signed int start_lon; /* Start Longitude */
signed int start_lat; /* Start Latitude */
signed int end_lon; /* End Longitude */
signed int end_lat; /* End Latitude */
unsigned int type; /* Type */
#define DAC200FID23_TYPE_UNKNOWN 0
signed int min; /* Min value */
#define DAC200FID23_MIN_UNKNOWN 255
signed int max; /* Max value */
#define DAC200FID23_MAX_UNKNOWN 255
unsigned int intensity; /* Classification */
#define DAC200FID23_CLASS_UNKNOWN 0
unsigned int wind; /* Wind Direction */
#define DAC200FID23_WIND_UNKNOWN 0
} dac200fid23;
struct {
char country[2+1]; /* UN Country Code */
signed int ngauges;
struct gauge_t {
unsigned int id; /* Gauge ID */
#define DAC200FID24_GAUGE_ID_UNKNOWN 0
signed int level; /* Water Level */
#define DAC200FID24_GAUGE_LEVEL_UNKNOWN 0
} gauges[4];
} dac200fid24;
struct {
signed int lon; /* Signal Longitude */
signed int lat; /* Signal Latitude */
unsigned int form; /* Signal form */
#define DAC200FID40_FORM_UNKNOWN 0
unsigned int facing; /* Signal orientation */
#define DAC200FID40_FACING_UNKNOWN 0
unsigned int direction; /* Direction of impact */
#define DAC200FID40_DIRECTION_UNKNOWN 0
unsigned int status; /* Light Status */
#define DAC200FID40_STATUS_UNKNOWN 0
} dac200fid40;
/* IMO236 - Meteorological-Hydrological data
* Trial message, not to be used after January 2013
* Replaced by IMO289 (DAC 1, FID 31)
*/
struct {
#define DAC1FID11_LATLON_SCALE 1000
int lon; /* longitude in minutes * .001 */
#define DAC1FID11_LON_NOT_AVAILABLE 0xFFFFFF
int lat; /* latitude in minutes * .001 */
#define DAC1FID11_LAT_NOT_AVAILABLE 0x7FFFFF
unsigned int day; /* UTC day */
unsigned int hour; /* UTC hour */
unsigned int minute; /* UTC minute */
unsigned int wspeed; /* average wind speed */
unsigned int wgust; /* wind gust */
#define DAC1FID11_WSPEED_NOT_AVAILABLE 127
unsigned int wdir; /* wind direction */
unsigned int wgustdir; /* wind gust direction */
#define DAC1FID11_WDIR_NOT_AVAILABLE 511
unsigned int airtemp; /* temperature, units 0.1C */
#define DAC1FID11_AIRTEMP_NOT_AVAILABLE 2047
#define DAC1FID11_AIRTEMP_OFFSET 600
#define DAC1FID11_AIRTEMP_DIV 10.0
unsigned int humidity; /* relative humidity, % */
#define DAC1FID11_HUMIDITY_NOT_AVAILABLE 127
unsigned int dewpoint; /* dew point, units 0.1C */
#define DAC1FID11_DEWPOINT_NOT_AVAILABLE 1023
#define DAC1FID11_DEWPOINT_OFFSET 200
#define DAC1FID11_DEWPOINT_DIV 10.0
unsigned int pressure; /* air pressure, hpa */
#define DAC1FID11_PRESSURE_NOT_AVAILABLE 511
#define DAC1FID11_PRESSURE_OFFSET -800
unsigned int pressuretend; /* tendency */
#define DAC1FID11_PRESSURETREND_NOT_AVAILABLE 3
unsigned int visibility; /* units 0.1 nautical miles */
#define DAC1FID11_VISIBILITY_NOT_AVAILABLE 255
#define DAC1FID11_VISIBILITY_DIV 10.0
int waterlevel; /* decimeters */
#define DAC1FID11_WATERLEVEL_NOT_AVAILABLE 511
#define DAC1FID11_WATERLEVEL_OFFSET 100
#define DAC1FID11_WATERLEVEL_DIV 10.0
unsigned int leveltrend; /* water level trend code */
#define DAC1FID11_WATERLEVELTREND_NOT_AVAILABLE 3
unsigned int cspeed; /* surface current speed in deciknots */
#define DAC1FID11_CSPEED_NOT_AVAILABLE 255
#define DAC1FID11_CSPEED_DIV 10.0
unsigned int cdir; /* surface current dir., degrees */
#define DAC1FID11_CDIR_NOT_AVAILABLE 511
unsigned int cspeed2; /* current speed in deciknots */
unsigned int cdir2; /* current dir., degrees */
unsigned int cdepth2; /* measurement depth, m */
#define DAC1FID11_CDEPTH_NOT_AVAILABLE 31
unsigned int cspeed3; /* current speed in deciknots */
unsigned int cdir3; /* current dir., degrees */
unsigned int cdepth3; /* measurement depth, m */
unsigned int waveheight; /* in decimeters */
#define DAC1FID11_WAVEHEIGHT_NOT_AVAILABLE 255
#define DAC1FID11_WAVEHEIGHT_DIV 10.0
unsigned int waveperiod; /* in seconds */
#define DAC1FID11_WAVEPERIOD_NOT_AVAILABLE 63
unsigned int wavedir; /* direction in degrees */
#define DAC1FID11_WAVEDIR_NOT_AVAILABLE 511
unsigned int swellheight; /* in decimeters */
unsigned int swellperiod; /* in seconds */
unsigned int swelldir; /* direction in degrees */
unsigned int seastate; /* Beaufort scale, 0-12 */
#define DAC1FID11_SEASTATE_NOT_AVAILABLE 15
unsigned int watertemp; /* units 0.1deg Celsius */
#define DAC1FID11_WATERTEMP_NOT_AVAILABLE 1023
#define DAC1FID11_WATERTEMP_OFFSET 100
#define DAC1FID11_WATERTEMP_DIV 10.0
unsigned int preciptype; /* 0-7, enumerated */
#define DAC1FID11_PRECIPTYPE_NOT_AVAILABLE 7
unsigned int salinity; /* units of 0.1ppt */
#define DAC1FID11_SALINITY_NOT_AVAILABLE 511
#define DAC1FID11_SALINITY_DIV 10.0
unsigned int ice; /* is there sea ice? */
#define DAC1FID11_ICE_NOT_AVAILABLE 3
} dac1fid11;
/* IMO236 - Fairway Closed */
struct {
char reason[20+1]; /* Reason For Closing */
char closefrom[20+1]; /* Location Of Closing From */
char closeto[20+1]; /* Location of Closing To */
unsigned int radius; /* Radius extension */
#define AIS_DAC1FID13_RADIUS_NOT_AVAILABLE 10001
unsigned int extunit; /* Unit of extension */
#define AIS_DAC1FID13_EXTUNIT_NOT_AVAILABLE 0
unsigned int fday; /* From day (UTC) */
unsigned int fmonth; /* From month (UTC) */
unsigned int fhour; /* From hour (UTC) */
unsigned int fminute; /* From minute (UTC) */
unsigned int tday; /* To day (UTC) */
unsigned int tmonth; /* To month (UTC) */
unsigned int thour; /* To hour (UTC) */
unsigned int tminute; /* To minute (UTC) */
} dac1fid13;
/* IMO236 - Extended ship and voyage data */
struct {
unsigned int airdraught; /* Air Draught */
} dac1fid15;
/* IMO286 - Number of Persons on board */
struct {
unsigned persons; /* number of persons */
} dac1fid16;
/* IMO289 - VTS-generated/Synthetic Targets */
struct {
signed int ntargets;
struct target_t {
#define DAC1FID17_IDTYPE_MMSI 0
#define DAC1FID17_IDTYPE_IMO 1
#define DAC1FID17_IDTYPE_CALLSIGN 2
#define DAC1FID17_IDTYPE_OTHER 3
unsigned int idtype; /* Identifier type */
union target_id { /* Target identifier */
unsigned int mmsi;
unsigned int imo;
#define DAC1FID17_ID_LENGTH 7
// cppcheck-suppress arrayIndexOutOfBounds
char callsign[DAC1FID17_ID_LENGTH+1];
char other[DAC1FID17_ID_LENGTH+1];
} id;
signed int lat; /* Latitude */
signed int lon; /* Longitude */
#define DAC1FID17_COURSE_NOT_AVAILABLE 360
unsigned int course; /* Course Over Ground */
unsigned int second; /* Time Stamp */
#define DAC1FID17_SPEED_NOT_AVAILABLE 255
unsigned int speed; /* Speed Over Ground */
} targets[4];
} dac1fid17;
/* IMO 289 - Marine Traffic Signal */
struct {
unsigned int linkage; /* Message Linkage ID */
char station[20+1]; /* Name of Signal Station */
signed int lon; /* Longitude */
signed int lat; /* Latitude */
unsigned int status; /* Status of Signal */
unsigned int signal; /* Signal In Service */
unsigned int hour; /* UTC hour */
unsigned int minute; /* UTC minute */
unsigned int nextsignal; /* Expected Next Signal */
} dac1fid19;
/* IMO289 - Route info (broadcast) */
struct route_info dac1fid27;
/* IMO289 - Text message (broadcast) */
struct {
unsigned int linkage;
#define AIS_DAC1FID29_TEXT_MAX 162 /* 920 bits of six-bit, plus NUL */
char text[AIS_DAC1FID29_TEXT_MAX];
} dac1fid29;
/* IMO289 - Meteorological-Hydrological data */
struct {
bool accuracy; /* position accuracy, <10m if true */
#define DAC1FID31_LATLON_SCALE 1000
int lon; /* longitude in minutes * .001 */
#define DAC1FID31_LON_NOT_AVAILABLE (181*60*DAC1FID31_LATLON_SCALE)
int lat; /* longitude in minutes * .001 */
#define DAC1FID31_LAT_NOT_AVAILABLE (91*60*DAC1FID31_LATLON_SCALE)
unsigned int day; /* UTC day */
unsigned int hour; /* UTC hour */
unsigned int minute; /* UTC minute */
unsigned int wspeed; /* average wind speed */
unsigned int wgust; /* wind gust */
#define DAC1FID31_WIND_HIGH 126
#define DAC1FID31_WIND_NOT_AVAILABLE 127
unsigned int wdir; /* wind direction */
unsigned int wgustdir; /* wind gust direction */
#define DAC1FID31_DIR_NOT_AVAILABLE 360
int airtemp; /* temperature, units 0.1C */
#define DAC1FID31_AIRTEMP_NOT_AVAILABLE -1024
#define DAC1FID31_AIRTEMP_DIV 10.0
unsigned int humidity; /* relative humidity, % */
#define DAC1FID31_HUMIDITY_NOT_AVAILABLE 101
int dewpoint; /* dew point, units 0.1C */
#define DAC1FID31_DEWPOINT_NOT_AVAILABLE 501
#define DAC1FID31_DEWPOINT_DIV 10.0
unsigned int pressure; /* air pressure, hpa */
#define DAC1FID31_PRESSURE_NOT_AVAILABLE 511
#define DAC1FID31_PRESSURE_HIGH 402
#define DAC1FID31_PRESSURE_OFFSET -799
unsigned int pressuretend; /* tendency */
#define DAC1FID31_PRESSURETEND_NOT_AVAILABLE 3
bool visgreater; /* visibility greater than */
unsigned int visibility; /* units 0.1 nautical miles */
#define DAC1FID31_VISIBILITY_NOT_AVAILABLE 127
#define DAC1FID31_VISIBILITY_DIV 10.0
int waterlevel; /* cm */
#define DAC1FID31_WATERLEVEL_NOT_AVAILABLE 4001
#define DAC1FID31_WATERLEVEL_OFFSET 1000
#define DAC1FID31_WATERLEVEL_DIV 100.0
unsigned int leveltrend; /* water level trend code */
#define DAC1FID31_WATERLEVELTREND_NOT_AVAILABLE 3
unsigned int cspeed; /* current speed in deciknots */
#define DAC1FID31_CSPEED_NOT_AVAILABLE 255
#define DAC1FID31_CSPEED_DIV 10.0
unsigned int cdir; /* current dir., degrees */
unsigned int cspeed2; /* current speed in deciknots */
unsigned int cdir2; /* current dir., degrees */
unsigned int cdepth2; /* measurement depth, 0.1m */
#define DAC1FID31_CDEPTH_NOT_AVAILABLE 301
#define DAC1FID31_CDEPTH_SCALE 10.0
unsigned int cspeed3; /* current speed in deciknots */
unsigned int cdir3; /* current dir., degrees */
unsigned int cdepth3; /* measurement depth, 0.1m */
unsigned int waveheight; /* in decimeters */
#define DAC1FID31_HEIGHT_NOT_AVAILABLE 31
#define DAC1FID31_HEIGHT_DIV 10.0
unsigned int waveperiod; /* in seconds */
#define DAC1FID31_PERIOD_NOT_AVAILABLE 63
unsigned int wavedir; /* direction in degrees */
unsigned int swellheight; /* in decimeters */
unsigned int swellperiod; /* in seconds */
unsigned int swelldir; /* direction in degrees */
unsigned int seastate; /* Beaufort scale, 0-12 */
#define DAC1FID31_SEASTATE_NOT_AVAILABLE 15
int watertemp; /* units 0.1deg Celsius */
#define DAC1FID31_WATERTEMP_NOT_AVAILABLE 601
#define DAC1FID31_WATERTEMP_DIV 10.0
unsigned int preciptype; /* 0-7, enumerated */
#define DAC1FID31_PRECIPTYPE_NOT_AVAILABLE 7
unsigned int salinity; /* units of 0.1 permil (ca. PSU) */
#define DAC1FID31_SALINITY_NOT_AVAILABLE 510
#define DAC1FID31_SALINITY_DIV 10.0
unsigned int ice; /* is there sea ice? */
#define DAC1FID31_ICE_NOT_AVAILABLE 3
} dac1fid31;
};
} type8;
/* Type 9 - Standard SAR Aircraft Position Report */
struct {
unsigned int alt; /* altitude in meters */
#define AIS_ALT_NOT_AVAILABLE 4095
#define AIS_ALT_HIGH 4094 /* 4094 meters or higher */
unsigned int speed; /* speed over ground in deciknots */
#define AIS_SAR_SPEED_NOT_AVAILABLE 1023
#define AIS_SAR_FAST_MOVER 1022
bool accuracy; /* position accuracy */
int lon; /* longitude */
int lat; /* latitude */
unsigned int course; /* course over ground */
unsigned int second; /* seconds of UTC timestamp */
unsigned int regional; /* regional reserved */
unsigned int dte; /* data terminal enable */
//unsigned int spare; spare bits */
bool assigned; /* assigned-mode flag */
bool raim; /* RAIM flag */
unsigned int radio; /* radio status bits */
} type9;
/* Type 10 - UTC/Date Inquiry */
struct {
//unsigned int spare;
unsigned int dest_mmsi; /* destination MMSI */
//unsigned int spare2;
} type10;
/* Type 12 - Safety-Related Message */
struct {
unsigned int seqno; /* sequence number */
unsigned int dest_mmsi; /* destination MMSI */
bool retransmit; /* retransmit flag */
//unsigned int spare; spare bit(s) */
#define AIS_TYPE12_TEXT_MAX 157 /* 936 bits of six-bit, plus NUL */
char text[AIS_TYPE12_TEXT_MAX];
} type12;
/* Type 14 - Safety-Related Broadcast Message */
struct {
//unsigned int spare; spare bit(s) */
#define AIS_TYPE14_TEXT_MAX 161 /* 952 bits of six-bit, plus NUL */
char text[AIS_TYPE14_TEXT_MAX];
} type14;
/* Type 15 - Interrogation */
struct {
//unsigned int spare; spare bit(s) */
unsigned int mmsi1;
unsigned int type1_1;
unsigned int offset1_1;
//unsigned int spare2; spare bit(s) */
unsigned int type1_2;
unsigned int offset1_2;
//unsigned int spare3; spare bit(s) */
unsigned int mmsi2;
unsigned int type2_1;
unsigned int offset2_1;
//unsigned int spare4; spare bit(s) */
} type15;
/* Type 16 - Assigned Mode Command */
struct {
//unsigned int spare; spare bit(s) */
unsigned int mmsi1;
unsigned int offset1;
unsigned int increment1;
unsigned int mmsi2;
unsigned int offset2;
unsigned int increment2;
} type16;
/* Type 17 - GNSS Broadcast Binary Message */
struct {
//unsigned int spare; spare bit(s) */
#define AIS_GNSS_LATLON_DIV 600.0
int lon; /* longitude */
int lat; /* latitude */
//unsigned int spare2; spare bit(s) */
#define AIS_TYPE17_BINARY_MAX 736 /* 920 bits */
size_t bitcount; /* bit count of the data */
char bitdata[(AIS_TYPE17_BINARY_MAX + 7) / 8];
} type17;
/* Type 18 - Standard Class B CS Position Report */
struct {
unsigned int reserved; /* altitude in meters */
unsigned int speed; /* speed over ground in deciknots */
bool accuracy; /* position accuracy */
int lon; /* longitude */
#define AIS_GNS_LON_NOT_AVAILABLE 0x1a838
int lat; /* latitude */
#define AIS_GNS_LAT_NOT_AVAILABLE 0xd548
unsigned int course; /* course over ground */
unsigned int heading; /* true heading */
unsigned int second; /* seconds of UTC timestamp */
unsigned int regional; /* regional reserved */
bool cs; /* carrier sense unit flag */
bool display; /* unit has attached display? */
bool dsc; /* unit attached to radio with DSC? */
bool band; /* unit can switch frequency bands? */
bool msg22; /* can accept Message 22 management? */
bool assigned; /* assigned-mode flag */
bool raim; /* RAIM flag */
unsigned int radio; /* radio status bits */
} type18;
/* Type 19 - Extended Class B CS Position Report */
struct {
unsigned int reserved; /* altitude in meters */
unsigned int speed; /* speed over ground in deciknots */
bool accuracy; /* position accuracy */
int lon; /* longitude */
int lat; /* latitude */
unsigned int course; /* course over ground */
unsigned int heading; /* true heading */
unsigned int second; /* seconds of UTC timestamp */
unsigned int regional; /* regional reserved */
// cppcheck-suppress arrayIndexOutOfBounds
char shipname[AIS_SHIPNAME_MAXLEN+1]; /* ship name */
unsigned int shiptype; /* ship type code */
unsigned int to_bow; /* dimension to bow */
unsigned int to_stern; /* dimension to stern */
unsigned int to_port; /* dimension to port */
unsigned int to_starboard; /* dimension to starboard */
unsigned int epfd; /* type of position fix deviuce */
bool raim; /* RAIM flag */
unsigned int dte; /* date terminal enable */
bool assigned; /* assigned-mode flag */
//unsigned int spare; spare bits */
} type19;
/* Type 20 - Data Link Management Message */
struct {
//unsigned int spare; spare bit(s) */
unsigned int offset1; /* TDMA slot offset */
unsigned int number1; /* number of xlots to allocate */
unsigned int timeout1; /* allocation timeout */
unsigned int increment1; /* repeat increment */
unsigned int offset2; /* TDMA slot offset */
unsigned int number2; /* number of xlots to allocate */
unsigned int timeout2; /* allocation timeout */
unsigned int increment2; /* repeat increment */
unsigned int offset3; /* TDMA slot offset */
unsigned int number3; /* number of xlots to allocate */
unsigned int timeout3; /* allocation timeout */
unsigned int increment3; /* repeat increment */
unsigned int offset4; /* TDMA slot offset */
unsigned int number4; /* number of xlots to allocate */
unsigned int timeout4; /* allocation timeout */
unsigned int increment4; /* repeat increment */
} type20;
/* Type 21 - Aids to Navigation Report */
struct {
unsigned int aid_type; /* aid type */
char name[35]; /* name of aid to navigation */
bool accuracy; /* position accuracy */
int lon; /* longitude */
int lat; /* latitude */
unsigned int to_bow; /* dimension to bow */
unsigned int to_stern; /* dimension to stern */
unsigned int to_port; /* dimension to port */
unsigned int to_starboard; /* dimension to starboard */
unsigned int epfd; /* type of EPFD */
unsigned int second; /* second of UTC timestamp */
bool off_position; /* off-position indicator */
unsigned int regional; /* regional reserved field */
bool raim; /* RAIM flag */
bool virtual_aid; /* is virtual station? */
bool assigned; /* assigned-mode flag */
//unsigned int spare; unused */
} type21;
/* Type 22 - Channel Management */
struct {
//unsigned int spare; spare bit(s) */
unsigned int channel_a; /* Channel A number */
unsigned int channel_b; /* Channel B number */
unsigned int txrx; /* transmit/receive mode */
bool power; /* high-power flag */
#define AIS_CHANNEL_LATLON_DIV 600.0
union {
struct {
int ne_lon; /* NE corner longitude */
int ne_lat; /* NE corner latitude */
int sw_lon; /* SW corner longitude */
int sw_lat; /* SW corner latitude */
} area;
struct {
unsigned int dest1; /* addressed station MMSI 1 */
unsigned int dest2; /* addressed station MMSI 2 */
} mmsi;
};
bool addressed; /* addressed vs. broadast flag */
bool band_a; /* fix 1.5kHz band for channel A */
bool band_b; /* fix 1.5kHz band for channel B */
unsigned int zonesize; /* size of transitional zone */
} type22;
/* Type 23 - Group Assignment Command */
struct {
int ne_lon; /* NE corner longitude */
int ne_lat; /* NE corner latitude */
int sw_lon; /* SW corner longitude */
int sw_lat; /* SW corner latitude */
//unsigned int spare; spare bit(s) */
unsigned int stationtype; /* station type code */
unsigned int shiptype; /* ship type code */
//unsigned int spare2; spare bit(s) */
unsigned int txrx; /* transmit-enable code */
unsigned int interval; /* report interval */
unsigned int quiet; /* quiet time */
//unsigned int spare3; spare bit(s) */
} type23;
/* Type 24 - Class B CS Static Data Report */
struct {
char shipname[AIS_SHIPNAME_MAXLEN+1]; /* vessel name */
enum {
both,
part_a,
part_b,
} part;
unsigned int shiptype; /* ship type code */
char vendorid[8]; /* vendor ID */
unsigned int model; /* unit model code */
unsigned int serial; /* serial number */
char callsign[8]; /* callsign */
union {
unsigned int mothership_mmsi; /* MMSI of main vessel */
struct {
unsigned int to_bow; /* dimension to bow */
unsigned int to_stern; /* dimension to stern */
unsigned int to_port; /* dimension to port */
unsigned int to_starboard; /* dimension to starboard */
} dim;
};
} type24;
/* Type 25 - Addressed Binary Message */
struct {
bool addressed; /* addressed-vs.broadcast flag */
bool structured; /* structured-binary flag */
unsigned int dest_mmsi; /* destination MMSI */
unsigned int app_id; /* Application ID */
#define AIS_TYPE25_BINARY_MAX 128 /* Up to 128 bits */
size_t bitcount; /* bit count of the data */
char bitdata[(AIS_TYPE25_BINARY_MAX + 7) / 8];
} type25;
/* Type 26 - Addressed Binary Message */
struct {
bool addressed; /* addressed-vs.broadcast flag */
bool structured; /* structured-binary flag */
unsigned int dest_mmsi; /* destination MMSI */
unsigned int app_id; /* Application ID */
#define AIS_TYPE26_BINARY_MAX 1004 /* Up to 128 bits */
size_t bitcount; /* bit count of the data */
char bitdata[(AIS_TYPE26_BINARY_MAX + 7) / 8];
unsigned int radio; /* radio status bits */
} type26;
/* Type 27 - Long Range AIS Broadcast message */
struct {
bool accuracy; /* position accuracy */
bool raim; /* RAIM flag */
unsigned int status; /* navigation status */
#define AIS_LONGRANGE_LATLON_DIV 600.0
int lon; /* longitude */
#define AIS_LONGRANGE_LON_NOT_AVAILABLE 0x1a838
int lat; /* latitude */
#define AIS_LONGRANGE_LAT_NOT_AVAILABLE 0xd548
unsigned int speed; /* speed over ground in deciknots */
#define AIS_LONGRANGE_SPEED_NOT_AVAILABLE 63
unsigned int course; /* course over ground */
#define AIS_LONGRANGE_COURSE_NOT_AVAILABLE 511
bool gnss; /* are we reporting GNSS position? */
} type27;
};
};
/* basic data, per PRN, from GPGSA and GPGSV */
struct satellite_t {
double ss; /* signal-to-noise ratio (dB) */
bool used; /* this satellite used in solution */
short PRN; /* PRN of this satellite */
short elevation; /* elevation of satellite */
short azimuth; /* azimuth */
};
struct attitude_t {
double heading;
double pitch;
double roll;
double yaw;
double dip;
double mag_len; /* unitvector sqrt(x^2 + y^2 +z^2) */
double mag_x;
double mag_y;
double mag_z;
double acc_len; /* unitvector sqrt(x^2 + y^2 +z^2) */
double acc_x;
double acc_y;
double acc_z;
double gyro_x;
double gyro_y;
double temp;
double depth;
/* compass status -- TrueNorth (and any similar) devices only */
char mag_st;
char pitch_st;
char roll_st;
char yaw_st;
};
struct navdata_t {
unsigned int version;
double compass_heading;
double compass_deviation;
double compass_variation;
double air_temp;
double air_pressure;
double water_temp;
double depth;
double depth_offset;
double wind_speed;
double wind_dir;
double crosstrack_error;
unsigned int compass_status;
unsigned int log_cumulative;
unsigned int log_trip;
unsigned int crosstrack_status;
};
struct dop_t {
/* Dilution of precision factors */
double xdop, ydop, pdop, hdop, vdop, tdop, gdop;
};
struct rawdata_t {
/* raw measurement data */
double codephase[MAXCHANNELS]; /* meters */
double carrierphase[MAXCHANNELS]; /* meters */
double pseudorange[MAXCHANNELS]; /* meters */
double deltarange[MAXCHANNELS]; /* meters/sec */
double doppler[MAXCHANNELS]; /* Hz */
double mtime[MAXCHANNELS]; /* sec */
unsigned satstat[MAXCHANNELS]; /* tracking status */
#define SAT_ACQUIRED 0x01 /* satellite acquired */
#define SAT_CODE_TRACK 0x02 /* code-tracking loop acquired */
#define SAT_CARR_TRACK 0x04 /* carrier-tracking loop acquired */
#define SAT_DATA_SYNC 0x08 /* data-bit synchronization done */
#define SAT_FRAME_SYNC 0x10 /* frame synchronization done */
#define SAT_EPHEMERIS 0x20 /* ephemeris collected */
#define SAT_FIX_USED 0x40 /* used for position fix */
};
struct version_t {
char release[64]; /* external version */
char rev[64]; /* internal revision ID */
int proto_major, proto_minor; /* API major and minor versions */
char remote[GPS_PATH_MAX]; /* could be from a remote device */
};
struct devconfig_t {
char path[GPS_PATH_MAX];
int flags;
#define SEEN_GPS 0x01
#define SEEN_RTCM2 0x02
#define SEEN_RTCM3 0x04
#define SEEN_AIS 0x08
char driver[64];
char subtype[64];
double activated;
unsigned int baudrate, stopbits; /* RS232 link parameters */
char parity; /* 'N', 'O', or 'E' */
double cycle, mincycle; /* refresh cycle time in seconds */
int driver_mode; /* is driver in native mode or not? */
};
struct policy_t {
bool watcher; /* is watcher mode on? */
bool json; /* requesting JSON? */
bool nmea; /* requesting dumping as NMEA? */
int raw; /* requesting raw data? */
bool scaled; /* requesting report scaling? */
bool timing; /* requesting timing info */
bool split24; /* requesting split AIS Type 24s */
bool pps; /* requesting PPS in NMEA/raw modes */
int loglevel; /* requested log level of messages */
char devpath[GPS_PATH_MAX]; /* specific device to watch */
char remote[GPS_PATH_MAX]; /* ...if this was passthrough */
};
#ifndef TIMEDELTA_DEFINED
#define TIMEDELTA_DEFINED
struct timedelta_t {
struct timespec real;
struct timespec clock;
};
#endif /* TIMEDELTA_DEFINED */
struct oscillator_t {
bool running; /* oscillator is running */
bool reference; /* PPS reference is available */
bool disciplined; /* oscillator is GPS-disciplined */
int delta; /* last observed PPS delta */
};
/*
* Someday we may support Windows, under which socket_t is a separate type.
* In the meantime, having a typedef for this semantic kind is no bad thing,
* as it makes clearer what some declarations are doing without breaking
* binary compatibility.
*/
typedef int socket_t;
#define BAD_SOCKET(s) ((s) == -1)
#define INVALIDATE_SOCKET(s) do { s = -1; } while (0)
/* mode flags for setting streaming policy */
#define WATCH_ENABLE 0x000001u /* enable streaming */
#define WATCH_DISABLE 0x000002u /* disable watching */
#define WATCH_JSON 0x000010u /* JSON output */
#define WATCH_NMEA 0x000020u /* output in NMEA */
#define WATCH_RARE 0x000040u /* output of packets in hex */
#define WATCH_RAW 0x000080u /* output of raw packets */
#define WATCH_SCALED 0x000100u /* scale output to floats */
#define WATCH_TIMING 0x000200u /* timing information */
#define WATCH_DEVICE 0x000800u /* watch specific device */
#define WATCH_SPLIT24 0x001000u /* split AIS Type 24s */
#define WATCH_PPS 0x002000u /* enable PPS JSON */
#define WATCH_NEWSTYLE 0x010000u /* force JSON streaming */
/*
* Main structure that includes all previous substructures
*/
struct gps_data_t {
gps_mask_t set; /* has field been set since this was last cleared? */
#define ONLINE_SET (1llu<<1)
#define TIME_SET (1llu<<2)
#define TIMERR_SET (1llu<<3)
#define LATLON_SET (1llu<<4)
#define ALTITUDE_SET (1llu<<5)
#define SPEED_SET (1llu<<6)
#define TRACK_SET (1llu<<7)
#define CLIMB_SET (1llu<<8)
#define STATUS_SET (1llu<<9)
#define MODE_SET (1llu<<10)
#define DOP_SET (1llu<<11)
#define HERR_SET (1llu<<12)
#define VERR_SET (1llu<<13)
#define ATTITUDE_SET (1llu<<14)
#define SATELLITE_SET (1llu<<15)
#define SPEEDERR_SET (1llu<<16)
#define TRACKERR_SET (1llu<<17)
#define CLIMBERR_SET (1llu<<18)
#define DEVICE_SET (1llu<<19)
#define DEVICELIST_SET (1llu<<20)
#define DEVICEID_SET (1llu<<21)
#define RTCM2_SET (1llu<<22)
#define RTCM3_SET (1llu<<23)
#define AIS_SET (1llu<<24)
#define PACKET_SET (1llu<<25)
#define SUBFRAME_SET (1llu<<26)
#define GST_SET (1llu<<27)
#define VERSION_SET (1llu<<28)
#define POLICY_SET (1llu<<29)
#define LOGMESSAGE_SET (1llu<<30)
#define ERROR_SET (1llu<<31)
#define TOFF_SET (1llu<<32) /* not yet used */
#define PPS_SET (1llu<<33)
#define NAVDATA_SET (1llu<<34)
#define OSCILLATOR_SET (1llu<<35)
#define SET_HIGH_BIT 36
timestamp_t online; /* NZ if GPS is on line, 0 if not.
*
* Note: gpsd clears this time when sentences
* fail to show up within the GPS's normal
* send cycle time. If the host-to-GPS
* link is lossy enough to drop entire
* sentences, this field will be
* prone to false zero values.
*/
#ifndef USE_QT
socket_t gps_fd; /* socket or file descriptor to GPS */
#else
void* gps_fd;
#endif
struct gps_fix_t fix; /* accumulated PVT data */
/* this should move to the per-driver structure */
double separation; /* Geoidal separation, MSL - WGS84 (Meters) */
/* GPS status -- always valid */
int status; /* Do we have a fix? */
#define STATUS_NO_FIX 0 /* no */
#define STATUS_FIX 1 /* yes, without DGPS */
#define STATUS_DGPS_FIX 2 /* yes, with DGPS */
/* precision of fix -- valid if satellites_used > 0 */
int satellites_used; /* Number of satellites used in solution */
struct dop_t dop;
/* redundant with the estimate elements in the fix structure */
double epe; /* spherical position error, 95% confidence (meters) */
/* satellite status -- valid when satellites_visible > 0 */
timestamp_t skyview_time; /* skyview timestamp */
int satellites_visible; /* # of satellites in view */
struct satellite_t skyview[MAXCHANNELS];
struct devconfig_t dev; /* device that shipped last update */
struct policy_t policy; /* our listening policy */
struct {
timestamp_t time;
int ndevices;
struct devconfig_t list[MAXUSERDEVS];
} devices;
/* pack things never reported together to reduce structure size */
#define UNION_SET (RTCM2_SET|RTCM3_SET|SUBFRAME_SET|AIS_SET|ATTITUDE_SET|GST_SET|OSCILLATOR_SET|VERSION_SET|LOGMESSAGE_SET|ERROR_SET|TOFF_SET|PPS_SET)
union {
/* unusual forms of sensor data that might come up the pipe */
struct rtcm2_t rtcm2;
struct rtcm3_t rtcm3;
struct subframe_t subframe;
struct ais_t ais;
struct attitude_t attitude;
struct navdata_t navdata;
struct rawdata_t raw;
struct gst_t gst;
struct oscillator_t osc;
/* "artificial" structures for various protocol responses */
struct version_t version;
char error[256];
struct timedelta_t toff;
struct timedelta_t pps;
};
/* FIXME! next lib rev need to add a place to put PPS precision */
/* Private data - client code must not set this */
void *privdata;
};
extern int gps_open(const char *, const char *,
struct gps_data_t *);
extern int gps_close(struct gps_data_t *);
extern int gps_send(struct gps_data_t *, const char *, ... );
extern int gps_read(struct gps_data_t *);
extern int gps_unpack(char *, struct gps_data_t *);
extern bool gps_waiting(const struct gps_data_t *, int);
extern int gps_stream(struct gps_data_t *, unsigned int, void *);
extern int gps_mainloop(struct gps_data_t *, int,
void (*)(struct gps_data_t *));
extern const char *gps_data(const struct gps_data_t *);
extern const char *gps_errstr(const int);
int json_toff_read(const char *buf, struct gps_data_t *,
const char **);
int json_pps_read(const char *buf, struct gps_data_t *,
const char **);
int json_oscillator_read(const char *buf, struct gps_data_t *,
const char **);
/* dependencies on struct gpsdata_t end here */
extern void libgps_trace(int errlevel, const char *, ...);
extern void gps_clear_fix(struct gps_fix_t *);
extern void gps_clear_dop( struct dop_t *);
extern void gps_merge_fix(struct gps_fix_t *, gps_mask_t, struct gps_fix_t *);
extern void gps_enable_debug(int, FILE *);
extern const char *gps_maskdump(gps_mask_t);
extern double safe_atof(const char *);
extern time_t mkgmtime(register struct tm *);
extern timestamp_t timestamp(void);
extern timestamp_t iso8601_to_unix(char *);
extern char *unix_to_iso8601(timestamp_t t, char[], size_t len);
extern double earth_distance(double, double, double, double);
extern double earth_distance_and_bearings(double, double, double, double,
double *,
double *);
extern double wgs84_separation(double, double);
/* some multipliers for interpreting GPS output */
#define METERS_TO_FEET 3.2808399 /* Meters to U.S./British feet */
#define METERS_TO_MILES 0.00062137119 /* Meters to miles */
#define METERS_TO_FATHOMS 0.54680665 /* Meters to fathoms */
#define KNOTS_TO_MPH 1.1507794 /* Knots to miles per hour */
#define KNOTS_TO_KPH 1.852 /* Knots to kilometers per hour */
#define KNOTS_TO_MPS 0.51444444 /* Knots to meters per second */
#define MPS_TO_KPH 3.6 /* Meters per second to klicks/hr */
#define MPS_TO_MPH 2.2369363 /* Meters/second to miles per hour */
#define MPS_TO_KNOTS 1.9438445 /* Meters per second to knots */
/* miles and knots are both the international standard versions of the units */
/* angle conversion multipliers */
#define GPS_PI 3.1415926535897932384626433832795029
#define RAD_2_DEG 57.2957795130823208767981548141051703
#define DEG_2_RAD 0.0174532925199432957692369076848861271
/* geodetic constants */
#define WGS84A 6378137 /* equatorial radius */
#define WGS84F 298.257223563 /* flattening */
#define WGS84B 6356752.3142 /* polar radius */
/* netlib_connectsock() errno return values */
#define NL_NOSERVICE -1 /* can't get service entry */
#define NL_NOHOST -2 /* can't get host entry */
#define NL_NOPROTO -3 /* can't get protocol entry */
#define NL_NOSOCK -4 /* can't create socket */
#define NL_NOSOCKOPT -5 /* error SETSOCKOPT SO_REUSEADDR */
#define NL_NOCONNECT -6 /* can't connect to host/socket pair */
#define SHM_NOSHARED -7 /* shared-memory segment not available */
#define SHM_NOATTACH -8 /* shared-memory attach failed */
#define DBUS_FAILURE -9 /* DBUS initialization failure */
#define DEFAULT_GPSD_PORT "2947" /* IANA assignment */
#define DEFAULT_RTCM_PORT "2101" /* IANA assignment */
/* special host values for non-socket exports */
#define GPSD_SHARED_MEMORY "shared memory"
#define GPSD_DBUS_EXPORT "DBUS export"
#ifdef __cplusplus
} /* End of the 'extern "C"' block */
#endif
#endif /* _GPSD_GPS_H_ */
/* gps.h ends here */