enhance gampepad report with dpad/hat support
add hid_gamepad_report_t along with GAMEPAD_BUTTON_ and GAMEPAD_HAT_ enum
This commit is contained in:
		| @@ -143,6 +143,97 @@ typedef enum | ||||
|  | ||||
| /** @} */ | ||||
|  | ||||
| //--------------------------------------------------------------------+ | ||||
| // GAMEPAD | ||||
| //--------------------------------------------------------------------+ | ||||
| /** \addtogroup ClassDriver_HID_Gamepad Gamepad | ||||
|  *  @{ */ | ||||
|  | ||||
| /* From https://www.kernel.org/doc/html/latest/input/gamepad.html | ||||
|           ____________________________              __ | ||||
|          / [__ZL__]          [__ZR__] \               | | ||||
|         / [__ TL __]        [__ TR __] \              | Front Triggers | ||||
|      __/________________________________\__         __| | ||||
|     /                                  _   \          | | ||||
|    /      /\           __             (N)   \         | | ||||
|   /       ||      __  |MO|  __     _       _ \        | Main Pad | ||||
|  |    <===DP===> |SE|      |ST|   (W) -|- (E) |       | | ||||
|   \       ||    ___          ___       _     /        | | ||||
|   /\      \/   /   \        /   \     (S)   /\      __| | ||||
|  /  \________ | LS  | ____ |  RS | ________/  \       | | ||||
| |         /  \ \___/ /    \ \___/ /  \         |      | Control Sticks | ||||
| |        /    \_____/      \_____/    \        |    __| | ||||
| |       /                              \       | | ||||
|  \_____/                                \_____/ | ||||
|  | ||||
|      |________|______|    |______|___________| | ||||
|        D-Pad    Left       Right   Action Pad | ||||
|                Stick       Stick | ||||
|  | ||||
|                  |_____________| | ||||
|                     Menu Pad | ||||
|  | ||||
|   Most gamepads have the following features: | ||||
|   - Action-Pad 4 buttons in diamonds-shape (on the right side) NORTH, SOUTH, WEST and EAST. | ||||
|   - D-Pad (Direction-pad) 4 buttons (on the left side) that point up, down, left and right. | ||||
|   - Menu-Pad Different constellations, but most-times 2 buttons: SELECT - START. | ||||
|   - Analog-Sticks provide freely moveable sticks to control directions, Analog-sticks may also | ||||
|   provide a digital button if you press them. | ||||
|   - Triggers are located on the upper-side of the pad in vertical direction. The upper buttons | ||||
|   are normally named Left- and Right-Triggers, the lower buttons Z-Left and Z-Right. | ||||
|   - Rumble Many devices provide force-feedback features. But are mostly just simple rumble motors. | ||||
|  */ | ||||
|  | ||||
| /// HID Gamepad Protocol Report. | ||||
| typedef struct TU_ATTR_PACKED | ||||
| { | ||||
|   int8_t  x;         ///< Delta x  movement of left analog-stick | ||||
|   int8_t  y;         ///< Delta y  movement of left analog-stick | ||||
|   int8_t  z;         ///< Delta z  movement of right analog-joystick | ||||
|   int8_t  rz;        ///< Delta Rz movement of right analog-joystick | ||||
|   int8_t  rx;        ///< Delta Rx movement of analog left trigger | ||||
|   int8_t  ry;        ///< Delta Ry movement of analog right trigger | ||||
|   uint8_t hat;       ///< Buttons mask for currently pressed buttons in the DPad/hat | ||||
|   uint16_t buttons;  ///< Buttons mask for currently pressed buttons | ||||
| }hid_gamepad_report_t; | ||||
|  | ||||
| /// Standard Gamepad Buttons Bitmap (from Linux input event codes) | ||||
| typedef enum | ||||
| { | ||||
|   GAMEPAD_BUTTON_A      = TU_BIT(0),  ///< A/South button | ||||
|   GAMEPAD_BUTTON_B      = TU_BIT(1),  ///< B/East button | ||||
|   GAMEPAD_BUTTON_C      = TU_BIT(2),  ///< C button | ||||
|   GAMEPAD_BUTTON_X      = TU_BIT(3),  ///< X/North button | ||||
|   GAMEPAD_BUTTON_Y      = TU_BIT(4),  ///< Y/West button | ||||
|   GAMEPAD_BUTTON_Z      = TU_BIT(5),  ///< Z button | ||||
|   GAMEPAD_BUTTON_TL     = TU_BIT(6),  ///< L1 button | ||||
|   GAMEPAD_BUTTON_TR     = TU_BIT(7),  ///< R1 button | ||||
|   GAMEPAD_BUTTON_TL2    = TU_BIT(8),  ///< L2 button | ||||
|   GAMEPAD_BUTTON_TR2    = TU_BIT(9),  ///< R2 button | ||||
|   GAMEPAD_BUTTON_SELECT = TU_BIT(10), ///< Select button | ||||
|   GAMEPAD_BUTTON_START  = TU_BIT(11), ///< Start button | ||||
|   GAMEPAD_BUTTON_MODE   = TU_BIT(12), ///< Mode button | ||||
|   GAMEPAD_BUTTON_THUMBL = TU_BIT(13), ///< L3 button | ||||
|   GAMEPAD_BUTTON_THUMBR = TU_BIT(14), ///< R3 button | ||||
| //GAMEPAD_BUTTON_       = TU_BIT(15), ///< Undefined button | ||||
| }hid_gamepad_button_bm_t; | ||||
|  | ||||
| /// Standard Gamepad HAT/DPAD Buttons Bitmap (from Linux input event codes) | ||||
| typedef enum | ||||
| { | ||||
|   GAMEPAD_HAT_CENTERED   = 0,  ///< DPAD_CENTERED | ||||
|   GAMEPAD_HAT_UP         = 1,  ///< DPAD_UP | ||||
|   GAMEPAD_HAT_UP_RIGHT   = 2,  ///< DPAD_UP_RIGHT | ||||
|   GAMEPAD_HAT_RIGHT      = 3,  ///< DPAD_RIGHT | ||||
|   GAMEPAD_HAT_DOWN_RIGHT = 4,  ///< DPAD_DOWN_RIGHT | ||||
|   GAMEPAD_HAT_DOWN       = 5,  ///< DPAD_DOWN | ||||
|   GAMEPAD_HAT_DOWN_LEFT  = 6,  ///< DPAD_DOWN_LEFT | ||||
|   GAMEPAD_HAT_LEFT       = 7,  ///< DPAD_LEFT | ||||
|   GAMEPAD_HAT_UP_LEFT    = 8,  ///< DPAD_UP_LEFT | ||||
| }hid_gamepad_hat_bm_t; | ||||
|  | ||||
| /// @} | ||||
|  | ||||
| //--------------------------------------------------------------------+ | ||||
| // MOUSE | ||||
| //--------------------------------------------------------------------+ | ||||
|   | ||||
| @@ -301,14 +301,37 @@ static inline bool tud_hid_mouse_report(uint8_t report_id, uint8_t buttons, int8 | ||||
|   HID_COLLECTION_END \ | ||||
|  | ||||
| // Gamepad Report Descriptor Template | ||||
| // with 16 buttons and 2 joysticks with following layout | ||||
| // | Button Map (2 bytes) |  X | Y | Z | Rz | ||||
| // with 16 buttons, 2 joysticks and 1 hat/dpad with following layout | ||||
| // | X | Y | Z | Rz | Rx | Ry (1 byte each) | hat/DPAD (1 byte) | Button Map (2 bytes) | | ||||
| #define TUD_HID_REPORT_DESC_GAMEPAD(...) \ | ||||
|   HID_USAGE_PAGE ( HID_USAGE_PAGE_DESKTOP     )        ,\ | ||||
|   HID_USAGE      ( HID_USAGE_DESKTOP_GAMEPAD  )        ,\ | ||||
|   HID_COLLECTION ( HID_COLLECTION_APPLICATION )        ,\ | ||||
|   HID_USAGE_PAGE ( HID_USAGE_PAGE_DESKTOP     )                 ,\ | ||||
|   HID_USAGE      ( HID_USAGE_DESKTOP_GAMEPAD  )                 ,\ | ||||
|   HID_COLLECTION ( HID_COLLECTION_APPLICATION )                 ,\ | ||||
|     /* Report ID if any */\ | ||||
|     __VA_ARGS__ \ | ||||
|     /* 8 bit X, Y, Z, Rz, Rx, Ry (min -127, max 127 ) */ \ | ||||
|     HID_USAGE_PAGE   ( HID_USAGE_PAGE_DESKTOP                 ) ,\ | ||||
|     HID_USAGE        ( HID_USAGE_DESKTOP_X                    ) ,\ | ||||
|     HID_USAGE        ( HID_USAGE_DESKTOP_Y                    ) ,\ | ||||
|     HID_USAGE        ( HID_USAGE_DESKTOP_Z                    ) ,\ | ||||
|     HID_USAGE        ( HID_USAGE_DESKTOP_RZ                   ) ,\ | ||||
|     HID_USAGE        ( HID_USAGE_DESKTOP_RX                   ) ,\ | ||||
|     HID_USAGE        ( HID_USAGE_DESKTOP_RY                   ) ,\ | ||||
|     HID_LOGICAL_MIN  ( 0x81                                   ) ,\ | ||||
|     HID_LOGICAL_MAX  ( 0x7f                                   ) ,\ | ||||
|     HID_REPORT_COUNT ( 6                                      ) ,\ | ||||
|     HID_REPORT_SIZE  ( 8                                      ) ,\ | ||||
|     HID_INPUT        ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ) ,\ | ||||
|     /* 8 bit DPad/Hat Button Map  */ \ | ||||
|     HID_USAGE_PAGE   ( HID_USAGE_PAGE_DESKTOP                 ) ,\ | ||||
|     HID_USAGE        ( HID_USAGE_DESKTOP_HAT_SWITCH           ) ,\ | ||||
|     HID_LOGICAL_MIN  ( 1                                      ) ,\ | ||||
|     HID_LOGICAL_MAX  ( 8                                      ) ,\ | ||||
|     HID_PHYSICAL_MIN ( 0                                      ) ,\ | ||||
|     HID_PHYSICAL_MAX_N ( 315, 2                               ) ,\ | ||||
|     HID_REPORT_COUNT ( 1                                      ) ,\ | ||||
|     HID_REPORT_SIZE  ( 8                                      ) ,\ | ||||
|     HID_INPUT        ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ) ,\ | ||||
|     /* 16 bit Button Map */ \ | ||||
|     HID_USAGE_PAGE   ( HID_USAGE_PAGE_BUTTON                  ) ,\ | ||||
|     HID_USAGE_MIN    ( 1                                      ) ,\ | ||||
| @@ -318,17 +341,6 @@ static inline bool tud_hid_mouse_report(uint8_t report_id, uint8_t buttons, int8 | ||||
|     HID_REPORT_COUNT ( 16                                     ) ,\ | ||||
|     HID_REPORT_SIZE  ( 1                                      ) ,\ | ||||
|     HID_INPUT        ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ) ,\ | ||||
|     /* X, Y, Z, Rz (min -127, max 127 ) */ \ | ||||
|     HID_USAGE_PAGE   ( HID_USAGE_PAGE_DESKTOP                 ) ,\ | ||||
|     HID_LOGICAL_MIN  ( 0x81                                   ) ,\ | ||||
|     HID_LOGICAL_MAX  ( 0x7f                                   ) ,\ | ||||
|     HID_USAGE        ( HID_USAGE_DESKTOP_X                    ) ,\ | ||||
|     HID_USAGE        ( HID_USAGE_DESKTOP_Y                    ) ,\ | ||||
|     HID_USAGE        ( HID_USAGE_DESKTOP_Z                    ) ,\ | ||||
|     HID_USAGE        ( HID_USAGE_DESKTOP_RZ                   ) ,\ | ||||
|     HID_REPORT_COUNT ( 4                                      ) ,\ | ||||
|     HID_REPORT_SIZE  ( 8                                      ) ,\ | ||||
|     HID_INPUT        ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ) ,\ | ||||
|   HID_COLLECTION_END \ | ||||
|  | ||||
| // HID Generic Input & Output | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 hathach
					hathach