Timeout driver for event at absolute time
Dependents: demo_TimeoutAbs i2c_lora_slave
Timeout driver for generating event at absolute time, i.e. alarm at 12:00PM instead of alarm in 5 minutes.
This is the same concept as TIMER_ABSTIME in clock_nanosleep().
The purpose is to remove dependency on when attach()
is called, so the event occurs at correct time regardless of any latency in calling attach()
.
This driver doesnt add any functionality over mbed-os library; it only skips the call to ticker_read_us()
in Ticker::setup()
, which just changes a relative time to absolute time.
example use here.
Diff: TimeoutAbs.h
- Revision:
- 0:900163d530ae
- Child:
- 1:ae6b29794806
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/TimeoutAbs.h Mon Nov 26 14:22:55 2018 -0800 @@ -0,0 +1,57 @@ +#include "drivers/TimerEvent.h" +#include "platform/Callback.h" +#include "platform/mbed_toolchain.h" +#include "platform/NonCopyable.h" +#include "platform/mbed_power_mgmt.h" +#include "hal/lp_ticker_api.h" +#include "platform/mbed_critical.h" + +namespace mbed { + +class TimeoutAbs : public TimerEvent, private NonCopyable<TimeoutAbs> { + public: + TimeoutAbs() : TimerEvent(), _function(0), _lock_deepsleep(true) + { + } + + TimeoutAbs(const ticker_data_t* data) : TimerEvent(data), _function(0), _lock_deepsleep(true) + { +#if DEVICE_LPTICKER + _lock_deepsleep = (data != get_lp_ticker_data()); +#endif + } + + virtual ~TimeoutAbs() + { + detach(); + } + + /** Detach the function + */ + void detach(); + + void attach_us(Callback<void()> func, us_timestamp_t t) + { + core_util_critical_section_enter(); + // lock only for the initial callback setup and this is not low power ticker + if (!_function && _lock_deepsleep) { + sleep_manager_lock_deep_sleep(); + } + _function = func; + abs_setup(t); + core_util_critical_section_exit(); + } + + us_timestamp_t read_us(void) + { + return ticker_read_us(_ticker_data); + } + + protected: + void abs_setup(us_timestamp_t); + virtual void handler(); + Callback<void()> _function; /**< Callback. */ + bool _lock_deepsleep; /**< Flag which indicates if deep sleep should be disabled. */ +}; + +} // namespace mbed