gpsd.h-tail
来自「gpsd, a popular GPS daemon.」· H-TAIL 代码 · 共 463 行 · 第 1/2 页
H-TAIL
463 行
/* Feature configuration switches end here *//* $Id: gpsd.h-tail 4665 2008-01-21 00:43:01Z garyemiller $ *//* Some internal capabilities depend on which drivers we're compiling. */#ifdef EARTHMATE_ENABLE#define ZODIAC_ENABLE #endif#if defined(ZODIAC_ENABLE) || defined(SIRF_ENABLE) || defined(GARMIN_ENABLE) || defined(TSIP_ENABLE) || defined(EVERMORE_ENABLE) || defined(ITRAX_ENABLE) || defined(UBX_ENABLE)#define BINARY_ENABLE #endif#if defined(TRIPMATE_ENABLE) || defined(BINARY_ENABLE)#define NON_NMEA_ENABLE #endif/* First, declarations for the packet layer... *//* XXX Some receivers (TN-200, GSW 2.3.2) emit oversized sentences (>82) */#define NMEA_MAX 86 /* max length of NMEA sentence */#define NMEA_BIG_BUF (2*NMEA_MAX+1) /* longer than longest NMEA sentence *//* a few bits of ISGPS magic */enum isgpsstat_t { ISGPS_NO_SYNC, ISGPS_SYNC, ISGPS_SKIP, ISGPS_MESSAGE,};#define ISGPS_ERRLEVEL_BASE 5#define RTCM_MAX (RTCM_WORDS_MAX * sizeof(isgps30bits_t))/* * The packet buffers need to be as long than the longest packet we * expect to see in any protocol, because we have to be able to hold * an entire packet for checksumming... * First we thought it had to be big enough for a SiRF Measured Tracker * Data packet (188 bytes). Then it had to be big enough for a UBX SVINFO * packet (206 bytes). Now it turns out that a couple of ITALK messages are * over 512 bytes. I know we like verbose output, but this is ridiculous. */#define MAX_PACKET_LENGTH 516 /* 7 + 506 + 3 *//* * We used to define the input buffer length as MAX_PACKET_LENGTH*2+1. * However, as it turns out, this isn't enough. We've had a report * from one user with a GPS that reports at 20Hz that "sometimes a * long/slow context switch will cause the next read from the serial * device to be very big. I sometimes see a read of 250 characters or * more." */#define INPUT_BUFFER_LENGTH 1536struct gps_packet_t { /* packet-getter internals */ int type;#define BAD_PACKET -1#define COMMENT_PACKET 0#define NMEA_PACKET 1#define SIRF_PACKET 2#define ZODIAC_PACKET 3#define TSIP_PACKET 4#define EVERMORE_PACKET 5#define ITALK_PACKET 6#define RTCM_PACKET 7#define GARMIN_PACKET 8#define NAVCOM_PACKET 9#define UBX_PACKET 10#define GARMINTXT_PACKET 11 unsigned int state; size_t length; unsigned char inbuffer[MAX_PACKET_LENGTH*2+1]; size_t inbuflen; unsigned /*@observer@*/char *inbufptr; /* outbuffer needs to be able to hold 4 GPGSV records at once */ unsigned char outbuffer[MAX_PACKET_LENGTH*2+1]; size_t outbuflen; unsigned long char_counter; /* count characters processed */ unsigned long retry_counter; /* count sniff retries */ unsigned counter; /* packets since last driver switch */ /* * This is not conditionalized on RTCM104_ENABLE because we need to * be able to build rtcmdecode even when RTCM support is not * configured in the daemon. */ struct { /* ISGPS200 decoding */ bool locked; int curr_offset; isgps30bits_t curr_word; isgps30bits_t buf[RTCM_WORDS_MAX]; unsigned int bufindex; } isgps;};extern void packet_reset(struct gps_packet_t *);extern void packet_pushback(struct gps_packet_t *);extern ssize_t packet_parse(struct gps_packet_t *, size_t);extern ssize_t packet_get(int, struct gps_packet_t *);extern int packet_sniff(struct gps_packet_t *);extern void isgps_init(/*@out@*/struct gps_packet_t *);enum isgpsstat_t isgps_decode(struct gps_packet_t *, bool (*preamble_match)(isgps30bits_t *), bool (*length_check)(struct gps_packet_t *), size_t, unsigned int);extern unsigned int isgps_parity(isgps30bits_t);extern void isgps_output_magnavox(isgps30bits_t *, unsigned int, FILE *);extern enum isgpsstat_t rtcm_decode(struct gps_packet_t *, unsigned int);extern void rtcm_dump(struct rtcm_t *, /*@out@*/char[], size_t);extern int rtcm_undump(/*@out@*/struct rtcm_t *, char *);extern void rtcm_unpack(/*@out@*/struct rtcm_t *, char *);extern bool rtcm_repack(struct rtcm_t *, isgps30bits_t *);extern void rtcm_output_magnavox(isgps30bits_t *, FILE *);/* Next, declarations for the core library... *//* factors for converting among confidence interval units */#define CEP50_SIGMA 1.18#define DRMS_SIGMA 1.414#define CEP95_SIGMA 2.45/* this is where we choose the confidence level to use in reports */#define GPSD_CONFIDENCE CEP95_SIGMA#define NTPSHMSEGS 4 /* number of NTP SHM segments *//* Some internal capabilities depend on which drivers we're compiling. */#ifdef EARTHMATE_ENABLE#define ZODIAC_ENABLE #endif#if defined(ZODIAC_ENABLE) || defined(SIRF_ENABLE) || defined(GARMIN_ENABLE) || defined(TSIP_ENABLE) || defined(EVERMORE_ENABLE) || defined(ITRAX_ENABLE)#define BINARY_ENABLE #endif#if defined(TRIPMATE_ENABLE) || defined(BINARY_ENABLE)#define NON_NMEA_ENABLE #endifstruct gps_context_t { int valid; /* member validity flags */ bool readonly; /* if true, never write to device */#define LEAP_SECOND_VALID 0x01 /* we have or don't need correction */ /* DGPSIP status */ bool sentdgps; /* have we sent a DGPS report? */ enum { dgnss_none, dgnss_dgpsip, dgnss_ntrip } dgnss_service; /* type of DGNSS service */ int fixcnt; /* count of good fixes seen */ int dsock; /* socket to DGPSIP server/Ntrip caster */ void *dgnss_privdata; /* DGNSS service specific data */ ssize_t rtcmbytes; /* byte count of last RTCM104 report */ char rtcmbuf[RTCM_MAX]; /* last RTCM104 report */ double rtcmtime; /* timestamp of last RTCM104 report */ /* timekeeping */ int leap_seconds; /* Unix seconds to UTC */ int century; /* for NMEA-only devices without ZDA */#ifdef NTPSHM_ENABLE bool enable_ntpshm; /*@reldef@*/struct shmTime *shmTime[NTPSHMSEGS]; bool shmTimeInuse[NTPSHMSEGS];# ifdef PPS_ENABLE bool shmTimePPS;# endif /* PPS_ENABLE */#endif /* NTPSHM_ENABLE */};struct gps_device_t;#if defined (HAVE_SYS_TERMIOS_H)#include <sys/termios.h>#else#if defined (HAVE_TERMIOS_H)#include <termios.h>#endif#endifstruct gps_type_t {/* GPS method table, describes how to talk to a particular GPS type */ /*@observer@*/char *type_name; /*@observer@*//*@null@*/char *trigger; int channels; /*@null@*/bool (*probe_detect)(struct gps_device_t *session); /*@null@*/void (*probe_wakeup)(struct gps_device_t *session); /*@null@*/void (*probe_subtype)(struct gps_device_t *session, unsigned int seq);#ifdef ALLOW_RECONFIGURE /*@null@*/void (*configurator)(struct gps_device_t *session, unsigned int seq);#endif /* ALLOW_RECONFIGURE */ /*@null@*/ssize_t (*get_packet)(struct gps_device_t *session); /*@null@*/gps_mask_t (*parse_packet)(struct gps_device_t *session); /*@null@*/ssize_t (*rtcm_writer)(struct gps_device_t *session, char *rtcmbuf, size_t rtcmbytes); /*@null@*/bool (*speed_switcher)(struct gps_device_t *session, speed_t speed); /*@null@*/void (*mode_switcher)(struct gps_device_t *session, int mode); /*@null@*/bool (*rate_switcher)(struct gps_device_t *session, double rate); int cycle_chars;#ifdef ALLOW_RECONFIGURE /*@null@*/void (*revert)(struct gps_device_t *session);#endif /* ALLOW_RECONFIGURE */ /*@null@*/void (*wrapup)(struct gps_device_t *session); double cycle;};struct gps_device_t {/* session object, encapsulates all global state */ struct gps_data_t gpsdata; /*@relnull@*/struct gps_type_t *device_type; struct gps_context_t *context;#ifdef ALLOW_RECONFIGURE bool enable_reconfigure; /* OK to hack GPS settings? */ #endif /* ALLOW_RECONFIGURE */ double rtcmtime; /* timestamp of last RTCM104 correction to GPS */ struct termios ttyset, ttyset_old; unsigned int baudindex; int saved_baud; struct gps_packet_t packet; char subtype[64]; /* firmware version or subtype ID */ double poll_times[FD_SETSIZE]; /* last daemon poll time */#ifdef NTPSHM_ENABLE int shmindex; double last_fixtime; /* so updates happen once */# ifdef PPS_ENABLE int shmTimeP;# endif /* PPS_ENABLE */#endif /* NTPSHM_ENABLE */ double mag_var; /* Magnetic variation in degrees */ bool back_to_nmea; /* back to NMEA on revert? */#ifdef NMEADISC int ldisc; /* current line discipline */#endif /* * The rest of this structure is driver-specific private storage. * Because the Garmin driver uses a long buffer, you can have * up to 4096+12 bytes of private storage in your own union member * without making this structure larger or changing the API at all. */ union {
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?