From 4519935c9236b89db6cacf3de28f648ae9b194d2 Mon Sep 17 00:00:00 2001 From: Nicola De Pasquale Date: Mon, 9 Mar 2020 21:33:10 +0100 Subject: [PATCH 1/3] increase srate max setting for using new rate systems --- src/main/cms/cms_menu_imu.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/cms/cms_menu_imu.c b/src/main/cms/cms_menu_imu.c index fbbc474ab..6dc8a9910 100644 --- a/src/main/cms/cms_menu_imu.c +++ b/src/main/cms/cms_menu_imu.c @@ -257,9 +257,9 @@ static const OSD_Entry cmsx_menuRateProfileEntries[] = { "RC P RATE", OME_FLOAT, NULL, &(OSD_FLOAT_t) { &rateProfile.rcRates[FD_PITCH], 1, CONTROL_RATE_CONFIG_RC_RATES_MAX, 1, 10 }, 0 }, { "RC Y RATE", OME_FLOAT, NULL, &(OSD_FLOAT_t) { &rateProfile.rcRates[FD_YAW], 1, CONTROL_RATE_CONFIG_RC_RATES_MAX, 1, 10 }, 0 }, - { "ROLL SUPER", OME_FLOAT, NULL, &(OSD_FLOAT_t) { &rateProfile.rates[FD_ROLL], 0, 100, 1, 10 }, 0 }, - { "PITCH SUPER", OME_FLOAT, NULL, &(OSD_FLOAT_t) { &rateProfile.rates[FD_PITCH], 0, 100, 1, 10 }, 0 }, - { "YAW SUPER", OME_FLOAT, NULL, &(OSD_FLOAT_t) { &rateProfile.rates[FD_YAW], 0, 100, 1, 10 }, 0 }, + { "ROLL SUPER", OME_FLOAT, NULL, &(OSD_FLOAT_t) { &rateProfile.rates[FD_ROLL], 0, CONTROL_RATE_CONFIG_RATE_MAX, 1, 10 }, 0 }, + { "PITCH SUPER", OME_FLOAT, NULL, &(OSD_FLOAT_t) { &rateProfile.rates[FD_PITCH], 0, CONTROL_RATE_CONFIG_RATE_MAX, 1, 10 }, 0 }, + { "YAW SUPER", OME_FLOAT, NULL, &(OSD_FLOAT_t) { &rateProfile.rates[FD_YAW], 0, CONTROL_RATE_CONFIG_RATE_MAX, 1, 10 }, 0 }, { "RC R EXPO", OME_FLOAT, NULL, &(OSD_FLOAT_t) { &rateProfile.rcExpo[FD_ROLL], 0, 100, 1, 10 }, 0 }, { "RC P EXPO", OME_FLOAT, NULL, &(OSD_FLOAT_t) { &rateProfile.rcExpo[FD_PITCH], 0, 100, 1, 10 }, 0 }, From 5adc8d5ce60c90a47ee59597312e1f540c36c25a Mon Sep 17 00:00:00 2001 From: Nicola De Pasquale Date: Tue, 10 Mar 2020 11:50:47 +0100 Subject: [PATCH 2/3] add validation based on rates type --- src/main/config/config.c | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/src/main/config/config.c b/src/main/config/config.c index a206655a8..5c5396863 100644 --- a/src/main/config/config.c +++ b/src/main/config/config.c @@ -91,6 +91,7 @@ static bool configIsDirty; /* someone indicated that the config is modified and static bool rebootRequired = false; // set if a config change requires a reboot to take effect pidProfile_t *currentPidProfile; +controlRateConfig_t *currentRateProfile; #ifndef RX_SPI_DEFAULT_PROTOCOL #define RX_SPI_DEFAULT_PROTOCOL 0 @@ -98,6 +99,11 @@ pidProfile_t *currentPidProfile; #define DYNAMIC_FILTER_MAX_SUPPORTED_LOOP_TIME HZ_TO_INTERVAL_US(2000) +#define BETAFLIGHT_MAX_SRATE 100 +#define KISS_MAX_SRATE 100 +#define QUICK_MAX_RATE 200 +#define ACTUAL_MAX_RATE 200 + PG_REGISTER_WITH_RESET_TEMPLATE(pilotConfig_t, pilotConfig, PG_PILOT_CONFIG, 1); PG_RESET_TEMPLATE(pilotConfig_t, pilotConfig, @@ -132,6 +138,11 @@ static void loadPidProfile(void) currentPidProfile = pidProfilesMutable(systemConfig()->pidProfileIndex); } +static void loadCurrentControlRateProfile(void) +{ + currentControlRateProfile = controlRateProfilesMutable(systemConfig()->activeRateProfile); +} + uint8_t getCurrentControlRateProfileIndex(void) { return systemConfig()->activeRateProfile; @@ -156,6 +167,7 @@ static void activateConfig(void) schedulerOptimizeRate(systemConfig()->schedulerOptimizeRate == SCHEDULER_OPTIMIZE_RATE_ON || (systemConfig()->schedulerOptimizeRate == SCHEDULER_OPTIMIZE_RATE_AUTO && motorConfig()->dev.useDshotTelemetry)); loadPidProfile(); loadControlRateProfile(); + loadCurrentControlRateProfile(); initRcProcessing(); @@ -555,6 +567,32 @@ static void validateAndFixConfig(void) #if defined(TARGET_VALIDATECONFIG) targetValidateConfiguration(); #endif + + switch (currentControlRateProfile->rates_type) { + case RATES_TYPE_BETAFLIGHT: + default: + for (int axis = FD_ROLL; axis <= FD_YAW; axis++) { + currentControlRateProfile->rates[axis] = constrain(currentControlRateProfile->rates[axis], 0, BETAFLIGHT_MAX_SRATE); + } + + break; + case RATES_TYPE_KISS: + for (int axis = FD_ROLL; axis <= FD_YAW; axis++) { + currentControlRateProfile->rates[axis] = constrain(currentControlRateProfile->rates[axis], 0, KISS_MAX_SRATE); + } + + break; + case RATES_TYPE_ACTUAL: + for (int axis = FD_ROLL; axis <= FD_YAW; axis++) { + currentControlRateProfile->rates[axis] = constrain(currentControlRateProfile->rates[axis], 0, ACTUAL_MAX_RATE); + } + + break; + case RATES_TYPE_QUICK: + for (int axis = FD_ROLL; axis <= FD_YAW; axis++) { + currentControlRateProfile->rates[axis] = constrain(currentControlRateProfile->rates[axis], 0, QUICK_MAX_RATE); + } + } } void validateAndFixGyroConfig(void) From db3d71a2677bc5e4a8dd88ecd71140771dc1685c Mon Sep 17 00:00:00 2001 From: Nicola De Pasquale Date: Tue, 10 Mar 2020 21:28:17 +0100 Subject: [PATCH 3/3] validation for all rate profiles --- src/main/config/config.c | 49 ++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 27 deletions(-) diff --git a/src/main/config/config.c b/src/main/config/config.c index 5c5396863..c0547ecaf 100644 --- a/src/main/config/config.c +++ b/src/main/config/config.c @@ -91,7 +91,6 @@ static bool configIsDirty; /* someone indicated that the config is modified and static bool rebootRequired = false; // set if a config change requires a reboot to take effect pidProfile_t *currentPidProfile; -controlRateConfig_t *currentRateProfile; #ifndef RX_SPI_DEFAULT_PROTOCOL #define RX_SPI_DEFAULT_PROTOCOL 0 @@ -138,11 +137,6 @@ static void loadPidProfile(void) currentPidProfile = pidProfilesMutable(systemConfig()->pidProfileIndex); } -static void loadCurrentControlRateProfile(void) -{ - currentControlRateProfile = controlRateProfilesMutable(systemConfig()->activeRateProfile); -} - uint8_t getCurrentControlRateProfileIndex(void) { return systemConfig()->activeRateProfile; @@ -167,7 +161,6 @@ static void activateConfig(void) schedulerOptimizeRate(systemConfig()->schedulerOptimizeRate == SCHEDULER_OPTIMIZE_RATE_ON || (systemConfig()->schedulerOptimizeRate == SCHEDULER_OPTIMIZE_RATE_AUTO && motorConfig()->dev.useDshotTelemetry)); loadPidProfile(); loadControlRateProfile(); - loadCurrentControlRateProfile(); initRcProcessing(); @@ -568,29 +561,31 @@ static void validateAndFixConfig(void) targetValidateConfiguration(); #endif - switch (currentControlRateProfile->rates_type) { - case RATES_TYPE_BETAFLIGHT: - default: - for (int axis = FD_ROLL; axis <= FD_YAW; axis++) { - currentControlRateProfile->rates[axis] = constrain(currentControlRateProfile->rates[axis], 0, BETAFLIGHT_MAX_SRATE); - } + for (unsigned i = 0; i < CONTROL_RATE_PROFILE_COUNT; i++) { + 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_KISS: - for (int axis = FD_ROLL; axis <= FD_YAW; axis++) { - currentControlRateProfile->rates[axis] = constrain(currentControlRateProfile->rates[axis], 0, KISS_MAX_SRATE); - } + break; + 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++) { - currentControlRateProfile->rates[axis] = constrain(currentControlRateProfile->rates[axis], 0, ACTUAL_MAX_RATE); - } + 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++) { - currentControlRateProfile->rates[axis] = constrain(currentControlRateProfile->rates[axis], 0, QUICK_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); + } } } }