|  |  | @ -22,23 +22,8 @@ class CarController: | 
			
		
	
		
		
			
				
					
					|  |  |  |   def update(self, CC, CS): |  |  |  |   def update(self, CC, CS): | 
			
		
	
		
		
			
				
					
					|  |  |  |     can_sends = [] |  |  |  |     can_sends = [] | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     # TODO: can we make this more sane? why is it different for all the cars? |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     lkas_control_bit = self.lkas_control_bit_prev |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     if CS.out.vEgo > self.CP.minSteerSpeed: |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |       lkas_control_bit = True |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     elif self.CP.carFingerprint in (CAR.PACIFICA_2019_HYBRID, CAR.PACIFICA_2020, CAR.JEEP_CHEROKEE_2019): |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |       if CS.out.vEgo < (self.CP.minSteerSpeed - 3.0): |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         lkas_control_bit = False |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     elif self.CP.carFingerprint in RAM_CARS: |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |       if CS.out.vEgo < (self.CP.minSteerSpeed - 0.5): |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |         lkas_control_bit = False |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     # EPS faults if LKAS re-enables too quickly |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     lkas_control_bit = lkas_control_bit and (self.frame - self.last_lkas_falling_edge > 200) |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     lkas_active = CC.latActive and self.lkas_control_bit_prev |  |  |  |     lkas_active = CC.latActive and self.lkas_control_bit_prev | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     # *** control msgs *** |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     # cruise buttons |  |  |  |     # cruise buttons | 
			
		
	
		
		
			
				
					
					|  |  |  |     if (self.frame - self.last_button_frame)*DT_CTRL > 0.05: |  |  |  |     if (self.frame - self.last_button_frame)*DT_CTRL > 0.05: | 
			
		
	
		
		
			
				
					
					|  |  |  |       das_bus = 2 if self.CP.carFingerprint in RAM_CARS else 0 |  |  |  |       das_bus = 2 if self.CP.carFingerprint in RAM_CARS else 0 | 
			
		
	
	
		
		
			
				
					|  |  | @ -61,19 +46,35 @@ class CarController: | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     # steering |  |  |  |     # steering | 
			
		
	
		
		
			
				
					
					|  |  |  |     if self.frame % 2 == 0: |  |  |  |     if self.frame % 2 == 0: | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       # TODO: can we make this more sane? why is it different for all the cars? | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       lkas_control_bit = self.lkas_control_bit_prev | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       if CS.out.vEgo > self.CP.minSteerSpeed: | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         lkas_control_bit = True | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       elif self.CP.carFingerprint in (CAR.PACIFICA_2019_HYBRID, CAR.PACIFICA_2020, CAR.JEEP_CHEROKEE_2019): | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         if CS.out.vEgo < (self.CP.minSteerSpeed - 3.0): | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |           lkas_control_bit = False | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       elif self.CP.carFingerprint in RAM_CARS: | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         if CS.out.vEgo < (self.CP.minSteerSpeed - 0.5): | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |           lkas_control_bit = False | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       # EPS faults if LKAS re-enables too quickly | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       lkas_control_bit = lkas_control_bit and (self.frame - self.last_lkas_falling_edge > 200) | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       if not lkas_control_bit and self.lkas_control_bit_prev: | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         self.last_lkas_falling_edge = self.frame | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |       self.lkas_control_bit_prev = lkas_control_bit | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |       # steer torque |  |  |  |       # steer torque | 
			
		
	
		
		
			
				
					
					|  |  |  |       new_steer = int(round(CC.actuators.steer * self.params.STEER_MAX)) |  |  |  |       new_steer = int(round(CC.actuators.steer * self.params.STEER_MAX)) | 
			
		
	
		
		
			
				
					
					|  |  |  |       apply_steer = apply_toyota_steer_torque_limits(new_steer, self.apply_steer_last, CS.out.steeringTorqueEps, self.params) |  |  |  |       apply_steer = apply_toyota_steer_torque_limits(new_steer, self.apply_steer_last, CS.out.steeringTorqueEps, self.params) | 
			
		
	
		
		
			
				
					
					|  |  |  |       if not lkas_active: |  |  |  |       if not lkas_active or not lkas_control_bit: | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |         apply_steer = 0 |  |  |  |         apply_steer = 0 | 
			
		
	
		
		
			
				
					
					|  |  |  |       self.apply_steer_last = apply_steer |  |  |  |       self.apply_steer_last = apply_steer | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |       can_sends.append(create_lkas_command(self.packer, self.CP, int(apply_steer), lkas_control_bit)) |  |  |  |       can_sends.append(create_lkas_command(self.packer, self.CP, int(apply_steer), lkas_control_bit)) | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     self.frame += 1 |  |  |  |     self.frame += 1 | 
			
		
	
		
		
			
				
					
					|  |  |  |     if not lkas_control_bit and self.lkas_control_bit_prev: |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |       self.last_lkas_falling_edge = self.frame |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  |     self.lkas_control_bit_prev = lkas_control_bit |  |  |  |  | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     new_actuators = CC.actuators.copy() |  |  |  |     new_actuators = CC.actuators.copy() | 
			
		
	
		
		
			
				
					
					|  |  |  |     new_actuators.steer = self.apply_steer_last / self.params.STEER_MAX |  |  |  |     new_actuators.steer = self.apply_steer_last / self.params.STEER_MAX | 
			
		
	
	
		
		
			
				
					|  |  | 
 |