xref: /btstack/test/hid_parser/hid_parser_test.cpp (revision 491c2cbcf91d1e465b8a0ffd3d3fa5afdd8ac3d2)
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 
2630faf80aeSRicardo Quesada // Xbox Wireless Controller FW 5.17.3202.0
2640faf80aeSRicardo Quesada const uint8_t xbox_wireless_descriptor[] = {
2650faf80aeSRicardo Quesada     0x05, 0x01,        // Usage Page (Generic Desktop Ctrls)
2660faf80aeSRicardo Quesada     0x09, 0x05,        // Usage (Game Pad)
2670faf80aeSRicardo Quesada     0xA1, 0x01,        // Collection (Application)
2680faf80aeSRicardo Quesada     0x85, 0x01,        //   Report ID (1)
2690faf80aeSRicardo Quesada     0x09, 0x01,        //   Usage (Pointer)
2700faf80aeSRicardo Quesada     0xA1, 0x00,        //   Collection (Physical)
2710faf80aeSRicardo Quesada     0x09, 0x30,        //     Usage (X)
2720faf80aeSRicardo Quesada     0x09, 0x31,        //     Usage (Y)
2730faf80aeSRicardo Quesada     0x15, 0x00,        //     Logical Minimum (0)
2740faf80aeSRicardo Quesada     0x27, 0xFF, 0xFF, 0x00, 0x00,  //     Logical Maximum (65534)
2750faf80aeSRicardo Quesada     0x95, 0x02,        //     Report Count (2)
2760faf80aeSRicardo Quesada     0x75, 0x10,        //     Report Size (16)
2770faf80aeSRicardo Quesada     0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
2780faf80aeSRicardo Quesada     0xC0,              //   End Collection
2790faf80aeSRicardo Quesada     0x09, 0x01,        //   Usage (Pointer)
2800faf80aeSRicardo Quesada     0xA1, 0x00,        //   Collection (Physical)
2810faf80aeSRicardo Quesada     0x09, 0x32,        //     Usage (Z)
2820faf80aeSRicardo Quesada     0x09, 0x35,        //     Usage (Rz)
2830faf80aeSRicardo Quesada     0x15, 0x00,        //     Logical Minimum (0)
2840faf80aeSRicardo Quesada     0x27, 0xFF, 0xFF, 0x00, 0x00,  //     Logical Maximum (65534)
2850faf80aeSRicardo Quesada     0x95, 0x02,        //     Report Count (2)
2860faf80aeSRicardo Quesada     0x75, 0x10,        //     Report Size (16)
2870faf80aeSRicardo Quesada     0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
2880faf80aeSRicardo Quesada     0xC0,              //   End Collection
2890faf80aeSRicardo Quesada     0x05, 0x02,        //   Usage Page (Sim Ctrls)
2900faf80aeSRicardo Quesada     0x09, 0xC5,        //   Usage (Brake)
2910faf80aeSRicardo Quesada     0x15, 0x00,        //   Logical Minimum (0)
2920faf80aeSRicardo Quesada     0x26, 0xFF, 0x03,  //   Logical Maximum (1023)
2930faf80aeSRicardo Quesada     0x95, 0x01,        //   Report Count (1)
2940faf80aeSRicardo Quesada     0x75, 0x0A,        //   Report Size (10)
2950faf80aeSRicardo Quesada     0x81, 0x02,        //   Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
2960faf80aeSRicardo Quesada     0x15, 0x00,        //   Logical Minimum (0)
2970faf80aeSRicardo Quesada     0x25, 0x00,        //   Logical Maximum (0)
2980faf80aeSRicardo Quesada     0x75, 0x06,        //   Report Size (6)
2990faf80aeSRicardo Quesada     0x95, 0x01,        //   Report Count (1)
3000faf80aeSRicardo Quesada     0x81, 0x03,        //   Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
3010faf80aeSRicardo Quesada     0x05, 0x02,        //   Usage Page (Sim Ctrls)
3020faf80aeSRicardo Quesada     0x09, 0xC4,        //   Usage (Accelerator)
3030faf80aeSRicardo Quesada     0x15, 0x00,        //   Logical Minimum (0)
3040faf80aeSRicardo Quesada     0x26, 0xFF, 0x03,  //   Logical Maximum (1023)
3050faf80aeSRicardo Quesada     0x95, 0x01,        //   Report Count (1)
3060faf80aeSRicardo Quesada     0x75, 0x0A,        //   Report Size (10)
3070faf80aeSRicardo Quesada     0x81, 0x02,        //   Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
3080faf80aeSRicardo Quesada     0x15, 0x00,        //   Logical Minimum (0)
3090faf80aeSRicardo Quesada     0x25, 0x00,        //   Logical Maximum (0)
3100faf80aeSRicardo Quesada     0x75, 0x06,        //   Report Size (6)
3110faf80aeSRicardo Quesada     0x95, 0x01,        //   Report Count (1)
3120faf80aeSRicardo Quesada     0x81, 0x03,        //   Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
3130faf80aeSRicardo Quesada     0x05, 0x01,        //   Usage Page (Generic Desktop Ctrls)
3140faf80aeSRicardo Quesada     0x09, 0x39,        //   Usage (Hat switch)
3150faf80aeSRicardo Quesada     0x15, 0x01,        //   Logical Minimum (1)
3160faf80aeSRicardo Quesada     0x25, 0x08,        //   Logical Maximum (8)
3170faf80aeSRicardo Quesada     0x35, 0x00,        //   Physical Minimum (0)
3180faf80aeSRicardo Quesada     0x46, 0x3B, 0x01,  //   Physical Maximum (315)
3190faf80aeSRicardo Quesada     0x66, 0x14, 0x00,  //   Unit (System: English Rotation, Length: Centimeter)
3200faf80aeSRicardo Quesada     0x75, 0x04,        //   Report Size (4)
3210faf80aeSRicardo Quesada     0x95, 0x01,        //   Report Count (1)
3220faf80aeSRicardo Quesada     0x81, 0x42,        //   Input (Data,Var,Abs,No Wrap,Linear,Preferred State,Null State)
3230faf80aeSRicardo Quesada     0x75, 0x04,        //   Report Size (4)
3240faf80aeSRicardo Quesada     0x95, 0x01,        //   Report Count (1)
3250faf80aeSRicardo Quesada     0x15, 0x00,        //   Logical Minimum (0)
3260faf80aeSRicardo Quesada     0x25, 0x00,        //   Logical Maximum (0)
3270faf80aeSRicardo Quesada     0x35, 0x00,        //   Physical Minimum (0)
3280faf80aeSRicardo Quesada     0x45, 0x00,        //   Physical Maximum (0)
3290faf80aeSRicardo Quesada     0x65, 0x00,        //   Unit (None)
3300faf80aeSRicardo Quesada     0x81, 0x03,        //   Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
3310faf80aeSRicardo Quesada     0x05, 0x09,        //   Usage Page (Button)
3320faf80aeSRicardo Quesada     0x19, 0x01,        //   Usage Minimum (0x01)
3330faf80aeSRicardo Quesada     0x29, 0x0F,        //   Usage Maximum (0x0F)
3340faf80aeSRicardo Quesada     0x15, 0x00,        //   Logical Minimum (0)
3350faf80aeSRicardo Quesada     0x25, 0x01,        //   Logical Maximum (1)
3360faf80aeSRicardo Quesada     0x75, 0x01,        //   Report Size (1)
3370faf80aeSRicardo Quesada     0x95, 0x0F,        //   Report Count (15)
3380faf80aeSRicardo Quesada     0x81, 0x02,        //   Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
3390faf80aeSRicardo Quesada     0x15, 0x00,        //   Logical Minimum (0)
3400faf80aeSRicardo Quesada     0x25, 0x00,        //   Logical Maximum (0)
3410faf80aeSRicardo Quesada     0x75, 0x01,        //   Report Size (1)
3420faf80aeSRicardo Quesada     0x95, 0x01,        //   Report Count (1)
3430faf80aeSRicardo Quesada     0x81, 0x03,        //   Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
3440faf80aeSRicardo Quesada     0x05, 0x0C,        //   Usage Page (Consumer)
3450faf80aeSRicardo Quesada     0x0A, 0xB2, 0x00,  //   Usage (Record)
3460faf80aeSRicardo Quesada     0x15, 0x00,        //   Logical Minimum (0)
3470faf80aeSRicardo Quesada     0x25, 0x01,        //   Logical Maximum (1)
3480faf80aeSRicardo Quesada     0x95, 0x01,        //   Report Count (1)
3490faf80aeSRicardo Quesada     0x75, 0x01,        //   Report Size (1)
3500faf80aeSRicardo Quesada     0x81, 0x02,        //   Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
3510faf80aeSRicardo Quesada     0x15, 0x00,        //   Logical Minimum (0)
3520faf80aeSRicardo Quesada     0x25, 0x00,        //   Logical Maximum (0)
3530faf80aeSRicardo Quesada     0x75, 0x07,        //   Report Size (7)
3540faf80aeSRicardo Quesada     0x95, 0x01,        //   Report Count (1)
3550faf80aeSRicardo Quesada     0x81, 0x03,        //   Input (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
3560faf80aeSRicardo Quesada     0x05, 0x0F,        //   Usage Page (PID Page)
3570faf80aeSRicardo Quesada     0x09, 0x21,        //   Usage (0x21)
3580faf80aeSRicardo Quesada     0x85, 0x03,        //   Report ID (3)
3590faf80aeSRicardo Quesada     0xA1, 0x02,        //   Collection (Logical)
3600faf80aeSRicardo Quesada     0x09, 0x97,        //     Usage (0x97)
3610faf80aeSRicardo Quesada     0x15, 0x00,        //     Logical Minimum (0)
3620faf80aeSRicardo Quesada     0x25, 0x01,        //     Logical Maximum (1)
3630faf80aeSRicardo Quesada     0x75, 0x04,        //     Report Size (4)
3640faf80aeSRicardo Quesada     0x95, 0x01,        //     Report Count (1)
3650faf80aeSRicardo Quesada     0x91, 0x02,        //     Output (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
3660faf80aeSRicardo Quesada     0x15, 0x00,        //     Logical Minimum (0)
3670faf80aeSRicardo Quesada     0x25, 0x00,        //     Logical Maximum (0)
3680faf80aeSRicardo Quesada     0x75, 0x04,        //     Report Size (4)
3690faf80aeSRicardo Quesada     0x95, 0x01,        //     Report Count (1)
3700faf80aeSRicardo Quesada     0x91, 0x03,        //     Output (Const,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
3710faf80aeSRicardo Quesada     0x09, 0x70,        //     Usage (0x70)
3720faf80aeSRicardo Quesada     0x15, 0x00,        //     Logical Minimum (0)
3730faf80aeSRicardo Quesada     0x25, 0x64,        //     Logical Maximum (100)
3740faf80aeSRicardo Quesada     0x75, 0x08,        //     Report Size (8)
3750faf80aeSRicardo Quesada     0x95, 0x04,        //     Report Count (4)
3760faf80aeSRicardo Quesada     0x91, 0x02,        //     Output (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
3770faf80aeSRicardo Quesada     0x09, 0x50,        //     Usage (0x50)
3780faf80aeSRicardo Quesada     0x66, 0x01, 0x10,  //     Unit (System: SI Linear, Time: Seconds)
3790faf80aeSRicardo Quesada     0x55, 0x0E,        //     Unit Exponent (-2)
3800faf80aeSRicardo Quesada     0x15, 0x00,        //     Logical Minimum (0)
3810faf80aeSRicardo Quesada     0x26, 0xFF, 0x00,  //     Logical Maximum (255)
3820faf80aeSRicardo Quesada     0x75, 0x08,        //     Report Size (8)
3830faf80aeSRicardo Quesada     0x95, 0x01,        //     Report Count (1)
3840faf80aeSRicardo Quesada     0x91, 0x02,        //     Output (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
3850faf80aeSRicardo Quesada     0x09, 0xA7,        //     Usage (0xA7)
3860faf80aeSRicardo Quesada     0x15, 0x00,        //     Logical Minimum (0)
3870faf80aeSRicardo Quesada     0x26, 0xFF, 0x00,  //     Logical Maximum (255)
3880faf80aeSRicardo Quesada     0x75, 0x08,        //     Report Size (8)
3890faf80aeSRicardo Quesada     0x95, 0x01,        //     Report Count (1)
3900faf80aeSRicardo Quesada     0x91, 0x02,        //     Output (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
3910faf80aeSRicardo Quesada     0x65, 0x00,        //     Unit (None)
3920faf80aeSRicardo Quesada     0x55, 0x00,        //     Unit Exponent (0)
3930faf80aeSRicardo Quesada     0x09, 0x7C,        //     Usage (0x7C)
3940faf80aeSRicardo Quesada     0x15, 0x00,        //     Logical Minimum (0)
3950faf80aeSRicardo Quesada     0x26, 0xFF, 0x00,  //     Logical Maximum (255)
3960faf80aeSRicardo Quesada     0x75, 0x08,        //     Report Size (8)
3970faf80aeSRicardo Quesada     0x95, 0x01,        //     Report Count (1)
3980faf80aeSRicardo Quesada     0x91, 0x02,        //     Output (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
3990faf80aeSRicardo Quesada     0xC0,              //   End Collection
4000faf80aeSRicardo Quesada     0xC0,              // End Collection
4010faf80aeSRicardo Quesada     // 283 bytes
4020faf80aeSRicardo Quesada };
4030faf80aeSRicardo 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};
4140faf80aeSRicardo 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){
418*491c2cbcSMatthias Ringwald     // printf("expected - usage page %02x, usage %04x, value %02x\n", expected_usage_page, expected_usage, expected_value);
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(0, btstack_hid_parser_has_more(&hid_parser));
4441d3bd1e5SMatthias Ringwald }
4451d3bd1e5SMatthias Ringwald 
4461d3bd1e5SMatthias Ringwald TEST(HID, MouseWithoutReportIDSigned){
4471d3bd1e5SMatthias Ringwald     static btstack_hid_parser_t hid_parser;
4481d3bd1e5SMatthias 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));
4491d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 9, 1, 1);
4501d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 9, 2, 1);
4511d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 9, 3, 0);
4521d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 1, 0x30, -2);
4531d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 1, 0x31, -3);
4541d3bd1e5SMatthias Ringwald     CHECK_EQUAL(0, btstack_hid_parser_has_more(&hid_parser));
4551d3bd1e5SMatthias Ringwald }
4561d3bd1e5SMatthias Ringwald 
4571d3bd1e5SMatthias Ringwald TEST(HID, MouseWithReportID){
4581d3bd1e5SMatthias Ringwald     static btstack_hid_parser_t hid_parser;
45922931ba2SRicardo 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));
4601d3bd1e5SMatthias 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));
4611d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 9, 1, 1);
4621d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 9, 2, 1);
4631d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 9, 3, 0);
4641d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 1, 0x30, 2);
4651d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 1, 0x31, 3);
4661d3bd1e5SMatthias Ringwald     CHECK_EQUAL(0, btstack_hid_parser_has_more(&hid_parser));
4671d3bd1e5SMatthias Ringwald }
4681d3bd1e5SMatthias Ringwald 
4691d3bd1e5SMatthias Ringwald TEST(HID, BootKeyboard){
4701d3bd1e5SMatthias Ringwald     static btstack_hid_parser_t hid_parser;
4711d3bd1e5SMatthias 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));
4721d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0xe0, 1);
4731d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0xe1, 0);
4741d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0xe2, 0);
4751d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0xe3, 0);
4761d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0xe4, 0);
4771d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0xe5, 0);
4781d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0xe6, 0);
4791d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0xe7, 0);
4801d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0x04, 1);
4811d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0x05, 1);
4821d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0x06, 1);
4831d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0x00, 1);
4841d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0x00, 1);
4851d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0x00, 1);
4861d3bd1e5SMatthias Ringwald     CHECK_EQUAL(0, btstack_hid_parser_has_more(&hid_parser));
4871d3bd1e5SMatthias Ringwald }
4881d3bd1e5SMatthias Ringwald 
4891d3bd1e5SMatthias Ringwald TEST(HID, Combo1){
4901d3bd1e5SMatthias Ringwald     static btstack_hid_parser_t hid_parser;
4911d3bd1e5SMatthias 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));
4921d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 9, 1, 1);
4931d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 9, 2, 1);
4941d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 9, 3, 0);
4951d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 1, 0x30, 2);
4961d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 1, 0x31, 3);
4971d3bd1e5SMatthias Ringwald     CHECK_EQUAL(0, btstack_hid_parser_has_more(&hid_parser));
4981d3bd1e5SMatthias Ringwald }
4991d3bd1e5SMatthias Ringwald 
5001d3bd1e5SMatthias Ringwald TEST(HID, Combo2){
5011d3bd1e5SMatthias Ringwald     static btstack_hid_parser_t hid_parser;
5021d3bd1e5SMatthias 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));
5031d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0xe0, 1);
5041d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0xe1, 0);
5051d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0xe2, 0);
5061d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0xe3, 0);
5071d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0xe4, 0);
5081d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0xe5, 0);
5091d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0xe6, 0);
5101d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0xe7, 0);
5111d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0x04, 1);
5121d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0x05, 1);
5131d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0x06, 1);
5141d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0x00, 1);
5151d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0x00, 1);
5161d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0x00, 1);
5171d3bd1e5SMatthias Ringwald     CHECK_EQUAL(0, btstack_hid_parser_has_more(&hid_parser));
5181d3bd1e5SMatthias Ringwald }
5191d3bd1e5SMatthias Ringwald 
52022931ba2SRicardo Quesada TEST(HID, TankMouse){
52122931ba2SRicardo Quesada     static btstack_hid_parser_t hid_parser;
52222931ba2SRicardo Quesada     CHECK_EQUAL(6, btstack_hid_get_report_size_for_id(3, HID_REPORT_TYPE_INPUT, sizeof(tank_mouse_descriptor), tank_mouse_descriptor));
52322931ba2SRicardo 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));
52422931ba2SRicardo Quesada     expect_field(&hid_parser, 9, 1, 1);
52522931ba2SRicardo Quesada     expect_field(&hid_parser, 9, 2, 1);
52622931ba2SRicardo Quesada     expect_field(&hid_parser, 9, 3, 0);
52722931ba2SRicardo Quesada     // no usages for 4th and 5th report as usage min..max only allows for 3 button
52822931ba2SRicardo Quesada     expect_field(&hid_parser, 1, 0x30, -3);
52922931ba2SRicardo Quesada     expect_field(&hid_parser, 1, 0x31, -10);
53022931ba2SRicardo Quesada     expect_field(&hid_parser, 1, 0x38, 0);
53122931ba2SRicardo Quesada     CHECK_EQUAL(0, btstack_hid_parser_has_more(&hid_parser));
53222931ba2SRicardo Quesada }
53322931ba2SRicardo Quesada 
5340faf80aeSRicardo Quesada TEST(HID, XboxWireless){
5350faf80aeSRicardo Quesada     static btstack_hid_parser_t hid_parser;
5360faf80aeSRicardo Quesada     CHECK_EQUAL(16, btstack_hid_get_report_size_for_id(1, HID_REPORT_TYPE_INPUT, sizeof(xbox_wireless_descriptor), xbox_wireless_descriptor));
5370faf80aeSRicardo 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));
5380faf80aeSRicardo Quesada     expect_field(&hid_parser, 1, 0x30, 0xf0b9);
5390faf80aeSRicardo Quesada     expect_field(&hid_parser, 1, 0x31, 0xc3fb);
5400faf80aeSRicardo Quesada     expect_field(&hid_parser, 1, 0x32, 0x80e3);
5410faf80aeSRicardo Quesada     expect_field(&hid_parser, 1, 0x35, 0x8197);
5420faf80aeSRicardo Quesada     expect_field(&hid_parser, 2, 0xc5, 0);
5430faf80aeSRicardo Quesada     expect_field(&hid_parser, 2, 0xc4, 0);
5440faf80aeSRicardo Quesada     expect_field(&hid_parser, 1, 0x39, 0);
5450faf80aeSRicardo Quesada     expect_field(&hid_parser, 9, 1, 0);
5460faf80aeSRicardo Quesada     expect_field(&hid_parser, 9, 2, 0);
5470faf80aeSRicardo Quesada     expect_field(&hid_parser, 9, 3, 0);
5480faf80aeSRicardo Quesada     expect_field(&hid_parser, 9, 4, 0);
5490faf80aeSRicardo Quesada     expect_field(&hid_parser, 9, 5, 0);
5500faf80aeSRicardo Quesada     expect_field(&hid_parser, 9, 6, 0);
5510faf80aeSRicardo Quesada     expect_field(&hid_parser, 9, 7, 0);
5520faf80aeSRicardo Quesada     expect_field(&hid_parser, 9, 8, 0);
5530faf80aeSRicardo Quesada     expect_field(&hid_parser, 9, 9, 0);
5540faf80aeSRicardo Quesada     expect_field(&hid_parser, 9, 10, 0);
5550faf80aeSRicardo Quesada     expect_field(&hid_parser, 9, 11, 0);
5560faf80aeSRicardo Quesada     expect_field(&hid_parser, 9, 12, 0);
5570faf80aeSRicardo Quesada     expect_field(&hid_parser, 9, 13, 0);
5580faf80aeSRicardo Quesada     expect_field(&hid_parser, 9, 14, 1);
5590faf80aeSRicardo Quesada     expect_field(&hid_parser, 9, 15, 0);
5600faf80aeSRicardo Quesada     expect_field(&hid_parser, 12, 0xb2, 0);
5610faf80aeSRicardo Quesada     CHECK_EQUAL(0, btstack_hid_parser_has_more(&hid_parser));
5620faf80aeSRicardo Quesada }
5630faf80aeSRicardo Quesada 
5641d3bd1e5SMatthias Ringwald TEST(HID, GetReportSize){
5651d3bd1e5SMatthias Ringwald     int report_size = 0;
5661d3bd1e5SMatthias Ringwald     const uint8_t * hid_descriptor =  combo_descriptor_with_report_ids;
5671d3bd1e5SMatthias Ringwald     uint16_t hid_descriptor_len = sizeof(combo_descriptor_with_report_ids);
5681d3bd1e5SMatthias Ringwald     report_size = btstack_hid_get_report_size_for_id(1, HID_REPORT_TYPE_INPUT, hid_descriptor_len, hid_descriptor);
5691d3bd1e5SMatthias Ringwald     CHECK_EQUAL(3, report_size);
5701d3bd1e5SMatthias Ringwald 
5711d3bd1e5SMatthias Ringwald     hid_descriptor = hid_descriptor_keyboard_boot_mode;
5721d3bd1e5SMatthias Ringwald     hid_descriptor_len = sizeof(hid_descriptor_keyboard_boot_mode);
5731d3bd1e5SMatthias Ringwald     report_size = btstack_hid_get_report_size_for_id(0, HID_REPORT_TYPE_OUTPUT, hid_descriptor_len, hid_descriptor);
5741d3bd1e5SMatthias Ringwald     CHECK_EQUAL(1, report_size);
5751d3bd1e5SMatthias Ringwald     report_size = btstack_hid_get_report_size_for_id(0, HID_REPORT_TYPE_INPUT, hid_descriptor_len, hid_descriptor);
5761d3bd1e5SMatthias Ringwald     CHECK_EQUAL(8, report_size);
5771d3bd1e5SMatthias Ringwald }
5781d3bd1e5SMatthias Ringwald 
5791d3bd1e5SMatthias Ringwald 
5801d3bd1e5SMatthias Ringwald int main (int argc, const char * argv[]){
5816707c7a1SMatthias Ringwald #if 1
5821d3bd1e5SMatthias Ringwald     // log into file using HCI_DUMP_PACKETLOGGER format
5831d3bd1e5SMatthias Ringwald     const char * pklg_path = "hci_dump.pklg";
5841d3bd1e5SMatthias Ringwald     hci_dump_posix_fs_open(pklg_path, HCI_DUMP_PACKETLOGGER);
5851d3bd1e5SMatthias Ringwald     hci_dump_init(hci_dump_posix_fs_get_instance());
5861d3bd1e5SMatthias Ringwald     printf("Packet Log: %s\n", pklg_path);
5876707c7a1SMatthias Ringwald #else
5886707c7a1SMatthias Ringwald     hci_dump_init(hci_dump_posix_stdout_get_instance());
5896707c7a1SMatthias Ringwald #endif
5901d3bd1e5SMatthias Ringwald     return CommandLineTestRunner::RunAllTests(argc, argv);
5911d3bd1e5SMatthias Ringwald }
592