Home | History | Annotate | Download | only in release-3.1
      1 /* gps.h -- interface of the libgps library */
      2 /*
      3  * This file is Copyright (c) 2010 by the GPSD project
      4  * BSD terms apply: see the file COPYING in the distribution root for details.
      5  */
      6 #ifndef _GPSD_GPS_H_
      7 #define _GPSD_GPS_H_
      8 
      9 #ifdef __cplusplus
     10 extern "C" {
     11 #endif
     12 
     13 /* Macro for declaring function arguments unused. */
     14 #if defined(__GNUC__)
     15 #  define UNUSED __attribute__((unused)) /* Flag variable as unused */
     16 #else /* not __GNUC__ */
     17 #  define UNUSED
     18 #endif
     19 
     20 
     21 #include <sys/types.h>
     22 #include <sys/time.h>
     23 #include <stdbool.h>
     24 #include <inttypes.h>	/* stdint.h would be smaller but not all have it */
     25 #include <limits.h>
     26 #include <time.h>
     27 #include <signal.h>
     28 #include <stdio.h>
     29 #ifndef S_SPLINT_S
     30 #include <pthread.h>	/* pacifies OpenBSD's compiler */
     31 #endif
     32 
     33 /*
     34  * 4.1 - Base version for initial JSON protocol (Dec 2009, release 2.90)
     35  * 4.2 - AIS application IDs split into DAC and FID (July 2010, release 2.95)
     36  * 5.0 - MAXCHANNELS bumped from 20 to 32 for GLONASS (Mar 2011, release 2.96)
     37  *       gps_open() becomes reentrant, what gps_open_r() used to be.
     38  *       gps_poll() removed in favor of gps_read().  The raw hook is gone.
     39  */
     40 #define GPSD_API_MAJOR_VERSION	5	/* bump on incompatible changes */
     41 #define GPSD_API_MINOR_VERSION	0	/* bump on compatible changes */
     42 
     43 #define MAXTAGLEN	8	/* maximum length of sentence tag name */
     44 #define MAXCHANNELS	72	/* must be > 12 GPS + 12 GLONASS + 2 WAAS */
     45 #define GPS_PRNMAX	32	/* above this number are SBAS satellites */
     46 #define GPS_PATH_MAX	64	/* dev files usually have short names */
     47 #define MAXUSERDEVS	4	/* max devices per user */
     48 
     49 /*
     50  * The structure describing an uncertainty volume in kinematic space.
     51  * This is what GPSes are meant to produce; all the other info is
     52  * technical impedimenta.
     53  *
     54  * All double values use NAN to indicate data not available.
     55  *
     56  * Usually all the information in this structure was considered valid
     57  * by the GPS at the time of update.  This will be so if you are using
     58  * a GPS chipset that speaks SiRF binary, Garmin binary, or Zodiac binary.
     59  * This covers over 80% of GPS products in early 2005.
     60  *
     61  * If you are using a chipset that speaks NMEA, this structure is updated
     62  * in bits by GPRMC (lat/lon, track, speed), GPGGA (alt, climb), GPGLL
     63  * (lat/lon), and GPGSA (eph, epv).  Most NMEA GPSes take a single fix
     64  * at the beginning of a 1-second cycle and report the same timestamp in
     65  * GPRMC, GPGGA, and GPGLL; for these, all info is guaranteed correctly
     66  * synced to the time member, but you'll get different stages of the same
     67  * update depending on where in the cycle you poll.  A very few GPSes,
     68  * like the Garmin 48, take a new fix before more than one of of
     69  * GPRMC/GPGGA/GPGLL during a single cycle; thus, they may have different
     70  * timestamps and some data in this structure can be up to 1 cycle (usually
     71  * 1 second) older than the fix time.
     72  *
     73  * Error estimates are at 95% confidence.
     74  */
     75 typedef double timestamp_t;	/* Unix time in seconds with fractional part */
     76 
     77 struct gps_fix_t {
     78     timestamp_t time;	/* Time of update */
     79     int    mode;	/* Mode of fix */
     80 #define MODE_NOT_SEEN	0	/* mode update not seen yet */
     81 #define MODE_NO_FIX	1	/* none */
     82 #define MODE_2D  	2	/* good for latitude/longitude */
     83 #define MODE_3D  	3	/* good for altitude/climb too */
     84     double ept;		/* Expected time uncertainty */
     85     double latitude;	/* Latitude in degrees (valid if mode >= 2) */
     86     double epy;  	/* Latitude position uncertainty, meters */
     87     double longitude;	/* Longitude in degrees (valid if mode >= 2) */
     88     double epx;  	/* Longitude position uncertainty, meters */
     89     double altitude;	/* Altitude in meters (valid if mode == 3) */
     90     double epv;  	/* Vertical position uncertainty, meters */
     91     double track;	/* Course made good (relative to true north) */
     92     double epd;		/* Track uncertainty, degrees */
     93     double speed;	/* Speed over ground, meters/sec */
     94     double eps;		/* Speed uncertainty, meters/sec */
     95     double climb;       /* Vertical speed, meters/sec */
     96     double epc;		/* Vertical speed uncertainty */
     97 };
     98 
     99 /*
    100  * The structure describing the pseudorange errors (GPGST)
    101  */
    102 struct gst_t {
    103     double utctime;
    104     double rms_deviation;
    105     double smajor_deviation;
    106     double sminor_deviation;
    107     double smajor_orientation;
    108     double lat_err_deviation;
    109     double lon_err_deviation;
    110     double alt_err_deviation;
    111 };
    112 
    113 /*
    114  * From the RCTM104 2.x standard:
    115  *
    116  * "The 30 bit words (as opposed to 32 bit words) coupled with a 50 Hz
    117  * transmission rate provides a convenient timing capability where the
    118  * times of word boundaries are a rational multiple of 0.6 seconds."
    119  *
    120  * "Each frame is N+2 words long, where N is the number of message data
    121  * words. For example, a filler message (type 6 or 34) with no message
    122  * data will have N=0, and will consist only of two header words. The
    123  * maximum number of data words allowed by the format is 31, so that
    124  * the longest possible message will have a total of 33 words."
    125  */
    126 #define RTCM2_WORDS_MAX	33
    127 #define MAXCORRECTIONS	18	/* max correction count in type 1 or 9 */
    128 #define MAXSTATIONS	10	/* maximum stations in almanac, type 5 */
    129 /* RTCM104 doesn't specify this, so give it the largest reasonable value */
    130 #define MAXHEALTH	(RTCM2_WORDS_MAX-2)
    131 
    132 #ifndef S_SPLINT_S
    133 /*
    134  * A nominally 30-bit word (24 bits of data, 6 bits of parity)
    135  * used both in the GPS downlink protocol described in IS-GPS-200
    136  * and in the format for DGPS corrections used in RTCM-104v2.
    137  */
    138 typedef /*@unsignedintegraltype@*/ uint32_t isgps30bits_t;
    139 #endif /* S_SPLINT_S */
    140 
    141 /*
    142  * Values for "system" fields.  Note, the encoding logic is senstive to the
    143  * actual values of these; it's not sufficient that they're distinct.
    144  */
    145 #define NAVSYSTEM_GPS   	0
    146 #define NAVSYSTEM_GLONASS	1
    147 #define NAVSYSTEM_GALILEO	2
    148 #define NAVSYSTEM_UNKNOWN	3
    149 
    150 struct rtcm2_t {
    151     /* header contents */
    152     unsigned type;	/* RTCM message type */
    153     unsigned length;	/* length (words) */
    154     double   zcount;	/* time within hour: GPS time, no leap secs */
    155     unsigned refstaid;	/* reference station ID */
    156     unsigned seqnum;	/* message sequence number (modulo 8) */
    157     unsigned stathlth;	/* station health */
    158 
    159     /* message data in decoded form */
    160     union {
    161 	struct {
    162 	    unsigned int nentries;
    163 	    struct gps_rangesat_t {	/* data from messages 1 & 9 */
    164 		unsigned ident;		/* satellite ID */
    165 		unsigned udre;		/* user diff. range error */
    166 		unsigned iod;		/* issue of data */
    167 		double prc;		/* range error */
    168 		double rrc;		/* range error rate */
    169 	    } sat[MAXCORRECTIONS];
    170 	} gps_ranges;
    171 	struct {		/* data for type 3 messages */
    172 	    bool valid;		/* is message well-formed? */
    173 	    double x, y, z;
    174 	} ecef;
    175 	struct {		/* data from type 4 messages */
    176 	    bool valid;		/* is message well-formed? */
    177 	    int system;
    178 	    int sense;
    179 #define SENSE_INVALID	0
    180 #define SENSE_GLOBAL	1
    181 #define SENSE_LOCAL   	2
    182 	    char datum[6];
    183 	    double dx, dy, dz;
    184 	} reference;
    185 	struct {		/* data from type 5 messages */
    186 	    unsigned int nentries;
    187 	    struct consat_t {
    188 		unsigned ident;		/* satellite ID */
    189 		bool iodl;		/* issue of data */
    190 		unsigned int health;	/* is satellite healthy? */
    191 #define HEALTH_NORMAL		(0)	/* Radiobeacon operation normal */
    192 #define HEALTH_UNMONITORED	(1)	/* No integrity monitor operating */
    193 #define HEALTH_NOINFO		(2)	/* No information available */
    194 #define HEALTH_DONOTUSE		(3)	/* Do not use this radiobeacon */
    195 	       int snr;			/* signal-to-noise ratio, dB */
    196 #define SNR_BAD	-1			/* not reported */
    197 		bool health_en; 	/* health enabled */
    198 		bool new_data;		/* new data? */
    199 		bool los_warning;	/* line-of-sight warning */
    200 		unsigned int tou;	/* time to unhealth, seconds */
    201 	    } sat[MAXHEALTH];
    202 	} conhealth;
    203 	struct {		/* data from type 7 messages */
    204 	    unsigned int nentries;
    205 	    struct station_t {
    206 		double latitude, longitude;	/* location */
    207 		unsigned int range;		/* range in km */
    208 		double frequency;		/* broadcast freq */
    209 		unsigned int health;		/* station health */
    210 		unsigned int station_id;	/* of the transmitter */
    211 		unsigned int bitrate;		/* of station transmissions */
    212 	    } station[MAXSTATIONS];
    213 	} almanac;
    214 	struct {		/* data for type 13 messages */
    215 	    bool status;		/* expect a text message */
    216 	    bool rangeflag;		/* station range altered? */
    217 	    double lat, lon;		/* station longitude/latitude */
    218 	    unsigned int range;		/* transmission range in km */
    219 	} xmitter;
    220 	struct {		/* data from type 14 messages */
    221 	    unsigned int week;			/* GPS week (0-1023) */
    222 	    unsigned int hour;			/* Hour in week (0-167) */
    223 	    unsigned int leapsecs;		/* Leap seconds (0-63) */
    224 	} gpstime;
    225 	struct {
    226 	    unsigned int nentries;
    227 	    struct glonass_rangesat_t {		/* data from message type 31 */
    228 		unsigned ident;		/* satellite ID */
    229 		unsigned udre;		/* user diff. range error */
    230 		unsigned tod;		/* issue of data */
    231 		bool change;		/* ephemeris change bit */
    232 		double prc;		/* range error */
    233 		double rrc;		/* range error rate */
    234 	    } sat[MAXCORRECTIONS];
    235 	} glonass_ranges;
    236 	/* data from type 16 messages */
    237 	char message[(RTCM2_WORDS_MAX-2) * sizeof(isgps30bits_t)];
    238 	/* data from messages of unknown type */
    239 	isgps30bits_t	words[RTCM2_WORDS_MAX-2];
    240     };
    241 };
    242 
    243 /* RTCM3 report structures begin here */
    244 
    245 #define RTCM3_MAX_SATELLITES	64
    246 #define RTCM3_MAX_DESCRIPTOR	31
    247 #define RTCM3_MAX_ANNOUNCEMENTS	32
    248 
    249 struct rtcm3_rtk_hdr {		/* header data from 1001, 1002, 1003, 1004 */
    250     /* Used for both GPS and GLONASS, but their timebases differ */
    251     unsigned int station_id;	/* Reference Station ID */
    252     time_t tow;			/* GPS Epoch Time (TOW) in ms,
    253 				   or GLONASS Epoch Time in ms */
    254     bool sync;			/* Synchronous GNSS Message Flag */
    255     unsigned short satcount;	/* # Satellite Signals Processed */
    256     bool smoothing;		/* Divergence-free Smoothing Indicator */
    257     unsigned short interval;	/* Smoothing Interval */
    258 };
    259 
    260 struct rtcm3_basic_rtk {
    261     unsigned char indicator;	/* Indicator */
    262     short channel;		/* Satellite Frequency Channel Number
    263 				   (GLONASS only) */
    264     double pseudorange;		/* Pseudorange */
    265     double rangediff;		/* PhaseRange  Pseudorange in meters */
    266     unsigned char locktime;	/* Lock time Indicator */
    267 };
    268 
    269 struct rtcm3_extended_rtk {
    270     unsigned char indicator;	/* Indicator */
    271     short channel;		/* Satellite Frequency Channel Number
    272 				   (GLONASS only) */
    273     double pseudorange;		/* Pseudorange */
    274     double rangediff;		/* PhaseRange  L1 Pseudorange */
    275     unsigned char locktime;	/* Lock time Indicator */
    276     unsigned char ambiguity;	/* Integer Pseudorange
    277 					   Modulus Ambiguity */
    278     double CNR;			/* Carrier-to-Noise Ratio */
    279 };
    280 
    281 struct rtcm3_network_rtk_header {
    282     unsigned int network_id;	/* Network ID */
    283     unsigned int subnetwork_id;	/* Subnetwork ID */
    284     time_t time;		/* GPS Epoch Time (TOW) in ms */
    285     bool multimesg;		/* GPS Multiple Message Indicator */
    286     unsigned master_id;		/* Master Reference Station ID */
    287     unsigned aux_id;		/* Auxilary Reference Station ID */
    288     unsigned char satcount;	/* count of GPS satellites */
    289 };
    290 
    291 struct rtcm3_correction_diff {
    292     unsigned char ident;	/* satellite ID */
    293     enum {reserved, correct, widelane, uncertain} ambiguity;
    294     unsigned char nonsync;
    295     double geometric_diff;	/* Geometric Carrier Phase
    296 				   Correction Difference (1016, 1017) */
    297     unsigned char iode;		/* GPS IODE (1016, 1017) */
    298     double ionospheric_diff;	/* Ionospheric Carrier Phase
    299 				   Correction Difference (1015, 1017) */
    300 };
    301 
    302 struct rtcm3_t {
    303     /* header contents */
    304     unsigned type;	/* RTCM 3.x message type */
    305     unsigned length;	/* payload length, inclusive of checksum */
    306 
    307     union {
    308 	/* 1001-1013 were present in the 3.0 version */
    309 	struct {
    310 	    struct rtcm3_rtk_hdr	header;
    311 	    struct rtcm3_1001_t {
    312 		unsigned ident;			/* Satellite ID */
    313 		struct rtcm3_basic_rtk L1;
    314 	    } rtk_data[RTCM3_MAX_SATELLITES];
    315 	} rtcm3_1001;
    316 	struct rtcm3_1002_t {
    317 	    struct rtcm3_rtk_hdr	header;
    318 	    struct {
    319 		unsigned ident;			/* Satellite ID */
    320 		struct rtcm3_extended_rtk L1;
    321 	    } rtk_data[RTCM3_MAX_SATELLITES];
    322 	} rtcm3_1002;
    323 	struct rtcm3_1003_t {
    324 	    struct rtcm3_rtk_hdr	header;
    325 	    struct {
    326 		unsigned ident;			/* Satellite ID */
    327 		struct rtcm3_basic_rtk L1;
    328 		struct rtcm3_basic_rtk L2;
    329 	    } rtk_data[RTCM3_MAX_SATELLITES];
    330 	} rtcm3_1003;
    331 	struct rtcm3_1004_t {
    332 	    struct rtcm3_rtk_hdr	header;
    333 	    struct {
    334 		unsigned ident;			/* Satellite ID */
    335 		struct rtcm3_extended_rtk L1;
    336 		struct rtcm3_extended_rtk L2;
    337 	    } rtk_data[RTCM3_MAX_SATELLITES];
    338 	} rtcm3_1004;
    339 	struct rtcm3_1005_t {
    340 	    unsigned int station_id;		/* Reference Station ID */
    341 	    int system;				/* Which system is it? */
    342 	    bool reference_station;		/* Reference-station indicator */
    343 	    bool single_receiver;		/* Single Receiver Oscillator */
    344 	    double ecef_x, ecef_y, ecef_z;	/* ECEF antenna location */
    345 	} rtcm3_1005;
    346 	struct rtcm3_1006_t {
    347 	    unsigned int station_id;		/* Reference Station ID */
    348 	    int system;				/* Which system is it? */
    349 	    bool reference_station;		/* Reference-station indicator */
    350 	    bool single_receiver;		/* Single Receiver Oscillator */
    351 	    double ecef_x, ecef_y, ecef_z;	/* ECEF antenna location */
    352 	    double height;			/* Antenna height */
    353 	} rtcm3_1006;
    354 	struct rtcm3_1007_t {
    355 	    unsigned int station_id;			/* Reference Station ID */
    356 	    char descriptor[RTCM3_MAX_DESCRIPTOR+1];	/* Description string */
    357 	    unsigned char setup_id;
    358 	} rtcm3_1007;
    359 	struct rtcm3_1008_t {
    360 	    unsigned int station_id;			/* Reference Station ID */
    361 	    char descriptor[RTCM3_MAX_DESCRIPTOR+1];	/* Description string */
    362 	    unsigned char setup_id;
    363 	    char serial[RTCM3_MAX_DESCRIPTOR+1];	/* Serial # string */
    364 	} rtcm3_1008;
    365 	struct rtcm3_1009_t {
    366 	    struct rtcm3_rtk_hdr	header;
    367 	    struct {
    368 		unsigned ident;		/* Satellite ID */
    369 		struct rtcm3_basic_rtk L1;
    370 	    } rtk_data[RTCM3_MAX_SATELLITES];
    371 	} rtcm3_1009;
    372 	struct rtcm3_1010_t {
    373 	    struct rtcm3_rtk_hdr	header;
    374 	    struct {
    375 		unsigned ident;		/* Satellite ID */
    376 		struct rtcm3_extended_rtk L1;
    377 	    } rtk_data[RTCM3_MAX_SATELLITES];
    378 	} rtcm3_1010;
    379 	struct rtcm3_1011_t {
    380 	    struct rtcm3_rtk_hdr	header;
    381 	    struct {
    382 		unsigned ident;			/* Satellite ID */
    383 		struct rtcm3_extended_rtk L1;
    384 		struct rtcm3_extended_rtk L2;
    385 	    } rtk_data[RTCM3_MAX_SATELLITES];
    386 	} rtcm3_1011;
    387 	struct rtcm3_1012_t {
    388 	    struct rtcm3_rtk_hdr	header;
    389 	    struct {
    390 		unsigned ident;			/* Satellite ID */
    391 		struct rtcm3_extended_rtk L1;
    392 		struct rtcm3_extended_rtk L2;
    393 	    } rtk_data[RTCM3_MAX_SATELLITES];
    394 	} rtcm3_1012;
    395 	struct rtcm3_1013_t {
    396 	    unsigned int station_id;	/* Reference Station ID */
    397 	    unsigned short mjd;		/* Modified Julian Day (MJD) Number */
    398 	    unsigned int sod;		/* Seconds of Day (UTC) */
    399 	    unsigned char leapsecs;	/* Leap Seconds, GPS-UTC */
    400 	    unsigned char ncount;	/* Count of announcements to follow */
    401 	    struct {
    402 		unsigned short id;		/* message type ID */
    403 		bool sync;
    404 		unsigned short interval;	/* interval in 0.1sec units */
    405 	    } announcements[RTCM3_MAX_ANNOUNCEMENTS];
    406 	} rtcm3_1013;
    407 	/* 1014-1017 were added in the 3.1 version */
    408 	struct rtcm3_1014_t {
    409 	    unsigned int network_id;	/* Network ID */
    410 	    unsigned int subnetwork_id;	/* Subnetwork ID */
    411 	    unsigned char stationcount;	/* # auxiliary stations transmitted */
    412 	    unsigned int master_id;	/* Master Reference Station ID */
    413 	    unsigned int aux_id;	/* Auxilary Reference Station ID */
    414 	    double d_lat, d_lon, d_alt;	/* Aux-master location delta */
    415 	} rtcm3_1014;
    416 	struct rtcm3_1015_t {
    417 	    struct rtcm3_network_rtk_header	header;
    418 	    struct rtcm3_correction_diff corrections[RTCM3_MAX_SATELLITES];
    419 	} rtcm3_1015;
    420 	struct rtcm3_1016_t {
    421 	    struct rtcm3_network_rtk_header	header;
    422 	    struct rtcm3_correction_diff corrections[RTCM3_MAX_SATELLITES];
    423 	} rtcm3_1016;
    424 	struct rtcm3_1017_t {
    425 	    struct rtcm3_network_rtk_header	header;
    426 	    struct rtcm3_correction_diff corrections[RTCM3_MAX_SATELLITES];
    427 	} rtcm3_1017;
    428 	/* 1018-1029 were in the 3.0 version */
    429 	struct rtcm3_1019_t {
    430 	    unsigned int ident;		/* Satellite ID */
    431 	    unsigned int week;		/* GPS Week Number */
    432 	    unsigned char sv_accuracy;	/* GPS SV ACCURACY */
    433 	    enum {reserved_code, p, ca, l2c} code;
    434 	    double idot;
    435 	    unsigned char iode;
    436 	    /* ephemeris fields, not scaled */
    437 	    unsigned int t_sub_oc;
    438 	    signed int a_sub_f2;
    439 	    signed int a_sub_f1;
    440 	    signed int a_sub_f0;
    441 	    unsigned int iodc;
    442 	    signed int C_sub_rs;
    443 	    signed int delta_sub_n;
    444 	    signed int M_sub_0;
    445 	    signed int C_sub_uc;
    446 	    unsigned int e;
    447 	    signed int C_sub_us;
    448 	    unsigned int sqrt_sub_A;
    449 	    unsigned int t_sub_oe;
    450 	    signed int C_sub_ic;
    451 	    signed int OMEGA_sub_0;
    452 	    signed int C_sub_is;
    453 	    signed int i_sub_0;
    454 	    signed int C_sub_rc;
    455 	    signed int argument_of_perigee;
    456 	    signed int omegadot;
    457 	    signed int t_sub_GD;
    458 	    unsigned char sv_health;
    459 	    bool p_data;
    460 	    bool fit_interval;
    461 	} rtcm3_1019;
    462 	struct rtcm3_1020_t {
    463 	    unsigned int ident;		/* Satellite ID */
    464 	    unsigned short channel;	/* Satellite Frequency Channel Number */
    465 	    /* ephemeris fields, not scaled */
    466 	    bool C_sub_n;
    467 	    bool health_avAilability_indicator;
    468 	    unsigned char P1;
    469 	    unsigned short t_sub_k;
    470 	    bool msb_of_B_sub_n;
    471 	    bool P2;
    472 	    bool t_sub_b;
    473 	    signed int x_sub_n_t_of_t_sub_b_prime;
    474 	    signed int x_sub_n_t_of_t_sub_b;
    475 	    signed int x_sub_n_t_of_t_sub_b_prime_prime;
    476 	    signed int y_sub_n_t_of_t_sub_b_prime;
    477 	    signed int y_sub_n_t_of_t_sub_b;
    478 	    signed int y_sub_n_t_of_t_sub_b_prime_prime;
    479 	    signed int z_sub_n_t_of_t_sub_b_prime;
    480 	    signed int z_sub_n_t_of_t_sub_b;
    481 	    signed int z_sub_n_t_of_t_sub_b_prime_prime;
    482 	    bool P3;
    483 	    signed int gamma_sub_n_of_t_sub_b;
    484 	    unsigned char MP;
    485 	    bool Ml_n;
    486 	    signed int tau_n_of_t_sub_b;
    487 	    signed int M_delta_tau_sub_n;
    488 	    unsigned int E_sub_n;
    489 	    bool MP4;
    490 	    unsigned char MF_sub_T;
    491 	    unsigned char MN_sub_T;
    492 	    unsigned char MM;
    493 	    bool additioinal_data_availability;
    494 	    unsigned int N_sup_A;
    495 	    unsigned int tau_sub_c;
    496 	    unsigned int M_N_sub_4;
    497 	    signed int M_tau_sub_GPS;
    498 	    bool M_l_sub_n;
    499 	} rtcm3_1020;
    500 	struct rtcm3_1029_t {
    501 	    unsigned int station_id;	/* Reference Station ID */
    502 	    unsigned short mjd;		/* Modified Julian Day (MJD) Number */
    503 	    unsigned int sod;		/* Seconds of Day (UTC) */
    504 	    size_t len;			/* # chars to follow */
    505 	    size_t unicode_units;	/* # Unicode units in text */
    506 	    unsigned char text[128];
    507 	} rtcm3_1029;
    508 	struct rtcm3_1033_t {
    509 	    unsigned int station_id;			/* Reference Station ID */
    510 	    char descriptor[RTCM3_MAX_DESCRIPTOR+1];	/* Description string */
    511 	    unsigned char setup_id;
    512 	    char serial[RTCM3_MAX_DESCRIPTOR+1];	/* Serial # string */
    513 	    char receiver[RTCM3_MAX_DESCRIPTOR+1];	/* Receiver string */
    514 	    char firmware[RTCM3_MAX_DESCRIPTOR+1];	/* Firmware string */
    515 	} rtcm3_1033;
    516 	char data[1024];		/* Max RTCM3 msg length is 1023 bytes */
    517     } rtcmtypes;
    518 };
    519 
    520 /* RTCM3 scaling constants */
    521 #define GPS_AMBIGUITY_MODULUS		299792.458	/* 1004, DF014*/
    522 #define GLONASS_AMBIGUITY_MODULUS	599584.916	/* 1012, DF044 */
    523 #define MESSAGE_INTERVAL_UNITS		0.1		/* 1013, DF047 */
    524 
    525 /*
    526  * Raw IS_GPS subframe data
    527  */
    528 
    529 /* The almanac is a subset of the clock and ephemeris data, with reduced
    530  * precision. See IS-GPS-200E, Table 20-VI  */
    531 struct almanac_t
    532 {
    533     uint8_t sv;  /* The satellite this refers to */
    534     /* toa, almanac reference time, 8 bits unsigned, seconds */
    535     uint8_t toa;
    536     long l_toa;
    537     /* SV health data, 8 bit unsigned bit map */
    538     uint8_t svh;
    539     /* deltai, correction to inclination, 16 bits signed, semi-circles */
    540     int16_t deltai;
    541     double d_deltai;
    542     /* M0, Mean Anomaly at Reference Time, 24 bits signed, semi-circles */
    543     int32_t M0;
    544     double d_M0;
    545     /* Omega0, Longitude of Ascending Node of Orbit Plane at Weekly Epoch,
    546      * 24 bits signed, semi-circles */
    547     int32_t Omega0;
    548     double d_Omega0;
    549     /* omega, Argument of Perigee, 24 bits signed, semi-circles */
    550     int32_t omega;
    551     double d_omega;
    552     /* af0, SV clock correction constant term
    553      * 11 bits signed, seconds */
    554     int16_t af0;
    555     double d_af0;
    556     /* af1, SV clock correction first order term
    557      * 11 bits signed, seconds/second */
    558     int16_t af1;
    559     double d_af1;
    560     /* eccentricity, 16 bits, unsigned, dimensionless */
    561     uint16_t e;
    562     double d_eccentricity;
    563     /* sqrt A, Square Root of the Semi-Major Axis
    564      * 24 bits unsigned, square_root(meters) */
    565     uint32_t sqrtA;
    566     double d_sqrtA;
    567     /* Omega dot, Rate of Right Ascension, 16 bits signed, semi-circles/sec */
    568     int16_t Omegad;
    569     double d_Omegad;
    570 };
    571 
    572 struct subframe_t {
    573     /* subframe number, 3 bits, unsigned, 1 to 5 */
    574     uint8_t subframe_num;
    575     /* data_id, denotes the NAV data structure of D(t), 2 bits, in
    576      * IS-GPS-200E always == 0x1 */
    577     uint8_t data_id;
    578     /* SV/page id used for subframes 4 & 5, 6 bits */
    579     uint8_t pageid;
    580     /* tSVID, SV ID of the sat that transmitted this frame, 6 bits unsigned */
    581     uint8_t tSVID;
    582     /* TOW, Time of Week of NEXT message, 17 bits unsigned, scale 6, seconds */
    583     uint32_t TOW17;
    584     long l_TOW17;
    585     /* integrity, URA bounds flag, 1 bit */
    586     bool integrity;
    587     /* alert, alert flag, SV URA and/or the SV User Differential Range
    588      * Accuracy (UDRA) may be worse than indicated, 1 bit */
    589     bool alert;
    590     /* antispoof, A-S mode is ON in that SV, 1 bit */
    591     bool antispoof;
    592     int is_almanac;
    593     union {
    594         /* subframe 1, part of ephemeris, see IS-GPS-200E, Table 20-II
    595 	 * and Table 20-I */
    596 	struct {
    597 	    /* WN, Week Number, 10 bits unsigned, scale 1, weeks */
    598 	    uint16_t WN;
    599 	    /* IODC, Issue of Data, Clock, 10 bits, unsigned,
    600 	     * issued in 8 data ranges at the same time */
    601 	    uint16_t IODC;
    602 	    /* toc, clock data reference time, 16 bits, unsigned, seconds
    603 	     * scale 2**4, issued in 8 data ranges at the same time */
    604 	    uint16_t toc;
    605 	    long l_toc;
    606 	    /* l2, code on L2, 2 bits, bit map */
    607 	    uint8_t l2;
    608 	    /* l2p, L2 P data flag, 1 bit */
    609 	    uint8_t l2p;
    610 	    /* ura, SV accuracy, 4 bits unsigned index */
    611 	    unsigned int ura;
    612 	    /* hlth, SV health, 6 bits unsigned bitmap */
    613 	    unsigned int hlth;
    614 	    /* af0, SV clock correction constant term
    615 	     * 22 bits signed, scale 2**-31, seconds */
    616 	    int32_t af0;
    617 	    double d_af0;
    618 	    /* af1, SV clock correction first order term
    619 	     * 22 bits signed, scale 2**-43, seconds/second */
    620 	    int16_t af1;
    621 	    double d_af1;
    622 	    /* af2, SV clock correction second order term
    623 	     * 8 bits signed, scale 2**-55, seconds/second**2 */
    624 	    int8_t af2;
    625 	    double d_af2;
    626 	    /* Tgd,  L1-L2 correction term, 8 bits signed,  scale 2**-31,
    627 	     * seconds */
    628 	    int8_t Tgd;
    629 	    double d_Tgd;
    630 	} sub1;
    631         /* subframe 2, part of ephemeris, see IS-GPS-200E, Table 20-II
    632 	 * and Table 20-III */
    633 	struct {
    634 	    /* Issue of Data (Ephemeris),
    635 	     * equal to the 8 LSBs of the 10 bit IODC of the same data set */
    636 	    uint8_t IODE;
    637 	    /* Age of Data Offset for the NMCT, 6 bits, scale 900,
    638 	     * ignore if all ones, seconds */
    639 	    uint8_t AODO;
    640 	    uint16_t u_AODO;
    641 	    /* fit, FIT interval flag, indicates a fit interval greater than
    642 	     * 4 hour, 1 bit */
    643 	    uint8_t fit;
    644 	    /* toe, Reference Time Ephemeris, 16 bits unsigned, scale 2**4,
    645 	     * seconds */
    646 	    uint16_t toe;
    647 	    long l_toe;
    648 	    /* Crs, Amplitude of the Sine Harmonic Correction Term to the
    649 	     * Orbit Radius, 16 bits, scale 2**-5, signed, meters */
    650 	    int16_t Crs;
    651 	    double d_Crs;
    652 	    /* Cus, Amplitude of the Sine Harmonic Correction Term to the
    653 	     * Argument of Latitude, 16 bits, signed, scale 2**-29, radians */
    654 	    int16_t Cus;
    655 	    double d_Cus;
    656 	    /* Cuc, Amplitude of the Cosine Harmonic Correction Term to the
    657 	     * Argument of Latitude, 16 bits, signed, scale 2**-29, radians */
    658 	    int16_t Cuc;
    659 	    double d_Cuc;
    660 	    /* deltan, Mean Motion Difference From Computed Value
    661 	     * Mean Motion Difference From Computed Value
    662 	     * 16 bits, signed, scale 2**-43, semi-circles/sec */
    663 	    int16_t deltan;
    664 	    double d_deltan;
    665 	    /* M0, Mean Anomaly at Reference Time, 32 bits signed,
    666 	     * scale 2**-31, semi-circles */
    667 	    int32_t M0;
    668 	    double d_M0;
    669 	    /* eccentricity, 32 bits, unsigned, scale 2**-33, dimensionless */
    670 	    uint32_t e;
    671 	    double d_eccentricity;
    672 	    /* sqrt A, Square Root of the Semi-Major Axis
    673 	     * 32 bits unsigned, scale 2**-19, square_root(meters) */
    674 	    uint32_t sqrtA;
    675 	    double d_sqrtA;
    676 	} sub2;
    677         /* subframe 3, part of ephemeris, see IS-GPS-200E, Table 20-II,
    678 	 * Table 20-III */
    679 	struct {
    680 	    /* Issue of Data (Ephemeris), 8 bits, unsigned
    681 	     * equal to the 8 LSBs of the 10 bit IODC of the same data set */
    682 	    uint8_t IODE;
    683 	    /* Rate of Inclination Angle, 14 bits signed, scale2**-43,
    684 	     * semi-circles/sec */
    685 	    uint16_t IDOT;
    686 	    double d_IDOT;
    687 	    /* Cic, Amplitude of the Cosine Harmonic Correction Term to the
    688 	     * Angle of Inclination, 16 bits signed, scale 2**-29, radians*/
    689 	    uint16_t Cic;
    690 	    double d_Cic;
    691 	    /* Cis, Amplitude of the Sine Harmonic Correction Term to the
    692 	     * Angle of Inclination, 16 bits, unsigned, scale 2**-29, radians */
    693 	    int16_t Cis;
    694 	    double d_Cis;
    695             /* Crc, Amplitude of the Cosine Harmonic Correction Term to the
    696 	     * Orbit Radius, 16 bits signed, scale 2**-5, meters */
    697 	    int16_t Crc;
    698 	    double d_Crc;
    699 	    /* i0, Inclination Angle at Reference Time, 32 bits, signed,
    700 	     * scale 2**-31, semi-circles */
    701 	    int32_t i0;
    702 	    double d_i0;
    703 	    /* Omega0, Longitude of Ascending Node of Orbit Plane at Weekly
    704 	     * Epoch, 32 bits signed, semi-circles */
    705 	    int32_t Omega0;
    706 	    double d_Omega0;
    707 	    /* omega, Argument of Perigee, 32 bits signed, scale 2**-31,
    708 	     * semi-circles */
    709 	    int32_t omega;
    710 	    double d_omega;
    711 	    /* Omega dot, Rate of Right Ascension, 24 bits signed,
    712 	     * scale 2**-43, semi-circles/sec */
    713 	    int32_t Omegad;
    714 	    double d_Omegad;
    715 	} sub3;
    716 	struct {
    717 	    struct almanac_t almanac;
    718 	} sub4;
    719 	/* subframe 4, page 13 */
    720 	struct {
    721 	    /* mapping ord ERD# to SV # is non trivial
    722 	     * leave it alone.  See IS-GPS-200E Section 20.3.3.5.1.9 */
    723 	    /* Estimated Range Deviation, 6 bits signed, meters */
    724 	    char ERD[33];
    725 	    /* ai, Availability Indicator, 2bits, bit map */
    726 	    unsigned char ai;
    727 	} sub4_13;
    728 	/* subframe 4, page 17, system message, 23 chars, plus nul */
    729 	struct {
    730 	    char str[24];
    731 	} sub4_17;
    732 	/* subframe 4, page 18 */
    733 	struct {
    734 	    /* ionospheric and UTC data */
    735 	    /* A0, Bias coefficient of GPS time scale relative to UTC time
    736 	     * scale, 32 bits signed, scale 2**-30, seconds */
    737 	    int32_t A0;
    738 	    double d_A0;
    739 	    /* A1, Drift coefficient of GPS time scale relative to UTC time
    740 	     * scale, 24 bits signed, scale 2**-50, seconds/second */
    741 	    int32_t A1;
    742 	    double d_A1;
    743 
    744 	    /* alphaX, the four coefficients of a cubic equation representing
    745 	     * the amplitude of the vertical delay */
    746 
    747 	    /* alpha0, 8 bits signed, scale w**-30, seconds */
    748 	    int8_t alpha0;
    749 	    double d_alpha0;
    750 	    /* alpha1, 8 bits signed, scale w**-27, seconds/semi-circle */
    751 	    int8_t alpha1;
    752 	    double d_alpha1;
    753 	    /* alpha2, 8 bits signed, scale w**-24, seconds/semi-circle**2 */
    754 	    int8_t alpha2;
    755 	    double d_alpha2;
    756 	    /* alpha3, 8 bits signed, scale w**-24, seconds/semi-circle**3 */
    757 	    int8_t alpha3;
    758 	    double d_alpha3;
    759 
    760 	    /* betaX, the four coefficients of a cubic equation representing
    761 	     * the period of the model */
    762 
    763 	    /* beta0, 8 bits signed, scale w**11, seconds */
    764 	    int8_t beta0;
    765 	    double d_beta0;
    766 	    /* beta1, 8 bits signed, scale w**14, seconds/semi-circle */
    767 	    int8_t beta1;
    768 	    double d_beta1;
    769 	    /* beta2, 8 bits signed, scale w**16, seconds/semi-circle**2 */
    770 	    int8_t beta2;
    771 	    double d_beta2;
    772 	    /* beta3, 8 bits signed, scale w**16, seconds/semi-circle**3 */
    773 	    int8_t beta3;
    774 	    double d_beta3;
    775 
    776 	    /* leap (delta t ls), current leap second, 8 bits signed,
    777 	     * scale 1, seconds */
    778 	    int8_t leap;
    779 	    /* lsf (delta t lsf), future leap second, 8 bits signed,
    780 	     * scale 1, seconds */
    781 	    int8_t lsf;
    782 
    783 	    /* tot, reference time for UTC data,
    784 	     * 8 bits unsigned, scale 2**12, seconds */
    785 	    uint8_t tot;
    786 	    double d_tot;
    787 
    788 	    /* WNt, UTC reference week number, 8 bits unsigned, scale 1,
    789 	     * weeks */
    790 	    uint8_t WNt;
    791 	    /* WNlsf, Leap second reference Week Number,
    792 	     * 8 bits unsigned, scale 1, weeks */
    793 	    uint8_t WNlsf;
    794 	    /* DN, Leap second reference Day Number , 8 bits unsigned,
    795 	     * scale 1, days */
    796 	    uint8_t DN;
    797 	} sub4_18;
    798 	/* subframe 4, page 25 */
    799 	struct {
    800 	    /* svf, A-S status and the configuration code of each SV
    801 	     * 4 bits unsigned, bitmap */
    802 	    unsigned char svf[33];
    803 	    /* svh, SV health data for SV 25 through 32
    804 	     * 6 bits unsigned bitmap */
    805 	    uint8_t svhx[8];
    806 	} sub4_25;
    807 	struct {
    808 	    struct almanac_t almanac;
    809 	} sub5;
    810 	struct {
    811 	    /* toa, Almanac reference Time, 8 bits unsigned, scale 2**12,
    812 	     * seconds */
    813 	    uint8_t toa;
    814 	    long l_toa;
    815 	    /* WNa, Week Number almanac, 8 bits, scale 2, GPS Week
    816 	     * Number % 256 */
    817 	    uint8_t WNa;
    818 	    /* sv, SV health status, 6 bits, bitmap */
    819 	    uint8_t sv[25];
    820 	} sub5_25;
    821     };
    822 };
    823 
    824 #ifndef S_SPLINT_S
    825 typedef uint64_t gps_mask_t;
    826 #else
    827 typedef /*@unsignedintegraltype@*/ unsigned long long gps_mask_t;
    828 #endif /* S_SPLINT_S */
    829 
    830 /*
    831  * Is an MMSI number that of an auxiliary associated with a mother ship?
    832  * We need to be able to test this for decoding AIS Type 24 messages.
    833  * According to <http://www.navcen.uscg.gov/marcomms/gmdss/mmsi.htm#format>,
    834  * auxiliary-craft MMSIs have the form 98MIDXXXX, where MID is a country
    835  * code and XXXX the vessel ID.
    836  */
    837 #define AIS_AUXILIARY_MMSI(n)	((n) / 10000000 == 98)
    838 
    839 /* N/A values and scaling constant for 25/24 bit lon/lat pairs */
    840 #define AIS_LON3_NOT_AVAILABLE	181000
    841 #define AIS_LAT3_NOT_AVAILABLE	91000
    842 #define AIS_LATLON3_SCALE	60000.0
    843 
    844 /* N/A values and scaling constant for 28/27 bit lon/lat pairs */
    845 #define AIS_LON4_NOT_AVAILABLE	1810000
    846 #define AIS_LAT4_NOT_AVAILABLE	910000
    847 #define AIS_LATLON4_SCALE	600000.0
    848 
    849 struct route_info {
    850     unsigned int linkage;	/* Message Linkage ID */
    851     unsigned int sender;	/* Sender Class */
    852     unsigned int rtype;		/* Route Type */
    853     unsigned int month;		/* Start month */
    854     unsigned int day;		/* Start day */
    855     unsigned int hour;		/* Start hour */
    856     unsigned int minute;	/* Start minute */
    857     unsigned int duration;	/* Duration */
    858     int waycount;		/* Waypoint count */
    859     struct waypoint_t {
    860 	signed int lon;		/* Longitude */
    861 	signed int lat;		/* Latitude */
    862     } waypoints[16];
    863 };
    864 
    865 struct ais_t
    866 {
    867     unsigned int	type;		/* message type */
    868     unsigned int    	repeat;		/* Repeat indicator */
    869     unsigned int	mmsi;		/* MMSI */
    870     union {
    871 	/* Types 1-3 Common navigation info */
    872 	struct {
    873 	    unsigned int status;		/* navigation status */
    874 	    signed turn;			/* rate of turn */
    875 #define AIS_TURN_HARD_LEFT	-127
    876 #define AIS_TURN_HARD_RIGHT	127
    877 #define AIS_TURN_NOT_AVAILABLE	128
    878 	    unsigned int speed;			/* speed over ground in deciknots */
    879 #define AIS_SPEED_NOT_AVAILABLE	1023
    880 #define AIS_SPEED_FAST_MOVER	1022		/* >= 102.2 knots */
    881 	    bool accuracy;			/* position accuracy */
    882 #define AIS_LATLON_SCALE	600000.0
    883 	    int lon;				/* longitude */
    884 #define AIS_LON_NOT_AVAILABLE	0x6791AC0
    885 	    int lat;				/* latitude */
    886 #define AIS_LAT_NOT_AVAILABLE	0x3412140
    887 	    unsigned int course;		/* course over ground */
    888 #define AIS_COURSE_NOT_AVAILABLE	3600
    889 	    unsigned int heading;		/* true heading */
    890 #define AIS_HEADING_NOT_AVAILABLE	511
    891 	    unsigned int second;		/* seconds of UTC timestamp */
    892 #define AIS_SEC_NOT_AVAILABLE	60
    893 #define AIS_SEC_MANUAL		61
    894 #define AIS_SEC_ESTIMATED	62
    895 #define AIS_SEC_INOPERATIVE	63
    896 	    unsigned int maneuver;	/* maneuver indicator */
    897 	    //unsigned int spare;	spare bits */
    898 	    bool raim;			/* RAIM flag */
    899 	    unsigned int radio;		/* radio status bits */
    900 	} type1;
    901 	/* Type 4 - Base Station Report & Type 11 - UTC and Date Response */
    902 	struct {
    903 	    unsigned int year;			/* UTC year */
    904 #define AIS_YEAR_NOT_AVAILABLE	0
    905 	    unsigned int month;			/* UTC month */
    906 #define AIS_MONTH_NOT_AVAILABLE	0
    907 	    unsigned int day;			/* UTC day */
    908 #define AIS_DAY_NOT_AVAILABLE	0
    909 	    unsigned int hour;			/* UTC hour */
    910 #define AIS_HOUR_NOT_AVAILABLE	24
    911 	    unsigned int minute;		/* UTC minute */
    912 #define AIS_MINUTE_NOT_AVAILABLE	60
    913 	    unsigned int second;		/* UTC second */
    914 #define AIS_SECOND_NOT_AVAILABLE	60
    915 	    bool accuracy;		/* fix quality */
    916 	    int lon;			/* longitude */
    917 	    int lat;			/* latitude */
    918 	    unsigned int epfd;		/* type of position fix device */
    919 	    //unsigned int spare;	spare bits */
    920 	    bool raim;			/* RAIM flag */
    921 	    unsigned int radio;		/* radio status bits */
    922 	} type4;
    923 	/* Type 5 - Ship static and voyage related data */
    924 	struct {
    925 	    unsigned int ais_version;	/* AIS version level */
    926 	    unsigned int imo;		/* IMO identification */
    927 	    char callsign[7+1];		/* callsign */
    928 #define AIS_SHIPNAME_MAXLEN	20
    929 	    char shipname[AIS_SHIPNAME_MAXLEN+1];	/* vessel name */
    930 	    unsigned int shiptype;	/* ship type code */
    931 	    unsigned int to_bow;	/* dimension to bow */
    932 	    unsigned int to_stern;	/* dimension to stern */
    933 	    unsigned int to_port;	/* dimension to port */
    934 	    unsigned int to_starboard;	/* dimension to starboard */
    935 	    unsigned int epfd;		/* type of position fix deviuce */
    936 	    unsigned int month;		/* UTC month */
    937 	    unsigned int day;		/* UTC day */
    938 	    unsigned int hour;		/* UTC hour */
    939 	    unsigned int minute;	/* UTC minute */
    940 	    unsigned int draught;	/* draft in meters */
    941 	    char destination[20+1];	/* ship destination */
    942 	    unsigned int dte;		/* data terminal enable */
    943 	    //unsigned int spare;	spare bits */
    944 	} type5;
    945 	/* Type 6 - Addressed Binary Message */
    946 	struct {
    947 	    unsigned int seqno;		/* sequence number */
    948 	    unsigned int dest_mmsi;	/* destination MMSI */
    949 	    bool retransmit;		/* retransmit flag */
    950 	    //unsigned int spare;	spare bit(s) */
    951 	    unsigned int dac;           /* Application ID */
    952 	    unsigned int fid;           /* Functional ID */
    953 #define AIS_TYPE6_BINARY_MAX	920	/* 920 bits */
    954 	    size_t bitcount;		/* bit count of the data */
    955 	    union {
    956 		char bitdata[(AIS_TYPE6_BINARY_MAX + 7) / 8];
    957 		/* IMO236 - Dangerous Cargo Indication */
    958 		struct {
    959 		    char lastport[5+1];		/* Last Port Of Call */
    960 		    unsigned int lmonth;	/* ETA month */
    961 		    unsigned int lday;		/* ETA day */
    962 		    unsigned int lhour;		/* ETA hour */
    963 		    unsigned int lminute;	/* ETA minute */
    964 		    char nextport[5+1];		/* Next Port Of Call */
    965 		    unsigned int nmonth;	/* ETA month */
    966 		    unsigned int nday;		/* ETA day */
    967 		    unsigned int nhour;		/* ETA hour */
    968 		    unsigned int nminute;	/* ETA minute */
    969 		    char dangerous[20+1];	/* Main Dangerous Good */
    970 		    char imdcat[4+1];		/* IMD Category */
    971 		    unsigned int unid;		/* UN Number */
    972 		    unsigned int amount;	/* Amount of Cargo */
    973 		    unsigned int unit;		/* Unit of Quantity */
    974 		} dac1fid12;
    975 		/* IMO236 - Extended Ship Static and Voyage Related Data */
    976 		struct {
    977 		    unsigned int airdraught;	/* Air Draught */
    978 		} dac1fid15;
    979 		/* IMO236 - Number of Persons on board */
    980 		struct {
    981 		    unsigned persons;	/* number of persons */
    982 		} dac1fid16;
    983 		/* IMO289 - Clearance Time To Enter Port */
    984 		struct {
    985 		    unsigned int linkage;	/* Message Linkage ID */
    986 		    unsigned int month;	/* Month (UTC) */
    987 		    unsigned int day;	/* Day (UTC) */
    988 		    unsigned int hour;	/* Hour (UTC) */
    989 		    unsigned int minute;	/* Minute (UTC) */
    990 		    char portname[20+1];	/* Name of Port & Berth */
    991 		    char destination[5+1];	/* Destination */
    992 		    signed int lon;	/* Longitude */
    993 		    signed int lat;	/* Latitude */
    994 		} dac1fid18;
    995 		/* IMO289 - Berthing Data (addressed) */
    996 		struct {
    997 		    unsigned int linkage;	/* Message Linkage ID */
    998 		    unsigned int berth_length;	/* Berth length */
    999 		    unsigned int berth_depth;	/* Berth Water Depth */
   1000 		    unsigned int position;	/* Mooring Position */
   1001 		    unsigned int month;	/* Month (UTC) */
   1002 		    unsigned int day;	/* Day (UTC) */
   1003 		    unsigned int hour;	/* Hour (UTC) */
   1004 		    unsigned int minute;	/* Minute (UTC) */
   1005 		    unsigned int availability;	/* Services Availability */
   1006 		    unsigned int agent;	/* Agent */
   1007 		    unsigned int fuel;	/* Bunker/fuel */
   1008 		    unsigned int chandler;	/* Chandler */
   1009 		    unsigned int stevedore;	/* Stevedore */
   1010 		    unsigned int electrical;	/* Electrical */
   1011 		    unsigned int water;	/* Potable water */
   1012 		    unsigned int customs;	/* Customs house */
   1013 		    unsigned int cartage;	/* Cartage */
   1014 		    unsigned int crane;	/* Crane(s) */
   1015 		    unsigned int lift;	/* Lift(s) */
   1016 		    unsigned int medical;	/* Medical facilities */
   1017 		    unsigned int navrepair;	/* Navigation repair */
   1018 		    unsigned int provisions;	/* Provisions */
   1019 		    unsigned int shiprepair;	/* Ship repair */
   1020 		    unsigned int surveyor;	/* Surveyor */
   1021 		    unsigned int steam;	/* Steam */
   1022 		    unsigned int tugs;	/* Tugs */
   1023 		    unsigned int solidwaste;	/* Waste disposal (solid) */
   1024 		    unsigned int liquidwaste;	/* Waste disposal (liquid) */
   1025 		    unsigned int hazardouswaste;	/* Waste disposal (hazardous) */
   1026 		    unsigned int ballast;	/* Reserved ballast exchange */
   1027 		    unsigned int additional;	/* Additional services */
   1028 		    unsigned int regional1;	/* Regional reserved 1 */
   1029 		    unsigned int regional2;	/* Regional reserved 2 */
   1030 		    unsigned int future1;	/* Reserved for future */
   1031 		    unsigned int future2;	/* Reserved for future */
   1032 		    char berth_name[20+1];	/* Name of Berth */
   1033 		    signed int berth_lon;	/* Longitude */
   1034 		    signed int berth_lat;	/* Latitude */
   1035 		} dac1fid20;
   1036 		/* IMO289 - Dangerous Cargo Indication */
   1037 		struct {
   1038 		    unsigned int unit;	/* Unit of Quantity */
   1039 		    unsigned int amount;	/* Amount of Cargo */
   1040 		    int ncargos;
   1041 		    struct cargo_t {
   1042 			unsigned int code;	/* Cargo code */
   1043 			unsigned int subtype;	/* Cargo subtype */
   1044 		    } cargos[28];
   1045 		} dac1fid25;
   1046 		/* IMO289 - Route info (addressed) */
   1047 		struct route_info dac1fid28;
   1048 		/* IMO289 - Text message (addressed) */
   1049 		struct {
   1050 		    unsigned int linkage;
   1051 #define AIS_DAC1FID30_TEXT_MAX	154	/* 920 bits of six-bit, plus NUL */
   1052 		    char text[AIS_DAC1FID30_TEXT_MAX];
   1053 		} dac1fid30;
   1054 		/* IMO289 & IMO236 - Tidal Window */
   1055 		struct {
   1056 		    unsigned int type;	/* Message Type */
   1057 		    unsigned int repeat;	/* Repeat Indicator */
   1058 		    unsigned int mmsi;	/* Source MMSI */
   1059 		    unsigned int seqno;	/* Sequence Number */
   1060 		    unsigned int dest_mmsi;	/* Destination MMSI */
   1061 		    signed int retransmit;	/* Retransmit flag */
   1062 		    unsigned int dac;	/* DAC */
   1063 		    unsigned int fid;	/* FID */
   1064 		    unsigned int month;	/* Month */
   1065 		    unsigned int day;	/* Day */
   1066 		    signed int ntidals;
   1067 		    struct tidal_t {
   1068 			signed int lon;	/* Longitude */
   1069 			signed int lat;	/* Latitude */
   1070 			unsigned int from_hour;	/* From UTC Hour */
   1071 			unsigned int from_min;	/* From UTC Minute */
   1072 			unsigned int to_hour;	/* To UTC Hour */
   1073 			unsigned int to_min;	/* To UTC Minute */
   1074 #define DAC1FID32_CDIR_NOT_AVAILABLE		360
   1075 			unsigned int cdir;	/* Current Dir. Predicted */
   1076 #define DAC1FID32_CSPEED_NOT_AVAILABLE		127
   1077 			unsigned int cspeed;	/* Current Speed Predicted */
   1078 		    } tidals[3];
   1079 		} dac1fid32;
   1080 	    };
   1081 	} type6;
   1082 	/* Type 7 - Binary Acknowledge */
   1083 	struct {
   1084 	    unsigned int mmsi1;
   1085 	    unsigned int mmsi2;
   1086 	    unsigned int mmsi3;
   1087 	    unsigned int mmsi4;
   1088 	    /* spares ignored, they're only padding here */
   1089 	} type7;
   1090 	/* Type 8 - Broadcast Binary Message */
   1091 	struct {
   1092 	    //unsigned int spare;	spare bit(s) */
   1093 	    unsigned int dac;       	/* Designated Area Code */
   1094 	    unsigned int fid;       	/* Functional ID */
   1095 #define AIS_TYPE8_BINARY_MAX	952	/* 952 bits */
   1096 	    size_t bitcount;		/* bit count of the data */
   1097 	    union {
   1098 		char bitdata[(AIS_TYPE8_BINARY_MAX + 7) / 8];
   1099 		/* IMO236 - Fairway Closed */
   1100 		struct {
   1101 		    char reason[20+1];	/* Reason For Closing */
   1102 		    char closefrom[20+1];	/* Location Of Closing From */
   1103 		    char closeto[20+1];	/* Location of Closing To */
   1104 		    unsigned int radius;	/* Radius extension */
   1105 #define AIS_DAC1FID13_RADIUS_NOT_AVAILABLE 10001
   1106 		    unsigned int extunit;	/* Unit of extension */
   1107 #define AIS_DAC1FID13_EXTUNIT_NOT_AVAILABLE 0
   1108 		    unsigned int fday;	/* From day (UTC) */
   1109 		    unsigned int fmonth;	/* From month (UTC) */
   1110 		    unsigned int fhour;	/* From hour (UTC) */
   1111 		    unsigned int fminute;	/* From minute (UTC) */
   1112 		    unsigned int tday;	/* To day (UTC) */
   1113 		    unsigned int tmonth;	/* To month (UTC) */
   1114 		    unsigned int thour;	/* To hour (UTC) */
   1115 		    unsigned int tminute;	/* To minute (UTC) */
   1116 		} dac1fid13;
   1117 	        /* IMO236 - Extended ship and voyage data */
   1118 		struct {
   1119 		    unsigned int airdraught;	/* Air Draught */
   1120 		} dac1fid15;
   1121 		/* IMO289 - VTS-generated/Synthetic Targets */
   1122 		struct {
   1123 		    signed int ntargets;
   1124 		    struct target_t {
   1125 #define DAC1FID17_IDTYPE_MMSI		0
   1126 #define DAC1FID17_IDTYPE_IMO		1
   1127 #define DAC1FID17_IDTYPE_CALLSIGN	2
   1128 #define DAC1FID17_IDTYPE_OTHER		3
   1129 			unsigned int idtype;	/* Identifier type */
   1130 			union target_id {	/* Target identifier */
   1131 			    unsigned int mmsi;
   1132 			    unsigned int imo;
   1133 #define DAC1FID17_ID_LENGTH		7
   1134 			    char callsign[DAC1FID17_ID_LENGTH+1];
   1135 			    char other[DAC1FID17_ID_LENGTH+1];
   1136 			} id;
   1137 			signed int lat;		/* Latitude */
   1138 			signed int lon;		/* Longitude */
   1139 #define DAC1FID17_COURSE_NOT_AVAILABLE		360
   1140 			unsigned int course;	/* Course Over Ground */
   1141 			unsigned int second;	/* Time Stamp */
   1142 #define DAC1FID17_SPEED_NOT_AVAILABLE		255
   1143 			unsigned int speed;	/* Speed Over Ground */
   1144 		    } targets[4];
   1145 		} dac1fid17;
   1146 		/* IMO 289 - Marine Traffic Signal */
   1147 		struct {
   1148 		    unsigned int linkage;	/* Message Linkage ID */
   1149 		    char station[20+1];		/* Name of Signal Station */
   1150 		    signed int lon;		/* Longitude */
   1151 		    signed int lat;		/* Latitude */
   1152 		    unsigned int status;	/* Status of Signal */
   1153 		    unsigned int signal;	/* Signal In Service */
   1154 		    unsigned int hour;		/* UTC hour */
   1155 		    unsigned int minute;	/* UTC minute */
   1156 		    unsigned int nextsignal;	/* Expected Next Signal */
   1157 		} dac1fid19;
   1158 		/* IMO289 - Route info (broadcast) */
   1159 		struct route_info dac1fid27;
   1160 		/* IMO289 - Text message (broadcast) */
   1161 		struct {
   1162 		    unsigned int linkage;
   1163 #define AIS_DAC1FID29_TEXT_MAX	162	/* 920 bits of six-bit, plus NUL */
   1164 		    char text[AIS_DAC1FID29_TEXT_MAX];
   1165 		} dac1fid29;
   1166 		/* IMO236 & IMO289 - Meteorological-Hydrological data */
   1167 		struct {
   1168 		    bool accuracy;	/* position accuracy, <10m if true */
   1169 #define DAC1FID31_LATLON_SCALE	1000
   1170 		    int lon;		/* longitude in minutes * .001 */
   1171 #define DAC1FID31_LON_NOT_AVAILABLE	(181*60*DAC1FID31_LATLON_SCALE)
   1172 		    int lat;		/* longitude in minutes * .001 */
   1173 #define DAC1FID31_LAT_NOT_AVAILABLE	(91*60*DAC1FID31_LATLON_SCALE)
   1174 		    unsigned int day;		/* UTC day */
   1175 		    unsigned int hour;		/* UTC hour */
   1176 		    unsigned int minute;	/* UTC minute */
   1177 		    unsigned int wspeed;	/* average wind speed */
   1178 		    unsigned int wgust;		/* wind gust */
   1179 #define DAC1FID31_WIND_HIGH			126
   1180 #define DAC1FID31_WIND_NOT_AVAILABLE		127
   1181 		    unsigned int wdir;		/* wind direction */
   1182 		    unsigned int wgustdir;	/* wind gust direction */
   1183 #define DAC1FID31_DIR_NOT_AVAILABLE		360
   1184 		    int airtemp;		/* temperature, units 0.1C */
   1185 #define DAC1FID31_AIRTEMP_NOT_AVAILABLE		-1084
   1186 		    unsigned int humidity;	/* relative humidity, % */
   1187 #define DAC1FID31_HUMIDITY_NOT_AVAILABLE	101
   1188 		    int dewpoint;		/* dew point, units 0.1C */
   1189 #define DAC1FID31_DEWPOINT_NOT_AVAILABLE	501
   1190 		    unsigned int pressure;	/* air pressure, hpa */
   1191 #define DAC1FID31_PRESSURE_NOT_AVAILABLE	511
   1192 #define DAC1FID31_PRESSURE_HIGH			402
   1193 		    unsigned int pressuretend;	/* tendency */
   1194 #define DAC1FID31_PRESSURETREND_NOT_AVAILABLE	3
   1195 		    bool visgreater;            /* visibility greater than */
   1196 		    unsigned int visibility;	/* units 0.1 nautical miles */
   1197 #define DAC1FID31_VISIBILITY_NOT_AVAILABLE	127
   1198 		    int waterlevel;		/* decimeters or cm */
   1199 #define DAC1FID11_WATERLEVEL_NOT_AVAILABLE	4001
   1200 #define DAC1FID31_WATERLEVEL_NOT_AVAILABLE	40001
   1201 		    unsigned int leveltrend;	/* water level trend code */
   1202 #define DAC1FID31_LEVELTREND_NOT_AVAILABLE	3
   1203 		    unsigned int cspeed;	/* current speed in deciknots */
   1204 #define DAC1FID31_CSPEED_NOT_AVAILABLE		255
   1205 		    unsigned int cdir;		/* current dir., degrees */
   1206 		    unsigned int cspeed2;	/* current speed in deciknots */
   1207 		    unsigned int cdir2;		/* current dir., degrees */
   1208 		    unsigned int cdepth2;	/* measurement depth, 0.1m */
   1209 #define DAC1FID31_CDEPTH_NOT_AVAILABLE		301
   1210 		    unsigned int cspeed3;	/* current speed in deciknots */
   1211 		    unsigned int cdir3;		/* current dir., degrees */
   1212 		    unsigned int cdepth3;	/* measurement depth, 0.1m */
   1213 		    unsigned int waveheight;	/* in decimeters */
   1214 #define DAC1FID31_HEIGHT_NOT_AVAILABLE		31
   1215 		    unsigned int waveperiod;	/* in seconds */
   1216 #define DAC1FID31_PERIOD_NOT_AVAILABLE		63
   1217 		    unsigned int wavedir;	/* direction in degrees */
   1218 		    unsigned int swellheight;	/* in decimeters */
   1219 		    unsigned int swellperiod;	/* in seconds */
   1220 		    unsigned int swelldir;	/* direction in degrees */
   1221 		    unsigned int seastate;	/* Beaufort scale, 0-12 */
   1222 #define DAC1FID31_SEASTATE_NOT_AVAILABLE	15
   1223 		    int watertemp;		/* units 0.1deg Celsius */
   1224 #define DAC1FID31_PRECIPTYPE_NOT_AVAILABLE	7
   1225 		    unsigned int preciptype;	/* 0-7, enumerated */
   1226 		    unsigned int salinity;	/* units of 0.1% */
   1227 #define DAC1FID31_SALINITY_NOT_AVAILABLE	510
   1228 		    bool ice;			/* is there sea ice? */
   1229 		} dac1fid31;
   1230 	    };
   1231 	} type8;
   1232 	/* Type 9 - Standard SAR Aircraft Position Report */
   1233 	struct {
   1234 	    unsigned int alt;		/* altitude in meters */
   1235 #define AIS_ALT_NOT_AVAILABLE	4095
   1236 #define AIS_ALT_HIGH    	4094	/* 4094 meters or higher */
   1237 	    unsigned int speed;		/* speed over ground in deciknots */
   1238 #define AIS_SAR_SPEED_NOT_AVAILABLE	1023
   1239 #define AIS_SAR_FAST_MOVER  	1022
   1240 	    bool accuracy;		/* position accuracy */
   1241 	    int lon;			/* longitude */
   1242 	    int lat;			/* latitude */
   1243 	    unsigned int course;	/* course over ground */
   1244 	    unsigned int second;	/* seconds of UTC timestamp */
   1245 	    unsigned int regional;	/* regional reserved */
   1246 	    unsigned int dte;		/* data terminal enable */
   1247 	    //unsigned int spare;	spare bits */
   1248 	    bool assigned;		/* assigned-mode flag */
   1249 	    bool raim;			/* RAIM flag */
   1250 	    unsigned int radio;		/* radio status bits */
   1251 	} type9;
   1252 	/* Type 10 - UTC/Date Inquiry */
   1253 	struct {
   1254 	    //unsigned int spare;
   1255 	    unsigned int dest_mmsi;	/* destination MMSI */
   1256 	    //unsigned int spare2;
   1257 	} type10;
   1258 	/* Type 12 - Safety-Related Message */
   1259 	struct {
   1260 	    unsigned int seqno;		/* sequence number */
   1261 	    unsigned int dest_mmsi;	/* destination MMSI */
   1262 	    bool retransmit;		/* retransmit flag */
   1263 	    //unsigned int spare;	spare bit(s) */
   1264 #define AIS_TYPE12_TEXT_MAX	157	/* 936 bits of six-bit, plus NUL */
   1265 	    char text[AIS_TYPE12_TEXT_MAX];
   1266 	} type12;
   1267 	/* Type 14 - Safety-Related Broadcast Message */
   1268 	struct {
   1269 	    //unsigned int spare;	spare bit(s) */
   1270 #define AIS_TYPE14_TEXT_MAX	161	/* 952 bits of six-bit, plus NUL */
   1271 	    char text[AIS_TYPE14_TEXT_MAX];
   1272 	} type14;
   1273 	/* Type 15 - Interrogation */
   1274 	struct {
   1275 	    //unsigned int spare;	spare bit(s) */
   1276 	    unsigned int mmsi1;
   1277 	    unsigned int type1_1;
   1278 	    unsigned int offset1_1;
   1279 	    //unsigned int spare2;	spare bit(s) */
   1280 	    unsigned int type1_2;
   1281 	    unsigned int offset1_2;
   1282 	    //unsigned int spare3;	spare bit(s) */
   1283 	    unsigned int mmsi2;
   1284 	    unsigned int type2_1;
   1285 	    unsigned int offset2_1;
   1286 	    //unsigned int spare4;	spare bit(s) */
   1287 	} type15;
   1288 	/* Type 16 - Assigned Mode Command */
   1289 	struct {
   1290 	    //unsigned int spare;	spare bit(s) */
   1291 	    unsigned int mmsi1;
   1292 	    unsigned int offset1;
   1293 	    unsigned int increment1;
   1294 	    unsigned int mmsi2;
   1295 	    unsigned int offset2;
   1296 	    unsigned int increment2;
   1297 	} type16;
   1298 	/* Type 17 - GNSS Broadcast Binary Message */
   1299 	struct {
   1300 	    //unsigned int spare;	spare bit(s) */
   1301 #define AIS_GNSS_LATLON_SCALE	600.0
   1302 	    int lon;			/* longitude */
   1303 	    int lat;			/* latitude */
   1304 	    //unsigned int spare2;	spare bit(s) */
   1305 #define AIS_TYPE17_BINARY_MAX	736	/* 920 bits */
   1306 	    size_t bitcount;		/* bit count of the data */
   1307 	    char bitdata[(AIS_TYPE17_BINARY_MAX + 7) / 8];
   1308 	} type17;
   1309 	/* Type 18 - Standard Class B CS Position Report */
   1310 	struct {
   1311 	    unsigned int reserved;	/* altitude in meters */
   1312 	    unsigned int speed;		/* speed over ground in deciknots */
   1313 	    bool accuracy;		/* position accuracy */
   1314 	    int lon;			/* longitude */
   1315 #define AIS_GNS_LON_NOT_AVAILABLE	0x1a838
   1316 	    int lat;			/* latitude */
   1317 #define AIS_GNS_LAT_NOT_AVAILABLE	0xd548
   1318 	    unsigned int course;	/* course over ground */
   1319 	    unsigned int heading;	/* true heading */
   1320 	    unsigned int second;	/* seconds of UTC timestamp */
   1321 	    unsigned int regional;	/* regional reserved */
   1322 	    bool cs;     		/* carrier sense unit flag */
   1323 	    bool display;		/* unit has attached display? */
   1324 	    bool dsc;   		/* unit attached to radio with DSC? */
   1325 	    bool band;   		/* unit can switch frequency bands? */
   1326 	    bool msg22;	        	/* can accept Message 22 management? */
   1327 	    bool assigned;		/* assigned-mode flag */
   1328 	    bool raim;			/* RAIM flag */
   1329 	    unsigned int radio;		/* radio status bits */
   1330 	} type18;
   1331 	/* Type 19 - Extended Class B CS Position Report */
   1332 	struct {
   1333 	    unsigned int reserved;	/* altitude in meters */
   1334 	    unsigned int speed;		/* speed over ground in deciknots */
   1335 	    bool accuracy;		/* position accuracy */
   1336 	    int lon;			/* longitude */
   1337 	    int lat;			/* latitude */
   1338 	    unsigned int course;	/* course over ground */
   1339 	    unsigned int heading;	/* true heading */
   1340 	    unsigned int second;	/* seconds of UTC timestamp */
   1341 	    unsigned int regional;	/* regional reserved */
   1342 	    char shipname[AIS_SHIPNAME_MAXLEN+1];		/* ship name */
   1343 	    unsigned int shiptype;	/* ship type code */
   1344 	    unsigned int to_bow;	/* dimension to bow */
   1345 	    unsigned int to_stern;	/* dimension to stern */
   1346 	    unsigned int to_port;	/* dimension to port */
   1347 	    unsigned int to_starboard;	/* dimension to starboard */
   1348 	    unsigned int epfd;		/* type of position fix deviuce */
   1349 	    bool raim;			/* RAIM flag */
   1350 	    unsigned int dte;    	/* date terminal enable */
   1351 	    bool assigned;		/* assigned-mode flag */
   1352 	    //unsigned int spare;	spare bits */
   1353 	} type19;
   1354 	/* Type 20 - Data Link Management Message */
   1355 	struct {
   1356 	    //unsigned int spare;	spare bit(s) */
   1357 	    unsigned int offset1;	/* TDMA slot offset */
   1358 	    unsigned int number1;	/* number of xlots to allocate */
   1359 	    unsigned int timeout1;	/* allocation timeout */
   1360 	    unsigned int increment1;	/* repeat increment */
   1361 	    unsigned int offset2;	/* TDMA slot offset */
   1362 	    unsigned int number2;	/* number of xlots to allocate */
   1363 	    unsigned int timeout2;	/* allocation timeout */
   1364 	    unsigned int increment2;	/* repeat increment */
   1365 	    unsigned int offset3;	/* TDMA slot offset */
   1366 	    unsigned int number3;	/* number of xlots to allocate */
   1367 	    unsigned int timeout3;	/* allocation timeout */
   1368 	    unsigned int increment3;	/* repeat increment */
   1369 	    unsigned int offset4;	/* TDMA slot offset */
   1370 	    unsigned int number4;	/* number of xlots to allocate */
   1371 	    unsigned int timeout4;	/* allocation timeout */
   1372 	    unsigned int increment4;	/* repeat increment */
   1373 	} type20;
   1374 	/* Type 21 - Aids to Navigation Report */
   1375 	struct {
   1376 	    unsigned int aid_type;	/* aid type */
   1377 	    char name[35];		/* name of aid to navigation */
   1378 	    bool accuracy;		/* position accuracy */
   1379 	    int lon;			/* longitude */
   1380 	    int lat;			/* latitude */
   1381 	    unsigned int to_bow;	/* dimension to bow */
   1382 	    unsigned int to_stern;	/* dimension to stern */
   1383 	    unsigned int to_port;	/* dimension to port */
   1384 	    unsigned int to_starboard;	/* dimension to starboard */
   1385 	    unsigned int epfd;		/* type of EPFD */
   1386 	    unsigned int second;	/* second of UTC timestamp */
   1387 	    bool off_position;		/* off-position indicator */
   1388 	    unsigned int regional;	/* regional reserved field */
   1389 	    bool raim;			/* RAIM flag */
   1390 	    bool virtual_aid;		/* is virtual station? */
   1391 	    bool assigned;		/* assigned-mode flag */
   1392 	    //unsigned int spare;	unused */
   1393 	} type21;
   1394 	/* Type 22 - Channel Management */
   1395 	struct {
   1396 	    //unsigned int spare;	spare bit(s) */
   1397 	    unsigned int channel_a;	/* Channel A number */
   1398 	    unsigned int channel_b;	/* Channel B number */
   1399 	    unsigned int txrx;		/* transmit/receive mode */
   1400 	    bool power;			/* high-power flag */
   1401 #define AIS_CHANNEL_LATLON_SCALE	600.0
   1402 	    union {
   1403 		struct {
   1404 		    int ne_lon;		/* NE corner longitude */
   1405 		    int ne_lat;		/* NE corner latitude */
   1406 		    int sw_lon;		/* SW corner longitude */
   1407 		    int sw_lat;		/* SW corner latitude */
   1408 		} area;
   1409 		struct {
   1410 		    unsigned int dest1;	/* addressed station MMSI 1 */
   1411 		    unsigned int dest2;	/* addressed station MMSI 2 */
   1412 		} mmsi;
   1413 	    };
   1414 	    bool addressed;		/* addressed vs. broadast flag */
   1415 	    bool band_a;		/* fix 1.5kHz band for channel A */
   1416 	    bool band_b;		/* fix 1.5kHz band for channel B */
   1417 	    unsigned int zonesize;	/* size of transitional zone */
   1418 	} type22;
   1419 	/* Type 23 - Group Assignment Command */
   1420 	struct {
   1421 	    int ne_lon;			/* NE corner longitude */
   1422 	    int ne_lat;			/* NE corner latitude */
   1423 	    int sw_lon;			/* SW corner longitude */
   1424 	    int sw_lat;			/* SW corner latitude */
   1425 	    //unsigned int spare;	spare bit(s) */
   1426 	    unsigned int stationtype;	/* station type code */
   1427 	    unsigned int shiptype;	/* ship type code */
   1428 	    //unsigned int spare2;	spare bit(s) */
   1429 	    unsigned int txrx;		/* transmit-enable code */
   1430 	    unsigned int interval;	/* report interval */
   1431 	    unsigned int quiet;		/* quiet time */
   1432 	    //unsigned int spare3;	spare bit(s) */
   1433 	} type23;
   1434 	/* Type 24 - Class B CS Static Data Report */
   1435 	struct {
   1436 	    char shipname[AIS_SHIPNAME_MAXLEN+1];	/* vessel name */
   1437 	    unsigned int shiptype;	/* ship type code */
   1438 	    char vendorid[8];		/* vendor ID */
   1439 	    char callsign[8];		/* callsign */
   1440 	    union {
   1441 		unsigned int mothership_mmsi;	/* MMSI of main vessel */
   1442 		struct {
   1443 		    unsigned int to_bow;	/* dimension to bow */
   1444 		    unsigned int to_stern;	/* dimension to stern */
   1445 		    unsigned int to_port;	/* dimension to port */
   1446 		    unsigned int to_starboard;	/* dimension to starboard */
   1447 		} dim;
   1448 	    };
   1449 	} type24;
   1450 	/* Type 25 - Addressed Binary Message */
   1451 	struct {
   1452 	    bool addressed;		/* addressed-vs.broadcast flag */
   1453 	    bool structured;		/* structured-binary flag */
   1454 	    unsigned int dest_mmsi;	/* destination MMSI */
   1455 	    unsigned int app_id;        /* Application ID */
   1456 #define AIS_TYPE25_BINARY_MAX	128	/* Up to 128 bits */
   1457 	    size_t bitcount;		/* bit count of the data */
   1458 	    char bitdata[(AIS_TYPE25_BINARY_MAX + 7) / 8];
   1459 	} type25;
   1460 	/* Type 26 - Addressed Binary Message */
   1461 	struct {
   1462 	    bool addressed;		/* addressed-vs.broadcast flag */
   1463 	    bool structured;		/* structured-binary flag */
   1464 	    unsigned int dest_mmsi;	/* destination MMSI */
   1465 	    unsigned int app_id;        /* Application ID */
   1466 #define AIS_TYPE26_BINARY_MAX	1004	/* Up to 128 bits */
   1467 	    size_t bitcount;		/* bit count of the data */
   1468 	    char bitdata[(AIS_TYPE26_BINARY_MAX + 7) / 8];
   1469 	    unsigned int radio;		/* radio status bits */
   1470 	} type26;
   1471 	/* Type 27 - Long Range AIS Broadcast message */
   1472 	struct {
   1473 	    bool accuracy;		/* position accuracy */
   1474 	    bool raim;			/* RAIM flag */
   1475 	    unsigned int status;	/* navigation status */
   1476 #define AIS_LONGRANGE_LATLON_SCALE	600.0
   1477 	    int lon;			/* longitude */
   1478 #define AIS_LONGRANGE_LON_NOT_AVAILABLE	0x1a838
   1479 	    int lat;			/* latitude */
   1480 #define AIS_LONGRANGE_LAT_NOT_AVAILABLE	0xd548
   1481 	    unsigned int speed;		/* speed over ground in deciknots */
   1482 #define AIS_LONGRANGE_SPEED_NOT_AVAILABLE 63
   1483 	    unsigned int course;	/* course over ground */
   1484 #define AIS_LONGRANGE_COURSE_NOT_AVAILABLE 511
   1485 	    bool gnss;			/* are we reporting GNSS position? */
   1486 	} type27;
   1487     };
   1488 };
   1489 
   1490 struct attitude_t {
   1491     double heading;
   1492     double pitch;
   1493     double roll;
   1494     double yaw;
   1495     double dip;
   1496     double mag_len; /* unitvector sqrt(x^2 + y^2 +z^2) */
   1497     double mag_x;
   1498     double mag_y;
   1499     double mag_z;
   1500     double acc_len; /* unitvector sqrt(x^2 + y^2 +z^2) */
   1501     double acc_x;
   1502     double acc_y;
   1503     double acc_z;
   1504     double gyro_x;
   1505     double gyro_y;
   1506     double temp;
   1507     double depth;
   1508     /* compass status -- TrueNorth (and any similar) devices only */
   1509     char mag_st;
   1510     char pitch_st;
   1511     char roll_st;
   1512     char yaw_st;
   1513 };
   1514 
   1515 struct dop_t {
   1516     /* Dilution of precision factors */
   1517     double xdop, ydop, pdop, hdop, vdop, tdop, gdop;
   1518 };
   1519 
   1520 struct rawdata_t {
   1521     /* raw measurement data */
   1522     double codephase[MAXCHANNELS];	/* meters */
   1523     double carrierphase[MAXCHANNELS];	/* meters */
   1524     double pseudorange[MAXCHANNELS];	/* meters */
   1525     double deltarange[MAXCHANNELS];	/* meters/sec */
   1526     double doppler[MAXCHANNELS];	/* Hz */
   1527     double mtime[MAXCHANNELS];		/* sec */
   1528     unsigned satstat[MAXCHANNELS];	/* tracking status */
   1529 #define SAT_ACQUIRED	0x01		/* satellite acquired */
   1530 #define SAT_CODE_TRACK	0x02		/* code-tracking loop acquired */
   1531 #define SAT_CARR_TRACK	0x04		/* carrier-tracking loop acquired */
   1532 #define SAT_DATA_SYNC	0x08		/* data-bit synchronization done */
   1533 #define SAT_FRAME_SYNC	0x10		/* frame synchronization done */
   1534 #define SAT_EPHEMERIS	0x20		/* ephemeris collected */
   1535 #define SAT_FIX_USED	0x40		/* used for position fix */
   1536 };
   1537 
   1538 struct version_t {
   1539     char release[64];			/* external version */
   1540     char rev[64];			/* internal revision ID */
   1541     int proto_major, proto_minor;	/* API major and minor versions */
   1542     char remote[GPS_PATH_MAX];		/* could be from a remote device */
   1543 };
   1544 
   1545 struct devconfig_t {
   1546     char path[GPS_PATH_MAX];
   1547     int flags;
   1548 #define SEEN_GPS 	0x01
   1549 #define SEEN_RTCM2	0x02
   1550 #define SEEN_RTCM3	0x04
   1551 #define SEEN_AIS 	0x08
   1552     char driver[64];
   1553     char subtype[64];
   1554     double activated;
   1555     unsigned int baudrate, stopbits;	/* RS232 link parameters */
   1556     char parity;			/* 'N', 'O', or 'E' */
   1557     double cycle, mincycle;     	/* refresh cycle time in seconds */
   1558     int driver_mode;    		/* is driver in native mode or not? */
   1559 };
   1560 
   1561 struct policy_t {
   1562     bool watcher;			/* is watcher mode on? */
   1563     bool json;				/* requesting JSON? */
   1564     bool nmea;				/* requesting dumping as NMEA? */
   1565     int raw;				/* requesting raw data? */
   1566     bool scaled;			/* requesting report scaling? */
   1567     bool timing;			/* requesting timing info */
   1568     int loglevel;			/* requested log level of messages */
   1569     char devpath[GPS_PATH_MAX];		/* specific device to watch */
   1570     char remote[GPS_PATH_MAX];		/* ...if this was passthrough */
   1571 };
   1572 
   1573 /*
   1574  * Someday we may support Windows, under which socket_t is a separate type.
   1575  * In the meantime, having a typedef for this semantic kind is no bad thing,
   1576  * as it makes clearer what some declarations are doing without breaking
   1577  * binary compatibility.
   1578  */
   1579 typedef int socket_t;
   1580 
   1581 /* mode flags for setting streaming policy */
   1582 #define WATCH_ENABLE	0x000001u	/* enable streaming */
   1583 #define WATCH_DISABLE	0x000002u	/* disable watching */
   1584 #define WATCH_JSON	0x000010u	/* JSON output */
   1585 #define WATCH_NMEA	0x000020u	/* output in NMEA */
   1586 #define WATCH_RARE	0x000040u	/* output of packets in hex */
   1587 #define WATCH_RAW	0x000080u	/* output of raw packets */
   1588 #define WATCH_SCALED	0x000100u	/* scale output to floats */
   1589 #define WATCH_TIMING	0x000200u	/* timing information */
   1590 #define WATCH_DEVICE	0x000800u	/* watch specific device */
   1591 #define WATCH_NEWSTYLE	0x010000u	/* force JSON streaming */
   1592 #define WATCH_OLDSTYLE	0x020000u	/* force old-style streaming */
   1593 
   1594 /*
   1595  * Main structure that includes all previous substructures
   1596  */
   1597 
   1598 struct gps_data_t {
   1599     gps_mask_t set;	/* has field been set since this was last cleared? */
   1600 #define ONLINE_SET	(1llu<<1)
   1601 #define TIME_SET	(1llu<<2)
   1602 #define TIMERR_SET	(1llu<<3)
   1603 #define LATLON_SET	(1llu<<4)
   1604 #define ALTITUDE_SET	(1llu<<5)
   1605 #define SPEED_SET	(1llu<<6)
   1606 #define TRACK_SET	(1llu<<7)
   1607 #define CLIMB_SET	(1llu<<8)
   1608 #define STATUS_SET	(1llu<<9)
   1609 #define MODE_SET	(1llu<<10)
   1610 #define DOP_SET  	(1llu<<11)
   1611 #define HERR_SET	(1llu<<12)
   1612 #define VERR_SET	(1llu<<13)
   1613 #define ATTITUDE_SET	(1llu<<14)
   1614 #define SATELLITE_SET	(1llu<<15)
   1615 #define SPEEDERR_SET	(1llu<<16)
   1616 #define TRACKERR_SET	(1llu<<17)
   1617 #define CLIMBERR_SET	(1llu<<18)
   1618 #define DEVICE_SET	(1llu<<19)
   1619 #define DEVICELIST_SET	(1llu<<20)
   1620 #define DEVICEID_SET	(1llu<<21)
   1621 #define RTCM2_SET	(1llu<<22)
   1622 #define RTCM3_SET	(1llu<<23)
   1623 #define AIS_SET 	(1llu<<24)
   1624 #define PACKET_SET	(1llu<<25)
   1625 #define SUBFRAME_SET	(1llu<<26)
   1626 #define GST_SET 	(1llu<<27)
   1627 #define VERSION_SET	(1llu<<28)
   1628 #define POLICY_SET	(1llu<<29)
   1629 #define LOGMESSAGE_SET	(1llu<<30)
   1630 #define ERROR_SET	(1llu<<31)
   1631 #define SET_HIGH_BIT	31
   1632     timestamp_t online;		/* NZ if GPS is on line, 0 if not.
   1633 				 *
   1634 				 * Note: gpsd clears this time when sentences
   1635 				 * fail to show up within the GPS's normal
   1636 				 * send cycle time. If the host-to-GPS
   1637 				 * link is lossy enough to drop entire
   1638 				 * sentences, this field will be
   1639 				 * prone to false zero values.
   1640 				 */
   1641 
   1642 #ifndef USE_QT
   1643     socket_t gps_fd;		/* socket or file descriptor to GPS */
   1644 #else
   1645     void* gps_fd;
   1646 #endif
   1647     struct gps_fix_t	fix;	/* accumulated PVT data */
   1648 
   1649     double separation;		/* Geoidal separation, MSL - WGS84 (Meters) */
   1650 
   1651     /* GPS status -- always valid */
   1652     int    status;		/* Do we have a fix? */
   1653 #define STATUS_NO_FIX	0	/* no */
   1654 #define STATUS_FIX	1	/* yes, without DGPS */
   1655 #define STATUS_DGPS_FIX	2	/* yes, with DGPS */
   1656 
   1657     /* precision of fix -- valid if satellites_used > 0 */
   1658     int satellites_used;	/* Number of satellites used in solution */
   1659     int used[MAXCHANNELS];	/* PRNs of satellites used in solution */
   1660     struct dop_t dop;
   1661 
   1662     /* redundant with the estimate elements in the fix structure */
   1663     double epe;  /* spherical position error, 95% confidence (meters)  */
   1664 
   1665     /* satellite status -- valid when satellites_visible > 0 */
   1666     timestamp_t skyview_time;	/* skyview timestamp */
   1667     int satellites_visible;	/* # of satellites in view */
   1668     int PRN[MAXCHANNELS];	/* PRNs of satellite */
   1669     int elevation[MAXCHANNELS];	/* elevation of satellite */
   1670     int azimuth[MAXCHANNELS];	/* azimuth */
   1671     double ss[MAXCHANNELS];	/* signal-to-noise ratio (dB) */
   1672 
   1673     struct devconfig_t dev;	/* device that shipped last update */
   1674 
   1675     struct policy_t policy;	/* our listening policy */
   1676 
   1677     /* should be moved to privdata sometday */
   1678     char tag[MAXTAGLEN+1];	/* tag of last sentence processed */
   1679 
   1680     /* pack things never reported together to reduce structure size */
   1681 #define UNION_SET	(RTCM2_SET|RTCM3_SET|SUBFRAME_SET|AIS_SET|ATTITUDE_SET|VERSION_SET|DEVICELIST_SET|LOGMESSAGE_SET|ERROR_SET|GST_SET|VERSION_SET)
   1682     union {
   1683 	/* unusual forms of sensor data that might come up the pipe */
   1684 	struct rtcm2_t	rtcm2;
   1685 	struct rtcm3_t	rtcm3;
   1686 	struct subframe_t subframe;
   1687 	struct ais_t ais;
   1688 	struct attitude_t attitude;
   1689 	struct rawdata_t raw;
   1690 	struct gst_t gst;
   1691 	/* "artificial" structures for various protocol responses */
   1692 	struct version_t version;
   1693 	struct {
   1694 	    timestamp_t time;
   1695 	    int ndevices;
   1696 	    struct devconfig_t list[MAXUSERDEVS];
   1697 	} devices;
   1698 	char error[256];
   1699     };
   1700 
   1701     /* Private data - client code must not set this */
   1702     void *privdata;
   1703 };
   1704 
   1705 extern int gps_open(/*@null@*/const char *, /*@null@*/const char *,
   1706 		      /*@out@*/struct gps_data_t *);
   1707 extern int gps_close(struct gps_data_t *);
   1708 extern int gps_send(struct gps_data_t *, const char *, ... );
   1709 extern int gps_read(/*@out@*/struct gps_data_t *);
   1710 extern int gps_unpack(char *, struct gps_data_t *);
   1711 extern bool gps_waiting(const struct gps_data_t *, int);
   1712 extern int gps_stream(struct gps_data_t *, unsigned int, /*@null@*/void *);
   1713 extern const char /*@observer@*/ *gps_data(const struct gps_data_t *);
   1714 extern const char /*@observer@*/ *gps_errstr(const int);
   1715 
   1716 extern int gps_sock_open(/*@null@*/const char *, /*@null@*/const char *,
   1717 		      /*@out@*/struct gps_data_t *);
   1718 extern int gps_sock_read(/*@out@*/struct gps_data_t *);
   1719 extern int gps_sock_close(struct gps_data_t *);
   1720 extern int gps_sock_send(struct gps_data_t *, const char *);
   1721 extern int gps_shm_open(/*@out@*/struct gps_data_t *);
   1722 extern int gps_shm_read(struct gps_data_t *);
   1723 extern bool gps_sock_waiting(const struct gps_data_t *, int);
   1724 extern int gps_sock_stream(struct gps_data_t *, unsigned int, /*@null@*/void *);
   1725 extern const char /*@observer@*/ *gps_sock_data(const struct gps_data_t *);
   1726 extern void gps_shm_close(struct gps_data_t *);
   1727 
   1728 extern void libgps_trace(int errlevel, const char *, ...);
   1729 
   1730 /* dependencies on struct gpsdata_t end hrere */
   1731 
   1732 extern void gps_clear_fix(/*@ out @*/struct gps_fix_t *);
   1733 extern void gps_clear_dop( /*@out@*/ struct dop_t *);
   1734 extern void gps_merge_fix(/*@ out @*/struct gps_fix_t *,
   1735 			  gps_mask_t,
   1736 			  /*@ in @*/struct gps_fix_t *);
   1737 extern void gps_enable_debug(int, FILE *);
   1738 extern /*@observer@*/const char *gps_maskdump(gps_mask_t);
   1739 
   1740 extern double safe_atof(const char *);
   1741 extern time_t mkgmtime(register struct tm *);
   1742 extern timestamp_t timestamp(void);
   1743 extern timestamp_t iso8601_to_unix(char *);
   1744 extern /*@observer@*/char *unix_to_iso8601(timestamp_t t, /*@ out @*/char[], size_t len);
   1745 extern double earth_distance(double, double, double, double);
   1746 extern double earth_distance_and_bearings(double, double, double, double,
   1747 					  /*@null@*//*@out@*/double *,
   1748 					  /*@null@*//*@out@*/double *);
   1749 extern double wgs84_separation(double, double);
   1750 
   1751 /* some multipliers for interpreting GPS output */
   1752 #define METERS_TO_FEET	3.2808399	/* Meters to U.S./British feet */
   1753 #define METERS_TO_MILES	0.00062137119	/* Meters to miles */
   1754 #define KNOTS_TO_MPH	1.1507794	/* Knots to miles per hour */
   1755 #define KNOTS_TO_KPH	1.852		/* Knots to kilometers per hour */
   1756 #define KNOTS_TO_MPS	0.51444444	/* Knots to meters per second */
   1757 #define MPS_TO_KPH	3.6		/* Meters per second to klicks/hr */
   1758 #define MPS_TO_MPH	2.2369363	/* Meters/second to miles per hour */
   1759 #define MPS_TO_KNOTS	1.9438445	/* Meters per second to knots */
   1760 /* miles and knots are both the international standard versions of the units */
   1761 
   1762 /* angle conversion multipliers */
   1763 #define GPS_PI      	3.1415926535897932384626433832795029
   1764 #define RAD_2_DEG	57.2957795130823208767981548141051703
   1765 #define DEG_2_RAD	0.0174532925199432957692369076848861271
   1766 
   1767 /* geodetic constants */
   1768 #define WGS84A 6378137		/* equatorial radius */
   1769 #define WGS84F 298.257223563	/* flattening */
   1770 #define WGS84B 6356752.3142	/* polar radius */
   1771 
   1772 /* netlib_connectsock() errno return values */
   1773 #define NL_NOSERVICE	-1	/* can't get service entry */
   1774 #define NL_NOHOST	-2	/* can't get host entry */
   1775 #define NL_NOPROTO	-3	/* can't get protocol entry */
   1776 #define NL_NOSOCK	-4	/* can't create socket */
   1777 #define NL_NOSOCKOPT	-5	/* error SETSOCKOPT SO_REUSEADDR */
   1778 #define NL_NOCONNECT	-6	/* can't connect to host/socket pair */
   1779 #define SHM_NOSHARED	-7	/* shared-memory segment not available */
   1780 #define SHM_NOATTACH	-8	/* shared-memory attach failed */
   1781 
   1782 #define DEFAULT_GPSD_PORT	"2947"	/* IANA assignment */
   1783 #define DEFAULT_RTCM_PORT	"2101"	/* IANA assignment */
   1784 
   1785 /* special host values for non-socket exports */
   1786 #define GPSD_SHARED_MEMORY	"shared memory"
   1787 
   1788 /*
   1789  * Platform-specific declarations
   1790  */
   1791 
   1792 #ifdef _WIN32
   1793 #define strtok_r(s,d,p) strtok_s(s,d,p)
   1794 #endif
   1795 
   1796 /* Some libc's don't have strlcat/strlcpy. Local copies are provided */
   1797 #ifndef HAVE_STRLCAT
   1798 size_t strlcat(/*@out@*/char *dst, /*@in@*/const char *src, size_t size);
   1799 #endif
   1800 #ifndef HAVE_STRLCPY
   1801 size_t strlcpy(/*@out@*/char *dst, /*@in@*/const char *src, size_t size);
   1802 #endif
   1803 
   1804 #ifdef __cplusplus
   1805 }  /* End of the 'extern "C"' block */
   1806 #endif
   1807 
   1808 /* gps.h ends here */
   1809 #endif /* _GPSD_GPS_H_ */
   1810