From 6824ab65dd41f974edeae3a7bd2f626d2c730862 Mon Sep 17 00:00:00 2001 From: PavelSindler Date: Sun, 15 Jul 2018 20:00:29 +0200 Subject: [PATCH] G28 fix --- Firmware/Marlin.h | 4 +++- Firmware/Marlin_main.cpp | 52 ++++++++++++++++++++++++++-------------- 2 files changed, 37 insertions(+), 19 deletions(-) diff --git a/Firmware/Marlin.h b/Firmware/Marlin.h index a839ef9a..4b14d251 100644 --- a/Firmware/Marlin.h +++ b/Firmware/Marlin.h @@ -451,7 +451,9 @@ void force_high_power_mode(bool start_high_power_section); #endif //TMC2130 // G-codes -void gcode_G28(bool home_x, bool home_y, bool home_z, bool calib); +void gcode_G28(bool home_x_axis, long home_x_value, bool home_y_axis, long home_y_value, bool home_z_axis, long home_z_value, bool calib, bool without_mbl); +void gcode_G28(bool home_x_axis, bool home_y_axis, bool home_z_axis); + bool gcode_M45(bool onlyZ, int8_t verbosity_level); void gcode_M114(); void gcode_M701(); diff --git a/Firmware/Marlin_main.cpp b/Firmware/Marlin_main.cpp index 97fa26f3..de269fcb 100644 --- a/Firmware/Marlin_main.cpp +++ b/Firmware/Marlin_main.cpp @@ -734,7 +734,7 @@ void crashdet_detected(uint8_t mask) lcd_update_enable(true); lcd_update(2); lcd_setstatuspgm(_T(MSG_CRASH_DETECTED)); - gcode_G28(true, true, false, false); //home X and Y + gcode_G28(true, true, false); //home X and Y st_synchronize(); if (automatic_recovery_after_crash) { @@ -2614,7 +2614,11 @@ void force_high_power_mode(bool start_high_power_section) { } #endif //TMC2130 -void gcode_G28(bool home_x, bool home_y, bool home_z, bool calib) { +void gcode_G28(bool home_x_axis, bool home_y_axis, bool home_z_axis) { + gcode_G28(home_x_axis, 0, home_y_axis, 0, home_z_axis, 0, false, true); +} + +void gcode_G28(bool home_x_axis, long home_x_value, bool home_y_axis, long home_y_value, bool home_z_axis, long home_z_value, bool calib, bool without_mbl) { st_synchronize(); #if 0 @@ -2625,6 +2629,11 @@ void gcode_G28(bool home_x, bool home_y, bool home_z, bool calib) { // Flag for the display update routine and to disable the print cancelation during homing. homing_flag = true; + // Which axes should be homed? + bool home_x = home_x_axis; + bool home_y = home_y_axis; + bool home_z = home_z_axis; + // Either all X,Y,Z codes are present, or none of them. bool home_all_axes = home_x == home_y && home_x == home_z; if (home_all_axes) @@ -2733,11 +2742,11 @@ void gcode_G28(bool home_x, bool home_y, bool home_z, bool calib) { #endif //TMC2130 - if(code_seen(axis_codes[X_AXIS]) && code_value_long() != 0) - current_position[X_AXIS]=code_value()+add_homing[X_AXIS]; + if(home_x_axis && home_x_value != 0) + current_position[X_AXIS]=home_x_value+add_homing[X_AXIS]; - if(code_seen(axis_codes[Y_AXIS]) && code_value_long() != 0) - current_position[Y_AXIS]=code_value()+add_homing[Y_AXIS]; + if(home_y_axis && home_y_value != 0) + current_position[Y_AXIS]=home_y_value+add_homing[Y_AXIS]; #if Z_HOME_DIR < 0 // If homing towards BED do Z last #ifndef Z_SAFE_HOMING @@ -2832,8 +2841,8 @@ void gcode_G28(bool home_x, bool home_y, bool home_z, bool calib) { #endif // Z_SAFE_HOMING #endif // Z_HOME_DIR < 0 - if(code_seen(axis_codes[Z_AXIS]) && code_value_long() != 0) - current_position[Z_AXIS]=code_value()+add_homing[Z_AXIS]; + if(home_z_axis && home_z_value != 0) + current_position[Z_AXIS]=home_z_value+add_homing[Z_AXIS]; #ifdef ENABLE_AUTO_BED_LEVELING if(home_z) current_position[Z_AXIS] += zprobe_zoffset; //Add Z_Probe offset (the distance is negative) @@ -2865,7 +2874,7 @@ void gcode_G28(bool home_x, bool home_y, bool home_z, bool calib) { world2machine_update_current(); #if (defined(MESH_BED_LEVELING) && !defined(MK1BP)) - if (code_seen(axis_codes[X_AXIS]) || code_seen(axis_codes[Y_AXIS]) || code_seen('W') || code_seen(axis_codes[Z_AXIS])) + if (home_x_axis || home_y_axis || without_mbl || home_z_axis) { if (! home_z && mbl_was_active) { // Re-enable the mesh bed leveling if only the X and Y axes were re-homed. @@ -2878,10 +2887,6 @@ void gcode_G28(bool home_x, bool home_y, bool home_z, bool calib) { { st_synchronize(); homing_flag = false; - // Push the commands to the front of the message queue in the reverse order! - // There shall be always enough space reserved for these commands. - enquecommand_front_P((PSTR("G80"))); - //goto case_G80; } #endif @@ -3613,15 +3618,26 @@ void process_commands() #endif //FWRETRACT case 28: //G28 Home all Axis one at a time { - // Which axes should be homed? + long home_x_value = 0; + long home_y_value = 0; + long home_z_value = 0; + // Which axes should be homed? bool home_x = code_seen(axis_codes[X_AXIS]); + home_x_value = code_value_long(); bool home_y = code_seen(axis_codes[Y_AXIS]); - bool home_z = code_seen(axis_codes[Z_AXIS]); + home_y_value = code_value_long(); + bool home_z = code_seen(axis_codes[Z_AXIS]); + home_z_value = code_value_long(); + bool without_mbl = code_seen('W'); // calibrate? bool calib = code_seen('C'); - gcode_G28(home_x, home_y, home_z, calib); - + gcode_G28(home_x, home_x_value, home_y, home_y_value, home_z, home_z_value, calib, without_mbl); + if ((home_x || home_y || without_mbl || home_z) == false) { + // Push the commands to the front of the message queue in the reverse order! + // There shall be always enough space reserved for these commands. + goto case_G80; + } break; } #ifdef ENABLE_AUTO_BED_LEVELING @@ -3862,7 +3878,7 @@ void process_commands() current_position[X_AXIS] = pgm_read_float(bed_ref_points_4); plan_buffer_line(current_position[X_AXIS], current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS], 3000 / 60, active_extruder); st_synchronize(); - gcode_G28(false, false, true, false); + gcode_G28(false, false, true); } if ((current_temperature_pinda > 35) && (farm_mode == false)) {