| summaryrefslogtreecommitdiff | 
diff options
| author | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2015-09-01 22:48:51 +0200 | 
|---|---|---|
| committer | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2015-09-01 22:48:51 +0200 | 
| commit | 1af58bb8886673ac115f019094853fa763e79187 (patch) | |
| tree | c2ab030898e74288f82c557287272546a990e932 /src/input.c | |
Initial commit.
Diffstat (limited to 'src/input.c')
| -rw-r--r-- | src/input.c | 150 | 
1 files changed, 150 insertions, 0 deletions
| diff --git a/src/input.c b/src/input.c new file mode 100644 index 0000000..eb7b013 --- /dev/null +++ b/src/input.c @@ -0,0 +1,150 @@ +#include <fcntl.h> +#include <errno.h> +#include <string.h> + +#include <libevdev/libevdev.h> + +#include "error.h" + +#include "input.h" + +static int check_for_axis +( +   const struct libevdev * const dev, +   const char * axis_name, +   const unsigned int axis_id +) +{ +   if (!libevdev_has_event_code(dev, EV_REL, axis_id)) +   { +      _FATAL("Input device has no %s axis.", axis_name); + +      return -1; +   } + +   return 0; +} + +static int device_is_compatible (const struct libevdev * const dev) +{ +   if (!libevdev_has_event_type(dev, EV_REL)) +   { +      _S_FATAL("Input device has no relative axis."); + +      return -1; +   } + +   if +   ( +      (check_for_axis(dev, "X", REL_X) < 0) +      | (check_for_axis(dev, "Y", REL_Y) < 0) +      | (check_for_axis(dev, "Z", REL_Z) < 0) +      | (check_for_axis(dev, "RX", REL_RX) < 0) +      | (check_for_axis(dev, "RY", REL_RY) < 0) +      | (check_for_axis(dev, "RZ", REL_RZ) < 0) +   ) +   { +      return -1; +   } + +   return 0; +} + +int relabsd_input_open +( +   struct relabsd_input * const input, +   const char * const filename +) +{ +   input->fd = open(filename, O_RDONLY); + +   if (input->fd < 0) +   { +      _FATAL +      ( +         "Could not open device %s in read only mode:", +         filename, +         strerror(errno) +      ); + +      return -1; +   } + +   if +   ( +      libevdev_new_from_fd(input->fd, &(input->dev)) < 0 +   ) +   { +      _FATAL +      ( +         "libevdev could not open %s:", +         filename, +         strerror(errno) +      ); + +      close(input->fd); + +      return -1; +   } + +   if (device_is_compatible(input->dev) < 0) +   { +      _FATAL("%s is not compatible with relabsd.", filename); + +      return -1; +   } + +   return 0; +} + +void relabsd_input_close (const struct relabsd_input * const input) +{ +   libevdev_free(input->dev); +   close(input->fd); +} + +int relabsd_input_read +( +   const struct relabsd_input * const input, +   unsigned int * const input_type, +   unsigned int * const input_code, +   int * const input_value +) +{ +   int rc; +   struct input_event event; + +   rc = +      libevdev_next_event +      ( +         input->dev, +         (LIBEVDEV_READ_FLAG_NORMAL | LIBEVDEV_READ_FLAG_BLOCKING), +         &event +      ); + +   /*if (rc == LIBEVDEV_READ_STATUS_SYNC) +   { +      handle_syn_dropped(input->dev); +   } +   else*/ if (rc != LIBEVDEV_READ_STATUS_SUCCESS) +   { +      _WARNING("[INPUT] Could not get next event: %s.", strerror(-rc)); + +      return -1; +   } + +   _DEBUG +   ( +      90, +      "[INPUT] Valid event received: {type = %s; code = %s; value = %d}.", +       libevdev_event_type_get_name(event.type), +       libevdev_event_code_get_name(event.type, event.code), +       event.value +   ); + +   *input_type = event.type; +   *input_code = event.code; +   *input_value = event.value; + +   return 0; +} | 


