Просмотр исходного кода

Fix more TX bugs... and add variable response delay to the example project.

Nathan Conrad 6 лет назад
Родитель
Сommit
d4b2dff7c4

+ 18 - 9
examples/device/usbtmc/src/usbtmc_app.c

@@ -24,6 +24,7 @@
  */
 
 #include <strings.h>
+#include <stdlib.h>     /* atoi */
 #include "class/usbtmc/usbtmc_device.h"
 #include "bsp/board.h"
 #include "main.h"
@@ -75,6 +76,7 @@ static volatile uint32_t queryDelayStart;
 static volatile uint32_t bulkInStarted;
 static volatile uint32_t idnQuery;
 
+static uint32_t resp_delay = 125u; // Adjustable delay, to allow for better testing
 static size_t buffer_len;
 static uint8_t buffer[225]; // A few packets long should be enough.
 
@@ -115,6 +117,8 @@ bool usbtmcd_app_msg_data(uint8_t rhport, void *data, size_t len, bool transfer_
   uart_tx_str_sync(">>>\r\n");
   if(transfer_complete)
     uart_tx_str_sync("MSG_OUT_DATA: Complete\r\n");
+  sprintf(bigMsg, "len=%u complete=%u\r\n",len,(uint32_t)transfer_complete);
+  uart_tx_str_sync(bigMsg);
 #endif
 
   if(len + buffer_len < sizeof(buffer))
@@ -129,6 +133,13 @@ bool usbtmcd_app_msg_data(uint8_t rhport, void *data, size_t len, bool transfer_
   {
     idnQuery = 1;
   }
+  if(transfer_complete && !strncasecmp("delay ",data,5))
+  {
+    queryState = 0;
+    resp_delay = atoi((char*)data + 5);
+    if(resp_delay > 10000u)
+      resp_delay = 10000u;
+  }
   return true;
 }
 
@@ -166,11 +177,6 @@ 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;
@@ -179,7 +185,7 @@ void usbtmc_app_task_iter(void) {
     queryState = 2;
     break;
   case 2:
-    if( (board_millis() - queryDelayStart) > board_delay) {
+    if( (board_millis() - queryDelayStart) > resp_delay) {
       queryDelayStart = board_millis();
       queryState=3;
       status |= 0x10u; // MAV
@@ -187,7 +193,7 @@ void usbtmc_app_task_iter(void) {
     }
     break;
   case 3:
-    if( (board_millis() - queryDelayStart) > board_delay) {
+    if( (board_millis() - queryDelayStart) > resp_delay) {
       queryState = 4;
     }
     break;
@@ -200,7 +206,7 @@ void usbtmc_app_task_iter(void) {
 #endif
       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
       {
@@ -237,17 +243,20 @@ bool usbtmcd_app_check_clear(uint8_t rhport, usbtmc_get_clear_status_rsp_t *rsp)
 }
 bool usbtmcd_app_initiate_abort_bulk_in(uint8_t rhport, uint8_t *tmcResult)
 {
+  (void)rhport;
   bulkInStarted = 0;
   *tmcResult = USBTMC_STATUS_SUCCESS;
   return true;
 }
 bool usbtmcd_app_check_abort_bulk_in(uint8_t rhport, usbtmc_check_abort_bulk_rsp_t *rsp)
 {
+  (void)rhport;
   return true;
 }
 
 bool usbtmcd_app_initiate_abort_bulk_out(uint8_t rhport, uint8_t *tmcResult)
 {
+  (void)rhport;
   *tmcResult = USBTMC_STATUS_SUCCESS;
   return true;
 
@@ -271,7 +280,7 @@ uint8_t usbtmcd_app_get_stb(uint8_t rhport, uint8_t *tmcResult)
 {
   (void)rhport;
   uint8_t old_status = status;
-  status = status & ~(0x40); // clear SRQ
+  status = status & ~(0x40u); // clear SRQ
 
   *tmcResult = USBTMC_STATUS_SUCCESS;
   // Increment status so that we see different results on each read...

+ 29 - 8
examples/device/usbtmc/visaQuery.py

@@ -7,15 +7,20 @@ def test_idn():
 	idn = inst.query("*idn?");
 	assert idn == "TinyUSB,ModelNumber,SerialNumber,FirmwareVer123456\r\n"
 
-def test_echo():
-	longstr = "0123456789abcdef" * 50
+def test_echo(m,n):
+	longstr = "0123456789abcdefghijklmnopqrstuvwxyz" * 50
 
 	#Next try echo from 1 to 175 characters (200 is max buffer size on DUT)
-	for i in range(49,175):
+	for i in range(m,n):
+		#print(i)
 		x = longstr[0:i]
 		xt = x + inst.write_termination
 		y = inst.query(x)
-		assert(xt == y), f"echo {i}"
+		#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
 
 def test_mav():
 	assert (inst.read_stb() == 0)
@@ -57,12 +62,28 @@ inst = rm.open_resource(reslist[0]);
 inst.timeout = 3000
 inst.clear()
 
-#print(idn);
-inst.clear()
+#print("+ IDN")
+#test_idn()
+
+print("+ random trigger")
+#inst.assert_trigger();
+
+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=200")
+inst.write("delay 200")
+test_echo(50,90)
+test_echo(165,170)
 
-test_idn()
-test_echo()
+print("+ MAV")
 test_mav()
+print("+ SRQ")
 test_srq()
 
 inst.close()

+ 16 - 26
src/class/usbtmc/usbtmc_device.c

@@ -203,12 +203,6 @@ bool usbtmcd_transmit_dev_msg_data(
   {
     memcpy((uint8_t*)(usbtmc_state.ep_bulk_in_buf) + packetLen, data, hdr->TransferSize);
     packetLen = (uint16_t)(packetLen + hdr->TransferSize);
-    // Pad up to multiple of 4 bytes
-    while((packetLen % 4) != 0)
-    {
-      usbtmc_state.ep_bulk_in_buf[packetLen] = 0;
-      packetLen++;
-    }
     usbtmc_state.transfer_size_remaining = 0;
     usbtmc_state.transfer_size_sent = len;
     usbtmc_state.devInBuffer = NULL;
@@ -518,32 +512,28 @@ bool usbtmcd_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t result, uint
 
     case STATE_TX_INITIATED:
       if(usbtmc_state.transfer_size_remaining >=sizeof(usbtmc_state.ep_bulk_in_buf))
-    {
-        TRACE("IN TX continuing\r\n");
-      memcpy(usbtmc_state.ep_bulk_in_buf, usbtmc_state.devInBuffer, sizeof(usbtmc_state.ep_bulk_in_buf));
-      usbtmc_state.devInBuffer += sizeof(usbtmc_state.devInBuffer);
-      usbtmc_state.transfer_size_remaining -= sizeof(usbtmc_state.devInBuffer);
-        usbtmc_state.transfer_size_sent += sizeof(usbtmc_state.devInBuffer);
-      TU_VERIFY( usbd_edpt_xfer(rhport, usbtmc_state.ep_bulk_in, usbtmc_state.ep_bulk_in_buf,sizeof(usbtmc_state.devInBuffer)));
-    }
-    else // last packet
-    {
-        TRACE("IN TX last packet\r\n");
-      size_t packetLen = usbtmc_state.transfer_size_remaining;
-      memcpy(usbtmc_state.ep_bulk_in_buf, usbtmc_state.devInBuffer, usbtmc_state.transfer_size_remaining);
-      while((packetLen % 4) != 0)
       {
-          usbtmc_state.ep_bulk_in_buf[packetLen] = 0u;
-        packetLen++;
+        TRACE("IN TX continuing\r\n");
+        // FIXME! This removes const below!
+        TU_VERIFY( usbd_edpt_xfer(rhport, usbtmc_state.ep_bulk_in,
+            (void*)usbtmc_state.devInBuffer,sizeof(usbtmc_state.ep_bulk_in_buf)));
+        usbtmc_state.devInBuffer += sizeof(usbtmc_state.ep_bulk_in_buf);
+        usbtmc_state.transfer_size_remaining -= sizeof(usbtmc_state.ep_bulk_in_buf);
+        usbtmc_state.transfer_size_sent += sizeof(usbtmc_state.ep_bulk_in_buf);
       }
+      else // last packet
+      {
+        TRACE("IN TX last packet\r\n");
+        size_t packetLen = usbtmc_state.transfer_size_remaining;
+        memcpy(usbtmc_state.ep_bulk_in_buf, usbtmc_state.devInBuffer, usbtmc_state.transfer_size_remaining);
         usbtmc_state.transfer_size_sent += sizeof(usbtmc_state.transfer_size_remaining);
-      usbtmc_state.transfer_size_remaining = 0;
-      usbtmc_state.devInBuffer = NULL;
-      TU_VERIFY( usbd_edpt_xfer(rhport, usbtmc_state.ep_bulk_in, usbtmc_state.ep_bulk_in_buf,(uint16_t)packetLen));
+        usbtmc_state.transfer_size_remaining = 0;
+        usbtmc_state.devInBuffer = NULL;
+        TU_VERIFY( usbd_edpt_xfer(rhport, usbtmc_state.ep_bulk_in, usbtmc_state.ep_bulk_in_buf,(uint16_t)packetLen));
         if(((packetLen % USBTMCD_MAX_PACKET_SIZE) != 0) || (packetLen == 0 ))
         {
           usbtmc_state.state = STATE_TX_SHORTED;
-    }
+        }
       }
       return true;
     case STATE_ABORTING_BULK_IN: