xref: /btstack/src/btstack_hid_parser.h (revision 12ccb71b494e77efac73450222b5c4f45658c543)
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