From 27f06b87c699a3aaa8494d4fce71990f96ed92e9 Mon Sep 17 00:00:00 2001 From: suchmememanyskill <38142618+suchmememanyskill@users.noreply.github.com> Date: Sat, 3 Oct 2026 21:23:15 +0200 Subject: [PATCH 1/5] Make save/restore fan state work without the aux/case fan being present; use save/restore fan state in PURGE macro --- .../recipes-apps/klipper/files/macros.cfg | 50 +++++++++++++------ 1 file changed, 35 insertions(+), 15 deletions(-) diff --git a/meta-opencentauri/recipes-apps/klipper/files/macros.cfg b/meta-opencentauri/recipes-apps/klipper/files/macros.cfg index de269e87..3c8d94cc 100644 --- a/meta-opencentauri/recipes-apps/klipper/files/macros.cfg +++ b/meta-opencentauri/recipes-apps/klipper/files/macros.cfg @@ -8,7 +8,7 @@ variable_target_extruder: 0 variable_retract_amount: 2 variable_retract_end: 5 variable_extruder_temp:{'probing': 140, 'cleaning': 200, 'loading': 230, 'purging': 250} -variable_fan_state:{'p1': 0.0, 'p2': 0.0, 'p3': 0.0} +variable_fan_states: {'default': {'p1': 0.0, 'p2': 0.0, 'p3': 0.0}} variable_z_maximum_lifting_distance: 256 variable_pause_resume_travel_speed: 150 variable_z_bed_level: -2 @@ -804,28 +804,46 @@ gcode: [gcode_macro TURN_OFF_FANS] gcode: M107 - SET_FAN_SPEED FAN=aux_fan SPEED=0 - SET_FAN_SPEED FAN=case_fan SPEED=0 + {% if 'fan_generic aux_fan' in printer %} + SET_FAN_SPEED FAN=aux_fan SPEED=0 + {% endif %} + {% if 'fan_generic case_fan' in printer %} + SET_FAN_SPEED FAN=case_fan SPEED=0 + {% endif %} SET_TEMPERATURE_FAN_TARGET temperature_fan=mainboard RESPOND MSG="ALL FANS OFF!" [gcode_macro _SAVE_FAN_STATE] gcode: - {% set fan_state = { - 'p1': printer.fan.speed|float, - 'p2': printer['fan_generic aux_fan'].speed|float, - 'p3': printer['fan_generic case_fan'].speed|float - } %} + {% set name = params.NAME|default('default')|lower %} + {% set fan_states = dict(printer['gcode_macro _global_var'].fan_states) %} + {% set fan_state = {'p1': printer.fan.speed|float} %} + {% if 'fan_generic aux_fan' in printer %} + {% set fan_state = dict(fan_state, p2=printer['fan_generic aux_fan'].speed|float) %} + {% endif %} + {% if 'fan_generic case_fan' in printer %} + {% set fan_state = dict(fan_state, p3=printer['fan_generic case_fan'].speed|float) %} + {% endif %} + {% set fan_states = dict(fan_states, **{name: fan_state}) %} - SET_GCODE_VARIABLE MACRO=_global_var VARIABLE=fan_state VALUE="{fan_state}" + SET_GCODE_VARIABLE MACRO=_global_var VARIABLE=fan_states VALUE="{fan_states}" [gcode_macro _RESTORE_FAN_STATE] gcode: - {% set fan_state = printer['gcode_macro _global_var'].fan_state %} + {% set name = params.NAME|default('default')|lower %} + {% set fan_states = printer['gcode_macro _global_var'].fan_states %} + {% if name not in fan_states %} + {action_raise_error("No saved fan state named '%s'" % name)} + {% endif %} + {% set fan_state = fan_states[name] %} M106 P1 S{(fan_state.p1|float * 255)|int} - M106 P2 S{(fan_state.p2|float * 255)|int} - M106 P3 S{(fan_state.p3|float * 255)|int} + {% if 'fan_generic aux_fan' in printer and 'p2' in fan_state %} + M106 P2 S{(fan_state.p2|float * 255)|int} + {% endif %} + {% if 'fan_generic case_fan' in printer and 'p3' in fan_state %} + M106 P3 S{(fan_state.p3|float * 255)|int} + {% endif %} [gcode_macro M600] gcode: @@ -938,8 +956,11 @@ gcode: RESPOND MSG="Purging {purge_length}mm of filament in {rounds} rounds of {per_round}mm each" ; Turn off fans + _SAVE_FAN_STATE NAME=purge M107 P1 - M107 P2 + {% if 'fan_generic aux_fan' in printer %} + M107 P2 + {% endif %} {% for i in range(rounds) %} MOVE_TO_TRAY @@ -960,8 +981,7 @@ gcode: {% endfor %} ; Restore fans - M106 P1 S{(printer.fan.speed|float * 255)|int} - M106 P2 S{(printer['fan_generic aux_fan'].speed|float * 255)|int} + _RESTORE_FAN_STATE NAME=purge [gcode_macro M300] gcode: From ddab9d740e61af74b58a6e6fdae8b697e9505622 Mon Sep 17 00:00:00 2001 From: suchmememanyskill <38142618+suchmememanyskill@users.noreply.github.com> Date: Sun, 4 Oct 2026 15:49:07 +0200 Subject: [PATCH 2/5] Add CC2 variants of CLEAN_NOZZLE, MOVE_TO_TRAY and KICK. Split up macros between shared and machine-specific macros --- .../files/centauri-carbon-1/macros.cfg | 103 +++++++++++++++++ .../files/centauri-carbon-2/machine.cfg | 4 +- .../files/centauri-carbon-2/macros.cfg | 95 ++++++++++++++++ .../files/{macros.cfg => shared-macros.cfg} | 105 ++---------------- .../recipes-apps/klipper/kalico_2026.02.00.bb | 4 +- .../centauri-carbon-1/canvas-toolhead.cfg | 1 - 6 files changed, 215 insertions(+), 97 deletions(-) create mode 100644 meta-opencentauri/recipes-apps/klipper/files/centauri-carbon-1/macros.cfg create mode 100644 meta-opencentauri/recipes-apps/klipper/files/centauri-carbon-2/macros.cfg rename meta-opencentauri/recipes-apps/klipper/files/{macros.cfg => shared-macros.cfg} (91%) diff --git a/meta-opencentauri/recipes-apps/klipper/files/centauri-carbon-1/macros.cfg b/meta-opencentauri/recipes-apps/klipper/files/centauri-carbon-1/macros.cfg new file mode 100644 index 00000000..cae9106c --- /dev/null +++ b/meta-opencentauri/recipes-apps/klipper/files/centauri-carbon-1/macros.cfg @@ -0,0 +1,103 @@ +# ----- +# PLEASE DO NOT EDIT THIS FILE. EDIT printer.cfg INSTEAD. +# UPDATES WILL RESET THIS FILE. YOUR EDITS WILL BE LOST WHEN UPDATING. +# ----- + +# Candidates for split: +# M191: Enable fan servo (maybe better for cc2 file) +# RESUME: Probably needs adjustable purge amount +# CLEAN_NOZZLE: Entirely different wiper +# MOVE_TO_TRAY: Entirely different position +# KICK: Entirely different kick +# CUT_FILAMENT: Might need adjustmnet +# LOADCELL_Z_HOME: Will probably work but check +# M729: Machine specific +# M8213: Machine specific +# (TODO: Make those for cc2 as well) +# CLEAN_NOZZLE: Maybe push filament, with KICK as well +# PURGE: Needs splitting vars + +[gcode_macro M729] +gcode: + { action_emergency_stop("Use COSMOS OrcaSlicer profile (or COSMOS start/end machine gcode).") } + +[gcode_macro M8213] +gcode: + { action_emergency_stop("Use COSMOS OrcaSlicer profile (or COSMOS start/end machine gcode).") } + +[gcode_macro CLEAN_NOZZLE] +gcode: + {% set global = printer['gcode_macro _global_var'] %} + {% set pre_toolhead_target = printer.extruder.target|int %} + {% set target = params.TARGET|default(global.extruder_temp.cleaning if pre_toolhead_target < global.extruder_temp.cleaning else pre_toolhead_target)|int %} + M104 S{target} + _CG28 AXIS=XY + G90 + + MOVE_TO_TRAY + M104 S{target} + TEMPERATURE_WAIT SENSOR=extruder MINIMUM={target} MAXIMUM={target+5} + M106 S255 + # Wipe + G1 F9000 + {% for wipes in range(4) %} + {% for i in range(8) %} + {% set x = 187 - (i * 2) %} + {% set y = 264 if i % 2 == 0 else 262 %} + G1 X{x} Y{y} + {% endfor %} + G1 X187 + {% endfor %} + G1 Y250 + # Clear command queue + M104 S{pre_toolhead_target} + M107 + M400 + +[gcode_macro MOVE_TO_TRAY] +gcode: + _CG28 AXIS=XY + + {% if printer.gcode_move.position.x > 201.5 and printer.gcode_move.position.x < 202.5 and printer.gcode_move.position.y > 263.5 and printer.gcode_move.position.y < 264.5 and "xy" in printer.toolhead.homed_axes %} + RETURN ; Already at the tray + {% endif %} + + G90 ; Absolute positioning + G0 X202 F12000 + G0 Y250 F12000 ; Move near to the try + G0 Y264 F1200 ; Move slowly back to the tray + + M400 ; Wait for movements to complete + +[gcode_macro KICK] +variable_end_kick_x: 186 +gcode: + {% set global = printer['gcode_macro _global_var'] %} + {% set self = printer["gcode_macro KICK"] %} + {% set end_kick_x = self.end_kick_x|float %} + {% set retract_amount = global.retract_amount|float %} + + {% if "xy" not in printer.toolhead.homed_axes %} + {action_raise_error("Printer not homed")} + {% endif %} + + {% if printer.extruder.target < 180 or not printer.extruder.can_extrude %} + {action_raise_error("Extruder not hot enough to kick")} + {% endif %} + + G90 ; Absolute positioning + M83 ; E relative + + MOVE_TO_TRAY ; Move to the tray + G1 E-{retract_amount} F300 ; Retract slightly to reduce pressure during kick + M106 S255 ; Full blast fan to solidify plastic + G4 P2000 ; Wait 2 seconds for fan to do its work + G1 F8000 ; Set feedrate + G1 X{self.end_kick_x} ; Swipe over the v-slot (into) + G1 X193 ; Swipe over the v-slot (out of) + G1 X{self.end_kick_x} ; Swipe over the v-slot (into) + M107 ; Turn off fan + + G1 Y250 F6000 ; Exit + + M400 ; Wait for movements to complete \ No newline at end of file diff --git a/meta-opencentauri/recipes-apps/klipper/files/centauri-carbon-2/machine.cfg b/meta-opencentauri/recipes-apps/klipper/files/centauri-carbon-2/machine.cfg index f0549aa7..acc31b2e 100644 --- a/meta-opencentauri/recipes-apps/klipper/files/centauri-carbon-2/machine.cfg +++ b/meta-opencentauri/recipes-apps/klipper/files/centauri-carbon-2/machine.cfg @@ -56,8 +56,8 @@ enable_pin: !PF6 endstop_pin: tmc2209_stepper_x:virtual_endstop microsteps: 16 full_steps_per_rotation: 200 -position_endstop: 256 -position_max: 256 +position_endstop: 256.5 +position_max: 256.5 position_min: -2 homing_speed: 80 homing_retract_dist: 20 diff --git a/meta-opencentauri/recipes-apps/klipper/files/centauri-carbon-2/macros.cfg b/meta-opencentauri/recipes-apps/klipper/files/centauri-carbon-2/macros.cfg new file mode 100644 index 00000000..b77f55b3 --- /dev/null +++ b/meta-opencentauri/recipes-apps/klipper/files/centauri-carbon-2/macros.cfg @@ -0,0 +1,95 @@ +# ----- +# PLEASE DO NOT EDIT THIS FILE. EDIT printer.cfg INSTEAD. +# UPDATES WILL RESET THIS FILE. YOUR EDITS WILL BE LOST WHEN UPDATING. +# ----- + +[gcode_macro _global_var] +variable_always_kick_during_purge: True + +[gcode_macro M6211] +gcode: + { action_emergency_stop("Use COSMOS OrcaSlicer profile (or COSMOS start/end machine gcode).") } + +[gcode_macro G180] +gcode: + { action_emergency_stop("Use COSMOS OrcaSlicer profile (or COSMOS start/end machine gcode).") } + +[gcode_macro MOVE_TO_TRAY] +gcode: + _CG28 AXIS=XY + + {% if printer.gcode_move.position.x > 52 and printer.gcode_move.position.x < 53 and printer.gcode_move.position.y > 263.5 and printer.gcode_move.position.y < 264.5 and "xy" in printer.toolhead.homed_axes %} + RETURN ; Already at the tray + {% endif %} + + G90 ; Absolute positioning + G0 X52.5 F20000 + G0 Y245 F20000 ; Move near to the try + G0 Y264 F1200 ; Move slowly back to the tray + + M400 ; Wait for movements to complete + +[gcode_macro KICK] +gcode: + {% set global = printer['gcode_macro _global_var'] %} + {% set retract_amount = global.retract_amount|float %} + + {% if "xy" not in printer.toolhead.homed_axes %} + {action_raise_error("Printer not homed")} + {% endif %} + + {% if printer.extruder.target < 180 or not printer.extruder.can_extrude %} + {action_raise_error("Extruder not hot enough to kick")} + {% endif %} + + G90 ; Absolute positioning + M83 ; E relative + + MOVE_TO_TRAY ; Move to the tray + G1 E-{retract_amount} F300 ; Retract slightly to reduce pressure during kick + M106 S255 ; Full blast fan to solidify plastic + G4 P2000 ; Wait 2 seconds for fan to do its work + G1 Y258 F10000 + G4 P200 + G0 Y264 F1200 + G1 Y255 F8000 ; Move back into print + M107 + + M400 ; Wait for movements to complete + +[gcode_macro CLEAN_NOZZLE] +gcode: + {% set global = printer['gcode_macro _global_var'] %} + {% set pre_toolhead_target = printer.extruder.target|int %} + {% set target = params.TARGET|default(global.extruder_temp.cleaning if pre_toolhead_target < global.extruder_temp.cleaning else pre_toolhead_target)|int %} + {% set retract_amount = global.retract_amount|float %} + {% set with_retract = params.RETRACT|default('false')|lower == 'true' %} + + M104 S{target} + _CG28 AXIS=XY + G90 + M83 + + MOVE_TO_TRAY + TEMPERATURE_WAIT SENSOR=extruder MINIMUM={target} MAXIMUM={target+5} + + {% if with_retract %} + G1 E-{retract_amount} F300 ; Retract slightly to reduce pressure + {% endif %} + M106 S255 ; Full blast fan to solidify plastic + G4 P2000 ; Wait 2 seconds for fan to do its work + + G1 X64 Y264 F1200 ; Ensure to be at the right position + G1 F8000 + + {% for _ in range(3) %} + G1 X64 + G1 X80 + {% endfor %} + + M104 S{pre_toolhead_target} + + G1 Y255 ; Exit + M107 + + M400 ; Wait for movements to complete diff --git a/meta-opencentauri/recipes-apps/klipper/files/macros.cfg b/meta-opencentauri/recipes-apps/klipper/files/shared-macros.cfg similarity index 91% rename from meta-opencentauri/recipes-apps/klipper/files/macros.cfg rename to meta-opencentauri/recipes-apps/klipper/files/shared-macros.cfg index 3c8d94cc..04638900 100644 --- a/meta-opencentauri/recipes-apps/klipper/files/macros.cfg +++ b/meta-opencentauri/recipes-apps/klipper/files/shared-macros.cfg @@ -13,6 +13,9 @@ variable_z_maximum_lifting_distance: 256 variable_pause_resume_travel_speed: 150 variable_z_bed_level: -2 variable_runout_sensor_name: 'filament_switch_sensor filament_sensor' +variable_always_kick_during_purge: False +variable_purge_split_length: 100 +variable_purge_default_amount: 200 gcode: [gcode_macro PRINT_START] @@ -135,9 +138,7 @@ gcode: RETURN {% endif %} - {% if "xyz" not in printer.toolhead.homed_axes %} - G28 - {% endif %} + _CG28 SET_DISPLAY_TEXT MSG="Chamber: {target_chamber}c" M106 S255 @@ -318,83 +319,6 @@ gcode: RESUME_BASE -[gcode_macro CLEAN_NOZZLE] -gcode: - {% set global = printer['gcode_macro _global_var'] %} - {% set pre_toolhead_target = printer.extruder.target|int %} - {% set target = params.TARGET|default(global.extruder_temp.cleaning if pre_toolhead_target < global.extruder_temp.cleaning else pre_toolhead_target)|int %} - M104 S{target} - _CG28 AXIS=XY - G90 - - MOVE_TO_TRAY - M104 S{target} - TEMPERATURE_WAIT SENSOR=extruder MINIMUM={target} MAXIMUM={target+5} - M106 S255 - # Wipe - G1 F9000 - {% for wipes in range(4) %} - {% for i in range(8) %} - {% set x = 187 - (i * 2) %} - {% set y = 264 if i % 2 == 0 else 262 %} - G1 X{x} Y{y} - {% endfor %} - G1 X187 - {% endfor %} - G1 Y250 - # Clear command queue - M104 S{pre_toolhead_target} - M107 - M400 - -[gcode_macro MOVE_TO_TRAY] -gcode: - _CG28 AXIS=XY - - {% if printer.gcode_move.position.x > 201.5 and printer.gcode_move.position.x < 202.5 and printer.gcode_move.position.y > 263.5 and printer.gcode_move.position.y < 264.5 and "xy" in printer.toolhead.homed_axes %} - RETURN ; Already at the tray - {% endif %} - - G90 ; Absolute positioning - G0 X202 F12000 - G0 Y250 F12000 ; Move near to the try - G0 Y264 F1200 ; Move slowly back to the tray - - M400 ; Wait for movements to complete - -[gcode_macro KICK] -variable_end_kick_x: 186 -gcode: - {% set global = printer['gcode_macro _global_var'] %} - {% set self = printer["gcode_macro KICK"] %} - {% set end_kick_x = self.end_kick_x|float %} - {% set retract_amount = global.retract_amount|float %} - - {% if "xy" not in printer.toolhead.homed_axes %} - {action_raise_error("Printer not homed")} - {% endif %} - - {% if printer.extruder.target < 180 or not printer.extruder.can_extrude %} - {action_raise_error("Extruder not hot enough to kick")} - {% endif %} - - G90 ; Absolute positioning - M83 ; E relative - - MOVE_TO_TRAY ; Move to the tray - G1 E-{retract_amount} F300 ; Retract slightly to reduce pressure during kick - M106 S255 ; Full blast fan to solidify plastic - G4 P2000 ; Wait 2 seconds for fan to do its work - G1 F8000 ; Set feedrate - G1 X{self.end_kick_x} ; Swipe over the v-slot (into) - G1 X193 ; Swipe over the v-slot (out of) - G1 X{self.end_kick_x} ; Swipe over the v-slot (into) - M107 ; Turn off fan - - G1 Y250 F6000 ; Exit - - M400 ; Wait for movements to complete - [gcode_macro _LOAD_FILAMENT_STEP_PUSH] gcode: RESPOND TYPE=command MSG="action:prompt_begin Load Filament" @@ -872,7 +796,6 @@ gcode: {% set index = params.P|default(1)|int %} M106 P{index} S0 - [gcode_macro _SHOW_PROMPT] gcode: {% set title = params.TITLE|default('Please wait') %} @@ -907,15 +830,6 @@ gcode: SET_DISPLAY_TEXT_BASE MSG="{message}" - -[gcode_macro M729] -gcode: - { action_emergency_stop("Use COSMOS OrcaSlicer profile (or COSMOS start/end machine gcode).") } - -[gcode_macro M8213] -gcode: - { action_emergency_stop("Use COSMOS OrcaSlicer profile (or COSMOS start/end machine gcode).") } - [gcode_macro LOAD_SKEW_IF_EXISTS] gcode: {% set profile = params.PROFILE|default('my_skew_profile') %} @@ -940,17 +854,22 @@ gcode: SET_SKEW CLEAR=1 {% endif %} +variable_purge_split_length: 100 +variable_purge_default_amount: 200 [gcode_macro PURGE] gcode: {% set global = printer['gcode_macro _global_var'] %} - {% set purge_length = params.PURGE_LENGTH|default(200, true)|float %} + {% set always_kick = global.always_kick_during_purge|lower == 'true' %} + {% set split_length = global.purge_split_length|float %} + {% set default_purge_amount = global.purge_default_amount|float %} + {% set purge_length = params.PURGE_LENGTH|default(default_purge_amount, true)|float %} {% if printer.extruder.target < 180 or not printer.extruder.can_extrude %} M104 S{global.extruder_temp.purging} ; Heat nozzle to purging temp TEMPERATURE_WAIT SENSOR=extruder MINIMUM={global.extruder_temp.purging} MAXIMUM={global.extruder_temp.purging+5} {% endif %} - {% set rounds = [((purge_length / 100)|round(0, 'ceil'))|int , 1] |max %} + {% set rounds = [((purge_length / split_length)|round(0, 'ceil'))|int , 1] |max %} {% set per_round = (purge_length / rounds) | round(0, 'ceil') %} # small ass purge RESPOND MSG="Purging {purge_length}mm of filament in {rounds} rounds of {per_round}mm each" @@ -973,7 +892,7 @@ gcode: G1 E{per_round} F300 G1 Y264 F1200 - {% if i + 1 == rounds %} # last round, clean nozzle + {% if (not always_kick) and i + 1 == rounds %} # last round, clean nozzle CLEAN_NOZZLE RETRACT=true {% else %} KICK diff --git a/meta-opencentauri/recipes-apps/klipper/kalico_2026.02.00.bb b/meta-opencentauri/recipes-apps/klipper/kalico_2026.02.00.bb index 1df6dc3a..e5b77131 100644 --- a/meta-opencentauri/recipes-apps/klipper/kalico_2026.02.00.bb +++ b/meta-opencentauri/recipes-apps/klipper/kalico_2026.02.00.bb @@ -10,6 +10,7 @@ FILESEXTRAPATHS:prepend := "${THISDIR}/files:" SRC_URI += " \ file://klipper-init-d \ file://printer.cfg \ + file://shared-macros.cfg \ file://macros.cfg \ file://machine.cfg \ file://shell.cfg \ @@ -104,7 +105,7 @@ do_install() { # Copy non-printer .cfg files to readonly folder install -d ${D}${sysconfdir}/klipper/config/klipper-readonly - install -m 0644 ${UNPACKDIR}/machine.cfg ${UNPACKDIR}/client.cfg ${UNPACKDIR}/shell.cfg ${UNPACKDIR}/macros.cfg ${UNPACKDIR}/calibration.cfg ${UNPACKDIR}/screen.cfg ${UNPACKDIR}/kamp.cfg ${D}${sysconfdir}/klipper/config/klipper-readonly + install -m 0644 ${UNPACKDIR}/machine.cfg ${UNPACKDIR}/client.cfg ${UNPACKDIR}/shell.cfg ${UNPACKDIR}/shared-macros.cfg ${UNPACKDIR}/macros.cfg ${UNPACKDIR}/calibration.cfg ${UNPACKDIR}/screen.cfg ${UNPACKDIR}/kamp.cfg ${D}${sysconfdir}/klipper/config/klipper-readonly # Install SysVinit script install -d ${D}${sysconfdir}/init.d @@ -119,6 +120,7 @@ FILES:${PN} = " \ CONFFILES:${PN} = " \ ${sysconfdir}/klipper/config/printer.cfg \ + ${sysconfdir}/klipper/config/klipper-readonly/shared-macros.cfg \ ${sysconfdir}/klipper/config/klipper-readonly/macros.cfg \ ${sysconfdir}/klipper/config/klipper-readonly/machine.cfg \ ${sysconfdir}/klipper/config/klipper-readonly/shell.cfg \ diff --git a/meta-opencentauri/recipes-data/klipper-afc-addon/files/centauri-carbon-1/canvas-toolhead.cfg b/meta-opencentauri/recipes-data/klipper-afc-addon/files/centauri-carbon-1/canvas-toolhead.cfg index 247f12be..c6b21198 100644 --- a/meta-opencentauri/recipes-data/klipper-afc-addon/files/centauri-carbon-1/canvas-toolhead.cfg +++ b/meta-opencentauri/recipes-data/klipper-afc-addon/files/centauri-carbon-1/canvas-toolhead.cfg @@ -3,7 +3,6 @@ gcode: {% set global = printer['gcode_macro _global_var'] %} {% set pre_toolhead_target = printer.extruder.target|int %} {% set target = params.TARGET|default(global.extruder_temp.cleaning if pre_toolhead_target < global.extruder_temp.cleaning else pre_toolhead_target)|int %} - {% set self = printer["gcode_macro KICK"] %} {% set retract_amount = global.retract_amount|float %} {% set with_retract = params.RETRACT|default('false')|lower == 'true' %} From f8175c3eea64685ffbcfa1180d1c6fd77ce065e4 Mon Sep 17 00:00:00 2001 From: suchmememanyskill <38142618+suchmememanyskill@users.noreply.github.com> Date: Sun, 4 Oct 2026 20:29:43 +0200 Subject: [PATCH 3/5] Implement servo, adjust order of macros --- .../files/centauri-carbon-2/machine.cfg | 31 +++++++++++++++++++ .../files/centauri-carbon-2/macros.cfg | 2 +- .../recipes-apps/klipper/kalico_2026.02.00.bb | 5 +-- 3 files changed, 35 insertions(+), 3 deletions(-) diff --git a/meta-opencentauri/recipes-apps/klipper/files/centauri-carbon-2/machine.cfg b/meta-opencentauri/recipes-apps/klipper/files/centauri-carbon-2/machine.cfg index acc31b2e..c32b08fe 100644 --- a/meta-opencentauri/recipes-apps/klipper/files/centauri-carbon-2/machine.cfg +++ b/meta-opencentauri/recipes-apps/klipper/files/centauri-carbon-2/machine.cfg @@ -387,6 +387,37 @@ tachometer_pin: PD16 pin: PB7 initial_angle: 90.0 +[gcode_button case_servo_sensor] +pin: PB2 +press_gcode: + UPDATE_DELAYED_GCODE ID=case_servo_timeout DURATION=0 + G4 P400 ; We have no way to detect when the fan cover is fully open. Instead, the sensor triggers somewhere halfway, and around 400ms is needed to fully open it. + SET_SERVO SERVO=case_servo ANGLE=90 +release_gcode: + UPDATE_DELAYED_GCODE ID=case_servo_timeout DURATION=0 + SET_SERVO SERVO=case_servo ANGLE=90 + +[delayed_gcode case_servo_timeout] +gcode: + SET_SERVO SERVO=case_servo ANGLE=90 + RESPOND TYPE=error MSG="Servo timeout: sensor did not change" + +[gcode_macro EXHAUST_OPEN] +gcode: + {% if printer["gcode_button case_servo_sensor"].state == "PRESSED" %} ; Currently closed + RESPOND MSG="Opening exhaust cover" + UPDATE_DELAYED_GCODE ID=case_servo_timeout DURATION=5 + SET_SERVO SERVO=case_servo ANGLE=135 + {% endif %} + +[gcode_macro EXHAUST_CLOSE] +gcode: + {% if printer["gcode_button case_servo_sensor"].state == "RELEASED" %} ; Currently open + RESPOND MSG="Closing exhaust cover" + UPDATE_DELAYED_GCODE ID=case_servo_timeout DURATION=5 + SET_SERVO SERVO=case_servo ANGLE=45 + {% endif %} + [temperature_fan mainboard] pin: PG15 tachometer_pin: PB9 diff --git a/meta-opencentauri/recipes-apps/klipper/files/centauri-carbon-2/macros.cfg b/meta-opencentauri/recipes-apps/klipper/files/centauri-carbon-2/macros.cfg index b77f55b3..c8329eae 100644 --- a/meta-opencentauri/recipes-apps/klipper/files/centauri-carbon-2/macros.cfg +++ b/meta-opencentauri/recipes-apps/klipper/files/centauri-carbon-2/macros.cfg @@ -24,7 +24,7 @@ gcode: G90 ; Absolute positioning G0 X52.5 F20000 - G0 Y245 F20000 ; Move near to the try + G0 Y255 F20000 ; Move near to the try G0 Y264 F1200 ; Move slowly back to the tray M400 ; Wait for movements to complete diff --git a/meta-opencentauri/recipes-apps/klipper/kalico_2026.02.00.bb b/meta-opencentauri/recipes-apps/klipper/kalico_2026.02.00.bb index e5b77131..66dda624 100644 --- a/meta-opencentauri/recipes-apps/klipper/kalico_2026.02.00.bb +++ b/meta-opencentauri/recipes-apps/klipper/kalico_2026.02.00.bb @@ -105,7 +105,8 @@ do_install() { # Copy non-printer .cfg files to readonly folder install -d ${D}${sysconfdir}/klipper/config/klipper-readonly - install -m 0644 ${UNPACKDIR}/machine.cfg ${UNPACKDIR}/client.cfg ${UNPACKDIR}/shell.cfg ${UNPACKDIR}/shared-macros.cfg ${UNPACKDIR}/macros.cfg ${UNPACKDIR}/calibration.cfg ${UNPACKDIR}/screen.cfg ${UNPACKDIR}/kamp.cfg ${D}${sysconfdir}/klipper/config/klipper-readonly + install -m 0644 ${UNPACKDIR}/machine.cfg ${UNPACKDIR}/client.cfg ${UNPACKDIR}/shell.cfg ${UNPACKDIR}/shared-macros.cfg ${UNPACKDIR}/calibration.cfg ${UNPACKDIR}/screen.cfg ${UNPACKDIR}/kamp.cfg ${D}${sysconfdir}/klipper/config/klipper-readonly + install -m 0644 ${UNPACKDIR}/macros.cfg ${D}${sysconfdir}/klipper/config/klipper-readonly/zmacros.cfg # Install SysVinit script install -d ${D}${sysconfdir}/init.d @@ -121,7 +122,7 @@ FILES:${PN} = " \ CONFFILES:${PN} = " \ ${sysconfdir}/klipper/config/printer.cfg \ ${sysconfdir}/klipper/config/klipper-readonly/shared-macros.cfg \ - ${sysconfdir}/klipper/config/klipper-readonly/macros.cfg \ + ${sysconfdir}/klipper/config/klipper-readonly/zmacros.cfg \ ${sysconfdir}/klipper/config/klipper-readonly/machine.cfg \ ${sysconfdir}/klipper/config/klipper-readonly/shell.cfg \ ${sysconfdir}/klipper/config/klipper-readonly/screen.cfg \ From bfae7e3b9139d8a836c628cf400e60031d1089fe Mon Sep 17 00:00:00 2001 From: suchmememanyskill <38142618+suchmememanyskill@users.noreply.github.com> Date: Sun, 4 Oct 2026 20:33:48 +0200 Subject: [PATCH 4/5] Remove split macro list --- .../klipper/files/centauri-carbon-1/macros.cfg | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/meta-opencentauri/recipes-apps/klipper/files/centauri-carbon-1/macros.cfg b/meta-opencentauri/recipes-apps/klipper/files/centauri-carbon-1/macros.cfg index cae9106c..a6e776b7 100644 --- a/meta-opencentauri/recipes-apps/klipper/files/centauri-carbon-1/macros.cfg +++ b/meta-opencentauri/recipes-apps/klipper/files/centauri-carbon-1/macros.cfg @@ -3,20 +3,6 @@ # UPDATES WILL RESET THIS FILE. YOUR EDITS WILL BE LOST WHEN UPDATING. # ----- -# Candidates for split: -# M191: Enable fan servo (maybe better for cc2 file) -# RESUME: Probably needs adjustable purge amount -# CLEAN_NOZZLE: Entirely different wiper -# MOVE_TO_TRAY: Entirely different position -# KICK: Entirely different kick -# CUT_FILAMENT: Might need adjustmnet -# LOADCELL_Z_HOME: Will probably work but check -# M729: Machine specific -# M8213: Machine specific -# (TODO: Make those for cc2 as well) -# CLEAN_NOZZLE: Maybe push filament, with KICK as well -# PURGE: Needs splitting vars - [gcode_macro M729] gcode: { action_emergency_stop("Use COSMOS OrcaSlicer profile (or COSMOS start/end machine gcode).") } From 6863f946a512cd85e8a37b10dc17b4024a683139 Mon Sep 17 00:00:00 2001 From: suchmememanyskill <38142618+suchmememanyskill@users.noreply.github.com> Date: Tue, 6 Oct 2026 20:31:49 +0200 Subject: [PATCH 5/5] move cc1 camera hack to cc1 specific config --- .../files/centauri-carbon-1/macros.cfg | 48 ++++++++++++++++++- .../recipes-apps/klipper/files/shell.cfg | 46 ------------------ 2 files changed, 47 insertions(+), 47 deletions(-) diff --git a/meta-opencentauri/recipes-apps/klipper/files/centauri-carbon-1/macros.cfg b/meta-opencentauri/recipes-apps/klipper/files/centauri-carbon-1/macros.cfg index a6e776b7..00a0d81e 100644 --- a/meta-opencentauri/recipes-apps/klipper/files/centauri-carbon-1/macros.cfg +++ b/meta-opencentauri/recipes-apps/klipper/files/centauri-carbon-1/macros.cfg @@ -86,4 +86,50 @@ gcode: G1 Y250 F6000 ; Exit - M400 ; Wait for movements to complete \ No newline at end of file + M400 ; Wait for movements to complete + +[gcode_shell_command CAMERA_LIGHT_ON] +command: v4l2-ctl -d /dev/video0 --set-ctrl backlight_compensation=1 +timeout: 5 +verbose: False + +[gcode_shell_command CAMERA_LIGHT_OFF] +command: v4l2-ctl -d /dev/video0 --set-ctrl backlight_compensation=0 +timeout: 5 +verbose: False + +[gcode_macro SYNC_CAMERA_LED] +variable_last_state: 0 +gcode: + {% set current = printer["led case"].color_data[0][3] > 0 %} + {% set last = printer["gcode_macro SYNC_CAMERA_LED"].last_state %} + + {% if current != last %} + SET_GCODE_VARIABLE MACRO=SYNC_CAMERA_LED VARIABLE=last_state VALUE={current} + {% if current %} + RUN_SHELL_COMMAND CMD=CAMERA_LIGHT_ON + {% else %} + RUN_SHELL_COMMAND CMD=CAMERA_LIGHT_OFF + {% endif %} + {% endif %} + +[delayed_gcode camera_startup] +initial_duration: 1.0 +gcode: + {% set settings = printer["gcode_macro _COSMOS_SETTINGS"]|default({}) %} + {% set camera_led_on = settings.camera_led_default_on|default(false)|lower == 'true' %} + + {% if camera_led_on %} + RUN_SHELL_COMMAND CMD=CAMERA_LIGHT_ON + {% endif %} + +[delayed_gcode sync_camera_led_loop] +initial_duration: 2.0 +gcode: + {% set settings = printer["gcode_macro _COSMOS_SETTINGS"]|default({}) %} + {% set sync = settings.sync_camera_led_to_chamber_led|default(false)|lower == 'true' %} + + {% if sync %} + SYNC_CAMERA_LED + UPDATE_DELAYED_GCODE ID=sync_camera_led_loop DURATION=2 + {% endif %} \ No newline at end of file diff --git a/meta-opencentauri/recipes-apps/klipper/files/shell.cfg b/meta-opencentauri/recipes-apps/klipper/files/shell.cfg index 9aa5cefc..9d7a52e5 100644 --- a/meta-opencentauri/recipes-apps/klipper/files/shell.cfg +++ b/meta-opencentauri/recipes-apps/klipper/files/shell.cfg @@ -12,52 +12,6 @@ verbose: False gcode: RUN_SHELL_COMMAND CMD=START_DOOM -[gcode_shell_command CAMERA_LIGHT_ON] -command: v4l2-ctl -d /dev/video0 --set-ctrl backlight_compensation=1 -timeout: 5 -verbose: False - -[gcode_shell_command CAMERA_LIGHT_OFF] -command: v4l2-ctl -d /dev/video0 --set-ctrl backlight_compensation=0 -timeout: 5 -verbose: False - -[gcode_macro SYNC_CAMERA_LED] -variable_last_state: 0 -gcode: - {% set current = printer["led case"].color_data[0][3] > 0 %} - {% set last = printer["gcode_macro SYNC_CAMERA_LED"].last_state %} - - {% if current != last %} - SET_GCODE_VARIABLE MACRO=SYNC_CAMERA_LED VARIABLE=last_state VALUE={current} - {% if current %} - RUN_SHELL_COMMAND CMD=CAMERA_LIGHT_ON - {% else %} - RUN_SHELL_COMMAND CMD=CAMERA_LIGHT_OFF - {% endif %} - {% endif %} - -[delayed_gcode camera_startup] -initial_duration: 1.0 -gcode: - {% set settings = printer["gcode_macro _COSMOS_SETTINGS"]|default({}) %} - {% set camera_led_on = settings.camera_led_default_on|default(false)|lower == 'true' %} - - {% if camera_led_on %} - RUN_SHELL_COMMAND CMD=CAMERA_LIGHT_ON - {% endif %} - -[delayed_gcode sync_camera_led_loop] -initial_duration: 2.0 -gcode: - {% set settings = printer["gcode_macro _COSMOS_SETTINGS"]|default({}) %} - {% set sync = settings.sync_camera_led_to_chamber_led|default(false)|lower == 'true' %} - - {% if sync %} - SYNC_CAMERA_LED - UPDATE_DELAYED_GCODE ID=sync_camera_led_loop DURATION=2 - {% endif %} - [gcode_shell_command CAMERA_START] command: /etc/init.d/ustreamer start timeout: 5