summaryrefslogtreecommitdiff
path: root/examples/device
diff options
context:
space:
mode:
authorNathan Conrad <[email protected]>2019-09-18 21:31:38 -0400
committerNathan Conrad <[email protected]>2019-09-18 21:34:26 -0400
commit9a726dc7ed9af8f9b035b18a667105a48d8d6d8a (patch)
tree540f08c113c07f99037275c05be7f45ea7d1ae07 /examples/device
parent99d03fcaee64104df96e332a2347aa7ecc1b6172 (diff)
More fixes, and a bit of SRQ.
Diffstat (limited to 'examples/device')
-rw-r--r--examples/device/usbtmc/src/usbtmc_app.c78
-rw-r--r--examples/device/usbtmc/visaQuery.py69
2 files changed, 127 insertions, 20 deletions
diff --git a/examples/device/usbtmc/src/usbtmc_app.c b/examples/device/usbtmc/src/usbtmc_app.c
index 7132f5143..024f7de10 100644
--- a/examples/device/usbtmc/src/usbtmc_app.c
+++ b/examples/device/usbtmc/src/usbtmc_app.c
@@ -1,7 +1,7 @@
/*
* The MIT License (MIT)
*
- * Copyright (c) 2019 N Conrad
+ * Copyright (c) 2019 Nathan Conrad
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
@@ -73,6 +73,11 @@ static volatile uint8_t status;
static volatile uint16_t queryState = 0;
static volatile uint32_t queryDelayStart;
static volatile uint32_t bulkInStarted;
+static volatile uint32_t idnQuery;
+
+static size_t buffer_len;
+static uint8_t buffer[225]; // A few packets long should be enough.
+
static usbtmc_msg_dev_dep_msg_in_header_t rspMsg = {
.bmTransferAttributes =
@@ -82,16 +87,20 @@ static usbtmc_msg_dev_dep_msg_in_header_t rspMsg = {
}
};
-bool usbtmcd_app_msgBulkOut_start(uint8_t rhport, usbtmc_msg_request_dev_dep_out const * msgHeader)
-{
+bool usbtmcd_app_msg_trigger(uint8_t rhport, usbtmc_msg_generic_t* msg) {
(void)rhport;
- (void)msgHeader;
- //uart_tx_str_sync("MSG_OUT_DATA: start\r\n");
+ (void)msg;
return true;
}
-bool usbtmcd_app_msg_trigger(uint8_t rhport, usbtmc_msg_generic_t* msg) {
+
+bool usbtmcd_app_msgBulkOut_start(uint8_t rhport, usbtmc_msg_request_dev_dep_out const * msgHeader)
+{
(void)rhport;
- (void)msg;
+ (void)msgHeader;
+#ifdef xDEBUG
+ uart_tx_str_sync("MSG_OUT_DATA: start\r\n");
+#endif
+ buffer_len = 0;
return true;
}
@@ -100,14 +109,25 @@ bool usbtmcd_app_msg_data(uint8_t rhport, void *data, size_t len, bool transfer_
(void)rhport;
// If transfer isn't finished, we just ignore it (for now)
- /*uart_tx_str_sync("MSG_OUT_DATA: <<<");
+#ifdef xDEBUG
+ uart_tx_str_sync("MSG_OUT_DATA: <<<");
uart_tx_sync(data,len);
uart_tx_str_sync(">>>\r\n");
if(transfer_complete)
uart_tx_str_sync("MSG_OUT_DATA: Complete\r\n");
-*/
- if(transfer_complete && (len >=4) && !strncasecmp("*idn?",data,4)) {
- queryState = 1;
+#endif
+
+ if(len + buffer_len < sizeof(buffer))
+ {
+ memcpy(&(buffer[buffer_len]), data, len);
+ buffer_len += len;
+ }
+ queryState = transfer_complete;
+ idnQuery = 0;
+
+ if(transfer_complete && (len >=4) && !strncasecmp("*idn?",data,4))
+ {
+ idnQuery = 1;
}
return true;
}
@@ -116,7 +136,7 @@ bool usbtmcd_app_msgBulkIn_complete(uint8_t rhport)
{
(void)rhport;
- status &= (uint8_t)~(0x10u); // clear MAV
+ status &= (uint8_t)~(0x50u); // clear MAV and SRQ
return true;
}
@@ -131,8 +151,9 @@ bool usbtmcd_app_msgBulkIn_request(uint8_t rhport, usbtmc_msg_request_dev_dep_in
rspMsg.header.bTag = request->header.bTag,
rspMsg.header.bTagInverse = request->header.bTagInverse;
msgReqLen = request->TransferSize;
-
- //uart_tx_str_sync("MSG_IN_DATA: Requested!\r\n");
+#ifdef xDEBUG
+ uart_tx_str_sync("MSG_IN_DATA: Requested!\r\n");
+#endif
TU_ASSERT(bulkInStarted == 0);
bulkInStarted = 1;
@@ -145,7 +166,11 @@ bool usbtmcd_app_msgBulkIn_request(uint8_t rhport, usbtmc_msg_request_dev_dep_in
void usbtmc_app_task_iter(void) {
uint8_t const rhport = 0;
-
+ uint32_t board_delay = 5u;
+ if(idnQuery)
+ {
+ board_delay = 350u;
+ }
switch(queryState) {
case 0:
break;
@@ -154,14 +179,15 @@ void usbtmc_app_task_iter(void) {
queryState = 2;
break;
case 2:
- if( (board_millis() - queryDelayStart) > 200u) {
+ if( (board_millis() - queryDelayStart) > board_delay) {
queryDelayStart = board_millis();
queryState=3;
status |= 0x10u; // MAV
+ status |= 0x40u; // SRQ
}
break;
case 3:
- if( (board_millis() - queryDelayStart) > 400u) {
+ if( (board_millis() - queryDelayStart) > board_delay) {
queryState = 4;
}
break;
@@ -169,8 +195,17 @@ void usbtmc_app_task_iter(void) {
if(bulkInStarted) {
queryState = 0;
bulkInStarted = 0;
- //uart_tx_str_sync("usbtmc_app_task_iter: sending rsp!\r\n");
- usbtmcd_transmit_dev_msg_data(rhport, idn, tu_min32(sizeof(idn)-1,msgReqLen),false);
+#ifdef xDEBUG
+ uart_tx_str_sync("usbtmc_app_task_iter: sending rsp!\r\n");
+#endif
+ if(idnQuery)
+ {
+ usbtmcd_transmit_dev_msg_data(rhport, idn, tu_min32(sizeof(idn)-1,msgReqLen),false);
+ }
+ else
+ {
+ usbtmcd_transmit_dev_msg_data(rhport, buffer, tu_min32(buffer_len,msgReqLen),false);
+ }
// MAV is cleared in the transfer complete callback.
}
break;
@@ -235,10 +270,13 @@ void usmtmcd_app_bulkOut_clearFeature(uint8_t rhport)
uint8_t usbtmcd_app_get_stb(uint8_t rhport, uint8_t *tmcResult)
{
(void)rhport;
+ uint8_t old_status = status;
+ status = status & ~(0x40); // clear SRQ
+
*tmcResult = USBTMC_STATUS_SUCCESS;
// Increment status so that we see different results on each read...
- return status;
+ return old_status;
}
bool usbtmcd_app_indicator_pluse(uint8_t rhport, tusb_control_request_t const * msg, uint8_t *tmcResult)
diff --git a/examples/device/usbtmc/visaQuery.py b/examples/device/usbtmc/visaQuery.py
new file mode 100644
index 000000000..fa3d7f5e8
--- /dev/null
+++ b/examples/device/usbtmc/visaQuery.py
@@ -0,0 +1,69 @@
+import visa
+import time
+import sys
+
+
+def test_idn():
+ idn = inst.query("*idn?");
+ assert idn == "TinyUSB,ModelNumber,SerialNumber,FirmwareVer123456\r\n"
+
+def test_echo():
+ longstr = "0123456789abcdef" * 50
+
+ #Next try echo from 1 to 175 characters (200 is max buffer size on DUT)
+ for i in range(49,175):
+ x = longstr[0:i]
+ xt = x + inst.write_termination
+ y = inst.query(x)
+ assert(xt == y), f"echo {i}"
+
+def test_mav():
+ 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")
+
+
+rm = visa.ResourceManager("/c/Windows/system32/visa64.dll")
+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);
+inst.clear()
+
+test_idn()
+test_echo()
+test_mav()
+test_srq()
+
+inst.close()
+print("Test complete")