#!/usr/bin/env python3 import os import subprocess import multiprocessing import signal import time import cereal.messaging as messaging from common.params import Params from common.basedir import BASEDIR KILL_TIMEOUT = 15 def send_controls_packet(pm): while True: dat = messaging.new_message('controlsState') dat.controlsState = { "rearViewCam": True, } pm.send('controlsState', dat) def send_dmon_packet(pm, d): dat = messaging.new_message('dMonitoringState') dat.dMonitoringState = { "isRHD": d[0], "rhdChecked": d[1], "isPreview": d[2], } pm.send('dMonitoringState', dat) def main(): pm = messaging.PubMaster(['controlsState', 'dMonitoringState']) controls_sender = multiprocessing.Process(target=send_controls_packet, args=[pm]) controls_sender.start() # TODO: refactor with manager start/kill proc_cam = subprocess.Popen(os.path.join(BASEDIR, "selfdrive/camerad/camerad"), cwd=os.path.join(BASEDIR, "selfdrive/camerad")) proc_mon = subprocess.Popen(os.path.join(BASEDIR, "selfdrive/modeld/dmonitoringmodeld"), cwd=os.path.join(BASEDIR, "selfdrive/modeld")) params = Params() is_rhd = False is_rhd_checked = False should_exit = False def terminate(signalNumber, frame): print('got SIGTERM, exiting..') should_exit = True send_dmon_packet(pm, [is_rhd, is_rhd_checked, not should_exit]) proc_cam.send_signal(signal.SIGINT) proc_mon.send_signal(signal.SIGINT) kill_start = time.time() while proc_cam.poll() is None: if time.time() - kill_start > KILL_TIMEOUT: from selfdrive.swaglog import cloudlog cloudlog.critical("FORCE REBOOTING PHONE!") os.system("date >> /sdcard/unkillable_reboot") os.system("reboot") raise RuntimeError continue controls_sender.terminate() exit() signal.signal(signal.SIGTERM, terminate) while True: send_dmon_packet(pm, [is_rhd, is_rhd_checked, not should_exit]) if not is_rhd_checked: is_rhd = params.get("IsRHD") == b"1" is_rhd_checked = True if __name__ == '__main__': main()