* It is possible to completely ignore these value or use other settings as the host is completely unaware of the physical\r
* serial link characteristics and instead sends and receives data in endpoint streams.\r
*/\r
-CDC_Line_Coding_t LineCoding = { .BaudRateBPS = 9600,\r
- .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
+CDC_Line_Coding_t LineEncoding = { .BaudRateBPS = 0,\r
+ .CharFormat = OneStopBit,\r
+ .ParityType = Parity_None,\r
+ .DataBits = 8 };\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
{ \r
Endpoint_SelectEndpoint(CDC_TX_EPNUM);\r
\r
- if (!(LineEncodingSet))\r
+ if (!(LineEncoding.BaudRateBPS))\r
return -1;\r
\r
- while (!(Endpoint_IsReadWriteAllowed()))\r
- {\r
- if (USB_DeviceState != DEVICE_STATE_Configured)\r
- return -1;\r
- }\r
+ if (Endpoint_WaitUntilReady())\r
+ return -1;\r
\r
Endpoint_Write_Byte(c);\r
Endpoint_ClearIN();\r
{\r
int c;\r
\r
- if (!(LineEncodingSet))\r
+ if (!(LineEncoding.BaudRateBPS))\r
return -1;\r
\r
Endpoint_SelectEndpoint(CDC_RX_EPNUM);\r
\r
for (;;)\r
{\r
- while (!(Endpoint_IsReadWriteAllowed()))\r
- {\r
- if (USB_DeviceState != DEVICE_STATE_Configured)\r
- return -1;\r
- }\r
+ if (Endpoint_WaitUntilReady())\r
+ return -1;\r
\r
if (!(Endpoint_BytesInEndpoint()))\r
{\r
/** Event handler for the USB_Connect event. This indicates that the device is enumerating via the status LEDs and\r
* starts the library USB task to begin the enumeration and USB management process.\r
*/\r
-void EVENT_USB_Connect(void)\r
+void EVENT_USB_Device_Connect(void)\r
{\r
/* Indicate USB enumerating */\r
LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING);\r
/** Event handler for the USB_Disconnect event. This indicates that the device is no longer connected to a host via\r
* the status LEDs and stops the USB management and CDC management tasks.\r
*/\r
-void EVENT_USB_Disconnect(void)\r
+void EVENT_USB_Device_Disconnect(void)\r
{\r
/* Indicate USB not ready */\r
LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);\r
/** Event handler for the USB_ConfigurationChanged event. This is fired when the host set the current configuration\r
* of the USB device after enumeration - the device endpoints are configured and the CDC management task started.\r
*/\r
-void EVENT_USB_ConfigurationChanged(void)\r
+void EVENT_USB_Device_ConfigurationChanged(void)\r
{\r
/* Indicate USB connected and ready */\r
LEDs_SetAllLEDs(LEDMASK_USB_READY);\r
{\r
LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
}\r
+ \r
+ /* Reset line encoding baud rate so that the host knows to send new values */\r
+ LineEncoding.BaudRateBPS = 0;\r
}\r
\r
-/** Event handler for the USB_UnhandledControlPacket event. This is used to catch standard and class specific\r
+/** Event handler for the USB_UnhandledControlRequest event. This is used to catch standard and class specific\r
* control requests that are not handled internally by the USB library (including the CDC control commands,\r
* which are all issued via the control endpoint), so that they can be handled appropriately for the application.\r
*/\r
-void EVENT_USB_UnhandledControlPacket(void)\r
+void EVENT_USB_Device_UnhandledControlRequest(void)\r
{\r
- uint8_t* LineCodingData = (uint8_t*)&LineCoding;\r
-\r
/* Process CDC specific control requests */\r
switch (USB_ControlRequest.bRequest)\r
{\r
Endpoint_ClearSETUP();\r
\r
/* Write the line coding data to the control endpoint */\r
- Endpoint_Write_Control_Stream_LE(LineCodingData, sizeof(CDC_Line_Coding_t));\r
+ Endpoint_Write_Control_Stream_LE(&LineEncoding, sizeof(CDC_Line_Coding_t));\r
\r
/* Finalize the stream transfer to send the last packet or clear the host abort */\r
Endpoint_ClearOUT();\r
Endpoint_ClearSETUP();\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
+ Endpoint_Read_Control_Stream_LE(&LineEncoding, sizeof(CDC_Line_Coding_t));\r
\r
/* Finalize the stream transfer to clear the last packet from the host */\r
Endpoint_ClearIN();\r
char* ReportString = NULL;\r
uint8_t JoyStatus_LCL = Joystick_GetStatus();\r
static bool ActionSent = false;\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_DeviceState != DEVICE_STATE_Configured)\r
\r
/* Determine if a joystick action has occurred */\r
if (JoyStatus_LCL & JOY_UP)\r
- ReportString = JoystickStrings[0];\r
+ ReportString = "Joystick Up\r\n";\r
else if (JoyStatus_LCL & JOY_DOWN)\r
- ReportString = JoystickStrings[1];\r
+ ReportString = "Joystick Down\r\n";\r
else if (JoyStatus_LCL & JOY_LEFT)\r
- ReportString = JoystickStrings[2];\r
+ ReportString = "Joystick Left\r\n";\r
else if (JoyStatus_LCL & JOY_RIGHT)\r
- ReportString = JoystickStrings[3];\r
+ ReportString = "Joystick Right\r\n";\r
else if (JoyStatus_LCL & JOY_PRESS)\r
- ReportString = JoystickStrings[4];\r
+ ReportString = "Joystick Pressed\r\n";\r
+ else\r
+ ActionSent = false;\r
\r
/* Flag management - Only allow one string to be sent per action */\r
- if (ReportString == NULL)\r
- {\r
- ActionSent = false;\r
- }\r
- else if ((ActionSent == false) && LineEncodingSet)\r
+ if ((ReportString != NULL) && (ActionSent == false) && LineEncoding.BaudRateBPS)\r
{\r
ActionSent = true;\r
\r
if (IsFull)\r
{\r
/* Wait until the endpoint is ready for another packet */\r
- while (!(Endpoint_IsINReady()))\r
- {\r
- if (USB_DeviceState == DEVICE_STATE_Unattached)\r
- return;\r
- }\r
+ Endpoint_WaitUntilReady();\r
\r
/* Send an empty packet to ensure that the host does not buffer data sent to it */\r
Endpoint_ClearIN();\r