forked from Archive/PX4-Autopilot
Compare commits
1 Commits
main
...
pr-command
Author | SHA1 | Date |
---|---|---|
Daniel Agar | e635fccd25 |
|
@ -435,6 +435,41 @@ static constexpr const char *arm_disarm_reason_str(arm_disarm_reason_t calling_r
|
||||||
return "";
|
return "";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static constexpr const char *main_state_str(uint8_t main_state)
|
||||||
|
{
|
||||||
|
switch (main_state) {
|
||||||
|
case commander_state_s::MAIN_STATE_MANUAL: return "manual";
|
||||||
|
|
||||||
|
case commander_state_s::MAIN_STATE_ALTCTL: return "altitude control";
|
||||||
|
|
||||||
|
case commander_state_s::MAIN_STATE_POSCTL: return "position control";
|
||||||
|
|
||||||
|
case commander_state_s::MAIN_STATE_AUTO_MISSION: return "auto mission";
|
||||||
|
|
||||||
|
case commander_state_s::MAIN_STATE_AUTO_LOITER: return "auto hold";
|
||||||
|
|
||||||
|
case commander_state_s::MAIN_STATE_AUTO_RTL: return "RTL";
|
||||||
|
|
||||||
|
case commander_state_s::MAIN_STATE_ACRO: return "acro";
|
||||||
|
|
||||||
|
case commander_state_s::MAIN_STATE_OFFBOARD: return "offboard";
|
||||||
|
|
||||||
|
case commander_state_s::MAIN_STATE_STAB: return "stabilized";
|
||||||
|
|
||||||
|
case commander_state_s::MAIN_STATE_AUTO_TAKEOFF: return "auto takeoff";
|
||||||
|
|
||||||
|
case commander_state_s::MAIN_STATE_AUTO_LAND: return "auto land";
|
||||||
|
|
||||||
|
case commander_state_s::MAIN_STATE_AUTO_FOLLOW_TARGET: return "follow target";
|
||||||
|
|
||||||
|
case commander_state_s::MAIN_STATE_AUTO_PRECLAND: return "auto precision land";
|
||||||
|
|
||||||
|
case commander_state_s::MAIN_STATE_ORBIT: return "orbit";
|
||||||
|
|
||||||
|
default: return "unknown";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
transition_result_t Commander::arm(arm_disarm_reason_t calling_reason, bool run_preflight_checks)
|
transition_result_t Commander::arm(arm_disarm_reason_t calling_reason, bool run_preflight_checks)
|
||||||
{
|
{
|
||||||
// allow a grace period for re-arming: preflight checks don't need to pass during that time, for example for accidential in-air disarming
|
// allow a grace period for re-arming: preflight checks don't need to pass during that time, for example for accidential in-air disarming
|
||||||
|
@ -2835,7 +2870,7 @@ Commander::set_main_state_rc()
|
||||||
res = main_state_transition(_status, commander_state_s::MAIN_STATE_OFFBOARD, _status_flags, &_internal_state);
|
res = main_state_transition(_status, commander_state_s::MAIN_STATE_OFFBOARD, _status_flags, &_internal_state);
|
||||||
|
|
||||||
if (res == TRANSITION_DENIED) {
|
if (res == TRANSITION_DENIED) {
|
||||||
print_reject_mode("OFFBOARD");
|
print_reject_mode(commander_state_s::MAIN_STATE_OFFBOARD);
|
||||||
/* mode rejected, continue to evaluate the main system mode */
|
/* mode rejected, continue to evaluate the main system mode */
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
@ -2849,7 +2884,7 @@ Commander::set_main_state_rc()
|
||||||
res = main_state_transition(_status, commander_state_s::MAIN_STATE_AUTO_RTL, _status_flags, &_internal_state);
|
res = main_state_transition(_status, commander_state_s::MAIN_STATE_AUTO_RTL, _status_flags, &_internal_state);
|
||||||
|
|
||||||
if (res == TRANSITION_DENIED) {
|
if (res == TRANSITION_DENIED) {
|
||||||
print_reject_mode("AUTO RTL");
|
print_reject_mode(commander_state_s::MAIN_STATE_AUTO_RTL);
|
||||||
|
|
||||||
/* fallback to LOITER if home position not set */
|
/* fallback to LOITER if home position not set */
|
||||||
res = main_state_transition(_status, commander_state_s::MAIN_STATE_AUTO_LOITER, _status_flags, &_internal_state);
|
res = main_state_transition(_status, commander_state_s::MAIN_STATE_AUTO_LOITER, _status_flags, &_internal_state);
|
||||||
|
@ -2868,7 +2903,7 @@ Commander::set_main_state_rc()
|
||||||
res = main_state_transition(_status, commander_state_s::MAIN_STATE_AUTO_LOITER, _status_flags, &_internal_state);
|
res = main_state_transition(_status, commander_state_s::MAIN_STATE_AUTO_LOITER, _status_flags, &_internal_state);
|
||||||
|
|
||||||
if (res == TRANSITION_DENIED) {
|
if (res == TRANSITION_DENIED) {
|
||||||
print_reject_mode("AUTO HOLD");
|
print_reject_mode(commander_state_s::MAIN_STATE_AUTO_LOITER);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
return res;
|
return res;
|
||||||
|
@ -2902,10 +2937,9 @@ Commander::set_main_state_rc()
|
||||||
maxcount--;
|
maxcount--;
|
||||||
|
|
||||||
if (new_mode == commander_state_s::MAIN_STATE_AUTO_MISSION) {
|
if (new_mode == commander_state_s::MAIN_STATE_AUTO_MISSION) {
|
||||||
|
// fall back to loiter
|
||||||
/* fall back to loiter */
|
print_reject_mode(new_mode);
|
||||||
new_mode = commander_state_s::MAIN_STATE_AUTO_LOITER;
|
new_mode = commander_state_s::MAIN_STATE_AUTO_LOITER;
|
||||||
print_reject_mode("AUTO MISSION");
|
|
||||||
res = main_state_transition(_status, new_mode, _status_flags, &_internal_state);
|
res = main_state_transition(_status, new_mode, _status_flags, &_internal_state);
|
||||||
|
|
||||||
if (res != TRANSITION_DENIED) {
|
if (res != TRANSITION_DENIED) {
|
||||||
|
@ -2914,10 +2948,9 @@ Commander::set_main_state_rc()
|
||||||
}
|
}
|
||||||
|
|
||||||
if (new_mode == commander_state_s::MAIN_STATE_AUTO_RTL) {
|
if (new_mode == commander_state_s::MAIN_STATE_AUTO_RTL) {
|
||||||
|
// fall back to position control
|
||||||
/* fall back to position control */
|
print_reject_mode(new_mode);
|
||||||
new_mode = commander_state_s::MAIN_STATE_AUTO_LOITER;
|
new_mode = commander_state_s::MAIN_STATE_AUTO_LOITER;
|
||||||
print_reject_mode("AUTO RTL");
|
|
||||||
res = main_state_transition(_status, new_mode, _status_flags, &_internal_state);
|
res = main_state_transition(_status, new_mode, _status_flags, &_internal_state);
|
||||||
|
|
||||||
if (res != TRANSITION_DENIED) {
|
if (res != TRANSITION_DENIED) {
|
||||||
|
@ -2926,10 +2959,9 @@ Commander::set_main_state_rc()
|
||||||
}
|
}
|
||||||
|
|
||||||
if (new_mode == commander_state_s::MAIN_STATE_AUTO_LAND) {
|
if (new_mode == commander_state_s::MAIN_STATE_AUTO_LAND) {
|
||||||
|
// fall back to position control
|
||||||
/* fall back to position control */
|
print_reject_mode(new_mode);
|
||||||
new_mode = commander_state_s::MAIN_STATE_AUTO_LOITER;
|
new_mode = commander_state_s::MAIN_STATE_AUTO_LOITER;
|
||||||
print_reject_mode("AUTO LAND");
|
|
||||||
res = main_state_transition(_status, new_mode, _status_flags, &_internal_state);
|
res = main_state_transition(_status, new_mode, _status_flags, &_internal_state);
|
||||||
|
|
||||||
if (res != TRANSITION_DENIED) {
|
if (res != TRANSITION_DENIED) {
|
||||||
|
@ -2938,10 +2970,9 @@ Commander::set_main_state_rc()
|
||||||
}
|
}
|
||||||
|
|
||||||
if (new_mode == commander_state_s::MAIN_STATE_AUTO_TAKEOFF) {
|
if (new_mode == commander_state_s::MAIN_STATE_AUTO_TAKEOFF) {
|
||||||
|
// fall back to position control
|
||||||
/* fall back to position control */
|
print_reject_mode(new_mode);
|
||||||
new_mode = commander_state_s::MAIN_STATE_AUTO_LOITER;
|
new_mode = commander_state_s::MAIN_STATE_AUTO_LOITER;
|
||||||
print_reject_mode("AUTO TAKEOFF");
|
|
||||||
res = main_state_transition(_status, new_mode, _status_flags, &_internal_state);
|
res = main_state_transition(_status, new_mode, _status_flags, &_internal_state);
|
||||||
|
|
||||||
if (res != TRANSITION_DENIED) {
|
if (res != TRANSITION_DENIED) {
|
||||||
|
@ -2950,10 +2981,9 @@ Commander::set_main_state_rc()
|
||||||
}
|
}
|
||||||
|
|
||||||
if (new_mode == commander_state_s::MAIN_STATE_AUTO_FOLLOW_TARGET) {
|
if (new_mode == commander_state_s::MAIN_STATE_AUTO_FOLLOW_TARGET) {
|
||||||
|
// fall back to position control
|
||||||
/* fall back to position control */
|
print_reject_mode(new_mode);
|
||||||
new_mode = commander_state_s::MAIN_STATE_AUTO_LOITER;
|
new_mode = commander_state_s::MAIN_STATE_AUTO_LOITER;
|
||||||
print_reject_mode("AUTO FOLLOW");
|
|
||||||
res = main_state_transition(_status, new_mode, _status_flags, &_internal_state);
|
res = main_state_transition(_status, new_mode, _status_flags, &_internal_state);
|
||||||
|
|
||||||
if (res != TRANSITION_DENIED) {
|
if (res != TRANSITION_DENIED) {
|
||||||
|
@ -2962,10 +2992,9 @@ Commander::set_main_state_rc()
|
||||||
}
|
}
|
||||||
|
|
||||||
if (new_mode == commander_state_s::MAIN_STATE_AUTO_LOITER) {
|
if (new_mode == commander_state_s::MAIN_STATE_AUTO_LOITER) {
|
||||||
|
// fall back to position control
|
||||||
/* fall back to position control */
|
print_reject_mode(new_mode);
|
||||||
new_mode = commander_state_s::MAIN_STATE_POSCTL;
|
new_mode = commander_state_s::MAIN_STATE_POSCTL;
|
||||||
print_reject_mode("AUTO HOLD");
|
|
||||||
res = main_state_transition(_status, new_mode, _status_flags, &_internal_state);
|
res = main_state_transition(_status, new_mode, _status_flags, &_internal_state);
|
||||||
|
|
||||||
if (res != TRANSITION_DENIED) {
|
if (res != TRANSITION_DENIED) {
|
||||||
|
@ -2974,10 +3003,9 @@ Commander::set_main_state_rc()
|
||||||
}
|
}
|
||||||
|
|
||||||
if (new_mode == commander_state_s::MAIN_STATE_POSCTL) {
|
if (new_mode == commander_state_s::MAIN_STATE_POSCTL) {
|
||||||
|
// fall back to altitude control
|
||||||
/* fall back to altitude control */
|
print_reject_mode(new_mode);
|
||||||
new_mode = commander_state_s::MAIN_STATE_ALTCTL;
|
new_mode = commander_state_s::MAIN_STATE_ALTCTL;
|
||||||
print_reject_mode("POSITION CONTROL");
|
|
||||||
res = main_state_transition(_status, new_mode, _status_flags, &_internal_state);
|
res = main_state_transition(_status, new_mode, _status_flags, &_internal_state);
|
||||||
|
|
||||||
if (res != TRANSITION_DENIED) {
|
if (res != TRANSITION_DENIED) {
|
||||||
|
@ -2986,10 +3014,9 @@ Commander::set_main_state_rc()
|
||||||
}
|
}
|
||||||
|
|
||||||
if (new_mode == commander_state_s::MAIN_STATE_ALTCTL) {
|
if (new_mode == commander_state_s::MAIN_STATE_ALTCTL) {
|
||||||
|
// fall back to stabilized
|
||||||
/* fall back to stabilized */
|
print_reject_mode(new_mode);
|
||||||
new_mode = commander_state_s::MAIN_STATE_STAB;
|
new_mode = commander_state_s::MAIN_STATE_STAB;
|
||||||
print_reject_mode("ALTITUDE CONTROL");
|
|
||||||
res = main_state_transition(_status, new_mode, _status_flags, &_internal_state);
|
res = main_state_transition(_status, new_mode, _status_flags, &_internal_state);
|
||||||
|
|
||||||
if (res != TRANSITION_DENIED) {
|
if (res != TRANSITION_DENIED) {
|
||||||
|
@ -2998,10 +3025,9 @@ Commander::set_main_state_rc()
|
||||||
}
|
}
|
||||||
|
|
||||||
if (new_mode == commander_state_s::MAIN_STATE_STAB) {
|
if (new_mode == commander_state_s::MAIN_STATE_STAB) {
|
||||||
|
// fall back to manual
|
||||||
/* fall back to manual */
|
print_reject_mode(new_mode);
|
||||||
new_mode = commander_state_s::MAIN_STATE_MANUAL;
|
new_mode = commander_state_s::MAIN_STATE_MANUAL;
|
||||||
print_reject_mode("STABILIZED");
|
|
||||||
res = main_state_transition(_status, new_mode, _status_flags, &_internal_state);
|
res = main_state_transition(_status, new_mode, _status_flags, &_internal_state);
|
||||||
|
|
||||||
if (res != TRANSITION_DENIED) {
|
if (res != TRANSITION_DENIED) {
|
||||||
|
@ -3080,7 +3106,7 @@ Commander::set_main_state_rc()
|
||||||
break; // changed successfully or already in this state
|
break; // changed successfully or already in this state
|
||||||
}
|
}
|
||||||
|
|
||||||
print_reject_mode("POSITION CONTROL");
|
print_reject_mode(commander_state_s::MAIN_STATE_POSCTL);
|
||||||
}
|
}
|
||||||
|
|
||||||
// fallback to ALTCTL
|
// fallback to ALTCTL
|
||||||
|
@ -3091,7 +3117,7 @@ Commander::set_main_state_rc()
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_manual_control_switches.posctl_switch != manual_control_switches_s::SWITCH_POS_ON) {
|
if (_manual_control_switches.posctl_switch != manual_control_switches_s::SWITCH_POS_ON) {
|
||||||
print_reject_mode("ALTITUDE CONTROL");
|
print_reject_mode(commander_state_s::MAIN_STATE_ALTCTL);
|
||||||
}
|
}
|
||||||
|
|
||||||
// fallback to MANUAL
|
// fallback to MANUAL
|
||||||
|
@ -3106,7 +3132,7 @@ Commander::set_main_state_rc()
|
||||||
break; // changed successfully or already in this state
|
break; // changed successfully or already in this state
|
||||||
}
|
}
|
||||||
|
|
||||||
print_reject_mode("AUTO MISSION");
|
print_reject_mode(commander_state_s::MAIN_STATE_AUTO_MISSION);
|
||||||
|
|
||||||
// fallback to LOITER if home position not set
|
// fallback to LOITER if home position not set
|
||||||
res = main_state_transition(_status, commander_state_s::MAIN_STATE_AUTO_LOITER, _status_flags, &_internal_state);
|
res = main_state_transition(_status, commander_state_s::MAIN_STATE_AUTO_LOITER, _status_flags, &_internal_state);
|
||||||
|
@ -3362,17 +3388,19 @@ Commander::stabilization_required()
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
Commander::print_reject_mode(const char *msg)
|
Commander::print_reject_mode(uint8_t main_state)
|
||||||
{
|
{
|
||||||
const hrt_abstime t = hrt_absolute_time();
|
const hrt_abstime time_now_us = hrt_absolute_time();
|
||||||
|
|
||||||
if (t - _last_print_mode_reject_time > PRINT_MODE_REJECT_INTERVAL) {
|
if (time_now_us > _last_print_mode_reject_time + PRINT_MODE_REJECT_INTERVAL) {
|
||||||
_last_print_mode_reject_time = t;
|
|
||||||
mavlink_log_critical(&_mavlink_log_pub, "REJECT %s", msg);
|
mavlink_log_critical(&_mavlink_log_pub, "Rejecting %s mode", main_state_str(main_state));
|
||||||
|
|
||||||
/* only buzz if armed, because else we're driving people nuts indoors
|
/* only buzz if armed, because else we're driving people nuts indoors
|
||||||
they really need to look at the leds as well. */
|
they really need to look at the leds as well. */
|
||||||
tune_negative(_armed.armed);
|
tune_negative(_armed.armed);
|
||||||
|
|
||||||
|
_last_print_mode_reject_time = time_now_us;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -154,7 +154,7 @@ private:
|
||||||
|
|
||||||
void offboard_control_update();
|
void offboard_control_update();
|
||||||
|
|
||||||
void print_reject_mode(const char *msg);
|
void print_reject_mode(uint8_t main_state);
|
||||||
|
|
||||||
void reset_posvel_validity();
|
void reset_posvel_validity();
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue