Improve watchdog monitoring and CLI

This commit is contained in:
2025-12-19 11:01:33 +02:00
parent 89ded8b119
commit e9933da1a4
11 changed files with 970 additions and 285 deletions

141
main/watch_config.c Normal file
View File

@@ -0,0 +1,141 @@
#include "watch_config.h"
#include <stdbool.h>
#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;
}