# AFC lane tools: LANE_FEED_UNTIL_HUB_OPEN, LANE_FEED_ABORT, AFC_CLEAR_ALL_MESSAGES ##################################################################### ## unloading help ##################################################################### [gcode_macro LANE_FEED_UNTIL_HUB_OPEN] variable_lane: 1 variable_step: -50 variable_max_dist: 2000 variable_moved: 0 variable_active: 0 gcode: {% set lane = params.LANE|default(1)|int %} {% set step = params.STEP|default(-50)|float %} {% set max_dist = params.MAX_DIST|default(2000)|float %} SET_GCODE_VARIABLE MACRO=LANE_FEED_UNTIL_HUB_OPEN VARIABLE=lane VALUE={lane} SET_GCODE_VARIABLE MACRO=LANE_FEED_UNTIL_HUB_OPEN VARIABLE=step VALUE={step} SET_GCODE_VARIABLE MACRO=LANE_FEED_UNTIL_HUB_OPEN VARIABLE=max_dist VALUE={max_dist} SET_GCODE_VARIABLE MACRO=LANE_FEED_UNTIL_HUB_OPEN VARIABLE=moved VALUE=0 SET_GCODE_VARIABLE MACRO=LANE_FEED_UNTIL_HUB_OPEN VARIABLE=active VALUE=1 RESPOND PREFIX="info" MSG="START lane={lane} step={step} max={max_dist}" UPDATE_DELAYED_GCODE ID=_lane_feed_loop DURATION=0.05 [delayed_gcode _lane_feed_loop] gcode: {% set m = printer["gcode_macro LANE_FEED_UNTIL_HUB_OPEN"] %} {% if m.active == 1 %} LANE_MOVE LANE=lane{m.lane} DISTANCE={m.step} {% set new_moved = m.moved + m.step %} SET_GCODE_VARIABLE MACRO=LANE_FEED_UNTIL_HUB_OPEN VARIABLE=moved VALUE={new_moved} RESPOND PREFIX="info" MSG="MOVE lane={m.lane} step={m.step} moved={new_moved}" QUERY_ENDSTOPS UPDATE_DELAYED_GCODE ID=_lane_eval DURATION=0.03 {% else %} RESPOND PREFIX="info" MSG="feed_loop inactive" {% endif %} [delayed_gcode _lane_eval] gcode: {% set m = printer["gcode_macro LANE_FEED_UNTIL_HUB_OPEN"] %} {% if m.active == 1 %} {% set hub = printer.query_endstops.last_query.get("hub", "unknown") %} # RESPOND PREFIX="info" MSG="QUERY hub={hub} raw={printer.query_endstops.last_query.get('hub', 'MISSING')}" # RESPOND PREFIX="info" MSG="last_query: {printer.query_endstops.last_query}" {% if hub == "open" or hub == 0 %} RESPOND PREFIX="info" MSG="HUB TRIGGERED → STOP" SET_GCODE_VARIABLE MACRO=LANE_FEED_UNTIL_HUB_OPEN VARIABLE=active VALUE=0 LANE_MOVE LANE=lane{m.lane} DISTANCE=-100 {% elif m.moved|abs >= m.max_dist %} RESPOND PREFIX="warning" MSG="MAX DIST STOP reached={m.moved}" SET_GCODE_VARIABLE MACRO=LANE_FEED_UNTIL_HUB_OPEN VARIABLE=active VALUE=0 {% else %} RESPOND PREFIX="info" MSG="CONTINUE" UPDATE_DELAYED_GCODE ID=_lane_feed_loop DURATION=0.03 {% endif %} {% else %} RESPOND PREFIX="info" MSG="eval inactive" {% endif %} [gcode_macro LANE_FEED_ABORT] gcode: SET_GCODE_VARIABLE MACRO=LANE_FEED_UNTIL_HUB_OPEN VARIABLE=active VALUE=0 UPDATE_DELAYED_GCODE ID=_lane_feed_loop DURATION=0 UPDATE_DELAYED_GCODE ID=_lane_eval DURATION=0 RESPOND PREFIX="warning" MSG="ABORTED" # [gcode_macro TEST_AMS_STRESS] # gcode: # {% for i in range(500) %} # T0 ; Load tool 0 # G4 P5000 ; Wait 5s # T1 ; Unload # G4 P3000 ; Wait 3s # {% endfor %} ##################################################################### ## AFC messages ##################################################################### # AFC queues every error and warning; the UI shows only the first one and # AFC_CLEAR_MESSAGE removes only that one. AFC does not expose the queue # length, so clear MAX times (clearing an empty queue does nothing). [gcode_macro AFC_CLEAR_ALL_MESSAGES] description: Clear all AFC error and warning messages (MAX=50) gcode: {% for i in range(params.MAX|default(50)|int) %} AFC_CLEAR_MESSAGE {% endfor %}