+ \r
+ TMC_MessageHeader_t MessageHeader;\r
+ uint16_t BytesTransferred;\r
+ \r
+ /* Try to read in a TMC message from the interface, process if one is available */\r
+ if (ReadTMCHeader(&MessageHeader))\r
+ {\r
+ /* Indicate busy */\r
+ LEDs_SetAllLEDs(LEDMASK_USB_BUSY);\r
+ \r
+ switch (MessageHeader.MessageID)\r
+ {\r
+ case TMC_MESSAGEID_DEV_DEP_MSG_OUT:\r
+ BytesTransferred = 0;\r
+ while (Endpoint_Discard_Stream(MessageHeader.TransferSize, &BytesTransferred) ==\r
+ ENDPOINT_RWSTREAM_IncompleteTransfer)\r
+ {\r
+ if (IsTMCBulkOUTReset)\r
+ break;\r
+ }\r
+ LastTransferLength = BytesTransferred;\r
+ \r
+ Endpoint_ClearOUT();\r
+ break;\r
+ case TMC_MESSAGEID_DEV_DEP_MSG_IN:\r
+ Endpoint_ClearOUT();\r
+ \r
+ char MessageData[] = "TMC Class Test";\r
+\r
+ MessageHeader.TransferSize = strlen(MessageData);\r
+ MessageHeader.MessageIDSpecific.DeviceOUT.LastMessageTransaction = true;\r
+ WriteTMCHeader(&MessageHeader);\r
+\r
+ BytesTransferred = 0;\r
+ while (Endpoint_Write_Stream_LE(MessageData, MessageHeader.TransferSize, &BytesTransferred) ==\r
+ ENDPOINT_RWSTREAM_IncompleteTransfer)\r
+ {\r
+ if (IsTMCBulkINReset)\r
+ break;\r
+ }\r
+ LastTransferLength = BytesTransferred;\r
+\r
+ Endpoint_ClearIN();\r
+ break;\r
+ default:\r
+ Endpoint_StallTransaction();\r
+ break;\r
+ }\r
+\r
+ LEDs_SetAllLEDs(LEDMASK_USB_READY);\r
+ }\r
+ \r
+ /* All pending data has been processed - reset the data abort flags */\r
+ IsTMCBulkINReset = false;\r
+ IsTMCBulkOUTReset = false;\r
+}\r
+\r
+/** Attempts to read in the TMC message header from the TMC interface.\r
+ *\r
+ * \param[out] MessageHeader Pointer to a location where the read header (if any) should be stored\r
+ *\r
+ * \return Boolean true if a header was read, false otherwise\r
+ */\r
+bool ReadTMCHeader(TMC_MessageHeader_t* const MessageHeader)\r
+{\r
+ uint16_t BytesTransferred;\r
+ uint8_t ErrorCode;\r
+\r
+ /* Select the Data Out endpoint */\r