# Macros for setting the status leds on the Voron StealthBurner toolhead (or for any neopixel-type leds).
#
# You will need to configure a neopixel (or other addressable led, such as dotstar). See
# https://www.klipper3d.org/Config_Reference.html#neopixel for configuration details.


#####################################
#           INSTRUCTIONS            #
#####################################
# How to use all this stuff:
#
#     1.  Copy this .cfg file into your Klipper config directory and then add [include stealthburner_leds.cfg]
#         to the top of your printer.cfg in order for register the LEDs and macros with Klipper.
#     2.  Define your LEDs by editing [neopixel sb_leds] below and entering the data pin from your control board
#         as well as the color order.
#
#           Note: RGB and RGBW are different and must be defined explicitly.  RGB and RGBW are also not able to 
#                 be mix-and-matched in the same chain. A separate data line would be needed for proper functioning.
#
#                 RGBW LEDs will have a visible yellow-ish phosphor section to the chip.  If your LEDs do not have
#                 this yellow portion, you have RGB LEDs.
#
#     3.  Save your config and restart Klipper.
#
#           Note: We set RED and BLUE to 1.0 to make it easier for users and supporters to detect 
#                 misconfigurations or miswiring. The default color format is for Neopixels with a dedicated 
#                 white LED. On startup, all three SB LEDs should light up.
#
#                 If you get random colors across your LEDs, change the color_order to GRB and restart. Then
#                 omit the W for each suggested color_order in the next paragraph.
#
#                 If you get MAGENTA, your  color order is correct. If you get CYAN, you need to use RGBW. If
#                 you get YELLOW, you need to use BRGW (note that BRG is only supported in the latest Klipper
#                 version).
#
#     4.  Once you have confirmed that the LEDs are set up correctly, you must now decide where you want 
#         these macros called up...which means adding them to your existing gcode macros.  NOTHING will happen
#         unless you add the STATUS_????? macros to your existing gcode macros.  
#
#           Example: add STATUS_LEVELING to the beginning of your QGL gcode macro, and then add STATUS_READY 
#                    to the end of it to set the logo LED and nozzle LEDs back to the `ready` state.
#
#           Example: add STATUS_CLEANING to the beginning of your nozzle-cleaning macro, and then STATUS_READY
#                    to the end of it to return the LEDs back to `ready` state.
#
#     5.  Feel free to change colors of each macro, create new ones if you have a need to.  The macros provided below
#         are just an example of what is possible.  If you want to try some more complex animations, you will most
#         likely have to use WLED with Moonraker and a small micro-controller (please see the LED thread for help inside
#         of the stealthburner_beta channel on Discord).
#
#####################################
#       END INSTRUCTRUCTIONS        #
#####################################

[neopixel sb_leds]
pin: nhk:gpio7
#   The pin connected to the neopixel. This parameter must be provided.
chain_count: 10
#   The number of Neopixel chips that are "daisy chained" to the
#   provided pin. The default is 1 (which indicates only a single
#   Neopixel is connected to the pin).
color_order: GRB, GRB, GRB, GRB, GRB, GRB, GRB, GRB, GRBW,  GRBW
#   Set the pixel order required by the LED hardware. Options are GRB,
#   RGB, GRBW, or RGBW. The default is GRB.
initial_RED: 1.0
initial_GREEN: 0.0
initial_BLUE: 1.0
initial_WHITE: 0.0
#   Sets the initial LED color of the Neopixel. Each value should be
#   between 0.0 and 1.0. The WHITE option is only available on RGBW
#   LEDs. The default for each color is 0.#


##########################
# LED Effects Animations #
##########################

##################
## logo effects ##
##################

[led_effect sb_logo_busy]
autostart:              false
frame_rate:             24
leds:
    neopixel:sb_leds (1-8)
layers:
    breathing  3 1 top (1,0,0)

[led_effect sb_logo_cleaning]
autostart:              false
frame_rate:             24
leds:
    neopixel:sb_leds (1-8)
layers:
    breathing  3 1 top (0.0, 0.02, 0.5)

[led_effect sb_logo_calibrating_z]
autostart:              false
frame_rate:             24
leds:
    neopixel:sb_leds (1-8)
layers:
        breathing  3 1 top (0.0, 0.0, 0.35)

[led_effect sb_logo_heating]
leds:
    neopixel:sb_leds (1,3,7,8,6,2)
autostart:                          false
frame_rate:                         24
layers:
    comet  0.3  0 add (1, 0.18, 0)

[led_effect sb_logo_cooling]
leds:
    neopixel:sb_leds (1,3,7,8,6,2)
autostart:                          false
frame_rate:                         24
layers:
    comet  0.3  0 add (0, 0, 1)

[led_effect sb_logo_homing]
autostart:              false
frame_rate:             24
leds:
    neopixel:sb_leds (1-8)
layers:
        breathing  3 1 top (0.0, 0.6, 0.2)

[led_effect sb_logo_leveling]
autostart:              false
frame_rate:             24
leds:
    neopixel:sb_leds (1-8)
layers:
        breathing  3 1 top (0.5, 0.1, 0.4)

[led_effect sb_logo_meshing]
autostart:              false
frame_rate:             24
leds:
    neopixel:sb_leds (1-8)
layers:
        breathing  3 1 top (0.2, 1.0, 0.0)

[led_effect sb_logo_printing]
autostart:              false
frame_rate:             24
leds:
    neopixel:sb_leds (1-8)
layers:
    gradient  0.3  1 add (0.3, 0.0, 0.0),(0.3, 0.3, 0.0),(0.3, 0.1, 0.0)

[led_effect sb_logo_standby]
autostart:              false
frame_rate:             24
leds:
    neopixel:sb_leds (1-8)
layers:
        breathing  3 1 top (0.01, 0.01, 0.01)

[led_effect sb_logo_part_ready]
autostart:              false
frame_rate:             24
leds:
    neopixel:sb_leds (1-8)
layers:
        breathing  3 1 top (0.0, 1.0, 0.0)

####################
## nozzle effects ##
####################

[led_effect sb_nozzle_heating]
autostart:              false
frame_rate:             24
leds:
    neopixel:sb_leds (9,10)
layers:
        breathing  3 1 top (1.0, 0.18, 0.0, 0.0)

[led_effect sb_nozzle_cooling]
autostart:              false
frame_rate:             24
leds:
    neopixel:sb_leds (9,10)
layers:
        breathing  3 1 top (0.0, 0.0, 1.0, 0.1)

[led_effect sb_nozzle_standby]
autostart:              false
frame_rate:             24
leds:
    neopixel:sb_leds (9,10)
layers:
        breathing  3 1 top (0.6, 0.0, 0.0, 0.0)

[led_effect sb_nozzle_part_ready]
autostart:              false
frame_rate:             24
leds:
    neopixel:sb_leds (9,10)
layers:
        breathing  3 1 top (0.6, 1.0, 0.0, 0.1)


#####################
## all led effects ##
#####################

[led_effect sb_critical_error]
leds:
    neopixel:sb_leds
layers:
    strobe         1  1.5   add        (1.0,  1.0, 1.0)
    breathing      2  0     difference (0.95, 0.0, 0.0)
    static         1  0     top        (1.0,  0.0, 0.0)
autostart:                             false
frame_rate:                            24
run_on_error:                          true


[led_effect rainbow]
leds:
    neopixel:sb_leds
autostart:                          true
frame_rate:                         24
layers:
    gradient  0.3  1 add (0.3, 0.0, 0.0),(0.0, 0.3, 0.0),(0.0, 0.0, 0.3)


#######################
# LED Effects Statics #
#######################

[led_effect set_nozzle_leds]
leds:
    neopixel:sb_leds (9,10)
   #neopixel:caselight
autostart:                          false
frame_rate:                         24
layers:
    static         0  0     top        (0.0,  0.0, 0.0, 1.0)

[led_effect set_logo_leds]
leds:
    neopixel:sb_leds (1,2,3,4,5,6,7,8)
   #neopixel:caselight
autostart:                          false
frame_rate:                         24
layers:
    static         0  0     top        (1.0,  1.0, 1.0)

##############
# The Macros #
##############

[gcode_macro set_logo_leds_off]
gcode:
    SET_LED_EFFECT EFFECT=set_logo_leds STOP=1

[gcode_macro set_logo_leds_on]
gcode:
    SET_LED_EFFECT EFFECT=set_logo_leds

[gcode_macro set_nozzle_leds_on]
gcode:
    SET_LED_EFFECT EFFECT=set_nozzle_leds

[gcode_macro set_nozzle_leds_off]
gcode:
    SET_LED_EFFECT EFFECT=set_nozzle_leds STOP=1

[gcode_macro status_off]
gcode:
    STOP_LED_EFFECTS

[gcode_macro status_ready]
gcode:
    STOP_LED_EFFECTS
    SET_LED_EFFECT EFFECT=rainbow

[gcode_macro status_part_ready]
gcode:
    STOP_LED_EFFECTS
    SET_LED_EFFECT EFFECT=sb_nozzle_part_ready
    SET_LED_EFFECT EFFECT=sb_logo_part_ready

[gcode_macro status_busy]
gcode:
    STOP_LED_EFFECTS
    SET_LED_EFFECT EFFECT=sb_logo_busy
    set_nozzle_leds_on

[gcode_macro status_heating]
gcode:
    STOP_LED_EFFECTS
    SET_LED_EFFECT EFFECT=sb_logo_heating
    SET_LED_EFFECT EFFECT=sb_nozzle_heating

[gcode_macro status_cooling]
gcode:
    STOP_LED_EFFECTS
    SET_LED_EFFECT EFFECT=sb_logo_cooling
    SET_LED_EFFECT EFFECT=sb_nozzle_cooling


[gcode_macro status_leveling]
gcode:
    STOP_LED_EFFECTS
    SET_LED_EFFECT EFFECT=sb_logo_leveling
    set_nozzle_leds_on

[gcode_macro status_homing]
gcode:
    STOP_LED_EFFECTS
    SET_LED_EFFECT EFFECT=sb_logo_homing
    set_nozzle_leds_on

[gcode_macro status_cleaning]
gcode:
    STOP_LED_EFFECTS
    SET_LED_EFFECT EFFECT=sb_logo_cleaning
    set_nozzle_leds_on

[gcode_macro status_meshing]
gcode:
    STOP_LED_EFFECTS
    SET_LED_EFFECT EFFECT=sb_logo_meshing
    set_nozzle_leds_on

[gcode_macro status_calibrating_z]
gcode:
    STOP_LED_EFFECTS
    SET_LED_EFFECT EFFECT=sb_logo_calibrating_z
    set_nozzle_leds_on

[gcode_macro status_printing]
gcode:
    STOP_LED_EFFECTS
    SET_LED_EFFECT EFFECT=sb_logo_printing
    set_nozzle_leds_on