|  |  |  | #!/usr/bin/env python3
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import sys
 | 
					
						
							|  |  |  | from openpilot.tools.lib.route import Route
 | 
					
						
							|  |  |  | from openpilot.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 and c.address not in (0x7df, 0x7e0, 0x7e8):
 | 
					
						
							|  |  |  |           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: ./fingerprint_from_route.py <route>")
 | 
					
						
							|  |  |  |     sys.exit(1)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   route = Route(sys.argv[1])
 | 
					
						
							|  |  |  |   lr = MultiLogIterator(route.log_paths()[:5])
 | 
					
						
							|  |  |  |   get_fingerprint(lr)
 |