1
0
Fork 0
mirror of https://github.com/iNavFlight/inav.git synced 2025-07-26 09:45:33 +03:00

Merge pull request #10090 from breadoven/abo_osd_sys_msg_cleanup

OSD system message improvements
This commit is contained in:
breadoven 2024-06-18 21:28:56 +01:00 committed by GitHub
commit a4de24df6f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 189 additions and 181 deletions

View file

@ -114,7 +114,6 @@ void processAirmode(void) {
} else if (STATE(MULTIROTOR)) { } else if (STATE(MULTIROTOR)) {
processAirmodeMultirotor(); processAirmodeMultirotor();
} }
} }
bool isUsingNavigationModes(void) bool isUsingNavigationModes(void)
@ -122,6 +121,21 @@ bool isUsingNavigationModes(void)
return isUsingNAVModes; return isUsingNAVModes;
} }
bool isFwAutoModeActive(boxId_e mode)
{
/* Sets activation priority of fixed wing auto tune/trim modes: Autotune -> Autotrim -> Autolevel */
if (mode == BOXAUTOTUNE) {
return IS_RC_MODE_ACTIVE(BOXAUTOTUNE);
} else if (mode == BOXAUTOTRIM) {
return IS_RC_MODE_ACTIVE(BOXAUTOTRIM) && !IS_RC_MODE_ACTIVE(BOXAUTOTUNE);
} else if (mode == BOXAUTOLEVEL) {
return IS_RC_MODE_ACTIVE(BOXAUTOLEVEL) && !IS_RC_MODE_ACTIVE(BOXAUTOTUNE) && !IS_RC_MODE_ACTIVE(BOXAUTOTRIM);
}
return false;
}
bool IS_RC_MODE_ACTIVE(boxId_e boxId) bool IS_RC_MODE_ACTIVE(boxId_e boxId)
{ {
return bitArrayGet(rcModeActivationMask.bits, boxId); return bitArrayGet(rcModeActivationMask.bits, boxId);

View file

@ -140,3 +140,4 @@ bool isRangeActive(uint8_t auxChannelIndex, const channelRange_t *range);
void updateActivatedModes(void); void updateActivatedModes(void);
void updateUsedModeActivationConditionFlags(void); void updateUsedModeActivationConditionFlags(void);
bool isFwAutoModeActive(boxId_e mode);

View file

@ -1385,7 +1385,7 @@ pidBank_t * pidBankMutable(void) {
bool isFixedWingLevelTrimActive(void) bool isFixedWingLevelTrimActive(void)
{ {
return IS_RC_MODE_ACTIVE(BOXAUTOLEVEL) && !areSticksDeflected() && return isFwAutoModeActive(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() && !(navCheckActiveAngleHoldAxis() == FD_PITCH && !angleHoldIsLevel); !navigationIsControllingAltitude() && !(navCheckActiveAngleHoldAxis() == FD_PITCH && !angleHoldIsLevel);
@ -1409,7 +1409,7 @@ void updateFixedWingLevelTrim(timeUs_t currentTimeUs)
previousArmingState = ARMING_FLAG(ARMED); previousArmingState = ARMING_FLAG(ARMED);
// return if not active or disarmed // return if not active or disarmed
if (!IS_RC_MODE_ACTIVE(BOXAUTOLEVEL) || !ARMING_FLAG(ARMED)) { if (!isFwAutoModeActive(BOXAUTOLEVEL) || !ARMING_FLAG(ARMED)) {
return; return;
} }

View file

@ -40,6 +40,7 @@
#include "fc/config.h" #include "fc/config.h"
#include "fc/controlrate_profile.h" #include "fc/controlrate_profile.h"
#include "fc/rc_controls.h" #include "fc/rc_controls.h"
#include "fc/rc_modes.h"
#include "fc/rc_adjustments.h" #include "fc/rc_adjustments.h"
#include "fc/runtime_config.h" #include "fc/runtime_config.h"
#include "fc/settings.h" #include "fc/settings.h"
@ -130,7 +131,7 @@ void autotuneStart(void)
void autotuneUpdateState(void) void autotuneUpdateState(void)
{ {
if (IS_RC_MODE_ACTIVE(BOXAUTOTUNE) && STATE(AIRPLANE) && ARMING_FLAG(ARMED)) { if (isFwAutoModeActive(BOXAUTOTUNE) && STATE(AIRPLANE) && ARMING_FLAG(ARMED)) {
if (!FLIGHT_MODE(AUTO_TUNE)) { if (!FLIGHT_MODE(AUTO_TUNE)) {
autotuneStart(); autotuneStart();
ENABLE_FLIGHT_MODE(AUTO_TUNE); ENABLE_FLIGHT_MODE(AUTO_TUNE);

View file

@ -449,7 +449,7 @@ void processServoAutotrimMode(void)
static int32_t servoMiddleAccum[MAX_SUPPORTED_SERVOS]; static int32_t servoMiddleAccum[MAX_SUPPORTED_SERVOS];
static int32_t servoMiddleAccumCount[MAX_SUPPORTED_SERVOS]; static int32_t servoMiddleAccumCount[MAX_SUPPORTED_SERVOS];
if (IS_RC_MODE_ACTIVE(BOXAUTOTRIM)) { if (isFwAutoModeActive(BOXAUTOTRIM)) {
switch (trimState) { switch (trimState) {
case AUTOTRIM_IDLE: case AUTOTRIM_IDLE:
if (ARMING_FLAG(ARMED)) { if (ARMING_FLAG(ARMED)) {

View file

@ -2380,8 +2380,9 @@ static bool osdDrawSingleElement(uint8_t item)
p = " WP "; p = " WP ";
else if (FLIGHT_MODE(NAV_ALTHOLD_MODE) && navigationRequiresAngleMode()) { else if (FLIGHT_MODE(NAV_ALTHOLD_MODE) && navigationRequiresAngleMode()) {
// If navigationRequiresAngleMode() returns false when ALTHOLD is active, // If navigationRequiresAngleMode() returns false when ALTHOLD is active,
// it means it can be combined with ANGLE, HORIZON, ANGLEHOLD, ACRO, etc... // it means it can be combined with ANGLE, HORIZON, ACRO, etc...
// and its display is handled by OSD_MESSAGES rather than OSD_FLYMODE. // and its display is handled by OSD_MESSAGES rather than OSD_FLYMODE.
// (Currently only applies to multirotor).
p = " AH "; p = " AH ";
} }
else if (FLIGHT_MODE(ANGLE_MODE)) else if (FLIGHT_MODE(ANGLE_MODE))
@ -5641,24 +5642,20 @@ textAttributes_t osdGetSystemMessage(char *buff, size_t buff_size, bool isCenter
if (buff != NULL) { if (buff != NULL) {
const char *message = NULL; const char *message = NULL;
char messageBuf[MAX(SETTING_MAX_NAME_LENGTH, OSD_MESSAGE_LENGTH+1)]; //warning: shared buffer. Make sure it is used by single message in code below! /* WARNING: messageBuf is shared, use accordingly */
// We might have up to 5 messages to show. char messageBuf[MAX(SETTING_MAX_NAME_LENGTH, OSD_MESSAGE_LENGTH + 1)];
const char *messages[5];
/* WARNING: ensure number of messages returned does not exceed messages array size
* Messages array set 1 larger than maximum expected message count of 6 */
const char *messages[7];
unsigned messageCount = 0; unsigned messageCount = 0;
const char *failsafeInfoMessage = NULL; const char *failsafeInfoMessage = NULL;
const char *invertedInfoMessage = NULL; const char *invertedInfoMessage = NULL;
if (ARMING_FLAG(ARMED)) { if (ARMING_FLAG(ARMED)) {
#ifdef USE_FW_AUTOLAND
if (FLIGHT_MODE(FAILSAFE_MODE) || FLIGHT_MODE(NAV_RTH_MODE) || FLIGHT_MODE(NAV_WP_MODE) || navigationIsExecutingAnEmergencyLanding() || FLIGHT_MODE(NAV_FW_AUTOLAND)) {
if (isWaypointMissionRTHActive() && !posControl.fwLandState.landWp) {
#else
if (FLIGHT_MODE(FAILSAFE_MODE) || FLIGHT_MODE(NAV_RTH_MODE) || FLIGHT_MODE(NAV_WP_MODE) || navigationIsExecutingAnEmergencyLanding()) { if (FLIGHT_MODE(FAILSAFE_MODE) || FLIGHT_MODE(NAV_RTH_MODE) || FLIGHT_MODE(NAV_WP_MODE) || navigationIsExecutingAnEmergencyLanding()) {
if (isWaypointMissionRTHActive()) { /* ADDS MAXIMUM OF 3 MESSAGES TO TOTAL NORMALLY, 5 MESSAGES DURING FAILSAFE */
#endif
// if RTH activated whilst WP mode selected, remind pilot to cancel WP mode to exit RTH
messages[messageCount++] = OSD_MESSAGE_STR(OSD_MSG_WP_RTH_CANCEL);
}
if (navGetCurrentStateFlags() & NAV_AUTO_WP_DONE) { if (navGetCurrentStateFlags() & NAV_AUTO_WP_DONE) {
messages[messageCount++] = STATE(LANDING_DETECTED) ? OSD_MESSAGE_STR(OSD_MSG_WP_LANDED) : OSD_MESSAGE_STR(OSD_MSG_WP_FINISHED); messages[messageCount++] = STATE(LANDING_DETECTED) ? OSD_MESSAGE_STR(OSD_MSG_WP_LANDED) : OSD_MESSAGE_STR(OSD_MSG_WP_FINISHED);
} else if (NAV_Status.state == MW_NAV_STATE_WP_ENROUTE) { } else if (NAV_Status.state == MW_NAV_STATE_WP_ENROUTE) {
@ -5680,36 +5677,27 @@ textAttributes_t osdGetSystemMessage(char *buff, size_t buff_size, bool isCenter
messages[messageCount++] = messageBuf; messages[messageCount++] = messageBuf;
} }
} else if (NAV_Status.state == MW_NAV_STATE_LAND_SETTLE && posControl.landingDelay > 0) {
uint16_t remainingHoldSec = MS2S(posControl.landingDelay - millis());
tfp_sprintf(messageBuf, "LANDING DELAY: %3u SECONDS", remainingHoldSec);
messages[messageCount++] = messageBuf;
} }
else { else {
#ifdef USE_FW_AUTOLAND
if (canFwLandingBeCancelled()) {
messages[messageCount++] = OSD_MESSAGE_STR(OSD_MSG_MOVE_STICKS);
} else if (!FLIGHT_MODE(NAV_FW_AUTOLAND)) {
#endif
const char *navStateMessage = navigationStateMessage(); const char *navStateMessage = navigationStateMessage();
if (navStateMessage) { if (navStateMessage) {
messages[messageCount++] = navStateMessage; messages[messageCount++] = navStateMessage;
} }
#ifdef USE_FW_AUTOLAND
} }
#endif
}
#if defined(USE_SAFE_HOME) #if defined(USE_SAFE_HOME)
const char *safehomeMessage = divertingToSafehomeMessage(); const char *safehomeMessage = divertingToSafehomeMessage();
if (safehomeMessage) { if (safehomeMessage) {
messages[messageCount++] = safehomeMessage; messages[messageCount++] = safehomeMessage;
} }
#endif #endif
if (FLIGHT_MODE(FAILSAFE_MODE)) { if (FLIGHT_MODE(FAILSAFE_MODE)) { // In FS mode while armed
// In FS mode while being armed too if (NAV_Status.state == MW_NAV_STATE_LAND_SETTLE && posControl.landingDelay > 0) {
uint16_t remainingHoldSec = MS2S(posControl.landingDelay - millis());
tfp_sprintf(messageBuf, "LANDING DELAY: %3u SECONDS", remainingHoldSec);
messages[messageCount++] = messageBuf;
}
const char *failsafePhaseMessage = osdFailsafePhaseMessage(); const char *failsafePhaseMessage = osdFailsafePhaseMessage();
failsafeInfoMessage = osdFailsafeInfoMessage(); failsafeInfoMessage = osdFailsafeInfoMessage();
@ -5719,56 +5707,41 @@ textAttributes_t osdGetSystemMessage(char *buff, size_t buff_size, bool isCenter
if (failsafeInfoMessage) { if (failsafeInfoMessage) {
messages[messageCount++] = failsafeInfoMessage; messages[messageCount++] = failsafeInfoMessage;
} }
} else if (isWaypointMissionRTHActive()) {
// if RTH activated whilst WP mode selected, remind pilot to cancel WP mode to exit RTH
messages[messageCount++] = OSD_MESSAGE_STR(OSD_MSG_WP_RTH_CANCEL);
} }
} else { /* messages shown only when Failsafe, WP, RTH or Emergency Landing not active */ } else if (STATE(LANDING_DETECTED)) {
if (STATE(FIXED_WING_LEGACY) && (navGetCurrentStateFlags() & NAV_CTL_LAUNCH)) { messages[messageCount++] = OSD_MESSAGE_STR(OSD_MSG_LANDED);
} else {
/* Messages shown only when Failsafe, WP, RTH or Emergency Landing not active and landed state inactive */
/* ADDS MAXIMUM OF 3 MESSAGES TO TOTAL */
if (STATE(AIRPLANE)) { /* ADDS MAXIMUM OF 3 MESSAGES TO TOTAL */
#ifdef USE_FW_AUTOLAND
if (canFwLandingBeCancelled()) {
messages[messageCount++] = OSD_MESSAGE_STR(OSD_MSG_MOVE_STICKS);
} else
#endif
if (navGetCurrentStateFlags() & NAV_CTL_LAUNCH) {
messages[messageCount++] = navConfig()->fw.launch_manual_throttle ? OSD_MESSAGE_STR(OSD_MSG_AUTOLAUNCH_MANUAL) : messages[messageCount++] = navConfig()->fw.launch_manual_throttle ? OSD_MESSAGE_STR(OSD_MSG_AUTOLAUNCH_MANUAL) :
OSD_MESSAGE_STR(OSD_MSG_AUTOLAUNCH); OSD_MESSAGE_STR(OSD_MSG_AUTOLAUNCH);
const char *launchStateMessage = fixedWingLaunchStateMessage(); const char *launchStateMessage = fixedWingLaunchStateMessage();
if (launchStateMessage) { if (launchStateMessage) {
messages[messageCount++] = launchStateMessage; messages[messageCount++] = launchStateMessage;
} }
} else { } else if (FLIGHT_MODE(SOARING_MODE)) {
if (FLIGHT_MODE(NAV_ALTHOLD_MODE) && !navigationRequiresAngleMode()) { messages[messageCount++] = OSD_MESSAGE_STR(OSD_MSG_NAV_SOARING);
// ALTHOLD might be enabled alongside ANGLE/HORIZON/ANGLEHOLD/ACRO } else if (isFwAutoModeActive(BOXAUTOTUNE)) {
// when it doesn't require ANGLE mode (required only in FW
// right now). If it requires ANGLE, its display is handled by OSD_FLYMODE.
messages[messageCount++] = OSD_MESSAGE_STR(OSD_MSG_ALTITUDE_HOLD);
}
if (STATE(MULTIROTOR) && FLIGHT_MODE(NAV_COURSE_HOLD_MODE)) {
if (posControl.cruise.multicopterSpeed >= 50.0f) {
char buf[6];
osdFormatVelocityStr(buf, posControl.cruise.multicopterSpeed, false, false);
tfp_sprintf(messageBuf, "(SPD %s)", buf);
} else {
strcpy(messageBuf, "(HOLD)");
}
messages[messageCount++] = messageBuf;
}
if (IS_RC_MODE_ACTIVE(BOXAUTOTRIM) && !feature(FEATURE_FW_AUTOTRIM)) {
messages[messageCount++] = OSD_MESSAGE_STR(OSD_MSG_AUTOTRIM);
}
if (IS_RC_MODE_ACTIVE(BOXAUTOTUNE)) {
messages[messageCount++] = OSD_MESSAGE_STR(OSD_MSG_AUTOTUNE); messages[messageCount++] = OSD_MESSAGE_STR(OSD_MSG_AUTOTUNE);
if (FLIGHT_MODE(MANUAL_MODE)) { if (FLIGHT_MODE(MANUAL_MODE)) {
messages[messageCount++] = OSD_MESSAGE_STR(OSD_MSG_AUTOTUNE_ACRO); messages[messageCount++] = OSD_MESSAGE_STR(OSD_MSG_AUTOTUNE_ACRO);
} }
} } else if (isFwAutoModeActive(BOXAUTOTRIM) && !feature(FEATURE_FW_AUTOTRIM)) {
if (isFixedWingLevelTrimActive()) { messages[messageCount++] = OSD_MESSAGE_STR(OSD_MSG_AUTOTRIM);
} else if (isFixedWingLevelTrimActive()) {
messages[messageCount++] = OSD_MESSAGE_STR(OSD_MSG_AUTOLEVEL); messages[messageCount++] = OSD_MESSAGE_STR(OSD_MSG_AUTOLEVEL);
} }
if (FLIGHT_MODE(HEADFREE_MODE)) {
messages[messageCount++] = OSD_MESSAGE_STR(OSD_MSG_HEADFREE);
}
if (FLIGHT_MODE(SOARING_MODE)) {
messages[messageCount++] = OSD_MESSAGE_STR(OSD_MSG_NAV_SOARING);
}
if (posControl.flags.wpMissionPlannerActive) {
messages[messageCount++] = OSD_MESSAGE_STR(OSD_MSG_MISSION_PLANNER);
}
if (STATE(LANDING_DETECTED)) {
messages[messageCount++] = OSD_MESSAGE_STR(OSD_MSG_LANDED);
}
if (IS_RC_MODE_ACTIVE(BOXANGLEHOLD)) { if (IS_RC_MODE_ACTIVE(BOXANGLEHOLD)) {
int8_t navAngleHoldAxis = navCheckActiveAngleHoldAxis(); int8_t navAngleHoldAxis = navCheckActiveAngleHoldAxis();
if (isAngleHoldLevel()) { if (isAngleHoldLevel()) {
@ -5779,14 +5752,33 @@ textAttributes_t osdGetSystemMessage(char *buff, size_t buff_size, bool isCenter
messages[messageCount++] = OSD_MESSAGE_STR(OSD_MSG_ANGLEHOLD_PITCH); messages[messageCount++] = OSD_MESSAGE_STR(OSD_MSG_ANGLEHOLD_PITCH);
} }
} }
} else if (STATE(MULTIROTOR)) { /* ADDS MAXIMUM OF 2 MESSAGES TO TOTAL */
if (FLIGHT_MODE(NAV_COURSE_HOLD_MODE)) {
if (posControl.cruise.multicopterSpeed >= 50.0f) {
char buf[6];
osdFormatVelocityStr(buf, posControl.cruise.multicopterSpeed, false, false);
tfp_sprintf(messageBuf, "(SPD %s)", buf);
} else {
strcpy(messageBuf, "(HOLD)");
}
messages[messageCount++] = messageBuf;
} else if (FLIGHT_MODE(HEADFREE_MODE)) {
messages[messageCount++] = OSD_MESSAGE_STR(OSD_MSG_HEADFREE);
}
if (FLIGHT_MODE(NAV_ALTHOLD_MODE) && !navigationRequiresAngleMode()) {
/* If ALTHOLD is separately enabled for multirotor together with ANGL/HORIZON/ACRO modes
* then ANGL/HORIZON/ACRO are indicated by the OSD_FLYMODE field.
* In this case indicate ALTHOLD is active via a system message */
messages[messageCount++] = OSD_MESSAGE_STR(OSD_MSG_ALTITUDE_HOLD);
} }
} }
} else if (ARMING_FLAG(ARMING_DISABLED_ALL_FLAGS)) { }
} else if (ARMING_FLAG(ARMING_DISABLED_ALL_FLAGS)) { /* ADDS MAXIMUM OF 2 MESSAGES TO TOTAL */
unsigned invalidIndex; unsigned invalidIndex;
// Check if we're unable to arm for some reason // Check if we're unable to arm for some reason
if (ARMING_FLAG(ARMING_DISABLED_INVALID_SETTING) && !settingsValidate(&invalidIndex)) { if (ARMING_FLAG(ARMING_DISABLED_INVALID_SETTING) && !settingsValidate(&invalidIndex)) {
const setting_t *setting = settingGet(invalidIndex); const setting_t *setting = settingGet(invalidIndex);
settingGetName(setting, messageBuf); settingGetName(setting, messageBuf);
for (int ii = 0; messageBuf[ii]; ii++) { for (int ii = 0; messageBuf[ii]; ii++) {
@ -5797,15 +5789,11 @@ textAttributes_t osdGetSystemMessage(char *buff, size_t buff_size, bool isCenter
invertedInfoMessage = OSD_MESSAGE_STR(OSD_MSG_INVALID_SETTING); invertedInfoMessage = OSD_MESSAGE_STR(OSD_MSG_INVALID_SETTING);
messages[messageCount++] = invertedInfoMessage; messages[messageCount++] = invertedInfoMessage;
} else { } else {
invertedInfoMessage = OSD_MESSAGE_STR(OSD_MSG_UNABLE_ARM); invertedInfoMessage = OSD_MESSAGE_STR(OSD_MSG_UNABLE_ARM);
messages[messageCount++] = invertedInfoMessage; messages[messageCount++] = invertedInfoMessage;
// Show the reason for not arming // Show the reason for not arming
messages[messageCount++] = osdArmingDisabledReasonMessage(); messages[messageCount++] = osdArmingDisabledReasonMessage();
} }
} else if (!ARMING_FLAG(ARMED)) { } else if (!ARMING_FLAG(ARMED)) {
if (isWaypointListValid()) { if (isWaypointListValid()) {
@ -5814,6 +5802,10 @@ textAttributes_t osdGetSystemMessage(char *buff, size_t buff_size, bool isCenter
} }
/* Messages that are shown regardless of Arming state */ /* Messages that are shown regardless of Arming state */
/* ADDS MAXIMUM OF 2 MESSAGES TO TOTAL NORMALLY, 1 MESSAGE DURING FAILSAFE */
if (posControl.flags.wpMissionPlannerActive && !FLIGHT_MODE(FAILSAFE_MODE)) {
messages[messageCount++] = OSD_MESSAGE_STR(OSD_MSG_MISSION_PLANNER);
}
// The following has been commented out as it will be added in #9688 // The following has been commented out as it will be added in #9688
// uint16_t rearmMs = (emergInflightRearmEnabled()) ? emergencyInFlightRearmTimeMS() : 0; // uint16_t rearmMs = (emergInflightRearmEnabled()) ? emergencyInFlightRearmTimeMS() : 0;
@ -5844,7 +5836,7 @@ textAttributes_t osdGetSystemMessage(char *buff, size_t buff_size, bool isCenter
} else if (message == invertedInfoMessage) { } else if (message == invertedInfoMessage) {
TEXT_ATTRIBUTES_ADD_INVERTED(elemAttr); TEXT_ATTRIBUTES_ADD_INVERTED(elemAttr);
} }
// We're shoing either failsafePhaseMessage or // We're showing either failsafePhaseMessage or
// navStateMessage. Don't BLINK here since // navStateMessage. Don't BLINK here since
// having this text available might be crucial // having this text available might be crucial
// during a lost aircraft recovery and blinking // during a lost aircraft recovery and blinking