♻️ LEDs refactor and extend (#21962)
Co-authored-by: Scott Lahteine <thinkyhead@users.noreply.github.com>
This commit is contained in:
		| @@ -2685,7 +2685,7 @@ | ||||
| //#define NEOPIXEL_LED | ||||
| #if ENABLED(NEOPIXEL_LED) | ||||
|   #define NEOPIXEL_TYPE   NEO_GRBW // NEO_GRBW / NEO_GRB - four/three channel driver type (defined in Adafruit_NeoPixel.h) | ||||
|   #define NEOPIXEL_PIN     4       // LED driving pin | ||||
|   //#define NEOPIXEL_PIN     4     // LED driving pin | ||||
|   //#define NEOPIXEL2_TYPE NEOPIXEL_TYPE | ||||
|   //#define NEOPIXEL2_PIN    5 | ||||
|   #define NEOPIXEL_PIXELS 30       // Number of LEDs in the strip. (Longest strip when NEOPIXEL2_SEPARATE is disabled.) | ||||
| @@ -2703,10 +2703,11 @@ | ||||
|     //#define NEOPIXEL2_INSERIES      // Default behavior is NeoPixel 2 in parallel | ||||
|   #endif | ||||
|  | ||||
|   // Use a single NeoPixel LED for static (background) lighting | ||||
|   //#define NEOPIXEL_BKGD_LED_INDEX  0               // Index of the LED to use | ||||
|   //#define NEOPIXEL_BKGD_COLOR { 255, 255, 255, 0 } // R, G, B, W | ||||
|   //#define NEOPIXEL_BKGD_ALWAYS_ON                  // Keep the backlight on when other NeoPixels are off | ||||
|   // 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_ALWAYS_ON                   // Keep the backlight on when other NeoPixels are off | ||||
| #endif | ||||
|  | ||||
| /** | ||||
|   | ||||
| @@ -65,9 +65,7 @@ void CaseLight::update(const bool sflag) { | ||||
|   #endif | ||||
|  | ||||
|   #if CASE_LIGHT_IS_COLOR_LED | ||||
|  | ||||
|     leds.set_color(MakeLEDColor(color.r, color.g, color.b, color.w, n10ct)); | ||||
|  | ||||
|     leds.set_color(LEDColor(color.r, color.g, color.b OPTARG(HAS_WHITE_LED, color.w), n10ct)); | ||||
|   #else // !CASE_LIGHT_IS_COLOR_LED | ||||
|  | ||||
|     #if CASELIGHT_USES_BRIGHTNESS | ||||
|   | ||||
| @@ -47,9 +47,10 @@ | ||||
| #endif | ||||
|  | ||||
| #if ENABLED(LED_COLOR_PRESETS) | ||||
|   const LEDColor LEDLights::defaultLEDColor = MakeLEDColor( | ||||
|     LED_USER_PRESET_RED, LED_USER_PRESET_GREEN, LED_USER_PRESET_BLUE, | ||||
|     LED_USER_PRESET_WHITE, LED_USER_PRESET_BRIGHTNESS | ||||
|   const LEDColor LEDLights::defaultLEDColor = LEDColor( | ||||
|     LED_USER_PRESET_RED, LED_USER_PRESET_GREEN, LED_USER_PRESET_BLUE | ||||
|     OPTARG(HAS_WHITE_LED, LED_USER_PRESET_WHITE) | ||||
|     OPTARG(NEOPIXEL_LED, LED_USER_PRESET_BRIGHTNESS) | ||||
|   ); | ||||
| #endif | ||||
|  | ||||
| @@ -75,34 +76,35 @@ void LEDLights::setup() { | ||||
| } | ||||
|  | ||||
| void LEDLights::set_color(const LEDColor &incol | ||||
|   OPTARG(NEOPIXEL_LED, bool isSequence/*=false*/) | ||||
|   OPTARG(NEOPIXEL_IS_SEQUENTIAL, bool isSequence/*=false*/) | ||||
| ) { | ||||
|  | ||||
|   #if ENABLED(NEOPIXEL_LED) | ||||
|  | ||||
|     const uint32_t neocolor = LEDColorWhite() == incol | ||||
|                             ? neo.Color(NEO_WHITE) | ||||
|                             : neo.Color(incol.r, incol.g, incol.b, incol.w); | ||||
|     static uint16_t nextLed = 0; | ||||
|                             : neo.Color(incol.r, incol.g, incol.b OPTARG(HAS_WHITE_LED, incol.w)); | ||||
|  | ||||
|     #ifdef NEOPIXEL_BKGD_LED_INDEX | ||||
|       if (NEOPIXEL_BKGD_LED_INDEX == nextLed) { | ||||
|         neo.set_color_background(); | ||||
|         if (++nextLed >= neo.pixels()) { | ||||
|           nextLed = 0; | ||||
|           return; | ||||
|     #if ENABLED(NEOPIXEL_IS_SEQUENTIAL) | ||||
|       static uint16_t nextLed = 0; | ||||
|       #ifdef NEOPIXEL_BKGD_INDEX_FIRST | ||||
|         while (WITHIN(nextLed, NEOPIXEL_BKGD_INDEX_FIRST, NEOPIXEL_BKGD_INDEX_LAST)) { | ||||
|           neo.reset_background_color(); | ||||
|           if (++nextLed >= neo.pixels()) { nextLed = 0; return; } | ||||
|         } | ||||
|       } | ||||
|       #endif | ||||
|     #endif | ||||
|  | ||||
|     neo.set_brightness(incol.i); | ||||
|  | ||||
|     if (isSequence) { | ||||
|       neo.set_pixel_color(nextLed, neocolor); | ||||
|       neo.show(); | ||||
|       if (++nextLed >= neo.pixels()) nextLed = 0; | ||||
|       return; | ||||
|     } | ||||
|     #if ENABLED(NEOPIXEL_IS_SEQUENTIAL) | ||||
|       if (isSequence) { | ||||
|         neo.set_pixel_color(nextLed, neocolor); | ||||
|         neo.show(); | ||||
|         if (++nextLed >= neo.pixels()) nextLed = 0; | ||||
|         return; | ||||
|       } | ||||
|     #endif | ||||
|  | ||||
|     neo.set_color(neocolor); | ||||
|  | ||||
| @@ -167,9 +169,10 @@ void LEDLights::set_color(const LEDColor &incol | ||||
| #if ENABLED(NEOPIXEL2_SEPARATE) | ||||
|  | ||||
|   #if ENABLED(NEO2_COLOR_PRESETS) | ||||
|     const LEDColor LEDLights2::defaultLEDColor = MakeLEDColor( | ||||
|       NEO2_USER_PRESET_RED, NEO2_USER_PRESET_GREEN, NEO2_USER_PRESET_BLUE, | ||||
|       NEO2_USER_PRESET_WHITE, NEO2_USER_PRESET_BRIGHTNESS | ||||
|     const LEDColor LEDLights2::defaultLEDColor = LEDColor( | ||||
|       LED_USER_PRESET_RED, LED_USER_PRESET_GREEN, LED_USER_PRESET_BLUE | ||||
|       OPTARG(HAS_WHITE_LED2, LED_USER_PRESET_WHITE) | ||||
|       OPTARG(NEOPIXEL_LED, LED_USER_PRESET_BRIGHTNESS) | ||||
|     ); | ||||
|   #endif | ||||
|  | ||||
| @@ -188,7 +191,7 @@ void LEDLights::set_color(const LEDColor &incol | ||||
|   void LEDLights2::set_color(const LEDColor &incol) { | ||||
|     const uint32_t neocolor = LEDColorWhite() == incol | ||||
|                             ? neo2.Color(NEO2_WHITE) | ||||
|                             : neo2.Color(incol.r, incol.g, incol.b, incol.w); | ||||
|                             : neo2.Color(incol.r, incol.g, incol.b OPTARG(HAS_WHITE_LED2, incol.w)); | ||||
|     neo2.set_brightness(incol.i); | ||||
|     neo2.set_color(neocolor); | ||||
|  | ||||
|   | ||||
| @@ -29,13 +29,15 @@ | ||||
|  | ||||
| #include <string.h> | ||||
|  | ||||
| #if ENABLED(NEOPIXEL_LED) | ||||
|   #include "neopixel.h" | ||||
| // A white component can be passed | ||||
| #if EITHER(RGBW_LED, PCA9632_RGBW) | ||||
|   #define HAS_WHITE_LED 1 | ||||
| #endif | ||||
|  | ||||
| // A white component can be passed | ||||
| #if ANY(RGBW_LED, NEOPIXEL_LED, PCA9632_RGBW) | ||||
|   #define HAS_WHITE_LED 1 | ||||
| #if ENABLED(NEOPIXEL_LED) | ||||
|   #define _NEOPIXEL_INCLUDE_ | ||||
|   #include "neopixel.h" | ||||
|   #undef _NEOPIXEL_INCLUDE_ | ||||
| #endif | ||||
|  | ||||
| /** | ||||
| @@ -84,9 +86,8 @@ typedef struct LEDColor { | ||||
| } LEDColor; | ||||
|  | ||||
| /** | ||||
|  * Color helpers and presets | ||||
|  * Color presets | ||||
|  */ | ||||
| #define MakeLEDColor(R,G,B,W,I)   LEDColor(R, G, B OPTARG(HAS_WHITE_LED, W) OPTARG(NEOPIXEL_LED, I)) | ||||
|  | ||||
| #define LEDColorOff()             LEDColor(  0,   0,   0) | ||||
| #define LEDColorRed()             LEDColor(255,   0,   0) | ||||
| @@ -114,15 +115,15 @@ public: | ||||
|   static void setup(); // init() | ||||
|  | ||||
|   static void set_color(const LEDColor &color | ||||
|     OPTARG(NEOPIXEL_LED, bool isSequence=false) | ||||
|     OPTARG(NEOPIXEL_IS_SEQUENTIAL, bool isSequence=false) | ||||
|   ); | ||||
|  | ||||
|   static inline void set_color(uint8_t r, uint8_t g, uint8_t b | ||||
|     OPTARG(HAS_WHITE_LED, uint8_t w=0) | ||||
|     OPTARG(NEOPIXEL_LED, uint8_t i=NEOPIXEL_BRIGHTNESS) | ||||
|     OPTARG(NEOPIXEL_LED, bool isSequence=false) | ||||
|     OPTARG(NEOPIXEL_IS_SEQUENTIAL, bool isSequence=false) | ||||
|   ) { | ||||
|     set_color(MakeLEDColor(r, g, b, w, i) OPTARG(NEOPIXEL_LED, isSequence)); | ||||
|     set_color(LEDColor(r, g, b OPTARG(HAS_WHITE_LED, w) OPTARG(NEOPIXEL_LED, i)) OPTARG(NEOPIXEL_IS_SEQUENTIAL, isSequence)); | ||||
|   } | ||||
|  | ||||
|   static inline void set_off()   { set_color(LEDColorOff()); } | ||||
| @@ -180,8 +181,14 @@ extern LEDLights leds; | ||||
|  | ||||
|     static void set_color(const LEDColor &color); | ||||
|  | ||||
|     inline void set_color(uint8_t r, uint8_t g, uint8_t b, uint8_t w=0, uint8_t i=NEOPIXEL2_BRIGHTNESS) { | ||||
|       set_color(MakeLEDColor(r, g, b, w, i)); | ||||
|     static inline void set_color(uint8_t r, uint8_t g, uint8_t b | ||||
|       OPTARG(HAS_WHITE_LED, uint8_t w=0) | ||||
|       OPTARG(NEOPIXEL_LED, uint8_t i=NEOPIXEL_BRIGHTNESS) | ||||
|     ) { | ||||
|       set_color(LEDColor(r, g, b | ||||
|         OPTARG(HAS_WHITE_LED, w) | ||||
|         OPTARG(NEOPIXEL_LED, i) | ||||
|       )); | ||||
|     } | ||||
|  | ||||
|     static inline void set_off()   { set_color(LEDColorOff()); } | ||||
|   | ||||
| @@ -28,7 +28,7 @@ | ||||
|  | ||||
| #if ENABLED(NEOPIXEL_LED) | ||||
|  | ||||
| #include "neopixel.h" | ||||
| #include "leds.h" | ||||
|  | ||||
| #if EITHER(NEOPIXEL_STARTUP_TEST, NEOPIXEL2_STARTUP_TEST) | ||||
|   #include "../../core/utility.h" | ||||
| @@ -37,17 +37,21 @@ | ||||
| Marlin_NeoPixel neo; | ||||
| int8_t Marlin_NeoPixel::neoindex; | ||||
|  | ||||
| Adafruit_NeoPixel Marlin_NeoPixel::adaneo1(NEOPIXEL_PIXELS, NEOPIXEL_PIN, NEOPIXEL_TYPE + NEO_KHZ800) | ||||
|   #if CONJOINED_NEOPIXEL | ||||
|     , Marlin_NeoPixel::adaneo2(NEOPIXEL_PIXELS, NEOPIXEL2_PIN, NEOPIXEL2_TYPE + NEO_KHZ800) | ||||
|   #endif | ||||
| ; | ||||
| Adafruit_NeoPixel Marlin_NeoPixel::adaneo1(NEOPIXEL_PIXELS, NEOPIXEL_PIN, NEOPIXEL_TYPE + NEO_KHZ800); | ||||
| #if CONJOINED_NEOPIXEL | ||||
|   Adafruit_NeoPixel Marlin_NeoPixel::adaneo2(NEOPIXEL_PIXELS, NEOPIXEL2_PIN, NEOPIXEL2_TYPE + NEO_KHZ800); | ||||
| #endif | ||||
|  | ||||
| #ifdef NEOPIXEL_BKGD_LED_INDEX | ||||
| #ifdef NEOPIXEL_BKGD_INDEX_FIRST | ||||
|  | ||||
|   void Marlin_NeoPixel::set_color_background() { | ||||
|     uint8_t background_color[4] = NEOPIXEL_BKGD_COLOR; | ||||
|     set_pixel_color(NEOPIXEL_BKGD_LED_INDEX, adaneo1.Color(background_color[0], background_color[1], background_color[2], background_color[3])); | ||||
|   void Marlin_NeoPixel::set_background_color(uint8_t r, uint8_t g, uint8_t b, uint8_t w) { | ||||
|     for  (int background_led = NEOPIXEL_BKGD_INDEX_FIRST; background_led <= NEOPIXEL_BKGD_INDEX_LAST; background_led++) | ||||
|       set_pixel_color(background_led, adaneo1.Color(r, g, b, w)); | ||||
|   } | ||||
|  | ||||
|   void Marlin_NeoPixel::reset_background_color() { | ||||
|     constexpr uint8_t background_color[4] = NEOPIXEL_BKGD_COLOR; | ||||
|     set_background_color(background_color[0], background_color[1], background_color[2], background_color[3]); | ||||
|   } | ||||
|  | ||||
| #endif | ||||
| @@ -59,9 +63,10 @@ void Marlin_NeoPixel::set_color(const uint32_t color) { | ||||
|   } | ||||
|   else { | ||||
|     for (uint16_t i = 0; i < pixels(); ++i) { | ||||
|       #ifdef NEOPIXEL_BKGD_LED_INDEX | ||||
|         if (i == NEOPIXEL_BKGD_LED_INDEX && TERN(NEOPIXEL_BKGD_ALWAYS_ON, true, color != 0x000000)) { | ||||
|           set_color_background(); | ||||
|       #ifdef NEOPIXEL_BKGD_INDEX_FIRST | ||||
|         if (i == NEOPIXEL_BKGD_INDEX_FIRST && TERN(NEOPIXEL_BKGD_ALWAYS_ON, true, color != 0x000000)) { | ||||
|           reset_background_color(); | ||||
|           i += NEOPIXEL_BKGD_INDEX_LAST - (NEOPIXEL_BKGD_INDEX_FIRST); | ||||
|           continue; | ||||
|         } | ||||
|       #endif | ||||
| @@ -90,36 +95,23 @@ void Marlin_NeoPixel::init() { | ||||
|     safe_delay(500); | ||||
|     set_color_startup(adaneo1.Color(0, 0, 255, 0));  // blue | ||||
|     safe_delay(500); | ||||
|     #if HAS_WHITE_LED | ||||
|       set_color_startup(adaneo1.Color(0, 0, 0, 255));  // white | ||||
|       safe_delay(500); | ||||
|     #endif | ||||
|   #endif | ||||
|  | ||||
|   #ifdef NEOPIXEL_BKGD_LED_INDEX | ||||
|     set_color_background(); | ||||
|   #ifdef NEOPIXEL_BKGD_INDEX_FIRST | ||||
|     reset_background_color(); | ||||
|   #endif | ||||
|  | ||||
|   #if ENABLED(LED_USER_PRESET_STARTUP) | ||||
|     set_color(adaneo1.Color(LED_USER_PRESET_RED, LED_USER_PRESET_GREEN, LED_USER_PRESET_BLUE, LED_USER_PRESET_WHITE)); | ||||
|   #else | ||||
|     set_color(adaneo1.Color(0, 0, 0, 0)); | ||||
|   #endif | ||||
|   set_color(adaneo1.Color | ||||
|     TERN(LED_USER_PRESET_STARTUP, | ||||
|       (LED_USER_PRESET_RED, LED_USER_PRESET_GREEN, LED_USER_PRESET_BLUE, LED_USER_PRESET_WHITE), | ||||
|       (0, 0, 0, 0)) | ||||
|   ); | ||||
| } | ||||
|  | ||||
| #if 0 | ||||
| bool Marlin_NeoPixel::set_led_color(const uint8_t r, const uint8_t g, const uint8_t b, const uint8_t w, const uint8_t p) { | ||||
|   const uint32_t color = adaneo1.Color(r, g, b, w); | ||||
|   set_brightness(p); | ||||
|   #if DISABLED(NEOPIXEL_IS_SEQUENTIAL) | ||||
|     set_color(color); | ||||
|     return false; | ||||
|   #else | ||||
|     static uint16_t nextLed = 0; | ||||
|     set_pixel_color(nextLed, color); | ||||
|     show(); | ||||
|     if (++nextLed >= pixels()) nextLed = 0; | ||||
|     return true; | ||||
|   #endif | ||||
| } | ||||
| #endif | ||||
|  | ||||
| #if ENABLED(NEOPIXEL2_SEPARATE) | ||||
|  | ||||
|   Marlin_NeoPixel2 neo2; | ||||
| @@ -158,13 +150,17 @@ bool Marlin_NeoPixel::set_led_color(const uint8_t r, const uint8_t g, const uint | ||||
|       safe_delay(500); | ||||
|       set_color_startup(adaneo.Color(0, 0, 255, 0));  // blue | ||||
|       safe_delay(500); | ||||
|       #if HAS_WHITE_LED2 | ||||
|         set_color_startup(adaneo.Color(0, 0, 0, 255));  // white | ||||
|         safe_delay(500); | ||||
|       #endif | ||||
|     #endif | ||||
|  | ||||
|     #if ENABLED(NEO2_USER_PRESET_STARTUP) | ||||
|       set_color(adaneo.Color(NEO2_USER_PRESET_RED, NEO2_USER_PRESET_GREEN, NEO2_USER_PRESET_BLUE, NEO2_USER_PRESET_WHITE)); | ||||
|     #else | ||||
|       set_color(adaneo.Color(0, 0, 0, 0)); | ||||
|     #endif | ||||
|     set_color(adaneo.Color | ||||
|       TERN(NEO2_USER_PRESET_STARTUP, | ||||
|         (NEO2_USER_PRESET_RED, NEO2_USER_PRESET_GREEN, NEO2_USER_PRESET_BLUE, NEO2_USER_PRESET_WHITE), | ||||
|         (0, 0, 0, 0)) | ||||
|     ); | ||||
|   } | ||||
|  | ||||
| #endif // NEOPIXEL2_SEPARATE | ||||
|   | ||||
| @@ -25,6 +25,10 @@ | ||||
|  * NeoPixel support | ||||
|  */ | ||||
|  | ||||
| #ifndef _NEOPIXEL_INCLUDE_ | ||||
|   #error "Always include 'leds.h' and not 'neopixel.h' directly." | ||||
| #endif | ||||
|  | ||||
| // ------------------------ | ||||
| // Includes | ||||
| // ------------------------ | ||||
| @@ -38,6 +42,18 @@ | ||||
| // Defines | ||||
| // ------------------------ | ||||
|  | ||||
| #define _NEO_IS_RGB(N) (N == NEO_RGB || N == NEO_RBG || N == NEO_GRB || N == NEO_GBR || N == NEO_BRG || N == NEO_BGR) | ||||
|  | ||||
| #if !_NEO_IS_RGB(NEOPIXEL_TYPE) | ||||
|   #define HAS_WHITE_LED 1 | ||||
| #endif | ||||
|  | ||||
| #if HAS_WHITE_LED | ||||
|   #define NEO_WHITE 0, 0, 0, 255 | ||||
| #else | ||||
|   #define NEO_WHITE 255, 255, 255 | ||||
| #endif | ||||
|  | ||||
| #if defined(NEOPIXEL2_TYPE) && NEOPIXEL2_TYPE != NEOPIXEL_TYPE && DISABLED(NEOPIXEL2_SEPARATE) | ||||
|   #define MULTIPLE_NEOPIXEL_TYPES 1 | ||||
| #endif | ||||
| @@ -46,29 +62,16 @@ | ||||
|   #define CONJOINED_NEOPIXEL 1 | ||||
| #endif | ||||
|  | ||||
| #if NEOPIXEL_TYPE == NEO_RGB || NEOPIXEL_TYPE == NEO_RBG || NEOPIXEL_TYPE == NEO_GRB || NEOPIXEL_TYPE == NEO_GBR || NEOPIXEL_TYPE == NEO_BRG || NEOPIXEL_TYPE == NEO_BGR | ||||
|   #define NEOPIXEL_IS_RGB 1 | ||||
| #else | ||||
|   #define NEOPIXEL_IS_RGBW 1 | ||||
| #endif | ||||
|  | ||||
| #if NEOPIXEL_IS_RGB | ||||
|   #define NEO_WHITE 255, 255, 255, 0 | ||||
| #else | ||||
|   #define NEO_WHITE 0, 0, 0, 255 | ||||
| #endif | ||||
|  | ||||
| // ------------------------ | ||||
| // Function prototypes | ||||
| // ------------------------ | ||||
|  | ||||
| class Marlin_NeoPixel { | ||||
| private: | ||||
|   static Adafruit_NeoPixel adaneo1 | ||||
|     #if CONJOINED_NEOPIXEL | ||||
|       , adaneo2 | ||||
|     #endif | ||||
|   ; | ||||
|   static Adafruit_NeoPixel adaneo1; | ||||
|   #if CONJOINED_NEOPIXEL | ||||
|     static Adafruit_NeoPixel adaneo2; | ||||
|   #endif | ||||
|  | ||||
| public: | ||||
|   static int8_t neoindex; | ||||
| @@ -78,8 +81,9 @@ public: | ||||
|  | ||||
|   static void set_color(const uint32_t c); | ||||
|  | ||||
|   #ifdef NEOPIXEL_BKGD_LED_INDEX | ||||
|     static void set_color_background(); | ||||
|   #ifdef NEOPIXEL_BKGD_INDEX_FIRST | ||||
|     static void set_background_color(uint8_t r, uint8_t g, uint8_t b, uint8_t w); | ||||
|     static void reset_background_color(); | ||||
|   #endif | ||||
|  | ||||
|   static inline void begin() { | ||||
| @@ -93,9 +97,7 @@ public: | ||||
|       else adaneo1.setPixelColor(n, c); | ||||
|     #else | ||||
|       adaneo1.setPixelColor(n, c); | ||||
|       #if MULTIPLE_NEOPIXEL_TYPES | ||||
|         adaneo2.setPixelColor(n, c); | ||||
|       #endif | ||||
|       TERN_(MULTIPLE_NEOPIXEL_TYPES, adaneo2.setPixelColor(n, c)); | ||||
|     #endif | ||||
|   } | ||||
|  | ||||
| @@ -120,15 +122,13 @@ public: | ||||
|     TERN_(HAS_PAUSE_SERVO_OUTPUT, RESUME_SERVO_OUTPUT()); | ||||
|   } | ||||
|  | ||||
|   #if 0 | ||||
|     bool set_led_color(const uint8_t r, const uint8_t g, const uint8_t b, const uint8_t w, const uint8_t p); | ||||
|   #endif | ||||
|  | ||||
|   // Accessors | ||||
|   static inline uint16_t pixels() { TERN(NEOPIXEL2_INSERIES, return adaneo1.numPixels() * 2, return adaneo1.numPixels()); } | ||||
|   static inline uint16_t pixels() { return adaneo1.numPixels() * TERN1(NEOPIXEL2_INSERIES, 2); } | ||||
|  | ||||
|   static inline uint8_t brightness() { return adaneo1.getBrightness(); } | ||||
|   static inline uint32_t Color(uint8_t r, uint8_t g, uint8_t b, uint8_t w) { | ||||
|     return adaneo1.Color(r, g, b, w); | ||||
|  | ||||
|   static inline uint32_t Color(uint8_t r, uint8_t g, uint8_t b OPTARG(HAS_WHITE_LED, uint8_t w)) { | ||||
|     return adaneo1.Color(r, g, b OPTARG(HAS_WHITE_LED, w)); | ||||
|   } | ||||
| }; | ||||
|  | ||||
| @@ -137,15 +137,12 @@ extern Marlin_NeoPixel neo; | ||||
| // Neo pixel channel 2 | ||||
| #if ENABLED(NEOPIXEL2_SEPARATE) | ||||
|  | ||||
|   #if NEOPIXEL2_TYPE == NEO_RGB || NEOPIXEL2_TYPE == NEO_RBG || NEOPIXEL2_TYPE == NEO_GRB || NEOPIXEL2_TYPE == NEO_GBR || NEOPIXEL2_TYPE == NEO_BRG || NEOPIXEL2_TYPE == NEO_BGR | ||||
|   #if _NEO_IS_RGB(NEOPIXEL2_TYPE) | ||||
|     #define NEOPIXEL2_IS_RGB 1 | ||||
|     #define NEO2_WHITE 255, 255, 255 | ||||
|   #else | ||||
|     #define NEOPIXEL2_IS_RGBW 1 | ||||
|   #endif | ||||
|  | ||||
|   #if NEOPIXEL2_IS_RGB | ||||
|     #define NEO2_WHITE 255, 255, 255, 0 | ||||
|   #else | ||||
|     #define HAS_WHITE_LED2 1      // A white component can be passed for NEOPIXEL2 | ||||
|     #define NEO2_WHITE 0, 0, 0, 255 | ||||
|   #endif | ||||
|  | ||||
| @@ -172,11 +169,13 @@ extern Marlin_NeoPixel neo; | ||||
|     // Accessors | ||||
|     static inline uint16_t pixels() { return adaneo.numPixels();} | ||||
|     static inline uint8_t brightness() { return adaneo.getBrightness(); } | ||||
|     static inline uint32_t Color(uint8_t r, uint8_t g, uint8_t b, uint8_t w) { | ||||
|       return adaneo.Color(r, g, b, w); | ||||
|     static inline uint32_t Color(uint8_t r, uint8_t g, uint8_t b OPTARG(HAS_WHITE_LED2, uint8_t w)) { | ||||
|       return adaneo.Color(r, g, b OPTARG(HAS_WHITE_LED2, w)); | ||||
|     } | ||||
|   }; | ||||
|  | ||||
|   extern Marlin_NeoPixel2 neo2; | ||||
|  | ||||
| #endif // NEOPIXEL2_SEPARATE | ||||
|  | ||||
| #undef _NEO_IS_RGB | ||||
|   | ||||
| @@ -45,12 +45,10 @@ PrinterEventLEDs printerEventLEDs; | ||||
|     return (uint8_t)map(constrain(current, start, target), start, target, 0, 255); | ||||
|   } | ||||
|  | ||||
|   inline void pel_set_rgb(const uint8_t r, const uint8_t g, const uint8_t b) { | ||||
|   inline void pel_set_rgb(const uint8_t r, const uint8_t g, const uint8_t b OPTARG(HAS_WHITE_LED, const uint8_t w=0)) { | ||||
|     leds.set_color( | ||||
|       MakeLEDColor(r, g, b, 0, neo.brightness()) | ||||
|       #if ENABLED(NEOPIXEL_IS_SEQUENTIAL) | ||||
|         , true | ||||
|       #endif | ||||
|       LEDColor(r, g, b OPTARG(HAS_WHITE_LED, w) OPTARG(NEOPIXEL_LED, neo.brightness())) | ||||
|       OPTARG(NEOPIXEL_IS_SEQUENTIAL, true) | ||||
|     ); | ||||
|   } | ||||
|  | ||||
|   | ||||
| @@ -66,12 +66,12 @@ void GcodeSuite::M150() { | ||||
|     #endif | ||||
|   #endif | ||||
|  | ||||
|   const LEDColor color = MakeLEDColor( | ||||
|   const LEDColor color = LEDColor( | ||||
|     parser.seen('R') ? (parser.has_value() ? parser.value_byte() : 255) : 0, | ||||
|     parser.seen('U') ? (parser.has_value() ? parser.value_byte() : 255) : 0, | ||||
|     parser.seen('B') ? (parser.has_value() ? parser.value_byte() : 255) : 0, | ||||
|     parser.seen('W') ? (parser.has_value() ? parser.value_byte() : 255) : 0, | ||||
|     parser.seen('P') ? (parser.has_value() ? parser.value_byte() : 255) : brightness | ||||
|     parser.seen('B') ? (parser.has_value() ? parser.value_byte() : 255) : 0 | ||||
|     OPTARG(HAS_WHITE_LED, parser.seen('W') ? (parser.has_value() ? parser.value_byte() : 255) : 0) | ||||
|     OPTARG(NEOPIXEL_LED, parser.seen('P') ? (parser.has_value() ? parser.value_byte() : 255) : brightness) | ||||
|   ); | ||||
|  | ||||
|   #if ENABLED(NEOPIXEL2_SEPARATE) | ||||
|   | ||||
| @@ -1303,3 +1303,10 @@ | ||||
| #else | ||||
|   #define COORDINATE_OKAY(N,L,H) true | ||||
| #endif | ||||
|  | ||||
| /** | ||||
|  * LED Backlight INDEX END | ||||
|  */ | ||||
| #if defined(NEOPIXEL_BKGD_INDEX_FIRST) && !defined(NEOPIXEL_BKGD_INDEX_LAST) | ||||
|   #define NEOPIXEL_BKGD_INDEX_LAST NEOPIXEL_BKGD_INDEX_FIRST | ||||
| #endif | ||||
|   | ||||
| @@ -562,6 +562,8 @@ | ||||
|   #error "CUSTOM_USER_MENUS has been replaced by CUSTOM_MENU_MAIN and CUSTOM_MENU_CONFIG." | ||||
| #elif defined(MKS_LCD12864) | ||||
|   #error "MKS_LCD12864 is now MKS_LCD12864A or MKS_LCD12864B." | ||||
| #elif defined(NEOPIXEL_BKGD_LED_INDEX) | ||||
|   #error "NEOPIXEL_BKGD_LED_INDEX is now NEOPIXEL_BKGD_INDEX_FIRST." | ||||
| #endif | ||||
|  | ||||
| /** | ||||
|   | ||||
| @@ -636,8 +636,8 @@ void MarlinUI::kill_screen(PGM_P lcd_error, PGM_P lcd_component) { | ||||
|   // RED ALERT. RED ALERT. | ||||
|   #ifdef LED_BACKLIGHT_TIMEOUT | ||||
|     leds.set_color(LEDColorRed()); | ||||
|     #ifdef NEOPIXEL_BKGD_LED_INDEX | ||||
|       neo.set_pixel_color(NEOPIXEL_BKGD_LED_INDEX, 255, 0, 0, 0); | ||||
|     #ifdef NEOPIXEL_BKGD_INDEX_FIRST | ||||
|       neo.set_background_color(255, 0, 0, 0); | ||||
|       neo.show(); | ||||
|     #endif | ||||
|   #endif | ||||
|   | ||||
| @@ -84,18 +84,20 @@ | ||||
|     EDIT_ITEM(uint8, MSG_INTENSITY_R, &leds.color.r, 0, 255, leds.update, true); | ||||
|     EDIT_ITEM(uint8, MSG_INTENSITY_G, &leds.color.g, 0, 255, leds.update, true); | ||||
|     EDIT_ITEM(uint8, MSG_INTENSITY_B, &leds.color.b, 0, 255, leds.update, true); | ||||
|     #if EITHER(RGBW_LED, NEOPIXEL_LED) | ||||
|     #if HAS_WHITE_LED | ||||
|       EDIT_ITEM(uint8, MSG_INTENSITY_W, &leds.color.w, 0, 255, leds.update, true); | ||||
|       #if ENABLED(NEOPIXEL_LED) | ||||
|         EDIT_ITEM(uint8, MSG_LED_BRIGHTNESS, &leds.color.i, 0, 255, leds.update, true); | ||||
|       #endif | ||||
|     #endif | ||||
|     #if ENABLED(NEOPIXEL_LED) | ||||
|       EDIT_ITEM(uint8, MSG_LED_BRIGHTNESS, &leds.color.i, 0, 255, leds.update, true); | ||||
|     #endif | ||||
|     #if ENABLED(NEOPIXEL2_SEPARATE) | ||||
|       STATIC_ITEM_N(MSG_LED_CHANNEL_N, 2, SS_DEFAULT|SS_INVERT); | ||||
|       EDIT_ITEM(uint8, MSG_INTENSITY_R, &leds2.color.r, 0, 255, leds2.update, true); | ||||
|       EDIT_ITEM(uint8, MSG_INTENSITY_G, &leds2.color.g, 0, 255, leds2.update, true); | ||||
|       EDIT_ITEM(uint8, MSG_INTENSITY_B, &leds2.color.b, 0, 255, leds2.update, true); | ||||
|       EDIT_ITEM(uint8, MSG_INTENSITY_W, &leds2.color.w, 0, 255, leds2.update, true); | ||||
|       #if HAS_WHITE_LED2 | ||||
|         EDIT_ITEM(uint8, MSG_INTENSITY_W, &leds2.color.w, 0, 255, leds2.update, true); | ||||
|       #endif | ||||
|       EDIT_ITEM(uint8, MSG_NEO2_BRIGHTNESS, &leds2.color.i, 0, 255, leds2.update, true); | ||||
|     #endif | ||||
|     END_MENU(); | ||||
|   | ||||
| @@ -18,7 +18,7 @@ opt_enable S_CURVE_ACCELERATION EEPROM_SETTINGS GCODE_MACROS \ | ||||
|            ASSISTED_TRAMMING ASSISTED_TRAMMING_WIZARD REPORT_TRAMMING_MM ASSISTED_TRAMMING_WAIT_POSITION \ | ||||
|            EEPROM_SETTINGS SDSUPPORT BINARY_FILE_TRANSFER \ | ||||
|            BLINKM PCA9533 PCA9632 RGB_LED RGB_LED_R_PIN RGB_LED_G_PIN RGB_LED_B_PIN LED_CONTROL_MENU \ | ||||
|            NEOPIXEL_LED CASE_LIGHT_ENABLE CASE_LIGHT_USE_NEOPIXEL CASE_LIGHT_USE_RGB_LED CASE_LIGHT_MENU \ | ||||
|            NEOPIXEL_LED NEOPIXEL_PIN CASE_LIGHT_ENABLE CASE_LIGHT_USE_NEOPIXEL CASE_LIGHT_USE_RGB_LED CASE_LIGHT_MENU \ | ||||
|            NOZZLE_PARK_FEATURE ADVANCED_PAUSE_FEATURE FILAMENT_RUNOUT_DISTANCE_MM FILAMENT_RUNOUT_SENSOR \ | ||||
|            AUTO_BED_LEVELING_BILINEAR Z_MIN_PROBE_REPEATABILITY_TEST DEBUG_LEVELING_FEATURE \ | ||||
|            SKEW_CORRECTION SKEW_CORRECTION_FOR_Z SKEW_CORRECTION_GCODE CALIBRATION_GCODE \ | ||||
|   | ||||
| @@ -14,8 +14,10 @@ set -e | ||||
| #exec_test $1 $2 "Default Configuration" "$3" | ||||
|  | ||||
| restore_configs | ||||
| opt_set MOTHERBOARD BOARD_RAMPS_14_RE_ARM_EFB NEOPIXEL_PIN P1_16 SERIAL_PORT_3 3 | ||||
| opt_enable VIKI2 SDSUPPORT SDCARD_READONLY SERIAL_PORT_2 NEOPIXEL_LED | ||||
| opt_set MOTHERBOARD BOARD_RAMPS_14_RE_ARM_EFB  SERIAL_PORT_3 3 \ | ||||
|         NEOPIXEL_TYPE NEO_GRB 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 \ | ||||
|            NEOPIXEL_LED NEOPIXEL_IS_SEQUENTIAL NEOPIXEL_STARTUP_TEST NEOPIXEL_BKGD_INDEX_FIRST NEOPIXEL_BKGD_INDEX_LAST NEOPIXEL_BKGD_COLOR NEOPIXEL_BKGD_ALWAYS_ON | ||||
| exec_test $1 $2 "ReARM EFB VIKI2, SDSUPPORT, 2 Serial ports (USB CDC + UART0), NeoPixel" "$3" | ||||
|  | ||||
| #restore_configs | ||||
|   | ||||
| @@ -22,7 +22,7 @@ opt_enable USE_ZMAX_PLUG REPRAP_DISCOUNT_SMART_CONTROLLER LCD_PROGRESS_BAR LCD_P | ||||
|            PREHEAT_BEFORE_PROBING PROBING_HEATERS_OFF PROBING_FANS_OFF PROBING_STEPPERS_OFF WAIT_FOR_BED_HEATER \ | ||||
|            EEPROM_SETTINGS SDSUPPORT SD_REPRINT_LAST_SELECTED_FILE BINARY_FILE_TRANSFER \ | ||||
|            BLINKM PCA9533 PCA9632 RGB_LED RGB_LED_R_PIN RGB_LED_G_PIN RGB_LED_B_PIN LED_CONTROL_MENU \ | ||||
|            NEOPIXEL_LED CASE_LIGHT_ENABLE CASE_LIGHT_USE_NEOPIXEL CASE_LIGHT_MENU \ | ||||
|            NEOPIXEL_LED NEOPIXEL_PIN CASE_LIGHT_ENABLE CASE_LIGHT_USE_NEOPIXEL CASE_LIGHT_MENU \ | ||||
|            PID_PARAMS_PER_HOTEND PID_AUTOTUNE_MENU PID_EDIT_MENU LCD_SHOW_E_TOTAL \ | ||||
|            PRINTCOUNTER SERVICE_NAME_1 SERVICE_INTERVAL_1 LEVEL_BED_CORNERS LEVEL_CENTER_TOO \ | ||||
|            NOZZLE_PARK_FEATURE FILAMENT_RUNOUT_SENSOR FILAMENT_RUNOUT_DISTANCE_MM \ | ||||
|   | ||||
		Reference in New Issue
	
	Block a user