1919#include < vector>
2020#include < stdexcept>
2121
22+ #include " rmw_dds_common/time_utils.hpp"
23+
2224#include " rmw_connextdds/graph_cache.hpp"
2325
2426#define ROS_SERVICE_REQUESTER_PREFIX_STR " rq"
@@ -244,6 +246,34 @@ dds_qos_policy_to_rmw_qos_policy(const DDS_QosPolicyId_t last_policy_id)
244246 return RMW_QOS_POLICY_INVALID;
245247}
246248
249+ static
250+ DDS_Duration_t
251+ rmw_time_to_dds_duration (const rmw_time_t & time)
252+ {
253+ if (rmw_time_equal (time, RMW_DURATION_INFINITE)) {
254+ return DDS_DURATION_INFINITE;
255+ }
256+ // Use rmw_dds_common::clamp_rmw_time_to_dds_time() to make sure value doesn't
257+ // exceed the valid domain for DDS_Duration_t.
258+ const rmw_time_t ctime = rmw_dds_common::clamp_rmw_time_to_dds_time (time);
259+ DDS_Duration_t duration;
260+ duration.sec = static_cast <DDS_Long>(ctime.sec );
261+ duration.nanosec = static_cast <DDS_UnsignedLong>(ctime.nsec );
262+ return duration;
263+ }
264+
265+ static
266+ rmw_time_t
267+ dds_duration_to_rmw_time (const DDS_Duration_t & duration)
268+ {
269+ if (DDS_Duration_is_infinite (&duration)) {
270+ return RMW_DURATION_INFINITE;
271+ }
272+ assert (duration.sec > 0 );
273+ rmw_time_t result = {static_cast <uint64_t >(duration.sec ), duration.nanosec };
274+ return result;
275+ }
276+
247277rmw_ret_t
248278rmw_connextdds_get_readerwriter_qos (
249279 const bool writer_qos,
@@ -360,21 +390,13 @@ rmw_connextdds_get_readerwriter_qos(
360390 }
361391 }
362392
363- if (qos_policies->deadline .sec != 0 || qos_policies->deadline .nsec != 0 ) {
364- deadline->period .sec =
365- static_cast <DDS_Long>(qos_policies->deadline .sec );
366- deadline->period .nanosec =
367- static_cast <DDS_UnsignedLong>(qos_policies->deadline .nsec );
393+ if (!rmw_time_equal (qos_policies->deadline , RMW_DURATION_UNSPECIFIED)) {
394+ deadline->period = rmw_time_to_dds_duration (qos_policies->deadline );
368395 }
369396
370- if (qos_policies->liveliness_lease_duration .sec != 0 ||
371- qos_policies->liveliness_lease_duration .nsec != 0 )
372- {
373- liveliness->lease_duration .sec =
374- static_cast <DDS_Long>(qos_policies->liveliness_lease_duration .sec );
375- liveliness->lease_duration .nanosec =
376- static_cast <DDS_UnsignedLong>(
377- qos_policies->liveliness_lease_duration .nsec );
397+ if (!rmw_time_equal (qos_policies->liveliness_lease_duration , RMW_DURATION_UNSPECIFIED)) {
398+ liveliness->lease_duration =
399+ rmw_time_to_dds_duration (qos_policies->liveliness_lease_duration );
378400 }
379401
380402 switch (qos_policies->liveliness ) {
@@ -401,32 +423,19 @@ rmw_connextdds_get_readerwriter_qos(
401423 }
402424 }
403425
404- if (nullptr != lifespan &&
405- (qos_policies->lifespan .sec != 0 || qos_policies->lifespan .nsec != 0 ))
426+ // LifespanQosPolicy is a writer-only policy, so `lifespan` might be NULL.
427+ // Micro does not support this policy, so the value will always be NULL.
428+ #if RMW_CONNEXT_DDS_API == RMW_CONNEXT_DDS_API_MICRO
429+ assert (nullptr == lifespan);
430+ #else /* RMW_CONNEXT_DDS_API == RMW_CONNEXT_DDS_API_PRO */
431+ if (lifespan != nullptr &&
432+ !rmw_time_equal (qos_policies->lifespan , RMW_DURATION_UNSPECIFIED))
406433 {
407- #if RMW_CONNEXT_DDS_API == RMW_CONNEXT_DDS_API_PRO
408- lifespan->duration .sec = static_cast <DDS_Long>(qos_policies->lifespan .sec );
409- lifespan->duration .nanosec =
410- static_cast <DDS_UnsignedLong>(qos_policies->lifespan .nsec );
411- #else
412- RMW_CONNEXT_LOG_WARNING (" lifespan qos policy not supported" )
413- #endif /* RMW_CONNEXT_DDS_API == RMW_CONNEXT_DDS_API_PRO */
434+ // Guard access to type since it's not defined by Micro (only forward declared
435+ // by rmw_connextdds/dds_api_rtime.hpp)
436+ lifespan->duration = rmw_time_to_dds_duration (qos_policies->lifespan );
414437 }
415-
416- // Make sure that resource limits are consistent with history qos
417- // TODO(asorbini): do not overwrite if using non-default QoS
418- // if (history->kind == DDS_KEEP_LAST_HISTORY_QOS &&
419- // history->depth > 1 &&
420- // resource_limits->max_samples_per_instance == DDS_LENGTH_UNLIMITED)
421- // {
422- // resource_limits->max_samples_per_instance = history->depth;
423- // if (resource_limits->max_samples != DDS_LENGTH_UNLIMITED &&
424- // resource_limits->max_samples < resource_limits->max_samples_per_instance)
425- // {
426- // resource_limits->max_samples =
427- // resource_limits->max_samples_per_instance;
428- // }
429- // }
438+ #endif /* RMW_CONNEXT_DDS_API == RMW_CONNEXT_DDS_API_PRO */
430439
431440 return RMW_RET_OK;
432441}
@@ -501,13 +510,10 @@ rmw_connextdds_readerwriter_qos_to_ros(
501510 }
502511 }
503512
504- qos_policies->deadline .sec = deadline->period .sec ;
505- qos_policies->deadline .nsec = deadline->period .nanosec ;
513+ qos_policies->deadline = dds_duration_to_rmw_time (deadline->period );
506514
507- qos_policies->liveliness_lease_duration .sec =
508- liveliness->lease_duration .sec ;
509- qos_policies->liveliness_lease_duration .nsec =
510- liveliness->lease_duration .nanosec ;
515+ qos_policies->liveliness_lease_duration =
516+ dds_duration_to_rmw_time (liveliness->lease_duration );
511517
512518 switch (liveliness->kind ) {
513519 case DDS_AUTOMATIC_LIVELINESS_QOS:
@@ -530,10 +536,11 @@ rmw_connextdds_readerwriter_qos_to_ros(
530536
531537 if (nullptr != lifespan) {
532538#if RMW_CONNEXT_DDS_API == RMW_CONNEXT_DDS_API_PRO
533- qos_policies->lifespan .sec = lifespan->duration .sec ;
534- qos_policies->lifespan .nsec = lifespan->duration .nanosec ;
539+ qos_policies->lifespan = dds_duration_to_rmw_time (lifespan->duration );
535540#else
536- RMW_CONNEXT_LOG_WARNING (" lifespan qos policy not supported" )
541+ // Only emit a debug message in this case, since we don't want to pollute the
542+ // output too much. We print a warning when going from ROS to DDS.
543+ RMW_CONNEXT_LOG_DEBUG (" lifespan qos policy not supported" )
537544#endif /* RMW_CONNEXT_DDS_API == RMW_CONNEXT_DDS_API_PRO */
538545 }
539546
0 commit comments