mirror of
https://github.com/iNavFlight/inav.git
synced 2025-07-19 22:35:19 +03:00
Add new stateds
This commit is contained in:
parent
d5d47b3515
commit
339b1047e0
18 changed files with 80 additions and 78 deletions
|
@ -624,14 +624,14 @@ static bool testBlackboxConditionUncached(FlightLogFieldCondition condition)
|
||||||
|
|
||||||
case FLIGHT_LOG_FIELD_CONDITION_FIXED_WING_NAV:
|
case FLIGHT_LOG_FIELD_CONDITION_FIXED_WING_NAV:
|
||||||
#ifdef USE_NAV
|
#ifdef USE_NAV
|
||||||
return STATE(AIRPLANE_ROVER_BOAT);
|
return STATE(FIXED_WING);
|
||||||
#else
|
#else
|
||||||
return false;
|
return false;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
case FLIGHT_LOG_FIELD_CONDITION_MC_NAV:
|
case FLIGHT_LOG_FIELD_CONDITION_MC_NAV:
|
||||||
#ifdef USE_NAV
|
#ifdef USE_NAV
|
||||||
return !STATE(AIRPLANE_ROVER_BOAT);
|
return !STATE(FIXED_WING);
|
||||||
#else
|
#else
|
||||||
return false;
|
return false;
|
||||||
#endif
|
#endif
|
||||||
|
@ -1369,7 +1369,7 @@ static void loadMainState(timeUs_t currentTimeUs)
|
||||||
blackboxCurrent->magADC[i] = mag.magADC[i];
|
blackboxCurrent->magADC[i] = mag.magADC[i];
|
||||||
#endif
|
#endif
|
||||||
#ifdef USE_NAV
|
#ifdef USE_NAV
|
||||||
if (!STATE(AIRPLANE_ROVER_BOAT)) {
|
if (!STATE(FIXED_WING)) {
|
||||||
// log requested velocity in cm/s
|
// log requested velocity in cm/s
|
||||||
blackboxCurrent->mcPosAxisP[i] = lrintf(nav_pids->pos[i].output_constrained);
|
blackboxCurrent->mcPosAxisP[i] = lrintf(nav_pids->pos[i].output_constrained);
|
||||||
|
|
||||||
|
@ -1384,7 +1384,7 @@ static void loadMainState(timeUs_t currentTimeUs)
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef USE_NAV
|
#ifdef USE_NAV
|
||||||
if (STATE(AIRPLANE_ROVER_BOAT)) {
|
if (STATE(FIXED_WING)) {
|
||||||
|
|
||||||
// log requested pitch in decidegrees
|
// log requested pitch in decidegrees
|
||||||
blackboxCurrent->fwAltPID[0] = lrintf(nav_pids->fw_alt.proportional);
|
blackboxCurrent->fwAltPID[0] = lrintf(nav_pids->fw_alt.proportional);
|
||||||
|
|
|
@ -532,7 +532,7 @@ void processRx(timeUs_t currentTimeUs)
|
||||||
const throttleStatus_e throttleStatus = calculateThrottleStatus();
|
const throttleStatus_e throttleStatus = calculateThrottleStatus();
|
||||||
|
|
||||||
// When armed and motors aren't spinning, do beeps periodically
|
// When armed and motors aren't spinning, do beeps periodically
|
||||||
if (ARMING_FLAG(ARMED) && feature(FEATURE_MOTOR_STOP) && !STATE(AIRPLANE_ROVER_BOAT)) {
|
if (ARMING_FLAG(ARMED) && feature(FEATURE_MOTOR_STOP) && !STATE(FIXED_WING)) {
|
||||||
static bool armedBeeperOn = false;
|
static bool armedBeeperOn = false;
|
||||||
|
|
||||||
if (throttleStatus == THROTTLE_LOW) {
|
if (throttleStatus == THROTTLE_LOW) {
|
||||||
|
@ -633,7 +633,7 @@ void processRx(timeUs_t currentTimeUs)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Handle passthrough mode
|
// Handle passthrough mode
|
||||||
if (STATE(AIRPLANE_ROVER_BOAT)) {
|
if (STATE(FIXED_WING)) {
|
||||||
if ((IS_RC_MODE_ACTIVE(BOXMANUAL) && !navigationRequiresAngleMode() && !failsafeRequiresAngleMode()) || // Normal activation of passthrough
|
if ((IS_RC_MODE_ACTIVE(BOXMANUAL) && !navigationRequiresAngleMode() && !failsafeRequiresAngleMode()) || // Normal activation of passthrough
|
||||||
(!ARMING_FLAG(ARMED) && isCalibrating())){ // Backup - if we are not armed - enforce passthrough while calibrating
|
(!ARMING_FLAG(ARMED) && isCalibrating())){ // Backup - if we are not armed - enforce passthrough while calibrating
|
||||||
ENABLE_FLIGHT_MODE(MANUAL_MODE);
|
ENABLE_FLIGHT_MODE(MANUAL_MODE);
|
||||||
|
@ -649,13 +649,13 @@ void processRx(timeUs_t currentTimeUs)
|
||||||
/* In MANUAL mode we reset integrators prevent I-term wind-up (PID output is not used in MANUAL) */
|
/* In MANUAL mode we reset integrators prevent I-term wind-up (PID output is not used in MANUAL) */
|
||||||
pidResetErrorAccumulators();
|
pidResetErrorAccumulators();
|
||||||
}
|
}
|
||||||
else if (STATE(AIRPLANE_ROVER_BOAT) || rcControlsConfig()->airmodeHandlingType == STICK_CENTER) {
|
else if (STATE(FIXED_WING) || rcControlsConfig()->airmodeHandlingType == STICK_CENTER) {
|
||||||
if (throttleStatus == THROTTLE_LOW) {
|
if (throttleStatus == THROTTLE_LOW) {
|
||||||
if (STATE(AIRMODE_ACTIVE) && !failsafeIsActive() && ARMING_FLAG(ARMED)) {
|
if (STATE(AIRMODE_ACTIVE) && !failsafeIsActive() && ARMING_FLAG(ARMED)) {
|
||||||
rollPitchStatus_e rollPitchStatus = calculateRollPitchCenterStatus();
|
rollPitchStatus_e rollPitchStatus = calculateRollPitchCenterStatus();
|
||||||
|
|
||||||
// ANTI_WINDUP at centred stick with MOTOR_STOP is needed on MRs and not needed on FWs
|
// ANTI_WINDUP at centred stick with MOTOR_STOP is needed on MRs and not needed on FWs
|
||||||
if ((rollPitchStatus == CENTERED) || (feature(FEATURE_MOTOR_STOP) && !STATE(AIRPLANE_ROVER_BOAT))) {
|
if ((rollPitchStatus == CENTERED) || (feature(FEATURE_MOTOR_STOP) && !STATE(FIXED_WING))) {
|
||||||
ENABLE_STATE(ANTI_WINDUP);
|
ENABLE_STATE(ANTI_WINDUP);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -753,7 +753,7 @@ void taskMainPidLoop(timeUs_t currentTimeUs)
|
||||||
cycleTime = getTaskDeltaTime(TASK_SELF);
|
cycleTime = getTaskDeltaTime(TASK_SELF);
|
||||||
dT = (float)cycleTime * 0.000001f;
|
dT = (float)cycleTime * 0.000001f;
|
||||||
|
|
||||||
if (ARMING_FLAG(ARMED) && (!STATE(AIRPLANE_ROVER_BOAT) || !isNavLaunchEnabled() || (isNavLaunchEnabled() && (isFixedWingLaunchDetected() || isFixedWingLaunchFinishedOrAborted())))) {
|
if (ARMING_FLAG(ARMED) && (!STATE(FIXED_WING) || !isNavLaunchEnabled() || (isNavLaunchEnabled() && (isFixedWingLaunchDetected() || isFixedWingLaunchFinishedOrAborted())))) {
|
||||||
flightTime += cycleTime;
|
flightTime += cycleTime;
|
||||||
updateAccExtremes();
|
updateAccExtremes();
|
||||||
}
|
}
|
||||||
|
@ -782,7 +782,7 @@ void taskMainPidLoop(timeUs_t currentTimeUs)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Apply throttle tilt compensation
|
// Apply throttle tilt compensation
|
||||||
if (!STATE(AIRPLANE_ROVER_BOAT)) {
|
if (!STATE(FIXED_WING)) {
|
||||||
int16_t thrTiltCompStrength = 0;
|
int16_t thrTiltCompStrength = 0;
|
||||||
|
|
||||||
if (navigationRequiresThrottleTiltCompensation()) {
|
if (navigationRequiresThrottleTiltCompensation()) {
|
||||||
|
|
|
@ -187,17 +187,17 @@ void initActiveBoxIds(void)
|
||||||
activeBoxIds[activeBoxIdCount++] = BOXCAMSTAB;
|
activeBoxIds[activeBoxIdCount++] = BOXCAMSTAB;
|
||||||
|
|
||||||
#ifdef USE_GPS
|
#ifdef USE_GPS
|
||||||
if (sensors(SENSOR_BARO) || (STATE(AIRPLANE_ROVER_BOAT) && feature(FEATURE_GPS))) {
|
if (sensors(SENSOR_BARO) || (STATE(FIXED_WING) && feature(FEATURE_GPS))) {
|
||||||
activeBoxIds[activeBoxIdCount++] = BOXNAVALTHOLD;
|
activeBoxIds[activeBoxIdCount++] = BOXNAVALTHOLD;
|
||||||
activeBoxIds[activeBoxIdCount++] = BOXSURFACE;
|
activeBoxIds[activeBoxIdCount++] = BOXSURFACE;
|
||||||
}
|
}
|
||||||
|
|
||||||
const bool navReadyQuads = !STATE(AIRPLANE_ROVER_BOAT) && (getHwCompassStatus() != HW_SENSOR_NONE) && sensors(SENSOR_ACC) && feature(FEATURE_GPS);
|
const bool navReadyQuads = !STATE(FIXED_WING) && (getHwCompassStatus() != HW_SENSOR_NONE) && sensors(SENSOR_ACC) && feature(FEATURE_GPS);
|
||||||
const bool navReadyPlanes = STATE(AIRPLANE_ROVER_BOAT) && sensors(SENSOR_ACC) && feature(FEATURE_GPS);
|
const bool navReadyPlanes = STATE(FIXED_WING) && sensors(SENSOR_ACC) && feature(FEATURE_GPS);
|
||||||
const bool navFlowDeadReckoning = sensors(SENSOR_OPFLOW) && sensors(SENSOR_ACC) && positionEstimationConfig()->allow_dead_reckoning;
|
const bool navFlowDeadReckoning = sensors(SENSOR_OPFLOW) && sensors(SENSOR_ACC) && positionEstimationConfig()->allow_dead_reckoning;
|
||||||
if (navFlowDeadReckoning || navReadyQuads || navReadyPlanes) {
|
if (navFlowDeadReckoning || navReadyQuads || navReadyPlanes) {
|
||||||
activeBoxIds[activeBoxIdCount++] = BOXNAVPOSHOLD;
|
activeBoxIds[activeBoxIdCount++] = BOXNAVPOSHOLD;
|
||||||
if (STATE(AIRPLANE_ROVER_BOAT)) {
|
if (STATE(FIXED_WING)) {
|
||||||
activeBoxIds[activeBoxIdCount++] = BOXLOITERDIRCHN;
|
activeBoxIds[activeBoxIdCount++] = BOXLOITERDIRCHN;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -209,7 +209,7 @@ void initActiveBoxIds(void)
|
||||||
|
|
||||||
if (feature(FEATURE_GPS)) {
|
if (feature(FEATURE_GPS)) {
|
||||||
activeBoxIds[activeBoxIdCount++] = BOXGCSNAV;
|
activeBoxIds[activeBoxIdCount++] = BOXGCSNAV;
|
||||||
if (STATE(AIRPLANE_ROVER_BOAT)) {
|
if (STATE(FIXED_WING)) {
|
||||||
activeBoxIds[activeBoxIdCount++] = BOXNAVCRUISE;
|
activeBoxIds[activeBoxIdCount++] = BOXNAVCRUISE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -223,7 +223,7 @@ void initActiveBoxIds(void)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (STATE(AIRPLANE_ROVER_BOAT)) {
|
if (STATE(FIXED_WING)) {
|
||||||
activeBoxIds[activeBoxIdCount++] = BOXMANUAL;
|
activeBoxIds[activeBoxIdCount++] = BOXMANUAL;
|
||||||
if (!feature(FEATURE_FW_LAUNCH)) {
|
if (!feature(FEATURE_FW_LAUNCH)) {
|
||||||
activeBoxIds[activeBoxIdCount++] = BOXNAVLAUNCH;
|
activeBoxIds[activeBoxIdCount++] = BOXNAVLAUNCH;
|
||||||
|
|
|
@ -183,7 +183,7 @@ void processRcStickPositions(throttleStatus_e throttleStatus)
|
||||||
bool armingSwitchIsActive = IS_RC_MODE_ACTIVE(BOXARM);
|
bool armingSwitchIsActive = IS_RC_MODE_ACTIVE(BOXARM);
|
||||||
emergencyArmingUpdate(armingSwitchIsActive);
|
emergencyArmingUpdate(armingSwitchIsActive);
|
||||||
|
|
||||||
if (STATE(AIRPLANE_ROVER_BOAT) && feature(FEATURE_MOTOR_STOP) && armingConfig()->fixed_wing_auto_arm) {
|
if (STATE(FIXED_WING) && feature(FEATURE_MOTOR_STOP) && armingConfig()->fixed_wing_auto_arm) {
|
||||||
// Auto arm on throttle when using fixedwing and motorstop
|
// Auto arm on throttle when using fixedwing and motorstop
|
||||||
if (throttleStatus != THROTTLE_LOW) {
|
if (throttleStatus != THROTTLE_LOW) {
|
||||||
tryArm();
|
tryArm();
|
||||||
|
|
|
@ -104,7 +104,7 @@ static void processAirmodeMultirotor(void) {
|
||||||
|
|
||||||
void processAirmode(void) {
|
void processAirmode(void) {
|
||||||
|
|
||||||
if (STATE(AIRPLANE_ROVER_BOAT)) {
|
if (STATE(FIXED_WING)) {
|
||||||
processAirmodeAirplane();
|
processAirmodeAirplane();
|
||||||
} else {
|
} else {
|
||||||
processAirmodeMultirotor();
|
processAirmodeMultirotor();
|
||||||
|
|
|
@ -110,7 +110,9 @@ typedef enum {
|
||||||
GPS_FIX = (1 << 1),
|
GPS_FIX = (1 << 1),
|
||||||
CALIBRATE_MAG = (1 << 2),
|
CALIBRATE_MAG = (1 << 2),
|
||||||
SMALL_ANGLE = (1 << 3),
|
SMALL_ANGLE = (1 << 3),
|
||||||
AIRPLANE_ROVER_BOAT = (1 << 4), // set when in flying_wing or airplane mode. currently used by althold selection code
|
FIXED_WING = (1 << 4), // set when in flying_wing or airplane mode. currently used by althold selection code
|
||||||
|
ROVER = (1 << 4), // It shares the same bitmask as FIXED_WING by purpose
|
||||||
|
BOAT = (1 << 4), // It shares the same bitmask as FIXED_WING by purpose
|
||||||
ANTI_WINDUP = (1 << 5),
|
ANTI_WINDUP = (1 << 5),
|
||||||
FLAPERON_AVAILABLE = (1 << 6),
|
FLAPERON_AVAILABLE = (1 << 6),
|
||||||
NAV_MOTOR_STOP_OR_IDLE = (1 << 7), // navigation requests MOTOR_STOP or motor idle regardless of throttle stick, will only activate if MOTOR_STOP feature is available
|
NAV_MOTOR_STOP_OR_IDLE = (1 << 7), // navigation requests MOTOR_STOP or motor idle regardless of throttle stick, will only activate if MOTOR_STOP feature is available
|
||||||
|
|
|
@ -258,7 +258,7 @@ void failsafeApplyControlInput(void)
|
||||||
{
|
{
|
||||||
// Prepare FAILSAFE_CHANNEL_AUTO values for rcCommand
|
// Prepare FAILSAFE_CHANNEL_AUTO values for rcCommand
|
||||||
int16_t autoRcCommand[4];
|
int16_t autoRcCommand[4];
|
||||||
if (STATE(AIRPLANE_ROVER_BOAT)) {
|
if (STATE(FIXED_WING)) {
|
||||||
autoRcCommand[ROLL] = pidAngleToRcCommand(failsafeConfig()->failsafe_fw_roll_angle, pidProfile()->max_angle_inclination[FD_ROLL]);
|
autoRcCommand[ROLL] = pidAngleToRcCommand(failsafeConfig()->failsafe_fw_roll_angle, pidProfile()->max_angle_inclination[FD_ROLL]);
|
||||||
autoRcCommand[PITCH] = pidAngleToRcCommand(failsafeConfig()->failsafe_fw_pitch_angle, pidProfile()->max_angle_inclination[FD_PITCH]);
|
autoRcCommand[PITCH] = pidAngleToRcCommand(failsafeConfig()->failsafe_fw_pitch_angle, pidProfile()->max_angle_inclination[FD_PITCH]);
|
||||||
autoRcCommand[YAW] = -pidRateToRcCommand(failsafeConfig()->failsafe_fw_yaw_rate, currentControlRateProfile->stabilized.rates[FD_YAW]);
|
autoRcCommand[YAW] = -pidRateToRcCommand(failsafeConfig()->failsafe_fw_yaw_rate, currentControlRateProfile->stabilized.rates[FD_YAW]);
|
||||||
|
|
|
@ -57,7 +57,7 @@ void hilUpdateControlState(void)
|
||||||
{
|
{
|
||||||
// FIXME: There must be a cleaner way to to this
|
// FIXME: There must be a cleaner way to to this
|
||||||
// If HIL active, store PID outout into hilState and disable motor control
|
// If HIL active, store PID outout into hilState and disable motor control
|
||||||
if (FLIGHT_MODE(MANUAL_MODE) || !STATE(AIRPLANE_ROVER_BOAT)) {
|
if (FLIGHT_MODE(MANUAL_MODE) || !STATE(FIXED_WING)) {
|
||||||
hilToSIM.pidCommand[ROLL] = rcCommand[ROLL];
|
hilToSIM.pidCommand[ROLL] = rcCommand[ROLL];
|
||||||
hilToSIM.pidCommand[PITCH] = rcCommand[PITCH];
|
hilToSIM.pidCommand[PITCH] = rcCommand[PITCH];
|
||||||
hilToSIM.pidCommand[YAW] = rcCommand[YAW];
|
hilToSIM.pidCommand[YAW] = rcCommand[YAW];
|
||||||
|
|
|
@ -481,7 +481,7 @@ static float imuCalculateAccelerometerWeight(const float dT)
|
||||||
const float nearness = ABS(100 - (accMagnitudeSq * 100));
|
const float nearness = ABS(100 - (accMagnitudeSq * 100));
|
||||||
const float accWeight_Nearness = (nearness > MAX_ACC_SQ_NEARNESS) ? 0.0f : 1.0f;
|
const float accWeight_Nearness = (nearness > MAX_ACC_SQ_NEARNESS) ? 0.0f : 1.0f;
|
||||||
|
|
||||||
// Experiment: if rotation rate on a AIRPLANE_ROVER_BOAT is higher than a threshold - centrifugal force messes up too much and we
|
// Experiment: if rotation rate on a FIXED_WING is higher than a threshold - centrifugal force messes up too much and we
|
||||||
// should not use measured accel for AHRS comp
|
// should not use measured accel for AHRS comp
|
||||||
// Centrifugal acceleration AccelC = Omega^2 * R = Speed^2 / R
|
// Centrifugal acceleration AccelC = Omega^2 * R = Speed^2 / R
|
||||||
// Omega = Speed / R
|
// Omega = Speed / R
|
||||||
|
@ -499,7 +499,7 @@ static float imuCalculateAccelerometerWeight(const float dT)
|
||||||
// Default - don't apply rate/ignore scaling
|
// Default - don't apply rate/ignore scaling
|
||||||
float accWeight_RateIgnore = 1.0f;
|
float accWeight_RateIgnore = 1.0f;
|
||||||
|
|
||||||
if (ARMING_FLAG(ARMED) && STATE(AIRPLANE_ROVER_BOAT) && imuConfig()->acc_ignore_rate) {
|
if (ARMING_FLAG(ARMED) && STATE(FIXED_WING) && imuConfig()->acc_ignore_rate) {
|
||||||
const float rotRateMagnitude = sqrtf(vectorNormSquared(&imuMeasuredRotationBF));
|
const float rotRateMagnitude = sqrtf(vectorNormSquared(&imuMeasuredRotationBF));
|
||||||
const float rotRateMagnitudeFiltered = pt1FilterApply4(&rotRateFilter, rotRateMagnitude, IMU_CENTRIFUGAL_LPF, dT);
|
const float rotRateMagnitudeFiltered = pt1FilterApply4(&rotRateFilter, rotRateMagnitude, IMU_CENTRIFUGAL_LPF, dT);
|
||||||
|
|
||||||
|
@ -532,7 +532,7 @@ static void imuCalculateEstimatedAttitude(float dT)
|
||||||
bool useCOG = false;
|
bool useCOG = false;
|
||||||
|
|
||||||
#if defined(USE_GPS)
|
#if defined(USE_GPS)
|
||||||
if (STATE(AIRPLANE_ROVER_BOAT)) {
|
if (STATE(FIXED_WING)) {
|
||||||
bool canUseCOG = isGPSHeadingValid();
|
bool canUseCOG = isGPSHeadingValid();
|
||||||
|
|
||||||
// Prefer compass (if available)
|
// Prefer compass (if available)
|
||||||
|
@ -670,7 +670,7 @@ bool isImuReady(void)
|
||||||
|
|
||||||
bool isImuHeadingValid(void)
|
bool isImuHeadingValid(void)
|
||||||
{
|
{
|
||||||
return (sensors(SENSOR_MAG) && STATE(COMPASS_CALIBRATED)) || (STATE(AIRPLANE_ROVER_BOAT) && gpsHeadingInitialized);
|
return (sensors(SENSOR_MAG) && STATE(COMPASS_CALIBRATED)) || (STATE(FIXED_WING) && gpsHeadingInitialized);
|
||||||
}
|
}
|
||||||
|
|
||||||
float calculateCosTiltAngle(void)
|
float calculateCosTiltAngle(void)
|
||||||
|
|
|
@ -147,14 +147,14 @@ bool mixerIsOutputSaturated(void)
|
||||||
|
|
||||||
void mixerUpdateStateFlags(void)
|
void mixerUpdateStateFlags(void)
|
||||||
{
|
{
|
||||||
if (
|
if (mixerConfig()->platformType == PLATFORM_AIRPLANE) {
|
||||||
mixerConfig()->platformType == PLATFORM_AIRPLANE ||
|
ENABLE_STATE(FIXED_WING);
|
||||||
mixerConfig()->platformType == PLATFORM_BOAT ||
|
} if (mixerConfig()->platformType == PLATFORM_ROVER) {
|
||||||
mixerConfig()->platformType == PLATFORM_ROVER
|
ENABLE_STATE(ROVER);
|
||||||
) {
|
} if (mixerConfig()->platformType == PLATFORM_BOAT) {
|
||||||
ENABLE_STATE(AIRPLANE_ROVER_BOAT);
|
ENABLE_STATE(BOAT);
|
||||||
} else {
|
} else {
|
||||||
DISABLE_STATE(AIRPLANE_ROVER_BOAT);
|
DISABLE_STATE(FIXED_WING);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mixerConfig()->hasFlaps) {
|
if (mixerConfig()->hasFlaps) {
|
||||||
|
@ -302,7 +302,7 @@ void FAST_CODE NOINLINE mixTable(const float dT)
|
||||||
{
|
{
|
||||||
int16_t input[3]; // RPY, range [-500:+500]
|
int16_t input[3]; // RPY, range [-500:+500]
|
||||||
// Allow direct stick input to motors in passthrough mode on airplanes
|
// Allow direct stick input to motors in passthrough mode on airplanes
|
||||||
if (STATE(AIRPLANE_ROVER_BOAT) && FLIGHT_MODE(MANUAL_MODE)) {
|
if (STATE(FIXED_WING) && FLIGHT_MODE(MANUAL_MODE)) {
|
||||||
// Direct passthru from RX
|
// Direct passthru from RX
|
||||||
input[ROLL] = rcCommand[ROLL];
|
input[ROLL] = rcCommand[ROLL];
|
||||||
input[PITCH] = rcCommand[PITCH];
|
input[PITCH] = rcCommand[PITCH];
|
||||||
|
@ -439,7 +439,7 @@ motorStatus_e getMotorStatus(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (rxGetChannelValue(THROTTLE) < rxConfig()->mincheck) {
|
if (rxGetChannelValue(THROTTLE) < rxConfig()->mincheck) {
|
||||||
if ((STATE(AIRPLANE_ROVER_BOAT) || !STATE(AIRMODE_ACTIVE)) && (!(navigationIsFlyingAutonomousMode() && navConfig()->general.flags.auto_overrides_motor_stop)) && (!failsafeIsActive())) {
|
if ((STATE(FIXED_WING) || !STATE(AIRMODE_ACTIVE)) && (!(navigationIsFlyingAutonomousMode() && navConfig()->general.flags.auto_overrides_motor_stop)) && (!failsafeIsActive())) {
|
||||||
return MOTOR_STOPPED_USER;
|
return MOTOR_STOPPED_USER;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -530,7 +530,7 @@ static void pidLevel(pidState_t *pidState, flight_dynamics_index_t axis, float h
|
||||||
float angleTarget = pidRcCommandToAngle(rcCommand[axis], pidProfile()->max_angle_inclination[axis]);
|
float angleTarget = pidRcCommandToAngle(rcCommand[axis], pidProfile()->max_angle_inclination[axis]);
|
||||||
|
|
||||||
// Automatically pitch down if the throttle is manually controlled and reduced bellow cruise throttle
|
// Automatically pitch down if the throttle is manually controlled and reduced bellow cruise throttle
|
||||||
if ((axis == FD_PITCH) && STATE(AIRPLANE_ROVER_BOAT) && FLIGHT_MODE(ANGLE_MODE) && !navigationIsControllingThrottle())
|
if ((axis == FD_PITCH) && STATE(FIXED_WING) && FLIGHT_MODE(ANGLE_MODE) && !navigationIsControllingThrottle())
|
||||||
angleTarget += scaleRange(MAX(0, navConfig()->fw.cruise_throttle - rcCommand[THROTTLE]), 0, navConfig()->fw.cruise_throttle - PWM_RANGE_MIN, 0, mixerConfig()->fwMinThrottleDownPitchAngle);
|
angleTarget += scaleRange(MAX(0, navConfig()->fw.cruise_throttle - rcCommand[THROTTLE]), 0, navConfig()->fw.cruise_throttle - PWM_RANGE_MIN, 0, mixerConfig()->fwMinThrottleDownPitchAngle);
|
||||||
|
|
||||||
const float angleErrorDeg = DECIDEGREES_TO_DEGREES(angleTarget - attitude.raw[axis]);
|
const float angleErrorDeg = DECIDEGREES_TO_DEGREES(angleTarget - attitude.raw[axis]);
|
||||||
|
@ -857,7 +857,7 @@ static void NOINLINE pidTurnAssistant(pidState_t *pidState)
|
||||||
targetRates.x = 0.0f;
|
targetRates.x = 0.0f;
|
||||||
targetRates.y = 0.0f;
|
targetRates.y = 0.0f;
|
||||||
|
|
||||||
if (STATE(AIRPLANE_ROVER_BOAT)) {
|
if (STATE(FIXED_WING)) {
|
||||||
if (calculateCosTiltAngle() >= 0.173648f) {
|
if (calculateCosTiltAngle() >= 0.173648f) {
|
||||||
// Ideal banked turn follow the equations:
|
// Ideal banked turn follow the equations:
|
||||||
// forward_vel^2 / radius = Gravity * tan(roll_angle)
|
// forward_vel^2 / radius = Gravity * tan(roll_angle)
|
||||||
|
@ -901,7 +901,7 @@ static void NOINLINE pidTurnAssistant(pidState_t *pidState)
|
||||||
pidState[PITCH].rateTarget = constrainf(pidState[PITCH].rateTarget + targetRates.y, -currentControlRateProfile->stabilized.rates[PITCH] * 10.0f, currentControlRateProfile->stabilized.rates[PITCH] * 10.0f);
|
pidState[PITCH].rateTarget = constrainf(pidState[PITCH].rateTarget + targetRates.y, -currentControlRateProfile->stabilized.rates[PITCH] * 10.0f, currentControlRateProfile->stabilized.rates[PITCH] * 10.0f);
|
||||||
|
|
||||||
// Replace YAW on quads - add it in on airplanes
|
// Replace YAW on quads - add it in on airplanes
|
||||||
if (STATE(AIRPLANE_ROVER_BOAT)) {
|
if (STATE(FIXED_WING)) {
|
||||||
pidState[YAW].rateTarget = constrainf(pidState[YAW].rateTarget + targetRates.z * pidProfile()->fixedWingCoordinatedYawGain, -currentControlRateProfile->stabilized.rates[YAW] * 10.0f, currentControlRateProfile->stabilized.rates[YAW] * 10.0f);
|
pidState[YAW].rateTarget = constrainf(pidState[YAW].rateTarget + targetRates.z * pidProfile()->fixedWingCoordinatedYawGain, -currentControlRateProfile->stabilized.rates[YAW] * 10.0f, currentControlRateProfile->stabilized.rates[YAW] * 10.0f);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -1014,7 +1014,7 @@ pidType_e pidIndexGetType(pidIndex_e pidIndex)
|
||||||
if (pidIndex == PID_ROLL || pidIndex == PID_PITCH || pidIndex == PID_YAW) {
|
if (pidIndex == PID_ROLL || pidIndex == PID_PITCH || pidIndex == PID_YAW) {
|
||||||
return usedPidControllerType;
|
return usedPidControllerType;
|
||||||
}
|
}
|
||||||
if (STATE(AIRPLANE_ROVER_BOAT)) {
|
if (STATE(FIXED_WING)) {
|
||||||
if (pidIndex == PID_VEL_XY || pidIndex == PID_VEL_Z) {
|
if (pidIndex == PID_VEL_XY || pidIndex == PID_VEL_Z) {
|
||||||
return PID_TYPE_NONE;
|
return PID_TYPE_NONE;
|
||||||
}
|
}
|
||||||
|
|
|
@ -146,10 +146,10 @@ static float estimateRTHEnergyAfterInitialClimb(float distanceToHome, float spee
|
||||||
// returns Wh
|
// returns Wh
|
||||||
static float calculateRemainingEnergyBeforeRTH(bool takeWindIntoAccount) {
|
static float calculateRemainingEnergyBeforeRTH(bool takeWindIntoAccount) {
|
||||||
// Fixed wing only for now
|
// Fixed wing only for now
|
||||||
if (!STATE(AIRPLANE_ROVER_BOAT))
|
if (!STATE(FIXED_WING))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (!(feature(FEATURE_VBAT) && feature(FEATURE_CURRENT_METER) && navigationPositionEstimateIsHealthy() && (batteryMetersConfig()->cruise_power > 0) && (ARMING_FLAG(ARMED)) && ((!STATE(AIRPLANE_ROVER_BOAT)) || (isNavLaunchEnabled() && isFixedWingLaunchDetected())) && (navConfig()->fw.cruise_speed > 0) && (currentBatteryProfile->capacity.unit == BAT_CAPACITY_UNIT_MWH) && (currentBatteryProfile->capacity.value > 0) && batteryWasFullWhenPluggedIn() && isImuHeadingValid()
|
if (!(feature(FEATURE_VBAT) && feature(FEATURE_CURRENT_METER) && navigationPositionEstimateIsHealthy() && (batteryMetersConfig()->cruise_power > 0) && (ARMING_FLAG(ARMED)) && ((!STATE(FIXED_WING)) || (isNavLaunchEnabled() && isFixedWingLaunchDetected())) && (navConfig()->fw.cruise_speed > 0) && (currentBatteryProfile->capacity.unit == BAT_CAPACITY_UNIT_MWH) && (currentBatteryProfile->capacity.value > 0) && batteryWasFullWhenPluggedIn() && isImuHeadingValid()
|
||||||
#ifdef USE_WIND_ESTIMATOR
|
#ifdef USE_WIND_ESTIMATOR
|
||||||
&& isEstimatedWindSpeedValid()
|
&& isEstimatedWindSpeedValid()
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -79,7 +79,7 @@ void updateWindEstimator(timeUs_t currentTimeUs)
|
||||||
{
|
{
|
||||||
static timeUs_t lastUpdateUs = 0;
|
static timeUs_t lastUpdateUs = 0;
|
||||||
|
|
||||||
if (!STATE(AIRPLANE_ROVER_BOAT) ||
|
if (!STATE(FIXED_WING) ||
|
||||||
!isGPSHeadingValid() ||
|
!isGPSHeadingValid() ||
|
||||||
!gpsSol.flags.validVelNE ||
|
!gpsSol.flags.validVelNE ||
|
||||||
!gpsSol.flags.validVelD) {
|
!gpsSol.flags.validVelD) {
|
||||||
|
|
|
@ -811,7 +811,7 @@ static const char * navigationStateMessage(void)
|
||||||
case MW_NAV_STATE_LAND_IN_PROGRESS:
|
case MW_NAV_STATE_LAND_IN_PROGRESS:
|
||||||
return OSD_MESSAGE_STR("LANDING");
|
return OSD_MESSAGE_STR("LANDING");
|
||||||
case MW_NAV_STATE_HOVER_ABOVE_HOME:
|
case MW_NAV_STATE_HOVER_ABOVE_HOME:
|
||||||
if (STATE(AIRPLANE_ROVER_BOAT)) {
|
if (STATE(FIXED_WING)) {
|
||||||
return OSD_MESSAGE_STR("LOITERING AROUND HOME");
|
return OSD_MESSAGE_STR("LOITERING AROUND HOME");
|
||||||
}
|
}
|
||||||
return OSD_MESSAGE_STR("HOVERING");
|
return OSD_MESSAGE_STR("HOVERING");
|
||||||
|
@ -2113,7 +2113,7 @@ static bool osdDrawSingleElement(uint8_t item)
|
||||||
if (navStateMessage) {
|
if (navStateMessage) {
|
||||||
messages[messageCount++] = navStateMessage;
|
messages[messageCount++] = navStateMessage;
|
||||||
}
|
}
|
||||||
} else if (STATE(AIRPLANE_ROVER_BOAT) && (navGetCurrentStateFlags() & NAV_CTL_LAUNCH)) {
|
} else if (STATE(FIXED_WING) && (navGetCurrentStateFlags() & NAV_CTL_LAUNCH)) {
|
||||||
messages[messageCount++] = "AUTOLAUNCH";
|
messages[messageCount++] = "AUTOLAUNCH";
|
||||||
} else {
|
} else {
|
||||||
if (FLIGHT_MODE(NAV_ALTHOLD_MODE) && !navigationRequiresAngleMode()) {
|
if (FLIGHT_MODE(NAV_ALTHOLD_MODE) && !navigationRequiresAngleMode()) {
|
||||||
|
|
|
@ -841,7 +841,7 @@ navigationFSMStateFlags_t navGetCurrentStateFlags(void)
|
||||||
static bool navTerrainFollowingRequested(void)
|
static bool navTerrainFollowingRequested(void)
|
||||||
{
|
{
|
||||||
// Terrain following not supported on FIXED WING aircraft yet
|
// Terrain following not supported on FIXED WING aircraft yet
|
||||||
return !STATE(AIRPLANE_ROVER_BOAT) && IS_RC_MODE_ACTIVE(BOXSURFACE);
|
return !STATE(FIXED_WING) && IS_RC_MODE_ACTIVE(BOXSURFACE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*************************************************************************************************/
|
/*************************************************************************************************/
|
||||||
|
@ -939,7 +939,7 @@ static navigationFSMEvent_t navOnEnteringState_NAV_STATE_CRUISE_2D_INITIALIZE(na
|
||||||
{
|
{
|
||||||
const navigationFSMStateFlags_t prevFlags = navGetStateFlags(previousState);
|
const navigationFSMStateFlags_t prevFlags = navGetStateFlags(previousState);
|
||||||
|
|
||||||
if (!STATE(AIRPLANE_ROVER_BOAT)) { return NAV_FSM_EVENT_ERROR; } // Only on FW for now
|
if (!STATE(FIXED_WING)) { return NAV_FSM_EVENT_ERROR; } // Only on FW for now
|
||||||
|
|
||||||
DEBUG_SET(DEBUG_CRUISE, 0, 1);
|
DEBUG_SET(DEBUG_CRUISE, 0, 1);
|
||||||
if (checkForPositionSensorTimeout()) { return NAV_FSM_EVENT_SWITCH_TO_IDLE; } // Switch to IDLE if we do not have an healty position. Try the next iteration.
|
if (checkForPositionSensorTimeout()) { return NAV_FSM_EVENT_SWITCH_TO_IDLE; } // Switch to IDLE if we do not have an healty position. Try the next iteration.
|
||||||
|
@ -1018,7 +1018,7 @@ static navigationFSMEvent_t navOnEnteringState_NAV_STATE_CRUISE_2D_ADJUSTING(nav
|
||||||
|
|
||||||
static navigationFSMEvent_t navOnEnteringState_NAV_STATE_CRUISE_3D_INITIALIZE(navigationFSMState_t previousState)
|
static navigationFSMEvent_t navOnEnteringState_NAV_STATE_CRUISE_3D_INITIALIZE(navigationFSMState_t previousState)
|
||||||
{
|
{
|
||||||
if (!STATE(AIRPLANE_ROVER_BOAT)) { return NAV_FSM_EVENT_ERROR; } // only on FW for now
|
if (!STATE(FIXED_WING)) { return NAV_FSM_EVENT_ERROR; } // only on FW for now
|
||||||
|
|
||||||
navOnEnteringState_NAV_STATE_ALTHOLD_INITIALIZE(previousState);
|
navOnEnteringState_NAV_STATE_ALTHOLD_INITIALIZE(previousState);
|
||||||
|
|
||||||
|
@ -1049,7 +1049,7 @@ static navigationFSMEvent_t navOnEnteringState_NAV_STATE_RTH_INITIALIZE(navigati
|
||||||
return NAV_FSM_EVENT_SWITCH_TO_EMERGENCY_LANDING;
|
return NAV_FSM_EVENT_SWITCH_TO_EMERGENCY_LANDING;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (STATE(AIRPLANE_ROVER_BOAT) && (posControl.homeDistance < navConfig()->general.min_rth_distance) && !posControl.flags.forcedRTHActivated) {
|
if (STATE(FIXED_WING) && (posControl.homeDistance < navConfig()->general.min_rth_distance) && !posControl.flags.forcedRTHActivated) {
|
||||||
// Prevent RTH from activating on airplanes if too close to home unless it's a failsafe RTH
|
// Prevent RTH from activating on airplanes if too close to home unless it's a failsafe RTH
|
||||||
return NAV_FSM_EVENT_SWITCH_TO_IDLE;
|
return NAV_FSM_EVENT_SWITCH_TO_IDLE;
|
||||||
}
|
}
|
||||||
|
@ -1078,7 +1078,7 @@ static navigationFSMEvent_t navOnEnteringState_NAV_STATE_RTH_INITIALIZE(navigati
|
||||||
else {
|
else {
|
||||||
fpVector3_t targetHoldPos;
|
fpVector3_t targetHoldPos;
|
||||||
|
|
||||||
if (STATE(AIRPLANE_ROVER_BOAT)) {
|
if (STATE(FIXED_WING)) {
|
||||||
// Airplane - climbout before turning around
|
// Airplane - climbout before turning around
|
||||||
calculateFarAwayTarget(&targetHoldPos, posControl.actualState.yaw, 100000.0f); // 1km away
|
calculateFarAwayTarget(&targetHoldPos, posControl.actualState.yaw, 100000.0f); // 1km away
|
||||||
} else {
|
} else {
|
||||||
|
@ -1115,14 +1115,14 @@ static navigationFSMEvent_t navOnEnteringState_NAV_STATE_RTH_CLIMB_TO_SAFE_ALT(n
|
||||||
|
|
||||||
// If we have valid pos sensor OR we are configured to ignore GPS loss
|
// If we have valid pos sensor OR we are configured to ignore GPS loss
|
||||||
if ((posControl.flags.estPosStatus >= EST_USABLE) || !checkForPositionSensorTimeout() || navConfig()->general.flags.rth_climb_ignore_emerg) {
|
if ((posControl.flags.estPosStatus >= EST_USABLE) || !checkForPositionSensorTimeout() || navConfig()->general.flags.rth_climb_ignore_emerg) {
|
||||||
const uint8_t rthClimbMarginPercent = STATE(AIRPLANE_ROVER_BOAT) ? FW_RTH_CLIMB_MARGIN_PERCENT : MR_RTH_CLIMB_MARGIN_PERCENT;
|
const uint8_t rthClimbMarginPercent = STATE(FIXED_WING) ? FW_RTH_CLIMB_MARGIN_PERCENT : MR_RTH_CLIMB_MARGIN_PERCENT;
|
||||||
const float rthAltitudeMargin = MAX(FW_RTH_CLIMB_MARGIN_MIN_CM, (rthClimbMarginPercent/100.0) * fabsf(posControl.rthState.rthInitialAltitude - posControl.rthState.homePosition.pos.z));
|
const float rthAltitudeMargin = MAX(FW_RTH_CLIMB_MARGIN_MIN_CM, (rthClimbMarginPercent/100.0) * fabsf(posControl.rthState.rthInitialAltitude - posControl.rthState.homePosition.pos.z));
|
||||||
|
|
||||||
// If we reached desired initial RTH altitude or we don't want to climb first
|
// If we reached desired initial RTH altitude or we don't want to climb first
|
||||||
if (((navGetCurrentActualPositionAndVelocity()->pos.z - posControl.rthState.rthInitialAltitude) > -rthAltitudeMargin) || (!navConfig()->general.flags.rth_climb_first)) {
|
if (((navGetCurrentActualPositionAndVelocity()->pos.z - posControl.rthState.rthInitialAltitude) > -rthAltitudeMargin) || (!navConfig()->general.flags.rth_climb_first)) {
|
||||||
|
|
||||||
// Delayed initialization for RTH sanity check on airplanes - allow to finish climb first as it can take some distance
|
// Delayed initialization for RTH sanity check on airplanes - allow to finish climb first as it can take some distance
|
||||||
if (STATE(AIRPLANE_ROVER_BOAT)) {
|
if (STATE(FIXED_WING)) {
|
||||||
initializeRTHSanityChecker(&navGetCurrentActualPositionAndVelocity()->pos);
|
initializeRTHSanityChecker(&navGetCurrentActualPositionAndVelocity()->pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1130,7 +1130,7 @@ static navigationFSMEvent_t navOnEnteringState_NAV_STATE_RTH_CLIMB_TO_SAFE_ALT(n
|
||||||
posControl.rthState.rthInitialDistance = posControl.homeDistance;
|
posControl.rthState.rthInitialDistance = posControl.homeDistance;
|
||||||
fpVector3_t * tmpHomePos = rthGetHomeTargetPosition(RTH_HOME_ENROUTE_INITIAL);
|
fpVector3_t * tmpHomePos = rthGetHomeTargetPosition(RTH_HOME_ENROUTE_INITIAL);
|
||||||
|
|
||||||
if (navConfig()->general.flags.rth_tail_first && !STATE(AIRPLANE_ROVER_BOAT)) {
|
if (navConfig()->general.flags.rth_tail_first && !STATE(FIXED_WING)) {
|
||||||
setDesiredPosition(tmpHomePos, 0, NAV_POS_UPDATE_XY | NAV_POS_UPDATE_Z | NAV_POS_UPDATE_BEARING_TAIL_FIRST);
|
setDesiredPosition(tmpHomePos, 0, NAV_POS_UPDATE_XY | NAV_POS_UPDATE_Z | NAV_POS_UPDATE_BEARING_TAIL_FIRST);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -1144,12 +1144,12 @@ static navigationFSMEvent_t navOnEnteringState_NAV_STATE_RTH_CLIMB_TO_SAFE_ALT(n
|
||||||
fpVector3_t * tmpHomePos = rthGetHomeTargetPosition(RTH_HOME_ENROUTE_INITIAL);
|
fpVector3_t * tmpHomePos = rthGetHomeTargetPosition(RTH_HOME_ENROUTE_INITIAL);
|
||||||
|
|
||||||
/* For multi-rotors execute sanity check during initial ascent as well */
|
/* For multi-rotors execute sanity check during initial ascent as well */
|
||||||
if (!STATE(AIRPLANE_ROVER_BOAT) && !validateRTHSanityChecker()) {
|
if (!STATE(FIXED_WING) && !validateRTHSanityChecker()) {
|
||||||
return NAV_FSM_EVENT_SWITCH_TO_EMERGENCY_LANDING;
|
return NAV_FSM_EVENT_SWITCH_TO_EMERGENCY_LANDING;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Climb to safe altitude and turn to correct direction
|
// Climb to safe altitude and turn to correct direction
|
||||||
if (STATE(AIRPLANE_ROVER_BOAT)) {
|
if (STATE(FIXED_WING)) {
|
||||||
tmpHomePos->z += FW_RTH_CLIMB_OVERSHOOT_CM;
|
tmpHomePos->z += FW_RTH_CLIMB_OVERSHOOT_CM;
|
||||||
setDesiredPosition(tmpHomePos, 0, NAV_POS_UPDATE_Z);
|
setDesiredPosition(tmpHomePos, 0, NAV_POS_UPDATE_Z);
|
||||||
} else {
|
} else {
|
||||||
|
@ -1222,7 +1222,7 @@ static navigationFSMEvent_t navOnEnteringState_NAV_STATE_RTH_HOVER_PRIOR_TO_LAND
|
||||||
if ((posControl.flags.estPosStatus >= EST_USABLE) || !checkForPositionSensorTimeout()) {
|
if ((posControl.flags.estPosStatus >= EST_USABLE) || !checkForPositionSensorTimeout()) {
|
||||||
|
|
||||||
// Wait until target heading is reached (with 15 deg margin for error)
|
// Wait until target heading is reached (with 15 deg margin for error)
|
||||||
if (STATE(AIRPLANE_ROVER_BOAT)) {
|
if (STATE(FIXED_WING)) {
|
||||||
resetLandingDetector();
|
resetLandingDetector();
|
||||||
updateClimbRateToAltitudeController(0, ROC_TO_ALT_RESET);
|
updateClimbRateToAltitudeController(0, ROC_TO_ALT_RESET);
|
||||||
return navigationRTHAllowsLanding() ? NAV_FSM_EVENT_SUCCESS : NAV_FSM_EVENT_SWITCH_TO_RTH_HOVER_ABOVE_HOME;
|
return navigationRTHAllowsLanding() ? NAV_FSM_EVENT_SUCCESS : NAV_FSM_EVENT_SWITCH_TO_RTH_HOVER_ABOVE_HOME;
|
||||||
|
@ -1673,7 +1673,7 @@ static fpVector3_t * rthGetHomeTargetPosition(rthTargetMode_e mode)
|
||||||
|
|
||||||
case RTH_HOME_ENROUTE_PROPORTIONAL:
|
case RTH_HOME_ENROUTE_PROPORTIONAL:
|
||||||
{
|
{
|
||||||
float rthTotalDistanceToTravel = posControl.rthState.rthInitialDistance - (STATE(AIRPLANE_ROVER_BOAT) ? navConfig()->fw.loiter_radius : 0);
|
float rthTotalDistanceToTravel = posControl.rthState.rthInitialDistance - (STATE(FIXED_WING) ? navConfig()->fw.loiter_radius : 0);
|
||||||
if (rthTotalDistanceToTravel >= 100) {
|
if (rthTotalDistanceToTravel >= 100) {
|
||||||
float ratioNotTravelled = constrainf(posControl.homeDistance / rthTotalDistanceToTravel, 0.0f, 1.0f);
|
float ratioNotTravelled = constrainf(posControl.homeDistance / rthTotalDistanceToTravel, 0.0f, 1.0f);
|
||||||
posControl.rthState.homeTmpWaypoint.z = (posControl.rthState.rthInitialAltitude * ratioNotTravelled) + (posControl.rthState.rthFinalAltitude * (1.0f - ratioNotTravelled));
|
posControl.rthState.homeTmpWaypoint.z = (posControl.rthState.rthInitialAltitude * ratioNotTravelled) + (posControl.rthState.rthFinalAltitude * (1.0f - ratioNotTravelled));
|
||||||
|
@ -2052,7 +2052,7 @@ static bool isWaypointPositionReached(const fpVector3_t * pos, const bool isWayp
|
||||||
// We consider waypoint reached if within specified radius
|
// We consider waypoint reached if within specified radius
|
||||||
posControl.wpDistance = calculateDistanceToDestination(pos);
|
posControl.wpDistance = calculateDistanceToDestination(pos);
|
||||||
|
|
||||||
if (STATE(AIRPLANE_ROVER_BOAT) && isWaypointHome) {
|
if (STATE(FIXED_WING) && isWaypointHome) {
|
||||||
// Airplane will do a circular loiter over home and might never approach it closer than waypoint_radius - need extra check
|
// Airplane will do a circular loiter over home and might never approach it closer than waypoint_radius - need extra check
|
||||||
return (posControl.wpDistance <= navConfig()->general.waypoint_radius)
|
return (posControl.wpDistance <= navConfig()->general.waypoint_radius)
|
||||||
|| (posControl.wpDistance <= (navConfig()->fw.loiter_radius * 1.10f)); // 10% margin of desired circular loiter radius
|
|| (posControl.wpDistance <= (navConfig()->fw.loiter_radius * 1.10f)); // 10% margin of desired circular loiter radius
|
||||||
|
@ -2311,7 +2311,7 @@ uint32_t getTotalTravelDistance(void)
|
||||||
*-----------------------------------------------------------*/
|
*-----------------------------------------------------------*/
|
||||||
void calculateInitialHoldPosition(fpVector3_t * pos)
|
void calculateInitialHoldPosition(fpVector3_t * pos)
|
||||||
{
|
{
|
||||||
if (STATE(AIRPLANE_ROVER_BOAT)) { // AIRPLANE_ROVER_BOAT
|
if (STATE(FIXED_WING)) { // FIXED_WING
|
||||||
calculateFixedWingInitialHoldPosition(pos);
|
calculateFixedWingInitialHoldPosition(pos);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -2368,7 +2368,7 @@ void calculateNewCruiseTarget(fpVector3_t * origin, int32_t yaw, int32_t distanc
|
||||||
*-----------------------------------------------------------*/
|
*-----------------------------------------------------------*/
|
||||||
void resetLandingDetector(void)
|
void resetLandingDetector(void)
|
||||||
{
|
{
|
||||||
if (STATE(AIRPLANE_ROVER_BOAT)) { // AIRPLANE_ROVER_BOAT
|
if (STATE(FIXED_WING)) { // FIXED_WING
|
||||||
resetFixedWingLandingDetector();
|
resetFixedWingLandingDetector();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -2380,7 +2380,7 @@ bool isLandingDetected(void)
|
||||||
{
|
{
|
||||||
bool landingDetected;
|
bool landingDetected;
|
||||||
|
|
||||||
if (STATE(AIRPLANE_ROVER_BOAT)) { // AIRPLANE_ROVER_BOAT
|
if (STATE(FIXED_WING)) { // FIXED_WING
|
||||||
landingDetected = isFixedWingLandingDetected();
|
landingDetected = isFixedWingLandingDetected();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -2406,7 +2406,7 @@ void updateClimbRateToAltitudeController(float desiredClimbRate, climbRateToAlti
|
||||||
posControl.desiredState.pos.z = altitudeToUse;
|
posControl.desiredState.pos.z = altitudeToUse;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (STATE(AIRPLANE_ROVER_BOAT)) {
|
if (STATE(FIXED_WING)) {
|
||||||
// Fixed wing climb rate controller is open-loop. We simply move the known altitude target
|
// Fixed wing climb rate controller is open-loop. We simply move the known altitude target
|
||||||
float timeDelta = US2S(currentTimeUs - lastUpdateTimeUs);
|
float timeDelta = US2S(currentTimeUs - lastUpdateTimeUs);
|
||||||
|
|
||||||
|
@ -2429,7 +2429,7 @@ static void resetAltitudeController(bool useTerrainFollowing)
|
||||||
// Set terrain following flag
|
// Set terrain following flag
|
||||||
posControl.flags.isTerrainFollowEnabled = useTerrainFollowing;
|
posControl.flags.isTerrainFollowEnabled = useTerrainFollowing;
|
||||||
|
|
||||||
if (STATE(AIRPLANE_ROVER_BOAT)) {
|
if (STATE(FIXED_WING)) {
|
||||||
resetFixedWingAltitudeController();
|
resetFixedWingAltitudeController();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -2439,7 +2439,7 @@ static void resetAltitudeController(bool useTerrainFollowing)
|
||||||
|
|
||||||
static void setupAltitudeController(void)
|
static void setupAltitudeController(void)
|
||||||
{
|
{
|
||||||
if (STATE(AIRPLANE_ROVER_BOAT)) {
|
if (STATE(FIXED_WING)) {
|
||||||
setupFixedWingAltitudeController();
|
setupFixedWingAltitudeController();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -2449,7 +2449,7 @@ static void setupAltitudeController(void)
|
||||||
|
|
||||||
static bool adjustAltitudeFromRCInput(void)
|
static bool adjustAltitudeFromRCInput(void)
|
||||||
{
|
{
|
||||||
if (STATE(AIRPLANE_ROVER_BOAT)) {
|
if (STATE(FIXED_WING)) {
|
||||||
return adjustFixedWingAltitudeFromRCInput();
|
return adjustFixedWingAltitudeFromRCInput();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -2462,7 +2462,7 @@ static bool adjustAltitudeFromRCInput(void)
|
||||||
*-----------------------------------------------------------*/
|
*-----------------------------------------------------------*/
|
||||||
static void resetHeadingController(void)
|
static void resetHeadingController(void)
|
||||||
{
|
{
|
||||||
if (STATE(AIRPLANE_ROVER_BOAT)) {
|
if (STATE(FIXED_WING)) {
|
||||||
resetFixedWingHeadingController();
|
resetFixedWingHeadingController();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -2472,7 +2472,7 @@ static void resetHeadingController(void)
|
||||||
|
|
||||||
static bool adjustHeadingFromRCInput(void)
|
static bool adjustHeadingFromRCInput(void)
|
||||||
{
|
{
|
||||||
if (STATE(AIRPLANE_ROVER_BOAT)) {
|
if (STATE(FIXED_WING)) {
|
||||||
return adjustFixedWingHeadingFromRCInput();
|
return adjustFixedWingHeadingFromRCInput();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -2485,7 +2485,7 @@ static bool adjustHeadingFromRCInput(void)
|
||||||
*-----------------------------------------------------------*/
|
*-----------------------------------------------------------*/
|
||||||
static void resetPositionController(void)
|
static void resetPositionController(void)
|
||||||
{
|
{
|
||||||
if (STATE(AIRPLANE_ROVER_BOAT)) {
|
if (STATE(FIXED_WING)) {
|
||||||
resetFixedWingPositionController();
|
resetFixedWingPositionController();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -2498,7 +2498,7 @@ static bool adjustPositionFromRCInput(void)
|
||||||
{
|
{
|
||||||
bool retValue;
|
bool retValue;
|
||||||
|
|
||||||
if (STATE(AIRPLANE_ROVER_BOAT)) {
|
if (STATE(FIXED_WING)) {
|
||||||
retValue = adjustFixedWingPositionFromRCInput();
|
retValue = adjustFixedWingPositionFromRCInput();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -2766,7 +2766,7 @@ static void processNavigationRCAdjustments(void)
|
||||||
posControl.flags.isAdjustingPosition = adjustPositionFromRCInput();
|
posControl.flags.isAdjustingPosition = adjustPositionFromRCInput();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (!STATE(AIRPLANE_ROVER_BOAT)) {
|
if (!STATE(FIXED_WING)) {
|
||||||
resetMulticopterBrakingMode();
|
resetMulticopterBrakingMode();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2818,7 +2818,7 @@ void applyWaypointNavigationAndAltitudeHold(void)
|
||||||
|
|
||||||
/* Process controllers */
|
/* Process controllers */
|
||||||
navigationFSMStateFlags_t navStateFlags = navGetStateFlags(posControl.navState);
|
navigationFSMStateFlags_t navStateFlags = navGetStateFlags(posControl.navState);
|
||||||
if (STATE(AIRPLANE_ROVER_BOAT)) {
|
if (STATE(FIXED_WING)) {
|
||||||
applyFixedWingNavigationController(navStateFlags, currentTimeUs);
|
applyFixedWingNavigationController(navStateFlags, currentTimeUs);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -2891,7 +2891,7 @@ static navigationFSMEvent_t selectNavEventFromBoxModeInput(void)
|
||||||
bool canActivateNavigation = canActivateNavigationModes();
|
bool canActivateNavigation = canActivateNavigationModes();
|
||||||
|
|
||||||
// LAUNCH mode has priority over any other NAV mode
|
// LAUNCH mode has priority over any other NAV mode
|
||||||
if (STATE(AIRPLANE_ROVER_BOAT)) {
|
if (STATE(FIXED_WING)) {
|
||||||
if (isNavLaunchEnabled()) { // FIXME: Only available for fixed wing aircrafts now
|
if (isNavLaunchEnabled()) { // FIXME: Only available for fixed wing aircrafts now
|
||||||
if (canActivateLaunchMode) {
|
if (canActivateLaunchMode) {
|
||||||
canActivateLaunchMode = false;
|
canActivateLaunchMode = false;
|
||||||
|
@ -2974,7 +2974,7 @@ static navigationFSMEvent_t selectNavEventFromBoxModeInput(void)
|
||||||
*-----------------------------------------------------------*/
|
*-----------------------------------------------------------*/
|
||||||
bool navigationRequiresThrottleTiltCompensation(void)
|
bool navigationRequiresThrottleTiltCompensation(void)
|
||||||
{
|
{
|
||||||
return !STATE(AIRPLANE_ROVER_BOAT) && (navGetStateFlags(posControl.navState) & NAV_REQUIRE_THRTILT);
|
return !STATE(FIXED_WING) && (navGetStateFlags(posControl.navState) & NAV_REQUIRE_THRTILT);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*-----------------------------------------------------------
|
/*-----------------------------------------------------------
|
||||||
|
@ -2983,7 +2983,7 @@ bool navigationRequiresThrottleTiltCompensation(void)
|
||||||
bool navigationRequiresAngleMode(void)
|
bool navigationRequiresAngleMode(void)
|
||||||
{
|
{
|
||||||
const navigationFSMStateFlags_t currentState = navGetStateFlags(posControl.navState);
|
const navigationFSMStateFlags_t currentState = navGetStateFlags(posControl.navState);
|
||||||
return (currentState & NAV_REQUIRE_ANGLE) || ((currentState & NAV_REQUIRE_ANGLE_FW) && STATE(AIRPLANE_ROVER_BOAT));
|
return (currentState & NAV_REQUIRE_ANGLE) || ((currentState & NAV_REQUIRE_ANGLE_FW) && STATE(FIXED_WING));
|
||||||
}
|
}
|
||||||
|
|
||||||
/*-----------------------------------------------------------
|
/*-----------------------------------------------------------
|
||||||
|
@ -2992,7 +2992,7 @@ bool navigationRequiresAngleMode(void)
|
||||||
bool navigationRequiresTurnAssistance(void)
|
bool navigationRequiresTurnAssistance(void)
|
||||||
{
|
{
|
||||||
const navigationFSMStateFlags_t currentState = navGetStateFlags(posControl.navState);
|
const navigationFSMStateFlags_t currentState = navGetStateFlags(posControl.navState);
|
||||||
if (STATE(AIRPLANE_ROVER_BOAT)) {
|
if (STATE(FIXED_WING)) {
|
||||||
// For airplanes turn assistant is always required when controlling position
|
// For airplanes turn assistant is always required when controlling position
|
||||||
return (currentState & (NAV_CTL_POS | NAV_CTL_ALT));
|
return (currentState & (NAV_CTL_POS | NAV_CTL_ALT));
|
||||||
}
|
}
|
||||||
|
@ -3007,7 +3007,7 @@ bool navigationRequiresTurnAssistance(void)
|
||||||
int8_t navigationGetHeadingControlState(void)
|
int8_t navigationGetHeadingControlState(void)
|
||||||
{
|
{
|
||||||
// For airplanes report as manual heading control
|
// For airplanes report as manual heading control
|
||||||
if (STATE(AIRPLANE_ROVER_BOAT)) {
|
if (STATE(FIXED_WING)) {
|
||||||
return NAV_HEADING_CONTROL_MANUAL;
|
return NAV_HEADING_CONTROL_MANUAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3032,7 +3032,7 @@ bool navigationTerrainFollowingEnabled(void)
|
||||||
|
|
||||||
navArmingBlocker_e navigationIsBlockingArming(bool *usedBypass)
|
navArmingBlocker_e navigationIsBlockingArming(bool *usedBypass)
|
||||||
{
|
{
|
||||||
const bool navBoxModesEnabled = IS_RC_MODE_ACTIVE(BOXNAVRTH) || IS_RC_MODE_ACTIVE(BOXNAVWP) || IS_RC_MODE_ACTIVE(BOXNAVPOSHOLD) || (STATE(AIRPLANE_ROVER_BOAT) && IS_RC_MODE_ACTIVE(BOXNAVALTHOLD)) || (STATE(AIRPLANE_ROVER_BOAT) && IS_RC_MODE_ACTIVE(BOXNAVCRUISE));
|
const bool navBoxModesEnabled = IS_RC_MODE_ACTIVE(BOXNAVRTH) || IS_RC_MODE_ACTIVE(BOXNAVWP) || IS_RC_MODE_ACTIVE(BOXNAVPOSHOLD) || (STATE(FIXED_WING) && IS_RC_MODE_ACTIVE(BOXNAVALTHOLD)) || (STATE(FIXED_WING) && IS_RC_MODE_ACTIVE(BOXNAVCRUISE));
|
||||||
const bool navLaunchComboModesEnabled = isNavLaunchEnabled() && (IS_RC_MODE_ACTIVE(BOXNAVRTH) || IS_RC_MODE_ACTIVE(BOXNAVWP) || IS_RC_MODE_ACTIVE(BOXNAVALTHOLD) || IS_RC_MODE_ACTIVE(BOXNAVCRUISE));
|
const bool navLaunchComboModesEnabled = isNavLaunchEnabled() && (IS_RC_MODE_ACTIVE(BOXNAVRTH) || IS_RC_MODE_ACTIVE(BOXNAVWP) || IS_RC_MODE_ACTIVE(BOXNAVALTHOLD) || IS_RC_MODE_ACTIVE(BOXNAVCRUISE));
|
||||||
|
|
||||||
if (usedBypass) {
|
if (usedBypass) {
|
||||||
|
|
|
@ -581,7 +581,7 @@ static bool estimationCalculateCorrection_Z(estimationContext_t * ctx)
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
else if (STATE(AIRPLANE_ROVER_BOAT) && (ctx->newFlags & EST_GPS_Z_VALID)) {
|
else if (STATE(FIXED_WING) && (ctx->newFlags & EST_GPS_Z_VALID)) {
|
||||||
// If baro is not available - use GPS Z for correction on a plane
|
// If baro is not available - use GPS Z for correction on a plane
|
||||||
// Reset current estimate to GPS altitude if estimate not valid
|
// Reset current estimate to GPS altitude if estimate not valid
|
||||||
if (!(ctx->newFlags & EST_Z_VALID)) {
|
if (!(ctx->newFlags & EST_Z_VALID)) {
|
||||||
|
|
|
@ -490,7 +490,7 @@ void initCrsfTelemetry(void)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#if defined(USE_BARO) || defined(USE_GPS)
|
#if defined(USE_BARO) || defined(USE_GPS)
|
||||||
if (sensors(SENSOR_BARO) || (STATE(AIRPLANE_ROVER_BOAT) && feature(FEATURE_GPS))) {
|
if (sensors(SENSOR_BARO) || (STATE(FIXED_WING) && feature(FEATURE_GPS))) {
|
||||||
crsfSchedule[index++] = BV(CRSF_FRAME_VARIO_SENSOR_INDEX);
|
crsfSchedule[index++] = BV(CRSF_FRAME_VARIO_SENSOR_INDEX);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -467,7 +467,7 @@ void mavlinkSendHUDAndHeartbeat(void)
|
||||||
flightModeForTelemetry_e flm = getFlightModeForTelemetry();
|
flightModeForTelemetry_e flm = getFlightModeForTelemetry();
|
||||||
uint8_t mavCustomMode;
|
uint8_t mavCustomMode;
|
||||||
|
|
||||||
if (STATE(AIRPLANE_ROVER_BOAT)) {
|
if (STATE(FIXED_WING)) {
|
||||||
mavCustomMode = inavToArduPlaneMap[flm];
|
mavCustomMode = inavToArduPlaneMap[flm];
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue