Input: fix MMJOY a bit

This commit is contained in:
Unknown 2017-11-28 11:01:03 +01:00 committed by Ani
parent 782156b26f
commit 17ff1e41a5
2 changed files with 82 additions and 20 deletions

View File

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

View File

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