Files
chargeflow/components/protocols/src/date_time.c
2025-06-06 21:17:25 +01:00

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;
}
}