construct TimerBase/GenericTimer with Clock (#523)
* construct TimerBase/GenericTimer with Clock * pass rcl_time_point_value_t to rcl_clock_get_now * update docblocks
This commit is contained in:
parent
fba891c0df
commit
4ddb76f466
5 changed files with 49 additions and 15 deletions
|
@ -99,6 +99,10 @@ public:
|
||||||
bool
|
bool
|
||||||
ros_time_is_active();
|
ros_time_is_active();
|
||||||
|
|
||||||
|
RCLCPP_PUBLIC
|
||||||
|
rcl_clock_t *
|
||||||
|
get_clock_handle();
|
||||||
|
|
||||||
RCLCPP_PUBLIC
|
RCLCPP_PUBLIC
|
||||||
rcl_clock_type_t
|
rcl_clock_type_t
|
||||||
get_clock_type();
|
get_clock_type();
|
||||||
|
|
|
@ -23,6 +23,7 @@
|
||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
|
||||||
|
#include "rclcpp/clock.hpp"
|
||||||
#include "rclcpp/function_traits.hpp"
|
#include "rclcpp/function_traits.hpp"
|
||||||
#include "rclcpp/macros.hpp"
|
#include "rclcpp/macros.hpp"
|
||||||
#include "rclcpp/rate.hpp"
|
#include "rclcpp/rate.hpp"
|
||||||
|
@ -44,7 +45,7 @@ public:
|
||||||
RCLCPP_SMART_PTR_DEFINITIONS_NOT_COPYABLE(TimerBase)
|
RCLCPP_SMART_PTR_DEFINITIONS_NOT_COPYABLE(TimerBase)
|
||||||
|
|
||||||
RCLCPP_PUBLIC
|
RCLCPP_PUBLIC
|
||||||
explicit TimerBase(std::chrono::nanoseconds period);
|
explicit TimerBase(Clock::SharedPtr clock, std::chrono::nanoseconds period);
|
||||||
|
|
||||||
RCLCPP_PUBLIC
|
RCLCPP_PUBLIC
|
||||||
~TimerBase();
|
~TimerBase();
|
||||||
|
@ -85,6 +86,7 @@ public:
|
||||||
bool is_ready();
|
bool is_ready();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
Clock::SharedPtr clock_;
|
||||||
std::shared_ptr<rcl_timer_t> timer_handle_;
|
std::shared_ptr<rcl_timer_t> timer_handle_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -92,14 +94,12 @@ protected:
|
||||||
using VoidCallbackType = std::function<void ()>;
|
using VoidCallbackType = std::function<void ()>;
|
||||||
using TimerCallbackType = std::function<void (TimerBase &)>;
|
using TimerCallbackType = std::function<void (TimerBase &)>;
|
||||||
|
|
||||||
/// Generic timer templated on the clock type. Periodically executes a user-specified callback.
|
/// Generic timer. Periodically executes a user-specified callback.
|
||||||
template<
|
template<
|
||||||
typename FunctorT,
|
typename FunctorT,
|
||||||
class Clock,
|
|
||||||
typename std::enable_if<
|
typename std::enable_if<
|
||||||
(rclcpp::function_traits::same_arguments<FunctorT, VoidCallbackType>::value ||
|
rclcpp::function_traits::same_arguments<FunctorT, VoidCallbackType>::value ||
|
||||||
rclcpp::function_traits::same_arguments<FunctorT, TimerCallbackType>::value) &&
|
rclcpp::function_traits::same_arguments<FunctorT, TimerCallbackType>::value
|
||||||
Clock::is_steady
|
|
||||||
>::type * = nullptr
|
>::type * = nullptr
|
||||||
>
|
>
|
||||||
class GenericTimer : public TimerBase
|
class GenericTimer : public TimerBase
|
||||||
|
@ -109,11 +109,14 @@ public:
|
||||||
|
|
||||||
/// Default constructor.
|
/// Default constructor.
|
||||||
/**
|
/**
|
||||||
|
* \param[in] clock The clock providing the current time.
|
||||||
* \param[in] period The interval at which the timer fires.
|
* \param[in] period The interval at which the timer fires.
|
||||||
* \param[in] callback User-specified callback function.
|
* \param[in] callback User-specified callback function.
|
||||||
*/
|
*/
|
||||||
GenericTimer(std::chrono::nanoseconds period, FunctorT && callback)
|
explicit GenericTimer(
|
||||||
: TimerBase(period), callback_(std::forward<FunctorT>(callback))
|
Clock::SharedPtr clock, std::chrono::nanoseconds period, FunctorT && callback
|
||||||
|
)
|
||||||
|
: TimerBase(clock, period), callback_(std::forward<FunctorT>(callback))
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -165,7 +168,7 @@ public:
|
||||||
virtual bool
|
virtual bool
|
||||||
is_steady()
|
is_steady()
|
||||||
{
|
{
|
||||||
return Clock::is_steady;
|
return clock_->get_clock_type() == RCL_STEADY_TIME;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
@ -174,8 +177,26 @@ protected:
|
||||||
FunctorT callback_;
|
FunctorT callback_;
|
||||||
};
|
};
|
||||||
|
|
||||||
template<typename CallbackType>
|
template<
|
||||||
using WallTimer = GenericTimer<CallbackType, std::chrono::steady_clock>;
|
typename FunctorT,
|
||||||
|
typename std::enable_if<
|
||||||
|
rclcpp::function_traits::same_arguments<FunctorT, VoidCallbackType>::value ||
|
||||||
|
rclcpp::function_traits::same_arguments<FunctorT, TimerCallbackType>::value
|
||||||
|
>::type * = nullptr
|
||||||
|
>
|
||||||
|
class WallTimer : public GenericTimer<FunctorT>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
RCLCPP_SMART_PTR_DEFINITIONS(WallTimer)
|
||||||
|
|
||||||
|
explicit WallTimer(std::chrono::nanoseconds period, FunctorT && callback)
|
||||||
|
: GenericTimer<FunctorT>(
|
||||||
|
std::make_shared<Clock>(RCL_STEADY_TIME), period, std::move(callback))
|
||||||
|
{}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
RCLCPP_DISABLE_COPY(WallTimer)
|
||||||
|
};
|
||||||
|
|
||||||
} // namespace rclcpp
|
} // namespace rclcpp
|
||||||
|
|
||||||
|
|
|
@ -77,7 +77,7 @@ Clock::now()
|
||||||
{
|
{
|
||||||
Time now(0, 0, rcl_clock_.type);
|
Time now(0, 0, rcl_clock_.type);
|
||||||
|
|
||||||
auto ret = rcl_clock_get_now(&rcl_clock_, &now.rcl_time_);
|
auto ret = rcl_clock_get_now(&rcl_clock_, &now.rcl_time_.nanoseconds);
|
||||||
if (ret != RCL_RET_OK) {
|
if (ret != RCL_RET_OK) {
|
||||||
rclcpp::exceptions::throw_from_rcl_error(
|
rclcpp::exceptions::throw_from_rcl_error(
|
||||||
ret, "could not get current time stamp");
|
ret, "could not get current time stamp");
|
||||||
|
@ -103,6 +103,12 @@ Clock::ros_time_is_active()
|
||||||
return is_enabled;
|
return is_enabled;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
rcl_clock_t *
|
||||||
|
Clock::get_clock_handle()
|
||||||
|
{
|
||||||
|
return &rcl_clock_;
|
||||||
|
}
|
||||||
|
|
||||||
rcl_clock_type_t
|
rcl_clock_type_t
|
||||||
Clock::get_clock_type()
|
Clock::get_clock_type()
|
||||||
{
|
{
|
||||||
|
|
|
@ -65,7 +65,7 @@ void TimeSource::attachNode(
|
||||||
node_services_ = node_services_interface;
|
node_services_ = node_services_interface;
|
||||||
// TODO(tfoote): Update QOS
|
// TODO(tfoote): Update QOS
|
||||||
|
|
||||||
const std::string & topic_name = "/clock";
|
const std::string topic_name = "/clock";
|
||||||
|
|
||||||
rclcpp::callback_group::CallbackGroup::SharedPtr group;
|
rclcpp::callback_group::CallbackGroup::SharedPtr group;
|
||||||
using rclcpp::message_memory_strategy::MessageMemoryStrategy;
|
using rclcpp::message_memory_strategy::MessageMemoryStrategy;
|
||||||
|
|
|
@ -22,8 +22,10 @@
|
||||||
|
|
||||||
using rclcpp::TimerBase;
|
using rclcpp::TimerBase;
|
||||||
|
|
||||||
TimerBase::TimerBase(std::chrono::nanoseconds period)
|
TimerBase::TimerBase(rclcpp::Clock::SharedPtr clock, std::chrono::nanoseconds period)
|
||||||
{
|
{
|
||||||
|
clock_ = clock;
|
||||||
|
|
||||||
timer_handle_ = std::shared_ptr<rcl_timer_t>(
|
timer_handle_ = std::shared_ptr<rcl_timer_t>(
|
||||||
new rcl_timer_t, [ = ](rcl_timer_t * timer)
|
new rcl_timer_t, [ = ](rcl_timer_t * timer)
|
||||||
{
|
{
|
||||||
|
@ -38,8 +40,9 @@ TimerBase::TimerBase(std::chrono::nanoseconds period)
|
||||||
|
|
||||||
*timer_handle_.get() = rcl_get_zero_initialized_timer();
|
*timer_handle_.get() = rcl_get_zero_initialized_timer();
|
||||||
|
|
||||||
|
rcl_clock_t * clock_handle = clock_->get_clock_handle();
|
||||||
if (rcl_timer_init(
|
if (rcl_timer_init(
|
||||||
timer_handle_.get(), period.count(), nullptr,
|
timer_handle_.get(), clock_handle, period.count(), nullptr,
|
||||||
rcl_get_default_allocator()) != RCL_RET_OK)
|
rcl_get_default_allocator()) != RCL_RET_OK)
|
||||||
{
|
{
|
||||||
RCUTILS_LOG_ERROR_NAMED(
|
RCUTILS_LOG_ERROR_NAMED(
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue