Scan for networks on UI init (#21310)

* refresh on UI init

* scan and wait for signal from networkmanager to update

* fixes incorrectPassword never triggering on known connections

* Update UI on connect state change

* pause timer on leaving networking

* no need to update adapter state on init

* uses AccessPoints signal

clean up

clean up

* Revert "uses AccessPoints signal"

This reverts commit 534219857a10dc200f979e1a66705ac13ca68698.

* perform non-blocking scan on first start only

* suggestions

* forgetNetwork already checks this

* Prevent double refresh on connect interaction and revert timer change

* Should fix nm is inactive error

* Revert "Should fix nm is inactive error"

This reverts commit 36a7ad098b713ae7e17cf1a8d717455ecdd29e2b.

* Fixup original timer code. could be cleaned up, but works

* use WifiManager's firstScan

* no more force!

* fix after rebase

fix after rebase

* scan for next update (seems clearer this way)

* see how responsive device is at scanning, PC is taking up to 15 seconds

* clean up and check ifVisible for scanning and UI updating

* explicitly define relationship since it's not called in Networking any more
old-commit-hash: a3a8fa9eac
commatwo_master
sshane 4 years ago committed by GitHub
parent 3768536076
commit 84369b373d
  1. 13
      selfdrive/ui/qt/offroad/networking.cc
  2. 8
      selfdrive/ui/qt/offroad/networking.h
  3. 22
      selfdrive/ui/qt/offroad/wifiManager.cc
  4. 15
      selfdrive/ui/qt/offroad/wifiManager.h

@ -33,7 +33,7 @@ Networking::Networking(QWidget* parent, bool show_advanced) : QWidget(parent), s
main_layout->addWidget(warning); main_layout->addWidget(warning);
QTimer* timer = new QTimer(this); QTimer* timer = new QTimer(this);
QObject::connect(timer, &QTimer::timeout, this, &Networking::refresh); QObject::connect(timer, &QTimer::timeout, this, &Networking::requestScan);
timer->start(5000); timer->start(5000);
attemptInitialization(); attemptInitialization();
} }
@ -47,6 +47,7 @@ void Networking::attemptInitialization() {
} }
connect(wifi, &WifiManager::wrongPassword, this, &Networking::wrongPassword); connect(wifi, &WifiManager::wrongPassword, this, &Networking::wrongPassword);
connect(wifi, &WifiManager::refreshSignal, this, &Networking::refreshSlot);
QWidget* wifiScreen = new QWidget(this); QWidget* wifiScreen = new QWidget(this);
QVBoxLayout* vlayout = new QVBoxLayout(wifiScreen); QVBoxLayout* vlayout = new QVBoxLayout(wifiScreen);
@ -87,9 +88,10 @@ void Networking::attemptInitialization() {
)"); )");
main_layout->setCurrentWidget(wifiScreen); main_layout->setCurrentWidget(wifiScreen);
ui_setup_complete = true; ui_setup_complete = true;
wifi->requestScan();
} }
void Networking::refresh() { void Networking::requestScan() {
if (!this->isVisible()) { if (!this->isVisible()) {
return; return;
} }
@ -99,6 +101,10 @@ void Networking::refresh() {
return; return;
} }
} }
wifi->requestScan();
}
void Networking::refreshSlot() {
wifiWidget->refresh(); wifiWidget->refresh();
an->refresh(); an->refresh();
} }
@ -182,7 +188,6 @@ void AdvancedNetworking::toggleTethering(bool enable) {
editPasswordButton->setEnabled(!enable); editPasswordButton->setEnabled(!enable);
} }
// WifiUI functions // WifiUI functions
WifiUI::WifiUI(QWidget *parent, WifiManager* wifi) : QWidget(parent), wifi(wifi) { WifiUI::WifiUI(QWidget *parent, WifiManager* wifi) : QWidget(parent), wifi(wifi) {
@ -196,8 +201,6 @@ WifiUI::WifiUI(QWidget *parent, WifiManager* wifi) : QWidget(parent), wifi(wifi)
} }
void WifiUI::refresh() { void WifiUI::refresh() {
wifi->request_scan();
wifi->refreshNetworks();
clearLayout(main_layout); clearLayout(main_layout);
connectButtons = new QButtonGroup(this); // TODO check if this is a leak connectButtons = new QButtonGroup(this); // TODO check if this is a leak

@ -72,15 +72,15 @@ private:
bool ui_setup_complete = false; bool ui_setup_complete = false;
bool show_advanced; bool show_advanced;
Network selectedNetwork;
WifiUI* wifiWidget; WifiUI* wifiWidget;
WifiManager* wifi = nullptr; WifiManager* wifi = nullptr;
void attemptInitialization(); void attemptInitialization();
void requestScan();
public slots:
void refreshSlot();
private slots: private slots:
void connectToNetwork(const Network &n); void connectToNetwork(const Network &n);
void refresh();
void wrongPassword(const QString &ssid); void wrongPassword(const QString &ssid);
}; };

@ -75,13 +75,13 @@ WifiManager::WifiManager(QWidget* parent) : QWidget(parent) {
} }
QDBusInterface nm(nm_service, adapter, device_iface, bus); QDBusInterface nm(nm_service, adapter, device_iface, bus);
bus.connect(nm_service, adapter, device_iface, "StateChanged", this, SLOT(change(unsigned int, unsigned int, unsigned int))); bus.connect(nm_service, adapter, device_iface, "StateChanged", this, SLOT(stateChange(unsigned int, unsigned int, unsigned int)));
bus.connect(nm_service, adapter, props_iface, "PropertiesChanged", this, SLOT(propertyChange(QString, QVariantMap, QStringList)));
QDBusInterface device_props(nm_service, adapter, props_iface, bus); QDBusInterface device_props(nm_service, adapter, props_iface, bus);
device_props.setTimeout(dbus_timeout); device_props.setTimeout(dbus_timeout);
QDBusMessage response = device_props.call("Get", device_iface, "State"); QDBusMessage response = device_props.call("Get", device_iface, "State");
raw_adapter_state = get_response<uint>(response); raw_adapter_state = get_response<uint>(response);
change(raw_adapter_state, 0, 0);
// Set tethering ssid as "weedle" + first 4 characters of a dongle id // Set tethering ssid as "weedle" + first 4 characters of a dongle id
tethering_ssid = "weedle"; tethering_ssid = "weedle";
@ -291,7 +291,7 @@ void WifiManager::forgetConnection(const QString &ssid) {
} }
} }
void WifiManager::request_scan() { void WifiManager::requestScan() {
QDBusInterface nm(nm_service, adapter, wireless_device_iface, bus); QDBusInterface nm(nm_service, adapter, wireless_device_iface, bus);
nm.setTimeout(dbus_timeout); nm.setTimeout(dbus_timeout);
nm.call("RequestScan", QVariantMap()); nm.call("RequestScan", QVariantMap());
@ -363,13 +363,22 @@ QString WifiManager::get_adapter() {
return adapter_path; return adapter_path;
} }
void WifiManager::change(unsigned int new_state, unsigned int previous_state, unsigned int change_reason) { void WifiManager::stateChange(unsigned int new_state, unsigned int previous_state, unsigned int change_reason) {
raw_adapter_state = new_state; raw_adapter_state = new_state;
if (new_state == state_need_auth && change_reason == reason_wrong_password) { if (new_state == state_need_auth && change_reason == reason_wrong_password) {
emit wrongPassword(connecting_to_network); emit wrongPassword(connecting_to_network);
} else if (new_state == state_connected) { } else if (new_state == state_connected) {
emit successfulConnection(connecting_to_network);
connecting_to_network = ""; connecting_to_network = "";
refreshNetworks();
emit refreshSignal();
}
}
// https://developer.gnome.org/NetworkManager/stable/gdbus-org.freedesktop.NetworkManager.Device.Wireless.html
void WifiManager::propertyChange(const QString &interface, const QVariantMap &props, const QStringList &invalidated_props) {
if (interface == wireless_device_iface && props.contains("LastScan")) {
refreshNetworks();
emit refreshSignal();
} }
} }
@ -421,6 +430,7 @@ QVector<QPair<QString, QDBusObjectPath>> WifiManager::listConnections() {
void WifiManager::activateWifiConnection(const QString &ssid) { void WifiManager::activateWifiConnection(const QString &ssid) {
QDBusObjectPath path = pathFromSsid(ssid); QDBusObjectPath path = pathFromSsid(ssid);
if (!path.path().isEmpty()) { if (!path.path().isEmpty()) {
connecting_to_network = ssid;
QString devicePath = get_adapter(); QString devicePath = get_adapter();
QDBusInterface nm3(nm_service, nm_path, nm_iface, bus); QDBusInterface nm3(nm_service, nm_path, nm_iface, bus);
nm3.setTimeout(dbus_timeout); nm3.setTimeout(dbus_timeout);
@ -479,8 +489,6 @@ bool WifiManager::tetheringEnabled() {
void WifiManager::changeTetheringPassword(const QString &newPassword) { void WifiManager::changeTetheringPassword(const QString &newPassword) {
tetheringPassword = newPassword; tetheringPassword = newPassword;
if (isKnownNetwork(tethering_ssid.toUtf8())) {
forgetConnection(tethering_ssid.toUtf8()); forgetConnection(tethering_ssid.toUtf8());
}
addTetheringConnection(); addTetheringConnection();
} }

@ -30,7 +30,7 @@ class WifiManager : public QWidget {
public: public:
explicit WifiManager(QWidget* parent); explicit WifiManager(QWidget* parent);
void request_scan(); void requestScan();
QVector<Network> seen_networks; QVector<Network> seen_networks;
QString ipv4_address; QString ipv4_address;
@ -54,9 +54,9 @@ public:
private: private:
QVector<QByteArray> seen_ssids; 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
QString connecting_to_network; QString connecting_to_network;
QString tethering_ssid; QString tethering_ssid;
QString tetheringPassword = "swagswagcommma"; QString tetheringPassword = "swagswagcommma";
@ -75,10 +75,11 @@ private:
QDBusObjectPath pathFromSsid(const QString &ssid); QDBusObjectPath pathFromSsid(const QString &ssid);
QVector<QPair<QString, QDBusObjectPath>> listConnections(); QVector<QPair<QString, QDBusObjectPath>> listConnections();
private slots:
void change(unsigned int new_state, unsigned int previous_state, unsigned int change_reason);
signals: signals:
void wrongPassword(const QString &ssid); void wrongPassword(const QString &ssid);
void successfulConnection(const QString &ssid); void refreshSignal();
void refresh();
private slots:
void stateChange(unsigned int new_state, unsigned int previous_state, unsigned int change_reason);
void propertyChange(const QString &interface, const QVariantMap &props, const QStringList &invalidated_props);
}; };

Loading…
Cancel
Save