#!/usr/bin/env python3 
 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								import  bz2 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  os 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  time 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  multiprocessing 
 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								import  argparse 
 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								from  tqdm  import  tqdm 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# run DM procs 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								os . environ [ " USE_WEBCAM " ]  =  " 1 " 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  cereal . messaging  as  messaging 
 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								from  cereal  import  car 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  cereal . services  import  service_list 
 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								from  cereal . visionipc  import  VisionIpcServer ,  VisionStreamType 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  common . params  import  Params 
 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								from  common . realtime  import  Ratekeeper ,  DT_MDL ,  DT_DMON ,  sec_since_boot 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  common . transformations . camera  import  eon_f_frame_size ,  eon_d_frame_size ,  tici_f_frame_size ,  tici_d_frame_size 
 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								from  panda . python  import  Panda 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  selfdrive . car . toyota . values  import  EPS_SCALE 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  selfdrive . manager . process  import  ensure_running 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  selfdrive . manager . process_config  import  managed_processes 
 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								from  selfdrive . test . process_replay . process_replay  import  FAKEDATA ,  setup_env ,  check_enabled 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  selfdrive . test . update_ci_routes  import  upload_route 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  tools . lib . route  import  Route 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  tools . lib . framereader  import  FrameReader 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								from  tools . lib . logreader  import  LogReader 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								def  replay_panda_states ( s ,  msgs ) : 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  pm  =  messaging . PubMaster ( [ s ,  ' peripheralState ' ] ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  rk  =  Ratekeeper ( service_list [ s ] . frequency ,  print_delay_threshold = None ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  smsgs  =  [ m  for  m  in  msgs  if  m . which ( )  in  [ ' pandaStates ' ,  ' pandaStateDEPRECATED ' ] ] 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  # TODO: safety param migration should be handled automatically 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  safety_param_migration  =  { 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    " TOYOTA PRIUS 2017 " :  EPS_SCALE [ " TOYOTA PRIUS 2017 " ]  |  Panda . FLAG_TOYOTA_STOCK_LONGITUDINAL , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    " TOYOTA RAV4 2017 " :  EPS_SCALE [ " TOYOTA RAV4 2017 " ]  |  Panda . FLAG_TOYOTA_ALT_BRAKE , 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    " KIA EV6 2022 " :  Panda . FLAG_HYUNDAI_EV_GAS  |  Panda . FLAG_HYUNDAI_CANFD_HDA2 , 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  } 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  # Migrate safety param base on carState 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  cp  =  [ m  for  m  in  msgs  if  m . which ( )  ==  ' carParams ' ] [ 0 ] . carParams 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  if  cp . carFingerprint  in  safety_param_migration : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    safety_param  =  safety_param_migration [ cp . carFingerprint ] 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  elif  len ( cp . safetyConfigs ) : 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    safety_param  =  cp . safetyConfigs [ 0 ] . safetyParam 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  cp . safetyConfigs [ 0 ] . safetyParamDEPRECATED  !=  0 : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      safety_param  =  cp . safetyConfigs [ 0 ] . safetyParamDEPRECATED 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  else : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    safety_param  =  cp . safetyParamDEPRECATED 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  while  True : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for  m  in  smsgs : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      if  m . which ( )  ==  ' pandaStateDEPRECATED ' : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        new_m  =  messaging . new_message ( ' pandaStates ' ,  1 ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        new_m . pandaStates [ 0 ]  =  m . pandaStateDEPRECATED 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        new_m . pandaStates [ 0 ] . safetyParam  =  safety_param 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        pm . send ( s ,  new_m ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      else : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        new_m  =  m . as_builder ( ) 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								        new_m . pandaStates [ - 1 ] . safetyParam  =  safety_param 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								        new_m . logMonoTime  =  int ( sec_since_boot ( )  *  1e9 ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      pm . send ( s ,  new_m ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      new_m  =  messaging . new_message ( ' peripheralState ' ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      pm . send ( ' peripheralState ' ,  new_m ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      rk . keep_time ( ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								def  replay_manager_state ( s ,  msgs ) : 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  pm  =  messaging . PubMaster ( [ s ,  ] ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  rk  =  Ratekeeper ( service_list [ s ] . frequency ,  print_delay_threshold = None ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  while  True : 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    new_m  =  messaging . new_message ( ' managerState ' ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    new_m . managerState . processes  =  [ { ' name ' :  name ,  ' running ' :  True }  for  name  in  managed_processes ] 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    pm . send ( s ,  new_m ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    rk . keep_time ( ) 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								def  replay_device_state ( s ,  msgs ) : 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  pm  =  messaging . PubMaster ( [ s ,  ] ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  rk  =  Ratekeeper ( service_list [ s ] . frequency ,  print_delay_threshold = None ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  smsgs  =  [ m  for  m  in  msgs  if  m . which ( )  ==  s ] 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  while  True : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for  m  in  smsgs : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      new_m  =  m . as_builder ( ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      new_m . logMonoTime  =  int ( sec_since_boot ( )  *  1e9 ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      new_m . deviceState . freeSpacePercent  =  50 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      new_m . deviceState . memoryUsagePercent  =  50 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      pm . send ( s ,  new_m ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      rk . keep_time ( ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								def  replay_sensor_event ( s ,  msgs ) : 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  pm  =  messaging . PubMaster ( [ s ,  ] ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  rk  =  Ratekeeper ( service_list [ s ] . frequency ,  print_delay_threshold = None ) 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  smsgs  =  [ m  for  m  in  msgs  if  m . which ( )  ==  s ] 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  while  True : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for  m  in  smsgs : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      m  =  m . as_builder ( ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      m . logMonoTime  =  int ( sec_since_boot ( )  *  1e9 ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      getattr ( m ,  m . which ( ) ) . timestamp  =  m . logMonoTime 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      pm . send ( m . which ( ) ,  m ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      rk . keep_time ( ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								def  replay_service ( s ,  msgs ) : 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  pm  =  messaging . PubMaster ( [ s ,  ] ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  rk  =  Ratekeeper ( service_list [ s ] . frequency ,  print_delay_threshold = None ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  smsgs  =  [ m  for  m  in  msgs  if  m . which ( )  ==  s ] 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  while  True : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for  m  in  smsgs : 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								      new_m  =  m . as_builder ( ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      new_m . logMonoTime  =  int ( sec_since_boot ( )  *  1e9 ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      pm . send ( s ,  new_m ) 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								      rk . keep_time ( ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								def  replay_cameras ( lr ,  frs ,  disable_tqdm = False ) : 
 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  eon_cameras  =  [ 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    ( " roadCameraState " ,  DT_MDL ,  eon_f_frame_size ,  VisionStreamType . VISION_STREAM_ROAD ,  True ) , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ( " driverCameraState " ,  DT_DMON ,  eon_d_frame_size ,  VisionStreamType . VISION_STREAM_DRIVER ,  False ) , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  ] 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  tici_cameras  =  [ 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    ( " roadCameraState " ,  DT_MDL ,  tici_f_frame_size ,  VisionStreamType . VISION_STREAM_ROAD ,  True ) , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ( " driverCameraState " ,  DT_MDL ,  tici_d_frame_size ,  VisionStreamType . VISION_STREAM_DRIVER ,  False ) , 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  ] 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  def  replay_camera ( s ,  stream ,  dt ,  vipc_server ,  frames ,  size ,  use_extra_client ) : 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    services  =  [ ( s ,  stream ) ] 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  use_extra_client : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      services . append ( ( " wideRoadCameraState " ,  VisionStreamType . VISION_STREAM_WIDE_ROAD ) ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    pm  =  messaging . PubMaster ( [ s  for  s ,  _  in  services ] ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    rk  =  Ratekeeper ( 1  /  dt ,  print_delay_threshold = None ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    img  =  b " \x00 "  *  int ( size [ 0 ]  *  size [ 1 ]  *  3  /  2 ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    while  True : 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								      if  frames  is  not  None : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        img  =  frames [ rk . frame  %  len ( frames ) ] 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      rk . keep_time ( ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								      for  s ,  stream  in  services : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        m  =  messaging . new_message ( s ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        msg  =  getattr ( m ,  s ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        msg . frameId  =  rk . frame 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        msg . timestampSof  =  m . logMonoTime 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        msg . timestampEof  =  m . logMonoTime 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        pm . send ( s ,  m ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								        vipc_server . send ( stream ,  img ,  msg . frameId ,  msg . timestampSof ,  msg . timestampEof ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  init_data  =  [ m  for  m  in  lr  if  m . which ( )  ==  ' initData ' ] [ 0 ] 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  cameras  =  tici_cameras  if  ( init_data . initData . deviceType  ==  ' tici ' )  else  eon_cameras 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  # init vipc server and cameras 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  p  =  [ ] 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  vs  =  VisionIpcServer ( " camerad " ) 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  for  ( s ,  dt ,  size ,  stream ,  use_extra_client )  in  cameras : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    fr  =  frs . get ( s ,  None ) 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    frames  =  None 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  fr  is  not  None : 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								      print ( f " Decompressing frames  { s } " ) 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								      frames  =  [ ] 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								      for  i  in  tqdm ( range ( fr . frame_count ) ,  disable = disable_tqdm ) : 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								        img  =  fr . get ( i ,  pix_fmt = ' nv12 ' ) [ 0 ] 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								        frames . append ( img . flatten ( ) . tobytes ( ) ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    vs . create_buffers ( stream ,  40 ,  False ,  size [ 0 ] ,  size [ 1 ] ) 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  use_extra_client : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      vs . create_buffers ( VisionStreamType . VISION_STREAM_WIDE_ROAD ,  40 ,  False ,  size [ 0 ] ,  size [ 1 ] ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    p . append ( multiprocessing . Process ( target = replay_camera , 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								                                     args = ( s ,  stream ,  dt ,  vs ,  frames ,  size ,  use_extra_client ) ) ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  vs . start_listener ( ) 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  return  vs ,  p 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								def  migrate_carparams ( lr ) : 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  all_msgs  =  [ ] 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  for  msg  in  lr : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if  msg . which ( )  ==  ' carParams ' : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      CP  =  messaging . new_message ( ' carParams ' ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      CP . carParams  =  msg . carParams . as_builder ( ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      for  car_fw  in  CP . carParams . carFw : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        car_fw . brand  =  CP . carParams . carName 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      msg  =  CP . as_reader ( ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    all_msgs . append ( msg ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  return  all_msgs 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								def  migrate_sensorEvents ( lr ,  old_logtime = False ) : 
 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  all_msgs  =  [ ] 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  for  msg  in  lr : 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if  msg . which ( )  !=  ' sensorEventsDEPRECATED ' : 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								      all_msgs . append ( msg ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      continue 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    # migrate to split sensor events 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    for  evt  in  msg . sensorEventsDEPRECATED : 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								      # build new message for each sensor type 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      sensor_service  =  ' ' 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      if  evt . which ( )  ==  ' acceleration ' : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        sensor_service  =  ' accelerometer ' 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      elif  evt . which ( )  ==  ' gyro '  or  evt . which ( )  ==  ' gyroUncalibrated ' : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        sensor_service  =  ' gyroscope ' 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      elif  evt . which ( )  ==  ' light '  or  evt . which ( )  ==  ' proximity ' : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        sensor_service  =  ' lightSensor ' 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      elif  evt . which ( )  ==  ' magnetic '  or  evt . which ( )  ==  ' magneticUncalibrated ' : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        sensor_service  =  ' magnetometer ' 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      elif  evt . which ( )  ==  ' temperature ' : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        sensor_service  =  ' temperatureSensor ' 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      m  =  messaging . new_message ( sensor_service ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      m . valid  =  True 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								      if  old_logtime : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        m . logMonoTime  =  msg . logMonoTime 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      m_dat  =  getattr ( m ,  sensor_service ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      m_dat . version  =  evt . version 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      m_dat . sensor  =  evt . sensor 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      m_dat . type  =  evt . type 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      m_dat . source  =  evt . source 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								      if  old_logtime : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        m_dat . timestamp  =  evt . timestamp 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								      setattr ( m_dat ,  evt . which ( ) ,  getattr ( evt ,  evt . which ( ) ) ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      all_msgs . append ( m . as_reader ( ) ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  return  all_msgs 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								def  regen_segment ( lr ,  frs = None ,  outdir = FAKEDATA ,  disable_tqdm = False ) : 
 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  lr  =  migrate_carparams ( list ( lr ) ) 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  lr  =  migrate_sensorEvents ( list ( lr ) ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  if  frs  is  None : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    frs  =  dict ( ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  params  =  Params ( ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  os . environ [ " LOG_ROOT " ]  =  outdir 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  # Get and setup initial state 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  CP  =  [ m  for  m  in  lr  if  m . which ( )  ==  ' carParams ' ] [ 0 ] . carParams 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  controlsState  =  [ m  for  m  in  lr  if  m . which ( )  ==  ' controlsState ' ] [ 0 ] . controlsState 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  liveCalibration  =  [ m  for  m  in  lr  if  m . which ( )  ==  ' liveCalibration ' ] [ 0 ] 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  setup_env ( CP = CP ,  controlsState = controlsState ) 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  params . put ( " CalibrationParams " ,  liveCalibration . as_builder ( ) . to_bytes ( ) ) 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  vs ,  cam_procs  =  replay_cameras ( lr ,  frs ,  disable_tqdm = disable_tqdm ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  fake_daemons  =  { 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ' sensord ' :  [ 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								      multiprocessing . Process ( target = replay_sensor_event ,  args = ( ' accelerometer ' ,  lr ) ) , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      multiprocessing . Process ( target = replay_sensor_event ,  args = ( ' gyroscope ' ,  lr ) ) , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      multiprocessing . Process ( target = replay_sensor_event ,  args = ( ' magnetometer ' ,  lr ) ) , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ] , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ' pandad ' :  [ 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      multiprocessing . Process ( target = replay_service ,  args = ( ' can ' ,  lr ) ) , 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								      multiprocessing . Process ( target = replay_service ,  args = ( ' ubloxRaw ' ,  lr ) ) , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      multiprocessing . Process ( target = replay_panda_states ,  args = ( ' pandaStates ' ,  lr ) ) , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ] , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ' managerState ' :  [ 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								      multiprocessing . Process ( target = replay_manager_state ,  args = ( ' managerState ' ,  lr ) ) , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ] , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ' thermald ' :  [ 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								      multiprocessing . Process ( target = replay_device_state ,  args = ( ' deviceState ' ,  lr ) ) , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ] , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ' camerad ' :  [ 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								      * cam_procs , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ] , 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  } 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  try : 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    # TODO: make first run of onnxruntime CUDA provider fast 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    managed_processes [ " modeld " ] . start ( ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    managed_processes [ " dmonitoringmodeld " ] . start ( ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    time . sleep ( 5 ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    # start procs up 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    ignore  =  list ( fake_daemons . keys ( ) )  +  [ ' ui ' ,  ' manage_athenad ' ,  ' uploader ' ,  ' soundd ' ] 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    ensure_running ( managed_processes . values ( ) ,  started = True ,  params = Params ( ) ,  CP = car . CarParams ( ) ,  not_run = ignore ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for  procs  in  fake_daemons . values ( ) : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      for  p  in  procs : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        p . start ( ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    for  _  in  tqdm ( range ( 60 ) ,  disable = disable_tqdm ) : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      # ensure all procs are running 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      for  d ,  procs  in  fake_daemons . items ( ) : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        for  p  in  procs : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          if  not  p . is_alive ( ) : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            raise  Exception ( f " { d } ' s  { p . name }  died " ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      time . sleep ( 1 ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  finally : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    # kill everything 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for  p  in  managed_processes . values ( ) : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      p . stop ( ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for  procs  in  fake_daemons . values ( ) : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      for  p  in  procs : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        p . terminate ( ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  del  vs 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  segment  =  params . get ( " CurrentRoute " ,  encoding = ' utf-8 ' )  +  " --0 " 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  seg_path  =  os . path . join ( outdir ,  segment ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  # check to make sure openpilot is engaged in the route 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  if  not  check_enabled ( LogReader ( os . path . join ( seg_path ,  " rlog " ) ) ) : 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    raise  Exception ( f " Route did not engage for long enough:  { segment } " ) 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  return  seg_path 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
											 
										
											
												Live torque (#25456)
* wip torqued
* add basic logic
* setup in manager
* check sanity and publish msg
* add first order filter to outputs
* wire up controlsd, and update gains
* rename intercept to offset
* add cloudlog, live values are not updated
* fix bugs, do not reset points for now
* fix crashes
* rename to main
* fix bugs, works offline
* fix float in cereal bug
* add latacc filter
* randomly choose points, approx for iid
* add variable decay
* local param to capnp instead of dict
* verify works in replay
* use torqued output in controlsd
* use in controlsd; use points from past routes
* controlsd bugfix
* filter before updating gains, needs to be replaced
* save all points to ensure smooth transition across routes, revert friction factor to 1.5
* add filters to prevent noisy low-speed data points; improve fit sanity
* add engaged buffer
* revert lat_acc thresh
* use paramsd realtime process config
* make latacc-to-torque generic, and overrideable
* move freq to 4Hz, avoid storing in np.array, don't publish points in the message
* float instead of np
* remove constant while storing pts
* rename slope, offset to lat_accet_factor, offset
* resolve issues
* use camelcase in all capnp params
* use camelcase everywhere
* reduce latacc threshold or sanity, add car_sane todo, save points properly
* add and check tag
* write param to disk at end of route
* remove args
* rebase op, cereal
* save on exit
* restore default handler
* cpu usage check
* add to process replay
* handle reset better, reduce unnecessary computation
* always publish raw values - useful for debug
* regen routes
* update refs
* checks on cache restore
* check tuning vals too
* clean that up
* reduce cpu usage
* reduce cpu usage by 75%
* cleanup
* optimize further
* handle reset condition better, don't put points in init, use only in corolla
* bump cereal after rebasing
* update refs
* Update common/params.cc
Co-authored-by: Adeeb Shihadeh <adeebshihadeh@gmail.com>
* remove unnecessary checks
* Update RELEASES.md
Co-authored-by: Adeeb Shihadeh <adeebshihadeh@gmail.com>
											 
										 
										
											3 years ago 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								def  regen_and_save ( route ,  sidx ,  upload = False ,  use_route_meta = True ,  outdir = FAKEDATA ,  disable_tqdm = False ) : 
 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  if  use_route_meta : 
  
						 
					
						
							
								
									
										
											 
										
											
												Live torque (#25456)
* wip torqued
* add basic logic
* setup in manager
* check sanity and publish msg
* add first order filter to outputs
* wire up controlsd, and update gains
* rename intercept to offset
* add cloudlog, live values are not updated
* fix bugs, do not reset points for now
* fix crashes
* rename to main
* fix bugs, works offline
* fix float in cereal bug
* add latacc filter
* randomly choose points, approx for iid
* add variable decay
* local param to capnp instead of dict
* verify works in replay
* use torqued output in controlsd
* use in controlsd; use points from past routes
* controlsd bugfix
* filter before updating gains, needs to be replaced
* save all points to ensure smooth transition across routes, revert friction factor to 1.5
* add filters to prevent noisy low-speed data points; improve fit sanity
* add engaged buffer
* revert lat_acc thresh
* use paramsd realtime process config
* make latacc-to-torque generic, and overrideable
* move freq to 4Hz, avoid storing in np.array, don't publish points in the message
* float instead of np
* remove constant while storing pts
* rename slope, offset to lat_accet_factor, offset
* resolve issues
* use camelcase in all capnp params
* use camelcase everywhere
* reduce latacc threshold or sanity, add car_sane todo, save points properly
* add and check tag
* write param to disk at end of route
* remove args
* rebase op, cereal
* save on exit
* restore default handler
* cpu usage check
* add to process replay
* handle reset better, reduce unnecessary computation
* always publish raw values - useful for debug
* regen routes
* update refs
* checks on cache restore
* check tuning vals too
* clean that up
* reduce cpu usage
* reduce cpu usage by 75%
* cleanup
* optimize further
* handle reset condition better, don't put points in init, use only in corolla
* bump cereal after rebasing
* update refs
* Update common/params.cc
Co-authored-by: Adeeb Shihadeh <adeebshihadeh@gmail.com>
* remove unnecessary checks
* Update RELEASES.md
Co-authored-by: Adeeb Shihadeh <adeebshihadeh@gmail.com>
											 
										 
										
											3 years ago 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    r  =  Route ( route ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    lr  =  LogReader ( r . log_paths ( ) [ sidx ] ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    fr  =  FrameReader ( r . camera_paths ( ) [ sidx ] ) 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  else : 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    lr  =  LogReader ( f " cd:/ { route . replace ( ' | ' ,  ' / ' ) } / { sidx } /rlog.bz2 " ) 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    fr  =  FrameReader ( f " cd:/ { route . replace ( ' | ' ,  ' / ' ) } / { sidx } /fcamera.hevc " ) 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  rpath  =  regen_segment ( lr ,  { ' roadCameraState ' :  fr } ,  outdir = outdir ,  disable_tqdm = disable_tqdm ) 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  # compress raw rlog before uploading 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  with  open ( os . path . join ( rpath ,  " rlog " ) ,  " rb " )  as  f : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    data  =  bz2 . compress ( f . read ( ) ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  with  open ( os . path . join ( rpath ,  " rlog.bz2 " ) ,  " wb " )  as  f : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    f . write ( data ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  os . remove ( os . path . join ( rpath ,  " rlog " ) ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  lr  =  LogReader ( os . path . join ( rpath ,  ' rlog.bz2 ' ) ) 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  controls_state_active  =  [ m . controlsState . active  for  m  in  lr  if  m . which ( )  ==  ' controlsState ' ] 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  assert  any ( controls_state_active ) ,  " Segment did not engage " 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  relr  =  os . path . relpath ( rpath ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  print ( " \n \n " ,  " * " * 30 ,  " \n \n " ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  print ( " New route: " ,  relr ,  " \n " ) 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  if  upload : 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								    upload_route ( relr ,  exclude_patterns = [ ' *.hevc ' ,  ] ) 
  
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								  return  relr 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								if  __name__  ==  " __main__ " : 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  parser  =  argparse . ArgumentParser ( description = " Generate new segments from old ones " ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  parser . add_argument ( " --upload " ,  action = " store_true " ,  help = " Upload the new segment to the CI bucket " ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  parser . add_argument ( " route " ,  type = str ,  help = " The source route " ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  parser . add_argument ( " seg " ,  type = int ,  help = " Segment in source route " ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  args  =  parser . parse_args ( ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  regen_and_save ( args . route ,  args . seg ,  args . upload )