/** Task to read in and processes the next report from the attached device, displaying the report
 *  contents on the board LEDs and via the serial port.
 */
void KeyboardHost_Task(void)
{
	if (USB_HostState != HOST_STATE_Configured)
	  return;

	/* Select and unfreeze keyboard data pipe */
	Pipe_SelectPipe(KEYBOARD_DATA_IN_PIPE);
	Pipe_Unfreeze();

	/* Check to see if a packet has been received */
	if (Pipe_IsINReceived())
	{
		/* Check if data has been received from the attached keyboard */
		if (Pipe_IsReadWriteAllowed())
		{
			/* Create buffer big enough for the report */
			uint8_t KeyboardReport[Pipe_BytesInPipe()];

			/* Load in the keyboard report */
			Pipe_Read_Stream_LE(KeyboardReport, Pipe_BytesInPipe(), NULL);

			/* Process the read in keyboard report from the device */
			ProcessKeyboardReport(KeyboardReport);
		}

		/* Clear the IN endpoint, ready for next data packet */
		Pipe_ClearIN();
	}

	/* Freeze keyboard data pipe */
	Pipe_Freeze();
}
Example #2
0
/** 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 Keyboard_HID_Task(void)
{
    uint8_t ErrorCode;

    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)

        {
            puts_P(PSTR(ESC_FG_RED "Control Error (Set Configuration).\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;
        }

        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 Keyboard." 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;
        }

        puts_P(PSTR("Keyboard Enumerated.\r\n"));

        USB_HostState = HOST_STATE_Configured;
        break;
    case HOST_STATE_Configured:
        /* Select and unfreeze keyboard data pipe */
        Pipe_SelectPipe(KEYBOARD_DATA_IN_PIPE);
        Pipe_Unfreeze();

        /* Check to see if a packet has been received */
        if (Pipe_IsINReceived())
        {
            /* Check if data has been received from the attached keyboard */
            if (Pipe_IsReadWriteAllowed())
            {
                /* Create buffer big enough for the report */
                uint8_t KeyboardReport[Pipe_BytesInPipe()];

                /* Load in the keyboard report */
                Pipe_Read_Stream_LE(KeyboardReport, Pipe_BytesInPipe(), NULL);

                /* Process the read in keyboard report from the device */
                ProcessKeyboardReport(KeyboardReport);
            }

            /* Clear the IN endpoint, ready for next data packet */
            Pipe_ClearIN();
        }

        /* Freeze keyboard data pipe */
        Pipe_Freeze();
        break;
    }
}