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
This commit is contained in:
Shawn A
2018-02-24 08:40:01 -06:00
parent 7b4fd38b6b
commit d0ed01433d
2 changed files with 31 additions and 5 deletions
+25 -4
View File
@@ -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
+6 -1
View File
@@ -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);