You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					74 lines
				
				2.1 KiB
			
		
		
			
		
	
	
					74 lines
				
				2.1 KiB
			| 
								 
											6 years ago
										 
									 | 
							
								#!/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()
							 |