Move to server activity

This commit is contained in:
Brendan O'Leary 2025-12-18 22:12:27 -05:00
parent 5d706685c5
commit 34dbbc5503
6 changed files with 25 additions and 16 deletions

View File

@ -9,6 +9,7 @@
// Initialize the static instance // Initialize the static instance
WifiCredentialStore WifiCredentialStore::instance; WifiCredentialStore WifiCredentialStore::instance;
namespace {
// File format version // File format version
constexpr uint8_t WIFI_FILE_VERSION = 1; constexpr uint8_t WIFI_FILE_VERSION = 1;
@ -19,6 +20,7 @@ constexpr char WIFI_FILE[] = "/sd/.crosspoint/wifi.bin";
// This is NOT cryptographic security, just prevents casual file reading // This is NOT cryptographic security, just prevents casual file reading
constexpr uint8_t OBFUSCATION_KEY[] = {0x43, 0x72, 0x6F, 0x73, 0x73, 0x50, 0x6F, 0x69, 0x6E, 0x74}; constexpr uint8_t OBFUSCATION_KEY[] = {0x43, 0x72, 0x6F, 0x73, 0x73, 0x50, 0x6F, 0x69, 0x6E, 0x74};
constexpr size_t KEY_LENGTH = sizeof(OBFUSCATION_KEY); constexpr size_t KEY_LENGTH = sizeof(OBFUSCATION_KEY);
} // namespace
void WifiCredentialStore::obfuscate(std::string& data) const { void WifiCredentialStore::obfuscate(std::string& data) const {
Serial.printf("[%lu] [WCS] Obfuscating/deobfuscating %zu bytes\n", millis(), data.size()); Serial.printf("[%lu] [WCS] Obfuscating/deobfuscating %zu bytes\n", millis(), data.size());

View File

@ -3,7 +3,6 @@
#include <GfxRenderer.h> #include <GfxRenderer.h>
#include <WiFi.h> #include <WiFi.h>
#include "CrossPointWebServer.h"
#include "config.h" #include "config.h"
void CrossPointWebServerActivity::taskTrampoline(void* param) { void CrossPointWebServerActivity::taskTrampoline(void* param) {
@ -119,9 +118,11 @@ void CrossPointWebServerActivity::onWifiSelectionComplete(bool connected) {
void CrossPointWebServerActivity::startWebServer() { void CrossPointWebServerActivity::startWebServer() {
Serial.printf("[%lu] [WEBACT] Starting web server...\n", millis()); Serial.printf("[%lu] [WEBACT] Starting web server...\n", millis());
crossPointWebServer.begin(); // Create the web server instance
webServer.reset(new CrossPointWebServer());
webServer->begin();
if (crossPointWebServer.isRunning()) { if (webServer->isRunning()) {
state = WebServerActivityState::SERVER_RUNNING; state = WebServerActivityState::SERVER_RUNNING;
Serial.printf("[%lu] [WEBACT] Web server started successfully\n", millis()); Serial.printf("[%lu] [WEBACT] Web server started successfully\n", millis());
@ -133,17 +134,19 @@ void CrossPointWebServerActivity::startWebServer() {
Serial.printf("[%lu] [WEBACT] Rendered File Transfer screen\n", millis()); Serial.printf("[%lu] [WEBACT] Rendered File Transfer screen\n", millis());
} else { } else {
Serial.printf("[%lu] [WEBACT] ERROR: Failed to start web server!\n", millis()); Serial.printf("[%lu] [WEBACT] ERROR: Failed to start web server!\n", millis());
webServer.reset();
// Go back on error // Go back on error
onGoBack(); onGoBack();
} }
} }
void CrossPointWebServerActivity::stopWebServer() { void CrossPointWebServerActivity::stopWebServer() {
if (crossPointWebServer.isRunning()) { if (webServer && webServer->isRunning()) {
Serial.printf("[%lu] [WEBACT] Stopping web server...\n", millis()); Serial.printf("[%lu] [WEBACT] Stopping web server...\n", millis());
crossPointWebServer.stop(); webServer->stop();
Serial.printf("[%lu] [WEBACT] Web server stopped\n", millis()); Serial.printf("[%lu] [WEBACT] Web server stopped\n", millis());
} }
webServer.reset();
} }
void CrossPointWebServerActivity::loop() { void CrossPointWebServerActivity::loop() {
@ -158,7 +161,7 @@ void CrossPointWebServerActivity::loop() {
case WebServerActivityState::SERVER_RUNNING: case WebServerActivityState::SERVER_RUNNING:
// Handle web server requests // Handle web server requests
if (crossPointWebServer.isRunning()) { if (webServer && webServer->isRunning()) {
unsigned long timeSinceLastHandleClient = millis() - lastHandleClientTime; unsigned long timeSinceLastHandleClient = millis() - lastHandleClientTime;
// Log if there's a significant gap between handleClient calls (>100ms) // Log if there's a significant gap between handleClient calls (>100ms)
@ -167,7 +170,7 @@ void CrossPointWebServerActivity::loop() {
timeSinceLastHandleClient); timeSinceLastHandleClient);
} }
crossPointWebServer.handleClient(); webServer->handleClient();
lastHandleClientTime = millis(); lastHandleClientTime = millis();
} }

View File

@ -9,6 +9,7 @@
#include "../Activity.h" #include "../Activity.h"
#include "WifiSelectionActivity.h" #include "WifiSelectionActivity.h"
#include "server/CrossPointWebServer.h"
// Web server activity states // Web server activity states
enum class WebServerActivityState { enum class WebServerActivityState {
@ -35,6 +36,9 @@ class CrossPointWebServerActivity final : public Activity {
// WiFi selection subactivity // WiFi selection subactivity
std::unique_ptr<WifiSelectionActivity> wifiSelection; std::unique_ptr<WifiSelectionActivity> wifiSelection;
// Web server - owned by this activity
std::unique_ptr<CrossPointWebServer> webServer;
// Server status // Server status
std::string connectedIP; std::string connectedIP;
std::string connectedSSID; std::string connectedSSID;
@ -58,4 +62,7 @@ class CrossPointWebServerActivity final : public Activity {
void onEnter() override; void onEnter() override;
void onExit() override; void onExit() override;
void loop() override; void loop() override;
// Check if web server is running (used by main loop for timing optimization)
bool isWebServerRunning() const { return webServer && webServer->isRunning(); }
}; };

View File

@ -10,9 +10,6 @@
#include "html/FilesPageHeaderHtml.generated.h" #include "html/FilesPageHeaderHtml.generated.h"
#include "html/HomePageHtml.generated.h" #include "html/HomePageHtml.generated.h"
// Global instance
CrossPointWebServer crossPointWebServer;
// Folders/files to hide from the web interface file browser // Folders/files to hide from the web interface file browser
// Note: Items starting with "." are automatically hidden // Note: Items starting with "." are automatically hidden
static const char* HIDDEN_ITEMS[] = {"System Volume Information", "XTCache"}; static const char* HIDDEN_ITEMS[] = {"System Volume Information", "XTCache"};

View File

@ -54,6 +54,3 @@ class CrossPointWebServer {
void handleCreateFolder(); void handleCreateFolder();
void handleDelete(); void handleDelete();
}; };
// Global instance
extern CrossPointWebServer crossPointWebServer;

View File

@ -17,7 +17,6 @@
#include "Battery.h" #include "Battery.h"
#include "CrossPointSettings.h" #include "CrossPointSettings.h"
#include "CrossPointState.h" #include "CrossPointState.h"
#include "CrossPointWebServer.h"
#include "activities/boot_sleep/BootActivity.h" #include "activities/boot_sleep/BootActivity.h"
#include "activities/boot_sleep/SleepActivity.h" #include "activities/boot_sleep/SleepActivity.h"
#include "activities/home/HomeActivity.h" #include "activities/home/HomeActivity.h"
@ -45,6 +44,7 @@ EInkDisplay einkDisplay(EPD_SCLK, EPD_MOSI, EPD_CS, EPD_DC, EPD_RST, EPD_BUSY);
InputManager inputManager; InputManager inputManager;
GfxRenderer renderer(einkDisplay); GfxRenderer renderer(einkDisplay);
Activity* currentActivity; Activity* currentActivity;
CrossPointWebServerActivity* webServerActivity = nullptr; // Track web server activity for loop timing
// Fonts // Fonts
EpdFont bookerlyFont(&bookerly_2b); EpdFont bookerlyFont(&bookerly_2b);
@ -72,6 +72,8 @@ void exitActivity() {
if (currentActivity) { if (currentActivity) {
currentActivity->onExit(); currentActivity->onExit();
delete currentActivity; delete currentActivity;
currentActivity = nullptr;
webServerActivity = nullptr; // Clear web server activity pointer when exiting
} }
} }
@ -145,7 +147,8 @@ void onGoToReaderHome() { onGoToReader(std::string()); }
void onGoToFileTransfer() { void onGoToFileTransfer() {
exitActivity(); exitActivity();
enterNewActivity(new CrossPointWebServerActivity(renderer, inputManager, onGoHome)); webServerActivity = new CrossPointWebServerActivity(renderer, inputManager, onGoHome);
enterNewActivity(webServerActivity);
} }
void onGoToSettings() { void onGoToSettings() {
@ -207,7 +210,7 @@ void loop() {
// Reduce delay when webserver is running to allow faster handleClient() calls // Reduce delay when webserver is running to allow faster handleClient() calls
// This is critical for upload performance and preventing TCP timeouts // This is critical for upload performance and preventing TCP timeouts
if (crossPointWebServer.isRunning()) { if (webServerActivity && webServerActivity->isWebServerRunning()) {
delay(1); // Minimal delay to prevent tight loop delay(1); // Minimal delay to prevent tight loop
} else { } else {
delay(10); // Normal delay when webserver not active delay(10); // Normal delay when webserver not active