#!/usr/bin/env python3
import os
import sys
import time
from typing import Any
from tqdm import tqdm
from common . hardware import ANDROID
os . environ [ ' CI ' ] = " 1 "
if ANDROID :
os . environ [ ' QCOM_REPLAY ' ] = " 1 "
import selfdrive . manager as manager
from common . spinner import Spinner
import cereal . messaging as messaging
from tools . lib . framereader import FrameReader
from tools . lib . logreader import LogReader
from selfdrive . test . openpilotci import BASE_URL , get_url
from selfdrive . test . process_replay . compare_logs import compare_logs , save_log
from selfdrive . test . process_replay . test_processes import format_diff
from selfdrive . version import get_git_commit
TEST_ROUTE = " 99c94dc769b5d96e|2019-08-03--14-19-59 "
def camera_replay ( lr , fr ) :
spinner = Spinner ( )
pm = messaging . PubMaster ( [ ' frame ' , ' liveCalibration ' ] )
sm = messaging . SubMaster ( [ ' model ' ] )
# TODO: add dmonitoringmodeld
print ( " preparing procs " )
manager . prepare_managed_process ( " camerad " )
manager . prepare_managed_process ( " modeld " )
try :
print ( " starting procs " )
manager . start_managed_process ( " camerad " )
manager . start_managed_process ( " modeld " )
time . sleep ( 5 )
print ( " procs started " )
cal = [ msg for msg in lr if msg . which ( ) == " liveCalibration " ]
for msg in cal [ : 5 ] :
pm . send ( msg . which ( ) , msg . as_builder ( ) )
log_msgs = [ ]
frame_idx = 0
for msg in tqdm ( lr ) :
if msg . which ( ) == " liveCalibrationd " :
pm . send ( msg . which ( ) , msg . as_builder ( ) )
elif msg . which ( ) == " frame " :
f = msg . as_builder ( )
img = fr . get ( frame_idx , pix_fmt = " rgb24 " ) [ 0 ] [ : , : : , - 1 ]
f . frame . image = img . flatten ( ) . tobytes ( )
frame_idx + = 1
pm . send ( msg . which ( ) , f )
log_msgs . append ( messaging . recv_one ( sm . sock [ ' model ' ] ) )
spinner . update ( " modeld replay %d / %d " % ( frame_idx , fr . frame_count ) )
if frame_idx > = fr . frame_count :
break
except KeyboardInterrupt :
pass
print ( " replay done " )
spinner . close ( )
manager . kill_managed_process ( ' modeld ' )
time . sleep ( 2 )
manager . kill_managed_process ( ' camerad ' )
return log_msgs
if __name__ == " __main__ " :
update = " --update " in sys . argv
lr = LogReader ( get_url ( TEST_ROUTE , 0 ) )
fr = FrameReader ( get_url ( TEST_ROUTE , 0 , log_type = " fcamera " ) )
log_msgs = camera_replay ( list ( lr ) , fr )
if update :
ref_commit = get_git_commit ( )
log_fn = " %s _ %s _ %s .bz2 " % ( TEST_ROUTE , " model " , ref_commit )
save_log ( log_fn , log_msgs )
with open ( " model_replay_ref_commit " , " w " ) as f :
f . write ( ref_commit )
else :
ref_commit = open ( " model_replay_ref_commit " ) . read ( ) . strip ( )
log_fn = " %s _ %s _ %s .bz2 " % ( TEST_ROUTE , " model " , ref_commit )
cmp_log = LogReader ( BASE_URL + log_fn )
results : Any = { TEST_ROUTE : { } }
results [ TEST_ROUTE ] [ " modeld " ] = compare_logs ( cmp_log , log_msgs , ignore_fields = [ ' logMonoTime ' , ' valid ' , ' model.frameDropPerc ' ] )
diff1 , diff2 , failed = format_diff ( results , ref_commit )
print ( diff1 )
with open ( " model_diff.txt " , " w " ) as f :
f . write ( diff2 )
sys . exit ( int ( failed ) )