PAD/Host: Fix unconditionally sending state for disconnected ports

This commit is contained in:
Connor McLaughlin 2022-05-30 17:00:37 +10:00 committed by refractionpcsx2
parent 277706505e
commit 4873165dbc
4 changed files with 67 additions and 12 deletions

View File

@ -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; }

View File

@ -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)

View File

@ -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.

View File

@ -17,6 +17,7 @@
#include "PAD/Host/StateManagement.h"
#include "PAD/Host/KeyStatus.h"
#include "PAD/Host/PAD.h"
#include "Frontend/InputManager.h"
template <class T>
@ -62,19 +63,31 @@ void QueryInfo::reset()
u8 QueryInfo::start_poll(int _port)
{
if (port > 1)
if (_port >= static_cast<int>(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;
}
}
//////////////////////////////////////////////////////////////////////