|  |  | @ -13,8 +13,11 @@ import time | 
			
		
	
		
		
			
				
					
					|  |  |  | from cereal import messaging, log |  |  |  | from cereal import messaging, log | 
			
		
	
		
		
			
				
					
					|  |  |  | from msgq.visionipc import VisionIpcServer, VisionStreamType |  |  |  | from msgq.visionipc import VisionIpcServer, VisionStreamType | 
			
		
	
		
		
			
				
					
					|  |  |  | from cereal.messaging import SubMaster, PubMaster |  |  |  | from cereal.messaging import SubMaster, PubMaster | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | from openpilot.common.basedir import BASEDIR | 
			
		
	
		
		
			
				
					
					|  |  |  | from openpilot.common.params import Params |  |  |  | from openpilot.common.params import Params | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | from openpilot.common.prefix import OpenpilotPrefix | 
			
		
	
		
		
			
				
					
					|  |  |  | from openpilot.common.transformations.camera import CameraConfig, DEVICE_CAMERAS |  |  |  | from openpilot.common.transformations.camera import CameraConfig, DEVICE_CAMERAS | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | from openpilot.selfdrive.controls.lib.alertmanager import set_offroad_alert | 
			
		
	
		
		
			
				
					
					|  |  |  | from openpilot.selfdrive.test.helpers import with_processes |  |  |  | from openpilot.selfdrive.test.helpers import with_processes | 
			
		
	
		
		
			
				
					
					|  |  |  | from openpilot.selfdrive.test.process_replay.migration import migrate_selfdriveState |  |  |  | from openpilot.selfdrive.test.process_replay.migration import migrate_selfdriveState | 
			
		
	
		
		
			
				
					
					|  |  |  | from openpilot.tools.lib.logreader import LogReader |  |  |  | from openpilot.tools.lib.logreader import LogReader | 
			
		
	
	
		
		
			
				
					|  |  | @ -25,6 +28,7 @@ UI_DELAY = 0.5 # may be slower on CI? | 
			
		
	
		
		
			
				
					
					|  |  |  | TEST_ROUTE = "a2a0ccea32023010|2023-07-27--13-01-19" |  |  |  | TEST_ROUTE = "a2a0ccea32023010|2023-07-27--13-01-19" | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | STREAMS: list[tuple[VisionStreamType, CameraConfig, bytes]] = [] |  |  |  | STREAMS: list[tuple[VisionStreamType, CameraConfig, bytes]] = [] | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | OFFROAD_ALERTS = ['Offroad_StorageMissing', 'Offroad_IsTakingSnapshot'] | 
			
		
	
		
		
			
				
					
					|  |  |  | DATA: dict[str, capnp.lib.capnp._DynamicStructBuilder] = dict.fromkeys( |  |  |  | DATA: dict[str, capnp.lib.capnp._DynamicStructBuilder] = dict.fromkeys( | 
			
		
	
		
		
			
				
					
					|  |  |  |   ["carParams", "deviceState", "pandaStates", "controlsState", "selfdriveState", |  |  |  |   ["carParams", "deviceState", "pandaStates", "controlsState", "selfdriveState", | 
			
		
	
		
		
			
				
					
					|  |  |  |   "liveCalibration", "modelV2", "radarState", "driverMonitoringState", "carState", |  |  |  |   "liveCalibration", "modelV2", "radarState", "driverMonitoringState", "carState", | 
			
		
	
	
		
		
			
				
					|  |  | @ -42,10 +46,6 @@ def setup_settings_device(click, pm: PubMaster): | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   click(100, 100) |  |  |  |   click(100, 100) | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | def setup_settings_network(click, pm: PubMaster): |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   setup_settings_device(click, pm) |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   click(300, 600) |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | def setup_onroad(click, pm: PubMaster): |  |  |  | def setup_onroad(click, pm: PubMaster): | 
			
		
	
		
		
			
				
					
					|  |  |  |   setup_common(click, pm) |  |  |  |   setup_common(click, pm) | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  |  | @ -55,7 +55,7 @@ def setup_onroad(click, pm: PubMaster): | 
			
		
	
		
		
			
				
					
					|  |  |  |   vipc_server.start_listener() |  |  |  |   vipc_server.start_listener() | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   packet_id = 0 |  |  |  |   packet_id = 0 | 
			
		
	
		
		
			
				
					
					|  |  |  |   for _ in range(30): |  |  |  |   for _ in range(20): | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |     for service, data in DATA.items(): |  |  |  |     for service, data in DATA.items(): | 
			
		
	
		
		
			
				
					
					|  |  |  |       if data: |  |  |  |       if data: | 
			
		
	
		
		
			
				
					
					|  |  |  |         data.clear_write_flag() |  |  |  |         data.clear_write_flag() | 
			
		
	
	
		
		
			
				
					|  |  | @ -108,18 +108,40 @@ def setup_onroad_alert_mid(click, pm: PubMaster): | 
			
		
	
		
		
			
				
					
					|  |  |  | def setup_onroad_alert_full(click, pm: PubMaster): |  |  |  | def setup_onroad_alert_full(click, pm: PubMaster): | 
			
		
	
		
		
			
				
					
					|  |  |  |   setup_onroad_alert(click, pm, 'Full Alert', 'This is a full alert message', log.SelfdriveState.AlertSize.full) |  |  |  |   setup_onroad_alert(click, pm, 'Full Alert', 'This is a full alert message', log.SelfdriveState.AlertSize.full) | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | def setup_offorad_alert(click, pm: PubMaster): | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   setup_common(click, pm) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   for alert in OFFROAD_ALERTS: | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     set_offroad_alert(alert, True) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   # Toggle between settings and home to refresh the offroad alert widget | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   setup_settings_device(click, pm) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   click(240, 216) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | def setup_update_available(click, pm: PubMaster): | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   setup_common(click, pm) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   Params().put_bool("UpdateAvailable", True) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   release_notes_path = os.path.join(BASEDIR, "RELEASES.md") | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   with open(release_notes_path) as file: | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     release_notes = file.read().split('\n\n', 1)[0] | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   Params().put("UpdaterNewReleaseNotes", release_notes + "\n") | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   setup_settings_device(click, pm) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   click(240, 216) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | CASES = { |  |  |  | CASES = { | 
			
		
	
		
		
			
				
					
					|  |  |  |   "homescreen": setup_homescreen, |  |  |  |   "homescreen": setup_homescreen, | 
			
		
	
		
		
			
				
					
					|  |  |  |   "settings_device": setup_settings_device, |  |  |  |   "settings_device": setup_settings_device, | 
			
		
	
		
		
			
				
					
					|  |  |  |   "settings_network": setup_settings_network, |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   "onroad": setup_onroad, |  |  |  |   "onroad": setup_onroad, | 
			
		
	
		
		
			
				
					
					|  |  |  |   "onroad_sidebar": setup_onroad_sidebar, |  |  |  |   "onroad_sidebar": setup_onroad_sidebar, | 
			
		
	
		
		
			
				
					
					|  |  |  |   "onroad_wide": setup_onroad_wide, |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   "onroad_wide_sidebar": setup_onroad_wide_sidebar, |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   "onroad_alert_small": setup_onroad_alert_small, |  |  |  |   "onroad_alert_small": setup_onroad_alert_small, | 
			
		
	
		
		
			
				
					
					|  |  |  |   "onroad_alert_mid": setup_onroad_alert_mid, |  |  |  |   "onroad_alert_mid": setup_onroad_alert_mid, | 
			
		
	
		
		
			
				
					
					|  |  |  |   "onroad_alert_full": setup_onroad_alert_full, |  |  |  |   "onroad_alert_full": setup_onroad_alert_full, | 
			
		
	
		
		
			
				
					
					|  |  |  |   "driver_camera": setup_driver_camera |  |  |  |   "onroad_wide": setup_onroad_wide, | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   "onroad_wide_sidebar": setup_onroad_wide_sidebar, | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   "driver_camera": setup_driver_camera, | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   "offroad_alert": setup_offorad_alert, | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   "update_available": setup_update_available | 
			
		
	
		
		
			
				
					
					|  |  |  | } |  |  |  | } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | TEST_DIR = pathlib.Path(__file__).parent |  |  |  | TEST_DIR = pathlib.Path(__file__).parent | 
			
		
	
	
		
		
			
				
					|  |  | @ -212,6 +234,8 @@ def create_screenshots(): | 
			
		
	
		
		
			
				
					
					|  |  |  |   STREAMS.append((VisionStreamType.VISION_STREAM_DRIVER, cam.dcam, driver_img.flatten().tobytes())) |  |  |  |   STREAMS.append((VisionStreamType.VISION_STREAM_DRIVER, cam.dcam, driver_img.flatten().tobytes())) | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   t = TestUI() |  |  |  |   t = TestUI() | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   with OpenpilotPrefix(): | 
			
		
	
		
		
			
				
					
					|  |  |  |     for name, setup in CASES.items(): |  |  |  |     for name, setup in CASES.items(): | 
			
		
	
		
		
			
				
					
					|  |  |  |       t.test_ui(name, setup) |  |  |  |       t.test_ui(name, setup) | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  |  | 
 |