Skip to content

Commit 561b982

Browse files
committed
rework to support multiple instances
1 parent eaad5ab commit 561b982

16 files changed

+486
-440
lines changed

library.properties

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
name=Ethernet
2-
version=2.0.1
1+
name=BloomyEthernet
2+
version=0.1.0
33
author=Various (see AUTHORS file for details)
4-
maintainer=Arduino <info@arduino.cc>
5-
sentence=Enables network connection (local and Internet) using the Arduino Ethernet Board or Shield.
4+
maintainer=Bloomy <xxx@bloomy.com>
5+
sentence=Arduino Ethernet library with modifications to support multiple devices
66
paragraph=With this library you can use the Arduino Ethernet (shield or board) to connect to Internet. The library provides both client and server functionalities. The library permits you to connect to a local network also with DHCP and to resolve DNS.
77
category=Communication
8-
url=https://www.arduino.cc/en/Reference/Ethernet
8+
url=https://github.com/BloomyControls/ArduinoEthernet
99
architectures=*
1010
includes=Ethernet.h

src/Dhcp.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -431,3 +431,4 @@ void DhcpClass::printByte(char * buf, uint8_t n )
431431
*str-- = c < 10 ? c + '0' : c + 'A' - 10;
432432
} while(n);
433433
}
434+
/* vim: set noet sw=8: */

src/Dhcp.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,3 +135,4 @@ typedef struct _RIP_MSG_FIXED
135135
} RIP_MSG_FIXED;
136136

137137
#endif
138+
/* vim: set noet sw=8: */

src/Dns.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -351,3 +351,4 @@ uint16_t DNSClient::ProcessResponse(uint16_t aTimeout, IPAddress& aAddress)
351351
// If we get here then we haven't found an answer
352352
return -10; //INVALID_RESPONSE;
353353
}
354+
/* vim: set noet sw=8: */

src/Dns.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
class DNSClient
1111
{
1212
public:
13+
DNSClient(Ethernet& ethernet) : ethernet(ethernet), iUdp(ethernet) {};
14+
1315
void begin(const IPAddress& aDNSServer);
1416

1517
/** Convert a numeric IP address string into a four-byte IP address.
@@ -34,7 +36,9 @@ class DNSClient
3436

3537
IPAddress iDNSServer;
3638
uint16_t iRequestId;
39+
Ethernet& ethernet;
3740
EthernetUDP iUdp;
3841
};
3942

4043
#endif
44+
/* vim: set noet sw=8: */

src/Ethernet.cpp

Lines changed: 81 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -19,35 +19,47 @@
1919
*/
2020

2121
#include <Arduino.h>
22+
#include <SPI.h>
2223
#include "Ethernet.h"
2324
#include "utility/w5100.h"
2425
#include "Dhcp.h"
2526

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+
}
2839

2940
int EthernetClass::begin(uint8_t *mac, unsigned long timeout, unsigned long responseTimeout)
3041
{
31-
static DhcpClass s_dhcp;
32-
_dhcp = &s_dhcp;
42+
if (!_dhcp) {
43+
_dhcp = new DhcpClass(*this);
44+
}
3345

3446
// 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();
4052

4153
// Now try to get our config info from a DHCP server
4254
int ret = _dhcp->beginWithDHCP(mac, timeout, responseTimeout);
4355
if (ret == 1) {
4456
// We've successfully found a DHCP server and got our configuration
4557
// 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();
5163
_dnsServerAddress = _dhcp->getDnsServerIp();
5264
socketPortRand(micros());
5365
}
@@ -80,34 +92,34 @@ void EthernetClass::begin(uint8_t *mac, IPAddress ip, IPAddress dns, IPAddress g
8092

8193
void EthernetClass::begin(uint8_t *mac, IPAddress ip, IPAddress dns, IPAddress gateway, IPAddress subnet)
8294
{
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);
8698
#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]);
90102
#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);
94106
#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);
98110
#endif
99-
SPI.endTransaction();
111+
_spibus.endTransaction();
100112
_dnsServerAddress = dns;
101113
}
102114

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+
// }
107119

108120
EthernetLinkStatus EthernetClass::linkStatus()
109121
{
110-
switch (W5100.getLinkStatus()) {
122+
switch (_w5100.getLinkStatus()) {
111123
case UNKNOWN: return Unknown;
112124
case LINK_ON: return LinkON;
113125
case LINK_OFF: return LinkOFF;
@@ -117,7 +129,7 @@ EthernetLinkStatus EthernetClass::linkStatus()
117129

118130
EthernetHardwareStatus EthernetClass::hardwareStatus()
119131
{
120-
switch (W5100.getChip()) {
132+
switch (_w5100.getChip()) {
121133
case 51: return EthernetW5100;
122134
case 52: return EthernetW5200;
123135
case 55: return EthernetW5500;
@@ -138,11 +150,11 @@ int EthernetClass::maintain()
138150
case DHCP_CHECK_RENEW_OK:
139151
case DHCP_CHECK_REBIND_OK:
140152
//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();
146158
_dnsServerAddress = _dhcp->getDnsServerIp();
147159
break;
148160
default:
@@ -156,91 +168,81 @@ int EthernetClass::maintain()
156168

157169
void EthernetClass::MACAddress(uint8_t *mac_address)
158170
{
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();
162174
}
163175

164176
IPAddress EthernetClass::localIP()
165177
{
166178
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();
170182
return ret;
171183
}
172184

173185
IPAddress EthernetClass::subnetMask()
174186
{
175187
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();
179191
return ret;
180192
}
181193

182194
IPAddress EthernetClass::gatewayIP()
183195
{
184196
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();
188200
return ret;
189201
}
190202

191203
void EthernetClass::setMACAddress(const uint8_t *mac_address)
192204
{
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();
196208
}
197209

198210
void EthernetClass::setLocalIP(const IPAddress local_ip)
199211
{
200-
SPI.beginTransaction(SPI_ETHERNET_SETTINGS);
212+
_spibus.beginTransaction(SPI_ETHERNET_SETTINGS);
201213
IPAddress ip = local_ip;
202-
W5100.setIPAddress(ip.raw_address());
203-
SPI.endTransaction();
214+
_w5100.setIPAddress(ip.raw_address());
215+
_spibus.endTransaction();
204216
}
205217

206218
void EthernetClass::setSubnetMask(const IPAddress subnet)
207219
{
208-
SPI.beginTransaction(SPI_ETHERNET_SETTINGS);
220+
_spibus.beginTransaction(SPI_ETHERNET_SETTINGS);
209221
IPAddress ip = subnet;
210-
W5100.setSubnetMask(ip.raw_address());
211-
SPI.endTransaction();
222+
_w5100.setSubnetMask(ip.raw_address());
223+
_spibus.endTransaction();
212224
}
213225

214226
void EthernetClass::setGatewayIP(const IPAddress gateway)
215227
{
216-
SPI.beginTransaction(SPI_ETHERNET_SETTINGS);
228+
_spibus.beginTransaction(SPI_ETHERNET_SETTINGS);
217229
IPAddress ip = gateway;
218-
W5100.setGatewayIp(ip.raw_address());
219-
SPI.endTransaction();
230+
_w5100.setGatewayIp(ip.raw_address());
231+
_spibus.endTransaction();
220232
}
221233

222234
void EthernetClass::setRetransmissionTimeout(uint16_t milliseconds)
223235
{
224236
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();
228240
}
229241

230242
void EthernetClass::setRetransmissionCount(uint8_t num)
231243
{
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();
235247
}
236-
237-
238-
239-
240-
241-
242-
243-
244-
245-
246-
EthernetClass Ethernet;
248+
/* vim: set noet sw=8: */

0 commit comments

Comments
 (0)