|  |  | @ -93,10 +93,13 @@ class CarInterfaceBase(ABC): | 
			
		
	
		
		
			
				
					
					|  |  |  |       self.cp_loopback = self.CS.get_loopback_can_parser(CP) |  |  |  |       self.cp_loopback = self.CS.get_loopback_can_parser(CP) | 
			
		
	
		
		
			
				
					
					|  |  |  |       self.can_parsers = [self.cp, self.cp_cam, self.cp_adas, self.cp_body, self.cp_loopback] |  |  |  |       self.can_parsers = [self.cp, self.cp_cam, self.cp_adas, self.cp_body, self.cp_loopback] | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     self.CC = None |  |  |  |     self.CC: CarControllerBase = None | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |     if CarController is not None: |  |  |  |     if CarController is not None: | 
			
		
	
		
		
			
				
					
					|  |  |  |       self.CC = CarController(self.cp.dbc_name, CP, self.VM) |  |  |  |       self.CC = CarController(self.cp.dbc_name, CP, self.VM) | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   def apply(self, c: car.CarControl, now_nanos: int) -> tuple[car.CarControl.Actuators, list[tuple[int, int, bytes, int]]]: | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     return self.CC.update(c, self.CS, now_nanos) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   @staticmethod |  |  |  |   @staticmethod | 
			
		
	
		
		
			
				
					
					|  |  |  |   def get_pid_accel_limits(CP, current_speed, cruise_speed): |  |  |  |   def get_pid_accel_limits(CP, current_speed, cruise_speed): | 
			
		
	
		
		
			
				
					
					|  |  |  |     return ACCEL_MIN, ACCEL_MAX |  |  |  |     return ACCEL_MIN, ACCEL_MAX | 
			
		
	
	
		
		
			
				
					|  |  | @ -250,9 +253,6 @@ class CarInterfaceBase(ABC): | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     return reader |  |  |  |     return reader | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   @abstractmethod |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |   def apply(self, c: car.CarControl, now_nanos: int) -> tuple[car.CarControl.Actuators, list[bytes]]: |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     pass |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   def create_common_events(self, cs_out, extra_gears=None, pcm_enable=True, allow_enable=True, |  |  |  |   def create_common_events(self, cs_out, extra_gears=None, pcm_enable=True, allow_enable=True, | 
			
		
	
		
		
			
				
					
					|  |  |  |                            enable_buttons=(ButtonType.accelCruise, ButtonType.decelCruise)): |  |  |  |                            enable_buttons=(ButtonType.accelCruise, ButtonType.decelCruise)): | 
			
		
	
	
		
		
			
				
					|  |  | @ -460,7 +460,7 @@ SendCan = tuple[int, int, bytes, int] | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | class CarControllerBase(ABC): |  |  |  | class CarControllerBase(ABC): | 
			
		
	
		
		
			
				
					
					|  |  |  |   @abstractmethod |  |  |  |   @abstractmethod | 
			
		
	
		
		
			
				
					
					|  |  |  |   def update(self, CC, CS, now_nanos) -> tuple[car.CarControl.Actuators, list[SendCan]]: |  |  |  |   def update(self, CC: car.CarControl.Actuators, CS: car.CarState, now_nanos: int) -> tuple[car.CarControl.Actuators, list[SendCan]]: | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |     pass |  |  |  |     pass | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  |  | 
 |