Browse Source

Commander: Fall back to GPS enabled modes once GPS becomes available

sbg
Lorenz Meier 8 years ago
parent
commit
798a7ed8cd
  1. 16
      src/modules/commander/commander.cpp

16
src/modules/commander/commander.cpp

@ -230,7 +230,7 @@ static uint64_t rc_signal_lost_timestamp; // Time at which the RC reception was
static float avionics_power_rail_voltage; // voltage of the avionics power rail static float avionics_power_rail_voltage; // voltage of the avionics power rail
static bool can_arm_without_gps = false; static bool can_arm_without_gps = false;
static bool position_lock_gained = false; static bool _last_condition_global_position_valid = false;
/** /**
@ -2733,6 +2733,9 @@ int commander_thread_main(int argc, char *argv[])
bool first_rc_eval = (_last_sp_man.timestamp == 0) && (sp_man.timestamp > 0); bool first_rc_eval = (_last_sp_man.timestamp == 0) && (sp_man.timestamp > 0);
transition_result_t main_res = set_main_state_rc(&status); transition_result_t main_res = set_main_state_rc(&status);
/* store last position lock state */
_last_condition_global_position_valid = status_flags.condition_global_position_valid;
/* play tune on mode change only if armed, blink LED always */ /* play tune on mode change only if armed, blink LED always */
if (main_res == TRANSITION_CHANGED || first_rc_eval) { if (main_res == TRANSITION_CHANGED || first_rc_eval) {
tune_positive(armed.armed); tune_positive(armed.armed);
@ -2964,17 +2967,13 @@ int commander_thread_main(int argc, char *argv[])
/* First time home position update - but only if disarmed */ /* First time home position update - but only if disarmed */
if (!status_flags.condition_home_position_valid && !armed.armed) { if (!status_flags.condition_home_position_valid && !armed.armed) {
commander_set_home_position(home_pub, _home, local_position, global_position, attitude); commander_set_home_position(home_pub, _home, local_position, global_position, attitude);
position_lock_gained = true;
} }
/* update home position on arming if at least 500 ms from commander start spent to avoid setting home on in-air restart */ /* update home position on arming if at least 500 ms from commander start spent to avoid setting home on in-air restart */
else if (((!was_armed && armed.armed) || (was_landed && !land_detector.landed)) && else if (((!was_armed && armed.armed) || (was_landed && !land_detector.landed)) &&
(now > commander_boot_timestamp + INAIR_RESTART_HOLDOFF_INTERVAL)) { (now > commander_boot_timestamp + INAIR_RESTART_HOLDOFF_INTERVAL)) {
commander_set_home_position(home_pub, _home, local_position, global_position, attitude); commander_set_home_position(home_pub, _home, local_position, global_position, attitude);
position_lock_gained = false;
} else {
position_lock_gained = false;
} }
was_armed = armed.armed; was_armed = armed.armed;
@ -3312,7 +3311,9 @@ set_main_state_rc(struct vehicle_status_s *status_local)
// feature, just in case offboard control goes crazy. // feature, just in case offboard control goes crazy.
/* manual setpoint has not updated, do not re-evaluate it */ /* manual setpoint has not updated, do not re-evaluate it */
if ((((_last_sp_man.timestamp != 0) && (_last_sp_man.timestamp == sp_man.timestamp)) || if (!(!_last_condition_global_position_valid &&
status_flags.condition_global_position_valid)
&& (((_last_sp_man.timestamp != 0) && (_last_sp_man.timestamp == sp_man.timestamp)) ||
((_last_sp_man.offboard_switch == sp_man.offboard_switch) && ((_last_sp_man.offboard_switch == sp_man.offboard_switch) &&
(_last_sp_man.return_switch == sp_man.return_switch) && (_last_sp_man.return_switch == sp_man.return_switch) &&
(_last_sp_man.mode_switch == sp_man.mode_switch) && (_last_sp_man.mode_switch == sp_man.mode_switch) &&
@ -3320,8 +3321,7 @@ set_main_state_rc(struct vehicle_status_s *status_local)
(_last_sp_man.rattitude_switch == sp_man.rattitude_switch) && (_last_sp_man.rattitude_switch == sp_man.rattitude_switch) &&
(_last_sp_man.posctl_switch == sp_man.posctl_switch) && (_last_sp_man.posctl_switch == sp_man.posctl_switch) &&
(_last_sp_man.loiter_switch == sp_man.loiter_switch) && (_last_sp_man.loiter_switch == sp_man.loiter_switch) &&
(_last_sp_man.mode_slot == sp_man.mode_slot))) (_last_sp_man.mode_slot == sp_man.mode_slot)))) {
&& !position_lock_gained) {
// update these fields for the geofence system // update these fields for the geofence system

Loading…
Cancel
Save