diff --git a/src/main/fc/cli.c b/src/main/fc/cli.c index b6450593a8..d32cf9f610 100644 --- a/src/main/fc/cli.c +++ b/src/main/fc/cli.c @@ -3057,7 +3057,7 @@ static void cliMixerProfile(char *cmdline) return; } else { const int i = fastA2I(cmdline) - 1; - if (i >= 0 && i < MAX_PROFILE_COUNT) { + if (i >= 0 && i < MAX_MIXER_PROFILE_COUNT) { setConfigMixerProfileAndWriteEEPROM(i); cliMixerProfile(""); } diff --git a/src/main/fc/settings.c b/src/main/fc/settings.c index 200921bf86..8ea69b82f0 100644 --- a/src/main/fc/settings.c +++ b/src/main/fc/settings.c @@ -240,7 +240,7 @@ static uint16_t getValueOffset(const setting_t *value) case BATTERY_CONFIG_VALUE: return value->offset + sizeof(batteryProfile_t) * getConfigBatteryProfile(); case MIXER_CONFIG_VALUE: - return value->offset + sizeof(batteryProfile_t) * getConfigBatteryProfile(); + return value->offset + sizeof(mixerProfile_t) * getConfigMixerProfile(); } return 0; } diff --git a/src/main/programming/logic_condition.c b/src/main/programming/logic_condition.c index 990e9c1510..08cb452b64 100644 --- a/src/main/programming/logic_condition.c +++ b/src/main/programming/logic_condition.c @@ -50,6 +50,10 @@ #include "io/osd_common.h" #include "sensors/diagnostics.h" +#include "flight/mixer.h" +#include "flight/servos.h" +#include "drivers/pwm_mapping.h" + #include "navigation/navigation.h" #include "navigation/navigation_private.h" @@ -361,6 +365,28 @@ static int logicConditionCompute( } break; + case LOGIC_CONDITION_SET_MIXER_PROFILE: + operandA--; + if ( getConfigMixerProfile() != operandA && (operandA >= 0 && operandA < MAX_MIXER_PROFILE_COUNT)) { + bool mixerprofileChanged = false; + if (setConfigMixerProfile(operandA)) { + stopMotors(); + stopPwmAllMotors(); + servosInit(); + mixerUpdateStateFlags(); + mixerInit(); + pwmMotorAndServoInit(); + if (!STATE(ALTITUDE_CONTROL)) { + featureClear(FEATURE_AIRMODE); + } + mixerprofileChanged = true; + } + return mixerprofileChanged; + } else { + return false; + } + break; + case LOGIC_CONDITION_LOITER_OVERRIDE: logicConditionValuesByType[LOGIC_CONDITION_LOITER_OVERRIDE] = constrain(operandA, 0, 100000); LOGIC_CONDITION_GLOBAL_FLAG_ENABLE(LOGIC_CONDITION_GLOBAL_FLAG_OVERRIDE_LOITER_RADIUS); @@ -610,6 +636,10 @@ static int logicConditionGetFlightOperandValue(int operand) { case LOGIC_CONDITION_OPERAND_FLIGHT_ACTIVE_PROFILE: // int return getConfigProfile() + 1; break; + + case LOGIC_CONDITION_OPERAND_FLIGHT_ACTIVE_MIXER_PROFILE: // int + return getConfigMixerProfile() + 1; + break; case LOGIC_CONDITION_OPERAND_FLIGHT_LOITER_RADIUS: return getLoiterRadius(navConfig()->fw.loiter_radius); diff --git a/src/main/programming/logic_condition.h b/src/main/programming/logic_condition.h index 0025602984..2b18be4fa8 100644 --- a/src/main/programming/logic_condition.h +++ b/src/main/programming/logic_condition.h @@ -76,7 +76,8 @@ typedef enum { LOGIC_CONDITION_MAX = 44, LOGIC_CONDITION_FLIGHT_AXIS_ANGLE_OVERRIDE = 45, LOGIC_CONDITION_FLIGHT_AXIS_RATE_OVERRIDE = 46, - LOGIC_CONDITION_LAST = 47, + LOGIC_CONDITION_SET_MIXER_PROFILE = 47, + LOGIC_CONDITION_LAST = 48, } logicOperation_e; typedef enum logicOperandType_s { @@ -132,6 +133,7 @@ typedef enum { LOGIC_CONDITION_OPERAND_FLIGHT_AGL_STATUS, //0,1,2 // 38 LOGIC_CONDITION_OPERAND_FLIGHT_AGL, //0,1,2 // 39 LOGIC_CONDITION_OPERAND_FLIGHT_RANGEFINDER_RAW, //int // 40 + LOGIC_CONDITION_OPERAND_FLIGHT_ACTIVE_MIXER_PROFILE, //int // 41 } logicFlightOperands_e; typedef enum {