pud: timers: add gpsd fetch timer functions
authorFerry Huberts <ferry.huberts@pelagic.nl>
Fri, 29 Jul 2016 07:53:09 +0000 (09:53 +0200)
committerFerry Huberts <ferry.huberts@pelagic.nl>
Fri, 29 Jul 2016 11:40:01 +0000 (13:40 +0200)
The gps deamon needs to be read much faster than the update
time of 1 second in order to get a consistent set of gpsd data.

Signed-off-by: Ferry Huberts <ferry.huberts@pelagic.nl>
lib/pud/src/timers.c
lib/pud/src/timers.h

index b8d9d1a..d4683e2 100644 (file)
 
 /* System includes */
 
+/*
+ * gpsd Fetch Timer
+ */
+
+/** The timer cookie, used to trace back the originator in debug */
+static struct olsr_cookie_info *pud_gpsd_fetch_timer_cookie = NULL;
+
+/** The timer */
+static struct timer_entry * pud_gpsd_fetch_timer = NULL;
+
+/**
+ Start the gpsd fetch timer. Does nothing when the timer is already running.
+
+ @param cb_func
+ The callback function to call when the timer expires
+
+ @return
+ - false on failure
+ - true otherwise
+ */
+static int startGpsdFetchTimer(timer_cb_func cb_func) {
+  if (!pud_gpsd_fetch_timer) {
+    pud_gpsd_fetch_timer = olsr_start_timer(1 * (MSEC_PER_SEC / TIMER_GPSD_READS_PER_SEC), 0, OLSR_TIMER_PERIODIC, cb_func, NULL, pud_gpsd_fetch_timer_cookie);
+    if (!pud_gpsd_fetch_timer) {
+      return false;
+    }
+  }
+
+  return true;
+}
+
+/**
+ Stop the gpsd fetch timer
+ */
+static void stopGpsdFetchTimer(void) {
+  if (pud_gpsd_fetch_timer) {
+    olsr_stop_timer(pud_gpsd_fetch_timer);
+    pud_gpsd_fetch_timer = NULL;
+  }
+}
+
+/**
+ Restart the gpsd fetch timer
+
+ @param cb_func
+ The callback function to call when the timer expires
+
+ @return
+ - false on failure
+ - true otherwise
+ */
+int restartGpsdFetchTimer(timer_cb_func cb_func) {
+  stopGpsdFetchTimer();
+  return startGpsdFetchTimer(cb_func);
+}
+
+/**
+ Initialise the gpsd fetch timer.
+
+ @return
+ - false on failure
+ - true otherwise
+ */
+int initGpsdFetchTimer(void) {
+  if (!pud_gpsd_fetch_timer_cookie) {
+    pud_gpsd_fetch_timer_cookie = olsr_alloc_cookie(PUD_PLUGIN_ABBR ": gpsd fetch timer", OLSR_COOKIE_TYPE_TIMER);
+    if (!pud_gpsd_fetch_timer_cookie) {
+      return false;
+    }
+  }
+
+  return true;
+}
+
+/**
+ Destroy the gpsd fetch timer.
+ */
+void destroyGpsdFetchTimer(void) {
+  stopGpsdFetchTimer();
+  if (pud_gpsd_fetch_timer_cookie) {
+    olsr_free_cookie(pud_gpsd_fetch_timer_cookie);
+    pud_gpsd_fetch_timer_cookie = NULL;
+  }
+}
+
 /*
  * OLSR Tx Timer
  */
index e7369fb..fb84a3f 100644 (file)
 /* OLSRD includes */
 #include "scheduler.h"
 
+/* the number of times per second the gpsd daemon is read */
+#define TIMER_GPSD_READS_PER_SEC 4
+
 /* System includes */
 
+int initGpsdFetchTimer(void);
+void destroyGpsdFetchTimer(void);
+int restartGpsdFetchTimer(timer_cb_func cb_func);
+
 int initOlsrTxTimer(void);
 void destroyOlsrTxTimer(void);
 int restartOlsrTxTimer(unsigned long long interval, timer_cb_func cb_func);