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