#ifndef POD_SETTINGS_H #define POD_SETTINGS_H #include "bosch456.h" #include "esp_err.h" #include #include /** Initialize NVS (idempotent) and log stored settings. Call once early in app_main. */ esp_err_t pod_settings_init(void); /** Persist local accelerometer deadzone (LSB per axis). */ esp_err_t pod_settings_save_accel_deadzone(uint32_t deadzone_lsb); /** Load deadzone from NVS, or BMA456_DEFAULT_ACCEL_DEADZONE if unset. */ uint32_t pod_settings_load_accel_deadzone(void); /** Apply NVS deadzone to BMA456 when the sensor is present. */ void pod_settings_apply_accel_deadzone(void); /** Persist local BMA456 tap detection config. */ esp_err_t pod_settings_save_tap_config(const bma456_tap_config_t *cfg); /** * Load tap config from NVS into *cfg_out. * Returns true when a valid blob was loaded; false → compile-time defaults. */ bool pod_settings_load_tap_config(bma456_tap_config_t *cfg_out); /** Apply NVS tap config to BMA456 when the sensor is present. */ void pod_settings_apply_tap_config(void); /** LiPo under-voltage latch persisted across reboot (software UV protection). */ bool pod_settings_is_uv_latched(void); esp_err_t pod_settings_set_uv_latched(bool latched); esp_err_t pod_settings_clear_uv_latched(void); /** * Runtime enable for software UV protection (NVS). Missing key → disabled. * Independent of POWERPOD_BATTERY_UV_ENABLE compile gate. */ bool pod_settings_is_uv_enabled(void); esp_err_t pod_settings_set_uv_enabled(bool enabled); /** Logical slave ids: 1…POD_CLIENT_ID_MAX (0 reserved for local master). */ #define POD_CLIENT_ID_MIN 1u #define POD_CLIENT_ID_MAX 255u #define POD_ID_MAP_MAX 255u #define POD_ID_MAC_LEN 6u typedef struct { uint8_t mac[POD_ID_MAC_LEN]; uint8_t id; } pod_id_map_entry_t; typedef struct { uint8_t next_id; /**< Next candidate when allocating (1…255). */ uint8_t count; pod_id_map_entry_t entries[POD_ID_MAP_MAX]; } pod_id_map_t; /** Master: load MAC→id map from NVS (zeros *out if unset). */ esp_err_t pod_settings_load_id_map(pod_id_map_t *out); esp_err_t pod_settings_save_id_map(const pod_id_map_t *map); esp_err_t pod_settings_clear_id_map(void); /** * Slave: load persisted {master_mac, assigned_id}. * Returns true when a valid binding was loaded. */ bool pod_settings_load_id_binding(uint8_t master_mac[POD_ID_MAC_LEN], uint32_t *assigned_id_out); esp_err_t pod_settings_save_id_binding(const uint8_t master_mac[POD_ID_MAC_LEN], uint32_t assigned_id); esp_err_t pod_settings_clear_id_binding(void); #endif