Only abort Doxygen documentation generation if a non-unsupported tag warning is encou...
[pub/USBasp.git] / Demos / Host / ClassDriver / KeyboardHost / KeyboardHost.c
index 9b6125e..f67cd11 100644 (file)
@@ -1,13 +1,13 @@
 /*
              LUFA Library
 /*
              LUFA Library
-     Copyright (C) Dean Camera, 2011.
+     Copyright (C) Dean Camera, 2012.
 
   dean [at] fourwalledcubicle [dot] com
            www.lufa-lib.org
 */
 
 /*
 
   dean [at] fourwalledcubicle [dot] com
            www.lufa-lib.org
 */
 
 /*
-  Copyright 2011  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+  Copyright 2012  Dean Camera (dean [at] fourwalledcubicle [dot] com)
 
   Permission to use, copy, modify, distribute, and sell this
   software and its documentation for any purpose is hereby granted
 
   Permission to use, copy, modify, distribute, and sell this
   software and its documentation for any purpose is hereby granted
@@ -69,94 +69,7 @@ int main(void)
 
        for (;;)
        {
 
        for (;;)
        {
-               switch (USB_HostState)
-               {
-                       case HOST_STATE_Addressed:
-                               LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING);
-
-                               uint16_t ConfigDescriptorSize;
-                               uint8_t  ConfigDescriptorData[512];
-
-                               if (USB_Host_GetDeviceConfigDescriptor(1, &ConfigDescriptorSize, ConfigDescriptorData,
-                                                                      sizeof(ConfigDescriptorData)) != HOST_GETCONFIG_Successful)
-                               {
-                                       puts_P(PSTR("Error Retrieving Configuration Descriptor.\r\n"));
-                                       LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
-                                       USB_HostState = HOST_STATE_WaitForDeviceRemoval;
-                                       break;
-                               }
-
-                               if (HID_Host_ConfigurePipes(&Keyboard_HID_Interface,
-                                                           ConfigDescriptorSize, ConfigDescriptorData) != HID_ENUMERROR_NoError)
-                               {
-                                       puts_P(PSTR("Attached Device Not a Valid Keyboard.\r\n"));
-                                       LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
-                                       USB_HostState = HOST_STATE_WaitForDeviceRemoval;
-                                       break;
-                               }
-
-                               if (USB_Host_SetDeviceConfiguration(1) != HOST_SENDCONTROL_Successful)
-                               {
-                                       puts_P(PSTR("Error Setting Device Configuration.\r\n"));
-                                       LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
-                                       USB_HostState = HOST_STATE_WaitForDeviceRemoval;
-                                       break;
-                               }
-
-                               if (HID_Host_SetBootProtocol(&Keyboard_HID_Interface) != 0)
-                               {
-                                       puts_P(PSTR("Could not Set Boot Protocol Mode.\r\n"));
-                                       LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
-                                       USB_HostState = HOST_STATE_WaitForDeviceRemoval;
-                                       break;
-                               }
-
-                               puts_P(PSTR("Keyboard Enumerated.\r\n"));
-                               LEDs_SetAllLEDs(LEDMASK_USB_READY);
-                               USB_HostState = HOST_STATE_Configured;
-                               break;
-                       case HOST_STATE_Configured:
-                               if (HID_Host_IsReportReceived(&Keyboard_HID_Interface))
-                               {
-                                       USB_KeyboardReport_Data_t KeyboardReport;
-                                       HID_Host_ReceiveReport(&Keyboard_HID_Interface, &KeyboardReport);
-
-                                       LEDs_ChangeLEDs(LEDS_LED1, (KeyboardReport.Modifier) ? LEDS_LED1 : 0);
-
-                                       uint8_t KeyCode = KeyboardReport.KeyCode[0];
-
-                                       if (KeyCode)
-                                       {
-                                               char PressedKey = 0;
-
-                                               LEDs_ToggleLEDs(LEDS_LED2);
-
-                                               /* Retrieve pressed key character if alphanumeric */
-                                               if ((KeyCode >= HID_KEYBOARD_SC_A) && (KeyCode <= HID_KEYBOARD_SC_Z))
-                                               {
-                                                       PressedKey = (KeyCode - HID_KEYBOARD_SC_A) + 'A';
-                                               }
-                                               else if ((KeyCode >= HID_KEYBOARD_SC_1_AND_EXCLAMATION) &
-                                                        (KeyCode <= HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS))
-                                               {
-                                                       PressedKey = (KeyCode - HID_KEYBOARD_SC_1_AND_EXCLAMATION) + '0';
-                                               }
-                                               else if (KeyCode == HID_KEYBOARD_SC_SPACE)
-                                               {
-                                                       PressedKey = ' ';
-                                               }
-                                               else if (KeyCode == HID_KEYBOARD_SC_ENTER)
-                                               {
-                                                       PressedKey = '\n';
-                                               }
-                                               
-                                               if (PressedKey)
-                                                 putchar(PressedKey);
-                                       }
-                               }
-
-                               break;
-               }
+               KeyboardHost_Task();
 
                HID_Host_USBTask(&Keyboard_HID_Interface);
                USB_USBTask();
 
                HID_Host_USBTask(&Keyboard_HID_Interface);
                USB_USBTask();
@@ -182,6 +95,58 @@ void SetupHardware(void)
        Serial_CreateStream(NULL);
 }
 
        Serial_CreateStream(NULL);
 }
 
+/** Task to manage an enumerated USB keyboard once connected, to display key state
+ *  data as it is received.
+ */
+void KeyboardHost_Task(void)
+{
+       if (USB_HostState != HOST_STATE_Configured)
+         return;
+
+       if (HID_Host_IsReportReceived(&Keyboard_HID_Interface))
+       {
+               USB_KeyboardReport_Data_t KeyboardReport;
+               HID_Host_ReceiveReport(&Keyboard_HID_Interface, &KeyboardReport);
+
+               LEDs_ChangeLEDs(LEDS_LED1, (KeyboardReport.Modifier) ? LEDS_LED1 : 0);
+
+               uint8_t KeyCode = KeyboardReport.KeyCode[0];
+
+               if (KeyCode)
+               {
+                       char PressedKey = 0;
+
+                       LEDs_ToggleLEDs(LEDS_LED2);
+
+                       /* Retrieve pressed key character if alphanumeric */
+                       if ((KeyCode >= HID_KEYBOARD_SC_A) && (KeyCode <= HID_KEYBOARD_SC_Z))
+                       {
+                               PressedKey = (KeyCode - HID_KEYBOARD_SC_A) + 'A';
+                       }
+                       else if ((KeyCode >= HID_KEYBOARD_SC_1_AND_EXCLAMATION) &
+                                (KeyCode  < HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS))
+                       {
+                               PressedKey = (KeyCode - HID_KEYBOARD_SC_1_AND_EXCLAMATION) + '1';
+                       }
+                       else if (KeyCode == HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS)
+                       {
+                               PressedKey = '0';
+                       }
+                       else if (KeyCode == HID_KEYBOARD_SC_SPACE)
+                       {
+                               PressedKey = ' ';
+                       }
+                       else if (KeyCode == HID_KEYBOARD_SC_ENTER)
+                       {
+                               PressedKey = '\n';
+                       }
+
+                       if (PressedKey)
+                         putchar(PressedKey);
+               }
+       }
+}
+
 /** Event handler for the USB_DeviceAttached event. This indicates that a device has been attached to the host, and
  *  starts the library USB task to begin the enumeration and USB management process.
  */
 /** Event handler for the USB_DeviceAttached event. This indicates that a device has been attached to the host, and
  *  starts the library USB task to begin the enumeration and USB management process.
  */
@@ -205,6 +170,43 @@ void EVENT_USB_Host_DeviceUnattached(void)
  */
 void EVENT_USB_Host_DeviceEnumerationComplete(void)
 {
  */
 void EVENT_USB_Host_DeviceEnumerationComplete(void)
 {
+       LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING);
+
+       uint16_t ConfigDescriptorSize;
+       uint8_t  ConfigDescriptorData[512];
+
+       if (USB_Host_GetDeviceConfigDescriptor(1, &ConfigDescriptorSize, ConfigDescriptorData,
+                                              sizeof(ConfigDescriptorData)) != HOST_GETCONFIG_Successful)
+       {
+               puts_P(PSTR("Error Retrieving Configuration Descriptor.\r\n"));
+               LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
+               return;
+       }
+
+       if (HID_Host_ConfigurePipes(&Keyboard_HID_Interface,
+                                   ConfigDescriptorSize, ConfigDescriptorData) != HID_ENUMERROR_NoError)
+       {
+               puts_P(PSTR("Attached Device Not a Valid Keyboard.\r\n"));
+               LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
+               return;
+       }
+
+       if (USB_Host_SetDeviceConfiguration(1) != HOST_SENDCONTROL_Successful)
+       {
+               puts_P(PSTR("Error Setting Device Configuration.\r\n"));
+               LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
+               return;
+       }
+
+       if (HID_Host_SetBootProtocol(&Keyboard_HID_Interface) != 0)
+       {
+               puts_P(PSTR("Could not Set Boot Protocol Mode.\r\n"));
+               LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
+               USB_Host_SetDeviceConfiguration(0);
+               return;
+       }
+
+       puts_P(PSTR("Keyboard Enumerated.\r\n"));
        LEDs_SetAllLEDs(LEDMASK_USB_READY);
 }
 
        LEDs_SetAllLEDs(LEDMASK_USB_READY);
 }