| summaryrefslogtreecommitdiff |
diff options
| author | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2017-09-23 15:08:33 +0200 |
|---|---|---|
| committer | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2017-09-23 15:08:33 +0200 |
| commit | 45e71e07bbc891e552de58d5ba827ad719d90662 (patch) | |
| tree | b9741ac85661e397213923b1ff60bf862a1fb5a0 /src/relabsd_device.c | |
| parent | b1525c35503cafafd69aa63dedddf49bd00bac5f (diff) | |
Currently facing "Bad file descriptor" errors...
Diffstat (limited to 'src/relabsd_device.c')
| -rw-r--r-- | src/relabsd_device.c | 106 |
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; +} |


