Add tag for the 120219 release.
[pub/USBasp.git] / Demos / Device / LowLevel / Mouse / Mouse.c
index 1cc6d88..98da9be 100644 (file)
@@ -1,21 +1,21 @@
 /*
              LUFA Library
-     Copyright (C) Dean Camera, 2010.
-              
+     Copyright (C) Dean Camera, 2012.
+
   dean [at] fourwalledcubicle [dot] com
-      www.fourwalledcubicle.com
+           www.lufa-lib.org
 */
 
 /*
-  Copyright 2010  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 
+  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 Mouse demo. This file contains the main tasks of the demo and
  *  is responsible for the initial application hardware configuration.
  */
+
 #include "Mouse.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 moves the mouse).
  */
-uint16_t IdleCount = HID_IDLE_CHANGESONLY;
+static uint16_t IdleCount = 0;
 
 /** 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
@@ -59,7 +59,7 @@ uint16_t IdleMSRemaining = 0;
 int main(void)
 {
        SetupHardware();
-       
+
        LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
        sei();
 
@@ -110,7 +110,7 @@ void EVENT_USB_Device_Disconnect(void)
 
 /** Event handler for the USB_ConfigurationChanged event. This is fired when the host sets the current configuration
  *  of the USB device after enumeration - the device endpoints are configured and the mouse reporting task started.
- */ 
+ */
 void EVENT_USB_Device_ConfigurationChanged(void)
 {
        bool ConfigSuccess = true;
@@ -119,93 +119,85 @@ void EVENT_USB_Device_ConfigurationChanged(void)
        ConfigSuccess &= Endpoint_ConfigureEndpoint(MOUSE_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN,
                                                    MOUSE_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_MouseReport_Data_t MouseReportData;
 
-                               Endpoint_ClearSETUP();
-
                                /* Create the next mouse report for transmission to the host */
                                CreateMouseReport(&MouseReportData);
-       
+
+                               Endpoint_ClearSETUP();
+
                                /* Write the report data to the control endpoint */
                                Endpoint_Write_Control_Stream_LE(&MouseReportData, sizeof(MouseReportData));
-                               
+                               Endpoint_ClearOUT();
+
                                /* Clear the report data afterwards */
                                memset(&MouseReportData, 0, sizeof(MouseReportData));
-
-                               /* Finalize the stream transfer to send the last packet or clear the host abort */
-                               Endpoint_ClearOUT();
                        }
-               
+
                        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);
-                               
-                               /* Send the flag to the host */
-                               Endpoint_ClearIN();
+                               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();
-                               
+                               Endpoint_ClearStatusStage();
+
                                /* Set or clear the flag depending on what the host indicates that the current Protocol should be */
                                UsingReportProtocol = (USB_ControlRequest.wValue != 0);
-                               
-                               Endpoint_ClearStatusStage();
                        }
-                       
+
                        break;
-               case REQ_SetIdle:
+               case HID_REQ_SetIdle:
                        if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
                        {
                                Endpoint_ClearSETUP();
-                               
+                               Endpoint_ClearStatusStage();
+
                                /* Get idle period in MSB, must multiply by 4 to get the duration in milliseconds */
                                IdleCount = ((USB_ControlRequest.wValue & 0xFF00) >> 6);
-                               
-                               Endpoint_ClearStatusStage();
                        }
-                       
+
                        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);
-                               
-                               /* Send the flag to the host */
-                               Endpoint_ClearIN();
+                               Endpoint_Write_8(IdleCount >> 2);
 
+                               Endpoint_ClearIN();
                                Endpoint_ClearStatusStage();
                        }
 
@@ -229,7 +221,7 @@ void CreateMouseReport(USB_MouseReport_Data_t* const ReportData)
 {
        uint8_t JoyStatus_LCL    = Joystick_GetStatus();
        uint8_t ButtonStatus_LCL = Buttons_GetStatus();
-       
+
        /* Clear the report contents */
        memset(ReportData, 0, sizeof(USB_MouseReport_Data_t));
 
@@ -241,11 +233,11 @@ void CreateMouseReport(USB_MouseReport_Data_t* const ReportData)
        if (JoyStatus_LCL & JOY_LEFT)
          ReportData->X = -1;
        else if (JoyStatus_LCL & JOY_RIGHT)
-         ReportData->X = 1;
+         ReportData->X =  1;
 
        if (JoyStatus_LCL & JOY_PRESS)
-         ReportData->Button  = (1 << 0);
-         
+         ReportData->Button |= (1 << 0);
+
        if (ButtonStatus_LCL & BUTTONS_BUTTON1)
          ReportData->Button |= (1 << 1);
 }
@@ -256,40 +248,40 @@ void SendNextReport(void)
        static USB_MouseReport_Data_t PrevMouseReportData;
        USB_MouseReport_Data_t        MouseReportData;
        bool                          SendReport;
-       
+
        /* Create the next mouse report for transmission to the host */
        CreateMouseReport(&MouseReportData);
-       
+
        /* Check to see if the report data has changed - if so a report MUST be sent */
        SendReport = (memcmp(&PrevMouseReportData, &MouseReportData, sizeof(USB_MouseReport_Data_t)) != 0);
-       
+
        /* Override the check if the Y or X values are non-zero - we want continuous movement while the joystick
         * is being held down (via continuous reports), otherwise the cursor will only move once per joystick toggle */
        if ((MouseReportData.Y != 0) || (MouseReportData.X != 0))
          SendReport = true;
-       
+
        /* 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 Mouse Report Endpoint */
        Endpoint_SelectEndpoint(MOUSE_EPNUM);
 
        /* Check if Mouse Endpoint Ready for Read/Write and if we should send a new report */
        if (Endpoint_IsReadWriteAllowed() && SendReport)
-       {       
+       {
                /* Save the current report data for later comparison to check for changes */
                PrevMouseReportData = MouseReportData;
 
                /* Write Mouse Report Data */
-               Endpoint_Write_Stream_LE(&MouseReportData, sizeof(MouseReportData));
-               
+               Endpoint_Write_Stream_LE(&MouseReportData, sizeof(MouseReportData), NULL);
+
                /* Finalize the stream transfer to send the last packet */
                Endpoint_ClearIN();
        }
@@ -301,7 +293,8 @@ void Mouse_Task(void)
        /* Device must be connected and configured for the task to run */
        if (USB_DeviceState != DEVICE_STATE_Configured)
          return;
-         
+
        /* Send the next mouse report to the host */
        SendNextReport();
 }
+