21 #include <mrpt/config.h>
22 #include <mrpt/core/exceptions.h>
25 #define WIN32_LEAN_AND_MEAN
30 #if !defined(__GNUC__)
31 #pragma comment(lib, "WINMM.LIB")
35 #if defined(MRPT_OS_LINUX) || defined(__APPLE__)
38 #include <sys/ioctl.h>
40 #include <sys/types.h>
48 #if defined(MRPT_OS_LINUX) && defined(HAVE_LINUX_INPUT_H)
49 #include <linux/input.h>
50 #include <linux/joystick.h>
58 Joystick::Joystick() =
default;
65 #if defined(MRPT_OS_LINUX) && defined(HAVE_LINUX_INPUT_H)
83 return joyGetNumDevs();
84 #elif defined(MRPT_OS_LINUX) && defined(HAVE_LINUX_INPUT_H)
91 if (-1 != (joy_fd = open(mrpt::format(
"/dev/input/js%i", nJoys).c_str(), O_RDONLY)))
96 }
while (joy_fd != -1);
118 int ID = JOYSTICKID1 + nJoy;
121 if (JOYERR_NOERROR != joyGetPos(ID, &jinfo))
return false;
124 float x = (jinfo.wXpos - m_x_min) / (
float)(m_x_max - m_x_min);
125 float y = (jinfo.wYpos - m_y_min) / (
float)(m_y_max - m_y_min);
126 float z = (jinfo.wZpos - m_z_min) / (
float)(m_z_max - m_z_min);
134 output.
buttons[0] = 0 != (jinfo.wButtons & JOY_BUTTON1);
135 output.
buttons[1] = 0 != (jinfo.wButtons & JOY_BUTTON2);
136 output.
buttons[2] = 0 != (jinfo.wButtons & JOY_BUTTON3);
137 output.
buttons[3] = 0 != (jinfo.wButtons & JOY_BUTTON4);
144 output.
axes.resize(3);
150 #elif defined(MRPT_OS_LINUX) && defined(HAVE_LINUX_INPUT_H)
152 if (m_joy_index == nJoy && m_joy_fd != -1)
159 if (m_joy_fd != -1) close(m_joy_fd);
162 if ((m_joy_fd = open(mrpt::format(
"/dev/input/js%i", nJoy).c_str(), O_RDONLY)) < 0)
169 fcntl(m_joy_fd, F_SETFL, O_NONBLOCK);
174 while (read(m_joy_fd, &js,
sizeof(
struct js_event)) ==
sizeof(
struct js_event))
177 const size_t jsNum =
static_cast<size_t>(js.number);
180 if (js.type & JS_EVENT_BUTTON)
182 if (m_joystate_btns.size() < jsNum + 1) m_joystate_btns.resize(jsNum + 1);
184 m_joystate_btns[jsNum] = (js.value != 0);
188 if (js.type & JS_EVENT_AXIS)
190 if (m_joystate_axes.size() < jsNum + 1) m_joystate_axes.resize(jsNum + 1);
192 m_joystate_axes[jsNum] =
static_cast<int>(js.value);
205 output.
buttons = m_joystate_btns;
207 const size_t nAxis = m_joystate_axes.size();
209 output.
axes.resize(nAxis);
211 for (
size_t i = 0; i < nAxis; i++)
213 output.
axes_raw[i] = m_joystate_axes[i];
218 output.
axes[i] = -1.0f + 2.0f * (m_joystate_axes[i] - calib_min) /
219 static_cast<float>(calib_max - calib_min);