1 #define TRACE_NAME "RTIDDS"
3 #include "artdaq/RTIDDS/RTIDDS.hh"
4 #include "artdaq/DAQdata/Globals.hh"
6 #include <boost/tokenizer.hpp>
16 DDS_ReturnCode_t retcode = DDS_RETCODE_ERROR;
17 DDS_DomainParticipantQos participant_qos;
19 retcode = DDSDomainParticipantFactory::get_instance()->get_default_participant_qos(participant_qos);
21 if (retcode != DDS_RETCODE_OK)
23 TLOG(TLVL_WARNING) << name_ <<
": Problem obtaining default participant QoS, retcode was " << retcode ;
26 retcode = DDSPropertyQosPolicyHelper::add_property(
27 participant_qos.property,
"dds.builtin_type.octets.max_size",
31 if (retcode != DDS_RETCODE_OK)
33 TLOG(TLVL_WARNING) << name_ <<
": Problem setting dds.builtin_type.octets.max_size, retcode was " << retcode ;
36 participant_.reset(DDSDomainParticipantFactory::get_instance()->
44 topic_octets_ = participant_->create_topic(
46 DDSOctetsTypeSupport::get_type_name(),
47 DDS_TOPIC_QOS_DEFAULT,
49 DDS_STATUS_MASK_NONE);
51 if (participant_ ==
nullptr || topic_octets_ ==
nullptr)
53 TLOG(TLVL_WARNING) << name_ <<
": Problem setting up the RTI-DDS participant and/or topic" ;
63 DDS_DataWriterQos writer_qos;
65 retcode = participant_->get_default_datawriter_qos(writer_qos);
67 if (retcode != DDS_RETCODE_OK)
69 TLOG(TLVL_WARNING) << name_ <<
": Problem obtaining default datawriter QoS, retcode was " << retcode ;
72 retcode = DDSPropertyQosPolicyHelper::add_property(
73 writer_qos.property,
"dds.builtin_type.octets.alloc_size",
77 if (retcode != DDS_RETCODE_OK)
79 TLOG(TLVL_WARNING) << name_ <<
": Problem setting dds.builtin_type.octets.alloc_size, retcode was " << retcode ;
83 if (iotype_ == IOType::writer)
85 octets_writer_ = DDSOctetsDataWriter::narrow(participant_->create_datawriter(
92 if (octets_writer_ ==
nullptr)
94 TLOG(TLVL_WARNING) << name_ <<
": Problem setting up the RTI-DDS writer objects" ;
99 octets_reader_ = participant_->create_datareader(
101 DDS_DATAREADER_QOS_DEFAULT,
103 DDS_DATA_AVAILABLE_STATUS);
105 if (octets_reader_ ==
nullptr)
107 TLOG(TLVL_WARNING) << name_ <<
": Problem setting up the RTI-DDS reader objects" ;
117 size_t fragmentType = fragment.type();
119 if (octets_writer_ == NULL) {
return; }
126 size_t max_fragment_size = boost::lexical_cast<
size_t>(max_size_) -
127 detail::RawFragmentHeader::num_words() *
sizeof(RawDataType);
129 if (fragment.type() != artdaq::Fragment::InvalidFragmentType &&
130 fragment.sizeBytes() < max_fragment_size)
132 if (fragment.type() == artdaq::Fragment::InitFragmentType)
137 DDS_ReturnCode_t retcode = octets_writer_->write(reinterpret_cast<unsigned char*>(fragment.headerBeginBytes()),
138 fragment.sizeBytes(),
141 if (retcode != DDS_RETCODE_OK)
143 TLOG(TLVL_WARNING) << name_ <<
": Problem writing octets (bytes), retcode was " << retcode ;
145 TLOG(TLVL_WARNING) << name_ <<
": Fragment failed for DDS! "
146 <<
"fragment address and size = "
147 <<
static_cast<void*
>(fragment.headerBeginBytes()) <<
" " << static_cast<int>(fragment.sizeBytes()) <<
" "
148 <<
"sequence ID, fragment ID, and type = "
149 << fragment.sequenceID() <<
" "
150 << fragment.fragmentID() <<
" "
151 << ((int) fragment.type()) ;
156 TLOG(TLVL_WARNING) << name_ <<
": Fragment invalid for DDS! "
157 <<
"fragment address and size = "
158 <<
static_cast<void*
>(fragment.headerBeginBytes()) <<
" " << static_cast<int>(fragment.sizeBytes()) <<
" "
159 <<
"sequence ID, fragment ID, and type = "
160 << fragment.sequenceID() <<
" "
161 << fragment.fragmentID() <<
" "
162 << ((int) fragment.type()) ;
168 DDSOctetsDataReader* octets_reader = NULL;
170 DDS_ReturnCode_t retcode;
172 TLOG(TLVL_DEBUG) << name_ <<
": In OctetsListener::on_data_available" ;
175 octets_reader = DDSOctetsDataReader::narrow(reader);
176 if (octets_reader ==
nullptr)
178 TLOG(TLVL_ERROR) << name_ <<
": Error: Very unexpected - DDSOctetsDataReader::narrow failed" ;
187 retcode = octets_reader->take_next_sample(
190 if (retcode == DDS_RETCODE_NO_DATA)
195 else if (retcode != DDS_RETCODE_OK)
197 TLOG(TLVL_WARNING) <<
"Unable to take data from data reader, error "
208 std::lock_guard<std::mutex> lock(queue_mutex_);
210 dds_octets_queue_.push(dds_octets_);
219 const size_t receiveTimeout)
222 size_t sleepTime = 1000;
223 size_t nloops = receiveTimeout / sleepTime;
225 while (dds_octets_queue_.empty() && loopCount < nloops)
236 std::lock_guard<std::mutex> lock(queue_mutex_);
238 if (!dds_octets_queue_.empty())
240 fragment.resizeBytes(dds_octets_queue_.front().length);
241 memcpy(fragment.headerAddress(), dds_octets_queue_.front().value, dds_octets_queue_.front().length);
243 dds_octets_queue_.pop();
245 TLOG(TLVL_DEBUG) << name_
246 <<
": Received fragment from DDS, type ="
247 << ((int)fragment.type()) <<
", sequenceID = "
248 << fragment.sequenceID() <<
", size in bytes = "
249 << fragment.sizeBytes()
void moveFragmentToDDS_(artdaq::Fragment &&fragment)
Move a Fragment to DDS.
OctetsListener octets_listener_
The receiver.
void on_data_available(DDSDataReader *reader)
Action to perform when data is available.
bool receiveFragmentFromDDS(artdaq::Fragment &fragment, const size_t receiveTimeout)
Receive a Fragment from DDS.
RTIDDS(std::string name, IOType iotype, std::string max_size="1000000")
Construct a RTIDDS transmitter.
void copyFragmentToDDS_(artdaq::Fragment &fragment)
Copy a Fragment to DDS.
IOType
Whether this DDS instance is a reader or a writer.