Skip to content

Commit 4b9f851

Browse files
authored
Merge pull request #42 from arduino-libraries/refactor
Separating definition/implementation in .h/.cpp files + Bugfix: Prevent socket from keeping open by stopping UDP
2 parents 25be97a + 42d1123 commit 4b9f851

10 files changed

+729
-454
lines changed

src/ConnectionManager.h

Lines changed: 16 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,22 @@
1515
* a commercial license, send an email to [email protected].
1616
*/
1717

18-
#ifndef CONNECTION_MANAGER_H_INCLUDED
19-
#define CONNECTION_MANAGER_H_INCLUDED
18+
#ifndef CONNECTION_MANAGER_H_
19+
#define CONNECTION_MANAGER_H_
2020

21-
#define ARDUINO_CLOUD_DEBUG_LEVEL 2
21+
/******************************************************************************
22+
* INCLUDES
23+
******************************************************************************/
2224

2325
#include <Client.h>
2426
#include <Udp.h>
27+
2528
#include "utility/NTPUtils.h"
29+
#include "utility/DebugUtils.h"
30+
31+
/******************************************************************************
32+
* TYPEDEFS
33+
******************************************************************************/
2634

2735
enum NetworkConnectionState {
2836
CONNECTION_STATE_INIT,
@@ -34,6 +42,10 @@ enum NetworkConnectionState {
3442
CONNECTION_STATE_ERROR
3543
};
3644

45+
/******************************************************************************
46+
* CLASS DECLARATION
47+
******************************************************************************/
48+
3749
class ConnectionManager {
3850
public:
3951
virtual void init() = 0;
@@ -50,7 +62,6 @@ class ConnectionManager {
5062

5163
};
5264

53-
5465
#ifdef ARDUINO_SAMD_MKR1000
5566
#include <WiFi101.h>
5667
#define BOARD_HAS_WIFI
@@ -77,26 +88,4 @@ class ConnectionManager {
7788
#define NETWORK_CONNECTED GSM3_NetworkStatus_t::GPRS_READY
7889
#endif
7990

80-
static int debugMessageLevel = ARDUINO_CLOUD_DEBUG_LEVEL;
81-
inline void debugMessage(char *_msg, int _debugLevel, bool _timestamp = true, bool _newline = true) {
82-
if(_debugLevel < 0){
83-
return;
84-
}
85-
if (_debugLevel <= debugMessageLevel) {
86-
char prepend[20];
87-
sprintf(prepend, "\n[ %d ] ", millis());
88-
if(_timestamp){
89-
Serial.print(prepend);
90-
}
91-
if(_newline){
92-
Serial.println(_msg);
93-
}else{
94-
Serial.print(_msg);
95-
}
96-
}
97-
}
98-
99-
inline void setDebugMessageLevel(int _debugLevel){
100-
debugMessageLevel = _debugLevel;
101-
}
102-
#endif
91+
#endif /* CONNECTION_MANAGER_H_ */

src/EthernetConnectionManager.cpp

Lines changed: 193 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,193 @@
1+
/*
2+
* This file is part of ArduinoIoTCloud.
3+
*
4+
* Copyright 2019 ARDUINO SA (http://www.arduino.cc/)
5+
*
6+
* This software is released under the GNU General Public License version 3,
7+
* which covers the main part of arduino-cli.
8+
* The terms of this license can be found at:
9+
* https://www.gnu.org/licenses/gpl-3.0.en.html
10+
*
11+
* You can be released from the requirements of the above licenses by purchasing
12+
* a commercial license. Buying such a license is mandatory if you want to modify or
13+
* otherwise use the software for commercial activities involving the Arduino
14+
* software without disclosing the source code of your own applications. To purchase
15+
* a commercial license, send an email to [email protected].
16+
*/
17+
18+
/******************************************************************************
19+
* INCLUDE
20+
******************************************************************************/
21+
22+
#include "EthernetConnectionManager.h"
23+
24+
#ifdef BOARD_HAS_ETHERNET /* Only compile if the board has ethernet */
25+
26+
/******************************************************************************
27+
* CONSTANTS
28+
******************************************************************************/
29+
30+
static const unsigned long NETWORK_CONNECTION_INTERVAL = 30000;
31+
32+
/******************************************************************************
33+
* CTOR
34+
******************************************************************************/
35+
36+
EthConnectionManager::EthConnectionManager(uint8_t * mac, int const ss_pin) :
37+
mac(mac),
38+
ss_pin(ss_pin),
39+
lastConnectionTickTime(millis()),
40+
connectionTickTimeInterval(CHECK_INTERVAL_IDLE) {
41+
}
42+
43+
/******************************************************************************
44+
* PUBLIC MEMBER FUNCTIONS
45+
******************************************************************************/
46+
47+
void EthConnectionManager::init() {
48+
}
49+
50+
unsigned long EthConnectionManager::getTime() {
51+
//handled by fallback manager
52+
return lastValidTimestamp + 1;
53+
}
54+
55+
void EthConnectionManager::check() {
56+
char msgBuffer[120];
57+
unsigned long const now = millis();
58+
int networkStatus = 0;
59+
if (now - lastConnectionTickTime > connectionTickTimeInterval) {
60+
switch (netConnectionState) {
61+
case CONNECTION_STATE_INIT:
62+
if (ss_pin == -1) {
63+
networkStatus = Ethernet.begin(mac);
64+
} else {
65+
networkStatus = Ethernet.begin(mac, ss_pin);
66+
}
67+
networkStatus = Ethernet.hardwareStatus();
68+
*msgBuffer = 0;
69+
sprintf(msgBuffer, "Eth hardware status(): %d", networkStatus);
70+
debugMessage(msgBuffer, 2);
71+
if (networkStatus == EthernetNoHardware) {
72+
debugMessage("No Ethernet chip connected", 0);
73+
// don't continue:
74+
changeConnectionState(CONNECTION_STATE_ERROR);
75+
lastConnectionTickTime = now;
76+
return;
77+
}
78+
networkStatus = Ethernet.linkStatus();
79+
*msgBuffer = 0;
80+
sprintf(msgBuffer, "Eth link status(): %d", networkStatus);
81+
debugMessage(msgBuffer, 2);
82+
if (networkStatus == LinkOFF) {
83+
debugMessage("Failed to configure Ethernet via dhcp", 0);
84+
// don't continue:
85+
changeConnectionState(CONNECTION_STATE_ERROR);
86+
lastConnectionTickTime = now;
87+
return;
88+
}
89+
*msgBuffer = 0;
90+
sprintf(msgBuffer, "Ethernet shield recognized: ID", Ethernet.hardwareStatus());
91+
debugMessage(msgBuffer, 0);
92+
changeConnectionState(CONNECTION_STATE_CONNECTING);
93+
break;
94+
case CONNECTION_STATE_CONNECTING:
95+
*msgBuffer = 0;
96+
sprintf(msgBuffer, "Connecting via dhcp");
97+
debugMessage(msgBuffer, 2);
98+
if (ss_pin == -1) {
99+
networkStatus = Ethernet.begin(mac);
100+
} else {
101+
networkStatus = Ethernet.begin(mac, ss_pin);
102+
}
103+
*msgBuffer = 0;
104+
sprintf(msgBuffer, "Ethernet.status(): %d", networkStatus);
105+
debugMessage(msgBuffer, 2);
106+
if (networkStatus == 0) {
107+
*msgBuffer = 0;
108+
sprintf(msgBuffer, "Connection failed");
109+
debugMessage(msgBuffer, 0);
110+
111+
*msgBuffer = 0;
112+
sprintf(msgBuffer, "Retrying in \"%d\" milliseconds", connectionTickTimeInterval);
113+
debugMessage(msgBuffer, 2);
114+
//changeConnectionState(CONNECTION_STATE_CONNECTING);
115+
return;
116+
} else {
117+
*msgBuffer = 0;
118+
sprintf(msgBuffer, "Connected!");
119+
debugMessage(msgBuffer, 2);
120+
changeConnectionState(CONNECTION_STATE_GETTIME);
121+
return;
122+
}
123+
break;
124+
case CONNECTION_STATE_GETTIME:
125+
debugMessage("Acquiring Time from Network", 3);
126+
unsigned long networkTime;
127+
networkTime = getTime();
128+
*msgBuffer = 0;
129+
sprintf(msgBuffer, "Network Time: %u", networkTime);
130+
debugMessage(msgBuffer, 3);
131+
if(networkTime > lastValidTimestamp){
132+
lastValidTimestamp = networkTime;
133+
changeConnectionState(CONNECTION_STATE_CONNECTED);
134+
}
135+
break;
136+
case CONNECTION_STATE_CONNECTED:
137+
// keep testing connection
138+
Ethernet.maintain();
139+
networkStatus = Ethernet.linkStatus();
140+
*msgBuffer = 0;
141+
sprintf(msgBuffer, "Eth link status(): %d", networkStatus);
142+
debugMessage(msgBuffer, 4);
143+
if (networkStatus != LinkON) {
144+
changeConnectionState(CONNECTION_STATE_DISCONNECTED);
145+
return;
146+
}
147+
*msgBuffer = 0;
148+
sprintf(msgBuffer, "Connected");
149+
debugMessage(msgBuffer, 2);
150+
break;
151+
case CONNECTION_STATE_DISCONNECTED:
152+
*msgBuffer = 0;
153+
sprintf(msgBuffer, "Connection lost.");
154+
debugMessage(msgBuffer, 0);
155+
debugMessage("Attempting reconnection", 1);
156+
changeConnectionState(CONNECTION_STATE_CONNECTING);
157+
//wifiClient.stop();
158+
break;
159+
}
160+
lastConnectionTickTime = now;
161+
}
162+
}
163+
164+
/******************************************************************************
165+
* PRIVATE MEMBER FUNCTIONS
166+
******************************************************************************/
167+
168+
void EthConnectionManager::changeConnectionState(NetworkConnectionState _newState) {
169+
netConnectionState = _newState;
170+
int newInterval = CHECK_INTERVAL_IDLE;
171+
switch (_newState) {
172+
case CONNECTION_STATE_INIT:
173+
newInterval = CHECK_INTERVAL_INIT;
174+
break;
175+
case CONNECTION_STATE_CONNECTING:
176+
newInterval = CHECK_INTERVAL_CONNECTING;
177+
break;
178+
case CONNECTION_STATE_GETTIME:
179+
newInterval = CHECK_INTERVAL_GETTIME;
180+
break;
181+
case CONNECTION_STATE_CONNECTED:
182+
newInterval = CHECK_INTERVAL_CONNECTED;
183+
break;
184+
case CONNECTION_STATE_DISCONNECTED:
185+
newInterval = CHECK_INTERVAL_DISCONNECTED;
186+
187+
break;
188+
}
189+
connectionTickTimeInterval = newInterval;
190+
lastConnectionTickTime = millis();
191+
}
192+
193+
#endif /* #ifdef BOARD_HAS_ETHERNET */

0 commit comments

Comments
 (0)