From d0ed01433d39e7bedd7f96a6defcde480e58b178 Mon Sep 17 00:00:00 2001 From: Shawn A Date: Sat, 24 Feb 2018 08:40:01 -0600 Subject: [PATCH] add wifiscan preloading with cache This uses core scan object and assumes its lifetime, I am not sure what the scope is or how long it lives, will have to convert to local copy if its being lost, caching for 60s after startweb portal and 10s after root load, refresh bypasses cache --- WiFiManager.cpp | 29 +++++++++++++++++++++++++---- WiFiManager.h | 7 ++++++- 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/WiFiManager.cpp b/WiFiManager.cpp index f6a6b88..d720a42 100644 --- a/WiFiManager.cpp +++ b/WiFiManager.cpp @@ -372,6 +372,8 @@ void WiFiManager::setupConfigPortal() { server->begin(); // Web server start DEBUG_WM(F("HTTP server started")); + + WiFi_scanNetworks(); // preload wifiscan } boolean WiFiManager::startConfigPortal() { @@ -696,7 +698,8 @@ void WiFiManager::handleRoot() { server->sendHeader(FPSTR(HTTP_HEAD_CL), String(page.length())); server->send(200, FPSTR(HTTP_HEAD_CT), page); - // server->close(); // testing reliability fix for content length mismatches during mutiple flood hits + // server->close(); // testing reliability fix for content length mismatches during mutiple flood hits WiFi_scanNetworks(); // preload wifiscan + WiFi_scanNetworks(10000); // preload wifiscan throttled } /** @@ -707,6 +710,7 @@ void WiFiManager::handleWifi(boolean scan) { handleRequest(); String page = getHTTPHead(FPSTR(S_titlewifi)); // @token titlewifi if (scan) { + if(server->hasArg(F("refresh"))) WiFi_scanNetworks(true); // preload wifiscan, force page += getScanItemOut(); } String pitem = ""; @@ -775,11 +779,28 @@ String WiFiManager::getMenuOut(){ return page; } -String WiFiManager::getScanItemOut(){ +bool WiFiManager::WiFi_scanNetworks(){ + return WiFi_scanNetworks(false); +} +bool WiFiManager::WiFi_scanNetworks(int cachetime){ + return WiFi_scanNetworks(millis()-_lastscan > cachetime); +} +bool WiFiManager::WiFi_scanNetworks(bool force){ + DEBUG_WM(_numNetworks,(millis()-_lastscan )); + if(force || _numNetworks == 0 || (millis()-_lastscan > 60000)){ + _numNetworks = WiFi.scanNetworks(); + _lastscan = millis(); + DEBUG_WM(F("Scan done")); + return true; + } else DEBUG_WM("Scan is cached"); + return false; +} + +String WiFiManager::WiFiManager::getScanItemOut(){ String page; - int n = WiFi.scanNetworks(); - DEBUG_WM(F("Scan done")); + int n = _numNetworks; + WiFi_scanNetworks(); if (n == 0) { DEBUG_WM(F("No networks found")); page += FPSTR(S_nonetworks); // @token nonetworks diff --git a/WiFiManager.h b/WiFiManager.h index 438f004..4571c52 100644 --- a/WiFiManager.h +++ b/WiFiManager.h @@ -245,7 +245,9 @@ class WiFiManager WiFiMode_t _usermode = WIFI_OFF; String _wifissidprefix = FPSTR(S_ssidpre); // auto apname prefix prefix+chipid uint8_t _lastconxresult = WL_IDLE_STATUS; - + int _numNetworks = 0; + unsigned long _lastscan = 0; // ms + #ifdef ESP32 static uint8_t _lastconxresulttmp; // tmp var for esp32 callback #endif @@ -312,6 +314,9 @@ class WiFiManager bool WiFi_hasAutoConnect(); void WiFi_autoReconnect(); String WiFi_SSID(); + bool WiFi_scanNetworks(); + bool WiFi_scanNetworks(bool force); + bool WiFi_scanNetworks(int cachetime); #ifdef ESP32 static void WiFiEvent(WiFiEvent_t event, system_event_info_t info);