Refactored the validation code

- The check is active regardless of the USE_UNCOMMON_MIXER to detect
unsupported/insufficiently supported mixers.
- Custom mixers always pass the check.
- Mixer mode resets to MIXER_CUSTOM if motorCount != 0 but motor array
is NULL.
- Mixer mode resets to MIXER_CUSTOM_AIRPLANE if useServo but servo
count is zero.
This commit is contained in:
jflyper 2017-06-01 00:30:04 +09:00
parent 0fcccd7a40
commit 0b1383a730
3 changed files with 19 additions and 10 deletions

View File

@ -546,11 +546,19 @@ void activateConfig(void)
void validateAndFixConfig(void) void validateAndFixConfig(void)
{ {
#if !defined(USE_UNCOMMON_MIXERS) && !defined(USE_QUAD_MIXER_ONLY) && !defined(USE_OSD_SLAVE) #if !defined(USE_QUAD_MIXER_ONLY) && !defined(USE_OSD_SLAVE)
// Reset unsupported mixer mode to default.
// This check will be gone when motor/servo mixers are loaded dynamically
// by configurator as a part of configuration procedure.
mixerMode_e mixerMode = mixerConfigMutable()->mixerMode; mixerMode_e mixerMode = mixerConfigMutable()->mixerMode;
if (mixerMode != MIXER_CUSTOM && mixerMode != MIXER_CUSTOM_AIRPLANE && mixerMode != MIXER_CUSTOM_TRI && mixerMode != MIXER_GIMBAL && mixerMode != MIXER_PPM_TO_SERVO && mixers[mixerMode].motor == NULL) { if (!(mixerMode == MIXER_CUSTOM || mixerMode == MIXER_CUSTOM_AIRPLANE || mixerMode == MIXER_CUSTOM_TRI)) {
if (mixers[mixerMode].motorCount && mixers[mixerMode].motor == NULL)
mixerConfigMutable()->mixerMode = MIXER_CUSTOM; mixerConfigMutable()->mixerMode = MIXER_CUSTOM;
if (mixers[mixerMode].useServo && servoMixers[mixerMode].servoRuleCount == 0)
mixerConfigMutable()->mixerMode = MIXER_CUSTOM_AIRPLANE;
} }
#endif #endif

View File

@ -148,13 +148,6 @@ static const servoMixer_t servoMixerGimbal[] = {
{ SERVO_GIMBAL_ROLL, INPUT_GIMBAL_ROLL, 125, 0, 0, 100, 0 }, { SERVO_GIMBAL_ROLL, INPUT_GIMBAL_ROLL, 125, 0, 0, 100, 0 },
}; };
// Custom mixer configuration
typedef struct mixerRules_s {
uint8_t servoRuleCount;
const servoMixer_t *rule;
} mixerRules_t;
const mixerRules_t servoMixers[] = { const mixerRules_t servoMixers[] = {
{ 0, NULL }, // entry 0 { 0, NULL }, // entry 0
{ COUNT_SERVO_RULES(servoMixerTri), servoMixerTri }, // MULTITYPE_TRI { COUNT_SERVO_RULES(servoMixerTri), servoMixerTri }, // MULTITYPE_TRI

View File

@ -91,6 +91,14 @@ typedef struct servoMixer_s {
PG_DECLARE_ARRAY(servoMixer_t, MAX_SERVO_RULES, customServoMixers); PG_DECLARE_ARRAY(servoMixer_t, MAX_SERVO_RULES, customServoMixers);
// Custom mixer configuration
typedef struct mixerRules_s {
uint8_t servoRuleCount;
const servoMixer_t *rule;
} mixerRules_t;
extern const mixerRules_t servoMixers[];
typedef struct servoParam_s { typedef struct servoParam_s {
uint32_t reversedSources; // the direction of servo movement for each input source of the servo mixer, bit set=inverted uint32_t reversedSources; // the direction of servo movement for each input source of the servo mixer, bit set=inverted
int16_t min; // servo min int16_t min; // servo min