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
						
					
					
				| #!/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() |