1 #include "artdaq/RTIDDS/RTIDDS.hh"
2 #include "artdaq/DAQdata/Globals.hh"
4 #include <boost/tokenizer.hpp>
14 DDS_ReturnCode_t retcode = DDS_RETCODE_ERROR;
15 DDS_DomainParticipantQos participant_qos;
17 retcode = DDSDomainParticipantFactory::get_instance()->get_default_participant_qos(participant_qos);
19 if (retcode != DDS_RETCODE_OK)
21 TLOG_WARNING(name_) <<
"Problem obtaining default participant QoS, retcode was " << retcode << TLOG_ENDL;
24 retcode = DDSPropertyQosPolicyHelper::add_property(
25 participant_qos.property,
"dds.builtin_type.octets.max_size",
29 if (retcode != DDS_RETCODE_OK)
31 TLOG_WARNING(name_) <<
"Problem setting dds.builtin_type.octets.max_size, retcode was " << retcode << TLOG_ENDL;
34 participant_.reset(DDSDomainParticipantFactory::get_instance()->
42 topic_octets_ = participant_->create_topic(
44 DDSOctetsTypeSupport::get_type_name(),
45 DDS_TOPIC_QOS_DEFAULT,
47 DDS_STATUS_MASK_NONE);
49 if (participant_ ==
nullptr || topic_octets_ ==
nullptr)
51 TLOG_WARNING(name_) <<
"Problem setting up the RTI-DDS participant and/or topic" << TLOG_ENDL;
61 DDS_DataWriterQos writer_qos;
63 retcode = participant_->get_default_datawriter_qos(writer_qos);
65 if (retcode != DDS_RETCODE_OK)
67 TLOG_WARNING(name_) <<
"Problem obtaining default datawriter QoS, retcode was " << retcode << TLOG_ENDL;
70 retcode = DDSPropertyQosPolicyHelper::add_property(
71 writer_qos.property,
"dds.builtin_type.octets.alloc_size",
75 if (retcode != DDS_RETCODE_OK)
77 TLOG_WARNING(name_) <<
"Problem setting dds.builtin_type.octets.alloc_size, retcode was " << retcode << TLOG_ENDL;
81 if (iotype_ == IOType::writer)
83 octets_writer_ = DDSOctetsDataWriter::narrow(participant_->create_datawriter(
90 if (octets_writer_ ==
nullptr)
92 TLOG_WARNING(name_) <<
"Problem setting up the RTI-DDS writer objects" << TLOG_ENDL;
97 octets_reader_ = participant_->create_datareader(
99 DDS_DATAREADER_QOS_DEFAULT,
101 DDS_DATA_AVAILABLE_STATUS);
103 if (octets_reader_ ==
nullptr)
105 TLOG_WARNING(name_) <<
"Problem setting up the RTI-DDS reader objects" << TLOG_ENDL;
115 size_t fragmentType = fragment.type();
117 if (octets_writer_ == NULL) {
return; }
124 size_t max_fragment_size = boost::lexical_cast<
size_t>(max_size_) -
125 detail::RawFragmentHeader::num_words() *
sizeof(RawDataType);
127 if (fragment.type() != artdaq::Fragment::InvalidFragmentType &&
128 fragment.sizeBytes() < max_fragment_size)
130 if (fragment.type() == artdaq::Fragment::InitFragmentType)
135 DDS_ReturnCode_t retcode = octets_writer_->write(reinterpret_cast<unsigned char*>(fragment.headerBeginBytes()),
136 fragment.sizeBytes(),
139 if (retcode != DDS_RETCODE_OK)
141 TLOG_WARNING(name_) <<
"Problem writing octets (bytes), retcode was " << retcode << TLOG_ENDL;
143 TLOG_WARNING(name_) <<
"Fragment failed for DDS! "
144 <<
"fragment address and size = "
145 <<
static_cast<void*
>(fragment.headerBeginBytes()) <<
" " << static_cast<int>(fragment.sizeBytes()) <<
" "
146 <<
"sequence ID, fragment ID, and type = "
147 << fragment.sequenceID() <<
" "
148 << fragment.fragmentID() <<
" "
149 << ((int) fragment.type()) << TLOG_ENDL;
154 TLOG_WARNING(name_) <<
"Fragment invalid for shared memory! "
155 <<
"fragment address and size = "
156 <<
static_cast<void*
>(fragment.headerBeginBytes()) <<
" " << static_cast<int>(fragment.sizeBytes()) <<
" "
157 <<
"sequence ID, fragment ID, and type = "
158 << fragment.sequenceID() <<
" "
159 << fragment.fragmentID() <<
" "
160 << ((int) fragment.type()) << TLOG_ENDL;
166 DDSOctetsDataReader* octets_reader = NULL;
168 DDS_ReturnCode_t retcode;
170 TLOG_DEBUG(
"OctetsListener") <<
"In OctetsListener::on_data_available" << TLOG_ENDL;
173 octets_reader = DDSOctetsDataReader::narrow(reader);
174 if (octets_reader ==
nullptr)
176 TLOG_ERROR(
"OctetsListener") <<
"Error: Very unexpected - DDSOctetsDataReader::narrow failed" << TLOG_ENDL;
185 retcode = octets_reader->take_next_sample(
188 if (retcode == DDS_RETCODE_NO_DATA)
193 else if (retcode != DDS_RETCODE_OK)
195 TLOG_WARNING(
"OctetsListener") <<
"Unable to take data from data reader, error "
196 << retcode << TLOG_ENDL;
206 std::lock_guard<std::mutex> lock(queue_mutex_);
208 dds_octets_queue_.push(dds_octets_);
217 const size_t receiveTimeout)
220 size_t sleepTime = 1000;
221 size_t nloops = receiveTimeout / sleepTime;
223 while (dds_octets_queue_.empty() && loopCount < nloops)
234 std::lock_guard<std::mutex> lock(queue_mutex_);
236 if (!dds_octets_queue_.empty())
238 fragment.resizeBytes(dds_octets_queue_.front().length);
239 memcpy(fragment.headerAddress(), dds_octets_queue_.front().value, dds_octets_queue_.front().length);
241 dds_octets_queue_.pop();
244 <<
"Received fragment from DDS, type ="
245 << ((int)fragment.type()) <<
", sequenceID = "
246 << fragment.sequenceID() <<
", size in bytes = "
247 << 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.