xref: /btstack/test/hid_parser/hid_parser_test.cpp (revision 22931ba2931647e5b31dbb4ae974586d536bd486)
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"
191d3bd1e5SMatthias Ringwald 
201d3bd1e5SMatthias Ringwald const uint8_t mouse_descriptor_without_report_id[] = {
211d3bd1e5SMatthias Ringwald     0x05, 0x01, /*  Usage Page (Desktop),               */
221d3bd1e5SMatthias Ringwald     0x09, 0x02, /*  Usage (Mouse),                      */
231d3bd1e5SMatthias Ringwald     0xA1, 0x01, /*  Collection (Application),           */
241d3bd1e5SMatthias Ringwald     0x09, 0x01, /*      Usage (Pointer),                */
251d3bd1e5SMatthias Ringwald     0xA0,       /*      Collection (Physical),          */
261d3bd1e5SMatthias Ringwald     0x05, 0x09, /*          Usage Page (Button),        */
271d3bd1e5SMatthias Ringwald     0x19, 0x01, /*          Usage Minimum (01h),        */
281d3bd1e5SMatthias Ringwald     0x29, 0x03, /*          Usage Maximum (03h),        */
291d3bd1e5SMatthias Ringwald     0x14,       /*          Logical Minimum (0),        */
301d3bd1e5SMatthias Ringwald     0x25, 0x01, /*          Logical Maximum (1),        */
311d3bd1e5SMatthias Ringwald     0x75, 0x01, /*          Report Size (1),            */
321d3bd1e5SMatthias Ringwald     0x95, 0x03, /*          Report Count (3),           */
331d3bd1e5SMatthias Ringwald     0x81, 0x02, /*          Input (Variable),           */
341d3bd1e5SMatthias Ringwald     0x75, 0x05, /*          Report Size (5),            */
351d3bd1e5SMatthias Ringwald     0x95, 0x01, /*          Report Count (1),           */
361d3bd1e5SMatthias Ringwald     0x81, 0x01, /*          Input (Constant),           */
371d3bd1e5SMatthias Ringwald     0x05, 0x01, /*          Usage Page (Desktop),       */
381d3bd1e5SMatthias Ringwald     0x09, 0x30, /*          Usage (X),                  */
391d3bd1e5SMatthias Ringwald     0x09, 0x31, /*          Usage (Y),                  */
401d3bd1e5SMatthias Ringwald     0x15, 0x81, /*          Logical Minimum (-127),     */
411d3bd1e5SMatthias Ringwald     0x25, 0x7F, /*          Logical Maximum (127),      */
421d3bd1e5SMatthias Ringwald     0x75, 0x08, /*          Report Size (8),            */
431d3bd1e5SMatthias Ringwald     0x95, 0x02, /*          Report Count (2),           */
441d3bd1e5SMatthias Ringwald     0x81, 0x06, /*          Input (Variable, Relative), */
451d3bd1e5SMatthias Ringwald     0xC0,       /*      End Collection,                 */
461d3bd1e5SMatthias Ringwald     0xC0        /*  End Collection                      */
471d3bd1e5SMatthias Ringwald };
481d3bd1e5SMatthias Ringwald 
491d3bd1e5SMatthias Ringwald const uint8_t mouse_descriptor_with_report_id[] = {
501d3bd1e5SMatthias Ringwald     0x05, 0x01, /*  Usage Page (Desktop),               */
511d3bd1e5SMatthias Ringwald     0x09, 0x02, /*  Usage (Mouse),                      */
521d3bd1e5SMatthias Ringwald     0xA1, 0x01, /*  Collection (Application),           */
531d3bd1e5SMatthias Ringwald 
541d3bd1e5SMatthias Ringwald     0x85,  0x01,                    // Report ID 1
551d3bd1e5SMatthias Ringwald 
561d3bd1e5SMatthias Ringwald     0x09, 0x01, /*      Usage (Pointer),                */
571d3bd1e5SMatthias Ringwald     0xA0,       /*      Collection (Physical),          */
581d3bd1e5SMatthias Ringwald     0x05, 0x09, /*          Usage Page (Button),        */
591d3bd1e5SMatthias Ringwald     0x19, 0x01, /*          Usage Minimum (01h),        */
601d3bd1e5SMatthias Ringwald     0x29, 0x03, /*          Usage Maximum (03h),        */
611d3bd1e5SMatthias Ringwald     0x14,       /*          Logical Minimum (0),        */
621d3bd1e5SMatthias Ringwald     0x25, 0x01, /*          Logical Maximum (1),        */
631d3bd1e5SMatthias Ringwald     0x75, 0x01, /*          Report Size (1),            */
641d3bd1e5SMatthias Ringwald     0x95, 0x03, /*          Report Count (3),           */
651d3bd1e5SMatthias Ringwald     0x81, 0x02, /*          Input (Variable),           */
661d3bd1e5SMatthias Ringwald     0x75, 0x05, /*          Report Size (5),            */
671d3bd1e5SMatthias Ringwald     0x95, 0x01, /*          Report Count (1),           */
681d3bd1e5SMatthias Ringwald     0x81, 0x01, /*          Input (Constant),           */
691d3bd1e5SMatthias Ringwald     0x05, 0x01, /*          Usage Page (Desktop),       */
701d3bd1e5SMatthias Ringwald     0x09, 0x30, /*          Usage (X),                  */
711d3bd1e5SMatthias Ringwald     0x09, 0x31, /*          Usage (Y),                  */
721d3bd1e5SMatthias Ringwald     0x15, 0x81, /*          Logical Minimum (-127),     */
731d3bd1e5SMatthias Ringwald     0x25, 0x7F, /*          Logical Maximum (127),      */
741d3bd1e5SMatthias Ringwald     0x75, 0x08, /*          Report Size (8),            */
751d3bd1e5SMatthias Ringwald     0x95, 0x02, /*          Report Count (2),           */
761d3bd1e5SMatthias Ringwald     0x81, 0x06, /*          Input (Variable, Relative), */
771d3bd1e5SMatthias Ringwald     0xC0,       /*      End Collection,                 */
781d3bd1e5SMatthias Ringwald     0xC0        /*  End Collection                      */
791d3bd1e5SMatthias Ringwald };
801d3bd1e5SMatthias Ringwald 
811d3bd1e5SMatthias Ringwald // from USB HID Specification 1.1, Appendix B.1
821d3bd1e5SMatthias Ringwald const uint8_t hid_descriptor_keyboard_boot_mode[] = {
831d3bd1e5SMatthias Ringwald 
841d3bd1e5SMatthias Ringwald     0x05, 0x01,                    // Usage Page (Generic Desktop)
851d3bd1e5SMatthias Ringwald     0x09, 0x06,                    // Usage (Keyboard)
861d3bd1e5SMatthias Ringwald     0xa1, 0x01,                    // Collection (Application)
871d3bd1e5SMatthias Ringwald 
881d3bd1e5SMatthias Ringwald     // Modifier byte
891d3bd1e5SMatthias Ringwald 
901d3bd1e5SMatthias Ringwald     0x75, 0x01,                    //   Report Size (1)
911d3bd1e5SMatthias Ringwald     0x95, 0x08,                    //   Report Count (8)
921d3bd1e5SMatthias Ringwald     0x05, 0x07,                    //   Usage Page (Key codes)
931d3bd1e5SMatthias Ringwald     0x19, 0xe0,                    //   Usage Minimum (Keyboard LeftControl)
941d3bd1e5SMatthias Ringwald     0x29, 0xe7,                    //   Usage Maxium (Keyboard Right GUI)
951d3bd1e5SMatthias Ringwald     0x15, 0x00,                    //   Logical Minimum (0)
961d3bd1e5SMatthias Ringwald     0x25, 0x01,                    //   Logical Maximum (1)
971d3bd1e5SMatthias Ringwald     0x81, 0x02,                    //   Input (Data, Variable, Absolute)
981d3bd1e5SMatthias Ringwald 
991d3bd1e5SMatthias Ringwald     // Reserved byte
1001d3bd1e5SMatthias Ringwald 
1011d3bd1e5SMatthias Ringwald     0x75, 0x01,                    //   Report Size (1)
1021d3bd1e5SMatthias Ringwald     0x95, 0x08,                    //   Report Count (8)
1031d3bd1e5SMatthias Ringwald     0x81, 0x03,                    //   Input (Constant, Variable, Absolute)
1041d3bd1e5SMatthias Ringwald 
1051d3bd1e5SMatthias Ringwald     // LED report + padding
1061d3bd1e5SMatthias Ringwald 
1071d3bd1e5SMatthias Ringwald     0x95, 0x05,                    //   Report Count (5)
1081d3bd1e5SMatthias Ringwald     0x75, 0x01,                    //   Report Size (1)
1091d3bd1e5SMatthias Ringwald     0x05, 0x08,                    //   Usage Page (LEDs)
1101d3bd1e5SMatthias Ringwald     0x19, 0x01,                    //   Usage Minimum (Num Lock)
1111d3bd1e5SMatthias Ringwald     0x29, 0x05,                    //   Usage Maxium (Kana)
1121d3bd1e5SMatthias Ringwald     0x91, 0x02,                    //   Output (Data, Variable, Absolute)
1131d3bd1e5SMatthias Ringwald 
1141d3bd1e5SMatthias Ringwald     0x95, 0x01,                    //   Report Count (1)
1151d3bd1e5SMatthias Ringwald     0x75, 0x03,                    //   Report Size (3)
1161d3bd1e5SMatthias Ringwald     0x91, 0x03,                    //   Output (Constant, Variable, Absolute)
1171d3bd1e5SMatthias Ringwald 
1181d3bd1e5SMatthias Ringwald     // Keycodes
1191d3bd1e5SMatthias Ringwald 
1201d3bd1e5SMatthias Ringwald     0x95, 0x06,                    //   Report Count (6)
1211d3bd1e5SMatthias Ringwald     0x75, 0x08,                    //   Report Size (8)
1221d3bd1e5SMatthias Ringwald     0x15, 0x00,                    //   Logical Minimum (0)
1231d3bd1e5SMatthias Ringwald     0x25, 0xff,                    //   Logical Maximum (1)
1241d3bd1e5SMatthias Ringwald     0x05, 0x07,                    //   Usage Page (Key codes)
1251d3bd1e5SMatthias Ringwald     0x19, 0x00,                    //   Usage Minimum (Reserved (no event indicated))
1261d3bd1e5SMatthias Ringwald     0x29, 0xff,                    //   Usage Maxium (Reserved)
1271d3bd1e5SMatthias Ringwald     0x81, 0x00,                    //   Input (Data, Array)
1281d3bd1e5SMatthias Ringwald 
1291d3bd1e5SMatthias Ringwald     0xc0,                          // End collection
1301d3bd1e5SMatthias Ringwald };
1311d3bd1e5SMatthias Ringwald 
1321d3bd1e5SMatthias Ringwald const uint8_t combo_descriptor_with_report_ids[] = {
1331d3bd1e5SMatthias Ringwald 
1341d3bd1e5SMatthias Ringwald     0x05, 0x01, /*  Usage Page (Desktop),               */
1351d3bd1e5SMatthias Ringwald     0x09, 0x02, /*  Usage (Mouse),                      */
1361d3bd1e5SMatthias Ringwald     0xA1, 0x01, /*  Collection (Application),           */
1371d3bd1e5SMatthias Ringwald 
1381d3bd1e5SMatthias Ringwald     0x85, 0x01, // Report ID 1
1391d3bd1e5SMatthias Ringwald 
1401d3bd1e5SMatthias Ringwald     0x09, 0x01, /*      Usage (Pointer),                */
1411d3bd1e5SMatthias Ringwald     0xA0,       /*      Collection (Physical),          */
1421d3bd1e5SMatthias Ringwald     0x05, 0x09, /*          Usage Page (Button),        */
1431d3bd1e5SMatthias Ringwald     0x19, 0x01, /*          Usage Minimum (01h),        */
1441d3bd1e5SMatthias Ringwald     0x29, 0x03, /*          Usage Maximum (03h),        */
1451d3bd1e5SMatthias Ringwald     0x14,       /*          Logical Minimum (0),        */
1461d3bd1e5SMatthias Ringwald     0x25, 0x01, /*          Logical Maximum (1),        */
1471d3bd1e5SMatthias Ringwald     0x75, 0x01, /*          Report Size (1),            */
1481d3bd1e5SMatthias Ringwald     0x95, 0x03, /*          Report Count (3),           */
1491d3bd1e5SMatthias Ringwald     0x81, 0x02, /*          Input (Variable),           */
1501d3bd1e5SMatthias Ringwald     0x75, 0x05, /*          Report Size (5),            */
1511d3bd1e5SMatthias Ringwald     0x95, 0x01, /*          Report Count (1),           */
1521d3bd1e5SMatthias Ringwald     0x81, 0x01, /*          Input (Constant),           */
1531d3bd1e5SMatthias Ringwald     0x05, 0x01, /*          Usage Page (Desktop),       */
1541d3bd1e5SMatthias Ringwald     0x09, 0x30, /*          Usage (X),                  */
1551d3bd1e5SMatthias Ringwald     0x09, 0x31, /*          Usage (Y),                  */
1561d3bd1e5SMatthias Ringwald     0x15, 0x81, /*          Logical Minimum (-127),     */
1571d3bd1e5SMatthias Ringwald     0x25, 0x7F, /*          Logical Maximum (127),      */
1581d3bd1e5SMatthias Ringwald     0x75, 0x08, /*          Report Size (8),            */
1591d3bd1e5SMatthias Ringwald     0x95, 0x02, /*          Report Count (2),           */
1601d3bd1e5SMatthias Ringwald     0x81, 0x06, /*          Input (Variable, Relative), */
1611d3bd1e5SMatthias Ringwald     0xC0,       /*      End Collection,                 */
1621d3bd1e5SMatthias Ringwald     0xC0,       /*  End Collection                      */
1631d3bd1e5SMatthias Ringwald 
1641d3bd1e5SMatthias Ringwald     0xa1, 0x01,                    // Collection (Application)
1651d3bd1e5SMatthias Ringwald 
1661d3bd1e5SMatthias Ringwald     0x85, 0x02, // Report ID 2
1671d3bd1e5SMatthias Ringwald 
1681d3bd1e5SMatthias Ringwald     // Modifier byte
1691d3bd1e5SMatthias Ringwald 
1701d3bd1e5SMatthias Ringwald     0x75, 0x01,                    //   Report Size (1)
1711d3bd1e5SMatthias Ringwald     0x95, 0x08,                    //   Report Count (8)
1721d3bd1e5SMatthias Ringwald     0x05, 0x07,                    //   Usage Page (Key codes)
1731d3bd1e5SMatthias Ringwald     0x19, 0xe0,                    //   Usage Minimum (Keyboard LeftControl)
1741d3bd1e5SMatthias Ringwald     0x29, 0xe7,                    //   Usage Maxium (Keyboard Right GUI)
1751d3bd1e5SMatthias Ringwald     0x15, 0x00,                    //   Logical Minimum (0)
1761d3bd1e5SMatthias Ringwald     0x25, 0x01,                    //   Logical Maximum (1)
1771d3bd1e5SMatthias Ringwald     0x81, 0x02,                    //   Input (Data, Variable, Absolute)
1781d3bd1e5SMatthias Ringwald 
1791d3bd1e5SMatthias Ringwald     // Reserved byte
1801d3bd1e5SMatthias Ringwald 
1811d3bd1e5SMatthias Ringwald     0x75, 0x01,                    //   Report Size (1)
1821d3bd1e5SMatthias Ringwald     0x95, 0x08,                    //   Report Count (8)
1831d3bd1e5SMatthias Ringwald     0x81, 0x03,                    //   Input (Constant, Variable, Absolute)
1841d3bd1e5SMatthias Ringwald 
1851d3bd1e5SMatthias Ringwald     // LED report + padding
1861d3bd1e5SMatthias Ringwald 
1871d3bd1e5SMatthias Ringwald     0x95, 0x05,                    //   Report Count (5)
1881d3bd1e5SMatthias Ringwald     0x75, 0x01,                    //   Report Size (1)
1891d3bd1e5SMatthias Ringwald     0x05, 0x08,                    //   Usage Page (LEDs)
1901d3bd1e5SMatthias Ringwald     0x19, 0x01,                    //   Usage Minimum (Num Lock)
1911d3bd1e5SMatthias Ringwald     0x29, 0x05,                    //   Usage Maxium (Kana)
1921d3bd1e5SMatthias Ringwald     0x91, 0x02,                    //   Output (Data, Variable, Absolute)
1931d3bd1e5SMatthias Ringwald 
1941d3bd1e5SMatthias Ringwald     0x95, 0x01,                    //   Report Count (1)
1951d3bd1e5SMatthias Ringwald     0x75, 0x03,                    //   Report Size (3)
1961d3bd1e5SMatthias Ringwald     0x91, 0x03,                    //   Output (Constant, Variable, Absolute)
1971d3bd1e5SMatthias Ringwald 
1981d3bd1e5SMatthias Ringwald     // Keycodes
1991d3bd1e5SMatthias Ringwald 
2001d3bd1e5SMatthias Ringwald     0x95, 0x06,                    //   Report Count (6)
2011d3bd1e5SMatthias Ringwald     0x75, 0x08,                    //   Report Size (8)
2021d3bd1e5SMatthias Ringwald     0x15, 0x00,                    //   Logical Minimum (0)
2031d3bd1e5SMatthias Ringwald     0x25, 0xff,                    //   Logical Maximum (1)
2041d3bd1e5SMatthias Ringwald     0x05, 0x07,                    //   Usage Page (Key codes)
2051d3bd1e5SMatthias Ringwald     0x19, 0x00,                    //   Usage Minimum (Reserved (no event indicated))
2061d3bd1e5SMatthias Ringwald     0x29, 0xff,                    //   Usage Maxium (Reserved)
2071d3bd1e5SMatthias Ringwald     0x81, 0x00,                    //   Input (Data, Array)
2081d3bd1e5SMatthias Ringwald 
2091d3bd1e5SMatthias Ringwald     0xc0,                          // En
2101d3bd1e5SMatthias Ringwald 
2111d3bd1e5SMatthias Ringwald };
2121d3bd1e5SMatthias Ringwald 
213*22931ba2SRicardo Quesada // https://tank-mouse.com/
214*22931ba2SRicardo Quesada const uint8_t tank_mouse_descriptor[] = {
215*22931ba2SRicardo Quesada     0x05, 0x01,        // Usage Page (Generic Desktop Ctrls)
216*22931ba2SRicardo Quesada     0x09, 0x02,        // Usage (Mouse)
217*22931ba2SRicardo Quesada     0xA1, 0x01,        // Collection (Application)
218*22931ba2SRicardo Quesada     0x85, 0x03,        //   Report ID (3)
219*22931ba2SRicardo Quesada     0x09, 0x01,        //   Usage (Pointer)
220*22931ba2SRicardo Quesada     0xA1, 0x00,        //   Collection (Physical)
221*22931ba2SRicardo Quesada     0x05, 0x09,        //     Usage Page (Button)
222*22931ba2SRicardo Quesada     0x19, 0x01,        //     Usage Minimum (0x01)
223*22931ba2SRicardo Quesada     0x29, 0x03,        //     Usage Maximum (0x03)
224*22931ba2SRicardo Quesada     0x15, 0x00,        //     Logical Minimum (0)
225*22931ba2SRicardo Quesada     0x25, 0x01,        //     Logical Maximum (1)
226*22931ba2SRicardo Quesada     0x75, 0x01,        //     Report Size (1)
227*22931ba2SRicardo Quesada     0x95, 0x05,        //     Report Count (5)
228*22931ba2SRicardo Quesada     0x81, 0x02,        //     Input (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position)
229*22931ba2SRicardo Quesada     0x75, 0x03,        //     Report Size (3)
230*22931ba2SRicardo Quesada     0x95, 0x01,        //     Report Count (1)
231*22931ba2SRicardo Quesada     0x81, 0x01,        //     Input (Const,Array,Abs,No Wrap,Linear,Preferred State,No Null Position)
232*22931ba2SRicardo Quesada     0x05, 0x01,        //     Usage Page (Generic Desktop Ctrls)
233*22931ba2SRicardo Quesada     0x09, 0x30,        //     Usage (X)
234*22931ba2SRicardo Quesada     0x09, 0x31,        //     Usage (Y)
235*22931ba2SRicardo Quesada     0x16, 0x01, 0x80,  //     Logical Minimum (-32767)
236*22931ba2SRicardo Quesada     0x26, 0xFF, 0x7F,  //     Logical Maximum (32767)
237*22931ba2SRicardo Quesada     0x75, 0x10,        //     Report Size (16)
238*22931ba2SRicardo Quesada     0x95, 0x02,        //     Report Count (2)
239*22931ba2SRicardo Quesada     0x81, 0x06,        //     Input (Data,Var,Rel,No Wrap,Linear,Preferred State,No Null Position)
240*22931ba2SRicardo Quesada     0x09, 0x38,        //     Usage (Wheel)
241*22931ba2SRicardo Quesada     0x15, 0x81,        //     Logical Minimum (-127)
242*22931ba2SRicardo Quesada     0x25, 0x7F,        //     Logical Maximum (127)
243*22931ba2SRicardo Quesada     0x75, 0x08,        //     Report Size (8)
244*22931ba2SRicardo Quesada     0x95, 0x01,        //     Report Count (1)
245*22931ba2SRicardo Quesada     0x81, 0x06,        //     Input (Data,Var,Rel,No Wrap,Linear,Preferred State,No Null Position)
246*22931ba2SRicardo Quesada     0xC0,              //   End Collection
247*22931ba2SRicardo Quesada     0xC0,              // End Collection
248*22931ba2SRicardo Quesada     0x06, 0x01, 0xFF,  // Usage Page (Vendor Defined 0xFF01)
249*22931ba2SRicardo Quesada     0x09, 0x01,        // Usage (0x01)
250*22931ba2SRicardo Quesada     0xA1, 0x01,        // Collection (Application)
251*22931ba2SRicardo Quesada     0x85, 0x05,        //   Report ID (5)
252*22931ba2SRicardo Quesada     0x09, 0x05,        //   Usage (0x05)
253*22931ba2SRicardo Quesada     0x15, 0x00,        //   Logical Minimum (0)
254*22931ba2SRicardo Quesada     0x26, 0xFF, 0x00,  //   Logical Maximum (255)
255*22931ba2SRicardo Quesada     0x75, 0x08,        //   Report Size (8)
256*22931ba2SRicardo Quesada     0x95, 0x04,        //   Report Count (4)
257*22931ba2SRicardo Quesada     0xB1, 0x02,        //   Feature (Data,Var,Abs,No Wrap,Linear,Preferred State,No Null Position,Non-volatile)
258*22931ba2SRicardo Quesada     0xC0,              // End Collection
259*22931ba2SRicardo Quesada     // 89 bytes
260*22931ba2SRicardo Quesada };
261*22931ba2SRicardo Quesada 
2621d3bd1e5SMatthias Ringwald const uint8_t mouse_report_without_id_positive_xy[]    = {       0x03, 0x02, 0x03 };
2631d3bd1e5SMatthias Ringwald const uint8_t mouse_report_without_id_negative_xy[]    = {       0x03, 0xFE, 0xFD };
2641d3bd1e5SMatthias Ringwald const uint8_t mouse_report_with_id_1[]    = { 0x01, 0x03, 0x02, 0x03 };
2651d3bd1e5SMatthias Ringwald 
2661d3bd1e5SMatthias Ringwald const uint8_t keyboard_report1[] = { 0x01, 0x00, 0x04, 0x05, 0x06, 0x00, 0x00, 0x00 };
2671d3bd1e5SMatthias Ringwald 
2681d3bd1e5SMatthias Ringwald const uint8_t combo_report1[]    = { 0x01, 0x03, 0x02, 0x03 };
2691d3bd1e5SMatthias Ringwald const uint8_t combo_report2[]    = { 0x02, 0x01, 0x00,  0x04, 0x05, 0x06, 0x00, 0x00, 0x00 };
2701d3bd1e5SMatthias Ringwald 
271*22931ba2SRicardo Quesada const uint8_t tank_mouse_report[] = { 0x03, 0x03, 0xFD, 0xFF, 0xF6, 0xFF, 0x00};
272*22931ba2SRicardo Quesada 
2731d3bd1e5SMatthias Ringwald 
2741d3bd1e5SMatthias Ringwald 
2751d3bd1e5SMatthias Ringwald static void expect_field(btstack_hid_parser_t * parser, uint16_t expected_usage_page, uint16_t expected_usage, int32_t expected_value){
2761d3bd1e5SMatthias 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);
2771d3bd1e5SMatthias Ringwald     CHECK_EQUAL(1, btstack_hid_parser_has_more(parser));
2781d3bd1e5SMatthias Ringwald     uint16_t usage_page;
2791d3bd1e5SMatthias Ringwald     uint16_t usage;
2801d3bd1e5SMatthias Ringwald     int32_t value;
2811d3bd1e5SMatthias Ringwald     btstack_hid_parser_get_field(parser, &usage_page, &usage, &value);
2821d3bd1e5SMatthias Ringwald     CHECK_EQUAL(expected_usage_page, usage_page);
2831d3bd1e5SMatthias Ringwald     CHECK_EQUAL(expected_usage, usage);
2841d3bd1e5SMatthias Ringwald     CHECK_EQUAL(expected_value, value);
2851d3bd1e5SMatthias Ringwald }
2861d3bd1e5SMatthias Ringwald 
2871d3bd1e5SMatthias Ringwald // test
2881d3bd1e5SMatthias Ringwald TEST_GROUP(HID){
2891d3bd1e5SMatthias Ringwald 	void setup(void){
2901d3bd1e5SMatthias Ringwald     }
2911d3bd1e5SMatthias Ringwald };
2921d3bd1e5SMatthias Ringwald 
2931d3bd1e5SMatthias Ringwald TEST(HID, MouseWithoutReportID){
2941d3bd1e5SMatthias Ringwald     static btstack_hid_parser_t hid_parser;
2951d3bd1e5SMatthias 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));
2961d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 9, 1, 1);
2971d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 9, 2, 1);
2981d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 9, 3, 0);
2991d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 1, 0x30, 2);
3001d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 1, 0x31, 3);
3011d3bd1e5SMatthias Ringwald     CHECK_EQUAL(24, hid_parser.report_pos_in_bit);
3021d3bd1e5SMatthias Ringwald     CHECK_EQUAL(0, btstack_hid_parser_has_more(&hid_parser));
3031d3bd1e5SMatthias Ringwald }
3041d3bd1e5SMatthias Ringwald 
3051d3bd1e5SMatthias Ringwald TEST(HID, MouseWithoutReportIDSigned){
3061d3bd1e5SMatthias Ringwald     static btstack_hid_parser_t hid_parser;
3071d3bd1e5SMatthias 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));
3081d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 9, 1, 1);
3091d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 9, 2, 1);
3101d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 9, 3, 0);
3111d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 1, 0x30, -2);
3121d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 1, 0x31, -3);
3131d3bd1e5SMatthias Ringwald     CHECK_EQUAL(24, hid_parser.report_pos_in_bit);
3141d3bd1e5SMatthias Ringwald     CHECK_EQUAL(0, btstack_hid_parser_has_more(&hid_parser));
3151d3bd1e5SMatthias Ringwald }
3161d3bd1e5SMatthias Ringwald 
3171d3bd1e5SMatthias Ringwald TEST(HID, MouseWithReportID){
3181d3bd1e5SMatthias Ringwald     static btstack_hid_parser_t hid_parser;
319*22931ba2SRicardo 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));
3201d3bd1e5SMatthias 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));
3211d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 9, 1, 1);
3221d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 9, 2, 1);
3231d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 9, 3, 0);
3241d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 1, 0x30, 2);
3251d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 1, 0x31, 3);
3261d3bd1e5SMatthias Ringwald     CHECK_EQUAL(32, hid_parser.report_pos_in_bit);
3271d3bd1e5SMatthias Ringwald     CHECK_EQUAL(0, btstack_hid_parser_has_more(&hid_parser));
3281d3bd1e5SMatthias Ringwald }
3291d3bd1e5SMatthias Ringwald 
3301d3bd1e5SMatthias Ringwald TEST(HID, BootKeyboard){
3311d3bd1e5SMatthias Ringwald     static btstack_hid_parser_t hid_parser;
3321d3bd1e5SMatthias 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));
3331d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0xe0, 1);
3341d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0xe1, 0);
3351d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0xe2, 0);
3361d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0xe3, 0);
3371d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0xe4, 0);
3381d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0xe5, 0);
3391d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0xe6, 0);
3401d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0xe7, 0);
3411d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0x04, 1);
3421d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0x05, 1);
3431d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0x06, 1);
3441d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0x00, 1);
3451d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0x00, 1);
3461d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0x00, 1);
3471d3bd1e5SMatthias Ringwald     CHECK_EQUAL(64, hid_parser.report_pos_in_bit);
3481d3bd1e5SMatthias Ringwald     CHECK_EQUAL(0, btstack_hid_parser_has_more(&hid_parser));
3491d3bd1e5SMatthias Ringwald }
3501d3bd1e5SMatthias Ringwald 
3511d3bd1e5SMatthias Ringwald TEST(HID, Combo1){
3521d3bd1e5SMatthias Ringwald     static btstack_hid_parser_t hid_parser;
3531d3bd1e5SMatthias 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));
3541d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 9, 1, 1);
3551d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 9, 2, 1);
3561d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 9, 3, 0);
3571d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 1, 0x30, 2);
3581d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 1, 0x31, 3);
3591d3bd1e5SMatthias Ringwald     CHECK_EQUAL(32, hid_parser.report_pos_in_bit);
3601d3bd1e5SMatthias Ringwald     CHECK_EQUAL(0, btstack_hid_parser_has_more(&hid_parser));
3611d3bd1e5SMatthias Ringwald }
3621d3bd1e5SMatthias Ringwald 
3631d3bd1e5SMatthias Ringwald TEST(HID, Combo2){
3641d3bd1e5SMatthias Ringwald     static btstack_hid_parser_t hid_parser;
3651d3bd1e5SMatthias 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));
3661d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0xe0, 1);
3671d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0xe1, 0);
3681d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0xe2, 0);
3691d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0xe3, 0);
3701d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0xe4, 0);
3711d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0xe5, 0);
3721d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0xe6, 0);
3731d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0xe7, 0);
3741d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0x04, 1);
3751d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0x05, 1);
3761d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0x06, 1);
3771d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0x00, 1);
3781d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0x00, 1);
3791d3bd1e5SMatthias Ringwald     expect_field(&hid_parser, 7, 0x00, 1);
3801d3bd1e5SMatthias Ringwald     CHECK_EQUAL(72, hid_parser.report_pos_in_bit);
3811d3bd1e5SMatthias Ringwald     CHECK_EQUAL(0, btstack_hid_parser_has_more(&hid_parser));
3821d3bd1e5SMatthias Ringwald }
3831d3bd1e5SMatthias Ringwald 
384*22931ba2SRicardo Quesada TEST(HID, TankMouse){
385*22931ba2SRicardo Quesada     static btstack_hid_parser_t hid_parser;
386*22931ba2SRicardo Quesada     CHECK_EQUAL(6, btstack_hid_get_report_size_for_id(3, HID_REPORT_TYPE_INPUT, sizeof(tank_mouse_descriptor), tank_mouse_descriptor));
387*22931ba2SRicardo 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));
388*22931ba2SRicardo Quesada     expect_field(&hid_parser, 9, 1, 1);
389*22931ba2SRicardo Quesada     expect_field(&hid_parser, 9, 2, 1);
390*22931ba2SRicardo Quesada     expect_field(&hid_parser, 9, 3, 0);
391*22931ba2SRicardo Quesada     // no usages for 4th and 5th report as usage min..max only allows for 3 button
392*22931ba2SRicardo Quesada     expect_field(&hid_parser, 1, 0x30, -3);
393*22931ba2SRicardo Quesada     expect_field(&hid_parser, 1, 0x31, -10);
394*22931ba2SRicardo Quesada     expect_field(&hid_parser, 1, 0x38, 0);
395*22931ba2SRicardo Quesada     CHECK_EQUAL(56, hid_parser.report_pos_in_bit);
396*22931ba2SRicardo Quesada     CHECK_EQUAL(0, btstack_hid_parser_has_more(&hid_parser));
397*22931ba2SRicardo Quesada }
398*22931ba2SRicardo Quesada 
3991d3bd1e5SMatthias Ringwald TEST(HID, GetReportSize){
4001d3bd1e5SMatthias Ringwald     int report_size = 0;
4011d3bd1e5SMatthias Ringwald     const uint8_t * hid_descriptor =  combo_descriptor_with_report_ids;
4021d3bd1e5SMatthias Ringwald     uint16_t hid_descriptor_len = sizeof(combo_descriptor_with_report_ids);
4031d3bd1e5SMatthias Ringwald     report_size = btstack_hid_get_report_size_for_id(1, HID_REPORT_TYPE_INPUT, hid_descriptor_len, hid_descriptor);
4041d3bd1e5SMatthias Ringwald     CHECK_EQUAL(3, report_size);
4051d3bd1e5SMatthias Ringwald 
4061d3bd1e5SMatthias Ringwald     hid_descriptor = hid_descriptor_keyboard_boot_mode;
4071d3bd1e5SMatthias Ringwald     hid_descriptor_len = sizeof(hid_descriptor_keyboard_boot_mode);
4081d3bd1e5SMatthias Ringwald     report_size = btstack_hid_get_report_size_for_id(0, HID_REPORT_TYPE_OUTPUT, hid_descriptor_len, hid_descriptor);
4091d3bd1e5SMatthias Ringwald     CHECK_EQUAL(1, report_size);
4101d3bd1e5SMatthias Ringwald     report_size = btstack_hid_get_report_size_for_id(0, HID_REPORT_TYPE_INPUT, hid_descriptor_len, hid_descriptor);
4111d3bd1e5SMatthias Ringwald     CHECK_EQUAL(8, report_size);
4121d3bd1e5SMatthias Ringwald }
4131d3bd1e5SMatthias Ringwald 
4141d3bd1e5SMatthias Ringwald 
4151d3bd1e5SMatthias Ringwald int main (int argc, const char * argv[]){
4161d3bd1e5SMatthias Ringwald     // log into file using HCI_DUMP_PACKETLOGGER format
4171d3bd1e5SMatthias Ringwald     const char * pklg_path = "hci_dump.pklg";
4181d3bd1e5SMatthias Ringwald     hci_dump_posix_fs_open(pklg_path, HCI_DUMP_PACKETLOGGER);
4191d3bd1e5SMatthias Ringwald     hci_dump_init(hci_dump_posix_fs_get_instance());
4201d3bd1e5SMatthias Ringwald     printf("Packet Log: %s\n", pklg_path);
4211d3bd1e5SMatthias Ringwald 
4221d3bd1e5SMatthias Ringwald     return CommandLineTestRunner::RunAllTests(argc, argv);
4231d3bd1e5SMatthias Ringwald }
424