manager: refactor process starting logic (#29574)

* refactor into sane api

* always set

* cleanup

* cleanup

* and there too

* fix order

* fail

* and ensure we test

* pass test

pass test

* order

* only diff not related

---------

Co-authored-by: Shane Smiskol <shane@smiskol.com>
pull/29588/head
Adeeb Shihadeh 2 years ago committed by GitHub
parent d58cb9994f
commit d013f2174a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 40
      selfdrive/manager/process.py
  2. 98
      selfdrive/manager/process_config.py

@ -66,9 +66,7 @@ def join_process(process: Process, timeout: float) -> None:
class ManagerProcess(ABC): class ManagerProcess(ABC):
daemon = False daemon = False
sigkill = False sigkill = False
onroad = True should_run: Callable[[bool, Params, car.CarParams], bool]
offroad = False
callback: Optional[Callable[[bool, Params, car.CarParams], bool]] = None
proc: Optional[Process] = None proc: Optional[Process] = None
enabled = True enabled = True
name = "" name = ""
@ -170,15 +168,12 @@ class ManagerProcess(ABC):
class NativeProcess(ManagerProcess): class NativeProcess(ManagerProcess):
def __init__(self, name, cwd, cmdline, enabled=True, onroad=True, offroad=False, callback=None, unkillable=False, sigkill=False, watchdog_max_dt=None): def __init__(self, name, cwd, cmdline, should_run, enabled=True, sigkill=False, watchdog_max_dt=None):
self.name = name self.name = name
self.cwd = cwd self.cwd = cwd
self.cmdline = cmdline self.cmdline = cmdline
self.should_run = should_run
self.enabled = enabled self.enabled = enabled
self.onroad = onroad
self.offroad = offroad
self.callback = callback
self.unkillable = unkillable
self.sigkill = sigkill self.sigkill = sigkill
self.watchdog_max_dt = watchdog_max_dt self.watchdog_max_dt = watchdog_max_dt
self.launcher = nativelauncher self.launcher = nativelauncher
@ -203,14 +198,11 @@ class NativeProcess(ManagerProcess):
class PythonProcess(ManagerProcess): class PythonProcess(ManagerProcess):
def __init__(self, name, module, enabled=True, onroad=True, offroad=False, callback=None, unkillable=False, sigkill=False, watchdog_max_dt=None): def __init__(self, name, module, should_run, enabled=True, sigkill=False, watchdog_max_dt=None):
self.name = name self.name = name
self.module = module self.module = module
self.should_run = should_run
self.enabled = enabled self.enabled = enabled
self.onroad = onroad
self.offroad = offroad
self.callback = callback
self.unkillable = unkillable
self.sigkill = sigkill self.sigkill = sigkill
self.watchdog_max_dt = watchdog_max_dt self.watchdog_max_dt = watchdog_max_dt
self.launcher = launcher self.launcher = launcher
@ -243,10 +235,12 @@ class DaemonProcess(ManagerProcess):
self.module = module self.module = module
self.param_name = param_name self.param_name = param_name
self.enabled = enabled self.enabled = enabled
self.onroad = True
self.offroad = True
self.params = None self.params = None
@staticmethod
def should_run(started, params, CP):
return True
def prepare(self) -> None: def prepare(self) -> None:
pass pass
@ -286,21 +280,7 @@ def ensure_running(procs: ValuesView[ManagerProcess], started: bool, params=None
running = [] running = []
for p in procs: for p in procs:
# Conditions that make a process run if p.enabled and p.name not in not_run and p.should_run(started, params, CP):
run = any((
p.offroad and not started,
p.onroad and started,
))
if p.callback is not None and None not in (params, CP):
run = run or p.callback(started, params, CP)
# Conditions that block a process from starting
run = run and not any((
not p.enabled,
p.name in not_run,
))
if run:
p.start() p.start()
running.append(p) running.append(p)
else: else:

@ -8,13 +8,13 @@ from openpilot.selfdrive.manager.process import PythonProcess, NativeProcess, Da
WEBCAM = os.getenv("USE_WEBCAM") is not None WEBCAM = os.getenv("USE_WEBCAM") is not None
def driverview(started: bool, params: Params, CP: car.CarParams) -> bool: def driverview(started: bool, params: Params, CP: car.CarParams) -> bool:
return params.get_bool("IsDriverViewEnabled") # type: ignore return started or params.get_bool("IsDriverViewEnabled")
def notcar(started: bool, params: Params, CP: car.CarParams) -> bool: def notcar(started: bool, params: Params, CP: car.CarParams) -> bool:
return CP.notCar # type: ignore return started and CP.notCar
def iscar(started: bool, params: Params, CP: car.CarParams) -> bool: def iscar(started: bool, params: Params, CP: car.CarParams) -> bool:
return not CP.notCar return started and not CP.notCar
def logging(started, params, CP: car.CarParams) -> bool: def logging(started, params, CP: car.CarParams) -> bool:
run = (not CP.notCar) or not params.get_bool("DisableLogging") run = (not CP.notCar) or not params.get_bool("DisableLogging")
@ -32,51 +32,61 @@ def ublox(started, params, CP: car.CarParams) -> bool:
def qcomgps(started, params, CP: car.CarParams) -> bool: def qcomgps(started, params, CP: car.CarParams) -> bool:
return started and not ublox_available() return started and not ublox_available()
procs = [ def always_run(started, params, CP: car.CarParams) -> bool:
NativeProcess("camerad", "system/camerad", ["./camerad"], callback=driverview), return True
NativeProcess("clocksd", "system/clocksd", ["./clocksd"]),
NativeProcess("logcatd", "system/logcatd", ["./logcatd"]), def only_onroad(started: bool, params, CP: car.CarParams) -> bool:
NativeProcess("proclogd", "system/proclogd", ["./proclogd"]), return started
PythonProcess("logmessaged", "system.logmessaged", offroad=True),
PythonProcess("micd", "system.micd", callback=iscar), def only_offroad(started, params, CP: car.CarParams) -> bool:
PythonProcess("timezoned", "system.timezoned", enabled=not PC, offroad=True), return not started
procs = [
DaemonProcess("manage_athenad", "selfdrive.athena.manage_athenad", "AthenadPid"), DaemonProcess("manage_athenad", "selfdrive.athena.manage_athenad", "AthenadPid"),
NativeProcess("dmonitoringmodeld", "selfdrive/modeld", ["./dmonitoringmodeld"], enabled=(not PC or WEBCAM), callback=driverview),
NativeProcess("encoderd", "system/loggerd", ["./encoderd"]), NativeProcess("camerad", "system/camerad", ["./camerad"], driverview),
NativeProcess("stream_encoderd", "system/loggerd", ["./encoderd", "--stream"], onroad=False, callback=notcar), NativeProcess("clocksd", "system/clocksd", ["./clocksd"], only_onroad),
NativeProcess("loggerd", "system/loggerd", ["./loggerd"], onroad=False, callback=logging), NativeProcess("logcatd", "system/logcatd", ["./logcatd"], only_onroad),
NativeProcess("modeld", "selfdrive/modeld", ["./modeld"]), NativeProcess("proclogd", "system/proclogd", ["./proclogd"], only_onroad),
NativeProcess("mapsd", "selfdrive/navd", ["./mapsd"]), PythonProcess("logmessaged", "system.logmessaged", always_run),
NativeProcess("navmodeld", "selfdrive/modeld", ["./navmodeld"]), PythonProcess("micd", "system.micd", iscar),
NativeProcess("sensord", "system/sensord", ["./sensord"], enabled=not PC), PythonProcess("timezoned", "system.timezoned", always_run, enabled=not PC),
NativeProcess("ui", "selfdrive/ui", ["./ui"], offroad=True, watchdog_max_dt=(5 if not PC else None)),
NativeProcess("soundd", "selfdrive/ui/soundd", ["./soundd"]), NativeProcess("dmonitoringmodeld", "selfdrive/modeld", ["./dmonitoringmodeld"], driverview, enabled=(not PC or WEBCAM)),
NativeProcess("locationd", "selfdrive/locationd", ["./locationd"]), NativeProcess("encoderd", "system/loggerd", ["./encoderd"], only_onroad),
NativeProcess("boardd", "selfdrive/boardd", ["./boardd"], enabled=False), NativeProcess("stream_encoderd", "system/loggerd", ["./encoderd", "--stream"], notcar),
PythonProcess("calibrationd", "selfdrive.locationd.calibrationd"), NativeProcess("loggerd", "system/loggerd", ["./loggerd"], logging),
PythonProcess("torqued", "selfdrive.locationd.torqued"), NativeProcess("modeld", "selfdrive/modeld", ["./modeld"], only_onroad),
PythonProcess("controlsd", "selfdrive.controls.controlsd"), NativeProcess("mapsd", "selfdrive/navd", ["./mapsd"], only_onroad),
PythonProcess("deleter", "system.loggerd.deleter", offroad=True), NativeProcess("navmodeld", "selfdrive/modeld", ["./navmodeld"], only_onroad),
PythonProcess("dmonitoringd", "selfdrive.monitoring.dmonitoringd", enabled=(not PC or WEBCAM), callback=driverview), NativeProcess("sensord", "system/sensord", ["./sensord"], only_onroad, enabled=not PC),
PythonProcess("laikad", "selfdrive.locationd.laikad"), NativeProcess("ui", "selfdrive/ui", ["./ui"], always_run, watchdog_max_dt=(5 if not PC else None)),
PythonProcess("rawgpsd", "system.sensord.rawgps.rawgpsd", enabled=TICI, onroad=False, callback=qcomgps), NativeProcess("soundd", "selfdrive/ui/soundd", ["./soundd"], only_onroad),
PythonProcess("navd", "selfdrive.navd.navd"), NativeProcess("locationd", "selfdrive/locationd", ["./locationd"], only_onroad),
PythonProcess("pandad", "selfdrive.boardd.pandad", offroad=True), NativeProcess("boardd", "selfdrive/boardd", ["./boardd"], always_run, enabled=False),
PythonProcess("paramsd", "selfdrive.locationd.paramsd"), PythonProcess("calibrationd", "selfdrive.locationd.calibrationd", only_onroad),
NativeProcess("ubloxd", "system/ubloxd", ["./ubloxd"], enabled=TICI, onroad=False, callback=ublox), PythonProcess("torqued", "selfdrive.locationd.torqued", only_onroad),
PythonProcess("pigeond", "system.sensord.pigeond", enabled=TICI, onroad=False, callback=ublox), PythonProcess("controlsd", "selfdrive.controls.controlsd", only_onroad),
PythonProcess("plannerd", "selfdrive.controls.plannerd"), PythonProcess("deleter", "system.loggerd.deleter", always_run),
PythonProcess("radard", "selfdrive.controls.radard"), PythonProcess("dmonitoringd", "selfdrive.monitoring.dmonitoringd", driverview, enabled=(not PC or WEBCAM)),
PythonProcess("thermald", "selfdrive.thermald.thermald", offroad=True), PythonProcess("laikad", "selfdrive.locationd.laikad", only_onroad),
PythonProcess("tombstoned", "selfdrive.tombstoned", enabled=not PC, offroad=True), PythonProcess("rawgpsd", "system.sensord.rawgps.rawgpsd", qcomgps, enabled=TICI),
PythonProcess("updated", "selfdrive.updated", enabled=not PC, onroad=False, offroad=True), PythonProcess("navd", "selfdrive.navd.navd", only_onroad),
PythonProcess("uploader", "system.loggerd.uploader", offroad=True), PythonProcess("pandad", "selfdrive.boardd.pandad", always_run),
PythonProcess("statsd", "selfdrive.statsd", offroad=True), PythonProcess("paramsd", "selfdrive.locationd.paramsd", only_onroad),
NativeProcess("ubloxd", "system/ubloxd", ["./ubloxd"], ublox, enabled=TICI),
PythonProcess("pigeond", "system.sensord.pigeond", ublox, enabled=TICI),
PythonProcess("plannerd", "selfdrive.controls.plannerd", only_onroad),
PythonProcess("radard", "selfdrive.controls.radard", only_onroad),
PythonProcess("thermald", "selfdrive.thermald.thermald", always_run),
PythonProcess("tombstoned", "selfdrive.tombstoned", always_run, enabled=not PC),
PythonProcess("updated", "selfdrive.updated", only_offroad, enabled=not PC),
PythonProcess("uploader", "system.loggerd.uploader", always_run),
PythonProcess("statsd", "selfdrive.statsd", always_run),
# debug procs # debug procs
NativeProcess("bridge", "cereal/messaging", ["./bridge"], onroad=False, callback=notcar), NativeProcess("bridge", "cereal/messaging", ["./bridge"], notcar),
PythonProcess("webjoystick", "tools.bodyteleop.web", onroad=False, callback=notcar), PythonProcess("webjoystick", "tools.bodyteleop.web", notcar),
] ]
managed_processes = {p.name: p for p in procs} managed_processes = {p.name: p for p in procs}

Loading…
Cancel
Save