@ -11,8 +11,8 @@ import cereal.messaging as messaging 
			
		
	
		
			
				
					from  cereal . services  import  service_list  
			
		
	
		
			
				
					from  cereal . visionipc . visionipc_pyx  import  VisionIpcServer ,  VisionStreamType   # pylint: disable=no-name-in-module, import-error  
			
		
	
		
			
				
					from  common . params  import  Params  
			
		
	
		
			
				
					from  common . realtime  import  Ratekeeper ,  DT_MDL ,  DT_DMON  
			
		
	
		
			
				
					from  common . transformations . camera  import  eon_f_frame_size ,  eon_d_frame_size  
			
		
	
		
			
				
					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  selfdrive . car . fingerprints  import  FW_VERSIONS  
			
		
	
		
			
				
					from  selfdrive . manager . process  import  ensure_running  
			
		
	
		
			
				
					from  selfdrive . manager . process_config  import  managed_processes  
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -26,32 +26,107 @@ process_replay_dir = os.path.dirname(os.path.abspath(__file__)) 
			
		
	
		
			
				
					FAKEDATA  =  os . path . join ( process_replay_dir ,  " fakedata/ " )  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					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 ' ] ]   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  # Migrate safety param base on carState   
			
		
	
		
			
				
					  cp  =  [ m  for  m  in  msgs  if  m . which ( )  ==  ' carParams ' ] [ 0 ] . carParams   
			
		
	
		
			
				
					  if  len ( cp . safetyConfigs ) :   
			
		
	
		
			
				
					    safety_param  =  cp . safetyConfigs [ 0 ] . safetyParam   
			
		
	
		
			
				
					  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 . 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_events ( 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 )   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					      for  evt  in  new_m . sensorEvents :   
			
		
	
		
			
				
					        evt . timestamp  =  new_m . logMonoTime   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					      pm . send ( s ,  new_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 :   
			
		
	
		
			
				
					      # TODO: use logMonoTime   
			
		
	
		
			
				
					      pm . send ( s ,  m . as_builder ( ) )   
			
		
	
		
			
				
					      new_m  =  m . as_builder ( )   
			
		
	
		
			
				
					      new_m . logMonoTime  =  int ( sec_since_boot ( )  *  1e9 )   
			
		
	
		
			
				
					      pm . send ( s ,  new_m )   
			
		
	
		
			
				
					      rk . keep_time ( )   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					vs  =  None  
			
		
	
		
			
				
					
  
			
		
	
		
			
				
					def  replay_cameras ( lr ,  frs ) :  
			
		
	
		
			
				
					  cameras  =  [   
			
		
	
		
			
				
					  eon_ cameras=  [   
			
		
	
		
			
				
					    ( " roadCameraState " ,  DT_MDL ,  eon_f_frame_size ,  VisionStreamType . VISION_STREAM_ROAD ) ,   
			
		
	
		
			
				
					    ( " driverCameraState " ,  DT_DMON ,  eon_d_frame_size ,  VisionStreamType . VISION_STREAM_DRIVER ) ,   
			
		
	
		
			
				
					  ]   
			
		
	
		
			
				
					  tici_cameras  =  [   
			
		
	
		
			
				
					    ( " roadCameraState " ,  DT_MDL ,  tici_f_frame_size ,  VisionStreamType . VISION_STREAM_ROAD ) ,   
			
		
	
		
			
				
					    ( " driverCameraState " ,  DT_MDL ,  tici_d_frame_size ,  VisionStreamType . VISION_STREAM_DRIVER ) ,   
			
		
	
		
			
				
					  ]   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  def  replay_camera ( s ,  stream ,  dt ,  vipc_server ,  fr ,  size ) :   
			
		
	
		
			
				
					  def  replay_camera ( s ,  stream ,  dt ,  vipc_server ,  frames  ,  size ) :   
			
		
	
		
			
				
					    pm  =  messaging . PubMaster ( [ s ,  ] )   
			
		
	
		
			
				
					    rk  =  Ratekeeper ( 1  /  dt ,  print_delay_threshold = None )   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    img  =  b " \x00 "  *  int ( size [ 0 ] * size [ 1 ] * 3 / 2 )   
			
		
	
		
			
				
					    while  True :   
			
		
	
		
			
				
					      if  fr  is  not  None :   
			
		
	
		
			
				
					        img  =  fr . get ( rk . frame  %  fr . frame_count ,  pix_fmt = ' yuv420p ' ) [ 0 ]   
			
		
	
		
			
				
					        img  =  img . flatten ( ) . tobytes ( )   
			
		
	
		
			
				
					      if  frames  is  not  None :   
			
		
	
		
			
				
					        img  =  frames [ rk . frame  %  len ( frames ) ]   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					      rk . keep_time ( )   
			
		
	
		
			
				
					
 
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -62,24 +137,34 @@ def replay_cameras(lr, frs): 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					      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  =  [ ]   
			
		
	
		
			
				
					  global  vs   
			
		
	
		
			
				
					  vs  =  VisionIpcServer ( " camerad " )   
			
		
	
		
			
				
					  for  ( s ,  dt ,  size ,  stream )  in  cameras :   
			
		
	
		
			
				
					    fr  =  frs . get ( s ,  None )   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    frames  =  None   
			
		
	
		
			
				
					    if  fr  is  not  None :   
			
		
	
		
			
				
					      print ( f " Decomressing frames  { s } " )   
			
		
	
		
			
				
					      frames  =  [ ]   
			
		
	
		
			
				
					      for  i  in  tqdm ( range ( fr . frame_count ) ) :   
			
		
	
		
			
				
					        img  =  fr . get ( i ,  pix_fmt = ' yuv420p ' ) [ 0 ]   
			
		
	
		
			
				
					        frames . append ( img . flatten ( ) . tobytes ( ) )   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    vs . create_buffers ( stream ,  40 ,  False ,  size [ 0 ] ,  size [ 1 ] )   
			
		
	
		
			
				
					    p . append ( multiprocessing . Process ( target = replay_camera ,   
			
		
	
		
			
				
					                                     args = ( s ,  stream ,  dt ,  vs ,  fr ,  size ) ) )   
			
		
	
		
			
				
					                                     args = ( s ,  stream ,  dt ,  vs ,  frames  ,  size ) ) )   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  # hack to make UI work   
			
		
	
		
			
				
					  vs . create_buffers ( VisionStreamType . VISION_STREAM_RGB_BACK ,  4 ,  True ,  eon_f_frame_size [ 0 ] ,  eon_f_frame_size [ 1 ] )   
			
		
	
		
			
				
					  vs . start_listener ( )   
			
		
	
		
			
				
					  return  p   
			
		
	
		
			
				
					  return  vs ,  p   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					def  regen_segment ( lr ,  frs = None ,  outdir = FAKEDATA ) :  
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  lr  =  list ( lr )   
			
		
	
		
			
				
					  if  frs  is  None :   
			
		
	
		
			
				
					    frs  =  dict ( )   
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -91,51 +176,48 @@ def regen_segment(lr, frs=None, outdir=FAKEDATA): 
			
		
	
		
			
				
					  params . put_bool ( " OpenpilotEnabledToggle " ,  True )   
			
		
	
		
			
				
					  params . put_bool ( " CommunityFeaturesToggle " ,  True )   
			
		
	
		
			
				
					  params . put_bool ( " CommunityFeaturesToggle " ,  True )   
			
		
	
		
			
				
					  cal  =  messaging . new_message ( ' liveCalibration ' )   
			
		
	
		
			
				
					  cal . liveCalibration . validBlocks  =  20   
			
		
	
		
			
				
					  cal . liveCalibration . rpyCalib  =  [ 0.0 ,  0.0 ,  0.0 ]   
			
		
	
		
			
				
					  params . put ( " CalibrationParams " ,  cal . to_bytes ( ) )   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  os . environ [ " LOG_ROOT " ]  =  outdir   
			
		
	
		
			
				
					  os . environ [ " SIMULATION " ]  =  " 1 "   
			
		
	
		
			
				
					  os . environ [ " REPLAY " ]  =  " 1 "   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  os . environ [ ' SKIP_FW_QUERY ' ]  =  " "   
			
		
	
		
			
				
					  os . environ [ ' FINGERPRINT ' ]  =  " "   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  # TODO: remove after getting new route for mazda   
			
		
	
		
			
				
					  migration  =  {   
			
		
	
		
			
				
					    " Mazda CX-9 2021 " :  " MAZDA CX-9 2021 " ,   
			
		
	
		
			
				
					  }   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  for  msg  in  lr :   
			
		
	
		
			
				
					    if  msg . which ( )  ==  ' carParams ' :   
			
		
	
		
			
				
					      car_fingerprint  =  msg . carParams . carFingerprint   
			
		
	
		
			
				
					      car_fingerprint  =  migration . get ( m sg . carParams . carFingerprint ,  msg . carParams . carFingerprint )   
			
		
	
		
			
				
					      if  len ( msg . carParams . carFw )  and  ( car_fingerprint  in  FW_VERSIONS ) :   
			
		
	
		
			
				
					        params . put ( " CarParamsCache " ,  msg . carParams . as_builder ( ) . to_bytes ( ) )   
			
		
	
		
			
				
					      else :   
			
		
	
		
			
				
					        os . environ [ ' SKIP_FW_QUERY ' ]  =  " 1 "   
			
		
	
		
			
				
					        os . environ [ ' FINGERPRINT ' ]  =  car_fingerprint   
			
		
	
		
			
				
					    elif  msg . which ( )  ==  ' liveCalibration ' :   
			
		
	
		
			
				
					      params . put ( " CalibrationParams " ,  msg . as_builder ( ) . to_bytes ( ) )   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  #TODO: init car, make sure starts engaged when segment is engaged   
			
		
	
		
			
				
					  vs ,  cam_procs  =  replay_cameras ( lr ,  frs )   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  fake_daemons  =  {   
			
		
	
		
			
				
					    ' sensord ' :  [   
			
		
	
		
			
				
					      multiprocessing . Process ( target = replay_servic e ,  args = ( ' sensorEvents ' ,  lr ) ) ,   
			
		
	
		
			
				
					      multiprocessing . Process ( target = replay_senso r_e vents  ,  args = ( ' sensorEvents ' ,  lr ) ) ,   
			
		
	
		
			
				
					    ] ,   
			
		
	
		
			
				
					    ' pandad ' :  [   
			
		
	
		
			
				
					      multiprocessing . Process ( target = replay_service ,  args = ( ' can ' ,  lr ) ) ,   
			
		
	
		
			
				
					      multiprocessing . Process ( target = replay_service ,  args = ( ' pandaStates ' ,  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 ) ) ,   
			
		
	
		
			
				
					    ] ,   
			
		
	
		
			
				
					    #'managerState': [   
			
		
	
		
			
				
					    #  multiprocessing.Process(target=replay_service, args=('managerState', lr)),   
			
		
	
		
			
				
					    #],   
			
		
	
		
			
				
					    ' thermald ' :  [   
			
		
	
		
			
				
					      multiprocessing . Process ( target = replay_servic e ,  args = ( ' deviceState ' ,  lr ) ) ,   
			
		
	
		
			
				
					      multiprocessing . Process ( target = replay_device_state ,  args = ( ' deviceState ' ,  lr ) ) ,   
			
		
	
		
			
				
					    ] ,   
			
		
	
		
			
				
					    ' camerad ' :  [   
			
		
	
		
			
				
					      * replay_cameras ( lr ,  frs ) ,   
			
		
	
		
			
				
					    ] ,   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					    # TODO: fix these and run them   
			
		
	
		
			
				
					    ' paramsd ' :  [   
			
		
	
		
			
				
					      multiprocessing . Process ( target = replay_service ,  args = ( ' liveParameters ' ,  lr ) ) ,   
			
		
	
		
			
				
					    ] ,   
			
		
	
		
			
				
					    ' locationd ' :  [   
			
		
	
		
			
				
					      multiprocessing . Process ( target = replay_service ,  args = ( ' liveLocationKalman ' ,  lr ) ) ,   
			
		
	
		
			
				
					      * cam_procs ,   
			
		
	
		
			
				
					    ] ,   
			
		
	
		
			
				
					  }   
			
		
	
		
			
				
					
 
			
		
	
	
		
			
				
					
						
							
								 
						
						
							
								 
						
						
					 
				
				@ -162,11 +244,13 @@ def regen_segment(lr, frs=None, outdir=FAKEDATA): 
			
		
	
		
			
				
					      for  p  in  procs :   
			
		
	
		
			
				
					        p . terminate ( )   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  del  vs   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  r  =  params . get ( " CurrentRoute " ,  encoding = ' utf-8 ' )   
			
		
	
		
			
				
					  return  os . path . join ( outdir ,  r  +  " --0 " )   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					def  regen_and_save ( route ,  sidx ,  upload = False ,  use_route_meta = Tru e) :  
			
		
	
		
			
				
					def  regen_and_save ( route ,  sidx ,  upload = False ,  use_route_meta = Fals e) :  
			
		
	
		
			
				
					  if  use_route_meta :   
			
		
	
		
			
				
					    r  =  Route ( args . route )   
			
		
	
		
			
				
					    lr  =  LogReader ( r . log_paths ( ) [ args . seg ] )   
			
		
	
	
		
			
				
					
						
						
						
							
								 
						
					 
				
				@ -175,6 +259,11 @@ def regen_and_save(route, sidx, upload=False, use_route_meta=True): 
			
		
	
		
			
				
					    lr  =  LogReader ( f " cd:/ { route . replace ( ' | ' ,  ' / ' ) } / { sidx } /rlog.bz2 " )   
			
		
	
		
			
				
					    fr  =  FrameReader ( f " cd:/ { route . replace ( ' | ' ,  ' / ' ) } / { sidx } /fcamera.hevc " )   
			
		
	
		
			
				
					  rpath  =  regen_segment ( lr ,  { ' roadCameraState ' :  fr } )   
			
		
	
		
			
				
					
 
			
		
	
		
			
				
					  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 " )