Update UC3 platform driver support to use the bitmasks defined in the header files...
[pub/USBasp.git] / Projects / HIDReportViewer / HIDReportViewer.c
index 58f9d5e..c7a73e7 100644 (file)
@@ -74,137 +74,128 @@ int main(void)
 \r
        for (;;)\r
        {\r
-               switch (USB_HostState)\r
-               {\r
-                       case HOST_STATE_Addressed:\r
-                               LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING);\r
-\r
-                               uint16_t ConfigDescriptorSize;\r
-                               uint8_t  ConfigDescriptorData[512];\r
-\r
-                               if (USB_Host_GetDeviceConfigDescriptor(1, &ConfigDescriptorSize, ConfigDescriptorData,\r
-                                                                      sizeof(ConfigDescriptorData)) != HOST_GETCONFIG_Successful)\r
-                               {\r
-                                       puts_P(PSTR("Error Retrieving Configuration Descriptor.\r\n"));\r
-                                       LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
-                                       USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
-                                       break;\r
-                               }\r
-\r
-                               if (HID_Host_ConfigurePipes(&Device_HID_Interface,\r
-                                                           ConfigDescriptorSize, ConfigDescriptorData) != HID_ENUMERROR_NoError)\r
-                               {\r
-                                       puts_P(PSTR("Attached Device Not a Valid HID Device.\r\n"));\r
-                                       LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
-                                       USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
-                                       break;\r
-                               }\r
-\r
-                               if (USB_Host_SetDeviceConfiguration(1) != HOST_SENDCONTROL_Successful)\r
-                               {\r
-                                       puts_P(PSTR("Error Setting Device Configuration.\r\n"));\r
-                                       LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
-                                       USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
-                                       break;\r
-                               }\r
-\r
-                               if (HID_Host_SetReportProtocol(&Device_HID_Interface) != 0)\r
-                               {\r
-                                       puts_P(PSTR("Error Setting Report Protocol Mode.\r\n"));\r
-                                       LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
-                                       USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
-                                       break;\r
-                               }\r
-\r
-                               puts_P(PSTR("HID Device Enumerated.\r\n"));\r
-                               LEDs_SetAllLEDs(LEDMASK_USB_READY);\r
-                               USB_HostState = HOST_STATE_Configured;\r
-                               break;\r
-                       case HOST_STATE_Configured:\r
-                               LEDs_SetAllLEDs(LEDMASK_USB_BUSY);\r
-                               \r
-                               printf_P(PSTR("\r\n\r\nTotal Reports: %" PRId8 "\r\n"), HIDReportInfo.TotalDeviceReports);\r
-                               for (uint8_t ReportIndex = 0; ReportIndex < HIDReportInfo.TotalDeviceReports; ReportIndex++)\r
-                               {\r
-                                       HID_ReportSizeInfo_t* CurrReportIDInfo = &HIDReportInfo.ReportIDSizes[ReportIndex];\r
-\r
-                                       uint8_t ReportSizeInBits      = CurrReportIDInfo->ReportSizeBits[HID_REPORT_ITEM_In];\r
-                                       uint8_t ReportSizeOutBits     = CurrReportIDInfo->ReportSizeBits[HID_REPORT_ITEM_Out];\r
-                                       uint8_t ReportSizeFeatureBits = CurrReportIDInfo->ReportSizeBits[HID_REPORT_ITEM_Feature];\r
-\r
-                                       /* Print out the byte sizes of each report within the device */\r
-                                       printf_P(PSTR("  + Report ID %" PRId8 " - In: %" PRId8 " bytes, Out: %" PRId8 " bytes, Feature: %" PRId8 " 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("\r\nReport Items:\r\n"));\r
-                               for (uint8_t ItemIndex = 0; ItemIndex < HIDReportInfo.TotalReportItems; ItemIndex++)\r
-                               {\r
-                                       const HID_ReportItem_t* RItem = &HIDReportInfo.ReportItems[ItemIndex];\r
-\r
-                                       printf_P(PSTR("  + Item %" PRId8 ":\r\n"\r
-                                                     "    - Report ID:          0x%02" PRIX8  "\r\n"\r
-                                                     "    - Data Direction:     %s\r\n"\r
-                                                     "    - Item Flags:         0x%02" PRIX8  "\r\n"\r
-                                                     "    - Item Offset (Bits): 0x%02" PRIX8  "\r\n"\r
-                                                     "    - Item Size (Bits):   0x%02" PRIX8  "\r\n"\r
-                                                     "    - Usage Page:         0x%04" PRIX16 "\r\n"\r
-                                                     "    - Usage:              0x%04" PRIX16 "\r\n"\r
-                                                     "    - Unit Type:          0x%08" PRIX32 "\r\n"\r
-                                                     "    - Unit Exponent:      0x%02" PRIX8  "\r\n"\r
-                                                     "    - Logical Minimum:    0x%08" PRIX32 "\r\n"\r
-                                                     "    - Logical Maximum:    0x%08" PRIX32 "\r\n"\r
-                                                     "    - Physical Minimum:   0x%08" PRIX32 "\r\n"\r
-                                                     "    - Physical Maximum:   0x%08" PRIX32 "\r\n"\r
-                                                     "    - Collection Path:\r\n"),\r
-                                                ItemIndex,\r
-                                                RItem->ReportID,\r
-                                                ((RItem->ItemType == HID_REPORT_ITEM_In) ? "IN" : ((RItem->ItemType == HID_REPORT_ITEM_Out) ? "OUT" : "FEATURE")),\r
-                                                RItem->ItemFlags,\r
-                                                RItem->BitOffset,\r
-                                                RItem->Attributes.BitSize,\r
-                                                RItem->Attributes.Usage.Page,\r
-                                                RItem->Attributes.Usage.Usage,\r
-                                                RItem->Attributes.Unit.Type,\r
-                                                RItem->Attributes.Unit.Exponent,\r
-                                                RItem->Attributes.Logical.Minimum,\r
-                                                RItem->Attributes.Logical.Maximum,\r
-                                                RItem->Attributes.Physical.Minimum,\r
-                                                RItem->Attributes.Physical.Maximum);\r
-                                       \r
-                                       const HID_CollectionPath_t* CollectionPath  = RItem->CollectionPath;\r
-                                       uint8_t                     CollectionDepth = 6;\r
-                                       \r
-                                       while (CollectionPath != NULL)\r
-                                       {\r
-                                               for (uint8_t i = 0; i < CollectionDepth; i++)\r
-                                                 putchar(' ');\r
-\r
-                                               printf_P(PSTR("- Type:  0x%02" PRIX8 "\r\n"), CollectionPath->Type);\r
-                                       \r
-                                               for (uint8_t i = 0; i < CollectionDepth; i++)\r
-                                                 putchar(' ');\r
-\r
-                                               printf_P(PSTR("- Usage: 0x%02" PRIX8 "\r\n"), CollectionPath->Usage);\r
-\r
-                                               CollectionDepth += 3;\r
-                                               CollectionPath   = CollectionPath->Parent;\r
-                                       }\r
-                               }\r
-                               \r
-                               LEDs_SetAllLEDs(LEDMASK_USB_READY);\r
-                               USB_HostState = HOST_STATE_WaitForDeviceRemoval;\r
-                               break;\r
-               }\r
-\r
+               RetrieveDeviceData();\r
+               \r
                HID_Host_USBTask(&Device_HID_Interface);\r
                USB_USBTask();\r
        }\r
 }\r
 \r
+/** Task to retrieve the HID device information from an attached device, and output\r
+ *  the relevant data to the serial port for analysis.\r
+ */\r
+void RetrieveDeviceData(void)\r
+{\r
+       if (USB_CurrentMode != USB_MODE_Host)\r
+         return;\r
+       \r
+       LEDs_SetAllLEDs(LEDMASK_USB_BUSY);\r
+       \r
+       OutputReportSizes();\r
+       OutputParsedReportItems();\r
+       \r
+       LEDs_SetAllLEDs(LEDMASK_USB_READY);\r
+       USB_Host_SetDeviceConfiguration(0);\r
+}\r
+\r
+/** Prints a summary of the device's HID report sizes from the HID parser output to the serial port\r
+ *  for display to the user.\r
+ */\r
+void OutputReportSizes(void)\r
+{\r
+       printf_P(PSTR("\r\n\r\nTotal Device Reports: %" PRId8 "\r\n"), HIDReportInfo.TotalDeviceReports);\r
+\r
+       for (uint8_t ReportIndex = 0; ReportIndex < HIDReportInfo.TotalDeviceReports; ReportIndex++)\r
+       {\r
+               const HID_ReportSizeInfo_t* CurrReportIDInfo = &HIDReportInfo.ReportIDSizes[ReportIndex];\r
+\r
+               uint8_t ReportSizeInBits      = CurrReportIDInfo->ReportSizeBits[HID_REPORT_ITEM_In];\r
+               uint8_t ReportSizeOutBits     = CurrReportIDInfo->ReportSizeBits[HID_REPORT_ITEM_Out];\r
+               uint8_t ReportSizeFeatureBits = CurrReportIDInfo->ReportSizeBits[HID_REPORT_ITEM_Feature];\r
+\r
+               /* Print out the byte sizes of each report within the device */\r
+               printf_P(PSTR("  + Report ID 0x%02" PRIX8 "\r\n"\r
+                                         "    - Input Data:   %" PRId8 " bits (%" PRId8 " bytes)\r\n"\r
+                                         "    - Output Data:  %" PRId8 " bits (%" PRId8 " bytes)\r\n"\r
+                                         "    - Feature Data: %" PRId8 " bits (%" PRId8 " bytes)\r\n"),\r
+                                CurrReportIDInfo->ReportID,\r
+                                ReportSizeInBits,\r
+                                ((ReportSizeInBits      >> 3) + ((ReportSizeInBits      & 0x07) != 0)),\r
+                                ReportSizeOutBits,\r
+                                ((ReportSizeOutBits     >> 3) + ((ReportSizeOutBits     & 0x07) != 0)),\r
+                                ReportSizeFeatureBits,\r
+                                ((ReportSizeFeatureBits >> 3) + ((ReportSizeFeatureBits & 0x07) != 0)));\r
+       }\r
+}\r
+\r
+/** Prints a summary of the device's parsed and stored report items along with their attributes\r
+ *  to the serial port for display to the user.\r
+ */\r
+void OutputParsedReportItems(void)\r
+{\r
+       printf_P(PSTR("\r\nReport Items (%" PRId8 " in Table):\r\n"), HIDReportInfo.TotalReportItems);\r
+\r
+       for (uint8_t ItemIndex = 0; ItemIndex < HIDReportInfo.TotalReportItems; ItemIndex++)\r
+       {\r
+               const HID_ReportItem_t* RItem = &HIDReportInfo.ReportItems[ItemIndex];\r
+\r
+               printf_P(PSTR("  + Item %" PRId8 ":\r\n"\r
+                                         "    - Report ID:          0x%02" PRIX8  "\r\n"\r
+                                         "    - Data Direction:     %s\r\n"\r
+                                         "    - Item Flags:         0x%02" PRIX8  "\r\n"\r
+                                         "    - Item Offset (Bits): 0x%02" PRIX8  "\r\n"\r
+                                         "    - Item Size (Bits):   0x%02" PRIX8  "\r\n"\r
+                                         "    - Usage Page:         0x%04" PRIX16 "\r\n"\r
+                                         "    - Usage:              0x%04" PRIX16 "\r\n"\r
+                                         "    - Unit Type:          0x%08" PRIX32 "\r\n"\r
+                                         "    - Unit Exponent:      0x%02" PRIX8  "\r\n"\r
+                                         "    - Logical Minimum:    0x%08" PRIX32 "\r\n"\r
+                                         "    - Logical Maximum:    0x%08" PRIX32 "\r\n"\r
+                                         "    - Physical Minimum:   0x%08" PRIX32 "\r\n"\r
+                                         "    - Physical Maximum:   0x%08" PRIX32 "\r\n"\r
+                                         "    - Collection Path:\r\n"),\r
+                                ItemIndex,\r
+                                RItem->ReportID,\r
+                                ((RItem->ItemType == HID_REPORT_ITEM_In) ? "IN" : ((RItem->ItemType == HID_REPORT_ITEM_Out) ? "OUT" : "FEATURE")),\r
+                                RItem->ItemFlags,\r
+                                RItem->BitOffset,\r
+                                RItem->Attributes.BitSize,\r
+                                RItem->Attributes.Usage.Page,\r
+                                RItem->Attributes.Usage.Usage,\r
+                                RItem->Attributes.Unit.Type,\r
+                                RItem->Attributes.Unit.Exponent,\r
+                                RItem->Attributes.Logical.Minimum,\r
+                                RItem->Attributes.Logical.Maximum,\r
+                                RItem->Attributes.Physical.Minimum,\r
+                                RItem->Attributes.Physical.Maximum);\r
+               \r
+               OutputCollectionPath(RItem->CollectionPath);\r
+       }\r
+}\r
+\r
+/** Prints the HID Collection path (along with each node's attributes) to the serial port\r
+ *  for display to the user, from the given starting node to the root node.\r
+ *\r
+ *  \param[in] CollectionPath  Starting HID Collection node to print\r
+ */\r
+void OutputCollectionPath(const HID_CollectionPath_t* const CollectionPath)\r
+{\r
+       const HID_CollectionPath_t* CurrentNode = CollectionPath;\r
+\r
+       while (CurrentNode != NULL)\r
+       {\r
+               printf_P(PSTR("      |\r\n"\r
+                                         "      - Type:  0x%02" PRIX8 "\r\n"\r
+                                         "      - Usage: 0x%02" PRIX8 "\r\n"),\r
+                                         CurrentNode->Type, CurrentNode->Usage);\r
+               \r
+               CurrentNode = CurrentNode->Parent;\r
+       }\r
+       \r
+       printf_P(PSTR("      |\r\n"\r
+                                 "      END\r\n"));\r
+}\r
+\r
 /** Configures the board hardware and chip peripherals for the demo's functionality. */\r
 void SetupHardware(void)\r
 {\r
@@ -247,6 +238,43 @@ void EVENT_USB_Host_DeviceUnattached(void)
  */\r
 void EVENT_USB_Host_DeviceEnumerationComplete(void)\r
 {\r
+       LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING);\r
+\r
+       uint16_t ConfigDescriptorSize;\r
+       uint8_t  ConfigDescriptorData[512];\r
+\r
+       if (USB_Host_GetDeviceConfigDescriptor(1, &ConfigDescriptorSize, ConfigDescriptorData,\r
+                                              sizeof(ConfigDescriptorData)) != HOST_GETCONFIG_Successful)\r
+       {\r
+               puts_P(PSTR("Error Retrieving Configuration Descriptor.\r\n"));\r
+               LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
+               return;\r
+       }\r
+\r
+       if (HID_Host_ConfigurePipes(&Device_HID_Interface,\r
+                                   ConfigDescriptorSize, ConfigDescriptorData) != HID_ENUMERROR_NoError)\r
+       {\r
+               puts_P(PSTR("Attached Device Not a Valid HID Device.\r\n"));\r
+               LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
+               return;\r
+       }\r
+\r
+       if (USB_Host_SetDeviceConfiguration(1) != HOST_SENDCONTROL_Successful)\r
+       {\r
+               puts_P(PSTR("Error Setting Device Configuration.\r\n"));\r
+               LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
+               return;\r
+       }\r
+\r
+       if (HID_Host_SetReportProtocol(&Device_HID_Interface) != 0)\r
+       {\r
+               puts_P(PSTR("Error Setting Report Protocol Mode.\r\n"));\r
+               LEDs_SetAllLEDs(LEDMASK_USB_ERROR);\r
+               USB_Host_SetDeviceConfiguration(0);\r
+               return;\r
+       }\r
+\r
+       puts_P(PSTR("HID Device Enumerated.\r\n"));\r
        LEDs_SetAllLEDs(LEDMASK_USB_READY);\r
 }\r
 \r