mirror of
https://github.com/betaflight/betaflight.git
synced 2025-07-14 03:50:02 +03:00
Merge pull request #9491 from mikeller/improve_level_mode_code
Improved code to apply level modes.
This commit is contained in:
commit
dc1bf7e372
1 changed files with 31 additions and 4 deletions
|
@ -62,6 +62,12 @@
|
||||||
|
|
||||||
#include "pid.h"
|
#include "pid.h"
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
LEVEL_MODE_OFF = 0,
|
||||||
|
LEVEL_MODE_R,
|
||||||
|
LEVEL_MODE_RP,
|
||||||
|
} levelMode_e;
|
||||||
|
|
||||||
const char pidNames[] =
|
const char pidNames[] =
|
||||||
"ROLL;"
|
"ROLL;"
|
||||||
"PITCH;"
|
"PITCH;"
|
||||||
|
@ -1295,13 +1301,21 @@ void FAST_CODE pidController(const pidProfile_t *pidProfile, timeUs_t currentTim
|
||||||
|
|
||||||
#if defined(USE_ACC)
|
#if defined(USE_ACC)
|
||||||
const bool gpsRescueIsActive = FLIGHT_MODE(GPS_RESCUE_MODE);
|
const bool gpsRescueIsActive = FLIGHT_MODE(GPS_RESCUE_MODE);
|
||||||
const bool levelModeActive = FLIGHT_MODE(ANGLE_MODE) || FLIGHT_MODE(HORIZON_MODE) || gpsRescueIsActive;
|
levelMode_e levelMode;
|
||||||
const bool levelRaceModeActive = levelRaceMode && (FLIGHT_MODE(ANGLE_MODE) || FLIGHT_MODE(HORIZON_MODE)) && !gpsRescueIsActive;
|
if (FLIGHT_MODE(ANGLE_MODE) || FLIGHT_MODE(HORIZON_MODE) || gpsRescueIsActive) {
|
||||||
|
if (levelRaceMode && !gpsRescueIsActive) {
|
||||||
|
levelMode = LEVEL_MODE_R;
|
||||||
|
} else {
|
||||||
|
levelMode = LEVEL_MODE_RP;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
levelMode = LEVEL_MODE_OFF;
|
||||||
|
}
|
||||||
|
|
||||||
// Keep track of when we entered a self-level mode so that we can
|
// Keep track of when we entered a self-level mode so that we can
|
||||||
// add a guard time before crash recovery can activate.
|
// add a guard time before crash recovery can activate.
|
||||||
// Also reset the guard time whenever GPS Rescue is activated.
|
// Also reset the guard time whenever GPS Rescue is activated.
|
||||||
if (levelModeActive) {
|
if (levelMode) {
|
||||||
if ((levelModeStartTimeUs == 0) || (gpsRescueIsActive && !gpsRescuePreviousState)) {
|
if ((levelModeStartTimeUs == 0) || (gpsRescueIsActive && !gpsRescuePreviousState)) {
|
||||||
levelModeStartTimeUs = currentTimeUs;
|
levelModeStartTimeUs = currentTimeUs;
|
||||||
}
|
}
|
||||||
|
@ -1361,7 +1375,20 @@ void FAST_CODE pidController(const pidProfile_t *pidProfile, timeUs_t currentTim
|
||||||
// Yaw control is GYRO based, direct sticks control is applied to rate PID
|
// Yaw control is GYRO based, direct sticks control is applied to rate PID
|
||||||
// When Race Mode is active PITCH control is also GYRO based in level or horizon mode
|
// When Race Mode is active PITCH control is also GYRO based in level or horizon mode
|
||||||
#if defined(USE_ACC)
|
#if defined(USE_ACC)
|
||||||
if (levelModeActive && (axis != FD_YAW) && !(levelRaceModeActive && (axis == FD_PITCH))) {
|
switch (levelMode) {
|
||||||
|
case LEVEL_MODE_OFF:
|
||||||
|
|
||||||
|
break;
|
||||||
|
case LEVEL_MODE_R:
|
||||||
|
if (axis == FD_PITCH) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
FALLTHROUGH;
|
||||||
|
case LEVEL_MODE_RP:
|
||||||
|
if (axis == FD_YAW) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
currentPidSetpoint = pidLevel(axis, pidProfile, angleTrim, currentPidSetpoint);
|
currentPidSetpoint = pidLevel(axis, pidProfile, angleTrim, currentPidSetpoint);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue