#pragma once #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "ui/apps/iotdis/settings/settings_handler.h" #include #include #include #include "esp_err.h" #include "network/udp_client.h" struct StatusUpdateEventData { enum class VoiceState { UNKNOWN, MUTED, UNMUTED, ERROR } state; }; using StatusEventCallback = void(*)(StatusUpdateEventData, void*); class IotDisBridge { public: IotDisBridge( SettingHandler* setting_handler ) : setting_handler_(setting_handler) { } ~IotDisBridge(); void start_polling_task(); void stop_polling_task(); esp_err_t send_mute_command(); bool test_connection(const std::string& ip, uint16_t port) { return test_connection(ip, port, setting_handler_->get_local_port()); } bool test_connection(const std::string& ip, uint16_t port, uint16_t local_port); void register_on_status_update_callback( StatusEventCallback callback, void* status_event_user_data ) { on_status_update_callback_ = callback; status_event_user_data_ = status_event_user_data; } private: static constexpr int POLL_INTERVAL_MS = 10000; static constexpr int ERROR_POLL_INTERVAL_MS = 20000; static constexpr int RESPONSE_TIMEOUT_MS = 1000; static constexpr int MAX_FAILURES_BEFORE_ERROR = 3; void poll_status_(); // Polling task static void poll_task_(void* param); TaskHandle_t poll_task_handle_ = nullptr; bool stop_polling_ = false; int consecutive_failures_ = 0; SettingHandler* setting_handler_ = nullptr; UDPClient udp_client_; StatusEventCallback on_status_update_callback_ = nullptr; void* status_event_user_data_ = nullptr; };