Skip to content

Commit 6ab345c

Browse files
committed
Add configurable OSD element refresh rate
1 parent 2c9854d commit 6ab345c

File tree

3 files changed

+43
-1
lines changed

3 files changed

+43
-1
lines changed

src/main/fc/settings.yaml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3329,6 +3329,13 @@ groups:
33293329
max: 600
33303330
type: int16_t
33313331
field: msp_displayport_fullframe_interval
3332+
- name: osd_framerate_hz
3333+
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"
3334+
default_value: -1
3335+
min: -1
3336+
max: 60
3337+
type: int8_t
3338+
field: osd_framerate_hz
33323339
- name: osd_units
33333340
description: "IMPERIAL, METRIC, UK"
33343341
default_value: "METRIC"

src/main/io/osd.c

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4242,6 +4242,18 @@ uint8_t osdIncElementIndex(uint8_t elementIndex)
42424242
return elementIndex;
42434243
}
42444244

4245+
static void osdDrawAllElements(void)
4246+
{
4247+
for (uint8_t element = 0; element < OSD_ITEM_COUNT; element++) {
4248+
osdDrawSingleElement(element);
4249+
}
4250+
4251+
osdDrawSingleElement(OSD_ARTIFICIAL_HORIZON);
4252+
if (osdConfig()->telemetry>0){
4253+
osdDisplayTelemetry();
4254+
}
4255+
}
4256+
42454257
void osdDrawNextElement(void)
42464258
{
42474259
static uint8_t elementIndex = 0;
@@ -4304,6 +4316,7 @@ PG_RESET_TEMPLATE(osdConfig_t, osdConfig,
43044316
.video_system = SETTING_OSD_VIDEO_SYSTEM_DEFAULT,
43054317
.row_shiftdown = SETTING_OSD_ROW_SHIFTDOWN_DEFAULT,
43064318
.msp_displayport_fullframe_interval = SETTING_OSD_MSP_DISPLAYPORT_FULLFRAME_INTERVAL_DEFAULT,
4319+
.framerate_hz = SETTING_OSD_FRAMERATE_HZ_DEFAULT,
43074320

43084321
.ahi_reverse_roll = SETTING_OSD_AHI_REVERSE_ROLL_DEFAULT,
43094322
.ahi_max_pitch = SETTING_OSD_AHI_MAX_PITCH_DEFAULT,
@@ -5976,7 +5989,28 @@ static void osdRefresh(timeUs_t currentTimeUs)
59765989
displayClearScreen(osdDisplayPort);
59775990
fullRedraw = false;
59785991
}
5979-
osdDrawNextElement();
5992+
5993+
if (osdConfig()->osd_framerate_hz == -1) {
5994+
osdDrawNextElement();
5995+
} else {
5996+
static uint32_t lastDrawAllTimeUs = 0;
5997+
const int8_t hz = osdConfig()->osd_framerate_hz;
5998+
const uint32_t drawAllIntervalUs = (hz > 0) ? (1000000 / hz) : 0;
5999+
6000+
const bool forceDraw = (drawAllIntervalUs == 0);
6001+
const bool intervalExceeded = (currentTimeUs - lastDrawAllTimeUs) >= drawAllIntervalUs;
6002+
6003+
if (forceDraw || intervalExceeded) {
6004+
osdDrawAllElements();
6005+
lastDrawAllTimeUs = currentTimeUs;
6006+
}
6007+
6008+
osdDrawSingleElement(OSD_ARTIFICIAL_HORIZON);
6009+
if (osdConfig()->telemetry>0){
6010+
osdDisplayTelemetry();
6011+
}
6012+
}
6013+
59806014
displayHeartbeat(osdDisplayPort);
59816015
displayCommitTransaction(osdDisplayPort);
59826016
#ifdef OSD_CALLS_CMS

src/main/io/osd.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -451,6 +451,7 @@ typedef struct osdConfig_s {
451451
videoSystem_e video_system;
452452
uint8_t row_shiftdown;
453453
int16_t msp_displayport_fullframe_interval;
454+
int8_t osd_framerate_hz;
454455

455456
// Preferences
456457
uint8_t main_voltage_decimals;

0 commit comments

Comments
 (0)