summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--driver_evermore.c2
-rw-r--r--driver_garmin.c2
-rw-r--r--driver_garmin_txt.c3
-rw-r--r--driver_italk.c2
-rw-r--r--driver_navcom.c2
-rw-r--r--driver_nmea.c10
-rw-r--r--driver_proto.c7
-rw-r--r--driver_sirf.c2
-rw-r--r--driver_superstar2.c4
-rw-r--r--driver_tsip.c10
-rw-r--r--driver_ubx.c2
-rw-r--r--driver_zodiac.c2
-rw-r--r--gpsd.c2
-rw-r--r--gpsd.h-tail5
-rw-r--r--libgpsd_core.c2
15 files changed, 34 insertions, 23 deletions
diff --git a/driver_evermore.c b/driver_evermore.c
index 040ddb64..4fcc753c 100644
--- a/driver_evermore.c
+++ b/driver_evermore.c
@@ -195,7 +195,7 @@ gps_mask_t evermore_parse(struct gps_device_t *session, unsigned char *buf, size
session->gpsdata.status,
visible,
used);
- session->cycle_state = cycle_start;
+ session->cycle_state |= CYCLE_START;
mask |= TIME_SET | LATLON_SET | TRACK_SET | SPEED_SET | MODE_SET;
if (session->subtype[0] == '\0') {
(void)snprintf(session->subtype, sizeof(session->subtype),
diff --git a/driver_garmin.c b/driver_garmin.c
index 0db6235a..abbbcc44 100644
--- a/driver_garmin.c
+++ b/driver_garmin.c
@@ -468,7 +468,7 @@ gps_mask_t PrintSERPacket(struct gps_device_t *session, unsigned char pkt_id
, pvt->leap_sec
, pvt->grmn_days);
- session->cycle_state = cycle_start;
+ session->cycle_state |= CYCLE_START;
mask |= TIME_SET | LATLON_SET | ALTITUDE_SET | STATUS_SET | MODE_SET | SPEED_SET | TRACK_SET | CLIMB_SET | HERR_SET | VERR_SET | PERR_SET;
break;
case GARMIN_PKTID_RMD_DATA:
diff --git a/driver_garmin_txt.c b/driver_garmin_txt.c
index 505bbd85..2b607d2e 100644
--- a/driver_garmin_txt.c
+++ b/driver_garmin_txt.c
@@ -285,7 +285,8 @@ gps_mask_t garmintxt_parse(struct gps_device_t *session)
/* TAG message as GTXT, Garmin Simple Text Message */
strncpy(session->gpsdata.tag, "GTXT", MAXTAGLEN);
- session->cycle_state = cycle_start; /* only one message, set cycle start */
+ /* only one message, set cycle start */
+ session->cycle_state |= CYCLE_END_RELIABLE | CYCLE_START | CYCLE_END;
do {
unsigned int result;
char *buf = (char *)session->packet.outbuffer+1;
diff --git a/driver_italk.c b/driver_italk.c
index f33ab10b..848255fc 100644
--- a/driver_italk.c
+++ b/driver_italk.c
@@ -45,7 +45,7 @@ static gps_mask_t decode_itk_navfix(struct gps_device_t *session, unsigned char
session->gpsdata.status = STATUS_NO_FIX;
session->gpsdata.fix.mode = MODE_NO_FIX;
- session->cycle_state = cycle_start;
+ session->cycle_state |= CYCLE_START;
mask = ONLINE_SET | MODE_SET | STATUS_SET;
/* just bail out if this fix is not marked valid */
diff --git a/driver_navcom.c b/driver_navcom.c
index ac709743..d285c210 100644
--- a/driver_navcom.c
+++ b/driver_navcom.c
@@ -540,7 +540,7 @@ static gps_mask_t handle_0xb1(struct gps_device_t *session)
#undef VEL_RES
#undef DOP_UNDEFINED
- session->cycle_state = cycle_start;
+ session->cycle_state |= CYCLE_START;
return LATLON_SET | ALTITUDE_SET | CLIMB_SET | SPEED_SET | TRACK_SET
| TIME_SET | STATUS_SET | MODE_SET | USED_SET | HERR_SET | VERR_SET
| TIMERR_SET | DOP_SET;
diff --git a/driver_nmea.c b/driver_nmea.c
index c42aa4f5..67a300a7 100644
--- a/driver_nmea.c
+++ b/driver_nmea.c
@@ -155,7 +155,7 @@ static gps_mask_t processGPRMC(int count, char *field[], struct gps_device_t *se
mask |= TIME_SET;
session->gpsdata.fix.time = (double)mkgmtime(&session->driver.nmea.date)+session->driver.nmea.subseconds;
if (!GPS_TIME_EQUAL(session->gpsdata.sentence_time, session->gpsdata.fix.time)) {
- session->cycle_state = cycle_start;
+ session->cycle_state |= CYCLE_START;
gpsd_report(LOG_PROG, "GPRMC starts a reporting cycle.\n");
}
session->gpsdata.sentence_time = session->gpsdata.fix.time;
@@ -234,7 +234,7 @@ static gps_mask_t processGPGLL(int count, char *field[], struct gps_device_t *se
mask = TIME_SET;
session->gpsdata.fix.time = (double)mkgmtime(&session->driver.nmea.date)+session->driver.nmea.subseconds;
if (!GPS_TIME_EQUAL(session->gpsdata.sentence_time, session->gpsdata.fix.time)) {
- session->cycle_state = cycle_start;
+ session->cycle_state |= CYCLE_START;
gpsd_report(LOG_PROG, "GPGLL starts a reporting cycle.\n");
}
session->gpsdata.sentence_time = session->gpsdata.fix.time;
@@ -299,7 +299,7 @@ static gps_mask_t processGPGGA(int c UNUSED, char *field[], struct gps_device_t
mask |= TIME_SET;
session->gpsdata.fix.time = (double)mkgmtime(&session->driver.nmea.date)+session->driver.nmea.subseconds;
if (!GPS_TIME_EQUAL(session->gpsdata.sentence_time, session->gpsdata.fix.time)) {
- session->cycle_state = cycle_start;
+ session->cycle_state |= CYCLE_START;
gpsd_report(LOG_PROG, "GPGGA starts a reporting cycle.\n");
}
session->gpsdata.sentence_time = session->gpsdata.fix.time;
@@ -587,7 +587,7 @@ static gps_mask_t processGPZDA(int c UNUSED, char *field[], struct gps_device_t
session->driver.nmea.date.tm_mday = atoi(field[2]);
session->gpsdata.fix.time = (double)mkgmtime(&session->driver.nmea.date)+session->driver.nmea.subseconds;
if (!GPS_TIME_EQUAL(session->gpsdata.sentence_time, session->gpsdata.fix.time)) {
- session->cycle_state = cycle_start;
+ session->cycle_state |= CYCLE_START;
gpsd_report(LOG_PROG, "GPZDA starts a reporting cycle.\n");
}
session->gpsdata.sentence_time = session->gpsdata. fix.time;
@@ -720,7 +720,7 @@ static gps_mask_t processPASHR(int c UNUSED, char *field[], struct gps_device_t
"%s ver %s", field[2], field[3]);
return 0;
} else if (0 == strcmp("POS", field[1])){ /* 3D Position */
- session->cycle_state = cycle_start;
+ session->cycle_state |= CYCLE_START;
mask |= MODE_SET | STATUS_SET;
if (0 == strlen(field[2])){
/* empty first field means no 3D fix is available */
diff --git a/driver_proto.c b/driver_proto.c
index 225c98c4..b6b96149 100644
--- a/driver_proto.c
+++ b/driver_proto.c
@@ -211,6 +211,13 @@ gps_mask_t _proto__dispatch(struct gps_device_t *session, unsigned char *buf, si
if (len == 0)
return 0;
+ /*
+ * Set this if the driver reliably signals end of cycle.
+ * The core library zeroes it just before it calls each driver's
+ * packet analyzer.
+ */
+ session->cycle_state = CYCLE_END_RELIABLE;
+
type = GET_MESSAGE_TYPE();
/* we may need to dump the raw packet */
diff --git a/driver_sirf.c b/driver_sirf.c
index c082a7ee..2344c570 100644
--- a/driver_sirf.c
+++ b/driver_sirf.c
@@ -468,7 +468,7 @@ static gps_mask_t sirf_msg_navsol(struct gps_device_t *session, unsigned char *b
#endif /* NTPSHM_ENABLE */
/* fix quality data */
session->gpsdata.hdop = (double)getub(buf, 20)/5.0;
- session->cycle_state = cycle_start;
+ session->cycle_state |= CYCLE_START;
mask |= TIME_SET | LATLON_SET | TRACK_SET | SPEED_SET | STATUS_SET | MODE_SET | HDOP_SET | USED_SET;
}
return mask;
diff --git a/driver_superstar2.c b/driver_superstar2.c
index e5c68463..7422dca0 100644
--- a/driver_superstar2.c
+++ b/driver_superstar2.c
@@ -144,7 +144,7 @@ superstar2_msg_navsol_lla(struct gps_device_t *session,
session->gpsdata.fix.mode = MODE_NO_FIX;
}
- session->cycle_state = cycle_start;
+ session->cycle_state |= CYCLE_START;
mask |= MODE_SET | STATUS_SET ;
return mask;
@@ -218,7 +218,7 @@ superstar2_msg_navsol_ecef(struct gps_device_t *session,
session->gpsdata.fix.mode = MODE_NO_FIX;
}
- session->cycle_state = cycle_start;
+ session->cycle_state |= CYCLE_START;
mask |= MODE_SET | STATUS_SET;
return mask;
diff --git a/driver_tsip.c b/driver_tsip.c
index 0adcd7d6..ae4e0981 100644
--- a/driver_tsip.c
+++ b/driver_tsip.c
@@ -266,7 +266,7 @@ static gps_mask_t tsip_analyze(struct gps_device_t *session)
session->gpsdata.fix.latitude,
session->gpsdata.fix.longitude,
session->gpsdata.fix.altitude);
- session->cycle_state = cycle_start;
+ session->cycle_state |= CYCLE_START;
mask |= LATLON_SET | ALTITUDE_SET;
break;
case 0x4b: /* Machine/Code ID and Additional Status */
@@ -486,7 +486,7 @@ static gps_mask_t tsip_analyze(struct gps_device_t *session)
session->gpsdata.fix.latitude,
session->gpsdata.fix.longitude,
session->gpsdata.fix.altitude);
- session->cycle_state = cycle_start;
+ session->cycle_state |= CYCLE_START;
mask |= LATLON_SET | ALTITUDE_SET;
break;
case 0x8f: /* Super Packet. Well... */
@@ -564,7 +564,7 @@ static gps_mask_t tsip_analyze(struct gps_device_t *session)
session->driver.tsip.gps_week = s4;
session->gpsdata.fix.time = session->gpsdata.sentence_time =
gpstime_to_unix((int)s4, ul1 * 1e-3) - session->context->leap_seconds;
- session->cycle_state = cycle_start;
+ session->cycle_state |= CYCLE_START;
mask |= TIME_SET | LATLON_SET | ALTITUDE_SET | SPEED_SET | TRACK_SET | CLIMB_SET | STATUS_SET | MODE_SET;
break;
case 0x23: /* Compact Super Packet */
@@ -617,7 +617,7 @@ static gps_mask_t tsip_analyze(struct gps_device_t *session)
/*@ +evalorder @*/
if ((session->gpsdata.fix.track = atan2(d1,d2) * RAD_2_DEG) < 0)
session->gpsdata.fix.track += 360.0;
- session->cycle_state = cycle_start;
+ session->cycle_state |= CYCLE_START;
mask |= TIME_SET | LATLON_SET | ALTITUDE_SET | SPEED_SET | TRACK_SET | CLIMB_SET | STATUS_SET | MODE_SET;
break;
@@ -697,7 +697,7 @@ static gps_mask_t tsip_analyze(struct gps_device_t *session)
session->gpsdata.fix.longitude,
session->gpsdata.fix.altitude);
- session->cycle_state = cycle_start;
+ session->cycle_state |= CYCLE_START;
mask |= LATLON_SET | ALTITUDE_SET | STATUS_SET | MODE_SET;
break;
diff --git a/driver_ubx.c b/driver_ubx.c
index 93b3954c..d4b6f5b5 100644
--- a/driver_ubx.c
+++ b/driver_ubx.c
@@ -115,7 +115,7 @@ ubx_msg_nav_sol(struct gps_device_t *session, unsigned char *buf, size_t data_le
else if (session->gpsdata.fix.mode != MODE_NO_FIX)
session->gpsdata.status = STATUS_FIX;
- session->cycle_state = cycle_start;
+ session->cycle_state |= CYCLE_START;
mask |= MODE_SET | STATUS_SET | USED_SET ;
return mask;
diff --git a/driver_zodiac.c b/driver_zodiac.c
index 4637a6dd..c6117870 100644
--- a/driver_zodiac.c
+++ b/driver_zodiac.c
@@ -218,7 +218,7 @@ static gps_mask_t handle1000(struct gps_device_t *session)
#endif
session->gpsdata.sentence_length = 55;
- session->cycle_state = cycle_start;
+ session->cycle_state |= CYCLE_START;
return TIME_SET|LATLON_SET|ALTITUDE_SET|CLIMB_SET|SPEED_SET|TRACK_SET|STATUS_SET|MODE_SET; /* |HERR_SET|VERR_SET|SPEEDERR_SET */
}
diff --git a/gpsd.c b/gpsd.c
index 9543fe44..841921c7 100644
--- a/gpsd.c
+++ b/gpsd.c
@@ -2209,7 +2209,7 @@ int main(int argc, char *argv[])
channel < channels + NITEMS(channels);
channel++) {
if (channel->device == device) {
- if (channel->subscriber->policy.buffer_policy == casoc && channel->device->cycle_state == cycle_start)
+ if (channel->subscriber->policy.buffer_policy == casoc && (channel->device->cycle_state & CYCLE_START)!=0)
gps_clear_fix(&channel->fixbuffer);
/* don't downgrade mode if holding previous fix */
if (channel->fixbuffer.mode > channel->device->gpsdata.fix.mode)
diff --git a/gpsd.h-tail b/gpsd.h-tail
index 878391cb..31641abe 100644
--- a/gpsd.h-tail
+++ b/gpsd.h-tail
@@ -258,7 +258,10 @@ struct gps_device_t {
char msgbuf[MAX_PACKET_LENGTH*2+1]; /* command message buffer for sends */
size_t msgbuflen;
int observed; /* which packet type`s have we seen? */
- enum {cycle_undefined, cycle_start, cycle_end} cycle_state;
+ int cycle_state;
+#define CYCLE_START 0x01 /* sentence starts a reporting cycle */
+#define CYCLE_END 0x02 /* sentence ends a reporting cycle */
+#define CYCLE_END_RELIABLE 0x04 /* does this device set end reliably? */
/*
* The rest of this structure is driver-specific private storage.
* Because the Garmin driver uses a long buffer, you can have
diff --git a/libgpsd_core.c b/libgpsd_core.c
index 31dcf620..7220e410 100644
--- a/libgpsd_core.c
+++ b/libgpsd_core.c
@@ -754,7 +754,7 @@ gps_mask_t gpsd_poll(struct gps_device_t *session)
} else {
gps_mask_t received, dopmask = 0;
session->gpsdata.online = timestamp();
- session->cycle_state = cycle_undefined;
+ session->cycle_state = 0;
gpsd_report(LOG_RAW+3, "Accepted packet on %s.\n",
session->gpsdata.dev.path);