diff --git a/src/activities/network/CrossPointWebServerActivity.cpp b/src/activities/network/CrossPointWebServerActivity.cpp index 335cd0f4..e4897b6d 100644 --- a/src/activities/network/CrossPointWebServerActivity.cpp +++ b/src/activities/network/CrossPointWebServerActivity.cpp @@ -43,6 +43,7 @@ void CrossPointWebServerActivity::onEnter() { state = WebServerActivityState::MODE_SELECTION; networkMode = NetworkMode::JOIN_NETWORK; isApMode = false; + webServerStarted = false; connectedIP.clear(); connectedSSID.clear(); lastHandleClientTime = 0; @@ -97,6 +98,11 @@ void CrossPointWebServerActivity::onExit() { LOG_DBG("WEBACT", "Free heap at onExit end: %d bytes", ESP.getFreeHeap()); requestUpdate(); + + if (webServerStarted) { + LOG_DBG("WEBACT", "Restarting device after webserver exit to regain heap..."); + ESP.restart(); + } } void CrossPointWebServerActivity::onNetworkModeSelected(const NetworkMode mode) { @@ -245,6 +251,7 @@ void CrossPointWebServerActivity::startWebServer() { webServer->begin(); if (webServer->isRunning()) { + webServerStarted = true; state = WebServerActivityState::SERVER_RUNNING; if (!isApMode) { currentRssi = WiFi.RSSI(); diff --git a/src/activities/network/CrossPointWebServerActivity.h b/src/activities/network/CrossPointWebServerActivity.h index ed8c11f9..51b66b68 100644 --- a/src/activities/network/CrossPointWebServerActivity.h +++ b/src/activities/network/CrossPointWebServerActivity.h @@ -34,6 +34,9 @@ class CrossPointWebServerActivity final : public Activity { NetworkMode networkMode = NetworkMode::JOIN_NETWORK; bool isApMode = false; + // Track whether the web server was started during this activity. + bool webServerStarted = false; + // Web server - owned by this activity std::unique_ptr webServer;