summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2017-09-23 15:08:33 +0200
committerNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2017-09-23 15:08:33 +0200
commit45e71e07bbc891e552de58d5ba827ad719d90662 (patch)
treeb9741ac85661e397213923b1ff60bf862a1fb5a0 /src/relabsd_device.c
parentb1525c35503cafafd69aa63dedddf49bd00bac5f (diff)
Currently facing "Bad file descriptor" errors...
Diffstat (limited to 'src/relabsd_device.c')
-rw-r--r--src/relabsd_device.c106
1 files changed, 106 insertions, 0 deletions
diff --git a/src/relabsd_device.c b/src/relabsd_device.c
index b093203..4af52c8 100644
--- a/src/relabsd_device.c
+++ b/src/relabsd_device.c
@@ -205,6 +205,8 @@ int relabsd_device_create
close(fd);
+ dev->fd = fd;
+
return 0;
}
@@ -246,3 +248,107 @@ int relabsd_device_write_evdev_event
return -1;
}
+
+
+void relabsd_device_set_axes_to_zero
+(
+ const struct relabsd_device * const dev,
+ const struct relabsd_config * const config
+)
+{
+ int i;
+
+ for (i = 0; i < RELABSD_VALID_AXES_COUNT; ++i)
+ {
+ if (config->axis[i].enabled)
+ {
+ relabsd_device_write_evdev_event
+ (
+ dev,
+ relabsd_axis_to_abs((enum relabsd_axis) i),
+ EV_ABS,
+ 0
+ );
+ }
+ }
+
+ /*
+ * Also send a SYN event when the axes have been modified.
+ */
+ libevdev_uinput_write_event(dev->uidev, EV_SYN, SYN_REPORT, 0);
+}
+
+int relabsd_device_wait_next_event
+(
+ const struct relabsd_device * const dev,
+ const struct relabsd_config * const config
+)
+{
+ int ready_fds;
+ const int old_errno = errno;
+ fd_set ready_to_read;
+ struct timeval curr_timeout;
+
+ FD_ZERO(&ready_to_read);
+ FD_SET(dev->fd, &ready_to_read);
+
+ /* call to select may alter timeout */
+ memcpy
+ (
+ (void *) &(curr_timeout),
+ (const void *) &(config->timeout),
+ sizeof(struct timeval)
+ );
+
+ errno = 0;
+
+ ready_fds = select
+ (
+ (dev->fd + 1),
+ &ready_to_read,
+ (fd_set *) NULL,
+ (fd_set *) NULL,
+ &(curr_timeout)
+ );
+
+ if (errno != 0)
+ {
+ RELABSD_ERROR
+ (
+ "Unable to wait for timeout: %s (errno: %d).",
+ strerror(errno),
+ errno
+ );
+
+ if (errno == EINTR)
+ {
+ /* Signal interruption? */
+ }
+ else
+ {
+ /* TODO: error message */
+ }
+
+ errno = old_errno;
+
+ return -1;
+ }
+
+ if (ready_fds == -1)
+ {
+ /* TODO: error message */
+
+ RELABSD_S_ERROR
+ (
+ "Unable to wait for timeout, yet errno was not set to anything."
+ );
+
+ errno = old_errno;
+
+ return -1;
+ }
+
+ errno = old_errno;
+
+ return ready_fds;
+}