Loading files
This file is pinned to the selected release. Download the original to open it in your design tool.
c68be57e1This file is pinned to the selected release. Download the original to open it in your design tool.
// Copyright (c) 2024 Oleg Kalachev <okalachev@gmail.com>
// Repository: https://github.com/okalachev/flix
// Fail-safe functions
#include "config.h"
#include "flix.h"
#include "util.h"
extern float controlTime;
extern const int AUTO, STAB;
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;
}