117 lines
2.6 KiB
C++
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();
|
|
}
|
|
}
|