Skip to content

Commit

Permalink
dcam: detect and ignore errors for unofficial devices (commaai#237)
Browse files Browse the repository at this point in the history
* dcam: detect and ignore errors for unofficial devices

* must be a registered device
  • Loading branch information
sunnyhaibin authored Aug 17, 2023
1 parent 0c3e99f commit 9a6653b
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 2 deletions.
1 change: 1 addition & 0 deletions common/params.cc
Original file line number Diff line number Diff line change
Expand Up @@ -298,6 +298,7 @@ std::unordered_map<std::string, uint32_t> keys = {
{"TrueVEgoUi", PERSISTENT},
{"TurnSpeedControl", PERSISTENT},
{"TurnVisionControl", PERSISTENT},
{"DriverCameraHardwareMissing", PERSISTENT},
{"VisionCurveLaneless", PERSISTENT},
{"VwAccType", PERSISTENT},
{"Offroad_SupersededUpdate", PERSISTENT},
Expand Down
15 changes: 14 additions & 1 deletion selfdrive/controls/controlsd.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
from panda import ALTERNATIVE_EXPERIENCE
from system.swaglog import cloudlog
from system.version import is_release_branch, get_short_branch
from selfdrive.athena.registration import is_registered_device
from selfdrive.boardd.boardd import can_list_to_can_capnp
from selfdrive.car.car_helpers import get_car, get_startup_event, get_one_can
from selfdrive.controls.lib.lane_planner import CAMERA_OFFSET
Expand Down Expand Up @@ -78,11 +79,19 @@ def __init__(self, sm=None, pm=None, can_sock=None, CI=None):
self.log_sock = messaging.sub_sock('androidLog')

self.params = Params()

self.d_camera_hardware_missing = self.params.get_bool("DriverCameraHardwareMissing") and not is_registered_device()
if self.d_camera_hardware_missing:
IGNORE_PROCESSES.update({"dmonitoringd", "dmonitoringmodeld"})
self.camera_packets.remove("driverCameraState")

self.sm = sm
if self.sm is None:
ignore = ['testJoystick']
if SIMULATION:
ignore += ['driverCameraState', 'managerState']
if self.d_camera_hardware_missing:
ignore += ['driverMonitoringState']
self.sm = messaging.SubMaster(['deviceState', 'pandaStates', 'peripheralState', 'modelV2', 'liveCalibration',
'driverMonitoringState', 'longitudinalPlan', 'lateralPlan', 'liveLocationKalman',
'managerState', 'liveParameters', 'radarState', 'liveTorqueParameters', 'testJoystick'] + self.camera_packets,
Expand Down Expand Up @@ -276,7 +285,8 @@ def update_events(self, CS):
self.events.add(EventName.gasPressedOverride)

if not self.CP.notCar:
self.events.add_from_msg(self.sm['driverMonitoringState'].events)
if not self.d_camera_hardware_missing:
self.events.add_from_msg(self.sm['driverMonitoringState'].events)
self.events.add_from_msg(self.sm['longitudinalPlan'].eventsDEPRECATED)

# Add car events, ignore if CAN isn't valid
Expand Down Expand Up @@ -372,6 +382,9 @@ def update_events(self, CS):
if not SIMULATION and not self.rk.lagging:
if not self.sm.all_alive(self.camera_packets):
self.events.add(EventName.cameraMalfunction)
if not self.sm.all_alive(['driverCameraState']) and not self.d_camera_hardware_missing:
self.d_camera_hardware_missing = True
put_bool_nonblocking("DriverCameraHardwareMissing", True)
elif not self.sm.all_freq_ok(self.camera_packets):
self.events.add(EventName.cameraFrameRate)
self.process_not_running = False
Expand Down
4 changes: 3 additions & 1 deletion selfdrive/manager/manager.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
from selfdrive.manager.helpers import unblock_stdout, write_onroad_params
from selfdrive.manager.process import ensure_running
from selfdrive.manager.process_config import managed_processes
from selfdrive.athena.registration import register, UNREGISTERED_DONGLE_ID
from selfdrive.athena.registration import register, UNREGISTERED_DONGLE_ID, is_registered_device
from system.swaglog import cloudlog, add_file_handler
from system.version import is_dirty, get_commit, get_version, get_origin, get_short_branch, \
get_normalized_origin, terms_version, training_version, \
Expand Down Expand Up @@ -204,6 +204,8 @@ def manager_thread() -> None:
if os.getenv("NOBOARD") is not None:
ignore.append("pandad")
ignore += [x for x in os.getenv("BLOCK", "").split(",") if len(x) > 0]
if params.get("DriverCameraHardwareMissing") and not is_registered_device():
ignore += ["dmonitoringd", "dmonitoringmodeld"]

sm = messaging.SubMaster(['deviceState', 'carParams'], poll=['deviceState'])
pm = messaging.PubMaster(['managerState'])
Expand Down

0 comments on commit 9a6653b

Please sign in to comment.