orion-rf/firmware/wifi_scan.cpp

153 lines
3.1 KiB
C++

#include <Arduino.h>
#include <WiFi.h>
#include "display.h"
#include "buttons.h"
#define MAX_NETWORKS 30
struct WiFiNet {
String ssid;
int rssi;
int channel;
bool encrypted;
};
static WiFiNet networks[MAX_NETWORKS];
static int networkCount = 0;
static int selectedIndex = 0;
// ===== SCAN =====
void wifi_scan_start()
{
u8g2.clearBuffer();
u8g2.drawStr(10, 30, "Scanning WiFi...");
u8g2.sendBuffer();
WiFi.mode(WIFI_STA);
WiFi.disconnect();
delay(100);
int n = WiFi.scanNetworks();
networkCount = min(n, MAX_NETWORKS);
for (int i = 0; i < networkCount; i++)
{
networks[i].ssid = WiFi.SSID(i);
networks[i].rssi = WiFi.RSSI(i);
networks[i].channel = WiFi.channel(i);
networks[i].encrypted = (WiFi.encryptionType(i) != WIFI_AUTH_OPEN);
}
selectedIndex = 0;
}
// ===== DRAW =====
void wifi_scan_draw()
{
u8g2.clearBuffer();
if (networkCount == 0)
{
u8g2.drawStr(0, 30, "No networks");
u8g2.drawStr(0, 45, "Press BACK");
}
else
{
char counter[20];
sprintf(counter, "%d/%d", selectedIndex + 1, networkCount);
u8g2.setFont(u8g2_font_5x8_tr);
u8g2.drawStr(0, 8, counter);
u8g2.setFont(u8g2_font_6x10_tr);
for (int i = 0; i < 3; i++)
{
int idx = selectedIndex + i;
if (idx >= networkCount) break;
int y = 22 + i * 14;
if (i == 0)
{
u8g2.drawBox(0, y - 10, 128, 12);
u8g2.setDrawColor(0);
}
String text = networks[idx].ssid;
if (text.length() > 10)
text = text.substring(0, 10) + "..";
text += " (" + String(networks[idx].rssi) + ")";
u8g2.drawStr(2, y, text.c_str());
if (i == 0)
u8g2.setDrawColor(1);
}
}
u8g2.sendBuffer();
}
// ===== DETAILS =====
void wifi_drawDetails()
{
if (networkCount == 0) return;
WiFiNet &net = networks[selectedIndex];
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_5x8_tr);
u8g2.drawStr(0, 10, net.ssid.c_str());
char rssi[20];
sprintf(rssi, "RSSI: %d", net.rssi);
u8g2.drawStr(0, 20, rssi);
char ch[20];
sprintf(ch, "CH: %d", net.channel);
u8g2.drawStr(0, 30, ch);
u8g2.drawStr(0, 40, net.encrypted ? "Secured" : "Open");
u8g2.sendBuffer();
}
// ===== LOOP =====
void wifi_scan_loop()
{
static uint32_t lastPress = 0;
if (millis() - lastPress < 150)
return;
if (btnDown() && selectedIndex < networkCount - 1)
{
selectedIndex++;
wifi_scan_draw();
lastPress = millis();
}
else if (btnUp() && selectedIndex > 0)
{
selectedIndex--;
wifi_scan_draw();
lastPress = millis();
}
else if (btnSelect() && networkCount > 0)
{
wifi_drawDetails();
delay(3000);
wifi_scan_draw();
lastPress = millis();
}
// else if (btnBack())
// {
// wifi_scan_start();
// wifi_scan_draw();
// lastPress = millis();
// }
}