-/*\r
- LUFA Library\r
- Copyright (C) Dean Camera, 2010.\r
- \r
- dean [at] fourwalledcubicle [dot] com\r
- www.fourwalledcubicle.com\r
-*/\r
-\r
-/*\r
- Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com)\r
-\r
- Permission to use, copy, modify, distribute, and sell this \r
- software and its documentation for any purpose is hereby granted\r
- without fee, provided that the above copyright notice appear in \r
- all copies and that both that the copyright notice and this\r
- permission notice and warranty disclaimer appear in supporting \r
- documentation, and that the name of the author not be used in \r
- advertising or publicity pertaining to distribution of the \r
- software without specific, written prior permission.\r
-\r
- The author disclaim all warranties with regard to this\r
- software, including all implied warranties of merchantability\r
- and fitness. In no event shall the author be liable for any\r
- special, indirect or consequential damages or any damages\r
- whatsoever resulting from loss of use, data or profits, whether\r
- in an action of contract, negligence or other tortious action,\r
- arising out of or in connection with the use or performance of\r
- this software.\r
-*/\r
-\r
-/** \file\r
- *\r
- * Main source file for the MouseHostWithParser demo. This file contains the main tasks of\r
- * the demo and is responsible for the initial application hardware configuration.\r
- */\r
- \r
-#include "MouseHostWithParser.h"\r
-\r
-/** Main program entry point. This routine configures the hardware required by the application, then\r
- * enters a loop to run the application tasks in sequence.\r
- */\r
-int main(void)\r
-{\r
- SetupHardware();\r
-\r
- puts_P(PSTR(ESC_FG_CYAN "Mouse HID Parser Host Demo running.\r\n" ESC_FG_WHITE));\r
-\r
- LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);\r
- sei();\r
-\r
- for (;;)\r
- {\r
- Mouse_HID_Task();\r
- USB_USBTask();\r
- }\r
-}\r
-\r
-/** Configures the board hardware and chip peripherals for the demo's functionality. */\r
-void SetupHardware(void)\r
-{\r
- /* Disable watchdog if enabled by bootloader/fuses */\r
- MCUSR &= ~(1 << WDRF);\r
- wdt_disable();\r
-\r
- /* Disable clock division */\r
- clock_prescale_set(clock_div_1);\r
- \r
- /* Hardware Initialization */\r
- SerialStream_Init(9600, false);\r
- LEDs_Init();\r
- USB_Init();\r
-}\r
-\r
-/** Event handler for the USB_DeviceAttached event. This indicates that a device has been attached to the host, and\r
- * starts the library USB task to begin the enumeration and USB management process.\r
- */\r
-void EVENT_USB_Host_DeviceAttached(void)\r
-{\r
- puts_P(PSTR(ESC_FG_GREEN "Device Attached.\r\n" ESC_FG_WHITE));\r
- LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING);\r
-}\r
-\r
-/** Event handler for the USB_DeviceUnattached event. This indicates that a device has been removed from the host, and\r
- * stops the library USB task management process.\r
- */\r
-void EVENT_USB_Host_DeviceUnattached(void)\r
-{\r
- puts_P(PSTR(ESC_FG_GREEN "Device Unattached.\r\n" ESC_FG_WHITE));\r
- LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);\r
-}\r
-\r
-/** Event handler for the USB_DeviceEnumerationComplete event. This indicates that a device has been successfully\r
- * enumerated by the host and is now ready to be used by the application.\r
- */\r
-void EVENT_USB_Host_DeviceEnumerationComplete(void)\r
-{\r
- LEDs_SetAllLEDs(LEDMASK_USB_READY);\r
-}\r
-\r
-/** Event handler for the USB_HostError event. This indicates that a hardware error occurred while in host mode. */\r
-void EVENT_USB_Host_HostError(const uint8_t ErrorCode)\r
-{\r
- USB_ShutDown();\r
-\r
- printf_P(PSTR(ESC_FG_RED "Host Mode Error\r\n"\r
- " -- Error Code %d\r\n" ESC_FG_WHITE), ErrorCode);\r
-\r
- LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
- for(;;);\r
-}\r
-\r
-/** Event handler for the USB_DeviceEnumerationFailed event. This indicates that a problem occurred while\r
- * enumerating an attached USB device.\r
- */\r
-void EVENT_USB_Host_DeviceEnumerationFailed(const uint8_t ErrorCode, const uint8_t SubErrorCode)\r
-{\r
- printf_P(PSTR(ESC_FG_RED "Dev Enum Error\r\n"\r
- " -- Error Code %d\r\n"\r
- " -- Sub Error Code %d\r\n"\r
- " -- In State %d\r\n" ESC_FG_WHITE), ErrorCode, SubErrorCode, USB_HostState);\r
- \r
- LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
-}\r
-\r
-/** Task to set the configuration of the attached device after it has been enumerated, and to read and process\r
- * the HID report descriptor and HID reports from the device and display the results onto the board LEDs.\r
- */\r
-void Mouse_HID_Task(void)\r
-{\r
- uint8_t ErrorCode;\r
-\r
- /* Switch to determine what user-application handled host state the host state machine is in */\r
- switch (USB_HostState)\r
- {\r
- case HOST_STATE_Addressed:\r
- puts_P(PSTR("Getting Config Data.\r\n"));\r
- \r
- /* Get and process the configuration descriptor data */\r
- if ((ErrorCode = ProcessConfigurationDescriptor()) != SuccessfulConfigRead)\r
- {\r
- if (ErrorCode == ControlError)\r
- puts_P(PSTR(ESC_FG_RED "Control Error (Get Configuration).\r\n"));\r
- else\r
- puts_P(PSTR(ESC_FG_RED "Invalid Device.\r\n"));\r
-\r
- printf_P(PSTR(" -- Error Code: %d\r\n" ESC_FG_WHITE), ErrorCode);\r
- \r
- /* Indicate error via status LEDs */\r
- LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
-\r
- /* Wait until USB device disconnected */\r
- USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
- break;\r
- }\r
- \r
- /* Set the device configuration to the first configuration (rarely do devices use multiple configurations) */\r
- if ((ErrorCode = USB_Host_SetDeviceConfiguration(1)) != HOST_SENDCONTROL_Successful)\r
- {\r
- printf_P(PSTR(ESC_FG_RED "Control Error (Set Configuration).\r\n"\r
- " -- Error Code: %d\r\n" ESC_FG_WHITE), ErrorCode);\r
-\r
- /* Indicate error via status LEDs */\r
- LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
- \r
- /* Wait until USB device disconnected */\r
- USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
- break;\r
- }\r
- \r
- printf_P(PSTR("Processing HID Report (Size %d Bytes).\r\n"), HIDReportSize);\r
-\r
- /* Get and process the device's first HID report descriptor */\r
- if ((ErrorCode = GetHIDReportData()) != ParseSuccessful)\r
- {\r
- puts_P(PSTR(ESC_FG_RED "Report Parse Error.\r\n"));\r
-\r
- if (!(HIDReportInfo.TotalReportItems))\r
- puts_P(PSTR("Not a valid Mouse." ESC_FG_WHITE));\r
- else\r
- printf_P(PSTR(" -- Error Code: %d\r\n" ESC_FG_WHITE), ErrorCode);\r
- \r
- /* Indicate error via status LEDs */\r
- LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
- \r
- /* Wait until USB device disconnected */\r
- USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
- break;\r
- }\r
- \r
- printf("Total Reports: %d\r\n", HIDReportInfo.TotalDeviceReports);\r
-\r
- for (uint8_t i = 0; i < HIDReportInfo.TotalDeviceReports; i++)\r
- {\r
- HID_ReportSizeInfo_t* CurrReportIDInfo = &HIDReportInfo.ReportIDSizes[i];\r
- \r
- uint8_t ReportSizeInBits = CurrReportIDInfo->ReportSizeBits[REPORT_ITEM_TYPE_In];\r
- uint8_t ReportSizeOutBits = CurrReportIDInfo->ReportSizeBits[REPORT_ITEM_TYPE_Out];\r
- uint8_t ReportSizeFeatureBits = CurrReportIDInfo->ReportSizeBits[REPORT_ITEM_TYPE_Feature];\r
-\r
- /* Print out the byte sizes of each report within the device */\r
- printf_P(PSTR(" + Report ID %d - In: %d bytes, Out: %d bytes, Feature: %d bytes\r\n"),\r
- CurrReportIDInfo->ReportID,\r
- ((ReportSizeInBits >> 3) + ((ReportSizeInBits & 0x07) != 0)),\r
- ((ReportSizeOutBits >> 3) + ((ReportSizeOutBits & 0x07) != 0)),\r
- ((ReportSizeFeatureBits >> 3) + ((ReportSizeFeatureBits & 0x07) != 0)));\r
- }\r
-\r
- puts_P(PSTR("Mouse Enumerated.\r\n"));\r
-\r
- USB_HostState = HOST_STATE_Configured;\r
- break;\r
- case HOST_STATE_Configured:\r
- /* Select and unfreeze mouse data pipe */\r
- Pipe_SelectPipe(MOUSE_DATAPIPE); \r
- Pipe_Unfreeze();\r
- \r
- /* Check to see if a packet has been received */\r
- if (Pipe_IsINReceived())\r
- {\r
- /* Check if data has been received from the attached mouse */\r
- if (Pipe_IsReadWriteAllowed())\r
- {\r
- /* Create buffer big enough for the report */\r
- uint8_t MouseReport[Pipe_BytesInPipe()];\r
-\r
- /* Load in the mouse report */\r
- Pipe_Read_Stream_LE(MouseReport, Pipe_BytesInPipe());\r
- \r
- /* Process the read in mouse report from the device */\r
- ProcessMouseReport(MouseReport);\r
- }\r
- \r
- /* Clear the IN endpoint, ready for next data packet */\r
- Pipe_ClearIN();\r
- }\r
-\r
- /* Freeze mouse data pipe */\r
- Pipe_Freeze();\r
- break;\r
- }\r
-}\r
-\r
-/** Processes a read HID report from an attached mouse, extracting out elements via the HID parser results\r
- * as required and displays movement and button presses on the board LEDs.\r
- *\r
- * \param[in] MouseReport Pointer to a HID report from an attached mouse device\r
- */\r
-void ProcessMouseReport(uint8_t* MouseReport)\r
-{\r
- uint8_t LEDMask = LEDS_NO_LEDS;\r
-\r
- /* Check each HID report item in turn, looking for mouse X/Y/button reports */\r
- for (uint8_t ReportNumber = 0; ReportNumber < HIDReportInfo.TotalReportItems; ReportNumber++)\r
- {\r
- /* Create a temporary item pointer to the next report item */\r
- HID_ReportItem_t* ReportItem = &HIDReportInfo.ReportItems[ReportNumber];\r
- \r
- bool FoundData;\r
-\r
- if ((ReportItem->Attributes.Usage.Page == USAGE_PAGE_BUTTON) &&\r
- (ReportItem->ItemType == REPORT_ITEM_TYPE_In))\r
- {\r
- /* Get the mouse button value */\r
- FoundData = USB_GetHIDReportItemInfo(MouseReport, ReportItem);\r
- \r
- /* For multi-report devices - if the requested data was not in the issued report, continue */\r
- if (!(FoundData))\r
- continue;\r
-\r
- /* If button is pressed, all LEDs are turned on */\r
- if (ReportItem->Value)\r
- LEDMask = LEDS_ALL_LEDS;\r
- }\r
- else if ((ReportItem->Attributes.Usage.Page == USAGE_PAGE_GENERIC_DCTRL) &&\r
- (ReportItem->Attributes.Usage.Usage == USAGE_SCROLL_WHEEL) &&\r
- (ReportItem->ItemType == REPORT_ITEM_TYPE_In))\r
- {\r
- /* Get the mouse wheel value if it is contained within the current \r
- * report, if not, skip to the next item in the parser list\r
- */\r
- if (!(USB_GetHIDReportItemInfo(MouseReport, ReportItem)))\r
- continue; \r
-\r
- int16_t WheelDelta = HID_ALIGN_DATA(ReportItem, int16_t);\r
- \r
- if (WheelDelta)\r
- LEDMask = (LEDS_LED1 | LEDS_LED2 | ((WheelDelta > 0) ? LEDS_LED3 : LEDS_LED4));\r
- }\r
- else if ((ReportItem->Attributes.Usage.Page == USAGE_PAGE_GENERIC_DCTRL) &&\r
- ((ReportItem->Attributes.Usage.Usage == USAGE_X) ||\r
- (ReportItem->Attributes.Usage.Usage == USAGE_Y)) &&\r
- (ReportItem->ItemType == REPORT_ITEM_TYPE_In))\r
- {\r
- /* Get the mouse relative position value */\r
- FoundData = USB_GetHIDReportItemInfo(MouseReport, ReportItem);\r
- \r
- /* For multi-report devices - if the requested data was not in the issued report, continue */\r
- if (!(FoundData))\r
- continue;\r
- \r
- int16_t DeltaMovement = (int16_t)(ReportItem->Value << (16 - ReportItem->Attributes.BitSize));\r
- \r
- /* Determine if the report is for the X or Y delta movement */\r
- if (ReportItem->Attributes.Usage.Usage == USAGE_X)\r
- {\r
- /* Turn on the appropriate LED according to direction if the delta is non-zero */\r
- if (DeltaMovement)\r
- LEDMask |= ((DeltaMovement > 0) ? LEDS_LED1 : LEDS_LED2);\r
- }\r
- else\r
- {\r
- /* Turn on the appropriate LED according to direction if the delta is non-zero */\r
- if (DeltaMovement)\r
- LEDMask |= ((DeltaMovement > 0) ? LEDS_LED3 : LEDS_LED4);\r
- }\r
- }\r
- }\r
- \r
- /* Display the button information on the board LEDs */\r
- LEDs_SetAllLEDs(LEDMask);\r
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2010.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.fourwalledcubicle.com
+*/
+
+/*
+ Copyright 2010 Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+ 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
+ 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
+ software without specific, written prior permission.
+
+ The author disclaim all warranties with regard to this
+ software, including all implied warranties of merchantability
+ and fitness. In no event shall the author be liable for any
+ special, indirect or consequential damages or any damages
+ whatsoever resulting from loss of use, data or profits, whether
+ in an action of contract, negligence or other tortious action,
+ arising out of or in connection with the use or performance of
+ this software.
+*/
+
+/** \file
+ *
+ * Main source file for the MouseHostWithParser demo. This file contains the main tasks of
+ * the demo and is responsible for the initial application hardware configuration.
+ */
+
+#include "MouseHostWithParser.h"
+
+/** Main program entry point. This routine configures the hardware required by the application, then
+ * enters a loop to run the application tasks in sequence.
+ */
+int main(void)
+{
+ SetupHardware();
+
+ puts_P(PSTR(ESC_FG_CYAN "Mouse HID Parser Host Demo running.\r\n" ESC_FG_WHITE));
+
+ LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
+ sei();
+
+ for (;;)
+ {
+ Mouse_HID_Task();
+ USB_USBTask();
+ }
+}
+
+/** Configures the board hardware and chip peripherals for the demo's functionality. */
+void SetupHardware(void)
+{
+ /* Disable watchdog if enabled by bootloader/fuses */
+ MCUSR &= ~(1 << WDRF);
+ wdt_disable();
+
+ /* Disable clock division */
+ clock_prescale_set(clock_div_1);
+
+ /* Hardware Initialization */
+ SerialStream_Init(9600, false);
+ LEDs_Init();
+ USB_Init();
+}
+
+/** Event handler for the USB_DeviceAttached event. This indicates that a device has been attached to the host, and
+ * starts the library USB task to begin the enumeration and USB management process.
+ */
+void EVENT_USB_Host_DeviceAttached(void)
+{
+ puts_P(PSTR(ESC_FG_GREEN "Device Attached.\r\n" ESC_FG_WHITE));
+ LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING);
+}
+
+/** Event handler for the USB_DeviceUnattached event. This indicates that a device has been removed from the host, and
+ * stops the library USB task management process.
+ */
+void EVENT_USB_Host_DeviceUnattached(void)
+{
+ puts_P(PSTR(ESC_FG_GREEN "Device Unattached.\r\n" ESC_FG_WHITE));
+ LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
+}
+
+/** Event handler for the USB_DeviceEnumerationComplete event. This indicates that a device has been successfully
+ * enumerated by the host and is now ready to be used by the application.
+ */
+void EVENT_USB_Host_DeviceEnumerationComplete(void)
+{
+ LEDs_SetAllLEDs(LEDMASK_USB_READY);
+}
+
+/** Event handler for the USB_HostError event. This indicates that a hardware error occurred while in host mode. */
+void EVENT_USB_Host_HostError(const uint8_t ErrorCode)
+{
+ USB_ShutDown();
+
+ printf_P(PSTR(ESC_FG_RED "Host Mode Error\r\n"
+ " -- Error Code %d\r\n" ESC_FG_WHITE), ErrorCode);
+
+ LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
+ for(;;);
+}
+
+/** Event handler for the USB_DeviceEnumerationFailed event. This indicates that a problem occurred while
+ * enumerating an attached USB device.
+ */
+void EVENT_USB_Host_DeviceEnumerationFailed(const uint8_t ErrorCode, const uint8_t SubErrorCode)
+{
+ printf_P(PSTR(ESC_FG_RED "Dev Enum Error\r\n"
+ " -- Error Code %d\r\n"
+ " -- Sub Error Code %d\r\n"
+ " -- In State %d\r\n" ESC_FG_WHITE), ErrorCode, SubErrorCode, USB_HostState);
+
+ LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
+}
+
+/** Task to set the configuration of the attached device after it has been enumerated, and to read and process
+ * the HID report descriptor and HID reports from the device and display the results onto the board LEDs.
+ */
+void Mouse_HID_Task(void)
+{
+ uint8_t ErrorCode;
+
+ /* Switch to determine what user-application handled host state the host state machine is in */
+ switch (USB_HostState)
+ {
+ case HOST_STATE_Addressed:
+ puts_P(PSTR("Getting Config Data.\r\n"));
+
+ /* Get and process the configuration descriptor data */
+ if ((ErrorCode = ProcessConfigurationDescriptor()) != SuccessfulConfigRead)
+ {
+ if (ErrorCode == ControlError)
+ puts_P(PSTR(ESC_FG_RED "Control Error (Get Configuration).\r\n"));
+ else
+ puts_P(PSTR(ESC_FG_RED "Invalid Device.\r\n"));
+
+ printf_P(PSTR(" -- Error Code: %d\r\n" ESC_FG_WHITE), ErrorCode);
+
+ /* Indicate error via status LEDs */
+ LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
+
+ /* Wait until USB device disconnected */
+ USB_HostState = HOST_STATE_WaitForDeviceRemoval;
+ break;
+ }
+
+ /* Set the device configuration to the first configuration (rarely do devices use multiple configurations) */
+ if ((ErrorCode = USB_Host_SetDeviceConfiguration(1)) != HOST_SENDCONTROL_Successful)
+ {
+ printf_P(PSTR(ESC_FG_RED "Control Error (Set Configuration).\r\n"
+ " -- Error Code: %d\r\n" ESC_FG_WHITE), ErrorCode);
+
+ /* Indicate error via status LEDs */
+ LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
+
+ /* Wait until USB device disconnected */
+ USB_HostState = HOST_STATE_WaitForDeviceRemoval;
+ break;
+ }
+
+ printf_P(PSTR("Processing HID Report (Size %d Bytes).\r\n"), HIDReportSize);
+
+ /* Get and process the device's first HID report descriptor */
+ if ((ErrorCode = GetHIDReportData()) != ParseSuccessful)
+ {
+ puts_P(PSTR(ESC_FG_RED "Report Parse Error.\r\n"));
+
+ if (!(HIDReportInfo.TotalReportItems))
+ puts_P(PSTR("Not a valid Mouse." ESC_FG_WHITE));
+ else
+ printf_P(PSTR(" -- Error Code: %d\r\n" ESC_FG_WHITE), ErrorCode);
+
+ /* Indicate error via status LEDs */
+ LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
+
+ /* Wait until USB device disconnected */
+ USB_HostState = HOST_STATE_WaitForDeviceRemoval;
+ break;
+ }
+
+ printf("Total Reports: %d\r\n", HIDReportInfo.TotalDeviceReports);
+
+ for (uint8_t i = 0; i < HIDReportInfo.TotalDeviceReports; i++)
+ {
+ HID_ReportSizeInfo_t* CurrReportIDInfo = &HIDReportInfo.ReportIDSizes[i];
+
+ uint8_t ReportSizeInBits = CurrReportIDInfo->ReportSizeBits[REPORT_ITEM_TYPE_In];
+ uint8_t ReportSizeOutBits = CurrReportIDInfo->ReportSizeBits[REPORT_ITEM_TYPE_Out];
+ uint8_t ReportSizeFeatureBits = CurrReportIDInfo->ReportSizeBits[REPORT_ITEM_TYPE_Feature];
+
+ /* Print out the byte sizes of each report within the device */
+ printf_P(PSTR(" + Report ID %d - In: %d bytes, Out: %d bytes, Feature: %d bytes\r\n"),
+ CurrReportIDInfo->ReportID,
+ ((ReportSizeInBits >> 3) + ((ReportSizeInBits & 0x07) != 0)),
+ ((ReportSizeOutBits >> 3) + ((ReportSizeOutBits & 0x07) != 0)),
+ ((ReportSizeFeatureBits >> 3) + ((ReportSizeFeatureBits & 0x07) != 0)));
+ }
+
+ puts_P(PSTR("Mouse Enumerated.\r\n"));
+
+ USB_HostState = HOST_STATE_Configured;
+ break;
+ case HOST_STATE_Configured:
+ /* Select and unfreeze mouse data pipe */
+ Pipe_SelectPipe(MOUSE_DATAPIPE);
+ Pipe_Unfreeze();
+
+ /* Check to see if a packet has been received */
+ if (Pipe_IsINReceived())
+ {
+ /* Check if data has been received from the attached mouse */
+ if (Pipe_IsReadWriteAllowed())
+ {
+ /* Create buffer big enough for the report */
+ uint8_t MouseReport[Pipe_BytesInPipe()];
+
+ /* Load in the mouse report */
+ Pipe_Read_Stream_LE(MouseReport, Pipe_BytesInPipe());
+
+ /* Process the read in mouse report from the device */
+ ProcessMouseReport(MouseReport);
+ }
+
+ /* Clear the IN endpoint, ready for next data packet */
+ Pipe_ClearIN();
+ }
+
+ /* Freeze mouse data pipe */
+ Pipe_Freeze();
+ break;
+ }
+}
+
+/** Processes a read HID report from an attached mouse, extracting out elements via the HID parser results
+ * as required and displays movement and button presses on the board LEDs.
+ *
+ * \param[in] MouseReport Pointer to a HID report from an attached mouse device
+ */
+void ProcessMouseReport(uint8_t* MouseReport)
+{
+ uint8_t LEDMask = LEDS_NO_LEDS;
+
+ /* Check each HID report item in turn, looking for mouse X/Y/button reports */
+ for (uint8_t ReportNumber = 0; ReportNumber < HIDReportInfo.TotalReportItems; ReportNumber++)
+ {
+ /* Create a temporary item pointer to the next report item */
+ HID_ReportItem_t* ReportItem = &HIDReportInfo.ReportItems[ReportNumber];
+
+ bool FoundData;
+
+ if ((ReportItem->Attributes.Usage.Page == USAGE_PAGE_BUTTON) &&
+ (ReportItem->ItemType == REPORT_ITEM_TYPE_In))
+ {
+ /* Get the mouse button value */
+ FoundData = USB_GetHIDReportItemInfo(MouseReport, ReportItem);
+
+ /* For multi-report devices - if the requested data was not in the issued report, continue */
+ if (!(FoundData))
+ continue;
+
+ /* If button is pressed, all LEDs are turned on */
+ if (ReportItem->Value)
+ LEDMask = LEDS_ALL_LEDS;
+ }
+ else if ((ReportItem->Attributes.Usage.Page == USAGE_PAGE_GENERIC_DCTRL) &&
+ (ReportItem->Attributes.Usage.Usage == USAGE_SCROLL_WHEEL) &&
+ (ReportItem->ItemType == REPORT_ITEM_TYPE_In))
+ {
+ /* Get the mouse wheel value if it is contained within the current
+ * report, if not, skip to the next item in the parser list
+ */
+ if (!(USB_GetHIDReportItemInfo(MouseReport, ReportItem)))
+ continue;
+
+ int16_t WheelDelta = HID_ALIGN_DATA(ReportItem, int16_t);
+
+ if (WheelDelta)
+ LEDMask = (LEDS_LED1 | LEDS_LED2 | ((WheelDelta > 0) ? LEDS_LED3 : LEDS_LED4));
+ }
+ else if ((ReportItem->Attributes.Usage.Page == USAGE_PAGE_GENERIC_DCTRL) &&
+ ((ReportItem->Attributes.Usage.Usage == USAGE_X) ||
+ (ReportItem->Attributes.Usage.Usage == USAGE_Y)) &&
+ (ReportItem->ItemType == REPORT_ITEM_TYPE_In))
+ {
+ /* Get the mouse relative position value */
+ FoundData = USB_GetHIDReportItemInfo(MouseReport, ReportItem);
+
+ /* For multi-report devices - if the requested data was not in the issued report, continue */
+ if (!(FoundData))
+ continue;
+
+ int16_t DeltaMovement = (int16_t)(ReportItem->Value << (16 - ReportItem->Attributes.BitSize));
+
+ /* Determine if the report is for the X or Y delta movement */
+ if (ReportItem->Attributes.Usage.Usage == USAGE_X)
+ {
+ /* Turn on the appropriate LED according to direction if the delta is non-zero */
+ if (DeltaMovement)
+ LEDMask |= ((DeltaMovement > 0) ? LEDS_LED1 : LEDS_LED2);
+ }
+ else
+ {
+ /* Turn on the appropriate LED according to direction if the delta is non-zero */
+ if (DeltaMovement)
+ LEDMask |= ((DeltaMovement > 0) ? LEDS_LED3 : LEDS_LED4);
+ }
+ }
+ }
+
+ /* Display the button information on the board LEDs */
+ LEDs_SetAllLEDs(LEDMask);
}
\ No newline at end of file