diff --git a/libraries/Ticker/Ticker.cpp b/libraries/Ticker/Ticker.cpp index dee3a6363d..d913a872bb 100644 --- a/libraries/Ticker/Ticker.cpp +++ b/libraries/Ticker/Ticker.cpp @@ -21,19 +21,22 @@ #include #include +#include "Arduino.h" +extern "C" { #include "c_types.h" #include "eagle_soc.h" #include "ets_sys.h" #include "osapi.h" +} -static const int ONCE = 0; -static const int REPEAT = 1; +const int ONCE = 0; +const int REPEAT = 1; #include "Ticker.h" Ticker::Ticker() -: _timer(nullptr) +: _timer(0) { } @@ -64,10 +67,19 @@ void Ticker::detach() os_timer_disarm(_timer); delete _timer; - _timer = nullptr; + _timer = 0; + _callback_function = nullptr; } -bool Ticker::active() +void Ticker::_static_callback(void* arg) { - return (bool)_timer; + Ticker* _this = (Ticker*)arg; + if (_this == nullptr) + { + return; + } + if (_this->_callback_function) + { + _this->_callback_function(); + } } diff --git a/libraries/Ticker/Ticker.h b/libraries/Ticker/Ticker.h index 74725fb76d..d1c6002cef 100644 --- a/libraries/Ticker/Ticker.h +++ b/libraries/Ticker/Ticker.h @@ -23,8 +23,9 @@ #define TICKER_H #include -#include #include +#include +#include extern "C" { typedef struct _ETSTIMER_ ETSTimer; @@ -35,17 +36,31 @@ class Ticker public: Ticker(); ~Ticker(); + typedef void (*callback_t)(void); typedef void (*callback_with_arg_t)(void*); + typedef std::function callback_function_t; + + void attach_scheduled(float seconds, callback_function_t callback) + { + attach(seconds,std::bind(schedule_function, callback)); + } - void attach(float seconds, callback_t callback) + void attach(float seconds, callback_function_t callback) { - _attach_ms(seconds * 1000, true, reinterpret_cast(callback), 0); + _callback_function = callback; + attach(seconds, _static_callback, (void*)this); } - void attach_ms(uint32_t milliseconds, callback_t callback) + void attach_ms_scheduled(uint32_t milliseconds, callback_function_t callback) { - _attach_ms(milliseconds, true, reinterpret_cast(callback), 0); + attach_ms(milliseconds, std::bind(schedule_function, callback)); + } + + void attach_ms(uint32_t milliseconds, callback_function_t callback) + { + _callback_function = callback; + attach_ms(milliseconds, _static_callback, (void*)this); } template @@ -67,14 +82,26 @@ class Ticker _attach_ms(milliseconds, true, reinterpret_cast(callback), arg32); } - void once(float seconds, callback_t callback) + void once_scheduled(float seconds, callback_function_t callback) + { + once(seconds, std::bind(schedule_function, callback)); + } + + void once(float seconds, callback_function_t callback) + { + _callback_function = callback; + once(seconds, _static_callback, (void*)this); + } + + void once_ms_scheduled(uint32_t milliseconds, callback_function_t callback) { - _attach_ms(seconds * 1000, false, reinterpret_cast(callback), 0); + once_ms(milliseconds, std::bind(schedule_function, callback)); } - void once_ms(uint32_t milliseconds, callback_t callback) + void once_ms(uint32_t milliseconds, callback_function_t callback) { - _attach_ms(milliseconds, false, reinterpret_cast(callback), 0); + _callback_function = callback; + once_ms(milliseconds, _static_callback, (void*)this); } template @@ -94,15 +121,15 @@ class Ticker } void detach(); - bool active(); protected: void _attach_ms(uint32_t milliseconds, bool repeat, callback_with_arg_t callback, uint32_t arg); - + static void _static_callback (void* arg); protected: ETSTimer* _timer; -}; + callback_function_t _callback_function = nullptr; +}; #endif//TICKER_H