From 05c8538752467ec9d4473a6abc5138311a66b8df Mon Sep 17 00:00:00 2001 From: Bruce Luckcuck Date: Thu, 28 Nov 2019 13:38:33 -0500 Subject: [PATCH 1/2] Add option to display the OSD logo on arming Adds `osd_logo_on_arming` setting with values `OFF, ON, FIRST_ARMING` (defaults to `OFF`). Optionally displays the OSD splash logo durin the "ARMING" message. --- src/main/cli/settings.c | 10 ++++++++++ src/main/cli/settings.h | 3 +++ src/main/osd/osd.c | 13 +++++++++++++ src/main/osd/osd.h | 1 + 4 files changed, 27 insertions(+) diff --git a/src/main/cli/settings.c b/src/main/cli/settings.c index ab55351b89..d7de29c12b 100644 --- a/src/main/cli/settings.c +++ b/src/main/cli/settings.c @@ -487,6 +487,11 @@ static const char * const lookupTableOsdDisplayPortDevice[] = { "NONE", "AUTO", "MAX7456", "MSP", }; +#ifdef USE_OSD +static const char * const lookupTableOsdLogoOnArming[] = { + "OFF", "ON", "FIRST_ARMING", +}; +#endif #define LOOKUP_TABLE_ENTRY(name) { name, ARRAYLEN(name) } @@ -606,6 +611,10 @@ const lookupTableEntry_t lookupTables[] = { LOOKUP_TABLE_ENTRY(lookupTableInterpolatedSetpoint), LOOKUP_TABLE_ENTRY(lookupTableDshotBitbangedTimer), LOOKUP_TABLE_ENTRY(lookupTableOsdDisplayPortDevice), + +#ifdef USE_OSD + LOOKUP_TABLE_ENTRY(lookupTableOsdLogoOnArming), +#endif }; #undef LOOKUP_TABLE_ENTRY @@ -1242,6 +1251,7 @@ const clivalue_t valueTable[] = { { "osd_ah_max_pit", VAR_UINT8 | MASTER_VALUE, .config.minmaxUnsigned = { 0, 90 }, PG_OSD_CONFIG, offsetof(osdConfig_t, ahMaxPitch) }, { "osd_ah_max_rol", VAR_UINT8 | MASTER_VALUE, .config.minmaxUnsigned = { 0, 90 }, PG_OSD_CONFIG, offsetof(osdConfig_t, ahMaxRoll) }, { "osd_ah_invert", VAR_UINT8 | MASTER_VALUE | MODE_LOOKUP, .config.lookup = { TABLE_OFF_ON }, PG_OSD_CONFIG, offsetof(osdConfig_t, ahInvert) }, + { "osd_logo_on_arming", VAR_UINT8 | MASTER_VALUE | MODE_LOOKUP, .config.lookup = { TABLE_OSD_LOGO_ON_ARMING }, PG_OSD_CONFIG, offsetof(osdConfig_t, logo_on_arming) }, { "osd_tim1", VAR_UINT16 | MASTER_VALUE, .config.minmaxUnsigned = { 0, INT16_MAX }, PG_OSD_CONFIG, offsetof(osdConfig_t, timers[OSD_TIMER_1]) }, { "osd_tim2", VAR_UINT16 | MASTER_VALUE, .config.minmaxUnsigned = { 0, INT16_MAX }, PG_OSD_CONFIG, offsetof(osdConfig_t, timers[OSD_TIMER_2]) }, diff --git a/src/main/cli/settings.h b/src/main/cli/settings.h index 562828ec02..6e3ac466b6 100644 --- a/src/main/cli/settings.h +++ b/src/main/cli/settings.h @@ -139,6 +139,9 @@ typedef enum { TABLE_INTERPOLATED_SP, TABLE_DSHOT_BITBANGED_TIMER, TABLE_OSD_DISPLAYPORT_DEVICE, +#ifdef USE_OSD + TABLE_OSD_LOGO_ON_ARMING, +#endif LOOKUP_TABLE_COUNT } lookupTableIndex_e; diff --git a/src/main/osd/osd.c b/src/main/osd/osd.c index b43573dd99..c3946faafb 100644 --- a/src/main/osd/osd.c +++ b/src/main/osd/osd.c @@ -91,6 +91,12 @@ #include "hardware_revision.h" #endif +typedef enum { + OSD_LOGO_ARMING_OFF, + OSD_LOGO_ARMING_ON, + OSD_LOGO_ARMING_FIRST +} osd_logo_on_arming_e; + const char * const osdTimerSourceNames[] = { "ON TIME ", "TOTAL ARM", @@ -332,6 +338,7 @@ void pgResetFn_osdConfig(osdConfig_t *osdConfig) osdConfig->displayPortDevice = OSD_DISPLAYPORT_DEVICE_AUTO; osdConfig->distance_alarm = 0; + osdConfig->logo_on_arming = OSD_LOGO_ARMING_OFF; } static void osdDrawLogo(int x, int y) @@ -808,8 +815,14 @@ static void osdRefreshStats(void) static void osdShowArmed(void) { + static bool everArmed = false; + displayClearScreen(osdDisplayPort); + if ((osdConfig()->logo_on_arming == OSD_LOGO_ARMING_ON) || ((osdConfig()->logo_on_arming == OSD_LOGO_ARMING_FIRST) && !everArmed)) { + osdDrawLogo(3, 1); + } displayWrite(osdDisplayPort, 12, 7, DISPLAYPORT_ATTR_NONE, "ARMED"); + everArmed = true; } STATIC_UNIT_TESTED void osdRefresh(timeUs_t currentTimeUs) diff --git a/src/main/osd/osd.h b/src/main/osd/osd.h index 218b798bed..7132fbf40f 100644 --- a/src/main/osd/osd.h +++ b/src/main/osd/osd.h @@ -271,6 +271,7 @@ typedef struct osdConfig_s { int8_t rcChannels[OSD_RCCHANNELS_COUNT]; // RC channel values to display, -1 if none uint8_t displayPortDevice; // osdDisplayPortDevice_e uint16_t distance_alarm; + uint8_t logo_on_arming; // show the logo on arming } osdConfig_t; PG_DECLARE(osdConfig_t, osdConfig); From 6b1f8485ac9e00df688820cf4f8c8a06883eb3af Mon Sep 17 00:00:00 2001 From: Bruce Luckcuck Date: Fri, 29 Nov 2019 15:55:49 -0500 Subject: [PATCH 2/2] Add configurable duration to show the OSD logo on arming Adds `osd_logo_on_arming_duration` which is configured in 0.1s intervals ranging from 5 to 50 (0.5s to 5.0s). The default is 5 (0.5s) to be consistent with the previous "ARMED" splash screen. --- src/main/cli/settings.c | 1 + src/main/osd/osd.c | 11 ++++++++--- src/main/osd/osd.h | 1 + 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/main/cli/settings.c b/src/main/cli/settings.c index d7de29c12b..e611f79d96 100644 --- a/src/main/cli/settings.c +++ b/src/main/cli/settings.c @@ -1252,6 +1252,7 @@ const clivalue_t valueTable[] = { { "osd_ah_max_rol", VAR_UINT8 | MASTER_VALUE, .config.minmaxUnsigned = { 0, 90 }, PG_OSD_CONFIG, offsetof(osdConfig_t, ahMaxRoll) }, { "osd_ah_invert", VAR_UINT8 | MASTER_VALUE | MODE_LOOKUP, .config.lookup = { TABLE_OFF_ON }, PG_OSD_CONFIG, offsetof(osdConfig_t, ahInvert) }, { "osd_logo_on_arming", VAR_UINT8 | MASTER_VALUE | MODE_LOOKUP, .config.lookup = { TABLE_OSD_LOGO_ON_ARMING }, PG_OSD_CONFIG, offsetof(osdConfig_t, logo_on_arming) }, + { "osd_logo_on_arming_duration",VAR_UINT8 | MASTER_VALUE, .config.minmaxUnsigned = { 5, 50 }, PG_OSD_CONFIG, offsetof(osdConfig_t, logo_on_arming_duration) }, { "osd_tim1", VAR_UINT16 | MASTER_VALUE, .config.minmaxUnsigned = { 0, INT16_MAX }, PG_OSD_CONFIG, offsetof(osdConfig_t, timers[OSD_TIMER_1]) }, { "osd_tim2", VAR_UINT16 | MASTER_VALUE, .config.minmaxUnsigned = { 0, INT16_MAX }, PG_OSD_CONFIG, offsetof(osdConfig_t, timers[OSD_TIMER_2]) }, diff --git a/src/main/osd/osd.c b/src/main/osd/osd.c index c3946faafb..c0651e4046 100644 --- a/src/main/osd/osd.c +++ b/src/main/osd/osd.c @@ -339,6 +339,7 @@ void pgResetFn_osdConfig(osdConfig_t *osdConfig) osdConfig->distance_alarm = 0; osdConfig->logo_on_arming = OSD_LOGO_ARMING_OFF; + osdConfig->logo_on_arming_duration = 5; // 0.5 seconds } static void osdDrawLogo(int x, int y) @@ -813,16 +814,21 @@ static void osdRefreshStats(void) osdShowStats(osdStatsRowCount); } -static void osdShowArmed(void) +static timeDelta_t osdShowArmed(void) { static bool everArmed = false; + timeDelta_t ret; displayClearScreen(osdDisplayPort); if ((osdConfig()->logo_on_arming == OSD_LOGO_ARMING_ON) || ((osdConfig()->logo_on_arming == OSD_LOGO_ARMING_FIRST) && !everArmed)) { osdDrawLogo(3, 1); + ret = osdConfig()->logo_on_arming_duration * 1e5; + } else { + ret = (REFRESH_1S / 2); } displayWrite(osdDisplayPort, 12, 7, DISPLAYPORT_ATTR_NONE, "ARMED"); everArmed = true; + return ret; } STATIC_UNIT_TESTED void osdRefresh(timeUs_t currentTimeUs) @@ -838,8 +844,7 @@ STATIC_UNIT_TESTED void osdRefresh(timeUs_t currentTimeUs) osdStatsEnabled = false; osdStatsVisible = false; osdResetStats(); - osdShowArmed(); - resumeRefreshAt = currentTimeUs + (REFRESH_1S / 2); + resumeRefreshAt = osdShowArmed() + currentTimeUs; } else if (isSomeStatEnabled() && !suppressStatsDisplay && (!(getArmingDisableFlags() & (ARMING_DISABLED_RUNAWAY_TAKEOFF | ARMING_DISABLED_CRASH_DETECTED)) diff --git a/src/main/osd/osd.h b/src/main/osd/osd.h index 7132fbf40f..69db3d3dd6 100644 --- a/src/main/osd/osd.h +++ b/src/main/osd/osd.h @@ -272,6 +272,7 @@ typedef struct osdConfig_s { uint8_t displayPortDevice; // osdDisplayPortDevice_e uint16_t distance_alarm; uint8_t logo_on_arming; // show the logo on arming + uint8_t logo_on_arming_duration; // display duration in 0.1s units } osdConfig_t; PG_DECLARE(osdConfig_t, osdConfig);