Add custom types for position (#15204)
This commit is contained in:
@ -40,7 +40,7 @@
|
||||
#endif
|
||||
|
||||
#if ABL_PLANAR
|
||||
#include "../libs/vector_3.h"
|
||||
#include "../libs/vector_3.h" // for matrix_3x3
|
||||
#endif
|
||||
|
||||
#if ENABLED(FWRETRACT)
|
||||
@ -51,6 +51,11 @@
|
||||
#include "../feature/mixing.h"
|
||||
#endif
|
||||
|
||||
// Feedrate for manual moves
|
||||
#ifdef MANUAL_FEEDRATE
|
||||
constexpr xyze_feedrate_t manual_feedrate_mm_m = MANUAL_FEEDRATE;
|
||||
#endif
|
||||
|
||||
enum BlockFlagBit : char {
|
||||
// Recalculate trapezoids on entry junction. For optimization.
|
||||
BLOCK_BIT_RECALCULATE,
|
||||
@ -95,15 +100,8 @@ typedef struct block_t {
|
||||
acceleration; // acceleration mm/sec^2
|
||||
|
||||
union {
|
||||
// Data used by all move blocks
|
||||
struct {
|
||||
// Fields used by the Bresenham algorithm for tracing the line
|
||||
uint32_t steps[NUM_AXIS]; // Step count along each axis
|
||||
};
|
||||
// Data used by all sync blocks
|
||||
struct {
|
||||
int32_t position[NUM_AXIS]; // New position to force when this sync block is executed
|
||||
};
|
||||
abce_ulong_t steps; // Step count along each axis
|
||||
abce_long_t position; // New position to force when this sync block is executed
|
||||
};
|
||||
uint32_t step_event_count; // The number of step events required to complete this block
|
||||
|
||||
@ -259,19 +257,18 @@ class Planner {
|
||||
#endif
|
||||
|
||||
#if HAS_CLASSIC_JERK
|
||||
static float max_jerk[
|
||||
#if BOTH(JUNCTION_DEVIATION, LIN_ADVANCE)
|
||||
XYZ // (mm/s^2) M205 XYZ - The largest speed change requiring no acceleration.
|
||||
#else
|
||||
XYZE // (mm/s^2) M205 XYZE - The largest speed change requiring no acceleration.
|
||||
#endif
|
||||
];
|
||||
#if BOTH(JUNCTION_DEVIATION, LIN_ADVANCE)
|
||||
static xyz_pos_t max_jerk; // (mm/s^2) M205 XYZ - The largest speed change requiring no acceleration.
|
||||
#else
|
||||
static xyze_pos_t max_jerk; // (mm/s^2) M205 XYZE - The largest speed change requiring no acceleration.
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if HAS_LEVELING
|
||||
static bool leveling_active; // Flag that bed leveling is enabled
|
||||
#if ABL_PLANAR
|
||||
static matrix_3x3 bed_level_matrix; // Transform to compensate for bed level
|
||||
static constexpr xy_pos_t level_fulcrum = { X_TILT_FULCRUM, Y_TILT_FULCRUM };
|
||||
#endif
|
||||
#if ENABLED(ENABLE_LEVELING_FADE_HEIGHT)
|
||||
static float z_fade_height, inverse_z_fade_height;
|
||||
@ -285,11 +282,11 @@ class Planner {
|
||||
#endif
|
||||
|
||||
#if HAS_POSITION_FLOAT
|
||||
static float position_float[XYZE];
|
||||
static xyze_pos_t position_float;
|
||||
#endif
|
||||
|
||||
#if IS_KINEMATIC
|
||||
static float position_cart[XYZE];
|
||||
static xyze_pos_t position_cart;
|
||||
#endif
|
||||
|
||||
static skew_factor_t skew_factor;
|
||||
@ -304,12 +301,12 @@ class Planner {
|
||||
* The current position of the tool in absolute steps
|
||||
* Recalculated if any axis_steps_per_mm are changed by gcode
|
||||
*/
|
||||
static int32_t position[NUM_AXIS];
|
||||
static xyze_long_t position;
|
||||
|
||||
/**
|
||||
* Speed of previous path line segment
|
||||
*/
|
||||
static float previous_speed[NUM_AXIS];
|
||||
static xyze_float_t previous_speed;
|
||||
|
||||
/**
|
||||
* Nominal speed of previous path line segment (mm/s)^2
|
||||
@ -338,7 +335,7 @@ class Planner {
|
||||
// Old direction bits. Used for speed calculations
|
||||
static unsigned char old_direction_bits;
|
||||
// Segment times (in µs). Used for speed calculations
|
||||
static uint32_t axis_segment_time_us[2][3];
|
||||
static xy_ulong_t axis_segment_time_us[3];
|
||||
#endif
|
||||
|
||||
#if HAS_SPI_LCD
|
||||
@ -454,8 +451,7 @@ class Planner {
|
||||
}
|
||||
}
|
||||
}
|
||||
FORCE_INLINE static void skew(float (&raw)[XYZ]) { skew(raw[X_AXIS], raw[Y_AXIS], raw[Z_AXIS]); }
|
||||
FORCE_INLINE static void skew(float (&raw)[XYZE]) { skew(raw[X_AXIS], raw[Y_AXIS], raw[Z_AXIS]); }
|
||||
FORCE_INLINE static void skew(xyz_pos_t &raw) { skew(raw.x, raw.y, raw.z); }
|
||||
|
||||
FORCE_INLINE static void unskew(float &cx, float &cy, const float &cz) {
|
||||
if (WITHIN(cx, X_MIN_POS, X_MAX_POS) && WITHIN(cy, Y_MIN_POS, Y_MAX_POS)) {
|
||||
@ -466,8 +462,7 @@ class Planner {
|
||||
}
|
||||
}
|
||||
}
|
||||
FORCE_INLINE static void unskew(float (&raw)[XYZ]) { unskew(raw[X_AXIS], raw[Y_AXIS], raw[Z_AXIS]); }
|
||||
FORCE_INLINE static void unskew(float (&raw)[XYZE]) { unskew(raw[X_AXIS], raw[Y_AXIS], raw[Z_AXIS]); }
|
||||
FORCE_INLINE static void unskew(xyz_pos_t &raw) { unskew(raw.x, raw.y, raw.z); }
|
||||
|
||||
#endif // SKEW_CORRECTION
|
||||
|
||||
@ -476,22 +471,24 @@ class Planner {
|
||||
* Apply leveling to transform a cartesian position
|
||||
* as it will be given to the planner and steppers.
|
||||
*/
|
||||
static void apply_leveling(float &rx, float &ry, float &rz);
|
||||
FORCE_INLINE static void apply_leveling(float (&raw)[XYZ]) { apply_leveling(raw[X_AXIS], raw[Y_AXIS], raw[Z_AXIS]); }
|
||||
FORCE_INLINE static void apply_leveling(float (&raw)[XYZE]) { apply_leveling(raw[X_AXIS], raw[Y_AXIS], raw[Z_AXIS]); }
|
||||
|
||||
static void unapply_leveling(float raw[XYZ]);
|
||||
static void apply_leveling(xyz_pos_t &raw);
|
||||
static void unapply_leveling(xyz_pos_t &raw);
|
||||
FORCE_INLINE static void force_unapply_leveling(xyz_pos_t &raw) {
|
||||
leveling_active = true;
|
||||
unapply_leveling(raw);
|
||||
leveling_active = false;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if ENABLED(FWRETRACT)
|
||||
static void apply_retract(float &rz, float &e);
|
||||
FORCE_INLINE static void apply_retract(float (&raw)[XYZE]) { apply_retract(raw[Z_AXIS], raw[E_AXIS]); }
|
||||
FORCE_INLINE static void apply_retract(xyze_pos_t &raw) { apply_retract(raw.z, raw.e); }
|
||||
static void unapply_retract(float &rz, float &e);
|
||||
FORCE_INLINE static void unapply_retract(float (&raw)[XYZE]) { unapply_retract(raw[Z_AXIS], raw[E_AXIS]); }
|
||||
FORCE_INLINE static void unapply_retract(xyze_pos_t &raw) { unapply_retract(raw.z, raw.e); }
|
||||
#endif
|
||||
|
||||
#if HAS_POSITION_MODIFIERS
|
||||
FORCE_INLINE static void apply_modifiers(float (&pos)[XYZE]
|
||||
FORCE_INLINE static void apply_modifiers(xyze_pos_t &pos
|
||||
#if HAS_LEVELING
|
||||
, bool leveling =
|
||||
#if PLANNER_LEVELING
|
||||
@ -512,7 +509,7 @@ class Planner {
|
||||
#endif
|
||||
}
|
||||
|
||||
FORCE_INLINE static void unapply_modifiers(float (&pos)[XYZE]
|
||||
FORCE_INLINE static void unapply_modifiers(xyze_pos_t &pos
|
||||
#if HAS_LEVELING
|
||||
, bool leveling =
|
||||
#if PLANNER_LEVELING
|
||||
@ -578,12 +575,12 @@ class Planner {
|
||||
*
|
||||
* Returns true if movement was buffered, false otherwise
|
||||
*/
|
||||
static bool _buffer_steps(const int32_t (&target)[XYZE]
|
||||
static bool _buffer_steps(const xyze_long_t &target
|
||||
#if HAS_POSITION_FLOAT
|
||||
, const float (&target_float)[ABCE]
|
||||
, const xyze_pos_t &target_float
|
||||
#endif
|
||||
#if IS_KINEMATIC && ENABLED(JUNCTION_DEVIATION)
|
||||
, const float (&delta_mm_cart)[XYZE]
|
||||
, const xyze_float_t &delta_mm_cart
|
||||
#endif
|
||||
, feedRate_t fr_mm_s, const uint8_t extruder, const float &millimeters=0.0
|
||||
);
|
||||
@ -601,12 +598,12 @@ class Planner {
|
||||
* Returns true is movement is acceptable, false otherwise
|
||||
*/
|
||||
static bool _populate_block(block_t * const block, bool split_move,
|
||||
const int32_t (&target)[XYZE]
|
||||
const xyze_long_t &target
|
||||
#if HAS_POSITION_FLOAT
|
||||
, const float (&target_float)[XYZE]
|
||||
, const xyze_pos_t &target_float
|
||||
#endif
|
||||
#if IS_KINEMATIC && ENABLED(JUNCTION_DEVIATION)
|
||||
, const float (&delta_mm_cart)[XYZE]
|
||||
, const xyze_float_t &delta_mm_cart
|
||||
#endif
|
||||
, feedRate_t fr_mm_s, const uint8_t extruder, const float &millimeters=0.0
|
||||
);
|
||||
@ -638,18 +635,18 @@ class Planner {
|
||||
*/
|
||||
static bool buffer_segment(const float &a, const float &b, const float &c, const float &e
|
||||
#if IS_KINEMATIC && ENABLED(JUNCTION_DEVIATION)
|
||||
, const float (&delta_mm_cart)[XYZE]
|
||||
, const xyze_float_t &delta_mm_cart
|
||||
#endif
|
||||
, const feedRate_t &fr_mm_s, const uint8_t extruder, const float &millimeters=0.0
|
||||
);
|
||||
|
||||
FORCE_INLINE static bool buffer_segment(const float (&abce)[ABCE]
|
||||
FORCE_INLINE static bool buffer_segment(abce_pos_t &abce
|
||||
#if IS_KINEMATIC && ENABLED(JUNCTION_DEVIATION)
|
||||
, const float (&delta_mm_cart)[XYZE]
|
||||
, const xyze_float_t &delta_mm_cart
|
||||
#endif
|
||||
, const feedRate_t &fr_mm_s, const uint8_t extruder, const float &millimeters=0.0
|
||||
) {
|
||||
return buffer_segment(abce[A_AXIS], abce[B_AXIS], abce[C_AXIS], abce[E_AXIS]
|
||||
return buffer_segment(abce.a, abce.b, abce.c, abce.e
|
||||
#if IS_KINEMATIC && ENABLED(JUNCTION_DEVIATION)
|
||||
, delta_mm_cart
|
||||
#endif
|
||||
@ -675,12 +672,12 @@ class Planner {
|
||||
#endif
|
||||
);
|
||||
|
||||
FORCE_INLINE static bool buffer_line(const float (&cart)[XYZE], const feedRate_t &fr_mm_s, const uint8_t extruder, const float millimeters=0.0
|
||||
FORCE_INLINE static bool buffer_line(const xyze_pos_t &cart, const feedRate_t &fr_mm_s, const uint8_t extruder, const float millimeters=0.0
|
||||
#if ENABLED(SCARA_FEEDRATE_SCALING)
|
||||
, const float &inv_duration=0.0
|
||||
#endif
|
||||
) {
|
||||
return buffer_line(cart[X_AXIS], cart[Y_AXIS], cart[Z_AXIS], cart[E_AXIS], fr_mm_s, extruder, millimeters
|
||||
return buffer_line(cart.x, cart.y, cart.z, cart.e, fr_mm_s, extruder, millimeters
|
||||
#if ENABLED(SCARA_FEEDRATE_SCALING)
|
||||
, inv_duration
|
||||
#endif
|
||||
@ -701,7 +698,7 @@ class Planner {
|
||||
* Clears previous speed values.
|
||||
*/
|
||||
static void set_position_mm(const float &rx, const float &ry, const float &rz, const float &e);
|
||||
FORCE_INLINE static void set_position_mm(const float (&cart)[XYZE]) { set_position_mm(cart[X_AXIS], cart[Y_AXIS], cart[Z_AXIS], cart[E_AXIS]); }
|
||||
FORCE_INLINE static void set_position_mm(const xyze_pos_t &cart) { set_position_mm(cart.x, cart.y, cart.z, cart.e); }
|
||||
static void set_e_position_mm(const float &e);
|
||||
|
||||
/**
|
||||
@ -711,7 +708,7 @@ class Planner {
|
||||
* conversions are applied.
|
||||
*/
|
||||
static void set_machine_position_mm(const float &a, const float &b, const float &c, const float &e);
|
||||
FORCE_INLINE static void set_machine_position_mm(const float (&abce)[ABCE]) { set_machine_position_mm(abce[A_AXIS], abce[B_AXIS], abce[C_AXIS], abce[E_AXIS]); }
|
||||
FORCE_INLINE static void set_machine_position_mm(const abce_pos_t &abce) { set_machine_position_mm(abce.a, abce.b, abce.c, abce.e); }
|
||||
|
||||
/**
|
||||
* Get an axis position according to stepper position(s)
|
||||
@ -942,14 +939,13 @@ class Planner {
|
||||
|
||||
#if ENABLED(JUNCTION_DEVIATION)
|
||||
|
||||
FORCE_INLINE static void normalize_junction_vector(float (&vector)[XYZE]) {
|
||||
FORCE_INLINE static void normalize_junction_vector(xyze_float_t &vector) {
|
||||
float magnitude_sq = 0;
|
||||
LOOP_XYZE(idx) if (vector[idx]) magnitude_sq += sq(vector[idx]);
|
||||
const float inv_magnitude = RSQRT(magnitude_sq);
|
||||
LOOP_XYZE(idx) vector[idx] *= inv_magnitude;
|
||||
vector *= RSQRT(magnitude_sq);
|
||||
}
|
||||
|
||||
FORCE_INLINE static float limit_value_by_axis_maximum(const float &max_value, float (&unit_vec)[XYZE]) {
|
||||
FORCE_INLINE static float limit_value_by_axis_maximum(const float &max_value, xyze_float_t &unit_vec) {
|
||||
float limit_value = max_value;
|
||||
LOOP_XYZE(idx) if (unit_vec[idx]) // Avoid divide by zero
|
||||
NOMORE(limit_value, ABS(settings.max_acceleration_mm_per_s2[idx] / unit_vec[idx]));
|
||||
|
Reference in New Issue
Block a user