pull/35293/head
Shane Smiskol 1 week ago
parent e8fd8e6018
commit f392ce911e
  1. 45
      selfdrive/ui/qt/network/networking.cc
  2. 4
      selfdrive/ui/qt/network/networking.h
  3. 53
      selfdrive/ui/qt/network/wifi_manager.cc
  4. 3
      selfdrive/ui/qt/network/wifi_manager.h
  5. 7
      selfdrive/ui/qt/widgets/controls.h

@ -1,6 +1,7 @@
#include "selfdrive/ui/qt/network/networking.h" #include "selfdrive/ui/qt/network/networking.h"
#include <algorithm> #include <algorithm>
#include <iostream>
#include <QHBoxLayout> #include <QHBoxLayout>
#include <QScrollBar> #include <QScrollBar>
@ -175,12 +176,12 @@ AdvancedNetworking::AdvancedNetworking(QWidget* parent, WifiManager* wifi): QWid
// Metered toggle // Metered toggle
const bool metered = params.getBool("GsmMetered"); const bool metered = params.getBool("GsmMetered");
meteredToggle = new ToggleControl(tr("Cellular Metered"), tr("Prevent large data uploads when on a metered connection"), "", metered); cellularMeteredToggle = new ToggleControl(tr("Cellular Metered"), tr("Prevent large data uploads when on a metered connection"), "", metered);
QObject::connect(meteredToggle, &SshToggle::toggleFlipped, [=](bool state) { QObject::connect(cellularMeteredToggle, &SshToggle::toggleFlipped, [=](bool state) {
params.putBool("GsmMetered", state); params.putBool("GsmMetered", state);
wifi->updateGsmSettings(params.getBool("GsmRoaming"), QString::fromStdString(params.get("GsmApn")), state); wifi->updateGsmSettings(params.getBool("GsmRoaming"), QString::fromStdString(params.get("GsmApn")), state);
}); });
list->addItem(meteredToggle); list->addItem(cellularMeteredToggle);
// Hidden Network // Hidden Network
hiddenNetworkButton = new ButtonControl(tr("Hidden Network"), tr("CONNECT")); hiddenNetworkButton = new ButtonControl(tr("Hidden Network"), tr("CONNECT"));
@ -204,6 +205,25 @@ AdvancedNetworking::AdvancedNetworking(QWidget* parent, WifiManager* wifi): QWid
// Set initial config // Set initial config
wifi->updateGsmSettings(roamingEnabled, QString::fromStdString(params.get("GsmApn")), metered); wifi->updateGsmSettings(roamingEnabled, QString::fromStdString(params.get("GsmApn")), metered);
// Wi-Fi metered toggle
std::vector<QString> 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->addWidget(new ScrollView(list, this));
main_layout->addStretch(1); main_layout->addStretch(1);
} }
@ -211,18 +231,35 @@ AdvancedNetworking::AdvancedNetworking(QWidget* parent, WifiManager* wifi): QWid
void AdvancedNetworking::setGsmVisible(bool visible) { void AdvancedNetworking::setGsmVisible(bool visible) {
roamingToggle->setVisible(visible); roamingToggle->setVisible(visible);
editApnButton->setVisible(visible); editApnButton->setVisible(visible);
meteredToggle->setVisible(visible); cellularMeteredToggle->setVisible(visible);
} }
void AdvancedNetworking::refresh() { void AdvancedNetworking::refresh() {
ipLabel->setText(wifi->ipv4_address); ipLabel->setText(wifi->ipv4_address);
tetheringToggle->setEnabled(true); 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(); update();
} }
void AdvancedNetworking::toggleTethering(bool enabled) { void AdvancedNetworking::toggleTethering(bool enabled) {
wifi->setTetheringEnabled(enabled); wifi->setTetheringEnabled(enabled);
tetheringToggle->setEnabled(false); tetheringToggle->setEnabled(false);
wifiMeteredToggle->setEnabled(!enabled);
} }
// WifiUI functions // WifiUI functions

@ -65,7 +65,9 @@ private:
ToggleControl* roamingToggle; ToggleControl* roamingToggle;
ButtonControl* editApnButton; ButtonControl* editApnButton;
ButtonControl* hiddenNetworkButton; ButtonControl* hiddenNetworkButton;
ToggleControl* meteredToggle; ToggleControl* cellularMeteredToggle;
// ButtonParamControl* wifiMeteredToggle;
ToggleControl* wifiMeteredToggle;
WifiManager* wifi = nullptr; WifiManager* wifi = nullptr;
Params params; Params params;

@ -1,6 +1,7 @@
#include "selfdrive/ui/qt/network/wifi_manager.h" #include "selfdrive/ui/qt/network/wifi_manager.h"
#include <utility> #include <utility>
#include <iostream>
#include "common/swaglog.h" #include "common/swaglog.h"
#include "selfdrive/ui/qt/util.h" #include "selfdrive/ui/qt/util.h"
@ -100,6 +101,7 @@ void WifiManager::refreshNetworks() {
void WifiManager::refreshFinished(QDBusPendingCallWatcher *watcher) { void WifiManager::refreshFinished(QDBusPendingCallWatcher *watcher) {
ipv4_address = getIp4Address(); ipv4_address = getIp4Address();
seenNetworks.clear(); seenNetworks.clear();
const QDBusReply<QList<QDBusObjectPath>> watcher_reply = *watcher; const QDBusReply<QList<QDBusObjectPath>> watcher_reply = *watcher;
@ -161,6 +163,10 @@ QString WifiManager::getIp4Address() {
return ""; return "";
} }
//void WifiManager::getConnectionMetered() {
//
//}
SecurityType WifiManager::getSecurityType(const QVariantMap &properties) { SecurityType WifiManager::getSecurityType(const QVariantMap &properties) {
int sflag = properties["Flags"].toUInt(); int sflag = properties["Flags"].toUInt();
int wpaflag = properties["WpaFlags"].toUInt(); int wpaflag = properties["WpaFlags"].toUInt();
@ -372,6 +378,53 @@ NetworkType WifiManager::currentNetworkType() {
return NetworkType::NONE; return NetworkType::NONE;
} }
bool WifiManager::currentNetworkMetered() {
// auto primary_conn = call<QDBusObjectPath>(NM_DBUS_PATH, NM_DBUS_INTERFACE_PROPERTIES, "Get", NM_DBUS_INTERFACE, "PrimaryConnection");
// auto primary_type = call<QString>(primary_conn.path(), NM_DBUS_INTERFACE_PROPERTIES, "Get", NM_DBUS_INTERFACE_ACTIVE_CONNECTION, "Type");
// auto primary_devices = call<QDBusObjectPath>(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<int>(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<QDBusObjectPath>(NM_DBUS_PATH, NM_DBUS_INTERFACE_PROPERTIES, "Get", NM_DBUS_INTERFACE, "PrimaryConnection");
QDBusObjectPath settingsConnPath = call<QDBusObjectPath>(primary_conn.path(), NM_DBUS_INTERFACE_PROPERTIES, "Get", NM_DBUS_INTERFACE_ACTIVE_CONNECTION, "Connection");
auto primary_type = call<QString>(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) { void WifiManager::updateGsmSettings(bool roaming, QString apn, bool metered) {
if (!lteConnectionPath.path().isEmpty()) { if (!lteConnectionPath.path().isEmpty()) {
bool changes = false; bool changes = false;

@ -42,6 +42,7 @@ public:
QMap<QString, Network> seenNetworks; QMap<QString, Network> seenNetworks;
QMap<QDBusObjectPath, QString> knownConnections; QMap<QDBusObjectPath, QString> knownConnections;
QString ipv4_address; QString ipv4_address;
// bool metered = false;
bool tethering_on = false; bool tethering_on = false;
bool ipv4_forward = false; bool ipv4_forward = false;
@ -53,6 +54,8 @@ public:
bool isKnownConnection(const QString &ssid); bool isKnownConnection(const QString &ssid);
std::optional<QDBusPendingCall> activateWifiConnection(const QString &ssid); std::optional<QDBusPendingCall> activateWifiConnection(const QString &ssid);
NetworkType currentNetworkType(); NetworkType currentNetworkType();
bool currentNetworkMetered();
bool setCurrentNetworkMetered(bool metered);
void updateGsmSettings(bool roaming, QString apn, 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 = {}); void connect(const Network &ssid, const bool is_hidden = false, const QString &password = {}, const QString &username = {});

@ -132,6 +132,13 @@ public:
toggle.update(); toggle.update();
} }
void setToggled(bool state) {
if (state != toggle.on) {
toggle.togglePosition();
toggle.update();
}
}
signals: signals:
void toggleFlipped(bool state); void toggleFlipped(bool state);

Loading…
Cancel
Save