Files
cute-handshake-capture/ESP32-C6-LCD-1.47-Demo/Arduino/examples/LVGL_Arduino/WiFi_Scanner.cpp
2026-03-17 20:07:32 -07:00

117 lines
2.6 KiB
C++

#include "WiFi_Scanner.h"
#include <WiFi.h>
#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 = "<hidden>";
}
int written = snprintf(
buffer + used,
buffer_len - used,
"%02d. %s\n",
i + 1,
ssid.c_str()
);
if (written < 0 || static_cast<size_t>(written) >= buffer_len - used) {
buffer[buffer_len - 1] = '\0';
return;
}
used += static_cast<size_t>(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();
}
}