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) {
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<Network> 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++;

@ -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<QList<QDBusObjectPath>> &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() {

@ -26,12 +26,12 @@ typedef QMap<QString, QMap<QString, QVariant>> Connection;
typedef QVector<QMap<QString, QVariant>> 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<Network> seen_networks;
QMap<QString, Network> seenNetworks;
QMap<QDBusObjectPath, QString> knownConnections;
QString ipv4_address;
@ -63,7 +63,6 @@ public:
QString getTetheringPassword();
private:
QVector<QByteArray> 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

Loading…
Cancel
Save