#!/usr/bin/env python3 from cereal import car from opendbc.can.parser import CANParser from selfdrive.car.interfaces import RadarInterfaceBase from selfdrive.car.hyundai.values import DBC def get_radar_can_parser(CP): signals = [ # sig_name, sig_address, default ("ACC_ObjStatus", "SCC11", 0), ("ACC_ObjLatPos", "SCC11", 0), ("ACC_ObjDist", "SCC11", 0), ("ACC_ObjRelSpd", "SCC11", 0), ] checks = [ # address, frequency ("SCC11", 50), ] return CANParser(DBC[CP.carFingerprint]['pt'], signals, checks, 0) class RadarInterface(RadarInterfaceBase): def __init__(self, CP): super().__init__(CP) self.rcp = get_radar_can_parser(CP) self.updated_messages = set() self.trigger_msg = 0x420 self.track_id = 0 self.radar_off_can = CP.radarOffCan def update(self, can_strings): if self.radar_off_can: return super().update(None) vls = self.rcp.update_strings(can_strings) self.updated_messages.update(vls) if self.trigger_msg not in self.updated_messages: return None rr = self._update(self.updated_messages) self.updated_messages.clear() return rr def _update(self, updated_messages): ret = car.RadarData.new_message() cpt = self.rcp.vl errors = [] if not self.rcp.can_valid: errors.append("canError") ret.errors = errors valid = cpt["SCC11"]['ACC_ObjStatus'] if valid: for ii in range(2): if ii not in self.pts: self.pts[ii] = car.RadarData.RadarPoint.new_message() self.pts[ii].trackId = self.track_id self.track_id += 1 self.pts[ii].dRel = cpt["SCC11"]['ACC_ObjDist'] # from front of car self.pts[ii].yRel = -cpt["SCC11"]['ACC_ObjLatPos'] # in car frame's y axis, left is negative self.pts[ii].vRel = cpt["SCC11"]['ACC_ObjRelSpd'] self.pts[ii].aRel = float('nan') self.pts[ii].yvRel = float('nan') self.pts[ii].measured = True ret.points = list(self.pts.values()) return ret