diff --git a/src/driver/drv_max72xx_clock.c b/src/driver/drv_max72xx_clock.c index 17af1c2ab..00b528c4b 100644 --- a/src/driver/drv_max72xx_clock.c +++ b/src/driver/drv_max72xx_clock.c @@ -70,7 +70,7 @@ void Clock_Send(int type) { char *p; // NOTE: on windows, you need _USE_32BIT_TIME_T - ltm = gmtime((time_t*)&g_ntpTime); + ltm = gmtime(&g_ntpTime); if (ltm == 0) { return; diff --git a/src/driver/drv_ntp_events.c b/src/driver/drv_ntp_events.c index 559e73be6..f37af6d16 100644 --- a/src/driver/drv_ntp_events.c +++ b/src/driver/drv_ntp_events.c @@ -15,7 +15,7 @@ #define M_PI 3.14159265358979323846264338327950288 #define LOG_FEATURE LOG_FEATURE_NTP -unsigned int ntp_eventsTime = 0; +time_t ntp_eventsTime = 0; typedef struct ntpEvent_s { byte hour; @@ -166,12 +166,12 @@ void NTP_CalculateSunset(byte *outHour, byte *outMinute) { } #endif -void NTP_RunEventsForSecond(unsigned int runTime) { +void NTP_RunEventsForSecond(time_t runTime) { ntpEvent_t *e; struct tm *ltm; // NOTE: on windows, you need _USE_32BIT_TIME_T - ltm = gmtime((time_t*)&runTime); + ltm = gmtime(&runTime); if (ltm == 0) { return; @@ -218,17 +218,17 @@ void NTP_RunEvents(unsigned int newTime, bool bTimeValid) { } // old time invalid, but new one ok? if (ntp_eventsTime == 0) { - ntp_eventsTime = newTime; + ntp_eventsTime = (time_t)newTime; return; } // time went backwards if (newTime < ntp_eventsTime) { - ntp_eventsTime = newTime; + ntp_eventsTime = (time_t)newTime; return; } if (ntp_events) { // NTP resynchronization could cause us to skip some seconds in some rare cases? - delta = newTime - ntp_eventsTime; + delta = (unsigned int)((time_t)newTime - ntp_eventsTime); // a large shift in time is not expected, so limit to a constant number of seconds if (delta > 100) delta = 100; @@ -236,7 +236,7 @@ void NTP_RunEvents(unsigned int newTime, bool bTimeValid) { NTP_RunEventsForSecond(ntp_eventsTime + i); } } - ntp_eventsTime = newTime; + ntp_eventsTime = (time_t)newTime; } #if ENABLE_NTP_SUNRISE_SUNSET @@ -312,7 +312,7 @@ commandResult_t CMD_NTP_AddClockEvent(const void *context, const char *cmd, cons #if ENABLE_NTP_SUNRISE_SUNSET uint8_t hour_b, minute_b; int sunflags = 0; - struct tm *ltm = gmtime((time_t*) &ntp_eventsTime); + struct tm *ltm = gmtime(&ntp_eventsTime); #endif Tokenizer_TokenizeString(args, TOKENIZER_ALTERNATE_EXPAND_AT_START); diff --git a/src/httpserver/json_interface.c b/src/httpserver/json_interface.c index e3a98ee46..4d8513fb8 100644 --- a/src/httpserver/json_interface.c +++ b/src/httpserver/json_interface.c @@ -653,14 +653,15 @@ static int http_tasmota_json_status_generic(void* request, jsonCb_t printer) { JSON_PrintKeyValue_String(request, printer, "RestartReason", "HardwareWatchdog", true); JSON_PrintKeyValue_Int(request, printer, "Uptime", g_secondsElapsed, true); struct tm* ltm; - int ntpTime = NTP_GetCurrentTime() - g_secondsElapsed; - ltm = gmtime((time_t*)&ntpTime); - + time_t ntpTime = 0; // if no NTP_time set, we will not change this value, but just stick to 0 and hence "fake" start of epoch 1970-01-01T00:00:00 + if (NTP_GetCurrentTimeWithoutOffset() > g_secondsElapsed) { // would be negative else, leading to unwanted results when converted to (unsigned) time_t + ntpTime = (time_t)NTP_GetCurrentTimeWithoutOffset() - (time_t)g_secondsElapsed; + } + ltm = gmtime(&ntpTime); if (ltm != 0) { printer(request, "\"StartupUTC\":\"%04d-%02d-%02dT%02d:%02d:%02d\",", ltm->tm_year + 1900, ltm->tm_mon + 1, ltm->tm_mday, ltm->tm_hour, ltm->tm_min, ltm->tm_sec); } else { - } JSON_PrintKeyValue_Int(request, printer, "Sleep", 50, true); JSON_PrintKeyValue_Int(request, printer, "CfgHolder", 4617, true);