#pragma once #include #include #include "app.h" #include "list_model.h" #include "network_list_view.h" #include "scan_log.h" #include "services/clock_service.h" #include "services/storage_service.h" #include "services/wifi_service.h" #include "signal_tracker.h" #include "ui/theme.h" namespace roro { // Wi-Fi diagnostics from ordinary scans: nearby access points (sortable, filterable, optionally // logged to CSV), how crowded each channel is, and a signal tracker. None of it interrupts the // connection or IRC, and none of it captures anyone's traffic. class WifiToolsApp : public App { public: WifiToolsApp(WifiService& wifi, StorageService& storage, ClockService& clock) : wifi_(wifi), storage_(storage), clock_(clock) {} void onEnter() override; void onExit() override; bool onKey(const KeyEvent& e) override; void update(uint32_t nowMs) override; void draw(Canvas& c) override; void help(std::vector& out) const override; const char* helpTitle() const override; private: enum class View { Menu, Networks, Channels, Tracker }; void open(View v); void refreshOrder(); void logScan(uint32_t nowMs); void drawNetworks(Canvas& c); void drawChannels(Canvas& c); void drawTracker(Canvas& c); WifiService& wifi_; StorageService& storage_; ClockService& clock_; View view_ = View::Menu; ListModel menu_{theme::kContent.h / theme::kLineHeight}; ListModel networks_{(theme::kContent.h - 14) / theme::kLineHeight}; std::vector order_; // indices into the scan, after sort and filter WifiSort sort_ = WifiSort::Signal; NetworkFilter filter_; uint32_t seenSeq_ = 0; uint32_t nextScanMs_ = 0; // Scan logging bool logging_ = false; ScanLogThrottle logThrottle_{30000}; std::string headerDate_; uint32_t loggedRows_ = 0; // Tracker std::string targetBssid_, targetName_; int targetChannel_ = 0; SignalTracker tracker_{110}; bool clicks_ = true; uint32_t nextClickMs_ = 0; }; } // namespace roro