diff options
author | BogDan Vatra <bogdan@kde.org> | 2015-10-14 18:43:45 +0300 |
---|---|---|
committer | BogDan Vatra <bogdan@kdab.com> | 2015-10-15 08:49:56 +0000 |
commit | 61705b375d2e35d4130390a4929a5e3d8572a98c (patch) | |
tree | ce675a2bce5ea70c75679cfa76e7d38c64fea7da | |
parent | 5b96c19f6eb01dc438e1e5bc8dc28504769d2f1d (diff) |
EVDEV: Fix normalize logic.
Also add and use flat info.
Change-Id: Ie3229c01eba6ef71e49d3db8fdd6dc68137b1b0f
Reviewed-by: Andy Nichols <andy.nichols@theqtcompany.com>
-rw-r--r-- | src/plugins/gamepads/evdev/qevdevgamepadbackend.cpp | 32 | ||||
-rw-r--r-- | src/plugins/gamepads/evdev/qevdevgamepadbackend_p.h | 5 |
2 files changed, 21 insertions, 16 deletions
diff --git a/src/plugins/gamepads/evdev/qevdevgamepadbackend.cpp b/src/plugins/gamepads/evdev/qevdevgamepadbackend.cpp index 7915896..6319441 100644 --- a/src/plugins/gamepads/evdev/qevdevgamepadbackend.cpp +++ b/src/plugins/gamepads/evdev/qevdevgamepadbackend.cpp @@ -159,27 +159,27 @@ bool QEvdevGamepadDevice::openDevice(const QByteArray &dev) } // Defaults. To be replaced with queried values below. - m_axisInfo.insert(ABS_X, AxisInfo(-32768, 32767)); - m_axisInfo.insert(ABS_Y, AxisInfo(-32768, 32767)); - m_axisInfo.insert(ABS_RX, AxisInfo(-32768, 32767)); - m_axisInfo.insert(ABS_RY, AxisInfo(-32768, 32767)); - m_axisInfo.insert(ABS_Z, AxisInfo(0, 255)); - m_axisInfo.insert(ABS_RZ, AxisInfo(0, 255)); + m_axisInfo.insert(ABS_X, AxisInfo(-32768, 32767, 0)); + m_axisInfo.insert(ABS_Y, AxisInfo(-32768, 32767, 0)); + m_axisInfo.insert(ABS_RX, AxisInfo(-32768, 32767, 0)); + m_axisInfo.insert(ABS_RY, AxisInfo(-32768, 32767, 0)); + m_axisInfo.insert(ABS_Z, AxisInfo(0, 255, 0)); + m_axisInfo.insert(ABS_RZ, AxisInfo(0, 255, 0)); input_absinfo absInfo; memset(&absInfo, 0, sizeof(input_absinfo)); if (ioctl(m_fd, EVIOCGABS(ABS_X), &absInfo) >= 0) - m_axisInfo.insert(ABS_X, AxisInfo(absInfo.minimum, absInfo.maximum)); + m_axisInfo.insert(ABS_X, AxisInfo(absInfo.minimum, absInfo.maximum, absInfo.flat)); if (ioctl(m_fd, EVIOCGABS(ABS_Y), &absInfo) >= 0) - m_axisInfo.insert(ABS_Y, AxisInfo(absInfo.minimum, absInfo.maximum)); + m_axisInfo.insert(ABS_Y, AxisInfo(absInfo.minimum, absInfo.maximum, absInfo.flat)); if (ioctl(m_fd, EVIOCGABS(ABS_RX), &absInfo) >= 0) - m_axisInfo.insert(ABS_RX, AxisInfo(absInfo.minimum, absInfo.maximum)); + m_axisInfo.insert(ABS_RX, AxisInfo(absInfo.minimum, absInfo.maximum, absInfo.flat)); if (ioctl(m_fd, EVIOCGABS(ABS_RY), &absInfo) >= 0) - m_axisInfo.insert(ABS_RY, AxisInfo(absInfo.minimum, absInfo.maximum)); + m_axisInfo.insert(ABS_RY, AxisInfo(absInfo.minimum, absInfo.maximum, absInfo.flat)); if (ioctl(m_fd, EVIOCGABS(ABS_Z), &absInfo) >= 0) - m_axisInfo.insert(ABS_Z, AxisInfo(absInfo.minimum, absInfo.maximum)); + m_axisInfo.insert(ABS_Z, AxisInfo(absInfo.minimum, absInfo.maximum, absInfo.flat)); if (ioctl(m_fd, EVIOCGABS(ABS_RZ), &absInfo) >= 0) - m_axisInfo.insert(ABS_RZ, AxisInfo(absInfo.minimum, absInfo.maximum)); + m_axisInfo.insert(ABS_RZ, AxisInfo(absInfo.minimum, absInfo.maximum, absInfo.flat)); qCDebug(lcEGB) << "Axis limits:" << m_axisInfo; @@ -231,10 +231,14 @@ err: double QEvdevGamepadDevice::AxisInfo::normalized(int value) const { + double ret = 0; if (minValue >= 0) - return (value - minValue) / double(maxValue - minValue); + ret = 2 * (value - double(maxValue - minValue) / 2) / double(maxValue - minValue); else - return 2 * (value - minValue) / double(maxValue - minValue) - 1.0; + ret = 2 * (value - minValue) / double(maxValue - minValue) - 1.0; + if (fabs(ret) <= fabs(flat)) + ret = 0; + return ret; } void QEvdevGamepadDevice::processInputEvent(input_event *e) diff --git a/src/plugins/gamepads/evdev/qevdevgamepadbackend_p.h b/src/plugins/gamepads/evdev/qevdevgamepadbackend_p.h index e23af7c..e9e587c 100644 --- a/src/plugins/gamepads/evdev/qevdevgamepadbackend_p.h +++ b/src/plugins/gamepads/evdev/qevdevgamepadbackend_p.h @@ -72,12 +72,13 @@ private: int m_fd; QSocketNotifier *m_notifier; struct AxisInfo { - AxisInfo() : minValue(0), maxValue(1) { } - AxisInfo(int minValue, int maxValue) : minValue(minValue), maxValue(maxValue) { } + AxisInfo() : minValue(0), maxValue(1), flat(0) { } + AxisInfo(int minValue, int maxValue, int flat) : minValue(minValue), maxValue(maxValue), flat(fabs((maxValue-minValue) ? flat/double(maxValue-minValue) : 0)) { } double normalized(int value) const; int minValue; int maxValue; + double flat; }; QHash<int, AxisInfo> m_axisInfo; QGamepadManager::GamepadButton m_prevYHatButton; |