summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuo Jinghua <sunmoon1997@gmail.com>2011-11-19 13:23:28 +0800
committerLuo Jinghua <sunmoon1997@gmail.com>2011-11-19 13:23:28 +0800
commitaefce33024df3debb4fa5e3a17ced4644159dfa2 (patch)
treef964e2ace4e242f80cf167f6d90b3f87700d6935
parent3c96a4050eda6fd4df1477d746a197c8791d4403 (diff)
SexyAppFramework/LinuxInput: Report the axis info
-rw-r--r--osframework/source/SexyAppFramework/LinuxInputDriver.cpp102
-rw-r--r--osframework/source/SexyAppFramework/LinuxInputDriver.h11
2 files changed, 91 insertions, 22 deletions
diff --git a/osframework/source/SexyAppFramework/LinuxInputDriver.cpp b/osframework/source/SexyAppFramework/LinuxInputDriver.cpp
index 3985042..bfdf47e 100644
--- a/osframework/source/SexyAppFramework/LinuxInputDriver.cpp
+++ b/osframework/source/SexyAppFramework/LinuxInputDriver.cpp
@@ -628,12 +628,6 @@ public:
!strcmp(info.name, "compass"))
continue;
-#if 0
- if (GetEnvOption("SEXY_LINUX_INPUT_IGNORE_ABS_POINTER", false) &&
- info.num_abs > 0)
- continue;
-#endif
-
LinuxInputInterface * anInput;
anInput = new LinuxInputInterface (theApp->mInputManager, this,
name, hotpluged);
@@ -1080,8 +1074,11 @@ bool LinuxInputInterface::OpenDevice ()
axis.minimum = -1.0f;
axis.maximum = 1.0f;
axis.resolution = axis.devResolution / range;
+ axis.value = RescaleAxisValue(axis, info.absinfo[i].value);
mAxisInfoMap.insert(AxisInfoMap::value_type(info.axis[i], axis));
}
+ mNumAxes = info.num_abs;
+
if (info.num_joysticks)
{
mButtonMap[BTN_TRIGGER] = KEYCODE_GAMEPAD_A;
@@ -1371,6 +1368,25 @@ bool LinuxInputInterface::HandleRelEvent (struct input_event & linux_event,
return true;
}
+float LinuxInputInterface::RescaleAxisValue(const LinuxAxisInfo& info, int value)
+{
+ if (info.devMaximum != info.devMinimum)
+ {
+ const float* coef = info.coef;
+ return (value + coef[0]) * coef[1] + coef[2];
+ }
+
+ float ret;
+ if (value < 0)
+ ret = -1.0f;
+ else if (value > 0)
+ ret = 1.0f;
+ else
+ ret = 0.0f;
+
+ return ret;
+}
+
bool LinuxInputInterface::HandleAbsEvent (struct input_event & linux_event,
Event & event)
{
@@ -1382,22 +1398,8 @@ bool LinuxInputInterface::HandleAbsEvent (struct input_event & linux_event,
return false;
LinuxAxisInfo& info = it->second;
- float value;
+ float value = RescaleAxisValue(info, linux_event.value);
- if (info.devMaximum != info.devMinimum)
- {
- const float* coef = info.coef;
- value = (linux_event.value + coef[0]) * coef[1] + coef[2];
- }
- else
- {
- if (linux_event.value < 0)
- value = -1.0f;
- else if (linux_event.value > 0)
- value = 1.0f;
- else
- value = 0.0f;
- }
event.type = EVENT_AXIS_MOVED;
event.flags = 0;
event.u.axis.axis = linux_event.code;
@@ -1407,6 +1409,8 @@ bool LinuxInputInterface::HandleAbsEvent (struct input_event & linux_event,
event.u.axis.minimum = info.minimum;
event.u.axis.maximum = info.maximum;
+ info.value = value;
+
if (GetEnvOption("SEXY_LINUX_INPUT_DEBUG", false))
logfd("LinuxInput:%p%d: AxisMoved[0x02%x]: value: %f raw value: 0x%x(%d:%d)",
this, mId, event.u.axis.axis, value, linux_event.value,
@@ -1546,6 +1550,62 @@ bool LinuxInputInterface::GetInfo (InputInfo &theInfo, int subid)
theInfo.mName = mDeviceName;
theInfo.mHasPointer = mHasPointer;
theInfo.mHasKey = mHasKey;
+ theInfo.mHasJoystick = mHasJoystick;
+ return true;
+}
+
+int LinuxInputInterface::GetNumAxes(int subid)
+{
+ if (subid != 0)
+ return 0;
+
+ return mNumAxes;
+}
+
+bool LinuxInputInterface::GetAxisInfo(Axis axis, InputAxisInfo& axisInfo, int subid)
+{
+ if (subid != 0)
+ return false;
+
+ AxisInfoMap::iterator it = mAxisInfoMap.find(axis);
+ if (it == mAxisInfoMap.end())
+ return false;
+
+ LinuxAxisInfo& info = it->second;
+ axisInfo.axis = axis;
+ axisInfo.value = info.value;
+ axisInfo.minimum = info.minimum;
+ axisInfo.maximum = info.maximum;
+ axisInfo.flat = info.flat;
+ axisInfo.fuzz = info.fuzz;
+ axisInfo.resolution = info.resolution;
+
+ return true;
+}
+
+bool LinuxInputInterface::GetAxisInfo(InputAxisInfoVector& axes, int subid)
+{
+ if (subid != 0)
+ return false;
+
+ if (!mNumAxes)
+ return false;
+
+ axes.resize(mNumAxes);
+ AxisInfoMap::iterator it = mAxisInfoMap.begin();
+ for (int i = 0; it != mAxisInfoMap.end(); ++it, ++i)
+ {
+ InputAxisInfo& axisInfo = axes[i];
+ LinuxAxisInfo& info = it->second;
+
+ axisInfo.axis = (Axis)it->first;
+ axisInfo.value = info.value;
+ axisInfo.minimum = info.minimum;
+ axisInfo.maximum = info.maximum;
+ axisInfo.flat = info.flat;
+ axisInfo.fuzz = info.fuzz;
+ axisInfo.resolution = info.resolution;
+ }
return true;
}
diff --git a/osframework/source/SexyAppFramework/LinuxInputDriver.h b/osframework/source/SexyAppFramework/LinuxInputDriver.h
index f00f067..7b1b228 100644
--- a/osframework/source/SexyAppFramework/LinuxInputDriver.h
+++ b/osframework/source/SexyAppFramework/LinuxInputDriver.h
@@ -28,7 +28,7 @@ struct LinuxDeviceInfo {
};
struct LinuxAxisInfo {
- float factor;
+ float value;
float coef[3];
float fuzz;
@@ -63,6 +63,14 @@ public:
virtual bool IsGrabbed ();
virtual bool Grab (bool);
+ virtual int GetNumAxes(int subid = 0);
+ virtual bool GetAxisInfo(Axis which, InputAxisInfo& axix,
+ int subid = 0);
+ virtual bool GetAxisInfo(InputAxisInfoVector& axes,
+ int subid = 0);
+
+ float RescaleAxisValue(const LinuxAxisInfo& info, int value);
+
bool HandleKeyEvent (struct input_event & linux_event,
int &modifiers, Event & event);
@@ -121,6 +129,7 @@ private:
bool mHasPointer;
bool mHasKey;
bool mRouton;
+ int mNumAxes;
};
}