|
|
@@ -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)
|