84 lines
2.0 KiB
C
Executable File
84 lines
2.0 KiB
C
Executable File
// evse_core.c - Main EVSE control logic
|
|
|
|
#include "evse_fsm.h"
|
|
#include "evse_error.h"
|
|
#include "evse_limits.h"
|
|
#include "evse_config.h"
|
|
#include "evse_api.h"
|
|
#include "evse_session.h"
|
|
#include "evse_pilot.h"
|
|
#include "freertos/FreeRTOS.h"
|
|
#include "freertos/semphr.h"
|
|
#include "esp_log.h"
|
|
|
|
static const char *TAG = "evse_core";
|
|
|
|
static SemaphoreHandle_t mutex;
|
|
static evse_state_t last_state = EVSE_STATE_A;
|
|
|
|
static void evse_core_task(void *arg);
|
|
|
|
// ================================
|
|
// Initialization
|
|
// ================================
|
|
|
|
void evse_init(void) {
|
|
ESP_LOGI(TAG, "EVSE Init");
|
|
|
|
mutex = xSemaphoreCreateMutex(); // Optional: use static version for deterministic memory
|
|
|
|
evse_check_defaults();
|
|
evse_fsm_reset();
|
|
pilot_set_level(true); // Enable pilot output
|
|
|
|
xTaskCreate(evse_core_task, "evse_core_task", 4096, NULL, 5, NULL);
|
|
}
|
|
|
|
// ================================
|
|
// Main Processing Logic
|
|
// ================================
|
|
|
|
void evse_process(void) {
|
|
xSemaphoreTake(mutex, portMAX_DELAY);
|
|
|
|
pilot_voltage_t pilot_voltage;
|
|
bool is_n12v = false;
|
|
|
|
pilot_measure(&pilot_voltage, &is_n12v);
|
|
ESP_LOGD(TAG, "Pilot: %d, -12V: %s", pilot_voltage, is_n12v ? "yes" : "no");
|
|
|
|
evse_error_check(pilot_voltage, is_n12v);
|
|
|
|
// Só chama FSM, que decide tudo
|
|
evse_fsm_process(
|
|
pilot_voltage,
|
|
evse_state_get_authorized(),
|
|
evse_config_is_available(),
|
|
evse_config_is_enabled()
|
|
);
|
|
|
|
evse_limits_check();
|
|
|
|
evse_state_t current = evse_get_state();
|
|
if (current != last_state) {
|
|
ESP_LOGI(TAG, "State changed: %s → %s",
|
|
evse_state_to_str(last_state),
|
|
evse_state_to_str(current));
|
|
last_state = current;
|
|
}
|
|
|
|
evse_mark_error_cleared();
|
|
|
|
xSemaphoreGive(mutex);
|
|
}
|
|
|
|
// ================================
|
|
// Background Task
|
|
// ================================
|
|
|
|
static void evse_core_task(void *arg) {
|
|
while (true) {
|
|
evse_process();
|
|
vTaskDelay(pdMS_TO_TICKS(100)); // 10 Hz cycle
|
|
}
|
|
} |