+
+       /* Create a stdio stream for the serial port for stdin and stdout */
+       Serial_CreateStream(NULL);
+}
+
+/** 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;
+                       }
+               }
+       }