Nimbin[12]?Embedded / esp_garden / client_pump/main/main.cpp

esp_garden git · master

Distributed ESP sensor and actuator system (garden)

esp32 esp-idf iot sensors c++ sql · first commit 2025-10-15 · last commit 2026-01-20 (8 months ago) · synced 3 days ago · upstream: git.ide3.de/hsnr/mic/esp_garden

C++ 70.7% Markdown 18% C 10.7%
git clone https://git.christianimmanuel.de/embedded/esp_garden.gitwget https://git.christianimmanuel.de/embedded/esp_garden/archive/esp_garden.tar.gz
client_pump/main/main.cpp 2.4 KB · 84 lines raw
#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);
}