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:
parent
bc80d686f5
commit
b2019e4d71
|
@ -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
|
// MOUSE
|
||||||
//--------------------------------------------------------------------+
|
//--------------------------------------------------------------------+
|
||||||
|
|
|
@ -301,14 +301,37 @@ static inline bool tud_hid_mouse_report(uint8_t report_id, uint8_t buttons, int8
|
||||||
HID_COLLECTION_END \
|
HID_COLLECTION_END \
|
||||||
|
|
||||||
// Gamepad Report Descriptor Template
|
// Gamepad Report Descriptor Template
|
||||||
// with 16 buttons and 2 joysticks with following layout
|
// with 16 buttons, 2 joysticks and 1 hat/dpad with following layout
|
||||||
// | Button Map (2 bytes) | X | Y | Z | Rz
|
// | X | Y | Z | Rz | Rx | Ry (1 byte each) | hat/DPAD (1 byte) | Button Map (2 bytes) |
|
||||||
#define TUD_HID_REPORT_DESC_GAMEPAD(...) \
|
#define TUD_HID_REPORT_DESC_GAMEPAD(...) \
|
||||||
HID_USAGE_PAGE ( HID_USAGE_PAGE_DESKTOP ) ,\
|
HID_USAGE_PAGE ( HID_USAGE_PAGE_DESKTOP ) ,\
|
||||||
HID_USAGE ( HID_USAGE_DESKTOP_GAMEPAD ) ,\
|
HID_USAGE ( HID_USAGE_DESKTOP_GAMEPAD ) ,\
|
||||||
HID_COLLECTION ( HID_COLLECTION_APPLICATION ) ,\
|
HID_COLLECTION ( HID_COLLECTION_APPLICATION ) ,\
|
||||||
/* Report ID if any */\
|
/* Report ID if any */\
|
||||||
__VA_ARGS__ \
|
__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 */ \
|
/* 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 ) ,\
|
||||||
|
@ -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_COUNT ( 16 ) ,\
|
||||||
HID_REPORT_SIZE ( 1 ) ,\
|
HID_REPORT_SIZE ( 1 ) ,\
|
||||||
HID_INPUT ( HID_DATA | HID_VARIABLE | HID_ABSOLUTE ) ,\
|
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_COLLECTION_END \
|
||||||
|
|
||||||
// HID Generic Input & Output
|
// HID Generic Input & Output
|
||||||
|
|
Loading…
Reference in New Issue