diff --git a/src/main/config/config_master.h b/src/main/config/config_master.h index 88b4d9a67..d13a0420d 100644 --- a/src/main/config/config_master.h +++ b/src/main/config/config_master.h @@ -74,6 +74,7 @@ typedef struct master_s { failsafeConfig_t failsafeConfig; + uint8_t fixed_wing_auto_arm; // Auto-arm fixed wing aircraft on throttle up and never disarm uint8_t disarm_kill_switch; // allow disarm via AUX switch regardless of throttle value uint8_t auto_disarm_delay; // allow automatically disarming multicopters after auto_disarm_delay seconds of zero throttle. Disabled when 0 uint8_t small_angle; diff --git a/src/main/fc/mw.c b/src/main/fc/mw.c index a251fd8cc..f03a71a38 100755 --- a/src/main/fc/mw.c +++ b/src/main/fc/mw.c @@ -341,7 +341,7 @@ void processRx(void) } } - processRcStickPositions(&masterConfig.rxConfig, throttleStatus, masterConfig.disarm_kill_switch); + processRcStickPositions(&masterConfig.rxConfig, throttleStatus, masterConfig.disarm_kill_switch, masterConfig.fixed_wing_auto_arm); updateActivatedModes(currentProfile->modeActivationConditions, currentProfile->modeActivationOperator); diff --git a/src/main/fc/rc_controls.c b/src/main/fc/rc_controls.c index 71d947c8b..73f755650 100644 --- a/src/main/fc/rc_controls.c +++ b/src/main/fc/rc_controls.c @@ -145,7 +145,7 @@ rollPitchStatus_e calculateRollPitchCenterStatus(rxConfig_t *rxConfig) return NOT_CENTERED; } -void processRcStickPositions(rxConfig_t *rxConfig, throttleStatus_e throttleStatus, bool disarm_kill_switch) +void processRcStickPositions(rxConfig_t *rxConfig, throttleStatus_e throttleStatus, bool disarm_kill_switch, bool fixed_wing_auto_arm) { static uint8_t rcDelayCommand; // this indicates the number of time (multiple of RC measurement at 50Hz) the sticks must be maintained to run or switch off motors static uint8_t rcSticks; // this hold sticks position for command combos @@ -170,7 +170,6 @@ void processRcStickPositions(rxConfig_t *rxConfig, throttleStatus_e throttleStat // perform actions if (!isUsingSticksToArm) { - if (IS_RC_MODE_ACTIVE(BOXARM)) { // Arming via ARM BOX if (throttleStatus == THROTTLE_LOW) { @@ -195,17 +194,22 @@ void processRcStickPositions(rxConfig_t *rxConfig, throttleStatus_e throttleStat return; } - if (isUsingSticksToArm) { + if (isUsingSticksToArm) { // Disarm on throttle down + yaw if (rcSticks == THR_LO + YAW_LO + PIT_CE + ROL_CE) { - if (ARMING_FLAG(ARMED)) + // Dont disarm if fixedwing and motorstop + if (STATE(FIXED_WING) && feature(FEATURE_MOTOR_STOP) && fixed_wing_auto_arm) { + return; + } + else if (ARMING_FLAG(ARMED)) { mwDisarm(); + } else { beeper(BEEPER_DISARM_REPEAT); // sound tone while stick held rcDelayCommand = 0; // reset so disarm tone will repeat } } - } + } if (ARMING_FLAG(ARMED)) { // actions during armed @@ -233,19 +237,31 @@ void processRcStickPositions(rxConfig_t *rxConfig, throttleStatus_e throttleStat return; } + if (rcSticks == THR_LO + YAW_LO + PIT_LO + ROL_HI) { saveConfigAndNotify(); } - if (isUsingSticksToArm) { - if (rcSticks == THR_LO + YAW_HI + PIT_CE + ROL_CE) { - // Arm via YAW - mwArm(); - return; + if (isUsingSticksToArm) { + if (STATE(FIXED_WING) && feature(FEATURE_MOTOR_STOP) && fixed_wing_auto_arm) { + // Auto arm on throttle when using fixedwing and motorstop + if (throttleStatus != THROTTLE_LOW) { + // Arm via YAW + mwArm(); + return; + } + } + else { + if (rcSticks == THR_LO + YAW_HI + PIT_CE + ROL_CE) { + // Arm via YAW + mwArm(); + return; + } } } + if (rcSticks == THR_HI + YAW_LO + PIT_LO + ROL_CE) { // Calibrating Acc accSetCalibrationCycles(CALIBRATING_ACC_CYCLES); diff --git a/src/main/fc/rc_controls.h b/src/main/fc/rc_controls.h index 4e6b5ae45..7e2e6ba24 100644 --- a/src/main/fc/rc_controls.h +++ b/src/main/fc/rc_controls.h @@ -174,7 +174,7 @@ bool areUsingSticksToArm(void); bool areSticksInApModePosition(uint16_t ap_mode); throttleStatus_e calculateThrottleStatus(rxConfig_t *rxConfig, uint16_t deadband3d_throttle); rollPitchStatus_e calculateRollPitchCenterStatus(rxConfig_t *rxConfig); -void processRcStickPositions(rxConfig_t *rxConfig, throttleStatus_e throttleStatus, bool disarm_kill_switch); +void processRcStickPositions(rxConfig_t *rxConfig, throttleStatus_e throttleStatus, bool disarm_kill_switch, bool fixed_wing_auto_arm); void updateActivatedModes(modeActivationCondition_t *modeActivationConditions, modeActivationOperator_e modeActivationOperator); diff --git a/src/main/io/serial_cli.c b/src/main/io/serial_cli.c index 4e657b3e9..d1d652822 100644 --- a/src/main/io/serial_cli.c +++ b/src/main/io/serial_cli.c @@ -603,6 +603,7 @@ const clivalue_t valueTable[] = { { "motor_pwm_rate", VAR_UINT16 | MASTER_VALUE, &masterConfig.motor_pwm_rate, .config.minmax = { 50, 32000 }, 0 }, + { "fixed_wing_auto_arm", VAR_UINT8 | MASTER_VALUE | MODE_LOOKUP, &masterConfig.fixed_wing_auto_arm, .config.lookup = { TABLE_OFF_ON }, 0 }, { "disarm_kill_switch", VAR_UINT8 | MASTER_VALUE | MODE_LOOKUP, &masterConfig.disarm_kill_switch, .config.lookup = { TABLE_OFF_ON }, 0 }, { "auto_disarm_delay", VAR_UINT8 | MASTER_VALUE, &masterConfig.auto_disarm_delay, .config.minmax = { 0, 60 }, 0 }, { "small_angle", VAR_UINT8 | MASTER_VALUE, &masterConfig.small_angle, .config.minmax = { 0, 180 }, 0 },