summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/config.c')
-rw-r--r--src/config.c256
1 files changed, 256 insertions, 0 deletions
diff --git a/src/config.c b/src/config.c
new file mode 100644
index 0000000..1699811
--- /dev/null
+++ b/src/config.c
@@ -0,0 +1,256 @@
+#include <errno.h>
+#include <string.h>
+
+#include "error.h"
+#include "pervasive.h"
+#include "axis.h"
+#include "config.h"
+
+static int reach_next_line_or_eof (FILE * const f)
+{
+ char c;
+ c = getc(f);
+
+ while ((c != '\n') && c != EOF)
+ {
+ c = getc(f);
+ }
+
+ if (c == EOF)
+ {
+ return -1;
+ }
+
+ return 0;
+}
+
+static int all_axis_are_configured (const int * const axis_is_configured)
+{
+ int i;
+
+ for (i = 0; i < 6; ++i)
+ {
+ if (axis_is_configured[i] == 0)
+ {
+ _FATAL
+ (
+ "[CONFIG] Axis '%s' is not configured.",
+ relabsd_axis_enum_to_name((enum relabsd_axis) i)
+ );
+
+ return -1;
+ }
+ }
+
+ return 0;
+}
+
+static int parse_axis_configuration_line
+(
+ struct relabsd_config * const conf,
+ FILE * const f,
+ int * const axis_is_configured,
+ char * const buffer
+)
+{
+ int valc;
+ enum relabsd_axis axis;
+
+ axis = relabsd_axis_name_to_enum(buffer);
+
+ if (axis == RELABSD_UNKNOWN)
+ {
+ _FATAL
+ (
+ "[CONFIG] Unknown axis '%s'.",
+ buffer
+ );
+
+ return -1;
+ }
+
+ valc =
+ fscanf
+ (
+ f,
+ "%d %d %d %d %d",
+ &(conf->axis[axis].min),
+ &(conf->axis[axis].max),
+ &(conf->axis[axis].fuzz),
+ &(conf->axis[axis].flat),
+ &(conf->axis[axis].resolution)
+ );
+
+ if (valc == EOF)
+ {
+ _FATAL
+ (
+ "[CONFIG] Unexpected end of file while reading axis '%s'.",
+ buffer
+ );
+
+ return -1;
+ }
+ else if (valc < 5)
+ {
+ _FATAL
+ (
+ "[CONFIG] Invalid parameter count for axis '%s'.",
+ buffer
+ );
+
+ return -1;
+ }
+
+ axis_is_configured[axis] = 1;
+ return 0;
+}
+
+static int read_config_file
+(
+ struct relabsd_config * const conf,
+ char * const filename
+)
+{
+ FILE * f;
+ int axis_is_configured[6];
+ char buffer[3];
+ int test;
+
+ buffer[2] = '\0';
+
+ memset(axis_is_configured, 0, 6 * sizeof(int));
+
+ f = fopen(filename, "r");
+
+ if (f == (FILE *) NULL)
+ {
+ _FATAL
+ (
+ "[CONFIG] Could not open file: %s.",
+ strerror(errno)
+ );
+
+ return -1;
+ }
+
+ errno = 0;
+
+ while ((test = fscanf(f, "%2s", buffer)) > 0)
+ {
+ if (_IS_PREFIX("#", buffer))
+ {
+ if (reach_next_line_or_eof(f) < 0)
+ {
+ break;
+ }
+ }
+ else
+ {
+ if
+ (
+ parse_axis_configuration_line
+ (
+ conf,
+ f,
+ axis_is_configured,
+ buffer
+ )
+ < 0
+ )
+ {
+ break;
+ }
+
+ if (reach_next_line_or_eof(f) < 0)
+ {
+ break;
+ }
+ }
+ }
+
+ if (test < 0 && errno != 0)
+ {
+ _FATAL
+ (
+ "[CONFIG] Error while reading file: %s, last read '%s'.",
+ strerror(errno),
+ buffer
+ );
+
+ fclose(f);
+
+ return -1;
+ }
+
+ fclose(f);
+
+ if (all_axis_are_configured(axis_is_configured) < 0)
+ {
+ return -1;
+ }
+
+ return 0;
+}
+
+int relabsd_config_parse
+(
+ struct relabsd_config * const conf,
+ int const argc,
+ char ** const argv
+)
+{
+ if ((argc < 3) || (argc > 4))
+ {
+ _FATAL
+ (
+ "Usage: %s input_device config_file [<relabsd_device_name>]",
+ argv[0]
+ );
+
+ return -1;
+ }
+
+ if (argc == 3)
+ {
+ conf->device_name = "relabsd device";
+ }
+ else
+ {
+ conf->device_name = argv[3];
+ }
+
+ conf->input_file = argv[1];
+
+ if (read_config_file(conf, argv[2]) < 0)
+ {
+ return -1;
+ }
+
+ return 0;
+}
+
+int relabsd_config_allows
+(
+ const struct relabsd_config * const conf,
+ enum relabsd_axis const axis,
+ int const value
+)
+{
+ return 1;
+};
+
+void relabsd_config_get_absinfo
+(
+ const struct relabsd_config * const conf,
+ enum relabsd_axis const axis,
+ struct input_absinfo * const absinfo
+)
+{
+ absinfo->value = (__s32) 0;
+ absinfo->minimum = (__s32) conf->axis[axis].min;
+ absinfo->maximum = (__s32) conf->axis[axis].max;
+ absinfo->fuzz = (__s32) conf->axis[axis].fuzz;
+ absinfo->flat = (__s32) conf->axis[axis].flat;
+ absinfo->resolution = (__s32) conf->axis[axis].resolution;
+}