#pragma once #include #include #include #include #include #include #include "../Activity.h" #include "WifiSelectionActivity.h" #include "server/CrossPointWebServer.h" // Web server activity states enum class WebServerActivityState { WIFI_SELECTION, // WiFi selection subactivity is active SERVER_RUNNING, // Web server is running and handling requests SHUTTING_DOWN // Shutting down server and WiFi }; /** * CrossPointWebServerActivity is the entry point for file transfer functionality. * It: * - Immediately turns on WiFi and launches WifiSelectionActivity on enter * - When WifiSelectionActivity completes successfully, starts the CrossPointWebServer * - Handles client requests in its loop() function * - Cleans up the server and shuts down WiFi on exit */ class CrossPointWebServerActivity final : public Activity { TaskHandle_t displayTaskHandle = nullptr; SemaphoreHandle_t renderingMutex = nullptr; bool updateRequired = false; WebServerActivityState state = WebServerActivityState::WIFI_SELECTION; const std::function onGoBack; // WiFi selection subactivity std::unique_ptr wifiSelection; // Web server - owned by this activity std::unique_ptr webServer; // Server status std::string connectedIP; std::string connectedSSID; // Performance monitoring unsigned long lastHandleClientTime = 0; static void taskTrampoline(void* param); [[noreturn]] void displayTaskLoop(); void render() const; void renderServerRunning() const; void onWifiSelectionComplete(bool connected); void startWebServer(); void stopWebServer(); public: explicit CrossPointWebServerActivity(GfxRenderer& renderer, InputManager& inputManager, const std::function& onGoBack) : Activity(renderer, inputManager), onGoBack(onGoBack) {} void onEnter() override; void onExit() override; void loop() override; bool skipLoopDelay() override { return webServer && webServer->isRunning(); } };