From 1631da3c0c9b73f291084255ce4a52bb660e01ad Mon Sep 17 00:00:00 2001 From: MDC Service Date: Mon, 19 Dec 2022 17:35:39 +0100 Subject: Add files via upload --- examples/usbtmc/CMakeLists.txt | 29 ++++++ examples/usbtmc/Makefile | 12 +++ examples/usbtmc/skip.txt | 1 + examples/usbtmc/visaQuery.py | 212 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 254 insertions(+) create mode 100644 examples/usbtmc/CMakeLists.txt create mode 100644 examples/usbtmc/Makefile create mode 100644 examples/usbtmc/skip.txt create mode 100644 examples/usbtmc/visaQuery.py (limited to 'examples/usbtmc') diff --git a/examples/usbtmc/CMakeLists.txt b/examples/usbtmc/CMakeLists.txt new file mode 100644 index 0000000..c49603c --- /dev/null +++ b/examples/usbtmc/CMakeLists.txt @@ -0,0 +1,29 @@ +cmake_minimum_required(VERSION 3.5) + +include(${CMAKE_CURRENT_SOURCE_DIR}/../../../hw/bsp/family_support.cmake) + +# gets PROJECT name for the example (e.g. -) +family_get_project_name(PROJECT ${CMAKE_CURRENT_LIST_DIR}) + +project(${PROJECT}) + +# Checks this example is valid for the family and initializes the project +family_initialize_project(${PROJECT} ${CMAKE_CURRENT_LIST_DIR}) + +add_executable(${PROJECT}) + +# Example source +target_sources(${PROJECT} PUBLIC + ${CMAKE_CURRENT_SOURCE_DIR}/src/main.c + ${CMAKE_CURRENT_SOURCE_DIR}/src/usb_descriptors.c + ${CMAKE_CURRENT_SOURCE_DIR}/src/usbtmc_app.c + ) + +# Example include +target_include_directories(${PROJECT} PUBLIC + ${CMAKE_CURRENT_SOURCE_DIR}/src + ) + +# Configure compilation flags and libraries for the example... see the corresponding function +# in hw/bsp/FAMILY/family.cmake for details. +family_configure_device_example(${PROJECT}) \ No newline at end of file diff --git a/examples/usbtmc/Makefile b/examples/usbtmc/Makefile new file mode 100644 index 0000000..69b633f --- /dev/null +++ b/examples/usbtmc/Makefile @@ -0,0 +1,12 @@ +include ../../../tools/top.mk +include ../../make.mk + +INC += \ + src \ + $(TOP)/hw \ + +# Example source +EXAMPLE_SOURCE += $(wildcard src/*.c) +SRC_C += $(addprefix $(CURRENT_PATH)/, $(EXAMPLE_SOURCE)) + +include ../../rules.mk diff --git a/examples/usbtmc/skip.txt b/examples/usbtmc/skip.txt new file mode 100644 index 0000000..a43106c --- /dev/null +++ b/examples/usbtmc/skip.txt @@ -0,0 +1 @@ +mcu:BCM2835 diff --git a/examples/usbtmc/visaQuery.py b/examples/usbtmc/visaQuery.py new file mode 100644 index 0000000..c4e5ad2 --- /dev/null +++ b/examples/usbtmc/visaQuery.py @@ -0,0 +1,212 @@ +#!/usr/bin/env python3 + +import pyvisa +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(pyvisa.constants.VI_EVENT_SERVICE_REQ, pyvisa.constants.VI_QUEUE) + #waitrsp = inst.wait_on_event(pyvisa.constants.VI_EVENT_SERVICE_REQ, 5000) + #inst.discard_events(pyvisa.constants.VI_EVENT_SERVICE_REQ, pyvisa.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 pyvisa.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 pyvisa.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 read it out (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(pyvisa.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) + # pyvisa used to return (statuscode,bytes), but now only returns bytes, so we need to handle both cases + if(isinstance(retv,bytes)): + assert(retv == b'\x01') + else: + assert((retv[1] == pyvisa.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(pyvisa.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 pyvisa.VisaIOError: + pass + + assert (inst.read_stb() == 0) + + +rm = pyvisa.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") -- cgit v1.2.3