From d6543dee0d2723ee9f09137116264f123433b1a3 Mon Sep 17 00:00:00 2001
From: Dean Camera <dean@fourwalledcubicle.com>
Date: Thu, 16 Jul 2009 15:00:10 +0000
Subject: [PATCH] Minor updates to the Magstripe and MissileLauncher projects
 to fix bugs and improve performance.
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Fixed error in GenericHID descriptors preventing it from passing the USB-IF HID tests (thanks to Søren Greiner).
---
 Demos/Device/ClassDriver/GenericHID/Descriptors.c |  4 ++--
 LUFA/ManPages/ChangeLog.txt                       |  1 +
 Projects/Magstripe/Descriptors.c                  |  2 +-
 Projects/Magstripe/Magstripe.c                    | 10 ++++++----
 Projects/Magstripe/Magstripe.h                    |  3 +++
 Projects/MissileLauncher/MissileLauncher.c        |  5 +++--
 6 files changed, 16 insertions(+), 9 deletions(-)

diff --git a/Demos/Device/ClassDriver/GenericHID/Descriptors.c b/Demos/Device/ClassDriver/GenericHID/Descriptors.c
index 0ce3c560e..abc360bf6 100644
--- a/Demos/Device/ClassDriver/GenericHID/Descriptors.c
+++ b/Demos/Device/ClassDriver/GenericHID/Descriptors.c
@@ -51,8 +51,8 @@ USB_Descriptor_HIDReport_Datatype_t PROGMEM GenericReport[] =
 	0x09, 0x02,           /*   Usage (Vendor Defined)                        */
 	0x75, 0x08,           /*   Report Size (8)                               */
 	0x95, GENERIC_REPORT_SIZE, /*   Report Count (GENERIC_REPORT_SIZE)       */
-	0x15, 0x00,           /*   Logical Minimum (0)                           */
-	0x25, 0xff,           /*   Logical Maximum (255)                         */
+	0x15, 0x80,           /*   Logical Minimum (-128)                        */
+	0x25, 0x7F,           /*   Logical Maximum (127)                         */
 	0x81, 0x02,           /*   Input (Data, Variable, Absolute)              */
 	0x09, 0x03,           /*   Usage (Vendor Defined)                        */
 	0x75, 0x08,           /*   Report Size (8)                               */
diff --git a/LUFA/ManPages/ChangeLog.txt b/LUFA/ManPages/ChangeLog.txt
index cbe4c59ea..c2b7d5edb 100644
--- a/LUFA/ManPages/ChangeLog.txt
+++ b/LUFA/ManPages/ChangeLog.txt
@@ -60,6 +60,7 @@
   *  - Fixed USB Pad regulator not being disabled on some AVR models when the USB_OPT_REG_DISABLED option is used
   *  - Fixed Host mode to Device mode UID change not causing a USB Disconnect event when a device was connected
   *  - Fixed Mouse/Keyboard demos not performing the correct arithmetic on the Idle period at the right times (thanks to Brian Dickman)
+  *  - Fixed GenericHID failing HID class tests due to incorrect Logical Minimum and Logical Maximum values (thanks to S�ren Greiner)
   *
   *
   *  \section Sec_ChangeLog090605 Version 090605
diff --git a/Projects/Magstripe/Descriptors.c b/Projects/Magstripe/Descriptors.c
index de704ae15..68c98ed34 100644
--- a/Projects/Magstripe/Descriptors.c
+++ b/Projects/Magstripe/Descriptors.c
@@ -154,7 +154,7 @@ USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
 			.EndpointAddress        = (ENDPOINT_DESCRIPTOR_DIR_IN | KEYBOARD_EPNUM),
 			.Attributes             = EP_TYPE_INTERRUPT,
 			.EndpointSize           = KEYBOARD_EPSIZE,
-			.PollingIntervalMS      = 0x04
+			.PollingIntervalMS      = 0x01
 		},
 };
 
diff --git a/Projects/Magstripe/Magstripe.c b/Projects/Magstripe/Magstripe.c
index 95c81f342..1151735bd 100644
--- a/Projects/Magstripe/Magstripe.c
+++ b/Projects/Magstripe/Magstripe.c
@@ -130,6 +130,7 @@ void ReadMagstripeData(void)
 			bool ClockPinLevel     = ((Magstripe_LCL & TrackInfo[Track].ClockMask) != 0);
 			bool ClockLevelChanged = (((Magstripe_LCL ^ Magstripe_Prev) & TrackInfo[Track].ClockMask) != 0);
 		
+			/* Sample on rising clock edges */
 			if (ClockPinLevel && ClockLevelChanged)
 			  BitBuffer_StoreNextBit(&TrackDataBuffers[Track], DataPinLevel);
 		}
@@ -171,15 +172,15 @@ uint16_t CALLBACK_HID_Device_CreateHIDReport(USB_ClassInfo_HID_Device_t* const H
 	static bool IsKeyReleaseReport;
 	static bool IsNewlineReport;
 
-	BitBuffer_t*               Buffer         = NULL;
 	USB_KeyboardReport_Data_t* KeyboardReport = (USB_KeyboardReport_Data_t*)ReportData;
+	BitBuffer_t*               Buffer         = NULL;
 	
-	/* Key reports must be interleaved with 0 Key Code reports to release the keys, or repeated keys will be ignored */
+	/* Key reports must be interleaved with key release reports, or repeated keys will be ignored */
 	IsKeyReleaseReport = !IsKeyReleaseReport;	
 
 	if (IsKeyReleaseReport)
 	{
-		KeyboardReport->KeyCode = 0;
+		KeyboardReport->KeyCode = KEY_NONE;
 	}
 	else if (IsNewlineReport)
 	{
@@ -188,6 +189,7 @@ uint16_t CALLBACK_HID_Device_CreateHIDReport(USB_ClassInfo_HID_Device_t* const H
 	}
 	else
 	{
+		/* Read out tracks in ascending order - when each track buffer is empty, progress to next buffer */
 		if (TrackDataBuffers[0].Elements)
 		  Buffer = &TrackDataBuffers[0];
 		else if (TrackDataBuffers[1].Elements)
@@ -199,7 +201,7 @@ uint16_t CALLBACK_HID_Device_CreateHIDReport(USB_ClassInfo_HID_Device_t* const H
 
 		KeyboardReport->KeyCode = BitBuffer_GetNextBit(Buffer) ? KEY_1 : KEY_0;
 		
-		/* If buffer now empty, next report must be a newline to seperate track data */
+		/* If current track buffer now empty, next report must be a newline to seperate track data */
 		if (!(Buffer->Elements))
 		  IsNewlineReport = true;
 	}
diff --git a/Projects/Magstripe/Magstripe.h b/Projects/Magstripe/Magstripe.h
index 1009e32e8..93e593e7c 100644
--- a/Projects/Magstripe/Magstripe.h
+++ b/Projects/Magstripe/Magstripe.h
@@ -51,6 +51,9 @@
 		#include <LUFA/Drivers/USB/Class/HID.h>
 
 	/* Macros: */
+		/** HID keyboard keycode to indicate that no is currently pressed. */
+		#define KEY_NONE           0
+	
 		/** HID keyboard keycode to indicate that the "1" key is currently pressed. */
 		#define KEY_1              30
 
diff --git a/Projects/MissileLauncher/MissileLauncher.c b/Projects/MissileLauncher/MissileLauncher.c
index 046c132f0..88902cf2e 100644
--- a/Projects/MissileLauncher/MissileLauncher.c
+++ b/Projects/MissileLauncher/MissileLauncher.c
@@ -137,8 +137,9 @@ void SetupHardware(void)
 void Read_Joystick_Status(void)
 {
 	uint8_t JoyStatus_LCL = Joystick_GetStatus();
+	uint8_t Buttons_LCL   = Buttons_GetStatus();
 
-	if (BUTTONS_BUTTON1 && Buttons_GetStatus())
+	if (Buttons_LCL & BUTTONS_BUTTON1)
 	  Send_Command(CMD_FIRE);
 	else if (JoyStatus_LCL & JOY_UP)
 	  Send_Command(CMD_UP);
@@ -285,7 +286,7 @@ void WriteNextReport(uint8_t* ReportOUTData, uint16_t ReportLength)
 		/* Class specific request to send a HID report to the device */
 		USB_ControlRequest = (USB_Request_Header_t)
 			{
-				.bmRequestType = 0x21,
+				.bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE),
 				.bRequest      = 0x09,
 				.wValue        = 0x02,
 				.wIndex        = 0x01,
-- 
GitLab