80 lines
2.1 KiB
C++
Executable File
80 lines
2.1 KiB
C++
Executable File
/**
|
|
* @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<DDSGeneric::TopicDescription> &vDro)
|
|
{
|
|
// TODO: remove old droEntries
|
|
|
|
QMap<std::string, ddtc *> 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<DDSGeneric::DynamicDataReader> *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
|