#ifndef COMMUNICATION_HANDLER_H #define COMMUNICATION_HANDLER_H #include "client_handler.h" #include #include #include #include #include #include #include #include #include #define BROADCAST_INTERVAL_MS 500 #define CLIENT_TIMEOUT_MS 5000 // 5 Sekunden Timeout #define CHECK_INTERVAL_MS 1000 // Jede Sekunde überprüfen static uint8_t broadcast_address[ESP_NOW_ETH_ALEN] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; #define IS_BROADCAST_ADDR(addr) \ (memcmp(addr, broadcast_address, ESP_NOW_ETH_ALEN) == 0) #define MAC2STR(a) (a)[0], (a)[1], (a)[2], (a)[3], (a)[4], (a)[5] #define MACSTR "%02X:%02X:%02X:%02X:%02X:%02X" #define MESSAGE_QUEUE_SIZE 10 typedef enum { BroadCastPage, StatusPage, PingPage, RegisterPage, } CommandPages; typedef struct { uint32_t uptime; uint8_t status; } StatusPayload; typedef struct { uint32_t timestamp; } PingPayload; typedef struct { } BroadCastPayload; typedef struct { bool familierClient; } RegisterPayload; typedef union { StatusPayload status_payload; PingPayload ping_payload; BroadCastPayload broadcast_payload; RegisterPayload register_payload; } PayloadUnion; typedef struct { uint16_t version; CommandPages commandPage; uint16_t length; PayloadUnion payload; } BaseMessage; static_assert(sizeof(BaseMessage) <= 255, "BaseMessage darf nicht größer als 255 sein"); void init_com(ClientList *clients); int getNextFreeClientId(); void add_peer(uint8_t *macAddr); BaseMessage MessageBuilder(CommandPages commandPage, PayloadUnion payload, size_t payload_size); void master_broadcast_task(void *param); void master_ping_task(void *param); void master_broadcast_ping(void *param); void master_receive_callback(const esp_now_recv_info_t *esp_now_info, const uint8_t *data, int data_len); void client_receive_callback(const esp_now_recv_info_t *esp_now_info, const uint8_t *data, int data_len); void client_data_sending_task(void *param); void client_monitor_task(void *pvParameters); #endif