diff --git a/WiFiManager.cpp b/WiFiManager.cpp index 127c9d3..1b08301 100644 --- a/WiFiManager.cpp +++ b/WiFiManager.cpp @@ -53,7 +53,7 @@ void WiFiManager::setupConfigPortal() { server.reset(new ESP8266WebServer(80)); DEBUG_WM(F("")); - start = millis(); + _configPortalStart = millis(); DEBUG_WM(F("Configuring access point... ")); DEBUG_WM(_apName); @@ -143,7 +143,7 @@ boolean WiFiManager::startConfigPortal(char const *apName, char const *apPasswo connect = false; setupConfigPortal(); - while (timeout == 0 || millis() < start + timeout) { + while (_configPortalTimeout == 0 || millis() < _configPortalStart + _configPortalTimeout) { //DNS dnsServer->processNextRequest(); //HTTP @@ -207,18 +207,41 @@ int WiFiManager::connectWifi(String ssid, String pass) { WiFi.begin(); } - int connRes = WiFi.waitForConnectResult(); + int connRes = waitForConnectResult(); DEBUG_WM ("Connection result: "); DEBUG_WM ( connRes ); //not connected, WPS enabled, no pass - first attempt if (_tryWPS && connRes != WL_CONNECTED && pass == "") { startWPS(); //should be connected at the end of WPS - connRes = WiFi.waitForConnectResult(); + connRes = waitForConnectResult(); } return connRes; } +uint8_t WiFiManager::waitForConnectResult() { + if (_connectTimeout == 0) { + return WiFi.waitForConnectResult(); + } else { + DEBUG_WM (F("Waiting for connection result with timed out")); + unsigned long start = millis(); + boolean keepConnecting = true; + uint8_t status; + while (keepConnecting) { + status = WiFi.status(); + if (millis() > start + _connectTimeout) { + keepConnecting = false; + DEBUG_WM (F("Connection timed out")); + } + if (status == WL_CONNECTED || status == WL_CONNECT_FAILED) { + keepConnecting = false; + } + delay(100); + } + return status; + } +} + void WiFiManager::startWPS() { DEBUG_WM("START WPS"); WiFi.beginWPSConfig(); @@ -255,9 +278,16 @@ void WiFiManager::resetSettings() { WiFi.disconnect(true); //delay(200); } - void WiFiManager::setTimeout(unsigned long seconds) { - timeout = seconds * 1000; + setConfigPortalTimeout(seconds); +} + +void WiFiManager::setConfigPortalTimeout(unsigned long seconds) { + _configPortalTimeout = seconds * 1000; +} + +void WiFiManager::setConnectTimeout(unsigned long seconds) { + _connectTimeout = seconds * 1000; } void WiFiManager::setDebugOutput(boolean debug) { diff --git a/WiFiManager.h b/WiFiManager.h index 24d037f..0e0da98 100644 --- a/WiFiManager.h +++ b/WiFiManager.h @@ -66,9 +66,6 @@ class WiFiManager //if you want to always start the config portal, without trying to connect first boolean startConfigPortal(char const *apName, char const *apPassword = NULL); - //String getSSID(); - //String getPassword(); - // get the AP name of the config portal, so it can be used in the callback String getConfigPortalSSID(); @@ -76,8 +73,14 @@ class WiFiManager //sets timeout before webserver loop ends and exits even if there has been no setup. //usefully for devices that failed to connect at some point and got stuck in a webserver loop - //in seconds + //in seconds setConfigPortalTimeout is a new name for setTimeout + void setConfigPortalTimeout(unsigned long seconds); void setTimeout(unsigned long seconds); + + //sets timeout for which to attempt connecting, usefull if you get a lot of failed connects + void setConnectTimeout(unsigned long seconds); + + void setDebugOutput(boolean debug); //defaults to not showing anything under 8% signal quality if called void setMinimumSignalQuality(int quality = 8); @@ -111,8 +114,9 @@ class WiFiManager const char* _apPassword = NULL; String _ssid = ""; String _pass = ""; - unsigned long timeout = 0; - unsigned long start = 0; + unsigned long _configPortalTimeout = 0; + unsigned long _connectTimeout = 0; + unsigned long _configPortalStart = 0; IPAddress _ap_static_ip; IPAddress _ap_static_gw; @@ -131,6 +135,7 @@ class WiFiManager int status = WL_IDLE_STATUS; int connectWifi(String ssid, String pass); + uint8_t waitForConnectResult(); void handleRoot(); void handleWifi(boolean scan); @@ -140,7 +145,7 @@ class WiFiManager void handleNotFound(); void handle204(); boolean captivePortal(); - + // DNS server const byte DNS_PORT = 53;