@ -39,7 +39,6 @@
enum MeshPointType { INVALID , REAL , SET_IN_BITMAP } ;
bool axis_unhomed_error ( bool , bool , bool ) ;
void dump ( char * const str , const float & f ) ;
bool ubl_lcd_clicked ( ) ;
void probe_entire_mesh ( const float & , const float & , const bool , const bool , const bool ) ;
@ -78,30 +77,10 @@
enum MBLStatus { MBL_STATUS_NONE = 0 , MBL_STATUS_HAS_MESH_BIT = 0 , MBL_STATUS_ACTIVE_BIT = 1 } ;
# define MESH_X_DIST ( ( float(UBL_MESH_MAX_X) - float (UBL_MESH_MIN_X)) / ( float(UBL_MESH_NUM_X_POINTS) - 1.0 ))
# define MESH_Y_DIST ( ( float(UBL_MESH_MAX_Y) - float (UBL_MESH_MIN_Y)) / ( float(UBL_MESH_NUM_Y_POINTS) - 1.0 ))
# define MESH_X_DIST ( float(UBL_MESH_MAX_X - (UBL_MESH_MIN_X)) / float(UBL_MESH_NUM_X_POINTS - 1))
# define MESH_Y_DIST ( float(UBL_MESH_MAX_Y - (UBL_MESH_MIN_Y)) / float(UBL_MESH_NUM_Y_POINTS - 1))
extern float mesh_index_to_x_location [ UBL_MESH_NUM_X_POINTS + 1 ] ; // +1 just because of paranoia that we might end up on the
extern float mesh_index_to_y_location [ UBL_MESH_NUM_Y_POINTS + 1 ] ; // the last Mesh Line and that is the start of a whole new cell
class unified_bed_leveling {
private :
float last_specified_z ,
fade_scaling_factor_for_current_height ;
public :
float z_values [ UBL_MESH_NUM_X_POINTS ] [ UBL_MESH_NUM_Y_POINTS ] ;
bool g26_debug_flag = false ,
has_control_of_lcd_panel = false ;
int8_t eeprom_start = - 1 ;
volatile int encoder_diff ; // Volatile because it's changed at interrupt time.
struct ubl_state {
typedef struct {
bool active = false ;
float z_offset = 0.0 ;
int8_t eeprom_storage_slot = - 1 ,
@ -126,7 +105,7 @@
// If you change this struct, adjust TOTAL_STRUCT_SIZE
# define TOTAL_STRUCT_SIZE 43 // Total size of the above fields
# define TOTAL_STRUCT_SIZE 40 // Total size of the above fields
// padding provides space to add state variables without
// changing the location of data structures in the EEPROM.
@ -134,26 +113,44 @@
// users from having to regenerate their mesh data.
unsigned char padding [ 64 - TOTAL_STRUCT_SIZE ] ;
} state, pre_initialized ;
} ubl_ state;
unified_bed_leveling ( ) ;
class unified_bed_leveling {
private :
void display_map ( const int ) ;
static float last_specified_z ,
fade_scaling_factor_for_current_height ;
void reset ( ) ;
void invalidate ( ) ;
public :
void store_state ( ) ;
void load_state ( ) ;
void store_mesh ( const int16_t ) ;
void load_mesh ( const int16_t ) ;
static ubl_state state , pre_initialized ;
bool sanity_check ( ) ;
static float z_values [ UBL_MESH_NUM_X_POINTS ] [ UBL_MESH_NUM_Y_POINTS ] ,
mesh_index_to_xpos [ UBL_MESH_NUM_X_POINTS + 1 ] , // +1 safety margin for now, until determinism prevails
mesh_index_to_ypos [ UBL_MESH_NUM_Y_POINTS + 1 ] ;
FORCE_INLINE static float map_x_index_to_bed_location ( const int8_t i ) { return ( ( float ) UBL_MESH_MIN_X ) + ( ( ( float ) MESH_X_DIST ) * ( float ) i ) ; } ;
FORCE_INLINE static float map_y_index_to_bed_location ( const int8_t i ) { return ( ( float ) UBL_MESH_MIN_Y ) + ( ( ( float ) MESH_Y_DIST ) * ( float ) i ) ; } ;
static bool g26_debug_flag ,
has_control_of_lcd_panel ;
FORCE_INLINE void set_z ( const int8_t px , const int8_t py , const float & z ) { z_values [ px ] [ py ] = z ; }
static int8_t eeprom_start ;
static volatile int encoder_diff ; // Volatile because it's changed at interrupt time.
unified_bed_leveling ( ) ;
static void display_map ( const int ) ;
static void reset ( ) ;
static void invalidate ( ) ;
static void store_state ( ) ;
static void load_state ( ) ;
static void store_mesh ( const int16_t ) ;
static void load_mesh ( const int16_t ) ;
static bool sanity_check ( ) ;
static FORCE_INLINE void set_z ( const int8_t px , const int8_t py , const float & z ) { z_values [ px ] [ py ] = z ; }
static int8_t get_cell_index_x ( const float & x ) {
const int8_t cx = ( x - ( UBL_MESH_MIN_X ) ) * ( 1.0 / ( MESH_X_DIST ) ) ;
@ -209,7 +206,7 @@
* the X index of the x0 intersection available and we don ' t want to perform any extra floating
* point operations .
*/
inline float get_z_correction_along_horizontal_mesh_line_at_specific_X ( const float & x0 , const int x1_i , const int yi ) {
static inline float get_z_correction_along_horizontal_mesh_line_at_specific_X ( const float & x0 , const int x1_i , const int yi ) {
if ( x1_i < 0 | | yi < 0 | | x1_i > = UBL_MESH_NUM_X_POINTS | | yi > = UBL_MESH_NUM_Y_POINTS ) {
SERIAL_ECHOPAIR ( " ? in get_z_correction_along_horizontal_mesh_line_at_specific_X(x0= " , x0 ) ;
SERIAL_ECHOPAIR ( " ,x1_i= " , x1_i ) ;
@ -219,7 +216,7 @@
return NAN ;
}
const float xratio = ( RAW_X_POSITION ( x0 ) - mesh_index_to_x _location [ x1_i ] ) * ( 1.0 / ( MESH_X_DIST ) ) ,
const float xratio = ( RAW_X_POSITION ( x0 ) - mesh_index_to_x pos [ x1_i ] ) * ( 1.0 / ( MESH_X_DIST ) ) ,
z1 = z_values [ x1_i ] [ yi ] ,
z2 = z_values [ x1_i + 1 ] [ yi ] ,
dz = ( z2 - z1 ) ;
@ -230,7 +227,7 @@
//
// See comments above for get_z_correction_along_horizontal_mesh_line_at_specific_X
//
inline float get_z_correction_along_vertical_mesh_line_at_specific_Y ( const float & y0 , const int xi , const int y1_i ) {
static inline float get_z_correction_along_vertical_mesh_line_at_specific_Y ( const float & y0 , const int xi , const int y1_i ) {
if ( xi < 0 | | y1_i < 0 | | xi > = UBL_MESH_NUM_X_POINTS | | y1_i > = UBL_MESH_NUM_Y_POINTS ) {
SERIAL_ECHOPAIR ( " ? in get_z_correction_along_vertical_mesh_line_at_specific_X(y0= " , y0 ) ;
SERIAL_ECHOPAIR ( " , x1_i= " , xi ) ;
@ -240,7 +237,7 @@
return NAN ;
}
const float yratio = ( RAW_Y_POSITION ( y0 ) - mesh_index_to_y _location [ y1_i ] ) * ( 1.0 / ( MESH_Y_DIST ) ) ,
const float yratio = ( RAW_Y_POSITION ( y0 ) - mesh_index_to_y pos [ y1_i ] ) * ( 1.0 / ( MESH_Y_DIST ) ) ,
z1 = z_values [ xi ] [ y1_i ] ,
z2 = z_values [ xi ] [ y1_i + 1 ] ,
dz = ( z2 - z1 ) ;
@ -254,7 +251,7 @@
* Z - Height at both ends . Then it does a linear interpolation of these heights based
* on the Y position within the cell .
*/
float get_z_correction ( const float & x0 , const float & y0 ) const {
static float get_z_correction ( const float & x0 , const float & y0 ) {
const int8_t cx = get_cell_index_x ( RAW_X_POSITION ( x0 ) ) ,
cy = get_cell_index_y ( RAW_Y_POSITION ( y0 ) ) ;
@ -273,14 +270,14 @@
}
const float z1 = calc_z0 ( RAW_X_POSITION ( x0 ) ,
map_x_index_to_bed_location ( cx ) , z_values [ cx ] [ cy ] ,
map_x_index_to_bed_location ( cx + 1 ) , z_values [ cx + 1 ] [ cy ] ) ,
mesh_index_to_xpos [ cx ] , z_values [ cx ] [ cy ] ,
mesh_index_to_xpos [ cx + 1 ] , z_values [ cx + 1 ] [ cy ] ) ,
z2 = calc_z0 ( RAW_X_POSITION ( x0 ) ,
map_x_index_to_bed_location ( cx ) , z_values [ cx ] [ cy + 1 ] ,
map_x_index_to_bed_location ( cx + 1 ) , z_values [ cx + 1 ] [ cy + 1 ] ) ;
mesh_index_to_xpos [ cx ] , z_values [ cx ] [ cy + 1 ] ,
mesh_index_to_xpos [ cx + 1 ] , z_values [ cx + 1 ] [ cy + 1 ] ) ;
float z0 = calc_z0 ( RAW_Y_POSITION ( y0 ) ,
map_y_index_to_bed_location ( cy ) , z1 ,
map_y_index_to_bed_location ( cy + 1 ) , z2 ) ;
mesh_index_to_ypos [ cy ] , z1 ,
mesh_index_to_ypos [ cy + 1 ] , z2 ) ;
# if ENABLED(DEBUG_LEVELING_FEATURE)
if ( DEBUGGING ( MESH_ADJUST ) ) {
@ -355,5 +352,4 @@
# define UBL_LAST_EEPROM_INDEX (E2END - sizeof(unified_bed_leveling::state))
# endif // AUTO_BED_LEVELING_UBL
# endif // UNIFIED_BED_LEVELING_H