Check msg count in test_power_draw (#28444)

* Check msg count in test_power_draw.

* Use drain_sock

* Bug fix

* Combine into a single table

* Check camera state msgs and no default value for Proc.msgs

* Update system/hardware/tici/tests/test_power_draw.py

Co-authored-by: Adeeb Shihadeh <adeebshihadeh@gmail.com>

---------

Co-authored-by: Adeeb Shihadeh <adeebshihadeh@gmail.com>
pull/28449/head
Mitchell Goff 2 years ago committed by GitHub
parent 80430435bb
commit 729d3ddcb5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 33
      system/hardware/tici/tests/test_power_draw.py

@ -5,29 +5,33 @@ import math
import threading import threading
from dataclasses import dataclass from dataclasses import dataclass
from tabulate import tabulate from tabulate import tabulate
from typing import List
import cereal.messaging as messaging import cereal.messaging as messaging
from cereal.services import service_list
from system.hardware import HARDWARE, TICI from system.hardware import HARDWARE, TICI
from system.hardware.tici.power_monitor import get_power from system.hardware.tici.power_monitor import get_power
from selfdrive.manager.process_config import managed_processes from selfdrive.manager.process_config import managed_processes
from selfdrive.manager.manager import manager_cleanup from selfdrive.manager.manager import manager_cleanup
SAMPLE_TIME = 8 # seconds to sample power
@dataclass @dataclass
class Proc: class Proc:
name: str name: str
power: float power: float
msgs: List[str]
rtol: float = 0.05 rtol: float = 0.05
atol: float = 0.12 atol: float = 0.12
warmup: float = 6. warmup: float = 6.
PROCS = [ PROCS = [
Proc('camerad', 2.1), Proc('camerad', 2.1, msgs=['roadCameraState', 'wideRoadCameraState', 'driverCameraState']),
Proc('modeld', 0.93, atol=0.2), Proc('modeld', 0.93, atol=0.2, msgs=['modelV2']),
Proc('dmonitoringmodeld', 0.4), Proc('dmonitoringmodeld', 0.4, msgs=['driverStateV2']),
Proc('encoderd', 0.23), Proc('encoderd', 0.23, msgs=[]),
Proc('mapsd', 0.05), Proc('mapsd', 0.05, msgs=['mapRenderState']),
Proc('navmodeld', 0.05), Proc('navmodeld', 0.05, msgs=['navModel']),
] ]
def send_llk_msg(done): def send_llk_msg(done):
@ -39,6 +43,7 @@ def send_llk_msg(done):
# Send liveLocationKalman at 20hz # Send liveLocationKalman at 20hz
while not done.is_set(): while not done.is_set():
msg.clear_write_flag()
pm.send('liveLocationKalman', msg) pm.send('liveLocationKalman', msg)
time.sleep(1/20) time.sleep(1/20)
@ -68,25 +73,33 @@ class TestPowerDraw(unittest.TestCase):
prev = baseline prev = baseline
used = {} used = {}
msg_counts = {}
for proc in PROCS: for proc in PROCS:
socks = {msg: messaging.sub_sock(msg) for msg in proc.msgs}
managed_processes[proc.name].start() managed_processes[proc.name].start()
time.sleep(proc.warmup) time.sleep(proc.warmup)
for sock in socks.values():
messaging.drain_sock_raw(sock)
now = get_power(8) now = get_power(SAMPLE_TIME)
used[proc.name] = now - prev used[proc.name] = now - prev
prev = now prev = now
for msg,sock in socks.items():
msg_counts[msg] = len(messaging.drain_sock_raw(sock))
done.set() done.set()
manager_cleanup() manager_cleanup()
tab = [] tab = [['process', 'expected (W)', 'measured (W)', '# msgs expected', '# msgs received']]
tab.append(['process', 'expected (W)', 'measured (W)'])
for proc in PROCS: for proc in PROCS:
cur = used[proc.name] cur = used[proc.name]
expected = proc.power expected = proc.power
tab.append([proc.name, round(expected, 2), round(cur, 2)]) msgs_received = sum(msg_counts[msg] for msg in proc.msgs)
msgs_expected = int(sum(SAMPLE_TIME * service_list[msg].frequency for msg in proc.msgs))
tab.append([proc.name, round(expected, 2), round(cur, 2), msgs_expected, msgs_received])
with self.subTest(proc=proc.name): with self.subTest(proc=proc.name):
self.assertTrue(math.isclose(cur, expected, rel_tol=proc.rtol, abs_tol=proc.atol)) self.assertTrue(math.isclose(cur, expected, rel_tol=proc.rtol, abs_tol=proc.atol))
self.assertTrue(math.isclose(msgs_expected, msgs_received, rel_tol=.02, abs_tol=2))
print(tabulate(tab)) print(tabulate(tab))
print(f"Baseline {baseline:.2f}W\n") print(f"Baseline {baseline:.2f}W\n")

Loading…
Cancel
Save