summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathan Conrad <[email protected]>2019-09-19 18:58:15 -0400
committerNathan Conrad <[email protected]>2019-09-19 19:01:08 -0400
commit346443118fa9f22611ca1382ff999e43b6a40b43 (patch)
treefe95c8d4b720d4a895e90a13b577a24b93349d35
parent0f1435177b15b739188d08d08563e02e1bf2edde (diff)
Add testcase for aborting bulk in with no data queued (and fix aborting bulk in)
-rw-r--r--examples/device/usbtmc/src/usbtmc_app.c2
-rw-r--r--examples/device/usbtmc/visaQuery.py29
-rw-r--r--src/class/usbtmc/usbtmc_device.c14
3 files changed, 39 insertions, 6 deletions
diff --git a/examples/device/usbtmc/src/usbtmc_app.c b/examples/device/usbtmc/src/usbtmc_app.c
index ea6e6aa6f..0d03a5ef1 100644
--- a/examples/device/usbtmc/src/usbtmc_app.c
+++ b/examples/device/usbtmc/src/usbtmc_app.c
@@ -203,7 +203,7 @@ void usbtmc_app_task_iter(void) {
if(idnQuery)
{
- usbtmcd_transmit_dev_msg_data(rhport, idn, tu_min32(sizeof(idn)-1,msgReqLen),false);
+ usbtmcd_transmit_dev_msg_data(rhport, idn, tu_min32(sizeof(idn)-1,msgReqLen),false);
}
else
{
diff --git a/examples/device/usbtmc/visaQuery.py b/examples/device/usbtmc/visaQuery.py
index 9610cbc8f..368b66053 100644
--- a/examples/device/usbtmc/visaQuery.py
+++ b/examples/device/usbtmc/visaQuery.py
@@ -3,6 +3,7 @@ import time
import sys
+
def test_idn():
idn = inst.query("*idn?");
assert idn == "TinyUSB,ModelNumber,SerialNumber,FirmwareVer123456\r\n"
@@ -60,6 +61,24 @@ def test_srq():
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.time()
+ try:
+ rsp = inst.read()
+ assert(false), "Read should have resulted in timeout"
+ except visa.VisaIOError:
+ print("Got expected exception")
+ t = time.time() - t0
+ assert ((t*1000.0) > (inst.timeout - 300))
+ assert ((t*1000.0) < (inst.timeout + 300))
+ print(f"Delay was {t}")
rm = visa.ResourceManager("/c/Windows/system32/visa64.dll")
reslist = rm.list_resources("USB?::?*::INSTR")
@@ -72,8 +91,11 @@ inst = rm.open_resource(reslist[0]);
inst.timeout = 3000
inst.clear()
-#print("+ IDN")
-#test_idn()
+print("+ IDN")
+test_idn()
+
+inst.timeout = 3000
+
print("+ echo delay=0")
inst.write("delay 0")
@@ -88,6 +110,9 @@ inst.write("delay 150")
test_echo(53,76)
test_echo(165,170)
+print("+ Read timeout (no MAV")
+test_read_timeout()
+
print("+ MAV")
test_mav()
diff --git a/src/class/usbtmc/usbtmc_device.c b/src/class/usbtmc/usbtmc_device.c
index 3a4e9e3e0..db00b841f 100644
--- a/src/class/usbtmc/usbtmc_device.c
+++ b/src/class/usbtmc/usbtmc_device.c
@@ -102,7 +102,7 @@ typedef enum
STATE_CLEARING,
STATE_ABORTING_BULK_IN,
STATE_ABORTING_BULK_IN_SHORTED, // aborting, and short packet has been queued for transmission
- STATE_ABORTING_BULK_IN_ABORTED, // aborting, and short packet has been queued for transmission
+ STATE_ABORTING_BULK_IN_ABORTED, // aborting, and short packet has been transmitted
STATE_ABORTING_BULK_OUT,
STATE_NUM_STATES
} usbtmcd_state_enum;
@@ -384,6 +384,7 @@ static bool handle_devMsgIn(uint8_t rhport, void *data, size_t len)
usbtmc_state.state = STATE_TX_REQUESTED;
usbtmc_state.lastBulkInTag = msg->header.bTag;
usbtmc_state.transfer_size_remaining = msg->TransferSize;
+ usbtmc_state.transfer_size_sent = 0u;
}
criticalLeave();
@@ -612,8 +613,14 @@ bool usbtmcd_control_request(uint8_t rhport, tusb_control_request_t const * requ
rsp.USBTMC_status = USBTMC_STATUS_SUCCESS;
usbtmc_state.transfer_size_remaining = 0;
// Check if we've queued a short packet
- usbtmc_state.state = ((usbtmc_state.transfer_size_sent % USBTMCD_MAX_PACKET_SIZE) != 0) ?
+ usbtmc_state.state = ((usbtmc_state.transfer_size_sent % USBTMCD_MAX_PACKET_SIZE) == 0) ?
STATE_ABORTING_BULK_IN : STATE_ABORTING_BULK_IN_SHORTED;
+ if(usbtmc_state.transfer_size_sent == 0)
+ {
+ // Send short packet, nothing is in the buffer yet
+ TU_VERIFY( usbd_edpt_xfer(rhport, usbtmc_state.ep_bulk_in, usbtmc_state.ep_bulk_in_buf,(uint16_t)0u));
+ usbtmc_state.state = STATE_ABORTING_BULK_IN_SHORTED;
+ }
TU_VERIFY(usbtmcd_app_initiate_abort_bulk_in(rhport, &(rsp.USBTMC_status)));
}
else if((usbtmc_state.state == STATE_TX_REQUESTED || usbtmc_state.state == STATE_TX_INITIATED))
@@ -638,7 +645,7 @@ bool usbtmcd_control_request(uint8_t rhport, tusb_control_request_t const * requ
.USBTMC_status = USBTMC_STATUS_FAILED,
.bmAbortBulkIn =
{
- .BulkInFifoBytes = (usbtmc_state.state == STATE_ABORTING_BULK_IN_ABORTED)
+ .BulkInFifoBytes = (usbtmc_state.state != STATE_ABORTING_BULK_IN_ABORTED)
},
.NBYTES_RXD_TXD = usbtmc_state.transfer_size_sent,
};
@@ -647,6 +654,7 @@ bool usbtmcd_control_request(uint8_t rhport, tusb_control_request_t const * requ
{
case STATE_ABORTING_BULK_IN_ABORTED:
rsp.USBTMC_status = USBTMC_STATUS_SUCCESS;
+ usbtmc_state.state = STATE_IDLE;
break;
case STATE_ABORTING_BULK_IN:
case STATE_ABORTING_BULK_OUT: