diff options
author | Eric S. Raymond <esr@thyrsus.com> | 2006-11-30 07:29:25 +0000 |
---|---|---|
committer | Eric S. Raymond <esr@thyrsus.com> | 2006-11-30 07:29:25 +0000 |
commit | 2f6775a8769ed7a2250bb90a68c5fa2617123604 (patch) | |
tree | b0a90a20de3049daf781390419172d628bb83fc0 | |
parent | 1c2b3463912566fa8a5841385a56ed1d966138db (diff) | |
download | gpsd-2f6775a8769ed7a2250bb90a68c5fa2617123604.tar.gz |
Split the packet-sniffer internals out of the session structure.
This is a big, super-intrusive patch but changes no logic at all --
it's all about ripping out some of the gps_device_t structure members
into a new gps_packet_t structure. Even the driver API doesn't change
at all, this is all libgpsd(3) internals being rearranged.
The motivation here is that we want to kill off the ad-hoc Python
implementation of a packet-sniffer in gpsfake. To do that we need to
be able to write a "pure" packet sniffer that uses the same C code as
the daemon's but without being welded to the rest of the libgpsd(3)
code. This is the first step towards that.
-rw-r--r-- | bits.h | 14 | ||||
-rw-r--r-- | drivers.c | 51 | ||||
-rw-r--r-- | evermore.c | 12 | ||||
-rw-r--r-- | garmin.c | 12 | ||||
-rw-r--r-- | gpsd.c | 12 | ||||
-rw-r--r-- | gpsd.h | 90 | ||||
-rw-r--r-- | isgps.c | 98 | ||||
-rw-r--r-- | libgpsd_core.c | 44 | ||||
-rw-r--r-- | packet.c | 360 | ||||
-rw-r--r-- | packet_test.c | 23 | ||||
-rw-r--r-- | rtcm.c | 89 | ||||
-rw-r--r-- | rtcmdecode.c | 19 | ||||
-rw-r--r-- | serial.c | 8 | ||||
-rw-r--r-- | sirf.c | 13 | ||||
-rw-r--r-- | tsip.c | 24 | ||||
-rw-r--r-- | zodiac.c | 20 |
16 files changed, 453 insertions, 436 deletions
@@ -75,11 +75,11 @@ union long_double { /* Zodiac protocol description uses 1-origin indexing by little-endian word */ -#define getword(n) ( (session->outbuffer[2*(n)-2]) \ - | (session->outbuffer[2*(n)-1] << 8)) -#define getlong(n) ( (session->outbuffer[2*(n)-2]) \ - | (session->outbuffer[2*(n)-1] << 8) \ - | (session->outbuffer[2*(n)+0] << 16) \ - | (session->outbuffer[2*(n)+1] << 24)) +#define getword(n) ( (session->packet.outbuffer[2*(n)-2]) \ + | (session->packet.outbuffer[2*(n)-1] << 8)) +#define getlong(n) ( (session->packet.outbuffer[2*(n)-2]) \ + | (session->packet.outbuffer[2*(n)-1] << 8) \ + | (session->packet.outbuffer[2*(n)+0] << 16) \ + | (session->packet.outbuffer[2*(n)+1] << 24)) #define getstring(t, s, e) \ - (void)memcpy(t, session->outbuffer+2*(s)-2, 2*((e)-(s)+1)) + (void)memcpy(t, session->packet.outbuffer+2*(s)-2, 2*((e)-(s)+1)) @@ -15,6 +15,11 @@ extern struct gps_type_t zodiac_binary; +ssize_t generic_get(struct gps_device_t *session) +{ + return packet_get(session->gpsdata.gps_fd, &session->gpsdata.rtcm, &session->packet); +} + #if defined(NMEA_ENABLE) || defined(SIRF_ENABLE) || defined(EVERMORE_ENABLE) || defined(ITALK_ENABLE) ssize_t pass_rtcm(struct gps_device_t *session, char *buf, size_t rtcmbytes) /* most GPSes take their RTCM corrections straight up */ @@ -32,23 +37,23 @@ ssize_t pass_rtcm(struct gps_device_t *session, char *buf, size_t rtcmbytes) gps_mask_t nmea_parse_input(struct gps_device_t *session) { - if (session->packet_type == SIRF_PACKET) { + if (session->packet.type == SIRF_PACKET) { gpsd_report(LOG_WARN, "SiRF packet seen when NMEA expected.\n"); #ifdef SIRF_ENABLE (void)gpsd_switch_driver(session, "SiRF binary"); - return sirf_parse(session, session->outbuffer, session->outbuflen); + return sirf_parse(session, session->packet.outbuffer, session->packet.outbuflen); #else return 0; #endif /* SIRF_ENABLE */ - } else if (session->packet_type == EVERMORE_PACKET) { + } else if (session->packet.type == EVERMORE_PACKET) { gpsd_report(LOG_WARN, "EverMore packet seen when NMEA expected.\n"); #ifdef EVERMORE_ENABLE (void)gpsd_switch_driver(session, "EverMore binary"); - return evermore_parse(session, session->outbuffer, session->outbuflen); + return evermore_parse(session, session->packet.outbuffer, session->packet.outbuflen); #else return 0; #endif /* EVERMORE_ENABLE */ - } else if (session->packet_type == GARMIN_PACKET) { + } else if (session->packet.type == GARMIN_PACKET) { gpsd_report(LOG_WARN, "Garmin packet seen when NMEA expected.\n"); #ifdef GARMIN_ENABLE /* we might never see a trigger, have this as a backstop */ @@ -57,10 +62,10 @@ gps_mask_t nmea_parse_input(struct gps_device_t *session) #else return 0; #endif /* GARMIN_ENABLE */ - } else if (session->packet_type == NMEA_PACKET) { + } else if (session->packet.type == NMEA_PACKET) { gps_mask_t st = 0; - gpsd_report(LOG_IO, "<= GPS: %s", session->outbuffer); - if ((st=nmea_parse((char *)session->outbuffer, session))==0) { + gpsd_report(LOG_IO, "<= GPS: %s", session->packet.outbuffer); + if ((st=nmea_parse((char *)session->packet.outbuffer, session))==0) { #ifdef NON_NMEA_ENABLE struct gps_type_t **dp; @@ -68,14 +73,14 @@ gps_mask_t nmea_parse_input(struct gps_device_t *session) for (dp = gpsd_drivers; *dp; dp++) { char *trigger = (*dp)->trigger; - if (trigger!=NULL && strncmp((char *)session->outbuffer, trigger, strlen(trigger))==0 && isatty(session->gpsdata.gps_fd)!=0) { + if (trigger!=NULL && strncmp((char *)session->packet.outbuffer, trigger, strlen(trigger))==0 && isatty(session->gpsdata.gps_fd)!=0) { gpsd_report(LOG_PROG, "found %s.\n", trigger); (void)gpsd_switch_driver(session, (*dp)->typename); return 1; } } #endif /* NON_NMEA_ENABLE */ - gpsd_report(LOG_WARN, "unknown sentence: \"%s\"\n", session->outbuffer); + gpsd_report(LOG_WARN, "unknown sentence: \"%s\"\n", session->packet.outbuffer); } #ifdef NMEADISC if (session->gpsdata.ldisc == 0) { @@ -212,7 +217,7 @@ static struct gps_type_t nmea = { #ifdef ALLOW_RECONFIGURE .configurator = NULL, /* enable what we need */ #endif /* ALLOW_RECONFIGURE */ - .get_packet = packet_get, /* use generic packet getter */ + .get_packet = generic_get, /* use generic packet getter */ .parse_packet = nmea_parse_input, /* how to interpret a packet */ .rtcm_writer = pass_rtcm, /* write RTCM data straight */ .speed_switcher = NULL, /* no speed switcher */ @@ -286,7 +291,7 @@ static struct gps_type_t garmin = { #ifdef ALLOW_RECONFIGURE .configurator = garmin_nmea_configurator,/* enable what we need */ #endif /*ALLOW_RECONFIGURE */ - .get_packet = packet_get, /* use generic packet getter */ + .get_packet = generic_get, /* use generic packet getter */ .parse_packet = nmea_parse_input, /* how to interpret a packet */ .rtcm_writer = NULL, /* some do, some don't, skip for now */ .speed_switcher = NULL, /* no speed switcher */ @@ -331,7 +336,7 @@ static struct gps_type_t fv18 = { #ifdef ALLOW_RECONFIGURE .configurator = fv18_configure, /* change its sentence set */ #endif /* ALLOW_RECONFIGURE */ - .get_packet = packet_get, /* how to get a packet */ + .get_packet = generic_get, /* how to get a packet */ .parse_packet = nmea_parse_input, /* how to interpret a packet */ .rtcm_writer = pass_rtcm, /* write RTCM data straight */ .speed_switcher = NULL, /* no speed switcher */ @@ -387,7 +392,7 @@ static struct gps_type_t tripmate = { #ifdef ALLOW_RECONFIGURE .configurator = tripmate_configurator, /* send unconditionally */ #endif /* ALLOW_RECONFIGURE */ - .get_packet = packet_get, /* how to get a packet */ + .get_packet = generic_get, /* how to get a packet */ .parse_packet = nmea_parse_input, /* how to interpret a packet */ .rtcm_writer = pass_rtcm, /* send RTCM data straight */ .speed_switcher= NULL, /* no speed switcher */ @@ -445,7 +450,7 @@ static struct gps_type_t earthmate = { #ifdef ALLOW_RECONFIGURE .configurator = NULL, /* no configuration here */ #endif /* ALLOW_RECONFIGURE */ - .get_packet = packet_get, /* how to get a packet */ + .get_packet = generic_get, /* how to get a packet */ .parse_packet = nmea_parse_input, /* how to interpret a packet */ .rtcm_writer = NULL, /* don't send RTCM data */ .speed_switcher= NULL, /* no speed switcher */ @@ -585,7 +590,7 @@ static struct gps_type_t itrax = { #ifdef ALLOW_RECONFIGURE .configurator = itrax_configurator,/* set synchronous mode */ #endif /* ALLOW_RECONFIGURE */ - .get_packet = packet_get, /* how to get a packet */ + .get_packet = generic_get, /* how to get a packet */ .parse_packet = nmea_parse_input, /* how to interpret a packet */ .rtcm_writer = NULL, /* iTrax doesn't support DGPS/WAAS/EGNOS */ .speed_switcher= itrax_speed, /* no speed switcher */ @@ -683,11 +688,11 @@ static int tnt_packet_sniff(struct gps_device_t *session) //usleep(delay); gpsd_report(LOG_RAW, "sleep(1)\n"); (void)sleep(1); - } else if (packet_get(session) >= 0) { - if((session->packet_type == NMEA_PACKET)&&(session->packet_state == NMEA_RECOGNIZED)) + } else if (generic_get(session) >= 0) { + if((session->packet.type == NMEA_PACKET)&&(session->packet_state == NMEA_RECOGNIZED)) { - gpsd_report(LOG_RAW, "tnt_packet_sniff returns %d\n",session->packet_type); - return session->packet_type; + gpsd_report(LOG_RAW, "tnt_packet_sniff returns %d\n",session->packet.type); + return session->packet.type; } } } @@ -757,7 +762,7 @@ struct gps_type_t trueNorth = { #ifdef ALLOW_RECONFIGURE .configurator = NULL, /* no setting changes */ #endif /* ALLOW_RECONFIGURE */ - .get_packet = packet_get, /* how to get a packet */ + .get_packet = generic_get, /* how to get a packet */ .parse_packet = nmea_parse_input, /* how to interpret a packet */ .rtcm_writer = NULL, /* Don't send */ .speed_switcher = NULL, /* no speed switcher */ @@ -783,7 +788,7 @@ static gps_mask_t rtcm104_analyze(struct gps_device_t *session) gpsd_report(LOG_RAW, "RTCM packet type 0x%02x length %d words: %s\n", session->gpsdata.rtcm.type, session->gpsdata.rtcm.length+2, - gpsd_hexdump(session->driver.isgps.buf, (session->gpsdata.rtcm.length+2)*sizeof(isgps30bits_t))); + gpsd_hexdump(session->packet.isgps.buf, (session->gpsdata.rtcm.length+2)*sizeof(isgps30bits_t))); return RTCM_SET; } @@ -797,7 +802,7 @@ static struct gps_type_t rtcm104 = { #ifdef ALLOW_RECONFIGURE .configurator = NULL, /* no configurator */ #endif /* ALLOW_RECONFIGURE */ - .get_packet = packet_get, /* how to get a packet */ + .get_packet = generic_get, /* how to get a packet */ .parse_packet = rtcm104_analyze, /* packet getter does the parsing */ .rtcm_writer = NULL, /* don't send RTCM data, */ .speed_switcher= NULL, /* no speed switcher */ @@ -360,13 +360,13 @@ static gps_mask_t evermore_parse_input(struct gps_device_t *session) { gps_mask_t st; - if (session->packet_type == EVERMORE_PACKET){ - st = evermore_parse(session, session->outbuffer, session->outbuflen); + if (session->packet.type == EVERMORE_PACKET){ + st = evermore_parse(session, session->packet.outbuffer, session->packet.outbuflen); session->gpsdata.driver_mode = 1; /* binary */ return st; #ifdef NMEA_ENABLE - } else if (session->packet_type == NMEA_PACKET) { - st = nmea_parse((char *)session->outbuffer, session); + } else if (session->packet.type == NMEA_PACKET) { + st = nmea_parse((char *)session->packet.outbuffer, session); session->gpsdata.driver_mode = 0; /* NMEA */ return st; #endif /* NMEA_ENABLE */ @@ -607,7 +607,7 @@ static void evermore_configurator(struct gps_device_t *session, unsigned int seq { if (seq == 0) { gpsd_report(LOG_PROG, "evermore_configurator call\n"); - if (session->packet_type == NMEA_PACKET) { + if (session->packet.type == NMEA_PACKET) { gpsd_report(LOG_WARN, "NMEA_PACKET packet\n"); } #ifdef ALLOW_RECONFIGURE @@ -656,7 +656,7 @@ struct gps_type_t evermore_binary = #ifdef ALLOW_RECONFIGURE .configurator = evermore_configurator, /* switch to binary */ #endif /* ALLOW_RECONFIGURE */ - .get_packet = packet_get, /* use generic one */ + .get_packet = generic_get, /* use generic one */ .parse_packet = evermore_parse_input, /* parse message packets */ .rtcm_writer = pass_rtcm, /* send RTCM data straight */ .speed_switcher = evermore_speed, /* we can change baud rates */ @@ -830,8 +830,8 @@ static void garmin_close(struct gps_device_t *session UNUSED) /*@ +charint @*/ gps_mask_t garmin_ser_parse(struct gps_device_t *session) { - unsigned char *buf = session->outbuffer; - size_t len = session->outbuflen; + unsigned char *buf = session->packet.outbuffer; + size_t len = session->packet.outbuflen; unsigned char data_buf[MAX_BUFFER_SIZE]; unsigned char c; int i = 0; @@ -1035,7 +1035,7 @@ static int GetPacket (struct gps_device_t *session ) memset( session->driver.garmin.Buffer, 0, sizeof(Packet_t)); memset( &delay, 0, sizeof(delay)); session->driver.garmin.BufferLen = 0; - session->outbuflen = 0; + session->packet.outbuflen = 0; gpsd_report(LOG_IO, "GetPacket()\n"); @@ -1112,7 +1112,7 @@ static int GetPacket (struct gps_device_t *session ) } gpsd_report(LOG_RAW, "GotPacket() sz=%d \n", session->driver.garmin.BufferLen); - session->outbuflen = session->driver.garmin.BufferLen; + session->packet.outbuflen = session->driver.garmin.BufferLen; return 0; } static gps_mask_t garmin_usb_parse(struct gps_device_t *session) @@ -1162,7 +1162,7 @@ struct gps_type_t garmin_usb_binary = .probe_subtype = garmin_probe_subtype, /* get subtype info */ /* this configurator is NOT optional */ .configurator = garmin_usb_configure, /* enable what we need */ - .get_packet = packet_get, /* how to grab a packet */ + .get_packet = generic_get, /* how to grab a packet */ .parse_packet = garmin_ser_parse, /* parse message packets */ .rtcm_writer = NULL, /* don't send DGPS corrections */ .speed_switcher = NULL, /* no speed switcher */ @@ -1187,7 +1187,7 @@ struct gps_type_t garmin_ser_binary = #ifdef ALLOW_RECONFIGURE .configurator = NULL, /* enable what we need */ #endif /* ALLOW_RECONFIGURE */ - .get_packet = packet_get, /* how to grab a packet */ + .get_packet = generic_get, /* how to grab a packet */ .parse_packet = garmin_ser_parse, /* parse message packets */ .rtcm_writer = NULL, /* don't send DGPS corrections */ .speed_switcher = NULL, /* no speed switcher */ @@ -518,14 +518,14 @@ static bool allocation_policy(struct gps_device_t *channel, /* maybe we have already bound a more recently active device */ if (user->device!=NULL && channel->gpsdata.sentence_time < most_recent) return false; - gpsd_report(LOG_PROG, "User requires %d, channel type is %d\n", user->requires, channel->packet_type); + gpsd_report(LOG_PROG, "User requires %d, channel type is %d\n", user->requires, channel->packet.type); /* we might have type constraints */ if (user->requires == ANY) return true; - else if (user->requires==RTCM104 && (channel->packet_type==RTCM_PACKET)) + else if (user->requires==RTCM104 && (channel->packet.type==RTCM_PACKET)) return true; else if (user->requires == GPS - && (channel->packet_type!=RTCM_PACKET) && (channel->packet_type!=BAD_PACKET)) + && (channel->packet.type!=RTCM_PACKET) && (channel->packet.type!=BAD_PACKET)) return true; else return false; @@ -775,9 +775,9 @@ static int handle_gpsd_request(struct subscriber_t* sub, char *buf, int buflen) p += strcspn(p, ",\r\n"); } (void)assign_channel(sub); - if (sub->device==NULL||sub->device->packet_type==BAD_PACKET) + if (sub->device==NULL||sub->device->packet.type==BAD_PACKET) (void)strlcpy(phrase, ",G=?", BUFSIZ); - else if (sub->device->packet_type == RTCM_PACKET) + else if (sub->device->packet.type == RTCM_PACKET) (void)snprintf(phrase, sizeof(phrase), ",G=RTCM104"); else (void)snprintf(phrase, sizeof(phrase), ",G=GPS"); @@ -1743,7 +1743,7 @@ int main(int argc, char *argv[]) if (!nowait) for (channel=channels; channel < channels+MAXDEVICES; channel++) { if (allocated_channel(channel)) { - if (channel->packet_type != BAD_PACKET) { + if (channel->packet.type != BAD_PACKET) { bool need_gps = false; for (cfd = 0; cfd < MAXSUBSCRIBERS; cfd++) @@ -124,18 +124,9 @@ struct gps_type_t { */ #define INPUT_BUFFER_LENGTH 1024 -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; +struct gps_packet_t { /* packet-getter internals */ - int packet_type; + int type; #define BAD_PACKET -1 #define NMEA_PACKET 0 #define SIRF_PACKET 1 @@ -145,10 +136,8 @@ struct gps_device_t { #define ITALK_PACKET 5 #define RTCM_PACKET 6 #define GARMIN_PACKET 7 - unsigned int baudindex; - int saved_baud; - unsigned int packet_state; - size_t packet_length; + unsigned int state; + size_t length; unsigned char inbuffer[MAX_PACKET_LENGTH*2+1]; size_t inbuflen; unsigned /*@observer@*/char *inbufptr; @@ -157,7 +146,35 @@ struct gps_device_t { size_t outbuflen; unsigned long char_counter; /* count characters processed */ unsigned long retry_counter; /* count sniff retries */ - unsigned packet_counter; /* packets since last driver switch */ + 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; +}; + +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 @@ -240,19 +257,6 @@ struct gps_device_t { unsigned int Zv[ZODIAC_CHANNELS]; /* signal values (0-7) */ } zodiac; #endif /* ZODIAC_ENABLE */ - /* - * 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. It doesn't take up extra space. - */ - struct { - /* ISGPS200 decoding */ - bool locked; - int curr_offset; - isgps30bits_t curr_word; - isgps30bits_t buf[RTCM_WORDS_MAX]; - unsigned int bufindex; - } isgps; #endif /* BINARY_ENABLE */ } driver; }; @@ -277,16 +281,18 @@ extern gps_mask_t nmea_parse(char *, struct gps_device_t *); extern int nmea_send(int, const char *, ... ); extern void nmea_add_checksum(char *); +ssize_t generic_get(struct gps_device_t *); ssize_t pass_rtcm(struct gps_device_t *, char *, size_t); extern gps_mask_t sirf_parse(struct gps_device_t *, unsigned char *, size_t); extern gps_mask_t evermore_parse(struct gps_device_t *, unsigned char *, size_t); extern gps_mask_t garmin_ser_parse(struct gps_device_t *); -extern void packet_reset(struct gps_device_t *); -extern void packet_pushback(struct gps_device_t *); -extern ssize_t packet_parse(struct gps_device_t *, size_t); -extern ssize_t packet_get(struct gps_device_t *); -extern int packet_sniff(struct gps_device_t *); + +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 *, struct rtcm_t *, size_t); +extern ssize_t packet_get(int, struct rtcm_t *, struct gps_packet_t *); +extern int packet_sniff(struct gps_packet_t *); extern bool dgnss_url(char *); extern int dgnss_open(struct gps_context_t *, char *); @@ -331,19 +337,21 @@ extern bool ntpshm_free(struct gps_context_t *, int); extern int ntpshm_put(struct gps_device_t *, double); extern int ntpshm_pps(struct gps_device_t *,struct timeval *); -extern void isgps_init(/*@out@*/struct gps_device_t *); -enum isgpsstat_t isgps_decode(struct gps_device_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_device_t *), + bool (*length_check)(struct gps_packet_t *), size_t, unsigned int); extern unsigned int isgps_parity(isgps30bits_t); -extern enum isgpsstat_t rtcm_decode(struct gps_device_t *, unsigned int); -extern void rtcm_dump(struct gps_device_t *, /*@out@*/char[], size_t); +extern enum isgpsstat_t rtcm_decode(struct gps_packet_t *, + struct rtcm_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(struct gps_device_t *); -extern bool rtcm_repack(struct gps_device_t *); +extern void rtcm_unpack(/*@out@*/struct rtcm_t *, char *); +extern bool rtcm_repack(struct rtcm_t *, char *); extern void ecef_to_wgs84fix(struct gps_data_t *, double, double, double, @@ -175,18 +175,18 @@ static bool isgps_parityok(isgps30bits_t w) } #endif -void isgps_init(/*@out@*/struct gps_device_t *session) +void isgps_init(/*@out@*/struct gps_packet_t *session) { - session->driver.isgps.curr_word = 0; - session->driver.isgps.curr_offset = 24; /* first word */ - session->driver.isgps.locked = false; - session->driver.isgps.bufindex = 0; + session->isgps.curr_word = 0; + session->isgps.curr_offset = 24; /* first word */ + session->isgps.locked = false; + session->isgps.bufindex = 0; } /*@ -usereleased -compdef @*/ -enum isgpsstat_t isgps_decode(struct gps_device_t *session, +enum isgpsstat_t isgps_decode(struct gps_packet_t *session, bool (*preamble_match)(isgps30bits_t *), - bool (*length_check)(struct gps_device_t *), + bool (*length_check)(struct gps_packet_t *), size_t maxlen, unsigned int c) { @@ -202,106 +202,106 @@ enum isgpsstat_t isgps_decode(struct gps_device_t *session, c = reverse_bits[c & 0x3f]; /*@ -shiftnegative @*/ - if (!session->driver.isgps.locked) { - session->driver.isgps.curr_offset = -5; - session->driver.isgps.bufindex = 0; - - while (session->driver.isgps.curr_offset <= 0) { - session->driver.isgps.curr_word <<= 1; - if (session->driver.isgps.curr_offset > 0) { - session->driver.isgps.curr_word |= c << session->driver.isgps.curr_offset; + if (!session->isgps.locked) { + session->isgps.curr_offset = -5; + session->isgps.bufindex = 0; + + while (session->isgps.curr_offset <= 0) { + session->isgps.curr_word <<= 1; + if (session->isgps.curr_offset > 0) { + session->isgps.curr_word |= c << session->isgps.curr_offset; } else { - session->driver.isgps.curr_word |= c >> -(session->driver.isgps.curr_offset); + session->isgps.curr_word |= c >> -(session->isgps.curr_offset); } - gpsd_report(ISGPS_ERRLEVEL_BASE+2, "ISGPS syncing at byte %d: %0x%08x\n", session->char_counter, session->driver.isgps.curr_word); + gpsd_report(ISGPS_ERRLEVEL_BASE+2, "ISGPS syncing at byte %d: %0x%08x\n", session->char_counter, session->isgps.curr_word); - if (preamble_match(&session->driver.isgps.curr_word)) { - if (isgps_parityok(session->driver.isgps.curr_word)) { + if (preamble_match(&session->isgps.curr_word)) { + if (isgps_parityok(session->isgps.curr_word)) { gpsd_report(ISGPS_ERRLEVEL_BASE+1, "ISGPS preamble ok, parity ok -- locked\n"); - session->driver.isgps.locked = true; - /* session->driver.isgps.curr_offset; XXX - testing */ + session->isgps.locked = true; + /* session->isgps.curr_offset; XXX - testing */ break; } gpsd_report(ISGPS_ERRLEVEL_BASE+1, "ISGPS preamble ok, parity fail\n"); } - session->driver.isgps.curr_offset++; + session->isgps.curr_offset++; } /* end while */ } - if (session->driver.isgps.locked) { + if (session->isgps.locked) { res = ISGPS_SYNC; - if (session->driver.isgps.curr_offset > 0) { - session->driver.isgps.curr_word |= c << session->driver.isgps.curr_offset; + if (session->isgps.curr_offset > 0) { + session->isgps.curr_word |= c << session->isgps.curr_offset; } else { - session->driver.isgps.curr_word |= c >> -(session->driver.isgps.curr_offset); + session->isgps.curr_word |= c >> -(session->isgps.curr_offset); } - if (session->driver.isgps.curr_offset <= 0) { + if (session->isgps.curr_offset <= 0) { /* weird-assed inversion */ - if (session->driver.isgps.curr_word & P_30_MASK) - session->driver.isgps.curr_word ^= W_DATA_MASK; + if (session->isgps.curr_word & P_30_MASK) + session->isgps.curr_word ^= W_DATA_MASK; - if (isgps_parityok(session->driver.isgps.curr_word)) { + if (isgps_parityok(session->isgps.curr_word)) { #if 0 /* * Don't clobber the buffer just because we spot * another preamble pattern in the data stream. -wsr */ - if (preamble_match(&session->driver.isgps.curr_word)) { + if (preamble_match(&session->isgps.curr_word)) { gpsd_report(ISGPS_ERRLEVEL_BASE+2, "ISGPS preamble spotted (index: %u)\n", - session->driver.isgps.bufindex); - session->driver.isgps.bufindex = 0; + session->isgps.bufindex); + session->isgps.bufindex = 0; } #endif gpsd_report(ISGPS_ERRLEVEL_BASE+2, "ISGPS processing word %u (offset %d)\n", - session->driver.isgps.bufindex, session->driver.isgps.curr_offset); + session->isgps.bufindex, session->isgps.curr_offset); { /* * Guard against a buffer overflow attack. Just wait for * the next PREAMBLE_PATTERN and go on from there. */ - if (session->driver.isgps.bufindex >= (unsigned)maxlen){ - session->driver.isgps.bufindex = 0; + if (session->isgps.bufindex >= (unsigned)maxlen){ + session->isgps.bufindex = 0; gpsd_report(ISGPS_ERRLEVEL_BASE+1, "ISGPS buffer overflowing -- resetting\n"); return ISGPS_NO_SYNC; } - session->driver.isgps.buf[session->driver.isgps.bufindex] = session->driver.isgps.curr_word; + session->isgps.buf[session->isgps.bufindex] = session->isgps.curr_word; - if ((session->driver.isgps.bufindex == 0) && - !preamble_match((isgps30bits_t *)session->driver.isgps.buf)) { + if ((session->isgps.bufindex == 0) && + !preamble_match((isgps30bits_t *)session->isgps.buf)) { gpsd_report(ISGPS_ERRLEVEL_BASE+1, "ISGPS word 0 not a preamble- punting\n"); return ISGPS_NO_SYNC; } - session->driver.isgps.bufindex++; + session->isgps.bufindex++; if (length_check(session)) { /* jackpot, we have a complete packet*/ - session->driver.isgps.bufindex = 0; + session->isgps.bufindex = 0; res = ISGPS_MESSAGE; } } - session->driver.isgps.curr_word <<= 30; /* preserve the 2 low bits */ - session->driver.isgps.curr_offset += 30; - if (session->driver.isgps.curr_offset > 0) { - session->driver.isgps.curr_word |= c << session->driver.isgps.curr_offset; + session->isgps.curr_word <<= 30; /* preserve the 2 low bits */ + session->isgps.curr_offset += 30; + if (session->isgps.curr_offset > 0) { + session->isgps.curr_word |= c << session->isgps.curr_offset; } else { - session->driver.isgps.curr_word |= c >> -(session->driver.isgps.curr_offset); + session->isgps.curr_word |= c >> -(session->isgps.curr_offset); } } else { gpsd_report(ISGPS_ERRLEVEL_BASE+0, "ISGPS parity failure, lost lock\n"); - session->driver.isgps.locked = false; + session->isgps.locked = false; } } - session->driver.isgps.curr_offset -= 6; - gpsd_report(ISGPS_ERRLEVEL_BASE+2, "residual %d\n", session->driver.isgps.curr_offset); + session->isgps.curr_offset -= 6; + gpsd_report(ISGPS_ERRLEVEL_BASE+2, "residual %d\n", session->isgps.curr_offset); return res; } /*@ +shiftnegative @*/ diff --git a/libgpsd_core.c b/libgpsd_core.c index c5220bb6..b591fa75 100644 --- a/libgpsd_core.c +++ b/libgpsd_core.c @@ -46,7 +46,7 @@ int gpsd_switch_driver(struct gps_device_t *session, char* typename) gpsd_assert_sync(session); /*@i@*/session->device_type = *dp; if (session->device_type->probe_subtype != NULL) - session->device_type->probe_subtype(session, session->packet_counter = 0); + session->device_type->probe_subtype(session, session->packet.counter = 0); #ifdef ALLOW_RECONFIGURE if (session->enable_reconfigure && session->device_type->configurator != NULL) { @@ -92,7 +92,7 @@ void gpsd_init(struct gps_device_t *session, struct gps_context_t *context, char gpsd_zero_satellites(&session->gpsdata); /* initialize things for the packet parser */ - packet_reset(session); + packet_reset(&session->packet); } void gpsd_deactivate(struct gps_device_t *session) @@ -238,8 +238,8 @@ int gpsd_activate(struct gps_device_t *session, bool reconfigurable) #ifdef SIRF_ENABLE session->driver.sirf.satcounter = 0; #endif /* SIRF_ENABLE */ - session->char_counter = 0; - session->retry_counter = 0; + session->packet.char_counter = 0; + session->packet.retry_counter = 0; gpsd_report(LOG_INF, "gpsd_activate(%d): opened GPS (%d)\n", reconfigurable, session->gpsdata.gps_fd); // session->gpsdata.online = 0; session->gpsdata.fix.mode = MODE_NOT_SEEN; @@ -264,11 +264,11 @@ int gpsd_activate(struct gps_device_t *session, bool reconfigurable) /* if we know the device type, probe for subtype and configure it */ if (session->device_type != NULL) { if (session->device_type->probe_subtype !=NULL) - session->device_type->probe_subtype(session, session->packet_counter = 0); + session->device_type->probe_subtype(session, session->packet.counter = 0); #ifdef ALLOW_RECONFIGURE if (reconfigurable) { if (session->device_type->configurator != NULL) - session->device_type->configurator(session, session->packet_counter); + session->device_type->configurator(session, session->packet.counter); } #endif /* ALLOW_RECONFIGURE */ } @@ -429,7 +429,7 @@ static void gpsd_binary_satellite_dump(struct gps_device_t *session, } #ifdef ZODIAC_ENABLE - if (session->packet_type == ZODIAC_PACKET && session->driver.zodiac.Zs[0] != 0) { + if (session->packet.type == ZODIAC_PACKET && session->driver.zodiac.Zs[0] != 0) { bufp += strlen(bufp); bufp2 = bufp; (void)strlcpy(bufp, "$PRWIZCH", len); @@ -602,23 +602,23 @@ gps_mask_t gpsd_poll(struct gps_device_t *session) gps_clear_fix(&session->gpsdata.fix); - if (session->inbuflen==0) + if (session->packet.inbuflen==0) session->gpsdata.d_xmit_time = timestamp(); /* can we get a full packet from the device? */ if (session->device_type) { newlen = session->device_type->get_packet(session); session->gpsdata.d_xmit_time = timestamp(); - if (session->outbuflen>0 && session->device_type->probe_subtype!=NULL) - session->device_type->probe_subtype(session, ++session->packet_counter); + if (session->packet.outbuflen>0 && session->device_type->probe_subtype!=NULL) + session->device_type->probe_subtype(session, ++session->packet.counter); } else { - newlen = packet_get(session); + newlen = generic_get(session); session->gpsdata.d_xmit_time = timestamp(); gpsd_report(LOG_RAW, "packet sniff finds type %d\n", - session->packet_type); - if (session->packet_type != BAD_PACKET) { - switch (session->packet_type) { + session->packet.type); + if (session->packet.type != BAD_PACKET) { + switch (session->packet.type) { #ifdef SIRF_ENABLE case SIRF_PACKET: (void)gpsd_switch_driver(session, "SiRF binary"); @@ -677,7 +677,7 @@ gps_mask_t gpsd_poll(struct gps_device_t *session) return 0; } else return ONLINE_SET; - } else if (session->outbuflen == 0) { /* got new data, but no packet */ + } else if (session->packet.outbuflen == 0) { /* got new data, but no packet */ gpsd_report(LOG_RAW+3, "New data, not yet a packet\n"); return ONLINE_SET; } else { @@ -687,10 +687,10 @@ gps_mask_t gpsd_poll(struct gps_device_t *session) /*@ -nullstate @*/ if (session->gpsdata.raw_hook) session->gpsdata.raw_hook(&session->gpsdata, - (char *)session->outbuffer, - (size_t)session->outbuflen, 2); + (char *)session->packet.outbuffer, + (size_t)session->packet.outbuflen, 2); /*@ -nullstate @*/ - session->gpsdata.sentence_length = session->outbuflen; + session->gpsdata.sentence_length = session->packet.outbuflen; session->gpsdata.d_recv_time = timestamp(); /* Get data from current packet into the fix structure */ @@ -718,11 +718,11 @@ gps_mask_t gpsd_poll(struct gps_device_t *session) session->gpsdata.d_decode_time = timestamp(); /* also copy the sentence up to clients in raw mode */ - if (session->packet_type == NMEA_PACKET) { + if (session->packet.type == NMEA_PACKET) { if (session->gpsdata.raw_hook) session->gpsdata.raw_hook(&session->gpsdata, - (char *)session->outbuffer, - strlen((char *)session->outbuffer), + (char *)session->packet.outbuffer, + strlen((char *)session->packet.outbuffer), 1); } else { char buf2[MAX_PACKET_LENGTH*3+2]; @@ -730,7 +730,7 @@ gps_mask_t gpsd_poll(struct gps_device_t *session) buf2[0] = '\0'; #ifdef RTCM104_ENABLE if ((session->gpsdata.set & RTCM_SET) != 0) - rtcm_dump(session, + rtcm_dump(&session->gpsdata.rtcm, buf2+strlen(buf2), (sizeof(buf2)-strlen(buf2))); else { @@ -70,73 +70,73 @@ enum { #define STX 0x02 #define ETX 0x03 -static void nextstate(struct gps_device_t *session, unsigned char c) +static void nextstate(struct gps_packet_t *session, struct rtcm_t *rtcm, unsigned char c) { #ifdef RTCM104_ENABLE enum isgpsstat_t isgpsstat; #endif /* RTCM104_ENABLE */ /*@ +charint */ - switch(session->packet_state) + switch(session->state) { case GROUND_STATE: #ifdef NMEA_ENABLE if (c == '$') { - session->packet_state = NMEA_DOLLAR; + session->state = NMEA_DOLLAR; break; } #endif /* NMEA_ENABLE */ #ifdef TNT_ENABLE if (c == '@') { - session->packet_state = TNT_LEADER; + session->state = TNT_LEADER; break; } #endif #ifdef SIRF_ENABLE if (c == 0xa0) { - session->packet_state = SIRF_LEADER_1; + session->state = SIRF_LEADER_1; break; } #endif /* SIRF_ENABLE */ #if defined(TSIP_ENABLE) || defined(EVERMORE_ENABLE) || defined(GARMIN_ENABLE) if (c == DLE) { - session->packet_state = DLE_LEADER; + session->state = DLE_LEADER; break; } #endif /* TSIP_ENABLE || EVERMORE_ENABLE || GARMIN_ENABLE */ #ifdef TRIPMATE_ENABLE if (c == 'A') { #ifdef RTCM104_ENABLE - (void)rtcm_decode(session, c); + (void)rtcm_decode(session, rtcm, c); #endif /* RTCM104_ENABLE */ - session->packet_state = ASTRAL_1; + session->state = ASTRAL_1; break; } #endif /* TRIPMATE_ENABLE */ #ifdef EARTHMATE_ENABLE if (c == 'E') { #ifdef RTCM104_ENABLE - (void)rtcm_decode(session, c); + (void)rtcm_decode(session, rtcm, c); #endif /* RTCM104_ENABLE */ - session->packet_state = EARTHA_1; + session->state = EARTHA_1; break; } #endif /* EARTHMATE_ENABLE */ #ifdef ZODIAC_ENABLE if (c == 0xff) { - session->packet_state = ZODIAC_LEADER_1; + session->state = ZODIAC_LEADER_1; break; } #endif /* ZODIAC_ENABLE */ #ifdef ITALK_ENABLE if (c == '<') { - session->packet_state = ITALK_LEADER_1; + session->state = ITALK_LEADER_1; break; } #endif /* ITALK_ENABLE */ #ifdef RTCM104_ENABLE - if (rtcm_decode(session, c) == ISGPS_SYNC) { - session->packet_state = RTCM_SYNC_STATE; + if (rtcm_decode(session, rtcm, c) == ISGPS_SYNC) { + session->state = RTCM_SYNC_STATE; break; } #endif /* RTCM104_ENABLE */ @@ -145,258 +145,258 @@ static void nextstate(struct gps_device_t *session, unsigned char c) #ifdef NMEA_ENABLE case NMEA_DOLLAR: if (c == 'G') - session->packet_state = NMEA_PUB_LEAD; + session->state = NMEA_PUB_LEAD; else if (c == 'P') /* vendor sentence */ - session->packet_state = NMEA_LEADER_END; + session->state = NMEA_LEADER_END; else if (c =='I') /* Seatalk */ - session->packet_state = SEATALK_LEAD_1; + session->state = SEATALK_LEAD_1; else if (c =='A') /* SiRF Ack */ - session->packet_state = SIRF_ACK_LEAD_1; + session->state = SIRF_ACK_LEAD_1; else - session->packet_state = GROUND_STATE; + session->state = GROUND_STATE; break; case NMEA_PUB_LEAD: if (c == 'P') - session->packet_state = NMEA_LEADER_END; + session->state = NMEA_LEADER_END; else - session->packet_state = GROUND_STATE; + session->state = GROUND_STATE; break; #ifdef TNT_ENABLE case TNT_LEADER: - session->packet_state = NMEA_LEADER_END; + session->state = NMEA_LEADER_END; break; #endif case NMEA_LEADER_END: if (c == '\r') - session->packet_state = NMEA_CR; + session->state = NMEA_CR; else if (c == '\n') /* not strictly correct, but helps for interpreting logfiles */ - session->packet_state = NMEA_RECOGNIZED; + session->state = NMEA_RECOGNIZED; else if (c == '$') /* faster recovery from missing sentence trailers */ - session->packet_state = NMEA_DOLLAR; + session->state = NMEA_DOLLAR; else if (!isprint(c)) - session->packet_state = GROUND_STATE; + session->state = GROUND_STATE; break; case NMEA_CR: if (c == '\n') - session->packet_state = NMEA_RECOGNIZED; + session->state = NMEA_RECOGNIZED; else - session->packet_state = GROUND_STATE; + session->state = GROUND_STATE; break; case NMEA_RECOGNIZED: if (c == '$') - session->packet_state = NMEA_DOLLAR; + session->state = NMEA_DOLLAR; else - session->packet_state = GROUND_STATE; + session->state = GROUND_STATE; break; case SEATALK_LEAD_1: if (c == 'I' || c == 'N') /* II or IN are accepted */ - session->packet_state = NMEA_LEADER_END; + session->state = NMEA_LEADER_END; else - session->packet_state = GROUND_STATE; + session->state = GROUND_STATE; break; #ifdef TRIPMATE_ENABLE case ASTRAL_1: if (c == 'S') { #ifdef RTCM104_ENABLE - (void)rtcm_decode(session, c); + (void)rtcm_decode(session, rtcm, c); #endif /* RTCM104_ENABLE */ - session->packet_state = ASTRAL_2; + session->state = ASTRAL_2; } else - session->packet_state = GROUND_STATE; + session->state = GROUND_STATE; break; case ASTRAL_2: if (c == 'T') { #ifdef RTCM104_ENABLE - (void)rtcm_decode(session, c); + (void)rtcm_decode(session, rtcm, c); #endif /* RTCM104_ENABLE */ - session->packet_state = ASTRAL_3; + session->state = ASTRAL_3; } else - session->packet_state = GROUND_STATE; + session->state = GROUND_STATE; break; case ASTRAL_3: if (c == 'R') { #ifdef RTCM104_ENABLE - (void)rtcm_decode(session, c); + (void)rtcm_decode(session, rtcm, c); #endif /* RTCM104_ENABLE */ - session->packet_state = ASTRAL_5; + session->state = ASTRAL_5; } else - session->packet_state = GROUND_STATE; + session->state = GROUND_STATE; break; case ASTRAL_4: if (c == 'A') { #ifdef RTCM104_ENABLE - (void)rtcm_decode(session, c); + (void)rtcm_decode(session, rtcm, c); #endif /* RTCM104_ENABLE */ - session->packet_state = ASTRAL_2; + session->state = ASTRAL_2; } else - session->packet_state = GROUND_STATE; + session->state = GROUND_STATE; break; case ASTRAL_5: if (c == 'L') { #ifdef RTCM104_ENABLE - (void)rtcm_decode(session, c); + (void)rtcm_decode(session, rtcm, c); #endif /* RTCM104_ENABLE */ - session->packet_state = NMEA_RECOGNIZED; + session->state = NMEA_RECOGNIZED; } else - session->packet_state = GROUND_STATE; + session->state = GROUND_STATE; break; #endif /* TRIPMATE_ENABLE */ #ifdef EARTHMATE_ENABLE case EARTHA_1: if (c == 'A') { #ifdef RTCM104_ENABLE - (void)rtcm_decode(session, c); + (void)rtcm_decode(session, rtcm, c); #endif /* RTCM104_ENABLE */ - session->packet_state = EARTHA_2; + session->state = EARTHA_2; } else - session->packet_state = GROUND_STATE; + session->state = GROUND_STATE; break; case EARTHA_2: if (c == 'R') { #ifdef RTCM104_ENABLE - (void)rtcm_decode(session, c); + (void)rtcm_decode(session, rtcm, c); #endif /* RTCM104_ENABLE */ - session->packet_state = EARTHA_3; + session->state = EARTHA_3; } else - session->packet_state = GROUND_STATE; + session->state = GROUND_STATE; break; case EARTHA_3: if (c == 'T') { #ifdef RTCM104_ENABLE - (void)rtcm_decode(session, c); + (void)rtcm_decode(session, rtcm, c); #endif /* RTCM104_ENABLE */ - session->packet_state = EARTHA_4; + session->state = EARTHA_4; } else - session->packet_state = GROUND_STATE; + session->state = GROUND_STATE; break; case EARTHA_4: if (c == 'H') { #ifdef RTCM104_ENABLE - (void)rtcm_decode(session, c); + (void)rtcm_decode(session, rtcm, c); #endif /* RTCM104_ENABLE */ - session->packet_state = EARTHA_5; + session->state = EARTHA_5; } else - session->packet_state = GROUND_STATE; + session->state = GROUND_STATE; break; case EARTHA_5: if (c == 'A') { #ifdef RTCM104_ENABLE - (void)rtcm_decode(session, c); + (void)rtcm_decode(session, rtcm, c); #endif /* RTCM104_ENABLE */ - session->packet_state = NMEA_RECOGNIZED; + session->state = NMEA_RECOGNIZED; } else - session->packet_state = GROUND_STATE; + session->state = GROUND_STATE; break; #endif /* EARTHMATE_ENABLE */ case SIRF_ACK_LEAD_1: if (c == 'c') - session->packet_state = SIRF_ACK_LEAD_2; + session->state = SIRF_ACK_LEAD_2; else - session->packet_state = GROUND_STATE; + session->state = GROUND_STATE; break; case SIRF_ACK_LEAD_2: if (c == 'k') - session->packet_state = NMEA_LEADER_END; + session->state = NMEA_LEADER_END; else - session->packet_state = GROUND_STATE; + session->state = GROUND_STATE; break; #endif /* NMEA_ENABLE */ #ifdef SIRF_ENABLE case SIRF_LEADER_1: if (c == 0xa2) - session->packet_state = SIRF_LEADER_2; + session->state = SIRF_LEADER_2; else - session->packet_state = GROUND_STATE; + session->state = GROUND_STATE; break; case SIRF_LEADER_2: - session->packet_length = (size_t)(c << 8); - session->packet_state = SIRF_LENGTH_1; + session->length = (size_t)(c << 8); + session->state = SIRF_LENGTH_1; break; case SIRF_LENGTH_1: - session->packet_length += c + 2; - if (session->packet_length <= MAX_PACKET_LENGTH) - session->packet_state = SIRF_PAYLOAD; + session->length += c + 2; + if (session->length <= MAX_PACKET_LENGTH) + session->state = SIRF_PAYLOAD; else - session->packet_state = GROUND_STATE; + session->state = GROUND_STATE; break; case SIRF_PAYLOAD: - if (--session->packet_length == 0) - session->packet_state = SIRF_DELIVERED; + if (--session->length == 0) + session->state = SIRF_DELIVERED; break; case SIRF_DELIVERED: if (c == 0xb0) - session->packet_state = SIRF_TRAILER_1; + session->state = SIRF_TRAILER_1; else - session->packet_state = GROUND_STATE; + session->state = GROUND_STATE; break; case SIRF_TRAILER_1: if (c == 0xb3) - session->packet_state = SIRF_RECOGNIZED; + session->state = SIRF_RECOGNIZED; else - session->packet_state = GROUND_STATE; + session->state = GROUND_STATE; break; case SIRF_RECOGNIZED: if (c == 0xa0) - session->packet_state = SIRF_LEADER_1; + session->state = SIRF_LEADER_1; else - session->packet_state = GROUND_STATE; + session->state = GROUND_STATE; break; #endif /* SIRF_ENABLE */ #if defined(TSIP_ENABLE) || defined(EVERMORE_ENABLE) || defined(GARMIN_ENABLE) case DLE_LEADER: #ifdef EVERMORE_ENABLE if (c == STX) - session->packet_state = EVERMORE_LEADER_2; + session->state = EVERMORE_LEADER_2; else #endif /* EVERMORE_ENABLE */ #if defined(TSIP_ENABLE) || defined(GARMIN_ENABLE) /* garmin is special case of TSIP */ /* check last because there's no checksum */ if (c >= 0x13) - session->packet_state = TSIP_PAYLOAD; + session->state = TSIP_PAYLOAD; else #endif /* TSIP_ENABLE */ - session->packet_state = GROUND_STATE; + session->state = GROUND_STATE; break; #endif /* TSIP_ENABLE || EVERMORE_ENABLE || GARMIN_ENABLE */ #ifdef ZODIAC_ENABLE case ZODIAC_EXPECTED: case ZODIAC_RECOGNIZED: if (c == 0xff) - session->packet_state = ZODIAC_LEADER_1; + session->state = ZODIAC_LEADER_1; else - session->packet_state = GROUND_STATE; + session->state = GROUND_STATE; break; case ZODIAC_LEADER_1: if (c == 0x81) - session->packet_state = ZODIAC_LEADER_2; + session->state = ZODIAC_LEADER_2; else - session->packet_state = GROUND_STATE; + session->state = GROUND_STATE; break; case ZODIAC_LEADER_2: - session->packet_state = ZODIAC_ID_1; + session->state = ZODIAC_ID_1; break; case ZODIAC_ID_1: - session->packet_state = ZODIAC_ID_2; + session->state = ZODIAC_ID_2; break; case ZODIAC_ID_2: - session->packet_length = (size_t)c; - session->packet_state = ZODIAC_LENGTH_1; + session->length = (size_t)c; + session->state = ZODIAC_LENGTH_1; break; case ZODIAC_LENGTH_1: - session->packet_length += (c << 8); - session->packet_state = ZODIAC_LENGTH_2; + session->length += (c << 8); + session->state = ZODIAC_LENGTH_2; break; case ZODIAC_LENGTH_2: - session->packet_state = ZODIAC_FLAGS_1; + session->state = ZODIAC_FLAGS_1; break; case ZODIAC_FLAGS_1: - session->packet_state = ZODIAC_FLAGS_2; + session->state = ZODIAC_FLAGS_2; break; case ZODIAC_FLAGS_2: - session->packet_state = ZODIAC_HSUM_1; + session->state = ZODIAC_HSUM_1; break; case ZODIAC_HSUM_1: { @@ -406,122 +406,122 @@ static void nextstate(struct gps_device_t *session, unsigned char c) if (sum != getword(4)) { gpsd_report(LOG_IO, "Zodiac Header checksum 0x%hx expecting 0x%hx\n", sum, getword(4)); - session->packet_state = GROUND_STATE; + session->state = GROUND_STATE; break; } } gpsd_report(LOG_RAW+1,"Zodiac header id=%hd len=%hd flags=%hx\n", getword(1), getword(2), getword(3)); #undef getword - if (session->packet_length == 0) { - session->packet_state = ZODIAC_RECOGNIZED; + if (session->length == 0) { + session->state = ZODIAC_RECOGNIZED; break; } - session->packet_length *= 2; /* word count to byte count */ - session->packet_length += 2; /* checksum */ + session->length *= 2; /* word count to byte count */ + session->length += 2; /* checksum */ /* 10 bytes is the length of the Zodiac header */ - if (session->packet_length <= MAX_PACKET_LENGTH - 10) - session->packet_state = ZODIAC_PAYLOAD; + if (session->length <= MAX_PACKET_LENGTH - 10) + session->state = ZODIAC_PAYLOAD; else - session->packet_state = GROUND_STATE; + session->state = GROUND_STATE; break; case ZODIAC_PAYLOAD: - if (--session->packet_length == 0) - session->packet_state = ZODIAC_RECOGNIZED; + if (--session->length == 0) + session->state = ZODIAC_RECOGNIZED; break; #endif /* ZODIAC_ENABLE */ #ifdef EVERMORE_ENABLE case EVERMORE_LEADER_1: if (c == STX) - session->packet_state = EVERMORE_LEADER_2; + session->state = EVERMORE_LEADER_2; else - session->packet_state = GROUND_STATE; + session->state = GROUND_STATE; break; case EVERMORE_LEADER_2: - session->packet_length = (size_t)c; + session->length = (size_t)c; if (c == DLE) - session->packet_state = EVERMORE_PAYLOAD_DLE; + session->state = EVERMORE_PAYLOAD_DLE; else - session->packet_state = EVERMORE_PAYLOAD; + session->state = EVERMORE_PAYLOAD; break; case EVERMORE_PAYLOAD: if (c == DLE) - session->packet_state = EVERMORE_PAYLOAD_DLE; - else if (--session->packet_length == 0) - session->packet_state = GROUND_STATE; + session->state = EVERMORE_PAYLOAD_DLE; + else if (--session->length == 0) + session->state = GROUND_STATE; break; case EVERMORE_PAYLOAD_DLE: switch (c) { - case DLE: session->packet_state = EVERMORE_PAYLOAD; break; - case ETX: session->packet_state = EVERMORE_RECOGNIZED; break; - default: session->packet_state = GROUND_STATE; + case DLE: session->state = EVERMORE_PAYLOAD; break; + case ETX: session->state = EVERMORE_RECOGNIZED; break; + default: session->state = GROUND_STATE; } break; case EVERMORE_RECOGNIZED: if (c == DLE) - session->packet_state = EVERMORE_LEADER_1; + session->state = EVERMORE_LEADER_1; else - session->packet_state = GROUND_STATE; + session->state = GROUND_STATE; break; #endif /* EVERMORE_ENABLE */ #ifdef ITALK_ENABLE case ITALK_LEADER_1: if (c == '!') - session->packet_state = ITALK_LEADER_2; + session->state = ITALK_LEADER_2; else - session->packet_state = GROUND_STATE; + session->state = GROUND_STATE; break; case ITALK_LEADER_2: - session->packet_length = (size_t)(c & 0xff); - session->packet_state = ITALK_LENGTH; + session->length = (size_t)(c & 0xff); + session->state = ITALK_LENGTH; break; case ITALK_LENGTH: - session->packet_length += 1; /* fix number of words in payload */ - session->packet_length *= 2; /* convert to number of bytes */ - session->packet_state = ITALK_PAYLOAD; + session->length += 1; /* fix number of words in payload */ + session->length *= 2; /* convert to number of bytes */ + session->state = ITALK_PAYLOAD; break; case ITALK_PAYLOAD: /* lookahead for "<!" because sometimes packets are short but valid */ if ((c == '>') && (session->inbufptr[0] == '<') && (session->inbufptr[1] == '!')) - session->packet_state = ITALK_RECOGNIZED; - else if (--session->packet_length == 0) - session->packet_state = ITALK_DELIVERED; + session->state = ITALK_RECOGNIZED; + else if (--session->length == 0) + session->state = ITALK_DELIVERED; break; case ITALK_DELIVERED: if (c == '>') - session->packet_state = ITALK_RECOGNIZED; + session->state = ITALK_RECOGNIZED; else - session->packet_state = GROUND_STATE; + session->state = GROUND_STATE; break; case ITALK_RECOGNIZED: if (c == '<') - session->packet_state = ITALK_LEADER_1; + session->state = ITALK_LEADER_1; else - session->packet_state = GROUND_STATE; + session->state = GROUND_STATE; break; #endif /* ITALK_ENABLE */ #ifdef TSIP_ENABLE case TSIP_LEADER: /* unused case */ if (c >= 0x13) - session->packet_state = TSIP_PAYLOAD; + session->state = TSIP_PAYLOAD; else - session->packet_state = GROUND_STATE; + session->state = GROUND_STATE; break; case TSIP_PAYLOAD: if (c == DLE) - session->packet_state = TSIP_DLE; + session->state = TSIP_DLE; break; case TSIP_DLE: switch (c) { case ETX: - session->packet_state = TSIP_RECOGNIZED; + session->state = TSIP_RECOGNIZED; break; case DLE: - session->packet_state = TSIP_PAYLOAD; + session->state = TSIP_PAYLOAD; break; default: - session->packet_state = GROUND_STATE; + session->state = GROUND_STATE; break; } break; @@ -533,28 +533,28 @@ static void nextstate(struct gps_device_t *session, unsigned char c) * looking at another DLE-stuffed protocol like EverMore * or Garmin streaming binary. */ - session->packet_state = DLE_LEADER; + session->state = DLE_LEADER; else - session->packet_state = GROUND_STATE; + session->state = GROUND_STATE; break; #endif /* TSIP_ENABLE */ #ifdef RTCM104_ENABLE case RTCM_SYNC_STATE: case RTCM_SKIP_STATE: - isgpsstat = rtcm_decode(session, c); + isgpsstat = rtcm_decode(session, rtcm, c); if (isgpsstat == ISGPS_MESSAGE) { - session->packet_state = RTCM_RECOGNIZED; + session->state = RTCM_RECOGNIZED; break; } else if (isgpsstat == ISGPS_NO_SYNC) - session->packet_state = GROUND_STATE; + session->state = GROUND_STATE; break; case RTCM_RECOGNIZED: - if (rtcm_decode(session, c) == ISGPS_SYNC) { - session->packet_state = RTCM_SYNC_STATE; + if (rtcm_decode(session, rtcm, c) == ISGPS_SYNC) { + session->state = RTCM_SYNC_STATE; break; } else - session->packet_state = GROUND_STATE; + session->state = GROUND_STATE; break; #endif /* RTCM104_ENABLE */ } @@ -563,7 +563,7 @@ static void nextstate(struct gps_device_t *session, unsigned char c) #define STATE_DEBUG -static void packet_accept(struct gps_device_t *session, int packet_type) +static void packet_accept(struct gps_packet_t *session, int packet_type) /* packet grab succeeded, move to output buffer */ { size_t packetlen = session->inbufptr-session->inbuffer; @@ -571,7 +571,7 @@ static void packet_accept(struct gps_device_t *session, int packet_type) memcpy(session->outbuffer, session->inbuffer, packetlen); session->outbuflen = packetlen; session->outbuffer[packetlen] = '\0'; - session->packet_type = packet_type; + session->type = packet_type; #ifdef STATE_DEBUG gpsd_report(LOG_RAW+1, "Packet type %d accepted %d = %s\n", packet_type, packetlen, @@ -583,7 +583,7 @@ static void packet_accept(struct gps_device_t *session, int packet_type) } } -static void packet_discard(struct gps_device_t *session) +static void packet_discard(struct gps_packet_t *session) /* shift the input buffer to discard all data up to current input pointer */ { size_t discard = session->inbufptr - session->inbuffer; @@ -599,7 +599,7 @@ static void packet_discard(struct gps_device_t *session) #endif /* STATE_DEBUG */ } -static void character_discard(struct gps_device_t *session) +static void character_discard(struct gps_packet_t *session) /* shift the input buffer to discard one character and reread data */ { memmove(session->inbuffer, session->inbuffer+1, (size_t)--session->inbuflen); @@ -618,7 +618,7 @@ static void character_discard(struct gps_device_t *session) #define getword(i) (short)(session->inbuffer[2*(i)] | (session->inbuffer[2*(i)+1] << 8)) -ssize_t packet_parse(struct gps_device_t *session, size_t fix) +ssize_t packet_parse(struct gps_packet_t *session, struct rtcm_t *rtcm, size_t fix) /* grab a packet; returns either BAD_PACKET or the length */ { #ifdef STATE_DEBUG @@ -638,19 +638,19 @@ ssize_t packet_parse(struct gps_device_t *session, size_t fix) char *state_table[] = { #include "packet_names.h" }; - nextstate(session, c); + nextstate(session, rtcm, c); gpsd_report(LOG_RAW+2, "%08ld: character '%c' [%02x], new state: %s\n", session->char_counter, (isprint(c)?c:'.'), c, - state_table[session->packet_state]); + state_table[session->state]); session->char_counter++; - if (session->packet_state == GROUND_STATE) { + if (session->state == GROUND_STATE) { character_discard(session); } #ifdef NMEA_ENABLE - else if (session->packet_state == NMEA_RECOGNIZED) { + else if (session->state == NMEA_RECOGNIZED) { bool checksum_ok = true; char csum[3]; char *trailer = (char *)session->inbufptr-5; @@ -665,13 +665,13 @@ ssize_t packet_parse(struct gps_device_t *session, size_t fix) if (checksum_ok) packet_accept(session, NMEA_PACKET); else - session->packet_state = GROUND_STATE; + session->state = GROUND_STATE; packet_discard(session); break; } #endif /* NMEA_ENABLE */ #ifdef SIRF_ENABLE - else if (session->packet_state == SIRF_RECOGNIZED) { + else if (session->state == SIRF_RECOGNIZED) { unsigned char *trailer = session->inbufptr-4; unsigned int checksum = (unsigned)((trailer[0] << 8) | trailer[1]); unsigned int n, crc = 0; @@ -681,16 +681,16 @@ ssize_t packet_parse(struct gps_device_t *session, size_t fix) if (checksum == crc) packet_accept(session, SIRF_PACKET); else - session->packet_state = GROUND_STATE; + session->state = GROUND_STATE; packet_discard(session); break; } #endif /* SIRF_ENABLE */ #if defined(TSIP_ENABLE) || defined(GARMIN_ENABLE) - else if (session->packet_state == TSIP_RECOGNIZED) { + else if (session->state == TSIP_RECOGNIZED) { size_t packetlen = session->inbufptr - session->inbuffer; if ( packetlen < 5) { - session->packet_state = GROUND_STATE; + session->state = GROUND_STATE; } else { unsigned int pkt_id, len; size_t n; @@ -824,7 +824,7 @@ ssize_t packet_parse(struct gps_device_t *session, size_t fix) * More attempts to recognize ambiguous TSIP-like * packet types could go here. */ - session->packet_state = GROUND_STATE; + session->state = GROUND_STATE; packet_discard(session); break; #endif /* TSIP_ENABLE */ @@ -832,7 +832,7 @@ ssize_t packet_parse(struct gps_device_t *session, size_t fix) } #endif /* TSIP_ENABLE || GARMIN_ENABLE */ #ifdef ZODIAC_ENABLE - else if (session->packet_state == ZODIAC_RECOGNIZED) { + else if (session->state == ZODIAC_RECOGNIZED) { short len, n, sum; len = getword(2); for (n = sum = 0; n < len; n++) @@ -844,14 +844,14 @@ ssize_t packet_parse(struct gps_device_t *session, size_t fix) gpsd_report(LOG_IO, "Zodiac data checksum 0x%hx over length %hd, expecting 0x%hx\n", sum, len, getword(5 + len)); - session->packet_state = GROUND_STATE; + session->state = GROUND_STATE; } packet_discard(session); break; } #endif /* ZODIAC_ENABLE */ #ifdef EVERMORE_ENABLE - else if (session->packet_state == EVERMORE_RECOGNIZED) { + else if (session->state == EVERMORE_RECOGNIZED) { unsigned int n, crc, checksum, len; n = 0; /*@ +charint */ @@ -894,15 +894,15 @@ ssize_t packet_parse(struct gps_device_t *session, size_t fix) packet_discard(session); break; not_evermore: - session->packet_state = GROUND_STATE; + session->state = GROUND_STATE; packet_discard(session); break; } #endif /* EVERMORE_ENABLE */ #ifdef ITALK_ENABLE - else if (session->packet_state == ITALK_RECOGNIZED) { + else if (session->state == ITALK_RECOGNIZED) { u_int16_t len, n, sum; - len = (unsigned short)(session->packet_length / 2 - 1); + len = (unsigned short)(session->length / 2 - 1); /* * Skip first 9 words so we compute checksum only over data * portion of packet. @@ -914,20 +914,20 @@ ssize_t packet_parse(struct gps_device_t *session, size_t fix) packet_accept(session, ITALK_PACKET); } else { gpsd_report(LOG_RAW, "italk checksum failed\n"); - session->packet_state = GROUND_STATE; + session->state = GROUND_STATE; } packet_discard(session); break; } #endif /* ITALK_ENABLE */ #ifdef RTCM104_ENABLE - else if (session->packet_state == RTCM_RECOGNIZED) { + else if (session->state == RTCM_RECOGNIZED) { /* * RTCM packets don't have checksums. The six bits of parity * per word and the preamble better be good enough. */ packet_accept(session, RTCM_PACKET); - session->packet_state = RTCM_SYNC_STATE; + session->state = RTCM_SYNC_STATE; packet_discard(session); break; } @@ -938,12 +938,12 @@ ssize_t packet_parse(struct gps_device_t *session, size_t fix) } #undef getword -ssize_t packet_get(struct gps_device_t *session) +ssize_t packet_get(int fd, struct rtcm_t *rtcm, struct gps_packet_t *session) /* grab a packet; returns either BAD_PACKET or the length */ { ssize_t fix; /*@ -modobserver @*/ - fix = read(session->gpsdata.gps_fd, session->inbuffer+session->inbuflen, + fix = read(fd, session->inbuffer+session->inbuflen, sizeof(session->inbuffer)-(session->inbuflen)); /*@ +modobserver @*/ if (fix == -1) { @@ -956,14 +956,14 @@ ssize_t packet_get(struct gps_device_t *session) if (fix == 0) return 0; - return packet_parse(session, (size_t)fix); + return packet_parse(session, rtcm, (size_t)fix); } -void packet_reset(struct gps_device_t *session) +void packet_reset(struct gps_packet_t *session) /* return the packet machine to the ground state */ { - session->packet_type = BAD_PACKET; - session->packet_state = GROUND_STATE; + session->type = BAD_PACKET; + session->state = GROUND_STATE; session->inbuflen = 0; session->inbufptr = session->inbuffer; #ifdef BINARY_ENABLE @@ -973,7 +973,7 @@ void packet_reset(struct gps_device_t *session) #ifdef __UNUSED__ -void packet_pushback(struct gps_device_t *session) +void packet_pushback(struct gps_packet_t *session) /* push back the last packet grabbed */ { if (session->outbuflen + session->inbuflen < MAX_PACKET_LENGTH) { diff --git a/packet_test.c b/packet_test.c index e0bb56a1..82dde9da 100644 --- a/packet_test.c +++ b/packet_test.c @@ -202,26 +202,27 @@ static struct map tests[] = { static int packet_test(struct map *mp) { - struct gps_device_t state; + struct gps_packet_t packet; + struct rtcm_t rtcm; ssize_t st; int failure = 0; - state.packet_type = BAD_PACKET; - state.packet_state = 0; - state.inbuflen = 0; - /*@i@*/memcpy(state.inbufptr = state.inbuffer, mp->test, mp->testlen); + packet.type = BAD_PACKET; + packet.state = 0; + packet.inbuflen = 0; + /*@i@*/memcpy(packet.inbufptr = packet.inbuffer, mp->test, mp->testlen); /*@ -compdef -uniondef -usedef -formatcode @*/ - st = packet_parse(&state, mp->testlen); - if (state.packet_type != mp->type) - printf("%2zi: %s test FAILED (packet type %d wrong).\n", mp-tests+1, mp->legend, state.packet_type); - else if (memcmp(mp->test + mp->garbage_offset, state.outbuffer, state.outbuflen)) { + st = packet_parse(&packet, &rtcm, mp->testlen); + if (packet.type != mp->type) + printf("%2zi: %s test FAILED (packet type %d wrong).\n", mp-tests+1, mp->legend, packet.type); + else if (memcmp(mp->test + mp->garbage_offset, packet.outbuffer, packet.outbuflen)) { printf("%2zi: %s test FAILED (data garbled).\n", mp-tests+1, mp->legend); ++failure; } else printf("%2zi: %s test succeeded.\n", mp-tests+1, mp->legend); #ifdef DUMPIT - for (cp = state.outbuffer; - cp < state.outbuffer + state.outbuflen; + for (cp = packet.outbuffer; + cp < packet.outbuffer + packet.outbuflen; cp++) { if (st != NMEA_PACKET) (void)printf(" 0x%02x", *cp); @@ -64,13 +64,12 @@ Starlink's website. static unsigned int tx_speed[] = { 25, 50, 100, 110, 150, 200, 250, 300 }; -void rtcm_unpack(struct gps_device_t *session) +void rtcm_unpack(/*@out@*/struct rtcm_t *tp, char *buf) /* break out the raw bits into the content fields */ { int len; unsigned int n, w; - struct rtcm_t *tp = &session->gpsdata.rtcm; - struct rtcm_msg_t *msg = (struct rtcm_msg_t *)session->driver.isgps.buf; + struct rtcm_msg_t *msg = (struct rtcm_msg_t *)buf; tp->type = msg->w1.msgtype; tp->length = msg->w2.frmlen; @@ -227,16 +226,14 @@ void rtcm_unpack(struct gps_device_t *session) } } -bool rtcm_repack(struct gps_device_t *session) +bool rtcm_repack(struct rtcm_t *tp, char *buf) /* repack the content fields into the raw bits */ { int len, sval; unsigned int n, w, uval; - struct rtcm_t *tp = &session->gpsdata.rtcm; - struct rtcm_msg_t *msg = (struct rtcm_msg_t *)session->driver.isgps.buf; - struct rtcm_msghw1 *wp = (struct rtcm_msghw1 *)session->driver.isgps.buf; + struct rtcm_msg_t *msg = (struct rtcm_msg_t *)buf; + struct rtcm_msghw1 *wp = (struct rtcm_msghw1 *)buf; - memset(session->driver.isgps.buf, 0, sizeof(session->driver.isgps.buf)); msg->w1.msgtype = tp->type; msg->w2.frmlen = tp->length; msg->w2.zcnt = (unsigned) round(tp->zcount / ZCOUNT_SCALE); @@ -424,7 +421,7 @@ bool rtcm_repack(struct gps_device_t *session) /* compute parity for each word in the message */ for (w = 0; w < tp->length; w++) - wp[w].parity = isgps_parity(session->driver.isgps.buf[w]); + wp[w].parity = isgps_parity(buf[w]); /* FIXME: must do inversion here */ return true; @@ -435,13 +432,15 @@ static bool preamble_match(isgps30bits_t *w) return (((struct rtcm_msghw1 *)w)->preamble == PREAMBLE_PATTERN); } -static bool length_check(struct gps_device_t *session) +static bool length_check(struct gps_packet_t *session) { - return session->driver.isgps.bufindex >= 2 - && session->driver.isgps.bufindex >= ((struct rtcm_msg_t *)session->driver.isgps.buf)->w2.frmlen + 2u; + return session->isgps.bufindex >= 2 + && session->isgps.bufindex >= ((struct rtcm_msg_t *)session->isgps.buf)->w2.frmlen + 2u; } -enum isgpsstat_t rtcm_decode(struct gps_device_t *session, unsigned int c) +enum isgpsstat_t rtcm_decode(struct gps_packet_t *session, + struct rtcm_t *rtcm, + unsigned int c) { enum isgpsstat_t res = isgps_decode(session, preamble_match, @@ -449,66 +448,66 @@ enum isgpsstat_t rtcm_decode(struct gps_device_t *session, unsigned int c) RTCM_WORDS_MAX, c); if (res == ISGPS_MESSAGE) - rtcm_unpack(session); + rtcm_unpack(rtcm, (char *)session->isgps.buf); return res; } -void rtcm_dump(struct gps_device_t *session, /*@out@*/char buf[], size_t buflen) +void rtcm_dump(struct rtcm_t *rtcm, /*@out@*/char buf[], size_t buflen) /* dump the contents of a parsed RTCM104 message */ { unsigned int n; (void)snprintf(buf, buflen, "H\t%u\t%u\t%0.1f\t%u\t%u\t%u\n", - session->gpsdata.rtcm.type, - session->gpsdata.rtcm.refstaid, - session->gpsdata.rtcm.zcount, - session->gpsdata.rtcm.seqnum, - session->gpsdata.rtcm.length, - session->gpsdata.rtcm.stathlth); - - switch (session->gpsdata.rtcm.type) { + rtcm->type, + rtcm->refstaid, + rtcm->zcount, + rtcm->seqnum, + rtcm->length, + rtcm->stathlth); + + switch (rtcm->type) { case 1: case 9: - for (n = 0; n < session->gpsdata.rtcm.msg_data.ranges.nentries; n++) { - struct rangesat_t *rsp = &session->gpsdata.rtcm.msg_data.ranges.sat[n]; + for (n = 0; n < rtcm->msg_data.ranges.nentries; n++) { + struct rangesat_t *rsp = &rtcm->msg_data.ranges.sat[n]; (void)snprintf(buf + strlen(buf), buflen - strlen(buf), "S\t%u\t%u\t%u\t%0.1f\t%0.3f\t%0.3f\n", rsp->ident, rsp->udre, rsp->issuedata, - session->gpsdata.rtcm.zcount, + rtcm->zcount, rsp->rangerr, rsp->rangerate); } break; case 3: - if (session->gpsdata.rtcm.msg_data.ecef.valid) + if (rtcm->msg_data.ecef.valid) (void)snprintf(buf + strlen(buf), buflen - strlen(buf), "R\t%.2f\t%.2f\t%.2f\n", - session->gpsdata.rtcm.msg_data.ecef.x, - session->gpsdata.rtcm.msg_data.ecef.y, - session->gpsdata.rtcm.msg_data.ecef.z); + rtcm->msg_data.ecef.x, + rtcm->msg_data.ecef.y, + rtcm->msg_data.ecef.z); break; case 4: - if (session->gpsdata.rtcm.msg_data.reference.valid) + if (rtcm->msg_data.reference.valid) (void)snprintf(buf + strlen(buf), buflen - strlen(buf), "D\t%s\t%1d\t%s\t%.1f\t%.1f\t%.1f\n", - (session->gpsdata.rtcm.msg_data.reference.system==gps) ? "GPS" - : ((session->gpsdata.rtcm.msg_data.reference.system==glonass) ? "GLONASS" + (rtcm->msg_data.reference.system==gps) ? "GPS" + : ((rtcm->msg_data.reference.system==glonass) ? "GLONASS" : "UNKNOWN"), - session->gpsdata.rtcm.msg_data.reference.sense, - session->gpsdata.rtcm.msg_data.reference.datum, - session->gpsdata.rtcm.msg_data.reference.dx, - session->gpsdata.rtcm.msg_data.reference.dy, - session->gpsdata.rtcm.msg_data.reference.dz); + rtcm->msg_data.reference.sense, + rtcm->msg_data.reference.datum, + rtcm->msg_data.reference.dx, + rtcm->msg_data.reference.dy, + rtcm->msg_data.reference.dz); break; case 5: - for (n = 0; n < session->gpsdata.rtcm.msg_data.conhealth.nentries; n++) { - struct consat_t *csp = &session->gpsdata.rtcm.msg_data.conhealth.sat[n]; + for (n = 0; n < rtcm->msg_data.conhealth.nentries; n++) { + struct consat_t *csp = &rtcm->msg_data.conhealth.sat[n]; (void)snprintf(buf + strlen(buf), buflen - strlen(buf), "C\t%2u\t%1u\t%1u\t%2d\t%1u\t%1u\t%1u\t%2u\n", csp->ident, @@ -527,8 +526,8 @@ void rtcm_dump(struct gps_device_t *session, /*@out@*/char buf[], size_t buflen) break; case 7: - for (n = 0; n < session->gpsdata.rtcm.msg_data.almanac.nentries; n++) { - struct station_t *ssp = &session->gpsdata.rtcm.msg_data.almanac.station[n]; + for (n = 0; n < rtcm->msg_data.almanac.nentries; n++) { + struct station_t *ssp = &rtcm->msg_data.almanac.station[n]; (void)snprintf(buf + strlen(buf), buflen - strlen(buf), "A\t%.4f\t%.4f\t%u\t%.1f\t%u\t%u\t%u\n", ssp->latitude, @@ -542,13 +541,13 @@ void rtcm_dump(struct gps_device_t *session, /*@out@*/char buf[], size_t buflen) break; case 16: (void)snprintf(buf + strlen(buf), buflen - strlen(buf), - "T\t\"%s\"\n", session->gpsdata.rtcm.msg_data.message); + "T\t\"%s\"\n", rtcm->msg_data.message); break; default: - for (n = 0; n < session->gpsdata.rtcm.length; n++) + for (n = 0; n < rtcm->length; n++) (void)snprintf(buf + strlen(buf), buflen - strlen(buf), - "U\t0x%08x\n", session->gpsdata.rtcm.msg_data.words[n]); + "U\t0x%08x\n", rtcm->msg_data.words[n]); break; } diff --git a/rtcmdecode.c b/rtcmdecode.c index 1c9fd14d..5e010d55 100644 --- a/rtcmdecode.c +++ b/rtcmdecode.c @@ -35,20 +35,21 @@ static void decode(FILE *fpin, FILE *fpout) { int c; struct gps_device_t device; + struct rtcm_t rtcm; enum isgpsstat_t res; off_t count; char buf[BUFSIZ]; - isgps_init(&device); + isgps_init(&device.packet); count = 0; while ((c = fgetc(fpin)) != EOF) { - res = rtcm_decode(&device, (unsigned int)c); + res = rtcm_decode(&device.packet, &rtcm, (unsigned int)c); if (verbose >= ISGPS_ERRLEVEL_BASE + 3) fprintf(fpout, "%08lu: '%c' [%02x] -> %d\n", (unsigned long)count++, (isprint(c)?c:'.'), (unsigned)(c & 0xff), res); if (res == ISGPS_MESSAGE) { - rtcm_dump(&device, buf, sizeof(buf)); + rtcm_dump(&rtcm, buf, sizeof(buf)); (void)fputs(buf, fpout); } } @@ -75,9 +76,10 @@ static void pass(FILE *fpin, FILE *fpout) status = rtcm_undump(&session.gpsdata.rtcm, buf); if (status == 0) { - (void)rtcm_repack(&session); - (void)rtcm_unpack(&session); - (void)rtcm_dump(&session, buf, sizeof(buf)); + (void)memset(session.packet.isgps.buf, 0, sizeof(session.packet.isgps.buf)); + (void)rtcm_repack(&session.gpsdata.rtcm, (char *)session.packet.isgps.buf); + (void)rtcm_unpack(&session.gpsdata.rtcm, (char *)session.packet.isgps.buf); + (void)rtcm_dump(&session.gpsdata.rtcm, buf, sizeof(buf)); (void)fputs(buf, fpout); memset(&session, 0, sizeof(session)); } else if (status < 0) { @@ -102,8 +104,9 @@ static void encode(FILE *fpin, FILE *fpout) status = rtcm_undump(&session.gpsdata.rtcm, buf); if (status == 0) { - (void)rtcm_repack(&session); - (void)fwrite(session.driver.isgps.buf, + (void)memset(session.packet.isgps.buf, 0, sizeof(session.packet.isgps.buf)); + (void)rtcm_repack(&session.gpsdata.rtcm, (char *)session.packet.isgps.buf); + (void)fwrite(session.packet.isgps.buf, sizeof(isgps30bits_t), (size_t)session.gpsdata.rtcm.length, fpout); memset(&session, 0, sizeof(session)); @@ -194,7 +194,7 @@ void gpsd_set_speed(struct gps_device_t *session, } else if (session->device_type->probe_wakeup != NULL) session->device_type->probe_wakeup(session); } - packet_reset(session); + packet_reset(&session->packet); } int gpsd_open(struct gps_device_t *session) @@ -219,7 +219,7 @@ int gpsd_open(struct gps_device_t *session) (void)tcflush(session->gpsdata.gps_fd, TCIOFLUSH); } - session->packet_type = BAD_PACKET; + session->packet.type = BAD_PACKET; if (isatty(session->gpsdata.gps_fd)!=0) { /* Save original terminal parameters */ if (tcgetattr(session->gpsdata.gps_fd,&session->ttyset_old) != 0) @@ -281,8 +281,8 @@ bool gpsd_next_hunt_setting(struct gps_device_t *session) static unsigned int rates[] = {0, 4800, 9600, 19200, 38400, 57600}; #endif /* FIXED_PORT_SPEED defined */ - if (session->retry_counter++ >= SNIFF_RETRIES) { - session->retry_counter = 0; + if (session->packet.retry_counter++ >= SNIFF_RETRIES) { + session->packet.retry_counter = 0; if (session->baudindex++ >= (unsigned int)(sizeof(rates)/sizeof(rates[0]))-1) { session->baudindex = 0; if (session->gpsdata.stopbits++ >= 2) @@ -716,13 +716,14 @@ static gps_mask_t sirfbin_parse_input(struct gps_device_t *session) { gps_mask_t st; - if (session->packet_type == SIRF_PACKET){ - st = sirf_parse(session, session->outbuffer, session->outbuflen); + if (session->packet.type == SIRF_PACKET){ + st = sirf_parse(session, session->packet.outbuffer, + session->packet.outbuflen); session->gpsdata.driver_mode = 1; /* binary */ return st; #ifdef NMEA_ENABLE - } else if (session->packet_type == NMEA_PACKET) { - st = nmea_parse((char *)session->outbuffer, session); + } else if (session->packet.type == NMEA_PACKET) { + st = nmea_parse((char *)session->packet.outbuffer, session); session->gpsdata.driver_mode = 0; /* NMEA */ return st; #endif /* NMEA_ENABLE */ @@ -735,7 +736,7 @@ static void sirfbin_configure(struct gps_device_t *session, unsigned int seq) { if (seq != 0) return; - if (session->packet_type == NMEA_PACKET) { + if (session->packet.type == NMEA_PACKET) { gpsd_report(LOG_PROG, "Switching chip mode to SiRF binary.\n"); (void)nmea_send(session->gpsdata.gps_fd, "$PSRF100,0,%d,8,1,0", session->gpsdata.baudrate); @@ -828,7 +829,7 @@ struct gps_type_t sirf_binary = #ifdef ALLOW_RECONFIGURE .configurator = sirfbin_configure,/* initialize the device */ #endif /* ALLOW_RECONFIGURE */ - .get_packet = packet_get, /* use the generic packet getter */ + .get_packet = generic_get, /* use the generic packet getter */ .parse_packet = sirfbin_parse_input,/* parse message packets */ .rtcm_writer = pass_rtcm, /* send RTCM data straight */ .speed_switcher = sirfbin_speed, /* we can change baud rate */ @@ -144,32 +144,32 @@ static gps_mask_t tsip_analyze(struct gps_device_t *session) unsigned char buf[BUFSIZ]; char buf2[BUFSIZ]; - if (session->packet_type != TSIP_PACKET) { - gpsd_report(LOG_INF, "tsip_analyze packet type %d\n",session->packet_type); + if (session->packet.type != TSIP_PACKET) { + gpsd_report(LOG_INF, "tsip_analyze packet type %d\n",session->packet.type); return 0; } /*@ +charint @*/ - if (session->outbuflen < 4 || session->outbuffer[0] != 0x10) + if (session->packet.outbuflen < 4 || session->packet.outbuffer[0] != 0x10) return 0; /* remove DLE stuffing and put data part of message in buf */ memset(buf, 0, sizeof(buf)); buf2[len = 0] = '\0'; - for (i = 2; i < (int)session->outbuflen; i++) { - if (session->outbuffer[i] == 0x10) - if (session->outbuffer[++i] == 0x03) + for (i = 2; i < (int)session->packet.outbuflen; i++) { + if (session->packet.outbuffer[i] == 0x10) + if (session->packet.outbuffer[++i] == 0x03) break; (void)snprintf(buf2+strlen(buf2), sizeof(buf2)-strlen(buf2), - "%02x", buf[len++] = session->outbuffer[i]); + "%02x", buf[len++] = session->packet.outbuffer[i]); } /*@ -charint @*/ (void)snprintf(session->gpsdata.tag, sizeof(session->gpsdata.tag), - "ID%02x", id = (unsigned)session->outbuffer[1]); + "ID%02x", id = (unsigned)session->packet.outbuffer[1]); gpsd_report(LOG_IO, "TSIP packet id 0x%02x length %d: %s\n",id,len,buf2); (void)time(&now); @@ -703,14 +703,14 @@ static gps_mask_t tsip_parse_input(struct gps_device_t *session) { gps_mask_t st; - if (session->packet_type == TSIP_PACKET){ + if (session->packet.type == TSIP_PACKET){ st = tsip_analyze(session); session->gpsdata.driver_mode = 1; /* binary */ return st; #ifdef EVERMORE_ENABLE - } else if (session->packet_type == EVERMORE_PACKET) { + } else if (session->packet.type == EVERMORE_PACKET) { (void)gpsd_switch_driver(session, "EverMore binary"); - st = evermore_parse(session, session->outbuffer, session->outbuflen); + st = evermore_parse(session, session->packet.outbuffer, session->packet.outbuflen); session->gpsdata.driver_mode = 1; /* binary */ return st; #endif /* EVERMORE_ENABLE */ @@ -730,7 +730,7 @@ struct gps_type_t tsip_binary = #ifdef ALLOW_RECONFIGURE .configurator = tsip_configurator,/* initial mode sets */ #endif /* ALLOW_RECONFIGURE */ - .get_packet = packet_get, /* use the generic packet getter */ + .get_packet = generic_get, /* use the generic packet getter */ .parse_packet = tsip_parse_input, /* parse message packets */ .rtcm_writer = NULL, /* doesn't accept DGPS corrections */ .speed_switcher = tsip_speed_switch,/* change baud rate */ @@ -368,19 +368,19 @@ static gps_mask_t zodiac_analyze(struct gps_device_t *session) { char buf[BUFSIZ]; int i; - unsigned int id = (unsigned int)((session->outbuffer[3]<<8) | session->outbuffer[2]); + unsigned int id = (unsigned int)((session->packet.outbuffer[3]<<8) | session->packet.outbuffer[2]); - if (session->packet_type != ZODIAC_PACKET) { + if (session->packet.type != ZODIAC_PACKET) { struct gps_type_t **dp; - gpsd_report(LOG_PROG, "zodiac_analyze packet type %d\n",session->packet_type); + gpsd_report(LOG_PROG, "zodiac_analyze packet type %d\n",session->packet.type); // Wrong packet type ? // Maybe find a trigger just in case it's an Earthmate - gpsd_report(LOG_RAW+4, "Is this a trigger: %s ?\n", (char*)session->outbuffer); + gpsd_report(LOG_RAW+4, "Is this a trigger: %s ?\n", (char*)session->packet.outbuffer); for (dp = gpsd_drivers; *dp; dp++) { char *trigger = (*dp)->trigger; - if (trigger!=NULL && strncmp((char *)session->outbuffer, trigger, strlen(trigger))==0 && isatty(session->gpsdata.gps_fd)!=0) { + if (trigger!=NULL && strncmp((char *)session->packet.outbuffer, trigger, strlen(trigger))==0 && isatty(session->gpsdata.gps_fd)!=0) { gpsd_report(LOG_PROG, "found %s.\n", trigger); (void)gpsd_switch_driver(session, (*dp)->typename); @@ -391,13 +391,13 @@ static gps_mask_t zodiac_analyze(struct gps_device_t *session) } buf[0] = '\0'; - for (i = 0; i < (int)session->outbuflen; i++) + for (i = 0; i < (int)session->packet.outbuflen; i++) (void)snprintf(buf+strlen(buf), sizeof(buf)-strlen(buf), - "%02x", (unsigned int)session->outbuffer[i]); + "%02x", (unsigned int)session->packet.outbuffer[i]); (void)strlcat(buf, "\n", BUFSIZ); - gpsd_report(LOG_RAW, "Raw Zodiac packet type %d length %d: %s\n",id,session->outbuflen,buf); + gpsd_report(LOG_RAW, "Raw Zodiac packet type %d length %d: %s\n",id,session->packet.outbuflen,buf); - if (session->outbuflen < 10) + if (session->packet.outbuflen < 10) return 0; (void)snprintf(session->gpsdata.tag,sizeof(session->gpsdata.tag),"%u",id); @@ -436,7 +436,7 @@ struct gps_type_t zodiac_binary = #ifdef ALLOW_RECONFIGURE .configurator = NULL, /* no configuration */ #endif /* ALLOW_RECONFIGURE */ - .get_packet = packet_get, /* use the generic packet getter */ + .get_packet = generic_get, /* use the generic packet getter */ .parse_packet = zodiac_analyze, /* parse message packets */ .rtcm_writer = zodiac_send_rtcm, /* send DGPS correction */ .speed_switcher = zodiac_speed_switch,/* we can change baud rate */ |