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.
		
		
		
		
			
				
					46 lines
				
				1.3 KiB
			
		
		
			
		
	
	
					46 lines
				
				1.3 KiB
			| 
								 
											5 years ago
										 
									 | 
							
								#!/usr/bin/env python3
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import sys
							 | 
						||
| 
								 | 
							
								from tools.lib.route import Route
							 | 
						||
| 
								 | 
							
								from tools.lib.logreader import MultiLogIterator
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def get_fingerprint(lr):
							 | 
						||
| 
								 | 
							
								  # TODO: make this a nice tool for car ports. should also work with qlogs for FW
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  fw = None
							 | 
						||
| 
								 | 
							
								  msgs = {}
							 | 
						||
| 
								 | 
							
								  for msg in lr:
							 | 
						||
| 
								 | 
							
								    if msg.which() == 'carParams':
							 | 
						||
| 
								 | 
							
								      fw = msg.carParams.carFw
							 | 
						||
| 
								 | 
							
								    elif msg.which() == 'can':
							 | 
						||
| 
								 | 
							
								      for c in msg.can:
							 | 
						||
| 
								 | 
							
								        # read also msgs sent by EON on CAN bus 0x80 and filter out the
							 | 
						||
| 
								 | 
							
								        # addr with more than 11 bits
							 | 
						||
| 
								 | 
							
								        if c.src % 0x80 == 0 and c.address < 0x800:
							 | 
						||
| 
								 | 
							
								          msgs[c.address] = len(c.dat)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  # show CAN fingerprint
							 | 
						||
| 
								 | 
							
								  fingerprint = ', '.join("%d: %d" % v for v in sorted(msgs.items()))
							 | 
						||
| 
								 | 
							
								  print(f"\nfound {len(msgs)} messages. CAN fingerprint:\n")
							 | 
						||
| 
								 | 
							
								  print(fingerprint)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  # TODO: also print the fw fingerprint merged with the existing ones
							 | 
						||
| 
								 | 
							
								  # show FW fingerprint
							 | 
						||
| 
								 | 
							
								  print("\nFW fingerprint:\n")
							 | 
						||
| 
								 | 
							
								  for f in fw:
							 | 
						||
| 
								 | 
							
								    print(f"    (Ecu.{f.ecu}, {hex(f.address)}, {None if f.subAddress == 0 else f.subAddress}): [")
							 | 
						||
| 
								 | 
							
								    print(f"      {f.fwVersion},")
							 | 
						||
| 
								 | 
							
								    print("    ],")
							 | 
						||
| 
								 | 
							
								  print()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								if __name__ == "__main__":
							 | 
						||
| 
								 | 
							
								  if len(sys.argv) < 2:
							 | 
						||
| 
								 | 
							
								    print("Usage: ./get_fingerprint_internal.py <route>")
							 | 
						||
| 
								 | 
							
								    sys.exit(1)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  route = Route(sys.argv[1])
							 | 
						||
| 
								 | 
							
								  lr = MultiLogIterator(route.log_paths()[:5], wraparound=False)
							 | 
						||
| 
								 | 
							
								  get_fingerprint(lr)
							 |