@ -29,12 +29,12 @@
# include "Marlin.h"
# ifdef ENABLE_AUTO_BED_ LEVELING
# ifdef ENABLE_AUTO_BED_ COMPENSATION
# include "vector_3.h"
# ifdef AUTO_BED_ LEVELING _GRID
# ifdef AUTO_BED_ COMPENSATION _GRID
# include "qr_solve.h"
# endif
# endif // ENABLE_AUTO_BED_ LEVELING
# endif // ENABLE_AUTO_BED_ COMPENSATION
# include "ultralcd.h"
# include "planner.h"
@ -520,7 +520,7 @@ void servo_init()
}
# endif
# if defined (ENABLE_AUTO_BED_ LEVELING ) && (PROBE_SERVO_DEACTIVATION_DELAY > 0)
# if defined (ENABLE_AUTO_BED_ COMPENSATION ) && (PROBE_SERVO_DEACTIVATION_DELAY > 0)
delay ( PROBE_SERVO_DEACTIVATION_DELAY ) ;
servos [ servo_endstops [ Z_AXIS ] ] . detach ( ) ;
# endif
@ -962,16 +962,16 @@ static void axis_is_at_home(int axis) {
# endif
}
# ifdef ENABLE_AUTO_BED_ LEVELING
# ifdef AUTO_BED_ LEVELING _GRID
static void set_bed_ level _equation_lsq( double * plane_equation_coefficients )
# ifdef ENABLE_AUTO_BED_ COMPENSATION
# ifdef AUTO_BED_ COMPENSATION _GRID
static void set_bed_ compensation _equation_lsq( double * plane_equation_coefficients )
{
vector_3 planeNormal = vector_3 ( - plane_equation_coefficients [ 0 ] , - plane_equation_coefficients [ 1 ] , 1 ) ;
planeNormal . debug ( " planeNormal " ) ;
plan_bed_ level _matrix = matrix_3x3 : : create_look_at ( planeNormal ) ;
//bed Level.debug("bedLevel ");
plan_bed_ compensation _matrix = matrix_3x3 : : create_look_at ( planeNormal ) ;
//bed Compensation.debug("bedCompensation ");
//plan_bed_ level_matrix.debug("bed level before");
//plan_bed_ compensation_matrix.debug("bed compensation before");
//vector_3 uncorrected_position = plan_get_position_mm();
//uncorrected_position.debug("position before");
@ -987,11 +987,11 @@ static void set_bed_level_equation_lsq(double *plane_equation_coefficients)
plan_set_position ( current_position [ X_AXIS ] , current_position [ Y_AXIS ] , current_position [ Z_AXIS ] , current_position [ E_AXIS ] ) ;
}
# else // not AUTO_BED_ LEVELING _GRID
# else // not AUTO_BED_ COMPENSATION _GRID
static void set_bed_ level _equation_3pts( float z_at_pt_1 , float z_at_pt_2 , float z_at_pt_3 ) {
static void set_bed_ compensation _equation_3pts( float z_at_pt_1 , float z_at_pt_2 , float z_at_pt_3 ) {
plan_bed_ level _matrix. set_to_identity ( ) ;
plan_bed_ compensation _matrix. set_to_identity ( ) ;
vector_3 pt1 = vector_3 ( ABL_PROBE_PT_1_X , ABL_PROBE_PT_1_Y , z_at_pt_1 ) ;
vector_3 pt2 = vector_3 ( ABL_PROBE_PT_2_X , ABL_PROBE_PT_2_Y , z_at_pt_2 ) ;
@ -1002,7 +1002,7 @@ static void set_bed_level_equation_3pts(float z_at_pt_1, float z_at_pt_2, float
vector_3 planeNormal = vector_3 : : cross ( from_2_to_1 , from_2_to_3 ) . get_normal ( ) ;
planeNormal = vector_3 ( planeNormal . x , planeNormal . y , abs ( planeNormal . z ) ) ;
plan_bed_ level _matrix = matrix_3x3 : : create_look_at ( planeNormal ) ;
plan_bed_ compensation _matrix = matrix_3x3 : : create_look_at ( planeNormal ) ;
vector_3 corrected_position = plan_get_position ( ) ;
current_position [ X_AXIS ] = corrected_position . x ;
@ -1016,10 +1016,10 @@ static void set_bed_level_equation_3pts(float z_at_pt_1, float z_at_pt_2, float
}
# endif // AUTO_BED_ LEVELING _GRID
# endif // AUTO_BED_ COMPENSATION _GRID
static void run_z_probe ( ) {
plan_bed_ level _matrix. set_to_identity ( ) ;
plan_bed_ compensation _matrix. set_to_identity ( ) ;
feedrate = homing_feedrate [ Z_AXIS ] ;
// move down until you find the bed
@ -1088,11 +1088,11 @@ static void engage_z_probe() {
// Engage Z Servo endstop if enabled
# ifdef SERVO_ENDSTOPS
if ( servo_endstops [ Z_AXIS ] > - 1 ) {
# if defined (ENABLE_AUTO_BED_ LEVELING ) && (PROBE_SERVO_DEACTIVATION_DELAY > 0)
# if defined (ENABLE_AUTO_BED_ COMPENSATION ) && (PROBE_SERVO_DEACTIVATION_DELAY > 0)
servos [ servo_endstops [ Z_AXIS ] ] . attach ( 0 ) ;
# endif
servos [ servo_endstops [ Z_AXIS ] ] . write ( servo_endstop_angles [ Z_AXIS * 2 ] ) ;
# if defined (ENABLE_AUTO_BED_ LEVELING ) && (PROBE_SERVO_DEACTIVATION_DELAY > 0)
# if defined (ENABLE_AUTO_BED_ COMPENSATION ) && (PROBE_SERVO_DEACTIVATION_DELAY > 0)
delay ( PROBE_SERVO_DEACTIVATION_DELAY ) ;
servos [ servo_endstops [ Z_AXIS ] ] . detach ( ) ;
# endif
@ -1104,11 +1104,11 @@ static void retract_z_probe() {
// Retract Z Servo endstop if enabled
# ifdef SERVO_ENDSTOPS
if ( servo_endstops [ Z_AXIS ] > - 1 ) {
# if defined (ENABLE_AUTO_BED_ LEVELING ) && (PROBE_SERVO_DEACTIVATION_DELAY > 0)
# if defined (ENABLE_AUTO_BED_ COMPENSATION ) && (PROBE_SERVO_DEACTIVATION_DELAY > 0)
servos [ servo_endstops [ Z_AXIS ] ] . attach ( 0 ) ;
# endif
servos [ servo_endstops [ Z_AXIS ] ] . write ( servo_endstop_angles [ Z_AXIS * 2 + 1 ] ) ;
# if defined (ENABLE_AUTO_BED_ LEVELING ) && (PROBE_SERVO_DEACTIVATION_DELAY > 0)
# if defined (ENABLE_AUTO_BED_ COMPENSATION ) && (PROBE_SERVO_DEACTIVATION_DELAY > 0)
delay ( PROBE_SERVO_DEACTIVATION_DELAY ) ;
servos [ servo_endstops [ Z_AXIS ] ] . detach ( ) ;
# endif
@ -1142,7 +1142,7 @@ static float probe_pt(float x, float y, float z_before) {
return measured_z ;
}
# endif // #ifdef ENABLE_AUTO_BED_ LEVELING
# endif // #ifdef ENABLE_AUTO_BED_ COMPENSATION
static void homeaxis ( int axis ) {
# define HOMEAXIS_DO(LETTER) \
@ -1165,7 +1165,7 @@ static void homeaxis(int axis) {
# ifndef Z_PROBE_SLED
// Engage Servo endstop if enabled
# ifdef SERVO_ENDSTOPS
# if defined (ENABLE_AUTO_BED_ LEVELING ) && (PROBE_SERVO_DEACTIVATION_DELAY > 0)
# if defined (ENABLE_AUTO_BED_ COMPENSATION ) && (PROBE_SERVO_DEACTIVATION_DELAY > 0)
if ( axis = = Z_AXIS ) {
engage_z_probe ( ) ;
}
@ -1216,7 +1216,7 @@ static void homeaxis(int axis) {
servos [ servo_endstops [ axis ] ] . write ( servo_endstop_angles [ axis * 2 + 1 ] ) ;
}
# endif
# if defined (ENABLE_AUTO_BED_ LEVELING ) && (PROBE_SERVO_DEACTIVATION_DELAY > 0)
# if defined (ENABLE_AUTO_BED_ COMPENSATION ) && (PROBE_SERVO_DEACTIVATION_DELAY > 0)
# ifndef Z_PROBE_SLED
if ( axis = = Z_AXIS ) retract_z_probe ( ) ;
# endif
@ -1325,7 +1325,7 @@ void process_commands()
{
unsigned long codenum ; //throw away variable
char * starpos = NULL ;
# ifdef ENABLE_AUTO_BED_ LEVELING
# ifdef ENABLE_AUTO_BED_ COMPENSATION
float x_tmp , y_tmp , z_tmp , real_z ;
# endif
if ( code_seen ( ' G ' ) )
@ -1399,9 +1399,9 @@ void process_commands()
break ;
# endif //FWRETRACT
case 28 : //G28 Home all Axis one at a time
# ifdef ENABLE_AUTO_BED_ LEVELING
plan_bed_ level _matrix. set_to_identity ( ) ; //Reset the plane ("erase" all leveling data)
# endif //ENABLE_AUTO_BED_ LEVELING
# ifdef ENABLE_AUTO_BED_ COMPENSATION
plan_bed_ compensation _matrix. set_to_identity ( ) ; //Reset the plane ("erase" all compensation data)
# endif //ENABLE_AUTO_BED_ COMPENSATION
saved_feedrate = feedrate ;
saved_feedmultiply = feedmultiply ;
@ -1605,7 +1605,7 @@ void process_commands()
current_position [ Z_AXIS ] = code_value ( ) + add_homing [ Z_AXIS ] ;
}
}
# ifdef ENABLE_AUTO_BED_ LEVELING
# ifdef ENABLE_AUTO_BED_ COMPENSATION
if ( ( home_all_axis ) | | ( code_seen ( axis_codes [ Z_AXIS ] ) ) ) {
current_position [ Z_AXIS ] + = zprobe_zoffset ; //Add Z_Probe offset (the distance is negative)
}
@ -1628,11 +1628,11 @@ void process_commands()
endstops_hit_on_purpose ( ) ;
break ;
# ifdef ENABLE_AUTO_BED_ LEVELING
# ifdef ENABLE_AUTO_BED_ COMPENSATION
case 29 : // G29 Detailed Z-Probe, probes the bed at 3 or more points.
{
# if Z_MIN_PIN == -1
# error "You must have a Z_MIN endstop in order to enable Auto Bed Leveling feature!!! Z_MIN_PIN must point to a valid hardware pin."
# error "You must have a Z_MIN endstop in order to enable Auto Bed Compensation feature!!! Z_MIN_PIN must point to a valid hardware pin."
# endif
// Prevent user from running a G29 without first homing in X and Y
@ -1648,10 +1648,10 @@ void process_commands()
dock_sled ( false ) ;
# endif // Z_PROBE_SLED
st_synchronize ( ) ;
// make sure the bed_ level _rotation_matrix is identity or the planner will get it incorectly
// make sure the bed_ compensation _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");
plan_bed_ level _matrix. set_to_identity ( ) ;
plan_bed_ compensation _matrix. set_to_identity ( ) ;
vector_3 uncorrected_position = plan_get_position ( ) ;
//uncorrected_position.debug("position durring G29");
current_position [ X_AXIS ] = uncorrected_position . x ;
@ -1661,11 +1661,11 @@ void process_commands()
setup_for_endstop_move ( ) ;
feedrate = homing_feedrate [ Z_AXIS ] ;
# ifdef AUTO_BED_ LEVELING _GRID
# ifdef AUTO_BED_ COMPENSATION _GRID
// probe at the points of a lattice grid
int xGridSpacing = ( RIGHT_PROBE_BED_POSITION - LEFT_PROBE_BED_POSITION ) / ( AUTO_BED_ LEVELING _GRID_POINTS- 1 ) ;
int yGridSpacing = ( BACK_PROBE_BED_POSITION - FRONT_PROBE_BED_POSITION ) / ( AUTO_BED_ LEVELING _GRID_POINTS- 1 ) ;
int xGridSpacing = ( RIGHT_PROBE_BED_POSITION - LEFT_PROBE_BED_POSITION ) / ( AUTO_BED_ COMPENSATION _GRID_POINTS- 1 ) ;
int yGridSpacing = ( BACK_PROBE_BED_POSITION - FRONT_PROBE_BED_POSITION ) / ( AUTO_BED_ COMPENSATION _GRID_POINTS- 1 ) ;
// solve the plane equation ax + by + d = z
@ -1675,9 +1675,9 @@ void process_commands()
// so Vx = -a Vy = -b Vz = 1 (we want the vector facing towards positive Z
// "A" matrix of the linear system of equations
double eqnAMatrix [ AUTO_BED_ LEVELING_GRID_POINTS* AUTO_BED_LEVELING _GRID_POINTS* 3 ] ;
double eqnAMatrix [ AUTO_BED_ COMPENSATION_GRID_POINTS* AUTO_BED_COMPENSATION _GRID_POINTS* 3 ] ;
// "B" vector of Z points
double eqnBVector [ AUTO_BED_ LEVELING_GRID_POINTS* AUTO_BED_LEVELING _GRID_POINTS] ;
double eqnBVector [ AUTO_BED_ COMPENSATION_GRID_POINTS* AUTO_BED_COMPENSATION _GRID_POINTS] ;
int probePointCounter = 0 ;
@ -1700,7 +1700,7 @@ void process_commands()
zig = true ;
}
for ( int xCount = 0 ; xCount < AUTO_BED_ LEVELING _GRID_POINTS; xCount + + )
for ( int xCount = 0 ; xCount < AUTO_BED_ COMPENSATION _GRID_POINTS; xCount + + )
{
float z_before ;
if ( probePointCounter = = 0 )
@ -1717,9 +1717,9 @@ void process_commands()
eqnBVector [ probePointCounter ] = measured_z ;
eqnAMatrix [ probePointCounter + 0 * AUTO_BED_ LEVELING_GRID_POINTS* AUTO_BED_LEVELING _GRID_POINTS] = xProbe ;
eqnAMatrix [ probePointCounter + 1 * AUTO_BED_ LEVELING_GRID_POINTS* AUTO_BED_LEVELING _GRID_POINTS] = yProbe ;
eqnAMatrix [ probePointCounter + 2 * AUTO_BED_ LEVELING_GRID_POINTS* AUTO_BED_LEVELING _GRID_POINTS] = 1 ;
eqnAMatrix [ probePointCounter + 0 * AUTO_BED_ COMPENSATION_GRID_POINTS* AUTO_BED_COMPENSATION _GRID_POINTS] = xProbe ;
eqnAMatrix [ probePointCounter + 1 * AUTO_BED_ COMPENSATION_GRID_POINTS* AUTO_BED_COMPENSATION _GRID_POINTS] = yProbe ;
eqnAMatrix [ probePointCounter + 2 * AUTO_BED_ COMPENSATION_GRID_POINTS* AUTO_BED_COMPENSATION _GRID_POINTS] = 1 ;
probePointCounter + + ;
xProbe + = xInc ;
}
@ -1727,7 +1727,7 @@ void process_commands()
clean_up_after_endstop_move ( ) ;
// solve lsq problem
double * plane_equation_coefficients = qr_solve ( AUTO_BED_ LEVELING_GRID_POINTS* AUTO_BED_LEVELING _GRID_POINTS, 3 , eqnAMatrix , eqnBVector ) ;
double * plane_equation_coefficients = qr_solve ( AUTO_BED_ COMPENSATION_GRID_POINTS* AUTO_BED_COMPENSATION _GRID_POINTS, 3 , eqnAMatrix , eqnBVector ) ;
SERIAL_PROTOCOLPGM ( " Eqn coefficients: a: " ) ;
SERIAL_PROTOCOL ( plane_equation_coefficients [ 0 ] ) ;
@ -1737,11 +1737,11 @@ void process_commands()
SERIAL_PROTOCOLLN ( plane_equation_coefficients [ 2 ] ) ;
set_bed_ level _equation_lsq( plane_equation_coefficients ) ;
set_bed_ compensation _equation_lsq( plane_equation_coefficients ) ;
free ( plane_equation_coefficients ) ;
# else // AUTO_BED_ LEVELING _GRID not defined
# else // AUTO_BED_ COMPENSATION _GRID not defined
// Probe at 3 arbitrary points
// probe 1
@ -1755,21 +1755,21 @@ void process_commands()
clean_up_after_endstop_move ( ) ;
set_bed_ level _equation_3pts( z_at_pt_1 , z_at_pt_2 , z_at_pt_3 ) ;
set_bed_ compensation _equation_3pts( z_at_pt_1 , z_at_pt_2 , z_at_pt_3 ) ;
# endif // AUTO_BED_ LEVELING _GRID
# endif // AUTO_BED_ COMPENSATION _GRID
st_synchronize ( ) ;
// The following code correct the Z height difference from z-probe position and hotend tip position.
// The Z height on homing is measured by Z-Probe, but the probe is quite far from the hotend.
// When the bed is uneven, this height must be corrected.
real_z = float ( st_get_position ( Z_AXIS ) ) / axis_steps_per_unit [ Z_AXIS ] ; //get the real Z (since the auto bed leveling is already correcting the plane)
real_z = float ( st_get_position ( Z_AXIS ) ) / axis_steps_per_unit [ Z_AXIS ] ; //get the real Z (since the auto bed compensation is already correcting the plane)
x_tmp = current_position [ X_AXIS ] + X_PROBE_OFFSET_FROM_EXTRUDER ;
y_tmp = current_position [ Y_AXIS ] + Y_PROBE_OFFSET_FROM_EXTRUDER ;
z_tmp = current_position [ Z_AXIS ] ;
apply_rotation_xyz ( plan_bed_ level _matrix, x_tmp , y_tmp , z_tmp ) ; //Apply the correction sending the probe offset
apply_rotation_xyz ( plan_bed_ compensation _matrix, x_tmp , y_tmp , z_tmp ) ; //Apply the correction sending the probe offset
current_position [ Z_AXIS ] = z_tmp - real_z + current_position [ Z_AXIS ] ; //The difference is added to current position and sent to planner.
plan_set_position ( current_position [ X_AXIS ] , current_position [ Y_AXIS ] , current_position [ Z_AXIS ] , current_position [ E_AXIS ] ) ;
# ifdef Z_PROBE_SLED
@ -1782,7 +1782,7 @@ void process_commands()
{
engage_z_probe ( ) ; // Engage Z Servo endstop if available
st_synchronize ( ) ;
// TODO: make sure the bed_ level _rotation_matrix is identity or the planner will get set incorectly
// TODO: make sure the bed_ compensation _rotation_matrix is identity or the planner will get set incorectly
setup_for_endstop_move ( ) ;
feedrate = homing_feedrate [ Z_AXIS ] ;
@ -1809,7 +1809,7 @@ void process_commands()
dock_sled ( false ) ;
break ;
# endif // Z_PROBE_SLED
# endif // ENABLE_AUTO_BED_ LEVELING
# endif // ENABLE_AUTO_BED_ COMPENSATION
case 90 : // G90
relative_mode = false ;
break ;
@ -2068,7 +2068,7 @@ void process_commands()
//
// This function assumes the bed has been homed. Specificaly, that a G28 command
// as been issued prior to invoking the M48 Z-Probe repeatability measurement function.
// Any information generated by a prior G29 Bed leveling command will be lost and need to be
// Any information generated by a prior G29 Bed compensation command will be lost and need to be
// regenerated.
//
// The number of samples will default to 10 if not specified. You can use upper or lower case
@ -2076,7 +2076,7 @@ void process_commands()
// N for its communication protocol and will get horribly confused if you send it a capital N.
//
# ifdef ENABLE_AUTO_BED_ LEVELING
# ifdef ENABLE_AUTO_BED_ COMPENSATION
# ifdef Z_PROBE_REPEATABILITY_TEST
case 48 : // M48 Z-Probe repeatability
@ -2154,7 +2154,7 @@ void process_commands()
//
st_synchronize ( ) ;
plan_bed_ level _matrix. set_to_identity ( ) ;
plan_bed_ compensation _matrix. set_to_identity ( ) ;
plan_buffer_line ( X_current , Y_current , Z_start_location ,
ext_position ,
homing_feedrate [ Z_AXIS ] / 60 ,
@ -2333,7 +2333,7 @@ Sigma_Exit:
break ;
}
# endif // Z_PROBE_REPEATABILITY_TEST
# endif // ENABLE_AUTO_BED_ LEVELING
# endif // ENABLE_AUTO_BED_ COMPENSATION
case 104 : // M104
if ( setTargetedHotend ( 104 ) ) {
@ -3093,11 +3093,11 @@ Sigma_Exit:
if ( code_seen ( ' S ' ) ) {
servo_position = code_value ( ) ;
if ( ( servo_index > = 0 ) & & ( servo_index < NUM_SERVOS ) ) {
# if defined (ENABLE_AUTO_BED_ LEVELING ) && (PROBE_SERVO_DEACTIVATION_DELAY > 0)
# if defined (ENABLE_AUTO_BED_ COMPENSATION ) && (PROBE_SERVO_DEACTIVATION_DELAY > 0)
servos [ servo_index ] . attach ( 0 ) ;
# endif
servos [ servo_index ] . write ( servo_position ) ;
# if defined (ENABLE_AUTO_BED_ LEVELING ) && (PROBE_SERVO_DEACTIVATION_DELAY > 0)
# if defined (ENABLE_AUTO_BED_ COMPENSATION ) && (PROBE_SERVO_DEACTIVATION_DELAY > 0)
delay ( PROBE_SERVO_DEACTIVATION_DELAY ) ;
servos [ servo_index ] . detach ( ) ;
# endif
@ -3362,7 +3362,7 @@ Sigma_Exit:
st_synchronize ( ) ;
}
break ;
# if defined(ENABLE_AUTO_BED_ LEVELING ) && defined(SERVO_ENDSTOPS) && not defined(Z_PROBE_SLED)
# if defined(ENABLE_AUTO_BED_ COMPENSATION ) && defined(SERVO_ENDSTOPS) && not defined(Z_PROBE_SLED)
case 401 :
{
engage_z_probe ( ) ; // Engage Z Servo endstop if available