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