/* Device must be connected and configured for the task to run */\r
if (USB_DeviceState != DEVICE_STATE_Configured)\r
return;\r
- \r
- Endpoint_SelectEndpoint(TMC_OUT_EPNUM);\r
\r
- if (Endpoint_IsOUTReceived())\r
+ TMC_MessageHeader_t MessageHeader;\r
+ \r
+ /* Check if a TMC packet has been received */\r
+ if (ReadTMCHeader(&MessageHeader))\r
{\r
- TMC_MessageHeader_t MessageHeader;\r
- \r
- Endpoint_Read_Stream_LE(&MessageHeader, sizeof(MessageHeader), StreamCallback_AbortOUTOnRequest);\r
- CurrentTransferTag = MessageHeader.Tag;\r
+ /* Indicate busy */\r
+ LEDs_SetAllLEDs(LEDMASK_USB_BUSY);\r
\r
switch (MessageHeader.MessageID)\r
{\r
case TMC_MESSAGEID_DEV_DEP_MSG_OUT:\r
-\r
+ Endpoint_Discard_Stream(MessageHeader.TransferSize, StreamCallback_AbortOUTOnRequest);\r
+ Endpoint_ClearOUT();\r
break;\r
case TMC_MESSAGEID_DEV_DEP_MSG_IN:\r
+ Endpoint_ClearOUT();\r
\r
- break;\r
- case TMC_MESSAGEID_DEV_VENDOR_OUT:\r
-\r
- break;\r
- case TMC_MESSAGEID_DEV_VENDOR_IN:\r
+ MessageHeader.TransferSize = 3;\r
+ WriteTMCHeader(&MessageHeader);\r
\r
+ Endpoint_Write_Stream_LE("TMC", 3, StreamCallback_AbortINOnRequest);\r
+ Endpoint_ClearIN();\r
break;\r
default:\r
Endpoint_StallTransaction();\r
break;\r
}\r
- \r
- Endpoint_ClearOUT();\r
+\r
+ LEDs_SetAllLEDs(LEDMASK_USB_READY);\r
}\r
\r
/* All pending data has been processed - reset the data abort flags */\r
IsTMCBulkOUTReset = false;\r
}\r
\r
+bool ReadTMCHeader(TMC_MessageHeader_t* const MessageHeader)\r
+{\r
+ /* Select the Data Out endpoint */\r
+ Endpoint_SelectEndpoint(TMC_OUT_EPNUM);\r
+ \r
+ /* Abort if no command has been sent from the host */\r
+ if (!(Endpoint_IsOUTReceived()))\r
+ return false;\r
+ \r
+ /* Read in the header of the command from the host */\r
+ Endpoint_Read_Stream_LE(MessageHeader, sizeof(TMC_MessageHeader_t), StreamCallback_AbortOUTOnRequest);\r
+\r
+ /* Store the new command tag value for later use */\r
+ CurrentTransferTag = MessageHeader->Tag;\r
+ \r
+ /* Indicate if the command has been aborted or not */\r
+ return !IsTMCBulkOUTReset;\r
+}\r
+\r
+bool WriteTMCHeader(TMC_MessageHeader_t* const MessageHeader)\r
+{\r
+ /* Compute the next transfer tag value, must be between 1 and 254 */\r
+ if (++CurrentTransferTag == 0xFF)\r
+ CurrentTransferTag = 1;\r
+\r
+ /* Set the message tag of the command header */\r
+ MessageHeader->Tag = CurrentTransferTag;\r
+ MessageHeader->InverseTag = ~CurrentTransferTag;\r
+\r
+ /* Select the Data In endpoint */\r
+ Endpoint_SelectEndpoint(TMC_IN_EPNUM);\r
+\r
+ /* Send the command header to the host */\r
+ Endpoint_Write_Stream_LE(MessageHeader, sizeof(TMC_MessageHeader_t), StreamCallback_AbortINOnRequest);\r
+\r
+ /* Indicate if the command has been aborted or not */\r
+ return !IsTMCBulkINReset;\r
+}\r
+\r
/** Stream callback function for the Endpoint stream write functions. This callback will abort the current stream transfer\r
* if a TMC Abort Bulk IN request has been issued to the control endpoint.\r
*/\r