Upload files to "Klipper/ender/printer_data/config"
This commit is contained in:
		
							parent
							
								
									c26d23708c
								
							
						
					
					
						commit
						f10fa86d7c
					
				
							
								
								
									
										47
									
								
								Klipper/ender/printer_data/config/crowsnest.conf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										47
									
								
								Klipper/ender/printer_data/config/crowsnest.conf
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,47 @@ | |||||||
|  | #### crowsnest.conf | ||||||
|  | #### This is a typical default config. | ||||||
|  | #### Also used as default in mainsail / MainsailOS | ||||||
|  | #### See: | ||||||
|  | #### https://github.com/mainsail-crew/crowsnest/blob/master/README.md | ||||||
|  | #### for details to configure to your needs. | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | ##################################################################### | ||||||
|  | ####                                                            ##### | ||||||
|  | ####      Information about ports and according URL's           ##### | ||||||
|  | ####                                                            ##### | ||||||
|  | ##################################################################### | ||||||
|  | ####                                                            ##### | ||||||
|  | ####    Port 8080 equals /webcam/?action=[stream/snapshot]      ##### | ||||||
|  | ####    Port 8081 equals /webcam2/?action=[stream/snapshot]     ##### | ||||||
|  | ####    Port 8082 equals /webcam3/?action=[stream/snapshot]     ##### | ||||||
|  | ####    Port 8083 equals /webcam4/?action=[stream/snapshot]     ##### | ||||||
|  | ####                                                            ##### | ||||||
|  | ####    Note: These ports are default for most Mainsail         ##### | ||||||
|  | ####    installations. To use any other port would involve      ##### | ||||||
|  | ####    changing the proxy configuration or using directly      ##### | ||||||
|  | ####    http://<ip>:<port>/?action=[stream/snapshot]            ##### | ||||||
|  | ####                                                            ##### | ||||||
|  | ##################################################################### | ||||||
|  | ####    RTSP Stream URL: ( if enabled and supported )           ##### | ||||||
|  | ####    rtsp://<ip>:<rtsp_port>/stream.h264                     ##### | ||||||
|  | ##################################################################### | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | [crowsnest] | ||||||
|  | log_path: /home/ender/printer_data/logs/crowsnest.log | ||||||
|  | log_level: verbose                      # Valid Options are quiet/verbose/debug | ||||||
|  | delete_log: false                       # Deletes log on every restart, if set to true | ||||||
|  | no_proxy: false | ||||||
|  | 
 | ||||||
|  | [cam 1] | ||||||
|  | mode: ustreamer                         # ustreamer - Provides mjpg and snapshots. (All devices) | ||||||
|  |                                         # camera-streamer - Provides webrtc, mjpg and snapshots. (rpi + Raspi OS based only) | ||||||
|  | enable_rtsp: false                      # If camera-streamer is used, this enables also usage of an rtsp server | ||||||
|  | rtsp_port: 8554                         # Set different ports for each device! | ||||||
|  | port: 8080                              # HTTP/MJPG Stream/Snapshot Port | ||||||
|  | device: /dev/video0                     # See Log for available ... | ||||||
|  | resolution: 640x480                     # widthxheight format | ||||||
|  | max_fps: 15                             # If Hardware Supports this it will be forced, otherwise ignored/coerced. | ||||||
|  | #custom_flags:                          # You can run the Stream Services with custom flags. | ||||||
|  | #v4l2ctl:                               # Add v4l2-ctl parameters to setup your camera, see Log what your cam is capable of. | ||||||
							
								
								
									
										293
									
								
								Klipper/ender/printer_data/config/fluidd.cfg
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										293
									
								
								Klipper/ender/printer_data/config/fluidd.cfg
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,293 @@ | |||||||
|  | ## Client klipper macro definitions | ||||||
|  | ## | ||||||
|  | ## Copyright (C) 2022 Alex Zellner <alexander.zellner@googlemail.com> | ||||||
|  | ## | ||||||
|  | ## This file may be distributed under the terms of the GNU GPLv3 license | ||||||
|  | ## | ||||||
|  | ## !!! This file is read-only. Maybe the used editor indicates that. !!! | ||||||
|  | ## | ||||||
|  | ## Customization: | ||||||
|  | ##   1) copy the gcode_macro _CLIENT_VARIABLE (see below) to your printer.cfg | ||||||
|  | ##   2) remove the comment mark (#) from all lines | ||||||
|  | ##   3) change any value in there to your needs | ||||||
|  | ## | ||||||
|  | ## Use the PAUSE macro direct in your M600: | ||||||
|  | ##  e.g. with a different park position front left and a minimal height of 50 | ||||||
|  | ##    [gcode_macro M600] | ||||||
|  | ##    description: Filament change | ||||||
|  | ##    gcode: PAUSE X=10 Y=10 Z_MIN=50 | ||||||
|  | ##  Z_MIN will park the toolhead at a minimum of 50 mm above to bed to make it easier for you to swap filament. | ||||||
|  | ## | ||||||
|  | ## Client variable macro for your printer.cfg | ||||||
|  | #[gcode_macro _CLIENT_VARIABLE] | ||||||
|  | #variable_use_custom_pos   : False ; use custom park coordinates for x,y [True/False] | ||||||
|  | #variable_custom_park_x    : 0.0   ; custom x position; value must be within your defined min and max of X | ||||||
|  | #variable_custom_park_y    : 0.0   ; custom y position; value must be within your defined min and max of Y | ||||||
|  | #variable_custom_park_dz   : 2.0   ; custom dz value; the value in mm to lift the nozzle when move to park position | ||||||
|  | #variable_retract          : 1.0   ; the value to retract while PAUSE | ||||||
|  | #variable_cancel_retract   : 5.0   ; the value to retract while CANCEL_PRINT | ||||||
|  | #variable_speed_retract    : 35.0  ; retract speed in mm/s | ||||||
|  | #variable_unretract        : 1.0   ; the value to unretract while RESUME | ||||||
|  | #variable_speed_unretract  : 35.0  ; unretract speed in mm/s | ||||||
|  | #variable_speed_hop        : 15.0  ; z move speed in mm/s | ||||||
|  | #variable_speed_move       : 100.0 ; move speed in mm/s | ||||||
|  | #variable_park_at_cancel   : False ; allow to move the toolhead to park while execute CANCEL_PRINT [True/False] | ||||||
|  | #variable_park_at_cancel_x : None  ; different park position during CANCEL_PRINT [None/Position as Float]; park_at_cancel must be True | ||||||
|  | #variable_park_at_cancel_y : None  ; different park position during CANCEL_PRINT [None/Position as Float]; park_at_cancel must be True | ||||||
|  | ## !!! Caution [firmware_retraction] must be defined in the printer.cfg if you set use_fw_retract: True !!! | ||||||
|  | #variable_use_fw_retract   : False ; use fw_retraction instead of the manual version [True/False] | ||||||
|  | #variable_idle_timeout     : 0     ; time in sec until idle_timeout kicks in. Value 0 means that no value will be set or restored | ||||||
|  | #variable_runout_sensor    : ""    ; If a sensor is defined, it will be used to cancel the execution of RESUME in case no filament is detected. | ||||||
|  | ##                                   Specify the config name of the runout sensor e.g "filament_switch_sensor runout". Hint use the same as in your printer.cfg | ||||||
|  | ## !!! Custom macros, please use with care and review the section of the corresponding macro. | ||||||
|  | ## These macros are for simple operations like setting a status LED. Please make sure your macro does not interfere with the basic macro functions. | ||||||
|  | ## Only  single line commands are supported, please create a macro if you need more than one command. | ||||||
|  | #variable_user_pause_macro : ""    ; Everything inside the "" will be executed after the klipper base pause (PAUSE_BASE) function | ||||||
|  | #variable_user_resume_macro: ""    ; Everything inside the "" will be executed before the klipper base resume (RESUME_BASE) function | ||||||
|  | #variable_user_cancel_macro: ""    ; Everything inside the "" will be executed before the klipper base cancel (CANCEL_PRINT_BASE) function | ||||||
|  | #gcode: | ||||||
|  | 
 | ||||||
|  | [virtual_sdcard] | ||||||
|  | path: ~/printer_data/gcodes | ||||||
|  | on_error_gcode: CANCEL_PRINT | ||||||
|  | 
 | ||||||
|  | [pause_resume] | ||||||
|  | #recover_velocity: 50. | ||||||
|  | #   When capture/restore is enabled, the speed at which to return to | ||||||
|  | #   the captured position (in mm/s). Default is 50.0 mm/s. | ||||||
|  | 
 | ||||||
|  | [display_status] | ||||||
|  | 
 | ||||||
|  | [respond] | ||||||
|  | 
 | ||||||
|  | [gcode_macro CANCEL_PRINT] | ||||||
|  | description: Cancel the actual running print | ||||||
|  | rename_existing: CANCEL_PRINT_BASE | ||||||
|  | gcode: | ||||||
|  |   ##### get user parameters or use default ##### | ||||||
|  |   {% set client = printer['gcode_macro _CLIENT_VARIABLE'] | default({}) %} | ||||||
|  |   {% set allow_park = client.park_at_cancel | default(false) | lower == 'true' %} | ||||||
|  |   {% set retract = client.cancel_retract | default(5.0) | abs %} | ||||||
|  |   ##### define park position ##### | ||||||
|  |   {% set park_x = "" if (client.park_at_cancel_x | default(none) is none) | ||||||
|  |             else "X=" ~ client.park_at_cancel_x %} | ||||||
|  |   {% set park_y = "" if (client.park_at_cancel_y | default(none) is none) | ||||||
|  |             else "Y=" ~ client.park_at_cancel_y %} | ||||||
|  |   {% set custom_park = park_x | length > 0 or park_y | length > 0 %} | ||||||
|  |   ##### end of definitions ##### | ||||||
|  |   # restore idle_timeout time if needed | ||||||
|  |   {% if printer['gcode_macro RESUME'].restore_idle_timeout > 0 %} | ||||||
|  |     SET_IDLE_TIMEOUT TIMEOUT={printer['gcode_macro RESUME'].restore_idle_timeout} | ||||||
|  |   {% endif %} | ||||||
|  |   {% if (custom_park or not printer.pause_resume.is_paused) and allow_park %} _TOOLHEAD_PARK_PAUSE_CANCEL {park_x} {park_y} {% endif %} | ||||||
|  |   _CLIENT_RETRACT LENGTH={retract} | ||||||
|  |   TURN_OFF_HEATERS | ||||||
|  |   M106 S0 | ||||||
|  |   {client.user_cancel_macro | default("")} | ||||||
|  |   SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=idle_state VALUE=False | ||||||
|  |   # clear pause_next_layer and pause_at_layer as preparation for next print | ||||||
|  |   SET_PAUSE_NEXT_LAYER ENABLE=0 | ||||||
|  |   SET_PAUSE_AT_LAYER ENABLE=0 LAYER=0 | ||||||
|  |   CANCEL_PRINT_BASE | ||||||
|  | 
 | ||||||
|  | [gcode_macro PAUSE] | ||||||
|  | description: Pause the actual running print | ||||||
|  | rename_existing: PAUSE_BASE | ||||||
|  | gcode: | ||||||
|  |   ##### get user parameters or use default ##### | ||||||
|  |   {% set client = printer['gcode_macro _CLIENT_VARIABLE'] | default({}) %} | ||||||
|  |   {% set idle_timeout = client.idle_timeout | default(0) %} | ||||||
|  |   {% set temp = printer[printer.toolhead.extruder].target if printer.toolhead.extruder != '' else 0 %} | ||||||
|  |   {% set restore = False if printer.toolhead.extruder == '' | ||||||
|  |               else True  if params.RESTORE | default(1) | int == 1 else False %} | ||||||
|  |   ##### end of definitions ##### | ||||||
|  |   SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=last_extruder_temp VALUE="{{'restore': restore, 'temp': temp}}" | ||||||
|  |   # set a new idle_timeout value | ||||||
|  |   {% if idle_timeout > 0 %} | ||||||
|  |     SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=restore_idle_timeout VALUE={printer.configfile.settings.idle_timeout.timeout} | ||||||
|  |     SET_IDLE_TIMEOUT TIMEOUT={idle_timeout} | ||||||
|  |   {% endif %} | ||||||
|  |   PAUSE_BASE | ||||||
|  |   {client.user_pause_macro | default("")} | ||||||
|  |   _TOOLHEAD_PARK_PAUSE_CANCEL {rawparams} | ||||||
|  | 
 | ||||||
|  | [gcode_macro RESUME] | ||||||
|  | description: Resume the actual running print | ||||||
|  | rename_existing: RESUME_BASE | ||||||
|  | variable_last_extruder_temp: {'restore': False, 'temp': 0} | ||||||
|  | variable_restore_idle_timeout: 0 | ||||||
|  | variable_idle_state: False | ||||||
|  | gcode: | ||||||
|  |   ##### get user parameters or use default ##### | ||||||
|  |   {% set client = printer['gcode_macro _CLIENT_VARIABLE'] | default({}) %} | ||||||
|  |   {% set velocity = printer.configfile.settings.pause_resume.recover_velocity %} | ||||||
|  |   {% set sp_move = client.speed_move | default(velocity) %} | ||||||
|  |   {% set runout_resume = True if client.runout_sensor | default("") == ""   # no runout | ||||||
|  |                     else True if not printer[client.runout_sensor].enabled  # sensor is disabled | ||||||
|  |                     else printer[client.runout_sensor].filament_detected %} # sensor status | ||||||
|  |   {% set can_extrude = True if printer.toolhead.extruder == ''           # no extruder defined in config | ||||||
|  |                   else printer[printer.toolhead.extruder].can_extrude %} # status of active extruder | ||||||
|  |   {% set do_resume = False %} | ||||||
|  |   {% set prompt_txt = [] %} | ||||||
|  |   ##### end of definitions ##### | ||||||
|  |   #### Printer comming from timeout idle state #### | ||||||
|  |   {% if printer.idle_timeout.state | upper == "IDLE" or idle_state %} | ||||||
|  |     SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=idle_state VALUE=False | ||||||
|  |     {% if last_extruder_temp.restore %} | ||||||
|  |       # we need to use the unicode (\u00B0) for the ° as py2 env's would throw an error otherwise | ||||||
|  |       RESPOND TYPE=echo MSG='{"Restoring \"%s\" temperature to %3.1f\u00B0C, this may take some time" % (printer.toolhead.extruder, last_extruder_temp.temp) }' | ||||||
|  |       M109 S{last_extruder_temp.temp} | ||||||
|  |       {% set do_resume = True %} | ||||||
|  |     {% elif can_extrude %} | ||||||
|  |       {% set do_resume = True %} | ||||||
|  |     {% else %} | ||||||
|  |       RESPOND TYPE=error MSG='{"Resume aborted !!! \"%s\" not hot enough, please heat up again and press RESUME" % printer.toolhead.extruder}' | ||||||
|  |       {% set _d = prompt_txt.append("\"%s\" not hot enough, please heat up again and press RESUME" % printer.toolhead.extruder) %} | ||||||
|  |     {% endif %} | ||||||
|  |   #### Printer comming out of regular PAUSE state #### | ||||||
|  |   {% elif can_extrude %} | ||||||
|  |     {% set do_resume = True %} | ||||||
|  |   {% else %} | ||||||
|  |     RESPOND TYPE=error MSG='{"Resume aborted !!! \"%s\" not hot enough, please heat up again and press RESUME" % printer.toolhead.extruder}' | ||||||
|  |     {% set _d = prompt_txt.append("\"%s\" not hot enough, please heat up again and press RESUME" % printer.toolhead.extruder) %} | ||||||
|  |   {% endif %} | ||||||
|  |   {% if runout_resume %} | ||||||
|  |     {% if do_resume %} | ||||||
|  |       {% if restore_idle_timeout > 0 %} SET_IDLE_TIMEOUT TIMEOUT={restore_idle_timeout} {% endif %} # restore idle_timeout time | ||||||
|  |       {client.user_resume_macro | default("")} | ||||||
|  |       _CLIENT_EXTRUDE | ||||||
|  |       RESUME_BASE VELOCITY={params.VELOCITY | default(sp_move)} | ||||||
|  |     {% endif %} | ||||||
|  |   {% else %} | ||||||
|  |     RESPOND TYPE=error MSG='{"Resume aborted !!! \"%s\" detects no filament, please load filament and press RESUME" % (client.runout_sensor.split(" "))[1]}' | ||||||
|  |     {% set _d = prompt_txt.append("\"%s\" detects no filament, please load filament and press RESUME" % (client.runout_sensor.split(" "))[1]) %} | ||||||
|  |   {% endif %} | ||||||
|  |   ##### Generate User Information box in case of abort ##### | ||||||
|  |   {% if not (runout_resume and do_resume) %} | ||||||
|  |     RESPOND TYPE=command MSG="action:prompt_begin RESUME aborted !!!" | ||||||
|  |     {% for element in prompt_txt %} | ||||||
|  |       RESPOND TYPE=command MSG='{"action:prompt_text %s" % element}' | ||||||
|  |     {% endfor %} | ||||||
|  |     RESPOND TYPE=command MSG="action:prompt_footer_button Ok|RESPOND TYPE=command MSG=action:prompt_end|info" | ||||||
|  |     RESPOND TYPE=command MSG="action:prompt_show" | ||||||
|  |   {% endif %} | ||||||
|  | 
 | ||||||
|  | # Usage: SET_PAUSE_NEXT_LAYER [ENABLE=[0 | 1]] [MACRO=<name>] | ||||||
|  | [gcode_macro SET_PAUSE_NEXT_LAYER] | ||||||
|  | description: Enable a pause if the next layer is reached | ||||||
|  | gcode: | ||||||
|  |   {% set pause_next_layer = printer['gcode_macro SET_PRINT_STATS_INFO'].pause_next_layer %} | ||||||
|  |   {% set ENABLE = params.ENABLE | default(1)|int != 0 %} | ||||||
|  |   {% set MACRO = params.MACRO | default(pause_next_layer.call, True) %} | ||||||
|  |   SET_GCODE_VARIABLE MACRO=SET_PRINT_STATS_INFO VARIABLE=pause_next_layer VALUE="{{ 'enable': ENABLE, 'call': MACRO }}" | ||||||
|  | 
 | ||||||
|  | # Usage: SET_PAUSE_AT_LAYER [ENABLE=[0 | 1]] [LAYER=<number>] [MACRO=<name>] | ||||||
|  | [gcode_macro SET_PAUSE_AT_LAYER] | ||||||
|  | description: Enable/disable a pause if a given layer number is reached | ||||||
|  | gcode: | ||||||
|  |   {% set pause_at_layer = printer['gcode_macro SET_PRINT_STATS_INFO'].pause_at_layer %} | ||||||
|  |   {% set ENABLE = params.ENABLE | int != 0 if params.ENABLE is defined | ||||||
|  |              else params.LAYER is defined %} | ||||||
|  |   {% set LAYER = params.LAYER | default(pause_at_layer.layer) | int %} | ||||||
|  |   {% set MACRO = params.MACRO | default(pause_at_layer.call, True) %} | ||||||
|  |   SET_GCODE_VARIABLE MACRO=SET_PRINT_STATS_INFO VARIABLE=pause_at_layer VALUE="{{ 'enable': ENABLE, 'layer': LAYER, 'call': MACRO }}" | ||||||
|  | 
 | ||||||
|  | # Usage: SET_PRINT_STATS_INFO [TOTAL_LAYER=<total_layer_count>] [CURRENT_LAYER= <current_layer>] | ||||||
|  | [gcode_macro SET_PRINT_STATS_INFO] | ||||||
|  | rename_existing: SET_PRINT_STATS_INFO_BASE | ||||||
|  | description: Overwrite, to get pause_next_layer and pause_at_layer feature | ||||||
|  | variable_pause_next_layer: { 'enable': False, 'call': "PAUSE" } | ||||||
|  | variable_pause_at_layer  : { 'enable': False, 'layer': 0, 'call': "PAUSE" } | ||||||
|  | gcode: | ||||||
|  |   {% if pause_next_layer.enable %} | ||||||
|  |     RESPOND TYPE=echo MSG='{"%s, forced by pause_next_layer" % pause_next_layer.call}' | ||||||
|  |     {pause_next_layer.call} ; execute the given gcode to pause, should be either M600 or PAUSE | ||||||
|  |     SET_PAUSE_NEXT_LAYER ENABLE=0 | ||||||
|  |   {% elif pause_at_layer.enable and params.CURRENT_LAYER is defined and params.CURRENT_LAYER | int == pause_at_layer.layer %} | ||||||
|  |     RESPOND TYPE=echo MSG='{"%s, forced by pause_at_layer [%d]" % (pause_at_layer.call, pause_at_layer.layer)}' | ||||||
|  |     {pause_at_layer.call} ; execute the given gcode to pause, should be either M600 or PAUSE | ||||||
|  |     SET_PAUSE_AT_LAYER ENABLE=0 | ||||||
|  |   {% endif %} | ||||||
|  |   SET_PRINT_STATS_INFO_BASE {rawparams} | ||||||
|  | 
 | ||||||
|  | ##### internal use ##### | ||||||
|  | [gcode_macro _TOOLHEAD_PARK_PAUSE_CANCEL] | ||||||
|  | description: Helper: park toolhead used in PAUSE and CANCEL_PRINT | ||||||
|  | gcode: | ||||||
|  |   ##### get user parameters or use default ##### | ||||||
|  |   {% set client = printer['gcode_macro _CLIENT_VARIABLE'] | default({}) %} | ||||||
|  |   {% set velocity = printer.configfile.settings.pause_resume.recover_velocity %} | ||||||
|  |   {% set use_custom     = client.use_custom_pos | default(false) | lower == 'true' %} | ||||||
|  |   {% set custom_park_x  = client.custom_park_x | default(0.0) %} | ||||||
|  |   {% set custom_park_y  = client.custom_park_y | default(0.0) %} | ||||||
|  |   {% set park_dz        = client.custom_park_dz | default(2.0) | abs %} | ||||||
|  |   {% set sp_hop         = client.speed_hop | default(15) * 60 %} | ||||||
|  |   {% set sp_move        = client.speed_move | default(velocity) * 60 %} | ||||||
|  |   ##### get config and toolhead values ##### | ||||||
|  |   {% set origin    = printer.gcode_move.homing_origin %} | ||||||
|  |   {% set act       = printer.gcode_move.gcode_position %} | ||||||
|  |   {% set max       = printer.toolhead.axis_maximum %} | ||||||
|  |   {% set cone      = printer.toolhead.cone_start_z | default(max.z) %} ; height as long the toolhead can reach max and min of an delta | ||||||
|  |   {% set round_bed = True if printer.configfile.settings.printer.kinematics is in ['delta','polar','rotary_delta','winch'] | ||||||
|  |                 else False %} | ||||||
|  |   ##### define park position ##### | ||||||
|  |   {% set z_min = params.Z_MIN | default(0) | float %} | ||||||
|  |   {% set z_park = [[(act.z + park_dz), z_min]|max, (max.z - origin.z)] | min %} | ||||||
|  |   {% set x_park = params.X       if params.X is defined | ||||||
|  |              else custom_park_x  if use_custom | ||||||
|  |              else 0.0            if round_bed | ||||||
|  |              else (max.x - 5.0) %} | ||||||
|  |   {% set y_park = params.Y       if params.Y is defined | ||||||
|  |              else custom_park_y  if use_custom | ||||||
|  |              else (max.y - 5.0)  if round_bed and z_park < cone | ||||||
|  |              else 0.0            if round_bed | ||||||
|  |              else (max.y - 5.0) %} | ||||||
|  |   ##### end of definitions ##### | ||||||
|  |   _CLIENT_RETRACT | ||||||
|  |   {% if "xyz" in printer.toolhead.homed_axes %} | ||||||
|  |     G90 | ||||||
|  |     G1 Z{z_park} F{sp_hop} | ||||||
|  |     G1 X{x_park} Y{y_park} F{sp_move} | ||||||
|  |     {% if not printer.gcode_move.absolute_coordinates %} G91 {% endif %} | ||||||
|  |   {% else %} | ||||||
|  |     RESPOND TYPE=echo MSG='Printer not homed' | ||||||
|  |   {% endif %} | ||||||
|  | 
 | ||||||
|  | [gcode_macro _CLIENT_EXTRUDE] | ||||||
|  | description: Extrudes, if the extruder is hot enough | ||||||
|  | gcode: | ||||||
|  |   ##### get user parameters or use default ##### | ||||||
|  |   {% set client = printer['gcode_macro _CLIENT_VARIABLE'] | default({}) %} | ||||||
|  |   {% set use_fw_retract = (client.use_fw_retract | default(false) | lower == 'true') and (printer.firmware_retraction is defined) %} | ||||||
|  |   {% set length = params.LENGTH | default(client.unretract) | default(1.0) | float %} | ||||||
|  |   {% set speed = params.SPEED | default(client.speed_unretract) | default(35) %} | ||||||
|  |   {% set absolute_extrude = printer.gcode_move.absolute_extrude %} | ||||||
|  |   ##### end of definitions ##### | ||||||
|  |   {% if printer.toolhead.extruder != '' %} | ||||||
|  |     {% if printer[printer.toolhead.extruder].can_extrude %} | ||||||
|  |       {% if use_fw_retract %} | ||||||
|  |         {% if length < 0 %} | ||||||
|  |           G10 | ||||||
|  |         {% else %} | ||||||
|  |           G11 | ||||||
|  |         {% endif %} | ||||||
|  |       {% else %} | ||||||
|  |         M83 | ||||||
|  |         G1 E{length} F{(speed | float | abs) * 60} | ||||||
|  |         {% if absolute_extrude %} | ||||||
|  |           M82 | ||||||
|  |         {% endif %} | ||||||
|  |       {% endif %} | ||||||
|  |     {% else %} | ||||||
|  |       RESPOND TYPE=echo MSG='{"\"%s\" not hot enough" % printer.toolhead.extruder}' | ||||||
|  |     {% endif %} | ||||||
|  |   {% endif %} | ||||||
|  | 
 | ||||||
|  | [gcode_macro _CLIENT_RETRACT] | ||||||
|  | description: Retracts, if the extruder is hot enough | ||||||
|  | gcode: | ||||||
|  |   {% set client = printer['gcode_macro _CLIENT_VARIABLE'] | default({}) %} | ||||||
|  |   {% set length = params.LENGTH | default(client.retract) | default(1.0) | float %} | ||||||
|  |   {% set speed = params.SPEED | default(client.speed_retract) | default(35) %} | ||||||
|  | 
 | ||||||
|  |   _CLIENT_EXTRUDE LENGTH=-{length | float | abs} SPEED={speed | float | abs} | ||||||
							
								
								
									
										294
									
								
								Klipper/ender/printer_data/config/mainsail.cfg
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										294
									
								
								Klipper/ender/printer_data/config/mainsail.cfg
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,294 @@ | |||||||
|  | ## Client klipper macro definitions | ||||||
|  | ## | ||||||
|  | ## Copyright (C) 2022 Alex Zellner <alexander.zellner@googlemail.com> | ||||||
|  | ## | ||||||
|  | ## This file may be distributed under the terms of the GNU GPLv3 license | ||||||
|  | ## | ||||||
|  | ## !!! This file is read-only. Maybe the used editor indicates that. !!! | ||||||
|  | ## | ||||||
|  | ## Customization: | ||||||
|  | ##   1) copy the gcode_macro _CLIENT_VARIABLE (see below) to your printer.cfg | ||||||
|  | ##   2) remove the comment mark (#) from all lines | ||||||
|  | ##   3) change any value in there to your needs | ||||||
|  | ## | ||||||
|  | ## Use the PAUSE macro direct in your M600: | ||||||
|  | ##  e.g. with a different park position front left and a minimal height of 50  | ||||||
|  | ##    [gcode_macro M600] | ||||||
|  | ##    description: Filament change | ||||||
|  | ##    gcode: PAUSE X=10 Y=10 Z_MIN=50 | ||||||
|  | ##  Z_MIN will park the toolhead at a minimum of 50 mm above to bed to make it easier for you to swap filament. | ||||||
|  | ## | ||||||
|  | ## Client variable macro for your printer.cfg | ||||||
|  | #[gcode_macro _CLIENT_VARIABLE] | ||||||
|  | #variable_use_custom_pos   : False ; use custom park coordinates for x,y [True/False] | ||||||
|  | #variable_custom_park_x    : 0.0   ; custom x position; value must be within your defined min and max of X | ||||||
|  | #variable_custom_park_y    : 0.0   ; custom y position; value must be within your defined min and max of Y | ||||||
|  | #variable_custom_park_dz   : 2.0   ; custom dz value; the value in mm to lift the nozzle when move to park position | ||||||
|  | #variable_retract          : 1.0   ; the value to retract while PAUSE | ||||||
|  | #variable_cancel_retract   : 5.0   ; the value to retract while CANCEL_PRINT | ||||||
|  | #variable_speed_retract    : 35.0  ; retract speed in mm/s | ||||||
|  | #variable_unretract        : 1.0   ; the value to unretract while RESUME | ||||||
|  | #variable_speed_unretract  : 35.0  ; unretract speed in mm/s | ||||||
|  | #variable_speed_hop        : 15.0  ; z move speed in mm/s | ||||||
|  | #variable_speed_move       : 100.0 ; move speed in mm/s | ||||||
|  | #variable_park_at_cancel   : False ; allow to move the toolhead to park while execute CANCEL_PRINT [True/False] | ||||||
|  | #variable_park_at_cancel_x : None  ; different park position during CANCEL_PRINT [None/Position as Float]; park_at_cancel must be True | ||||||
|  | #variable_park_at_cancel_y : None  ; different park position during CANCEL_PRINT [None/Position as Float]; park_at_cancel must be True | ||||||
|  | ## !!! Caution [firmware_retraction] must be defined in the printer.cfg if you set use_fw_retract: True !!! | ||||||
|  | #variable_use_fw_retract   : False ; use fw_retraction instead of the manual version [True/False] | ||||||
|  | #variable_idle_timeout     : 0     ; time in sec until idle_timeout kicks in. Value 0 means that no value will be set or restored | ||||||
|  | #variable_runout_sensor    : ""    ; If a sensor is defined, it will be used to cancel the execution of RESUME in case no filament is detected. | ||||||
|  | ##                                   Specify the config name of the runout sensor e.g "filament_switch_sensor runout". Hint use the same as in your printer.cfg | ||||||
|  | ## !!! Custom macros, please use with care and review the section of the corresponding macro. | ||||||
|  | ## These macros are for simple operations like setting a status LED. Please make sure your macro does not interfere with the basic macro functions. | ||||||
|  | ## Only  single line commands are supported, please create a macro if you need more than one command. | ||||||
|  | #variable_user_pause_macro : ""    ; Everything inside the "" will be executed after the klipper base pause (PAUSE_BASE) function | ||||||
|  | #variable_user_resume_macro: ""    ; Everything inside the "" will be executed before the klipper base resume (RESUME_BASE) function | ||||||
|  | #variable_user_cancel_macro: ""    ; Everything inside the "" will be executed before the klipper base cancel (CANCEL_PRINT_BASE) function | ||||||
|  | #gcode: | ||||||
|  | 
 | ||||||
|  | [virtual_sdcard] | ||||||
|  | path: ~/printer_data/gcodes | ||||||
|  | on_error_gcode: CANCEL_PRINT | ||||||
|  | 
 | ||||||
|  | [pause_resume] | ||||||
|  | #recover_velocity: 50. | ||||||
|  | #   When capture/restore is enabled, the speed at which to return to | ||||||
|  | #   the captured position (in mm/s). Default is 50.0 mm/s. | ||||||
|  | 
 | ||||||
|  | [display_status] | ||||||
|  | 
 | ||||||
|  | [respond] | ||||||
|  | 
 | ||||||
|  | [gcode_macro CANCEL_PRINT] | ||||||
|  | description: Cancel the actual running print | ||||||
|  | rename_existing: CANCEL_PRINT_BASE | ||||||
|  | gcode: | ||||||
|  |   ##### get user parameters or use default ##### | ||||||
|  |   {% set client = printer['gcode_macro _CLIENT_VARIABLE']|default({}) %} | ||||||
|  |   {% set allow_park = client.park_at_cancel|default(false)|lower == 'true' %} | ||||||
|  |   {% set retract = client.cancel_retract|default(5.0)|abs %} | ||||||
|  |   ##### define park position ##### | ||||||
|  |   {% set park_x = "" if (client.park_at_cancel_x|default(none) is none) | ||||||
|  |             else "X=" ~ client.park_at_cancel_x %} | ||||||
|  |   {% set park_y = "" if (client.park_at_cancel_y|default(none) is none) | ||||||
|  |             else "Y=" ~ client.park_at_cancel_y %} | ||||||
|  |   {% set custom_park = park_x|length > 0 or park_y|length > 0 %} | ||||||
|  |   ##### end of definitions ##### | ||||||
|  |   # restore idle_timeout time if needed | ||||||
|  |   {% if printer['gcode_macro RESUME'].restore_idle_timeout > 0 %} | ||||||
|  |     SET_IDLE_TIMEOUT TIMEOUT={printer['gcode_macro RESUME'].restore_idle_timeout} | ||||||
|  |   {% endif %} | ||||||
|  |   {% if (custom_park or not printer.pause_resume.is_paused) and allow_park %} _TOOLHEAD_PARK_PAUSE_CANCEL {park_x} {park_y} {% endif %} | ||||||
|  |   _CLIENT_RETRACT LENGTH={retract} | ||||||
|  |   TURN_OFF_HEATERS | ||||||
|  |   M106 S0 | ||||||
|  |   {client.user_cancel_macro|default("")} | ||||||
|  |   SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=idle_state VALUE=False | ||||||
|  |   # clear pause_next_layer and pause_at_layer as preparation for next print | ||||||
|  |   SET_PAUSE_NEXT_LAYER ENABLE=0 | ||||||
|  |   SET_PAUSE_AT_LAYER ENABLE=0 LAYER=0 | ||||||
|  |   CANCEL_PRINT_BASE | ||||||
|  | 
 | ||||||
|  | [gcode_macro PAUSE] | ||||||
|  | description: Pause the actual running print | ||||||
|  | rename_existing: PAUSE_BASE | ||||||
|  | gcode: | ||||||
|  |   ##### get user parameters or use default #####  | ||||||
|  |   {% set client = printer['gcode_macro _CLIENT_VARIABLE']|default({}) %} | ||||||
|  |   {% set idle_timeout = client.idle_timeout|default(0) %} | ||||||
|  |   {% set temp = printer[printer.toolhead.extruder].target if printer.toolhead.extruder != '' else 0 %} | ||||||
|  |   {% set restore = False if printer.toolhead.extruder == '' | ||||||
|  |               else True  if params.RESTORE|default(1)|int == 1 else False %} | ||||||
|  |   ##### end of definitions ##### | ||||||
|  |   SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=last_extruder_temp VALUE="{{'restore': restore, 'temp': temp}}" | ||||||
|  |   # set a new idle_timeout value | ||||||
|  |   {% if idle_timeout > 0 %} | ||||||
|  |     SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=restore_idle_timeout VALUE={printer.configfile.settings.idle_timeout.timeout} | ||||||
|  |     SET_IDLE_TIMEOUT TIMEOUT={idle_timeout} | ||||||
|  |   {% endif %} | ||||||
|  |   PAUSE_BASE | ||||||
|  |   {client.user_pause_macro|default("")} | ||||||
|  |   _TOOLHEAD_PARK_PAUSE_CANCEL {rawparams} | ||||||
|  | 
 | ||||||
|  | [gcode_macro RESUME] | ||||||
|  | description: Resume the actual running print | ||||||
|  | rename_existing: RESUME_BASE | ||||||
|  | variable_last_extruder_temp: {'restore': False, 'temp': 0} | ||||||
|  | variable_restore_idle_timeout: 0 | ||||||
|  | variable_idle_state: False | ||||||
|  | gcode: | ||||||
|  |   ##### get user parameters or use default ##### | ||||||
|  |   {% set client = printer['gcode_macro _CLIENT_VARIABLE']|default({}) %} | ||||||
|  |   {% set velocity = printer.configfile.settings.pause_resume.recover_velocity %} | ||||||
|  |   {% set sp_move = client.speed_move|default(velocity) %} | ||||||
|  |   {% set runout_resume = True if client.runout_sensor|default("") == ""     # no runout | ||||||
|  |                     else True if not printer[client.runout_sensor].enabled  # sensor is disabled | ||||||
|  |                     else printer[client.runout_sensor].filament_detected %} # sensor status | ||||||
|  |   {% set can_extrude = True if printer.toolhead.extruder == ''           # no extruder defined in config | ||||||
|  |                   else printer[printer.toolhead.extruder].can_extrude %} # status of active extruder | ||||||
|  |   {% set do_resume = False %} | ||||||
|  |   {% set prompt_txt = [] %} | ||||||
|  |   ##### end of definitions ##### | ||||||
|  |   #### Printer comming from timeout idle state #### | ||||||
|  |   {% if printer.idle_timeout.state|upper == "IDLE" or idle_state %} | ||||||
|  |     SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=idle_state VALUE=False | ||||||
|  |     {% if last_extruder_temp.restore %} | ||||||
|  |       # we need to use the unicode (\u00B0) for the ° as py2 env's would throw an error otherwise  | ||||||
|  |       RESPOND TYPE=echo MSG='{"Restoring \"%s\" temperature to %3.1f\u00B0C, this may take some time" % (printer.toolhead.extruder, last_extruder_temp.temp) }' | ||||||
|  |       M109 S{last_extruder_temp.temp} | ||||||
|  |       {% set do_resume = True %} | ||||||
|  |     {% elif can_extrude %} | ||||||
|  |       {% set do_resume = True %} | ||||||
|  |     {% else %}  | ||||||
|  |       RESPOND TYPE=error MSG='{"Resume aborted !!! \"%s\" not hot enough, please heat up again and press RESUME" % printer.toolhead.extruder}' | ||||||
|  |       {% set _d = prompt_txt.append("\"%s\" not hot enough, please heat up again and press RESUME" % printer.toolhead.extruder) %} | ||||||
|  |     {% endif %} | ||||||
|  |   #### Printer comming out of regular PAUSE state #### | ||||||
|  |   {% elif can_extrude %} | ||||||
|  |     {% set do_resume = True %} | ||||||
|  |   {% else %} | ||||||
|  |     RESPOND TYPE=error MSG='{"Resume aborted !!! \"%s\" not hot enough, please heat up again and press RESUME" % printer.toolhead.extruder}' | ||||||
|  |     {% set _d = prompt_txt.append("\"%s\" not hot enough, please heat up again and press RESUME" % printer.toolhead.extruder) %} | ||||||
|  |   {% endif %} | ||||||
|  |   {% if runout_resume %} | ||||||
|  |     {% if do_resume %} | ||||||
|  |       {% if restore_idle_timeout > 0 %} SET_IDLE_TIMEOUT TIMEOUT={restore_idle_timeout} {% endif %} # restore idle_timeout time | ||||||
|  |       {client.user_resume_macro|default("")} | ||||||
|  |       _CLIENT_EXTRUDE | ||||||
|  |       RESUME_BASE VELOCITY={params.VELOCITY|default(sp_move)} | ||||||
|  |     {% endif %} | ||||||
|  |   {% else %} | ||||||
|  |     RESPOND TYPE=error MSG='{"Resume aborted !!! \"%s\" detects no filament, please load filament and press RESUME" % (client.runout_sensor.split(" "))[1]}' | ||||||
|  |     {% set _d = prompt_txt.append("\"%s\" detects no filament, please load filament and press RESUME" % (client.runout_sensor.split(" "))[1]) %} | ||||||
|  |   {% endif %} | ||||||
|  |   ##### Generate User Information box in case of abort ##### | ||||||
|  |   {% if not (runout_resume and do_resume) %}  | ||||||
|  |     RESPOND TYPE=command MSG="action:prompt_begin RESUME aborted !!!" | ||||||
|  |     {% for element in prompt_txt %} | ||||||
|  |       RESPOND TYPE=command MSG='{"action:prompt_text %s" % element}'  | ||||||
|  |     {% endfor %} | ||||||
|  |     RESPOND TYPE=command MSG="action:prompt_footer_button Ok|RESPOND TYPE=command MSG=action:prompt_end|info" | ||||||
|  |     RESPOND TYPE=command MSG="action:prompt_show" | ||||||
|  |   {% endif %} | ||||||
|  |    | ||||||
|  | # Usage: SET_PAUSE_NEXT_LAYER [ENABLE=[0|1]] [MACRO=<name>] | ||||||
|  | [gcode_macro SET_PAUSE_NEXT_LAYER] | ||||||
|  | description: Enable a pause if the next layer is reached | ||||||
|  | gcode: | ||||||
|  |   {% set pause_next_layer = printer['gcode_macro SET_PRINT_STATS_INFO'].pause_next_layer %} | ||||||
|  |   {% set ENABLE = params.ENABLE|default(1)|int != 0 %} | ||||||
|  |   {% set MACRO = params.MACRO|default(pause_next_layer.call, True) %} | ||||||
|  |   SET_GCODE_VARIABLE MACRO=SET_PRINT_STATS_INFO VARIABLE=pause_next_layer VALUE="{{ 'enable': ENABLE, 'call': MACRO }}" | ||||||
|  | 
 | ||||||
|  | # Usage: SET_PAUSE_AT_LAYER [ENABLE=[0|1]] [LAYER=<number>] [MACRO=<name>] | ||||||
|  | [gcode_macro SET_PAUSE_AT_LAYER] | ||||||
|  | description: Enable/disable a pause if a given layer number is reached | ||||||
|  | gcode: | ||||||
|  |   {% set pause_at_layer = printer['gcode_macro SET_PRINT_STATS_INFO'].pause_at_layer %} | ||||||
|  |   {% set ENABLE = params.ENABLE|int != 0 if params.ENABLE is defined | ||||||
|  |              else params.LAYER is defined %} | ||||||
|  |   {% set LAYER = params.LAYER|default(pause_at_layer.layer)|int %} | ||||||
|  |   {% set MACRO = params.MACRO|default(pause_at_layer.call, True) %} | ||||||
|  |   SET_GCODE_VARIABLE MACRO=SET_PRINT_STATS_INFO VARIABLE=pause_at_layer VALUE="{{ 'enable': ENABLE, 'layer': LAYER, 'call': MACRO }}" | ||||||
|  | 
 | ||||||
|  | # Usage: SET_PRINT_STATS_INFO [TOTAL_LAYER=<total_layer_count>] [CURRENT_LAYER= <current_layer>] | ||||||
|  | [gcode_macro SET_PRINT_STATS_INFO] | ||||||
|  | rename_existing: SET_PRINT_STATS_INFO_BASE | ||||||
|  | description: Overwrite, to get pause_next_layer and pause_at_layer feature | ||||||
|  | variable_pause_next_layer: { 'enable': False, 'call': "PAUSE" } | ||||||
|  | variable_pause_at_layer  : { 'enable': False, 'layer': 0, 'call': "PAUSE" } | ||||||
|  | gcode: | ||||||
|  |   {% if pause_next_layer.enable %} | ||||||
|  |     RESPOND TYPE=echo MSG='{"%s, forced by pause_next_layer" % pause_next_layer.call}' | ||||||
|  |     {pause_next_layer.call} ; execute the given gcode to pause, should be either M600 or PAUSE | ||||||
|  |     SET_PAUSE_NEXT_LAYER ENABLE=0 | ||||||
|  |   {% elif pause_at_layer.enable and params.CURRENT_LAYER is defined and params.CURRENT_LAYER|int == pause_at_layer.layer %} | ||||||
|  |     RESPOND TYPE=echo MSG='{"%s, forced by pause_at_layer [%d]" % (pause_at_layer.call, pause_at_layer.layer)}' | ||||||
|  |     {pause_at_layer.call} ; execute the given gcode to pause, should be either M600 or PAUSE | ||||||
|  |     SET_PAUSE_AT_LAYER ENABLE=0 | ||||||
|  |   {% endif %} | ||||||
|  |   SET_PRINT_STATS_INFO_BASE {rawparams} | ||||||
|  |    | ||||||
|  | ##### internal use ##### | ||||||
|  | [gcode_macro _TOOLHEAD_PARK_PAUSE_CANCEL] | ||||||
|  | description: Helper: park toolhead used in PAUSE and CANCEL_PRINT | ||||||
|  | gcode: | ||||||
|  |   ##### get user parameters or use default ##### | ||||||
|  |   {% set client = printer['gcode_macro _CLIENT_VARIABLE']|default({}) %} | ||||||
|  |   {% set velocity = printer.configfile.settings.pause_resume.recover_velocity %} | ||||||
|  |   {% set use_custom     = client.use_custom_pos|default(false)|lower == 'true' %} | ||||||
|  |   {% set custom_park_x  = client.custom_park_x|default(0.0) %} | ||||||
|  |   {% set custom_park_y  = client.custom_park_y|default(0.0) %} | ||||||
|  |   {% set park_dz        = client.custom_park_dz|default(2.0)|abs %} | ||||||
|  |   {% set sp_hop         = client.speed_hop|default(15) * 60 %} | ||||||
|  |   {% set sp_move        = client.speed_move|default(velocity) * 60 %} | ||||||
|  |   ##### get config and toolhead values ##### | ||||||
|  |   {% set origin    = printer.gcode_move.homing_origin %} | ||||||
|  |   {% set act       = printer.gcode_move.gcode_position %} | ||||||
|  |   {% set max       = printer.toolhead.axis_maximum %} | ||||||
|  |   {% set cone      = printer.toolhead.cone_start_z|default(max.z) %} ; height as long the toolhead can reach max and min of an delta | ||||||
|  |   {% set round_bed = True if printer.configfile.settings.printer.kinematics is in ['delta','polar','rotary_delta','winch'] | ||||||
|  |                 else False %} | ||||||
|  |   ##### define park position ##### | ||||||
|  |   {% set z_min = params.Z_MIN|default(0)|float %} | ||||||
|  |   {% set z_park = [[(act.z + park_dz), z_min]|max, (max.z - origin.z)]|min %} | ||||||
|  |   {% set x_park = params.X       if params.X is defined | ||||||
|  |              else custom_park_x  if use_custom | ||||||
|  |              else 0.0            if round_bed | ||||||
|  |              else (max.x - 5.0) %} | ||||||
|  |   {% set y_park = params.Y       if params.Y is defined | ||||||
|  |              else custom_park_y  if use_custom | ||||||
|  |              else (max.y - 5.0)  if round_bed and z_park < cone | ||||||
|  |              else 0.0            if round_bed | ||||||
|  |              else (max.y - 5.0) %} | ||||||
|  |   ##### end of definitions ##### | ||||||
|  |   _CLIENT_RETRACT | ||||||
|  |   {% if "xyz" in printer.toolhead.homed_axes %} | ||||||
|  |     G90 | ||||||
|  |     G1 Z{z_park} F{sp_hop} | ||||||
|  |     G1 X{x_park} Y{y_park} F{sp_move} | ||||||
|  |     {% if not printer.gcode_move.absolute_coordinates %} G91 {% endif %} | ||||||
|  |   {% else %} | ||||||
|  |     RESPOND TYPE=echo MSG='Printer not homed' | ||||||
|  |   {% endif %} | ||||||
|  |    | ||||||
|  | [gcode_macro _CLIENT_EXTRUDE] | ||||||
|  | description: Extrudes, if the extruder is hot enough | ||||||
|  | gcode: | ||||||
|  |   ##### get user parameters or use default ##### | ||||||
|  |   {% set client = printer['gcode_macro _CLIENT_VARIABLE']|default({}) %} | ||||||
|  |   {% set use_fw_retract = (client.use_fw_retract|default(false)|lower == 'true') and (printer.firmware_retraction is defined) %} | ||||||
|  |   {% set length = params.LENGTH|default(client.unretract)|default(1.0)|float %} | ||||||
|  |   {% set speed = params.SPEED|default(client.speed_unretract)|default(35) %} | ||||||
|  |   {% set absolute_extrude = printer.gcode_move.absolute_extrude %} | ||||||
|  |   ##### end of definitions ##### | ||||||
|  |   {% if printer.toolhead.extruder != '' %} | ||||||
|  |     {% if printer[printer.toolhead.extruder].can_extrude %} | ||||||
|  |       {% if use_fw_retract %} | ||||||
|  |         {% if length < 0 %} | ||||||
|  |           G10 | ||||||
|  |         {% else %} | ||||||
|  |           G11 | ||||||
|  |         {% endif %} | ||||||
|  |       {% else %} | ||||||
|  |         M83 | ||||||
|  |         G1 E{length} F{(speed|float|abs) * 60} | ||||||
|  |         {% if absolute_extrude %} | ||||||
|  |           M82 | ||||||
|  |         {% endif %} | ||||||
|  |       {% endif %} | ||||||
|  |     {% else %} | ||||||
|  |       RESPOND TYPE=echo MSG='{"\"%s\" not hot enough" % printer.toolhead.extruder}' | ||||||
|  |     {% endif %} | ||||||
|  |   {% endif %} | ||||||
|  | 
 | ||||||
|  | [gcode_macro _CLIENT_RETRACT] | ||||||
|  | description: Retracts, if the extruder is hot enough | ||||||
|  | gcode: | ||||||
|  |   {% set client = printer['gcode_macro _CLIENT_VARIABLE']|default({}) %} | ||||||
|  |   {% set length = params.LENGTH|default(client.retract)|default(1.0)|float %} | ||||||
|  |   {% set speed = params.SPEED|default(client.speed_retract)|default(35) %} | ||||||
|  | 
 | ||||||
|  |   _CLIENT_EXTRUDE LENGTH=-{length|float|abs} SPEED={speed|float|abs} | ||||||
|  |    | ||||||
							
								
								
									
										17
									
								
								Klipper/ender/printer_data/config/sonar.conf
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								Klipper/ender/printer_data/config/sonar.conf
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,17 @@ | |||||||
|  | #### Sonar - A WiFi Keepalive daemon | ||||||
|  | #### | ||||||
|  | #### Written by Stephan Wendel aka KwadFan <me@stephanwe.de> | ||||||
|  | #### Copyright 2022 | ||||||
|  | #### https://github.com/mainsail-crew/sonar | ||||||
|  | #### | ||||||
|  | #### This File is distributed under GPLv3 | ||||||
|  | #### | ||||||
|  | 
 | ||||||
|  | [sonar] | ||||||
|  | enable: false               # false to disable till next reboot (will stop again if not set to true) | ||||||
|  | debug_log: false            # if set to true, sonar will log ever ping with triptime and date/time | ||||||
|  | persistant_log: false       # If true logs in /var/log/sonar.log, false logs to systemd | ||||||
|  | target: auto                # IP Address, URL or auto as ping target | ||||||
|  | count: 3                    # How often should be pinged? | ||||||
|  | interval: 60                # Ping again after X seconds | ||||||
|  | restart_treshold: 10        # If failed, restart WiFi after X seconds | ||||||
							
								
								
									
										427
									
								
								Klipper/ender/printer_data/config/timelapse.cfg
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										427
									
								
								Klipper/ender/printer_data/config/timelapse.cfg
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,427 @@ | |||||||
|  | # Timelapse klipper macro definition | ||||||
|  | # | ||||||
|  | # Copyright (C) 2021 Christoph Frei <fryakatkop@gmail.com> | ||||||
|  | # Copyright (C) 2021 Alex Zellner <alexander.zellner@googlemail.com> | ||||||
|  | # | ||||||
|  | # This file may be distributed under the terms of the GNU GPLv3 license | ||||||
|  | # | ||||||
|  | # Macro version 1.15 | ||||||
|  | # | ||||||
|  | 
 | ||||||
|  | ##### DO NOT CHANGE ANY MACRO!!! ##### | ||||||
|  | 
 | ||||||
|  | ########################################################################## | ||||||
|  | #                                                                        # | ||||||
|  | # GET_TIMELAPSE_SETUP: Print the Timelapse setup to console              # | ||||||
|  | #                                                                        # | ||||||
|  | ########################################################################## | ||||||
|  | 
 | ||||||
|  | [gcode_macro GET_TIMELAPSE_SETUP] | ||||||
|  | description: Print the Timelapse setup | ||||||
|  | gcode:  | ||||||
|  |   {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} | ||||||
|  |   {% set output_txt = ["Timelapse Setup:"] %} | ||||||
|  |   {% set _dummy = output_txt.append("enable: %s" % tl.enable) %} | ||||||
|  |   {% set _dummy = output_txt.append("park: %s" % tl.park.enable) %} | ||||||
|  |   {% if tl.park.enable %} | ||||||
|  |     {% set _dummy = output_txt.append("park position: %s time: %s s" % (tl.park.pos, tl.park.time)) %} | ||||||
|  |     {% set _dummy = output_txt.append("park cord x:%s y:%s dz:%s" % (tl.park.coord.x, tl.park.coord.y, tl.park.coord.dz)) %} | ||||||
|  |     {% set _dummy = output_txt.append("travel speed: %s mm/s" % tl.speed.travel) %} | ||||||
|  |   {% endif %} | ||||||
|  |   {% set _dummy = output_txt.append("fw_retract: %s" % tl.extruder.fw_retract) %} | ||||||
|  |   {% if not tl.extruder.fw_retract %} | ||||||
|  |     {% set _dummy = output_txt.append("retract: %s mm speed: %s mm/s" % (tl.extruder.retract, tl.speed.retract)) %} | ||||||
|  |     {% set _dummy = output_txt.append("extrude: %s mm speed: %s mm/s" % (tl.extruder.extrude, tl.speed.extrude)) %} | ||||||
|  |   {% endif %} | ||||||
|  |   {% set _dummy = output_txt.append("verbose: %s" % tl.verbose) %} | ||||||
|  |   {action_respond_info(output_txt|join("\n"))} | ||||||
|  | 
 | ||||||
|  | ################################################################################################ | ||||||
|  | #                                                                                              # | ||||||
|  | # Use _SET_TIMELAPSE_SETUP [ENABLE=value] [VERBOSE=value] [PARK_ENABLE=value] [PARK_POS=value] # | ||||||
|  | #                          [PARK_TIME=value] [CUSTOM_POS_X=value] [CUSTOM_POS_Y=value]         # | ||||||
|  | #                          [CUSTOM_POS_DZ=value][TRAVEL_SPEED=value] [RETRACT_SPEED=value]     # | ||||||
|  | #                          [EXTRUDE_SPEED=value] [EXTRUDE_DISTANCE=value]                      # | ||||||
|  | #                          [RETRACT_DISTANCE=value] [FW_RETRACT=value]                         # | ||||||
|  | #                                                                                              # | ||||||
|  | ################################################################################################ | ||||||
|  | 
 | ||||||
|  | [gcode_macro _SET_TIMELAPSE_SETUP] | ||||||
|  | description: Set user parameters for timelapse | ||||||
|  | gcode: | ||||||
|  |   {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} | ||||||
|  |   ##### get min and max bed size ##### | ||||||
|  |   {% set min = printer.toolhead.axis_minimum %} | ||||||
|  |   {% set max = printer.toolhead.axis_maximum %} | ||||||
|  |   {% set round_bed = True if printer.configfile.settings.printer.kinematics is in ['delta','polar','rotary_delta','winch']  | ||||||
|  |                 else False %} | ||||||
|  |   {% set park = {'min'   : {'x': (min.x / 1.42)|round(3) if round_bed else min.x|round(3), | ||||||
|  |                             'y': (min.y / 1.42)|round(3) if round_bed else min.y|round(3)}, | ||||||
|  |                  'max'   : {'x': (max.x / 1.42)|round(3) if round_bed else max.x|round(3), | ||||||
|  |                             'y': (max.y / 1.42)|round(3) if round_bed else max.y|round(3)}, | ||||||
|  |                  'center': {'x': (max.x-(max.x-min.x)/2)|round(3), | ||||||
|  |                             'y': (max.y-(max.y-min.y)/2)|round(3)}} %} | ||||||
|  |   ##### set new values ##### | ||||||
|  |   {% if params.ENABLE %} | ||||||
|  |     {% if params.ENABLE|lower is in ['true', 'false'] %} | ||||||
|  |       SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=enable VALUE={True if params.ENABLE|lower == 'true' else False} | ||||||
|  |     {% else %} | ||||||
|  |       {action_raise_error("ENABLE=%s not supported. Allowed values are [True, False]" % params.ENABLE|capitalize)} | ||||||
|  |     {% endif %} | ||||||
|  |   {% endif %} | ||||||
|  |   {% if params.VERBOSE %} | ||||||
|  |     {% if params.VERBOSE|lower is in ['true', 'false'] %} | ||||||
|  |       SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=verbose VALUE={True if params.VERBOSE|lower == 'true' else False} | ||||||
|  |     {% else %} | ||||||
|  |       {action_raise_error("VERBOSE=%s not supported. Allowed values are [True, False]" % params.VERBOSE|capitalize)} | ||||||
|  |     {% endif %} | ||||||
|  |   {% endif %} | ||||||
|  |   {% if params.CUSTOM_POS_X %} | ||||||
|  |     {% if params.CUSTOM_POS_X|float >= min.x and params.CUSTOM_POS_X|float <= max.x %} | ||||||
|  |       {% set _dummy = tl.park.custom.update({'x':params.CUSTOM_POS_X|float|round(3)}) %} | ||||||
|  |     {% else %} | ||||||
|  |       {action_raise_error("CUSTOM_POS_X=%s must be within [%s - %s]" % (params.CUSTOM_POS_X, min.x, max.x))} | ||||||
|  |     {% endif %} | ||||||
|  |   {% endif %} | ||||||
|  |   {% if params.CUSTOM_POS_Y %} | ||||||
|  |     {% if params.CUSTOM_POS_Y|float >= min.y and params.CUSTOM_POS_Y|float <= max.y %} | ||||||
|  |       {% set _dummy = tl.park.custom.update({'y':params.CUSTOM_POS_Y|float|round(3)}) %} | ||||||
|  |     {% else %} | ||||||
|  |       {action_raise_error("CUSTOM_POS_Y=%s must be within [%s - %s]" % (params.CUSTOM_POS_Y, min.y, max.y))} | ||||||
|  |     {% endif %} | ||||||
|  |   {% endif %} | ||||||
|  |   {% if params.CUSTOM_POS_DZ %} | ||||||
|  |     {% if params.CUSTOM_POS_DZ|float >= min.z and params.CUSTOM_POS_DZ|float <= max.z %} | ||||||
|  |       {% set _dummy = tl.park.custom.update({'dz':params.CUSTOM_POS_DZ|float|round(3)}) %} | ||||||
|  |     {% else %} | ||||||
|  |       {action_raise_error("CUSTOM_POS_DZ=%s must be within [%s - %s]" % (params.CUSTOM_POS_DZ, min.z, max.z))} | ||||||
|  |     {% endif %} | ||||||
|  |   {% endif %} | ||||||
|  |   {% if params.PARK_ENABLE %} | ||||||
|  |     {% if params.PARK_ENABLE|lower is in ['true', 'false'] %} | ||||||
|  |       {% set _dummy = tl.park.update({'enable':True if params.PARK_ENABLE|lower == 'true' else False}) %} | ||||||
|  |     {% else %} | ||||||
|  |       {action_raise_error("PARK_ENABLE=%s not supported. Allowed values are [True, False]" % params.PARK_ENABLE|capitalize)} | ||||||
|  |     {% endif %} | ||||||
|  |   {% endif %} | ||||||
|  |   {% if params.PARK_POS %} | ||||||
|  |     {% if params.PARK_POS|lower is in ['center','front_left','front_right','back_left','back_right','custom','x_only','y_only'] %} | ||||||
|  |       {% set dic = {'center'      : {'x': park.center.x   , 'y': park.center.y   , 'dz': 1                }, | ||||||
|  |                     'front_left'  : {'x': park.min.x      , 'y': park.min.y      , 'dz': 0                }, | ||||||
|  |                     'front_right' : {'x': park.max.x      , 'y': park.min.y      , 'dz': 0                }, | ||||||
|  |                     'back_left'   : {'x': park.min.x      , 'y': park.max.y      , 'dz': 0                }, | ||||||
|  |                     'back_right'  : {'x': park.max.x      , 'y': park.max.y      , 'dz': 0                }, | ||||||
|  |                     'custom'      : {'x': tl.park.custom.x, 'y': tl.park.custom.y, 'dz': tl.park.custom.dz}, | ||||||
|  |                     'x_only'      : {'x': tl.park.custom.x, 'y': 'none'          , 'dz': tl.park.custom.dz}, | ||||||
|  |                     'y_only'      : {'x': 'none'          , 'y': tl.park.custom.y, 'dz': tl.park.custom.dz}} %} | ||||||
|  |       {% set _dummy = tl.park.update({'pos':params.PARK_POS|lower}) %} | ||||||
|  |       {% set _dummy = tl.park.update({'coord':dic[tl.park.pos]}) %} | ||||||
|  |     {% else %} | ||||||
|  |       {action_raise_error("PARK_POS=%s not supported. Allowed values are [CENTER, FRONT_LEFT, FRONT_RIGHT, BACK_LEFT, BACK_RIGHT, CUSTOM, X_ONLY, Y_ONLY]" | ||||||
|  |                           % params.PARK_POS|upper)} | ||||||
|  |     {% endif %} | ||||||
|  |   {% endif %} | ||||||
|  |   {% if params.PARK_TIME %} | ||||||
|  |     {% if params.PARK_TIME|float >= 0.0 %} | ||||||
|  |       {% set _dummy = tl.park.update({'time':params.PARK_TIME|float|round(3)}) %} | ||||||
|  |     {% else %} | ||||||
|  |       {action_raise_error("PARK_TIME=%s must be a positive number" % params.PARK_TIME)} | ||||||
|  |     {% endif %} | ||||||
|  |   {% endif %} | ||||||
|  |   SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=park VALUE="{tl.park}" | ||||||
|  |   {% if params.TRAVEL_SPEED %} | ||||||
|  |     {% if params.TRAVEL_SPEED|float > 0.0 %} | ||||||
|  |       {% set _dummy = tl.speed.update({'travel':params.TRAVEL_SPEED|float|round(3)}) %} | ||||||
|  |     {% else %} | ||||||
|  |       {action_raise_error("TRAVEL_SPEED=%s must be larger than 0" % params.TRAVEL_SPEED)} | ||||||
|  |     {% endif %} | ||||||
|  |   {% endif %} | ||||||
|  |   {% if params.RETRACT_SPEED %} | ||||||
|  |     {% if params.RETRACT_SPEED|float > 0.0 %} | ||||||
|  |       {% set _dummy = tl.speed.update({'retract':params.RETRACT_SPEED|float|round(3)}) %} | ||||||
|  |     {% else %} | ||||||
|  |       {action_raise_error("RETRACT_SPEED=%s must be larger than 0" % params.RETRACT_SPEED)} | ||||||
|  |     {% endif %} | ||||||
|  |   {% endif %} | ||||||
|  |   {% if params.EXTRUDE_SPEED %} | ||||||
|  |     {% if params.EXTRUDE_SPEED|float > 0.0 %} | ||||||
|  |       {% set _dummy = tl.speed.update({'extrude':params.EXTRUDE_SPEED|float|round(3)}) %} | ||||||
|  |     {% else %} | ||||||
|  |       {action_raise_error("EXTRUDE_SPEED=%s must be larger than 0" % params.EXTRUDE_SPEED)} | ||||||
|  |     {% endif %} | ||||||
|  |   {% endif %} | ||||||
|  |   SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=speed VALUE="{tl.speed}" | ||||||
|  |   {% if params.EXTRUDE_DISTANCE %} | ||||||
|  |     {% if params.EXTRUDE_DISTANCE|float >= 0.0 %} | ||||||
|  |       {% set _dummy = tl.extruder.update({'extrude':params.EXTRUDE_DISTANCE|float|round(3)}) %} | ||||||
|  |     {% else %} | ||||||
|  |       {action_raise_error("EXTRUDE_DISTANCE=%s must be specified as positiv number" % params.EXTRUDE_DISTANCE)} | ||||||
|  |     {% endif %} | ||||||
|  |   {% endif %} | ||||||
|  |   {% if params.RETRACT_DISTANCE %} | ||||||
|  |     {% if params.RETRACT_DISTANCE|float >= 0.0 %} | ||||||
|  |       {% set _dummy = tl.extruder.update({'retract':params.RETRACT_DISTANCE|float|round(3)}) %} | ||||||
|  |     {% else %} | ||||||
|  |       {action_raise_error("RETRACT_DISTANCE=%s must be specified as positiv number" % params.RETRACT_DISTANCE)} | ||||||
|  |     {% endif %} | ||||||
|  |   {% endif %} | ||||||
|  |   {% if params.FW_RETRACT %} | ||||||
|  |     {% if params.FW_RETRACT|lower is in ['true', 'false'] %} | ||||||
|  |       {% if 'firmware_retraction' in printer.configfile.settings %} | ||||||
|  |         {% set _dummy = tl.extruder.update({'fw_retract': True if params.FW_RETRACT|lower == 'true' else False}) %} | ||||||
|  |       {% else %} | ||||||
|  |         {% set _dummy = tl.extruder.update({'fw_retract':False}) %} | ||||||
|  |         {% if params.FW_RETRACT|capitalize == 'True' %} | ||||||
|  |           {action_raise_error("[firmware_retraction] not defined in printer.cfg. Can not enable fw_retract")} | ||||||
|  |         {% endif %} | ||||||
|  |       {% endif %} | ||||||
|  |     {% else %} | ||||||
|  |       {action_raise_error("FW_RETRACT=%s not supported. Allowed values are [True, False]" % params.FW_RETRACT|capitalize)} | ||||||
|  |     {% endif %} | ||||||
|  |   {% endif %} | ||||||
|  |   SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=extruder VALUE="{tl.extruder}" | ||||||
|  |   {% if printer.configfile.settings['gcode_macro pause'] is defined %} | ||||||
|  |     {% set _dummy = tl.macro.update({'pause': printer.configfile.settings['gcode_macro pause'].rename_existing}) %} | ||||||
|  |   {% endif %} | ||||||
|  |   {% if printer.configfile.settings['gcode_macro resume'] is defined %} | ||||||
|  |     {% set _dummy = tl.macro.update({'resume': printer.configfile.settings['gcode_macro resume'].rename_existing}) %} | ||||||
|  |   {% endif %} | ||||||
|  |   SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=macro VALUE="{tl.macro}" | ||||||
|  | 
 | ||||||
|  | ########################################################################## | ||||||
|  | #                                                                        # | ||||||
|  | # TIMELAPSE_TAKE_FRAME: take the next picture                            # | ||||||
|  | #                                                                        # | ||||||
|  | ########################################################################## | ||||||
|  | 
 | ||||||
|  | ######################### definition ######################### | ||||||
|  | ## enable: enable or disable the next frame. Valid inputs: [True, False] | ||||||
|  | ## takingframe: internal use. Valid inputs: [True, False] | ||||||
|  | ## | ||||||
|  | ## park.enable: enable or disable to park the head while taking a picture. Valid inputs: [True, False] | ||||||
|  | ## park.pos   : used position for parking. Valid inputs: [center, front_left, front_right, back_left, back_right, custom, x_only, y_only] | ||||||
|  | ## park.time  : used for the debug macro. Time in s | ||||||
|  | ## park.custom.x, park.custom.y: coordinates of the custom parkposition. Unit [mm] | ||||||
|  | ## park.custom.dz              : custom z hop for the picture. Unit [mm] | ||||||
|  | ## park.coord : internal use | ||||||
|  | ## | ||||||
|  | ## extruder.fw_retract: enable disable fw retraction [True,False] | ||||||
|  | ## extruder.extrude   : filament extruded at the end of park. Unit [mm] | ||||||
|  | ## extruder.retract   : filament retract at the start of park. Unit [mm] | ||||||
|  | ## | ||||||
|  | ## speed.travel : used speed for travel from and to the park positon. Unit: [mm/min] | ||||||
|  | ## speed.retract: used speed for retract [mm/min] | ||||||
|  | ## speed.extrude: used speed for extrude [mm/min] | ||||||
|  | ## | ||||||
|  | ## verbose: Enable mesage output of TIMELAPSE_TAKE_FRAME | ||||||
|  | ## | ||||||
|  | ## check_time: time when the status of the taken picture is checked. Default 0.5 sec | ||||||
|  | ## | ||||||
|  | ## restore.absolute.coordinates: internal use | ||||||
|  | ## restore.absolute.extrude    : internal use | ||||||
|  | ## restore.speed               : internal use | ||||||
|  | ## restore.e                   : internal use | ||||||
|  | ## restore.factor.speed        : internal use | ||||||
|  | ## restore.factor.extrude      : internal use | ||||||
|  | ## | ||||||
|  | ## macro.pause  : internal use | ||||||
|  | ## macro.resume : internal use | ||||||
|  | ## | ||||||
|  | ## is_paused: internal use | ||||||
|  | ############################################################### | ||||||
|  | [gcode_macro TIMELAPSE_TAKE_FRAME] | ||||||
|  | description: Take Timelapse shoot | ||||||
|  | variable_enable: False | ||||||
|  | variable_takingframe: False | ||||||
|  | variable_park: {'enable': False, | ||||||
|  |                 'pos'   : 'center', | ||||||
|  |                 'time'  : 0.1, | ||||||
|  |                 'custom': {'x': 0, 'y': 0, 'dz': 0}, | ||||||
|  |                 'coord' : {'x': 0, 'y': 0, 'dz': 0}} | ||||||
|  | variable_extruder: {'fw_retract': False, | ||||||
|  |                     'retract': 1.0, | ||||||
|  |                     'extrude': 1.0} | ||||||
|  | variable_speed: {'travel': 100, | ||||||
|  |                  'retract': 15, | ||||||
|  |                  'extrude': 15} | ||||||
|  | variable_verbose: True | ||||||
|  | variable_check_time: 0.5 | ||||||
|  | variable_restore: {'absolute': {'coordinates': True, 'extrude': True}, 'speed': 1500, 'e':0, 'factor': {'speed': 1.0, 'extrude': 1.0}} | ||||||
|  | variable_macro: {'pause': 'PAUSE', 'resume': 'RESUME'} | ||||||
|  | variable_is_paused: False | ||||||
|  | gcode: | ||||||
|  |   {% set hyperlapse = True if params.HYPERLAPSE and params.HYPERLAPSE|lower =='true' else False %} | ||||||
|  |   {% if enable %} | ||||||
|  |     {% if (hyperlapse and printer['gcode_macro HYPERLAPSE'].run) or | ||||||
|  |           (not hyperlapse and not printer['gcode_macro HYPERLAPSE'].run) %} | ||||||
|  |       {% if park.enable %} | ||||||
|  |         {% set pos = {'x': 'X' + park.coord.x|string if park.pos != 'y_only' else '',  | ||||||
|  |                       'y': 'Y' + park.coord.y|string if park.pos != 'x_only' else '',  | ||||||
|  |                       'z': 'Z'+ [printer.gcode_move.gcode_position.z + park.coord.dz, printer.toolhead.axis_maximum.z]|min|string} %} | ||||||
|  |         {% set restore = {'absolute': {'coordinates': printer.gcode_move.absolute_coordinates, | ||||||
|  |                                        'extrude'    : printer.gcode_move.absolute_extrude}, | ||||||
|  |                           'speed'   : printer.gcode_move.speed, | ||||||
|  |                           'e'       : printer.gcode_move.gcode_position.e, | ||||||
|  |                           'factor'  : {'speed'  : printer.gcode_move.speed_factor, | ||||||
|  |                                        'extrude': printer.gcode_move.extrude_factor}} %} | ||||||
|  |         SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=restore VALUE="{restore}" | ||||||
|  |         {% if not printer[printer.toolhead.extruder].can_extrude %} | ||||||
|  |           {% if verbose %}{action_respond_info("Timelapse: Warning, minimum extruder temperature not reached!")}{% endif %} | ||||||
|  |         {% else %} | ||||||
|  |           {% if extruder.fw_retract %} | ||||||
|  |             G10 | ||||||
|  |           {% else %} | ||||||
|  |             M83     ; insure relative extrusion | ||||||
|  |             G0 E-{extruder.retract} F{speed.retract * 60} | ||||||
|  |           {% endif %} | ||||||
|  |         {% endif %} | ||||||
|  |         SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=is_paused VALUE=True  | ||||||
|  |         {macro.pause}            ; execute the klipper PAUSE command | ||||||
|  |         SET_GCODE_OFFSET X=0 Y=0 ; this will insure that the head parks always at the same position in a multi setup | ||||||
|  |         G90                      ; insure absolute move | ||||||
|  |         {% if "xyz" not in printer.toolhead.homed_axes %} | ||||||
|  |           {% if verbose %}{action_respond_info("Timelapse: Warning, axis not homed yet!")}{% endif %} | ||||||
|  |         {% else %} | ||||||
|  |           G0 {pos.x} {pos.y} {pos.z} F{speed.travel * 60} | ||||||
|  |         {% endif %} | ||||||
|  |         SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=takingframe VALUE=True | ||||||
|  |         UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_TAKE_FRAME DURATION={check_time} | ||||||
|  |         M400 | ||||||
|  |       {% endif %} | ||||||
|  |       _TIMELAPSE_NEW_FRAME HYPERLAPSE={hyperlapse} | ||||||
|  |     {% endif %}     | ||||||
|  |   {% else %} | ||||||
|  |     {% if verbose %}{action_respond_info("Timelapse: disabled, take frame ignored")}{% endif %} | ||||||
|  |   {% endif %} | ||||||
|  | 
 | ||||||
|  | [gcode_macro _TIMELAPSE_NEW_FRAME] | ||||||
|  | description: action call for timelapse shoot. must be a seperate macro | ||||||
|  | gcode:   | ||||||
|  |  {action_call_remote_method("timelapse_newframe",  | ||||||
|  |                             macropark=printer['gcode_macro TIMELAPSE_TAKE_FRAME'].park,  | ||||||
|  |                             hyperlapse=params.HYPERLAPSE)} | ||||||
|  | 
 | ||||||
|  | [delayed_gcode _WAIT_TIMELAPSE_TAKE_FRAME] | ||||||
|  | gcode: | ||||||
|  |   {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} | ||||||
|  |   {% set factor = {'speed': printer.gcode_move.speed_factor, 'extrude': printer.gcode_move.extrude_factor} %} | ||||||
|  |   {% if tl.takingframe %} | ||||||
|  |     UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_TAKE_FRAME DURATION={tl.check_time} | ||||||
|  |   {% else %} | ||||||
|  |     {tl.macro.resume} VELOCITY={tl.speed.travel} ; execute the klipper RESUME command | ||||||
|  |     SET_GCODE_VARIABLE MACRO=TIMELAPSE_TAKE_FRAME VARIABLE=is_paused VALUE=False | ||||||
|  |     {% if not printer[printer.toolhead.extruder].can_extrude %} | ||||||
|  |         {action_respond_info("Timelapse: Warning minimum extruder temperature not reached!")} | ||||||
|  |     {% else %} | ||||||
|  |       {% if tl.extruder.fw_retract %} | ||||||
|  |         G11 | ||||||
|  |       {% else %} | ||||||
|  |         G0 E{tl.extruder.extrude} F{tl.speed.extrude * 60} | ||||||
|  |         G0 F{tl.restore.speed} | ||||||
|  |         {% if tl.restore.absolute.extrude %}  | ||||||
|  |           M82 | ||||||
|  |           G92 E{tl.restore.e} | ||||||
|  |         {% endif %} | ||||||
|  |       {% endif %} | ||||||
|  |     {% endif %} | ||||||
|  |     {% if tl.restore.factor.speed   != factor.speed   %} M220 S{(factor.speed*100)|round(0)}   {% endif %} | ||||||
|  |     {% if tl.restore.factor.extrude != factor.extrude %} M221 S{(factor.extrude*100)|round(0)} {% endif %} | ||||||
|  |     {% if not tl.restore.absolute.coordinates %} G91 {% endif %} | ||||||
|  |   {% endif %} | ||||||
|  | 
 | ||||||
|  | #################################################################################################### | ||||||
|  | #                                                                                                  # | ||||||
|  | # HYPERLAPSE: Starts or stops a Hyperlapse video                                                   # | ||||||
|  | # Usage: HYPERLAPSE ACTION=START [CYCLE=time] starts a hyperlapse with cycle time (default 30 sec) # | ||||||
|  | #        HYPERLAPSE ACTION=STOP stops the hyperlapse recording                                     #  | ||||||
|  | #                                                                                                  # | ||||||
|  | #################################################################################################### | ||||||
|  | 
 | ||||||
|  | ######################### definition ######################### | ||||||
|  | ## cycle: cycle time in seconds | ||||||
|  | ## run: internal use [True/False] | ||||||
|  | ############################################################### | ||||||
|  | [gcode_macro HYPERLAPSE] | ||||||
|  | description: Start/Stop a hyperlapse recording | ||||||
|  | variable_cycle: 0 | ||||||
|  | variable_run: False | ||||||
|  | gcode: | ||||||
|  |   {% set cycle = params.CYCLE|default(30)|int %} | ||||||
|  |   {% if params.ACTION and params.ACTION|lower == 'start' %} | ||||||
|  |     {action_respond_info("Hyperlapse: frames started (Cycle %d sec)" % cycle)} | ||||||
|  |     SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=run VALUE=True | ||||||
|  |     SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=cycle VALUE={cycle} | ||||||
|  |     UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION={cycle} | ||||||
|  |     TIMELAPSE_TAKE_FRAME HYPERLAPSE=True | ||||||
|  |   {% elif params.ACTION and params.ACTION|lower == 'stop' %} | ||||||
|  |     {% if run %}{action_respond_info("Hyperlapse: frames stopped")}{% endif %} | ||||||
|  |     SET_GCODE_VARIABLE MACRO=HYPERLAPSE VARIABLE=run VALUE=False | ||||||
|  |     UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION=0 | ||||||
|  |   {% else %} | ||||||
|  |     {action_raise_error("Hyperlapse: No valid input parameter | ||||||
|  |                          Use:  | ||||||
|  |                          - HYPERLAPSE ACTION=START [CYCLE=time] | ||||||
|  |                          - HYPERLAPSE ACTION=STOP")} | ||||||
|  |   {% endif %} | ||||||
|  | 
 | ||||||
|  | [delayed_gcode _HYPERLAPSE_LOOP] | ||||||
|  | gcode: | ||||||
|  |   UPDATE_DELAYED_GCODE ID=_HYPERLAPSE_LOOP DURATION={printer["gcode_macro HYPERLAPSE"].cycle} | ||||||
|  |   TIMELAPSE_TAKE_FRAME HYPERLAPSE=True | ||||||
|  | 
 | ||||||
|  | ########################################################################## | ||||||
|  | #                                                                        # | ||||||
|  | # TIMELAPSE_RENDER: Render the video at print end                        # | ||||||
|  | #                                                                        # | ||||||
|  | ########################################################################## | ||||||
|  | 
 | ||||||
|  | ######################### definition ######################### | ||||||
|  | ## render: internal use. Valid inputs: [True, False] | ||||||
|  | ## run_identifier: internal use. Valid input [0 .. 3] | ||||||
|  | ############################################################### | ||||||
|  | [gcode_macro TIMELAPSE_RENDER] | ||||||
|  | description: Render Timelapse video and wait for the result | ||||||
|  | variable_render: False | ||||||
|  | variable_run_identifier: 0 | ||||||
|  | gcode: | ||||||
|  |   {action_respond_info("Timelapse: Rendering started")} | ||||||
|  |   {action_call_remote_method("timelapse_render", byrendermacro="True")} | ||||||
|  |   SET_GCODE_VARIABLE MACRO=TIMELAPSE_RENDER VARIABLE=render VALUE=True | ||||||
|  |   {printer.configfile.settings['gcode_macro pause'].rename_existing} ; execute the klipper PAUSE command | ||||||
|  |   UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_RENDER DURATION=0.5 | ||||||
|  | 
 | ||||||
|  | [delayed_gcode _WAIT_TIMELAPSE_RENDER] | ||||||
|  | gcode: | ||||||
|  |   {% set ri = printer['gcode_macro TIMELAPSE_RENDER'].run_identifier % 4 %} | ||||||
|  |   SET_GCODE_VARIABLE MACRO=TIMELAPSE_RENDER VARIABLE=run_identifier VALUE={ri + 1} | ||||||
|  |   {% if printer['gcode_macro TIMELAPSE_RENDER'].render %} | ||||||
|  |     M117 Rendering {['-','\\','|','/'][ri]} | ||||||
|  |     UPDATE_DELAYED_GCODE ID=_WAIT_TIMELAPSE_RENDER DURATION=0.5 | ||||||
|  |   {% else %} | ||||||
|  |     {action_respond_info("Timelapse: Rendering finished")} | ||||||
|  |     M117 | ||||||
|  |     {printer.configfile.settings['gcode_macro resume'].rename_existing} ; execute the klipper RESUME command | ||||||
|  |   {% endif %} | ||||||
|  | 
 | ||||||
|  | ########################################################################## | ||||||
|  | #                                                                        # | ||||||
|  | # TEST_STREAM_DELAY: Helper macro to find stream and park delay          # | ||||||
|  | #                                                                        # | ||||||
|  | ########################################################################## | ||||||
|  | 
 | ||||||
|  | [gcode_macro TEST_STREAM_DELAY] | ||||||
|  | description: Helper macro to find stream and park delay | ||||||
|  | gcode: | ||||||
|  |   {% set min = printer.toolhead.axis_minimum %} | ||||||
|  |   {% set max = printer.toolhead.axis_maximum %} | ||||||
|  |   {% set act = printer.toolhead.position %} | ||||||
|  |   {% set tl = printer['gcode_macro TIMELAPSE_TAKE_FRAME'] %} | ||||||
|  |   {% if act.z > 5.0 %} | ||||||
|  |     G0 X{min.x + 5.0} F{tl.speed.travel|int * 60} | ||||||
|  |     G0 X{(max.x-min.x)/2} | ||||||
|  |     G4 P{tl.park.time|float * 1000} | ||||||
|  |     _TIMELAPSE_NEW_FRAME HYPERLAPSE=FALSE | ||||||
|  |     G0 X{max.x - 5.0} | ||||||
|  |   {% else %} | ||||||
|  |     {action_raise_error("Toolhead z %.3f to low. Please place head above z = 5.0" % act.z)} | ||||||
|  |   {% endif %} | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user