Skip to content
This repository was archived by the owner on Jun 21, 2023. It is now read-only.

Commit 9de4488

Browse files
mm318ivanpauno
authored andcommitted
Implement get_actual_qos() for subscriptions (#358)
Signed-off-by: Miaofei <[email protected]>
1 parent 8e9e088 commit 9de4488

File tree

4 files changed

+142
-64
lines changed

4 files changed

+142
-64
lines changed

rmw_connext_cpp/src/rmw_publisher.cpp

Lines changed: 1 addition & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -386,70 +386,7 @@ rmw_publisher_get_actual_qos(
386386
return RMW_RET_ERROR;
387387
}
388388

389-
if (!data_writer) {
390-
RMW_SET_ERROR_MSG("publisher internal dds publisher is invalid");
391-
return RMW_RET_ERROR;
392-
}
393-
394-
switch (dds_qos.history.kind) {
395-
case DDS_KEEP_LAST_HISTORY_QOS:
396-
qos->history = RMW_QOS_POLICY_HISTORY_KEEP_LAST;
397-
break;
398-
case DDS_KEEP_ALL_HISTORY_QOS:
399-
qos->history = RMW_QOS_POLICY_HISTORY_KEEP_ALL;
400-
break;
401-
default:
402-
qos->history = RMW_QOS_POLICY_HISTORY_UNKNOWN;
403-
break;
404-
}
405-
qos->depth = static_cast<size_t>(dds_qos.history.depth);
406-
407-
switch (dds_qos.reliability.kind) {
408-
case DDS_BEST_EFFORT_RELIABILITY_QOS:
409-
qos->reliability = RMW_QOS_POLICY_RELIABILITY_BEST_EFFORT;
410-
break;
411-
case DDS_RELIABLE_RELIABILITY_QOS:
412-
qos->reliability = RMW_QOS_POLICY_RELIABILITY_RELIABLE;
413-
break;
414-
default:
415-
qos->reliability = RMW_QOS_POLICY_RELIABILITY_UNKNOWN;
416-
break;
417-
}
418-
419-
switch (dds_qos.durability.kind) {
420-
case DDS_TRANSIENT_LOCAL_DURABILITY_QOS:
421-
qos->durability = RMW_QOS_POLICY_DURABILITY_TRANSIENT_LOCAL;
422-
break;
423-
case DDS_VOLATILE_DURABILITY_QOS:
424-
qos->durability = RMW_QOS_POLICY_DURABILITY_VOLATILE;
425-
break;
426-
default:
427-
qos->durability = RMW_QOS_POLICY_DURABILITY_UNKNOWN;
428-
break;
429-
}
430-
431-
qos->deadline.sec = dds_qos.deadline.period.sec;
432-
qos->deadline.nsec = dds_qos.deadline.period.nanosec;
433-
434-
qos->lifespan.sec = dds_qos.lifespan.duration.sec;
435-
qos->lifespan.nsec = dds_qos.lifespan.duration.nanosec;
436-
437-
switch (dds_qos.liveliness.kind) {
438-
case DDS_AUTOMATIC_LIVELINESS_QOS:
439-
qos->liveliness = RMW_QOS_POLICY_LIVELINESS_AUTOMATIC;
440-
break;
441-
case DDS_MANUAL_BY_PARTICIPANT_LIVELINESS_QOS:
442-
qos->liveliness = RMW_QOS_POLICY_LIVELINESS_MANUAL_BY_NODE;
443-
break;
444-
case DDS_MANUAL_BY_TOPIC_LIVELINESS_QOS:
445-
qos->liveliness = RMW_QOS_POLICY_LIVELINESS_MANUAL_BY_TOPIC;
446-
break;
447-
default:
448-
qos->liveliness = RMW_QOS_POLICY_LIVELINESS_UNKNOWN;
449-
break;
450-
}
451-
qos->liveliness_lease_duration.sec = dds_qos.liveliness.lease_duration.sec;
452-
qos->liveliness_lease_duration.nsec = dds_qos.liveliness.lease_duration.nanosec;
389+
dds_qos_to_rmw_qos(dds_qos, qos);
453390

454391
return RMW_RET_OK;
455392
}

rmw_connext_cpp/src/rmw_subscription.cpp

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -365,6 +365,36 @@ rmw_subscription_count_matched_publishers(
365365
return RMW_RET_OK;
366366
}
367367

368+
rmw_ret_t
369+
rmw_subscription_get_actual_qos(
370+
const rmw_subscription_t * subscription,
371+
rmw_qos_profile_t * qos)
372+
{
373+
RMW_CHECK_ARGUMENT_FOR_NULL(subscription, RMW_RET_INVALID_ARGUMENT);
374+
RMW_CHECK_ARGUMENT_FOR_NULL(qos, RMW_RET_INVALID_ARGUMENT);
375+
376+
auto info = static_cast<ConnextStaticSubscriberInfo *>(subscription->data);
377+
if (!info) {
378+
RMW_SET_ERROR_MSG("subscription internal data is invalid");
379+
return RMW_RET_ERROR;
380+
}
381+
DDS::DataReader * data_reader = info->topic_reader_;
382+
if (!data_reader) {
383+
RMW_SET_ERROR_MSG("subscription internal data reader is invalid");
384+
return RMW_RET_ERROR;
385+
}
386+
DDS::DataReaderQos dds_qos;
387+
DDS::ReturnCode_t status = data_reader->get_qos(dds_qos);
388+
if (DDS::RETCODE_OK != status) {
389+
RMW_SET_ERROR_MSG("subscription can't get data reader qos policies");
390+
return RMW_RET_ERROR;
391+
}
392+
393+
dds_qos_to_rmw_qos(dds_qos, qos);
394+
395+
return RMW_RET_OK;
396+
}
397+
368398
rmw_ret_t
369399
rmw_destroy_subscription(rmw_node_t * node, rmw_subscription_t * subscription)
370400
{

rmw_connext_shared_cpp/include/rmw_connext_shared_cpp/qos.hpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,4 +39,22 @@ get_datawriter_qos(
3939
const rmw_qos_profile_t & qos_profile,
4040
DDS::DataWriterQos & datawriter_qos);
4141

42+
template<typename AttributeT>
43+
void
44+
dds_qos_to_rmw_qos(
45+
const AttributeT & dds_qos,
46+
rmw_qos_profile_t * qos);
47+
48+
extern template RMW_CONNEXT_SHARED_CPP_PUBLIC
49+
void
50+
dds_qos_to_rmw_qos<DDS::DataWriterQos>(
51+
const DDS::DataWriterQos & dds_qos,
52+
rmw_qos_profile_t * qos);
53+
54+
extern template RMW_CONNEXT_SHARED_CPP_PUBLIC
55+
void
56+
dds_qos_to_rmw_qos<DDS::DataReaderQos>(
57+
const DDS::DataReaderQos & dds_qos,
58+
rmw_qos_profile_t * qos);
59+
4260
#endif // RMW_CONNEXT_SHARED_CPP__QOS_HPP_

rmw_connext_shared_cpp/src/qos.cpp

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -222,3 +222,96 @@ get_datawriter_qos(
222222

223223
return true;
224224
}
225+
226+
void
227+
dds_qos_lifespan_to_rmw_qos_lifespan(
228+
const DDS::DataWriterQos & dds_qos,
229+
rmw_qos_profile_t * qos)
230+
{
231+
qos->lifespan.sec = dds_qos.lifespan.duration.sec;
232+
qos->lifespan.nsec = dds_qos.lifespan.duration.nanosec;
233+
}
234+
235+
void
236+
dds_qos_lifespan_to_rmw_qos_lifespan(
237+
const DDS::DataReaderQos & /*dds_qos*/,
238+
rmw_qos_profile_t * /*qos*/)
239+
{
240+
// lifespan does does not exist in DataReader, so no-op here
241+
}
242+
243+
template<typename AttributeT>
244+
void
245+
dds_qos_to_rmw_qos(
246+
const AttributeT & dds_qos,
247+
rmw_qos_profile_t * qos)
248+
{
249+
switch (dds_qos.history.kind) {
250+
case DDS_KEEP_LAST_HISTORY_QOS:
251+
qos->history = RMW_QOS_POLICY_HISTORY_KEEP_LAST;
252+
break;
253+
case DDS_KEEP_ALL_HISTORY_QOS:
254+
qos->history = RMW_QOS_POLICY_HISTORY_KEEP_ALL;
255+
break;
256+
default:
257+
qos->history = RMW_QOS_POLICY_HISTORY_UNKNOWN;
258+
break;
259+
}
260+
qos->depth = static_cast<size_t>(dds_qos.history.depth);
261+
262+
switch (dds_qos.reliability.kind) {
263+
case DDS_BEST_EFFORT_RELIABILITY_QOS:
264+
qos->reliability = RMW_QOS_POLICY_RELIABILITY_BEST_EFFORT;
265+
break;
266+
case DDS_RELIABLE_RELIABILITY_QOS:
267+
qos->reliability = RMW_QOS_POLICY_RELIABILITY_RELIABLE;
268+
break;
269+
default:
270+
qos->reliability = RMW_QOS_POLICY_RELIABILITY_UNKNOWN;
271+
break;
272+
}
273+
274+
switch (dds_qos.durability.kind) {
275+
case DDS_TRANSIENT_LOCAL_DURABILITY_QOS:
276+
qos->durability = RMW_QOS_POLICY_DURABILITY_TRANSIENT_LOCAL;
277+
break;
278+
case DDS_VOLATILE_DURABILITY_QOS:
279+
qos->durability = RMW_QOS_POLICY_DURABILITY_VOLATILE;
280+
break;
281+
default:
282+
qos->durability = RMW_QOS_POLICY_DURABILITY_UNKNOWN;
283+
break;
284+
}
285+
286+
qos->deadline.sec = dds_qos.deadline.period.sec;
287+
qos->deadline.nsec = dds_qos.deadline.period.nanosec;
288+
289+
dds_qos_lifespan_to_rmw_qos_lifespan(dds_qos, qos);
290+
291+
switch (dds_qos.liveliness.kind) {
292+
case DDS_AUTOMATIC_LIVELINESS_QOS:
293+
qos->liveliness = RMW_QOS_POLICY_LIVELINESS_AUTOMATIC;
294+
break;
295+
case DDS_MANUAL_BY_PARTICIPANT_LIVELINESS_QOS:
296+
qos->liveliness = RMW_QOS_POLICY_LIVELINESS_MANUAL_BY_NODE;
297+
break;
298+
case DDS_MANUAL_BY_TOPIC_LIVELINESS_QOS:
299+
qos->liveliness = RMW_QOS_POLICY_LIVELINESS_MANUAL_BY_TOPIC;
300+
break;
301+
default:
302+
qos->liveliness = RMW_QOS_POLICY_LIVELINESS_UNKNOWN;
303+
break;
304+
}
305+
qos->liveliness_lease_duration.sec = dds_qos.liveliness.lease_duration.sec;
306+
qos->liveliness_lease_duration.nsec = dds_qos.liveliness.lease_duration.nanosec;
307+
}
308+
309+
template
310+
void dds_qos_to_rmw_qos<DDS::DataWriterQos>(
311+
const DDS::DataWriterQos & dds_qos,
312+
rmw_qos_profile_t * qos);
313+
314+
template
315+
void dds_qos_to_rmw_qos<DDS::DataReaderQos>(
316+
const DDS::DataReaderQos & dds_qos,
317+
rmw_qos_profile_t * qos);

0 commit comments

Comments
 (0)