| 
						
						
							
								
							
						
						
					 | 
					 | 
					@ -10,6 +10,7 @@ from openpilot.system.hardware import HARDWARE | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					from openpilot.selfdrive.test.helpers import phone_only, with_processes | 
					 | 
					 | 
					 | 
					from openpilot.selfdrive.test.helpers import phone_only, with_processes | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					from openpilot.selfdrive.pandad.tests.test_pandad_loopback import setup_pandad, send_random_can_messages | 
					 | 
					 | 
					 | 
					from openpilot.selfdrive.pandad.tests.test_pandad_loopback import setup_pandad, send_random_can_messages | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					JUNGLE_SPAM = "JUNGLE_SPAM" in os.environ | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					@pytest.mark.tici | 
					 | 
					 | 
					 | 
					@pytest.mark.tici | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					class TestBoarddSpi: | 
					 | 
					 | 
					 | 
					class TestBoarddSpi: | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -18,9 +19,9 @@ class TestBoarddSpi: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    if HARDWARE.get_device_type() == 'tici': | 
					 | 
					 | 
					 | 
					    if HARDWARE.get_device_type() == 'tici': | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      pytest.skip("only for spi pandas") | 
					 | 
					 | 
					 | 
					      pytest.skip("only for spi pandas") | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    os.environ['STARTED'] = '1' | 
					 | 
					 | 
					 | 
					    os.environ['STARTED'] = '1' | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    os.environ['BOARDD_LOOPBACK'] = '1' | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    #os.environ['SPI_ERR_PROB'] = '-1' | 
					 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    os.environ['SPI_ERR_PROB'] = '0.001' | 
					 | 
					 | 
					 | 
					    os.environ['SPI_ERR_PROB'] = '0.001' | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					    if not JUNGLE_SPAM: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      os.environ['BOARDD_LOOPBACK'] = '1' | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  @phone_only | 
					 | 
					 | 
					 | 
					  @phone_only | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					  @with_processes(['pandad']) | 
					 | 
					 | 
					 | 
					  @with_processes(['pandad']) | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -39,8 +40,9 @@ class TestBoarddSpi: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    st = time.monotonic() | 
					 | 
					 | 
					 | 
					    st = time.monotonic() | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    ts = {s: list() for s in socks.keys()} | 
					 | 
					 | 
					 | 
					    ts = {s: list() for s in socks.keys()} | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    for _ in range(20): | 
					 | 
					 | 
					 | 
					    for _ in range(int(os.getenv("TEST_TIME", "20"))): | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      # send some CAN messages | 
					 | 
					 | 
					 | 
					      # send some CAN messages | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					      if not JUNGLE_SPAM: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        sent = send_random_can_messages(sendcan, random.randrange(2, 20)) | 
					 | 
					 | 
					 | 
					        sent = send_random_can_messages(sendcan, random.randrange(2, 20)) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        for k, v in sent.items(): | 
					 | 
					 | 
					 | 
					        for k, v in sent.items(): | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					          sent_msgs[k].extend(list(v)) | 
					 | 
					 | 
					 | 
					          sent_msgs[k].extend(list(v)) | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
							
								
							
						
					 | 
					 | 
					@ -54,6 +56,15 @@ class TestBoarddSpi: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					          assert m.valid or (service == "can") | 
					 | 
					 | 
					 | 
					          assert m.valid or (service == "can") | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					          if service == "can": | 
					 | 
					 | 
					 | 
					          if service == "can": | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					            for msg in m.can: | 
					 | 
					 | 
					 | 
					            for msg in m.can: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					              if JUNGLE_SPAM: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					                # PandaJungle.set_generated_can(True) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					                i = msg.address - 0x200 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					                assert msg.address >= 0x200 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					                assert msg.src == (i%3) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					                assert msg.dat == b"\xff"*(i%8) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					                total_recv_count += 1 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					                continue | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					              if msg.src > 4: | 
					 | 
					 | 
					 | 
					              if msg.src > 4: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					                continue | 
					 | 
					 | 
					 | 
					                continue | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					              key = (msg.address, msg.dat) | 
					 | 
					 | 
					 | 
					              key = (msg.address, msg.dat) | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					 | 
					@ -91,5 +102,5 @@ class TestBoarddSpi: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					        assert len(dts) >= ((et-0.5)*SERVICE_LIST[service].frequency*0.8) | 
					 | 
					 | 
					 | 
					        assert len(dts) >= ((et-0.5)*SERVICE_LIST[service].frequency*0.8) | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					    with subtests.test(msg="CAN traffic"): | 
					 | 
					 | 
					 | 
					    with subtests.test(msg="CAN traffic"): | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      print(f"Sent {total_sent_count} CAN messages, got {total_recv_count} back. {total_recv_count/total_sent_count:.2%} received") | 
					 | 
					 | 
					 | 
					      print(f"Sent {total_sent_count} CAN messages, got {total_recv_count} back. {total_recv_count/(total_sent_count+1e-4):.2%} received") | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 | 
					 | 
					 | 
					      assert total_recv_count > 20 | 
					 | 
					 | 
					 | 
					      assert total_recv_count > 20 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
						
						
					 | 
					 | 
					
  |