You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					50 lines
				
				1.3 KiB
			
		
		
			
		
	
	
					50 lines
				
				1.3 KiB
			| 
								 
											6 years ago
										 
									 | 
							
								#!/usr/bin/env python3
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import os
							 | 
						||
| 
								 | 
							
								import sys
							 | 
						||
| 
								 | 
							
								import bz2
							 | 
						||
| 
								 | 
							
								import struct
							 | 
						||
| 
								 | 
							
								from panda import Panda
							 | 
						||
| 
								 | 
							
								from panda.tests.safety_replay.replay_drive import replay_drive
							 | 
						||
| 
								 | 
							
								from tools.lib.logreader import LogReader
							 | 
						||
| 
								 | 
							
								from xx.chffr.lib.route import Route
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								# get a complete canlog (sendcan and can) for a drive
							 | 
						||
| 
								 | 
							
								def get_canlog(route):
							 | 
						||
| 
								 | 
							
								  if os.path.isfile(route + ".bz2"):
							 | 
						||
| 
								 | 
							
								    return
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  r = Route(route)
							 | 
						||
| 
								 | 
							
								  log_msgs = []
							 | 
						||
| 
								 | 
							
								  for i, segment in enumerate(r.log_paths()):
							 | 
						||
| 
								 | 
							
								    print("downloading segment %d/%d" % (i+1, len(r.log_paths())))
							 | 
						||
| 
								 | 
							
								    log = LogReader(segment)
							 | 
						||
| 
								 | 
							
								    log_msgs.extend(filter(lambda msg: msg.which() in ('can', 'sendcan'), log))
							 | 
						||
| 
								 | 
							
								  log_msgs.sort(key=lambda msg: msg.logMonoTime)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  dat = b"".join(m.as_builder().to_bytes() for m in log_msgs)
							 | 
						||
| 
								 | 
							
								  dat = bz2.compress(dat)
							 | 
						||
| 
								 | 
							
								  with open(route + ".bz2", "wb") as f:
							 | 
						||
| 
								 | 
							
								    f.write(dat)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def get_logreader(route):
							 | 
						||
| 
								 | 
							
								  try:
							 | 
						||
| 
								 | 
							
								    lr = LogReader(route + ".bz2")
							 | 
						||
| 
								 | 
							
								  except IOError:
							 | 
						||
| 
								 | 
							
								    print("downloading can log")
							 | 
						||
| 
								 | 
							
								    get_canlog(route)
							 | 
						||
| 
								 | 
							
								    lr = LogReader(route + ".bz2")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return lr
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								if __name__ == "__main__":
							 | 
						||
| 
								 | 
							
								  route = sys.argv[1]
							 | 
						||
| 
								 | 
							
								  mode = int(sys.argv[2])
							 | 
						||
| 
								 | 
							
								  param = 0 if len(sys.argv) < 4 else int(sys.argv[3])
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  lr = get_logreader(route)
							 | 
						||
| 
								 | 
							
								  print("replaying drive %s with safety model %d and param %d" % (route, mode, param))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  replay_drive(lr, mode, param)
							 |