From 3cd945ab5dd9d4adcb2a130328f700f3f553ff4e Mon Sep 17 00:00:00 2001
From: thinkyhead
Date: Tue, 20 May 2025 00:32:44 +0000
Subject: [PATCH 001/326] [cron] Bump distribution date (2025-05-20)
---
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 1deb2d2109..61232e769a 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 "2025-05-19"
+//#define STRING_DISTRIBUTION_DATE "2025-05-20"
/**
* The protocol for communication to the host. Protocol indicates communication
diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h
index 8c62809731..8f8c30dbfa 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 "2025-05-19"
+ #define STRING_DISTRIBUTION_DATE "2025-05-20"
#endif
/**
From af553d5fbd1e4217d38f5e0f629682d79570e438 Mon Sep 17 00:00:00 2001
From: Scott Lahteine
Date: Mon, 19 May 2025 19:36:20 -0500
Subject: [PATCH 002/326] =?UTF-8?q?=F0=9F=94=A8=20Solve=20a=20linker=20err?=
=?UTF-8?q?or?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Fixes #27864
---
Marlin/src/lcd/marlinui.cpp | 11 ++++++-----
Marlin/src/lcd/marlinui.h | 6 +++++-
2 files changed, 11 insertions(+), 6 deletions(-)
diff --git a/Marlin/src/lcd/marlinui.cpp b/Marlin/src/lcd/marlinui.cpp
index 991a4f549c..ab932adfcd 100644
--- a/Marlin/src/lcd/marlinui.cpp
+++ b/Marlin/src/lcd/marlinui.cpp
@@ -62,6 +62,10 @@ MarlinUI ui;
#include "../module/printcounter.h"
#endif
+#if HAS_WIRED_LCD || HAS_PREHEAT
+ #include "../module/temperature.h"
+#endif
+
#if LCD_HAS_WAIT_FOR_MOVE
bool MarlinUI::wait_for_move; // = false
#endif
@@ -136,8 +140,6 @@ constexpr uint8_t epps = ENCODER_PULSES_PER_STEP;
#endif
#if HAS_PREHEAT
- #include "../module/temperature.h"
-
preheat_t MarlinUI::material_preset[PREHEAT_COUNT]; // Initialized by settings.load
void MarlinUI::reset_material_presets() {
@@ -331,7 +333,6 @@ void MarlinUI::init() {
#include "lcdprint.h"
- #include "../module/temperature.h"
#include "../module/planner.h"
#include "../module/motion.h"
@@ -1883,7 +1884,7 @@ uint8_t expand_u8str_P(char * const outstr, PGM_P const ptpl, const int8_t ind,
);
}
- #if LCD_WITH_BLINK && HAS_EXTRA_PROGRESS
+ #if HAS_ROTATE_PROGRESS
// Renew and redraw all enabled progress strings
void MarlinUI::rotate_progress() {
@@ -1903,7 +1904,7 @@ uint8_t expand_u8str_P(char * const outstr, PGM_P const ptpl, const int8_t ind,
}
}
- #endif // LCD_WITH_BLINK && HAS_EXTRA_PROGRESS
+ #endif // HAS_ROTATE_PROGRESS
#endif // HAS_PRINT_PROGRESS
diff --git a/Marlin/src/lcd/marlinui.h b/Marlin/src/lcd/marlinui.h
index 578d143d96..adfecdbaf5 100644
--- a/Marlin/src/lcd/marlinui.h
+++ b/Marlin/src/lcd/marlinui.h
@@ -95,6 +95,10 @@ typedef bool (*statusResetFunc_t)();
#define LCD_UPDATE_INTERVAL DIV_TERN(DOUBLE_LCD_FRAMERATE, TERN(HAS_TOUCH_BUTTONS, 50, 100), 2)
#endif
+#if LCD_WITH_BLINK && HAS_EXTRA_PROGRESS && !IS_DWIN_MARLINUI
+ #define HAS_ROTATE_PROGRESS 1
+#endif
+
#if HAS_MARLINUI_U8GLIB
enum MarlinFont : uint8_t {
FONT_STATUSMENU = 1,
@@ -347,7 +351,7 @@ public:
FORCE_INLINE static uint16_t get_progress_permyriad() { return _get_progress(); }
#endif
static uint8_t get_progress_percent() { return uint8_t(_get_progress() / (PROGRESS_SCALE)); }
- #if LCD_WITH_BLINK && HAS_EXTRA_PROGRESS
+ #if HAS_ROTATE_PROGRESS
#if ENABLED(SHOW_PROGRESS_PERCENT)
static void drawPercent();
#endif
From d5723fcafd200a55fcc1fc1c37aab39da7fde12d Mon Sep 17 00:00:00 2001
From: Vovodroid
Date: Tue, 20 May 2025 22:52:51 +0300
Subject: [PATCH 003/326] =?UTF-8?q?=F0=9F=94=A7=20Allow=20SMOOTH=5FLIN=5FA?=
=?UTF-8?q?DVANCE=20+=20NONLINEAR=5FEXTRUSION=20(#27861)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
Marlin/src/HAL/GD32_MFL/timers.h | 6 +-
Marlin/src/gcode/feature/nonlinear/M592.cpp | 6 ++
Marlin/src/inc/SanityCheck.h | 2 -
Marlin/src/module/planner.cpp | 4 ++
Marlin/src/module/planner.h | 4 +-
Marlin/src/module/stepper.cpp | 73 ++++++++++++---------
Marlin/src/module/stepper.h | 25 +++++--
README-PT-BR.md | 2 +-
8 files changed, 74 insertions(+), 48 deletions(-)
diff --git a/Marlin/src/HAL/GD32_MFL/timers.h b/Marlin/src/HAL/GD32_MFL/timers.h
index 49d005b8cd..a5d36d9eca 100644
--- a/Marlin/src/HAL/GD32_MFL/timers.h
+++ b/Marlin/src/HAL/GD32_MFL/timers.h
@@ -44,9 +44,9 @@
extern uint32_t GetStepperTimerClkFreq();
// Timer prescaler calculations
-#define STEPPER_TIMER_PRESCALE (GetStepperTimerClkFreq() / STEPPER_TIMER_RATE) // Prescaler = 30
+#define STEPPER_TIMER_PRESCALE (GetStepperTimerClkFreq() / STEPPER_TIMER_RATE) // Prescaler = 30
#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE
-#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // Stepper timer ticks per µs
+#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // Stepper timer ticks per µs
#define PULSE_TIMER_RATE STEPPER_TIMER_RATE
#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US
@@ -57,7 +57,7 @@ extern uint32_t GetStepperTimerClkFreq();
#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_STEP)
#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_STEP)
#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(MF_TIMER_STEP)
-#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_TEMP)
+#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_TEMP)
#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_TEMP)
extern void Step_Handler();
diff --git a/Marlin/src/gcode/feature/nonlinear/M592.cpp b/Marlin/src/gcode/feature/nonlinear/M592.cpp
index 77a6258ddc..78c15443f8 100644
--- a/Marlin/src/gcode/feature/nonlinear/M592.cpp
+++ b/Marlin/src/gcode/feature/nonlinear/M592.cpp
@@ -49,6 +49,12 @@ void GcodeSuite::M592() {
if (parser.seenval('A')) stepper.ne.A = parser.value_float();
if (parser.seenval('B')) stepper.ne.B = parser.value_float();
if (parser.seenval('C')) stepper.ne.C = parser.value_float();
+
+ #if ENABLED(SMOOTH_LIN_ADVANCE)
+ stepper.ne_q30.A = _BV32(30) * (stepper.ne.A * planner.mm_per_step[E_AXIS_N(0)] * planner.mm_per_step[E_AXIS_N(0)]);
+ stepper.ne_q30.B = _BV32(30) * (stepper.ne.B * planner.mm_per_step[E_AXIS_N(0)]);
+ stepper.ne_q30.C = _BV32(30) * stepper.ne.C;
+ #endif
}
#endif // NONLINEAR_EXTRUSION
diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h
index 97cc2ed198..c70c5ce0ec 100644
--- a/Marlin/src/inc/SanityCheck.h
+++ b/Marlin/src/inc/SanityCheck.h
@@ -868,8 +868,6 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L
#error "SMOOTH_LIN_ADVANCE requires a 32-bit CPU."
#elif ENABLED(S_CURVE_ACCELERATION)
#error "SMOOTH_LIN_ADVANCE is not compatible with S_CURVE_ACCELERATION."
- #elif ENABLED(NONLINEAR_EXTRUSION)
- #error "SMOOTH_LIN_ADVANCE doesn't currently support NONLINEAR_EXTRUSION."
#elif ENABLED(INPUT_SHAPING_E_SYNC) && NONE(INPUT_SHAPING_X, INPUT_SHAPING_Y)
#error "INPUT_SHAPING_E_SYNC requires INPUT_SHAPING_X or INPUT_SHAPING_Y."
#endif
diff --git a/Marlin/src/module/planner.cpp b/Marlin/src/module/planner.cpp
index fe497058d9..5e1c08f863 100644
--- a/Marlin/src/module/planner.cpp
+++ b/Marlin/src/module/planner.cpp
@@ -3252,6 +3252,10 @@ void Planner::refresh_acceleration_rates() {
void Planner::refresh_positioning() {
#if ENABLED(EDITABLE_STEPS_PER_UNIT)
LOOP_DISTINCT_AXES(i) mm_per_step[i] = 1.0f / settings.axis_steps_per_mm[i];
+ #if ALL(NONLINEAR_EXTRUSION, SMOOTH_LIN_ADVANCE)
+ stepper.ne_q30.A = _BV32(30) * (stepper.ne.A * mm_per_step[E_AXIS_N(0)] * mm_per_step[E_AXIS_N(0)]);
+ stepper.ne_q30.B = _BV32(30) * (stepper.ne.B * mm_per_step[E_AXIS_N(0)]);
+ #endif
#endif
set_position_mm(current_position);
refresh_acceleration_rates();
diff --git a/Marlin/src/module/planner.h b/Marlin/src/module/planner.h
index 0a3a35d922..c71a73c5be 100644
--- a/Marlin/src/module/planner.h
+++ b/Marlin/src/module/planner.h
@@ -531,9 +531,7 @@ class Planner {
static void set_advance_k(const_float_t k, const uint8_t e=active_extruder) {
UNUSED(e);
extruder_advance_K[E_INDEX_N(e)] = k;
- #if ENABLED(SMOOTH_LIN_ADVANCE)
- extruder_advance_K_q27[E_INDEX_N(e)] = k * (1UL << 27);
- #endif
+ TERN_(SMOOTH_LIN_ADVANCE, extruder_advance_K_q27[E_INDEX_N(e)] = k * _BV32(27));
}
static float get_advance_k(const uint8_t e=active_extruder) {
UNUSED(e);
diff --git a/Marlin/src/module/stepper.cpp b/Marlin/src/module/stepper.cpp
index 04c796acb3..a6931c8d0d 100644
--- a/Marlin/src/module/stepper.cpp
+++ b/Marlin/src/module/stepper.cpp
@@ -257,9 +257,16 @@ uint32_t Stepper::advance_divisor = 0,
#if ENABLED(NONLINEAR_EXTRUSION)
ne_coeff_t Stepper::ne;
- ne_fix_t Stepper::ne_fix;
- int32_t Stepper::ne_edividend;
- uint32_t Stepper::ne_scale;
+ #if NONLINEAR_EXTRUSION_Q24
+ ne_q24_t Stepper::ne_q24;
+ #else
+ ne_q30_t Stepper::ne_q30;
+ #endif
+ // private:
+ #if NONLINEAR_EXTRUSION_Q24
+ int32_t Stepper::ne_edividend;
+ uint32_t Stepper::ne_scale_q24;
+ #endif
#endif
#if HAS_ZV_SHAPING
@@ -2241,13 +2248,13 @@ hal_timer_t Stepper::calc_timer_interval(uint32_t step_rate) {
#endif // !CPU_32_BIT
}
-#if ENABLED(NONLINEAR_EXTRUSION)
- void Stepper::calc_nonlinear_e(uint32_t step_rate) {
- const uint32_t velocity = ne_scale * step_rate; // Scale step_rate first so all intermediate values stay in range of 8.24 fixed point math
- int32_t vd = (((((int64_t)ne_fix.A * velocity) >> 24) * velocity) >> 24) + (((int64_t)ne_fix.B * velocity) >> 24);
- NOLESS(vd, 0);
+#if NONLINEAR_EXTRUSION_Q24
+ void Stepper::calc_nonlinear_e(const uint32_t step_rate) {
+ const uint32_t velocity_q24 = ne_scale_q24 * step_rate; // Scale step_rate first so all intermediate values stay in range of 8.24 fixed point math
+ int32_t vd_q24 = (((((int64_t)ne_q24.A * velocity_q24) >> 24) * velocity_q24) >> 24) + (((int64_t)ne_q24.B * velocity_q24) >> 24);
+ NOLESS(vd_q24, 0);
- advance_dividend.e = (uint64_t(ne_fix.C + vd) * ne_edividend) >> 24;
+ advance_dividend.e = (uint64_t(ne_q24.C + vd_q24) * ne_edividend) >> 24;
}
#endif
@@ -2463,9 +2470,7 @@ hal_timer_t Stepper::block_phase_isr() {
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);
- #endif
+ calc_nonlinear_e(acc_step_rate << oversampling_factor);
#if HAS_ROUGH_LIN_ADVANCE
if (la_active) {
@@ -2529,9 +2534,7 @@ hal_timer_t Stepper::block_phase_isr() {
interval = calc_multistep_timer_interval(step_rate << oversampling_factor);
deceleration_time += interval;
- #if ENABLED(NONLINEAR_EXTRUSION)
- calc_nonlinear_e(step_rate << oversampling_factor);
- #endif
+ calc_nonlinear_e(step_rate << oversampling_factor);
#if HAS_ROUGH_LIN_ADVANCE
if (la_active) {
@@ -2584,9 +2587,7 @@ hal_timer_t Stepper::block_phase_isr() {
TERN_(SMOOTH_LIN_ADVANCE, curr_step_rate = current_block->nominal_rate;)
deceleration_time = ticks_nominal / 2;
- #if ENABLED(NONLINEAR_EXTRUSION)
- calc_nonlinear_e(current_block->nominal_rate << oversampling_factor);
- #endif
+ calc_nonlinear_e(current_block->nominal_rate << oversampling_factor);
#if HAS_ROUGH_LIN_ADVANCE
if (la_active)
@@ -2836,18 +2837,18 @@ hal_timer_t Stepper::block_phase_isr() {
acc_step_rate = current_block->initial_rate;
#endif
- #if ENABLED(NONLINEAR_EXTRUSION)
+ #if NONLINEAR_EXTRUSION_Q24
ne_edividend = advance_dividend.e;
const float scale = (float(ne_edividend) / advance_divisor) * planner.mm_per_step[E_AXIS_N(current_block->extruder)];
- ne_scale = (1L << 24) * scale;
+ ne_scale_q24 = _BV32(24) * scale;
if (current_block->direction_bits.e && ANY_AXIS_MOVES(current_block)) {
- ne_fix.A = (1L << 24) * ne.A;
- ne_fix.B = (1L << 24) * ne.B;
- ne_fix.C = (1L << 24) * ne.C;
+ ne_q24.A = _BV32(24) * ne.A;
+ ne_q24.B = _BV32(24) * ne.B;
+ ne_q24.C = _BV32(24) * ne.C;
}
else {
- ne_fix.A = ne_fix.B = 0;
- ne_fix.C = (1L << 24);
+ ne_q24.A = ne_q24.B = 0;
+ ne_q24.C = _BV32(24);
}
#endif
@@ -2856,9 +2857,7 @@ hal_timer_t Stepper::block_phase_isr() {
// 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);
- #endif
+ calc_nonlinear_e(current_block->initial_rate << oversampling_factor);
#if ENABLED(LIN_ADVANCE)
#if ENABLED(SMOOTH_LIN_ADVANCE)
@@ -2885,13 +2884,23 @@ hal_timer_t Stepper::block_phase_isr() {
uint32_t Stepper::extruder_advance_tau_ticks[DISTINCT_E],
Stepper::extruder_advance_alpha_q30[DISTINCT_E];
- void Stepper::set_la_interval(const int32_t rate) {
- if (rate == 0) {
+ void Stepper::set_la_interval(int32_t step_rate) {
+ if (step_rate == 0) {
la_interval = LA_ADV_NEVER;
}
else {
- const bool forward_e = rate > 0;
- la_interval = calc_timer_interval(uint32_t(ABS(rate)));
+ const bool forward_e = step_rate > 0;
+
+ #if ENABLED(NONLINEAR_EXTRUSION)
+ if (forward_e && ANY_AXIS_MOVES(current_block)) {
+ // Maximum polynomial value is just above 1, like 1.05..1.2, less than 2 anyway, so we can use 30 bits for fractional part
+ int32_t vd_q30 = ne_q30.A*step_rate*step_rate + ne_q30.B*step_rate;
+ NOLESS(vd_q30, 0);
+ step_rate = (int64_t(step_rate) * (ne_q30.C + vd_q30)) >> 30;
+ }
+ #endif
+
+ la_interval = calc_timer_interval(uint32_t(ABS(step_rate)));
if (forward_e != motor_direction(E_AXIS)) {
last_direction_bits.toggle(E_AXIS);
count_direction.e = -count_direction.e;
diff --git a/Marlin/src/module/stepper.h b/Marlin/src/module/stepper.h
index 3fb0b44884..9495a18139 100644
--- a/Marlin/src/module/stepper.h
+++ b/Marlin/src/module/stepper.h
@@ -285,7 +285,12 @@ constexpr ena_mask_t enable_overlap[] = {
#if ENABLED(NONLINEAR_EXTRUSION)
typedef struct { float A, B, C; void reset() { A = B = 0.0f; C = 1.0f; } } ne_coeff_t;
- typedef struct { int32_t A, B, C; } ne_fix_t;
+ #if DISABLED(SMOOTH_LIN_ADVANCE)
+ #define NONLINEAR_EXTRUSION_Q24 1
+ typedef struct { int32_t A, B, C; } ne_q24_t;
+ #else
+ typedef struct { int32_t A, B, C; } ne_q30_t;
+ #endif
#endif
//
@@ -343,6 +348,11 @@ class Stepper {
#if ENABLED(NONLINEAR_EXTRUSION)
static ne_coeff_t ne;
+ #if NONLINEAR_EXTRUSION_Q24
+ static ne_q24_t ne_q24;
+ #else
+ static ne_q30_t ne_q30;
+ #endif
#endif
#if ENABLED(ADAPTIVE_STEP_SMOOTHING_TOGGLE)
@@ -467,10 +477,9 @@ class Stepper {
#endif
#endif
- #if ENABLED(NONLINEAR_EXTRUSION)
+ #if NONLINEAR_EXTRUSION_Q24
static int32_t ne_edividend;
- static uint32_t ne_scale;
- static ne_fix_t ne_fix;
+ static uint32_t ne_scale_q24;
#endif
#if ENABLED(BABYSTEPPING)
@@ -531,7 +540,7 @@ class Stepper {
// The Linear advance ISR phase
static void advance_isr();
#if ENABLED(SMOOTH_LIN_ADVANCE)
- static void set_la_interval(const int32_t rate);
+ static void set_la_interval(int32_t step_rate);
static hal_timer_t smooth_lin_adv_isr();
#endif
#endif
@@ -738,8 +747,10 @@ class Stepper {
// Evaluate axis motions and set bits in axis_did_move
static void set_axis_moved_for_current_block();
- #if ENABLED(NONLINEAR_EXTRUSION)
- static void calc_nonlinear_e(uint32_t step_rate);
+ #if NONLINEAR_EXTRUSION_Q24
+ static void calc_nonlinear_e(const uint32_t step_rate);
+ #else
+ static void calc_nonlinear_e(const uint32_t) {}
#endif
#if ENABLED(S_CURVE_ACCELERATION)
diff --git a/README-PT-BR.md b/README-PT-BR.md
index 8d8b18828f..3c730967ae 100644
--- a/README-PT-BR.md
+++ b/README-PT-BR.md
@@ -14,7 +14,7 @@
-Documentação adicional pode ser encontrada na [Página Inicial do Marlin](//marlinfw.org/).
+Documentação adicional pode ser encontrada na [Página Inicial do Marlin](//marlinfw.org/).
Por favor, teste este firmware e nos avise se encontrar algum problema. Voluntários estão prontos para ajudar!
## Branch de Correções do Marlin 2.1
From a4382b4dcdcf136908b1bc739fd310f9c4f4c9c5 Mon Sep 17 00:00:00 2001
From: Scott Lahteine
Date: Tue, 20 May 2025 16:24:13 -0500
Subject: [PATCH 004/326] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20Fix?=
=?UTF-8?q?=20max=5Fisr=5Frate=20sign=20warnings?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
Marlin/src/module/stepper.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Marlin/src/module/stepper.h b/Marlin/src/module/stepper.h
index 9495a18139..73fd28fe85 100644
--- a/Marlin/src/module/stepper.h
+++ b/Marlin/src/module/stepper.h
@@ -147,7 +147,7 @@ constexpr ena_mask_t enable_overlap[] = {
TERN0(INPUT_SHAPING_Z, _ISDMF[Z_AXIS] * _ISDASU[Z_AXIS]);
#if defined(__AVR__) || !defined(ADAPTIVE_STEP_SMOOTHING)
// min_step_isr_frequency is known at compile time on AVRs and any reduction in SRAM is welcome
- template constexpr float max_isr_rate() {
+ template constexpr float max_isr_rate() {
return _MAX(_ISDMF[ALIM(INDEX - 1, _ISDMF)] * _ISDASU[ALIM(INDEX - 1, _ISDASU)], max_isr_rate());
}
template<> constexpr float max_isr_rate<0>() {
From 9c9ed690f787395e3dc464e9b1c8a22239dfcf8b Mon Sep 17 00:00:00 2001
From: thinkyhead
Date: Wed, 21 May 2025 00:32:16 +0000
Subject: [PATCH 005/326] [cron] Bump distribution date (2025-05-21)
---
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 61232e769a..98e9fc410e 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 "2025-05-20"
+//#define STRING_DISTRIBUTION_DATE "2025-05-21"
/**
* The protocol for communication to the host. Protocol indicates communication
diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h
index 8f8c30dbfa..a987b6d9ae 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 "2025-05-20"
+ #define STRING_DISTRIBUTION_DATE "2025-05-21"
#endif
/**
From e7662920a621961254a681eaa732f01ebdd17cc8 Mon Sep 17 00:00:00 2001
From: Scott Lahteine
Date: Thu, 22 May 2025 13:41:28 -0500
Subject: [PATCH 006/326] =?UTF-8?q?=F0=9F=A9=B9=20Fix=20delay=20=C2=B5s=20?=
=?UTF-8?q?>=2032767?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Fixes #27753
---
Marlin/src/HAL/shared/Delay.h | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/Marlin/src/HAL/shared/Delay.h b/Marlin/src/HAL/shared/Delay.h
index 4751d7a5e2..eeaf4c59fc 100644
--- a/Marlin/src/HAL/shared/Delay.h
+++ b/Marlin/src/HAL/shared/Delay.h
@@ -100,7 +100,7 @@ void calibrate_delay_loop();
// For delay in microseconds, no smart delay selection is required, directly call the delay function
// Teensy compiler is too old and does not accept smart delay compile-time / run-time selection correctly
- #define DELAY_US(x) DelayCycleFnc((x) * ((F_CPU) / 1000000UL))
+ #define DELAY_US(x) DelayCycleFnc((unsigned long)(x) * ((F_CPU) / 1000000UL))
#elif defined(__AVR__)
FORCE_INLINE static void __delay_up_to_3c(uint8_t cycles) {
@@ -164,7 +164,7 @@ void calibrate_delay_loop();
}
// Delay in microseconds
- #define DELAY_US(x) DELAY_CYCLES((x) * ((F_CPU) / 1000000UL))
+ #define DELAY_US(x) DELAY_CYCLES((unsigned long)(x) * ((F_CPU) / 1000000UL))
#define DELAY_CYCLES_VAR DELAY_CYCLES
@@ -173,7 +173,7 @@ void calibrate_delay_loop();
// DELAY_CYCLES specified inside platform
// Delay in microseconds
- #define DELAY_US(x) DELAY_CYCLES((x) * ((F_CPU) / 1000000UL))
+ #define DELAY_US(x) DELAY_CYCLES((unsigned long)(x) * ((F_CPU) / 1000000UL))
#define DELAY_CYCLES_VAR DELAY_CYCLES
From aa02bb05d3e28d3a38008d12784bab68611e92e6 Mon Sep 17 00:00:00 2001
From: thinkyhead
Date: Fri, 23 May 2025 00:32:07 +0000
Subject: [PATCH 007/326] [cron] Bump distribution date (2025-05-23)
---
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 98e9fc410e..71c2b31b6b 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 "2025-05-21"
+//#define STRING_DISTRIBUTION_DATE "2025-05-23"
/**
* The protocol for communication to the host. Protocol indicates communication
diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h
index a987b6d9ae..fabb554890 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 "2025-05-21"
+ #define STRING_DISTRIBUTION_DATE "2025-05-23"
#endif
/**
From f49e730b23f4bcfc6162dad9dae03b164d4df198 Mon Sep 17 00:00:00 2001
From: Scott Lahteine
Date: Sun, 24 Nov 2024 22:17:34 -0600
Subject: [PATCH 008/326] =?UTF-8?q?=F0=9F=94=A7=20Allow=20TMCStepper=20wit?=
=?UTF-8?q?h=20Zonestar=20ZM3=20E2xx?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
ini/stm32f1-maple.ini | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/ini/stm32f1-maple.ini b/ini/stm32f1-maple.ini
index ddd75549c8..17bcb2eb60 100644
--- a/ini/stm32f1-maple.ini
+++ b/ini/stm32f1-maple.ini
@@ -389,7 +389,7 @@ build_flags = ${STM32F1_maple.build_flags}
-D__STM32F1__=1 -DDEBUG_LEVEL=0 -DSS_TIMER=4 -DSERIAL_USB
lib_deps = ${STM32F1_maple.lib_deps}
USBComposite for STM32F1@0.91
-lib_ignore = Adafruit NeoPixel, SPI, SailfishLCD, SailfishRGB_LED, SlowSoftI2CMaster, TMCStepper
+lib_ignore = Adafruit NeoPixel, SPI, SailfishLCD, SailfishRGB_LED, SlowSoftI2CMaster
[env:STM32F103RC_ZM3E2_USB_maple]
extends = ZONESTAR_ZM3E_maple
From 1258657b8d428f2e28463b6bc46f551193c31bb1 Mon Sep 17 00:00:00 2001
From: thinkyhead
Date: Sat, 24 May 2025 00:30:50 +0000
Subject: [PATCH 009/326] [cron] Bump distribution date (2025-05-24)
---
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 71c2b31b6b..cb96070cc4 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 "2025-05-23"
+//#define STRING_DISTRIBUTION_DATE "2025-05-24"
/**
* The protocol for communication to the host. Protocol indicates communication
diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h
index fabb554890..51a13f1947 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 "2025-05-23"
+ #define STRING_DISTRIBUTION_DATE "2025-05-24"
#endif
/**
From 202ec4b58f76edfff0376306c46ca8529971340a Mon Sep 17 00:00:00 2001
From: Scott Lahteine
Date: Fri, 23 May 2025 21:11:50 -0500
Subject: [PATCH 010/326] =?UTF-8?q?=E2=9C=A8=20Trinamic=20TMC2240=20(SPI)?=
=?UTF-8?q?=20(#25974)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Co-Authored-By: David Buezas
Co-Authored-By: z1996xm <102506464+z1996xm@users.noreply.github.com>
---
Marlin/Configuration.h | 6 +-
Marlin/Configuration_adv.h | 23 ++--
Marlin/src/core/drivers.h | 34 ++++--
Marlin/src/feature/tmc_util.cpp | 76 ++++++++++++
Marlin/src/feature/tmc_util.h | 77 +++++++++++-
.../src/gcode/feature/trinamic/M911-M914.cpp | 6 +-
Marlin/src/gcode/gcode.h | 12 +-
Marlin/src/inc/SanityCheck.h | 64 +++++-----
Marlin/src/module/stepper/trinamic.cpp | 114 +++++++++++++++---
Marlin/src/module/stepper/trinamic.h | 1 +
buildroot/tests/BTT_BTT002 | 3 +-
11 files changed, 335 insertions(+), 81 deletions(-)
diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h
index dc042ff1cb..859f0bbd33 100644
--- a/Marlin/Configuration.h
+++ b/Marlin/Configuration.h
@@ -148,9 +148,9 @@
* Options: A4988, A5984, DRV8825, LV8729, TB6560, TB6600, TMC2100,
* TMC2130, TMC2130_STANDALONE, TMC2160, TMC2160_STANDALONE,
* TMC2208, TMC2208_STANDALONE, TMC2209, TMC2209_STANDALONE,
- * TMC2660, TMC2660_STANDALONE, TMC5130, TMC5130_STANDALONE,
- * TMC5160, TMC5160_STANDALONE
- * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2160', 'TMC2160_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC2209', 'TMC2209_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE', 'TMC5160', 'TMC5160_STANDALONE']
+ * TMC2240, TMC2240_STANDALONE, TMC2660, TMC2660_STANDALONE,
+ * TMC5130, TMC5130_STANDALONE, TMC5160, TMC5160_STANDALONE
+ * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2160', 'TMC2160_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC2209', 'TMC2209_STANDALONE', 'TMC2240', 'TMC2240_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE', 'TMC5160', 'TMC5160_STANDALONE']
*/
#define X_DRIVER_TYPE A4988
#define Y_DRIVER_TYPE A4988
diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h
index 60e5378c30..93d84d8d9c 100644
--- a/Marlin/Configuration_adv.h
+++ b/Marlin/Configuration_adv.h
@@ -3027,6 +3027,15 @@
*/
#define INTERPOLATE true
+ #if HAS_DRIVER(TMC2240)
+ #define TMC2240_CURRENT_RANGE 1 // RMS: { 0:'690mA', 1:'1410mA', 2:'2120mA', 3:'2110mA' }
+ // PEAK:{ 0:'1A', 1:'2A', 2:'3A', 3:'3A' }
+ // Determines max current. Lower is more internal current resolution. Higher runs cooler.
+ #define TMC2240_Rref 12000 // ('rref', 12000, minval=12000, maxval=60000)
+ #define TMC2240_SLOPE_CONTROL 0 // :{ 0:'100V/us', 1:'200V/us', 2:'400V/us', 3:'800V/us' }
+ // Lower is more silent. Higher runs cooler.
+ #endif
+
#if AXIS_IS_TMC_CONFIG(X)
#define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current.
#define X_CURRENT_HOME X_CURRENT // (mA) RMS current for homing. (Typically lower than *_CURRENT.)
@@ -3335,7 +3344,7 @@
// @section tmc/stealthchop
/**
- * TMC2130, TMC2160, TMC2208, TMC2209, TMC5130 and TMC5160 only
+ * TMC2130, TMC2160, TMC2208, TMC2209, TMC2240, TMC5130 and TMC5160 only
* Use Trinamic's ultra quiet stepping mode.
* When disabled, Marlin will use spreadCycle stepping mode.
*/
@@ -3414,7 +3423,7 @@
// @section tmc/hybrid
/**
- * TMC2130, TMC2160, TMC2208, TMC2209, TMC5130 and TMC5160 only
+ * TMC2130, TMC2160, TMC2208, TMC2209, TMC2240, TMC5130 and TMC5160 only
* The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD.
* This mode allows for faster movements at the expense of higher noise levels.
* STEALTHCHOP_(XY|Z|E) must be enabled to use HYBRID_THRESHOLD.
@@ -3448,16 +3457,16 @@
/**
* Use StallGuard to home / probe X, Y, Z.
*
- * TMC2130, TMC2160, TMC2209, TMC2660, TMC5130, and TMC5160 only
+ * TMC2130, TMC2160, TMC2209, TMC2240, TMC2660, TMC5130, and TMC5160 only
* Connect the stepper driver's DIAG1 pin to the X/Y endstop pin.
* X, Y, and Z homing will always be done in spreadCycle mode.
*
* X/Y/Z_STALL_SENSITIVITY is the default stall threshold.
* Use M914 X Y Z to set the stall threshold at runtime:
*
- * Sensitivity TMC2209 Others
- * HIGHEST 255 -64 (Too sensitive => False positive)
- * LOWEST 0 63 (Too insensitive => No trigger)
+ * Sensitivity TMC2209/2240 Others
+ * HIGHEST 255 -64 (Too sensitive => False positive)
+ * LOWEST 0 63 (Too insensitive => No trigger)
*
* It is recommended to set HOMING_BUMP_MM to { 0, 0, 0 }.
*
@@ -3474,7 +3483,7 @@
//#define SENSORLESS_HOMING // StallGuard capable drivers only
#if ANY(SENSORLESS_HOMING, SENSORLESS_PROBING)
- // TMC2209: 0...255. TMC2130: -64...63
+ // TMC2209/2240: 0...255. TMC2130: -64...63
#define X_STALL_SENSITIVITY 8
#define X2_STALL_SENSITIVITY X_STALL_SENSITIVITY
#define Y_STALL_SENSITIVITY 8
diff --git a/Marlin/src/core/drivers.h b/Marlin/src/core/drivers.h
index c54e42c8fe..6b1a70202c 100644
--- a/Marlin/src/core/drivers.h
+++ b/Marlin/src/core/drivers.h
@@ -41,6 +41,8 @@
#define _TMC2208_STANDALONE 0x2208B
#define _TMC2209 0x2209A
#define _TMC2209_STANDALONE 0x2209B
+#define _TMC2240 0x2240A
+#define _TMC2240_STANDALONE 0x2240B
#define _TMC2660 0x2660A
#define _TMC2660_STANDALONE 0x2660B
#define _TMC5130 0x5130A
@@ -96,7 +98,7 @@
// Does not match standalone configurations
#if ( HAS_DRIVER(TMC2130) || HAS_DRIVER(TMC2160) \
|| HAS_DRIVER(TMC2208) || HAS_DRIVER(TMC2209) \
- || HAS_DRIVER(TMC2660) \
+ || HAS_DRIVER(TMC2240) || HAS_DRIVER(TMC2660) \
|| HAS_DRIVER(TMC5130) || HAS_DRIVER(TMC5160) )
#define HAS_TRINAMIC_CONFIG 1
#endif
@@ -106,22 +108,30 @@
#if ( HAS_DRIVER(TMC2100) \
|| HAS_DRIVER(TMC2130_STANDALONE) || HAS_DRIVER(TMC2160_STANDALONE) \
|| HAS_DRIVER(TMC2208_STANDALONE) || HAS_DRIVER(TMC2209_STANDALONE) \
- || HAS_DRIVER(TMC2660_STANDALONE) || HAS_DRIVER(TMC5130_STANDALONE) \
- || HAS_DRIVER(TMC5160_STANDALONE) )
+ || HAS_DRIVER(TMC2240_STANDALONE) || HAS_DRIVER(TMC2660_STANDALONE) \
+ || HAS_DRIVER(TMC5130_STANDALONE) || HAS_DRIVER(TMC5160_STANDALONE) )
#define HAS_TRINAMIC_STANDALONE 1
#endif
-#if HAS_DRIVER(TMC2130) || HAS_DRIVER(TMC2160) || HAS_DRIVER(TMC5130) || HAS_DRIVER(TMC5160)
+#if HAS_DRIVER(TMC2130) || HAS_DRIVER(TMC2160) || HAS_DRIVER(TMC5130) || HAS_DRIVER(TMC5160) || HAS_DRIVER(TMC2240)
#define HAS_TMCX1X0 1
#endif
-
#if HAS_DRIVER(TMC2208) || HAS_DRIVER(TMC2209)
#define HAS_TMC220x 1
#endif
+//#if HAS_TMC_220x || HAS_DRIVER(TMC2240)
+// #define HAS_TMC22xx 1
+//#endif
+//#if HAS_TMCX1X0 || HAS_TMC220x
+// #define HAS_TMC_CS_ACTUAL 1
+//#endif
+//#if HAS_TMCX1X0 || HAS_DRIVER(TMC2209)
+// #define HAS_TMC_SG_RESULT 1
+//#endif
#define AXIS_IS_TMC(A) ( AXIS_DRIVER_TYPE(A,TMC2130) || AXIS_DRIVER_TYPE(A,TMC2160) \
|| AXIS_DRIVER_TYPE(A,TMC2208) || AXIS_DRIVER_TYPE(A,TMC2209) \
- || AXIS_DRIVER_TYPE(A,TMC2660) \
+ || AXIS_DRIVER_TYPE(A,TMC2240) || AXIS_DRIVER_TYPE(A,TMC2660) \
|| AXIS_DRIVER_TYPE(A,TMC5130) || AXIS_DRIVER_TYPE(A,TMC5160) )
#define AXIS_IS_TMC_CONFIG AXIS_IS_TMC
@@ -129,8 +139,8 @@
// Test for a driver that uses SPI - this allows checking whether a _CS_ pin
// is considered sensitive
#define AXIS_HAS_SPI(A) ( AXIS_DRIVER_TYPE(A,TMC2130) || AXIS_DRIVER_TYPE(A,TMC2160) \
- || AXIS_DRIVER_TYPE(A,TMC2660) || AXIS_DRIVER_TYPE(A,TMC5130) \
- || AXIS_DRIVER_TYPE(A,TMC5160) )
+ || AXIS_DRIVER_TYPE(A,TMC2240) || AXIS_DRIVER_TYPE(A,TMC2660) \
+ || AXIS_DRIVER_TYPE(A,TMC5130) || AXIS_DRIVER_TYPE(A,TMC5160) )
#define AXIS_HAS_UART(A) ( AXIS_DRIVER_TYPE(A,TMC2208) || AXIS_DRIVER_TYPE(A,TMC2209) )
@@ -140,19 +150,21 @@
#define AXIS_HAS_SW_SERIAL(A) ( AXIS_HAS_UART(A) && !defined(A##_HARDWARE_SERIAL) )
#define AXIS_HAS_STALLGUARD(A) ( AXIS_DRIVER_TYPE(A,TMC2130) || AXIS_DRIVER_TYPE(A,TMC2160) \
- || AXIS_DRIVER_TYPE(A,TMC2209) \
+ || AXIS_DRIVER_TYPE(A,TMC2209) || AXIS_DRIVER_TYPE(A,TMC2240) \
|| AXIS_DRIVER_TYPE(A,TMC2660) \
|| AXIS_DRIVER_TYPE(A,TMC5130) || AXIS_DRIVER_TYPE(A,TMC5160) )
#define AXIS_HAS_STEALTHCHOP(A) ( AXIS_DRIVER_TYPE(A,TMC2130) || AXIS_DRIVER_TYPE(A,TMC2160) \
|| AXIS_DRIVER_TYPE(A,TMC2208) || AXIS_DRIVER_TYPE(A,TMC2209) \
+ || AXIS_DRIVER_TYPE(A,TMC2240) \
|| AXIS_DRIVER_TYPE(A,TMC5130) || AXIS_DRIVER_TYPE(A,TMC5160) )
#define AXIS_HAS_SG_RESULT(A) ( AXIS_DRIVER_TYPE(A,TMC2130) || AXIS_DRIVER_TYPE(A,TMC2160) \
- || AXIS_DRIVER_TYPE(A,TMC2208) || AXIS_DRIVER_TYPE(A,TMC2209) )
+ || AXIS_DRIVER_TYPE(A,TMC2208) || AXIS_DRIVER_TYPE(A,TMC2209) \
+ || AXIS_DRIVER_TYPE(A,TMC2240) )
#define AXIS_HAS_COOLSTEP(A) ( AXIS_DRIVER_TYPE(A,TMC2130) \
- || AXIS_DRIVER_TYPE(A,TMC2209) \
+ || AXIS_DRIVER_TYPE(A,TMC2209) || AXIS_DRIVER_TYPE(A,TMC2240) \
|| AXIS_DRIVER_TYPE(A,TMC5130) || AXIS_DRIVER_TYPE(A,TMC5160) )
#define _OR_EAH(N,T) || AXIS_HAS_##T(E##N)
diff --git a/Marlin/src/feature/tmc_util.cpp b/Marlin/src/feature/tmc_util.cpp
index 753cb003ff..d920c3a604 100644
--- a/Marlin/src/feature/tmc_util.cpp
+++ b/Marlin/src/feature/tmc_util.cpp
@@ -142,6 +142,67 @@
#endif // HAS_TMCX1X0
+ #if HAS_DRIVER(TMC2240)
+
+ #if ENABLED(TMC_DEBUG)
+ static uint32_t get_pwm_scale(TMC2240Stepper &st) { return st.PWM_SCALE(); }
+ #endif
+
+ static TMC_driver_data get_driver_data(TMC2240Stepper &st) {
+ constexpr uint8_t OT_bp = 25, OTPW_bp = 26;
+ constexpr uint32_t S2G_bm = 0x18000000;
+ #if ENABLED(TMC_DEBUG)
+ constexpr uint16_t SG_RESULT_bm = 0x3FF; // 0:9
+ constexpr uint8_t STEALTH_bp = 14;
+ constexpr uint32_t CS_ACTUAL_bm = 0x1F0000; // 16:20
+ constexpr uint8_t STALL_GUARD_bp = 24;
+ constexpr uint8_t STST_bp = 31;
+ #endif
+ TMC_driver_data data;
+ const auto ds = data.drv_status = st.DRV_STATUS();
+ #ifdef __AVR__
+
+ // 8-bit optimization saves up to 70 bytes of PROGMEM per axis
+ uint8_t spart;
+ #if ENABLED(TMC_DEBUG)
+ data.sg_result = ds & SG_RESULT_bm;
+ spart = ds >> 8;
+ data.is_stealth = TEST(spart, STEALTH_bp - 8);
+ spart = ds >> 16;
+ data.cs_actual = spart & (CS_ACTUAL_bm >> 16);
+ #endif
+ spart = ds >> 24;
+ data.is_ot = TEST(spart, OT_bp - 24);
+ data.is_otpw = TEST(spart, OTPW_bp - 24);
+ data.is_s2g = !!(spart & (S2G_bm >> 24));
+ #if ENABLED(TMC_DEBUG)
+ data.is_stall = TEST(spart, STALL_GUARD_bp - 24);
+ data.is_standstill = TEST(spart, STST_bp - 24);
+ data.sg_result_reasonable = !data.is_standstill; // sg_result has no reasonable meaning while standstill
+ #endif
+
+ #else // !__AVR__
+
+ data.is_ot = TEST(ds, OT_bp);
+ data.is_otpw = TEST(ds, OTPW_bp);
+ data.is_s2g = !!(ds & S2G_bm);
+ #if ENABLED(TMC_DEBUG)
+ constexpr uint8_t CS_ACTUAL_sb = 16;
+ data.sg_result = ds & SG_RESULT_bm;
+ data.is_stealth = TEST(ds, STEALTH_bp);
+ data.cs_actual = (ds & CS_ACTUAL_bm) >> CS_ACTUAL_sb;
+ data.is_stall = TEST(ds, STALL_GUARD_bp);
+ data.is_standstill = TEST(ds, STST_bp);
+ data.sg_result_reasonable = !data.is_standstill; // sg_result has no reasonable meaning while standstill
+ #endif
+
+ #endif // !__AVR__
+
+ return data;
+ }
+
+ #endif // TMC2240
+
#if HAS_TMC220x
#if ENABLED(TMC_DEBUG)
@@ -1025,6 +1086,21 @@
st.TCOOLTHRS(0);
}
+ bool tmc_enable_stallguard(TMC2240Stepper &st) {
+ const bool stealthchop_was_enabled = st.en_pwm_mode();
+
+ st.TCOOLTHRS(0xFFFFF);
+ st.en_pwm_mode(false);
+ st.diag0_stall(true);
+
+ return stealthchop_was_enabled;
+ }
+ void tmc_disable_stallguard(TMC2240Stepper &st, const bool restore_stealth) {
+ st.TCOOLTHRS(0);
+ st.en_pwm_mode(restore_stealth);
+ st.diag0_stall(false);
+ }
+
bool tmc_enable_stallguard(TMC2660Stepper) {
// TODO
return false;
diff --git a/Marlin/src/feature/tmc_util.h b/Marlin/src/feature/tmc_util.h
index 4cac2969a7..55a4eb02aa 100644
--- a/Marlin/src/feature/tmc_util.h
+++ b/Marlin/src/feature/tmc_util.h
@@ -95,7 +95,7 @@ class TMCMarlin : public TMC, public TMCStorage {
TMC(CS, RS, pinMOSI, pinMISO, pinSCK)
{}
TMCMarlin(const uint16_t CS, const float RS, const uint16_t pinMOSI, const uint16_t pinMISO, const uint16_t pinSCK, const uint8_t axis_chain_index) :
- TMC(CS, RS, pinMOSI, pinMISO, pinSCK, axis_chain_index)
+ TMC(CS, RS, pinMOSI, pinMISO, pinSCK, axis_chain_index)
{}
uint16_t rms_current() { return TMC::rms_current(); }
void rms_current(uint16_t mA) {
@@ -124,7 +124,7 @@ class TMCMarlin : public TMC, public TMCStorage {
#if ENABLED(HYBRID_THRESHOLD)
uint32_t get_pwm_thrs() {
- return _tmc_thrs(this->microsteps(), this->TPWMTHRS(), planner.settings.axis_steps_per_mm[AXIS_ID]);
+ return _tmc_thrs(this->microsteps(), TMC::TPWMTHRS(), planner.settings.axis_steps_per_mm[AXIS_ID]);
}
void set_pwm_thrs(const uint32_t thrs) {
TMC::TPWMTHRS(_tmc_thrs(this->microsteps(), thrs, planner.settings.axis_steps_per_mm[AXIS_ID]));
@@ -197,7 +197,7 @@ class TMCMarlin : public TMC220
#if ENABLED(HYBRID_THRESHOLD)
uint32_t get_pwm_thrs() {
- return _tmc_thrs(this->microsteps(), this->TPWMTHRS(), planner.settings.axis_steps_per_mm[AXIS_ID]);
+ return _tmc_thrs(this->microsteps(), TMC2208Stepper::TPWMTHRS(), planner.settings.axis_steps_per_mm[AXIS_ID]);
}
void set_pwm_thrs(const uint32_t thrs) {
TMC2208Stepper::TPWMTHRS(_tmc_thrs(this->microsteps(), thrs, planner.settings.axis_steps_per_mm[AXIS_ID]));
@@ -249,13 +249,14 @@ class TMCMarlin : public TMC220
#if ENABLED(HYBRID_THRESHOLD)
uint32_t get_pwm_thrs() {
- return _tmc_thrs(this->microsteps(), this->TPWMTHRS(), planner.settings.axis_steps_per_mm[AXIS_ID]);
+ return _tmc_thrs(this->microsteps(), TMC2209Stepper::TPWMTHRS(), planner.settings.axis_steps_per_mm[AXIS_ID]);
}
void set_pwm_thrs(const uint32_t thrs) {
TMC2209Stepper::TPWMTHRS(_tmc_thrs(this->microsteps(), thrs, planner.settings.axis_steps_per_mm[AXIS_ID]));
TERN_(HAS_MARLINUI_MENU, this->stored.hybrid_thrs = thrs);
}
#endif
+
#if USE_SENSORLESS
int16_t homing_threshold() { return TMC2209Stepper::SGTHRS(); }
void homing_threshold(int16_t sgt_val) {
@@ -278,6 +279,74 @@ class TMCMarlin : public TMC220
sgt_max = 255;
};
+template
+class TMCMarlin : public TMC2240Stepper, public TMCStorage {
+ public:
+ TMCMarlin(const uint16_t cs_pin, const uint8_t axis_chain_index) :
+ TMC2240Stepper(cs_pin, axis_chain_index)
+ {}
+ TMCMarlin(const uint16_t CS, const uint16_t pinMOSI, const uint16_t pinMISO, const uint16_t pinSCK, const uint8_t axis_chain_index) :
+ TMC2240Stepper(CS, pinMOSI, pinMISO, pinSCK, axis_chain_index )
+ {}
+
+ //uint8_t get_address() { return slave_address; }
+ uint16_t get_microstep_counter() { return microsteps(); }
+
+ uint16_t rms_current() { return TMC2240Stepper::rms_current(); }
+ void rms_current(const uint16_t mA) {
+ this->val_mA = mA;
+ TMC2240Stepper::rms_current(mA);
+ }
+ void rms_current(const uint16_t mA, const float mult) {
+ this->val_mA = mA;
+ TMC2240Stepper::rms_current(mA, mult);
+ }
+
+ #if HAS_STEALTHCHOP
+ bool get_stealthChop() { return this->en_pwm_mode(); }
+ bool get_stored_stealthChop() { return this->stored.stealthChop_enabled; }
+ void refresh_stepping_mode() { this->en_pwm_mode(this->stored.stealthChop_enabled); }
+ void set_stealthChop(const bool stch) { this->stored.stealthChop_enabled = stch; refresh_stepping_mode(); }
+ bool toggle_stepping_mode() { set_stealthChop(!this->stored.stealthChop_enabled); return get_stealthChop(); }
+ #endif
+
+ void set_chopper_times(const chopper_timing_t &ct) {
+ TMC2240Stepper::toff(ct.toff);
+ TMC2240Stepper::hysteresis_end(ct.hend);
+ TMC2240Stepper::hysteresis_start(ct.hstrt);
+ }
+
+ #if ENABLED(HYBRID_THRESHOLD)
+ uint32_t get_pwm_thrs() {
+ return _tmc_thrs(this->microsteps(), TMC2240Stepper::TPWMTHRS(), planner.settings.axis_steps_per_mm[AXIS_ID]);
+ }
+ void set_pwm_thrs(const uint32_t thrs) {
+ TMC2240Stepper::TPWMTHRS(_tmc_thrs(this->microsteps(), thrs, planner.settings.axis_steps_per_mm[AXIS_ID]));
+ TERN_(HAS_MARLINUI_MENU, this->stored.hybrid_thrs = thrs);
+ }
+ #endif
+
+ #if USE_SENSORLESS
+ int16_t homing_threshold() { return TMC2240Stepper::sgt(); }
+ void homing_threshold(int16_t sgt_val) {
+ sgt_val = (int16_t)constrain(sgt_val, sgt_min, sgt_max);
+ TMC2240Stepper::sgt(sgt_val);
+ TERN_(HAS_MARLINUI_MENU, this->stored.homing_thrs = sgt_val);
+ }
+ #endif
+
+ void refresh_stepper_current() { rms_current(this->val_mA); }
+ #if ENABLED(HYBRID_THRESHOLD)
+ void refresh_hybrid_thrs() { set_pwm_thrs(this->stored.hybrid_thrs); }
+ #endif
+ #if USE_SENSORLESS
+ void refresh_homing_thrs() { homing_threshold(this->stored.homing_thrs); }
+ #endif
+
+ static constexpr int8_t sgt_min = -64,
+ sgt_max = 63;
+};
+
template
class TMCMarlin : public TMC2660Stepper, public TMCStorage {
public:
diff --git a/Marlin/src/gcode/feature/trinamic/M911-M914.cpp b/Marlin/src/gcode/feature/trinamic/M911-M914.cpp
index f4b0ac3670..52622a5e7e 100644
--- a/Marlin/src/gcode/feature/trinamic/M911-M914.cpp
+++ b/Marlin/src/gcode/feature/trinamic/M911-M914.cpp
@@ -32,7 +32,9 @@
#if ENABLED(MONITOR_DRIVER_STATUS)
- #define M91x_USE(ST) (AXIS_DRIVER_TYPE(ST, TMC2130) || AXIS_DRIVER_TYPE(ST, TMC2160) || AXIS_DRIVER_TYPE(ST, TMC2208) || AXIS_DRIVER_TYPE(ST, TMC2209) || AXIS_DRIVER_TYPE(ST, TMC2660) || AXIS_DRIVER_TYPE(ST, TMC5130) || AXIS_DRIVER_TYPE(ST, TMC5160))
+ #define M91x_USE(ST) (AXIS_DRIVER_TYPE(ST, TMC2130) || AXIS_DRIVER_TYPE(ST, TMC2160) \
+ || AXIS_DRIVER_TYPE(ST, TMC2208) || AXIS_DRIVER_TYPE(ST, TMC2209) || AXIS_DRIVER_TYPE(ST, TMC2240) \
+ || AXIS_DRIVER_TYPE(ST, TMC2660) || AXIS_DRIVER_TYPE(ST, TMC5130) || AXIS_DRIVER_TYPE(ST, TMC5160))
#define M91x_USE_E(N) (E_STEPPERS > N && M91x_USE(E##N))
#if HAS_X_AXIS && (M91x_USE(X) || M91x_USE(X2))
@@ -68,7 +70,7 @@
#endif
#if !M91x_SOME_X && !M91x_SOME_Y && !M91x_SOME_Z && !M91x_USE_I && !M91x_USE_J && !M91x_USE_K && !M91x_USE_U && !M91x_USE_V && !M91x_USE_W && !M91x_SOME_E
- #error "MONITOR_DRIVER_STATUS requires at least one TMC2130, 2160, 2208, 2209, 2660, 5130, or 5160."
+ #error "MONITOR_DRIVER_STATUS requires at least one TMC2130, 2160, 2208, 2209, 2240, 2660, 5130, or 5160."
#endif
template
diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h
index 706a7387db..cfe0ec056f 100644
--- a/Marlin/src/gcode/gcode.h
+++ b/Marlin/src/gcode/gcode.h
@@ -159,7 +159,7 @@
* M120 - Enable endstops detection.
* M121 - Disable endstops detection.
*
- * M122 - Debug stepper (Requires *_DRIVER_TYPE TMC(2130|2160|5130|5160|2208|2209|2660))
+ * M122 - Debug stepper (Requires *_DRIVER_TYPE TMC(2130|2160|5130|5160|2208|2209|2240|2660))
* M123 - Report fan tachometers. (Requires En_FAN_TACHO_PIN) Optionally set auto-report interval. (Requires AUTO_REPORT_FANS)
* M125 - Save current position and move to filament change position. (Requires PARK_HEAD_ON_PAUSE)
*
@@ -265,7 +265,7 @@
* M552 - Get or set IP address. Enable/disable network interface. (Requires enabled Ethernet port)
* M553 - Get or set IP netmask. (Requires enabled Ethernet port)
* M554 - Get or set IP gateway. (Requires enabled Ethernet port)
- * M569 - Enable stealthChop on an axis. (Requires *_DRIVER_TYPE TMC(2130|2160|2208|2209|5130|5160))
+ * M569 - Enable stealthChop on an axis. (Requires *_DRIVER_TYPE TMC(2130|2160|2208|2209|2240|5130|5160))
* M575 - Change the serial baud rate. (Requires BAUD_RATE_GCODE)
* M592 - Get or set Nonlinear Extrusion parameters. (Requires NONLINEAR_EXTRUSION)
* M593 - Get or set input shaping parameters. (Requires INPUT_SHAPING_[XY])
@@ -309,17 +309,17 @@
* M871 - Print/reset/clear first layer temperature offset values. (Requires PTC_PROBE, PTC_BED, or PTC_HOTEND)
* M876 - Handle Prompt Response. (Requires HOST_PROMPT_SUPPORT and not EMERGENCY_PARSER)
* M900 - Set or Report Linear Advance K-factor. (Requires LIN_ADVANCE)
- * M906 - Set or Report motor current in milliamps using axis codes XYZE, etc. Report values if no axis codes given. (Requires *_DRIVER_TYPE TMC(2130|2160|5130|5160|2208|2209|2660))
+ * M906 - Set or Report motor current in milliamps using axis codes XYZE, etc. Report values if no axis codes given. (Requires *_DRIVER_TYPE TMC(2130|2160|5130|5160|2208|2209|2240|2660))
* M907 - Set digital trimpot motor current using axis codes. (Requires a board with digital trimpots)
* M908 - Control digital trimpot directly. (Requires HAS_MOTOR_CURRENT_DAC or DIGIPOTSS_PIN)
* M909 - Print digipot/DAC current value. (Requires HAS_MOTOR_CURRENT_DAC)
* M910 - Commit digipot/DAC value to external EEPROM via I2C. (Requires HAS_MOTOR_CURRENT_DAC)
- * M911 - Report stepper driver overtemperature pre-warn condition. (Requires *_DRIVER_TYPE TMC(2130|2160|5130|5160|2208|2209|2660))
- * M912 - Clear stepper driver overtemperature pre-warn condition flag. (Requires *_DRIVER_TYPE TMC(2130|2160|5130|5160|2208|2209|2660))
+ * M911 - Report stepper driver overtemperature pre-warn condition. (Requires *_DRIVER_TYPE TMC(2130|2160|5130|5160|2208|2209|2240|2660))
+ * M912 - Clear stepper driver overtemperature pre-warn condition flag. (Requires *_DRIVER_TYPE TMC(2130|2160|5130|5160|2208|2209|2240|2660))
* M913 - Set HYBRID_THRESHOLD speed. (Requires HYBRID_THRESHOLD)
* M914 - Set StallGuard sensitivity. (Requires SENSORLESS_HOMING or SENSORLESS_PROBING)
* M919 - Set or Report motor Chopper Times (time_off, hysteresis_end, hysteresis_start) using axis codes XYZE, etc.
- * If no parameters are given, report. (Requires *_DRIVER_TYPE TMC(2130|2160|5130|5160|2208|2209|2660))
+ * If no parameters are given, report. (Requires *_DRIVER_TYPE TMC(2130|2160|5130|5160|2208|2209|2240|2660))
* M920 - Set Homing Current. (Requires distinct *_CURRENT_HOME settings)
* M936 - OTA update firmware. (Requires OTA_FIRMWARE_UPDATE)
* M951 - Set Magnetic Parking Extruder parameters. (Requires MAGNETIC_PARKING_EXTRUDER)
diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h
index c70c5ce0ec..5d427e7e08 100644
--- a/Marlin/src/inc/SanityCheck.h
+++ b/Marlin/src/inc/SanityCheck.h
@@ -3378,19 +3378,19 @@ static_assert(NUM_SERVOS <= NUM_SERVO_PLUGS, "NUM_SERVOS (or some servo index) i
#error "SPI_ENDSTOPS requires stepper drivers with SPI support."
#endif
#else // !SPI_ENDSTOPS
- // Stall detection DIAG = HIGH : TMC2209
- // Stall detection DIAG = LOW : TMC2130/TMC2160/TMC2660/TMC5130/TMC5160
+ // Stall detection DIAG = HIGH : TMC2209/2240
+ // Stall detection DIAG = LOW : TMC2130/2160/2660/5130/5160
#if X_SENSORLESS
- #define _HIT_STATE AXIS_DRIVER_TYPE(X,TMC2209)
+ #define _HIT_STATE AXIS_DRIVER_TYPE(X,TMC2209) || AXIS_DRIVER_TYPE(X,TMC2240)
#if X_HOME_TO_MIN && X_MIN_ENDSTOP_HIT_STATE != _HIT_STATE
#if _HIT_STATE
- #error "SENSORLESS_HOMING requires X_MIN_ENDSTOP_HIT_STATE HIGH for X MIN homing with TMC2209."
+ #error "SENSORLESS_HOMING requires X_MIN_ENDSTOP_HIT_STATE HIGH for X MIN homing with TMC2209/2240."
#else
#error "SENSORLESS_HOMING requires X_MIN_ENDSTOP_HIT_STATE LOW for X MIN homing."
#endif
#elif X_HOME_TO_MAX && X_MAX_ENDSTOP_HIT_STATE != _HIT_STATE
#if _HIT_STATE
- #error "SENSORLESS_HOMING requires X_MAX_ENDSTOP_HIT_STATE HIGH for X MAX homing with TMC2209."
+ #error "SENSORLESS_HOMING requires X_MAX_ENDSTOP_HIT_STATE HIGH for X MAX homing with TMC2209/2240."
#else
#error "SENSORLESS_HOMING requires X_MAX_ENDSTOP_HIT_STATE LOW for X MAX homing."
#endif
@@ -3399,16 +3399,16 @@ static_assert(NUM_SERVOS <= NUM_SERVO_PLUGS, "NUM_SERVOS (or some servo index) i
#endif
#if Y_SENSORLESS
- #define _HIT_STATE AXIS_DRIVER_TYPE(Y,TMC2209)
+ #define _HIT_STATE AXIS_DRIVER_TYPE(Y,TMC2209) || AXIS_DRIVER_TYPE(Y,TMC2240)
#if Y_HOME_TO_MIN && Y_MIN_ENDSTOP_HIT_STATE != _HIT_STATE
#if _HIT_STATE
- #error "SENSORLESS_HOMING requires Y_MIN_ENDSTOP_HIT_STATE HIGH for Y MIN homing with TMC2209."
+ #error "SENSORLESS_HOMING requires Y_MIN_ENDSTOP_HIT_STATE HIGH for Y MIN homing with TMC2209/2240."
#else
#error "SENSORLESS_HOMING requires Y_MIN_ENDSTOP_HIT_STATE LOW for Y MIN homing."
#endif
#elif Y_HOME_TO_MAX && Y_MAX_ENDSTOP_HIT_STATE != _HIT_STATE
#if _HIT_STATE
- #error "SENSORLESS_HOMING requires Y_MAX_ENDSTOP_HIT_STATE HIGH for Y MAX homing with TMC2209."
+ #error "SENSORLESS_HOMING requires Y_MAX_ENDSTOP_HIT_STATE HIGH for Y MAX homing with TMC2209/2240."
#else
#error "SENSORLESS_HOMING requires Y_MAX_ENDSTOP_HIT_STATE LOW for Y MAX homing."
#endif
@@ -3417,16 +3417,16 @@ static_assert(NUM_SERVOS <= NUM_SERVO_PLUGS, "NUM_SERVOS (or some servo index) i
#endif
#if Z_SENSORLESS
- #define _HIT_STATE AXIS_DRIVER_TYPE(Z,TMC2209)
+ #define _HIT_STATE AXIS_DRIVER_TYPE(Z,TMC2209) || AXIS_DRIVER_TYPE(Z,TMC2240)
#if Z_HOME_TO_MIN && Z_MIN_ENDSTOP_HIT_STATE != _HIT_STATE
#if _HIT_STATE
- #error "SENSORLESS_HOMING requires Z_MIN_ENDSTOP_HIT_STATE HIGH for Z MIN homing with TMC2209."
+ #error "SENSORLESS_HOMING requires Z_MIN_ENDSTOP_HIT_STATE HIGH for Z MIN homing with TMC2209/2240."
#else
#error "SENSORLESS_HOMING requires Z_MIN_ENDSTOP_HIT_STATE LOW for Z MIN homing."
#endif
#elif Z_HOME_TO_MAX && Z_MAX_ENDSTOP_HIT_STATE != _HIT_STATE
#if _HIT_STATE
- #error "SENSORLESS_HOMING requires Z_MAX_ENDSTOP_HIT_STATE HIGH for Z MAX homing with TMC2209."
+ #error "SENSORLESS_HOMING requires Z_MAX_ENDSTOP_HIT_STATE HIGH for Z MAX homing with TMC2209/2240."
#else
#error "SENSORLESS_HOMING requires Z_MAX_ENDSTOP_HIT_STATE LOW for Z MAX homing."
#endif
@@ -3435,16 +3435,16 @@ static_assert(NUM_SERVOS <= NUM_SERVO_PLUGS, "NUM_SERVOS (or some servo index) i
#endif
#if I_SENSORLESS
- #define _HIT_STATE AXIS_DRIVER_TYPE(I,TMC2209)
+ #define _HIT_STATE AXIS_DRIVER_TYPE(I,TMC2209) || AXIS_DRIVER_TYPE(I,TMC2240)
#if I_HOME_TO_MIN && I_MIN_ENDSTOP_HIT_STATE != _HIT_STATE
#if _HIT_STATE
- #error "SENSORLESS_HOMING requires I_MIN_ENDSTOP_HIT_STATE HIGH for I MIN homing with TMC2209."
+ #error "SENSORLESS_HOMING requires I_MIN_ENDSTOP_HIT_STATE HIGH for I MIN homing with TMC2209/2240."
#else
#error "SENSORLESS_HOMING requires I_MIN_ENDSTOP_HIT_STATE LOW for I MIN homing."
#endif
#elif I_HOME_TO_MAX && I_MAX_ENDSTOP_HIT_STATE != _HIT_STATE
#if _HIT_STATE
- #error "SENSORLESS_HOMING requires I_MAX_ENDSTOP_HIT_STATE HIGH for I MAX homing with TMC2209."
+ #error "SENSORLESS_HOMING requires I_MAX_ENDSTOP_HIT_STATE HIGH for I MAX homing with TMC2209/2240."
#else
#error "SENSORLESS_HOMING requires I_MAX_ENDSTOP_HIT_STATE LOW for I MAX homing."
#endif
@@ -3453,16 +3453,16 @@ static_assert(NUM_SERVOS <= NUM_SERVO_PLUGS, "NUM_SERVOS (or some servo index) i
#endif
#if J_SENSORLESS
- #define _HIT_STATE AXIS_DRIVER_TYPE(J,TMC2209)
+ #define _HIT_STATE AXIS_DRIVER_TYPE(J,TMC2209) || AXIS_DRIVER_TYPE(J,TMC2240)
#if J_HOME_TO_MIN && J_MIN_ENDSTOP_HIT_STATE != _HIT_STATE
#if _HIT_STATE
- #error "SENSORLESS_HOMING requires J_MIN_ENDSTOP_HIT_STATE HIGH for J MIN homing with TMC2209."
+ #error "SENSORLESS_HOMING requires J_MIN_ENDSTOP_HIT_STATE HIGH for J MIN homing with TMC2209/2240."
#else
#error "SENSORLESS_HOMING requires J_MIN_ENDSTOP_HIT_STATE LOW for J MIN homing."
#endif
#elif J_HOME_TO_MAX && J_MAX_ENDSTOP_HIT_STATE != _HIT_STATE
#if _HIT_STATE
- #error "SENSORLESS_HOMING requires J_MAX_ENDSTOP_HIT_STATE HIGH for J MAX homing with TMC2209."
+ #error "SENSORLESS_HOMING requires J_MAX_ENDSTOP_HIT_STATE HIGH for J MAX homing with TMC2209/2240."
#else
#error "SENSORLESS_HOMING requires J_MAX_ENDSTOP_HIT_STATE LOW for J MAX homing."
#endif
@@ -3471,16 +3471,16 @@ static_assert(NUM_SERVOS <= NUM_SERVO_PLUGS, "NUM_SERVOS (or some servo index) i
#endif
#if K_SENSORLESS
- #define _HIT_STATE AXIS_DRIVER_TYPE(K,TMC2209)
+ #define _HIT_STATE AXIS_DRIVER_TYPE(K,TMC2209) || AXIS_DRIVER_TYPE(K,TMC2240)
#if K_HOME_TO_MIN && K_MIN_ENDSTOP_HIT_STATE != _HIT_STATE
#if _HIT_STATE
- #error "SENSORLESS_HOMING requires K_MIN_ENDSTOP_HIT_STATE HIGH for K MIN homing with TMC2209."
+ #error "SENSORLESS_HOMING requires K_MIN_ENDSTOP_HIT_STATE HIGH for K MIN homing with TMC2209/2240."
#else
#error "SENSORLESS_HOMING requires K_MIN_ENDSTOP_HIT_STATE LOW for K MIN homing."
#endif
#elif K_HOME_TO_MAX && K_MAX_ENDSTOP_HIT_STATE != _HIT_STATE
#if _HIT_STATE
- #error "SENSORLESS_HOMING requires K_MAX_ENDSTOP_HIT_STATE HIGH for K MAX homing with TMC2209."
+ #error "SENSORLESS_HOMING requires K_MAX_ENDSTOP_HIT_STATE HIGH for K MAX homing with TMC2209/2240."
#else
#error "SENSORLESS_HOMING requires K_MAX_ENDSTOP_HIT_STATE LOW for K MAX homing."
#endif
@@ -3489,16 +3489,16 @@ static_assert(NUM_SERVOS <= NUM_SERVO_PLUGS, "NUM_SERVOS (or some servo index) i
#endif
#if U_SENSORLESS
- #define _HIT_STATE AXIS_DRIVER_TYPE(U,TMC2209)
+ #define _HIT_STATE AXIS_DRIVER_TYPE(U,TMC2209) || AXIS_DRIVER_TYPE(U,TMC2240)
#if U_HOME_TO_MIN && U_MIN_ENDSTOP_HIT_STATE != _HIT_STATE
#if _HIT_STATE
- #error "SENSORLESS_HOMING requires U_MIN_ENDSTOP_HIT_STATE HIGH for U MIN homing with TMC2209."
+ #error "SENSORLESS_HOMING requires U_MIN_ENDSTOP_HIT_STATE HIGH for U MIN homing with TMC2209/2240."
#else
#error "SENSORLESS_HOMING requires U_MIN_ENDSTOP_HIT_STATE LOW for U MIN homing."
#endif
#elif U_HOME_TO_MAX && U_MAX_ENDSTOP_HIT_STATE != _HIT_STATE
#if _HIT_STATE
- #error "SENSORLESS_HOMING requires U_MAX_ENDSTOP_HIT_STATE HIGH for U MAX homing with TMC2209."
+ #error "SENSORLESS_HOMING requires U_MAX_ENDSTOP_HIT_STATE HIGH for U MAX homing with TMC2209/2240."
#else
#error "SENSORLESS_HOMING requires U_MAX_ENDSTOP_HIT_STATE LOW for U MAX homing."
#endif
@@ -3507,16 +3507,16 @@ static_assert(NUM_SERVOS <= NUM_SERVO_PLUGS, "NUM_SERVOS (or some servo index) i
#endif
#if V_SENSORLESS
- #define _HIT_STATE AXIS_DRIVER_TYPE(V,TMC2209)
+ #define _HIT_STATE AXIS_DRIVER_TYPE(V,TMC2209) || AXIS_DRIVER_TYPE(V,TMC2240)
#if V_HOME_TO_MIN && V_MIN_ENDSTOP_HIT_STATE != _HIT_STATE
#if _HIT_STATE
- #error "SENSORLESS_HOMING requires V_MIN_ENDSTOP_HIT_STATE HIGH for V MIN homing with TMC2209."
+ #error "SENSORLESS_HOMING requires V_MIN_ENDSTOP_HIT_STATE HIGH for V MIN homing with TMC2209/2240."
#else
#error "SENSORLESS_HOMING requires V_MIN_ENDSTOP_HIT_STATE LOW for V MIN homing."
#endif
#elif V_HOME_TO_MAX && V_MAX_ENDSTOP_HIT_STATE != _HIT_STATE
#if _HIT_STATE
- #error "SENSORLESS_HOMING requires V_MAX_ENDSTOP_HIT_STATE HIGH for V MAX homing with TMC2209."
+ #error "SENSORLESS_HOMING requires V_MAX_ENDSTOP_HIT_STATE HIGH for V MAX homing with TMC2209/2240."
#else
#error "SENSORLESS_HOMING requires V_MAX_ENDSTOP_HIT_STATE LOW for V MAX homing."
#endif
@@ -3525,16 +3525,16 @@ static_assert(NUM_SERVOS <= NUM_SERVO_PLUGS, "NUM_SERVOS (or some servo index) i
#endif
#if W_SENSORLESS
- #define _HIT_STATE AXIS_DRIVER_TYPE(W,TMC2209)
+ #define _HIT_STATE AXIS_DRIVER_TYPE(W,TMC2209) || AXIS_DRIVER_TYPE(W,TMC2240)
#if W_HOME_TO_MIN && W_MIN_ENDSTOP_HIT_STATE != _HIT_STATE
#if _HIT_STATE
- #error "SENSORLESS_HOMING requires W_MIN_ENDSTOP_HIT_STATE HIGH for W MIN homing with TMC2209."
+ #error "SENSORLESS_HOMING requires W_MIN_ENDSTOP_HIT_STATE HIGH for W MIN homing with TMC2209/2240."
#else
#error "SENSORLESS_HOMING requires W_MIN_ENDSTOP_HIT_STATE LOW for W MIN homing."
#endif
#elif W_HOME_TO_MAX && W_MAX_ENDSTOP_HIT_STATE != _HIT_STATE
#if _HIT_STATE
- #error "SENSORLESS_HOMING requires W_MAX_ENDSTOP_HIT_STATE HIGH for W MAX homing with TMC2209."
+ #error "SENSORLESS_HOMING requires W_MAX_ENDSTOP_HIT_STATE HIGH for W MAX homing with TMC2209/2240."
#else
#error "SENSORLESS_HOMING requires W_MAX_ENDSTOP_HIT_STATE LOW for W MAX homing."
#endif
@@ -3631,11 +3631,11 @@ static_assert(NUM_SERVOS <= NUM_SERVO_PLUGS, "NUM_SERVOS (or some servo index) i
// Other TMC feature requirements
#if ENABLED(SENSORLESS_HOMING) && !HAS_STALLGUARD
- #error "SENSORLESS_HOMING requires TMC2130, TMC2160, TMC2209, TMC2660, or TMC5160 stepper drivers."
+ #error "SENSORLESS_HOMING requires TMC2130, TMC2160, TMC2209, TMC2240, TMC2660, or TMC5160 stepper drivers."
#elif ENABLED(SENSORLESS_PROBING) && !HAS_STALLGUARD
- #error "SENSORLESS_PROBING requires TMC2130, TMC2160, TMC2209, TMC2660, or TMC5160 stepper drivers."
+ #error "SENSORLESS_PROBING requires TMC2130, TMC2160, TMC2209, TMC2240, TMC2660, or TMC5160 stepper drivers."
#elif STEALTHCHOP_ENABLED && !HAS_STEALTHCHOP
- #error "STEALTHCHOP requires TMC2130, TMC2160, TMC2208, TMC2209, or TMC5160 stepper drivers."
+ #error "STEALTHCHOP requires TMC2130, TMC2160, TMC2208, TMC2209, TMC2240, or TMC5160 stepper drivers."
#endif
/**
diff --git a/Marlin/src/module/stepper/trinamic.cpp b/Marlin/src/module/stepper/trinamic.cpp
index 3ec8ff4325..0f4a8aa89c 100644
--- a/Marlin/src/module/stepper/trinamic.cpp
+++ b/Marlin/src/module/stepper/trinamic.cpp
@@ -40,15 +40,37 @@ enum StealthIndex : uint8_t {
};
#define TMC_INIT(ST, STEALTH_INDEX) tmc_init(stepper##ST, ST##_CURRENT, ST##_MICROSTEPS, ST##_HYBRID_THRESHOLD, stealthchop_by_axis[STEALTH_INDEX], chopper_timing_##ST, ST##_INTERPOLATE, ST##_HOLD_MULTIPLIER)
+//
// IC = TMC model number
// ST = Stepper object letter
// L = Label characters
// AI = Axis Enum Index
// SWHW = SW/SH UART selection
+//
+
#if ENABLED(TMC_USE_SW_SPI)
- #define __TMC_SPI_DEFINE(IC, ST, L, AI) TMCMarlin stepper##ST(ST##_CS_PIN, float(ST##_RSENSE), TMC_SPI_MOSI, TMC_SPI_MISO, TMC_SPI_SCK, ST##_CHAIN_POS)
+ #define __TMC_SPI_RSENSE_DEFINE(IC, ST, L, LI, AI) TMCMarlin stepper##ST(ST##_CS_PIN, float(ST##_RSENSE), TMC_SPI_MOSI, TMC_SPI_MISO, TMC_SPI_SCK, ST##_CHAIN_POS)
+ #define __TMC_SPI_DEFINE_TMC2240(IC, ST, L, LI, AI) TMCMarlin stepper##ST(ST##_CS_PIN, TMC_SPI_MOSI, TMC_SPI_MISO, TMC_SPI_SCK, ST##_CHAIN_POS)
#else
- #define __TMC_SPI_DEFINE(IC, ST, L, AI) TMCMarlin stepper##ST(ST##_CS_PIN, float(ST##_RSENSE), ST##_CHAIN_POS)
+ #define __TMC_SPI_RSENSE_DEFINE(IC, ST, L, LI, AI) TMCMarlin stepper##ST(ST##_CS_PIN, float(ST##_RSENSE), ST##_CHAIN_POS)
+ #define __TMC_SPI_DEFINE_TMC2240(IC, ST, L, LI, AI) TMCMarlin stepper##ST(ST##_CS_PIN, ST##_CHAIN_POS)
+#endif
+#define __TMC_SPI_DEFINE_TMC2100 __TMC_SPI_RSENSE_DEFINE
+#define __TMC_SPI_DEFINE_TMC2130 __TMC_SPI_RSENSE_DEFINE
+#define __TMC_SPI_DEFINE_TMC2160 __TMC_SPI_RSENSE_DEFINE
+#define __TMC_SPI_DEFINE_TMC2208 __TMC_SPI_RSENSE_DEFINE
+#define __TMC_SPI_DEFINE_TMC2209 __TMC_SPI_RSENSE_DEFINE
+#define __TMC_SPI_DEFINE_TMC2660 __TMC_SPI_RSENSE_DEFINE
+#define __TMC_SPI_DEFINE_TMC5130 __TMC_SPI_RSENSE_DEFINE
+#define __TMC_SPI_DEFINE_TMC5160 __TMC_SPI_RSENSE_DEFINE
+
+#define __TMC_SPI_DEFINE(IC, ST, LandI, AI) __TMC_SPI_DEFINE_##IC(IC, ST, LandI, AI)
+#define _TMC_SPI_DEFINE(IC, ST, AI) __TMC_SPI_DEFINE(IC, ST, TMC_##ST##_LABEL, AI)
+#define TMC_SPI_DEFINE(ST, AI) _TMC_SPI_DEFINE(ST##_DRIVER_TYPE, ST, AI##_AXIS)
+#if ENABLED(DISTINCT_E_FACTORS)
+ #define TMC_SPI_DEFINE_E(AI) TMC_SPI_DEFINE(E##AI, E##AI)
+#else
+ #define TMC_SPI_DEFINE_E(AI) TMC_SPI_DEFINE(E##AI, E)
#endif
#if ENABLED(TMC_SERIAL_MULTIPLEXER)
@@ -59,17 +81,11 @@ enum StealthIndex : uint8_t {
#define TMC_UART_SW_DEFINE(IC, ST, L, AI) TMCMarlin stepper##ST(ST##_SERIAL_RX_PIN, ST##_SERIAL_TX_PIN, float(ST##_RSENSE), ST##_SLAVE_ADDRESS)
-#define _TMC_SPI_DEFINE(IC, ST, AI) __TMC_SPI_DEFINE(IC, ST, TMC_##ST##_LABEL, AI)
-#define TMC_SPI_DEFINE(ST, AI) _TMC_SPI_DEFINE(ST##_DRIVER_TYPE, ST, AI##_AXIS)
-
#define _TMC_UART_DEFINE(SWHW, IC, ST, AI) TMC_UART_##SWHW##_DEFINE(IC, ST, TMC_##ST##_LABEL, AI)
#define TMC_UART_DEFINE(SWHW, ST, AI) _TMC_UART_DEFINE(SWHW, ST##_DRIVER_TYPE, ST, AI##_AXIS)
-
#if ENABLED(DISTINCT_E_FACTORS)
- #define TMC_SPI_DEFINE_E(AI) TMC_SPI_DEFINE(E##AI, E##AI)
#define TMC_UART_DEFINE_E(SWHW, AI) TMC_UART_DEFINE(SWHW, E##AI, E##AI)
#else
- #define TMC_SPI_DEFINE_E(AI) TMC_SPI_DEFINE(E##AI, E)
#define TMC_UART_DEFINE_E(SWHW, AI) TMC_UART_DEFINE(SWHW, E##AI, E)
#endif
@@ -219,7 +235,10 @@ enum StealthIndex : uint8_t {
#if HAS_DRIVER(TMC2130)
template
- void tmc_init(TMCMarlin &st, const uint16_t mA, const uint16_t microsteps, const uint32_t hyb_thrs, const bool stealth, const chopper_timing_t &chop_init, const bool interpolate, float hold_multiplier) {
+ void tmc_init(TMCMarlin &st,
+ const uint16_t mA, const uint16_t microsteps, const uint32_t hyb_thrs, const bool stealth,
+ const chopper_timing_t &chop_init, const bool interpolate, float hold_multiplier
+ ) {
st.begin();
CHOPCONF_t chopconf{0};
@@ -254,7 +273,10 @@ enum StealthIndex : uint8_t {
#if HAS_DRIVER(TMC2160)
template
- void tmc_init(TMCMarlin &st, const uint16_t mA, const uint16_t microsteps, const uint32_t hyb_thrs, const bool stealth, const chopper_timing_t &chop_init, const bool interpolate, float hold_multiplier) {
+ void tmc_init(TMCMarlin &st,
+ const uint16_t mA, const uint16_t microsteps, const uint32_t hyb_thrs, const bool stealth,
+ const chopper_timing_t &chop_init, const bool interpolate, float hold_multiplier
+ ) {
st.begin();
CHOPCONF_t chopconf{0};
@@ -670,7 +692,10 @@ enum StealthIndex : uint8_t {
#if HAS_DRIVER(TMC2208)
template
- void tmc_init(TMCMarlin &st, const uint16_t mA, const uint16_t microsteps, const uint32_t hyb_thrs, const bool stealth, const chopper_timing_t &chop_init, const bool interpolate, float hold_multiplier) {
+ void tmc_init(TMCMarlin &st,
+ const uint16_t mA, const uint16_t microsteps, const uint32_t hyb_thrs, const bool stealth,
+ const chopper_timing_t &chop_init, const bool interpolate, float hold_multiplier
+ ) {
TMC2208_n::GCONF_t gconf{0};
gconf.pdn_disable = true; // Use UART
gconf.mstep_reg_select = true; // Select microsteps with UART
@@ -712,7 +737,10 @@ enum StealthIndex : uint8_t {
#if HAS_DRIVER(TMC2209)
template
- void tmc_init(TMCMarlin &st, const uint16_t mA, const uint16_t microsteps, const uint32_t hyb_thrs, const bool stealth, const chopper_timing_t &chop_init, const bool interpolate, float hold_multiplier) {
+ void tmc_init(TMCMarlin &st,
+ const uint16_t mA, const uint16_t microsteps, const uint32_t hyb_thrs, const bool stealth,
+ const chopper_timing_t &chop_init, const bool interpolate, float hold_multiplier
+ ) {
TMC2208_n::GCONF_t gconf{0};
gconf.pdn_disable = true; // Use UART
gconf.mstep_reg_select = true; // Select microsteps with UART
@@ -752,9 +780,58 @@ enum StealthIndex : uint8_t {
}
#endif // TMC2209
+#if HAS_DRIVER(TMC2240)
+ template
+ void tmc_init(TMCMarlin &st,
+ const uint16_t mA, const uint16_t microsteps, const uint32_t hyb_thrs, const bool stealth,
+ const chopper_timing_t &chop_init, const bool interpolate, float hold_multiplier
+ ) {
+ st.begin();
+
+ st.Rref = TMC2240_Rref;
+ TMC2240_n::DRV_CONF_t drv_conf{0};
+ drv_conf.current_range = TMC2240_CURRENT_RANGE;
+ drv_conf.slope_control = TMC2240_SLOPE_CONTROL;
+ st.DRV_CONF(drv_conf.sr);
+
+ CHOPCONF_t chopconf{0};
+ chopconf.tbl = 0b01;
+ chopconf.toff = chop_init.toff;
+ chopconf.intpol = interpolate;
+ chopconf.hend = chop_init.hend + 3;
+ chopconf.hstrt = chop_init.hstrt - 1;
+ TERN_(EDGE_STEPPING, chopconf.dedge = true);
+ st.CHOPCONF(chopconf.sr);
+
+ st.rms_current(mA, hold_multiplier);
+ st.microsteps(microsteps);
+ st.iholddelay(10);
+ st.TPOWERDOWN(128); // ~2s until driver lowers to hold current
+
+ st.en_pwm_mode(stealth);
+ st.stored.stealthChop_enabled = stealth;
+
+ TMC2240_n::PWMCONF_t pwmconf{0};
+ pwmconf.pwm_lim = 12;
+ pwmconf.pwm_reg = 8;
+ pwmconf.pwm_autograd = true;
+ pwmconf.pwm_autoscale = true;
+ pwmconf.pwm_freq = 0b01;
+ pwmconf.pwm_grad = 14;
+ pwmconf.pwm_ofs = 36;
+ st.PWMCONF(pwmconf.sr);
+
+ TERN(HYBRID_THRESHOLD, st.set_pwm_thrs(hyb_thrs), UNUSED(hyb_thrs));
+ st.GSTAT(); // Clear GSTAT
+ }
+#endif // TMC2240
+
#if HAS_DRIVER(TMC2660)
template
- void tmc_init(TMCMarlin &st, const uint16_t mA, const uint16_t microsteps, const uint32_t, const bool, const chopper_timing_t &chop_init, const bool interpolate, float hold_multiplier) {
+ void tmc_init(TMCMarlin &st,
+ const uint16_t mA, const uint16_t microsteps, const uint32_t, const bool,
+ const chopper_timing_t &chop_init, const bool interpolate, float hold_multiplier
+ ) {
st.begin();
TMC2660_n::CHOPCONF_t chopconf{0};
@@ -776,7 +853,10 @@ enum StealthIndex : uint8_t {
#if HAS_DRIVER(TMC5130)
template
- void tmc_init(TMCMarlin &st, const uint16_t mA, const uint16_t microsteps, const uint32_t hyb_thrs, const bool stealth, const chopper_timing_t &chop_init, const bool interpolate, float hold_multiplier) {
+ void tmc_init(TMCMarlin &st,
+ const uint16_t mA, const uint16_t microsteps, const uint32_t hyb_thrs, const bool stealth,
+ const chopper_timing_t &chop_init, const bool interpolate, float hold_multiplier
+ ) {
st.begin();
CHOPCONF_t chopconf{0};
@@ -811,7 +891,10 @@ enum StealthIndex : uint8_t {
#if HAS_DRIVER(TMC5160)
template
- void tmc_init(TMCMarlin &st, const uint16_t mA, const uint16_t microsteps, const uint32_t hyb_thrs, const bool stealth, const chopper_timing_t &chop_init, const bool interpolate, float hold_multiplier) {
+ void tmc_init(TMCMarlin &st,
+ const uint16_t mA, const uint16_t microsteps, const uint32_t hyb_thrs, const bool stealth,
+ const chopper_timing_t &chop_init, const bool interpolate, float hold_multiplier
+ ) {
st.begin();
CHOPCONF_t chopconf{0};
@@ -842,6 +925,7 @@ enum StealthIndex : uint8_t {
st.PWMCONF(pwmconf.sr);
TERN(HYBRID_THRESHOLD, st.set_pwm_thrs(hyb_thrs), UNUSED(hyb_thrs));
+
st.GSTAT(); // Clear GSTAT
}
#endif // TMC5160
diff --git a/Marlin/src/module/stepper/trinamic.h b/Marlin/src/module/stepper/trinamic.h
index 0fd48f18cb..d43a1d231b 100644
--- a/Marlin/src/module/stepper/trinamic.h
+++ b/Marlin/src/module/stepper/trinamic.h
@@ -38,6 +38,7 @@
#define CLASS_TMC2160 TMC2160Stepper
#define CLASS_TMC2208 TMC2208Stepper
#define CLASS_TMC2209 TMC2209Stepper
+#define CLASS_TMC2240 TMC2240Stepper
#define CLASS_TMC2660 TMC2660Stepper
#define CLASS_TMC5130 TMC5130Stepper
#define CLASS_TMC5160 TMC5160Stepper
diff --git a/buildroot/tests/BTT_BTT002 b/buildroot/tests/BTT_BTT002
index 121aace895..054b179bfe 100755
--- a/buildroot/tests/BTT_BTT002
+++ b/buildroot/tests/BTT_BTT002
@@ -12,7 +12,8 @@ set -e
restore_configs
opt_set MOTHERBOARD BOARD_BTT_BTT002_V1_0 \
SERIAL_PORT 1 \
- X_DRIVER_TYPE TMC2209 Y_DRIVER_TYPE TMC2130
+ X_DRIVER_TYPE TMC2209 Y_DRIVER_TYPE TMC2130 Z_DRIVER_TYPE TMC2240 \
+ X_CURRENT_HOME '(X_CURRENT - 100)' Y_CURRENT_HOME '(Y_CURRENT - 100)'
opt_enable SENSORLESS_HOMING X_STALL_SENSITIVITY Y_STALL_SENSITIVITY SPI_ENDSTOPS
exec_test $1 $2 "BigTreeTech BTT002 Default Configuration plus TMC steppers" "$3"
From db137df6df5e27dc23d68ef31a6be20ea185bd74 Mon Sep 17 00:00:00 2001
From: Scott Lahteine
Date: Sat, 24 May 2025 03:12:25 -0500
Subject: [PATCH 011/326] =?UTF-8?q?=F0=9F=94=A8=20TMC2240=20Makefile=20upd?=
=?UTF-8?q?ate?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
Marlin/Makefile | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/Marlin/Makefile b/Marlin/Makefile
index ce26bd3572..9acab53673 100644
--- a/Marlin/Makefile
+++ b/Marlin/Makefile
@@ -798,10 +798,10 @@ endif
ifeq ($(TMC), 1)
LIB_CXXSRC += TMCStepper.cpp COOLCONF.cpp DRV_STATUS.cpp IHOLD_IRUN.cpp \
- CHOPCONF.cpp GCONF.cpp PWMCONF.cpp DRV_CONF.cpp DRVCONF.cpp DRVCTRL.cpp \
- DRVSTATUS.cpp ENCMODE.cpp RAMP_STAT.cpp SGCSCONF.cpp SHORT_CONF.cpp \
- SMARTEN.cpp SW_MODE.cpp SW_SPI.cpp TMC2130Stepper.cpp TMC2208Stepper.cpp \
- TMC2209Stepper.cpp TMC2660Stepper.cpp TMC5130Stepper.cpp TMC5160Stepper.cpp
+ CHOPCONF.cpp GCONF.cpp PWMCONF.cpp DRV_CONF.cpp DRVCONF.cpp DRVCTRL.cpp DRVSTATUS.cpp \
+ GLOBAL_SCALER.cpp SLAVECONF.cpp IOIN.cpp ENCMODE.cpp RAMP_STAT.cpp SGCSCONF.cpp \
+ SHORT_CONF.cpp SMARTEN.cpp SW_MODE.cpp SW_SPI.cpp TMC2130Stepper.cpp TMC2208Stepper.cpp \
+ TMC2209Stepper.cpp TMC2240Stepper.cpp TMC2660Stepper.cpp TMC5130Stepper.cpp TMC5160Stepper.cpp
endif
ifeq ($(RELOC_WORKAROUND), 1)
From 86c564121e111c94a9bc4d2488ccbf336ba7184c Mon Sep 17 00:00:00 2001
From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com>
Date: Sat, 24 May 2025 13:38:51 -0700
Subject: [PATCH 012/326] =?UTF-8?q?=F0=9F=A9=B9=20Fix=20Bluesky=20badge=20?=
=?UTF-8?q?(#27879)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 50dfddda9a..69979f4884 100644
--- a/README.md
+++ b/README.md
@@ -9,7 +9,7 @@
-
+
From d76c8c1fbd8d1d1e9fd186d6a2f42f3d0b8d76be Mon Sep 17 00:00:00 2001
From: ellensp <530024+ellensp@users.noreply.github.com>
Date: Sun, 25 May 2025 09:49:44 +1200
Subject: [PATCH 013/326] =?UTF-8?q?=F0=9F=A9=B9=20Fix=20ProUI=20Linear=20A?=
=?UTF-8?q?dvance=20menu=20(#27878)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Followup to #27818
---
Marlin/src/lcd/e3v2/proui/dwin.cpp | 6 ++++--
buildroot/tests/STM32F103RE_creality | 5 +++--
2 files changed, 7 insertions(+), 4 deletions(-)
diff --git a/Marlin/src/lcd/e3v2/proui/dwin.cpp b/Marlin/src/lcd/e3v2/proui/dwin.cpp
index 7574439051..08782553ba 100644
--- a/Marlin/src/lcd/e3v2/proui/dwin.cpp
+++ b/Marlin/src/lcd/e3v2/proui/dwin.cpp
@@ -3546,7 +3546,8 @@ void drawTuneMenu() {
EDIT_ITEM(ICON_JDmm, MSG_JUNCTION_DEVIATION, onDrawPFloat3Menu, setJDmm, &planner.junction_deviation_mm);
#endif
#if ENABLED(PROUI_ITEM_ADVK)
- EDIT_ITEM(ICON_MaxAccelerated, MSG_ADVANCE_K, onDrawPFloat3Menu, setLA_K, &planner.get_advance_k());
+ float editable_decimal = planner.get_advance_k();
+ EDIT_ITEM(ICON_MaxAccelerated, MSG_ADVANCE_K, onDrawPFloat3Menu, setLA_K, &editable_decimal);
#endif
#if HAS_LOCKSCREEN
MENU_ITEM(ICON_Lock, MSG_LOCKSCREEN, onDrawMenuItem, dwinLockScreen);
@@ -3684,7 +3685,8 @@ void drawMotionMenu() {
MENU_ITEM(ICON_Homing, MSG_HOMING_FEEDRATE, onDrawSubMenu, drawHomingFRMenu);
#endif
#if ENABLED(LIN_ADVANCE)
- EDIT_ITEM(ICON_MaxAccelerated, MSG_ADVANCE_K, onDrawPFloat3Menu, setLA_K, &planner.get_advance_k());
+ float editable_decimal = planner.get_advance_k();
+ EDIT_ITEM(ICON_MaxAccelerated, MSG_ADVANCE_K, onDrawPFloat3Menu, setLA_K, &editable_decimal);
#endif
#if ENABLED(SHAPING_MENU)
MENU_ITEM(ICON_InputShaping, MSG_INPUT_SHAPING, onDrawSubMenu, drawInputShaping_menu);
diff --git a/buildroot/tests/STM32F103RE_creality b/buildroot/tests/STM32F103RE_creality
index 0a1b1bc79d..5681688929 100755
--- a/buildroot/tests/STM32F103RE_creality
+++ b/buildroot/tests/STM32F103RE_creality
@@ -26,9 +26,10 @@ exec_test $1 $2 "Ender-3 V2 - MarlinUI (Games, UBL+BLTOUCH, MPCTEMP, LCD_ENDSTOP
use_example_configs "Creality/Ender-3 S1/STM32F1"
opt_disable DWIN_CREALITY_LCD Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN AUTO_BED_LEVELING_BILINEAR CANCEL_OBJECTS FWRETRACT EVENT_GCODE_SD_ABORT
-opt_enable DWIN_LCD_PROUI INDIVIDUAL_AXIS_HOMING_SUBMENU SET_PROGRESS_MANUALLY SET_PROGRESS_PERCENT STATUS_MESSAGE_SCROLLING \
+opt_enable DWIN_LCD_PROUI INDIVIDUAL_AXIS_HOMING_SUBMENU PID_AUTOTUNE_MENU PID_EDIT_MENU \
+ SET_PROGRESS_MANUALLY SET_PROGRESS_PERCENT STATUS_MESSAGE_SCROLLING \
SOUND_MENU_ITEM PRINTCOUNTER NOZZLE_PARK_FEATURE ADVANCED_PAUSE_FEATURE FILAMENT_RUNOUT_SENSOR \
- BLTOUCH Z_SAFE_HOMING AUTO_BED_LEVELING_UBL MESH_EDIT_MENU LCD_BED_TRAMMING \
+ BLTOUCH Z_SAFE_HOMING AUTO_BED_LEVELING_UBL MESH_EDIT_MENU LCD_BED_TRAMMING LIN_ADVANCE \
LIMITED_MAX_FR_EDITING LIMITED_MAX_ACCEL_EDITING LIMITED_JERK_EDITING BAUD_RATE_GCODE \
CASE_LIGHT_ENABLE CASE_LIGHT_MENU CASE_LIGHT_NO_BRIGHTNESS
opt_set PREHEAT_3_LABEL '"CUSTOM"' PREHEAT_3_TEMP_HOTEND 240 PREHEAT_3_TEMP_BED 60 PREHEAT_3_FAN_SPEED 128 BOOTSCREEN_TIMEOUT 1100 CASE_LIGHT_PIN 4
From 4f93f31af0183af5a89d7ceb095d20924ea9b91e Mon Sep 17 00:00:00 2001
From: ellensp <530024+ellensp@users.noreply.github.com>
Date: Sun, 25 May 2025 09:53:52 +1200
Subject: [PATCH 014/326] =?UTF-8?q?=F0=9F=94=A8=20Fix=20Windows/ReARM=20up?=
=?UTF-8?q?load=20(#27872)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
Marlin/src/HAL/LPC1768/upload_extra_script.py | 19 +++++++++++++------
1 file changed, 13 insertions(+), 6 deletions(-)
diff --git a/Marlin/src/HAL/LPC1768/upload_extra_script.py b/Marlin/src/HAL/LPC1768/upload_extra_script.py
index ce241c4658..f9be140592 100755
--- a/Marlin/src/HAL/LPC1768/upload_extra_script.py
+++ b/Marlin/src/HAL/LPC1768/upload_extra_script.py
@@ -54,18 +54,25 @@ if pioutil.is_pio_build():
final_drive_name = drive + ':'
# print ('disc check: {}'.format(final_drive_name))
try:
- volume_info = str(subprocess.check_output('cmd /C dir ' + final_drive_name, stderr=subprocess.STDOUT))
+ volume_info = str(subprocess.check_output('cmd /C vol ' + final_drive_name, stderr=subprocess.STDOUT))
except Exception as e:
print ('error:{}'.format(e))
continue
else:
- if target_drive in volume_info and not target_file_found: # set upload if not found target file yet
- target_drive_found = True
+ if target_drive in volume_info: # set upload
upload_disk = PureWindowsPath(final_drive_name)
- if target_filename in volume_info:
- if not target_file_found:
+ target_drive_found = True
+ break
+ try:
+ dir_info = str(subprocess.check_output('cmd /C dir ' + final_drive_name, stderr=subprocess.STDOUT))
+ except Exception as e:
+ print ('error:{}'.format(e))
+ continue
+ else:
+ if target_filename in dir_info:
upload_disk = PureWindowsPath(final_drive_name)
- target_file_found = True
+ target_file_found = True
+ break
elif current_OS == 'Linux':
#
From 2976bb48ede7834512551a921b04e260f73acf07 Mon Sep 17 00:00:00 2001
From: Scott Lahteine
Date: Sat, 24 May 2025 16:57:03 -0500
Subject: [PATCH 015/326] =?UTF-8?q?=F0=9F=94=A8=20Better=20FT=20Motion=20m?=
=?UTF-8?q?enu=20string=20code?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
Marlin/src/lcd/menu/menu_motion.cpp | 96 ++++++++++++++++++++++-------
1 file changed, 74 insertions(+), 22 deletions(-)
diff --git a/Marlin/src/lcd/menu/menu_motion.cpp b/Marlin/src/lcd/menu/menu_motion.cpp
index e2adbfded2..956b58c633 100644
--- a/Marlin/src/lcd/menu/menu_motion.cpp
+++ b/Marlin/src/lcd/menu/menu_motion.cpp
@@ -401,19 +401,48 @@ void menu_move() {
#endif // HAS_DYNAMIC_FREQ
+ // Suppress warning about storing a stack address in a static string pointer
+ #pragma GCC diagnostic push
+ #pragma GCC diagnostic ignored "-Wdangling-pointer"
+
+ #if ALL(__AVR__, HAS_MARLINUI_U8GLIB) && DISABLED(REDUCE_CODE_SIZE_FOR_FT_MOTION_ON_AVR)
+ #define CACHE_PREV_STRING
+ #endif
+
void menu_ft_motion() {
// Define stuff ahead of the menu loop
- MString<20> shaper_name[NUM_AXES_SHAPED] {};
- #if HAS_X_AXIS
- for (uint_fast8_t a = X_AXIS; a < NUM_AXES_SHAPED; ++a)
- shaper_name[a] = get_shaper_name(AxisEnum(a));
- #endif
- #if HAS_DYNAMIC_FREQ
- MString<20> dmode = get_dyn_freq_mode_name();
- #endif
-
ft_config_t &c = ftMotion.cfg;
+ #ifdef __AVR__
+ // Copy Flash strings to RAM for C-string substitution
+ // For U8G paged rendering check and skip extra string copy
+ #if HAS_X_AXIS
+ MString<20> shaper_name;
+ TERN_(CACHE_PREV_STRING, int8_t prev_a = -1);
+ auto _shaper_name = [&](const AxisEnum a) {
+ if (TERN1(CACHE_PREV_STRING, a != prev_a)) {
+ TERN_(CACHE_PREV_STRING, prev_a = a);
+ shaper_name = get_shaper_name(a);
+ }
+ return shaper_name;
+ };
+ #endif
+ #if HAS_DYNAMIC_FREQ
+ MString<20> dmode;
+ TERN_(CACHE_PREV_STRING, bool got_d = false);
+ auto _dmode = [&]{
+ if (TERN1(CACHE_PREV_STRING, !got_d)) {
+ TERN_(CACHE_PREV_STRING, got_d = true);
+ dmode = get_dyn_freq_mode_name();
+ }
+ return dmode;
+ };
+ #endif
+ #else
+ auto _shaper_name = [](const AxisEnum a) { return get_shaper_name(a); };
+ auto _dmode = []{ return get_dyn_freq_mode_name(); };
+ #endif
+
START_MENU();
BACK_ITEM(MSG_MOTION);
@@ -426,7 +455,7 @@ void menu_move() {
// Show only when FT Motion is active (or optionally always show)
if (c.active || ENABLED(FT_MOTION_NO_MENU_TOGGLE)) {
#if HAS_X_AXIS
- SUBMENU_N_S(X_AXIS, shaper_name[X_AXIS], MSG_FTM_CMPN_MODE, menu_ftm_shaper_x);
+ SUBMENU_N_S(X_AXIS, _shaper_name(X_AXIS), MSG_FTM_CMPN_MODE, menu_ftm_shaper_x);
if (AXIS_HAS_SHAPER(X)) {
EDIT_ITEM_FAST_N(float42_52, X_AXIS, MSG_FTM_BASE_FREQ_N, &c.baseFreq.x, FTM_MIN_SHAPE_FREQ, (FTM_FS) / 2, ftMotion.update_shaping_params);
@@ -436,7 +465,7 @@ void menu_move() {
}
#endif
#if HAS_Y_AXIS
- SUBMENU_N_S(Y_AXIS, shaper_name[Y_AXIS], MSG_FTM_CMPN_MODE, menu_ftm_shaper_y);
+ SUBMENU_N_S(Y_AXIS, _shaper_name(Y_AXIS), MSG_FTM_CMPN_MODE, menu_ftm_shaper_y);
if (AXIS_HAS_SHAPER(Y)) {
EDIT_ITEM_FAST_N(float42_52, Y_AXIS, MSG_FTM_BASE_FREQ_N, &c.baseFreq.y, FTM_MIN_SHAPE_FREQ, (FTM_FS) / 2, ftMotion.update_shaping_params);
@@ -447,7 +476,7 @@ void menu_move() {
#endif
#if HAS_DYNAMIC_FREQ
- SUBMENU_S(dmode, MSG_FTM_DYN_MODE, menu_ftm_dyn_mode);
+ SUBMENU_S(_dmode(), MSG_FTM_DYN_MODE, menu_ftm_dyn_mode);
if (c.dynFreqMode != dynFreqMode_DISABLED) {
#if HAS_X_AXIS
EDIT_ITEM_FAST_N(float42_52, X_AXIS, MSG_FTM_DFREQ_K_N, &c.dynFreqK.x, 0.0f, 20.0f);
@@ -469,13 +498,34 @@ void menu_move() {
void menu_tune_ft_motion() {
// Define stuff ahead of the menu loop
- MString<20> shaper_name[NUM_AXES_SHAPED] {};
- #if HAS_X_AXIS
- for (uint_fast8_t a = X_AXIS; a < NUM_AXES_SHAPED; ++a)
- shaper_name[a] = get_shaper_name(AxisEnum(a));
- #endif
- #if HAS_DYNAMIC_FREQ
- MString<20> dmode = get_dyn_freq_mode_name();
+ #ifdef __AVR__
+ // Copy Flash strings to RAM for C-string substitution
+ // For U8G paged rendering check and skip extra string copy
+ #if HAS_X_AXIS
+ MString<20> shaper_name;
+ TERN_(CACHE_PREV_STRING, int8_t prev_a = -1);
+ auto _shaper_name = [&](const AxisEnum a) {
+ if (TERN1(CACHE_PREV_STRING, a != prev_a)) {
+ TERN_(CACHE_PREV_STRING, prev_a = a);
+ shaper_name = get_shaper_name(a);
+ }
+ return shaper_name;
+ };
+ #endif
+ #if HAS_DYNAMIC_FREQ
+ MString<20> dmode;
+ TERN_(CACHE_PREV_STRING, bool got_d = false);
+ auto _dmode = [&]{
+ if (TERN1(CACHE_PREV_STRING, !got_d)) {
+ TERN_(CACHE_PREV_STRING, got_d = true);
+ dmode = get_dyn_freq_mode_name();
+ }
+ return dmode;
+ };
+ #endif
+ #else
+ auto _shaper_name = [](const AxisEnum a) { return get_shaper_name(a); };
+ auto _dmode = []{ return get_dyn_freq_mode_name(); };
#endif
#if HAS_EXTRUDERS
@@ -486,13 +536,13 @@ void menu_move() {
BACK_ITEM(MSG_TUNE);
#if HAS_X_AXIS
- SUBMENU_N_S(X_AXIS, shaper_name[X_AXIS], MSG_FTM_CMPN_MODE, menu_ftm_shaper_x);
+ SUBMENU_N_S(X_AXIS, _shaper_name(X_AXIS), MSG_FTM_CMPN_MODE, menu_ftm_shaper_x);
#endif
#if HAS_Y_AXIS
- SUBMENU_N_S(Y_AXIS, shaper_name[Y_AXIS], MSG_FTM_CMPN_MODE, menu_ftm_shaper_y);
+ SUBMENU_N_S(Y_AXIS, _shaper_name(Y_AXIS), MSG_FTM_CMPN_MODE, menu_ftm_shaper_y);
#endif
#if HAS_DYNAMIC_FREQ
- SUBMENU_S(dmode, MSG_FTM_DYN_MODE, menu_ftm_dyn_mode);
+ SUBMENU_S(_dmode(), MSG_FTM_DYN_MODE, menu_ftm_dyn_mode);
#endif
#if HAS_EXTRUDERS
EDIT_ITEM(bool, MSG_LINEAR_ADVANCE, &c.linearAdvEna);
@@ -503,6 +553,8 @@ void menu_move() {
END_MENU();
}
+ #pragma GCC diagnostic pop
+
#endif // FT_MOTION_MENU
void menu_motion() {
From bd9d7a3c4d6b5b974e9dcf2ba90180fb91f6502d Mon Sep 17 00:00:00 2001
From: Scott Lahteine
Date: Sat, 24 May 2025 17:17:49 -0500
Subject: [PATCH 016/326] =?UTF-8?q?=F0=9F=A9=B9=20Fix=20MKS=20UI=20E=20Max?=
=?UTF-8?q?=20Feedrate=20items?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
Marlin/src/lcd/extui/mks_ui/draw_number_key.cpp | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/Marlin/src/lcd/extui/mks_ui/draw_number_key.cpp b/Marlin/src/lcd/extui/mks_ui/draw_number_key.cpp
index c44cabd10a..a117775793 100644
--- a/Marlin/src/lcd/extui/mks_ui/draw_number_key.cpp
+++ b/Marlin/src/lcd/extui/mks_ui/draw_number_key.cpp
@@ -243,10 +243,10 @@ static void set_value_confirm() {
#if HAS_Z_AXIS
case ZMaxFeedRate: planner.settings.max_feedrate_mm_s[Z_AXIS] = atof(key_value); break;
#endif
- #if HAS_E0_AXIS
+ #if HAS_EXTRUDERS
case E0MaxFeedRate: planner.settings.max_feedrate_mm_s[E_AXIS] = atof(key_value); break;
#endif
- #if HAS_E1_AXIS
+ #if HAS_MULTI_EXTRUDER
case E1MaxFeedRate: planner.settings.max_feedrate_mm_s[E_AXIS_N(1)] = atof(key_value); break;
#endif
From 6a871b2879131c23581a0fdc086240994837ba33 Mon Sep 17 00:00:00 2001
From: B
Date: Sat, 24 May 2025 17:21:06 -0700
Subject: [PATCH 017/326] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20Get?=
=?UTF-8?q?=20E=20axis=20in=20FTMotion::loadBlockData=20(#27870)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Co-authored-by: Scott Lahteine
---
Marlin/src/module/ft_motion.cpp | 27 ++++++++++++++++++---------
Marlin/src/module/ft_motion.h | 6 ++++++
2 files changed, 24 insertions(+), 9 deletions(-)
diff --git a/Marlin/src/module/ft_motion.cpp b/Marlin/src/module/ft_motion.cpp
index 88d2fb60b3..cb31525572 100644
--- a/Marlin/src/module/ft_motion.cpp
+++ b/Marlin/src/module/ft_motion.cpp
@@ -89,6 +89,12 @@ xyze_long_t FTMotion::steps = { 0 }; // Step count accumulator.
uint32_t FTMotion::interpIdx = 0; // Index of current data point being interpolated.
+#if ENABLED(DISTINCT_E_FACTORS)
+ uint8_t FTMotion::block_extruder_axis; // Cached E Axis from last-fetched block
+#else
+ constexpr uint8_t FTMotion::block_extruder_axis;
+#endif
+
// Shaping variables.
#if HAS_FTM_SHAPING
FTMotion::shaping_t FTMotion::shaping = {
@@ -143,6 +149,12 @@ void FTMotion::loop() {
continue;
}
loadBlockData(stepper.current_block);
+
+ // If the endstop is already pressed, endstop interrupts won't invoke
+ // endstop_triggered and the move will grind. So check here for a
+ // triggered endstop, which shortly marks the block for discard.
+ endstops.update();
+
blockProcRdy = true;
// Some kinematics track axis motion in HX, HY, HZ
#if ANY(CORE_IS_XY, CORE_IS_XZ, MARKFORGED_XY, MARKFORGED_YX)
@@ -389,6 +401,7 @@ void FTMotion::reset() {
#endif
TERN_(HAS_EXTRUDERS, e_raw_z1 = e_advanced_z1 = 0.0f);
+ TERN_(DISTINCT_E_FACTORS, block_extruder_axis = E_AXIS);
axis_move_end_ti.reset();
}
@@ -453,13 +466,15 @@ void FTMotion::init() {
// Load / convert block data from planner to fixed-time control variables.
void FTMotion::loadBlockData(block_t * const current_block) {
+ // Cache the extruder index for this block
+ TERN_(DISTINCT_E_FACTORS, block_extruder_axis = E_AXIS_N(current_block->extruder));
const float totalLength = current_block->millimeters,
oneOverLength = 1.0f / totalLength;
startPosn = endPosn_prevBlock;
const xyze_pos_t moveDist = LOGICAL_AXIS_ARRAY(
- current_block->steps.e * planner.mm_per_step[E_AXIS_N(current_block->extruder)] * (current_block->direction_bits.e ? 1 : -1),
+ current_block->steps.e * planner.mm_per_step[block_extruder_axis] * (current_block->direction_bits.e ? 1 : -1),
current_block->steps.x * planner.mm_per_step[X_AXIS] * (current_block->direction_bits.x ? 1 : -1),
current_block->steps.y * planner.mm_per_step[Y_AXIS] * (current_block->direction_bits.y ? 1 : -1),
current_block->steps.z * planner.mm_per_step[Z_AXIS] * (current_block->direction_bits.z ? 1 : -1),
@@ -568,12 +583,6 @@ void FTMotion::loadBlockData(block_t * const current_block) {
#endif
TERN_(HAS_Z_AXIS, _SET_MOVE_END(Z));
SECONDARY_AXIS_MAP(_SET_MOVE_END);
-
- // If the endstop is already pressed, endstop interrupts won't invoke
- // endstop_triggered and the move will grind. So check here for a
- // triggered endstop, which shortly marks the block for discard.
- endstops.update();
-
}
// Generate data points of the trajectory.
@@ -721,7 +730,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(stepper.current_block->extruder)), // May be eliminated if guaranteed positive.
+ TOSTEPS(e, block_extruder_axis), // 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)
@@ -730,7 +739,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(stepper.current_block->extruder)),
+ TOSTEPS(e, block_extruder_axis),
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)
diff --git a/Marlin/src/module/ft_motion.h b/Marlin/src/module/ft_motion.h
index f6ce81af12..4cf8017083 100644
--- a/Marlin/src/module/ft_motion.h
+++ b/Marlin/src/module/ft_motion.h
@@ -169,6 +169,12 @@ class FTMotion {
static xyze_long_t steps;
+ #if ENABLED(DISTINCT_E_FACTORS)
+ static uint8_t block_extruder_axis; // Cached extruder axis index
+ #else
+ static constexpr uint8_t block_extruder_axis = E_AXIS;
+ #endif
+
// Shaping variables.
#if HAS_FTM_SHAPING
From dbd60fb38e865fcbd51b886f421390e78b0743cc Mon Sep 17 00:00:00 2001
From: thinkyhead
Date: Sun, 25 May 2025 00:35:29 +0000
Subject: [PATCH 018/326] [cron] Bump distribution date (2025-05-25)
---
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 cb96070cc4..82979634d4 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 "2025-05-24"
+//#define STRING_DISTRIBUTION_DATE "2025-05-25"
/**
* The protocol for communication to the host. Protocol indicates communication
diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h
index 51a13f1947..7c80ca1f17 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 "2025-05-24"
+ #define STRING_DISTRIBUTION_DATE "2025-05-25"
#endif
/**
From 7f9eb688adc69ff51c79ecc30acd703643708c21 Mon Sep 17 00:00:00 2001
From: ellensp <530024+ellensp@users.noreply.github.com>
Date: Tue, 27 May 2025 03:50:22 +1200
Subject: [PATCH 019/326] =?UTF-8?q?=F0=9F=90=9B=20TMC2240:=20The=20Sequel?=
=?UTF-8?q?=20(#27880)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Co-authored-by: Scott Lahteine
---
Marlin/Configuration_adv.h | 8 +--
Marlin/src/core/drivers.h | 6 +-
Marlin/src/feature/tmc_util.cpp | 113 +++++++++++++++++++++-----------
Marlin/src/feature/tmc_util.h | 3 +
Marlin/src/inc/SanityCheck.h | 18 ++---
ini/features.ini | 2 +-
6 files changed, 98 insertions(+), 52 deletions(-)
diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h
index 93d84d8d9c..fee4c452ab 100644
--- a/Marlin/Configuration_adv.h
+++ b/Marlin/Configuration_adv.h
@@ -2997,7 +2997,7 @@
/**
* Trinamic Smart Drivers
*
- * To use TMC2130, TMC2160, TMC2660, TMC5130, TMC5160 stepper drivers in SPI mode:
+ * To use TMC2130, TMC2160, TMC2240, TMC2660, TMC5130, TMC5160 stepper drivers in SPI mode:
* - Connect your SPI pins to the Hardware SPI interface on the board.
* Some boards have simple jumper connections! See your board's documentation.
* - Define the required Stepper CS pins in your `pins_MYBOARD.h` file.
@@ -3258,7 +3258,7 @@
// @section tmc/spi
/**
- * Override default SPI pins for TMC2130, TMC2160, TMC2660, TMC5130 and TMC5160 drivers here.
+ * Override default SPI pins for TMC2130, TMC2160, TMC2240, TMC2660, TMC5130 and TMC5160 drivers here.
* The default pins can be found in your board's pins file.
*/
//#define X_CS_PIN -1
@@ -3285,7 +3285,7 @@
//#define E7_CS_PIN -1
/**
- * Software option for SPI driven drivers (TMC2130, TMC2160, TMC2660, TMC5130 and TMC5160).
+ * Software option for SPI driven drivers (TMC2130, TMC2160, TMC2240, TMC2660, TMC5130 and TMC5160).
* The default SW SPI pins are defined the respective pins files,
* but you can override or define them here.
*/
@@ -3498,7 +3498,7 @@
//#define U_STALL_SENSITIVITY 8
//#define V_STALL_SENSITIVITY 8
//#define W_STALL_SENSITIVITY 8
- //#define SPI_ENDSTOPS // TMC2130/TMC5160 only
+ //#define SPI_ENDSTOPS // TMC2130, TMC2240, and TMC5160
//#define IMPROVE_HOMING_RELIABILITY
#endif
diff --git a/Marlin/src/core/drivers.h b/Marlin/src/core/drivers.h
index 6b1a70202c..3a53360e26 100644
--- a/Marlin/src/core/drivers.h
+++ b/Marlin/src/core/drivers.h
@@ -113,9 +113,12 @@
#define HAS_TRINAMIC_STANDALONE 1
#endif
-#if HAS_DRIVER(TMC2130) || HAS_DRIVER(TMC2160) || HAS_DRIVER(TMC5130) || HAS_DRIVER(TMC5160) || HAS_DRIVER(TMC2240)
+#if HAS_DRIVER(TMC2130) || HAS_DRIVER(TMC2160) || HAS_DRIVER(TMC5130) || HAS_DRIVER(TMC5160)
#define HAS_TMCX1X0 1
#endif
+#if HAS_TMCX1X0 || HAS_DRIVER(TMC2240)
+ #define HAS_TMCX1X0_OR_2240 1
+#endif
#if HAS_DRIVER(TMC2208) || HAS_DRIVER(TMC2209)
#define HAS_TMC220x 1
#endif
@@ -207,6 +210,7 @@
#define THRS_TMC2160 255
#define THRS_TMC2208 255
#define THRS_TMC2209 255
+#define THRS_TMC2240 255
#define THRS_TMC2660 65535
#define THRS_TMC5130 65535
#define THRS_TMC5160 65535
diff --git a/Marlin/src/feature/tmc_util.cpp b/Marlin/src/feature/tmc_util.cpp
index d920c3a604..fb17e562ad 100644
--- a/Marlin/src/feature/tmc_util.cpp
+++ b/Marlin/src/feature/tmc_util.cpp
@@ -72,7 +72,7 @@
#endif
;
#if ENABLED(TMC_DEBUG)
- #if HAS_TMCX1X0 || HAS_TMC220x
+ #if HAS_TMCX1X0_OR_2240 || HAS_TMC220x
uint8_t cs_actual;
#endif
#if HAS_STALLGUARD
@@ -298,7 +298,7 @@
st.printLabel();
SString<60> report(':', pwm_scale);
#if ENABLED(TMC_DEBUG)
- #if HAS_TMCX1X0 || HAS_TMC220x
+ #if HAS_TMCX1X0_OR_2240 || HAS_TMC220x
report.append('/', data.cs_actual);
#endif
#if HAS_STALLGUARD
@@ -575,6 +575,25 @@
template
static void print_vsense(TMC &st) { SERIAL_ECHO(st.vsense() ? F("1=.18") : F("0=.325")); }
+ #if HAS_DRIVER(TMC2160)
+ template
+ void print_vsense(TMCMarlin &) { }
+ #endif
+ #if HAS_DRIVER(TMC5160)
+ template
+ void print_vsense(TMCMarlin &) { }
+ #endif
+ #if HAS_DRIVER(TMC2240)
+ template
+ void print_vsense(TMCMarlin &) { }
+ #endif
+
+ template
+ void print_cs_actual(TMC &st) { SERIAL_ECHO(st.cs_actual(), F("/31")); }
+ #if HAS_DRIVER(TMC2240)
+ template
+ void print_cs_actual(TMCMarlin &) { }
+ #endif
#if HAS_DRIVER(TMC2130) || HAS_DRIVER(TMC5130)
static void _tmc_status(TMC2130Stepper &st, const TMC_debug_enum i) {
@@ -600,12 +619,6 @@
#endif
#if HAS_DRIVER(TMC2160) || HAS_DRIVER(TMC5160)
- template
- void print_vsense(TMCMarlin &) { }
-
- template
- void print_vsense(TMCMarlin &) { }
-
static void _tmc_status(TMC2160Stepper &st, const TMC_debug_enum i) {
switch (i) {
case TMC_PWM_SCALE: SERIAL_ECHO(st.PWM_SCALE()); break;
@@ -676,6 +689,21 @@
#endif // HAS_TMC220x
+ #if HAS_DRIVER(TMC2240)
+ static void _tmc_parse_drv_status(TMC2240Stepper, const TMC_drv_status_enum) { }
+ static void _tmc_status(TMC2240Stepper &st, const TMC_debug_enum i) {
+ switch (i) {
+ case TMC_PWM_SCALE_SUM: SERIAL_ECHO(st.pwm_scale_sum()); break;
+ case TMC_PWM_SCALE_AUTO: SERIAL_ECHO(st.pwm_scale_auto()); break;
+ case TMC_PWM_OFS_AUTO: SERIAL_ECHO(st.pwm_ofs_auto()); break;
+ case TMC_PWM_GRAD_AUTO: SERIAL_ECHO(st.pwm_grad_auto()); break;
+ case TMC_STEALTHCHOP: serialprint_truefalse(st.stealth()); break;
+ case TMC_INTERPOLATE: serialprint_truefalse(st.intpol()); break;
+ default: break;
+ }
+ }
+ #endif
+
#if HAS_DRIVER(TMC2660)
static void _tmc_parse_drv_status(TMC2660Stepper, const TMC_drv_status_enum) { }
static void _tmc_status(TMC2660Stepper &st, const TMC_debug_enum i) {
@@ -686,6 +714,21 @@
}
#endif
+ template
+ void print_tstep(TMC &st) {
+ const uint32_t tstep_value = st.TSTEP();
+ if (tstep_value != 0xFFFFF)
+ SERIAL_ECHO(tstep_value);
+ else
+ SERIAL_ECHOPGM("max");
+ }
+ void print_tstep(TMC2660Stepper &st) { }
+
+ template
+ void print_blank_time(TMC &st) { SERIAL_ECHO(st.blank_time()); }
+ template
+ void print_blank_time(TMCMarlin &) { }
+
template
static void tmc_status(TMC &st, const TMC_debug_enum i) {
SERIAL_CHAR('\t');
@@ -703,16 +746,10 @@
SERIAL_ECHO(st.ihold());
SERIAL_ECHOPGM("/31");
break;
- case TMC_CS_ACTUAL:
- SERIAL_ECHO(st.cs_actual());
- SERIAL_ECHOPGM("/31");
- break;
+ case TMC_CS_ACTUAL: print_cs_actual(st); break;
case TMC_VSENSE: print_vsense(st); break;
case TMC_MICROSTEPS: SERIAL_ECHO(st.microsteps()); break;
- case TMC_TSTEP: {
- const uint32_t tstep_value = st.TSTEP();
- if (tstep_value != 0xFFFFF) SERIAL_ECHO(tstep_value); else SERIAL_ECHOPGM("max");
- } break;
+ case TMC_TSTEP: print_tstep(st); break;
#if ENABLED(HYBRID_THRESHOLD)
case TMC_TPWMTHRS: SERIAL_ECHO(uint32_t(st.TPWMTHRS())); break;
case TMC_TPWMTHRS_MMS: {
@@ -725,7 +762,7 @@
case TMC_OTPW_TRIGGERED: serialprint_truefalse(st.getOTPW()); break;
#endif
case TMC_TOFF: SERIAL_ECHO(st.toff()); break;
- case TMC_TBL: SERIAL_ECHO(st.blank_time()); break;
+ case TMC_TBL: print_blank_time(st); break;
case TMC_HEND: SERIAL_ECHO(st.hysteresis_end()); break;
case TMC_HSTRT: SERIAL_ECHO(st.hysteresis_start()); break;
case TMC_MSCNT: SERIAL_ECHO(st.get_microstep_counter()); break;
@@ -753,10 +790,10 @@
//case TMC_OTPW_TRIGGERED: serialprint_truefalse(st.getOTPW()); break;
case TMC_SGT: SERIAL_ECHO(st.sgt()); break;
case TMC_TOFF: SERIAL_ECHO(st.toff()); break;
- case TMC_TBL: SERIAL_ECHO(st.blank_time()); break;
+ case TMC_TBL: print_blank_time(st); break;
case TMC_HEND: SERIAL_ECHO(st.hysteresis_end()); break;
case TMC_HSTRT: SERIAL_ECHO(st.hysteresis_start()); break;
- default: break;
+ default: _tmc_status(st, i); break;
}
}
#endif
@@ -916,10 +953,10 @@
TMC_REPORT("Stallguard thrs", TMC_SGT);
TMC_REPORT("uStep count", TMC_MSCNT);
DRV_REPORT("DRVSTATUS", TMC_DRV_CODES);
- #if HAS_TMCX1X0 || HAS_TMC220x
+ #if HAS_TMCX1X0_OR_2240 || HAS_TMC220x
DRV_REPORT("sg_result", TMC_SG_RESULT);
#endif
- #if HAS_TMCX1X0
+ #if HAS_TMCX1X0_OR_2240
DRV_REPORT("stallguard", TMC_STALLGUARD);
DRV_REPORT("fsactive", TMC_FSACTIVE);
#endif
@@ -944,21 +981,22 @@
#define PRINT_TMC_REGISTER(REG_CASE) case TMC_GET_##REG_CASE: print_hex_long(st.REG_CASE(), ':'); break
- #if HAS_TMCX1X0
- static void tmc_get_ic_registers(TMC2130Stepper &st, const TMC_get_registers_enum i) {
- switch (i) {
- PRINT_TMC_REGISTER(TCOOLTHRS);
- PRINT_TMC_REGISTER(THIGH);
- PRINT_TMC_REGISTER(COOLCONF);
- default: SERIAL_CHAR('\t'); break;
- }
- }
- #endif
- #if HAS_TMC220x
- static void tmc_get_ic_registers(TMC2208Stepper, const TMC_get_registers_enum) { SERIAL_CHAR('\t'); }
- #endif
-
#if HAS_TRINAMIC_CONFIG
+
+ template
+ static void tmc_get_ic_registers(TMC &, const TMC_get_registers_enum) { SERIAL_CHAR('\t'); }
+
+ #if HAS_TMCX1X0
+ static void tmc_get_ic_registers(TMC2130Stepper &st, const TMC_get_registers_enum i) {
+ switch (i) {
+ PRINT_TMC_REGISTER(TCOOLTHRS);
+ PRINT_TMC_REGISTER(THIGH);
+ PRINT_TMC_REGISTER(COOLCONF);
+ default: SERIAL_CHAR('\t'); break;
+ }
+ }
+ #endif
+
template
static void tmc_get_registers(TMC &st, const TMC_get_registers_enum i) {
switch (i) {
@@ -978,7 +1016,8 @@
}
SERIAL_CHAR('\t');
}
- #endif
+ #endif // HAS_TRINAMIC_CONFIG
+
#if HAS_DRIVER(TMC2660)
template
static void tmc_get_registers(TMCMarlin &st, const TMC_get_registers_enum i) {
@@ -1105,7 +1144,7 @@
// TODO
return false;
}
- void tmc_disable_stallguard(TMC2660Stepper, const bool) {};
+ void tmc_disable_stallguard(TMC2660Stepper, const bool) { }
#endif // USE_SENSORLESS
diff --git a/Marlin/src/feature/tmc_util.h b/Marlin/src/feature/tmc_util.h
index 55a4eb02aa..99d9dc4bc1 100644
--- a/Marlin/src/feature/tmc_util.h
+++ b/Marlin/src/feature/tmc_util.h
@@ -422,6 +422,9 @@ void test_tmc_connection(LOGICAL_AXIS_DECL_LC(const bool, true));
bool tmc_enable_stallguard(TMC2209Stepper &st);
void tmc_disable_stallguard(TMC2209Stepper &st, const bool restore_stealth);
+ bool tmc_enable_stallguard(TMC2240Stepper &st);
+ void tmc_disable_stallguard(TMC2240Stepper &st, const bool restore_stealth);
+
bool tmc_enable_stallguard(TMC2660Stepper);
void tmc_disable_stallguard(TMC2660Stepper, const bool);
diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h
index 5d427e7e08..98498f4355 100644
--- a/Marlin/src/inc/SanityCheck.h
+++ b/Marlin/src/inc/SanityCheck.h
@@ -3381,7 +3381,7 @@ static_assert(NUM_SERVOS <= NUM_SERVO_PLUGS, "NUM_SERVOS (or some servo index) i
// Stall detection DIAG = HIGH : TMC2209/2240
// Stall detection DIAG = LOW : TMC2130/2160/2660/5130/5160
#if X_SENSORLESS
- #define _HIT_STATE AXIS_DRIVER_TYPE(X,TMC2209) || AXIS_DRIVER_TYPE(X,TMC2240)
+ #define _HIT_STATE (AXIS_DRIVER_TYPE(X,TMC2209) || AXIS_DRIVER_TYPE(X,TMC2240))
#if X_HOME_TO_MIN && X_MIN_ENDSTOP_HIT_STATE != _HIT_STATE
#if _HIT_STATE
#error "SENSORLESS_HOMING requires X_MIN_ENDSTOP_HIT_STATE HIGH for X MIN homing with TMC2209/2240."
@@ -3399,7 +3399,7 @@ static_assert(NUM_SERVOS <= NUM_SERVO_PLUGS, "NUM_SERVOS (or some servo index) i
#endif
#if Y_SENSORLESS
- #define _HIT_STATE AXIS_DRIVER_TYPE(Y,TMC2209) || AXIS_DRIVER_TYPE(Y,TMC2240)
+ #define _HIT_STATE (AXIS_DRIVER_TYPE(Y,TMC2209) || AXIS_DRIVER_TYPE(Y,TMC2240))
#if Y_HOME_TO_MIN && Y_MIN_ENDSTOP_HIT_STATE != _HIT_STATE
#if _HIT_STATE
#error "SENSORLESS_HOMING requires Y_MIN_ENDSTOP_HIT_STATE HIGH for Y MIN homing with TMC2209/2240."
@@ -3417,7 +3417,7 @@ static_assert(NUM_SERVOS <= NUM_SERVO_PLUGS, "NUM_SERVOS (or some servo index) i
#endif
#if Z_SENSORLESS
- #define _HIT_STATE AXIS_DRIVER_TYPE(Z,TMC2209) || AXIS_DRIVER_TYPE(Z,TMC2240)
+ #define _HIT_STATE (AXIS_DRIVER_TYPE(Z,TMC2209) || AXIS_DRIVER_TYPE(Z,TMC2240))
#if Z_HOME_TO_MIN && Z_MIN_ENDSTOP_HIT_STATE != _HIT_STATE
#if _HIT_STATE
#error "SENSORLESS_HOMING requires Z_MIN_ENDSTOP_HIT_STATE HIGH for Z MIN homing with TMC2209/2240."
@@ -3435,7 +3435,7 @@ static_assert(NUM_SERVOS <= NUM_SERVO_PLUGS, "NUM_SERVOS (or some servo index) i
#endif
#if I_SENSORLESS
- #define _HIT_STATE AXIS_DRIVER_TYPE(I,TMC2209) || AXIS_DRIVER_TYPE(I,TMC2240)
+ #define _HIT_STATE (AXIS_DRIVER_TYPE(I,TMC2209) || AXIS_DRIVER_TYPE(I,TMC2240))
#if I_HOME_TO_MIN && I_MIN_ENDSTOP_HIT_STATE != _HIT_STATE
#if _HIT_STATE
#error "SENSORLESS_HOMING requires I_MIN_ENDSTOP_HIT_STATE HIGH for I MIN homing with TMC2209/2240."
@@ -3453,7 +3453,7 @@ static_assert(NUM_SERVOS <= NUM_SERVO_PLUGS, "NUM_SERVOS (or some servo index) i
#endif
#if J_SENSORLESS
- #define _HIT_STATE AXIS_DRIVER_TYPE(J,TMC2209) || AXIS_DRIVER_TYPE(J,TMC2240)
+ #define _HIT_STATE (AXIS_DRIVER_TYPE(J,TMC2209) || AXIS_DRIVER_TYPE(J,TMC2240))
#if J_HOME_TO_MIN && J_MIN_ENDSTOP_HIT_STATE != _HIT_STATE
#if _HIT_STATE
#error "SENSORLESS_HOMING requires J_MIN_ENDSTOP_HIT_STATE HIGH for J MIN homing with TMC2209/2240."
@@ -3471,7 +3471,7 @@ static_assert(NUM_SERVOS <= NUM_SERVO_PLUGS, "NUM_SERVOS (or some servo index) i
#endif
#if K_SENSORLESS
- #define _HIT_STATE AXIS_DRIVER_TYPE(K,TMC2209) || AXIS_DRIVER_TYPE(K,TMC2240)
+ #define _HIT_STATE (AXIS_DRIVER_TYPE(K,TMC2209) || AXIS_DRIVER_TYPE(K,TMC2240))
#if K_HOME_TO_MIN && K_MIN_ENDSTOP_HIT_STATE != _HIT_STATE
#if _HIT_STATE
#error "SENSORLESS_HOMING requires K_MIN_ENDSTOP_HIT_STATE HIGH for K MIN homing with TMC2209/2240."
@@ -3489,7 +3489,7 @@ static_assert(NUM_SERVOS <= NUM_SERVO_PLUGS, "NUM_SERVOS (or some servo index) i
#endif
#if U_SENSORLESS
- #define _HIT_STATE AXIS_DRIVER_TYPE(U,TMC2209) || AXIS_DRIVER_TYPE(U,TMC2240)
+ #define _HIT_STATE (AXIS_DRIVER_TYPE(U,TMC2209) || AXIS_DRIVER_TYPE(U,TMC2240))
#if U_HOME_TO_MIN && U_MIN_ENDSTOP_HIT_STATE != _HIT_STATE
#if _HIT_STATE
#error "SENSORLESS_HOMING requires U_MIN_ENDSTOP_HIT_STATE HIGH for U MIN homing with TMC2209/2240."
@@ -3507,7 +3507,7 @@ static_assert(NUM_SERVOS <= NUM_SERVO_PLUGS, "NUM_SERVOS (or some servo index) i
#endif
#if V_SENSORLESS
- #define _HIT_STATE AXIS_DRIVER_TYPE(V,TMC2209) || AXIS_DRIVER_TYPE(V,TMC2240)
+ #define _HIT_STATE (AXIS_DRIVER_TYPE(V,TMC2209) || AXIS_DRIVER_TYPE(V,TMC2240))
#if V_HOME_TO_MIN && V_MIN_ENDSTOP_HIT_STATE != _HIT_STATE
#if _HIT_STATE
#error "SENSORLESS_HOMING requires V_MIN_ENDSTOP_HIT_STATE HIGH for V MIN homing with TMC2209/2240."
@@ -3525,7 +3525,7 @@ static_assert(NUM_SERVOS <= NUM_SERVO_PLUGS, "NUM_SERVOS (or some servo index) i
#endif
#if W_SENSORLESS
- #define _HIT_STATE AXIS_DRIVER_TYPE(W,TMC2209) || AXIS_DRIVER_TYPE(W,TMC2240)
+ #define _HIT_STATE (AXIS_DRIVER_TYPE(W,TMC2209) || AXIS_DRIVER_TYPE(W,TMC2240))
#if W_HOME_TO_MIN && W_MIN_ENDSTOP_HIT_STATE != _HIT_STATE
#if _HIT_STATE
#error "SENSORLESS_HOMING requires W_MIN_ENDSTOP_HIT_STATE HIGH for W MIN homing with TMC2209/2240."
diff --git a/ini/features.ini b/ini/features.ini
index 5bd955dd0a..833fe76510 100644
--- a/ini/features.ini
+++ b/ini/features.ini
@@ -20,7 +20,7 @@ MARLIN_TEST_BUILD = build_src_filter=+
POSTMORTEM_DEBUGGING = build_src_filter=+ +
build_flags=-funwind-tables
MKS_WIFI_MODULE = QRCode=https://github.com/makerbase-mks/QRCode/archive/261c5a696a.zip
-HAS_TRINAMIC_CONFIG = TMCStepper=https://github.com/MarlinFirmware/TMCStepper/archive/marlin-2.1.3.x.zip
+HAS_TRINAMIC_CONFIG = TMCStepper=https://github.com/MarlinFirmware/TMCStepper/archive/v0.8.2.zip
build_src_filter=+ + + + +
HAS_STEPPER_CONTROL = build_src_filter=+
HAS_T(RINAMIC_CONFIG|MC_SPI) = build_src_filter=+
From c7bcbf944ec366c55b6ebbf2909c0baad36491e3 Mon Sep 17 00:00:00 2001
From: Scott Lahteine
Date: Mon, 26 May 2025 11:29:26 -0500
Subject: [PATCH 020/326] =?UTF-8?q?=F0=9F=8C=90=20Specific=20USB-FD=20stri?=
=?UTF-8?q?ngs?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
Marlin/src/lcd/language/language_cz.h | 7 ++++---
Marlin/src/lcd/language/language_de.h | 7 ++++---
Marlin/src/lcd/language/language_el.h | 8 ++++----
Marlin/src/lcd/language/language_en.h | 9 ++++-----
Marlin/src/lcd/language/language_es.h | 7 ++++---
Marlin/src/lcd/language/language_fr.h | 7 ++++---
Marlin/src/lcd/language/language_fr_na.h | 7 ++++---
Marlin/src/lcd/language/language_gl.h | 7 ++++---
Marlin/src/lcd/language/language_hu.h | 7 ++++---
Marlin/src/lcd/language/language_it.h | 10 +++++++---
Marlin/src/lcd/language/language_pl.h | 7 ++++---
Marlin/src/lcd/language/language_pt_br.h | 7 ++++---
Marlin/src/lcd/language/language_ro.h | 7 ++++---
Marlin/src/lcd/language/language_ru.h | 7 ++++---
Marlin/src/lcd/language/language_sk.h | 7 ++++---
Marlin/src/lcd/language/language_sv.h | 7 ++++---
Marlin/src/lcd/language/language_tr.h | 7 ++++---
Marlin/src/lcd/language/language_uk.h | 7 ++++---
Marlin/src/lcd/language/language_vi.h | 7 ++++---
Marlin/src/lcd/language/language_zh_CN.h | 7 ++++---
Marlin/src/lcd/language/language_zh_TW.h | 7 ++++---
Marlin/src/lcd/marlinui.cpp | 2 +-
Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.cpp | 10 +++++-----
23 files changed, 93 insertions(+), 72 deletions(-)
diff --git a/Marlin/src/lcd/language/language_cz.h b/Marlin/src/lcd/language/language_cz.h
index ac23bc8daf..2b5fb524d4 100644
--- a/Marlin/src/lcd/language/language_cz.h
+++ b/Marlin/src/lcd/language/language_cz.h
@@ -45,13 +45,14 @@ namespace LanguageNarrow_cz {
LSTR MSG_YES = _UxGT("ANO");
LSTR MSG_NO = _UxGT("NE");
LSTR MSG_BACK = _UxGT("Zpět");
+
LSTR MSG_MEDIA_ABORTING = _UxGT("Rušení...");
LSTR MSG_MEDIA_INSERTED = _UxGT("Médium vloženo");
LSTR MSG_MEDIA_REMOVED = _UxGT("Médium vyjmuto");
- LSTR MSG_MEDIA_WAITING = _UxGT("Čekání na médium");
LSTR MSG_MEDIA_READ_ERROR = _UxGT("Chyba čtení média");
- LSTR MSG_MEDIA_USB_REMOVED = _UxGT("USB odstraněno");
- LSTR MSG_MEDIA_USB_FAILED = _UxGT("Chyba USB");
+ LSTR MSG_USB_FD_DEVICE_REMOVED = _UxGT("USB odstraněno");
+ LSTR MSG_USB_FD_USB_FAILED = _UxGT("Chyba USB");
+
LSTR MSG_LCD_ENDSTOPS = _UxGT("Endstopy"); // max 8 znaku
LSTR MSG_LCD_SOFT_ENDSTOPS = _UxGT("Soft Endstopy");
LSTR MSG_MAIN_MENU = _UxGT("Hlavní nabídka");
diff --git a/Marlin/src/lcd/language/language_de.h b/Marlin/src/lcd/language/language_de.h
index e681317fb8..4f2cdb79ff 100644
--- a/Marlin/src/lcd/language/language_de.h
+++ b/Marlin/src/lcd/language/language_de.h
@@ -41,15 +41,16 @@ namespace LanguageNarrow_de {
LSTR MSG_LOW = _UxGT("RUNTER");
LSTR MSG_BACK = _UxGT("Zurück");
LSTR MSG_ERROR = _UxGT("Fehler");
+
LSTR MSG_MEDIA_ABORTING = _UxGT("Abbruch...");
LSTR MSG_MEDIA_INSERTED = _UxGT("Medium erkannt");
LSTR MSG_MEDIA_REMOVED = _UxGT("Medium entfernt");
- LSTR MSG_MEDIA_WAITING = _UxGT("Warten auf Medium");
LSTR MSG_MEDIA_INIT_FAIL = _UxGT("Medium Init fehlgesch.");
LSTR MSG_MEDIA_READ_ERROR = _UxGT("Medium Lesefehler");
- LSTR MSG_MEDIA_USB_REMOVED = _UxGT("USB Gerät entfernt");
- LSTR MSG_MEDIA_USB_FAILED = _UxGT("USB Start fehlge.");
+ LSTR MSG_USB_FD_DEVICE_REMOVED = _UxGT("USB Gerät entfernt");
+ LSTR MSG_USB_FD_USB_FAILED = _UxGT("USB Start fehlge.");
LSTR MSG_KILL_SUBCALL_OVERFLOW = _UxGT("Subcall überschritten");
+
LSTR MSG_LCD_ENDSTOPS = _UxGT("Endstopp"); // Max length 8 characters
LSTR MSG_LCD_SOFT_ENDSTOPS = _UxGT("Software-Endstopp");
LSTR MSG_MAIN_MENU = _UxGT("Hauptmenü");
diff --git a/Marlin/src/lcd/language/language_el.h b/Marlin/src/lcd/language/language_el.h
index 0d3d355cb0..ab816adae0 100644
--- a/Marlin/src/lcd/language/language_el.h
+++ b/Marlin/src/lcd/language/language_el.h
@@ -45,12 +45,12 @@ namespace LanguageNarrow_el {
LSTR MSG_MEDIA_INSERTED = _UxGT("Κάρτα εισήχθη");
LSTR MSG_MEDIA_REMOVED = _UxGT("Κάρτα αφαιρέθη");
- LSTR MSG_MEDIA_WAITING = _UxGT("Αναμονή για κάρτα");
LSTR MSG_MEDIA_ABORTING = _UxGT("Ματαίωση...");
- LSTR MSG_MEDIA_READ_ERROR = MEDIA_TYPE_EN _UxGT(" σφάλμα ανάγνωσης");
- LSTR MSG_MEDIA_USB_REMOVED = _UxGT("USB αφαιρέθη");
- LSTR MSG_MEDIA_USB_FAILED = _UxGT("Αποτυχία εκκίνησης USB");
LSTR MSG_MEDIA_INIT_FAIL = _UxGT("Αποτυχία αρχικοποίησης SD");
+ LSTR MSG_MEDIA_READ_ERROR = MEDIA_TYPE_EN _UxGT(" σφάλμα ανάγνωσης");
+ LSTR MSG_USB_FD_DEVICE_REMOVED = _UxGT("USB αφαιρέθη");
+ LSTR MSG_USB_FD_USB_FAILED = _UxGT("Αποτυχία εκκίνησης USB");
+
LSTR MSG_MAIN_MENU = _UxGT("Αρχική Οθόνη");
LSTR MSG_DISABLE_STEPPERS = _UxGT("Απενεργοποίηση μοτέρ");
LSTR MSG_AUTO_HOME = _UxGT("Αυτόμ. επαναφορά XYZ");
diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h
index 5ed5b24635..a74d28b82a 100644
--- a/Marlin/src/lcd/language/language_en.h
+++ b/Marlin/src/lcd/language/language_en.h
@@ -90,17 +90,16 @@ namespace LanguageNarrow_en {
LSTR MSG_MEDIA_REMOVED = MEDIA_TYPE_EN _UxGT(" Removed");
LSTR MSG_MEDIA_REMOVED_SD = _UxGT("SD Card Removed");
LSTR MSG_MEDIA_REMOVED_USB = _UxGT("USB Drive Removed");
- LSTR MSG_MEDIA_WAITING = _UxGT("Waiting for ") MEDIA_TYPE_EN;
- LSTR MSG_MEDIA_WAITING_SD = _UxGT("Waiting for SD Card");
- LSTR MSG_MEDIA_WAITING_USB = _UxGT("Waiting for USB Drive");
LSTR MSG_MEDIA_INIT_FAIL = MEDIA_TYPE_EN _UxGT(" Init Fail");
LSTR MSG_MEDIA_INIT_FAIL_SD = _UxGT("SD Card Init Fail");
LSTR MSG_MEDIA_INIT_FAIL_USB = _UxGT("USB Drive Init Fail");
LSTR MSG_MEDIA_READ_ERROR = MEDIA_TYPE_EN _UxGT(" read error");
- LSTR MSG_MEDIA_USB_REMOVED = _UxGT("USB device removed");
- LSTR MSG_MEDIA_USB_FAILED = _UxGT("USB start failed");
LSTR MSG_MEDIA_SORT = _UxGT("Sort ") MEDIA_TYPE_EN;
LSTR MSG_MEDIA_UPDATE = MEDIA_TYPE_EN _UxGT(" Update");
+ LSTR MSG_USB_FD_WAITING_FOR_MEDIA = _UxGT("Wait for USB Drive");
+ LSTR MSG_USB_FD_MEDIA_REMOVED = _UxGT("USB Drive Removed");
+ LSTR MSG_USB_FD_DEVICE_REMOVED = _UxGT("USB device removed");
+ LSTR MSG_USB_FD_USB_FAILED = _UxGT("USB start failed");
LSTR MSG_KILL_SUBCALL_OVERFLOW = _UxGT("Subcall Overflow");
LSTR MSG_LCD_ENDSTOPS = _UxGT("Endstops"); // Max length 8 characters
diff --git a/Marlin/src/lcd/language/language_es.h b/Marlin/src/lcd/language/language_es.h
index a92efd5389..2646a85f09 100644
--- a/Marlin/src/lcd/language/language_es.h
+++ b/Marlin/src/lcd/language/language_es.h
@@ -46,15 +46,16 @@ namespace LanguageNarrow_es {
LSTR MSG_YES = _UxGT("SI");
LSTR MSG_NO = _UxGT("NO");
LSTR MSG_BACK = _UxGT("Atrás");
+
LSTR MSG_MEDIA_ABORTING = _UxGT("Cancelando...");
LSTR MSG_MEDIA_INSERTED = MEDIA_TYPE_ES _UxGT(" insertado");
LSTR MSG_MEDIA_REMOVED = MEDIA_TYPE_ES _UxGT(" retirado");
- LSTR MSG_MEDIA_WAITING = _UxGT("Esperando al ") MEDIA_TYPE_ES;
LSTR MSG_MEDIA_INIT_FAIL = _UxGT("Fallo al iniciar ") MEDIA_TYPE_ES;
LSTR MSG_MEDIA_READ_ERROR = _UxGT("Error lectura ") MEDIA_TYPE_ES;
- LSTR MSG_MEDIA_USB_REMOVED = _UxGT("Disp. USB retirado");
- LSTR MSG_MEDIA_USB_FAILED = _UxGT("Inicio USB fallido");
+ LSTR MSG_USB_FD_DEVICE_REMOVED = _UxGT("Disp. USB retirado");
+ LSTR MSG_USB_FD_USB_FAILED = _UxGT("Inicio USB fallido");
LSTR MSG_KILL_SUBCALL_OVERFLOW = _UxGT("Desbordamiento de subllamada");
+
LSTR MSG_LCD_ENDSTOPS = _UxGT("Endstops"); // Max length 8 characters
LSTR MSG_LCD_SOFT_ENDSTOPS = _UxGT("Soft Endstops");
LSTR MSG_MAIN_MENU = _UxGT("Menú principal");
diff --git a/Marlin/src/lcd/language/language_fr.h b/Marlin/src/lcd/language/language_fr.h
index 6d9fd3b4f4..6f0e870807 100644
--- a/Marlin/src/lcd/language/language_fr.h
+++ b/Marlin/src/lcd/language/language_fr.h
@@ -40,13 +40,14 @@ namespace LanguageNarrow_fr {
LSTR MSG_YES = _UxGT("Oui");
LSTR MSG_NO = _UxGT("Non");
LSTR MSG_BACK = _UxGT("Retour");
+
LSTR MSG_MEDIA_ABORTING = _UxGT("Annulation...");
LSTR MSG_MEDIA_INSERTED = _UxGT("Média inséré");
LSTR MSG_MEDIA_REMOVED = _UxGT("Média retiré");
- LSTR MSG_MEDIA_WAITING = _UxGT("Attente média");
LSTR MSG_MEDIA_READ_ERROR = _UxGT("Err lecture média");
- LSTR MSG_MEDIA_USB_REMOVED = _UxGT("USB débranché");
- LSTR MSG_MEDIA_USB_FAILED = _UxGT("Erreur média USB");
+ LSTR MSG_USB_FD_DEVICE_REMOVED = _UxGT("USB débranché");
+ LSTR MSG_USB_FD_USB_FAILED = _UxGT("Erreur média USB");
+
LSTR MSG_LCD_ENDSTOPS = _UxGT("Butées");
LSTR MSG_LCD_SOFT_ENDSTOPS = _UxGT("Butées SW");
LSTR MSG_MAIN_MENU = _UxGT("Menu principal");
diff --git a/Marlin/src/lcd/language/language_fr_na.h b/Marlin/src/lcd/language/language_fr_na.h
index 07f2b86499..ef1e29a6b9 100644
--- a/Marlin/src/lcd/language/language_fr_na.h
+++ b/Marlin/src/lcd/language/language_fr_na.h
@@ -40,13 +40,14 @@ namespace LanguageNarrow_fr_na {
LSTR MSG_YES = _UxGT("Oui");
LSTR MSG_NO = _UxGT("Non");
LSTR MSG_BACK = _UxGT("Retour");
+
LSTR MSG_MEDIA_ABORTING = _UxGT("Annulation...");
LSTR MSG_MEDIA_INSERTED = _UxGT("Media insere");
LSTR MSG_MEDIA_REMOVED = _UxGT("Media retire");
- LSTR MSG_MEDIA_WAITING = _UxGT("Attente media");
LSTR MSG_MEDIA_READ_ERROR = _UxGT("Err lecture media");
- LSTR MSG_MEDIA_USB_REMOVED = _UxGT("USB debranche");
- LSTR MSG_MEDIA_USB_FAILED = _UxGT("Erreur media USB");
+ LSTR MSG_USB_FD_DEVICE_REMOVED = _UxGT("USB debranche");
+ LSTR MSG_USB_FD_USB_FAILED = _UxGT("Erreur media USB");
+
LSTR MSG_LCD_ENDSTOPS = _UxGT("Butees");
LSTR MSG_LCD_SOFT_ENDSTOPS = _UxGT("Butees SW");
LSTR MSG_MAIN_MENU = _UxGT("Menu principal");
diff --git a/Marlin/src/lcd/language/language_gl.h b/Marlin/src/lcd/language/language_gl.h
index 3b7620de90..6285626625 100644
--- a/Marlin/src/lcd/language/language_gl.h
+++ b/Marlin/src/lcd/language/language_gl.h
@@ -48,14 +48,15 @@ namespace LanguageNarrow_gl {
LSTR MSG_YES = _UxGT("SI");
LSTR MSG_NO = _UxGT("NON");
LSTR MSG_BACK = _UxGT("Atrás");
+
LSTR MSG_MEDIA_ABORTING = _UxGT("Cancelando...");
LSTR MSG_MEDIA_INSERTED = _UxGT("Tarxeta inserida");
LSTR MSG_MEDIA_REMOVED = _UxGT("Tarxeta retirada");
- LSTR MSG_MEDIA_WAITING = _UxGT("Agardando ao ") MEDIA_TYPE_GL;
LSTR MSG_MEDIA_READ_ERROR = _UxGT("Erro lectura ") MEDIA_TYPE_GL;
- LSTR MSG_MEDIA_USB_REMOVED = _UxGT("Disp. USB retirado");
- LSTR MSG_MEDIA_USB_FAILED = _UxGT("Inicio USB fallido");
+ LSTR MSG_USB_FD_DEVICE_REMOVED = _UxGT("Disp. USB retirado");
+ LSTR MSG_USB_FD_USB_FAILED = _UxGT("Inicio USB fallido");
LSTR MSG_KILL_SUBCALL_OVERFLOW = _UxGT("Desbord. Subch.");
+
LSTR MSG_LCD_ENDSTOPS = _UxGT("FinCarro");
LSTR MSG_LCD_SOFT_ENDSTOPS = _UxGT("FinCarro SW");
LSTR MSG_MAIN_MENU = _UxGT("Menú principal");
diff --git a/Marlin/src/lcd/language/language_hu.h b/Marlin/src/lcd/language/language_hu.h
index 3159b79827..7a3e51539c 100644
--- a/Marlin/src/lcd/language/language_hu.h
+++ b/Marlin/src/lcd/language/language_hu.h
@@ -43,15 +43,16 @@ namespace LanguageNarrow_hu {
LSTR MSG_YES = _UxGT("IGEN");
LSTR MSG_NO = _UxGT("NEM");
LSTR MSG_BACK = _UxGT("Vissza");
+
LSTR MSG_MEDIA_ABORTING = _UxGT("Megszakítás...");
LSTR MSG_MEDIA_INSERTED = _UxGT("Tároló behelyezve");
LSTR MSG_MEDIA_REMOVED = _UxGT("Tároló eltávolítva");
- LSTR MSG_MEDIA_WAITING = _UxGT("Várakozás a tárolóra");
LSTR MSG_MEDIA_INIT_FAIL = _UxGT("Tároló-kártya hiba");
LSTR MSG_MEDIA_READ_ERROR = _UxGT("Tároló olvasási hiba");
- LSTR MSG_MEDIA_USB_REMOVED = _UxGT("USB eltávolítva");
- LSTR MSG_MEDIA_USB_FAILED = _UxGT("USB eszköz hiba");
+ LSTR MSG_USB_FD_DEVICE_REMOVED = _UxGT("USB eltávolítva");
+ LSTR MSG_USB_FD_USB_FAILED = _UxGT("USB eszköz hiba");
LSTR MSG_KILL_SUBCALL_OVERFLOW = _UxGT("Túlfolyás");
+
LSTR MSG_LCD_ENDSTOPS = _UxGT("Végállás"); // Maximum 8 karakter
LSTR MSG_LCD_SOFT_ENDSTOPS = _UxGT("Szoft. végállás");
LSTR MSG_MAIN_MENU = _UxGT("");
diff --git a/Marlin/src/lcd/language/language_it.h b/Marlin/src/lcd/language/language_it.h
index 0e8689cb0f..bdcd0b8ff6 100644
--- a/Marlin/src/lcd/language/language_it.h
+++ b/Marlin/src/lcd/language/language_it.h
@@ -59,16 +59,19 @@ namespace LanguageNarrow_it {
LSTR MSG_LOW = _UxGT("BASSO");
LSTR MSG_BACK = _UxGT("Indietro");
LSTR MSG_ERROR = _UxGT("Errore");
+
LSTR MSG_MEDIA_ABORTING = _UxGT("Annullando...");
LSTR MSG_MEDIA_INSERTED = MEDIA_TYPE_IT _UxGT(" inserito");
LSTR MSG_MEDIA_REMOVED = MEDIA_TYPE_IT _UxGT(" rimosso");
- LSTR MSG_MEDIA_WAITING = _UxGT("Aspettando ") MEDIA_TYPE_IT;
LSTR MSG_MEDIA_INIT_FAIL = _UxGT("Iniz.") MEDIA_TYPE_IT _UxGT(" fallita");
LSTR MSG_MEDIA_READ_ERROR = _UxGT("Err.leggendo ") MEDIA_TYPE_IT;
- LSTR MSG_MEDIA_USB_REMOVED = _UxGT("Dispos.USB rimosso");
- LSTR MSG_MEDIA_USB_FAILED = _UxGT("Avvio USB fallito");
LSTR MSG_MEDIA_SORT = _UxGT("Ordina ") MEDIA_TYPE_IT;
LSTR MSG_MEDIA_UPDATE = _UxGT("Aggiorna ") MEDIA_TYPE_IT;
+ LSTR MSG_USB_FD_WAITING_FOR_MEDIA = _UxGT("In attesa unità USB");
+ LSTR MSG_USB_FD_MEDIA_REMOVED = _UxGT("Unità USB rimossa");
+ LSTR MSG_USB_FD_DEVICE_REMOVED = _UxGT("Unità USB rimossa");
+ LSTR MSG_USB_FD_USB_FAILED = _UxGT("Iniz. USB fallita");
+
LSTR MSG_KILL_SUBCALL_OVERFLOW = _UxGT("Overflow sottochiamate");
LSTR MSG_LCD_ENDSTOPS = _UxGT("Finecor."); // Max 8 characters
LSTR MSG_LCD_SOFT_ENDSTOPS = _UxGT("Finecorsa soft");
@@ -848,6 +851,7 @@ namespace LanguageNarrow_it {
LSTR MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("Spurgo filamento"));
LSTR MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_1_LINE("Premi x terminare"));
LSTR MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Ripresa..."));
+
LSTR MSG_TMC_DRIVERS = _UxGT("Driver TMC");
LSTR MSG_TMC_CURRENT = _UxGT("Corrente driver");
LSTR MSG_TMC_ACURRENT = _UxGT("Corrente driver ") STR_A;
diff --git a/Marlin/src/lcd/language/language_pl.h b/Marlin/src/lcd/language/language_pl.h
index 7c7297d184..df0f995416 100644
--- a/Marlin/src/lcd/language/language_pl.h
+++ b/Marlin/src/lcd/language/language_pl.h
@@ -48,14 +48,15 @@ namespace LanguageNarrow_pl {
LSTR MSG_YES = _UxGT("TAK");
LSTR MSG_NO = _UxGT("NIE");
LSTR MSG_BACK = _UxGT("Wstecz");
+
LSTR MSG_MEDIA_ABORTING = _UxGT("Przerywanie...");
LSTR MSG_MEDIA_INSERTED = _UxGT("Karta włożona");
LSTR MSG_MEDIA_REMOVED = _UxGT("Karta usunięta");
- LSTR MSG_MEDIA_WAITING = _UxGT("Oczekiwanie na kartę");
LSTR MSG_MEDIA_INIT_FAIL = _UxGT("Błąd inicializacji karty");
LSTR MSG_MEDIA_READ_ERROR = _UxGT("Bład odczytu karty");
- LSTR MSG_MEDIA_USB_REMOVED = _UxGT("Urządzenie USB usunięte");
- LSTR MSG_MEDIA_USB_FAILED = _UxGT("Błąd uruchomienia USB");
+ LSTR MSG_USB_FD_DEVICE_REMOVED = _UxGT("Urządzenie USB usunięte");
+ LSTR MSG_USB_FD_USB_FAILED = _UxGT("Błąd uruchomienia USB");
+
LSTR MSG_LCD_ENDSTOPS = _UxGT("Krańców."); // Max length 8 characters
LSTR MSG_LCD_SOFT_ENDSTOPS = _UxGT("Progr. Krańcówki");
LSTR MSG_MAIN_MENU = _UxGT("Menu główne");
diff --git a/Marlin/src/lcd/language/language_pt_br.h b/Marlin/src/lcd/language/language_pt_br.h
index 80a8d95bdb..49c52300f9 100644
--- a/Marlin/src/lcd/language/language_pt_br.h
+++ b/Marlin/src/lcd/language/language_pt_br.h
@@ -38,13 +38,14 @@ namespace LanguageNarrow_pt_br {
LSTR MSG_YES = _UxGT("SIM");
LSTR MSG_NO = _UxGT("NÃO");
LSTR MSG_BACK = _UxGT("Voltar");
+
LSTR MSG_MEDIA_ABORTING = _UxGT("Abortando...");
LSTR MSG_MEDIA_INSERTED = _UxGT("Cartão inserido");
LSTR MSG_MEDIA_REMOVED = _UxGT("Cartão removido");
- LSTR MSG_MEDIA_WAITING = _UxGT("Aguardando cartão");
LSTR MSG_MEDIA_READ_ERROR = _UxGT("Erro de leitura");
- LSTR MSG_MEDIA_USB_REMOVED = _UxGT("USB removido");
- LSTR MSG_MEDIA_USB_FAILED = _UxGT("USB falhou");
+ LSTR MSG_USB_FD_DEVICE_REMOVED = _UxGT("USB removido");
+ LSTR MSG_USB_FD_USB_FAILED = _UxGT("USB falhou");
+
LSTR MSG_LCD_ENDSTOPS = _UxGT("Fins de curso");
LSTR MSG_LCD_SOFT_ENDSTOPS = _UxGT("Soft Fins curso");
LSTR MSG_MAIN_MENU = _UxGT("Menu principal");
diff --git a/Marlin/src/lcd/language/language_ro.h b/Marlin/src/lcd/language/language_ro.h
index 7337862909..3a939c6a3d 100644
--- a/Marlin/src/lcd/language/language_ro.h
+++ b/Marlin/src/lcd/language/language_ro.h
@@ -39,14 +39,15 @@ namespace LanguageNarrow_ro {
LSTR MSG_YES = _UxGT("DA");
LSTR MSG_NO = _UxGT("NU");
LSTR MSG_BACK = _UxGT("Inapoi");
+
LSTR MSG_MEDIA_ABORTING = _UxGT("Abandon...");
LSTR MSG_MEDIA_INSERTED = _UxGT("Media Introdus");
LSTR MSG_MEDIA_REMOVED = _UxGT("Media Inlaturat");
- LSTR MSG_MEDIA_WAITING = _UxGT("Astept Media");
LSTR MSG_MEDIA_READ_ERROR = _UxGT("Eroare Citire Media");
- LSTR MSG_MEDIA_USB_REMOVED = _UxGT("Dispozitiv USB Inlaturat");
- LSTR MSG_MEDIA_USB_FAILED = _UxGT("Pornire USB Esuata");
+ LSTR MSG_USB_FD_DEVICE_REMOVED = _UxGT("Dispozitiv USB Inlaturat");
+ LSTR MSG_USB_FD_USB_FAILED = _UxGT("Pornire USB Esuata");
LSTR MSG_KILL_SUBCALL_OVERFLOW = _UxGT("Eroare:Subcall Overflow");
+
LSTR MSG_LCD_ENDSTOPS = _UxGT("Endstops"); // Max length 8 characters
LSTR MSG_LCD_SOFT_ENDSTOPS = _UxGT("Soft Endstops");
LSTR MSG_MAIN_MENU = _UxGT("Principal");
diff --git a/Marlin/src/lcd/language/language_ru.h b/Marlin/src/lcd/language/language_ru.h
index 40b3a03d3d..37bc17aa0c 100644
--- a/Marlin/src/lcd/language/language_ru.h
+++ b/Marlin/src/lcd/language/language_ru.h
@@ -39,16 +39,17 @@ namespace LanguageNarrow_ru {
LSTR MSG_YES = _UxGT("Да");
LSTR MSG_NO = _UxGT("Нет");
LSTR MSG_BACK = _UxGT("Назад");
+
LSTR MSG_MEDIA_ABORTING = _UxGT("Прерывание...");
LSTR MSG_MEDIA_INSERTED = _UxGT("SD карта вставлена");
LSTR MSG_MEDIA_REMOVED = _UxGT("SD карта извлечена");
- LSTR MSG_MEDIA_WAITING = _UxGT("Вставьте SD карту");
LSTR MSG_MEDIA_INIT_FAIL = _UxGT("Сбой инициализ. SD");
LSTR MSG_ADVANCED_SETTINGS = _UxGT("Расшир. настройки");
LSTR MSG_KILL_SUBCALL_OVERFLOW = _UxGT("Переполн. вызова");
LSTR MSG_MEDIA_READ_ERROR = _UxGT("Ошибка чтения");
- LSTR MSG_MEDIA_USB_REMOVED = _UxGT("USB диск удалён");
- LSTR MSG_MEDIA_USB_FAILED = _UxGT("Ошибка USB диска");
+ LSTR MSG_USB_FD_DEVICE_REMOVED = _UxGT("USB диск удалён");
+ LSTR MSG_USB_FD_USB_FAILED = _UxGT("Ошибка USB диска");
+
LSTR MSG_LCD_SOFT_ENDSTOPS = _UxGT("Прогр. концевики");
LSTR MSG_LCD_ENDSTOPS = _UxGT("Концевик"); // Max length 8 characters
LSTR MSG_MAIN_MENU = _UxGT("Главное меню");
diff --git a/Marlin/src/lcd/language/language_sk.h b/Marlin/src/lcd/language/language_sk.h
index 7a8c228d84..f1efc0e7c3 100644
--- a/Marlin/src/lcd/language/language_sk.h
+++ b/Marlin/src/lcd/language/language_sk.h
@@ -54,14 +54,15 @@ namespace LanguageNarrow_sk {
LSTR MSG_LOW = _UxGT("NÍZKA");
LSTR MSG_BACK = _UxGT("Naspäť");
LSTR MSG_ERROR = _UxGT("Chyba");
+
LSTR MSG_MEDIA_ABORTING = _UxGT("Ruším...");
LSTR MSG_MEDIA_INSERTED = _UxGT("Karta vložená");
LSTR MSG_MEDIA_REMOVED = _UxGT("Karta vybraná");
- LSTR MSG_MEDIA_WAITING = _UxGT("Čakám na kartu");
LSTR MSG_MEDIA_INIT_FAIL = _UxGT("Inicial.karty zlyhala");
LSTR MSG_MEDIA_READ_ERROR = _UxGT("Chyba čítania karty");
- LSTR MSG_MEDIA_USB_REMOVED = _UxGT("USB zaria. odstrán.");
- LSTR MSG_MEDIA_USB_FAILED = _UxGT("Chyba spúšťania USB");
+ LSTR MSG_USB_FD_DEVICE_REMOVED = _UxGT("USB zaria. odstrán.");
+ LSTR MSG_USB_FD_USB_FAILED = _UxGT("Chyba spúšťania USB");
+
LSTR MSG_KILL_SUBCALL_OVERFLOW = _UxGT("Preteč. podprogramu");
LSTR MSG_LCD_ENDSTOPS = _UxGT("Endstopy"); // max 8 znakov
LSTR MSG_LCD_SOFT_ENDSTOPS = _UxGT("Soft. endstopy");
diff --git a/Marlin/src/lcd/language/language_sv.h b/Marlin/src/lcd/language/language_sv.h
index e2e408391c..33ffe8a77d 100644
--- a/Marlin/src/lcd/language/language_sv.h
+++ b/Marlin/src/lcd/language/language_sv.h
@@ -40,15 +40,16 @@ namespace LanguageNarrow_sv {
LSTR MSG_YES = _UxGT("JA");
LSTR MSG_NO = _UxGT("NEJ");
LSTR MSG_BACK = _UxGT("Bakåt");
+
LSTR MSG_MEDIA_ABORTING = _UxGT("Avbryter...");
LSTR MSG_MEDIA_INSERTED = _UxGT("Media Instatt");
LSTR MSG_MEDIA_REMOVED = _UxGT("Media Borttaget");
- LSTR MSG_MEDIA_WAITING = _UxGT("Väntar på media");
LSTR MSG_MEDIA_INIT_FAIL = _UxGT("Media init misslyckades");
LSTR MSG_MEDIA_READ_ERROR = _UxGT("Media läsningsfel");
- LSTR MSG_MEDIA_USB_REMOVED = _UxGT("USB enhet borttagen");
- LSTR MSG_MEDIA_USB_FAILED = _UxGT("USB start misslyckad");
+ LSTR MSG_USB_FD_DEVICE_REMOVED = _UxGT("USB enhet borttagen");
+ LSTR MSG_USB_FD_USB_FAILED = _UxGT("USB start misslyckad");
LSTR MSG_KILL_SUBCALL_OVERFLOW = _UxGT("Underanrop överskriden");
+
LSTR MSG_LCD_ENDSTOPS = _UxGT("Slutstop"); // Max length 8 characters
LSTR MSG_LCD_SOFT_ENDSTOPS = _UxGT("Mjuk slutstopp");
LSTR MSG_MAIN_MENU = _UxGT("Huvud");
diff --git a/Marlin/src/lcd/language/language_tr.h b/Marlin/src/lcd/language/language_tr.h
index 36fe4188fa..9e4f261271 100644
--- a/Marlin/src/lcd/language/language_tr.h
+++ b/Marlin/src/lcd/language/language_tr.h
@@ -52,17 +52,18 @@ namespace LanguageNarrow_tr {
LSTR MSG_LOW = _UxGT("DÜŞÜK");
LSTR MSG_BACK = _UxGT("Geri");
LSTR MSG_ERROR = _UxGT("Hata");
+
LSTR MSG_MEDIA_ABORTING = _UxGT("Durduruluyor...");
LSTR MSG_MEDIA_INSERTED = _UxGT("SD K. Yerleştirildi.");
LSTR MSG_MEDIA_REMOVED = _UxGT("SD Kart Çıkarıldı.");
- LSTR MSG_MEDIA_WAITING = _UxGT("SD Kart Bekleniyor");
LSTR MSG_MEDIA_INIT_FAIL = _UxGT("SD K. Başlatma Hatası");
LSTR MSG_MEDIA_READ_ERROR = _UxGT("Kart Okuma Hatası");
- LSTR MSG_MEDIA_USB_REMOVED = _UxGT("USB Çıkarıldı");
- LSTR MSG_MEDIA_USB_FAILED = _UxGT("USB Başlat. Hatası");
+ LSTR MSG_USB_FD_DEVICE_REMOVED = _UxGT("USB Çıkarıldı");
+ LSTR MSG_USB_FD_USB_FAILED = _UxGT("USB Başlat. Hatası");
LSTR MSG_MEDIA_SORT = _UxGT("Medyayı Sırala");
LSTR MSG_MEDIA_UPDATE = _UxGT("Medyayı Güncelle");
LSTR MSG_KILL_SUBCALL_OVERFLOW = _UxGT("Subcall Overflow");
+
LSTR MSG_LCD_ENDSTOPS = _UxGT("Endstops"); // Max length 8 characters
LSTR MSG_LCD_SOFT_ENDSTOPS = _UxGT("Soft Endstops");
LSTR MSG_MAIN_MENU = _UxGT("Ana");
diff --git a/Marlin/src/lcd/language/language_uk.h b/Marlin/src/lcd/language/language_uk.h
index 4d323d6ba7..a6d87e2ae8 100644
--- a/Marlin/src/lcd/language/language_uk.h
+++ b/Marlin/src/lcd/language/language_uk.h
@@ -40,15 +40,16 @@ namespace LanguageNarrow_uk {
LSTR MSG_YES = _UxGT("ТАК");
LSTR MSG_NO = _UxGT("НІ");
LSTR MSG_BACK = _UxGT("Назад");
+
LSTR MSG_MEDIA_ABORTING = _UxGT("Переривання...");
LSTR MSG_MEDIA_INSERTED = _UxGT("SD-картка вставлена");
LSTR MSG_MEDIA_REMOVED = _UxGT("SD-картка видалена");
- LSTR MSG_MEDIA_WAITING = _UxGT("Вставте SD-картку");
LSTR MSG_MEDIA_INIT_FAIL = _UxGT("Збій ініціаліз. SD");
LSTR MSG_MEDIA_READ_ERROR = _UxGT("Помилка зчитування");
- LSTR MSG_MEDIA_USB_REMOVED = _UxGT("USB диск видалений");
- LSTR MSG_MEDIA_USB_FAILED = _UxGT("Помилка USB диску");
+ LSTR MSG_USB_FD_DEVICE_REMOVED = _UxGT("USB диск видалений");
+ LSTR MSG_USB_FD_USB_FAILED = _UxGT("Помилка USB диску");
LSTR MSG_KILL_SUBCALL_OVERFLOW = _UxGT("Переповн. виклику");
+
LSTR MSG_LCD_SOFT_ENDSTOPS = _UxGT("Прогр.кінцевики");
LSTR MSG_LCD_ENDSTOPS = _UxGT("Кінцевик"); // Max length 8 characters
LSTR MSG_MAIN_MENU = _UxGT("Основне меню");
diff --git a/Marlin/src/lcd/language/language_vi.h b/Marlin/src/lcd/language/language_vi.h
index f7f5545bcb..e411668a91 100644
--- a/Marlin/src/lcd/language/language_vi.h
+++ b/Marlin/src/lcd/language/language_vi.h
@@ -35,13 +35,14 @@ namespace LanguageNarrow_vi {
LSTR WELCOME_MSG = MACHINE_NAME_SUBST _UxGT(" Sẵn sàng."); // Ready
LSTR MSG_BACK = _UxGT("Trở lại"); // Back
+
LSTR MSG_MEDIA_ABORTING = _UxGT("Đang hủy bỏ...");
LSTR MSG_MEDIA_INSERTED = _UxGT("Phương tiện được cắm vào"); // Media inserted
LSTR MSG_MEDIA_REMOVED = _UxGT("Phương tiện được rút ra");
- LSTR MSG_MEDIA_WAITING = _UxGT("Chờ đợi phương tiện");
LSTR MSG_MEDIA_READ_ERROR = _UxGT("Lỗi đọc phương tiện");
- LSTR MSG_MEDIA_USB_REMOVED = _UxGT("USB được rút ra");
- LSTR MSG_MEDIA_USB_FAILED = _UxGT("USB khởi thất bại");
+ LSTR MSG_USB_FD_DEVICE_REMOVED = _UxGT("USB được rút ra");
+ LSTR MSG_USB_FD_USB_FAILED = _UxGT("USB khởi thất bại");
+
LSTR MSG_LCD_ENDSTOPS = _UxGT("Công tắc"); // Endstops - công tắc hành trình
LSTR MSG_LCD_SOFT_ENDSTOPS = _UxGT("Công tắc mềm"); // Soft Endstops
LSTR MSG_MAIN_MENU = _UxGT("Chính"); // Main
diff --git a/Marlin/src/lcd/language/language_zh_CN.h b/Marlin/src/lcd/language/language_zh_CN.h
index 01f9f53d0c..ff095889af 100644
--- a/Marlin/src/lcd/language/language_zh_CN.h
+++ b/Marlin/src/lcd/language/language_zh_CN.h
@@ -41,14 +41,15 @@ namespace LanguageNarrow_zh_CN {
LSTR MSG_LOW = _UxGT("低");
LSTR MSG_BACK = _UxGT("返回"); // ”Back“
LSTR MSG_ERROR = _UxGT("错误");
+
LSTR MSG_MEDIA_ABORTING = _UxGT("存储卡中止...");
LSTR MSG_MEDIA_INSERTED = _UxGT("存储卡已插入"); // "Card inserted"
LSTR MSG_MEDIA_REMOVED = _UxGT("存储卡被拔出"); // "Card removed"
- LSTR MSG_MEDIA_WAITING = _UxGT("等待存储器");
LSTR MSG_MEDIA_READ_ERROR = _UxGT("卡读卡器错误");
- LSTR MSG_MEDIA_USB_REMOVED = _UxGT("USB设备已弹出");
- LSTR MSG_MEDIA_USB_FAILED = _UxGT("USB读取失败");
+ LSTR MSG_USB_FD_DEVICE_REMOVED = _UxGT("USB设备已弹出");
+ LSTR MSG_USB_FD_USB_FAILED = _UxGT("USB读取失败");
LSTR MSG_KILL_SUBCALL_OVERFLOW = _UxGT("子响应溢出");
+
LSTR MSG_LCD_ENDSTOPS = _UxGT("挡块"); // "Endstops" // Max length 8 characters
LSTR MSG_LCD_SOFT_ENDSTOPS = _UxGT("软挡块");
LSTR MSG_MAIN_MENU = _UxGT("主菜单"); // "Main"
diff --git a/Marlin/src/lcd/language/language_zh_TW.h b/Marlin/src/lcd/language/language_zh_TW.h
index 7321252de7..ecacf7e33d 100644
--- a/Marlin/src/lcd/language/language_zh_TW.h
+++ b/Marlin/src/lcd/language/language_zh_TW.h
@@ -37,13 +37,14 @@ namespace LanguageNarrow_zh_TW {
LSTR MSG_YES = _UxGT("是"); // "YES"
LSTR MSG_NO = _UxGT("否"); // "NO"
LSTR MSG_BACK = _UxGT("返回"); // "Back"
+
LSTR MSG_MEDIA_ABORTING = _UxGT("正在中止..."); // "Aborting..."
LSTR MSG_MEDIA_INSERTED = _UxGT("記憶卡已插入"); // "Card inserted"
LSTR MSG_MEDIA_REMOVED = _UxGT("記憶卡被拔出"); // "Card removed"
- LSTR MSG_MEDIA_WAITING = _UxGT("等待記憶卡"); // "Waiting for media"
LSTR MSG_MEDIA_READ_ERROR = _UxGT("記憶卡讀取錯誤"); //"Media read error"
- LSTR MSG_MEDIA_USB_REMOVED = _UxGT("USB裝置已移除"); // "USB device removed"
- LSTR MSG_MEDIA_USB_FAILED = _UxGT("USB啟動失敗"); // "USB start failed"
+ LSTR MSG_USB_FD_DEVICE_REMOVED = _UxGT("USB裝置已移除"); // "USB device removed"
+ LSTR MSG_USB_FD_USB_FAILED = _UxGT("USB啟動失敗"); // "USB start failed"
+
LSTR MSG_LCD_ENDSTOPS = _UxGT("擋塊"); // "Endstops" // Max length 8 characters
LSTR MSG_LCD_SOFT_ENDSTOPS = _UxGT("軟體擋塊"); // "Soft Endstops"
LSTR MSG_MAIN_MENU = _UxGT("主選單"); // "Main"
diff --git a/Marlin/src/lcd/marlinui.cpp b/Marlin/src/lcd/marlinui.cpp
index ab932adfcd..9cfc6498a8 100644
--- a/Marlin/src/lcd/marlinui.cpp
+++ b/Marlin/src/lcd/marlinui.cpp
@@ -1957,7 +1957,7 @@ uint8_t expand_u8str_P(char * const outstr, PGM_P const ptpl, const int8_t ind,
if ((old_status ^ status) & INSERT_SD)
LCD_MESSAGE(MSG_MEDIA_REMOVED_SD);
else if ((old_status ^ status) & INSERT_USB)
- LCD_MESSAGE(MSG_MEDIA_REMOVED_USB);
+ LCD_MESSAGE(MSG_USB_FD_MEDIA_REMOVED);
else
LCD_MESSAGE(MSG_MEDIA_REMOVED);
diff --git a/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.cpp b/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.cpp
index 8b25df16b9..fde697c1f4 100644
--- a/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.cpp
+++ b/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.cpp
@@ -128,7 +128,7 @@ bool DiskIODriver_USBFlash::usbStartup() {
SERIAL_ECHOPGM("Starting USB host...");
if (!UHS_START) {
SERIAL_ECHOLNPGM(" failed.");
- LCD_MESSAGE(MSG_MEDIA_USB_FAILED);
+ LCD_MESSAGE(MSG_USB_FD_USB_FAILED);
return false;
}
@@ -223,8 +223,8 @@ void DiskIODriver_USBFlash::idle() {
#endif
#if USB_DEBUG >= 1
SERIAL_ECHOLNPGM("Waiting for media");
+ LCD_MESSAGE(MSG_USB_FD_WAITING_FOR_MEDIA);
#endif
- LCD_MESSAGE(MSG_MEDIA_WAITING);
GOTO_STATE_AFTER_DELAY(state, 2000);
}
break;
@@ -237,9 +237,9 @@ void DiskIODriver_USBFlash::idle() {
// Handle device removal events
#if USB_DEBUG >= 1
SERIAL_ECHOLNPGM("USB device removed");
+ if (state != MEDIA_READY)
+ LCD_MESSAGE(MSG_USB_FD_DEVICE_REMOVED);
#endif
- if (state != MEDIA_READY)
- LCD_MESSAGE(MSG_MEDIA_USB_REMOVED);
GOTO_STATE_AFTER_DELAY(WAIT_FOR_DEVICE, 0);
}
@@ -247,8 +247,8 @@ void DiskIODriver_USBFlash::idle() {
// Handle media removal events
#if USB_DEBUG >= 1
SERIAL_ECHOLNPGM("Media removed");
+ LCD_MESSAGE(MSG_USB_FD_MEDIA_REMOVED);
#endif
- LCD_MESSAGE(MSG_MEDIA_REMOVED);
GOTO_STATE_AFTER_DELAY(WAIT_FOR_DEVICE, 0);
}
From bc990ccca669e513be71050486f380161dfeee3c Mon Sep 17 00:00:00 2001
From: Giuliano <3684609+GMagician@users.noreply.github.com>
Date: Mon, 26 May 2025 18:43:47 +0200
Subject: [PATCH 021/326] =?UTF-8?q?=F0=9F=8C=90=20Update=20Italian=20langu?=
=?UTF-8?q?age=20(#27877)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
Marlin/src/lcd/language/language_it.h | 103 +++++++++++++++++++++-----
1 file changed, 86 insertions(+), 17 deletions(-)
diff --git a/Marlin/src/lcd/language/language_it.h b/Marlin/src/lcd/language/language_it.h
index bdcd0b8ff6..dbf093c042 100644
--- a/Marlin/src/lcd/language/language_it.h
+++ b/Marlin/src/lcd/language/language_it.h
@@ -61,9 +61,15 @@ namespace LanguageNarrow_it {
LSTR MSG_ERROR = _UxGT("Errore");
LSTR MSG_MEDIA_ABORTING = _UxGT("Annullando...");
- LSTR MSG_MEDIA_INSERTED = MEDIA_TYPE_IT _UxGT(" inserito");
- LSTR MSG_MEDIA_REMOVED = MEDIA_TYPE_IT _UxGT(" rimosso");
+ LSTR MSG_MEDIA_INSERTED = MEDIA_TYPE_IT _UxGT(" inserita");
+ LSTR MSG_MEDIA_INSERTED_SD = _UxGT("Scheda SD inserita");
+ LSTR MSG_MEDIA_INSERTED_USB = _UxGT("Unità USB inserita");
+ LSTR MSG_MEDIA_REMOVED = MEDIA_TYPE_IT _UxGT(" rimossa");
+ LSTR MSG_MEDIA_REMOVED_SD = _UxGT("Scheda SD rimossa");
+ LSTR MSG_MEDIA_REMOVED_USB = _UxGT("Unità USB rimossa");
LSTR MSG_MEDIA_INIT_FAIL = _UxGT("Iniz.") MEDIA_TYPE_IT _UxGT(" fallita");
+ LSTR MSG_MEDIA_INIT_FAIL_SD = _UxGT("Iniz. SD fallita");
+ LSTR MSG_MEDIA_INIT_FAIL_USB = _UxGT("Iniz. USB fallita");
LSTR MSG_MEDIA_READ_ERROR = _UxGT("Err.leggendo ") MEDIA_TYPE_IT;
LSTR MSG_MEDIA_SORT = _UxGT("Ordina ") MEDIA_TYPE_IT;
LSTR MSG_MEDIA_UPDATE = _UxGT("Aggiorna ") MEDIA_TYPE_IT;
@@ -136,11 +142,12 @@ namespace LanguageNarrow_it {
LSTR MSG_PREHEAT_M = _UxGT("Preriscalda $");
LSTR MSG_PREHEAT_M_H = _UxGT("Preriscalda $ ~");
- LSTR MSG_PREHEAT_M_END = _UxGT("Preris.$ ugello");
- LSTR MSG_PREHEAT_M_END_E = _UxGT("Preris.$ ugello ~");
- LSTR MSG_PREHEAT_M_ALL = _UxGT("Preris.$ tutto");
- LSTR MSG_PREHEAT_M_BEDONLY = _UxGT("Preris.$ piatto");
- LSTR MSG_PREHEAT_M_SETTINGS = _UxGT("Preris.$ conf");
+ LSTR MSG_PREHEAT_M_END = _UxGT("Preris.ugello $");
+ LSTR MSG_PREHEAT_M_END_E = _UxGT("Preris.ugello ~ $");
+ LSTR MSG_PREHEAT_M_ALL = _UxGT("Preris.tutto $");
+ LSTR MSG_PREHEAT_M_BEDONLY = _UxGT("Preris.piatto $");
+ LSTR MSG_PREHEAT_M_CHAMBER = _UxGT("Preris.camera $");
+ LSTR MSG_PREHEAT_M_SETTINGS = _UxGT("Preris.conf $");
LSTR MSG_PREHEAT_HOTEND = _UxGT("Prerisc.ugello");
LSTR MSG_PREHEAT_CUSTOM = _UxGT("Prerisc.personal.");
@@ -164,6 +171,7 @@ namespace LanguageNarrow_it {
LSTR MSG_SPINDLE_REVERSE = _UxGT("Inverti mandrino");
LSTR MSG_SWITCH_PS_ON = _UxGT("Accendi aliment.");
LSTR MSG_SWITCH_PS_OFF = _UxGT("Spegni aliment.");
+ LSTR MSG_POWER_EDM_FAULT = _UxGT("Anomalia alim.EDM");
LSTR MSG_EXTRUDE = _UxGT("Estrudi");
LSTR MSG_RETRACT = _UxGT("Ritrai");
LSTR MSG_MOVE_AXIS = _UxGT("Muovi asse");
@@ -181,6 +189,7 @@ namespace LanguageNarrow_it {
LSTR MSG_MESH_VIEWER = _UxGT("Visualiz. mesh");
LSTR MSG_EDIT_MESH = _UxGT("Modifica mesh");
LSTR MSG_MESH_VIEW = _UxGT("Visualizza mesh");
+ LSTR MSG_MESH_VIEW_GRID = _UxGT("Vis.mesh (griglia)");
LSTR MSG_EDITING_STOPPED = _UxGT("Modif. mesh fermata");
LSTR MSG_NO_VALID_MESH = _UxGT("Mesh non valida");
LSTR MSG_ACTIVATE_MESH = _UxGT("Attiva livellamento");
@@ -204,7 +213,9 @@ namespace LanguageNarrow_it {
LSTR MSG_M48_TEST = _UxGT("Test sonda M48");
LSTR MSG_M48_POINT = _UxGT("Punto M48");
LSTR MSG_M48_OUT_OF_BOUNDS = _UxGT("Sonda oltre i limiti");
+ LSTR MSG_M48_DEV = _UxGT("Dev");
LSTR MSG_M48_DEVIATION = _UxGT("Deviazione");
+ LSTR MSG_M48_MAX_DELTA = _UxGT("Delta max");
LSTR MSG_IDEX_MENU = _UxGT("Modo IDEX");
LSTR MSG_OFFSETS_MENU = _UxGT("Strumenti offsets");
LSTR MSG_IDEX_MODE_AUTOPARK = _UxGT("Auto-Park");
@@ -431,6 +442,7 @@ namespace LanguageNarrow_it {
LSTR MSG_AMAX_EN = _UxGT("Acc.massima *");
LSTR MSG_A_RETRACT = _UxGT("A-Ritrazione");
LSTR MSG_A_TRAVEL = _UxGT("A-Spostamento");
+ LSTR MSG_A_SPINDLE = _UxGT("Acc.mandrino");
LSTR MSG_INPUT_SHAPING = _UxGT("Input shaping");
LSTR MSG_SHAPING_ENABLE_N = _UxGT("Abilita shaping @");
LSTR MSG_SHAPING_DISABLE_N = _UxGT("Disabil. shaping @");
@@ -469,8 +481,10 @@ namespace LanguageNarrow_it {
LSTR MSG_DRAW_MAX_Y = _UxGT("Max Y area disegno");
LSTR MSG_MAX_BELT_LEN = _UxGT("Lungh.max cinghia");
LSTR MSG_LINEAR_ADVANCE = _UxGT("Avanzam.lineare");
- LSTR MSG_ADVANCE_K = _UxGT("K Avanzamento");
- LSTR MSG_ADVANCE_K_E = _UxGT("K Avanzamento *");
+ LSTR MSG_ADVANCE_K = _UxGT("K advance");
+ LSTR MSG_ADVANCE_TAU = _UxGT("Tau advance");
+ LSTR MSG_ADVANCE_K_E = _UxGT("K advance *");
+ LSTR MSG_ADVANCE_TAU_E = _UxGT("Tau advance *");
LSTR MSG_CONTRAST = _UxGT("Contrasto LCD");
LSTR MSG_BRIGHTNESS = _UxGT("Luminosità LCD");
LSTR MSG_SCREEN_TIMEOUT = _UxGT("Timeout LCD (m)");
@@ -535,10 +549,8 @@ namespace LanguageNarrow_it {
LSTR MSG_CANCEL_OBJECT = _UxGT("Cancella oggetto");
LSTR MSG_CANCEL_OBJECT_N = _UxGT("Canc. oggetto {");
LSTR MSG_CONTINUE_PRINT_JOB = _UxGT("Cont.proc.stampa");
- LSTR MSG_MEDIA_MENU = _UxGT("Stampa da ") MEDIA_TYPE_IT;
LSTR MSG_TURN_OFF = _UxGT("Spegni stampante");
LSTR MSG_END_LOOPS = _UxGT("Fine cicli di rip.");
- LSTR MSG_NO_MEDIA = MEDIA_TYPE_IT _UxGT(" non presente");
LSTR MSG_DWELL = _UxGT("Sospensione...");
LSTR MSG_USERWAIT = _UxGT("Premi tasto..");
LSTR MSG_PRINT_PAUSED = _UxGT("Stampa sospesa");
@@ -592,10 +604,20 @@ namespace LanguageNarrow_it {
LSTR MSG_ATTACH_MEDIA = _UxGT("Collega ") MEDIA_TYPE_IT;
LSTR MSG_ATTACH_SD = _UxGT("Collega scheda SD");
- LSTR MSG_ATTACH_USB = _UxGT("Collega penna USB");
- LSTR MSG_CHANGE_MEDIA = _UxGT("Cambia ") MEDIA_TYPE_IT;
+ LSTR MSG_ATTACH_USB = _UxGT("Collega unità USB");
LSTR MSG_RELEASE_MEDIA = _UxGT("Rilascia ") MEDIA_TYPE_IT;
- LSTR MSG_RUN_AUTOFILES = _UxGT("Esegui files auto");
+ LSTR MSG_RELEASE_SD = _UxGT("Rilascia sceda SD");
+ LSTR MSG_RELEASE_USB = _UxGT("Rilascia unità USB");
+ LSTR MSG_CHANGE_MEDIA = _UxGT("Selez.") MEDIA_TYPE_IT;
+ LSTR MSG_CHANGE_SD = _UxGT("Selez. scheda SD");
+ LSTR MSG_CHANGE_USB = _UxGT("Selez. unità USB");
+ LSTR MSG_RUN_AUTOFILES = _UxGT("Esegui Autofiles");
+ LSTR MSG_RUN_AUTOFILES_SD = _UxGT("Esegui Autofiles SD");
+ LSTR MSG_RUN_AUTOFILES_USB = _UxGT("Esegui Autofiles USB");
+ LSTR MSG_MEDIA_MENU = _UxGT("Stampa da ") MEDIA_TYPE_IT;
+ LSTR MSG_MEDIA_MENU_SD = _UxGT("Selez. da SD");
+ LSTR MSG_MEDIA_MENU_USB = _UxGT("Selez. da USB");
+ LSTR MSG_NO_MEDIA = MEDIA_TYPE_IT _UxGT(" non rilevato");
LSTR MSG_ZPROBE_OUT = _UxGT("Z probe fuori piatto");
LSTR MSG_SKEW_FACTOR = _UxGT("Fattore distorsione");
@@ -862,6 +884,7 @@ namespace LanguageNarrow_it {
LSTR MSG_TMC_HOMING_THRS = _UxGT("Sensorless homing");
LSTR MSG_TMC_STEPPING_MODE = _UxGT("Modo Stepping");
LSTR MSG_TMC_STEALTHCHOP = _UxGT("StealthChop");
+ LSTR MSG_TMC_HOMING_CURRENT = _UxGT("Corrente homing");
LSTR MSG_SERVICE_RESET = _UxGT("Resetta");
LSTR MSG_SERVICE_IN = _UxGT(" tra:");
@@ -901,6 +924,7 @@ namespace LanguageNarrow_it {
LSTR MSG_BOTTOM_LEFT = _UxGT("Basso sinistra");
LSTR MSG_TOP_RIGHT = _UxGT("Alto destra");
LSTR MSG_BOTTOM_RIGHT = _UxGT("Basso destra");
+ LSTR MSG_TOUCH_CALIBRATION = _UxGT("Calibrazione touch");
LSTR MSG_CALIBRATION_COMPLETED = _UxGT("Calibrazione completata");
LSTR MSG_CALIBRATION_FAILED = _UxGT("Calibrazione fallita");
@@ -911,7 +935,7 @@ namespace LanguageNarrow_it {
LSTR MSG_HOST_SHUTDOWN = _UxGT("Arresta host");
-// DGUS-Specific message strings, not used elsewhere
+ // DGUS-Specific message strings, not used elsewhere
LSTR DGUS_MSG_NOT_WHILE_PRINTING = _UxGT("Non ammesso durante la stampa");
LSTR DGUS_MSG_NOT_WHILE_IDLE = _UxGT("Non ammesso mentre è in riposo");
LSTR DGUS_MSG_NO_FILE_SELECTED = _UxGT("Nessun file selezionato");
@@ -943,17 +967,56 @@ namespace LanguageNarrow_it {
LSTR MSG_BTN_STOP = _UxGT("Stop");
LSTR MSG_BTN_DISABLE_MMU = _UxGT("Disabilita");
LSTR MSG_BTN_MORE = _UxGT("Più info");
+
+ // Prusa MMU
+ LSTR MSG_DONE = _UxGT("Eseguito");
+ LSTR MSG_FINISHING_MOVEMENTS = _UxGT("Termina movimenti");
+ LSTR MSG_LOADING_FILAMENT = _UxGT("Carica. filamento");
+ LSTR MSG_UNLOADING_FILAMENT = _UxGT("Scarico filamento");
+ LSTR MSG_TESTING_FILAMENT = _UxGT("Testando filamento");
+ LSTR MSG_EJECT_FROM_MMU = _UxGT("Espelli da MMU");
+ LSTR MSG_CUT_FILAMENT = _UxGT("Taglia filamento");
+ LSTR MSG_OFF = _UxGT("Off");
+ LSTR MSG_ON = _UxGT("On");
+ LSTR MSG_PROGRESS_OK = _UxGT("OK");
+ LSTR MSG_PROGRESS_ENGAGE_IDLER = _UxGT("Innesto idler");
+ LSTR MSG_PROGRESS_DISENGAGE_IDLER = _UxGT("Disinnesto idler");
+ LSTR MSG_PROGRESS_UNLOAD_FINDA = _UxGT("Scarico a FINDA");
+ LSTR MSG_PROGRESS_UNLOAD_PULLEY = _UxGT("Scarico a puleggia");
+ LSTR MSG_PROGRESS_FEED_FINDA = _UxGT("Alim. a FINDA");
+ LSTR MSG_PROGRESS_FEED_EXTRUDER = _UxGT("Alim. all'estrusore");
+ LSTR MSG_PROGRESS_FEED_NOZZLE = _UxGT("Alim. all'ugello");
+ LSTR MSG_PROGRESS_AVOID_GRIND = _UxGT("Evita grind");
+ LSTR MSG_PROGRESS_WAIT_USER = _UxGT("ERR attesa utente");
+ LSTR MSG_PROGRESS_ERR_INTERNAL = _UxGT("ERR interno");
+ LSTR MSG_PROGRESS_ERR_HELP_FIL = _UxGT("ERR aiuto filamento");
+ LSTR MSG_PROGRESS_ERR_TMC = _UxGT("ERR anomalia TMC");
+ LSTR MSG_PROGRESS_SELECT_SLOT = _UxGT("Selez.slot filam.");
+ LSTR MSG_PROGRESS_PREPARE_BLADE = _UxGT("Preparaz.lama");
+ LSTR MSG_PROGRESS_PUSH_FILAMENT = _UxGT("Spinta fialmento");
+ LSTR MSG_PROGRESS_PERFORM_CUT = _UxGT("Esecuzione taglio");
+ LSTR MSG_PROGRESSPSTRETURN_SELECTOR = _UxGT("Ritorno selettore");
+ LSTR MSG_PROGRESS_PARK_SELECTOR = _UxGT("Parcheggio selettore");
+ LSTR MSG_PROGRESS_EJECT_FILAMENT = _UxGT("Esplusione filamento");
+ LSTR MSG_PROGRESSPSTRETRACT_FINDA = _UxGT("Ritrai a FINDA");
+ LSTR MSG_PROGRESS_HOMING = _UxGT("Homing");
+ LSTR MSG_PROGRESS_MOVING_SELECTOR = _UxGT("Movim. selettore");
+ LSTR MSG_PROGRESS_FEED_FSENSOR = _UxGT("Alim. a FSensor");
}
namespace LanguageWide_it {
using namespace LanguageNarrow_it;
#if LCD_WIDTH >= 20 || HAS_DWIN_E3V2
+ LSTR MSG_LIVE_MOVE = _UxGT("Movimento live");
LSTR MSG_HOST_START_PRINT = _UxGT("Avvio stampa host");
LSTR MSG_PRINTING_OBJECT = _UxGT("Stampa oggetto");
LSTR MSG_CANCEL_OBJECT = _UxGT("Cancella oggetto");
LSTR MSG_CANCEL_OBJECT_N = _UxGT("Cancella oggetto {");
LSTR MSG_CONTINUE_PRINT_JOB = _UxGT("Continua il job di stampa");
- LSTR MSG_MEDIA_MENU = _UxGT("Selez.da supporto");
+ LSTR MSG_MEDIA_MENU = _UxGT("Seleziona da ") MEDIA_TYPE_IT;
+ LSTR MSG_MEDIA_MENU_SD = _UxGT("Seleziona da scheda SD");
+ LSTR MSG_MEDIA_MENU_USB = _UxGT("Seleziona da unità USB");
+ LSTR MSG_NO_MEDIA = MEDIA_TYPE_EN _UxGT(" non trovato");
LSTR MSG_TURN_OFF = _UxGT("Spegni la stampante");
LSTR MSG_END_LOOPS = _UxGT("Termina i cicli di ripetizione");
LSTR MSG_MEDIA_NOT_INSERTED = _UxGT("Nessun supporto inserito."); // ProUI
@@ -963,7 +1026,13 @@ namespace LanguageWide_it {
LSTR MSG_INFO_PRINT_TIME = _UxGT("Tempo totale");
LSTR MSG_INFO_PRINT_LONGEST = _UxGT("Lavoro più lungo");
LSTR MSG_INFO_PRINT_FILAMENT = _UxGT("Totale estruso");
- LSTR MSG_TEMP_TOO_LOW = _UxGT("Temperatura troppo bassa");
+ LSTR MSG_HOMING_FEEDRATE_N = _UxGT("Velocità @ di homing");
+ LSTR MSG_HOMING_FEEDRATE_X = _UxGT("Velocità X di homing");
+ LSTR MSG_HOMING_FEEDRATE_Y = _UxGT("Velocità Y di homing");
+ LSTR MSG_HOMING_FEEDRATE_Z = _UxGT("Velocità Z di homing");
+ LSTR MSG_EEPROM_INITIALIZED = _UxGT("Ripristinate impostazioni predefinite");
+ LSTR MSG_PREHEAT_M_CHAMBER = _UxGT("Preriscalda camera per $");
+ LSTR MSG_PREHEAT_M_SETTINGS = _UxGT("Configurazioni preriscaldo $");
#endif
}
From af7b126edc3d6fbbbf26b1221f0c2cb5b7a82160 Mon Sep 17 00:00:00 2001
From: thinkyhead
Date: Mon, 26 May 2025 18:09:01 +0000
Subject: [PATCH 022/326] [cron] Bump distribution date (2025-05-26)
---
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 82979634d4..b46b688339 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 "2025-05-25"
+//#define STRING_DISTRIBUTION_DATE "2025-05-26"
/**
* The protocol for communication to the host. Protocol indicates communication
diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h
index 7c80ca1f17..06c29974a7 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 "2025-05-25"
+ #define STRING_DISTRIBUTION_DATE "2025-05-26"
#endif
/**
From 0916d325898cba1314e9502690f908547d34fbd6 Mon Sep 17 00:00:00 2001
From: Scott Lahteine
Date: Mon, 26 May 2025 14:33:40 -0500
Subject: [PATCH 023/326] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20Ser?=
=?UTF-8?q?ial=20ON=5FOFF,=20TRUE=5FFALSE?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
Marlin/src/core/serial.cpp | 4 ---
Marlin/src/core/serial.h | 6 ++--
Marlin/src/feature/meatpack.cpp | 8 +++--
Marlin/src/feature/tmc_util.cpp | 32 ++++++++++---------
Marlin/src/gcode/bedlevel/M420.cpp | 9 ++----
Marlin/src/gcode/bedlevel/mbl/G29.cpp | 2 +-
Marlin/src/gcode/control/M211.cpp | 3 +-
Marlin/src/gcode/control/M605.cpp | 3 +-
Marlin/src/gcode/feature/mixing/M166.cpp | 3 +-
Marlin/src/gcode/feature/powerloss/M413.cpp | 5 ++-
.../gcode/feature/prusa_MMU2/M704-M709.cpp | 9 +++---
Marlin/src/gcode/feature/runout/M412.cpp | 11 +++----
.../src/gcode/feature/trinamic/M911-M914.cpp | 4 +--
Marlin/src/gcode/probe/M401_M402.cpp | 4 +--
Marlin/src/gcode/temp/M303.cpp | 4 +--
15 files changed, 45 insertions(+), 62 deletions(-)
diff --git a/Marlin/src/core/serial.cpp b/Marlin/src/core/serial.cpp
index 8a8378330f..3ddfa6d345 100644
--- a/Marlin/src/core/serial.cpp
+++ b/Marlin/src/core/serial.cpp
@@ -114,10 +114,6 @@ void serial_ternary(FSTR_P const pre, const bool onoff, FSTR_P const on, FSTR_P
if (post) SERIAL_ECHO(post);
}
-void serialprint_onoff(const bool onoff) { SERIAL_ECHO(onoff ? F(STR_ON) : F(STR_OFF)); }
-void serialprintln_onoff(const bool onoff) { serialprint_onoff(onoff); SERIAL_EOL(); }
-void serialprint_truefalse(const bool tf) { SERIAL_ECHO(tf ? F("true") : F("false")); }
-
void print_bin(uint16_t val) {
for (uint8_t i = 16; i--;) {
SERIAL_CHAR('0' + TEST(val, i));
diff --git a/Marlin/src/core/serial.h b/Marlin/src/core/serial.h
index 97f31dea35..8ec8b8db2a 100644
--- a/Marlin/src/core/serial.h
+++ b/Marlin/src/core/serial.h
@@ -233,9 +233,9 @@ void serial_ternary(FSTR_P const pre, const bool onoff, FSTR_P const on, FSTR_P
// Print up to 255 spaces
void SERIAL_ECHO_SP(uint8_t count);
-void serialprint_onoff(const bool onoff);
-void serialprintln_onoff(const bool onoff);
-void serialprint_truefalse(const bool tf);
+inline FSTR_P const ON_OFF(const bool onoff) { return onoff ? F("ON") : F("OFF"); }
+inline FSTR_P const TRUE_FALSE(const bool tf) { return tf ? F("true") : F("false"); }
+
void serial_offset(const_float_t v, const uint8_t sp=0); // For v==0 draw space (sp==1) or plus (sp==2)
void print_bin(const uint16_t val);
diff --git a/Marlin/src/feature/meatpack.cpp b/Marlin/src/feature/meatpack.cpp
index fe3dabe8da..3b762d4ded 100644
--- a/Marlin/src/feature/meatpack.cpp
+++ b/Marlin/src/feature/meatpack.cpp
@@ -169,9 +169,11 @@ void MeatPack::handle_command(const MeatPack_Command c) {
void MeatPack::report_state() {
// NOTE: if any configuration vars are added below, the outgoing sync text for host plugin
// should not contain the "PV' substring, as this is used to indicate protocol version
- SERIAL_ECHOPGM("[MP] " MeatPack_ProtocolVersion " ");
- serialprint_onoff(TEST(state, MPConfig_Bit_Active));
- SERIAL_ECHO(TEST(state, MPConfig_Bit_NoSpaces) ? F(" NSP\n") : F(" ESP\n"));
+ SERIAL_ECHO(
+ F("[MP] " MeatPack_ProtocolVersion " "),
+ ON_OFF(TEST(state, MPConfig_Bit_Active)),
+ TEST(state, MPConfig_Bit_NoSpaces) ? F(" NSP\n") : F(" ESP\n")
+ );
}
/**
diff --git a/Marlin/src/feature/tmc_util.cpp b/Marlin/src/feature/tmc_util.cpp
index fb17e562ad..d280b55854 100644
--- a/Marlin/src/feature/tmc_util.cpp
+++ b/Marlin/src/feature/tmc_util.cpp
@@ -595,13 +595,15 @@
void print_cs_actual(TMCMarlin &) { }
#endif
+ static void print_true_or_false(const bool tf) { SERIAL_ECHO(TRUE_FALSE(tf)); }
+
#if HAS_DRIVER(TMC2130) || HAS_DRIVER(TMC5130)
static void _tmc_status(TMC2130Stepper &st, const TMC_debug_enum i) {
switch (i) {
case TMC_PWM_SCALE: SERIAL_ECHO(st.PWM_SCALE()); break;
case TMC_SGT: SERIAL_ECHO(st.sgt()); break;
- case TMC_STEALTHCHOP: serialprint_truefalse(st.en_pwm_mode()); break;
- case TMC_INTERPOLATE: serialprint_truefalse(st.intpol()); break;
+ case TMC_STEALTHCHOP: print_true_or_false(st.en_pwm_mode()); break;
+ case TMC_INTERPOLATE: print_true_or_false(st.intpol()); break;
default: break;
}
}
@@ -623,7 +625,7 @@
switch (i) {
case TMC_PWM_SCALE: SERIAL_ECHO(st.PWM_SCALE()); break;
case TMC_SGT: SERIAL_ECHO(st.sgt()); break;
- case TMC_STEALTHCHOP: serialprint_truefalse(st.en_pwm_mode()); break;
+ case TMC_STEALTHCHOP: print_true_or_false(st.en_pwm_mode()); break;
case TMC_GLOBAL_SCALER:
{
const uint16_t value = st.GLOBAL_SCALER();
@@ -631,7 +633,7 @@
SERIAL_ECHOPGM("/256");
}
break;
- case TMC_INTERPOLATE: serialprint_truefalse(st.intpol()); break;
+ case TMC_INTERPOLATE: print_true_or_false(st.intpol()); break;
default: break;
}
}
@@ -645,8 +647,8 @@
case TMC_PWM_SCALE_AUTO: SERIAL_ECHO(st.pwm_scale_auto()); break;
case TMC_PWM_OFS_AUTO: SERIAL_ECHO(st.pwm_ofs_auto()); break;
case TMC_PWM_GRAD_AUTO: SERIAL_ECHO(st.pwm_grad_auto()); break;
- case TMC_STEALTHCHOP: serialprint_truefalse(st.stealth()); break;
- case TMC_INTERPOLATE: serialprint_truefalse(st.intpol()); break;
+ case TMC_STEALTHCHOP: print_true_or_false(st.stealth()); break;
+ case TMC_INTERPOLATE: print_true_or_false(st.intpol()); break;
default: break;
}
}
@@ -697,8 +699,8 @@
case TMC_PWM_SCALE_AUTO: SERIAL_ECHO(st.pwm_scale_auto()); break;
case TMC_PWM_OFS_AUTO: SERIAL_ECHO(st.pwm_ofs_auto()); break;
case TMC_PWM_GRAD_AUTO: SERIAL_ECHO(st.pwm_grad_auto()); break;
- case TMC_STEALTHCHOP: serialprint_truefalse(st.stealth()); break;
- case TMC_INTERPOLATE: serialprint_truefalse(st.intpol()); break;
+ case TMC_STEALTHCHOP: print_true_or_false(st.stealth()); break;
+ case TMC_INTERPOLATE: print_true_or_false(st.intpol()); break;
default: break;
}
}
@@ -708,7 +710,7 @@
static void _tmc_parse_drv_status(TMC2660Stepper, const TMC_drv_status_enum) { }
static void _tmc_status(TMC2660Stepper &st, const TMC_debug_enum i) {
switch (i) {
- case TMC_INTERPOLATE: serialprint_truefalse(st.intpol()); break;
+ case TMC_INTERPOLATE: print_true_or_false(st.intpol()); break;
default: break;
}
}
@@ -734,7 +736,7 @@
SERIAL_CHAR('\t');
switch (i) {
case TMC_CODES: st.printLabel(); break;
- case TMC_ENABLED: serialprint_truefalse(st.isEnabled()); break;
+ case TMC_ENABLED: print_true_or_false(st.isEnabled()); break;
case TMC_CURRENT: SERIAL_ECHO(st.getMilliamps()); break;
case TMC_RMS_CURRENT: SERIAL_ECHO(st.rms_current()); break;
case TMC_MAX_CURRENT: SERIAL_ECHO(p_float_t(st.rms_current() * 1.41, 0)); break;
@@ -757,9 +759,9 @@
if (tpwmthrs_val) SERIAL_ECHO(tpwmthrs_val); else SERIAL_CHAR('-');
} break;
#endif
- case TMC_OTPW: serialprint_truefalse(st.otpw()); break;
+ case TMC_OTPW: print_true_or_false(st.otpw()); break;
#if ENABLED(MONITOR_DRIVER_STATUS)
- case TMC_OTPW_TRIGGERED: serialprint_truefalse(st.getOTPW()); break;
+ case TMC_OTPW_TRIGGERED: print_true_or_false(st.getOTPW()); break;
#endif
case TMC_TOFF: SERIAL_ECHO(st.toff()); break;
case TMC_TBL: print_blank_time(st); break;
@@ -776,7 +778,7 @@
SERIAL_CHAR('\t');
switch (i) {
case TMC_CODES: st.printLabel(); break;
- case TMC_ENABLED: serialprint_truefalse(st.isEnabled()); break;
+ case TMC_ENABLED: print_true_or_false(st.isEnabled()); break;
case TMC_CURRENT: SERIAL_ECHO(st.getMilliamps()); break;
case TMC_RMS_CURRENT: SERIAL_ECHO(st.rms_current()); break;
case TMC_MAX_CURRENT: SERIAL_ECHO(p_float_t(st.rms_current() * 1.41, 0)); break;
@@ -786,8 +788,8 @@
break;
case TMC_VSENSE: SERIAL_ECHO(st.vsense() ? F("1=.165") : F("0=.310")); break;
case TMC_MICROSTEPS: SERIAL_ECHO(st.microsteps()); break;
- //case TMC_OTPW: serialprint_truefalse(st.otpw()); break;
- //case TMC_OTPW_TRIGGERED: serialprint_truefalse(st.getOTPW()); break;
+ //case TMC_OTPW: print_true_or_false(st.otpw()); break;
+ //case TMC_OTPW_TRIGGERED: print_true_or_false(st.getOTPW()); break;
case TMC_SGT: SERIAL_ECHO(st.sgt()); break;
case TMC_TOFF: SERIAL_ECHO(st.toff()); break;
case TMC_TBL: print_blank_time(st); break;
diff --git a/Marlin/src/gcode/bedlevel/M420.cpp b/Marlin/src/gcode/bedlevel/M420.cpp
index 8711bab9c8..7903cc623c 100644
--- a/Marlin/src/gcode/bedlevel/M420.cpp
+++ b/Marlin/src/gcode/bedlevel/M420.cpp
@@ -228,9 +228,7 @@ void GcodeSuite::M420() {
if (to_enable && !planner.leveling_active)
SERIAL_ERROR_MSG(STR_ERR_M420_FAILED);
- SERIAL_ECHO_START();
- SERIAL_ECHOPGM("Bed Leveling ");
- serialprintln_onoff(planner.leveling_active);
+ SERIAL_ECHO_MSG("Bed Leveling ", ON_OFF(planner.leveling_active));
#if ENABLED(ENABLE_LEVELING_FADE_HEIGHT)
SERIAL_ECHO_START();
@@ -252,14 +250,13 @@ void GcodeSuite::M420_report(const bool forReplay/*=true*/) {
report_heading_etc(forReplay, F(
TERN(MESH_BED_LEVELING, "Mesh Bed Leveling", TERN(AUTO_BED_LEVELING_UBL, "Unified Bed Leveling", "Auto Bed Leveling"))
));
- SERIAL_ECHO(
+ SERIAL_ECHOLN(
F(" M420 S"), planner.leveling_active
#if ENABLED(ENABLE_LEVELING_FADE_HEIGHT)
, FPSTR(SP_Z_STR), LINEAR_UNIT(planner.z_fade_height)
#endif
- , F(" ; Leveling ")
+ , F(" ; Leveling "), ON_OFF(planner.leveling_active)
);
- serialprintln_onoff(planner.leveling_active);
}
#endif // HAS_LEVELING
diff --git a/Marlin/src/gcode/bedlevel/mbl/G29.cpp b/Marlin/src/gcode/bedlevel/mbl/G29.cpp
index be0e5d7f18..4bd444c5a3 100644
--- a/Marlin/src/gcode/bedlevel/mbl/G29.cpp
+++ b/Marlin/src/gcode/bedlevel/mbl/G29.cpp
@@ -99,7 +99,7 @@ void GcodeSuite::G29() {
case MeshReport:
SERIAL_ECHOPGM("Mesh Bed Leveling ");
if (leveling_is_valid()) {
- serialprintln_onoff(planner.leveling_active);
+ SERIAL_ECHOLN(ON_OFF(planner.leveling_active));
bedlevel.report_mesh();
}
else
diff --git a/Marlin/src/gcode/control/M211.cpp b/Marlin/src/gcode/control/M211.cpp
index 471ca6c448..e51a9d5297 100644
--- a/Marlin/src/gcode/control/M211.cpp
+++ b/Marlin/src/gcode/control/M211.cpp
@@ -43,8 +43,7 @@ void GcodeSuite::M211_report(const bool forReplay/*=true*/) {
TERN_(MARLIN_SMALL_BUILD, return);
report_heading_etc(forReplay, F(STR_SOFT_ENDSTOPS));
- SERIAL_ECHOPGM(" M211 S", AS_DIGIT(soft_endstop._enabled), " ; ");
- serialprintln_onoff(soft_endstop._enabled);
+ SERIAL_ECHOLNPGM(" M211 S", AS_DIGIT(soft_endstop._enabled), " ; ", ON_OFF(soft_endstop._enabled));
report_echo_start(forReplay);
const xyz_pos_t l_soft_min = soft_endstop.min.asLogical(),
diff --git a/Marlin/src/gcode/control/M605.cpp b/Marlin/src/gcode/control/M605.cpp
index 56d7594b08..4679422dfb 100644
--- a/Marlin/src/gcode/control/M605.cpp
+++ b/Marlin/src/gcode/control/M605.cpp
@@ -173,8 +173,7 @@
set_duplication_enabled(ena && (duplication_e_mask >= 3));
}
SERIAL_ECHO_START();
- SERIAL_ECHOPGM(STR_DUPLICATION_MODE);
- serialprint_onoff(extruder_duplication_enabled);
+ SERIAL_ECHOPGM(STR_DUPLICATION_MODE, ON_OFF(extruder_duplication_enabled));
if (ena) {
SERIAL_ECHOPGM(" ( ");
HOTEND_LOOP() if (TEST(duplication_e_mask, e)) { SERIAL_ECHO(e); SERIAL_CHAR(' '); }
diff --git a/Marlin/src/gcode/feature/mixing/M166.cpp b/Marlin/src/gcode/feature/mixing/M166.cpp
index f42583d052..29411f2122 100644
--- a/Marlin/src/gcode/feature/mixing/M166.cpp
+++ b/Marlin/src/gcode/feature/mixing/M166.cpp
@@ -68,8 +68,7 @@ void GcodeSuite::M166() {
mixer.refresh_gradient();
- SERIAL_ECHOPGM("Gradient Mix ");
- serialprint_onoff(mixer.gradient.enabled);
+ SERIAL_ECHOPGM("Gradient Mix ", ON_OFF(mixer.gradient.enabled));
if (mixer.gradient.enabled) {
#if ENABLED(GRADIENT_VTOOL)
diff --git a/Marlin/src/gcode/feature/powerloss/M413.cpp b/Marlin/src/gcode/feature/powerloss/M413.cpp
index b12257b4e5..7f0e2e2b9a 100644
--- a/Marlin/src/gcode/feature/powerloss/M413.cpp
+++ b/Marlin/src/gcode/feature/powerloss/M413.cpp
@@ -67,13 +67,12 @@ void GcodeSuite::M413_report(const bool forReplay/*=true*/) {
TERN_(MARLIN_SMALL_BUILD, return);
report_heading_etc(forReplay, F(STR_POWER_LOSS_RECOVERY));
- SERIAL_ECHOPGM(" M413 S", AS_DIGIT(recovery.enabled)
+ SERIAL_ECHOLNPGM(" M413 S", AS_DIGIT(recovery.enabled)
#if HAS_PLR_BED_THRESHOLD
, " B", recovery.bed_temp_threshold
#endif
+ , " ; ", ON_OFF(recovery.enabled)
);
- SERIAL_ECHO(" ; ");
- serialprintln_onoff(recovery.enabled);
}
#endif // POWER_LOSS_RECOVERY
diff --git a/Marlin/src/gcode/feature/prusa_MMU2/M704-M709.cpp b/Marlin/src/gcode/feature/prusa_MMU2/M704-M709.cpp
index f6af70b8dd..19aea31ff1 100644
--- a/Marlin/src/gcode/feature/prusa_MMU2/M704-M709.cpp
+++ b/Marlin/src/gcode/feature/prusa_MMU2/M704-M709.cpp
@@ -185,13 +185,12 @@ void GcodeSuite::M709() {
void GcodeSuite::MMU3_report(const bool forReplay/*=true*/) {
using namespace MMU3;
report_heading(forReplay, F("MMU3 Operational Stats"));
- SERIAL_ECHOPGM(" MMU "); serialprintln_onoff(mmu3.mmu_hw_enabled);
- SERIAL_ECHOPGM(" Stealth Mode "); serialprintln_onoff(mmu3.stealth_mode);
+ SERIAL_ECHOLNPGM(" MMU ", ON_OFF(mmu3.mmu_hw_enabled));
+ SERIAL_ECHOLNPGM(" Stealth Mode ", ON_OFF(mmu3.stealth_mode));
#if ENABLED(MMU3_HAS_CUTTER)
- SERIAL_ECHOPGM(" Cutter ");
- serialprintln_onoff(mmu3.cutter_mode != 0);
+ SERIAL_ECHOLNPGM(" Cutter ", ON_OFF(mmu3.cutter_mode != 0));
#endif
- SERIAL_ECHOPGM(" SpoolJoin "); serialprintln_onoff(spooljoin.enabled);
+ SERIAL_ECHOLNPGM(" SpoolJoin ", ON_OFF(spooljoin.enabled));
SERIAL_ECHOLNPGM(" Tool Changes ", operation_statistics.tool_change_counter);
SERIAL_ECHOLNPGM(" Total Tool Changes ", operation_statistics.tool_change_total_counter);
SERIAL_ECHOLNPGM(" Fails ", operation_statistics.fail_num);
diff --git a/Marlin/src/gcode/feature/runout/M412.cpp b/Marlin/src/gcode/feature/runout/M412.cpp
index 4cfb238309..1b8936e6bd 100644
--- a/Marlin/src/gcode/feature/runout/M412.cpp
+++ b/Marlin/src/gcode/feature/runout/M412.cpp
@@ -53,14 +53,12 @@ void GcodeSuite::M412() {
}
else {
SERIAL_ECHO_START();
- SERIAL_ECHOPGM("Filament runout ");
- serialprint_onoff(runout.enabled);
+ SERIAL_ECHOPGM("Filament runout ", ON_OFF(runout.enabled));
#if HAS_FILAMENT_RUNOUT_DISTANCE
SERIAL_ECHOPGM(" ; Distance ", runout.runout_distance(), "mm");
#endif
#if ENABLED(HOST_ACTION_COMMANDS)
- SERIAL_ECHOPGM(" ; Host handling ");
- serialprint_onoff(runout.host_handling);
+ SERIAL_ECHOPGM(" ; Host handling ", ON_OFF(runout.host_handling));
#endif
SERIAL_EOL();
}
@@ -70,14 +68,13 @@ void GcodeSuite::M412_report(const bool forReplay/*=true*/) {
TERN_(MARLIN_SMALL_BUILD, return);
report_heading_etc(forReplay, F(STR_FILAMENT_RUNOUT_SENSOR));
- SERIAL_ECHOPGM(
+ SERIAL_ECHOLNPGM(
" M412 S", runout.enabled
#if HAS_FILAMENT_RUNOUT_DISTANCE
, " D", LINEAR_UNIT(runout.runout_distance())
#endif
- , " ; Sensor "
+ , " ; Sensor ", ON_OFF(runout.enabled)
);
- serialprintln_onoff(runout.enabled);
}
#endif // HAS_FILAMENT_SENSOR
diff --git a/Marlin/src/gcode/feature/trinamic/M911-M914.cpp b/Marlin/src/gcode/feature/trinamic/M911-M914.cpp
index 52622a5e7e..336e881372 100644
--- a/Marlin/src/gcode/feature/trinamic/M911-M914.cpp
+++ b/Marlin/src/gcode/feature/trinamic/M911-M914.cpp
@@ -76,9 +76,7 @@
template
static void tmc_report_otpw(TMC &st) {
st.printLabel();
- SERIAL_ECHOPGM(" temperature prewarn triggered: ");
- serialprint_truefalse(st.getOTPW());
- SERIAL_EOL();
+ SERIAL_ECHOLNPGM(" temperature prewarn triggered: ", TRUE_FALSE(st.getOTPW()));
}
template
diff --git a/Marlin/src/gcode/probe/M401_M402.cpp b/Marlin/src/gcode/probe/M401_M402.cpp
index 05230e05ea..237f841212 100644
--- a/Marlin/src/gcode/probe/M401_M402.cpp
+++ b/Marlin/src/gcode/probe/M401_M402.cpp
@@ -47,9 +47,7 @@ void GcodeSuite::M401() {
seenS = parser.seen('S');
if (seenH || seenS) {
if (seenS) bltouch.high_speed_mode = parser.value_bool();
- SERIAL_ECHO_START();
- SERIAL_ECHOPGM("BLTouch HS mode ");
- serialprintln_onoff(bltouch.high_speed_mode);
+ SERIAL_ECHO_MSG("BLTouch HS mode ", ON_OFF(bltouch.high_speed_mode));
return;
}
#endif
diff --git a/Marlin/src/gcode/temp/M303.cpp b/Marlin/src/gcode/temp/M303.cpp
index c08b99edc6..ffa4efb699 100644
--- a/Marlin/src/gcode/temp/M303.cpp
+++ b/Marlin/src/gcode/temp/M303.cpp
@@ -50,9 +50,7 @@ void GcodeSuite::M303() {
#if HAS_PID_DEBUG
if (parser.seen_test('D')) {
FLIP(thermalManager.pid_debug_flag);
- SERIAL_ECHO_START();
- SERIAL_ECHOPGM("PID Debug ");
- serialprintln_onoff(thermalManager.pid_debug_flag);
+ SERIAL_ECHO_MSG("PID Debug ", ON_OFF(thermalManager.pid_debug_flag));
return;
}
#endif
From 21559b0c59029524da9eeca24e75863b92874ae7 Mon Sep 17 00:00:00 2001
From: Scott Lahteine
Date: Mon, 26 May 2025 16:33:33 -0500
Subject: [PATCH 024/326] =?UTF-8?q?=F0=9F=A9=B9=20Call=20SERIAL=5FIMPL.msg?=
=?UTF-8?q?Done()=20after=20M105?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
Marlin/src/gcode/gcode.cpp | 4 ++--
Marlin/src/gcode/gcode.h | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp
index 469ab134d3..242972c24b 100644
--- a/Marlin/src/gcode/gcode.cpp
+++ b/Marlin/src/gcode/gcode.cpp
@@ -319,7 +319,7 @@ void GcodeSuite::dwell(const millis_t time) {
/**
* Process the parsed command and dispatch it to its handler
*/
-void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) {
+void GcodeSuite::process_parsed_command(bool no_ok/*=false*/) {
TERN_(HAS_FANCHECK, fan_check.check_deferred_error());
KEEPALIVE_STATE(IN_HANDLER);
@@ -582,7 +582,7 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) {
case 109: M109(); break; // M109: Wait for hotend temperature to reach target
#endif
- case 105: M105(); return; // M105: Report Temperatures (and say "ok")
+ case 105: M105(); no_ok = true; break; // M105: Report Temperatures (and say "ok")
#if HAS_FAN
case 106: M106(); break; // M106: Fan On
diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h
index cfe0ec056f..ee0ccb9a0f 100644
--- a/Marlin/src/gcode/gcode.h
+++ b/Marlin/src/gcode/gcode.h
@@ -458,7 +458,7 @@ public:
static int8_t get_target_e_stepper_from_command(const int8_t dval=-1);
static void get_destination_from_command();
- static void process_parsed_command(const bool no_ok=false);
+ static void process_parsed_command(bool no_ok=false);
static void process_next_command();
// Execute G-code in-place, preserving current G-code parameters
From 122c4116f2e2a64017b528cd49f896c166f1dfaf Mon Sep 17 00:00:00 2001
From: Andrew <18502096+classicrocker883@users.noreply.github.com>
Date: Mon, 26 May 2025 17:36:55 -0400
Subject: [PATCH 025/326] =?UTF-8?q?=F0=9F=9A=B8=20Misc.=20optimizations,?=
=?UTF-8?q?=20cleanup,=20DWIN=20fixes=E2=80=A6=20(#27858)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Co-authored-by: Scott Lahteine
---
.../src/HAL/GD32_MFL/eeprom/eeprom_if_iic.cpp | 2 +-
Marlin/src/HAL/HC32/eeprom/eeprom_if_iic.cpp | 2 +-
Marlin/src/HAL/STM32/eeprom/eeprom_if_iic.cpp | 2 +-
.../src/HAL/STM32F1/eeprom/eeprom_if_iic.cpp | 2 +-
Marlin/src/core/types.h | 38 +++++++-------
Marlin/src/gcode/bedlevel/G26.cpp | 6 ++-
Marlin/src/gcode/calibrate/G33.cpp | 4 +-
Marlin/src/gcode/feature/powerloss/M413.cpp | 4 +-
Marlin/src/gcode/motion/G0_G1.cpp | 7 +--
Marlin/src/gcode/probe/M951.cpp | 2 +-
Marlin/src/gcode/temp/M106_M107.cpp | 5 +-
Marlin/src/inc/Changes.h | 12 ++---
Marlin/src/inc/Conditionals-2-LCD.h | 5 --
Marlin/src/lcd/e3v2/proui/dwin.cpp | 50 ++++++++++---------
Marlin/src/module/planner.cpp | 10 ++--
Marlin/src/module/planner.h | 3 +-
ini/hc32.ini | 4 +-
17 files changed, 82 insertions(+), 76 deletions(-)
diff --git a/Marlin/src/HAL/GD32_MFL/eeprom/eeprom_if_iic.cpp b/Marlin/src/HAL/GD32_MFL/eeprom/eeprom_if_iic.cpp
index ea563f742c..765c997e1f 100644
--- a/Marlin/src/HAL/GD32_MFL/eeprom/eeprom_if_iic.cpp
+++ b/Marlin/src/HAL/GD32_MFL/eeprom/eeprom_if_iic.cpp
@@ -42,7 +42,7 @@ void eeprom_init() {
void eeprom_write_byte(uint8_t *pos, uint8_t value) {
const unsigned eeprom_address = (unsigned)pos;
- return BL24CXX::writeOneByte(eeprom_address, value);
+ BL24CXX::writeOneByte(eeprom_address, value);
}
uint8_t eeprom_read_byte(uint8_t *pos) {
diff --git a/Marlin/src/HAL/HC32/eeprom/eeprom_if_iic.cpp b/Marlin/src/HAL/HC32/eeprom/eeprom_if_iic.cpp
index 85d21a972a..0a161f23f2 100644
--- a/Marlin/src/HAL/HC32/eeprom/eeprom_if_iic.cpp
+++ b/Marlin/src/HAL/HC32/eeprom/eeprom_if_iic.cpp
@@ -39,7 +39,7 @@ void eeprom_init() {
void eeprom_write_byte(uint8_t *pos, unsigned char value) {
const unsigned eeprom_address = (unsigned)pos;
- return BL24CXX::writeOneByte(eeprom_address, value);
+ BL24CXX::writeOneByte(eeprom_address, value);
}
uint8_t eeprom_read_byte(uint8_t *pos) {
diff --git a/Marlin/src/HAL/STM32/eeprom/eeprom_if_iic.cpp b/Marlin/src/HAL/STM32/eeprom/eeprom_if_iic.cpp
index 9cabdd681b..2733c8f283 100644
--- a/Marlin/src/HAL/STM32/eeprom/eeprom_if_iic.cpp
+++ b/Marlin/src/HAL/STM32/eeprom/eeprom_if_iic.cpp
@@ -44,7 +44,7 @@ void eeprom_init() { BL24CXX::init(); }
void eeprom_write_byte(uint8_t *pos, uint8_t value) {
const unsigned eeprom_address = (unsigned)pos;
- return BL24CXX::writeOneByte(eeprom_address, value);
+ BL24CXX::writeOneByte(eeprom_address, value);
}
uint8_t eeprom_read_byte(uint8_t *pos) {
diff --git a/Marlin/src/HAL/STM32F1/eeprom/eeprom_if_iic.cpp b/Marlin/src/HAL/STM32F1/eeprom/eeprom_if_iic.cpp
index e1d5e06b68..e7e7fc1db1 100644
--- a/Marlin/src/HAL/STM32F1/eeprom/eeprom_if_iic.cpp
+++ b/Marlin/src/HAL/STM32F1/eeprom/eeprom_if_iic.cpp
@@ -42,7 +42,7 @@ void eeprom_init() { BL24CXX::init(); }
void eeprom_write_byte(uint8_t *pos, uint8_t value) {
const unsigned eeprom_address = (unsigned)pos;
- return BL24CXX::writeOneByte(eeprom_address, value);
+ BL24CXX::writeOneByte(eeprom_address, value);
}
uint8_t eeprom_read_byte(uint8_t *pos) {
diff --git a/Marlin/src/core/types.h b/Marlin/src/core/types.h
index 0de49771ee..86f6ae69dc 100644
--- a/Marlin/src/core/types.h
+++ b/Marlin/src/core/types.h
@@ -168,7 +168,7 @@ template struct IF { typedef L type; };
// Helpers
#define _RECIP(N) ((N) ? 1.0f / static_cast(N) : 0.0f)
-#define _ABS(N) ((N) < 0 ? -(N) : (N))
+#define _ABS(N) ((N) < decltype(N)(0) ? -(N) : (N))
#define _LS(N) T(uint32_t(N) << p)
#define _RS(N) T(uint32_t(N) >> p)
#define _LSE(N) N = T(uint32_t(N) << p)
@@ -640,8 +640,8 @@ struct XYZval {
FI void reset() { NUM_AXIS_CODE(x = 0, y = 0, z = 0, i = 0, j = 0, k = 0, u = 0, v = 0, w = 0); }
// Setters taking struct types and arrays
- FI void set(const XYval pxy) { XY_CODE(x = pxy.x, y = pxy.y); }
- FI void set(const XYval pxy, const T pz) { XYZ_CODE(x = pxy.x, y = pxy.y, z = pz); }
+ FI void set(const XYval &pxy) { XY_CODE(x = pxy.x, y = pxy.y); }
+ FI void set(const XYval &pxy, const T pz) { XYZ_CODE(x = pxy.x, y = pxy.y, z = pz); }
FI void set(const T (&arr)[NUM_AXES]) { NUM_AXIS_CODE(x = arr[0], y = arr[1], z = arr[2], i = arr[3], j = arr[4], k = arr[5], u = arr[6], v = arr[7], w = arr[8]); }
#if LOGICAL_AXES > NUM_AXES
FI void set(const T (&arr)[LOGICAL_AXES]) { NUM_AXIS_CODE(x = arr[0], y = arr[1], z = arr[2], i = arr[3], j = arr[4], k = arr[5], u = arr[6], v = arr[7], w = arr[8]); }
@@ -743,7 +743,7 @@ struct XYZval {
// Absolute difference between two objects
FI constexpr XYZval diff(const XYZEval &rs) const { return NUM_AXIS_ARRAY(T(_ABS(x - rs.x)), T(_ABS(y - rs.y)), T(_ABS(z - rs.z)), T(_ABS(i - rs.i)), T(_ABS(j - rs.j)), T(_ABS(k - rs.k)), T(_ABS(u - rs.u)), T(_ABS(v - rs.v)), T(_ABS(w - rs.w)) ); }
- FI constexpr XYZval diff(const XYZval &rs) const { return NUM_AXIS_ARRAY(T(_ABS(x - rs.x)), T(_ABS(y - rs.y)), T(_ABS(z - rs.z)), T(_ABS(i - rs.i)), T(_ABS(j - rs.j)), T(_ABS(k - rs.k)), T(_ABS(u - rs.u)), T(_ABS(v - rs.v)), T(_ABS(w - rs.w)) ); }
+ FI constexpr XYZval diff(const XYZval &rs) const { return NUM_AXIS_ARRAY(T(_ABS(x - rs.x)), T(_ABS(y - rs.y)), T(_ABS(z - rs.z)), T(_ABS(i - rs.i)), T(_ABS(j - rs.j)), T(_ABS(k - rs.k)), T(_ABS(u - rs.u)), T(_ABS(v - rs.v)), T(_ABS(w - rs.w)) ); }
FI constexpr XYZval diff(const XYval &rs) const { return NUM_AXIS_ARRAY(T(_ABS(x - rs.x)), T(_ABS(y - rs.y)), z, i, j, k, u, v, w ); }
// Modifier operators
@@ -787,17 +787,17 @@ struct XYZEval {
FI void reset() { LOGICAL_AXIS_GANG(e =, x =, y =, z =, i =, j =, k =, u =, v =, w =) 0; }
// Setters taking struct types and arrays
- FI void set(const XYval pxy) { XY_CODE(x = pxy.x, y = pxy.y); }
- FI void set(const XYval pxy, const T pz) { XYZ_CODE(x = pxy.x, y = pxy.y, z = pz); }
- FI void set(const XYZval pxyz) { set(NUM_AXIS_ELEM_LC(pxyz)); }
- FI void set(const T (&arr)[NUM_AXES]) { NUM_AXIS_CODE(x = arr[0], y = arr[1], z = arr[2], i = arr[3], j = arr[4], k = arr[5], u = arr[6], v = arr[7], w = arr[8]); }
+ FI void set(const XYval &pxy) { XY_CODE(x = pxy.x, y = pxy.y); }
+ FI void set(const XYval &pxy, const T pz) { XYZ_CODE(x = pxy.x, y = pxy.y, z = pz); }
+ FI void set(const XYZval &pxyz) { set(NUM_AXIS_ELEM_LC(pxyz)); }
+ FI void set(const T (&arr)[NUM_AXES]) { NUM_AXIS_CODE(x = arr[0], y = arr[1], z = arr[2], i = arr[3], j = arr[4], k = arr[5], u = arr[6], v = arr[7], w = arr[8]); }
#if LOGICAL_AXES > NUM_AXES
- FI void set(const T (&arr)[LOGICAL_AXES]) { LOGICAL_AXIS_CODE(e = arr[LOGICAL_AXES-1], x = arr[0], y = arr[1], z = arr[2], i = arr[3], j = arr[4], k = arr[5], u = arr[6], v = arr[7], w = arr[8]); }
- FI void set(const XYval pxy, const T pz, const T pe) { set(pxy, pz); e = pe; }
- FI void set(const XYZval pxyz, const T pe) { set(pxyz); e = pe; }
- FI void set(LOGICAL_AXIS_ARGS_LC(const T)) { LOGICAL_AXIS_CODE(_e = e, a = x, b = y, c = z, _i = i, _j = j, _k = k, _u = u, _v = v, _w = w); }
+ FI void set(const T (&arr)[LOGICAL_AXES]) { LOGICAL_AXIS_CODE(e = arr[LOGICAL_AXES-1], x = arr[0], y = arr[1], z = arr[2], i = arr[3], j = arr[4], k = arr[5], u = arr[6], v = arr[7], w = arr[8]); }
+ FI void set(const XYval &pxy, const T pz, const T pe) { set(pxy, pz); e = pe; }
+ FI void set(const XYZval &pxyz, const T pe) { set(pxyz); e = pe; }
+ FI void set(LOGICAL_AXIS_ARGS_LC(const T)) { LOGICAL_AXIS_CODE(_e = e, a = x, b = y, c = z, _i = i, _j = j, _k = k, _u = u, _v = v, _w = w); }
#if DISTINCT_AXES > LOGICAL_AXES
- FI void set(const T (&arr)[DISTINCT_AXES]) { LOGICAL_AXIS_CODE(e = arr[LOGICAL_AXES-1], x = arr[0], y = arr[1], z = arr[2], i = arr[3], j = arr[4], k = arr[5], u = arr[6], v = arr[7], w = arr[8]); }
+ FI void set(const T (&arr)[DISTINCT_AXES]) { LOGICAL_AXIS_CODE(e = arr[LOGICAL_AXES-1], x = arr[0], y = arr[1], z = arr[2], i = arr[3], j = arr[4], k = arr[5], u = arr[6], v = arr[7], w = arr[8]); }
#endif
#endif
@@ -933,9 +933,9 @@ struct XYZarray {
};
FI void reset() { ZERO(data); }
- FI void set(const int n, const XYval p) { NUM_AXIS_CODE(x[n]=p.x, y[n]=p.y,,,,,,,); }
- FI void set(const int n, const XYZval p) { NUM_AXIS_CODE(x[n]=p.x, y[n]=p.y, z[n]=p.z, i[n]=p.i, j[n]=p.j, k[n]=p.k, u[n]=p.u, v[n]=p.v, w[n]=p.w ); }
- FI void set(const int n, const XYZEval p) { NUM_AXIS_CODE(x[n]=p.x, y[n]=p.y, z[n]=p.z, i[n]=p.i, j[n]=p.j, k[n]=p.k, u[n]=p.u, v[n]=p.v, w[n]=p.w ); }
+ FI void set(const int n, const XYval &p) { NUM_AXIS_CODE(x[n]=p.x, y[n]=p.y,,,,,,,); }
+ FI void set(const int n, const XYZval &p) { NUM_AXIS_CODE(x[n]=p.x, y[n]=p.y, z[n]=p.z, i[n]=p.i, j[n]=p.j, k[n]=p.k, u[n]=p.u, v[n]=p.v, w[n]=p.w ); }
+ FI void set(const int n, const XYZEval &p) { NUM_AXIS_CODE(x[n]=p.x, y[n]=p.y, z[n]=p.z, i[n]=p.i, j[n]=p.j, k[n]=p.k, u[n]=p.u, v[n]=p.v, w[n]=p.w ); }
// Setter for all individual args
FI void set(const int n OPTARGS_NUM(const T)) { NUM_AXIS_CODE(a[n] = x, b[n] = y, c[n] = z, _i[n] = i, _j[n] = j, _k[n] = k, _u[n] = u, _v[n] = v, _w[n] = w); }
@@ -981,9 +981,9 @@ struct XYZEarray {
};
FI void reset() { ZERO(data); }
- FI void set(const int n, const XYval p) { NUM_AXIS_CODE(x[n]=p.x, y[n]=p.y,,,,,,,); }
- FI void set(const int n, const XYZval p) { NUM_AXIS_CODE(x[n]=p.x, y[n]=p.y, z[n]=p.z, i[n]=p.i, j[n]=p.j, k[n]=p.k, u[n]=p.u, v[n]=p.v, w[n]=p.w ); }
- FI void set(const int n, const XYZEval p) { LOGICAL_AXIS_CODE(e[n]=p.e, x[n]=p.x, y[n]=p.y, z[n]=p.z, i[n]=p.i, j[n]=p.j, k[n]=p.k, u[n]=p.u, v[n]=p.v, w[n]=p.w ); }
+ FI void set(const int n, const XYval &p) { NUM_AXIS_CODE(x[n]=p.x, y[n]=p.y,,,,,,,); }
+ FI void set(const int n, const XYZval &p) { NUM_AXIS_CODE(x[n]=p.x, y[n]=p.y, z[n]=p.z, i[n]=p.i, j[n]=p.j, k[n]=p.k, u[n]=p.u, v[n]=p.v, w[n]=p.w ); }
+ FI void set(const int n, const XYZEval &p) { LOGICAL_AXIS_CODE(e[n]=p.e, x[n]=p.x, y[n]=p.y, z[n]=p.z, i[n]=p.i, j[n]=p.j, k[n]=p.k, u[n]=p.u, v[n]=p.v, w[n]=p.w ); }
// Setter for all individual args
FI void set(const int n OPTARGS_NUM(const T)) { NUM_AXIS_CODE(a[n] = x, b[n] = y, c[n] = z, _i[n] = i, _j[n] = j, _k[n] = k, _u[n] = u, _v[n] = v, _w[n] = w); }
diff --git a/Marlin/src/gcode/bedlevel/G26.cpp b/Marlin/src/gcode/bedlevel/G26.cpp
index 8c26ca4e8f..94e9b82506 100644
--- a/Marlin/src/gcode/bedlevel/G26.cpp
+++ b/Marlin/src/gcode/bedlevel/G26.cpp
@@ -268,8 +268,10 @@ typedef struct {
// If the end point of the line is closer to the nozzle, flip the direction,
// moving from the end to the start. On very small lines the optimization isn't worth it.
- if (dist_end < dist_start && (INTERSECTION_CIRCLE_RADIUS) < ABS(line_length))
- return print_line_from_here_to_there(e, s);
+ if (dist_end < dist_start && (INTERSECTION_CIRCLE_RADIUS) < ABS(line_length)) {
+ print_line_from_here_to_there(e, s);
+ return;
+ }
// Decide whether to retract & lift
if (dist_start > 2.0) retract_lift_move(s);
diff --git a/Marlin/src/gcode/calibrate/G33.cpp b/Marlin/src/gcode/calibrate/G33.cpp
index 395da649d3..76bf250346 100644
--- a/Marlin/src/gcode/calibrate/G33.cpp
+++ b/Marlin/src/gcode/calibrate/G33.cpp
@@ -598,7 +598,7 @@ void GcodeSuite::G33() {
LOOP_NUM_AXES(axis) delta_tower_angle_trim[axis] -= a_sum / 3.0f;
}
- // adjust delta_height and endstops by the max amount
+ // Adjust delta_height and endstops by the max amount
const float z_temp = _MAX(delta_endstop_adj.a, delta_endstop_adj.b, delta_endstop_adj.c);
delta_height -= z_temp;
LOOP_NUM_AXES(axis) delta_endstop_adj[axis] -= z_temp;
@@ -606,7 +606,7 @@ void GcodeSuite::G33() {
recalc_delta_settings();
NOMORE(zero_std_dev_min, zero_std_dev);
- // print report
+ // Print report
if (verbose_level == 3 || verbose_level == 0) {
print_calibration_results(z_at_pt, _tower_results, _opposite_results);
diff --git a/Marlin/src/gcode/feature/powerloss/M413.cpp b/Marlin/src/gcode/feature/powerloss/M413.cpp
index 7f0e2e2b9a..68cdc01668 100644
--- a/Marlin/src/gcode/feature/powerloss/M413.cpp
+++ b/Marlin/src/gcode/feature/powerloss/M413.cpp
@@ -41,10 +41,10 @@
*/
void GcodeSuite::M413() {
+ if (!parser.seen_any()) return M413_report();
+
if (parser.seen('S'))
recovery.enable(parser.value_bool());
- else
- M413_report();
#if HAS_PLR_BED_THRESHOLD
if (parser.seenval('B'))
diff --git a/Marlin/src/gcode/motion/G0_G1.cpp b/Marlin/src/gcode/motion/G0_G1.cpp
index c6c1833806..b489b659ae 100644
--- a/Marlin/src/gcode/motion/G0_G1.cpp
+++ b/Marlin/src/gcode/motion/G0_G1.cpp
@@ -86,9 +86,10 @@ void GcodeSuite::G0_G1(TERN_(HAS_FAST_MOVES, const bool fast_move/*=false*/)) {
const float echange = destination.e - current_position.e;
// Is this a retract or recover move?
if (WITHIN(ABS(echange), MIN_AUTORETRACT, MAX_AUTORETRACT) && fwretract.retracted[active_extruder] == (echange > 0.0)) {
- current_position.e = destination.e; // Hide a G1-based retract/recover from calculations
- sync_plan_position_e(); // AND from the planner
- return fwretract.retract(echange < 0.0); // Firmware-based retract/recover (double-retract ignored)
+ current_position.e = destination.e; // Hide a G1-based retract/recover from calculations
+ sync_plan_position_e(); // AND from the planner
+ fwretract.retract(echange < 0.0); // Firmware-based retract/recover (double-retract ignored)
+ return;
}
}
}
diff --git a/Marlin/src/gcode/probe/M951.cpp b/Marlin/src/gcode/probe/M951.cpp
index db0278e431..15d3d47af0 100644
--- a/Marlin/src/gcode/probe/M951.cpp
+++ b/Marlin/src/gcode/probe/M951.cpp
@@ -80,7 +80,7 @@ void GcodeSuite::M951() {
if (parser.seenval('H')) mpe_settings.fast_feedrate = MMM_TO_MMS(parser.value_linear_units());
if (parser.seenval('D')) mpe_settings.travel_distance = parser.value_linear_units();
if (parser.seenval('C')) mpe_settings.compensation_factor = parser.value_float();
- if (!parser.seen("CDHIJLR")) mpe_settings_report();
+ if (!parser.seen_any()) mpe_settings_report();
}
#endif // MAGNETIC_PARKING_EXTRUDER
diff --git a/Marlin/src/gcode/temp/M106_M107.cpp b/Marlin/src/gcode/temp/M106_M107.cpp
index afa2ebfc56..ddfc8514c0 100644
--- a/Marlin/src/gcode/temp/M106_M107.cpp
+++ b/Marlin/src/gcode/temp/M106_M107.cpp
@@ -65,7 +65,10 @@ void GcodeSuite::M106() {
#if ENABLED(EXTRA_FAN_SPEED)
const uint16_t t = parser.intval('T');
- if (t > 0) return thermalManager.set_temp_fan_speed(pfan, t);
+ if (t > 0) {
+ thermalManager.set_temp_fan_speed(pfan, t);
+ return;
+ }
#endif
const uint16_t dspeed = parser.seen_test('A') ? thermalManager.fan_speed[active_extruder] : 255;
diff --git a/Marlin/src/inc/Changes.h b/Marlin/src/inc/Changes.h
index 839804d920..cbfdcfc47f 100644
--- a/Marlin/src/inc/Changes.h
+++ b/Marlin/src/inc/Changes.h
@@ -765,15 +765,15 @@
#endif
// Consolidate TMC26X, validate migration (#24373)
-#define _ISMAX_1(A) defined(A##_MAX_CURRENT)
-#define _ISSNS_1(A) defined(A##_SENSE_RESISTOR)
-#if DO(ISMAX,||,ALL_AXIS_NAMES)
+#define _ISMAX(A) defined(A##_MAX_CURRENT) ||
+#define _ISSNS(A) defined(A##_SENSE_RESISTOR) ||
+#if MAP(_ISMAX, ALL_AXIS_NAMES) 0
#error "*_MAX_CURRENT is now set with *_CURRENT."
-#elif DO(ISSNS,||,ALL_AXIS_NAMES)
+#elif MAP(_ISSNS, ALL_AXIS_NAMES) 0
#error "*_SENSE_RESISTOR (in Milli-Ohms) is now set with *_RSENSE (in Ohms), so you must divide values by 1000."
#endif
-#undef _ISMAX_1
-#undef _ISSNS_1
+#undef _ISMAX
+#undef _ISSNS
// L64xx stepper drivers have been removed
#define _L6470 0x6470
diff --git a/Marlin/src/inc/Conditionals-2-LCD.h b/Marlin/src/inc/Conditionals-2-LCD.h
index 362ca7a714..8f92948d56 100644
--- a/Marlin/src/inc/Conditionals-2-LCD.h
+++ b/Marlin/src/inc/Conditionals-2-LCD.h
@@ -663,11 +663,6 @@
#define BOOT_MARLIN_LOGO_SMALL
#endif
-// Flow and feedrate editing
-#if HAS_EXTRUDERS && ANY(HAS_MARLINUI_MENU, DWIN_CREALITY_LCD, DWIN_LCD_PROUI, MALYAN_LCD, TOUCH_SCREEN)
- #define HAS_FLOW_EDIT 1
-#endif
-
/**
* TFT Displays
*
diff --git a/Marlin/src/lcd/e3v2/proui/dwin.cpp b/Marlin/src/lcd/e3v2/proui/dwin.cpp
index 08782553ba..9d857f1e3a 100644
--- a/Marlin/src/lcd/e3v2/proui/dwin.cpp
+++ b/Marlin/src/lcd/e3v2/proui/dwin.cpp
@@ -2382,6 +2382,7 @@ void setMoveZ() { hmiValue.axis = Z_AXIS; setPFloatOnClick(Z_MIN_POS, Z_MAX_POS,
#endif
void setSpeed() { setPIntOnClick(SPEED_EDIT_MIN, SPEED_EDIT_MAX); }
+void setFlow() { setPIntOnClick(FLOW_EDIT_MIN, FLOW_EDIT_MAX, []{ planner.refresh_e_factor(0); }); }
#if HAS_HOTEND
void applyHotendTemp() { thermalManager.setTargetHotend(menuData.value, 0); }
@@ -2426,8 +2427,6 @@ void setSpeed() { setPIntOnClick(SPEED_EDIT_MIN, SPEED_EDIT_MAX); }
#endif // ADVANCED_PAUSE_FEATURE
-void setFlow() { setPIntOnClick(FLOW_EDIT_MIN, FLOW_EDIT_MAX, []{ planner.refresh_e_factor(0); }); }
-
// Bed Tramming
#if ENABLED(LCD_BED_TRAMMING)
@@ -2596,23 +2595,25 @@ void setFlow() { setPIntOnClick(FLOW_EDIT_MIN, FLOW_EDIT_MAX, []{ planner.refres
#if ENABLED(MESH_BED_LEVELING)
+ #define MESH_Z_FDIGITS 2
+
void manualMeshStart() {
LCD_MESSAGE(MSG_UBL_BUILD_MESH_MENU);
gcode.process_subcommands_now(F("G28XYO\nG28Z\nM211S0\nG29S1"));
#ifdef MANUAL_PROBE_START_Z
const uint8_t line = currentMenu->line(mMeshMoveZItem->pos);
- DWINUI::drawSignedFloat(hmiData.colorText, hmiData.colorBackground, 3, 2, VALX - 2 * DWINUI::fontWidth(DWIN_FONT_MENU), MBASE(line), MANUAL_PROBE_START_Z);
+ DWINUI::drawSignedFloat(hmiData.colorText, hmiData.colorBackground, 3, MESH_Z_FDIGITS, VALX - 2 * DWINUI::fontWidth(DWIN_FONT_MENU), MBASE(line), MANUAL_PROBE_START_Z);
#endif
}
void liveMeshMoveZ() {
- *menuData.floatPtr = menuData.value / POW(10, 2);
+ *menuData.floatPtr = menuData.value / POW(10, MESH_Z_FDIGITS);
if (!planner.is_full()) {
planner.synchronize();
planner.buffer_line(current_position, manual_feedrate_mm_s[Z_AXIS]);
}
}
- void setMMeshMoveZ() { setPFloatOnClick(-1, 1, 2, planner.synchronize, liveMeshMoveZ); }
+ void setMMeshMoveZ() { setPFloatOnClick(-1, 1, MESH_Z_FDIGITS, planner.synchronize, liveMeshMoveZ); }
void manualMeshContinue() {
gcode.process_subcommands_now(F("G29S2"));
@@ -2686,8 +2687,9 @@ void applyMaxAccel() { planner.set_max_acceleration(hmiValue.axis, menuData.valu
#endif
#if ENABLED(LIN_ADVANCE)
- void applyLA_K() { planner.set_advance_k(menuData.value / MINUNITMULT); }
- void setLA_K() { setPFloatOnClick(0, 10, 3, applyLA_K); }
+ #define LA_FDIGITS 3
+ void applyLA_K() { planner.set_advance_k(menuData.value / POW(10, LA_FDIGITS)); }
+ void setLA_K() { setPFloatOnClick(0, 10, LA_FDIGITS, applyLA_K); }
#endif
#if HAS_X_AXIS
@@ -3515,6 +3517,7 @@ void drawTuneMenu() {
if (SET_MENU_R(tuneMenu, selrect({73, 2, 28, 12}), MSG_TUNE, items)) {
BACK_ITEM(gotoPrintProcess);
EDIT_ITEM(ICON_Speed, MSG_SPEED, onDrawSpeedItem, setSpeed, &feedrate_percentage);
+ EDIT_ITEM(ICON_Flow, MSG_FLOW, onDrawPIntMenu, setFlow, &planner.flow_percentage[0]);
#if HAS_HOTEND
hotendTargetItem = EDIT_ITEM(ICON_HotendTemp, MSG_UBL_SET_TEMP_HOTEND, onDrawHotendTemp, setHotendTemp, &thermalManager.temp_hotend[0].target);
#endif
@@ -3529,7 +3532,6 @@ void drawTuneMenu() {
#elif ALL(HAS_ZOFFSET_ITEM, MESH_BED_LEVELING, BABYSTEPPING)
EDIT_ITEM(ICON_Zoffset, MSG_HOME_OFFSET_Z, onDrawPFloat2Menu, setZOffset, &BABY_Z_VAR);
#endif
- EDIT_ITEM(ICON_Flow, MSG_FLOW, onDrawPIntMenu, setFlow, &planner.flow_percentage[0]);
#if ENABLED(ADVANCED_PAUSE_FEATURE)
MENU_ITEM(ICON_FilMan, MSG_FILAMENTCHANGE, onDrawMenuItem, changeFilament);
#endif
@@ -3546,8 +3548,8 @@ void drawTuneMenu() {
EDIT_ITEM(ICON_JDmm, MSG_JUNCTION_DEVIATION, onDrawPFloat3Menu, setJDmm, &planner.junction_deviation_mm);
#endif
#if ENABLED(PROUI_ITEM_ADVK)
- float editable_decimal = planner.get_advance_k();
- EDIT_ITEM(ICON_MaxAccelerated, MSG_ADVANCE_K, onDrawPFloat3Menu, setLA_K, &editable_decimal);
+ float editable_k = planner.get_advance_k();
+ EDIT_ITEM(ICON_MaxAccelerated, MSG_ADVANCE_K, onDrawPFloat3Menu, setLA_K, &editable_k);
#endif
#if HAS_LOCKSCREEN
MENU_ITEM(ICON_Lock, MSG_LOCKSCREEN, onDrawMenuItem, dwinLockScreen);
@@ -3685,8 +3687,8 @@ void drawMotionMenu() {
MENU_ITEM(ICON_Homing, MSG_HOMING_FEEDRATE, onDrawSubMenu, drawHomingFRMenu);
#endif
#if ENABLED(LIN_ADVANCE)
- float editable_decimal = planner.get_advance_k();
- EDIT_ITEM(ICON_MaxAccelerated, MSG_ADVANCE_K, onDrawPFloat3Menu, setLA_K, &editable_decimal);
+ float editable_k = planner.get_advance_k();
+ EDIT_ITEM(ICON_MaxAccelerated, MSG_ADVANCE_K, onDrawPFloat3Menu, setLA_K, &editable_k);
#endif
#if ENABLED(SHAPING_MENU)
MENU_ITEM(ICON_InputShaping, MSG_INPUT_SHAPING, onDrawSubMenu, drawInputShaping_menu);
@@ -3694,8 +3696,8 @@ void drawMotionMenu() {
#if ENABLED(ADAPTIVE_STEP_SMOOTHING_TOGGLE)
EDIT_ITEM(ICON_UBLActive, MSG_STEP_SMOOTHING, onDrawChkbMenu, setAdaptiveStepSmoothing, &stepper.adaptive_step_smoothing_enabled);
#endif
+ EDIT_ITEM(ICON_Speed, MSG_SPEED, onDrawSpeedItem, setSpeed, &feedrate_percentage);
EDIT_ITEM(ICON_Flow, MSG_FLOW, onDrawPIntMenu, setFlow, &planner.flow_percentage[0]);
- EDIT_ITEM(ICON_Speed, MSG_SPEED, onDrawPIntMenu, setSpeed, &feedrate_percentage);
}
updateMenu(motionMenu);
}
@@ -4028,9 +4030,10 @@ void drawMaxAccelMenu() {
void setSensorResponse() { setPFloatOnClick(0, 1, 4); }
void setAmbientXfer() { setPFloatOnClick(0, 1, 4); }
#if ENABLED(MPC_INCLUDE_FAN)
- void onDrawFanAdj(MenuItem* menuitem, int8_t line) { onDrawFloatMenu(menuitem, line, 4, thermalManager.temp_hotend[0].fanCoefficient()); }
- void applyFanAdj() { thermalManager.temp_hotend[0].applyFanAdjustment(menuData.value / POW(10, 4)); }
- void setFanAdj() { setFloatOnClick(0, 1, 4, thermalManager.temp_hotend[0].fanCoefficient(), applyFanAdj); }
+ #define MPC_FAN_FDIGITS 4
+ void onDrawFanAdj(MenuItem* menuitem, int8_t line) { onDrawFloatMenu(menuitem, line, MPC_FAN_FDIGITS, thermalManager.temp_hotend[0].fanCoefficient()); }
+ void applyFanAdj() { thermalManager.temp_hotend[0].applyFanAdjustment(menuData.value / POW(10, MPC_FAN_FDIGITS)); }
+ void setFanAdj() { setFloatOnClick(0, 1, MPC_FAN_FDIGITS, thermalManager.temp_hotend[0].fanCoefficient(), applyFanAdj); }
#endif
#endif
@@ -4074,27 +4077,28 @@ void drawMaxAccelMenu() {
#endif
#if ENABLED(PID_EDIT_MENU)
- void setKp() { setPFloatOnClick(0, 1000, 2); }
+ #define PID_FDIGITS 2
+ void setKp() { setPFloatOnClick(0, 1000, PID_FDIGITS); }
void applyPIDi() {
- *menuData.floatPtr = scalePID_i(menuData.value / POW(10, 2));
+ *menuData.floatPtr = scalePID_i(menuData.value / POW(10, PID_FDIGITS));
TERN_(PIDTEMP, thermalManager.updatePID());
}
void applyPIDd() {
- *menuData.floatPtr = scalePID_d(menuData.value / POW(10, 2));
+ *menuData.floatPtr = scalePID_d(menuData.value / POW(10, PID_FDIGITS));
TERN_(PIDTEMP, thermalManager.updatePID());
}
void setKi() {
menuData.floatPtr = (float*)static_cast(currentMenu->selectedItem())->value;
const float value = unscalePID_i(*menuData.floatPtr);
- setFloatOnClick(0, 1000, 2, value, applyPIDi);
+ setFloatOnClick(0, 1000, PID_FDIGITS, value, applyPIDi);
}
void setKd() {
menuData.floatPtr = (float*)static_cast(currentMenu->selectedItem())->value;
const float value = unscalePID_d(*menuData.floatPtr);
- setFloatOnClick(0, 1000, 2, value, applyPIDd);
+ setFloatOnClick(0, 1000, PID_FDIGITS, value, applyPIDd);
}
- void onDrawPIDi(MenuItem* menuitem, int8_t line) { onDrawFloatMenu(menuitem, line, 2, unscalePID_i(*(float*)static_cast(menuitem)->value)); }
- void onDrawPIDd(MenuItem* menuitem, int8_t line) { onDrawFloatMenu(menuitem, line, 2, unscalePID_d(*(float*)static_cast(menuitem)->value)); }
+ void onDrawPIDi(MenuItem* menuitem, int8_t line) { onDrawFloatMenu(menuitem, line, PID_FDIGITS, unscalePID_i(*(float*)static_cast(menuitem)->value)); }
+ void onDrawPIDd(MenuItem* menuitem, int8_t line) { onDrawFloatMenu(menuitem, line, PID_FDIGITS, unscalePID_d(*(float*)static_cast(menuitem)->value)); }
#endif // PID_EDIT_MENU
#endif // HAS_PID_HEATING
diff --git a/Marlin/src/module/planner.cpp b/Marlin/src/module/planner.cpp
index 5e1c08f863..8678c82130 100644
--- a/Marlin/src/module/planner.cpp
+++ b/Marlin/src/module/planner.cpp
@@ -1505,10 +1505,12 @@ void Planner::check_axes_activity() {
#if HAS_LEVELING
- constexpr xy_pos_t level_fulcrum = {
- TERN(Z_SAFE_HOMING, Z_SAFE_HOMING_X_POINT, X_HOME_POS),
- TERN(Z_SAFE_HOMING, Z_SAFE_HOMING_Y_POINT, Y_HOME_POS)
- };
+ #if ABL_PLANAR
+ constexpr xy_pos_t level_fulcrum = {
+ TERN(Z_SAFE_HOMING, Z_SAFE_HOMING_X_POINT, X_HOME_POS),
+ TERN(Z_SAFE_HOMING, Z_SAFE_HOMING_Y_POINT, Y_HOME_POS)
+ };
+ #endif
/**
* rx, ry, rz - Cartesian positions in mm
diff --git a/Marlin/src/module/planner.h b/Marlin/src/module/planner.h
index c71a73c5be..bda5720919 100644
--- a/Marlin/src/module/planner.h
+++ b/Marlin/src/module/planner.h
@@ -249,7 +249,7 @@ typedef struct PlannerBlock {
uint32_t cruise_time; // Cruise time in STEP timer counts
int32_t e_step_ratio_q30; // Ratio of e steps to block steps.
#if ENABLED(INPUT_SHAPING_E_SYNC)
- uint32_t xy_length_inv_q30; // inverse of block->steps.x + block.steps.y
+ uint32_t xy_length_inv_q30; // Inverse of block->steps.x + block.steps.y
#endif
#endif
#if ANY(S_CURVE_ACCELERATION, SMOOTH_LIN_ADVANCE)
@@ -370,7 +370,6 @@ typedef struct PlannerSettings {
};
#undef _EASU
#undef _DASU
- #undef _DLIM
#endif
feedRate_t max_feedrate_mm_s[DISTINCT_AXES]; // (mm/s) M203 XYZE - Max speeds
diff --git a/ini/hc32.ini b/ini/hc32.ini
index 8a55e3b495..19baeda210 100644
--- a/ini/hc32.ini
+++ b/ini/hc32.ini
@@ -27,8 +27,8 @@
# Base Environment for all HC32F460 variants
#
[HC32F460_base]
-platform = https://github.com/shadow578/platform-hc32f46x/archive/1.1.0.zip
-platform_packages = framework-hc32f46x-ddl@https://github.com/shadow578/framework-hc32f46x-ddl/archive/2.2.2.zip
+platform = https://github.com/shadow578/platform-hc32f46x/archive/1.1.1.zip
+platform_packages = framework-hc32f46x-ddl@https://github.com/shadow578/framework-hc32f46x-ddl/archive/2.2.3.zip
framework-arduino-hc32f46x@https://github.com/shadow578/framework-arduino-hc32f46x/archive/1.2.0.zip
board = generic_hc32f460
build_src_filter = ${common.default_src_filter} + +
From fde0eaf1e7e9a42d22f7dfb4d48f905e07949384 Mon Sep 17 00:00:00 2001
From: narno2202 <130909513+narno2202@users.noreply.github.com>
Date: Tue, 27 May 2025 00:36:14 +0200
Subject: [PATCH 026/326] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20Remove=20FT=20Moti?=
=?UTF-8?q?on=20extraneous=20code=20(#27881)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
Marlin/src/module/stepper.cpp | 23 ++++++++++-------------
1 file changed, 10 insertions(+), 13 deletions(-)
diff --git a/Marlin/src/module/stepper.cpp b/Marlin/src/module/stepper.cpp
index a6931c8d0d..ad7995bfc7 100644
--- a/Marlin/src/module/stepper.cpp
+++ b/Marlin/src/module/stepper.cpp
@@ -1541,7 +1541,7 @@ void Stepper::isr() {
uint8_t max_loops = 10;
#if ENABLED(FT_MOTION)
- static uint32_t ftMotion_nextAuxISR = 0U; // Storage for the next ISR of the auxilliary tasks.
+ static uint32_t ftMotion_nextAuxISR = 0U; // Storage for the next ISR of the auxiliary tasks.
const bool using_ftMotion = ftMotion.cfg.active;
#else
constexpr bool using_ftMotion = false;
@@ -1556,21 +1556,18 @@ void Stepper::isr() {
#if ENABLED(FT_MOTION)
if (using_ftMotion) {
- if (!nextMainISR) { // Main ISR is ready to fire during this iteration?
- nextMainISR = FTM_MIN_TICKS; // Set to minimum interval (a limit on the top speed)
- ftMotion_stepper(); // Run FTM Stepping
- // Define 2.5 msec task for auxilliary functions.
- if (!ftMotion_nextAuxISR) {
- TERN_(BABYSTEPPING, if (babystep.has_steps()) babystepping_isr());
- ftMotion_nextAuxISR = (STEPPER_TIMER_RATE) / 400;
- }
+ ftMotion_stepper(); // Run FTM Stepping
+
+ // Define 2.5 msec task for auxiliary functions.
+ if (!ftMotion_nextAuxISR) {
+ TERN_(BABYSTEPPING, if (babystep.has_steps()) babystepping_isr());
+ ftMotion_nextAuxISR = (STEPPER_TIMER_RATE) / 400;
}
- // Enable ISRs to reduce latency for higher priority ISRs, or all ISRs if no prioritization.
+ // Enable ISRs to reduce latency for higher priority ISRs
hal.isr_on();
-
- interval = _MIN(nextMainISR, ftMotion_nextAuxISR);
- nextMainISR -= interval;
+
+ interval = FTM_MIN_TICKS;
ftMotion_nextAuxISR -= interval;
}
From e9ae5208cbf1948b92e08ee463a1ecfba53be722 Mon Sep 17 00:00:00 2001
From: Vovodroid
Date: Tue, 27 May 2025 03:16:45 +0300
Subject: [PATCH 027/326] =?UTF-8?q?=E2=9C=A8=20EVENT=5FGCODE=5FAFTER=5FMPC?=
=?UTF-8?q?=5FTUNE=20(#27865)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Co-authored-by: Scott Lahteine
---
Marlin/Configuration.h | 1 +
Marlin/src/module/temperature.cpp | 4 ++++
buildroot/tests/STM32F103RE_creality | 3 ++-
3 files changed, 7 insertions(+), 1 deletion(-)
diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h
index 859f0bbd33..08216d17b8 100644
--- a/Marlin/Configuration.h
+++ b/Marlin/Configuration.h
@@ -767,6 +767,7 @@
#define MPC_TUNING_POS { X_CENTER, Y_CENTER, 1.0f } // (mm) M306 Autotuning position, ideally bed center at first layer height.
#define MPC_TUNING_END_Z 10.0f // (mm) M306 Autotuning final Z position.
+ //#define EVENT_GCODE_AFTER_MPC_TUNE "M84" // G-code to execute after MPC tune finished and Z raised.
#endif
//===========================================================================
diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp
index 30690345a5..5c760a7689 100644
--- a/Marlin/src/module/temperature.cpp
+++ b/Marlin/src/module/temperature.cpp
@@ -1104,6 +1104,10 @@ void Temperature::factory_reset() {
do_z_clearance(MPC_TUNING_END_Z, false);
+ #ifdef EVENT_GCODE_AFTER_MPC_TUNE
+ gcode.process_subcommands_now(F(EVENT_GCODE_AFTER_MPC_TUNE));
+ #endif
+
TERN_(TEMP_TUNING_MAINTAIN_FAN, adaptive_fan_slowing = true);
}
diff --git a/buildroot/tests/STM32F103RE_creality b/buildroot/tests/STM32F103RE_creality
index 5681688929..0855a71ee4 100755
--- a/buildroot/tests/STM32F103RE_creality
+++ b/buildroot/tests/STM32F103RE_creality
@@ -20,7 +20,8 @@ exec_test $1 $2 "Ender-3 V2 - JyersUI (ABL Bilinear/Manual)" "$3"
use_example_configs "Creality/Ender-3 V2/CrealityV422/CrealityUI"
opt_disable DWIN_CREALITY_LCD PIDTEMP
-opt_enable DWIN_MARLINUI_LANDSCAPE LCD_ENDSTOP_TEST AUTO_BED_LEVELING_UBL BLTOUCH Z_SAFE_HOMING MPCTEMP MPC_AUTOTUNE \
+opt_enable DWIN_MARLINUI_LANDSCAPE LCD_ENDSTOP_TEST AUTO_BED_LEVELING_UBL BLTOUCH Z_SAFE_HOMING \
+ MPCTEMP MPC_AUTOTUNE EVENT_GCODE_AFTER_MPC_TUNE \
MARLIN_BRICKOUT MARLIN_INVADERS MARLIN_SNAKE GAMES_EASTER_EGG
exec_test $1 $2 "Ender-3 V2 - MarlinUI (Games, UBL+BLTOUCH, MPCTEMP, LCD_ENDSTOP_TEST)" "$3"
From 3f3c8257f7fc133471c1a86e6adc463bc9539f2c Mon Sep 17 00:00:00 2001
From: thinkyhead
Date: Tue, 27 May 2025 00:35:13 +0000
Subject: [PATCH 028/326] [cron] Bump distribution date (2025-05-27)
---
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 b46b688339..34ac9adaa3 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 "2025-05-26"
+//#define STRING_DISTRIBUTION_DATE "2025-05-27"
/**
* The protocol for communication to the host. Protocol indicates communication
diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h
index 06c29974a7..8d0c6361af 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 "2025-05-26"
+ #define STRING_DISTRIBUTION_DATE "2025-05-27"
#endif
/**
From ebecd7649286fe12a111218dfc2a1185a48cc9aa Mon Sep 17 00:00:00 2001
From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com>
Date: Mon, 26 May 2025 20:51:41 -0700
Subject: [PATCH 029/326] =?UTF-8?q?=F0=9F=94=A7=20Update=20BIQU=20BX=20SPI?=
=?UTF-8?q?=20driver=20conditionals=20(#27886)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
Marlin/Configuration_adv.h | 2 +-
.../pins/stm32h7/pins_BTT_SKR_SE_BX_common.h | 21 +++++++++++--------
2 files changed, 13 insertions(+), 10 deletions(-)
diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h
index fee4c452ab..7939b5cc9b 100644
--- a/Marlin/Configuration_adv.h
+++ b/Marlin/Configuration_adv.h
@@ -3470,7 +3470,7 @@
*
* It is recommended to set HOMING_BUMP_MM to { 0, 0, 0 }.
*
- * SPI_ENDSTOPS *** TMC2130/TMC5160 Only ***
+ * SPI_ENDSTOPS *** TMC2130, TMC2240, and TMC5160 Only ***
* Poll the driver through SPI to determine load when homing.
* Removes the need for a wire from DIAG1 to an endstop pin.
*
diff --git a/Marlin/src/pins/stm32h7/pins_BTT_SKR_SE_BX_common.h b/Marlin/src/pins/stm32h7/pins_BTT_SKR_SE_BX_common.h
index 529e610624..736f79e664 100644
--- a/Marlin/src/pins/stm32h7/pins_BTT_SKR_SE_BX_common.h
+++ b/Marlin/src/pins/stm32h7/pins_BTT_SKR_SE_BX_common.h
@@ -124,16 +124,19 @@
#endif
//
-// SPI pins for TMC2130 stepper drivers
+// SPI pins for TMC2130, TMC2160, TMC2240, TMC2660, TMC5130, or TMC5160 stepper drivers
//
-#ifndef TMC_SPI_MOSI
- #define TMC_SPI_MOSI PC6
-#endif
-#ifndef TMC_SPI_MISO
- #define TMC_SPI_MISO PG3
-#endif
-#ifndef TMC_SPI_SCK
- #define TMC_SPI_SCK PC7
+#if HAS_TMC_SPI
+ #define TMC_USE_SW_SPI
+ #ifndef TMC_SPI_MOSI
+ #define TMC_SPI_MOSI PC6
+ #endif
+ #ifndef TMC_SPI_MISO
+ #define TMC_SPI_MISO PG3
+ #endif
+ #ifndef TMC_SPI_SCK
+ #define TMC_SPI_SCK PC7
+ #endif
#endif
#if HAS_TMC_UART
From 3572fd75b596ed99e43093d99ce360828a187a4d Mon Sep 17 00:00:00 2001
From: vehystrix
Date: Tue, 27 May 2025 06:46:46 +0200
Subject: [PATCH 030/326] =?UTF-8?q?=F0=9F=90=9B=20Fix=20M201=20with=20XY?=
=?UTF-8?q?=5FFREQUENCY=5FLIMIT=20(#27859)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Co-authored-by: Scott Lahteine
---
Marlin/src/gcode/config/M200-M205.cpp | 29 +++++++++++++++++++++------
1 file changed, 23 insertions(+), 6 deletions(-)
diff --git a/Marlin/src/gcode/config/M200-M205.cpp b/Marlin/src/gcode/config/M200-M205.cpp
index a55813aeae..7ad7de8617 100644
--- a/Marlin/src/gcode/config/M200-M205.cpp
+++ b/Marlin/src/gcode/config/M200-M205.cpp
@@ -124,8 +124,13 @@
* S : Speed factor percentage.
*/
void GcodeSuite::M201() {
- if (!parser.seen("T" STR_AXES_LOGICAL TERN_(XY_FREQUENCY_LIMIT, "FS")))
+ if (!parser.seen("T" STR_AXES_LOGICAL
+ #ifdef XY_FREQUENCY_LIMIT
+ "FS"
+ #endif
+ )) {
return M201_report();
+ }
const int8_t target_extruder = get_target_extruder_from_command();
if (target_extruder < 0) return;
@@ -147,7 +152,11 @@ void GcodeSuite::M201_report(const bool forReplay/*=true*/) {
TERN_(MARLIN_SMALL_BUILD, return);
report_heading_etc(forReplay, F(STR_MAX_ACCELERATION));
+
+ bool eol = false;
+
#if NUM_AXES
+ eol = true;
SERIAL_ECHOPGM_P(
LIST_N(DOUBLE(NUM_AXES),
PSTR(" M201 X"), LINEAR_UNIT(planner.settings.max_acceleration_mm_per_s2[X_AXIS]),
@@ -164,13 +173,18 @@ void GcodeSuite::M201_report(const bool forReplay/*=true*/) {
#endif
#if HAS_EXTRUDERS && DISABLED(DISTINCT_E_FACTORS)
+ eol = true;
SERIAL_ECHOPGM_P(SP_E_STR, VOLUMETRIC_UNIT(planner.settings.max_acceleration_mm_per_s2[E_AXIS]));
#endif
- #if NUM_AXES || (HAS_EXTRUDERS && DISABLED(DISTINCT_E_FACTORS))
- SERIAL_EOL();
+ #ifdef XY_FREQUENCY_LIMIT
+ eol = true;
+ SERIAL_ECHOPGM_P(PSTR(" F"), planner.xy_freq_limit_hz);
+ SERIAL_ECHOPGM_P(PSTR(" S"), (planner.xy_freq_min_speed_factor * 100));
#endif
+ if (eol) SERIAL_EOL();
+
#if ENABLED(DISTINCT_E_FACTORS)
for (uint8_t i = 0; i < E_STEPPERS; ++i) {
report_echo_start(forReplay);
@@ -205,7 +219,11 @@ void GcodeSuite::M203_report(const bool forReplay/*=true*/) {
TERN_(MARLIN_SMALL_BUILD, return);
report_heading_etc(forReplay, F(STR_MAX_FEEDRATES));
+
+ bool eol = false;
+
#if NUM_AXES
+ eol = true;
SERIAL_ECHOPGM_P(
LIST_N(DOUBLE(NUM_AXES),
PSTR(" M203 X"), LINEAR_UNIT(planner.settings.max_feedrate_mm_s[X_AXIS]),
@@ -222,12 +240,11 @@ void GcodeSuite::M203_report(const bool forReplay/*=true*/) {
#endif
#if HAS_EXTRUDERS && DISABLED(DISTINCT_E_FACTORS)
+ eol = true;
SERIAL_ECHOPGM_P(SP_E_STR, VOLUMETRIC_UNIT(planner.settings.max_feedrate_mm_s[E_AXIS]));
#endif
- #if NUM_AXES || (HAS_EXTRUDERS && DISABLED(DISTINCT_E_FACTORS))
- SERIAL_EOL();
- #endif
+ if (eol) SERIAL_EOL();
#if ENABLED(DISTINCT_E_FACTORS)
for (uint8_t i = 0; i < E_STEPPERS; ++i) {
From 3494482cb0a192024929fc14deee3cc7f329c386 Mon Sep 17 00:00:00 2001
From: Andrew <18502096+classicrocker883@users.noreply.github.com>
Date: Tue, 27 May 2025 02:05:01 -0400
Subject: [PATCH 031/326] =?UTF-8?q?=F0=9F=8E=A8=20Misc.=20cleanup,=20tweak?=
=?UTF-8?q?=20unused=20LED=5FGraduallyControl=20(#27422)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Co-authored-by: Scott Lahteine
---
Marlin/src/lcd/e3v2/common/encoder.cpp | 17 +++++++++--------
Marlin/src/module/settings.cpp | 2 +-
Marlin/src/module/stepper.cpp | 4 ++--
3 files changed, 12 insertions(+), 11 deletions(-)
diff --git a/Marlin/src/lcd/e3v2/common/encoder.cpp b/Marlin/src/lcd/e3v2/common/encoder.cpp
index 889d1c61f3..2ae16f8bb1 100644
--- a/Marlin/src/lcd/e3v2/common/encoder.cpp
+++ b/Marlin/src/lcd/e3v2/common/encoder.cpp
@@ -137,9 +137,8 @@ EncoderState encoderReceiveAnalyze() {
// LED write data
void LED_WriteData() {
- uint8_t tempCounter_LED, tempCounter_Bit;
- for (tempCounter_LED = 0; tempCounter_LED < LED_NUM; tempCounter_LED++) {
- for (tempCounter_Bit = 0; tempCounter_Bit < 24; tempCounter_Bit++) {
+ for (uint8_t tempCounter_LED = 0; tempCounter_LED < LED_NUM; tempCounter_LED++) {
+ for (uint8_t tempCounter_Bit = 0; tempCounter_Bit < 24; tempCounter_Bit++) {
if (LED_DataArray[tempCounter_LED] & (0x800000 >> tempCounter_Bit)) {
LED_DATA_HIGH;
DELAY_NS(300);
@@ -190,20 +189,22 @@ EncoderState encoderReceiveAnalyze() {
}
}
- struct { bool g, r, b; } led_flag = { false, false, false };
+ struct { bool g, r, b; } led_flag;
for (uint8_t i = 0; i < LED_NUM; i++) {
+ led_flag = { false, false, false };
while (1) {
const uint8_t g = uint8_t(LED_DataArray[i] >> 16),
r = uint8_t(LED_DataArray[i] >> 8),
b = uint8_t(LED_DataArray[i]);
if (g == led_data[i].g) led_flag.g = true;
- else LED_DataArray[i] += (g > led_data[i].g) ? -0x010000 : 0x010000;
+ else LED_DataArray[i] += (g > led_data[i].g) ? -_BV32(16) : _BV32(16);
if (r == led_data[i].r) led_flag.r = true;
- else LED_DataArray[i] += (r > led_data[i].r) ? -0x000100 : 0x000100;
+ else LED_DataArray[i] += (r > led_data[i].r) ? -_BV32(8) : _BV32(8);
if (b == led_data[i].b) led_flag.b = true;
- else LED_DataArray[i] += (b > led_data[i].b) ? -0x000001 : 0x000001;
+ else LED_DataArray[i] += (b > led_data[i].b) ? -_BV32(0) : _BV32(0);
+
LED_WriteData();
- if (led_flag.r && led_flag.g && led_flag.b) break;
+ if (led_flag.g && led_flag.r && led_flag.b) break;
delay(change_Interval);
}
}
diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp
index 59cb7244e9..2161be5abc 100644
--- a/Marlin/src/module/settings.cpp
+++ b/Marlin/src/module/settings.cpp
@@ -655,7 +655,7 @@ typedef struct SettingsDataStruct {
// Fixed-Time Motion
//
#if ENABLED(FT_MOTION)
- ft_config_t ftMotion_cfg; // M493
+ ft_config_t ftMotion_cfg; // M493
#endif
//
diff --git a/Marlin/src/module/stepper.cpp b/Marlin/src/module/stepper.cpp
index ad7995bfc7..e5255246e1 100644
--- a/Marlin/src/module/stepper.cpp
+++ b/Marlin/src/module/stepper.cpp
@@ -1557,7 +1557,7 @@ void Stepper::isr() {
if (using_ftMotion) {
ftMotion_stepper(); // Run FTM Stepping
-
+
// Define 2.5 msec task for auxiliary functions.
if (!ftMotion_nextAuxISR) {
TERN_(BABYSTEPPING, if (babystep.has_steps()) babystepping_isr());
@@ -1566,7 +1566,7 @@ void Stepper::isr() {
// Enable ISRs to reduce latency for higher priority ISRs
hal.isr_on();
-
+
interval = FTM_MIN_TICKS;
ftMotion_nextAuxISR -= interval;
}
From 843f79589cd3f305998f217af55914e9cacb11f6 Mon Sep 17 00:00:00 2001
From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com>
Date: Tue, 27 May 2025 10:58:49 -0700
Subject: [PATCH 032/326] =?UTF-8?q?=F0=9F=94=A7=20Update=20BTT002=20SPI=20?=
=?UTF-8?q?driver=20conditionals=20(#27887)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Counterpart to #27886
---
.../src/pins/stm32f4/pins_BTT_BTT002_V1_0.h | 21 +++++++++++--------
1 file changed, 12 insertions(+), 9 deletions(-)
diff --git a/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h b/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h
index bcbdaedcf2..0e059106b8 100644
--- a/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h
+++ b/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h
@@ -108,16 +108,19 @@
#endif
//
-// SPI pins for TMC2130 stepper drivers
+// SPI pins for TMC2130, TMC2160, TMC2240, TMC2660, TMC5130, or TMC5160 stepper drivers
//
-#ifndef TMC_SPI_MOSI
- #define TMC_SPI_MOSI PB15
-#endif
-#ifndef TMC_SPI_MISO
- #define TMC_SPI_MISO PB14
-#endif
-#ifndef TMC_SPI_SCK
- #define TMC_SPI_SCK PB13
+#if HAS_TMC_SPI
+ #define TMC_USE_SW_SPI
+ #ifndef TMC_SPI_MOSI
+ #define TMC_SPI_MOSI PB15
+ #endif
+ #ifndef TMC_SPI_MISO
+ #define TMC_SPI_MISO PB14
+ #endif
+ #ifndef TMC_SPI_SCK
+ #define TMC_SPI_SCK PB13
+ #endif
#endif
#if HAS_TMC_UART
From 88d368ad9ded208c7a8f10459aa2c560eed407db Mon Sep 17 00:00:00 2001
From: ellensp <530024+ellensp@users.noreply.github.com>
Date: Wed, 28 May 2025 06:01:01 +1200
Subject: [PATCH 033/326] =?UTF-8?q?=F0=9F=A9=B9=20Misc=20temp=20sensor=20f?=
=?UTF-8?q?ixups=20(#27884)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Co-authored-by: Scott Lahteine
---
Marlin/src/HAL/GD32_MFL/temp_soc.h | 2 +-
Marlin/src/HAL/STM32/temp_soc.h | 2 +-
Marlin/src/module/temperature.cpp | 90 ++++++++++++++++--------------
3 files changed, 51 insertions(+), 43 deletions(-)
diff --git a/Marlin/src/HAL/GD32_MFL/temp_soc.h b/Marlin/src/HAL/GD32_MFL/temp_soc.h
index eeb144c422..5f1be64e43 100644
--- a/Marlin/src/HAL/GD32_MFL/temp_soc.h
+++ b/Marlin/src/HAL/GD32_MFL/temp_soc.h
@@ -26,4 +26,4 @@
#define TS_TYPICAL_SLOPE 4.5
// TODO: Implement voltage scaling (calibrated Vrefint) and ADC resolution scaling (when applicable)
-#define TEMP_SOC_SENSOR(RAW) ((TS_TYPICAL_V - (RAW) / float(OVERSAMPLENR) / float(HAL_ADC_RANGE) * (float(ADC_VREF_MV) / 1000)) / ((TS_TYPICAL_SLOPE) / 1000) + TS_TYPICAL_TEMP)
+#define TEMP_SOC_SENSOR(RAW) ((TS_TYPICAL_V - (RAW) / float(OVERSAMPLENR) / float(HAL_ADC_RANGE) * (float(ADC_VREF_MV) / 1000.0f)) / ((TS_TYPICAL_SLOPE) / 1000.0f) + TS_TYPICAL_TEMP)
diff --git a/Marlin/src/HAL/STM32/temp_soc.h b/Marlin/src/HAL/STM32/temp_soc.h
index 05fad695c3..cc165dd5e4 100644
--- a/Marlin/src/HAL/STM32/temp_soc.h
+++ b/Marlin/src/HAL/STM32/temp_soc.h
@@ -341,6 +341,6 @@
#elif defined(TS_TYPICAL_V) && defined(TS_TYPICAL_SLOPE) && defined(TS_TYPICAL_TEMP)
- #define TEMP_SOC_SENSOR(RAW) ((TS_TYPICAL_V - (RAW) / float(OVERSAMPLENR) / float(HAL_ADC_RANGE) * (float(ADC_VREF_MV) / 1000.0f)) / ((TS_TYPICAL_SLOPE) / 1000) + TS_TYPICAL_TEMP)
+ #define TEMP_SOC_SENSOR(RAW) ((TS_TYPICAL_V - (RAW) / float(OVERSAMPLENR) / float(HAL_ADC_RANGE) * (float(ADC_VREF_MV) / 1000.0f)) / ((TS_TYPICAL_SLOPE) / 1000.0f) + TS_TYPICAL_TEMP)
#endif
diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp
index 5c760a7689..c1684a9fe1 100644
--- a/Marlin/src/module/temperature.cpp
+++ b/Marlin/src/module/temperature.cpp
@@ -2460,11 +2460,6 @@ void Temperature::task() {
UNUSED(ms);
}
-// For a 5V input the AD595 returns a value scaled with 10mV per °C. (Minimum input voltage is 5V.)
-#define TEMP_AD595(RAW) ((RAW) * (ADC_VREF_MV / 10) / float(HAL_ADC_RANGE) / (OVERSAMPLENR) * (TEMP_SENSOR_AD595_GAIN) + TEMP_SENSOR_AD595_OFFSET)
-// For a 5V input the AD8495 returns a value scaled with 5mV per °C. (Minimum input voltage is 2.7V.)
-#define TEMP_AD8495(RAW) ((RAW) * (ADC_VREF_MV / 5) / float(HAL_ADC_RANGE) / (OVERSAMPLENR) * (TEMP_SENSOR_AD8495_GAIN) + TEMP_SENSOR_AD8495_OFFSET)
-
/**
* Bisect search for the range of the 'raw' value, then interpolate
* proportionally between the under and over values.
@@ -2604,6 +2599,22 @@ void Temperature::task() {
}
#endif
+#if ANY_THERMISTOR_IS(-1)
+ // For a 5V input the AD595 returns a value scaled with 10mV per °C. (Minimum input voltage is 5V.)
+ static constexpr celsius_float_t temp_ad595(const raw_adc_t raw) {
+ return raw * (float(ADC_VREF_MV) / 10.0f) / float(HAL_ADC_RANGE) / (OVERSAMPLENR)
+ * (TEMP_SENSOR_AD595_GAIN) + (TEMP_SENSOR_AD595_OFFSET);
+ }
+#endif
+
+#if ANY_THERMISTOR_IS(-4)
+ // For a 5V input the AD8495 returns a value scaled with 5mV per °C. (Minimum input voltage is 2.7V.)
+ static constexpr celsius_float_t temp_ad8495(const raw_adc_t raw) {
+ return raw * (float(ADC_VREF_MV) / 5.0f) / float(HAL_ADC_RANGE) / (OVERSAMPLENR)
+ * (TEMP_SENSOR_AD8495_GAIN) + (TEMP_SENSOR_AD8495_OFFSET);
+ }
+#endif
+
#if HAS_HOTEND
// Derived from RepRap FiveD extruder::getTemperature()
// For hot end temperature measurement.
@@ -2630,9 +2641,9 @@ void Temperature::task() {
return (int16_t)raw * 0.25f;
#endif
#elif TEMP_SENSOR_0_IS_AD595
- return TEMP_AD595(raw);
+ return temp_ad595(raw);
#elif TEMP_SENSOR_0_IS_AD8495
- return TEMP_AD8495(raw);
+ return temp_ad8495(raw);
#else
break;
#endif
@@ -2649,9 +2660,9 @@ void Temperature::task() {
return (int16_t)raw * 0.25f;
#endif
#elif TEMP_SENSOR_1_IS_AD595
- return TEMP_AD595(raw);
+ return temp_ad595(raw);
#elif TEMP_SENSOR_1_IS_AD8495
- return TEMP_AD8495(raw);
+ return temp_ad8495(raw);
#else
break;
#endif
@@ -2668,9 +2679,9 @@ void Temperature::task() {
return (int16_t)raw * 0.25f;
#endif
#elif TEMP_SENSOR_2_IS_AD595
- return TEMP_AD595(raw);
+ return temp_ad595(raw);
#elif TEMP_SENSOR_2_IS_AD8495
- return TEMP_AD8495(raw);
+ return temp_ad8495(raw);
#else
break;
#endif
@@ -2678,9 +2689,9 @@ void Temperature::task() {
#if TEMP_SENSOR_3_IS_CUSTOM
return user_thermistor_to_deg_c(CTI_HOTEND_3, raw);
#elif TEMP_SENSOR_3_IS_AD595
- return TEMP_AD595(raw);
+ return temp_ad595(raw);
#elif TEMP_SENSOR_3_IS_AD8495
- return TEMP_AD8495(raw);
+ return temp_ad8495(raw);
#else
break;
#endif
@@ -2688,9 +2699,9 @@ void Temperature::task() {
#if TEMP_SENSOR_4_IS_CUSTOM
return user_thermistor_to_deg_c(CTI_HOTEND_4, raw);
#elif TEMP_SENSOR_4_IS_AD595
- return TEMP_AD595(raw);
+ return temp_ad595(raw);
#elif TEMP_SENSOR_4_IS_AD8495
- return TEMP_AD8495(raw);
+ return temp_ad8495(raw);
#else
break;
#endif
@@ -2698,9 +2709,9 @@ void Temperature::task() {
#if TEMP_SENSOR_5_IS_CUSTOM
return user_thermistor_to_deg_c(CTI_HOTEND_5, raw);
#elif TEMP_SENSOR_5_IS_AD595
- return TEMP_AD595(raw);
+ return temp_ad595(raw);
#elif TEMP_SENSOR_5_IS_AD8495
- return TEMP_AD8495(raw);
+ return temp_ad8495(raw);
#else
break;
#endif
@@ -2708,9 +2719,9 @@ void Temperature::task() {
#if TEMP_SENSOR_6_IS_CUSTOM
return user_thermistor_to_deg_c(CTI_HOTEND_6, raw);
#elif TEMP_SENSOR_6_IS_AD595
- return TEMP_AD595(raw);
+ return temp_ad595(raw);
#elif TEMP_SENSOR_6_IS_AD8495
- return TEMP_AD8495(raw);
+ return temp_ad8495(raw);
#else
break;
#endif
@@ -2718,9 +2729,9 @@ void Temperature::task() {
#if TEMP_SENSOR_7_IS_CUSTOM
return user_thermistor_to_deg_c(CTI_HOTEND_7, raw);
#elif TEMP_SENSOR_7_IS_AD595
- return TEMP_AD595(raw);
+ return temp_ad595(raw);
#elif TEMP_SENSOR_7_IS_AD8495
- return TEMP_AD8495(raw);
+ return temp_ad8495(raw);
#else
break;
#endif
@@ -2754,9 +2765,9 @@ void Temperature::task() {
#elif TEMP_SENSOR_BED_IS_THERMISTOR
SCAN_THERMISTOR_TABLE(TEMPTABLE_BED, TEMPTABLE_BED_LEN);
#elif TEMP_SENSOR_BED_IS_AD595
- return TEMP_AD595(raw);
+ return temp_ad595(raw);
#elif TEMP_SENSOR_BED_IS_AD8495
- return TEMP_AD8495(raw);
+ return temp_ad8495(raw);
#else
UNUSED(raw);
return 0;
@@ -2772,9 +2783,9 @@ void Temperature::task() {
#elif TEMP_SENSOR_CHAMBER_IS_THERMISTOR
SCAN_THERMISTOR_TABLE(TEMPTABLE_CHAMBER, TEMPTABLE_CHAMBER_LEN);
#elif TEMP_SENSOR_CHAMBER_IS_AD595
- return TEMP_AD595(raw);
+ return temp_ad595(raw);
#elif TEMP_SENSOR_CHAMBER_IS_AD8495
- return TEMP_AD8495(raw);
+ return temp_ad8495(raw);
#else
UNUSED(raw);
return 0;
@@ -2790,9 +2801,9 @@ void Temperature::task() {
#elif TEMP_SENSOR_COOLER_IS_THERMISTOR
SCAN_THERMISTOR_TABLE(TEMPTABLE_COOLER, TEMPTABLE_COOLER_LEN);
#elif TEMP_SENSOR_COOLER_IS_AD595
- return TEMP_AD595(raw);
+ return temp_ad595(raw);
#elif TEMP_SENSOR_COOLER_IS_AD8495
- return TEMP_AD8495(raw);
+ return temp_ad8495(raw);
#else
UNUSED(raw);
return 0;
@@ -2808,9 +2819,9 @@ void Temperature::task() {
#elif TEMP_SENSOR_PROBE_IS_THERMISTOR
SCAN_THERMISTOR_TABLE(TEMPTABLE_PROBE, TEMPTABLE_PROBE_LEN);
#elif TEMP_SENSOR_PROBE_IS_AD595
- return TEMP_AD595(raw);
+ return temp_ad595(raw);
#elif TEMP_SENSOR_PROBE_IS_AD8495
- return TEMP_AD8495(raw);
+ return temp_ad8495(raw);
#else
UNUSED(raw);
return 0;
@@ -2826,9 +2837,9 @@ void Temperature::task() {
#elif TEMP_SENSOR_BOARD_IS_THERMISTOR
SCAN_THERMISTOR_TABLE(TEMPTABLE_BOARD, TEMPTABLE_BOARD_LEN);
#elif TEMP_SENSOR_BOARD_IS_AD595
- return TEMP_AD595(raw);
+ return temp_ad595(raw);
#elif TEMP_SENSOR_BOARD_IS_AD8495
- return TEMP_AD8495(raw);
+ return temp_ad8495(raw);
#else
UNUSED(raw);
return 0;
@@ -2839,14 +2850,11 @@ void Temperature::task() {
#if HAS_TEMP_SOC
// For SoC temperature measurement.
celsius_float_t Temperature::analog_to_celsius_soc(const raw_adc_t raw) {
- return (
- #ifdef TEMP_SOC_SENSOR
- TEMP_SOC_SENSOR(raw)
- #else
- 0
- #error "TEMP_SENSOR_SOC requires the TEMP_SOC_SENSOR(RAW) macro to be defined for your board."
- #endif
- );
+ #ifndef TEMP_SOC_SENSOR
+ #error "TEMP_SENSOR_SOC requires the TEMP_SOC_SENSOR(RAW) macro to be defined for your board."
+ #define TEMP_SOC_SENSOR(...) 0
+ #endif
+ return TEMP_SOC_SENSOR(raw);
}
#endif
@@ -2864,9 +2872,9 @@ void Temperature::task() {
#elif TEMP_SENSOR_REDUNDANT_IS_THERMISTOR
SCAN_THERMISTOR_TABLE(TEMPTABLE_REDUNDANT, TEMPTABLE_REDUNDANT_LEN);
#elif TEMP_SENSOR_REDUNDANT_IS_AD595
- return TEMP_AD595(raw);
+ return temp_ad595(raw);
#elif TEMP_SENSOR_REDUNDANT_IS_AD8495
- return TEMP_AD8495(raw);
+ return temp_ad8495(raw);
#else
UNUSED(raw);
return 0;
From d0e8edad3c5f836dd7f7c200e74bf660c587aee0 Mon Sep 17 00:00:00 2001
From: David Buezas
Date: Tue, 27 May 2025 20:15:38 +0200
Subject: [PATCH 034/326] =?UTF-8?q?=F0=9F=90=9B=20More=20robust=20Smooth?=
=?UTF-8?q?=20Linear=20Advance=20(#27862)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Co-authored-by: Scott Lahteine
---
Marlin/src/module/stepper.cpp | 55 +++++++++++++++++------------------
1 file changed, 27 insertions(+), 28 deletions(-)
diff --git a/Marlin/src/module/stepper.cpp b/Marlin/src/module/stepper.cpp
index e5255246e1..edfed3b8e2 100644
--- a/Marlin/src/module/stepper.cpp
+++ b/Marlin/src/module/stepper.cpp
@@ -2921,8 +2921,13 @@ hal_timer_t Stepper::block_phase_isr() {
if (++index == IS_COMPENSATION_BUFFER_SIZE) index = 0;
}
FORCE_INLINE xy_long_t past_item(const uint16_t n) {
- const int16_t i = int16_t(index) - n;
- return buffer[i >= 0 ? i : i + IS_COMPENSATION_BUFFER_SIZE];
+ int16_t i = int16_t(index) - n;
+ if (i < 0) i += IS_COMPENSATION_BUFFER_SIZE;
+ // The following only happens when IS Freq is set below the minimum
+ // configured at build time ...in which case IS will also misbehave!
+ // Using setters whenever possible prevents values being set too low.
+ if (TERN0(MARLIN_DEV_MODE, i < 0)) return {0, 0};
+ return buffer[i];
}
} DelayBuffer;
@@ -2995,44 +3000,38 @@ hal_timer_t Stepper::block_phase_isr() {
? MULT_Q(30, curr_step_rate, current_block->e_step_ratio_q30)
: 0;
- int32_t total_step_rate = la_step_rate + planned_step_rate;
-
#if ENABLED(INPUT_SHAPING_E_SYNC)
- xy_long_t pre_shaping_rate = xy_long_t({0, 0}),
- first_pulse_rate = xy_long_t({0, 0});
- int32_t unshaped_rate_e = total_step_rate;
- if (current_block) {
- if (current_block->xy_length_inv_q30 > 0) {
- unshaped_rate_e = 0;
+ int32_t unshaped_rate_e = la_step_rate + planned_step_rate;
- pre_shaping_rate = xy_long_t({
- TERN0(INPUT_SHAPING_X, MULT_Q(30, total_step_rate * current_block->steps.x, current_block->xy_length_inv_q30)),
- TERN0(INPUT_SHAPING_Y, MULT_Q(30, total_step_rate * current_block->steps.y, current_block->xy_length_inv_q30))
- });
+ xy_long_t pre_shaping_rate{0}, first_pulse_rate{0};
+ if (current_block && current_block->xy_length_inv_q30 > 0) {
+ pre_shaping_rate = xy_long_t({
+ MULT_Q(30, unshaped_rate_e * current_block->steps.x, current_block->xy_length_inv_q30),
+ MULT_Q(30, unshaped_rate_e * current_block->steps.y, current_block->xy_length_inv_q30)
+ });
+ unshaped_rate_e = 0;
- first_pulse_rate = xy_long_t({
- TERN0(INPUT_SHAPING_X, (pre_shaping_rate.x * Stepper::shaping_x.factor1) >> 7),
- TERN0(INPUT_SHAPING_Y, (pre_shaping_rate.y * Stepper::shaping_y.factor1) >> 7)
- });
- }
+ first_pulse_rate = xy_long_t({
+ TERN_(INPUT_SHAPING_X, shaping_x.enabled ? (pre_shaping_rate.x * shaping_x.factor1) >> 7 :) pre_shaping_rate.x,
+ TERN_(INPUT_SHAPING_Y, shaping_y.enabled ? (pre_shaping_rate.y * shaping_y.factor1) >> 7 :) pre_shaping_rate.y
+ });
}
- const xy_long_t second_pulse_rate = {
- TERN0(INPUT_SHAPING_X, (smooth_lin_adv_lookback(ShapingQueue::get_delay_x()).x * Stepper::shaping_x.factor2)) >> 7,
- TERN0(INPUT_SHAPING_Y, (smooth_lin_adv_lookback(ShapingQueue::get_delay_y()).y * Stepper::shaping_y.factor2)) >> 7
- };
+ const xy_long_t second_pulse_rate = xy_long_t({
+ TERN0(INPUT_SHAPING_X, shaping_x.enabled ? (smooth_lin_adv_lookback(ShapingQueue::get_delay_x()).x * shaping_x.factor2) >> 7 : 0),
+ TERN0(INPUT_SHAPING_Y, shaping_y.enabled ? (smooth_lin_adv_lookback(ShapingQueue::get_delay_y()).y * shaping_y.factor2) >> 7 : 0)
+ });
delayBuffer.add(pre_shaping_rate);
- const int32_t x = TERN0(INPUT_SHAPING_X, first_pulse_rate.x + second_pulse_rate.x),
- y = TERN0(INPUT_SHAPING_Y, first_pulse_rate.y + second_pulse_rate.y);
+ set_la_interval(unshaped_rate_e + first_pulse_rate.x + second_pulse_rate.x + first_pulse_rate.y + second_pulse_rate.y);
- total_step_rate = unshaped_rate_e + x + y;
+ #else // !INPUT_SHAPING_E_SYNC
- #endif // INPUT_SHAPING_E_SYNC
+ set_la_interval(la_step_rate + planned_step_rate);
- set_la_interval(total_step_rate);
+ #endif
curr_timer_tick += SMOOTH_LIN_ADV_INTERVAL;
return SMOOTH_LIN_ADV_INTERVAL;
From c20c6b61f1a9222f0550356eeadb7007e5c78f5a Mon Sep 17 00:00:00 2001
From: staff1010 <132726146+staff1010@users.noreply.github.com>
Date: Wed, 28 May 2025 03:49:19 +0800
Subject: [PATCH 035/326] =?UTF-8?q?=F0=9F=9A=B8=20Improve=20MKS=20UI=20wit?=
=?UTF-8?q?h=20LVGL=20v6.1.2=20(#27889)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
Marlin/src/lcd/extui/mks_ui/draw_ui.cpp | 21 +-
Marlin/src/lcd/extui/mks_ui/pic_manager.cpp | 133 +-
Marlin/src/lcd/extui/mks_ui/pic_manager.h | 15 +-
.../extui/mks_ui/tft_lvgl_configuration.cpp | 27 +-
.../lcd/extui/mks_ui/tft_lvgl_configuration.h | 2 +-
Marlin/src/lcd/extui/mks_ui/uthash.h | 1137 +++++++++++++++++
ini/features.ini | 2 +-
7 files changed, 1277 insertions(+), 60 deletions(-)
create mode 100644 Marlin/src/lcd/extui/mks_ui/uthash.h
diff --git a/Marlin/src/lcd/extui/mks_ui/draw_ui.cpp b/Marlin/src/lcd/extui/mks_ui/draw_ui.cpp
index 4278092472..875f2d8e72 100644
--- a/Marlin/src/lcd/extui/mks_ui/draw_ui.cpp
+++ b/Marlin/src/lcd/extui/mks_ui/draw_ui.cpp
@@ -579,7 +579,7 @@ char *creat_title_text() {
update_spi_flash();
}
card.closefile();
- #endif
+ #endif // HAS_MEDIA
}
void gcode_preview(char *path, int xpos_pixel, int ypos_pixel) {
@@ -662,27 +662,27 @@ char *creat_title_text() {
}
void draw_default_preview(int xpos_pixel, int ypos_pixel, uint8_t sel) {
- int index;
+ static constexpr uint16_t draw_col_count = 40; // Number of rows displayed each time, determines the size of bmp_public_buf
+ static constexpr int draw_count = 200 / draw_col_count; // Total number of times to be displayed
+ static constexpr uint32_t pixel_count = (DEFAULT_VIEW_MAX_SIZE) / draw_count; // Number of pixels read per time (uint8_t)
int y_off = 0;
- W25QXX.init(SPI_QUARTER_SPEED);
- for (index = 0; index < 10; index++) { // 200*200
+ for (int index = 0; index < draw_count; index++) { // 200*200
#if HAS_BAK_VIEW_IN_FLASH
if (sel == 1) {
- flash_view_Read(bmp_public_buf, 8000); // 20k
+ flash_view_Read(bmp_public_buf, pixel_count); // 16k
}
else {
- default_view_Read(bmp_public_buf, DEFAULT_VIEW_MAX_SIZE / 10); // 8k
+ default_view_Read(bmp_public_buf, pixel_count); // 16k
}
#else
- default_view_Read(bmp_public_buf, DEFAULT_VIEW_MAX_SIZE / 10); // 8k
+ default_view_Read(bmp_public_buf, pixel_count); // 8k
#endif
- SPI_TFT.setWindow(xpos_pixel, y_off * 20 + ypos_pixel, 200, 20); // 200*200
- SPI_TFT.tftio.writeSequence((uint16_t*)(bmp_public_buf), DEFAULT_VIEW_MAX_SIZE / 20);
+ SPI_TFT.setWindow(xpos_pixel, y_off * draw_col_count + ypos_pixel, 200, draw_col_count); // 200 * draw_col_count
+ SPI_TFT.tftio.writeSequence((uint16_t*)(bmp_public_buf), uint16_t(pixel_count / 2));
y_off++;
}
- W25QXX.init(SPI_QUARTER_SPEED);
}
void disp_pre_gcode(int xpos_pixel, int ypos_pixel) {
@@ -700,6 +700,7 @@ char *creat_title_text() {
}
#endif
}
+
#endif // HAS_GCODE_PREVIEW
void print_time_run() {
diff --git a/Marlin/src/lcd/extui/mks_ui/pic_manager.cpp b/Marlin/src/lcd/extui/mks_ui/pic_manager.cpp
index 04ea827236..5db110ec1b 100644
--- a/Marlin/src/lcd/extui/mks_ui/pic_manager.cpp
+++ b/Marlin/src/lcd/extui/mks_ui/pic_manager.cpp
@@ -35,6 +35,10 @@
#include
+#if ENABLED(USE_HASH_TABLE)
+ #include "uthash.h"
+#endif
+
extern uint16_t DeviceCode;
#if HAS_MEDIA
@@ -92,7 +96,7 @@ static FSTR_P const assets[] = {
F("bmp_file.bin"),
// Move motor screen
- // TODO: 6 equal icons, just in diffenct rotation... it may be optimized too
+ // TODO: 6 equal icons, just in different rotation... it may be optimized too
F("bmp_xAdd.bin"),
F("bmp_xDec.bin"),
F("bmp_yAdd.bin"),
@@ -223,42 +227,98 @@ static FSTR_P const assets[] = {
static FSTR_P const fonts[] = { F("FontUNIGBK.bin") };
#endif
-uint8_t currentFlashPage = 0;
+#if HAS_SPI_FLASH_COMPRESSION
+ uint8_t currentFlashPage = 0;
+#endif
-uint32_t lv_get_pic_addr(uint8_t *Pname) {
- uint8_t Pic_cnt;
- uint8_t i, j;
- PIC_MSG PIC;
- uint32_t tmp_cnt = 0;
- uint32_t addr = 0;
+#if ENABLED(USE_HASH_TABLE)
- currentFlashPage = 0;
+ typedef struct {
+ char name[PIC_NAME_MAX_LEN - PIC_NAME_OFFSET]; /* key */
+ uint32_t addr;
+ UT_hash_handle hh; /* makes this structure hashable */
+ } PicHashEntry;
- #if ENABLED(MARLIN_DEV_MODE)
- SERIAL_ECHOLNPGM("Getting picture SPI Flash Address: ", (const char*)Pname);
- #endif
+ PicHashEntry* pic_hash = NULL;
- W25QXX.init(SPI_QUARTER_SPEED);
+ // Initialize the image address hash table
+ void init_img_map() {
+ uint8_t Pic_cnt;
+ W25QXX.SPI_FLASH_BufferRead(&Pic_cnt, PIC_COUNTER_ADDR, 1);
+ if (Pic_cnt == 0xFF) Pic_cnt = 0;
- W25QXX.SPI_FLASH_BufferRead(&Pic_cnt, PIC_COUNTER_ADDR, 1);
- if (Pic_cnt == 0xFF) Pic_cnt = 0;
- for (i = 0; i < Pic_cnt; i++) {
- j = 0;
- do {
- W25QXX.SPI_FLASH_BufferRead(&PIC.name[j], PIC_NAME_ADDR + tmp_cnt, 1);
- tmp_cnt++;
- } while (PIC.name[j++] != '\0');
+ uint32_t tmp_cnt = 0;
+ for (uint8_t i = 0; i < Pic_cnt; i++) {
+ char name[PIC_NAME_MAX_LEN - PIC_NAME_OFFSET];
+ uint8_t j = 0;
+ do {
+ W25QXX.SPI_FLASH_BufferRead((uint8_t*)&name[j], PIC_NAME_ADDR + tmp_cnt, 1);
+ tmp_cnt++;
+ } while (name[j++] != '\0');
- if ((strcasecmp((char*)Pname, (char*)PIC.name)) == 0) {
+ uint32_t addr;
if (DeviceCode == 0x9488 || DeviceCode == 0x5761)
addr = PIC_DATA_ADDR_TFT35 + i * PER_PIC_MAX_SPACE_TFT35;
else
addr = PIC_DATA_ADDR_TFT32 + i * PER_PIC_MAX_SPACE_TFT32;
- return addr;
+
+ // Add to hash table, don't save "bmp_"
+ PicHashEntry* entry = (PicHashEntry*)malloc(sizeof(*entry));
+ strncpy(entry->name, (name + PIC_NAME_OFFSET), sizeof(name));
+ entry->addr = addr;
+ HASH_ADD_STR(pic_hash, name, entry);
}
+ #if ENABLED(MARLIN_DEV_MODE)
+ SERIAL_ECHOLNPGM("Image Hash Table Count: ", HASH_COUNT(pic_hash), ", Size(Bytes): ", HASH_OVERHEAD(hh, pic_hash));
+ #endif
}
- return addr;
-}
+
+ uint32_t lv_get_pic_addr(uint8_t *Pname) {
+ #if ENABLED(MARLIN_DEV_MODE)
+ SERIAL_ECHOLNPGM("Getting picture SPI Flash Address: ", (const char*)Pname);
+ #endif
+
+ PicHashEntry* entry;
+ HASH_FIND_STR(pic_hash, (char*)(Pname + PIC_NAME_OFFSET), entry);
+ return entry ? entry->addr : 0;
+ }
+
+#else // !USE_HASH_TABLE
+
+ uint32_t lv_get_pic_addr(uint8_t *Pname) {
+ uint8_t Pic_cnt;
+ uint8_t i, j;
+ PIC_MSG PIC;
+ uint32_t tmp_cnt = 0;
+ uint32_t addr = 0;
+
+ #if ENABLED(MARLIN_DEV_MODE)
+ SERIAL_ECHOLNPGM("Getting picture SPI Flash Address: ", (const char*)Pname);
+ #endif
+
+ W25QXX.init(SPI_QUARTER_SPEED);
+
+ W25QXX.SPI_FLASH_BufferRead(&Pic_cnt, PIC_COUNTER_ADDR, 1);
+ if (Pic_cnt == 0xFF) Pic_cnt = 0;
+ for (i = 0; i < Pic_cnt; i++) {
+ j = 0;
+ do {
+ W25QXX.SPI_FLASH_BufferRead(&PIC.name[j], PIC_NAME_ADDR + tmp_cnt, 1);
+ tmp_cnt++;
+ } while (PIC.name[j++] != '\0');
+
+ if ((strcasecmp((char*)Pname, (char*)PIC.name)) == 0) {
+ if (DeviceCode == 0x9488 || DeviceCode == 0x5761)
+ addr = PIC_DATA_ADDR_TFT35 + i * PER_PIC_MAX_SPACE_TFT35;
+ else
+ addr = PIC_DATA_ADDR_TFT32 + i * PER_PIC_MAX_SPACE_TFT32;
+ break;
+ }
+ }
+ return addr;
+ }
+
+#endif // !USE_HASH_TABLE
const char *assetsPath = "assets";
const char *bakPath = "_assets";
@@ -309,8 +369,8 @@ uint8_t picLogoWrite(uint8_t *LogoName, uint8_t *Logo_Wbuff, uint32_t LogoWriteS
uint32_t TitleLogoWrite_Addroffset = 0;
uint8_t picTitleLogoWrite(uint8_t *TitleLogoName, uint8_t *TitleLogo_Wbuff, uint32_t TitleLogoWriteSize) {
- if (TitleLogoWriteSize <= 0)
- return 0;
+ if (TitleLogoWriteSize <= 0) return 0;
+
if ((DeviceCode == 0x9488) || (DeviceCode == 0x5761))
W25QXX.SPI_FLASH_BufferWrite(TitleLogo_Wbuff, PIC_ICON_LOGO_ADDR_TFT35 + TitleLogoWrite_Addroffset, TitleLogoWriteSize);
else
@@ -341,9 +401,7 @@ uint32_t picInfoWrite(uint8_t *P_name, uint32_t P_size) {
union union32 size_tmp;
W25QXX.SPI_FLASH_BufferRead(&pic_counter, PIC_COUNTER_ADDR, 1);
-
- if (pic_counter == 0xFF)
- pic_counter = 0;
+ if (pic_counter == 0xFF) pic_counter = 0;
if ((DeviceCode == 0x9488) || (DeviceCode == 0x5761))
picSaveAddr = PIC_DATA_ADDR_TFT35 + pic_counter * PER_PIC_MAX_SPACE_TFT35;
@@ -416,6 +474,7 @@ uint32_t picInfoWrite(uint8_t *P_name, uint32_t P_size) {
}
hal.watchdog_refresh();
+ disp_string(100, 165, FTOP(F(" ")), 0xFFFF, 0x0000); // clean string
disp_assets_update_progress(fn);
W25QXX.init(SPI_QUARTER_SPEED);
@@ -449,16 +508,18 @@ uint32_t picInfoWrite(uint8_t *P_name, uint32_t P_size) {
}
else if (assetType == ASSET_TYPE_ICON) {
Pic_Write_Addr = picInfoWrite((uint8_t*)fn, pfileSize);
- SPIFlash.beginWrite(Pic_Write_Addr);
#if HAS_SPI_FLASH_COMPRESSION
+ SPIFlash.beginWrite(Pic_Write_Addr);
do {
hal.watchdog_refresh();
pbr = file.read(public_buf, SPI_FLASH_PageSize);
TERN_(MARLIN_DEV_MODE, totalSizes += pbr);
SPIFlash.writeData(public_buf, SPI_FLASH_PageSize);
} while (pbr >= SPI_FLASH_PageSize);
+ SPIFlash.endWrite();
#else
do {
+ hal.watchdog_refresh();
pbr = file.read(public_buf, BMP_WRITE_BUF_LEN);
W25QXX.SPI_FLASH_BufferWrite(public_buf, Pic_Write_Addr, pbr);
Pic_Write_Addr += pbr;
@@ -468,7 +529,6 @@ uint32_t picInfoWrite(uint8_t *P_name, uint32_t P_size) {
SERIAL_ECHOLNPGM("Space used: ", fn, " - ", (SPIFlash.getCurrentPage() + 1) * SPI_FLASH_PageSize / 1024, "KB");
totalCompressed += (SPIFlash.getCurrentPage() + 1) * SPI_FLASH_PageSize;
#endif
- SPIFlash.endWrite();
}
else if (assetType == ASSET_TYPE_FONT) {
Pic_Write_Addr = UNIGBK_FLASH_ADDR;
@@ -557,8 +617,7 @@ void picRead(uint8_t *Pname, uint8_t *P_Rbuff) {
PIC_MSG PIC;
W25QXX.SPI_FLASH_BufferRead(&Pic_cnt, PIC_COUNTER_ADDR, 1);
- if (Pic_cnt == 0xFF)
- Pic_cnt = 0;
+ if (Pic_cnt == 0xFF) Pic_cnt = 0;
for (i = 0; i < Pic_cnt; i++) {
j = 0;
@@ -578,12 +637,12 @@ void picRead(uint8_t *Pname, uint8_t *P_Rbuff) {
void lv_pic_test(uint8_t *P_Rbuff, uint32_t addr, uint32_t size) {
#if HAS_SPI_FLASH_COMPRESSION
- if (currentFlashPage == 0)
+ if (currentFlashPage == 0) {
+ currentFlashPage = 1;
SPIFlash.beginRead(addr);
+ }
SPIFlash.readData(P_Rbuff, size);
- currentFlashPage++;
#else
- W25QXX.init(SPI_QUARTER_SPEED);
W25QXX.SPI_FLASH_BufferRead((uint8_t *)P_Rbuff, addr, size);
#endif
}
diff --git a/Marlin/src/lcd/extui/mks_ui/pic_manager.h b/Marlin/src/lcd/extui/mks_ui/pic_manager.h
index 1483b96461..30003a16d6 100644
--- a/Marlin/src/lcd/extui/mks_ui/pic_manager.h
+++ b/Marlin/src/lcd/extui/mks_ui/pic_manager.h
@@ -29,6 +29,9 @@
#include
#include
+#include "SPIFlashStorage.h"
+
+#define USE_HASH_TABLE
#ifndef HAS_SPI_FLASH_FONT
#define HAS_SPI_FLASH_FONT 1 // Disabled until fix the font load code
@@ -53,7 +56,8 @@
#endif
#define PIC_MAX_CN 100 // Maximum number of pictures
-#define PIC_NAME_MAX_LEN 50 // Picture name maximum length
+#define PIC_NAME_MAX_LEN 30 // Picture name maximum length
+#define PIC_NAME_OFFSET 4 // Same picture filename section
#define LOGO_MAX_SIZE_TFT35 (300 * 1024)
#define LOGO_MAX_SIZE_TFT32 (150 * 1024)
@@ -61,7 +65,11 @@
#define DEFAULT_VIEW_MAX_SIZE (200 * 200 * 2)
#define FLASH_VIEW_MAX_SIZE (200 * 200 * 2)
-#define PER_PIC_MAX_SPACE_TFT35 (9 * 1024)
+#if HAS_SPI_FLASH_COMPRESSION
+ #define PER_PIC_MAX_SPACE_TFT35 ( 9 * 1024)
+#else
+ #define PER_PIC_MAX_SPACE_TFT35 (32 * 1024)
+#endif
#define PER_PIC_MAX_SPACE_TFT32 (16 * 1024)
#define PER_FONT_MAX_SPACE (16 * 1024)
@@ -154,6 +162,9 @@ typedef struct pic_msg PIC_MSG;
#define PIC_SIZE_xM 6
#define FONT_SIZE_xM 2
+#if ENABLED(USE_HASH_TABLE)
+ void init_img_map();
+#endif
void picRead(uint8_t *Pname, uint8_t *P_Rbuff);
void picLogoRead(uint8_t *LogoName, uint8_t *Logo_Rbuff, uint32_t LogoReadsize);
void lv_pic_test(uint8_t *P_Rbuff, uint32_t addr, uint32_t size);
diff --git a/Marlin/src/lcd/extui/mks_ui/tft_lvgl_configuration.cpp b/Marlin/src/lcd/extui/mks_ui/tft_lvgl_configuration.cpp
index 903afad884..0ea29dda0c 100644
--- a/Marlin/src/lcd/extui/mks_ui/tft_lvgl_configuration.cpp
+++ b/Marlin/src/lcd/extui/mks_ui/tft_lvgl_configuration.cpp
@@ -85,7 +85,7 @@ lv_group_t* g;
uint16_t DeviceCode = 0x9488;
extern uint8_t sel_id;
-uint8_t bmp_public_buf[14 * 1024];
+uint8_t bmp_public_buf[16 * 1024];
uint8_t public_buf[513];
extern bool flash_preview_begin, default_preview_flg, gcode_preview_over;
@@ -149,9 +149,14 @@ void tft_lvgl_init() {
touch.init();
+ #if ENABLED(USE_HASH_TABLE)
+ init_img_map(); // Initialize the image address hash table
+ hal.watchdog_refresh(); // Hash table init takes time
+ #endif
+
lv_init();
- lv_disp_buf_init(&disp_buf, bmp_public_buf, nullptr, LV_HOR_RES_MAX * 14); // Initialize the display buffer
+ lv_disp_buf_init(&disp_buf, bmp_public_buf, nullptr, LV_HOR_RES_MAX * 17); // Initialize the display buffer
lv_disp_drv_t disp_drv; // Descriptor of a display driver
lv_disp_drv_init(&disp_drv); // Basic initialization
@@ -268,8 +273,6 @@ void my_disp_flush(lv_disp_drv_t * disp, const lv_area_t * area, lv_color_t * co
SPI_TFT.tftio.writeSequence((uint16_t*)color_p, width * height);
lv_disp_flush_ready(disp_drv_p); // Indicate you are ready with the flushing
#endif
-
- W25QXX.init(SPI_QUARTER_SPEED);
}
#if ENABLED(USE_SPI_DMA_TC)
@@ -327,20 +330,26 @@ bool my_mousewheel_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data) {
return false; // No more data to read so return false
}
-extern uint8_t currentFlashPage;
+#if HAS_SPI_FLASH_COMPRESSION
+ extern uint8_t currentFlashPage;
+#endif
// spi_flash
uint32_t pic_read_base_addr = 0, pic_read_addr_offset = 0;
lv_fs_res_t spi_flash_open_cb (lv_fs_drv_t * drv, void * file_p, const char * path, lv_fs_mode_t mode) {
static char last_path_name[30];
+ #if HAS_SPI_FLASH_COMPRESSION
+ currentFlashPage = 0;
+ #endif
if (strcasecmp(last_path_name, path) != 0) {
pic_read_base_addr = lv_get_pic_addr((uint8_t *)path);
+ // clean lvgl image cache
+ char cache_path_name[30 + 3] = {0};
+ strcat(cache_path_name, "F:/");
+ strcat(cache_path_name, (const char *)last_path_name);
+ lv_img_cache_invalidate_src(cache_path_name);
strcpy(last_path_name, path);
}
- else {
- W25QXX.init(SPI_QUARTER_SPEED);
- currentFlashPage = 0;
- }
pic_read_addr_offset = pic_read_base_addr;
return LV_FS_RES_OK;
}
diff --git a/Marlin/src/lcd/extui/mks_ui/tft_lvgl_configuration.h b/Marlin/src/lcd/extui/mks_ui/tft_lvgl_configuration.h
index 43e82bd34d..606fdb50e0 100644
--- a/Marlin/src/lcd/extui/mks_ui/tft_lvgl_configuration.h
+++ b/Marlin/src/lcd/extui/mks_ui/tft_lvgl_configuration.h
@@ -32,7 +32,7 @@
#include
-extern uint8_t bmp_public_buf[14 * 1024];
+extern uint8_t bmp_public_buf[16 * 1024];
extern uint8_t public_buf[513];
void tft_lvgl_init();
diff --git a/Marlin/src/lcd/extui/mks_ui/uthash.h b/Marlin/src/lcd/extui/mks_ui/uthash.h
new file mode 100644
index 0000000000..06c2eebdb8
--- /dev/null
+++ b/Marlin/src/lcd/extui/mks_ui/uthash.h
@@ -0,0 +1,1137 @@
+/*
+Copyright (c) 2003-2025, Troy D. Hanson https://troydhanson.github.io/uthash/
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
+OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+#ifndef UTHASH_H
+#define UTHASH_H
+
+#define UTHASH_VERSION 2.3.0
+
+#include /* memcmp, memset, strlen */
+#include /* ptrdiff_t */
+#include /* exit */
+
+#if defined(HASH_NO_STDINT) && HASH_NO_STDINT
+/* The user doesn't have , and must figure out their own way
+ to provide definitions for uint8_t and uint32_t. */
+#else
+#include /* uint8_t, uint32_t */
+#endif
+
+/* These macros use decltype or the earlier __typeof GNU extension.
+ As decltype is only available in newer compilers (VS2010 or gcc 4.3+
+ when compiling c++ source) this code uses whatever method is needed
+ or, for VS2008 where neither is available, uses casting workarounds. */
+#if !defined(DECLTYPE) && !defined(NO_DECLTYPE)
+#if defined(_MSC_VER) /* MS compiler */
+#if _MSC_VER >= 1600 && defined(__cplusplus) /* VS2010 or newer in C++ mode */
+#define DECLTYPE(x) (decltype(x))
+#else /* VS2008 or older (or VS2010 in C mode) */
+#define NO_DECLTYPE
+#endif
+#elif defined(__MCST__) /* Elbrus C Compiler */
+#define DECLTYPE(x) (__typeof(x))
+#elif defined(__BORLANDC__) || defined(__ICCARM__) || defined(__LCC__) || defined(__WATCOMC__)
+#define NO_DECLTYPE
+#else /* GNU, Sun and other compilers */
+#define DECLTYPE(x) (__typeof(x))
+#endif
+#endif
+
+#ifdef NO_DECLTYPE
+#define DECLTYPE(x)
+#define DECLTYPE_ASSIGN(dst,src) \
+do { \
+ char **_da_dst = (char**)(&(dst)); \
+ *_da_dst = (char*)(src); \
+} while (0)
+#else
+#define DECLTYPE_ASSIGN(dst,src) \
+do { \
+ (dst) = DECLTYPE(dst)(src); \
+} while (0)
+#endif
+
+#ifndef uthash_malloc
+#define uthash_malloc(sz) malloc(sz) /* malloc fcn */
+#endif
+#ifndef uthash_free
+#define uthash_free(ptr,sz) free(ptr) /* free fcn */
+#endif
+#ifndef uthash_bzero
+#define uthash_bzero(a,n) memset(a,'\0',n)
+#endif
+#ifndef uthash_strlen
+#define uthash_strlen(s) strlen(s)
+#endif
+
+#ifndef HASH_FUNCTION
+#define HASH_FUNCTION(keyptr,keylen,hashv) HASH_JEN(keyptr, keylen, hashv)
+#endif
+
+#ifndef HASH_KEYCMP
+#define HASH_KEYCMP(a,b,n) memcmp(a,b,n)
+#endif
+
+#ifndef uthash_noexpand_fyi
+#define uthash_noexpand_fyi(tbl) /* can be defined to log noexpand */
+#endif
+#ifndef uthash_expand_fyi
+#define uthash_expand_fyi(tbl) /* can be defined to log expands */
+#endif
+
+#ifndef HASH_NONFATAL_OOM
+#define HASH_NONFATAL_OOM 0
+#endif
+
+#if HASH_NONFATAL_OOM
+/* malloc failures can be recovered from */
+
+#ifndef uthash_nonfatal_oom
+#define uthash_nonfatal_oom(obj) do {} while (0) /* non-fatal OOM error */
+#endif
+
+#define HASH_RECORD_OOM(oomed) do { (oomed) = 1; } while (0)
+#define IF_HASH_NONFATAL_OOM(x) x
+
+#else
+/* malloc failures result in lost memory, hash tables are unusable */
+
+#ifndef uthash_fatal
+#define uthash_fatal(msg) exit(-1) /* fatal OOM error */
+#endif
+
+#define HASH_RECORD_OOM(oomed) uthash_fatal("out of memory")
+#define IF_HASH_NONFATAL_OOM(x)
+
+#endif
+
+/* initial number of buckets */
+#define HASH_INITIAL_NUM_BUCKETS 32U /* initial number of buckets */
+#define HASH_INITIAL_NUM_BUCKETS_LOG2 5U /* lg2 of initial number of buckets */
+#define HASH_BKT_CAPACITY_THRESH 10U /* expand when bucket count reaches */
+
+/* calculate the element whose hash handle address is hhp */
+#define ELMT_FROM_HH(tbl,hhp) ((void*)(((char*)(hhp)) - ((tbl)->hho)))
+/* calculate the hash handle from element address elp */
+#define HH_FROM_ELMT(tbl,elp) ((UT_hash_handle*)(void*)(((char*)(elp)) + ((tbl)->hho)))
+
+#define HASH_ROLLBACK_BKT(hh, head, itemptrhh) \
+do { \
+ struct UT_hash_handle *_hd_hh_item = (itemptrhh); \
+ unsigned _hd_bkt; \
+ HASH_TO_BKT(_hd_hh_item->hashv, (head)->hh.tbl->num_buckets, _hd_bkt); \
+ (head)->hh.tbl->buckets[_hd_bkt].count++; \
+ _hd_hh_item->hh_next = NULL; \
+ _hd_hh_item->hh_prev = NULL; \
+} while (0)
+
+#define HASH_VALUE(keyptr,keylen,hashv) \
+do { \
+ HASH_FUNCTION(keyptr, keylen, hashv); \
+} while (0)
+
+#define HASH_FIND_BYHASHVALUE(hh,head,keyptr,keylen,hashval,out) \
+do { \
+ (out) = NULL; \
+ if (head) { \
+ unsigned _hf_bkt; \
+ HASH_TO_BKT(hashval, (head)->hh.tbl->num_buckets, _hf_bkt); \
+ if (HASH_BLOOM_TEST((head)->hh.tbl, hashval)) { \
+ HASH_FIND_IN_BKT((head)->hh.tbl, hh, (head)->hh.tbl->buckets[ _hf_bkt ], keyptr, keylen, hashval, out); \
+ } \
+ } \
+} while (0)
+
+#define HASH_FIND(hh,head,keyptr,keylen,out) \
+do { \
+ (out) = NULL; \
+ if (head) { \
+ unsigned _hf_hashv; \
+ HASH_VALUE(keyptr, keylen, _hf_hashv); \
+ HASH_FIND_BYHASHVALUE(hh, head, keyptr, keylen, _hf_hashv, out); \
+ } \
+} while (0)
+
+#ifdef HASH_BLOOM
+#define HASH_BLOOM_BITLEN (1UL << HASH_BLOOM)
+#define HASH_BLOOM_BYTELEN (HASH_BLOOM_BITLEN/8UL) + (((HASH_BLOOM_BITLEN%8UL)!=0UL) ? 1UL : 0UL)
+#define HASH_BLOOM_MAKE(tbl,oomed) \
+do { \
+ (tbl)->bloom_nbits = HASH_BLOOM; \
+ (tbl)->bloom_bv = (uint8_t*)uthash_malloc(HASH_BLOOM_BYTELEN); \
+ if (!(tbl)->bloom_bv) { \
+ HASH_RECORD_OOM(oomed); \
+ } else { \
+ uthash_bzero((tbl)->bloom_bv, HASH_BLOOM_BYTELEN); \
+ (tbl)->bloom_sig = HASH_BLOOM_SIGNATURE; \
+ } \
+} while (0)
+
+#define HASH_BLOOM_FREE(tbl) \
+do { \
+ uthash_free((tbl)->bloom_bv, HASH_BLOOM_BYTELEN); \
+} while (0)
+
+#define HASH_BLOOM_BITSET(bv,idx) (bv[(idx)/8U] |= (1U << ((idx)%8U)))
+#define HASH_BLOOM_BITTEST(bv,idx) ((bv[(idx)/8U] & (1U << ((idx)%8U))) != 0)
+
+#define HASH_BLOOM_ADD(tbl,hashv) \
+ HASH_BLOOM_BITSET((tbl)->bloom_bv, ((hashv) & (uint32_t)((1UL << (tbl)->bloom_nbits) - 1U)))
+
+#define HASH_BLOOM_TEST(tbl,hashv) \
+ HASH_BLOOM_BITTEST((tbl)->bloom_bv, ((hashv) & (uint32_t)((1UL << (tbl)->bloom_nbits) - 1U)))
+
+#else
+#define HASH_BLOOM_MAKE(tbl,oomed)
+#define HASH_BLOOM_FREE(tbl)
+#define HASH_BLOOM_ADD(tbl,hashv)
+#define HASH_BLOOM_TEST(tbl,hashv) 1
+#define HASH_BLOOM_BYTELEN 0U
+#endif
+
+#define HASH_MAKE_TABLE(hh,head,oomed) \
+do { \
+ (head)->hh.tbl = (UT_hash_table*)uthash_malloc(sizeof(UT_hash_table)); \
+ if (!(head)->hh.tbl) { \
+ HASH_RECORD_OOM(oomed); \
+ } else { \
+ uthash_bzero((head)->hh.tbl, sizeof(UT_hash_table)); \
+ (head)->hh.tbl->tail = &((head)->hh); \
+ (head)->hh.tbl->num_buckets = HASH_INITIAL_NUM_BUCKETS; \
+ (head)->hh.tbl->log2_num_buckets = HASH_INITIAL_NUM_BUCKETS_LOG2; \
+ (head)->hh.tbl->hho = (char*)(&(head)->hh) - (char*)(head); \
+ (head)->hh.tbl->buckets = (UT_hash_bucket*)uthash_malloc( \
+ HASH_INITIAL_NUM_BUCKETS * sizeof(struct UT_hash_bucket)); \
+ (head)->hh.tbl->signature = HASH_SIGNATURE; \
+ if (!(head)->hh.tbl->buckets) { \
+ HASH_RECORD_OOM(oomed); \
+ uthash_free((head)->hh.tbl, sizeof(UT_hash_table)); \
+ } else { \
+ uthash_bzero((head)->hh.tbl->buckets, \
+ HASH_INITIAL_NUM_BUCKETS * sizeof(struct UT_hash_bucket)); \
+ HASH_BLOOM_MAKE((head)->hh.tbl, oomed); \
+ IF_HASH_NONFATAL_OOM( \
+ if (oomed) { \
+ uthash_free((head)->hh.tbl->buckets, \
+ HASH_INITIAL_NUM_BUCKETS*sizeof(struct UT_hash_bucket)); \
+ uthash_free((head)->hh.tbl, sizeof(UT_hash_table)); \
+ } \
+ ) \
+ } \
+ } \
+} while (0)
+
+#define HASH_REPLACE_BYHASHVALUE_INORDER(hh,head,fieldname,keylen_in,hashval,add,replaced,cmpfcn) \
+do { \
+ (replaced) = NULL; \
+ HASH_FIND_BYHASHVALUE(hh, head, &((add)->fieldname), keylen_in, hashval, replaced); \
+ if (replaced) { \
+ HASH_DELETE(hh, head, replaced); \
+ } \
+ HASH_ADD_KEYPTR_BYHASHVALUE_INORDER(hh, head, &((add)->fieldname), keylen_in, hashval, add, cmpfcn); \
+} while (0)
+
+#define HASH_REPLACE_BYHASHVALUE(hh,head,fieldname,keylen_in,hashval,add,replaced) \
+do { \
+ (replaced) = NULL; \
+ HASH_FIND_BYHASHVALUE(hh, head, &((add)->fieldname), keylen_in, hashval, replaced); \
+ if (replaced) { \
+ HASH_DELETE(hh, head, replaced); \
+ } \
+ HASH_ADD_KEYPTR_BYHASHVALUE(hh, head, &((add)->fieldname), keylen_in, hashval, add); \
+} while (0)
+
+#define HASH_REPLACE(hh,head,fieldname,keylen_in,add,replaced) \
+do { \
+ unsigned _hr_hashv; \
+ HASH_VALUE(&((add)->fieldname), keylen_in, _hr_hashv); \
+ HASH_REPLACE_BYHASHVALUE(hh, head, fieldname, keylen_in, _hr_hashv, add, replaced); \
+} while (0)
+
+#define HASH_REPLACE_INORDER(hh,head,fieldname,keylen_in,add,replaced,cmpfcn) \
+do { \
+ unsigned _hr_hashv; \
+ HASH_VALUE(&((add)->fieldname), keylen_in, _hr_hashv); \
+ HASH_REPLACE_BYHASHVALUE_INORDER(hh, head, fieldname, keylen_in, _hr_hashv, add, replaced, cmpfcn); \
+} while (0)
+
+#define HASH_APPEND_LIST(hh, head, add) \
+do { \
+ (add)->hh.next = NULL; \
+ (add)->hh.prev = ELMT_FROM_HH((head)->hh.tbl, (head)->hh.tbl->tail); \
+ (head)->hh.tbl->tail->next = (add); \
+ (head)->hh.tbl->tail = &((add)->hh); \
+} while (0)
+
+#define HASH_AKBI_INNER_LOOP(hh,head,add,cmpfcn) \
+do { \
+ do { \
+ if (cmpfcn(DECLTYPE(head)(_hs_iter), add) > 0) { \
+ break; \
+ } \
+ } while ((_hs_iter = HH_FROM_ELMT((head)->hh.tbl, _hs_iter)->next)); \
+} while (0)
+
+#ifdef NO_DECLTYPE
+#undef HASH_AKBI_INNER_LOOP
+#define HASH_AKBI_INNER_LOOP(hh,head,add,cmpfcn) \
+do { \
+ char *_hs_saved_head = (char*)(head); \
+ do { \
+ DECLTYPE_ASSIGN(head, _hs_iter); \
+ if (cmpfcn(head, add) > 0) { \
+ DECLTYPE_ASSIGN(head, _hs_saved_head); \
+ break; \
+ } \
+ DECLTYPE_ASSIGN(head, _hs_saved_head); \
+ } while ((_hs_iter = HH_FROM_ELMT((head)->hh.tbl, _hs_iter)->next)); \
+} while (0)
+#endif
+
+#if HASH_NONFATAL_OOM
+
+#define HASH_ADD_TO_TABLE(hh,head,keyptr,keylen_in,hashval,add,oomed) \
+do { \
+ if (!(oomed)) { \
+ unsigned _ha_bkt; \
+ (head)->hh.tbl->num_items++; \
+ HASH_TO_BKT(hashval, (head)->hh.tbl->num_buckets, _ha_bkt); \
+ HASH_ADD_TO_BKT((head)->hh.tbl->buckets[_ha_bkt], hh, &(add)->hh, oomed); \
+ if (oomed) { \
+ HASH_ROLLBACK_BKT(hh, head, &(add)->hh); \
+ HASH_DELETE_HH(hh, head, &(add)->hh); \
+ (add)->hh.tbl = NULL; \
+ uthash_nonfatal_oom(add); \
+ } else { \
+ HASH_BLOOM_ADD((head)->hh.tbl, hashval); \
+ HASH_EMIT_KEY(hh, head, keyptr, keylen_in); \
+ } \
+ } else { \
+ (add)->hh.tbl = NULL; \
+ uthash_nonfatal_oom(add); \
+ } \
+} while (0)
+
+#else
+
+#define HASH_ADD_TO_TABLE(hh,head,keyptr,keylen_in,hashval,add,oomed) \
+do { \
+ unsigned _ha_bkt; \
+ (head)->hh.tbl->num_items++; \
+ HASH_TO_BKT(hashval, (head)->hh.tbl->num_buckets, _ha_bkt); \
+ HASH_ADD_TO_BKT((head)->hh.tbl->buckets[_ha_bkt], hh, &(add)->hh, oomed); \
+ HASH_BLOOM_ADD((head)->hh.tbl, hashval); \
+ HASH_EMIT_KEY(hh, head, keyptr, keylen_in); \
+} while (0)
+
+#endif
+
+
+#define HASH_ADD_KEYPTR_BYHASHVALUE_INORDER(hh,head,keyptr,keylen_in,hashval,add,cmpfcn) \
+do { \
+ IF_HASH_NONFATAL_OOM( int _ha_oomed = 0; ) \
+ (add)->hh.hashv = (hashval); \
+ (add)->hh.key = (char*) (keyptr); \
+ (add)->hh.keylen = (unsigned) (keylen_in); \
+ if (!(head)) { \
+ (add)->hh.next = NULL; \
+ (add)->hh.prev = NULL; \
+ HASH_MAKE_TABLE(hh, add, _ha_oomed); \
+ IF_HASH_NONFATAL_OOM( if (!_ha_oomed) { ) \
+ (head) = (add); \
+ IF_HASH_NONFATAL_OOM( } ) \
+ } else { \
+ void *_hs_iter = (head); \
+ (add)->hh.tbl = (head)->hh.tbl; \
+ HASH_AKBI_INNER_LOOP(hh, head, add, cmpfcn); \
+ if (_hs_iter) { \
+ (add)->hh.next = _hs_iter; \
+ if (((add)->hh.prev = HH_FROM_ELMT((head)->hh.tbl, _hs_iter)->prev)) { \
+ HH_FROM_ELMT((head)->hh.tbl, (add)->hh.prev)->next = (add); \
+ } else { \
+ (head) = (add); \
+ } \
+ HH_FROM_ELMT((head)->hh.tbl, _hs_iter)->prev = (add); \
+ } else { \
+ HASH_APPEND_LIST(hh, head, add); \
+ } \
+ } \
+ HASH_ADD_TO_TABLE(hh, head, keyptr, keylen_in, hashval, add, _ha_oomed); \
+ HASH_FSCK(hh, head, "HASH_ADD_KEYPTR_BYHASHVALUE_INORDER"); \
+} while (0)
+
+#define HASH_ADD_KEYPTR_INORDER(hh,head,keyptr,keylen_in,add,cmpfcn) \
+do { \
+ unsigned _hs_hashv; \
+ HASH_VALUE(keyptr, keylen_in, _hs_hashv); \
+ HASH_ADD_KEYPTR_BYHASHVALUE_INORDER(hh, head, keyptr, keylen_in, _hs_hashv, add, cmpfcn); \
+} while (0)
+
+#define HASH_ADD_BYHASHVALUE_INORDER(hh,head,fieldname,keylen_in,hashval,add,cmpfcn) \
+ HASH_ADD_KEYPTR_BYHASHVALUE_INORDER(hh, head, &((add)->fieldname), keylen_in, hashval, add, cmpfcn)
+
+#define HASH_ADD_INORDER(hh,head,fieldname,keylen_in,add,cmpfcn) \
+ HASH_ADD_KEYPTR_INORDER(hh, head, &((add)->fieldname), keylen_in, add, cmpfcn)
+
+#define HASH_ADD_KEYPTR_BYHASHVALUE(hh,head,keyptr,keylen_in,hashval,add) \
+do { \
+ IF_HASH_NONFATAL_OOM( int _ha_oomed = 0; ) \
+ (add)->hh.hashv = (hashval); \
+ (add)->hh.key = (const void*) (keyptr); \
+ (add)->hh.keylen = (unsigned) (keylen_in); \
+ if (!(head)) { \
+ (add)->hh.next = NULL; \
+ (add)->hh.prev = NULL; \
+ HASH_MAKE_TABLE(hh, add, _ha_oomed); \
+ IF_HASH_NONFATAL_OOM( if (!_ha_oomed) { ) \
+ (head) = (add); \
+ IF_HASH_NONFATAL_OOM( } ) \
+ } else { \
+ (add)->hh.tbl = (head)->hh.tbl; \
+ HASH_APPEND_LIST(hh, head, add); \
+ } \
+ HASH_ADD_TO_TABLE(hh, head, keyptr, keylen_in, hashval, add, _ha_oomed); \
+ HASH_FSCK(hh, head, "HASH_ADD_KEYPTR_BYHASHVALUE"); \
+} while (0)
+
+#define HASH_ADD_KEYPTR(hh,head,keyptr,keylen_in,add) \
+do { \
+ unsigned _ha_hashv; \
+ HASH_VALUE(keyptr, keylen_in, _ha_hashv); \
+ HASH_ADD_KEYPTR_BYHASHVALUE(hh, head, keyptr, keylen_in, _ha_hashv, add); \
+} while (0)
+
+#define HASH_ADD_BYHASHVALUE(hh,head,fieldname,keylen_in,hashval,add) \
+ HASH_ADD_KEYPTR_BYHASHVALUE(hh, head, &((add)->fieldname), keylen_in, hashval, add)
+
+#define HASH_ADD(hh,head,fieldname,keylen_in,add) \
+ HASH_ADD_KEYPTR(hh, head, &((add)->fieldname), keylen_in, add)
+
+#define HASH_TO_BKT(hashv,num_bkts,bkt) \
+do { \
+ bkt = ((hashv) & ((num_bkts) - 1U)); \
+} while (0)
+
+/* delete "delptr" from the hash table.
+ * "the usual" patch-up process for the app-order doubly-linked-list.
+ * The use of _hd_hh_del below deserves special explanation.
+ * These used to be expressed using (delptr) but that led to a bug
+ * if someone used the same symbol for the head and deletee, like
+ * HASH_DELETE(hh,users,users);
+ * We want that to work, but by changing the head (users) below
+ * we were forfeiting our ability to further refer to the deletee (users)
+ * in the patch-up process. Solution: use scratch space to
+ * copy the deletee pointer, then the latter references are via that
+ * scratch pointer rather than through the repointed (users) symbol.
+ */
+#define HASH_DELETE(hh,head,delptr) \
+ HASH_DELETE_HH(hh, head, &(delptr)->hh)
+
+#define HASH_DELETE_HH(hh,head,delptrhh) \
+do { \
+ const struct UT_hash_handle *_hd_hh_del = (delptrhh); \
+ if ((_hd_hh_del->prev == NULL) && (_hd_hh_del->next == NULL)) { \
+ HASH_BLOOM_FREE((head)->hh.tbl); \
+ uthash_free((head)->hh.tbl->buckets, \
+ (head)->hh.tbl->num_buckets * sizeof(struct UT_hash_bucket)); \
+ uthash_free((head)->hh.tbl, sizeof(UT_hash_table)); \
+ (head) = NULL; \
+ } else { \
+ unsigned _hd_bkt; \
+ if (_hd_hh_del == (head)->hh.tbl->tail) { \
+ (head)->hh.tbl->tail = HH_FROM_ELMT((head)->hh.tbl, _hd_hh_del->prev); \
+ } \
+ if (_hd_hh_del->prev != NULL) { \
+ HH_FROM_ELMT((head)->hh.tbl, _hd_hh_del->prev)->next = _hd_hh_del->next; \
+ } else { \
+ DECLTYPE_ASSIGN(head, _hd_hh_del->next); \
+ } \
+ if (_hd_hh_del->next != NULL) { \
+ HH_FROM_ELMT((head)->hh.tbl, _hd_hh_del->next)->prev = _hd_hh_del->prev; \
+ } \
+ HASH_TO_BKT(_hd_hh_del->hashv, (head)->hh.tbl->num_buckets, _hd_bkt); \
+ HASH_DEL_IN_BKT((head)->hh.tbl->buckets[_hd_bkt], _hd_hh_del); \
+ (head)->hh.tbl->num_items--; \
+ } \
+ HASH_FSCK(hh, head, "HASH_DELETE_HH"); \
+} while (0)
+
+/* convenience forms of HASH_FIND/HASH_ADD/HASH_DEL */
+#define HASH_FIND_STR(head,findstr,out) \
+do { \
+ unsigned _uthash_hfstr_keylen = (unsigned)uthash_strlen(findstr); \
+ HASH_FIND(hh, head, findstr, _uthash_hfstr_keylen, out); \
+} while (0)
+#define HASH_ADD_STR(head,strfield,add) \
+do { \
+ unsigned _uthash_hastr_keylen = (unsigned)uthash_strlen((add)->strfield); \
+ HASH_ADD(hh, head, strfield[0], _uthash_hastr_keylen, add); \
+} while (0)
+#define HASH_REPLACE_STR(head,strfield,add,replaced) \
+do { \
+ unsigned _uthash_hrstr_keylen = (unsigned)uthash_strlen((add)->strfield); \
+ HASH_REPLACE(hh, head, strfield[0], _uthash_hrstr_keylen, add, replaced); \
+} while (0)
+#define HASH_FIND_INT(head,findint,out) \
+ HASH_FIND(hh,head,findint,sizeof(int),out)
+#define HASH_ADD_INT(head,intfield,add) \
+ HASH_ADD(hh,head,intfield,sizeof(int),add)
+#define HASH_REPLACE_INT(head,intfield,add,replaced) \
+ HASH_REPLACE(hh,head,intfield,sizeof(int),add,replaced)
+#define HASH_FIND_PTR(head,findptr,out) \
+ HASH_FIND(hh,head,findptr,sizeof(void *),out)
+#define HASH_ADD_PTR(head,ptrfield,add) \
+ HASH_ADD(hh,head,ptrfield,sizeof(void *),add)
+#define HASH_REPLACE_PTR(head,ptrfield,add,replaced) \
+ HASH_REPLACE(hh,head,ptrfield,sizeof(void *),add,replaced)
+#define HASH_DEL(head,delptr) \
+ HASH_DELETE(hh,head,delptr)
+
+/* HASH_FSCK checks hash integrity on every add/delete when HASH_DEBUG is defined.
+ * This is for uthash developer only; it compiles away if HASH_DEBUG isn't defined.
+ */
+#ifdef HASH_DEBUG
+#include /* fprintf, stderr */
+#define HASH_OOPS(...) do { fprintf(stderr, __VA_ARGS__); exit(-1); } while (0)
+#define HASH_FSCK(hh,head,where) \
+do { \
+ struct UT_hash_handle *_thh; \
+ if (head) { \
+ unsigned _bkt_i; \
+ unsigned _count = 0; \
+ char *_prev; \
+ for (_bkt_i = 0; _bkt_i < (head)->hh.tbl->num_buckets; ++_bkt_i) { \
+ unsigned _bkt_count = 0; \
+ _thh = (head)->hh.tbl->buckets[_bkt_i].hh_head; \
+ _prev = NULL; \
+ while (_thh) { \
+ if (_prev != (char*)(_thh->hh_prev)) { \
+ HASH_OOPS("%s: invalid hh_prev %p, actual %p\n", \
+ (where), (void*)_thh->hh_prev, (void*)_prev); \
+ } \
+ _bkt_count++; \
+ _prev = (char*)(_thh); \
+ _thh = _thh->hh_next; \
+ } \
+ _count += _bkt_count; \
+ if ((head)->hh.tbl->buckets[_bkt_i].count != _bkt_count) { \
+ HASH_OOPS("%s: invalid bucket count %u, actual %u\n", \
+ (where), (head)->hh.tbl->buckets[_bkt_i].count, _bkt_count); \
+ } \
+ } \
+ if (_count != (head)->hh.tbl->num_items) { \
+ HASH_OOPS("%s: invalid hh item count %u, actual %u\n", \
+ (where), (head)->hh.tbl->num_items, _count); \
+ } \
+ _count = 0; \
+ _prev = NULL; \
+ _thh = &(head)->hh; \
+ while (_thh) { \
+ _count++; \
+ if (_prev != (char*)_thh->prev) { \
+ HASH_OOPS("%s: invalid prev %p, actual %p\n", \
+ (where), (void*)_thh->prev, (void*)_prev); \
+ } \
+ _prev = (char*)ELMT_FROM_HH((head)->hh.tbl, _thh); \
+ _thh = (_thh->next ? HH_FROM_ELMT((head)->hh.tbl, _thh->next) : NULL); \
+ } \
+ if (_count != (head)->hh.tbl->num_items) { \
+ HASH_OOPS("%s: invalid app item count %u, actual %u\n", \
+ (where), (head)->hh.tbl->num_items, _count); \
+ } \
+ } \
+} while (0)
+#else
+#define HASH_FSCK(hh,head,where)
+#endif
+
+/* When compiled with -DHASH_EMIT_KEYS, length-prefixed keys are emitted to
+ * the descriptor to which this macro is defined for tuning the hash function.
+ * The app can #include to get the prototype for write(2). */
+#ifdef HASH_EMIT_KEYS
+#define HASH_EMIT_KEY(hh,head,keyptr,fieldlen) \
+do { \
+ unsigned _klen = fieldlen; \
+ write(HASH_EMIT_KEYS, &_klen, sizeof(_klen)); \
+ write(HASH_EMIT_KEYS, keyptr, (unsigned long)fieldlen); \
+} while (0)
+#else
+#define HASH_EMIT_KEY(hh,head,keyptr,fieldlen)
+#endif
+
+/* The Bernstein hash function, used in Perl prior to v5.6. Note (x<<5+x)=x*33. */
+#define HASH_BER(key,keylen,hashv) \
+do { \
+ unsigned _hb_keylen = (unsigned)keylen; \
+ const unsigned char *_hb_key = (const unsigned char*)(key); \
+ (hashv) = 0; \
+ while (_hb_keylen-- != 0U) { \
+ (hashv) = (((hashv) << 5) + (hashv)) + *_hb_key++; \
+ } \
+} while (0)
+
+
+/* SAX/FNV/OAT/JEN hash functions are macro variants of those listed at
+ * http://eternallyconfuzzled.com/tuts/algorithms/jsw_tut_hashing.aspx
+ * (archive link: https://archive.is/Ivcan )
+ */
+#define HASH_SAX(key,keylen,hashv) \
+do { \
+ unsigned _sx_i; \
+ const unsigned char *_hs_key = (const unsigned char*)(key); \
+ hashv = 0; \
+ for (_sx_i=0; _sx_i < keylen; _sx_i++) { \
+ hashv ^= (hashv << 5) + (hashv >> 2) + _hs_key[_sx_i]; \
+ } \
+} while (0)
+/* FNV-1a variation */
+#define HASH_FNV(key,keylen,hashv) \
+do { \
+ unsigned _fn_i; \
+ const unsigned char *_hf_key = (const unsigned char*)(key); \
+ (hashv) = 2166136261U; \
+ for (_fn_i=0; _fn_i < keylen; _fn_i++) { \
+ hashv = hashv ^ _hf_key[_fn_i]; \
+ hashv = hashv * 16777619U; \
+ } \
+} while (0)
+
+#define HASH_OAT(key,keylen,hashv) \
+do { \
+ unsigned _ho_i; \
+ const unsigned char *_ho_key=(const unsigned char*)(key); \
+ hashv = 0; \
+ for(_ho_i=0; _ho_i < keylen; _ho_i++) { \
+ hashv += _ho_key[_ho_i]; \
+ hashv += (hashv << 10); \
+ hashv ^= (hashv >> 6); \
+ } \
+ hashv += (hashv << 3); \
+ hashv ^= (hashv >> 11); \
+ hashv += (hashv << 15); \
+} while (0)
+
+#define HASH_JEN_MIX(a,b,c) \
+do { \
+ a -= b; a -= c; a ^= ( c >> 13 ); \
+ b -= c; b -= a; b ^= ( a << 8 ); \
+ c -= a; c -= b; c ^= ( b >> 13 ); \
+ a -= b; a -= c; a ^= ( c >> 12 ); \
+ b -= c; b -= a; b ^= ( a << 16 ); \
+ c -= a; c -= b; c ^= ( b >> 5 ); \
+ a -= b; a -= c; a ^= ( c >> 3 ); \
+ b -= c; b -= a; b ^= ( a << 10 ); \
+ c -= a; c -= b; c ^= ( b >> 15 ); \
+} while (0)
+
+#define HASH_JEN(key,keylen,hashv) \
+do { \
+ unsigned _hj_i,_hj_j,_hj_k; \
+ unsigned const char *_hj_key=(unsigned const char*)(key); \
+ hashv = 0xfeedbeefu; \
+ _hj_i = _hj_j = 0x9e3779b9u; \
+ _hj_k = (unsigned)(keylen); \
+ while (_hj_k >= 12U) { \
+ _hj_i += (_hj_key[0] + ( (unsigned)_hj_key[1] << 8 ) \
+ + ( (unsigned)_hj_key[2] << 16 ) \
+ + ( (unsigned)_hj_key[3] << 24 ) ); \
+ _hj_j += (_hj_key[4] + ( (unsigned)_hj_key[5] << 8 ) \
+ + ( (unsigned)_hj_key[6] << 16 ) \
+ + ( (unsigned)_hj_key[7] << 24 ) ); \
+ hashv += (_hj_key[8] + ( (unsigned)_hj_key[9] << 8 ) \
+ + ( (unsigned)_hj_key[10] << 16 ) \
+ + ( (unsigned)_hj_key[11] << 24 ) ); \
+ \
+ HASH_JEN_MIX(_hj_i, _hj_j, hashv); \
+ \
+ _hj_key += 12; \
+ _hj_k -= 12U; \
+ } \
+ hashv += (unsigned)(keylen); \
+ switch ( _hj_k ) { \
+ case 11: hashv += ( (unsigned)_hj_key[10] << 24 ); /* FALLTHROUGH */ \
+ case 10: hashv += ( (unsigned)_hj_key[9] << 16 ); /* FALLTHROUGH */ \
+ case 9: hashv += ( (unsigned)_hj_key[8] << 8 ); /* FALLTHROUGH */ \
+ case 8: _hj_j += ( (unsigned)_hj_key[7] << 24 ); /* FALLTHROUGH */ \
+ case 7: _hj_j += ( (unsigned)_hj_key[6] << 16 ); /* FALLTHROUGH */ \
+ case 6: _hj_j += ( (unsigned)_hj_key[5] << 8 ); /* FALLTHROUGH */ \
+ case 5: _hj_j += _hj_key[4]; /* FALLTHROUGH */ \
+ case 4: _hj_i += ( (unsigned)_hj_key[3] << 24 ); /* FALLTHROUGH */ \
+ case 3: _hj_i += ( (unsigned)_hj_key[2] << 16 ); /* FALLTHROUGH */ \
+ case 2: _hj_i += ( (unsigned)_hj_key[1] << 8 ); /* FALLTHROUGH */ \
+ case 1: _hj_i += _hj_key[0]; /* FALLTHROUGH */ \
+ default: ; \
+ } \
+ HASH_JEN_MIX(_hj_i, _hj_j, hashv); \
+} while (0)
+
+/* The Paul Hsieh hash function */
+#undef get16bits
+#if (defined(__GNUC__) && defined(__i386__)) || defined(__WATCOMC__) \
+ || defined(_MSC_VER) || defined (__BORLANDC__) || defined (__TURBOC__)
+#define get16bits(d) (*((const uint16_t *) (d)))
+#endif
+
+#if !defined (get16bits)
+#define get16bits(d) ((((uint32_t)(((const uint8_t *)(d))[1])) << 8) \
+ +(uint32_t)(((const uint8_t *)(d))[0]) )
+#endif
+#define HASH_SFH(key,keylen,hashv) \
+do { \
+ unsigned const char *_sfh_key=(unsigned const char*)(key); \
+ uint32_t _sfh_tmp, _sfh_len = (uint32_t)keylen; \
+ \
+ unsigned _sfh_rem = _sfh_len & 3U; \
+ _sfh_len >>= 2; \
+ hashv = 0xcafebabeu; \
+ \
+ /* Main loop */ \
+ for (;_sfh_len > 0U; _sfh_len--) { \
+ hashv += get16bits (_sfh_key); \
+ _sfh_tmp = ((uint32_t)(get16bits (_sfh_key+2)) << 11) ^ hashv; \
+ hashv = (hashv << 16) ^ _sfh_tmp; \
+ _sfh_key += 2U*sizeof (uint16_t); \
+ hashv += hashv >> 11; \
+ } \
+ \
+ /* Handle end cases */ \
+ switch (_sfh_rem) { \
+ case 3: hashv += get16bits (_sfh_key); \
+ hashv ^= hashv << 16; \
+ hashv ^= (uint32_t)(_sfh_key[sizeof (uint16_t)]) << 18; \
+ hashv += hashv >> 11; \
+ break; \
+ case 2: hashv += get16bits (_sfh_key); \
+ hashv ^= hashv << 11; \
+ hashv += hashv >> 17; \
+ break; \
+ case 1: hashv += *_sfh_key; \
+ hashv ^= hashv << 10; \
+ hashv += hashv >> 1; \
+ break; \
+ default: ; \
+ } \
+ \
+ /* Force "avalanching" of final 127 bits */ \
+ hashv ^= hashv << 3; \
+ hashv += hashv >> 5; \
+ hashv ^= hashv << 4; \
+ hashv += hashv >> 17; \
+ hashv ^= hashv << 25; \
+ hashv += hashv >> 6; \
+} while (0)
+
+/* iterate over items in a known bucket to find desired item */
+#define HASH_FIND_IN_BKT(tbl,hh,head,keyptr,keylen_in,hashval,out) \
+do { \
+ if ((head).hh_head != NULL) { \
+ DECLTYPE_ASSIGN(out, ELMT_FROM_HH(tbl, (head).hh_head)); \
+ } else { \
+ (out) = NULL; \
+ } \
+ while ((out) != NULL) { \
+ if ((out)->hh.hashv == (hashval) && (out)->hh.keylen == (keylen_in)) { \
+ if (HASH_KEYCMP((out)->hh.key, keyptr, keylen_in) == 0) { \
+ break; \
+ } \
+ } \
+ if ((out)->hh.hh_next != NULL) { \
+ DECLTYPE_ASSIGN(out, ELMT_FROM_HH(tbl, (out)->hh.hh_next)); \
+ } else { \
+ (out) = NULL; \
+ } \
+ } \
+} while (0)
+
+/* add an item to a bucket */
+#define HASH_ADD_TO_BKT(head,hh,addhh,oomed) \
+do { \
+ UT_hash_bucket *_ha_head = &(head); \
+ _ha_head->count++; \
+ (addhh)->hh_next = _ha_head->hh_head; \
+ (addhh)->hh_prev = NULL; \
+ if (_ha_head->hh_head != NULL) { \
+ _ha_head->hh_head->hh_prev = (addhh); \
+ } \
+ _ha_head->hh_head = (addhh); \
+ if ((_ha_head->count >= ((_ha_head->expand_mult + 1U) * HASH_BKT_CAPACITY_THRESH)) \
+ && !(addhh)->tbl->noexpand) { \
+ HASH_EXPAND_BUCKETS(addhh,(addhh)->tbl, oomed); \
+ IF_HASH_NONFATAL_OOM( \
+ if (oomed) { \
+ HASH_DEL_IN_BKT(head,addhh); \
+ } \
+ ) \
+ } \
+} while (0)
+
+/* remove an item from a given bucket */
+#define HASH_DEL_IN_BKT(head,delhh) \
+do { \
+ UT_hash_bucket *_hd_head = &(head); \
+ _hd_head->count--; \
+ if (_hd_head->hh_head == (delhh)) { \
+ _hd_head->hh_head = (delhh)->hh_next; \
+ } \
+ if ((delhh)->hh_prev) { \
+ (delhh)->hh_prev->hh_next = (delhh)->hh_next; \
+ } \
+ if ((delhh)->hh_next) { \
+ (delhh)->hh_next->hh_prev = (delhh)->hh_prev; \
+ } \
+} while (0)
+
+/* Bucket expansion has the effect of doubling the number of buckets
+ * and redistributing the items into the new buckets. Ideally the
+ * items will distribute more or less evenly into the new buckets
+ * (the extent to which this is true is a measure of the quality of
+ * the hash function as it applies to the key domain).
+ *
+ * With the items distributed into more buckets, the chain length
+ * (item count) in each bucket is reduced. Thus by expanding buckets
+ * the hash keeps a bound on the chain length. This bounded chain
+ * length is the essence of how a hash provides constant time lookup.
+ *
+ * The calculation of tbl->ideal_chain_maxlen below deserves some
+ * explanation. First, keep in mind that we're calculating the ideal
+ * maximum chain length based on the *new* (doubled) bucket count.
+ * In fractions this is just n/b (n=number of items,b=new num buckets).
+ * Since the ideal chain length is an integer, we want to calculate
+ * ceil(n/b). We don't depend on floating point arithmetic in this
+ * hash, so to calculate ceil(n/b) with integers we could write
+ *
+ * ceil(n/b) = (n/b) + ((n%b)?1:0)
+ *
+ * and in fact a previous version of this hash did just that.
+ * But now we have improved things a bit by recognizing that b is
+ * always a power of two. We keep its base 2 log handy (call it lb),
+ * so now we can write this with a bit shift and logical AND:
+ *
+ * ceil(n/b) = (n>>lb) + ( (n & (b-1)) ? 1:0)
+ *
+ */
+#define HASH_EXPAND_BUCKETS(hh,tbl,oomed) \
+do { \
+ unsigned _he_bkt; \
+ unsigned _he_bkt_i; \
+ struct UT_hash_handle *_he_thh, *_he_hh_nxt; \
+ UT_hash_bucket *_he_new_buckets, *_he_newbkt; \
+ _he_new_buckets = (UT_hash_bucket*)uthash_malloc( \
+ sizeof(struct UT_hash_bucket) * (tbl)->num_buckets * 2U); \
+ if (!_he_new_buckets) { \
+ HASH_RECORD_OOM(oomed); \
+ } else { \
+ uthash_bzero(_he_new_buckets, \
+ sizeof(struct UT_hash_bucket) * (tbl)->num_buckets * 2U); \
+ (tbl)->ideal_chain_maxlen = \
+ ((tbl)->num_items >> ((tbl)->log2_num_buckets+1U)) + \
+ ((((tbl)->num_items & (((tbl)->num_buckets*2U)-1U)) != 0U) ? 1U : 0U); \
+ (tbl)->nonideal_items = 0; \
+ for (_he_bkt_i = 0; _he_bkt_i < (tbl)->num_buckets; _he_bkt_i++) { \
+ _he_thh = (tbl)->buckets[ _he_bkt_i ].hh_head; \
+ while (_he_thh != NULL) { \
+ _he_hh_nxt = _he_thh->hh_next; \
+ HASH_TO_BKT(_he_thh->hashv, (tbl)->num_buckets * 2U, _he_bkt); \
+ _he_newbkt = &(_he_new_buckets[_he_bkt]); \
+ if (++(_he_newbkt->count) > (tbl)->ideal_chain_maxlen) { \
+ (tbl)->nonideal_items++; \
+ if (_he_newbkt->count > _he_newbkt->expand_mult * (tbl)->ideal_chain_maxlen) { \
+ _he_newbkt->expand_mult++; \
+ } \
+ } \
+ _he_thh->hh_prev = NULL; \
+ _he_thh->hh_next = _he_newbkt->hh_head; \
+ if (_he_newbkt->hh_head != NULL) { \
+ _he_newbkt->hh_head->hh_prev = _he_thh; \
+ } \
+ _he_newbkt->hh_head = _he_thh; \
+ _he_thh = _he_hh_nxt; \
+ } \
+ } \
+ uthash_free((tbl)->buckets, (tbl)->num_buckets * sizeof(struct UT_hash_bucket)); \
+ (tbl)->num_buckets *= 2U; \
+ (tbl)->log2_num_buckets++; \
+ (tbl)->buckets = _he_new_buckets; \
+ (tbl)->ineff_expands = ((tbl)->nonideal_items > ((tbl)->num_items >> 1)) ? \
+ ((tbl)->ineff_expands+1U) : 0U; \
+ if ((tbl)->ineff_expands > 1U) { \
+ (tbl)->noexpand = 1; \
+ uthash_noexpand_fyi(tbl); \
+ } \
+ uthash_expand_fyi(tbl); \
+ } \
+} while (0)
+
+
+/* This is an adaptation of Simon Tatham's O(n log(n)) mergesort */
+/* Note that HASH_SORT assumes the hash handle name to be hh.
+ * HASH_SRT was added to allow the hash handle name to be passed in. */
+#define HASH_SORT(head,cmpfcn) HASH_SRT(hh,head,cmpfcn)
+#define HASH_SRT(hh,head,cmpfcn) \
+do { \
+ unsigned _hs_i; \
+ unsigned _hs_looping,_hs_nmerges,_hs_insize,_hs_psize,_hs_qsize; \
+ struct UT_hash_handle *_hs_p, *_hs_q, *_hs_e, *_hs_list, *_hs_tail; \
+ if (head != NULL) { \
+ _hs_insize = 1; \
+ _hs_looping = 1; \
+ _hs_list = &((head)->hh); \
+ while (_hs_looping != 0U) { \
+ _hs_p = _hs_list; \
+ _hs_list = NULL; \
+ _hs_tail = NULL; \
+ _hs_nmerges = 0; \
+ while (_hs_p != NULL) { \
+ _hs_nmerges++; \
+ _hs_q = _hs_p; \
+ _hs_psize = 0; \
+ for (_hs_i = 0; _hs_i < _hs_insize; ++_hs_i) { \
+ _hs_psize++; \
+ _hs_q = ((_hs_q->next != NULL) ? \
+ HH_FROM_ELMT((head)->hh.tbl, _hs_q->next) : NULL); \
+ if (_hs_q == NULL) { \
+ break; \
+ } \
+ } \
+ _hs_qsize = _hs_insize; \
+ while ((_hs_psize != 0U) || ((_hs_qsize != 0U) && (_hs_q != NULL))) { \
+ if (_hs_psize == 0U) { \
+ _hs_e = _hs_q; \
+ _hs_q = ((_hs_q->next != NULL) ? \
+ HH_FROM_ELMT((head)->hh.tbl, _hs_q->next) : NULL); \
+ _hs_qsize--; \
+ } else if ((_hs_qsize == 0U) || (_hs_q == NULL)) { \
+ _hs_e = _hs_p; \
+ if (_hs_p != NULL) { \
+ _hs_p = ((_hs_p->next != NULL) ? \
+ HH_FROM_ELMT((head)->hh.tbl, _hs_p->next) : NULL); \
+ } \
+ _hs_psize--; \
+ } else if ((cmpfcn( \
+ DECLTYPE(head)(ELMT_FROM_HH((head)->hh.tbl, _hs_p)), \
+ DECLTYPE(head)(ELMT_FROM_HH((head)->hh.tbl, _hs_q)) \
+ )) <= 0) { \
+ _hs_e = _hs_p; \
+ if (_hs_p != NULL) { \
+ _hs_p = ((_hs_p->next != NULL) ? \
+ HH_FROM_ELMT((head)->hh.tbl, _hs_p->next) : NULL); \
+ } \
+ _hs_psize--; \
+ } else { \
+ _hs_e = _hs_q; \
+ _hs_q = ((_hs_q->next != NULL) ? \
+ HH_FROM_ELMT((head)->hh.tbl, _hs_q->next) : NULL); \
+ _hs_qsize--; \
+ } \
+ if ( _hs_tail != NULL ) { \
+ _hs_tail->next = ((_hs_e != NULL) ? \
+ ELMT_FROM_HH((head)->hh.tbl, _hs_e) : NULL); \
+ } else { \
+ _hs_list = _hs_e; \
+ } \
+ if (_hs_e != NULL) { \
+ _hs_e->prev = ((_hs_tail != NULL) ? \
+ ELMT_FROM_HH((head)->hh.tbl, _hs_tail) : NULL); \
+ } \
+ _hs_tail = _hs_e; \
+ } \
+ _hs_p = _hs_q; \
+ } \
+ if (_hs_tail != NULL) { \
+ _hs_tail->next = NULL; \
+ } \
+ if (_hs_nmerges <= 1U) { \
+ _hs_looping = 0; \
+ (head)->hh.tbl->tail = _hs_tail; \
+ DECLTYPE_ASSIGN(head, ELMT_FROM_HH((head)->hh.tbl, _hs_list)); \
+ } \
+ _hs_insize *= 2U; \
+ } \
+ HASH_FSCK(hh, head, "HASH_SRT"); \
+ } \
+} while (0)
+
+/* This function selects items from one hash into another hash.
+ * The end result is that the selected items have dual presence
+ * in both hashes. There is no copy of the items made; rather
+ * they are added into the new hash through a secondary hash
+ * hash handle that must be present in the structure. */
+#define HASH_SELECT(hh_dst, dst, hh_src, src, cond) \
+do { \
+ unsigned _src_bkt, _dst_bkt; \
+ void *_last_elt = NULL, *_elt; \
+ UT_hash_handle *_src_hh, *_dst_hh, *_last_elt_hh=NULL; \
+ ptrdiff_t _dst_hho = ((char*)(&(dst)->hh_dst) - (char*)(dst)); \
+ if ((src) != NULL) { \
+ for (_src_bkt=0; _src_bkt < (src)->hh_src.tbl->num_buckets; _src_bkt++) { \
+ for (_src_hh = (src)->hh_src.tbl->buckets[_src_bkt].hh_head; \
+ _src_hh != NULL; \
+ _src_hh = _src_hh->hh_next) { \
+ _elt = ELMT_FROM_HH((src)->hh_src.tbl, _src_hh); \
+ if (cond(_elt)) { \
+ IF_HASH_NONFATAL_OOM( int _hs_oomed = 0; ) \
+ _dst_hh = (UT_hash_handle*)(void*)(((char*)_elt) + _dst_hho); \
+ _dst_hh->key = _src_hh->key; \
+ _dst_hh->keylen = _src_hh->keylen; \
+ _dst_hh->hashv = _src_hh->hashv; \
+ _dst_hh->prev = _last_elt; \
+ _dst_hh->next = NULL; \
+ if (_last_elt_hh != NULL) { \
+ _last_elt_hh->next = _elt; \
+ } \
+ if ((dst) == NULL) { \
+ DECLTYPE_ASSIGN(dst, _elt); \
+ HASH_MAKE_TABLE(hh_dst, dst, _hs_oomed); \
+ IF_HASH_NONFATAL_OOM( \
+ if (_hs_oomed) { \
+ uthash_nonfatal_oom(_elt); \
+ (dst) = NULL; \
+ continue; \
+ } \
+ ) \
+ } else { \
+ _dst_hh->tbl = (dst)->hh_dst.tbl; \
+ } \
+ HASH_TO_BKT(_dst_hh->hashv, _dst_hh->tbl->num_buckets, _dst_bkt); \
+ HASH_ADD_TO_BKT(_dst_hh->tbl->buckets[_dst_bkt], hh_dst, _dst_hh, _hs_oomed); \
+ (dst)->hh_dst.tbl->num_items++; \
+ IF_HASH_NONFATAL_OOM( \
+ if (_hs_oomed) { \
+ HASH_ROLLBACK_BKT(hh_dst, dst, _dst_hh); \
+ HASH_DELETE_HH(hh_dst, dst, _dst_hh); \
+ _dst_hh->tbl = NULL; \
+ uthash_nonfatal_oom(_elt); \
+ continue; \
+ } \
+ ) \
+ HASH_BLOOM_ADD(_dst_hh->tbl, _dst_hh->hashv); \
+ _last_elt = _elt; \
+ _last_elt_hh = _dst_hh; \
+ } \
+ } \
+ } \
+ } \
+ HASH_FSCK(hh_dst, dst, "HASH_SELECT"); \
+} while (0)
+
+#define HASH_CLEAR(hh,head) \
+do { \
+ if ((head) != NULL) { \
+ HASH_BLOOM_FREE((head)->hh.tbl); \
+ uthash_free((head)->hh.tbl->buckets, \
+ (head)->hh.tbl->num_buckets*sizeof(struct UT_hash_bucket)); \
+ uthash_free((head)->hh.tbl, sizeof(UT_hash_table)); \
+ (head) = NULL; \
+ } \
+} while (0)
+
+#define HASH_OVERHEAD(hh,head) \
+ (((head) != NULL) ? ( \
+ (size_t)(((head)->hh.tbl->num_items * sizeof(UT_hash_handle)) + \
+ ((head)->hh.tbl->num_buckets * sizeof(UT_hash_bucket)) + \
+ sizeof(UT_hash_table) + \
+ (HASH_BLOOM_BYTELEN))) : 0U)
+
+#ifdef NO_DECLTYPE
+#define HASH_ITER(hh,head,el,tmp) \
+for(((el)=(head)), ((*(char**)(&(tmp)))=(char*)((head!=NULL)?(head)->hh.next:NULL)); \
+ (el) != NULL; ((el)=(tmp)), ((*(char**)(&(tmp)))=(char*)((tmp!=NULL)?(tmp)->hh.next:NULL)))
+#else
+#define HASH_ITER(hh,head,el,tmp) \
+for(((el)=(head)), ((tmp)=DECLTYPE(el)((head!=NULL)?(head)->hh.next:NULL)); \
+ (el) != NULL; ((el)=(tmp)), ((tmp)=DECLTYPE(el)((tmp!=NULL)?(tmp)->hh.next:NULL)))
+#endif
+
+/* obtain a count of items in the hash */
+#define HASH_COUNT(head) HASH_CNT(hh,head)
+#define HASH_CNT(hh,head) ((head != NULL)?((head)->hh.tbl->num_items):0U)
+
+typedef struct UT_hash_bucket {
+ struct UT_hash_handle *hh_head;
+ unsigned count;
+
+ /* expand_mult is normally set to 0. In this situation, the max chain length
+ * threshold is enforced at its default value, HASH_BKT_CAPACITY_THRESH. (If
+ * the bucket's chain exceeds this length, bucket expansion is triggered).
+ * However, setting expand_mult to a non-zero value delays bucket expansion
+ * (that would be triggered by additions to this particular bucket)
+ * until its chain length reaches a *multiple* of HASH_BKT_CAPACITY_THRESH.
+ * (The multiplier is simply expand_mult+1). The whole idea of this
+ * multiplier is to reduce bucket expansions, since they are expensive, in
+ * situations where we know that a particular bucket tends to be overused.
+ * It is better to let its chain length grow to a longer yet-still-bounded
+ * value, than to do an O(n) bucket expansion too often.
+ */
+ unsigned expand_mult;
+
+} UT_hash_bucket;
+
+/* random signature used only to find hash tables in external analysis */
+#define HASH_SIGNATURE 0xa0111fe1u
+#define HASH_BLOOM_SIGNATURE 0xb12220f2u
+
+typedef struct UT_hash_table {
+ UT_hash_bucket *buckets;
+ unsigned num_buckets, log2_num_buckets;
+ unsigned num_items;
+ struct UT_hash_handle *tail; /* tail hh in app order, for fast append */
+ ptrdiff_t hho; /* hash handle offset (byte pos of hash handle in element */
+
+ /* in an ideal situation (all buckets used equally), no bucket would have
+ * more than ceil(#items/#buckets) items. that's the ideal chain length. */
+ unsigned ideal_chain_maxlen;
+
+ /* nonideal_items is the number of items in the hash whose chain position
+ * exceeds the ideal chain maxlen. these items pay the penalty for an uneven
+ * hash distribution; reaching them in a chain traversal takes >ideal steps */
+ unsigned nonideal_items;
+
+ /* ineffective expands occur when a bucket doubling was performed, but
+ * afterward, more than half the items in the hash had nonideal chain
+ * positions. If this happens on two consecutive expansions we inhibit any
+ * further expansion, as it's not helping; this happens when the hash
+ * function isn't a good fit for the key domain. When expansion is inhibited
+ * the hash will still work, albeit no longer in constant time. */
+ unsigned ineff_expands, noexpand;
+
+ uint32_t signature; /* used only to find hash tables in external analysis */
+#ifdef HASH_BLOOM
+ uint32_t bloom_sig; /* used only to test bloom exists in external analysis */
+ uint8_t *bloom_bv;
+ uint8_t bloom_nbits;
+#endif
+
+} UT_hash_table;
+
+typedef struct UT_hash_handle {
+ struct UT_hash_table *tbl;
+ void *prev; /* prev element in app order */
+ void *next; /* next element in app order */
+ struct UT_hash_handle *hh_prev; /* previous hh in bucket order */
+ struct UT_hash_handle *hh_next; /* next hh in bucket order */
+ const void *key; /* ptr to enclosing struct's key */
+ unsigned keylen; /* enclosing struct's key len */
+ unsigned hashv; /* result of hash-fcn(key) */
+} UT_hash_handle;
+
+#endif /* UTHASH_H */
diff --git a/ini/features.ini b/ini/features.ini
index 833fe76510..da1865ea05 100644
--- a/ini/features.ini
+++ b/ini/features.ini
@@ -13,7 +13,7 @@
[features]
YHCB2004 = LiquidCrystal_AIP31068=https://github.com/ellensp/LiquidCrystal_AIP31068/archive/3fc43b7.zip, red-scorp/SoftSPIB@^1.1.1
-HAS_TFT_LVGL_UI = lvgl=https://github.com/makerbase-mks/LVGL-6.1.1-MKS/archive/a3ebe98bc6.zip
+HAS_TFT_LVGL_UI = lvgl=https://github.com/staff1010/LVGL-6.1.1-MKS/archive/v6.1.2.zip
build_src_filter=+
extra_scripts=download_mks_assets.py
MARLIN_TEST_BUILD = build_src_filter=+
From 5b59424447a370473aaaa0a4f08988fc0b803ca9 Mon Sep 17 00:00:00 2001
From: Giuliano <3684609+GMagician@users.noreply.github.com>
Date: Tue, 27 May 2025 22:15:55 +0200
Subject: [PATCH 036/326] =?UTF-8?q?=F0=9F=8C=90=20Fix=20Italian=20typo,=20?=
=?UTF-8?q?etc.=20(#27890)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Followup to #27877
Co-authored-by: Scott Lahteine
---
Marlin/src/lcd/language/language_en.h | 3 +--
Marlin/src/lcd/language/language_it.h | 5 ++---
Marlin/src/lcd/language/language_tr.h | 1 -
3 files changed, 3 insertions(+), 6 deletions(-)
diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h
index a74d28b82a..90948d7865 100644
--- a/Marlin/src/lcd/language/language_en.h
+++ b/Marlin/src/lcd/language/language_en.h
@@ -364,7 +364,7 @@ namespace LanguageNarrow_en {
LSTR MSG_MOVE_N_MM = _UxGT("Move $mm");
LSTR MSG_MOVE_N_IN = _UxGT("Move $in");
LSTR MSG_MOVE_N_DEG = _UxGT("Move $") LCD_STR_DEGREE;
- LSTR MSG_LIVE_MOVE = _UxGT("Live Move");
+ LSTR MSG_LIVE_MOVE = _UxGT("Live Movement");
LSTR MSG_SPEED = _UxGT("Speed");
LSTR MSG_MESH_Z_OFFSET = _UxGT("Bed Z");
LSTR MSG_NOZZLE = _UxGT("Nozzle");
@@ -1124,7 +1124,6 @@ namespace LanguageNarrow_en {
namespace LanguageWide_en {
using namespace LanguageNarrow_en;
#if LCD_WIDTH >= 20 || HAS_DWIN_E3V2
- LSTR MSG_LIVE_MOVE = _UxGT("Live Movement");
LSTR MSG_HOST_START_PRINT = _UxGT("Start Host Print");
LSTR MSG_PRINTING_OBJECT = _UxGT("Printing Object");
LSTR MSG_CANCEL_OBJECT = _UxGT("Cancel Object");
diff --git a/Marlin/src/lcd/language/language_it.h b/Marlin/src/lcd/language/language_it.h
index dbf093c042..c0d717d0cc 100644
--- a/Marlin/src/lcd/language/language_it.h
+++ b/Marlin/src/lcd/language/language_it.h
@@ -341,7 +341,7 @@ namespace LanguageNarrow_it {
LSTR MSG_MOVE_N_MM = _UxGT("Muovi di $mm");
LSTR MSG_MOVE_N_IN = _UxGT("Muovi di $in");
LSTR MSG_MOVE_N_DEG = _UxGT("Muovi di $") LCD_STR_DEGREE;
- LSTR MSG_LIVE_MOVE = _UxGT("Modalità live");
+ LSTR MSG_LIVE_MOVE = _UxGT("Movimento live");
LSTR MSG_SPEED = _UxGT("Velocità");
LSTR MSG_MESH_Z_OFFSET = _UxGT("Piatto Z");
LSTR MSG_NOZZLE = _UxGT("Ugello");
@@ -606,7 +606,7 @@ namespace LanguageNarrow_it {
LSTR MSG_ATTACH_SD = _UxGT("Collega scheda SD");
LSTR MSG_ATTACH_USB = _UxGT("Collega unità USB");
LSTR MSG_RELEASE_MEDIA = _UxGT("Rilascia ") MEDIA_TYPE_IT;
- LSTR MSG_RELEASE_SD = _UxGT("Rilascia sceda SD");
+ LSTR MSG_RELEASE_SD = _UxGT("Rilascia scheda SD");
LSTR MSG_RELEASE_USB = _UxGT("Rilascia unità USB");
LSTR MSG_CHANGE_MEDIA = _UxGT("Selez.") MEDIA_TYPE_IT;
LSTR MSG_CHANGE_SD = _UxGT("Selez. scheda SD");
@@ -1007,7 +1007,6 @@ namespace LanguageNarrow_it {
namespace LanguageWide_it {
using namespace LanguageNarrow_it;
#if LCD_WIDTH >= 20 || HAS_DWIN_E3V2
- LSTR MSG_LIVE_MOVE = _UxGT("Movimento live");
LSTR MSG_HOST_START_PRINT = _UxGT("Avvio stampa host");
LSTR MSG_PRINTING_OBJECT = _UxGT("Stampa oggetto");
LSTR MSG_CANCEL_OBJECT = _UxGT("Cancella oggetto");
diff --git a/Marlin/src/lcd/language/language_tr.h b/Marlin/src/lcd/language/language_tr.h
index 9e4f261271..77cb7bf9b8 100644
--- a/Marlin/src/lcd/language/language_tr.h
+++ b/Marlin/src/lcd/language/language_tr.h
@@ -891,7 +891,6 @@ namespace LanguageNarrow_tr {
namespace LanguageWide_tr {
using namespace LanguageNarrow_tr;
#if LCD_WIDTH >= 20 || HAS_DWIN_E3V2
- LSTR MSG_LIVE_MOVE = _UxGT("Canlı Hareket");
LSTR MSG_HOST_START_PRINT = _UxGT("Host Baskıyı başlat");
LSTR MSG_PRINTING_OBJECT = _UxGT("Yazdırma Nesnesi");
LSTR MSG_CANCEL_OBJECT = _UxGT("Nesneyi İptal Et");
From 38eee768391280583bdc710630bce32a04a9be89 Mon Sep 17 00:00:00 2001
From: thinkyhead
Date: Wed, 28 May 2025 00:32:03 +0000
Subject: [PATCH 037/326] [cron] Bump distribution date (2025-05-28)
---
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 34ac9adaa3..ec6539e4fa 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 "2025-05-27"
+//#define STRING_DISTRIBUTION_DATE "2025-05-28"
/**
* The protocol for communication to the host. Protocol indicates communication
diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h
index 8d0c6361af..745e8e40a0 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 "2025-05-27"
+ #define STRING_DISTRIBUTION_DATE "2025-05-28"
#endif
/**
From fa25737a9f874999c0bb22862ad6ceeb3a1688ad Mon Sep 17 00:00:00 2001
From: Scott Lahteine
Date: Wed, 28 May 2025 14:08:07 -0500
Subject: [PATCH 038/326] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20TMC?=
=?UTF-8?q?Stepper=20=3D>=200.8.3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
ini/features.ini | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/ini/features.ini b/ini/features.ini
index da1865ea05..011163b5d9 100644
--- a/ini/features.ini
+++ b/ini/features.ini
@@ -20,7 +20,7 @@ MARLIN_TEST_BUILD = build_src_filter=+
POSTMORTEM_DEBUGGING = build_src_filter=+ +
build_flags=-funwind-tables
MKS_WIFI_MODULE = QRCode=https://github.com/makerbase-mks/QRCode/archive/261c5a696a.zip
-HAS_TRINAMIC_CONFIG = TMCStepper=https://github.com/MarlinFirmware/TMCStepper/archive/v0.8.2.zip
+HAS_TRINAMIC_CONFIG = TMCStepper=https://github.com/MarlinFirmware/TMCStepper/archive/v0.8.3.zip
build_src_filter=+ + + + +
HAS_STEPPER_CONTROL = build_src_filter=+
HAS_T(RINAMIC_CONFIG|MC_SPI) = build_src_filter=+
From a270cc36e69e162de1e698306b730ef0a5f3c911 Mon Sep 17 00:00:00 2001
From: thinkyhead
Date: Thu, 29 May 2025 00:31:57 +0000
Subject: [PATCH 039/326] [cron] Bump distribution date (2025-05-29)
---
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 ec6539e4fa..76d1da5dda 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 "2025-05-28"
+//#define STRING_DISTRIBUTION_DATE "2025-05-29"
/**
* The protocol for communication to the host. Protocol indicates communication
diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h
index 745e8e40a0..154547cb93 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 "2025-05-28"
+ #define STRING_DISTRIBUTION_DATE "2025-05-29"
#endif
/**
From 8f19e2d7d4450000ca9aaf8b4fb2822ebe86df2d Mon Sep 17 00:00:00 2001
From: Scott Lahteine
Date: Thu, 29 May 2025 13:24:40 -0500
Subject: [PATCH 040/326] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20TMC?=
=?UTF-8?q?Stepper=20=3D>=200.8.4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
ini/features.ini | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/ini/features.ini b/ini/features.ini
index 011163b5d9..6b1e684561 100644
--- a/ini/features.ini
+++ b/ini/features.ini
@@ -20,7 +20,7 @@ MARLIN_TEST_BUILD = build_src_filter=+
POSTMORTEM_DEBUGGING = build_src_filter=+ +
build_flags=-funwind-tables
MKS_WIFI_MODULE = QRCode=https://github.com/makerbase-mks/QRCode/archive/261c5a696a.zip
-HAS_TRINAMIC_CONFIG = TMCStepper=https://github.com/MarlinFirmware/TMCStepper/archive/v0.8.3.zip
+HAS_TRINAMIC_CONFIG = TMCStepper=https://github.com/MarlinFirmware/TMCStepper/archive/v0.8.4.zip
build_src_filter=+ + + + +
HAS_STEPPER_CONTROL = build_src_filter=+
HAS_T(RINAMIC_CONFIG|MC_SPI) = build_src_filter=+
From e8f2430dacbf9533f916f000f57a5dbedbb6662f Mon Sep 17 00:00:00 2001
From: thinkyhead
Date: Fri, 30 May 2025 00:32:05 +0000
Subject: [PATCH 041/326] [cron] Bump distribution date (2025-05-30)
---
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 76d1da5dda..f7598786c8 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 "2025-05-29"
+//#define STRING_DISTRIBUTION_DATE "2025-05-30"
/**
* The protocol for communication to the host. Protocol indicates communication
diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h
index 154547cb93..5f6f7fdbf0 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 "2025-05-29"
+ #define STRING_DISTRIBUTION_DATE "2025-05-30"
#endif
/**
From a6bfdf351f241955519af675f5af9dd9dd9f3a52 Mon Sep 17 00:00:00 2001
From: Vovodroid
Date: Sat, 31 May 2025 06:53:21 +0300
Subject: [PATCH 042/326] =?UTF-8?q?=E2=9C=A8=20NONLINEAR=5FEXTRUSION=5FDEF?=
=?UTF-8?q?AULT=5FON=20(#27819)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Co-authored-by: Scott Lahteine
---
Marlin/Configuration_adv.h | 3 ++
Marlin/src/gcode/feature/nonlinear/M592.cpp | 20 ++++++---
Marlin/src/lcd/language/language_en.h | 1 +
Marlin/src/lcd/menu/menu_advanced.cpp | 4 ++
Marlin/src/lcd/menu/menu_tune.cpp | 7 +++
Marlin/src/module/planner.cpp | 4 +-
Marlin/src/module/settings.cpp | 8 ++--
Marlin/src/module/stepper.cpp | 41 +++++++-----------
Marlin/src/module/stepper.h | 48 ++++++++++++++-------
buildroot/tests/STM32F103RC_btt | 2 +-
10 files changed, 83 insertions(+), 55 deletions(-)
diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h
index 7939b5cc9b..f7ab7abd94 100644
--- a/Marlin/Configuration_adv.h
+++ b/Marlin/Configuration_adv.h
@@ -2384,6 +2384,9 @@
* For better results also enable ADAPTIVE_STEP_SMOOTHING.
*/
//#define NONLINEAR_EXTRUSION
+#if ENABLED(NONLINEAR_EXTRUSION)
+ //#define NONLINEAR_EXTRUSION_DEFAULT_ON // Enable if NLE should be ON by default
+#endif
// @section leveling
diff --git a/Marlin/src/gcode/feature/nonlinear/M592.cpp b/Marlin/src/gcode/feature/nonlinear/M592.cpp
index 78c15443f8..b084e326f7 100644
--- a/Marlin/src/gcode/feature/nonlinear/M592.cpp
+++ b/Marlin/src/gcode/feature/nonlinear/M592.cpp
@@ -30,11 +30,13 @@
void GcodeSuite::M592_report(const bool forReplay/*=true*/) {
TERN_(MARLIN_SMALL_BUILD, return);
report_heading_etc(forReplay, F(STR_NONLINEAR_EXTRUSION));
- SERIAL_ECHOLNPGM(" M592 A", stepper.ne.A, " B", stepper.ne.B, " C", stepper.ne.C);
+ const nonlinear_settings_t &sns = stepper.ne.settings;
+ SERIAL_ECHOLNPGM(" M592 S", sns.enabled, " A", sns.coeff.A, " B", sns.coeff.B, " C", sns.coeff.C);
}
/**
* M592: Get or set nonlinear extrusion parameters
+ * S Enable / Disable Nonlinear Extrusion
* A Quadratic coefficient (default 0.0)
* B Linear coefficient (default 0.0)
* C Constant coefficient (default 1.0)
@@ -46,14 +48,18 @@ void GcodeSuite::M592_report(const bool forReplay/*=true*/) {
void GcodeSuite::M592() {
if (!parser.seen_any()) return M592_report();
- if (parser.seenval('A')) stepper.ne.A = parser.value_float();
- if (parser.seenval('B')) stepper.ne.B = parser.value_float();
- if (parser.seenval('C')) stepper.ne.C = parser.value_float();
+ nonlinear_t &ne = stepper.ne;
+ nonlinear_settings_t &sns = ne.settings;
+
+ if (parser.seen('S')) sns.enabled = parser.value_bool();
+ if (parser.seenval('A')) sns.coeff.A = parser.value_float();
+ if (parser.seenval('B')) sns.coeff.B = parser.value_float();
+ if (parser.seenval('C')) sns.coeff.C = parser.value_float();
#if ENABLED(SMOOTH_LIN_ADVANCE)
- stepper.ne_q30.A = _BV32(30) * (stepper.ne.A * planner.mm_per_step[E_AXIS_N(0)] * planner.mm_per_step[E_AXIS_N(0)]);
- stepper.ne_q30.B = _BV32(30) * (stepper.ne.B * planner.mm_per_step[E_AXIS_N(0)]);
- stepper.ne_q30.C = _BV32(30) * stepper.ne.C;
+ ne.q30.A = _BV32(30) * (sns.coeff.A * planner.mm_per_step[E_AXIS_N(0)] * planner.mm_per_step[E_AXIS_N(0)]);
+ ne.q30.B = _BV32(30) * (sns.coeff.B * planner.mm_per_step[E_AXIS_N(0)]);
+ ne.q30.C = _BV32(30) * sns.coeff.C;
#endif
}
diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h
index 90948d7865..be309f53d8 100644
--- a/Marlin/src/lcd/language/language_en.h
+++ b/Marlin/src/lcd/language/language_en.h
@@ -509,6 +509,7 @@ namespace LanguageNarrow_en {
LSTR MSG_ADVANCE_TAU = _UxGT("Advance Tau");
LSTR MSG_ADVANCE_K_E = _UxGT("Advance K *");
LSTR MSG_ADVANCE_TAU_E = _UxGT("Advance Tau *");
+ LSTR MSG_NLE_ON = _UxGT("NLE enabled");
LSTR MSG_CONTRAST = _UxGT("LCD Contrast");
LSTR MSG_BRIGHTNESS = _UxGT("LCD Brightness");
LSTR MSG_SCREEN_TIMEOUT = _UxGT("LCD Timeout (m)");
diff --git a/Marlin/src/lcd/menu/menu_advanced.cpp b/Marlin/src/lcd/menu/menu_advanced.cpp
index b15a21fc7b..65d7a88f0d 100644
--- a/Marlin/src/lcd/menu/menu_advanced.cpp
+++ b/Marlin/src/lcd/menu/menu_advanced.cpp
@@ -138,6 +138,10 @@ void menu_backlash();
#endif
#endif // LIN_ADVANCE
+ #if ENABLED(NONLINEAR_EXTRUSION)
+ EDIT_ITEM(bool, MSG_NLE_ON, &stepper.ne.settings.enabled);
+ #endif
+
#if DISABLED(NO_VOLUMETRICS)
EDIT_ITEM(bool, MSG_VOLUMETRIC_ENABLED, &parser.volumetric_enabled, planner.calculate_volumetric_multipliers);
diff --git a/Marlin/src/lcd/menu/menu_tune.cpp b/Marlin/src/lcd/menu/menu_tune.cpp
index 7f4696a3f1..18d52bb640 100644
--- a/Marlin/src/lcd/menu/menu_tune.cpp
+++ b/Marlin/src/lcd/menu/menu_tune.cpp
@@ -237,6 +237,13 @@ void menu_tune() {
#endif
#endif
+ //
+ // Nonlinear Extrusion state
+ //
+ #if ENABLED(NONLINEAR_EXTRUSION)
+ EDIT_ITEM(bool, MSG_NLE_ON, &stepper.ne.settings.enabled);
+ #endif
+
//
// Babystep X:
// Babystep Y:
diff --git a/Marlin/src/module/planner.cpp b/Marlin/src/module/planner.cpp
index 8678c82130..2e2b5798b7 100644
--- a/Marlin/src/module/planner.cpp
+++ b/Marlin/src/module/planner.cpp
@@ -3255,8 +3255,8 @@ void Planner::refresh_positioning() {
#if ENABLED(EDITABLE_STEPS_PER_UNIT)
LOOP_DISTINCT_AXES(i) mm_per_step[i] = 1.0f / settings.axis_steps_per_mm[i];
#if ALL(NONLINEAR_EXTRUSION, SMOOTH_LIN_ADVANCE)
- stepper.ne_q30.A = _BV32(30) * (stepper.ne.A * mm_per_step[E_AXIS_N(0)] * mm_per_step[E_AXIS_N(0)]);
- stepper.ne_q30.B = _BV32(30) * (stepper.ne.B * mm_per_step[E_AXIS_N(0)]);
+ stepper.ne.q30.A = _BV32(30) * (stepper.ne.settings.coeff.A * mm_per_step[E_AXIS_N(0)] * mm_per_step[E_AXIS_N(0)]);
+ stepper.ne.q30.B = _BV32(30) * (stepper.ne.settings.coeff.B * mm_per_step[E_AXIS_N(0)]);
#endif
#endif
set_position_mm(current_position);
diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp
index 2161be5abc..0d197b2d12 100644
--- a/Marlin/src/module/settings.cpp
+++ b/Marlin/src/module/settings.cpp
@@ -685,7 +685,7 @@ typedef struct SettingsDataStruct {
// Nonlinear Extrusion
//
#if ENABLED(NONLINEAR_EXTRUSION)
- ne_coeff_t stepper_ne; // M592 A B C
+ nonlinear_settings_t stepper_ne_settings; // M592 S A B C
#endif
//
@@ -1798,7 +1798,7 @@ void MarlinSettings::postprocess() {
// Nonlinear Extrusion
//
#if ENABLED(NONLINEAR_EXTRUSION)
- EEPROM_WRITE(stepper.ne);
+ EEPROM_WRITE(stepper.ne.settings);
#endif
//
@@ -2933,7 +2933,7 @@ void MarlinSettings::postprocess() {
// Nonlinear Extrusion
//
#if ENABLED(NONLINEAR_EXTRUSION)
- EEPROM_READ(stepper.ne);
+ EEPROM_READ(stepper.ne.settings);
#endif
//
@@ -3747,7 +3747,7 @@ void MarlinSettings::reset() {
//
// Nonlinear Extrusion
//
- TERN_(NONLINEAR_EXTRUSION, stepper.ne.reset());
+ TERN_(NONLINEAR_EXTRUSION, stepper.ne.settings.reset());
//
// Input Shaping
diff --git a/Marlin/src/module/stepper.cpp b/Marlin/src/module/stepper.cpp
index edfed3b8e2..fd3d3bd800 100644
--- a/Marlin/src/module/stepper.cpp
+++ b/Marlin/src/module/stepper.cpp
@@ -256,17 +256,7 @@ uint32_t Stepper::advance_divisor = 0,
#endif
#if ENABLED(NONLINEAR_EXTRUSION)
- ne_coeff_t Stepper::ne;
- #if NONLINEAR_EXTRUSION_Q24
- ne_q24_t Stepper::ne_q24;
- #else
- ne_q30_t Stepper::ne_q30;
- #endif
- // private:
- #if NONLINEAR_EXTRUSION_Q24
- int32_t Stepper::ne_edividend;
- uint32_t Stepper::ne_scale_q24;
- #endif
+ nonlinear_t Stepper::ne; // Initialized by settings.load
#endif
#if HAS_ZV_SHAPING
@@ -2247,11 +2237,11 @@ hal_timer_t Stepper::calc_timer_interval(uint32_t step_rate) {
#if NONLINEAR_EXTRUSION_Q24
void Stepper::calc_nonlinear_e(const uint32_t step_rate) {
- const uint32_t velocity_q24 = ne_scale_q24 * step_rate; // Scale step_rate first so all intermediate values stay in range of 8.24 fixed point math
- int32_t vd_q24 = (((((int64_t)ne_q24.A * velocity_q24) >> 24) * velocity_q24) >> 24) + (((int64_t)ne_q24.B * velocity_q24) >> 24);
+ const uint32_t velocity_q24 = ne.scale_q24 * step_rate; // Scale step_rate first so all intermediate values stay in range of 8.24 fixed point math
+ int32_t vd_q24 = ((((int64_t(ne.q24.A) * velocity_q24) >> 24) * velocity_q24) >> 24) + ((int64_t(ne.q24.B) * velocity_q24) >> 24);
NOLESS(vd_q24, 0);
- advance_dividend.e = (uint64_t(ne_q24.C + vd_q24) * ne_edividend) >> 24;
+ advance_dividend.e = (uint64_t(ne.q24.C + vd_q24) * ne.edividend) >> 24;
}
#endif
@@ -2834,18 +2824,19 @@ hal_timer_t Stepper::block_phase_isr() {
acc_step_rate = current_block->initial_rate;
#endif
+ // Calculate Nonlinear Extrusion fixed-point quotients
#if NONLINEAR_EXTRUSION_Q24
- ne_edividend = advance_dividend.e;
- const float scale = (float(ne_edividend) / advance_divisor) * planner.mm_per_step[E_AXIS_N(current_block->extruder)];
- ne_scale_q24 = _BV32(24) * scale;
- if (current_block->direction_bits.e && ANY_AXIS_MOVES(current_block)) {
- ne_q24.A = _BV32(24) * ne.A;
- ne_q24.B = _BV32(24) * ne.B;
- ne_q24.C = _BV32(24) * ne.C;
+ ne.edividend = advance_dividend.e;
+ const float scale = (float(ne.edividend) / advance_divisor) * planner.mm_per_step[E_AXIS_N(current_block->extruder)];
+ ne.scale_q24 = _BV32(24) * scale;
+ if (ne.settings.enabled && current_block->direction_bits.e && ANY_AXIS_MOVES(current_block)) {
+ ne.q24.A = _BV32(24) * ne.settings.coeff.A;
+ ne.q24.B = _BV32(24) * ne.settings.coeff.B;
+ ne.q24.C = _BV32(24) * ne.settings.coeff.C;
}
else {
- ne_q24.A = ne_q24.B = 0;
- ne_q24.C = _BV32(24);
+ ne.q24.A = ne.q24.B = 0;
+ ne.q24.C = _BV32(24);
}
#endif
@@ -2891,9 +2882,9 @@ hal_timer_t Stepper::block_phase_isr() {
#if ENABLED(NONLINEAR_EXTRUSION)
if (forward_e && ANY_AXIS_MOVES(current_block)) {
// Maximum polynomial value is just above 1, like 1.05..1.2, less than 2 anyway, so we can use 30 bits for fractional part
- int32_t vd_q30 = ne_q30.A*step_rate*step_rate + ne_q30.B*step_rate;
+ int32_t vd_q30 = ne.q30.A * sq(step_rate) + ne.q30.B * step_rate;
NOLESS(vd_q30, 0);
- step_rate = (int64_t(step_rate) * (ne_q30.C + vd_q30)) >> 30;
+ step_rate = (int64_t(step_rate) * (ne.q30.C + vd_q30)) >> 30;
}
#endif
diff --git a/Marlin/src/module/stepper.h b/Marlin/src/module/stepper.h
index 73fd28fe85..90cbedc9fc 100644
--- a/Marlin/src/module/stepper.h
+++ b/Marlin/src/module/stepper.h
@@ -283,15 +283,41 @@ constexpr ena_mask_t enable_overlap[] = {
#endif // HAS_ZV_SHAPING
+//
+// NonLinear Extrusion data
+//
#if ENABLED(NONLINEAR_EXTRUSION)
- typedef struct { float A, B, C; void reset() { A = B = 0.0f; C = 1.0f; } } ne_coeff_t;
+
#if DISABLED(SMOOTH_LIN_ADVANCE)
#define NONLINEAR_EXTRUSION_Q24 1
- typedef struct { int32_t A, B, C; } ne_q24_t;
- #else
- typedef struct { int32_t A, B, C; } ne_q30_t;
#endif
-#endif
+
+ typedef struct {
+ bool enabled;
+ struct {
+ float A, B, C;
+ void reset() { A = B = 0.0f; C = 1.0f; }
+ } coeff;
+ void reset() {
+ enabled = ENABLED(NONLINEAR_EXTRUSION_DEFAULT_ON);
+ coeff.reset();
+ }
+ } nonlinear_settings_t;
+
+ typedef struct {
+ nonlinear_settings_t settings;
+ union {
+ struct { int32_t A, B, C; } q24;
+ struct { int32_t A, B, C; } q30;
+ };
+ #if NONLINEAR_EXTRUSION_Q24
+ protected:
+ int32_t edividend;
+ uint32_t scale_q24;
+ #endif
+ } nonlinear_t;
+
+#endif // NONLINEAR_EXTRUSION
//
// Stepper class definition
@@ -347,12 +373,7 @@ class Stepper {
#endif
#if ENABLED(NONLINEAR_EXTRUSION)
- static ne_coeff_t ne;
- #if NONLINEAR_EXTRUSION_Q24
- static ne_q24_t ne_q24;
- #else
- static ne_q30_t ne_q30;
- #endif
+ static nonlinear_t ne;
#endif
#if ENABLED(ADAPTIVE_STEP_SMOOTHING_TOGGLE)
@@ -477,11 +498,6 @@ class Stepper {
#endif
#endif
- #if NONLINEAR_EXTRUSION_Q24
- static int32_t ne_edividend;
- static uint32_t ne_scale_q24;
- #endif
-
#if ENABLED(BABYSTEPPING)
static constexpr hal_timer_t BABYSTEP_NEVER = HAL_TIMER_TYPE_MAX;
static hal_timer_t nextBabystepISR;
diff --git a/buildroot/tests/STM32F103RC_btt b/buildroot/tests/STM32F103RC_btt
index 2b05d42922..97339d7750 100755
--- a/buildroot/tests/STM32F103RC_btt
+++ b/buildroot/tests/STM32F103RC_btt
@@ -15,5 +15,5 @@ opt_set MOTHERBOARD BOARD_BTT_SKR_MINI_E3_V1_0 SERIAL_PORT 1 SERIAL_PORT_2 -1 \
X_CURRENT_HOME X_CURRENT/2 Y_CURRENT_HOME Y_CURRENT/2 Z_CURRENT_HOME Y_CURRENT/2
opt_enable CR10_STOCKDISPLAY PINS_DEBUGGING Z_IDLE_HEIGHT EDITABLE_HOMING_CURRENT \
FT_MOTION FT_MOTION_MENU BIQU_MICROPROBE_V1 PROBE_ENABLE_DISABLE Z_SAFE_HOMING AUTO_BED_LEVELING_BILINEAR \
- ADAPTIVE_STEP_SMOOTHING NONLINEAR_EXTRUSION
+ ADAPTIVE_STEP_SMOOTHING LIN_ADVANCE SMOOTH_LIN_ADVANCE NONLINEAR_EXTRUSION INPUT_SHAPING_X INPUT_SHAPING_Y
exec_test $1 $2 "BigTreeTech SKR Mini E3 1.0 - TMC2209 HW Serial, FT_MOTION" "$3"
From a2452a577b38d081a79e005532b4a710213289e0 Mon Sep 17 00:00:00 2001
From: thinkyhead
Date: Sat, 31 May 2025 06:08:46 +0000
Subject: [PATCH 043/326] [cron] Bump distribution date (2025-05-31)
---
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 f7598786c8..ca7a67dba7 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 "2025-05-30"
+//#define STRING_DISTRIBUTION_DATE "2025-05-31"
/**
* The protocol for communication to the host. Protocol indicates communication
diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h
index 5f6f7fdbf0..f6c6927508 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 "2025-05-30"
+ #define STRING_DISTRIBUTION_DATE "2025-05-31"
#endif
/**
From c377237fd8a9f982d3bb54ceab98f1ec23c70925 Mon Sep 17 00:00:00 2001
From: Scott Lahteine
Date: Sat, 31 May 2025 16:05:13 -0500
Subject: [PATCH 044/326] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20Twe?=
=?UTF-8?q?ak=20G90=20/=20G91=20declaration?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
Marlin/src/gcode/gcode.cpp | 4 ++--
Marlin/src/gcode/gcode.h | 3 +++
2 files changed, 5 insertions(+), 2 deletions(-)
diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp
index 242972c24b..1fa5c55c22 100644
--- a/Marlin/src/gcode/gcode.cpp
+++ b/Marlin/src/gcode/gcode.cpp
@@ -458,8 +458,8 @@ void GcodeSuite::process_parsed_command(bool no_ok/*=false*/) {
case 80: G80(); break; // G80: Reset the current motion mode
#endif
- case 90: set_relative_mode(false); break; // G90: Absolute Mode
- case 91: set_relative_mode(true); break; // G91: Relative Mode
+ case 90: G90(); break; // G90: Absolute Mode
+ case 91: G91(); break; // G91: Relative Mode
case 92: G92(); break; // G92: Set current axis position(s)
diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h
index ee0ccb9a0f..61782d7d3d 100644
--- a/Marlin/src/gcode/gcode.h
+++ b/Marlin/src/gcode/gcode.h
@@ -632,6 +632,9 @@ private:
static void G80();
#endif
+ static void G90() { set_relative_mode(false); }
+ static void G91() { set_relative_mode(true); }
+
static void G92();
#if ENABLED(CALIBRATION_GCODE)
From b59251c388e249ec02d0a91db653dfd04e5a59f4 Mon Sep 17 00:00:00 2001
From: Scott Lahteine
Date: Sat, 31 May 2025 16:06:12 -0500
Subject: [PATCH 045/326] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20Mac?=
=?UTF-8?q?ros=20for=20larger=20sets?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
Marlin/src/core/macros.h | 34 ++++++++++++++++++++++++++++++++++
1 file changed, 34 insertions(+)
diff --git a/Marlin/src/core/macros.h b/Marlin/src/core/macros.h
index bef89040b3..fd6296707f 100644
--- a/Marlin/src/core/macros.h
+++ b/Marlin/src/core/macros.h
@@ -307,6 +307,12 @@
#define GANG_N_1(N,K) _GANG_N(N,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K,K)
// Expansion of some list items
+#define LIST_32(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,AA,BB,CC,DD,EE,FF,...) A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,AA,BB,CC,DD,EE,FF
+#define LIST_31(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,AA,BB,CC,DD,EE,...) A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,AA,BB,CC,DD,EE
+#define LIST_30(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,AA,BB,CC,DD,...) A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,AA,BB,CC,DD
+#define LIST_29(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,AA,BB,CC,...) A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,AA,BB,CC
+#define LIST_28(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,AA,BB,...) A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,TU,V,W,X,Y,Z,AA,BB
+#define LIST_27(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,AA,...) A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,AA
#define LIST_26(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,...) A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z
#define LIST_25(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,...) A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y
#define LIST_24(A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,...) A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X
@@ -572,6 +578,17 @@
#define INC_18 19
#define INC_19 20
#define INC_20 21
+#define INC_21 22
+#define INC_22 23
+#define INC_23 24
+#define INC_24 25
+#define INC_25 26
+#define INC_26 27
+#define INC_27 28
+#define INC_28 29
+#define INC_29 30
+#define INC_30 31
+#define INC_31 32
#define INCREMENT_(n) INC_##n
#define INCREMENT(n) INCREMENT_(n)
@@ -607,6 +624,23 @@
#define DEC_13 12
#define DEC_14 13
#define DEC_15 14
+#define DEC_16 15
+#define DEC_17 16
+#define DEC_18 17
+#define DEC_19 18
+#define DEC_20 19
+#define DEC_21 20
+#define DEC_22 21
+#define DEC_23 22
+#define DEC_24 23
+#define DEC_25 24
+#define DEC_26 25
+#define DEC_27 26
+#define DEC_28 27
+#define DEC_29 28
+#define DEC_30 29
+#define DEC_31 30
+#define DEC_32 31
#define DECREMENT_(n) DEC_##n
#define DECREMENT(n) DECREMENT_(n)
From 9dbce712fccaf3792ef9503afd3a4e301419b357 Mon Sep 17 00:00:00 2001
From: Scott Lahteine
Date: Sat, 31 May 2025 16:08:47 -0500
Subject: [PATCH 046/326] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20TMC?=
=?UTF-8?q?Stepper=20=3D>=200.8.5?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
ini/features.ini | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/ini/features.ini b/ini/features.ini
index 6b1e684561..80663abf5b 100644
--- a/ini/features.ini
+++ b/ini/features.ini
@@ -20,7 +20,7 @@ MARLIN_TEST_BUILD = build_src_filter=+
POSTMORTEM_DEBUGGING = build_src_filter=+ +
build_flags=-funwind-tables
MKS_WIFI_MODULE = QRCode=https://github.com/makerbase-mks/QRCode/archive/261c5a696a.zip
-HAS_TRINAMIC_CONFIG = TMCStepper=https://github.com/MarlinFirmware/TMCStepper/archive/v0.8.4.zip
+HAS_TRINAMIC_CONFIG = TMCStepper=https://github.com/MarlinFirmware/TMCStepper/archive/v0.8.5.zip
build_src_filter=+ + + + +
HAS_STEPPER_CONTROL = build_src_filter=+
HAS_T(RINAMIC_CONFIG|MC_SPI) = build_src_filter=+
From 3ddf728333c4e5dd7d24f4842c00f48dd3980b61 Mon Sep 17 00:00:00 2001
From: Scott Lahteine
Date: Sat, 31 May 2025 16:54:57 -0500
Subject: [PATCH 047/326] =?UTF-8?q?=F0=9F=A9=B9=20Fix=20some=20missed=20ON?=
=?UTF-8?q?BOARD=5FSDIO?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
Marlin/src/HAL/RP2040/HAL.cpp | 2 +-
Marlin/src/pins/stm32f4/pins_XTLW_CLIMBER_8TH.h | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/Marlin/src/HAL/RP2040/HAL.cpp b/Marlin/src/HAL/RP2040/HAL.cpp
index 8c35d45542..f0d9e4eec6 100644
--- a/Marlin/src/HAL/RP2040/HAL.cpp
+++ b/Marlin/src/HAL/RP2040/HAL.cpp
@@ -59,7 +59,7 @@ void MarlinHAL::init() {
constexpr int cpuFreq = F_CPU;
UNUSED(cpuFreq);
- #if HAS_MEDIA && DISABLED(SDIO_SUPPORT) && PIN_EXISTS(SD_SS)
+ #if HAS_MEDIA && DISABLED(ONBOARD_SDIO) && PIN_EXISTS(SD_SS)
OUT_WRITE(SD_SS_PIN, HIGH); // Try to set SD_SS_PIN inactive before any other SPI users start up
#endif
diff --git a/Marlin/src/pins/stm32f4/pins_XTLW_CLIMBER_8TH.h b/Marlin/src/pins/stm32f4/pins_XTLW_CLIMBER_8TH.h
index 053fb19525..0b41764ec4 100644
--- a/Marlin/src/pins/stm32f4/pins_XTLW_CLIMBER_8TH.h
+++ b/Marlin/src/pins/stm32f4/pins_XTLW_CLIMBER_8TH.h
@@ -168,7 +168,7 @@
// Must use soft SPI because Marlin's default hardware SPI is tied to LCD's EXP2
//
#if SD_CONNECTION_IS(ONBOARD)
- #define SDIO_SUPPORT // Use SDIO for onboard SD
+ #define ONBOARD_SDIO // Use SDIO for onboard SD
#define SDIO_D0_PIN PC8
#define SDIO_D1_PIN PC9
#define SDIO_D2_PIN PC10
From 7c30124f80edb0887faa49c0f904e3c68ef52a07 Mon Sep 17 00:00:00 2001
From: Scott Lahteine
Date: Sat, 31 May 2025 17:00:27 -0500
Subject: [PATCH 048/326] =?UTF-8?q?=F0=9F=93=8C=20Versions=20for=20adafrui?=
=?UTF-8?q?t=20"SdFat",=20"Adafruit=20SPIFlash"?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
ini/samd51.ini | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/ini/samd51.ini b/ini/samd51.ini
index cf1f9ed8c0..c2a83a0413 100644
--- a/ini/samd51.ini
+++ b/ini/samd51.ini
@@ -23,5 +23,5 @@ lib_deps = ${common.lib_deps}
Adafruit TinyUSB Library
extra_scripts = ${common.extra_scripts}
pre:buildroot/share/PlatformIO/scripts/SAMD51_grandcentral_m4.py
-custom_marlin.HAS_MEDIA = SdFat - Adafruit Fork, Adafruit SPIFlash
+custom_marlin.HAS_MEDIA = adafruit/SdFat@~2.3.50, adafruit/Adafruit SPIFlash@~5.1.1
debug_tool = jlink
From 823014868c1a9974f0f1881193a8f042577310f5 Mon Sep 17 00:00:00 2001
From: thinkyhead
Date: Sun, 1 Jun 2025 01:15:51 +0000
Subject: [PATCH 049/326] [cron] Bump distribution date (2025-06-01)
---
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 ca7a67dba7..cd9a44f5ab 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 "2025-05-31"
+//#define STRING_DISTRIBUTION_DATE "2025-06-01"
/**
* The protocol for communication to the host. Protocol indicates communication
diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h
index f6c6927508..33c044ebd5 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 "2025-05-31"
+ #define STRING_DISTRIBUTION_DATE "2025-06-01"
#endif
/**
From cc05123a803bfbd483632443a98b236f5722d600 Mon Sep 17 00:00:00 2001
From: Scott Lahteine
Date: Sun, 1 Jun 2025 16:09:48 -0500
Subject: [PATCH 050/326] =?UTF-8?q?=F0=9F=A9=B9=20Fix=20EXP3=5F03=5FPIN=20?=
=?UTF-8?q?for=20CREALITY=5FV24S1=5F301F4?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Fixes #27904
Co-Authored-By: Nexrem
---
Marlin/src/pins/stm32f4/pins_CREALITY_V24S1_301F4.h | 2 ++
1 file changed, 2 insertions(+)
diff --git a/Marlin/src/pins/stm32f4/pins_CREALITY_V24S1_301F4.h b/Marlin/src/pins/stm32f4/pins_CREALITY_V24S1_301F4.h
index fa524464e3..40ea8ae9bc 100644
--- a/Marlin/src/pins/stm32f4/pins_CREALITY_V24S1_301F4.h
+++ b/Marlin/src/pins/stm32f4/pins_CREALITY_V24S1_301F4.h
@@ -37,4 +37,6 @@
#define EEPROM_EXCL_ZONE 916,926 // Ender-3S1 STM32F401 Bootloader EEPROM exclusion zone
+#define EXP3_03_PIN PA2
+
#include "../stm32f1/pins_CREALITY_V24S1_301.h"
From 8c6e9526b050006d7ea9cac786a8010d6d2aa31f Mon Sep 17 00:00:00 2001
From: thinkyhead
Date: Mon, 2 Jun 2025 00:34:11 +0000
Subject: [PATCH 051/326] [cron] Bump distribution date (2025-06-02)
---
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 cd9a44f5ab..178fa18b69 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 "2025-06-01"
+//#define STRING_DISTRIBUTION_DATE "2025-06-02"
/**
* The protocol for communication to the host. Protocol indicates communication
diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h
index 33c044ebd5..a90e2d857a 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 "2025-06-01"
+ #define STRING_DISTRIBUTION_DATE "2025-06-02"
#endif
/**
From 9f6cafbae3a38d1432f8ed68fa27501012e57230 Mon Sep 17 00:00:00 2001
From: Scott Lahteine
Date: Sun, 1 Jun 2025 20:47:35 -0500
Subject: [PATCH 052/326] =?UTF-8?q?=F0=9F=A9=B9=20Fix=20Nozzle=20Cleaning?=
=?UTF-8?q?=20wait=20for=20pre-set=20temp?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Fixes #27882
---
Marlin/src/libs/nozzle.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Marlin/src/libs/nozzle.cpp b/Marlin/src/libs/nozzle.cpp
index 3b982718a2..ad77e1e0ae 100644
--- a/Marlin/src/libs/nozzle.cpp
+++ b/Marlin/src/libs/nozzle.cpp
@@ -189,12 +189,12 @@ Nozzle nozzle;
#if ENABLED(NOZZLE_CLEAN_HEATUP)
SERIAL_ECHOLNPGM("Nozzle too Cold - Heating");
thermalManager.setTargetHotend(NOZZLE_CLEAN_MIN_TEMP, arrPos);
- thermalManager.wait_for_hotend(arrPos);
#else
SERIAL_ECHOLNPGM("Nozzle too cold - Skipping wipe");
return;
#endif
}
+ thermalManager.wait_for_hotend(arrPos);
#endif
#if HAS_SOFTWARE_ENDSTOPS
From 6ea4a16212cc94b1665d057af8c504731d97f21e Mon Sep 17 00:00:00 2001
From: Scott Lahteine
Date: Mon, 2 Jun 2025 16:47:50 -0500
Subject: [PATCH 053/326] =?UTF-8?q?=F0=9F=8C=90=20Automated=20README=20tra?=
=?UTF-8?q?nslations?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
README-PT-BR.md | 81 -------------------------------------------------
README.md | 65 +++++++++++++++++++++++++++++++++------
2 files changed, 56 insertions(+), 90 deletions(-)
delete mode 100644 README-PT-BR.md
diff --git a/README-PT-BR.md b/README-PT-BR.md
deleted file mode 100644
index 3c730967ae..0000000000
--- a/README-PT-BR.md
+++ /dev/null
@@ -1,81 +0,0 @@
-
-
-
-Firmware de Impressora 3D Marlin
-
-
-
-
-
-
-
-
-
-
-
-
-Documentação adicional pode ser encontrada na [Página Inicial do Marlin](//marlinfw.org/).
-Por favor, teste este firmware e nos avise se encontrar algum problema. Voluntários estão prontos para ajudar!
-
-## Branch de Correções do Marlin 2.1
-
-__Não é para uso em produção. Use com cautela!__
-
-O Marlin 2.1 continua oferecendo suporte a placas ARM 32 bits e AVR 8 bits, além de adicionar suporte para até 9 eixos coordenados e até 8 extrusoras.
-
-Este branch é para correções da versão mais recente 2.1.x. Periodicamente, ele servirá de base para o próximo lançamento menor da linha 2.1.x.
-
-Versões anteriores do Marlin podem ser baixadas na [página de lançamentos](//github.com/MarlinFirmware/Marlin/releases).
-
-## Configurações de Exemplo
-
-Antes de compilar o Marlin para sua máquina, você precisará de uma configuração específica para o seu hardware. Ao solicitar, seu fornecedor deve fornecer o código-fonte completo e as configurações da sua máquina. No entanto, se quiser instalar uma versão mais recente do Marlin, você precisará de arquivos de configuração atualizados. Felizmente, a comunidade do Marlin já contribuiu com dezenas de configurações testadas para ajudar no início. Visite o repositório [MarlinFirmware/Configurations](//github.com/MarlinFirmware/Configurations) para encontrar a configuração mais próxima da sua impressora.
-
-## Compilando o Marlin 2.1
-
-Para compilar e enviar o Marlin você pode usar uma destas ferramentas:
-
-- O [Visual Studio Code](//code.visualstudio.com/download) com a extensão [Auto Build Marlin](//marlinfw.org/docs/basics/auto_build_marlin.html).
-- A [IDE do Arduino](//www.arduino.cc/en/main/software): Veja [Compilando Marlin com Arduino](//marlinfw.org/docs/basics/install_arduino.html).
-- Também é possível usar VSCode com devcontainer: Veja [Instalando Marlin (VSCode devcontainer)](http://marlinfw.org/docs/basics/install_devcontainer_vscode.html).
-
-O Marlin é otimizado para ser compilado com a extensão **PlatformIO IDE** no **Visual Studio Code**. Ainda é possível compilar com a **IDE do Arduino**, e temos planos para melhorar essa experiência, mas por enquanto o PlatformIO é a melhor escolha.
-
-## Placas AVR 8 Bits
-
-Pretendemos continuar oferecendo suporte às placas AVR 8 bits indefinidamente, mantendo uma base de código única que possa ser aplicada a todas as máquinas. Queremos que hobbystas, experimentadores e donos de máquinas antigas também se beneficiem das inovações da comunidade tanto quanto os donos de equipamentos mais modernos. Além disso, essas máquinas baseadas em AVR costumam ser ideais para testes e feedbacks!
-
-## Camada de Abstração de Hardware (HAL)
-
-O Marlin inclui uma camada de abstração de hardware para portar o firmware para uma grande variedade de chips. Essa camada trata das diferenças entre chips de forma modular, permitindo que as funcionalidades do Marlin sejam aproveitadas ao máximo.
-
-## Licença
-
-Marlin é publicado sob a licença GPL, então você pode usar, redistribuir e modificar o código-fonte, desde que o código derivado também seja publicado sob a mesma licença. Consulte o arquivo [LICENSE](https://github.com/MarlinFirmware/Marlin/blob/bugfix-2.1.x/LICENSE) para mais detalhes.
-
-## Ajude o Marlin!
-
-Você pode ajudar o projeto Marlin contribuindo com código, traduções, testes ou apoiando financeiramente no [GitHub Sponsors](https://github.com/sponsors/thinkyhead).
-
-...Marlin para diferentes plataformas de hardware. O HAL define as interfaces entre o núcleo do Marlin e o hardware da plataforma. O Marlin suporta atualmente as seguintes arquiteturas:
-
-- AVR
-- SAM (Arduino Due)
-- SAMD (Arduino Zero, etc.)
-- STM32F1, STM32F4, STM32F7, STM32H7
-- LPC176x (Smoothieboard, ReARM, Archim, MKS Sbase, etc.)
-- Teensy 3.5 e 3.6 (ARM Cortex-M4)
-- ESP32 (experimental)
-
-## Comunicação Serial
-
-- **Baudrates suportados:** 250000, 115200, 57600, 38400, 19200, 9600
-- O baudrate padrão é 250000 para maior velocidade e estabilidade
-
-## Atualizações e Contribuições
-
-Aceitamos correções de bugs, melhorias de desempenho e novas funcionalidades. Veja as instruções de contribuição na [Wiki do Marlin](https://github.com/MarlinFirmware/Marlin/wiki/Contributing).
-
-## Licença
-
-Marlin é um software livre licenciado sob a [GNU General Public License v3.0](https://www.gnu.org/licenses/gpl-3.0.html). Você pode redistribuí-lo e/ou modificá-lo sob os termos da GPL. Para mais detalhes, veja o arquivo [LICENSE](LICENSE).
diff --git a/README.md b/README.md
index 69979f4884..cc5fa60db7 100644
--- a/README.md
+++ b/README.md
@@ -4,21 +4,68 @@
-
-
-
-
+
+
+
+
-
-
+
+
+### 🌍 Translations
+
+
Additional documentation can be found at the [Marlin Home Page](//marlinfw.org/).
Please test this firmware and let us know if it misbehaves in any way. Volunteers are standing by!
---
-This README is available in other languages
-> **Versão em português:** [README-PT-BR.md](README-PT-BR.md)
## Marlin 2.1 Bugfix Branch
@@ -140,7 +187,7 @@ Name|Role|Link|Donate
## Star History
-
+
From 098e0961dcf01e9b7adf4f87e6ea92ab573ca95e Mon Sep 17 00:00:00 2001
From: David Buezas
Date: Tue, 3 Jun 2025 00:34:02 +0200
Subject: [PATCH 054/326] =?UTF-8?q?=F0=9F=A9=B9=20TMC2240=20diag0=20push-p?=
=?UTF-8?q?ull=20active=20HIGH=20(#27907)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
Marlin/src/module/stepper/trinamic.cpp | 2 ++
1 file changed, 2 insertions(+)
diff --git a/Marlin/src/module/stepper/trinamic.cpp b/Marlin/src/module/stepper/trinamic.cpp
index 0f4a8aa89c..240adc9f4c 100644
--- a/Marlin/src/module/stepper/trinamic.cpp
+++ b/Marlin/src/module/stepper/trinamic.cpp
@@ -822,6 +822,8 @@ enum StealthIndex : uint8_t {
st.PWMCONF(pwmconf.sr);
TERN(HYBRID_THRESHOLD, st.set_pwm_thrs(hyb_thrs), UNUSED(hyb_thrs));
+
+ st.diag0_pushpull(true);
st.GSTAT(); // Clear GSTAT
}
#endif // TMC2240
From 7df503de9388f2453515edd58fb5f74d01975b0a Mon Sep 17 00:00:00 2001
From: Scott Lahteine
Date: Mon, 2 Jun 2025 18:23:07 -0500
Subject: [PATCH 055/326] =?UTF-8?q?=F0=9F=A9=B9=20Fix=20FLY=20D5=20/=20D7?=
=?UTF-8?q?=20serial=20for=20TMC2208?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
See MarlinFirmware/TMCStepper#5
---
ini/stm32f0.ini | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/ini/stm32f0.ini b/ini/stm32f0.ini
index a684b98871..e3762ebac2 100644
--- a/ini/stm32f0.ini
+++ b/ini/stm32f0.ini
@@ -62,7 +62,7 @@ platform_packages = framework-arduinoststm32@4.20500.230714
framework-cmsis@2.50700.210515
toolchain-gccarmnoneeabi@1.100301.220327
build_flags = ${stm32_variant.build_flags}
- -DTIMER_SERIAL=TIM2
+ -DTIMER_SERIAL=TIM2 -DTMC2208_BAUDRATE=9600
upload_protocol = stlink
#
@@ -77,5 +77,5 @@ platform_packages = framework-arduinoststm32@4.20500.230714
framework-cmsis@2.50700.210515
toolchain-gccarmnoneeabi@1.100301.220327
build_flags = ${stm32_variant.build_flags}
- -DTIMER_SERIAL=TIM2
+ -DTIMER_SERIAL=TIM2 -DTMC2208_BAUDRATE=9600
upload_protocol = dfu
From 3bb9364c44131ae3680df4a35199cb67c117153b Mon Sep 17 00:00:00 2001
From: David Buezas
Date: Tue, 3 Jun 2025 01:59:01 +0200
Subject: [PATCH 056/326] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20Add?=
=?UTF-8?q?=20TMC2240=20temperature=20reading=20(#27903)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
Marlin/src/feature/tmc_util.cpp | 19 ++++++++++++++++++-
ini/features.ini | 2 +-
2 files changed, 19 insertions(+), 2 deletions(-)
diff --git a/Marlin/src/feature/tmc_util.cpp b/Marlin/src/feature/tmc_util.cpp
index d280b55854..6f53e1943c 100644
--- a/Marlin/src/feature/tmc_util.cpp
+++ b/Marlin/src/feature/tmc_util.cpp
@@ -526,7 +526,12 @@
TMC_HSTRT,
TMC_SGT,
TMC_MSCNT,
- TMC_INTERPOLATE
+ TMC_INTERPOLATE,
+ TMC_VAIN,
+ TMC_VSUPPLY,
+ TMC_TEMP,
+ TMC_OVERTEMP,
+ TMC_OVERVOLT_THD
};
enum TMC_drv_status_enum : char {
TMC_DRV_CODES,
@@ -701,6 +706,11 @@
case TMC_PWM_GRAD_AUTO: SERIAL_ECHO(st.pwm_grad_auto()); break;
case TMC_STEALTHCHOP: print_true_or_false(st.stealth()); break;
case TMC_INTERPOLATE: print_true_or_false(st.intpol()); break;
+ case TMC_VAIN: SERIAL_ECHO(st.get_ain_voltage()); break;
+ case TMC_VSUPPLY: SERIAL_ECHO(st.get_vsupply_voltage()); break;
+ case TMC_TEMP: SERIAL_ECHO(st.get_chip_temperature()); break;
+ case TMC_OVERTEMP: SERIAL_ECHO(st.get_overtemp_prewarn_celsius()); break;
+ case TMC_OVERVOLT_THD: SERIAL_ECHO(st.get_overvoltage_threshold_voltage()); break;
default: break;
}
}
@@ -978,6 +988,13 @@
DRV_REPORT("s2vsb\t", TMC_S2VSB);
#endif
DRV_REPORT("Driver registers:\n",TMC_DRV_STATUS_HEX);
+ #if HAS_DRIVER(TMC2240)
+ TMC_REPORT("Analog in (v)", TMC_VAIN);
+ TMC_REPORT("Supply (v)", TMC_VSUPPLY);
+ TMC_REPORT("Temp (°C)", TMC_TEMP);
+ TMC_REPORT("OT pre warn (°C)", TMC_OVERTEMP);
+ TMC_REPORT("OV theshold (v)", TMC_OVERVOLT_THD);
+ #endif
SERIAL_EOL();
}
diff --git a/ini/features.ini b/ini/features.ini
index 80663abf5b..69ec43f030 100644
--- a/ini/features.ini
+++ b/ini/features.ini
@@ -20,7 +20,7 @@ MARLIN_TEST_BUILD = build_src_filter=+
POSTMORTEM_DEBUGGING = build_src_filter=+ +
build_flags=-funwind-tables
MKS_WIFI_MODULE = QRCode=https://github.com/makerbase-mks/QRCode/archive/261c5a696a.zip
-HAS_TRINAMIC_CONFIG = TMCStepper=https://github.com/MarlinFirmware/TMCStepper/archive/v0.8.5.zip
+HAS_TRINAMIC_CONFIG = TMCStepper=https://github.com/MarlinFirmware/TMCStepper/archive/v0.8.6.zip
build_src_filter=+ + + + +
HAS_STEPPER_CONTROL = build_src_filter=+
HAS_T(RINAMIC_CONFIG|MC_SPI) = build_src_filter=+
From f1bb46f5b8b86506ae38b29c6d323f194085f9f6 Mon Sep 17 00:00:00 2001
From: thinkyhead
Date: Tue, 3 Jun 2025 00:32:58 +0000
Subject: [PATCH 057/326] [cron] Bump distribution date (2025-06-03)
---
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 178fa18b69..b0c1c5acad 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 "2025-06-02"
+//#define STRING_DISTRIBUTION_DATE "2025-06-03"
/**
* The protocol for communication to the host. Protocol indicates communication
diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h
index a90e2d857a..98f11b7f3e 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 "2025-06-02"
+ #define STRING_DISTRIBUTION_DATE "2025-06-03"
#endif
/**
From 951b8be3a111f7d84b6d949f37d7c45c0bd69916 Mon Sep 17 00:00:00 2001
From: Scott Lahteine
Date: Tue, 3 Jun 2025 18:47:44 -0500
Subject: [PATCH 058/326] =?UTF-8?q?=F0=9F=A9=B9=20Update=20Creality=20CR4N?=
=?UTF-8?q?S?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Followup to #27003
---
Marlin/src/pins/stm32f1/pins_CREALITY_CR4NS.h | 22 +++++++++----------
1 file changed, 10 insertions(+), 12 deletions(-)
diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_CR4NS.h b/Marlin/src/pins/stm32f1/pins_CREALITY_CR4NS.h
index 7d19aec51d..ce019e0039 100644
--- a/Marlin/src/pins/stm32f1/pins_CREALITY_CR4NS.h
+++ b/Marlin/src/pins/stm32f1/pins_CREALITY_CR4NS.h
@@ -62,6 +62,8 @@
//
// Limit Switches
//
+#define X_DIAG_PIN PB10
+#define Y_DIAG_PIN PB11
#ifndef Z_STOP_PIN
#define Z_STOP_PIN PC14
#endif
@@ -79,23 +81,19 @@
#define HEATER_BED_PIN PB2 // HOT BED
#define FAN1_PIN PC1 // extruder fan
-//
-// Steppers
-//
+
#if HAS_TMC_UART
-
- // Reduce baud rate to improve software serial reliability
- #define TMC_BAUD_RATE 19200
-
// Software serial
#define X_SERIAL_TX_PIN PB12
- #define X_DIAG_PIN PB10
-
#define Y_SERIAL_TX_PIN PB13
- #define Y_DIAG_PIN PB11
-
#define Z_SERIAL_TX_PIN PB14
-#endif // HAS_TMC_UART
+ #define E0_SERIAL_TX_PIN PB15
+
+ // Reduce baud rate to improve software serial reliability
+ #ifndef TMC_BAUD_RATE
+ #define TMC_BAUD_RATE 19200
+ #endif
+#endif
//
// SD Card
From 27621290b820f67df2755587601ff7d84ddc326f Mon Sep 17 00:00:00 2001
From: thinkyhead
Date: Wed, 4 Jun 2025 00:33:43 +0000
Subject: [PATCH 059/326] [cron] Bump distribution date (2025-06-04)
---
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 b0c1c5acad..9ad04135eb 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 "2025-06-03"
+//#define STRING_DISTRIBUTION_DATE "2025-06-04"
/**
* The protocol for communication to the host. Protocol indicates communication
diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h
index 98f11b7f3e..f3c366113f 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 "2025-06-03"
+ #define STRING_DISTRIBUTION_DATE "2025-06-04"
#endif
/**
From fca60335e145ec6a1cbb154ef22a754e610faa86 Mon Sep 17 00:00:00 2001
From: Andrew <18502096+classicrocker883@users.noreply.github.com>
Date: Tue, 3 Jun 2025 20:54:22 -0400
Subject: [PATCH 060/326] =?UTF-8?q?=F0=9F=A9=B9=20Fix=20Nonlinear=20Extrus?=
=?UTF-8?q?ion=20build=20(#27906)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Fixes #27902
---
Marlin/src/core/boards.h | 4 ++--
Marlin/src/module/stepper.h | 5 ++---
buildroot/tests/STM32F103RE_creality | 2 +-
3 files changed, 5 insertions(+), 6 deletions(-)
diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h
index 32ee85daab..adc03b657c 100644
--- a/Marlin/src/core/boards.h
+++ b/Marlin/src/core/boards.h
@@ -275,7 +275,7 @@
#define BOARD_MKS_SGEN_L_V2 2509 // MKS SGEN_L V2
#define BOARD_BTT_SKR_E3_TURBO 2510 // BigTreeTech SKR E3 Turbo
#define BOARD_FLY_CDY 2511 // FLYmaker FLY CDY
-#define BOARD_XTLW_CLIMBER_8TH_LPC 2512 // XTLW_CLIMBER_8TH_LPC
+#define BOARD_XTLW_CLIMBER_8TH_LPC 2512 // XTLW Climber 8
//
// SAM3X8E ARM Cortex-M3
@@ -283,7 +283,7 @@
#define BOARD_DUE3DOM 3000 // DUE3DOM for Arduino DUE
#define BOARD_DUE3DOM_MINI 3001 // DUE3DOM MINI for Arduino DUE
-#define BOARD_RADDS 3002 // RADDS
+#define BOARD_RADDS 3002 // RADDS v1.5/v1.6
#define BOARD_RAMPS_FD_V1 3003 // RAMPS-FD v1
#define BOARD_RAMPS_FD_V2 3004 // RAMPS-FD v2
#define BOARD_RAMPS_SMART_EFB 3005 // RAMPS-SMART (Power outputs: Hotend, Fan, Bed)
diff --git a/Marlin/src/module/stepper.h b/Marlin/src/module/stepper.h
index 90cbedc9fc..3083ad2973 100644
--- a/Marlin/src/module/stepper.h
+++ b/Marlin/src/module/stepper.h
@@ -311,9 +311,8 @@ constexpr ena_mask_t enable_overlap[] = {
struct { int32_t A, B, C; } q30;
};
#if NONLINEAR_EXTRUSION_Q24
- protected:
- int32_t edividend;
- uint32_t scale_q24;
+ int32_t edividend;
+ uint32_t scale_q24;
#endif
} nonlinear_t;
diff --git a/buildroot/tests/STM32F103RE_creality b/buildroot/tests/STM32F103RE_creality
index 0855a71ee4..45821598e0 100755
--- a/buildroot/tests/STM32F103RE_creality
+++ b/buildroot/tests/STM32F103RE_creality
@@ -32,7 +32,7 @@ opt_enable DWIN_LCD_PROUI INDIVIDUAL_AXIS_HOMING_SUBMENU PID_AUTOTUNE_MENU PID_E
SOUND_MENU_ITEM PRINTCOUNTER NOZZLE_PARK_FEATURE ADVANCED_PAUSE_FEATURE FILAMENT_RUNOUT_SENSOR \
BLTOUCH Z_SAFE_HOMING AUTO_BED_LEVELING_UBL MESH_EDIT_MENU LCD_BED_TRAMMING LIN_ADVANCE \
LIMITED_MAX_FR_EDITING LIMITED_MAX_ACCEL_EDITING LIMITED_JERK_EDITING BAUD_RATE_GCODE \
- CASE_LIGHT_ENABLE CASE_LIGHT_MENU CASE_LIGHT_NO_BRIGHTNESS
+ CASE_LIGHT_ENABLE CASE_LIGHT_MENU CASE_LIGHT_NO_BRIGHTNESS NONLINEAR_EXTRUSION
opt_set PREHEAT_3_LABEL '"CUSTOM"' PREHEAT_3_TEMP_HOTEND 240 PREHEAT_3_TEMP_BED 60 PREHEAT_3_FAN_SPEED 128 BOOTSCREEN_TIMEOUT 1100 CASE_LIGHT_PIN 4
exec_test $1 $2 "Ender-3 S1 - ProUI (PIDTEMP)" "$3"
From 127bc9489119dfc2204f8e3505cc9810914a1af0 Mon Sep 17 00:00:00 2001
From: thinkyhead
Date: Thu, 5 Jun 2025 00:32:27 +0000
Subject: [PATCH 061/326] [cron] Bump distribution date (2025-06-05)
---
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 9ad04135eb..3f7e62e416 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 "2025-06-04"
+//#define STRING_DISTRIBUTION_DATE "2025-06-05"
/**
* The protocol for communication to the host. Protocol indicates communication
diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h
index f3c366113f..c0455cbc51 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 "2025-06-04"
+ #define STRING_DISTRIBUTION_DATE "2025-06-05"
#endif
/**
From 5a5354107bfb70e8bcd76b0ab4744f6bfc6c75b8 Mon Sep 17 00:00:00 2001
From: RainMotorsports <100002265+RainMotorsports@users.noreply.github.com>
Date: Sun, 8 Jun 2025 23:18:35 -0400
Subject: [PATCH 062/326] =?UTF-8?q?=E2=9C=A8=20E3D=20BigBox=20Rumba=20boar?=
=?UTF-8?q?d=20(#27897)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
Marlin/Makefile | 3 +-
Marlin/src/core/boards.h | 1 +
Marlin/src/pins/pins.h | 2 ++
Marlin/src/pins/ramps/pins_RUMBA_E3D.h | 33 +++++++++++++++++++
Marlin/src/pins/stm32f1/pins_CREALITY_CR4NS.h | 1 -
5 files changed, 38 insertions(+), 2 deletions(-)
create mode 100644 Marlin/src/pins/ramps/pins_RUMBA_E3D.h
diff --git a/Marlin/Makefile b/Marlin/Makefile
index 9acab53673..fb1786b6b0 100644
--- a/Marlin/Makefile
+++ b/Marlin/Makefile
@@ -338,7 +338,8 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1164)
else ifeq ($(HARDWARE_MOTHERBOARD),1165)
# XTLW MFF V2.0
else ifeq ($(HARDWARE_MOTHERBOARD),1166)
-
+# E3D Rumba BigBox
+else ifeq ($(HARDWARE_MOTHERBOARD),1167)
#
# RAMBo and derivatives
diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h
index adc03b657c..ab7ad6fe47 100644
--- a/Marlin/src/core/boards.h
+++ b/Marlin/src/core/boards.h
@@ -131,6 +131,7 @@
#define BOARD_KODAMA_BARDO 1164 // Kodama Bardo V1.x (as found in the Kodama Trinus)
#define BOARD_XTLW_MFF_V1 1165 // XTLW MFF V1.0
#define BOARD_XTLW_MFF_V2 1166 // XTLW MFF V2.0
+#define BOARD_RUMBA_E3D 1167 // E3D Rumba BigBox
//
// RAMBo and derivatives
diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h
index 4a05b72a23..d5822f444b 100644
--- a/Marlin/src/pins/pins.h
+++ b/Marlin/src/pins/pins.h
@@ -223,6 +223,8 @@
#include "ramps/pins_XTLW_MFF_V1.h" // ATmega2560 env:mega2560
#elif MB(XTLW_MFF_V2)
#include "ramps/pins_XTLW_MFF_V2.h" // ATmega2560 env:mega2560
+#elif MB(RUMBA_E3D)
+ #include "ramps/pins_RUMBA_E3D.h" // ATmega2560 env:mega2560
//
// RAMBo and derivatives
diff --git a/Marlin/src/pins/ramps/pins_RUMBA_E3D.h b/Marlin/src/pins/ramps/pins_RUMBA_E3D.h
new file mode 100644
index 0000000000..2f268eacac
--- /dev/null
+++ b/Marlin/src/pins/ramps/pins_RUMBA_E3D.h
@@ -0,0 +1,33 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2025 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+#pragma once
+
+// ATmega2560
+
+#define BOARD_INFO_NAME "E3D Rumba"
+#define DEFAULT_MACHINE_NAME "E3D BigBox"
+
+// E3D uses PT100 connected to EXP3
+#define TEMP_0_PIN 10 // Analog Input
+#define TEMP_1_PIN 9 // Analog Input
+
+#include "pins_RUMBA.h"
diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_CR4NS.h b/Marlin/src/pins/stm32f1/pins_CREALITY_CR4NS.h
index ce019e0039..5a4f5bfaa5 100644
--- a/Marlin/src/pins/stm32f1/pins_CREALITY_CR4NS.h
+++ b/Marlin/src/pins/stm32f1/pins_CREALITY_CR4NS.h
@@ -81,7 +81,6 @@
#define HEATER_BED_PIN PB2 // HOT BED
#define FAN1_PIN PC1 // extruder fan
-
#if HAS_TMC_UART
// Software serial
#define X_SERIAL_TX_PIN PB12
From 781d9c470e756c2bcdff18bb84e76de071f1511a Mon Sep 17 00:00:00 2001
From: thinkyhead
Date: Mon, 9 Jun 2025 06:10:43 +0000
Subject: [PATCH 063/326] [cron] Bump distribution date (2025-06-09)
---
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 3f7e62e416..9f5daa27a0 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 "2025-06-05"
+//#define STRING_DISTRIBUTION_DATE "2025-06-09"
/**
* The protocol for communication to the host. Protocol indicates communication
diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h
index c0455cbc51..16911f23ce 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 "2025-06-05"
+ #define STRING_DISTRIBUTION_DATE "2025-06-09"
#endif
/**
From fbee2a2ff7ae02d7c87ff991b615afe6ad59641f Mon Sep 17 00:00:00 2001
From: David Buezas
Date: Mon, 9 Jun 2025 20:26:57 +0200
Subject: [PATCH 064/326] =?UTF-8?q?=E2=9A=A1=EF=B8=8F=20SMOOTH=5FLIN=5FADV?=
=?UTF-8?q?ANCE=20+=20S=5FCURVE=5FACCELERATION=20(#27827)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
Marlin/src/inc/SanityCheck.h | 2 --
Marlin/src/module/planner.h | 2 +-
Marlin/src/module/stepper.cpp | 59 +++++++++++++++++++++++++----------
Marlin/src/module/stepper.h | 7 +++++
4 files changed, 50 insertions(+), 20 deletions(-)
diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h
index 98498f4355..f3f4a97dff 100644
--- a/Marlin/src/inc/SanityCheck.h
+++ b/Marlin/src/inc/SanityCheck.h
@@ -866,8 +866,6 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L
#if ENABLED(SMOOTH_LIN_ADVANCE)
#ifndef CPU_32_BIT
#error "SMOOTH_LIN_ADVANCE requires a 32-bit CPU."
- #elif ENABLED(S_CURVE_ACCELERATION)
- #error "SMOOTH_LIN_ADVANCE is not compatible with S_CURVE_ACCELERATION."
#elif ENABLED(INPUT_SHAPING_E_SYNC) && NONE(INPUT_SHAPING_X, INPUT_SHAPING_Y)
#error "INPUT_SHAPING_E_SYNC requires INPUT_SHAPING_X or INPUT_SHAPING_Y."
#endif
diff --git a/Marlin/src/module/planner.h b/Marlin/src/module/planner.h
index bda5720919..eb8f2ed17f 100644
--- a/Marlin/src/module/planner.h
+++ b/Marlin/src/module/planner.h
@@ -45,7 +45,7 @@
#if ENABLED(SMOOTH_LIN_ADVANCE)
#define SMOOTH_LIN_ADV_EXP_ORDER 5 // Closest to Gaussian smoothing between 3 and 7
- #define SMOOTH_LIN_ADV_INTERVAL (STEPPER_TIMER_RATE / SMOOTH_LIN_ADV_HZ) // Hz
+ #define SMOOTH_LIN_ADV_INTERVAL (STEPPER_TIMER_RATE / (SMOOTH_LIN_ADV_HZ)) // Hz
#endif
#include "motion.h"
diff --git a/Marlin/src/module/stepper.cpp b/Marlin/src/module/stepper.cpp
index fd3d3bd800..945600e4fb 100644
--- a/Marlin/src/module/stepper.cpp
+++ b/Marlin/src/module/stepper.cpp
@@ -1401,7 +1401,7 @@ void Stepper::apply_directions() {
return (r2 | (uint16_t(r3) << 8)) | (uint32_t(r4) << 16);
}
- #else
+ #else // !__AVR__
// For all the other 32bit CPUs
FORCE_INLINE void Stepper::_calc_bezier_curve_coeffs(const int32_t v0, const int32_t v1, const uint32_t av) {
@@ -1478,7 +1478,9 @@ void Stepper::apply_directions() {
#endif
}
- #endif
+
+ #endif // !__AVR__
+
#endif // S_CURVE_ACCELERATION
/**
@@ -2697,7 +2699,7 @@ hal_timer_t Stepper::block_phase_isr() {
oversampling_factor = 0;
// Decide if axis smoothing is possible
- if (stepper.adaptive_step_smoothing_enabled) {
+ if (adaptive_step_smoothing_enabled) {
uint32_t max_rate = current_block->nominal_rate; // Get the step event rate
while (max_rate < min_step_isr_frequency) { // As long as more ISRs are possible...
max_rate <<= 1; // Try to double the rate
@@ -2902,7 +2904,7 @@ hal_timer_t Stepper::block_phase_isr() {
#if ENABLED(INPUT_SHAPING_E_SYNC)
- constexpr uint16_t IS_COMPENSATION_BUFFER_SIZE = uint16_t(float(SMOOTH_LIN_ADV_HZ) / float(SHAPING_MIN_FREQ) / 2.0f + 0.5f);
+ constexpr uint16_t IS_COMPENSATION_BUFFER_SIZE = uint16_t(float(SMOOTH_LIN_ADV_HZ) / (2.0f * (SHAPING_MIN_FREQ)) + 0.5f);
typedef struct {
xy_long_t buffer[IS_COMPENSATION_BUFFER_SIZE];
@@ -2924,21 +2926,39 @@ hal_timer_t Stepper::block_phase_isr() {
DelayBuffer delayBuffer;
- xy_long_t smooth_lin_adv_lookback(const shaping_time_t stepper_ticks) {
- constexpr uint32_t ADV_TICKS_PER_STEPPER_TICKS_Q30 = (uint64_t(SMOOTH_LIN_ADV_HZ) * _BV32(30)) / STEPPER_TIMER_RATE;
- const uint16_t delay_steps = MULT_Q(30, stepper_ticks, ADV_TICKS_PER_STEPPER_TICKS_Q30);
+ xy_long_t Stepper::smooth_lin_adv_lookback(const shaping_time_t stepper_ticks) {
+ constexpr uint32_t adv_ticks_per_stepper_ticks_Q30 = (uint64_t(SMOOTH_LIN_ADV_HZ) * _BV32(30)) / (STEPPER_TIMER_RATE);
+ const uint16_t delay_steps = MULT_Q(30, stepper_ticks, adv_ticks_per_stepper_ticks_Q30);
return delayBuffer.past_item(delay_steps);
}
#endif // INPUT_SHAPING_E_SYNC
- int32_t smooth_lin_adv_lookahead(uint32_t stepper_ticks) {
+ #if ENABLED(S_CURVE_ACCELERATION)
+ int32_t Stepper::calc_bezier_curve(const int32_t v0, const int32_t v1, const uint32_t av, const uint32_t curr_step) {
+ int32_t A = bezier_A, B = bezier_B, C = bezier_C;
+ uint32_t F = bezier_F, AV = bezier_AV;
+
+ _calc_bezier_curve_coeffs(v0, v1, av);
+ uint32_t rate = _eval_bezier_curve(curr_step);
+
+ bezier_A = A; bezier_B = B; bezier_C = C; bezier_F = F; bezier_AV = AV;
+ return rate;
+ }
+ #endif
+
+ int32_t Stepper::smooth_lin_adv_lookahead(uint32_t stepper_ticks) {
for (uint8_t i = 0; block_t *block = planner.get_future_block(i); i++) {
if (block->is_sync()) continue;
if (stepper_ticks <= block->acceleration_time) {
if (!block->use_advance_lead) return 0;
- uint32_t rate = STEP_MULTIPLY(stepper_ticks, block->acceleration_rate) + block->initial_rate;
- NOMORE(rate, block->nominal_rate);
+ uint32_t rate;
+ #if ENABLED(S_CURVE_ACCELERATION)
+ rate = calc_bezier_curve(block->initial_rate, block->cruise_rate, block->acceleration_time_inverse, stepper_ticks);
+ #else
+ rate = STEP_MULTIPLY(stepper_ticks, block->acceleration_rate) + block->initial_rate;
+ NOMORE(rate, block->nominal_rate);
+ #endif
return MULT_Q(30, rate, block->e_step_ratio_q30);
}
stepper_ticks -= block->acceleration_time;
@@ -2951,13 +2971,18 @@ hal_timer_t Stepper::block_phase_isr() {
if (stepper_ticks <= block->deceleration_time) {
if (!block->use_advance_lead) return 0;
- uint32_t rate = STEP_MULTIPLY(stepper_ticks, block->acceleration_rate);
- if (rate < block->cruise_rate) {
- rate = block->cruise_rate - rate;
- NOLESS(rate, block->final_rate);
- }
- else
- rate = block->final_rate;
+ uint32_t rate;
+ #if ENABLED(S_CURVE_ACCELERATION)
+ rate = calc_bezier_curve(block->cruise_rate, block->final_rate, block->deceleration_time_inverse, stepper_ticks);
+ #else
+ rate = STEP_MULTIPLY(stepper_ticks, block->acceleration_rate);
+ if (rate < block->cruise_rate) {
+ rate = block->cruise_rate - rate;
+ NOLESS(rate, block->final_rate);
+ }
+ else
+ rate = block->final_rate;
+ #endif
return MULT_Q(30, rate, block->e_step_ratio_q30);
}
stepper_ticks -= block->deceleration_time;
diff --git a/Marlin/src/module/stepper.h b/Marlin/src/module/stepper.h
index 3083ad2973..330ff9f6b6 100644
--- a/Marlin/src/module/stepper.h
+++ b/Marlin/src/module/stepper.h
@@ -555,8 +555,15 @@ class Stepper {
// The Linear advance ISR phase
static void advance_isr();
#if ENABLED(SMOOTH_LIN_ADVANCE)
+ #if ENABLED(INPUT_SHAPING_E_SYNC)
+ static xy_long_t smooth_lin_adv_lookback(const shaping_time_t stepper_ticks);
+ #endif
+ static int32_t smooth_lin_adv_lookahead(uint32_t stepper_ticks);
static void set_la_interval(int32_t step_rate);
static hal_timer_t smooth_lin_adv_isr();
+ #if ENABLED(S_CURVE_ACCELERATION)
+ static int32_t calc_bezier_curve(const int32_t v0, const int32_t v1, const uint32_t av, const uint32_t curr_step);
+ #endif
#endif
#endif
From 348099dabba1640049b995976b5ba6e74b731136 Mon Sep 17 00:00:00 2001
From: Scott Lahteine
Date: Mon, 9 Jun 2025 13:33:07 -0500
Subject: [PATCH 065/326] =?UTF-8?q?=F0=9F=8E=A8=20MKS=20UI=20name=20adjust?=
=?UTF-8?q?ments?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
Marlin/src/lcd/extui/mks_ui/draw_about.cpp | 2 +-
.../lcd/extui/mks_ui/draw_baby_stepping.cpp | 18 +++++++--------
.../lcd/extui/mks_ui/draw_change_speed.cpp | 12 +++++-----
.../src/lcd/extui/mks_ui/draw_extrusion.cpp | 12 +++++-----
Marlin/src/lcd/extui/mks_ui/draw_fan.cpp | 12 +++++-----
.../lcd/extui/mks_ui/draw_filament_change.cpp | 8 +++----
Marlin/src/lcd/extui/mks_ui/draw_home.cpp | 14 ++++++------
Marlin/src/lcd/extui/mks_ui/draw_language.cpp | 16 +++++++-------
.../src/lcd/extui/mks_ui/draw_manuaLevel.cpp | 12 +++++-----
.../lcd/extui/mks_ui/draw_media_select.cpp | 6 ++---
Marlin/src/lcd/extui/mks_ui/draw_more.cpp | 16 +++++++-------
.../src/lcd/extui/mks_ui/draw_move_motor.cpp | 18 +++++++--------
.../src/lcd/extui/mks_ui/draw_operation.cpp | 18 +++++++--------
Marlin/src/lcd/extui/mks_ui/draw_preHeat.cpp | 12 +++++-----
.../src/lcd/extui/mks_ui/draw_print_file.cpp | 22 +++++++++----------
Marlin/src/lcd/extui/mks_ui/draw_set.cpp | 16 +++++++-------
Marlin/src/lcd/extui/mks_ui/draw_tool.cpp | 16 +++++++-------
.../extui/mks_ui/draw_touch_calibration.cpp | 2 +-
Marlin/src/lcd/extui/mks_ui/draw_ui.cpp | 4 ++--
Marlin/src/lcd/extui/mks_ui/draw_ui.h | 14 ++++++------
Marlin/src/lcd/extui/mks_ui/draw_wifi.cpp | 6 ++---
.../src/lcd/extui/mks_ui/draw_wifi_list.cpp | 4 ++--
.../lcd/extui/mks_ui/draw_z_offset_wizard.cpp | 12 +++++-----
23 files changed, 136 insertions(+), 136 deletions(-)
diff --git a/Marlin/src/lcd/extui/mks_ui/draw_about.cpp b/Marlin/src/lcd/extui/mks_ui/draw_about.cpp
index e254523e12..7be129ebda 100644
--- a/Marlin/src/lcd/extui/mks_ui/draw_about.cpp
+++ b/Marlin/src/lcd/extui/mks_ui/draw_about.cpp
@@ -46,7 +46,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) {
void lv_draw_about() {
scr = lv_screen_create(ABOUT_UI);
- lv_big_button_create(scr, "F:/bmp_return.bin", common_menu.text_back, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_A_RETURN);
+ lv_big_button_create(scr, "F:/bmp_return.bin", common_menu.text_back, BTN_SIZE_X * 3 + INTERVAL_W * 4, BTN_SIZE_Y + INTERVAL_H + titleHeight, event_handler, ID_A_RETURN);
board = lv_label_create(scr, BOARD_INFO_NAME);
lv_obj_align(board, nullptr, LV_ALIGN_CENTER, 0, -80);
diff --git a/Marlin/src/lcd/extui/mks_ui/draw_baby_stepping.cpp b/Marlin/src/lcd/extui/mks_ui/draw_baby_stepping.cpp
index 1a6767dcc1..b55d79c2a1 100644
--- a/Marlin/src/lcd/extui/mks_ui/draw_baby_stepping.cpp
+++ b/Marlin/src/lcd/extui/mks_ui/draw_baby_stepping.cpp
@@ -114,24 +114,24 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) {
void lv_draw_baby_stepping() {
scr = lv_screen_create(BABYSTEP_UI);
- lv_big_button_create(scr, "F:/bmp_xAdd.bin", move_menu.x_add, INTERVAL_V, titleHeight, event_handler, ID_BABYSTEP_X_P);
- lv_big_button_create(scr, "F:/bmp_xDec.bin", move_menu.x_dec, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_BABYSTEP_X_N);
- lv_big_button_create(scr, "F:/bmp_yAdd.bin", move_menu.y_add, BTN_X_PIXEL + INTERVAL_V * 2, titleHeight, event_handler, ID_BABYSTEP_Y_P);
- lv_big_button_create(scr, "F:/bmp_yDec.bin", move_menu.y_dec, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_BABYSTEP_Y_N);
- lv_big_button_create(scr, "F:/bmp_zAdd.bin", move_menu.z_add, BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight, event_handler, ID_BABYSTEP_Z_P);
- lv_big_button_create(scr, "F:/bmp_zDec.bin", move_menu.z_dec, BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_BABYSTEP_Z_N);
- buttonV = lv_imgbtn_create(scr, nullptr, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight, event_handler, ID_BABYSTEP_DIST);
+ lv_big_button_create(scr, "F:/bmp_xAdd.bin", move_menu.x_add, INTERVAL_W, titleHeight, event_handler, ID_BABYSTEP_X_P);
+ lv_big_button_create(scr, "F:/bmp_xDec.bin", move_menu.x_dec, INTERVAL_W, BTN_SIZE_Y + INTERVAL_H + titleHeight, event_handler, ID_BABYSTEP_X_N);
+ lv_big_button_create(scr, "F:/bmp_yAdd.bin", move_menu.y_add, BTN_SIZE_X + INTERVAL_W * 2, titleHeight, event_handler, ID_BABYSTEP_Y_P);
+ lv_big_button_create(scr, "F:/bmp_yDec.bin", move_menu.y_dec, BTN_SIZE_X + INTERVAL_W * 2, BTN_SIZE_Y + INTERVAL_H + titleHeight, event_handler, ID_BABYSTEP_Y_N);
+ lv_big_button_create(scr, "F:/bmp_zAdd.bin", move_menu.z_add, BTN_SIZE_X * 2 + INTERVAL_W * 3, titleHeight, event_handler, ID_BABYSTEP_Z_P);
+ lv_big_button_create(scr, "F:/bmp_zDec.bin", move_menu.z_dec, BTN_SIZE_X * 2 + INTERVAL_W * 3, BTN_SIZE_Y + INTERVAL_H + titleHeight, event_handler, ID_BABYSTEP_Z_N);
+ buttonV = lv_imgbtn_create(scr, nullptr, BTN_SIZE_X * 3 + INTERVAL_W * 4, titleHeight, event_handler, ID_BABYSTEP_DIST);
labelV = lv_label_create_empty(buttonV);
#if HAS_ROTARY_ENCODER
if (gCfgItems.encoder_enable)
lv_group_add_obj(g, buttonV);
#endif
- lv_big_button_create(scr, "F:/bmp_return.bin", common_menu.text_back, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_BABYSTEP_RETURN);
+ lv_big_button_create(scr, "F:/bmp_return.bin", common_menu.text_back, BTN_SIZE_X * 3 + INTERVAL_W * 4, BTN_SIZE_Y + INTERVAL_H + titleHeight, event_handler, ID_BABYSTEP_RETURN);
disp_baby_step_dist();
- zOffsetText = lv_label_create(scr, 290, TITLE_YPOS, nullptr);
+ zOffsetText = lv_label_create(scr, 290, TITLE_POS_Y, nullptr);
disp_z_offset_value();
}
diff --git a/Marlin/src/lcd/extui/mks_ui/draw_change_speed.cpp b/Marlin/src/lcd/extui/mks_ui/draw_change_speed.cpp
index e5d0f4244f..da0ce3c811 100644
--- a/Marlin/src/lcd/extui/mks_ui/draw_change_speed.cpp
+++ b/Marlin/src/lcd/extui/mks_ui/draw_change_speed.cpp
@@ -93,11 +93,11 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) {
void lv_draw_change_speed() {
scr = lv_screen_create(CHANGE_SPEED_UI);
// Create an Image button
- lv_big_button_create(scr, "F:/bmp_Add.bin", speed_menu.add, INTERVAL_V, titleHeight, event_handler, ID_C_ADD);
- lv_big_button_create(scr, "F:/bmp_Dec.bin", speed_menu.dec, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight, event_handler, ID_C_DEC);
- buttonMov = lv_imgbtn_create(scr, nullptr, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_C_MOVE);
- buttonExt = lv_imgbtn_create(scr, nullptr, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_C_EXT);
- buttonStep = lv_imgbtn_create(scr, nullptr, BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_C_STEP);
+ lv_big_button_create(scr, "F:/bmp_Add.bin", speed_menu.add, INTERVAL_W, titleHeight, event_handler, ID_C_ADD);
+ lv_big_button_create(scr, "F:/bmp_Dec.bin", speed_menu.dec, BTN_SIZE_X * 3 + INTERVAL_W * 4, titleHeight, event_handler, ID_C_DEC);
+ buttonMov = lv_imgbtn_create(scr, nullptr, INTERVAL_W, BTN_SIZE_Y + INTERVAL_H + titleHeight, event_handler, ID_C_MOVE);
+ buttonExt = lv_imgbtn_create(scr, nullptr, BTN_SIZE_X + INTERVAL_W * 2, BTN_SIZE_Y + INTERVAL_H + titleHeight, event_handler, ID_C_EXT);
+ buttonStep = lv_imgbtn_create(scr, nullptr, BTN_SIZE_X * 2 + INTERVAL_W * 3, BTN_SIZE_Y + INTERVAL_H + titleHeight, event_handler, ID_C_STEP);
#if HAS_ROTARY_ENCODER
if (gCfgItems.encoder_enable) {
lv_group_add_obj(g, buttonMov);
@@ -105,7 +105,7 @@ void lv_draw_change_speed() {
lv_group_add_obj(g, buttonStep);
}
#endif
- lv_big_button_create(scr, "F:/bmp_return.bin", common_menu.text_back, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_C_RETURN);
+ lv_big_button_create(scr, "F:/bmp_return.bin", common_menu.text_back, BTN_SIZE_X * 3 + INTERVAL_W * 4, BTN_SIZE_Y + INTERVAL_H + titleHeight, event_handler, ID_C_RETURN);
// Create labels on the image buttons
labelMov = lv_label_create_empty(buttonMov);
diff --git a/Marlin/src/lcd/extui/mks_ui/draw_extrusion.cpp b/Marlin/src/lcd/extui/mks_ui/draw_extrusion.cpp
index 0cacf90f36..85d08ef197 100644
--- a/Marlin/src/lcd/extui/mks_ui/draw_extrusion.cpp
+++ b/Marlin/src/lcd/extui/mks_ui/draw_extrusion.cpp
@@ -114,13 +114,13 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) {
void lv_draw_extrusion() {
scr = lv_screen_create(EXTRUSION_UI);
// Create image buttons
- lv_obj_t *buttonAdd = lv_big_button_create(scr, "F:/bmp_in.bin", extrude_menu.in, INTERVAL_V, titleHeight, event_handler, ID_E_ADD);
+ lv_obj_t *buttonAdd = lv_big_button_create(scr, "F:/bmp_in.bin", extrude_menu.in, INTERVAL_W, titleHeight, event_handler, ID_E_ADD);
lv_obj_clear_protect(buttonAdd, LV_PROTECT_FOLLOW);
- lv_big_button_create(scr, "F:/bmp_out.bin", extrude_menu.out, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight, event_handler, ID_E_DEC);
+ lv_big_button_create(scr, "F:/bmp_out.bin", extrude_menu.out, BTN_SIZE_X * 3 + INTERVAL_W * 4, titleHeight, event_handler, ID_E_DEC);
- buttonType = lv_imgbtn_create(scr, nullptr, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_E_TYPE);
- buttonStep = lv_imgbtn_create(scr, nullptr, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_E_STEP);
- buttonSpeed = lv_imgbtn_create(scr, nullptr, BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_E_SPEED);
+ buttonType = lv_imgbtn_create(scr, nullptr, INTERVAL_W, BTN_SIZE_Y + INTERVAL_H + titleHeight, event_handler, ID_E_TYPE);
+ buttonStep = lv_imgbtn_create(scr, nullptr, BTN_SIZE_X + INTERVAL_W * 2, BTN_SIZE_Y + INTERVAL_H + titleHeight, event_handler, ID_E_STEP);
+ buttonSpeed = lv_imgbtn_create(scr, nullptr, BTN_SIZE_X * 2 + INTERVAL_W * 3, BTN_SIZE_Y + INTERVAL_H + titleHeight, event_handler, ID_E_SPEED);
#if HAS_ROTARY_ENCODER
if (gCfgItems.encoder_enable) {
@@ -130,7 +130,7 @@ void lv_draw_extrusion() {
}
#endif
- lv_big_button_create(scr, "F:/bmp_return.bin", common_menu.text_back, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_E_RETURN);
+ lv_big_button_create(scr, "F:/bmp_return.bin", common_menu.text_back, BTN_SIZE_X * 3 + INTERVAL_W * 4, BTN_SIZE_Y + INTERVAL_H + titleHeight, event_handler, ID_E_RETURN);
// Create labels on the image buttons
labelType = lv_label_create_empty(buttonType);
diff --git a/Marlin/src/lcd/extui/mks_ui/draw_fan.cpp b/Marlin/src/lcd/extui/mks_ui/draw_fan.cpp
index 12b47d9e94..ea7469980b 100644
--- a/Marlin/src/lcd/extui/mks_ui/draw_fan.cpp
+++ b/Marlin/src/lcd/extui/mks_ui/draw_fan.cpp
@@ -66,13 +66,13 @@ void lv_draw_fan() {
scr = lv_screen_create(FAN_UI);
// Create an Image button
- buttonAdd = lv_big_button_create(scr, "F:/bmp_Add.bin", fan_menu.add, INTERVAL_V, titleHeight, event_handler, ID_F_ADD);
+ buttonAdd = lv_big_button_create(scr, "F:/bmp_Add.bin", fan_menu.add, INTERVAL_W, titleHeight, event_handler, ID_F_ADD);
lv_obj_clear_protect(buttonAdd, LV_PROTECT_FOLLOW);
- lv_big_button_create(scr, "F:/bmp_Dec.bin", fan_menu.dec, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight, event_handler, ID_F_DEC);
- lv_big_button_create(scr, "F:/bmp_speed255.bin", fan_menu.full, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_F_HIGH);
- lv_big_button_create(scr, "F:/bmp_speed127.bin", fan_menu.half, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_F_MID);
- lv_big_button_create(scr, "F:/bmp_speed0.bin", fan_menu.off, BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_F_OFF);
- lv_big_button_create(scr, "F:/bmp_return.bin", common_menu.text_back, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_F_RETURN);
+ lv_big_button_create(scr, "F:/bmp_Dec.bin", fan_menu.dec, BTN_SIZE_X * 3 + INTERVAL_W * 4, titleHeight, event_handler, ID_F_DEC);
+ lv_big_button_create(scr, "F:/bmp_speed255.bin", fan_menu.full, INTERVAL_W, BTN_SIZE_Y + INTERVAL_H + titleHeight, event_handler, ID_F_HIGH);
+ lv_big_button_create(scr, "F:/bmp_speed127.bin", fan_menu.half, BTN_SIZE_X + INTERVAL_W * 2, BTN_SIZE_Y + INTERVAL_H + titleHeight, event_handler, ID_F_MID);
+ lv_big_button_create(scr, "F:/bmp_speed0.bin", fan_menu.off, BTN_SIZE_X * 2 + INTERVAL_W * 3, BTN_SIZE_Y + INTERVAL_H + titleHeight, event_handler, ID_F_OFF);
+ lv_big_button_create(scr, "F:/bmp_return.bin", common_menu.text_back, BTN_SIZE_X * 3 + INTERVAL_W * 4, BTN_SIZE_Y + INTERVAL_H + titleHeight, event_handler, ID_F_RETURN);
fanText = lv_label_create_empty(scr);
lv_obj_set_style(fanText, &tft_style_label_rel);
diff --git a/Marlin/src/lcd/extui/mks_ui/draw_filament_change.cpp b/Marlin/src/lcd/extui/mks_ui/draw_filament_change.cpp
index bd9c3ccbe7..26ed471a3a 100644
--- a/Marlin/src/lcd/extui/mks_ui/draw_filament_change.cpp
+++ b/Marlin/src/lcd/extui/mks_ui/draw_filament_change.cpp
@@ -109,17 +109,17 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) {
void lv_draw_filament_change() {
scr = lv_screen_create(FILAMENTCHANGE_UI);
// Create an Image button
- lv_obj_t *buttonIn = lv_big_button_create(scr, "F:/bmp_in.bin", filament_menu.in, INTERVAL_V, titleHeight, event_handler, ID_FILAMNT_IN);
+ lv_obj_t *buttonIn = lv_big_button_create(scr, "F:/bmp_in.bin", filament_menu.in, INTERVAL_W, titleHeight, event_handler, ID_FILAMNT_IN);
lv_obj_clear_protect(buttonIn, LV_PROTECT_FOLLOW);
- lv_big_button_create(scr, "F:/bmp_out.bin", filament_menu.out, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight, event_handler, ID_FILAMNT_OUT);
+ lv_big_button_create(scr, "F:/bmp_out.bin", filament_menu.out, BTN_SIZE_X * 3 + INTERVAL_W * 4, titleHeight, event_handler, ID_FILAMNT_OUT);
- buttonType = lv_imgbtn_create(scr, nullptr, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_FILAMNT_TYPE);
+ buttonType = lv_imgbtn_create(scr, nullptr, INTERVAL_W, BTN_SIZE_Y + INTERVAL_H + titleHeight, event_handler, ID_FILAMNT_TYPE);
#if HAS_ROTARY_ENCODER
if (gCfgItems.encoder_enable)
lv_group_add_obj(g, buttonType);
#endif
- lv_big_button_create(scr, "F:/bmp_return.bin", common_menu.text_back, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_FILAMNT_RETURN);
+ lv_big_button_create(scr, "F:/bmp_return.bin", common_menu.text_back, BTN_SIZE_X * 3 + INTERVAL_W * 4, BTN_SIZE_Y + INTERVAL_H + titleHeight, event_handler, ID_FILAMNT_RETURN);
// Create labels on the image buttons
labelType = lv_label_create_empty(buttonType);
diff --git a/Marlin/src/lcd/extui/mks_ui/draw_home.cpp b/Marlin/src/lcd/extui/mks_ui/draw_home.cpp
index a819fffacd..101afe6bd3 100644
--- a/Marlin/src/lcd/extui/mks_ui/draw_home.cpp
+++ b/Marlin/src/lcd/extui/mks_ui/draw_home.cpp
@@ -74,13 +74,13 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) {
void lv_draw_home() {
scr = lv_screen_create(ZERO_UI);
- lv_big_button_create(scr, "F:/bmp_zeroAll.bin", home_menu.home_all, INTERVAL_V, titleHeight, event_handler, ID_H_ALL);
- lv_big_button_create(scr, "F:/bmp_zeroX.bin", home_menu.home_x, BTN_X_PIXEL + INTERVAL_V * 2, titleHeight, event_handler, ID_H_X);
- lv_big_button_create(scr, "F:/bmp_zeroY.bin", home_menu.home_y, BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight, event_handler, ID_H_Y);
- lv_big_button_create(scr, "F:/bmp_zeroZ.bin", home_menu.home_z, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight, event_handler, ID_H_Z);
- lv_big_button_create(scr, "F:/bmp_function1.bin", set_menu.motoroff, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_H_OFF_ALL);
- lv_big_button_create(scr, "F:/bmp_function1.bin", set_menu.motoroffXY, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_H_OFF_XY);
- lv_big_button_create(scr, "F:/bmp_return.bin", common_menu.text_back, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_H_RETURN);
+ lv_big_button_create(scr, "F:/bmp_zeroAll.bin", home_menu.home_all, INTERVAL_W, titleHeight, event_handler, ID_H_ALL);
+ lv_big_button_create(scr, "F:/bmp_zeroX.bin", home_menu.home_x, BTN_SIZE_X + INTERVAL_W * 2, titleHeight, event_handler, ID_H_X);
+ lv_big_button_create(scr, "F:/bmp_zeroY.bin", home_menu.home_y, BTN_SIZE_X * 2 + INTERVAL_W * 3, titleHeight, event_handler, ID_H_Y);
+ lv_big_button_create(scr, "F:/bmp_zeroZ.bin", home_menu.home_z, BTN_SIZE_X * 3 + INTERVAL_W * 4, titleHeight, event_handler, ID_H_Z);
+ lv_big_button_create(scr, "F:/bmp_function1.bin", set_menu.motoroff, INTERVAL_W, BTN_SIZE_Y + INTERVAL_H + titleHeight, event_handler, ID_H_OFF_ALL);
+ lv_big_button_create(scr, "F:/bmp_function1.bin", set_menu.motoroffXY, BTN_SIZE_X + INTERVAL_W * 2, BTN_SIZE_Y + INTERVAL_H + titleHeight, event_handler, ID_H_OFF_XY);
+ lv_big_button_create(scr, "F:/bmp_return.bin", common_menu.text_back, BTN_SIZE_X * 3 + INTERVAL_W * 4, BTN_SIZE_Y + INTERVAL_H + titleHeight, event_handler, ID_H_RETURN);
}
void lv_clear_home() {
diff --git a/Marlin/src/lcd/extui/mks_ui/draw_language.cpp b/Marlin/src/lcd/extui/mks_ui/draw_language.cpp
index 3ef8c6a0ee..d3eba04783 100644
--- a/Marlin/src/lcd/extui/mks_ui/draw_language.cpp
+++ b/Marlin/src/lcd/extui/mks_ui/draw_language.cpp
@@ -187,15 +187,15 @@ static void disp_language(uint8_t language, uint8_t state) {
void lv_draw_language() {
scr = lv_screen_create(LANGUAGE_UI);
// Create image buttons
- buttonCN = lv_big_button_create(scr, "F:/bmp_simplified_cn.bin", language_menu.chinese_s, INTERVAL_V, titleHeight, event_handler, ID_CN);
+ buttonCN = lv_big_button_create(scr, "F:/bmp_simplified_cn.bin", language_menu.chinese_s, INTERVAL_W, titleHeight, event_handler, ID_CN);
lv_obj_clear_protect(buttonCN, LV_PROTECT_FOLLOW);
- buttonT_CN = lv_big_button_create(scr, "F:/bmp_traditional_cn.bin", language_menu.chinese_t, BTN_X_PIXEL + INTERVAL_V * 2, titleHeight, event_handler, ID_T_CN);
- buttonEN = lv_big_button_create(scr, "F:/bmp_english.bin", language_menu.english, BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight, event_handler, ID_EN);
- buttonRU = lv_big_button_create(scr, "F:/bmp_russian.bin", language_menu.russian, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight, event_handler, ID_RU);
- buttonES = lv_big_button_create(scr, "F:/bmp_spanish.bin", language_menu.spanish, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_ES);
- buttonFR = lv_big_button_create(scr, "F:/bmp_french.bin", language_menu.french, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_FR);
- buttonIT = lv_big_button_create(scr, "F:/bmp_italy.bin", language_menu.italy, BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_IT);
- lv_big_button_create(scr, "F:/bmp_return.bin", common_menu.text_back, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_L_RETURN);
+ buttonT_CN = lv_big_button_create(scr, "F:/bmp_traditional_cn.bin", language_menu.chinese_t, BTN_SIZE_X + INTERVAL_W * 2, titleHeight, event_handler, ID_T_CN);
+ buttonEN = lv_big_button_create(scr, "F:/bmp_english.bin", language_menu.english, BTN_SIZE_X * 2 + INTERVAL_W * 3, titleHeight, event_handler, ID_EN);
+ buttonRU = lv_big_button_create(scr, "F:/bmp_russian.bin", language_menu.russian, BTN_SIZE_X * 3 + INTERVAL_W * 4, titleHeight, event_handler, ID_RU);
+ buttonES = lv_big_button_create(scr, "F:/bmp_spanish.bin", language_menu.spanish, INTERVAL_W, BTN_SIZE_Y + INTERVAL_H + titleHeight, event_handler, ID_ES);
+ buttonFR = lv_big_button_create(scr, "F:/bmp_french.bin", language_menu.french, BTN_SIZE_X + INTERVAL_W * 2, BTN_SIZE_Y + INTERVAL_H + titleHeight, event_handler, ID_FR);
+ buttonIT = lv_big_button_create(scr, "F:/bmp_italy.bin", language_menu.italy, BTN_SIZE_X * 2 + INTERVAL_W * 3, BTN_SIZE_Y + INTERVAL_H + titleHeight, event_handler, ID_IT);
+ lv_big_button_create(scr, "F:/bmp_return.bin", common_menu.text_back, BTN_SIZE_X * 3 + INTERVAL_W * 4, BTN_SIZE_Y + INTERVAL_H + titleHeight, event_handler, ID_L_RETURN);
disp_language(gCfgItems.language, SELECTED);
}
diff --git a/Marlin/src/lcd/extui/mks_ui/draw_manuaLevel.cpp b/Marlin/src/lcd/extui/mks_ui/draw_manuaLevel.cpp
index 60724aa4f3..dd28381904 100644
--- a/Marlin/src/lcd/extui/mks_ui/draw_manuaLevel.cpp
+++ b/Marlin/src/lcd/extui/mks_ui/draw_manuaLevel.cpp
@@ -69,13 +69,13 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) {
void lv_draw_manualLevel() {
scr = lv_screen_create(LEVELING_UI);
// Create an Image button
- lv_obj_t *buttonPoint1 = lv_big_button_create(scr, "F:/bmp_leveling1.bin", leveling_menu.position1, INTERVAL_V, titleHeight, event_handler, ID_M_POINT1);
+ lv_obj_t *buttonPoint1 = lv_big_button_create(scr, "F:/bmp_leveling1.bin", leveling_menu.position1, INTERVAL_W, titleHeight, event_handler, ID_M_POINT1);
lv_obj_clear_protect(buttonPoint1, LV_PROTECT_FOLLOW);
- lv_big_button_create(scr, "F:/bmp_leveling2.bin", leveling_menu.position2, BTN_X_PIXEL + INTERVAL_V * 2, titleHeight, event_handler, ID_M_POINT2);
- lv_big_button_create(scr, "F:/bmp_leveling3.bin", leveling_menu.position3, BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight, event_handler, ID_M_POINT3);
- lv_big_button_create(scr, "F:/bmp_leveling4.bin", leveling_menu.position4, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight, event_handler, ID_M_POINT4);
- lv_big_button_create(scr, "F:/bmp_leveling5.bin", leveling_menu.position5, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_M_POINT5);
- lv_big_button_create(scr, "F:/bmp_return.bin", common_menu.text_back, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_MANUAL_RETURN);
+ lv_big_button_create(scr, "F:/bmp_leveling2.bin", leveling_menu.position2, BTN_SIZE_X + INTERVAL_W * 2, titleHeight, event_handler, ID_M_POINT2);
+ lv_big_button_create(scr, "F:/bmp_leveling3.bin", leveling_menu.position3, BTN_SIZE_X * 2 + INTERVAL_W * 3, titleHeight, event_handler, ID_M_POINT3);
+ lv_big_button_create(scr, "F:/bmp_leveling4.bin", leveling_menu.position4, BTN_SIZE_X * 3 + INTERVAL_W * 4, titleHeight, event_handler, ID_M_POINT4);
+ lv_big_button_create(scr, "F:/bmp_leveling5.bin", leveling_menu.position5, INTERVAL_W, BTN_SIZE_Y + INTERVAL_H + titleHeight, event_handler, ID_M_POINT5);
+ lv_big_button_create(scr, "F:/bmp_return.bin", common_menu.text_back, BTN_SIZE_X * 3 + INTERVAL_W * 4, BTN_SIZE_Y + INTERVAL_H + titleHeight, event_handler, ID_MANUAL_RETURN);
}
void lv_clear_manualLevel() {
diff --git a/Marlin/src/lcd/extui/mks_ui/draw_media_select.cpp b/Marlin/src/lcd/extui/mks_ui/draw_media_select.cpp
index a327f2f33e..2b96ab6e12 100644
--- a/Marlin/src/lcd/extui/mks_ui/draw_media_select.cpp
+++ b/Marlin/src/lcd/extui/mks_ui/draw_media_select.cpp
@@ -58,9 +58,9 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) {
void lv_draw_media_select() {
scr = lv_screen_create(MEDIA_SELECT_UI);
- lv_big_button_create(scr, "F:/bmp_sd.bin", media_select_menu.sd_disk, INTERVAL_V, titleHeight, event_handler, ID_T_SD_DISK);
- lv_big_button_create(scr, "F:/bmp_usb_disk.bin", media_select_menu.usb_disk, BTN_X_PIXEL + INTERVAL_V * 2, titleHeight, event_handler, ID_T_USB_DISK);
- lv_big_button_create(scr, "F:/bmp_return.bin", common_menu.text_back, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_T_RETURN);
+ lv_big_button_create(scr, "F:/bmp_sd.bin", media_select_menu.sd_disk, INTERVAL_W, titleHeight, event_handler, ID_T_SD_DISK);
+ lv_big_button_create(scr, "F:/bmp_usb_disk.bin", media_select_menu.usb_disk, BTN_SIZE_X + INTERVAL_W * 2, titleHeight, event_handler, ID_T_USB_DISK);
+ lv_big_button_create(scr, "F:/bmp_return.bin", common_menu.text_back, BTN_SIZE_X * 3 + INTERVAL_W * 4, BTN_SIZE_Y + INTERVAL_H + titleHeight, event_handler, ID_T_RETURN);
}
void lv_clear_media_select() {
diff --git a/Marlin/src/lcd/extui/mks_ui/draw_more.cpp b/Marlin/src/lcd/extui/mks_ui/draw_more.cpp
index a9c1dc1ec6..864a3e1d96 100644
--- a/Marlin/src/lcd/extui/mks_ui/draw_more.cpp
+++ b/Marlin/src/lcd/extui/mks_ui/draw_more.cpp
@@ -91,47 +91,47 @@ void lv_draw_more() {
const bool enc_ena = TERN0(HAS_ROTARY_ENCODER, gCfgItems.encoder_enable);
- lv_obj_t *buttonGCode = lv_imgbtn_create(scr, "F:/bmp_machine_para.bin", INTERVAL_V, titleHeight, event_handler, ID_GCODE);
+ lv_obj_t *buttonGCode = lv_imgbtn_create(scr, "F:/bmp_machine_para.bin", INTERVAL_W, titleHeight, event_handler, ID_GCODE);
if (enc_ena) lv_group_add_obj(g, buttonGCode);
lv_obj_t *labelGCode = lv_label_create_empty(buttonGCode);
#if HAS_USER_ITEM(1)
- lv_obj_t *buttonCustom1 = lv_imgbtn_create(scr, "F:/bmp_custom1.bin", BTN_X_PIXEL + INTERVAL_V * 2, titleHeight, event_handler, ID_CUSTOM_1);
+ lv_obj_t *buttonCustom1 = lv_imgbtn_create(scr, "F:/bmp_custom1.bin", BTN_SIZE_X + INTERVAL_W * 2, titleHeight, event_handler, ID_CUSTOM_1);
if (enc_ena) lv_group_add_obj(g, buttonCustom1);
lv_obj_t *labelCustom1 = lv_label_create_empty(buttonCustom1);
#endif
#if HAS_USER_ITEM(2)
- lv_obj_t *buttonCustom2 = lv_imgbtn_create(scr, "F:/bmp_custom2.bin", BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight, event_handler, ID_CUSTOM_2);
+ lv_obj_t *buttonCustom2 = lv_imgbtn_create(scr, "F:/bmp_custom2.bin", BTN_SIZE_X * 2 + INTERVAL_W * 3, titleHeight, event_handler, ID_CUSTOM_2);
if (enc_ena) lv_group_add_obj(g, buttonCustom2);
lv_obj_t *labelCustom2 = lv_label_create_empty(buttonCustom2);
#endif
#if HAS_USER_ITEM(3)
- lv_obj_t *buttonCustom3 = lv_imgbtn_create(scr, "F:/bmp_custom3.bin", BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight, event_handler, ID_CUSTOM_3);
+ lv_obj_t *buttonCustom3 = lv_imgbtn_create(scr, "F:/bmp_custom3.bin", BTN_SIZE_X * 3 + INTERVAL_W * 4, titleHeight, event_handler, ID_CUSTOM_3);
if (enc_ena) lv_group_add_obj(g, buttonCustom3);
lv_obj_t *labelCustom3 = lv_label_create_empty(buttonCustom3);
#endif
#if HAS_USER_ITEM(4)
- lv_obj_t *buttonCustom4 = lv_imgbtn_create(scr, "F:/bmp_custom4.bin", INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_CUSTOM_4);
+ lv_obj_t *buttonCustom4 = lv_imgbtn_create(scr, "F:/bmp_custom4.bin", INTERVAL_W, BTN_SIZE_Y + INTERVAL_H + titleHeight, event_handler, ID_CUSTOM_4);
if (enc_ena) lv_group_add_obj(g, buttonCustom4);
lv_obj_t *labelCustom4 = lv_label_create_empty(buttonCustom4);
#endif
#if HAS_USER_ITEM(5)
- lv_obj_t *buttonCustom5 = lv_imgbtn_create(scr, "F:/bmp_custom5.bin", BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_CUSTOM_5);
+ lv_obj_t *buttonCustom5 = lv_imgbtn_create(scr, "F:/bmp_custom5.bin", BTN_SIZE_X + INTERVAL_W * 2, BTN_SIZE_Y + INTERVAL_H + titleHeight, event_handler, ID_CUSTOM_5);
if (enc_ena) lv_group_add_obj(g, buttonCustom5);
lv_obj_t *labelCustom5 = lv_label_create_empty(buttonCustom5);
#endif
#if HAS_USER_ITEM(6)
- lv_obj_t *buttonCustom6 = lv_imgbtn_create(scr, "F:/bmp_custom6.bin", BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_CUSTOM_6);
+ lv_obj_t *buttonCustom6 = lv_imgbtn_create(scr, "F:/bmp_custom6.bin", BTN_SIZE_X * 2 + INTERVAL_W * 3, BTN_SIZE_Y + INTERVAL_H + titleHeight, event_handler, ID_CUSTOM_6);
if (enc_ena) lv_group_add_obj(g, buttonCustom6);
lv_obj_t *labelCustom6 = lv_label_create_empty(buttonCustom6);
#endif
- lv_obj_t *buttonBack = lv_imgbtn_create(scr, "F:/bmp_return.bin", BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_M_RETURN);
+ lv_obj_t *buttonBack = lv_imgbtn_create(scr, "F:/bmp_return.bin", BTN_SIZE_X * 3 + INTERVAL_W * 4, BTN_SIZE_Y + INTERVAL_H + titleHeight, event_handler, ID_M_RETURN);
if (enc_ena) lv_group_add_obj(g, buttonBack);
lv_obj_t *label_Back = lv_label_create_empty(buttonBack);
diff --git a/Marlin/src/lcd/extui/mks_ui/draw_move_motor.cpp b/Marlin/src/lcd/extui/mks_ui/draw_move_motor.cpp
index aa9fbdcd95..84959c15a1 100644
--- a/Marlin/src/lcd/extui/mks_ui/draw_move_motor.cpp
+++ b/Marlin/src/lcd/extui/mks_ui/draw_move_motor.cpp
@@ -99,27 +99,27 @@ void refresh_pos(lv_task_t *) {
void lv_draw_move_motor() {
scr = lv_screen_create(MOVE_MOTOR_UI);
- lv_obj_t *buttonXI = lv_big_button_create(scr, "F:/bmp_xAdd.bin", move_menu.x_add, INTERVAL_V, titleHeight, event_handler, ID_M_X_P);
+ lv_obj_t *buttonXI = lv_big_button_create(scr, "F:/bmp_xAdd.bin", move_menu.x_add, INTERVAL_W, titleHeight, event_handler, ID_M_X_P);
lv_obj_clear_protect(buttonXI, LV_PROTECT_FOLLOW);
- lv_big_button_create(scr, "F:/bmp_xDec.bin", move_menu.x_dec, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_M_X_N);
- lv_big_button_create(scr, "F:/bmp_yAdd.bin", move_menu.y_add, BTN_X_PIXEL + INTERVAL_V * 2, titleHeight, event_handler, ID_M_Y_P);
- lv_big_button_create(scr, "F:/bmp_yDec.bin", move_menu.y_dec, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_M_Y_N);
- lv_big_button_create(scr, "F:/bmp_zAdd.bin", move_menu.z_add, BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight, event_handler, ID_M_Z_P);
- lv_big_button_create(scr, "F:/bmp_zDec.bin", move_menu.z_dec, BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_M_Z_N);
+ lv_big_button_create(scr, "F:/bmp_xDec.bin", move_menu.x_dec, INTERVAL_W, BTN_SIZE_Y + INTERVAL_H + titleHeight, event_handler, ID_M_X_N);
+ lv_big_button_create(scr, "F:/bmp_yAdd.bin", move_menu.y_add, BTN_SIZE_X + INTERVAL_W * 2, titleHeight, event_handler, ID_M_Y_P);
+ lv_big_button_create(scr, "F:/bmp_yDec.bin", move_menu.y_dec, BTN_SIZE_X + INTERVAL_W * 2, BTN_SIZE_Y + INTERVAL_H + titleHeight, event_handler, ID_M_Y_N);
+ lv_big_button_create(scr, "F:/bmp_zAdd.bin", move_menu.z_add, BTN_SIZE_X * 2 + INTERVAL_W * 3, titleHeight, event_handler, ID_M_Z_P);
+ lv_big_button_create(scr, "F:/bmp_zDec.bin", move_menu.z_dec, BTN_SIZE_X * 2 + INTERVAL_W * 3, BTN_SIZE_Y + INTERVAL_H + titleHeight, event_handler, ID_M_Z_N);
// button with image and label changed dynamically by disp_move_dist
- buttonV = lv_imgbtn_create(scr, nullptr, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight, event_handler, ID_M_STEP);
+ buttonV = lv_imgbtn_create(scr, nullptr, BTN_SIZE_X * 3 + INTERVAL_W * 4, titleHeight, event_handler, ID_M_STEP);
labelV = lv_label_create_empty(buttonV);
#if HAS_ROTARY_ENCODER
if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonV);
#endif
- lv_big_button_create(scr, "F:/bmp_return.bin", common_menu.text_back, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_M_RETURN);
+ lv_big_button_create(scr, "F:/bmp_return.bin", common_menu.text_back, BTN_SIZE_X * 3 + INTERVAL_W * 4, BTN_SIZE_Y + INTERVAL_H + titleHeight, event_handler, ID_M_RETURN);
// We need to patch the title to leave some space on the right for displaying the status
lv_obj_t * title = lv_obj_get_child_back(scr, nullptr);
if (title != nullptr) lv_obj_set_width(title, TFT_WIDTH - 101);
- labelP = lv_label_create(scr, TFT_WIDTH - 100, TITLE_YPOS, "Z:0.0mm");
+ labelP = lv_label_create(scr, TFT_WIDTH - 100, TITLE_POS_Y, "Z:0.0mm");
if (labelP != nullptr)
updatePosTask = lv_task_create(refresh_pos, 300, LV_TASK_PRIO_LOWEST, 0);
diff --git a/Marlin/src/lcd/extui/mks_ui/draw_operation.cpp b/Marlin/src/lcd/extui/mks_ui/draw_operation.cpp
index bf39a52fe9..14b655e09c 100644
--- a/Marlin/src/lcd/extui/mks_ui/draw_operation.cpp
+++ b/Marlin/src/lcd/extui/mks_ui/draw_operation.cpp
@@ -126,10 +126,10 @@ void lv_draw_operation() {
scr = lv_screen_create(OPERATE_UI);
// Create image buttons
- lv_obj_t *buttonPreHeat = lv_imgbtn_create(scr, "F:/bmp_temp.bin", INTERVAL_V, titleHeight, event_handler, ID_O_PRE_HEAT);
- lv_obj_t *buttonFilament = lv_imgbtn_create(scr, "F:/bmp_filamentchange.bin", BTN_X_PIXEL + INTERVAL_V * 2, titleHeight, event_handler, ID_O_FILAMENT);
- lv_obj_t *buttonFan = lv_imgbtn_create(scr, "F:/bmp_fan.bin", BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight, event_handler, ID_O_FAN);
- buttonPowerOff = lv_imgbtn_create(scr, gCfgItems.finish_power_off ? "F:/bmp_auto_off.bin" : "F:/bmp_manual_off.bin", BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight, event_handler, ID_O_POWER_OFF);
+ lv_obj_t *buttonPreHeat = lv_imgbtn_create(scr, "F:/bmp_temp.bin", INTERVAL_W, titleHeight, event_handler, ID_O_PRE_HEAT);
+ lv_obj_t *buttonFilament = lv_imgbtn_create(scr, "F:/bmp_filamentchange.bin", BTN_SIZE_X + INTERVAL_W * 2, titleHeight, event_handler, ID_O_FILAMENT);
+ lv_obj_t *buttonFan = lv_imgbtn_create(scr, "F:/bmp_fan.bin", BTN_SIZE_X * 2 + INTERVAL_W * 3, titleHeight, event_handler, ID_O_FAN);
+ buttonPowerOff = lv_imgbtn_create(scr, gCfgItems.finish_power_off ? "F:/bmp_auto_off.bin" : "F:/bmp_manual_off.bin", BTN_SIZE_X * 3 + INTERVAL_W * 4, titleHeight, event_handler, ID_O_POWER_OFF);
#if HAS_ROTARY_ENCODER
if (gCfgItems.encoder_enable) {
@@ -141,8 +141,8 @@ void lv_draw_operation() {
#endif
if (uiCfg.print_state != WORKING) {
- buttonExtrusion = lv_imgbtn_create(scr, "F:/bmp_extrude_opr.bin", INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_O_EXTRUCT);
- buttonMove = lv_imgbtn_create(scr, "F:/bmp_move_opr.bin", BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_O_MOV);
+ buttonExtrusion = lv_imgbtn_create(scr, "F:/bmp_extrude_opr.bin", INTERVAL_W, BTN_SIZE_Y + INTERVAL_H + titleHeight, event_handler, ID_O_EXTRUCT);
+ buttonMove = lv_imgbtn_create(scr, "F:/bmp_move_opr.bin", BTN_SIZE_X + INTERVAL_W * 2, BTN_SIZE_Y + INTERVAL_H + titleHeight, event_handler, ID_O_MOV);
#if HAS_ROTARY_ENCODER
if (gCfgItems.encoder_enable) {
lv_group_add_obj(g, buttonExtrusion);
@@ -151,8 +151,8 @@ void lv_draw_operation() {
#endif
}
else {
- buttonSpeed = lv_imgbtn_create(scr, "F:/bmp_speed.bin", INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_O_SPEED);
- buttonBabyStep = lv_imgbtn_create(scr, "F:/bmp_mov.bin", BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_O_BABY_STEP);
+ buttonSpeed = lv_imgbtn_create(scr, "F:/bmp_speed.bin", INTERVAL_W, BTN_SIZE_Y + INTERVAL_H + titleHeight, event_handler, ID_O_SPEED);
+ buttonBabyStep = lv_imgbtn_create(scr, "F:/bmp_mov.bin", BTN_SIZE_X + INTERVAL_W * 2, BTN_SIZE_Y + INTERVAL_H + titleHeight, event_handler, ID_O_BABY_STEP);
#if HAS_ROTARY_ENCODER
if (gCfgItems.encoder_enable) {
lv_group_add_obj(g, buttonSpeed);
@@ -161,7 +161,7 @@ void lv_draw_operation() {
#endif
}
- buttonBack = lv_imgbtn_create(scr, "F:/bmp_return.bin", BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_O_RETURN);
+ buttonBack = lv_imgbtn_create(scr, "F:/bmp_return.bin", BTN_SIZE_X * 3 + INTERVAL_W * 4, BTN_SIZE_Y + INTERVAL_H + titleHeight, event_handler, ID_O_RETURN);
#if HAS_ROTARY_ENCODER
if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonBack);
diff --git a/Marlin/src/lcd/extui/mks_ui/draw_preHeat.cpp b/Marlin/src/lcd/extui/mks_ui/draw_preHeat.cpp
index fe289d8cad..a024f050be 100644
--- a/Marlin/src/lcd/extui/mks_ui/draw_preHeat.cpp
+++ b/Marlin/src/lcd/extui/mks_ui/draw_preHeat.cpp
@@ -182,8 +182,8 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) {
void disp_add_dec() {
// Create image buttons
- buttonAdd = lv_big_button_create(scr, "F:/bmp_Add.bin", preheat_menu.add, INTERVAL_V, titleHeight, event_handler, ID_P_ADD);
- buttonDec = lv_big_button_create(scr, "F:/bmp_Dec.bin", preheat_menu.dec, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight, event_handler, ID_P_DEC);
+ buttonAdd = lv_big_button_create(scr, "F:/bmp_Add.bin", preheat_menu.add, INTERVAL_W, titleHeight, event_handler, ID_P_ADD);
+ buttonDec = lv_big_button_create(scr, "F:/bmp_Dec.bin", preheat_menu.dec, BTN_SIZE_X * 3 + INTERVAL_W * 4, titleHeight, event_handler, ID_P_DEC);
}
void lv_draw_preHeat() {
@@ -192,8 +192,8 @@ void lv_draw_preHeat() {
// Create image buttons
disp_add_dec();
- buttonType = lv_imgbtn_create(scr, nullptr, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_P_TYPE);
- buttonStep = lv_imgbtn_create(scr, nullptr, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_P_STEP);
+ buttonType = lv_imgbtn_create(scr, nullptr, INTERVAL_W, BTN_SIZE_Y + INTERVAL_H + titleHeight, event_handler, ID_P_TYPE);
+ buttonStep = lv_imgbtn_create(scr, nullptr, BTN_SIZE_X + INTERVAL_W * 2, BTN_SIZE_Y + INTERVAL_H + titleHeight, event_handler, ID_P_STEP);
if (uiCfg.curTempType == 0) disp_ext_heart();
if (uiCfg.curTempType == 1) disp_ext_heart();
@@ -205,8 +205,8 @@ void lv_draw_preHeat() {
}
#endif
- lv_big_button_create(scr, "F:/bmp_speed0.bin", preheat_menu.off, BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_P_OFF);
- lv_big_button_create(scr, "F:/bmp_return.bin", common_menu.text_back, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_P_RETURN);
+ lv_big_button_create(scr, "F:/bmp_speed0.bin", preheat_menu.off, BTN_SIZE_X * 2 + INTERVAL_W * 3, BTN_SIZE_Y + INTERVAL_H + titleHeight, event_handler, ID_P_OFF);
+ lv_big_button_create(scr, "F:/bmp_return.bin", common_menu.text_back, BTN_SIZE_X * 3 + INTERVAL_W * 4, BTN_SIZE_Y + INTERVAL_H + titleHeight, event_handler, ID_P_RETURN);
// Create labels on the image buttons
labelType = lv_label_create_empty(buttonType);
diff --git a/Marlin/src/lcd/extui/mks_ui/draw_print_file.cpp b/Marlin/src/lcd/extui/mks_ui/draw_print_file.cpp
index 69300ee9c9..4fbd76fccf 100644
--- a/Marlin/src/lcd/extui/mks_ui/draw_print_file.cpp
+++ b/Marlin/src/lcd/extui/mks_ui/draw_print_file.cpp
@@ -241,9 +241,9 @@ void disp_gcode_icon(uint8_t file_num) {
scr = lv_screen_create(PRINT_FILE_UI, "");
// Create image buttons
- buttonPageUp = lv_imgbtn_create(scr, "F:/bmp_pageUp.bin", OTHER_BTN_XPIEL * 3 + INTERVAL_V * 4, titleHeight, event_handler, ID_P_UP);
- buttonPageDown = lv_imgbtn_create(scr, "F:/bmp_pageDown.bin", OTHER_BTN_XPIEL * 3 + INTERVAL_V * 4, titleHeight + OTHER_BTN_YPIEL + INTERVAL_H, event_handler, ID_P_DOWN);
- buttonBack = lv_imgbtn_create(scr, "F:/bmp_back.bin", OTHER_BTN_XPIEL * 3 + INTERVAL_V * 4, titleHeight + OTHER_BTN_YPIEL * 2 + INTERVAL_H * 2, event_handler, ID_P_RETURN);
+ buttonPageUp = lv_imgbtn_create(scr, "F:/bmp_pageUp.bin", OTHER_BTN_SIZE_X * 3 + INTERVAL_W * 4, titleHeight, event_handler, ID_P_UP);
+ buttonPageDown = lv_imgbtn_create(scr, "F:/bmp_pageDown.bin", OTHER_BTN_SIZE_X * 3 + INTERVAL_W * 4, titleHeight + OTHER_BTN_SIZE_Y + INTERVAL_H, event_handler, ID_P_DOWN);
+ buttonBack = lv_imgbtn_create(scr, "F:/bmp_back.bin", OTHER_BTN_SIZE_X * 3 + INTERVAL_W * 4, titleHeight + OTHER_BTN_SIZE_Y * 2 + INTERVAL_H * 2, event_handler, ID_P_RETURN);
// Create labels on the image buttons
for (i = 0; i < FILE_BTN_CNT; i++) {
@@ -273,9 +273,9 @@ void disp_gcode_icon(uint8_t file_num) {
lv_obj_set_event_cb_mks(buttonGcode[i], event_handler, (i + 1), "", 0);
lv_imgbtn_set_src_both(buttonGcode[i], "F:/bmp_dir.bin");
if (i < 3)
- lv_obj_set_pos(buttonGcode[i], BTN_X_PIXEL * i + INTERVAL_V * (i + 1), titleHeight);
+ lv_obj_set_pos(buttonGcode[i], BTN_SIZE_X * i + INTERVAL_W * (i + 1), titleHeight);
else
- lv_obj_set_pos(buttonGcode[i], BTN_X_PIXEL * (i - 3) + INTERVAL_V * ((i - 3) + 1), BTN_Y_PIXEL + INTERVAL_H + titleHeight);
+ lv_obj_set_pos(buttonGcode[i], BTN_SIZE_X * (i - 3) + INTERVAL_W * ((i - 3) + 1), BTN_SIZE_Y + INTERVAL_H + titleHeight);
labelPageUp[i] = lv_label_create(buttonGcode[i], public_buf_m);
lv_obj_align(labelPageUp[i], buttonGcode[i], LV_ALIGN_IN_BOTTOM_MID, 0, -5);
@@ -292,7 +292,7 @@ void disp_gcode_icon(uint8_t file_num) {
lv_obj_set_event_cb_mks(buttonGcode[i], event_handler, (i + 1), test_public_buf_l, 0);
lv_imgbtn_set_src_both(buttonGcode[i], buttonGcode[i]->mks_pic_name);
if (i < 3) {
- lv_obj_set_pos(buttonGcode[i], BTN_X_PIXEL * i + INTERVAL_V * (i + 1) + FILE_PRE_PIC_X_OFFSET, titleHeight + FILE_PRE_PIC_Y_OFFSET);
+ lv_obj_set_pos(buttonGcode[i], BTN_SIZE_X * i + INTERVAL_W * (i + 1) + FILE_PRE_PIC_X_OFFSET, titleHeight + FILE_PRE_PIC_Y_OFFSET);
buttonText[i] = lv_btn_create(scr, nullptr);
//lv_obj_set_event_cb(buttonText[i], event_handler);
@@ -300,11 +300,11 @@ void disp_gcode_icon(uint8_t file_num) {
lv_obj_clear_protect(buttonText[i], LV_PROTECT_FOLLOW);
lv_btn_set_layout(buttonText[i], LV_LAYOUT_OFF);
//lv_obj_set_event_cb_mks(buttonText[i], event_handler,(i+10),"", 0);
- lv_obj_set_pos(buttonText[i], BTN_X_PIXEL * i + INTERVAL_V * (i + 1) + FILE_PRE_PIC_X_OFFSET, titleHeight + FILE_PRE_PIC_Y_OFFSET + 100);
+ lv_obj_set_pos(buttonText[i], BTN_SIZE_X * i + INTERVAL_W * (i + 1) + FILE_PRE_PIC_X_OFFSET, titleHeight + FILE_PRE_PIC_Y_OFFSET + 100);
lv_obj_set_size(buttonText[i], 100, 40);
}
else {
- lv_obj_set_pos(buttonGcode[i], BTN_X_PIXEL * (i - 3) + INTERVAL_V * ((i - 3) + 1) + FILE_PRE_PIC_X_OFFSET, BTN_Y_PIXEL + INTERVAL_H + titleHeight + FILE_PRE_PIC_Y_OFFSET);
+ lv_obj_set_pos(buttonGcode[i], BTN_SIZE_X * (i - 3) + INTERVAL_W * ((i - 3) + 1) + FILE_PRE_PIC_X_OFFSET, BTN_SIZE_Y + INTERVAL_H + titleHeight + FILE_PRE_PIC_Y_OFFSET);
buttonText[i] = lv_btn_create(scr, nullptr);
//lv_obj_set_event_cb(buttonText[i], event_handler);
@@ -312,7 +312,7 @@ void disp_gcode_icon(uint8_t file_num) {
lv_obj_clear_protect(buttonText[i], LV_PROTECT_FOLLOW);
lv_btn_set_layout(buttonText[i], LV_LAYOUT_OFF);
//lv_obj_set_event_cb_mks(buttonText[i], event_handler,(i+10),"", 0);
- lv_obj_set_pos(buttonText[i], BTN_X_PIXEL * (i - 3) + INTERVAL_V * ((i - 3) + 1) + FILE_PRE_PIC_X_OFFSET, BTN_Y_PIXEL + INTERVAL_H + titleHeight + FILE_PRE_PIC_Y_OFFSET + 100);
+ lv_obj_set_pos(buttonText[i], BTN_SIZE_X * (i - 3) + INTERVAL_W * ((i - 3) + 1) + FILE_PRE_PIC_X_OFFSET, BTN_SIZE_Y + INTERVAL_H + titleHeight + FILE_PRE_PIC_Y_OFFSET + 100);
lv_obj_set_size(buttonText[i], 100, 40);
}
labelPageUp[i] = lv_label_create(buttonText[i], public_buf_m);
@@ -322,9 +322,9 @@ void disp_gcode_icon(uint8_t file_num) {
lv_obj_set_event_cb_mks(buttonGcode[i], event_handler, (i + 1), "", 0);
lv_imgbtn_set_src_both(buttonGcode[i], "F:/bmp_file.bin");
if (i < 3)
- lv_obj_set_pos(buttonGcode[i], BTN_X_PIXEL * i + INTERVAL_V * (i + 1), titleHeight);
+ lv_obj_set_pos(buttonGcode[i], BTN_SIZE_X * i + INTERVAL_W * (i + 1), titleHeight);
else
- lv_obj_set_pos(buttonGcode[i], BTN_X_PIXEL * (i - 3) + INTERVAL_V * ((i - 3) + 1), BTN_Y_PIXEL + INTERVAL_H + titleHeight);
+ lv_obj_set_pos(buttonGcode[i], BTN_SIZE_X * (i - 3) + INTERVAL_W * ((i - 3) + 1), BTN_SIZE_Y + INTERVAL_H + titleHeight);
labelPageUp[i] = lv_label_create(buttonGcode[i], public_buf_m);
lv_obj_align(labelPageUp[i], buttonGcode[i], LV_ALIGN_IN_BOTTOM_MID, 0, -5);
diff --git a/Marlin/src/lcd/extui/mks_ui/draw_set.cpp b/Marlin/src/lcd/extui/mks_ui/draw_set.cpp
index aadf0d98f0..f991b615f6 100644
--- a/Marlin/src/lcd/extui/mks_ui/draw_set.cpp
+++ b/Marlin/src/lcd/extui/mks_ui/draw_set.cpp
@@ -112,18 +112,18 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) {
void lv_draw_set() {
scr = lv_screen_create(SET_UI);
- lv_big_button_create(scr, "F:/bmp_eeprom_settings.bin", set_menu.eepromSet, INTERVAL_V, titleHeight, event_handler, ID_S_EEPROM_SET);
- lv_big_button_create(scr, "F:/bmp_fan.bin", set_menu.fan, BTN_X_PIXEL + INTERVAL_V * 2, titleHeight, event_handler, ID_S_FAN);
- lv_big_button_create(scr, "F:/bmp_about.bin", set_menu.about, BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight, event_handler, ID_S_ABOUT);
- lv_big_button_create(scr, ENABLED(HAS_SUICIDE) ? "F:/bmp_manual_off.bin" : "F:/bmp_function1.bin", set_menu.TERN(HAS_SUICIDE, shutdown, motoroff), BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight, event_handler, ID_S_MOTOR_OFF);
- lv_big_button_create(scr, "F:/bmp_machine_para.bin", set_menu.machine_para, INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_S_MACHINE_PARA);
+ lv_big_button_create(scr, "F:/bmp_eeprom_settings.bin", set_menu.eepromSet, INTERVAL_W, titleHeight, event_handler, ID_S_EEPROM_SET);
+ lv_big_button_create(scr, "F:/bmp_fan.bin", set_menu.fan, BTN_SIZE_X + INTERVAL_W * 2, titleHeight, event_handler, ID_S_FAN);
+ lv_big_button_create(scr, "F:/bmp_about.bin", set_menu.about, BTN_SIZE_X * 2 + INTERVAL_W * 3, titleHeight, event_handler, ID_S_ABOUT);
+ lv_big_button_create(scr, ENABLED(HAS_SUICIDE) ? "F:/bmp_manual_off.bin" : "F:/bmp_function1.bin", set_menu.TERN(HAS_SUICIDE, shutdown, motoroff), BTN_SIZE_X * 3 + INTERVAL_W * 4, titleHeight, event_handler, ID_S_MOTOR_OFF);
+ lv_big_button_create(scr, "F:/bmp_machine_para.bin", set_menu.machine_para, INTERVAL_W, BTN_SIZE_Y + INTERVAL_H + titleHeight, event_handler, ID_S_MACHINE_PARA);
#if HAS_LANG_SELECT_SCREEN
- lv_big_button_create(scr, "F:/bmp_language.bin", set_menu.language, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_S_LANGUAGE);
+ lv_big_button_create(scr, "F:/bmp_language.bin", set_menu.language, BTN_SIZE_X + INTERVAL_W * 2, BTN_SIZE_Y + INTERVAL_H + titleHeight, event_handler, ID_S_LANGUAGE);
#endif
#if ENABLED(MKS_WIFI_MODULE)
- lv_big_button_create(scr, "F:/bmp_wifi.bin", set_menu.wifi, BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_S_WIFI);
+ lv_big_button_create(scr, "F:/bmp_wifi.bin", set_menu.wifi, BTN_SIZE_X * 2 + INTERVAL_W * 3, BTN_SIZE_Y + INTERVAL_H + titleHeight, event_handler, ID_S_WIFI);
#endif
- lv_big_button_create(scr, "F:/bmp_return.bin", common_menu.text_back, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_S_RETURN);
+ lv_big_button_create(scr, "F:/bmp_return.bin", common_menu.text_back, BTN_SIZE_X * 3 + INTERVAL_W * 4, BTN_SIZE_Y + INTERVAL_H + titleHeight, event_handler, ID_S_RETURN);
}
void lv_clear_set() {
diff --git a/Marlin/src/lcd/extui/mks_ui/draw_tool.cpp b/Marlin/src/lcd/extui/mks_ui/draw_tool.cpp
index 66b30342b2..34df931764 100644
--- a/Marlin/src/lcd/extui/mks_ui/draw_tool.cpp
+++ b/Marlin/src/lcd/extui/mks_ui/draw_tool.cpp
@@ -84,14 +84,14 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) {
void lv_draw_tool() {
scr = lv_screen_create(TOOL_UI);
- lv_big_button_create(scr, "F:/bmp_preHeat.bin", tool_menu.preheat, INTERVAL_V, titleHeight, event_handler, ID_T_PRE_HEAT);
- lv_big_button_create(scr, "F:/bmp_extruct.bin", tool_menu.extrude, BTN_X_PIXEL + INTERVAL_V * 2, titleHeight, event_handler, ID_T_EXTRUCT);
- lv_big_button_create(scr, "F:/bmp_mov.bin", tool_menu.move, BTN_X_PIXEL * 2 + INTERVAL_V * 3, titleHeight, event_handler, ID_T_MOV);
- lv_big_button_create(scr, "F:/bmp_zero.bin", tool_menu.home, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight, event_handler, ID_T_HOME);
- lv_big_button_create(scr, "F:/bmp_leveling.bin", tool_menu.TERN(AUTO_BED_LEVELING_BILINEAR, autoleveling, leveling), INTERVAL_V, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_T_LEVELING);
- lv_big_button_create(scr, "F:/bmp_filamentchange.bin", tool_menu.filament, BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_T_FILAMENT);
- lv_big_button_create(scr, "F:/bmp_more.bin", tool_menu.more, BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_T_MORE);
- lv_big_button_create(scr, "F:/bmp_return.bin", common_menu.text_back, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_T_RETURN);
+ lv_big_button_create(scr, "F:/bmp_preHeat.bin", tool_menu.preheat, INTERVAL_W, titleHeight, event_handler, ID_T_PRE_HEAT);
+ lv_big_button_create(scr, "F:/bmp_extruct.bin", tool_menu.extrude, BTN_SIZE_X + INTERVAL_W * 2, titleHeight, event_handler, ID_T_EXTRUCT);
+ lv_big_button_create(scr, "F:/bmp_mov.bin", tool_menu.move, BTN_SIZE_X * 2 + INTERVAL_W * 3, titleHeight, event_handler, ID_T_MOV);
+ lv_big_button_create(scr, "F:/bmp_zero.bin", tool_menu.home, BTN_SIZE_X * 3 + INTERVAL_W * 4, titleHeight, event_handler, ID_T_HOME);
+ lv_big_button_create(scr, "F:/bmp_leveling.bin", tool_menu.TERN(AUTO_BED_LEVELING_BILINEAR, autoleveling, leveling), INTERVAL_W, BTN_SIZE_Y + INTERVAL_H + titleHeight, event_handler, ID_T_LEVELING);
+ lv_big_button_create(scr, "F:/bmp_filamentchange.bin", tool_menu.filament, BTN_SIZE_X + INTERVAL_W * 2, BTN_SIZE_Y + INTERVAL_H + titleHeight, event_handler, ID_T_FILAMENT);
+ lv_big_button_create(scr, "F:/bmp_more.bin", tool_menu.more, BTN_SIZE_X * 2 + INTERVAL_W * 3, BTN_SIZE_Y + INTERVAL_H + titleHeight, event_handler, ID_T_MORE);
+ lv_big_button_create(scr, "F:/bmp_return.bin", common_menu.text_back, BTN_SIZE_X * 3 + INTERVAL_W * 4, BTN_SIZE_Y + INTERVAL_H + titleHeight, event_handler, ID_T_RETURN);
}
void lv_clear_tool() {
diff --git a/Marlin/src/lcd/extui/mks_ui/draw_touch_calibration.cpp b/Marlin/src/lcd/extui/mks_ui/draw_touch_calibration.cpp
index 0fd2aa0ee9..a24d66a60d 100644
--- a/Marlin/src/lcd/extui/mks_ui/draw_touch_calibration.cpp
+++ b/Marlin/src/lcd/extui/mks_ui/draw_touch_calibration.cpp
@@ -86,7 +86,7 @@ void lv_update_touch_calibration_screen() {
// end calibration
str = stage == CALIBRATION_SUCCESS ? GET_TEXT(MSG_CALIBRATION_COMPLETED) : GET_TEXT(MSG_CALIBRATION_FAILED);
touch_calibration.calibration_end();
- lv_big_button_create(scr, "F:/bmp_return.bin", common_menu.text_back, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_TC_RETURN);
+ lv_big_button_create(scr, "F:/bmp_return.bin", common_menu.text_back, BTN_SIZE_X * 3 + INTERVAL_H * 4, BTN_SIZE_Y + INTERVAL_W + titleHeight, event_handler, ID_TC_RETURN);
}
// draw current message
diff --git a/Marlin/src/lcd/extui/mks_ui/draw_ui.cpp b/Marlin/src/lcd/extui/mks_ui/draw_ui.cpp
index 875f2d8e72..2779db5b02 100644
--- a/Marlin/src/lcd/extui/mks_ui/draw_ui.cpp
+++ b/Marlin/src/lcd/extui/mks_ui/draw_ui.cpp
@@ -1144,9 +1144,9 @@ lv_obj_t* lv_screen_create(DISP_STATE newScreenType, const char *title) {
// title
lv_obj_t *titleLabel = nullptr;
if (!title)
- titleLabel = lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, creat_title_text());
+ titleLabel = lv_label_create(scr, TITLE_POS_X, TITLE_POS_Y, creat_title_text());
else if (title[0] != '\0')
- titleLabel = lv_label_create(scr, TITLE_XPOS, TITLE_YPOS, title);
+ titleLabel = lv_label_create(scr, TITLE_POS_X, TITLE_POS_Y, title);
if (titleLabel)
lv_obj_set_style(titleLabel, &tft_style_label_rel);
diff --git a/Marlin/src/lcd/extui/mks_ui/draw_ui.h b/Marlin/src/lcd/extui/mks_ui/draw_ui.h
index 33a0764d2c..316e5edca3 100644
--- a/Marlin/src/lcd/extui/mks_ui/draw_ui.h
+++ b/Marlin/src/lcd/extui/mks_ui/draw_ui.h
@@ -113,21 +113,21 @@
#define titleHeight 36 // TFT_screen.title_high
#define INTERVAL_H 2 // TFT_screen.gap_h // 2
- #define INTERVAL_V 2 // TFT_screen.gap_v // 2
- #define BTN_X_PIXEL 117 // TFT_screen.btn_x_pixel
- #define BTN_Y_PIXEL 140 // TFT_screen.btn_y_pixel
+ #define INTERVAL_W 2 // TFT_screen.gap_v // 2
+ #define BTN_SIZE_X 117 // TFT_screen.btn_x_pixel
+ #define BTN_SIZE_Y 140 // TFT_screen.btn_y_pixel
#define SIMPLE_FIRST_PAGE_GRAP 30
#define BUTTON_TEXT_Y_OFFSET -20
- #define TITLE_XPOS 3 // TFT_screen.title_xpos
- #define TITLE_YPOS 5 // TFT_screen.title_ypos
+ #define TITLE_POS_X 3 // TFT_screen.title_xpos
+ #define TITLE_POS_Y 5 // TFT_screen.title_ypos
#define FILE_BTN_CNT 6
- #define OTHER_BTN_XPIEL 117
- #define OTHER_BTN_YPIEL 92
+ #define OTHER_BTN_SIZE_X 117
+ #define OTHER_BTN_SIZE_Y 92
#define FILE_PRE_PIC_X_OFFSET 8
#define FILE_PRE_PIC_Y_OFFSET 0
diff --git a/Marlin/src/lcd/extui/mks_ui/draw_wifi.cpp b/Marlin/src/lcd/extui/mks_ui/draw_wifi.cpp
index c12449f316..f2285c450a 100644
--- a/Marlin/src/lcd/extui/mks_ui/draw_wifi.cpp
+++ b/Marlin/src/lcd/extui/mks_ui/draw_wifi.cpp
@@ -71,9 +71,9 @@ void lv_draw_wifi() {
if (gCfgItems.wifi_mode_sel == STA_MODEL) {
if (gCfgItems.cloud_enable)
- buttonCloud = lv_imgbtn_create(scr, "F:/bmp_cloud.bin", BTN_X_PIXEL + INTERVAL_V * 2, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_W_CLOUD);
+ buttonCloud = lv_imgbtn_create(scr, "F:/bmp_cloud.bin", BTN_SIZE_X + INTERVAL_W * 2, BTN_SIZE_Y + INTERVAL_H + titleHeight, event_handler, ID_W_CLOUD);
- buttonReconnect = lv_imgbtn_create(scr, "F:/bmp_wifi.bin", BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_W_RECONNECT);
+ buttonReconnect = lv_imgbtn_create(scr, "F:/bmp_wifi.bin", BTN_SIZE_X * 2 + INTERVAL_W * 3, BTN_SIZE_Y + INTERVAL_H + titleHeight, event_handler, ID_W_RECONNECT);
#if HAS_ROTARY_ENCODER
if (gCfgItems.cloud_enable) lv_group_add_obj(g, buttonCloud);
@@ -85,7 +85,7 @@ void lv_draw_wifi() {
}
// Create an Image button
- lv_obj_t *buttonBack = lv_imgbtn_create(scr, "F:/bmp_return.bin", BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_W_RETURN);
+ lv_obj_t *buttonBack = lv_imgbtn_create(scr, "F:/bmp_return.bin", BTN_SIZE_X * 3 + INTERVAL_W * 4, BTN_SIZE_Y + INTERVAL_H + titleHeight, event_handler, ID_W_RETURN);
if (enc_ena) lv_group_add_obj(g, buttonBack);
lv_obj_t *label_Back = lv_label_create_empty(buttonBack);
diff --git a/Marlin/src/lcd/extui/mks_ui/draw_wifi_list.cpp b/Marlin/src/lcd/extui/mks_ui/draw_wifi_list.cpp
index 6283b1dc58..56010c3583 100644
--- a/Marlin/src/lcd/extui/mks_ui/draw_wifi_list.cpp
+++ b/Marlin/src/lcd/extui/mks_ui/draw_wifi_list.cpp
@@ -92,8 +92,8 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) {
void lv_draw_wifi_list() {
scr = lv_screen_create(WIFI_LIST_UI);
- lv_obj_t *buttonDown = lv_imgbtn_create(scr, "F:/bmp_pageDown.bin", OTHER_BTN_XPIEL * 3 + INTERVAL_V * 4, titleHeight + OTHER_BTN_YPIEL + INTERVAL_H, event_handler, ID_WL_DOWN);
- lv_obj_t *buttonBack = lv_imgbtn_create(scr, "F:/bmp_back.bin", OTHER_BTN_XPIEL * 3 + INTERVAL_V * 4, titleHeight + (OTHER_BTN_YPIEL + INTERVAL_H) * 2, event_handler, ID_WL_RETURN);
+ lv_obj_t *buttonDown = lv_imgbtn_create(scr, "F:/bmp_pageDown.bin", OTHER_BTN_SIZE_X * 3 + INTERVAL_W * 4, titleHeight + OTHER_BTN_SIZE_Y + INTERVAL_H, event_handler, ID_WL_DOWN);
+ lv_obj_t *buttonBack = lv_imgbtn_create(scr, "F:/bmp_back.bin", OTHER_BTN_SIZE_X * 3 + INTERVAL_W * 4, titleHeight + (OTHER_BTN_SIZE_Y + INTERVAL_H) * 2, event_handler, ID_WL_RETURN);
for (uint8_t i = 0; i < NUMBER_OF_PAGE; i++) {
buttonWifiN[i] = lv_label_btn_create(scr, 0, NAME_BTN_Y * i + 10 + titleHeight, NAME_BTN_X, NAME_BTN_Y, event_handler, i + 1);
diff --git a/Marlin/src/lcd/extui/mks_ui/draw_z_offset_wizard.cpp b/Marlin/src/lcd/extui/mks_ui/draw_z_offset_wizard.cpp
index cdd151322b..2ad9816e01 100644
--- a/Marlin/src/lcd/extui/mks_ui/draw_z_offset_wizard.cpp
+++ b/Marlin/src/lcd/extui/mks_ui/draw_z_offset_wizard.cpp
@@ -159,21 +159,21 @@ void lv_draw_z_offset_wizard() {
scr = lv_screen_create(Z_OFFSET_WIZARD_UI, machine_menu.LevelingZoffsetTitle);
- lv_obj_t *buttonXI = lv_big_button_create(scr, "F:/bmp_zAdd.bin", move_menu.z_add, INTERVAL_V, titleHeight, event_handler, ID_M_Z_P);
+ lv_obj_t *buttonXI = lv_big_button_create(scr, "F:/bmp_zAdd.bin", move_menu.z_add, INTERVAL_W, titleHeight, event_handler, ID_M_Z_P);
lv_obj_clear_protect(buttonXI, LV_PROTECT_FOLLOW);
- lv_big_button_create(scr, "F:/bmp_zDec.bin", move_menu.z_dec, INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_M_Z_N);
+ lv_big_button_create(scr, "F:/bmp_zDec.bin", move_menu.z_dec, INTERVAL_W * 3, BTN_SIZE_Y + INTERVAL_H + titleHeight, event_handler, ID_M_Z_N);
// button with image and label changed dynamically by disp_move_dist
- buttonV = lv_imgbtn_create(scr, nullptr, BTN_X_PIXEL * 3 + INTERVAL_V * 4, titleHeight, event_handler, ID_M_STEP);
+ buttonV = lv_imgbtn_create(scr, nullptr, BTN_SIZE_X * 3 + INTERVAL_W * 4, titleHeight, event_handler, ID_M_STEP);
labelV = lv_label_create_empty(buttonV);
#if HAS_ROTARY_ENCODER
if (gCfgItems.encoder_enable) lv_group_add_obj(g, buttonV);
#endif
// save and back
- lv_big_button_create(scr, "F:/bmp_return.bin", common_menu.text_save, BTN_X_PIXEL * 2 + INTERVAL_V * 3, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_M_SAVE);
+ lv_big_button_create(scr, "F:/bmp_return.bin", common_menu.text_save, BTN_SIZE_X * 2 + INTERVAL_W * 3, BTN_SIZE_Y + INTERVAL_H + titleHeight, event_handler, ID_M_SAVE);
// cancel and back
- lv_big_button_create(scr, "F:/bmp_return.bin", common_menu.text_back, BTN_X_PIXEL * 3 + INTERVAL_V * 4, BTN_Y_PIXEL + INTERVAL_H + titleHeight, event_handler, ID_M_RETURN);
+ lv_big_button_create(scr, "F:/bmp_return.bin", common_menu.text_back, BTN_SIZE_X * 3 + INTERVAL_W * 4, BTN_SIZE_Y + INTERVAL_H + titleHeight, event_handler, ID_M_RETURN);
// We need to patch the title to leave some space on the right for displaying the status
lv_obj_t * z_offset_ref_title = lv_obj_get_child_back(scr, nullptr);
@@ -183,7 +183,7 @@ void lv_draw_z_offset_wizard() {
// We need to patch the Z Offset to leave some space in the middle for displaying the status
lv_obj_t * title= lv_obj_get_child_back(scr, nullptr);
if (title != nullptr) lv_obj_set_width(title, TFT_WIDTH - 101);
- labelP = lv_label_create(scr, TFT_WIDTH - 100, TITLE_YPOS, "Z:0.0mm");
+ labelP = lv_label_create(scr, TFT_WIDTH - 100, TITLE_POS_Y, "Z:0.0mm");
if (labelP != nullptr)
updatePosTask = lv_task_create(refresh_wizard_pos, 300, LV_TASK_PRIO_LOWEST, 0);
From c09638f821747ff86e3db402aff8f62c7dd8abbc Mon Sep 17 00:00:00 2001
From: staff1010 <132726146+staff1010@users.noreply.github.com>
Date: Tue, 10 Jun 2025 02:37:38 +0800
Subject: [PATCH 066/326] =?UTF-8?q?=F0=9F=9A=B8=20Improve=20XPT2046=20touc?=
=?UTF-8?q?h,=20MKS=20UI=20calibration=20(#27892)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
Marlin/src/HAL/STM32/tft/xpt2046.h | 6 +++++-
Marlin/src/gcode/lcd/M995.cpp | 2 ++
Marlin/src/lcd/extui/mks_ui/draw_touch_calibration.cpp | 2 +-
3 files changed, 8 insertions(+), 2 deletions(-)
diff --git a/Marlin/src/HAL/STM32/tft/xpt2046.h b/Marlin/src/HAL/STM32/tft/xpt2046.h
index 685c9441ae..f3d3e53291 100644
--- a/Marlin/src/HAL/STM32/tft/xpt2046.h
+++ b/Marlin/src/HAL/STM32/tft/xpt2046.h
@@ -49,7 +49,11 @@
#define TOUCH_INT_PIN -1
#endif
-#define XPT2046_DFR_MODE 0x00
+#if PIN_EXISTS(TOUCH_INT)
+ #define XPT2046_DFR_MODE 0x00
+#else
+ #define XPT2046_DFR_MODE 0x01
+#endif
#define XPT2046_SER_MODE 0x04
#define XPT2046_CONTROL 0x80
diff --git a/Marlin/src/gcode/lcd/M995.cpp b/Marlin/src/gcode/lcd/M995.cpp
index d5f825c0c8..2b698a5c58 100644
--- a/Marlin/src/gcode/lcd/M995.cpp
+++ b/Marlin/src/gcode/lcd/M995.cpp
@@ -28,6 +28,7 @@
#if HAS_TFT_LVGL_UI
#include "../../lcd/extui/mks_ui/draw_touch_calibration.h"
+ #include "../../lcd/extui/mks_ui/draw_ui.h"
#else
#include "../../lcd/menu/menu.h"
#endif
@@ -38,6 +39,7 @@
void GcodeSuite::M995() {
#if HAS_TFT_LVGL_UI
+ clear_cur_ui();
lv_draw_touch_calibration_screen();
#else
ui.goto_screen(touch_screen_calibration);
diff --git a/Marlin/src/lcd/extui/mks_ui/draw_touch_calibration.cpp b/Marlin/src/lcd/extui/mks_ui/draw_touch_calibration.cpp
index a24d66a60d..25c50a2436 100644
--- a/Marlin/src/lcd/extui/mks_ui/draw_touch_calibration.cpp
+++ b/Marlin/src/lcd/extui/mks_ui/draw_touch_calibration.cpp
@@ -86,7 +86,7 @@ void lv_update_touch_calibration_screen() {
// end calibration
str = stage == CALIBRATION_SUCCESS ? GET_TEXT(MSG_CALIBRATION_COMPLETED) : GET_TEXT(MSG_CALIBRATION_FAILED);
touch_calibration.calibration_end();
- lv_big_button_create(scr, "F:/bmp_return.bin", common_menu.text_back, BTN_SIZE_X * 3 + INTERVAL_H * 4, BTN_SIZE_Y + INTERVAL_W + titleHeight, event_handler, ID_TC_RETURN);
+ lv_big_button_create(scr, "F:/bmp_return.bin", common_menu.text_back, 180, BTN_SIZE_Y + INTERVAL_H + titleHeight, event_handler, ID_TC_RETURN);
}
// draw current message
From fbce32740205da4b8cafef56cadd9ddb81b37306 Mon Sep 17 00:00:00 2001
From: Scott Lahteine
Date: Sun, 8 Jun 2025 16:37:39 -0500
Subject: [PATCH 067/326] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20TMC?=
=?UTF-8?q?Stepper=20=3D>=200.8.7?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
ini/features.ini | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/ini/features.ini b/ini/features.ini
index 69ec43f030..d2e0f9d92e 100644
--- a/ini/features.ini
+++ b/ini/features.ini
@@ -20,7 +20,7 @@ MARLIN_TEST_BUILD = build_src_filter=+
POSTMORTEM_DEBUGGING = build_src_filter=+ +
build_flags=-funwind-tables
MKS_WIFI_MODULE = QRCode=https://github.com/makerbase-mks/QRCode/archive/261c5a696a.zip
-HAS_TRINAMIC_CONFIG = TMCStepper=https://github.com/MarlinFirmware/TMCStepper/archive/v0.8.6.zip
+HAS_TRINAMIC_CONFIG = TMCStepper=https://github.com/MarlinFirmware/TMCStepper/archive/v0.8.7.zip
build_src_filter=+ + + +