Prevent multiple HID elements of same usage type on OSX

On OSX, iterate the HID device's elements and only store the last of
each type to accommodate for flaky hardware
This commit is contained in:
Arthur Carlsson authored and Léo Lam committed 2017-09-15 19:19:46 +02:00
1 parent 2b4bf8662a
commit 79a646a67d
1 file changed
+17
@@ -2,6 +2,7 @@
// Licensed under GPLv2+
// Refer to the license.txt file included.
#include <algorithm>
#include <sstream>
#include <Foundation/Foundation.h>
@@ -49,11 +50,26 @@ Joystick::Joystick(IOHIDDeviceRef device, std::string name)
if (axes)
{
std::vector<IOHIDElementRef> elems;
for (int i = 0; i < CFArrayGetCount(axes); i++)
{
IOHIDElementRef e = (IOHIDElementRef)CFArrayGetValueAtIndex(axes, i);
// DeviceElementDebugPrint(e, nullptr);
uint32_t usage = IOHIDElementGetUsage(e);
// Check for any existing elements with the same usage
auto it = std::find_if(elems.begin(), elems.end(), [usage](const auto& ref) {
return usage == IOHIDElementGetUsage(ref);
});
if (it == elems.end())
elems.push_back(e);
else
*it = e;
}
for (auto e : elems)
{
if (IOHIDElementGetUsage(e) == kHIDUsage_GD_Hatswitch)
{
AddInput(new Hat(e, m_device, Hat::up));
@@ -67,6 +83,7 @@ Joystick::Joystick(IOHIDDeviceRef device, std::string name)
new Axis(e, m_device, Axis::positive));
}
}
CFRelease(axes);
}