From 7df6b9563c7aed504b34f42bc46d01e051051bdd Mon Sep 17 00:00:00 2001
From: Dean Camera <dean@fourwalledcubicle.com>
Date: Thu, 30 Jul 2009 14:59:57 +0000
Subject: [PATCH] Add new HID_Device_MillisecondElapsed() function to the HID
 device Class driver, to move the burden of managing the Idle period of each
 instance to the library and not the user application.

---
 Demos/Device/ClassDriver/DualCDC/DualCDC.c         |  5 -----
 Demos/Device/ClassDriver/GenericHID/GenericHID.c   |  3 +--
 Demos/Device/ClassDriver/Joystick/Joystick.c       |  3 +--
 Demos/Device/ClassDriver/Keyboard/Keyboard.c       |  3 +--
 .../ClassDriver/KeyboardMouse/KeyboardMouse.c      | 14 +++-----------
 Demos/Device/ClassDriver/Mouse/Mouse.c             |  3 +--
 LUFA/Drivers/USB/Class/Device/HID.c                |  6 ++++++
 LUFA/Drivers/USB/Class/Device/HID.h                |  7 +++++++
 Projects/Magstripe/Magstripe.c                     |  3 +--
 9 files changed, 21 insertions(+), 26 deletions(-)

diff --git a/Demos/Device/ClassDriver/DualCDC/DualCDC.c b/Demos/Device/ClassDriver/DualCDC/DualCDC.c
index 9e3217cf7..82ed59d51 100644
--- a/Demos/Device/ClassDriver/DualCDC/DualCDC.c
+++ b/Demos/Device/ClassDriver/DualCDC/DualCDC.c
@@ -78,11 +78,6 @@ USB_ClassInfo_CDC_Device_t VirtualSerial2_CDC_Interface =
 				.NotificationEndpointNumber = CDC2_NOTIFICATION_EPNUM,
 				.NotificationEndpointSize   = CDC_NOTIFICATION_EPSIZE,
 			},
-			
-		.State =
-			{
-				// Leave all state values to their defaults
-			}
 	};
 
 /** Main program entry point. This routine contains the overall program flow, including initial
diff --git a/Demos/Device/ClassDriver/GenericHID/GenericHID.c b/Demos/Device/ClassDriver/GenericHID/GenericHID.c
index b04f7af76..4315723f4 100644
--- a/Demos/Device/ClassDriver/GenericHID/GenericHID.c
+++ b/Demos/Device/ClassDriver/GenericHID/GenericHID.c
@@ -118,8 +118,7 @@ void EVENT_USB_UnhandledControlPacket(void)
 /** ISR to keep track of each millisecond interrupt, for determining the HID class idle period remaining when set. */
 ISR(TIMER0_COMPA_vect, ISR_BLOCK)
 {
-	if (Generic_HID_Interface.State.IdleMSRemaining)
-	  Generic_HID_Interface.State.IdleMSRemaining--;
+	HID_Device_MillisecondElapsed(&Generic_HID_Interface);
 }
 
 /** HID class driver callback function for the creation of HID reports to the host.
diff --git a/Demos/Device/ClassDriver/Joystick/Joystick.c b/Demos/Device/ClassDriver/Joystick/Joystick.c
index d9ff6ca91..ffd167ef5 100644
--- a/Demos/Device/ClassDriver/Joystick/Joystick.c
+++ b/Demos/Device/ClassDriver/Joystick/Joystick.c
@@ -120,8 +120,7 @@ void EVENT_USB_UnhandledControlPacket(void)
 /** ISR to keep track of each millisecond interrupt, for determining the HID class idle period remaining when set. */
 ISR(TIMER0_COMPA_vect, ISR_BLOCK)
 {
-	if (Joystick_HID_Interface.State.IdleMSRemaining)
-	  Joystick_HID_Interface.State.IdleMSRemaining--;
+	HID_Device_MillisecondElapsed(&Joystick_HID_Interface);
 }
 
 /** HID class driver callback function for the creation of HID reports to the host.
diff --git a/Demos/Device/ClassDriver/Keyboard/Keyboard.c b/Demos/Device/ClassDriver/Keyboard/Keyboard.c
index cd8c3e69e..fb19d02d9 100644
--- a/Demos/Device/ClassDriver/Keyboard/Keyboard.c
+++ b/Demos/Device/ClassDriver/Keyboard/Keyboard.c
@@ -121,8 +121,7 @@ void EVENT_USB_UnhandledControlPacket(void)
 /** ISR to keep track of each millisecond interrupt, for determining the HID class idle period remaining when set. */
 ISR(TIMER0_COMPA_vect, ISR_BLOCK)
 {
-	if (Keyboard_HID_Interface.State.IdleMSRemaining)
-	  Keyboard_HID_Interface.State.IdleMSRemaining--;
+	HID_Device_MillisecondElapsed(&Keyboard_HID_Interface);
 }
 
 /** HID class driver callback function for the creation of HID reports to the host.
diff --git a/Demos/Device/ClassDriver/KeyboardMouse/KeyboardMouse.c b/Demos/Device/ClassDriver/KeyboardMouse/KeyboardMouse.c
index 45a2c5270..418ccba4e 100644
--- a/Demos/Device/ClassDriver/KeyboardMouse/KeyboardMouse.c
+++ b/Demos/Device/ClassDriver/KeyboardMouse/KeyboardMouse.c
@@ -66,12 +66,7 @@ USB_ClassInfo_HID_Device_t Mouse_HID_Interface =
 
 				.ReportINEndpointNumber  = MOUSE_IN_EPNUM,
 				.ReportINEndpointSize    = HID_EPSIZE,
-			},
-			
-		.State =
-			{
-				// Leave all state values to their defaults
-			}			
+			},		
 	};
 
 /** Main program entry point. This routine contains the overall program flow, including initial
@@ -147,11 +142,8 @@ void EVENT_USB_UnhandledControlPacket(void)
 /** ISR to keep track of each millisecond interrupt, for determining the HID class idle period remaining when set. */
 ISR(TIMER0_COMPA_vect, ISR_BLOCK)
 {
-	if (Keyboard_HID_Interface.State.IdleMSRemaining)
-	  Keyboard_HID_Interface.State.IdleMSRemaining--;
-
-	if (Mouse_HID_Interface.State.IdleMSRemaining)
-	  Mouse_HID_Interface.State.IdleMSRemaining--;
+	HID_Device_MillisecondElapsed(&Keyboard_HID_Interface);
+	HID_Device_MillisecondElapsed(&Mouse_HID_Interface);
 }
 
 /** HID class driver callback function for the creation of HID reports to the host.
diff --git a/Demos/Device/ClassDriver/Mouse/Mouse.c b/Demos/Device/ClassDriver/Mouse/Mouse.c
index 44894340b..51021c0f5 100644
--- a/Demos/Device/ClassDriver/Mouse/Mouse.c
+++ b/Demos/Device/ClassDriver/Mouse/Mouse.c
@@ -120,8 +120,7 @@ void EVENT_USB_UnhandledControlPacket(void)
 /** ISR to keep track of each millisecond interrupt, for determining the HID class idle period remaining when set. */
 ISR(TIMER0_COMPA_vect, ISR_BLOCK)
 {
-	if (Mouse_HID_Interface.State.IdleMSRemaining)
-	  Mouse_HID_Interface.State.IdleMSRemaining--;
+	HID_Device_MillisecondElapsed(&Mouse_HID_Interface);
 }
 
 /** HID class driver callback function for the creation of HID reports to the host.
diff --git a/LUFA/Drivers/USB/Class/Device/HID.c b/LUFA/Drivers/USB/Class/Device/HID.c
index bfe97ffbb..eef15f26c 100644
--- a/LUFA/Drivers/USB/Class/Device/HID.c
+++ b/LUFA/Drivers/USB/Class/Device/HID.c
@@ -184,4 +184,10 @@ void HID_Device_USBTask(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo)
 	}
 }
 
+void HID_Device_MillisecondElapsed(USB_ClassInfo_HID_Device_t* HIDInterfaceInfo)
+{
+	if (HIDInterfaceInfo->State.IdleMSRemaining)
+	  HIDInterfaceInfo->State.IdleMSRemaining--;
+}
+
 #endif
diff --git a/LUFA/Drivers/USB/Class/Device/HID.h b/LUFA/Drivers/USB/Class/Device/HID.h
index ae68134fe..06456cf8a 100644
--- a/LUFA/Drivers/USB/Class/Device/HID.h
+++ b/LUFA/Drivers/USB/Class/Device/HID.h
@@ -121,6 +121,13 @@
 			 */
 			void HID_Device_USBTask(USB_ClassInfo_HID_Device_t* HIDInterfaceInfo);
 			
+			/** Indicates that a millisecond of idle time has elapsed on the given HID interface, and the interface's idle count should be
+			 *  decremented. This should be called once per millisecond so that hardware key-repeats function correctly.
+			 *
+			 *  \param[in,out] HIDInterfaceInfo  Pointer to a structure containing a HID Class configuration and state.
+			 */
+			void HID_Device_MillisecondElapsed(USB_ClassInfo_HID_Device_t* HIDInterfaceInfo);
+			
 			/** HID class driver callback for the user creation of a HID input report. This callback may fire in response to either
 			 *  HID class control requests from the host, or by the normal HID endpoint polling procedure. Inside this callback the
 			 *  user is responsible for the creation of the next HID input report to be sent to the host.
diff --git a/Projects/Magstripe/Magstripe.c b/Projects/Magstripe/Magstripe.c
index 898ad3c39..6d463d6a8 100644
--- a/Projects/Magstripe/Magstripe.c
+++ b/Projects/Magstripe/Magstripe.c
@@ -153,8 +153,7 @@ void EVENT_USB_UnhandledControlPacket(void)
 /** Timer 0 CTC ISR, firing once each millisecond to keep track of elapsed idle time in the HID interface. */
 ISR(TIMER0_COMPA_vect, ISR_BLOCK)
 {
-	if (Keyboard_HID_Interface.State.IdleMSRemaining)
-	  Keyboard_HID_Interface.State.IdleMSRemaining--;
+	HID_Device_MillisecondElapsed(&Keyboard_HID_Interface);
 }
 
 /** HID Class driver callback function for the creation of a HID report for the host.
-- 
GitLab