Skip to content

Commit da7179b

Browse files
committed
Add EthernetConnectionManager
1 parent 75ddfcc commit da7179b

File tree

1 file changed

+187
-0
lines changed

1 file changed

+187
-0
lines changed

src/EthernetConnectionManager.h

Lines changed: 187 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,187 @@
1+
#include "ConnectionManager.h"
2+
3+
#include <Ethernet.h>
4+
#define BOARD_HAS_ETHERNET
5+
6+
class EthConnectionManager : public ConnectionManager {
7+
public:
8+
EthConnectionManager(uint8_t *mac, int ss_pin);
9+
10+
virtual unsigned long getTime();
11+
virtual void init();
12+
virtual void check();
13+
virtual Client &getClient() { return ethClient; };
14+
virtual UDP &getUDP() { return udp; };
15+
16+
private:
17+
18+
void changeConnectionState(NetworkConnectionState _newState);
19+
const int CHECK_INTERVAL_IDLE = 100;
20+
const int CHECK_INTERVAL_INIT = 100;
21+
const int CHECK_INTERVAL_CONNECTING = 500;
22+
const int CHECK_INTERVAL_GETTIME = 100;
23+
const int CHECK_INTERVAL_CONNECTED = 10000;
24+
const int CHECK_INTERVAL_RETRYING = 5000;
25+
const int CHECK_INTERVAL_DISCONNECTED = 1000;
26+
const int CHECK_INTERVAL_ERROR = 500;
27+
28+
unsigned long lastConnectionTickTime, lastNetworkStep;
29+
uint8_t* mac;
30+
int ss_pin;
31+
EthernetClient ethClient;
32+
EthernetUDP udp;
33+
int connectionTickTimeInterval;
34+
};
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 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

Comments
 (0)