Longer delays for Ticker and some internal updates by mcspr · Pull Request #8625 · esp8266/Arduino (original) (raw)
Adds max duration check. In case it is over SDK limit, enable 'repeat'ing timer with a duration proportional to the original one and count until it executes N times, only then run the callback. Code with durations less than that executes as usual. Original proposal was to not create anything or create some kind of error state... which seems counter-productive to not help out with this pretty solvable use-case.
Additional updates, while refactoring the class
- Stronger types for internal time management using
std::chrono::duration
. Works the same,std::chrono::duration
handles seconds <-> milliseconds conversion, and we don't have to remember the time type in each method. (...and even allowonce()
andattach
as overloads instead of the current_ms
-suffix, in a future update) ::detach()
when timer finishes. Fixes (unintentional?) side-effect that we remain::active()
. Plus, this destroys any lambda-bound variables that will persist with the Ticker object. And, since we can't re-arm with the existing function (Ticker::attach_ms(uint32_t just_the_time)
and etc.)std::variant
aka union for internal callback storage (kind-of similar to esp8266#6918). Instead of having two separate code paths, always attach our static function and dispatch using type info. Also helps with the issue described above, since it will callstd::function
dtor when ptr + arg is attached instead of doing nothing.- smarter copy and move, detaching existing timer on assignment and detaching the moved-in timer object in both ctor and assignment. Copying or moving a running timer no longer blindly copies
_timer
pointer, allowing to disarm the original one. Since we are a simple wrapper aroundos_timer_t
, just do the simpler thing (and not re-schedule the callback, try to store original times, etc. polledTimeout already does it and is copyable)