/**
******************************************************************************
* @file usbh_hid_parser.c
* @author MCD Application Team
* @brief This file is the HID Layer Handlers for USB Host HID class.
******************************************************************************
* @attention
*
*
© Copyright (c) 2015 STMicroelectronics.
* All rights reserved.
*
* This software component is licensed by ST under Ultimate Liberty license
* SLA0044, the "License"; You may not use this file except in compliance with
* the License. You may obtain a copy of the License at:
* www.st.com/SLA0044
*
******************************************************************************
*/
/* BSPDependencies
- "stm32xxxxx_{eval}{discovery}{nucleo_144}.c"
- "stm32xxxxx_{eval}{discovery}_io.c"
- "stm32xxxxx_{eval}{discovery}{adafruit}_lcd.c"
- "stm32xxxxx_{eval}{discovery}_sdram.c"
EndBSPDependencies */
/* Includes ------------------------------------------------------------------*/
#include "usbh_hid_parser.h"
/** @addtogroup USBH_LIB
* @{
*/
/** @addtogroup USBH_CLASS
* @{
*/
/** @addtogroup USBH_HID_CLASS
* @{
*/
/** @defgroup USBH_HID_PARSER
* @brief This file includes HID parsers for USB Host HID class.
* @{
*/
/** @defgroup USBH_HID_PARSER_Private_TypesDefinitions
* @{
*/
/**
* @}
*/
/** @defgroup USBH_HID_PARSER_Private_Defines
* @{
*/
/**
* @}
*/
/** @defgroup USBH_HID_PARSER_Private_Macros
* @{
*/
/**
* @}
*/
/** @defgroup USBH_HID_PARSER_Private_FunctionPrototypes
* @{
*/
/**
* @}
*/
/** @defgroup USBH_HID_PARSER_Private_Variables
* @{
*/
/**
* @}
*/
/** @defgroup USBH_HID_PARSER_Private_Functions
* @{
*/
/**
* @brief HID_ReadItem
* The function read a report item.
* @param ri: report item
* @param ndx: report index
* @retval status (0 : fail / otherwise: item value)
*/
uint32_t HID_ReadItem(HID_Report_ItemTypedef *ri, uint8_t ndx)
{
uint32_t val = 0U;
uint32_t x = 0U;
uint32_t bofs;
uint8_t *data = ri->data;
uint8_t shift = ri->shift;
/* get the logical value of the item */
/* if this is an array, wee may need to offset ri->data.*/
if (ri->count > 0U)
{
/* If app tries to read outside of the array. */
if (ri->count <= ndx)
{
return (0U);
}
/* calculate bit offset */
bofs = ndx * ri->size;
bofs += shift;
/* calculate byte offset + shift pair from bit offset. */
data += bofs / 8U;
shift = (uint8_t)(bofs % 8U);
}
/* read data bytes in little endian order */
for (x = 0U; x < ((ri->size & 0x7U) ? (ri->size / 8U) + 1U : (ri->size / 8U)); x++)
{
val = (uint32_t)((uint32_t)(*data) << (x * 8U));
}
val = (val >> shift) & ((1U << ri->size) - 1U);
if (val < ri->logical_min || val > ri->logical_max)
{
return (0U);
}
/* convert logical value to physical value */
/* See if the number is negative or not. */
if ((ri->sign) && (val & (1U << (ri->size - 1U))))
{
/* yes, so sign extend value to 32 bits. */
uint32_t vs = (uint32_t)((0xffffffffU & ~((1U << (ri->size)) - 1U)) | val);
if (ri->resolution == 1U)
{
return ((uint32_t)vs);
}
return ((uint32_t)(vs * ri->resolution));
}
else
{
if (ri->resolution == 1U)
{
return (val);
}
return (val * ri->resolution);
}
}
/**
* @brief HID_WriteItem
* The function write a report item.
* @param ri: report item
* @param ndx: report index
* @retval status (1: fail/ 0 : Ok)
*/
uint32_t HID_WriteItem(HID_Report_ItemTypedef *ri, uint32_t value, uint8_t ndx)
{
uint32_t x;
uint32_t mask;
uint32_t bofs;
uint8_t *data = ri->data;
uint8_t shift = ri->shift;
if (value < ri->physical_min || value > ri->physical_max)
{
return (1U);
}
/* if this is an array, wee may need to offset ri->data.*/
if (ri->count > 0U)
{
/* If app tries to read outside of the array. */
if (ri->count >= ndx)
{
return (0U);
}
/* calculate bit offset */
bofs = ndx * ri->size;
bofs += shift;
/* calculate byte offset + shift pair from bit offset. */
data += bofs / 8U;
shift = (uint8_t)(bofs % 8U);
}
/* Convert physical value to logical value. */
if (ri->resolution != 1U)
{
value = value / ri->resolution;
}
/* Write logical value to report in little endian order. */
mask = (1U << ri->size) - 1U;
value = (value & mask) << shift;
for (x = 0U; x < ((ri->size & 0x7U) ? (ri->size / 8U) + 1U : (ri->size / 8U)); x++)
{
*(ri->data + x) = (uint8_t)((*(ri->data + x) & ~(mask >> (x * 8U))) |
((value >> (x * 8U)) & (mask >> (x * 8U))));
}
return 0U;
}
/**
* @}
*/
/**
* @}
*/
/**
* @}
*/
/**
* @}
*/
/**
* @}
*/
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/