Program Listing for File trigger.h#
↰ Return to documentation for file (data_dispatch_service\trigger.h)
#ifndef TRIGGER_H
#define TRIGGER_H
#include <support/interface_ptr.h>
#include <support/timer.h>
// Forward declaration
class CDispatchService;
class CSignal;
class CTrigger;
enum class EExecutionFlag
{
periodic,
spontaneous
};
class CScheduler
{
public:
CScheduler() = default;
~CScheduler();
void Start();
void Stop();
void Schedule(CTrigger* pTrigger, EExecutionFlag eExecFlag, std::chrono::high_resolution_clock::time_point tpDue);
void RemoveFromSchedule(const CTrigger* pTrigger);
private:
void EvaluateAndExecute();
using CObjectMap = std::map<CTrigger*, EExecutionFlag>;
using CSchedulerMMap = std::multimap<std::chrono::high_resolution_clock::time_point, CObjectMap::iterator>;
sdv::core::CTaskTimer m_timer;
std::mutex m_mtxScheduler;
CObjectMap m_mapTriggers;
CSchedulerMMap m_mmapScheduleList;
};
class CTrigger : public sdv::IInterfaceAccess, public sdv::core::ITxTrigger, public sdv::IObjectDestroy
{
public:
CTrigger(CDispatchService& rDispatchSvc, uint32_t uiCycleTime, uint32_t uiDelayTime, uint32_t uiBehaviorFlags,
sdv::core::ITxTriggerCallback* pCallback);
// Interface map
BEGIN_SDV_INTERFACE_MAP()
SDV_INTERFACE_ENTRY(sdv::IInterfaceAccess)
SDV_INTERFACE_ENTRY(sdv::core::ITxTrigger)
SDV_INTERFACE_ENTRY(sdv::IObjectDestroy)
END_SDV_INTERFACE_MAP()
bool IsValid() const;
virtual void DestroyObject() override;
virtual bool AddSignal(/*in*/ const sdv::u8string& ssSignalName) override;
virtual void RemoveSignal(/*in*/ const sdv::u8string& ssSignalName) override;
void Execute(EExecutionFlag eExecFlag = EExecutionFlag::spontaneous);
private:
sdv::CLifetimeCookie m_cookie = sdv::CreateLifetimeCookie();
CDispatchService& m_rDispatchSvc;
sdv::core::CTaskTimer m_timer;
std::chrono::high_resolution_clock::time_point m_tpLast;
size_t m_nPeriod = 0ull;
size_t m_nDelay = 0ull;
uint32_t m_uiBehaviorFlags = 0ul;
size_t m_nInactiveRepetition = 0ull;
sdv::core::ITxTriggerCallback* m_pCallback = nullptr;
std::mutex m_mtxSignals;
std::map<sdv::u8string, CSignal*> m_mapSignals;
};
#endif // ! defined TRIGGER_H