aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBogDan Vatra <bogdan@kde.org>2015-10-14 18:43:45 +0300
committerBogDan Vatra <bogdan@kdab.com>2015-10-15 08:49:56 +0000
commit61705b375d2e35d4130390a4929a5e3d8572a98c (patch)
treece675a2bce5ea70c75679cfa76e7d38c64fea7da
parent5b96c19f6eb01dc438e1e5bc8dc28504769d2f1d (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.cpp32
-rw-r--r--src/plugins/gamepads/evdev/qevdevgamepadbackend_p.h5
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;