| 
						
						
							
								
							
						
						
					 | 
					 | 
					@ -2,10 +2,8 @@ | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					import numpy as np | 
					 | 
					 | 
					 | 
					import numpy as np | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					from cereal import car | 
					 | 
					 | 
					 | 
					from cereal import car | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					from common.numpy_fast import clip, interp | 
					 | 
					 | 
					 | 
					from common.numpy_fast import clip, interp | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					from common.realtime import DT_CTRL | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					from selfdrive.swaglog import cloudlog | 
					 | 
					 | 
					 | 
					from selfdrive.swaglog import cloudlog | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					from selfdrive.config import Conversions as CV | 
					 | 
					 | 
					 | 
					from selfdrive.config import Conversions as CV | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					from selfdrive.controls.lib.events import ET | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					from selfdrive.car.honda.values import CruiseButtons, CAR, HONDA_BOSCH, HONDA_BOSCH_ALT_BRAKE_SIGNAL | 
					 | 
					 | 
					 | 
					from selfdrive.car.honda.values import CruiseButtons, CAR, HONDA_BOSCH, HONDA_BOSCH_ALT_BRAKE_SIGNAL | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					from selfdrive.car import STD_CARGO_KG, CivicParams, scale_rot_inertia, scale_tire_stiffness, gen_empty_fingerprint | 
					 | 
					 | 
					 | 
					from selfdrive.car import STD_CARGO_KG, CivicParams, scale_rot_inertia, scale_tire_stiffness, gen_empty_fingerprint | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					from selfdrive.controls.lib.longitudinal_planner import _A_CRUISE_MAX_V_FOLLOWING | 
					 | 
					 | 
					 | 
					from selfdrive.controls.lib.longitudinal_planner import _A_CRUISE_MAX_V_FOLLOWING | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -75,9 +73,6 @@ class CarInterface(CarInterfaceBase): | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  def __init__(self, CP, CarController, CarState): | 
					 | 
					 | 
					 | 
					  def __init__(self, CP, CarController, CarState): | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    super().__init__(CP, CarController, CarState) | 
					 | 
					 | 
					 | 
					    super().__init__(CP, CarController, CarState) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    self.last_enable_pressed = 0 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    self.last_enable_sent = 0 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if self.CS.CP.carFingerprint == CAR.ACURA_ILX: | 
					 | 
					 | 
					 | 
					    if self.CS.CP.carFingerprint == CAR.ACURA_ILX: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      self.compute_gb = get_compute_gb_acura() | 
					 | 
					 | 
					 | 
					      self.compute_gb = get_compute_gb_acura() | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    else: | 
					 | 
					 | 
					 | 
					    else: | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -488,7 +483,7 @@ class CarInterface(CarInterfaceBase): | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    ret.buttonEvents = buttonEvents | 
					 | 
					 | 
					 | 
					    ret.buttonEvents = buttonEvents | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    # events | 
					 | 
					 | 
					 | 
					    # events | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    events = self.create_common_events(ret, pcm_enable=False) | 
					 | 
					 | 
					 | 
					    events = self.create_common_events(ret, pcm_enable=self.CP.enableCruise) | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if self.CS.brake_error: | 
					 | 
					 | 
					 | 
					    if self.CS.brake_error: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      events.add(EventName.brakeUnavailable) | 
					 | 
					 | 
					 | 
					      events.add(EventName.brakeUnavailable) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if self.CS.brake_hold and self.CS.CP.openpilotLongitudinalControl: | 
					 | 
					 | 
					 | 
					    if self.CS.brake_hold and self.CS.CP.openpilotLongitudinalControl: | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -511,34 +506,18 @@ class CarInterface(CarInterfaceBase): | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if self.CS.CP.minEnableSpeed > 0 and ret.vEgo < 0.001: | 
					 | 
					 | 
					 | 
					    if self.CS.CP.minEnableSpeed > 0 and ret.vEgo < 0.001: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      events.add(EventName.manualRestart) | 
					 | 
					 | 
					 | 
					      events.add(EventName.manualRestart) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    cur_time = self.frame * DT_CTRL | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    enable_pressed = False | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    # handle button presses | 
					 | 
					 | 
					 | 
					    # handle button presses | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    for b in ret.buttonEvents: | 
					 | 
					 | 
					 | 
					    for b in ret.buttonEvents: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      # do enable on both accel and decel buttons | 
					 | 
					 | 
					 | 
					      # do enable on both accel and decel buttons | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      if b.type in [ButtonType.accelCruise, ButtonType.decelCruise] and not b.pressed: | 
					 | 
					 | 
					 | 
					      if b.type in [ButtonType.accelCruise, ButtonType.decelCruise] and not b.pressed: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        self.last_enable_pressed = cur_time | 
					 | 
					 | 
					 | 
					        if not self.CP.enableCruise: | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        enable_pressed = True | 
					 | 
					 | 
					 | 
					          events.add(EventName.buttonEnable) | 
				
			
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      # do disable on button down | 
					 | 
					 | 
					 | 
					      # do disable on button down | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      if b.type == "cancel" and b.pressed: | 
					 | 
					 | 
					 | 
					      if b.type == ButtonType.cancel and b.pressed: | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        events.add(EventName.buttonCancel) | 
					 | 
					 | 
					 | 
					        events.add(EventName.buttonCancel) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if self.CP.enableCruise: | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      # KEEP THIS EVENT LAST! send enable event if button is pressed and there are | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      # NO_ENTRY events, so controlsd will display alerts. Also not send enable events | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      # too close in time, so a no_entry will not be followed by another one. | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      # TODO: button press should be the only thing that triggers enable | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      if ((cur_time - self.last_enable_pressed) < 0.2 and | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					          (cur_time - self.last_enable_sent) > 0.2 and | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					          ret.cruiseState.enabled) or \ | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					         (enable_pressed and events.any(ET.NO_ENTRY)): | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        events.add(EventName.buttonEnable) | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        self.last_enable_sent = cur_time | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    elif enable_pressed: | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      events.add(EventName.buttonEnable) | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    ret.events = events.to_msg() | 
					 | 
					 | 
					 | 
					    ret.events = events.to_msg() | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    self.CS.out = ret.as_reader() | 
					 | 
					 | 
					 | 
					    self.CS.out = ret.as_reader() | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
					 | 
					
  |