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