diff --git a/src/main/config/config.c b/src/main/config/config.c index 9316d39f7a..1af43468b3 100755 --- a/src/main/config/config.c +++ b/src/main/config/config.c @@ -277,7 +277,8 @@ static void resetConf(void) masterConfig.inputFilteringMode = INPUT_FILTERING_DISABLED; - masterConfig.retarded_arm = 0; // disable arm/disarm on roll left/right + masterConfig.retarded_arm = 0; + masterConfig.disarm_kill_switch = 1; masterConfig.small_angle = 25; masterConfig.airplaneConfig.flaps_speed = 0; diff --git a/src/main/config/config_master.h b/src/main/config/config_master.h index 7b736211ce..ffbb77bf1c 100644 --- a/src/main/config/config_master.h +++ b/src/main/config/config_master.h @@ -59,7 +59,8 @@ typedef struct master_t { rxConfig_t rxConfig; inputFilteringMode_e inputFilteringMode; // Use hardware input filtering, e.g. for OrangeRX PPM/PWM receivers. - uint8_t retarded_arm; // allow disarsm/arm on throttle down + roll left/right + uint8_t retarded_arm; // allow disarm/arm on throttle down + roll left/right + uint8_t disarm_kill_switch; // allow disarm via AUX switch regardless of throttle value uint8_t small_angle; airplaneConfig_t airplaneConfig; diff --git a/src/main/io/rc_controls.c b/src/main/io/rc_controls.c index 8ac1ff1572..b581b1af1b 100644 --- a/src/main/io/rc_controls.c +++ b/src/main/io/rc_controls.c @@ -67,7 +67,7 @@ throttleStatus_e calculateThrottleStatus(rxConfig_t *rxConfig, uint16_t deadband return THROTTLE_HIGH; } -void processRcStickPositions(rxConfig_t *rxConfig, throttleStatus_e throttleStatus, uint32_t *activate, bool retarded_arm) +void processRcStickPositions(rxConfig_t *rxConfig, throttleStatus_e throttleStatus, uint32_t *activate, bool retarded_arm, bool disarm_kill_switch) { 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 @@ -103,7 +103,11 @@ void processRcStickPositions(rxConfig_t *rxConfig, throttleStatus_e throttleStat } else { // Disarming via ARM BOX if (ARMING_FLAG(ARMED)) { - mwDisarm(); + if (disarm_kill_switch) { + mwDisarm(); + } else if (throttleStatus == THROTTLE_LOW) { + mwDisarm(); + } } } } diff --git a/src/main/io/rc_controls.h b/src/main/io/rc_controls.h index c48076f378..55b999c0e8 100644 --- a/src/main/io/rc_controls.h +++ b/src/main/io/rc_controls.h @@ -91,7 +91,7 @@ extern int16_t rcCommand[4]; bool areSticksInApModePosition(uint16_t ap_mode); throttleStatus_e calculateThrottleStatus(rxConfig_t *rxConfig, uint16_t deadband3d_throttle); -void processRcStickPositions(rxConfig_t *rxConfig, throttleStatus_e throttleStatus, uint32_t *activate, bool retarded_arm); +void processRcStickPositions(rxConfig_t *rxConfig, throttleStatus_e throttleStatus, uint32_t *activate, bool retarded_arm, bool disarm_kill_switch); void updateRcOptions(uint32_t *activate); diff --git a/src/main/io/serial_cli.c b/src/main/io/serial_cli.c index 2440ac63cf..c4a6b6efc9 100644 --- a/src/main/io/serial_cli.c +++ b/src/main/io/serial_cli.c @@ -200,6 +200,7 @@ const clivalue_t valueTable[] = { { "servo_pwm_rate", VAR_UINT16 | MASTER_VALUE, &masterConfig.servo_pwm_rate, 50, 498 }, { "retarded_arm", VAR_UINT8 | MASTER_VALUE, &masterConfig.retarded_arm, 0, 1 }, + { "disarm_kill_switch", VAR_UINT8 | MASTER_VALUE, &masterConfig.disarm_kill_switch, 0, 1 }, { "small_angle", VAR_UINT8 | MASTER_VALUE, &masterConfig.small_angle, 0, 180 }, { "flaps_speed", VAR_UINT8 | MASTER_VALUE, &masterConfig.airplaneConfig.flaps_speed, 0, 100 }, diff --git a/src/main/mw.c b/src/main/mw.c index cdd2303501..f171115471 100755 --- a/src/main/mw.c +++ b/src/main/mw.c @@ -465,7 +465,7 @@ void processRx(void) resetErrorGyro(); } - processRcStickPositions(&masterConfig.rxConfig, throttleStatus, currentProfile->activate, masterConfig.retarded_arm); + processRcStickPositions(&masterConfig.rxConfig, throttleStatus, currentProfile->activate, masterConfig.retarded_arm, masterConfig.disarm_kill_switch); if (feature(FEATURE_INFLIGHT_ACC_CAL)) { updateInflightCalibrationState();