Example #1
0
/** Task to manage an enumerated USB mouse once connected, to display movement
 *  data as it is received.
 */
void MouseHost_Task(void)
{
	if (USB_HostState != HOST_STATE_Configured)
	  return;
	
	if (HID_Host_IsReportReceived(&Mouse_HID_Interface))
	{
		uint8_t MouseReport[Mouse_HID_Interface.State.LargestReportSize];
		HID_Host_ReceiveReport(&Mouse_HID_Interface, &MouseReport);

		uint8_t LEDMask = LEDS_NO_LEDS;

		for (uint8_t ReportNumber = 0; ReportNumber < HIDReportInfo.TotalReportItems; ReportNumber++)
		{
			HID_ReportItem_t* ReportItem = &HIDReportInfo.ReportItems[ReportNumber];

			/* Update the report item value if it is contained within the current report */
			if (!(USB_GetHIDReportItemInfo(MouseReport, ReportItem)))
			  continue;

			/* Determine what report item is being tested, process updated value as needed */
			if ((ReportItem->Attributes.Usage.Page        == USAGE_PAGE_BUTTON) &&
			    (ReportItem->ItemType                     == HID_REPORT_ITEM_In))
			{
				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                == HID_REPORT_ITEM_In))
			{
				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                == HID_REPORT_ITEM_In))
			{
				int16_t DeltaMovement = HID_ALIGN_DATA(ReportItem, int16_t);

				if (DeltaMovement)
				{
					if (ReportItem->Attributes.Usage.Usage == USAGE_X)
					  LEDMask |= ((DeltaMovement > 0) ? LEDS_LED1 : LEDS_LED2);
					else
					  LEDMask |= ((DeltaMovement > 0) ? LEDS_LED3 : LEDS_LED4);
				}
			}
		}

		LEDs_SetAllLEDs(LEDMask);
	}
}
Example #2
0
/** Processes a read HID report from an attached joystick, extracting out elements via the HID parser results
 *  as required and displays movement and button presses on the board LEDs.
 *
 *  \param[in] JoystickReport  Pointer to a HID report from an attached joystick device
 */
void ProcessJoystickReport(uint8_t* JoystickReport)
{
	uint8_t LEDMask = LEDS_NO_LEDS;

	/* Check each HID report item in turn, looking for joystick 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                     == HID_REPORT_ITEM_In))
		{
			/* Get the joystick button value */
			FoundData = USB_GetHIDReportItemInfo(JoystickReport, 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_X)                  ||
				  (ReportItem->Attributes.Usage.Usage == USAGE_Y))                 &&
				 (ReportItem->ItemType                == HID_REPORT_ITEM_In))
		{
			/* Get the joystick relative position value */
			FoundData = USB_GetHIDReportItemInfo(JoystickReport, ReportItem);

			/* For multi-report devices - if the requested data was not in the issued report, continue */
			if (!(FoundData))
			  continue;

			int16_t DeltaMovement = HID_ALIGN_DATA(ReportItem, int16_t);

			/* Check to see if a (non-zero) delta movement has been indicated */
			if (DeltaMovement)
			{
				/* Determine if the report is for the X or Y delta movement, light LEDs as appropriate */
				if (ReportItem->Attributes.Usage.Usage == USAGE_X)
				  LEDMask |= ((DeltaMovement > 0) ? LEDS_LED1 : LEDS_LED2);
				else
				  LEDMask |= ((DeltaMovement > 0) ? LEDS_LED3 : LEDS_LED4);
			}
		}
	}

	/* Display the button information on the board LEDs */
	LEDs_SetAllLEDs(LEDMask);
}
/** 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 Host Demo running.\r\n" ESC_FG_WHITE));
	sei();

	LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);

	for (;;)
	{
		switch (USB_HostState)
		{
			case HOST_STATE_Addressed:
				LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING);
			
				uint16_t ConfigDescriptorSize;
				uint8_t  ConfigDescriptorData[512];

				if (USB_Host_GetDeviceConfigDescriptor(1, &ConfigDescriptorSize, ConfigDescriptorData,
				                                       sizeof(ConfigDescriptorData)) != HOST_GETCONFIG_Successful)
				{
					puts_P(PSTR("Error Retrieving Configuration Descriptor.\r\n"));
					LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
					USB_HostState = HOST_STATE_WaitForDeviceRemoval;
					break;
				}

				if (HID_Host_ConfigurePipes(&Mouse_HID_Interface,
				                            ConfigDescriptorSize, ConfigDescriptorData) != HID_ENUMERROR_NoError)
				{
					puts_P(PSTR("Attached Device Not a Valid Mouse.\r\n"));
					LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
					USB_HostState = HOST_STATE_WaitForDeviceRemoval;
					break;
				}
				
				if (USB_Host_SetDeviceConfiguration(1) != HOST_SENDCONTROL_Successful)
				{
					puts_P(PSTR("Error Setting Device Configuration.\r\n"));
					LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
					USB_HostState = HOST_STATE_WaitForDeviceRemoval;
					break;
				}

				if (HID_Host_SetReportProtocol(&Mouse_HID_Interface) != 0)
				{
					puts_P(PSTR("Error Setting Report Protocol Mode or Not a Valid Mouse.\r\n"));
					LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
					USB_HostState = HOST_STATE_WaitForDeviceRemoval;
					break;
				}
				
				puts_P(PSTR("Mouse Enumerated.\r\n"));
				LEDs_SetAllLEDs(LEDMASK_USB_READY);
				USB_HostState = HOST_STATE_Configured;
				break;
			case HOST_STATE_Configured:
				if (HID_Host_IsReportReceived(&Mouse_HID_Interface))
				{
					uint8_t MouseReport[Mouse_HID_Interface.State.LargestReportSize];
					HID_Host_ReceiveReport(&Mouse_HID_Interface, &MouseReport);

					uint8_t LEDMask = LEDS_NO_LEDS;

					for (uint8_t ReportNumber = 0; ReportNumber < HIDReportInfo.TotalReportItems; ReportNumber++)
					{
						HID_ReportItem_t* ReportItem = &HIDReportInfo.ReportItems[ReportNumber];
						
						/* Update the report item value if it is contained within the current report */
						if (!(USB_GetHIDReportItemInfo(MouseReport, ReportItem)))
						  continue;
						
						/* Determine what report item is being tested, process updated value as needed */
						if ((ReportItem->Attributes.Usage.Page        == USAGE_PAGE_BUTTON) &&
							(ReportItem->ItemType                     == REPORT_ITEM_TYPE_In))
						{
							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))
						{
							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))
						{
							int16_t DeltaMovement = HID_ALIGN_DATA(ReportItem, int16_t);
							
							if (ReportItem->Attributes.Usage.Usage == USAGE_X)
							{
								if (DeltaMovement)
								  LEDMask |= ((DeltaMovement > 0) ? LEDS_LED1 : LEDS_LED2);
							}
							else
							{
								if (DeltaMovement)
								  LEDMask |= ((DeltaMovement > 0) ? LEDS_LED3 : LEDS_LED4);
							}
						}
					}
					
					LEDs_SetAllLEDs(LEDMask);
				}
				
				break;
		}
	
		HID_Host_USBTask(&Mouse_HID_Interface);
		USB_USBTask();
	}
}