gpsdate: Discard gpsd reports when no fix or no satellites used
We've observed several times that GPS receivers would report a wrong time/date directly after boot, probably assuming that their RTC is correct. Let's wait until the receiver reports it has a fix and reports actual satellites were used to compute it.
This commit is contained in:
parent
cd7b77ef31
commit
d59eb51be6
28
gpsdate.c
28
gpsdate.c
|
@ -1,5 +1,5 @@
|
||||||
/* gpsdate - small utility to set system RTC based on gpsd time
|
/* gpsdate - small utility to set system RTC based on gpsd time
|
||||||
* (C) 2013-2015 by sysmocom - s.f.m.c. GmbH, Author: Harald Welte
|
* (C) 2013-2019 by sysmocom - s.f.m.c. GmbH, Author: Harald Welte
|
||||||
* All Rights Reserved
|
* All Rights Reserved
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
@ -35,6 +35,7 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <syslog.h>
|
#include <syslog.h>
|
||||||
#include <getopt.h>
|
#include <getopt.h>
|
||||||
|
#include <inttypes.h>
|
||||||
|
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
@ -52,6 +53,7 @@ static void callback(struct gps_data_t *gpsdata)
|
||||||
{
|
{
|
||||||
struct timeval tv;
|
struct timeval tv;
|
||||||
time_t time;
|
time_t time;
|
||||||
|
char *timestr, *lf;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
if (!(gpsdata->set & TIME_SET))
|
if (!(gpsdata->set & TIME_SET))
|
||||||
|
@ -62,12 +64,34 @@ static void callback(struct gps_data_t *gpsdata)
|
||||||
tv.tv_usec = 0;
|
tv.tv_usec = 0;
|
||||||
|
|
||||||
time = tv.tv_sec;
|
time = tv.tv_sec;
|
||||||
|
timestr = ctime(&time);
|
||||||
|
if (!timestr) {
|
||||||
|
syslog(LOG_ERR, "ctime failed");
|
||||||
|
timestr = "<unknown>";
|
||||||
|
}
|
||||||
|
/* god knows why ctime insists on including a LF at the end */
|
||||||
|
lf = strchr(timestr, '\n');
|
||||||
|
if (lf)
|
||||||
|
*lf = '\0';
|
||||||
|
|
||||||
|
syslog(LOG_DEBUG, "%s: gpsdate->set=0x%08"PRIu64"x status=%u sats_used=%u\n",
|
||||||
|
timestr, gpsdata->set, gpsdata->status, gpsdata->satellites_used);
|
||||||
|
|
||||||
|
if (gpsdata->status == 0) {
|
||||||
|
syslog(LOG_INFO, "%s: discarding; no fix yet\n", timestr);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (gpsdata->satellites_used == 0) {
|
||||||
|
syslog(LOG_INFO, "%s: discarding; 0 satellites used\n", timestr);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
rc = settimeofday(&tv, NULL);
|
rc = settimeofday(&tv, NULL);
|
||||||
gps_close(gpsdata);
|
gps_close(gpsdata);
|
||||||
if (rc == 0) {
|
if (rc == 0) {
|
||||||
syslog(LOG_NOTICE, "Successfully set RTC time to GPSD time:"
|
syslog(LOG_NOTICE, "Successfully set RTC time to GPSD time:"
|
||||||
" %s", ctime(&time));
|
" %s\n", timestr);
|
||||||
closelog();
|
closelog();
|
||||||
exit(EXIT_SUCCESS);
|
exit(EXIT_SUCCESS);
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Reference in New Issue