34 #include <linux/joystick.h>
55 open(std::string
const& deviceName, std::string
const& deviceEventName)
58 fd =
::open(deviceName.c_str(), O_RDONLY);
60 if (!deviceEventName.empty())
63 fdEvent =
::open(deviceEventName.c_str(), O_RDWR | O_CLOEXEC);
82 ioctl(fd, JSIOCGNAME(255), &
name[0]);
103 int bytes =
read(fd, &event,
sizeof(event));
107 if (bytes == -1 || bytes !=
sizeof(event))
112 if (event.type & JS_EVENT_BUTTON)
116 else if (event.type & JS_EVENT_AXIS)
118 axis[
event.number] =
event.value;
142 ret = ioctl(fdEvent, EVIOCGEFFECTS, &effects);
151 struct input_event ie;
155 ie.value = 0xFFFFUL * gain / 100;
157 if (
write(fdEvent, &ie,
sizeof(ie)) == -1)
171 e.type = FF_PERIODIC;
173 e.replay.length = 5000;
174 e.replay.delay = 500;
175 e.u.periodic.waveform = FF_SQUARE;
176 e.u.periodic.period = 1000;
177 e.u.periodic.magnitude = 0xFF;
178 e.u.periodic.offset = 0xFF;
180 ret = ioctl(fdEvent, EVIOCSFF, &e);
189 play.code =
static_cast<std::uint16_t
>(e.id);
192 ret =
write(fdEvent, &play,
sizeof(play));
198 for (
int i = 0; i < 5; i++)
201 input_event statusIe;
202 statusIe.type = EV_FF_STATUS;
203 statusIe.code = e.id;
206 ret =
write(fdEvent, &statusIe,
sizeof(statusIe));
226 [[maybe_unused]]
const int stopStatus =
227 write(fdEvent,
static_cast<const void*
>(&stop),
sizeof(stop));
230 ret = ioctl(fdEvent, EVIOCRMFF, e.id);