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
+
1
22
#include " ConnectionManager.h"
2
23
3
24
#include < Ethernet.h>
4
25
#define BOARD_HAS_ETHERNET
5
26
27
+ /* *****************************************************************************
28
+ * CLASS DECLARATION
29
+ ******************************************************************************/
30
+
6
31
class EthConnectionManager : public ConnectionManager {
7
32
public:
8
- EthConnectionManager (uint8_t *mac, int ss_pin);
33
+ EthConnectionManager (uint8_t * mac, int const ss_pin = - 1 );
9
34
10
- virtual unsigned long getTime ();
11
35
virtual void init ();
36
+ virtual unsigned long getTime ();
12
37
virtual void check ();
13
38
virtual Client &getClient () { return ethClient; };
14
39
virtual UDP &getUDP () { return udp; };
15
40
16
41
private:
17
42
18
43
void changeConnectionState (NetworkConnectionState _newState);
44
+
19
45
const int CHECK_INTERVAL_IDLE = 100 ;
20
46
const int CHECK_INTERVAL_INIT = 100 ;
21
47
const int CHECK_INTERVAL_CONNECTING = 500 ;
@@ -32,156 +58,3 @@ class EthConnectionManager : public ConnectionManager {
32
58
EthernetUDP udp;
33
59
int connectionTickTimeInterval;
34
60
};
35
-
36
- #if !defined(BOARD_HAS_WIFI) && !defined(BOARD_HAS_GSM)
37
- static const unsigned long NETWORK_CONNECTION_INTERVAL = 30000 ;
38
- #endif
39
-
40
- EthConnectionManager::EthConnectionManager (uint8_t *mac, int ss_pin = -1 ) :
41
- mac(mac),
42
- ss_pin(ss_pin),
43
- lastConnectionTickTime(millis()),
44
- connectionTickTimeInterval(CHECK_INTERVAL_IDLE) {
45
- }
46
-
47
- unsigned long EthConnectionManager::getTime () {
48
- // handled by fallback manager
49
- return lastValidTimestamp + 1 ;
50
- }
51
-
52
- void EthConnectionManager::init () {
53
- }
54
-
55
- void EthConnectionManager::changeConnectionState (NetworkConnectionState _newState) {
56
- netConnectionState = _newState;
57
- int newInterval = CHECK_INTERVAL_IDLE;
58
- switch (_newState) {
59
- case CONNECTION_STATE_INIT:
60
- newInterval = CHECK_INTERVAL_INIT;
61
- break ;
62
- case CONNECTION_STATE_CONNECTING:
63
- newInterval = CHECK_INTERVAL_CONNECTING;
64
- break ;
65
- case CONNECTION_STATE_GETTIME:
66
- newInterval = CHECK_INTERVAL_GETTIME;
67
- break ;
68
- case CONNECTION_STATE_CONNECTED:
69
- newInterval = CHECK_INTERVAL_CONNECTED;
70
- break ;
71
- case CONNECTION_STATE_DISCONNECTED:
72
- newInterval = CHECK_INTERVAL_DISCONNECTED;
73
-
74
- break ;
75
- }
76
- connectionTickTimeInterval = newInterval;
77
- lastConnectionTickTime = millis ();
78
- }
79
-
80
- void EthConnectionManager::check () {
81
- char msgBuffer[120 ];
82
- unsigned long const now = millis ();
83
- int networkStatus = 0 ;
84
- if (now - lastConnectionTickTime > connectionTickTimeInterval) {
85
- switch (netConnectionState) {
86
- case CONNECTION_STATE_INIT:
87
- if (ss_pin == -1 ) {
88
- networkStatus = Ethernet.begin (mac);
89
- } else {
90
- networkStatus = Ethernet.begin (mac, ss_pin);
91
- }
92
- networkStatus = Ethernet.hardwareStatus ();
93
- *msgBuffer = 0 ;
94
- sprintf (msgBuffer, " Eth hardware status(): %d" , networkStatus);
95
- debugMessage (msgBuffer, 2 );
96
- if (networkStatus == EthernetNoHardware) {
97
- debugMessage (" No Ethernet chip connected" , 0 );
98
- // don't continue:
99
- changeConnectionState (CONNECTION_STATE_ERROR);
100
- lastConnectionTickTime = now;
101
- return ;
102
- }
103
- networkStatus = Ethernet.linkStatus ();
104
- *msgBuffer = 0 ;
105
- sprintf (msgBuffer, " Eth link status(): %d" , networkStatus);
106
- debugMessage (msgBuffer, 2 );
107
- if (networkStatus == LinkOFF) {
108
- debugMessage (" Failed to configure Ethernet via dhcp" , 0 );
109
- // don't continue:
110
- changeConnectionState (CONNECTION_STATE_ERROR);
111
- lastConnectionTickTime = now;
112
- return ;
113
- }
114
- *msgBuffer = 0 ;
115
- sprintf (msgBuffer, " Ethernet shield recognized: ID" , Ethernet.hardwareStatus ());
116
- debugMessage (msgBuffer, 0 );
117
- changeConnectionState (CONNECTION_STATE_CONNECTING);
118
- break ;
119
- case CONNECTION_STATE_CONNECTING:
120
- *msgBuffer = 0 ;
121
- sprintf (msgBuffer, " Connecting via dhcp" );
122
- debugMessage (msgBuffer, 2 );
123
- if (ss_pin == -1 ) {
124
- networkStatus = Ethernet.begin (mac);
125
- } else {
126
- networkStatus = Ethernet.begin (mac, ss_pin);
127
- }
128
- *msgBuffer = 0 ;
129
- sprintf (msgBuffer, " Ethernet.status(): %d" , networkStatus);
130
- debugMessage (msgBuffer, 2 );
131
- if (networkStatus == 0 ) {
132
- *msgBuffer = 0 ;
133
- sprintf (msgBuffer, " Connection failed" );
134
- debugMessage (msgBuffer, 0 );
135
-
136
- *msgBuffer = 0 ;
137
- sprintf (msgBuffer, " Retrying in \" %d\" milliseconds" , connectionTickTimeInterval);
138
- debugMessage (msgBuffer, 2 );
139
- // changeConnectionState(CONNECTION_STATE_CONNECTING);
140
- return ;
141
- } else {
142
- *msgBuffer = 0 ;
143
- sprintf (msgBuffer, " Connected!" );
144
- debugMessage (msgBuffer, 2 );
145
- changeConnectionState (CONNECTION_STATE_GETTIME);
146
- return ;
147
- }
148
- break ;
149
- case CONNECTION_STATE_GETTIME:
150
- debugMessage (" Acquiring Time from Network" , 3 );
151
- unsigned long networkTime;
152
- networkTime = getTime ();
153
- *msgBuffer = 0 ;
154
- sprintf (msgBuffer, " Network Time: %u" , networkTime);
155
- debugMessage (msgBuffer, 3 );
156
- if (networkTime > lastValidTimestamp){
157
- lastValidTimestamp = networkTime;
158
- changeConnectionState (CONNECTION_STATE_CONNECTED);
159
- }
160
- break ;
161
- case CONNECTION_STATE_CONNECTED:
162
- // keep testing connection
163
- Ethernet.maintain ();
164
- networkStatus = Ethernet.linkStatus ();
165
- *msgBuffer = 0 ;
166
- sprintf (msgBuffer, " Eth link status(): %d" , networkStatus);
167
- debugMessage (msgBuffer, 4 );
168
- if (networkStatus != LinkON) {
169
- changeConnectionState (CONNECTION_STATE_DISCONNECTED);
170
- return ;
171
- }
172
- *msgBuffer = 0 ;
173
- sprintf (msgBuffer, " Connected" );
174
- debugMessage (msgBuffer, 2 );
175
- break ;
176
- case CONNECTION_STATE_DISCONNECTED:
177
- *msgBuffer = 0 ;
178
- sprintf (msgBuffer, " Connection lost." );
179
- debugMessage (msgBuffer, 0 );
180
- debugMessage (" Attempting reconnection" , 1 );
181
- changeConnectionState (CONNECTION_STATE_CONNECTING);
182
- // wifiClient.stop();
183
- break ;
184
- }
185
- lastConnectionTickTime = now;
186
- }
187
- }
0 commit comments