feat(input/linux): DualSense adaptive trigger support (#3738)
This commit is contained in:
@@ -106,6 +106,7 @@ namespace platf {
|
|||||||
rumble_triggers, ///< Rumble triggers
|
rumble_triggers, ///< Rumble triggers
|
||||||
set_motion_event_state, ///< Set motion event state
|
set_motion_event_state, ///< Set motion event state
|
||||||
set_rgb_led, ///< Set RGB LED
|
set_rgb_led, ///< Set RGB LED
|
||||||
|
set_adaptive_triggers, ///< Set adaptive triggers
|
||||||
};
|
};
|
||||||
|
|
||||||
struct gamepad_feedback_msg_t {
|
struct gamepad_feedback_msg_t {
|
||||||
@@ -142,6 +143,14 @@ namespace platf {
|
|||||||
return msg;
|
return msg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gamepad_feedback_msg_t make_adaptive_triggers(std::uint16_t id, uint8_t event_flags, uint8_t type_left, uint8_t type_right, const std::array<uint8_t, 10> &left, const std::array<uint8_t, 10> &right) {
|
||||||
|
gamepad_feedback_msg_t msg;
|
||||||
|
msg.type = gamepad_feedback_e::set_adaptive_triggers;
|
||||||
|
msg.id = id;
|
||||||
|
msg.data.adaptive_triggers = {.event_flags = event_flags, .type_left = type_left, .type_right = type_right, .left = left, .right = right};
|
||||||
|
return msg;
|
||||||
|
}
|
||||||
|
|
||||||
gamepad_feedback_e type;
|
gamepad_feedback_e type;
|
||||||
std::uint16_t id;
|
std::uint16_t id;
|
||||||
|
|
||||||
@@ -166,6 +175,15 @@ namespace platf {
|
|||||||
std::uint8_t g;
|
std::uint8_t g;
|
||||||
std::uint8_t b;
|
std::uint8_t b;
|
||||||
} rgb_led;
|
} rgb_led;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
uint16_t controllerNumber;
|
||||||
|
uint8_t event_flags;
|
||||||
|
uint8_t type_left;
|
||||||
|
uint8_t type_right;
|
||||||
|
std::array<uint8_t, 10> left;
|
||||||
|
std::array<uint8_t, 10> right;
|
||||||
|
} adaptive_triggers;
|
||||||
} data;
|
} data;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -152,6 +152,10 @@ namespace platf::gamepad {
|
|||||||
gamepad->last_rgb_led = msg;
|
gamepad->last_rgb_led = msg;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
(*ds5).set_on_trigger_effect([feedback_queue, idx = id.clientRelativeIndex](const inputtino::PS5Joypad::TriggerEffect &trigger_effect) {
|
||||||
|
feedback_queue->raise(gamepad_feedback_msg_t::make_adaptive_triggers(idx, trigger_effect.event_flags, trigger_effect.type_left, trigger_effect.type_right, trigger_effect.left, trigger_effect.right));
|
||||||
|
});
|
||||||
|
|
||||||
// Activate the motion sensors
|
// Activate the motion sensors
|
||||||
feedback_queue->raise(gamepad_feedback_msg_t::make_motion_event_state(id.clientRelativeIndex, LI_MOTION_TYPE_ACCEL, 100));
|
feedback_queue->raise(gamepad_feedback_msg_t::make_motion_event_state(id.clientRelativeIndex, LI_MOTION_TYPE_ACCEL, 100));
|
||||||
feedback_queue->raise(gamepad_feedback_msg_t::make_motion_event_state(id.clientRelativeIndex, LI_MOTION_TYPE_GYRO, 100));
|
feedback_queue->raise(gamepad_feedback_msg_t::make_motion_event_state(id.clientRelativeIndex, LI_MOTION_TYPE_GYRO, 100));
|
||||||
|
|||||||
@@ -48,6 +48,7 @@ extern "C" {
|
|||||||
#define IDX_RUMBLE_TRIGGER_DATA 12
|
#define IDX_RUMBLE_TRIGGER_DATA 12
|
||||||
#define IDX_SET_MOTION_EVENT 13
|
#define IDX_SET_MOTION_EVENT 13
|
||||||
#define IDX_SET_RGB_LED 14
|
#define IDX_SET_RGB_LED 14
|
||||||
|
#define IDX_SET_ADAPTIVE_TRIGGERS 15
|
||||||
|
|
||||||
static const short packetTypes[] = {
|
static const short packetTypes[] = {
|
||||||
0x0305, // Start A
|
0x0305, // Start A
|
||||||
@@ -65,6 +66,7 @@ static const short packetTypes[] = {
|
|||||||
0x5500, // Rumble triggers (Sunshine protocol extension)
|
0x5500, // Rumble triggers (Sunshine protocol extension)
|
||||||
0x5501, // Set motion event (Sunshine protocol extension)
|
0x5501, // Set motion event (Sunshine protocol extension)
|
||||||
0x5502, // Set RGB LED (Sunshine protocol extension)
|
0x5502, // Set RGB LED (Sunshine protocol extension)
|
||||||
|
0x5503, // Set Adaptive triggers (Sunshine protocol extension)
|
||||||
};
|
};
|
||||||
|
|
||||||
namespace asio = boost::asio;
|
namespace asio = boost::asio;
|
||||||
@@ -186,6 +188,21 @@ namespace stream {
|
|||||||
std::uint8_t b;
|
std::uint8_t b;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct control_adaptive_triggers_t {
|
||||||
|
control_header_v2 header;
|
||||||
|
|
||||||
|
std::uint16_t id;
|
||||||
|
/**
|
||||||
|
* 0x04 - Right trigger
|
||||||
|
* 0x08 - Left trigger
|
||||||
|
*/
|
||||||
|
std::uint8_t event_flags;
|
||||||
|
std::uint8_t type_left;
|
||||||
|
std::uint8_t type_right;
|
||||||
|
std::uint8_t left[DS_EFFECT_PAYLOAD_SIZE];
|
||||||
|
std::uint8_t right[DS_EFFECT_PAYLOAD_SIZE];
|
||||||
|
};
|
||||||
|
|
||||||
struct control_hdr_mode_t {
|
struct control_hdr_mode_t {
|
||||||
control_header_v2 header;
|
control_header_v2 header;
|
||||||
|
|
||||||
@@ -833,6 +850,22 @@ namespace stream {
|
|||||||
plaintext.b = data.b;
|
plaintext.b = data.b;
|
||||||
|
|
||||||
BOOST_LOG(verbose) << "RGB: "sv << msg.id << " :: "sv << util::hex(data.r).to_string_view() << util::hex(data.g).to_string_view() << util::hex(data.b).to_string_view();
|
BOOST_LOG(verbose) << "RGB: "sv << msg.id << " :: "sv << util::hex(data.r).to_string_view() << util::hex(data.g).to_string_view() << util::hex(data.b).to_string_view();
|
||||||
|
std::array<std::uint8_t, sizeof(control_encrypted_t) + crypto::cipher::round_to_pkcs7_padded(sizeof(plaintext)) + crypto::cipher::tag_size>
|
||||||
|
encrypted_payload;
|
||||||
|
|
||||||
|
payload = encode_control(session, util::view(plaintext), encrypted_payload);
|
||||||
|
} else if (msg.type == platf::gamepad_feedback_e::set_adaptive_triggers) {
|
||||||
|
control_adaptive_triggers_t plaintext;
|
||||||
|
plaintext.header.type = packetTypes[IDX_SET_ADAPTIVE_TRIGGERS];
|
||||||
|
plaintext.header.payloadLength = sizeof(plaintext) - sizeof(control_header_v2);
|
||||||
|
|
||||||
|
plaintext.id = util::endian::little(msg.id);
|
||||||
|
plaintext.event_flags = msg.data.adaptive_triggers.event_flags;
|
||||||
|
plaintext.type_left = msg.data.adaptive_triggers.type_left;
|
||||||
|
std::ranges::copy(msg.data.adaptive_triggers.left, plaintext.left);
|
||||||
|
plaintext.type_right = msg.data.adaptive_triggers.type_right;
|
||||||
|
std::ranges::copy(msg.data.adaptive_triggers.right, plaintext.right);
|
||||||
|
|
||||||
std::array<std::uint8_t, sizeof(control_encrypted_t) + crypto::cipher::round_to_pkcs7_padded(sizeof(plaintext)) + crypto::cipher::tag_size>
|
std::array<std::uint8_t, sizeof(control_encrypted_t) + crypto::cipher::round_to_pkcs7_padded(sizeof(plaintext)) + crypto::cipher::tag_size>
|
||||||
encrypted_payload;
|
encrypted_payload;
|
||||||
|
|
||||||
|
|||||||
Vendored
+1
-1
Submodule third-party/inputtino updated: 1170b1e4ad...fd136cfe49
Reference in New Issue
Block a user