diff --git a/src/modules/commander/ManualControl.cpp b/src/modules/commander/ManualControl.cpp index a9b55a3fc9..8c7733187c 100644 --- a/src/modules/commander/ManualControl.cpp +++ b/src/modules/commander/ManualControl.cpp @@ -95,15 +95,20 @@ bool ManualControl::wantsDisarm(const vehicle_control_mode_s &vehicle_control_mo { bool ret = false; + // no switch or button is mapped + const bool use_stick = manual_control_switches.arm_switch == manual_control_switches_s::SWITCH_POS_NONE; + // arm switch mapped and "switch is button" configured + const bool use_button = !use_stick && _param_com_arm_swisbtn.get(); + // arm switch mapped and "switch_is_button" configured + const bool use_switch = !use_stick && !use_button; + const bool armed = (vehicle_status.arming_state == vehicle_status_s::ARMING_STATE_ARMED); - const bool arm_switch_or_button_mapped = - manual_control_switches.arm_switch != manual_control_switches_s::SWITCH_POS_NONE; - const bool arm_button_pressed = _param_arm_switch_is_button.get() - && (manual_control_switches.arm_switch == manual_control_switches_s::SWITCH_POS_ON); - const bool stick_in_lower_left = _manual_control_setpoint.r < -.9f + const bool stick_in_lower_left = use_stick && isThrottleLow() - && !arm_switch_or_button_mapped; - const bool arm_switch_to_disarm_transition = !_param_arm_switch_is_button.get() + && _manual_control_setpoint.r < -.9f; + const bool arm_button_pressed = (manual_control_switches.arm_switch == manual_control_switches_s::SWITCH_POS_ON) + && use_button; + const bool arm_switch_to_disarm_transition = use_switch && (_last_manual_control_switches_arm_switch == manual_control_switches_s::SWITCH_POS_ON) && (manual_control_switches.arm_switch == manual_control_switches_s::SWITCH_POS_OFF); const bool mc_manual_thrust_mode = vehicle_status.vehicle_type == vehicle_status_s::VEHICLE_TYPE_ROTARY_WING @@ -136,16 +141,20 @@ bool ManualControl::wantsArm(const vehicle_control_mode_s &vehicle_control_mode, { bool ret = false; - const bool armed = (vehicle_status.arming_state == vehicle_status_s::ARMING_STATE_ARMED); - const bool arm_switch_or_button_mapped = - manual_control_switches.arm_switch != manual_control_switches_s::SWITCH_POS_NONE; - const bool arm_button_pressed = _param_arm_switch_is_button.get() - && (manual_control_switches.arm_switch == manual_control_switches_s::SWITCH_POS_ON); - const bool stick_in_lower_right = _manual_control_setpoint.r > .9f - && isThrottleLow() - && !arm_switch_or_button_mapped; + // no switch or button is mapped + const bool use_stick = manual_control_switches.arm_switch == manual_control_switches_s::SWITCH_POS_NONE; + // arm switch mapped and "switch is button" configured + const bool use_button = !use_stick && _param_com_arm_swisbtn.get(); + // arm switch mapped and "switch_is_button" configured + const bool use_switch = !use_stick && !use_button; - const bool arm_switch_to_arm_transition = !_param_arm_switch_is_button.get() + const bool armed = (vehicle_status.arming_state == vehicle_status_s::ARMING_STATE_ARMED); + const bool stick_in_lower_right = use_stick + && isThrottleLow() + && _manual_control_setpoint.r > .9f; + const bool arm_button_pressed = use_button + && (manual_control_switches.arm_switch == manual_control_switches_s::SWITCH_POS_ON); + const bool arm_switch_to_arm_transition = use_switch && (_last_manual_control_switches_arm_switch == manual_control_switches_s::SWITCH_POS_OFF) && (manual_control_switches.arm_switch == manual_control_switches_s::SWITCH_POS_ON); diff --git a/src/modules/commander/ManualControl.hpp b/src/modules/commander/ManualControl.hpp index d4f9810c99..b174fba7c5 100644 --- a/src/modules/commander/ManualControl.hpp +++ b/src/modules/commander/ManualControl.hpp @@ -88,7 +88,7 @@ private: DEFINE_PARAMETERS( (ParamFloat) _param_com_rc_loss_t, (ParamInt) _param_rc_arm_hyst, - (ParamBool) _param_arm_switch_is_button, + (ParamBool) _param_com_arm_swisbtn, (ParamBool) _param_com_rearm_grace, (ParamInt) _param_rc_override, (ParamFloat) _param_com_rc_stick_ov diff --git a/src/modules/commander/commander_params.c b/src/modules/commander/commander_params.c index ebfb28da49..238f3aa45e 100644 --- a/src/modules/commander/commander_params.c +++ b/src/modules/commander/commander_params.c @@ -313,10 +313,11 @@ PARAM_DEFINE_FLOAT(COM_DISARM_PRFLT, 10.0f); PARAM_DEFINE_INT32(COM_ARM_WO_GPS, 1); /** - * Arm switch is only a button + * Arm switch is a momentary button * - * The default uses the arm switch as real switch. - * If parameter set button gets handled like stick arming. + * 0: Arming/disarming triggers on switch transition. + * 1: Arming/disarming triggers when holding the momentary button down + * for COM_RC_ARM_HYST like the stick gesture. * * @group Commander * @boolean