90 lines
2.7 KiB
C++
90 lines
2.7 KiB
C++
#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 <typename T>
|
|
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<Dispatcher> m_dispatcher;
|
|
Participant m_participant;
|
|
TopicPoolWrite m_topicPoolWrite;
|
|
TopicPoolRead m_topicPoolRead;
|
|
|
|
std::string m_moduleCurrent;
|
|
int m_ctCurrent;
|
|
int m_ctTotal;
|
|
std::map<std::string, int> m_module2ct;
|
|
};
|
|
|
|
template <typename T>
|
|
void ModelMonitor::addTopic() {
|
|
DDKIT_LOG_TRACE;
|
|
|
|
std::string typeName = dds::topic::topic_type_name<T>::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<T>();
|
|
} else {
|
|
m_topicPoolRead.createTopicRead<T>(
|
|
[=](T const& val) { std::cout << m_header << typeName << ": " << val << std::endl; });
|
|
}
|
|
}
|
|
}
|
|
|
|
} // namespace access
|
|
} // namespace ddkit
|