#!/usr/bin/env python3 from cereal import car from common.realtime import DT_CTRL from selfdrive.car import scale_rot_inertia, scale_tire_stiffness, get_safety_config from selfdrive.car.interfaces import CarInterfaceBase from selfdrive.car.body.values import SPEED_FROM_RPM class CarInterface(CarInterfaceBase): @staticmethod def get_params(candidate, fingerprint=None, car_fw=None, disable_radar=False): ret = CarInterfaceBase.get_std_params(candidate, fingerprint) ret.notCar = True ret.carName = "body" ret.safetyConfigs = [get_safety_config(car.CarParams.SafetyModel.body)] ret.steerRatio = 0.5 ret.steerRateCost = 0.5 ret.steerLimitTimer = 1.0 ret.steerActuatorDelay = 0. ret.mass = 9 ret.wheelbase = 0.406 ret.wheelSpeedFactor = SPEED_FROM_RPM ret.centerToFront = ret.wheelbase * 0.44 ret.radarOffCan = True ret.openpilotLongitudinalControl = True ret.steerControlType = car.CarParams.SteerControlType.angle ret.rotationalInertia = scale_rot_inertia(ret.mass, ret.wheelbase) ret.tireStiffnessFront, ret.tireStiffnessRear = scale_tire_stiffness(ret.mass, ret.wheelbase, ret.centerToFront) return ret def update(self, c, can_strings): self.cp.update_strings(can_strings) ret = self.CS.update(self.cp) ret.canValid = self.cp.can_valid # wait for everything to init first if self.frame > int(5. / DT_CTRL): # body always wants to enable ret.init('events', 1) ret.events[0].name = car.CarEvent.EventName.pcmEnable ret.events[0].enable = True self.frame += 1 self.CS.out = ret.as_reader() return self.CS.out def apply(self, c): return self.CC.update(c, self.CS)