Browse Source

Geofence: renamed action on flag, reset only if none of the possible warning actions is set

sbg
Andreas Antener 9 years ago
parent
commit
5825b8c3e7
  1. 23
      src/modules/commander/commander.cpp

23
src/modules/commander/commander.cpp

@ -196,7 +196,7 @@ static struct cpuload_s cpuload = {}; @@ -196,7 +196,7 @@ static struct cpuload_s cpuload = {};
static uint8_t main_state_prev = 0;
static bool rtl_on = false;
static bool warning_action_on = false;
static struct status_flags_s status_flags = {};
@ -2071,14 +2071,16 @@ int commander_thread_main(int argc, char *argv[]) @@ -2071,14 +2071,16 @@ int commander_thread_main(int argc, char *argv[])
arm_disarm(false, &mavlink_log_pub, "auto disarm on land");
}
if (!rtl_on) {
if (!warning_action_on) {
// store the last good main_state when not in an navigation
// hold state
main_state_before_rtl = internal_state.main_state;
} else if (internal_state.main_state != commander_state_s::MAIN_STATE_AUTO_RTL) {
} else if (internal_state.main_state != commander_state_s::MAIN_STATE_AUTO_RTL
&& internal_state.main_state != commander_state_s::MAIN_STATE_AUTO_LOITER
&& internal_state.main_state != commander_state_s::MAIN_STATE_AUTO_LAND) {
// reset flag again when we switched out of it
rtl_on = false;
warning_action_on = false;
}
orb_check(cpuload_sub, &updated);
@ -2118,8 +2120,8 @@ int commander_thread_main(int argc, char *argv[]) @@ -2118,8 +2120,8 @@ int commander_thread_main(int argc, char *argv[])
} else {
if (low_bat_action == 1) {
// let us send the critical message even if already in RTL
if (rtl_on || TRANSITION_CHANGED == main_state_transition(&status, commander_state_s::MAIN_STATE_AUTO_RTL, main_state_prev, &status_flags, &internal_state)) {
rtl_on = true;
if (warning_action_on || TRANSITION_CHANGED == main_state_transition(&status, commander_state_s::MAIN_STATE_AUTO_RTL, main_state_prev, &status_flags, &internal_state)) {
warning_action_on = true;
mavlink_and_console_log_emergency(&mavlink_log_pub, "CRITICAL BATTERY, RETURNING TO LAND");
} else {
@ -2127,7 +2129,8 @@ int commander_thread_main(int argc, char *argv[]) @@ -2127,7 +2129,8 @@ int commander_thread_main(int argc, char *argv[])
}
} else if (low_bat_action == 2) {
if (TRANSITION_CHANGED == main_state_transition(&status, commander_state_s::MAIN_STATE_AUTO_LAND, main_state_prev, &status_flags, &internal_state)) {
if (warning_action_on || TRANSITION_CHANGED == main_state_transition(&status, commander_state_s::MAIN_STATE_AUTO_LAND, main_state_prev, &status_flags, &internal_state)) {
warning_action_on = true;
mavlink_and_console_log_emergency(&mavlink_log_pub, "CRITICAL BATTERY, LANDING AT CURRENT POSITION");
} else {
@ -2350,11 +2353,11 @@ int commander_thread_main(int argc, char *argv[]) @@ -2350,11 +2353,11 @@ int commander_thread_main(int argc, char *argv[])
&& (sp_man.return_switch == manual_control_setpoint_s::SWITCH_POS_OFF
|| sp_man.return_switch == manual_control_setpoint_s::SWITCH_POS_NONE);
rtl_on = rtl_on || (geofence_loiter_on || geofence_rtl_on);
warning_action_on = warning_action_on || (geofence_loiter_on || geofence_rtl_on);
}
// revert geofence failsafe transition if sticks are moved and we were previously in MANUAL or ASSIST
if (rtl_on &&
if (warning_action_on &&
(main_state_before_rtl == commander_state_s::MAIN_STATE_MANUAL ||
main_state_before_rtl == commander_state_s::MAIN_STATE_ALTCTL ||
main_state_before_rtl == commander_state_s::MAIN_STATE_POSCTL ||
@ -3091,7 +3094,7 @@ set_main_state_rc(struct vehicle_status_s *status_local) @@ -3091,7 +3094,7 @@ set_main_state_rc(struct vehicle_status_s *status_local)
// update these fields for the geofence system
if (!rtl_on) {
if (!warning_action_on) {
_last_sp_man.timestamp = sp_man.timestamp;
_last_sp_man.x = sp_man.x;
_last_sp_man.y = sp_man.y;

Loading…
Cancel
Save