Пример #1
0
/** Host USB management task. This task handles the control of USB Mice while in USB Host mode,
 *  setting up the appropriate data pipes and processing reports from the attached device.
 */
void MouseHost_Task(void)
{
	if (USB_HostState != HOST_STATE_Configured)
	  return;

	if (HID_Host_IsReportReceived(&Mouse_HID_Host_Interface))
	{
		uint8_t LEDMask  = LEDS_NO_LEDS;

		USB_MouseReport_Data_t MouseReport;
		HID_Host_ReceiveReport(&Mouse_HID_Host_Interface, &MouseReport);

		printf_P(PSTR("dX:%2d dY:%2d Button:%d\r\n"), MouseReport.X,
		                                              MouseReport.Y,
		                                              MouseReport.Button);
		if (MouseReport.X > 0)
		  LEDMask |= LEDS_LED1;
		else if (MouseReport.X < 0)
		  LEDMask |= LEDS_LED2;

		if (MouseReport.Y > 0)
		  LEDMask |= LEDS_LED3;
		else if (MouseReport.Y < 0)
		  LEDMask |= LEDS_LED4;

		if (MouseReport.Button)
		  LEDMask  = LEDS_ALL_LEDS;

		LEDs_SetAllLEDs(LEDMask);
	}
}
Пример #2
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);
	}
}
Пример #3
0
/** Task to manage an enumerated USB keyboard once connected, to display key state
 *  data as it is received.
 */
char KeyboardHost_Task(void)
{
	if (USB_HostState[Keyboard_Host_HID_Interface.Config.PortNumber] != HOST_STATE_Configured)
	  return 0;

	if (HID_Host_IsReportReceived(&Keyboard_Host_HID_Interface))
	{
		USB_KeyboardReport_Data_t KeyboardReport;
		HID_Host_ReceiveReport(&Keyboard_Host_HID_Interface, &KeyboardReport);

		LEDs_ChangeLEDs(LEDS_LED1, (KeyboardReport.Modifier) ? LEDS_LED1 : 0);

		uint8_t KeyCode = KeyboardReport.KeyCode[0];

		if (KeyCode)
		{
			char PressedKey = 0;

			LEDs_ToggleLEDs(LEDS_LED2);

			/* Retrieve pressed key character if alphanumeric */
			if ((KeyCode >= HID_KEYBOARD_SC_A) && (KeyCode <= HID_KEYBOARD_SC_Z))
			{
				PressedKey = (KeyCode - HID_KEYBOARD_SC_A) + 'A';
			}
			else if ((KeyCode >= HID_KEYBOARD_SC_1_AND_EXCLAMATION) &
			         (KeyCode  < HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS))
			{
				PressedKey = (KeyCode - HID_KEYBOARD_SC_1_AND_EXCLAMATION) + '1';
			}
			else if (KeyCode == HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS)
			{
				PressedKey = '0';
			}
			else if (KeyCode == HID_KEYBOARD_SC_SPACE)
			{
				PressedKey = ' ';
			}
			else if (KeyCode == HID_KEYBOARD_SC_ENTER)
			{
				PressedKey = '\n';
			}
			
			if (PressedKey)
			  putchar(PressedKey);
			return PressedKey;
		}
		return 0;
	}
}
Пример #4
0
KeysPressed KeyboardHost::getKeys() {
    
        // perform required USB tasks, from LUFA examples

    HID_Host_USBTask(&Keyboard_HID_Interface);
    USB_USBTask();
    
    KeysPressed ReturnDesc = { STAT_CONNECTED, m_map, 0, { { 0,0}, {0,0}, {0,0}, {0,0}, {0,0}, {0,0} } };
    
        // check for errors, not connected
    if ( status() == STAT_ERROR ) {
        ReturnDesc.status = STAT_ERROR;
        return ReturnDesc;
    }

    if (USB_HostState != HOST_STATE_Configured) {
        ReturnDesc.status = STAT_NOTCONNECTED;
        return ReturnDesc;
    }
    
    
    if (HID_Host_IsReportReceived(&Keyboard_HID_Interface))	{
		USB_KeyboardReport_Data_t KeyboardReport;
		HID_Host_ReceiveReport(&Keyboard_HID_Interface, &KeyboardReport);
        
        uint8_t Modifier = KeyboardReport.Modifier;
                
        for(uint8_t i = 0; i < 6; i++) {
              _mapKey(KeyboardReport.KeyCode[i], Modifier, ReturnDesc.keys[i]);

        }
            
	}

        // check for errors from keymapping
    if( error() != ERROR_NONE ) 
        ReturnDesc.status = STAT_ERROR;
    
    return ReturnDesc;
    
}
Пример #5
0
/* Keyboard management task */
static void KeyboardHost_Task(void)
{
	uint8_t KeyCode;

	if (USB_HostState[Keyboard_HID_Interface.Config.PortNumber] != HOST_STATE_Configured) {
		return;
	}

	if (HID_Host_IsReportReceived(&Keyboard_HID_Interface)) {
		USB_KeyboardReport_Data_t KeyboardReport;
		HID_Host_ReceiveReport(&Keyboard_HID_Interface, &KeyboardReport);

		KeyCode = KeyboardReport.KeyCode[0];

		if (KeyCode) {
			char PressedKey = 0;

			/* Retrieve pressed key character if alphanumeric */
			if ((KeyCode >= HID_KEYBOARD_SC_A) && (KeyCode <= HID_KEYBOARD_SC_Z)) {
				PressedKey = (KeyCode - HID_KEYBOARD_SC_A) + 'A';
			}
			else if ((KeyCode >= HID_KEYBOARD_SC_1_AND_EXCLAMATION) &
					 (KeyCode  < HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS)) {
				PressedKey = (KeyCode - HID_KEYBOARD_SC_1_AND_EXCLAMATION) + '1';
			}
			else if (KeyCode == HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS) {
				PressedKey = '0';
			}
			else if (KeyCode == HID_KEYBOARD_SC_SPACE) {
				PressedKey = ' ';
			}
			else if (KeyCode == HID_KEYBOARD_SC_ENTER) {
				PressedKey = '\n';
			}

			if (PressedKey) {
				putchar(PressedKey);
			}
		}
	}
}
Пример #6
0
/** 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 "Keyboard Host Demo running.\r\n" ESC_FG_WHITE));

	LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
	sei();

	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(&Keyboard_HID_Interface,
				                            ConfigDescriptorSize, ConfigDescriptorData) != HID_ENUMERROR_NoError)
				{
					puts_P(PSTR("Attached Device Not a Valid Keyboard.\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_SetBootProtocol(&Keyboard_HID_Interface) != 0)
				{
					puts_P(PSTR("Could not Set Boot Protocol Mode.\r\n"));
					LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
					USB_HostState = HOST_STATE_WaitForDeviceRemoval;
					break;
				}

				puts_P(PSTR("Keyboard Enumerated.\r\n"));
				LEDs_SetAllLEDs(LEDMASK_USB_READY);
				USB_HostState = HOST_STATE_Configured;
				break;
			case HOST_STATE_Configured:
				if (HID_Host_IsReportReceived(&Keyboard_HID_Interface))
				{
					USB_KeyboardReport_Data_t KeyboardReport;
					HID_Host_ReceiveReport(&Keyboard_HID_Interface, &KeyboardReport);

					LEDs_ChangeLEDs(LEDS_LED1, (KeyboardReport.Modifier) ? LEDS_LED1 : 0);

					uint8_t KeyCode = KeyboardReport.KeyCode[0];

					if (KeyCode)
					{
						char PressedKey = 0;

						LEDs_ToggleLEDs(LEDS_LED2);

						/* Retrieve pressed key character if alphanumeric */
						if ((KeyCode >= HID_KEYBOARD_SC_A) && (KeyCode <= HID_KEYBOARD_SC_Z))
						{
							PressedKey = (KeyCode - HID_KEYBOARD_SC_A) + 'A';
						}
						else if ((KeyCode >= HID_KEYBOARD_SC_1_AND_EXCLAMATION) &
						         (KeyCode <= HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS))
						{
							PressedKey = (KeyCode - HID_KEYBOARD_SC_1_AND_EXCLAMATION) + '0';
						}
						else if (KeyCode == HID_KEYBOARD_SC_SPACE)
						{
							PressedKey = ' ';
						}
						else if (KeyCode == HID_KEYBOARD_SC_ENTER)
						{
							PressedKey = '\n';
						}
						
						if (PressedKey)
						  putchar(PressedKey);
					}
				}

				break;
		}

		HID_Host_USBTask(&Keyboard_HID_Interface);
		USB_USBTask();
	}
}
/** 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();
	}
}
Пример #8
0
/** Task to manage an enumerated USB keyboard once connected, to display key state
 *  data as it is received.
 */
void KeyboardHost_Task(void)
{
	if (USB_HostState != HOST_STATE_Configured)
	  return;

	if (HID_Host_IsReportReceived(&Keyboard_HID_Interface))
	{
		uint8_t KeyboardReport[Keyboard_HID_Interface.State.LargestReportSize];
		HID_Host_ReceiveReport(&Keyboard_HID_Interface, &KeyboardReport);

		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(KeyboardReport, ReportItem)))
			  continue;

			/* Determine what report item is being tested, process updated value as needed */
			if ((ReportItem->Attributes.Usage.Page      == USAGE_PAGE_KEYBOARD) &&
				(ReportItem->Attributes.BitSize         == 8)                   &&
				(ReportItem->Attributes.Logical.Maximum > 1)                    &&
				(ReportItem->ItemType                   == HID_REPORT_ITEM_In))
			{
				/* Key code is an unsigned char in length, cast to the appropriate type */
				uint8_t KeyCode = (uint8_t)ReportItem->Value;

				/* If scan-code is non-zero, a key is being pressed */
				if (KeyCode)
				{
					/* Toggle status LED to indicate keypress */
					LEDs_ToggleLEDs(LEDS_LED2);

					char PressedKey = 0;

					/* Convert scan-code to printable character if alphanumeric */
					if ((KeyCode >= HID_KEYBOARD_SC_A) && (KeyCode <= HID_KEYBOARD_SC_Z))
					{
						PressedKey = (KeyCode - HID_KEYBOARD_SC_A) + 'A';
					}
					else if ((KeyCode >= HID_KEYBOARD_SC_1_AND_EXCLAMATION) &
							 (KeyCode  < HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS))
					{
						PressedKey = (KeyCode - HID_KEYBOARD_SC_1_AND_EXCLAMATION) + '1';
					}
					else if (KeyCode == HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS)
					{
						PressedKey = '0';
					}
					else if (KeyCode == HID_KEYBOARD_SC_SPACE)
					{
						PressedKey = ' ';
					}
					else if (KeyCode == HID_KEYBOARD_SC_ENTER)
					{
						PressedKey = '\n';
					}

					/* Print the pressed key character out through the serial port if valid */
					if (PressedKey)
					  putchar(PressedKey);
				}

				/* Once a scan-code is found, stop scanning through the report items */
				break;
			}
		}
	}
}
/** 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 "Keyboard Host Demo running.\r\n" ESC_FG_WHITE));

	LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
	sei();

	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(&Keyboard_HID_Interface,
				                            ConfigDescriptorSize, ConfigDescriptorData) != HID_ENUMERROR_NoError)
				{
					puts_P(PSTR("Attached Device Not a Valid Keyboard.\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(&Keyboard_HID_Interface) != 0)
				{
					puts_P(PSTR("Error Setting Report Protocol Mode or Not a Valid Keyboard.\r\n"));
					LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
					USB_HostState = HOST_STATE_WaitForDeviceRemoval;
					break;
				}
				
				puts_P(PSTR("Keyboard Enumerated.\r\n"));
				LEDs_SetAllLEDs(LEDMASK_USB_READY);
				USB_HostState = HOST_STATE_Configured;
				break;
			case HOST_STATE_Configured:
				if (HID_Host_IsReportReceived(&Keyboard_HID_Interface))
				{
					uint8_t KeyboardReport[Keyboard_HID_Interface.State.LargestReportSize];
					HID_Host_ReceiveReport(&Keyboard_HID_Interface, &KeyboardReport);
					
					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(KeyboardReport, ReportItem)))
						  continue;

						/* Determine what report item is being tested, process updated value as needed */
						if ((ReportItem->Attributes.Usage.Page      == USAGE_PAGE_KEYBOARD) &&
							(ReportItem->Attributes.BitSize         == 8)                   &&
							(ReportItem->Attributes.Logical.Maximum > 1)                    &&
							(ReportItem->ItemType                   == REPORT_ITEM_TYPE_In))
						{
							/* Key code is an unsigned char in length, cast to the appropriate type */
							uint8_t KeyCode = (uint8_t)ReportItem->Value;

							/* If scan-code is non-zero, a key is being pressed */
							if (KeyCode)
							{
								/* Toggle status LED to indicate keypress */
								LEDs_ToggleLEDs(LEDS_LED2);

								char PressedKey = 0;

								/* Convert scan-code to printable character if alphanumeric */
								if ((KeyCode >= 0x04) && (KeyCode <= 0x1D))
								  PressedKey = (KeyCode - 0x04) + 'A';
								else if ((KeyCode >= 0x1E) && (KeyCode <= 0x27))
								  PressedKey = (KeyCode - 0x1E) + '0';
								else if (KeyCode == 0x2C)
								  PressedKey = ' ';						
								else if (KeyCode == 0x28)
								  PressedKey = '\n';
									 
								/* Print the pressed key character out through the serial port if valid */
								if (PressedKey)
								  putchar(PressedKey);
							}
							
							/* Once a scan-code is found, stop scanning through the report items */
							break;
						}
					}
				}
				
				break;
		}
	
		HID_Host_USBTask(&Keyboard_HID_Interface);
		USB_USBTask();
	}
}
Пример #10
0
/** Host state machine task. This task handles the enumeration and control of USB Mice while in USB Host mode,
 *  setting up the appropriate data pipes and processing reports from the attached device.
 */
void MouseHostTask(void)
{
	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)
			{
				printf("Error Retrieving Configuration Descriptor.\r\n");
				LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
				USB_HostState = HOST_STATE_WaitForDeviceRemoval;
				break;
			}

			if (HID_Host_ConfigurePipes(&Mouse_HID_Host_Interface,
			                            ConfigDescriptorSize, ConfigDescriptorData) != HID_ENUMERROR_NoError)
			{
				printf("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)
			{
				printf("Error Setting Device Configuration.\r\n");
				LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
				USB_HostState = HOST_STATE_WaitForDeviceRemoval;
				break;
			}

			if (HID_Host_SetBootProtocol(&Mouse_HID_Host_Interface) != 0)
			{
				printf("Could not Set Boot Protocol Mode.\r\n");
				LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
				USB_HostState = HOST_STATE_WaitForDeviceRemoval;
				break;
			}
				
			printf("Mouse Enumerated.\r\n");
			USB_HostState = HOST_STATE_Configured;
			break;
		case HOST_STATE_Configured:
			if (HID_Host_IsReportReceived(&Mouse_HID_Host_Interface))
			{	
				uint8_t LEDMask  = LEDS_NO_LEDS;
					
				USB_MouseReport_Data_t MouseReport;
				HID_Host_ReceiveReport(&Mouse_HID_Host_Interface, &MouseReport);
						
				printf_P(PSTR("dX:%2d dY:%2d Button:%d\r\n"), MouseReport.X,
															  MouseReport.Y,
															  MouseReport.Button);
				if (MouseReport.X > 0)
				  LEDMask |= LEDS_LED1;
				else if (MouseReport.X < 0)
				  LEDMask |= LEDS_LED2;
							
				if (MouseReport.Y > 0)
				  LEDMask |= LEDS_LED3;
				else if (MouseReport.Y < 0)
				  LEDMask |= LEDS_LED4;

				if (MouseReport.Button)
				  LEDMask  = LEDS_ALL_LEDS;

				LEDs_SetAllLEDs(LEDMask);
			}

			break;
	}
}
Пример #11
0
/** 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 "Joystick Host Demo running.\r\n" ESC_FG_WHITE));

	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)
				{
					printf("Error Retrieving Configuration Descriptor.\r\n");
					LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
					USB_HostState = HOST_STATE_WaitForDeviceRemoval;
					break;
				}

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

				if (HID_Host_SetReportProtocol(&Joystick_HID_Interface) != 0)
				{
					printf("Error Setting Report Protocol Mode or Not a Valid Joystick.\r\n");
					LEDs_SetAllLEDs(LEDMASK_USB_ERROR);
					USB_HostState = HOST_STATE_WaitForDeviceRemoval;
					break;
				}
				
				LEDs_SetAllLEDs(LEDS_NO_LEDS);
				
				printf("Joystick Enumerated.\r\n");
				USB_HostState = HOST_STATE_Configured;
				break;
			case HOST_STATE_Configured:
				if (HID_Host_IsReportReceived(&Joystick_HID_Interface))
				{
					uint8_t JoystickReport[Joystick_HID_Interface.State.LargestReportSize];
					HID_Host_ReceiveReport(&Joystick_HID_Interface, &JoystickReport);

					uint8_t LEDMask = LEDS_NO_LEDS;

					for (uint8_t ReportNumber = 0; ReportNumber < HIDReportInfo.TotalReportItems; ReportNumber++)
					{
						HID_ReportItem_t* ReportItem = &HIDReportInfo.ReportItems[ReportNumber];
						
						if ((ReportItem->Attributes.Usage.Page        == USAGE_PAGE_BUTTON) &&
							(ReportItem->ItemType                     == REPORT_ITEM_TYPE_In))
						{
							/* Get the joystick button value if it is contained within the current report, if not,
							 * skip to the next item in the parser list
							 */
							if (!(USB_GetHIDReportItemInfo(JoystickReport, ReportItem)))
							  continue;

							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                == REPORT_ITEM_TYPE_In))
						{
							/* Get the joystick relative position value if it is contained within the current 
							 * report, if not, skip to the next item in the parser list
							 */
							if (!(USB_GetHIDReportItemInfo(JoystickReport, ReportItem)))
							  continue;							  

							int16_t DeltaMovement = (int16_t)(ReportItem->Value << (16 - ReportItem->Attributes.BitSize));
							
							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(&Joystick_HID_Interface);
		USB_USBTask();
	}
}