22
22
#include " dhcpserver/dhcpserver_options.h"
23
23
#include " esp_netif.h"
24
24
25
- // a static handle for event callback
26
- static network_event_handle_t evt_handle{0 };
27
-
28
25
esp_netif_t *get_esp_interface_netif (esp_interface_t interface);
29
26
30
27
static size_t _wifi_strncpy (char *dst, const char *src, size_t dst_len) {
@@ -75,101 +72,105 @@ static bool softap_config_equal(const wifi_config_t &lhs, const wifi_config_t &r
75
72
return true ;
76
73
}
77
74
78
- static APClass *_ap_network_if = NULL ;
79
-
80
- static esp_event_handler_instance_t _ap_ev_instance = NULL ;
81
- static void _ap_event_cb (void *arg, esp_event_base_t event_base, int32_t event_id, void *event_data) {
82
- if (event_base == WIFI_EVENT) {
83
- ((APClass *)arg)->_onApEvent (event_id, event_data);
84
- }
85
- }
86
-
87
- static void _onApArduinoEvent (arduino_event_t *ev) {
88
- if (_ap_network_if == NULL || ev->event_id < ARDUINO_EVENT_WIFI_AP_START || ev->event_id > ARDUINO_EVENT_WIFI_AP_GOT_IP6) {
75
+ void APClass::_onApArduinoEvent (arduino_event_id_t event, const arduino_event_info_t *info) {
76
+ if (event < ARDUINO_EVENT_WIFI_AP_START || event > ARDUINO_EVENT_WIFI_AP_GOT_IP6) {
89
77
return ;
90
78
}
91
- log_v (" Arduino AP Event: %d - %s" , ev-> event_id , NetworkEvents::eventName (ev-> event_id ));
92
- if (ev-> event_id == ARDUINO_EVENT_WIFI_AP_START) {
79
+ log_v (" Arduino AP Event: %d - %s" , event , NetworkEvents::eventName (event ));
80
+ if (event == ARDUINO_EVENT_WIFI_AP_START) {
93
81
#if CONFIG_LWIP_IPV6
94
- if (_ap_network_if-> getStatusBits () & ESP_NETIF_WANT_IP6_BIT) {
95
- esp_err_t err = esp_netif_create_ip6_linklocal (_ap_network_if-> netif ());
82
+ if (getStatusBits () & ESP_NETIF_WANT_IP6_BIT) {
83
+ esp_err_t err = esp_netif_create_ip6_linklocal (netif ());
96
84
if (err != ESP_OK) {
97
85
log_e (" Failed to enable IPv6 Link Local on AP: 0x%x: %s" , err, esp_err_to_name (err));
98
86
} else {
99
- log_v (" Enabled IPv6 Link Local on %s" , _ap_network_if-> desc ());
87
+ log_v (" Enabled IPv6 Link Local on %s" , desc ());
100
88
}
101
89
}
102
90
#endif
103
91
}
104
92
}
105
93
106
94
void APClass::_onApEvent (int32_t event_id, void *event_data) {
107
- arduino_event_t arduino_event;
108
- arduino_event.event_id = ARDUINO_EVENT_ANY;
109
-
110
- if (event_id == WIFI_EVENT_AP_START) {
111
- log_v (" AP Started" );
112
- arduino_event.event_id = ARDUINO_EVENT_WIFI_AP_START;
113
- setStatusBits (ESP_NETIF_STARTED_BIT);
114
- } else if (event_id == WIFI_EVENT_AP_STOP) {
115
- log_v (" AP Stopped" );
116
- arduino_event.event_id = ARDUINO_EVENT_WIFI_AP_STOP;
117
- clearStatusBits (ESP_NETIF_STARTED_BIT | ESP_NETIF_CONNECTED_BIT | ESP_NETIF_HAS_IP_BIT | ESP_NETIF_HAS_LOCAL_IP6_BIT | ESP_NETIF_HAS_GLOBAL_IP6_BIT);
118
- } else if (event_id == WIFI_EVENT_AP_PROBEREQRECVED) {
119
- #if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_VERBOSE
120
- wifi_event_ap_probe_req_rx_t *event = (wifi_event_ap_probe_req_rx_t *)event_data;
121
- log_v (" AP Probe Request: RSSI: %d, MAC: " MACSTR, event->rssi , MAC2STR (event->mac ));
122
- #endif
123
- arduino_event.event_id = ARDUINO_EVENT_WIFI_AP_PROBEREQRECVED;
124
- memcpy (&arduino_event.event_info .wifi_ap_probereqrecved , event_data, sizeof (wifi_event_ap_probe_req_rx_t ));
125
- } else if (event_id == WIFI_EVENT_AP_STACONNECTED) {
126
- #if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_VERBOSE
127
- wifi_event_ap_staconnected_t *event = (wifi_event_ap_staconnected_t *)event_data;
128
- log_v (" AP Station Connected: MAC: " MACSTR " , AID: %d" , MAC2STR (event->mac ), event->aid );
129
- #endif
130
- arduino_event.event_id = ARDUINO_EVENT_WIFI_AP_STACONNECTED;
131
- memcpy (&arduino_event.event_info .wifi_ap_staconnected , event_data, sizeof (wifi_event_ap_staconnected_t ));
132
- setStatusBits (ESP_NETIF_CONNECTED_BIT);
133
- } else if (event_id == WIFI_EVENT_AP_STADISCONNECTED) {
134
- #if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_VERBOSE
135
- wifi_event_ap_stadisconnected_t *event = (wifi_event_ap_stadisconnected_t *)event_data;
136
- log_v (" AP Station Disconnected: MAC: " MACSTR " , AID: %d" , MAC2STR (event->mac ), event->aid );
137
- #endif
138
- arduino_event.event_id = ARDUINO_EVENT_WIFI_AP_STADISCONNECTED;
139
- memcpy (&arduino_event.event_info .wifi_ap_stadisconnected , event_data, sizeof (wifi_event_ap_stadisconnected_t ));
140
- // If no more clients are left
141
- wifi_sta_list_t clients;
142
- if (esp_wifi_ap_get_sta_list (&clients) != ESP_OK || clients.num == 0 ) {
143
- clearStatusBits (ESP_NETIF_CONNECTED_BIT);
95
+ switch (event_id){
96
+ case WIFI_EVENT_AP_START :
97
+ log_v (" AP Started" );
98
+ setStatusBits (ESP_NETIF_STARTED_BIT);
99
+ Network.postEvent (ARDUINO_EVENT_WIFI_AP_START);
100
+ return ;
101
+ case WIFI_EVENT_AP_STOP :
102
+ log_v (" AP Stopped" );
103
+ clearStatusBits (ESP_NETIF_STARTED_BIT | ESP_NETIF_CONNECTED_BIT | ESP_NETIF_HAS_IP_BIT | ESP_NETIF_HAS_LOCAL_IP6_BIT | ESP_NETIF_HAS_GLOBAL_IP6_BIT);
104
+ Network.postEvent (ARDUINO_EVENT_WIFI_AP_STOP);
105
+ return ;
106
+ case WIFI_EVENT_AP_PROBEREQRECVED : {
107
+ #if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_VERBOSE
108
+ wifi_event_ap_probe_req_rx_t *event = (wifi_event_ap_probe_req_rx_t *)event_data;
109
+ log_v (" AP Probe Request: RSSI: %d, MAC: " MACSTR, event->rssi , MAC2STR (event->mac ));
110
+ #endif
111
+ arduino_event_info_t i;
112
+ memcpy (&i.wifi_ap_probereqrecved , event_data, sizeof (wifi_event_ap_probe_req_rx_t ));
113
+ Network.postEvent (ARDUINO_EVENT_WIFI_AP_PROBEREQRECVED, &i);
114
+ return ;
144
115
}
145
- } else {
146
- return ;
147
- }
148
-
149
- if (arduino_event.event_id != ARDUINO_EVENT_ANY) {
150
- Network.postEvent (&arduino_event);
116
+ case WIFI_EVENT_AP_STACONNECTED : {
117
+ #if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_VERBOSE
118
+ wifi_event_ap_staconnected_t *event = (wifi_event_ap_staconnected_t *)event_data;
119
+ log_v (" AP Station Connected: MAC: " MACSTR " , AID: %d" , MAC2STR (event->mac ), event->aid );
120
+ #endif
121
+ setStatusBits (ESP_NETIF_CONNECTED_BIT);
122
+ arduino_event_info_t i;
123
+ memcpy (&i.wifi_ap_staconnected , event_data, sizeof (wifi_event_ap_staconnected_t ));
124
+ Network.postEvent (ARDUINO_EVENT_WIFI_AP_STACONNECTED, &i);
125
+ return ;
126
+ }
127
+ case WIFI_EVENT_AP_STADISCONNECTED : {
128
+ #if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_VERBOSE
129
+ wifi_event_ap_stadisconnected_t *event = (wifi_event_ap_stadisconnected_t *)event_data;
130
+ log_v (" AP Station Disconnected: MAC: " MACSTR " , AID: %d" , MAC2STR (event->mac ), event->aid );
131
+ #endif
132
+ // If no more clients are left
133
+ wifi_sta_list_t clients;
134
+ if (esp_wifi_ap_get_sta_list (&clients) != ESP_OK || clients.num == 0 ) {
135
+ clearStatusBits (ESP_NETIF_CONNECTED_BIT);
136
+ }
137
+ arduino_event_info_t i;
138
+ memcpy (&i.wifi_ap_stadisconnected , event_data, sizeof (wifi_event_ap_stadisconnected_t ));
139
+ Network.postEvent (ARDUINO_EVENT_WIFI_AP_STADISCONNECTED, &i);
140
+ return ;
141
+ }
142
+ default :
143
+ return ;
151
144
}
152
145
}
153
146
154
- APClass::APClass () {
155
- _ap_network_if = this ;
156
- }
147
+ APClass::APClass () {}
157
148
158
149
APClass::~APClass () {
159
150
end ();
160
- _ap_network_if = NULL ;
161
- Network.removeEvent (evt_handle);
162
- evt_handle = 0 ;
151
+ Network.removeEvent (_evt_handle);
152
+ if (_ap_ev_instance != NULL ) {
153
+ esp_event_handler_instance_unregister (WIFI_EVENT, ESP_EVENT_ANY_ID, _ap_ev_instance);
154
+ _ap_ev_instance = NULL ;
155
+ }
163
156
}
164
157
165
158
bool APClass::onEnable () {
166
- if (_ap_ev_instance == NULL && esp_event_handler_instance_register (WIFI_EVENT, ESP_EVENT_ANY_ID, &_ap_event_cb, this , &_ap_ev_instance)) {
167
- log_e (" event_handler_instance_register for WIFI_EVENT Failed!" );
168
- return false ;
159
+ if (!_ap_ev_instance){
160
+ esp_err_t err = esp_event_handler_instance_register (WIFI_EVENT, ESP_EVENT_ANY_ID,
161
+ [](void * self, esp_event_base_t base, int32_t id, void * data) { static_cast <APClass*>(self)->_onApEvent (id, data); },
162
+ this ,
163
+ &_ap_ev_instance
164
+ );
165
+ if (err){
166
+ log_e (" event_handler_instance_register for WIFI_EVENT Failed!" );
167
+ return false ;
168
+ }
169
169
}
170
+
170
171
if (_esp_netif == NULL ) {
171
- if (!evt_handle )
172
- evt_handle = Network.onSysEvent (_onApArduinoEvent);
172
+ if (!_evt_handle )
173
+ _evt_handle = Network.onSysEvent ([ this ]( arduino_event_id_t event, const arduino_event_info_t *info){ _onApArduinoEvent (event, info);} );
173
174
_esp_netif = get_esp_interface_netif (ESP_IF_WIFI_AP);
174
175
/* attach to receive events */
175
176
initNetif (ESP_NETIF_ID_AP);
@@ -178,14 +179,14 @@ bool APClass::onEnable() {
178
179
}
179
180
180
181
bool APClass::onDisable () {
181
- Network.removeEvent (evt_handle );
182
- evt_handle = 0 ;
182
+ Network.removeEvent (_evt_handle );
183
+ _evt_handle = 0 ;
183
184
// we just set _esp_netif to NULL here, so destroyNetif() does not try to destroy it.
184
185
// That would be done by WiFi.enableAP(false) if STA is not enabled, or when it gets disabled
185
186
_esp_netif = NULL ;
186
187
destroyNetif ();
187
188
if (_ap_ev_instance != NULL ) {
188
- esp_event_handler_unregister (WIFI_EVENT, ESP_EVENT_ANY_ID, &_ap_event_cb );
189
+ esp_event_handler_instance_unregister (WIFI_EVENT, ESP_EVENT_ANY_ID, _ap_ev_instance );
189
190
_ap_ev_instance = NULL ;
190
191
}
191
192
return true ;
0 commit comments