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.
		
		
		
		
			
				
					47 lines
				
				1.3 KiB
			
		
		
			
		
	
	
					47 lines
				
				1.3 KiB
			| 
								 
											4 years ago
										 
									 | 
							
								#!/usr/bin/env python3
							 | 
						||
| 
								 | 
							
								import binascii
							 | 
						||
| 
								 | 
							
								import sys
							 | 
						||
| 
								 | 
							
								from collections import defaultdict
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import cereal.messaging as messaging
							 | 
						||
| 
								 | 
							
								from common.realtime import sec_since_boot
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def can_printer(bus=0):
							 | 
						||
| 
								 | 
							
								  """Collects messages and prints when a new bit transition is observed.
							 | 
						||
| 
								 | 
							
								  This is very useful to find signals based on user triggered actions, such as blinkers and seatbelt.
							 | 
						||
| 
								 | 
							
								  Leave the script running until no new transitions are seen, then perform the action."""
							 | 
						||
| 
								 | 
							
								  logcan = messaging.sub_sock('can')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  low_to_high = defaultdict(int)
							 | 
						||
| 
								 | 
							
								  high_to_low = defaultdict(int)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  while 1:
							 | 
						||
| 
								 | 
							
								    can_recv = messaging.drain_sock(logcan, wait_for_one=True)
							 | 
						||
| 
								 | 
							
								    for x in can_recv:
							 | 
						||
| 
								 | 
							
								      for y in x.can:
							 | 
						||
| 
								 | 
							
								        if y.src == bus:
							 | 
						||
| 
								 | 
							
								          i = int.from_bytes(y.dat, byteorder='big')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								          l_h = low_to_high[y.address]
							 | 
						||
| 
								 | 
							
								          h_l = high_to_low[y.address]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								          change = None
							 | 
						||
| 
								 | 
							
								          if (i | l_h) != l_h:
							 | 
						||
| 
								 | 
							
								            low_to_high[y.address] = i | l_h
							 | 
						||
| 
								 | 
							
								            change = "+"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								          if (~i | h_l) != h_l:
							 | 
						||
| 
								 | 
							
								            high_to_low[y.address] = ~i | h_l
							 | 
						||
| 
								 | 
							
								            change = "-"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								          if change:
							 | 
						||
| 
								 | 
							
								            print(f"{sec_since_boot():.2f}\t{hex(y.address)} ({y.address})\t{change}{binascii.hexlify(y.dat)}")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								if __name__ == "__main__":
							 | 
						||
| 
								 | 
							
								  if len(sys.argv) > 1:
							 | 
						||
| 
								 | 
							
								    can_printer(int(sys.argv[1]))
							 | 
						||
| 
								 | 
							
								  else:
							 | 
						||
| 
								 | 
							
								    can_printer()
							 |