HID Parser API

src/btstack_hid_parser.h : Single-pass HID Report Parser: HID Report is directly parsed without preprocessing HID Descriptor to minimize memory.

// HID Descriptor Iterator

/**
 * @brief Init HID Descriptor iterator
 * @param iterator
 * @param hid_descriptor
 * @param hid_descriptor_len
 */
void btstack_hid_descriptor_iterator_init(btstack_hid_descriptor_iterator_t * iterator, const uint8_t * hid_descriptor, uint16_t hid_descriptor_len);

/**
 * @brief Check if HID Descriptor Items are available
 * @param iterator
 * @return
 */
bool btstack_hid_descriptor_iterator_has_more(btstack_hid_descriptor_iterator_t * iterator);

/**
 * @brief Get next HID Descriptor Item
 * @param iterator
 * @return
 */
const hid_descriptor_item_t * btstack_hid_descriptor_iterator_get_item(btstack_hid_descriptor_iterator_t * iterator);

/**
 * @brief Returns if HID Descriptor was well formed
 * @param iterator
 * @return
 */
bool btstack_hid_descriptor_iterator_valid(btstack_hid_descriptor_iterator_t * iterator);


// HID Descriptor Usage Iterator

/**
 * @brief Initialize usages iterator for HID Descriptor and report type
 * @param parser
 * @param hid_descriptor
 * @param hid_descriptor_len
 * @param hid_report_type
 */
void btstack_hid_usage_iterator_init(btstack_hid_usage_iterator_t * iterator, const uint8_t * hid_descriptor, uint16_t hid_descriptor_len, hid_report_type_t hid_report_type);

/**
 * @brief Checks if more usages are available
 * @param parser
 */
bool btstack_hid_usage_iterator_has_more(btstack_hid_usage_iterator_t * iterator);

/**
 * @brief Get current usage item
 * @param parser
 * @param item
 */
void btstack_hid_usage_iterator_get_item(btstack_hid_usage_iterator_t * iterator, btstack_hid_usage_item_t * item);


// HID Report Iterator

/**
 * @brief Initialize HID Parser.
 * @param parser state 
 * @param hid_descriptor
 * @param hid_descriptor_len
 * @param hid_report_type
 * @param hid_report
 * @param hid_report_len
 */
void btstack_hid_parser_init(btstack_hid_parser_t * parser, const uint8_t * hid_descriptor, uint16_t hid_descriptor_len, hid_report_type_t hid_report_type, const uint8_t * hid_report, uint16_t hid_report_len);

/**
 * @brief Checks if more fields are available
 * @param parser
 */
bool btstack_hid_parser_has_more(btstack_hid_parser_t * parser);

/**
 * @brief Get next field
 * @param parser
 * @param usage_page
 * @param usage
 * @param value provided in HID report
 */
void btstack_hid_parser_get_field(btstack_hid_parser_t * parser, uint16_t * usage_page, uint16_t * usage, int32_t * value);


/**
 * @brief Parses descriptor and returns report size for given report ID and report type
 * @param report_id or HID_REPORT_ID_UNDEFINED
 * @param report_type
 * @param hid_descriptor
 * @param hid_descriptor_len
 * @return report size in bytes or 0 on parsing error
 */
int btstack_hid_get_report_size_for_id(uint16_t report_id, hid_report_type_t report_type, const uint8_t *hid_descriptor,
                                       uint16_t hid_descriptor_len);

/**
 * @brief Parses descriptor and returns status for given report ID
 * @param report_id
 * @param hid_descriptor
 * @param hid_descriptor_len
 * @return status for report id
 */
hid_report_id_status_t btstack_hid_report_id_valid(uint16_t report_id, const uint8_t * hid_descriptor, uint16_t hid_descriptor_len);

/**
 * @brief Parses descriptor and returns true if report ID found
 * @param hid_descriptor
 * @param hid_descriptor_len
 * @return true if report ID declared in descriptor
 */
bool btstack_hid_report_id_declared(const uint8_t *hid_descriptor, uint16_t hid_descriptor_len);