Program Listing for File signal.h#
↰ Return to documentation for file (data_dispatch_service\signal.h)
#ifndef SIGNAL_H
#define SIGNAL_H
#include <support/interface_ptr.h>
#include <interfaces/dispatch.h>
#include "trigger.h"
// Forward declaration
class CDispatchService;
class CSignal;
class CProvider : public sdv::IInterfaceAccess, public sdv::IObjectDestroy, public sdv::core::ISignalWrite
{
public:
explicit CProvider(CSignal& rSignal);
// Interface map
BEGIN_SDV_INTERFACE_MAP()
SDV_INTERFACE_ENTRY(sdv::IObjectDestroy)
SDV_INTERFACE_ENTRY(sdv::core::ISignalWrite)
END_SDV_INTERFACE_MAP()
virtual void DestroyObject() override;
virtual void Write(/*in*/ sdv::any_t anyVal, /*in*/ sdv::IInterfaceAccess* pTransaction) override;
void Write(const sdv::any_t& ranyVal, uint64_t uiTransactionID);
private:
sdv::CLifetimeCookie m_cookie = sdv::CreateLifetimeCookie();
CSignal& m_rSignal;
};
class CConsumer : public sdv::IInterfaceAccess, public sdv::IObjectDestroy, public sdv::core::ISignalRead
{
public:
CConsumer(CSignal& rSignal, sdv::IInterfaceAccess* pEvent = nullptr);
// Interface map
BEGIN_SDV_INTERFACE_MAP()
SDV_INTERFACE_ENTRY(sdv::IObjectDestroy)
SDV_INTERFACE_ENTRY(sdv::core::ISignalRead)
END_SDV_INTERFACE_MAP()
virtual void DestroyObject() override;
virtual sdv::any_t Read(/*in*/ sdv::IInterfaceAccess* pTransaction) const override;
void Write(const sdv::any_t& ranyVal, uint64_t uiTransactionID);
void Distribute(const sdv::any_t& ranyVal);
private:
sdv::CLifetimeCookie m_cookie = sdv::CreateLifetimeCookie();
CSignal& m_rSignal;
sdv::core::ISignalReceiveEvent* m_pEvent = nullptr;
};
class CSignal
{
public:
struct SSignalObjectHelper
{
virtual ~SSignalObjectHelper() = default;
};
CSignal(CDispatchService& rDispatchSvc, const sdv::u8string& rssName, sdv::core::ESignalDirection eDirection,
sdv::any_t anyDefVal = sdv::any_t());
~CSignal();
sdv::u8string GetName() const;
sdv::core::ESignalDirection GetDirection() const;
sdv::any_t GetDefVal() const;
CProvider* CreateProvider();
void RemoveProvider(CProvider* pProvider);
CConsumer* CreateConsumer(sdv::IInterfaceAccess* pEvent = nullptr);
void RemoveConsumer(CConsumer* pConsumer);
void WriteFromProvider(const sdv::any_t& ranyVal, uint64_t uiTransactionID, std::set<CTrigger*>& rsetTriggers);
sdv::any_t ReadFromConsumer(uint64_t uiTransactionID) const;
void DistributeToConsumers(const sdv::any_t& ranyVal);
void AddTrigger(CTrigger* pTrigger);
void RemoveTrigger(CTrigger* pTrigger);
bool EqualsDefaultValue() const;
private:
sdv::CLifetimeCookie m_cookie = sdv::CreateLifetimeCookie();
CDispatchService& m_rDispatchSvc;
sdv::u8string m_ssName;
sdv::core::ESignalDirection m_eDirection = sdv::core::ESignalDirection::sigdir_tx;
sdv::any_t m_anyDefVal;
mutable std::mutex m_mtxVal;
mutable std::pair<uint64_t, sdv::any_t> m_rgprVal[16];
mutable size_t m_nValIndex = 0;
mutable std::mutex m_mtxSignalObjects;
std::map<CProvider*, std::unique_ptr<CProvider>> m_mapProviders;
std::map<CConsumer*, std::unique_ptr<CConsumer>> m_mapConsumers;
std::mutex m_mtxTriggers;
std::set<CTrigger*> m_setTriggers;
};
#endif // !defined SIGNAL_H