Fix logic of UBL::fade_scaling_factor_for_z

This commit is contained in:
Scott Lahteine 2017-04-01 22:29:35 -05:00
parent a7aa70e79a
commit 7310110ec0
4 changed files with 17 additions and 26 deletions

View File

@ -10175,6 +10175,8 @@ void set_current_from_steppers_for_axis(const AxisEnum axis) {
/** /**
* Prepare a linear move in a Cartesian setup. * Prepare a linear move in a Cartesian setup.
* If Mesh Bed Leveling is enabled, perform a mesh move. * If Mesh Bed Leveling is enabled, perform a mesh move.
*
* Returns true if the caller didn't update current_position.
*/ */
inline bool prepare_move_to_destination_cartesian() { inline bool prepare_move_to_destination_cartesian() {
// Do not use feedrate_percentage for E or Z only moves // Do not use feedrate_percentage for E or Z only moves
@ -10190,9 +10192,7 @@ void set_current_from_steppers_for_axis(const AxisEnum axis) {
else else
#elif ENABLED(AUTO_BED_LEVELING_UBL) #elif ENABLED(AUTO_BED_LEVELING_UBL)
if (ubl.state.active) { if (ubl.state.active) {
ubl_line_to_destination(MMS_SCALED(feedrate_mm_s), active_extruder); ubl_line_to_destination(MMS_SCALED(feedrate_mm_s), active_extruder);
return false; return false;
} }
else else

View File

@ -98,9 +98,6 @@
float g29_correction_fade_height = 10.0, float g29_correction_fade_height = 10.0,
g29_fade_height_multiplier = 1.0 / 10.0; // It's cheaper to do a floating point multiply than divide, g29_fade_height_multiplier = 1.0 / 10.0; // It's cheaper to do a floating point multiply than divide,
// so keep this value and its reciprocal. // so keep this value and its reciprocal.
#else
const float g29_correction_fade_height = 10.0,
g29_fade_height_multiplier = 1.0 / 10.0;
#endif #endif
// If you change this struct, adjust TOTAL_STRUCT_SIZE // If you change this struct, adjust TOTAL_STRUCT_SIZE
@ -118,8 +115,7 @@
class unified_bed_leveling { class unified_bed_leveling {
private: private:
static float last_specified_z, static float last_specified_z;
fade_scaling_factor_for_current_height;
public: public:
@ -307,32 +303,29 @@
} }
/** /**
* This routine is used to scale the Z correction depending upon the current nozzle height. It is * This function sets the Z leveling fade factor based on the given Z height,
* optimized for speed. It avoids floating point operations by checking if the requested scaling * only re-calculating when necessary.
* factor is going to be the same as the last time the function calculated a value. If so, it just
* returns it.
* *
* It returns a scaling factor of 1.0 if UBL is inactive. * Returns 1.0 if g29_correction_fade_height is 0.0.
* It returns a scaling factor of 0.0 if Z is past the specified 'Fade Height' * Returns 0.0 if Z is past the specified 'Fade Height'.
*/ */
#if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT)
static FORCE_INLINE float fade_scaling_factor_for_z(const float &lz) { static FORCE_INLINE float fade_scaling_factor_for_z(const float &lz) {
if (state.g29_correction_fade_height == 0.0) return 1.0;
static float fade_scaling_factor = 1.0;
const float rz = RAW_Z_POSITION(lz); const float rz = RAW_Z_POSITION(lz);
if (last_specified_z != rz) { if (last_specified_z != rz) {
last_specified_z = rz; last_specified_z = rz;
fade_scaling_factor_for_current_height = fade_scaling_factor =
state.active && rz < state.g29_correction_fade_height rz < state.g29_correction_fade_height
? 1.0 - (rz * state.g29_fade_height_multiplier) ? 1.0 - (rz * state.g29_fade_height_multiplier)
: 0.0; : 0.0;
} }
return fade_scaling_factor_for_current_height; return fade_scaling_factor;
} }
#else
static constexpr float fade_scaling_factor_for_z(const float &lz) { UNUSED(lz); return 1.0; }
#endif #endif
}; // class unified_bed_leveling }; // class unified_bed_leveling

View File

@ -61,7 +61,6 @@
float unified_bed_leveling::z_values[UBL_MESH_NUM_X_POINTS][UBL_MESH_NUM_Y_POINTS], float unified_bed_leveling::z_values[UBL_MESH_NUM_X_POINTS][UBL_MESH_NUM_Y_POINTS],
unified_bed_leveling::last_specified_z, unified_bed_leveling::last_specified_z,
unified_bed_leveling::fade_scaling_factor_for_current_height,
unified_bed_leveling::mesh_index_to_xpos[UBL_MESH_NUM_X_POINTS + 1], // +1 safety margin for now, until determinism prevails unified_bed_leveling::mesh_index_to_xpos[UBL_MESH_NUM_X_POINTS + 1], // +1 safety margin for now, until determinism prevails
unified_bed_leveling::mesh_index_to_ypos[UBL_MESH_NUM_Y_POINTS + 1]; unified_bed_leveling::mesh_index_to_ypos[UBL_MESH_NUM_Y_POINTS + 1];
@ -102,8 +101,9 @@
* updated, but until then, we try to ease the transition * updated, but until then, we try to ease the transition
* for our Beta testers. * for our Beta testers.
*/ */
if (ubl.state.g29_fade_height_multiplier != 1.0 / ubl.state.g29_correction_fade_height) { const float recip = ubl.state.g29_correction_fade_height ? 1.0 / ubl.state.g29_correction_fade_height : 1.0;
ubl.state.g29_fade_height_multiplier = 1.0 / ubl.state.g29_correction_fade_height; if (ubl.state.g29_fade_height_multiplier != recip) {
ubl.state.g29_fade_height_multiplier = recip;
store_state(); store_state();
} }
#endif #endif
@ -160,7 +160,6 @@
ZERO(z_values); ZERO(z_values);
last_specified_z = -999.9; last_specified_z = -999.9;
fade_scaling_factor_for_current_height = 0.0;
} }
void unified_bed_leveling::invalidate() { void unified_bed_leveling::invalidate() {

View File

@ -1132,8 +1132,7 @@
safe_delay(50); safe_delay(50);
#if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT)
SERIAL_PROTOCOLPAIR("g29_correction_fade_height : ", ubl.state.g29_correction_fade_height); SERIAL_PROTOCOLLNPAIR("g29_correction_fade_height : ", ubl.state.g29_correction_fade_height);
SERIAL_EOL;
#endif #endif
SERIAL_PROTOCOLPGM("z_offset: "); SERIAL_PROTOCOLPGM("z_offset: ");