summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2019-12-31 15:51:05 +0100
committerNathanael Sensfelder <SpamShield0@MultiAgentSystems.org>2019-12-31 15:51:05 +0100
commit63016ce5c71019de315434de3e91adbf535d4986 (patch)
treeb2368aecbbc790a600f7dfebfaabc8c28fa806b0 /src/device/axis
parentb9952b4938da95de07bff748cfd6d2c7e8471796 (diff)
Still working on it...
Diffstat (limited to 'src/device/axis')
-rw-r--r--src/device/axis/axis.c34
-rw-r--r--src/device/axis/axis_filter.c131
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);
+ }
+}