210 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			210 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| #!/usr/bin/env python3
 | |
| 
 | |
| import visa
 | |
| import time
 | |
| import sys
 | |
| 
 | |
| 
 | |
| def test_idn():
 | |
| 	idn = inst.query("*idn?");
 | |
| 	assert (idn == "TinyUSB,ModelNumber,SerialNumber,FirmwareVer123456\r\n")
 | |
| 	assert (inst.is_4882_compliant)
 | |
| 
 | |
| def test_echo(m,n):
 | |
| 	longstr = "0123456789abcdefghijklmnopqrstuvwxyz" * 50
 | |
| 	t0 = time.monotonic()
 | |
| 
 | |
| 	#Next try echo from 1 to 175 characters (200 is max buffer size on DUT)
 | |
| 	for i in range(m,n):
 | |
| 		#print(i)
 | |
| 		x = longstr[0:i]
 | |
| 		xt = x + inst.write_termination
 | |
| 		y = inst.query(x)
 | |
| 		#print(x)
 | |
| 		#print (":".join("{:02x}".format(ord(c)) for c in xt))
 | |
| 		#print (":".join("{:02x}".format(ord(c)) for c in y))
 | |
| 		assert(xt == y), f"failed i={i}"
 | |
| 		#inst.read_stb();# Just to make USB logging easier by sending a control query (bad thing is that this made things slow)
 | |
| 	t = time.monotonic() - t0
 | |
| 	print(f"  elapsed: {t:0.3} sec")
 | |
| 
 | |
| def test_trig():
 | |
| 	# clear SRQ
 | |
| 	inst.read_stb()
 | |
| 	assert (inst.read_stb() == 0)
 | |
| 	inst.assert_trigger()
 | |
| 	time.sleep(0.3) # SRQ may have some delay
 | |
| 	assert (inst.read_stb() & 0x40), "SRQ not set after 0.3 seconds"
 | |
| 	assert (inst.read_stb() == 0)
 | |
| 	
 | |
| 	
 | |
| def test_mav():
 | |
| 	inst.write("delay 50")
 | |
| 	inst.read_stb() # clear STB
 | |
| 	assert (inst.read_stb() == 0)
 | |
| 	inst.write("123")
 | |
| 	time.sleep(0.3)
 | |
| 	assert (inst.read_stb() & 0x10), "MAV not set after 0.5 seconds"
 | |
| 	
 | |
| 	rsp = inst.read()
 | |
| 	assert(rsp == "123\r\n")
 | |
| 	
 | |
| 	
 | |
| def test_srq():
 | |
| 	assert (inst.read_stb() == 0)
 | |
| 	inst.write("123")
 | |
| 	
 | |
| 	#inst.enable_event(visa.constants.VI_EVENT_SERVICE_REQ, visa.constants.VI_QUEUE)
 | |
| 	#waitrsp = inst.wait_on_event(visa.constants.VI_EVENT_SERVICE_REQ, 5000)
 | |
| 	#inst.discard_events(visa.constants.VI_EVENT_SERVICE_REQ, visa.constants.VI_QUEUE)
 | |
| 	#inst.wait_for_srq()
 | |
| 	time.sleep(0.3)
 | |
| 	stb = inst.read_stb()
 | |
| 	msg =  "SRQ not set after 0.5 seconds, was {:02x}".format(stb)
 | |
| 	assert (stb == 0x50),msg
 | |
| 
 | |
| 	assert (inst.read_stb() == 0x10), "SRQ set at second read!"
 | |
| 	
 | |
| 	rsp = inst.read()
 | |
| 	assert(rsp == "123\r\n")
 | |
| 
 | |
| def test_read_timeout():
 | |
| 	inst.timeout = 500
 | |
| 	# First read with no MAV
 | |
| 	inst.read_stb()
 | |
| 	assert (inst.read_stb() == 0)
 | |
| 	inst.write("delay 500")
 | |
| 	t0 = time.monotonic()
 | |
| 	try:
 | |
| 		rsp = inst.read()
 | |
| 		assert(false), "Read should have resulted in timeout"
 | |
| 	except visa.VisaIOError:
 | |
| 		print("  Got expected exception")
 | |
| 	t = time.monotonic() - t0
 | |
| 	assert ((t*1000.0) > (inst.timeout - 300))
 | |
| 	assert ((t*1000.0) < (inst.timeout + 300))
 | |
| 	print(f"Delay was {t:0.3}")
 | |
| 	# Response is still in queue, so send a clear (to be more helpful to the next test)
 | |
| 	inst.clear()
 | |
| 	time.sleep(0.3)
 | |
| 	assert(0 ==  (inst.read_stb() & 0x10)), "MAV not reset after clear"
 | |
| 
 | |
| def test_abort_in():
 | |
| 	inst.timeout = 200
 | |
| 	# First read with no MAV
 | |
| 	inst.read_stb()
 | |
| 	assert (inst.read_stb() == 0)
 | |
| 	inst.write("delay 500")
 | |
| 	inst.write("xxx")
 | |
| 	t0 = time.monotonic()
 | |
| 	try:
 | |
| 		rsp = inst.read()
 | |
| 		assert(false), "Read should have resulted in timeout"
 | |
| 	except visa.VisaIOError:
 | |
| 		print("  Got expected exception")
 | |
| 	t = time.monotonic() - t0
 | |
| 	assert ((t*1000.0) > (inst.timeout - 300))
 | |
| 	assert ((t*1000.0) < (inst.timeout + 300))
 | |
| 	print(f"  Delay was {t:0.3}")
 | |
| 	# Response is still in queue, so send a clear (to be more helpful to the next test)
 | |
| 	inst.timeout = 800
 | |
| 	y = inst.read()
 | |
| 	assert(y == "xxx\r\n")
 | |
| 	
 | |
| def test_indicate():
 | |
| 	# perform indicator pulse
 | |
| 	usb_iface = inst.get_visa_attribute(visa.constants.VI_ATTR_USB_INTFC_NUM)
 | |
| 	retv = inst.control_in(request_type_bitmap_field=0xA1, request_id=64, request_value=0x0000, index=usb_iface, length=0x0001)
 | |
| 	assert((retv[1] == visa.constants.StatusCode(0)) and (retv[0] == b'\x01')), f"indicator pulse failed: retv={retv}"
 | |
| 	
 | |
| 	
 | |
| def test_multi_read():
 | |
| 	old_chunk_size = inst.chunk_size
 | |
| 	longstr = "0123456789abcdefghijklmnopqrstuvwxyz" * 10
 | |
| 	timeout = 10
 | |
| 	x = longstr[0:174]
 | |
| 	inst.chunk_size = 50 # Seems chunk size only applies to read but not write
 | |
| 	inst.write(x)
 | |
| 	# I'm not sure how to request just the remaining bit using a max count... so just read it all.
 | |
| 	y = inst.read()
 | |
| 	assert (x + "\r\n" == y)
 | |
| 	#inst.chunk_size = old_chunk_size
 | |
| 	
 | |
| def test_stall_ep0():
 | |
| 	usb_iface = inst.get_visa_attribute(visa.constants.VI_ATTR_USB_INTFC_NUM)
 | |
| 	inst.read_stb()
 | |
| 	# This is an invalid request, should create stall.
 | |
| 	try:
 | |
| 		retv = inst.control_in(request_type_bitmap_field=0xA1, request_id=60, request_value=0x0000, index=usb_iface, length=0x0001)
 | |
| 		assert false
 | |
| 	except visa.VisaIOError:
 | |
| 		pass
 | |
| 	
 | |
| 	assert (inst.read_stb() == 0)
 | |
| 
 | |
| 
 | |
| rm = visa.ResourceManager()
 | |
| reslist = rm.list_resources("USB?::?*::INSTR")
 | |
| print(reslist)
 | |
| 
 | |
| if (len(reslist) == 0):
 | |
|     sys.exit()
 | |
| 	
 | |
| inst = rm.open_resource(reslist[0]);
 | |
| inst.timeout = 3000
 | |
| 
 | |
| inst.clear()
 | |
| 
 | |
| print("+ IDN")
 | |
| test_idn()
 | |
| 
 | |
| print("+test abort in")
 | |
| test_abort_in()
 | |
| 
 | |
| 
 | |
| inst.timeout = 2000
 | |
| 
 | |
| print("+ multi read")
 | |
| test_multi_read()
 | |
| 
 | |
| 
 | |
| print("+ echo delay=0")
 | |
| inst.write("delay 0")
 | |
| test_echo(1,175)
 | |
| 
 | |
| print("+ echo delay=2")
 | |
| inst.write("delay 2")
 | |
| test_echo(1,175)
 | |
| 
 | |
| print("+ echo delay=150")
 | |
| inst.write("delay 150")
 | |
| test_echo(53,76)
 | |
| test_echo(165,170)
 | |
| 
 | |
| print("+ Read timeout (no MAV)")
 | |
| test_read_timeout()
 | |
| 
 | |
| print("+ Test EP0 stall recovery")
 | |
| test_stall_ep0()
 | |
| 
 | |
| print("+ MAV")
 | |
| test_mav()
 | |
| 
 | |
| print("+ SRQ")
 | |
| test_srq()
 | |
| 
 | |
| print("+ indicate")
 | |
| test_indicate()
 | |
| 
 | |
| print("+ TRIG")
 | |
| test_trig()
 | |
| 
 | |
| # Untested:
 | |
| #  abort bulk out
 | |
| #  LLO, GTL, etc
 | |
| #  Throughput rate?
 | |
| #  Transmitting a message using multiple transfers
 | |
| 
 | |
| inst.close()
 | |
| print("Test complete")
 | 
