Skip to content

Commit b9f7b8f

Browse files
committed
commander failsafe: never override user intended termination + unit test
1 parent 82569aa commit b9f7b8f

File tree

2 files changed

+27
-1
lines changed

2 files changed

+27
-1
lines changed

src/modules/commander/failsafe/failsafe_test.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -432,3 +432,28 @@ TEST_F(FailsafeTest, skip_failsafe)
432432
ASSERT_EQ(updated_user_intented_mode, state.user_intended_mode);
433433
ASSERT_EQ(failsafe.selectedAction(), FailsafeBase::Action::Warn);
434434
}
435+
436+
TEST_F(FailsafeTest, user_termination)
437+
{
438+
FailsafeTester failsafe(nullptr);
439+
440+
failsafe_flags_s failsafe_flags{};
441+
FailsafeBase::State state{};
442+
state.armed = true;
443+
state.user_intended_mode = vehicle_status_s::NAVIGATION_STATE_TERMINATION;
444+
state.vehicle_type = vehicle_status_s::VEHICLE_TYPE_ROTARY_WING;
445+
hrt_abstime time = 5_s;
446+
447+
// User intended termination -> failsafe termination
448+
uint8_t updated_user_intented_mode = failsafe.update(time, state, false, false, failsafe_flags);
449+
EXPECT_EQ(updated_user_intented_mode, state.user_intended_mode);
450+
EXPECT_EQ(failsafe.selectedAction(), FailsafeBase::Action::Terminate);
451+
452+
// Links lost during termination -> stay in termination
453+
failsafe_flags.gcs_connection_lost = true;
454+
failsafe_flags.manual_control_signal_lost = true;
455+
456+
updated_user_intented_mode = failsafe.update(time, state, false, false, failsafe_flags);
457+
EXPECT_EQ(updated_user_intented_mode, state.user_intended_mode);
458+
EXPECT_EQ(failsafe.selectedAction(), FailsafeBase::Action::Terminate);
459+
}

src/modules/commander/failsafe/framework.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -443,7 +443,8 @@ void FailsafeBase::getSelectedAction(const State &state, const failsafe_flags_s
443443
returned_state.updated_user_intended_mode = state.user_intended_mode;
444444
returned_state.cause = Cause::Generic;
445445

446-
if (_selected_action == Action::Terminate) { // Terminate never clears
446+
if (state.user_intended_mode == vehicle_status_s::NAVIGATION_STATE_TERMINATION
447+
|| _selected_action == Action::Terminate) { // Terminate never clears
447448
returned_state.action = Action::Terminate;
448449
return;
449450
}

0 commit comments

Comments
 (0)