Change HID report parser so that it can calculate and record the sizes (IN, OUT and...
[pub/lufa.git] / LUFA / Drivers / USB / Class / Host / HIDParser.c
index 5174b59..4293a3d 100644 (file)
@@ -38,19 +38,19 @@ uint8_t USB_ProcessHIDReport(const uint8_t* ReportData, uint16_t ReportSize, HID
        HID_StateTable_t      StateTable[HID_STATETABLE_STACK_DEPTH];\r
        HID_StateTable_t*     CurrStateTable          = &StateTable[0];\r
        HID_CollectionPath_t* CurrCollectionPath      = NULL;\r
+       HID_ReportSizeInfo_t* CurrReportIDInfo        = &ParserData->ReportIDSizes[0];                  \r
        uint16_t              UsageStack[HID_USAGE_STACK_DEPTH];\r
        uint8_t               UsageStackSize          = 0;\r
-       uint16_t              BitOffsetIn             = 0;\r
-       uint16_t              BitOffsetOut            = 0;\r
-       uint16_t              BitOffsetFeature        = 0;\r
 \r
-       ParserData->TotalReportItems     = 0;\r
-       ParserData->UsingMultipleReports = false;\r
+       ParserData->TotalReportItems   = 0;\r
+       ParserData->TotalDeviceReports = 1;\r
+       ParserData->UsingReportIDs     = false;\r
        \r
        for (uint8_t CurrCollection = 0; CurrCollection < HID_MAX_COLLECTIONS; CurrCollection++)\r
          ParserData->CollectionPaths[CurrCollection].Parent = NULL;\r
 \r
-       memset(&StateTable[0], 0x00, sizeof(HID_StateTable_t));\r
+       memset(CurrStateTable,   0x00, sizeof(HID_StateTable_t));\r
+       memset(CurrReportIDInfo, 0x00, sizeof(HID_ReportSizeInfo_t));\r
 \r
        while (ReportSize)\r
        {\r
@@ -126,10 +126,33 @@ uint8_t USB_ProcessHIDReport(const uint8_t* ReportData, uint16_t ReportSize, HID
                                break;\r
                        case (TYPE_GLOBAL | TAG_GLOBAL_REPORTID):\r
                                CurrStateTable->ReportID                    = ReportItemData;\r
-                               ParserData->UsingMultipleReports = true;\r
-                               BitOffsetIn      = 0;\r
-                               BitOffsetOut     = 0;\r
-                               BitOffsetFeature = 0;\r
+\r
+                               if (ParserData->UsingReportIDs)\r
+                               {\r
+                                       CurrReportIDInfo = NULL;\r
+\r
+                                       for (uint8_t i = 0; i < ParserData->TotalDeviceReports; i++)\r
+                                       {\r
+                                               if (ParserData->ReportIDSizes[i].ReportID == CurrStateTable->ReportID)\r
+                                               {\r
+                                                       CurrReportIDInfo = &ParserData->ReportIDSizes[i];\r
+                                                       break;\r
+                                               }\r
+                                       }\r
+                                       \r
+                                       if (CurrReportIDInfo == NULL)\r
+                                       {\r
+                                               if (ParserData->TotalDeviceReports++ > HID_MAX_REPORT_IDS)\r
+                                                 return HID_PARSE_InsufficientReportIDItems;\r
+                                       \r
+                                               CurrReportIDInfo = &ParserData->ReportIDSizes[ParserData->TotalDeviceReports - 1];\r
+                                               memset(CurrReportIDInfo, 0x00, sizeof(HID_ReportSizeInfo_t));\r
+                                       }\r
+                               }\r
+\r
+                               ParserData->UsingReportIDs = true;                              \r
+\r
+                               CurrReportIDInfo->ReportID     = CurrStateTable->ReportID;\r
                                break;\r
                        case (TYPE_LOCAL | TAG_LOCAL_USAGE):\r
                                if (UsageStackSize == HID_USAGE_STACK_DEPTH)\r
@@ -223,21 +246,21 @@ uint8_t USB_ProcessHIDReport(const uint8_t* ReportData, uint16_t ReportSize, HID
                                        {\r
                                                case TAG_MAIN_INPUT:\r
                                                        NewReportItem.ItemType  = REPORT_ITEM_TYPE_In;\r
-                                                       NewReportItem.BitOffset = BitOffsetIn;\r
+                                                       NewReportItem.BitOffset = CurrReportIDInfo->BitsIn;\r
                                                                \r
-                                                       BitOffsetIn += CurrStateTable->Attributes.BitSize;\r
+                                                       CurrReportIDInfo->BitsIn += CurrStateTable->Attributes.BitSize;\r
                                                        break;\r
                                                case TAG_MAIN_OUTPUT:\r
                                                        NewReportItem.ItemType  = REPORT_ITEM_TYPE_Out;\r
-                                                       NewReportItem.BitOffset = BitOffsetOut;\r
+                                                       NewReportItem.BitOffset = CurrReportIDInfo->BitsOut;\r
                                                                \r
-                                                       BitOffsetOut += CurrStateTable->Attributes.BitSize;\r
+                                                       CurrReportIDInfo->BitsOut += CurrStateTable->Attributes.BitSize;\r
                                                        break;\r
                                                case TAG_MAIN_FEATURE:\r
                                                        NewReportItem.ItemType  = REPORT_ITEM_TYPE_Feature;                                             \r
-                                                       NewReportItem.BitOffset = BitOffsetFeature;\r
+                                                       NewReportItem.BitOffset = CurrReportIDInfo->BitsFeature;\r
                                                                \r
-                                                       BitOffsetFeature += CurrStateTable->Attributes.BitSize;\r
+                                                       CurrReportIDInfo->BitsFeature += CurrStateTable->Attributes.BitSize;\r
                                                        break;\r
                                        }\r
 \r