Update UC3 platform driver support to use the bitmasks defined in the header files...
[pub/USBasp.git] / Demos / Device / LowLevel / Keyboard / Keyboard.c
index b4d4c21..2d5e366 100644 (file)
@@ -1,22 +1,22 @@
 /*
              LUFA Library
-     Copyright (C) Dean Camera, 2010.
-              
+     Copyright (C) Dean Camera, 2011.
+
   dean [at] fourwalledcubicle [dot] com
-      www.fourwalledcubicle.com
+           www.lufa-lib.org
 */
 
 /*
-  Copyright 2010  Dean Camera (dean [at] fourwalledcubicle [dot] com)
+  Copyright 2011  Dean Camera (dean [at] fourwalledcubicle [dot] com)
   Copyright 2010  Denver Gingerich (denver [at] ossguy [dot] com)
 
-  Permission to use, copy, modify, distribute, and sell this 
+  Permission to use, copy, modify, distribute, and sell this
   software and its documentation for any purpose is hereby granted
-  without fee, provided that the above copyright notice appear in 
+  without fee, provided that the above copyright notice appear in
   all copies and that both that the copyright notice and this
-  permission notice and warranty disclaimer appear in supporting 
-  documentation, and that the name of the author not be used in 
-  advertising or publicity pertaining to distribution of the 
+  permission notice and warranty disclaimer appear in supporting
+  documentation, and that the name of the author not be used in
+  advertising or publicity pertaining to distribution of the
   software without specific, written prior permission.
 
   The author disclaim all warranties with regard to this
  *  Main source file for the Keyboard demo. This file contains the main tasks of the demo and
  *  is responsible for the initial application hardware configuration.
  */
+
 #include "Keyboard.h"
 
 /** Indicates what report mode the host has requested, true for normal HID reporting mode, false for special boot
  *  protocol reporting mode.
  */
-bool UsingReportProtocol = true;
+static bool UsingReportProtocol = true;
 
 /** Current Idle period. This is set by the host via a Set Idle HID class request to silence the device's reports
  *  for either the entire idle duration, or until the report status changes (e.g. the user presses a key).
  */
-uint16_t IdleCount = 500;
+static uint16_t IdleCount = 500;
 
 /** Current Idle period remaining. When the IdleCount value is set, this tracks the remaining number of idle
- *  milliseconds. This is separate to the IdleCount timer and is incremented and compared as the host may request 
+ *  milliseconds. This is separate to the IdleCount timer and is incremented and compared as the host may request
  *  the current idle period via a Get Idle HID class request, thus its value must be preserved.
  */
-uint16_t IdleMSRemaining = 0;
+static uint16_t IdleMSRemaining = 0;
 
 
 /** Main program entry point. This routine configures the hardware required by the application, then
@@ -60,7 +60,7 @@ uint16_t IdleMSRemaining = 0;
 int main(void)
 {
        SetupHardware();
-       
+
        LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
        sei();
 
@@ -113,7 +113,7 @@ void EVENT_USB_Device_Disconnect(void)
  *  of the USB device after enumeration, and configures the keyboard device endpoints.
  */
 void EVENT_USB_Device_ConfigurationChanged(void)
-{      
+{
        bool ConfigSuccess = true;
 
        /* Setup HID Report Endpoints */
@@ -122,23 +122,23 @@ void EVENT_USB_Device_ConfigurationChanged(void)
        ConfigSuccess &= Endpoint_ConfigureEndpoint(KEYBOARD_OUT_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_OUT,
                                                    KEYBOARD_EPSIZE, ENDPOINT_BANK_SINGLE);
 
-       /* Turn on Start-of-Frame events for tracking HID report period exiry */
+       /* Turn on Start-of-Frame events for tracking HID report period expiry */
        USB_Device_EnableSOFEvents();
 
        /* Indicate endpoint configuration success or failure */
-       LEDs_SetAllLEDs(ConfigSuccess ? LEDMASK_USB_READY : LEDMASK_USB_ERROR); 
+       LEDs_SetAllLEDs(ConfigSuccess ? LEDMASK_USB_READY : LEDMASK_USB_ERROR);
 }
 
-/** Event handler for the USB_UnhandledControlRequest event. This is used to catch standard and class specific
- *  control requests that are not handled internally by the USB library (including the HID commands, which are
- *  all issued via the control endpoint), so that they can be handled appropriately for the application.
+/** Event handler for the USB_ControlRequest event. This is used to catch and process control requests sent to
+ *  the device from the USB host before passing along unhandled control requests to the library for processing
+ *  internally.
  */
-void EVENT_USB_Device_UnhandledControlRequest(void)
+void EVENT_USB_Device_ControlRequest(void)
 {
        /* Handle HID Class specific requests */
        switch (USB_ControlRequest.bRequest)
        {
-               case REQ_GetReport:
+               case HID_REQ_GetReport:
                        if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
                        {
                                USB_KeyboardReport_Data_t KeyboardReportData;
@@ -152,13 +152,13 @@ void EVENT_USB_Device_UnhandledControlRequest(void)
                                Endpoint_Write_Control_Stream_LE(&KeyboardReportData, sizeof(KeyboardReportData));
                                Endpoint_ClearOUT();
                        }
-               
+
                        break;
-               case REQ_SetReport:
+               case HID_REQ_SetReport:
                        if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
                        {
                                Endpoint_ClearSETUP();
-                               
+
                                /* Wait until the LED report has been sent by the host */
                                while (!(Endpoint_IsOUTReceived()))
                                {
@@ -167,7 +167,7 @@ void EVENT_USB_Device_UnhandledControlRequest(void)
                                }
 
                                /* Read in the LED report from the host */
-                               uint8_t LEDStatus = Endpoint_Read_Byte();
+                               uint8_t LEDStatus = Endpoint_Read_8();
 
                                Endpoint_ClearOUT();
                                Endpoint_ClearStatusStage();
@@ -175,22 +175,22 @@ void EVENT_USB_Device_UnhandledControlRequest(void)
                                /* Process the incoming LED report */
                                ProcessLEDReport(LEDStatus);
                        }
-                       
+
                        break;
-               case REQ_GetProtocol:
+               case HID_REQ_GetProtocol:
                        if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
                        {
                                Endpoint_ClearSETUP();
-                               
+
                                /* Write the current protocol flag to the host */
-                               Endpoint_Write_Byte(UsingReportProtocol);
+                               Endpoint_Write_8(UsingReportProtocol);
 
                                Endpoint_ClearIN();
                                Endpoint_ClearStatusStage();
                        }
-                       
+
                        break;
-               case REQ_SetProtocol:
+               case HID_REQ_SetProtocol:
                        if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
                        {
                                Endpoint_ClearSETUP();
@@ -199,26 +199,26 @@ void EVENT_USB_Device_UnhandledControlRequest(void)
                                /* Set or clear the flag depending on what the host indicates that the current Protocol should be */
                                UsingReportProtocol = (USB_ControlRequest.wValue != 0);
                        }
-                       
+
                        break;
-               case REQ_SetIdle:
+               case HID_REQ_SetIdle:
                        if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
                        {
-                               Endpoint_ClearSETUP();                          
+                               Endpoint_ClearSETUP();
                                Endpoint_ClearStatusStage();
 
                                /* Get idle period in MSB, IdleCount must be multiplied by 4 to get number of milliseconds */
                                IdleCount = ((USB_ControlRequest.wValue & 0xFF00) >> 6);
                        }
-                       
+
                        break;
-               case REQ_GetIdle:
+               case HID_REQ_GetIdle:
                        if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
-                       {               
+                       {
                                Endpoint_ClearSETUP();
-                               
+
                                /* Write the current idle duration to the host, must be divided by 4 before sent to host */
-                               Endpoint_Write_Byte(IdleCount >> 2);                            
+                               Endpoint_Write_8(IdleCount >> 2);
 
                                Endpoint_ClearIN();
                                Endpoint_ClearStatusStage();
@@ -249,25 +249,25 @@ void CreateKeyboardReport(USB_KeyboardReport_Data_t* const ReportData)
 
        /* Clear the report contents */
        memset(ReportData, 0, sizeof(USB_KeyboardReport_Data_t));
-       
+
        /* Make sent key uppercase by indicating that the left shift key is pressed */
-       ReportData->Modifier = KEYBOARD_MODIFER_LEFTSHIFT;
-       
+       ReportData->Modifier = HID_KEYBOARD_MODIFER_LEFTSHIFT;
+
        if (JoyStatus_LCL & JOY_UP)
-         ReportData->KeyCode[UsedKeyCodes++] = 0x04; // A
+         ReportData->KeyCode[UsedKeyCodes++] = HID_KEYBOARD_SC_A;
        else if (JoyStatus_LCL & JOY_DOWN)
-         ReportData->KeyCode[UsedKeyCodes++] = 0x05; // B
+         ReportData->KeyCode[UsedKeyCodes++] = HID_KEYBOARD_SC_B;
 
        if (JoyStatus_LCL & JOY_LEFT)
-         ReportData->KeyCode[UsedKeyCodes++] = 0x06; // C
+         ReportData->KeyCode[UsedKeyCodes++] = HID_KEYBOARD_SC_C;
        else if (JoyStatus_LCL & JOY_RIGHT)
-         ReportData->KeyCode[UsedKeyCodes++] = 0x07; // D
+         ReportData->KeyCode[UsedKeyCodes++] = HID_KEYBOARD_SC_D;
 
        if (JoyStatus_LCL & JOY_PRESS)
-         ReportData->KeyCode[UsedKeyCodes++] = 0x08; // E
-         
+         ReportData->KeyCode[UsedKeyCodes++] = HID_KEYBOARD_SC_E;
+
        if (ButtonStatus_LCL & BUTTONS_BUTTON1)
-         ReportData->KeyCode[UsedKeyCodes++] = 0x09; // F
+         ReportData->KeyCode[UsedKeyCodes++] = HID_KEYBOARD_SC_F;
 }
 
 /** Processes a received LED report, and updates the board LEDs states to match.
@@ -277,14 +277,14 @@ void CreateKeyboardReport(USB_KeyboardReport_Data_t* const ReportData)
 void ProcessLEDReport(const uint8_t LEDReport)
 {
        uint8_t LEDMask = LEDS_LED2;
-       
-       if (LEDReport & KEYBOARD_LED_NUMLOCK)
+
+       if (LEDReport & HID_KEYBOARD_LED_NUMLOCK)
          LEDMask |= LEDS_LED1;
-       
-       if (LEDReport & KEYBOARD_LED_CAPSLOCK)
+
+       if (LEDReport & HID_KEYBOARD_LED_CAPSLOCK)
          LEDMask |= LEDS_LED3;
 
-       if (LEDReport & KEYBOARD_LED_SCROLLLOCK)
+       if (LEDReport & HID_KEYBOARD_LED_SCROLLLOCK)
          LEDMask |= LEDS_LED4;
 
        /* Set the status LEDs to the current Keyboard LED status */
@@ -297,23 +297,23 @@ void SendNextReport(void)
        static USB_KeyboardReport_Data_t PrevKeyboardReportData;
        USB_KeyboardReport_Data_t        KeyboardReportData;
        bool                             SendReport = true;
-       
+
        /* Create the next keyboard report for transmission to the host */
        CreateKeyboardReport(&KeyboardReportData);
-       
+
        /* Check to see if the report data has changed - if so a report MUST be sent */
        SendReport = (memcmp(&PrevKeyboardReportData, &KeyboardReportData, sizeof(USB_KeyboardReport_Data_t)) != 0);
-       
+
        /* Check if the idle period is set and has elapsed */
-       if ((IdleCount != HID_IDLE_CHANGESONLY) && (!(IdleMSRemaining)))
+       if (IdleCount && (!(IdleMSRemaining)))
        {
                /* Reset the idle time remaining counter */
                IdleMSRemaining = IdleCount;
-               
+
                /* Idle period is set and has elapsed, must send a report to the host */
                SendReport = true;
        }
-       
+
        /* Select the Keyboard Report Endpoint */
        Endpoint_SelectEndpoint(KEYBOARD_IN_EPNUM);
 
@@ -322,10 +322,10 @@ void SendNextReport(void)
        {
                /* Save the current report data for later comparison to check for changes */
                PrevKeyboardReportData = KeyboardReportData;
-       
+
                /* Write Keyboard Report Data */
-               Endpoint_Write_Stream_LE(&KeyboardReportData, sizeof(KeyboardReportData));
-               
+               Endpoint_Write_Stream_LE(&KeyboardReportData, sizeof(KeyboardReportData), NULL);
+
                /* Finalize the stream transfer to send the last packet */
                Endpoint_ClearIN();
        }
@@ -344,7 +344,7 @@ void ReceiveNextReport(void)
                if (Endpoint_IsReadWriteAllowed())
                {
                        /* Read in the LED report from the host */
-                       uint8_t LEDReport = Endpoint_Read_Byte();
+                       uint8_t LEDReport = Endpoint_Read_8();
 
                        /* Process the read LED report from the host */
                        ProcessLEDReport(LEDReport);
@@ -361,10 +361,11 @@ void HID_Task(void)
        /* Device must be connected and configured for the task to run */
        if (USB_DeviceState != DEVICE_STATE_Configured)
          return;
-         
+
        /* Send the next keypress report to the host */
        SendNextReport();
-               
+
        /* Process the LED report sent from the host */
        ReceiveNextReport();
 }
+