Fixed HID Parser not distributing the Usage Min and Usage Max values across an array of report items.
Added new HID_ALIGN_DATA() macro to return the pre-retrieved value of a HID report item, left-aligned to a given datatype. Added new PreviousValue to the HID Report Parser report item structure, for easy monitoring of previous report item values.
This commit is contained in:
		
							parent
							
								
									f338ddcb87
								
							
						
					
					
						commit
						2919aeeaab
					
				
					 12 changed files with 52 additions and 17 deletions
				
			
		| 
						 | 
				
			
			@ -40,7 +40,8 @@ uint8_t USB_ProcessHIDReport(const uint8_t* ReportData, uint16_t ReportSize, HID
 | 
			
		|||
	HID_CollectionPath_t* CurrCollectionPath      = NULL;
 | 
			
		||||
	HID_ReportSizeInfo_t* CurrReportIDInfo        = &ParserData->ReportIDSizes[0];			
 | 
			
		||||
	uint16_t              UsageList[HID_USAGE_STACK_DEPTH];
 | 
			
		||||
	uint8_t               UsageListSize          = 0;
 | 
			
		||||
	uint8_t               UsageListSize           = 0;
 | 
			
		||||
	HID_MinMax_t          UsageMinMax             = {0, 0};
 | 
			
		||||
 | 
			
		||||
	memset(ParserData,       0x00, sizeof(HID_ReportInfo_t));
 | 
			
		||||
	memset(CurrStateTable,   0x00, sizeof(HID_StateTable_t));
 | 
			
		||||
| 
						 | 
				
			
			@ -157,10 +158,10 @@ uint8_t USB_ProcessHIDReport(const uint8_t* ReportData, uint16_t ReportSize, HID
 | 
			
		|||
				UsageList[UsageListSize++] = ReportItemData;
 | 
			
		||||
				break;
 | 
			
		||||
			case (TYPE_LOCAL | TAG_LOCAL_USAGEMIN):
 | 
			
		||||
				CurrStateTable->Attributes.Usage.MinMax.Minimum = ReportItemData;
 | 
			
		||||
				UsageMinMax.Minimum = ReportItemData;
 | 
			
		||||
				break;
 | 
			
		||||
			case (TYPE_LOCAL | TAG_LOCAL_USAGEMAX):
 | 
			
		||||
				CurrStateTable->Attributes.Usage.MinMax.Maximum = ReportItemData;
 | 
			
		||||
				UsageMinMax.Maximum = ReportItemData;
 | 
			
		||||
				break;
 | 
			
		||||
			case (TYPE_MAIN | TAG_MAIN_COLLECTION):
 | 
			
		||||
				if (CurrCollectionPath == NULL)
 | 
			
		||||
| 
						 | 
				
			
			@ -196,6 +197,10 @@ uint8_t USB_ProcessHIDReport(const uint8_t* ReportData, uint16_t ReportSize, HID
 | 
			
		|||
					  
 | 
			
		||||
					UsageListSize--;
 | 
			
		||||
				}
 | 
			
		||||
				else if (UsageMinMax.Minimum <= UsageMinMax.Maximum)
 | 
			
		||||
				{
 | 
			
		||||
					CurrCollectionPath->Usage.Usage = UsageMinMax.Minimum++;
 | 
			
		||||
				}
 | 
			
		||||
				
 | 
			
		||||
				break;
 | 
			
		||||
			case (TYPE_MAIN | TAG_MAIN_ENDCOLLECTION):
 | 
			
		||||
| 
						 | 
				
			
			@ -228,7 +233,11 @@ uint8_t USB_ProcessHIDReport(const uint8_t* ReportData, uint16_t ReportSize, HID
 | 
			
		|||
						  
 | 
			
		||||
						UsageListSize--;
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
					else if (UsageMinMax.Minimum <= UsageMinMax.Maximum)
 | 
			
		||||
					{
 | 
			
		||||
						CurrCollectionPath->Usage.Usage = UsageMinMax.Minimum++;
 | 
			
		||||
					}
 | 
			
		||||
				
 | 
			
		||||
					uint8_t ItemTag = (HIDReportItem & TAG_MASK);
 | 
			
		||||
 | 
			
		||||
					if (ItemTag == TAG_MAIN_INPUT)
 | 
			
		||||
| 
						 | 
				
			
			@ -262,9 +271,9 @@ uint8_t USB_ProcessHIDReport(const uint8_t* ReportData, uint16_t ReportSize, HID
 | 
			
		|||
	  
 | 
			
		||||
		if ((HIDReportItem & TYPE_MASK) == TYPE_MAIN)
 | 
			
		||||
		{
 | 
			
		||||
			CurrStateTable->Attributes.Usage.MinMax.Minimum = 0;
 | 
			
		||||
			CurrStateTable->Attributes.Usage.MinMax.Maximum = 0;
 | 
			
		||||
			UsageListSize = 0;
 | 
			
		||||
			UsageMinMax.Minimum = 0;
 | 
			
		||||
			UsageMinMax.Maximum = 0;
 | 
			
		||||
			UsageListSize   = 0;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
| 
						 | 
				
			
			@ -280,6 +289,7 @@ bool USB_GetHIDReportItemInfo(const uint8_t* ReportData, HID_ReportItem_t* const
 | 
			
		|||
	uint16_t CurrentBit   = ReportItem->BitOffset;
 | 
			
		||||
	uint32_t BitMask      = (1 << 0);
 | 
			
		||||
 | 
			
		||||
	ReportItem->PreviousValue = ReportItem->Value;
 | 
			
		||||
	ReportItem->Value = 0;
 | 
			
		||||
	
 | 
			
		||||
	if (ReportItem->ReportID)
 | 
			
		||||
| 
						 | 
				
			
			@ -314,6 +324,8 @@ void USB_SetHIDReportItemInfo(uint8_t* ReportData, const HID_ReportItem_t* Repor
 | 
			
		|||
		ReportData++;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	ReportItem->PreviousValue = ReportItem->Value;
 | 
			
		||||
 | 
			
		||||
	while (DataBitsRem--)
 | 
			
		||||
	{
 | 
			
		||||
		if (ReportItem->Value & (1 << (CurrentBit % 8)))
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -71,7 +71,7 @@
 | 
			
		|||
			extern "C" {
 | 
			
		||||
		#endif
 | 
			
		||||
 | 
			
		||||
	/* Preprocessor checks and defines: */
 | 
			
		||||
	/* Macros: */
 | 
			
		||||
		#if !defined(HID_STATETABLE_STACK_DEPTH) || defined(__DOXYGEN__)
 | 
			
		||||
			/** Constant indicating the maximum stack depth of the state table. A larger state table
 | 
			
		||||
			 *  allows for more PUSH/POP report items to be nested, but consumes more memory. By default
 | 
			
		||||
| 
						 | 
				
			
			@ -124,6 +124,17 @@
 | 
			
		|||
			#define HID_MAX_REPORT_IDS            10
 | 
			
		||||
		#endif
 | 
			
		||||
 | 
			
		||||
		/** Returns the value a given HID report item (once its value has been fetched via \ref USB_GetHIDReportItemInfo())
 | 
			
		||||
		 *  left-aligned to the given data type. This allows for signed data to be interpreted correctly, by shifting the data
 | 
			
		||||
		 *  leftwards until the data's sign bit is in the correct position.
 | 
			
		||||
		 *
 | 
			
		||||
		 *  \param[in] reportitem  HID Report Item whose retrieved value is to be aligned
 | 
			
		||||
		 *  \param[in] type  Data type to align the HID report item's value to
 | 
			
		||||
		 *
 | 
			
		||||
		 *  \return Left-aligned data of the given report item's pre-retrived value for the given datatype
 | 
			
		||||
		 */
 | 
			
		||||
		#define HID_ALIGN_DATA(reportitem, type) ((type)(reportitem->Value << (sizeof(type) - reportitem->Attributes.BitSize)))
 | 
			
		||||
 | 
			
		||||
	/* Public Interface - May be used in end-application: */
 | 
			
		||||
		/* Enums: */			
 | 
			
		||||
			/** Enum for the possible error codes in the return value of the \ref USB_ProcessHIDReport() function */
 | 
			
		||||
| 
						 | 
				
			
			@ -160,7 +171,6 @@
 | 
			
		|||
			{
 | 
			
		||||
				uint16_t                     Page;   /**< Usage page of the report item. */
 | 
			
		||||
				uint16_t                     Usage;  /**< Usage of the report item. */
 | 
			
		||||
				HID_MinMax_t                 MinMax; /**< Usage minimum and maximum of the report item. */
 | 
			
		||||
			} HID_Usage_t;
 | 
			
		||||
 | 
			
		||||
			/** Type define for a COLLECTION object. Contains the collection attributes and a reference to the
 | 
			
		||||
| 
						 | 
				
			
			@ -196,6 +206,7 @@
 | 
			
		|||
				HID_ReportItem_Attributes_t  Attributes;     /**< Report item attributes. */
 | 
			
		||||
							
 | 
			
		||||
				uint32_t                     Value;          /**< Current value of the report item. */
 | 
			
		||||
				uint32_t                     PreviousValue;  /**< Previous value of the report item. */ 
 | 
			
		||||
			} HID_ReportItem_t;
 | 
			
		||||
			
 | 
			
		||||
			/** Type define for a report item size information structure */
 | 
			
		||||
| 
						 | 
				
			
			@ -243,6 +254,9 @@
 | 
			
		|||
			/** Extracts the given report item's value out of the given HID report and places it into the Value
 | 
			
		||||
			 *  member of the report item's \ref HID_ReportItem_t structure.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  When called, this copies the report item's Value element to it's PreviousValue element for easy
 | 
			
		||||
			 *  checking to see if an item's value has changed before processing a report.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \param[in] ReportData  Buffer containing an IN or FEATURE report from an attached device
 | 
			
		||||
			 *  \param[in,out] ReportItem  Pointer to the report item of interest in a \ref HID_ReportInfo_t ReportItem array
 | 
			
		||||
			 *
 | 
			
		||||
| 
						 | 
				
			
			@ -256,6 +270,9 @@
 | 
			
		|||
			 *  buffer. The report buffer is assumed to have the appropriate bits cleared before calling
 | 
			
		||||
			 *  this function (i.e., the buffer should be explicitly cleared before report values are added).
 | 
			
		||||
			 *
 | 
			
		||||
			 *  When called, this copies the report item's Value element to it's PreviousValue element for easy
 | 
			
		||||
			 *  checking to see if an item's value has changed before sending a report.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  If the device has multiple HID reports, the first byte in the report is set to the report ID of the given item.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \param[out] ReportData  Buffer holding the current OUT or FEATURE report data
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue