bugfix reagard leap seconds in network time sync

This commit is contained in:
cyberman54 2021-07-06 10:53:48 +02:00
parent f876edfe36
commit 335d646fe7
4 changed files with 9 additions and 5 deletions

View File

@ -10,6 +10,7 @@
#define TIME_SYNC_MAX_SEQNO 0xfe // threshold for wrap around time_sync_seqNo #define TIME_SYNC_MAX_SEQNO 0xfe // threshold for wrap around time_sync_seqNo
#define TIME_SYNC_END_FLAG (TIME_SYNC_MAX_SEQNO + 1) // end of handshake marker #define TIME_SYNC_END_FLAG (TIME_SYNC_MAX_SEQNO + 1) // end of handshake marker
#define GPS_UTC_DIFF 315964800 // seconds diff between gps and utc epoch #define GPS_UTC_DIFF 315964800 // seconds diff between gps and utc epoch
#define LEAP_SECS_SINCE_GPSEPOCH 18 // state of 2021
enum timesync_t { enum timesync_t {
timesync_tx, timesync_tx,

View File

@ -120,7 +120,7 @@ time_t get_gpstime(uint16_t *msec) {
t = makeTime(tm); t = makeTime(tm);
ESP_LOGD(TAG, "GPS date/time: %s", ESP_LOGD(TAG, "GPS date/time: %s",
UTC.dateTime(t, "d.M Y H:i:s T").c_str()); UTC.dateTime(t, "d.M Y H:i:s.v T").c_str());
// add protocol delay with millisecond precision // add protocol delay with millisecond precision
t += delay_ms / 1000 - 1; // whole seconds t += delay_ms / 1000 - 1; // whole seconds

View File

@ -121,6 +121,7 @@ void setup() {
// set time zone to user value from paxcounter.conf // set time zone to user value from paxcounter.conf
#ifdef TIME_SYNC_TIMEZONE #ifdef TIME_SYNC_TIMEZONE
myTZ.setPosix(TIME_SYNC_TIMEZONE); myTZ.setPosix(TIME_SYNC_TIMEZONE);
ESP_LOGD(TAG, "Timezone set to %s", myTZ.getPosix().c_str());
#endif #endif
// hash 6 byte device MAC to 4 byte clientID // hash 6 byte device MAC to 4 byte clientID

View File

@ -143,7 +143,7 @@ void IRAM_ATTR timesync_processReq(void *taskparameter) {
time_offset_ms %= 1000; time_offset_ms %= 1000;
ESP_LOGD(TAG, "LORA date/time: %s", ESP_LOGD(TAG, "LORA date/time: %s",
myTZ.dateTime(time_offset_sec, "d.M Y H:i:s T").c_str()); myTZ.dateTime(time_offset_sec, "d.M Y H:i:s.v T").c_str());
setMyTime(time_offset_sec, time_offset_ms, _lora); setMyTime(time_offset_sec, time_offset_ms, _lora);
@ -168,7 +168,7 @@ void IRAM_ATTR timesync_processReq(void *taskparameter) {
// store incoming timestamps // store incoming timestamps
void timesync_store(uint32_t timestamp, timesync_t timestamp_type) { void timesync_store(uint32_t timestamp, timesync_t timestamp_type) {
ESP_LOGD(TAG, "[%0.3f] seq#%d[%d]: t%d=%d", _seconds(), time_sync_seqNo, ESP_LOGD(TAG, "[%0.3f] seq#%d[%d]: t%d=%d", _seconds(), time_sync_seqNo - 1,
sample_idx, timestamp_type, timestamp); sample_idx, timestamp_type, timestamp);
timesync_timestamp[sample_idx][timestamp_type] = timestamp; timesync_timestamp[sample_idx][timestamp_type] = timestamp;
} }
@ -239,14 +239,16 @@ void IRAM_ATTR timesync_serverAnswer(void *pUserData, int flag) {
} }
// Populate lmic_time_reference // Populate lmic_time_reference
if ((LMIC_getNetworkTimeReference(&lmicTime)) != 1) { flag = LMIC_getNetworkTimeReference(&lmicTime);
if (flag != 1) {
ESP_LOGW(TAG, "[%0.3f] Network time request failed", _seconds()); ESP_LOGW(TAG, "[%0.3f] Network time request failed", _seconds());
goto Exit; goto Exit;
} }
// Calculate UTCTime, considering the difference between GPS and UTC time // Calculate UTCTime, considering the difference between GPS and UTC time
// epoch, and the leap seconds // epoch, and the leap seconds
timestamp_sec = lmicTime.tNetwork + GPS_UTC_DIFF; timestamp_sec = lmicTime.tNetwork + GPS_UTC_DIFF - LEAP_SECS_SINCE_GPSEPOCH;
ESP_LOGD(TAG, "lmicTime.tNetwork = %d", timestamp_sec);
// Add the delay between the instant the time was transmitted and // Add the delay between the instant the time was transmitted and
// the current time // the current time