#include "sntp_cli.h" #include #include #include "esp_log.h" #include "tasks.h" #include "utils.h" #include "lwip/err.h" #include "lwip/apps/sntp.h" #include "settings.h" static const char * TAG = "sntp_cli"; static volatile bool sntp_running = false; static void vTaskSNTPclient(void * pvParameters) { (void)pvParameters; //UN-USED ESP_LOGI(TAG, "Starting SNTP client, server %s", g_Settings.ntp_srv); vTaskDelay(configTICK_RATE_HZ); sntp_setoperatingmode(SNTP_OPMODE_POLL); sntp_setservername(0, g_Settings.ntp_srv); sntp_init(); vTaskDelay(2*configTICK_RATE_HZ); time_t now; struct tm timeinfo; int retry = 0; const int retry_count = 10; time(&now); localtime_r(&now, &timeinfo); while(timeinfo.tm_year < (2016 - 1900) && ++retry < retry_count) { ESP_LOGD(TAG, "Waiting for system time to be set... (%d/%d)", retry, retry_count); vTaskDelay(3*configTICK_RATE_HZ); time(&now); localtime_r(&now, &timeinfo); } if(timeinfo.tm_year < (2016 - 1900)) { ESP_LOGW(TAG, "SNTP client failed to get time!"); } else { char strftime_buf[64]; strftime(strftime_buf, sizeof(strftime_buf), "%c", &timeinfo); ESP_LOGI(TAG, "The current UTC date/time is: %s, SNTP client done", strftime_buf); } sntp_stop(); sntp_running = false; vTaskDelete(NULL); } bool sntp_cli_start() { if (sntp_running) { return false; } sntp_running = true; RTOS_ERROR_CHECK(xTaskCreate(vTaskSNTPclient, "SNTPc", 4096, NULL, PRIO_LOW, NULL)); return true; }