summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bits.h14
-rw-r--r--drivers.c51
-rw-r--r--evermore.c12
-rw-r--r--garmin.c12
-rw-r--r--gpsd.c12
-rw-r--r--gpsd.h90
-rw-r--r--isgps.c98
-rw-r--r--libgpsd_core.c44
-rw-r--r--packet.c360
-rw-r--r--packet_test.c23
-rw-r--r--rtcm.c89
-rw-r--r--rtcmdecode.c19
-rw-r--r--serial.c8
-rw-r--r--sirf.c13
-rw-r--r--tsip.c24
-rw-r--r--zodiac.c20
16 files changed, 453 insertions, 436 deletions
diff --git a/bits.h b/bits.h
index 9e642b2a..8bdae448 100644
--- a/bits.h
+++ b/bits.h
@@ -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))
diff --git a/drivers.c b/drivers.c
index 15222aa3..4c2429bc 100644
--- a/drivers.c
+++ b/drivers.c
@@ -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 */
diff --git a/evermore.c b/evermore.c
index 8c9e124a..01183891 100644
--- a/evermore.c
+++ b/evermore.c
@@ -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 */
diff --git a/garmin.c b/garmin.c
index 08c3a0bd..ab03ce50 100644
--- a/garmin.c
+++ b/garmin.c
@@ -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 */
diff --git a/gpsd.c b/gpsd.c
index 4c373a4b..cad5d5f9 100644
--- a/gpsd.c
+++ b/gpsd.c
@@ -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++)
diff --git a/gpsd.h b/gpsd.h
index 60f1d3d1..2b6b8f1e 100644
--- a/gpsd.h
+++ b/gpsd.h
@@ -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,
diff --git a/isgps.c b/isgps.c
index 11ffebbf..9e8c07a4 100644
--- a/isgps.c
+++ b/isgps.c
@@ -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 {
diff --git a/packet.c b/packet.c
index 43cd2567..20bab53a 100644
--- a/packet.c
+++ b/packet.c
@@ -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);
diff --git a/rtcm.c b/rtcm.c
index e6fa238d..190f66e8 100644
--- a/rtcm.c
+++ b/rtcm.c
@@ -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));
diff --git a/serial.c b/serial.c
index 3843e799..49a1b304 100644
--- a/serial.c
+++ b/serial.c
@@ -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)
diff --git a/sirf.c b/sirf.c
index a11215b9..1050a0f9 100644
--- a/sirf.c
+++ b/sirf.c
@@ -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 */
diff --git a/tsip.c b/tsip.c
index 43ac936a..91f84464 100644
--- a/tsip.c
+++ b/tsip.c
@@ -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 */
diff --git a/zodiac.c b/zodiac.c
index d4e76bbd..58482221 100644
--- a/zodiac.c
+++ b/zodiac.c
@@ -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 */