#include "esphome.h"
#include "driver/gpio.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
struct Valve {
gpio_num_t open_pin;
gpio_num_t close_pin;
bool open;
bool motor_running;
};
static Valve valve = {
.open_pin = GPIO_NUM_19,
.close_pin = GPIO_NUM_18,
.open = false,
.motor_running = false,
};
void boot() {
gpio_set_direction(GPIO_NUM_19, GPIO_MODE_OUTPUT);
gpio_set_level(GPIO_NUM_19, 1);
gpio_set_direction(GPIO_NUM_18, GPIO_MODE_OUTPUT);
gpio_set_level(GPIO_NUM_18, 1);
valve = {
.open_pin = GPIO_NUM_19,
.close_pin = GPIO_NUM_18,
.open = false,
.motor_running = false,
};
}
bool valveState() {
return valve.open;
}
void valve_task(void *pvParameters) {
gpio_num_t PIN = valve.open_pin;
if (valve.open) {
ESP_LOGI("custom", "Valve opening");
PIN = valve.open_pin;
} else {
ESP_LOGI("custom", "Valve closing");
PIN = valve.close_pin;
}
gpio_set_level(PIN, 0);
vTaskDelay(pdMS_TO_TICKS(10000));
gpio_set_level(PIN, 1);
ESP_LOGI("custom", "Valve no longer running");
valve.motor_running = false;
vTaskDelete(NULL);
}
void switchValve() {
if (valve.motor_running) {
return;
}
valve.motor_running = true;
valve.open = !valve.open;
xTaskCreate(
valve_task,
"valve_task",
2048,
NULL,
1,
NULL
);
}