1
0
Fork 0
mirror of https://github.com/betaflight/betaflight.git synced 2025-07-16 04:45:24 +03:00

Merge pull request #6952 from mikeller/improve_airmode_detection

Improved handling of airmode detection.
This commit is contained in:
Michael Keller 2018-10-25 00:41:50 +13:00 committed by GitHub
commit f912b891b5
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
9 changed files with 22 additions and 16 deletions

View file

@ -578,7 +578,7 @@ bool processRx(timeUs_t currentTimeUs)
const throttleStatus_e throttleStatus = calculateThrottleStatus(); const throttleStatus_e throttleStatus = calculateThrottleStatus();
const uint8_t throttlePercent = calculateThrottlePercent(); const uint8_t throttlePercent = calculateThrottlePercent();
if (isAirmodeActive() && ARMING_FLAG(ARMED)) { if (airmodeIsEnabled() && ARMING_FLAG(ARMED)) {
if (throttlePercent >= rxConfig()->airModeActivateThreshold) { if (throttlePercent >= rxConfig()->airModeActivateThreshold) {
airmodeIsActivated = true; // Prevent iterm from being reset airmodeIsActivated = true; // Prevent iterm from being reset
} }
@ -618,7 +618,7 @@ bool processRx(timeUs_t currentTimeUs)
// - sticks are active and have deflection greater than runaway_takeoff_deactivate_stick_percent // - sticks are active and have deflection greater than runaway_takeoff_deactivate_stick_percent
// - pidSum on all axis is less then runaway_takeoff_deactivate_pidlimit // - pidSum on all axis is less then runaway_takeoff_deactivate_pidlimit
bool inStableFlight = false; bool inStableFlight = false;
if (!featureIsEnabled(FEATURE_MOTOR_STOP) || isAirmodeActive() || (throttleStatus != THROTTLE_LOW)) { // are motors running? if (!featureIsEnabled(FEATURE_MOTOR_STOP) || airmodeIsEnabled() || (throttleStatus != THROTTLE_LOW)) { // are motors running?
const uint8_t lowThrottleLimit = pidConfig()->runaway_takeoff_deactivate_throttle; const uint8_t lowThrottleLimit = pidConfig()->runaway_takeoff_deactivate_throttle;
const uint8_t midThrottleLimit = constrain(lowThrottleLimit * 2, lowThrottleLimit * 2, RUNAWAY_TAKEOFF_HIGH_THROTTLE_PERCENT); const uint8_t midThrottleLimit = constrain(lowThrottleLimit * 2, lowThrottleLimit * 2, RUNAWAY_TAKEOFF_HIGH_THROTTLE_PERCENT);
if ((((throttlePercent >= lowThrottleLimit) && areSticksActive(RUNAWAY_TAKEOFF_DEACTIVATE_STICK_PERCENT)) || (throttlePercent >= midThrottleLimit)) if ((((throttlePercent >= lowThrottleLimit) && areSticksActive(RUNAWAY_TAKEOFF_DEACTIVATE_STICK_PERCENT)) || (throttlePercent >= midThrottleLimit))
@ -674,7 +674,7 @@ bool processRx(timeUs_t currentTimeUs)
&& featureIsEnabled(FEATURE_MOTOR_STOP) && featureIsEnabled(FEATURE_MOTOR_STOP)
&& !STATE(FIXED_WING) && !STATE(FIXED_WING)
&& !featureIsEnabled(FEATURE_3D) && !featureIsEnabled(FEATURE_3D)
&& !isAirmodeActive() && !airmodeIsEnabled()
) { ) {
if (isUsingSticksForArming()) { if (isUsingSticksForArming()) {
if (throttleStatus == THROTTLE_LOW) { if (throttleStatus == THROTTLE_LOW) {
@ -872,7 +872,7 @@ static FAST_CODE void subTaskPidController(timeUs_t currentTimeUs)
&& !runawayTakeoffCheckDisabled && !runawayTakeoffCheckDisabled
&& !flipOverAfterCrashMode && !flipOverAfterCrashMode
&& !runawayTakeoffTemporarilyDisabled && !runawayTakeoffTemporarilyDisabled
&& (!featureIsEnabled(FEATURE_MOTOR_STOP) || isAirmodeActive() || (calculateThrottleStatus() != THROTTLE_LOW))) { && (!featureIsEnabled(FEATURE_MOTOR_STOP) || airmodeIsEnabled() || (calculateThrottleStatus() != THROTTLE_LOW))) {
if (((fabsf(pidData[FD_PITCH].Sum) >= RUNAWAY_TAKEOFF_PIDSUM_THRESHOLD) if (((fabsf(pidData[FD_PITCH].Sum) >= RUNAWAY_TAKEOFF_PIDSUM_THRESHOLD)
|| (fabsf(pidData[FD_ROLL].Sum) >= RUNAWAY_TAKEOFF_PIDSUM_THRESHOLD) || (fabsf(pidData[FD_ROLL].Sum) >= RUNAWAY_TAKEOFF_PIDSUM_THRESHOLD)

View file

@ -45,6 +45,8 @@
boxBitmask_t rcModeActivationMask; // one bit per mode defined in boxId_e boxBitmask_t rcModeActivationMask; // one bit per mode defined in boxId_e
static boxBitmask_t stickyModesEverDisabled; static boxBitmask_t stickyModesEverDisabled;
static bool airmodeEnabled;
PG_REGISTER_ARRAY(modeActivationCondition_t, MAX_MODE_ACTIVATION_CONDITION_COUNT, modeActivationConditions, PG_REGISTER_ARRAY(modeActivationCondition_t, MAX_MODE_ACTIVATION_CONDITION_COUNT, modeActivationConditions,
PG_MODE_ACTIVATION_PROFILE, 1); PG_MODE_ACTIVATION_PROFILE, 1);
@ -58,8 +60,8 @@ void rcModeUpdate(boxBitmask_t *newState)
rcModeActivationMask = *newState; rcModeActivationMask = *newState;
} }
bool isAirmodeActive(void) { bool airmodeIsEnabled(void) {
return (IS_RC_MODE_ACTIVE(BOXAIRMODE) || featureIsEnabled(FEATURE_AIRMODE)); return airmodeEnabled;
} }
bool isRangeActive(uint8_t auxChannelIndex, const channelRange_t *range) { bool isRangeActive(uint8_t auxChannelIndex, const channelRange_t *range) {
@ -136,6 +138,8 @@ void updateActivatedModes(void)
} }
rcModeUpdate(&newMask); rcModeUpdate(&newMask);
airmodeEnabled = featureIsEnabled(FEATURE_AIRMODE) || IS_RC_MODE_ACTIVE(BOXAIRMODE);
} }
bool isModeActivationConditionPresent(boxId_e modeId) bool isModeActivationConditionPresent(boxId_e modeId)

View file

@ -126,7 +126,7 @@ typedef struct modeActivationProfile_s {
bool IS_RC_MODE_ACTIVE(boxId_e boxId); bool IS_RC_MODE_ACTIVE(boxId_e boxId);
void rcModeUpdate(boxBitmask_t *newState); void rcModeUpdate(boxBitmask_t *newState);
bool isAirmodeActive(void); bool airmodeIsEnabled(void);
bool isRangeActive(uint8_t auxChannelIndex, const channelRange_t *range); bool isRangeActive(uint8_t auxChannelIndex, const channelRange_t *range);
void updateActivatedModes(void); void updateActivatedModes(void);

View file

@ -785,10 +785,12 @@ FAST_CODE_NOINLINE void mixTable(timeUs_t currentTimeUs, uint8_t vbatPidCompensa
throttle = applyThrottleLimit(throttle); throttle = applyThrottleLimit(throttle);
} }
const bool airmodeEnabled = airmodeIsEnabled();
#ifdef USE_YAW_SPIN_RECOVERY #ifdef USE_YAW_SPIN_RECOVERY
// 50% throttle provides the maximum authority for yaw recovery when airmode is not active. // 50% throttle provides the maximum authority for yaw recovery when airmode is not active.
// When airmode is active the throttle setting doesn't impact recovery authority. // When airmode is active the throttle setting doesn't impact recovery authority.
if (yawSpinDetected && !isAirmodeActive()) { if (yawSpinDetected && !airmodeEnabled) {
throttle = 0.5f; // throttle = 0.5f; //
} }
#endif // USE_YAW_SPIN_RECOVERY #endif // USE_YAW_SPIN_RECOVERY
@ -835,11 +837,11 @@ FAST_CODE_NOINLINE void mixTable(timeUs_t currentTimeUs, uint8_t vbatPidCompensa
motorMix[i] /= motorMixRange; motorMix[i] /= motorMixRange;
} }
// Get the maximum correction by setting offset to center when airmode enabled // Get the maximum correction by setting offset to center when airmode enabled
if (isAirmodeActive()) { if (airmodeEnabled) {
throttle = 0.5f; throttle = 0.5f;
} }
} else { } else {
if (isAirmodeActive() || throttle > 0.5f) { // Only automatically adjust throttle when airmode enabled. Airmode logic is always active on high throttle if (airmodeEnabled || throttle > 0.5f) { // Only automatically adjust throttle when airmode enabled. Airmode logic is always active on high throttle
const float throttleLimitOffset = motorMixRange / 2.0f; const float throttleLimitOffset = motorMixRange / 2.0f;
throttle = constrainf(throttle, 0.0f + throttleLimitOffset, 1.0f - throttleLimitOffset); throttle = constrainf(throttle, 0.0f + throttleLimitOffset, 1.0f - throttleLimitOffset);
} }
@ -848,7 +850,7 @@ FAST_CODE_NOINLINE void mixTable(timeUs_t currentTimeUs, uint8_t vbatPidCompensa
if (featureIsEnabled(FEATURE_MOTOR_STOP) if (featureIsEnabled(FEATURE_MOTOR_STOP)
&& ARMING_FLAG(ARMED) && ARMING_FLAG(ARMED)
&& !featureIsEnabled(FEATURE_3D) && !featureIsEnabled(FEATURE_3D)
&& !isAirmodeActive() && !airmodeEnabled
&& (rcData[THROTTLE] < rxConfig()->mincheck)) { && (rcData[THROTTLE] < rxConfig()->mincheck)) {
// motor_stop handling // motor_stop handling
applyMotorStop(); applyMotorStop();

View file

@ -637,7 +637,7 @@ static bool osdDrawSingleElement(uint8_t item)
strcpy(buff, "HOR "); strcpy(buff, "HOR ");
} else if (IS_RC_MODE_ACTIVE(BOXACROTRAINER)) { } else if (IS_RC_MODE_ACTIVE(BOXACROTRAINER)) {
strcpy(buff, "ATRN"); strcpy(buff, "ATRN");
} else if (isAirmodeActive()) { } else if (airmodeIsEnabled()) {
strcpy(buff, "AIR "); strcpy(buff, "AIR ");
} else { } else {
strcpy(buff, "ACRO"); strcpy(buff, "ACRO");

View file

@ -268,7 +268,7 @@ void crsfFrameFlightMode(sbuf_t *dst)
// use same logic as OSD, so telemetry displays same flight text as OSD // use same logic as OSD, so telemetry displays same flight text as OSD
const char *flightMode = "ACRO"; const char *flightMode = "ACRO";
if (isAirmodeActive()) { if (airmodeIsEnabled()) {
flightMode = "AIR"; flightMode = "AIR";
} }
if (FLIGHT_MODE(FAILSAFE_MODE)) { if (FLIGHT_MODE(FAILSAFE_MODE)) {

View file

@ -976,7 +976,7 @@ extern "C" {
return false; return false;
} }
bool isAirmodeActive() { bool airmodeIsEnabled() {
return false; return false;
} }

View file

@ -278,7 +278,7 @@ extern "C" {
bool featureIsEnabled(uint32_t) {return false;} bool featureIsEnabled(uint32_t) {return false;}
bool isAirmodeActive(void) {return true;} bool airmodeIsEnabled(void) {return true;}
mspResult_e mspFcProcessCommand(mspPacket_t *cmd, mspPacket_t *reply, mspPostProcessFnPtr *mspPostProcessFn) { mspResult_e mspFcProcessCommand(mspPacket_t *cmd, mspPacket_t *reply, mspPostProcessFnPtr *mspPostProcessFn) {

View file

@ -312,7 +312,7 @@ bool telemetryCheckRxPortShared(const serialPortConfig_t *) {return true;}
portSharing_e determinePortSharing(const serialPortConfig_t *, serialPortFunction_e) {return PORTSHARING_NOT_SHARED;} portSharing_e determinePortSharing(const serialPortConfig_t *, serialPortFunction_e) {return PORTSHARING_NOT_SHARED;}
bool isAirmodeActive(void) {return airMode;} bool airmodeIsEnabled(void) {return airMode;}
int32_t getAmperage(void) { int32_t getAmperage(void) {
return testAmperage; return testAmperage;