Skip to content

Commit 98b3377

Browse files
committed
Add configurable OSD element refresh rate
1 parent 368bd37 commit 98b3377

File tree

3 files changed

+41
-1
lines changed

3 files changed

+41
-1
lines changed

src/main/fc/settings.yaml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3278,6 +3278,13 @@ groups:
32783278
max: 600
32793279
type: int16_t
32803280
field: msp_displayport_fullframe_interval
3281+
- name: osd_framerate_hz
3282+
description: "OSD element refresh rate in Hz. Controls how often OSD elements are updated (except artificial horizon and telemetry which are always updated). Higher values provide smoother updates but increase CPU load. Set to -1 for legacy mode (one element per frame). Default: -1"
3283+
default_value: -1
3284+
min: -1
3285+
max: 60
3286+
type: int8_t
3287+
field: osd_framerate_hz
32813288
- name: osd_units
32823289
description: "IMPERIAL, METRIC, UK"
32833290
default_value: "METRIC"

src/main/io/osd.c

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4069,6 +4069,18 @@ uint8_t osdIncElementIndex(uint8_t elementIndex)
40694069
return elementIndex;
40704070
}
40714071

4072+
static void osdDrawAllElements(void)
4073+
{
4074+
for (uint8_t element = 0; element < OSD_ITEM_COUNT; element++) {
4075+
osdDrawSingleElement(element);
4076+
}
4077+
4078+
osdDrawSingleElement(OSD_ARTIFICIAL_HORIZON);
4079+
if (osdConfig()->telemetry>0){
4080+
osdDisplayTelemetry();
4081+
}
4082+
}
4083+
40724084
void osdDrawNextElement(void)
40734085
{
40744086
static uint8_t elementIndex = 0;
@@ -4130,6 +4142,7 @@ PG_RESET_TEMPLATE(osdConfig_t, osdConfig,
41304142
.video_system = SETTING_OSD_VIDEO_SYSTEM_DEFAULT,
41314143
.row_shiftdown = SETTING_OSD_ROW_SHIFTDOWN_DEFAULT,
41324144
.msp_displayport_fullframe_interval = SETTING_OSD_MSP_DISPLAYPORT_FULLFRAME_INTERVAL_DEFAULT,
4145+
.framerate_hz = SETTING_OSD_FRAMERATE_HZ_DEFAULT,
41334146

41344147
.ahi_reverse_roll = SETTING_OSD_AHI_REVERSE_ROLL_DEFAULT,
41354148
.ahi_max_pitch = SETTING_OSD_AHI_MAX_PITCH_DEFAULT,
@@ -5801,7 +5814,26 @@ static void osdRefresh(timeUs_t currentTimeUs)
58015814
displayClearScreen(osdDisplayPort);
58025815
fullRedraw = false;
58035816
}
5804-
osdDrawNextElement();
5817+
5818+
if (osdConfig()->osd_framerate_hz == -1) {
5819+
osdDrawNextElement();
5820+
} else {
5821+
static uint32_t lastDrawAllTimeUs = 0;
5822+
const int8_t hz = osdConfig()->osd_framerate_hz;
5823+
const uint32_t drawAllIntervalUs = (hz > 0) ? (1000000 / hz) : 0;
5824+
5825+
5826+
if (drawAllIntervalUs == 0 || (currentTimeUs - lastDrawAllTimeUs) >= drawAllIntervalUs) {
5827+
osdDrawAllElements();
5828+
lastDrawAllTimeUs = currentTimeUs;
5829+
}
5830+
5831+
osdDrawSingleElement(OSD_ARTIFICIAL_HORIZON);
5832+
if (osdConfig()->telemetry>0){
5833+
osdDisplayTelemetry();
5834+
}
5835+
}
5836+
58055837
displayHeartbeat(osdDisplayPort);
58065838
displayCommitTransaction(osdDisplayPort);
58075839
#ifdef OSD_CALLS_CMS

src/main/io/osd.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -412,6 +412,7 @@ typedef struct osdConfig_s {
412412
videoSystem_e video_system;
413413
uint8_t row_shiftdown;
414414
int16_t msp_displayport_fullframe_interval;
415+
int8_t osd_framerate_hz;
415416

416417
// Preferences
417418
uint8_t main_voltage_decimals;

0 commit comments

Comments
 (0)