Program Listing for File timer.h#
↰ Return to documentation for file (support\timer.h
)
#ifndef VAPI_TASK_TIMER_H
#define VAPI_TASK_TIMER_H
#include "../interfaces/timer.h"
#include "interface_ptr.h"
#include "local_service_access.h"
#include <functional>
namespace sdv
{
namespace core
{
class CTaskTimer
{
public:
CTaskTimer() = default;
CTaskTimer(uint32_t uiPeriod, std::function<void()> fnCallback) :
m_ptrCallback(std::make_unique<STimerCallback>(fnCallback))
{
if (!m_ptrCallback) return;
if (!uiPeriod) return;
// Get the task timer service.
sdv::core::ITaskTimer* pTaskTimer = sdv::core::GetObject<sdv::core::ITaskTimer>("TaskTimerService");
if (!pTaskTimer)
{
pTaskTimer = sdv::core::GetObject<sdv::core::ITaskTimer>("SimulationTaskTimerService");
if (!pTaskTimer) return;
}
// Create the timer
m_pTimer = pTaskTimer->CreateTimer(uiPeriod, m_ptrCallback.get());
}
CTaskTimer(uint32_t uiPeriod, sdv::IInterfaceAccess* pTask)
{
if (!uiPeriod) return;
// Get the task timer service.
sdv::core::ITaskTimer* pTaskTimer = sdv::core::GetObject<sdv::core::ITaskTimer>("TaskTimerService");
if (!pTaskTimer)
{
pTaskTimer = sdv::core::GetObject<sdv::core::ITaskTimer>("SimulationTaskTimerService");
if (!pTaskTimer) return;
}
// Create the timer
m_pTimer = pTaskTimer->CreateTimer(uiPeriod, pTask);
}
CTaskTimer(const CTaskTimer&) = delete;
CTaskTimer(CTaskTimer&& rtimer) noexcept :
m_pTimer(rtimer.m_pTimer), m_uiPeriod(rtimer.m_uiPeriod), m_ptrCallback(std::move(rtimer.m_ptrCallback))
{
rtimer.m_pTimer = nullptr;
rtimer.m_uiPeriod = 0;
}
~CTaskTimer()
{
Reset();
}
CTaskTimer& operator=(const CTaskTimer&) = delete;
CTaskTimer& operator=(CTaskTimer&& rtimer) noexcept
{
Reset();
m_pTimer = rtimer.m_pTimer;
m_ptrCallback = std::move(rtimer.m_ptrCallback);
m_uiPeriod = rtimer.m_uiPeriod;
rtimer.m_pTimer = nullptr;
rtimer.m_uiPeriod = 0;
return *this;
}
operator bool() const
{
return m_pTimer;
}
void Reset()
{
if (m_pTimer)
{
IObjectDestroy* pDestroy = m_pTimer->GetInterface<IObjectDestroy>();
if (pDestroy)
pDestroy->DestroyObject();
m_pTimer = nullptr;
}
m_ptrCallback.reset();
m_uiPeriod = 0ul;
}
uint32_t GetPeriod() const
{
return m_uiPeriod;
}
private:
struct STimerCallback : public IInterfaceAccess, public core::ITaskExecute
{
STimerCallback(std::function<void()> fnCallback) : m_fnCallback(fnCallback)
{}
protected:
// Interface map
BEGIN_SDV_INTERFACE_MAP()
SDV_INTERFACE_ENTRY(core::ITaskExecute)
END_SDV_INTERFACE_MAP()
virtual void Execute() override
{
if (m_fnCallback) m_fnCallback();
}
private:
std::function<void()> m_fnCallback;
};
sdv::IInterfaceAccess* m_pTimer = nullptr;
uint32_t m_uiPeriod = 0ul;
std::unique_ptr<STimerCallback> m_ptrCallback;
};
}
}
#endif // !defined VAPI_TASK_TIMER_H