uint8_t USB_ProcessHIDReport(const uint8_t* ReportData, uint16_t ReportSize, HID_ReportInfo_t* const ParserData)\r
{\r
HID_StateTable_t StateTable[HID_STATETABLE_STACK_DEPTH];\r
- HID_StateTable_t* CurrStateTable = &StateTable[0];\r
+ HID_StateTable_t* CurrStateTable = &StateTable[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
+ uint8_t UsageStackSize = 0;\r
+ uint16_t BitOffsetIn = 0;\r
+ uint16_t BitOffsetOut = 0;\r
#if defined(HID_ENABLE_FEATURE_PROCESSING)\r
- uint16_t BitOffsetFeature = 0;\r
+ uint16_t BitOffsetFeature = 0;\r
#endif\r
- HID_CollectionPath_t* CurrCollectionPath = NULL;\r
+ HID_CollectionPath_t* CurrCollectionPath = NULL;\r
\r
- memset((void*)ParserData, 0x00, sizeof(HID_ReportInfo_t));\r
- memset((void*)StateTable, 0x00, sizeof(StateTable));\r
+ memset(ParserData, 0x00, sizeof(HID_ReportInfo_t));\r
+ memset(StateTable, 0x00, sizeof(StateTable));\r
\r
while (ReportSize)\r
{\r
+ uint8_t HIDReportItem = *(ReportData++);\r
uint32_t ReportItemData = 0;\r
\r
- switch (*ReportData & DATA_SIZE_MASK)\r
+ ReportSize--;\r
+ \r
+ switch (HIDReportItem & DATA_SIZE_MASK)\r
{\r
case DATA_SIZE_4:\r
- ReportItemData = *((uint32_t*)(ReportData + 1));\r
+ ReportItemData = *((uint32_t*)ReportData);\r
+ ReportSize -= 4;\r
+ ReportData += 4;\r
break;\r
case DATA_SIZE_2:\r
- ReportItemData = *((uint16_t*)(ReportData + 1));\r
+ ReportItemData = *((uint16_t*)ReportData);\r
+ ReportSize -= 2;\r
+ ReportData += 2;\r
break;\r
case DATA_SIZE_1:\r
- ReportItemData = *((uint8_t*)(ReportData + 1));\r
+ ReportItemData = *((uint8_t*)ReportData);\r
+ ReportSize -= 1;\r
+ ReportData += 1;\r
break;\r
}\r
\r
- switch (*ReportData & (TYPE_MASK | TAG_MASK))\r
+ switch (HIDReportItem & (TYPE_MASK | TAG_MASK))\r
{\r
case (TYPE_GLOBAL | TAG_GLOBAL_PUSH):\r
- if (CurrStateTable == &StateTable[HID_STATETABLE_STACK_DEPTH])\r
+ if (CurrStateTable == &StateTable[HID_STATETABLE_STACK_DEPTH - 1])\r
return HID_PARSE_HIDStackOverflow;\r
\r
- memcpy((CurrStateTable - 1),\r
- CurrStateTable,\r
+ memcpy(CurrStateTable,\r
+ (CurrStateTable + 1),\r
sizeof(HID_ReportItem_t));\r
\r
CurrStateTable++;\r
break;\r
case (TYPE_GLOBAL | TAG_GLOBAL_REPORTID):\r
CurrStateTable->ReportID = ReportItemData;\r
- BitOffsetIn = 0;\r
+ BitOffsetIn = 0;\r
BitOffsetOut = 0;\r
break;\r
case (TYPE_LOCAL | TAG_LOCAL_USAGE):\r
\r
while (CurrCollectionPath->Parent != NULL);\r
{\r
- if (CurrCollectionPath == &ParserData->CollectionPaths[HID_MAX_COLLECTIONS])\r
+ if (CurrCollectionPath == &ParserData->CollectionPaths[HID_MAX_COLLECTIONS - 1])\r
return HID_PARSE_InsufficientCollectionPaths;\r
\r
CurrCollectionPath++;\r
CurrReportItem->Attributes.Usage.Usage = 0;\r
}\r
\r
- switch (*ReportData & TAG_MASK)\r
+ switch (HIDReportItem & TAG_MASK)\r
{\r
case TAG_MAIN_INPUT:\r
CurrReportItem->ItemType = REPORT_ITEM_TYPE_In;\r
#endif\r
}\r
\r
-#if !defined(HID_INCLUDE_CONSTANT_DATA_ITEMS)\r
+#if defined(HID_INCLUDE_CONSTANT_DATA_ITEMS)\r
+ ParserData->TotalReportItems++;\r
+#else\r
if (!(ReportItemData & IOF_CONSTANT))\r
ParserData->TotalReportItems++;\r
-#else\r
- ParserData->TotalReportItems++;\r
#endif\r
}\r
\r
break;\r
}\r
\r
- if ((*ReportData & TYPE_MASK) == TYPE_MAIN)\r
+ if ((HIDReportItem & TYPE_MASK) == TYPE_MAIN)\r
{\r
CurrStateTable->Attributes.Usage.MinMax.Minimum = 0;\r
CurrStateTable->Attributes.Usage.MinMax.Maximum = 0;\r
UsageStackSize = 0;\r
}\r
- \r
- switch (*ReportData & DATA_SIZE_MASK)\r
- {\r
- case DATA_SIZE_4:\r
- ReportSize -= 5;\r
- ReportData += 5;\r
- break;\r
- case DATA_SIZE_2:\r
- ReportSize -= 3;\r
- ReportData += 3;\r
- break;\r
- case DATA_SIZE_1:\r
- ReportSize -= 2;\r
- ReportData += 2;\r
- break;\r
- case DATA_SIZE_0:\r
- ReportSize -= 1;\r
- ReportData += 1;\r
- break;\r
- }\r
}\r
\r
return HID_PARSE_Successful;\r