diff --git a/include/sta/rtos/timer.hpp b/include/sta/rtos/timer.hpp index 6447772..70ba816 100644 --- a/include/sta/rtos/timer.hpp +++ b/include/sta/rtos/timer.hpp @@ -10,6 +10,7 @@ #include #include +#include "cmsis_os2.h" namespace sta @@ -25,12 +26,13 @@ namespace sta { public: /** - * @brief + * @brief Creates a new timer with a given callback function. * * @param callback The callback function to call upon timer timeout. * @param arg The argument to pass to the callback function. + * @param repeating True if the timer should repeat. False if it should only run once. */ - RtosTimer(std::function, void *arg); + RtosTimer(std::function, void *arg, bool repeating = false); /** * @brief Initializes the timer with a callback that has no effect. diff --git a/src/timer.cpp b/src/timer.cpp index 7a7d6d3..33ff80b 100644 --- a/src/timer.cpp +++ b/src/timer.cpp @@ -2,17 +2,20 @@ #include #include +#include "cmsis_os2.h" namespace sta { - RtosTimer::RtosTimer(std::function callback, void *arg) + RtosTimer::RtosTimer(std::function callback, void *arg, bool repeating /*= false */) : timer_id_{NULL}, - timer_attr_{.name="Timer", .attr_bits=osTimerOnce}, + timer_attr_{.name="Timer", .attr_bits=repeating ? osTimerPeriodic : osTimerOnce}, callback_{callback}, callbackArg_{arg}, running_{false} { - // Pass an anonymous function as the callback which will invoke the currently registered callback. - timer_id_ = osTimerNew(timeoutHandler, osTimerOnce, this, &timer_attr_); + osTimerType_t type = repeating ? osTimerPeriodic : osTimerOnce; + + // Pass an anonymous function as the callback which will invoke the currently registered callback. + timer_id_ = osTimerNew(timeoutHandler, type, this, &timer_attr_); STA_ASSERT_MSG(timer_id_ != NULL, "Failed to create timer!"); } @@ -68,7 +71,7 @@ namespace sta { void RtosTimer::timeoutHandler(void* arg) { RtosTimer* timer = static_cast(arg); - timer->running_ = false; + timer->running_ = timer->isRunning(); timer->callback_(timer->callbackArg_); }