Per-pod NVS enable (default off) via UART/ESP-NOW/dashboard, and skip UV latch when LiPo ADC reads ~0 mV so USB/external supply still boots. Co-authored-by: Cursor <cursoragent@cursor.com>
78 lines
2.6 KiB
C
78 lines
2.6 KiB
C
#ifndef POD_SETTINGS_H
|
|
#define POD_SETTINGS_H
|
|
|
|
#include "bosch456.h"
|
|
#include "esp_err.h"
|
|
#include <stdbool.h>
|
|
#include <stdint.h>
|
|
|
|
/** 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
|