#include "ClientPump.h" #include "esp_system.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "esp_log.h" extern "C" void set_gpio_output_level(int gpio_num,int level); extern "C" esp_err_t esp_base_mac_addr_set(const uint8_t mac[6]); long long next_message_unix = 0; bool received_starting_message = false; PumpConfig_s pump_configs[PUMP_COUNT] = { {"pump_1", 0, 0, 0, 0, INACTIVE}, {"pump_2", 0, 0, 0, 0, INACTIVE}, }; void start_Pump(PumpConfig_s& pump_data) { set_gpio_output_level(8,1); set_gpio_output_level(10,1); ESP_LOGI("start_Pump", "Starting Pump %s", pump_data.pump_name); pump_data.pumping_started_at_unix = get_CurrentUnix(); pump_data.pumping_status = RUNNING; } void stop_Pump(PumpConfig_s& pump_data) { set_gpio_output_level(10,0); set_gpio_output_level(8,0); ESP_LOGI("stop_Pump", "Stopped Pump %s", pump_data.pump_name); pump_data.pumping_status = INACTIVE; } void pump_loop(void*) { while (true) { bool pumping = false; for (size_t i = 0; i < PUMP_COUNT; i++) { PumpConfig_s& cfg = pump_configs[i]; if (START == cfg.pumping_status) { pumping = true; received_starting_message = false; start_Pump(cfg); } else if (RUNNING == cfg.pumping_status) { long long stop_time = cfg.pumping_started_at_unix + cfg.pumping_duration; long long now = get_CurrentUnix(); if (stop_time <= now) stop_Pump(cfg); else pumping = true; } } if (!pumping && next_message_unix != 0 && !received_starting_message) sleep_UntilNextSend(next_message_unix); // give other tasks CPU time vTaskDelay(pdMS_TO_TICKS(100)); } } extern "C" void app_main(void) { static const char *TAG = "app_main"; uint32_t setup_start = esp_timer_get_time() / 1000ULL; ESP_LOGI(TAG, "Initializing ClientPump..."); esp_base_mac_addr_set(PEER_PUMP); setup_Timezone(); init_WiFi(); init_EspNow(); next_message_unix = 0; received_starting_message = false; uint32_t setup_duration = (esp_timer_get_time() / 1000ULL) - setup_start; ESP_LOGI(TAG, "Setup duration: %u ms", setup_duration); xTaskCreate(pump_loop, "pump_loop", 4096, nullptr, 5, nullptr); }