mirror of
https://github.com/iNavFlight/inav.git
synced 2025-07-13 19:40:27 +03:00
change mode name + fixes
This commit is contained in:
parent
98f7f43c1f
commit
b461d8095b
16 changed files with 75 additions and 71 deletions
|
@ -679,18 +679,19 @@ void processRx(timeUs_t currentTimeUs)
|
||||||
bool emergRearmAngleEnforce = STATE(MULTIROTOR) && emergRearmStabiliseTimeout > US2MS(currentTimeUs);
|
bool emergRearmAngleEnforce = STATE(MULTIROTOR) && emergRearmStabiliseTimeout > US2MS(currentTimeUs);
|
||||||
bool autoEnableAngle = failsafeRequiresAngleMode() || navigationRequiresAngleMode() || emergRearmAngleEnforce;
|
bool autoEnableAngle = failsafeRequiresAngleMode() || navigationRequiresAngleMode() || emergRearmAngleEnforce;
|
||||||
|
|
||||||
/* Disable modes initially, will be enabled as required with priority ANGLE > HORIZON > ATTITUDE HOLD */
|
/* Disable stabilised modes initially, will be enabled as required with priority ANGLE > HORIZON > ANGLEHOLD
|
||||||
|
* MANUAL mode has priority over these modes except when ANGLE auto enabled */
|
||||||
DISABLE_FLIGHT_MODE(ANGLE_MODE);
|
DISABLE_FLIGHT_MODE(ANGLE_MODE);
|
||||||
DISABLE_FLIGHT_MODE(HORIZON_MODE);
|
DISABLE_FLIGHT_MODE(HORIZON_MODE);
|
||||||
DISABLE_FLIGHT_MODE(ATTIHOLD_MODE);
|
DISABLE_FLIGHT_MODE(ANGLEHOLD_MODE);
|
||||||
|
|
||||||
if (sensors(SENSOR_ACC)) {
|
if (sensors(SENSOR_ACC) && (!FLIGHT_MODE(MANUAL_MODE) || autoEnableAngle)) {
|
||||||
if (IS_RC_MODE_ACTIVE(BOXANGLE) || autoEnableAngle) {
|
if (IS_RC_MODE_ACTIVE(BOXANGLE) || autoEnableAngle) {
|
||||||
ENABLE_FLIGHT_MODE(ANGLE_MODE);
|
ENABLE_FLIGHT_MODE(ANGLE_MODE);
|
||||||
} else if (IS_RC_MODE_ACTIVE(BOXHORIZON)) {
|
} else if (IS_RC_MODE_ACTIVE(BOXHORIZON)) {
|
||||||
ENABLE_FLIGHT_MODE(HORIZON_MODE);
|
ENABLE_FLIGHT_MODE(HORIZON_MODE);
|
||||||
} else if (STATE(AIRPLANE) && IS_RC_MODE_ACTIVE(BOXATTIHOLD)) {
|
} else if (STATE(AIRPLANE) && IS_RC_MODE_ACTIVE(BOXANGLEHOLD)) {
|
||||||
ENABLE_FLIGHT_MODE(ATTIHOLD_MODE);
|
ENABLE_FLIGHT_MODE(ANGLEHOLD_MODE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -102,7 +102,7 @@ static const box_t boxes[CHECKBOX_ITEM_COUNT + 1] = {
|
||||||
{ .boxId = BOXMULTIFUNCTION, .boxName = "MULTI FUNCTION", .permanentId = 61 },
|
{ .boxId = BOXMULTIFUNCTION, .boxName = "MULTI FUNCTION", .permanentId = 61 },
|
||||||
{ .boxId = BOXMIXERPROFILE, .boxName = "MIXER PROFILE 2", .permanentId = 62 },
|
{ .boxId = BOXMIXERPROFILE, .boxName = "MIXER PROFILE 2", .permanentId = 62 },
|
||||||
{ .boxId = BOXMIXERTRANSITION, .boxName = "MIXER TRANSITION", .permanentId = 63 },
|
{ .boxId = BOXMIXERTRANSITION, .boxName = "MIXER TRANSITION", .permanentId = 63 },
|
||||||
{ .boxId = BOXATTIHOLD, .boxName = "ATTITUDE HOLD", .permanentId = 64 },
|
{ .boxId = BOXANGLEHOLD, .boxName = "ANGLE HOLD", .permanentId = 64 },
|
||||||
{ .boxId = CHECKBOX_ITEM_COUNT, .boxName = NULL, .permanentId = 0xFF }
|
{ .boxId = CHECKBOX_ITEM_COUNT, .boxName = NULL, .permanentId = 0xFF }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -281,7 +281,7 @@ void initActiveBoxIds(void)
|
||||||
ADD_ACTIVE_BOX(BOXAUTOLEVEL);
|
ADD_ACTIVE_BOX(BOXAUTOLEVEL);
|
||||||
}
|
}
|
||||||
if (sensors(SENSOR_ACC)) {
|
if (sensors(SENSOR_ACC)) {
|
||||||
ADD_ACTIVE_BOX(BOXATTIHOLD);
|
ADD_ACTIVE_BOX(BOXANGLEHOLD);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -436,7 +436,7 @@ void packBoxModeFlags(boxBitmask_t * mspBoxModeFlags)
|
||||||
CHECK_ACTIVE_BOX(IS_ENABLED(currentMixerProfileIndex), BOXMIXERPROFILE);
|
CHECK_ACTIVE_BOX(IS_ENABLED(currentMixerProfileIndex), BOXMIXERPROFILE);
|
||||||
CHECK_ACTIVE_BOX(IS_ENABLED(IS_RC_MODE_ACTIVE(BOXMIXERTRANSITION)), BOXMIXERTRANSITION);
|
CHECK_ACTIVE_BOX(IS_ENABLED(IS_RC_MODE_ACTIVE(BOXMIXERTRANSITION)), BOXMIXERTRANSITION);
|
||||||
#endif
|
#endif
|
||||||
CHECK_ACTIVE_BOX(IS_ENABLED(IS_RC_MODE_ACTIVE(BOXATTIHOLD)), BOXATTIHOLD);
|
CHECK_ACTIVE_BOX(IS_ENABLED(IS_RC_MODE_ACTIVE(BOXANGLEHOLD)), BOXANGLEHOLD);
|
||||||
memset(mspBoxModeFlags, 0, sizeof(boxBitmask_t));
|
memset(mspBoxModeFlags, 0, sizeof(boxBitmask_t));
|
||||||
for (uint32_t i = 0; i < activeBoxIdCount; i++) {
|
for (uint32_t i = 0; i < activeBoxIdCount; i++) {
|
||||||
if (activeBoxes[activeBoxIds[i]]) {
|
if (activeBoxes[activeBoxIds[i]]) {
|
||||||
|
|
|
@ -81,7 +81,7 @@ typedef enum {
|
||||||
BOXMULTIFUNCTION = 52,
|
BOXMULTIFUNCTION = 52,
|
||||||
BOXMIXERPROFILE = 53,
|
BOXMIXERPROFILE = 53,
|
||||||
BOXMIXERTRANSITION = 54,
|
BOXMIXERTRANSITION = 54,
|
||||||
BOXATTIHOLD = 55,
|
BOXANGLEHOLD = 55,
|
||||||
CHECKBOX_ITEM_COUNT
|
CHECKBOX_ITEM_COUNT
|
||||||
} boxId_e;
|
} boxId_e;
|
||||||
|
|
||||||
|
|
|
@ -158,8 +158,8 @@ flightModeForTelemetry_e getFlightModeForTelemetry(void)
|
||||||
if (FLIGHT_MODE(HORIZON_MODE))
|
if (FLIGHT_MODE(HORIZON_MODE))
|
||||||
return FLM_HORIZON;
|
return FLM_HORIZON;
|
||||||
|
|
||||||
if (FLIGHT_MODE(ATTIHOLD_MODE))
|
if (FLIGHT_MODE(ANGLEHOLD_MODE))
|
||||||
return FLM_ATTIHOLD;
|
return FLM_ANGLEHOLD;
|
||||||
|
|
||||||
return STATE(AIRMODE_ACTIVE) ? FLM_ACRO_AIR : FLM_ACRO;
|
return STATE(AIRMODE_ACTIVE) ? FLM_ACRO_AIR : FLM_ACRO;
|
||||||
}
|
}
|
||||||
|
|
|
@ -104,7 +104,7 @@ typedef enum {
|
||||||
TURN_ASSISTANT = (1 << 14),
|
TURN_ASSISTANT = (1 << 14),
|
||||||
TURTLE_MODE = (1 << 15),
|
TURTLE_MODE = (1 << 15),
|
||||||
SOARING_MODE = (1 << 16),
|
SOARING_MODE = (1 << 16),
|
||||||
ATTIHOLD_MODE = (1 << 17),
|
ANGLEHOLD_MODE = (1 << 17),
|
||||||
} flightModeFlags_e;
|
} flightModeFlags_e;
|
||||||
|
|
||||||
extern uint32_t flightModeFlags;
|
extern uint32_t flightModeFlags;
|
||||||
|
@ -163,7 +163,7 @@ typedef enum {
|
||||||
FLM_CRUISE,
|
FLM_CRUISE,
|
||||||
FLM_LAUNCH,
|
FLM_LAUNCH,
|
||||||
FLM_FAILSAFE,
|
FLM_FAILSAFE,
|
||||||
FLM_ATTIHOLD,
|
FLM_ANGLEHOLD,
|
||||||
FLM_COUNT
|
FLM_COUNT
|
||||||
} flightModeForTelemetry_e;
|
} flightModeForTelemetry_e;
|
||||||
|
|
||||||
|
|
|
@ -159,7 +159,8 @@ typedef void (*pidControllerFnPtr)(pidState_t *pidState, flight_dynamics_index_t
|
||||||
static EXTENDED_FASTRAM pidControllerFnPtr pidControllerApplyFn;
|
static EXTENDED_FASTRAM pidControllerFnPtr pidControllerApplyFn;
|
||||||
static EXTENDED_FASTRAM filterApplyFnPtr dTermLpfFilterApplyFn;
|
static EXTENDED_FASTRAM filterApplyFnPtr dTermLpfFilterApplyFn;
|
||||||
static EXTENDED_FASTRAM bool levelingEnabled = false;
|
static EXTENDED_FASTRAM bool levelingEnabled = false;
|
||||||
static EXTENDED_FASTRAM bool attiHoldIsLevel = false;
|
static EXTENDED_FASTRAM bool restartAngleHoldMode = true;
|
||||||
|
static EXTENDED_FASTRAM bool angleHoldIsLevel = false;
|
||||||
|
|
||||||
#define FIXED_WING_LEVEL_TRIM_MAX_ANGLE 10.0f // Max angle auto trimming can demand
|
#define FIXED_WING_LEVEL_TRIM_MAX_ANGLE 10.0f // Max angle auto trimming can demand
|
||||||
#define FIXED_WING_LEVEL_TRIM_DIVIDER 50.0f
|
#define FIXED_WING_LEVEL_TRIM_DIVIDER 50.0f
|
||||||
|
@ -1065,58 +1066,57 @@ void checkItermFreezingActive(pidState_t *pidState, flight_dynamics_index_t axis
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isAttiholdLevel(void)
|
bool isAngleHoldLevel(void)
|
||||||
{
|
{
|
||||||
return attiHoldIsLevel;
|
return angleHoldIsLevel;
|
||||||
}
|
}
|
||||||
|
|
||||||
void updateAttihold(float *angleTarget, uint8_t axis)
|
void updateAngleHold(float *angleTarget, uint8_t axis)
|
||||||
{
|
{
|
||||||
int8_t navAttiHoldAxis = navCheckActiveAttiHoldAxis();
|
int8_t navAngleHoldAxis = navCheckActiveAngleHoldAxis();
|
||||||
static bool restartAttiMode = true;
|
// static bool restartAngleHoldMode = true;
|
||||||
|
|
||||||
if (!restartAttiMode) { // reset flags for when attitude hold is inactive
|
if (!restartAngleHoldMode) { // set restart flag when attitude hold is inactive
|
||||||
restartAttiMode = !FLIGHT_MODE(ATTIHOLD_MODE) && navAttiHoldAxis == -1;
|
restartAngleHoldMode = !FLIGHT_MODE(ANGLEHOLD_MODE) && navAngleHoldAxis == -1;
|
||||||
attiHoldIsLevel = restartAttiMode ? false: attiHoldIsLevel;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((FLIGHT_MODE(ATTIHOLD_MODE) || axis == navAttiHoldAxis) && !isFlightAxisAngleOverrideActive(axis)) {
|
if ((FLIGHT_MODE(ANGLEHOLD_MODE) || axis == navAngleHoldAxis) && !isFlightAxisAngleOverrideActive(axis)) {
|
||||||
/* attiHoldTarget stores attitude values using a zero datum when level.
|
/* angleHoldTarget stores attitude values using a zero datum when level.
|
||||||
* This requires attiHoldTarget pitch to be corrected for fixedWingLevelTrim so it is 0
|
* This requires angleHoldTarget pitch to be corrected for fixedWingLevelTrim so it is 0
|
||||||
* when the craft is level even though attitude pitch is non zero in this case.
|
* when the craft is level even though attitude pitch is non zero in this case.
|
||||||
* angleTarget pitch is corrected back to fixedWingLevelTrim datum on return from function */
|
* angleTarget pitch is corrected back to fixedWingLevelTrim datum on return from function */
|
||||||
|
|
||||||
static int16_t attiHoldTarget[2];
|
static int16_t angleHoldTarget[2];
|
||||||
|
|
||||||
if (restartAttiMode) { // set target attitude to current attitude on activation
|
if (restartAngleHoldMode) { // set target attitude to current attitude on activation
|
||||||
attiHoldTarget[FD_ROLL] = attitude.raw[FD_ROLL];
|
angleHoldTarget[FD_ROLL] = attitude.raw[FD_ROLL];
|
||||||
attiHoldTarget[FD_PITCH] = attitude.raw[FD_PITCH] + DEGREES_TO_DECIDEGREES(fixedWingLevelTrim);
|
angleHoldTarget[FD_PITCH] = attitude.raw[FD_PITCH] + DEGREES_TO_DECIDEGREES(fixedWingLevelTrim);
|
||||||
restartAttiMode = false;
|
restartAngleHoldMode = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// set flag indicating attitude hold is level
|
// set flag indicating attitude hold is level
|
||||||
if (FLIGHT_MODE(ATTIHOLD_MODE)) {
|
if (FLIGHT_MODE(ANGLEHOLD_MODE)) {
|
||||||
attiHoldIsLevel = attiHoldTarget[FD_ROLL] == 0 && attiHoldTarget[FD_PITCH] == 0;
|
angleHoldIsLevel = angleHoldTarget[FD_ROLL] == 0 && angleHoldTarget[FD_PITCH] == 0;
|
||||||
} else {
|
} else {
|
||||||
attiHoldIsLevel = attiHoldTarget[navAttiHoldAxis] == 0;
|
angleHoldIsLevel = angleHoldTarget[navAngleHoldAxis] == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t bankLimit = pidProfile()->max_angle_inclination[axis];
|
uint16_t bankLimit = pidProfile()->max_angle_inclination[axis];
|
||||||
|
|
||||||
// use Nav bank angle limits if Nav active
|
// use Nav bank angle limits if Nav active
|
||||||
if (navAttiHoldAxis == FD_ROLL) {
|
if (navAngleHoldAxis == FD_ROLL) {
|
||||||
bankLimit = DEGREES_TO_DECIDEGREES(navConfig()->fw.max_bank_angle);
|
bankLimit = DEGREES_TO_DECIDEGREES(navConfig()->fw.max_bank_angle);
|
||||||
} else if (navAttiHoldAxis == FD_PITCH) {
|
} else if (navAngleHoldAxis == FD_PITCH) {
|
||||||
bankLimit = DEGREES_TO_DECIDEGREES(navConfig()->fw.max_climb_angle);
|
bankLimit = DEGREES_TO_DECIDEGREES(navConfig()->fw.max_climb_angle);
|
||||||
}
|
}
|
||||||
|
|
||||||
int16_t levelTrim = axis == FD_PITCH ? DEGREES_TO_DECIDEGREES(fixedWingLevelTrim) : 0;
|
int16_t levelTrim = axis == FD_PITCH ? DEGREES_TO_DECIDEGREES(fixedWingLevelTrim) : 0;
|
||||||
if (calculateRollPitchCenterStatus() == CENTERED) {
|
if (calculateRollPitchCenterStatus() == CENTERED) {
|
||||||
attiHoldTarget[axis] = ABS(attiHoldTarget[axis]) < 30 ? 0 : attiHoldTarget[axis]; // snap to level when within 3 degs of level
|
angleHoldTarget[axis] = ABS(angleHoldTarget[axis]) < 30 ? 0 : angleHoldTarget[axis]; // snap to level when within 3 degs of level
|
||||||
*angleTarget = constrain(attiHoldTarget[axis] - levelTrim, -bankLimit, bankLimit);
|
*angleTarget = constrain(angleHoldTarget[axis] - levelTrim, -bankLimit, bankLimit);
|
||||||
} else {
|
} else {
|
||||||
*angleTarget = constrain(attitude.raw[axis] + *angleTarget + levelTrim, -bankLimit, bankLimit);
|
*angleTarget = constrain(attitude.raw[axis] + *angleTarget + levelTrim, -bankLimit, bankLimit);
|
||||||
attiHoldTarget[axis] = attitude.raw[axis] + levelTrim;
|
angleHoldTarget[axis] = attitude.raw[axis] + levelTrim;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1174,20 +1174,23 @@ void FAST_CODE pidController(float dT)
|
||||||
// Step 3: Run control for ANGLE_MODE, HORIZON_MODE and ATTI_MODE
|
// Step 3: Run control for ANGLE_MODE, HORIZON_MODE and ATTI_MODE
|
||||||
const float horizonRateMagnitude = FLIGHT_MODE(HORIZON_MODE) ? calcHorizonRateMagnitude() : 0.0f;
|
const float horizonRateMagnitude = FLIGHT_MODE(HORIZON_MODE) ? calcHorizonRateMagnitude() : 0.0f;
|
||||||
levelingEnabled = false;
|
levelingEnabled = false;
|
||||||
|
angleHoldIsLevel = false;
|
||||||
|
|
||||||
for (uint8_t axis = FD_ROLL; axis <= FD_PITCH; axis++) {
|
for (uint8_t axis = FD_ROLL; axis <= FD_PITCH; axis++) {
|
||||||
if (FLIGHT_MODE(ANGLE_MODE) || FLIGHT_MODE(HORIZON_MODE) || FLIGHT_MODE(ATTIHOLD_MODE) || isFlightAxisAngleOverrideActive(axis)) {
|
if (FLIGHT_MODE(ANGLE_MODE) || FLIGHT_MODE(HORIZON_MODE) || FLIGHT_MODE(ANGLEHOLD_MODE) || isFlightAxisAngleOverrideActive(axis)) {
|
||||||
// If axis angle override, get the correct angle from Logic Conditions
|
// If axis angle override, get the correct angle from Logic Conditions
|
||||||
float angleTarget = getFlightAxisAngleOverride(axis, computePidLevelTarget(axis));
|
float angleTarget = getFlightAxisAngleOverride(axis, computePidLevelTarget(axis));
|
||||||
|
|
||||||
if (STATE(AIRPLANE)) { // update attitude hold mode
|
if (STATE(AIRPLANE)) { // update attitude hold mode
|
||||||
updateAttihold(&angleTarget, axis);
|
updateAngleHold(&angleTarget, axis);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Apply the Level PID controller
|
// Apply the Level PID controller
|
||||||
pidLevel(angleTarget, &pidState[axis], axis, horizonRateMagnitude, dT);
|
pidLevel(angleTarget, &pidState[axis], axis, horizonRateMagnitude, dT);
|
||||||
canUseFpvCameraMix = false; // FPVANGLEMIX is incompatible with ANGLE/HORIZON
|
canUseFpvCameraMix = false; // FPVANGLEMIX is incompatible with ANGLE/HORIZON
|
||||||
levelingEnabled = true;
|
levelingEnabled = true;
|
||||||
|
} else {
|
||||||
|
restartAngleHoldMode = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1335,7 +1338,7 @@ bool isFixedWingLevelTrimActive(void)
|
||||||
return IS_RC_MODE_ACTIVE(BOXAUTOLEVEL) && !areSticksDeflected() &&
|
return IS_RC_MODE_ACTIVE(BOXAUTOLEVEL) && !areSticksDeflected() &&
|
||||||
(FLIGHT_MODE(ANGLE_MODE) || FLIGHT_MODE(HORIZON_MODE)) &&
|
(FLIGHT_MODE(ANGLE_MODE) || FLIGHT_MODE(HORIZON_MODE)) &&
|
||||||
!FLIGHT_MODE(SOARING_MODE) && !FLIGHT_MODE(MANUAL_MODE) &&
|
!FLIGHT_MODE(SOARING_MODE) && !FLIGHT_MODE(MANUAL_MODE) &&
|
||||||
!navigationIsControllingAltitude() && !(navCheckActiveAttiHoldAxis() == FD_PITCH && !attiHoldIsLevel);
|
!navigationIsControllingAltitude() && !(navCheckActiveAngleHoldAxis() == FD_PITCH && !angleHoldIsLevel);
|
||||||
}
|
}
|
||||||
|
|
||||||
void updateFixedWingLevelTrim(timeUs_t currentTimeUs)
|
void updateFixedWingLevelTrim(timeUs_t currentTimeUs)
|
||||||
|
|
|
@ -220,4 +220,4 @@ pidType_e pidIndexGetType(pidIndex_e pidIndex);
|
||||||
bool isFixedWingLevelTrimActive(void);
|
bool isFixedWingLevelTrimActive(void);
|
||||||
void updateFixedWingLevelTrim(timeUs_t currentTimeUs);
|
void updateFixedWingLevelTrim(timeUs_t currentTimeUs);
|
||||||
float getFixedWingLevelTrim(void);
|
float getFixedWingLevelTrim(void);
|
||||||
bool isAttiholdLevel(void);
|
bool isAngleHoldLevel(void);
|
||||||
|
|
|
@ -1726,7 +1726,7 @@ static bool osdDrawSingleElement(uint8_t item)
|
||||||
tfp_sprintf(buff, "%5d", (int)getMAhDrawn()); // Use 5 digits to allow packs below 100Ah
|
tfp_sprintf(buff, "%5d", (int)getMAhDrawn()); // Use 5 digits to allow packs below 100Ah
|
||||||
buff[5] = SYM_MAH;
|
buff[5] = SYM_MAH;
|
||||||
buff[6] = '\0';
|
buff[6] = '\0';
|
||||||
} else
|
} else
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
if (osdFormatCentiNumber(buff, getMAhDrawn() * 100, 1000, 0, (mah_digits - 2), mah_digits, false)) {
|
if (osdFormatCentiNumber(buff, getMAhDrawn() * 100, 1000, 0, (mah_digits - 2), mah_digits, false)) {
|
||||||
|
@ -1760,7 +1760,7 @@ static bool osdDrawSingleElement(uint8_t item)
|
||||||
tfp_sprintf(buff, " NF");
|
tfp_sprintf(buff, " NF");
|
||||||
else if (currentBatteryProfile->capacity.unit == BAT_CAPACITY_UNIT_MAH) {
|
else if (currentBatteryProfile->capacity.unit == BAT_CAPACITY_UNIT_MAH) {
|
||||||
uint8_t mah_digits = osdConfig()->mAh_precision; // Initialize to config value
|
uint8_t mah_digits = osdConfig()->mAh_precision; // Initialize to config value
|
||||||
|
|
||||||
#ifndef DISABLE_MSP_BF_COMPAT // IF BFCOMPAT is not supported, there's no need to check for it
|
#ifndef DISABLE_MSP_BF_COMPAT // IF BFCOMPAT is not supported, there's no need to check for it
|
||||||
if (isBfCompatibleVideoSystem(osdConfig())) {
|
if (isBfCompatibleVideoSystem(osdConfig())) {
|
||||||
//BFcompat is unable to work with scaled values and it only has mAh symbol to work with
|
//BFcompat is unable to work with scaled values and it only has mAh symbol to work with
|
||||||
|
@ -1768,7 +1768,7 @@ static bool osdDrawSingleElement(uint8_t item)
|
||||||
buff[5] = SYM_MAH;
|
buff[5] = SYM_MAH;
|
||||||
buff[6] = '\0';
|
buff[6] = '\0';
|
||||||
unitsDrawn = true;
|
unitsDrawn = true;
|
||||||
} else
|
} else
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
if (osdFormatCentiNumber(buff, getBatteryRemainingCapacity() * 100, 1000, 0, (mah_digits - 2), mah_digits, false)) {
|
if (osdFormatCentiNumber(buff, getBatteryRemainingCapacity() * 100, 1000, 0, (mah_digits - 2), mah_digits, false)) {
|
||||||
|
@ -2266,8 +2266,8 @@ static bool osdDrawSingleElement(uint8_t item)
|
||||||
p = "ANGL";
|
p = "ANGL";
|
||||||
else if (FLIGHT_MODE(HORIZON_MODE))
|
else if (FLIGHT_MODE(HORIZON_MODE))
|
||||||
p = "HOR ";
|
p = "HOR ";
|
||||||
else if (FLIGHT_MODE(ATTIHOLD_MODE))
|
else if (FLIGHT_MODE(ANGLEHOLD_MODE))
|
||||||
p = "ATTI";
|
p = "AHLD";
|
||||||
|
|
||||||
displayWrite(osdDisplayPort, elemPosX, elemPosY, p);
|
displayWrite(osdDisplayPort, elemPosX, elemPosY, p);
|
||||||
return true;
|
return true;
|
||||||
|
@ -5198,14 +5198,14 @@ textAttributes_t osdGetSystemMessage(char *buff, size_t buff_size, bool isCenter
|
||||||
if (STATE(LANDING_DETECTED)) {
|
if (STATE(LANDING_DETECTED)) {
|
||||||
messages[messageCount++] = OSD_MESSAGE_STR(OSD_MSG_LANDED);
|
messages[messageCount++] = OSD_MESSAGE_STR(OSD_MSG_LANDED);
|
||||||
}
|
}
|
||||||
if (IS_RC_MODE_ACTIVE(BOXATTIHOLD)) {
|
if (IS_RC_MODE_ACTIVE(BOXANGLEHOLD)) {
|
||||||
int8_t navAttiHoldAxis = navCheckActiveAttiHoldAxis();
|
int8_t navAngleHoldAxis = navCheckActiveAngleHoldAxis();
|
||||||
if (isAttiholdLevel()) {
|
if (isAngleHoldLevel()) {
|
||||||
messages[messageCount++] = OSD_MESSAGE_STR(OSD_MSG_ATTI_LEVEL);
|
messages[messageCount++] = OSD_MESSAGE_STR(OSD_MSG_ANGLEHOLD_LEVEL);
|
||||||
} else if (navAttiHoldAxis == FD_ROLL) {
|
} else if (navAngleHoldAxis == FD_ROLL) {
|
||||||
messages[messageCount++] = OSD_MESSAGE_STR(OSD_MSG_ATTI_ROLL);
|
messages[messageCount++] = OSD_MESSAGE_STR(OSD_MSG_ANGLEHOLD_ROLL);
|
||||||
} else if (navAttiHoldAxis == FD_PITCH) {
|
} else if (navAngleHoldAxis == FD_PITCH) {
|
||||||
messages[messageCount++] = OSD_MESSAGE_STR(OSD_MSG_ATTI_PITCH);
|
messages[messageCount++] = OSD_MESSAGE_STR(OSD_MSG_ANGLEHOLD_PITCH);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -118,9 +118,9 @@
|
||||||
#define OSD_MSG_UNABLE_ARM "UNABLE TO ARM"
|
#define OSD_MSG_UNABLE_ARM "UNABLE TO ARM"
|
||||||
#define OSD_MSG_SAVING_SETTNGS "** SAVING SETTINGS **"
|
#define OSD_MSG_SAVING_SETTNGS "** SAVING SETTINGS **"
|
||||||
#define OSD_MSG_SETTINGS_SAVED "** SETTINGS SAVED **"
|
#define OSD_MSG_SETTINGS_SAVED "** SETTINGS SAVED **"
|
||||||
#define OSD_MSG_ATTI_ROLL "(ATTI ROLL)"
|
#define OSD_MSG_ANGLEHOLD_ROLL "(ANGLEHOLD ROLL)"
|
||||||
#define OSD_MSG_ATTI_PITCH "(ATTI PITCH)"
|
#define OSD_MSG_ANGLEHOLD_PITCH "(ANGLEHOLD PITCH)"
|
||||||
#define OSD_MSG_ATTI_LEVEL "(ATTI LEVEL)"
|
#define OSD_MSG_ANGLEHOLD_LEVEL "(ANGLEHOLD LEVEL)"
|
||||||
|
|
||||||
#ifdef USE_DEV_TOOLS
|
#ifdef USE_DEV_TOOLS
|
||||||
#define OSD_MSG_GRD_TEST_MODE "GRD TEST > MOTORS DISABLED"
|
#define OSD_MSG_GRD_TEST_MODE "GRD TEST > MOTORS DISABLED"
|
||||||
|
@ -416,7 +416,7 @@ typedef struct osdConfig_s {
|
||||||
|
|
||||||
#ifdef USE_WIND_ESTIMATOR
|
#ifdef USE_WIND_ESTIMATOR
|
||||||
bool estimations_wind_compensation; // use wind compensation for estimated remaining flight/distance
|
bool estimations_wind_compensation; // use wind compensation for estimated remaining flight/distance
|
||||||
#endif
|
#endif
|
||||||
uint8_t coordinate_digits;
|
uint8_t coordinate_digits;
|
||||||
bool osd_failsafe_switch_layout;
|
bool osd_failsafe_switch_layout;
|
||||||
uint8_t plus_code_digits; // Number of digits to use in OSD_PLUS_CODE
|
uint8_t plus_code_digits; // Number of digits to use in OSD_PLUS_CODE
|
||||||
|
|
|
@ -300,7 +300,7 @@ static void djiPackBoxModeBitmask(boxBitmask_t * flightModeBitmask)
|
||||||
case FLM_ALTITUDE_HOLD:
|
case FLM_ALTITUDE_HOLD:
|
||||||
case FLM_POSITION_HOLD:
|
case FLM_POSITION_HOLD:
|
||||||
case FLM_MISSION:
|
case FLM_MISSION:
|
||||||
case FLM_ATTIHOLD:
|
case FLM_ANGLEHOLD:
|
||||||
default:
|
default:
|
||||||
// Unsupported ATM, keep at ANGLE
|
// Unsupported ATM, keep at ANGLE
|
||||||
bitArraySet(flightModeBitmask->bits, 1); // DJI: 1 << 1 : ANGLE
|
bitArraySet(flightModeBitmask->bits, 1); // DJI: 1 << 1 : ANGLE
|
||||||
|
|
|
@ -4566,11 +4566,11 @@ int32_t navigationGetHeadingError(void)
|
||||||
return wrap_18000(posControl.desiredState.yaw - posControl.actualState.cog);
|
return wrap_18000(posControl.desiredState.yaw - posControl.actualState.cog);
|
||||||
}
|
}
|
||||||
|
|
||||||
int8_t navCheckActiveAttiHoldAxis(void)
|
int8_t navCheckActiveAngleHoldAxis(void)
|
||||||
{
|
{
|
||||||
int8_t activeAxis = -1;
|
int8_t activeAxis = -1;
|
||||||
|
|
||||||
if (IS_RC_MODE_ACTIVE(BOXATTIHOLD)) {
|
if (IS_RC_MODE_ACTIVE(BOXANGLEHOLD)) {
|
||||||
navigationFSMStateFlags_t stateFlags = navGetCurrentStateFlags();
|
navigationFSMStateFlags_t stateFlags = navGetCurrentStateFlags();
|
||||||
bool altholdActive = stateFlags & NAV_REQUIRE_ANGLE_FW && !(stateFlags & NAV_REQUIRE_ANGLE);
|
bool altholdActive = stateFlags & NAV_REQUIRE_ANGLE_FW && !(stateFlags & NAV_REQUIRE_ANGLE);
|
||||||
|
|
||||||
|
|
|
@ -627,7 +627,7 @@ bool isEstimatedAglTrusted(void);
|
||||||
void checkManualEmergencyLandingControl(bool forcedActivation);
|
void checkManualEmergencyLandingControl(bool forcedActivation);
|
||||||
float updateBaroAltitudeRate(float newBaroAltRate, bool updateValue);
|
float updateBaroAltitudeRate(float newBaroAltRate, bool updateValue);
|
||||||
|
|
||||||
int8_t navCheckActiveAttiHoldAxis(void);
|
int8_t navCheckActiveAngleHoldAxis(void);
|
||||||
|
|
||||||
/* Returns the heading recorded when home position was acquired.
|
/* Returns the heading recorded when home position was acquired.
|
||||||
* Note that the navigation system uses deg*100 as unit and angles
|
* Note that the navigation system uses deg*100 as unit and angles
|
||||||
|
|
|
@ -775,7 +775,7 @@ static int logicConditionGetFlightOperandValue(int operand) {
|
||||||
case LOGIC_CONDITION_OPERAND_FLIGHT_ACTIVE_PROFILE: // int
|
case LOGIC_CONDITION_OPERAND_FLIGHT_ACTIVE_PROFILE: // int
|
||||||
return getConfigProfile() + 1;
|
return getConfigProfile() + 1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case LOGIC_CONDITION_OPERAND_FLIGHT_ACTIVE_MIXER_PROFILE: // int
|
case LOGIC_CONDITION_OPERAND_FLIGHT_ACTIVE_MIXER_PROFILE: // int
|
||||||
return currentMixerProfileIndex + 1;
|
return currentMixerProfileIndex + 1;
|
||||||
break;
|
break;
|
||||||
|
@ -849,8 +849,8 @@ static int logicConditionGetFlightModeOperandValue(int operand) {
|
||||||
return (bool) FLIGHT_MODE(HORIZON_MODE);
|
return (bool) FLIGHT_MODE(HORIZON_MODE);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case LOGIC_CONDITION_OPERAND_FLIGHT_MODE_ATTIMODE:
|
case LOGIC_CONDITION_OPERAND_FLIGHT_MODE_ANGLEHOLD:
|
||||||
return (bool) FLIGHT_MODE(ATTIHOLD_MODE);
|
return (bool) FLIGHT_MODE(ANGLEHOLD_MODE);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case LOGIC_CONDITION_OPERAND_FLIGHT_MODE_AIR:
|
case LOGIC_CONDITION_OPERAND_FLIGHT_MODE_AIR:
|
||||||
|
|
|
@ -157,7 +157,7 @@ typedef enum {
|
||||||
LOGIC_CONDITION_OPERAND_FLIGHT_MODE_USER4, // 13
|
LOGIC_CONDITION_OPERAND_FLIGHT_MODE_USER4, // 13
|
||||||
LOGIC_CONDITION_OPERAND_FLIGHT_MODE_ACRO, // 14
|
LOGIC_CONDITION_OPERAND_FLIGHT_MODE_ACRO, // 14
|
||||||
LOGIC_CONDITION_OPERAND_FLIGHT_MODE_WAYPOINT_MISSION, // 15
|
LOGIC_CONDITION_OPERAND_FLIGHT_MODE_WAYPOINT_MISSION, // 15
|
||||||
LOGIC_CONDITION_OPERAND_FLIGHT_MODE_ATTIMODE, // 16
|
LOGIC_CONDITION_OPERAND_FLIGHT_MODE_ANGLEHOLD, // 16
|
||||||
} logicFlightModeOperands_e;
|
} logicFlightModeOperands_e;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
|
|
@ -352,8 +352,8 @@ static void crsfFrameFlightMode(sbuf_t *dst)
|
||||||
flightMode = "ANGL";
|
flightMode = "ANGL";
|
||||||
} else if (FLIGHT_MODE(HORIZON_MODE)) {
|
} else if (FLIGHT_MODE(HORIZON_MODE)) {
|
||||||
flightMode = "HOR";
|
flightMode = "HOR";
|
||||||
} else if (FLIGHT_MODE(ATTIHOLD_MODE)) {
|
} else if (FLIGHT_MODE(ANGLEHOLD_MODE)) {
|
||||||
flightMode = "ATTI";
|
flightMode = "AHLD";
|
||||||
}
|
}
|
||||||
#ifdef USE_GPS
|
#ifdef USE_GPS
|
||||||
} else if (feature(FEATURE_GPS) && navConfig()->general.flags.extra_arming_safety && (!STATE(GPS_FIX) || !STATE(GPS_FIX_HOME))) {
|
} else if (feature(FEATURE_GPS) && navConfig()->general.flags.extra_arming_safety && (!STATE(GPS_FIX) || !STATE(GPS_FIX_HOME))) {
|
||||||
|
|
|
@ -191,7 +191,7 @@ static APM_COPTER_MODE inavToArduCopterMap(flightModeForTelemetry_e flightMode)
|
||||||
case FLM_ACRO_AIR: return COPTER_MODE_ACRO;
|
case FLM_ACRO_AIR: return COPTER_MODE_ACRO;
|
||||||
case FLM_ANGLE: return COPTER_MODE_STABILIZE;
|
case FLM_ANGLE: return COPTER_MODE_STABILIZE;
|
||||||
case FLM_HORIZON: return COPTER_MODE_STABILIZE;
|
case FLM_HORIZON: return COPTER_MODE_STABILIZE;
|
||||||
case FLM_ATTIHOLD: return COPTER_MODE_STABILIZE;
|
case FLM_ANGLEHOLD: return COPTER_MODE_STABILIZE;
|
||||||
case FLM_ALTITUDE_HOLD: return COPTER_MODE_ALT_HOLD;
|
case FLM_ALTITUDE_HOLD: return COPTER_MODE_ALT_HOLD;
|
||||||
case FLM_POSITION_HOLD: return COPTER_MODE_POSHOLD;
|
case FLM_POSITION_HOLD: return COPTER_MODE_POSHOLD;
|
||||||
case FLM_RTH: return COPTER_MODE_RTL;
|
case FLM_RTH: return COPTER_MODE_RTL;
|
||||||
|
@ -221,7 +221,7 @@ static APM_PLANE_MODE inavToArduPlaneMap(flightModeForTelemetry_e flightMode)
|
||||||
case FLM_ACRO_AIR: return PLANE_MODE_ACRO;
|
case FLM_ACRO_AIR: return PLANE_MODE_ACRO;
|
||||||
case FLM_ANGLE: return PLANE_MODE_FLY_BY_WIRE_A;
|
case FLM_ANGLE: return PLANE_MODE_FLY_BY_WIRE_A;
|
||||||
case FLM_HORIZON: return PLANE_MODE_STABILIZE;
|
case FLM_HORIZON: return PLANE_MODE_STABILIZE;
|
||||||
case FLM_ATTIHOLD: return PLANE_MODE_STABILIZE;
|
case FLM_ANGLEHOLD: return PLANE_MODE_STABILIZE;
|
||||||
case FLM_ALTITUDE_HOLD: return PLANE_MODE_FLY_BY_WIRE_B;
|
case FLM_ALTITUDE_HOLD: return PLANE_MODE_FLY_BY_WIRE_B;
|
||||||
case FLM_POSITION_HOLD: return PLANE_MODE_LOITER;
|
case FLM_POSITION_HOLD: return PLANE_MODE_LOITER;
|
||||||
case FLM_RTH: return PLANE_MODE_RTL;
|
case FLM_RTH: return PLANE_MODE_RTL;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue