#include "WiFi_Scanner.h" #include #include "LVGL_Driver.h" #include "HandshakeCapture.h" namespace { constexpr unsigned long kScanIntervalMs = 15000; constexpr int kMaxVisibleNetworks = 20; unsigned long last_scan_ms = 0; void buildNetworkList(char *buffer, size_t buffer_len, int count) { buffer[0] = '\0'; if (count <= 0) { snprintf(buffer, buffer_len, "No networks found"); return; } int visible = count < kMaxVisibleNetworks ? count : kMaxVisibleNetworks; size_t used = 0; for (int i = 0; i < visible; ++i) { String ssid = WiFi.SSID(i); if (ssid.isEmpty()) { ssid = ""; } int written = snprintf( buffer + used, buffer_len - used, "%02d. %s\n", i + 1, ssid.c_str() ); if (written < 0 || static_cast(written) >= buffer_len - used) { buffer[buffer_len - 1] = '\0'; return; } used += static_cast(written); } if (count > visible && used < buffer_len) { snprintf(buffer + used, buffer_len - used, "...and %d more", count - visible); } } } void WiFiScanner_Init(void) { WiFi.mode(WIFI_STA); WiFi.disconnect(false, true); WiFi.setSleep(false); } void WiFiScanner_Refresh(void) { Ui_SetWifiStatus("Scanning..."); Ui_ClearNetworkList(); // Perform scan and sort by RSSI scanNetworksSortedByRSSI(); // Determine how many networks were found int count = 0; for (int i = 0; i < 20; i++) { if (networks[i].ssid.isEmpty()) break; count++; } static char status_text[64]; if (count <= 0) { snprintf(status_text, sizeof(status_text), "No networks found"); Ui_SetWifiStatus(status_text); WiFi.scanDelete(); last_scan_ms = millis(); return; } else { snprintf(status_text, sizeof(status_text), "%d network%s found", count, count == 1 ? "" : "s"); } // Add each network to UI for (int i = 0; i < count; i++) { char line[64]; snprintf(line, sizeof(line), "%02d. %s (%d) ch %d %s", i + 1, networks[i].ssid.c_str(), networks[i].rssi, networks[i].ch, networks[i].encryption.c_str()); Ui_AddNetwork(line, i); // Set color based on handshake captured status if (networks[i].handshake_captured) { Ui_SetNetworkColor(i, lv_palette_main(LV_PALETTE_RED)); } else { Ui_SetNetworkColor(i, lv_palette_main(LV_PALETTE_GREEN)); } } Ui_SetWifiStatus(status_text); WiFi.scanDelete(); last_scan_ms = millis(); } void WiFiScanner_Loop(void) { if (millis() - last_scan_ms >= kScanIntervalMs) { WiFiScanner_Refresh(); } }