/** * callback for WiFi events * @param arg */ void ESP8266WiFiGenericClass::_eventCallback(void* arg) { System_Event_t* event = reinterpret_cast<System_Event_t*>(arg); DEBUG_WIFI("wifi evt: %d\n", event->event); if(event->event == EVENT_STAMODE_DISCONNECTED) { DEBUG_WIFI("STA disconnect: %d\n", event->event_info.disconnected.reason); WiFiClient::stopAll(); } for(uint32_t i = 0; i < cbEventList.size(); i++) { WiFiEventCbList_t entry = cbEventList[i]; if(entry.cb) { if(entry.event == (WiFiEvent_t) event->event || entry.event == WIFI_EVENT_MAX) { entry.cb((WiFiEvent_t) event->event); } } } }
esp_err_t WiFiGenericClass::_eventCallback(void *arg, system_event_t *event) { log_d("Event: %d - %s", event->event_id, system_event_names[event->event_id]); if(event->event_id == SYSTEM_EVENT_SCAN_DONE) { WiFiScanClass::_scanDone(); } else if(event->event_id == SYSTEM_EVENT_STA_START) { WiFiSTAClass::_setStatus(WL_DISCONNECTED); setStatusBits(STA_STARTED_BIT); } else if(event->event_id == SYSTEM_EVENT_STA_STOP) { WiFiSTAClass::_setStatus(WL_NO_SHIELD); clearStatusBits(STA_STARTED_BIT | STA_CONNECTED_BIT | STA_HAS_IP_BIT | STA_HAS_IP6_BIT); } else if(event->event_id == SYSTEM_EVENT_STA_CONNECTED) { WiFiSTAClass::_setStatus(WL_IDLE_STATUS); setStatusBits(STA_CONNECTED_BIT); } else if(event->event_id == SYSTEM_EVENT_STA_DISCONNECTED) { uint8_t reason = event->event_info.disconnected.reason; log_w("Reason: %u - %s", reason, reason2str(reason)); if(reason == WIFI_REASON_NO_AP_FOUND) { WiFiSTAClass::_setStatus(WL_NO_SSID_AVAIL); } else if(reason == WIFI_REASON_AUTH_FAIL || reason == WIFI_REASON_ASSOC_FAIL) { WiFiSTAClass::_setStatus(WL_CONNECT_FAILED); } else if(reason == WIFI_REASON_BEACON_TIMEOUT || reason == WIFI_REASON_HANDSHAKE_TIMEOUT) { WiFiSTAClass::_setStatus(WL_CONNECTION_LOST); } else if(reason == WIFI_REASON_AUTH_EXPIRE) { } else { WiFiSTAClass::_setStatus(WL_DISCONNECTED); } clearStatusBits(STA_CONNECTED_BIT | STA_HAS_IP_BIT | STA_HAS_IP6_BIT); if(((reason == WIFI_REASON_AUTH_EXPIRE) || (reason >= WIFI_REASON_BEACON_TIMEOUT && reason != WIFI_REASON_AUTH_FAIL)) && WiFi.getAutoReconnect()) { WiFi.disconnect(true); WiFi.begin(); } } else if(event->event_id == SYSTEM_EVENT_STA_GOT_IP) { #if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_DEBUG uint8_t * ip = (uint8_t *)&(event->event_info.got_ip.ip_info.ip.addr); uint8_t * mask = (uint8_t *)&(event->event_info.got_ip.ip_info.netmask.addr); uint8_t * gw = (uint8_t *)&(event->event_info.got_ip.ip_info.gw.addr); log_d("STA IP: %u.%u.%u.%u, MASK: %u.%u.%u.%u, GW: %u.%u.%u.%u", ip[0], ip[1], ip[2], ip[3], mask[0], mask[1], mask[2], mask[3], gw[0], gw[1], gw[2], gw[3]); #endif WiFiSTAClass::_setStatus(WL_CONNECTED); setStatusBits(STA_HAS_IP_BIT | STA_CONNECTED_BIT); } else if(event->event_id == SYSTEM_EVENT_STA_LOST_IP) { WiFiSTAClass::_setStatus(WL_IDLE_STATUS); clearStatusBits(STA_HAS_IP_BIT); } else if(event->event_id == SYSTEM_EVENT_AP_START) { setStatusBits(AP_STARTED_BIT); } else if(event->event_id == SYSTEM_EVENT_AP_STOP) { clearStatusBits(AP_STARTED_BIT | AP_HAS_CLIENT_BIT); } else if(event->event_id == SYSTEM_EVENT_AP_STACONNECTED) { setStatusBits(AP_HAS_CLIENT_BIT); } else if(event->event_id == SYSTEM_EVENT_AP_STADISCONNECTED) { wifi_sta_list_t clients; if(esp_wifi_ap_get_sta_list(&clients) != ESP_OK || !clients.num){ clearStatusBits(AP_HAS_CLIENT_BIT); } } else if(event->event_id == SYSTEM_EVENT_ETH_START) { setStatusBits(ETH_STARTED_BIT); } else if(event->event_id == SYSTEM_EVENT_ETH_STOP) { clearStatusBits(ETH_STARTED_BIT | ETH_CONNECTED_BIT | ETH_HAS_IP_BIT | ETH_HAS_IP6_BIT); } else if(event->event_id == SYSTEM_EVENT_ETH_CONNECTED) { setStatusBits(ETH_CONNECTED_BIT); } else if(event->event_id == SYSTEM_EVENT_ETH_DISCONNECTED) { clearStatusBits(ETH_CONNECTED_BIT | ETH_HAS_IP_BIT | ETH_HAS_IP6_BIT); } else if(event->event_id == SYSTEM_EVENT_ETH_GOT_IP) { #if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_DEBUG uint8_t * ip = (uint8_t *)&(event->event_info.got_ip.ip_info.ip.addr); uint8_t * mask = (uint8_t *)&(event->event_info.got_ip.ip_info.netmask.addr); uint8_t * gw = (uint8_t *)&(event->event_info.got_ip.ip_info.gw.addr); log_d("ETH IP: %u.%u.%u.%u, MASK: %u.%u.%u.%u, GW: %u.%u.%u.%u", ip[0], ip[1], ip[2], ip[3], mask[0], mask[1], mask[2], mask[3], gw[0], gw[1], gw[2], gw[3]); #endif setStatusBits(ETH_CONNECTED_BIT | ETH_HAS_IP_BIT); } else if(event->event_id == SYSTEM_EVENT_GOT_IP6) { if(event->event_info.got_ip6.if_index == TCPIP_ADAPTER_IF_AP){ setStatusBits(AP_HAS_IP6_BIT); } else if(event->event_info.got_ip6.if_index == TCPIP_ADAPTER_IF_STA){ setStatusBits(STA_CONNECTED_BIT | STA_HAS_IP6_BIT); } else if(event->event_info.got_ip6.if_index == TCPIP_ADAPTER_IF_ETH){ setStatusBits(ETH_CONNECTED_BIT | ETH_HAS_IP6_BIT); } } for(uint32_t i = 0; i < cbEventList.size(); i++) { WiFiEventCbList_t entry = cbEventList[i]; if(entry.cb || entry.fcb || entry.scb) { if(entry.event == (system_event_id_t) event->event_id || entry.event == SYSTEM_EVENT_MAX) { if(entry.cb) { entry.cb((system_event_id_t) event->event_id); } else if(entry.fcb) { entry.fcb((system_event_id_t) event->event_id, (system_event_info_t) event->event_info); } else { entry.scb(event); } } } } return ESP_OK; }