Tweaks to core motion code

This commit is contained in:
Scott Lahteine 2017-11-08 19:45:20 -06:00
parent 7326fe1136
commit 2559745f54
2 changed files with 27 additions and 26 deletions

View File

@ -3354,7 +3354,7 @@ void gcode_get_destination() {
LOOP_XYZE(i) { LOOP_XYZE(i) {
if (parser.seen(axis_codes[i])) { if (parser.seen(axis_codes[i])) {
const float v = parser.value_axis_units((AxisEnum)i) + (axis_relative_modes[i] || relative_mode ? current_position[i] : 0); const float v = parser.value_axis_units((AxisEnum)i) + (axis_relative_modes[i] || relative_mode ? current_position[i] : 0);
destination[i] = (i == E_AXIS ? v : LOGICAL_TO_NATIVE(v, i)); destination[i] = i == E_AXIS ? v : LOGICAL_TO_NATIVE(v, i);
} }
else else
destination[i] = current_position[i]; destination[i] = current_position[i];
@ -12716,13 +12716,17 @@ void set_current_from_steppers_for_axis(const AxisEnum axis) {
#endif // AUTO_BED_LEVELING_BILINEAR #endif // AUTO_BED_LEVELING_BILINEAR
#if IS_KINEMATIC && !UBL_DELTA #if !UBL_DELTA
#if IS_KINEMATIC
/** /**
* Prepare a linear move in a DELTA or SCARA setup. * Prepare a linear move in a DELTA or SCARA setup.
* *
* This calls planner.buffer_line several times, adding * This calls planner.buffer_line several times, adding
* small incremental moves for DELTA or SCARA. * small incremental moves for DELTA or SCARA.
*
* For Unified Bed Leveling (Delta or Segmented Cartesian)
* the ubl.prepare_segmented_line_to method replaces this.
*/ */
inline bool prepare_kinematic_move_to(float rtarget[XYZE]) { inline bool prepare_kinematic_move_to(float rtarget[XYZE]) {
@ -12841,46 +12845,45 @@ void set_current_from_steppers_for_axis(const AxisEnum axis) {
return false; return false;
} }
#else // !IS_KINEMATIC || UBL_DELTA #else // !IS_KINEMATIC
/** /**
* 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. *
* When a mesh-based leveling system is active, moves are segmented
* according to the configuration of the leveling system.
* *
* Returns true if current_position[] was set to destination[] * Returns true if current_position[] was set to destination[]
*/ */
inline bool prepare_move_to_destination_cartesian() { inline bool prepare_move_to_destination_cartesian() {
const float fr_scaled = MMS_SCALED(feedrate_mm_s); #if HAS_MESH
#if HAS_MESH if (planner.leveling_active) {
if (!planner.leveling_active) {
line_to_destination(fr_scaled);
return false;
}
#if ENABLED(AUTO_BED_LEVELING_UBL) #if ENABLED(AUTO_BED_LEVELING_UBL)
ubl.line_to_destination_cartesian(fr_scaled, active_extruder); // UBL's motion routine needs to know about all moves, ubl.line_to_destination_cartesian(MMS_SCALED(feedrate_mm_s), active_extruder); // UBL's motion routine needs to know about
return true; // even purely Z-Axis moves return true; // all moves, including Z-only moves.
#else #else
/**
* For MBL and ABL-BILINEAR only segment moves when X or Y are involved.
* Otherwise fall through to do a direct single move.
*/
if (current_position[X_AXIS] != destination[X_AXIS] || current_position[Y_AXIS] != destination[Y_AXIS]) { if (current_position[X_AXIS] != destination[X_AXIS] || current_position[Y_AXIS] != destination[Y_AXIS]) {
#if ENABLED(MESH_BED_LEVELING) #if ENABLED(MESH_BED_LEVELING)
mesh_line_to_destination(fr_scaled); mesh_line_to_destination(MMS_SCALED(feedrate_mm_s));
#elif ENABLED(AUTO_BED_LEVELING_BILINEAR) #elif ENABLED(AUTO_BED_LEVELING_BILINEAR)
bilinear_line_to_destination(fr_scaled); bilinear_line_to_destination(MMS_SCALED(feedrate_mm_s));
#endif #endif
return true; return true;
} }
else {
line_to_destination();
return false;
}
#endif #endif
#else }
line_to_destination(); #endif // HAS_MESH
#endif // HAS_MESH
line_to_destination(MMS_SCALED(feedrate_mm_s));
return false; return false;
} }
#endif // !IS_KINEMATIC || UBL_DELTA #endif // !IS_KINEMATIC
#endif // !UBL_DELTA
#if ENABLED(DUAL_X_CARRIAGE) #if ENABLED(DUAL_X_CARRIAGE)

View File

@ -489,7 +489,7 @@
// We don't want additional apply_leveling() performed by regular buffer_line or buffer_line_kinematic, // We don't want additional apply_leveling() performed by regular buffer_line or buffer_line_kinematic,
// so we call _buffer_line directly here. Per-segmented leveling and kinematics performed first. // so we call _buffer_line directly here. Per-segmented leveling and kinematics performed first.
inline void _O2 ubl_buffer_segment_raw( float rx, float ry, float rz, float e, float fr ) { inline void _O2 ubl_buffer_segment_raw(const float &rx, const float &ry, const float rz, const float &e, const float &fr) {
#if ENABLED(DELTA) // apply delta inverse_kinematics #if ENABLED(DELTA) // apply delta inverse_kinematics
@ -507,7 +507,7 @@
planner._buffer_line(delta_A, delta_B, delta_C, e, fr, active_extruder); planner._buffer_line(delta_A, delta_B, delta_C, e, fr, active_extruder);
#elif IS_SCARA // apply scara inverse_kinematics (should be changed to save raw->logical->raw) #elif IS_SCARA // apply scara inverse_kinematics
const float lseg[XYZ] = { rx, ry, rz }; const float lseg[XYZ] = { rx, ry, rz };
@ -524,8 +524,6 @@
#else // CARTESIAN #else // CARTESIAN
// Cartesian _buffer_line seems to take LOGICAL, not RAW coordinates
planner._buffer_line(rx, ry, rz, e, fr, active_extruder); planner._buffer_line(rx, ry, rz, e, fr, active_extruder);
#endif #endif