@@ -59,6 +59,13 @@ extern "C" {
59
59
static esp_netif_t *esp_netifs[ESP_IF_MAX] = {NULL , NULL , NULL };
60
60
// a static handle for event callback
61
61
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
62
69
63
70
esp_netif_t *get_esp_interface_netif (esp_interface_t interface) {
64
71
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
71
78
arduino_event_t arduino_event;
72
79
arduino_event.event_id = ARDUINO_EVENT_ANY;
73
80
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
+ }
107
117
108
118
#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
+ }
129
146
130
147
#if CONFIG_NETWORK_PROV_NETWORK_TYPE_WIFI
131
- /*
148
+ /*
132
149
* 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
+ }
166
195
}
196
+ #endif // CONFIG_NETWORK_PROV_NETWORK_TYPE_WIFI
197
+ #endif // !CONFIG_ESP_WIFI_REMOTE_ENABLED
167
198
168
- if (arduino_event.event_id != ARDUINO_EVENT_ANY) {
169
- Network.postEvent (&arduino_event);
170
- }
199
+ Network.postEvent (&arduino_event);
171
200
}
172
201
173
202
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 ;
177
208
}
178
209
179
210
#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 ;
183
214
}
184
215
185
216
#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 ;
189
220
}
190
221
#endif
191
222
#endif
192
223
193
- return true ;
224
+ return result ;
194
225
}
195
226
196
227
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 ;
200
233
}
201
234
202
235
#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 ;
206
239
}
207
240
208
241
#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 ;
212
245
}
213
246
#endif
214
247
#endif
215
248
216
- return true ;
249
+ return result ;
217
250
}
218
251
219
252
/*
@@ -350,9 +383,7 @@ static bool wifiLowLevelDeinit() {
350
383
}
351
384
lowLevelInitDone = !(esp_wifi_deinit () == ESP_OK);
352
385
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);
356
387
#if CONFIG_ESP_WIFI_REMOTE_ENABLED
357
388
if (hosted_initialized && esp_hosted_deinit () == ESP_OK) {
358
389
hosted_initialized = false ;
0 commit comments