SMACC2
Loading...
Searching...
No Matches
cp_lifecycle_event_monitor.cpp
Go to the documentation of this file.
1// Copyright 2024 RobosoftAI Inc.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
16
17namespace cl_lifecycle_node
18{
19CpLifecycleEventMonitor::CpLifecycleEventMonitor(std::string nodeName) : nodeName_(nodeName) {}
20
22{
23 // Phase 3: Create subscription to lifecycle transition events
24 const std::string node_transition_event_topic = "/transition_event";
25
26 subscription_ = getNode()->create_subscription<lifecycle_msgs::msg::TransitionEvent>(
27 nodeName_ + node_transition_event_topic, 100,
28 std::bind(&CpLifecycleEventMonitor::onTransitionEvent, this, std::placeholders::_1));
29
30 RCLCPP_INFO(
31 getLogger(), "[CpLifecycleEventMonitor] Subscribed to: %s",
32 (nodeName_ + node_transition_event_topic).c_str());
33}
34
35std::optional<lifecycle_msgs::msg::TransitionEvent>
37{
38 std::lock_guard<std::mutex> lock(eventMutex_);
40 {
42 }
43 return std::nullopt;
44}
45
47 const lifecycle_msgs::msg::TransitionEvent::SharedPtr msg)
48{
49 RCLCPP_INFO(
50 getLogger(), "[CpLifecycleEventMonitor] Transition event: %d -> %d", msg->start_state.id,
51 msg->goal_state.id);
52
53 // Store the event
54 {
55 std::lock_guard<std::mutex> lock(eventMutex_);
57 }
58
59 // Phase 3: Full state-pair matching logic (moved from ClLifecycleNode)
60 // Parse transition events and emit corresponding signals
61
62 // TRANSITION_CONFIGURE
63 if (
64 msg->start_state.id == lifecycle_msgs::msg::State::PRIMARY_STATE_UNCONFIGURED &&
65 msg->goal_state.id == lifecycle_msgs::msg::State::TRANSITION_STATE_CONFIGURING)
66 {
67 RCLCPP_INFO(getLogger(), "TRANSITION_CONFIGURE");
70 }
71 // TRANSITION_CLEANUP
72 else if (
73 msg->start_state.id == lifecycle_msgs::msg::State::PRIMARY_STATE_INACTIVE &&
74 msg->goal_state.id == lifecycle_msgs::msg::State::TRANSITION_STATE_CLEANINGUP)
75 {
76 RCLCPP_INFO(getLogger(), "TRANSITION_CLEANUP");
79 }
80 // TRANSITION_ACTIVATE
81 else if (
82 msg->start_state.id == lifecycle_msgs::msg::State::PRIMARY_STATE_INACTIVE &&
83 msg->goal_state.id == lifecycle_msgs::msg::State::TRANSITION_STATE_ACTIVATING)
84 {
85 RCLCPP_INFO(getLogger(), "TRANSITION_ACTIVATE");
88 }
89 // TRANSITION_DEACTIVATE
90 else if (
91 msg->start_state.id == lifecycle_msgs::msg::State::PRIMARY_STATE_ACTIVE &&
92 msg->goal_state.id == lifecycle_msgs::msg::State::TRANSITION_STATE_DEACTIVATING)
93 {
94 RCLCPP_INFO(getLogger(), "TRANSITION_DEACTIVATE");
97 }
98 // TRANSITION_UNCONFIGURED_SHUTDOWN
99 else if (
100 msg->start_state.id == lifecycle_msgs::msg::State::PRIMARY_STATE_UNCONFIGURED &&
101 msg->goal_state.id == lifecycle_msgs::msg::State::TRANSITION_STATE_SHUTTINGDOWN)
102 {
103 RCLCPP_INFO(getLogger(), "TRANSITION_UNCONFIGURED_SHUTDOWN");
106 }
107 // TRANSITION_INACTIVE_SHUTDOWN
108 else if (
109 msg->start_state.id == lifecycle_msgs::msg::State::PRIMARY_STATE_INACTIVE &&
110 msg->goal_state.id == lifecycle_msgs::msg::State::TRANSITION_STATE_SHUTTINGDOWN)
111 {
112 RCLCPP_INFO(getLogger(), "TRANSITION_INACTIVE_SHUTDOWN");
115 }
116 // TRANSITION_ACTIVE_SHUTDOWN
117 else if (
118 msg->start_state.id == lifecycle_msgs::msg::State::PRIMARY_STATE_ACTIVE &&
119 msg->goal_state.id == lifecycle_msgs::msg::State::TRANSITION_STATE_SHUTTINGDOWN)
120 {
121 RCLCPP_INFO(getLogger(), "TRANSITION_ACTIVE_SHUTDOWN");
124 }
125 // TRANSITION_DESTROY
126 else if (msg->start_state.id == lifecycle_msgs::msg::State::PRIMARY_STATE_FINALIZED)
127 {
128 RCLCPP_INFO(getLogger(), "TRANSITION_DESTROY");
131 }
132 // TRANSITION_ON_CONFIGURE_SUCCESS
133 else if (
134 msg->start_state.id == lifecycle_msgs::msg::State::TRANSITION_STATE_CONFIGURING &&
135 msg->goal_state.id == lifecycle_msgs::msg::State::PRIMARY_STATE_INACTIVE)
136 {
137 RCLCPP_INFO(getLogger(), "TRANSITION_ON_CONFIGURE_SUCCESS");
140 }
141 // TRANSITION_ON_CONFIGURE_FAILURE
142 else if (
143 msg->start_state.id == lifecycle_msgs::msg::State::TRANSITION_STATE_CONFIGURING &&
144 msg->goal_state.id == lifecycle_msgs::msg::State::PRIMARY_STATE_UNCONFIGURED)
145 {
146 RCLCPP_INFO(getLogger(), "TRANSITION_ON_CONFIGURE_FAILURE");
149 }
150 // TRANSITION_ON_CONFIGURE_ERROR
151 if (
152 msg->start_state.id == lifecycle_msgs::msg::State::TRANSITION_STATE_CONFIGURING &&
153 msg->goal_state.id == lifecycle_msgs::msg::State::TRANSITION_STATE_ERRORPROCESSING)
154 {
155 RCLCPP_INFO(getLogger(), "TRANSITION_ON_CONFIGURE_ERROR");
158 }
159 // TRANSITION_ON_CLEANUP_SUCCESS
160 else if (
161 msg->start_state.id == lifecycle_msgs::msg::State::TRANSITION_STATE_CLEANINGUP &&
162 msg->goal_state.id == lifecycle_msgs::msg::State::PRIMARY_STATE_UNCONFIGURED)
163 {
164 RCLCPP_INFO(getLogger(), "TRANSITION_ON_CLEANUP_SUCCESS");
167 }
168 // TRANSITION_ON_CLEANUP_ERROR
169 else if (
170 msg->start_state.id == lifecycle_msgs::msg::State::TRANSITION_STATE_CLEANINGUP &&
171 msg->goal_state.id == lifecycle_msgs::msg::State::TRANSITION_STATE_ERRORPROCESSING)
172 {
173 RCLCPP_INFO(getLogger(), "TRANSITION_ON_CLEANUP_ERROR");
176 }
177 // TRANSITION_ON_ACTIVATE_SUCCESS
178 else if (
179 msg->start_state.id == lifecycle_msgs::msg::State::TRANSITION_STATE_ACTIVATING &&
180 msg->goal_state.id == lifecycle_msgs::msg::State::PRIMARY_STATE_ACTIVE)
181 {
182 RCLCPP_INFO(getLogger(), "TRANSITION_ON_ACTIVATE_SUCCESS");
185 }
186 // TRANSITION_ON_ACTIVATE_FAILURE
187 else if (
188 msg->start_state.id == lifecycle_msgs::msg::State::TRANSITION_STATE_ACTIVATING &&
189 msg->goal_state.id == lifecycle_msgs::msg::State::PRIMARY_STATE_INACTIVE)
190 {
191 RCLCPP_INFO(getLogger(), "TRANSITION_ON_ACTIVATE_FAILURE");
194 }
195 // TRANSITION_ON_ACTIVATE_ERROR
196 else if (
197 msg->start_state.id == lifecycle_msgs::msg::State::TRANSITION_STATE_ACTIVATING &&
198 msg->goal_state.id == lifecycle_msgs::msg::State::TRANSITION_STATE_ERRORPROCESSING)
199 {
200 RCLCPP_INFO(getLogger(), "TRANSITION_ON_ACTIVATE_ERROR");
203 }
204 // TRANSITION_ON_DEACTIVATE_SUCCESS
205 else if (
206 msg->start_state.id == lifecycle_msgs::msg::State::TRANSITION_STATE_DEACTIVATING &&
207 msg->goal_state.id == lifecycle_msgs::msg::State::PRIMARY_STATE_INACTIVE)
208 {
209 RCLCPP_INFO(getLogger(), "TRANSITION_ON_DEACTIVATE_SUCCESS");
212 }
213 // TRANSITION_ON_DEACTIVATE_ERROR
214 else if (
215 msg->start_state.id == lifecycle_msgs::msg::State::TRANSITION_STATE_DEACTIVATING &&
216 msg->goal_state.id == lifecycle_msgs::msg::State::TRANSITION_STATE_ERRORPROCESSING)
217 {
218 RCLCPP_INFO(getLogger(), "TRANSITION_ON_DEACTIVATE_ERROR");
221 }
222 // TRANSITION_ON_SHUTDOWN_SUCCESS
223 else if (
224 msg->start_state.id == lifecycle_msgs::msg::State::TRANSITION_STATE_SHUTTINGDOWN &&
225 msg->goal_state.id == lifecycle_msgs::msg::State::PRIMARY_STATE_FINALIZED)
226 {
227 RCLCPP_INFO(getLogger(), "TRANSITION_ON_SHUTDOWN_SUCCESS");
230 }
231 // TRANSITION_ON_SHUTDOWN_ERROR
232 else if (
233 msg->start_state.id == lifecycle_msgs::msg::State::TRANSITION_STATE_SHUTTINGDOWN &&
234 msg->goal_state.id == lifecycle_msgs::msg::State::TRANSITION_STATE_ERRORPROCESSING)
235 {
236 RCLCPP_INFO(getLogger(), "TRANSITION_ON_SHUTDOWN_ERROR");
239 }
240 // TRANSITION_ON_ERROR_SUCCESS
241 else if (
242 msg->start_state.id == lifecycle_msgs::msg::State::TRANSITION_STATE_ERRORPROCESSING &&
243 msg->goal_state.id == lifecycle_msgs::msg::State::PRIMARY_STATE_UNCONFIGURED)
244 {
245 RCLCPP_INFO(getLogger(), "TRANSITION_ON_ERROR_SUCCESS");
248 }
249 // TRANSITION_ON_ERROR_FAILURE
250 else if (
251 msg->start_state.id == lifecycle_msgs::msg::State::TRANSITION_STATE_ERRORPROCESSING &&
252 msg->goal_state.id == lifecycle_msgs::msg::State::PRIMARY_STATE_FINALIZED)
253 {
254 RCLCPP_INFO(getLogger(), "TRANSITION_ON_ERROR_FAILURE");
257 }
258 // UNKNOWN TRANSITION
259 else
260 {
261 RCLCPP_INFO(getLogger(), "TRANSITION_UNKNOWN");
262 }
263}
264
265} // namespace cl_lifecycle_node
rclcpp::Subscription< lifecycle_msgs::msg::TransitionEvent >::SharedPtr subscription_
CpLifecycleEventMonitor(std::string nodeName)
Constructor with node name.
void onTransitionEvent(const lifecycle_msgs::msg::TransitionEvent::SharedPtr msg)
Callback for transition event subscription.
lifecycle_msgs::msg::TransitionEvent::SharedPtr lastTransitionEvent_
std::optional< lifecycle_msgs::msg::TransitionEvent > getLastTransitionEvent() const
Get the last received transition event.
void onInitialize() override
Component initialization - creates subscription.
rclcpp::Logger getLogger() const
rclcpp::Node::SharedPtr getNode()