diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index f780bdd24349..7503fd82daf7 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -3403,7 +3403,8 @@ // Use some of the NeoPixel LEDs for static (background) lighting //#define NEOPIXEL_BKGD_INDEX_FIRST 0 // Index of the first background LED //#define NEOPIXEL_BKGD_INDEX_LAST 5 // Index of the last background LED - //#define NEOPIXEL_BKGD_COLOR { 255, 255, 255, 0 } // R, G, B, W + //#define NEOPIXEL_BKGD_COLOR { 255, 255, 255, 0 } // R, G, B, W + //#define NEOPIXEL_BKGD_TIMEOUT_COLOR { 25, 25, 25, 0 } // R, G, B, W //#define NEOPIXEL_BKGD_ALWAYS_ON // Keep the backlight on when other NeoPixels are off #endif diff --git a/Marlin/src/feature/leds/neopixel.cpp b/Marlin/src/feature/leds/neopixel.cpp index ab7ffe217796..2193217df055 100644 --- a/Marlin/src/feature/leds/neopixel.cpp +++ b/Marlin/src/feature/leds/neopixel.cpp @@ -54,7 +54,15 @@ Adafruit_NeoPixel Marlin_NeoPixel::adaneo1(NEOPIXEL_PIXELS, NEOPIXEL_PIN, NEOPIX set_background_color(background_color); } -#endif + void Marlin_NeoPixel::set_background_off() { + #ifndef NEOPIXEL_BKGD_TIMEOUT_COLOR + #define NEOPIXEL_BKGD_TIMEOUT_COLOR { 0, 0, 0, 0 } + #endif + constexpr uint8_t background_color_off[4] = NEOPIXEL_BKGD_TIMEOUT_COLOR; + set_background_color(background_color_off); + } + +#endif // NEOPIXEL_BKGD_INDEX_FIRST void Marlin_NeoPixel::set_color(const uint32_t color) { if (neoindex >= 0) { diff --git a/Marlin/src/feature/leds/neopixel.h b/Marlin/src/feature/leds/neopixel.h index 2048e2c2eebf..7c8d018013fa 100644 --- a/Marlin/src/feature/leds/neopixel.h +++ b/Marlin/src/feature/leds/neopixel.h @@ -91,6 +91,7 @@ class Marlin_NeoPixel { static void set_background_color(const uint8_t r, const uint8_t g, const uint8_t b, const uint8_t w); static void set_background_color(const uint8_t (&rgbw)[4]) { set_background_color(rgbw[0], rgbw[1], rgbw[2], rgbw[3]); } static void reset_background_color(); + static void set_background_off(); #endif static void begin() { diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 11d27d6eaf9c..02e7dba54b90 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -3241,8 +3241,14 @@ static_assert(X_MAX_LENGTH >= X_BED_SIZE, "Movement bounds (X_MIN_POS, X_MAX_POS #if LCD_BACKLIGHT_TIMEOUT_MINS #if !HAS_ENCODER_ACTION #error "LCD_BACKLIGHT_TIMEOUT_MINS requires an LCD with encoder or keypad." + #elif ENABLED(NEOPIXEL_BKGD_INDEX_FIRST) + #if PIN_EXISTS(LCD_BACKLIGHT) + #error "LCD_BACKLIGHT_PIN and NEOPIXEL_BKGD_INDEX_FIRST are not supported at the same time." + #elif ENABLED(NEOPIXEL_BKGD_ALWAYS_ON) + #error "LCD_BACKLIGHT_TIMEOUT is not compatible with NEOPIXEL_BKGD_ALWAYS_ON." + #endif #elif !PIN_EXISTS(LCD_BACKLIGHT) - #error "LCD_BACKLIGHT_TIMEOUT_MINS requires LCD_BACKLIGHT_PIN." + #error "LCD_BACKLIGHT_TIMEOUT_MINS requires either LCD_BACKLIGHT_PIN or NEOPIXEL_BKGD_INDEX_FIRST." #endif #endif diff --git a/Marlin/src/lcd/marlinui.cpp b/Marlin/src/lcd/marlinui.cpp index aa1ccb17c296..d3f01e6d2322 100644 --- a/Marlin/src/lcd/marlinui.cpp +++ b/Marlin/src/lcd/marlinui.cpp @@ -24,7 +24,7 @@ #include "../MarlinCore.h" // for printingIsPaused -#if LED_POWEROFF_TIMEOUT > 0 || BOTH(HAS_WIRED_LCD, PRINTER_EVENT_LEDS) +#if LED_POWEROFF_TIMEOUT > 0 || BOTH(HAS_WIRED_LCD, PRINTER_EVENT_LEDS) || (defined(LCD_BACKLIGHT_TIMEOUT_MINS) && defined(NEOPIXEL_BKGD_INDEX_FIRST)) #include "../feature/leds/leds.h" #endif @@ -186,12 +186,17 @@ constexpr uint8_t epps = ENCODER_PULSES_PER_STEP; #if LCD_BACKLIGHT_TIMEOUT_MINS constexpr uint8_t MarlinUI::backlight_timeout_min, MarlinUI::backlight_timeout_max; - uint8_t MarlinUI::backlight_timeout_minutes; // Initialized by settings.load() millis_t MarlinUI::backlight_off_ms = 0; + void MarlinUI::refresh_backlight_timeout() { backlight_off_ms = backlight_timeout_minutes ? millis() + backlight_timeout_minutes * 60UL * 1000UL : 0; - WRITE(LCD_BACKLIGHT_PIN, HIGH); + #ifdef NEOPIXEL_BKGD_INDEX_FIRST + neo.reset_background_color(); + neo.show(); + #elif PIN_EXISTS(LCD_BACKLIGHT) + WRITE(LCD_BACKLIGHT_PIN, HIGH); + #endif } #elif HAS_DISPLAY_SLEEP @@ -1196,8 +1201,14 @@ void MarlinUI::init() { #endif #if LCD_BACKLIGHT_TIMEOUT_MINS + if (backlight_off_ms && ELAPSED(ms, backlight_off_ms)) { - WRITE(LCD_BACKLIGHT_PIN, LOW); // Backlight off + #ifdef NEOPIXEL_BKGD_INDEX_FIRST + neo.set_background_off(); + neo.show(); + #elif PIN_EXIST(LCD_BACKLIGHT) + WRITE(LCD_BACKLIGHT_PIN, LOW); // Backlight off + #endif backlight_off_ms = 0; } #elif HAS_DISPLAY_SLEEP diff --git a/buildroot/tests/LPC1768 b/buildroot/tests/LPC1768 index 37cc705c0cb9..ee01bb621fcf 100755 --- a/buildroot/tests/LPC1768 +++ b/buildroot/tests/LPC1768 @@ -17,7 +17,7 @@ restore_configs opt_set MOTHERBOARD BOARD_RAMPS_14_RE_ARM_EFB SERIAL_PORT_3 3 \ NEOPIXEL_TYPE NEO_RGB RGB_LED_R_PIN P2_12 RGB_LED_G_PIN P1_23 RGB_LED_B_PIN P1_22 RGB_LED_W_PIN P1_24 opt_enable FYSETC_MINI_12864_2_1 SDSUPPORT SDCARD_READONLY SERIAL_PORT_2 RGBW_LED E_DUAL_STEPPER_DRIVERS \ - NEOPIXEL_LED NEOPIXEL_IS_SEQUENTIAL NEOPIXEL_STARTUP_TEST NEOPIXEL_BKGD_INDEX_FIRST NEOPIXEL_BKGD_INDEX_LAST NEOPIXEL_BKGD_COLOR NEOPIXEL_BKGD_ALWAYS_ON + NEOPIXEL_LED NEOPIXEL_IS_SEQUENTIAL NEOPIXEL_STARTUP_TEST NEOPIXEL_BKGD_INDEX_FIRST NEOPIXEL_BKGD_INDEX_LAST NEOPIXEL_BKGD_COLOR NEOPIXEL_BKGD_TIMEOUT_COLOR NEOPIXEL_BKGD_ALWAYS_ON exec_test $1 $2 "ReARM EFB VIKI2, SDSUPPORT, 2 Serial ports (USB CDC + UART0), NeoPixel" "$3" #restore_configs