From 89e0ad290292e77cac89aeaae1f349c7fa8b96c8 Mon Sep 17 00:00:00 2001 From: Justin Newberry Date: Wed, 24 Jan 2024 16:51:06 -0800 Subject: [PATCH] test_ui: add onroad state (#31148) add onroad old-commit-hash: 3676ae4da3dc4fbc2ea6aa84369a5f460662f6e4 --- selfdrive/ui/tests/test_ui/run.py | 70 +++++++++++++++++++++++++++++-- 1 file changed, 67 insertions(+), 3 deletions(-) diff --git a/selfdrive/ui/tests/test_ui/run.py b/selfdrive/ui/tests/test_ui/run.py index f943786350..48223d3fe8 100644 --- a/selfdrive/ui/tests/test_ui/run.py +++ b/selfdrive/ui/tests/test_ui/run.py @@ -10,22 +10,37 @@ import time import unittest from parameterized import parameterized -from cereal import messaging, log +from cereal import messaging, car, log +from cereal.visionipc import VisionIpcServer, VisionStreamType from cereal.messaging import SubMaster, PubMaster from openpilot.common.params import Params +from openpilot.common.realtime import DT_MDL +from openpilot.common.transformations.camera import tici_f_frame_size from openpilot.selfdrive.test.helpers import with_processes +from openpilot.selfdrive.test.process_replay.vision_meta import meta_from_camera_state +from openpilot.tools.webcam.camera import Camera UI_DELAY = 0.5 # may be slower on CI? NetworkType = log.DeviceState.NetworkType NetworkStrength = log.DeviceState.NetworkStrength +EventName = car.CarEvent.EventName +EVENTS_BY_NAME = {v: k for k, v in EventName.schema.enumerants.items()} + + def setup_common(click, pm: PubMaster): Params().put("DongleId", "123456789012345") dat = messaging.new_message('deviceState') + dat.deviceState.started = True dat.deviceState.networkType = NetworkType.cell4G dat.deviceState.networkStrength = NetworkStrength.moderate + dat.deviceState.freeSpacePercent = 80 + dat.deviceState.memoryUsagePercent = 2 + dat.deviceState.cpuTempC = [2,]*3 + dat.deviceState.gpuTempC = [2,]*3 + dat.deviceState.cpuUsagePercent = [2,]*8 pm.send("deviceState", dat) @@ -47,13 +62,61 @@ def setup_settings_network(click, pm: PubMaster): click(300, 600) time.sleep(UI_DELAY) +def setup_onroad(click, pm: PubMaster): + setup_common(click, pm) + + dat = messaging.new_message('pandaStates', 1) + dat.pandaStates[0].ignitionLine = True + dat.pandaStates[0].pandaType = log.PandaState.PandaType.uno + + pm.send("pandaStates", dat) + + server = VisionIpcServer("camerad") + server.create_buffers(VisionStreamType.VISION_STREAM_ROAD, 40, False, *tici_f_frame_size) + server.create_buffers(VisionStreamType.VISION_STREAM_DRIVER, 40, False, *tici_f_frame_size) + server.create_buffers(VisionStreamType.VISION_STREAM_WIDE_ROAD, 40, False, *tici_f_frame_size) + server.start_listener() + + time.sleep(UI_DELAY) + + IMG = Camera.bgr2nv12(np.random.randint(0, 255, (*tici_f_frame_size,3), dtype=np.uint8)) + IMG_BYTES = IMG.flatten().tobytes() + + cams = ('roadCameraState', 'wideRoadCameraState') + + frame_id = 0 + for cam in cams: + msg = messaging.new_message(cam) + cs = getattr(msg, cam) + cs.frameId = frame_id + cs.timestampSof = int((frame_id * DT_MDL) * 1e9) + cs.timestampEof = int((frame_id * DT_MDL) * 1e9) + cam_meta = meta_from_camera_state(cam) + + pm.send(msg.which(), msg) + server.send(cam_meta.stream, IMG_BYTES, cs.frameId, cs.timestampSof, cs.timestampEof) + + time.sleep(UI_DELAY) + +def setup_onroad_map(click, pm: PubMaster): + setup_onroad(click, pm) + click(500, 500) + time.sleep(UI_DELAY) + +def setup_onroad_sidebar(click, pm: PubMaster): + setup_onroad_map(click, pm) + click(500, 500) + time.sleep(UI_DELAY) + CASES = { "homescreen": setup_homescreen, "settings_device": setup_settings_device, "settings_network": setup_settings_network, + "onroad": setup_onroad, + "onroad_map": setup_onroad_map, + "onroad_map_sidebar": setup_onroad_sidebar } - TEST_DIR = pathlib.Path(__file__).parent TEST_OUTPUT_DIR = TEST_DIR / "report" @@ -67,7 +130,7 @@ class TestUI(unittest.TestCase): def setup(self): self.sm = SubMaster(["uiDebug"]) - self.pm = PubMaster(["deviceState"]) + self.pm = PubMaster(["deviceState", "pandaStates", "controlsState", 'roadCameraState', 'wideRoadCameraState']) while not self.sm.valid["uiDebug"]: self.sm.update(1) time.sleep(UI_DELAY) # wait a bit more for the UI to finish rendering @@ -102,6 +165,7 @@ def create_html_report(): template = jinja2.Template(f.read()) cases = {f.stem: (str(f.relative_to(TEST_OUTPUT_DIR)), "reference.png") for f in SCREENSHOTS_DIR.glob("*.png")} + cases = dict(sorted(cases.items())) with open(OUTPUT_FILE, "w") as f: f.write(template.render(cases=cases))