pud: add gpsd related configuration parameters
authorFerry Huberts <ferry.huberts@pelagic.nl>
Thu, 28 Jul 2016 21:10:53 +0000 (23:10 +0200)
committerFerry Huberts <ferry.huberts@pelagic.nl>
Fri, 29 Jul 2016 11:40:01 +0000 (13:40 +0200)
Signed-off-by: Ferry Huberts <ferry.huberts@pelagic.nl>
lib/pud/README
lib/pud/src/configuration.c
lib/pud/src/configuration.h
lib/pud/src/pudOlsrdPlugin.h

index 70a8614..96ccde3 100644 (file)
@@ -56,6 +56,24 @@ LoadPlugin "<olsrd plugin library path>/olsrd_pud.so.2.2.0"
     # PlParam     "nodeId"                       "4"
 
 
+    #
+    # gpsd Parameters
+    #
+
+    # gpsdUse determines whether the gpsd daemon should be used for position
+    #         information
+    #
+    # Default: true
+    #
+    # PlParam     "gpsdUse"                      "true"
+
+    # gpsd is the gpsd source spec of the gpsd daemon to connect to
+    #
+    # Default: localhost:2947
+    #
+    # PlParam     "gpsd"                         "localhost:2947"
+
+
     #
     # RX Parameters
     #
index 68a8c09..8185805 100644 (file)
@@ -1655,6 +1655,121 @@ int setUseLoopback(const char *value, void *data __attribute__ ((unused)),
        return !readBool(PUD_USE_LOOPBACK_NAME, value, &useLoopback);
 }
 
+/*
+ * gpsdUse
+ */
+
+/** True when the gps daemon should be used */
+static bool gpsdUse = PUD_USE_GPSD_DEFAULT;
+
+bool getGpsdUse(void) {
+  return gpsdUse;
+}
+
+int setGpsdUse(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused))) {
+  return !readBool(PUD_GPSD_USE_NAME, value, &gpsdUse);
+}
+
+/*
+ * gpsd
+ */
+
+/** The gpsd plugin parameter */
+static char gpsd[PATH_MAX];
+
+/** The gpsd plugin parameter as gpsd source spec */
+static struct fixsource_t gpsdSource;
+
+/** True when the gpsd is set */
+static bool gpsdSet = false;
+
+/**
+ @return
+ The gpsd plugin parameter (NULL when not set)
+ */
+struct fixsource_t *getGpsd(void) {
+  if (!gpsdSet || !gpsdUse) {
+    return NULL ;
+  }
+
+  return &gpsdSource;
+}
+
+/* standard parsing of a GPS data source spec */
+static void gpsd_source_spec(const char *arg, struct fixsource_t *source) {
+  source->server = DEFAULT_GPSD_HOST;
+  source->port = DEFAULT_GPSD_PORT;
+  source->device = NULL;
+
+  if (arg != NULL && *arg) {
+    char *colon1;
+    const char *skipto;
+    char *rbrk;
+
+    strcpy(source->spec, arg);
+
+    skipto = source->spec;
+    if ((*skipto == '[') //
+        && ((rbrk = strchr(skipto, ']')) != NULL)) {
+      skipto = rbrk;
+    }
+    colon1 = strchr(skipto, ':');
+
+    if (colon1 != NULL) {
+      char *colon2;
+
+      *colon1 = '\0';
+      if (colon1 != source->spec) {
+        source->server = source->spec;
+      }
+
+      source->port = colon1 + 1;
+      colon2 = strchr(source->port, ':');
+      if (colon2 != NULL) {
+        *colon2 = '\0';
+        source->device = colon2 + 1;
+      }
+    } else if (strchr(source->spec, '/') != NULL) {
+      source->device = source->spec;
+    } else {
+      source->server = source->spec;
+    }
+  }
+
+  if (*source->server == '[') {
+    char *rbrk = strchr(source->server, ']');
+    ++source->server;
+    if (rbrk != NULL) {
+      *rbrk = '\0';
+    }
+  }
+}
+
+int setGpsd(const char *value, void *data __attribute__ ((unused)), set_plugin_parameter_addon addon __attribute__ ((unused))) {
+  static const char * valueName = PUD_GPSD_NAME;
+  size_t valueLength;
+
+  assert(value != NULL);
+
+  valueLength = strlen(value);
+
+  if (!valueLength) {
+    pudError(false, "No value specified for parameter %s", valueName);
+    return true;
+  }
+  if (valueLength > PATH_MAX) {
+    pudError(false, "Value of parameter %s is too long, maximum length is"
+        " %u, current length is %lu", valueName, PATH_MAX, (unsigned long) valueLength);
+    return true;
+  }
+
+  strcpy((char *) &gpsd[0], value);
+  gpsd_source_spec(gpsd, &gpsdSource);
+  gpsdSet = true;
+
+  return false;
+}
+
 /*
  * Check Functions
  */
@@ -1669,6 +1784,11 @@ int setUseLoopback(const char *value, void *data __attribute__ ((unused)),
 unsigned int checkConfig(void) {
        int retval = true;
 
+       if (!gpsdSet) {
+         set_plugin_parameter_addon addon;
+         setGpsd(PUD_GPSD_DEFAULT, NULL, addon);
+       }
+
        if (rxNonOlsrInterfaceCount == 0) {
                pudError(false, "No receive non-OLSR interfaces configured");
                retval = false;
index 421cd6f..a19306e 100644 (file)
@@ -441,6 +441,41 @@ bool getUseLoopback(void);
 int
 setUseLoopback(const char *value, void *data, set_plugin_parameter_addon addon);
 
+/*
+ * gpsd
+ */
+
+struct fixsource_t {
+  char spec[PATH_MAX]; /* working space, will be modified */
+  const char *server;
+  const char *port;
+  const char *device;
+};
+
+/** The name of the gpsd update interval plugin parameter */
+#define PUD_GPSD_USE_NAME  "gpsdUse"
+
+/** The default value of the gpsdUse plugin parameter */
+#define PUD_USE_GPSD_DEFAULT true
+
+bool getGpsdUse(void);
+int setGpsdUse(const char *value, void *data, set_plugin_parameter_addon addon);
+
+/** The name of the gpsd plugin parameter */
+#define PUD_GPSD_NAME  "gpsd"
+
+/** The default gpsd host */
+#define DEFAULT_GPSD_HOST "localhost"
+
+/** The default gpsd port */
+#define DEFAULT_GPSD_PORT "2947"
+
+/** The default value of the gpsd plugin parameter */
+#define PUD_GPSD_DEFAULT (DEFAULT_GPSD_HOST ":" DEFAULT_GPSD_PORT)
+
+struct fixsource_t *getGpsd(void);
+int setGpsd(const char *value, void *data, set_plugin_parameter_addon addon);
+
 /*
  * Check Functions
  */
index d7fd959..6bb35a3 100644 (file)
@@ -72,6 +72,10 @@ static const struct olsrd_plugin_parameters plugin_parameters[] = {
        {       .name = PUD_UPDATE_INTERVAL_STATIONARY_NAME, .set_plugin_parameter = &setUpdateIntervalStationary, .data = NULL},
        {       .name = PUD_UPDATE_INTERVAL_MOVING_NAME, .set_plugin_parameter = &setUpdateIntervalMoving, .data = NULL},
 
+       /* gpsd */
+       {       .name = PUD_GPSD_USE_NAME, .set_plugin_parameter = &setGpsdUse, .data = NULL},
+       {       .name = PUD_GPSD_NAME, .set_plugin_parameter = &setGpsd, .data = NULL},
+
        /* RX */
        {       .name = PUD_RX_NON_OLSR_IF_NAME, .set_plugin_parameter = &addRxNonOlsrInterface, .data = NULL},
        {       .name = PUD_RX_ALLOWED_SOURCE_IP_NAME, .set_plugin_parameter = &addRxAllowedSourceIpAddress, .data = NULL},