From ee7bd5685e000b3a128069fd75d436c653ab54b2 Mon Sep 17 00:00:00 2001 From: Dean Camera Date: Thu, 19 Mar 2009 15:10:51 +0000 Subject: [PATCH] Ensure that the Keyboard and Mouse demos adhere to the boot protocol specification in that they send a report before the idle period has elapsed if the report data has changed. --- Demos/Keyboard/Keyboard.c | 12 ++++++++---- Demos/Mouse/Mouse.c | 12 ++++++++---- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/Demos/Keyboard/Keyboard.c b/Demos/Keyboard/Keyboard.c index a26f357a1b..d6b254ffb4 100644 --- a/Demos/Keyboard/Keyboard.c +++ b/Demos/Keyboard/Keyboard.c @@ -385,8 +385,9 @@ void ProcessLEDReport(uint8_t LEDReport) /** Sends the next HID report to the host, via the keyboard data endpoint. */ static inline void SendNextReport(void) { - USB_KeyboardReport_Data_t KeyboardReportData; - bool SendReport = true; + 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); @@ -402,11 +403,14 @@ static inline void SendNextReport(void) } else { - /* Idle period not elapsed, indicate that a report must not be sent */ - SendReport = false; + /* Idle period not elapsed, indicate that a report must not be sent unless the report has changed */ + SendReport = (memcmp(&PrevKeyboardReportData, &KeyboardReportData, sizeof(USB_KeyboardReport_Data_t)) != 0); } } + /* Save the current report data for later comparison to check for changes */ + PrevKeyboardReportData = KeyboardReportData; + /* Select the Keyboard Report Endpoint */ Endpoint_SelectEndpoint(KEYBOARD_EPNUM); diff --git a/Demos/Mouse/Mouse.c b/Demos/Mouse/Mouse.c index c4b7f55adb..c066d424a2 100644 --- a/Demos/Mouse/Mouse.c +++ b/Demos/Mouse/Mouse.c @@ -337,8 +337,9 @@ void CreateMouseReport(USB_MouseReport_Data_t* ReportData) /** Sends the next HID report to the host, via the keyboard data endpoint. */ static inline void SendNextReport(void) { - USB_MouseReport_Data_t MouseReportData; - bool SendReport = true; + static USB_MouseReport_Data_t PrevMouseReportData; + USB_MouseReport_Data_t MouseReportData; + bool SendReport = true; /* Create the next mouse report for transmission to the host */ CreateMouseReport(&MouseReportData); @@ -354,10 +355,13 @@ static inline void SendNextReport(void) } else { - /* Idle period not elapsed, indicate that a report must not be sent */ - SendReport = false; + /* Idle period not elapsed, indicate that a report must not be sent unless the report has changed */ + SendReport = (memcmp(&PrevMouseReportData, &MouseReportData, sizeof(USB_MouseReport_Data_t)) != 0); } } + + /* Save the current report data for later comparison to check for changes */ + PrevMouseReportData = MouseReportData; /* Select the Mouse Report Endpoint */ Endpoint_SelectEndpoint(MOUSE_EPNUM);