};\r
\r
/** Current TMC control request that is being processed */\r
-uint8_t RequestInProgess = 0;\r
+uint8_t RequestInProgress = 0;\r
\r
/** Stream callback abort flag for bulk IN data */\r
bool IsTMCBulkINReset = false;\r
Endpoint_ClearSETUP();\r
\r
/* Check that no split transaction is already in progress and the data transfer tag is valid */\r
- if (RequestInProgess != 0)\r
+ if (RequestInProgress != 0)\r
{\r
TMCRequestStatus = TMC_STATUS_SPLIT_IN_PROGRESS;\r
}\r
IsTMCBulkOUTReset = true;\r
\r
/* Save the split request for later checking when a new request is received */\r
- RequestInProgess = Req_InitiateAbortBulkOut;\r
+ RequestInProgress = Req_InitiateAbortBulkOut;\r
}\r
\r
/* Write the request response byte */\r
Endpoint_ClearSETUP();\r
\r
/* Check that an ABORT BULK OUT transaction has been requested and that the request has completed */\r
- if (RequestInProgess != Req_InitiateAbortBulkOut)\r
+ if (RequestInProgress != Req_InitiateAbortBulkOut)\r
TMCRequestStatus = TMC_STATUS_SPLIT_NOT_IN_PROGRESS; \r
else if (IsTMCBulkOUTReset)\r
TMCRequestStatus = TMC_STATUS_PENDING;\r
else\r
- RequestInProgess = 0; \r
+ RequestInProgress = 0; \r
\r
/* Write the request response bytes */\r
Endpoint_Write_Byte(TMCRequestStatus);\r
Endpoint_ClearSETUP();\r
\r
/* Check that no split transaction is already in progress and the data transfer tag is valid */\r
- if (RequestInProgess != 0)\r
+ if (RequestInProgress != 0)\r
{\r
TMCRequestStatus = TMC_STATUS_SPLIT_IN_PROGRESS; \r
}\r
IsTMCBulkINReset = true;\r
\r
/* Save the split request for later checking when a new request is received */\r
- RequestInProgess = Req_InitiateAbortBulkIn;\r
+ RequestInProgress = Req_InitiateAbortBulkIn;\r
}\r
\r
/* Write the request response bytes */\r
Endpoint_ClearSETUP();\r
\r
/* Check that an ABORT BULK IN transaction has been requested and that the request has completed */\r
- if (RequestInProgess != Req_InitiateAbortBulkIn)\r
+ if (RequestInProgress != Req_InitiateAbortBulkIn)\r
TMCRequestStatus = TMC_STATUS_SPLIT_NOT_IN_PROGRESS;\r
else if (IsTMCBulkINReset)\r
TMCRequestStatus = TMC_STATUS_PENDING;\r
else\r
- RequestInProgess = 0;\r
+ RequestInProgress = 0;\r
\r
/* Write the request response bytes */\r
Endpoint_Write_Byte(TMCRequestStatus);\r
Endpoint_ClearSETUP();\r
\r
/* Check that no split transaction is already in progress */\r
- if (RequestInProgess != 0)\r
+ if (RequestInProgress != 0)\r
{\r
Endpoint_Write_Byte(TMC_STATUS_SPLIT_IN_PROGRESS); \r
}\r
IsTMCBulkOUTReset = true;\r
\r
/* Save the split request for later checking when a new request is received */\r
- RequestInProgess = Req_InitiateClear;\r
+ RequestInProgress = Req_InitiateClear;\r
}\r
\r
/* Write the request response byte */\r
Endpoint_ClearSETUP();\r
\r
/* Check that a CLEAR transaction has been requested and that the request has completed */\r
- if (RequestInProgess != Req_InitiateClear)\r
+ if (RequestInProgress != Req_InitiateClear)\r
TMCRequestStatus = TMC_STATUS_SPLIT_NOT_IN_PROGRESS; \r
else if (IsTMCBulkINReset || IsTMCBulkOUTReset)\r
TMCRequestStatus = TMC_STATUS_PENDING;\r
else\r
- RequestInProgess = 0;\r
+ RequestInProgress = 0;\r
\r
/* Write the request response bytes */\r
Endpoint_Write_Byte(TMCRequestStatus);\r
/* 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