Skip to content

Commit 72abd4e

Browse files
committed
EspAtDrv - support for EthernetEspAT library
1 parent 5f016ce commit 72abd4e

File tree

3 files changed

+202
-31
lines changed

3 files changed

+202
-31
lines changed

src/WiFi.cpp

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -100,15 +100,15 @@ int WiFiClass::disconnect(bool persistent) {
100100
}
101101

102102
bool WiFiClass::config(IPAddress local_ip, IPAddress dns_server, IPAddress gateway, IPAddress subnet) {
103-
if (dns_server == INADDR_NONE) {
104-
dns_server = local_ip;
105-
dns_server[3] = 1;
106-
}
103+
if (dns_server == INADDR_NONE) {
104+
dns_server = local_ip;
105+
dns_server[3] = 1;
106+
}
107107
return EspAtDrv.staStaticIp(local_ip, gateway, subnet) && setDNS(dns_server);
108108
}
109109

110110
bool WiFiClass::setDNS(IPAddress dns_server1, IPAddress dns_server2) {
111-
return EspAtDrv.staDNS(dns_server1, dns_server2);
111+
return EspAtDrv.setDNS(dns_server1, dns_server2);
112112
}
113113

114114
bool WiFiClass::setHostname(const char* name) {
@@ -155,7 +155,7 @@ IPAddress WiFiClass::subnetMask() {
155155
IPAddress WiFiClass::dnsIP(int n) {
156156
IPAddress dns1;
157157
IPAddress dns2;
158-
EspAtDrv.staDnsQuery(dns1, dns2);
158+
EspAtDrv.dnsQuery(dns1, dns2);
159159
switch (n) {
160160
case 0:
161161
return dns1;
@@ -168,7 +168,8 @@ IPAddress WiFiClass::dnsIP(int n) {
168168
bool WiFiClass::dhcpIsEnabled() {
169169
bool sta;
170170
bool ap;
171-
if (!EspAtDrv.dhcpStateQuery(sta, ap))
171+
bool eth;
172+
if (!EspAtDrv.dhcpStateQuery(sta, ap, eth))
172173
return false;
173174
return sta;
174175
}
@@ -346,7 +347,8 @@ bool WiFiClass::apIsHidden() {
346347
bool WiFiClass::apDhcpIsEnabled() {
347348
bool sta;
348349
bool ap;
349-
EspAtDrv.dhcpStateQuery(sta, ap);
350+
bool eth;
351+
EspAtDrv.dhcpStateQuery(sta, ap, eth);
350352
return ap;
351353
}
352354

src/utility/EspAtDrv.cpp

Lines changed: 174 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ const char AT_CIPSTATUS[] PROGMEM = "AT+CIPSTATUS";
4040
const char CIPSTATUS[] PROGMEM = "+CIPSTATUS";
4141
const char CIPSTA[] PROGMEM = "+CIPSTA";
4242
const char CIPAP[] PROGMEM = "+CIPAP";
43+
const char CIPETH[] PROGMEM = "+CIPETH";
4344
const char QOUT_COMMA_QOUT[] PROGMEM = "\",\"";
4445
const char PROCESSED[] PROGMEM = " ...processed";
4546
const char IGNORED[] PROGMEM = " ...ignored";
@@ -169,7 +170,7 @@ int EspAtDrvClass::staStatus() {
169170
LOG_INFO_PRINT_PREFIX();
170171
LOG_INFO_PRINTLN(F("wifi status"));
171172

172-
if (wifiModeDef == 0) { // reset() was not executed successful
173+
if (wifiModeDef == -1) { // reset() was not executed successful
173174
LOG_ERROR_PRINT_PREFIX();
174175
LOG_ERROR_PRINTLN(F("AT firmware was not initialized"));
175176
lastErrorCode = EspAtDrvError::NOT_INITIALIZED;
@@ -183,6 +184,12 @@ int EspAtDrvClass::staStatus() {
183184
return readOK() ? status : -1;
184185
}
185186

187+
int EspAtDrvClass::ethStatus() {
188+
maintain();
189+
190+
return ethConnected;
191+
}
192+
186193
uint8_t EspAtDrvClass::listAP(WiFiApData apData[], uint8_t size) {
187194
maintain();
188195

@@ -256,16 +263,13 @@ bool EspAtDrvClass::staStaticIp(const IPAddress& ip, const IPAddress& gw, const
256263
return sendCommand();
257264
}
258265

259-
bool EspAtDrvClass::staDNS(const IPAddress& dns1, const IPAddress& dns2) {
266+
bool EspAtDrvClass::setDNS(const IPAddress& dns1, const IPAddress& dns2) {
260267
maintain();
261268

262269
LOG_INFO_PRINT_PREFIX();
263270
LOG_INFO_PRINT(F("set static DNS "));
264271
LOG_INFO_PRINTLN(persistent ? F("persistent") : F("current") );
265272

266-
uint8_t mode = wifiMode | WIFI_MODE_STA; // turn on STA, leave SoftAP as it is
267-
if (!setWifiMode(mode, false))
268-
return false; // can't set dns without sta mode
269273
#ifdef WIFIESPAT1 // AT+CIPDNS doesn't work in AT 1
270274
if (persistent) {
271275
cmd->print(F("AT+CIPDNS_DEF="));
@@ -329,11 +333,11 @@ bool EspAtDrvClass::staIpQuery(IPAddress& ip, IPAddress& gwip, IPAddress& mask)
329333
return readOK();
330334
}
331335

332-
bool EspAtDrvClass::staDnsQuery(IPAddress& dns1, IPAddress& dns2) {
336+
bool EspAtDrvClass::dnsQuery(IPAddress& dns1, IPAddress& dns2) {
333337
maintain();
334338

335339
LOG_INFO_PRINT_PREFIX();
336-
LOG_INFO_PRINTLN(F("STA DNS query"));
340+
LOG_INFO_PRINTLN(F("DNS query"));
337341

338342
#ifdef WIFIESPAT1 // AT+CIPDNS? has different output in AT 2
339343
cmd->print(F("AT+CIPDNS_CUR?"));
@@ -456,12 +460,13 @@ bool EspAtDrvClass::quitAP(bool save) {
456460
LOG_INFO_PRINT(F("quit AP "));
457461
LOG_INFO_PRINTLN((persistent || save) ? F(" persistent") : F(" current") );
458462

459-
if (wifiMode == WIFI_MODE_SAP) { // STA is off
463+
if (!(wifiMode & WIFI_MODE_STA)) { // STA is off
460464
LOG_WARN_PRINT_PREFIX();
461465
LOG_WARN_PRINTLN(F("STA is off"));
462466
return false;
463467
}
464468
#ifdef WIFIESPAT1
469+
// AT 1 AT+CWDHCP= parameters are strange. first parameter is 0, 1, 2. second is 0/1
465470
if (persistent || save) {
466471
simpleCommand(PSTR("AT+CWAUTOCONN=0")); // don't reconnect on reset
467472
simpleCommand(PSTR("AT+CIPDNS_DEF=0")); // clear static DNS servers
@@ -471,13 +476,14 @@ bool EspAtDrvClass::quitAP(bool save) {
471476
simpleCommand(PSTR("AT+CWDHCP_CUR=1,1")); // enable DHCP back in case static IP disabled it
472477
}
473478
#else
479+
// AT 2 AT+CWDHCP= first parameter is 0/1 and second parameter are bits for net. interfaces
474480
if (persistent != save && !sysStoreInternal(save))
475481
return false;
476482
if (persistent || save) {
477483
simpleCommand(PSTR("AT+CWAUTOCONN=0")); // don't reconnect on reset. always stored
478484
}
479485
simpleCommand(PSTR("AT+CIPDNS=0")); // clear static DNS servers
480-
simpleCommand(PSTR("AT+CWDHCP=1,3")); // enable DHCP back in case static IP disabled it
486+
simpleCommand(PSTR("AT+CWDHCP=1,1")); // enable STA DHCP back in case static IP disabled it
481487
if (persistent != save && !sysStoreInternal(persistent)) {
482488
persistent = save;
483489
}
@@ -505,7 +511,7 @@ bool EspAtDrvClass::apQuery(char* ssid, uint8_t* bssid, uint8_t& channel, int32_
505511
ssid[0] = 0;
506512
}
507513

508-
if (wifiMode == WIFI_MODE_SAP) { // STA is off
514+
if (!(wifiMode & WIFI_MODE_STA)) { // STA is off
509515
LOG_ERROR_PRINT_PREFIX();
510516
LOG_ERROR_PRINTLN(F("STA is off"));
511517
return false;
@@ -663,7 +669,7 @@ bool EspAtDrvClass::softApQuery(char* ssid, char* passphrase, uint8_t& channel,
663669
LOG_INFO_PRINT_PREFIX();
664670
LOG_INFO_PRINTLN(F("SoftAP query"));
665671

666-
if (wifiMode == WIFI_MODE_STA) { // SoftAP is off
672+
if (!(wifiMode & WIFI_MODE_SAP)) { // SoftAP is off
667673
LOG_ERROR_PRINT_PREFIX();
668674
LOG_ERROR_PRINTLN(F("SoftAP is off"));
669675
return false;
@@ -694,6 +700,138 @@ bool EspAtDrvClass::softApQuery(char* ssid, char* passphrase, uint8_t& channel,
694700
return readOK();
695701
}
696702

703+
bool EspAtDrvClass::ethSetMac(uint8_t* mac) {
704+
maintain();
705+
706+
LOG_INFO_PRINT_PREFIX();
707+
LOG_INFO_PRINT(F("set ETH MAC "));
708+
// LOG_INFO_PRINT(ip);
709+
LOG_INFO_PRINTLN(persistent ? F(" persistent") : F(" current") );
710+
711+
#ifdef WIFIESPAT1
712+
if (persistent) {
713+
#endif
714+
cmd->print(F("AT+CIPETHMAC=\""));
715+
#ifdef WIFIESPAT1
716+
} else {
717+
cmd->print(F("AT+CIPETHMAC_CUR=\""));
718+
}
719+
#endif
720+
printMAC(cmd, mac);
721+
cmd->print('"');
722+
return sendCommand();
723+
}
724+
725+
bool EspAtDrvClass::ethStaticIp(const IPAddress& ip, const IPAddress& gw, const IPAddress& nm) {
726+
maintain();
727+
728+
LOG_INFO_PRINT_PREFIX();
729+
LOG_INFO_PRINT(F("set ETH static IP "));
730+
LOG_INFO_PRINT(ip);
731+
LOG_INFO_PRINTLN(persistent ? F(" persistent") : F(" current") );
732+
733+
#ifdef WIFIESPAT1
734+
if (persistent) {
735+
#endif
736+
cmd->print(F("AT+CIPETH=\""));
737+
#ifdef WIFIESPAT1
738+
} else {
739+
cmd->print(F("AT+CIPETH_CUR=\""));
740+
}
741+
#endif
742+
ip.printTo(*cmd);
743+
if (gw[0]) {
744+
cmd->print((FSH_P) QOUT_COMMA_QOUT);
745+
gw.printTo(*cmd);
746+
if (nm[0]) {
747+
cmd->print((FSH_P) QOUT_COMMA_QOUT);
748+
nm.printTo(*cmd);
749+
}
750+
}
751+
cmd->print('"');
752+
return sendCommand();
753+
}
754+
755+
bool EspAtDrvClass::ethEnableDHCP() {
756+
LOG_INFO_PRINT_PREFIX();
757+
LOG_INFO_PRINT(F("enable Eth DHCP "));
758+
LOG_INFO_PRINTLN(persistent ? F("persistent") : F("current") );
759+
#ifdef WIFIESPAT1
760+
if (persistent) {
761+
return simpleCommand(PSTR("AT+CWDHCP=3,1"));
762+
}
763+
return simpleCommand(PSTR("AT+CWDHCP_CUR=3,1"));
764+
#else
765+
return simpleCommand(PSTR("AT+CWDHCP=1,4"));
766+
#endif
767+
}
768+
769+
bool EspAtDrvClass::ethMacQuery(uint8_t* mac) {
770+
maintain();
771+
772+
LOG_INFO_PRINT_PREFIX();
773+
LOG_INFO_PRINTLN(F("ETH MAC query "));
774+
775+
cmd->print(F("AT+CIPETHMAC?"));
776+
if (!sendCommand(PSTR("+CIPETHMAC")))
777+
return false;
778+
const char* delims = ":\"";
779+
char* tok = strtok(buffer, delims); // +CIPETHMAC:"
780+
for (int i = 0; i < 6; i++) {
781+
tok = strtok(NULL, delims); // <mac>[i]
782+
mac[i] = strtol(tok, NULL, 16);
783+
}
784+
return readOK();
785+
}
786+
787+
bool EspAtDrvClass::ethIpQuery(IPAddress& ip, IPAddress& gwip, IPAddress& mask) {
788+
maintain();
789+
790+
LOG_INFO_PRINT_PREFIX();
791+
LOG_INFO_PRINTLN(F("ETH IP query"));
792+
793+
cmd->print(F("AT+CIPETH?"));
794+
if (!sendCommand(CIPETH))
795+
return false;
796+
buffer[strlen(buffer) - 1] = 0; // delete last char '\"'
797+
ip.fromString(buffer + strlen("+CIPETH:ip:\""));
798+
if (!readRX(CIPETH))
799+
return false;
800+
buffer[strlen(buffer) - 1] = 0;
801+
gwip.fromString(buffer + strlen("+CIPETH:gateway:\""));
802+
if (!readRX(CIPETH))
803+
return false;
804+
buffer[strlen(buffer) - 1] = 0;
805+
mask.fromString(buffer + strlen("+CIPETH:netmask:\""));
806+
return readOK();
807+
}
808+
809+
bool EspAtDrvClass::setEthHostname(const char* hostname) {
810+
maintain();
811+
812+
LOG_INFO_PRINT_PREFIX();
813+
LOG_INFO_PRINT(F("set eth hostname "));
814+
LOG_INFO_PRINTLN(hostname);
815+
816+
cmd->print(F("AT+CEHOSTNAME=\""));
817+
cmd->print(hostname);
818+
cmd->print('"');
819+
return sendCommand();
820+
}
821+
822+
bool EspAtDrvClass::ethHostnameQuery(char* hostname) {
823+
maintain();
824+
825+
LOG_INFO_PRINT_PREFIX();
826+
LOG_INFO_PRINTLN(F("eth hostname query"));
827+
828+
cmd->print(F("AT+CEHOSTNAME?"));
829+
if (!sendCommand(PSTR("+CEHOSTNAME")))
830+
return false;
831+
strcpy(hostname, buffer + strlen("+CEHOSTNAME:"));
832+
return readOK();
833+
}
834+
697835
bool EspAtDrvClass::serverBegin(uint16_t port, uint8_t maxConnCount, uint16_t serverTimeout, bool ssl, bool ca) {
698836
maintain();
699837

@@ -1288,7 +1426,7 @@ bool EspAtDrvClass::hostnameQuery(char* hostname) {
12881426
return readOK();
12891427
}
12901428

1291-
bool EspAtDrvClass::dhcpStateQuery(bool& staDHCP, bool& softApDHCP) {
1429+
bool EspAtDrvClass::dhcpStateQuery(bool& staDHCP, bool& softApDHCP, bool& ethDHCP) {
12921430
maintain();
12931431

12941432
LOG_INFO_PRINT_PREFIX();
@@ -1304,7 +1442,8 @@ bool EspAtDrvClass::dhcpStateQuery(bool& staDHCP, bool& softApDHCP) {
13041442
#else
13051443
softApDHCP = state & 0b10;
13061444
staDHCP = state & 0b01;
1307-
#endif
1445+
#endif
1446+
ethDHCP = state & 0b100;
13081447
return readOK();
13091448
}
13101449

@@ -1404,6 +1543,11 @@ bool EspAtDrvClass::sleepMode(EspAtSleepMode mode) {
14041543
return sendCommand();
14051544
}
14061545

1546+
bool EspAtDrvClass::wifiOff(bool save) {
1547+
maintain();
1548+
return setWifiMode(0, save);
1549+
}
1550+
14071551
bool EspAtDrvClass::deepSleep() {
14081552
maintain();
14091553

@@ -1482,7 +1626,7 @@ bool EspAtDrvClass::readRX(PGM_P expected, bool bufferData, bool listItem) {
14821626
} else {
14831627
l += serial->readBytes(buffer + l, 1); // read second byte with stream's timeout
14841628
if (l < 2)
1485-
continue; // We haven't read requested 2 bytes, something went wrong
1629+
continue; // We haven't read requested 2 bytes, something went wrong
14861630
timeout = 0; // AT firmware responded
14871631
if (buffer[0] == '\r' && buffer[1] == '\n') // empty line. skip it
14881632
continue;
@@ -1600,6 +1744,9 @@ bool EspAtDrvClass::readRX(PGM_P expected, bool bufferData, bool listItem) {
16001744
} else if (listItem && !strcmp_P(buffer, OK)) { // OK ends the listing of unknown items count
16011745
LOG_DEBUG_PRINTLN(F(" ...end of list"));
16021746
return false;
1747+
} else if (!strncmp_P(buffer, PSTR("+ETH"), strlen("+ETH"))) {
1748+
ethConnected = (buffer[strlen("+ETH_")] != 'D'); // +ETH_DISCONNECTED
1749+
LOG_DEBUG_PRINTLN((FSH_P) PROCESSED);
16031750
} else {
16041751
ignoredCount++;
16051752
if (ignoredCount > 70) { // reset() has many ignored lines
@@ -1634,17 +1781,13 @@ bool EspAtDrvClass::simpleCommand(PGM_P command) {
16341781

16351782
bool EspAtDrvClass::setWifiMode(uint8_t mode, bool save) {
16361783

1637-
if (wifiModeDef == 0) { // reset() was not executed successful
1784+
if (wifiModeDef == -1) { // reset() was not executed successful
16381785
LOG_ERROR_PRINT_PREFIX();
16391786
LOG_ERROR_PRINTLN(F("AT firmware was not initialized"));
16401787
lastErrorCode = EspAtDrvError::NOT_INITIALIZED;
16411788
return false;
16421789
}
16431790

1644-
if (mode == 0) {
1645-
mode = WIFI_MODE_STA;
1646-
}
1647-
16481791
if (mode == wifiMode && (!save || mode == wifiModeDef)) // no change
16491792
return true;
16501793

@@ -1763,4 +1906,16 @@ bool EspAtDrvClass::checkLinks() {
17631906
}
17641907
#endif
17651908

1909+
void EspAtDrvClass::printMAC(Print* out, uint8_t* mac) {
1910+
for (int i = 0; i < 6; i++) {
1911+
if (i > 0) {
1912+
out->print(":");
1913+
}
1914+
if (mac[i] < 16) {
1915+
out->print("0");
1916+
}
1917+
out->print(mac[i], HEX);
1918+
}
1919+
}
1920+
17661921
EspAtDrvClass EspAtDrv;

0 commit comments

Comments
 (0)