mirror of
https://github.com/betaflight/betaflight.git
synced 2025-07-26 17:55:30 +03:00
Allow OSD warnings to be toggled
This commit is contained in:
parent
8a471deddc
commit
6621ed9818
5 changed files with 62 additions and 35 deletions
|
@ -664,6 +664,9 @@ static bool mspCommonProcessOutCommand(uint8_t cmdMSP, sbuf_t *dst, mspPostProce
|
||||||
for (int i = 0; i < OSD_TIMER_COUNT; i++) {
|
for (int i = 0; i < OSD_TIMER_COUNT; i++) {
|
||||||
sbufWriteU16(dst, osdConfig()->timers[i]);
|
sbufWriteU16(dst, osdConfig()->timers[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Enabled warnings
|
||||||
|
sbufWriteU16(dst, osdConfig()->enabledWarnings);
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -2083,6 +2086,11 @@ static mspResult_e mspCommonProcessInCommand(uint8_t cmdMSP, sbuf_t *src)
|
||||||
osdConfigMutable()->cap_alarm = sbufReadU16(src);
|
osdConfigMutable()->cap_alarm = sbufReadU16(src);
|
||||||
sbufReadU16(src); // Skip unused (previously fly timer)
|
sbufReadU16(src); // Skip unused (previously fly timer)
|
||||||
osdConfigMutable()->alt_alarm = sbufReadU16(src);
|
osdConfigMutable()->alt_alarm = sbufReadU16(src);
|
||||||
|
|
||||||
|
if (sbufBytesRemaining(src) >= 2) {
|
||||||
|
/* Enabled warnings */
|
||||||
|
osdConfigMutable()->enabledWarnings = sbufReadU16(src);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
} else if ((int8_t)addr == -2) {
|
} else if ((int8_t)addr == -2) {
|
||||||
#if defined(OSD)
|
#if defined(OSD)
|
||||||
|
|
|
@ -669,6 +669,7 @@ const clivalue_t valueTable[] = {
|
||||||
// PG_OSD_CONFIG
|
// PG_OSD_CONFIG
|
||||||
#ifdef OSD
|
#ifdef OSD
|
||||||
{ "osd_units", VAR_UINT8 | MASTER_VALUE | MODE_LOOKUP, .config.lookup = { TABLE_UNIT }, PG_OSD_CONFIG, offsetof(osdConfig_t, units) },
|
{ "osd_units", VAR_UINT8 | MASTER_VALUE | MODE_LOOKUP, .config.lookup = { TABLE_UNIT }, PG_OSD_CONFIG, offsetof(osdConfig_t, units) },
|
||||||
|
{ "osd_warnings", VAR_UINT16 | MASTER_VALUE, .config.minmax = { 0, INT16_MAX }, PG_OSD_CONFIG, offsetof(osdConfig_t, enabledWarnings) },
|
||||||
|
|
||||||
{ "osd_rssi_alarm", VAR_UINT8 | MASTER_VALUE, .config.minmax = { 0, 100 }, PG_OSD_CONFIG, offsetof(osdConfig_t, rssi_alarm) },
|
{ "osd_rssi_alarm", VAR_UINT8 | MASTER_VALUE, .config.minmax = { 0, 100 }, PG_OSD_CONFIG, offsetof(osdConfig_t, rssi_alarm) },
|
||||||
{ "osd_cap_alarm", VAR_UINT16 | MASTER_VALUE, .config.minmax = { 0, 20000 }, PG_OSD_CONFIG, offsetof(osdConfig_t, cap_alarm) },
|
{ "osd_cap_alarm", VAR_UINT16 | MASTER_VALUE, .config.minmax = { 0, 20000 }, PG_OSD_CONFIG, offsetof(osdConfig_t, cap_alarm) },
|
||||||
|
|
|
@ -584,52 +584,56 @@ static void osdDrawSingleElement(uint8_t item)
|
||||||
}
|
}
|
||||||
|
|
||||||
case OSD_WARNINGS:
|
case OSD_WARNINGS:
|
||||||
/* Warn when in flip over after crash mode */
|
{
|
||||||
if ((isModeActivationConditionPresent(BOXFLIPOVERAFTERCRASH)) && IS_RC_MODE_ACTIVE(BOXFLIPOVERAFTERCRASH)) {
|
uint16_t enabledWarnings = osdConfig()->enabledWarnings;
|
||||||
tfp_sprintf(buff, "CRASH FLIP");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Show most severe reason for arming being disabled */
|
/* Warn when in flip over after crash mode */
|
||||||
if (IS_RC_MODE_ACTIVE(BOXARM) && isArmingDisabled()) {
|
if ((enabledWarnings & OSD_WARNING_CRASH_FLIP)
|
||||||
const armingDisableFlags_e flags = getArmingDisableFlags();
|
&& (isModeActivationConditionPresent(BOXFLIPOVERAFTERCRASH))
|
||||||
for (int i = 0; i < NUM_ARMING_DISABLE_FLAGS; i++) {
|
&& IS_RC_MODE_ACTIVE(BOXFLIPOVERAFTERCRASH)) {
|
||||||
if (flags & (1 << i)) {
|
tfp_sprintf(buff, "CRASH FLIP");
|
||||||
tfp_sprintf(buff, "%s", armingDisableFlagNames[i]);
|
break;
|
||||||
break;
|
}
|
||||||
|
|
||||||
|
/* Show most severe reason for arming being disabled */
|
||||||
|
if (enabledWarnings & OSD_WARNING_ARMING_DISABLE && IS_RC_MODE_ACTIVE(BOXARM) && isArmingDisabled()) {
|
||||||
|
const armingDisableFlags_e flags = getArmingDisableFlags();
|
||||||
|
for (int i = 0; i < NUM_ARMING_DISABLE_FLAGS; i++) {
|
||||||
|
if (flags & (1 << i)) {
|
||||||
|
tfp_sprintf(buff, "%s", armingDisableFlagNames[i]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Show warning if battery is not fresh */
|
/* Show warning if battery is not fresh */
|
||||||
if (!ARMING_FLAG(WAS_EVER_ARMED) && (getBatteryState() == BATTERY_OK)
|
if (enabledWarnings & OSD_WARNING_BATTERY_NOT_FULL && !ARMING_FLAG(WAS_EVER_ARMED) && (getBatteryState() == BATTERY_OK)
|
||||||
&& getBatteryAverageCellVoltage() < batteryConfig()->vbatfullcellvoltage) {
|
&& getBatteryAverageCellVoltage() < batteryConfig()->vbatfullcellvoltage) {
|
||||||
tfp_sprintf(buff, "BATT NOT FULL");
|
tfp_sprintf(buff, "BATT NOT FULL");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Show battery state warning */
|
const batteryState_e batteryState = getBatteryState();
|
||||||
switch (getBatteryState()) {
|
|
||||||
case BATTERY_WARNING:
|
|
||||||
tfp_sprintf(buff, "LOW BATTERY");
|
|
||||||
break;
|
|
||||||
|
|
||||||
case BATTERY_CRITICAL:
|
if (enabledWarnings & OSD_WARNING_BATTERY_WARNING && batteryState == BATTERY_WARNING) {
|
||||||
tfp_sprintf(buff, " LAND NOW");
|
tfp_sprintf(buff, "LOW BATTERY");
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
default:
|
if (enabledWarnings & OSD_WARNING_BATTERY_CRITICAL && batteryState == BATTERY_CRITICAL) {
|
||||||
/* Show visual beeper if battery is OK */
|
tfp_sprintf(buff, " LAND NOW");
|
||||||
if (showVisualBeeper) {
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Visual beeper */
|
||||||
|
if (enabledWarnings & OSD_WARNING_VISUAL_BEEPER && showVisualBeeper) {
|
||||||
tfp_sprintf(buff, " * * * *");
|
tfp_sprintf(buff, " * * * *");
|
||||||
} else {
|
break;
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
|
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
|
|
||||||
case OSD_AVG_CELL_VOLTAGE:
|
case OSD_AVG_CELL_VOLTAGE:
|
||||||
{
|
{
|
||||||
|
@ -804,6 +808,9 @@ void pgResetFn_osdConfig(osdConfig_t *osdConfig)
|
||||||
|
|
||||||
osdConfig->units = OSD_UNIT_METRIC;
|
osdConfig->units = OSD_UNIT_METRIC;
|
||||||
|
|
||||||
|
/* Enable all warnings by default */
|
||||||
|
osdConfig->enabledWarnings = UINT16_MAX;
|
||||||
|
|
||||||
osdConfig->timers[OSD_TIMER_1] = OSD_TIMER(OSD_TIMER_SRC_ON, OSD_TIMER_PREC_SECOND, 10);
|
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_2] = OSD_TIMER(OSD_TIMER_SRC_TOTAL_ARMED, OSD_TIMER_PREC_SECOND, 10);
|
||||||
|
|
||||||
|
|
|
@ -126,6 +126,15 @@ typedef enum {
|
||||||
OSD_TIMER_PREC_COUNT
|
OSD_TIMER_PREC_COUNT
|
||||||
} osd_timer_precision_e;
|
} osd_timer_precision_e;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
OSD_WARNING_ARMING_DISABLE = (1 << 0),
|
||||||
|
OSD_WARNING_BATTERY_NOT_FULL = (1 << 1),
|
||||||
|
OSD_WARNING_BATTERY_WARNING = (1 << 2),
|
||||||
|
OSD_WARNING_BATTERY_CRITICAL = (1 << 3),
|
||||||
|
OSD_WARNING_VISUAL_BEEPER = (1 << 4),
|
||||||
|
OSD_WARNING_CRASH_FLIP = (1 << 5)
|
||||||
|
} osdWarningsFlags_e;
|
||||||
|
|
||||||
typedef struct osdConfig_s {
|
typedef struct osdConfig_s {
|
||||||
uint16_t item_pos[OSD_ITEM_COUNT];
|
uint16_t item_pos[OSD_ITEM_COUNT];
|
||||||
bool enabled_stats[OSD_STAT_COUNT];
|
bool enabled_stats[OSD_STAT_COUNT];
|
||||||
|
@ -138,6 +147,7 @@ typedef struct osdConfig_s {
|
||||||
osd_unit_e units;
|
osd_unit_e units;
|
||||||
|
|
||||||
uint16_t timers[OSD_TIMER_COUNT];
|
uint16_t timers[OSD_TIMER_COUNT];
|
||||||
|
uint16_t enabledWarnings;
|
||||||
|
|
||||||
uint8_t ahMaxPitch;
|
uint8_t ahMaxPitch;
|
||||||
uint8_t ahMaxRoll;
|
uint8_t ahMaxRoll;
|
||||||
|
|
|
@ -730,6 +730,7 @@ TEST(OsdTest, TestElementWarningsBattery)
|
||||||
{
|
{
|
||||||
// given
|
// given
|
||||||
osdConfigMutable()->item_pos[OSD_WARNINGS] = OSD_POS(9, 10) | VISIBLE_FLAG;
|
osdConfigMutable()->item_pos[OSD_WARNINGS] = OSD_POS(9, 10) | VISIBLE_FLAG;
|
||||||
|
osdConfigMutable()->enabledWarnings = OSD_WARNING_BATTERY_WARNING | OSD_WARNING_BATTERY_CRITICAL | OSD_WARNING_BATTERY_NOT_FULL;
|
||||||
|
|
||||||
// and
|
// and
|
||||||
batteryConfigMutable()->vbatfullcellvoltage = 41;
|
batteryConfigMutable()->vbatfullcellvoltage = 41;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue