From 4a40cf268d2aa4cf70cdbb05ec8e7054a8f0f35b Mon Sep 17 00:00:00 2001 From: nhchiu Date: Tue, 16 Jan 2018 12:53:18 +0800 Subject: [PATCH] Use NEOPIXEL as case light Add an option to use the NEOPIXEL LED as case light. --- .travis.yml | 2 +- Marlin/Configuration_adv.h | 4 ++++ Marlin/Marlin_main.cpp | 42 +++++++++++++++++++++++++++----------- Marlin/SanityCheck.h | 4 ++++ Marlin/leds.h | 15 ++++++++++++++ 5 files changed, 54 insertions(+), 13 deletions(-) diff --git a/.travis.yml b/.travis.yml index cf6db91c0..af89c286e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -94,7 +94,7 @@ script: - opt_enable REPRAP_DISCOUNT_SMART_CONTROLLER SDSUPPORT EEPROM_SETTINGS - opt_enable BLINKM PCA9632 RGB_LED NEOPIXEL_LED - opt_enable AUTO_BED_LEVELING_LINEAR Z_MIN_PROBE_REPEATABILITY_TEST DEBUG_LEVELING_FEATURE SKEW_CORRECTION SKEW_CORRECTION_FOR_Z SKEW_CORRECTION_GCODE - - opt_enable_adv FWRETRACT MAX7219_DEBUG LED_CONTROL_MENU + - opt_enable_adv FWRETRACT MAX7219_DEBUG LED_CONTROL_MENU CASE_LIGHT_ENABLE CASE_LIGHT_USE_NEOPIXEL - opt_set ABL_GRID_POINTS_X 16 - opt_set ABL_GRID_POINTS_Y 16 - opt_set_adv FANMUX0_PIN 53 diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 675ce563e..43204881d 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -243,6 +243,10 @@ #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) //#define MENU_ITEM_CASE_LIGHT // Add a Case Light option to the LCD main menu + //#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED. + #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } + #endif #endif //=========================================================================== diff --git a/Marlin/Marlin_main.cpp b/Marlin/Marlin_main.cpp index 4d633ef4d..d84907909 100644 --- a/Marlin/Marlin_main.cpp +++ b/Marlin/Marlin_main.cpp @@ -10608,26 +10608,44 @@ inline void gcode_M907() { #endif // HAS_MICROSTEPS #if HAS_CASE_LIGHT + #ifndef INVERT_CASE_LIGHT #define INVERT_CASE_LIGHT false #endif uint8_t case_light_brightness; // LCD routine wants INT bool case_light_on; + #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + LEDColor case_light_color = + #ifdef CASE_LIGHT_NEOPIXEL_COLOR + CASE_LIGHT_NEOPIXEL_COLOR + #else + { 255, 255, 255, 255 } + #endif + ; + #endif + void update_case_light() { - pinMode(CASE_LIGHT_PIN, OUTPUT); // digitalWrite doesn't set the port mode - if (case_light_on) { + const uint8_t i = case_light_on ? case_light_brightness : 0, n10ct = INVERT_CASE_LIGHT ? 255 - i : i; + + #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + + leds.set_color( + MakeLEDColor(case_light_color.r, case_light_color.g, case_light_color.b, case_light_color.w, n10ct), + false + ); + + #else // !CASE_LIGHT_USE_NEOPIXEL + + SET_OUTPUT(CASE_LIGHT_PIN); if (USEABLE_HARDWARE_PWM(CASE_LIGHT_PIN)) - analogWrite(CASE_LIGHT_PIN, INVERT_CASE_LIGHT ? 255 - case_light_brightness : case_light_brightness); - else - WRITE(CASE_LIGHT_PIN, INVERT_CASE_LIGHT ? LOW : HIGH); - } - else { - if (USEABLE_HARDWARE_PWM(CASE_LIGHT_PIN)) - analogWrite(CASE_LIGHT_PIN, INVERT_CASE_LIGHT ? 255 : 0); - else - WRITE(CASE_LIGHT_PIN, INVERT_CASE_LIGHT ? HIGH : LOW); - } + analogWrite(CASE_LIGHT_PIN, n10ct); + else { + const bool s = case_light_on ? !INVERT_CASE_LIGHT : INVERT_CASE_LIGHT; + WRITE(CASE_LIGHT_PIN, s ? HIGH : LOW); + } + + #endif // !CASE_LIGHT_USE_NEOPIXEL } #endif // HAS_CASE_LIGHT diff --git a/Marlin/SanityCheck.h b/Marlin/SanityCheck.h index a4c366507..43ad158a0 100644 --- a/Marlin/SanityCheck.h +++ b/Marlin/SanityCheck.h @@ -1621,6 +1621,10 @@ static_assert(COUNT(sanity_arr_3) <= XYZE_N, "DEFAULT_MAX_ACCELERATION has too m #error "LED_CONTROL_MENU requires an LCD controller." #endif +#if ENABLED(CASE_LIGHT_USE_NEOPIXEL) && DISABLED(NEOPIXEL_LED) + #error "CASE_LIGHT_USE_NEOPIXEL requires NEOPIXEL_LED." +#endif + #if ENABLED(SKEW_CORRECTION) #if !defined(XY_SKEW_FACTOR) && !(defined(XY_DIAG_AC) && defined(XY_DIAG_BD) && defined(XY_SIDE_AD)) #error "SKEW_CORRECTION requires XY_SKEW_FACTOR or XY_DIAG_AC, XY_DIAG_BD, XY_SIDE_AD." diff --git a/Marlin/leds.h b/Marlin/leds.h index a0cf28b84..f5e74b3ca 100644 --- a/Marlin/leds.h +++ b/Marlin/leds.h @@ -70,6 +70,21 @@ typedef struct LEDColor { #endif #endif {} + LEDColor(const uint8_t (&rgbw)[4]) : r(rgbw[0]), g(rgbw[1]), b(rgbw[2]) + #if HAS_WHITE_LED + , w(rgbw[3]) + #if ENABLED(NEOPIXEL_LED) + , i(NEOPIXEL_BRIGHTNESS) + #endif + #endif + {} + LEDColor& operator=(const uint8_t (&rgbw)[4]) { + r = rgbw[0]; g = rgbw[1]; b = rgbw[2]; + #if HAS_WHITE_LED + w = rgbw[3]; + #endif + return *this; + } LEDColor& operator=(const LEDColor &right) { if (this != &right) memcpy(this, &right, sizeof(LEDColor)); return *this;