/* * threads_timer.cpp * * Created on: Jun 23, 2021 * Author: erki */ #include "threads_timer.hpp" #include #include #include #include namespace Threads { Timer::Timer(Signallable* signal, const char* name, const std::int32_t period_ms, const bool auto_reload) : timer_(xTimerCreate(name, pdMS_TO_TICKS(period_ms), auto_reload, this, &Timer::timeoutHandler_)), signal_(signal) { assert(timer_); } Timer::~Timer() { xTimerDelete(timer_, 0); } void Timer::setAutoReload(const bool auto_reload) { vTimerSetReloadMode(timer_, auto_reload ? pdTRUE : pdFALSE); } void Timer::setPeriod(const std::int32_t period_ms) { xTimerChangePeriod(timer_, pdMS_TO_TICKS(period_ms), 0); } BaseType_t Timer::setPeriodFromIsr(const std::int32_t period_ms) { BaseType_t was_awoken = false; xTimerChangePeriodFromISR(timer_, pdMS_TO_TICKS(period_ms), &was_awoken); return was_awoken; } bool Timer::start() { const BaseType_t success = xTimerStart(timer_, 0); return success != pdFAIL; } bool Timer::stop() { const BaseType_t success = xTimerStop(timer_, 0); return success != pdFAIL; } std::pair Timer::startFromIsr() { BaseType_t was_awoken = false; const BaseType_t success = xTimerStartFromISR(timer_, &was_awoken); return {success != pdFAIL, was_awoken}; } std::pair Timer::stopFromIsr() { BaseType_t was_awoken = false; const BaseType_t success = xTimerStopFromISR(timer_, &was_awoken); return {success != pdFAIL, was_awoken}; } void Timer::timeoutHandler_(TimerHandle_t timer) { void* source = pvTimerGetTimerID(timer); if (!source) return; auto* d = static_cast(source); d->signal_->emit(TimeoutSignal{}); } }// namespace Threads