PUD: add uplink timer
authorFerry Huberts <f.huberts@mindef.nl>
Thu, 14 Jul 2011 13:07:19 +0000 (15:07 +0200)
committerFerry Huberts <f.huberts@mindef.nl>
Tue, 18 Oct 2011 10:08:26 +0000 (12:08 +0200)
Signed-off-by: Ferry Huberts <f.huberts@mindef.nl>
lib/pud/src/receiver.c
lib/pud/src/timers.c
lib/pud/src/timers.h

index bfc1381..fb8521e 100644 (file)
@@ -782,6 +782,11 @@ bool startReceiver(void) {
                return false;
        }
 
+       if (!initUplinkTxTimer()) {
+               stopReceiver();
+               return false;
+       }
+
        return true;
 }
 
@@ -789,6 +794,7 @@ bool startReceiver(void) {
  Stop the receiver
  */
 void stopReceiver(void) {
+       destroyUplinkTxTimer();
        destroyOlsrTxTimer();
 
        destroyPositionAverageList(&positionAverageList);
index e30949c..4fad585 100644 (file)
@@ -5,6 +5,7 @@
 
 /* OLSRD includes */
 #include "olsr_cookie.h"
+#include "scheduler.h"
 
 /* System includes */
 #include <stddef.h>
@@ -100,3 +101,94 @@ void destroyOlsrTxTimer(void) {
                pud_olsr_tx_timer_cookie = NULL;
        }
 }
+
+/*
+ * Uplink Tx Timer
+ */
+
+/** The timer cookie, used to trace back the originator in debug */
+static struct olsr_cookie_info *pud_uplink_tx_timer_cookie = NULL;
+
+/** The timer */
+static struct timer_entry * pud_uplink_tx_timer = NULL;
+
+/**
+ Start the uplink tx timer. Does nothing when the timer is already running.
+
+ @param interval
+ The interval in seconds
+ @param cb_func
+ The callback function to call when the timer expires
+
+ @return
+ - false on failure
+ - true otherwise
+ */
+static int startUplinkTxTimer(unsigned long long interval, timer_cb_func cb_func) {
+       if (pud_uplink_tx_timer == NULL) {
+               pud_uplink_tx_timer = olsr_start_timer(interval * MSEC_PER_SEC, 0,
+                               OLSR_TIMER_PERIODIC, cb_func, NULL,
+                               pud_uplink_tx_timer_cookie);
+               if (pud_uplink_tx_timer == NULL) {
+                       return false;
+               }
+       }
+
+       return true;
+}
+
+/**
+ Stop the uplink tx timer
+ */
+static void stopUplinkTxTimer(void) {
+       if (pud_uplink_tx_timer != NULL) {
+               olsr_stop_timer(pud_uplink_tx_timer);
+               pud_uplink_tx_timer = NULL;
+       }
+}
+
+/**
+ Restart the uplink tx timer
+
+ @param interval
+ The interval in seconds
+ @param cb_func
+ The callback function to call when the timer expires
+
+ @return
+ - false on failure
+ - true otherwise
+ */
+int restartUplinkTxTimer(unsigned long long interval, timer_cb_func cb_func) {
+       stopUplinkTxTimer();
+       return startUplinkTxTimer(interval, cb_func);
+}
+
+/**
+ Initialise the uplink tx timer.
+
+ @return
+ - false on failure
+ - true otherwise
+ */
+int initUplinkTxTimer(void) {
+       if (pud_uplink_tx_timer_cookie == NULL) {
+               pud_uplink_tx_timer_cookie = olsr_alloc_cookie(
+                               PUD_PLUGIN_ABBR ": uplink tx timer", OLSR_COOKIE_TYPE_TIMER);
+               if (pud_uplink_tx_timer_cookie == NULL) {
+                       return false;
+               }
+       }
+       return true;
+}
+
+/**
+ Destroy the uplink tx timer.
+ */
+void destroyUplinkTxTimer(void) {
+       stopUplinkTxTimer();
+       if (pud_uplink_tx_timer_cookie != NULL) {
+               olsr_free_cookie(pud_uplink_tx_timer_cookie);
+               pud_uplink_tx_timer_cookie = NULL;
+       }
+}
index 6fd6cf2..cb14ce9 100644 (file)
@@ -12,4 +12,8 @@ int initOlsrTxTimer(void);
 void destroyOlsrTxTimer(void);
 int restartOlsrTxTimer(unsigned long long interval, timer_cb_func cb_func);
 
+int initUplinkTxTimer(void);
+void destroyUplinkTxTimer(void);
+int restartUplinkTxTimer(unsigned long long interval, timer_cb_func cb_func);
+
 #endif /* _PUD_TIMERS_H_ */