2 #include "madara/utility/LogMacros.h"
24 Knowledge::Update& data)
30 long long value = data.value;
34 "SpliceDataReaderListener::handle_assignment:"
35 " waiting to process assignment\n");
38 unsigned long long cur_clock =
context_.get_clock(key);
39 unsigned long cur_quality =
context_.get_quality(key);
51 context_.set_if_unequal(key, value, data.quality, data.clock,
false);
59 "SpliceDataReaderListener::handle_assignment:"
60 " received data[%s]=%q from %s\n",
61 key.c_str(), value, data.originator.val());
67 "SpliceDataReaderListener::handle_assignment:"
68 " discarded data[%s]=%q from %s as the value was already set\n",
69 key.c_str(), value, data.originator.val());
71 else if (result == -1)
74 "SpliceDataReaderListener::handle_assignment:"
75 " discarded data due to null key\n",
76 key.c_str(), value, data.originator.val());
78 else if (result == -2)
81 "SpliceDataReaderListener::handle_assignment:"
82 " discarded data[%s]=%q due to lower quality (%u vs %u)\n",
83 key.c_str(), value, cur_quality, data.quality);
85 else if (result == -3)
88 "SpliceDataReaderListener::handle_assignment:"
89 " discarded data[%s]=%q due to older timestamp (%Q vs %Q)\n",
90 key.c_str(), value, cur_clock, data.clock);
96 Knowledge::Update& data)
103 std::stringstream stream(data.key.val());
106 "SpliceDataReaderListener::handle_multiassignment:"
107 " waiting to process multiassignment\n");
112 "SpliceDataReaderListener::handle_multiassignment:"
113 " processing multiassignment (%s)\n",
116 while (!stream.eof())
118 stream >> key >> symbol >> value >> symbol;
121 unsigned long long cur_clock =
context_.get_clock(key);
122 unsigned long cur_quality =
context_.get_quality(key);
129 context_.set_if_unequal(key, value, data.quality, data.clock,
false);
135 "SpliceDataReaderListener::handle_multiassignment:"
136 " received data[%s]=%q from %s\n",
137 key.c_str(), value, data.originator.val());
140 else if (result == 0)
143 "SpliceDataReaderListener::handle_multiassignment:"
144 " discarded data[%s]=%q from %s as the value was already set\n",
145 key.c_str(), value, data.originator.val());
147 else if (result == -1)
150 "SpliceDataReaderListener::handle_multiassignment:"
151 " discarded data due to null key\n",
152 key.c_str(), value, data.originator.val());
154 else if (result == -2)
157 "SpliceDataReaderListener::handle_multiassignment:"
158 " discarded data[%s]=%q due to lower quality (%u vs %u)\n",
159 key.c_str(), value, cur_quality, data.quality);
161 else if (result == -3)
164 "SpliceDataReaderListener::handle_multiassignment:"
165 " discarded data[%s]=%q due to older timestamp (%Q vs %Q)\n",
166 key.c_str(), value, cur_clock, data.clock);
175 DDS::DataReader_ptr,
const DDS::SampleLostStatus& status)
180 DDS::DataReader_ptr,
const DDS::SampleRejectedStatus& status)
185 DDS::DataReader_ptr,
const DDS::RequestedIncompatibleQosStatus& status)
190 DDS::DataReader_ptr reader,
191 const DDS::RequestedDeadlineMissedStatus& status)
196 DDS::DataReader_ptr reader,
const DDS::LivelinessChangedStatus& status)
201 DDS::DataReader_ptr reader,
const DDS::SubscriptionMatchedStatus& status)
207 DDS::DataReader_ptr reader)
209 DDS::SampleInfoSeq_var infoList =
new DDS::SampleInfoSeq;
210 DDS::ReturnCode_t dds_result;
212 DDS::Boolean result =
false;
213 Knowledge::UpdateSeq_var update_data_list_ =
new Knowledge::UpdateSeq;
215 Knowledge::UpdateDataReader_ptr update_reader =
216 dynamic_cast<Knowledge::UpdateDataReader_ptr
>(reader);
218 if (update_reader == 0)
221 "SpliceDataReaderListener::on_data_available:"
222 " Unable to create specialized reader. Leaving callback...\n");
227 dds_result = update_reader->take(update_data_list_, infoList, 1,
228 DDS::ANY_SAMPLE_STATE, DDS::ANY_VIEW_STATE, DDS::ANY_INSTANCE_STATE);
230 amount = update_data_list_->length();
234 for (
int i = 0; i < amount; ++i)
239 if (!update_data_list_[i].originator.val() ||
240 id_ == update_data_list_[i].originator.val())
243 "SpliceDataReaderListener::on_data_available:"
244 " discarding null originator event\n");
252 "SpliceDataReaderListener::on_data_available:"
253 " processing %s=%q from %s with time %Q and quality %u\n",
254 update_data_list_[i].key.val(), update_data_list_[i].value,
255 update_data_list_[i].originator.val(), update_data_list_[i].clock,
256 update_data_list_[i].quality);
258 handle_assignment(update_data_list_[i]);
261 update_data_list_[i].type)
264 "SpliceDataReaderListener::on_data_available:"
265 " processing multassignment from %s with time %Q and quality %u\n",
266 update_data_list_[i].originator.val(), update_data_list_[i].clock,
267 update_data_list_[i].quality);
269 handle_multiassignment(update_data_list_[i]);
275 dds_result = update_reader->return_loan(update_data_list_, infoList);
#define madara_logger_log(loggering, level,...)
Fast version of the madara::logger::log method.
const ThreadSafeContext * context_
This class stores variables and their values for use by any entity needing state information in a thr...
Container for DDS-related callbacks (deprecated and unused)
void handle_multiassignment(Knowledge::Update &data)
void on_sample_rejected(DDS::DataReader_ptr, const DDS::SampleRejectedStatus &status)
DDS callback for sample rejected.
void on_requested_incompatible_qos(DDS::DataReader_ptr, const DDS::RequestedIncompatibleQosStatus &status)
DDS callback for incompatible qos.
void on_subscription_matched(DDS::DataReader_ptr reader, const DDS::SubscriptionMatchedStatus &status)
DDS callback for subscription matched.
void handle_assignment(Knowledge::Update &data)
void on_sample_lost(DDS::DataReader_ptr, const DDS::SampleLostStatus &status)
DDS callback for sample lost.
void on_liveliness_changed(DDS::DataReader_ptr, const DDS::LivelinessChangedStatus &status)
DDS callback for sample rejected.
void on_data_available(DDS::DataReader_ptr reader)
SpliceDataReaderListener(const std::string &id, knowledge::ThreadSafeContext &context)
void on_requested_deadline_missed(DDS::DataReader_ptr, const DDS::RequestedDeadlineMissedStatus &status)
DDS callback for deadline being missed.
~SpliceDataReaderListener()