Skip to content

Commit 0a94723

Browse files
committed
WiFiGeneric refactor events handling
- replace legacy functions with handler instance based - replace if's with simplified switch/case - use post without arduino_event_t where appropriate, avoid useless mallocs on event bus
1 parent 2b8d9a2 commit 0a94723

File tree

1 file changed

+144
-113
lines changed

1 file changed

+144
-113
lines changed

Diff for: libraries/WiFi/src/WiFiGeneric.cpp

+144-113
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,13 @@ extern "C" {
5959
static esp_netif_t *esp_netifs[ESP_IF_MAX] = {NULL, NULL, NULL};
6060
// a static handle for event callback
6161
static network_event_handle_t evt_handle{0};
62+
static esp_event_handler_instance_t evt_wifi_handle{nullptr};
63+
#if !CONFIG_ESP_WIFI_REMOTE_ENABLED
64+
static esp_event_handler_instance_t evt_sc_handle{nullptr};
65+
#if CONFIG_NETWORK_PROV_NETWORK_TYPE_WIFI
66+
static esp_event_handler_instance_t evt_nprov_handle{nullptr};
67+
#endif // CONFIG_NETWORK_PROV_NETWORK_TYPE_WIFI
68+
#endif //!CONFIG_ESP_WIFI_REMOTE_ENABLED
6269

6370
esp_netif_t *get_esp_interface_netif(esp_interface_t interface) {
6471
if (interface < ESP_IF_MAX) {
@@ -71,149 +78,175 @@ static void _arduino_event_cb(void *arg, esp_event_base_t event_base, int32_t ev
7178
arduino_event_t arduino_event;
7279
arduino_event.event_id = ARDUINO_EVENT_ANY;
7380

74-
/*
75-
* SCAN
76-
* */
77-
if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_SCAN_DONE) {
78-
#if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_VERBOSE
79-
wifi_event_sta_scan_done_t *event = (wifi_event_sta_scan_done_t *)event_data;
80-
log_v("SCAN Done: ID: %u, Status: %u, Results: %u", event->scan_id, event->status, event->number);
81-
#endif
82-
arduino_event.event_id = ARDUINO_EVENT_WIFI_SCAN_DONE;
83-
memcpy(&arduino_event.event_info.wifi_scan_done, event_data, sizeof(wifi_event_sta_scan_done_t));
84-
85-
/*
86-
* WPS
87-
* */
88-
} else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_WPS_ER_SUCCESS) {
89-
arduino_event.event_id = ARDUINO_EVENT_WPS_ER_SUCCESS;
90-
} else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_WPS_ER_FAILED) {
91-
arduino_event.event_id = ARDUINO_EVENT_WPS_ER_FAILED;
92-
memcpy(&arduino_event.event_info.wps_fail_reason, event_data, sizeof(wifi_event_sta_wps_fail_reason_t));
93-
} else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_WPS_ER_TIMEOUT) {
94-
arduino_event.event_id = ARDUINO_EVENT_WPS_ER_TIMEOUT;
95-
} else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_WPS_ER_PIN) {
96-
arduino_event.event_id = ARDUINO_EVENT_WPS_ER_PIN;
97-
memcpy(&arduino_event.event_info.wps_er_pin, event_data, sizeof(wifi_event_sta_wps_er_pin_t));
98-
} else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_WPS_ER_PBC_OVERLAP) {
99-
arduino_event.event_id = ARDUINO_EVENT_WPS_ER_PBC_OVERLAP;
100-
101-
/*
102-
* FTM
103-
* */
104-
} else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_FTM_REPORT) {
105-
arduino_event.event_id = ARDUINO_EVENT_WIFI_FTM_REPORT;
106-
memcpy(&arduino_event.event_info.wifi_ftm_report, event_data, sizeof(wifi_event_ftm_report_t));
81+
if (event_base == WIFI_EVENT){
82+
switch (event_id){
83+
case WIFI_EVENT_STA_WPS_ER_SUCCESS :
84+
Network.postEvent(ARDUINO_EVENT_WPS_ER_SUCCESS);
85+
return;
86+
case WIFI_EVENT_STA_WPS_ER_TIMEOUT :
87+
Network.postEvent(ARDUINO_EVENT_WPS_ER_TIMEOUT);
88+
return;
89+
case WIFI_EVENT_STA_WPS_ER_PBC_OVERLAP :
90+
Network.postEvent(ARDUINO_EVENT_WPS_ER_PBC_OVERLAP);
91+
return;
92+
case WIFI_EVENT_SCAN_DONE : {
93+
#if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_VERBOSE
94+
wifi_event_sta_scan_done_t *event = (wifi_event_sta_scan_done_t *)event_data;
95+
log_v("SCAN Done: ID: %u, Status: %u, Results: %u", event->scan_id, event->status, event->number);
96+
#endif
97+
arduino_event.event_id = ARDUINO_EVENT_WIFI_SCAN_DONE;
98+
memcpy(&arduino_event.event_info.wifi_scan_done, event_data, sizeof(wifi_event_sta_scan_done_t));
99+
break;
100+
}
101+
case WIFI_EVENT_STA_WPS_ER_FAILED :
102+
arduino_event.event_id = ARDUINO_EVENT_WPS_ER_FAILED;
103+
memcpy(&arduino_event.event_info.wps_fail_reason, event_data, sizeof(wifi_event_sta_wps_fail_reason_t));
104+
break;
105+
case WIFI_EVENT_STA_WPS_ER_PIN :
106+
arduino_event.event_id = ARDUINO_EVENT_WPS_ER_PIN;
107+
memcpy(&arduino_event.event_info.wps_fail_reason, event_data, sizeof(wifi_event_sta_wps_er_pin_t));
108+
break;
109+
case WIFI_EVENT_FTM_REPORT :
110+
arduino_event.event_id = ARDUINO_EVENT_WIFI_FTM_REPORT;
111+
memcpy(&arduino_event.event_info.wifi_ftm_report, event_data, sizeof(wifi_event_ftm_report_t));
112+
break;
113+
default:
114+
return;
115+
}
116+
}
107117

108118
#if !CONFIG_ESP_WIFI_REMOTE_ENABLED
109-
/*
110-
* SMART CONFIG
111-
* */
112-
} else if (event_base == SC_EVENT && event_id == SC_EVENT_SCAN_DONE) {
113-
log_v("SC Scan Done");
114-
arduino_event.event_id = ARDUINO_EVENT_SC_SCAN_DONE;
115-
} else if (event_base == SC_EVENT && event_id == SC_EVENT_FOUND_CHANNEL) {
116-
log_v("SC Found Channel");
117-
arduino_event.event_id = ARDUINO_EVENT_SC_FOUND_CHANNEL;
118-
} else if (event_base == SC_EVENT && event_id == SC_EVENT_GOT_SSID_PSWD) {
119-
#if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_VERBOSE
120-
smartconfig_event_got_ssid_pswd_t *event = (smartconfig_event_got_ssid_pswd_t *)event_data;
121-
log_v("SC: SSID: %s, Password: %s", (const char *)event->ssid, (const char *)event->password);
122-
#endif
123-
arduino_event.event_id = ARDUINO_EVENT_SC_GOT_SSID_PSWD;
124-
memcpy(&arduino_event.event_info.sc_got_ssid_pswd, event_data, sizeof(smartconfig_event_got_ssid_pswd_t));
125-
126-
} else if (event_base == SC_EVENT && event_id == SC_EVENT_SEND_ACK_DONE) {
127-
log_v("SC Send Ack Done");
128-
arduino_event.event_id = ARDUINO_EVENT_SC_SEND_ACK_DONE;
119+
if (event_base == SC_EVENT){
120+
switch (event_id){
121+
case SC_EVENT_SCAN_DONE :
122+
log_v("SC Scan Done");
123+
Network.postEvent(ARDUINO_EVENT_SC_SCAN_DONE);
124+
return;
125+
case SC_EVENT_FOUND_CHANNEL :
126+
log_v("SC Found Channel");
127+
Network.postEvent(ARDUINO_EVENT_SC_FOUND_CHANNEL);
128+
return;
129+
case SC_EVENT_GOT_SSID_PSWD : {
130+
#if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_VERBOSE
131+
smartconfig_event_got_ssid_pswd_t *event = (smartconfig_event_got_ssid_pswd_t *)event_data;
132+
log_v("SC: SSID: %s, Password: %s", (const char *)event->ssid, (const char *)event->password);
133+
#endif
134+
arduino_event.event_id = ARDUINO_EVENT_SC_GOT_SSID_PSWD;
135+
memcpy(&arduino_event.event_info.sc_got_ssid_pswd, event_data, sizeof(smartconfig_event_got_ssid_pswd_t));
136+
break;
137+
}
138+
case SC_EVENT_SEND_ACK_DONE :
139+
log_v("SC Send Ack Done");
140+
Network.postEvent(ARDUINO_EVENT_SC_SEND_ACK_DONE);
141+
return;
142+
default:
143+
return;
144+
}
145+
}
129146

130147
#if CONFIG_NETWORK_PROV_NETWORK_TYPE_WIFI
131-
/*
148+
/*
132149
* Provisioning
133-
* */
134-
} else if (event_base == NETWORK_PROV_EVENT && event_id == NETWORK_PROV_INIT) {
135-
log_v("Provisioning Initialized!");
136-
arduino_event.event_id = ARDUINO_EVENT_PROV_INIT;
137-
} else if (event_base == NETWORK_PROV_EVENT && event_id == NETWORK_PROV_DEINIT) {
138-
log_v("Provisioning Uninitialized!");
139-
arduino_event.event_id = ARDUINO_EVENT_PROV_DEINIT;
140-
} else if (event_base == NETWORK_PROV_EVENT && event_id == NETWORK_PROV_START) {
141-
log_v("Provisioning Start!");
142-
arduino_event.event_id = ARDUINO_EVENT_PROV_START;
143-
} else if (event_base == NETWORK_PROV_EVENT && event_id == NETWORK_PROV_END) {
144-
log_v("Provisioning End!");
145-
network_prov_mgr_deinit();
146-
arduino_event.event_id = ARDUINO_EVENT_PROV_END;
147-
} else if (event_base == NETWORK_PROV_EVENT && event_id == NETWORK_PROV_WIFI_CRED_RECV) {
148-
#if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_VERBOSE
149-
wifi_sta_config_t *event = (wifi_sta_config_t *)event_data;
150-
log_v("Provisioned Credentials: SSID: %s, Password: %s", (const char *)event->ssid, (const char *)event->password);
151-
#endif
152-
arduino_event.event_id = ARDUINO_EVENT_PROV_CRED_RECV;
153-
memcpy(&arduino_event.event_info.prov_cred_recv, event_data, sizeof(wifi_sta_config_t));
154-
} else if (event_base == NETWORK_PROV_EVENT && event_id == NETWORK_PROV_WIFI_CRED_FAIL) {
155-
#if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_ERROR
156-
network_prov_wifi_sta_fail_reason_t *reason = (network_prov_wifi_sta_fail_reason_t *)event_data;
157-
log_e("Provisioning Failed: Reason : %s", (*reason == NETWORK_PROV_WIFI_STA_AUTH_ERROR) ? "Authentication Failed" : "AP Not Found");
158-
#endif
159-
arduino_event.event_id = ARDUINO_EVENT_PROV_CRED_FAIL;
160-
memcpy(&arduino_event.event_info.prov_fail_reason, event_data, sizeof(network_prov_wifi_sta_fail_reason_t));
161-
} else if (event_base == NETWORK_PROV_EVENT && event_id == NETWORK_PROV_WIFI_CRED_SUCCESS) {
162-
log_v("Provisioning Success!");
163-
arduino_event.event_id = ARDUINO_EVENT_PROV_CRED_SUCCESS;
164-
#endif
165-
#endif
150+
*/
151+
if (event_base == NETWORK_PROV_EVENT){
152+
switch (event_id){
153+
case NETWORK_PROV_INIT :
154+
log_v("Provisioning Initialized!");
155+
Network.postEvent(ARDUINO_EVENT_PROV_INIT);
156+
return;
157+
case NETWORK_PROV_DEINIT :
158+
log_v("Provisioning Uninitialized!");
159+
Network.postEvent(ARDUINO_EVENT_PROV_DEINIT);
160+
return;
161+
case NETWORK_PROV_START :
162+
log_v("Provisioning Start!");
163+
Network.postEvent(ARDUINO_EVENT_PROV_START);
164+
return;
165+
case NETWORK_PROV_END :
166+
log_v("Provisioning End!");
167+
network_prov_mgr_deinit();
168+
Network.postEvent(ARDUINO_EVENT_PROV_END);
169+
return;
170+
case NETWORK_PROV_WIFI_CRED_RECV : {
171+
#if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_VERBOSE
172+
wifi_sta_config_t *event = (wifi_sta_config_t *)event_data;
173+
log_v("Provisioned Credentials: SSID: %s, Password: %s", (const char *)event->ssid, (const char *)event->password);
174+
#endif
175+
arduino_event.event_id = ARDUINO_EVENT_PROV_CRED_RECV;
176+
memcpy(&arduino_event.event_info.prov_cred_recv, event_data, sizeof(wifi_sta_config_t));
177+
break;
178+
}
179+
case NETWORK_PROV_WIFI_CRED_FAIL : {
180+
#if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_ERROR
181+
network_prov_wifi_sta_fail_reason_t *reason = (network_prov_wifi_sta_fail_reason_t *)event_data;
182+
log_e("Provisioning Failed: Reason : %s", (*reason == NETWORK_PROV_WIFI_STA_AUTH_ERROR) ? "Authentication Failed" : "AP Not Found");
183+
#endif
184+
arduino_event.event_id = ARDUINO_EVENT_PROV_CRED_FAIL;
185+
memcpy(&arduino_event.event_info.prov_fail_reason, event_data, sizeof(network_prov_wifi_sta_fail_reason_t));
186+
break;
187+
}
188+
case NETWORK_PROV_WIFI_CRED_SUCCESS :
189+
log_v("Provisioning Success!");
190+
Network.postEvent(ARDUINO_EVENT_PROV_CRED_SUCCESS);
191+
return;
192+
default:
193+
return;
194+
}
166195
}
196+
#endif // CONFIG_NETWORK_PROV_NETWORK_TYPE_WIFI
197+
#endif //!CONFIG_ESP_WIFI_REMOTE_ENABLED
167198

168-
if (arduino_event.event_id != ARDUINO_EVENT_ANY) {
169-
Network.postEvent(&arduino_event);
170-
}
199+
Network.postEvent(&arduino_event);
171200
}
172201

173202
static bool initWiFiEvents() {
174-
if (esp_event_handler_instance_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &_arduino_event_cb, NULL, NULL)) {
175-
log_e("event_handler_instance_register for WIFI_EVENT Failed!");
176-
return false;
203+
bool result{true};
204+
205+
if (!evt_wifi_handle && esp_event_handler_instance_register(WIFI_EVENT, ESP_EVENT_ANY_ID, &_arduino_event_cb, NULL, &evt_wifi_handle)) {
206+
log_e("register for WIFI_EVENT Failed!");
207+
result = false;
177208
}
178209

179210
#if !CONFIG_ESP_WIFI_REMOTE_ENABLED
180-
if (esp_event_handler_instance_register(SC_EVENT, ESP_EVENT_ANY_ID, &_arduino_event_cb, NULL, NULL)) {
181-
log_e("event_handler_instance_register for SC_EVENT Failed!");
182-
return false;
211+
if (!evt_sc_handle && esp_event_handler_instance_register(SC_EVENT, ESP_EVENT_ANY_ID, &_arduino_event_cb, NULL, &evt_sc_handle)) {
212+
log_e("register for SC_EVENT Failed!");
213+
result = false;
183214
}
184215

185216
#if CONFIG_NETWORK_PROV_NETWORK_TYPE_WIFI
186-
if (esp_event_handler_instance_register(NETWORK_PROV_EVENT, ESP_EVENT_ANY_ID, &_arduino_event_cb, NULL, NULL)) {
187-
log_e("event_handler_instance_register for NETWORK_PROV_EVENT Failed!");
188-
return false;
217+
if (!evt_nprov_handle && esp_event_handler_instance_register(NETWORK_PROV_EVENT, ESP_EVENT_ANY_ID, &_arduino_event_cb, NULL, &evt_nprov_handle)) {
218+
log_e("register for NETWORK_PROV_EVENT Failed!");
219+
result = false;
189220
}
190221
#endif
191222
#endif
192223

193-
return true;
224+
return result;
194225
}
195226

196227
static bool deinitWiFiEvents() {
197-
if (esp_event_handler_unregister(WIFI_EVENT, ESP_EVENT_ANY_ID, &_arduino_event_cb)) {
198-
log_e("esp_event_handler_unregister for WIFI_EVENT Failed!");
199-
return false;
228+
bool result{true};
229+
230+
if (evt_wifi_handle && esp_event_handler_instance_unregister(WIFI_EVENT, ESP_EVENT_ANY_ID, evt_wifi_handle)) {
231+
log_e("unregister for WIFI_EVENT Failed!");
232+
result = false;
200233
}
201234

202235
#if !CONFIG_ESP_WIFI_REMOTE_ENABLED
203-
if (esp_event_handler_unregister(SC_EVENT, ESP_EVENT_ANY_ID, &_arduino_event_cb)) {
204-
log_e("esp_event_handler_unregister for SC_EVENT Failed!");
205-
return false;
236+
if (evt_sc_handle && esp_event_handler_instance_unregister(SC_EVENT, ESP_EVENT_ANY_ID, evt_sc_handle)) {
237+
log_e("unregister for SC_EVENT Failed!");
238+
result = false;
206239
}
207240

208241
#if CONFIG_NETWORK_PROV_NETWORK_TYPE_WIFI
209-
if (esp_event_handler_unregister(NETWORK_PROV_EVENT, ESP_EVENT_ANY_ID, &_arduino_event_cb)) {
210-
log_e("esp_event_handler_unregister for NETWORK_PROV_EVENT Failed!");
211-
return false;
242+
if (evt_nprov_handle && esp_event_handler_instance_unregister(NETWORK_PROV_EVENT, ESP_EVENT_ANY_ID, evt_nprov_handle)) {
243+
log_e("unregister for NETWORK_PROV_EVENT Failed!");
244+
result = false;
212245
}
213246
#endif
214247
#endif
215248

216-
return true;
249+
return result;
217250
}
218251

219252
/*
@@ -350,9 +383,7 @@ static bool wifiLowLevelDeinit() {
350383
}
351384
lowLevelInitDone = !(esp_wifi_deinit() == ESP_OK);
352385
if (!lowLevelInitDone) {
353-
arduino_event_t arduino_event;
354-
arduino_event.event_id = ARDUINO_EVENT_WIFI_OFF;
355-
Network.postEvent(&arduino_event);
386+
Network.postEvent(ARDUINO_EVENT_WIFI_OFF);
356387
#if CONFIG_ESP_WIFI_REMOTE_ENABLED
357388
if (hosted_initialized && esp_hosted_deinit() == ESP_OK) {
358389
hosted_initialized = false;

0 commit comments

Comments
 (0)