{\r
Endpoint_ClearSETUP(); \r
\r
- uint8_t ReportINData[HIDInterfaceInfo->Config.ReportINBufferSize];\r
+ uint8_t ReportINData[HID_MAX_REPORT_SIZE];\r
uint16_t ReportINSize;\r
uint8_t ReportID = (USB_ControlRequest.wValue & 0xFF);\r
\r
\r
void HID_Device_USBTask(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo)\r
{\r
+ static uint8_t PreviousReportINData[HID_MAX_REPORT_SIZE];\r
+\r
if (USB_DeviceState != DEVICE_STATE_Configured)\r
return;\r
\r
Endpoint_SelectEndpoint(HIDInterfaceInfo->Config.ReportINEndpointNumber);\r
\r
- if (Endpoint_IsReadWriteAllowed() &&\r
- !(HIDInterfaceInfo->State.IdleCount && HIDInterfaceInfo->State.IdleMSRemaining))\r
+ if (Endpoint_IsReadWriteAllowed())\r
{\r
- if (HIDInterfaceInfo->State.IdleCount && !(HIDInterfaceInfo->State.IdleMSRemaining))\r
- HIDInterfaceInfo->State.IdleMSRemaining = HIDInterfaceInfo->State.IdleCount;\r
-\r
- uint8_t ReportINData[HIDInterfaceInfo->Config.ReportINBufferSize];\r
- uint16_t ReportINSize;\r
+ uint8_t ReportINData[HID_MAX_REPORT_SIZE];\r
uint8_t ReportID = 0;\r
+ uint16_t ReportINSize;\r
\r
memset(ReportINData, 0, sizeof(ReportINData));\r
\r
- ReportINSize = CALLBACK_HID_Device_CreateHIDReport(HIDInterfaceInfo, &ReportID, ReportINData);\r
+ ReportINSize = CALLBACK_HID_Device_CreateHIDReport(HIDInterfaceInfo, &ReportID, ReportINData);\r
\r
- if (ReportINSize)\r
+ bool StatesChanged = (memcmp(ReportINData, PreviousReportINData, ReportINSize) != 0);\r
+ bool IdlePeriodElapsed = (HIDInterfaceInfo->State.IdleCount && !(HIDInterfaceInfo->State.IdleMSRemaining));\r
+ \r
+ memcpy(PreviousReportINData, ReportINData, ReportINSize);\r
+\r
+ if (ReportINSize && (StatesChanged || IdlePeriodElapsed))\r
{\r
+ HIDInterfaceInfo->State.IdleMSRemaining = HIDInterfaceInfo->State.IdleCount;\r
+\r
if (ReportID)\r
Endpoint_Write_Stream_LE(&ReportID, sizeof(ReportID), NO_STREAM_CALLBACK);\r
\r