Skip to content

Commit 46892f5

Browse files
authored
Improved conversion of time values between ROS and DDS formats (#43)
* Improved conversion of time values between ROS and DDS formats * Account for no lifespan when converting reader qos * Adjust guard for LifespanQosPolicy Signed-off-by: Andrea Sorbini <[email protected]>
1 parent 92234d1 commit 46892f5

File tree

1 file changed

+53
-46
lines changed

1 file changed

+53
-46
lines changed

rmw_connextdds_common/src/common/rmw_impl.cpp

Lines changed: 53 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
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+
247277
rmw_ret_t
248278
rmw_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

Comments
 (0)