| 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 | |
| parent | b9952b4938da95de07bff748cfd6d2c7e8471796 (diff) | |
Still working on it...
| -rw-r--r-- | include/relabsd/client_types.h | 0 | ||||
| -rw-r--r-- | include/relabsd/config/config_file.h | 8 | ||||
| -rw-r--r-- | include/relabsd/config/parameters.h | 57 | ||||
| -rw-r--r-- | include/relabsd/config/parameters_types.h | 22 | ||||
| -rw-r--r-- | include/relabsd/device/axis.h | 26 | ||||
| -rw-r--r-- | include/relabsd/device/axis_types.h | 43 | ||||
| -rw-r--r-- | include/relabsd/device/physical_device.h | 9 | ||||
| -rw-r--r-- | include/relabsd/device/physical_device_types.h | 10 | ||||
| -rw-r--r-- | include/relabsd/device/virtual_device.h | 22 | ||||
| -rw-r--r-- | include/relabsd/device/virtual_device_types.h | 23 | ||||
| -rw-r--r-- | include/relabsd/server_types.h | 0 | ||||
| -rw-r--r-- | src/client.c | 25 | ||||
| -rw-r--r-- | src/config/config_file.c | 149 | ||||
| -rw-r--r-- | src/config/parameters/parameters.c (renamed from src/config/parameters.c) | 208 | ||||
| -rw-r--r-- | src/config/parameters/parameters_accessors.c | 60 | ||||
| -rw-r--r-- | src/device/axis/axis.c | 34 | ||||
| -rw-r--r-- | src/device/axis/axis_filter.c | 131 | ||||
| -rw-r--r-- | src/server/server.c | 45 |
18 files changed, 576 insertions, 296 deletions
diff --git a/include/relabsd/client_types.h b/include/relabsd/client_types.h new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/include/relabsd/client_types.h diff --git a/include/relabsd/config/config_file.h b/include/relabsd/config/config_file.h index 3aa1a13..f904182 100644 --- a/include/relabsd/config/config_file.h +++ b/include/relabsd/config/config_file.h @@ -3,20 +3,12 @@ #include <libevdev/libevdev.h> -#include "axis.h" - /* Maximum length for a axis code. */ #define RELABSD_CONF_AXIS_CODE_SIZE 2 /* Number of options that can be configured. */ #define RELABSD_OPTIONS_COUNT 3 -enum relabsd_option -{ - RELABSD_DIRECT_OPTION, - RELABSD_REAL_FUZZ_OPTION, - RELABSD_FRAMED_OPTION -}; struct relabsd_config_axis { diff --git a/include/relabsd/config/parameters.h b/include/relabsd/config/parameters.h index e69de29..5a12be4 100644 --- a/include/relabsd/config/parameters.h +++ b/include/relabsd/config/parameters.h @@ -0,0 +1,57 @@ +#pragma once + +#include <relabsd/config/parameters_types.h> + +/**** Utility *****************************************************************/ +int relabsd_parameters_parse_execution_mode +( + const int argc, + const char * const argv [const restrict static argc], + struct relabsd_parameters parameters [const restrict static 1] +); + +int relabsd_parameters_parse_options +( + const int argc, + const char * const argv [const restrict static argc], + struct relabsd_parameters parameters [const restrict static 1] +); + +int relabsd_parameters_argument_count_for +( + const char option [const restrict static 1], + int result [const restrict static 1] +); + +void relabsd_parameters_print_usage (const char exec [const restrict static 1]); + +/**** Accessors ***************************************************************/ +void relabsd_parameters_initialize_options +( + const struct relabsd_parameters parameters [const restrict static 1] +); + +int relabsd_parameters_get_run_as_daemon +( + const struct relabsd_parameters parameters [const restrict static 1] +); + +const char * relabsd_parameters_get_communication_node_name +( + const struct relabsd_parameters parameters [const restrict static 1] +); + +const char * relabsd_parameters_get_device_name +( + const struct relabsd_parameters parameters [const restrict static 1] +); + +const char * relabsd_parameters_get_physical_device_file_name +( + const struct relabsd_parameters parameters [const restrict static 1] +); + +enum relabsd_parameters_run_mode relabsd_parameters_get_execution_mode +( + const struct relabsd_parameters parameters [const restrict static 1] +); diff --git a/include/relabsd/config/parameters_types.h b/include/relabsd/config/parameters_types.h new file mode 100644 index 0000000..ab07bfa --- /dev/null +++ b/include/relabsd/config/parameters_types.h @@ -0,0 +1,22 @@ +#pragma once + +#include <relabsd/device/axis_types.h> + +enum relabsd_parameters_run_mode +{ + RELABSD_PARAMETERS_CLIENT_MODE, + RELABSD_PARAMETERS_SERVER_MODE, + RELABSD_PARAMETERS_COMPATIBILITY_TEST_MODE +}; + +struct relabsd_parameters +{ + int read_argc; + enum relabsd_parameters_run_mode mode; + int run_as_daemon; + const char * communication_node_name; + const char * device_name; + const char * physical_device_file_name; + const char * configuration_file; + struct relabsd_axis axes[RELABSD_AXIS_VALID_AXES_COUNT] +}; diff --git a/include/relabsd/device/axis.h b/include/relabsd/device/axis.h index 3829b51..fee8522 100644 --- a/include/relabsd/device/axis.h +++ b/include/relabsd/device/axis.h @@ -1,30 +1,6 @@ #pragma once -/* Number of axes that can be configured. */ -#define RELABSD_AXIS_AXES_COUNT 8 - -enum relabsd_axis_name -{ - RELABSD_X, - RELABSD_Y, - RELABSD_Z, - RELABSD_RX, - RELABSD_RY, - RELABSD_RZ, - RELABSD_WHEEL, - RELABSD_MISC, - RELABSD_UNKNOWN -}; - -struct relabsd_axis -{ - int min; - int max; - int fuzz; - int flat; - int resolution; - int flags; -}; +#include <relabsd/device/axis_types.h> /* * Gives the relabsd_axis and EV_ABS event code equivalent to an EV_REL event diff --git a/include/relabsd/device/axis_types.h b/include/relabsd/device/axis_types.h new file mode 100644 index 0000000..5ae0145 --- /dev/null +++ b/include/relabsd/device/axis_types.h @@ -0,0 +1,43 @@ +#pragma once + +/* Number of axes that can be configured. */ +#define RELABSD_AXIS_VALID_AXES_COUNT 8 +#define RELABSD_AXIS_FLAGS_COUNT 3 + +/* + * C enumerations are always int, and the standard does specify that it starts + * at zero and increases from there, unless otherwise specified in the + * declaration. + */ +enum relabsd_axis_name +{ + RELABSD_X, + RELABSD_Y, + RELABSD_Z, + RELABSD_RX, + RELABSD_RY, + RELABSD_RZ, + RELABSD_WHEEL, + RELABSD_MISC, + RELABSD_UNKNOWN +}; + +enum relabsd_axis_flag +{ + RELABSD_DIRECT, + RELABSD_REAL_FUZZ, + RELABSD_FRAMED +}; + +struct relabsd_axis +{ + int min; + int max; + int fuzz; + int flat; + int resolution; + + int is_enabled; + int previous_value; + int flags[RELABSD_AXIS_FLAGS_COUNT]; +}; diff --git a/include/relabsd/device/physical_device.h b/include/relabsd/device/physical_device.h index 6b44802..3e55823 100644 --- a/include/relabsd/device/physical_device.h +++ b/include/relabsd/device/physical_device.h @@ -1,13 +1,6 @@ #pragma once -#include <libevdev/libevdev.h> - -struct relabsd_physical_device -{ - struct libevdev * libevdev; - int file; - int timed_out; -}; +#include <relabsd/device/physical_device_types.h> /* * Returns -1 on (fatal) error, diff --git a/include/relabsd/device/physical_device_types.h b/include/relabsd/device/physical_device_types.h new file mode 100644 index 0000000..0c2cec7 --- /dev/null +++ b/include/relabsd/device/physical_device_types.h @@ -0,0 +1,10 @@ +#pragma once + +#include <libevdev/libevdev.h> + +struct relabsd_physical_device +{ + struct libevdev * libevdev; + int file; + int timed_out; +}; diff --git a/include/relabsd/device/virtual_device.h b/include/relabsd/device/virtual_device.h index d398c7f..646422a 100644 --- a/include/relabsd/device/virtual_device.h +++ b/include/relabsd/device/virtual_device.h @@ -1,26 +1,6 @@ #pragma once -#include <libevdev/libevdev.h> -#include <libevdev/libevdev-uinput.h> - -/* - LIBEVDEV_UINPUT_OPEN_MANAGED is not defined on my machines. - It is not my place to define it, so I'll avoid the issue by defining my own - constant. -*/ -#ifndef LIBEVDEV_UINPUT_OPEN_MANAGED - #pragma message "[WARNING] libevdev did not define " \ - "LIBEVDEV_UINPUT_OPEN_MANAGED, using value '-2' instead." - #define RELABSD_UINPUT_OPEN_MANAGED -2 -#else - #define RELABSD_UINPUT_OPEN_MANAGED LIBEVDEV_UINPUT_OPEN_MANAGED -#endif - -struct relabsd_device -{ - struct libevdev * dev; - struct libevdev_uinput * uidev; -}; +#include <relabsd/device/virtual_device_types.h> /* * - Clones the (real) input device. diff --git a/include/relabsd/device/virtual_device_types.h b/include/relabsd/device/virtual_device_types.h new file mode 100644 index 0000000..d20fafe --- /dev/null +++ b/include/relabsd/device/virtual_device_types.h @@ -0,0 +1,23 @@ +#pragma once + +#include <libevdev/libevdev.h> +#include <libevdev/libevdev-uinput.h> + +/* + LIBEVDEV_UINPUT_OPEN_MANAGED is not defined on my machines. + It is not my place to define it, so I'll avoid the issue by defining my own + constant. +*/ +#ifndef LIBEVDEV_UINPUT_OPEN_MANAGED + #pragma message "[WARNING] libevdev did not define " \ + "LIBEVDEV_UINPUT_OPEN_MANAGED, using value '-2' instead." + #define RELABSD_UINPUT_OPEN_MANAGED -2 +#else + #define RELABSD_UINPUT_OPEN_MANAGED LIBEVDEV_UINPUT_OPEN_MANAGED +#endif + +struct relabsd_device +{ + struct libevdev * dev; + struct libevdev_uinput * uidev; +}; diff --git a/include/relabsd/server_types.h b/include/relabsd/server_types.h new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/include/relabsd/server_types.h diff --git a/src/client.c b/src/client.c index d03a768..b0459af 100644 --- a/src/client.c +++ b/src/client.c @@ -20,8 +20,8 @@ /******************************************************************************/ static int open_socket ( - FILE * s [const restrict static 1], - const char socket_name [const restrict static 1] + const char socket_name [const restrict static 1], + FILE * s [const restrict static 1] ) { const int old_errno = errno; @@ -113,9 +113,16 @@ static int send_commands // TODO: error } + if (relabsd_parameters_argument_count_for(argv[i], &j) < 0) + { + RELABSD_FATAL("Unknown option '%s'.", argv[i]); + relabsd_parameters_print_usage(argv[0]); + + return -1; + } + for ( - j = relabsd_parameters_argument_count_for(argv[i]), i++; ((j > 0) && (i < argc)); j++, i-- @@ -161,14 +168,22 @@ int relabsd_client ( const int argc, const char * argv [const restrict static argc], - struct relabsd_parameters params [const restrict static 1] + struct relabsd_parameters parameters [const restrict static 1] ) { FILE * socket; RELABSD_S_DEBUG(RELABSD_DEBUG_PROGRAM_FLOW, "Started client mode."); - if (open_socket(&socket, relabsd_parameters_get_node(params)) < 0) + if + ( + open_socket + ( + relabsd_parameters_get_communication_node_name(parameters), + &socket + ) + < 0 + ) { return -1; } diff --git a/src/config/config_file.c b/src/config/config_file.c index ad060a5..2e5ef0c 100644 --- a/src/config/config_file.c +++ b/src/config/config_file.c @@ -1,3 +1,4 @@ +/**** POSIX *******************************************************************/ #include <errno.h> #include <string.h> #include <stdio.h> @@ -6,38 +7,27 @@ #include <sys/time.h> -#include "error.h" -#include "pervasive.h" -#include "axis.h" -#include "config.h" +/**** RELABSD *****************************************************************/ +#include <relabsd/debug.h> + +#include <relabsd/config/config_file.h> #ifndef RELABSD_OPTION_MAX_SIZE #define RELABSD_OPTION_MAX_SIZE 64 #endif -/* - * "errno is never set to zero by any system call or library function." - * This file makes use of this, by setting it to zero and checking if - * it was modified after calling an function (I'm guessing this is common - * practice, but I think it's worth explaining). - * Following the principle of least astonishment, if a function sets errno to - * zero, it will not return before setting it back either to its previous - * value or to a arbitrary nonzero value. - */ +/******************************************************************************/ +/**** LOCAL FUNCTIONS *********************************************************/ +/******************************************************************************/ /* * Returns -1 on (fatal) error, * 0 on EOF, * 1 on newline. */ -static int reach_next_line_or_eof (FILE * const f) +static int reach_next_line_or_eof (FILE f [const restrict static 1]) { - int prev_errno; char c; - prev_errno = errno; - - errno = 0; - c = (char) getc(f); while ((c != '\n') && c != EOF) @@ -45,21 +35,22 @@ static int reach_next_line_or_eof (FILE * const f) c = (char) getc(f); } - if (errno != 0) + if (ferror(f)) { - RELABSD_FATAL + /* + * The 'ferror' function's manual specifically states that it does not + * sets errno. There is no mention of errno in the 'getc' function's + * either, so I am assuming that errno cannot be used to indicate the + * error. + */ + RELABSD_S_FATAL ( - "[CONFIG] Error while attempting to reach EOF or next line: %s.", - strerror(errno) + "[CONFIG] Error while attempting to reach EOF or next line: %s." ); - errno = prev_errno; - return -1; } - errno = prev_errno; - if (c == EOF) { return 0; @@ -643,6 +634,7 @@ static int parse_options return 0; } + int relabsd_config_parse ( struct relabsd_config * const conf, @@ -681,106 +673,6 @@ int relabsd_config_parse return 0; } -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; - } - } -} - int relabsd_config_filter ( struct relabsd_config * const conf, @@ -805,6 +697,9 @@ int relabsd_config_filter } } +/******************************************************************************/ +/**** EXPORTED FUNCTIONS ******************************************************/ +/******************************************************************************/ void relabsd_config_get_absinfo ( const struct relabsd_config * const conf, diff --git a/src/config/parameters.c b/src/config/parameters/parameters.c index 5e79fa2..c8db4fa 100644 --- a/src/config/parameters.c +++ b/src/config/parameters/parameters.c @@ -14,50 +14,6 @@ /******************************************************************************/ /**** LOCAL FUNCTIONS *********************************************************/ /******************************************************************************/ -static void print_usage (const char exec [const restrict static 1]) -{ - printf - ( - "USAGE: %s <MODE> [<OPTION>+]\n\n" - - "<MODE>:\n" - "\t[-? | --compatible] <physical_device_file>:\n" - "\t\tDevice compatibility test.\n\n" - - "\t[-c | --client] <server_file>:\n" - "\t\tSends the commands to a given server instance.\n\n" - - "\t[-s | --server] <server_file> <physical_device_file>:\n" - "\t\tCreates a named server instance.\n\n" - - "\t[-1 | --self] <physical_device_file>:\n" - "\t\tCreates a unnamed server instance.\n\n" - - "<OPTION>:\n" - "\t[-d | --daemon]:\n" - "\t\tRuns server instance in the background.\n\n" - - "\t[-n | --name] <relabsd_device_name>:\n" - "\t\tNames the virtual device.\n\n" - - "\t[-t | --timeout] <timeout_in_ms>:\n" - "\t\tSets a zeroing timeout (0 to disable).\n\n" - - "\t[-a | --axis] <name> <min> <max> <fuzz> <flat> <resolution> " - "<options>:\n" - "\t\t(Re)defines an axis.\n\n" - - "\t[-m | --mod-axis] <name> <min> <max> <fuzz> <flat> <resolution> " - "<signed_options>:\n" - "\t\tModifies an axis (use + and - signs for the options).\n\n" - - "\t[-f | --config] <config_file>" - "<options>:\n" - "\t\t(Re)defines an axis.\n", - exec - ); -} - static int parse_axis ( const int argc, @@ -135,14 +91,14 @@ int relabsd_parameters_parse_execution_mode ( const int argc, const char * argv [const restrict static argc], - struct relabsd_parameters params [const restrict static 1] + struct relabsd_parameters parameters [const restrict static 1] ) { RELABSD_S_DEBUG(RELABSD_DEBUG_PROGRAM_FLOW, "Parsing exec mode..."); if (argc < 3) { - print_usage(argv[0]); + relabsd_parameters_print_usage(argv[0]); return -1; } @@ -153,9 +109,9 @@ int relabsd_parameters_parse_execution_mode || RELABSD_STRING_EQUALS("--compatibility", argv[1]) ) { - params->mode = RELABSD_PARAMETERS_COMPATIBILITY_TEST_MODE; - params->physical_device_name = argv[2]; - params->read_argc = 2; + parameters->mode = RELABSD_PARAMETERS_COMPATIBILITY_TEST_MODE; + parameters->physical_device_name = argv[2]; + parameters->read_argc = 2; } else if ( @@ -163,10 +119,10 @@ int relabsd_parameters_parse_execution_mode || RELABSD_STRING_EQUALS("--client", argv[1]) ) { - params->mode = RELABSD_PARAMETERS_CLIENT_MODE; - params->communication_node_name = argv[2]; - params->physical_device_name = (char *) NULL; - params->read_argc = 2; + parameters->mode = RELABSD_PARAMETERS_CLIENT_MODE; + parameters->communication_node_name = argv[2]; + parameters->physical_device_name = (const char *) NULL; + parameters->read_argc = 2; } else if ( @@ -174,10 +130,10 @@ int relabsd_parameters_parse_execution_mode || RELABSD_STRING_EQUALS("--server", argv[1]) ) { - params->mode = RELABSD_PARAMETERS_SERVER_MODE; - params->communication_node_name = argv[2]; - params->physical_device_name = argv[3]; - params->read_argc = 3; + parameters->mode = RELABSD_PARAMETERS_SERVER_MODE; + parameters->communication_node_name = argv[2]; + parameters->physical_device_name = argv[3]; + parameters->read_argc = 3; } else if ( @@ -185,14 +141,14 @@ int relabsd_parameters_parse_execution_mode || RELABSD_STRING_EQUALS("--self", argv[1]) ) { - params->mode = RELABSD_PARAMETERS_SERVER_MODE; - params->communication_node_name = (char *) NULL; - params->physical_device_name = argv[2]; - params->read_argc = 2; + parameters->mode = RELABSD_PARAMETERS_SERVER_MODE; + parameters->communication_node_name = (char *) NULL; + parameters->physical_device_name = argv[2]; + parameters->read_argc = 2; } else { - print_usage(argv[0]); + relabsd_parameters_print_usage(argv[0]); return -1; } @@ -205,15 +161,15 @@ int relabsd_parameters_parse_execution_mode int relabsd_parameters_parse_options ( const int argc, - const char * argv [const restrict static argc], - struct relabsd_parameters params [const restrict static 1] + const char * const argv [const restrict static argc], + struct relabsd_parameters parameters [const restrict static 1] ) { int i; RELABSD_S_DEBUG(RELABSD_DEBUG_PROGRAM_FLOW, "Parsing options..."); - set_default_options(params); + relabsd_parameters_initialize_options(parameters); /* * i = (params->read_argc + 1) because reading 2 params is actually reaching @@ -252,7 +208,7 @@ int relabsd_parameters_parse_options } ++i; - params->name = argv[i]; + params->device_name = argv[i]; } else if ( @@ -263,7 +219,7 @@ int relabsd_parameters_parse_options if (argc == i) { RELABSD_FATAL("Missing value for \"%s\" <OPTION>.", argv[i]); - print_usage(argv[0]); + relabsd_parameters_print_usage(argv[0]); return -1; } @@ -284,7 +240,7 @@ int relabsd_parameters_parse_options INT_MAX ); - print_usage(argv[0]); + relabsd_parameters_print_usage(argv[0]); return -1; } @@ -298,7 +254,7 @@ int relabsd_parameters_parse_options if (argc == i) { RELABSD_FATAL("Missing values for \"%s\" <OPTION>.", argv[i]); - print_usage(argv[0]); + relabsd_parameters_print_usage(argv[0]); return -1; } @@ -307,7 +263,7 @@ int relabsd_parameters_parse_options if (parse_axis((argc - i), (argv + i), params->axes) < 0) { - print_usage(argv[0]); + relabsd_parameters_print_usage(argv[0]); return -1; } @@ -321,18 +277,18 @@ int relabsd_parameters_parse_options if (argc == i) { RELABSD_FATAL("Missing value for \"%s\" <OPTION>.", argv[i]); - print_usage(argv[0]); + relabsd_parameters_print_usage(argv[0]); return -1; } ++i; - params->config_file = argv[i]; + params->configuration_file = argv[i]; } else { RELABSD_FATAL("Unknown <OPTION> \"%s\".", argv[i]); - print_usage(argv[0]); + relabsd_parameters_print_usage(argv[0]); return -1; } @@ -342,3 +298,109 @@ int relabsd_parameters_parse_options return 0; } + +int relabsd_parameters_argument_count_for +( + const char option [const restrict static 1], + int result [const restrict static 1] +) +{ + if + ( + RELABSD_STRING_EQUALS("-n", option) + || RELABSD_STRING_EQUALS("--name", option) + ) + { + *result = 0; + } + else if + ( + RELABSD_STRING_EQUALS("-n", option) + || RELABSD_STRING_EQUALS("--name", option) + ) + { + *result = 1; + } + else if + ( + RELABSD_STRING_EQUALS("-t", option) + || RELABSD_STRING_EQUALS("--timeout", option) + ) + { + *result = 1; + } + else if + ( + RELABSD_STRING_EQUALS("-a", option) + || RELABSD_STRING_EQUALS("--axis", option) + ) + { + *result = 7; + } + else if + ( + RELABSD_STRING_EQUALS("-m", option) + || RELABSD_STRING_EQUALS("--mod-axis", option) + ) + { + *result = 7; + } + else if + ( + RELABSD_STRING_EQUALS("-f", option) + || RELABSD_STRING_EQUALS("--config", option) + ) + { + *result = 1; + } + else + { + return -1; + } + + return 0; +} + +void relabsd_parameters_print_usage (const char exec [const restrict static 1]) +{ + printf + ( + "USAGE: %s <MODE> [<OPTION>+]\n\n" + + "<MODE>:\n" + "\t[-? | --compatible] <physical_device_file>:\n" + "\t\tDevice compatibility test.\n\n" + + "\t[-c | --client] <server_file>:\n" + "\t\tSends the commands to a given server instance.\n\n" + + "\t[-s | --server] <server_file> <physical_device_file>:\n" + "\t\tCreates a named server instance.\n\n" + + "\t[-1 | --self] <physical_device_file>:\n" + "\t\tCreates a unnamed server instance.\n\n" + + "<OPTION>:\n" + "\t[-d | --daemon]:\n" + "\t\tRuns server instance in the background.\n\n" + + "\t[-n | --name] <relabsd_device_name>:\n" + "\t\tNames the virtual device.\n\n" + + "\t[-t | --timeout] <timeout_in_ms>:\n" + "\t\tSets a zeroing timeout (0 to disable).\n\n" + + "\t[-a | --axis] <name> <min> <max> <fuzz> <flat> <resolution> " + "<options>:\n" + "\t\t(Re)defines an axis.\n\n" + + "\t[-m | --mod-axis] <name> <min> <max> <fuzz> <flat> <resolution> " + "<signed_options>:\n" + "\t\tModifies an axis (use + and - signs for the options).\n\n" + + "\t[-f | --config] <config_file>" + "<options>:\n" + "\t\t(Re)defines an axis.\n", + exec + ); +} diff --git a/src/config/parameters/parameters_accessors.c b/src/config/parameters/parameters_accessors.c new file mode 100644 index 0000000..e53cfe0 --- /dev/null +++ b/src/config/parameters/parameters_accessors.c @@ -0,0 +1,60 @@ +#include <relabsd/config/parameters.h> + +/******************************************************************************/ +/**** LOCAL FUNCTIONS *********************************************************/ +/******************************************************************************/ + +/******************************************************************************/ +/**** EXPORTED FUNCTIONS ******************************************************/ +/******************************************************************************/ +void relabsd_parameters_initialize_options +( + const struct relabsd_parameters parameters [const restrict static 1] +) +{ + parameters->run_as_daemon = 0; + parameters->communication_node_name = (const char *) NULL; + parameters->device_name = (const char *) NULL; + parameters->physical_device_file_name = (const char *) NULL; + parameters->configuration_file = (const char *) NULL; +} + +int relabsd_parameters_get_run_as_daemon +( + const struct relabsd_parameters parameters [const restrict static 1] +) +{ + return parameters->run_as_daemon; +} + +const char * relabsd_parameters_get_communication_node_name +( + const struct relabsd_parameters parameters [const restrict static 1] +) +{ + return parameters->communication_node_name; +} + +const char * relabsd_parameters_get_device_name +( + const struct relabsd_parameters parameters [const restrict static 1] +) +{ + return parameters->device_name; +} + +const char * relabsd_parameters_get_physical_device_file_name +( + const struct relabsd_parameters parameters [const restrict static 1] +) +{ + return parameters->physical_device_file_name; +} + +enum relabsd_parameters_run_mode relabsd_parameters_get_execution_mode +( + const struct relabsd_parameters parameters [const restrict static 1] +) +{ + return parameters->mode; +} 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); + } +} diff --git a/src/server/server.c b/src/server/server.c index ddd9bdf..d6678d2 100644 --- a/src/server/server.c +++ b/src/server/server.c @@ -8,19 +8,19 @@ /******************************************************************************/ /**** LOCAL FUNCTIONS *********************************************************/ /******************************************************************************/ -int initialize +static int initialize ( struct relabsd_server server [const restrict static 1], - struct relabsd_parameters params [const static 1] + struct relabsd_parameters parameters [const static 1] ) { - server->parameters = params; + server->parameters = parameters; if ( relabsd_physical_device_open ( - relabsd_parameters_get_physical_device_name(params), + relabsd_parameters_get_physical_device_name(parameters), &(server->physical_device) ) < 0 @@ -29,15 +29,7 @@ int initialize return -1; } - if - ( - relabsd_virtual_device_create - ( - relabsd_parameters_get_virtual_device_name(params), - &(server->virtual_device) - ) - < 0 - ) + if (relabsd_virtual_device_create(parameters, &(server->virtual_device)) < 0) { relabsd_physical_device_close(&(server->physical_device)); @@ -46,8 +38,11 @@ int initialize if ( - (relabsd_parameters_get_communication_node(params) != ((...) NULL)) - && (relabsd_server_spawn_communication_node(server) < 0) + ( + relabsd_parameters_get_communication_node_name(parameters) + != ((char *) NULL) + ) + && (relabsd_server_create_communication_thread(&server) < 0) ) { relabsd_virtual_device_destroy(&(server->virtual_device)); @@ -56,19 +51,14 @@ int initialize return -3; } - if (relabsd_parameters_get_communication_node(params) != ((char *) NULL)) - { - relabsd_server_create_communication_thread(&server); - } - return 0; } -void finalize (struct relabsd_server server [const static 1]) +static void finalize (struct relabsd_server server [const static 1]) { if ( - relabsd_parameters_get_communication_node(server->parameters) + relabsd_parameters_get_communication_node_name(server->parameters) != ((char *) NULL) ) { @@ -77,8 +67,6 @@ void finalize (struct relabsd_server server [const static 1]) relabsd_virtual_device_destroy(&(server->virtual_device)); relabsd_physical_device_close(&(server->physical_device)); - - return 0; } /******************************************************************************/ @@ -88,34 +76,33 @@ int relabsd_server ( const int argc, const char * const argv [const restrict static argc], - struct relabsd_parameters params [const static 1] + struct relabsd_parameters parameters [const static 1] ) { struct relabsd_server server; RELABSD_S_DEBUG(RELABSD_DEBUG_PROGRAM_FLOW, "Started server mode."); - if (relabsd_parameters_parse_options(argc, argv, params) < 0) + if (relabsd_parameters_parse_options(argc, argv, parameters) < 0) { return -1; } if ( - (relabsd_parameters_run_as_daemon(params)) + relabsd_parameters_get_run_as_daemon(parameters) && (relabsd_server_create_daemon() < 0) ) { return -2; } - (void) initialize(&server, params); + (void) initialize(&server, parameters); (void) relabsd_server_conversion_loop(&server); finalize(&server); - RELABSD_S_DEBUG(RELABSD_DEBUG_PROGRAM_FLOW, "Completed server mode."); return 0; |


