From 9e5ce9af515dafb90890b372fb09677682c819e0 Mon Sep 17 00:00:00 2001 From: Mr D - RC Date: Thu, 25 Dec 2025 12:24:24 +0000 Subject: [PATCH 1/3] Allow for quicker updates of OSD element data This allows *X* elements to be updated per OSD cycle. From 1 element (current behaviour) to 15 elements. This should allow for plenty of data update speed without causing unnecessary delays or overheads. This defaults to 5, which should be a good value for most OSDs. - It maintains the protections for end of loop and no elements enabled - Will exit automatically if there are less elements to draw than set to be drawn per cycle. - A check has been added to see if the AHI is enabled before drawing it --- docs/Settings.md | 10 ++++++++++ src/main/fc/settings.yaml | 6 ++++++ src/main/io/osd.c | 23 ++++++++++++++++------- src/main/io/osd.h | 1 + 4 files changed, 33 insertions(+), 7 deletions(-) diff --git a/docs/Settings.md b/docs/Settings.md index b886f6702ac..53dea5cef1e 100644 --- a/docs/Settings.md +++ b/docs/Settings.md @@ -4772,6 +4772,16 @@ Value above which to make the OSD distance from home indicator blink (meters) --- +### osd_elements_updated_per_cycle + +Number of OSD elements to update per OSD cycle. Increase this value to reduce the time it takes to update all OSD elements, at the cost of higher CPU usage. Decrease this value to reduce CPU usage, at the cost of slower OSD element updates. + +| Default | Min | Max | +| --- | --- | --- | +| 5 | 1 | 15 | + +--- + ### osd_esc_rpm_precision Number of characters used to display the RPM value. diff --git a/src/main/fc/settings.yaml b/src/main/fc/settings.yaml index 01ca6149bfb..b9828675ebc 100644 --- a/src/main/fc/settings.yaml +++ b/src/main/fc/settings.yaml @@ -3329,6 +3329,12 @@ groups: max: 600 type: int16_t field: msp_displayport_fullframe_interval + - name: osd_elements_updated_per_cycle + description: "Number of OSD elements to update per OSD cycle. Increase this value to reduce the time it takes to update all OSD elements, at the cost of higher CPU usage. Decrease this value to reduce CPU usage, at the cost of slower OSD element updates." + default_value: 5 + field: elements_updated_per_cycle + min: 1 + max: 15 - name: osd_units description: "IMPERIAL, METRIC, UK" default_value: "METRIC" diff --git a/src/main/io/osd.c b/src/main/io/osd.c index c7a40e982cc..3adfcc48699 100644 --- a/src/main/io/osd.c +++ b/src/main/io/osd.c @@ -4242,18 +4242,26 @@ uint8_t osdIncElementIndex(uint8_t elementIndex) return elementIndex; } -void osdDrawNextElement(void) +void osdDrawNextElements(void) { static uint8_t elementIndex = 0; - // Flag for end of loop, also prevents infinite loop when no elements are enabled uint8_t index = elementIndex; - do { + + for (uint8_t i = 1; i <= osdConfig()->elements_updated_per_cycle; ++i) { elementIndex = osdIncElementIndex(elementIndex); - } while (!osdDrawSingleElement(elementIndex) && index != elementIndex); + + // Flag for end of loop, also prevents infinite loop when no elements are enabled + if (!osdDrawSingleElement(elementIndex) && index == elementIndex) { + break; + } + } // Draw artificial horizon + tracking telemetry last - osdDrawSingleElement(OSD_ARTIFICIAL_HORIZON); - if (osdConfig()->telemetry>0){ + if (osdElementEnabled(OSD_ARTIFICIAL_HORIZON, true)) { + osdDrawSingleElement(OSD_ARTIFICIAL_HORIZON); + } + + if (osdConfig()->telemetry > 0){ osdDisplayTelemetry(); } } @@ -4304,6 +4312,7 @@ PG_RESET_TEMPLATE(osdConfig_t, osdConfig, .video_system = SETTING_OSD_VIDEO_SYSTEM_DEFAULT, .row_shiftdown = SETTING_OSD_ROW_SHIFTDOWN_DEFAULT, .msp_displayport_fullframe_interval = SETTING_OSD_MSP_DISPLAYPORT_FULLFRAME_INTERVAL_DEFAULT, + .elements_updated_per_cycle = SETTING_OSD_ELEMENTS_UPDATED_PER_CYCLE_DEFAULT, .ahi_reverse_roll = SETTING_OSD_AHI_REVERSE_ROLL_DEFAULT, .ahi_max_pitch = SETTING_OSD_AHI_MAX_PITCH_DEFAULT, @@ -5976,7 +5985,7 @@ static void osdRefresh(timeUs_t currentTimeUs) displayClearScreen(osdDisplayPort); fullRedraw = false; } - osdDrawNextElement(); + osdDrawNextElements(); displayHeartbeat(osdDisplayPort); displayCommitTransaction(osdDisplayPort); #ifdef OSD_CALLS_CMS diff --git a/src/main/io/osd.h b/src/main/io/osd.h index bbaa68f862d..15d388b63a6 100644 --- a/src/main/io/osd.h +++ b/src/main/io/osd.h @@ -451,6 +451,7 @@ typedef struct osdConfig_s { videoSystem_e video_system; uint8_t row_shiftdown; int16_t msp_displayport_fullframe_interval; + uint8_t elements_updated_per_cycle; // Preferences uint8_t main_voltage_decimals; From 83a3e3832de71f584a340b0ac30ec4adf859b4bb Mon Sep 17 00:00:00 2001 From: Mr D - RC Date: Thu, 25 Dec 2025 12:56:43 +0000 Subject: [PATCH 2/3] Updated the logic --- src/main/io/osd.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/main/io/osd.c b/src/main/io/osd.c index 3adfcc48699..84ee5ed6a5d 100644 --- a/src/main/io/osd.c +++ b/src/main/io/osd.c @@ -4245,13 +4245,15 @@ uint8_t osdIncElementIndex(uint8_t elementIndex) void osdDrawNextElements(void) { static uint8_t elementIndex = 0; - uint8_t index = elementIndex; - for (uint8_t i = 1; i <= osdConfig()->elements_updated_per_cycle; ++i) { - elementIndex = osdIncElementIndex(elementIndex); - + for (uint8_t i = 1; i <= osdConfig()->elements_updated_per_cycle; i++) { // Flag for end of loop, also prevents infinite loop when no elements are enabled - if (!osdDrawSingleElement(elementIndex) && index == elementIndex) { + uint8_t index = elementIndex; + do { + elementIndex = osdIncElementIndex(elementIndex); + } while (!osdDrawSingleElement(elementIndex) && index != elementIndex); + + if (index == elementIndex || elementIndex == 0) { break; } } From 0a9ea28674c25a766ce4065653cdec788a88e13d Mon Sep 17 00:00:00 2001 From: Mr D - RC Date: Fri, 26 Dec 2025 12:06:14 +0000 Subject: [PATCH 3/3] Reduced max to 10. As that should be plenty fast enough. --- docs/Settings.md | 2 +- src/main/fc/settings.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/Settings.md b/docs/Settings.md index 53dea5cef1e..76b82df69ae 100644 --- a/docs/Settings.md +++ b/docs/Settings.md @@ -4778,7 +4778,7 @@ Number of OSD elements to update per OSD cycle. Increase this value to reduce th | Default | Min | Max | | --- | --- | --- | -| 5 | 1 | 15 | +| 5 | 1 | 10 | --- diff --git a/src/main/fc/settings.yaml b/src/main/fc/settings.yaml index b9828675ebc..2aaa51f6ed4 100644 --- a/src/main/fc/settings.yaml +++ b/src/main/fc/settings.yaml @@ -3334,7 +3334,7 @@ groups: default_value: 5 field: elements_updated_per_cycle min: 1 - max: 15 + max: 10 - name: osd_units description: "IMPERIAL, METRIC, UK" default_value: "METRIC"