From f392ce911ecd2038f9c2167cda6af5c47f8621d9 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Mon, 19 May 2025 23:23:23 -0700 Subject: [PATCH] draft --- selfdrive/ui/qt/network/networking.cc | 45 +++++++++++++++++++-- selfdrive/ui/qt/network/networking.h | 4 +- selfdrive/ui/qt/network/wifi_manager.cc | 53 +++++++++++++++++++++++++ selfdrive/ui/qt/network/wifi_manager.h | 3 ++ selfdrive/ui/qt/widgets/controls.h | 7 ++++ 5 files changed, 107 insertions(+), 5 deletions(-) diff --git a/selfdrive/ui/qt/network/networking.cc b/selfdrive/ui/qt/network/networking.cc index 93f7ff3f21..0c93a5f7a4 100644 --- a/selfdrive/ui/qt/network/networking.cc +++ b/selfdrive/ui/qt/network/networking.cc @@ -1,6 +1,7 @@ #include "selfdrive/ui/qt/network/networking.h" #include +#include #include #include @@ -175,12 +176,12 @@ AdvancedNetworking::AdvancedNetworking(QWidget* parent, WifiManager* wifi): QWid // Metered toggle const bool metered = params.getBool("GsmMetered"); - meteredToggle = new ToggleControl(tr("Cellular Metered"), tr("Prevent large data uploads when on a metered connection"), "", metered); - QObject::connect(meteredToggle, &SshToggle::toggleFlipped, [=](bool state) { + cellularMeteredToggle = new ToggleControl(tr("Cellular Metered"), tr("Prevent large data uploads when on a metered connection"), "", metered); + QObject::connect(cellularMeteredToggle, &SshToggle::toggleFlipped, [=](bool state) { params.putBool("GsmMetered", state); wifi->updateGsmSettings(params.getBool("GsmRoaming"), QString::fromStdString(params.get("GsmApn")), state); }); - list->addItem(meteredToggle); + list->addItem(cellularMeteredToggle); // Hidden Network hiddenNetworkButton = new ButtonControl(tr("Hidden Network"), tr("CONNECT")); @@ -204,6 +205,25 @@ AdvancedNetworking::AdvancedNetworking(QWidget* parent, WifiManager* wifi): QWid // Set initial config wifi->updateGsmSettings(roamingEnabled, QString::fromStdString(params.get("GsmApn")), metered); + // Wi-Fi metered toggle + std::vector longi_button_texts{tr("Unmetered"), tr("Default"), tr("Metered")}; + wifiMeteredToggle = new ToggleControl(tr("Meter Wi-Fi Network"), tr("Prevent large data uploads when on a metered connection"), "", false); + wifiMeteredToggle->setTitle(tr("Meter Wi-Fi Network")); + wifiMeteredToggle->setValue("Disconnected"); + wifiMeteredToggle->setEnabled(false); + QObject::connect(wifiMeteredToggle, &ToggleControl::toggleFlipped, [=](bool state) { + wifi->setCurrentNetworkMetered(state); + refresh(); + std::cout << "Set Wi-Fi metered to " << state << std::endl; + }); +// wifiMeteredToggle = new ToggleControl("LongitudinalPersonality", tr("Meter Wi-Fi Network"), +// tr("Standard is recommended. In aggressive mode, openpilot will follow lead cars closer and be more aggressive with the gas and brake. " +// "In relaxed mode openpilot will stay further away from lead cars. On supported cars, you can cycle through these personalities with " +// "your steering wheel distance button."), +// "../assets/icons/speed_limit.png", +// longi_button_texts); + list->addItem(wifiMeteredToggle); + main_layout->addWidget(new ScrollView(list, this)); main_layout->addStretch(1); } @@ -211,18 +231,35 @@ AdvancedNetworking::AdvancedNetworking(QWidget* parent, WifiManager* wifi): QWid void AdvancedNetworking::setGsmVisible(bool visible) { roamingToggle->setVisible(visible); editApnButton->setVisible(visible); - meteredToggle->setVisible(visible); + cellularMeteredToggle->setVisible(visible); } void AdvancedNetworking::refresh() { ipLabel->setText(wifi->ipv4_address); tetheringToggle->setEnabled(true); + + // TODO: which?! +// wifiMeteredToggle->setEnabled(wifi->currentNetworkType() == NetworkType::WIFI); + if (wifi->isTetheringEnabled()) { + wifiMeteredToggle->setEnabled(false); + wifiMeteredToggle->setValue("Unsupported while tethering"); + } else if (wifi->ipv4_address != "") { // TODO: check wifi + wifiMeteredToggle->setEnabled(true); + wifiMeteredToggle->setValue(wifi->currentNetworkMetered() ? "Metered" : "Unmetered"); + wifiMeteredToggle->setToggled(wifi->currentNetworkMetered()); + } else { + wifiMeteredToggle->setEnabled(false); + wifiMeteredToggle->setValue("Disconnected"); + wifiMeteredToggle->setToggled(false); + } + update(); } void AdvancedNetworking::toggleTethering(bool enabled) { wifi->setTetheringEnabled(enabled); tetheringToggle->setEnabled(false); + wifiMeteredToggle->setEnabled(!enabled); } // WifiUI functions diff --git a/selfdrive/ui/qt/network/networking.h b/selfdrive/ui/qt/network/networking.h index 4fd604039b..cc63c829fb 100644 --- a/selfdrive/ui/qt/network/networking.h +++ b/selfdrive/ui/qt/network/networking.h @@ -65,7 +65,9 @@ private: ToggleControl* roamingToggle; ButtonControl* editApnButton; ButtonControl* hiddenNetworkButton; - ToggleControl* meteredToggle; + ToggleControl* cellularMeteredToggle; +// ButtonParamControl* wifiMeteredToggle; + ToggleControl* wifiMeteredToggle; WifiManager* wifi = nullptr; Params params; diff --git a/selfdrive/ui/qt/network/wifi_manager.cc b/selfdrive/ui/qt/network/wifi_manager.cc index 3d4bb9e7d1..324fc0a64e 100644 --- a/selfdrive/ui/qt/network/wifi_manager.cc +++ b/selfdrive/ui/qt/network/wifi_manager.cc @@ -1,6 +1,7 @@ #include "selfdrive/ui/qt/network/wifi_manager.h" #include +#include #include "common/swaglog.h" #include "selfdrive/ui/qt/util.h" @@ -100,6 +101,7 @@ void WifiManager::refreshNetworks() { void WifiManager::refreshFinished(QDBusPendingCallWatcher *watcher) { ipv4_address = getIp4Address(); + seenNetworks.clear(); const QDBusReply> watcher_reply = *watcher; @@ -161,6 +163,10 @@ QString WifiManager::getIp4Address() { return ""; } +//void WifiManager::getConnectionMetered() { +// +//} + SecurityType WifiManager::getSecurityType(const QVariantMap &properties) { int sflag = properties["Flags"].toUInt(); int wpaflag = properties["WpaFlags"].toUInt(); @@ -372,6 +378,53 @@ NetworkType WifiManager::currentNetworkType() { return NetworkType::NONE; } +bool WifiManager::currentNetworkMetered() { +// auto primary_conn = call(NM_DBUS_PATH, NM_DBUS_INTERFACE_PROPERTIES, "Get", NM_DBUS_INTERFACE, "PrimaryConnection"); +// auto primary_type = call(primary_conn.path(), NM_DBUS_INTERFACE_PROPERTIES, "Get", NM_DBUS_INTERFACE_ACTIVE_CONNECTION, "Type"); +// auto primary_devices = call(primary_conn.path(), NM_DBUS_INTERFACE_PROPERTIES, "Get", NM_DBUS_INTERFACE_ACTIVE_CONNECTION, "Devices"); + + NetworkType type = currentNetworkType(); + if (type == NetworkType::WIFI) { + int metered_prop = call(adapter, NM_DBUS_INTERFACE_PROPERTIES, "Get", NM_DBUS_INTERFACE_DEVICE, "Metered"); + std::cout << "Metered property: " << metered_prop << "\n"; + if (metered_prop == NM_METERED_YES || metered_prop == NM_METERED_GUESS_YES) { + return true; + } + } + + return type != NetworkType::NONE && type != NetworkType::WIFI && type != NetworkType::ETHERNET; +} + +bool WifiManager::setCurrentNetworkMetered(bool metered) { + auto primary_conn = call(NM_DBUS_PATH, NM_DBUS_INTERFACE_PROPERTIES, "Get", NM_DBUS_INTERFACE, "PrimaryConnection"); + QDBusObjectPath settingsConnPath = call(primary_conn.path(), NM_DBUS_INTERFACE_PROPERTIES, "Get", NM_DBUS_INTERFACE_ACTIVE_CONNECTION, "Connection"); + auto primary_type = call(primary_conn.path(), NM_DBUS_INTERFACE_PROPERTIES, "Get", NM_DBUS_INTERFACE_ACTIVE_CONNECTION, "Type"); + + + NetworkType type = currentNetworkType(); + if (type == NetworkType::WIFI && !isTetheringEnabled()) { // note: already checks tethering + Connection settings = getConnectionSettings(settingsConnPath); + int meteredInt = metered ? NM_METERED_UNKNOWN : NM_METERED_NO; + settings["connection"]["metered"] = meteredInt; + + call(settingsConnPath.path(), NM_DBUS_INTERFACE_SETTINGS_CONNECTION, "UpdateUnsaved", QVariant::fromValue(settings)); + return true; + } + return false; +// +// // TODO: support eth? why not +// if (primary_type == "802-3-ethernet") { +// return false; +// } else if (primary_type == "802-11-wireless" && !isTetheringEnabled()) { +// int meteredInt = metered ? NM_METERED_UNKNOWN : NM_METERED_NO; +// settings["connection"]["metered"] = meteredInt; +//// call(primary_conn.path(), NM_DBUS_INTERFACE_SETTINGS_CONNECTION, "UpdateUnsaved", QVariant::fromValue(meteredInt)); +// call(settingsConnPath.path(), NM_DBUS_INTERFACE_SETTINGS_CONNECTION, "UpdateUnsaved", QVariant::fromValue(settings)); +// return true; +// } + return false; +} + void WifiManager::updateGsmSettings(bool roaming, QString apn, bool metered) { if (!lteConnectionPath.path().isEmpty()) { bool changes = false; diff --git a/selfdrive/ui/qt/network/wifi_manager.h b/selfdrive/ui/qt/network/wifi_manager.h index e5f79c5149..e48ec0a2da 100644 --- a/selfdrive/ui/qt/network/wifi_manager.h +++ b/selfdrive/ui/qt/network/wifi_manager.h @@ -42,6 +42,7 @@ public: QMap seenNetworks; QMap knownConnections; QString ipv4_address; +// bool metered = false; bool tethering_on = false; bool ipv4_forward = false; @@ -53,6 +54,8 @@ public: bool isKnownConnection(const QString &ssid); std::optional activateWifiConnection(const QString &ssid); NetworkType currentNetworkType(); + bool currentNetworkMetered(); + bool setCurrentNetworkMetered(bool metered); void updateGsmSettings(bool roaming, QString apn, bool metered); void connect(const Network &ssid, const bool is_hidden = false, const QString &password = {}, const QString &username = {}); diff --git a/selfdrive/ui/qt/widgets/controls.h b/selfdrive/ui/qt/widgets/controls.h index aebf934f2a..6452d64758 100644 --- a/selfdrive/ui/qt/widgets/controls.h +++ b/selfdrive/ui/qt/widgets/controls.h @@ -132,6 +132,13 @@ public: toggle.update(); } + void setToggled(bool state) { + if (state != toggle.on) { + toggle.togglePosition(); + toggle.update(); + } + } + signals: void toggleFlipped(bool state);