Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: EEPROMWrite Full-Project
Fork of mbed-src by
Diff: api/Ticker.h
- 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
