From 0531cee32c27e45a6c5f8009d59db5af65bf0082 Mon Sep 17 00:00:00 2001 From: Eliz Kilic Date: Sun, 1 Feb 2026 20:09:33 +0000 Subject: [PATCH 1/8] auto connect last wifi --- src/CrossPointSettings.cpp | 3 +- src/CrossPointSettings.h | 1 + .../network/AutoConnectingActivity.cpp | 91 +++++++++++++++++++ .../network/AutoConnectingActivity.h | 29 ++++++ .../network/WifiSelectionActivity.cpp | 34 ++++--- .../settings/CategorySettingsActivity.cpp | 11 ++- src/activities/settings/SettingsActivity.cpp | 3 +- src/main.cpp | 42 ++++++++- 8 files changed, 193 insertions(+), 21 deletions(-) create mode 100644 src/activities/network/AutoConnectingActivity.cpp create mode 100644 src/activities/network/AutoConnectingActivity.h diff --git a/src/CrossPointSettings.cpp b/src/CrossPointSettings.cpp index 232c7c57..e032fab6 100644 --- a/src/CrossPointSettings.cpp +++ b/src/CrossPointSettings.cpp @@ -22,7 +22,7 @@ void readAndValidate(FsFile& file, uint8_t& member, const uint8_t maxValue) { namespace { constexpr uint8_t SETTINGS_FILE_VERSION = 1; // Increment this when adding new persisted settings fields -constexpr uint8_t SETTINGS_COUNT = 23; +constexpr uint8_t SETTINGS_COUNT = 24; constexpr char SETTINGS_FILE[] = "/.crosspoint/settings.bin"; } // namespace @@ -60,6 +60,7 @@ bool CrossPointSettings::saveToFile() const { serialization::writeString(outputFile, std::string(opdsUsername)); serialization::writeString(outputFile, std::string(opdsPassword)); serialization::writePod(outputFile, sleepScreenCoverFilter); + serialization::writeString(outputFile, std::string(lastConnectedSSID)); // New fields added at end for backward compatibility outputFile.close(); diff --git a/src/CrossPointSettings.h b/src/CrossPointSettings.h index c450d348..7a4f9904 100644 --- a/src/CrossPointSettings.h +++ b/src/CrossPointSettings.h @@ -137,6 +137,7 @@ class CrossPointSettings { uint8_t hideBatteryPercentage = HIDE_NEVER; // Long-press chapter skip on side buttons uint8_t longPressChapterSkip = 1; + char lastConnectedSSID[33] = ""; ~CrossPointSettings() = default; diff --git a/src/activities/network/AutoConnectingActivity.cpp b/src/activities/network/AutoConnectingActivity.cpp new file mode 100644 index 00000000..3aad2d80 --- /dev/null +++ b/src/activities/network/AutoConnectingActivity.cpp @@ -0,0 +1,91 @@ +#include "AutoConnectingActivity.h" + +#include +#include +#include +#include "MappedInputManager.h" +#include "fontIds.h" +#include "CrossPointSettings.h" +#include "WifiCredentialStore.h" + +AutoConnectingActivity::AutoConnectingActivity( + GfxRenderer& renderer, + MappedInputManager& mappedInput, + const std::function& on_success, + const std::function& on_failure +) : Activity("AutoConnecting", renderer, mappedInput), + on_success(on_success), + on_failure(on_failure) {} + +void AutoConnectingActivity::onEnter() { + Activity::onEnter(); + render(); + attemptConnection(); +} + +void AutoConnectingActivity::onExit() { + Activity::onExit(); +} + +void AutoConnectingActivity::loop() { + if (mappedInput.wasPressed(MappedInputManager::Button::Back)) { + WiFi.disconnect(); + on_failure(); + } else if (mappedInput.wasPressed(MappedInputManager::Button::Confirm)) { // Skip + WiFi.disconnect(); + on_failure(); + } + checkConnectionStatus(); +} + +void AutoConnectingActivity::attemptConnection() { + connectionStartTime = millis(); + std::string ssid = SETTINGS.lastConnectedSSID; + const auto* cred = WIFI_STORE.findCredential(ssid); + if (!cred) { + on_failure(); + return; + } + + WiFi.mode(WIFI_STA); + WiFi.begin(ssid.c_str(), cred->password.c_str()); +} + +void AutoConnectingActivity::checkConnectionStatus() { + const wl_status_t status = WiFi.status(); + + if (status == WL_CONNECTED) { + on_success(); + return; + } + + if (status == WL_CONNECT_FAILED || status == WL_NO_SSID_AVAIL) { + on_failure(); + return; + } + + if (millis() - connectionStartTime > CONNECTION_TIMEOUT_MS) { + WiFi.disconnect(); + on_failure(); + return; + } +} + +void AutoConnectingActivity::render() const { + renderer.clearScreen(); + const auto pageHeight = renderer.getScreenHeight(); + const auto height = renderer.getLineHeight(UI_10_FONT_ID); + const auto top = (pageHeight - height) / 2; + + renderer.drawCenteredText(UI_12_FONT_ID, top - 40, "Connecting...", true, EpdFontFamily::BOLD); + + std::string ssidInfo = "to " + std::string(SETTINGS.lastConnectedSSID); + if (ssidInfo.length() > 25) { + ssidInfo.replace(22, ssidInfo.length() - 22, "..."); + } + renderer.drawCenteredText(UI_10_FONT_ID, top, ssidInfo.c_str()); + + const auto labels = mappedInput.mapLabels("« Back", "Skip", "", ""); + renderer.drawButtonHints(UI_10_FONT_ID, labels.btn1, labels.btn2, labels.btn3, labels.btn4); + renderer.displayBuffer(); +} diff --git a/src/activities/network/AutoConnectingActivity.h b/src/activities/network/AutoConnectingActivity.h new file mode 100644 index 00000000..696fbebf --- /dev/null +++ b/src/activities/network/AutoConnectingActivity.h @@ -0,0 +1,29 @@ +#pragma once + +#include "activities/Activity.h" +#include + +class AutoConnectingActivity final : public Activity { +public: + AutoConnectingActivity( + GfxRenderer& renderer, + MappedInputManager& mappedInput, + const std::function& on_success, + const std::function& on_failure + ); + + void onEnter() override; + void onExit() override; + void loop() override; + +private: + void render() const; + void attemptConnection(); + void checkConnectionStatus(); + + const std::function on_success; + const std::function on_failure; + + unsigned long connectionStartTime = 0; + static constexpr unsigned long CONNECTION_TIMEOUT_MS = 15000; +}; diff --git a/src/activities/network/WifiSelectionActivity.cpp b/src/activities/network/WifiSelectionActivity.cpp index 8bf83a93..71b3071c 100644 --- a/src/activities/network/WifiSelectionActivity.cpp +++ b/src/activities/network/WifiSelectionActivity.cpp @@ -251,6 +251,11 @@ void WifiSelectionActivity::checkConnectionStatus() { snprintf(ipStr, sizeof(ipStr), "%d.%d.%d.%d", ip[0], ip[1], ip[2], ip[3]); connectedIP = ipStr; + // Save the last connected SSID + strncpy(SETTINGS.lastConnectedSSID, selectedSSID.c_str(), sizeof(SETTINGS.lastConnectedSSID) - 1); + SETTINGS.lastConnectedSSID[sizeof(SETTINGS.lastConnectedSSID) - 1] = '\0'; + SETTINGS.saveToFile(); + // If we entered a new password, ask if user wants to save it // Otherwise, immediately complete so parent can start web server if (!usedSavedPassword && !enteredPassword.empty()) { @@ -311,14 +316,12 @@ void WifiSelectionActivity::loop() { // Handle save prompt state if (state == WifiSelectionState::SAVE_PROMPT) { - if (mappedInput.wasPressed(MappedInputManager::Button::Up) || - mappedInput.wasPressed(MappedInputManager::Button::Left)) { + if (mappedInput.wasPressed(MappedInputManager::Button::Left)) { if (savePromptSelection > 0) { savePromptSelection--; updateRequired = true; } - } else if (mappedInput.wasPressed(MappedInputManager::Button::Down) || - mappedInput.wasPressed(MappedInputManager::Button::Right)) { + } else if (mappedInput.wasPressed(MappedInputManager::Button::Right)) { if (savePromptSelection < 1) { savePromptSelection++; updateRequired = true; @@ -341,14 +344,12 @@ void WifiSelectionActivity::loop() { // Handle forget prompt state (connection failed with saved credentials) if (state == WifiSelectionState::FORGET_PROMPT) { - if (mappedInput.wasPressed(MappedInputManager::Button::Up) || - mappedInput.wasPressed(MappedInputManager::Button::Left)) { + if (mappedInput.wasPressed(MappedInputManager::Button::Left)) { if (forgetPromptSelection > 0) { forgetPromptSelection--; updateRequired = true; } - } else if (mappedInput.wasPressed(MappedInputManager::Button::Down) || - mappedInput.wasPressed(MappedInputManager::Button::Right)) { + } else if (mappedInput.wasPressed(MappedInputManager::Button::Right)) { if (forgetPromptSelection < 1) { forgetPromptSelection++; updateRequired = true; @@ -420,18 +421,23 @@ void WifiSelectionActivity::loop() { } // Handle UP/DOWN navigation - if (mappedInput.wasPressed(MappedInputManager::Button::Up) || - mappedInput.wasPressed(MappedInputManager::Button::Left)) { + if (mappedInput.wasPressed(MappedInputManager::Button::Up)) { if (selectedNetworkIndex > 0) { selectedNetworkIndex--; updateRequired = true; } - } else if (mappedInput.wasPressed(MappedInputManager::Button::Down) || - mappedInput.wasPressed(MappedInputManager::Button::Right)) { + } else if (mappedInput.wasPressed(MappedInputManager::Button::Down)) { if (!networks.empty() && selectedNetworkIndex < static_cast(networks.size()) - 1) { selectedNetworkIndex++; updateRequired = true; } + } else if (mappedInput.wasPressed(MappedInputManager::Button::Left)) { + if (!networks.empty() && networks[selectedNetworkIndex].hasSavedPassword) { + selectedSSID = networks[selectedNetworkIndex].ssid; + state = WifiSelectionState::FORGET_PROMPT; + forgetPromptSelection = 0; // Default to "Cancel" + updateRequired = true; + } } } } @@ -585,7 +591,7 @@ void WifiSelectionActivity::renderNetworkList() const { // Draw help text renderer.drawText(SMALL_FONT_ID, 20, pageHeight - 75, "* = Encrypted | + = Saved"); - const auto labels = mappedInput.mapLabels("« Back", "Connect", "", ""); + const auto labels = mappedInput.mapLabels("« Back", "Connect", "Forget", ""); renderer.drawButtonHints(UI_10_FONT_ID, labels.btn1, labels.btn2, labels.btn3, labels.btn4); } @@ -689,7 +695,7 @@ void WifiSelectionActivity::renderForgetPrompt() const { const auto height = renderer.getLineHeight(UI_10_FONT_ID); const auto top = (pageHeight - height * 3) / 2; - renderer.drawCenteredText(UI_12_FONT_ID, top - 40, "Connection Failed", true, EpdFontFamily::BOLD); + renderer.drawCenteredText(UI_12_FONT_ID, top - 40, "Forget Network", true, EpdFontFamily::BOLD); std::string ssidInfo = "Network: " + selectedSSID; if (ssidInfo.length() > 28) { diff --git a/src/activities/settings/CategorySettingsActivity.cpp b/src/activities/settings/CategorySettingsActivity.cpp index 7fd5ef5f..1d035aa6 100644 --- a/src/activities/settings/CategorySettingsActivity.cpp +++ b/src/activities/settings/CategorySettingsActivity.cpp @@ -11,6 +11,7 @@ #include "KOReaderSettingsActivity.h" #include "MappedInputManager.h" #include "OtaUpdateActivity.h" +#include "WifiSelectionActivity.h" #include "fontIds.h" void CategorySettingsActivity::taskTrampoline(void* param) { @@ -95,7 +96,15 @@ void CategorySettingsActivity::toggleCurrentSetting() { SETTINGS.*(setting.valuePtr) = currentValue + setting.valueRange.step; } } else if (setting.type == SettingType::ACTION) { - if (strcmp(setting.name, "KOReader Sync") == 0) { + if (strcmp(setting.name, "Network") == 0) { + xSemaphoreTake(renderingMutex, portMAX_DELAY); + exitActivity(); + enterNewActivity(new WifiSelectionActivity(renderer, mappedInput, [this] { + exitActivity(); + updateRequired = true; + })); + xSemaphoreGive(renderingMutex); + } else if (strcmp(setting.name, "KOReader Sync") == 0) { xSemaphoreTake(renderingMutex, portMAX_DELAY); exitActivity(); enterNewActivity(new KOReaderSettingsActivity(renderer, mappedInput, [this] { diff --git a/src/activities/settings/SettingsActivity.cpp b/src/activities/settings/SettingsActivity.cpp index 7316db05..c14ca9ea 100644 --- a/src/activities/settings/SettingsActivity.cpp +++ b/src/activities/settings/SettingsActivity.cpp @@ -48,10 +48,11 @@ const SettingInfo controlsSettings[controlsSettingsCount] = { SettingInfo::Toggle("Long-press Chapter Skip", &CrossPointSettings::longPressChapterSkip), SettingInfo::Enum("Short Power Button Click", &CrossPointSettings::shortPwrBtn, {"Ignore", "Sleep", "Page Turn"})}; -constexpr int systemSettingsCount = 5; +constexpr int systemSettingsCount = 6; const SettingInfo systemSettings[systemSettingsCount] = { SettingInfo::Enum("Time to Sleep", &CrossPointSettings::sleepTimeout, {"1 min", "5 min", "10 min", "15 min", "30 min"}), + SettingInfo::Action("Network"), SettingInfo::Action("KOReader Sync"), SettingInfo::Action("OPDS Browser"), SettingInfo::Action("Clear Cache"), SettingInfo::Action("Check for updates")}; } // namespace diff --git a/src/main.cpp b/src/main.cpp index 89c4e13c..936c82a6 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -24,7 +24,10 @@ #include "activities/reader/ReaderActivity.h" #include "activities/settings/SettingsActivity.h" #include "activities/util/FullScreenMessageActivity.h" +#include "activities/network/AutoConnectingActivity.h" +#include "activities/network/WifiSelectionActivity.h" #include "fontIds.h" +#include HalDisplay display; HalGPIO gpio; @@ -211,9 +214,38 @@ void onGoToReader(const std::string& initialEpubPath, MyLibraryActivity::Tab fro } void onContinueReading() { onGoToReader(APP_STATE.openEpubPath, MyLibraryActivity::Tab::Recent); } +void onGoHome(); // forward declaration + +void withWifi(std::function on_success) { + if (WiFi.isConnected()) { + on_success(); + return; + } + + auto on_failure = [on_success]() { + exitActivity(); + enterNewActivity(new WifiSelectionActivity(renderer, mappedInputManager, [on_success](bool connected) { + if (connected) { + on_success(); + } else { + onGoHome(); + } + })); + }; + + if (strlen(SETTINGS.lastConnectedSSID) > 0) { + exitActivity(); + enterNewActivity(new AutoConnectingActivity(renderer, mappedInputManager, on_success, on_failure)); + } else { + on_failure(); + } +} + void onGoToFileTransfer() { - exitActivity(); - enterNewActivity(new CrossPointWebServerActivity(renderer, mappedInputManager, onGoHome)); + withWifi([]() { + exitActivity(); + enterNewActivity(new CrossPointWebServerActivity(renderer, mappedInputManager, onGoHome)); + }); } void onGoToSettings() { @@ -232,8 +264,10 @@ void onGoToMyLibraryWithTab(const std::string& path, MyLibraryActivity::Tab tab) } void onGoToBrowser() { - exitActivity(); - enterNewActivity(new OpdsBookBrowserActivity(renderer, mappedInputManager, onGoHome)); + withWifi([]() { + exitActivity(); + enterNewActivity(new OpdsBookBrowserActivity(renderer, mappedInputManager, onGoHome)); + }); } void onGoHome() { From 05b10854dcdc6db1f9a37010a743cfac795a90a3 Mon Sep 17 00:00:00 2001 From: Eliz Kilic Date: Sun, 1 Feb 2026 20:14:46 +0000 Subject: [PATCH 2/8] fix import --- src/activities/network/WifiSelectionActivity.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/activities/network/WifiSelectionActivity.cpp b/src/activities/network/WifiSelectionActivity.cpp index 71b3071c..cc1de9e9 100644 --- a/src/activities/network/WifiSelectionActivity.cpp +++ b/src/activities/network/WifiSelectionActivity.cpp @@ -9,6 +9,7 @@ #include "WifiCredentialStore.h" #include "activities/util/KeyboardEntryActivity.h" #include "fontIds.h" +#include "CrossPointSettings.h" void WifiSelectionActivity::taskTrampoline(void* param) { auto* self = static_cast(param); From 05b0aaa58788803dd9339f599014000a99417101 Mon Sep 17 00:00:00 2001 From: Eliz Kilic Date: Sun, 1 Feb 2026 20:17:34 +0000 Subject: [PATCH 3/8] fix import --- src/activities/settings/CategorySettingsActivity.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/activities/settings/CategorySettingsActivity.cpp b/src/activities/settings/CategorySettingsActivity.cpp index 1d035aa6..7de0cbf9 100644 --- a/src/activities/settings/CategorySettingsActivity.cpp +++ b/src/activities/settings/CategorySettingsActivity.cpp @@ -11,7 +11,7 @@ #include "KOReaderSettingsActivity.h" #include "MappedInputManager.h" #include "OtaUpdateActivity.h" -#include "WifiSelectionActivity.h" +#include "activities/network/WifiSelectionActivity.h" #include "fontIds.h" void CategorySettingsActivity::taskTrampoline(void* param) { From 6c2d7c7044cb28b5d5c131d271236530a58b2b14 Mon Sep 17 00:00:00 2001 From: Eliz Date: Sun, 1 Feb 2026 20:28:52 +0000 Subject: [PATCH 4/8] fix import --- src/activities/settings/CategorySettingsActivity.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/activities/settings/CategorySettingsActivity.cpp b/src/activities/settings/CategorySettingsActivity.cpp index 7de0cbf9..ad7a1d16 100644 --- a/src/activities/settings/CategorySettingsActivity.cpp +++ b/src/activities/settings/CategorySettingsActivity.cpp @@ -99,7 +99,7 @@ void CategorySettingsActivity::toggleCurrentSetting() { if (strcmp(setting.name, "Network") == 0) { xSemaphoreTake(renderingMutex, portMAX_DELAY); exitActivity(); - enterNewActivity(new WifiSelectionActivity(renderer, mappedInput, [this] { + enterNewActivity(new WifiSelectionActivity(renderer, mappedInput, [this](bool) { exitActivity(); updateRequired = true; })); From 1c1adaf07890e78f5064d7c35485c14a08839549 Mon Sep 17 00:00:00 2001 From: Eliz Kilic Date: Sun, 1 Feb 2026 20:33:33 +0000 Subject: [PATCH 5/8] fix crash --- src/WifiCredentialStore.cpp | 7 ++++--- src/activities/network/WifiSelectionActivity.cpp | 3 ++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/WifiCredentialStore.cpp b/src/WifiCredentialStore.cpp index be865b86..d7fec63e 100644 --- a/src/WifiCredentialStore.cpp +++ b/src/WifiCredentialStore.cpp @@ -1,5 +1,6 @@ #include "WifiCredentialStore.h" +#include #include #include #include @@ -102,7 +103,7 @@ bool WifiCredentialStore::loadFromFile() { bool WifiCredentialStore::addCredential(const std::string& ssid, const std::string& password) { // Check if this SSID already exists and update it - const auto cred = find_if(credentials.begin(), credentials.end(), + auto cred = std::find_if(credentials.begin(), credentials.end(), [&ssid](const WifiCredential& cred) { return cred.ssid == ssid; }); if (cred != credentials.end()) { cred->password = password; @@ -123,7 +124,7 @@ bool WifiCredentialStore::addCredential(const std::string& ssid, const std::stri } bool WifiCredentialStore::removeCredential(const std::string& ssid) { - const auto cred = find_if(credentials.begin(), credentials.end(), + auto cred = std::find_if(credentials.begin(), credentials.end(), [&ssid](const WifiCredential& cred) { return cred.ssid == ssid; }); if (cred != credentials.end()) { credentials.erase(cred); @@ -134,7 +135,7 @@ bool WifiCredentialStore::removeCredential(const std::string& ssid) { } const WifiCredential* WifiCredentialStore::findCredential(const std::string& ssid) const { - const auto cred = find_if(credentials.begin(), credentials.end(), + auto cred = std::find_if(credentials.begin(), credentials.end(), [&ssid](const WifiCredential& cred) { return cred.ssid == ssid; }); if (cred != credentials.end()) { diff --git a/src/activities/network/WifiSelectionActivity.cpp b/src/activities/network/WifiSelectionActivity.cpp index cc1de9e9..dc617c58 100644 --- a/src/activities/network/WifiSelectionActivity.cpp +++ b/src/activities/network/WifiSelectionActivity.cpp @@ -3,6 +3,7 @@ #include #include +#include #include #include "MappedInputManager.h" @@ -362,7 +363,7 @@ void WifiSelectionActivity::loop() { WIFI_STORE.removeCredential(selectedSSID); xSemaphoreGive(renderingMutex); // Update the network list to reflect the change - const auto network = find_if(networks.begin(), networks.end(), + const auto network = std::find_if(networks.begin(), networks.end(), [this](const WifiNetworkInfo& net) { return net.ssid == selectedSSID; }); if (network != networks.end()) { network->hasSavedPassword = false; From d4c8e136980058e4dbf0f0207482e7b268cb8e45 Mon Sep 17 00:00:00 2001 From: Eliz Kilic Date: Sun, 1 Feb 2026 20:45:29 +0000 Subject: [PATCH 6/8] remove skip and back --- src/activities/network/AutoConnectingActivity.cpp | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/activities/network/AutoConnectingActivity.cpp b/src/activities/network/AutoConnectingActivity.cpp index 3aad2d80..008d8aa6 100644 --- a/src/activities/network/AutoConnectingActivity.cpp +++ b/src/activities/network/AutoConnectingActivity.cpp @@ -28,13 +28,6 @@ void AutoConnectingActivity::onExit() { } void AutoConnectingActivity::loop() { - if (mappedInput.wasPressed(MappedInputManager::Button::Back)) { - WiFi.disconnect(); - on_failure(); - } else if (mappedInput.wasPressed(MappedInputManager::Button::Confirm)) { // Skip - WiFi.disconnect(); - on_failure(); - } checkConnectionStatus(); } @@ -84,8 +77,5 @@ void AutoConnectingActivity::render() const { ssidInfo.replace(22, ssidInfo.length() - 22, "..."); } renderer.drawCenteredText(UI_10_FONT_ID, top, ssidInfo.c_str()); - - const auto labels = mappedInput.mapLabels("« Back", "Skip", "", ""); - renderer.drawButtonHints(UI_10_FONT_ID, labels.btn1, labels.btn2, labels.btn3, labels.btn4); renderer.displayBuffer(); } From cb7f3313f0a81bfdbe80c616359ea3cc8aaa62b6 Mon Sep 17 00:00:00 2001 From: Eliz Kilic Date: Sun, 1 Feb 2026 20:59:25 +0000 Subject: [PATCH 7/8] format files --- .../network/AutoConnectingActivity.cpp | 110 +++++++++--------- .../network/AutoConnectingActivity.h | 35 +++--- .../network/WifiSelectionActivity.cpp | 4 +- src/activities/settings/SettingsActivity.cpp | 4 +- src/main.cpp | 8 +- 5 files changed, 77 insertions(+), 84 deletions(-) diff --git a/src/activities/network/AutoConnectingActivity.cpp b/src/activities/network/AutoConnectingActivity.cpp index 008d8aa6..423f7f35 100644 --- a/src/activities/network/AutoConnectingActivity.cpp +++ b/src/activities/network/AutoConnectingActivity.cpp @@ -1,81 +1,75 @@ #include "AutoConnectingActivity.h" -#include -#include #include -#include "MappedInputManager.h" -#include "fontIds.h" -#include "CrossPointSettings.h" -#include "WifiCredentialStore.h" +#include -AutoConnectingActivity::AutoConnectingActivity( - GfxRenderer& renderer, - MappedInputManager& mappedInput, - const std::function& on_success, - const std::function& on_failure -) : Activity("AutoConnecting", renderer, mappedInput), - on_success(on_success), - on_failure(on_failure) {} +#include + +#include "CrossPointSettings.h" +#include "MappedInputManager.h" +#include "WifiCredentialStore.h" +#include "fontIds.h" + +AutoConnectingActivity::AutoConnectingActivity(GfxRenderer& renderer, MappedInputManager& mappedInput, + const std::function& on_success, + const std::function& on_failure) + : Activity("AutoConnecting", renderer, mappedInput), on_success(on_success), on_failure(on_failure) {} void AutoConnectingActivity::onEnter() { - Activity::onEnter(); - render(); - attemptConnection(); + Activity::onEnter(); + render(); + attemptConnection(); } -void AutoConnectingActivity::onExit() { - Activity::onExit(); -} +void AutoConnectingActivity::onExit() { Activity::onExit(); } -void AutoConnectingActivity::loop() { - checkConnectionStatus(); -} +void AutoConnectingActivity::loop() { checkConnectionStatus(); } void AutoConnectingActivity::attemptConnection() { - connectionStartTime = millis(); - std::string ssid = SETTINGS.lastConnectedSSID; - const auto* cred = WIFI_STORE.findCredential(ssid); - if (!cred) { - on_failure(); - return; - } - - WiFi.mode(WIFI_STA); - WiFi.begin(ssid.c_str(), cred->password.c_str()); + connectionStartTime = millis(); + std::string ssid = SETTINGS.lastConnectedSSID; + const auto* cred = WIFI_STORE.findCredential(ssid); + if (!cred) { + on_failure(); + return; + } + + WiFi.mode(WIFI_STA); + WiFi.begin(ssid.c_str(), cred->password.c_str()); } void AutoConnectingActivity::checkConnectionStatus() { - const wl_status_t status = WiFi.status(); + const wl_status_t status = WiFi.status(); - if (status == WL_CONNECTED) { - on_success(); - return; - } + if (status == WL_CONNECTED) { + on_success(); + return; + } - if (status == WL_CONNECT_FAILED || status == WL_NO_SSID_AVAIL) { - on_failure(); - return; - } + if (status == WL_CONNECT_FAILED || status == WL_NO_SSID_AVAIL) { + on_failure(); + return; + } - if (millis() - connectionStartTime > CONNECTION_TIMEOUT_MS) { - WiFi.disconnect(); - on_failure(); - return; - } + if (millis() - connectionStartTime > CONNECTION_TIMEOUT_MS) { + WiFi.disconnect(); + on_failure(); + return; + } } void AutoConnectingActivity::render() const { - renderer.clearScreen(); - const auto pageHeight = renderer.getScreenHeight(); - const auto height = renderer.getLineHeight(UI_10_FONT_ID); - const auto top = (pageHeight - height) / 2; + renderer.clearScreen(); + const auto pageHeight = renderer.getScreenHeight(); + const auto height = renderer.getLineHeight(UI_10_FONT_ID); + const auto top = (pageHeight - height) / 2; - renderer.drawCenteredText(UI_12_FONT_ID, top - 40, "Connecting...", true, EpdFontFamily::BOLD); + renderer.drawCenteredText(UI_12_FONT_ID, top - 40, "Connecting...", true, EpdFontFamily::BOLD); - std::string ssidInfo = "to " + std::string(SETTINGS.lastConnectedSSID); - if (ssidInfo.length() > 25) { - ssidInfo.replace(22, ssidInfo.length() - 22, "..."); - } - renderer.drawCenteredText(UI_10_FONT_ID, top, ssidInfo.c_str()); - renderer.displayBuffer(); + std::string ssidInfo = "to " + std::string(SETTINGS.lastConnectedSSID); + if (ssidInfo.length() > 25) { + ssidInfo.replace(22, ssidInfo.length() - 22, "..."); + } + renderer.drawCenteredText(UI_10_FONT_ID, top, ssidInfo.c_str()); + renderer.displayBuffer(); } diff --git a/src/activities/network/AutoConnectingActivity.h b/src/activities/network/AutoConnectingActivity.h index 696fbebf..d745f25f 100644 --- a/src/activities/network/AutoConnectingActivity.h +++ b/src/activities/network/AutoConnectingActivity.h @@ -1,29 +1,26 @@ #pragma once -#include "activities/Activity.h" #include +#include "activities/Activity.h" + class AutoConnectingActivity final : public Activity { -public: - AutoConnectingActivity( - GfxRenderer& renderer, - MappedInputManager& mappedInput, - const std::function& on_success, - const std::function& on_failure - ); + public: + AutoConnectingActivity(GfxRenderer& renderer, MappedInputManager& mappedInput, + const std::function& on_success, const std::function& on_failure); - void onEnter() override; - void onExit() override; - void loop() override; + void onEnter() override; + void onExit() override; + void loop() override; -private: - void render() const; - void attemptConnection(); - void checkConnectionStatus(); + private: + void render() const; + void attemptConnection(); + void checkConnectionStatus(); - const std::function on_success; - const std::function on_failure; + const std::function on_success; + const std::function on_failure; - unsigned long connectionStartTime = 0; - static constexpr unsigned long CONNECTION_TIMEOUT_MS = 15000; + unsigned long connectionStartTime = 0; + static constexpr unsigned long CONNECTION_TIMEOUT_MS = 15000; }; diff --git a/src/activities/network/WifiSelectionActivity.cpp b/src/activities/network/WifiSelectionActivity.cpp index dc617c58..57464d54 100644 --- a/src/activities/network/WifiSelectionActivity.cpp +++ b/src/activities/network/WifiSelectionActivity.cpp @@ -6,11 +6,11 @@ #include #include +#include "CrossPointSettings.h" #include "MappedInputManager.h" #include "WifiCredentialStore.h" #include "activities/util/KeyboardEntryActivity.h" #include "fontIds.h" -#include "CrossPointSettings.h" void WifiSelectionActivity::taskTrampoline(void* param) { auto* self = static_cast(param); @@ -364,7 +364,7 @@ void WifiSelectionActivity::loop() { xSemaphoreGive(renderingMutex); // Update the network list to reflect the change const auto network = std::find_if(networks.begin(), networks.end(), - [this](const WifiNetworkInfo& net) { return net.ssid == selectedSSID; }); + [this](const WifiNetworkInfo& net) { return net.ssid == selectedSSID; }); if (network != networks.end()) { network->hasSavedPassword = false; } diff --git a/src/activities/settings/SettingsActivity.cpp b/src/activities/settings/SettingsActivity.cpp index c14ca9ea..1edec2b8 100644 --- a/src/activities/settings/SettingsActivity.cpp +++ b/src/activities/settings/SettingsActivity.cpp @@ -53,7 +53,9 @@ const SettingInfo systemSettings[systemSettingsCount] = { SettingInfo::Enum("Time to Sleep", &CrossPointSettings::sleepTimeout, {"1 min", "5 min", "10 min", "15 min", "30 min"}), SettingInfo::Action("Network"), - SettingInfo::Action("KOReader Sync"), SettingInfo::Action("OPDS Browser"), SettingInfo::Action("Clear Cache"), + SettingInfo::Action("KOReader Sync"), + SettingInfo::Action("OPDS Browser"), + SettingInfo::Action("Clear Cache"), SettingInfo::Action("Check for updates")}; } // namespace diff --git a/src/main.cpp b/src/main.cpp index 936c82a6..f3e7cd0b 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include @@ -20,14 +21,13 @@ #include "activities/browser/OpdsBookBrowserActivity.h" #include "activities/home/HomeActivity.h" #include "activities/home/MyLibraryActivity.h" +#include "activities/network/AutoConnectingActivity.h" #include "activities/network/CrossPointWebServerActivity.h" +#include "activities/network/WifiSelectionActivity.h" #include "activities/reader/ReaderActivity.h" #include "activities/settings/SettingsActivity.h" #include "activities/util/FullScreenMessageActivity.h" -#include "activities/network/AutoConnectingActivity.h" -#include "activities/network/WifiSelectionActivity.h" #include "fontIds.h" -#include HalDisplay display; HalGPIO gpio; @@ -214,7 +214,7 @@ void onGoToReader(const std::string& initialEpubPath, MyLibraryActivity::Tab fro } void onContinueReading() { onGoToReader(APP_STATE.openEpubPath, MyLibraryActivity::Tab::Recent); } -void onGoHome(); // forward declaration +void onGoHome(); // forward declaration void withWifi(std::function on_success) { if (WiFi.isConnected()) { From ead5c5ced495b0a764119bd970d49ac901a788ec Mon Sep 17 00:00:00 2001 From: Eliz Kilic Date: Sun, 1 Feb 2026 21:04:25 +0000 Subject: [PATCH 8/8] format --- src/WifiCredentialStore.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/WifiCredentialStore.cpp b/src/WifiCredentialStore.cpp index d7fec63e..c126cd92 100644 --- a/src/WifiCredentialStore.cpp +++ b/src/WifiCredentialStore.cpp @@ -1,10 +1,11 @@ #include "WifiCredentialStore.h" -#include #include #include #include +#include + // Initialize the static instance WifiCredentialStore WifiCredentialStore::instance; @@ -104,7 +105,7 @@ bool WifiCredentialStore::loadFromFile() { bool WifiCredentialStore::addCredential(const std::string& ssid, const std::string& password) { // Check if this SSID already exists and update it auto cred = std::find_if(credentials.begin(), credentials.end(), - [&ssid](const WifiCredential& cred) { return cred.ssid == ssid; }); + [&ssid](const WifiCredential& cred) { return cred.ssid == ssid; }); if (cred != credentials.end()) { cred->password = password; Serial.printf("[%lu] [WCS] Updated credentials for: %s\n", millis(), ssid.c_str()); @@ -125,7 +126,7 @@ bool WifiCredentialStore::addCredential(const std::string& ssid, const std::stri bool WifiCredentialStore::removeCredential(const std::string& ssid) { auto cred = std::find_if(credentials.begin(), credentials.end(), - [&ssid](const WifiCredential& cred) { return cred.ssid == ssid; }); + [&ssid](const WifiCredential& cred) { return cred.ssid == ssid; }); if (cred != credentials.end()) { credentials.erase(cred); Serial.printf("[%lu] [WCS] Removed credentials for: %s\n", millis(), ssid.c_str()); @@ -136,7 +137,7 @@ bool WifiCredentialStore::removeCredential(const std::string& ssid) { const WifiCredential* WifiCredentialStore::findCredential(const std::string& ssid) const { auto cred = std::find_if(credentials.begin(), credentials.end(), - [&ssid](const WifiCredential& cred) { return cred.ssid == ssid; }); + [&ssid](const WifiCredential& cred) { return cred.ssid == ssid; }); if (cred != credentials.end()) { return &*cred;