From e85c35dfa6872e4913b95b4218cbb29e61f8b1c9 Mon Sep 17 00:00:00 2001 From: Riccardo Rizzo Date: Fri, 1 Feb 2019 09:45:22 +0100 Subject: [PATCH] Add WiFiClass::setTimeout(...) API's to set timeout of begin Added timeout logic check on WiFiClass's begin API Porting of https://github.com/arduino-libraries/WiFiNINA/pull/46 --- keywords.txt | 1 + src/WiFi.cpp | 32 ++++++++++++++++++++------------ src/WiFi101.h | 2 ++ 3 files changed, 23 insertions(+), 12 deletions(-) diff --git a/keywords.txt b/keywords.txt index 498954d0..aa3e7099 100755 --- a/keywords.txt +++ b/keywords.txt @@ -54,6 +54,7 @@ WiFiMDNSResponder KEYWORD2 lowPowerMode KEYWORD2 maxLowPowerMode KEYWORD2 noLowPowerMode KEYWORD2 +setTimeout KEYWORD2 ####################################### # Constants (LITERAL1) diff --git a/src/WiFi.cpp b/src/WiFi.cpp index 3f3f56b7..82c6a0be 100644 --- a/src/WiFi.cpp +++ b/src/WiFi.cpp @@ -260,11 +260,12 @@ void WiFiClass::handlePingResponse(uint32 u32IPAddr, uint32 u32RTT, uint8 u8Erro } } -WiFiClass::WiFiClass() +WiFiClass::WiFiClass() : + _init(0), + _mode(WL_RESET_MODE), + _status(WL_NO_SHIELD), + _timeout(60000) { - _mode = WL_RESET_MODE; - _status = WL_NO_SHIELD; - _init = 0; } void WiFiClass::setPins(int8_t cs, int8_t irq, int8_t rst, int8_t en) @@ -377,11 +378,12 @@ uint8_t WiFiClass::begin() _mode = WL_STA_MODE; // Wait for connection or timeout: - unsigned long start = millis(); - while (!(_status & WL_CONNECTED) && - !(_status & WL_DISCONNECTED) && - millis() - start < 60000) { + for (unsigned long start = millis(); millis() - start < _timeout;) + { m2m_wifi_handle_events(NULL); + if ((_status & WL_CONNECTED) || (_status & WL_DISCONNECTED)) { + break; + } } memset(_ssid, 0, M2M_MAX_SSID_LEN); @@ -438,11 +440,12 @@ uint8_t WiFiClass::startConnect(const char *ssid, uint8_t u8SecType, const void _mode = WL_STA_MODE; // Wait for connection or timeout: - unsigned long start = millis(); - while (!(_status & WL_CONNECTED) && - !(_status & WL_DISCONNECTED) && - millis() - start < 60000) { + for (unsigned long start = millis(); millis() - start < _timeout;) + { m2m_wifi_handle_events(NULL); + if ((_status & WL_CONNECTED) || (_status & WL_DISCONNECTED)) { + break; + } } if (!(_status & WL_CONNECTED)) { _mode = WL_RESET_MODE; @@ -1166,4 +1169,9 @@ uint32_t WiFiClass::getTime() #endif } +void WiFiClass::setTimeout(unsigned long timeout) +{ + _timeout = timeout; +} + WiFiClass WiFi; diff --git a/src/WiFi101.h b/src/WiFi101.h index 734b2116..37e645c9 100644 --- a/src/WiFi101.h +++ b/src/WiFi101.h @@ -165,6 +165,7 @@ class WiFiClass void handleEvent(uint8_t u8MsgType, void *pvMsg); void handleResolve(uint8_t * hostName, uint32_t hostIp); void handlePingResponse(uint32 u32IPAddr, uint32 u32RTT, uint8 u8ErrorCode); + void setTimeout(unsigned long timeout); private: int _init; @@ -182,6 +183,7 @@ class WiFiClass uint8_t _scan_auth; uint8_t _scan_channel; char _ssid[M2M_MAX_SSID_LEN]; + unsigned long _timeout; uint8_t startConnect(const char *ssid, uint8_t u8SecType, const void *pvAuthInfo); uint8_t startAP(const char *ssid, uint8_t u8SecType, const void *pvAuthInfo, uint8_t channel);