Skip to content
New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

Ticker with Delegate #6918

Open
wants to merge 55 commits into
base: master
Choose a base branch
from
Open

Conversation

dok-net
Copy link
Contributor

@dok-net dok-net commented Dec 17, 2019

Here's the Ticker (library) ported to Delegate, to complement the IRQ handling, Schedule etc.

@dok-net dok-net force-pushed the ticker_w_delegate branch 5 times, most recently from dab3bf2 to 55a2c31 Compare December 25, 2019 10:42
@dok-net dok-net force-pushed the ticker_w_delegate branch 3 times, most recently from 4c9fddd to db2b2b7 Compare January 22, 2020 08:26
@dok-net dok-net force-pushed the ticker_w_delegate branch 2 times, most recently from c92d17f to 1480a34 Compare February 5, 2020 07:15
@dok-net dok-net force-pushed the ticker_w_delegate branch 2 times, most recently from 88dcb47 to 0323c75 Compare February 13, 2020 21:39
@dok-net dok-net force-pushed the ticker_w_delegate branch 7 times, most recently from dace28a to eabe668 Compare March 1, 2020 16:56
@dok-net dok-net force-pushed the ticker_w_delegate branch 3 times, most recently from 692c039 to 03754d2 Compare March 27, 2020 13:41
@dok-net dok-net force-pushed the ticker_w_delegate branch 4 times, most recently from 09bdaa3 to b9487d7 Compare April 10, 2020 08:36
…ATTR attribute.

This affects the unnamed namespace or static non-member functions.
…uto-remove. Invoke returns result of last Delegate call.

Caveat: breaks use of event multiplexer with auto-remove; WIP: add iterators.
…ent operators, needing a lot

of code duplication, this commit provides that.
…S context, they are

scheduled, not called in ISR.
mcspr added a commit that referenced this pull request Nov 1, 2022
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 allow `once()` and `attach` 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 #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 call `std::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 around `os_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)
# for free to join this conversation on GitHub. Already have an account? # to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant