You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
89 lines
2.2 KiB
89 lines
2.2 KiB
/*
|
|
* Copyright (c) 2021, Erich Styger
|
|
*
|
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
*/
|
|
|
|
|
|
#include "platform.h"
|
|
#if PL_CONFIG_USE_SNTP_TIME
|
|
#include "sntp_time.h"
|
|
#include "esp_sntp.h"
|
|
#include "esp_log.h"
|
|
#include "wifi.h"
|
|
#include "McuTimeDate.h"
|
|
#include "McuLog.h"
|
|
|
|
static void SNTP_SetTime(void) {
|
|
time_t now = 0;
|
|
struct tm timeinfo = { 0 };
|
|
|
|
time(&now);
|
|
setenv("TZ", "CET-1CEST,M3.5.0,M10.5.0/3", 1); /* see https://github.com/nayarsystems/posix_tz_db/blob/master/zones.csv */
|
|
tzset();
|
|
localtime_r(&now, &timeinfo);
|
|
|
|
char strftime_buf[64];
|
|
|
|
strftime(strftime_buf, sizeof(strftime_buf), "%c", &timeinfo);
|
|
McuLog_info("The current date/time is: %s", strftime_buf);
|
|
|
|
#if PL_CONFIG_USE_TIME_DATE
|
|
uint32_t seconds;
|
|
TIMEREC timeRec;
|
|
DATEREC dateRec;
|
|
|
|
seconds = (uint32_t)time(NULL); /* get number of seconds since 1970 */
|
|
McuTimeDate_UnixSecondsToTimeDateCustom(seconds, -1, &timeRec, &dateRec, 1970);
|
|
McuTimeDate_SetTimeDate(&timeRec, &dateRec);
|
|
#endif
|
|
}
|
|
|
|
void time_sync_notification_cb(struct timeval *tv) {
|
|
McuLog_info("Notification of a time synchronization event");
|
|
SNTP_SetTime();
|
|
}
|
|
|
|
static void initialize_sntp(void) {
|
|
McuLog_info("Initializing SNTP");
|
|
sntp_setoperatingmode(SNTP_OPMODE_POLL);
|
|
sntp_setservername(0, "pool.ntp.org");
|
|
sntp_set_time_sync_notification_cb(time_sync_notification_cb);
|
|
#ifdef CONFIG_SNTP_TIME_SYNC_METHOD_SMOOTH
|
|
sntp_set_sync_mode(SNTP_SYNC_MODE_SMOOTH);
|
|
#endif
|
|
sntp_init();
|
|
}
|
|
|
|
int SNTP_ObtainTime(void) {
|
|
const int retry_count = 10;
|
|
int retry = 0;
|
|
|
|
if (!WiFi_isConnected()) {
|
|
McuLog_error("Cannot get sntp time, WiFi not connected");
|
|
return -1; /* failure */
|
|
}
|
|
/**
|
|
* NTP server address could be acquired via DHCP,
|
|
* see LWIP_DHCP_GET_NTP_SRV menuconfig option
|
|
*/
|
|
#ifdef LWIP_DHCP_GET_NTP_SRV
|
|
sntp_servermode_dhcp(1);
|
|
#endif
|
|
|
|
initialize_sntp();
|
|
|
|
/* wait for time to be set */
|
|
while (sntp_get_sync_status() == SNTP_SYNC_STATUS_RESET && ++retry < retry_count) {
|
|
McuLog_info("Waiting for system time to be set... (%d/%d)", retry, retry_count);
|
|
vTaskDelay(pdMS_TO_TICKS(2000));
|
|
}
|
|
/* here we have received a valid time/date from the SNTP server */
|
|
return 0; /* ok */
|
|
}
|
|
|
|
void SNTP_Init(void) {
|
|
/* nothing needed */
|
|
}
|
|
|
|
#endif /* PL_CONFIG_USE_SNTP_TIME */
|
|
|