Skip to content

Commit

Permalink
✨ LCD_BACKLIGHT_TIMEOUT for Neopixel LCD (MarlinFirmware#25438)
Browse files Browse the repository at this point in the history
  • Loading branch information
Daranbalt4 authored and thinkyhead committed Feb 28, 2023
1 parent 72efbf9 commit 93e9fe8
Show file tree
Hide file tree
Showing 6 changed files with 35 additions and 8 deletions.
3 changes: 2 additions & 1 deletion Marlin/Configuration.h
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
10 changes: 9 additions & 1 deletion Marlin/src/feature/leds/neopixel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
1 change: 1 addition & 0 deletions Marlin/src/feature/leds/neopixel.h
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand Down
8 changes: 7 additions & 1 deletion Marlin/src/inc/SanityCheck.h
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
19 changes: 15 additions & 4 deletions Marlin/src/lcd/marlinui.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion buildroot/tests/LPC1768
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 93e9fe8

Please sign in to comment.