* 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
+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
+ * <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
+ Endpoint_SelectEndpoint(CDC_TX_EPNUM);\r
+\r
+ if (!(LineEncoding.BaudRateBPS))\r
+ return -1;\r
+ \r
+ if (Endpoint_WaitUntilReady())\r
+ return -1;\r
+\r
+ Endpoint_Write_Byte(c);\r
+ Endpoint_ClearIN();\r
+ \r
+ return 0;\r
+}\r
+\r
+static int CDC_getchar(FILE *stream)\r
+{\r
+ int c;\r
+\r
+ if (!(LineEncoding.BaudRateBPS))\r
+ return -1;\r
+\r
+ Endpoint_SelectEndpoint(CDC_RX_EPNUM);\r
+ \r
+ for (;;)\r
+ {\r
+ if (Endpoint_WaitUntilReady())\r
+ return -1;\r
+ \r
+ if (!(Endpoint_BytesInEndpoint()))\r
+ {\r
+ Endpoint_ClearOUT();\r
+ }\r
+ else\r
+ {\r
+ c = Endpoint_Read_Byte();\r
+ break;\r
+ }\r
+ }\r
+ \r
+ return c;\r
+}\r
+\r
+static FILE USBSerial = FDEV_SETUP_STREAM(CDC_putchar, CDC_getchar, _FDEV_SETUP_RW);\r
+#endif\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
/** 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
- /* Setup CDC Notification, Rx and Tx Endpoints */\r
- Endpoint_ConfigureEndpoint(CDC_NOTIFICATION_EPNUM, EP_TYPE_INTERRUPT,\r
- ENDPOINT_DIR_IN, CDC_NOTIFICATION_EPSIZE,\r
- ENDPOINT_BANK_SINGLE);\r
-\r
- Endpoint_ConfigureEndpoint(CDC_TX_EPNUM, EP_TYPE_BULK,\r
- ENDPOINT_DIR_IN, CDC_TXRX_EPSIZE,\r
- ENDPOINT_BANK_SINGLE);\r
-\r
- Endpoint_ConfigureEndpoint(CDC_RX_EPNUM, EP_TYPE_BULK,\r
- ENDPOINT_DIR_OUT, CDC_TXRX_EPSIZE,\r
- ENDPOINT_BANK_SINGLE);\r
-\r
/* Indicate USB connected and ready */\r
LEDs_SetAllLEDs(LEDMASK_USB_READY);\r
+\r
+ /* Setup CDC Notification, Rx and Tx Endpoints */\r
+ if (!(Endpoint_ConfigureEndpoint(CDC_NOTIFICATION_EPNUM, EP_TYPE_INTERRUPT,\r
+ ENDPOINT_DIR_IN, CDC_NOTIFICATION_EPSIZE,\r
+ ENDPOINT_BANK_SINGLE)))\r
+ {\r
+ LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
+ }\r
+ \r
+ if (!(Endpoint_ConfigureEndpoint(CDC_TX_EPNUM, EP_TYPE_BULK,\r
+ ENDPOINT_DIR_IN, CDC_TXRX_EPSIZE,\r
+ ENDPOINT_BANK_SINGLE)))\r
+ {\r
+ LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
+ }\r
+ \r
+ if (!(Endpoint_ConfigureEndpoint(CDC_RX_EPNUM, EP_TYPE_BULK,\r
+ ENDPOINT_DIR_OUT, CDC_TXRX_EPSIZE,\r
+ ENDPOINT_BANK_SINGLE)))\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
+ 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
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
\r
+ /* Device must be connected and configured for the task to run */\r
+ if (USB_DeviceState != DEVICE_STATE_Configured)\r
+ return;\r
+ \r
#if 0\r
/* NOTE: Here you can use the notification endpoint to send back line state changes to the host, for the special RS-232\r
- handshake signal lines (and some error states), via the CONTROL_LINE_IN_* masks and the following code:\r
- */\r
+ * handshake signal lines (and some error states), via the CONTROL_LINE_IN_* masks and the following code:\r
+ */\r
USB_Notification_Header_t Notification = (USB_Notification_Header_t)\r
{\r
.NotificationType = (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE),\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)\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
+ Endpoint_WaitUntilReady();\r
\r
/* Send an empty packet to ensure that the host does not buffer data sent to it */\r
Endpoint_ClearIN();\r