Device mode class driver callbacks are now fired before the control request status...
[pub/USBasp.git] / Demos / Device / LowLevel / KeyboardMouse / KeyboardMouse.c
index 759ce5a..ddcd3ce 100644 (file)
@@ -1,14 +1,14 @@
 /*\r
              LUFA Library\r
 /*\r
              LUFA Library\r
-     Copyright (C) Dean Camera, 2009.\r
+     Copyright (C) Dean Camera, 2010.\r
               \r
   dean [at] fourwalledcubicle [dot] com\r
       www.fourwalledcubicle.com\r
 */\r
 \r
 /*\r
               \r
   dean [at] fourwalledcubicle [dot] com\r
       www.fourwalledcubicle.com\r
 */\r
 \r
 /*\r
-  Copyright 2009  Dean Camera (dean [at] fourwalledcubicle [dot] com)\r
-  Copyright 2009  Denver Gingerich (denver [at] ossguy [dot] com)\r
+  Copyright 2010  Dean Camera (dean [at] fourwalledcubicle [dot] com)\r
+  Copyright 2010  Denver Gingerich (denver [at] ossguy [dot] com)\r
          \r
   Permission to use, copy, modify, distribute, and sell this \r
   software and its documentation for any purpose is hereby granted\r
          \r
   Permission to use, copy, modify, distribute, and sell this \r
   software and its documentation for any purpose is hereby granted\r
@@ -52,6 +52,7 @@ int main(void)
        SetupHardware();\r
        \r
        LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);\r
        SetupHardware();\r
        \r
        LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);\r
+       sei();\r
 \r
        for (;;)\r
        {\r
 \r
        for (;;)\r
        {\r
@@ -180,21 +181,8 @@ void EVENT_USB_Device_UnhandledControlRequest(void)
                                          return;\r
                                }\r
 \r
                                          return;\r
                                }\r
 \r
-                               /* Read in the LED report from the host */\r
-                               uint8_t LEDStatus = Endpoint_Read_Byte();\r
-                               uint8_t LEDMask   = LEDS_LED2;\r
-                               \r
-                               if (LEDStatus & 0x01) // NUM Lock\r
-                                 LEDMask |= LEDS_LED1;\r
-                               \r
-                               if (LEDStatus & 0x02) // CAPS Lock\r
-                                 LEDMask |= LEDS_LED3;\r
-\r
-                               if (LEDStatus & 0x04) // SCROLL Lock\r
-                                 LEDMask |= LEDS_LED4;\r
-\r
-                               /* Set the status LEDs to the current HID LED status */\r
-                               LEDs_SetAllLEDs(LEDMask);\r
+                               /* Read in and process the LED report from the host */\r
+                               Keyboard_ProcessLEDReport(Endpoint_Read_Byte());\r
 \r
                                /* Clear the endpoint data */\r
                                Endpoint_ClearOUT();\r
 \r
                                /* Clear the endpoint data */\r
                                Endpoint_ClearOUT();\r
@@ -206,6 +194,28 @@ void EVENT_USB_Device_UnhandledControlRequest(void)
        }\r
 }\r
 \r
        }\r
 }\r
 \r
+/** Processes a given Keyboard LED report from the host, and sets the board LEDs to match. Since the Keyboard\r
+ *  LED report can be sent through either the control endpoint (via a HID SetReport request) or the HID OUT\r
+ *  endpoint, the processing code is placed here to avoid duplicating it and potentially having different\r
+ *  behaviour depending on the method used to sent it.\r
+ */\r
+void Keyboard_ProcessLEDReport(const uint8_t LEDStatus)\r
+{\r
+       uint8_t LEDMask = LEDS_LED2;\r
+       \r
+       if (LEDStatus & KEYBOARD_LED_NUMLOCK)\r
+         LEDMask |= LEDS_LED1;\r
+       \r
+       if (LEDStatus & KEYBOARD_LED_CAPSLOCK)\r
+         LEDMask |= LEDS_LED3;\r
+\r
+       if (LEDStatus & KEYBOARD_LED_SCROLLLOCK)\r
+         LEDMask |= LEDS_LED4;\r
+\r
+       /* Set the status LEDs to the current Keyboard LED status */\r
+       LEDs_SetAllLEDs(LEDMask);\r
+}\r
+\r
 /** Keyboard task. This generates the next keyboard HID report for the host, and transmits it via the\r
  *  keyboard IN endpoint when the host is ready for more data. Additionally, it processes host LED status\r
  *  reports sent to the device via the keyboard OUT reporting endpoint.\r
 /** Keyboard task. This generates the next keyboard HID report for the host, and transmits it via the\r
  *  keyboard IN endpoint when the host is ready for more data. Additionally, it processes host LED status\r
  *  reports sent to the device via the keyboard OUT reporting endpoint.\r
@@ -221,6 +231,9 @@ void Keyboard_HID_Task(void)
        /* Check if board button is not pressed, if so mouse mode enabled */\r
        if (!(Buttons_GetStatus() & BUTTONS_BUTTON1))\r
        {\r
        /* Check if board button is not pressed, if so mouse mode enabled */\r
        if (!(Buttons_GetStatus() & BUTTONS_BUTTON1))\r
        {\r
+               /* Make sent key uppercase by indicating that the left shift key is pressed */\r
+               KeyboardReportData.Modifier = KEYBOARD_MODIFER_LEFTSHIFT;\r
+\r
                if (JoyStatus_LCL & JOY_UP)\r
                  KeyboardReportData.KeyCode[0] = 0x04; // A\r
                else if (JoyStatus_LCL & JOY_DOWN)\r
                if (JoyStatus_LCL & JOY_UP)\r
                  KeyboardReportData.KeyCode[0] = 0x04; // A\r
                else if (JoyStatus_LCL & JOY_DOWN)\r
@@ -257,21 +270,8 @@ void Keyboard_HID_Task(void)
        /* Check if Keyboard LED Endpoint Ready for Read/Write */\r
        if (Endpoint_IsReadWriteAllowed())\r
        {               \r
        /* Check if Keyboard LED Endpoint Ready for Read/Write */\r
        if (Endpoint_IsReadWriteAllowed())\r
        {               \r
-               /* Read in the LED report from the host */\r
-               uint8_t LEDStatus = Endpoint_Read_Byte();\r
-               uint8_t LEDMask   = LEDS_LED2;\r
-               \r
-               if (LEDStatus & 0x01) // NUM Lock\r
-                 LEDMask |= LEDS_LED1;\r
-               \r
-               if (LEDStatus & 0x02) // CAPS Lock\r
-                 LEDMask |= LEDS_LED3;\r
-\r
-               if (LEDStatus & 0x04) // SCROLL Lock\r
-                 LEDMask |= LEDS_LED4;\r
-\r
-               /* Set the status LEDs to the current Keyboard LED status */\r
-               LEDs_SetAllLEDs(LEDMask);\r
+               /* Read in and process the LED report from the host */\r
+               Keyboard_ProcessLEDReport(Endpoint_Read_Byte());\r
 \r
                /* Handshake the OUT Endpoint - clear endpoint and ready for next report */\r
                Endpoint_ClearOUT();\r
 \r
                /* Handshake the OUT Endpoint - clear endpoint and ready for next report */\r
                Endpoint_ClearOUT();\r