.CharFormat = OneStopBit,\r
.ParityType = Parity_None,\r
.DataBits = 8 };\r
+ \r
+/** Indicates if the host has set the device line encoding. Until the line encoding is set by the host, the device should\r
+ * not attempt to send any bytes.\r
+ */ \r
+bool LineEncodingSet = false;\r
+\r
\r
#if 0\r
/* NOTE: Here you can set up a standard stream using the created virtual serial port, so that the standard stream functions in\r
* <stdio.h> can be used on the virtual serial port (e.g. fprintf(&USBSerial, "Test"); to print a string).\r
*/\r
\r
-static int CDC_putchar (char c, FILE *stream)\r
-{\r
- if (!(USB_IsConnected))\r
- return -1;\r
- \r
+static int CDC_putchar(char c, FILE *stream)\r
+{ \r
Endpoint_SelectEndpoint(CDC_TX_EPNUM);\r
- while (!(Endpoint_IsReadWriteAllowed()));\r
+\r
+ if (!(LineEncodingSet))\r
+ return -1;\r
+ \r
+ while (!(Endpoint_IsReadWriteAllowed()))\r
+ {\r
+ if (USB_DeviceState != DEVICE_STATE_Configured)\r
+ return -1;\r
+ }\r
+\r
Endpoint_Write_Byte(c);\r
Endpoint_ClearIN();\r
\r
return 0;\r
}\r
\r
-static int CDC_getchar (FILE *stream)\r
+static int CDC_getchar(FILE *stream)\r
{\r
int c;\r
- \r
+\r
+ if (!(LineEncodingSet))\r
+ return -1;\r
+\r
Endpoint_SelectEndpoint(CDC_RX_EPNUM);\r
\r
for (;;)\r
{\r
- if (!(USB_IsConnected))\r
- return -1;\r
-\r
- while (!(Endpoint_IsReadWriteAllowed()));\r
+ while (!(Endpoint_IsReadWriteAllowed()))\r
+ {\r
+ if (USB_DeviceState != DEVICE_STATE_Configured)\r
+ return -1;\r
+ }\r
\r
if (!(Endpoint_BytesInEndpoint()))\r
{\r
\r
/* Read the line coding data in from the host into the global struct */\r
Endpoint_Read_Control_Stream_LE(LineCodingData, sizeof(CDC_Line_Coding_t));\r
+ \r
+ /* Indicate that the line encoding has been set, and the device may now send data */\r
+ LineEncodingSet = true;\r
\r
/* Finalize the stream transfer to clear the last packet from the host */\r
Endpoint_ClearIN();\r
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
char* ReportString = NULL;\r
uint8_t JoyStatus_LCL = Joystick_GetStatus();\r
static bool ActionSent = false;\r
-\r
- char* JoystickStrings[] =\r
- {\r
- "Joystick Up\r\n",\r
- "Joystick Down\r\n",\r
- "Joystick Left\r\n",\r
- "Joystick Right\r\n",\r
- "Joystick Pressed\r\n",\r
- };\r
+ char* JoystickStrings[] =\r
+ {\r
+ "Joystick Up\r\n",\r
+ "Joystick Down\r\n",\r
+ "Joystick Left\r\n",\r
+ "Joystick Right\r\n",\r
+ "Joystick Pressed\r\n",\r
+ };\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
{\r
ActionSent = false;\r
}\r
- else if (ActionSent == false)\r
+ else if ((ActionSent == false) && LineEncodingSet)\r
{\r
ActionSent = true;\r
\r
if (IsFull)\r
{\r
/* Wait until the endpoint is ready for another packet */\r
- while (!(Endpoint_IsINReady()));\r
+ while (!(Endpoint_IsINReady()))\r
+ {\r
+ if (USB_DeviceState == DEVICE_STATE_Unattached)\r
+ return;\r
+ }\r
\r
/* Send an empty packet to ensure that the host does not buffer data sent to it */\r
Endpoint_ClearIN();\r