19
19
*/
20
20
21
21
#include < Arduino.h>
22
+ #include < SPI.h>
22
23
#include " Ethernet.h"
23
24
#include " utility/w5100.h"
24
25
#include " Dhcp.h"
25
26
26
- IPAddress EthernetClass::_dnsServerAddress;
27
- DhcpClass* EthernetClass::_dhcp = NULL ;
27
+ EthernetClass::EthernetClass (arduino::SPIClass& spibus, uint8_t sspin)
28
+ : _dnsServerAddress{},
29
+ _dhcp{nullptr },
30
+ _spibus (spibus),
31
+ _sspin(sspin),
32
+ _w5100(_spibus, _sspin) {}
33
+
34
+ EthernetClass::~EthernetClass () {
35
+ if (_dhcp) {
36
+ delete _dhcp;
37
+ }
38
+ }
28
39
29
40
int EthernetClass::begin (uint8_t *mac, unsigned long timeout, unsigned long responseTimeout)
30
41
{
31
- static DhcpClass s_dhcp;
32
- _dhcp = &s_dhcp;
42
+ if (!_dhcp) {
43
+ _dhcp = new DhcpClass (*this );
44
+ }
33
45
34
46
// Initialise the basic info
35
- if (W5100 .init () == 0 ) return 0 ;
36
- SPI .beginTransaction (SPI_ETHERNET_SETTINGS);
37
- W5100 .setMACAddress (mac);
38
- W5100 .setIPAddress (IPAddress (0 ,0 ,0 ,0 ).raw_address ());
39
- SPI .endTransaction ();
47
+ if (_w5100 .init () == 0 ) return 0 ;
48
+ _spibus .beginTransaction (SPI_ETHERNET_SETTINGS);
49
+ _w5100 .setMACAddress (mac);
50
+ _w5100 .setIPAddress (IPAddress (0 ,0 ,0 ,0 ).raw_address ());
51
+ _spibus .endTransaction ();
40
52
41
53
// Now try to get our config info from a DHCP server
42
54
int ret = _dhcp->beginWithDHCP (mac, timeout, responseTimeout);
43
55
if (ret == 1 ) {
44
56
// We've successfully found a DHCP server and got our configuration
45
57
// info, so set things accordingly
46
- SPI .beginTransaction (SPI_ETHERNET_SETTINGS);
47
- W5100 .setIPAddress (_dhcp->getLocalIp ().raw_address ());
48
- W5100 .setGatewayIp (_dhcp->getGatewayIp ().raw_address ());
49
- W5100 .setSubnetMask (_dhcp->getSubnetMask ().raw_address ());
50
- SPI .endTransaction ();
58
+ _spibus .beginTransaction (SPI_ETHERNET_SETTINGS);
59
+ _w5100 .setIPAddress (_dhcp->getLocalIp ().raw_address ());
60
+ _w5100 .setGatewayIp (_dhcp->getGatewayIp ().raw_address ());
61
+ _w5100 .setSubnetMask (_dhcp->getSubnetMask ().raw_address ());
62
+ _spibus .endTransaction ();
51
63
_dnsServerAddress = _dhcp->getDnsServerIp ();
52
64
socketPortRand (micros ());
53
65
}
@@ -80,34 +92,34 @@ void EthernetClass::begin(uint8_t *mac, IPAddress ip, IPAddress dns, IPAddress g
80
92
81
93
void EthernetClass::begin (uint8_t *mac, IPAddress ip, IPAddress dns, IPAddress gateway, IPAddress subnet)
82
94
{
83
- if (W5100 .init () == 0 ) return ;
84
- SPI .beginTransaction (SPI_ETHERNET_SETTINGS);
85
- W5100 .setMACAddress (mac);
95
+ if (_w5100 .init () == 0 ) return ;
96
+ _spibus .beginTransaction (SPI_ETHERNET_SETTINGS);
97
+ _w5100 .setMACAddress (mac);
86
98
#ifdef ESP8266
87
- W5100 .setIPAddress (&ip[0 ]);
88
- W5100 .setGatewayIp (&gateway[0 ]);
89
- W5100 .setSubnetMask (&subnet[0 ]);
99
+ _w5100 .setIPAddress (&ip[0 ]);
100
+ _w5100 .setGatewayIp (&gateway[0 ]);
101
+ _w5100 .setSubnetMask (&subnet[0 ]);
90
102
#elif ARDUINO > 106 || TEENSYDUINO > 121
91
- W5100 .setIPAddress (ip._address .bytes );
92
- W5100 .setGatewayIp (gateway._address .bytes );
93
- W5100 .setSubnetMask (subnet._address .bytes );
103
+ _w5100 .setIPAddress (ip._address .bytes );
104
+ _w5100 .setGatewayIp (gateway._address .bytes );
105
+ _w5100 .setSubnetMask (subnet._address .bytes );
94
106
#else
95
- W5100 .setIPAddress (ip._address );
96
- W5100 .setGatewayIp (gateway._address );
97
- W5100 .setSubnetMask (subnet._address );
107
+ _w5100 .setIPAddress (ip._address );
108
+ _w5100 .setGatewayIp (gateway._address );
109
+ _w5100 .setSubnetMask (subnet._address );
98
110
#endif
99
- SPI .endTransaction ();
111
+ _spibus .endTransaction ();
100
112
_dnsServerAddress = dns;
101
113
}
102
114
103
- void EthernetClass::init (uint8_t sspin)
104
- {
105
- W5100 .setSS (sspin);
106
- }
115
+ // void EthernetClass::init(uint8_t sspin)
116
+ // {
117
+ // _w5100 .setSS(sspin);
118
+ // }
107
119
108
120
EthernetLinkStatus EthernetClass::linkStatus ()
109
121
{
110
- switch (W5100 .getLinkStatus ()) {
122
+ switch (_w5100 .getLinkStatus ()) {
111
123
case UNKNOWN: return Unknown;
112
124
case LINK_ON: return LinkON;
113
125
case LINK_OFF: return LinkOFF;
@@ -117,7 +129,7 @@ EthernetLinkStatus EthernetClass::linkStatus()
117
129
118
130
EthernetHardwareStatus EthernetClass::hardwareStatus ()
119
131
{
120
- switch (W5100 .getChip ()) {
132
+ switch (_w5100 .getChip ()) {
121
133
case 51 : return EthernetW5100;
122
134
case 52 : return EthernetW5200;
123
135
case 55 : return EthernetW5500;
@@ -138,11 +150,11 @@ int EthernetClass::maintain()
138
150
case DHCP_CHECK_RENEW_OK:
139
151
case DHCP_CHECK_REBIND_OK:
140
152
// we might have got a new IP.
141
- SPI .beginTransaction (SPI_ETHERNET_SETTINGS);
142
- W5100 .setIPAddress (_dhcp->getLocalIp ().raw_address ());
143
- W5100 .setGatewayIp (_dhcp->getGatewayIp ().raw_address ());
144
- W5100 .setSubnetMask (_dhcp->getSubnetMask ().raw_address ());
145
- SPI .endTransaction ();
153
+ _spibus .beginTransaction (SPI_ETHERNET_SETTINGS);
154
+ _w5100 .setIPAddress (_dhcp->getLocalIp ().raw_address ());
155
+ _w5100 .setGatewayIp (_dhcp->getGatewayIp ().raw_address ());
156
+ _w5100 .setSubnetMask (_dhcp->getSubnetMask ().raw_address ());
157
+ _spibus .endTransaction ();
146
158
_dnsServerAddress = _dhcp->getDnsServerIp ();
147
159
break ;
148
160
default :
@@ -156,91 +168,81 @@ int EthernetClass::maintain()
156
168
157
169
void EthernetClass::MACAddress (uint8_t *mac_address)
158
170
{
159
- SPI .beginTransaction (SPI_ETHERNET_SETTINGS);
160
- W5100 .getMACAddress (mac_address);
161
- SPI .endTransaction ();
171
+ _spibus .beginTransaction (SPI_ETHERNET_SETTINGS);
172
+ _w5100 .getMACAddress (mac_address);
173
+ _spibus .endTransaction ();
162
174
}
163
175
164
176
IPAddress EthernetClass::localIP ()
165
177
{
166
178
IPAddress ret;
167
- SPI .beginTransaction (SPI_ETHERNET_SETTINGS);
168
- W5100 .getIPAddress (ret.raw_address ());
169
- SPI .endTransaction ();
179
+ _spibus .beginTransaction (SPI_ETHERNET_SETTINGS);
180
+ _w5100 .getIPAddress (ret.raw_address ());
181
+ _spibus .endTransaction ();
170
182
return ret;
171
183
}
172
184
173
185
IPAddress EthernetClass::subnetMask ()
174
186
{
175
187
IPAddress ret;
176
- SPI .beginTransaction (SPI_ETHERNET_SETTINGS);
177
- W5100 .getSubnetMask (ret.raw_address ());
178
- SPI .endTransaction ();
188
+ _spibus .beginTransaction (SPI_ETHERNET_SETTINGS);
189
+ _w5100 .getSubnetMask (ret.raw_address ());
190
+ _spibus .endTransaction ();
179
191
return ret;
180
192
}
181
193
182
194
IPAddress EthernetClass::gatewayIP ()
183
195
{
184
196
IPAddress ret;
185
- SPI .beginTransaction (SPI_ETHERNET_SETTINGS);
186
- W5100 .getGatewayIp (ret.raw_address ());
187
- SPI .endTransaction ();
197
+ _spibus .beginTransaction (SPI_ETHERNET_SETTINGS);
198
+ _w5100 .getGatewayIp (ret.raw_address ());
199
+ _spibus .endTransaction ();
188
200
return ret;
189
201
}
190
202
191
203
void EthernetClass::setMACAddress (const uint8_t *mac_address)
192
204
{
193
- SPI .beginTransaction (SPI_ETHERNET_SETTINGS);
194
- W5100 .setMACAddress (mac_address);
195
- SPI .endTransaction ();
205
+ _spibus .beginTransaction (SPI_ETHERNET_SETTINGS);
206
+ _w5100 .setMACAddress (mac_address);
207
+ _spibus .endTransaction ();
196
208
}
197
209
198
210
void EthernetClass::setLocalIP (const IPAddress local_ip)
199
211
{
200
- SPI .beginTransaction (SPI_ETHERNET_SETTINGS);
212
+ _spibus .beginTransaction (SPI_ETHERNET_SETTINGS);
201
213
IPAddress ip = local_ip;
202
- W5100 .setIPAddress (ip.raw_address ());
203
- SPI .endTransaction ();
214
+ _w5100 .setIPAddress (ip.raw_address ());
215
+ _spibus .endTransaction ();
204
216
}
205
217
206
218
void EthernetClass::setSubnetMask (const IPAddress subnet)
207
219
{
208
- SPI .beginTransaction (SPI_ETHERNET_SETTINGS);
220
+ _spibus .beginTransaction (SPI_ETHERNET_SETTINGS);
209
221
IPAddress ip = subnet;
210
- W5100 .setSubnetMask (ip.raw_address ());
211
- SPI .endTransaction ();
222
+ _w5100 .setSubnetMask (ip.raw_address ());
223
+ _spibus .endTransaction ();
212
224
}
213
225
214
226
void EthernetClass::setGatewayIP (const IPAddress gateway)
215
227
{
216
- SPI .beginTransaction (SPI_ETHERNET_SETTINGS);
228
+ _spibus .beginTransaction (SPI_ETHERNET_SETTINGS);
217
229
IPAddress ip = gateway;
218
- W5100 .setGatewayIp (ip.raw_address ());
219
- SPI .endTransaction ();
230
+ _w5100 .setGatewayIp (ip.raw_address ());
231
+ _spibus .endTransaction ();
220
232
}
221
233
222
234
void EthernetClass::setRetransmissionTimeout (uint16_t milliseconds)
223
235
{
224
236
if (milliseconds > 6553 ) milliseconds = 6553 ;
225
- SPI .beginTransaction (SPI_ETHERNET_SETTINGS);
226
- W5100 .setRetransmissionTime (milliseconds * 10 );
227
- SPI .endTransaction ();
237
+ _spibus .beginTransaction (SPI_ETHERNET_SETTINGS);
238
+ _w5100 .setRetransmissionTime (milliseconds * 10 );
239
+ _spibus .endTransaction ();
228
240
}
229
241
230
242
void EthernetClass::setRetransmissionCount (uint8_t num)
231
243
{
232
- SPI .beginTransaction (SPI_ETHERNET_SETTINGS);
233
- W5100 .setRetransmissionCount (num);
234
- SPI .endTransaction ();
244
+ _spibus .beginTransaction (SPI_ETHERNET_SETTINGS);
245
+ _w5100 .setRetransmissionCount (num);
246
+ _spibus .endTransaction ();
235
247
}
236
-
237
-
238
-
239
-
240
-
241
-
242
-
243
-
244
-
245
-
246
- EthernetClass Ethernet;
248
+ /* vim: set noet sw=8: */
0 commit comments