summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHTJ <address@hidden>2016-03-20 21:56:47 +0100
committerEric S. Raymond <esr@thyrsus.com>2016-03-22 18:59:00 -0400
commitd46da8954e81fe8eea6e7411fecfc62f44596033 (patch)
tree03d6b35bbe15c4d53805ca4aa41d2e63f4642aec
parent4f4e24d8330cd3b6eeed79dc1bcb6dd387d3581a (diff)
downloadgpsd-d46da8954e81fe8eea6e7411fecfc62f44596033.tar.gz
Introduce the flag GOODTIME_IS...
...to mark that the device has a good time even if it does not report a position fix. Used by the OnCore driver, e.g. when in position hold mode. scons check passes
-rw-r--r--driver_oncore.c4
-rw-r--r--gpsd.c3
-rw-r--r--gpsd.h-tail1
-rw-r--r--timehint.c3
4 files changed, 7 insertions, 4 deletions
diff --git a/driver_oncore.c b/driver_oncore.c
index f4338b77..43f65f0a 100644
--- a/driver_oncore.c
+++ b/driver_oncore.c
@@ -176,9 +176,9 @@ oncore_msg_navsol(struct gps_device_t *session, unsigned char *buf,
}
/* bit 2 of the status word: using for time solution */
if (status & 0x02)
- mask |= PPSTIME_IS;
+ mask |= PPSTIME_IS | GOODTIME_IS;
/*
- * The PPSTIME_IS mask bit exists distinctly from TIME_SET exactly
+ * The GOODTIME_IS mask bit exists distinctly from TIME_SET exactly
* so an OnCore running in time-service mode (and other GPS clocks)
* can signal that it's returning time even though no position fixes
* have been available.
diff --git a/gpsd.c b/gpsd.c
index 555495bc..9d2853d3 100644
--- a/gpsd.c
+++ b/gpsd.c
@@ -1517,7 +1517,8 @@ static void all_reports(struct gps_device_t *device, gps_mask_t changed)
*/
if ((changed & TIME_SET) == 0) {
//gpsd_log(&context.errout, LOG_PROG, "NTP: No time this packet\n");
- } else if ( 0 >= device->fixcnt ) {
+ } else if ( 0 >= device->fixcnt &&
+ (changed & GOODTIME_IS) == 0) {
/* many GPS spew random times until a valid GPS fix */
//gpsd_log(&context.errout, LOG_PROG, "NTP: no fix\n");
} else if (isnan(device->newdata.time)) {
diff --git a/gpsd.h-tail b/gpsd.h-tail
index a8b9a03b..490a5930 100644
--- a/gpsd.h-tail
+++ b/gpsd.h-tail
@@ -307,6 +307,7 @@ typedef enum {
#define PERR_IS INTERNAL_SET(8) /* PDOP set */
#define PASSTHROUGH_IS INTERNAL_SET(9) /* passthrough mode */
#define EOF_IS INTERNAL_SET(10) /* synthetic EOF */
+#define GOODTIME_IS INTERNAL_SET(11) /* time good even if no pos fix */
#define DATA_IS ~(ONLINE_SET|PACKET_SET|CLEAR_IS|REPORT_IS)
typedef unsigned int driver_mask_t;
diff --git a/timehint.c b/timehint.c
index 24ce8804..c224d767 100644
--- a/timehint.c
+++ b/timehint.c
@@ -372,7 +372,8 @@ static char *report_hook(volatile struct pps_thread_t *pps_thread,
* for all cases as we have no other general way to know
* if PPS is good.
*/
- if (session->fixcnt <= PPS_MIN_FIXES)
+ if (session->fixcnt <= PPS_MIN_FIXES &&
+ (session->gpsdata.set & GOODTIME_IS) == 0)
return "no fix";
}