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
parentb9952b4938da95de07bff748cfd6d2c7e8471796 (diff)
Still working on it...
-rw-r--r--include/relabsd/client_types.h0
-rw-r--r--include/relabsd/config/config_file.h8
-rw-r--r--include/relabsd/config/parameters.h57
-rw-r--r--include/relabsd/config/parameters_types.h22
-rw-r--r--include/relabsd/device/axis.h26
-rw-r--r--include/relabsd/device/axis_types.h43
-rw-r--r--include/relabsd/device/physical_device.h9
-rw-r--r--include/relabsd/device/physical_device_types.h10
-rw-r--r--include/relabsd/device/virtual_device.h22
-rw-r--r--include/relabsd/device/virtual_device_types.h23
-rw-r--r--include/relabsd/server_types.h0
-rw-r--r--src/client.c25
-rw-r--r--src/config/config_file.c149
-rw-r--r--src/config/parameters/parameters.c (renamed from src/config/parameters.c)208
-rw-r--r--src/config/parameters/parameters_accessors.c60
-rw-r--r--src/device/axis/axis.c34
-rw-r--r--src/device/axis/axis_filter.c131
-rw-r--r--src/server/server.c45
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;