PUD: introduce dopMultiplier plugin parameter
authorFerry Huberts <ferry.huberts@pelagic.nl>
Thu, 23 Jun 2011 10:11:29 +0000 (12:11 +0200)
committerFerry Huberts <ferry.huberts@pelagic.nl>
Thu, 23 Jun 2011 10:11:29 +0000 (12:11 +0200)
Signed-off-by: Ferry Huberts <ferry.huberts@pelagic.nl>
lib/pud/doc/olsrd.conf.default.pud
lib/pud/src/configuration.c
lib/pud/src/configuration.h
lib/pud/src/pudOlsrdPlugin.h

index b204fe8..54cd712 100644 (file)
@@ -600,6 +600,19 @@ LoadPlugin "./lib/pud/olsrd_pud.so.1.0.0"
     #
     #PlParam     "movingDistanceThreshold"      "50"
 
+    # dopMultiplier One of the situations that is seen as movement is when the
+    #               current position with its uncertainty circle no longer
+    #               overlaps the last transmitted position with its uncertainty
+    #               circle. This parameter is used to adjust the sizes of these
+    #               uncertainty circles: setting it to a value less than 1.0
+    #               will make both uncertainty circles smaller by this factor,
+    #               resulting in earlier movement detection. Setting it to a
+    #               value larger than 1.0 will detect movement later.
+    #
+    # Default: 1.0
+    #
+    #PlParam     "dopMultiplier"                "1.0"
+
     # defaultHdop is the default value that is taken for HDOP (in meters) in
     #             determining whether we are moving when there is a position
     #             available but no HDOP.
index b878785..66043c8 100644 (file)
@@ -62,6 +62,40 @@ bool readULL(const char * valueName, const char * value,
        return true;
 }
 
+/**
+ Read a double number from a value string
+
+ @param valueName
+ the name of the value
+ @param value
+ the string to convert to a number
+ @param valueNumber
+ a pointer to the location where to store the number upon successful conversion
+
+ @return
+ - true on success
+ - false otherwise
+ */
+bool readDouble(const char * valueName, const char * value,
+               double * valueNumber) {
+       char * endPtr = NULL;
+       double valueNew;
+
+       errno = 0;
+       valueNew = strtod(value, &endPtr);
+
+       if (!((endPtr != value) && (*value != '\0') && (*endPtr == '\0'))) {
+               /* invalid conversion */
+               pudError(true, "Configured %s (%s) could not be converted to a number",
+                               valueName, value);
+               return false;
+       }
+
+       *valueNumber = valueNew;
+
+       return true;
+}
+
 /*
  * nodeIdType
  */
@@ -1136,6 +1170,51 @@ int setMovingDistanceThreshold(const char *value, void *data __attribute__ ((unu
        return false;
 }
 
+/*
+ * dopMultiplier
+ */
+
+/* The DOP multiplier plugin parameter */
+double dopMultiplier = PUD_DOP_MULTIPLIER_DEFAULT;
+
+/**
+ @return
+ The DOP multiplier plugin parameter
+ */
+double getDopMultiplier(void) {
+       return dopMultiplier;
+}
+
+/**
+ Set DOP multiplier plugin parameter
+
+ @param value
+ The DOP multiplier plugin parameter
+ @param data
+ Unused
+ @param addon
+ Unused
+
+ @return
+ - true when an error is detected
+ - false otherwise
+ */
+int setDopMultiplier(const char *value, void *data __attribute__ ((unused)),
+               set_plugin_parameter_addon addon __attribute__ ((unused))) {
+       static const char * valueName = PUD_DOP_MULTIPLIER_NAME;
+       double dopMultiplierNew;
+
+       assert (value != NULL);
+
+       if (!readDouble(valueName, value, &dopMultiplierNew)) {
+               return true;
+       }
+
+       dopMultiplier = dopMultiplierNew;
+
+       return false;
+}
+
 /*
  * defaultHdop
  */
index 8721bb6..6512103 100644 (file)
@@ -18,6 +18,9 @@
 bool readULL(const char * valueName, const char * value,
                unsigned long long * valueNumber);
 
+bool readDouble(const char * valueName, const char * value,
+               double * valueNumber);
+
 /*
  * Global Parameters
  */
@@ -223,6 +226,16 @@ unsigned long long getMovingDistanceThreshold(void);
 int setMovingDistanceThreshold(const char *value, void *data,
                set_plugin_parameter_addon addon);
 
+/** The name of the DOP multiplier plugin parameter */
+#define PUD_DOP_MULTIPLIER_NAME                "dopMultiplier"
+
+/** The default value of the DOP multiplier plugin parameter */
+#define PUD_DOP_MULTIPLIER_DEFAULT     1.0
+
+double getDopMultiplier(void);
+int setDopMultiplier(const char *value, void *data,
+               set_plugin_parameter_addon addon);
+
 /** The name of the default HDOP plugin parameter */
 #define PUD_DEFAULT_HDOP_NAME          "defaultHdop"
 
index e5ccfb6..901616c 100644 (file)
@@ -32,6 +32,7 @@ static const struct olsrd_plugin_parameters plugin_parameters[] = {
        {       .name = PUD_UPDATE_INTERVAL_MOVING_NAME, .set_plugin_parameter = &setUpdateIntervalMoving, .data = NULL},
        {       .name = PUD_MOVING_SPEED_THRESHOLD_NAME, .set_plugin_parameter = &setMovingSpeedThreshold, .data = NULL},
        {       .name = PUD_MOVING_DISTANCE_THRESHOLD_NAME, .set_plugin_parameter = &setMovingDistanceThreshold, .data = NULL},
+       {       .name = PUD_DOP_MULTIPLIER_NAME, .set_plugin_parameter = &setDopMultiplier, .data = NULL},
        {       .name = PUD_DEFAULT_HDOP_NAME, .set_plugin_parameter = &setDefaultHdop, .data = NULL},
        {       .name = PUD_DEFAULT_VDOP_NAME, .set_plugin_parameter = &setDefaultVdop, .data = NULL},
        {       .name = PUD_AVERAGE_DEPTH_NAME, .set_plugin_parameter = &setAverageDepth, .data = NULL},