diff --git a/src/graphics/Screen.cpp b/src/graphics/Screen.cpp index 64ff06e73..a108cd022 100644 --- a/src/graphics/Screen.cpp +++ b/src/graphics/Screen.cpp @@ -852,11 +852,11 @@ void DebugInfo::drawFrameWiFi(OLEDDisplay *display, OLEDDisplayUiState *state, i display->setTextAlignment(TEXT_ALIGN_LEFT); if (radioConfig.preferences.wifi_ap_mode) { - display->drawString(x, y, String("WiFi - Software AP")); + display->drawString(x, y, String("WiFi: Software AP")); } else if (WiFi.status() != WL_CONNECTED) { - display->drawString(x, y, String("WiFi - Not Connected")); + display->drawString(x, y, String("WiFi: Not Connected")); } else { - display->drawString(x, y, String("WiFi - Connected")); + display->drawString(x, y, String("WiFi: Connected")); display->drawString(x + SCREEN_WIDTH - display->getStringWidth("RSSI " + String(WiFi.RSSI())), y, "RSSI " + String(WiFi.RSSI())); @@ -864,20 +864,22 @@ void DebugInfo::drawFrameWiFi(OLEDDisplay *display, OLEDDisplayUiState *state, i /* - WL_CONNECTED: assigned when connected to a WiFi network; - WL_NO_SHIELD: assigned when no WiFi shield is present; - WL_IDLE_STATUS: it is a temporary status assigned when WiFi.begin() is called and remains active until the number of attempts expires (resulting in WL_CONNECT_FAILED) or a connection is established (resulting in WL_CONNECTED); - WL_NO_SSID_AVAIL: assigned when no SSID are available; - WL_SCAN_COMPLETED: assigned when the scan networks is completed; - WL_CONNECT_FAILED: assigned when the connection fails for all the attempts; - WL_CONNECTION_LOST: assigned when the connection is lost; - WL_DISCONNECTED: assigned when disconnected from a network; + - WL_IDLE_STATUS: it is a temporary status assigned when WiFi.begin() is called and remains active until the number of + attempts expires (resulting in WL_CONNECT_FAILED) or a connection is established (resulting in WL_CONNECTED); + - WL_SCAN_COMPLETED: assigned when the scan networks is completed; + - WL_NO_SHIELD: assigned when no WiFi shield is present; + */ if (WiFi.status() == WL_CONNECTED) { if (radioConfig.preferences.wifi_ap_mode) { - display->drawString(x, y + FONT_HEIGHT * 1, "IP " + String(WiFi.softAPIP().toString().c_str())); + display->drawString(x, y + FONT_HEIGHT * 1, "IP: " + String(WiFi.softAPIP().toString().c_str())); } else { - display->drawString(x, y + FONT_HEIGHT * 1, "IP " + String(WiFi.localIP().toString().c_str())); + display->drawString(x, y + FONT_HEIGHT * 1, "IP: " + String(WiFi.localIP().toString().c_str())); } } else if (WiFi.status() == WL_NO_SSID_AVAIL) { display->drawString(x, y + FONT_HEIGHT * 1, "SSID Not Found"); @@ -887,12 +889,74 @@ void DebugInfo::drawFrameWiFi(OLEDDisplay *display, OLEDDisplayUiState *state, i display->drawString(x, y + FONT_HEIGHT * 1, "Connection Failed"); } else if (WiFi.status() == WL_DISCONNECTED) { display->drawString(x, y + FONT_HEIGHT * 1, "Disconnected"); + } else if (WiFi.status() == WL_IDLE_STATUS) { + display->drawString(x, y + FONT_HEIGHT * 1, "Idle ... Reconnecting"); } else { - display->drawString(x, y + FONT_HEIGHT * 1, "Unknown Status"); + // Codes: + // https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/wifi.html#wi-fi-reason-code + if (getWifiDisconnectReason() == 2) { + display->drawString(x, y + FONT_HEIGHT * 1, "Authentication Invalid"); + } else if (getWifiDisconnectReason() == 3) { + display->drawString(x, y + FONT_HEIGHT * 1, "De-authenticated"); + } else if (getWifiDisconnectReason() == 4) { + display->drawString(x, y + FONT_HEIGHT * 1, "Disassociated Expired"); + } else if (getWifiDisconnectReason() == 5) { + display->drawString(x, y + FONT_HEIGHT * 1, "AP - Too Many Clients"); + } else if (getWifiDisconnectReason() == 6) { + display->drawString(x, y + FONT_HEIGHT * 1, "NOT_AUTHED"); + } else if (getWifiDisconnectReason() == 7) { + display->drawString(x, y + FONT_HEIGHT * 1, "NOT_ASSOCED"); + } else if (getWifiDisconnectReason() == 8) { + display->drawString(x, y + FONT_HEIGHT * 1, "Disassociated"); + } else if (getWifiDisconnectReason() == 9) { + display->drawString(x, y + FONT_HEIGHT * 1, "ASSOC_NOT_AUTHED"); + } else if (getWifiDisconnectReason() == 10) { + display->drawString(x, y + FONT_HEIGHT * 1, "DISASSOC_PWRCAP_BAD"); + } else if (getWifiDisconnectReason() == 11) { + display->drawString(x, y + FONT_HEIGHT * 1, "DISASSOC_SUPCHAN_BAD"); + } else if (getWifiDisconnectReason() == 13) { + display->drawString(x, y + FONT_HEIGHT * 1, "IE_INVALID"); + } else if (getWifiDisconnectReason() == 14) { + display->drawString(x, y + FONT_HEIGHT * 1, "MIC_FAILURE"); + } else if (getWifiDisconnectReason() == 15) { + display->drawString(x, y + FONT_HEIGHT * 1, "4WAY_HANDSHAKE_TIMEOUT"); + } else if (getWifiDisconnectReason() == 16) { + display->drawString(x, y + FONT_HEIGHT * 1, "GROUP_KEY_UPDATE_TIMEOUT"); + } else if (getWifiDisconnectReason() == 17) { + display->drawString(x, y + FONT_HEIGHT * 1, "IE_IN_4WAY_DIFFERS"); + } else if (getWifiDisconnectReason() == 18) { + display->drawString(x, y + FONT_HEIGHT * 1, "Invalid Group Cipher"); + } else if (getWifiDisconnectReason() == 19) { + display->drawString(x, y + FONT_HEIGHT * 1, "Invalid Pairwise Cipher"); + } else if (getWifiDisconnectReason() == 20) { + display->drawString(x, y + FONT_HEIGHT * 1, "AKMP_INVALID"); + } else if (getWifiDisconnectReason() == 21) { + display->drawString(x, y + FONT_HEIGHT * 1, "UNSUPP_RSN_IE_VERSION"); + } else if (getWifiDisconnectReason() == 22) { + display->drawString(x, y + FONT_HEIGHT * 1, "INVALID_RSN_IE_CAP"); + } else if (getWifiDisconnectReason() == 23) { + display->drawString(x, y + FONT_HEIGHT * 1, "802_1X_AUTH_FAILED"); + } else if (getWifiDisconnectReason() == 24) { + display->drawString(x, y + FONT_HEIGHT * 1, "CIPHER_SUITE_REJECTED"); + } else if (getWifiDisconnectReason() == 200) { + display->drawString(x, y + FONT_HEIGHT * 1, "BEACON_TIMEOUT"); + } else if (getWifiDisconnectReason() == 201) { + display->drawString(x, y + FONT_HEIGHT * 1, "NO_AP_FOUND"); + } else if (getWifiDisconnectReason() == 202) { + display->drawString(x, y + FONT_HEIGHT * 1, "AUTH_FAIL"); + } else if (getWifiDisconnectReason() == 203) { + display->drawString(x, y + FONT_HEIGHT * 1, "ASSOC_FAIL"); + } else if (getWifiDisconnectReason() == 204) { + display->drawString(x, y + FONT_HEIGHT * 1, "HANDSHAKE_TIMEOUT"); + } else if (getWifiDisconnectReason() == 205) { + display->drawString(x, y + FONT_HEIGHT * 1, "CONNECTION_FAIL"); + } else { + display->drawString(x, y + FONT_HEIGHT * 1, "Unknown Status"); + } } - display->drawString(x, y + FONT_HEIGHT * 2, "SSID " + String(wifiName)); - display->drawString(x, y + FONT_HEIGHT * 3, "PWD " + String(wifiPsw)); + display->drawString(x, y + FONT_HEIGHT * 2, "SSID: " + String(wifiName)); + display->drawString(x, y + FONT_HEIGHT * 3, "PWD: " + String(wifiPsw)); /* Display a heartbeat pixel that blinks every time the frame is redrawn */ #ifdef SHOW_REDRAWS diff --git a/src/meshwifi/meshwifi.cpp b/src/meshwifi/meshwifi.cpp index 1e86e4d66..ad8a88fa2 100644 --- a/src/meshwifi/meshwifi.cpp +++ b/src/meshwifi/meshwifi.cpp @@ -8,10 +8,13 @@ #include static void WiFiEvent(WiFiEvent_t event); +// static void WiFiEvent(WiFiEvent_t event, WiFiEventInfo_t info); DNSServer dnsServer; static WiFiServerPort *apiPort; +uint8_t wifiDisconnectReason = 0; + bool isWifiAvailable() { const char *wifiName = radioConfig.preferences.wifi_ssid; @@ -86,6 +89,14 @@ void initWifi() WiFi.onEvent(WiFiEvent); // esp_wifi_set_ps(WIFI_PS_NONE); // Disable power saving + WiFiEventId_t eventID = WiFi.onEvent( + [](WiFiEvent_t event, WiFiEventInfo_t info) { + Serial.print("\n-------------- WiFi lost connection. Reason: "); + Serial.println(info.disconnected.reason); + // wifiDisconnectReason = info.disconnected.reason; + }, + WiFiEvent_t::SYSTEM_EVENT_STA_DISCONNECTED); + DEBUG_MSG("JOINING WIFI: ssid=%s\n", wifiName); if (WiFi.begin(wifiName, wifiPsw) == WL_CONNECTED) { DEBUG_MSG("MY IP ADDRESS: %s\n", WiFi.localIP().toString().c_str()); @@ -114,7 +125,6 @@ static void initApiServer() apiPort->init(); } } - static void WiFiEvent(WiFiEvent_t event) { DEBUG_MSG("************ [WiFi-event] event: %d ************\n", event); @@ -237,4 +247,9 @@ void reconnectWiFi() WiFi.begin(wifiName, wifiPsw); } } +} + +uint8_t getWifiDisconnectReason() +{ + return wifiDisconnectReason; } \ No newline at end of file diff --git a/src/meshwifi/meshwifi.h b/src/meshwifi/meshwifi.h index 8898c0ad8..d38b2a41e 100644 --- a/src/meshwifi/meshwifi.h +++ b/src/meshwifi/meshwifi.h @@ -20,3 +20,5 @@ bool isWifiAvailable(); void handleDNSResponse(); void reconnectWiFi(); + +uint8_t getWifiDisconnectReason(); \ No newline at end of file