M1 step 6: Wi-Fi Tools from ordinary scans

- lib/wifi (host-tested): channel occupancy (neighbour spill, signal
  weighting, quietest of 1/6/11) and a signal tracker (history, lost
  detection, click interval)
- WifiService: scan results carry BSSID, channel and security; a scan
  can target one channel for quick tracker refreshes; endListScans()
  turns the radio back off when Wi-Fi is disabled
- Wi-Fi Tools App: networks nearby, channel occupancy bars, signal
  tracker with clicks (m to mute)
- M1 plan: Monitoring-mode views and captures deferred

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EhqxQ49eCju4CzKYNjZzwT
This commit is contained in:
2026-10-02 16:33:11 +02:00
co-authored by Claude Opus 5.5
parent 076baa77d1
commit 4cd6a63498
11 changed files with 512 additions and 16 deletions
+6 -2
View File
@@ -73,7 +73,9 @@ bool WifiSettingsPage::onKey(const KeyEvent& e) {
}
case View::Scan: {
const auto& found = wifi_.listScan();
std::vector<ScanEntry> found;
for (auto& n : wifi_.listScan())
if (!n.ssid.empty()) found.push_back(n);
if (wifi_.listScanDone()) scan_.setCount(static_cast<int>(found.size()));
switch (e.key) {
case Key::Up: scan_.up(); break;
@@ -165,7 +167,9 @@ void WifiSettingsPage::draw(Canvas& c) {
widgets::textLines(c, {"Scanning..."}, 0, area);
break;
}
const auto& found = wifi_.listScan();
std::vector<ScanEntry> found;
for (auto& n : wifi_.listScan())
if (!n.ssid.empty()) found.push_back(n);
if (scan_.count() != static_cast<int>(found.size())) scan_.setCount(static_cast<int>(found.size()));
if (found.empty()) {
widgets::textLines(c, {"No networks found.", "", "`: back"}, 0, area);