Merge pull request #882 from mmosca/master
Add support for 32 button gamepads
This commit is contained in:
		| @@ -201,30 +201,73 @@ typedef struct TU_ATTR_PACKED | |||||||
|   int8_t  rx;        ///< Delta Rx movement of analog left trigger |   int8_t  rx;        ///< Delta Rx movement of analog left trigger | ||||||
|   int8_t  ry;        ///< Delta Ry movement of analog right trigger |   int8_t  ry;        ///< Delta Ry movement of analog right trigger | ||||||
|   uint8_t hat;       ///< Buttons mask for currently pressed buttons in the DPad/hat |   uint8_t hat;       ///< Buttons mask for currently pressed buttons in the DPad/hat | ||||||
|   uint16_t buttons;  ///< Buttons mask for currently pressed buttons |   uint32_t buttons;  ///< Buttons mask for currently pressed buttons | ||||||
| }hid_gamepad_report_t; | }hid_gamepad_report_t; | ||||||
|  |  | ||||||
| /// Standard Gamepad Buttons Bitmap (from Linux input event codes) | /// Standard Gamepad Buttons Bitmap | ||||||
| typedef enum | typedef enum | ||||||
| { | { | ||||||
|   GAMEPAD_BUTTON_A      = TU_BIT(0),  ///< A/South button |   GAMEPAD_BUTTON_0  = TU_BIT(0), | ||||||
|   GAMEPAD_BUTTON_B      = TU_BIT(1),  ///< B/East button |   GAMEPAD_BUTTON_1  = TU_BIT(1), | ||||||
|   GAMEPAD_BUTTON_C      = TU_BIT(2),  ///< C button |   GAMEPAD_BUTTON_2  = TU_BIT(2), | ||||||
|   GAMEPAD_BUTTON_X      = TU_BIT(3),  ///< X/North button |   GAMEPAD_BUTTON_3  = TU_BIT(3), | ||||||
|   GAMEPAD_BUTTON_Y      = TU_BIT(4),  ///< Y/West button |   GAMEPAD_BUTTON_4  = TU_BIT(4), | ||||||
|   GAMEPAD_BUTTON_Z      = TU_BIT(5),  ///< Z button |   GAMEPAD_BUTTON_5  = TU_BIT(5), | ||||||
|   GAMEPAD_BUTTON_TL     = TU_BIT(6),  ///< L1 button |   GAMEPAD_BUTTON_6  = TU_BIT(6), | ||||||
|   GAMEPAD_BUTTON_TR     = TU_BIT(7),  ///< R1 button |   GAMEPAD_BUTTON_7  = TU_BIT(7), | ||||||
|   GAMEPAD_BUTTON_TL2    = TU_BIT(8),  ///< L2 button |   GAMEPAD_BUTTON_8  = TU_BIT(8), | ||||||
|   GAMEPAD_BUTTON_TR2    = TU_BIT(9),  ///< R2 button |   GAMEPAD_BUTTON_9  = TU_BIT(9), | ||||||
|   GAMEPAD_BUTTON_SELECT = TU_BIT(10), ///< Select button |   GAMEPAD_BUTTON_10 = TU_BIT(10), | ||||||
|   GAMEPAD_BUTTON_START  = TU_BIT(11), ///< Start button |   GAMEPAD_BUTTON_11 = TU_BIT(11), | ||||||
|   GAMEPAD_BUTTON_MODE   = TU_BIT(12), ///< Mode button |   GAMEPAD_BUTTON_12 = TU_BIT(12), | ||||||
|   GAMEPAD_BUTTON_THUMBL = TU_BIT(13), ///< L3 button |   GAMEPAD_BUTTON_13 = TU_BIT(13), | ||||||
|   GAMEPAD_BUTTON_THUMBR = TU_BIT(14), ///< R3 button |   GAMEPAD_BUTTON_14 = TU_BIT(14), | ||||||
| //GAMEPAD_BUTTON_       = TU_BIT(15), ///< Undefined button |   GAMEPAD_BUTTON_15 = TU_BIT(15), | ||||||
|  |   GAMEPAD_BUTTON_16 = TU_BIT(16), | ||||||
|  |   GAMEPAD_BUTTON_17 = TU_BIT(17), | ||||||
|  |   GAMEPAD_BUTTON_18 = TU_BIT(18), | ||||||
|  |   GAMEPAD_BUTTON_19 = TU_BIT(19), | ||||||
|  |   GAMEPAD_BUTTON_20 = TU_BIT(20), | ||||||
|  |   GAMEPAD_BUTTON_21 = TU_BIT(21), | ||||||
|  |   GAMEPAD_BUTTON_22 = TU_BIT(22), | ||||||
|  |   GAMEPAD_BUTTON_23 = TU_BIT(23), | ||||||
|  |   GAMEPAD_BUTTON_24 = TU_BIT(24), | ||||||
|  |   GAMEPAD_BUTTON_25 = TU_BIT(25), | ||||||
|  |   GAMEPAD_BUTTON_26 = TU_BIT(26), | ||||||
|  |   GAMEPAD_BUTTON_27 = TU_BIT(27), | ||||||
|  |   GAMEPAD_BUTTON_28 = TU_BIT(28), | ||||||
|  |   GAMEPAD_BUTTON_29 = TU_BIT(29), | ||||||
|  |   GAMEPAD_BUTTON_30 = TU_BIT(30), | ||||||
|  |   GAMEPAD_BUTTON_31 = TU_BIT(31), | ||||||
| }hid_gamepad_button_bm_t; | }hid_gamepad_button_bm_t; | ||||||
|  |  | ||||||
|  | /// Standard Gamepad Buttons Naming from Linux input event codes | ||||||
|  | /// https://github.com/torvalds/linux/blob/master/include/uapi/linux/input-event-codes.h | ||||||
|  | #define GAMEPAD_BUTTON_A       GAMEPAD_BUTTON_0 | ||||||
|  | #define GAMEPAD_BUTTON_SOUTH   GAMEPAD_BUTTON_0 | ||||||
|  |  | ||||||
|  | #define GAMEPAD_BUTTON_B       GAMEPAD_BUTTON_1 | ||||||
|  | #define GAMEPAD_BUTTON_EAST    GAMEPAD_BUTTON_1 | ||||||
|  |  | ||||||
|  | #define GAMEPAD_BUTTON_C       GAMEPAD_BUTTON_2 | ||||||
|  |  | ||||||
|  | #define GAMEPAD_BUTTON_X       GAMEPAD_BUTTON_3 | ||||||
|  | #define GAMEPAD_BUTTON_NORTH   GAMEPAD_BUTTON_3 | ||||||
|  |  | ||||||
|  | #define GAMEPAD_BUTTON_Y       GAMEPAD_BUTTON_4 | ||||||
|  | #define GAMEPAD_BUTTON_WEST    GAMEPAD_BUTTON_4 | ||||||
|  |  | ||||||
|  | #define GAMEPAD_BUTTON_Z       GAMEPAD_BUTTON_5 | ||||||
|  | #define GAMEPAD_BUTTON_TL      GAMEPAD_BUTTON_6 | ||||||
|  | #define GAMEPAD_BUTTON_TR      GAMEPAD_BUTTON_7 | ||||||
|  | #define GAMEPAD_BUTTON_TL2     GAMEPAD_BUTTON_8 | ||||||
|  | #define GAMEPAD_BUTTON_TR2     GAMEPAD_BUTTON_9 | ||||||
|  | #define GAMEPAD_BUTTON_SELECT  GAMEPAD_BUTTON_10 | ||||||
|  | #define GAMEPAD_BUTTON_START   GAMEPAD_BUTTON_11 | ||||||
|  | #define GAMEPAD_BUTTON_MODE    GAMEPAD_BUTTON_12 | ||||||
|  | #define GAMEPAD_BUTTON_THUMBL  GAMEPAD_BUTTON_13 | ||||||
|  | #define GAMEPAD_BUTTON_THUMBR  GAMEPAD_BUTTON_14 | ||||||
|  |  | ||||||
| /// Standard Gamepad HAT/DPAD Buttons (from Linux input event codes) | /// Standard Gamepad HAT/DPAD Buttons (from Linux input event codes) | ||||||
| typedef enum | typedef enum | ||||||
| { | { | ||||||
|   | |||||||
| @@ -149,7 +149,7 @@ bool tud_hid_n_mouse_report(uint8_t instance, uint8_t report_id, | |||||||
| } | } | ||||||
|  |  | ||||||
| bool tud_hid_n_gamepad_report(uint8_t instance, uint8_t report_id, | bool tud_hid_n_gamepad_report(uint8_t instance, uint8_t report_id, | ||||||
|                               int8_t x, int8_t y, int8_t z, int8_t rz, int8_t rx, int8_t ry, uint8_t hat, uint16_t buttons) |                               int8_t x, int8_t y, int8_t z, int8_t rz, int8_t rx, int8_t ry, uint8_t hat, uint32_t buttons) | ||||||
| { | { | ||||||
|   hid_gamepad_report_t report = |   hid_gamepad_report_t report = | ||||||
|   { |   { | ||||||
|   | |||||||
| @@ -72,9 +72,9 @@ bool tud_hid_n_keyboard_report(uint8_t instance, uint8_t report_id, uint8_t modi | |||||||
| // use template layout report as defined by hid_mouse_report_t | // use template layout report as defined by hid_mouse_report_t | ||||||
| bool tud_hid_n_mouse_report(uint8_t instance, uint8_t report_id, uint8_t buttons, int8_t x, int8_t y, int8_t vertical, int8_t horizontal); | bool tud_hid_n_mouse_report(uint8_t instance, uint8_t report_id, uint8_t buttons, int8_t x, int8_t y, int8_t vertical, int8_t horizontal); | ||||||
|  |  | ||||||
| // Gamepad: convenient helper to send mouse report if application | // Gamepad: convenient helper to send gamepad report if application | ||||||
| // use template layout report TUD_HID_REPORT_DESC_GAMEPAD | // use template layout report TUD_HID_REPORT_DESC_GAMEPAD | ||||||
| bool tud_hid_n_gamepad_report(uint8_t instance, uint8_t report_id, int8_t x, int8_t y, int8_t z, int8_t rz, int8_t rx, int8_t ry, uint8_t hat, uint16_t buttons); | bool tud_hid_n_gamepad_report(uint8_t instance, uint8_t report_id, int8_t x, int8_t y, int8_t z, int8_t rz, int8_t rx, int8_t ry, uint8_t hat, uint32_t buttons); | ||||||
|  |  | ||||||
| //--------------------------------------------------------------------+ | //--------------------------------------------------------------------+ | ||||||
| // Application API (Single Port) | // Application API (Single Port) | ||||||
| @@ -85,7 +85,7 @@ static inline uint8_t tud_hid_get_protocol(void); | |||||||
| static inline bool    tud_hid_report(uint8_t report_id, void const* report, uint8_t len); | static inline bool    tud_hid_report(uint8_t report_id, void const* report, uint8_t len); | ||||||
| static inline bool    tud_hid_keyboard_report(uint8_t report_id, uint8_t modifier, uint8_t keycode[6]); | static inline bool    tud_hid_keyboard_report(uint8_t report_id, uint8_t modifier, uint8_t keycode[6]); | ||||||
| static inline bool    tud_hid_mouse_report(uint8_t report_id, uint8_t buttons, int8_t x, int8_t y, int8_t vertical, int8_t horizontal); | static inline bool    tud_hid_mouse_report(uint8_t report_id, uint8_t buttons, int8_t x, int8_t y, int8_t vertical, int8_t horizontal); | ||||||
| static inline bool    tud_hid_gamepad_report(uint8_t report_id, int8_t x, int8_t y, int8_t z, int8_t rz, int8_t rx, int8_t ry, uint8_t hat, uint16_t buttons); | static inline bool    tud_hid_gamepad_report(uint8_t report_id, int8_t x, int8_t y, int8_t z, int8_t rz, int8_t rx, int8_t ry, uint8_t hat, uint32_t buttons); | ||||||
|  |  | ||||||
| //--------------------------------------------------------------------+ | //--------------------------------------------------------------------+ | ||||||
| // Callbacks (Weak is optional) | // Callbacks (Weak is optional) | ||||||
| @@ -152,7 +152,7 @@ static inline bool tud_hid_mouse_report(uint8_t report_id, uint8_t buttons, int8 | |||||||
|   return tud_hid_n_mouse_report(0, report_id, buttons, x, y, vertical, horizontal); |   return tud_hid_n_mouse_report(0, report_id, buttons, x, y, vertical, horizontal); | ||||||
| } | } | ||||||
|  |  | ||||||
| static inline bool  tud_hid_gamepad_report(uint8_t report_id, int8_t x, int8_t y, int8_t z, int8_t rz, int8_t rx, int8_t ry, uint8_t hat, uint16_t buttons) | static inline bool  tud_hid_gamepad_report(uint8_t report_id, int8_t x, int8_t y, int8_t z, int8_t rz, int8_t rx, int8_t ry, uint8_t hat, uint32_t buttons) | ||||||
| { | { | ||||||
|   return tud_hid_n_gamepad_report(0, report_id, x, y, z, rz, rx, ry, hat, buttons); |   return tud_hid_n_gamepad_report(0, report_id, x, y, z, rz, rx, ry, hat, buttons); | ||||||
| } | } | ||||||
| @@ -344,10 +344,10 @@ static inline bool  tud_hid_gamepad_report(uint8_t report_id, int8_t x, int8_t y | |||||||
|     /* 16 bit Button Map */ \ |     /* 16 bit Button Map */ \ | ||||||
|     HID_USAGE_PAGE   ( HID_USAGE_PAGE_BUTTON                  ) ,\ |     HID_USAGE_PAGE   ( HID_USAGE_PAGE_BUTTON                  ) ,\ | ||||||
|     HID_USAGE_MIN    ( 1                                      ) ,\ |     HID_USAGE_MIN    ( 1                                      ) ,\ | ||||||
|     HID_USAGE_MAX    ( 16                                     ) ,\ |     HID_USAGE_MAX    ( 32                                     ) ,\ | ||||||
|     HID_LOGICAL_MIN  ( 0                                      ) ,\ |     HID_LOGICAL_MIN  ( 0                                      ) ,\ | ||||||
|     HID_LOGICAL_MAX  ( 1                                      ) ,\ |     HID_LOGICAL_MAX  ( 1                                      ) ,\ | ||||||
|     HID_REPORT_COUNT ( 16                                     ) ,\ |     HID_REPORT_COUNT ( 32                                     ) ,\ | ||||||
|     HID_REPORT_SIZE  ( 1                                      ) ,\ |     HID_REPORT_SIZE  ( 1                                      ) ,\ | ||||||
|     HID_INPUT        ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ) ,\ |     HID_INPUT        ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ) ,\ | ||||||
|   HID_COLLECTION_END \ |   HID_COLLECTION_END \ | ||||||
|   | |||||||
| @@ -51,7 +51,7 @@ | |||||||
| #define U32_TO_U8S_BE(u32)    TU_U32_BYTE3(u32), TU_U32_BYTE2(u32), TU_U32_BYTE1(u32), TU_U32_BYTE0(u32) | #define U32_TO_U8S_BE(u32)    TU_U32_BYTE3(u32), TU_U32_BYTE2(u32), TU_U32_BYTE1(u32), TU_U32_BYTE0(u32) | ||||||
| #define U32_TO_U8S_LE(u32)    TU_U32_BYTE0(u32), TU_U32_BYTE1(u32), TU_U32_BYTE2(u32), TU_U32_BYTE3(u32) | #define U32_TO_U8S_LE(u32)    TU_U32_BYTE0(u32), TU_U32_BYTE1(u32), TU_U32_BYTE2(u32), TU_U32_BYTE3(u32) | ||||||
|  |  | ||||||
| #define TU_BIT(n)             (1U << (n)) | #define TU_BIT(n)             (1UL << (n)) | ||||||
|  |  | ||||||
| //--------------------------------------------------------------------+ | //--------------------------------------------------------------------+ | ||||||
| // Includes | // Includes | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Ha Thach
					Ha Thach