From f595187862b6a1ff009e072e12f99957f73296a1 Mon Sep 17 00:00:00 2001 From: Ricky1207-sen Date: Mon, 8 Jun 2026 22:11:25 +0530 Subject: [PATCH 1/2] feat(moneo): add WiFi manager with auto network selection --- moneo/WiFiManager.cpp | 78 +++++++++++++++++++++++++++++++++++++++++++ moneo/WiFiManager.h | 33 ++++++++++++++++++ 2 files changed, 111 insertions(+) create mode 100644 moneo/WiFiManager.cpp create mode 100644 moneo/WiFiManager.h diff --git a/moneo/WiFiManager.cpp b/moneo/WiFiManager.cpp new file mode 100644 index 0000000..ebaf270 --- /dev/null +++ b/moneo/WiFiManager.cpp @@ -0,0 +1,78 @@ +#include "WiFiManager.h" + +// Add your networks here — the device scans and connects to the first available. +// Do NOT commit real credentials; replace these placeholders with your own locally. +const char* WIFI_NETWORKS[WIFI_NETWORK_COUNT][2] = { + { "YOUR_WIFI_SSID", "YOUR_WIFI_PASSWORD" }, + { "SECOND_WIFI_SSID", "SECOND_WIFI_PASSWORD" }, // e.g. laptop hotspot +}; + +WiFiManager::WiFiManager() : _lastReconnectAttempt(0) {} + +bool WiFiManager::connect() { + // Try last known network first (from NVS) + String lastSSID, lastPass; + _loadLastNetwork(lastSSID, lastPass); + + if (lastSSID.length() > 0) { + DLOGF("[WiFi] Trying last known: %s\n", lastSSID.c_str()); + if (_tryNetwork(lastSSID.c_str(), lastPass.c_str())) return true; + } + + // Scan and try all configured networks + DLOG("[WiFi] Scanning for known networks..."); + int found = WiFi.scanNetworks(); + + for (int i = 0; i < WIFI_NETWORK_COUNT; i++) { + for (int j = 0; j < found; j++) { + if (WiFi.SSID(j) == String(WIFI_NETWORKS[i][0])) { + DLOGF("[WiFi] Found: %s\n", WIFI_NETWORKS[i][0]); + if (_tryNetwork(WIFI_NETWORKS[i][0], WIFI_NETWORKS[i][1])) { + _saveLastNetwork(WIFI_NETWORKS[i][0], WIFI_NETWORKS[i][1]); + return true; + } + } + } + } + + DLOG("[WiFi] No known network found."); + return false; +} + +bool WiFiManager::ensureConnected() { + if (isConnected()) return true; + unsigned long now = millis(); + if (now - _lastReconnectAttempt < WIFI_RECONNECT_INTERVAL) return false; + _lastReconnectAttempt = now; + return connect(); +} + +bool WiFiManager::_tryNetwork(const char* ssid, const char* password) { + WiFi.begin(ssid, password); + unsigned long start = millis(); + while (WiFi.status() != WL_CONNECTED && + millis() - start < WIFI_CONNECT_TIMEOUT_MS) { + delay(300); + } + if (WiFi.status() == WL_CONNECTED) { + DLOGF("[WiFi] Connected to %s — IP: %s\n", ssid, + WiFi.localIP().toString().c_str()); + return true; + } + WiFi.disconnect(); + return false; +} + +void WiFiManager::_saveLastNetwork(const char* ssid, const char* password) { + _prefs.begin("moneo_wifi", false); + _prefs.putString("ssid", ssid); + _prefs.putString("pass", password); + _prefs.end(); +} + +void WiFiManager::_loadLastNetwork(String& ssid, String& password) { + _prefs.begin("moneo_wifi", true); + ssid = _prefs.getString("ssid", ""); + password = _prefs.getString("pass", ""); + _prefs.end(); +} diff --git a/moneo/WiFiManager.h b/moneo/WiFiManager.h new file mode 100644 index 0000000..53aa285 --- /dev/null +++ b/moneo/WiFiManager.h @@ -0,0 +1,33 @@ +#ifndef WiFiManager_h +#define WiFiManager_h + +#include +#include +#include +#include "Config.h" + +// ============================================================ +// WiFiManager — Auto-connects to known networks. +// Uses NVS (Preferences) to remember last connected network. +// Tries last known first, then scans all configured networks. +// ============================================================ + +class WiFiManager { +public: + WiFiManager(); + bool connect(); + bool isConnected() const { return WiFi.status() == WL_CONNECTED; } + bool ensureConnected(); + String currentSSID() const { return WiFi.SSID(); } + String localIP() const { return WiFi.localIP().toString(); } + +private: + bool _tryNetwork(const char* ssid, const char* password); + void _saveLastNetwork(const char* ssid, const char* password); + void _loadLastNetwork(String& ssid, String& password); + + Preferences _prefs; + unsigned long _lastReconnectAttempt; +}; + +#endif From 31be29c43706dba9a697da749000573a79094d8f Mon Sep 17 00:00:00 2001 From: Ricky1207-sen Date: Tue, 9 Jun 2026 10:48:47 +0530 Subject: [PATCH 2/2] refactor(moneo): drive WiFi match by known list; use moneo_runtime NVS namespace --- moneo/WiFiManager.cpp | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/moneo/WiFiManager.cpp b/moneo/WiFiManager.cpp index ebaf270..70a9793 100644 --- a/moneo/WiFiManager.cpp +++ b/moneo/WiFiManager.cpp @@ -23,16 +23,23 @@ bool WiFiManager::connect() { DLOG("[WiFi] Scanning for known networks..."); int found = WiFi.scanNetworks(); + // Iterate over our known networks (priority order), not the scan list. + // Cost scales with the few provisioned networks, not the many nearby ones. for (int i = 0; i < WIFI_NETWORK_COUNT; i++) { + bool available = false; for (int j = 0; j < found; j++) { if (WiFi.SSID(j) == String(WIFI_NETWORKS[i][0])) { - DLOGF("[WiFi] Found: %s\n", WIFI_NETWORKS[i][0]); - if (_tryNetwork(WIFI_NETWORKS[i][0], WIFI_NETWORKS[i][1])) { - _saveLastNetwork(WIFI_NETWORKS[i][0], WIFI_NETWORKS[i][1]); - return true; - } + available = true; + break; // this known network is in range — stop scanning for it } } + if (!available) continue; + + DLOGF("[WiFi] Found: %s\n", WIFI_NETWORKS[i][0]); + if (_tryNetwork(WIFI_NETWORKS[i][0], WIFI_NETWORKS[i][1])) { + _saveLastNetwork(WIFI_NETWORKS[i][0], WIFI_NETWORKS[i][1]); + return true; + } } DLOG("[WiFi] No known network found."); @@ -64,14 +71,16 @@ bool WiFiManager::_tryNetwork(const char* ssid, const char* password) { } void WiFiManager::_saveLastNetwork(const char* ssid, const char* password) { - _prefs.begin("moneo_wifi", false); + // Runtime state managed by the firmware (last connected network, future: + // last file synced, etc.) — kept separate from the provisioned network list. + _prefs.begin("moneo_runtime", false); _prefs.putString("ssid", ssid); _prefs.putString("pass", password); _prefs.end(); } void WiFiManager::_loadLastNetwork(String& ssid, String& password) { - _prefs.begin("moneo_wifi", true); + _prefs.begin("moneo_runtime", true); ssid = _prefs.getString("ssid", ""); password = _prefs.getString("pass", ""); _prefs.end();