From 56146468610d4c10ba80428302d8434d3b6bf273 Mon Sep 17 00:00:00 2001 From: Malte Langermann <54738901+gagarinlg@users.noreply.github.com> Date: Fri, 12 Nov 2021 02:19:45 +0100 Subject: [PATCH] Improve backlight handling on color lcd radios (#998) * no more backlight off mode for color lcd radios disable backlight input controls in radio setup screen, when they are not used by the selected backlight mode force backlight on to be at least the brightness of backlight off * do not allow to set the display brightness below the configured off brightness, except when display mode is set to ON. * Revert "do not allow to set the display brightness below the configured off brightness, except when display mode is set to ON." This reverts commit e153a8dc658d53f5420c912e7543d6d0a9fe6ed9. --- companion/src/generaledit/generalsetup.cpp | 3 +- radio/src/gui/colorlcd/radio_setup.cpp | 72 ++++++++++++++++++++-- radio/src/gui/colorlcd/radio_setup.h | 5 ++ radio/src/opentx.cpp | 4 ++ 4 files changed, 77 insertions(+), 7 deletions(-) diff --git a/companion/src/generaledit/generalsetup.cpp b/companion/src/generaledit/generalsetup.cpp index 5404a8ccb..036378f31 100644 --- a/companion/src/generaledit/generalsetup.cpp +++ b/companion/src/generaledit/generalsetup.cpp @@ -328,7 +328,8 @@ void GeneralSetupPanel::populateBacklightCB() QString strings[] = { tr("OFF"), tr("Keys"), tr("Sticks"), tr("Keys + Sticks"), tr("ON"), NULL }; b->clear(); - for (int i=0; !strings[i].isNull(); i++) { + int startValue = (firmware->getCapability(LcdDepth)>=8)?1:0; + for (int i=startValue; !strings[i].isNull(); i++) { b->addItem(strings[i], 0); if (generalSettings.backlightMode == i) { b->setCurrentIndex(b->count()-1); diff --git a/radio/src/gui/colorlcd/radio_setup.cpp b/radio/src/gui/colorlcd/radio_setup.cpp index 31d09d781..d84d40ce4 100644 --- a/radio/src/gui/colorlcd/radio_setup.cpp +++ b/radio/src/gui/colorlcd/radio_setup.cpp @@ -330,31 +330,59 @@ void RadioSetupPage::build(FormWindow * window) // Backlight mode new StaticText(window, grid.getLabelSlot(true), STR_MODE, 0, COLOR_THEME_PRIMARY1); - new Choice(window, grid.getFieldSlot(2,0), STR_VBLMODE, e_backlight_mode_off, e_backlight_mode_on, GET_SET_DEFAULT(g_eeGeneral.backlightMode)); - //grid.nextLine(); +#if defined COLORLCD + BacklightMode minBacklightMode = e_backlight_mode_keys; +#else + BacklightMode minBacklightMode = e_backlight_mode_off; +#endif + const char* values[e_backlight_mode_on+1] = {}; + uint8_t len = STR_VBLMODE[0]; + const char * value = &STR_VBLMODE[1]; + for (int i = e_backlight_mode_off; i <= e_backlight_mode_on; i++) { + values[i] = value; + value += len; + } + new Choice(window, grid.getFieldSlot(2,0), &values[minBacklightMode], minBacklightMode, e_backlight_mode_on, GET_DEFAULT(g_eeGeneral.backlightMode), + [=](int32_t newValue) { + g_eeGeneral.backlightMode = newValue; + updateBacklightControls(); + }); + //grid.nextLine(); // Delay - auto edit = new NumberEdit(window, grid.getFieldSlot(2, 1), 0, 600, + auto edit = new NumberEdit(window, grid.getFieldSlot(2, 1), 5, 600, GET_DEFAULT(g_eeGeneral.lightAutoOff * 5), SET_VALUE(g_eeGeneral.lightAutoOff, newValue / 5)); edit->setStep(5); edit->setSuffix("s"); + backlightTimeout = edit; + grid.nextLine(); // Backlight ON bright new StaticText(window, grid.getLabelSlot(true), STR_BLONBRIGHTNESS, 0, COLOR_THEME_PRIMARY1); - new Slider(window, grid.getFieldSlot(), BACKLIGHT_LEVEL_MIN, BACKLIGHT_LEVEL_MAX, + backlightOnBright = new Slider(window, grid.getFieldSlot(), BACKLIGHT_LEVEL_MIN, BACKLIGHT_LEVEL_MAX, [=]() -> int32_t { return BACKLIGHT_LEVEL_MAX - g_eeGeneral.backlightBright; }, [=](int32_t newValue) { - g_eeGeneral.backlightBright = BACKLIGHT_LEVEL_MAX - newValue; + if(newValue >= g_eeGeneral.blOffBright || g_eeGeneral.backlightMode == e_backlight_mode_on) + g_eeGeneral.backlightBright = BACKLIGHT_LEVEL_MAX - newValue; + else + g_eeGeneral.backlightBright = BACKLIGHT_LEVEL_MAX - g_eeGeneral.blOffBright; }); grid.nextLine(); // Backlight OFF bright new StaticText(window, grid.getLabelSlot(true), STR_BLOFFBRIGHTNESS, 0, COLOR_THEME_PRIMARY1); - new Slider(window, grid.getFieldSlot(), BACKLIGHT_LEVEL_MIN, BACKLIGHT_LEVEL_MAX, GET_SET_DEFAULT(g_eeGeneral.blOffBright)); + backlightOffBright = new Slider(window, grid.getFieldSlot(), BACKLIGHT_LEVEL_MIN, BACKLIGHT_LEVEL_MAX, GET_DEFAULT(g_eeGeneral.blOffBright), + [=](int32_t newValue) { + int32_t onBright = BACKLIGHT_LEVEL_MAX - g_eeGeneral.backlightBright; + if(newValue <= onBright || g_eeGeneral.backlightMode == e_backlight_mode_off) + g_eeGeneral.blOffBright = newValue; + else + g_eeGeneral.blOffBright = onBright; + }); grid.nextLine(); #if defined(KEYS_BACKLIGHT_GPIO) @@ -368,6 +396,8 @@ void RadioSetupPage::build(FormWindow * window) new StaticText(window, grid.getLabelSlot(true), STR_ALARM, 0, COLOR_THEME_PRIMARY1); new CheckBox(window, grid.getFieldSlot(), GET_SET_DEFAULT(g_eeGeneral.alarmsFlash)); grid.nextLine(); + + updateBacklightControls(); } #if defined(PWR_BUTTON_PRESS) @@ -496,3 +526,33 @@ void RadioSetupPage::build(FormWindow * window) window->setInnerHeight(grid.getWindowHeight()); } + +void RadioSetupPage::updateBacklightControls() +{ + switch(g_eeGeneral.backlightMode) + { + case e_backlight_mode_off: + backlightTimeout->enable(false); + backlightOnBright->enable(false); + backlightOffBright->enable(true); + break; + case e_backlight_mode_keys: + case e_backlight_mode_sticks: + case e_backlight_mode_all: + default: + { + backlightTimeout->enable(true); + backlightOnBright->enable(true); + backlightOffBright->enable(true); + int32_t onBright = BACKLIGHT_LEVEL_MAX - g_eeGeneral.backlightBright; + if(onBright < g_eeGeneral.blOffBright) + g_eeGeneral.backlightBright = BACKLIGHT_LEVEL_MAX - g_eeGeneral.blOffBright; + break; + } + case e_backlight_mode_on: + backlightTimeout->enable(false); + backlightOnBright->enable(true); + backlightOffBright->enable(false); + break; + } +} diff --git a/radio/src/gui/colorlcd/radio_setup.h b/radio/src/gui/colorlcd/radio_setup.h index eccb20038..275b6aeb2 100644 --- a/radio/src/gui/colorlcd/radio_setup.h +++ b/radio/src/gui/colorlcd/radio_setup.h @@ -26,4 +26,9 @@ class RadioSetupPage: public PageTab { RadioSetupPage(); void build(FormWindow * window) override; + private: + void updateBacklightControls(); + FormField* backlightTimeout = nullptr; + FormField* backlightOnBright = nullptr; + FormField* backlightOffBright = nullptr; }; diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index 7f2c7359e..d502dee25 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -1878,6 +1878,10 @@ void opentxInit() #if defined(COLORLCD) loadTheme(); + if (g_eeGeneral.backlightMode == e_backlight_mode_off) { + // no backlight mode off on color lcd radios + g_eeGeneral.backlightMode = e_backlight_mode_keys; + } #endif if (g_eeGeneral.backlightMode != e_backlight_mode_off) {