From e852b74fbdac0f4a035f43c9cdb697e3f4fa9d19 Mon Sep 17 00:00:00 2001 From: Darren Lines Date: Tue, 5 Mar 2024 12:30:50 +0000 Subject: [PATCH 1/2] Show a timeout for in flight rearming If possible, this will show a countdown time for how long the pilot has to rearm in flight. This was a part of #9688, which wasn't working as expected. This part should work, and give the pilots useful information. Currently not tested. Will test in HITL, then in flight asap. --- src/main/fc/fc_core.c | 16 ++++++++++++-- src/main/fc/fc_core.h | 2 ++ src/main/io/osd.c | 49 ++++++++++++++++++++++++++++++------------- 3 files changed, 51 insertions(+), 16 deletions(-) diff --git a/src/main/fc/fc_core.c b/src/main/fc/fc_core.c index 0d0863760d..c51519927b 100644 --- a/src/main/fc/fc_core.c +++ b/src/main/fc/fc_core.c @@ -507,6 +507,18 @@ bool emergencyArmingUpdate(bool armingSwitchIsOn, bool forceArm) return counter >= EMERGENCY_ARMING_MIN_ARM_COUNT; } +uint16_t emergencyInFlightRearmTimeMS(void) +{ + 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; +} + bool emergInflightRearmEnabled(void) { /* Emergency rearm allowed within 5s timeout period after disarm if craft still flying */ @@ -880,7 +892,6 @@ static void applyThrottleTiltCompensation(void) void taskMainPidLoop(timeUs_t currentTimeUs) { - cycleTime = getTaskDeltaTime(TASK_SELF); dT = (float)cycleTime * 0.000001f; @@ -899,7 +910,8 @@ void taskMainPidLoop(timeUs_t currentTimeUs) } } - if (armTime > 1 * USECS_PER_SEC) { // reset in flight emerg rearm flag 1 sec after arming once it's served its purpose + if (armTime > 1 * USECS_PER_SEC) { + // reset in flight emerg rearm flag 1 sec after arming once it's served its purpose DISABLE_STATE(IN_FLIGHT_EMERG_REARM); } diff --git a/src/main/fc/fc_core.h b/src/main/fc/fc_core.h index c66a0050ba..455e5b3849 100644 --- a/src/main/fc/fc_core.h +++ b/src/main/fc/fc_core.h @@ -42,7 +42,9 @@ timeUs_t getLastDisarmTimeUs(void); void tryArm(void); 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 7e67faef01..0fccaffc5e 100644 --- a/src/main/io/osd.c +++ b/src/main/io/osd.c @@ -28,6 +28,7 @@ #include #include #include +#include #include "platform.h" @@ -4560,6 +4561,17 @@ static void osdShowStats(bool isSinglePageStatsCompatible, uint8_t page) displayWrite(osdDisplayPort, statValuesX + multiValueLengthOffset, top++, buff); } + 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)); + } + } + if (savingSettings == true) { displayWrite(osdDisplayPort, statNameX, top++, OSD_MESSAGE_STR(OSD_MSG_SAVING_SETTNGS)); } else if (notify_settings_saved > 0) { @@ -4861,9 +4873,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)) { @@ -4931,25 +4944,24 @@ 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; - } + } + + // Only refresh the stats every 1/4 of a second. + if (statsRefreshTime <= millis()) { + statsRefreshTime = millis() + 250; + osdShowStats(statsSinglePageCompatible, statsCurrentPage); } } @@ -5317,6 +5329,15 @@ textAttributes_t osdGetSystemMessage(char *buff, size_t buff_size, bool isCenter } } + 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"); + messages[messageCount++] = OSD_MESSAGE_STR(emReArmMsg); + } + if (messageCount > 0) { message = messages[OSD_ALTERNATING_CHOICES(systemMessageCycleTime(messageCount, messages), messageCount)]; if (message == failsafeInfoMessage) { From 792983868ffb349c85f0e54084c25ce08874ca49 Mon Sep 17 00:00:00 2001 From: Darren Lines Date: Wed, 6 Mar 2024 07:33:52 +0000 Subject: [PATCH 2/2] Only show rearm message when not saving If the save is happening, writing to EEPROM locks up the FC. This change will only show the rearm message if the FC is not currently saving. If rearm is available, the `** SETTINGS SAVED**` message will not appear, to maximise time for rearm. If rearm is not available. The save messages display as normal. --- src/main/io/osd.c | 32 ++++++++++++++------------------ 1 file changed, 14 insertions(+), 18 deletions(-) diff --git a/src/main/io/osd.c b/src/main/io/osd.c index 0fccaffc5e..d8214474bf 100644 --- a/src/main/io/osd.c +++ b/src/main/io/osd.c @@ -4561,19 +4561,16 @@ static void osdShowStats(bool isSinglePageStatsCompatible, uint8_t page) displayWrite(osdDisplayPort, statValuesX + multiValueLengthOffset, top++, buff); } - 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)); - } - } + uint16_t rearmMs = (emergInflightRearmEnabled()) ? emergencyInFlightRearmTimeMS() : 0; if (savingSettings == true) { displayWrite(osdDisplayPort, statNameX, top++, OSD_MESSAGE_STR(OSD_MSG_SAVING_SETTNGS)); + } else if (rearmMs > 0) { // Show rearming time if settings not actively being saved. Ignore the settings saved message if rearm available. + 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)); } else if (notify_settings_saved > 0) { if (millis() > notify_settings_saved) { notify_settings_saved = 0; @@ -5318,9 +5315,16 @@ textAttributes_t osdGetSystemMessage(char *buff, size_t buff_size, bool isCenter } /* Messages that are shown regardless of Arming state */ + uint16_t rearmMs = (emergInflightRearmEnabled()) ? emergencyInFlightRearmTimeMS() : 0; if (savingSettings == true) { messages[messageCount++] = OSD_MESSAGE_STR(OSD_MSG_SAVING_SETTNGS); + } else if (rearmMs > 0) { // Show rearming time if settings not actively being saved. Ignore the settings saved message if rearm available. + 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); } else if (notify_settings_saved > 0) { if (millis() > notify_settings_saved) { notify_settings_saved = 0; @@ -5329,14 +5333,6 @@ textAttributes_t osdGetSystemMessage(char *buff, size_t buff_size, bool isCenter } } - 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"); - messages[messageCount++] = OSD_MESSAGE_STR(emReArmMsg); - } if (messageCount > 0) { message = messages[OSD_ALTERNATING_CHOICES(systemMessageCycleTime(messageCount, messages), messageCount)];