Added fixes to timer implementation

This commit is contained in:
dario 2023-09-27 00:06:08 +02:00
parent 0f02168b25
commit 2948c9203e
2 changed files with 41 additions and 8 deletions

View File

@ -57,12 +57,13 @@ namespace sta
*/ */
void stop() override; void stop() override;
/**
* @returns True of the timmer is currently running.
*/
bool isRunning();
private: private:
static void timeoutHandler(void* arg) static void timeoutHandler(void* arg);
{
RtosTimer* timer = static_cast<RtosTimer*>(arg);
timer->callback_(timer->callbackArg_);
}
private: private:
osTimerId_t timer_id_; /**< CMSIS RTOS2 Timer */ osTimerId_t timer_id_; /**< CMSIS RTOS2 Timer */
@ -70,6 +71,7 @@ namespace sta
std::function<void(void*)> callback_; /**< The callback to call on timeout. */ std::function<void(void*)> callback_; /**< The callback to call on timeout. */
void* callbackArg_; /**< The argument to pass to the callback. */ void* callbackArg_; /**< The argument to pass to the callback. */
bool running_; /**< The current state of the timer. Running or not? */
}; };
} // namespace sta } // namespace sta

View File

@ -5,7 +5,11 @@
namespace sta { namespace sta {
RtosTimer::RtosTimer(void (*callback)(void *arg), void *arg) RtosTimer::RtosTimer(void (*callback)(void *arg), void *arg)
: timer_id_{NULL}, timer_attr_{.name="Timer", .attr_bits=osTimerOnce, .cb_size=sizeof(osTimerAttr_t)}, callback_{callback}, callbackArg_{arg} : timer_id_{NULL},
timer_attr_{.name="Timer", .attr_bits=osTimerOnce, /*.cb_size=sizeof(osTimerAttr_t)*/},
callback_{callback},
callbackArg_{arg},
running_{false}
{ {
// Pass an anonymous function as the callback which will invoke the currently registered callback. // Pass an anonymous function as the callback which will invoke the currently registered callback.
timer_id_ = osTimerNew(timeoutHandler, osTimerOnce, arg, &timer_attr_); timer_id_ = osTimerNew(timeoutHandler, osTimerOnce, arg, &timer_attr_);
@ -19,6 +23,8 @@ namespace sta {
RtosTimer::~RtosTimer() RtosTimer::~RtosTimer()
{ {
if (isRunning()) stop();
osTimerDelete(timer_id_); osTimerDelete(timer_id_);
} }
@ -32,13 +38,38 @@ namespace sta {
{ {
osStatus_t status = osTimerStart(timer_id_, millis); osStatus_t status = osTimerStart(timer_id_, millis);
if (status != osOK) STA_DEBUG_PRINTLN("Timer start failed"); if (status != osOK)
{
STA_DEBUG_PRINTLN("Timer start failed");
return;
}
running_ = true;
} }
void RtosTimer::stop() void RtosTimer::stop()
{ {
osStatus_t status = osTimerStop(timer_id_); osStatus_t status = osTimerStop(timer_id_);
if (status != osOK) STA_DEBUG_PRINTLN("Timer stop failed"); if (status != osOK)
{
STA_DEBUG_PRINTLN("Timer stop failed");
return;
}
running_ = false;
} }
bool RtosTimer::isRunning()
{
return running_;
}
void RtosTimer::timeoutHandler(void* arg)
{
RtosTimer* timer = static_cast<RtosTimer*>(arg);
timer->running_ = false;
timer->callback_(timer->callbackArg_);
}
} // namespace sta } // namespace sta