1
0
mirror of https://github.com/MarlinFirmware/Marlin.git synced 2024-11-29 23:07:42 +00:00

🎨 Planner cosmetics (#27497)

This commit is contained in:
Andrew 2024-10-29 11:38:50 -04:00 committed by GitHub
parent 163ca2783f
commit dff2104c96
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 110 additions and 94 deletions

View File

@ -135,8 +135,8 @@ uint8_t Planner::delay_before_delivering; // Delay block delivery so initi
#if ENABLED(EDITABLE_STEPS_PER_UNIT)
float Planner::mm_per_step[DISTINCT_AXES]; // (mm) Millimeters per step
#else
constexpr float PlannerSettings::axis_steps_per_mm[DISTINCT_AXES];
constexpr float Planner::mm_per_step[DISTINCT_AXES];
constexpr float PlannerSettings::axis_steps_per_mm[DISTINCT_AXES],
Planner::mm_per_step[DISTINCT_AXES];
#endif
planner_settings_t Planner::settings; // Initialized by settings.load
@ -179,8 +179,8 @@ uint32_t Planner::max_acceleration_steps_per_s2[DISTINCT_AXES]; // (steps/s^2) D
#endif
#if DISABLED(NO_VOLUMETRICS)
float Planner::volumetric_area_nominal = CIRCLE_AREA(float(DEFAULT_NOMINAL_FILAMENT_DIA) * 0.5f); // Nominal cross-sectional area
float Planner::filament_size[EXTRUDERS], // diameter of filament (in millimeters), typically around 1.75 or 2.85, 0 disables the volumetric calculations for the extruder
Planner::volumetric_area_nominal = CIRCLE_AREA(float(DEFAULT_NOMINAL_FILAMENT_DIA) * 0.5f), // Nominal cross-sectional area
Planner::volumetric_multiplier[EXTRUDERS]; // Reciprocal of cross-sectional area of filament (in mm^2). Pre-calculated to reduce computation in the planner
#endif
@ -782,9 +782,9 @@ block_t* Planner::get_current_block() {
* sqrt(block->acceleration_steps_per_s2 / 2). This is ensured through
* minimum_planner_speed_sqr / min_entry_speed_sqr though note there's one
* exception in recalculate_trapezoids().
**
*
* ############ VERY IMPORTANT ############
* NOTE that the PRECONDITION to call this function is that the block is
* NOTE: The PRECONDITION to call this function is that the block is
* NOT BUSY and it is marked as RECALCULATE. That WARRANTIES the Stepper ISR
* is not and will not use the block while we modify it.
*/
@ -1542,7 +1542,7 @@ void Planner::check_axes_activity() {
else if (z_full_fade >= z_fade_height) // Above the fade height?
raw.z = z_full_fade; // Nothing more to unapply.
else // Within the fade zone?
raw.z = z_no_fade / (1.0f - z_correction * inverse_z_fade_height); // Unapply the faded Z offset
raw.z = z_no_fade / (1.0f - z_correction * inverse_z_fade_height); // Unapply the faded Z offset
#else
raw.z = z_no_fade;
#endif
@ -1570,11 +1570,14 @@ void Planner::check_axes_activity() {
void Planner::quick_stop() {
// Remove all the queued blocks. Note that this function is NOT
// called from the Stepper ISR, so we must consider tail as readonly!
// that is why we set head to tail - But there is a race condition that
// must be handled: The tail could change between the read and the assignment
// so this must be enclosed in a critical section
/**
* Remove all the queued blocks.
* NOTE: This function is NOT called from the Stepper ISR,
* so we must consider tail as readonly!
* That is why we set head to tail - But there is a race condition that
* must be handled: The tail could change between the read and the assignment
* so this must be enclosed in a critical section
*/
const bool was_enabled = stepper.suspend();
@ -1703,9 +1706,9 @@ void Planner::synchronize() { while (busy()) idle(); }
* @param target Target position in steps units
* @param target_float Target position in direct (mm, degrees) units.
* @param cart_dist_mm The pre-calculated move lengths for all axes, in mm
* @param fr_mm_s (target) speed of the move
* @param extruder target extruder
* @param hints parameters to aid planner calculations
* @param fr_mm_s (Target) speed of the move
* @param extruder Target extruder
* @param hints Parameters to aid planner calculations
*
* @return true if movement was properly queued, false otherwise (if cleaning)
*/
@ -1765,7 +1768,7 @@ bool Planner::_buffer_steps(const xyze_long_t &target
}
/**
* @brief Populate a block in preparation for insertion
* @brief Populate a block in preparation for insertion.
* @details Populate the fields of a new linear movement block
* that will be added to the queue and processed soon
* by the Stepper ISR.
@ -1774,9 +1777,9 @@ bool Planner::_buffer_steps(const xyze_long_t &target
* @param target Target position in steps units
* @param target_float Target position in native mm
* @param cart_dist_mm The pre-calculated move lengths for all axes, in mm
* @param fr_mm_s (target) speed of the move
* @param extruder target extruder
* @param hints parameters to aid planner calculations
* @param fr_mm_s (Target) speed of the move
* @param extruder Target extruder
* @param hints Parameters to aid planner calculations
*
* @return true if movement is acceptable, false otherwise
*/
@ -2195,9 +2198,11 @@ bool Planner::_populate_block(
const float inverse_millimeters = 1.0f / block->millimeters; // Inverse millimeters to remove multiple divides
// Calculate inverse time for this move. No divide by zero due to previous checks.
// Example: At 120mm/s a 60mm move involving XYZ axes takes 0.5s. So this will give 2.0.
// Example 2: At 120°/s a 60° move involving only rotational axes takes 0.5s. So this will give 2.0.
/**
* Calculate inverse time for this move. No divide by zero due to previous checks.
* EXAMPLE: At 120mm/s a 60mm move involving XYZ axes takes 0.5s. So this will give 2.0.
* EXAMPLE: At 120°/s a 60° move involving only rotational axes takes 0.5s. So this will give 2.0.
*/
float inverse_secs = inverse_millimeters * (
#if ALL(HAS_ROTATIONAL_AXES, INCH_MODE_SUPPORT)
/**
@ -2766,8 +2771,8 @@ bool Planner::_populate_block(
} // _populate_block()
/**
* @brief Add a block to the buffer that just updates the position
* Supports LASER_SYNCHRONOUS_M106_M107 and LASER_POWER_SYNC power sync block buffer queueing.
* @brief Add a block to the buffer that just updates the position.
* @details Supports LASER_SYNCHRONOUS_M106_M107 and LASER_POWER_SYNC power sync block buffer queueing.
*
* @param sync_flag The sync flag to set, determining the type of sync the block will do
*/
@ -2813,16 +2818,15 @@ void Planner::buffer_sync_block(const BlockFlagBit sync_flag/*=BLOCK_BIT_SYNC_PO
} // buffer_sync_block()
/**
* @brief Add a single linear movement
*
* @description Add a new linear movement to the buffer in axis units.
* Leveling and kinematics should be applied before calling this.
* @brief Add a single linear movement.
* @details Add a new linear movement to the buffer in axis units.
* Leveling and kinematics should be applied before calling this.
*
* @param abce Target position in mm and/or degrees
* @param cart_dist_mm The pre-calculated move lengths for all axes, in mm
* @param fr_mm_s (target) speed of the move
* @param extruder optional target extruder (otherwise active_extruder)
* @param hints optional parameters to aid planner calculations
* @param fr_mm_s (Target) speed of the move
* @param extruder Optional target extruder (otherwise active_extruder)
* @param hints Optional parameters to aid planner calculations
*
* @return false if no segment was queued due to cleaning, cold extrusion, full queue, etc.
*/
@ -2944,14 +2948,14 @@ bool Planner::buffer_segment(const abce_pos_t &abce
} // buffer_segment()
/**
* Add a new linear movement to the buffer.
* The target is cartesian. It's translated to
* delta/scara if needed.
* @brief Add a new linear movement to the buffer.
* @details The target is cartesian. It's translated to
* delta/scara if needed.
*
* cart - target position in mm or degrees
* fr_mm_s - (target) speed of the move (mm/s)
* extruder - optional target extruder (otherwise active_extruder)
* hints - optional parameters to aid planner calculations
* @param cart Target position in mm or degrees
* @param fr_mm_s (Target) speed of the move (mm/s)
* @param extruder Optional target extruder (otherwise active_extruder)
* @param hints Optional parameters to aid planner calculations
*/
bool Planner::buffer_line(const xyze_pos_t &cart, const_feedRate_t fr_mm_s
, const uint8_t extruder/*=active_extruder*/
@ -3233,7 +3237,7 @@ inline void limit_and_warn(float &val, const AxisEnum axis, FSTR_P const setting
}
/**
* For the specified 'axis' set the Maximum Acceleration to the given value (mm/s^2)
* For the specified 'axis' set the Maximum Acceleration to the given value (mm/s^2).
* The value may be limited with warning feedback, if configured.
* Calls refresh_acceleration_rates to precalculate planner terms in steps.
*
@ -3257,7 +3261,7 @@ void Planner::set_max_acceleration(const AxisEnum axis, float inMaxAccelMMS2) {
}
/**
* For the specified 'axis' set the Maximum Feedrate to the given value (mm/s)
* For the specified 'axis' set the Maximum Feedrate to the given value (mm/s).
* The value may be limited with warning feedback, if configured.
*
* This hard limit is applied as a block is being added to the planner queue.
@ -3279,7 +3283,7 @@ void Planner::set_max_feedrate(const AxisEnum axis, float inMaxFeedrateMMS) {
#if ENABLED(CLASSIC_JERK)
/**
* For the specified 'axis' set the Maximum Jerk (instant change) to the given value (mm/s)
* For the specified 'axis' set the Maximum Jerk (instant change) to the given value (mm/s).
* The value may be limited with warning feedback, if configured.
*
* This hard limit is applied (to the block start speed) as the block is being added to the planner queue.
@ -3310,7 +3314,7 @@ void Planner::set_max_feedrate(const AxisEnum axis, float inMaxFeedrateMMS) {
uint16_t Planner::block_buffer_runtime() {
#ifdef __AVR__
// Protect the access to the variable. Only required for AVR, as
// any 32bit CPU offers atomic access to 32bit variables
// any 32bit CPU offers atomic access to 32bit variables
const bool was_enabled = stepper.suspend();
#endif
@ -3332,7 +3336,7 @@ void Planner::set_max_feedrate(const AxisEnum axis, float inMaxFeedrateMMS) {
void Planner::clear_block_buffer_runtime() {
#ifdef __AVR__
// Protect the access to the variable. Only required for AVR, as
// any 32bit CPU offers atomic access to 32bit variables
// any 32bit CPU offers atomic access to 32bit variables
const bool was_enabled = stepper.suspend();
#endif

View File

@ -337,8 +337,8 @@ constexpr uint8_t block_inc_mod(const uint8_t v1, const uint8_t v2) {
#endif
typedef struct PlannerSettings {
uint32_t max_acceleration_mm_per_s2[DISTINCT_AXES], // (mm/s^2) M201 XYZE
min_segment_time_us; // (µs) M205 B
uint32_t max_acceleration_mm_per_s2[DISTINCT_AXES]; // (mm/s^2) M201 XYZE
uint32_t min_segment_time_us; // (µs) M205 B
// (steps) M92 XYZE - Steps per millimeter
#if ENABLED(EDITABLE_STEPS_PER_UNIT)
@ -356,12 +356,12 @@ typedef struct PlannerSettings {
#undef _DLIM
#endif
feedRate_t max_feedrate_mm_s[DISTINCT_AXES]; // (mm/s) M203 XYZE - Max speeds
float acceleration, // (mm/s^2) M204 S - Normal acceleration. DEFAULT ACCELERATION for all printing moves.
retract_acceleration, // (mm/s^2) M204 R - Retract acceleration. Filament pull-back and push-forward while standing still in the other axes
travel_acceleration; // (mm/s^2) M204 T - Travel acceleration. DEFAULT ACCELERATION for all NON printing moves.
feedRate_t min_feedrate_mm_s, // (mm/s) M205 S - Minimum linear feedrate
min_travel_feedrate_mm_s; // (mm/s) M205 T - Minimum travel feedrate
feedRate_t max_feedrate_mm_s[DISTINCT_AXES]; // (mm/s) M203 XYZE - Max speeds
float acceleration, // (mm/s^2) M204 S - Normal acceleration. DEFAULT ACCELERATION for all printing moves.
retract_acceleration, // (mm/s^2) M204 R - Retract acceleration. Filament pull-back and push-forward while standing still in the other axes
travel_acceleration; // (mm/s^2) M204 T - Travel acceleration. DEFAULT ACCELERATION for all NON printing moves.
feedRate_t min_feedrate_mm_s, // (mm/s) M205 S - Minimum linear feedrate
min_travel_feedrate_mm_s; // (mm/s) M205 T - Minimum travel feedrate
} planner_settings_t;
#if ENABLED(IMPROVE_HOMING_RELIABILITY)
@ -460,8 +460,8 @@ class Planner {
#endif
#if DISABLED(NO_VOLUMETRICS)
static float volumetric_area_nominal; // (mm^3) Nominal cross-sectional area
static float filament_size[EXTRUDERS], // (mm) Diameter of filament, typically around 1.75 or 2.85, 0 disables the volumetric calculations for the extruder
volumetric_area_nominal, // (mm^3) Nominal cross-sectional area
volumetric_multiplier[EXTRUDERS]; // (1/mm^2) Reciprocal of cross-sectional area of filament. Pre-calculated to reduce computation in the planner
// May be auto-adjusted by a filament width sensor
#endif
@ -811,11 +811,12 @@ class Planner {
FORCE_INLINE static uint8_t moves_free() { return (BLOCK_BUFFER_SIZE) - 1 - movesplanned(); }
/**
* Planner::get_next_free_block
* @fn Planner::get_next_free_block
*
* - Get the next head indices (passed by reference)
* - Wait for the number of spaces to open up in the planner
* - Return the first head block
* @details Get the next head indices (passed by reference)
* Wait for the number of spaces to open up in the planner
*
* @return The first head block
*/
FORCE_INLINE static block_t* get_next_free_block(uint8_t &next_buffer_head, const uint8_t count=1) {
@ -828,16 +829,18 @@ class Planner {
}
/**
* Planner::_buffer_steps
* @fn Planner::_buffer_steps
*
* Add a new linear movement to the buffer (in terms of steps).
* @brief Add a new linear movement to the planner queue (in terms of steps).
*
* target - target position in steps units
* fr_mm_s - (target) speed of the move
* extruder - target extruder
* hints - parameters to aid planner calculations
* @param target Target position in steps units
* @param target_float Target position in direct (mm, degrees) units.
* @param cart_dist_mm The pre-calculated move lengths for all axes, in mm
* @param fr_mm_s (Target) speed of the move
* @param extruder Target extruder
* @param hints Parameters to aid planner calculations
*
* Returns true if movement was buffered, false otherwise
* @return true if movement was properly queued, false otherwise (if cleaning)
*/
static bool _buffer_steps(const xyze_long_t &target
OPTARG(HAS_POSITION_FLOAT, const xyze_pos_t &target_float)
@ -846,7 +849,9 @@ class Planner {
);
/**
* @brief Populate a block in preparation for insertion
* @fn Planner::_populate_block
*
* @brief Populate a block in preparation for insertion.
* @details Populate the fields of a new linear movement block
* that will be added to the queue and processed soon
* by the Stepper ISR.
@ -855,9 +860,9 @@ class Planner {
* @param target Target position in steps units
* @param target_float Target position in native mm
* @param cart_dist_mm The pre-calculated move lengths for all axes, in mm
* @param fr_mm_s (target) speed of the move
* @param extruder target extruder
* @param hints parameters to aid planner calculations
* @param fr_mm_s (Target) speed of the move
* @param extruder Target extruder
* @param hints Parameters to aid planner calculations
*
* @return true if movement is acceptable, false otherwise
*/
@ -869,31 +874,31 @@ class Planner {
);
/**
* Planner::buffer_sync_block
* Add a block to the buffer that just updates the position
* @param sync_flag sets a condition bit to process additional items
* such as sync fan pwm or sync M3/M4 laser power into a queued block
* @fn Planner::buffer_sync_block
*
* @brief Add a block to the buffer that just updates the position.
* @details Supports LASER_SYNCHRONOUS_M106_M107 and LASER_POWER_SYNC power sync block buffer queueing.
*
* @param sync_flag The sync flag to set, determining the type of sync the block will do
* Sets a condition bit to process additional items such as sync fan pwm
* or sync M3/M4 laser power into a queued block
*/
static void buffer_sync_block(const BlockFlagBit flag=BLOCK_BIT_SYNC_POSITION);
#if IS_KINEMATIC
private:
// Allow do_homing_move to access internal functions, such as buffer_segment.
friend void do_homing_move(const AxisEnum, const float, const feedRate_t, const bool);
#endif
static void buffer_sync_block(const BlockFlagBit flag=BLOCK_BIT_SYNC_POSITION);
/**
* Planner::buffer_segment
* @fn Planner::buffer_segment
*
* Add a new linear movement to the buffer in axis units.
* @brief Add a single linear movement.
* @details Add a new linear movement to the buffer in axis units.
* Leveling and kinematics should be applied before calling this.
*
* Leveling and kinematics should be applied ahead of calling this.
* @param abce Target position in mm and/or degrees
* @param cart_dist_mm The pre-calculated move lengths for all axes, in mm
* @param fr_mm_s (Target) speed of the move
* @param extruder Optional target extruder (otherwise active_extruder)
* @param hints Optional parameters to aid planner calculations
*
* a,b,c,e - target positions in mm and/or degrees
* fr_mm_s - (target) speed of the move
* extruder - optional target extruder (otherwise active_extruder)
* hints - optional parameters to aid planner calculations
* @return false if no segment was queued due to cleaning, cold extrusion, full queue, etc...
*/
static bool buffer_segment(const abce_pos_t &abce
OPTARG(HAS_DIST_MM_ARG, const xyze_float_t &cart_dist_mm)
@ -902,17 +907,19 @@ class Planner {
, const PlannerHints &hints=PlannerHints()
);
public:
/**
* Add a new linear movement to the buffer.
* The target is cartesian. It's translated to
* delta/scara if needed.
* @fn Planner::buffer_line
*
* cart - target position in mm or degrees
* fr_mm_s - (target) speed of the move (mm/s)
* extruder - optional target extruder (otherwise active_extruder)
* hints - optional parameters to aid planner calculations
* @brief Add a new linear movement to the buffer.
* @details The target is cartesian. It's translated to
* delta/scara if needed.
*
* @param cart Target position in mm or degrees
* @param fr_mm_s (Target) speed of the move (mm/s)
* @param extruder Optional target extruder (otherwise active_extruder)
* @param hints Optional parameters to aid planner calculations
*
* @return false if no segment was queued due to cleaning, cold extrusion, full queue, etc...
*/
static bool buffer_line(const xyze_pos_t &cart, const_feedRate_t fr_mm_s
, const uint8_t extruder=active_extruder
@ -1090,6 +1097,11 @@ class Planner {
static void recalculate(const_float_t safe_exit_speed_sqr);
#if IS_KINEMATIC
// Allow do_homing_move to access internal functions, such as buffer_segment.
friend void do_homing_move(const AxisEnum, const float, const feedRate_t, const bool);
#endif
#if HAS_JUNCTION_DEVIATION
FORCE_INLINE static void normalize_junction_vector(xyze_float_t &vector) {