| summaryrefslogtreecommitdiff | 
diff options
| author | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2019-12-31 15:51:05 +0100 | 
|---|---|---|
| committer | Nathanael Sensfelder <SpamShield0@MultiAgentSystems.org> | 2019-12-31 15:51:05 +0100 | 
| commit | 63016ce5c71019de315434de3e91adbf535d4986 (patch) | |
| tree | b2368aecbbc790a600f7dfebfaabc8c28fa806b0 /src/device/axis | |
| parent | b9952b4938da95de07bff748cfd6d2c7e8471796 (diff) | |
Still working on it...
Diffstat (limited to 'src/device/axis')
| -rw-r--r-- | src/device/axis/axis.c | 34 | ||||
| -rw-r--r-- | src/device/axis/axis_filter.c | 131 | 
2 files changed, 165 insertions, 0 deletions
| diff --git a/src/device/axis/axis.c b/src/device/axis/axis.c new file mode 100644 index 0000000..75afad8 --- /dev/null +++ b/src/device/axis/axis.c @@ -0,0 +1,34 @@ +/**** POSIX *******************************************************************/ +#include <string.h> + +/**** RELABSD *****************************************************************/ +#include <relabsd/device/axis.h> + +/******************************************************************************/ +/**** LOCAL FUNCTIONS *********************************************************/ +/******************************************************************************/ + +/******************************************************************************/ +/**** EXPORTED FUNCTIONS ******************************************************/ +/******************************************************************************/ +void relabsd_axis_initialize +( +   struct relabsd_axis axis [const restrict static 1] +) +{ +   (void) memset(axis, 0, sizeof(struct relabsd_axis)); +} + +void relabsd_axis_to_absinfo +( +   struct relabsd_axis axis [const restrict static 1] +   struct input_absinfo absinfo [const restrict static 1] +) +{ +   absinfo->value = (__s32) 0; +   absinfo->minimum = (__s32) axis->min; +   absinfo->maximum = (__s32) axis->max; +   absinfo->fuzz = (__s32) axis->fuzz; +   absinfo->flat = (__s32) axis->flat; +   absinfo->resolution = (__s32) axis->resolution; +} diff --git a/src/device/axis/axis_filter.c b/src/device/axis/axis_filter.c new file mode 100644 index 0000000..295a7f6 --- /dev/null +++ b/src/device/axis/axis_filter.c @@ -0,0 +1,131 @@ +/**** RELABSD *****************************************************************/ +#include <relabsd/device/axis.h> + +/******************************************************************************/ +/**** LOCAL FUNCTIONS *********************************************************/ +/******************************************************************************/ +static int direct_filter +( +   struct relabsd_config_axis * const axis, +   int * const value +) +{ +   if (abs(*value - axis->previous_value) <= axis->fuzz) +   { +      if (axis->option[RELABSD_REAL_FUZZ_OPTION]) +      { +         axis->previous_value = *value; +      } + +      return -1; +   } + +   if (*value < axis->min) +   { +      *value = axis->min; +   } +   else if (*value > axis->max) +   { +      *value = axis->max; +   } +   else if (abs(*value) <= axis->flat) +   { +      *value = 0; +   } + +   if (*value == axis->previous_value) +   { +      return -1; +   } + +   axis->previous_value = *value; + +   return 1; +} + +static int rel_to_abs_filter +( +   struct relabsd_config_axis * const axis, +   int * const value +) +{ +   long int guard; + +   guard = (((long int) axis->previous_value) + ((long int) *value)); + +   if (guard < ((long int) INT_MIN)) +   { +      guard = ((long int) INT_MIN); +   } +   else if (guard > ((long int) INT_MAX)) +   { +      guard = ((long int) INT_MAX); +   } + +   *value = (int) guard; + +   if (axis->option[RELABSD_FRAMED_OPTION]) +   { +      if (*value < axis->min) +      { +         *value = axis->min; +      } +      else if (*value > axis->max) +      { +         *value = axis->max; +      } + +      if (*value == axis->previous_value) +      { +         return 0; +      } + +      axis->previous_value = *value; + +      return 1; +   } +   else +   { +      if (*value == axis->previous_value) +      { +         return 0; +      } + +      axis->previous_value = *value; + +      if ((*value < axis->min) || (*value > axis->max)) +      { +         return 0; +      } +      else +      { +         return 1; +      } +   } +} + +/******************************************************************************/ +/**** EXPORTED FUNCTIONS ******************************************************/ +/******************************************************************************/ +int relabsd_axis_filter_new_value +( +   struct relabsd_axis axis [const restrict static 1], +   int value [const restrict static 1] +) +{ +   if (!(axis->is_enabled)) +   { +      return; +   } + +   /* TODO: handle conf->axis[axis].resolution */ + +   if (axis->flag[RELABSD_DIRECT_OPTION]) +   { +      return direct_filter(axis, value); +   } +   else +   { +      return rel_to_abs_filter(axis, value); +   } +} | 


