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 + -
显示快捷键?