#include "watch_config.h" #include #include "esp_check.h" #include "esp_log.h" #include "nvs.h" #include "nvs_flash.h" #define WATCH_CONFIG_NAMESPACE "watchcfg" #define KEY_HB_PERIOD "hb_period" #define KEY_DCDC_OFF "dcdc_off" #define KEY_HB_START "hb_start" #define KEY_HB_MON "hb_mon" #define KEY_HB_MISS "hb_miss" #define DEFAULT_HB_PERIOD_SEC 4U #define DEFAULT_DCDC_OFF_SEC 2U #define DEFAULT_HB_START_SEC 2U #define DEFAULT_HB_MISS_LIMIT 3U static watch_config_t s_config = { .heartbeat_period_sec = DEFAULT_HB_PERIOD_SEC, .dcdc_restart_off_sec = DEFAULT_DCDC_OFF_SEC, .heartbeat_start_delay_sec = DEFAULT_HB_START_SEC, .heartbeat_monitor_enabled = true, .heartbeat_miss_limit = DEFAULT_HB_MISS_LIMIT, }; static const char *TAG = "watch_cfg"; static bool s_initialized; static void watch_config_apply_defaults(void) { s_config.heartbeat_period_sec = DEFAULT_HB_PERIOD_SEC; s_config.dcdc_restart_off_sec = DEFAULT_DCDC_OFF_SEC; s_config.heartbeat_start_delay_sec = DEFAULT_HB_START_SEC; s_config.heartbeat_monitor_enabled = true; s_config.heartbeat_miss_limit = DEFAULT_HB_MISS_LIMIT; } static void watch_config_clamp(watch_config_t *cfg) { if (!cfg->heartbeat_period_sec) { cfg->heartbeat_period_sec = DEFAULT_HB_PERIOD_SEC; } if (!cfg->dcdc_restart_off_sec) { cfg->dcdc_restart_off_sec = DEFAULT_DCDC_OFF_SEC; } if (!cfg->heartbeat_start_delay_sec) { cfg->heartbeat_start_delay_sec = DEFAULT_HB_START_SEC; } cfg->heartbeat_monitor_enabled = cfg->heartbeat_monitor_enabled ? true : false; if (!cfg->heartbeat_miss_limit) { cfg->heartbeat_miss_limit = DEFAULT_HB_MISS_LIMIT; } } esp_err_t watch_config_init(void) { if (s_initialized) { return ESP_OK; } esp_err_t err = nvs_flash_init(); if (err == ESP_ERR_NVS_NO_FREE_PAGES || err == ESP_ERR_NVS_NEW_VERSION_FOUND) { ESP_RETURN_ON_ERROR(nvs_flash_erase(), TAG, "NVS erase failed"); err = nvs_flash_init(); } ESP_RETURN_ON_ERROR(err, TAG, "NVS init failed"); watch_config_apply_defaults(); nvs_handle_t handle = 0; err = nvs_open(WATCH_CONFIG_NAMESPACE, NVS_READWRITE, &handle); ESP_RETURN_ON_ERROR(err, TAG, "NVS open failed"); uint32_t value = 0; if (nvs_get_u32(handle, KEY_HB_PERIOD, &value) == ESP_OK && value > 0) { s_config.heartbeat_period_sec = value; } if (nvs_get_u32(handle, KEY_DCDC_OFF, &value) == ESP_OK && value > 0) { s_config.dcdc_restart_off_sec = value; } if (nvs_get_u32(handle, KEY_HB_START, &value) == ESP_OK && value > 0) { s_config.heartbeat_start_delay_sec = value; } uint8_t hb_mon = 1; if (nvs_get_u8(handle, KEY_HB_MON, &hb_mon) == ESP_OK) { s_config.heartbeat_monitor_enabled = (hb_mon != 0); } if (nvs_get_u32(handle, KEY_HB_MISS, &value) == ESP_OK && value > 0) { s_config.heartbeat_miss_limit = value; } nvs_close(handle); s_initialized = true; return ESP_OK; } const watch_config_t *watch_config_get(void) { return &s_config; } esp_err_t watch_config_save(const watch_config_t *cfg) { if (!cfg) { return ESP_ERR_INVALID_ARG; } watch_config_t tmp = *cfg; watch_config_clamp(&tmp); nvs_handle_t handle = 0; ESP_RETURN_ON_ERROR(nvs_open(WATCH_CONFIG_NAMESPACE, NVS_READWRITE, &handle), TAG, "NVS open failed"); esp_err_t err = nvs_set_u32(handle, KEY_HB_PERIOD, tmp.heartbeat_period_sec); if (err == ESP_OK) { err = nvs_set_u32(handle, KEY_DCDC_OFF, tmp.dcdc_restart_off_sec); } if (err == ESP_OK) { err = nvs_set_u32(handle, KEY_HB_START, tmp.heartbeat_start_delay_sec); } if (err == ESP_OK) { err = nvs_set_u8(handle, KEY_HB_MON, tmp.heartbeat_monitor_enabled ? 1 : 0); } if (err == ESP_OK) { err = nvs_set_u32(handle, KEY_HB_MISS, tmp.heartbeat_miss_limit); } if (err == ESP_OK) { err = nvs_commit(handle); } nvs_close(handle); if (err != ESP_OK) { return err; } s_config = tmp; return ESP_OK; }