From bb2fb7da2b4ab2e95f77eb30296b33b432e48784 Mon Sep 17 00:00:00 2001 From: Alexander Entinger Date: Wed, 20 Mar 2019 06:41:03 +0100 Subject: [PATCH 1/7] Separating WiFiConnectionManager definition/implementation in a h/cpp file --- src/WiFiConnectionManager.cpp | 174 ++++++++++++++++++++++++++++++++++ src/WiFiConnectionManager.h | 145 ++-------------------------- 2 files changed, 183 insertions(+), 136 deletions(-) create mode 100644 src/WiFiConnectionManager.cpp diff --git a/src/WiFiConnectionManager.cpp b/src/WiFiConnectionManager.cpp new file mode 100644 index 00000000000..b819a2d13ee --- /dev/null +++ b/src/WiFiConnectionManager.cpp @@ -0,0 +1,174 @@ +/* + * This file is part of ArduinoIoTCloud. + * + * Copyright 2019 ARDUINO SA (http://www.arduino.cc/) + * + * This software is released under the GNU General Public License version 3, + * which covers the main part of arduino-cli. + * The terms of this license can be found at: + * https://www.gnu.org/licenses/gpl-3.0.en.html + * + * You can be released from the requirements of the above licenses by purchasing + * a commercial license. Buying such a license is mandatory if you want to modify or + * otherwise use the software for commercial activities involving the Arduino + * software without disclosing the source code of your own applications. To purchase + * a commercial license, send an email to license@arduino.cc. + */ + +/****************************************************************************** + * INCLUDE + ******************************************************************************/ + +#include "WiFiConnectionManager.h" + +/****************************************************************************** + * CONSTANTS + ******************************************************************************/ + +static const unsigned long NETWORK_CONNECTION_INTERVAL = 30000; + +/****************************************************************************** + * CTOR/DTOR + ******************************************************************************/ + +WiFiConnectionManager::WiFiConnectionManager(const char *ssid, const char *pass) : + ssid(ssid), + pass(pass), + lastConnectionTickTime(millis()), + connectionTickTimeInterval(CHECK_INTERVAL_IDLE), + getTimeRetries(MAX_GETTIME_RETRIES) { +} + +/****************************************************************************** + * PUBLIC MEMBER FUNCTIONS + ******************************************************************************/ + +void WiFiConnectionManager::init() { +} + +unsigned long WiFiConnectionManager::getTime() { + return WiFi.getTime(); +} + +void WiFiConnectionManager::check() { + char msgBuffer[120]; + unsigned long const now = millis(); + int networkStatus = 0; + if (now - lastConnectionTickTime > connectionTickTimeInterval) { + switch (netConnectionState) { + case CONNECTION_STATE_INIT: + networkStatus = WiFi.status(); + sprintf(msgBuffer, "WiFi.status(): %d", networkStatus); + debugMessage(msgBuffer, 2); + if (networkStatus == NETWORK_HARDWARE_ERROR) { + // NO FURTHER ACTION WILL FOLLOW THIS + changeConnectionState(CONNECTION_STATE_ERROR); + lastConnectionTickTime = now; + return; + } + sprintf(msgBuffer, "Current WiFi Firmware: %s", WiFi.firmwareVersion()); + debugMessage(msgBuffer, 0); + if(WiFi.firmwareVersion() < WIFI_FIRMWARE_VERSION_REQUIRED){ + sprintf(msgBuffer, "Latest WiFi Firmware: %s", WIFI_FIRMWARE_VERSION_REQUIRED); + debugMessage(msgBuffer, 0); + debugMessage("Please update to the latest version for best performance.", 0); + delay(5000); + } + changeConnectionState(CONNECTION_STATE_CONNECTING); + break; + case CONNECTION_STATE_CONNECTING: + networkStatus = WiFi.begin(ssid, pass); + sprintf(msgBuffer, "WiFi.status(): %d", networkStatus); + debugMessage(msgBuffer, 4); + if (networkStatus != NETWORK_CONNECTED) { + sprintf(msgBuffer, "Connection to \"%s\" failed", ssid); + debugMessage(msgBuffer, 0); + sprintf(msgBuffer, "Retrying in \"%d\" milliseconds", connectionTickTimeInterval); + debugMessage(msgBuffer, 2); + //changeConnectionState(CONNECTION_STATE_CONNECTING); + return; + } else { + sprintf(msgBuffer, "Connected to \"%s\"", ssid); + debugMessage(msgBuffer, 2); + changeConnectionState(CONNECTION_STATE_GETTIME); + return; + } + break; + case CONNECTION_STATE_GETTIME: + unsigned long networkTime; + networkTime = getTime(); + debugMessage(".", 3, false, false); + if(networkTime > lastValidTimestamp){ + debugMessage("", 3, false, true); + lastValidTimestamp = networkTime; + sprintf(msgBuffer, "Network Time: %u", networkTime); + debugMessage(msgBuffer, 3); + changeConnectionState(CONNECTION_STATE_CONNECTED); + } else if (WiFi.status() != WL_CONNECTED) { + changeConnectionState(CONNECTION_STATE_DISCONNECTED); + } else if (!getTimeRetries--) { + changeConnectionState(CONNECTION_STATE_DISCONNECTED); + } + break; + case CONNECTION_STATE_CONNECTED: + // keep testing connection + networkStatus = WiFi.status(); + sprintf(msgBuffer, "WiFi.status(): %d", networkStatus); + debugMessage(msgBuffer, 4); + if (networkStatus != WL_CONNECTED) { + changeConnectionState(CONNECTION_STATE_DISCONNECTED); + return; + } + sprintf(msgBuffer, "Connected to \"%s\"", ssid); + debugMessage(msgBuffer, 4); + break; + case CONNECTION_STATE_DISCONNECTED: + WiFi.end(); + changeConnectionState(CONNECTION_STATE_CONNECTING); + break; + } + lastConnectionTickTime = now; + } +} + +/****************************************************************************** + * PRIVATE MEMBER FUNCTIONS + ******************************************************************************/ + +void WiFiConnectionManager::changeConnectionState(NetworkConnectionState _newState) { + char msgBuffer[120]; + int newInterval = CHECK_INTERVAL_INIT; + switch (_newState) { + case CONNECTION_STATE_INIT: + newInterval = CHECK_INTERVAL_INIT; + break; + case CONNECTION_STATE_CONNECTING: + sprintf(msgBuffer, "Connecting to \"%s\"", ssid); + debugMessage(msgBuffer, 2); + newInterval = CHECK_INTERVAL_CONNECTING; + break; + case CONNECTION_STATE_GETTIME: + newInterval = CHECK_INTERVAL_GETTIME; + debugMessage("Acquiring Time from Network", 3); + getTimeRetries = MAX_GETTIME_RETRIES; + break; + case CONNECTION_STATE_CONNECTED: + newInterval = CHECK_INTERVAL_CONNECTED; + break; + case CONNECTION_STATE_DISCONNECTED: + sprintf(msgBuffer, "WiFi.status(): %d", WiFi.status()); + debugMessage(msgBuffer, 4); + sprintf(msgBuffer, "Connection to \"%s\" lost.", ssid); + debugMessage(msgBuffer, 0); + debugMessage("Attempting reconnection", 0); + newInterval = CHECK_INTERVAL_DISCONNECTED; + break; + case CONNECTION_STATE_ERROR: + debugMessage("WiFi Hardware failure.\nMake sure you are using a WiFi enabled board/shield.", 0); + debugMessage("Then reset and retry.", 0); + break; + } + connectionTickTimeInterval = newInterval; + lastConnectionTickTime = millis(); + netConnectionState = _newState; +} diff --git a/src/WiFiConnectionManager.h b/src/WiFiConnectionManager.h index c9915e3343c..aaa4d964fbd 100644 --- a/src/WiFiConnectionManager.h +++ b/src/WiFiConnectionManager.h @@ -15,15 +15,23 @@ * a commercial license, send an email to license@arduino.cc. */ +/****************************************************************************** + * INCLUDE + ******************************************************************************/ + #include "ConnectionManager.h" #include +/****************************************************************************** + * CLASS DECLARATION + ******************************************************************************/ + class WiFiConnectionManager : public ConnectionManager { public: WiFiConnectionManager(const char *ssid, const char *pass); - virtual unsigned long getTime(); virtual void init(); + virtual unsigned long getTime(); virtual void check(); virtual Client &getClient() { return wifiClient; }; virtual UDP &getUDP() { return udp; }; @@ -52,138 +60,3 @@ class WiFiConnectionManager : public ConnectionManager { WiFiClient wifiClient; int connectionTickTimeInterval; }; - -static const unsigned long NETWORK_CONNECTION_INTERVAL = 30000; - -WiFiConnectionManager::WiFiConnectionManager(const char *ssid, const char *pass) : - ssid(ssid), pass(pass), - lastConnectionTickTime(millis()), - connectionTickTimeInterval(CHECK_INTERVAL_IDLE), - getTimeRetries(MAX_GETTIME_RETRIES) { -} - -unsigned long WiFiConnectionManager::getTime() { - return WiFi.getTime(); -} - -void WiFiConnectionManager::init() { -} - -void WiFiConnectionManager::changeConnectionState(NetworkConnectionState _newState) { - char msgBuffer[120]; - int newInterval = CHECK_INTERVAL_INIT; - switch (_newState) { - case CONNECTION_STATE_INIT: - newInterval = CHECK_INTERVAL_INIT; - break; - case CONNECTION_STATE_CONNECTING: - sprintf(msgBuffer, "Connecting to \"%s\"", ssid); - debugMessage(msgBuffer, 2); - newInterval = CHECK_INTERVAL_CONNECTING; - break; - case CONNECTION_STATE_GETTIME: - newInterval = CHECK_INTERVAL_GETTIME; - debugMessage("Acquiring Time from Network", 3); - getTimeRetries = MAX_GETTIME_RETRIES; - break; - case CONNECTION_STATE_CONNECTED: - newInterval = CHECK_INTERVAL_CONNECTED; - break; - case CONNECTION_STATE_DISCONNECTED: - sprintf(msgBuffer, "WiFi.status(): %d", WiFi.status()); - debugMessage(msgBuffer, 4); - sprintf(msgBuffer, "Connection to \"%s\" lost.", ssid); - debugMessage(msgBuffer, 0); - debugMessage("Attempting reconnection", 0); - newInterval = CHECK_INTERVAL_DISCONNECTED; - break; - case CONNECTION_STATE_ERROR: - debugMessage("WiFi Hardware failure.\nMake sure you are using a WiFi enabled board/shield.", 0); - debugMessage("Then reset and retry.", 0); - break; - } - connectionTickTimeInterval = newInterval; - lastConnectionTickTime = millis(); - netConnectionState = _newState; -} - -void WiFiConnectionManager::check() { - char msgBuffer[120]; - unsigned long const now = millis(); - int networkStatus = 0; - if (now - lastConnectionTickTime > connectionTickTimeInterval) { - switch (netConnectionState) { - case CONNECTION_STATE_INIT: - networkStatus = WiFi.status(); - sprintf(msgBuffer, "WiFi.status(): %d", networkStatus); - debugMessage(msgBuffer, 2); - if (networkStatus == NETWORK_HARDWARE_ERROR) { - // NO FURTHER ACTION WILL FOLLOW THIS - changeConnectionState(CONNECTION_STATE_ERROR); - lastConnectionTickTime = now; - return; - } - sprintf(msgBuffer, "Current WiFi Firmware: %s", WiFi.firmwareVersion()); - debugMessage(msgBuffer, 0); - if(WiFi.firmwareVersion() < WIFI_FIRMWARE_VERSION_REQUIRED){ - sprintf(msgBuffer, "Latest WiFi Firmware: %s", WIFI_FIRMWARE_VERSION_REQUIRED); - debugMessage(msgBuffer, 0); - debugMessage("Please update to the latest version for best performance.", 0); - delay(5000); - } - changeConnectionState(CONNECTION_STATE_CONNECTING); - break; - case CONNECTION_STATE_CONNECTING: - networkStatus = WiFi.begin(ssid, pass); - sprintf(msgBuffer, "WiFi.status(): %d", networkStatus); - debugMessage(msgBuffer, 4); - if (networkStatus != NETWORK_CONNECTED) { - sprintf(msgBuffer, "Connection to \"%s\" failed", ssid); - debugMessage(msgBuffer, 0); - sprintf(msgBuffer, "Retrying in \"%d\" milliseconds", connectionTickTimeInterval); - debugMessage(msgBuffer, 2); - //changeConnectionState(CONNECTION_STATE_CONNECTING); - return; - } else { - sprintf(msgBuffer, "Connected to \"%s\"", ssid); - debugMessage(msgBuffer, 2); - changeConnectionState(CONNECTION_STATE_GETTIME); - return; - } - break; - case CONNECTION_STATE_GETTIME: - unsigned long networkTime; - networkTime = getTime(); - debugMessage(".", 3, false, false); - if(networkTime > lastValidTimestamp){ - debugMessage("", 3, false, true); - lastValidTimestamp = networkTime; - sprintf(msgBuffer, "Network Time: %u", networkTime); - debugMessage(msgBuffer, 3); - changeConnectionState(CONNECTION_STATE_CONNECTED); - } else if (WiFi.status() != WL_CONNECTED) { - changeConnectionState(CONNECTION_STATE_DISCONNECTED); - } else if (!getTimeRetries--) { - changeConnectionState(CONNECTION_STATE_DISCONNECTED); - } - break; - case CONNECTION_STATE_CONNECTED: - // keep testing connection - networkStatus = WiFi.status(); - sprintf(msgBuffer, "WiFi.status(): %d", networkStatus); - debugMessage(msgBuffer, 4); - if (networkStatus != WL_CONNECTED) { - changeConnectionState(CONNECTION_STATE_DISCONNECTED); - return; - } - sprintf(msgBuffer, "Connected to \"%s\"", ssid); - debugMessage(msgBuffer, 4); - break; - case CONNECTION_STATE_DISCONNECTED: - WiFi.end(); - changeConnectionState(CONNECTION_STATE_CONNECTING); - break; - } - lastConnectionTickTime = now; - } -} From b141195c2ef783a982e7c7a27e3f38e15df17f08 Mon Sep 17 00:00:00 2001 From: Alexander Entinger Date: Wed, 20 Mar 2019 06:48:27 +0100 Subject: [PATCH 2/7] Separating GSMConnectionManager definition/implementation in a h/cpp file --- src/GSMConnectionManager.cpp | 177 +++++++++++++++++++++++++++++++++++ src/GSMConnectionManager.h | 149 ++--------------------------- 2 files changed, 186 insertions(+), 140 deletions(-) create mode 100644 src/GSMConnectionManager.cpp diff --git a/src/GSMConnectionManager.cpp b/src/GSMConnectionManager.cpp new file mode 100644 index 00000000000..10e3a55c16e --- /dev/null +++ b/src/GSMConnectionManager.cpp @@ -0,0 +1,177 @@ +/* + * This file is part of ArduinoIoTCloud. + * + * Copyright 2019 ARDUINO SA (http://www.arduino.cc/) + * + * This software is released under the GNU General Public License version 3, + * which covers the main part of arduino-cli. + * The terms of this license can be found at: + * https://www.gnu.org/licenses/gpl-3.0.en.html + * + * You can be released from the requirements of the above licenses by purchasing + * a commercial license. Buying such a license is mandatory if you want to modify or + * otherwise use the software for commercial activities involving the Arduino + * software without disclosing the source code of your own applications. To purchase + * a commercial license, send an email to license@arduino.cc. + */ + +/****************************************************************************** + * INCLUDE + ******************************************************************************/ + +#include "GSMConnectionManager.h" + +/****************************************************************************** + * CONSTANTS + ******************************************************************************/ + +static const unsigned long NETWORK_CONNECTION_INTERVAL = 30000; + +/****************************************************************************** + * CTOR/DTOR + ******************************************************************************/ + +GSMConnectionManager::GSMConnectionManager(const char *pin, const char *apn, const char *login, const char *pass) : + pin(pin), + apn(apn), + login(login), + pass(pass), + lastConnectionTickTime(millis()), + connectionTickTimeInterval(CHECK_INTERVAL_IDLE), + getTimeRetries(MAX_GETTIME_RETRIES) { +} + +/****************************************************************************** + * PUBLIC MEMBER FUNCTIONS + ******************************************************************************/ + +void GSMConnectionManager::init() { + char msgBuffer[120]; + if (gsmAccess.begin(pin) == GSM_READY) { + debugMessage("SIM card ok", 2); + gsmAccess.setTimeout(CHECK_INTERVAL_RETRYING); + changeConnectionState(CONNECTION_STATE_CONNECTING); + } else { + debugMessage("SIM not present or wrong PIN", 0); + while(1); + } +} + +unsigned long GSMConnectionManager::getTime() { + return gsmAccess.getTime(); +} + +void GSMConnectionManager::check() { + char msgBuffer[120]; + unsigned long const now = millis(); + int gsmAccessAlive; + if (now - lastConnectionTickTime > connectionTickTimeInterval) { + switch (netConnectionState) { + case CONNECTION_STATE_INIT: + init(); + break; + case CONNECTION_STATE_CONNECTING: + // NOTE: Blocking Call when 4th parameter == true + GSM3_NetworkStatus_t networkStatus; + networkStatus = gprs.attachGPRS(apn, login, pass, true); + sprintf(msgBuffer, "GPRS.attachGPRS(): %d", networkStatus); + debugMessage(msgBuffer, 3); + if (networkStatus == GSM3_NetworkStatus_t::ERROR) { + // NO FURTHER ACTION WILL FOLLOW THIS + changeConnectionState(CONNECTION_STATE_ERROR); + return; + } + debugMessage("Sending PING to outer space...", 2); + int pingResult; + pingResult = gprs.ping("time.arduino.cc"); + sprintf(msgBuffer, "GSM.ping(): %d", pingResult); + debugMessage(msgBuffer, 2); + if (pingResult < 0) { + debugMessage("PING failed", 0); + sprintf(msgBuffer, "Retrying in \"%d\" milliseconds", connectionTickTimeInterval); + debugMessage(msgBuffer, 2); + return; + } else { + sprintf(msgBuffer, "Connected to GPRS Network"); + debugMessage(msgBuffer, 2); + changeConnectionState(CONNECTION_STATE_GETTIME); + return; + } + break; + case CONNECTION_STATE_GETTIME: + debugMessage("Acquiring Time from Network", 3); + unsigned long networkTime; + networkTime = getTime(); + debugMessage(".", 3, false, false); + if(networkTime > lastValidTimestamp){ + lastValidTimestamp = networkTime; + sprintf(msgBuffer, "Network Time: %u", networkTime); + debugMessage(msgBuffer, 3); + changeConnectionState(CONNECTION_STATE_CONNECTED); + }else if(gsmAccess.isAccessAlive() != 1){ + changeConnectionState(CONNECTION_STATE_DISCONNECTED); + }else if (!getTimeRetries--) { + changeConnectionState(CONNECTION_STATE_DISCONNECTED); + } + break; + case CONNECTION_STATE_CONNECTED: + gsmAccessAlive = gsmAccess.isAccessAlive(); + sprintf(msgBuffer, "GPRS.isAccessAlive(): %d", gsmAccessAlive); + debugMessage(msgBuffer, 4); + if (gsmAccessAlive != 1) { + changeConnectionState(CONNECTION_STATE_DISCONNECTED); + return; + } + sprintf(msgBuffer, "Connected to Cellular Network"); + debugMessage(msgBuffer, 4); + break; + case CONNECTION_STATE_DISCONNECTED: + gprs.detachGPRS(); + changeConnectionState(CONNECTION_STATE_CONNECTING); + break; + } + lastConnectionTickTime = now; + } +} + +/****************************************************************************** + * PRIVATE MEMBER FUNCTIONS + ******************************************************************************/ + +void GSMConnectionManager::changeConnectionState(NetworkConnectionState _newState) { + char msgBuffer[120]; + int newInterval = CHECK_INTERVAL_IDLE; + switch (_newState) { + case CONNECTION_STATE_INIT: + newInterval = CHECK_INTERVAL_INIT; + break; + case CONNECTION_STATE_CONNECTING: + sprintf(msgBuffer, "Connecting to Cellular Network"); + debugMessage(msgBuffer, 2); + newInterval = CHECK_INTERVAL_CONNECTING; + break; + case CONNECTION_STATE_GETTIME: + debugMessage("Acquiring Time from Network", 3); + newInterval = CHECK_INTERVAL_GETTIME; + getTimeRetries = MAX_GETTIME_RETRIES; + break; + case CONNECTION_STATE_CONNECTED: + newInterval = CHECK_INTERVAL_CONNECTED; + break; + case CONNECTION_STATE_DISCONNECTED: + if(netConnectionState == CONNECTION_STATE_CONNECTED){ + debugMessage("Disconnected from Cellular Network", 0); + debugMessage("Attempting reconnection", 0); + }else if(netConnectionState == CONNECTION_STATE_GETTIME){ + debugMessage("Connection to Cellular Network lost during Time acquisition.\nAttempting reconnection", 0); + } + newInterval = CHECK_INTERVAL_DISCONNECTED; + break; + case CONNECTION_STATE_ERROR: + debugMessage("GPRS attach failed\nMake sure the antenna is connected and reset your board.", 0); + break; + } + connectionTickTimeInterval = newInterval; + lastConnectionTickTime = millis(); + netConnectionState = _newState; +} diff --git a/src/GSMConnectionManager.h b/src/GSMConnectionManager.h index 5588243e38e..216d6f33956 100644 --- a/src/GSMConnectionManager.h +++ b/src/GSMConnectionManager.h @@ -15,14 +15,22 @@ * a commercial license, send an email to license@arduino.cc. */ +/****************************************************************************** + * INCLUDE + ******************************************************************************/ + #include "ConnectionManager.h" +/****************************************************************************** + * CLASS DECLARATION + ******************************************************************************/ + class GSMConnectionManager : public ConnectionManager { public: GSMConnectionManager(const char *pin, const char *apn, const char *login, const char *pass); - virtual unsigned long getTime(); virtual void init(); + virtual unsigned long getTime(); virtual void check(); virtual Client &getClient() { return networkClient; }; virtual UDP &getUDP() { return udp; }; @@ -53,142 +61,3 @@ class GSMConnectionManager : public ConnectionManager { int connectionTickTimeInterval; }; - -static const unsigned long NETWORK_CONNECTION_INTERVAL = 30000; - -GSMConnectionManager::GSMConnectionManager(const char *pin, const char *apn, const char *login, const char *pass) : - pin(pin), - apn(apn), - login(login), - pass(pass), - lastConnectionTickTime(millis()), - connectionTickTimeInterval(CHECK_INTERVAL_IDLE), - getTimeRetries(MAX_GETTIME_RETRIES) { -} - -unsigned long GSMConnectionManager::getTime() { - return gsmAccess.getTime(); -} - -void GSMConnectionManager::init() { - char msgBuffer[120]; - if (gsmAccess.begin(pin) == GSM_READY) { - debugMessage("SIM card ok", 2); - gsmAccess.setTimeout(CHECK_INTERVAL_RETRYING); - changeConnectionState(CONNECTION_STATE_CONNECTING); - } else { - debugMessage("SIM not present or wrong PIN", 0); - while(1); - } -} - -void GSMConnectionManager::changeConnectionState(NetworkConnectionState _newState) { - char msgBuffer[120]; - int newInterval = CHECK_INTERVAL_IDLE; - switch (_newState) { - case CONNECTION_STATE_INIT: - newInterval = CHECK_INTERVAL_INIT; - break; - case CONNECTION_STATE_CONNECTING: - sprintf(msgBuffer, "Connecting to Cellular Network"); - debugMessage(msgBuffer, 2); - newInterval = CHECK_INTERVAL_CONNECTING; - break; - case CONNECTION_STATE_GETTIME: - debugMessage("Acquiring Time from Network", 3); - newInterval = CHECK_INTERVAL_GETTIME; - getTimeRetries = MAX_GETTIME_RETRIES; - break; - case CONNECTION_STATE_CONNECTED: - newInterval = CHECK_INTERVAL_CONNECTED; - break; - case CONNECTION_STATE_DISCONNECTED: - if(netConnectionState == CONNECTION_STATE_CONNECTED){ - debugMessage("Disconnected from Cellular Network", 0); - debugMessage("Attempting reconnection", 0); - }else if(netConnectionState == CONNECTION_STATE_GETTIME){ - debugMessage("Connection to Cellular Network lost during Time acquisition.\nAttempting reconnection", 0); - } - newInterval = CHECK_INTERVAL_DISCONNECTED; - break; - case CONNECTION_STATE_ERROR: - debugMessage("GPRS attach failed\nMake sure the antenna is connected and reset your board.", 0); - break; - } - connectionTickTimeInterval = newInterval; - lastConnectionTickTime = millis(); - netConnectionState = _newState; -} - -void GSMConnectionManager::check() { - char msgBuffer[120]; - unsigned long const now = millis(); - int gsmAccessAlive; - if (now - lastConnectionTickTime > connectionTickTimeInterval) { - switch (netConnectionState) { - case CONNECTION_STATE_INIT: - init(); - break; - case CONNECTION_STATE_CONNECTING: - // NOTE: Blocking Call when 4th parameter == true - GSM3_NetworkStatus_t networkStatus; - networkStatus = gprs.attachGPRS(apn, login, pass, true); - sprintf(msgBuffer, "GPRS.attachGPRS(): %d", networkStatus); - debugMessage(msgBuffer, 3); - if (networkStatus == GSM3_NetworkStatus_t::ERROR) { - // NO FURTHER ACTION WILL FOLLOW THIS - changeConnectionState(CONNECTION_STATE_ERROR); - return; - } - debugMessage("Sending PING to outer space...", 2); - int pingResult; - pingResult = gprs.ping("time.arduino.cc"); - sprintf(msgBuffer, "GSM.ping(): %d", pingResult); - debugMessage(msgBuffer, 2); - if (pingResult < 0) { - debugMessage("PING failed", 0); - sprintf(msgBuffer, "Retrying in \"%d\" milliseconds", connectionTickTimeInterval); - debugMessage(msgBuffer, 2); - return; - } else { - sprintf(msgBuffer, "Connected to GPRS Network"); - debugMessage(msgBuffer, 2); - changeConnectionState(CONNECTION_STATE_GETTIME); - return; - } - break; - case CONNECTION_STATE_GETTIME: - debugMessage("Acquiring Time from Network", 3); - unsigned long networkTime; - networkTime = getTime(); - debugMessage(".", 3, false, false); - if(networkTime > lastValidTimestamp){ - lastValidTimestamp = networkTime; - sprintf(msgBuffer, "Network Time: %u", networkTime); - debugMessage(msgBuffer, 3); - changeConnectionState(CONNECTION_STATE_CONNECTED); - }else if(gsmAccess.isAccessAlive() != 1){ - changeConnectionState(CONNECTION_STATE_DISCONNECTED); - }else if (!getTimeRetries--) { - changeConnectionState(CONNECTION_STATE_DISCONNECTED); - } - break; - case CONNECTION_STATE_CONNECTED: - gsmAccessAlive = gsmAccess.isAccessAlive(); - sprintf(msgBuffer, "GPRS.isAccessAlive(): %d", gsmAccessAlive); - debugMessage(msgBuffer, 4); - if (gsmAccessAlive != 1) { - changeConnectionState(CONNECTION_STATE_DISCONNECTED); - return; - } - sprintf(msgBuffer, "Connected to Cellular Network"); - debugMessage(msgBuffer, 4); - break; - case CONNECTION_STATE_DISCONNECTED: - gprs.detachGPRS(); - changeConnectionState(CONNECTION_STATE_CONNECTING); - break; - } - lastConnectionTickTime = now; - } -} From c11fa73073b48c09b5544f73a4cf5e2f8d6e8c35 Mon Sep 17 00:00:00 2001 From: Alexander Entinger Date: Wed, 20 Mar 2019 06:56:06 +0100 Subject: [PATCH 3/7] Separating EthernetConnectionManager definition/implementation in a h/cpp file --- src/EthernetConnectionManager.cpp | 189 ++++++++++++++++++++++++++++++ src/EthernetConnectionManager.h | 183 +++++------------------------ 2 files changed, 217 insertions(+), 155 deletions(-) create mode 100644 src/EthernetConnectionManager.cpp diff --git a/src/EthernetConnectionManager.cpp b/src/EthernetConnectionManager.cpp new file mode 100644 index 00000000000..1f6be46ea85 --- /dev/null +++ b/src/EthernetConnectionManager.cpp @@ -0,0 +1,189 @@ +/* + * This file is part of ArduinoIoTCloud. + * + * Copyright 2019 ARDUINO SA (http://www.arduino.cc/) + * + * This software is released under the GNU General Public License version 3, + * which covers the main part of arduino-cli. + * The terms of this license can be found at: + * https://www.gnu.org/licenses/gpl-3.0.en.html + * + * You can be released from the requirements of the above licenses by purchasing + * a commercial license. Buying such a license is mandatory if you want to modify or + * otherwise use the software for commercial activities involving the Arduino + * software without disclosing the source code of your own applications. To purchase + * a commercial license, send an email to license@arduino.cc. + */ + +/****************************************************************************** + * INCLUDE + ******************************************************************************/ + +#include "EthernetConnectionManager.h" + +/****************************************************************************** + * CONSTANTS + ******************************************************************************/ + +static const unsigned long NETWORK_CONNECTION_INTERVAL = 30000; + +/****************************************************************************** + * CTOR + ******************************************************************************/ + +EthConnectionManager::EthConnectionManager(uint8_t * mac, int const ss_pin) : + mac(mac), + ss_pin(ss_pin), + lastConnectionTickTime(millis()), + connectionTickTimeInterval(CHECK_INTERVAL_IDLE) { +} + +/****************************************************************************** + * PUBLIC MEMBER FUNCTIONS + ******************************************************************************/ + +void EthConnectionManager::init() { +} + +unsigned long EthConnectionManager::getTime() { + //handled by fallback manager + return lastValidTimestamp + 1; +} + +void EthConnectionManager::check() { + char msgBuffer[120]; + unsigned long const now = millis(); + int networkStatus = 0; + if (now - lastConnectionTickTime > connectionTickTimeInterval) { + switch (netConnectionState) { + case CONNECTION_STATE_INIT: + if (ss_pin == -1) { + networkStatus = Ethernet.begin(mac); + } else { + networkStatus = Ethernet.begin(mac, ss_pin); + } + networkStatus = Ethernet.hardwareStatus(); + *msgBuffer = 0; + sprintf(msgBuffer, "Eth hardware status(): %d", networkStatus); + debugMessage(msgBuffer, 2); + if (networkStatus == EthernetNoHardware) { + debugMessage("No Ethernet chip connected", 0); + // don't continue: + changeConnectionState(CONNECTION_STATE_ERROR); + lastConnectionTickTime = now; + return; + } + networkStatus = Ethernet.linkStatus(); + *msgBuffer = 0; + sprintf(msgBuffer, "Eth link status(): %d", networkStatus); + debugMessage(msgBuffer, 2); + if (networkStatus == LinkOFF) { + debugMessage("Failed to configure Ethernet via dhcp", 0); + // don't continue: + changeConnectionState(CONNECTION_STATE_ERROR); + lastConnectionTickTime = now; + return; + } + *msgBuffer = 0; + sprintf(msgBuffer, "Ethernet shield recognized: ID", Ethernet.hardwareStatus()); + debugMessage(msgBuffer, 0); + changeConnectionState(CONNECTION_STATE_CONNECTING); + break; + case CONNECTION_STATE_CONNECTING: + *msgBuffer = 0; + sprintf(msgBuffer, "Connecting via dhcp"); + debugMessage(msgBuffer, 2); + if (ss_pin == -1) { + networkStatus = Ethernet.begin(mac); + } else { + networkStatus = Ethernet.begin(mac, ss_pin); + } + *msgBuffer = 0; + sprintf(msgBuffer, "Ethernet.status(): %d", networkStatus); + debugMessage(msgBuffer, 2); + if (networkStatus == 0) { + *msgBuffer = 0; + sprintf(msgBuffer, "Connection failed"); + debugMessage(msgBuffer, 0); + + *msgBuffer = 0; + sprintf(msgBuffer, "Retrying in \"%d\" milliseconds", connectionTickTimeInterval); + debugMessage(msgBuffer, 2); + //changeConnectionState(CONNECTION_STATE_CONNECTING); + return; + } else { + *msgBuffer = 0; + sprintf(msgBuffer, "Connected!"); + debugMessage(msgBuffer, 2); + changeConnectionState(CONNECTION_STATE_GETTIME); + return; + } + break; + case CONNECTION_STATE_GETTIME: + debugMessage("Acquiring Time from Network", 3); + unsigned long networkTime; + networkTime = getTime(); + *msgBuffer = 0; + sprintf(msgBuffer, "Network Time: %u", networkTime); + debugMessage(msgBuffer, 3); + if(networkTime > lastValidTimestamp){ + lastValidTimestamp = networkTime; + changeConnectionState(CONNECTION_STATE_CONNECTED); + } + break; + case CONNECTION_STATE_CONNECTED: + // keep testing connection + Ethernet.maintain(); + networkStatus = Ethernet.linkStatus(); + *msgBuffer = 0; + sprintf(msgBuffer, "Eth link status(): %d", networkStatus); + debugMessage(msgBuffer, 4); + if (networkStatus != LinkON) { + changeConnectionState(CONNECTION_STATE_DISCONNECTED); + return; + } + *msgBuffer = 0; + sprintf(msgBuffer, "Connected"); + debugMessage(msgBuffer, 2); + break; + case CONNECTION_STATE_DISCONNECTED: + *msgBuffer = 0; + sprintf(msgBuffer, "Connection lost."); + debugMessage(msgBuffer, 0); + debugMessage("Attempting reconnection", 1); + changeConnectionState(CONNECTION_STATE_CONNECTING); + //wifiClient.stop(); + break; + } + lastConnectionTickTime = now; + } +} + +/****************************************************************************** + * PRIVATE MEMBER FUNCTIONS + ******************************************************************************/ + +void EthConnectionManager::changeConnectionState(NetworkConnectionState _newState) { + netConnectionState = _newState; + int newInterval = CHECK_INTERVAL_IDLE; + switch (_newState) { + case CONNECTION_STATE_INIT: + newInterval = CHECK_INTERVAL_INIT; + break; + case CONNECTION_STATE_CONNECTING: + newInterval = CHECK_INTERVAL_CONNECTING; + break; + case CONNECTION_STATE_GETTIME: + newInterval = CHECK_INTERVAL_GETTIME; + break; + case CONNECTION_STATE_CONNECTED: + newInterval = CHECK_INTERVAL_CONNECTED; + break; + case CONNECTION_STATE_DISCONNECTED: + newInterval = CHECK_INTERVAL_DISCONNECTED; + + break; + } + connectionTickTimeInterval = newInterval; + lastConnectionTickTime = millis(); +} diff --git a/src/EthernetConnectionManager.h b/src/EthernetConnectionManager.h index 9042ed39b26..76b17427a00 100644 --- a/src/EthernetConnectionManager.h +++ b/src/EthernetConnectionManager.h @@ -1,14 +1,39 @@ +/* + * This file is part of ArduinoIoTCloud. + * + * Copyright 2019 ARDUINO SA (http://www.arduino.cc/) + * + * This software is released under the GNU General Public License version 3, + * which covers the main part of arduino-cli. + * The terms of this license can be found at: + * https://www.gnu.org/licenses/gpl-3.0.en.html + * + * You can be released from the requirements of the above licenses by purchasing + * a commercial license. Buying such a license is mandatory if you want to modify or + * otherwise use the software for commercial activities involving the Arduino + * software without disclosing the source code of your own applications. To purchase + * a commercial license, send an email to license@arduino.cc. + */ + +/****************************************************************************** + * INCLUDE + ******************************************************************************/ + #include "ConnectionManager.h" #include #define BOARD_HAS_ETHERNET +/****************************************************************************** + * CLASS DECLARATION + ******************************************************************************/ + class EthConnectionManager : public ConnectionManager { public: - EthConnectionManager(uint8_t *mac, int ss_pin); + EthConnectionManager(uint8_t * mac, int const ss_pin = -1); - virtual unsigned long getTime(); virtual void init(); + virtual unsigned long getTime(); virtual void check(); virtual Client &getClient() { return ethClient; }; virtual UDP &getUDP() { return udp; }; @@ -16,6 +41,7 @@ class EthConnectionManager : public ConnectionManager { private: void changeConnectionState(NetworkConnectionState _newState); + const int CHECK_INTERVAL_IDLE = 100; const int CHECK_INTERVAL_INIT = 100; const int CHECK_INTERVAL_CONNECTING = 500; @@ -32,156 +58,3 @@ class EthConnectionManager : public ConnectionManager { EthernetUDP udp; int connectionTickTimeInterval; }; - -#if !defined(BOARD_HAS_WIFI) && !defined(BOARD_HAS_GSM) -static const unsigned long NETWORK_CONNECTION_INTERVAL = 30000; -#endif - -EthConnectionManager::EthConnectionManager(uint8_t *mac, int ss_pin = -1) : - mac(mac), - ss_pin(ss_pin), - lastConnectionTickTime(millis()), - connectionTickTimeInterval(CHECK_INTERVAL_IDLE) { -} - -unsigned long EthConnectionManager::getTime() { - //handled by fallback manager - return lastValidTimestamp + 1; -} - -void EthConnectionManager::init() { -} - -void EthConnectionManager::changeConnectionState(NetworkConnectionState _newState) { - netConnectionState = _newState; - int newInterval = CHECK_INTERVAL_IDLE; - switch (_newState) { - case CONNECTION_STATE_INIT: - newInterval = CHECK_INTERVAL_INIT; - break; - case CONNECTION_STATE_CONNECTING: - newInterval = CHECK_INTERVAL_CONNECTING; - break; - case CONNECTION_STATE_GETTIME: - newInterval = CHECK_INTERVAL_GETTIME; - break; - case CONNECTION_STATE_CONNECTED: - newInterval = CHECK_INTERVAL_CONNECTED; - break; - case CONNECTION_STATE_DISCONNECTED: - newInterval = CHECK_INTERVAL_DISCONNECTED; - - break; - } - connectionTickTimeInterval = newInterval; - lastConnectionTickTime = millis(); -} - -void EthConnectionManager::check() { - char msgBuffer[120]; - unsigned long const now = millis(); - int networkStatus = 0; - if (now - lastConnectionTickTime > connectionTickTimeInterval) { - switch (netConnectionState) { - case CONNECTION_STATE_INIT: - if (ss_pin == -1) { - networkStatus = Ethernet.begin(mac); - } else { - networkStatus = Ethernet.begin(mac, ss_pin); - } - networkStatus = Ethernet.hardwareStatus(); - *msgBuffer = 0; - sprintf(msgBuffer, "Eth hardware status(): %d", networkStatus); - debugMessage(msgBuffer, 2); - if (networkStatus == EthernetNoHardware) { - debugMessage("No Ethernet chip connected", 0); - // don't continue: - changeConnectionState(CONNECTION_STATE_ERROR); - lastConnectionTickTime = now; - return; - } - networkStatus = Ethernet.linkStatus(); - *msgBuffer = 0; - sprintf(msgBuffer, "Eth link status(): %d", networkStatus); - debugMessage(msgBuffer, 2); - if (networkStatus == LinkOFF) { - debugMessage("Failed to configure Ethernet via dhcp", 0); - // don't continue: - changeConnectionState(CONNECTION_STATE_ERROR); - lastConnectionTickTime = now; - return; - } - *msgBuffer = 0; - sprintf(msgBuffer, "Ethernet shield recognized: ID", Ethernet.hardwareStatus()); - debugMessage(msgBuffer, 0); - changeConnectionState(CONNECTION_STATE_CONNECTING); - break; - case CONNECTION_STATE_CONNECTING: - *msgBuffer = 0; - sprintf(msgBuffer, "Connecting via dhcp"); - debugMessage(msgBuffer, 2); - if (ss_pin == -1) { - networkStatus = Ethernet.begin(mac); - } else { - networkStatus = Ethernet.begin(mac, ss_pin); - } - *msgBuffer = 0; - sprintf(msgBuffer, "Ethernet.status(): %d", networkStatus); - debugMessage(msgBuffer, 2); - if (networkStatus == 0) { - *msgBuffer = 0; - sprintf(msgBuffer, "Connection failed"); - debugMessage(msgBuffer, 0); - - *msgBuffer = 0; - sprintf(msgBuffer, "Retrying in \"%d\" milliseconds", connectionTickTimeInterval); - debugMessage(msgBuffer, 2); - //changeConnectionState(CONNECTION_STATE_CONNECTING); - return; - } else { - *msgBuffer = 0; - sprintf(msgBuffer, "Connected!"); - debugMessage(msgBuffer, 2); - changeConnectionState(CONNECTION_STATE_GETTIME); - return; - } - break; - case CONNECTION_STATE_GETTIME: - debugMessage("Acquiring Time from Network", 3); - unsigned long networkTime; - networkTime = getTime(); - *msgBuffer = 0; - sprintf(msgBuffer, "Network Time: %u", networkTime); - debugMessage(msgBuffer, 3); - if(networkTime > lastValidTimestamp){ - lastValidTimestamp = networkTime; - changeConnectionState(CONNECTION_STATE_CONNECTED); - } - break; - case CONNECTION_STATE_CONNECTED: - // keep testing connection - Ethernet.maintain(); - networkStatus = Ethernet.linkStatus(); - *msgBuffer = 0; - sprintf(msgBuffer, "Eth link status(): %d", networkStatus); - debugMessage(msgBuffer, 4); - if (networkStatus != LinkON) { - changeConnectionState(CONNECTION_STATE_DISCONNECTED); - return; - } - *msgBuffer = 0; - sprintf(msgBuffer, "Connected"); - debugMessage(msgBuffer, 2); - break; - case CONNECTION_STATE_DISCONNECTED: - *msgBuffer = 0; - sprintf(msgBuffer, "Connection lost."); - debugMessage(msgBuffer, 0); - debugMessage("Attempting reconnection", 1); - changeConnectionState(CONNECTION_STATE_CONNECTING); - //wifiClient.stop(); - break; - } - lastConnectionTickTime = now; - } -} From 9ff1b4c78fd1231198d43d5f497161e7df0de6da Mon Sep 17 00:00:00 2001 From: Alexander Entinger Date: Wed, 20 Mar 2019 07:03:36 +0100 Subject: [PATCH 4/7] Adding include guards for header files --- src/ConnectionManager.h | 7 ++++--- src/EthernetConnectionManager.h | 7 ++++++- src/GSMConnectionManager.h | 5 +++++ src/WiFiConnectionManager.h | 5 +++++ 4 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/ConnectionManager.h b/src/ConnectionManager.h index f8dc92339d9..a9fbc23ad18 100644 --- a/src/ConnectionManager.h +++ b/src/ConnectionManager.h @@ -15,8 +15,8 @@ * a commercial license, send an email to license@arduino.cc. */ -#ifndef CONNECTION_MANAGER_H_INCLUDED -#define CONNECTION_MANAGER_H_INCLUDED +#ifndef CONNECTION_MANAGER_H_ +#define CONNECTION_MANAGER_H_ #define ARDUINO_CLOUD_DEBUG_LEVEL 2 @@ -99,4 +99,5 @@ inline void debugMessage(char *_msg, int _debugLevel, bool _timestamp = true, bo inline void setDebugMessageLevel(int _debugLevel){ debugMessageLevel = _debugLevel; } -#endif + +#endif /* CONNECTION_MANAGER_H_ */ diff --git a/src/EthernetConnectionManager.h b/src/EthernetConnectionManager.h index 76b17427a00..eda731c9b18 100644 --- a/src/EthernetConnectionManager.h +++ b/src/EthernetConnectionManager.h @@ -15,6 +15,9 @@ * a commercial license, send an email to license@arduino.cc. */ +#ifndef ETHERNET_CONNECTION_MANAGER_H_ +#define ETHERNET_CONNECTION_MANAGER_H_ + /****************************************************************************** * INCLUDE ******************************************************************************/ @@ -41,7 +44,7 @@ class EthConnectionManager : public ConnectionManager { private: void changeConnectionState(NetworkConnectionState _newState); - + const int CHECK_INTERVAL_IDLE = 100; const int CHECK_INTERVAL_INIT = 100; const int CHECK_INTERVAL_CONNECTING = 500; @@ -58,3 +61,5 @@ class EthConnectionManager : public ConnectionManager { EthernetUDP udp; int connectionTickTimeInterval; }; + +#endif \ No newline at end of file diff --git a/src/GSMConnectionManager.h b/src/GSMConnectionManager.h index 216d6f33956..c21406d2ad4 100644 --- a/src/GSMConnectionManager.h +++ b/src/GSMConnectionManager.h @@ -15,6 +15,9 @@ * a commercial license, send an email to license@arduino.cc. */ +#ifndef GSM_CONNECTION_MANAGER_H_ +#define GSM_CONNECTION_MANAGER_H_ + /****************************************************************************** * INCLUDE ******************************************************************************/ @@ -61,3 +64,5 @@ class GSMConnectionManager : public ConnectionManager { int connectionTickTimeInterval; }; + +#endif /* GSM_CONNECTION_MANAGER_H_ */ \ No newline at end of file diff --git a/src/WiFiConnectionManager.h b/src/WiFiConnectionManager.h index aaa4d964fbd..4a12cae89c5 100644 --- a/src/WiFiConnectionManager.h +++ b/src/WiFiConnectionManager.h @@ -15,6 +15,9 @@ * a commercial license, send an email to license@arduino.cc. */ +#ifndef WIFI_CONNECTION_MANAGER_H_ +#define WIFI_CONNECTION_MANAGER_H_ + /****************************************************************************** * INCLUDE ******************************************************************************/ @@ -60,3 +63,5 @@ class WiFiConnectionManager : public ConnectionManager { WiFiClient wifiClient; int connectionTickTimeInterval; }; + +#endif /* WIFI_CONNECTION_MANAGER_H_ */ \ No newline at end of file From d0a724de02794d0a2bd3e2d7e8cf2a34d9bc2352 Mon Sep 17 00:00:00 2001 From: Alexander Entinger Date: Wed, 20 Mar 2019 07:20:49 +0100 Subject: [PATCH 5/7] Prevent compilation of the other ConnectionManagers if the associates boards/capabilities are not present --- src/EthernetConnectionManager.cpp | 4 ++++ src/EthernetConnectionManager.h | 6 +++++- src/GSMConnectionManager.cpp | 4 ++++ src/GSMConnectionManager.h | 4 ++++ src/WiFiConnectionManager.cpp | 4 ++++ src/WiFiConnectionManager.h | 5 +++++ 6 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/EthernetConnectionManager.cpp b/src/EthernetConnectionManager.cpp index 1f6be46ea85..0713388cc06 100644 --- a/src/EthernetConnectionManager.cpp +++ b/src/EthernetConnectionManager.cpp @@ -21,6 +21,8 @@ #include "EthernetConnectionManager.h" +#ifdef BOARD_HAS_ETHERNET /* Only compile if the board has ethernet */ + /****************************************************************************** * CONSTANTS ******************************************************************************/ @@ -187,3 +189,5 @@ void EthConnectionManager::changeConnectionState(NetworkConnectionState _newStat connectionTickTimeInterval = newInterval; lastConnectionTickTime = millis(); } + +#endif /* #ifdef BOARD_HAS_ETHERNET */ diff --git a/src/EthernetConnectionManager.h b/src/EthernetConnectionManager.h index eda731c9b18..9aeb721752d 100644 --- a/src/EthernetConnectionManager.h +++ b/src/EthernetConnectionManager.h @@ -24,8 +24,10 @@ #include "ConnectionManager.h" +#define BOARD_HAS_ETHERNET /* FIXME - In current implementation this define is always set -> the compilation is always enabled - is this really necessary? */ + +#ifdef BOARD_HAS_ETHERNET /* Only compile if the board has ethernet */ #include -#define BOARD_HAS_ETHERNET /****************************************************************************** * CLASS DECLARATION @@ -62,4 +64,6 @@ class EthConnectionManager : public ConnectionManager { int connectionTickTimeInterval; }; +#endif /* #ifdef BOARD_HAS_ETHERNET */ + #endif \ No newline at end of file diff --git a/src/GSMConnectionManager.cpp b/src/GSMConnectionManager.cpp index 10e3a55c16e..b609ec0fe64 100644 --- a/src/GSMConnectionManager.cpp +++ b/src/GSMConnectionManager.cpp @@ -21,6 +21,8 @@ #include "GSMConnectionManager.h" +#ifdef BOARD_HAS_GSM /* Only compile if this is a board with GSM */ + /****************************************************************************** * CONSTANTS ******************************************************************************/ @@ -175,3 +177,5 @@ void GSMConnectionManager::changeConnectionState(NetworkConnectionState _newStat lastConnectionTickTime = millis(); netConnectionState = _newState; } + +#endif /* #ifdef BOARD_HAS_GSM */ \ No newline at end of file diff --git a/src/GSMConnectionManager.h b/src/GSMConnectionManager.h index c21406d2ad4..9a8d87df2d7 100644 --- a/src/GSMConnectionManager.h +++ b/src/GSMConnectionManager.h @@ -24,6 +24,8 @@ #include "ConnectionManager.h" +#ifdef BOARD_HAS_GSM /* Only compile if this is a board with GSM */ + /****************************************************************************** * CLASS DECLARATION ******************************************************************************/ @@ -65,4 +67,6 @@ class GSMConnectionManager : public ConnectionManager { }; +#endif /* #ifdef BOARD_HAS_GSM */ + #endif /* GSM_CONNECTION_MANAGER_H_ */ \ No newline at end of file diff --git a/src/WiFiConnectionManager.cpp b/src/WiFiConnectionManager.cpp index b819a2d13ee..d8817a28a31 100644 --- a/src/WiFiConnectionManager.cpp +++ b/src/WiFiConnectionManager.cpp @@ -21,6 +21,8 @@ #include "WiFiConnectionManager.h" +#ifdef BOARD_HAS_WIFI /* Only compile if the board has WiFi */ + /****************************************************************************** * CONSTANTS ******************************************************************************/ @@ -172,3 +174,5 @@ void WiFiConnectionManager::changeConnectionState(NetworkConnectionState _newSta lastConnectionTickTime = millis(); netConnectionState = _newState; } + +#endif /* #ifdef BOARD_HAS_WIFI */ diff --git a/src/WiFiConnectionManager.h b/src/WiFiConnectionManager.h index 4a12cae89c5..de60639365b 100644 --- a/src/WiFiConnectionManager.h +++ b/src/WiFiConnectionManager.h @@ -23,6 +23,9 @@ ******************************************************************************/ #include "ConnectionManager.h" + +#ifdef BOARD_HAS_WIFI /* Only compile if the board has WiFi */ + #include /****************************************************************************** @@ -64,4 +67,6 @@ class WiFiConnectionManager : public ConnectionManager { int connectionTickTimeInterval; }; +#endif /* #ifdef BOARD_HAS_WIFI */ + #endif /* WIFI_CONNECTION_MANAGER_H_ */ \ No newline at end of file From 2c5ecf494a899b59348c6295450f084e994f2bd0 Mon Sep 17 00:00:00 2001 From: Alexander Entinger Date: Wed, 20 Mar 2019 07:35:21 +0100 Subject: [PATCH 6/7] Extracting debug functionality into separate module 'DebugUtils' --- src/ConnectionManager.h | 38 ++++++++++------------------ src/utility/DebugUtils.cpp | 52 ++++++++++++++++++++++++++++++++++++++ src/utility/DebugUtils.h | 38 ++++++++++++++++++++++++++++ 3 files changed, 103 insertions(+), 25 deletions(-) create mode 100644 src/utility/DebugUtils.cpp create mode 100644 src/utility/DebugUtils.h diff --git a/src/ConnectionManager.h b/src/ConnectionManager.h index a9fbc23ad18..e66286659ee 100644 --- a/src/ConnectionManager.h +++ b/src/ConnectionManager.h @@ -18,11 +18,19 @@ #ifndef CONNECTION_MANAGER_H_ #define CONNECTION_MANAGER_H_ -#define ARDUINO_CLOUD_DEBUG_LEVEL 2 +/****************************************************************************** + * INCLUDES + ******************************************************************************/ #include #include + #include "utility/NTPUtils.h" +#include "utility/DebugUtils.h" + +/****************************************************************************** + * TYPEDEFS + ******************************************************************************/ enum NetworkConnectionState { CONNECTION_STATE_INIT, @@ -34,6 +42,10 @@ enum NetworkConnectionState { CONNECTION_STATE_ERROR }; +/****************************************************************************** + * CLASS DECLARATION + ******************************************************************************/ + class ConnectionManager { public: virtual void init() = 0; @@ -50,7 +62,6 @@ class ConnectionManager { }; - #ifdef ARDUINO_SAMD_MKR1000 #include #define BOARD_HAS_WIFI @@ -77,27 +88,4 @@ class ConnectionManager { #define NETWORK_CONNECTED GSM3_NetworkStatus_t::GPRS_READY #endif -static int debugMessageLevel = ARDUINO_CLOUD_DEBUG_LEVEL; -inline void debugMessage(char *_msg, int _debugLevel, bool _timestamp = true, bool _newline = true) { - if(_debugLevel < 0){ - return; - } - if (_debugLevel <= debugMessageLevel) { - char prepend[20]; - sprintf(prepend, "\n[ %d ] ", millis()); - if(_timestamp){ - Serial.print(prepend); - } - if(_newline){ - Serial.println(_msg); - }else{ - Serial.print(_msg); - } - } -} - -inline void setDebugMessageLevel(int _debugLevel){ - debugMessageLevel = _debugLevel; -} - #endif /* CONNECTION_MANAGER_H_ */ diff --git a/src/utility/DebugUtils.cpp b/src/utility/DebugUtils.cpp new file mode 100644 index 00000000000..7678613da0e --- /dev/null +++ b/src/utility/DebugUtils.cpp @@ -0,0 +1,52 @@ +/* + * This file is part of ArduinoIoTCloud. + * + * Copyright 2019 ARDUINO SA (http://www.arduino.cc/) + * + * This software is released under the GNU General Public License version 3, + * which covers the main part of arduino-cli. + * The terms of this license can be found at: + * https://www.gnu.org/licenses/gpl-3.0.en.html + * + * You can be released from the requirements of the above licenses by purchasing + * a commercial license. Buying such a license is mandatory if you want to modify or + * otherwise use the software for commercial activities involving the Arduino + * software without disclosing the source code of your own applications. To purchase + * a commercial license, send an email to license@arduino.cc. + */ + +/****************************************************************************** + * INCLUDE + ******************************************************************************/ + +#include "DebugUtils.h" + +/****************************************************************************** + * GLOBAL VARIABLES + ******************************************************************************/ + +static int debugMessageLevel = ARDUINO_IOT_CLOUD_DEFAULT_DEBUG_LEVEL; + +/****************************************************************************** + * PUBLIC FUNCTIONS + ******************************************************************************/ + +void setDebugMessageLevel(int const debugLevel) { + debugMessageLevel = debugLevel; +} + +void debugMessage(char * msg, int const debugLevel, bool const timestamp, bool const newline) { + if(debugLevel < 0){ + return; + } + + if (debugLevel <= debugMessageLevel) { + if(timestamp) { + char prepend[20]; + sprintf(prepend, "\n[ %d ] ", millis()); + Serial.print(prepend); + } + if (newline) Serial.println(msg); + else Serial.print (msg); + } +} diff --git a/src/utility/DebugUtils.h b/src/utility/DebugUtils.h new file mode 100644 index 00000000000..de1ad79057a --- /dev/null +++ b/src/utility/DebugUtils.h @@ -0,0 +1,38 @@ +/* + * This file is part of ArduinoIoTCloud. + * + * Copyright 2019 ARDUINO SA (http://www.arduino.cc/) + * + * This software is released under the GNU General Public License version 3, + * which covers the main part of arduino-cli. + * The terms of this license can be found at: + * https://www.gnu.org/licenses/gpl-3.0.en.html + * + * You can be released from the requirements of the above licenses by purchasing + * a commercial license. Buying such a license is mandatory if you want to modify or + * otherwise use the software for commercial activities involving the Arduino + * software without disclosing the source code of your own applications. To purchase + * a commercial license, send an email to license@arduino.cc. + */ + +/****************************************************************************** + * INCLUDE + ******************************************************************************/ + +#include + +/****************************************************************************** + * CONSTANTS + ******************************************************************************/ + +static int const ARDUINO_IOT_CLOUD_DEFAULT_DEBUG_LEVEL = 2; + +/****************************************************************************** + * PROTOTYPES + ******************************************************************************/ + +void setDebugMessageLevel(int debugLevel); +void debugMessage(char * msg, int const debugLevel, bool const timestamp = true, bool const newline = true); + + + From 42d1123357c0c5b854b6bd77a18f17e55c2d2573 Mon Sep 17 00:00:00 2001 From: ubi Date: Thu, 21 Mar 2019 09:29:19 +0100 Subject: [PATCH 7/7] - stop UDP to prevent socket to remain open (suggested by @facchinm) --- src/utility/NTPUtils.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/utility/NTPUtils.cpp b/src/utility/NTPUtils.cpp index 5d1129117bb..2e6e2c7def9 100644 --- a/src/utility/NTPUtils.cpp +++ b/src/utility/NTPUtils.cpp @@ -59,6 +59,7 @@ unsigned long NTPUtils::getTime() { while (!Udp.parsePacket() && (millis() - start < 10000)){} if (millis() - start >= 1000) { //timeout reached + Udp.stop(); return 0; } Udp.read(packetBuffer, NTP_PACKET_SIZE);