Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add option to display the OSD logo on arming #9244

Merged
merged 2 commits into from Nov 30, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
11 changes: 11 additions & 0 deletions src/main/cli/settings.c
Expand Up @@ -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) }

Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -1242,6 +1251,8 @@ 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_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]) },
Expand Down
3 changes: 3 additions & 0 deletions src/main/cli/settings.h
Expand Up @@ -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;
Expand Down
24 changes: 21 additions & 3 deletions src/main/osd/osd.c
Expand Up @@ -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",
Expand Down Expand Up @@ -332,6 +338,8 @@ void pgResetFn_osdConfig(osdConfig_t *osdConfig)
osdConfig->displayPortDevice = OSD_DISPLAYPORT_DEVICE_AUTO;

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)
Expand Down Expand Up @@ -806,10 +814,21 @@ static void osdRefreshStats(void)
osdShowStats(osdStatsRowCount);
}

static void osdShowArmed(void)
static timeDelta_t osdShowArmed(void)
{
static bool everArmed = false;
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wonder if this could be replaced by checking ARMING_FLAG(WAS_EVER_ARMED). It will need some refactoring, but I can have a look into it.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No, I originally tried that. But by the time we get to this code we are already armed and ARMING_FLAG(WAS_EVER_ARMED) is already true.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See #9248.

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)
Expand All @@ -825,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))
Expand Down
2 changes: 2 additions & 0 deletions src/main/osd/osd.h
Expand Up @@ -271,6 +271,8 @@ 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
uint8_t logo_on_arming_duration; // display duration in 0.1s units
} osdConfig_t;

PG_DECLARE(osdConfig_t, osdConfig);
Expand Down