Added new USB_DeviceState variable to keep track of the current Device mode USB state.
[pub/USBasp.git] / Demos / Device / LowLevel / USBtoSerial / USBtoSerial.c
index 9160dd1..af963b1 100644 (file)
@@ -192,9 +192,7 @@ void EVENT_USB_UnhandledControlPacket(void)
                                                 CONTROL_LINE_OUT_* masks to determine the RTS and DTR line states using the following code:\r
                                */\r
 \r
-                               /* Acknowledge status stage */\r
-                               while (!(Endpoint_IsINReady()));\r
-                               Endpoint_ClearIN();\r
+                               Endpoint_ClearStatusStage();\r
                        }\r
        \r
                        break;\r
@@ -205,7 +203,7 @@ void EVENT_USB_UnhandledControlPacket(void)
 void CDC_Task(void)\r
 {\r
        /* Device must be connected and configured for the task to run */\r
-       if (!(USB_IsConnected) || !(USB_ConfigurationNumber))\r
+       if (USB_DeviceState != DEVICE_STATE_Configured)\r
          return;\r
          \r
 #if 0\r
@@ -264,7 +262,11 @@ void CDC_Task(void)
        if (Tx_Buffer.Elements)\r
        {\r
                /* Wait until Serial Tx Endpoint Ready for Read/Write */\r
-               while (!(Endpoint_IsReadWriteAllowed()));\r
+               while (!(Endpoint_IsReadWriteAllowed()))\r
+               {\r
+                       if (USB_DeviceState == DEVICE_STATE_Unattached)\r
+                         return;\r
+               }\r
                \r
                /* Write the bytes from the buffer to the endpoint while space is available */\r
                while (Tx_Buffer.Elements && Endpoint_IsReadWriteAllowed())\r
@@ -284,8 +286,12 @@ void CDC_Task(void)
                if (IsFull && !(Tx_Buffer.Elements))\r
                {\r
                        /* Wait until Serial Tx Endpoint Ready for Read/Write */\r
-                       while (!(Endpoint_IsReadWriteAllowed()));\r
-\r
+                       while (!(Endpoint_IsReadWriteAllowed()))\r
+                       {\r
+                               if (USB_DeviceState == DEVICE_STATE_Unattached)\r
+                                 return;\r
+                       }\r
+                               \r
                        /* Send an empty packet to terminate the transfer */\r
                        Endpoint_ClearIN();\r
                }\r
@@ -298,11 +304,8 @@ void CDC_Task(void)
 ISR(USART1_RX_vect, ISR_BLOCK)\r
 {\r
        /* Only store received characters if the USB interface is connected */\r
-       if (USB_IsConnected)\r
-       {\r
-               /* Character received, store it into the buffer */\r
-               Buffer_StoreElement(&Tx_Buffer, UDR1);\r
-       }\r
+       if (USB_DeviceState != DEVICE_STATE_Configured)\r
+         Buffer_StoreElement(&Tx_Buffer, UDR1);\r
 }\r
 \r
 /** Reconfigures the USART to match the current serial port settings issued by the host as closely as possible. */\r