From fbe0cf3b2ee4627bd1d0f1717426b7d5d80717b1 Mon Sep 17 00:00:00 2001 From: Verkehrsrot Date: Sun, 7 Jul 2019 16:00:48 +0200 Subject: [PATCH] bugfix no GPS time sync after cold start (#376) --- platformio.ini | 2 +- src/gpsread.cpp | 27 ++++++++++++++++----------- src/timekeeper.cpp | 6 ++++-- 3 files changed, 21 insertions(+), 14 deletions(-) diff --git a/platformio.ini b/platformio.ini index 31bf4769..ad4f16a7 100644 --- a/platformio.ini +++ b/platformio.ini @@ -41,7 +41,7 @@ description = Paxcounter is a device for metering passenger flows in realtime. I [common] ; for release_version use max. 10 chars total, use any decimal format like "a.b.c" -release_version = 1.7.71 +release_version = 1.7.8 ; DEBUG LEVEL: For production run set to 0, otherwise device will leak RAM while running! ; 0=None, 1=Error, 2=Warn, 3=Info, 4=Debug, 5=Verbose debug_level = 3 diff --git a/src/gpsread.cpp b/src/gpsread.cpp index 62aa2da2..142eef08 100644 --- a/src/gpsread.cpp +++ b/src/gpsread.cpp @@ -77,16 +77,24 @@ void gps_storelocation(gpsStatus_t &gps_store) { // store current GPS timedate in struct void IRAM_ATTR gps_storetime(gpsStatus_t &gps_store) { - gps_store.time_age = gps.time.age(); + if (gps.time.isUpdated() && gps.date.isValid() && (gps.time.age() < 1000)) { - if (gps.time.isValid() && gps.date.isValid() && (gps_store.time_age < 1000)) { + /* nmea telegram serial delay compensation; not sure if we need this? + + if (gps.time.age() > nmea_txDelay_ms) + gps_store.timedate.Second = gps.time.second() + 1; + else + gps_store.timedate.Second = gps.time.second(); + */ + + gps_store.timedate.Second = gps.time.second(); + gps_store.timedate.Minute = gps.time.minute(); + gps_store.timedate.Hour = gps.time.hour(); + gps_store.timedate.Day = gps.date.day(); + gps_store.timedate.Month = gps.date.month(); gps_store.timedate.Year = CalendarYrToTm(gps.date.year()); // year offset from 1970 in microTime.h - gps_store.timedate.Month = gps.date.month(); - gps_store.timedate.Day = gps.date.day(); - gps_store.timedate.Hour = gps.time.hour(); - gps_store.timedate.Minute = gps.time.minute(); - gps_store.timedate.Second = gps.time.second(); + } else gps_store.timedate = {0}; } @@ -96,11 +104,8 @@ time_t get_gpstime(gpsStatus_t value) { time_t t = timeIsValid(makeTime(value.timedate)); - // if (t) - // t = value.time_age > nmea_txDelay_ms ? t : t - 1; - // show NMEA data in verbose mode, useful for debugging GPS - ESP_LOGV( + ESP_LOGD( TAG, "GPS time: %d | GPS NMEA data: passed %d / failed: %d / with fix: %d", t, gps.passedChecksum(), gps.failedChecksum(), gps.sentencesWithFix()); diff --git a/src/timekeeper.cpp b/src/timekeeper.cpp index 99c72a4f..049e80aa 100644 --- a/src/timekeeper.cpp +++ b/src/timekeeper.cpp @@ -31,7 +31,7 @@ time_t timeProvider(void) { time_t t = 0; #if (HAS_GPS) - // fetch recent time from last NEMA record + // fetch recent time from last NMEA record t = get_gpstime(gps_pps_status); if (t) { #ifdef HAS_RTC @@ -140,9 +140,11 @@ void IRAM_ATTR CLOCKIRQ(void) { SyncToPPS(); // advance systime, see microTime.h - // store recent gps time, if we have gps + // store recent gps time, and try to get gps time if time is not synced #if (HAS_GPS) gps_storetime(gps_pps_status); + if (timeSource == _unsynced) + timeSync(); #endif // advance wall clock, if we have