diff options
-rw-r--r-- | driver_evermore.c | 2 | ||||
-rw-r--r-- | driver_garmin.c | 2 | ||||
-rw-r--r-- | driver_garmin_txt.c | 3 | ||||
-rw-r--r-- | driver_italk.c | 2 | ||||
-rw-r--r-- | driver_navcom.c | 2 | ||||
-rw-r--r-- | driver_nmea.c | 10 | ||||
-rw-r--r-- | driver_proto.c | 7 | ||||
-rw-r--r-- | driver_sirf.c | 2 | ||||
-rw-r--r-- | driver_superstar2.c | 4 | ||||
-rw-r--r-- | driver_tsip.c | 10 | ||||
-rw-r--r-- | driver_ubx.c | 2 | ||||
-rw-r--r-- | driver_zodiac.c | 2 | ||||
-rw-r--r-- | gpsd.c | 2 | ||||
-rw-r--r-- | gpsd.h-tail | 5 | ||||
-rw-r--r-- | libgpsd_core.c | 2 |
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 */ } @@ -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); |