From: Dave Hart Date: Mon, 1 Nov 2010 00:22:07 +0000 (+0000) Subject: [Bug 1691] Use first NMEA sentence each second. X-Git-Tag: NTP_4_2_6P3_RC9~9 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a7c148273a941d5b438acf7ce808494d1d407e16;p=thirdparty%2Fntp.git [Bug 1691] Use first NMEA sentence each second. bk: 4cce082fak9HYT0Jkzn9PZ5_hX4K7A --- diff --git a/ntpd/refclock_nmea.c b/ntpd/refclock_nmea.c index 5683629f7..22ec19d90 100644 --- a/ntpd/refclock_nmea.c +++ b/ntpd/refclock_nmea.c @@ -172,6 +172,7 @@ struct nmeaunit { l_fp tstamp; /* timestamp of last poll */ int gps_time; /* 0 UTC, 1 GPS time */ /* per sentence checksum seen flag */ + struct calendar used; /* hh:mm:ss of used sentence */ u_char cksum_seen[NMEA_ARRAY_SIZE]; }; @@ -642,9 +643,14 @@ nmea_receive( * There is a case that a gives back a "blank" line. * We can't have a well-formed sentence with less than 8 chars. */ - if (rd_lencode < 8) + if (0 == rd_lencode) return; + if (rd_lencode < 8) { + refclock_report(peer, CEVNT_BADREPLY); + return; + } + DPRINTF(1, ("nmea: gpsread %d %s\n", rd_lencode, rd_lastcode)); /* @@ -732,14 +738,7 @@ nmea_receive( return; } - pp->lencode = (u_short)rd_lencode; - memcpy(pp->a_lastcode, rd_lastcode, pp->lencode + 1); - cp = pp->a_lastcode; - - up->tstamp = rd_timestamp; - pp->lastrec = up->tstamp; - - DPRINTF(1, ("nmea: timecode %d %s\n", pp->lencode, pp->a_lastcode)); + cp = rd_lastcode; /* Grab field depending on clock string type */ memset(&date, 0, sizeof(date)); @@ -856,6 +855,20 @@ nmea_receive( return; } + /* + * Used only the first recognized sentence each second. + */ + if (date.hour == up->used.hour && + date.minute == up->used.minute && + date.second == up->used.second) + return; + + pp->lencode = (u_short)rd_lencode; + memcpy(pp->a_lastcode, rd_lastcode, pp->lencode + 1); + up->tstamp = rd_timestamp; + pp->lastrec = up->tstamp; + DPRINTF(1, ("nmea: timecode %d %s\n", pp->lencode, pp->a_lastcode)); + /* * Convert date and check values. */ @@ -886,6 +899,10 @@ nmea_receive( return; } + up->used.hour = date.hour; + up->used.minute = date.minute; + up->used.second = date.second; + /* * If "fudge 127.127.20.__ flag4 1" is configured in ntp.conf, * remove the location and checksum from the NMEA sentence