diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index b0b19e2447..f5a36e6b9c 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -413,12 +413,6 @@ const bool Z_MAX_ENDSTOP_INVERTING = false; // set to true to invert the logic o #ifdef AUTO_BED_LEVELING_GRID - // Use one of these defines to specify the origin - // for a topographical map to be printed for your bed. - enum { OriginBackLeft, OriginFrontLeft, OriginBackRight, OriginFrontRight }; - #define TOPO_ORIGIN OriginFrontLeft - - // The edges of the rectangle in which to probe #define LEFT_PROBE_BED_POSITION 15 #define RIGHT_PROBE_BED_POSITION 170 #define FRONT_PROBE_BED_POSITION 20 diff --git a/Marlin/ConfigurationStore.cpp b/Marlin/ConfigurationStore.cpp index 16d94760b6..29cc0412ae 100644 --- a/Marlin/ConfigurationStore.cpp +++ b/Marlin/ConfigurationStore.cpp @@ -18,7 +18,7 @@ * max_xy_jerk * max_z_jerk * max_e_jerk - * add_homing (x3) + * home_offset (x3) * * Mesh bed leveling: * active @@ -136,7 +136,7 @@ void Config_StoreSettings() { EEPROM_WRITE_VAR(i, max_xy_jerk); EEPROM_WRITE_VAR(i, max_z_jerk); EEPROM_WRITE_VAR(i, max_e_jerk); - EEPROM_WRITE_VAR(i, add_homing); + EEPROM_WRITE_VAR(i, home_offset); uint8_t mesh_num_x = 3; uint8_t mesh_num_y = 3; @@ -294,7 +294,7 @@ void Config_RetrieveSettings() { EEPROM_READ_VAR(i, max_xy_jerk); EEPROM_READ_VAR(i, max_z_jerk); EEPROM_READ_VAR(i, max_e_jerk); - EEPROM_READ_VAR(i, add_homing); + EEPROM_READ_VAR(i, home_offset); uint8_t mesh_num_x = 0; uint8_t mesh_num_y = 0; @@ -447,7 +447,7 @@ void Config_ResetDefault() { max_xy_jerk = DEFAULT_XYJERK; max_z_jerk = DEFAULT_ZJERK; max_e_jerk = DEFAULT_EJERK; - add_homing[X_AXIS] = add_homing[Y_AXIS] = add_homing[Z_AXIS] = 0; + home_offset[X_AXIS] = home_offset[Y_AXIS] = home_offset[Z_AXIS] = 0; #if defined(MESH_BED_LEVELING) mbl.active = 0; @@ -607,9 +607,9 @@ void Config_PrintSettings(bool forReplay) { SERIAL_ECHOLNPGM("Home offset (mm):"); SERIAL_ECHO_START; } - SERIAL_ECHOPAIR(" M206 X", add_homing[X_AXIS] ); - SERIAL_ECHOPAIR(" Y", add_homing[Y_AXIS] ); - SERIAL_ECHOPAIR(" Z", add_homing[Z_AXIS] ); + SERIAL_ECHOPAIR(" M206 X", home_offset[X_AXIS] ); + SERIAL_ECHOPAIR(" Y", home_offset[Y_AXIS] ); + SERIAL_ECHOPAIR(" Z", home_offset[Z_AXIS] ); SERIAL_EOL; #ifdef DELTA diff --git a/Marlin/Marlin.h b/Marlin/Marlin.h index 7cabcbca03..6876206d68 100644 --- a/Marlin/Marlin.h +++ b/Marlin/Marlin.h @@ -235,7 +235,7 @@ extern int extruder_multiply[EXTRUDERS]; // sets extrude multiply factor (in per extern float filament_size[EXTRUDERS]; // cross-sectional area of filament (in millimeters), typically around 1.75 or 2.85, 0 disables the volumetric calculations for the extruder. extern float volumetric_multiplier[EXTRUDERS]; // reciprocal of cross-sectional area of filament (in square millimeters), stored this way to reduce computational burden in planner extern float current_position[NUM_AXIS] ; -extern float add_homing[3]; +extern float home_offset[3]; #ifdef DELTA extern float endstop_adj[3]; extern float delta_radius; diff --git a/Marlin/Marlin_main.cpp b/Marlin/Marlin_main.cpp index c64f7eb321..7747aadcd1 100644 --- a/Marlin/Marlin_main.cpp +++ b/Marlin/Marlin_main.cpp @@ -245,7 +245,7 @@ float volumetric_multiplier[EXTRUDERS] = {1.0 #endif }; float current_position[NUM_AXIS] = { 0.0, 0.0, 0.0, 0.0 }; -float add_homing[3] = { 0, 0, 0 }; +float home_offset[3] = { 0, 0, 0 }; #ifdef DELTA float endstop_adj[3] = { 0, 0, 0 }; #endif @@ -1006,9 +1006,9 @@ static void axis_is_at_home(int axis) { return; } else if (dual_x_carriage_mode == DXC_DUPLICATION_MODE && active_extruder == 0) { - current_position[X_AXIS] = base_home_pos(X_AXIS) + add_homing[X_AXIS]; - min_pos[X_AXIS] = base_min_pos(X_AXIS) + add_homing[X_AXIS]; - max_pos[X_AXIS] = min(base_max_pos(X_AXIS) + add_homing[X_AXIS], + current_position[X_AXIS] = base_home_pos(X_AXIS) + home_offset[X_AXIS]; + min_pos[X_AXIS] = base_min_pos(X_AXIS) + home_offset[X_AXIS]; + max_pos[X_AXIS] = min(base_max_pos(X_AXIS) + home_offset[X_AXIS], max(extruder_offset[X_AXIS][1], X2_MAX_POS) - duplicate_extruder_x_offset); return; } @@ -1036,11 +1036,11 @@ static void axis_is_at_home(int axis) { for (i=0; i<2; i++) { - delta[i] -= add_homing[i]; + delta[i] -= home_offset[i]; } - // SERIAL_ECHOPGM("addhome X="); SERIAL_ECHO(add_homing[X_AXIS]); - // SERIAL_ECHOPGM(" addhome Y="); SERIAL_ECHO(add_homing[Y_AXIS]); + // SERIAL_ECHOPGM("addhome X="); SERIAL_ECHO(home_offset[X_AXIS]); + // SERIAL_ECHOPGM(" addhome Y="); SERIAL_ECHO(home_offset[Y_AXIS]); // SERIAL_ECHOPGM(" addhome Theta="); SERIAL_ECHO(delta[X_AXIS]); // SERIAL_ECHOPGM(" addhome Psi+Theta="); SERIAL_ECHOLN(delta[Y_AXIS]); @@ -1058,14 +1058,14 @@ static void axis_is_at_home(int axis) { } else { - current_position[axis] = base_home_pos(axis) + add_homing[axis]; - min_pos[axis] = base_min_pos(axis) + add_homing[axis]; - max_pos[axis] = base_max_pos(axis) + add_homing[axis]; + current_position[axis] = base_home_pos(axis) + home_offset[axis]; + min_pos[axis] = base_min_pos(axis) + home_offset[axis]; + max_pos[axis] = base_max_pos(axis) + home_offset[axis]; } #else - current_position[axis] = base_home_pos(axis) + add_homing[axis]; - min_pos[axis] = base_min_pos(axis) + add_homing[axis]; - max_pos[axis] = base_max_pos(axis) + add_homing[axis]; + current_position[axis] = base_home_pos(axis) + home_offset[axis]; + min_pos[axis] = base_min_pos(axis) + home_offset[axis]; + max_pos[axis] = base_max_pos(axis) + home_offset[axis]; #endif } @@ -1299,7 +1299,13 @@ static void engage_z_probe() { static void retract_z_probe() { // Retract Z Servo endstop if enabled #ifdef SERVO_ENDSTOPS - if (servo_endstops[Z_AXIS] > -1) { + if (servo_endstops[Z_AXIS] > -1) + { + #if Z_RAISE_AFTER_PROBING > 0 + do_blocking_move_to(current_position[X_AXIS], current_position[Y_AXIS], Z_RAISE_AFTER_PROBING); + st_synchronize(); + #endif + #if SERVO_LEVELING servos[servo_endstops[Z_AXIS]].attach(0); #endif @@ -1312,7 +1318,7 @@ static void retract_z_probe() { #elif defined(Z_PROBE_ALLEN_KEY) // Move up for safety feedrate = homing_feedrate[X_AXIS]; - destination[Z_AXIS] = current_position[Z_AXIS] + 20; + destination[Z_AXIS] = current_position[Z_AXIS] + Z_RAISE_AFTER_PROBING; prepare_move_raw(); // Move to the start position to initiate retraction @@ -1354,10 +1360,15 @@ static void retract_z_probe() { } -enum ProbeAction { ProbeStay, ProbeEngage, ProbeRetract, ProbeEngageRetract }; +enum ProbeAction { + ProbeStay = 0, + ProbeEngage = BIT(0), + ProbeRetract = BIT(1), + ProbeEngageAndRetract = (ProbeEngage | ProbeRetract) +}; /// Probe bed height at position (x,y), returns the measured z value -static float probe_pt(float x, float y, float z_before, ProbeAction retract_action=ProbeEngageRetract, int verbose_level=1) { +static float probe_pt(float x, float y, float z_before, ProbeAction retract_action=ProbeEngageAndRetract, int verbose_level=1) { // move to right place do_blocking_move_to(current_position[X_AXIS], current_position[Y_AXIS], z_before); do_blocking_move_to(x - X_PROBE_OFFSET_FROM_EXTRUDER, y - Y_PROBE_OFFSET_FROM_EXTRUDER, current_position[Z_AXIS]); @@ -1848,7 +1859,7 @@ inline void gcode_G28() { if (code_value_long() != 0) { current_position[X_AXIS] = code_value() #ifndef SCARA - + add_homing[X_AXIS] + + home_offset[X_AXIS] #endif ; } @@ -1857,7 +1868,7 @@ inline void gcode_G28() { if (code_seen(axis_codes[Y_AXIS]) && code_value_long() != 0) { current_position[Y_AXIS] = code_value() #ifndef SCARA - + add_homing[Y_AXIS] + + home_offset[Y_AXIS] #endif ; } @@ -1931,7 +1942,7 @@ inline void gcode_G28() { if (code_seen(axis_codes[Z_AXIS]) && code_value_long() != 0) - current_position[Z_AXIS] = code_value() + add_homing[Z_AXIS]; + current_position[Z_AXIS] = code_value() + home_offset[Z_AXIS]; #ifdef ENABLE_AUTO_BED_LEVELING if (home_all_axis || code_seen(axis_codes[Z_AXIS])) @@ -2118,7 +2129,7 @@ inline void gcode_G28() { #ifdef AUTO_BED_LEVELING_GRID #ifndef DELTA - bool topo_flag = verbose_level > 2 || code_seen('T') || code_seen('t'); + bool do_topography_map = verbose_level > 2 || code_seen('T') || code_seen('t'); #endif if (verbose_level > 0) @@ -2173,15 +2184,16 @@ inline void gcode_G28() { #ifdef Z_PROBE_SLED dock_sled(false); // engage (un-dock) the probe - #elif not defined(SERVO_ENDSTOPS) + #elif defined(Z_PROBE_ALLEN_KEY) engage_z_probe(); #endif st_synchronize(); - #ifdef DELTA - reset_bed_level(); - #else + #ifdef DELTA + reset_bed_level(); + #else + // make sure the bed_level_rotation_matrix is identity or the planner will get it incorectly //vector_3 corrected_position = plan_get_position_mm(); //corrected_position.debug("position before G29"); @@ -2222,42 +2234,36 @@ inline void gcode_G28() { delta_grid_spacing[1] = yGridSpacing; float z_offset = Z_PROBE_OFFSET_FROM_EXTRUDER; - if (code_seen(axis_codes[Z_AXIS])) { - z_offset += code_value(); - } + if (code_seen(axis_codes[Z_AXIS])) z_offset += code_value(); #endif int probePointCounter = 0; bool zig = true; - for (int yCount=0; yCount < auto_bed_leveling_grid_points; yCount++) - { + for (int yCount = 0; yCount < auto_bed_leveling_grid_points; yCount++) { double yProbe = front_probe_bed_position + yGridSpacing * yCount; int xStart, xStop, xInc; - if (zig) - { + if (zig) { xStart = 0; xStop = auto_bed_leveling_grid_points; xInc = 1; zig = false; } - else - { + else { xStart = auto_bed_leveling_grid_points - 1; xStop = -1; xInc = -1; zig = true; } - #ifndef DELTA - // If topo_flag is set then don't zig-zag. Just scan in one direction. - // This gets the probe points in more readable order. - if (!topo_flag) zig = !zig; - #endif + #ifndef DELTA + // If do_topography_map is set then don't zig-zag. Just scan in one direction. + // This gets the probe points in more readable order. + if (!do_topography_map) zig = !zig; + #endif - for (int xCount=xStart; xCount != xStop; xCount += xInc) - { + for (int xCount = xStart; xCount != xStop; xCount += xInc) { double xProbe = left_probe_bed_position + xGridSpacing * xCount; // raise extruder @@ -2282,7 +2288,7 @@ inline void gcode_G28() { act = ProbeStay; } else - act = ProbeEngageRetract; + act = ProbeEngageAndRetract; measured_z = probe_pt(xProbe, yProbe, z_before, act, verbose_level); @@ -2324,49 +2330,31 @@ inline void gcode_G28() { } } - if (topo_flag) { - - int xx, yy; + // Show the Topography map if enabled + if (do_topography_map) { SERIAL_PROTOCOLPGM(" \nBed Height Topography: \n"); - #if TOPO_ORIGIN == OriginFrontLeft - SERIAL_PROTOCOLPGM("+-----------+\n"); - SERIAL_PROTOCOLPGM("|...Back....|\n"); - SERIAL_PROTOCOLPGM("|Left..Right|\n"); - SERIAL_PROTOCOLPGM("|...Front...|\n"); - SERIAL_PROTOCOLPGM("+-----------+\n"); - for (yy = auto_bed_leveling_grid_points - 1; yy >= 0; yy--) - #else - for (yy = 0; yy < auto_bed_leveling_grid_points; yy++) - #endif - { - #if TOPO_ORIGIN == OriginBackRight - for (xx = 0; xx < auto_bed_leveling_grid_points; xx++) - #else - for (xx = auto_bed_leveling_grid_points - 1; xx >= 0; xx--) - #endif - { - int ind = - #if TOPO_ORIGIN == OriginBackRight || TOPO_ORIGIN == OriginFrontLeft - yy * auto_bed_leveling_grid_points + xx - #elif TOPO_ORIGIN == OriginBackLeft - xx * auto_bed_leveling_grid_points + yy - #elif TOPO_ORIGIN == OriginFrontRight - abl2 - xx * auto_bed_leveling_grid_points - yy - 1 - #endif - ; - float diff = eqnBVector[ind] - mean; - if (diff >= 0.0) - SERIAL_PROTOCOLPGM(" +"); // Include + for column alignment - else - SERIAL_PROTOCOLPGM(" "); - SERIAL_PROTOCOL_F(diff, 5); - } // xx - SERIAL_EOL; - } // yy + SERIAL_PROTOCOLPGM("+-----------+\n"); + SERIAL_PROTOCOLPGM("|...Back....|\n"); + SERIAL_PROTOCOLPGM("|Left..Right|\n"); + SERIAL_PROTOCOLPGM("|...Front...|\n"); + SERIAL_PROTOCOLPGM("+-----------+\n"); + + for (int yy = auto_bed_leveling_grid_points - 1; yy >= 0; yy--) { + for (int xx = auto_bed_leveling_grid_points - 1; xx >= 0; xx--) { + int ind = yy * auto_bed_leveling_grid_points + xx; + float diff = eqnBVector[ind] - mean; + if (diff >= 0.0) + SERIAL_PROTOCOLPGM(" +"); // Include + for column alignment + else + SERIAL_PROTOCOLPGM(" "); + SERIAL_PROTOCOL_F(diff, 5); + } // xx SERIAL_EOL; + } // yy + SERIAL_EOL; - } //topo_flag + } //do_topography_map set_bed_level_equation_lsq(plane_equation_coefficients); @@ -2388,18 +2376,15 @@ inline void gcode_G28() { z_at_pt_3 = probe_pt(ABL_PROBE_PT_3_X, ABL_PROBE_PT_3_Y, current_position[Z_AXIS] + Z_RAISE_BETWEEN_PROBINGS, ProbeRetract, verbose_level); } else { - z_at_pt_1 = probe_pt(ABL_PROBE_PT_1_X, ABL_PROBE_PT_1_Y, Z_RAISE_BEFORE_PROBING, verbose_level=verbose_level); - z_at_pt_2 = probe_pt(ABL_PROBE_PT_2_X, ABL_PROBE_PT_2_Y, current_position[Z_AXIS] + Z_RAISE_BETWEEN_PROBINGS, verbose_level=verbose_level); - z_at_pt_3 = probe_pt(ABL_PROBE_PT_3_X, ABL_PROBE_PT_3_Y, current_position[Z_AXIS] + Z_RAISE_BETWEEN_PROBINGS, verbose_level=verbose_level); + z_at_pt_1 = probe_pt(ABL_PROBE_PT_1_X, ABL_PROBE_PT_1_Y, Z_RAISE_BEFORE_PROBING, ProbeEngageAndRetract, verbose_level); + z_at_pt_2 = probe_pt(ABL_PROBE_PT_2_X, ABL_PROBE_PT_2_Y, current_position[Z_AXIS] + Z_RAISE_BETWEEN_PROBINGS, ProbeEngageAndRetract, verbose_level); + z_at_pt_3 = probe_pt(ABL_PROBE_PT_3_X, ABL_PROBE_PT_3_Y, current_position[Z_AXIS] + Z_RAISE_BETWEEN_PROBINGS, ProbeEngageAndRetract, verbose_level); } clean_up_after_endstop_move(); set_bed_level_equation_3pts(z_at_pt_1, z_at_pt_2, z_at_pt_3); #endif // !AUTO_BED_LEVELING_GRID - do_blocking_move_to(current_position[X_AXIS], current_position[Y_AXIS], Z_RAISE_AFTER_PROBING); - st_synchronize(); - #ifndef DELTA if (verbose_level > 0) plan_bed_level_matrix.debug(" \n\nBed Level Correction Matrix:"); @@ -2419,7 +2404,7 @@ inline void gcode_G28() { #ifdef Z_PROBE_SLED dock_sled(true, -SLED_DOCKING_OFFSET); // dock the probe, correcting for over-travel - #elif not defined(SERVO_ENDSTOPS) + #elif defined(Z_PROBE_ALLEN_KEY) retract_z_probe(); #endif @@ -2464,22 +2449,13 @@ inline void gcode_G92() { if (!code_seen(axis_codes[E_AXIS])) st_synchronize(); - for (int i=0;iactive_extruder) \ - X2_DIR_WRITE(v); \ - else \ - X_DIR_WRITE(v); \ + else { \ + if (current_block->active_extruder) X2_DIR_WRITE(v); else X_DIR_WRITE(v); \ } #define X_APPLY_STEP(v,ALWAYS) \ if (extruder_duplication_enabled || ALWAYS) { \ @@ -114,10 +111,7 @@ volatile signed char count_direction[NUM_AXIS] = { 1, 1, 1, 1 }; X2_STEP_WRITE(v); \ } \ else { \ - if (current_block->active_extruder != 0) \ - X2_STEP_WRITE(v); \ - else \ - X_STEP_WRITE(v); \ + if (current_block->active_extruder != 0) X2_STEP_WRITE(v); else X_STEP_WRITE(v); \ } #else #define X_APPLY_DIR(v,Q) X_DIR_WRITE(v) @@ -125,16 +119,16 @@ volatile signed char count_direction[NUM_AXIS] = { 1, 1, 1, 1 }; #endif #ifdef Y_DUAL_STEPPER_DRIVERS - #define Y_APPLY_DIR(v,Q) Y_DIR_WRITE(v), Y2_DIR_WRITE((v) != INVERT_Y2_VS_Y_DIR) - #define Y_APPLY_STEP(v,Q) Y_STEP_WRITE(v), Y2_STEP_WRITE(v) + #define Y_APPLY_DIR(v,Q) { Y_DIR_WRITE(v); Y2_DIR_WRITE((v) != INVERT_Y2_VS_Y_DIR); } + #define Y_APPLY_STEP(v,Q) { Y_STEP_WRITE(v); Y2_STEP_WRITE(v); } #else #define Y_APPLY_DIR(v,Q) Y_DIR_WRITE(v) #define Y_APPLY_STEP(v,Q) Y_STEP_WRITE(v) #endif #ifdef Z_DUAL_STEPPER_DRIVERS - #define Z_APPLY_DIR(v,Q) Z_DIR_WRITE(v), Z2_DIR_WRITE(v) - #define Z_APPLY_STEP(v,Q) Z_STEP_WRITE(v), Z2_STEP_WRITE(v) + #define Z_APPLY_DIR(v,Q) { Z_DIR_WRITE(v); Z2_DIR_WRITE(v); } + #define Z_APPLY_STEP(v,Q) { Z_STEP_WRITE(v); Z2_STEP_WRITE(v); } #else #define Z_APPLY_DIR(v,Q) Z_DIR_WRITE(v) #define Z_APPLY_STEP(v,Q) Z_STEP_WRITE(v) diff --git a/Marlin/ultralcd.cpp b/Marlin/ultralcd.cpp index f59ccce784..0e75b772be 100644 --- a/Marlin/ultralcd.cpp +++ b/Marlin/ultralcd.cpp @@ -436,7 +436,7 @@ static void lcd_main_menu() { void lcd_set_home_offsets() { for(int8_t i=0; i < NUM_AXIS; i++) { if (i != E_AXIS) { - add_homing[i] -= current_position[i]; + home_offset[i] -= current_position[i]; current_position[i] = 0.0; } }