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) {