networking: show correct strength for mesh networks (#21690)

* update seen network if higher strength

* keep in wifiManager

* more readable
pull/21755/head
sshane 4 years ago committed by GitHub
parent c7d75ffb5d
commit 1ada078857
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 22
      selfdrive/ui/qt/offroad/networking.cc
  2. 16
      selfdrive/ui/qt/offroad/wifiManager.cc
  3. 5
      selfdrive/ui/qt/offroad/wifiManager.h

@ -89,13 +89,11 @@ void Networking::connectToNetwork(const Network &n) {
} }
void Networking::wrongPassword(const QString &ssid) { void Networking::wrongPassword(const QString &ssid) {
for (Network n : wifi->seen_networks) { if (wifi->seenNetworks.contains(ssid)) {
if (n.ssid == ssid) { const Network &n = wifi->seenNetworks.value(ssid);
QString pass = InputDialog::getText("Wrong password", this, "for \"" + n.ssid +"\"", true, 8); QString pass = InputDialog::getText("Wrong password", this, "for \"" + n.ssid +"\"", true, 8);
if (!pass.isEmpty()) { if (!pass.isEmpty()) {
wifi->connect(n, pass); wifi->connect(n, pass);
}
return;
} }
} }
} }
@ -228,16 +226,18 @@ void WifiUI::refresh() {
// TODO: don't rebuild this every time // TODO: don't rebuild this every time
clearLayout(main_layout); clearLayout(main_layout);
if (wifi->seen_networks.size() == 0) { if (wifi->seenNetworks.size() == 0) {
QLabel *scanning = new QLabel("Scanning for networks..."); QLabel *scanning = new QLabel("Scanning for networks...");
scanning->setStyleSheet("font-size: 65px;"); scanning->setStyleSheet("font-size: 65px;");
main_layout->addWidget(scanning, 0, Qt::AlignCenter); main_layout->addWidget(scanning, 0, Qt::AlignCenter);
return; return;
} }
QList<Network> sortedNetworks = wifi->seenNetworks.values();
std::sort(sortedNetworks.begin(), sortedNetworks.end(), compare_by_strength);
// add networks // add networks
int i = 0; int i = 0;
for (Network &network : wifi->seen_networks) { for (Network &network : sortedNetworks) {
QHBoxLayout *hlayout = new QHBoxLayout; QHBoxLayout *hlayout = new QHBoxLayout;
hlayout->setContentsMargins(44, 0, 73, 0); hlayout->setContentsMargins(44, 0, 73, 0);
hlayout->setSpacing(50); hlayout->setSpacing(50);
@ -284,13 +284,13 @@ void WifiUI::refresh() {
// Strength indicator // Strength indicator
QLabel *strength = new QLabel(); 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); hlayout->addWidget(strength, 0, Qt::AlignRight);
main_layout->addLayout(hlayout); main_layout->addLayout(hlayout);
// Don't add the last horizontal line // 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); main_layout->addWidget(horizontal_line(), 0);
} }
i++; i++;

@ -78,8 +78,7 @@ void WifiManager::refreshNetworks() {
if (adapter.isEmpty()) { if (adapter.isEmpty()) {
return; return;
} }
seen_networks.clear(); seenNetworks.clear();
seen_ssids.clear();
ipv4_address = get_ipv4_address(); ipv4_address = get_ipv4_address();
QDBusInterface nm(NM_DBUS_SERVICE, adapter, NM_DBUS_INTERFACE_DEVICE_WIRELESS, bus); QDBusInterface nm(NM_DBUS_SERVICE, adapter, NM_DBUS_INTERFACE_DEVICE_WIRELESS, bus);
@ -87,11 +86,12 @@ void WifiManager::refreshNetworks() {
const QDBusReply<QList<QDBusObjectPath>> &response = nm.call("GetAllAccessPoints"); const QDBusReply<QList<QDBusObjectPath>> &response = nm.call("GetAllAccessPoints");
for (const QDBusObjectPath &path : response.value()) { for (const QDBusObjectPath &path : response.value()) {
QByteArray ssid = get_property(path.path(), "Ssid"); const QByteArray &ssid = get_property(path.path(), "Ssid");
if (ssid.isEmpty() || seen_ssids.contains(ssid)) { unsigned int strength = get_ap_strength(path.path());
if (ssid.isEmpty() || (seenNetworks.contains(ssid) &&
strength <= seenNetworks.value(ssid).strength)) {
continue; continue;
} }
unsigned int strength = get_ap_strength(path.path());
SecurityType security = getSecurityType(path.path()); SecurityType security = getSecurityType(path.path());
ConnectedType ctype; ConnectedType ctype;
QString activeSsid = (activeAp != "" && activeAp != "/") ? get_property(activeAp, "Ssid") : ""; QString activeSsid = (activeAp != "" && activeAp != "/") ? get_property(activeAp, "Ssid") : "";
@ -104,11 +104,9 @@ void WifiManager::refreshNetworks() {
ctype = ConnectedType::CONNECTED; ctype = ConnectedType::CONNECTED;
} }
} }
Network network = {path.path(), ssid, strength, ctype, security}; Network network = {ssid, strength, ctype, security};
seen_ssids.push_back(ssid); seenNetworks[ssid] = network;
seen_networks.push_back(network);
} }
std::sort(seen_networks.begin(), seen_networks.end(), compare_by_strength);
} }
QString WifiManager::get_ipv4_address() { QString WifiManager::get_ipv4_address() {

@ -26,12 +26,12 @@ typedef QMap<QString, QMap<QString, QVariant>> Connection;
typedef QVector<QMap<QString, QVariant>> IpConfig; typedef QVector<QMap<QString, QVariant>> IpConfig;
struct Network { struct Network {
QString path;
QByteArray ssid; QByteArray ssid;
unsigned int strength; unsigned int strength;
ConnectedType connected; ConnectedType connected;
SecurityType security_type; SecurityType security_type;
}; };
bool compare_by_strength(const Network &a, const Network &b);
class WifiManager : public QWidget { class WifiManager : public QWidget {
Q_OBJECT Q_OBJECT
@ -40,7 +40,7 @@ public:
explicit WifiManager(QWidget* parent); explicit WifiManager(QWidget* parent);
void requestScan(); void requestScan();
QVector<Network> seen_networks; QMap<QString, Network> seenNetworks;
QMap<QDBusObjectPath, QString> knownConnections; QMap<QDBusObjectPath, QString> knownConnections;
QString ipv4_address; QString ipv4_address;
@ -63,7 +63,6 @@ public:
QString getTetheringPassword(); QString getTetheringPassword();
private: private:
QVector<QByteArray> seen_ssids;
QString adapter; // Path to network manager wifi-device QString adapter; // Path to network manager wifi-device
QDBusConnection bus = QDBusConnection::systemBus(); QDBusConnection bus = QDBusConnection::systemBus();
unsigned int raw_adapter_state; // Connection status https://developer.gnome.org/NetworkManager/1.26/nm-dbus-types.html#NMDeviceState unsigned int raw_adapter_state; // Connection status https://developer.gnome.org/NetworkManager/1.26/nm-dbus-types.html#NMDeviceState

Loading…
Cancel
Save