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.
		
		
		
		
			
				
					114 lines
				
				2.1 KiB
			
		
		
			
		
	
	
					114 lines
				
				2.1 KiB
			| 
								 
											6 years ago
										 
									 | 
							
								#!/usr/bin/env python3
							 | 
						||
| 
								 | 
							
								import os
							 | 
						||
| 
								 | 
							
								import zmq
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import cereal.messaging as messaging
							 | 
						||
| 
								 | 
							
								from cereal.services import service_list
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								from panda.lib.panda import Panda
							 | 
						||
| 
								 | 
							
								from hexdump import hexdump
							 | 
						||
| 
								 | 
							
								import time
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								def raw_panda():
							 | 
						||
| 
								 | 
							
								  p = Panda()
							 | 
						||
| 
								 | 
							
								  print(p)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  p.set_uart_baud(2, 9600)
							 | 
						||
| 
								 | 
							
								  p.set_uart_baud(3, 9600)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  p.set_uart_parity(2, 1)
							 | 
						||
| 
								 | 
							
								  p.set_uart_parity(3, 1)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  p.set_uart_callback(2, 1)
							 | 
						||
| 
								 | 
							
								  p.set_uart_callback(3, 1)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  idx = 0
							 | 
						||
| 
								 | 
							
								  while 1:
							 | 
						||
| 
								 | 
							
								    """
							 | 
						||
| 
								 | 
							
								    dat = p.serial_read(2)
							 | 
						||
| 
								 | 
							
								    if len(dat) > 0:
							 | 
						||
| 
								 | 
							
								      print "2:",
							 | 
						||
| 
								 | 
							
								      hexdump(dat)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    dat = p.serial_read(3)
							 | 
						||
| 
								 | 
							
								    if len(dat) > 0:
							 | 
						||
| 
								 | 
							
								      print "3:",
							 | 
						||
| 
								 | 
							
								      hexdump(dat)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    print "read done, waiting"
							 | 
						||
| 
								 | 
							
								    time.sleep(0.01)
							 | 
						||
| 
								 | 
							
								    """
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if idx%2 == 1:
							 | 
						||
| 
								 | 
							
								      dat = "\x20\x80\xc0\xa0"
							 | 
						||
| 
								 | 
							
								    else:
							 | 
						||
| 
								 | 
							
								      dat = "\x00\x80\xc0\xc0"
							 | 
						||
| 
								 | 
							
								    p.can_send(0, dat, 8)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    for r in p.can_recv():
							 | 
						||
| 
								 | 
							
								      if r[-1] in [8, 9]:
							 | 
						||
| 
								 | 
							
								        print(r[-1], r[2].encode("hex"))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    time.sleep(0.01)
							 | 
						||
| 
								 | 
							
								    idx += 1
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								if __name__ == "__main__":
							 | 
						||
| 
								 | 
							
								  #raw_panda()
							 | 
						||
| 
								 | 
							
								  #exit(0)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  logcan = messaging.sub_sock('can')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  t1 = []
							 | 
						||
| 
								 | 
							
								  t2 = []
							 | 
						||
| 
								 | 
							
								  t3 = []
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  while len(t1) < 1000 or os.uname()[-1] == "aarch64":
							 | 
						||
| 
								 | 
							
								    rr = messaging.recv_sock(logcan, wait=True)
							 | 
						||
| 
								 | 
							
								    for c in rr.can:
							 | 
						||
| 
								 | 
							
								      if c.src in [9] and len(c.dat) == 5:
							 | 
						||
| 
								 | 
							
								        aa = map(lambda x: ord(x)&0x7f, c.dat)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        # checksum
							 | 
						||
| 
								 | 
							
								        assert (-(aa[0]+aa[1]+aa[2]+aa[3]))&0x7f == aa[4]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        #print map(bin, aa[0:4])
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        aa[0] &= ~0x20
							 | 
						||
| 
								 | 
							
								        aa[1] &= ~0x20
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        st = (aa[0] << 5) + aa[1]
							 | 
						||
| 
								 | 
							
								        if st >= 256:
							 | 
						||
| 
								 | 
							
								          st = -(512-st)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        mt = ((aa[2] >> 3) << 7) + aa[3]
							 | 
						||
| 
								 | 
							
								        if mt >= 512:
							 | 
						||
| 
								 | 
							
								          mt = -(1024-mt)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        print(st, mt)
							 | 
						||
| 
								 | 
							
								        t1.append(st)
							 | 
						||
| 
								 | 
							
								        t2.append(mt)
							 | 
						||
| 
								 | 
							
								        #print map(bin, aa), "apply", st
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      if c.src in [8] and len(c.dat) == 4:
							 | 
						||
| 
								 | 
							
								        aa = map(lambda x: ord(x)&0x7f, c.dat)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        # checksum
							 | 
						||
| 
								 | 
							
								        assert (-(aa[0]+aa[1]+aa[2]))&0x7f == aa[3]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        aa[0] &= ~0x20
							 | 
						||
| 
								 | 
							
								        aa[1] &= ~0x20
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        st = (aa[0] << 5) + aa[1]
							 | 
						||
| 
								 | 
							
								        if st >= 256:
							 | 
						||
| 
								 | 
							
								          st = -(512-st)
							 | 
						||
| 
								 | 
							
								        print(aa, "apply", st)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        t3.append(st)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  import matplotlib.pyplot as plt
							 | 
						||
| 
								 | 
							
								  plt.plot(t1)
							 | 
						||
| 
								 | 
							
								  plt.plot(t2)
							 | 
						||
| 
								 | 
							
								  plt.plot(t3)
							 | 
						||
| 
								 | 
							
								  plt.show()
							 | 
						||
| 
								 | 
							
								
							 |