Add missing INTERRUPT_CONTROL_ENDPOINT compile time option to the Mass Storage device...
[pub/USBasp.git] / Demos / Device / Incomplete / TestAndMeasurement / TestAndMeasurement.c
index c3e54ab..184e2e2 100644 (file)
@@ -61,6 +61,12 @@ bool IsTMCBulkINReset    = false;
 /** Stream callback abort flag for bulk OUT data */\r
 bool IsTMCBulkOUTReset   = false;\r
 \r
+/** Last used tag value for bulk IN transfers */\r
+uint8_t NextTransferINTag  = 0;\r
+\r
+/** Last used tag value for bulk IN transfers */\r
+uint8_t NextTransferOUTTag  = 0;\r
+\r
 \r
 /** Main program entry point. This routine contains the overall program flow, including initial\r
  *  setup of all components and the main program loop.\r
@@ -126,6 +132,8 @@ void EVENT_USB_Device_ConfigurationChanged(void)
 \r
 void EVENT_USB_Device_UnhandledControlRequest(void)\r
 {\r
+       uint8_t TMCRequestStatus = TMC_REQUEST_STATUS_SUCCESS;\r
+\r
        switch (USB_ControlRequest.bRequest)\r
        {\r
                case Req_InitiateAbortBulkOut:\r
@@ -133,10 +141,13 @@ void EVENT_USB_Device_UnhandledControlRequest(void)
                        {\r
                                Endpoint_ClearSETUP();\r
                                \r
-                               /* Check to see if a split request is already being processed before starting a new one */\r
                                if (RequestInProgess != 0)\r
                                {\r
-                                       Endpoint_Write_Byte(TMC_REQUEST_STATUS_SPLIT_IN_PROGRESS);                              \r
+                                       TMCRequestStatus = TMC_REQUEST_STATUS_SPLIT_IN_PROGRESS;\r
+                               }\r
+                               else if (USB_ControlRequest.wValue != NextTransferOUTTag)\r
+                               {\r
+                                       TMCRequestStatus = TMC_REQUEST_STATUS_TRANSFER_NOT_IN_PROGRESS;\r
                                }\r
                                else\r
                                {\r
@@ -145,10 +156,11 @@ void EVENT_USB_Device_UnhandledControlRequest(void)
                                        \r
                                        /* Save the split request for later checking when a new request is received */\r
                                        RequestInProgess = Req_InitiateAbortBulkOut;\r
-\r
-                                       Endpoint_Write_Byte(TMC_REQUEST_STATUS_SUCCESS);\r
                                }\r
                                \r
+                               /* Write the request response byte */\r
+                               Endpoint_Write_Byte(TMCRequestStatus);\r
+\r
                                Endpoint_ClearIN();\r
                                Endpoint_ClearStatusStage();\r
                        }\r
@@ -159,21 +171,18 @@ void EVENT_USB_Device_UnhandledControlRequest(void)
                        {\r
                                Endpoint_ClearSETUP();\r
                                \r
-                               /* Check to see the correct split request is in progress before the status can be retrieved */\r
                                if (RequestInProgess != Req_InitiateAbortBulkOut)\r
-                               {\r
-                                       Endpoint_Write_Byte(TMC_REQUEST_STATUS_SPLIT_NOT_IN_PROGRESS);                          \r
-                               }\r
+                                 TMCRequestStatus = TMC_REQUEST_STATUS_SPLIT_NOT_IN_PROGRESS;                          \r
+                               else if (IsTMCBulkOUTReset)\r
+                                 TMCRequestStatus = TMC_REQUEST_STATUS_PENDING;\r
                                else\r
-                               {\r
-                                       // TODO: CLEAR BULK OUT\r
+                                 RequestInProgess = 0;                 \r
                                \r
-                                       /* Clear the pending split request value so that a new request can be made */\r
-                                       RequestInProgess = 0;\r
+                               /* Write the request response bytes */\r
+                               Endpoint_Write_Byte(TMCRequestStatus);\r
+                               Endpoint_Write_Word_LE(0);\r
+                               Endpoint_Write_DWord_LE(0); // TODO - Last transfer length\r
 \r
-                                       Endpoint_Write_Byte(TMC_REQUEST_STATUS_SUCCESS);\r
-                               }\r
-                               \r
                                Endpoint_ClearIN();\r
                                Endpoint_ClearStatusStage();                            \r
                        }\r
@@ -184,10 +193,13 @@ void EVENT_USB_Device_UnhandledControlRequest(void)
                        {\r
                                Endpoint_ClearSETUP();\r
                                \r
-                               /* Check to see if a split request is already being processed before starting a new one */\r
                                if (RequestInProgess != 0)\r
                                {\r
-                                       Endpoint_Write_Byte(TMC_REQUEST_STATUS_SPLIT_IN_PROGRESS);                              \r
+                                       TMCRequestStatus = TMC_REQUEST_STATUS_SPLIT_IN_PROGRESS;                                \r
+                               }\r
+                               else if (USB_ControlRequest.wValue != NextTransferINTag)\r
+                               {\r
+                                       TMCRequestStatus = TMC_REQUEST_STATUS_TRANSFER_NOT_IN_PROGRESS;\r
                                }\r
                                else\r
                                {\r
@@ -196,10 +208,12 @@ void EVENT_USB_Device_UnhandledControlRequest(void)
                                        \r
                                        /* Save the split request for later checking when a new request is received */\r
                                        RequestInProgess = Req_InitiateAbortBulkIn;\r
-\r
-                                       Endpoint_Write_Byte(TMC_REQUEST_STATUS_SUCCESS);\r
                                }\r
                                \r
+                               /* Write the request response bytes */\r
+                               Endpoint_Write_Byte(TMCRequestStatus);\r
+                               Endpoint_Write_Byte(NextTransferINTag);\r
+\r
                                Endpoint_ClearIN();\r
                                Endpoint_ClearStatusStage();\r
                        }\r
@@ -210,23 +224,20 @@ void EVENT_USB_Device_UnhandledControlRequest(void)
                        {\r
                                Endpoint_ClearSETUP();\r
                                \r
-                               /* Check to see the correct split request is in progress before the status can be retrieved */\r
                                if (RequestInProgess != Req_InitiateAbortBulkIn)\r
-                               {\r
-                                       Endpoint_Write_Byte(TMC_REQUEST_STATUS_SPLIT_NOT_IN_PROGRESS);                          \r
-                               }\r
+                                 TMCRequestStatus = TMC_REQUEST_STATUS_SPLIT_NOT_IN_PROGRESS;\r
+                               else if (IsTMCBulkINReset)\r
+                                 TMCRequestStatus = TMC_REQUEST_STATUS_PENDING;\r
                                else\r
-                               {\r
-                                       // TODO: CLEAR BULK IN\r
+                                 RequestInProgess = 0;\r
                                \r
-                                       /* Clear the pending split request value so that a new request can be made */\r
-                                       RequestInProgess = 0;\r
+                               /* Write the request response bytes */\r
+                               Endpoint_Write_Byte(TMCRequestStatus);\r
+                               Endpoint_Write_Word_LE(0);\r
+                               Endpoint_Write_DWord_LE(0); // TODO - Last transfer length\r
 \r
-                                       Endpoint_Write_Byte(TMC_REQUEST_STATUS_SUCCESS);\r
-                               }\r
-                               \r
                                Endpoint_ClearIN();\r
-                               Endpoint_ClearStatusStage();                            \r
+                               Endpoint_ClearStatusStage();\r
                        }\r
                        \r
                        break;\r
@@ -235,7 +246,6 @@ void EVENT_USB_Device_UnhandledControlRequest(void)
                        {\r
                                Endpoint_ClearSETUP();\r
                                \r
-                               /* Check to see if a split request is already being processed before starting a new one */\r
                                if (RequestInProgess != 0)\r
                                {\r
                                        Endpoint_Write_Byte(TMC_REQUEST_STATUS_SPLIT_IN_PROGRESS);                              \r
@@ -248,10 +258,11 @@ void EVENT_USB_Device_UnhandledControlRequest(void)
                                        \r
                                        /* Save the split request for later checking when a new request is received */\r
                                        RequestInProgess = Req_InitiateClear;\r
-\r
-                                       Endpoint_Write_Byte(TMC_REQUEST_STATUS_SUCCESS);\r
                                }\r
                                \r
+                               /* Write the request response byte */\r
+                               Endpoint_Write_Byte(TMCRequestStatus);\r
+\r
                                Endpoint_ClearIN();\r
                                Endpoint_ClearStatusStage();\r
                        }\r
@@ -262,20 +273,16 @@ void EVENT_USB_Device_UnhandledControlRequest(void)
                        {\r
                                Endpoint_ClearSETUP();\r
                                \r
-                               /* Check to see the correct split request is in progress before the status can be retrieved */\r
                                if (RequestInProgess != Req_InitiateClear)\r
-                               {\r
-                                       Endpoint_Write_Byte(TMC_REQUEST_STATUS_SPLIT_NOT_IN_PROGRESS);                          \r
-                               }\r
+                                 TMCRequestStatus = TMC_REQUEST_STATUS_SPLIT_NOT_IN_PROGRESS;                          \r
+                               else if (IsTMCBulkINReset || IsTMCBulkOUTReset)\r
+                                 TMCRequestStatus = TMC_REQUEST_STATUS_PENDING;\r
                                else\r
-                               {\r
-                                       // TODO: CLEAR STATUS\r
+                                 RequestInProgess = 0;\r
                                \r
-                                       /* Clear the pending split request value so that a new request can be made */\r
-                                       RequestInProgess = 0;\r
-\r
-                                       Endpoint_Write_Byte(TMC_REQUEST_STATUS_SUCCESS);\r
-                               }\r
+                               /* Write the request response bytes */\r
+                               Endpoint_Write_Byte(TMCRequestStatus);\r
+                               Endpoint_Write_Byte(0);\r
                                \r
                                Endpoint_ClearIN();\r
                                Endpoint_ClearStatusStage();                            \r
@@ -313,6 +320,10 @@ void TMC_Task(void)
                LEDs_SetAllLEDs(LEDS_ALL_LEDS);\r
                Endpoint_ClearOUT();\r
        }\r
+       \r
+       /* All pending data has been processed - reset the data abort flags */\r
+       IsTMCBulkINReset  = false;\r
+       IsTMCBulkOUTReset = false;\r
 }\r
 \r
 /** Stream callback function for the Endpoint stream write functions. This callback will abort the current stream transfer\r