From 5d3437e78e3e687aaf6026de4e7477b624e1b223 Mon Sep 17 00:00:00 2001 From: Shane Smiskol Date: Sat, 23 Aug 2025 03:02:15 -0700 Subject: [PATCH] oh jubilee is sick you can block on signals!! --- system/ui/lib/wifi_manager.py | 48 +++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/system/ui/lib/wifi_manager.py b/system/ui/lib/wifi_manager.py index bb6a2000a0..65e3851e83 100644 --- a/system/ui/lib/wifi_manager.py +++ b/system/ui/lib/wifi_manager.py @@ -7,6 +7,11 @@ from collections.abc import Callable from dataclasses import dataclass from enum import IntEnum +from collections import deque +from jeepney import DBusAddress, new_method_call +from jeepney.bus_messages import message_bus, MatchRule +from jeepney.io.blocking import open_dbus_connection + from openpilot.common.swaglog import cloudlog from openpilot.system.ui.lib.networkmanager import (NM, NM_PROPERTIES_IFACE, NM_WIRELESS_IFACE, NM_802_11_AP_SEC_PAIR_WEP40, NM_802_11_AP_SEC_PAIR_WEP104, NM_802_11_AP_SEC_GROUP_WEP40, @@ -109,6 +114,49 @@ class AccessPoint: ) +NM = "org.freedesktop.NetworkManager" +NM_PATH = "/org/freedesktop/NetworkManager" +NM_IFACE = "org.freedesktop.NetworkManager" +PROPS_IFACE = "org.freedesktop.DBus.Properties" +DEV_IFACE = "org.freedesktop.NetworkManager.Device" + + +def wait_props_changed(device_path: str): + conn = open_dbus_connection(bus="SYSTEM") + try: + # Subscribe to PropertiesChanged on that device + rule = MatchRule( + type="signal", + interface=PROPS_IFACE, + member="StateChanged", + path=device_path, + ) + rule_props = MatchRule(type="signal", sender=NM, interface=PROPS_IFACE, member="PropertiesChanged", path=device_path) + rule_state = MatchRule(type="signal", sender=NM, interface=DEV_IFACE, member="StateChanged", path=device_path) + rule.add_arg_condition(0, DEV_IFACE) # only changes for Device iface + + # Tell the bus we want these signals + conn.send_and_get_reply(message_bus.AddMatch(rule_props)) + conn.send_and_get_reply(message_bus.AddMatch(rule_state)) + + # Block until a matching signal arrives + while True: + msg = conn.receive(timeout=None) + print(msg) + + with conn.filter(rule, queue=deque(maxlen=1)) as q: + msg = conn.recv_until_filtered(q, timeout=None) + iface, changed, invalidated = msg.body # iface:str, changed:a{sv}, invalidated:as + # changed is a dict of {prop_name: Variant(...)} – pull what you need: + print('changed', changed) + state = changed.get("State") + if state is not None: + # state.value if you’re wrapping Variants; else plain int depending on your helpers + print("New device state:", state) + finally: + conn.close() + + class WifiManager: def __init__(self): self._networks = [] # a network can be comprised of multiple APs