@@ -16,6 +16,7 @@ class EthConnectionManager : public ConnectionManager {
16
16
private:
17
17
18
18
void changeConnectionState (NetworkConnectionState _newState);
19
+ void sendNTPpacket (const char * address, uint8_t * packetBuffer);
19
20
20
21
const int CHECK_INTERVAL_IDLE = 100 ;
21
22
const int CHECK_INTERVAL_INIT = 100 ;
@@ -29,24 +30,24 @@ class EthConnectionManager : public ConnectionManager {
29
30
unsigned long lastConnectionTickTime, lastNetworkStep;
30
31
uint8_t * mac;
31
32
int ss_pin;
33
+ long cached_epoch = 0 ;
32
34
EthernetClient ethClient;
35
+ EthernetUDP Udp;
33
36
int connectionTickTimeInterval;
34
37
};
35
38
36
39
#if !defined(BOARD_HAS_WIFI) && !defined(BOARD_HAS_GSM)
37
40
static const unsigned long NETWORK_CONNECTION_INTERVAL = 30000 ;
38
41
#endif
39
42
40
- EthConnectionManager::EthConnectionManager (uint8_t *mac, int ss_pin = 10 ) :
43
+ EthConnectionManager::EthConnectionManager (uint8_t *mac, int ss_pin = - 1 ) :
41
44
mac(mac),
42
45
ss_pin(ss_pin),
43
46
lastConnectionTickTime(millis()),
44
47
connectionTickTimeInterval(CHECK_INTERVAL_IDLE) {
45
48
}
46
49
47
- #include < EthernetUdp.h>
48
-
49
- void sendNTPpacket (const char * address, uint8_t * packetBuffer, EthernetUDP* udp) {
50
+ void EthConnectionManager::sendNTPpacket (const char * address, uint8_t * packetBuffer) {
50
51
const int NTP_PACKET_SIZE = 48 ;
51
52
memset (packetBuffer, 0 , NTP_PACKET_SIZE);
52
53
packetBuffer[0 ] = 0b11100011 ;
@@ -57,21 +58,31 @@ void sendNTPpacket(const char * address, uint8_t* packetBuffer, EthernetUDP* udp
57
58
packetBuffer[13 ] = 0x4E ;
58
59
packetBuffer[14 ] = 49 ;
59
60
packetBuffer[15 ] = 52 ;
60
- udp-> beginPacket (address, 123 );
61
- udp-> write (packetBuffer, NTP_PACKET_SIZE);
62
- udp-> endPacket ();
61
+ Udp. beginPacket (address, 123 );
62
+ Udp. write (packetBuffer, NTP_PACKET_SIZE);
63
+ Udp. endPacket ();
63
64
}
64
65
65
66
unsigned long EthConnectionManager::getTime () {
67
+
68
+ if (cached_epoch != 0 ) {
69
+ return cached_epoch;
70
+ }
66
71
unsigned int localPort = 8888 ;
67
- const char timeServer[] = " time.nist.gov " ;
72
+ const char timeServer[] = " time.apple.com " ;
68
73
const int NTP_PACKET_SIZE = 48 ;
69
74
uint8_t packetBuffer[NTP_PACKET_SIZE];
70
- EthernetUDP Udp;
71
75
72
76
Udp.begin (localPort);
73
- sendNTPpacket (timeServer, packetBuffer, &Udp);
74
- while (!Udp.parsePacket ()) {}
77
+ sendNTPpacket (timeServer, packetBuffer);
78
+ long start = millis ();
79
+ while (!Udp.parsePacket () && (millis () - start < 1000 )) {
80
+
81
+ }
82
+ if (millis () - start >= 1000 ) {
83
+ // timeout reached
84
+ return 0 ;
85
+ }
75
86
Udp.read (packetBuffer, NTP_PACKET_SIZE);
76
87
77
88
unsigned long highWord = word (packetBuffer[40 ], packetBuffer[41 ]);
@@ -80,6 +91,7 @@ unsigned long EthConnectionManager::getTime() {
80
91
const unsigned long seventyYears = 2208988800UL ;
81
92
unsigned long epoch = secsSince1900 - seventyYears;
82
93
94
+ cached_epoch = epoch;
83
95
return epoch;
84
96
}
85
97
@@ -121,7 +133,11 @@ void EthConnectionManager::check() {
121
133
changeConnectionState (CONNECTION_STATE_INIT);
122
134
break ;
123
135
case CONNECTION_STATE_INIT:
124
- Ethernet.init (ss_pin);
136
+ if (ss_pin == -1 ) {
137
+ networkStatus = Ethernet.begin (mac);
138
+ } else {
139
+ networkStatus = Ethernet.begin (mac, ss_pin);
140
+ }
125
141
networkStatus = Ethernet.hardwareStatus ();
126
142
*msgBuffer = 0 ;
127
143
sprintf (msgBuffer, " Eth hardware status(): %d" , networkStatus);
@@ -153,8 +169,11 @@ void EthConnectionManager::check() {
153
169
*msgBuffer = 0 ;
154
170
sprintf (msgBuffer, " Connecting via dhcp" );
155
171
debugMessage (msgBuffer, 2 );
156
-
157
- networkStatus = Ethernet.begin (mac, ss_pin);
172
+ if (ss_pin == -1 ) {
173
+ networkStatus = Ethernet.begin (mac);
174
+ } else {
175
+ networkStatus = Ethernet.begin (mac, ss_pin);
176
+ }
158
177
*msgBuffer = 0 ;
159
178
sprintf (msgBuffer, " Ethernet.status(): %d" , networkStatus);
160
179
debugMessage (msgBuffer, 2 );
0 commit comments