summaryrefslogtreecommitdiff
path: root/Demos/Device/Incomplete/TestAndMeasurement/TestAndMeasurement.c
diff options
context:
space:
mode:
authorDean <Dean@d5102386-fcda-11dd-9fdb-3debd5008f28>2010-07-28 09:17:22 +0000
committerDean <Dean@d5102386-fcda-11dd-9fdb-3debd5008f28>2010-07-28 09:17:22 +0000
commit0f51b72dd130d4f2c5086aebf1b26877faefd24a (patch)
tree95de8087639f7d18295079d18a74f0e40f8be39c /Demos/Device/Incomplete/TestAndMeasurement/TestAndMeasurement.c
parentb407e6b03a2d6187b1d6f9793badbfd1d34014a5 (diff)
Add TMC header read and write functions, so that TMC data can now be exchanged in both directions.
Minor update to the LowLevel MassStorage device demo, so that the ReadInCommandBlock() performs the data OUT endpoint selection and packet arrival test. git-svn-id: http://lufa-lib.googlecode.com/svn/trunk@1414 d5102386-fcda-11dd-9fdb-3debd5008f28
Diffstat (limited to 'Demos/Device/Incomplete/TestAndMeasurement/TestAndMeasurement.c')
-rw-r--r--Demos/Device/Incomplete/TestAndMeasurement/TestAndMeasurement.c69
1 files changed, 54 insertions, 15 deletions
diff --git a/Demos/Device/Incomplete/TestAndMeasurement/TestAndMeasurement.c b/Demos/Device/Incomplete/TestAndMeasurement/TestAndMeasurement.c
index ab98411b..711ca3fa 100644
--- a/Demos/Device/Incomplete/TestAndMeasurement/TestAndMeasurement.c
+++ b/Demos/Device/Incomplete/TestAndMeasurement/TestAndMeasurement.c
@@ -329,36 +329,36 @@ void TMC_Task(void)
/* Device must be connected and configured for the task to run */
if (USB_DeviceState != DEVICE_STATE_Configured)
return;
-
- Endpoint_SelectEndpoint(TMC_OUT_EPNUM);
- if (Endpoint_IsOUTReceived())
+ TMC_MessageHeader_t MessageHeader;
+
+ /* Check if a TMC packet has been received */
+ if (ReadTMCHeader(&MessageHeader))
{
- TMC_MessageHeader_t MessageHeader;
-
- Endpoint_Read_Stream_LE(&MessageHeader, sizeof(MessageHeader), StreamCallback_AbortOUTOnRequest);
- CurrentTransferTag = MessageHeader.Tag;
+ /* Indicate busy */
+ LEDs_SetAllLEDs(LEDMASK_USB_BUSY);
switch (MessageHeader.MessageID)
{
case TMC_MESSAGEID_DEV_DEP_MSG_OUT:
-
+ Endpoint_Discard_Stream(MessageHeader.TransferSize, StreamCallback_AbortOUTOnRequest);
+ Endpoint_ClearOUT();
break;
case TMC_MESSAGEID_DEV_DEP_MSG_IN:
+ Endpoint_ClearOUT();
- break;
- case TMC_MESSAGEID_DEV_VENDOR_OUT:
-
- break;
- case TMC_MESSAGEID_DEV_VENDOR_IN:
+ MessageHeader.TransferSize = 3;
+ WriteTMCHeader(&MessageHeader);
+ Endpoint_Write_Stream_LE("TMC", 3, StreamCallback_AbortINOnRequest);
+ Endpoint_ClearIN();
break;
default:
Endpoint_StallTransaction();
break;
}
-
- Endpoint_ClearOUT();
+
+ LEDs_SetAllLEDs(LEDMASK_USB_READY);
}
/* All pending data has been processed - reset the data abort flags */
@@ -366,6 +366,45 @@ void TMC_Task(void)
IsTMCBulkOUTReset = false;
}
+bool ReadTMCHeader(TMC_MessageHeader_t* const MessageHeader)
+{
+ /* Select the Data Out endpoint */
+ Endpoint_SelectEndpoint(TMC_OUT_EPNUM);
+
+ /* Abort if no command has been sent from the host */
+ if (!(Endpoint_IsOUTReceived()))
+ return false;
+
+ /* Read in the header of the command from the host */
+ Endpoint_Read_Stream_LE(MessageHeader, sizeof(TMC_MessageHeader_t), StreamCallback_AbortOUTOnRequest);
+
+ /* Store the new command tag value for later use */
+ CurrentTransferTag = MessageHeader->Tag;
+
+ /* Indicate if the command has been aborted or not */
+ return !IsTMCBulkOUTReset;
+}
+
+bool WriteTMCHeader(TMC_MessageHeader_t* const MessageHeader)
+{
+ /* Compute the next transfer tag value, must be between 1 and 254 */
+ if (++CurrentTransferTag == 0xFF)
+ CurrentTransferTag = 1;
+
+ /* Set the message tag of the command header */
+ MessageHeader->Tag = CurrentTransferTag;
+ MessageHeader->InverseTag = ~CurrentTransferTag;
+
+ /* Select the Data In endpoint */
+ Endpoint_SelectEndpoint(TMC_IN_EPNUM);
+
+ /* Send the command header to the host */
+ Endpoint_Write_Stream_LE(MessageHeader, sizeof(TMC_MessageHeader_t), StreamCallback_AbortINOnRequest);
+
+ /* Indicate if the command has been aborted or not */
+ return !IsTMCBulkINReset;
+}
+
/** Stream callback function for the Endpoint stream write functions. This callback will abort the current stream transfer
* if a TMC Abort Bulk IN request has been issued to the control endpoint.
*/