|  |  | @ -34,34 +34,24 @@ DATA: dict[str, capnp.lib.capnp._DynamicStructBuilder] = dict.fromkeys( | 
			
		
	
		
		
			
				
					
					|  |  |  |   "liveCalibration", "modelV2", "radarState", "driverMonitoringState", "carState", |  |  |  |   "liveCalibration", "modelV2", "radarState", "driverMonitoringState", "carState", | 
			
		
	
		
		
			
				
					
					|  |  |  |   "driverStateV2", "roadCameraState", "wideRoadCameraState", "driverCameraState"], None) |  |  |  |   "driverStateV2", "roadCameraState", "wideRoadCameraState", "driverCameraState"], None) | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | def setup_common(click, pm: PubMaster): |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   Params().put("DongleId", "123456789012345") |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   pm.send('deviceState', DATA['deviceState']) |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | def setup_homescreen(click, pm: PubMaster): |  |  |  | def setup_homescreen(click, pm: PubMaster): | 
			
		
	
		
		
			
				
					
					|  |  |  |   setup_common(click, pm) |  |  |  |   pass | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | def setup_settings_device(click, pm: PubMaster): |  |  |  | def setup_settings_device(click, pm: PubMaster): | 
			
		
	
		
		
			
				
					
					|  |  |  |   setup_common(click, pm) |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   click(100, 100) |  |  |  |   click(100, 100) | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | def setup_onroad(click, pm: PubMaster): |  |  |  | def setup_onroad(click, pm: PubMaster): | 
			
		
	
		
		
			
				
					
					|  |  |  |   setup_common(click, pm) |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   vipc_server = VisionIpcServer("camerad") |  |  |  |   vipc_server = VisionIpcServer("camerad") | 
			
		
	
		
		
			
				
					
					|  |  |  |   for stream_type, cam, _ in STREAMS: |  |  |  |   for stream_type, cam, _ in STREAMS: | 
			
		
	
		
		
			
				
					
					|  |  |  |     vipc_server.create_buffers(stream_type, 5, False, cam.width, cam.height) |  |  |  |     vipc_server.create_buffers(stream_type, 5, False, cam.width, cam.height) | 
			
		
	
		
		
			
				
					
					|  |  |  |   vipc_server.start_listener() |  |  |  |   vipc_server.start_listener() | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   packet_id = 0 |  |  |  |   for packet_id in range(20): | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |   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() | 
			
		
	
		
		
			
				
					
					|  |  |  |         pm.send(service, data) |  |  |  |         pm.send(service, data) | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     packet_id = packet_id + 1 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     for stream_type, _, image in STREAMS: |  |  |  |     for stream_type, _, image in STREAMS: | 
			
		
	
		
		
			
				
					
					|  |  |  |       vipc_server.send(stream_type, image, packet_id, packet_id, packet_id) |  |  |  |       vipc_server.send(stream_type, image, packet_id, packet_id, packet_id) | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  |  | @ -116,7 +106,6 @@ 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_offroad_alert(click, pm: PubMaster): |  |  |  | def setup_offroad_alert(click, pm: PubMaster): | 
			
		
	
		
		
			
				
					
					|  |  |  |   setup_common(click, pm) |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   for alert in OFFROAD_ALERTS: |  |  |  |   for alert in OFFROAD_ALERTS: | 
			
		
	
		
		
			
				
					
					|  |  |  |     set_offroad_alert(alert, True) |  |  |  |     set_offroad_alert(alert, True) | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  |  | @ -125,7 +114,6 @@ def setup_offroad_alert(click, pm: PubMaster): | 
			
		
	
		
		
			
				
					
					|  |  |  |   click(240, 216) |  |  |  |   click(240, 216) | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | def setup_update_available(click, pm: PubMaster): |  |  |  | def setup_update_available(click, pm: PubMaster): | 
			
		
	
		
		
			
				
					
					|  |  |  |   setup_common(click, pm) |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   Params().put_bool("UpdateAvailable", True) |  |  |  |   Params().put_bool("UpdateAvailable", True) | 
			
		
	
		
		
			
				
					
					|  |  |  |   release_notes_path = os.path.join(BASEDIR, "RELEASES.md") |  |  |  |   release_notes_path = os.path.join(BASEDIR, "RELEASES.md") | 
			
		
	
		
		
			
				
					
					|  |  |  |   with open(release_notes_path) as file: |  |  |  |   with open(release_notes_path) as file: | 
			
		
	
	
		
		
			
				
					|  |  | @ -164,11 +152,13 @@ class TestUI: | 
			
		
	
		
		
			
				
					
					|  |  |  |     sys.modules["mouseinfo"] = False |  |  |  |     sys.modules["mouseinfo"] = False | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   def setup(self): |  |  |  |   def setup(self): | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     Params().put("DongleId", "123456789012345") | 
			
		
	
		
		
			
				
					
					|  |  |  |     self.sm = SubMaster(["uiDebug"]) |  |  |  |     self.sm = SubMaster(["uiDebug"]) | 
			
		
	
		
		
			
				
					
					|  |  |  |     self.pm = PubMaster(list(DATA.keys())) |  |  |  |     self.pm = PubMaster(list(DATA.keys())) | 
			
		
	
		
		
			
				
					
					|  |  |  |     while not self.sm.valid["uiDebug"]: |  |  |  |     while not self.sm.valid["uiDebug"]: | 
			
		
	
		
		
			
				
					
					|  |  |  |       self.sm.update(1) |  |  |  |       self.sm.update(1) | 
			
		
	
		
		
			
				
					
					|  |  |  |     time.sleep(UI_DELAY) # wait a bit more for the UI to start rendering |  |  |  |     time.sleep(UI_DELAY) # wait a bit more for the UI to start rendering | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     self.pm.send('deviceState', DATA['deviceState']) | 
			
		
	
		
		
			
				
					
					|  |  |  |     try: |  |  |  |     try: | 
			
		
	
		
		
			
				
					
					|  |  |  |       self.ui = pywinctl.getWindowsWithTitle("ui")[0] |  |  |  |       self.ui = pywinctl.getWindowsWithTitle("ui")[0] | 
			
		
	
		
		
			
				
					
					|  |  |  |     except Exception as e: |  |  |  |     except Exception as e: | 
			
		
	
	
		
		
			
				
					|  |  | @ -195,8 +185,6 @@ class TestUI: | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     setup_case(self.click, self.pm) |  |  |  |     setup_case(self.click, self.pm) | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     time.sleep(UI_DELAY) # wait a bit more for the UI to finish rendering |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     im = self.screenshot() |  |  |  |     im = self.screenshot() | 
			
		
	
		
		
			
				
					
					|  |  |  |     plt.imsave(SCREENSHOTS_DIR / f"{name}.png", im) |  |  |  |     plt.imsave(SCREENSHOTS_DIR / f"{name}.png", im) | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  |  | 
 |