瀏覽代碼

RGB Caselight (#20341)

LinFor 3 年之前
父節點
當前提交
e0aa9ce372
沒有連結到貢獻者的電子郵件帳戶。

+ 1
- 0
Marlin/Configuration.h 查看文件

@@ -2650,6 +2650,7 @@
2650 2650
   // Use a single NeoPixel LED for static (background) lighting
2651 2651
   //#define NEOPIXEL_BKGD_LED_INDEX  0               // Index of the LED to use
2652 2652
   //#define NEOPIXEL_BKGD_COLOR { 255, 255, 255, 0 } // R, G, B, W
2653
+  //#define NEOPIXEL_BKGD_ALWAYS_ON                  // Keep the backlight on when other NeoPixels are off
2653 2654
 #endif
2654 2655
 
2655 2656
 /**

+ 9
- 4
Marlin/Configuration_adv.h 查看文件

@@ -519,12 +519,17 @@
519 519
   #define INVERT_CASE_LIGHT false             // Set true if Case Light is ON when pin is LOW
520 520
   #define CASE_LIGHT_DEFAULT_ON true          // Set default power-up state on
521 521
   #define CASE_LIGHT_DEFAULT_BRIGHTNESS 105   // Set default power-up brightness (0-255, requires PWM pin)
522
+  //#define CASE_LIGHT_NO_BRIGHTNESS          // Disable brightness control. Enable for non-PWM lighting.
522 523
   //#define CASE_LIGHT_MAX_PWM 128            // Limit PWM duty cycle (0-255)
523 524
   //#define CASE_LIGHT_MENU                   // Add Case Light options to the LCD menu
524
-  //#define CASE_LIGHT_NO_BRIGHTNESS          // Disable brightness control. Enable for non-PWM lighting.
525
-  //#define CASE_LIGHT_USE_NEOPIXEL           // Use NeoPixel LED as case light, requires NEOPIXEL_LED.
526
-  #if ENABLED(CASE_LIGHT_USE_NEOPIXEL)
527
-    #define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White }
525
+  #if ENABLED(NEOPIXEL_LED)
526
+    //#define CASE_LIGHT_USE_NEOPIXEL         // Use NeoPixel LED as case light
527
+  #endif
528
+  #if EITHER(RGB_LED, RGBW_LED)
529
+    //#define CASE_LIGHT_USE_RGB_LED          // Use RGB / RGBW LED as case light
530
+  #endif
531
+  #if EITHER(CASE_LIGHT_USE_NEOPIXEL, CASE_LIGHT_USE_RGB_LED)
532
+    #define CASE_LIGHT_DEFAULT_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White }
528 533
   #endif
529 534
 #endif
530 535
 

+ 1
- 4
Marlin/src/MarlinCore.cpp 查看文件

@@ -1136,10 +1136,7 @@ void setup() {
1136 1136
   #endif
1137 1137
 
1138 1138
   #if ENABLED(CASE_LIGHT_ENABLE)
1139
-    #if DISABLED(CASE_LIGHT_USE_NEOPIXEL)
1140
-      if (PWM_PIN(CASE_LIGHT_PIN)) SET_PWM(CASE_LIGHT_PIN); else SET_OUTPUT(CASE_LIGHT_PIN);
1141
-    #endif
1142
-    SETUP_RUN(caselight.update_brightness());
1139
+    SETUP_RUN(caselight.init());
1143 1140
   #endif
1144 1141
 
1145 1142
   #if HAS_PRUSA_MMU1

+ 15
- 7
Marlin/src/feature/caselight.cpp 查看文件

@@ -28,6 +28,10 @@
28 28
 
29 29
 CaseLight caselight;
30 30
 
31
+#if CASE_LIGHT_IS_COLOR_LED
32
+  #include "leds/leds.h"
33
+#endif
34
+
31 35
 #if CASELIGHT_USES_BRIGHTNESS && !defined(CASE_LIGHT_DEFAULT_BRIGHTNESS)
32 36
   #define CASE_LIGHT_DEFAULT_BRIGHTNESS 0 // For use on PWM pin as non-PWM just sets a default
33 37
 #endif
@@ -38,10 +42,10 @@ CaseLight caselight;
38 42
 
39 43
 bool CaseLight::on = CASE_LIGHT_DEFAULT_ON;
40 44
 
41
-#if ENABLED(CASE_LIGHT_USE_NEOPIXEL)
45
+#if CASE_LIGHT_IS_COLOR_LED
42 46
   LEDColor CaseLight::color =
43
-    #ifdef CASE_LIGHT_NEOPIXEL_COLOR
44
-      CASE_LIGHT_NEOPIXEL_COLOR
47
+    #ifdef CASE_LIGHT_DEFAULT_COLOR
48
+      CASE_LIGHT_DEFAULT_COLOR
45 49
     #else
46 50
       { 255, 255, 255, 255 }
47 51
     #endif
@@ -71,17 +75,17 @@ void CaseLight::update(const bool sflag) {
71 75
     const uint8_t i = on ? brightness : 0, n10ct = INVERT_CASE_LIGHT ? 255 - i : i;
72 76
   #endif
73 77
 
74
-  #if ENABLED(CASE_LIGHT_USE_NEOPIXEL)
78
+  #if CASE_LIGHT_IS_COLOR_LED
75 79
 
76 80
     leds.set_color(
77 81
       MakeLEDColor(color.r, color.g, color.b, color.w, n10ct),
78 82
       false
79 83
     );
80 84
 
81
-  #else // !CASE_LIGHT_USE_NEOPIXEL
85
+  #else // !CASE_LIGHT_IS_COLOR_LED
82 86
 
83 87
     #if CASELIGHT_USES_BRIGHTNESS
84
-      if (PWM_PIN(CASE_LIGHT_PIN))
88
+      if (pin_is_pwm())
85 89
         analogWrite(pin_t(CASE_LIGHT_PIN), (
86 90
           #if CASE_LIGHT_MAX_PWM == 255
87 91
             n10ct
@@ -96,7 +100,11 @@ void CaseLight::update(const bool sflag) {
96 100
         WRITE(CASE_LIGHT_PIN, s ? HIGH : LOW);
97 101
       }
98 102
 
99
-  #endif // !CASE_LIGHT_USE_NEOPIXEL
103
+  #endif // !CASE_LIGHT_IS_COLOR_LED
104
+
105
+  #if ENABLED(CASE_LIGHT_USE_RGB_LED)
106
+    if (leds.lights_on) leds.update(); else leds.set_off();
107
+  #endif
100 108
 }
101 109
 
102 110
 #endif // CASE_LIGHT_ENABLE

+ 16
- 10
Marlin/src/feature/caselight.h 查看文件

@@ -21,10 +21,10 @@
21 21
  */
22 22
 #pragma once
23 23
 
24
-#include "../inc/MarlinConfigPre.h"
24
+#include "../inc/MarlinConfig.h"
25 25
 
26
-#if ENABLED(CASE_LIGHT_USE_NEOPIXEL)
27
-  #include "leds/leds.h"
26
+#if CASE_LIGHT_IS_COLOR_LED
27
+  #include "leds/leds.h" // for LEDColor
28 28
 #endif
29 29
 
30 30
 #if DISABLED(CASE_LIGHT_NO_BRIGHTNESS) || ENABLED(CASE_LIGHT_USE_NEOPIXEL)
@@ -33,19 +33,25 @@
33 33
 
34 34
 class CaseLight {
35 35
 public:
36
-  #if CASELIGHT_USES_BRIGHTNESS
37
-    static uint8_t brightness;
38
-  #endif
39 36
   static bool on;
37
+  TERN_(CASELIGHT_USES_BRIGHTNESS, static uint8_t brightness);
38
+
39
+  static bool pin_is_pwm() { return TERN0(NEED_CASE_LIGHT_PIN, PWM_PIN(CASE_LIGHT_PIN)); }
40
+  static bool has_brightness() { return TERN0(CASELIGHT_USES_BRIGHTNESS, TERN(CASE_LIGHT_USE_NEOPIXEL, true, pin_is_pwm())); }
41
+
42
+  static void init() {
43
+    #if NEED_CASE_LIGHT_PIN
44
+      if (pin_is_pwm()) SET_PWM(CASE_LIGHT_PIN); else SET_OUTPUT(CASE_LIGHT_PIN);
45
+    #endif
46
+    update_brightness();
47
+  }
40 48
 
41 49
   static void update(const bool sflag);
42 50
   static inline void update_brightness() { update(false); }
43
-  static inline void update_enabled() { update(true); }
51
+  static inline void update_enabled()    { update(true);  }
44 52
 
45 53
 private:
46
-  #if ENABLED(CASE_LIGHT_USE_NEOPIXEL)
47
-    static LEDColor color;
48
-  #endif
54
+  TERN_(CASE_LIGHT_IS_COLOR_LED, static LEDColor color);
49 55
 };
50 56
 
51 57
 extern CaseLight caselight;

+ 15
- 7
Marlin/src/feature/leds/leds.cpp 查看文件

@@ -42,6 +42,10 @@
42 42
   #include "pca9533.h"
43 43
 #endif
44 44
 
45
+#if ENABLED(CASE_LIGHT_USE_RGB_LED)
46
+  #include "../../feature/caselight.h"
47
+#endif
48
+
45 49
 #if ENABLED(LED_COLOR_PRESETS)
46 50
   const LEDColor LEDLights::defaultLEDColor = MakeLEDColor(
47 51
     LED_USER_PRESET_RED, LED_USER_PRESET_GREEN, LED_USER_PRESET_BLUE,
@@ -85,8 +89,11 @@ void LEDLights::set_color(const LEDColor &incol
85 89
 
86 90
     #ifdef NEOPIXEL_BKGD_LED_INDEX
87 91
       if (NEOPIXEL_BKGD_LED_INDEX == nextLed) {
88
-        if (++nextLed >= neo.pixels()) nextLed = 0;
89
-        return;
92
+        neo.set_color_background();
93
+        if (++nextLed >= neo.pixels()) {
94
+          nextLed = 0;
95
+          return;
96
+        }
90 97
       }
91 98
     #endif
92 99
 
@@ -114,12 +121,13 @@ void LEDLights::set_color(const LEDColor &incol
114 121
 
115 122
     // This variant uses 3-4 separate pins for the RGB(W) components.
116 123
     // If the pins can do PWM then their intensity will be set.
117
-    #define UPDATE_RGBW(C,c) do {                       \
118
-      if (PWM_PIN(RGB_LED_##C##_PIN))                   \
119
-        analogWrite(pin_t(RGB_LED_##C##_PIN), incol.c); \
120
-      else                                              \
121
-        WRITE(RGB_LED_##C##_PIN, incol.c ? HIGH : LOW); \
124
+    #define _UPDATE_RGBW(C,c) do {                \
125
+      if (PWM_PIN(RGB_LED_##C##_PIN))             \
126
+        analogWrite(pin_t(RGB_LED_##C##_PIN), c); \
127
+      else                                        \
128
+        WRITE(RGB_LED_##C##_PIN, c ? HIGH : LOW); \
122 129
     }while(0)
130
+    #define UPDATE_RGBW(C,c) _UPDATE_RGBW(C, TERN1(CASE_LIGHT_USE_RGB_LED, caselight.on) ? incol.c : 0)
123 131
     UPDATE_RGBW(R,r); UPDATE_RGBW(G,g); UPDATE_RGBW(B,b);
124 132
     #if ENABLED(RGBW_LED)
125 133
       UPDATE_RGBW(W,w);

+ 2
- 0
Marlin/src/feature/leds/leds.h 查看文件

@@ -194,6 +194,8 @@ public:
194 194
 
195 195
   #if ENABLED(LED_CONTROL_MENU)
196 196
     static void toggle();  // swap "off" with color
197
+  #endif
198
+  #if EITHER(LED_CONTROL_MENU, CASE_LIGHT_USE_RGB_LED)
197 199
     static inline void update() { set_color(color); }
198 200
   #endif
199 201
 

+ 1
- 1
Marlin/src/feature/leds/neopixel.cpp 查看文件

@@ -60,7 +60,7 @@ void Marlin_NeoPixel::set_color(const uint32_t color) {
60 60
   else {
61 61
     for (uint16_t i = 0; i < pixels(); ++i) {
62 62
       #ifdef NEOPIXEL_BKGD_LED_INDEX
63
-        if (i == NEOPIXEL_BKGD_LED_INDEX && color != 0x000000) {
63
+        if (i == NEOPIXEL_BKGD_LED_INDEX && TERN(ENABLED(NEOPIXEL_BKGD_ALWAYS_ON), true, color != 0x000000)) {
64 64
           set_color_background();
65 65
           continue;
66 66
         }

+ 1
- 1
Marlin/src/gcode/host/M115.cpp 查看文件

@@ -106,7 +106,7 @@ void GcodeSuite::M115() {
106 106
 
107 107
     // TOGGLE_LIGHTS (M355)
108 108
     cap_line(PSTR("TOGGLE_LIGHTS"), ENABLED(CASE_LIGHT_ENABLE));
109
-    cap_line(PSTR("CASE_LIGHT_BRIGHTNESS"), TERN0(CASE_LIGHT_ENABLE, TERN0(CASELIGHT_USES_BRIGHTNESS, TERN(CASE_LIGHT_USE_NEOPIXEL, true, PWM_PIN(CASE_LIGHT_PIN)))));
109
+    cap_line(PSTR("CASE_LIGHT_BRIGHTNESS"), TERN0(CASE_LIGHT_ENABLE, caselight.has_brightness()));
110 110
 
111 111
     // EMERGENCY_PARSER (M108, M112, M410, M876)
112 112
     cap_line(PSTR("EMERGENCY_PARSER"), ENABLED(EMERGENCY_PARSER));

+ 9
- 0
Marlin/src/inc/Conditionals_adv.h 查看文件

@@ -506,6 +506,15 @@
506 506
   #define NEED_HEX_PRINT 1
507 507
 #endif
508 508
 
509
+// Flags for Case Light having a color property or a single pin
510
+#if ENABLED(CASE_LIGHT_ENABLE)
511
+  #if EITHER(CASE_LIGHT_USE_NEOPIXEL, CASE_LIGHT_USE_RGB_LED)
512
+    #define CASE_LIGHT_IS_COLOR_LED 1
513
+  #else
514
+    #define NEED_CASE_LIGHT_PIN 1
515
+  #endif
516
+#endif
517
+
509 518
 // Flag whether least_squares_fit.cpp is used
510 519
 #if ANY(AUTO_BED_LEVELING_UBL, AUTO_BED_LEVELING_LINEAR, Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS)
511 520
   #define NEED_LSF 1

+ 4
- 2
Marlin/src/inc/SanityCheck.h 查看文件

@@ -437,6 +437,8 @@
437 437
   #error "DUAL_NOZZLE_DUPLICATION_MODE is now MULTI_NOZZLE_DUPLICATION."
438 438
 #elif defined(MENU_ITEM_CASE_LIGHT)
439 439
   #error "MENU_ITEM_CASE_LIGHT is now CASE_LIGHT_MENU."
440
+#elif defined(CASE_LIGHT_NEOPIXEL_COLOR)
441
+  #error "CASE_LIGHT_NEOPIXEL_COLOR is now CASE_LIGHT_DEFAULT_COLOR."
440 442
 #elif defined(ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED)
441 443
   #error "ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED is now SD_ABORT_ON_ENDSTOP_HIT."
442 444
 #elif defined(LPC_SD_LCD) || defined(LPC_SD_ONBOARD) || defined(LPC_SD_CUSTOM_CABLE)
@@ -1704,9 +1706,9 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal
1704 1706
 /**
1705 1707
  * Case Light requirements
1706 1708
  */
1707
-#if ENABLED(CASE_LIGHT_ENABLE)
1709
+#if NEED_CASE_LIGHT_PIN
1708 1710
   #if !PIN_EXISTS(CASE_LIGHT)
1709
-    #error "CASE_LIGHT_ENABLE requires CASE_LIGHT_PIN to be defined."
1711
+    #error "CASE_LIGHT_ENABLE requires CASE_LIGHT_PIN, CASE_LIGHT_USE_NEOPIXEL, or CASE_LIGHT_USE_RGB_LED."
1710 1712
   #elif CASE_LIGHT_PIN == FAN_PIN
1711 1713
     #error "CASE_LIGHT_PIN conflicts with FAN_PIN. Resolve before continuing."
1712 1714
   #endif

+ 7
- 4
Marlin/src/lcd/menu/menu_led.cpp 查看文件

@@ -105,12 +105,14 @@
105 105
 #if ENABLED(CASE_LIGHT_MENU)
106 106
   #include "../../feature/caselight.h"
107 107
 
108
+  #define CASELIGHT_TOGGLE_ITEM() EDIT_ITEM(bool, MSG_CASE_LIGHT, (bool*)&caselight.on, caselight.update_enabled)
109
+
108 110
   #if CASELIGHT_USES_BRIGHTNESS
109 111
     void menu_case_light() {
110 112
       START_MENU();
111 113
       BACK_ITEM(MSG_CONFIGURATION);
112 114
       EDIT_ITEM(percent, MSG_CASE_LIGHT_BRIGHTNESS, &caselight.brightness, 0, 255, caselight.update_brightness, true);
113
-      EDIT_ITEM(bool, MSG_CASE_LIGHT, (bool*)&caselight.on, caselight.update_enabled);
115
+      CASELIGHT_TOGGLE_ITEM();
114 116
       END_MENU();
115 117
     }
116 118
   #endif
@@ -155,13 +157,14 @@ void menu_led() {
155 157
   // Set Case light on/off/brightness
156 158
   //
157 159
   #if ENABLED(CASE_LIGHT_MENU)
158
-    #if DISABLED(CASE_LIGHT_NO_BRIGHTNESS)
159
-      if (TERN1(CASE_LIGHT_USE_NEOPIXEL, PWM_PIN(CASE_LIGHT_PIN)))
160
+    #if CASELIGHT_USES_BRIGHTNESS
161
+      if (caselight.has_brightness())
160 162
         SUBMENU(MSG_CASE_LIGHT, menu_case_light);
161 163
       else
162 164
     #endif
163
-        EDIT_ITEM(bool, MSG_CASE_LIGHT, (bool*)&caselight.on, caselight.update_enabled);
165
+        CASELIGHT_TOGGLE_ITEM();
164 166
   #endif
167
+
165 168
   END_MENU();
166 169
 }
167 170
 

+ 4
- 0
Marlin/src/pins/pins_postprocess.h 查看文件

@@ -876,5 +876,9 @@
876 876
   #undef BOARD_ST7920_DELAY_3
877 877
 #endif
878 878
 
879
+#if !NEED_CASE_LIGHT_PIN
880
+  #undef CASE_LIGHT_PIN
881
+#endif
882
+
879 883
 #undef HAS_FREE_AUX2_PINS
880 884
 #undef DIAG_REMAPPED

+ 1
- 1
buildroot/tests/DUE-tests 查看文件

@@ -18,7 +18,7 @@ opt_enable S_CURVE_ACCELERATION EEPROM_SETTINGS GCODE_MACROS \
18 18
            ASSISTED_TRAMMING ASSISTED_TRAMMING_WIZARD REPORT_TRAMMING_MM ASSISTED_TRAMMING_WAIT_POSITION \
19 19
            EEPROM_SETTINGS SDSUPPORT BINARY_FILE_TRANSFER \
20 20
            BLINKM PCA9533 PCA9632 RGB_LED RGB_LED_R_PIN RGB_LED_G_PIN RGB_LED_B_PIN LED_CONTROL_MENU \
21
-           NEOPIXEL_LED CASE_LIGHT_ENABLE CASE_LIGHT_USE_NEOPIXEL CASE_LIGHT_MENU \
21
+           NEOPIXEL_LED CASE_LIGHT_ENABLE CASE_LIGHT_USE_NEOPIXEL CASE_LIGHT_USE_RGB_LED CASE_LIGHT_MENU \
22 22
            NOZZLE_PARK_FEATURE ADVANCED_PAUSE_FEATURE FILAMENT_RUNOUT_DISTANCE_MM FILAMENT_RUNOUT_SENSOR \
23 23
            AUTO_BED_LEVELING_BILINEAR Z_MIN_PROBE_REPEATABILITY_TEST DEBUG_LEVELING_FEATURE \
24 24
            SKEW_CORRECTION SKEW_CORRECTION_FOR_Z SKEW_CORRECTION_GCODE CALIBRATION_GCODE \

Loading…
取消
儲存