]> git.ipfire.org Git - thirdparty/ntp.git/commitdiff
[Bug 1691] Use first NMEA sentence each second.
authorDave Hart <hart@ntp.org>
Mon, 1 Nov 2010 00:22:07 +0000 (00:22 +0000)
committerDave Hart <hart@ntp.org>
Mon, 1 Nov 2010 00:22:07 +0000 (00:22 +0000)
bk: 4cce082fak9HYT0Jkzn9PZ5_hX4K7A

ntpd/refclock_nmea.c

index 5683629f750cba751c303de42352955f0effcd62..22ec19d9015fc4616cfe09247496117b1c39e45f 100644 (file)
@@ -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 <CR><LF> 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