#ifndef EVSE_STATE_H #define EVSE_STATE_H #include #include "freertos/FreeRTOS.h" #include "evse_events.h" #ifdef __cplusplus extern "C" { #endif typedef enum { EVSE_STATE_A, // EV Not Connected (12V) EVSE_STATE_B1, // EV Connected (9V, Not Authorized) EVSE_STATE_B2, // EV Connected (9V, Authorized and Ready) EVSE_STATE_C1, // Charging Requested (6V, Relay Off) EVSE_STATE_C2, // Charging Active (6V, Relay On) EVSE_STATE_D1, // Ventilation Required (3V, Relay Off) EVSE_STATE_D2, // Ventilation Active (3V, Relay On) EVSE_STATE_E, // Error: Pilot Short to Ground (0V) EVSE_STATE_F // Fault: No Pilot or EVSE Unavailable } evse_state_t; // Initialization void evse_state_init(void); void evse_state_tick(void); // State Access & Control evse_state_t evse_get_state(void); void evse_set_state(evse_state_t state); const char *evse_state_to_str(evse_state_t state); // --------------------------- // State Evaluation Helpers // --------------------------- /** * @brief True se existe uma sessão "lógica" ativa (carro ligado e autorizado/pronto ou a carregar). * Inclui B2, C1/C2, D1/D2. */ bool evse_state_is_session(evse_state_t state); /** * @brief True se o EVSE está a fornecer energia (relé ON). * Estados com energia: C2 e D2. * * Nota: isto substitui a antiga interpretação “C1/C2”. */ bool evse_state_is_charging(evse_state_t state); /** * @brief True se o EV pediu carga mas o relé ainda está OFF (C1/D1). */ bool evse_state_is_requesting(evse_state_t state); /** * @brief True se há fluxo de energia (alias explícito para charging). */ bool evse_state_is_power_flowing(evse_state_t state); /** * @brief True se o EV está fisicamente ligado (B1 e além). */ bool evse_state_is_plugged(evse_state_t state); // Authorization Control void evse_state_set_authorized(bool authorized); bool evse_state_get_authorized(void); #ifdef __cplusplus } #endif #endif // EVSE_STATE_H