/** * @RDE_HEADER@ * * Subscriber (DataSampleReceiver) * Uses DDTCs to subscribe to data * * $Id$ * $HeadURL$ * $Author$ */ #include "subscriber.h" #include "telegrammodel.h" namespace DdsView { Subscriber::Subscriber(const dds::domain::DomainParticipant &domainParticipant, const std::string &partition, TelegramModel *tm) : DDSConnector::Subscriber(domainParticipant, partition) , m_telegramModel(tm) , m_logger(DdsView::getLogger("Subscriber")) {} Subscriber::~Subscriber() { qDeleteAll(m_ddtcMap); m_ddtcMap.clear(); } void Subscriber::processData(const dds::core::xtypes::DynamicData &data, const QString &topicName, DataModification modType) { m_telegramModel->processData(data, topicName, modType); } bool Subscriber::initDDTCs(const QVector &vDro) { // TODO: remove old droEntries QMap newTopics; for (const DDSGeneric::TopicDescription &ti : vDro) { auto it = m_ddtcMap.find(ti.name); if (it != m_ddtcMap.end()) { // already there newTopics.insert(it.key(), it.value()); m_ddtcMap.erase(it); continue; } DTC::Ddtc *ddtc = this->create( [this](const dds::core::xtypes::DynamicData & data, const std::string & topicName, DataModification modType) { processData(data, QString::fromStdString(topicName), modType); }, ti.type, nullptr /* Use SubscriberListener from DdsConnector */, ti.name ); if (ddtc == nullptr) { ERROR_LOG(m_logger) << "Can't create ddtc for Topic (" << ti.name << "), TypeName (" << ti.typeName << ")"; continue; } if (ddtc->hasSamples()) { for (const auto &data : ddtc->readAlive()) processData(data.data(), QString::fromStdString(ti.name), DataModification::eAdded); } newTopics.insert(ti.name, ddtc); } qDeleteAll(m_ddtcMap); m_ddtcMap = newTopics; return true; } // end initDDTCs() } // Namespace DdsView