Merge pull request #10430 from etracer65/improve_rates_range_checks
Improve rate settings range checking
This commit is contained in:
commit
20940de41d
|
@ -103,11 +103,6 @@ pidProfile_t *currentPidProfile;
|
||||||
|
|
||||||
#define DYNAMIC_FILTER_MAX_SUPPORTED_LOOP_TIME HZ_TO_INTERVAL_US(2000)
|
#define DYNAMIC_FILTER_MAX_SUPPORTED_LOOP_TIME HZ_TO_INTERVAL_US(2000)
|
||||||
|
|
||||||
#define BETAFLIGHT_MAX_SRATE 100
|
|
||||||
#define KISS_MAX_SRATE 99
|
|
||||||
#define QUICK_MAX_RATE 200
|
|
||||||
#define ACTUAL_MAX_RATE 200
|
|
||||||
|
|
||||||
PG_REGISTER_WITH_RESET_TEMPLATE(pilotConfig_t, pilotConfig, PG_PILOT_CONFIG, 1);
|
PG_REGISTER_WITH_RESET_TEMPLATE(pilotConfig_t, pilotConfig, PG_PILOT_CONFIG, 1);
|
||||||
|
|
||||||
PG_RESET_TEMPLATE(pilotConfig_t, pilotConfig,
|
PG_RESET_TEMPLATE(pilotConfig_t, pilotConfig,
|
||||||
|
@ -197,6 +192,18 @@ static void adjustFilterLimit(uint16_t *parm, uint16_t resetValue)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void validateAndFixRatesSettings(void)
|
||||||
|
{
|
||||||
|
for (unsigned profileIndex = 0; profileIndex < CONTROL_RATE_PROFILE_COUNT; profileIndex++) {
|
||||||
|
const ratesType_e ratesType = controlRateProfilesMutable(profileIndex)->rates_type;
|
||||||
|
for (unsigned axis = FD_ROLL; axis <= FD_YAW; axis++) {
|
||||||
|
controlRateProfilesMutable(profileIndex)->rcRates[axis] = constrain(controlRateProfilesMutable(profileIndex)->rcRates[axis], 0, ratesSettingLimits[ratesType].rc_rate_limit);
|
||||||
|
controlRateProfilesMutable(profileIndex)->rates[axis] = constrain(controlRateProfilesMutable(profileIndex)->rates[axis], 0, ratesSettingLimits[ratesType].srate_limit);
|
||||||
|
controlRateProfilesMutable(profileIndex)->rcExpo[axis] = constrain(controlRateProfilesMutable(profileIndex)->rcExpo[axis], 0, ratesSettingLimits[ratesType].expo_limit);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void validateAndFixConfig(void)
|
static void validateAndFixConfig(void)
|
||||||
{
|
{
|
||||||
#if !defined(USE_QUAD_MIXER_ONLY)
|
#if !defined(USE_QUAD_MIXER_ONLY)
|
||||||
|
@ -571,37 +578,7 @@ static void validateAndFixConfig(void)
|
||||||
targetValidateConfiguration();
|
targetValidateConfiguration();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
for (unsigned i = 0; i < CONTROL_RATE_PROFILE_COUNT; i++) {
|
validateAndFixRatesSettings(); // constrain the various rates settings to limits imposed by the rates type
|
||||||
switch (controlRateProfilesMutable(i)->rates_type) {
|
|
||||||
case RATES_TYPE_BETAFLIGHT:
|
|
||||||
default:
|
|
||||||
for (int axis = FD_ROLL; axis <= FD_YAW; axis++) {
|
|
||||||
controlRateProfilesMutable(i)->rates[axis] = constrain(controlRateProfilesMutable(i)->rates[axis], 0, BETAFLIGHT_MAX_SRATE);
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
case RATES_TYPE_RACEFLIGHT:
|
|
||||||
break; // no range constraint is necessary - allows 0 - 255
|
|
||||||
case RATES_TYPE_KISS:
|
|
||||||
for (int axis = FD_ROLL; axis <= FD_YAW; axis++) {
|
|
||||||
controlRateProfilesMutable(i)->rates[axis] = constrain(controlRateProfilesMutable(i)->rates[axis], 0, KISS_MAX_SRATE);
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
case RATES_TYPE_ACTUAL:
|
|
||||||
for (int axis = FD_ROLL; axis <= FD_YAW; axis++) {
|
|
||||||
controlRateProfilesMutable(i)->rates[axis] = constrain(controlRateProfilesMutable(i)->rates[axis], 0, ACTUAL_MAX_RATE);
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
case RATES_TYPE_QUICK:
|
|
||||||
for (int axis = FD_ROLL; axis <= FD_YAW; axis++) {
|
|
||||||
controlRateProfilesMutable(i)->rates[axis] = constrain(controlRateProfilesMutable(i)->rates[axis], 0, QUICK_MAX_RATE);
|
|
||||||
}
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#if defined(USE_RX_MSP_OVERRIDE)
|
#if defined(USE_RX_MSP_OVERRIDE)
|
||||||
for (int i = 0; i < MAX_MODE_ACTIVATION_CONDITION_COUNT; i++) {
|
for (int i = 0; i < MAX_MODE_ACTIVATION_CONDITION_COUNT; i++) {
|
||||||
|
|
|
@ -69,6 +69,14 @@ void pgResetFn_controlRateProfiles(controlRateConfig_t *controlRateConfig)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const ratesSettingsLimits_t ratesSettingLimits[RATES_TYPE_COUNT] = {
|
||||||
|
[RATES_TYPE_BETAFLIGHT] = { 255, 100, 100 },
|
||||||
|
[RATES_TYPE_RACEFLIGHT] = { 200, 255, 100 },
|
||||||
|
[RATES_TYPE_KISS] = { 255, 99, 100 },
|
||||||
|
[RATES_TYPE_ACTUAL] = { 200, 200, 100 },
|
||||||
|
[RATES_TYPE_QUICK] = { 255, 200, 100 },
|
||||||
|
};
|
||||||
|
|
||||||
void loadControlRateProfile(void)
|
void loadControlRateProfile(void)
|
||||||
{
|
{
|
||||||
currentControlRateProfile = controlRateProfilesMutable(systemConfig()->activeRateProfile);
|
currentControlRateProfile = controlRateProfilesMutable(systemConfig()->activeRateProfile);
|
||||||
|
|
|
@ -30,8 +30,15 @@ typedef enum {
|
||||||
RATES_TYPE_KISS,
|
RATES_TYPE_KISS,
|
||||||
RATES_TYPE_ACTUAL,
|
RATES_TYPE_ACTUAL,
|
||||||
RATES_TYPE_QUICK,
|
RATES_TYPE_QUICK,
|
||||||
|
RATES_TYPE_COUNT // must be the final entry
|
||||||
} ratesType_e;
|
} ratesType_e;
|
||||||
|
|
||||||
|
typedef struct ratesSettingsLimits_s {
|
||||||
|
uint8_t rc_rate_limit;
|
||||||
|
uint8_t srate_limit;
|
||||||
|
uint8_t expo_limit;
|
||||||
|
} ratesSettingsLimits_t;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
THROTTLE_LIMIT_TYPE_OFF = 0,
|
THROTTLE_LIMIT_TYPE_OFF = 0,
|
||||||
THROTTLE_LIMIT_TYPE_SCALE,
|
THROTTLE_LIMIT_TYPE_SCALE,
|
||||||
|
@ -66,6 +73,7 @@ typedef struct controlRateConfig_s {
|
||||||
PG_DECLARE_ARRAY(controlRateConfig_t, CONTROL_RATE_PROFILE_COUNT, controlRateProfiles);
|
PG_DECLARE_ARRAY(controlRateConfig_t, CONTROL_RATE_PROFILE_COUNT, controlRateProfiles);
|
||||||
|
|
||||||
extern controlRateConfig_t *currentControlRateProfile;
|
extern controlRateConfig_t *currentControlRateProfile;
|
||||||
|
extern const ratesSettingsLimits_t ratesSettingLimits[RATES_TYPE_COUNT];
|
||||||
|
|
||||||
void loadControlRateProfile(void);
|
void loadControlRateProfile(void);
|
||||||
void changeControlRateProfile(uint8_t controlRateProfileIndex);
|
void changeControlRateProfile(uint8_t controlRateProfileIndex);
|
||||||
|
|
Loading…
Reference in New Issue