diff --git a/interface/src/app/status/NetworkStatus.tsx b/interface/src/app/status/NetworkStatus.tsx index 55112b295..70b2d70e5 100644 --- a/interface/src/app/status/NetworkStatus.tsx +++ b/interface/src/app/status/NetworkStatus.tsx @@ -94,6 +94,8 @@ const NetworkStatus = () => { const networkStatus = ({ status }: NetworkStatusType) => { switch (status) { + case NetworkConnectionStatus.ETHERNET_STATUS_CONNECTED: + return LL.CONNECTED(0) + ' (Ethernet)'; case NetworkConnectionStatus.WIFI_STATUS_NO_SHIELD: return LL.INACTIVE(1); case NetworkConnectionStatus.WIFI_STATUS_IDLE: @@ -101,13 +103,11 @@ const NetworkStatus = () => { case NetworkConnectionStatus.WIFI_STATUS_NO_SSID_AVAIL: return 'No SSID Available'; case NetworkConnectionStatus.WIFI_STATUS_CONNECTED: - return LL.CONNECTED(0) + ' (WiFi)'; - case NetworkConnectionStatus.ETHERNET_STATUS_CONNECTED: - return LL.CONNECTED(0) + ' (Ethernet)'; + return LL.CONNECTED(0) + ' (WiFi) (' + data.connect_count + ')'; case NetworkConnectionStatus.WIFI_STATUS_CONNECT_FAILED: - return LL.CONNECTED(1) + ' ' + LL.FAILED(0); + return LL.CONNECTED(1) + ' ' + LL.FAILED(0) + ' (' + data.connect_count + ')'; case NetworkConnectionStatus.WIFI_STATUS_CONNECTION_LOST: - return LL.CONNECTED(1) + ' ' + LL.LOST(); + return LL.CONNECTED(1) + ' ' + LL.LOST() + ' (' + data.connect_count + ')'; case NetworkConnectionStatus.WIFI_STATUS_DISCONNECTED: return LL.DISCONNECTED(); default: diff --git a/interface/src/types/network.ts b/interface/src/types/network.ts index d2f0512c0..e8d65b6cf 100644 --- a/interface/src/types/network.ts +++ b/interface/src/types/network.ts @@ -34,6 +34,7 @@ export interface NetworkStatusType { dns_ip_1: string; dns_ip_2: string; hostname: string; + connect_count: number; } export interface NetworkSettingsType { diff --git a/lib/framework/ESP8266React.h b/lib/framework/ESP8266React.h index 2c8dc7cc1..9e33ad992 100644 --- a/lib/framework/ESP8266React.h +++ b/lib/framework/ESP8266React.h @@ -66,6 +66,10 @@ class ESP8266React { return _apSettingsService.getAPNetworkStatus() == APNetworkStatus::ACTIVE; } + uint16_t getWifiConnects() { + return _networkSettingsService.getWifiConnects(); + } + private: SecuritySettingsService _securitySettingsService; NetworkSettingsService _networkSettingsService; diff --git a/lib/framework/NetworkSettingsService.cpp b/lib/framework/NetworkSettingsService.cpp index 6db003296..de525dd36 100644 --- a/lib/framework/NetworkSettingsService.cpp +++ b/lib/framework/NetworkSettingsService.cpp @@ -304,10 +304,14 @@ void NetworkSettingsService::WiFiEvent(WiFiEvent_t event, WiFiEventInfo_t info) break; case ARDUINO_EVENT_WIFI_STA_DISCONNECTED: - emsesp::EMSESP::logger().warning("WiFi disconnected. Reason: %s (%d)", + connectcount_++; // count the number of reconnects + emsesp::EMSESP::logger().warning("WiFi disconnected (#%d). Reason: %s (%d)", + connectcount_, disconnectReason(info.wifi_sta_disconnected.reason), info.wifi_sta_disconnected.reason); // IDF 4.0 emsesp::EMSESP::system_.has_ipv6(false); + + break; case ARDUINO_EVENT_WIFI_STA_GOT_IP: diff --git a/lib/framework/NetworkSettingsService.h b/lib/framework/NetworkSettingsService.h index 4f9b8d16b..dba52eb53 100644 --- a/lib/framework/NetworkSettingsService.h +++ b/lib/framework/NetworkSettingsService.h @@ -87,7 +87,6 @@ class NetworkSettings { static StateUpdateResult update(JsonObject root, NetworkSettings & settings); }; - class NetworkSettingsService : public StatefulService { public: NetworkSettingsService(AsyncWebServer * server, FS * fs, SecurityManager * securityManager); @@ -95,6 +94,10 @@ class NetworkSettingsService : public StatefulService { void begin(); void loop(); + uint16_t getWifiConnects() const { + return connectcount_; + } + private: HttpEndpoint _httpEndpoint; FSPersistence _fsPersistence; @@ -102,6 +105,8 @@ class NetworkSettingsService : public StatefulService { unsigned long _lastConnectionAttempt; bool _stopping; + uint16_t connectcount_ = 0; // number of wifi reconnects + void WiFiEvent(WiFiEvent_t event, WiFiEventInfo_t info); void mDNS_start() const; const char * disconnectReason(uint8_t code); diff --git a/lib/framework/NetworkStatus.cpp b/lib/framework/NetworkStatus.cpp index 8a78c18b5..ef1d78423 100644 --- a/lib/framework/NetworkStatus.cpp +++ b/lib/framework/NetworkStatus.cpp @@ -60,12 +60,13 @@ void NetworkStatus::networkStatus(AsyncWebServerRequest * request) { #else root["local_ipv6"] = WiFi.linkLocalIPv6().toString(); #endif - root["mac_address"] = WiFi.macAddress(); - root["rssi"] = WiFi.RSSI(); - root["ssid"] = WiFi.SSID(); - root["bssid"] = WiFi.BSSIDstr(); - root["channel"] = WiFi.channel(); - root["subnet_mask"] = WiFi.subnetMask().toString(); + root["mac_address"] = WiFi.macAddress(); + root["rssi"] = WiFi.RSSI(); + root["ssid"] = WiFi.SSID(); + root["bssid"] = WiFi.BSSIDstr(); + root["channel"] = WiFi.channel(); + root["connect_count"] = emsesp::EMSESP::esp8266React.getWifiConnects(); + root["subnet_mask"] = WiFi.subnetMask().toString(); if (WiFi.gatewayIP() != INADDR_NONE) { root["gateway_ip"] = WiFi.gatewayIP().toString(); diff --git a/mock-api/rest_server.ts b/mock-api/rest_server.ts index d6b00e235..973be2fc2 100644 --- a/mock-api/rest_server.ts +++ b/mock-api/rest_server.ts @@ -368,7 +368,8 @@ const network_status = { gateway_ip: '10.10.10.1', dns_ip_1: '10.10.10.1', dns_ip_2: '0.0.0.0', - hostname: 'ems-esp' + hostname: 'ems-esp', + connect_count: 1 }; const list_networks = { networks: [