diff --git a/Marlin/src/feature/leds/neopixel.cpp b/Marlin/src/feature/leds/neopixel.cpp
index 3c2c0b44fc77fca776f9bc55c7936c23c58275fb..3d11c5b64efc703ec945f5f8bb064211561b2e24 100644
--- a/Marlin/src/feature/leds/neopixel.cpp
+++ b/Marlin/src/feature/leds/neopixel.cpp
@@ -35,6 +35,7 @@
#endif
Marlin_NeoPixel neo;
+int8_t Marlin_NeoPixel::neoindex;
Adafruit_NeoPixel Marlin_NeoPixel::adaneo1(NEOPIXEL_PIXELS, NEOPIXEL_PIN, NEOPIXEL_TYPE + NEO_KHZ800)
#if MULTIPLE_NEOPIXEL_TYPES
@@ -52,14 +53,20 @@ Adafruit_NeoPixel Marlin_NeoPixel::adaneo1(NEOPIXEL_PIXELS, NEOPIXEL_PIN, NEOPIX
#endif
void Marlin_NeoPixel::set_color(const uint32_t color) {
- for (uint16_t i = 0; i < pixels(); ++i) {
- #ifdef NEOPIXEL_BKGD_LED_INDEX
- if (i == NEOPIXEL_BKGD_LED_INDEX && color != 0x000000) {
- set_color_background();
- continue;
- }
- #endif
- set_pixel_color(i, color);
+ if (get_neo_index() < 0) {
+ set_pixel_color(get_neo_index(), color);
+ set_neo_index(-1);
+ }
+ else {
+ for (uint16_t i = 0; i < pixels(); ++i) {
+ #ifdef NEOPIXEL_BKGD_LED_INDEX
+ if (i == NEOPIXEL_BKGD_LED_INDEX && color != 0x000000) {
+ set_color_background();
+ continue;
+ }
+ #endif
+ set_pixel_color(i, color);
+ }
}
show();
}
@@ -71,7 +78,8 @@ void Marlin_NeoPixel::set_color_startup(const uint32_t color) {
}
void Marlin_NeoPixel::init() {
- set_brightness(NEOPIXEL_BRIGHTNESS); // 0 - 255 range
+ set_neo_index(-1); // -1 .. NEOPIXEL_PIXELS-1 range
+ set_brightness(NEOPIXEL_BRIGHTNESS); // 0 .. 255 range
begin();
show(); // initialize to all off
diff --git a/Marlin/src/feature/leds/neopixel.h b/Marlin/src/feature/leds/neopixel.h
index 1b1b74fdfebd91c837391e795a23b16e63e1b522..631e4fa00447cdfc7c5d0621b30c8b2c39ddbf71 100644
--- a/Marlin/src/feature/leds/neopixel.h
+++ b/Marlin/src/feature/leds/neopixel.h
@@ -65,6 +65,7 @@ private:
, adaneo2
#endif
;
+ static int8_t neoindex;
public:
static void init();
@@ -72,6 +73,9 @@ public:
static void set_color(const uint32_t c);
+ FORCE_INLINE static void set_neo_index(const int8_t neoIndex) { neoindex = neoIndex; }
+ FORCE_INLINE static int8_t get_neo_index() { return neoindex; }
+
#ifdef NEOPIXEL_BKGD_LED_INDEX
static void set_color_background();
#endif
diff --git a/Marlin/src/gcode/feature/leds/M150.cpp b/Marlin/src/gcode/feature/leds/M150.cpp
index 656b7e5f9035268643c675455901288e6c5ad993..a2497961ace14720eabc26a90b6a4ef93909e1c7 100644
--- a/Marlin/src/gcode/feature/leds/M150.cpp
+++ b/Marlin/src/gcode/feature/leds/M150.cpp
@@ -34,6 +34,9 @@
* Always sets all 3 or 4 components. If a component is left out, set to 0.
* If brightness is left out, no value changed
*
+ * With NEOPIXEL_LED:
+ * I<index> Set the Neopixel index to affect. Default: All
+ *
* Examples:
*
* M150 R255 ; Turn LED red
@@ -43,8 +46,12 @@
* M150 W ; Turn LED white using a white LED
* M150 P127 ; Set LED 50% brightness
* M150 P ; Set LED full brightness
- */
+ * M150 I1 R ; Set NEOPIXEL index 1 to red
+ */
void GcodeSuite::M150() {
+ #if ENABLED(NEOPIXEL_LED)
+ neo.set_neo_index(parser.intval('I', -1));
+ #endif
leds.set_color(MakeLEDColor(
parser.seen('R') ? (parser.has_value() ? parser.value_byte() : 255) : 0,
parser.seen('U') ? (parser.has_value() ? parser.value_byte() : 255) : 0,