|
@ -117,6 +117,7 @@ |
|
|
* G30 - Single Z probe, probes bed at current XY location. |
|
|
* G30 - Single Z probe, probes bed at current XY location. |
|
|
* G31 - Dock sled (Z_PROBE_SLED only) |
|
|
* G31 - Dock sled (Z_PROBE_SLED only) |
|
|
* G32 - Undock sled (Z_PROBE_SLED only) |
|
|
* G32 - Undock sled (Z_PROBE_SLED only) |
|
|
|
|
|
* G38 - Probe target - similar to G28 except it uses the Z_MIN endstop for all three axes |
|
|
* G90 - Use Absolute Coordinates |
|
|
* G90 - Use Absolute Coordinates |
|
|
* G91 - Use Relative Coordinates |
|
|
* G91 - Use Relative Coordinates |
|
|
* G92 - Set current position to coordinates given |
|
|
* G92 - Set current position to coordinates given |
|
@ -276,6 +277,11 @@ |
|
|
TWIBus i2c; |
|
|
TWIBus i2c; |
|
|
#endif |
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
#if ENABLED(G38_PROBE_TARGET) |
|
|
|
|
|
bool G38_move = false, |
|
|
|
|
|
G38_endstop_hit = false; |
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
bool Running = true; |
|
|
bool Running = true; |
|
|
|
|
|
|
|
|
uint8_t marlin_debug_flags = DEBUG_NONE; |
|
|
uint8_t marlin_debug_flags = DEBUG_NONE; |
|
@ -2325,6 +2331,7 @@ static void clean_up_after_endstop_or_probe_move() { |
|
|
|
|
|
|
|
|
#endif // AUTO_BED_LEVELING_BILINEAR
|
|
|
#endif // AUTO_BED_LEVELING_BILINEAR
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
/**
|
|
|
* Home an individual linear axis |
|
|
* Home an individual linear axis |
|
|
*/ |
|
|
*/ |
|
@ -4158,6 +4165,94 @@ inline void gcode_G28() { |
|
|
|
|
|
|
|
|
#endif // HAS_BED_PROBE
|
|
|
#endif // HAS_BED_PROBE
|
|
|
|
|
|
|
|
|
|
|
|
#if ENABLED(G38_PROBE_TARGET) |
|
|
|
|
|
|
|
|
|
|
|
static bool G38_run_probe() { |
|
|
|
|
|
|
|
|
|
|
|
bool G38_pass_fail = false; |
|
|
|
|
|
|
|
|
|
|
|
// Get direction of move and retract
|
|
|
|
|
|
float retract_mm[XYZ]; |
|
|
|
|
|
LOOP_XYZ(i) { |
|
|
|
|
|
float dist = destination[i] - current_position[i]; |
|
|
|
|
|
retract_mm[i] = fabs(dist) < G38_MINIMUM_MOVE ? 0 : home_bump_mm(i) * (dist > 0 ? -1 : 1); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
stepper.synchronize(); // wait until the machine is idle
|
|
|
|
|
|
|
|
|
|
|
|
// Move until destination reached or target hit
|
|
|
|
|
|
endstops.enable(true); |
|
|
|
|
|
G38_move = true; |
|
|
|
|
|
G38_endstop_hit = false; |
|
|
|
|
|
prepare_move_to_destination(); |
|
|
|
|
|
stepper.synchronize(); |
|
|
|
|
|
G38_move = false; |
|
|
|
|
|
|
|
|
|
|
|
endstops.hit_on_purpose(); |
|
|
|
|
|
set_current_from_steppers_for_axis(ALL_AXES); |
|
|
|
|
|
SYNC_PLAN_POSITION_KINEMATIC(); |
|
|
|
|
|
|
|
|
|
|
|
// Only do remaining moves if target was hit
|
|
|
|
|
|
if (G38_endstop_hit) { |
|
|
|
|
|
|
|
|
|
|
|
G38_pass_fail = true; |
|
|
|
|
|
|
|
|
|
|
|
// Move away by the retract distance
|
|
|
|
|
|
set_destination_to_current(); |
|
|
|
|
|
LOOP_XYZ(i) destination[i] += retract_mm[i]; |
|
|
|
|
|
endstops.enable(false); |
|
|
|
|
|
prepare_move_to_destination(); |
|
|
|
|
|
stepper.synchronize(); |
|
|
|
|
|
|
|
|
|
|
|
feedrate_mm_s /= 4; |
|
|
|
|
|
|
|
|
|
|
|
// Bump the target more slowly
|
|
|
|
|
|
LOOP_XYZ(i) destination[i] -= retract_mm[i] * 2; |
|
|
|
|
|
|
|
|
|
|
|
endstops.enable(true); |
|
|
|
|
|
G38_move = true; |
|
|
|
|
|
prepare_move_to_destination(); |
|
|
|
|
|
stepper.synchronize(); |
|
|
|
|
|
G38_move = false; |
|
|
|
|
|
|
|
|
|
|
|
set_current_from_steppers_for_axis(ALL_AXES); |
|
|
|
|
|
SYNC_PLAN_POSITION_KINEMATIC(); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
endstops.hit_on_purpose(); |
|
|
|
|
|
endstops.not_homing(); |
|
|
|
|
|
return G38_pass_fail; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
* G38.2 - probe toward workpiece, stop on contact, signal error if failure |
|
|
|
|
|
* G38.3 - probe toward workpiece, stop on contact |
|
|
|
|
|
* |
|
|
|
|
|
* Like G28 except uses Z min endstop for all axes |
|
|
|
|
|
*/ |
|
|
|
|
|
inline void gcode_G38(bool is_38_2) { |
|
|
|
|
|
// Get X Y Z E F
|
|
|
|
|
|
gcode_get_destination(); |
|
|
|
|
|
|
|
|
|
|
|
setup_for_endstop_or_probe_move(); |
|
|
|
|
|
|
|
|
|
|
|
// If any axis has enough movement, do the move
|
|
|
|
|
|
LOOP_XYZ(i) |
|
|
|
|
|
if (fabs(destination[i] - current_position[i]) >= G38_MINIMUM_MOVE) { |
|
|
|
|
|
if (!code_seen('F')) feedrate_mm_s = homing_feedrate_mm_s[i]; |
|
|
|
|
|
// If G38.2 fails throw an error
|
|
|
|
|
|
if (!G38_run_probe() && is_38_2) { |
|
|
|
|
|
SERIAL_ERROR_START; |
|
|
|
|
|
SERIAL_ERRORLNPGM("Failed to reach target"); |
|
|
|
|
|
} |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
clean_up_after_endstop_or_probe_move(); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
#endif // G38_PROBE_TARGET
|
|
|
|
|
|
|
|
|
/**
|
|
|
/**
|
|
|
* G92: Set current position to given X Y Z E |
|
|
* G92: Set current position to given X Y Z E |
|
|
*/ |
|
|
*/ |
|
@ -7279,6 +7374,11 @@ void process_next_command() { |
|
|
// Skip spaces to get the numeric part
|
|
|
// Skip spaces to get the numeric part
|
|
|
while (*cmd_ptr == ' ') cmd_ptr++; |
|
|
while (*cmd_ptr == ' ') cmd_ptr++; |
|
|
|
|
|
|
|
|
|
|
|
// Allow for decimal point in command
|
|
|
|
|
|
#if ENABLED(G38_PROBE_TARGET) |
|
|
|
|
|
uint8_t subcode = 0; |
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
uint16_t codenum = 0; // define ahead of goto
|
|
|
uint16_t codenum = 0; // define ahead of goto
|
|
|
|
|
|
|
|
|
// Bail early if there's no code
|
|
|
// Bail early if there's no code
|
|
@ -7291,6 +7391,15 @@ void process_next_command() { |
|
|
cmd_ptr++; |
|
|
cmd_ptr++; |
|
|
} while (NUMERIC(*cmd_ptr)); |
|
|
} while (NUMERIC(*cmd_ptr)); |
|
|
|
|
|
|
|
|
|
|
|
// Allow for decimal point in command
|
|
|
|
|
|
#if ENABLED(G38_PROBE_TARGET) |
|
|
|
|
|
if (*cmd_ptr == '.') { |
|
|
|
|
|
cmd_ptr++; |
|
|
|
|
|
while (NUMERIC(*cmd_ptr)) |
|
|
|
|
|
subcode = (subcode * 10) + (*cmd_ptr++ - '0'); |
|
|
|
|
|
} |
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
// Skip all spaces to get to the first argument, or nul
|
|
|
// Skip all spaces to get to the first argument, or nul
|
|
|
while (*cmd_ptr == ' ') cmd_ptr++; |
|
|
while (*cmd_ptr == ' ') cmd_ptr++; |
|
|
|
|
|
|
|
@ -7391,6 +7500,13 @@ void process_next_command() { |
|
|
#endif // Z_PROBE_SLED
|
|
|
#endif // Z_PROBE_SLED
|
|
|
#endif // HAS_BED_PROBE
|
|
|
#endif // HAS_BED_PROBE
|
|
|
|
|
|
|
|
|
|
|
|
#if ENABLED(G38_PROBE_TARGET) |
|
|
|
|
|
case 38: // G38.2 & G38.3
|
|
|
|
|
|
if (subcode == 2 || subcode == 3) |
|
|
|
|
|
gcode_G38(subcode == 2); |
|
|
|
|
|
break; |
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
case 90: // G90
|
|
|
case 90: // G90
|
|
|
relative_mode = false; |
|
|
relative_mode = false; |
|
|
break; |
|
|
break; |
|
|