skullc-peripherals/Threads/Src/threads_timer.cpp
2021-06-24 13:15:10 +03:00

89 lines
1.7 KiB
C++

/*
* threads_timer.cpp
*
* Created on: Jun 23, 2021
* Author: erki
*/
#include "threads_timer.hpp"
#include <algorithm>
#include <array>
#include <freertos_os2.h>
#include <timers.h>
namespace Threads
{
Timer::Timer(Signallable<TimeoutSignal>* 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<bool, BaseType_t> Timer::startFromIsr()
{
BaseType_t was_awoken = false;
const BaseType_t success = xTimerStartFromISR(timer_, &was_awoken);
return {success != pdFAIL, was_awoken};
}
std::pair<bool, BaseType_t> 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;
static_cast<Timer*>(source)->signal_->emit(TimeoutSignal{});
}
}// namespace Threads