xref: /btstack/test/hid_parser/hid_parser_test.cpp (revision 0faf80ae28f04c0c1c579e1486d211f9870bf4b5)
11d3bd1e5SMatthias Ringwald 
21d3bd1e5SMatthias Ringwald // *****************************************************************************
31d3bd1e5SMatthias Ringwald //
41d3bd1e5SMatthias Ringwald // HID Parser Test
51d3bd1e5SMatthias Ringwald //
61d3bd1e5SMatthias Ringwald // *****************************************************************************
71d3bd1e5SMatthias Ringwald 
81d3bd1e5SMatthias Ringwald 
91d3bd1e5SMatthias Ringwald #include <stdint.h>
101d3bd1e5SMatthias Ringwald #include <stdio.h>
111d3bd1e5SMatthias Ringwald #include <stdlib.h>
121d3bd1e5SMatthias Ringwald #include <string.h>
131d3bd1e5SMatthias Ringwald 
141d3bd1e5SMatthias Ringwald #include "CppUTest/TestHarness.h"
151d3bd1e5SMatthias Ringwald #include "CppUTest/CommandLineTestRunner.h"
161d3bd1e5SMatthias Ringwald 
171d3bd1e5SMatthias Ringwald #include "btstack_hid_parser.h"
181d3bd1e5SMatthias Ringwald #include "hci_dump_posix_fs.h"
196707c7a1SMatthias Ringwald #include "hci_dump_posix_stdout.h"
201d3bd1e5SMatthias Ringwald 
211d3bd1e5SMatthias Ringwald const uint8_t mouse_descriptor_without_report_id[] = {
221d3bd1e5SMatthias Ringwald     0x05, 0x01, /*  Usage Page (Desktop),               */
231d3bd1e5SMatthias Ringwald     0x09, 0x02, /*  Usage (Mouse),                      */
241d3bd1e5SMatthias Ringwald     0xA1, 0x01, /*  Collection (Application),           */
251d3bd1e5SMatthias Ringwald     0x09, 0x01, /*      Usage (Pointer),                */
261d3bd1e5SMatthias Ringwald     0xA0,       /*      Collection (Physical),          */
271d3bd1e5SMatthias Ringwald     0x05, 0x09, /*          Usage Page (Button),        */
281d3bd1e5SMatthias Ringwald     0x19, 0x01, /*          Usage Minimum (01h),        */
291d3bd1e5SMatthias Ringwald     0x29, 0x03, /*          Usage Maximum (03h),        */
301d3bd1e5SMatthias Ringwald     0x14,       /*          Logical Minimum (0),        */
311d3bd1e5SMatthias Ringwald     0x25, 0x01, /*          Logical Maximum (1),        */
321d3bd1e5SMatthias Ringwald     0x75, 0x01, /*          Report Size (1),            */
331d3bd1e5SMatthias Ringwald     0x95, 0x03, /*          Report Count (3),           */
341d3bd1e5SMatthias Ringwald     0x81, 0x02, /*          Input (Variable),           */
351d3bd1e5SMatthias Ringwald     0x75, 0x05, /*          Report Size (5),            */
361d3bd1e5SMatthias Ringwald     0x95, 0x01, /*          Report Count (1),           */
371d3bd1e5SMatthias Ringwald     0x81, 0x01, /*          Input (Constant),           */
381d3bd1e5SMatthias Ringwald     0x05, 0x01, /*          Usage Page (Desktop),       */
391d3bd1e5SMatthias Ringwald     0x09, 0x30, /*          Usage (X),                  */
401d3bd1e5SMatthias Ringwald     0x09, 0x31, /*          Usage (Y),                  */
411d3bd1e5SMatthias Ringwald     0x15, 0x81, /*          Logical Minimum (-127),     */
421d3bd1e5SMatthias Ringwald     0x25, 0x7F, /*          Logical Maximum (127),      */
431d3bd1e5SMatthias Ringwald     0x75, 0x08, /*          Report Size (8),            */
441d3bd1e5SMatthias Ringwald     0x95, 0x02, /*          Report Count (2),           */
451d3bd1e5SMatthias Ringwald     0x81, 0x06, /*          Input (Variable, Relative), */
461d3bd1e5SMatthias Ringwald     0xC0,       /*      End Collection,                 */
471d3bd1e5SMatthias Ringwald     0xC0        /*  End Collection                      */
481d3bd1e5SMatthias Ringwald };
491d3bd1e5SMatthias Ringwald 
501d3bd1e5SMatthias Ringwald const uint8_t mouse_descriptor_with_report_id[] = {
511d3bd1e5SMatthias Ringwald     0x05, 0x01, /*  Usage Page (Desktop),               */
521d3bd1e5SMatthias Ringwald     0x09, 0x02, /*  Usage (Mouse),                      */
531d3bd1e5SMatthias Ringwald     0xA1, 0x01, /*  Collection (Application),           */
541d3bd1e5SMatthias Ringwald 
551d3bd1e5SMatthias Ringwald     0x85,  0x01,                    // Report ID 1
561d3bd1e5SMatthias Ringwald 
571d3bd1e5SMatthias Ringwald     0x09, 0x01, /*      Usage (Pointer),                */
581d3bd1e5SMatthias Ringwald     0xA0,       /*      Collection (Physical),          */
591d3bd1e5SMatthias Ringwald     0x05, 0x09, /*          Usage Page (Button),        */
601d3bd1e5SMatthias Ringwald     0x19, 0x01, /*          Usage Minimum (01h),        */
611d3bd1e5SMatthias Ringwald     0x29, 0x03, /*          Usage Maximum (03h),        */
621d3bd1e5SMatthias Ringwald     0x14,       /*          Logical Minimum (0),        */
631d3bd1e5SMatthias Ringwald     0x25, 0x01, /*          Logical Maximum (1),        */
641d3bd1e5SMatthias Ringwald     0x75, 0x01, /*          Report Size (1),            */
651d3bd1e5SMatthias Ringwald     0x95, 0x03, /*          Report Count (3),           */
661d3bd1e5SMatthias Ringwald     0x81, 0x02, /*          Input (Variable),           */
671d3bd1e5SMatthias Ringwald     0x75, 0x05, /*          Report Size (5),            */
681d3bd1e5SMatthias Ringwald     0x95, 0x01, /*          Report Count (1),           */
691d3bd1e5SMatthias Ringwald     0x81, 0x01, /*          Input (Constant),           */
701d3bd1e5SMatthias Ringwald     0x05, 0x01, /*          Usage Page (Desktop),       */
711d3bd1e5SMatthias Ringwald     0x09, 0x30, /*          Usage (X),                  */
721d3bd1e5SMatthias Ringwald     0x09, 0x31, /*          Usage (Y),                  */
731d3bd1e5SMatthias Ringwald     0x15, 0x81, /*          Logical Minimum (-127),     */
741d3bd1e5SMatthias Ringwald     0x25, 0x7F, /*          Logical Maximum (127),      */
751d3bd1e5SMatthias Ringwald     0x75, 0x08, /*          Report Size (8),            */
761d3bd1e5SMatthias Ringwald     0x95, 0x02, /*          Report Count (2),           */
771d3bd1e5SMatthias Ringwald     0x81, 0x06, /*          Input (Variable, Relative), */
781d3bd1e5SMatthias Ringwald     0xC0,       /*      End Collection,                 */
791d3bd1e5SMatthias Ringwald     0xC0        /*  End Collection                      */
801d3bd1e5SMatthias Ringwald };
811d3bd1e5SMatthias Ringwald 
821d3bd1e5SMatthias Ringwald // from USB HID Specification 1.1, Appendix B.1
831d3bd1e5SMatthias Ringwald const uint8_t hid_descriptor_keyboard_boot_mode[] = {
841d3bd1e5SMatthias Ringwald 
851d3bd1e5SMatthias Ringwald     0x05, 0x01,                    // Usage Page (Generic Desktop)
861d3bd1e5SMatthias Ringwald     0x09, 0x06,                    // Usage (Keyboard)
871d3bd1e5SMatthias Ringwald     0xa1, 0x01,                    // Collection (Application)
881d3bd1e5SMatthias Ringwald 
891d3bd1e5SMatthias Ringwald     // Modifier byte
901d3bd1e5SMatthias Ringwald 
911d3bd1e5SMatthias Ringwald     0x75, 0x01,                    //   Report Size (1)
921d3bd1e5SMatthias Ringwald     0x95, 0x08,                    //   Report Count (8)
931d3bd1e5SMatthias Ringwald     0x05, 0x07,                    //   Usage Page (Key codes)
941d3bd1e5SMatthias Ringwald     0x19, 0xe0,                    //   Usage Minimum (Keyboard LeftControl)
951d3bd1e5SMatthias Ringwald     0x29, 0xe7,                    //   Usage Maxium (Keyboard Right GUI)
961d3bd1e5SMatthias Ringwald     0x15, 0x00,                    //   Logical Minimum (0)
971d3bd1e5SMatthias Ringwald     0x25, 0x01,                    //   Logical Maximum (1)
981d3bd1e5SMatthias Ringwald     0x81, 0x02,                    //   Input (Data, Variable, Absolute)
991d3bd1e5SMatthias Ringwald 
1001d3bd1e5SMatthias Ringwald     // Reserved byte
1011d3bd1e5SMatthias Ringwald 
1021d3bd1e5SMatthias Ringwald     0x75, 0x01,                    //   Report Size (1)
1031d3bd1e5SMatthias Ringwald     0x95, 0x08,                    //   Report Count (8)
1041d3bd1e5SMatthias Ringwald     0x81, 0x03,                    //   Input (Constant, Variable, Absolute)
1051d3bd1e5SMatthias Ringwald 
1061d3bd1e5SMatthias Ringwald     // LED report + padding
1071d3bd1e5SMatthias Ringwald 
1081d3bd1e5SMatthias Ringwald     0x95, 0x05,                    //   Report Count (5)
1091d3bd1e5SMatthias Ringwald     0x75, 0x01,                    //   Report Size (1)
1101d3bd1e5SMatthias Ringwald     0x05, 0x08,                    //   Usage Page (LEDs)
1111d3bd1e5SMatthias Ringwald     0x19, 0x01,                    //   Usage Minimum (Num Lock)
1121d3bd1e5SMatthias Ringwald     0x29, 0x05,                    //   Usage Maxium (Kana)
1131d3bd1e5SMatthias Ringwald     0x91, 0x02,                    //   Output (Data, Variable, Absolute)
1141d3bd1e5SMatthias Ringwald 
1151d3bd1e5SMatthias Ringwald     0x95, 0x01,                    //   Report Count (1)
1161d3bd1e5SMatthias Ringwald     0x75, 0x03,                    //   Report Size (3)
1171d3bd1e5SMatthias Ringwald     0x91, 0x03,                    //   Output (Constant, Variable, Absolute)
1181d3bd1e5SMatthias Ringwald 
1191d3bd1e5SMatthias Ringwald     // Keycodes
1201d3bd1e5SMatthias Ringwald 
1211d3bd1e5SMatthias Ringwald     0x95, 0x06,                    //   Report Count (6)
1221d3bd1e5SMatthias Ringwald     0x75, 0x08,                    //   Report Size (8)
1231d3bd1e5SMatthias Ringwald     0x15, 0x00,                    //   Logical Minimum (0)
1241d3bd1e5SMatthias Ringwald     0x25, 0xff,                    //   Logical Maximum (1)
1251d3bd1e5SMatthias Ringwald     0x05, 0x07,                    //   Usage Page (Key codes)
1261d3bd1e5SMatthias Ringwald     0x19, 0x00,                    //   Usage Minimum (Reserved (no event indicated))
1271d3bd1e5SMatthias Ringwald     0x29, 0xff,                    //   Usage Maxium (Reserved)
1281d3bd1e5SMatthias Ringwald     0x81, 0x00,                    //   Input (Data, Array)
1291d3bd1e5SMatthias Ringwald 
1301d3bd1e5SMatthias Ringwald     0xc0,                          // End collection
1311d3bd1e5SMatthias Ringwald };
1321d3bd1e5SMatthias Ringwald 
1331d3bd1e5SMatthias Ringwald const uint8_t combo_descriptor_with_report_ids[] = {
1341d3bd1e5SMatthias Ringwald 
1351d3bd1e5SMatthias Ringwald     0x05, 0x01, /*  Usage Page (Desktop),               */
1361d3bd1e5SMatthias Ringwald     0x09, 0x02, /*  Usage (Mouse),                      */
1371d3bd1e5SMatthias Ringwald     0xA1, 0x01, /*  Collection (Application),           */
1381d3bd1e5SMatthias Ringwald 
1391d3bd1e5SMatthias Ringwald     0x85, 0x01, // Report ID 1
1401d3bd1e5SMatthias Ringwald 
1411d3bd1e5SMatthias Ringwald     0x09, 0x01, /*      Usage (Pointer),                */
1421d3bd1e5SMatthias Ringwald     0xA0,       /*      Collection (Physical),          */
1431d3bd1e5SMatthias Ringwald     0x05, 0x09, /*          Usage Page (Button),        */
1441d3bd1e5SMatthias Ringwald     0x19, 0x01, /*          Usage Minimum (01h),        */
1451d3bd1e5SMatthias Ringwald     0x29, 0x03, /*          Usage Maximum (03h),        */
1461d3bd1e5SMatthias Ringwald     0x14,       /*          Logical Minimum (0),        */
1471d3bd1e5SMatthias Ringwald     0x25, 0x01, /*          Logical Maximum (1),        */
1481d3bd1e5SMatthias Ringwald     0x75, 0x01, /*          Report Size (1),            */
1491d3bd1e5SMatthias Ringwald     0x95, 0x03, /*          Report Count (3),           */
1501d3bd1e5SMatthias Ringwald     0x81, 0x02, /*          Input (Variable),           */
1511d3bd1e5SMatthias Ringwald     0x75, 0x05, /*          Report Size (5),            */
1521d3bd1e5SMatthias Ringwald     0x95, 0x01, /*          Report Count (1),           */
1531d3bd1e5SMatthias Ringwald     0x81, 0x01, /*          Input (Constant),           */
1541d3bd1e5SMatthias Ringwald     0x05, 0x01, /*          Usage Page (Desktop),       */
1551d3bd1e5SMatthias Ringwald     0x09, 0x30, /*          Usage (X),                  */
1561d3bd1e5SMatthias Ringwald     0x09, 0x31, /*          Usage (Y),                  */
1571d3bd1e5SMatthias Ringwald     0x15, 0x81, /*          Logical Minimum (-127),     */
1581d3bd1e5SMatthias Ringwald     0x25, 0x7F, /*          Logical Maximum (127),      */
1591d3bd1e5SMatthias Ringwald     0x75, 0x08, /*          Report Size (8),            */
1601d3bd1e5SMatthias Ringwald     0x95, 0x02, /*          Report Count (2),           */
1611d3bd1e5SMatthias Ringwald     0x81, 0x06, /*          Input (Variable, Relative), */
1621d3bd1e5SMatthias Ringwald     0xC0,       /*      End Collection,                 */
1631d3bd1e5SMatthias Ringwald     0xC0,       /*  End Collection                      */
1641d3bd1e5SMatthias Ringwald 
1651d3bd1e5SMatthias Ringwald     0xa1, 0x01,                    // Collection (Application)
1661d3bd1e5SMatthias Ringwald 
1671d3bd1e5SMatthias Ringwald     0x85, 0x02, // Report ID 2
1681d3bd1e5SMatthias Ringwald 
1691d3bd1e5SMatthias Ringwald     // Modifier byte
1701d3bd1e5SMatthias Ringwald 
1711d3bd1e5SMatthias Ringwald     0x75, 0x01,                    //   Report Size (1)
1721d3bd1e5SMatthias Ringwald     0x95, 0x08,                    //   Report Count (8)
1731d3bd1e5SMatthias Ringwald     0x05, 0x07,                    //   Usage Page (Key codes)
1741d3bd1e5SMatthias Ringwald     0x19, 0xe0,                    //   Usage Minimum (Keyboard LeftControl)
1751d3bd1e5SMatthias Ringwald     0x29, 0xe7,                    //   Usage Maxium (Keyboard Right GUI)
1761d3bd1e5SMatthias Ringwald     0x15, 0x00,                    //   Logical Minimum (0)
1771d3bd1e5SMatthias Ringwald     0x25, 0x01,                    //   Logical Maximum (1)
1781d3bd1e5SMatthias Ringwald     0x81, 0x02,                    //   Input (Data, Variable, Absolute)
1791d3bd1e5SMatthias Ringwald 
1801d3bd1e5SMatthias Ringwald     // Reserved byte
1811d3bd1e5SMatthias Ringwald 
1821d3bd1e5SMatthias Ringwald     0x75, 0x01,                    //   Report Size (1)
1831d3bd1e5SMatthias Ringwald     0x95, 0x08,                    //   Report Count (8)
1841d3bd1e5SMatthias Ringwald     0x81, 0x03,                    //   Input (Constant, Variable, Absolute)
1851d3bd1e5SMatthias Ringwald 
1861d3bd1e5SMatthias Ringwald     // LED report + padding
1871d3bd1e5SMatthias Ringwald 
1881d3bd1e5SMatthias Ringwald     0x95, 0x05,                    //   Report Count (5)
1891d3bd1e5SMatthias Ringwald     0x75, 0x01,                    //   Report Size (1)
1901d3bd1e5SMatthias Ringwald     0x05, 0x08,                    //   Usage Page (LEDs)
1911d3bd1e5SMatthias Ringwald     0x19, 0x01,                    //   Usage Minimum (Num Lock)
1921d3bd1e5SMatthias Ringwald     0x29, 0x05,                    //   Usage Maxium (Kana)
1931d3bd1e5SMatthias Ringwald     0x91, 0x02,                    //   Output (Data, Variable, Absolute)
1941d3bd1e5SMatthias Ringwald 
1951d3bd1e5SMatthias Ringwald     0x95, 0x01,                    //   Report Count (1)
1961d3bd1e5SMatthias Ringwald     0x75, 0x03,                    //   Report Size (3)
1971d3bd1e5SMatthias Ringwald     0x91, 0x03,                    //   Output (Constant, Variable, Absolute)
1981d3bd1e5SMatthias Ringwald 
1991d3bd1e5SMatthias Ringwald     // Keycodes
2001d3bd1e5SMatthias Ringwald 
2011d3bd1e5SMatthias Ringwald     0x95, 0x06,                    //   Report Count (6)
2021d3bd1e5SMatthias Ringwald     0x75, 0x08,                    //   Report Size (8)
2031d3bd1e5SMatthias Ringwald     0x15, 0x00,                    //   Logical Minimum (0)
2041d3bd1e5SMatthias Ringwald     0x25, 0xff,                    //   Logical Maximum (1)
2051d3bd1e5SMatthias Ringwald     0x05, 0x07,                    //   Usage Page (Key codes)
2061d3bd1e5SMatthias Ringwald     0x19, 0x00,                    //   Usage Minimum (Reserved (no event indicated))
2071d3bd1e5SMatthias Ringwald     0x29, 0xff,                    //   Usage Maxium (Reserved)
2081d3bd1e5SMatthias Ringwald     0x81, 0x00,                    //   Input (Data, Array)
2091d3bd1e5SMatthias Ringwald 
2101d3bd1e5SMatthias Ringwald     0xc0,                          // En
2111d3bd1e5SMatthias Ringwald 
2121d3bd1e5SMatthias Ringwald };
2131d3bd1e5SMatthias Ringwald 
21422931ba2SRicardo Quesada // https://tank-mouse.com/
21522931ba2SRicardo Quesada const uint8_t tank_mouse_descriptor[] = {
21622931ba2SRicardo Quesada     0x05, 0x01,        // Usage Page (Generic Desktop Ctrls)
21722931ba2SRicardo Quesada     0x09, 0x02,        // Usage (Mouse)
21822931ba2SRicardo Quesada     0xA1, 0x01,        // Collection (Application)
21922931ba2SRicardo Quesada     0x85, 0x03,        //   Report ID (3)
22022931ba2SRicardo Quesada     0x09, 0x01,        //   Usage (Pointer)
22122931ba2SRicardo Quesada     0xA1, 0x00,        //   Collection (Physical)
22222931ba2SRicardo Quesada     0x05, 0x09,        //     Usage Page (Button)
22322931ba2SRicardo Quesada     0x19, 0x01,        //     Usage Minimum (0x01)
22422931ba2SRicardo Quesada     0x29, 0x03,        //     Usage Maximum (0x03)
22522931ba2SRicardo Quesada     0x15, 0x00,        //     Logical Minimum (0)
22622931ba2SRicardo Quesada     0x25, 0x01,        //     Logical Maximum (1)
22722931ba2SRicardo Quesada     0x75, 0x01,        //     Report Size (1)
22822931ba2SRicardo Quesada     0x95, 0x05,        //     Report Count (5)
22922931ba2SRicardo Quesada     0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
23022931ba2SRicardo Quesada     0x75, 0x03,        //     Report Size (3)
23122931ba2SRicardo Quesada     0x95, 0x01,        //     Report Count (1)
23222931ba2SRicardo Quesada     0x81, 0x01,        //     Input (Const,Array,Abs,No Wrap,Linear,Preferred State,No Null Position)
23322931ba2SRicardo Quesada     0x05, 0x01,        //     Usage Page (Generic Desktop Ctrls)
23422931ba2SRicardo Quesada     0x09, 0x30,        //     Usage (X)
23522931ba2SRicardo Quesada     0x09, 0x31,        //     Usage (Y)
23622931ba2SRicardo Quesada     0x16, 0x01, 0x80,  //     Logical Minimum (-32767)
23722931ba2SRicardo Quesada     0x26, 0xFF, 0x7F,  //     Logical Maximum (32767)
23822931ba2SRicardo Quesada     0x75, 0x10,        //     Report Size (16)
23922931ba2SRicardo Quesada     0x95, 0x02,        //     Report Count (2)
24022931ba2SRicardo Quesada     0x81, 0x06,        //     Input (Data,Var,Rel,No Wrap,Linear,Preferred State,No Null Position)
24122931ba2SRicardo Quesada     0x09, 0x38,        //     Usage (Wheel)
24222931ba2SRicardo Quesada     0x15, 0x81,        //     Logical Minimum (-127)
24322931ba2SRicardo Quesada     0x25, 0x7F,        //     Logical Maximum (127)
24422931ba2SRicardo Quesada     0x75, 0x08,        //     Report Size (8)
24522931ba2SRicardo Quesada     0x95, 0x01,        //     Report Count (1)
24622931ba2SRicardo Quesada     0x81, 0x06,        //     Input (Data,Var,Rel,No Wrap,Linear,Preferred State,No Null Position)
24722931ba2SRicardo Quesada     0xC0,              //   End Collection
24822931ba2SRicardo Quesada     0xC0,              // End Collection
24922931ba2SRicardo Quesada     0x06, 0x01, 0xFF,  // Usage Page (Vendor Defined 0xFF01)
25022931ba2SRicardo Quesada     0x09, 0x01,        // Usage (0x01)
25122931ba2SRicardo Quesada     0xA1, 0x01,        // Collection (Application)
25222931ba2SRicardo Quesada     0x85, 0x05,        //   Report ID (5)
25322931ba2SRicardo Quesada     0x09, 0x05,        //   Usage (0x05)
25422931ba2SRicardo Quesada     0x15, 0x00,        //   Logical Minimum (0)
25522931ba2SRicardo Quesada     0x26, 0xFF, 0x00,  //   Logical Maximum (255)
25622931ba2SRicardo Quesada     0x75, 0x08,        //   Report Size (8)
25722931ba2SRicardo Quesada     0x95, 0x04,        //   Report Count (4)
25822931ba2SRicardo Quesada     0xB1, 0x02,        //   Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
25922931ba2SRicardo Quesada     0xC0,              // End Collection
26022931ba2SRicardo Quesada     // 89 bytes
26122931ba2SRicardo Quesada };
26222931ba2SRicardo Quesada 
263*0faf80aeSRicardo Quesada // Xbox Wireless Controller FW 5.17.3202.0
264*0faf80aeSRicardo Quesada const uint8_t xbox_wireless_descriptor[] = {
265*0faf80aeSRicardo Quesada     0x05, 0x01,        // Usage Page (Generic Desktop Ctrls)
266*0faf80aeSRicardo Quesada     0x09, 0x05,        // Usage (Game Pad)
267*0faf80aeSRicardo Quesada     0xA1, 0x01,        // Collection (Application)
268*0faf80aeSRicardo Quesada     0x85, 0x01,        //   Report ID (1)
269*0faf80aeSRicardo Quesada     0x09, 0x01,        //   Usage (Pointer)
270*0faf80aeSRicardo Quesada     0xA1, 0x00,        //   Collection (Physical)
271*0faf80aeSRicardo Quesada     0x09, 0x30,        //     Usage (X)
272*0faf80aeSRicardo Quesada     0x09, 0x31,        //     Usage (Y)
273*0faf80aeSRicardo Quesada     0x15, 0x00,        //     Logical Minimum (0)
274*0faf80aeSRicardo Quesada     0x27, 0xFF, 0xFF, 0x00, 0x00,  //     Logical Maximum (65534)
275*0faf80aeSRicardo Quesada     0x95, 0x02,        //     Report Count (2)
276*0faf80aeSRicardo Quesada     0x75, 0x10,        //     Report Size (16)
277*0faf80aeSRicardo Quesada     0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
278*0faf80aeSRicardo Quesada     0xC0,              //   End Collection
279*0faf80aeSRicardo Quesada     0x09, 0x01,        //   Usage (Pointer)
280*0faf80aeSRicardo Quesada     0xA1, 0x00,        //   Collection (Physical)
281*0faf80aeSRicardo Quesada     0x09, 0x32,        //     Usage (Z)
282*0faf80aeSRicardo Quesada     0x09, 0x35,        //     Usage (Rz)
283*0faf80aeSRicardo Quesada     0x15, 0x00,        //     Logical Minimum (0)
284*0faf80aeSRicardo Quesada     0x27, 0xFF, 0xFF, 0x00, 0x00,  //     Logical Maximum (65534)
285*0faf80aeSRicardo Quesada     0x95, 0x02,        //     Report Count (2)
286*0faf80aeSRicardo Quesada     0x75, 0x10,        //     Report Size (16)
287*0faf80aeSRicardo Quesada     0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
288*0faf80aeSRicardo Quesada     0xC0,              //   End Collection
289*0faf80aeSRicardo Quesada     0x05, 0x02,        //   Usage Page (Sim Ctrls)
290*0faf80aeSRicardo Quesada     0x09, 0xC5,        //   Usage (Brake)
291*0faf80aeSRicardo Quesada     0x15, 0x00,        //   Logical Minimum (0)
292*0faf80aeSRicardo Quesada     0x26, 0xFF, 0x03,  //   Logical Maximum (1023)
293*0faf80aeSRicardo Quesada     0x95, 0x01,        //   Report Count (1)
294*0faf80aeSRicardo Quesada     0x75, 0x0A,        //   Report Size (10)
295*0faf80aeSRicardo Quesada     0x81, 0x02,        //   Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
296*0faf80aeSRicardo Quesada     0x15, 0x00,        //   Logical Minimum (0)
297*0faf80aeSRicardo Quesada     0x25, 0x00,        //   Logical Maximum (0)
298*0faf80aeSRicardo Quesada     0x75, 0x06,        //   Report Size (6)
299*0faf80aeSRicardo Quesada     0x95, 0x01,        //   Report Count (1)
300*0faf80aeSRicardo Quesada     0x81, 0x03,        //   Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
301*0faf80aeSRicardo Quesada     0x05, 0x02,        //   Usage Page (Sim Ctrls)
302*0faf80aeSRicardo Quesada     0x09, 0xC4,        //   Usage (Accelerator)
303*0faf80aeSRicardo Quesada     0x15, 0x00,        //   Logical Minimum (0)
304*0faf80aeSRicardo Quesada     0x26, 0xFF, 0x03,  //   Logical Maximum (1023)
305*0faf80aeSRicardo Quesada     0x95, 0x01,        //   Report Count (1)
306*0faf80aeSRicardo Quesada     0x75, 0x0A,        //   Report Size (10)
307*0faf80aeSRicardo Quesada     0x81, 0x02,        //   Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
308*0faf80aeSRicardo Quesada     0x15, 0x00,        //   Logical Minimum (0)
309*0faf80aeSRicardo Quesada     0x25, 0x00,        //   Logical Maximum (0)
310*0faf80aeSRicardo Quesada     0x75, 0x06,        //   Report Size (6)
311*0faf80aeSRicardo Quesada     0x95, 0x01,        //   Report Count (1)
312*0faf80aeSRicardo Quesada     0x81, 0x03,        //   Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
313*0faf80aeSRicardo Quesada     0x05, 0x01,        //   Usage Page (Generic Desktop Ctrls)
314*0faf80aeSRicardo Quesada     0x09, 0x39,        //   Usage (Hat switch)
315*0faf80aeSRicardo Quesada     0x15, 0x01,        //   Logical Minimum (1)
316*0faf80aeSRicardo Quesada     0x25, 0x08,        //   Logical Maximum (8)
317*0faf80aeSRicardo Quesada     0x35, 0x00,        //   Physical Minimum (0)
318*0faf80aeSRicardo Quesada     0x46, 0x3B, 0x01,  //   Physical Maximum (315)
319*0faf80aeSRicardo Quesada     0x66, 0x14, 0x00,  //   Unit (System: English Rotation, Length: Centimeter)
320*0faf80aeSRicardo Quesada     0x75, 0x04,        //   Report Size (4)
321*0faf80aeSRicardo Quesada     0x95, 0x01,        //   Report Count (1)
322*0faf80aeSRicardo Quesada     0x81, 0x42,        //   Input (Data,Var,Abs,No Wrap,Linear,Preferred State,Null State)
323*0faf80aeSRicardo Quesada     0x75, 0x04,        //   Report Size (4)
324*0faf80aeSRicardo Quesada     0x95, 0x01,        //   Report Count (1)
325*0faf80aeSRicardo Quesada     0x15, 0x00,        //   Logical Minimum (0)
326*0faf80aeSRicardo Quesada     0x25, 0x00,        //   Logical Maximum (0)
327*0faf80aeSRicardo Quesada     0x35, 0x00,        //   Physical Minimum (0)
328*0faf80aeSRicardo Quesada     0x45, 0x00,        //   Physical Maximum (0)
329*0faf80aeSRicardo Quesada     0x65, 0x00,        //   Unit (None)
330*0faf80aeSRicardo Quesada     0x81, 0x03,        //   Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
331*0faf80aeSRicardo Quesada     0x05, 0x09,        //   Usage Page (Button)
332*0faf80aeSRicardo Quesada     0x19, 0x01,        //   Usage Minimum (0x01)
333*0faf80aeSRicardo Quesada     0x29, 0x0F,        //   Usage Maximum (0x0F)
334*0faf80aeSRicardo Quesada     0x15, 0x00,        //   Logical Minimum (0)
335*0faf80aeSRicardo Quesada     0x25, 0x01,        //   Logical Maximum (1)
336*0faf80aeSRicardo Quesada     0x75, 0x01,        //   Report Size (1)
337*0faf80aeSRicardo Quesada     0x95, 0x0F,        //   Report Count (15)
338*0faf80aeSRicardo Quesada     0x81, 0x02,        //   Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
339*0faf80aeSRicardo Quesada     0x15, 0x00,        //   Logical Minimum (0)
340*0faf80aeSRicardo Quesada     0x25, 0x00,        //   Logical Maximum (0)
341*0faf80aeSRicardo Quesada     0x75, 0x01,        //   Report Size (1)
342*0faf80aeSRicardo Quesada     0x95, 0x01,        //   Report Count (1)
343*0faf80aeSRicardo Quesada     0x81, 0x03,        //   Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
344*0faf80aeSRicardo Quesada     0x05, 0x0C,        //   Usage Page (Consumer)
345*0faf80aeSRicardo Quesada     0x0A, 0xB2, 0x00,  //   Usage (Record)
346*0faf80aeSRicardo Quesada     0x15, 0x00,        //   Logical Minimum (0)
347*0faf80aeSRicardo Quesada     0x25, 0x01,        //   Logical Maximum (1)
348*0faf80aeSRicardo Quesada     0x95, 0x01,        //   Report Count (1)
349*0faf80aeSRicardo Quesada     0x75, 0x01,        //   Report Size (1)
350*0faf80aeSRicardo Quesada     0x81, 0x02,        //   Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
351*0faf80aeSRicardo Quesada     0x15, 0x00,        //   Logical Minimum (0)
352*0faf80aeSRicardo Quesada     0x25, 0x00,        //   Logical Maximum (0)
353*0faf80aeSRicardo Quesada     0x75, 0x07,        //   Report Size (7)
354*0faf80aeSRicardo Quesada     0x95, 0x01,        //   Report Count (1)
355*0faf80aeSRicardo Quesada     0x81, 0x03,        //   Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
356*0faf80aeSRicardo Quesada     0x05, 0x0F,        //   Usage Page (PID Page)
357*0faf80aeSRicardo Quesada     0x09, 0x21,        //   Usage (0x21)
358*0faf80aeSRicardo Quesada     0x85, 0x03,        //   Report ID (3)
359*0faf80aeSRicardo Quesada     0xA1, 0x02,        //   Collection (Logical)
360*0faf80aeSRicardo Quesada     0x09, 0x97,        //     Usage (0x97)
361*0faf80aeSRicardo Quesada     0x15, 0x00,        //     Logical Minimum (0)
362*0faf80aeSRicardo Quesada     0x25, 0x01,        //     Logical Maximum (1)
363*0faf80aeSRicardo Quesada     0x75, 0x04,        //     Report Size (4)
364*0faf80aeSRicardo Quesada     0x95, 0x01,        //     Report Count (1)
365*0faf80aeSRicardo Quesada     0x91, 0x02,        //     Output (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
366*0faf80aeSRicardo Quesada     0x15, 0x00,        //     Logical Minimum (0)
367*0faf80aeSRicardo Quesada     0x25, 0x00,        //     Logical Maximum (0)
368*0faf80aeSRicardo Quesada     0x75, 0x04,        //     Report Size (4)
369*0faf80aeSRicardo Quesada     0x95, 0x01,        //     Report Count (1)
370*0faf80aeSRicardo Quesada     0x91, 0x03,        //     Output (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
371*0faf80aeSRicardo Quesada     0x09, 0x70,        //     Usage (0x70)
372*0faf80aeSRicardo Quesada     0x15, 0x00,        //     Logical Minimum (0)
373*0faf80aeSRicardo Quesada     0x25, 0x64,        //     Logical Maximum (100)
374*0faf80aeSRicardo Quesada     0x75, 0x08,        //     Report Size (8)
375*0faf80aeSRicardo Quesada     0x95, 0x04,        //     Report Count (4)
376*0faf80aeSRicardo Quesada     0x91, 0x02,        //     Output (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
377*0faf80aeSRicardo Quesada     0x09, 0x50,        //     Usage (0x50)
378*0faf80aeSRicardo Quesada     0x66, 0x01, 0x10,  //     Unit (System: SI Linear, Time: Seconds)
379*0faf80aeSRicardo Quesada     0x55, 0x0E,        //     Unit Exponent (-2)
380*0faf80aeSRicardo Quesada     0x15, 0x00,        //     Logical Minimum (0)
381*0faf80aeSRicardo Quesada     0x26, 0xFF, 0x00,  //     Logical Maximum (255)
382*0faf80aeSRicardo Quesada     0x75, 0x08,        //     Report Size (8)
383*0faf80aeSRicardo Quesada     0x95, 0x01,        //     Report Count (1)
384*0faf80aeSRicardo Quesada     0x91, 0x02,        //     Output (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
385*0faf80aeSRicardo Quesada     0x09, 0xA7,        //     Usage (0xA7)
386*0faf80aeSRicardo Quesada     0x15, 0x00,        //     Logical Minimum (0)
387*0faf80aeSRicardo Quesada     0x26, 0xFF, 0x00,  //     Logical Maximum (255)
388*0faf80aeSRicardo Quesada     0x75, 0x08,        //     Report Size (8)
389*0faf80aeSRicardo Quesada     0x95, 0x01,        //     Report Count (1)
390*0faf80aeSRicardo Quesada     0x91, 0x02,        //     Output (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
391*0faf80aeSRicardo Quesada     0x65, 0x00,        //     Unit (None)
392*0faf80aeSRicardo Quesada     0x55, 0x00,        //     Unit Exponent (0)
393*0faf80aeSRicardo Quesada     0x09, 0x7C,        //     Usage (0x7C)
394*0faf80aeSRicardo Quesada     0x15, 0x00,        //     Logical Minimum (0)
395*0faf80aeSRicardo Quesada     0x26, 0xFF, 0x00,  //     Logical Maximum (255)
396*0faf80aeSRicardo Quesada     0x75, 0x08,        //     Report Size (8)
397*0faf80aeSRicardo Quesada     0x95, 0x01,        //     Report Count (1)
398*0faf80aeSRicardo Quesada     0x91, 0x02,        //     Output (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
399*0faf80aeSRicardo Quesada     0xC0,              //   End Collection
400*0faf80aeSRicardo Quesada     0xC0,              // End Collection
401*0faf80aeSRicardo Quesada     // 283 bytes
402*0faf80aeSRicardo Quesada };
403*0faf80aeSRicardo Quesada 
4041d3bd1e5SMatthias Ringwald const uint8_t mouse_report_without_id_positive_xy[]    = {       0x03, 0x02, 0x03 };
4051d3bd1e5SMatthias Ringwald const uint8_t mouse_report_without_id_negative_xy[]    = {       0x03, 0xFE, 0xFD };
4061d3bd1e5SMatthias Ringwald const uint8_t mouse_report_with_id_1[]    = { 0x01, 0x03, 0x02, 0x03 };
4071d3bd1e5SMatthias Ringwald 
4081d3bd1e5SMatthias Ringwald const uint8_t keyboard_report1[] = { 0x01, 0x00, 0x04, 0x05, 0x06, 0x00, 0x00, 0x00 };
4091d3bd1e5SMatthias Ringwald 
4101d3bd1e5SMatthias Ringwald const uint8_t combo_report1[]    = { 0x01, 0x03, 0x02, 0x03 };
4111d3bd1e5SMatthias Ringwald const uint8_t combo_report2[]    = { 0x02, 0x01, 0x00,  0x04, 0x05, 0x06, 0x00, 0x00, 0x00 };
4121d3bd1e5SMatthias Ringwald 
41322931ba2SRicardo Quesada const uint8_t tank_mouse_report[] = { 0x03, 0x03, 0xFD, 0xFF, 0xF6, 0xFF, 0x00};
414*0faf80aeSRicardo Quesada const uint8_t xbox_wireless_report[] = {0x01, 0xB9, 0xF0, 0xFB, 0xC3, 0xE3, 0x80, 0x97, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00};
4151d3bd1e5SMatthias Ringwald 
4161d3bd1e5SMatthias Ringwald 
4171d3bd1e5SMatthias Ringwald static void expect_field(btstack_hid_parser_t * parser, uint16_t expected_usage_page, uint16_t expected_usage, int32_t expected_value){
4181d3bd1e5SMatthias Ringwald     // printf("expected - usage page %02x, usage %04x, value %02x (bit pos %u)\n", expected_usage_page, expected_usage, expected_value, parser->report_pos_in_bit);
4191d3bd1e5SMatthias Ringwald     CHECK_EQUAL(1, btstack_hid_parser_has_more(parser));
4201d3bd1e5SMatthias Ringwald     uint16_t usage_page;
4211d3bd1e5SMatthias Ringwald     uint16_t usage;
4221d3bd1e5SMatthias Ringwald     int32_t value;
4231d3bd1e5SMatthias Ringwald     btstack_hid_parser_get_field(parser, &usage_page, &usage, &value);
4241d3bd1e5SMatthias Ringwald     CHECK_EQUAL(expected_usage_page, usage_page);
4251d3bd1e5SMatthias Ringwald     CHECK_EQUAL(expected_usage, usage);
4261d3bd1e5SMatthias Ringwald     CHECK_EQUAL(expected_value, value);
4271d3bd1e5SMatthias Ringwald }
4281d3bd1e5SMatthias Ringwald 
4291d3bd1e5SMatthias Ringwald // test
4301d3bd1e5SMatthias Ringwald TEST_GROUP(HID){
4311d3bd1e5SMatthias Ringwald 	void setup(void){
4321d3bd1e5SMatthias Ringwald     }
4331d3bd1e5SMatthias Ringwald };
4341d3bd1e5SMatthias Ringwald 
4351d3bd1e5SMatthias Ringwald TEST(HID, MouseWithoutReportID){
4361d3bd1e5SMatthias Ringwald     static btstack_hid_parser_t hid_parser;
4371d3bd1e5SMatthias Ringwald     btstack_hid_parser_init(&hid_parser, mouse_descriptor_without_report_id, sizeof(mouse_descriptor_without_report_id), HID_REPORT_TYPE_INPUT, mouse_report_without_id_positive_xy, sizeof(mouse_report_without_id_positive_xy));
4381d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 9, 1, 1);
4391d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 9, 2, 1);
4401d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 9, 3, 0);
4411d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 1, 0x30, 2);
4421d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 1, 0x31, 3);
4431d3bd1e5SMatthias Ringwald     CHECK_EQUAL(24, hid_parser.report_pos_in_bit);
4441d3bd1e5SMatthias Ringwald     CHECK_EQUAL(0, btstack_hid_parser_has_more(&hid_parser));
4451d3bd1e5SMatthias Ringwald }
4461d3bd1e5SMatthias Ringwald 
4471d3bd1e5SMatthias Ringwald TEST(HID, MouseWithoutReportIDSigned){
4481d3bd1e5SMatthias Ringwald     static btstack_hid_parser_t hid_parser;
4491d3bd1e5SMatthias Ringwald     btstack_hid_parser_init(&hid_parser, mouse_descriptor_without_report_id, sizeof(mouse_descriptor_without_report_id), HID_REPORT_TYPE_INPUT, mouse_report_without_id_negative_xy, sizeof(mouse_report_without_id_negative_xy));
4501d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 9, 1, 1);
4511d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 9, 2, 1);
4521d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 9, 3, 0);
4531d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 1, 0x30, -2);
4541d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 1, 0x31, -3);
4551d3bd1e5SMatthias Ringwald     CHECK_EQUAL(24, hid_parser.report_pos_in_bit);
4561d3bd1e5SMatthias Ringwald     CHECK_EQUAL(0, btstack_hid_parser_has_more(&hid_parser));
4571d3bd1e5SMatthias Ringwald }
4581d3bd1e5SMatthias Ringwald 
4591d3bd1e5SMatthias Ringwald TEST(HID, MouseWithReportID){
4601d3bd1e5SMatthias Ringwald     static btstack_hid_parser_t hid_parser;
46122931ba2SRicardo Quesada     CHECK_EQUAL(3, btstack_hid_get_report_size_for_id(1, HID_REPORT_TYPE_INPUT, sizeof(mouse_descriptor_with_report_id), mouse_descriptor_with_report_id));
4621d3bd1e5SMatthias Ringwald     btstack_hid_parser_init(&hid_parser, mouse_descriptor_with_report_id, sizeof(mouse_descriptor_with_report_id), HID_REPORT_TYPE_INPUT, mouse_report_with_id_1, sizeof(mouse_report_with_id_1));
4631d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 9, 1, 1);
4641d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 9, 2, 1);
4651d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 9, 3, 0);
4661d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 1, 0x30, 2);
4671d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 1, 0x31, 3);
4681d3bd1e5SMatthias Ringwald     CHECK_EQUAL(32, hid_parser.report_pos_in_bit);
4691d3bd1e5SMatthias Ringwald     CHECK_EQUAL(0, btstack_hid_parser_has_more(&hid_parser));
4701d3bd1e5SMatthias Ringwald }
4711d3bd1e5SMatthias Ringwald 
4721d3bd1e5SMatthias Ringwald TEST(HID, BootKeyboard){
4731d3bd1e5SMatthias Ringwald     static btstack_hid_parser_t hid_parser;
4741d3bd1e5SMatthias Ringwald     btstack_hid_parser_init(&hid_parser, hid_descriptor_keyboard_boot_mode, sizeof(hid_descriptor_keyboard_boot_mode), HID_REPORT_TYPE_INPUT, keyboard_report1, sizeof(keyboard_report1));
4751d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0xe0, 1);
4761d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0xe1, 0);
4771d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0xe2, 0);
4781d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0xe3, 0);
4791d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0xe4, 0);
4801d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0xe5, 0);
4811d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0xe6, 0);
4821d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0xe7, 0);
4831d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0x04, 1);
4841d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0x05, 1);
4851d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0x06, 1);
4861d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0x00, 1);
4871d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0x00, 1);
4881d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0x00, 1);
4891d3bd1e5SMatthias Ringwald     CHECK_EQUAL(64, hid_parser.report_pos_in_bit);
4901d3bd1e5SMatthias Ringwald     CHECK_EQUAL(0, btstack_hid_parser_has_more(&hid_parser));
4911d3bd1e5SMatthias Ringwald }
4921d3bd1e5SMatthias Ringwald 
4931d3bd1e5SMatthias Ringwald TEST(HID, Combo1){
4941d3bd1e5SMatthias Ringwald     static btstack_hid_parser_t hid_parser;
4951d3bd1e5SMatthias Ringwald     btstack_hid_parser_init(&hid_parser, combo_descriptor_with_report_ids, sizeof(combo_descriptor_with_report_ids), HID_REPORT_TYPE_INPUT, combo_report1, sizeof(combo_report1));
4961d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 9, 1, 1);
4971d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 9, 2, 1);
4981d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 9, 3, 0);
4991d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 1, 0x30, 2);
5001d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 1, 0x31, 3);
5011d3bd1e5SMatthias Ringwald     CHECK_EQUAL(32, hid_parser.report_pos_in_bit);
5021d3bd1e5SMatthias Ringwald     CHECK_EQUAL(0, btstack_hid_parser_has_more(&hid_parser));
5031d3bd1e5SMatthias Ringwald }
5041d3bd1e5SMatthias Ringwald 
5051d3bd1e5SMatthias Ringwald TEST(HID, Combo2){
5061d3bd1e5SMatthias Ringwald     static btstack_hid_parser_t hid_parser;
5071d3bd1e5SMatthias Ringwald     btstack_hid_parser_init(&hid_parser, combo_descriptor_with_report_ids, sizeof(combo_descriptor_with_report_ids), HID_REPORT_TYPE_INPUT, combo_report2, sizeof(combo_report2));
5081d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0xe0, 1);
5091d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0xe1, 0);
5101d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0xe2, 0);
5111d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0xe3, 0);
5121d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0xe4, 0);
5131d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0xe5, 0);
5141d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0xe6, 0);
5151d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0xe7, 0);
5161d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0x04, 1);
5171d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0x05, 1);
5181d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0x06, 1);
5191d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0x00, 1);
5201d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0x00, 1);
5211d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0x00, 1);
5221d3bd1e5SMatthias Ringwald     CHECK_EQUAL(72, hid_parser.report_pos_in_bit);
5231d3bd1e5SMatthias Ringwald     CHECK_EQUAL(0, btstack_hid_parser_has_more(&hid_parser));
5241d3bd1e5SMatthias Ringwald }
5251d3bd1e5SMatthias Ringwald 
52622931ba2SRicardo Quesada TEST(HID, TankMouse){
52722931ba2SRicardo Quesada     static btstack_hid_parser_t hid_parser;
52822931ba2SRicardo Quesada     CHECK_EQUAL(6, btstack_hid_get_report_size_for_id(3, HID_REPORT_TYPE_INPUT, sizeof(tank_mouse_descriptor), tank_mouse_descriptor));
52922931ba2SRicardo Quesada     btstack_hid_parser_init(&hid_parser, tank_mouse_descriptor, sizeof(tank_mouse_descriptor), HID_REPORT_TYPE_INPUT, tank_mouse_report, sizeof(tank_mouse_report));
53022931ba2SRicardo Quesada     expect_field(&hid_parser, 9, 1, 1);
53122931ba2SRicardo Quesada     expect_field(&hid_parser, 9, 2, 1);
53222931ba2SRicardo Quesada     expect_field(&hid_parser, 9, 3, 0);
53322931ba2SRicardo Quesada     // no usages for 4th and 5th report as usage min..max only allows for 3 button
53422931ba2SRicardo Quesada     expect_field(&hid_parser, 1, 0x30, -3);
53522931ba2SRicardo Quesada     expect_field(&hid_parser, 1, 0x31, -10);
53622931ba2SRicardo Quesada     expect_field(&hid_parser, 1, 0x38, 0);
53722931ba2SRicardo Quesada     CHECK_EQUAL(56, hid_parser.report_pos_in_bit);
53822931ba2SRicardo Quesada     CHECK_EQUAL(0, btstack_hid_parser_has_more(&hid_parser));
53922931ba2SRicardo Quesada }
54022931ba2SRicardo Quesada 
541*0faf80aeSRicardo Quesada TEST(HID, XboxWireless){
542*0faf80aeSRicardo Quesada     static btstack_hid_parser_t hid_parser;
543*0faf80aeSRicardo Quesada     CHECK_EQUAL(16, btstack_hid_get_report_size_for_id(1, HID_REPORT_TYPE_INPUT, sizeof(xbox_wireless_descriptor), xbox_wireless_descriptor));
544*0faf80aeSRicardo Quesada     btstack_hid_parser_init(&hid_parser, xbox_wireless_descriptor, sizeof(xbox_wireless_descriptor), HID_REPORT_TYPE_INPUT, xbox_wireless_report, sizeof(xbox_wireless_report));
545*0faf80aeSRicardo Quesada     expect_field(&hid_parser, 1, 0x30, 0xf0b9);
546*0faf80aeSRicardo Quesada     expect_field(&hid_parser, 1, 0x31, 0xc3fb);
547*0faf80aeSRicardo Quesada     expect_field(&hid_parser, 1, 0x32, 0x80e3);
548*0faf80aeSRicardo Quesada     expect_field(&hid_parser, 1, 0x35, 0x8197);
549*0faf80aeSRicardo Quesada     expect_field(&hid_parser, 2, 0xc5, 0);
550*0faf80aeSRicardo Quesada     expect_field(&hid_parser, 2, 0xc4, 0);
551*0faf80aeSRicardo Quesada     expect_field(&hid_parser, 1, 0x39, 0);
552*0faf80aeSRicardo Quesada     expect_field(&hid_parser, 9, 1, 0);
553*0faf80aeSRicardo Quesada     expect_field(&hid_parser, 9, 2, 0);
554*0faf80aeSRicardo Quesada     expect_field(&hid_parser, 9, 3, 0);
555*0faf80aeSRicardo Quesada     expect_field(&hid_parser, 9, 4, 0);
556*0faf80aeSRicardo Quesada     expect_field(&hid_parser, 9, 5, 0);
557*0faf80aeSRicardo Quesada     expect_field(&hid_parser, 9, 6, 0);
558*0faf80aeSRicardo Quesada     expect_field(&hid_parser, 9, 7, 0);
559*0faf80aeSRicardo Quesada     expect_field(&hid_parser, 9, 8, 0);
560*0faf80aeSRicardo Quesada     expect_field(&hid_parser, 9, 9, 0);
561*0faf80aeSRicardo Quesada     expect_field(&hid_parser, 9, 10, 0);
562*0faf80aeSRicardo Quesada     expect_field(&hid_parser, 9, 11, 0);
563*0faf80aeSRicardo Quesada     expect_field(&hid_parser, 9, 12, 0);
564*0faf80aeSRicardo Quesada     expect_field(&hid_parser, 9, 13, 0);
565*0faf80aeSRicardo Quesada     expect_field(&hid_parser, 9, 14, 1);
566*0faf80aeSRicardo Quesada     expect_field(&hid_parser, 9, 15, 0);
567*0faf80aeSRicardo Quesada     expect_field(&hid_parser, 12, 0xb2, 0);
568*0faf80aeSRicardo Quesada     CHECK_EQUAL(136, hid_parser.report_pos_in_bit);
569*0faf80aeSRicardo Quesada     CHECK_EQUAL(0, btstack_hid_parser_has_more(&hid_parser));
570*0faf80aeSRicardo Quesada }
571*0faf80aeSRicardo Quesada 
5721d3bd1e5SMatthias Ringwald TEST(HID, GetReportSize){
5731d3bd1e5SMatthias Ringwald     int report_size = 0;
5741d3bd1e5SMatthias Ringwald     const uint8_t * hid_descriptor =  combo_descriptor_with_report_ids;
5751d3bd1e5SMatthias Ringwald     uint16_t hid_descriptor_len = sizeof(combo_descriptor_with_report_ids);
5761d3bd1e5SMatthias Ringwald     report_size = btstack_hid_get_report_size_for_id(1, HID_REPORT_TYPE_INPUT, hid_descriptor_len, hid_descriptor);
5771d3bd1e5SMatthias Ringwald     CHECK_EQUAL(3, report_size);
5781d3bd1e5SMatthias Ringwald 
5791d3bd1e5SMatthias Ringwald     hid_descriptor = hid_descriptor_keyboard_boot_mode;
5801d3bd1e5SMatthias Ringwald     hid_descriptor_len = sizeof(hid_descriptor_keyboard_boot_mode);
5811d3bd1e5SMatthias Ringwald     report_size = btstack_hid_get_report_size_for_id(0, HID_REPORT_TYPE_OUTPUT, hid_descriptor_len, hid_descriptor);
5821d3bd1e5SMatthias Ringwald     CHECK_EQUAL(1, report_size);
5831d3bd1e5SMatthias Ringwald     report_size = btstack_hid_get_report_size_for_id(0, HID_REPORT_TYPE_INPUT, hid_descriptor_len, hid_descriptor);
5841d3bd1e5SMatthias Ringwald     CHECK_EQUAL(8, report_size);
5851d3bd1e5SMatthias Ringwald }
5861d3bd1e5SMatthias Ringwald 
5871d3bd1e5SMatthias Ringwald 
5881d3bd1e5SMatthias Ringwald int main (int argc, const char * argv[]){
5896707c7a1SMatthias Ringwald #if 1
5901d3bd1e5SMatthias Ringwald     // log into file using HCI_DUMP_PACKETLOGGER format
5911d3bd1e5SMatthias Ringwald     const char * pklg_path = "hci_dump.pklg";
5921d3bd1e5SMatthias Ringwald     hci_dump_posix_fs_open(pklg_path, HCI_DUMP_PACKETLOGGER);
5931d3bd1e5SMatthias Ringwald     hci_dump_init(hci_dump_posix_fs_get_instance());
5941d3bd1e5SMatthias Ringwald     printf("Packet Log: %s\n", pklg_path);
5956707c7a1SMatthias Ringwald #else
5966707c7a1SMatthias Ringwald     hci_dump_init(hci_dump_posix_stdout_get_instance());
5976707c7a1SMatthias Ringwald #endif
5981d3bd1e5SMatthias Ringwald     return CommandLineTestRunner::RunAllTests(argc, argv);
5991d3bd1e5SMatthias Ringwald }
600