From cc84b0d3e51c4a862158a7a4160781cc167eeaa1 Mon Sep 17 00:00:00 2001 From: Darren Lines Date: Fri, 2 Feb 2024 21:52:36 +0000 Subject: [PATCH 01/10] Updates to disarm save delay and emergency rearm Initial changes --- src/main/fc/config.c | 4 ++-- src/main/fc/fc_core.c | 5 +++++ src/main/io/osd.c | 3 ++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/main/fc/config.c b/src/main/fc/config.c index ea8e0d509d4..1a545a98daa 100755 --- a/src/main/fc/config.c +++ b/src/main/fc/config.c @@ -403,11 +403,11 @@ void processDelayedSave(bool readyToSave) if (emergInflightRearmEnabled() || !readyToSave) { // Do not process save if we are potentially still flying. Once armed, this function will not be called until the next disarm. #ifdef USE_OSD - osdSaveWaitingProcess(); + osdSaveWaitingProcess(); #endif } else { #ifdef USE_OSD - osdStartedSaveProcess(); + osdStartedSaveProcess(); #endif if (readyToSave) { processSaveConfigAndNotify(); diff --git a/src/main/fc/fc_core.c b/src/main/fc/fc_core.c index 470d9c11aae..d9b42c345f3 100644 --- a/src/main/fc/fc_core.c +++ b/src/main/fc/fc_core.c @@ -512,9 +512,14 @@ bool emergencyArmingUpdate(bool armingSwitchIsOn, bool forceArm) bool emergInflightRearmEnabled(void) { /* Emergency rearm allowed within 5s timeout period after disarm if craft still flying */ + bool emergRearmActive = STATE(IN_FLIGHT_EMERG_REARM); + DISABLE_STATE(IN_FLIGHT_EMERG_REARM); timeMs_t currentTimeMs = millis(); emergRearmStabiliseTimeout = 0; + if (emergRearmActive && armTime <= 1 * USECS_PER_SEC) + ENABLE_STATE(IN_FLIGHT_EMERG_REARM); // This stays active for 1 second after re-arming + if ((lastDisarmReason != DISARM_SWITCH && lastDisarmReason != DISARM_KILLSWITCH) || (currentTimeMs > US2MS(lastDisarmTimeUs) + EMERGENCY_INFLIGHT_REARM_TIME_WINDOW_MS)) { return false; diff --git a/src/main/io/osd.c b/src/main/io/osd.c index 70e8f524456..ab8ecad32a7 100644 --- a/src/main/io/osd.c +++ b/src/main/io/osd.c @@ -226,7 +226,8 @@ void osdSaveProcessAborted(void) { } void osdSaveWaitingProcess(void) { - savingSettings = OSD_SAVE_MESSAGE_WAITING; + if (savingSettings == OSD_SAVE_MESSAGE_NONE) + savingSettings = OSD_SAVE_MESSAGE_WAITING; } void osdStartedSaveProcess(void) { From bfb0e2519b7010440db45f857eefebef5c6365e4 Mon Sep 17 00:00:00 2001 From: Darren Lines Date: Fri, 2 Feb 2024 22:53:29 +0000 Subject: [PATCH 02/10] Update - Fix erroneous OSD message, which was showing false positives on the save - Increased the base save delay time, to test a theory that the multirotors may not be triggering the emergency rearm allowed quick enough --- src/main/fc/config.c | 3 --- src/main/fc/fc_core.c | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/src/main/fc/config.c b/src/main/fc/config.c index 1a545a98daa..e8bf17e6708 100755 --- a/src/main/fc/config.c +++ b/src/main/fc/config.c @@ -379,9 +379,6 @@ void ensureEEPROMContainsValidData(void) */ void saveConfigAndNotify(void) { -#ifdef USE_OSD - osdStartedSaveProcess(); -#endif saveState = SAVESTATE_SAVEANDNOTIFY; } diff --git a/src/main/fc/fc_core.c b/src/main/fc/fc_core.c index d9b42c345f3..21fb921dff4 100644 --- a/src/main/fc/fc_core.c +++ b/src/main/fc/fc_core.c @@ -901,7 +901,7 @@ void taskMainPidLoop(timeUs_t currentTimeUs) armTime = 0; // Delay saving for 0.5s to allow other functions to finish processing data to be stored on disarm - processDelayedSave((currentTimeUs - lastDisarmTimeUs > USECS_PER_SEC / 2)); + processDelayedSave((currentTimeUs - lastDisarmTimeUs > USECS_PER_SEC * 2));// / 2)); } if (armTime > 1 * USECS_PER_SEC) { // reset in flight emerg rearm flag 1 sec after arming once it's served its purpose From c6b90bcc3352371eb51d5149ec0621096c96b2e5 Mon Sep 17 00:00:00 2001 From: Darren Lines Date: Sat, 3 Feb 2024 22:44:27 +0000 Subject: [PATCH 03/10] Commit for Jetrell's tests --- src/main/common/constants.h | 14 +++++++------- src/main/common/maths.h | 2 ++ src/main/fc/fc_core.c | 18 +++++++++++++----- src/main/fc/fc_core.h | 1 + src/main/io/osd.c | 36 +++++++++++++++++++++++++++++++----- 5 files changed, 54 insertions(+), 17 deletions(-) diff --git a/src/main/common/constants.h b/src/main/common/constants.h index 5447fa184e1..8f6db86ec6b 100644 --- a/src/main/common/constants.h +++ b/src/main/common/constants.h @@ -17,10 +17,10 @@ #pragma once -#define FEET_PER_MILE 5280 -#define FEET_PER_NAUTICALMILE 6076.118f -#define FEET_PER_KILOFEET 1000 // Used for altitude -#define METERS_PER_KILOMETER 1000 -#define METERS_PER_MILE 1609.344f -#define METERS_PER_FOOT 3.28084f -#define METERS_PER_NAUTICALMILE 1852.001f +#define FEET_PER_MILE 5280 +#define FEET_PER_NAUTICALMILE 6076.118f +#define FEET_PER_KILOFEET 1000 // Used for altitude +#define METERS_PER_KILOMETER 1000 +#define METERS_PER_MILE 1609.344f +#define METERS_PER_FOOT 3.28084f +#define METERS_PER_NAUTICALMILE 1852.001f diff --git a/src/main/common/maths.h b/src/main/common/maths.h index 1daed3ef6aa..88dc43f058e 100644 --- a/src/main/common/maths.h +++ b/src/main/common/maths.h @@ -61,6 +61,8 @@ #define CENTIMETERS_TO_METERS(cm) (cm / 100.0f) #define METERS_TO_CENTIMETERS(m) (m * 100) +#define METERS_TO_MILES(m) (m / 160934.4f) +#define METERS_TO_NAUTICALMILES(m) (m / 185200) #define CMSEC_TO_CENTIMPH(cms) (cms * 2.2369363f) #define CMSEC_TO_CENTIKPH(cms) (cms * 3.6f) diff --git a/src/main/fc/fc_core.c b/src/main/fc/fc_core.c index 21fb921dff4..88d8bf2a525 100644 --- a/src/main/fc/fc_core.c +++ b/src/main/fc/fc_core.c @@ -509,16 +509,24 @@ bool emergencyArmingUpdate(bool armingSwitchIsOn, bool forceArm) return counter >= EMERGENCY_ARMING_MIN_ARM_COUNT; } +uint16_t emergencyInFlightRearmTimeMS(void) +{ + timeMs_t currentTimeMs = millis(); + uint16_t rearmMS = (uint16_t)((US2MS(lastDisarmTimeUs) + EMERGENCY_INFLIGHT_REARM_TIME_WINDOW_MS) - currentTimeMs); + + return rearmMS; +} + bool emergInflightRearmEnabled(void) { /* Emergency rearm allowed within 5s timeout period after disarm if craft still flying */ - bool emergRearmActive = STATE(IN_FLIGHT_EMERG_REARM); - DISABLE_STATE(IN_FLIGHT_EMERG_REARM); +// bool emergRearmActive = STATE(IN_FLIGHT_EMERG_REARM); +// DISABLE_STATE(IN_FLIGHT_EMERG_REARM); timeMs_t currentTimeMs = millis(); emergRearmStabiliseTimeout = 0; - if (emergRearmActive && armTime <= 1 * USECS_PER_SEC) - ENABLE_STATE(IN_FLIGHT_EMERG_REARM); // This stays active for 1 second after re-arming +// if (ARMING_FLAG(ARMED) && emergRearmActive && (armTime < (1 * USECS_PER_SEC))) +// ENABLE_STATE(IN_FLIGHT_EMERG_REARM); // This stays active for 1 second after re-arming if ((lastDisarmReason != DISARM_SWITCH && lastDisarmReason != DISARM_KILLSWITCH) || (currentTimeMs > US2MS(lastDisarmTimeUs) + EMERGENCY_INFLIGHT_REARM_TIME_WINDOW_MS)) { @@ -901,7 +909,7 @@ void taskMainPidLoop(timeUs_t currentTimeUs) armTime = 0; // Delay saving for 0.5s to allow other functions to finish processing data to be stored on disarm - processDelayedSave((currentTimeUs - lastDisarmTimeUs > USECS_PER_SEC * 2));// / 2)); + processDelayedSave((currentTimeUs - lastDisarmTimeUs > USECS_PER_SEC));// / 2)); } if (armTime > 1 * USECS_PER_SEC) { // reset in flight emerg rearm flag 1 sec after arming once it's served its purpose diff --git a/src/main/fc/fc_core.h b/src/main/fc/fc_core.h index 573ae31bc4d..455e5b3849e 100644 --- a/src/main/fc/fc_core.h +++ b/src/main/fc/fc_core.h @@ -42,6 +42,7 @@ timeUs_t getLastDisarmTimeUs(void); void tryArm(void); disarmReason_t getDisarmReason(void); +uint16_t emergencyInFlightRearmTimeMS(void); bool emergencyArmingUpdate(bool armingSwitchIsOn, bool forceArm); bool emergInflightRearmEnabled(void); diff --git a/src/main/io/osd.c b/src/main/io/osd.c index ab8ecad32a7..0a7163b64da 100644 --- a/src/main/io/osd.c +++ b/src/main/io/osd.c @@ -28,6 +28,7 @@ #include #include #include +#include #include "platform.h" @@ -1968,28 +1969,29 @@ static bool osdDrawSingleElement(uint8_t item) case OSD_ODOMETER: { displayWriteChar(osdDisplayPort, elemPosX, elemPosY, SYM_ODOMETER); - uint32_t odometerDist = (uint32_t)(getTotalTravelDistance() / 100); + uint32_t odometerDist = (uint32_t)CENTIMETERS_TO_METERS(getTotalTravelDistance()); #ifdef USE_STATS odometerDist+= statsConfig()->stats_total_dist; #endif - odometerDist = odometerDist / 10; + + gvSet(1, odometerDist); switch (osdConfig()->units) { case OSD_UNIT_UK: FALLTHROUGH; case OSD_UNIT_IMPERIAL: - osdFormatCentiNumber(buff, CENTIMETERS_TO_CENTIFEET(odometerDist), FEET_PER_MILE, 1, 0, 6, true); + osdFormatCentiNumber(buff, METERS_TO_MILES(odometerDist), 1, 1, 1, 6, true); buff[6] = SYM_MI; break; default: case OSD_UNIT_GA: - osdFormatCentiNumber(buff, CENTIMETERS_TO_CENTIFEET(odometerDist), (uint32_t)FEET_PER_NAUTICALMILE, 1, 0, 6, true); + osdFormatCentiNumber(buff, METERS_TO_NAUTICALMILES(odometerDist), 1, 1, 1, 6, true); buff[6] = SYM_NM; break; case OSD_UNIT_METRIC_MPH: FALLTHROUGH; case OSD_UNIT_METRIC: - osdFormatCentiNumber(buff, odometerDist, METERS_PER_KILOMETER, 1, 0, 6, true); + osdFormatCentiNumber(buff, odometerDist, 1, 1, 1, 6, true); buff[6] = SYM_KM; break; } @@ -4563,6 +4565,17 @@ static void osdShowStats(bool isSinglePageStatsCompatible, uint8_t page) } } + char emReArmMsg[23]; + strcat(emReArmMsg, "** REARM PERIOD: "); + uint16_t rearmMs = emergencyInFlightRearmTimeMS(); + if (rearmMs == 0) + strcat(emReArmMsg, "OFF"); + else + tfp_sprintf(emReArmMsg + strlen(emReArmMsg), "%02d", (uint8_t)MS2S(rearmMs)); + + strcat(emReArmMsg, " **\0"); + displayWrite(osdDisplayPort, statNameX, top++, OSD_MESSAGE_STR(emReArmMsg)); + displayCommitTransaction(osdDisplayPort); } @@ -5297,6 +5310,19 @@ textAttributes_t osdGetSystemMessage(char *buff, size_t buff_size, bool isCenter } } + // TEMP for debug. Will be shown on disarm eventually + char emReArmMsg[23]; + strcat(emReArmMsg, "** REARM PERIOD: "); + uint16_t rearmMs = emergencyInFlightRearmTimeMS(); + if (rearmMs == 0) + strcat(emReArmMsg, "OFF"); + else + tfp_sprintf(emReArmMsg + strlen(emReArmMsg), "%02d", (uint8_t)MS2S(rearmMs)); + + strcat(emReArmMsg, " **\0"); + messages[messageCount++] = OSD_MESSAGE_STR(emReArmMsg); + // END Temp + if (messageCount > 0) { message = messages[OSD_ALTERNATING_CHOICES(systemMessageCycleTime(messageCount, messages), messageCount)]; if (message == failsafeInfoMessage) { From 5993e9cf9a2fccc7e6333604389104686f2324aa Mon Sep 17 00:00:00 2001 From: Darren Lines Date: Sun, 4 Feb 2024 11:45:58 +0000 Subject: [PATCH 04/10] Update, working but needs refinement - Added message for re-arm time. This is not the final solution. The final will only display when re-arm is available. The permanent message is for debugging. - Fixed odometer readout - Fixed stats screen refresh rate. The automatic page switching was blocking. --- src/main/common/maths.h | 5 +++-- src/main/io/osd.c | 31 ++++++++++++------------------- 2 files changed, 15 insertions(+), 21 deletions(-) diff --git a/src/main/common/maths.h b/src/main/common/maths.h index 88dc43f058e..9c7781472d4 100644 --- a/src/main/common/maths.h +++ b/src/main/common/maths.h @@ -61,8 +61,9 @@ #define CENTIMETERS_TO_METERS(cm) (cm / 100.0f) #define METERS_TO_CENTIMETERS(m) (m * 100) -#define METERS_TO_MILES(m) (m / 160934.4f) -#define METERS_TO_NAUTICALMILES(m) (m / 185200) +#define METERS_TO_KILOMETERS(m) (m / 1000.0f) +#define METERS_TO_MILES(m) (m / 1609.344f) +#define METERS_TO_NAUTICALMILES(m) (m / 1852.00f) #define CMSEC_TO_CENTIMPH(cms) (cms * 2.2369363f) #define CMSEC_TO_CENTIKPH(cms) (cms * 3.6f) diff --git a/src/main/io/osd.c b/src/main/io/osd.c index 0a7163b64da..f5d52bbb6de 100644 --- a/src/main/io/osd.c +++ b/src/main/io/osd.c @@ -1969,29 +1969,27 @@ static bool osdDrawSingleElement(uint8_t item) case OSD_ODOMETER: { displayWriteChar(osdDisplayPort, elemPosX, elemPosY, SYM_ODOMETER); - uint32_t odometerDist = (uint32_t)CENTIMETERS_TO_METERS(getTotalTravelDistance()); + float_t odometerDist = CENTIMETERS_TO_METERS(getTotalTravelDistance()); #ifdef USE_STATS odometerDist+= statsConfig()->stats_total_dist; #endif - gvSet(1, odometerDist); - switch (osdConfig()->units) { case OSD_UNIT_UK: FALLTHROUGH; case OSD_UNIT_IMPERIAL: - osdFormatCentiNumber(buff, METERS_TO_MILES(odometerDist), 1, 1, 1, 6, true); + osdFormatCentiNumber(buff, METERS_TO_MILES(odometerDist) * 100, 1, 1, 1, 6, true); buff[6] = SYM_MI; break; default: case OSD_UNIT_GA: - osdFormatCentiNumber(buff, METERS_TO_NAUTICALMILES(odometerDist), 1, 1, 1, 6, true); + osdFormatCentiNumber(buff, METERS_TO_NAUTICALMILES(odometerDist) * 100, 1, 1, 1, 6, true); buff[6] = SYM_NM; break; case OSD_UNIT_METRIC_MPH: FALLTHROUGH; case OSD_UNIT_METRIC: - osdFormatCentiNumber(buff, odometerDist, 1, 1, 1, 6, true); + osdFormatCentiNumber(buff, METERS_TO_KILOMETERS(odometerDist) * 100, 1, 1, 1, 6, true); buff[6] = SYM_KM; break; } @@ -4566,7 +4564,7 @@ static void osdShowStats(bool isSinglePageStatsCompatible, uint8_t page) } char emReArmMsg[23]; - strcat(emReArmMsg, "** REARM PERIOD: "); + tfp_sprintf(emReArmMsg, "** REARM PERIOD: "); uint16_t rearmMs = emergencyInFlightRearmTimeMS(); if (rearmMs == 0) strcat(emReArmMsg, "OFF"); @@ -4937,26 +4935,21 @@ static void osdRefresh(timeUs_t currentTimeUs) // Alternate screens for multi-page stats. // Also, refreshes screen at swap interval for single-page stats. if (OSD_ALTERNATING_CHOICES((osdConfig()->stats_page_auto_swap_time * 1000), 2)) { - if (statsCurrentPage == 0) { - osdShowStats(statsSinglePageCompatible, statsCurrentPage); + if (statsCurrentPage == 0) statsCurrentPage = 1; - } } else { - if (statsCurrentPage == 1) { - osdShowStats(statsSinglePageCompatible, statsCurrentPage); + if (statsCurrentPage == 1) statsCurrentPage = 0; - } } } else { // Process manual page change events for multi-page stats. - if (manualPageUpRequested) { - osdShowStats(statsSinglePageCompatible, 1); + if (manualPageUpRequested) statsCurrentPage = 1; - } else if (manualPageDownRequested) { - osdShowStats(statsSinglePageCompatible, 0); + else if (manualPageDownRequested) statsCurrentPage = 0; - } } + + osdShowStats(statsSinglePageCompatible, statsCurrentPage); } // Handle events when either "Splash", "Armed" or "Stats" screens are displayed. @@ -5312,7 +5305,7 @@ textAttributes_t osdGetSystemMessage(char *buff, size_t buff_size, bool isCenter // TEMP for debug. Will be shown on disarm eventually char emReArmMsg[23]; - strcat(emReArmMsg, "** REARM PERIOD: "); + tfp_sprintf(emReArmMsg, "** REARM PERIOD: "); uint16_t rearmMs = emergencyInFlightRearmTimeMS(); if (rearmMs == 0) strcat(emReArmMsg, "OFF"); From 74cf9a0a4e94381f1cd433393b5158ac95530863 Mon Sep 17 00:00:00 2001 From: Darren Lines Date: Sun, 4 Feb 2024 14:14:31 +0000 Subject: [PATCH 05/10] Tested in HITL. Looks good to me --- src/main/fc/fc_core.c | 8 +++++-- src/main/fc/rc_controls.c | 3 +-- src/main/io/osd.c | 36 ++++++++++++++------------------ src/main/navigation/navigation.c | 6 ++---- 4 files changed, 25 insertions(+), 28 deletions(-) diff --git a/src/main/fc/fc_core.c b/src/main/fc/fc_core.c index 88d8bf2a525..8f9a256b001 100644 --- a/src/main/fc/fc_core.c +++ b/src/main/fc/fc_core.c @@ -511,8 +511,12 @@ bool emergencyArmingUpdate(bool armingSwitchIsOn, bool forceArm) uint16_t emergencyInFlightRearmTimeMS(void) { - timeMs_t currentTimeMs = millis(); - uint16_t rearmMS = (uint16_t)((US2MS(lastDisarmTimeUs) + EMERGENCY_INFLIGHT_REARM_TIME_WINDOW_MS) - currentTimeMs); + uint16_t rearmMS = 0; + + if (STATE(IN_FLIGHT_EMERG_REARM)) { + timeMs_t currentTimeMs = millis(); + rearmMS = (uint16_t)((US2MS(lastDisarmTimeUs) + EMERGENCY_INFLIGHT_REARM_TIME_WINDOW_MS) - currentTimeMs); + } return rearmMS; } diff --git a/src/main/fc/rc_controls.c b/src/main/fc/rc_controls.c index 9cce60a2a38..f09a2e5a4a4 100644 --- a/src/main/fc/rc_controls.c +++ b/src/main/fc/rc_controls.c @@ -219,8 +219,7 @@ void processRcStickPositions(bool isThrottleLow) tryArm(); return; } - } - else { + } else { if (armingSwitchIsActive) { rcDisarmTimeMs = currentTimeMs; tryArm(); diff --git a/src/main/io/osd.c b/src/main/io/osd.c index f5d52bbb6de..5648a34518e 100644 --- a/src/main/io/osd.c +++ b/src/main/io/osd.c @@ -4563,16 +4563,16 @@ static void osdShowStats(bool isSinglePageStatsCompatible, uint8_t page) } } - char emReArmMsg[23]; - tfp_sprintf(emReArmMsg, "** REARM PERIOD: "); - uint16_t rearmMs = emergencyInFlightRearmTimeMS(); - if (rearmMs == 0) - strcat(emReArmMsg, "OFF"); - else - tfp_sprintf(emReArmMsg + strlen(emReArmMsg), "%02d", (uint8_t)MS2S(rearmMs)); - - strcat(emReArmMsg, " **\0"); - displayWrite(osdDisplayPort, statNameX, top++, OSD_MESSAGE_STR(emReArmMsg)); + if (emergInflightRearmEnabled()) { + uint16_t rearmMs = emergencyInFlightRearmTimeMS(); + if (rearmMs > 0) { + char emReArmMsg[23]; + tfp_sprintf(emReArmMsg, "** REARM PERIOD: "); + tfp_sprintf(emReArmMsg + strlen(emReArmMsg), "%02d", (uint8_t)MS2S(rearmMs)); + strcat(emReArmMsg, " **\0"); + displayWrite(osdDisplayPort, statNameX, top++, OSD_MESSAGE_STR(emReArmMsg)); + } + } displayCommitTransaction(osdDisplayPort); } @@ -5303,18 +5303,14 @@ textAttributes_t osdGetSystemMessage(char *buff, size_t buff_size, bool isCenter } } - // TEMP for debug. Will be shown on disarm eventually - char emReArmMsg[23]; - tfp_sprintf(emReArmMsg, "** REARM PERIOD: "); uint16_t rearmMs = emergencyInFlightRearmTimeMS(); - if (rearmMs == 0) - strcat(emReArmMsg, "OFF"); - else + if (rearmMs > 0) { + char emReArmMsg[23]; + tfp_sprintf(emReArmMsg, "** REARM PERIOD: "); tfp_sprintf(emReArmMsg + strlen(emReArmMsg), "%02d", (uint8_t)MS2S(rearmMs)); - - strcat(emReArmMsg, " **\0"); - messages[messageCount++] = OSD_MESSAGE_STR(emReArmMsg); - // END Temp + strcat(emReArmMsg, " **\0"); + messages[messageCount++] = OSD_MESSAGE_STR(emReArmMsg); + } if (messageCount > 0) { message = messages[OSD_ALTERNATING_CHOICES(systemMessageCycleTime(messageCount, messages), messageCount)]; diff --git a/src/main/navigation/navigation.c b/src/main/navigation/navigation.c index 8e210aa533e..e162fba0ec4 100644 --- a/src/main/navigation/navigation.c +++ b/src/main/navigation/navigation.c @@ -2709,8 +2709,7 @@ void updateHomePosition(void) break; } } - } - else { + } else { static bool isHomeResetAllowed = false; // If pilot so desires he may reset home position to current position if (IS_RC_MODE_ACTIVE(BOXHOMERESET)) { @@ -2720,8 +2719,7 @@ void updateHomePosition(void) setHome = true; isHomeResetAllowed = false; } - } - else { + } else { isHomeResetAllowed = true; } From 35de18b7b3a98600073b235f466c1ec4aff3e5a8 Mon Sep 17 00:00:00 2001 From: Darren Lines Date: Mon, 5 Feb 2024 08:38:17 +0000 Subject: [PATCH 06/10] Only refresh stats screen every 250ms --- src/main/io/osd.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/main/io/osd.c b/src/main/io/osd.c index 5648a34518e..4f5b8e338be 100644 --- a/src/main/io/osd.c +++ b/src/main/io/osd.c @@ -4865,9 +4865,10 @@ static void osdRefresh(timeUs_t currentTimeUs) } bool statsSinglePageCompatible = (osdDisplayPort->rows >= OSD_STATS_SINGLE_PAGE_MIN_ROWS); - static uint8_t statsCurrentPage = 0; - static bool statsDisplayed = false; - static bool statsAutoPagingEnabled = true; + static uint8_t statsCurrentPage = 0; + static timeMs_t statsRefreshTime = 0; + static bool statsDisplayed = false; + static bool statsAutoPagingEnabled = true; // Detect arm/disarm if (armState != ARMING_FLAG(ARMED)) { @@ -4949,7 +4950,11 @@ static void osdRefresh(timeUs_t currentTimeUs) statsCurrentPage = 0; } - osdShowStats(statsSinglePageCompatible, statsCurrentPage); + // Only refresh the stats every 1/4 of a second. + if (statsRefreshTime <= millis()) { + statsRefreshTime = millis() + 250; + osdShowStats(statsSinglePageCompatible, statsCurrentPage); + } } // Handle events when either "Splash", "Armed" or "Stats" screens are displayed. From 04f73275d5de6c07799e24c313e280d86ded0fc3 Mon Sep 17 00:00:00 2001 From: Darren Lines Date: Thu, 8 Feb 2024 20:18:19 +0000 Subject: [PATCH 07/10] Increase stats redraw delay to 500ms --- src/main/io/osd.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/io/osd.c b/src/main/io/osd.c index 4f5b8e338be..2553328db23 100644 --- a/src/main/io/osd.c +++ b/src/main/io/osd.c @@ -4950,9 +4950,9 @@ static void osdRefresh(timeUs_t currentTimeUs) statsCurrentPage = 0; } - // Only refresh the stats every 1/4 of a second. + // Only refresh the stats every 1/2 a second. if (statsRefreshTime <= millis()) { - statsRefreshTime = millis() + 250; + statsRefreshTime = millis() + 500; osdShowStats(statsSinglePageCompatible, statsCurrentPage); } } From 5dae29a3802f75dedd59d66bc6826a94f838e606 Mon Sep 17 00:00:00 2001 From: Darren Lines Date: Fri, 9 Feb 2024 12:33:27 +0000 Subject: [PATCH 08/10] Update MSP arm when rearm allowed Stop MSP VTX from entering low power mode in emergency rearm. --- src/main/fc/fc_msp.c | 13 +++++++++++++ src/main/io/osd.c | 4 ++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/main/fc/fc_msp.c b/src/main/fc/fc_msp.c index 952f13dddb0..dd9f9ea35c6 100644 --- a/src/main/fc/fc_msp.c +++ b/src/main/fc/fc_msp.c @@ -440,9 +440,22 @@ static bool mspFcProcessOutCommand(uint16_t cmdMSP, sbuf_t *dst, mspPostProcessF sbufWriteU8(dst, getConfigProfile()); if (cmdMSP == MSP_STATUS_EX) { +#if defined(USE_OSD) && defined(USE_MSP_OSD) + bool armingBit = bitArrayGet(mspBoxModeFlags.bits, BOXARM); + // If we are in emergency re-arm period and using MSP DisplayPort OSD, show that we are still Armed to prevent the VTX entering low power mode + if (feature(FEATURE_OSD) && emergInflightRearmEnabled()) + bitArraySet(mspBoxModeFlags.bits, BOXARM); +#endif sbufWriteU16(dst, averageSystemLoadPercent); sbufWriteU16(dst, armingFlags); sbufWriteU8(dst, accGetCalibrationAxisFlags()); + +#if defined(USE_OSD) && defined(USE_MSP_OSD) + if (armingBit) + bitArraySet(mspBoxModeFlags.bits, BOXARM); + else + bitArrayClr(mspBoxModeFlags.bits, BOXARM); +#endif } } break; diff --git a/src/main/io/osd.c b/src/main/io/osd.c index 2553328db23..4f5b8e338be 100644 --- a/src/main/io/osd.c +++ b/src/main/io/osd.c @@ -4950,9 +4950,9 @@ static void osdRefresh(timeUs_t currentTimeUs) statsCurrentPage = 0; } - // Only refresh the stats every 1/2 a second. + // Only refresh the stats every 1/4 of a second. if (statsRefreshTime <= millis()) { - statsRefreshTime = millis() + 500; + statsRefreshTime = millis() + 250; osdShowStats(statsSinglePageCompatible, statsCurrentPage); } } From c2b5d2e7fb0235e8505f35d556ca71d94532464b Mon Sep 17 00:00:00 2001 From: Darren Lines Date: Sun, 11 Feb 2024 10:00:05 +0000 Subject: [PATCH 09/10] Merged changes from #9681 --- src/main/cms/cms.c | 2 +- src/main/fc/config.c | 5 +++-- src/main/fc/config.h | 2 +- src/main/fc/fc_core.c | 8 ++++++-- src/main/fc/fc_core.h | 1 + src/main/io/osd.c | 28 +++++++++++++++++++++------- src/main/io/osd.h | 3 +++ 7 files changed, 36 insertions(+), 13 deletions(-) diff --git a/src/main/cms/cms.c b/src/main/cms/cms.c index a32ab0af886..f2f66476e4d 100644 --- a/src/main/cms/cms.c +++ b/src/main/cms/cms.c @@ -902,7 +902,7 @@ long cmsMenuExit(displayPort_t *pDisplay, const void *ptr) setServoOutputEnabled(true); if ((exitType == CMS_EXIT_SAVEREBOOT) || (exitType == CMS_POPUP_SAVEREBOOT)) { - processDelayedSave(); + processDelayedSave(true); displayClearScreen(pDisplay); displayWrite(pDisplay, 5, 3, "REBOOTING..."); diff --git a/src/main/fc/config.c b/src/main/fc/config.c index 2f5dbfa5b4a..b2cd173b5f5 100755 --- a/src/main/fc/config.c +++ b/src/main/fc/config.c @@ -68,6 +68,7 @@ #include "fc/config.h" #include "fc/controlrate_profile.h" +#include "fc/fc_core.h" #include "fc/rc_adjustments.h" #include "fc/rc_controls.h" #include "fc/rc_curves.h" @@ -393,7 +394,7 @@ void saveConfig(void) } } -void processDelayedSave(void) +void processDelayedSave(bool readyToSave) { if (saveState == SAVESTATE_SAVEANDNOTIFY) { if (emergInflightRearmEnabled() || !readyToSave) { @@ -410,7 +411,7 @@ void processDelayedSave(void) saveState = SAVESTATE_NONE; } } - } else if (saveState == SAVESTATE_SAVEONLY) { + } else if (saveState == SAVESTATE_SAVEONLY && readyToSave) { suspendRxSignal(); writeEEPROM(); resumeRxSignal(); diff --git a/src/main/fc/config.h b/src/main/fc/config.h index bafa5c0cbe0..00ffe36e044 100644 --- a/src/main/fc/config.h +++ b/src/main/fc/config.h @@ -124,7 +124,7 @@ void resetEEPROM(void); void readEEPROM(void); void writeEEPROM(void); void ensureEEPROMContainsValidData(void); -void processDelayedSave(void); +void processDelayedSave(bool readyToSave); void saveConfig(void); void saveConfigAndNotify(void); diff --git a/src/main/fc/fc_core.c b/src/main/fc/fc_core.c index 3a871f4058d..34272547583 100644 --- a/src/main/fc/fc_core.c +++ b/src/main/fc/fc_core.c @@ -65,6 +65,7 @@ #include "io/beeper.h" #include "io/dashboard.h" #include "io/gps.h" +#include "io/osd.h" #include "io/serial.h" #include "io/statusindicator.h" #include "io/asyncfatfs/asyncfatfs.h" @@ -898,7 +899,6 @@ static void applyThrottleTiltCompensation(void) void taskMainPidLoop(timeUs_t currentTimeUs) { - cycleTime = getTaskDeltaTime(TASK_SELF); dT = (float)cycleTime * 0.000001f; @@ -912,10 +912,14 @@ void taskMainPidLoop(timeUs_t currentTimeUs) armTime = 0; // Delay saving for 0.5s to allow other functions to finish processing data to be stored on disarm - processDelayedSave((currentTimeUs - lastDisarmTimeUs > USECS_PER_SEC));// / 2)); + processDelayedSave((currentTimeUs - lastDisarmTimeUs > USECS_PER_SEC)); } if (armTime > 1 * USECS_PER_SEC) { // reset in flight emerg rearm flag 1 sec after arming once it's served its purpose +#ifdef USE_OSD + if (STATE(IN_FLIGHT_EMERG_REARM)) + osdSaveProcessAborted(); +#endif DISABLE_STATE(IN_FLIGHT_EMERG_REARM); } diff --git a/src/main/fc/fc_core.h b/src/main/fc/fc_core.h index 5dcb366f3dd..455e5b3849e 100644 --- a/src/main/fc/fc_core.h +++ b/src/main/fc/fc_core.h @@ -44,6 +44,7 @@ disarmReason_t getDisarmReason(void); uint16_t emergencyInFlightRearmTimeMS(void); bool emergencyArmingUpdate(bool armingSwitchIsOn, bool forceArm); +bool emergInflightRearmEnabled(void); bool areSensorsCalibrating(void); float getFlightTime(void); diff --git a/src/main/io/osd.c b/src/main/io/osd.c index 330ae252c17..4f5b8e338be 100644 --- a/src/main/io/osd.c +++ b/src/main/io/osd.c @@ -156,8 +156,16 @@ #define OSD_MIN_FONT_VERSION 3 static timeMs_t linearDescentMessageMs = 0; + +typedef enum { + OSD_SAVE_MESSAGE_NONE, + OSD_SAVE_MESSAGE_WAITING, + OSD_SAVE_MESSAGE_SAVING, + OSD_SAVE_MESSAGE_SAVED +} osd_saveMessage_e; + static timeMs_t notify_settings_saved = 0; -static bool savingSettings = false; +static uint8_t savingSettings = OSD_SAVE_MESSAGE_NONE; static unsigned currentLayout = 0; static int layoutOverride = -1; @@ -224,11 +232,11 @@ void osdSaveWaitingProcess(void) { } void osdStartedSaveProcess(void) { - savingSettings = true; + savingSettings = OSD_SAVE_MESSAGE_SAVING; } void osdShowEEPROMSavedNotification(void) { - savingSettings = false; + savingSettings = OSD_SAVE_MESSAGE_SAVED; notify_settings_saved = millis() + 5000; } @@ -4542,12 +4550,15 @@ static void osdShowStats(bool isSinglePageStatsCompatible, uint8_t page) displayWrite(osdDisplayPort, statValuesX + multiValueLengthOffset, top++, buff); } - if (savingSettings == true) { + if (savingSettings == OSD_SAVE_MESSAGE_SAVING) { displayWrite(osdDisplayPort, statNameX, top++, OSD_MESSAGE_STR(OSD_MSG_SAVING_SETTNGS)); + } else if (savingSettings == OSD_SAVE_MESSAGE_WAITING) { + displayWrite(osdDisplayPort, statNameX, top++, OSD_MESSAGE_STR(OSD_MSG_WAITING_TO_SAVE)); } else if (notify_settings_saved > 0) { if (millis() > notify_settings_saved) { notify_settings_saved = 0; - } else { + savingSettings = OSD_SAVE_MESSAGE_NONE; + } else if (savingSettings == OSD_SAVE_MESSAGE_SAVED) { displayWrite(osdDisplayPort, statNameX, top++, OSD_MESSAGE_STR(OSD_MSG_SETTINGS_SAVED)); } } @@ -5284,12 +5295,15 @@ textAttributes_t osdGetSystemMessage(char *buff, size_t buff_size, bool isCenter /* Messages that are shown regardless of Arming state */ - if (savingSettings == true) { + if (savingSettings == OSD_SAVE_MESSAGE_SAVING) { messages[messageCount++] = OSD_MESSAGE_STR(OSD_MSG_SAVING_SETTNGS); + } else if (savingSettings == OSD_SAVE_MESSAGE_WAITING) { + messages[messageCount++] = OSD_MESSAGE_STR(OSD_MSG_WAITING_TO_SAVE); } else if (notify_settings_saved > 0) { if (millis() > notify_settings_saved) { notify_settings_saved = 0; - } else { + savingSettings = OSD_SAVE_MESSAGE_NONE; + } else if (savingSettings == OSD_SAVE_MESSAGE_SAVED) { messages[messageCount++] = OSD_MESSAGE_STR(OSD_MSG_SETTINGS_SAVED); } } diff --git a/src/main/io/osd.h b/src/main/io/osd.h index 5bcf6d34740..5f444ad4543 100644 --- a/src/main/io/osd.h +++ b/src/main/io/osd.h @@ -119,6 +119,7 @@ #define OSD_MSG_UNABLE_ARM "UNABLE TO ARM" #define OSD_MSG_SAVING_SETTNGS "** SAVING SETTINGS **" #define OSD_MSG_SETTINGS_SAVED "** SETTINGS SAVED **" +#define OSD_MSG_WAITING_TO_SAVE "** WAITING TO SAVE **" #define OSD_MSG_ANGLEHOLD_ROLL "(ANGLEHOLD ROLL)" #define OSD_MSG_ANGLEHOLD_PITCH "(ANGLEHOLD PITCH)" #define OSD_MSG_ANGLEHOLD_LEVEL "(ANGLEHOLD LEVEL)" @@ -486,6 +487,8 @@ int32_t osdGetAltitude(void); bool osdUsingScaledThrottle(void); +void osdSaveProcessAborted(void); +void osdSaveWaitingProcess(void); void osdStartedSaveProcess(void); void osdShowEEPROMSavedNotification(void); From 478bb199c64019aaed63c03d86a1e08c7acb6edb Mon Sep 17 00:00:00 2001 From: Darren Lines Date: Mon, 1 Apr 2024 13:11:08 +0100 Subject: [PATCH 10/10] Merge from master --- src/main/io/osd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/io/osd.c b/src/main/io/osd.c index bd949a30820..69b3ca336df 100644 --- a/src/main/io/osd.c +++ b/src/main/io/osd.c @@ -5124,7 +5124,7 @@ static void osdShowStats(bool isSinglePageStatsCompatible, uint8_t page) tfp_sprintf(emReArmMsg, "** REARM PERIOD: "); tfp_sprintf(emReArmMsg + strlen(emReArmMsg), "%02d", (uint8_t)MS2S(rearmMs)); strcat(emReArmMsg, " **\0"); - displayWrite(osdDisplayPort, statNameX, top++, OSD_MESSAGE_STR(emReArmMsg)); + displayWrite(osdDisplayPort, statNameX, row++, OSD_MESSAGE_STR(emReArmMsg)); } }