136 lines
3.1 KiB
C
Executable File
136 lines
3.1 KiB
C
Executable File
|
|
#include <time.h>
|
|
#include "esp_log.h"
|
|
#include "esp_sntp.h"
|
|
#include "esp_netif_sntp.h"
|
|
#include "nvs.h"
|
|
|
|
#include "date_time.h"
|
|
|
|
#define NVS_NAMESPACE "date_time"
|
|
#define NVS_NTP_ENABLED "ntp_en"
|
|
#define NVS_NTP_SERVER "ntp_server"
|
|
#define NVS_NTP_FROM_DHCP "ntp_from_dhcp"
|
|
#define NVS_TIMEZONE "timezone"
|
|
|
|
static const char* TAG = "date_time";
|
|
|
|
static nvs_handle nvs;
|
|
|
|
static char ntp_server[64]; // if renew_servers_after_new_IP = false, will be used static string reference
|
|
|
|
static const char* tz_data[][2] = {
|
|
#include "tz_data.h"
|
|
{NULL, NULL}
|
|
};
|
|
|
|
static const char* find_tz(const char* name)
|
|
{
|
|
if (name != NULL) {
|
|
int index = 0;
|
|
while (true) {
|
|
if (tz_data[index][0] == NULL) {
|
|
return NULL;
|
|
}
|
|
if (strcmp(tz_data[index][0], name) == 0) {
|
|
return tz_data[index][1];
|
|
}
|
|
index++;
|
|
}
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
void date_time_init(void)
|
|
{
|
|
ESP_ERROR_CHECK(nvs_open(NVS_NAMESPACE, NVS_READWRITE, &nvs));
|
|
|
|
if (date_time_is_ntp_enabled()) {
|
|
date_time_get_ntp_server(ntp_server);
|
|
|
|
esp_sntp_config_t config = ESP_NETIF_SNTP_DEFAULT_CONFIG(ntp_server);
|
|
|
|
esp_err_t ret = esp_netif_sntp_init(&config);
|
|
if (ret != ESP_OK) {
|
|
ESP_LOGE(TAG, "SNTP init return %s", esp_err_to_name(ret));
|
|
}
|
|
}
|
|
|
|
char str[64];
|
|
date_time_get_timezone(str);
|
|
const char *tz = find_tz(str);
|
|
if (tz) {
|
|
setenv("TZ", tz, 1);
|
|
tzset();
|
|
} else {
|
|
ESP_LOGW(TAG, "Unknown timezone %s", str);
|
|
}
|
|
}
|
|
|
|
bool date_time_is_ntp_enabled(void)
|
|
{
|
|
uint8_t value = false;
|
|
nvs_get_u8(nvs, NVS_NTP_ENABLED, &value);
|
|
return value;
|
|
}
|
|
|
|
void date_time_get_ntp_server(char* value)
|
|
{
|
|
size_t len = 64;
|
|
value[0] = '\0';
|
|
nvs_get_str(nvs, NVS_NTP_SERVER, value, &len);
|
|
}
|
|
|
|
bool date_time_is_ntp_from_dhcp(void)
|
|
{
|
|
uint8_t value = false;
|
|
nvs_get_u8(nvs, NVS_NTP_FROM_DHCP, &value);
|
|
return value;
|
|
}
|
|
|
|
esp_err_t date_time_set_ntp_config(bool enabled, const char* server, bool from_dhcp)
|
|
{
|
|
esp_err_t ret = ESP_OK;
|
|
|
|
esp_netif_sntp_deinit();
|
|
if (enabled) {
|
|
strcpy(ntp_server, server);
|
|
esp_sntp_config_t config = ESP_NETIF_SNTP_DEFAULT_CONFIG(ntp_server);
|
|
config.renew_servers_after_new_IP = from_dhcp;
|
|
ret = esp_netif_sntp_init(&config);
|
|
}
|
|
|
|
if (ret == ESP_OK) {
|
|
nvs_set_u8(nvs, NVS_NTP_ENABLED, enabled);
|
|
nvs_set_str(nvs, NVS_NTP_SERVER, server);
|
|
nvs_set_u8(nvs, NVS_NTP_FROM_DHCP, from_dhcp);
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
void date_time_get_timezone(char* value)
|
|
{
|
|
size_t len = 64;
|
|
value[0] = '\0';
|
|
strcpy(value, "Etc/UTC");
|
|
nvs_get_str(nvs, NVS_TIMEZONE, value, &len);
|
|
}
|
|
|
|
esp_err_t date_time_set_timezone(const char* value)
|
|
{
|
|
const char* tz = find_tz(value);
|
|
|
|
if (tz) {
|
|
setenv("TZ", tz, 1);
|
|
tzset();
|
|
|
|
nvs_set_str(nvs, NVS_TIMEZONE, value);
|
|
|
|
return ESP_OK;
|
|
} else {
|
|
ESP_LOGW(TAG, "Unknown timezone %s", value);
|
|
|
|
return ESP_ERR_INVALID_ARG;
|
|
}
|
|
} |