aboutsummaryrefslogtreecommitdiff
path: root/src/modules/commander
diff options
context:
space:
mode:
Diffstat (limited to 'src/modules/commander')
-rw-r--r--src/modules/commander/commander.cpp37
-rw-r--r--src/modules/commander/state_machine_helper.cpp4
2 files changed, 36 insertions, 5 deletions
diff --git a/src/modules/commander/commander.cpp b/src/modules/commander/commander.cpp
index e9da69232..afcf236d3 100644
--- a/src/modules/commander/commander.cpp
+++ b/src/modules/commander/commander.cpp
@@ -621,9 +621,10 @@ int commander_thread_main(int argc, char *argv[])
char *main_states_str[MAIN_STATE_MAX];
main_states_str[0] = "MANUAL";
- main_states_str[1] = "SEATBELT";
- main_states_str[2] = "EASY";
- main_states_str[3] = "AUTO";
+ main_states_str[1] = "ACRO";
+ main_states_str[2] = "SEATBELT";
+ main_states_str[3] = "EASY";
+ main_states_str[4] = "AUTO";
char *arming_states_str[ARMING_STATE_MAX];
arming_states_str[0] = "INIT";
@@ -1121,7 +1122,7 @@ int commander_thread_main(int argc, char *argv[])
* do it only for rotary wings */
if (status.is_rotary_wing &&
(status.arming_state == ARMING_STATE_ARMED || status.arming_state == ARMING_STATE_ARMED_ERROR) &&
- (status.main_state == MAIN_STATE_MANUAL || status.condition_landed) &&
+ (status.main_state == MAIN_STATE_MANUAL || status.main_state == MAIN_STATE_ACRO || status.condition_landed) &&
sp_man.yaw < -STICK_ON_OFF_LIMIT && sp_man.throttle < STICK_THRUST_RANGE * 0.1f) {
if (stick_off_counter > STICK_ON_OFF_COUNTER_LIMIT) {
@@ -1512,6 +1513,17 @@ check_mode_switches(struct manual_control_setpoint_s *sp_man, struct vehicle_sta
} else {
status->mission_switch = MISSION_SWITCH_MISSION;
}
+
+ /* acro switch */
+ if (!isfinite(sp_man->acro_switch)) {
+ status->acro_switch = ACRO_SWITCH_NONE;
+
+ } else if (sp_man->acro_switch > STICK_ON_OFF_LIMIT) {
+ status->acro_switch = ACRO_SWITCH_ACRO;
+
+ } else {
+ status->acro_switch = ACRO_SWITCH_NORMAL;
+ }
}
transition_result_t
@@ -1522,7 +1534,11 @@ set_main_state_rc(struct vehicle_status_s *status)
switch (status->mode_switch) {
case MODE_SWITCH_MANUAL:
- res = main_state_transition(status, MAIN_STATE_MANUAL);
+ if (status->acro_switch == ACRO_SWITCH_ACRO) {
+ res = main_state_transition(status, MAIN_STATE_ACRO);
+ } else {
+ res = main_state_transition(status, MAIN_STATE_MANUAL);
+ }
// TRANSITION_DENIED is not possible here
break;
@@ -1602,6 +1618,17 @@ set_control_mode()
control_mode.flag_control_velocity_enabled = false;
break;
+ case MAIN_STATE_ACRO:
+ control_mode.flag_control_manual_enabled = true;
+ control_mode.flag_control_auto_enabled = false;
+ control_mode.flag_control_rates_enabled = true;
+ control_mode.flag_control_attitude_enabled = false;
+ control_mode.flag_control_altitude_enabled = false;
+ control_mode.flag_control_climb_rate_enabled = false;
+ control_mode.flag_control_position_enabled = false;
+ control_mode.flag_control_velocity_enabled = false;
+ break;
+
case MAIN_STATE_SEATBELT:
control_mode.flag_control_manual_enabled = true;
control_mode.flag_control_auto_enabled = false;
diff --git a/src/modules/commander/state_machine_helper.cpp b/src/modules/commander/state_machine_helper.cpp
index e5d77b246..2516d4c68 100644
--- a/src/modules/commander/state_machine_helper.cpp
+++ b/src/modules/commander/state_machine_helper.cpp
@@ -230,6 +230,10 @@ main_state_transition(struct vehicle_status_s *status, main_state_t new_main_sta
ret = TRANSITION_CHANGED;
break;
+ case MAIN_STATE_ACRO:
+ ret = TRANSITION_CHANGED;
+ break;
+
case MAIN_STATE_SEATBELT:
/* need at minimum altitude estimate */