diff --git a/radio/src/functions.cpp b/radio/src/functions.cpp index cab7e0fd1..d93869598 100644 --- a/radio/src/functions.cpp +++ b/radio/src/functions.cpp @@ -394,12 +394,8 @@ void evalFunctions(const CustomFunctionData * functions, CustomFunctionsContext getvalue_t raw = getValue(CFN_PARAM(cfn)); #if defined(COLORLCD) - if (raw == -1024) - requiredBacklightBright = 100; - else - requiredBacklightBright = - (1024 - raw) * (BACKLIGHT_LEVEL_MAX - BACKLIGHT_LEVEL_MIN) / - 2048; + requiredBacklightBright = BACKLIGHT_LEVEL_MAX - (g_eeGeneral.blOffBright + + ((1024 + raw) * ((BACKLIGHT_LEVEL_MAX - g_eeGeneral.backlightBright) - g_eeGeneral.blOffBright) / 2048)); #elif defined(OLED_SCREEN) requiredBacklightBright = (raw + 1024) * 254 / 2048; #else diff --git a/radio/src/gui/colorlcd/radio_setup.cpp b/radio/src/gui/colorlcd/radio_setup.cpp index 38c7e35c8..26beaff19 100644 --- a/radio/src/gui/colorlcd/radio_setup.cpp +++ b/radio/src/gui/colorlcd/radio_setup.cpp @@ -475,15 +475,17 @@ class BacklightPage : public SubPage { // Backlight ON bright new StaticText(backlightOnBright, rect_t{}, STR_BLONBRIGHTNESS, 0, COLOR_THEME_PRIMARY1); - new Slider(backlightOnBright, lv_pct(50), BACKLIGHT_LEVEL_MIN, BACKLIGHT_LEVEL_MAX, + backlightOnSlider = new Slider(backlightOnBright, lv_pct(50), BACKLIGHT_LEVEL_MIN, BACKLIGHT_LEVEL_MAX, [=]() -> int32_t { return BACKLIGHT_LEVEL_MAX - g_eeGeneral.backlightBright; }, [=](int32_t newValue) { - if(newValue >= g_eeGeneral.blOffBright || g_eeGeneral.backlightMode == e_backlight_mode_on) + if(newValue >= g_eeGeneral.blOffBright || g_eeGeneral.backlightMode == e_backlight_mode_on) { g_eeGeneral.backlightBright = BACKLIGHT_LEVEL_MAX - newValue; - else + } else { g_eeGeneral.backlightBright = BACKLIGHT_LEVEL_MAX - g_eeGeneral.blOffBright; + backlightOnSlider->update(); + } SET_DIRTY(); }); @@ -491,13 +493,15 @@ class BacklightPage : public SubPage { // Backlight OFF bright new StaticText(backlightOffBright, rect_t{}, STR_BLOFFBRIGHTNESS, 0, COLOR_THEME_PRIMARY1); - new Slider(backlightOffBright, lv_pct(50), BACKLIGHT_LEVEL_MIN, BACKLIGHT_LEVEL_MAX, GET_DEFAULT(g_eeGeneral.blOffBright), + backlightOffSlider = new Slider(backlightOffBright, lv_pct(50), 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) + if(newValue <= onBright || g_eeGeneral.backlightMode == e_backlight_mode_off) { g_eeGeneral.blOffBright = newValue; - else + } else { g_eeGeneral.blOffBright = onBright; + backlightOffSlider->update(); + } SET_DIRTY(); }); @@ -522,6 +526,8 @@ class BacklightPage : public SubPage { Window* backlightTimeout = nullptr; Window* backlightOnBright = nullptr; Window* backlightOffBright = nullptr; + Slider* backlightOffSlider = nullptr; + Slider* backlightOnSlider = nullptr; void updateBacklightControls() { diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index b7c64ddcb..44b336e19 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -538,11 +538,6 @@ void checkBacklight() } if (backlightOn) { currentBacklightBright = requiredBacklightBright; -#if defined(COLORLCD) - // force backlight on for color lcd radios - if (currentBacklightBright > BACKLIGHT_LEVEL_MAX - BACKLIGHT_LEVEL_MIN) - currentBacklightBright = BACKLIGHT_LEVEL_MAX - BACKLIGHT_LEVEL_MIN; -#endif BACKLIGHT_ENABLE(); } else { BACKLIGHT_DISABLE(); diff --git a/radio/src/thirdparty/libopenui/src/slider.cpp b/radio/src/thirdparty/libopenui/src/slider.cpp index d63e877ac..43a849780 100644 --- a/radio/src/thirdparty/libopenui/src/slider.cpp +++ b/radio/src/thirdparty/libopenui/src/slider.cpp @@ -51,8 +51,20 @@ Slider::Slider(Window* parent, coord_t width, int32_t vmin, int32_t vmax, lv_obj_add_event_cb(slider, slider_changed_cb, LV_EVENT_VALUE_CHANGED, this); lv_slider_set_range(slider, vmin, vmax); - if (_getValue != nullptr) + update(); +} + +void Slider::update() +{ + if (_getValue != nullptr) { + // Fix for lv_slider_set_value not working when using the rotary encoder to + // update value + auto bar = (lv_bar_t*)slider; + bar->cur_value_anim.anim_state = -1; + bar->cur_value_anim.anim_end = _getValue(); + lv_slider_set_value(slider, _getValue(), LV_ANIM_OFF); + } } void Slider::paint(BitmapBuffer* dc) diff --git a/radio/src/thirdparty/libopenui/src/slider.h b/radio/src/thirdparty/libopenui/src/slider.h index f772dc438..53f04f622 100644 --- a/radio/src/thirdparty/libopenui/src/slider.h +++ b/radio/src/thirdparty/libopenui/src/slider.h @@ -37,6 +37,8 @@ class Slider : public Window void paint(BitmapBuffer *) override; + void update(); + protected: int vmin; int vmax;