#!/usr/bin/env python 
 
						 
					
						
							
								
							 
							
								
									
										 
								
							 
							
								 
							
							
								# type: ignore 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  sys 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  matplotlib . pyplot  as  plt 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  numpy  as  np 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  cereal . messaging  as  messaging 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  time 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# tool to plot one or more signals live. Call ex: 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								#./rqplot.py log.carState.vEgo log.carState.aEgo 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# TODO: can this tool consume 10x less cpu? 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								def  recursive_getattr ( x ,  name ) : 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								   l  =  name . split ( ' . ' ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								   if  len ( l )  ==  1 : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     return  getattr ( x ,  name ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								   else : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     return  recursive_getattr ( getattr ( x ,  l [ 0 ] ) ,  " . " . join ( l [ 1 : ] )  ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								if  __name__  ==  " __main__ " : 
 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  poller  =  messaging . Poller ( ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  services  =  [ ] 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  fields  =  [ ] 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  subs  =  [ ] 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  values  =  [ ] 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  plt . ion ( ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  fig ,  ax  =  plt . subplots ( ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  #fig = plt.figure(figsize=(10, 15)) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  #ax = fig.add_subplot(111) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  ax . grid ( True ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  fig . canvas . draw ( ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  subs_name  =  sys . argv [ 1 : ] 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  lines  =  [ ] 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  x ,  y  =  [ ] ,  [ ] 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  LEN  =  500 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  for  i ,  sub  in  enumerate ( subs_name ) : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    sub_split  =  sub . split ( " . " ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    services . append ( sub_split [ 0 ] ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    fields . append ( " . " . join ( sub_split [ 1 : ] ) ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    subs . append ( messaging . sub_sock ( sub_split [ 0 ] ,  poller ) ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    x . append ( np . ones ( LEN ) * np . nan ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    y . append ( np . ones ( LEN ) * np . nan ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    lines . append ( ax . plot ( x [ i ] ,  y [ i ] ) [ 0 ] ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  for  l  in  lines : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    l . set_marker ( " * " ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  cur_t  =  0. 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  ax . legend ( subs_name ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  ax . set_xlabel ( ' time [s] ' ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  while  1 : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    print ( 1. / ( time . time ( )  -  cur_t ) ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    cur_t  =  time . time ( ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    for  i ,  s  in  enumerate ( subs ) : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      msg  =  messaging . recv_sock ( s ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      #msg = messaging.recv_one_or_none(s) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      if  msg  is  not  None : 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        x [ i ]  =  np . append ( x [ i ] ,  getattr ( msg ,  ' logMonoTime ' )  /  float ( 1e9 ) ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        x [ i ]  =  np . delete ( x [ i ] ,  0 ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        y [ i ]  =  np . append ( y [ i ] ,  recursive_getattr ( msg ,  subs_name [ i ] ) ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        y [ i ]  =  np . delete ( y [ i ] ,  0 ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        lines [ i ] . set_xdata ( x [ i ] ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        lines [ i ] . set_ydata ( y [ i ] ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ax . relim ( ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    ax . autoscale_view ( True ,  scaley = True ,  scalex = True ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    fig . canvas . blit ( ax . bbox ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    fig . canvas . flush_events ( ) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    # just a bit of wait to avoid 100% CPU usage 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    time . sleep ( 0.001 )