new upgrade
This commit is contained in:
@@ -9,8 +9,8 @@ set(srcs
|
||||
|
||||
idf_component_register(SRCS "${srcs}"
|
||||
INCLUDE_DIRS "include"
|
||||
PRIV_REQUIRES driver esp_timer nvs_flash
|
||||
REQUIRES config evse loadbalancer)
|
||||
PRIV_REQUIRES driver esp_timer
|
||||
REQUIRES config evse loadbalancer storage_service)
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -2,19 +2,23 @@
|
||||
|
||||
#include "evse_link.h"
|
||||
#include "evse_link_framing.h"
|
||||
|
||||
#include "driver/uart.h"
|
||||
#include "nvs.h"
|
||||
#include "esp_log.h"
|
||||
#include "freertos/task.h"
|
||||
#include "freertos/semphr.h"
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include "storage_service.h"
|
||||
|
||||
static const char *TAG = "evse_link";
|
||||
|
||||
// NVS keys
|
||||
// Storage keys
|
||||
#define _NVS_NAMESPACE "evse_link"
|
||||
#define _NVS_MODE_KEY "mode"
|
||||
#define _NVS_ID_KEY "self_id"
|
||||
#define _NVS_ENABLED_KEY "enabled"
|
||||
#define _KEY_MODE "mode"
|
||||
#define _KEY_SELF_ID "self_id"
|
||||
#define _KEY_ENABLED "enabled"
|
||||
|
||||
// UART parameters
|
||||
#define UART_PORT UART_NUM_2
|
||||
@@ -37,9 +41,7 @@ static void framing_rx_cb(uint8_t src, uint8_t dest,
|
||||
{
|
||||
ESP_LOGD(TAG, "framing_rx_cb: src=0x%02X dest=0x%02X len=%u", src, dest, len);
|
||||
if (_rx_cb)
|
||||
{
|
||||
_rx_cb(src, dest, payload, len);
|
||||
}
|
||||
}
|
||||
|
||||
// Register protocol-level Rx callback
|
||||
@@ -48,87 +50,117 @@ void evse_link_register_rx_cb(evse_link_rx_cb_t cb)
|
||||
_rx_cb = cb;
|
||||
}
|
||||
|
||||
// Load config from NVS
|
||||
enum
|
||||
{
|
||||
EV_OK = ESP_OK
|
||||
};
|
||||
// Load config from storage_service (NVS-backed)
|
||||
static void load_link_config(void)
|
||||
{
|
||||
nvs_handle_t handle;
|
||||
if (nvs_open(_NVS_NAMESPACE, NVS_READONLY, &handle) != EV_OK)
|
||||
{
|
||||
ESP_LOGW(TAG, "NVS open failed, using defaults");
|
||||
return;
|
||||
}
|
||||
uint8_t mode, id, en;
|
||||
if (nvs_get_u8(handle, _NVS_MODE_KEY, &mode) == EV_OK &&
|
||||
(mode == EVSE_LINK_MODE_MASTER || mode == EVSE_LINK_MODE_SLAVE))
|
||||
{
|
||||
_mode = (evse_link_mode_t)mode;
|
||||
}
|
||||
if (nvs_get_u8(handle, _NVS_ID_KEY, &id) == EV_OK)
|
||||
{
|
||||
_self_id = id;
|
||||
}
|
||||
if (nvs_get_u8(handle, _NVS_ENABLED_KEY, &en) == EV_OK)
|
||||
{
|
||||
_enabled = (en != 0);
|
||||
}
|
||||
nvs_close(handle);
|
||||
}
|
||||
uint8_t u8 = 0;
|
||||
|
||||
// Save config to NVS
|
||||
static void save_link_config(void)
|
||||
{
|
||||
nvs_handle_t handle;
|
||||
if (nvs_open(_NVS_NAMESPACE, NVS_READWRITE, &handle) == EV_OK)
|
||||
// mode
|
||||
esp_err_t err = storage_get_u8_sync(_NVS_NAMESPACE, _KEY_MODE, &u8, pdMS_TO_TICKS(500));
|
||||
if (err == ESP_OK && (u8 == (uint8_t)EVSE_LINK_MODE_MASTER || u8 == (uint8_t)EVSE_LINK_MODE_SLAVE))
|
||||
{
|
||||
nvs_set_u8(handle, _NVS_MODE_KEY, (uint8_t)_mode);
|
||||
nvs_set_u8(handle, _NVS_ID_KEY, _self_id);
|
||||
nvs_set_u8(handle, _NVS_ENABLED_KEY, _enabled ? 1 : 0);
|
||||
nvs_commit(handle);
|
||||
nvs_close(handle);
|
||||
_mode = (evse_link_mode_t)u8;
|
||||
}
|
||||
else
|
||||
{
|
||||
ESP_LOGE(TAG, "Failed to save NVS");
|
||||
// default + persist
|
||||
_mode = EVSE_LINK_MODE_MASTER;
|
||||
(void)storage_set_u8_async(_NVS_NAMESPACE, _KEY_MODE, (uint8_t)_mode);
|
||||
ESP_LOGW(TAG, "Missing/invalid mode (%s) -> default MASTER (persisted async)",
|
||||
esp_err_to_name(err));
|
||||
}
|
||||
|
||||
// self_id
|
||||
err = storage_get_u8_sync(_NVS_NAMESPACE, _KEY_SELF_ID, &u8, pdMS_TO_TICKS(500));
|
||||
if (err == ESP_OK)
|
||||
{
|
||||
_self_id = u8;
|
||||
}
|
||||
else
|
||||
{
|
||||
_self_id = 0x01;
|
||||
(void)storage_set_u8_async(_NVS_NAMESPACE, _KEY_SELF_ID, _self_id);
|
||||
ESP_LOGW(TAG, "Missing self_id (%s) -> default 0x%02X (persisted async)",
|
||||
esp_err_to_name(err), _self_id);
|
||||
}
|
||||
|
||||
// enabled
|
||||
err = storage_get_u8_sync(_NVS_NAMESPACE, _KEY_ENABLED, &u8, pdMS_TO_TICKS(500));
|
||||
if (err == ESP_OK && u8 <= 1)
|
||||
{
|
||||
_enabled = (u8 != 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
_enabled = false;
|
||||
(void)storage_set_u8_async(_NVS_NAMESPACE, _KEY_ENABLED, 0);
|
||||
ESP_LOGW(TAG, "Missing/invalid enabled (%s) -> default false (persisted async)",
|
||||
esp_err_to_name(err));
|
||||
}
|
||||
}
|
||||
|
||||
// Save config to storage_service (debounced)
|
||||
static void save_link_config(void)
|
||||
{
|
||||
// Debounced writes: não bloqueia e reduz desgaste
|
||||
(void)storage_set_u8_async(_NVS_NAMESPACE, _KEY_MODE, (uint8_t)_mode);
|
||||
(void)storage_set_u8_async(_NVS_NAMESPACE, _KEY_SELF_ID, _self_id);
|
||||
(void)storage_set_u8_async(_NVS_NAMESPACE, _KEY_ENABLED, _enabled ? 1 : 0);
|
||||
|
||||
// opcional: se quiseres persistência imediata em configurações “críticas”
|
||||
// (void)storage_flush_async();
|
||||
}
|
||||
|
||||
// Getters/setters
|
||||
void evse_link_set_mode(evse_link_mode_t m)
|
||||
{
|
||||
if (m != EVSE_LINK_MODE_MASTER && m != EVSE_LINK_MODE_SLAVE)
|
||||
{
|
||||
ESP_LOGW(TAG, "Invalid link mode: %d", (int)m);
|
||||
return;
|
||||
}
|
||||
if (_mode == m)
|
||||
return;
|
||||
|
||||
_mode = m;
|
||||
save_link_config();
|
||||
}
|
||||
|
||||
evse_link_mode_t evse_link_get_mode(void) { return _mode; }
|
||||
|
||||
void evse_link_set_self_id(uint8_t id)
|
||||
{
|
||||
if (_self_id == id)
|
||||
return;
|
||||
_self_id = id;
|
||||
save_link_config();
|
||||
}
|
||||
|
||||
uint8_t evse_link_get_self_id(void) { return _self_id; }
|
||||
|
||||
void evse_link_set_enabled(bool en)
|
||||
{
|
||||
if (_enabled == en)
|
||||
return;
|
||||
_enabled = en;
|
||||
save_link_config();
|
||||
}
|
||||
|
||||
bool evse_link_is_enabled(void) { return _enabled; }
|
||||
|
||||
// RX task: reads bytes from UART and feeds framing
|
||||
static void evse_link_rx_task(void *arg)
|
||||
{
|
||||
(void)arg;
|
||||
uint8_t buf[UART_RX_BUF_SIZE];
|
||||
|
||||
while (true)
|
||||
{
|
||||
int len = uart_read_bytes(UART_PORT, buf, sizeof(buf), pdMS_TO_TICKS(1000));
|
||||
if (len > 0)
|
||||
{
|
||||
for (int i = 0; i < len; ++i)
|
||||
{
|
||||
evse_link_recv_byte(buf[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -136,11 +168,22 @@ static void evse_link_rx_task(void *arg)
|
||||
// Initialize EVSE-Link component
|
||||
void evse_link_init(void)
|
||||
{
|
||||
load_link_config();
|
||||
// garante storage disponível
|
||||
esp_err_t se = storage_service_init();
|
||||
if (se != ESP_OK)
|
||||
{
|
||||
ESP_LOGE(TAG, "storage_service_init failed: %s (using defaults in RAM)", esp_err_to_name(se));
|
||||
// segue com defaults em RAM
|
||||
}
|
||||
else
|
||||
{
|
||||
load_link_config();
|
||||
}
|
||||
|
||||
ESP_LOGI(TAG, "Link init: mode=%c id=0x%02X enabled=%d",
|
||||
_mode == EVSE_LINK_MODE_MASTER ? 'M' : 'S',
|
||||
_self_id, _enabled);
|
||||
|
||||
if (!_enabled)
|
||||
return;
|
||||
|
||||
@@ -149,17 +192,13 @@ void evse_link_init(void)
|
||||
evse_link_framing_register_cb(framing_rx_cb);
|
||||
|
||||
// 2) start RX task
|
||||
xTaskCreate(evse_link_rx_task, "evse_link_rx", 4096, NULL, 4, NULL);
|
||||
xTaskCreate(evse_link_rx_task, "evse_link_rx", 4096, NULL, 3, NULL);
|
||||
|
||||
// 3) delegate to master or slave
|
||||
if (_mode == EVSE_LINK_MODE_MASTER)
|
||||
{
|
||||
evse_link_master_init();
|
||||
}
|
||||
else
|
||||
{
|
||||
evse_link_slave_init();
|
||||
}
|
||||
}
|
||||
|
||||
// Send a frame (delegates to framing module)
|
||||
@@ -167,6 +206,7 @@ bool evse_link_send(uint8_t dest, const uint8_t *payload, uint8_t len)
|
||||
{
|
||||
if (!evse_link_is_enabled())
|
||||
return false;
|
||||
|
||||
uint8_t src = evse_link_get_self_id();
|
||||
return evse_link_framing_send(dest, src, payload, len);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user