|  |  | @ -1,14 +1,16 @@ | 
			
		
	
		
		
			
				
					
					|  |  |  | #!/usr/bin/env python3 |  |  |  | #!/usr/bin/env python3 | 
			
		
	
		
		
			
				
					
					|  |  |  | from panda import Panda |  |  |  | from panda import Panda | 
			
		
	
		
		
			
				
					
					|  |  |  | from openpilot.selfdrive.car import get_safety_config |  |  |  | from openpilot.selfdrive.car import get_safety_config, structs | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  | from openpilot.selfdrive.car.structs import CarParams |  |  |  | from openpilot.selfdrive.car.tesla.carstate import CarState | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  | from openpilot.selfdrive.car.tesla.values import CANBUS, CAR |  |  |  | from openpilot.selfdrive.car.tesla.values import CANBUS, CAR | 
			
		
	
		
		
			
				
					
					|  |  |  | from openpilot.selfdrive.car.interfaces import CarInterfaceBase |  |  |  | from openpilot.selfdrive.car.interfaces import CarInterfaceBase | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | class CarInterface(CarInterfaceBase): |  |  |  | class CarInterface(CarInterfaceBase): | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |   CS: CarState | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   @staticmethod |  |  |  |   @staticmethod | 
			
		
	
		
		
			
				
					
					|  |  |  |   def _get_params(ret: CarParams, candidate, fingerprint, car_fw, experimental_long, docs): |  |  |  |   def _get_params(ret: structs.CarParams, candidate, fingerprint, car_fw, experimental_long, docs): | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |     ret.carName = "tesla" |  |  |  |     ret.carName = "tesla" | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     # There is no safe way to do steer blending with user torque, |  |  |  |     # There is no safe way to do steer blending with user torque, | 
			
		
	
	
		
		
			
				
					|  |  | @ -16,7 +18,7 @@ class CarInterface(CarInterfaceBase): | 
			
		
	
		
		
			
				
					
					|  |  |  |     # how openpilot should be, hence dashcamOnly |  |  |  |     # how openpilot should be, hence dashcamOnly | 
			
		
	
		
		
			
				
					
					|  |  |  |     ret.dashcamOnly = True |  |  |  |     ret.dashcamOnly = True | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     ret.steerControlType = CarParams.SteerControlType.angle |  |  |  |     ret.steerControlType = structs.CarParams.SteerControlType.angle | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     ret.longitudinalActuatorDelay = 0.5 # s |  |  |  |     ret.longitudinalActuatorDelay = 0.5 # s | 
			
		
	
		
		
			
				
					
					|  |  |  |     ret.radarTimeStep = (1.0 / 8) # 8Hz |  |  |  |     ret.radarTimeStep = (1.0 / 8) # 8Hz | 
			
		
	
	
		
		
			
				
					|  |  | @ -28,18 +30,18 @@ class CarInterface(CarInterfaceBase): | 
			
		
	
		
		
			
				
					
					|  |  |  |       ret.openpilotLongitudinalControl = True |  |  |  |       ret.openpilotLongitudinalControl = True | 
			
		
	
		
		
			
				
					
					|  |  |  |       flags |= Panda.FLAG_TESLA_LONG_CONTROL |  |  |  |       flags |= Panda.FLAG_TESLA_LONG_CONTROL | 
			
		
	
		
		
			
				
					
					|  |  |  |       ret.safetyConfigs = [ |  |  |  |       ret.safetyConfigs = [ | 
			
		
	
		
		
			
				
					
					|  |  |  |         get_safety_config(CarParams.SafetyModel.tesla, flags), |  |  |  |         get_safety_config(structs.CarParams.SafetyModel.tesla, flags), | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |         get_safety_config(CarParams.SafetyModel.tesla, flags | Panda.FLAG_TESLA_POWERTRAIN), |  |  |  |         get_safety_config(structs.CarParams.SafetyModel.tesla, flags | Panda.FLAG_TESLA_POWERTRAIN), | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |       ] |  |  |  |       ] | 
			
		
	
		
		
			
				
					
					|  |  |  |     else: |  |  |  |     else: | 
			
		
	
		
		
			
				
					
					|  |  |  |       ret.openpilotLongitudinalControl = False |  |  |  |       ret.openpilotLongitudinalControl = False | 
			
		
	
		
		
			
				
					
					|  |  |  |       ret.safetyConfigs = [get_safety_config(CarParams.SafetyModel.tesla, flags)] |  |  |  |       ret.safetyConfigs = [get_safety_config(structs.CarParams.SafetyModel.tesla, flags)] | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     ret.steerLimitTimer = 1.0 |  |  |  |     ret.steerLimitTimer = 1.0 | 
			
		
	
		
		
			
				
					
					|  |  |  |     ret.steerActuatorDelay = 0.25 |  |  |  |     ret.steerActuatorDelay = 0.25 | 
			
		
	
		
		
			
				
					
					|  |  |  |     return ret |  |  |  |     return ret | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |   def _update(self, c): |  |  |  |   def _update(self, c) -> structs.CarState: | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					|  |  |  |     ret = self.CS.update(self.cp, self.cp_cam) |  |  |  |     ret = self.CS.update(self.cp, self.cp_cam) | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     ret.events = self.create_common_events(ret).to_msg() |  |  |  |     ret.events = self.create_common_events(ret).to_msg() | 
			
		
	
	
		
		
			
				
					|  |  | 
 |