Add LUFA-side channel open/close routines, add signalling handlers for the creation...
[pub/USBasp.git] / Demos / Device / LowLevel / KeyboardMouse / KeyboardMouse.c
index bfd337a..e41b709 100644 (file)
@@ -1,22 +1,22 @@
 /*\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
          \r
-  Permission to use, copy, modify, and distribute this software\r
-  and its documentation for any purpose and without fee is hereby\r
-  granted, provided that the above copyright notice appear in all\r
-  copies and that both that the copyright notice and this\r
-  permission notice and warranty disclaimer appear in supporting\r
-  documentation, and that the name of the author not be used in\r
-  advertising or publicity pertaining to distribution of the\r
+  Permission to use, copy, modify, distribute, and sell this \r
+  software and its documentation for any purpose is hereby granted\r
+  without fee, provided that the above copyright notice appear in \r
+  all copies and that both that the copyright notice and this\r
+  permission notice and warranty disclaimer appear in supporting \r
+  documentation, and that the name of the author not be used in \r
+  advertising or publicity pertaining to distribution of the \r
   software without specific, written prior permission.\r
 \r
   The author disclaim all warranties with regard to this\r
   software without specific, written prior permission.\r
 \r
   The author disclaim all warranties with regard to this\r
  \r
 #include "KeyboardMouse.h"\r
 \r
  \r
 #include "KeyboardMouse.h"\r
 \r
-/* Global Variables */\r
 /** Global structure to hold the current keyboard interface HID report, for transmission to the host */\r
 USB_KeyboardReport_Data_t KeyboardReportData;\r
 \r
 /** Global structure to hold the current mouse interface HID report, for transmission to the host */\r
 USB_MouseReport_Data_t    MouseReportData;\r
 \r
 /** Global structure to hold the current keyboard interface HID report, for transmission to the host */\r
 USB_KeyboardReport_Data_t KeyboardReportData;\r
 \r
 /** Global structure to hold the current mouse interface HID report, for transmission to the host */\r
 USB_MouseReport_Data_t    MouseReportData;\r
 \r
+\r
 /** Main program entry point. This routine configures the hardware required by the application, then\r
 /** Main program entry point. This routine configures the hardware required by the application, then\r
- *  starts the scheduler to run the USB management task.\r
+ *  enters a loop to run the application tasks in sequence.\r
  */\r
 int main(void)\r
 {\r
  */\r
 int main(void)\r
 {\r
@@ -180,21 +180,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 +193,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 +230,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 +269,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