Skip to content

Commit c076ade

Browse files
Merge pull request #114 from AutoModality/AM-631/super-responds-to-error
Am 631/super responds to lifecycle error
2 parents 330bb43 + ae74e90 commit c076ade

File tree

5 files changed

+50
-4
lines changed

5 files changed

+50
-4
lines changed

include/am_super/super_node_mediator.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,9 @@ class SuperNodeMediator
7272

7373
/** Last state of the controller received */
7474
ControllerState last_controller_state_received;
75+
76+
/** Signals if any of the manifested nodes status errored */
77+
bool status_error = false;
7578
};
7679

7780
/**Encapsulates properties and methods that relate to the transition of states
@@ -183,6 +186,9 @@ class SuperNodeMediator
183186
*/
184187
StateTransition getStateTransition(const Supervisor &supervisor);
185188

189+
/** returns a state transition that should be attempted when a LifeCycleError has occured. */
190+
StateTransition getErrorTransition();
191+
186192
/**
187193
* @return Default StateTransition with all of its fields at default. A transition is valid if it's values aren't default
188194
*/

rostest/error_status/error_status_rostest.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ TEST_F(LifeCycleErrorTest, testStatus_Error)
1818
//LifeCycle State and Status should go error for this node
1919
waitUntilStatus(LifeCycleStatus::ERROR);
2020
waitUntil(LifeCycleState::ERROR_PROCESSING);
21+
waitUntilMissionState(brain_box_msgs::VxState::SHUTDOWN);
2122
}
2223

2324
int main(int argc, char** argv)

src/am_super/am_super.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -342,6 +342,10 @@ class AMSuper : AMLifeCycle
342342
ROS_INFO_STREAM(node_name << " changed status to = " << life_cycle_mediator_.statusToString(status));
343343
nr.status = status;
344344
nodes_changed = true;
345+
if(status == LifeCycleStatus::ERROR)
346+
{
347+
supervisor_.status_error = true;
348+
}
345349
}
346350
if (nr.pid != pid)
347351
{
@@ -567,8 +571,9 @@ class AMSuper : AMLifeCycle
567571
}
568572
else
569573
{
570-
// ask the mediator to check with the supervisor
574+
571575
SuperNodeMediator::TransitionInstructions transition_instructions = node_mediator_.transitionReady(supervisor_);
576+
572577
if (transition_instructions.ready_for_transition)
573578
{
574579
setSystemState(transition_instructions.new_state);

src/am_super/super_node_mediator.cpp

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,11 @@ SuperNodeMediator::StateTransition SuperNodeMediator::getStateTransition(const S
124124
return invalidTransition();
125125
}
126126

127+
SuperNodeMediator::StateTransition SuperNodeMediator::getErrorTransition()
128+
{
129+
return {SuperState::SHUTDOWN, SuperNodeMediator::checkNodesShuttingDownOrFinalized, LifeCycleCommand::SHUTDOWN};
130+
}
131+
127132
SuperNodeMediator::StateTransition SuperNodeMediator::invalidTransition()
128133
{
129134
return StateTransition();
@@ -143,8 +148,17 @@ SuperNodeMediator::TransitionInstructions SuperNodeMediator::transitionReady(Sup
143148

144149
// only check those states registered with state_transitions
145150
if (state_transitions_.count(supervisor.system_state))
146-
{
147-
StateTransition transition = getStateTransition(supervisor);
151+
{
152+
StateTransition transition;
153+
154+
if(supervisor.status_error)
155+
{
156+
transition = getErrorTransition();
157+
}
158+
else
159+
{
160+
transition = getStateTransition(supervisor);
161+
}
148162
// each state has a check method providing the logic that should cause transition (based on manifest nodes
149163
// lifecycle)
150164
// some transitions happen only when check fails (mostly to abort)

test/transition_ready_unit_tests.cpp

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,15 @@ class TransitionReady : public ::testing::Test
3434
SuperNodeMediator::SuperFltCtrlState flt_ctrl_state, bool expected_ready,
3535
SuperState expected_state, bool expected_resend_life_cycle_command,
3636
LifeCycleCommand life_cycle_command, OperatorCommand last_op_command_received = OperatorCommand::ARM,
37-
ControllerState last_controller_state_received = SuperNodeMediator::StateTransition::NO_CONTROLLER_STATE)
37+
ControllerState last_controller_state_received = SuperNodeMediator::StateTransition::NO_CONTROLLER_STATE,
38+
bool status_error = false)
3839
{
3940
SuperNodeMediator::Supervisor supervisor;
4041
supervisor.system_state = from;
4142
supervisor.flt_ctrl_state = flt_ctrl_state;
4243
supervisor.last_op_command_received = last_op_command_received;
4344
supervisor.last_controller_state_received = last_controller_state_received;
45+
supervisor.status_error = status_error;
4446

4547
{
4648
SuperNodeMediator::SuperNodeInfo node = manifested_online_node_fixture();
@@ -215,6 +217,24 @@ TEST_F(TransitionReady, TransitionReady_AbortToDisarmingOnControllerStateComplet
215217
ControllerState::COMPLETED);
216218
}
217219

220+
TEST_F(TransitionReady, TransitionReady_AnyStateToShutdownOnStatusError_AllNodesShuttingDownOrFinalized)
221+
{
222+
ASSERT_TRANSITION_READY(superNodeMediator, SuperState::BOOTING, LifeCycleState::FINALIZED,
223+
(SuperNodeMediator::SuperFltCtrlState)NULL, true, SuperState::SHUTDOWN,
224+
false, (LifeCycleCommand)NULL, SuperNodeMediator::StateTransition::NO_OPERATOR_COMMAND,
225+
SuperNodeMediator::StateTransition::NO_CONTROLLER_STATE, true);
226+
227+
ASSERT_TRANSITION_READY(superNodeMediator, SuperState::READY, LifeCycleState::SHUTTING_DOWN,
228+
(SuperNodeMediator::SuperFltCtrlState)NULL, true, SuperState::SHUTDOWN,
229+
false, (LifeCycleCommand)NULL, SuperNodeMediator::StateTransition::NO_OPERATOR_COMMAND,
230+
SuperNodeMediator::StateTransition::NO_CONTROLLER_STATE, true);
231+
232+
ASSERT_TRANSITION_READY(superNodeMediator, SuperState::ARMED, LifeCycleState::SHUTTING_DOWN,
233+
(SuperNodeMediator::SuperFltCtrlState)NULL, true, SuperState::SHUTDOWN,
234+
false, (LifeCycleCommand)NULL, SuperNodeMediator::StateTransition::NO_OPERATOR_COMMAND,
235+
SuperNodeMediator::StateTransition::NO_CONTROLLER_STATE, true);
236+
}
237+
218238
TEST_F(TransitionReady, DISABLED_transitionReady_AutoToAbortWhenDeactivated)
219239
{
220240
ASSERT_TRANSITION_READY(superNodeMediator, SuperState::AUTO, LifeCycleState::INACTIVE, true, SuperState::ABORT);

0 commit comments

Comments
 (0)