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