From 8b39650d9988edba482028042000ed14f67c596c Mon Sep 17 00:00:00 2001 From: Willem Melching Date: Thu, 28 Jul 2022 14:58:23 +0200 Subject: [PATCH] thermald: log modem data usage (#25298) * thermald: log modem data usage * add to deviceState * add cast * set refresh rate * bump cereal * cereal master old-commit-hash: b2c1098cd80ff53544c2b65b77c145a5d4af80ad --- cereal | 2 +- selfdrive/thermald/thermald.py | 15 ++++++++++----- system/hardware/base.py | 3 +++ system/hardware/tici/hardware.py | 23 ++++++++++++++++++++++- 4 files changed, 36 insertions(+), 7 deletions(-) diff --git a/cereal b/cereal index 5fce93da72..a4db5e79e4 160000 --- a/cereal +++ b/cereal @@ -1 +1 @@ -Subproject commit 5fce93da72fbd7cebd025ebdc58fa3ef3b4a3fd5 +Subproject commit a4db5e79e4fac20a906bd951f75b1b91c06148b5 diff --git a/selfdrive/thermald/thermald.py b/selfdrive/thermald/thermald.py index 7277e737d5..c765af664f 100755 --- a/selfdrive/thermald/thermald.py +++ b/selfdrive/thermald/thermald.py @@ -34,7 +34,7 @@ DISCONNECT_TIMEOUT = 5. # wait 5 seconds before going offroad after disconnect PANDA_STATES_TIMEOUT = int(1000 * 1.5 * DT_TRML) # 1.5x the expected pandaState frequency ThermalBand = namedtuple("ThermalBand", ['min_temp', 'max_temp']) -HardwareState = namedtuple("HardwareState", ['network_type', 'network_metered', 'network_strength', 'network_info', 'nvme_temps', 'modem_temps']) +HardwareState = namedtuple("HardwareState", ['network_type', 'network_info', 'network_strength', 'network_stats', 'network_metered', 'nvme_temps', 'modem_temps']) # List of thermal bands. We will stay within this region as long as we are within the bounds. # When exiting the bounds, we'll jump to the lower or higher band. Bands are ordered in the dict. @@ -119,11 +119,14 @@ def hw_state_thread(end_event, hw_queue): if (modem_version is not None) and (modem_nv is not None): cloudlog.event("modem version", version=modem_version, nv=modem_nv) + tx, rx = HARDWARE.get_modem_data_usage() + hw_state = HardwareState( network_type=network_type, - network_metered=HARDWARE.get_network_metered(network_type), - network_strength=HARDWARE.get_network_strength(network_type), network_info=HARDWARE.get_network_info(), + network_strength=HARDWARE.get_network_strength(network_type), + network_stats={'wwanTx': tx, 'wwanRx': rx}, + network_metered=HARDWARE.get_network_metered(network_type), nvme_temps=HARDWARE.get_nvme_temperatures(), modem_temps=modem_temps, ) @@ -166,9 +169,10 @@ def thermald_thread(end_event, hw_queue): last_hw_state = HardwareState( network_type=NetworkType.none, + network_info=None, network_metered=False, network_strength=NetworkStrength.unknown, - network_info=None, + network_stats={'wwanTx': -1, 'wwanRx': -1}, nvme_temps=[], modem_temps=[], ) @@ -227,6 +231,7 @@ def thermald_thread(end_event, hw_queue): msg.deviceState.networkType = last_hw_state.network_type msg.deviceState.networkMetered = last_hw_state.network_metered msg.deviceState.networkStrength = last_hw_state.network_strength + msg.deviceState.networkStats = last_hw_state.network_stats if last_hw_state.network_info is not None: msg.deviceState.networkInfo = last_hw_state.network_info @@ -340,7 +345,7 @@ def thermald_thread(end_event, hw_queue): current_power_draw = HARDWARE.get_current_power_draw() statlog.sample("power_draw", current_power_draw) msg.deviceState.powerDrawW = current_power_draw - + som_power_draw = HARDWARE.get_som_power_draw() statlog.sample("som_power_draw", som_power_draw) msg.deviceState.somPowerDrawW = som_power_draw diff --git a/system/hardware/base.py b/system/hardware/base.py index b052a48c5b..c9c02f3a59 100644 --- a/system/hardware/base.py +++ b/system/hardware/base.py @@ -144,3 +144,6 @@ class HardwareBase(ABC): def recover_internal_panda(self): pass + + def get_modem_data_usage(self): + return -1, -1 diff --git a/system/hardware/tici/hardware.py b/system/hardware/tici/hardware.py index 66cb98c606..c3f8c7f82a 100644 --- a/system/hardware/tici/hardware.py +++ b/system/hardware/tici/hardware.py @@ -18,6 +18,7 @@ NM = 'org.freedesktop.NetworkManager' NM_CON_ACT = NM + '.Connection.Active' NM_DEV = NM + '.Device' NM_DEV_WL = NM + '.Device.Wireless' +NM_DEV_STATS = NM + '.Device.Statistics' NM_AP = NM + '.AccessPoint' DBUS_PROPS = 'org.freedesktop.DBus.Properties' @@ -49,6 +50,7 @@ class NMMetered(IntEnum): NM_METERED_GUESS_NO = 4 TIMEOUT = 0.1 +REFRESH_RATE_MS = 1000 NetworkType = log.DeviceState.NetworkType NetworkStrength = log.DeviceState.NetworkStrength @@ -143,6 +145,10 @@ class Tici(HardwareBase): wlan_path = self.nm.GetDeviceByIpIface('wlan0', dbus_interface=NM, timeout=TIMEOUT) return self.bus.get_object(NM, wlan_path) + def get_wwan(self): + wwan_path = self.nm.GetDeviceByIpIface('wwan0', dbus_interface=NM, timeout=TIMEOUT) + return self.bus.get_object(NM, wwan_path) + def get_sim_info(self): modem = self.get_modem() sim_path = modem.Get(MM_MODEM, 'Sim', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) @@ -504,6 +510,22 @@ class Tici(HardwareBase): return r + def get_modem_data_usage(self): + try: + wwan = self.get_wwan() + + # Ensure refresh rate is set so values don't go stale + refresh_rate = wwan.Get(NM_DEV_STATS, 'RefreshRateMs', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + if refresh_rate != REFRESH_RATE_MS: + u = type(refresh_rate) + wwan.Set(NM_DEV_STATS, 'RefreshRateMs', u(REFRESH_RATE_MS), dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + + tx = wwan.Get(NM_DEV_STATS, 'TxBytes', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + rx = wwan.Get(NM_DEV_STATS, 'RxBytes', dbus_interface=DBUS_PROPS, timeout=TIMEOUT) + return int(tx), int(rx) + except Exception: + return -1, -1 + def reset_internal_panda(self): gpio_init(GPIO.STM_RST_N, True) @@ -511,7 +533,6 @@ class Tici(HardwareBase): time.sleep(2) gpio_set(GPIO.STM_RST_N, 0) - def recover_internal_panda(self): gpio_init(GPIO.STM_RST_N, True) gpio_init(GPIO.STM_BOOT0, True)