From e15523bfe5f9a43a207c913cd7bb94b8c8c97d41 Mon Sep 17 00:00:00 2001 From: Michael Keller Date: Fri, 19 Apr 2019 13:43:38 +1200 Subject: [PATCH] Merge pull request #8016 from krzysztofmatula/km-timer-safety-checks OSD timers safety checks --- src/main/fc/config.c | 12 ++++++++++++ src/main/osd/osd.c | 9 +++++++-- src/main/osd/osd.h | 2 ++ 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/main/fc/config.c b/src/main/fc/config.c index d0a9bd33d0..7a2fa56143 100644 --- a/src/main/fc/config.c +++ b/src/main/fc/config.c @@ -52,6 +52,8 @@ #include "io/serial.h" #include "io/gps.h" +#include "osd/osd.h" + #include "pg/beeper.h" #include "pg/beeper_dev.h" #include "pg/rx.h" @@ -461,6 +463,16 @@ static void validateAndFixConfig(void) } #endif +#if defined(USE_OSD) + for (int i = 0; i < OSD_TIMER_COUNT; i++) { + const uint16_t t = osdConfig()->timers[i]; + if (OSD_TIMER_SRC(t) >= OSD_TIMER_SRC_COUNT || + OSD_TIMER_PRECISION(t) >= OSD_TIMER_PREC_COUNT) { + osdConfigMutable()->timers[i] = osdTimerDefault[i]; + } + } +#endif + #if defined(TARGET_VALIDATECONFIG) targetValidateConfiguration(); #endif diff --git a/src/main/osd/osd.c b/src/main/osd/osd.c index 97bb7c9796..e9a430fbca 100644 --- a/src/main/osd/osd.c +++ b/src/main/osd/osd.c @@ -197,6 +197,11 @@ static void osdDrawElements(timeUs_t currentTimeUs) osdDrawActiveElements(osdDisplayPort, currentTimeUs); } +const uint16_t osdTimerDefault[OSD_TIMER_COUNT] = { + OSD_TIMER(OSD_TIMER_SRC_ON, OSD_TIMER_PREC_SECOND, 10), + OSD_TIMER(OSD_TIMER_SRC_TOTAL_ARMED, OSD_TIMER_PREC_SECOND, 10) +}; + void pgResetFn_osdConfig(osdConfig_t *osdConfig) { // Position elements near centre of screen and disabled by default @@ -234,8 +239,8 @@ void pgResetFn_osdConfig(osdConfig_t *osdConfig) osdWarnSetState(i, true); } - osdConfig->timers[OSD_TIMER_1] = OSD_TIMER(OSD_TIMER_SRC_ON, OSD_TIMER_PREC_SECOND, 10); - osdConfig->timers[OSD_TIMER_2] = OSD_TIMER(OSD_TIMER_SRC_TOTAL_ARMED, OSD_TIMER_PREC_SECOND, 10); + osdConfig->timers[OSD_TIMER_1] = osdTimerDefault[OSD_TIMER_1]; + osdConfig->timers[OSD_TIMER_2] = osdTimerDefault[OSD_TIMER_2]; osdConfig->overlay_radio_mode = 2; diff --git a/src/main/osd/osd.h b/src/main/osd/osd.h index cef63acbe3..ac78718cc8 100644 --- a/src/main/osd/osd.h +++ b/src/main/osd/osd.h @@ -215,6 +215,8 @@ STATIC_ASSERT(OSD_WARNING_COUNT <= 32, osdwarnings_overflow); #define OSD_GPS_RESCUE_DISABLED_WARNING_DURATION_US 3000000 // 3 seconds +extern const uint16_t osdTimerDefault[OSD_TIMER_COUNT]; + typedef struct osdConfig_s { uint16_t item_pos[OSD_ITEM_COUNT];