| 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); + } +} |


