1*12ccb71bSMatthias Ringwald /* 2*12ccb71bSMatthias Ringwald * Copyright (C) 2017 BlueKitchen GmbH 3*12ccb71bSMatthias Ringwald * 4*12ccb71bSMatthias Ringwald * Redistribution and use in source and binary forms, with or without 5*12ccb71bSMatthias Ringwald * modification, are permitted provided that the following conditions 6*12ccb71bSMatthias Ringwald * are met: 7*12ccb71bSMatthias Ringwald * 8*12ccb71bSMatthias Ringwald * 1. Redistributions of source code must retain the above copyright 9*12ccb71bSMatthias Ringwald * notice, this list of conditions and the following disclaimer. 10*12ccb71bSMatthias Ringwald * 2. Redistributions in binary form must reproduce the above copyright 11*12ccb71bSMatthias Ringwald * notice, this list of conditions and the following disclaimer in the 12*12ccb71bSMatthias Ringwald * documentation and/or other materials provided with the distribution. 13*12ccb71bSMatthias Ringwald * 3. Neither the name of the copyright holders nor the names of 14*12ccb71bSMatthias Ringwald * contributors may be used to endorse or promote products derived 15*12ccb71bSMatthias Ringwald * from this software without specific prior written permission. 16*12ccb71bSMatthias Ringwald * 4. Any redistribution, use, or modification is done solely for 17*12ccb71bSMatthias Ringwald * personal benefit and not for any commercial purpose or for 18*12ccb71bSMatthias Ringwald * monetary gain. 19*12ccb71bSMatthias Ringwald * 20*12ccb71bSMatthias Ringwald * THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS 21*12ccb71bSMatthias Ringwald * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22*12ccb71bSMatthias Ringwald * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 23*12ccb71bSMatthias Ringwald * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MATTHIAS 24*12ccb71bSMatthias Ringwald * RINGWALD OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 25*12ccb71bSMatthias Ringwald * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 26*12ccb71bSMatthias Ringwald * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 27*12ccb71bSMatthias Ringwald * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 28*12ccb71bSMatthias Ringwald * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 29*12ccb71bSMatthias Ringwald * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF 30*12ccb71bSMatthias Ringwald * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31*12ccb71bSMatthias Ringwald * SUCH DAMAGE. 32*12ccb71bSMatthias Ringwald * 33*12ccb71bSMatthias Ringwald * Please inquire about commercial licensing options at 34*12ccb71bSMatthias Ringwald * [email protected] 35*12ccb71bSMatthias Ringwald * 36*12ccb71bSMatthias Ringwald */ 37*12ccb71bSMatthias Ringwald 38*12ccb71bSMatthias Ringwald /* 39*12ccb71bSMatthias Ringwald * btstack_hid_parser.h 40*12ccb71bSMatthias Ringwald * 41*12ccb71bSMatthias Ringwald * Single-pass HID Report Parser: HID Report is directly parsed without preprocessing HID Descriptor to minimize memory 42*12ccb71bSMatthias Ringwald */ 43*12ccb71bSMatthias Ringwald 44*12ccb71bSMatthias Ringwald #ifndef __BTSTACK_HID_PARSER_H 45*12ccb71bSMatthias Ringwald #define __BTSTACK_HID_PARSER_H 46*12ccb71bSMatthias Ringwald 47*12ccb71bSMatthias Ringwald #include <stdint.h> 48*12ccb71bSMatthias Ringwald 49*12ccb71bSMatthias Ringwald #if defined __cplusplus 50*12ccb71bSMatthias Ringwald extern "C" { 51*12ccb71bSMatthias Ringwald #endif 52*12ccb71bSMatthias Ringwald 53*12ccb71bSMatthias Ringwald typedef struct { 54*12ccb71bSMatthias Ringwald int32_t item_value; 55*12ccb71bSMatthias Ringwald uint16_t item_size; 56*12ccb71bSMatthias Ringwald uint8_t item_type; 57*12ccb71bSMatthias Ringwald uint8_t item_tag; 58*12ccb71bSMatthias Ringwald uint8_t data_size; 59*12ccb71bSMatthias Ringwald } hid_descriptor_item_t; 60*12ccb71bSMatthias Ringwald 61*12ccb71bSMatthias Ringwald typedef enum { 62*12ccb71bSMatthias Ringwald BTSTACK_HID_REPORT_TYPE_OTHER = 0x0, 63*12ccb71bSMatthias Ringwald BTSTACK_HID_REPORT_TYPE_INPUT, 64*12ccb71bSMatthias Ringwald BTSTACK_HID_REPORT_TYPE_OUTPUT, 65*12ccb71bSMatthias Ringwald BTSTACK_HID_REPORT_TYPE_FEATURE, 66*12ccb71bSMatthias Ringwald } btstack_hid_report_type_t; 67*12ccb71bSMatthias Ringwald 68*12ccb71bSMatthias Ringwald typedef enum { 69*12ccb71bSMatthias Ringwald BTSTACK_HID_PARSER_SCAN_FOR_REPORT_ITEM, 70*12ccb71bSMatthias Ringwald BTSTACK_HID_PARSER_USAGES_AVAILABLE, 71*12ccb71bSMatthias Ringwald BTSTACK_HID_PARSER_COMPLETE, 72*12ccb71bSMatthias Ringwald } btstack_hid_parser_state_t; 73*12ccb71bSMatthias Ringwald 74*12ccb71bSMatthias Ringwald typedef struct { 75*12ccb71bSMatthias Ringwald 76*12ccb71bSMatthias Ringwald // Descriptor 77*12ccb71bSMatthias Ringwald const uint8_t * descriptor; 78*12ccb71bSMatthias Ringwald uint16_t descriptor_len; 79*12ccb71bSMatthias Ringwald 80*12ccb71bSMatthias Ringwald // Report 81*12ccb71bSMatthias Ringwald btstack_hid_report_type_t report_type; 82*12ccb71bSMatthias Ringwald const uint8_t * report; 83*12ccb71bSMatthias Ringwald uint16_t report_len; 84*12ccb71bSMatthias Ringwald 85*12ccb71bSMatthias Ringwald // State 86*12ccb71bSMatthias Ringwald btstack_hid_parser_state_t state; 87*12ccb71bSMatthias Ringwald 88*12ccb71bSMatthias Ringwald hid_descriptor_item_t descriptor_item; 89*12ccb71bSMatthias Ringwald 90*12ccb71bSMatthias Ringwald uint16_t descriptor_pos; 91*12ccb71bSMatthias Ringwald uint16_t report_pos_in_bit; 92*12ccb71bSMatthias Ringwald 93*12ccb71bSMatthias Ringwald // usage pos and usage_page after last main item, used to find next usage 94*12ccb71bSMatthias Ringwald uint16_t usage_pos; 95*12ccb71bSMatthias Ringwald uint16_t usage_page; 96*12ccb71bSMatthias Ringwald 97*12ccb71bSMatthias Ringwald // usage generator 98*12ccb71bSMatthias Ringwald uint32_t usage_minimum; 99*12ccb71bSMatthias Ringwald uint32_t usage_maximum; 100*12ccb71bSMatthias Ringwald uint16_t available_usages; 101*12ccb71bSMatthias Ringwald uint8_t required_usages; 102*12ccb71bSMatthias Ringwald uint8_t active_record; 103*12ccb71bSMatthias Ringwald uint8_t have_usage_min; 104*12ccb71bSMatthias Ringwald uint8_t have_usage_max; 105*12ccb71bSMatthias Ringwald 106*12ccb71bSMatthias Ringwald // global 107*12ccb71bSMatthias Ringwald int32_t global_logical_minimum; 108*12ccb71bSMatthias Ringwald int32_t global_logical_maximum; 109*12ccb71bSMatthias Ringwald uint16_t global_usage_page; 110*12ccb71bSMatthias Ringwald uint8_t global_report_size; 111*12ccb71bSMatthias Ringwald uint8_t global_report_count; 112*12ccb71bSMatthias Ringwald uint8_t global_report_id; 113*12ccb71bSMatthias Ringwald } btstack_hid_parser_t; 114*12ccb71bSMatthias Ringwald 115*12ccb71bSMatthias Ringwald /* API_START */ 116*12ccb71bSMatthias Ringwald 117*12ccb71bSMatthias Ringwald /** 118*12ccb71bSMatthias Ringwald * @brief Initialize HID Parser. 119*12ccb71bSMatthias Ringwald * @param parser state 120*12ccb71bSMatthias Ringwald * @param hid_descriptor 121*12ccb71bSMatthias Ringwald * @param hid_descriptor_len 122*12ccb71bSMatthias Ringwald * @param hid_report_type 123*12ccb71bSMatthias Ringwald * @param hid_report 124*12ccb71bSMatthias Ringwald * @param hid_report_len 125*12ccb71bSMatthias Ringwald */ 126*12ccb71bSMatthias Ringwald void btstack_hid_parser_init(btstack_hid_parser_t * parser, const uint8_t * hid_descriptor, uint16_t hid_descriptor_len, btstack_hid_report_type_t hid_report_type, const uint8_t * hid_report, uint16_t hid_report_len); 127*12ccb71bSMatthias Ringwald 128*12ccb71bSMatthias Ringwald /** 129*12ccb71bSMatthias Ringwald * @brief Checks if more fields are available 130*12ccb71bSMatthias Ringwald * @param parser 131*12ccb71bSMatthias Ringwald */ 132*12ccb71bSMatthias Ringwald int btstack_hid_parser_has_more(btstack_hid_parser_t * parser); 133*12ccb71bSMatthias Ringwald 134*12ccb71bSMatthias Ringwald /** 135*12ccb71bSMatthias Ringwald * @brief Get next field 136*12ccb71bSMatthias Ringwald * @param parser 137*12ccb71bSMatthias Ringwald * @param usage_page 138*12ccb71bSMatthias Ringwald * @param usage 139*12ccb71bSMatthias Ringwald * @param value provided in HID report 140*12ccb71bSMatthias Ringwald */ 141*12ccb71bSMatthias Ringwald void btstack_hid_parser_get_field(btstack_hid_parser_t * parser, uint16_t * usage_page, uint16_t * usage, int32_t * value); 142*12ccb71bSMatthias Ringwald 143*12ccb71bSMatthias Ringwald /* API_END */ 144*12ccb71bSMatthias Ringwald 145*12ccb71bSMatthias Ringwald #if defined __cplusplus 146*12ccb71bSMatthias Ringwald } 147*12ccb71bSMatthias Ringwald #endif 148*12ccb71bSMatthias Ringwald 149*12ccb71bSMatthias Ringwald #endif // __BTSTACK_HID_PARSER_H 150