|
|
@ -22,7 +22,7 @@ |
|
|
|
|
|
|
|
#include "../../inc/MarlinConfigPre.h" |
|
|
|
|
|
|
|
#if ENABLED(Z_STEPPER_AUTO_ALIGN) |
|
|
|
#if EITHER(Z_MULTI_ENDSTOPS, Z_STEPPER_AUTO_ALIGN) |
|
|
|
|
|
|
|
#include "../../feature/z_stepper_align.h" |
|
|
|
|
|
|
@ -51,15 +51,52 @@ |
|
|
|
/**
|
|
|
|
* G34: Z-Stepper automatic alignment |
|
|
|
* |
|
|
|
* I<iterations> |
|
|
|
* T<accuracy> |
|
|
|
* A<amplification> |
|
|
|
* R<recalculate> points based on current probe offsets |
|
|
|
* Manual stepper lock controls (reset by G28): |
|
|
|
* L Unlock all steppers |
|
|
|
* Z<1-4> Z stepper to lock / unlock |
|
|
|
* S<state> 0=UNLOCKED 1=LOCKED. If omitted, assume LOCKED. |
|
|
|
* |
|
|
|
* Examples: |
|
|
|
* G34 Z1 ; Lock Z1 |
|
|
|
* G34 L Z2 ; Unlock all, then lock Z2 |
|
|
|
* G34 Z2 S0 ; Unlock Z2 |
|
|
|
* |
|
|
|
* With Z_STEPPER_AUTO_ALIGN: |
|
|
|
* I<iterations> Number of tests. If omitted, Z_STEPPER_ALIGN_ITERATIONS. |
|
|
|
* T<accuracy> Target Accuracy factor. If omitted, Z_STEPPER_ALIGN_ACC. |
|
|
|
* A<amplification> Provide an Amplification value. If omitted, Z_STEPPER_ALIGN_AMP. |
|
|
|
* R Flag to recalculate points based on current probe offsets |
|
|
|
*/ |
|
|
|
void GcodeSuite::G34() { |
|
|
|
DEBUG_SECTION(log_G34, "G34", DEBUGGING(LEVELING)); |
|
|
|
if (DEBUGGING(LEVELING)) log_machine_info(); |
|
|
|
|
|
|
|
planner.synchronize(); // Prevent damage
|
|
|
|
|
|
|
|
const bool seenL = parser.seen('L'); |
|
|
|
if (seenL) stepper.set_all_z_lock(false); |
|
|
|
|
|
|
|
const bool seenZ = parser.seenval('Z'); |
|
|
|
if (seenZ) { |
|
|
|
const bool state = parser.boolval('S', true); |
|
|
|
switch (parser.intval('Z')) { |
|
|
|
case 1: stepper.set_z1_lock(state); break; |
|
|
|
case 2: stepper.set_z2_lock(state); break; |
|
|
|
#if NUM_Z_STEPPER_DRIVERS >= 3 |
|
|
|
case 3: stepper.set_z3_lock(state); break; |
|
|
|
#if NUM_Z_STEPPER_DRIVERS >= 4 |
|
|
|
case 4: stepper.set_z4_lock(state); break; |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if (seenL || seenZ) { |
|
|
|
stepper.set_separate_multi_axis(seenZ); |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
#if ENABLED(Z_STEPPER_AUTO_ALIGN) |
|
|
|
do { // break out on error
|
|
|
|
|
|
|
|
#if NUM_Z_STEPPER_DRIVERS == 4 |
|
|
@ -81,24 +118,16 @@ void GcodeSuite::G34() { |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
const float z_auto_align_amplification = |
|
|
|
#if ENABLED(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) |
|
|
|
Z_STEPPER_ALIGN_AMP; |
|
|
|
#else |
|
|
|
parser.floatval('A', Z_STEPPER_ALIGN_AMP); |
|
|
|
const float z_auto_align_amplification = TERN(Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS, Z_STEPPER_ALIGN_AMP, parser.floatval('A', Z_STEPPER_ALIGN_AMP)); |
|
|
|
if (!WITHIN(ABS(z_auto_align_amplification), 0.5f, 2.0f)) { |
|
|
|
SERIAL_ECHOLNPGM("?(A)mplification out of bounds (0.5-2.0)."); |
|
|
|
break; |
|
|
|
} |
|
|
|
#endif |
|
|
|
|
|
|
|
if (parser.seen('R')) z_stepper_align.reset_to_default(); |
|
|
|
|
|
|
|
const ProbePtRaise raise_after = parser.boolval('E') ? PROBE_PT_STOW : PROBE_PT_RAISE; |
|
|
|
|
|
|
|
// Wait for planner moves to finish!
|
|
|
|
planner.synchronize(); |
|
|
|
|
|
|
|
// Disable the leveling matrix before auto-aligning
|
|
|
|
#if HAS_LEVELING |
|
|
|
TERN_(RESTORE_LEVELING_AFTER_G34, const bool leveling_was_active = planner.leveling_active); |
|
|
@ -407,8 +436,13 @@ void GcodeSuite::G34() { |
|
|
|
#endif |
|
|
|
|
|
|
|
}while(0); |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
#endif // Z_MULTI_ENDSTOPS || Z_STEPPER_AUTO_ALIGN
|
|
|
|
|
|
|
|
#if ENABLED(Z_STEPPER_AUTO_ALIGN) |
|
|
|
|
|
|
|
/**
|
|
|
|
* M422: Set a Z-Stepper automatic alignment XY point. |
|
|
|
* Use repeatedly to set multiple points. |
|
|
|