mbed library sources

Dependents:   PA_Boost_test

Fork of mbed-src by mbed official

Revision:
15:4892fe388435
Parent:
13:0645d8841f51
Child:
19:398f4c622e1b
--- a/api/Ticker.h	Mon Aug 05 14:54:27 2013 +0000
+++ b/api/Ticker.h	Wed Aug 07 16:43:59 2013 +0300
@@ -18,6 +18,7 @@
 
 #include "TimerEvent.h"
 #include "FunctionPointer.h"
+#include "CallChain.h"
 
 namespace mbed {
 
@@ -62,9 +63,34 @@
      *
      *  @param fptr pointer to the function to be called
      *  @param t the time between calls in seconds
+     *
+     *  @returns
+     *  The function object created for 'fptr'
      */
-    void attach(void (*fptr)(void), float t) {
-        attach_us(fptr, t * 1000000.0f);
+    pFunctionPointer_t attach(void (*fptr)(void), float t) {
+        return attach_us(fptr, t * 1000000.0f);
+    }
+
+    /** Add a function to be called by the Ticker at the end of the call chain
+     *
+     *  @param fptr the function to add
+     *
+     *  @returns
+     *  The function object created for 'fptr'
+     */
+    pFunctionPointer_t add_function(void (*fptr)(void)) {
+        return add_function_helper(fptr);
+    }
+
+    /** Add a function to be called by the Ticker at the beginning of the call chain
+     *
+     *  @param fptr the function to add
+     *
+     *  @returns
+     *  The function object created for 'fptr'
+     */
+    pFunctionPointer_t add_function_front(void (*fptr)(void)) {
+        return add_function_helper(fptr, true);
     }
 
     /** Attach a member function to be called by the Ticker, specifiying the interval in seconds
@@ -72,20 +98,53 @@
      *  @param tptr pointer to the object to call the member function on
      *  @param mptr pointer to the member function to be called
      *  @param t the time between calls in seconds
+     *
+     *  @returns
+     *  The function object created for 'tptr' and 'mptr'
      */
     template<typename T>
-    void attach(T* tptr, void (T::*mptr)(void), float t) {
-        attach_us(tptr, mptr, t * 1000000.0f);
+    pFunctionPointer_t attach(T* tptr, void (T::*mptr)(void), float t) {
+        return attach_us(tptr, mptr, t * 1000000.0f);         
+    }
+
+    /** Add a function to be called by the Ticker at the end of the call chain
+     *
+     *  @param tptr pointer to the object to call the member function on
+     *  @param mptr pointer to the member function to be called
+     *
+     *  @returns
+     *  The function object created for 'tptr' and 'mptr'
+     */
+    template<typename T>
+    pFunctionPointer_t add_function(T* tptr, void (T::*mptr)(void)) {
+        return add_function_helper(tptr, mptr);
+    }
+
+    /** Add a function to be called by the Ticker at the beginning of the call chain
+     *
+     *  @param tptr pointer to the object to call the member function on
+     *  @param mptr pointer to the member function to be called
+     *
+     *  @returns
+     *  The function object created for 'tptr' and 'mptr'
+     */
+    template<typename T>
+    pFunctionPointer_t add_function_front(T* tptr, void (T::*mptr)(void)) {
+        return add_function_helper(tptr, mptr, true);
     }
 
     /** Attach a function to be called by the Ticker, specifiying the interval in micro-seconds
      *
      *  @param fptr pointer to the function to be called
      *  @param t the time between calls in micro-seconds
+     *
+     *  @returns
+     *  The function object created for 'fptr'
      */
-    void attach_us(void (*fptr)(void), unsigned int t) {
-        _function.attach(fptr);
+    pFunctionPointer_t attach_us(void (*fptr)(void), unsigned int t) {
+        pFunctionPointer_t pf = _chain.add(fptr);
         setup(t);
+        return pf;
     }
 
     /** Attach a member function to be called by the Ticker, specifiying the interval in micro-seconds
@@ -93,23 +152,49 @@
      *  @param tptr pointer to the object to call the member function on
      *  @param mptr pointer to the member function to be called
      *  @param t the time between calls in micro-seconds
+     *
+     *  @returns
+     *  The function object created for 'tptr' and 'mptr'
      */
     template<typename T>
-    void attach_us(T* tptr, void (T::*mptr)(void), unsigned int t) {
-        _function.attach(tptr, mptr);
+    pFunctionPointer_t attach_us(T* tptr, void (T::*mptr)(void), unsigned int t) {
+        pFunctionPointer_t pf = _chain.add(mptr, tptr);
         setup(t);
+        return pf;
     }
 
     /** Detach the function
      */
     void detach();
 
+    /** Remove a function from the Ticker's call chain
+     *
+     *  @param pf the function object to remove
+     *
+     *  @returns
+     *  true if the function was found and removed, false otherwise
+     */
+    bool remove_function(pFunctionPointer_t pf) {
+        bool res = _chain.remove(pf);
+        if (res && _chain.size() == 0)
+            detach();
+        return res;
+    }
+
 protected:
     void setup(unsigned int t);
+    pFunctionPointer_t add_function_helper(void (*fptr)(void), bool front=false);
     virtual void handler();
 
+    template<typename T>
+    pFunctionPointer_t add_function_helper(T* tptr, void (T::*mptr)(void), bool front=false) {
+        if (_chain.size() == 0)
+            return NULL;
+        return front ? _chain.add_front(tptr, mptr) : _chain.add(tptr, mptr);
+    }
+
     unsigned int _delay;
-    FunctionPointer _function;
+    CallChain _chain;
 };
 
 } // namespace mbed