diff --git a/pcsx2/PAD/Host/KeyStatus.h b/pcsx2/PAD/Host/KeyStatus.h index 163440384d..dbca0e7be4 100644 --- a/pcsx2/PAD/Host/KeyStatus.h +++ b/pcsx2/PAD/Host/KeyStatus.h @@ -17,6 +17,11 @@ #include "PAD/Host/Global.h" +namespace PAD +{ +enum class ControllerType : u8; +} + class KeyStatus { private: @@ -28,6 +33,7 @@ private: u8 rx, ry; }; + PAD::ControllerType m_type[GAMEPAD_NUMBER] = {}; u32 m_button[GAMEPAD_NUMBER]; u8 m_button_pressure[GAMEPAD_NUMBER][MAX_KEYS]; PADAnalog m_analog[GAMEPAD_NUMBER]; @@ -40,6 +46,9 @@ public: void Set(u32 pad, u32 index, float value); + __fi PAD::ControllerType GetType(u32 pad) { return m_type[pad]; } + __fi void SetType(u32 pad, PAD::ControllerType type) { m_type[pad] = type; } + __fi void SetAxisScale(u32 pad, float scale) { m_axis_scale[pad] = scale; } __fi float GetVibrationScale(u32 pad, u32 motor) const { return m_vibration_scale[pad][motor]; } __fi void SetVibrationScale(u32 pad, u32 motor, float scale) { m_vibration_scale[pad][motor] = scale; } diff --git a/pcsx2/PAD/Host/PAD.cpp b/pcsx2/PAD/Host/PAD.cpp index fa535b74b3..b98f67c7f7 100644 --- a/pcsx2/PAD/Host/PAD.cpp +++ b/pcsx2/PAD/Host/PAD.cpp @@ -187,13 +187,26 @@ void PAD::LoadConfig(const SettingsInterface& si) { const std::string section(StringUtil::StdStringFromFormat("Pad%u", i + 1u)); const std::string type(si.GetStringValue(section.c_str(), "Type", GetDefaultPadType(i))); - const float axis_scale = si.GetFloatValue(section.c_str(), "AxisScale", 1.0f); - const float large_motor_scale = si.GetFloatValue(section.c_str(), "LargeMotorScale", 1.0f); - const float small_motor_scale = si.GetFloatValue(section.c_str(), "SmallMotorScale", 1.0f); + const ControllerInfo* ci = GetControllerInfo(type); + if (!ci) + { + g_key_status.SetType(i, ControllerType::NotConnected); + continue; + } + + g_key_status.SetType(i, ci->type); + + const float axis_scale = si.GetFloatValue(section.c_str(), "AxisScale", 1.0f); g_key_status.SetAxisScale(i, axis_scale); - g_key_status.SetVibrationScale(i, 0, large_motor_scale); - g_key_status.SetVibrationScale(i, 1, small_motor_scale); + + if (ci->vibration_caps != VibrationCapabilities::NoVibration) + { + const float large_motor_scale = si.GetFloatValue(section.c_str(), "LargeMotorScale", 1.0f); + const float small_motor_scale = si.GetFloatValue(section.c_str(), "SmallMotorScale", 1.0f); + g_key_status.SetVibrationScale(i, 0, large_motor_scale); + g_key_status.SetVibrationScale(i, 1, small_motor_scale); + } LoadMacroButtonConfig(si, i, type, section); } @@ -303,10 +316,21 @@ static const PAD::ControllerBindingInfo s_dualshock2_binds[] = { }; static const PAD::ControllerInfo s_controller_info[] = { - {"None", "Not Connected", nullptr, 0, PAD::VibrationCapabilities::NoVibration}, - {"DualShock2", "DuckShock 2", s_dualshock2_binds, std::size(s_dualshock2_binds), PAD::VibrationCapabilities::LargeSmallMotors}, + {"None", "Not Connected", nullptr, 0, PAD::ControllerType::NotConnected, PAD::VibrationCapabilities::NoVibration}, + {"DualShock2", "DuckShock 2", s_dualshock2_binds, std::size(s_dualshock2_binds), PAD::ControllerType::DualShock2, PAD::VibrationCapabilities::LargeSmallMotors}, }; +const PAD::ControllerInfo* PAD::GetControllerInfo(ControllerType type) +{ + for (const ControllerInfo& info : s_controller_info) + { + if (type == info.type) + return &info; + } + + return nullptr; +} + const PAD::ControllerInfo* PAD::GetControllerInfo(const std::string_view& name) { for (const ControllerInfo& info : s_controller_info) diff --git a/pcsx2/PAD/Host/PAD.h b/pcsx2/PAD/Host/PAD.h index 712d92c9b4..ff540dc2a7 100644 --- a/pcsx2/PAD/Host/PAD.h +++ b/pcsx2/PAD/Host/PAD.h @@ -37,6 +37,13 @@ u8 PADpoll(u8 value); namespace PAD { + enum class ControllerType: u8 + { + NotConnected, + DualShock2, + Count + }; + enum class ControllerBindingType : u8 { Unknown, @@ -69,6 +76,7 @@ namespace PAD const char* display_name; const ControllerBindingInfo* bindings; u32 num_bindings; + ControllerType type; PAD::VibrationCapabilities vibration_caps; }; @@ -100,6 +108,7 @@ namespace PAD VibrationCapabilities GetControllerVibrationCapabilities(const std::string_view& type); /// Returns general information for the specified controller type. + const ControllerInfo* GetControllerInfo(ControllerType type); const ControllerInfo* GetControllerInfo(const std::string_view& name); /// Performs automatic controller mapping with the provided list of generic mappings. diff --git a/pcsx2/PAD/Host/StateManagement.cpp b/pcsx2/PAD/Host/StateManagement.cpp index e48ab51620..831d48f23b 100644 --- a/pcsx2/PAD/Host/StateManagement.cpp +++ b/pcsx2/PAD/Host/StateManagement.cpp @@ -17,6 +17,7 @@ #include "PAD/Host/StateManagement.h" #include "PAD/Host/KeyStatus.h" +#include "PAD/Host/PAD.h" #include "Frontend/InputManager.h" template @@ -62,19 +63,31 @@ void QueryInfo::reset() u8 QueryInfo::start_poll(int _port) { - if (port > 1) + if (_port >= static_cast(GAMEPAD_NUMBER)) { reset(); return 0; } - queryDone = 0; port = _port; slot = slots[port]; - numBytes = 2; - lastByte = 0; - return 0xFF; + if (g_key_status.GetType(_port) == PAD::ControllerType::NotConnected) + { + queryDone = 1; + numBytes = 0; + lastByte = 1; + + return 0; + } + else + { + queryDone = 0; + numBytes = 2; + lastByte = 0; + + return 0xFF; + } } //////////////////////////////////////////////////////////////////////