From ee532e5c01f97f30078202ae87a5b2a71e9ce1e4 Mon Sep 17 00:00:00 2001 From: Narr the Reg Date: Fri, 4 Mar 2022 11:47:13 -0600 Subject: input_common: Map sticks correctly when mapped sideways --- src/input_common/drivers/gc_adapter.cpp | 16 ++++++++++++++++ src/input_common/drivers/gc_adapter.h | 2 ++ src/input_common/drivers/sdl_driver.cpp | 33 +++++++++++++++++++++++++++++++++ src/input_common/drivers/sdl_driver.h | 2 ++ src/input_common/drivers/udp_client.cpp | 16 ++++++++++++++++ src/input_common/drivers/udp_client.h | 2 ++ 6 files changed, 71 insertions(+) (limited to 'src/input_common/drivers') diff --git a/src/input_common/drivers/gc_adapter.cpp b/src/input_common/drivers/gc_adapter.cpp index 155caae42..8abd41726 100644 --- a/src/input_common/drivers/gc_adapter.cpp +++ b/src/input_common/drivers/gc_adapter.cpp @@ -524,4 +524,20 @@ Common::Input::ButtonNames GCAdapter::GetUIName(const Common::ParamPackage& para return Common::Input::ButtonNames::Invalid; } +bool GCAdapter::IsStickInverted(const Common::ParamPackage& params) { + if (!params.Has("port")) { + return false; + } + + const auto x_axis = static_cast(params.Get("axis_x", 0)); + const auto y_axis = static_cast(params.Get("axis_y", 0)); + if (x_axis != PadAxes::StickY && x_axis != PadAxes::SubstickY) { + return false; + } + if (y_axis != PadAxes::StickX && y_axis != PadAxes::SubstickX) { + return false; + } + return true; +} + } // namespace InputCommon diff --git a/src/input_common/drivers/gc_adapter.h b/src/input_common/drivers/gc_adapter.h index 43ad58c85..894ab65a4 100644 --- a/src/input_common/drivers/gc_adapter.h +++ b/src/input_common/drivers/gc_adapter.h @@ -35,6 +35,8 @@ public: AnalogMapping GetAnalogMappingForDevice(const Common::ParamPackage& params) override; Common::Input::ButtonNames GetUIName(const Common::ParamPackage& params) const override; + bool IsStickInverted(const Common::ParamPackage& params) override; + private: enum class PadButton { Undefined = 0x0000, diff --git a/src/input_common/drivers/sdl_driver.cpp b/src/input_common/drivers/sdl_driver.cpp index c17ea305e..64edf53e4 100644 --- a/src/input_common/drivers/sdl_driver.cpp +++ b/src/input_common/drivers/sdl_driver.cpp @@ -934,4 +934,37 @@ u8 SDLDriver::GetHatButtonId(const std::string& direction_name) const { return direction; } +bool SDLDriver::IsStickInverted(const Common::ParamPackage& params) { + if (!params.Has("guid") || !params.Has("port")) { + return false; + } + const auto joystick = GetSDLJoystickByGUID(params.Get("guid", ""), params.Get("port", 0)); + if (joystick == nullptr) { + return false; + } + auto* controller = joystick->GetSDLGameController(); + if (controller == nullptr) { + return false; + } + + const auto& axis_x = params.Get("axis_x", 0); + const auto& axis_y = params.Get("axis_y", 0); + const auto& binding_left_x = + SDL_GameControllerGetBindForAxis(controller, SDL_CONTROLLER_AXIS_LEFTX); + const auto& binding_right_x = + SDL_GameControllerGetBindForAxis(controller, SDL_CONTROLLER_AXIS_RIGHTX); + const auto& binding_left_y = + SDL_GameControllerGetBindForAxis(controller, SDL_CONTROLLER_AXIS_LEFTY); + const auto& binding_right_y = + SDL_GameControllerGetBindForAxis(controller, SDL_CONTROLLER_AXIS_RIGHTY); + + if (axis_x != binding_left_y.value.axis && axis_x != binding_right_y.value.axis) { + return false; + } + if (axis_y != binding_left_x.value.axis && axis_y != binding_right_x.value.axis) { + return false; + } + return true; +} + } // namespace InputCommon diff --git a/src/input_common/drivers/sdl_driver.h b/src/input_common/drivers/sdl_driver.h index 4cde3606f..dcd0d1e64 100644 --- a/src/input_common/drivers/sdl_driver.h +++ b/src/input_common/drivers/sdl_driver.h @@ -58,6 +58,8 @@ public: std::string GetHatButtonName(u8 direction_value) const override; u8 GetHatButtonId(const std::string& direction_name) const override; + bool IsStickInverted(const Common::ParamPackage& params) override; + Common::Input::VibrationError SetRumble( const PadIdentifier& identifier, const Common::Input::VibrationStatus& vibration) override; diff --git a/src/input_common/drivers/udp_client.cpp b/src/input_common/drivers/udp_client.cpp index 9780ead10..825262a07 100644 --- a/src/input_common/drivers/udp_client.cpp +++ b/src/input_common/drivers/udp_client.cpp @@ -547,6 +547,22 @@ Common::Input::ButtonNames UDPClient::GetUIName(const Common::ParamPackage& para return Common::Input::ButtonNames::Invalid; } +bool UDPClient::IsStickInverted(const Common::ParamPackage& params) { + if (!params.Has("guid") || !params.Has("port") || !params.Has("pad")) { + return false; + } + + const auto x_axis = static_cast(params.Get("axis_x", 0)); + const auto y_axis = static_cast(params.Get("axis_y", 0)); + if (x_axis != PadAxes::LeftStickY && x_axis != PadAxes::RightStickY) { + return false; + } + if (y_axis != PadAxes::LeftStickX && y_axis != PadAxes::RightStickX) { + return false; + } + return true; +} + void TestCommunication(const std::string& host, u16 port, const std::function& success_callback, const std::function& failure_callback) { diff --git a/src/input_common/drivers/udp_client.h b/src/input_common/drivers/udp_client.h index c7cc7d846..dece2a45b 100644 --- a/src/input_common/drivers/udp_client.h +++ b/src/input_common/drivers/udp_client.h @@ -64,6 +64,8 @@ public: MotionMapping GetMotionMappingForDevice(const Common::ParamPackage& params) override; Common::Input::ButtonNames GetUIName(const Common::ParamPackage& params) const override; + bool IsStickInverted(const Common::ParamPackage& params) override; + private: enum class PadButton { Undefined = 0x0000, -- cgit v1.2.3