#ifndef TRANSPORT_MANAGER_H #define TRANSPORT_MANAGER_H #include #include #include #include "wifi_manager.h" #include "gsm_manager.h" #include "config_manager.h" enum class TransportType { NONE, WIFI, GSM }; enum class TransportPriority : uint8_t { WIFI_PREFERRED = 0, GSM_PREFERRED = 1, WIFI_ONLY = 2, GSM_ONLY = 3 }; class TransportManager { public: void begin(WifiManager& wifi, GsmManager& gsm, ConfigManager& config, WiFiClient* wifiClient); void loop(); bool isConnected(); TransportType getActiveTransport() { return _activeTransport; } Client& getClient(); void setPriority(TransportPriority prio); TransportPriority getPriority() { return _priority; } int getSignalStrength(); const char* getTransportName(); String getConnectionInfo(); void onTransportChange(std::function callback) { _onChangeCallback = callback; } void forceEvaluate() { _evaluateNow = true; } static const char* transportTypeName(TransportType t); private: WifiManager* _wifi; GsmManager* _gsm; ConfigManager* _config; WiFiClient* _wifiClient; TransportType _activeTransport; TransportPriority _priority; bool _evaluateNow; std::function _onChangeCallback; unsigned long _lastEvaluationMs; unsigned long _lastGsmAttemptMs; static const unsigned long EVAL_INTERVAL_MS = 10000; static const unsigned long GSM_CONNECT_COOLDOWN_MS = 60000; void evaluateTransport(); void switchTransport(TransportType newType); bool tryGsmConnect(); }; #endif