#pragma once #include "ddkit/base/Config.hpp" #include "ddkit/access/TopicPoolRead.hpp" #include "ddkit/access/TopicPoolWrite.hpp" namespace ddkit { namespace access { class ModelMonitor final { public: ModelMonitor( base::Config& config, bool isWrite, bool isRmodel, const std::string& header, int domain, const IQosStrategyPtr& qosStrategy, const ITopicStrategyPtr& topicStrategy); // start current module for addition void startModule(const std::string& moduleName); // ... for current module template void addTopic(); // listen forever void doRun(); private: base::Config& m_config; bool m_isWrite; bool m_isRmodel; std::string m_header; int m_domain; std::shared_ptr m_dispatcher; Participant m_participant; TopicPoolWrite m_topicPoolWrite; TopicPoolRead m_topicPoolRead; std::string m_moduleCurrent; int m_ctCurrent; int m_ctTotal; std::map m_module2ct; }; template void ModelMonitor::addTopic() { DDKIT_LOG_TRACE; std::string typeName = dds::topic::topic_type_name::value(); if (m_isRmodel) { ddkit::utils::string::removePrefix(typeName, "VendorData::"); } std::string partFirst = typeName.substr(0, typeName.find("::")); std::string partLast = typeName.substr(typeName.rfind("::") + 2); std::string moduleName = partFirst; std::string topicName = partLast; ddkit::log::trace() << DDKIT_LOG_VAR_VALUE(moduleName); ddkit::log::trace() << DDKIT_LOG_VAR_VALUE(m_moduleCurrent); if(moduleName != m_moduleCurrent){ ddkit::log::error() << "ModelMonitor::addTopic: mismatch in module name: \"" << m_moduleCurrent << "\" in class and \"" << moduleName << "\" in topic_type_name."; return; } // bei isRmodel muss das config-format anders werden IService.ConfigAbc ... std::string key = "module." + moduleName + "." + topicName; bool isOn = m_config.hasKey(key) && m_config.getBoolValue(key); ddkit::log::trace() << key; if (isOn) { ++m_ctCurrent; if (m_isWrite) { std::ostringstream deadEnd; deadEnd << "not implemented yet"; // todo ddkit::log::fatal() << deadEnd.str(); throw std::logic_error(deadEnd.str()); // m_topicPoolWrite.createTopicWrite(); } else { m_topicPoolRead.createTopicRead( [=](T const& val) { std::cout << m_header << typeName << ": " << val << std::endl; }); } } } } // namespace access } // namespace ddkit