Firmware2/Marlin/src/feature/leds/leds.cpp

201 lines
5.3 KiB
C++
Raw Normal View History

2017-09-08 21:47:47 +02:00
/**
* Marlin 3D Printer Firmware
2020-02-03 15:00:57 +01:00
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
2017-09-08 21:47:47 +02:00
*
* Based on Sprinter and grbl.
2019-06-28 06:57:50 +02:00
* Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
2017-09-08 21:47:47 +02:00
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
2020-07-23 05:20:14 +02:00
* along with this program. If not, see <https://www.gnu.org/licenses/>.
2017-09-08 21:47:47 +02:00
*
*/
/**
2017-11-28 08:07:10 +01:00
* leds.cpp - Marlin RGB LED general support
2017-09-08 21:47:47 +02:00
*/
#include "../../inc/MarlinConfig.h"
#if HAS_COLOR_LEDS
#include "leds.h"
2017-11-28 08:07:10 +01:00
#if ENABLED(BLINKM)
#include "blinkm.h"
#endif
#if ENABLED(PCA9632)
#include "pca9632.h"
#endif
#if ENABLED(PCA9533)
#include "pca9533.h"
#endif
2017-11-28 08:07:10 +01:00
#if ENABLED(LED_COLOR_PRESETS)
const LEDColor LEDLights::defaultLEDColor = MakeLEDColor(
2020-08-27 21:18:16 +02:00
LED_USER_PRESET_RED, LED_USER_PRESET_GREEN, LED_USER_PRESET_BLUE,
LED_USER_PRESET_WHITE, LED_USER_PRESET_BRIGHTNESS
2017-11-28 08:07:10 +01:00
);
#endif
#if EITHER(LED_CONTROL_MENU, PRINTER_EVENT_LEDS)
2017-11-28 08:07:10 +01:00
LEDColor LEDLights::color;
bool LEDLights::lights_on;
2017-11-10 00:39:01 +01:00
#endif
2017-11-28 08:07:10 +01:00
LEDLights leds;
void LEDLights::setup() {
#if EITHER(RGB_LED, RGBW_LED)
if (PWM_PIN(RGB_LED_R_PIN)) SET_PWM(RGB_LED_R_PIN); else SET_OUTPUT(RGB_LED_R_PIN);
if (PWM_PIN(RGB_LED_G_PIN)) SET_PWM(RGB_LED_G_PIN); else SET_OUTPUT(RGB_LED_G_PIN);
if (PWM_PIN(RGB_LED_B_PIN)) SET_PWM(RGB_LED_B_PIN); else SET_OUTPUT(RGB_LED_B_PIN);
2019-01-17 20:20:26 +01:00
#if ENABLED(RGBW_LED)
if (PWM_PIN(RGB_LED_W_PIN)) SET_PWM(RGB_LED_W_PIN); else SET_OUTPUT(RGB_LED_W_PIN);
2019-01-17 20:20:26 +01:00
#endif
#endif
2020-04-22 23:35:03 +02:00
TERN_(NEOPIXEL_LED, neo.init());
TERN_(PCA9533, PCA9533_init());
TERN_(LED_USER_PRESET_STARTUP, set_default());
2017-11-28 08:07:10 +01:00
}
void LEDLights::set_color(const LEDColor &incol
#if ENABLED(NEOPIXEL_LED)
, bool isSequence/*=false*/
#endif
2017-09-08 21:47:47 +02:00
) {
#if ENABLED(NEOPIXEL_LED)
2017-11-28 08:07:10 +01:00
const uint32_t neocolor = LEDColorWhite() == incol
? neo.Color(NEO_WHITE)
: neo.Color(incol.r, incol.g, incol.b, incol.w);
2017-11-28 08:07:10 +01:00
static uint16_t nextLed = 0;
#ifdef NEOPIXEL_BKGD_LED_INDEX
if (NEOPIXEL_BKGD_LED_INDEX == nextLed) {
if (++nextLed >= neo.pixels()) nextLed = 0;
return;
}
#endif
neo.set_brightness(incol.i);
if (isSequence) {
neo.set_pixel_color(nextLed, neocolor);
neo.show();
if (++nextLed >= neo.pixels()) nextLed = 0;
2017-11-28 08:07:10 +01:00
return;
2017-10-25 22:50:36 +02:00
}
2017-11-28 08:07:10 +01:00
neo.set_color(neocolor);
2017-09-08 21:47:47 +02:00
#endif
#if ENABLED(BLINKM)
2017-11-28 08:07:10 +01:00
// This variant uses i2c to send the RGB components to the device.
blinkm_set_led_color(incol);
2017-09-08 21:47:47 +02:00
#endif
#if EITHER(RGB_LED, RGBW_LED)
2017-11-28 08:07:10 +01:00
// This variant uses 3-4 separate pins for the RGB(W) components.
2017-09-08 21:47:47 +02:00
// If the pins can do PWM then their intensity will be set.
2020-08-27 21:18:16 +02:00
#define UPDATE_RGBW(C,c) do { \
if (PWM_PIN(RGB_LED_##C##_PIN)) \
2019-06-21 08:20:17 +02:00
analogWrite(pin_t(RGB_LED_##C##_PIN), incol.c); \
2020-08-27 21:18:16 +02:00
else \
WRITE(RGB_LED_##C##_PIN, incol.c ? HIGH : LOW); \
}while(0)
UPDATE_RGBW(R,r); UPDATE_RGBW(G,g); UPDATE_RGBW(B,b);
2017-09-08 21:47:47 +02:00
#if ENABLED(RGBW_LED)
UPDATE_RGBW(W,w);
2017-09-08 21:47:47 +02:00
#endif
2017-11-28 08:07:10 +01:00
2017-09-08 21:47:47 +02:00
#endif
2020-08-24 06:57:51 +02:00
// Update I2C LED driver
TERN_(PCA9632, PCA9632_set_led_color(incol));
TERN_(PCA9533, PCA9533_set_rgb(incol.r, incol.g, incol.b));
#if EITHER(LED_CONTROL_MENU, PRINTER_EVENT_LEDS)
2017-11-28 08:07:10 +01:00
// Don't update the color when OFF
lights_on = !incol.is_off();
if (lights_on) color = incol;
2017-11-10 00:39:01 +01:00
#endif
}
2017-11-28 08:07:10 +01:00
#if ENABLED(LED_CONTROL_MENU)
void LEDLights::toggle() { if (lights_on) set_off(); else update(); }
#endif
2019-06-13 04:59:39 +02:00
#ifdef LED_BACKLIGHT_TIMEOUT
millis_t LEDLights::led_off_time; // = 0
void LEDLights::update_timeout(const bool power_on) {
const millis_t ms = millis();
if (power_on)
reset_timeout(ms);
else if (ELAPSED(ms, led_off_time))
set_off();
}
#endif
2020-08-27 21:18:16 +02:00
#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
);
#endif
#if ENABLED(LED_CONTROL_MENU)
LEDColor LEDLights2::color;
bool LEDLights2::lights_on;
#endif
LEDLights2 leds2;
void LEDLights2::setup() {
neo2.init();
TERN_(NEO2_USER_PRESET_STARTUP, set_default());
}
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.set_brightness(incol.i);
neo2.set_color(neocolor);
2020-09-07 05:51:53 +02:00
#if ENABLED(LED_CONTROL_MENU)
// Don't update the color when OFF
lights_on = !incol.is_off();
if (lights_on) color = incol;
#endif
2020-08-27 21:18:16 +02:00
}
2020-09-07 05:51:53 +02:00
#if ENABLED(LED_CONTROL_MENU)
void LEDLights2::toggle() { if (lights_on) set_off(); else update(); }
#endif
2020-08-27 21:18:16 +02:00
#endif // NEOPIXEL2_SEPARATE
#endif // HAS_COLOR_LEDS