From 1ada078857cc3de28c8013a3c2994d680338f274 Mon Sep 17 00:00:00 2001 From: sshane Date: Wed, 28 Jul 2021 15:03:41 -0700 Subject: [PATCH] networking: show correct strength for mesh networks (#21690) * update seen network if higher strength * keep in wifiManager * more readable --- selfdrive/ui/qt/offroad/networking.cc | 22 +++++++++++----------- selfdrive/ui/qt/offroad/wifiManager.cc | 16 +++++++--------- selfdrive/ui/qt/offroad/wifiManager.h | 5 ++--- 3 files changed, 20 insertions(+), 23 deletions(-) diff --git a/selfdrive/ui/qt/offroad/networking.cc b/selfdrive/ui/qt/offroad/networking.cc index 75304d7ae2..bba6b213bc 100644 --- a/selfdrive/ui/qt/offroad/networking.cc +++ b/selfdrive/ui/qt/offroad/networking.cc @@ -89,13 +89,11 @@ void Networking::connectToNetwork(const Network &n) { } void Networking::wrongPassword(const QString &ssid) { - for (Network n : wifi->seen_networks) { - if (n.ssid == ssid) { - QString pass = InputDialog::getText("Wrong password", this, "for \"" + n.ssid +"\"", true, 8); - if (!pass.isEmpty()) { - wifi->connect(n, pass); - } - return; + if (wifi->seenNetworks.contains(ssid)) { + const Network &n = wifi->seenNetworks.value(ssid); + QString pass = InputDialog::getText("Wrong password", this, "for \"" + n.ssid +"\"", true, 8); + if (!pass.isEmpty()) { + wifi->connect(n, pass); } } } @@ -228,16 +226,18 @@ void WifiUI::refresh() { // TODO: don't rebuild this every time clearLayout(main_layout); - if (wifi->seen_networks.size() == 0) { + if (wifi->seenNetworks.size() == 0) { QLabel *scanning = new QLabel("Scanning for networks..."); scanning->setStyleSheet("font-size: 65px;"); main_layout->addWidget(scanning, 0, Qt::AlignCenter); return; } + QList sortedNetworks = wifi->seenNetworks.values(); + std::sort(sortedNetworks.begin(), sortedNetworks.end(), compare_by_strength); // add networks int i = 0; - for (Network &network : wifi->seen_networks) { + for (Network &network : sortedNetworks) { QHBoxLayout *hlayout = new QHBoxLayout; hlayout->setContentsMargins(44, 0, 73, 0); hlayout->setSpacing(50); @@ -284,13 +284,13 @@ void WifiUI::refresh() { // Strength indicator QLabel *strength = new QLabel(); - strength->setPixmap(strengths[std::clamp((int)network.strength/26, 0, 3)]); + strength->setPixmap(strengths[std::clamp((int)round(network.strength / 33.), 0, 3)]); hlayout->addWidget(strength, 0, Qt::AlignRight); main_layout->addLayout(hlayout); // Don't add the last horizontal line - if (i+1 < wifi->seen_networks.size()) { + if (i+1 < wifi->seenNetworks.size()) { main_layout->addWidget(horizontal_line(), 0); } i++; diff --git a/selfdrive/ui/qt/offroad/wifiManager.cc b/selfdrive/ui/qt/offroad/wifiManager.cc index ec0bc1f654..f0ca79a06d 100644 --- a/selfdrive/ui/qt/offroad/wifiManager.cc +++ b/selfdrive/ui/qt/offroad/wifiManager.cc @@ -78,8 +78,7 @@ void WifiManager::refreshNetworks() { if (adapter.isEmpty()) { return; } - seen_networks.clear(); - seen_ssids.clear(); + seenNetworks.clear(); ipv4_address = get_ipv4_address(); QDBusInterface nm(NM_DBUS_SERVICE, adapter, NM_DBUS_INTERFACE_DEVICE_WIRELESS, bus); @@ -87,11 +86,12 @@ void WifiManager::refreshNetworks() { const QDBusReply> &response = nm.call("GetAllAccessPoints"); for (const QDBusObjectPath &path : response.value()) { - QByteArray ssid = get_property(path.path(), "Ssid"); - if (ssid.isEmpty() || seen_ssids.contains(ssid)) { + const QByteArray &ssid = get_property(path.path(), "Ssid"); + unsigned int strength = get_ap_strength(path.path()); + if (ssid.isEmpty() || (seenNetworks.contains(ssid) && + strength <= seenNetworks.value(ssid).strength)) { continue; } - unsigned int strength = get_ap_strength(path.path()); SecurityType security = getSecurityType(path.path()); ConnectedType ctype; QString activeSsid = (activeAp != "" && activeAp != "/") ? get_property(activeAp, "Ssid") : ""; @@ -104,11 +104,9 @@ void WifiManager::refreshNetworks() { ctype = ConnectedType::CONNECTED; } } - Network network = {path.path(), ssid, strength, ctype, security}; - seen_ssids.push_back(ssid); - seen_networks.push_back(network); + Network network = {ssid, strength, ctype, security}; + seenNetworks[ssid] = network; } - std::sort(seen_networks.begin(), seen_networks.end(), compare_by_strength); } QString WifiManager::get_ipv4_address() { diff --git a/selfdrive/ui/qt/offroad/wifiManager.h b/selfdrive/ui/qt/offroad/wifiManager.h index e0ee86f109..191a4c3008 100644 --- a/selfdrive/ui/qt/offroad/wifiManager.h +++ b/selfdrive/ui/qt/offroad/wifiManager.h @@ -26,12 +26,12 @@ typedef QMap> Connection; typedef QVector> IpConfig; struct Network { - QString path; QByteArray ssid; unsigned int strength; ConnectedType connected; SecurityType security_type; }; +bool compare_by_strength(const Network &a, const Network &b); class WifiManager : public QWidget { Q_OBJECT @@ -40,7 +40,7 @@ public: explicit WifiManager(QWidget* parent); void requestScan(); - QVector seen_networks; + QMap seenNetworks; QMap knownConnections; QString ipv4_address; @@ -63,7 +63,6 @@ public: QString getTetheringPassword(); private: - QVector seen_ssids; QString adapter; // Path to network manager wifi-device QDBusConnection bus = QDBusConnection::systemBus(); unsigned int raw_adapter_state; // Connection status https://developer.gnome.org/NetworkManager/1.26/nm-dbus-types.html#NMDeviceState