init: initial commit

This commit is contained in:
2026-05-13 14:44:38 +02:00
commit 3fc50e797d
26 changed files with 4845 additions and 0 deletions
+5
View File
@@ -0,0 +1,5 @@
idf_component_register(
SRCS "src/config_store.c"
INCLUDE_DIRS "include"
REQUIRES nvs_flash
)
@@ -0,0 +1,22 @@
#pragma once
#include <stdbool.h>
#include <stdint.h>
#include "esp_err.h"
#define MQTT_HOST_MAX_LEN 128
#define MQTT_URI_MAX_LEN 256
esp_err_t config_store_init(void);
bool config_store_is_provisioned(void);
esp_err_t config_store_set_provisioned(void);
esp_err_t config_store_clear_provisioned(void);
/* Store an optional manual MQTT broker override (used if mDNS fails). */
esp_err_t config_store_set_mqtt_override(const char *host, uint16_t port);
/* Returns ESP_ERR_NVS_NOT_FOUND if no override is stored. */
esp_err_t config_store_get_mqtt_override(char host_out[MQTT_HOST_MAX_LEN], uint16_t *port_out);
/* Returns ESP_ERR_NVS_NOT_FOUND if no override is stored. */
esp_err_t config_store_get_mqtt_override_uri(char *uri_out, size_t uri_max_len);
@@ -0,0 +1,98 @@
#include "config_store.h"
#include "esp_err.h"
#include "nvs_flash.h"
#include "nvs.h"
#include "esp_log.h"
#include <string.h>
#define NS "anchor_cfg"
#define KEY_PROV "provisioned"
#define KEY_HOST "mqtt_host"
#define KEY_PORT "mqtt_port"
static const char *TAG = "config_store";
esp_err_t config_store_init(void)
{
esp_err_t err = nvs_flash_init();
if (err == ESP_ERR_NVS_NO_FREE_PAGES || err == ESP_ERR_NVS_NEW_VERSION_FOUND) {
ESP_LOGW(TAG, "NVS needs erase, erasing...");
ESP_ERROR_CHECK(nvs_flash_erase());
err = nvs_flash_init();
}
return err;
}
bool config_store_is_provisioned(void)
{
nvs_handle_t h;
if (nvs_open(NS, NVS_READONLY, &h) != ESP_OK) return false;
uint8_t val = 0;
nvs_get_u8(h, KEY_PROV, &val);
nvs_close(h);
return val == 1;
}
esp_err_t config_store_set_provisioned(void)
{
nvs_handle_t h;
esp_err_t err = nvs_open(NS, NVS_READWRITE, &h);
if (err != ESP_OK) return err;
err = nvs_set_u8(h, KEY_PROV, 1);
if (err == ESP_OK) err = nvs_commit(h);
nvs_close(h);
return err;
}
esp_err_t config_store_clear_provisioned(void)
{
nvs_handle_t h;
esp_err_t err = nvs_open(NS, NVS_READWRITE, &h);
if (err != ESP_OK) return err;
nvs_erase_key(h, KEY_PROV);
nvs_erase_key(h, KEY_HOST);
nvs_erase_key(h, KEY_PORT);
err = nvs_commit(h);
nvs_close(h);
return err;
}
esp_err_t config_store_set_mqtt_override(const char *host, uint16_t port)
{
nvs_handle_t h;
esp_err_t err = nvs_open(NS, NVS_READWRITE, &h);
if (err != ESP_OK) return err;
err = nvs_set_str(h, KEY_HOST, host);
if (err == ESP_OK) err = nvs_set_u16(h, KEY_PORT, port);
if (err == ESP_OK) err = nvs_commit(h);
nvs_close(h);
return err;
}
esp_err_t config_store_get_mqtt_override(char host_out[MQTT_HOST_MAX_LEN], uint16_t *port_out)
{
nvs_handle_t h;
esp_err_t err = nvs_open(NS, NVS_READONLY, &h);
if (err != ESP_OK) return err;
size_t len = MQTT_HOST_MAX_LEN;
err = nvs_get_str(h, KEY_HOST, host_out, &len);
if (err == ESP_OK) {
err = nvs_get_u16(h, KEY_PORT, port_out);
}
nvs_close(h);
return err;
}
esp_err_t config_store_get_mqtt_override_uri(char *uri_out, size_t uri_max_len)
{
char broker_host[MQTT_HOST_MAX_LEN] = {0};
uint16_t broker_port;
bool resolved
= (config_store_get_mqtt_override(broker_host, &broker_port) == ESP_OK);
if(!resolved) return ESP_ERR_NVS_NOT_FOUND;
snprintf(uri_out, uri_max_len, "mqtt://%s:%u", broker_host, broker_port);
return ESP_OK;
}