8000 Merge pull request #86 from Eloquence4/WiFi · lucadentella/esp32-snippets@5151e94 · GitHub
[go: up one dir, main page]

Skip to content

Commit 5151e94

Browse files
authored
Merge pull request nkolban#86 from Eloquence4/WiFi
Fixes, optimizations and additions to WiFi
2 parents c544fbf + 2174296 commit 5151e94

File tree

4 files changed

+173
-130
lines changed

4 files changed

+173
-130
lines changed

cpp_utils/WiFi.cpp

Lines changed: 70 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -41,14 +41,24 @@ static void setDNSServer(char *ip) {
4141
}
4242
*/
4343

44-
45-
WiFi::WiFi() {
46-
ip = "";
47-
gw = "";
48-
netmask = "";
44+
/**
45+
* @brief Creates and uses a default event handler
46+
*/
47+
WiFi::WiFi()
48+
: ip(0)
49+
, gw(0)
50+
, netmask(0)
51+
, wifiEventHandler(nullptr)
52+
{
4953
wifiEventHandler = new WiFiEventHandler();
5054
}
5155

56+
/**
57+
* @brief Deletes the event handler that was used by the class
58+
*/
59+
WiFi::~WiFi() {
60+
delete wifiEventHandler;
61+
}
5262

5363
/**
5464
* @brief Add a reference to a DNS server.
@@ -72,10 +82,14 @@ void WiFi:: 8000 addDNSServer(const std::string& ip) {
7282
} // addDNSServer
7383

7484
void WiFi::addDNSServer(const char* ip) {
75-
ip_addr_t dnsserver;
76-
ESP_LOGD(tag, "Setting DNS[%d] to %s", m_dnsCount, ip);
77-
inet_pton(AF_INET, ip, &dnsserver);
78-
::dns_setserver(m_dnsCount, &dnsserver);
85+
ip_addr_t dns_server;
86+
if(inet_pton(AF_INET, ip, &dns_server))
87+
addDNSServer(ip);
88+
} // addDNSServer
89+
90+
void WiFi::addDNSServer(ip_addr_t ip) {
91+
ESP_LOGD(tag, "Setting DNS[%d] to %d.%d.%d.%d", m_dnsCount, ((uint8_t*)(&ip))[0], ((uint8_t*)(&ip))[1], ((uint8_t*)(&ip))[2], ((uint8_t*)(&ip))[3]);
92+
::dns_setserver(m_dnsCount, &ip);
7993
m_dnsCount++;
8094
m_dnsCount %= 2;
8195
} // addDNSServer
@@ -101,10 +115,14 @@ void WiFi::setDNSServer(int numdns, const std::string& ip) {
101115
} // setDNSServer
102116

103117
void WiFi::setDNSServer(int numdns, const char* ip) {
104-
ip_addr_t dnsserver;
105-
ESP_LOGD(tag, "Setting DNS[%d] to %s", numdns, ip);
106-
inet_pton(AF_INET, ip, &dnsserver);
107-
::dns_setserver(numdns, &dnsserver);
118+
ip_addr_t dns_server;
119+
if(inet_pton(AF_INET, ip, &dns_server))
120+
setDNSServer(numdns, dns_server);
121+
} // setDNSServer
122+
123+
void WiFi::setDNSServer(int numdns, ip_addr_t ip) {
124+
ESP_LOGD(tag, "Setting DNS[%d] to %d.%d.%d.%d", m_dnsCount, ((uint8_t*)(&ip))[0], ((uint8_t*)(&ip))[1], ((uint8_t*)(&ip))[2], ((uint8_t*)(&ip))[3]);
125+
::dns_setserver(numdns, &ip);
108126
} // setDNSServer
109127

110128
/**
@@ -119,20 +137,19 @@ void WiFi::setDNSServer(int numdns, const char* ip) {
119137
void WiFi::connectAP(const std::string& ssid, const std::string& password){
120138
::nvs_flash_init();
121139
::tcpip_adapter_init();
122-
if (ip.length() > 0 && gw.length() > 0 && netmask.length() > 0) {
140+
if (ip != 0 && gw != 0 && netmask != 0) {
123141
::tcpip_adapter_dhcpc_stop(TCPIP_ADAPTER_IF_STA); // Don't run a DHCP client
142+
124143
tcpip_adapter_ip_info_t ipInfo;
144+
ipInfo.ip.addr = ip;
145+
ipInfo.gw.addr = gw;
146+
ipInfo.netmask.addr = netmask;
125147

126-
inet_pton(AF_INET, ip.data(), &ipInfo.ip);
127-
inet_pton(AF_INET, gw.data(), &ipInfo.gw);
128-
inet_pton(AF_INET, netmask.data(), &ipInfo.netmask);
129148
::tcpip_adapter_set_ip_info(TCPIP_ADAPTER_IF_STA, &ipInfo);
130149
}
131150

132151

133152
ESP_ERROR_CHECK( esp_event_loop_init(wifiEventHandler->getEventHandler(), wifiEventHandler));
134-
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
135-
ESP_ERROR_CHECK(::esp_wifi_init(&cfg));
136153
ESP_ERROR_CHECK(::esp_wifi_set_storage(WIFI_STORAGE_RAM));
137154
ESP_ERROR_CHECK(::esp_wifi_set_mode(WIFI_MODE_STA));
138155
wifi_config_t sta_config;
@@ -352,7 +369,8 @@ void WiFi::startAP(const std::string& ssid, const std::string& password) {
352369

353370

354371
/**
355-
* @brief Set the IP info used when connecting as a station to an external access point.
372+
* @brief Set the IP info and enable DHCP if ip != 0. If called with ip == 0 then DHCP is enabled.
373+
* If called with bad values it will do nothing.
356374
*
357375
* Do not call this method if we are being an access point ourselves.
358376
*
@@ -368,17 +386,43 @@ void WiFi::startAP(const std::string& ssid, const std::string& password) {
368386
* @return N/A.
369387
*/
370388
void WiFi::setIPInfo(const std::string& ip, const std::string& gw, const std::string& netmask) {
389+
setIPInfo(ip.c_str(), gw.c_str(), netmask.c_str());
390+
} // setIPInfo
391+
392+
void WiFi::setIPInfo(const char* ip, const char* gw, const char* netmask) {
393+
uint32_t new_ip;
394+
uint32_t new_gw;
395+
uint32_t new_netmask;
396+
397+
auto success = (bool)inet_pton(AF_INET, ip, &new_ip);
398+
success = success && inet_pton(AF_INET, gw, &new_gw);
399+
success = success && inet_pton(AF_INET, netmask, &new_netmask);
400+
401+
if(!success) {
402+
return;
403+
}
404+
405+
setIPInfo(new_ip, new_gw, new_netmask);
406+
} // setIPInfo
407+
408+
void WiFi::setIPInfo(uint32_t ip, uint32_t gw, uint32_t netmask) {
371409
this->ip = ip;
372410
this->gw = gw;
373411
this->netmask = netmask;
374-
} // setIPInfo
375412

376-
void WiFi::setIPInfo(std::string&& ip, std::string&& gw, std::string&& netmask) {
377-
this->ip = std::move(ip);
378-
this->gw = std::move(gw);
379-
this->netmask = std::move(netmask);
380-
} // setIPInfo
413+
if(ip != 0 && gw != 0 && netmask != 0) {
414+
tcpip_adapter_ip_info_t ipInfo;
415+
ipInfo.ip.addr = ip;
416+
ipInfo.gw.addr = gw;
417+
ipInfo.netmask.addr = netmask;
381418

419+
::tcpip_adapter_dhcpc_stop(TCPIP_ADAPTER_IF_STA);
420+
::tcpip_adapter_set_ip_info(TCPIP_ADAPTER_IF_STA, &ipInfo);
421+
} else {
422+
ip = 0;
423+
::tcpip_adapter_dhcpc_start(TCPIP_ADAPTER_IF_STA);
424+
}
425+
}
382426

383427
/**
384428
* @brief Return a string representation of the WiFi access point record.

cpp_utils/WiFi.h

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -103,17 +103,20 @@ class WiFiAPRecord {
103103
*/
104104
class WiFi {
105105
private:
106-
std::string ip;
107-
std::string gw;
108-
std::string netmask;
106+
uint32_t ip;
107+
uint32_t gw;
108+
uint32_t netmask;
109109
WiFiEventHandler *wifiEventHandler;
110110

111111
public:
112112
WiFi();
113+
~WiFi();
113114
void addDNSServer(const std::string& ip);
114115
void addDNSServer(const char* ip);
116+
void addDNSServer(ip_addr_t ip);
115117
void setDNSServer(int numdns, const std::string& ip);
116118
void setDNSServer(int numdns, const char* ip);
119+
void setDNSServer(int numdns, ip_addr_t ip);
117120
struct in_addr getHostByName(const std::string& hostName);
118121
struct in_addr getHostByName(const char* hostName);
119122
void connectAP(const std::string& ssid, const std::string& password);
@@ -128,17 +131,15 @@ class WiFi {
128131
std::vector<WiFiAPRecord> scan();
129132
void startAP(const std::string& ssid, const std::string& passwd);
130133
void setIPInfo(const std::string& ip, const std::string& gw, const std::string& netmask);
131-
void setIPInfo(std::string&& ip, std::string&& gw, std::string&& netmask);
132-
133-
134-
135-
134+
void setIPInfo(const char* ip, const char* gw, const char* netmask);
135+
void setIPInfo(uint32_t ip, uint32_t gw, uint32_t netmask);
136136

137137
/**
138138
* Set the event handler to use to process detected events.
139139
* @param[in] wifiEventHandler The class that will be used to process events.
140140
*/
141141
void setWifiEventHandler(WiFiEventHandler *wifiEventHandler) {
142+
delete this->wifiEventHandler;
142143
this->wifiEventHandler = wifiEventHandler;
143144
}
144145
private:

cpp_utils/WiFiEventHandler.cpp

Lines changed: 65 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -24,49 +24,49 @@ static char tag[] = "WiFiEventHandler";
2424
* @return ESP_OK if the event was handled otherwise an error.
2525
*/
2626
esp_err_t WiFiEventHandler::eventHandler(void *ctx, system_event_t *event) {
27-
ESP_LOGD(tag, "eventHandler called");
28-
WiFiEventHandler *pWiFiEventHandler = (WiFiEventHandler *)ctx;
29-
if (ctx == nullptr) {
30-
ESP_LOGD(tag, "No context");
31-
return ESP_OK;
32-
}
33-
esp_err_t rc = ESP_OK;
34-
switch(event->event_id) {
35-
36-
case SYSTEM_EVENT_AP_START:
37-
rc = pWiFiEventHandler->apStart();
38-
break;
39-
case SYSTEM_EVENT_AP_STOP:
40-
rc = pWiFiEventHandler->apStop();
41-
break;
42-
case SYSTEM_EVENT_STA_CONNECTED:
43-
rc = pWiFiEventHandler->staConnected();
44-
break;
45-
case SYSTEM_EVENT_STA_DISCONNECTED:
46-
rc = pWiFiEventHandler->staDisconnected();
47-
break;
48-
case SYSTEM_EVENT_STA_GOT_IP:
49-
rc = pWiFiEventHandler->staGotIp(event->event_info.got_ip);
50-
break;
51-
case SYSTEM_EVENT_STA_START:
52-
rc = pWiFiEventHandler->staStart();
53-
break;
54-
case SYSTEM_EVENT_STA_STOP:
55-
rc = pWiFiEventHandler->staStop();
56-
break;
57-
case SYSTEM_EVENT_WIFI_READY:
58-
rc = pWiFiEventHandler->wifiReady();
59-
break;
60-
default:
61-
break;
62-
}
63-
if (pWiFiEventHandler->nextHandler != nullptr) {
64-
printf("Found a next handler\n");
65-
rc = eventHandler(pWiFiEventHandler->nextHandler, event);
66-
} else {
67-
//printf("NOT Found a next handler\n");
68-
}
69-
return rc;
27+
ESP_LOGD(tag, "eventHandler called");
28+
WiFiEventHandler *pWiFiEventHandler = (WiFiEventHandler *)ctx;
29+
if (ctx == nullptr) {
30+
ESP_LOGD(tag, "No context");
31+
return ESP_OK;
32+
}
33+
esp_err_t rc = ESP_OK;
34+
switch(event->event_id) {
35+
36+
case SYSTEM_EVENT_AP_START:
37+
rc = pWiFiEventHandler->apStart();
38+
break;
39+
case SYSTEM_EVENT_AP_STOP:
40+
rc = pWiFiEventHandler->apStop();
41+
break;
42+
case SYSTEM_EVENT_STA_CONNECTED:
43+
rc = pWiFiEventHandler->staConnected();
44+
break;
45+
case SYSTEM_EVENT_STA_DISCONNECTED:
46+
rc = pWiFiEventHandler->staDisconnected();
47+
break;
48+
case SYSTEM_EVENT_STA_GOT_IP:
49+
rc = pWiFiEventHandler->staGotIp(event->event_info.got_ip);
50+
break;
51+
case SYSTEM_EVENT_STA_START:
52+
rc = pWiFiEventHandler->staStart();
53+
break;
54+
case SYSTEM_EVENT_STA_STOP:
55+
rc = pWiFiEventHandler->staStop();
56+
break;
57+
case SYSTEM_EVENT_WIFI_READY:
58+
rc = pWiFiEventHandler->wifiReady();
59+
break;
60+
default:
61+
break;
62+
}
63+
if (pWiFiEventHandler->nextHandler != nullptr) {
64+
printf("Found a next handler\n");
65+
rc = eventHandler(pWiFiEventHandler->nextHandler, event);
66+
} else {
67+
//printf("NOT Found a next handler\n");
68+
}
69+
return rc;
7070
}
7171

7272
WiFiEventHandler::WiFiEventHandler() {
@@ -79,7 +79,7 @@ WiFiEventHandler::WiFiEventHandler() {
7979
* @return The event handler function.
8080
*/
8181
system_event_cb_t WiFiEventHandler::getEventHandler() {
82-
return eventHandler;
82+
return eventHandler;
8383
} // getEventHandler
8484

8585

@@ -90,8 +90,8 @@ system_event_cb_t WiFiEventHandler::getEventHandler() {
9090
* @return An indication of whether or not we processed the event successfully.
9191
*/
9292
esp_err_t WiFiEventHandler::staGotIp(system_event_sta_got_ip_t event_sta_got_ip) {
93-
ESP_LOGD(tag, "default staGotIp");
94-
return ESP_OK;
93+
ESP_LOGD(tag, "default staGotIp");
94+
return ESP_OK;
9595
} // staGotIp
9696

9797
/**
@@ -100,8 +100,8 @@ esp_err_t WiFiEventHandler::staGotIp(system_event_sta_got_ip_t event_sta_got_ip)
100100
* @return An indication of whether or not we processed the event successfully.
101101
*/
102102
esp_err_t WiFiEventHandler::apStart() {
103-
ESP_LOGD(tag, "default apStart");
104-
return ESP_OK;
103+
ESP_LOGD(tag, "default apStart");
104+
return ESP_OK;
105105
} // apStart
106106

107107
/**
@@ -110,47 +110,45 @@ esp_err_t WiFiEventHandler::apStart() {
110110
* @return An indication of whether or not we processed the event successfully.
111111
*/
112112
esp_err_t WiFiEventHandler::apStop() {
113-
ESP_LOGD(tag, "default apStop");
114-
return ESP_OK;
113+
ESP_LOGD(tag, "default apStop");
114+
return ESP_OK;
115115
} // apStop
116116

117117
esp_err_t WiFiEventHandler::wifiReady() {
118-
ESP_LOGD(tag, "default wifiReady");
119-
return ESP_OK;
118+
ESP_LOGD(tag, "default wifiReady");
119+
return ESP_OK;
120120
} // wifiReady
121121

122122
esp_err_t WiFiEventHandler::staStart() {
123-
ESP_LOGD(tag, "default staStart");
124-
return ESP_OK;
123+
ESP_LOGD(tag, "default staStart");
124+
return ESP_OK;
125125
} // staStart
126126

127127
esp_err_t WiFiEventHandler::staStop() {
128-
ESP_LOGD(tag, "default staStop");
129-
return ESP_OK;
128+
ESP_LOGD(tag, "default staStop");
129+
return ESP_OK;
130130
} // staStop
131131

132132
esp_err_t WiFiEventHandler::staConnected() {
133-
ESP_LOGD(tag, "default staConnected");
134-
return ESP_OK;
133+
ESP_LOGD(tag, "default staConnected");
134+
return ESP_OK;
135135
} // staConnected
136136

137137
esp_err_t WiFiEventHandler::staDisconnected() {
138-
ESP_LOGD(tag, "default staDisconnected");
139-
return ESP_OK;
138+
ESP_LOGD(tag, "default staDisconnected");
139+
return ESP_OK;
140140
} // staDisconnected
141141

142142
esp_err_t WiFiEventHandler::apStaConnected() {
143-
ESP_LOGD(tag, "default apStaConnected");
144-
return ESP_OK;
143+
ESP_LOGD(tag, "default apStaConnected");
144+
return ESP_OK;
145145
} // apStaConnected
146146

147147
esp_err_t WiFiEventHandler::apStaDisconnected() {
148-
ESP_LOGD(tag, "default apStaDisconnected");
149-
return ESP_OK;
148+
ESP_LOGD(tag, "default apStaDisconnected");
149+
return ESP_OK;
150150
} // apStaDisconnected
151151

152152
WiFiEventHandler::~WiFiEventHandler() {
153-
if (nextHandler != nullptr) {
154-
delete nextHandler;
155-
}
153+
delete nextHandler;
156154
} // ~WiFiEventHandler

0 commit comments

Comments
 (0)
0