Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions cereal/log.capnp
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,7 @@ struct OnroadEvent @0xc4fa6047f024e718 {
audioFeedback @97;

soundsUnavailableDEPRECATED @47;
radarIsNotDetected @100;
}
}

Expand Down
1 change: 1 addition & 0 deletions opendbc_repo/opendbc/car/car.capnp
Original file line number Diff line number Diff line change
Expand Up @@ -305,6 +305,7 @@ struct RadarData @0x888ad6581cf0aacb {
radarFault @1 :Bool;
wrongConfig @2 :Bool;
radarUnavailableTemporary @3 :Bool; # radar data is temporarily unavailable due to conditions the car sets
radarUnavailablePermanent @4 :Bool; # radar data is permanently unavailable due to not having ACC
}

# similar to LiveTracks
Expand Down
11 changes: 11 additions & 0 deletions opendbc_repo/opendbc/car/ford/radar_interface.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
DELPHI_MRR_CLUSTER_THRESHOLD = 5 # meters, lateral distance and relative velocity are weighted

STEER_ASSIST_DATA_MSGS = 0x3d7
RADAR_ABSENT_ = 500 #Used to detect if the radar is absent for 5s and then set the radarUnavailablePermanent flag to True

@dataclass
class Cluster:
Expand Down Expand Up @@ -123,6 +124,8 @@ def __init__(self, CP, CP_SP):
self.radar = DBC[CP.carFingerprint].get(Bus.radar)
self.scan_index_invalid_cnt = 0
self.radar_unavailable_cnt = 0
self.radar_perm_cnt = 0
self.radar_working = False
self.prev_headerScanIndex = 0
if CP.radarUnavailable:
self.rcp = None
Expand Down Expand Up @@ -151,8 +154,16 @@ def update(self, can_strings):
self.updated_messages.update(vls)

if self.trigger_msg not in self.updated_messages:
if not self.radar_working:
self.radar_perm_cnt += 1
if self.radar_perm_cnt >= RADAR_ABSENT_:
ret = structs.RadarData()
ret.errors.radarUnavailablePermanent = True
return ret
return None
self.updated_messages.clear()
self.radar_working = True
self.radar_perm_cnt = 0

ret = structs.RadarData()
if not self.rcp.can_valid:
Expand Down
5 changes: 5 additions & 0 deletions selfdrive/selfdrived/events.py
Original file line number Diff line number Diff line change
Expand Up @@ -706,6 +706,11 @@ def invalid_lkas_setting_alert(CP: car.CarParams, CS: car.CarState, sm: messagin
ET.NO_ENTRY: NoEntryAlert("Radar Temporarily Unavailable"),
},

EventName.radarIsNotDetected: {
ET.PERMANENT: NormalPermanentAlert("Car may not have ACC"),
ET.NO_ENTRY: NoEntryAlert("Radar Is Not Detected"),
},

# Every frame from the camera should be processed by the model. If modeld
# is not processing frames fast enough they have to be dropped. This alert is
# thrown when over 20% of frames are dropped.
Expand Down
2 changes: 2 additions & 0 deletions selfdrive/selfdrived/selfdrived.py
Original file line number Diff line number Diff line change
Expand Up @@ -380,6 +380,8 @@ def update_events(self, CS):
self.events.add(EventName.canError)
elif self.sm['radarState'].radarErrors.radarUnavailableTemporary:
self.events.add(EventName.radarTempUnavailable)
elif self.sm['radarState'].radarErrors.radarUnavailablePermanent:
self.events.add(EventName.radarIsNotDetected)
elif any(self.sm['radarState'].radarErrors.to_dict().values()):
self.events.add(EventName.radarFault)
if not self.sm.valid['pandaStates']:
Expand Down