void HIDGamepad::valueChanged(IOHIDValueRef value) { IOHIDElementCookie cookie = IOHIDElementGetCookie(IOHIDValueGetElement(value)); HIDGamepadElement* element = m_elementMap.get(cookie); // This might be an element we don't currently handle as input so we can skip it. if (!element) return; element->rawValue = IOHIDValueGetScaledValue(value, kIOHIDValueScaleTypePhysical); if (element->isButton()) { for (unsigned i = 0; i < m_buttons.size(); ++i) { if (m_buttons[i].get() == element) m_buttonValues[i] = element->normalizedValue(); } } else if (element->isAxis()) { for (unsigned i = 0; i < m_axes.size(); ++i) { if (m_axes[i].get() == element) m_axisValues[i] = element->normalizedValue(); } } else ASSERT_NOT_REACHED(); m_lastUpdateTime = monotonicallyIncreasingTime(); }
HIDInputType HIDGamepad::valueChanged(IOHIDValueRef value) { IOHIDElementCookie cookie = IOHIDElementGetCookie(IOHIDValueGetElement(value)); HIDGamepadElement* element = m_elementMap.get(cookie); // This might be an element we don't currently handle as input so we can skip it. if (!element) return HIDInputType::NotAButtonPress; element->rawValue = IOHIDValueGetScaledValue(value, kIOHIDValueScaleTypePhysical); if (element->isButton()) { for (unsigned i = 0; i < m_buttons.size(); ++i) { if (&m_buttons[i].get() == element) { m_buttonValues[i] = element->normalizedValue(); break; } } } else if (element->isAxis()) { for (unsigned i = 0; i < m_axes.size(); ++i) { if (&m_axes[i].get() == element) { m_axisValues[i] = element->normalizedValue(); break; } } } else if (element->isDPad()) { int intValue = IOHIDValueGetIntegerValue(value) - element->min; for (unsigned i = 0; i < m_dPads.size(); ++i) { if (&m_dPads[i].get() != element) continue; // Each DPad represents 4 button values which are tacked on to the end of the values from non-DPad buttons. unsigned firstButtonValue = m_buttons.size() + i * 4; ASSERT(m_buttonValues.size() > firstButtonValue + 3); fillInButtonValues(intValue, m_buttonValues[firstButtonValue], m_buttonValues[firstButtonValue + 1], m_buttonValues[firstButtonValue + 2], m_buttonValues[firstButtonValue + 3]); } } else ASSERT_NOT_REACHED(); m_lastUpdateTime = monotonicallyIncreasingTime(); return element->isButton() ? HIDInputType::ButtonPress : HIDInputType::NotAButtonPress; }