From d4802cc7669bb0d8343d6cc2c1534b1ddbd55476 Mon Sep 17 00:00:00 2001 From: Megamouse Date: Fri, 6 Aug 2021 02:08:18 +0200 Subject: [PATCH] input: Add pressure sensitivity button --- rpcs3/Emu/Io/Null/NullPadHandler.h | 7 +- rpcs3/Emu/Io/PadHandler.cpp | 27 +++++- rpcs3/Emu/Io/PadHandler.h | 4 + rpcs3/Emu/Io/Turntable.cpp | 16 ++-- rpcs3/Emu/Io/pad_config.h | 3 + rpcs3/Emu/Io/pad_types.h | 127 +++++++++++-------------- rpcs3/Input/ds3_pad_handler.cpp | 3 + rpcs3/Input/ds4_pad_handler.cpp | 2 + rpcs3/Input/dualsense_pad_handler.cpp | 2 + rpcs3/Input/evdev_joystick_handler.cpp | 8 +- rpcs3/Input/keyboard_pad_handler.cpp | 8 +- rpcs3/Input/mm_joystick_handler.cpp | 2 + rpcs3/Input/pad_thread.cpp | 19 +++- rpcs3/rpcs3qt/pad_settings_dialog.cpp | 62 ++++++++---- rpcs3/rpcs3qt/pad_settings_dialog.h | 3 + rpcs3/rpcs3qt/pad_settings_dialog.ui | 41 ++++++++ rpcs3/rpcs3qt/tooltips.h | 1 + 17 files changed, 224 insertions(+), 111 deletions(-) diff --git a/rpcs3/Emu/Io/Null/NullPadHandler.h b/rpcs3/Emu/Io/Null/NullPadHandler.h index a015cae425..5df0535e79 100644 --- a/rpcs3/Emu/Io/Null/NullPadHandler.h +++ b/rpcs3/Emu/Io/Null/NullPadHandler.h @@ -5,7 +5,10 @@ class NullPadHandler final : public PadHandlerBase { public: - NullPadHandler() : PadHandlerBase(pad_handler::null) {} + NullPadHandler() : PadHandlerBase(pad_handler::null) + { + b_has_pressure_intensity_button = false; + } bool Init() override { @@ -46,6 +49,8 @@ public: cfg->l2.def = ""; cfg->l3.def = ""; + cfg->pressure_intensity_button.def = ""; + // Apply defaults cfg->from_default(); } diff --git a/rpcs3/Emu/Io/PadHandler.cpp b/rpcs3/Emu/Io/PadHandler.cpp index 9bc95a9057..d444eb8cf8 100644 --- a/rpcs3/Emu/Io/PadHandler.cpp +++ b/rpcs3/Emu/Io/PadHandler.cpp @@ -30,7 +30,9 @@ int PadHandlerBase::FindKeyCode(const std::unordered_map& map, if (fallback) { - input_log.error("int FindKeyCode for [name = %s] returned with [def_code = %d] for [def = %s]", nam, def_code, def); + if (!nam.empty()) + input_log.error("int FindKeyCode for [name = %s] returned with [def_code = %d] for [def = %s]", nam, def_code, def); + if (def_code < 0) def_code = 0; } @@ -55,7 +57,9 @@ long PadHandlerBase::FindKeyCode(const std::unordered_map& map if (fallback) { - input_log.error("long FindKeyCode for [name = %s] returned with [def_code = %d] for [def = %s]", nam, def_code, def); + if (!nam.empty()) + input_log.error("long FindKeyCode for [name = %s] returned with [def_code = %d] for [def = %s]", nam, def_code, def); + if (def_code < 0) def_code = 0; } @@ -74,7 +78,8 @@ int PadHandlerBase::FindKeyCodeByString(const std::unordered_map pad, const std::string profile->device_class_type, pclass_profile, profile->vendor_id, - profile->product_id + profile->product_id, + profile->pressure_intensity ); + pad->m_buttons.emplace_back(special_button_offset, mapping[button::pressure_intensity_button], special_button_value::pressure_intensity); + pad->m_pressure_intensity_button_index = pad->m_buttons.size() - 1; + pad->m_buttons.emplace_back(CELL_PAD_BTN_OFFSET_DIGITAL1, mapping[button::up], CELL_PAD_CTRL_UP); pad->m_buttons.emplace_back(CELL_PAD_BTN_OFFSET_DIGITAL1, mapping[button::down], CELL_PAD_CTRL_DOWN); pad->m_buttons.emplace_back(CELL_PAD_BTN_OFFSET_DIGITAL1, mapping[button::left], CELL_PAD_CTRL_LEFT); @@ -549,6 +564,8 @@ std::array PadHandlerBase::get_mapped mapping[button::rs_up] = FindKeyCode(button_list, profile->rs_up); mapping[button::ps] = FindKeyCode(button_list, profile->ps); + mapping[button::pressure_intensity_button] = FindKeyCode(button_list, profile->pressure_intensity_button); + return mapping; } diff --git a/rpcs3/Emu/Io/PadHandler.h b/rpcs3/Emu/Io/PadHandler.h index fd8f724fdb..8be270f64a 100644 --- a/rpcs3/Emu/Io/PadHandler.h +++ b/rpcs3/Emu/Io/PadHandler.h @@ -54,6 +54,8 @@ protected: rs_down, rs_up, + pressure_intensity_button, + button_count }; @@ -80,6 +82,7 @@ protected: bool b_has_deadzones = false; bool b_has_rumble = false; bool b_has_config = false; + bool b_has_pressure_intensity_button = true; std::array m_pad_configs; std::vector, std::shared_ptr>> bindings; std::unordered_map button_list; @@ -148,6 +151,7 @@ public: bool has_led() const; bool has_rgb() const; bool has_battery() const; + bool has_pressure_intensity_button() const; void set_player(u32 player_id) { m_player_id = player_id; } diff --git a/rpcs3/Emu/Io/Turntable.cpp b/rpcs3/Emu/Io/Turntable.cpp index 3556bbed23..b458285c85 100644 --- a/rpcs3/Emu/Io/Turntable.cpp +++ b/rpcs3/Emu/Io/Turntable.cpp @@ -35,7 +35,7 @@ void usb_device_turntable::control_transfer(u8 bmRequestType, u8 bRequest, u16 w // Do nothing here - not sure what it should do. break; default: - turntable_log.error("Unhandled Query Type: 0x%02X", buf[0]); + turntable_log.error("Unhandled Query Type: 0x%02X", buf[0]); break; } break; @@ -248,19 +248,19 @@ void usb_device_turntable::interrupt_transfer(u32 buf_size, u8* buf, u32 /*endpo { case CELL_PAD_BTN_OFFSET_ANALOG_LEFT_Y: buf[6] = ~(stick.m_value) + 0x01; // Right Turntable - // Some pad handlers like MMJoystick are centered at 0x81 instead of 0x80 + // Some pad handlers like MMJoystick are centered at 0x81 instead of 0x80 // which leaves the turntable stuck at 0x7F instead of 0x80, causing auto-scrolling menus // so force 0x7F to 0x80. - if (buf[6] == 0x7F) - buf[6] = 0x80; + if (buf[6] == 0x7F) + buf[6] = 0x80; break; case CELL_PAD_BTN_OFFSET_ANALOG_RIGHT_Y: - buf[21] = (stick.m_value & 0x3F) << 2; // Crossfader, lower 6 bits - buf[22] = (stick.m_value & 0xC0) >> 6; // Crossfader, upper 2 bits + buf[21] = (stick.m_value & 0x3F) << 2; // Crossfader, lower 6 bits + buf[22] = (stick.m_value & 0xC0) >> 6; // Crossfader, upper 2 bits break; case CELL_PAD_BTN_OFFSET_ANALOG_RIGHT_X: - buf[19] = (stick.m_value & 0x3F) << 2; // Effects Dial, lower 6 bits - buf[20] = (stick.m_value & 0xC0) >> 6; // Effects Dial, upper 2 bits + buf[19] = (stick.m_value & 0x3F) << 2; // Effects Dial, lower 6 bits + buf[20] = (stick.m_value & 0xC0) >> 6; // Effects Dial, upper 2 bits break; default: break; diff --git a/rpcs3/Emu/Io/pad_config.h b/rpcs3/Emu/Io/pad_config.h index b38f62b896..69963062b5 100644 --- a/rpcs3/Emu/Io/pad_config.h +++ b/rpcs3/Emu/Io/pad_config.h @@ -69,6 +69,9 @@ struct pad_config final : cfg::node cfg::string l2{ this, "L2", "" }; cfg::string l3{ this, "L3", "" }; + cfg::string pressure_intensity_button{ this, "Pressure Intensity Button", "" }; + cfg::uint<0, 100> pressure_intensity{ this, "Pressure Intensity Percent", 50 }; + cfg::uint<0, 200> lstickmultiplier{ this, "Left Stick Multiplier", 100 }; cfg::uint<0, 200> rstickmultiplier{ this, "Right Stick Multiplier", 100 }; cfg::uint<0, 1000000> lstickdeadzone{ this, "Left Stick Deadzone", 0 }; diff --git a/rpcs3/Emu/Io/pad_types.h b/rpcs3/Emu/Io/pad_types.h index cbef1dc1f4..d3841ddc71 100644 --- a/rpcs3/Emu/Io/pad_types.h +++ b/rpcs3/Emu/Io/pad_types.h @@ -163,6 +163,14 @@ enum CELL_MAX_PADS = 127, }; + +constexpr u32 special_button_offset = 666; // Must not conflict with other CELL offsets like ButtonDataOffset + +enum special_button_value +{ + pressure_intensity +}; + struct Button { u32 m_offset; @@ -241,22 +249,25 @@ struct VibrateMotor struct Pad { - bool m_buffer_cleared; - u32 m_port_status; - u32 m_device_capability; - u32 m_device_type; - u32 m_class_type; - u32 m_class_profile; + bool m_buffer_cleared{true}; + u32 m_port_status{0}; + u32 m_device_capability{0}; + u32 m_device_type{0}; + u32 m_class_type{0}; + u32 m_class_profile{0}; - u16 m_vendor_id; - u16 m_product_id; + u16 m_vendor_id{0}; + u16 m_product_id{0}; + + s32 m_pressure_intensity_button_index{-1}; // Special button index. -1 if not set. + u8 m_pressure_intensity{127}; // 0-255 // Cable State: 0 - 1 plugged in ? - u8 m_cable_state; + u8 m_cable_state{0}; // DS4: 0 - 9 while unplugged, 0 - 10 while plugged in, 11 charge complete // XInput: 0 = Empty, 1 = Low, 2 = Medium, 3 = Full - u8 m_battery_level; + u8 m_battery_level{0}; std::vector