#include "publisher.h" #include "pub_sub_base_p.h" #include #include #include namespace DDSConnector { Publisher::Publisher(const dds::domain::DomainParticipant &domainParticipant, const std::string &partition) : PubSubBase(domainParticipant, partition, "DDSConnector.Publisher") , m_ddsPublisher(nullptr) { Q_ASSERT(domainParticipant != nullptr); initDDS(); } Publisher::~Publisher() { try { deleteDDS(); } catch (...) {} } void Publisher::initDDS() { if (m_partitions.empty()) return; if (m_logger.isDebugEnabled()) { DEBUG_LOG(m_logger) << "Publisher (DataWriter) Qos: "; dds::core::QosProvider qosProvider = dds::core::QosProvider::Default(); DDS::QosProfile::print(qosProvider.datawriter_qos(), m_logger); } dds::pub::qos::PublisherQos publisherQos = m_domainParticipant.default_publisher_qos(); rti::core::policy::EntityName entityName; entityName.name(std::string("Pub ") + m_partitions.front()); publisherQos << entityName; DEBUG_LOG(m_logger) << "Publish data on partition " << m_partitions.front(); m_ddsPublisher = dds::pub::Publisher(m_domainParticipant, publisherQos); enableBatchedWriter(false); updatePartitionQoS(m_ddsPublisher); } void Publisher::enableBatchedWriter(bool bEnable) { dds::pub::qos::DataWriterQos dwQos = m_ddsPublisher.default_datawriter_qos(); auto batch = (bEnable ? rti::core::policy::Batch::Enabled() : rti::core::policy::Batch::Disabled()); if (bEnable) { batch.max_data_bytes(64 * 1024); batch.max_flush_delay(dds::core::Duration::from_millisecs(10)); } dwQos << batch; m_ddsPublisher.default_datawriter_qos(dwQos); } void Publisher::deleteDDS() { qDeleteAll(m_dtsMap); qDeleteAll(m_dynamicTypeMap); m_ddsPublisher = nullptr; } bool Publisher::write(const dds::core::xtypes::DynamicData &data, const std::string &topicName) { DEBUG_LOG(m_logger) << "Publish dynamic data for topic (" << topicName << ")"; try { dds::pub::AnyDataWriter* anyWriter = m_dynamicTypeMap.value(topicName); if (anyWriter == nullptr) { dds::topic::Topic topic(m_domainParticipant, topicName, data.type()); auto writer = dds::pub::DataWriter(m_ddsPublisher, topic); anyWriter = new dds::pub::AnyDataWriter(writer); m_dynamicTypeMap.insert(topicName, anyWriter); } anyWriter->get().write(data); } catch ( ... ) { ERROR_LOG(m_logger) << "Failed to publish data for topic (" << topicName << ")"; return false; } return true; } }