From e37415c95b8b0a4efa67ab658d45dfd6786bc0b6 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Fri, 17 May 2024 00:22:14 +0000 Subject: [PATCH 01/13] [cron] Bump distribution date (2024-05-17) --- Marlin/Version.h | 2 +- Marlin/src/inc/Version.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/Version.h b/Marlin/Version.h index b28f7eabc2..31a7e39517 100644 --- a/Marlin/Version.h +++ b/Marlin/Version.h @@ -41,7 +41,7 @@ * here we define this default string as the date where the latest release * version was tagged. */ -//#define STRING_DISTRIBUTION_DATE "2024-05-16" +//#define STRING_DISTRIBUTION_DATE "2024-05-17" /** * Defines a generic printer name to be output to the LCD after booting Marlin. diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 0ef06de574..dc206cb9a7 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2024-05-16" + #define STRING_DISTRIBUTION_DATE "2024-05-17" #endif /** From 383e6f464650f91b2423874e90a0411687cf8fe6 Mon Sep 17 00:00:00 2001 From: Mihai <299015+mh-dm@users.noreply.github.com> Date: Fri, 17 May 2024 04:05:27 +0300 Subject: [PATCH 02/13] =?UTF-8?q?=F0=9F=90=9B=20Move=20LASER=5FPOWER=5FTRA?= =?UTF-8?q?P=20cruise=20to=20cruise=20block=20(#27031)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/module/stepper.cpp | 45 +++++++++++++---------------------- 1 file changed, 17 insertions(+), 28 deletions(-) diff --git a/Marlin/src/module/stepper.cpp b/Marlin/src/module/stepper.cpp index b08f8ccb7e..90254ff947 100644 --- a/Marlin/src/module/stepper.cpp +++ b/Marlin/src/module/stepper.cpp @@ -2441,16 +2441,13 @@ hal_timer_t Stepper::block_phase_isr() { * Laser power variables are calulated and stored in this block by the planner code. * trap_ramp_active_pwr - the active power in this block across accel or decel trap steps. * trap_ramp_entry_incr - holds the precalculated value to increase the current power per accel step. - * - * Apply the starting active power and then increase power per step by the trap_ramp_entry_incr value if positive. */ - #if ENABLED(LASER_POWER_TRAP) if (cutter.cutter_mode == CUTTER_MODE_CONTINUOUS) { if (planner.laser_inline.status.isPowered && planner.laser_inline.status.isEnabled) { if (current_block->laser.trap_ramp_entry_incr > 0) { cutter.apply_power(current_block->laser.trap_ramp_active_pwr); - current_block->laser.trap_ramp_active_pwr += current_block->laser.trap_ramp_entry_incr; + current_block->laser.trap_ramp_active_pwr += current_block->laser.trap_ramp_entry_incr * steps_per_isr; } } // Not a powered move. @@ -2524,15 +2521,12 @@ hal_timer_t Stepper::block_phase_isr() { } #endif // LIN_ADVANCE - /** - * Adjust Laser Power - Decelerating - * trap_ramp_entry_decr - holds the precalculated value to decrease the current power per decel step. - */ + // Adjust Laser Power - Decelerating #if ENABLED(LASER_POWER_TRAP) if (cutter.cutter_mode == CUTTER_MODE_CONTINUOUS) { if (planner.laser_inline.status.isPowered && planner.laser_inline.status.isEnabled) { if (current_block->laser.trap_ramp_exit_decr > 0) { - current_block->laser.trap_ramp_active_pwr -= current_block->laser.trap_ramp_exit_decr; + current_block->laser.trap_ramp_active_pwr -= current_block->laser.trap_ramp_exit_decr * steps_per_isr; cutter.apply_power(current_block->laser.trap_ramp_active_pwr); } // Not a powered move. @@ -2557,30 +2551,25 @@ hal_timer_t Stepper::block_phase_isr() { if (la_active) la_interval = calc_timer_interval(current_block->nominal_rate >> current_block->la_scaling); #endif + + // Adjust Laser Power - Cruise + #if ENABLED(LASER_POWER_TRAP) + if (cutter.cutter_mode == CUTTER_MODE_CONTINUOUS) { + if (planner.laser_inline.status.isPowered && planner.laser_inline.status.isEnabled) { + if (current_block->laser.trap_ramp_entry_incr > 0) { + current_block->laser.trap_ramp_active_pwr = current_block->laser.power; + cutter.apply_power(current_block->laser.power); + } + } + // Not a powered move. + else cutter.apply_power(0); + } + #endif } // The timer interval is just the nominal value for the nominal speed interval = ticks_nominal; } - - /** - * Adjust Laser Power - Cruise - * power - direct or floor adjusted active laser power. - */ - #if ENABLED(LASER_POWER_TRAP) - if (cutter.cutter_mode == CUTTER_MODE_CONTINUOUS) { - if (step_events_completed + 1 == accelerate_until) { - if (planner.laser_inline.status.isPowered && planner.laser_inline.status.isEnabled) { - if (current_block->laser.trap_ramp_entry_incr > 0) { - current_block->laser.trap_ramp_active_pwr = current_block->laser.power; - cutter.apply_power(current_block->laser.power); - } - } - // Not a powered move. - else cutter.apply_power(0); - } - } - #endif } #if ENABLED(LASER_FEATURE) From bdc14ddbd7860586af25a71abfd134f793b1954f Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Thu, 16 May 2024 18:18:41 -0700 Subject: [PATCH 03/13] =?UTF-8?q?=E2=8F=AA=EF=B8=8F=20Revert=20DELTA=20Z?= =?UTF-8?q?=20endstop=20homing=20patch=20(#27088)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Reverts #26297 f7a3172c20 --- Marlin/src/module/delta.cpp | 2 +- Marlin/src/module/motion.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Marlin/src/module/delta.cpp b/Marlin/src/module/delta.cpp index 18eff415a3..cfa134860b 100644 --- a/Marlin/src/module/delta.cpp +++ b/Marlin/src/module/delta.cpp @@ -242,7 +242,7 @@ void home_delta() { #endif // Move all carriages together linearly until an endstop is hit. - current_position.z = DIFF_TERN(USE_PROBE_FOR_Z_HOMING, delta_height + 10, probe.offset.z); + current_position.z = DIFF_TERN(HAS_BED_PROBE, delta_height + 10, probe.offset.z); line_to_current_position(homing_feedrate(Z_AXIS)); planner.synchronize(); TERN_(HAS_DELTA_SENSORLESS_PROBING, endstops.report_states()); diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index cb0c1bf5d8..26181d8396 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -892,7 +892,7 @@ void restore_feedrate_and_scaling() { #elif ENABLED(DELTA) soft_endstop.min[axis] = base_min_pos(axis); - soft_endstop.max[axis] = (axis == Z_AXIS) ? DIFF_TERN(USE_PROBE_FOR_Z_HOMING, delta_height, probe.offset.z) : base_home_pos(axis); + soft_endstop.max[axis] = (axis == Z_AXIS) ? DIFF_TERN(HAS_BED_PROBE, delta_height, probe.offset.z) : base_max_pos(axis); switch (axis) { case X_AXIS: @@ -2467,7 +2467,7 @@ void set_axis_is_at_home(const AxisEnum axis) { #if ANY(MORGAN_SCARA, AXEL_TPARA) scara_set_axis_is_at_home(axis); #elif ENABLED(DELTA) - current_position[axis] = (axis == Z_AXIS) ? DIFF_TERN(USE_PROBE_FOR_Z_HOMING, delta_height, probe.offset.z) : base_home_pos(axis); + current_position[axis] = (axis == Z_AXIS) ? DIFF_TERN(HAS_BED_PROBE, delta_height, probe.offset.z) : base_home_pos(axis); #else current_position[axis] = SUM_TERN(HAS_HOME_OFFSET, base_home_pos(axis), home_offset[axis]); #endif From ef0bd975cf13ca1f8c27ea720df4bf09f2c8692c Mon Sep 17 00:00:00 2001 From: jam-berg <114401197+jam-berg@users.noreply.github.com> Date: Fri, 17 May 2024 03:23:17 +0200 Subject: [PATCH 04/13] =?UTF-8?q?=F0=9F=A9=B9=20Fix=20Ender=202=20Pro=20EX?= =?UTF-8?q?P1-7=20pin=20(PB15=20/=20LCD=5FRS)=20(#27074)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/pins/hc32f4/pins_CREALITY_ENDER2P_V24S4.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/src/pins/hc32f4/pins_CREALITY_ENDER2P_V24S4.h b/Marlin/src/pins/hc32f4/pins_CREALITY_ENDER2P_V24S4.h index 3eed3951d2..1d142d87cc 100644 --- a/Marlin/src/pins/hc32f4/pins_CREALITY_ENDER2P_V24S4.h +++ b/Marlin/src/pins/hc32f4/pins_CREALITY_ENDER2P_V24S4.h @@ -188,7 +188,7 @@ * PC6 | 1 2 | PC7 * PA2 | 3 4 | PA3 * PB13 5 6 | PB14 - * N/C | 7 8 | PB12 + * PB15 | 7 8 | PB12 * GND | 9 10 | 5V * ------ * EXP1 @@ -199,7 +199,7 @@ #define EXP1_04_PIN PA3 #define EXP1_05_PIN PB13 #define EXP1_06_PIN PB14 -#define EXP1_07_PIN -1 +#define EXP1_07_PIN PB15 #define EXP1_08_PIN PB12 #if ENABLED(CR10_STOCKDISPLAY) // LCD used for C2 From 2fd7c2b8652a3250e1eb1dbfd96991b4b11f6257 Mon Sep 17 00:00:00 2001 From: Mihai <299015+mh-dm@users.noreply.github.com> Date: Fri, 17 May 2024 04:48:21 +0300 Subject: [PATCH 05/13] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20Fix=20motion=20smoot?= =?UTF-8?q?hness=20(#27013)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/module/planner.cpp | 40 +++++++++++++++----------- Marlin/src/module/planner.h | 4 +-- Marlin/src/module/stepper.cpp | 53 ++++++++++++++++++----------------- Marlin/src/module/stepper.h | 4 +-- 4 files changed, 55 insertions(+), 46 deletions(-) diff --git a/Marlin/src/module/planner.cpp b/Marlin/src/module/planner.cpp index 6b4f63fb00..8f11f4ec18 100644 --- a/Marlin/src/module/planner.cpp +++ b/Marlin/src/module/planner.cpp @@ -796,12 +796,17 @@ block_t* Planner::get_current_block() { */ void Planner::calculate_trapezoid_for_block(block_t * const block, const_float_t entry_factor, const_float_t exit_factor) { - uint32_t initial_rate = CEIL(block->nominal_rate * entry_factor), - final_rate = CEIL(block->nominal_rate * exit_factor); // (steps per second) + uint32_t initial_rate = LROUND(block->nominal_rate * entry_factor), + final_rate = LROUND(block->nominal_rate * exit_factor); // (steps per second) - // Limit minimal step rate (Otherwise the timer will overflow.) - NOLESS(initial_rate, uint32_t(MINIMAL_STEP_RATE)); + // Legacy check against supposed timer overflow. However Stepper::calc_timer_interval() already + // should protect against it. But removing this code produces judder in direction-switching + // moves. This is because the current discrete stepping math diverges from physical motion under + // constant acceleration when acceleration_steps_per_s2 is large compared to initial/final_rate. + NOLESS(initial_rate, uint32_t(MINIMAL_STEP_RATE)); // Enforce the minimum speed NOLESS(final_rate, uint32_t(MINIMAL_STEP_RATE)); + NOMORE(initial_rate, block->nominal_rate); // NOTE: The nominal rate may be less than MINIMAL_STEP_RATE! + NOMORE(final_rate, block->nominal_rate); #if ANY(S_CURVE_ACCELERATION, LIN_ADVANCE) // If we have some plateau time, the cruise rate will be the nominal rate @@ -809,9 +814,9 @@ void Planner::calculate_trapezoid_for_block(block_t * const block, const_float_t #endif // Steps for acceleration, plateau and deceleration - int32_t plateau_steps = block->step_event_count; - uint32_t accelerate_steps = 0, - decelerate_steps = 0; + int32_t plateau_steps = block->step_event_count, + accelerate_steps = 0, + decelerate_steps = 0; const int32_t accel = block->acceleration_steps_per_s2; float inverse_accel = 0.0f; @@ -820,10 +825,11 @@ void Planner::calculate_trapezoid_for_block(block_t * const block, const_float_t const float half_inverse_accel = 0.5f * inverse_accel, nominal_rate_sq = FLOAT_SQ(block->nominal_rate), // Steps required for acceleration, deceleration to/from nominal rate - decelerate_steps_float = half_inverse_accel * (nominal_rate_sq - FLOAT_SQ(final_rate)); - float accelerate_steps_float = half_inverse_accel * (nominal_rate_sq - FLOAT_SQ(initial_rate)); + decelerate_steps_float = half_inverse_accel * (nominal_rate_sq - FLOAT_SQ(final_rate)), + accelerate_steps_float = half_inverse_accel * (nominal_rate_sq - FLOAT_SQ(initial_rate)); + // Aims to fully reach nominal and final rates accelerate_steps = CEIL(accelerate_steps_float); - decelerate_steps = FLOOR(decelerate_steps_float); + decelerate_steps = CEIL(decelerate_steps_float); // Steps between acceleration and deceleration, if any plateau_steps -= accelerate_steps + decelerate_steps; @@ -833,13 +839,13 @@ void Planner::calculate_trapezoid_for_block(block_t * const block, const_float_t // Calculate accel / braking time in order to reach the final_rate exactly // at the end of this block. if (plateau_steps < 0) { - accelerate_steps_float = CEIL((block->step_event_count + accelerate_steps_float - decelerate_steps_float) * 0.5f); - accelerate_steps = _MIN(uint32_t(_MAX(accelerate_steps_float, 0)), block->step_event_count); + accelerate_steps = LROUND((block->step_event_count + accelerate_steps_float - decelerate_steps_float) * 0.5f); + LIMIT(accelerate_steps, 0, int32_t(block->step_event_count)); decelerate_steps = block->step_event_count - accelerate_steps; #if ANY(S_CURVE_ACCELERATION, LIN_ADVANCE) // We won't reach the cruising rate. Let's calculate the speed we will reach - cruise_rate = final_speed(initial_rate, accel, accelerate_steps); + NOMORE(cruise_rate, final_speed(initial_rate, accel, accelerate_steps)); #endif } } @@ -855,8 +861,8 @@ void Planner::calculate_trapezoid_for_block(block_t * const block, const_float_t #endif // Store new block parameters - block->accelerate_until = accelerate_steps; - block->decelerate_after = block->step_event_count - decelerate_steps; + block->accelerate_before = accelerate_steps; + block->decelerate_start = block->step_event_count - decelerate_steps; block->initial_rate = initial_rate; #if ENABLED(S_CURVE_ACCELERATION) block->acceleration_time = acceleration_time; @@ -3158,8 +3164,8 @@ bool Planner::buffer_line(const xyze_pos_t &cart, const_feedRate_t fr_mm_s block->step_event_count = num_steps; block->initial_rate = block->final_rate = block->nominal_rate = last_page_step_rate; // steps/s - block->accelerate_until = 0; - block->decelerate_after = block->step_event_count; + block->accelerate_before = 0; + block->decelerate_start = block->step_event_count; // Will be set to last direction later if directional format. block->direction_bits.reset(); diff --git a/Marlin/src/module/planner.h b/Marlin/src/module/planner.h index a06dd50e04..fd26b4340e 100644 --- a/Marlin/src/module/planner.h +++ b/Marlin/src/module/planner.h @@ -238,8 +238,8 @@ typedef struct PlannerBlock { #endif // Settings for the trapezoid generator - uint32_t accelerate_until, // The index of the step event on which to stop acceleration - decelerate_after; // The index of the step event on which to start decelerating + uint32_t accelerate_before, // The index of the step event where cruising starts + decelerate_start; // The index of the step event on which to start decelerating #if ENABLED(S_CURVE_ACCELERATION) uint32_t cruise_rate, // The actual cruise rate to use, between end of the acceleration phase and start of deceleration phase diff --git a/Marlin/src/module/stepper.cpp b/Marlin/src/module/stepper.cpp index 90254ff947..c2674480d5 100644 --- a/Marlin/src/module/stepper.cpp +++ b/Marlin/src/module/stepper.cpp @@ -58,10 +58,16 @@ * * time -----> * - * The trapezoid is the shape the speed curve over time. It starts at block->initial_rate, accelerates - * first block->accelerate_until step_events_completed, then keeps going at constant speed until - * step_events_completed reaches block->decelerate_after after which it decelerates until the trapezoid generator is reset. - * The slope of acceleration is calculated using v = u + at where t is the accumulated timer values of the steps so far. + * The speed over time graph forms a TRAPEZOID. The slope of acceleration is calculated by + * v = u + t + * where 't' is the accumulated timer values of the steps so far. + * + * The Stepper ISR dynamically executes acceleration, deceleration, and cruising according to the block parameters. + * - Start at block->initial_rate. + * - Accelerate while step_events_completed < block->accelerate_before. + * - Cruise while step_events_completed < block->decelerate_start. + * - Decelerate after that, until all steps are completed. + * - Reset the trapezoid generator. */ /** @@ -193,6 +199,7 @@ bool Stepper::abort_current_block; ; #endif +// In timer_ticks uint32_t Stepper::acceleration_time, Stepper::deceleration_time; #if MULTISTEPPING_LIMIT > 1 @@ -224,8 +231,8 @@ xyze_long_t Stepper::delta_error{0}; xyze_long_t Stepper::advance_dividend{0}; uint32_t Stepper::advance_divisor = 0, Stepper::step_events_completed = 0, // The number of step events executed in the current block - Stepper::accelerate_until, // The count at which to stop accelerating - Stepper::decelerate_after, // The count at which to start decelerating + Stepper::accelerate_before, // The count at which to start cruising + Stepper::decelerate_start, // The count at which to start decelerating Stepper::step_event_count; // The total event count for the current block #if ANY(HAS_MULTI_EXTRUDER, MIXING_EXTRUDER) @@ -2403,7 +2410,7 @@ hal_timer_t Stepper::block_phase_isr() { // Step events not completed yet... // Are we in acceleration phase ? - if (step_events_completed <= accelerate_until) { // Calculate new timer value + if (step_events_completed < accelerate_before) { // Calculate new timer value #if ENABLED(S_CURVE_ACCELERATION) // Get the next speed to use (Jerk limited!) @@ -2420,6 +2427,7 @@ hal_timer_t Stepper::block_phase_isr() { // step_rate to timer interval and steps per stepper isr interval = calc_multistep_timer_interval(acc_step_rate << oversampling_factor); acceleration_time += interval; + deceleration_time = 0; // Reset since we're doing acceleration first. #if ENABLED(NONLINEAR_EXTRUSION) calc_nonlinear_e(acc_step_rate << oversampling_factor); @@ -2456,30 +2464,24 @@ hal_timer_t Stepper::block_phase_isr() { #endif } // Are we in Deceleration phase ? - else if (step_events_completed > decelerate_after) { + else if (step_events_completed >= decelerate_start) { uint32_t step_rate; #if ENABLED(S_CURVE_ACCELERATION) - // If this is the 1st time we process the 2nd half of the trapezoid... if (!bezier_2nd_half) { // Initialize the Bézier speed curve _calc_bezier_curve_coeffs(current_block->cruise_rate, current_block->final_rate, current_block->deceleration_time_inverse); bezier_2nd_half = true; - // The first point starts at cruise rate. Just save evaluation of the Bézier curve - step_rate = current_block->cruise_rate; } - else { - // Calculate the next speed to use - step_rate = deceleration_time < current_block->deceleration_time - ? _eval_bezier_curve(deceleration_time) - : current_block->final_rate; - } - + // Calculate the next speed to use + step_rate = deceleration_time < current_block->deceleration_time + ? _eval_bezier_curve(deceleration_time) + : current_block->final_rate; #else // Using the old trapezoidal control step_rate = STEP_MULTIPLY(deceleration_time, current_block->acceleration_rate); - if (step_rate < acc_step_rate) { // Still decelerating? + if (step_rate < acc_step_rate) { step_rate = acc_step_rate - step_rate; NOLESS(step_rate, current_block->final_rate); } @@ -2542,6 +2544,9 @@ hal_timer_t Stepper::block_phase_isr() { if (ticks_nominal == 0) { // step_rate to timer interval and loops for the nominal speed ticks_nominal = calc_multistep_timer_interval(current_block->nominal_rate << oversampling_factor); + // Prepare for deceleration + IF_DISABLED(S_CURVE_ACCELERATION, acc_step_rate = current_block->nominal_rate); + deceleration_time = ticks_nominal / 2; #if ENABLED(NONLINEAR_EXTRUSION) calc_nonlinear_e(current_block->nominal_rate << oversampling_factor); @@ -2664,9 +2669,6 @@ hal_timer_t Stepper::block_phase_isr() { // Set flags for all moving axes, accounting for kinematics set_axis_moved_for_current_block(); - // No acceleration / deceleration time elapsed so far - acceleration_time = deceleration_time = 0; - #if ENABLED(ADAPTIVE_STEP_SMOOTHING) // Nonlinear Extrusion needs at least 2x oversampling to permit increase of E step rate // Otherwise assume no axis smoothing (via oversampling) @@ -2720,8 +2722,8 @@ hal_timer_t Stepper::block_phase_isr() { step_events_completed = 0; // Compute the acceleration and deceleration points - accelerate_until = current_block->accelerate_until << oversampling_factor; - decelerate_after = current_block->decelerate_after << oversampling_factor; + accelerate_before = current_block->accelerate_before << oversampling_factor; + decelerate_start = current_block->decelerate_start << oversampling_factor; TERN_(MIXING_EXTRUDER, mixer.stepper_setup(current_block->b_color)); @@ -2807,7 +2809,8 @@ hal_timer_t Stepper::block_phase_isr() { // Calculate the initial timer interval interval = calc_multistep_timer_interval(current_block->initial_rate << oversampling_factor); - acceleration_time += interval; + // Initialize ac/deceleration time as if half the time passed. + acceleration_time = deceleration_time = interval / 2; #if ENABLED(NONLINEAR_EXTRUSION) calc_nonlinear_e(current_block->initial_rate << oversampling_factor); diff --git a/Marlin/src/module/stepper.h b/Marlin/src/module/stepper.h index 43d1012f10..82b41290bf 100644 --- a/Marlin/src/module/stepper.h +++ b/Marlin/src/module/stepper.h @@ -391,8 +391,8 @@ class Stepper { static xyze_long_t advance_dividend; static uint32_t advance_divisor, step_events_completed, // The number of step events executed in the current block - accelerate_until, // The point from where we need to stop acceleration - decelerate_after, // The point from where we need to start decelerating + accelerate_before, // The count at which to start cruising + decelerate_start, // The count at which to start decelerating step_event_count; // The total event count for the current block #if ANY(HAS_MULTI_EXTRUDER, MIXING_EXTRUDER) From fa88e0f054e0e4b71b3319161131582678e6d08a Mon Sep 17 00:00:00 2001 From: ellensp <530024+ellensp@users.noreply.github.com> Date: Sat, 18 May 2024 09:04:36 +1200 Subject: [PATCH 06/13] =?UTF-8?q?=F0=9F=94=A8=20Windows=20Simulator=20need?= =?UTF-8?q?s=20-DGLM=5FENABLE=5FEXPERIMENTAL=20(#27092)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ini/native.ini | 1 + 1 file changed, 1 insertion(+) diff --git a/ini/native.ini b/ini/native.ini index bbb6724dae..3da0237c0f 100644 --- a/ini/native.ini +++ b/ini/native.ini @@ -153,4 +153,5 @@ build_src_flags = ${simulator_common.build_src_flags} -fpermissive build_flags = ${simulator_common.build_flags} ${simulator_common.debug_build_flags} -IC:\\msys64\\mingw64\\include\\SDL2 -fno-stack-protector -Wl,-subsystem,windows -ldl -lmingw32 -lSDL2main -lSDL2 -lSDL2_net -lopengl32 -lssp + -DGLM_ENABLE_EXPERIMENTAL build_type = debug From 4f3ebea3a6e7eb0998cf5afb610dee8e39f61583 Mon Sep 17 00:00:00 2001 From: Vovodroid Date: Sat, 18 May 2024 00:47:44 +0300 Subject: [PATCH 07/13] =?UTF-8?q?=F0=9F=90=9B=20Fix=20FT=5FMOTION=20block?= =?UTF-8?q?=20reference=20(#27063)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/module/ft_motion.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/src/module/ft_motion.cpp b/Marlin/src/module/ft_motion.cpp index f92caa7d72..e73c75b9c5 100644 --- a/Marlin/src/module/ft_motion.cpp +++ b/Marlin/src/module/ft_motion.cpp @@ -762,7 +762,7 @@ void FTMotion::convertToSteps(const uint32_t idx) { #if ENABLED(STEPS_ROUNDING) #define TOSTEPS(A,B) int32_t(trajMod.A[idx] * planner.settings.axis_steps_per_mm[B] + (trajMod.A[idx] < 0.0f ? -0.5f : 0.5f)) const xyze_long_t steps_tar = LOGICAL_AXIS_ARRAY( - TOSTEPS(e, E_AXIS_N(current_block->extruder)), // May be eliminated if guaranteed positive. + TOSTEPS(e, E_AXIS_N(stepper.current_block->extruder)), // May be eliminated if guaranteed positive. TOSTEPS(x, X_AXIS), TOSTEPS(y, Y_AXIS), TOSTEPS(z, Z_AXIS), TOSTEPS(i, I_AXIS), TOSTEPS(j, J_AXIS), TOSTEPS(k, K_AXIS), TOSTEPS(u, U_AXIS), TOSTEPS(v, V_AXIS), TOSTEPS(w, W_AXIS) @@ -771,7 +771,7 @@ void FTMotion::convertToSteps(const uint32_t idx) { #else #define TOSTEPS(A,B) int32_t(trajMod.A[idx] * planner.settings.axis_steps_per_mm[B]) - steps.A xyze_long_t delta = LOGICAL_AXIS_ARRAY( - TOSTEPS(e, E_AXIS_N(current_block->extruder)), + TOSTEPS(e, E_AXIS_N(stepper.current_block->extruder)), TOSTEPS(x, X_AXIS), TOSTEPS(y, Y_AXIS), TOSTEPS(z, Z_AXIS), TOSTEPS(i, I_AXIS), TOSTEPS(j, J_AXIS), TOSTEPS(k, K_AXIS), TOSTEPS(u, U_AXIS), TOSTEPS(v, V_AXIS), TOSTEPS(w, W_AXIS) From 06762db050399137796bbd192b94ed9da4a77e11 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Sat, 18 May 2024 00:22:00 +0000 Subject: [PATCH 08/13] [cron] Bump distribution date (2024-05-18) --- Marlin/Version.h | 2 +- Marlin/src/inc/Version.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/Version.h b/Marlin/Version.h index 31a7e39517..55664693f4 100644 --- a/Marlin/Version.h +++ b/Marlin/Version.h @@ -41,7 +41,7 @@ * here we define this default string as the date where the latest release * version was tagged. */ -//#define STRING_DISTRIBUTION_DATE "2024-05-17" +//#define STRING_DISTRIBUTION_DATE "2024-05-18" /** * Defines a generic printer name to be output to the LCD after booting Marlin. diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index dc206cb9a7..523ce48cca 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2024-05-17" + #define STRING_DISTRIBUTION_DATE "2024-05-18" #endif /** From a7317de3b43f4332d79c1efa45e6fc361c553acd Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 19 May 2024 14:08:41 -0500 Subject: [PATCH 09/13] =?UTF-8?q?=F0=9F=94=A8=20Sim=20needs=20GLM=5FENABLE?= =?UTF-8?q?=5FEXPERIMENTAL?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ini/native.ini | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ini/native.ini b/ini/native.ini index 3da0237c0f..28c558d39f 100644 --- a/ini/native.ini +++ b/ini/native.ini @@ -49,8 +49,9 @@ build_flags = ${env:linux_native.build_flags} -Werror [simulator_common] platform = native framework = -build_flags = ${common.build_flags} -std=gnu++17 -D__PLAT_NATIVE_SIM__ -DU8G_HAL_LINKS +build_flags = ${common.build_flags} -std=gnu++17 -I/usr/include/SDL2 -IMarlin -IMarlin/src/HAL/NATIVE_SIM/u8g + -D__PLAT_NATIVE_SIM__ -DU8G_HAL_LINKS -DGLM_ENABLE_EXPERIMENTAL build_src_flags = -Wall -Wno-expansion-to-defined -Wno-deprecated-declarations -Wcast-align release_flags = -g0 -O3 -flto debug_build_flags = -fstack-protector-strong -g -g3 -ggdb @@ -153,5 +154,4 @@ build_src_flags = ${simulator_common.build_src_flags} -fpermissive build_flags = ${simulator_common.build_flags} ${simulator_common.debug_build_flags} -IC:\\msys64\\mingw64\\include\\SDL2 -fno-stack-protector -Wl,-subsystem,windows -ldl -lmingw32 -lSDL2main -lSDL2 -lSDL2_net -lopengl32 -lssp - -DGLM_ENABLE_EXPERIMENTAL build_type = debug From a97d1088f0042c2d9caab8528e1a80ea43274f34 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 19 May 2024 18:42:07 -0500 Subject: [PATCH 10/13] =?UTF-8?q?=F0=9F=94=A7=20Ensure=20distinct=20langua?= =?UTF-8?q?ges=20(#27107)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/inc/MarlinConfig.h | 7 +++++-- Marlin/src/inc/SanityCheck.h | 22 ++++++++++++++++++++++ 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/Marlin/src/inc/MarlinConfig.h b/Marlin/src/inc/MarlinConfig.h index 4058761b9f..807082d839 100644 --- a/Marlin/src/inc/MarlinConfig.h +++ b/Marlin/src/inc/MarlinConfig.h @@ -52,8 +52,6 @@ #include HAL_PATH(.., inc/Conditionals_type.h) #include "Changes.h" - #include "SanityCheck.h" - #include HAL_PATH(.., inc/SanityCheck.h) // Include all core headers #include "../core/language.h" @@ -65,3 +63,8 @@ #endif #include "../core/multi_language.h" + +#ifndef __MARLIN_DEPS__ + #include "SanityCheck.h" + #include HAL_PATH(.., inc/SanityCheck.h) +#endif diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 339cd4087c..2e935c4f4b 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -2703,6 +2703,28 @@ static_assert(NUM_SERVOS <= NUM_SERVO_PLUGS, "NUM_SERVOS (or some servo index) i #undef IS_U8GLIB_SSD1306 #undef IS_EXTUI +/** + * Make sure LCD language settings are distinct + */ +#if NUM_LANGUAGES > 1 + static_assert(strcmp(STRINGIFY(LCD_LANGUAGE_2), STRINGIFY(LCD_LANGUAGE)), "Error: LCD_LANGUAGE_2 (" STRINGIFY(LCD_LANGUAGE) ") cannot be the same as LCD_LANGUAGE."); +#endif +#if NUM_LANGUAGES > 2 + static_assert(strcmp(STRINGIFY(LCD_LANGUAGE_3), STRINGIFY(LCD_LANGUAGE)), "Error: LCD_LANGUAGE_3 (" STRINGIFY(LCD_LANGUAGE) ") cannot be the same as LCD_LANGUAGE."); + static_assert(strcmp(STRINGIFY(LCD_LANGUAGE_3), STRINGIFY(LCD_LANGUAGE_2)), "Error: LCD_LANGUAGE_3 (" STRINGIFY(LCD_LANGUAGE) ") cannot be the same as LCD_LANGUAGE_2."); +#endif +#if NUM_LANGUAGES > 3 + static_assert(strcmp(STRINGIFY(LCD_LANGUAGE_4), STRINGIFY(LCD_LANGUAGE)), "Error: LCD_LANGUAGE_4 (" STRINGIFY(LCD_LANGUAGE) ") cannot be the same as LCD_LANGUAGE."); + static_assert(strcmp(STRINGIFY(LCD_LANGUAGE_4), STRINGIFY(LCD_LANGUAGE_2)), "Error: LCD_LANGUAGE_4 (" STRINGIFY(LCD_LANGUAGE) ") cannot be the same as LCD_LANGUAGE_2."); + static_assert(strcmp(STRINGIFY(LCD_LANGUAGE_4), STRINGIFY(LCD_LANGUAGE_3)), "Error: LCD_LANGUAGE_4 (" STRINGIFY(LCD_LANGUAGE) ") cannot be the same as LCD_LANGUAGE_3."); +#endif +#if NUM_LANGUAGES > 4 + static_assert(strcmp(STRINGIFY(LCD_LANGUAGE_5), STRINGIFY(LCD_LANGUAGE)), "Error: LCD_LANGUAGE_5 (" STRINGIFY(LCD_LANGUAGE) ") cannot be the same as LCD_LANGUAGE."); + static_assert(strcmp(STRINGIFY(LCD_LANGUAGE_5), STRINGIFY(LCD_LANGUAGE_2)), "Error: LCD_LANGUAGE_5 (" STRINGIFY(LCD_LANGUAGE) ") cannot be the same as LCD_LANGUAGE_2."); + static_assert(strcmp(STRINGIFY(LCD_LANGUAGE_5), STRINGIFY(LCD_LANGUAGE_3)), "Error: LCD_LANGUAGE_5 (" STRINGIFY(LCD_LANGUAGE) ") cannot be the same as LCD_LANGUAGE_3."); + static_assert(strcmp(STRINGIFY(LCD_LANGUAGE_5), STRINGIFY(LCD_LANGUAGE_4)), "Error: LCD_LANGUAGE_5 (" STRINGIFY(LCD_LANGUAGE) ") cannot be the same as LCD_LANGUAGE_4."); +#endif + #if ANY(TFT_GENERIC, MKS_TS35_V2_0, MKS_ROBIN_TFT24, MKS_ROBIN_TFT28, MKS_ROBIN_TFT32, MKS_ROBIN_TFT35, MKS_ROBIN_TFT43, MKS_ROBIN_TFT_V1_1R, \ TFT_TRONXY_X5SA, ANYCUBIC_TFT35, ANYCUBIC_TFT35, LONGER_LK_TFT28, ANET_ET4_TFT28, ANET_ET5_TFT35, BIQU_BX_TFT70, BTT_TFT35_SPI_V1_0) #if NONE(TFT_COLOR_UI, TFT_CLASSIC_UI, TFT_LVGL_UI) From eec1aec071df9ef2a78d577d0f6b4ed76cb6c6ff Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 19 May 2024 18:43:04 -0500 Subject: [PATCH 11/13] =?UTF-8?q?=F0=9F=90=9B=20Fix=20multi-byte=20menu=20?= =?UTF-8?q?string=20buffer=20overrun=20(#27100)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/lcd/lcdprint.cpp | 2 +- Marlin/src/module/motion.cpp | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/Marlin/src/lcd/lcdprint.cpp b/Marlin/src/lcd/lcdprint.cpp index ea833f53a1..475664f45a 100644 --- a/Marlin/src/lcd/lcdprint.cpp +++ b/Marlin/src/lcd/lcdprint.cpp @@ -114,7 +114,7 @@ lcd_uint_t expand_u8str_P(char * const outstr, PGM_P const ptpl, const int8_t in * Return the number of characters emitted */ lcd_uint_t lcd_put_u8str_P(PGM_P const ptpl, const int8_t ind, const char *cstr/*=nullptr*/, FSTR_P const fstr/*=nullptr*/, const lcd_uint_t maxlen/*=LCD_WIDTH*/) { - char estr[maxlen + 2]; + char estr[maxlen * LANG_CHARSIZE + 2]; const lcd_uint_t outlen = expand_u8str_P(estr, ptpl, ind, cstr, fstr, maxlen); lcd_put_u8str_max(estr, maxlen * (MENU_FONT_WIDTH)); return outlen; diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index 26181d8396..473d54cc38 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -1637,8 +1637,7 @@ void prepare_line_to_destination() { SERIAL_ECHO_START(); msg.echoln(); - msg.setf(GET_TEXT_F(MSG_HOME_FIRST), need); - ui.set_status(msg); + ui.status_printf(0, GET_TEXT_F(MSG_HOME_FIRST), need); return true; } From feca9a33d5c9a06aa3c0b878acfbb8a552b70c1b Mon Sep 17 00:00:00 2001 From: ellensp <530024+ellensp@users.noreply.github.com> Date: Mon, 20 May 2024 11:51:52 +1200 Subject: [PATCH 12/13] =?UTF-8?q?=E2=9C=A8=20SHOW=5FCUSTOM=5FBOOTSCREEN=20?= =?UTF-8?q?for=20HD44780=20(#26793)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Scott Lahteine --- Marlin/Configuration_adv.h | 2 +- Marlin/src/inc/SanityCheck.h | 4 +- Marlin/src/lcd/HD44780/marlinui_HD44780.cpp | 69 ++++++++++++++++++--- Marlin/src/lcd/HD44780/marlinui_HD44780.h | 14 +++++ Marlin/src/lcd/marlinui.h | 3 +- 5 files changed, 78 insertions(+), 14 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index f0066338c1..5f5f07d19e 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1584,7 +1584,7 @@ #if HAS_MARLINUI_U8GLIB //#define BOOT_MARLIN_LOGO_ANIMATED // Animated Marlin logo. Costs ~3260 (or ~940) bytes of flash. #endif - #if ANY(HAS_MARLINUI_U8GLIB, TOUCH_UI_FTDI_EVE) + #if ANY(HAS_MARLINUI_U8GLIB, TOUCH_UI_FTDI_EVE, HAS_MARLINUI_HD44780) //#define SHOW_CUSTOM_BOOTSCREEN // Show the bitmap in Marlin/_Bootscreen.h on startup. #endif #endif diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 2e935c4f4b..665a7306f8 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -388,8 +388,8 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L /** * Custom Boot and Status screens */ -#if ENABLED(SHOW_CUSTOM_BOOTSCREEN) && NONE(HAS_MARLINUI_U8GLIB, TOUCH_UI_FTDI_EVE, IS_DWIN_MARLINUI) - #error "SHOW_CUSTOM_BOOTSCREEN requires Graphical LCD or TOUCH_UI_FTDI_EVE." +#if ENABLED(SHOW_CUSTOM_BOOTSCREEN) && NONE(HAS_MARLINUI_HD44780, HAS_MARLINUI_U8GLIB, TOUCH_UI_FTDI_EVE, IS_DWIN_MARLINUI) + #error "SHOW_CUSTOM_BOOTSCREEN requires Character LCD, Graphical LCD, or TOUCH_UI_FTDI_EVE." #elif ENABLED(SHOW_CUSTOM_BOOTSCREEN) && DISABLED(SHOW_BOOTSCREEN) #error "SHOW_CUSTOM_BOOTSCREEN requires SHOW_BOOTSCREEN." #elif ENABLED(CUSTOM_STATUS_SCREEN_IMAGE) && !HAS_MARLINUI_U8GLIB diff --git a/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp b/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp index 0ab045bda3..686d0972b9 100644 --- a/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp +++ b/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp @@ -331,15 +331,24 @@ void MarlinUI::set_custom_characters(const HD44780CharSet screen_charset/*=CHARS #endif // HAS_MEDIA - #if ENABLED(SHOW_BOOTSCREEN) - // Set boot screen corner characters - if (screen_charset == CHARSET_BOOT) { - for (uint8_t i = 4; i--;) - createChar_P(i, corner[i]); - } - else - #endif - { // Info Screen uses 5 special characters + switch (screen_charset) { + + #if ENABLED(SHOW_BOOTSCREEN) + case CHARSET_BOOT: { + // Set boot screen corner characters + for (uint8_t i = 4; i--;) createChar_P(i, corner[i]); + } break; + #endif + + #if ENABLED(SHOW_CUSTOM_BOOTSCREEN) + case CHARSET_BOOT_CUSTOM: { + for (uint8_t i = COUNT(customBootChars); i--;) + createChar_P(i, customBootChars[i]); + } break; + #endif + + default: { + // Info Screen uses 5 special characters createChar_P(LCD_STR_BEDTEMP[0], bedTemp); createChar_P(LCD_STR_DEGREE[0], degree); createChar_P(LCD_STR_THERMOMETER[0], thermometer); @@ -361,7 +370,9 @@ void MarlinUI::set_custom_characters(const HD44780CharSet screen_charset/*=CHARS createChar_P(LCD_STR_FOLDER[0], folder); #endif } - } + } break; + + } } @@ -400,6 +411,42 @@ bool MarlinUI::detected() { return TERN1(DETECT_I2C_LCD_DEVICE, lcd.LcdDetected() == 1); } +#if ENABLED(SHOW_CUSTOM_BOOTSCREEN) + + #ifndef CUSTOM_BOOTSCREEN_X + #define CUSTOM_BOOTSCREEN_X -1 + #endif + #ifndef CUSTOM_BOOTSCREEN_Y + #define CUSTOM_BOOTSCREEN_Y ((LCD_HEIGHT - COUNT(custom_boot_lines)) / 2) + #endif + #ifndef CUSTOM_BOOTSCREEN_TIMEOUT + #define CUSTOM_BOOTSCREEN_TIMEOUT 2500 + #endif + + void MarlinUI::draw_custom_bootscreen(const uint8_t/*=0*/) { + set_custom_characters(CHARSET_BOOT_CUSTOM); + lcd.clear(); + const int8_t sx = CUSTOM_BOOTSCREEN_X; + const uint8_t sy = CUSTOM_BOOTSCREEN_Y; + for (lcd_uint_t i = 0; i < COUNT(custom_boot_lines); ++i) { + PGM_P const pstr = (PGM_P)pgm_read_ptr(&custom_boot_lines[i]); + const uint8_t clen = utf8_strlen_P(pstr); + const lcd_uint_t x = sx >= 0 ? sx : (LCD_WIDTH - clen) / 2; + for (lcd_uint_t j = 0; j < clen; ++j) { + const lchar_t c = pgm_read_byte(&pstr[j]); + lcd_put_lchar(x + j, sy + i, c == '\x08' ? '\x00' : c); + } + } + } + + // Shows the custom bootscreen and delays + void MarlinUI::show_custom_bootscreen() { + draw_custom_bootscreen(); + safe_delay(CUSTOM_BOOTSCREEN_TIMEOUT); + } + +#endif // SHOW_CUSTOM_BOOTSCREEN + #if HAS_SLOW_BUTTONS uint8_t MarlinUI::read_slow_buttons() { #if ENABLED(LCD_I2C_TYPE_MCP23017) @@ -466,6 +513,8 @@ void MarlinUI::clear_lcd() { lcd.clear(); } } void MarlinUI::show_bootscreen() { + TERN_(SHOW_CUSTOM_BOOTSCREEN, show_custom_bootscreen()); + set_custom_characters(CHARSET_BOOT); lcd.clear(); diff --git a/Marlin/src/lcd/HD44780/marlinui_HD44780.h b/Marlin/src/lcd/HD44780/marlinui_HD44780.h index 6f6f5a6855..15f268f8d9 100644 --- a/Marlin/src/lcd/HD44780/marlinui_HD44780.h +++ b/Marlin/src/lcd/HD44780/marlinui_HD44780.h @@ -27,6 +27,20 @@ #include "../../inc/MarlinConfig.h" +#if ENABLED(SHOW_CUSTOM_BOOTSCREEN) + + #include "../../../_Bootscreen.h" + + #ifdef CUSTOM_BOOTSCREEN_Y + #define CUSTOM_BOOT_LAST COUNT(custom_boot_lines) + CUSTOM_BOOTSCREEN_Y + #else + #define CUSTOM_BOOT_LAST COUNT(custom_boot_lines) + #endif + + static_assert(CUSTOM_BOOT_LAST <= LCD_HEIGHT, "custom_boot_lines (plus CUSTOM_BOOTSCREEN_Y) doesn't fit on the selected LCD."); + +#endif + #if ENABLED(LCD_I2C_TYPE_PCF8575) // NOTE: These are register-mapped pins on the PCF8575 controller, not Arduino pins. diff --git a/Marlin/src/lcd/marlinui.h b/Marlin/src/lcd/marlinui.h index ad4be03900..53300a4400 100644 --- a/Marlin/src/lcd/marlinui.h +++ b/Marlin/src/lcd/marlinui.h @@ -105,7 +105,8 @@ typedef bool (*statusResetFunc_t)(); enum HD44780CharSet : uint8_t { CHARSET_MENU, CHARSET_INFO, - CHARSET_BOOT + CHARSET_BOOT, + CHARSET_BOOT_CUSTOM }; #endif From 0e2bd069d4e0ae3cfcc5a15ec86c865d4eeef21c Mon Sep 17 00:00:00 2001 From: Dave Gateman Date: Sun, 19 May 2024 17:53:38 -0600 Subject: [PATCH 13/13] =?UTF-8?q?=F0=9F=A9=B9=20Fix=20cutter=20power=20ext?= =?UTF-8?q?ra=20'%'=20(#27105)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/lcd/HD44780/marlinui_HD44780.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp b/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp index 686d0972b9..ea73243250 100644 --- a/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp +++ b/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp @@ -709,9 +709,6 @@ FORCE_INLINE void _draw_bed_status(const bool blink) { lcd_put_u8str(F("K")); #else lcd_put_u8str(cutter_power2str(cutter.unitPower)); - #if CUTTER_UNIT_IS(PERCENT) - lcd_put_u8str(F("%")); - #endif #endif lcd_put_u8str(F(" "));