add tud_hid_n_gamepad_report() helper for gamepad report

- Add gamepad to hid_composite example. Though it needs a bit of extra
work but it will come later as separated PR.
This commit is contained in:
hathach 2021-02-08 19:08:16 +07:00
parent b2019e4d71
commit 72bcc0685c
7 changed files with 65 additions and 15 deletions

View File

@ -183,6 +183,35 @@ void hid_task(void)
if (has_consumer_key) tud_hid_report(REPORT_ID_CONSUMER_CONTROL, &empty_key, 2); if (has_consumer_key) tud_hid_report(REPORT_ID_CONSUMER_CONTROL, &empty_key, 2);
has_consumer_key = false; has_consumer_key = false;
} }
// delay a bit before sending next report
board_delay(10);
}
/*------------- Gamepad -------------*/
if ( tud_hid_ready() )
{
// use to avoid send multiple consecutive zero report for keyboard
static bool has_gamepad_key = false;
hid_gamepad_report_t report =
{
.x = 0, .y = 0, .z = 0, .rz = 0, .rx = 0, .ry = 0,
.hat = 0, .buttons = 0
};
if ( btn )
{
report.hat = GAMEPAD_HAT_UP;
tud_hid_report(REPORT_ID_GAMEPAD, &report, sizeof(report));
has_gamepad_key = true;
}else
{
report.hat = GAMEPAD_HAT_CENTERED;
if (has_gamepad_key) tud_hid_report(REPORT_ID_GAMEPAD, &report, sizeof(report));
has_gamepad_key = false;
}
} }
} }

View File

@ -75,7 +75,8 @@ uint8_t const desc_hid_report[] =
{ {
TUD_HID_REPORT_DESC_KEYBOARD( HID_REPORT_ID(REPORT_ID_KEYBOARD )), TUD_HID_REPORT_DESC_KEYBOARD( HID_REPORT_ID(REPORT_ID_KEYBOARD )),
TUD_HID_REPORT_DESC_MOUSE ( HID_REPORT_ID(REPORT_ID_MOUSE )), TUD_HID_REPORT_DESC_MOUSE ( HID_REPORT_ID(REPORT_ID_MOUSE )),
TUD_HID_REPORT_DESC_CONSUMER( HID_REPORT_ID(REPORT_ID_CONSUMER_CONTROL )) TUD_HID_REPORT_DESC_CONSUMER( HID_REPORT_ID(REPORT_ID_CONSUMER_CONTROL )),
TUD_HID_REPORT_DESC_GAMEPAD ( HID_REPORT_ID(REPORT_ID_GAMEPAD ))
}; };
// Invoked when received GET HID REPORT DESCRIPTOR // Invoked when received GET HID REPORT DESCRIPTOR

View File

@ -30,6 +30,7 @@ enum
REPORT_ID_KEYBOARD = 1, REPORT_ID_KEYBOARD = 1,
REPORT_ID_MOUSE, REPORT_ID_MOUSE,
REPORT_ID_CONSUMER_CONTROL, REPORT_ID_CONSUMER_CONTROL,
REPORT_ID_GAMEPAD
}; };
#endif /* USB_DESCRIPTORS_H_ */ #endif /* USB_DESCRIPTORS_H_ */

View File

@ -218,7 +218,7 @@ typedef enum
//GAMEPAD_BUTTON_ = TU_BIT(15), ///< Undefined button //GAMEPAD_BUTTON_ = TU_BIT(15), ///< Undefined button
}hid_gamepad_button_bm_t; }hid_gamepad_button_bm_t;
/// Standard Gamepad HAT/DPAD Buttons Bitmap (from Linux input event codes) /// Standard Gamepad HAT/DPAD Buttons (from Linux input event codes)
typedef enum typedef enum
{ {
GAMEPAD_HAT_CENTERED = 0, ///< DPAD_CENTERED GAMEPAD_HAT_CENTERED = 0, ///< DPAD_CENTERED
@ -230,7 +230,7 @@ typedef enum
GAMEPAD_HAT_DOWN_LEFT = 6, ///< DPAD_DOWN_LEFT GAMEPAD_HAT_DOWN_LEFT = 6, ///< DPAD_DOWN_LEFT
GAMEPAD_HAT_LEFT = 7, ///< DPAD_LEFT GAMEPAD_HAT_LEFT = 7, ///< DPAD_LEFT
GAMEPAD_HAT_UP_LEFT = 8, ///< DPAD_UP_LEFT GAMEPAD_HAT_UP_LEFT = 8, ///< DPAD_UP_LEFT
}hid_gamepad_hat_bm_t; }hid_gamepad_hat_t;
/// @} /// @}

View File

@ -107,9 +107,6 @@ bool tud_hid_n_boot_mode(uint8_t itf)
return _hidd_itf[itf].boot_mode; return _hidd_itf[itf].boot_mode;
} }
//--------------------------------------------------------------------+
// KEYBOARD API
//--------------------------------------------------------------------+
bool tud_hid_n_keyboard_report(uint8_t itf, uint8_t report_id, uint8_t modifier, uint8_t keycode[6]) bool tud_hid_n_keyboard_report(uint8_t itf, uint8_t report_id, uint8_t modifier, uint8_t keycode[6])
{ {
hid_keyboard_report_t report; hid_keyboard_report_t report;
@ -127,10 +124,8 @@ bool tud_hid_n_keyboard_report(uint8_t itf, uint8_t report_id, uint8_t modifier,
return tud_hid_n_report(itf, report_id, &report, sizeof(report)); return tud_hid_n_report(itf, report_id, &report, sizeof(report));
} }
//--------------------------------------------------------------------+ bool tud_hid_n_mouse_report(uint8_t itf, uint8_t report_id,
// MOUSE APPLICATION API uint8_t buttons, int8_t x, int8_t y, int8_t vertical, int8_t horizontal)
//--------------------------------------------------------------------+
bool tud_hid_n_mouse_report(uint8_t itf, uint8_t report_id, uint8_t buttons, int8_t x, int8_t y, int8_t vertical, int8_t horizontal)
{ {
hid_mouse_report_t report = hid_mouse_report_t report =
{ {
@ -144,6 +139,24 @@ bool tud_hid_n_mouse_report(uint8_t itf, uint8_t report_id, uint8_t buttons, int
return tud_hid_n_report(itf, report_id, &report, sizeof(report)); return tud_hid_n_report(itf, report_id, &report, sizeof(report));
} }
bool tud_hid_n_gamepad_report(uint8_t itf, 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)
{
hid_gamepad_report_t report =
{
.x = x,
.y = y,
.z = z,
.rz = rz,
.rx = rx,
.ry = ry,
.hat = hat,
.buttons = buttons,
};
return tud_hid_n_report(itf, report_id, &report, sizeof(report));
}
//--------------------------------------------------------------------+ //--------------------------------------------------------------------+
// USBD-CLASS API // USBD-CLASS API
//--------------------------------------------------------------------+ //--------------------------------------------------------------------+

View File

@ -71,6 +71,10 @@ bool tud_hid_n_keyboard_report(uint8_t itf, uint8_t report_id, uint8_t modifier,
// 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 itf, 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 itf, 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
// use template layout report TUD_HID_REPORT_DESC_GAMEPAD
bool tud_hid_n_gamepad_report(uint8_t itf, 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);
//--------------------------------------------------------------------+ //--------------------------------------------------------------------+
// Application API (Single Port) // Application API (Single Port)
//--------------------------------------------------------------------+ //--------------------------------------------------------------------+
@ -119,6 +123,8 @@ TU_ATTR_WEAK bool tud_hid_set_idle_cb(uint8_t idle_rate);
#endif #endif
// TU_ATTR_WEAK void tud_hid_report_complete_cb(uint8_t itf, );
//--------------------------------------------------------------------+ //--------------------------------------------------------------------+
// Inline Functions // Inline Functions