void mixerInit(void) { int i; // enable servos for mixes that require them. note, this shifts motor counts. core.useServo = mixers[mcfg.mixerConfiguration].useServo; // if we want camstab/trig or servo mixers, that also enables servos, even if mixerConfiguration doesn't if (feature(FEATURE_SERVO_TILT) || feature(FEATURE_SERVO_MIXER)) core.useServo = 1; if (mcfg.mixerConfiguration == MULTITYPE_CUSTOM) { // load custom mixer into currentMixer for (i = 0; i < MAX_MOTORS; i++) { // check if done if (mcfg.customMixer[i].throttle == 0.0f) break; currentMixer[i] = mcfg.customMixer[i]; numberMotor++; } } else { numberMotor = mixers[mcfg.mixerConfiguration].numberMotor; // copy motor-based mixers if (mixers[mcfg.mixerConfiguration].motor) { for (i = 0; i < numberMotor; i++) currentMixer[i] = mixers[mcfg.mixerConfiguration].motor[i]; } } if (core.useServo) { numberRules = servoMixers[mcfg.mixerConfiguration].numberRules; if (servoMixers[mcfg.mixerConfiguration].rule) { for (i = 0; i < numberRules; i++) currentServoMixer[i] = servoMixers[mcfg.mixerConfiguration].rule[i]; } } // in 3D mode, mixer gain has to be halved if (feature(FEATURE_3D)) { if (numberMotor > 1) { for (i = 0; i < numberMotor; i++) { currentMixer[i].pitch *= 0.5f; currentMixer[i].roll *= 0.5f; currentMixer[i].yaw *= 0.5f; } } } // set flag that we're on something with wings if (mcfg.mixerConfiguration == MULTITYPE_FLYING_WING || mcfg.mixerConfiguration == MULTITYPE_AIRPLANE || mcfg.mixerConfiguration == MULTITYPE_CUSTOM_PLANE) { f.FIXED_WING = 1; } else f.FIXED_WING = 0; if (core.useServo) loadCustomServoMixer(); mixerResetMotors(); }
static void cliExit(char *cmdline) { cliPrint("\r\nLeaving CLI mode...\r\n"); *cliBuffer = '\0'; bufferIndex = 0; cliMode = 0; // incase some idiot leaves a motor running during motortest, clear it here mixerResetMotors(); // save and reboot... I think this makes the most sense cliSave(cmdline); }
static void cliExit(char *cmdline) { cliPrint("\r\nLeaving CLI mode...\r\n"); *cliBuffer = '\0'; bufferIndex = 0; cliMode = 0; // incase some idiot leaves a motor running during motortest, clear it here mixerResetMotors(); // save and reboot... I think this makes the most sense - otherwise config changes can be out of sync, maybe just need to applyConfig and return? #if 1 cliSave(cmdline); #else releaseSerialPort(cliPort, FUNCTION_CLI); #endif }