mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-02-11 06:40:39 +00:00
Input: fix MMJOY a bit
This commit is contained in:
parent
782156b26f
commit
17ff1e41a5
@ -74,7 +74,9 @@ bool mm_joystick_handler::Init()
|
|||||||
{
|
{
|
||||||
if (is_init) return true;
|
if (is_init) return true;
|
||||||
|
|
||||||
|
m_devices.clear();
|
||||||
supportedJoysticks = joyGetNumDevs();
|
supportedJoysticks = joyGetNumDevs();
|
||||||
|
|
||||||
if (supportedJoysticks > 0)
|
if (supportedJoysticks > 0)
|
||||||
{
|
{
|
||||||
LOG_NOTICE(GENERAL, "Driver supports %u joysticks", supportedJoysticks);
|
LOG_NOTICE(GENERAL, "Driver supports %u joysticks", supportedJoysticks);
|
||||||
@ -82,18 +84,30 @@ bool mm_joystick_handler::Init()
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
LOG_ERROR(GENERAL, "Driver doesn't support Joysticks");
|
LOG_ERROR(GENERAL, "Driver doesn't support Joysticks");
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (u32 i = 0; i < supportedJoysticks; i++)
|
||||||
|
{
|
||||||
js_info.dwSize = sizeof(js_info);
|
js_info.dwSize = sizeof(js_info);
|
||||||
js_info.dwFlags = JOY_RETURNALL;
|
js_info.dwFlags = JOY_RETURNALL;
|
||||||
joyGetDevCaps(JOYSTICKID1, &js_caps, sizeof(js_caps));
|
joyGetDevCaps(i, &js_caps, sizeof(js_caps));
|
||||||
|
|
||||||
|
bool JoyPresent = (joyGetPosEx(i, &js_info) == JOYERR_NOERROR);
|
||||||
bool JoyPresent = (joyGetPosEx(JOYSTICKID1, &js_info) == JOYERR_NOERROR);
|
|
||||||
if (!JoyPresent)
|
if (!JoyPresent)
|
||||||
{
|
{
|
||||||
LOG_ERROR(GENERAL, "Joystick not found");
|
continue;
|
||||||
return false;
|
}
|
||||||
|
|
||||||
|
char drv[32];
|
||||||
|
wcstombs(drv, js_caps.szPname, 31);
|
||||||
|
|
||||||
|
LOG_NOTICE(GENERAL, "Joystick nr.%d found. Driver: %s", i, drv);
|
||||||
|
|
||||||
|
MMJOYDevice dev;
|
||||||
|
dev.device_id = i;
|
||||||
|
dev.device_name = fmt::format("Joystick #%d", i);
|
||||||
|
m_devices.emplace_back(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
m_pad_config.load();
|
m_pad_config.load();
|
||||||
@ -103,19 +117,32 @@ bool mm_joystick_handler::Init()
|
|||||||
|
|
||||||
std::vector<std::string> mm_joystick_handler::ListDevices()
|
std::vector<std::string> mm_joystick_handler::ListDevices()
|
||||||
{
|
{
|
||||||
std::vector<std::string> mm_pad_list;
|
std::vector<std::string> devices;
|
||||||
|
|
||||||
if (!Init()) return mm_pad_list;
|
if (!Init()) return devices;
|
||||||
|
|
||||||
mm_pad_list.push_back("MMJoy Pad");
|
for (auto dev : m_devices)
|
||||||
|
{
|
||||||
|
devices.emplace_back(dev.device_name);
|
||||||
|
}
|
||||||
|
|
||||||
return mm_pad_list;
|
return devices;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool mm_joystick_handler::bindPadToDevice(std::shared_ptr<Pad> pad, const std::string& device)
|
bool mm_joystick_handler::bindPadToDevice(std::shared_ptr<Pad> pad, const std::string& device)
|
||||||
{
|
{
|
||||||
if (!Init()) return false;
|
if (!Init()) return false;
|
||||||
|
|
||||||
|
int id = GetIDByName(device);
|
||||||
|
if (id < 0)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::shared_ptr<MMJOYDevice> joy_device = std::make_shared<MMJOYDevice>();
|
||||||
|
joy_device->device_name = device;
|
||||||
|
joy_device->device_id = id;
|
||||||
|
|
||||||
auto find_key = [=](const std::string& name)
|
auto find_key = [=](const std::string& name)
|
||||||
{
|
{
|
||||||
long key = FindKeyCode(button_list, name);
|
long key = FindKeyCode(button_list, name);
|
||||||
@ -171,7 +198,7 @@ bool mm_joystick_handler::bindPadToDevice(std::shared_ptr<Pad> pad, const std::s
|
|||||||
pad->m_vibrateMotors.emplace_back(true, 0);
|
pad->m_vibrateMotors.emplace_back(true, 0);
|
||||||
pad->m_vibrateMotors.emplace_back(false, 0);
|
pad->m_vibrateMotors.emplace_back(false, 0);
|
||||||
|
|
||||||
bindings.push_back(pad);
|
bindings.emplace_back(joy_device, pad);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -183,8 +210,9 @@ void mm_joystick_handler::ThreadProc()
|
|||||||
|
|
||||||
for (u32 i = 0; i != bindings.size(); ++i)
|
for (u32 i = 0; i != bindings.size(); ++i)
|
||||||
{
|
{
|
||||||
auto pad = bindings[i];
|
auto pad = bindings[i].second;
|
||||||
status = joyGetPosEx(JOYSTICKID1, &js_info);
|
auto id = bindings[i].first->device_id;
|
||||||
|
status = joyGetPosEx(id, &js_info);
|
||||||
|
|
||||||
switch (status)
|
switch (status)
|
||||||
{
|
{
|
||||||
@ -261,7 +289,21 @@ void mm_joystick_handler::GetNextButtonPress(const std::string& padId, const std
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
MMRESULT status = joyGetPosEx(JOYSTICKID1, &js_info);
|
static std::string cur_pad = "";
|
||||||
|
static int id = -1;
|
||||||
|
|
||||||
|
if (cur_pad != padId)
|
||||||
|
{
|
||||||
|
cur_pad == padId;
|
||||||
|
id = GetIDByName(padId);
|
||||||
|
if (id < 0)
|
||||||
|
{
|
||||||
|
LOG_ERROR(GENERAL, "MMJOY GetNextButtonPress for device [%s] failed with id = %d", padId, id);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
MMRESULT status = joyGetPosEx(id, &js_info);
|
||||||
|
|
||||||
switch (status)
|
switch (status)
|
||||||
{
|
{
|
||||||
@ -402,4 +444,16 @@ std::unordered_map<u64, u16> mm_joystick_handler::GetButtonValues()
|
|||||||
return button_values;
|
return button_values;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int mm_joystick_handler::GetIDByName(const std::string& name)
|
||||||
|
{
|
||||||
|
for (auto dev : m_devices)
|
||||||
|
{
|
||||||
|
if (dev.device_name == name)
|
||||||
|
{
|
||||||
|
return dev.device_id;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -86,6 +86,12 @@ class mm_joystick_handler final : public PadHandlerBase
|
|||||||
{ joy_v_neg, "V-" },
|
{ joy_v_neg, "V-" },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct MMJOYDevice
|
||||||
|
{
|
||||||
|
u32 device_id{ 0 };
|
||||||
|
std::string device_name{ "" };
|
||||||
|
};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
mm_joystick_handler();
|
mm_joystick_handler();
|
||||||
~mm_joystick_handler();
|
~mm_joystick_handler();
|
||||||
@ -100,12 +106,14 @@ public:
|
|||||||
private:
|
private:
|
||||||
void TranslateButtonPress(u64 keyCode, bool& pressed, u16& val, bool ignore_threshold = false) override;
|
void TranslateButtonPress(u64 keyCode, bool& pressed, u16& val, bool ignore_threshold = false) override;
|
||||||
std::unordered_map<u64, u16> GetButtonValues();
|
std::unordered_map<u64, u16> GetButtonValues();
|
||||||
|
int GetIDByName(const std::string& name);
|
||||||
|
|
||||||
bool is_init;
|
bool is_init = false;
|
||||||
u32 supportedJoysticks;
|
u32 supportedJoysticks = 0;
|
||||||
JOYINFOEX js_info;
|
JOYINFOEX js_info;
|
||||||
JOYCAPS js_caps;
|
JOYCAPS js_caps;
|
||||||
|
|
||||||
std::vector<std::shared_ptr<Pad>> bindings;
|
std::vector<MMJOYDevice> m_devices;
|
||||||
|
std::vector<std::pair<std::shared_ptr<MMJOYDevice>, std::shared_ptr<Pad>>> bindings;
|
||||||
std::array<bool, 7> last_connection_status = {};
|
std::array<bool, 7> last_connection_status = {};
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user