// Copyright (c) 2024 Oleg Kalachev // Repository: https://github.com/okalachev/flix // Fail-safe functions extern float controlTime; extern float controlRoll, controlPitch, controlThrottle, controlYaw; float rcLossTimeout = 1; float descendTime = 10; void failsafe() { rcLossFailsafe(); autoFailsafe(); } // RC loss failsafe void rcLossFailsafe() { if (!armed) return; if (t - controlTime > rcLossTimeout) { descend(); } } // Smooth descend on RC lost void descend() { mode = AUTO; attitudeTarget = Quaternion(); thrustTarget -= dt / descendTime; if (thrustTarget < 0) { thrustTarget = 0; armed = false; } } // Allow pilot to interrupt automatic flight void autoFailsafe() { static float roll, pitch, yaw, throttle; if (roll != controlRoll || pitch != controlPitch || yaw != controlYaw || abs(throttle - controlThrottle) > 0.05) { // controls changed and mode switch is not configured if (mode == AUTO && invalid(controlMode)) mode = STAB; // regain control by the pilot } roll = controlRoll; pitch = controlPitch; yaw = controlYaw; throttle = controlThrottle; }