new meter
This commit is contained in:
@@ -1,32 +1,41 @@
|
||||
#include "evse_api.h"
|
||||
#include "evse_state.h"
|
||||
#include "evse_events.h"
|
||||
#include "freertos/FreeRTOS.h"
|
||||
#include "freertos/portmacro.h"
|
||||
#include "esp_log.h"
|
||||
|
||||
// =========================
|
||||
// Internal State Variables
|
||||
// =========================
|
||||
|
||||
static evse_state_t current_state = EVSE_STATE_A;
|
||||
static bool is_authorized = false;
|
||||
static TickType_t session_start_tick = 0;
|
||||
|
||||
// Proteção básica para variáveis globais em sistemas concorrentes
|
||||
static portMUX_TYPE state_mux = portMUX_INITIALIZER_UNLOCKED;
|
||||
|
||||
// =========================
|
||||
// Internal Mapping
|
||||
// =========================
|
||||
|
||||
static evse_state_event_t map_state_to_event(evse_state_t s) {
|
||||
switch (s) {
|
||||
case EVSE_STATE_A:
|
||||
return EVSE_STATE_EVENT_IDLE;
|
||||
case EVSE_STATE_B1:
|
||||
return EVSE_STATE_EVENT_WAITING;
|
||||
case EVSE_STATE_A: return EVSE_STATE_EVENT_IDLE;
|
||||
case EVSE_STATE_B1: return EVSE_STATE_EVENT_WAITING;
|
||||
case EVSE_STATE_B2:
|
||||
case EVSE_STATE_C1:
|
||||
case EVSE_STATE_C2:
|
||||
return EVSE_STATE_EVENT_CHARGING;
|
||||
case EVSE_STATE_C2: return EVSE_STATE_EVENT_CHARGING;
|
||||
case EVSE_STATE_E:
|
||||
case EVSE_STATE_F:
|
||||
return EVSE_STATE_EVENT_FAULT;
|
||||
default:
|
||||
return EVSE_STATE_EVENT_IDLE;
|
||||
case EVSE_STATE_F: return EVSE_STATE_EVENT_FAULT;
|
||||
default: return EVSE_STATE_EVENT_IDLE;
|
||||
}
|
||||
}
|
||||
|
||||
// =========================
|
||||
// Public API
|
||||
// =========================
|
||||
|
||||
void evse_set_state(evse_state_t state) {
|
||||
bool changed = false;
|
||||
evse_state_t previous_state;
|
||||
@@ -36,11 +45,15 @@ void evse_set_state(evse_state_t state) {
|
||||
if (state != current_state) {
|
||||
current_state = state;
|
||||
changed = true;
|
||||
|
||||
if (evse_state_is_charging(state) && !evse_state_is_charging(previous_state)) {
|
||||
session_start_tick = xTaskGetTickCount();
|
||||
}
|
||||
}
|
||||
portEXIT_CRITICAL(&state_mux);
|
||||
|
||||
if (changed) {
|
||||
ESP_LOGI("EVSE_STATE", "Estado alterado de %s para %s",
|
||||
ESP_LOGI("EVSE_STATE", "State changed from %s to %s",
|
||||
evse_state_to_str(previous_state),
|
||||
evse_state_to_str(state));
|
||||
|
||||
@@ -58,6 +71,13 @@ evse_state_t evse_get_state(void) {
|
||||
return s;
|
||||
}
|
||||
|
||||
TickType_t evse_get_session_start(void) {
|
||||
portENTER_CRITICAL(&state_mux);
|
||||
TickType_t t = session_start_tick;
|
||||
portEXIT_CRITICAL(&state_mux);
|
||||
return t;
|
||||
}
|
||||
|
||||
const char* evse_state_to_str(evse_state_t state) {
|
||||
switch (state) {
|
||||
case EVSE_STATE_A: return "A - EV Not Connected (12V)";
|
||||
@@ -76,10 +96,11 @@ const char* evse_state_to_str(evse_state_t state) {
|
||||
void evse_state_init(void) {
|
||||
portENTER_CRITICAL(&state_mux);
|
||||
current_state = EVSE_STATE_A;
|
||||
session_start_tick = xTaskGetTickCount();
|
||||
is_authorized = true;
|
||||
portEXIT_CRITICAL(&state_mux);
|
||||
|
||||
ESP_LOGI("EVSE_STATE", "Inicializado em estado: %s", evse_state_to_str(current_state));
|
||||
ESP_LOGI("EVSE_STATE", "Initialized in state: %s", evse_state_to_str(current_state));
|
||||
|
||||
evse_state_event_data_t evt = {
|
||||
.state = map_state_to_event(current_state)
|
||||
@@ -88,7 +109,7 @@ void evse_state_init(void) {
|
||||
}
|
||||
|
||||
void evse_state_tick(void) {
|
||||
// Tick do estado (placeholder)
|
||||
// Placeholder for future state logic
|
||||
}
|
||||
|
||||
bool evse_state_is_charging(evse_state_t state) {
|
||||
|
||||
Reference in New Issue
Block a user