Skip to content

Commit 052596c

Browse files
make rcl_lifecyle_com_interface optional in lifecycle nodes (#1507)
* make rcl_com_interface optional Signed-off-by: Karsten Knese <[email protected]> * Update rclcpp_lifecycle/test/mocking_utils/patch.hpp Co-authored-by: Tomoya Fujita <[email protected]> * line break Signed-off-by: Karsten Knese <[email protected]> * use state_machine_options Signed-off-by: Karsten Knese <[email protected]> Co-authored-by: Tomoya Fujita <[email protected]>
1 parent 182ad38 commit 052596c

File tree

5 files changed

+135
-98
lines changed

5 files changed

+135
-98
lines changed

rclcpp_lifecycle/include/rclcpp_lifecycle/lifecycle_node.hpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,23 +127,27 @@ class LifecycleNode : public node_interfaces::LifecycleNodeInterface,
127127
/**
128128
* \param[in] node_name Name of the node.
129129
* \param[in] options Additional options to control creation of the node.
130+
* \param[in] enable_communication_interface Deciding whether the communication interface of the underlying rcl_lifecycle_node shall be enabled.
130131
*/
131132
RCLCPP_LIFECYCLE_PUBLIC
132133
explicit LifecycleNode(
133134
const std::string & node_name,
134-
const rclcpp::NodeOptions & options = rclcpp::NodeOptions());
135+
const rclcpp::NodeOptions & options = rclcpp::NodeOptions(),
136+
bool enable_communication_interface = true);
135137

136138
/// Create a node based on the node name and a rclcpp::Context.
137139
/**
138140
* \param[in] node_name Name of the node.
139141
* \param[in] namespace_ Namespace of the node.
140142
* \param[in] options Additional options to control creation of the node.
143+
* \param[in] enable_communication_interface Deciding whether the communication interface of the underlying rcl_lifecycle_node shall be enabled.
141144
*/
142145
RCLCPP_LIFECYCLE_PUBLIC
143146
LifecycleNode(
144147
const std::string & node_name,
145148
const std::string & namespace_,
146-
const rclcpp::NodeOptions & options = rclcpp::NodeOptions());
149+
const rclcpp::NodeOptions & options = rclcpp::NodeOptions(),
150+
bool enable_communication_interface = true);
147151

148152
RCLCPP_LIFECYCLE_PUBLIC
149153
virtual ~LifecycleNode();

rclcpp_lifecycle/src/lifecycle_node.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,17 +47,20 @@ namespace rclcpp_lifecycle
4747

4848
LifecycleNode::LifecycleNode(
4949
const std::string & node_name,
50-
const rclcpp::NodeOptions & options)
50+
const rclcpp::NodeOptions & options,
51+
bool enable_communication_interface)
5152
: LifecycleNode(
5253
node_name,
5354
"",
54-
options)
55+
options,
56+
enable_communication_interface)
5557
{}
5658

5759
LifecycleNode::LifecycleNode(
5860
const std::string & node_name,
5961
const std::string & namespace_,
60-
const rclcpp::NodeOptions & options)
62+
const rclcpp::NodeOptions & options,
63+
bool enable_communication_interface)
6164
: node_base_(new rclcpp::node_interfaces::NodeBase(
6265
node_name,
6366
namespace_,
@@ -105,7 +108,7 @@ LifecycleNode::LifecycleNode(
105108
node_options_(options),
106109
impl_(new LifecycleNodeInterfaceImpl(node_base_, node_services_))
107110
{
108-
impl_->init();
111+
impl_->init(enable_communication_interface);
109112

110113
register_on_configure(
111114
std::bind(

rclcpp_lifecycle/src/lifecycle_node_interface_impl.hpp

Lines changed: 89 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,11 @@ class LifecycleNode::LifecycleNodeInterfaceImpl
6363

6464
~LifecycleNodeInterfaceImpl()
6565
{
66+
fprintf(stderr, "oh yeah destructuro\n");
6667
rcl_node_t * node_handle = node_base_interface_->get_rcl_node_handle();
67-
const rcl_node_options_t * node_options = rcl_node_get_options(node_handle);
68-
auto ret = rcl_lifecycle_state_machine_fini(
69-
&state_machine_, node_handle, &node_options->allocator);
68+
fprintf(stderr, "oh yeah end destructuro\n");
69+
auto ret = rcl_lifecycle_state_machine_fini(&state_machine_, node_handle);
70+
fprintf(stderr, "oh yeah end destructuro222\n");
7071
if (ret != RCL_RET_OK) {
7172
RCUTILS_LOG_FATAL_NAMED(
7273
"rclcpp_lifecycle",
@@ -75,12 +76,16 @@ class LifecycleNode::LifecycleNodeInterfaceImpl
7576
}
7677

7778
void
78-
init()
79+
init(bool enable_communication_interface = true)
7980
{
8081
rcl_node_t * node_handle = node_base_interface_->get_rcl_node_handle();
8182
const rcl_node_options_t * node_options =
8283
rcl_node_get_options(node_base_interface_->get_rcl_node_handle());
8384
state_machine_ = rcl_lifecycle_get_zero_initialized_state_machine();
85+
auto state_machine_options = rcl_lifecycle_get_default_state_machine_options();
86+
state_machine_options.enable_com_interface = enable_communication_interface;
87+
state_machine_options.allocator = node_options->allocator;
88+
8489
// The call to initialize the state machine takes
8590
// currently five different typesupports for all publishers/services
8691
// created within the RCL_LIFECYCLE structure.
@@ -96,94 +101,96 @@ class LifecycleNode::LifecycleNodeInterfaceImpl
96101
rosidl_typesupport_cpp::get_service_type_support_handle<GetAvailableStatesSrv>(),
97102
rosidl_typesupport_cpp::get_service_type_support_handle<GetAvailableTransitionsSrv>(),
98103
rosidl_typesupport_cpp::get_service_type_support_handle<GetAvailableTransitionsSrv>(),
99-
true,
100-
&node_options->allocator);
104+
&state_machine_options);
101105
if (ret != RCL_RET_OK) {
106+
fprintf(stderr, "oh yeah %s\n", node_base_interface_->get_name());
102107
throw std::runtime_error(
103108
std::string("Couldn't initialize state machine for node ") +
104109
node_base_interface_->get_name());
105110
}
106111

107-
{ // change_state
108-
auto cb = std::bind(
109-
&LifecycleNodeInterfaceImpl::on_change_state, this,
110-
std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);
111-
rclcpp::AnyServiceCallback<ChangeStateSrv> any_cb;
112-
any_cb.set(std::move(cb));
113-
114-
srv_change_state_ = std::make_shared<rclcpp::Service<ChangeStateSrv>>(
115-
node_base_interface_->get_shared_rcl_node_handle(),
116-
&state_machine_.com_interface.srv_change_state,
117-
any_cb);
118-
node_services_interface_->add_service(
119-
std::dynamic_pointer_cast<rclcpp::ServiceBase>(srv_change_state_),
120-
nullptr);
121-
}
112+
if (enable_communication_interface) {
113+
{ // change_state
114+
auto cb = std::bind(
115+
&LifecycleNodeInterfaceImpl::on_change_state, this,
116+
std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);
117+
rclcpp::AnyServiceCallback<ChangeStateSrv> any_cb;
118+
any_cb.set(std::move(cb));
119+
120+
srv_change_state_ = std::make_shared<rclcpp::Service<ChangeStateSrv>>(
121+
node_base_interface_->get_shared_rcl_node_handle(),
122+
&state_machine_.com_interface.srv_change_state,
123+
any_cb);
124+
node_services_interface_->add_service(
125+
std::dynamic_pointer_cast<rclcpp::ServiceBase>(srv_change_state_),
126+
nullptr);
127+
}
122128

123-
{ // get_state
124-
auto cb = std::bind(
125-
&LifecycleNodeInterfaceImpl::on_get_state, this,
126-
std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);
127-
rclcpp::AnyServiceCallback<GetStateSrv> any_cb;
128-
any_cb.set(std::move(cb));
129-
130-
srv_get_state_ = std::make_shared<rclcpp::Service<GetStateSrv>>(
131-
node_base_interface_->get_shared_rcl_node_handle(),
132-
&state_machine_.com_interface.srv_get_state,
133-
any_cb);
134-
node_services_interface_->add_service(
135-
std::dynamic_pointer_cast<rclcpp::ServiceBase>(srv_get_state_),
136-
nullptr);
137-
}
129+
{ // get_state
130+
auto cb = std::bind(
131+
&LifecycleNodeInterfaceImpl::on_get_state, this,
132+
std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);
133+
rclcpp::AnyServiceCallback<GetStateSrv> any_cb;
134+
any_cb.set(std::move(cb));
135+
136+
srv_get_state_ = std::make_shared<rclcpp::Service<GetStateSrv>>(
137+
node_base_interface_->get_shared_rcl_node_handle(),
138+
&state_machine_.com_interface.srv_get_state,
139+
any_cb);
140+
node_services_interface_->add_service(
141+
std::dynamic_pointer_cast<rclcpp::ServiceBase>(srv_get_state_),
142+
nullptr);
143+
}
138144

139-
{ // get_available_states
140-
auto cb = std::bind(
141-
&LifecycleNodeInterfaceImpl::on_get_available_states, this,
142-
std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);
143-
rclcpp::AnyServiceCallback<GetAvailableStatesSrv> any_cb;
144-
any_cb.set(std::move(cb));
145-
146-
srv_get_available_states_ = std::make_shared<rclcpp::Service<GetAvailableStatesSrv>>(
147-
node_base_interface_->get_shared_rcl_node_handle(),
148-
&state_machine_.com_interface.srv_get_available_states,
149-
any_cb);
150-
node_services_interface_->add_service(
151-
std::dynamic_pointer_cast<rclcpp::ServiceBase>(srv_get_available_states_),
152-
nullptr);
153-
}
145+
{ // get_available_states
146+
auto cb = std::bind(
147+
&LifecycleNodeInterfaceImpl::on_get_available_states, this,
148+
std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);
149+
rclcpp::AnyServiceCallback<GetAvailableStatesSrv> any_cb;
150+
any_cb.set(std::move(cb));
151+
152+
srv_get_available_states_ = std::make_shared<rclcpp::Service<GetAvailableStatesSrv>>(
153+
node_base_interface_->get_shared_rcl_node_handle(),
154+
&state_machine_.com_interface.srv_get_available_states,
155+
any_cb);
156+
node_services_interface_->add_service(
157+
std::dynamic_pointer_cast<rclcpp::ServiceBase>(srv_get_available_states_),
158+
nullptr);
159+
}
154160

155-
{ // get_available_transitions
156-
auto cb = std::bind(
157-
&LifecycleNodeInterfaceImpl::on_get_available_transitions, this,
158-
std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);
159-
rclcpp::AnyServiceCallback<GetAvailableTransitionsSrv> any_cb;
160-
any_cb.set(std::move(cb));
161-
162-
srv_get_available_transitions_ =
163-
std::make_shared<rclcpp::Service<GetAvailableTransitionsSrv>>(
164-
node_base_interface_->get_shared_rcl_node_handle(),
165-
&state_machine_.com_interface.srv_get_available_transitions,
166-
any_cb);
167-
node_services_interface_->add_service(
168-
std::dynamic_pointer_cast<rclcpp::ServiceBase>(srv_get_available_transitions_),
169-
nullptr);
170-
}
161+
{ // get_available_transitions
162+
auto cb = std::bind(
163+
&LifecycleNodeInterfaceImpl::on_get_available_transitions, this,
164+
std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);
165+
rclcpp::AnyServiceCallback<GetAvailableTransitionsSrv> any_cb;
166+
any_cb.set(std::move(cb));
167+
168+
srv_get_available_transitions_ =
169+
std::make_shared<rclcpp::Service<GetAvailableTransitionsSrv>>(
170+
node_base_interface_->get_shared_rcl_node_handle(),
171+
&state_machine_.com_interface.srv_get_available_transitions,
172+
any_cb);
173+
node_services_interface_->add_service(
174+
std::dynamic_pointer_cast<rclcpp::ServiceBase>(srv_get_available_transitions_),
175+
nullptr);
176+
}
171177

172-
{ // get_transition_graph
173-
auto cb = std::bind(
174-
&LifecycleNodeInterfaceImpl::on_get_transition_graph, this,
175-
std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);
176-
rclcpp::AnyServiceCallback<GetAvailableTransitionsSrv> any_cb;
177-
any_cb.set(std::move(cb));
178-
179-
srv_get_transition_graph_ =
180-
std::make_shared<rclcpp::Service<GetAvailableTransitionsSrv>>(
181-
node_base_interface_->get_shared_rcl_node_handle(),
182-
&state_machine_.com_interface.srv_get_transition_graph,
183-
any_cb);
184-
node_services_interface_->add_service(
185-
std::dynamic_pointer_cast<rclcpp::ServiceBase>(srv_get_transition_graph_),
186-
nullptr);
178+
{ // get_transition_graph
179+
auto cb = std::bind(
180+
&LifecycleNodeInterfaceImpl::on_get_transition_graph, this,
181+
std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);
182+
rclcpp::AnyServiceCallback<GetAvailableTransitionsSrv> any_cb;
183+
any_cb.set(std::move(cb));
184+
185+
srv_get_transition_graph_ =
186+
std::make_shared<rclcpp::Service<GetAvailableTransitionsSrv>>(
187+
node_base_interface_->get_shared_rcl_node_handle(),
188+
&state_machine_.com_interface.srv_get_transition_graph,
189+
any_cb);
190+
node_services_interface_->add_service(
191+
std::dynamic_pointer_cast<rclcpp::ServiceBase>(srv_get_transition_graph_),
192+
nullptr);
193+
}
187194
}
188195
}
189196

rclcpp_lifecycle/test/mocking_utils/patch.hpp

Lines changed: 32 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,27 @@ struct PatchTraits<ID, ReturnT(ArgT0, ArgT1, ArgT2, ArgT3, ArgT4, ArgT5)>
234234
mock_type, ReturnT, ArgT0, ArgT1, ArgT2, ArgT3, ArgT4, ArgT5);
235235
};
236236

237-
/// Traits specialization for void(ArgT0, ArgT1, ArgT2, ArgT3, ArgT4, ArgT5, ArgT6, ArgT7)
237+
/// Traits specialization for void(ArgT0, ArgT1, ArgT2, ArgT3, ArgT4, ArgT5)
238+
/// free functions.
239+
/**
240+
* Necessary for Mimick macros to adjust accordingly when the return
241+
* type is `void`.
242+
*
243+
* \tparam ID Numerical identifier of the patch. Ought to be unique.
244+
* \tparam ArgTx Argument types.
245+
*/
246+
template<size_t ID,
247+
typename ArgT0, typename ArgT1,
248+
typename ArgT2, typename ArgT3,
249+
typename ArgT4, typename ArgT5>
250+
struct PatchTraits<ID, void(ArgT0, ArgT1, ArgT2, ArgT3, ArgT4, ArgT5)>
251+
{
252+
mmk_mock_define(
253+
mock_type, void, ArgT0, ArgT1, ArgT2, ArgT3, ArgT4, ArgT5);
254+
};
255+
256+
/// Traits specialization for
257+
/// ReturnT(ArgT0, ArgT1, ArgT2, ArgT3, ArgT4, ArgT5, ArgT6, ArgT7, ArgT8)
238258
/// free functions.
239259
/**
240260
* Necessary for Mimick macros to adjust accordingly when the return
@@ -248,15 +268,15 @@ template<size_t ID, typename ReturnT,
248268
typename ArgT2, typename ArgT3,
249269
typename ArgT4, typename ArgT5,
250270
typename ArgT6, typename ArgT7,
251-
typename ArgT8, typename ArgT9>
271+
typename ArgT8>
252272
struct PatchTraits<ID, ReturnT(
253-
ArgT0, ArgT1, ArgT2, ArgT3, ArgT4, ArgT5, ArgT6, ArgT7, ArgT8, ArgT9)>
273+
ArgT0, ArgT1, ArgT2, ArgT3, ArgT4, ArgT5, ArgT6, ArgT7, ArgT8)>
254274
{
255275
mmk_mock_define(
256-
mock_type, ReturnT, ArgT0, ArgT1, ArgT2, ArgT3, ArgT4, ArgT5, ArgT6, ArgT7, ArgT8, ArgT9);
276+
mock_type, ReturnT, ArgT0, ArgT1, ArgT2, ArgT3, ArgT4, ArgT5, ArgT6, ArgT7, ArgT8);
257277
};
258278

259-
/// Traits specialization for void(ArgT0, ArgT1, ArgT2, ArgT3, ArgT4, ArgT5)
279+
/// Traits specialization for void(ArgT0, ArgT1, ArgT2, ArgT3, ArgT4, ArgT5, ArgT6, ArgT7)
260280
/// free functions.
261281
/**
262282
* Necessary for Mimick macros to adjust accordingly when the return
@@ -265,14 +285,17 @@ struct PatchTraits<ID, ReturnT(
265285
* \tparam ID Numerical identifier of the patch. Ought to be unique.
266286
* \tparam ArgTx Argument types.
267287
*/
268-
template<size_t ID,
288+
template<size_t ID, typename ReturnT,
269289
typename ArgT0, typename ArgT1,
270290
typename ArgT2, typename ArgT3,
271-
typename ArgT4, typename ArgT5>
272-
struct PatchTraits<ID, void(ArgT0, ArgT1, ArgT2, ArgT3, ArgT4, ArgT5)>
291+
typename ArgT4, typename ArgT5,
292+
typename ArgT6, typename ArgT7,
293+
typename ArgT8, typename ArgT9>
294+
struct PatchTraits<ID, ReturnT(
295+
ArgT0, ArgT1, ArgT2, ArgT3, ArgT4, ArgT5, ArgT6, ArgT7, ArgT8, ArgT9)>
273296
{
274297
mmk_mock_define(
275-
mock_type, void, ArgT0, ArgT1, ArgT2, ArgT3, ArgT4, ArgT5);
298+
mock_type, ReturnT, ArgT0, ArgT1, ArgT2, ArgT3, ArgT4, ArgT5, ArgT6, ArgT7, ArgT8, ArgT9);
276299
};
277300

278301
/// Generic trampoline to wrap generalized callables in plain functions.

rclcpp_lifecycle/test/test_lifecycle_node.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ TEST_F(TestDefaultStateMachine, empty_initializer) {
152152

153153
TEST_F(TestDefaultStateMachine, empty_initializer_rcl_errors) {
154154
{
155-
auto patch = mocking_utils::patch_and_return(
155+
auto patch = mocking_utils::inject_on_return(
156156
"lib:rclcpp_lifecycle", rcl_lifecycle_state_machine_init, RCL_RET_ERROR);
157157
EXPECT_THROW(
158158
std::make_shared<EmptyLifecycleNode>("testnode").reset(),

0 commit comments

Comments
 (0)