From d9229ff3557808fbebdfd63927cbdc33e807b75d Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 10 Mar 2025 19:01:37 -0500 Subject: [PATCH 01/74] =?UTF-8?q?=F0=9F=94=A8=20Fix=20CONFIG=5FEXPORT=201,?= =?UTF-8?q?=20(embed=20=3D=20101)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Followup to #27628 See #27612 --- buildroot/share/PlatformIO/scripts/signature.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/buildroot/share/PlatformIO/scripts/signature.py b/buildroot/share/PlatformIO/scripts/signature.py index a5c92cff17..5cda69d89b 100755 --- a/buildroot/share/PlatformIO/scripts/signature.py +++ b/buildroot/share/PlatformIO/scripts/signature.py @@ -195,9 +195,9 @@ def compute_build_signature(env): # Get the CONFIG_EXPORT value and do an extended dump if > 100 # For example, CONFIG_EXPORT 102 will make a 'config.ini' with a [config:] group for each schema @section - config_dump = tryint('CONFIG_EXPORT') + config_dump = 101 if is_embed else tryint('CONFIG_EXPORT') extended_dump = config_dump > 100 - if extended_dump: config_dump -= 100 + config_dump %= 100 # Get the schema class for exports that require it if config_dump in (3, 4) or (extended_dump and config_dump in (2, 5)): @@ -451,7 +451,7 @@ f'''# # Produce a JSON file for CONFIGURATION_EMBEDDING or CONFIG_EXPORT == 1 or 101 # Skip if an identical JSON file was already present. # - if not same_hash and (config_dump == 1 or is_embed): + if not same_hash and config_dump == 1: with marlin_json.open('w') as outfile: json_data = {} @@ -468,12 +468,11 @@ f'''# json_data[header][s][name] = c['value'] else: for header in real_config: - json_data[header] = {} conf = real_config[header] #print(f"real_config[{header}]", conf) for name in conf: if name in ignore: continue - json_data[header][name] = conf[name]['value'] + json_data[name] = conf[name]['value'] json_data['__INITIAL_HASH'] = hashes From e6ccf3b72bb399123a4069a1b39f2cb5f2440bda Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Tue, 11 Mar 2025 00:28:55 +0000 Subject: [PATCH 02/74] [cron] Bump distribution date (2025-03-11) --- 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 57052419cd..88dc0e3556 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-03-10" +//#define STRING_DISTRIBUTION_DATE "2025-03-11" /** * 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 59c33ace52..6d867bfe41 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-03-10" + #define STRING_DISTRIBUTION_DATE "2025-03-11" #endif /** From 953b6844cac78b3a84a0a4647ae9d08edd88bb42 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 10 Mar 2025 22:12:21 -0500 Subject: [PATCH 03/74] =?UTF-8?q?=F0=9F=93=9D=20Config=20comments=20with?= =?UTF-8?q?=20units?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/Configuration_adv.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 6e64112786..ad62cc06cc 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -2008,7 +2008,7 @@ #if IS_U8GLIB_ST7920 // Enable this option and reduce the value to optimize screen updates. // The normal delay is 10µs. Use the lowest value that still gives a reliable display. - //#define DOGM_SPI_DELAY_US 5 + //#define DOGM_SPI_DELAY_US 5 // (µs) Delay after each SPI transfer //#define LIGHTWEIGHT_UI #if ENABLED(LIGHTWEIGHT_UI) @@ -2261,7 +2261,7 @@ // ADC Button Debounce // #if HAS_ADC_BUTTONS - #define ADC_BUTTON_DEBOUNCE_DELAY 16 // Increase if buttons bounce or repeat too fast + #define ADC_BUTTON_DEBOUNCE_DELAY 16 // (count) Increase if buttons bounce or repeat too fast #endif // @section safety @@ -2302,7 +2302,7 @@ //#define DOUBLECLICK_FOR_Z_BABYSTEPPING // Double-click on the Status Screen for Z Babystepping. #if ENABLED(DOUBLECLICK_FOR_Z_BABYSTEPPING) - #define DOUBLECLICK_MAX_INTERVAL 1250 // Maximum interval between clicks, in milliseconds. + #define DOUBLECLICK_MAX_INTERVAL 1250 // (ms) Maximum interval between clicks. // Note: Extra time may be added to mitigate controller latency. //#define MOVE_Z_WHEN_IDLE // Jump to the move Z menu on double-click when printer is idle. #if ENABLED(MOVE_Z_WHEN_IDLE) From d74ee8ccc4398508bf2be296b9606289b2162769 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Wed, 12 Mar 2025 00:28:38 +0000 Subject: [PATCH 04/74] [cron] Bump distribution date (2025-03-12) --- 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 88dc0e3556..bc0f6cf36e 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-03-11" +//#define STRING_DISTRIBUTION_DATE "2025-03-12" /** * 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 6d867bfe41..3edafa18df 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-03-11" + #define STRING_DISTRIBUTION_DATE "2025-03-12" #endif /** From 01990f2bf4ec8f528437d7f0008423b14ca31e5f Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 12 Mar 2025 17:28:22 -0500 Subject: [PATCH 05/74] =?UTF-8?q?=F0=9F=93=9D=20Document=20planner=20modif?= =?UTF-8?q?ier=20methods?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/feature/twibus.h | 4 ++-- Marlin/src/lcd/menu/menu_probe_offset.cpp | 2 +- Marlin/src/module/planner.h | 18 ++++++++++++++++-- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/Marlin/src/feature/twibus.h b/Marlin/src/feature/twibus.h index de23abbed5..b438d10a33 100644 --- a/Marlin/src/feature/twibus.h +++ b/Marlin/src/feature/twibus.h @@ -64,7 +64,7 @@ class TWIBus { private: /** * @brief Number of bytes on buffer - * @description Number of bytes in the buffer waiting to be flushed to the bus + * @details Number of bytes in the buffer waiting to be flushed to the bus */ uint8_t buffer_s = 0; @@ -77,7 +77,7 @@ class TWIBus { public: /** * @brief Target device address - * @description The target device address. Persists until changed. + * @details The target device address. Persists until changed. */ uint8_t addr = 0; diff --git a/Marlin/src/lcd/menu/menu_probe_offset.cpp b/Marlin/src/lcd/menu/menu_probe_offset.cpp index ee3689aac2..a0b7c2bed4 100644 --- a/Marlin/src/lcd/menu/menu_probe_offset.cpp +++ b/Marlin/src/lcd/menu/menu_probe_offset.cpp @@ -96,7 +96,7 @@ void probe_offset_wizard_menu() { /** * @fn prepare_for_probe_offset_wizard * @brief Prepare the Probe Offset Wizard to do user interaction. - * @description + * @details * 1. Probe a defined point (or the center) for an initial Probe Reference Z (relative to the homed Z0). * (When homing with the probe, this Z0 is suspect until 'M851 Z' is properly tuned. * When homing with a Z endstop Z0 is suspect until M206 is properly tuned.) diff --git a/Marlin/src/module/planner.h b/Marlin/src/module/planner.h index 53717ca0a7..b2df5824de 100644 --- a/Marlin/src/module/planner.h +++ b/Marlin/src/module/planner.h @@ -782,13 +782,27 @@ class Planner { #endif #if HAS_POSITION_MODIFIERS - FORCE_INLINE static void apply_modifiers(xyze_pos_t &pos, bool leveling=ENABLED(PLANNER_LEVELING)) { + /** + * @brief Apply Skew, Leveling, and Retraction modifiers to the given cartesian position. + * @details By default leveling is only applied if the planner is the leveling handler (i.e., PLANNER_LEVELING). + * + * @param pos The position to modify + * @param leveling Optional bool whether to include the leveling modifier + */ + FORCE_INLINE static void apply_modifiers(xyze_pos_t &pos, const bool leveling=ENABLED(PLANNER_LEVELING)) { TERN_(SKEW_CORRECTION, skew(pos)); if (leveling) apply_leveling(pos); TERN_(FWRETRACT, apply_retract(pos)); } - FORCE_INLINE static void unapply_modifiers(xyze_pos_t &pos, bool leveling=ENABLED(PLANNER_LEVELING)) { + /** + * @brief Un-apply Skew, Leveling, and Retraction modifiers to the given cartesian position. + * @details By default leveling is only un-applied if the planner is the leveling handler (i.e., PLANNER_LEVELING). + * + * @param pos The position to un-modify + * @param leveling Optional bool whether to include the leveling modifier + */ + FORCE_INLINE static void unapply_modifiers(xyze_pos_t &pos, const bool leveling=ENABLED(PLANNER_LEVELING)) { TERN_(FWRETRACT, unapply_retract(pos)); if (leveling) unapply_leveling(pos); TERN_(SKEW_CORRECTION, unskew(pos)); From 5766dc0ece17ff67b30da1dc1efc6f55d9515e3a Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Thu, 13 Mar 2025 00:29:12 +0000 Subject: [PATCH 06/74] [cron] Bump distribution date (2025-03-13) --- 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 bc0f6cf36e..b7759c5e65 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-03-12" +//#define STRING_DISTRIBUTION_DATE "2025-03-13" /** * 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 3edafa18df..958bf98148 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-03-12" + #define STRING_DISTRIBUTION_DATE "2025-03-13" #endif /** From 4cf4647c9acb17afadb712152a0243ac11576122 Mon Sep 17 00:00:00 2001 From: ellensp <530024+ellensp@users.noreply.github.com> Date: Thu, 13 Mar 2025 14:35:12 +1300 Subject: [PATCH 07/74] =?UTF-8?q?=F0=9F=94=A7=20More=20serial=20ports=20fo?= =?UTF-8?q?r=20Teensy=20HALs=20(#27736)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Followup to #27648 Co-authored-by: Scott Lahteine --- Marlin/src/HAL/TEENSY31_32/HAL.cpp | 16 +++++++++++++--- Marlin/src/HAL/TEENSY35_36/HAL.cpp | 15 +++++++++++++-- Marlin/src/HAL/TEENSY40_41/HAL.cpp | 20 +++++++++++--------- 3 files changed, 37 insertions(+), 14 deletions(-) diff --git a/Marlin/src/HAL/TEENSY31_32/HAL.cpp b/Marlin/src/HAL/TEENSY31_32/HAL.cpp index 2892368967..f54025991d 100644 --- a/Marlin/src/HAL/TEENSY31_32/HAL.cpp +++ b/Marlin/src/HAL/TEENSY31_32/HAL.cpp @@ -37,10 +37,20 @@ #define _IMPLEMENT_SERIAL(X) DefaultSerial##X MSerial##X(false, Serial##X) #define IMPLEMENT_SERIAL(X) _IMPLEMENT_SERIAL(X) -#if WITHIN(SERIAL_PORT, 0, 3) +#if WITHIN(SERIAL_PORT, SERIAL_INDEX_MIN, SERIAL_INDEX_MAX) IMPLEMENT_SERIAL(SERIAL_PORT); -#else - #error "SERIAL_PORT must be from 0 to 3." +#endif +#if defined(SERIAL_PORT_2) && WITHIN(SERIAL_PORT_2, SERIAL_INDEX_MIN, SERIAL_INDEX_MAX) + IMPLEMENT_SERIAL(SERIAL_PORT_2); +#endif +#if defined(SERIAL_PORT_3) && WITHIN(SERIAL_PORT_3, SERIAL_INDEX_MIN, SERIAL_INDEX_MAX) + IMPLEMENT_SERIAL(SERIAL_PORT_3); +#endif +#if defined(MMU_SERIAL_PORT) && WITHIN(MMU_SERIAL_PORT, SERIAL_INDEX_MIN, SERIAL_INDEX_MAX) + IMPLEMENT_SERIAL(MMU_SERIAL_PORT); +#endif +#if defined(LCD_SERIAL_PORT) && WITHIN(LCD_SERIAL_PORT, SERIAL_INDEX_MIN, SERIAL_INDEX_MAX) + IMPLEMENT_SERIAL(LCD_SERIAL_PORT); #endif USBSerialType USBSerial(false, SerialUSB); diff --git a/Marlin/src/HAL/TEENSY35_36/HAL.cpp b/Marlin/src/HAL/TEENSY35_36/HAL.cpp index bc02ac1c45..f41582be30 100644 --- a/Marlin/src/HAL/TEENSY35_36/HAL.cpp +++ b/Marlin/src/HAL/TEENSY35_36/HAL.cpp @@ -37,10 +37,21 @@ #define _IMPLEMENT_SERIAL(X) DefaultSerial##X MSerial##X(false, Serial##X) #define IMPLEMENT_SERIAL(X) _IMPLEMENT_SERIAL(X) -#if WITHIN(SERIAL_PORT, 0, 3) +#if WITHIN(SERIAL_PORT, SERIAL_INDEX_MIN, SERIAL_INDEX_MAX) IMPLEMENT_SERIAL(SERIAL_PORT); #endif - +#if defined(SERIAL_PORT_2) && WITHIN(SERIAL_PORT_2, SERIAL_INDEX_MIN, SERIAL_INDEX_MAX) + IMPLEMENT_SERIAL(SERIAL_PORT_2); +#endif +#if defined(SERIAL_PORT_3) && WITHIN(SERIAL_PORT_3, SERIAL_INDEX_MIN, SERIAL_INDEX_MAX) + IMPLEMENT_SERIAL(SERIAL_PORT_3); +#endif +#if defined(MMU_SERIAL_PORT) && WITHIN(MMU_SERIAL_PORT, SERIAL_INDEX_MIN, SERIAL_INDEX_MAX) + IMPLEMENT_SERIAL(MMU_SERIAL_PORT); +#endif +#if defined(LCD_SERIAL_PORT) && WITHIN(LCD_SERIAL_PORT, SERIAL_INDEX_MIN, SERIAL_INDEX_MAX) + IMPLEMENT_SERIAL(LCD_SERIAL_PORT); +#endif USBSerialType USBSerial(false, SerialUSB); // ------------------------ diff --git a/Marlin/src/HAL/TEENSY40_41/HAL.cpp b/Marlin/src/HAL/TEENSY40_41/HAL.cpp index d40f620c81..1f27a283f7 100644 --- a/Marlin/src/HAL/TEENSY40_41/HAL.cpp +++ b/Marlin/src/HAL/TEENSY40_41/HAL.cpp @@ -39,18 +39,20 @@ #define _IMPLEMENT_SERIAL(X) DefaultSerial##X MSerial##X(false, Serial##X) #define IMPLEMENT_SERIAL(X) _IMPLEMENT_SERIAL(X) -#if WITHIN(SERIAL_PORT, 0, 8) +#if WITHIN(SERIAL_PORT, SERIAL_INDEX_MIN, SERIAL_INDEX_MAX) IMPLEMENT_SERIAL(SERIAL_PORT); #endif -#ifdef SERIAL_PORT_2 - #if WITHIN(SERIAL_PORT_2, 0, 8) - IMPLEMENT_SERIAL(SERIAL_PORT_2); - #endif +#if defined(SERIAL_PORT_2) && WITHIN(SERIAL_PORT_2, SERIAL_INDEX_MIN, SERIAL_INDEX_MAX) + IMPLEMENT_SERIAL(SERIAL_PORT_2); #endif -#ifdef SERIAL_PORT_3 - #if WITHIN(SERIAL_PORT_3, 0, 8) - IMPLEMENT_SERIAL(SERIAL_PORT_3); - #endif +#if defined(SERIAL_PORT_3) && WITHIN(SERIAL_PORT_3, SERIAL_INDEX_MIN, SERIAL_INDEX_MAX) + IMPLEMENT_SERIAL(SERIAL_PORT_3); +#endif +#if defined(MMU_SERIAL_PORT) && WITHIN(MMU_SERIAL_PORT, SERIAL_INDEX_MIN, SERIAL_INDEX_MAX) + IMPLEMENT_SERIAL(MMU_SERIAL_PORT); +#endif +#if defined(LCD_SERIAL_PORT) && WITHIN(LCD_SERIAL_PORT, SERIAL_INDEX_MIN, SERIAL_INDEX_MAX) + IMPLEMENT_SERIAL(LCD_SERIAL_PORT); #endif USBSerialType USBSerial(false, SerialUSB); From 0fa3d2642aa6fc329fcb507b5bf32b040c4e201d Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 13 Mar 2025 17:19:23 -0500 Subject: [PATCH 08/74] =?UTF-8?q?=E2=9C=A8=20MIN=5FPOWER=20(#27742)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Followup to #14746 Co-authored-by: mikeshub <2420379+mikeshub@users.noreply.github.com> --- Marlin/Configuration.h | 1 + Marlin/src/inc/Conditionals-1-axes.h | 3 +++ Marlin/src/module/temperature.h | 8 ++++---- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 77a9176115..f804dc605a 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -695,6 +695,7 @@ #define PID_K1 0.95 // Smoothing factor within any PID loop #if ENABLED(PIDTEMP) + //#define MIN_POWER 0 //#define PID_DEBUG // Print PID debug data to the serial port. Use 'M303 D' to toggle activation. //#define PID_PARAMS_PER_HOTEND // Use separate PID parameters for each extruder (useful for mismatched extruders) // Set/get with G-code: M301 E[extruder number, 0-2] diff --git a/Marlin/src/inc/Conditionals-1-axes.h b/Marlin/src/inc/Conditionals-1-axes.h index 5f8dad37b0..e55f69c797 100644 --- a/Marlin/src/inc/Conditionals-1-axes.h +++ b/Marlin/src/inc/Conditionals-1-axes.h @@ -189,6 +189,9 @@ #ifndef HOTEND_OVERSHOOT #define HOTEND_OVERSHOOT 15 #endif + #ifndef MIN_POWER + #define MIN_POWER 0 + #endif #else #undef MPCTEMP #undef PIDTEMP diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index ffc86eb4e5..27e28f07a8 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -367,13 +367,13 @@ typedef struct { float p, i, d, c, f; } raw_pidcf_t; typedef #if ALL(PID_EXTRUSION_SCALING, PID_FAN_SCALING) - PIDCF_t<0, PID_MAX, LPQ_MAX_LEN, PID_FAN_SCALING_MIN_SPEED, PID_FAN_SCALING_LIN_FACTOR> + PIDCF_t #elif ENABLED(PID_EXTRUSION_SCALING) - PIDC_t<0, PID_MAX, LPQ_MAX_LEN> + PIDC_t #elif ENABLED(PID_FAN_SCALING) - PIDF_t<0, PID_MAX, PID_FAN_SCALING_MIN_SPEED, PID_FAN_SCALING_LIN_FACTOR> + PIDF_t #else - PID_t<0, PID_MAX> + PID_t #endif hotend_pid_t; From f0bd400002317b2f7a17288cd16d9ffea43c3db1 Mon Sep 17 00:00:00 2001 From: ellensp <530024+ellensp@users.noreply.github.com> Date: Fri, 14 Mar 2025 11:21:28 +1300 Subject: [PATCH 09/74] =?UTF-8?q?=F0=9F=A9=B9=F0=9F=94=A7=20Fix=20LCD=5FLA?= =?UTF-8?q?NGUAGE=20for=20HD44780=20(#27729)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/inc/Conditionals-2-LCD.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Conditionals-2-LCD.h b/Marlin/src/inc/Conditionals-2-LCD.h index 97f1cbd9c5..40f18c406a 100644 --- a/Marlin/src/inc/Conditionals-2-LCD.h +++ b/Marlin/src/inc/Conditionals-2-LCD.h @@ -649,7 +649,7 @@ #if !HAS_MARLINUI_HD44780 #undef LCD_INFO_SCREEN_STYLE #endif -#if NONE(HAS_MARLINUI_U8GLIB, HAS_TFT_LVGL_UI, TFT_COLOR_UI, DGUS_LCD_UI_E3S1PRO) +#if NONE(HAS_MARLINUI_HD44780, HAS_MARLINUI_U8GLIB, HAS_TFT_LVGL_UI, TFT_COLOR_UI, DGUS_LCD_UI_E3S1PRO) #undef LCD_LANGUAGE #endif #if DISABLED(MPC_AUTOTUNE) From 9e30173b13a8a23f9eefc797fa1908c9bfd96b8f Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Fri, 14 Mar 2025 00:28:40 +0000 Subject: [PATCH 10/74] [cron] Bump distribution date (2025-03-14) --- 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 b7759c5e65..b0bbd83206 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-03-13" +//#define STRING_DISTRIBUTION_DATE "2025-03-14" /** * 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 958bf98148..189d9a1e2e 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-03-13" + #define STRING_DISTRIBUTION_DATE "2025-03-14" #endif /** From 78f871567f56cc73f5b5ed2f5cb4740e93d392e1 Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Fri, 14 Mar 2025 11:11:45 -0700 Subject: [PATCH 11/74] =?UTF-8?q?=F0=9F=94=A8=20Rename=20FYSETC=20S6/Spide?= =?UTF-8?q?r=20envs=20(#27122)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/ci-build-tests.yml | 2 +- Marlin/src/pins/pins.h | 8 ++++---- buildroot/bin/mftest | 2 +- ...c_s6.json => marlin_STM32F446VE_fysetc.json} | 6 +++--- .../PeripheralPins.c | 0 .../PinNamesVar.h | 0 .../ldscript.ld | 0 .../variant.cpp | 0 .../variant.h | 0 .../tests/{FYSETC_S6 => STM32F446VE_fysetc} | 10 +++++----- ini/renamed.ini | 6 ++++++ ini/stm32f4.ini | 17 ++++++++++------- 12 files changed, 30 insertions(+), 21 deletions(-) rename buildroot/share/PlatformIO/boards/{marlin_fysetc_s6.json => marlin_STM32F446VE_fysetc.json} (85%) rename buildroot/share/PlatformIO/variants/{MARLIN_FYSETC_S6 => MARLIN_F446VE_FYSETC}/PeripheralPins.c (100%) rename buildroot/share/PlatformIO/variants/{MARLIN_FYSETC_S6 => MARLIN_F446VE_FYSETC}/PinNamesVar.h (100%) rename buildroot/share/PlatformIO/variants/{MARLIN_FYSETC_S6 => MARLIN_F446VE_FYSETC}/ldscript.ld (100%) rename buildroot/share/PlatformIO/variants/{MARLIN_FYSETC_S6 => MARLIN_F446VE_FYSETC}/variant.cpp (100%) rename buildroot/share/PlatformIO/variants/{MARLIN_FYSETC_S6 => MARLIN_F446VE_FYSETC}/variant.h (100%) rename buildroot/tests/{FYSETC_S6 => STM32F446VE_fysetc} (66%) diff --git a/.github/workflows/ci-build-tests.yml b/.github/workflows/ci-build-tests.yml index 3dabf82f46..320cda5b18 100644 --- a/.github/workflows/ci-build-tests.yml +++ b/.github/workflows/ci-build-tests.yml @@ -113,7 +113,7 @@ jobs: - BTT_GTR_V1_0 - BTT_SKR_PRO - FLYF407ZG - - FYSETC_S6 + - STM32F446VE_fysetc - LERDGEK - LERDGEX - mks_robin_pro2 diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 4e36558ef8..01ff13f8c2 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -786,13 +786,13 @@ #elif MB(LERDGE_X) #include "stm32f4/pins_LERDGE_X.h" // STM32F4 env:LERDGEX env:LERDGEX_usb_flash_drive #elif MB(FYSETC_S6) - #include "stm32f4/pins_FYSETC_S6.h" // STM32F4 env:FYSETC_S6 env:FYSETC_S6_8000 + #include "stm32f4/pins_FYSETC_S6.h" // STM32F4 env:STM32F446VE_fysetc env:STM32F446VE_fysetc_32k_bootloader #elif MB(FYSETC_S6_V2_0) - #include "stm32f4/pins_FYSETC_S6_V2_0.h" // STM32F4 env:FYSETC_S6 env:FYSETC_S6_8000 + #include "stm32f4/pins_FYSETC_S6_V2_0.h" // STM32F4 env:STM32F446VE_fysetc env:STM32F446VE_fysetc_32k_bootloader #elif MB(FYSETC_SPIDER) - #include "stm32f4/pins_FYSETC_SPIDER.h" // STM32F4 env:FYSETC_S6 env:FYSETC_S6_8000 + #include "stm32f4/pins_FYSETC_SPIDER.h" // STM32F4 env:STM32F446VE_fysetc env:STM32F446VE_fysetc_32k_bootloader #elif MB(FYSETC_SPIDER_V2_2) - #include "stm32f4/pins_FYSETC_SPIDER_V2_2.h" // STM32F4 env:FYSETC_S6 env:FYSETC_S6_8000 + #include "stm32f4/pins_FYSETC_SPIDER_V2_2.h" // STM32F4 env:STM32F446VE_fysetc_32k_bootloader #elif MB(FLYF407ZG) #include "stm32f4/pins_FLYF407ZG.h" // STM32F4 env:FLYF407ZG #elif MB(MKS_ROBIN2) diff --git a/buildroot/bin/mftest b/buildroot/bin/mftest index 3dd54b2bf6..9b6dfb465d 100755 --- a/buildroot/bin/mftest +++ b/buildroot/bin/mftest @@ -134,7 +134,7 @@ lp9|lpc9) TESTENV='LPC1769' ;; f1) TESTENV='STM32F103RE' ;; f4) TESTENV='STM32F4' ;; f7) TESTENV='STM32F7' ;; - s6) TESTENV='FYSETC_S6' ;; + s6) TESTENV='STM32F446VE_fysetc' ;; teensy) TESTENV='teensy31' ;; t31) TESTENV='teensy31' ;; t32) TESTENV='teensy31' ;; diff --git a/buildroot/share/PlatformIO/boards/marlin_fysetc_s6.json b/buildroot/share/PlatformIO/boards/marlin_STM32F446VE_fysetc.json similarity index 85% rename from buildroot/share/PlatformIO/boards/marlin_fysetc_s6.json rename to buildroot/share/PlatformIO/boards/marlin_STM32F446VE_fysetc.json index 286e46ffbd..bbeefdf977 100644 --- a/buildroot/share/PlatformIO/boards/marlin_fysetc_s6.json +++ b/buildroot/share/PlatformIO/boards/marlin_STM32F446VE_fysetc.json @@ -3,14 +3,14 @@ "cpu": "cortex-m4", "extra_flags": "-DSTM32F446xx", "f_cpu": "180000000L", - "mcu": "stm32f446ret6", - "variant": "MARLIN_FYSETC_S6" + "mcu": "stm32f446vet6", + "variant": "MARLIN_F446VE_FYSETC" }, "connectivity": [ "can" ], "debug": { - "jlink_device": "STM32F446RE", + "jlink_device": "STM32F446VE", "openocd_target": "stm32f4x", "svd_path": "STM32F446x.svd" }, diff --git a/buildroot/share/PlatformIO/variants/MARLIN_FYSETC_S6/PeripheralPins.c b/buildroot/share/PlatformIO/variants/MARLIN_F446VE_FYSETC/PeripheralPins.c similarity index 100% rename from buildroot/share/PlatformIO/variants/MARLIN_FYSETC_S6/PeripheralPins.c rename to buildroot/share/PlatformIO/variants/MARLIN_F446VE_FYSETC/PeripheralPins.c diff --git a/buildroot/share/PlatformIO/variants/MARLIN_FYSETC_S6/PinNamesVar.h b/buildroot/share/PlatformIO/variants/MARLIN_F446VE_FYSETC/PinNamesVar.h similarity index 100% rename from buildroot/share/PlatformIO/variants/MARLIN_FYSETC_S6/PinNamesVar.h rename to buildroot/share/PlatformIO/variants/MARLIN_F446VE_FYSETC/PinNamesVar.h diff --git a/buildroot/share/PlatformIO/variants/MARLIN_FYSETC_S6/ldscript.ld b/buildroot/share/PlatformIO/variants/MARLIN_F446VE_FYSETC/ldscript.ld similarity index 100% rename from buildroot/share/PlatformIO/variants/MARLIN_FYSETC_S6/ldscript.ld rename to buildroot/share/PlatformIO/variants/MARLIN_F446VE_FYSETC/ldscript.ld diff --git a/buildroot/share/PlatformIO/variants/MARLIN_FYSETC_S6/variant.cpp b/buildroot/share/PlatformIO/variants/MARLIN_F446VE_FYSETC/variant.cpp similarity index 100% rename from buildroot/share/PlatformIO/variants/MARLIN_FYSETC_S6/variant.cpp rename to buildroot/share/PlatformIO/variants/MARLIN_F446VE_FYSETC/variant.cpp diff --git a/buildroot/share/PlatformIO/variants/MARLIN_FYSETC_S6/variant.h b/buildroot/share/PlatformIO/variants/MARLIN_F446VE_FYSETC/variant.h similarity index 100% rename from buildroot/share/PlatformIO/variants/MARLIN_FYSETC_S6/variant.h rename to buildroot/share/PlatformIO/variants/MARLIN_F446VE_FYSETC/variant.h diff --git a/buildroot/tests/FYSETC_S6 b/buildroot/tests/STM32F446VE_fysetc similarity index 66% rename from buildroot/tests/FYSETC_S6 rename to buildroot/tests/STM32F446VE_fysetc index 9043b7b6e3..bdc51e43ca 100755 --- a/buildroot/tests/FYSETC_S6 +++ b/buildroot/tests/STM32F446VE_fysetc @@ -1,16 +1,16 @@ #!/usr/bin/env bash # -# Build tests for FYSETC_S6 +# Build tests for STM32F446VE_fysetc # # exit on first failure set -e -# Build examples +# Build basic FYSETC S6 configuration restore_configs -use_example_configs FYSETC/S6 -opt_enable MEATPACK_ON_SERIAL_PORT_1 -opt_set Y_DRIVER_TYPE TMC2209 Z_DRIVER_TYPE TMC2130 +opt_set MOTHERBOARD BOARD_FYSETC_S6_V2_0 SERIAL_PORT -1 BAUDRATE 115200 TEMP_SENSOR_BED 0 \ + DEFAULT_AXIS_STEPS_PER_UNIT '{ 80, 80, 400, 400 }' Y_DRIVER_TYPE TMC2209 Z_DRIVER_TYPE TMC2130 +opt_enable MEATPACK_ON_SERIAL_PORT_1 EEPROM_SETTINGS SDSUPPORT exec_test $1 $2 "FYSETC S6 Example" "$3" # diff --git a/ini/renamed.ini b/ini/renamed.ini index f39cbec6ad..4f9ce0793d 100644 --- a/ini/renamed.ini +++ b/ini/renamed.ini @@ -140,3 +140,9 @@ extends = renamed [env:BIGTREE_SKR_2_F429_USB_debug] ;=> STM32F429VG_btt_USB_debug extends = renamed + +[env:FYSETC_S6] ;=> STM32F446VE_fysetc +extends = renamed + +[env:FYSETC_S6_8000] ;=> STM32F446VE_fysetc_32k_bootloader +extends = renamed diff --git a/ini/stm32f4.ini b/ini/stm32f4.ini index 76d9b1a12f..0e9dc9102a 100644 --- a/ini/stm32f4.ini +++ b/ini/stm32f4.ini @@ -99,12 +99,12 @@ board_build.offset = 0x8000 upload_protocol = dfu # -# FYSETC S6 (STM32F446RET6 ARM Cortex-M4) +# FYSETC S6 / Spider V1.x/2.x/3.x with 64k bootloader (STM32F446VET6 ARM Cortex-M4) # -[env:FYSETC_S6] +[env:STM32F446VE_fysetc] extends = stm32_variant platform_packages = platformio/tool-dfuutil@~1.11.0 -board = marlin_fysetc_s6 +board = marlin_STM32F446VE_fysetc board_build.offset = 0x10000 board_upload.offset_address = 0x08010000 build_flags = ${stm32_variant.build_flags} -DHAL_PCD_MODULE_ENABLED @@ -113,11 +113,14 @@ upload_protocol = dfu upload_command = dfu-util -a 0 -s 0x08010000:leave -D "$SOURCE" # -# FYSETC S6 new bootloader +# FYSETC S6 / Spider V1.x/2.x/3.x with 32k bootloader +# All S6 & Spider (V2.2+) boards made after 2021/06/23 use this bootloader +# S6 - https://github.com/FYSETC/FYSETC-S6/tree/main/bootloader +# Spider - https://github.com/FYSETC/FYSETC-SPIDER/tree/main/bootloader # -[env:FYSETC_S6_8000] -extends = env:FYSETC_S6 -board = marlin_fysetc_s6 +[env:STM32F446VE_fysetc_32k_bootloader] +extends = env:STM32F446VE_fysetc +board = marlin_STM32F446VE_fysetc board_build.offset = 0x8000 board_upload.offset_address = 0x08008000 upload_command = dfu-util -a 0 -s 0x08008000:leave -D "$SOURCE" From 6ba08130f05ed0cee0037812f4d1addaec822d42 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Sat, 15 Mar 2025 00:28:35 +0000 Subject: [PATCH 12/74] [cron] Bump distribution date (2025-03-15) --- 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 b0bbd83206..46d3eca6f7 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-03-14" +//#define STRING_DISTRIBUTION_DATE "2025-03-15" /** * 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 189d9a1e2e..bc51577643 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-03-14" + #define STRING_DISTRIBUTION_DATE "2025-03-15" #endif /** From 3827ceaf66a09a33c27c89f2488b7fb31321aa6e Mon Sep 17 00:00:00 2001 From: "Marcio T." Date: Sat, 15 Mar 2025 16:31:32 -0600 Subject: [PATCH 13/74] =?UTF-8?q?=F0=9F=A9=B9=20Fix=20color=20game=20compi?= =?UTF-8?q?le=20(#27721)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/lcd/dogm/game.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/src/lcd/dogm/game.cpp b/Marlin/src/lcd/dogm/game.cpp index 70e8783b49..e49f9198e7 100644 --- a/Marlin/src/lcd/dogm/game.cpp +++ b/Marlin/src/lcd/dogm/game.cpp @@ -31,8 +31,8 @@ void MarlinGame::frame_start() { void MarlinGame::frame_end() {} -void MarlinGame::set_color(const color color) { - switch (color) { +void MarlinGame::set_color(const color clr) { + switch (clr) { default: case color::WHITE: u8g.setColorIndex(1); break; case color::BLACK: u8g.setColorIndex(0); break; From fb4d465360990013858c9ba97cc6a3e236f97644 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Sun, 16 Mar 2025 00:32:26 +0000 Subject: [PATCH 14/74] [cron] Bump distribution date (2025-03-16) --- 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 46d3eca6f7..a8330b0054 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-03-15" +//#define STRING_DISTRIBUTION_DATE "2025-03-16" /** * 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 bc51577643..7d3ef7cdac 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-03-15" + #define STRING_DISTRIBUTION_DATE "2025-03-16" #endif /** From 82d3d78e3190ea314f1f1f59f9a0c3acf64a59c3 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 10 Mar 2025 01:11:20 -0500 Subject: [PATCH 15/74] =?UTF-8?q?=F0=9F=94=A7=20BOARD=5FLCD=5FSERIAL=5FPOR?= =?UTF-8?q?T?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/inc/Warnings.cpp | 7 +++++++ Marlin/src/pins/hc32f4/pins_AQUILA_101.h | 2 ++ Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h | 2 ++ Marlin/src/pins/ramps/pins_PANOWIN_CUTLASS.h | 2 ++ Marlin/src/pins/ramps/pins_RAMPS.h | 2 ++ Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h | 2 ++ Marlin/src/pins/stm32f1/pins_CREALITY_CR4NS.h | 2 ++ Marlin/src/pins/stm32f1/pins_CREALITY_V24S1_301.h | 2 ++ Marlin/src/pins/stm32f1/pins_CREALITY_V423.h | 2 ++ Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h | 2 ++ Marlin/src/pins/stm32f4/pins_BTT_OCTOPUS_V1_1.h | 2 ++ Marlin/src/pins/stm32f4/pins_BTT_SKR_MINI_E3_V3_0_1.h | 2 ++ Marlin/src/pins/stm32f4/pins_CREALITY_CR4NTXXC10.h | 2 ++ Marlin/src/pins/stm32f4/pins_CREALITY_F401.h | 2 ++ Marlin/src/pins/stm32f4/pins_MKS_MONSTER8_V1.h | 2 ++ Marlin/src/pins/stm32g0/pins_BTT_SKR_MINI_E3_V3_0.h | 6 ++++-- Marlin/src/pins/stm32h7/pins_BTT_SKR_V3_0_common.h | 2 ++ 17 files changed, 41 insertions(+), 2 deletions(-) diff --git a/Marlin/src/inc/Warnings.cpp b/Marlin/src/inc/Warnings.cpp index a6ea570030..df2279a08b 100644 --- a/Marlin/src/inc/Warnings.cpp +++ b/Marlin/src/inc/Warnings.cpp @@ -925,3 +925,10 @@ #if ALL(PELTIER_BED, PIDTEMPBED) #warning "PELTIER_BED with PIDTEMPBED requires extra circuitry. Use with caution." #endif + +/** + * Board recommended LCD_SERIAL_PORT + */ +#if LCD_IS_SERIAL_HOST && defined(BOARD_LCD_SERIAL_PORT) && LCD_SERIAL_PORT != BOARD_LCD_SERIAL_PORT && DISABLED(NO_LCD_SERIAL_PORT_WARNING) + #warning "LCD_SERIAL_PORT overrides the default (BOARD_LCD_SERIAL_PORT)." +#endif diff --git a/Marlin/src/pins/hc32f4/pins_AQUILA_101.h b/Marlin/src/pins/hc32f4/pins_AQUILA_101.h index 8c3ce10c6d..dd8488de64 100644 --- a/Marlin/src/pins/hc32f4/pins_AQUILA_101.h +++ b/Marlin/src/pins/hc32f4/pins_AQUILA_101.h @@ -37,6 +37,8 @@ #define DEFAULT_MACHINE_NAME "Aquila" #endif +#define BOARD_LCD_SERIAL_PORT 1 + // // Onboard crystal oscillator // diff --git a/Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h b/Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h index 98da81781e..03394b02ba 100644 --- a/Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h +++ b/Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h @@ -34,6 +34,8 @@ #define USES_DIAG_JUMPERS +#define BOARD_LCD_SERIAL_PORT 1 + // Onboard I2C EEPROM #define I2C_EEPROM #define MARLIN_EEPROM_SIZE 0x1000U // 4K (AT24C32) diff --git a/Marlin/src/pins/ramps/pins_PANOWIN_CUTLASS.h b/Marlin/src/pins/ramps/pins_PANOWIN_CUTLASS.h index 11451e95a4..51da658365 100755 --- a/Marlin/src/pins/ramps/pins_PANOWIN_CUTLASS.h +++ b/Marlin/src/pins/ramps/pins_PANOWIN_CUTLASS.h @@ -38,6 +38,8 @@ #define DEFAULT_MACHINE_NAME "Panowin F1" #endif +#define BOARD_LCD_SERIAL_PORT 2 + // // Limit Switches // diff --git a/Marlin/src/pins/ramps/pins_RAMPS.h b/Marlin/src/pins/ramps/pins_RAMPS.h index e40415c826..e033cfd060 100644 --- a/Marlin/src/pins/ramps/pins_RAMPS.h +++ b/Marlin/src/pins/ramps/pins_RAMPS.h @@ -59,6 +59,8 @@ #define BOARD_INFO_NAME "RAMPS 1.4" #endif +#define BOARD_LCD_SERIAL_PORT 2 + // // Servos // diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h index 6b6aec5197..77a80d36e1 100644 --- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_common.h @@ -38,6 +38,8 @@ #define MARLIN_EEPROM_SIZE EEPROM_PAGE_SIZE // 2K #endif +#define BOARD_LCD_SERIAL_PORT 1 + // // Servos // diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_CR4NS.h b/Marlin/src/pins/stm32f1/pins_CREALITY_CR4NS.h index 95bd5e98ff..7d19aec51d 100644 --- a/Marlin/src/pins/stm32f1/pins_CREALITY_CR4NS.h +++ b/Marlin/src/pins/stm32f1/pins_CREALITY_CR4NS.h @@ -41,6 +41,8 @@ #endif #define BOARD_WEBSITE_URL "www.creality.com" +#define BOARD_LCD_SERIAL_PORT 2 + // // EEPROM // diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V24S1_301.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V24S1_301.h index 584d7661f8..916db4e596 100644 --- a/Marlin/src/pins/stm32f1/pins_CREALITY_V24S1_301.h +++ b/Marlin/src/pins/stm32f1/pins_CREALITY_V24S1_301.h @@ -44,6 +44,8 @@ #define DEFAULT_MACHINE_NAME "Ender-3 S1" #endif +#define BOARD_LCD_SERIAL_PORT 2 + // // Servos // diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V423.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V423.h index c174b0e56e..e8ffca6a5b 100644 --- a/Marlin/src/pins/stm32f1/pins_CREALITY_V423.h +++ b/Marlin/src/pins/stm32f1/pins_CREALITY_V423.h @@ -28,6 +28,8 @@ #define BOARD_INFO_NAME "Creality v4.2.3" #define DEFAULT_MACHINE_NAME "Creality3D" +#define BOARD_LCD_SERIAL_PORT 2 + // // Heaters // diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h index ff438418fe..f081dad4cb 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h @@ -58,6 +58,8 @@ #define MARLIN_EEPROM_SIZE EEPROM_PAGE_SIZE // 2K #endif +#define BOARD_LCD_SERIAL_PORT 2 + // // Servos // diff --git a/Marlin/src/pins/stm32f4/pins_BTT_OCTOPUS_V1_1.h b/Marlin/src/pins/stm32f4/pins_BTT_OCTOPUS_V1_1.h index e9de6d8176..21c93b8f31 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_OCTOPUS_V1_1.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_OCTOPUS_V1_1.h @@ -23,6 +23,8 @@ #define BOARD_INFO_NAME "BTT OCTOPUS V1.1" +#define BOARD_LCD_SERIAL_PORT 1 + // // Temperature Sensors // diff --git a/Marlin/src/pins/stm32f4/pins_BTT_SKR_MINI_E3_V3_0_1.h b/Marlin/src/pins/stm32f4/pins_BTT_SKR_MINI_E3_V3_0_1.h index 0582cdff61..ca1adec5d7 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_SKR_MINI_E3_V3_0_1.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_SKR_MINI_E3_V3_0_1.h @@ -52,6 +52,8 @@ #define MARLIN_EEPROM_SIZE 0x1000U // 4K #endif +#define BOARD_LCD_SERIAL_PORT 1 + // // Servos // diff --git a/Marlin/src/pins/stm32f4/pins_CREALITY_CR4NTXXC10.h b/Marlin/src/pins/stm32f4/pins_CREALITY_CR4NTXXC10.h index 3b22085b3d..71ee1b84dc 100644 --- a/Marlin/src/pins/stm32f4/pins_CREALITY_CR4NTXXC10.h +++ b/Marlin/src/pins/stm32f4/pins_CREALITY_CR4NTXXC10.h @@ -48,6 +48,8 @@ //#undef DISABLE_DEBUG // DISABLE_(DEBUG|JTAG) is not supported for STM32F4. //#define DISABLE_JTAG +#define BOARD_LCD_SERIAL_PORT 2 + // // EEPROM // diff --git a/Marlin/src/pins/stm32f4/pins_CREALITY_F401.h b/Marlin/src/pins/stm32f4/pins_CREALITY_F401.h index 757dde06c9..eecb5c8bc3 100644 --- a/Marlin/src/pins/stm32f4/pins_CREALITY_F401.h +++ b/Marlin/src/pins/stm32f4/pins_CREALITY_F401.h @@ -47,6 +47,8 @@ // 32Mb FLASH //#define SPI_FLASH_CS ? +#define BOARD_LCD_SERIAL_PORT 2 + // // Servos // diff --git a/Marlin/src/pins/stm32f4/pins_MKS_MONSTER8_V1.h b/Marlin/src/pins/stm32f4/pins_MKS_MONSTER8_V1.h index a8d0be3ca6..758690ee80 100644 --- a/Marlin/src/pins/stm32f4/pins_MKS_MONSTER8_V1.h +++ b/Marlin/src/pins/stm32f4/pins_MKS_MONSTER8_V1.h @@ -23,6 +23,8 @@ #define BOARD_INFO_NAME "MKS Monster8 V1" +#define BOARD_LCD_SERIAL_PORT 1 + // // Limit Switches // diff --git a/Marlin/src/pins/stm32g0/pins_BTT_SKR_MINI_E3_V3_0.h b/Marlin/src/pins/stm32g0/pins_BTT_SKR_MINI_E3_V3_0.h index 121dbac336..c7130564ef 100644 --- a/Marlin/src/pins/stm32g0/pins_BTT_SKR_MINI_E3_V3_0.h +++ b/Marlin/src/pins/stm32g0/pins_BTT_SKR_MINI_E3_V3_0.h @@ -34,8 +34,6 @@ // Ignore temp readings during development. //#define BOGUS_TEMPERATURE_GRACE_PERIOD 2000 -#define LED_PIN PD8 - // Onboard I2C EEPROM #if ANY(NO_EEPROM_SELECTED, I2C_EEPROM) #undef NO_EEPROM_SELECTED @@ -46,6 +44,10 @@ #define MARLIN_EEPROM_SIZE 0x1000U // 4K #endif +#define BOARD_LCD_SERIAL_PORT 1 + +#define LED_PIN PD8 + // // Servos // diff --git a/Marlin/src/pins/stm32h7/pins_BTT_SKR_V3_0_common.h b/Marlin/src/pins/stm32h7/pins_BTT_SKR_V3_0_common.h index 87afd7bb16..7456236669 100644 --- a/Marlin/src/pins/stm32h7/pins_BTT_SKR_V3_0_common.h +++ b/Marlin/src/pins/stm32h7/pins_BTT_SKR_V3_0_common.h @@ -41,6 +41,8 @@ #define USES_DIAG_JUMPERS +#define BOARD_LCD_SERIAL_PORT 1 + // Onboard I2C EEPROM #if ANY(NO_EEPROM_SELECTED, I2C_EEPROM) #undef NO_EEPROM_SELECTED From 434bf81f8e98a8ede3576ad9fcc36b7f3cfe6fff Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 16 Mar 2025 00:36:22 -0500 Subject: [PATCH 16/74] =?UTF-8?q?=F0=9F=A9=B9=20Fix=20max=20Y/Z=20endstop?= =?UTF-8?q?=20pins=20on=20GMARSH=20X6=20REV1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/pins/lpc1768/pins_GMARSH_X6_REV1.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/src/pins/lpc1768/pins_GMARSH_X6_REV1.h b/Marlin/src/pins/lpc1768/pins_GMARSH_X6_REV1.h index 4cb8a01a20..6329c506a0 100644 --- a/Marlin/src/pins/lpc1768/pins_GMARSH_X6_REV1.h +++ b/Marlin/src/pins/lpc1768/pins_GMARSH_X6_REV1.h @@ -50,9 +50,9 @@ #define X_MIN_PIN P0_00 #define X_MAX_PIN P0_01 #define Y_MIN_PIN P0_10 -#define Y_MAX_PIN P0_21 +#define Y_MAX_PIN P0_11 #define Z_MIN_PIN P2_13 -#define Z_MAX_PIN P2_22 +#define Z_MAX_PIN P2_12 // // Steppers From b954959f55d86e0feff045a561f70524bb260bc8 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 16 Mar 2025 03:24:00 -0500 Subject: [PATCH 17/74] =?UTF-8?q?=E2=9C=A8=20M550=20CONFIGURABLE=5FMACHINE?= =?UTF-8?q?=5FNAME=20(#27731)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/Configuration.h | 1 + Marlin/Configuration_adv.h | 2 +- Marlin/src/MarlinCore.cpp | 8 ++ Marlin/src/MarlinCore.h | 4 + Marlin/src/core/language.h | 1 + Marlin/src/core/mstring.h | 3 + Marlin/src/gcode/config/M550.cpp | 59 ++++++++++++++ Marlin/src/gcode/control/M80_M81.cpp | 8 +- Marlin/src/gcode/gcode.cpp | 4 + Marlin/src/gcode/gcode.h | 5 ++ Marlin/src/gcode/host/M16.cpp | 2 +- Marlin/src/inc/Conditionals-2-LCD.h | 16 +++- Marlin/src/inc/SanityCheck.h | 4 + .../src/lcd/e3v2/marlinui/lcdprint_dwin.cpp | 2 +- .../ftdi_eve_touch_ui/ftdi_eve_extui.cpp | 2 +- .../extui/ia_creality/ia_creality_extui.cpp | 10 ++- .../lcd/extui/ia_creality/ia_creality_rts.cpp | 7 +- Marlin/src/lcd/extui/nextion/nextion_tft.cpp | 72 ++++++++--------- .../src/lcd/extui/nextion/nextion_tft_defs.h | 18 +++-- Marlin/src/lcd/extui/ui_api.cpp | 8 +- Marlin/src/lcd/extui/ui_api.h | 3 +- Marlin/src/lcd/language/language_an.h | 2 +- Marlin/src/lcd/language/language_bg.h | 2 +- Marlin/src/lcd/language/language_ca.h | 2 +- Marlin/src/lcd/language/language_cz.h | 2 +- Marlin/src/lcd/language/language_da.h | 2 +- Marlin/src/lcd/language/language_de.h | 2 +- Marlin/src/lcd/language/language_el.h | 2 +- Marlin/src/lcd/language/language_el_gr.h | 2 +- Marlin/src/lcd/language/language_en.h | 2 +- Marlin/src/lcd/language/language_es.h | 2 +- Marlin/src/lcd/language/language_eu.h | 2 +- Marlin/src/lcd/language/language_fi.h | 2 +- Marlin/src/lcd/language/language_fr.h | 2 +- Marlin/src/lcd/language/language_fr_na.h | 2 +- Marlin/src/lcd/language/language_gl.h | 2 +- Marlin/src/lcd/language/language_hr.h | 2 +- Marlin/src/lcd/language/language_hu.h | 2 +- Marlin/src/lcd/language/language_it.h | 2 +- Marlin/src/lcd/language/language_jp_kana.h | 2 +- Marlin/src/lcd/language/language_ko_KR.h | 2 +- Marlin/src/lcd/language/language_nl.h | 2 +- Marlin/src/lcd/language/language_pl.h | 2 +- Marlin/src/lcd/language/language_pt.h | 2 +- Marlin/src/lcd/language/language_pt_br.h | 2 +- Marlin/src/lcd/language/language_ro.h | 2 +- Marlin/src/lcd/language/language_ru.h | 2 +- Marlin/src/lcd/language/language_sk.h | 2 +- Marlin/src/lcd/language/language_sv.h | 2 +- Marlin/src/lcd/language/language_tr.h | 2 +- Marlin/src/lcd/language/language_uk.h | 2 +- Marlin/src/lcd/language/language_vi.h | 2 +- Marlin/src/lcd/language/language_zh_CN.h | 2 +- Marlin/src/lcd/language/language_zh_TW.h | 2 +- Marlin/src/lcd/lcdprint.cpp | 71 +--------------- Marlin/src/lcd/lcdprint.h | 31 +------ Marlin/src/lcd/marlinui.cpp | 80 +++++++++++++++++-- Marlin/src/lcd/marlinui.h | 36 ++++++--- Marlin/src/lcd/menu/menu_info.cpp | 10 ++- Marlin/src/lcd/menu/menu_item.h | 24 ++++-- Marlin/src/lcd/utf8.cpp | 4 - Marlin/src/module/settings.cpp | 26 ++++++ buildroot/tests/ARMED | 2 +- buildroot/tests/SAMD21_minitronics20 | 3 +- ini/features.ini | 1 + 65 files changed, 367 insertions(+), 226 deletions(-) create mode 100644 Marlin/src/gcode/config/M550.cpp diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index f804dc605a..e9dc6f0fd1 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -129,6 +129,7 @@ // Name displayed in the LCD "Ready" message and Info menu //#define CUSTOM_MACHINE_NAME "3D Printer" +//#define CONFIGURABLE_MACHINE_NAME // Add G-code M550 to set/report the machine name // Printer's unique ID, used by some programs to differentiate between machines. // Choose your own or use a service like https://www.uuidgenerator.net/version4 diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index ad62cc06cc..ff85b6c0e3 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -2227,7 +2227,7 @@ // Developer menu (accessed by touching "About Printer" copyright text) //#define TOUCH_UI_DEVELOPER_MENU -#endif +#endif // TOUCH_UI_FTDI_EVE // // Classic UI Options diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index bdcabca980..689f71f8e5 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -271,6 +271,10 @@ PGMSTR(M112_KILL_STR, "M112 Shutdown"); +#if ENABLED(CONFIGURABLE_MACHINE_NAME) + MString<64> machine_name; +#endif + MarlinState marlin_state = MarlinState::MF_INITIALIZING; // For M109 and M190, this flag may be cleared (by M108) to exit the wait loop @@ -1363,6 +1367,10 @@ void setup() { SETUP_RUN(settings.first_load()); // Load data from EEPROM if available (or use defaults) // This also updates variables in the planner, elsewhere + #if ENABLED(CONFIGURABLE_MACHINE_NAME) + SETUP_RUN(ui.reset_status(false)); // machine_name Initialized by settings.load() + #endif + #if ENABLED(PROBE_TARE) SETUP_RUN(probe.tare_init()); #endif diff --git a/Marlin/src/MarlinCore.h b/Marlin/src/MarlinCore.h index 9cf74de2c6..ecab0e3630 100644 --- a/Marlin/src/MarlinCore.h +++ b/Marlin/src/MarlinCore.h @@ -41,6 +41,10 @@ inline void idle_no_sleep() { idle(true); } void kill(FSTR_P const lcd_error=nullptr, FSTR_P const lcd_component=nullptr, const bool steppers_off=false); void minkill(const bool steppers_off=false); +#if ENABLED(CONFIGURABLE_MACHINE_NAME) + extern MString<64> machine_name; +#endif + // Global State of the firmware enum class MarlinState : uint8_t { MF_INITIALIZING = 0, diff --git a/Marlin/src/core/language.h b/Marlin/src/core/language.h index f64c7513df..dddc00dba8 100644 --- a/Marlin/src/core/language.h +++ b/Marlin/src/core/language.h @@ -88,6 +88,7 @@ #undef MACHINE_NAME #define MACHINE_NAME DEFAULT_MACHINE_NAME #endif +#define MACHINE_NAME_SUBST TERN(CONFIGURABLE_MACHINE_NAME, "$", MACHINE_NAME) #define MARLIN_WEBSITE_URL "marlinfw.org" diff --git a/Marlin/src/core/mstring.h b/Marlin/src/core/mstring.h index b405262d30..e3fb78c50e 100644 --- a/Marlin/src/core/mstring.h +++ b/Marlin/src/core/mstring.h @@ -298,6 +298,9 @@ public: MString& clear() { return set(); } MString& eol() { return append('\n'); } MString& trunc(const int &i) { if (i <= SIZE) str[i] = '\0'; debug(F("trunc")); return *this; } + MString& ltrim() { char *s = str; while (*s == ' ') ++s; if (s != str) strcpy(str, s); return *this; } + MString& rtrim() { int s = length(); while (s && str[s - 1] == ' ') --s; str[s] = '\0'; return *this; } + MString& trim() { return rtrim().ltrim(); } // Truncate on a Unicode boundary MString& utrunc(const int &n=SIZE) { diff --git a/Marlin/src/gcode/config/M550.cpp b/Marlin/src/gcode/config/M550.cpp new file mode 100644 index 0000000000..6ff0c506de --- /dev/null +++ b/Marlin/src/gcode/config/M550.cpp @@ -0,0 +1,59 @@ +/** + * 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 . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(CONFIGURABLE_MACHINE_NAME) + +#include "../gcode.h" +#include "../../MarlinCore.h" +#include "../../lcd/marlinui.h" + +/** + * M550: Set machine name + * + * Parameters: + * P "" Set the name using the 'P' parameter (RepRapFirmware) + * "" Set the name using the "string" parameter + */ +void GcodeSuite::M550() { + bool did_set = true; + + if (parser.seenval('P')) + machine_name = parser.value_string(); + else if (TERN(GCODE_QUOTED_STRINGS, false, parser.seen('P'))) + machine_name = parser.string_arg[0] == 'P' ? &parser.string_arg[1] : parser.string_arg; + else if (parser.string_arg && parser.string_arg[0]) + machine_name = parser.string_arg; + else + did_set = false; + + if (did_set) { + machine_name.trim(); + ui.reset_status(false); + } + else + SERIAL_ECHOLNPGM("RepRap name: ", &machine_name); + +} + +#endif // CONFIGURABLE_MACHINE_NAME diff --git a/Marlin/src/gcode/control/M80_M81.cpp b/Marlin/src/gcode/control/M80_M81.cpp index 8a52d49d9a..a37b0af680 100644 --- a/Marlin/src/gcode/control/M80_M81.cpp +++ b/Marlin/src/gcode/control/M80_M81.cpp @@ -38,7 +38,7 @@ #include "../../feature/powerloss.h" #endif -#if HAS_SUICIDE +#if ANY(HAS_SUICIDE, CONFIGURABLE_MACHINE_NAME) #include "../../MarlinCore.h" #endif @@ -92,7 +92,11 @@ void GcodeSuite::M81() { safe_delay(1000); // Wait 1 second before switching off - LCD_MESSAGE_F(MACHINE_NAME " " STR_OFF "."); + #if ENABLED(CONFIGURABLE_MACHINE_NAME) + ui.set_status(&MString<30>(&machine_name, ' ', F(STR_OFF), '.')); + #else + LCD_MESSAGE_F(MACHINE_NAME " " STR_OFF "."); + #endif bool delayed_power_off = false; diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index 9fed4dcada..881149fb52 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -947,6 +947,10 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { case 540: M540(); break; // M540: Set abort on endstop hit for SD printing #endif + #if ENABLED(CONFIGURABLE_MACHINE_NAME) + case 550: M550(); break; // M550: Set machine name + #endif + #if HAS_ETHERNET case 552: M552(); break; // M552: Set IP address case 553: M553(); break; // M553: Set gateway diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h index 589cd2bc48..e86a58d85d 100644 --- a/Marlin/src/gcode/gcode.h +++ b/Marlin/src/gcode/gcode.h @@ -261,6 +261,7 @@ * M512 - Set/Change/Remove Password (Requires PASSWORD_CHANGE_GCODE) * M524 - Abort the current SD print job started with M24. (Requires SDSUPPORT) * M540 - Enable/disable SD card abort on endstop hit: "M540 S". (Requires SD_ABORT_ON_ENDSTOP_HIT) + * M550 - Set the machine name: "M550 P". (Requires CONFIGURABLE_MACHINE_NAME) * 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) @@ -1128,6 +1129,10 @@ private: static void M540(); #endif + #if ENABLED(CONFIGURABLE_MACHINE_NAME) + static void M550(); + #endif + #if HAS_ETHERNET static void M552(); static void M552_report(); diff --git a/Marlin/src/gcode/host/M16.cpp b/Marlin/src/gcode/host/M16.cpp index 07b0c5ef57..fc41ba3322 100644 --- a/Marlin/src/gcode/host/M16.cpp +++ b/Marlin/src/gcode/host/M16.cpp @@ -33,7 +33,7 @@ */ void GcodeSuite::M16() { - if (strcmp_P(parser.string_arg, PSTR(MACHINE_NAME))) + if (TERN(CONFIGURABLE_MACHINE_NAME, strcmp(parser.string_arg, machine_name), strcmp_P(parser.string_arg, PSTR(MACHINE_NAME)))) kill(GET_TEXT_F(MSG_KILL_EXPECTED_PRINTER)); } diff --git a/Marlin/src/inc/Conditionals-2-LCD.h b/Marlin/src/inc/Conditionals-2-LCD.h index 40f18c406a..8c818864a0 100644 --- a/Marlin/src/inc/Conditionals-2-LCD.h +++ b/Marlin/src/inc/Conditionals-2-LCD.h @@ -615,12 +615,20 @@ #define HAS_STATUS_MESSAGE 1 #endif -#if HAS_WIRED_LCD && !HAS_GRAPHICAL_TFT && !IS_DWIN_MARLINUI - #define HAS_LCDPRINT 1 +#if ANY(HAS_WIRED_LCD, DWIN_LCD_PROUI) + #if ENABLED(STATUS_MESSAGE_SCROLLING) + #define MAX_MESSAGE_SIZE _MAX(LONG_FILENAME_LENGTH, MAX_LANG_CHARSIZE * (LCD_WIDTH)) + #else + #define MAX_MESSAGE_SIZE (MAX_LANG_CHARSIZE * (LCD_WIDTH)) + #endif +#elif HAS_STATUS_MESSAGE + #define MAX_MESSAGE_SIZE 63 +#else + #define MAX_MESSAGE_SIZE 1 #endif -#if HAS_DISPLAY || HAS_LCDPRINT - #define HAS_UTF8_UTILS 1 +#if HAS_WIRED_LCD && !HAS_GRAPHICAL_TFT && !IS_DWIN_MARLINUI + #define HAS_LCDPRINT 1 #endif #if IS_ULTIPANEL && DISABLED(NO_LCD_MENUS) diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 76b9c136d0..e07fa78173 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -4507,6 +4507,10 @@ static_assert(WITHIN(MULTISTEPPING_LIMIT, 1, 128) && IS_POWER_OF_2(MULTISTEPPING #error "Only enable ULTIPANEL_FEEDMULTIPLY or ULTIPANEL_FLOWPERCENT, but not both." #endif +#if ENABLED(CONFIGURABLE_MACHINE_NAME) && DISABLED(GCODE_QUOTED_STRINGS) + #error "CONFIGURABLE_MACHINE_NAME requires GCODE_QUOTED_STRINGS." +#endif + // Misc. Cleanup #undef _TEST_PWM #undef _NUM_AXES_STR diff --git a/Marlin/src/lcd/e3v2/marlinui/lcdprint_dwin.cpp b/Marlin/src/lcd/e3v2/marlinui/lcdprint_dwin.cpp index 9fa75a700b..d13ec2e779 100644 --- a/Marlin/src/lcd/e3v2/marlinui/lcdprint_dwin.cpp +++ b/Marlin/src/lcd/e3v2/marlinui/lcdprint_dwin.cpp @@ -107,7 +107,7 @@ int lcd_put_u8str_max_P(PGM_P utf8_pstr, const pixel_len_t max_length) { return lcd_put_u8str_max_cb(utf8_pstr, read_byte_rom, max_length); } -lcd_uint_t lcd_put_u8str_P(PGM_P const ptpl, const int8_t ind, const char * const cstr/*=nullptr*/, FSTR_P const fstr/*=nullptr*/, const lcd_uint_t maxlen/*=LCD_WIDTH*/) { +lcd_uint_t lcd_put_u8str_P(PGM_P const ptpl, const int8_t ind, const char * const cstr/*=nullptr*/, FSTR_P const fstr/*=nullptr*/, const lcd_uint_t maxlen/*=MAX_MESSAGE_SIZE*/) { dwin_string.set(ptpl, ind, cstr, fstr); dwin_string.truncate(maxlen); dwinDrawString(dwin_font.solid, dwin_font.index, dwin_font.fg, dwin_font.bg, cursor.x, cursor.y, dwin_string.string()); diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_extui.cpp b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_extui.cpp index 0035ee66fe..c26a809037 100644 --- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_extui.cpp +++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_extui.cpp @@ -74,7 +74,7 @@ namespace ExtUI { void onMinTempError(const heater_id_t header_id) {} void onMaxTempError(const heater_id_t header_id) {} - void onStatusChanged(const char *lcd_msg) { StatusScreen::setStatusMessage(lcd_msg); } + void onStatusChanged(const char * const lcd_msg) { StatusScreen::setStatusMessage(lcd_msg); } void onPrintTimerStarted() { InterfaceSoundsScreen::playEventSound(InterfaceSoundsScreen::PRINTING_STARTED); diff --git a/Marlin/src/lcd/extui/ia_creality/ia_creality_extui.cpp b/Marlin/src/lcd/extui/ia_creality/ia_creality_extui.cpp index 0a1c3f6e2c..4a1d49a020 100644 --- a/Marlin/src/lcd/extui/ia_creality/ia_creality_extui.cpp +++ b/Marlin/src/lcd/extui/ia_creality/ia_creality_extui.cpp @@ -252,9 +252,15 @@ void onUserConfirmRequired(const int icon, FSTR_P const fstr, FSTR_P const fBtn) } #endif -void onStatusChanged(const char *const statMsg) { - for (int16_t j = 0; j < 20; j++) // Clear old message +static constexpr int16_t STATUS_MESSAGE_SIZE = 20; + +void clearStatus() { + for (int16_t j = 0; j < STATUS_MESSAGE_SIZE; j++) // Clear old message rts.sendData(' ', StatusMessageString + j); +} + +void onStatusChanged(const char * const statMsg) { + clearStatus(); rts.sendData(statMsg, StatusMessageString); } diff --git a/Marlin/src/lcd/extui/ia_creality/ia_creality_rts.cpp b/Marlin/src/lcd/extui/ia_creality/ia_creality_rts.cpp index 84df4f5871..660d7faed7 100644 --- a/Marlin/src/lcd/extui/ia_creality/ia_creality_rts.cpp +++ b/Marlin/src/lcd/extui/ia_creality/ia_creality_rts.cpp @@ -99,7 +99,12 @@ void RTS::onStartup() { sendData(StartSoundSet, SoundAddr); delay_ms(400); // Delay to allow screen to configure - onStatusChanged(MACHINE_NAME " Ready"); + #if ENABLED(CONFIGURABLE_MACHINE_NAME) + const MString<32> ready(message_string, " Ready"); + onStatusChanged(ready); + #else + onStatusChanged(F(MACHINE_NAME " Ready")); + #endif sendData(100, FeedrateDisplay); diff --git a/Marlin/src/lcd/extui/nextion/nextion_tft.cpp b/Marlin/src/lcd/extui/nextion/nextion_tft.cpp index 9ebd783124..53af67f3d9 100644 --- a/Marlin/src/lcd/extui/nextion/nextion_tft.cpp +++ b/Marlin/src/lcd/extui/nextion/nextion_tft.cpp @@ -63,12 +63,16 @@ void NextionTFT::startup() { delay_ms(100); SEND_VAL("tmppage.connected", 1); - SEND_VALasTXT("tmppage.marlin", SHORT_BUILD_VERSION); - SEND_VALasTXT("tmppage.compiled", __DATE__ " / " __TIME__); + SEND_TXT("tmppage.marlin", SHORT_BUILD_VERSION); + SEND_TXT("tmppage.compiled", __DATE__ " / " __TIME__); SEND_VALasTXT("tmppage.extruder", EXTRUDERS); - SEND_VALasTXT("tmppage.printer", MACHINE_NAME); - SEND_VALasTXT("tmppage.author", STRING_CONFIG_H_AUTHOR); - SEND_VALasTXT("tmppage.released", STRING_DISTRIBUTION_DATE); + #if ENABLED(CONFIGURABLE_MACHINE_NAME) + SEND_VALasTXT("tmppage.printer", &machine_name); + #else + SEND_TXT("tmppage.printer", MACHINE_NAME); + #endif + SEND_TXT("tmppage.author", STRING_CONFIG_H_AUTHOR); + SEND_TXT("tmppage.released", STRING_DISTRIBUTION_DATE); SEND_VALasTXT("tmppage.bedx", X_BED_SIZE); SEND_VALasTXT("tmppage.bedy", Y_BED_SIZE); SEND_VALasTXT("tmppage.bedz", Z_MAX_POS); @@ -222,12 +226,16 @@ void NextionTFT::panelInfo(uint8_t req) { case 2: // Printer Info if (!isPrinting()) { SEND_VAL("tmppage.connected", 1); - SEND_VALasTXT("tmppage.marlin", SHORT_BUILD_VERSION); - SEND_VALasTXT("tmppage.compiled", __DATE__ " / " __TIME__); + SEND_TXT("tmppage.marlin", SHORT_BUILD_VERSION); + SEND_TXT("tmppage.compiled", __DATE__ " / " __TIME__); SEND_VALasTXT("tmppage.extruder", EXTRUDERS); - SEND_VALasTXT("tmppage.printer", MACHINE_NAME); - SEND_VALasTXT("tmppage.author", STRING_CONFIG_H_AUTHOR); - SEND_VALasTXT("tmppage.released", STRING_DISTRIBUTION_DATE); + #if ENABLED(CONFIGURABLE_MACHINE_NAME) + SEND_VALasTXT("tmppage.printer", &machine_name); + #else + SEND_TXT("tmppage.printer", MACHINE_NAME); + #endif + SEND_TXT("tmppage.author", STRING_CONFIG_H_AUTHOR); + SEND_TXT("tmppage.released", STRING_DISTRIBUTION_DATE); SEND_VALasTXT("tmppage.bedx", X_BED_SIZE); SEND_VALasTXT("tmppage.bedy", Y_BED_SIZE); SEND_VALasTXT("tmppage.bedz", Z_MAX_POS); @@ -430,59 +438,43 @@ void NextionTFT::panelInfo(uint8_t req) { case 36: // Endstop Info #if X_HOME_TO_MIN - SEND_VALasTXT("x1", READ(X_MIN_PIN) == X_MIN_ENDSTOP_HIT_STATE ? "triggered" : "open"); + SEND_TXT_F("x1", READ(X_MIN_PIN) == X_MIN_ENDSTOP_HIT_STATE ? F("triggered") : F("open")); #elif X_HOME_TO_MAX - SEND_VALasTXT("x2", READ(X_MAX_PIN) == X_MAX_ENDSTOP_HIT_STATE ? "triggered" : "open"); + SEND_TXT_F("x2", READ(X_MAX_PIN) == X_MAX_ENDSTOP_HIT_STATE ? F("triggered") : F("open")); #endif #if Y_HOME_TO_MIN - SEND_VALasTXT("y1", READ(Y_MIN_PIN) == Y_MIN_ENDSTOP_HIT_STATE ? "triggered" : "open"); + SEND_TXT_F("y1", READ(Y_MIN_PIN) == Y_MIN_ENDSTOP_HIT_STATE ? F("triggered") : F("open")); #elif Y_HOME_TO_MAX - SEND_VALasTXT("y2", READ(X_MAX_PIN) == Y_MAX_ENDSTOP_HIT_STATE ? "triggered" : "open"); + SEND_TXT_F("y2", READ(X_MAX_PIN) == Y_MAX_ENDSTOP_HIT_STATE ? F("triggered") : F("open")); #endif #if Z_HOME_TO_MIN - SEND_VALasTXT("z1", READ(Z_MIN_PIN) == Z_MIN_ENDSTOP_HIT_STATE ? "triggered" : "open"); + SEND_TXT_F("z1", READ(Z_MIN_PIN) == Z_MIN_ENDSTOP_HIT_STATE ? F("triggered") : F("open")); #elif Z_HOME_TO_MAX - SEND_VALasTXT("z2", READ(Z_MAX_PIN) == Z_MAX_ENDSTOP_HIT_STATE ? "triggered" : "open"); + SEND_TXT_F("z2", READ(Z_MAX_PIN) == Z_MAX_ENDSTOP_HIT_STATE ? F("triggered") : F("open")); #endif #if USE_Z2_MIN - SEND_VALasTXT("z2", READ(Z2_MIN_PIN) == Z2_MIN_ENDSTOP_HIT_STATE ? "triggered" : "open"); + SEND_TXT_F("z2", READ(Z2_MIN_PIN) == Z2_MIN_ENDSTOP_HIT_STATE ? F("triggered") : F("open")); #elif USE_Z2_MAX - SEND_VALasTXT("z2", READ(Z2_MAX_PIN) == Z2_MAX_ENDSTOP_HIT_STATE ? "triggered" : "open"); + SEND_TXT_F("z2", READ(Z2_MAX_PIN) == Z2_MAX_ENDSTOP_HIT_STATE ? F("triggered") : F("open")); #endif #if HAS_BED_PROBE - //SEND_VALasTXT("bltouch", PROBE_TRIGGERED() ? "triggered" : "open"); + //SEND_TXT_F("bltouch", PROBE_TRIGGERED() ? F("triggered") : F("open")); #else SEND_NA("bltouch"); #endif break; case 37: // PID - #if ENABLED(PIDTEMP) - #define SEND_PID_INFO_0(A, B) SEND_VALasTXT(A, getPID_K##B(E0)) - #else - #define SEND_PID_INFO_0(A, B) SEND_NA(A) - #endif + #define SEND_PID_INFO_0(A, B) TERN(PIDTEMP, SEND_VALasTXT(A, getPID_K##B(E0)), SEND_NA(A)) #if ALL(PIDTEMP, HAS_MULTI_EXTRUDER) #define SEND_PID_INFO_1(A, B) SEND_VALasTXT(A, getPID_K##B(E1)) #else #define SEND_PID_INFO_1(A, B) SEND_NA(A) #endif - #if ENABLED(PIDTEMPBED) - #define SEND_PID_INFO_BED(A, B) SEND_VALasTXT(A, getBedPID_K##B()) - #else - #define SEND_PID_INFO_BED(A, B) SEND_NA(A) - #endif - SEND_PID_INFO_0("p0", p); - SEND_PID_INFO_0("i0", i); - SEND_PID_INFO_0("d0", d); - - SEND_PID_INFO_1("p1", p); - SEND_PID_INFO_1("i1", i); - SEND_PID_INFO_1("d1", d); - - SEND_PID_INFO_BED("hbp", p); - SEND_PID_INFO_BED("hbi", i); - SEND_PID_INFO_BED("hbd", d); + #define SEND_PID_INFO_BED(A, B) TERN(PIDTEMPBED, SEND_VALasTXT(A, getBedPID_K##B()), SEND_NA(A)) + SEND_PID_INFO_0("p0", p); SEND_PID_INFO_0("i0", i); SEND_PID_INFO_0("d0", d); + SEND_PID_INFO_1("p1", p); SEND_PID_INFO_1("i1", i); SEND_PID_INFO_1("d1", d); + SEND_PID_INFO_BED("hbp", p); SEND_PID_INFO_BED("hbi", i); SEND_PID_INFO_BED("hbd", d); break; } } diff --git a/Marlin/src/lcd/extui/nextion/nextion_tft_defs.h b/Marlin/src/lcd/extui/nextion/nextion_tft_defs.h index 061d29559c..e376e34e2b 100644 --- a/Marlin/src/lcd/extui/nextion/nextion_tft_defs.h +++ b/Marlin/src/lcd/extui/nextion/nextion_tft_defs.h @@ -54,10 +54,14 @@ // TFT panel commands #define msg_welcome MACHINE_NAME " Ready." -#define SEND_TEMP(x,y,t,z) (nextion.tftSend(F(x)), nextion.tftSend(F(".txt=\"")), LCD_SERIAL.print(y), nextion.tftSend(F(t)), LCD_SERIAL.print(z), nextion.tftSend(F("\"\xFF\xFF\xFF"))) -#define SEND_VAL(x,y) (nextion.tftSend(F(x)), nextion.tftSend(F(".val=")), LCD_SERIAL.print(y), nextion.tftSend(F("\xFF\xFF\xFF"))) -#define SEND_TXT(x,y) (nextion.tftSend(F(x)), nextion.tftSend(F(".txt=\"")), nextion.tftSend(F(y)), nextion.tftSend(F("\"\xFF\xFF\xFF"))) -#define SEND_TXT_F(x,y) (nextion.tftSend(F(x)), nextion.tftSend(F(".txt=\"")), nextion.tftSend(y), nextion.tftSend(F("\"\xFF\xFF\xFF"))) -#define SEND_VALasTXT(x,y) (nextion.tftSend(F(x)), nextion.tftSend(F(".txt=\"")), LCD_SERIAL.print(y), nextion.tftSend(F("\"\xFF\xFF\xFF"))) -#define SEND_TXT_END(x) (nextion.tftSend(F(x)), nextion.tftSend(F("\xFF\xFF\xFF"))) -#define SEND_PCO2(x,y,z) (nextion.tftSend(F(x)), LCD_SERIAL.print(y), nextion.tftSend(F(".pco=")), nextion.tftSend(F(z)), nextion.tftSend(F("\xFF\xFF\xFF"))) +#define TXT_OPEN() nextion.tftSend(F(".txt=\"")) +#define TXT_CLOSE() nextion.tftSend(F("\"\xFF\xFF\xFF")) +#define VAL_OPEN() nextion.tftSend(F(".val=")) +#define VAL_CLOSE() nextion.tftSend(F("\xFF\xFF\xFF")) +#define SEND_TEMP(x,y,t,z) (nextion.tftSend(F(x)), TXT_OPEN(), LCD_SERIAL.print(y), nextion.tftSend(F(t)), LCD_SERIAL.print(z), TXT_CLOSE()) // XXX.txt="YYYTTTZZZ" +#define SEND_VAL(x,y) (nextion.tftSend(F(x)), VAL_OPEN(), LCD_SERIAL.print(y), VAL_CLOSE()) // XXX.val=YYY +#define SEND_TXT(x,y) (nextion.tftSend(F(x)), TXT_OPEN(), nextion.tftSend(F(y)), TXT_CLOSE()) // XXX.txt="YYY" +#define SEND_TXT_F(x,y) (nextion.tftSend(F(x)), TXT_OPEN(), nextion.tftSend(y), TXT_CLOSE()) // XXX.txt="YYY" +#define SEND_VALasTXT(x,y) (nextion.tftSend(F(x)), TXT_OPEN(), LCD_SERIAL.print(y), TXT_CLOSE()) // XXX.txt="YYY" +#define SEND_TXT_END(x) (nextion.tftSend(F(x)), VAL_CLOSE()) // XXX +#define SEND_PCO2(x,y,z) (nextion.tftSend(F(x)), LCD_SERIAL.print(y), nextion.tftSend(F(".pco=")), nextion.tftSend(F(z)), VAL_CLOSE()) // XXXYYY.pco=ZZZ diff --git a/Marlin/src/lcd/extui/ui_api.cpp b/Marlin/src/lcd/extui/ui_api.cpp index 4a6f594066..a53b5f5dba 100644 --- a/Marlin/src/lcd/extui/ui_api.cpp +++ b/Marlin/src/lcd/extui/ui_api.cpp @@ -1213,13 +1213,13 @@ namespace ExtUI { #endif } - void onStatusChanged(FSTR_P const fstr) { + void onStatusChanged_P(PGM_P const pstr) { #ifdef __AVR__ - char msg[strlen_P(FTOP(fstr)) + 1]; - strcpy_P(msg, FTOP(fstr)); + char msg[strlen_P(pstr) + 1]; + strcpy_P(msg, pstr); onStatusChanged(msg); #else - onStatusChanged(FTOP(fstr)); + onStatusChanged(pstr); #endif } diff --git a/Marlin/src/lcd/extui/ui_api.h b/Marlin/src/lcd/extui/ui_api.h index 8404033b7b..2676d72aea 100644 --- a/Marlin/src/lcd/extui/ui_api.h +++ b/Marlin/src/lcd/extui/ui_api.h @@ -530,8 +530,9 @@ namespace ExtUI { void onPauseMode(const PauseMessage message, const PauseMode mode=PAUSE_MODE_SAME, const uint8_t extruder=active_extruder); #endif + void onStatusChanged_P(PGM_P const msg); + inline void onStatusChanged(FSTR_P const fstr) { onStatusChanged_P(FTOP(fstr)); } void onStatusChanged(const char * const msg); - void onStatusChanged(FSTR_P const fstr); void onHomingStart(); void onHomingDone(); diff --git a/Marlin/src/lcd/language/language_an.h b/Marlin/src/lcd/language/language_an.h index c51891f6ec..095a3440aa 100644 --- a/Marlin/src/lcd/language/language_an.h +++ b/Marlin/src/lcd/language/language_an.h @@ -37,7 +37,7 @@ namespace LanguageNarrow_an { constexpr uint8_t CHARSIZE = 1; LSTR LANGUAGE = _UxGT("Aragonese"); - LSTR WELCOME_MSG = MACHINE_NAME _UxGT(" parada."); + LSTR WELCOME_MSG = MACHINE_NAME_SUBST _UxGT(" parada."); LSTR MSG_MEDIA_INSERTED = _UxGT("Tarcheta mesa"); LSTR MSG_MEDIA_REMOVED = _UxGT("Tarcheta sacada"); LSTR MSG_LCD_ENDSTOPS = _UxGT("Endstops"); // Max length 8 characters diff --git a/Marlin/src/lcd/language/language_bg.h b/Marlin/src/lcd/language/language_bg.h index 3722dba3ad..4eef867826 100644 --- a/Marlin/src/lcd/language/language_bg.h +++ b/Marlin/src/lcd/language/language_bg.h @@ -36,7 +36,7 @@ namespace LanguageNarrow_bg { constexpr uint8_t CHARSIZE = 2; LSTR LANGUAGE = _UxGT("Bulgarian"); - LSTR WELCOME_MSG = MACHINE_NAME _UxGT(" Готов."); + LSTR WELCOME_MSG = MACHINE_NAME_SUBST _UxGT(" Готов."); LSTR MSG_MEDIA_INSERTED = _UxGT("Картата е поставена"); LSTR MSG_MEDIA_REMOVED = _UxGT("Картата е извадена"); LSTR MSG_MAIN_MENU = _UxGT("Меню"); diff --git a/Marlin/src/lcd/language/language_ca.h b/Marlin/src/lcd/language/language_ca.h index da784bc342..fa74f255aa 100644 --- a/Marlin/src/lcd/language/language_ca.h +++ b/Marlin/src/lcd/language/language_ca.h @@ -33,7 +33,7 @@ namespace LanguageNarrow_ca { constexpr uint8_t CHARSIZE = 2; LSTR LANGUAGE = _UxGT("Catalan"); - LSTR WELCOME_MSG = MACHINE_NAME _UxGT(" preparada."); + LSTR WELCOME_MSG = MACHINE_NAME_SUBST _UxGT(" preparada."); LSTR MSG_MEDIA_INSERTED = _UxGT("Targeta detectada."); LSTR MSG_MEDIA_REMOVED = _UxGT("Targeta extreta."); LSTR MSG_LCD_ENDSTOPS = _UxGT("Endstops"); diff --git a/Marlin/src/lcd/language/language_cz.h b/Marlin/src/lcd/language/language_cz.h index e54a69ec83..814c9ffde8 100644 --- a/Marlin/src/lcd/language/language_cz.h +++ b/Marlin/src/lcd/language/language_cz.h @@ -41,7 +41,7 @@ namespace LanguageNarrow_cz { constexpr uint8_t CHARSIZE = 2; LSTR LANGUAGE = _UxGT("Czech"); - LSTR WELCOME_MSG = MACHINE_NAME _UxGT(" připraven."); + LSTR WELCOME_MSG = MACHINE_NAME_SUBST _UxGT(" připraven."); LSTR MSG_YES = _UxGT("ANO"); LSTR MSG_NO = _UxGT("NE"); LSTR MSG_BACK = _UxGT("Zpět"); diff --git a/Marlin/src/lcd/language/language_da.h b/Marlin/src/lcd/language/language_da.h index c348db0918..35083aa01f 100644 --- a/Marlin/src/lcd/language/language_da.h +++ b/Marlin/src/lcd/language/language_da.h @@ -36,7 +36,7 @@ namespace LanguageNarrow_da { constexpr uint8_t CHARSIZE = 2; LSTR LANGUAGE = _UxGT("Danish"); - LSTR WELCOME_MSG = MACHINE_NAME _UxGT(" er klar"); + LSTR WELCOME_MSG = MACHINE_NAME_SUBST _UxGT(" er klar"); LSTR MSG_MEDIA_INSERTED = _UxGT("Kort isat"); LSTR MSG_MEDIA_REMOVED = _UxGT("Kort fjernet"); LSTR MSG_MAIN_MENU = _UxGT("Menu"); diff --git a/Marlin/src/lcd/language/language_de.h b/Marlin/src/lcd/language/language_de.h index e469a594ca..edc3d4361d 100644 --- a/Marlin/src/lcd/language/language_de.h +++ b/Marlin/src/lcd/language/language_de.h @@ -34,7 +34,7 @@ namespace LanguageNarrow_de { constexpr uint8_t CHARSIZE = 2; LSTR LANGUAGE = _UxGT("Deutsch"); - LSTR WELCOME_MSG = MACHINE_NAME _UxGT(" bereit"); + LSTR WELCOME_MSG = MACHINE_NAME_SUBST _UxGT(" bereit"); LSTR MSG_YES = _UxGT("JA"); LSTR MSG_NO = _UxGT("NEIN"); LSTR MSG_HIGH = _UxGT("HOCH"); diff --git a/Marlin/src/lcd/language/language_el.h b/Marlin/src/lcd/language/language_el.h index b100f31781..85de0f0751 100644 --- a/Marlin/src/lcd/language/language_el.h +++ b/Marlin/src/lcd/language/language_el.h @@ -36,7 +36,7 @@ namespace LanguageNarrow_el { constexpr uint8_t CHARSIZE = 2; LSTR LANGUAGE = _UxGT("Greek (Greece)"); - LSTR WELCOME_MSG = MACHINE_NAME _UxGT(" έτοιμος."); + LSTR WELCOME_MSG = MACHINE_NAME_SUBST _UxGT(" έτοιμος."); LSTR MSG_YES = _UxGT("ΝΑΙ"); LSTR MSG_NO = _UxGT("ΟΧΙ"); LSTR MSG_BACK = _UxGT("Πίσω"); diff --git a/Marlin/src/lcd/language/language_el_gr.h b/Marlin/src/lcd/language/language_el_gr.h index caef745a0e..65b2da5ee3 100644 --- a/Marlin/src/lcd/language/language_el_gr.h +++ b/Marlin/src/lcd/language/language_el_gr.h @@ -36,7 +36,7 @@ namespace LanguageNarrow_el_gr { constexpr uint8_t CHARSIZE = 2; LSTR LANGUAGE = _UxGT("Greek (Greece)"); - LSTR WELCOME_MSG = MACHINE_NAME _UxGT(" έτοιμο."); + LSTR WELCOME_MSG = MACHINE_NAME_SUBST _UxGT(" έτοιμο."); LSTR MSG_MEDIA_INSERTED = _UxGT("Εισαγωγή κάρτας"); LSTR MSG_MEDIA_REMOVED = _UxGT("Αφαίρεση κάρτας"); LSTR MSG_LCD_ENDSTOPS = _UxGT("Endstops"); // Max length 8 characters diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index 3575e40bea..307ff2590e 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -69,7 +69,7 @@ namespace LanguageNarrow_en { LSTR LANGUAGE = _UxGT("English"); // These strings should be translated - LSTR WELCOME_MSG = MACHINE_NAME _UxGT(" Ready."); + LSTR WELCOME_MSG = MACHINE_NAME_SUBST _UxGT(" Ready."); LSTR MSG_YES = _UxGT("YES"); LSTR MSG_NO = _UxGT("NO"); LSTR MSG_HIGH = _UxGT("HIGH"); diff --git a/Marlin/src/lcd/language/language_es.h b/Marlin/src/lcd/language/language_es.h index 06e3c753be..1c7d5199d3 100644 --- a/Marlin/src/lcd/language/language_es.h +++ b/Marlin/src/lcd/language/language_es.h @@ -36,7 +36,7 @@ namespace LanguageNarrow_es { constexpr uint8_t CHARSIZE = 2; LSTR LANGUAGE = _UxGT("Spanish"); - LSTR WELCOME_MSG = MACHINE_NAME _UxGT(" Lista"); + LSTR WELCOME_MSG = MACHINE_NAME_SUBST _UxGT(" Lista"); LSTR MSG_YES = _UxGT("SI"); LSTR MSG_NO = _UxGT("NO"); LSTR MSG_BACK = _UxGT("Atrás"); diff --git a/Marlin/src/lcd/language/language_eu.h b/Marlin/src/lcd/language/language_eu.h index df6e6395d1..561de0b8e6 100644 --- a/Marlin/src/lcd/language/language_eu.h +++ b/Marlin/src/lcd/language/language_eu.h @@ -37,7 +37,7 @@ namespace LanguageNarrow_eu { constexpr uint8_t CHARSIZE = 1; LSTR LANGUAGE = _UxGT("Basque-Euskera"); - LSTR WELCOME_MSG = MACHINE_NAME _UxGT(" prest."); + LSTR WELCOME_MSG = MACHINE_NAME_SUBST _UxGT(" prest."); LSTR MSG_BACK = _UxGT("Atzera"); LSTR MSG_MEDIA_INSERTED = _UxGT("Txartela sartuta"); LSTR MSG_MEDIA_REMOVED = _UxGT("Txartela kenduta"); diff --git a/Marlin/src/lcd/language/language_fi.h b/Marlin/src/lcd/language/language_fi.h index e6de9369b1..7b3f0f6082 100644 --- a/Marlin/src/lcd/language/language_fi.h +++ b/Marlin/src/lcd/language/language_fi.h @@ -36,7 +36,7 @@ namespace LanguageNarrow_fi { constexpr uint8_t CHARSIZE = 2; LSTR LANGUAGE = _UxGT("Finnish"); - LSTR WELCOME_MSG = MACHINE_NAME _UxGT(" valmis."); + LSTR WELCOME_MSG = MACHINE_NAME_SUBST _UxGT(" valmis."); LSTR MSG_MEDIA_INSERTED = _UxGT("Kortti asetettu"); LSTR MSG_MEDIA_REMOVED = _UxGT("Kortti poistettu"); LSTR MSG_MAIN_MENU = _UxGT("Palaa"); diff --git a/Marlin/src/lcd/language/language_fr.h b/Marlin/src/lcd/language/language_fr.h index 2a65cd2671..b499b32f7b 100644 --- a/Marlin/src/lcd/language/language_fr.h +++ b/Marlin/src/lcd/language/language_fr.h @@ -36,7 +36,7 @@ namespace LanguageNarrow_fr { constexpr uint8_t CHARSIZE = 2; LSTR LANGUAGE = _UxGT("Français"); - LSTR WELCOME_MSG = MACHINE_NAME _UxGT(" prête."); + LSTR WELCOME_MSG = MACHINE_NAME_SUBST _UxGT(" prête."); LSTR MSG_YES = _UxGT("Oui"); LSTR MSG_NO = _UxGT("Non"); LSTR MSG_BACK = _UxGT("Retour"); diff --git a/Marlin/src/lcd/language/language_fr_na.h b/Marlin/src/lcd/language/language_fr_na.h index 0aad606af5..995a5ecd27 100644 --- a/Marlin/src/lcd/language/language_fr_na.h +++ b/Marlin/src/lcd/language/language_fr_na.h @@ -36,7 +36,7 @@ namespace LanguageNarrow_fr_na { LSTR LANGUAGE = _UxGT("Francais"); - LSTR WELCOME_MSG = MACHINE_NAME _UxGT(" prete."); + LSTR WELCOME_MSG = MACHINE_NAME_SUBST _UxGT(" prete."); LSTR MSG_YES = _UxGT("Oui"); LSTR MSG_NO = _UxGT("Non"); LSTR MSG_BACK = _UxGT("Retour"); diff --git a/Marlin/src/lcd/language/language_gl.h b/Marlin/src/lcd/language/language_gl.h index ada1fd2fa2..37c1aa292a 100644 --- a/Marlin/src/lcd/language/language_gl.h +++ b/Marlin/src/lcd/language/language_gl.h @@ -38,7 +38,7 @@ namespace LanguageNarrow_gl { constexpr uint8_t CHARSIZE = 1; LSTR LANGUAGE = _UxGT("Galician"); - LSTR WELCOME_MSG = MACHINE_NAME _UxGT(" lista."); + LSTR WELCOME_MSG = MACHINE_NAME_SUBST _UxGT(" lista."); LSTR MSG_YES = _UxGT("SI"); LSTR MSG_NO = _UxGT("NON"); LSTR MSG_BACK = _UxGT("Atrás"); diff --git a/Marlin/src/lcd/language/language_hr.h b/Marlin/src/lcd/language/language_hr.h index 9f259693e7..5f60b000e3 100644 --- a/Marlin/src/lcd/language/language_hr.h +++ b/Marlin/src/lcd/language/language_hr.h @@ -36,7 +36,7 @@ namespace LanguageNarrow_hr { constexpr uint8_t CHARSIZE = 2; LSTR LANGUAGE = _UxGT("Croatian"); - LSTR WELCOME_MSG = MACHINE_NAME _UxGT(" spreman."); + LSTR WELCOME_MSG = MACHINE_NAME_SUBST _UxGT(" spreman."); LSTR MSG_MEDIA_INSERTED = _UxGT("SD kartica umetnuta"); LSTR MSG_MEDIA_REMOVED = _UxGT("SD kartica uklonjena"); LSTR MSG_LCD_ENDSTOPS = _UxGT("Endstops"); // Max length 8 characters diff --git a/Marlin/src/lcd/language/language_hu.h b/Marlin/src/lcd/language/language_hu.h index 2f744abc6f..d987416269 100644 --- a/Marlin/src/lcd/language/language_hu.h +++ b/Marlin/src/lcd/language/language_hu.h @@ -39,7 +39,7 @@ namespace LanguageNarrow_hu { constexpr uint8_t CHARSIZE = 2; LSTR LANGUAGE = _UxGT("Magyar"); - LSTR WELCOME_MSG = MACHINE_NAME _UxGT(" Kész."); + LSTR WELCOME_MSG = MACHINE_NAME_SUBST _UxGT(" Kész."); LSTR MSG_YES = _UxGT("IGEN"); LSTR MSG_NO = _UxGT("NEM"); LSTR MSG_BACK = _UxGT("Vissza"); diff --git a/Marlin/src/lcd/language/language_it.h b/Marlin/src/lcd/language/language_it.h index 13a6f88a01..0a7302b0f8 100644 --- a/Marlin/src/lcd/language/language_it.h +++ b/Marlin/src/lcd/language/language_it.h @@ -46,7 +46,7 @@ namespace LanguageNarrow_it { constexpr uint8_t CHARSIZE = 1; LSTR LANGUAGE = _UxGT("Italiano"); - LSTR WELCOME_MSG = MACHINE_NAME _UxGT(" pronta."); + LSTR WELCOME_MSG = MACHINE_NAME_SUBST _UxGT(" pronta."); LSTR MSG_YES = _UxGT("Si"); LSTR MSG_NO = _UxGT("No"); LSTR MSG_HIGH = _UxGT("ALTO"); diff --git a/Marlin/src/lcd/language/language_jp_kana.h b/Marlin/src/lcd/language/language_jp_kana.h index cbc680460a..ae88b1d968 100644 --- a/Marlin/src/lcd/language/language_jp_kana.h +++ b/Marlin/src/lcd/language/language_jp_kana.h @@ -41,7 +41,7 @@ namespace LanguageNarrow_jp_kana { // This translation can be improved by using the full charset of unicode codeblock U+30A0 to U+30FF. // 片仮名表示定義 - LSTR WELCOME_MSG = MACHINE_NAME _UxGT(" ジュンビカンリョウ"); + LSTR WELCOME_MSG = MACHINE_NAME_SUBST _UxGT(" ジュンビカンリョウ"); LSTR MSG_MEDIA_INSERTED = _UxGT("メディアガソウニュウサレマシタ"); // "Card inserted" LSTR MSG_MEDIA_REMOVED = _UxGT("メディアガアリマセン"); // "Card removed" LSTR MSG_RELEASE_MEDIA = _UxGT("メディアノトリダシ"); diff --git a/Marlin/src/lcd/language/language_ko_KR.h b/Marlin/src/lcd/language/language_ko_KR.h index f1eece315c..d5410cadf5 100644 --- a/Marlin/src/lcd/language/language_ko_KR.h +++ b/Marlin/src/lcd/language/language_ko_KR.h @@ -33,7 +33,7 @@ namespace LanguageNarrow_ko_KR { constexpr uint8_t CHARSIZE = 1; LSTR LANGUAGE = _UxGT("Korean"); - LSTR WELCOME_MSG = MACHINE_NAME _UxGT(" 준비."); + LSTR WELCOME_MSG = MACHINE_NAME_SUBST _UxGT(" 준비."); LSTR MSG_BACK = _UxGT("뒤로"); LSTR MSG_MEDIA_INSERTED = _UxGT("카드 삽입됨"); LSTR MSG_MEDIA_REMOVED = _UxGT("카드 제거됨"); diff --git a/Marlin/src/lcd/language/language_nl.h b/Marlin/src/lcd/language/language_nl.h index f47bc053b8..e99417a2dc 100644 --- a/Marlin/src/lcd/language/language_nl.h +++ b/Marlin/src/lcd/language/language_nl.h @@ -37,7 +37,7 @@ namespace LanguageNarrow_nl { constexpr uint8_t CHARSIZE = 1; LSTR LANGUAGE = _UxGT("Dutch"); - LSTR WELCOME_MSG = MACHINE_NAME _UxGT(" gereed."); + LSTR WELCOME_MSG = MACHINE_NAME_SUBST _UxGT(" gereed."); LSTR MSG_BACK = _UxGT("Terug"); LSTR MSG_MEDIA_INSERTED = _UxGT("Kaart ingestoken"); LSTR MSG_MEDIA_REMOVED = _UxGT("Kaart verwijderd"); diff --git a/Marlin/src/lcd/language/language_pl.h b/Marlin/src/lcd/language/language_pl.h index 087a26967d..07573bb2d8 100644 --- a/Marlin/src/lcd/language/language_pl.h +++ b/Marlin/src/lcd/language/language_pl.h @@ -44,7 +44,7 @@ namespace LanguageNarrow_pl { constexpr uint8_t CHARSIZE = 2; LSTR LANGUAGE = _UxGT("Polski"); - LSTR WELCOME_MSG = MACHINE_NAME _UxGT(" gotowy."); + LSTR WELCOME_MSG = MACHINE_NAME_SUBST _UxGT(" gotowy."); LSTR MSG_YES = _UxGT("TAK"); LSTR MSG_NO = _UxGT("NIE"); LSTR MSG_BACK = _UxGT("Wstecz"); diff --git a/Marlin/src/lcd/language/language_pt.h b/Marlin/src/lcd/language/language_pt.h index 8f9745c04b..62799fc9a5 100644 --- a/Marlin/src/lcd/language/language_pt.h +++ b/Marlin/src/lcd/language/language_pt.h @@ -37,7 +37,7 @@ namespace LanguageNarrow_pt { constexpr uint8_t CHARSIZE = 2; LSTR LANGUAGE = _UxGT("Portuguese"); - LSTR WELCOME_MSG = MACHINE_NAME _UxGT(" pronta."); + LSTR WELCOME_MSG = MACHINE_NAME_SUBST _UxGT(" pronta."); LSTR MSG_MEDIA_INSERTED = _UxGT("Cartão inserido"); LSTR MSG_MEDIA_REMOVED = _UxGT("Cartão removido"); LSTR MSG_MAIN_MENU = _UxGT("Menu principal"); diff --git a/Marlin/src/lcd/language/language_pt_br.h b/Marlin/src/lcd/language/language_pt_br.h index 4908986bdb..8d5a608d00 100644 --- a/Marlin/src/lcd/language/language_pt_br.h +++ b/Marlin/src/lcd/language/language_pt_br.h @@ -34,7 +34,7 @@ namespace LanguageNarrow_pt_br { constexpr uint8_t CHARSIZE = 2; LSTR LANGUAGE = _UxGT("Portuguese (BR)"); - LSTR WELCOME_MSG = MACHINE_NAME _UxGT(" pronto."); + LSTR WELCOME_MSG = MACHINE_NAME_SUBST _UxGT(" pronto."); LSTR MSG_YES = _UxGT("SIM"); LSTR MSG_NO = _UxGT("NÃO"); LSTR MSG_BACK = _UxGT("Voltar"); diff --git a/Marlin/src/lcd/language/language_ro.h b/Marlin/src/lcd/language/language_ro.h index 15278a43e7..ff82bb39ba 100644 --- a/Marlin/src/lcd/language/language_ro.h +++ b/Marlin/src/lcd/language/language_ro.h @@ -35,7 +35,7 @@ namespace LanguageNarrow_ro { constexpr uint8_t CHARSIZE = 2; LSTR LANGUAGE = _UxGT("Romanian"); - LSTR WELCOME_MSG = MACHINE_NAME _UxGT(" Pregatit."); + LSTR WELCOME_MSG = MACHINE_NAME_SUBST _UxGT(" Pregatit."); LSTR MSG_YES = _UxGT("DA"); LSTR MSG_NO = _UxGT("NU"); LSTR MSG_BACK = _UxGT("Inapoi"); diff --git a/Marlin/src/lcd/language/language_ru.h b/Marlin/src/lcd/language/language_ru.h index a8d862e889..6b3fbebd08 100644 --- a/Marlin/src/lcd/language/language_ru.h +++ b/Marlin/src/lcd/language/language_ru.h @@ -35,7 +35,7 @@ namespace LanguageNarrow_ru { constexpr uint8_t CHARSIZE = 2; LSTR LANGUAGE = _UxGT("Russian"); - LSTR WELCOME_MSG = MACHINE_NAME _UxGT(" Готов."); + LSTR WELCOME_MSG = MACHINE_NAME_SUBST _UxGT(" Готов."); LSTR MSG_YES = _UxGT("Да"); LSTR MSG_NO = _UxGT("Нет"); LSTR MSG_BACK = _UxGT("Назад"); diff --git a/Marlin/src/lcd/language/language_sk.h b/Marlin/src/lcd/language/language_sk.h index 30a8076d39..32683cf2ed 100644 --- a/Marlin/src/lcd/language/language_sk.h +++ b/Marlin/src/lcd/language/language_sk.h @@ -47,7 +47,7 @@ namespace LanguageNarrow_sk { constexpr uint8_t CHARSIZE = 2; LSTR LANGUAGE = _UxGT("Slovenčina"); - LSTR WELCOME_MSG = MACHINE_NAME _UxGT(" pripravená."); + LSTR WELCOME_MSG = MACHINE_NAME_SUBST _UxGT(" pripravená."); LSTR MSG_YES = _UxGT("ÁNO"); LSTR MSG_NO = _UxGT("NIE"); LSTR MSG_HIGH = _UxGT("VYSOKÁ"); diff --git a/Marlin/src/lcd/language/language_sv.h b/Marlin/src/lcd/language/language_sv.h index b7702a7985..8827252132 100644 --- a/Marlin/src/lcd/language/language_sv.h +++ b/Marlin/src/lcd/language/language_sv.h @@ -36,7 +36,7 @@ namespace LanguageNarrow_sv { constexpr uint8_t CHARSIZE = 2; LSTR LANGUAGE = _UxGT("Swedish"); - LSTR WELCOME_MSG = MACHINE_NAME _UxGT(" Redo."); + LSTR WELCOME_MSG = MACHINE_NAME_SUBST _UxGT(" Redo."); LSTR MSG_YES = _UxGT("JA"); LSTR MSG_NO = _UxGT("NEJ"); LSTR MSG_BACK = _UxGT("Bakåt"); diff --git a/Marlin/src/lcd/language/language_tr.h b/Marlin/src/lcd/language/language_tr.h index 2055713eeb..baebbe9d1e 100644 --- a/Marlin/src/lcd/language/language_tr.h +++ b/Marlin/src/lcd/language/language_tr.h @@ -45,7 +45,7 @@ namespace LanguageNarrow_tr { LSTR LANGUAGE = _UxGT("Turkish"); // These strings should be translated - LSTR WELCOME_MSG = MACHINE_NAME _UxGT(" Hazır."); + LSTR WELCOME_MSG = MACHINE_NAME_SUBST _UxGT(" Hazır."); LSTR MSG_YES = _UxGT("EVET"); LSTR MSG_NO = _UxGT("HAYIR"); LSTR MSG_HIGH = _UxGT("YÜKSEK"); diff --git a/Marlin/src/lcd/language/language_uk.h b/Marlin/src/lcd/language/language_uk.h index 0add5acc3e..104d7f1ecf 100644 --- a/Marlin/src/lcd/language/language_uk.h +++ b/Marlin/src/lcd/language/language_uk.h @@ -36,7 +36,7 @@ namespace LanguageNarrow_uk { constexpr uint8_t CHARSIZE = 2; LSTR LANGUAGE = _UxGT("Ukrainian"); - LSTR WELCOME_MSG = MACHINE_NAME _UxGT(" Готовий."); + LSTR WELCOME_MSG = MACHINE_NAME_SUBST _UxGT(" Готовий."); LSTR MSG_YES = _UxGT("ТАК"); LSTR MSG_NO = _UxGT("НІ"); LSTR MSG_BACK = _UxGT("Назад"); diff --git a/Marlin/src/lcd/language/language_vi.h b/Marlin/src/lcd/language/language_vi.h index fda9b65367..d1e98637b9 100644 --- a/Marlin/src/lcd/language/language_vi.h +++ b/Marlin/src/lcd/language/language_vi.h @@ -33,7 +33,7 @@ namespace LanguageNarrow_vi { constexpr uint8_t CHARSIZE = 2; LSTR LANGUAGE = _UxGT("Vietnamese"); - LSTR WELCOME_MSG = MACHINE_NAME _UxGT(" Sẵn sàng."); // Ready + 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 diff --git a/Marlin/src/lcd/language/language_zh_CN.h b/Marlin/src/lcd/language/language_zh_CN.h index 13c49fa9f1..eb6a973205 100644 --- a/Marlin/src/lcd/language/language_zh_CN.h +++ b/Marlin/src/lcd/language/language_zh_CN.h @@ -33,7 +33,7 @@ namespace LanguageNarrow_zh_CN { constexpr uint8_t CHARSIZE = 3; LSTR LANGUAGE = _UxGT("Simplified Chinese"); - LSTR WELCOME_MSG = MACHINE_NAME _UxGT("已就绪."); // " ready." + LSTR WELCOME_MSG = MACHINE_NAME_SUBST _UxGT("已就绪."); // " ready." LSTR MSG_MARLIN = _UxGT("马林"); LSTR MSG_YES = _UxGT("是"); LSTR MSG_NO = _UxGT("否"); diff --git a/Marlin/src/lcd/language/language_zh_TW.h b/Marlin/src/lcd/language/language_zh_TW.h index c705d126cb..63e386a06f 100644 --- a/Marlin/src/lcd/language/language_zh_TW.h +++ b/Marlin/src/lcd/language/language_zh_TW.h @@ -33,7 +33,7 @@ namespace LanguageNarrow_zh_TW { constexpr uint8_t CHARSIZE = 3; LSTR LANGUAGE = _UxGT("Traditional Chinese"); - LSTR WELCOME_MSG = MACHINE_NAME _UxGT("已就緒."); // " ready." + LSTR WELCOME_MSG = MACHINE_NAME_SUBST _UxGT("已就緒."); // " ready." LSTR MSG_YES = _UxGT("是"); // "YES" LSTR MSG_NO = _UxGT("否"); // "NO" LSTR MSG_BACK = _UxGT("返回"); // "Back" diff --git a/Marlin/src/lcd/lcdprint.cpp b/Marlin/src/lcd/lcdprint.cpp index 475664f45a..5cfa042d0c 100644 --- a/Marlin/src/lcd/lcdprint.cpp +++ b/Marlin/src/lcd/lcdprint.cpp @@ -31,75 +31,6 @@ #include "marlinui.h" #include "lcdprint.h" -/** - * expand_u8str_P - * - * Expand a string with optional substitutions: - * - * $ displays the clipped string given by fstr or cstr - * { displays '0'....'10' for indexes 0 - 10 - * ~ displays '1'....'11' for indexes 0 - 10 - * * displays 'E1'...'E11' for indexes 0 - 10 (By default. Uses LCD_FIRST_TOOL) - * @ displays an axis name such as XYZUVW, or E for an extruder - * - * Return the number of characters emitted - */ -lcd_uint_t expand_u8str_P(char * const outstr, PGM_P const ptpl, const int8_t ind, const char *cstr/*=nullptr*/, FSTR_P const fstr/*=nullptr*/, const lcd_uint_t maxlen/*=LCD_WIDTH*/) { - const uint8_t *p = (uint8_t*)ptpl; - char *o = outstr; - int8_t n = maxlen; - while (n > 0) { - lchar_t wc; - uint8_t *psc = (uint8_t *)p; - p = get_utf8_value_cb(p, read_byte_rom, wc); - if (!wc) break; - if (wc == '{' || wc == '~' || wc == '*') { - if (ind >= 0) { - if (wc == '*') { *o++ = 'E'; n--; } - if (n) { - int8_t inum = ind + ((wc == '{') ? 0 : LCD_FIRST_TOOL); - if (inum >= 10) { - *o++ = ('0' + (inum / 10)); n--; - inum %= 10; - } - if (n) { *o++ = '0' + inum; n--; } - } - } - else { - PGM_P const b = ind == -2 ? GET_TEXT(MSG_CHAMBER) : GET_TEXT(MSG_BED); - strlcpy_P(o, b, n + 1); - n -= utf8_strlen(o); - o += strlen(o); - } - if (n > 0) { - strlcpy_P(o, (PGM_P)p, n + 1); - n -= utf8_strlen(o); - o += strlen(o); - break; - } - } - else if (wc == '$' && fstr) { - strlcpy_P(o, FTOP(fstr), n + 1); - n -= utf8_strlen(o); - o += strlen(o); - } - else if (wc == '$' && cstr) { - strlcpy(o, cstr, n + 1); - n -= utf8_strlen(o); - o += strlen(o); - } - else { - if (wc == '@') - *o++ = AXIS_CHAR(ind); - else - while (psc != p) *o++ = read_byte_rom(psc++); - *o = '\0'; - n--; - } - } - return maxlen - n; -} - /** * lcd_put_u8str_P * @@ -113,7 +44,7 @@ lcd_uint_t expand_u8str_P(char * const outstr, PGM_P const ptpl, const int8_t in * * Return the number of characters emitted */ -lcd_uint_t lcd_put_u8str_P(PGM_P const ptpl, const int8_t ind, const char *cstr/*=nullptr*/, FSTR_P const fstr/*=nullptr*/, const lcd_uint_t maxlen/*=LCD_WIDTH*/) { +lcd_uint_t lcd_put_u8str_P(PGM_P const ptpl, const int8_t ind, const char *cstr/*=nullptr*/, FSTR_P const fstr/*=nullptr*/, const lcd_uint_t maxlen/*=MAX_MESSAGE_SIZE*/) { char estr[maxlen * LANG_CHARSIZE + 2]; const lcd_uint_t outlen = expand_u8str_P(estr, ptpl, ind, cstr, fstr, maxlen); lcd_put_u8str_max(estr, maxlen * (MENU_FONT_WIDTH)); diff --git a/Marlin/src/lcd/lcdprint.h b/Marlin/src/lcd/lcdprint.h index a93e3adc6b..ef50fb823e 100644 --- a/Marlin/src/lcd/lcdprint.h +++ b/Marlin/src/lcd/lcdprint.h @@ -200,29 +200,6 @@ inline int lcd_put_u8str(const lcd_uint_t col, const lcd_uint_t row, FSTR_P cons return lcd_put_u8str_P(col, row, FTOP(fstr)); } -/** - * @brief Expand a string with optional substitution - * @details Expand a string with optional substitutions: - * $ : the clipped string given by fstr or cstr - * { : '0'....'10' for indexes 0 - 10 - * ~ : '1'....'11' for indexes 0 - 10 - * * : 'E1'...'E11' for indexes 0 - 10 (By default. Uses LCD_FIRST_TOOL) - * @ : an axis name such as XYZUVW, or E for an extruder - * - * @param *outstr The output destination buffer - * @param ptpl A ROM string (template) - * @param ind An index value to use for = ~ * substitution - * @param cstr An SRAM C-string to use for $ substitution - * @param fstr A ROM F-string to use for $ substitution - * @param maxlen The maximum size of the string (in pixels on GLCD) - * @return the output width (in pixels on GLCD) - */ -lcd_uint_t expand_u8str_P(char * const outstr, PGM_P const ptpl, const int8_t ind, const char *cstr=nullptr, FSTR_P const fstr=nullptr, const lcd_uint_t maxlen=LCD_WIDTH); - -inline lcd_uint_t expand_u8str(char * const outstr, FSTR_P const ftpl, const int8_t ind, const char *cstr=nullptr, FSTR_P const fstr=nullptr, const lcd_uint_t maxlen=LCD_WIDTH) { - return expand_u8str_P(outstr, FTOP(ftpl), ind, cstr, fstr, maxlen); -} - /** * @brief Draw a string with optional substitution * @details Print a string with optional substitutions: @@ -239,8 +216,8 @@ inline lcd_uint_t expand_u8str(char * const outstr, FSTR_P const ftpl, const int * @param maxlen The maximum size of the string (in pixels on GLCD) * @return the output width (in pixels on GLCD) */ -lcd_uint_t lcd_put_u8str_P(PGM_P const ptpl, const int8_t ind, const char *cstr=nullptr, FSTR_P const fstr=nullptr, const lcd_uint_t maxlen=LCD_WIDTH); -inline lcd_uint_t lcd_put_u8str_P(const lcd_uint_t col, const lcd_uint_t row, PGM_P const ptpl, const int8_t ind, const char *cstr=nullptr, FSTR_P const fstr=nullptr, const lcd_uint_t maxlen=LCD_WIDTH) { +lcd_uint_t lcd_put_u8str_P(PGM_P const ptpl, const int8_t ind, const char *cstr=nullptr, FSTR_P const fstr=nullptr, const lcd_uint_t maxlen=MAX_MESSAGE_SIZE); +inline lcd_uint_t lcd_put_u8str_P(const lcd_uint_t col, const lcd_uint_t row, PGM_P const ptpl, const int8_t ind, const char *cstr=nullptr, FSTR_P const fstr=nullptr, const lcd_uint_t maxlen=MAX_MESSAGE_SIZE) { lcd_moveto(col, row); return lcd_put_u8str_P(ptpl, ind, cstr, fstr, maxlen); } @@ -255,14 +232,14 @@ inline lcd_uint_t lcd_put_u8str_P(const lcd_uint_t col, const lcd_uint_t row, PG * @param maxlen The maximum size of the string (in pixels on GLCD) * @return the output width (in pixels on GLCD) */ -inline lcd_uint_t lcd_put_u8str(FSTR_P const ftpl, const int8_t ind, const char *cstr=nullptr, FSTR_P const fstr=nullptr, const lcd_uint_t maxlen=LCD_WIDTH) { +inline lcd_uint_t lcd_put_u8str(FSTR_P const ftpl, const int8_t ind, const char *cstr=nullptr, FSTR_P const fstr=nullptr, const lcd_uint_t maxlen=MAX_MESSAGE_SIZE) { return lcd_put_u8str_P(FTOP(ftpl), ind, cstr, fstr, maxlen); } /** * @param col * @param row */ -inline lcd_uint_t lcd_put_u8str(const lcd_uint_t col, const lcd_uint_t row, FSTR_P const ftpl, const int8_t ind, const char *cstr=nullptr, FSTR_P const fstr=nullptr, const lcd_uint_t maxlen=LCD_WIDTH) { +inline lcd_uint_t lcd_put_u8str(const lcd_uint_t col, const lcd_uint_t row, FSTR_P const ftpl, const int8_t ind, const char *cstr=nullptr, FSTR_P const fstr=nullptr, const lcd_uint_t maxlen=MAX_MESSAGE_SIZE) { return lcd_put_u8str_P(col, row, FTOP(ftpl), ind, cstr, fstr, maxlen); } diff --git a/Marlin/src/lcd/marlinui.cpp b/Marlin/src/lcd/marlinui.cpp index 2282cb5ee4..e8946edb28 100644 --- a/Marlin/src/lcd/marlinui.cpp +++ b/Marlin/src/lcd/marlinui.cpp @@ -22,7 +22,7 @@ #include "../inc/MarlinConfig.h" -#include "../MarlinCore.h" // for printingIsPaused +#include "../MarlinCore.h" // for printingIsPaused, machine_name #include "../gcode/parser.h" // for axis_is_rotational, using_inch_units #if HAS_LED_POWEROFF_TIMEOUT || ALL(HAS_WIRED_LCD, PRINTER_EVENT_LEDS) || (HAS_BACKLIGHT_TIMEOUT && defined(NEOPIXEL_BKGD_INDEX_FIRST)) @@ -72,7 +72,7 @@ constexpr uint8_t epps = ENCODER_PULSES_PER_STEP; #if ENABLED(STATUS_MESSAGE_SCROLLING) uint8_t MarlinUI::status_scroll_offset; // = 0 #endif - MString MarlinUI::status_message; + MString MarlinUI::status_message; uint8_t MarlinUI::alert_level; // = 0 #if HAS_STATUS_MESSAGE_TIMEOUT millis_t MarlinUI::status_message_expire_ms; // = 0 @@ -1462,6 +1462,62 @@ void MarlinUI::host_notify(const char * const cstr) { #include +uint8_t expand_u8str_P(char * const outstr, PGM_P const ptpl, const int8_t ind, const char *cstr/*=nullptr*/, FSTR_P const fstr/*=nullptr*/, const uint8_t maxlen/*=MAX_MESSAGE_SIZE*/) { + const uint8_t *p = (uint8_t*)ptpl; + char *o = outstr; + int8_t n = maxlen; + while (n > 0) { + lchar_t wc; + uint8_t *psc = (uint8_t *)p; + p = get_utf8_value_cb(p, read_byte_rom, wc); + if (!wc) break; + if (wc == '{' || wc == '~' || wc == '*') { + if (ind >= 0) { + if (wc == '*') { *o++ = 'E'; n--; } + if (n) { + int8_t inum = ind + ((wc == '{') ? 0 : LCD_FIRST_TOOL); + if (inum >= 10) { + *o++ = ('0' + (inum / 10)); n--; + inum %= 10; + } + if (n) { *o++ = '0' + inum; n--; } + } + } + else { + PGM_P const b = ind == -2 ? GET_TEXT(MSG_CHAMBER) : GET_TEXT(MSG_BED); + strlcpy_P(o, b, n + 1); + n -= utf8_strlen(o); + o += strlen(o); + } + if (n > 0) { + strlcpy_P(o, (PGM_P)p, n + 1); + n -= utf8_strlen(o); + o += strlen(o); + break; + } + } + else if (wc == '$' && fstr) { + strlcpy_P(o, FTOP(fstr), n + 1); + n -= utf8_strlen(o); + o += strlen(o); + } + else if (wc == '$' && cstr) { + strlcpy(o, cstr, n + 1); + n -= utf8_strlen(o); + o += strlen(o); + } + else { + if (wc == '@') + *o++ = AXIS_CHAR(ind); + else + while (psc != p) *o++ = read_byte_rom(psc++); + *o = '\0'; + n--; + } + } + return maxlen - n; +} + #if HAS_STATUS_MESSAGE #if ENABLED(EXTENSIBLE_UI) @@ -1492,7 +1548,16 @@ void MarlinUI::host_notify(const char * const cstr) { else if (print_job_timer.needsService(3)) msg = F("> " SERVICE_NAME_3 "!"); #endif - else if (!no_welcome) msg = GET_TEXT_F(WELCOME_MSG); + else if (!no_welcome) { + #if ENABLED(CONFIGURABLE_MACHINE_NAME) + char new_status[MAX_MESSAGE_SIZE + 1]; + expand_u8str_P(new_status, GET_TEXT(WELCOME_MSG), 0, &machine_name); + _set_status_and_level(new_status, -1); + return; + #else + msg = GET_TEXT_F(WELCOME_MSG); + #endif + } else if (ENABLED(STATUS_DO_CLEAR_EMPTY)) msg = F(""); @@ -1528,7 +1593,7 @@ void MarlinUI::host_notify(const char * const cstr) { MString<30> msg; pgm ? msg.set_P(ustr) : msg.set(ustr); - status_message.set(&msg).utrunc(MAX_MESSAGE_LENGTH); + status_message.set(&msg).utrunc(MAX_MESSAGE_SIZE); finish_status(level > 0); // Persist if the status has a level } @@ -1546,7 +1611,7 @@ void MarlinUI::host_notify(const char * const cstr) { pgm ? host_notify_P(ustr) : host_notify(ustr); // Remove the last partial Unicode glyph, if any - (pgm ? status_message.set_P(ustr) : status_message.set(ustr)).utrunc(MAX_MESSAGE_LENGTH); + (pgm ? status_message.set_P(ustr) : status_message.set(ustr)).utrunc(MAX_MESSAGE_SIZE); finish_status(persist); } @@ -1574,7 +1639,7 @@ void MarlinUI::host_notify(const char * const cstr) { va_list args; va_start(args, pfmt); - vsnprintf_P(status_message, MAX_MESSAGE_LENGTH, pfmt, args); + vsnprintf_P(status_message, MAX_MESSAGE_SIZE, pfmt, args); va_end(args); host_notify(status_message); @@ -1865,6 +1930,7 @@ void MarlinUI::host_notify(const char * const cstr) { #endif // HAS_MEDIA #if HAS_MARLINUI_MENU + void MarlinUI::reset_settings() { settings.reset(); completion_feedback(); @@ -1886,7 +1952,7 @@ void MarlinUI::host_notify(const char * const cstr) { } #endif -#endif +#endif // HAS_MARLINUI_MENU #if ENABLED(EEPROM_SETTINGS) diff --git a/Marlin/src/lcd/marlinui.h b/Marlin/src/lcd/marlinui.h index 3c4f28c93e..a47096a3bf 100644 --- a/Marlin/src/lcd/marlinui.h +++ b/Marlin/src/lcd/marlinui.h @@ -369,17 +369,7 @@ public: #if HAS_STATUS_MESSAGE - #if ANY(HAS_WIRED_LCD, DWIN_LCD_PROUI) - #if ENABLED(STATUS_MESSAGE_SCROLLING) - #define MAX_MESSAGE_LENGTH _MAX(LONG_FILENAME_LENGTH, MAX_LANG_CHARSIZE * 2 * (LCD_WIDTH)) - #else - #define MAX_MESSAGE_LENGTH (MAX_LANG_CHARSIZE * (LCD_WIDTH)) - #endif - #else - #define MAX_MESSAGE_LENGTH 63 - #endif - - static MString status_message; + static MString status_message; static uint8_t alert_level; // Higher levels block lower levels #if HAS_STATUS_MESSAGE_TIMEOUT @@ -410,7 +400,6 @@ public: #else - #define MAX_MESSAGE_LENGTH 1 static constexpr bool has_status() { return false; } static bool set_alert_level(int8_t) { return false; } @@ -912,6 +901,29 @@ private: #endif }; +/** + * @brief Expand a string with optional substitution + * @details Expand a string with optional substitutions: + * $ : the clipped string given by fstr or cstr + * { : '0'....'10' for indexes 0 - 10 + * ~ : '1'....'11' for indexes 0 - 10 + * * : 'E1'...'E11' for indexes 0 - 10 (By default. Uses LCD_FIRST_TOOL) + * @ : an axis name such as XYZUVW, or E for an extruder + * + * @param *outstr The output destination buffer + * @param ptpl A ROM string (template) + * @param ind An index value to use for = ~ * substitution + * @param cstr An SRAM C-string to use for $ substitution + * @param fstr A ROM F-string to use for $ substitution + * @param maxlen The maximum size of the string (in pixels on GLCD) + * @return the output width (in pixels on GLCD) + */ +uint8_t expand_u8str_P(char * const outstr, PGM_P const ptpl, const int8_t ind, const char *cstr=nullptr, FSTR_P const fstr=nullptr, const uint8_t maxlen=MAX_MESSAGE_SIZE); + +inline uint8_t expand_u8str(char * const outstr, FSTR_P const ftpl, const int8_t ind, const char *cstr=nullptr, FSTR_P const fstr=nullptr, const uint8_t maxlen=MAX_MESSAGE_SIZE) { + return expand_u8str_P(outstr, FTOP(ftpl), ind, cstr, fstr, maxlen); +} + #define LCD_MESSAGE_F(S) ui.set_status(F(S)) #define LCD_MESSAGE(M) ui.set_status(GET_TEXT_F(M)) #define LCD_MESSAGE_MIN(M) ui.set_min_status(GET_TEXT_F(M)) diff --git a/Marlin/src/lcd/menu/menu_info.cpp b/Marlin/src/lcd/menu/menu_info.cpp index 1df70ba802..31d83bd873 100644 --- a/Marlin/src/lcd/menu/menu_info.cpp +++ b/Marlin/src/lcd/menu/menu_info.cpp @@ -30,6 +30,10 @@ #include "menu_item.h" +#if ENABLED(CONFIGURABLE_MACHINE_NAME) + #include "../../MarlinCore.h" +#endif + #if HAS_GAMES #include "game/game.h" #endif @@ -246,7 +250,11 @@ void menu_info_board() { STATIC_ITEM(MSG_MARLIN, SS_DEFAULT|SS_INVERT); // Marlin STATIC_ITEM_F(F(SHORT_BUILD_VERSION)); // x.x.x-Branch STATIC_ITEM_F(F(STRING_DISTRIBUTION_DATE)); // YYYY-MM-DD HH:MM - STATIC_ITEM_F(F(MACHINE_NAME), SS_DEFAULT|SS_INVERT); // My3DPrinter + #if ENABLED(CONFIGURABLE_MACHINE_NAME) + STATIC_ITEM_C(&machine_name, SS_DEFAULT|SS_INVERT); // My3DPrinter + #else + STATIC_ITEM_F(F(MACHINE_NAME), SS_DEFAULT|SS_INVERT); // My3DPrinter + #endif STATIC_ITEM_F(F(WEBSITE_URL)); // www.my3dprinter.com PSTRING_ITEM(MSG_INFO_EXTRUDERS, STRINGIFY(EXTRUDERS), SS_CENTER); // Extruders: 2 #if HAS_LEVELING diff --git a/Marlin/src/lcd/menu/menu_item.h b/Marlin/src/lcd/menu/menu_item.h index 661deeb4e7..d81b1a8843 100644 --- a/Marlin/src/lcd/menu/menu_item.h +++ b/Marlin/src/lcd/menu/menu_item.h @@ -358,20 +358,24 @@ class MenuItem_bool : public MenuEditItemBase { // STATIC_ITEM draws a styled string with no highlight. // Parameters: label [, style [, char *value] ] -#define STATIC_ITEM_INNER_F(FLABEL, V...) do{ \ +#define STATIC_SKIP() do{ \ if (_skipStatic && encoderLine <= _thisItemNr) { \ ui.encoderPosition += ENCODER_STEPS_PER_MENU_ITEM; \ ++encoderLine; \ } \ - if (ui.should_draw()) \ - MenuItem_static::draw(_lcdLineNr, FLABEL, ##V); \ -} while(0) +}while(0) + +#define STATIC_ITEM_INNER_F(FLABEL, V...) do{ \ + STATIC_SKIP(); \ + if (ui.should_draw()) \ + MenuItem_static::draw(_lcdLineNr, FLABEL, ##V); \ +}while(0) #define STATIC_ITEM_F(FLABEL, V...) do{ \ if (MY_LINE()) \ STATIC_ITEM_INNER_F(FLABEL, ##V); \ NEXT_ITEM(); \ -} while(0) +}while(0) #define STATIC_ITEM_N_F(N, FLABEL, V...) do{ \ if (MY_LINE()) { \ @@ -381,6 +385,16 @@ class MenuItem_bool : public MenuEditItemBase { NEXT_ITEM(); \ }while(0) +#define STATIC_ITEM_N_F_C(N, FLABEL, CSTR, V...) do{ \ + if (MY_LINE()) { \ + MenuItemBase::init(N, CSTR); \ + STATIC_ITEM_INNER_F(FLABEL, ##V); \ + } \ + NEXT_ITEM(); \ +}while(0) + +#define STATIC_ITEM_C(CSTR, V...) STATIC_ITEM_N_F_C(0, F("$"), CSTR, ##V) + // PSTRING_ITEM is like STATIC_ITEM // but also takes a PSTR and style. diff --git a/Marlin/src/lcd/utf8.cpp b/Marlin/src/lcd/utf8.cpp index d9dd53e953..2fe6c14490 100644 --- a/Marlin/src/lcd/utf8.cpp +++ b/Marlin/src/lcd/utf8.cpp @@ -31,8 +31,6 @@ #include "../inc/MarlinConfigPre.h" -#if HAS_UTF8_UTILS - #include "../inc/MarlinConfig.h" #if HAS_WIRED_LCD @@ -204,5 +202,3 @@ uint8_t utf8_byte_pos_by_char_num(const char *pstart, const uint8_t charnum) { uint8_t utf8_byte_pos_by_char_num_P(PGM_P pstart, const uint8_t charnum) { return utf8_byte_pos_by_char_num_cb(pstart, read_byte_rom, charnum); } - -#endif // HAS_UTF8_UTILS diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index c156bfeaca..485d01066a 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -570,6 +570,13 @@ typedef struct SettingsDataStruct { uint8_t caselight_brightness; // M355 P #endif + // + // CONFIGURABLE_MACHINE_NAME + // + #if ENABLED(CONFIGURABLE_MACHINE_NAME) + MString<64> machine_name; // M550 P + #endif + // // PASSWORD_FEATURE // @@ -1686,6 +1693,13 @@ void MarlinSettings::postprocess() { EEPROM_WRITE(caselight.brightness); #endif + // + // CONFIGURABLE_MACHINE_NAME + // + #if ENABLED(CONFIGURABLE_MACHINE_NAME) + EEPROM_WRITE(machine_name); + #endif + // // Password feature // @@ -2810,6 +2824,13 @@ void MarlinSettings::postprocess() { EEPROM_READ(caselight.brightness); #endif + // + // CONFIGURABLE_MACHINE_NAME + // + #if ENABLED(CONFIGURABLE_MACHINE_NAME) + EEPROM_READ(machine_name); + #endif + // // Password feature // @@ -3399,6 +3420,11 @@ void MarlinSettings::reset() { // TERN_(CASELIGHT_USES_BRIGHTNESS, caselight.brightness = CASE_LIGHT_DEFAULT_BRIGHTNESS); + // + // CONFIGURABLE_MACHINE_NAME + // + TERN_(CONFIGURABLE_MACHINE_NAME, machine_name = PSTR(MACHINE_NAME)); + // // TOUCH_SCREEN_CALIBRATION // diff --git a/buildroot/tests/ARMED b/buildroot/tests/ARMED index e47e101d47..1ac016bc68 100755 --- a/buildroot/tests/ARMED +++ b/buildroot/tests/ARMED @@ -12,5 +12,5 @@ set -e restore_configs use_example_configs ArmEd opt_set X_DRIVER_TYPE TMC2130 Y_DRIVER_TYPE TMC2208 -opt_enable LASER_SYNCHRONOUS_M106_M107 +opt_enable CONFIGURABLE_MACHINE_NAME GCODE_QUOTED_STRINGS LASER_SYNCHRONOUS_M106_M107 exec_test $1 $2 "ArmEd Example Configuration with mixed TMC Drivers" "$3" diff --git a/buildroot/tests/SAMD21_minitronics20 b/buildroot/tests/SAMD21_minitronics20 index fb23e90be7..77404290a9 100755 --- a/buildroot/tests/SAMD21_minitronics20 +++ b/buildroot/tests/SAMD21_minitronics20 @@ -20,9 +20,10 @@ opt_set MOTHERBOARD BOARD_MINITRONICS20 SERIAL_PORT -1 \ opt_enable ENDSTOP_INTERRUPTS_FEATURE BLTOUCH Z_MIN_PROBE_REPEATABILITY_TEST \ FILAMENT_RUNOUT_SENSOR G26_MESH_VALIDATION MESH_EDIT_GFX_OVERLAY Z_SAFE_HOMING \ EEPROM_SETTINGS NOZZLE_PARK_FEATURE SDSUPPORT SD_CHECK_AND_RETRY \ - REPRAPWORLD_GRAPHICAL_LCD ADAPTIVE_STEP_SMOOTHING \ + REPRAPWORLD_GRAPHICAL_LCD ADAPTIVE_STEP_SMOOTHING LCD_INFO_MENU \ STATUS_MESSAGE_SCROLLING SET_PROGRESS_MANUALLY SHOW_REMAINING_TIME SET_REMAINING_TIME \ LONG_FILENAME_HOST_SUPPORT CUSTOM_FIRMWARE_UPLOAD M20_TIMESTAMP_SUPPORT \ + CONFIGURABLE_MACHINE_NAME GCODE_QUOTED_STRINGS \ SCROLL_LONG_FILENAMES BABYSTEPPING DOUBLECLICK_FOR_Z_BABYSTEPPING \ MOVE_Z_WHEN_IDLE BABYSTEP_ZPROBE_OFFSET BABYSTEP_GFX_OVERLAY \ LIN_ADVANCE ADVANCED_PAUSE_FEATURE PARK_HEAD_ON_PAUSE MONITOR_DRIVER_STATUS diff --git a/ini/features.ini b/ini/features.ini index a21c36b27e..49e0c5054e 100644 --- a/ini/features.ini +++ b/ini/features.ini @@ -295,6 +295,7 @@ PIDTEMPBED = build_src_filter=+ PIDTEMPCHAMBER = build_src_filter=+ SD_ABORT_ON_ENDSTOP_HIT = build_src_filter=+ +CONFIGURABLE_MACHINE_NAME = build_src_filter=+ BAUD_RATE_GCODE = build_src_filter=+ HAS_SMART_EFF_MOD = build_src_filter=+ COOLANT_CONTROL|AIR_ASSIST = build_src_filter=+ From da0bef50e168a028f60b39e3ed6591d371ce3862 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Mon, 17 Mar 2025 00:30:31 +0000 Subject: [PATCH 18/74] [cron] Bump distribution date (2025-03-17) --- Marlin/Version.h | 2 +- Marlin/src/inc/Version.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/Version.h b/Marlin/Version.h index a8330b0054..a8be38fe31 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-03-16" +//#define STRING_DISTRIBUTION_DATE "2025-03-17" /** * 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 7d3ef7cdac..c9db7e51b9 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-03-16" + #define STRING_DISTRIBUTION_DATE "2025-03-17" #endif /** From 28548efa751db0937997e2416856d501d92e57f0 Mon Sep 17 00:00:00 2001 From: ellensp <530024+ellensp@users.noreply.github.com> Date: Tue, 18 Mar 2025 06:54:21 +1300 Subject: [PATCH 19/74] =?UTF-8?q?=F0=9F=9A=B8=20Improve=20TFT=20touch=20ca?= =?UTF-8?q?librate=20(#26200)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/lcd/dogm/u8g/u8g_dev_tft_upscale_from_128x64.cpp | 1 + Marlin/src/lcd/language/language_en.h | 9 +++++---- Marlin/src/lcd/tft/ui_common.cpp | 5 +++++ 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/Marlin/src/lcd/dogm/u8g/u8g_dev_tft_upscale_from_128x64.cpp b/Marlin/src/lcd/dogm/u8g/u8g_dev_tft_upscale_from_128x64.cpp index 73b35b0ec2..e458c8e4c4 100644 --- a/Marlin/src/lcd/dogm/u8g/u8g_dev_tft_upscale_from_128x64.cpp +++ b/Marlin/src/lcd/dogm/u8g/u8g_dev_tft_upscale_from_128x64.cpp @@ -542,6 +542,7 @@ U8G_PB_DEV(u8g_dev_tft_320x240_upscale_from_128x64, WIDTH, HEIGHT, PAGE_HEIGHT, tftio.set_window(TFT_PIXEL_OFFSET_X, TFT_PIXEL_OFFSET_Y, X_HI, Y_HI); do { set_font(FONT_MENU); + lcd_put_u8str(0, 7, GET_TEXT_F(MSG_TOUCH_CALIBRATION)); lcd_put_u8str(0, LCD_PIXEL_HEIGHT / 2, str); } while (u8g.nextPage()); drawing_screen = false; diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index 307ff2590e..b033dc3c74 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -924,10 +924,11 @@ namespace LanguageNarrow_en { LSTR MSG_SOUND = _UxGT("Sound"); - LSTR MSG_TOP_LEFT = _UxGT("Top Left"); - LSTR MSG_BOTTOM_LEFT = _UxGT("Bottom Left"); - LSTR MSG_TOP_RIGHT = _UxGT("Top Right"); - LSTR MSG_BOTTOM_RIGHT = _UxGT("Bottom Right"); + LSTR MSG_TOP_LEFT = _UxGT("Touch Top Left"); + LSTR MSG_BOTTOM_LEFT = _UxGT("Touch Bottom Left"); + LSTR MSG_TOP_RIGHT = _UxGT("Touch Top Right"); + LSTR MSG_BOTTOM_RIGHT = _UxGT("Touch Bottom Right"); + LSTR MSG_TOUCH_CALIBRATION = _UxGT("Touch Calibration"); LSTR MSG_CALIBRATION_COMPLETED = _UxGT("Calibration Completed"); LSTR MSG_CALIBRATION_FAILED = _UxGT("Calibration Failed"); diff --git a/Marlin/src/lcd/tft/ui_common.cpp b/Marlin/src/lcd/tft/ui_common.cpp index e71a74247b..6d59e0ce8b 100644 --- a/Marlin/src/lcd/tft/ui_common.cpp +++ b/Marlin/src/lcd/tft/ui_common.cpp @@ -487,6 +487,11 @@ void MarlinUI::clear_for_drawing() { clear_lcd(); } touch.clear(); if (stage < CALIBRATION_SUCCESS) { + tft_string.set(GET_TEXT(MSG_TOUCH_CALIBRATION)); + tft.canvas(0, 0, TFT_WIDTH, tft_string.font_height()); + tft.set_background(COLOR_BACKGROUND); + tft.add_text(tft_string.center(TFT_WIDTH), 0, COLOR_MENU_TEXT, tft_string); + switch (stage) { case CALIBRATION_TOP_LEFT: tft_string.set(GET_TEXT(MSG_TOP_LEFT)); break; case CALIBRATION_TOP_RIGHT: tft_string.set(GET_TEXT(MSG_TOP_RIGHT)); break; From 2d6454b3521b8af11912d942cf006726a307cb44 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 17 Mar 2025 15:06:35 -0500 Subject: [PATCH 20/74] =?UTF-8?q?=F0=9F=A9=B9=20Update=20some=20SD=20SS=20?= =?UTF-8?q?pins?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Followup to #27650 --- Marlin/src/pins/stm32f0/pins_FLY_D5.h | 2 +- Marlin/src/pins/stm32f0/pins_FLY_DP5.h | 2 +- Marlin/src/pins/stm32f4/pins_FLY_CDY_V3.h | 2 +- Marlin/src/pins/stm32f4/pins_FLY_D8.h | 2 +- Marlin/src/pins/stm32f4/pins_FLY_SUPER8.h | 2 +- Marlin/src/pins/stm32f4/pins_MKS_NEPTUNE_3.h | 2 +- Marlin/src/pins/stm32f4/pins_MKS_NEPTUNE_X_common.h | 2 +- Marlin/src/pins/stm32h7/pins_FLY_D8_PRO.h | 2 +- Marlin/src/pins/stm32h7/pins_FLY_SUPER8_PRO.h | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Marlin/src/pins/stm32f0/pins_FLY_D5.h b/Marlin/src/pins/stm32f0/pins_FLY_D5.h index b75a5a62ac..c98dcb0b7e 100644 --- a/Marlin/src/pins/stm32f0/pins_FLY_D5.h +++ b/Marlin/src/pins/stm32f0/pins_FLY_D5.h @@ -173,7 +173,7 @@ #define SD_SCK_PIN EXP2_02_PIN #define SD_MISO_PIN EXP2_01_PIN #define SD_MOSI_PIN EXP2_06_PIN - #define SDSS EXP2_04_PIN + #define SD_SS_PIN EXP2_04_PIN #define SD_DETECT_PIN EXP2_07_PIN #endif diff --git a/Marlin/src/pins/stm32f0/pins_FLY_DP5.h b/Marlin/src/pins/stm32f0/pins_FLY_DP5.h index d3c7b50e45..f66187a646 100644 --- a/Marlin/src/pins/stm32f0/pins_FLY_DP5.h +++ b/Marlin/src/pins/stm32f0/pins_FLY_DP5.h @@ -180,7 +180,7 @@ #define SD_SCK_PIN EXP2_02_PIN #define SD_MISO_PIN EXP2_01_PIN #define SD_MOSI_PIN EXP2_06_PIN - #define SDSS EXP2_04_PIN + #define SD_SS_PIN EXP2_04_PIN #define SD_DETECT_PIN EXP2_07_PIN #endif diff --git a/Marlin/src/pins/stm32f4/pins_FLY_CDY_V3.h b/Marlin/src/pins/stm32f4/pins_FLY_CDY_V3.h index 44843da5bd..a7383967b2 100644 --- a/Marlin/src/pins/stm32f4/pins_FLY_CDY_V3.h +++ b/Marlin/src/pins/stm32f4/pins_FLY_CDY_V3.h @@ -199,7 +199,7 @@ #define SD_SCK_PIN EXP2_02_PIN #define SD_MISO_PIN EXP2_01_PIN #define SD_MOSI_PIN EXP2_06_PIN - #define SDSS EXP2_04_PIN + #define SD_SS_PIN EXP2_04_PIN #define SD_DETECT_PIN EXP2_07_PIN #endif diff --git a/Marlin/src/pins/stm32f4/pins_FLY_D8.h b/Marlin/src/pins/stm32f4/pins_FLY_D8.h index 974595c559..ada7c2a853 100644 --- a/Marlin/src/pins/stm32f4/pins_FLY_D8.h +++ b/Marlin/src/pins/stm32f4/pins_FLY_D8.h @@ -211,7 +211,7 @@ #define SD_SCK_PIN EXP2_02_PIN #define SD_MISO_PIN EXP2_01_PIN #define SD_MOSI_PIN EXP2_06_PIN - #define SDSS EXP2_04_PIN + #define SD_SS_PIN EXP2_04_PIN #define SD_DETECT_PIN EXP2_07_PIN #endif diff --git a/Marlin/src/pins/stm32f4/pins_FLY_SUPER8.h b/Marlin/src/pins/stm32f4/pins_FLY_SUPER8.h index 3ce5790fb8..9440758c45 100644 --- a/Marlin/src/pins/stm32f4/pins_FLY_SUPER8.h +++ b/Marlin/src/pins/stm32f4/pins_FLY_SUPER8.h @@ -220,7 +220,7 @@ #define SD_SCK_PIN EXP2_02_PIN #define SD_MISO_PIN EXP2_01_PIN #define SD_MOSI_PIN EXP2_06_PIN - #define SDSS EXP2_04_PIN + #define SD_SS_PIN EXP2_04_PIN #define SD_DETECT_PIN EXP2_07_PIN #endif diff --git a/Marlin/src/pins/stm32f4/pins_MKS_NEPTUNE_3.h b/Marlin/src/pins/stm32f4/pins_MKS_NEPTUNE_3.h index 2ee641d1c5..8df334d740 100644 --- a/Marlin/src/pins/stm32f4/pins_MKS_NEPTUNE_3.h +++ b/Marlin/src/pins/stm32f4/pins_MKS_NEPTUNE_3.h @@ -131,7 +131,7 @@ #if SD_CONNECTION_IS(ONBOARD) #define ENABLE_SPI3 #define SD_SS_PIN -1 - #define SDSS PB12 + #define SD_SS_PIN PB12 #define SD_SCK_PIN PB13 #define SD_MISO_PIN PB14 #define SD_MOSI_PIN PB15 diff --git a/Marlin/src/pins/stm32f4/pins_MKS_NEPTUNE_X_common.h b/Marlin/src/pins/stm32f4/pins_MKS_NEPTUNE_X_common.h index 627e14faf3..7d1d7943cf 100644 --- a/Marlin/src/pins/stm32f4/pins_MKS_NEPTUNE_X_common.h +++ b/Marlin/src/pins/stm32f4/pins_MKS_NEPTUNE_X_common.h @@ -250,7 +250,7 @@ #if SD_CONNECTION_IS(ONBOARD) #define ENABLE_SPI3 #define SD_SS_PIN -1 - #define SDSS PC9 + #define SD_SS_PIN PC9 #define SD_SCK_PIN PC10 #define SD_MISO_PIN PC11 #define SD_MOSI_PIN PC12 diff --git a/Marlin/src/pins/stm32h7/pins_FLY_D8_PRO.h b/Marlin/src/pins/stm32h7/pins_FLY_D8_PRO.h index 9b7cfb32c1..ab032a21a9 100644 --- a/Marlin/src/pins/stm32h7/pins_FLY_D8_PRO.h +++ b/Marlin/src/pins/stm32h7/pins_FLY_D8_PRO.h @@ -212,7 +212,7 @@ #define SD_SCK_PIN EXP2_02_PIN #define SD_MISO_PIN EXP2_01_PIN #define SD_MOSI_PIN EXP2_06_PIN - #define SDSS EXP2_04_PIN + #define SD_SS_PIN EXP2_04_PIN #define SD_DETECT_PIN EXP2_07_PIN #endif diff --git a/Marlin/src/pins/stm32h7/pins_FLY_SUPER8_PRO.h b/Marlin/src/pins/stm32h7/pins_FLY_SUPER8_PRO.h index 4e19a0e05f..60af38a03b 100644 --- a/Marlin/src/pins/stm32h7/pins_FLY_SUPER8_PRO.h +++ b/Marlin/src/pins/stm32h7/pins_FLY_SUPER8_PRO.h @@ -220,7 +220,7 @@ #define SD_SCK_PIN EXP2_02_PIN #define SD_MISO_PIN EXP2_01_PIN #define SD_MOSI_PIN EXP2_06_PIN - #define SDSS EXP2_04_PIN + #define SD_SS_PIN EXP2_04_PIN #define SD_DETECT_PIN EXP2_07_PIN #endif From e8c03630516023a1d7be57f05fad35a219ab5299 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 17 Mar 2025 15:19:21 -0500 Subject: [PATCH 21/74] =?UTF-8?q?=F0=9F=8E=A8=20cosmetics?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/module/ft_motion.cpp | 26 +++++++++---------- Marlin/src/module/motion.cpp | 4 +-- .../variants/MARLIN_FLY_D5/ldscript.ld | 2 +- .../variants/MARLIN_FLY_D7/ldscript.ld | 2 +- .../MARLIN_FLY_D8_PRO/PeripheralPins.c | 4 +-- 5 files changed, 19 insertions(+), 19 deletions(-) diff --git a/Marlin/src/module/ft_motion.cpp b/Marlin/src/module/ft_motion.cpp index 3877df983d..88d2fb60b3 100644 --- a/Marlin/src/module/ft_motion.cpp +++ b/Marlin/src/module/ft_motion.cpp @@ -582,7 +582,7 @@ void FTMotion::makeVector() { float accel_k = 0.0f; // (mm/s^2) Acceleration K factor float tau = (makeVector_idx + 1) * (FTM_TS); // (s) Time since start of block float dist = 0.0f; // (mm) Distance traveled - + if (makeVector_idx < N1) { // Acceleration phase dist = (f_s * tau) + (0.5f * accel_P * sq(tau)); // (mm) Distance traveled for acceleration phase since start of block @@ -599,25 +599,25 @@ void FTMotion::makeVector() { dist = s_2e + F_P * tau + 0.5f * decel_P * sq(tau); // (mm) Distance traveled for deceleration phase since start of block accel_k = decel_P; // (mm/s^2) Acceleration K factor from Decel phase } - + #define _SET_TRAJ(q) traj.q[makeVector_batchIdx] = startPosn.q + ratio.q * dist; LOGICAL_AXIS_MAP_LC(_SET_TRAJ); - + #if HAS_EXTRUDERS if (cfg.linearAdvEna) { float dedt_adj = (traj.e[makeVector_batchIdx] - e_raw_z1) * (FTM_FS); if (ratio.e > 0.0f) dedt_adj += accel_k * cfg.linearAdvK * 0.0001f; - + e_raw_z1 = traj.e[makeVector_batchIdx]; e_advanced_z1 += dedt_adj * (FTM_TS); traj.e[makeVector_batchIdx] = e_advanced_z1; } #endif - + // Update shaping parameters if needed. - + switch (cfg.dynFreqMode) { - + #if HAS_DYNAMIC_FREQ_MM case dynFreqMode_Z_BASED: { static float oldz = 0.0f; @@ -635,7 +635,7 @@ void FTMotion::makeVector() { } } break; #endif - + #if HAS_DYNAMIC_FREQ_G case dynFreqMode_MASS_BASED: // Update constantly. The optimization done for Z value makes @@ -648,10 +648,10 @@ void FTMotion::makeVector() { #endif break; #endif - + default: break; } - + // Apply shaping if active on each axis #if HAS_FTM_SHAPING #if HAS_X_AXIS @@ -664,7 +664,7 @@ void FTMotion::makeVector() { } } #endif - + #if HAS_Y_AXIS if (shaping.y.ena) { shaping.y.d_zi[shaping.zi_idx] = traj.y[makeVector_batchIdx]; @@ -677,13 +677,13 @@ void FTMotion::makeVector() { #endif if (++shaping.zi_idx == (FTM_ZMAX)) shaping.zi_idx = 0; #endif // HAS_FTM_SHAPING - + // Filled up the queue with regular and shaped steps if (++makeVector_batchIdx == FTM_WINDOW_SIZE) { makeVector_batchIdx = BATCH_SIDX_IN_WINDOW; batchRdy = true; } - + if (++makeVector_idx == max_intervals) { blockProcRdy = false; makeVector_idx = 0; diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index dc218290a0..6a039c8ab9 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -2626,7 +2626,7 @@ void prepare_line_to_destination() { default: return; } - // Phase distance to nearest home phase position when moving in the backout direction from endstop(may be negative). + // Phase distance to nearest home phase position when moving in the backout direction from endstop (may be negative). int16_t phaseDelta = (home_phase[axis] - phaseCurrent) * stepperBackoutDir; // Check if home distance within endstop assumed repeatability noise of .05mm and warn. @@ -2638,7 +2638,7 @@ void prepare_line_to_destination() { // Skip to next if target position is behind current. So it only moves away from endstop. if (phaseDelta < 0) phaseDelta += 1024; - // Convert TMC µsteps(phase) to whole Marlin µsteps to effector backout direction to mm + // Convert TMC µsteps (phase) to whole Marlin µsteps to effector backout direction to mm const float mmDelta = int16_t(phaseDelta / phasePerUStep) * effectorBackoutDir * planner.mm_per_step[axis]; // Optional debug messages diff --git a/buildroot/share/PlatformIO/variants/MARLIN_FLY_D5/ldscript.ld b/buildroot/share/PlatformIO/variants/MARLIN_FLY_D5/ldscript.ld index 5eee783933..e86d8aa274 100644 --- a/buildroot/share/PlatformIO/variants/MARLIN_FLY_D5/ldscript.ld +++ b/buildroot/share/PlatformIO/variants/MARLIN_FLY_D5/ldscript.ld @@ -37,7 +37,7 @@ _Min_Stack_Size = 0x400; /* required amount of stack */ MEMORY { RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 16K - FLASH (rx) : ORIGIN = 0x8000000 , LENGTH = 128K + FLASH (rx) : ORIGIN = 0x8000000 , LENGTH = 128K } /* Sections */ diff --git a/buildroot/share/PlatformIO/variants/MARLIN_FLY_D7/ldscript.ld b/buildroot/share/PlatformIO/variants/MARLIN_FLY_D7/ldscript.ld index 5eee783933..e86d8aa274 100644 --- a/buildroot/share/PlatformIO/variants/MARLIN_FLY_D7/ldscript.ld +++ b/buildroot/share/PlatformIO/variants/MARLIN_FLY_D7/ldscript.ld @@ -37,7 +37,7 @@ _Min_Stack_Size = 0x400; /* required amount of stack */ MEMORY { RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 16K - FLASH (rx) : ORIGIN = 0x8000000 , LENGTH = 128K + FLASH (rx) : ORIGIN = 0x8000000 , LENGTH = 128K } /* Sections */ diff --git a/buildroot/share/PlatformIO/variants/MARLIN_FLY_D8_PRO/PeripheralPins.c b/buildroot/share/PlatformIO/variants/MARLIN_FLY_D8_PRO/PeripheralPins.c index b0a78e5e85..f71d59c6f5 100644 --- a/buildroot/share/PlatformIO/variants/MARLIN_FLY_D8_PRO/PeripheralPins.c +++ b/buildroot/share/PlatformIO/variants/MARLIN_FLY_D8_PRO/PeripheralPins.c @@ -199,7 +199,7 @@ WEAK const PinMap PinMap_TIM[] = { WEAK const PinMap PinMap_UART_TX[] = { // {PA_0, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, // {PA_2, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, - // {PA_9, LPUART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_LPUART)}, + // {PA_9, LPUART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_LPUART)}, {PA_9_ALT1, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)},// EXP2_03_PIN // {PA_12, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_UART4)}, // {PA_15, UART7, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_UART7)}, @@ -231,7 +231,7 @@ WEAK const PinMap PinMap_UART_RX[] = { // {PA_1, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF8_UART4)}, // {PA_3, USART2, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART2)}, // {PA_8, UART7, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_UART7)}, - // {PA_10, LPUART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_LPUART)}, + // {PA_10, LPUART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF3_LPUART)}, {PA_10_ALT1, USART1, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF7_USART1)},// EXP2_05_PIN // {PA_11, UART4, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF6_UART4)}, // {PB_3, UART7, STM_PIN_DATA(STM_MODE_AF_PP, GPIO_PULLUP, GPIO_AF11_UART7)}, From e11a5ee717e35136afe23715fa04f3b63c1917b3 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 17 Mar 2025 16:04:42 -0500 Subject: [PATCH 22/74] =?UTF-8?q?=F0=9F=93=9D=20Some=20config=20comment=20?= =?UTF-8?q?updates?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Andrew <18502096+classicrocker883@users.noreply.github.com> --- Marlin/Configuration.h | 52 +++++++++++++++++++-------------- Marlin/Configuration_adv.h | 59 ++++++++++++++++++++------------------ 2 files changed, 61 insertions(+), 50 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index e9dc6f0fd1..6e16dc5caf 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -2899,13 +2899,15 @@ // //#define MAKEBOARD_MINI_2_LINE_DISPLAY_1602 -// -// ANET and Tronxy 20x4 Controller -// -//#define ZONESTAR_LCD // Requires ADC_KEYPAD_PIN to be assigned to an analog pin. - // This LCD is known to be susceptible to electrical interference - // which scrambles the display. Pressing any button clears it up. - // This is a LCD2004 display with 5 analog buttons. +/** + * ANET and Tronxy 20x4 Controller + * LCD2004 display with 5 analog buttons. + * + * NOTE: Requires ADC_KEYPAD_PIN to be assigned to an analog pin. + * This LCD is known to be susceptible to electrical interference which + * scrambles the display. Press any button to clear it up. + */ +//#define ZONESTAR_LCD // // Generic 16x2, 16x4, 20x2, or 20x4 character-based LCD. @@ -3542,22 +3544,26 @@ // :[1,2,3,4,5,6,7,8] //#define NUM_M106_FANS 1 -// Use software PWM to drive the fan, as for the heaters. This uses a very low frequency -// which is not as annoying as with the hardware PWM. On the other hand, if this frequency -// is too low, you should also increment SOFT_PWM_SCALE. +/** + * Use software PWM to drive the fan, as for the heaters. This uses a very low frequency + * which is not as annoying as with the hardware PWM. On the other hand, if this frequency + * is too low, you should also increment SOFT_PWM_SCALE. + */ //#define FAN_SOFT_PWM -// Incrementing this by 1 will double the software PWM frequency, -// affecting heaters, and the fan if FAN_SOFT_PWM is enabled. -// However, control resolution will be halved for each increment; -// at zero value, there are 128 effective control positions. -// :[0,1,2,3,4,5,6,7] +/** + * Incrementing this by 1 will double the software PWM frequency, affecting heaters, and + * the fan if FAN_SOFT_PWM is enabled. However, control resolution will be halved for each + * increment; at zero value, there are 128 effective control positions. + * :[0,1,2,3,4,5,6,7] + */ #define SOFT_PWM_SCALE 0 -// If SOFT_PWM_SCALE is set to a value higher than 0, dithering can -// be used to mitigate the associated resolution loss. If enabled, -// some of the PWM cycles are stretched so on average the desired -// duty cycle is attained. +/** + * If SOFT_PWM_SCALE is set to a value higher than 0, dithering can be used to mitigate the + * associated resolution loss. If enabled, some of the PWM cycles are stretched so on average + * the desired duty cycle is attained. + */ //#define SOFT_PWM_DITHER // @section extras @@ -3567,9 +3573,11 @@ // @section lights -// Temperature status LEDs that display the hotend and bed temperature. -// If all hotends, bed temperature, and target temperature are under 54C -// then the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) +/** + * Temperature status LEDs that display the hotend and bed temperature. + * If all hotends, bed temperature, and target temperature are under 54C + * the BLUE led is on. Otherwise the RED led is on. (1C hysteresis) + */ //#define TEMP_STAT_LEDS // Support for BlinkM/CyzRgb diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index ff85b6c0e3..45ba05cbba 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1419,24 +1419,24 @@ #define MICROSTEP_MODES { 16, 16, 16, 16, 16, 16 } // [1,2,4,8,16] /** - * @section stepper motor current + * @section stepper motor current * - * Some boards have a means of setting the stepper motor current via firmware. + * Some boards have a means of setting the stepper motor current via firmware. * - * The power on motor currents are set by: - * PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2 - * known compatible chips: A4982 - * DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H - * known compatible chips: AD5206 - * DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2 - * known compatible chips: MCP4728 - * DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, AZTEEG_X5_MINI_WIFI, MIGHTYBOARD_REVE - * known compatible chips: MCP4451, MCP4018 + * The power on motor currents are set by: + * PWM_MOTOR_CURRENT - used by MINIRAMBO & ULTIMAIN_2 + * known compatible chips: A4982 + * DIGIPOT_MOTOR_CURRENT - used by BQ_ZUM_MEGA_3D, RAMBO & SCOOVO_X9H + * known compatible chips: AD5206 + * DAC_MOTOR_CURRENT_DEFAULT - used by PRINTRBOARD_REVF & RIGIDBOARD_V2 + * known compatible chips: MCP4728 + * DIGIPOT_I2C_MOTOR_CURRENTS - used by 5DPRINT, AZTEEG_X3_PRO, AZTEEG_X5_MINI_WIFI, MIGHTYBOARD_REVE + * known compatible chips: MCP4451, MCP4018 * - * Motor currents can also be set by M907 - M910 and by the LCD. - * M907 - applies to all. - * M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H - * M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2 + * Motor currents can also be set by M907 - M910 and by the LCD. + * M907 - applies to all. + * M908 - BQ_ZUM_MEGA_3D, RAMBO, PRINTRBOARD_REVF, RIGIDBOARD_V2 & SCOOVO_X9H + * M909, M910 & LCD - only PRINTRBOARD_REVF & RIGIDBOARD_V2 */ //#define PWM_MOTOR_CURRENT { 1300, 1300, 1250 } // Values in milliamps //#define DIGIPOT_MOTOR_CURRENT { 135,135,135,135,135 } // Values 0-255 (RAMBO 135 = ~0.75A, 185 = ~1A) @@ -2634,19 +2634,23 @@ #define MAX_CMD_SIZE 96 #define BUFSIZE 4 -// Transmission to Host Buffer Size -// To save 386 bytes of flash (and TX_BUFFER_SIZE+3 bytes of RAM) set to 0. -// To buffer a simple "ok" you need 4 bytes. -// For ADVANCED_OK (M105) you need 32 bytes. -// For debug-echo: 128 bytes for the optimal speed. -// Other output doesn't need to be that speedy. -// :[0, 2, 4, 8, 16, 32, 64, 128, 256] +/** + * Host Transmit Buffer Size + * - Costs 386 bytes of flash and TX_BUFFER_SIZE+3 bytes of SRAM (if not 0). + * - 4 bytes required to buffer a simple "ok". + * - 32 bytes for ADVANCED_OK (M105). + * - 128 bytes for the optimal speed of 'debug-echo:' + * - Other output doesn't need to be that speedy. + * :[0, 2, 4, 8, 16, 32, 64, 128, 256] + */ #define TX_BUFFER_SIZE 0 -// Host Receive Buffer Size -// Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. -// To use flow control, set this buffer size to at least 1024 bytes. -// :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] +/** + * Host Receive Buffer Size + * Without XON/XOFF flow control (see SERIAL_XON_XOFF below) 32 bytes should be enough. + * To use flow control, set this buffer size to at least 1024 bytes. + * :[0, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048] + */ //#define RX_BUFFER_SIZE 1024 #if RX_BUFFER_SIZE >= 1024 @@ -3913,7 +3917,7 @@ /** * Extra options for the M114 "Current Position" report */ -//#define M114_DETAIL // Use 'M114` for details to check planner calculations +//#define M114_DETAIL // Use 'M114 D' for details to check planner calculations //#define M114_REALTIME // Real current position based on forward kinematics //#define M114_LEGACY // M114 used to synchronize on every call. Enable if needed. @@ -3960,7 +3964,6 @@ * Spend 28 bytes of SRAM to optimize the G-code parser */ #define FASTER_GCODE_PARSER - #if ENABLED(FASTER_GCODE_PARSER) //#define GCODE_QUOTED_STRINGS // Support for quoted string parameters #endif From 0d87dd9d51d857048ba251ffa22d47a1b2ab2deb Mon Sep 17 00:00:00 2001 From: David Buezas Date: Mon, 17 Mar 2025 22:27:51 +0100 Subject: [PATCH 23/74] =?UTF-8?q?=E2=9C=A8=20LCD=5FDOUBLE=5FBUFFER=20(#267?= =?UTF-8?q?13)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/Configuration_adv.h | 4 ++++ Marlin/src/lcd/dogm/marlinui_DOGM.h | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 45ba05cbba..7cc54b2a96 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1619,6 +1619,10 @@ //#define SOUND_MENU_ITEM // Add a mute option to the LCD menu #define SOUND_ON_DEFAULT // Buzzer/speaker default enabled state + #if ENABLED(U8GLIB_SSD1309) + //#define LCD_DOUBLE_BUFFER // Optimize display updates. Costs ~1K of SRAM. + #endif + #if HAS_WIRED_LCD //#define DOUBLE_LCD_FRAMERATE // Not recommended for slow boards. #endif diff --git a/Marlin/src/lcd/dogm/marlinui_DOGM.h b/Marlin/src/lcd/dogm/marlinui_DOGM.h index d3f38cd619..ac65eab7de 100644 --- a/Marlin/src/lcd/dogm/marlinui_DOGM.h +++ b/Marlin/src/lcd/dogm/marlinui_DOGM.h @@ -201,7 +201,7 @@ // Generic support for SSD1309 OLED I2C LCDs - #define U8G_CLASS U8GLIB_SSD1309_128X64 + #define U8G_CLASS TERN(LCD_DOUBLE_BUFFER, U8GLIB_SSD1309_128X64_F, U8GLIB_SSD1309_128X64) #define U8G_PARAM (U8G_I2C_OPT_NONE | U8G_I2C_OPT_FAST) // I2C #elif ENABLED(U8GLIB_SSD1306) From 2f4f2bce15a63fe2b2280b43744176695ece4490 Mon Sep 17 00:00:00 2001 From: Andrew <18502096+classicrocker883@users.noreply.github.com> Date: Mon, 17 Mar 2025 19:04:59 -0400 Subject: [PATCH 24/74] =?UTF-8?q?=F0=9F=94=A8=20PowerShell=20compatibility?= =?UTF-8?q?=20(#27720)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ftdi_eve_lib/scripts/svg2cpp.py | 2 +- buildroot/bin/config.py | 12 ++++++------ buildroot/share/PlatformIO/scripts/config.py | 12 ++++++------ buildroot/share/PlatformIO/scripts/mc-apply.py | 8 ++++---- .../share/PlatformIO/scripts/preflight-checks.py | 2 +- buildroot/share/PlatformIO/scripts/schema.py | 2 +- buildroot/share/scripts/pinsformat.py | 4 ++-- buildroot/share/scripts/validate_boards.py | 4 ++-- 8 files changed, 23 insertions(+), 23 deletions(-) diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/scripts/svg2cpp.py b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/scripts/svg2cpp.py index f505636c86..3b26cc4e47 100755 --- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/scripts/svg2cpp.py +++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/scripts/svg2cpp.py @@ -296,7 +296,7 @@ if __name__ == "__main__": parser.add_argument('--layer', help='only include layers which have this string in their names') args = parser.parse_args() - f = open(args.filename, "r") + f = open(args.filename, "r", encoding='utf-8') data = f.read() # First pass to grab viewbox diff --git a/buildroot/bin/config.py b/buildroot/bin/config.py index 980c6ecc65..8d6cc5891a 100755 --- a/buildroot/bin/config.py +++ b/buildroot/bin/config.py @@ -16,7 +16,7 @@ def set(file_path, define_name, value): Returns True if the define was found and replaced, False otherwise. ''' # Read the contents of the file - with open(file_path, 'r') as f: + with open(file_path, 'r', encoding='utf-8') as f: content = f.readlines() modified = False @@ -32,7 +32,7 @@ def set(file_path, define_name, value): # Write the modified content back to the file only if changes were made if modified: - with open(file_path, 'w') as f: + with open(file_path, 'w', encoding='utf-8') as f: f.writelines(content) return True @@ -42,7 +42,7 @@ def add(file_path, define_name, value=""): ''' Insert a define on the first blank line in a file. ''' - with open(file_path, 'r') as f: + with open(file_path, 'r', encoding='utf-8') as f: content = f.readlines() # Prepend a space to the value if it's not empty @@ -59,7 +59,7 @@ def add(file_path, define_name, value=""): # If no blank line is found, append to the end content.append(f"#define {define_name}{value}\n") - with open(file_path, 'w') as f: + with open(file_path, 'w', encoding='utf-8') as f: f.writelines(content) def enable(file_path, define_name, enable=True): @@ -68,7 +68,7 @@ def enable(file_path, define_name, enable=True): Returns True if the define was found, False otherwise. ''' # Read the contents of the file - with open(file_path, 'r') as f: + with open(file_path, 'r', encoding='utf-8') as f: content = f.readlines() # Prepare the regex @@ -96,7 +96,7 @@ def enable(file_path, define_name, enable=True): # Write the modified content back to the file only if changes were made if modified: - with open(file_path, 'w') as f: + with open(file_path, 'w', encoding='utf-8') as f: f.writelines(content) return found diff --git a/buildroot/share/PlatformIO/scripts/config.py b/buildroot/share/PlatformIO/scripts/config.py index 980c6ecc65..8d6cc5891a 100755 --- a/buildroot/share/PlatformIO/scripts/config.py +++ b/buildroot/share/PlatformIO/scripts/config.py @@ -16,7 +16,7 @@ def set(file_path, define_name, value): Returns True if the define was found and replaced, False otherwise. ''' # Read the contents of the file - with open(file_path, 'r') as f: + with open(file_path, 'r', encoding='utf-8') as f: content = f.readlines() modified = False @@ -32,7 +32,7 @@ def set(file_path, define_name, value): # Write the modified content back to the file only if changes were made if modified: - with open(file_path, 'w') as f: + with open(file_path, 'w', encoding='utf-8') as f: f.writelines(content) return True @@ -42,7 +42,7 @@ def add(file_path, define_name, value=""): ''' Insert a define on the first blank line in a file. ''' - with open(file_path, 'r') as f: + with open(file_path, 'r', encoding='utf-8') as f: content = f.readlines() # Prepend a space to the value if it's not empty @@ -59,7 +59,7 @@ def add(file_path, define_name, value=""): # If no blank line is found, append to the end content.append(f"#define {define_name}{value}\n") - with open(file_path, 'w') as f: + with open(file_path, 'w', encoding='utf-8') as f: f.writelines(content) def enable(file_path, define_name, enable=True): @@ -68,7 +68,7 @@ def enable(file_path, define_name, enable=True): Returns True if the define was found, False otherwise. ''' # Read the contents of the file - with open(file_path, 'r') as f: + with open(file_path, 'r', encoding='utf-8') as f: content = f.readlines() # Prepare the regex @@ -96,7 +96,7 @@ def enable(file_path, define_name, enable=True): # Write the modified content back to the file only if changes were made if modified: - with open(file_path, 'w') as f: + with open(file_path, 'w', encoding='utf-8') as f: f.writelines(content) return found diff --git a/buildroot/share/PlatformIO/scripts/mc-apply.py b/buildroot/share/PlatformIO/scripts/mc-apply.py index 52d2ad6387..4f341b0065 100755 --- a/buildroot/share/PlatformIO/scripts/mc-apply.py +++ b/buildroot/share/PlatformIO/scripts/mc-apply.py @@ -25,7 +25,7 @@ def report_version(conf): print(k + ': ' + v) def write_opt_file(conf, outpath='Marlin/apply_config.sh'): - with open(outpath, 'w') as outfile: + with open(outpath, 'w', encoding='utf-8') as outfile: for key, val in conf.items(): if key in ('__INITIAL_HASH', 'VERSION'): continue @@ -49,7 +49,7 @@ def write_opt_file(conf, outpath='Marlin/apply_config.sh'): def back_up_config(name): # Back up the existing file before modifying it conf_path = 'Marlin/' + name - with open(conf_path, 'r') as f: + with open(conf_path, 'r', encoding='utf-8') as f: # Write a filename.bak#.ext retaining the original extension parts = conf_path.split('.') nr = '' @@ -59,7 +59,7 @@ def back_up_config(name): nr = 1 if nr == '' else nr + 1 continue - with open(bak_path, 'w') as b: + with open(bak_path, 'w', encoding='utf-8') as b: b.writelines(f.readlines()) break @@ -83,7 +83,7 @@ def main(): args = parser.parse_args() try: - infile = open(args.config_file, 'r') + infile = open(args.config_file, 'r', encoding='utf-8') except: print(f'No {args.config_file} found.') sys.exit(1) diff --git a/buildroot/share/PlatformIO/scripts/preflight-checks.py b/buildroot/share/PlatformIO/scripts/preflight-checks.py index 7ccf86c486..94b39927e0 100644 --- a/buildroot/share/PlatformIO/scripts/preflight-checks.py +++ b/buildroot/share/PlatformIO/scripts/preflight-checks.py @@ -78,7 +78,7 @@ if pioutil.is_pio_build(): modified_text = text.replace("BOTH(", "ALL(").replace("EITHER(", "ANY(") if text != modified_text: conf_modified = True - with open(conf_path, 'w') as file: + with open(conf_path, 'w', encoding="utf8") as file: file.write(modified_text) if conf_modified: diff --git a/buildroot/share/PlatformIO/scripts/schema.py b/buildroot/share/PlatformIO/scripts/schema.py index d23e5c4716..fcfae998c4 100755 --- a/buildroot/share/PlatformIO/scripts/schema.py +++ b/buildroot/share/PlatformIO/scripts/schema.py @@ -70,7 +70,7 @@ def group_options(schema): def load_boards(): bpath = Path("Marlin/src/core/boards.h") if bpath.is_file(): - with bpath.open() as bfile: + with bpath.open(encoding='utf-8') as bfile: boards = [] for line in bfile: if line.startswith("#define BOARD_"): diff --git a/buildroot/share/scripts/pinsformat.py b/buildroot/share/scripts/pinsformat.py index 0260d3174e..c1d88934b7 100755 --- a/buildroot/share/scripts/pinsformat.py +++ b/buildroot/share/scripts/pinsformat.py @@ -71,7 +71,7 @@ def format_pins(argv): file_text = sys.stdin.read() else: # Open and read the file src_file - with open(src_file, 'r') as rf: file_text = rf.read() + with open(src_file, 'r', encoding='utf-8') as rf: file_text = rf.read() if len(file_text) == 0: print('No text to process') @@ -80,7 +80,7 @@ def format_pins(argv): # Read from file or STDIN until it terminates filtered = process_text(file_text) if dst_file: - with open(dst_file, 'w') as wf: wf.write(filtered) + with open(dst_file, 'w', encoding='utf-8') as wf: wf.write(filtered) else: print(filtered) diff --git a/buildroot/share/scripts/validate_boards.py b/buildroot/share/scripts/validate_boards.py index 8d5650d6c6..0e4ae3351a 100755 --- a/buildroot/share/scripts/validate_boards.py +++ b/buildroot/share/scripts/validate_boards.py @@ -40,7 +40,7 @@ def boards_checks(argv): logmsg('Checking boards file:', src_file) # Open the file - with open(src_file, 'r') as f: + with open(src_file, 'r', encoding='utf-8') as f: lines = f.readlines() # Get the board names and numbers @@ -85,7 +85,7 @@ def boards_checks(argv): # Validate that pins.h has all the boards mentioned in it # pins_boards = [] - with open('Marlin/src/pins/pins.h', 'r') as f: + with open('Marlin/src/pins/pins.h', 'r', encoding='utf-8') as f: lines = f.readlines() if_count = 0 for line in lines: From 0a07bba213424fc8841bb803e697b830c861df4e Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Tue, 18 Mar 2025 00:28:49 +0000 Subject: [PATCH 25/74] [cron] Bump distribution date (2025-03-18) --- Marlin/Version.h | 2 +- Marlin/src/inc/Version.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/Version.h b/Marlin/Version.h index a8be38fe31..6f5abc50e1 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-03-17" +//#define STRING_DISTRIBUTION_DATE "2025-03-18" /** * 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 c9db7e51b9..a36c00865f 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-03-17" + #define STRING_DISTRIBUTION_DATE "2025-03-18" #endif /** From 367cea0d0dfdf71464faf1422f46417388139306 Mon Sep 17 00:00:00 2001 From: InsanityAutomation <38436470+InsanityAutomation@users.noreply.github.com> Date: Mon, 17 Mar 2025 22:35:20 -0400 Subject: [PATCH 26/74] =?UTF-8?q?=F0=9F=9A=B8=20Chamber=20Preheat=20comple?= =?UTF-8?q?tion=20(#26864)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Followup to #21156 Co-authored-by: Scott Lahteine --- Marlin/src/gcode/lcd/M145.cpp | 5 +++ Marlin/src/gcode/temp/M141_M191.cpp | 9 ++++- Marlin/src/lcd/extui/ui_api.cpp | 3 ++ Marlin/src/lcd/extui/ui_api.h | 3 ++ Marlin/src/lcd/language/language_en.h | 3 ++ Marlin/src/lcd/marlinui.cpp | 8 ++--- Marlin/src/lcd/marlinui.h | 3 ++ Marlin/src/lcd/menu/menu_configuration.cpp | 3 ++ Marlin/src/lcd/menu/menu_temperature.cpp | 39 +++++++++++++--------- Marlin/src/module/settings.cpp | 10 ++++-- Marlin/src/module/temperature.h | 2 +- 11 files changed, 64 insertions(+), 24 deletions(-) diff --git a/Marlin/src/gcode/lcd/M145.cpp b/Marlin/src/gcode/lcd/M145.cpp index 3cc6130dfd..a0aa340d0d 100644 --- a/Marlin/src/gcode/lcd/M145.cpp +++ b/Marlin/src/gcode/lcd/M145.cpp @@ -37,6 +37,7 @@ * S * H * B + * C * F */ void GcodeSuite::M145() { @@ -53,6 +54,10 @@ void GcodeSuite::M145() { if (parser.seenval('B')) mat.bed_temp = constrain(parser.value_int(), BED_MINTEMP, BED_MAX_TARGET); #endif + #if HAS_HEATED_CHAMBER + if (parser.seenval('C')) + mat.chamber_temp = constrain(parser.value_int(), CHAMBER_MINTEMP, CHAMBER_MAX_TARGET); + #endif #if HAS_FAN if (parser.seenval('F')) mat.fan_speed = constrain(parser.value_int(), 0, 255); diff --git a/Marlin/src/gcode/temp/M141_M191.cpp b/Marlin/src/gcode/temp/M141_M191.cpp index 81a078318a..3364fbc22e 100644 --- a/Marlin/src/gcode/temp/M141_M191.cpp +++ b/Marlin/src/gcode/temp/M141_M191.cpp @@ -39,9 +39,16 @@ */ void GcodeSuite::M141() { if (DEBUGGING(DRYRUN)) return; + // Accept 'I' if temperature presets are defined + #if HAS_PREHEAT + if (parser.seenval('I')) { + const uint8_t index = parser.value_byte(); + thermalManager.setTargetChamber(ui.material_preset[_MIN(index, PREHEAT_COUNT - 1)].chamber_temp); + return; + } + #endif if (parser.seenval('S')) { thermalManager.setTargetChamber(parser.value_celsius()); - #if ENABLED(PRINTJOB_TIMER_AUTOSTART) /** * Stop the timer at the end of print. Hotend, bed target, and chamber diff --git a/Marlin/src/lcd/extui/ui_api.cpp b/Marlin/src/lcd/extui/ui_api.cpp index a53b5f5dba..5b6caf378a 100644 --- a/Marlin/src/lcd/extui/ui_api.cpp +++ b/Marlin/src/lcd/extui/ui_api.cpp @@ -811,6 +811,9 @@ namespace ExtUI { #if HAS_HEATED_BED uint16_t getMaterial_preset_B(const uint16_t index) { return ui.material_preset[index].bed_temp; } #endif + #if HAS_HEATED_CHAMBER + uint16_t getMaterial_preset_C(const uint16_t index) { return ui.material_preset[index].chamber_temp; } + #endif #endif feedRate_t getFeedrate_mm_s() { return feedrate_mm_s; } diff --git a/Marlin/src/lcd/extui/ui_api.h b/Marlin/src/lcd/extui/ui_api.h index 2676d72aea..dfe393e39a 100644 --- a/Marlin/src/lcd/extui/ui_api.h +++ b/Marlin/src/lcd/extui/ui_api.h @@ -214,6 +214,9 @@ namespace ExtUI { #if HAS_HEATED_BED uint16_t getMaterial_preset_B(const uint16_t); #endif + #if HAS_HEATED_CHAMBER + uint16_t getMaterial_preset_C(const uint16_t); + #endif #endif // IDEX Machine Mode diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index b033dc3c74..6076c6fb30 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -155,6 +155,7 @@ namespace LanguageNarrow_en { LSTR MSG_PREHEAT_M_END_E = _UxGT("Preheat $ End ~"); LSTR MSG_PREHEAT_M_ALL = _UxGT("Preheat $ All"); LSTR MSG_PREHEAT_M_BEDONLY = _UxGT("Preheat $ Bed"); + LSTR MSG_PREHEAT_M_CHAMBER = _UxGT("Preheat $ Chmb"); LSTR MSG_PREHEAT_M_SETTINGS = _UxGT("Preheat $ Conf"); LSTR MSG_PREHEAT_HOTEND = _UxGT("Preheat Hotend"); @@ -1109,6 +1110,8 @@ namespace LanguageWide_en { LSTR MSG_HOMING_FEEDRATE_Y = _UxGT("Y Homing Feedrate"); LSTR MSG_HOMING_FEEDRATE_Z = _UxGT("Z Homing Feedrate"); LSTR MSG_EEPROM_INITIALIZED = _UxGT("Default Settings Restored"); + LSTR MSG_PREHEAT_M_CHAMBER = _UxGT("Preheat $ Chamber"); + LSTR MSG_PREHEAT_M_SETTINGS = _UxGT("Preheat $ Config"); #endif } diff --git a/Marlin/src/lcd/marlinui.cpp b/Marlin/src/lcd/marlinui.cpp index e8946edb28..bd974d8d0a 100644 --- a/Marlin/src/lcd/marlinui.cpp +++ b/Marlin/src/lcd/marlinui.cpp @@ -150,10 +150,10 @@ constexpr uint8_t epps = ENCODER_PULSES_PER_STEP; void MarlinUI::apply_preheat(const uint8_t m, const uint8_t pmask, const uint8_t e/*=active_extruder*/) { const preheat_t &pre = material_preset[m]; - TERN_(HAS_HOTEND, if (TEST(pmask, PT_HOTEND)) thermalManager.setTargetHotend(pre.hotend_temp, e)); - TERN_(HAS_HEATED_BED, if (TEST(pmask, PT_BED)) thermalManager.setTargetBed(pre.bed_temp)); - //TERN_(HAS_HEATED_CHAMBER, if (TEST(pmask, PT_CHAMBER)) thermalManager.setTargetChamber(pre.chamber_temp)); - TERN_(HAS_FAN, if (TEST(pmask, PT_FAN)) thermalManager.set_fan_speed(0, pre.fan_speed)); + TERN_(HAS_HOTEND, if (TEST(pmask, PT_HOTEND)) thermalManager.setTargetHotend(pre.hotend_temp, e)); + TERN_(HAS_HEATED_BED, if (TEST(pmask, PT_BED)) thermalManager.setTargetBed(pre.bed_temp)); + TERN_(HAS_HEATED_CHAMBER, if (TEST(pmask, PT_CHAMBER)) thermalManager.setTargetChamber(pre.chamber_temp)); + TERN_(HAS_FAN, if (TEST(pmask, PT_FAN)) thermalManager.set_fan_speed(0, pre.fan_speed)); } #endif diff --git a/Marlin/src/lcd/marlinui.h b/Marlin/src/lcd/marlinui.h index a47096a3bf..26b559e6bc 100644 --- a/Marlin/src/lcd/marlinui.h +++ b/Marlin/src/lcd/marlinui.h @@ -118,6 +118,9 @@ typedef bool (*statusResetFunc_t)(); #if HAS_HEATED_BED celsius_t bed_temp; #endif + #if HAS_HEATED_CHAMBER + celsius_t chamber_temp; + #endif #if HAS_FAN uint16_t fan_speed; #endif diff --git a/Marlin/src/lcd/menu/menu_configuration.cpp b/Marlin/src/lcd/menu/menu_configuration.cpp index 65a2f222ce..c581bab4e3 100644 --- a/Marlin/src/lcd/menu/menu_configuration.cpp +++ b/Marlin/src/lcd/menu/menu_configuration.cpp @@ -451,6 +451,9 @@ void menu_advanced_settings(); #if HAS_HEATED_BED EDIT_ITEM(int3, MSG_BED, &ui.material_preset[m].bed_temp, BED_MINTEMP, BED_MAX_TARGET); #endif + #if HAS_HEATED_CHAMBER + EDIT_ITEM(int3, MSG_CHAMBER, &ui.material_preset[m].chamber_temp, CHAMBER_MINTEMP, CHAMBER_MAX_TARGET); + #endif #if ENABLED(EEPROM_SETTINGS) ACTION_ITEM(MSG_STORE_EEPROM, ui.store_settings); #endif diff --git a/Marlin/src/lcd/menu/menu_temperature.cpp b/Marlin/src/lcd/menu/menu_temperature.cpp index e8a7b25dcb..1a43b121ce 100644 --- a/Marlin/src/lcd/menu/menu_temperature.cpp +++ b/Marlin/src/lcd/menu/menu_temperature.cpp @@ -45,15 +45,17 @@ #if HAS_PREHEAT - void Temperature::lcd_preheat(const uint8_t e, const int8_t indh, const int8_t indb) { - UNUSED(e); UNUSED(indh); UNUSED(indb); + void Temperature::lcd_preheat(const uint8_t e, const int8_t indh/*=-1*/, const int8_t indb/*=-1*/, const int8_t indc/*=-1*/) { + UNUSED(e); UNUSED(indh); UNUSED(indb); UNUSED(indc); #if HAS_HOTEND - if (indh >= 0 && ui.material_preset[indh].hotend_temp > 0) - setTargetHotend(_MIN(thermalManager.hotend_max_target(e), ui.material_preset[indh].hotend_temp), e); + if (indh >= 0 && ui.material_preset[indh].hotend_temp > 0) setTargetHotend(ui.material_preset[indh].hotend_temp, e); #endif #if HAS_HEATED_BED if (indb >= 0 && ui.material_preset[indb].bed_temp > 0) setTargetBed(ui.material_preset[indb].bed_temp); #endif + #if HAS_HEATED_CHAMBER + if (indc >= 0 && ui.material_preset[indc].chamber_temp > 0) setTargetChamber(ui.material_preset[indc].chamber_temp); + #endif #if HAS_FAN if (indh >= 0) { const uint8_t fan_index = active_extruder < (FAN_COUNT) ? active_extruder : 0; @@ -68,30 +70,33 @@ } #if HAS_TEMP_HOTEND - inline void _preheat_end(const uint8_t m, const uint8_t e) { thermalManager.lcd_preheat(e, m, -1); } - void do_preheat_end_m() { _preheat_end(editable.int8, 0); } + inline void _preheat_end(const uint8_t e, const uint8_t m) { thermalManager.lcd_preheat(e, m); } + void do_preheat_end_m() { _preheat_end(0, editable.int8); } #endif #if HAS_HEATED_BED inline void _preheat_bed(const uint8_t m) { thermalManager.lcd_preheat(0, -1, m); } #endif + #if HAS_HEATED_CHAMBER + inline void _preheat_chamber(const uint8_t m) { thermalManager.lcd_preheat(0, -1, -1, m); } + #endif #if HAS_COOLER - inline void _precool_laser(const uint8_t m, const uint8_t e) { thermalManager.lcd_preheat(e, m, -1); } - void do_precool_laser_m() { _precool_laser(editable.int8, thermalManager.temp_cooler.target); } + inline void _precool_laser(const uint8_t e, const uint8_t m) { thermalManager.lcd_preheat(e, m); } + void do_precool_laser_m() { _precool_laser(thermalManager.temp_cooler.target, editable.int8); } #endif - #if HAS_TEMP_HOTEND && HAS_HEATED_BED - inline void _preheat_both(const uint8_t m, const uint8_t e) { thermalManager.lcd_preheat(e, m, m); } + #if HAS_TEMP_HOTEND && (HAS_HEATED_BED || HAS_HEATED_CHAMBER) + inline void _preheat_all(const uint8_t e, const uint8_t m) { thermalManager.lcd_preheat(e, m, m, m); } // Indexed "Preheat ABC" and "Heat Bed" items #define PREHEAT_ITEMS(M,E) do{ \ - ACTION_ITEM_N_f(E, ui.get_preheat_label(M), MSG_PREHEAT_M_H, []{ _preheat_both(M, MenuItemBase::itemIndex); }); \ - ACTION_ITEM_N_f(E, ui.get_preheat_label(M), MSG_PREHEAT_M_END_E, []{ _preheat_end(M, MenuItemBase::itemIndex); }); \ + ACTION_ITEM_N_f(E, ui.get_preheat_label(M), MSG_PREHEAT_M_H, []{ _preheat_all(MenuItemBase::itemIndex, M); }); \ + ACTION_ITEM_N_f(E, ui.get_preheat_label(M), MSG_PREHEAT_M_END_E, []{ _preheat_end(MenuItemBase::itemIndex, M); }); \ }while(0) #elif HAS_MULTI_HOTEND // No heated bed, so just indexed "Preheat ABC" items - #define PREHEAT_ITEMS(M,E) ACTION_ITEM_N_f(E, ui.get_preheat_label(M), MSG_PREHEAT_M_H, []{ _preheat_end(M, MenuItemBase::itemIndex); }) + #define PREHEAT_ITEMS(M,E) ACTION_ITEM_N_f(E, ui.get_preheat_label(M), MSG_PREHEAT_M_H, []{ _preheat_end(MenuItemBase::itemIndex, M); }) #endif @@ -107,8 +112,8 @@ #if HOTENDS == 1 - #if HAS_HEATED_BED - ACTION_ITEM_f(ui.get_preheat_label(m), MSG_PREHEAT_M, []{ _preheat_both(editable.int8, 0); }); + #if HAS_HEATED_BED || HAS_HEATED_CHAMBER + ACTION_ITEM_f(ui.get_preheat_label(m), MSG_PREHEAT_M, []{ _preheat_all(0, editable.int8); }); ACTION_ITEM_f(ui.get_preheat_label(m), MSG_PREHEAT_M_END, do_preheat_end_m); #else ACTION_ITEM_f(ui.get_preheat_label(m), MSG_PREHEAT_M, do_preheat_end_m); @@ -129,6 +134,10 @@ ACTION_ITEM_f(ui.get_preheat_label(m), MSG_PREHEAT_M_BEDONLY, []{ _preheat_bed(editable.int8); }); #endif + #if HAS_HEATED_CHAMBER + ACTION_ITEM_f(ui.get_preheat_label(m), MSG_PREHEAT_M_CHAMBER, []{ _preheat_chamber(editable.int8); }); + #endif + END_MENU(); } diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index 485d01066a..8c33e73f00 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -3564,13 +3564,17 @@ void MarlinSettings::reset() { #if HAS_HEATED_BED constexpr uint16_t bpre[] = { REPEAT2_S(1, INCREMENT(PREHEAT_COUNT), _PITEM, TEMP_BED) }; #endif + #if HAS_HEATED_CHAMBER + constexpr uint16_t cpre[] = { REPEAT2_S(1, INCREMENT(PREHEAT_COUNT), _PITEM, TEMP_CHAMBER) }; + #endif #if HAS_FAN constexpr uint8_t fpre[] = { REPEAT2_S(1, INCREMENT(PREHEAT_COUNT), _PITEM, FAN_SPEED) }; #endif for (uint8_t i = 0; i < PREHEAT_COUNT; ++i) { - TERN_(HAS_HOTEND, ui.material_preset[i].hotend_temp = hpre[i]); - TERN_(HAS_HEATED_BED, ui.material_preset[i].bed_temp = bpre[i]); - TERN_(HAS_FAN, ui.material_preset[i].fan_speed = fpre[i]); + TERN_(HAS_HOTEND, ui.material_preset[i].hotend_temp = hpre[i]); + TERN_(HAS_HEATED_BED, ui.material_preset[i].bed_temp = bpre[i]); + TERN_(HAS_HEATED_CHAMBER, ui.material_preset[i].chamber_temp = cpre[i]); + TERN_(HAS_FAN, ui.material_preset[i].fan_speed = fpre[i]); } #endif diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index 27e28f07a8..cc25cfad14 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -1335,7 +1335,7 @@ class Temperature { #endif #if HAS_MARLINUI_MENU && HAS_TEMPERATURE && HAS_PREHEAT - static void lcd_preheat(const uint8_t e, const int8_t indh, const int8_t indb); + static void lcd_preheat(const uint8_t e, const int8_t indh=-1, const int8_t indb=-1, const int8_t indc=-1); #endif private: From 4ad6fa59df95d175c0acb49c33c2cf83fee5d449 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 18 Mar 2025 18:22:22 -0500 Subject: [PATCH 27/74] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20More?= =?UTF-8?q?=20extensible=20Temperature::lcd=5Fpreheat?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/lcd/menu/menu_temperature.cpp | 32 +++++++++++++++--------- Marlin/src/module/temperature.h | 12 ++++++++- 2 files changed, 31 insertions(+), 13 deletions(-) diff --git a/Marlin/src/lcd/menu/menu_temperature.cpp b/Marlin/src/lcd/menu/menu_temperature.cpp index 1a43b121ce..0a376494e5 100644 --- a/Marlin/src/lcd/menu/menu_temperature.cpp +++ b/Marlin/src/lcd/menu/menu_temperature.cpp @@ -45,47 +45,55 @@ #if HAS_PREHEAT - void Temperature::lcd_preheat(const uint8_t e, const int8_t indh/*=-1*/, const int8_t indb/*=-1*/, const int8_t indc/*=-1*/) { - UNUSED(e); UNUSED(indh); UNUSED(indb); UNUSED(indc); + /** + * @fn Temperature::lcd_preheat + * @brief Apply the "preheat" parameters for a material preset to the + * hotend (or laser), bed, chamber, or all of the above. + * @param m Material index + * @param targets Bit mask of targets to "preheat" (or turn off) + * @param e Extruder index (if needed) + */ + void Temperature::lcd_preheat(const uint8_t m, const uint8_t targets, const uint8_t e/*=0*/) { + UNUSED(e); #if HAS_HOTEND - if (indh >= 0 && ui.material_preset[indh].hotend_temp > 0) setTargetHotend(ui.material_preset[indh].hotend_temp, e); + if (targets & PreheatTarget::HOTEND) setTargetHotend(ui.material_preset[m].hotend_temp, e); #endif #if HAS_HEATED_BED - if (indb >= 0 && ui.material_preset[indb].bed_temp > 0) setTargetBed(ui.material_preset[indb].bed_temp); + if (targets & PreheatTarget::BED) setTargetBed(ui.material_preset[m].bed_temp); #endif #if HAS_HEATED_CHAMBER - if (indc >= 0 && ui.material_preset[indc].chamber_temp > 0) setTargetChamber(ui.material_preset[indc].chamber_temp); + if (targets & PreheatTarget::CHAMBER) setTargetChamber(ui.material_preset[m].chamber_temp); #endif #if HAS_FAN - if (indh >= 0) { + if (targets & PreheatTarget::HOTEND) { const uint8_t fan_index = active_extruder < (FAN_COUNT) ? active_extruder : 0; if (true #if REDUNDANT_PART_COOLING_FAN && fan_index != REDUNDANT_PART_COOLING_FAN #endif - ) set_fan_speed(fan_index, ui.material_preset[indh].fan_speed); + ) set_fan_speed(fan_index, ui.material_preset[m].fan_speed); } #endif ui.return_to_status(); } #if HAS_TEMP_HOTEND - inline void _preheat_end(const uint8_t e, const uint8_t m) { thermalManager.lcd_preheat(e, m); } + inline void _preheat_end(const uint8_t e, const uint8_t m) { thermalManager.lcd_preheat(m, PreheatTarget::HOTEND, e); } void do_preheat_end_m() { _preheat_end(0, editable.int8); } #endif #if HAS_HEATED_BED - inline void _preheat_bed(const uint8_t m) { thermalManager.lcd_preheat(0, -1, m); } + inline void _preheat_bed(const uint8_t m) { thermalManager.lcd_preheat(m, PreheatTarget::BED); } #endif #if HAS_HEATED_CHAMBER - inline void _preheat_chamber(const uint8_t m) { thermalManager.lcd_preheat(0, -1, -1, m); } + inline void _preheat_chamber(const uint8_t m) { thermalManager.lcd_preheat(m, PreheatTarget::CHAMBER); } #endif #if HAS_COOLER - inline void _precool_laser(const uint8_t e, const uint8_t m) { thermalManager.lcd_preheat(e, m); } + inline void _precool_laser(const uint8_t e, const uint8_t m) { thermalManager.lcd_preheat(m, PreheatTarget::HOTEND, e); } void do_precool_laser_m() { _precool_laser(thermalManager.temp_cooler.target, editable.int8); } #endif #if HAS_TEMP_HOTEND && (HAS_HEATED_BED || HAS_HEATED_CHAMBER) - inline void _preheat_all(const uint8_t e, const uint8_t m) { thermalManager.lcd_preheat(e, m, m, m); } + inline void _preheat_all(const uint8_t e, const uint8_t m) { thermalManager.lcd_preheat(m, PreheatTarget::ALL, e); } // Indexed "Preheat ABC" and "Heat Bed" items #define PREHEAT_ITEMS(M,E) do{ \ diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index cc25cfad14..5f7ea8daf4 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -599,6 +599,15 @@ typedef struct { raw_adc_t raw_min, raw_max; celsius_t mintemp, maxtemp; } temp_ #define HAS_FAN_LOGIC 1 #endif +#if HAS_MARLINUI_MENU && HAS_TEMPERATURE && HAS_PREHEAT + enum PreheatTarget : uint8_t { + HOTEND = (1 << 0), + BED = (1 << 1), + CHAMBER = (1 << 2), + ALL = 0xFF + }; +#endif + class Temperature { public: @@ -1335,7 +1344,8 @@ class Temperature { #endif #if HAS_MARLINUI_MENU && HAS_TEMPERATURE && HAS_PREHEAT - static void lcd_preheat(const uint8_t e, const int8_t indh=-1, const int8_t indb=-1, const int8_t indc=-1); + // Apply the "preheat" parameters for a material preset to the hotend (or laser), bed, chamber, or all of the above + static void lcd_preheat(const uint8_t m, const uint8_t targets, const uint8_t e=0); #endif private: From 23fa94178e1b1d00869058575eee0e7f06602839 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Wed, 19 Mar 2025 00:31:12 +0000 Subject: [PATCH 28/74] [cron] Bump distribution date (2025-03-19) --- 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 6f5abc50e1..d2f7ac3ffd 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-03-18" +//#define STRING_DISTRIBUTION_DATE "2025-03-19" /** * 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 a36c00865f..fbdc9cdd04 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-03-18" + #define STRING_DISTRIBUTION_DATE "2025-03-19" #endif /** From 15ee0d0e081fd42cf00a5b26b289a2ea14ddd9f5 Mon Sep 17 00:00:00 2001 From: ellensp <530024+ellensp@users.noreply.github.com> Date: Wed, 19 Mar 2025 14:39:24 +1300 Subject: [PATCH 29/74] =?UTF-8?q?=E2=9C=A8=20MAG=5FMOUNTED=5FPROBE=5FSERVO?= =?UTF-8?q?=5FNR=20(#27551)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: gjdodd --- Marlin/Configuration.h | 14 ++++++++++++++ Marlin/src/inc/Conditionals-3-etc.h | 5 ++++- Marlin/src/inc/Conditionals-4-adv.h | 4 ++++ Marlin/src/inc/SanityCheck.h | 2 +- Marlin/src/module/probe.cpp | 24 ++++++++++++++++++++++-- Marlin/src/module/servo.h | 7 +++++++ buildroot/tests/LPC1769 | 2 +- 7 files changed, 53 insertions(+), 5 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 6e16dc5caf..1202bc1e53 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -1540,6 +1540,20 @@ #define PROBE_DEPLOY_FEEDRATE (133*60) // (mm/min) Probe deploy speed #define PROBE_STOW_FEEDRATE (133*60) // (mm/min) Probe stow speed + /** + * Magnetically Mounted Probe with a Servo mechanism + * Probe Deploy and Stow both follow the same basic sequence: + * - Rotate the SERVO to its Deployed angle + * - Perform XYZ moves to deploy or stow the PROBE + * - Rotate the SERVO to its Stowed angle + */ + //#define MAG_MOUNTED_PROBE_SERVO_NR 0 // Servo Number for this probe + #ifdef MAG_MOUNTED_PROBE_SERVO_NR + #define MAG_MOUNTED_PROBE_SERVO_ANGLES { 90, 0 } // Servo Angles for Deployed, Stowed + #define MAG_MOUNTED_PRE_DEPLOY { PROBE_DEPLOY_FEEDRATE, { 15, 160, 30 } } // Safe position for servo activation + #define MAG_MOUNTED_PRE_STOW { PROBE_DEPLOY_FEEDRATE, { 15, 160, 30 } } // Safe position for servo deactivation + #endif + #define MAG_MOUNTED_DEPLOY_1 { PROBE_DEPLOY_FEEDRATE, { 245, 114, 30 } } // Move to side Dock & Attach probe #define MAG_MOUNTED_DEPLOY_2 { PROBE_DEPLOY_FEEDRATE, { 210, 114, 30 } } // Move probe off dock #define MAG_MOUNTED_DEPLOY_3 { PROBE_DEPLOY_FEEDRATE, { 0, 0, 0 } } // Extra move if needed diff --git a/Marlin/src/inc/Conditionals-3-etc.h b/Marlin/src/inc/Conditionals-3-etc.h index 7f005c3539..e4dcdda58f 100644 --- a/Marlin/src/inc/Conditionals-3-etc.h +++ b/Marlin/src/inc/Conditionals-3-etc.h @@ -135,7 +135,10 @@ #ifdef Z_PROBE_SERVO_NR #define HAS_Z_SERVO_PROBE 1 #endif -#if ANY(HAS_Z_SERVO_PROBE, SWITCHING_EXTRUDER, SWITCHING_NOZZLE) +#ifdef MAG_MOUNTED_PROBE_SERVO_NR + #define HAS_MAG_MOUNTED_SERVO_PROBE 1 +#endif +#if ANY(HAS_Z_SERVO_PROBE, HAS_MAG_MOUNTED_SERVO_PROBE, SWITCHING_EXTRUDER, SWITCHING_NOZZLE) #define HAS_SERVO_ANGLES 1 #endif #if !HAS_SERVO_ANGLES diff --git a/Marlin/src/inc/Conditionals-4-adv.h b/Marlin/src/inc/Conditionals-4-adv.h index 103de78865..b697f22a20 100644 --- a/Marlin/src/inc/Conditionals-4-adv.h +++ b/Marlin/src/inc/Conditionals-4-adv.h @@ -53,6 +53,10 @@ #undef NUM_SERVOS #define NUM_SERVOS INCREMENT(Z_PROBE_SERVO_NR) #endif + #if HAS_MAG_MOUNTED_SERVO_PROBE && NUM_SERVOS <= MAG_MOUNTED_PROBE_SERVO_NR + #undef NUM_SERVOS + #define NUM_SERVOS INCREMENT(MAG_MOUNTED_PROBE_SERVO_NR) + #endif #if ENABLED(CHAMBER_VENT) && NUM_SERVOS <= CHAMBER_VENT_SERVO_NR #undef NUM_SERVOS #define NUM_SERVOS INCREMENT(CHAMBER_VENT_SERVO_NR) diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index e07fa78173..0029980ada 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -982,7 +982,7 @@ static_assert(NUM_SERVOS <= NUM_SERVO_PLUGS, "NUM_SERVOS (or some servo index) i /** * Servo deactivation depends on servo endstops, switching nozzle, or switching extruder */ -#if ENABLED(DEACTIVATE_SERVOS_AFTER_MOVE) && NONE(HAS_Z_SERVO_PROBE, POLARGRAPH) && !defined(SWITCHING_NOZZLE_SERVO_NR) && !defined(SWITCHING_EXTRUDER_SERVO_NR) && !defined(SWITCHING_TOOLHEAD_SERVO_NR) +#if ENABLED(DEACTIVATE_SERVOS_AFTER_MOVE) && NONE(HAS_Z_SERVO_PROBE, POLARGRAPH) && !defined(SWITCHING_NOZZLE_SERVO_NR) && !defined(SWITCHING_EXTRUDER_SERVO_NR) && !defined(SWITCHING_TOOLHEAD_SERVO_NR) && !defined(MAG_MOUNTED_PROBE_SERVO_NR) #error "Z_PROBE_SERVO_NR, switching nozzle, switching toolhead, switching extruder, or POLARGRAPH is required for DEACTIVATE_SERVOS_AFTER_MOVE." #endif diff --git a/Marlin/src/module/probe.cpp b/Marlin/src/module/probe.cpp index a66c11a782..e121bca812 100644 --- a/Marlin/src/module/probe.cpp +++ b/Marlin/src/module/probe.cpp @@ -82,7 +82,7 @@ #include "../feature/host_actions.h" // for PROMPT_USER_CONTINUE #endif -#if HAS_Z_SERVO_PROBE +#if HAS_Z_SERVO_PROBE || HAS_MAG_MOUNTED_SERVO_PROBE #include "servo.h" #endif @@ -272,6 +272,13 @@ xyz_pos_t Probe::offset; // Initialized by settings.load typedef struct { float fr_mm_min; xyz_pos_t where; } mag_probe_move_t; inline void run_deploy_moves() { + #ifdef MAG_MOUNTED_PRE_DEPLOY + constexpr mag_probe_move_t pre_deploy = MAG_MOUNTED_PRE_DEPLOY; + do_blocking_move_to(pre_deploy.where, MMM_TO_MMS(pre_deploy.fr_mm_min)); + #endif + #if HAS_MAG_MOUNTED_SERVO_PROBE + servo[MAG_MOUNTED_PROBE_SERVO_NR].move(servo_angles[MAG_MOUNTED_PROBE_SERVO_NR][0]); + #endif #ifdef MAG_MOUNTED_DEPLOY_1 constexpr mag_probe_move_t deploy_1 = MAG_MOUNTED_DEPLOY_1; do_blocking_move_to(deploy_1.where, MMM_TO_MMS(deploy_1.fr_mm_min)); @@ -292,9 +299,19 @@ xyz_pos_t Probe::offset; // Initialized by settings.load constexpr mag_probe_move_t deploy_5 = MAG_MOUNTED_DEPLOY_5; do_blocking_move_to(deploy_5.where, MMM_TO_MMS(deploy_5.fr_mm_min)); #endif + #if HAS_MAG_MOUNTED_SERVO_PROBE + servo[MAG_MOUNTED_PROBE_SERVO_NR].move(servo_angles[MAG_MOUNTED_PROBE_SERVO_NR][1]); + #endif } inline void run_stow_moves() { + #ifdef MAG_MOUNTED_PRE_STOW + constexpr mag_probe_move_t pre_stow = MAG_MOUNTED_PRE_STOW; + do_blocking_move_to(pre_stow.where, MMM_TO_MMS(pre_stow.fr_mm_min)); + #endif + #if HAS_MAG_MOUNTED_SERVO_PROBE + servo[MAG_MOUNTED_PROBE_SERVO_NR].move(servo_angles[MAG_MOUNTED_PROBE_SERVO_NR][0]); + #endif #ifdef MAG_MOUNTED_STOW_1 constexpr mag_probe_move_t stow_1 = MAG_MOUNTED_STOW_1; do_blocking_move_to(stow_1.where, MMM_TO_MMS(stow_1.fr_mm_min)); @@ -315,6 +332,9 @@ xyz_pos_t Probe::offset; // Initialized by settings.load constexpr mag_probe_move_t stow_5 = MAG_MOUNTED_STOW_5; do_blocking_move_to(stow_5.where, MMM_TO_MMS(stow_5.fr_mm_min)); #endif + #if HAS_MAG_MOUNTED_SERVO_PROBE + servo[MAG_MOUNTED_PROBE_SERVO_NR].move(servo_angles[MAG_MOUNTED_PROBE_SERVO_NR][1]); + #endif } #endif // MAG_MOUNTED_PROBE @@ -541,7 +561,7 @@ bool Probe::set_deployed(const bool deploy, const bool no_return/*=false*/) { #if ENABLED(PROBE_TRIGGERED_WHEN_STOWED_TEST) // Only deploy/stow if needed - if (PROBE_TRIGGERED() == deploy) { + if (PROBE_TRIGGERED() == deploy || !deploy) { if (!deploy) endstops.enable_z_probe(false); // Switch off triggered when stowed probes early // otherwise an Allen-Key probe can't be stowed. probe_specific_action(deploy); diff --git a/Marlin/src/module/servo.h b/Marlin/src/module/servo.h index 3b6c33a8f7..f35a8c3930 100644 --- a/Marlin/src/module/servo.h +++ b/Marlin/src/module/servo.h @@ -63,6 +63,9 @@ #endif constexpr uint16_t sazp[] = Z_SERVO_ANGLES; static_assert(COUNT(sazp) == 2, "Z_SERVO_ANGLES needs 2 angles."); + #elif defined(MAG_MOUNTED_PROBE_SERVO_ANGLES) + constexpr uint16_t sazp[] = MAG_MOUNTED_PROBE_SERVO_ANGLES; + static_assert(COUNT(sazp) == 2, "MAG_MOUNTED_PROBE_SERVO_ANGLES needs 2 angles."); #else constexpr uint16_t sazp[2] = { 0 }; #endif @@ -82,6 +85,9 @@ #ifndef Z_PROBE_SERVO_NR #define Z_PROBE_SERVO_NR -1 #endif + #ifndef MAG_MOUNTED_PROBE_SERVO_NR + #define MAG_MOUNTED_PROBE_SERVO_NR -1 + #endif #define SASN(J,I) TERN(SWITCHING_NOZZLE_TWO_SERVOS, sasn[J][I], sasn[I]) @@ -91,6 +97,7 @@ : N == SWITCHING_NOZZLE_SERVO_NR ? SASN(0,I) \ : N == SWITCHING_NOZZLE_E1_SERVO_NR ? SASN(1,I) \ : N == Z_PROBE_SERVO_NR ? sazp[I] \ + : N == MAG_MOUNTED_PROBE_SERVO_NR ? sazp[I] \ : 0 ) #if ENABLED(EDITABLE_SERVO_ANGLES) diff --git a/buildroot/tests/LPC1769 b/buildroot/tests/LPC1769 index ad14e3353d..a97790e988 100755 --- a/buildroot/tests/LPC1769 +++ b/buildroot/tests/LPC1769 @@ -15,7 +15,7 @@ exec_test $1 $2 "Azteeg X5GT Example Configuration" "$3" restore_configs opt_set MOTHERBOARD BOARD_SMOOTHIEBOARD \ EXTRUDERS 2 TEMP_SENSOR_0 -5 TEMP_SENSOR_1 -4 TEMP_SENSOR_BED 5 TEMP_0_CS_PIN P1_29 \ - GRID_MAX_POINTS_X 16 \ + MAG_MOUNTED_PROBE_SERVO_NR 0 GRID_MAX_POINTS_X 16 \ NOZZLE_CLEAN_START_POINT "{ { 10, 10, 3 }, { 10, 10, 3 } }" \ NOZZLE_CLEAN_END_POINT "{ { 10, 20, 3 }, { 10, 20, 3 } }" opt_enable TFTGLCD_PANEL_SPI SDSUPPORT ADAPTIVE_FAN_SLOWING REPORT_ADAPTIVE_FAN_SLOWING TEMP_TUNING_MAINTAIN_FAN \ From 719bb9c03bb0bc53d324f14bb6eef982e8cea4b1 Mon Sep 17 00:00:00 2001 From: ellensp <530024+ellensp@users.noreply.github.com> Date: Wed, 19 Mar 2025 15:14:58 +1300 Subject: [PATCH 30/74] =?UTF-8?q?=F0=9F=94=A7=20LCD=5FPINS=5FENABLE=20=3D>?= =?UTF-8?q?=20LCD=5FPINS=5FEN=20(#27700)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/pins/rp2040/pins_RP2040.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Marlin/src/pins/rp2040/pins_RP2040.h b/Marlin/src/pins/rp2040/pins_RP2040.h index 1b88ce347b..48e37e4e1f 100644 --- a/Marlin/src/pins/rp2040/pins_RP2040.h +++ b/Marlin/src/pins/rp2040/pins_RP2040.h @@ -320,13 +320,13 @@ #if ENABLED(REPRAPWORLD_GRAPHICAL_LCD) #define LCD_PINS_RS 49 // CS chip select /SS chip slave select - #define LCD_PINS_ENABLE 51 // SID (MOSI) + #define LCD_PINS_EN 51 // SID (MOSI) #define LCD_PINS_D4 52 // SCK (CLK) clock #elif ALL(IS_NEWPANEL, PANEL_ONE) #define LCD_PINS_RS 40 - #define LCD_PINS_ENABLE 42 + #define LCD_PINS_EN 42 #define LCD_PINS_D4 65 #define LCD_PINS_D5 66 #define LCD_PINS_D6 44 @@ -337,7 +337,7 @@ #if ENABLED(CR10_STOCKDISPLAY) #define LCD_PINS_RS 27 - #define LCD_PINS_ENABLE 29 + #define LCD_PINS_EN 29 #define LCD_PINS_D4 25 #if !IS_NEWPANEL @@ -347,7 +347,7 @@ #elif ENABLED(ZONESTAR_LCD) #define LCD_PINS_RS 64 - #define LCD_PINS_ENABLE 44 + #define LCD_PINS_EN 44 #define LCD_PINS_D4 63 #define LCD_PINS_D5 40 #define LCD_PINS_D6 42 @@ -365,7 +365,7 @@ #define DOGLCD_A0 LCD_PINS_DC #else #define LCD_PINS_RS 16 - #define LCD_PINS_ENABLE 17 + #define LCD_PINS_EN 17 #define LCD_PINS_D4 23 #define LCD_PINS_D5 25 #define LCD_PINS_D6 27 From 4f3279fa315b4664349eeae96af62b505e8227ea Mon Sep 17 00:00:00 2001 From: Sophist <3001893+Sophist-UK@users.noreply.github.com> Date: Wed, 19 Mar 2025 03:21:30 +0000 Subject: [PATCH 31/74] =?UTF-8?q?=F0=9F=9A=B8=20Move=20About=20/=20Games?= =?UTF-8?q?=20to=20menu=20bottom=20(#26820)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/lcd/menu/menu_main.cpp | 56 ++++++++++++++----------------- 1 file changed, 25 insertions(+), 31 deletions(-) diff --git a/Marlin/src/lcd/menu/menu_main.cpp b/Marlin/src/lcd/menu/menu_main.cpp index 6142e0e153..60f5c271c6 100644 --- a/Marlin/src/lcd/menu/menu_main.cpp +++ b/Marlin/src/lcd/menu/menu_main.cpp @@ -234,16 +234,6 @@ void menu_configuration(); #endif // CUSTOM_MENU_MAIN -#if ENABLED(ADVANCED_PAUSE_FEATURE) - // This menu item is last with an encoder. Otherwise, somewhere in the middle. - #if E_STEPPERS == 1 && DISABLED(FILAMENT_LOAD_UNLOAD_GCODES) - #define FILAMENT_CHANGE_ITEM() YESNO_ITEM(MSG_FILAMENTCHANGE, menu_change_filament, nullptr, \ - GET_TEXT_F(MSG_FILAMENTCHANGE), (const char *)nullptr, F("?")) - #else - #define FILAMENT_CHANGE_ITEM() SUBMENU(MSG_FILAMENTCHANGE, menu_change_filament) - #endif -#endif - void menu_main() { const bool busy = printingIsActive(); #if HAS_MEDIA @@ -348,7 +338,11 @@ void menu_main() { #endif #if ENABLED(ADVANCED_PAUSE_FEATURE) - FILAMENT_CHANGE_ITEM(); + #if E_STEPPERS == 1 && DISABLED(FILAMENT_LOAD_UNLOAD_GCODES) + YESNO_ITEM(MSG_FILAMENTCHANGE, menu_change_filament, nullptr, GET_TEXT_F(MSG_FILAMENTCHANGE), (const char *)nullptr, F("?")); + #else + SUBMENU(MSG_FILAMENTCHANGE, menu_change_filament); + #endif #endif #if HAS_TEMPERATURE @@ -381,10 +375,6 @@ void menu_main() { } #endif - #if ENABLED(LCD_INFO_MENU) - SUBMENU(MSG_INFO_MENU, menu_info); - #endif - #if ENABLED(LED_CONTROL_MENU) SUBMENU(MSG_LIGHTS, menu_led); #elif ALL(CASE_LIGHT_MENU, CASELIGHT_USES_BRIGHTNESS) @@ -412,7 +402,6 @@ void menu_main() { #endif #if HAS_MEDIA && DISABLED(MEDIA_MENU_AT_TOP) - // BEGIN MEDIA MENU if (card_detected) { if (!card_open) { #if ENABLED(MENU_ADDAUTOSTART) @@ -449,7 +438,6 @@ void menu_main() { #endif #endif } - // END MEDIA MENU #endif #if HAS_SERVICE_INTERVALS @@ -482,7 +470,26 @@ void menu_main() { #endif #endif - #if HAS_GAMES && DISABLED(LCD_INFO_MENU) + #if HAS_MULTI_LANGUAGE + SUBMENU(LANGUAGE, menu_language); + #endif + + #if ENABLED(HOST_SHUTDOWN_MENU_ITEM) && defined(SHUTDOWN_ACTION) + SUBMENU(MSG_HOST_SHUTDOWN, []{ + MenuItem_confirm::select_screen( + GET_TEXT_F(MSG_BUTTON_PROCEED), GET_TEXT_F(MSG_BUTTON_CANCEL), + []{ ui.return_to_status(); hostui.shutdown(); }, nullptr, + GET_TEXT_F(MSG_HOST_SHUTDOWN), (const char *)nullptr, F("?") + ); + }); + #endif + + #if ENABLED(LCD_INFO_MENU) + + SUBMENU(MSG_INFO_MENU, menu_info); + + #elif HAS_GAMES + #if ENABLED(GAMES_EASTER_EGG) SKIP_ITEM(); SKIP_ITEM(); @@ -504,20 +511,7 @@ void menu_main() { #endif ); } - #endif - #if HAS_MULTI_LANGUAGE - SUBMENU(LANGUAGE, menu_language); - #endif - - #if ENABLED(HOST_SHUTDOWN_MENU_ITEM) && defined(SHUTDOWN_ACTION) - SUBMENU(MSG_HOST_SHUTDOWN, []{ - MenuItem_confirm::select_screen( - GET_TEXT_F(MSG_BUTTON_PROCEED), GET_TEXT_F(MSG_BUTTON_CANCEL), - []{ ui.return_to_status(); hostui.shutdown(); }, nullptr, - GET_TEXT_F(MSG_HOST_SHUTDOWN), (const char *)nullptr, F("?") - ); - }); #endif END_MENU(); From fc49efcaef97ab657b28ce1077c7bc07d538bacc Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 19 Mar 2025 14:34:24 -0500 Subject: [PATCH 32/74] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20Lambd?= =?UTF-8?q?a=20for=20MarlinUI=20media=20items?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/lcd/menu/menu_main.cpp | 102 +++++++++++------------------- 1 file changed, 36 insertions(+), 66 deletions(-) diff --git a/Marlin/src/lcd/menu/menu_main.cpp b/Marlin/src/lcd/menu/menu_main.cpp index 60f5c271c6..9509c72cc5 100644 --- a/Marlin/src/lcd/menu/menu_main.cpp +++ b/Marlin/src/lcd/menu/menu_main.cpp @@ -248,34 +248,8 @@ void menu_main() { #define MEDIA_MENU_AT_TOP #endif - if (busy) { - #if MACHINE_CAN_PAUSE - ACTION_ITEM(MSG_PAUSE_PRINT, ui.pause_print); - #endif - #if MACHINE_CAN_STOP - SUBMENU(MSG_STOP_PRINT, []{ - MenuItem_confirm::select_screen( - GET_TEXT_F(MSG_BUTTON_STOP), GET_TEXT_F(MSG_BACK), - ui.abort_print, nullptr, - GET_TEXT_F(MSG_STOP_PRINT), (const char *)nullptr, F("?") - ); - }); - #endif - - #if ENABLED(GCODE_REPEAT_MARKERS) - if (repeat.is_active()) - ACTION_ITEM(MSG_END_LOOPS, repeat.cancel); - #endif - - SUBMENU(MSG_TUNE, menu_tune); - - #if ENABLED(CANCEL_OBJECTS) && DISABLED(SLIM_LCD_MENUS) - SUBMENU(MSG_CANCEL_OBJECT, []{ editable.int8 = -1; ui.goto_screen(menu_cancelobject); }); - #endif - } - else { - #if ALL(HAS_MEDIA, MEDIA_MENU_AT_TOP) - // BEGIN MEDIA MENU + auto media_menus = [&]{ + #if HAS_MEDIA if (card_detected) { if (!card_open) { #if ENABLED(MENU_ADDAUTOSTART) @@ -312,8 +286,38 @@ void menu_main() { #endif #endif } - // END MEDIA MENU #endif + }; + + if (busy) { + #if MACHINE_CAN_PAUSE + ACTION_ITEM(MSG_PAUSE_PRINT, ui.pause_print); + #endif + #if MACHINE_CAN_STOP + SUBMENU(MSG_STOP_PRINT, []{ + MenuItem_confirm::select_screen( + GET_TEXT_F(MSG_BUTTON_STOP), GET_TEXT_F(MSG_BACK), + ui.abort_print, nullptr, + GET_TEXT_F(MSG_STOP_PRINT), (const char *)nullptr, F("?") + ); + }); + #endif + + #if ENABLED(GCODE_REPEAT_MARKERS) + if (repeat.is_active()) + ACTION_ITEM(MSG_END_LOOPS, repeat.cancel); + #endif + + SUBMENU(MSG_TUNE, menu_tune); + + #if ENABLED(CANCEL_OBJECTS) && DISABLED(SLIM_LCD_MENUS) + SUBMENU(MSG_CANCEL_OBJECT, []{ editable.int8 = -1; ui.goto_screen(menu_cancelobject); }); + #endif + } + else { + + // SD Card / Flash Drive + TERN_(MEDIA_MENU_AT_TOP, media_menus()); if (TERN0(MACHINE_CAN_PAUSE, printingIsPaused())) ACTION_ITEM(MSG_RESUME_PRINT, ui.resume_print); @@ -401,43 +405,9 @@ void menu_main() { GCODES_ITEM(MSG_SWITCH_PS_ON, F("M80")); #endif - #if HAS_MEDIA && DISABLED(MEDIA_MENU_AT_TOP) - if (card_detected) { - if (!card_open) { - #if ENABLED(MENU_ADDAUTOSTART) - ACTION_ITEM(MSG_RUN_AUTO_FILES, card.autofile_begin); // Run Auto Files - #endif - - #if HAS_SD_DETECT - GCODES_ITEM(MSG_CHANGE_MEDIA, F("M21" TERN_(HAS_MULTI_VOLUME, "S"))); // M21 Change Media - #if HAS_MULTI_VOLUME - GCODES_ITEM(MSG_ATTACH_USB_MEDIA, F("M21U")); // M21 Attach USB Media - #endif - #else // - or - - ACTION_ITEM(MSG_RELEASE_MEDIA, []{ // M22 Release Media - queue.inject(F("M22")); - #if ENABLED(TFT_COLOR_UI) - // Menu display issue on item removal with multi language selection menu - if (encoderTopLine > 0) encoderTopLine--; - ui.refresh(); - #endif - }); - #endif - SUBMENU(MSG_MEDIA_MENU, MEDIA_MENU_GATEWAY); // Media Menu (or Password First) - } - } - else { - #if HAS_SD_DETECT - ACTION_ITEM(MSG_NO_MEDIA, nullptr); // "No Media" - #else - #if HAS_MULTI_VOLUME - GCODES_ITEM(MSG_ATTACH_SD_MEDIA, F("M21S")); // M21S Attach SD Card - GCODES_ITEM(MSG_ATTACH_USB_MEDIA, F("M21U")); // M21U Attach USB Media - #else - GCODES_ITEM(MSG_ATTACH_MEDIA, F("M21")); // M21 Attach Media - #endif - #endif - } + // SD Card / Flash Drive + #if DISABLED(MEDIA_MENU_AT_TOP) + if (!busy) media_menus(); #endif #if HAS_SERVICE_INTERVALS From a7684ecd6710ede96b8f18f9debe2b69fc7e9f12 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 19 Mar 2025 15:13:45 -0500 Subject: [PATCH 33/74] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20Reuse?= =?UTF-8?q?=20MarlinUI::apply=5Fpreheat?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/lcd/marlinui.cpp | 14 +++++- Marlin/src/lcd/marlinui.h | 3 +- Marlin/src/lcd/menu/menu_temperature.cpp | 54 +++++------------------- Marlin/src/module/temperature.h | 14 ------ 4 files changed, 25 insertions(+), 60 deletions(-) diff --git a/Marlin/src/lcd/marlinui.cpp b/Marlin/src/lcd/marlinui.cpp index bd974d8d0a..679c43b402 100644 --- a/Marlin/src/lcd/marlinui.cpp +++ b/Marlin/src/lcd/marlinui.cpp @@ -153,7 +153,17 @@ constexpr uint8_t epps = ENCODER_PULSES_PER_STEP; TERN_(HAS_HOTEND, if (TEST(pmask, PT_HOTEND)) thermalManager.setTargetHotend(pre.hotend_temp, e)); TERN_(HAS_HEATED_BED, if (TEST(pmask, PT_BED)) thermalManager.setTargetBed(pre.bed_temp)); TERN_(HAS_HEATED_CHAMBER, if (TEST(pmask, PT_CHAMBER)) thermalManager.setTargetChamber(pre.chamber_temp)); - TERN_(HAS_FAN, if (TEST(pmask, PT_FAN)) thermalManager.set_fan_speed(0, pre.fan_speed)); + TERN_(HAS_FAN, if (TEST(pmask, PT_FAN)) thermalManager.set_fan_speed(e, pre.fan_speed)); + #if HAS_FAN + if (TEST(pmask, PT_FAN)) { + const uint8_t fan_index = e < (FAN_COUNT) ? e : 0; + if (true + #if REDUNDANT_PART_COOLING_FAN + && fan_index != REDUNDANT_PART_COOLING_FAN + #endif + ) thermalManager.set_fan_speed(fan_index, pre.fan_speed); + } + #endif } #endif @@ -1935,7 +1945,7 @@ uint8_t expand_u8str_P(char * const outstr, PGM_P const ptpl, const int8_t ind, settings.reset(); completion_feedback(); #if ENABLED(TOUCH_SCREEN_CALIBRATION) - if (touch_calibration.need_calibration()) ui.goto_screen(touch_screen_calibration); + if (touch_calibration.need_calibration()) goto_screen(touch_screen_calibration); #endif } diff --git a/Marlin/src/lcd/marlinui.h b/Marlin/src/lcd/marlinui.h index 26b559e6bc..9f2ac5a69a 100644 --- a/Marlin/src/lcd/marlinui.h +++ b/Marlin/src/lcd/marlinui.h @@ -652,7 +652,8 @@ public: static void preheat_hotend(const uint8_t m, const uint8_t e=active_extruder) { TERN_(HAS_HOTEND, apply_preheat(m, _BV(PT_HOTEND))); } static void preheat_hotend_and_fan(const uint8_t m, const uint8_t e=active_extruder) { preheat_hotend(m, e); preheat_set_fan(m); } static void preheat_bed(const uint8_t m) { TERN_(HAS_HEATED_BED, apply_preheat(m, _BV(PT_BED))); } - static void preheat_all(const uint8_t m) { apply_preheat(m, PT_ALL); } + static void preheat_chamber(const uint8_t m) { TERN_(HAS_HEATED_CHAMBER, apply_preheat(m, _BV(PT_CHAMBER))); } + static void preheat_all(const uint8_t m, const uint8_t e=active_extruder) { apply_preheat(m, PT_ALL, e); } #endif static void reset_status_timeout(const millis_t ms) { diff --git a/Marlin/src/lcd/menu/menu_temperature.cpp b/Marlin/src/lcd/menu/menu_temperature.cpp index 0a376494e5..b43f906cc7 100644 --- a/Marlin/src/lcd/menu/menu_temperature.cpp +++ b/Marlin/src/lcd/menu/menu_temperature.cpp @@ -45,66 +45,34 @@ #if HAS_PREHEAT - /** - * @fn Temperature::lcd_preheat - * @brief Apply the "preheat" parameters for a material preset to the - * hotend (or laser), bed, chamber, or all of the above. - * @param m Material index - * @param targets Bit mask of targets to "preheat" (or turn off) - * @param e Extruder index (if needed) - */ - void Temperature::lcd_preheat(const uint8_t m, const uint8_t targets, const uint8_t e/*=0*/) { - UNUSED(e); - #if HAS_HOTEND - if (targets & PreheatTarget::HOTEND) setTargetHotend(ui.material_preset[m].hotend_temp, e); - #endif - #if HAS_HEATED_BED - if (targets & PreheatTarget::BED) setTargetBed(ui.material_preset[m].bed_temp); - #endif - #if HAS_HEATED_CHAMBER - if (targets & PreheatTarget::CHAMBER) setTargetChamber(ui.material_preset[m].chamber_temp); - #endif - #if HAS_FAN - if (targets & PreheatTarget::HOTEND) { - const uint8_t fan_index = active_extruder < (FAN_COUNT) ? active_extruder : 0; - if (true - #if REDUNDANT_PART_COOLING_FAN - && fan_index != REDUNDANT_PART_COOLING_FAN - #endif - ) set_fan_speed(fan_index, ui.material_preset[m].fan_speed); - } - #endif - ui.return_to_status(); - } - #if HAS_TEMP_HOTEND - inline void _preheat_end(const uint8_t e, const uint8_t m) { thermalManager.lcd_preheat(m, PreheatTarget::HOTEND, e); } - void do_preheat_end_m() { _preheat_end(0, editable.int8); } + inline void _preheat_end(const uint8_t m, const uint8_t e) { ui.preheat_hotend(m, e); ui.return_to_status(); } + void do_preheat_end_m() { _preheat_end(editable.int8, 0); } #endif #if HAS_HEATED_BED - inline void _preheat_bed(const uint8_t m) { thermalManager.lcd_preheat(m, PreheatTarget::BED); } + inline void _preheat_bed(const uint8_t m) { ui.preheat_bed(m); ui.return_to_status(); } #endif #if HAS_HEATED_CHAMBER - inline void _preheat_chamber(const uint8_t m) { thermalManager.lcd_preheat(m, PreheatTarget::CHAMBER); } + inline void _preheat_chamber(const uint8_t m) { ui.preheat_chamber(m); ui.return_to_status(); } #endif #if HAS_COOLER - inline void _precool_laser(const uint8_t e, const uint8_t m) { thermalManager.lcd_preheat(m, PreheatTarget::HOTEND, e); } - void do_precool_laser_m() { _precool_laser(thermalManager.temp_cooler.target, editable.int8); } + inline void _precool_laser(const uint8_t m, const uint8_t e) { ui.preheat_hotend(m, e); ui.return_to_status(); } + void do_precool_laser_m() { _precool_laser(editable.int8, thermalManager.temp_cooler.target); } #endif #if HAS_TEMP_HOTEND && (HAS_HEATED_BED || HAS_HEATED_CHAMBER) - inline void _preheat_all(const uint8_t e, const uint8_t m) { thermalManager.lcd_preheat(m, PreheatTarget::ALL, e); } + inline void _preheat_all(const uint8_t m, const uint8_t e) { ui.preheat_all(m, e); ui.return_to_status(); } // Indexed "Preheat ABC" and "Heat Bed" items #define PREHEAT_ITEMS(M,E) do{ \ - ACTION_ITEM_N_f(E, ui.get_preheat_label(M), MSG_PREHEAT_M_H, []{ _preheat_all(MenuItemBase::itemIndex, M); }); \ - ACTION_ITEM_N_f(E, ui.get_preheat_label(M), MSG_PREHEAT_M_END_E, []{ _preheat_end(MenuItemBase::itemIndex, M); }); \ + ACTION_ITEM_N_f(E, ui.get_preheat_label(M), MSG_PREHEAT_M_H, []{ _preheat_all(M, MenuItemBase::itemIndex); }); \ + ACTION_ITEM_N_f(E, ui.get_preheat_label(M), MSG_PREHEAT_M_END_E, []{ _preheat_end(M, MenuItemBase::itemIndex); }); \ }while(0) #elif HAS_MULTI_HOTEND // No heated bed, so just indexed "Preheat ABC" items - #define PREHEAT_ITEMS(M,E) ACTION_ITEM_N_f(E, ui.get_preheat_label(M), MSG_PREHEAT_M_H, []{ _preheat_end(MenuItemBase::itemIndex, M); }) + #define PREHEAT_ITEMS(M,E) ACTION_ITEM_N_f(E, ui.get_preheat_label(M), MSG_PREHEAT_M_H, []{ _preheat_end(M, MenuItemBase::itemIndex); }) #endif @@ -121,7 +89,7 @@ #if HOTENDS == 1 #if HAS_HEATED_BED || HAS_HEATED_CHAMBER - ACTION_ITEM_f(ui.get_preheat_label(m), MSG_PREHEAT_M, []{ _preheat_all(0, editable.int8); }); + ACTION_ITEM_f(ui.get_preheat_label(m), MSG_PREHEAT_M, []{ _preheat_all(editable.int8, 0); }); ACTION_ITEM_f(ui.get_preheat_label(m), MSG_PREHEAT_M_END, do_preheat_end_m); #else ACTION_ITEM_f(ui.get_preheat_label(m), MSG_PREHEAT_M, do_preheat_end_m); diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index 5f7ea8daf4..934b1b1246 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -599,15 +599,6 @@ typedef struct { raw_adc_t raw_min, raw_max; celsius_t mintemp, maxtemp; } temp_ #define HAS_FAN_LOGIC 1 #endif -#if HAS_MARLINUI_MENU && HAS_TEMPERATURE && HAS_PREHEAT - enum PreheatTarget : uint8_t { - HOTEND = (1 << 0), - BED = (1 << 1), - CHAMBER = (1 << 2), - ALL = 0xFF - }; -#endif - class Temperature { public: @@ -1343,11 +1334,6 @@ class Temperature { static void set_heating_message(const uint8_t, const bool=false) {} #endif - #if HAS_MARLINUI_MENU && HAS_TEMPERATURE && HAS_PREHEAT - // Apply the "preheat" parameters for a material preset to the hotend (or laser), bed, chamber, or all of the above - static void lcd_preheat(const uint8_t m, const uint8_t targets, const uint8_t e=0); - #endif - private: // Reading raw temperatures and converting to Celsius when ready From 26aac7aaab2d2cd4a09f2f17b5b6a852e7cdeb99 Mon Sep 17 00:00:00 2001 From: ellensp <530024+ellensp@users.noreply.github.com> Date: Thu, 20 Mar 2025 09:45:30 +1300 Subject: [PATCH 34/74] =?UTF-8?q?=F0=9F=90=9B=20Fix=20RAMPS=20AUX1=20RX/TX?= =?UTF-8?q?=20pins=20(#27745)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/pins/ramps/pins_RAMPS.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Marlin/src/pins/ramps/pins_RAMPS.h b/Marlin/src/pins/ramps/pins_RAMPS.h index e033cfd060..8237c7e227 100644 --- a/Marlin/src/pins/ramps/pins_RAMPS.h +++ b/Marlin/src/pins/ramps/pins_RAMPS.h @@ -486,15 +486,15 @@ #endif // -// AUX1 5V GND D2 D1 +// AUX1 5V GND D1 D0 // 2 4 6 8 // 1 3 5 7 // 5V GND A3 A4 // #define AUX1_05 57 // (A3) -#define AUX1_06 2 +#define AUX1_06 1 // TX0 #define AUX1_07 58 // (A4) -#define AUX1_08 1 +#define AUX1_08 0 // RX0 // // AUX2 GND A9 D40 D42 A11 From 58749a9a0ed93f10295695d7acbe607a6e871d30 Mon Sep 17 00:00:00 2001 From: ellensp <530024+ellensp@users.noreply.github.com> Date: Thu, 20 Mar 2025 10:02:01 +1300 Subject: [PATCH 35/74] =?UTF-8?q?=F0=9F=A9=B9=20BTT=20Manta=20M8P=20V2.0?= =?UTF-8?q?=20fixes=20(#27748)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The notorious curse of incorrect BTT pins rears its head once again! --- Marlin/src/pins/stm32h7/pins_BTT_MANTA_M8P_V2_0.h | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/Marlin/src/pins/stm32h7/pins_BTT_MANTA_M8P_V2_0.h b/Marlin/src/pins/stm32h7/pins_BTT_MANTA_M8P_V2_0.h index d274c99e19..941d6ab068 100644 --- a/Marlin/src/pins/stm32h7/pins_BTT_MANTA_M8P_V2_0.h +++ b/Marlin/src/pins/stm32h7/pins_BTT_MANTA_M8P_V2_0.h @@ -307,7 +307,6 @@ //#define Y_HARDWARE_SERIAL Serial1 //#define Y2_HARDWARE_SERIAL Serial1 //#define Z_HARDWARE_SERIAL Serial1 - //#define Z2_HARDWARE_SERIAL Serial1 //#define E0_HARDWARE_SERIAL Serial1 //#define E1_HARDWARE_SERIAL Serial1 //#define E2_HARDWARE_SERIAL Serial1 @@ -317,11 +316,11 @@ #define X_SERIAL_TX_PIN PC13 #define Y_SERIAL_TX_PIN PE3 #define Z_SERIAL_TX_PIN PB9 - #define Z2_SERIAL_TX_PIN PB5 - #define E0_SERIAL_TX_PIN PG14 - #define E1_SERIAL_TX_PIN PG10 - #define E2_SERIAL_TX_PIN PD5 - #define E3_SERIAL_TX_PIN PC6 + #define E0_SERIAL_TX_PIN PB5 + #define E1_SERIAL_TX_PIN PG14 + #define E2_SERIAL_TX_PIN PG10 + #define E3_SERIAL_TX_PIN PD5 + #define E4_SERIAL_TX_PIN PC6 // Reduce baud rate to improve software serial reliability #ifndef TMC_BAUD_RATE From c7e64371c989925c74a5c2a13683f71bbbd6bdc7 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 19 Mar 2025 17:35:23 -0500 Subject: [PATCH 36/74] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20ProUI?= =?UTF-8?q?:=20pre-calculate=20menu=20sizes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/lcd/e3v2/proui/dwin.cpp | 176 ++++++++++++++++++++++++----- 1 file changed, 149 insertions(+), 27 deletions(-) diff --git a/Marlin/src/lcd/e3v2/proui/dwin.cpp b/Marlin/src/lcd/e3v2/proui/dwin.cpp index cbf806a7c9..03f25b5010 100644 --- a/Marlin/src/lcd/e3v2/proui/dwin.cpp +++ b/Marlin/src/lcd/e3v2/proui/dwin.cpp @@ -3101,8 +3101,18 @@ frame_rect_t selrect(frame_rect_t) { } void drawPrepareMenu() { + constexpr uint8_t items = (3 + + COUNT_ENABLED(LCD_BED_TRAMMING) + + 2 + + TERN(MESH_BED_LEVELING, 1, ENABLED(HAS_BED_PROBE)) + + TERN(HAS_ZOFFSET_ITEM, ENABLED(HAS_BED_PROBE), ENABLED(BABYSTEPPING)) + + PREHEAT_COUNT + + 1 + + 2 * ALL(PROUI_TUNING_GRAPH, PROUI_ITEM_PLOT) + + 1 + ); checkkey = ID_Menu; - if (SET_MENU_R(prepareMenu, selrect({133, 1, 28, 13}), MSG_PREPARE, 12 + PREHEAT_COUNT)) { + if (SET_MENU_R(prepareMenu, selrect({133, 1, 28, 13}), MSG_PREPARE, items)) { BACK_ITEM(gotoMainMenu); MENU_ITEM(ICON_FilMan, MSG_FILAMENT_MAN, onDrawSubMenu, drawFilamentManMenu); MENU_ITEM(ICON_Axis, MSG_MOVE_AXIS, onDrawMoveSubMenu, drawMoveMenu); @@ -3145,8 +3155,14 @@ void drawPrepareMenu() { #if ENABLED(LCD_BED_TRAMMING) void drawTrammingMenu() { + constexpr uint8_t items = (1 + + 2 * ALL(HAS_BED_PROBE, HAS_MESH) + + (DISABLED(HAS_BED_PROBE) && ENABLED(HAS_ZOFFSET_ITEM)) + + 4 + + ENABLED(BED_TRAMMING_INCLUDE_CENTER) + ); checkkey = ID_Menu; - if (SET_MENU(trammingMenu, MSG_BED_TRAMMING, 8)) { + if (SET_MENU(trammingMenu, MSG_BED_TRAMMING, items)) { BACK_ITEM(drawPrepareMenu); #if HAS_BED_PROBE && HAS_MESH MENU_ITEM(ICON_Tram, MSG_TRAMMING_WIZARD, onDrawMenuItem, trammingwizard); @@ -3168,8 +3184,13 @@ void drawPrepareMenu() { #endif // LCD_BED_TRAMMING void drawControlMenu() { + constexpr uint8_t items = (3 + + COUNT_ENABLED(CASE_LIGHT_MENU, LED_CONTROL_MENU) + + TERN0(EEPROM_SETTINGS, 3) + + 2 + ); checkkey = ID_Menu; - if (SET_MENU_R(controlMenu, selrect({103, 1, 28, 14}), MSG_CONTROL, 11)) { + if (SET_MENU_R(controlMenu, selrect({103, 1, 28, 14}), MSG_CONTROL, items)) { BACK_ITEM(gotoMainMenu); MENU_ITEM(ICON_Temperature, MSG_TEMPERATURE, onDrawTempSubMenu, drawTemperatureMenu); MENU_ITEM(ICON_Motion, MSG_MOTION, onDrawMotionSubMenu, drawMotionMenu); @@ -3198,8 +3219,20 @@ void drawControlMenu() { } void drawAdvancedSettingsMenu() { + constexpr uint8_t items = (1 + + COUNT_ENABLED(EEPROM_SETTINGS, HAS_MESH, HAS_BED_PROBE, HAS_HOME_OFFSET, HAS_TRINAMIC_CONFIG, HAS_ESDIAG, \ + HAS_LOCKSCREEN, EDITABLE_DISPLAY_TIMEOUT, SOUND_MENU_ITEM, POWER_LOSS_RECOVERY, HAS_GCODE_PREVIEW, \ + PROUI_MEDIASORT, BAUD_RATE_GCODE, HAS_CUSTOM_COLORS) + + 1 + + (ENABLED(PIDTEMP) && ANY(PID_AUTOTUNE_MENU, PID_EDIT_MENU)) + + ANY(MPC_EDIT_MENU, MPC_AUTOTUNE_MENU) + + (ENABLED(PIDTEMPBED) && ANY(PID_AUTOTUNE_MENU, PID_EDIT_MENU)) + + TERN0(PRINTCOUNTER, 2) + + 1 + + TERN0(HAS_LCD_BRIGHTNESS, 2) + ); checkkey = ID_Menu; - if (SET_MENU(advancedSettingsMenu, MSG_ADVANCED_SETTINGS, 24)) { + if (SET_MENU(advancedSettingsMenu, MSG_ADVANCED_SETTINGS, items)) { BACK_ITEM(gotoMainMenu); #if ENABLED(EEPROM_SETTINGS) MENU_ITEM(ICON_WriteEEPROM, MSG_STORE_EEPROM, onDrawMenuItem, writeEEPROM); @@ -3268,8 +3301,9 @@ void drawAdvancedSettingsMenu() { } void drawMoveMenu() { + constexpr uint8_t items = 2 + COUNT_ENABLED(HAS_X_AXIS, HAS_Y_AXIS, HAS_Z_AXIS, HAS_HOTEND); checkkey = ID_Menu; - if (SET_MENU_R(moveMenu, selrect({192, 1, 42, 14}), MSG_MOVE_AXIS, 6)) { + if (SET_MENU_R(moveMenu, selrect({192, 1, 42, 14}), MSG_MOVE_AXIS, items)) { BACK_ITEM(drawPrepareMenu); EDIT_ITEM(ICON_Axis, MSG_LIVE_MOVE, onDrawChkbMenu, setLiveMove, &enableLiveMove); #if HAS_X_AXIS @@ -3293,8 +3327,9 @@ void drawMoveMenu() { #if HAS_HOME_OFFSET void drawHomeOffsetMenu() { + constexpr uint8_t items = 1 + COUNT_ENABLED(HAS_X_AXIS, HAS_Y_AXIS, HAS_Z_AXIS); checkkey = ID_Menu; - if (SET_MENU(homeOffsetMenu, MSG_SET_HOME_OFFSETS, 4)) { + if (SET_MENU(homeOffsetMenu, MSG_SET_HOME_OFFSETS, items)) { BACK_ITEM(drawAdvancedSettingsMenu); #if HAS_X_AXIS EDIT_ITEM(ICON_HomeOffsetX, MSG_HOME_OFFSET_X, onDrawPFloatMenu, setHomeOffsetX, &home_offset.x); @@ -3314,8 +3349,12 @@ void drawMoveMenu() { #if HAS_BED_PROBE void drawProbeSetMenu() { + constexpr uint8_t items = (1 + + COUNT_ENABLED(HAS_X_AXIS, HAS_Y_AXIS, HAS_Z_AXIS, Z_MIN_PROBE_REPEATABILITY_TEST) + + TERN0(BLTOUCH, 3 + ENABLED(HAS_BLTOUCH_HS_MODE)) + ); checkkey = ID_Menu; - if (SET_MENU(probeSettingsMenu, MSG_ZPROBE_SETTINGS, 9)) { + if (SET_MENU(probeSettingsMenu, MSG_ZPROBE_SETTINGS, items)) { BACK_ITEM(drawAdvancedSettingsMenu); #if HAS_X_AXIS EDIT_ITEM(ICON_ProbeOffsetX, MSG_ZPROBE_XOFFSET, onDrawPFloatMenu, setProbeOffsetX, &probe.offset.x); @@ -3344,8 +3383,12 @@ void drawMoveMenu() { #endif // HAS_BED_PROBE void drawFilSetMenu() { + constexpr uint8_t items = (1 + + COUNT_ENABLED(HAS_FILAMENT_SENSOR, HAS_FILAMENT_RUNOUT_DISTANCE, PREVENT_COLD_EXTRUSION, FWRETRACT) + + TERN0(CONFIGURE_FILAMENT_CHANGE, 2) + ); checkkey = ID_Menu; - if (SET_MENU(filSetMenu, MSG_FILAMENT_SET, 9)) { + if (SET_MENU(filSetMenu, MSG_FILAMENT_SET, items)) { BACK_ITEM(drawAdvancedSettingsMenu); #if HAS_FILAMENT_SENSOR EDIT_ITEM(ICON_Runout, MSG_RUNOUT_SENSOR, onDrawChkbMenu, setRunoutEnable, &runout.enabled); @@ -3384,8 +3427,12 @@ void drawFilSetMenu() { #if ENABLED(LED_CONTROL_MENU) void drawLedControlMenu() { + constexpr uint8_t items = (1 + + !ALL(CASE_LIGHT_MENU, CASE_LIGHT_USE_NEOPIXEL) + + ENABLED(HAS_COLOR_LEDS) * TERN(LED_COLOR_PRESETS, 8, 3 + ENABLED(HAS_WHITE_LED)), + ); checkkey = ID_Menu; - if (SET_MENU(ledControlMenu, MSG_LED_CONTROL, 10)) { + if (SET_MENU(ledControlMenu, MSG_LED_CONTROL, items)) { BACK_ITEM((currentMenu == tuneMenu) ? drawTuneMenu : drawControlMenu); #if !ALL(CASE_LIGHT_MENU, CASE_LIGHT_USE_NEOPIXEL) EDIT_ITEM(ICON_LedControl, MSG_LIGHTS, onDrawChkbMenu, setLedStatus, &leds.lights_on); @@ -3416,8 +3463,21 @@ void drawFilSetMenu() { #endif // LED_CONTROL_MENU void drawTuneMenu() { + constexpr uint8_t items = (2 + + COUNT_ENABLED(HAS_HOTEND, HAS_HEATED_BED, HAS_FAN) + + ALL(HAS_ZOFFSET_ITEM, BABYSTEPPING) + + 1 + + COUNT_ENABLED(ADVANCED_PAUSE_FEATURE, HAS_FILAMENT_SENSOR, PROUI_ITEM_PLR, FWRETRACT, PROUI_ITEM_JD, PROUI_ITEM_ADVK, HAS_LOCKSCREEN) + + TERN0(HAS_LCD_BRIGHTNESS, 2) + + ENABLED(EDITABLE_DISPLAY_TIMEOUT) + + 2 * ALL(PROUI_TUNING_GRAPH, PROUI_ITEM_PLOT) + + TERN(CASE_LIGHT_MENU, + 1 + COUNT_ENABLED(CASELIGHT_USES_BRIGHTNESS, LED_CONTROL_MENU), + ENABLED(LED_CONTROL_MENU) && DISABLED(CASE_LIGHT_USE_NEOPIXEL) + ) + ); checkkey = ID_Menu; - if (SET_MENU_R(tuneMenu, selrect({73, 2, 28, 12}), MSG_TUNE, 20)) { + 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); #if HAS_HOTEND @@ -3518,8 +3578,9 @@ void drawTuneMenu() { #endif void drawInputShaping_menu() { + constexpr uint8_t items = 1 + 2 * COUNT_ENABLED(INPUT_SHAPING_X, INPUT_SHAPING_Y, INPUT_SHAPING_Z); checkkey = ID_Menu; - if (SET_MENU(inputShapingMenu, MSG_INPUT_SHAPING, 1 PLUS_TERN0(INPUT_SHAPING_X, 2) PLUS_TERN0(INPUT_SHAPING_Y, 2) PLUS_TERN0(INPUT_SHAPING_Z, 2))) { + if (SET_MENU(inputShapingMenu, MSG_INPUT_SHAPING, items)) { BACK_ITEM(drawMotionMenu); #if ENABLED(INPUT_SHAPING_X) MENU_ITEM(ICON_ShapingX, MSG_SHAPING_A_FREQ, onDrawShapingXFreq, setShapingXFreq); @@ -3553,8 +3614,22 @@ void drawTuneMenu() { #endif void drawTrinamicConfigMenu() { + constexpr uint8_t items = (1 + #if AXIS_IS_TMC(X) + + 1 + #endif + #if AXIS_IS_TMC(Y) + + 1 + #endif + #if AXIS_IS_TMC(Z) + + 1 + #endif + #if AXIS_IS_TMC(E0) + + 1 + #endif + ); checkkey = ID_Menu; - if (SET_MENU(trinamicConfigMenu, MSG_TMC_DRIVERS, 5)) { + if (SET_MENU(trinamicConfigMenu, MSG_TMC_DRIVERS, items)) { BACK_ITEM(drawAdvancedSettingsMenu); #if AXIS_IS_TMC(X) EDIT_ITEM(ICON_TMCXSet, MSG_TMC_ACURRENT, onDrawPIntMenu, setXTMCCurrent, &stepperX.val_mA); @@ -3574,8 +3649,12 @@ void drawTuneMenu() { #endif void drawMotionMenu() { + constexpr uint8_t items = (4 + + COUNT_ENABLED(EDITABLE_STEPS_PER_UNIT, EDITABLE_HOMING_FEEDRATE, LIN_ADVANCE, SHAPING_MENU, ADAPTIVE_STEP_SMOOTHING_TOGGLE) + + 2 + ); checkkey = ID_Menu; - if (SET_MENU_R(motionMenu, selrect({1, 16, 28, 13}), MSG_MOTION, 11)) { + if (SET_MENU_R(motionMenu, selrect({1, 16, 28, 13}), MSG_MOTION, items)) { BACK_ITEM(drawControlMenu); MENU_ITEM(ICON_MaxSpeed, MSG_SPEED, onDrawSpeed, drawMaxSpeedMenu); MENU_ITEM(ICON_MaxAccelerated, MSG_ACCELERATION, onDrawAcc, drawMaxAccelMenu); @@ -3620,8 +3699,13 @@ void drawMotionMenu() { #endif void drawFilamentManMenu() { + constexpr uint8_t items = (1 + + ENABLED(NOZZLE_PARK_FEATURE) + + TERN0(ADVANCED_PAUSE_FEATURE, 1 + ENABLED(HAS_PREHEAT)) + + TERN0(FILAMENT_LOAD_UNLOAD_GCODES, 2) + ); checkkey = ID_Menu; - if (SET_MENU(filamentMenu, MSG_FILAMENT_MAN, 6)) { + if (SET_MENU(filamentMenu, MSG_FILAMENT_MAN, items)) { BACK_ITEM(drawPrepareMenu); #if ENABLED(NOZZLE_PARK_FEATURE) MENU_ITEM(ICON_Park, MSG_FILAMENT_PARK_ENABLED, onDrawMenuItem, parkHead); @@ -3681,16 +3765,21 @@ void drawFilamentManMenu() { #define _preheatMenu(N) \ void drawPreheat## N ##Menu() { \ + constexpr uint8_t items = 1 + COUNT_ENABLED(HAS_HOTEND, HAS_HEATED_BED, HAS_FAN, EEPROM_SETTINGS); \ hmiValue.select = (N) - 1; \ - drawPreheatMenu(SET_MENU(preheatMenu, MSG_PREHEAT_## N ##_SETTINGS, 5)); \ + drawPreheatMenu(SET_MENU(preheatMenu, MSG_PREHEAT_## N ##_SETTINGS, items)); \ } REPEAT_1(PREHEAT_COUNT, _preheatMenu) #endif // HAS_PREHEAT void drawTemperatureMenu() { + constexpr uint8_t items = (1 + + COUNT_ENABLED(HAS_HOTEND, HAS_HEATED_BED, HAS_FAN) + + PREHEAT_COUNT + ); checkkey = ID_Menu; - if (SET_MENU_R(temperatureMenu, selrect({236, 2, 28, 12}), MSG_TEMPERATURE, 4 + PREHEAT_COUNT)) { + if (SET_MENU_R(temperatureMenu, selrect({236, 2, 28, 12}), MSG_TEMPERATURE, items)) { BACK_ITEM(drawControlMenu); #if HAS_HOTEND hotendTargetItem = EDIT_ITEM(ICON_HotendTemp, MSG_UBL_SET_TEMP_HOTEND, onDrawHotendTemp, setHotendTemp, &thermalManager.temp_hotend[0].target); @@ -3710,8 +3799,9 @@ void drawTemperatureMenu() { } void drawMaxSpeedMenu() { + constexpr uint8_t items = 1 + COUNT_ENABLED(HAS_X_AXIS, HAS_Y_AXIS, HAS_Z_AXIS, HAS_HOTEND); checkkey = ID_Menu; - if (SET_MENU_R(maxSpeedMenu, selrect({1, 16, 28, 13}), MSG_MAX_SPEED, 5)) { + if (SET_MENU_R(maxSpeedMenu, selrect({1, 16, 28, 13}), MSG_MAX_SPEED, items)) { BACK_ITEM(drawMotionMenu); #if HAS_X_AXIS EDIT_ITEM(ICON_MaxSpeedX, MSG_VMAX_A, onDrawMaxSpeedX, setMaxSpeedX, &planner.settings.max_feedrate_mm_s[X_AXIS]); @@ -3730,8 +3820,9 @@ void drawMaxSpeedMenu() { } void drawMaxAccelMenu() { + constexpr uint8_t items = 1 + COUNT_ENABLED(HAS_X_AXIS, HAS_Y_AXIS, HAS_Z_AXIS, HAS_HOTEND); checkkey = ID_Menu; - if (SET_MENU_R(maxAccelMenu, selrect({1, 16, 28, 13}), MSG_AMAX_EN, 5)) { + if (SET_MENU_R(maxAccelMenu, selrect({1, 16, 28, 13}), MSG_AMAX_EN, items)) { BACK_ITEM(drawMotionMenu); #if HAS_X_AXIS EDIT_ITEM(ICON_MaxAccX, MSG_AMAX_A, onDrawMaxAccelX, setMaxAccelX, &planner.settings.max_acceleration_mm_per_s2[X_AXIS]); @@ -3752,8 +3843,9 @@ void drawMaxAccelMenu() { #if ENABLED(CLASSIC_JERK) void drawMaxJerkMenu() { + constexpr uint8_t items = 1 + COUNT_ENABLED(HAS_X_AXIS, HAS_Y_AXIS, HAS_Z_AXIS, HAS_HOTEND); checkkey = ID_Menu; - if (SET_MENU_R(maxJerkMenu, selrect({1, 16, 28, 13}), MSG_JERK, 5)) { + if (SET_MENU_R(maxJerkMenu, selrect({1, 16, 28, 13}), MSG_JERK, items)) { BACK_ITEM(drawMotionMenu); #if HAS_X_AXIS EDIT_ITEM(ICON_MaxSpeedJerkX, MSG_VA_JERK, onDrawMaxJerkX, setMaxJerkX, &planner.max_jerk.x); @@ -3776,8 +3868,9 @@ void drawMaxAccelMenu() { #if ENABLED(EDITABLE_STEPS_PER_UNIT) void drawStepsMenu() { + constexpr uint8_t items = 1 + COUNT_ENABLED(HAS_X_AXIS, HAS_Y_AXIS, HAS_Z_AXIS, HAS_HOTEND); checkkey = ID_Menu; - if (SET_MENU_R(stepsMenu, selrect({1, 16, 28, 13}), MSG_STEPS_PER_MM, 5)) { + if (SET_MENU_R(stepsMenu, selrect({1, 16, 28, 13}), MSG_STEPS_PER_MM, items)) { BACK_ITEM(drawMotionMenu); #if HAS_X_AXIS EDIT_ITEM(ICON_StepX, MSG_A_STEPS, onDrawStepsX, setStepsX, &planner.settings.axis_steps_per_mm[X_AXIS]); @@ -3800,8 +3893,9 @@ void drawMaxAccelMenu() { #if ENABLED(EDITABLE_HOMING_FEEDRATE) void drawHomingFRMenu() { + constexpr uint8_t items = 1 + COUNT_ENABLED(HAS_X_AXIS, HAS_Y_AXIS, HAS_Z_AXIS); checkkey = ID_Menu; - if (SET_MENU(homingFRMenu, MSG_HOMING_FEEDRATE, 4)) { + if (SET_MENU(homingFRMenu, MSG_HOMING_FEEDRATE, items)) { BACK_ITEM(drawMotionMenu); #if HAS_X_AXIS uint16_t xhome = static_cast(homing_feedrate_mm_m.x); @@ -3921,8 +4015,12 @@ void drawMaxAccelMenu() { #endif void drawHotendMPCMenu() { + constexpr uint8_t items = (1 + + ENABLED(MPC_AUTOTUNE_MENU) + + TERN0(MPC_EDIT_MENU, 4 + ENABLED(MPC_INCLUDE_FAN)) + ); checkkey = ID_Menu; - if (SET_MENU_F(hotendMPCMenu, "MPC Settings", 7)) { + if (SET_MENU_F(hotendMPCMenu, "MPC Settings", items)) { MPC_t &mpc = thermalManager.temp_hotend[0].mpc; BACK_ITEM(drawAdvancedSettingsMenu); #if ENABLED(MPC_AUTOTUNE_MENU) @@ -3991,8 +4089,13 @@ void drawMaxAccelMenu() { #endif void drawHotendPIDMenu() { + constexpr uint8_t items = (1 + + TERN0(PID_AUTOTUNE_MENU, 3) + + TERN0(PID_EDIT_MENU, 3) + + ENABLED(EEPROM_SETTINGS) + ); checkkey = ID_Menu; - if (SET_MENU_F(hotendPIDMenu, STR_HOTEND_PID " Settings", 8)) { + if (SET_MENU_F(hotendPIDMenu, STR_HOTEND_PID " Settings", items)) { BACK_ITEM(drawAdvancedSettingsMenu); #if ENABLED(PID_AUTOTUNE_MENU) MENU_ITEM_F(ICON_PIDNozzle, STR_HOTEND_PID, onDrawMenuItem, hotendPID); @@ -4021,8 +4124,13 @@ void drawMaxAccelMenu() { #endif void drawBedPIDMenu() { + constexpr uint8_t items = (1 + + TERN0(PID_AUTOTUNE_MENU, 3) + + TERN0(PID_EDIT_MENU, 3) + + ENABLED(EEPROM_SETTINGS) + ); checkkey = ID_Menu; - if (SET_MENU_F(bedPIDMenu, STR_BED_PID " Settings", 8)) { + if (SET_MENU_F(bedPIDMenu, STR_BED_PID " Settings", items)) { BACK_ITEM(drawAdvancedSettingsMenu); #if ENABLED(PID_AUTOTUNE_MENU) MENU_ITEM_F(ICON_PIDBed, STR_BED_PID, onDrawMenuItem,bedPID); @@ -4051,8 +4159,13 @@ void drawMaxAccelMenu() { #endif void drawChamberPIDMenu() { + constexpr uint8_t items = (1 + + TERN0(PID_AUTOTUNE_MENU, 3) + + TERN0(PID_EDIT_MENU, 3) + + ENABLED(EEPROM_SETTINGS) + ); checkkey = ID_Menu; - if (SET_MENU_F(chamberPIDMenu, STR_CHAMBER_PID " Settings", 8)) { + if (SET_MENU_F(chamberPIDMenu, STR_CHAMBER_PID " Settings", items)) { BACK_ITEM(drawAdvancedSettingsMenu); #if ENABLED(PID_AUTOTUNE_MENU) MENU_ITEM_F(ICON_PIDChamber, STR_CHAMBER_PID, onDrawMenuItem,chamberPID); @@ -4096,8 +4209,9 @@ void drawMaxAccelMenu() { #if ENABLED(INDIVIDUAL_AXIS_HOMING_SUBMENU) void drawHomingMenu() { + constexpr uint8_t items = 2 + COUNT_ENABLED(HAS_X_AXIS, HAS_Y_AXIS, HAS_Z_AXIS, Z_STEPPER_AUTO_ALIGN, MESH_BED_LEVELING); checkkey = ID_Menu; - if (SET_MENU(homingMenu, MSG_HOMING, 6)) { + if (SET_MENU(homingMenu, MSG_HOMING, items)) { BACK_ITEM(drawPrepareMenu); MENU_ITEM(ICON_Homing, MSG_AUTO_HOME, onDrawMenuItem, autoHome); #if HAS_X_AXIS @@ -4212,8 +4326,16 @@ void drawMaxAccelMenu() { #if HAS_MESH void drawMeshSetMenu() { + constexpr uint8_t items = (1 + + ENABLED(PREHEAT_BEFORE_LEVELING) + + 2 + + ENABLED(HAS_BED_PROBE) + + TERN0(AUTO_BED_LEVELING_UBL, 6) + + TERN0(PROUI_MESH_EDIT, 2) + + 1 + ); checkkey = ID_Menu; - if (SET_MENU(meshMenu, MSG_MESH_LEVELING, 14)) { + if (SET_MENU(meshMenu, MSG_MESH_LEVELING, items)) { BACK_ITEM(drawAdvancedSettingsMenu); #if ENABLED(PREHEAT_BEFORE_LEVELING) EDIT_ITEM(ICON_Temperature, MSG_UBL_SET_TEMP_BED, onDrawPIntMenu, setBedLevT, &hmiData.bedLevT); From 4895388909096c1df822af3ea01d1bc39568642d Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Thu, 20 Mar 2025 00:28:49 +0000 Subject: [PATCH 37/74] [cron] Bump distribution date (2025-03-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 d2f7ac3ffd..1d434d8ba3 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-03-19" +//#define STRING_DISTRIBUTION_DATE "2025-03-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 fbdc9cdd04..6bf03f900f 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-03-19" + #define STRING_DISTRIBUTION_DATE "2025-03-20" #endif /** From d9f2c6444fb04bc78a146a1cd795d66a64d65a84 Mon Sep 17 00:00:00 2001 From: Andrew <18502096+classicrocker883@users.noreply.github.com> Date: Wed, 19 Mar 2025 21:01:47 -0400 Subject: [PATCH 38/74] =?UTF-8?q?=F0=9F=9A=B8=20ProUI=20"View=20Mesh=20(gr?= =?UTF-8?q?id)"=20item=20(#26181)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Scott Lahteine --- Marlin/src/lcd/e3v2/proui/bedlevel_tools.cpp | 1 + Marlin/src/lcd/e3v2/proui/bedlevel_tools.h | 6 ++-- Marlin/src/lcd/e3v2/proui/dwin.cpp | 19 ++++++++++-- Marlin/src/lcd/e3v2/proui/dwin_defines.h | 4 +++ Marlin/src/lcd/e3v2/proui/meshviewer.cpp | 31 ++++++++++++-------- Marlin/src/lcd/language/language_en.h | 1 + 6 files changed, 44 insertions(+), 18 deletions(-) diff --git a/Marlin/src/lcd/e3v2/proui/bedlevel_tools.cpp b/Marlin/src/lcd/e3v2/proui/bedlevel_tools.cpp index e4b6fb72a0..b85caaf6cc 100644 --- a/Marlin/src/lcd/e3v2/proui/bedlevel_tools.cpp +++ b/Marlin/src/lcd/e3v2/proui/bedlevel_tools.cpp @@ -63,6 +63,7 @@ BedLevelTools bedLevelTools; #if ENABLED(USE_GRID_MESHVIEWER) + bool BedLevelTools::grid_meshview = false; bool BedLevelTools::viewer_print_value = false; #endif bool BedLevelTools::goto_mesh_value = false; diff --git a/Marlin/src/lcd/e3v2/proui/bedlevel_tools.h b/Marlin/src/lcd/e3v2/proui/bedlevel_tools.h index a0da0ceeb3..5716316ee4 100644 --- a/Marlin/src/lcd/e3v2/proui/bedlevel_tools.h +++ b/Marlin/src/lcd/e3v2/proui/bedlevel_tools.h @@ -46,8 +46,8 @@ class BedLevelTools { public: - #if ENABLED(USE_GRID_MESHVIEWER) - static bool viewer_asymmetric_range; + #if USE_GRID_MESHVIEWER + static bool grid_meshview; static bool viewer_print_value; #endif static bool goto_mesh_value; @@ -69,7 +69,7 @@ public: static float getMaxValue(); static float getMinValue(); static bool meshValidate(); - #if ENABLED(USE_GRID_MESHVIEWER) + #if USE_GRID_MESHVIEWER static void drawBedMesh(int16_t selected=-1, uint8_t gridline_width=1, uint16_t padding_x=8, uint16_t padding_y_top=(40 + 53 - 7)); static void setMeshViewerStatus(); #endif diff --git a/Marlin/src/lcd/e3v2/proui/dwin.cpp b/Marlin/src/lcd/e3v2/proui/dwin.cpp index 03f25b5010..a775d2ae27 100644 --- a/Marlin/src/lcd/e3v2/proui/dwin.cpp +++ b/Marlin/src/lcd/e3v2/proui/dwin.cpp @@ -2000,7 +2000,7 @@ void dwinRedrawScreen() { #endif // ADVANCED_PAUSE_FEATURE #if HAS_MESH - void dwinMeshViewer() { + void _dwinMeshViewer() { if (!leveling_is_valid()) dwinPopupContinue(ICON_Leveling_1, GET_TEXT_F(MSG_MESH_VIEWER), GET_TEXT_F(MSG_NO_VALID_MESH)); else { @@ -2008,6 +2008,13 @@ void dwinRedrawScreen() { meshViewer.draw(); } } + void dwinMeshViewer() { + TERN_(USE_GRID_MESHVIEWER, bedLevelTools.grid_meshview = false); + _dwinMeshViewer(); + } + #if ENABLED(USE_GRID_MESHVIEWER) + void dwinMeshViewerGrid() { bedLevelTools.grid_meshview = true; _dwinMeshViewer(); } + #endif #endif #if HAS_LOCKSCREEN @@ -3727,13 +3734,17 @@ void drawFilamentManMenu() { #if ENABLED(MESH_BED_LEVELING) void drawManualMeshMenu() { + constexpr uint8_t items = 6 + ENABLED(USE_GRID_MESHVIEWER); checkkey = ID_Menu; - if (SET_MENU(manualMeshMenu, MSG_UBL_MANUAL_MESH, 6)) { + if (SET_MENU(manualMeshMenu, MSG_UBL_MANUAL_MESH, items)) { BACK_ITEM(drawPrepareMenu); MENU_ITEM(ICON_ManualMesh, MSG_LEVEL_BED, onDrawMenuItem, manualMeshStart); mMeshMoveZItem = EDIT_ITEM(ICON_Zoffset, MSG_MOVE_Z, onDrawMMeshMoveZ, setMMeshMoveZ, ¤t_position.z); MENU_ITEM(ICON_Axis, MSG_UBL_CONTINUE_MESH, onDrawMenuItem, manualMeshContinue); MENU_ITEM(ICON_MeshViewer, MSG_MESH_VIEW, onDrawSubMenu, dwinMeshViewer); + #if USE_GRID_MESHVIEWER + MENU_ITEM(ICON_MeshViewer, MSG_MESH_VIEW_GRID, onDrawSubMenu, dwinMeshViewerGrid); + #endif MENU_ITEM(ICON_MeshSave, MSG_UBL_SAVE_MESH, onDrawMenuItem, manualMeshSave); } updateMenu(manualMeshMenu); @@ -4333,6 +4344,7 @@ void drawMaxAccelMenu() { + TERN0(AUTO_BED_LEVELING_UBL, 6) + TERN0(PROUI_MESH_EDIT, 2) + 1 + + ENABLED(USE_GRID_MESHVIEWER) ); checkkey = ID_Menu; if (SET_MENU(meshMenu, MSG_MESH_LEVELING, items)) { @@ -4358,6 +4370,9 @@ void drawMaxAccelMenu() { MENU_ITEM(ICON_MeshEdit, MSG_EDIT_MESH, onDrawSubMenu, drawEditMeshMenu); #endif MENU_ITEM(ICON_MeshViewer, MSG_MESH_VIEW, onDrawSubMenu, dwinMeshViewer); + #if USE_GRID_MESHVIEWER + MENU_ITEM(ICON_MeshViewer, MSG_MESH_VIEW_GRID, onDrawSubMenu, dwinMeshViewerGrid); + #endif } updateMenu(meshMenu); } diff --git a/Marlin/src/lcd/e3v2/proui/dwin_defines.h b/Marlin/src/lcd/e3v2/proui/dwin_defines.h index b72bdf1d23..832702db8f 100644 --- a/Marlin/src/lcd/e3v2/proui/dwin_defines.h +++ b/Marlin/src/lcd/e3v2/proui/dwin_defines.h @@ -35,6 +35,10 @@ //#define DACAI_DISPLAY // Enable for DACAI display //#define TITLE_CENTERED // Center Menu Title Text +#if HAS_MESH + #define USE_GRID_MESHVIEWER 1 +#endif + #if HAS_MESH #define PROUI_MESH_EDIT // Add a menu to edit mesh points #if ENABLED(PROUI_MESH_EDIT) diff --git a/Marlin/src/lcd/e3v2/proui/meshviewer.cpp b/Marlin/src/lcd/e3v2/proui/meshviewer.cpp index 38d0af4f82..e167af5665 100644 --- a/Marlin/src/lcd/e3v2/proui/meshviewer.cpp +++ b/Marlin/src/lcd/e3v2/proui/meshviewer.cpp @@ -39,7 +39,7 @@ #include "../../../feature/bedlevel/bedlevel.h" #include "meshviewer.h" -#if ENABLED(USE_GRID_MESHVIEWER) +#if USE_GRID_MESHVIEWER #include "bedlevel_tools.h" #endif @@ -112,14 +112,20 @@ void MeshViewer::drawMesh(const bed_mesh_t zval, const uint8_t csizex, const uin void MeshViewer::draw(const bool withsave/*=false*/, const bool redraw/*=true*/) { title.showCaption(GET_TEXT_F(MSG_MESH_VIEWER)); - #if ENABLED(USE_GRID_MESHVIEWER) - DWINUI::clearMainArea(); - bedLevelTools.viewer_print_value = true; - bedLevelTools.drawBedMesh(-1, 1, 8, 10 + TITLE_HEIGHT); - #else + + const bool see_mesh = TERN0(USE_GRID_MESHVIEWER, bedLevelTools.grid_meshview); + if (see_mesh) { + #if USE_GRID_MESHVIEWER + DWINUI::clearMainArea(); + bedLevelTools.viewer_print_value = true; + bedLevelTools.drawBedMesh(-1, 1, 8, 10 + TITLE_HEIGHT); + #endif + } + else { if (redraw) drawMesh(bedlevel.z_values, GRID_MAX_POINTS_X, GRID_MAX_POINTS_Y); else DWINUI::drawBox(1, hmiData.colorBackground, { 89, 305, 99, 38 }); - #endif + } + if (withsave) { DWINUI::drawButton(BTN_Save, 26, 305); DWINUI::drawButton(BTN_Continue, 146, 305); @@ -128,12 +134,11 @@ void MeshViewer::draw(const bool withsave/*=false*/, const bool redraw/*=true*/) else DWINUI::drawButton(BTN_Continue, 86, 305); - #if ENABLED(USE_GRID_MESHVIEWER) - bedLevelTools.setMeshViewerStatus(); - #else - char str_1[6], str_2[6] = ""; - ui.status_printf(0, F("Mesh minZ: %s, maxZ: %s"), dtostrf(min, 1, 2, str_1), dtostrf(max, 1, 2, str_2)); - #endif + if (see_mesh) { + TERN_(USE_GRID_MESHVIEWER, bedLevelTools.setMeshViewerStatus()); + } + else // TODO: in marlinui.h set_status_and_level was defined to (..., const int8_t level=0); remove ", 0" when pulling other PR + ui.set_status_and_level(MString<30>(F("Mesh Z min: "), p_float_t(min, 2), F(", max: "), p_float_t(max, 2)), 0); } void drawMeshViewer() { meshViewer.draw(true, meshredraw); } diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index 6076c6fb30..5762fa150e 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -198,6 +198,7 @@ namespace LanguageNarrow_en { LSTR MSG_MESH_VIEWER = _UxGT("Mesh Viewer"); LSTR MSG_EDIT_MESH = _UxGT("Edit Mesh"); LSTR MSG_MESH_VIEW = _UxGT("View Mesh"); + LSTR MSG_MESH_VIEW_GRID = _UxGT("View Mesh (grid)"); LSTR MSG_EDITING_STOPPED = _UxGT("Mesh Editing Stopped"); LSTR MSG_NO_VALID_MESH = _UxGT("No valid mesh"); LSTR MSG_ACTIVATE_MESH = _UxGT("Activate Leveling"); From 5d755676a9deee640593c85d735719cc332a124d Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 19 Mar 2025 20:40:54 -0500 Subject: [PATCH 39/74] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20Silen?= =?UTF-8?q?ce=20findMissingTranslations=20grep=20output?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- buildroot/share/scripts/findMissingTranslations.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/buildroot/share/scripts/findMissingTranslations.sh b/buildroot/share/scripts/findMissingTranslations.sh index 366075d5b9..115c2b67df 100755 --- a/buildroot/share/scripts/findMissingTranslations.sh +++ b/buildroot/share/scripts/findMissingTranslations.sh @@ -71,11 +71,11 @@ for WORD in $(awk '/LSTR/{print $2}' language_en.h); do # Find all selected languages that lack the string LANG_MISSING=" " for LANG in $TEST_LANGS; do - if [[ $(grep -c -E "^ *LSTR +$WORD\b" language_${LANG}.h) -eq 0 ]]; then + if [[ $(grep -c -E "^ *LSTR +$WORD\b" language_${LANG}.h 2>/dev/null) -eq 0 ]]; then INHERIT=$(awk '/using namespace/{print $3}' language_${LANG}.h | sed -E 's/Language_([a-zA-Z_]+)\s*;/\1/') if [[ -z $INHERIT || $INHERIT == "en" ]]; then LANG_MISSING+="$LANG " - elif [[ $(grep -c -E "^ *LSTR +$WORD\b" language_${INHERIT}.h) -eq 0 ]]; then + elif [[ $(grep -c -E "^ *LSTR +$WORD\b" language_${INHERIT}.h 2>/dev/null) -eq 0 ]]; then LANG_MISSING+="$LANG " fi fi From 57fe45a2a6f4f27019d771359896712cc04c44e2 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Fri, 21 Mar 2025 00:29:17 +0000 Subject: [PATCH 40/74] [cron] Bump distribution date (2025-03-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 1d434d8ba3..a1aa9e6164 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-03-20" +//#define STRING_DISTRIBUTION_DATE "2025-03-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 6bf03f900f..ce3bc61e5c 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-03-20" + #define STRING_DISTRIBUTION_DATE "2025-03-21" #endif /** From 9a8b1eab93a67c536821844de4a0b70f31479d0b Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 20 Mar 2025 20:28:30 -0500 Subject: [PATCH 41/74] =?UTF-8?q?=F0=9F=A9=B9=20Cleanup=20(for=20STM32=20I?= =?UTF-8?q?2C=20LCD)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit In advance of #26433 --- .../AVR/{ => u8g}/u8g_com_HAL_AVR_sw_spi.cpp | 6 +- .../u8g_com_stm32duino_swspi.cpp | 0 Marlin/src/inc/Conditionals-2-LCD.h | 2 +- Marlin/src/lcd/dogm/lcdprint_u8g.cpp | 22 +++ Marlin/src/lcd/dogm/marlinui_DOGM.h | 8 +- .../u8g/u8g_dev_ssd1306_sh1106_128x64_I2C.cpp | 163 +++++++++--------- .../u8g_dev_ssd1306_sh1106_128x64_SWSPI.cpp | 2 +- .../lcd/dogm/u8g/u8g_dev_ssd1309_12864.cpp | 2 +- .../dogm/u8g/u8g_dev_st7565_64128n_HAL.cpp | 94 +++++----- .../dogm/u8g/u8g_dev_st7920_128x64_HAL.cpp | 56 +++--- .../dogm/u8g/u8g_dev_uc1701_mini12864_HAL.cpp | 98 +++++------ .../u8g/ultralcd_st7920_u8glib_rrd_AVR.cpp | 4 +- Marlin/src/lcd/dogm/u8g_fontutf8.cpp | 22 +++ Marlin/src/lcd/dogm/u8g_fontutf8.h | 22 +++ .../pins/esp32/pins_GODI_CONTROLLER_V1_0.h | 1 - Marlin/src/pins/ramps/pins_DAGOMA_D6.h | 12 +- Marlin/src/pins/ramps/pins_ZRIB_V53.h | 4 - Marlin/src/pins/sanguino/pins_ZMIB_V2.h | 2 - Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h | 8 +- Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h | 2 +- Marlin/src/pins/stm32f1/pins_MD_D301.h | 22 +-- Marlin/src/pins/stm32f1/pins_ZM3E2_V1_0.h | 2 - Marlin/src/pins/stm32f1/pins_ZM3E4_V1_0.h | 5 - Marlin/src/pins/stm32f1/pins_ZM3E4_V2_0.h | 3 - .../pins/stm32f4/pins_FYSETC_CHEETAH_V30.h | 2 +- Marlin/src/pins/stm32f4/pins_I3DBEEZ9.h | 12 +- .../src/pins/stm32f4/pins_MELLOW_FLY_E3_V2.h | 12 +- .../src/pins/stm32f4/pins_XTLW_CLIMBER_8TH.h | 14 +- .../pins/stm32g0/pins_BTT_MANTA_M4P_V2_1.h | 12 +- .../pins/stm32g0/pins_BTT_MANTA_M5P_V1_0.h | 12 +- Marlin/src/pins/stm32g0/pins_BTT_SKRAT_V1_0.h | 12 +- 31 files changed, 326 insertions(+), 312 deletions(-) rename Marlin/src/HAL/AVR/{ => u8g}/u8g_com_HAL_AVR_sw_spi.cpp (98%) rename Marlin/src/HAL/STM32F1/{dogm => u8g}/u8g_com_stm32duino_swspi.cpp (100%) diff --git a/Marlin/src/HAL/AVR/u8g_com_HAL_AVR_sw_spi.cpp b/Marlin/src/HAL/AVR/u8g/u8g_com_HAL_AVR_sw_spi.cpp similarity index 98% rename from Marlin/src/HAL/AVR/u8g_com_HAL_AVR_sw_spi.cpp rename to Marlin/src/HAL/AVR/u8g/u8g_com_HAL_AVR_sw_spi.cpp index 9617c9544d..f4fa1eb428 100644 --- a/Marlin/src/HAL/AVR/u8g_com_HAL_AVR_sw_spi.cpp +++ b/Marlin/src/HAL/AVR/u8g/u8g_com_HAL_AVR_sw_spi.cpp @@ -55,12 +55,12 @@ #if defined(ARDUINO) && !defined(ARDUINO_ARCH_STM32) && !defined(ARDUINO_ARCH_SAM) -#include "../../inc/MarlinConfigPre.h" +#include "../../../inc/MarlinConfigPre.h" #if HAS_MARLINUI_U8GLIB -#include "../shared/Marduino.h" -#include "../shared/Delay.h" +#include "../../shared/Marduino.h" +#include "../../shared/Delay.h" #include diff --git a/Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_swspi.cpp b/Marlin/src/HAL/STM32F1/u8g/u8g_com_stm32duino_swspi.cpp similarity index 100% rename from Marlin/src/HAL/STM32F1/dogm/u8g_com_stm32duino_swspi.cpp rename to Marlin/src/HAL/STM32F1/u8g/u8g_com_stm32duino_swspi.cpp diff --git a/Marlin/src/inc/Conditionals-2-LCD.h b/Marlin/src/inc/Conditionals-2-LCD.h index 8c818864a0..2462231593 100644 --- a/Marlin/src/inc/Conditionals-2-LCD.h +++ b/Marlin/src/inc/Conditionals-2-LCD.h @@ -201,7 +201,7 @@ #define DOGLCD #define IS_U8GLIB_ST7920 1 #define IS_ULTIPANEL 1 - #define ENCODER_PULSES_PER_STEP 2 + #define STD_ENCODER_PULSES_PER_STEP 2 #elif ENABLED(MKS_12864OLED) diff --git a/Marlin/src/lcd/dogm/lcdprint_u8g.cpp b/Marlin/src/lcd/dogm/lcdprint_u8g.cpp index 30d687ddef..e9132c94b9 100644 --- a/Marlin/src/lcd/dogm/lcdprint_u8g.cpp +++ b/Marlin/src/lcd/dogm/lcdprint_u8g.cpp @@ -1,3 +1,25 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2018 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 . + * + */ + /** * @file lcdprint_u8g.cpp * @brief LCD print api for u8glib diff --git a/Marlin/src/lcd/dogm/marlinui_DOGM.h b/Marlin/src/lcd/dogm/marlinui_DOGM.h index ac65eab7de..c0cc7c4438 100644 --- a/Marlin/src/lcd/dogm/marlinui_DOGM.h +++ b/Marlin/src/lcd/dogm/marlinui_DOGM.h @@ -38,19 +38,19 @@ #if HAS_MEDIA #ifdef __SAMD21__ - #define U8G_CLASS U8GLIB_ST7920_128X64_4X_HAL + #define U8G_CLASS U8GLIB_ST7920_128X64_4X_HAL // 2 stripes, HW SPI (Shared with SD card. Non-standard LCD adapter on AVR.) #else // Hardware SPI on DUE - #define U8G_CLASS U8GLIB_ST7920_128X64_4X + #define U8G_CLASS U8GLIB_ST7920_128X64_4X // 2 stripes, SW SPI (Original u8glib device) #endif #define U8G_PARAM LCD_PINS_RS #elif (LCD_PINS_D4 == SD_SCK_PIN) && (LCD_PINS_EN == SD_MOSI_PIN) // Hardware SPI shared with SD Card - #define U8G_CLASS U8GLIB_ST7920_128X64_4X_HAL + #define U8G_CLASS U8GLIB_ST7920_128X64_4X_HAL // 2 stripes, HW SPI (Shared with SD card. Non-standard LCD adapter on AVR.) #define U8G_PARAM LCD_PINS_RS #else // Software SPI - #define U8G_CLASS U8GLIB_ST7920_128X64_4X + #define U8G_CLASS U8GLIB_ST7920_128X64_4X // 2 stripes, SW SPI (Original u8glib device) #define U8G_PARAM LCD_PINS_D4, LCD_PINS_EN, LCD_PINS_RS #endif diff --git a/Marlin/src/lcd/dogm/u8g/u8g_dev_ssd1306_sh1106_128x64_I2C.cpp b/Marlin/src/lcd/dogm/u8g/u8g_dev_ssd1306_sh1106_128x64_I2C.cpp index 4d4756c298..f44b4f8ac5 100644 --- a/Marlin/src/lcd/dogm/u8g/u8g_dev_ssd1306_sh1106_128x64_I2C.cpp +++ b/Marlin/src/lcd/dogm/u8g/u8g_dev_ssd1306_sh1106_128x64_I2C.cpp @@ -75,58 +75,58 @@ #define HEIGHT 64 #define PAGE_HEIGHT 8 +#define CMD_COL_ADR(N) (0x10 | ((N) >> 4)), ((N) & 0xF) +#define CMD_PAGE_ADR(N) (0x20), (N) +#define CMD_COLUMN_RANGE(N,O) (0x21), (N), (O) +#define CMD_PAGE_RANGE(N,O) (0x22), (N), (O) +#define CMD_SCROLL(N) ((N) ? 0x2F : 0x2E) +#define CMD_START_LINE(N) (0x40 | (N)) +#define CMD_CONTRAST(N) (0x81), (N) +#define CMD_CHARGE_PUMP(N) (0x8D), ((N) ? 0x14 : 0x10) +#define CMD_ADC_REVERSE(N) ((N) ? 0xA1 : 0xA0) +#define CMD_ALL_PIX(N) ((N) ? 0xA5 : 0xA4) +#define CMD_INVERTED(N) ((N) ? 0xA7 : 0xA6) +#define CMD_MUX_RATIO(N) (0xA8), (N) +#define CMD_ON(N) ((N) ? 0xAF : 0xAE) +#define CMD_OUT_MODE(N) ((N) ? 0xC8 : 0xC0) +#define CMD_DISP_OFFS(N) (0xD3), (N) +#define CMD_OSC_FREQ(R,F) (0xD5), ((F) << 4 | (R)) +#define CMD_CHARGE_PER(P,D) (0xD9), ((D) << 4 | (P)) +#define CMD_COM_CONFIG(N) (0xDA), ((N) ? 0x12 : 0x02) +#define CMD_VCOM_DESEL(N) (0xDB), (N) +#define CMD_NOOP() (0xE3) + uint8_t u8g_WriteEscSeqP_2_wire(u8g_t *u8g, u8g_dev_t *dev, const uint8_t *esc_seq); -// SH1106 (132x64) is compatible with SSD1306 (128x64) by adding a small margin to the larger display - -#define SH1106_PAGE_ADR(N) (0x20), (N) -#define SH1106_COL_ADR(N) (0x10 | ((N) >> 4)), ((N) & 0xFF) -#define SH1106_COLUMN_RANGE(N,O) (0x21), (N), (O) -#define SH1106_PAGE_RANGE(N,O) (0x22), (N), (O) -#define SH1106_SCROLL(N) ((N) ? 0x2F : 0x2E) -#define SH1106_START_LINE(N) (0x40 | (N)) -#define SH1106_CONTRAST(N) (0x81), (N) -#define SH1106_CHARGE_PUMP(N) (0x8D), ((N) ? 0x14 : 0x10) -#define SH1106_ADC_REVERSE(N) ((N) ? 0xA1 : 0xA0) -#define SH1106_ALL_PIX(N) ((N) ? 0xA5 : 0xA4) -#define SH1106_INVERTED(N) ((N) ? 0xA7 : 0xA6) -#define SH1106_MUX_RATIO(N) (0xA8), (N) -#define SH1106_ON(N) ((N) ? 0xAF : 0xAE) -#define SH1106_OUT_MODE(N) ((N) ? 0xC8 : 0xC0) -#define SH1106_DISP_OFFS(N) (0xD3), (N) -#define SH1106_OSC_FREQ(R,F) (0xD5), ((F) << 4 | (R)) -#define SH1106_CHARGE_PER(P,D) (0xD9), ((D) << 4 | (P)) -#define SH1106_COM_CONFIG(N) (0xDA), ((N) ? 0x12 : 0x02) -#define SH1106_VCOM_DESEL(N) (0xDB), (N) -#define SH1106_NOOP() (0xE3) +// SH1106 is compatible with SSD1306, but is 132x64. Display 128x64 centered within the 132x64. static const uint8_t u8g_dev_sh1106_128x64_data_start_2_wire[] PROGMEM = { - SH1106_COL_ADR(2), // Column 2 to center 128 pixels in 132 pixels - U8G_ESC_END // End of sequence + CMD_COL_ADR(2), // Column 2 to center 128 pixels in 132 pixels + U8G_ESC_END // End of sequence }; static const uint8_t u8g_dev_sh1106_128x64_init_seq_2_wire[] PROGMEM = { - U8G_ESC_ADR(0), // Initiate command mode - SH1106_ON(0), // Display off, sleep mode - SH1106_MUX_RATIO(0x3F), // Mux ratio - SH1106_DISP_OFFS(0), // Display offset - SH1106_START_LINE(0), // Start line - SH1106_ADC_REVERSE(1), // Segment remap A0/A1 - SH1106_OUT_MODE(1), // 0: scan dir normal, 1: reverse - SH1106_COM_CONFIG(1), // COM pin HW config, sequential com pin config (bit 4), disable left/right remap (bit 5) - SH1106_CONTRAST(0xCF), // Set contrast control - SH1106_PAGE_ADR(0x02), // page addressing mode - SH1106_COLUMN_RANGE(2, 129), // Set column range 2 .. 129 - SH1106_PAGE_RANGE(0, 7), // Set page range 0 .. 7 - SH1106_CHARGE_PER(0x1, 0xF), // Pre-charge period - SH1106_VCOM_DESEL(0x40), // Vcomh deselect level - SH1106_ALL_PIX(0), // Output RAM to display - SH1106_INVERTED(0), // Normal display mode - SH1106_OSC_FREQ(0, 8), // Clock divide ratio (0:1) and oscillator frequency (8) - SH1106_CHARGE_PUMP(1), // Charge pump setting - SH1106_SCROLL(0), // Deactivate scroll - SH1106_ON(1), // Display on - U8G_ESC_END // End of sequence + U8G_ESC_ADR(0), // Initiate command mode + CMD_ON(0), // Display off, sleep mode + CMD_MUX_RATIO(0x3F), // Mux ratio + CMD_DISP_OFFS(0), // Display offset + CMD_START_LINE(0), // Start line + CMD_ADC_REVERSE(1), // Segment remap A0/A1 + CMD_OUT_MODE(1), // 0: scan dir normal, 1: reverse + CMD_COM_CONFIG(1), // COM pin HW config, sequential com pin config (bit 4), disable left/right remap (bit 5) + CMD_CONTRAST(0xCF), // Set contrast control + CMD_PAGE_ADR(0x02), // page addressing mode + CMD_COLUMN_RANGE(2, 129), // Set column range 2 .. 129 + CMD_PAGE_RANGE(0, 7), // Set page range 0 .. 7 + CMD_CHARGE_PER(0x1, 0xF), // Pre-charge period + CMD_VCOM_DESEL(0x40), // Vcomh deselect level + CMD_ALL_PIX(0), // Output RAM to display + CMD_INVERTED(0), // Normal display mode + CMD_OSC_FREQ(0, 8), // Clock divide ratio (0:1) and oscillator frequency (8) + CMD_CHARGE_PUMP(1), // Charge pump setting + CMD_SCROLL(0), // Deactivate scroll + CMD_ON(1), // Display ON + U8G_ESC_END // End of sequence }; uint8_t u8g_dev_sh1106_128x64_2x_2_wire_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) { @@ -142,7 +142,7 @@ uint8_t u8g_dev_sh1106_128x64_2x_2_wire_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t m u8g_WriteEscSeqP_2_wire(u8g, dev, u8g_dev_sh1106_128x64_data_start_2_wire); u8g_WriteByte(u8g, dev, 0xB0 | (pb->p.page*2)); // Select current page u8g_SetAddress(u8g, dev, 1); // Data mode - u8g_WriteSequence(u8g, dev, pb->width, (uint8_t *) pb->buf); + u8g_WriteSequence(u8g, dev, pb->width, (uint8_t *)pb->buf); u8g_SetChipSelect(u8g, dev, 0); u8g_SetAddress(u8g, dev, 0); // Instruction mode u8g_WriteEscSeqP_2_wire(u8g, dev, u8g_dev_sh1106_128x64_data_start_2_wire); @@ -157,39 +157,39 @@ uint8_t u8g_dev_sh1106_128x64_2x_2_wire_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t m return u8g_dev_pb16v1_base_fn(u8g, dev, msg, arg); } -uint8_t u8g_dev_sh1106_128x64_2x_i2c_2_wire_buf[WIDTH*2] U8G_NOCOMMON ; -u8g_pb_t u8g_dev_sh1106_128x64_2x_i2c_2_wire_pb = { {16, HEIGHT, 0, 0, 0}, WIDTH, u8g_dev_sh1106_128x64_2x_i2c_2_wire_buf}; +uint8_t u8g_dev_sh1106_128x64_2x_i2c_2_wire_buf[WIDTH * 2] U8G_NOCOMMON; +u8g_pb_t u8g_dev_sh1106_128x64_2x_i2c_2_wire_pb = { { 16, HEIGHT, 0, 0, 0 }, WIDTH, u8g_dev_sh1106_128x64_2x_i2c_2_wire_buf }; u8g_dev_t u8g_dev_sh1106_128x64_2x_i2c_2_wire = { u8g_dev_sh1106_128x64_2x_2_wire_fn, &u8g_dev_sh1106_128x64_2x_i2c_2_wire_pb, U8G_COM_SSD_I2C_HAL }; ///////////////////////////////////////////////////////////////////////////////////////////// static const uint8_t u8g_dev_ssd1306_128x64_data_start_2_wire[] PROGMEM = { - SH1106_COL_ADR(0), // Column 0 - U8G_ESC_END // End of sequence + CMD_COL_ADR(0), // Column 0 + U8G_ESC_END // End of sequence }; static const uint8_t u8g_dev_ssd1306_128x64_init_seq_2_wire[] PROGMEM = { - U8G_ESC_CS(0), // Disable chip - SH1106_ON(0), // Display off, sleep mode - SH1106_MUX_RATIO(0x3F), // Mux ratio - SH1106_DISP_OFFS(0), // Display offset - SH1106_START_LINE(0), // Start line - SH1106_ADC_REVERSE(1), // Segment remap A0/A1 - SH1106_OUT_MODE(1), // 0: scan dir normal, 1: reverse - SH1106_COM_CONFIG(1), // COM pin HW config, sequential com pin config (bit 4), disable left/right remap (bit 5) - SH1106_CONTRAST(0xCF), // Set contrast control - SH1106_PAGE_ADR(0x02), // page addressing mode - SH1106_COLUMN_RANGE(0, 127), // Set column range 0 .. 127 - SH1106_PAGE_RANGE(0, 7), // Set page range from 0 .. 7 - SH1106_CHARGE_PER(0x1, 0xF), // Pre-charge period - SH1106_VCOM_DESEL(0x40), // Vcomh deselect level - SH1106_ALL_PIX(0), // Send RAM to display - SH1106_INVERTED(0), // Normal display mode - SH1106_OSC_FREQ(0, 8), // Clock divide ratio (0:1) and oscillator frequency (8) - SH1106_CHARGE_PUMP(1), // Charge pump setting - SH1106_SCROLL(0), // Deactivate scroll - SH1106_ON(1), // Display on - U8G_ESC_END // End of sequence + U8G_ESC_CS(0), // Disable chip + CMD_ON(0), // Display OFF, sleep mode + CMD_MUX_RATIO(0x3F), // Mux ratio + CMD_DISP_OFFS(0), // Display offset + CMD_START_LINE(0), // Start line + CMD_ADC_REVERSE(1), // Segment remap A0/A1 + CMD_OUT_MODE(1), // 0: scan dir normal, 1: reverse + CMD_COM_CONFIG(1), // COM pin HW config, sequential COM pin config (bit 4), disable left/right remap (bit 5) + CMD_CONTRAST(0xCF), // Set contrast control + CMD_PAGE_ADR(2), // Page addressing mode + CMD_COLUMN_RANGE(0, 127), // Set column range 0 .. 127 + CMD_PAGE_RANGE(0, 7), // Set page range from 0 .. 7 + CMD_CHARGE_PER(0x1, 0xF), // Pre-charge period + CMD_VCOM_DESEL(0x40), // Vcomh deselect level + CMD_ALL_PIX(0), // Send RAM to display + CMD_INVERTED(0), // Normal display mode + CMD_OSC_FREQ(0, 8), // Clock divide ratio (0:1) and oscillator frequency (8) + CMD_CHARGE_PUMP(1), // Charge pump setting + CMD_SCROLL(0), // Deactivate scroll + CMD_ON(1), // Display ON + U8G_ESC_END // End of sequence }; uint8_t u8g_dev_ssd1306_128x64_2x_2_wire_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) { @@ -205,7 +205,7 @@ uint8_t u8g_dev_ssd1306_128x64_2x_2_wire_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t u8g_WriteEscSeqP_2_wire(u8g, dev, u8g_dev_ssd1306_128x64_data_start_2_wire); u8g_WriteByte(u8g, dev, 0xB0 | (pb->p.page*2)); // Select current page u8g_SetAddress(u8g, dev, 1); // Data mode - u8g_WriteSequence(u8g, dev, pb->width, (uint8_t *) pb->buf); + u8g_WriteSequence(u8g, dev, pb->width, (uint8_t *)pb->buf); u8g_SetChipSelect(u8g, dev, 0); u8g_SetAddress(u8g, dev, 0); // Instruction mode u8g_WriteEscSeqP_2_wire(u8g, dev, u8g_dev_ssd1306_128x64_data_start_2_wire); @@ -220,8 +220,8 @@ uint8_t u8g_dev_ssd1306_128x64_2x_2_wire_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t return u8g_dev_pb16v1_base_fn(u8g, dev, msg, arg); } -uint8_t u8g_dev_ssd1306_128x64_2x_i2c_2_wire_buf[WIDTH*2] U8G_NOCOMMON ; -u8g_pb_t u8g_dev_ssd1306_128x64_2x_i2c_2_wire_pb = { {16, HEIGHT, 0, 0, 0}, WIDTH, u8g_dev_ssd1306_128x64_2x_i2c_2_wire_buf}; +uint8_t u8g_dev_ssd1306_128x64_2x_i2c_2_wire_buf[WIDTH * 2] U8G_NOCOMMON; +u8g_pb_t u8g_dev_ssd1306_128x64_2x_i2c_2_wire_pb = { {16, HEIGHT, 0, 0, 0}, WIDTH, u8g_dev_ssd1306_128x64_2x_i2c_2_wire_buf }; u8g_dev_t u8g_dev_ssd1306_128x64_2x_i2c_2_wire = { u8g_dev_ssd1306_128x64_2x_2_wire_fn, &u8g_dev_ssd1306_128x64_2x_i2c_2_wire_pb, U8G_COM_SSD_I2C_HAL }; ///////////////////////////////////////////////////////////////////////////////////////////// @@ -236,7 +236,7 @@ uint8_t u8g_WriteEscSeqP_2_wire(u8g_t *u8g, u8g_dev_t *dev, const uint8_t *esc_s for (;;) { uint8_t value = u8g_pgm_read(esc_seq); if (is_escape == 0) { - if (value != 255) { + if (value != 0xFF) { if (u8g_WriteByte(u8g, dev, value) == 0) return 0; if (u8g_WriteByte(u8g, dev, I2C_CMD_MODE) == 0) return 0; } @@ -245,17 +245,17 @@ uint8_t u8g_WriteEscSeqP_2_wire(u8g_t *u8g, u8g_dev_t *dev, const uint8_t *esc_s } } else { - if (value == 255) { + if (value == 0xFF) { if (u8g_WriteByte(u8g, dev, value) == 0) return 0; if (u8g_WriteByte(u8g, dev, I2C_CMD_MODE) == 0) return 0; } - else if (value == 254) { + else if (value == 0xFE) { break; } else if (value >= 0xF0) { - // not yet used, do nothing + // Not yet used, do nothing } - else if (value >= 0xE0 ) { + else if (value >= 0xE0) { u8g_SetAddress(u8g, dev, value & 0x0F); } else if (value >= 0xD0) { @@ -270,11 +270,10 @@ uint8_t u8g_WriteEscSeqP_2_wire(u8g_t *u8g, u8g_dev_t *dev, const uint8_t *esc_s u8g_SetResetHigh(u8g, dev); u8g_Delay(value); } - else if (value >= 0xBE) { - // not yet implemented + else if (value >= 0xBE) { // Not yet implemented //u8g_SetVCC(u8g, dev, value & 0x01); } - else if (value <= 127) { + else if (value <= 0x7F) { u8g_Delay(value); } is_escape = 0; diff --git a/Marlin/src/lcd/dogm/u8g/u8g_dev_ssd1306_sh1106_128x64_SWSPI.cpp b/Marlin/src/lcd/dogm/u8g/u8g_dev_ssd1306_sh1106_128x64_SWSPI.cpp index afb3c28a8c..fae4b78aec 100644 --- a/Marlin/src/lcd/dogm/u8g/u8g_dev_ssd1306_sh1106_128x64_SWSPI.cpp +++ b/Marlin/src/lcd/dogm/u8g/u8g_dev_ssd1306_sh1106_128x64_SWSPI.cpp @@ -64,7 +64,7 @@ #define PAGE_HEIGHT 8 #define SH1106_PAGE_ADR(N) (0x20), (N) -#define SH1106_COL_ADR(N) (0x10 | ((N) >> 4)), ((N) & 0xFF) +#define SH1106_COL_ADR(N) (0x10 | ((N) >> 4)), ((N) & 0xF) #define SH1106_COLUMN_RANGE(N,O) (0x21), (N), (O) #define SH1106_PAGE_RANGE(N,O) (0x22), (N), (O) #define SH1106_SCROLL(N) ((N) ? 0x2F : 0x2E) diff --git a/Marlin/src/lcd/dogm/u8g/u8g_dev_ssd1309_12864.cpp b/Marlin/src/lcd/dogm/u8g/u8g_dev_ssd1309_12864.cpp index 010231d056..db9437d034 100644 --- a/Marlin/src/lcd/dogm/u8g/u8g_dev_ssd1309_12864.cpp +++ b/Marlin/src/lcd/dogm/u8g/u8g_dev_ssd1309_12864.cpp @@ -32,7 +32,7 @@ #define PAGE_HEIGHT 8 #define SSD1309_PAGE_ADR(N) (0x20), (N) -#define SSD1309_COL_ADR(N) (0x10 | ((N) >> 4)), ((N) & 0xFF) +#define SSD1309_COL_ADR(N) (0x10 | ((N) >> 4)), ((N) & 0xF) #define SSD1309_COLUMN_RANGE(N,O) (0x21), (N), (O) #define SSD1309_PAGE_RANGE(N,O) (0x22), (N), (O) #define SSD1309_SCROLL(N) ((N) ? 0x2F : 0x2E) diff --git a/Marlin/src/lcd/dogm/u8g/u8g_dev_st7565_64128n_HAL.cpp b/Marlin/src/lcd/dogm/u8g/u8g_dev_st7565_64128n_HAL.cpp index 61a1e214bd..5f69680d01 100644 --- a/Marlin/src/lcd/dogm/u8g/u8g_dev_st7565_64128n_HAL.cpp +++ b/Marlin/src/lcd/dogm/u8g/u8g_dev_st7565_64128n_HAL.cpp @@ -85,72 +85,72 @@ /* init sequence from https://github.com/adafruit/ST7565-LCD/blob/master/ST7565/ST7565.cpp */ static const uint8_t u8g_dev_st7565_64128n_HAL_init_seq[] PROGMEM = { - U8G_ESC_CS(0), // disable chip - U8G_ESC_ADR(0), // instruction mode - U8G_ESC_CS(1), // enable chip - U8G_ESC_RST(15), // do reset low pulse with (15*16)+2 milliseconds (=maximum delay)*/ + U8G_ESC_CS(0), // Disable chip + U8G_ESC_ADR(0), // Instruction mode + U8G_ESC_CS(1), // Enable chip + U8G_ESC_RST(15), // Do reset low pulse with (15*16)+2 milliseconds (=maximum delay)*/ ST7565_BIAS_MODE(0), // 0xA2: LCD bias 1/9 (according to Displaytech 64128N datasheet) ST7565_ADC_REVERSE(0), // Normal ADC Select (according to Displaytech 64128N datasheet) - ST7565_OUT_MODE(1), // common output mode: set scan direction + ST7565_OUT_MODE(1), // Common output mode: set scan direction ST7565_START_LINE(0), // Display start line for Displaytech 64128N - ST7565_POWER_CONTROL(0x4), // power control: turn on voltage converter - U8G_ESC_DLY(50), // delay 50 ms + ST7565_POWER_CONTROL(0x4), // Power control: turn on voltage converter + U8G_ESC_DLY(50), // Delay 50 ms - ST7565_POWER_CONTROL(0x6), // power control: turn on voltage regulator - U8G_ESC_DLY(50), // delay 50 ms + ST7565_POWER_CONTROL(0x6), // Power control: turn on voltage regulator + U8G_ESC_DLY(50), // Delay 50 ms - ST7565_POWER_CONTROL(0x7), // power control: turn on voltage follower - U8G_ESC_DLY(50), // delay 50 ms + ST7565_POWER_CONTROL(0x7), // Power control: turn on voltage follower + U8G_ESC_DLY(50), // Delay 50 ms #ifdef ST7565_VOLTAGE_DIVIDER_VALUE // Set V5 voltage resistor ratio. Affects brightness of Displaytech 64128N ST7565_V5_RATIO(ST7565_VOLTAGE_DIVIDER_VALUE), #endif - ST7565_INVERTED(0), // display normal, bit val 0: LCD pixel off. + ST7565_INVERTED(0), // Display normal, bit val 0: LCD pixel off. ST7565_CONTRAST(0x1E), // Contrast value for Displaytech 64128N - ST7565_ON(1), // display on + ST7565_ON(1), // Display on - U8G_ESC_DLY(100), // delay 100 ms - ST7565_ALL_PIX(1), // display all points, ST7565 - U8G_ESC_DLY(100), // delay 100 ms - U8G_ESC_DLY(100), // delay 100 ms - ST7565_ALL_PIX(0), // normal display - U8G_ESC_CS(0), // disable chip - U8G_ESC_END // end of sequence + U8G_ESC_DLY(100), // Delay 100 ms + ST7565_ALL_PIX(1), // Display all points, ST7565 + U8G_ESC_DLY(100), // Delay 100 ms + U8G_ESC_DLY(100), // Delay 100 ms + ST7565_ALL_PIX(0), // Normal display + U8G_ESC_CS(0), // Disable chip + U8G_ESC_END // End of sequence }; static const uint8_t u8g_dev_st7565_64128n_HAL_data_start[] PROGMEM = { - U8G_ESC_ADR(0), // instruction mode - U8G_ESC_CS(1), // enable chip - ST7565_COLUMN_ADR(ST7565_XOFFSET), // high 4 bits to 0, low 4 bits to 0. Changed for DisplayTech 64128N - U8G_ESC_END // end of sequence + U8G_ESC_ADR(0), // Instruction mode + U8G_ESC_CS(1), // Enable chip + ST7565_COLUMN_ADR(ST7565_XOFFSET), // High 4 bits to 0, low 4 bits to 0. Changed for DisplayTech 64128N + U8G_ESC_END // End of sequence }; static const uint8_t u8g_dev_st7565_64128n_HAL_sleep_on[] PROGMEM = { - U8G_ESC_ADR(0), // instruction mode - U8G_ESC_CS(1), // enable chip - ST7565_SLEEP_MODE(), // static indicator off - //0x00, // indicator register set (not sure if this is required) - ST7565_ON(0), // display off - ST7565_ALL_PIX(1), // all points on - U8G_ESC_CS(0), // disable chip, bugfix 12 nov 2014 - U8G_ESC_END // end of sequence + U8G_ESC_ADR(0), // Instruction mode + U8G_ESC_CS(1), // Enable chip + ST7565_SLEEP_MODE(), // Static indicator off + //0x00, // Indicator register set (not sure if this is required) + ST7565_ON(0), // Display off + ST7565_ALL_PIX(1), // All points on + U8G_ESC_CS(0), // Disable chip, bugfix 12 nov 2014 + U8G_ESC_END // End of sequence }; static const uint8_t u8g_dev_st7565_64128n_HAL_sleep_off[] PROGMEM = { - U8G_ESC_ADR(0), // instruction mode - U8G_ESC_CS(1), // enable chip - ST7565_ALL_PIX(0), // all points off - ST7565_ON(1), // display on - U8G_ESC_DLY(50), // delay 50 ms - U8G_ESC_CS(0), // disable chip, bugfix 12 nov 2014 - U8G_ESC_END // end of sequence + U8G_ESC_ADR(0), // Instruction mode + U8G_ESC_CS(1), // Enable chip + ST7565_ALL_PIX(0), // All points off + ST7565_ON(1), // Display on + U8G_ESC_DLY(50), // Delay 50 ms + U8G_ESC_CS(0), // Disable chip, bugfix 12 nov 2014 + U8G_ESC_END // End of sequence }; uint8_t u8g_dev_st7565_64128n_HAL_fn(u8g_t *u8g, u8g_dev_t *dev, const uint8_t msg, void *arg) { @@ -164,15 +164,15 @@ uint8_t u8g_dev_st7565_64128n_HAL_fn(u8g_t *u8g, u8g_dev_t *dev, const uint8_t m case U8G_DEV_MSG_PAGE_NEXT: { u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem); u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_64128n_HAL_data_start); - u8g_WriteByte(u8g, dev, ST7565_PAGE_ADR(pb->p.page)); /* select current page (ST7565R) */ - u8g_SetAddress(u8g, dev, 1); /* data mode */ + u8g_WriteByte(u8g, dev, ST7565_PAGE_ADR(pb->p.page)); // select current page (ST7565R) + u8g_SetAddress(u8g, dev, 1); // data mode if (!u8g_pb_WriteBuffer(pb, u8g, dev)) return 0; u8g_SetChipSelect(u8g, dev, 0); } break; case U8G_DEV_MSG_CONTRAST: u8g_SetChipSelect(u8g, dev, 1); - u8g_SetAddress(u8g, dev, 0); /* instruction mode */ + u8g_SetAddress(u8g, dev, 0); // instruction mode u8g_WriteByte(u8g, dev, 0x81); u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) >> 2); u8g_SetChipSelect(u8g, dev, 0); @@ -199,21 +199,21 @@ uint8_t u8g_dev_st7565_64128n_HAL_2x_fn(u8g_t *u8g, u8g_dev_t *dev, const uint8_ u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem); u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_64128n_HAL_data_start); - u8g_WriteByte(u8g, dev, ST7565_PAGE_ADR(2 * pb->p.page)); /* select current page (ST7565R) */ - u8g_SetAddress(u8g, dev, 1); /* data mode */ + u8g_WriteByte(u8g, dev, ST7565_PAGE_ADR(2 * pb->p.page)); // select current page (ST7565R) + u8g_SetAddress(u8g, dev, 1); // data mode u8g_WriteSequence(u8g, dev, pb->width, (uint8_t *)pb->buf); u8g_SetChipSelect(u8g, dev, 0); u8g_WriteEscSeqP(u8g, dev, u8g_dev_st7565_64128n_HAL_data_start); - u8g_WriteByte(u8g, dev, ST7565_PAGE_ADR(2 * pb->p.page + 1)); /* select current page (ST7565R) */ - u8g_SetAddress(u8g, dev, 1); /* data mode */ + u8g_WriteByte(u8g, dev, ST7565_PAGE_ADR(2 * pb->p.page + 1)); // select current page (ST7565R) + u8g_SetAddress(u8g, dev, 1); // data mode u8g_WriteSequence(u8g, dev, pb->width, (uint8_t *)(pb->buf)+pb->width); u8g_SetChipSelect(u8g, dev, 0); } break; case U8G_DEV_MSG_CONTRAST: u8g_SetChipSelect(u8g, dev, 1); - u8g_SetAddress(u8g, dev, 0); /* instruction mode */ + u8g_SetAddress(u8g, dev, 0); // instruction mode u8g_WriteByte(u8g, dev, 0x81); u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) >> 2); u8g_SetChipSelect(u8g, dev, 0); diff --git a/Marlin/src/lcd/dogm/u8g/u8g_dev_st7920_128x64_HAL.cpp b/Marlin/src/lcd/dogm/u8g/u8g_dev_st7920_128x64_HAL.cpp index fb9d4b7ad6..6c330db204 100644 --- a/Marlin/src/lcd/dogm/u8g/u8g_dev_st7920_128x64_HAL.cpp +++ b/Marlin/src/lcd/dogm/u8g/u8g_dev_st7920_128x64_HAL.cpp @@ -63,22 +63,22 @@ /* init sequence from https://github.com/adafruit/ST7565-LCD/blob/master/ST7565/ST7565.cpp */ static const uint8_t u8g_dev_st7920_128x64_HAL_init_seq[] PROGMEM = { - U8G_ESC_CS(0), // disable chip - U8G_ESC_ADR(0), // instruction mode - U8G_ESC_RST(15), // do reset low pulse with (15*16)+2 milliseconds (=maximum delay) + U8G_ESC_CS(0), // Disable chip + U8G_ESC_ADR(0), // Instruction mode + U8G_ESC_RST(15), // Do reset low pulse with (15*16)+2 milliseconds (=maximum delay) U8G_ESC_DLY(100), // 8 Dez 2012: additional delay 100 ms because of reset - U8G_ESC_CS(1), // enable chip - U8G_ESC_DLY(50), // delay 50 ms + U8G_ESC_CS(1), // Enable chip + U8G_ESC_DLY(50), // Delay 50 ms 0x038, // 8 Bit interface (DL=1), basic instruction set (RE=0) - 0x00C, // display on, cursor & blink off; 0x08: all off + 0x00C, // Display on, cursor & blink off; 0x08: all off 0x006, // Entry mode: Cursor move to right, DDRAM address counter (AC) plus 1, no shift - 0x002, // disable scroll, enable CGRAM address - 0x001, // clear RAM, needs 1.6 ms - U8G_ESC_DLY(100), // delay 100 ms + 0x002, // Disable scroll, enable CGRAM address + 0x001, // Clear RAM, needs 1.6 ms + U8G_ESC_DLY(100), // Delay 100 ms - U8G_ESC_CS(0), // disable chip - U8G_ESC_END // end of sequence + U8G_ESC_CS(0), // Disable chip + U8G_ESC_END // End of sequence }; void clear_graphics_DRAM(u8g_t *u8g, u8g_dev_t *dev) { @@ -115,24 +115,24 @@ uint8_t u8g_dev_st7920_128x64_HAL_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, vo uint8_t *ptr; u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem); - u8g_SetAddress(u8g, dev, 0); /* cmd mode */ + u8g_SetAddress(u8g, dev, 0); // Cmd mode u8g_SetChipSelect(u8g, dev, 1); y = pb->p.page_y0; ptr = (uint8_t *)pb->buf; for (i = 0; i < 8; i ++) { - u8g_SetAddress(u8g, dev, 0); /* cmd mode */ - u8g_WriteByte(u8g, dev, 0x03E ); /* enable extended mode */ + u8g_SetAddress(u8g, dev, 0); // Cmd mode + u8g_WriteByte(u8g, dev, 0x03E ); // Enable extended mode if (y < 32) { - u8g_WriteByte(u8g, dev, 0x080 | y ); /* y pos */ - u8g_WriteByte(u8g, dev, 0x080 ); /* set x pos to 0*/ + u8g_WriteByte(u8g, dev, 0x080 | y ); // Y pos + u8g_WriteByte(u8g, dev, 0x080 ); // Set x pos to 0 } else { - u8g_WriteByte(u8g, dev, 0x080 | (y-32) ); /* y pos */ - u8g_WriteByte(u8g, dev, 0x080 | 8); /* set x pos to 64*/ + u8g_WriteByte(u8g, dev, 0x080 | (y-32) ); // Y pos + u8g_WriteByte(u8g, dev, 0x080 | 8); // Set x pos to 64 } - u8g_SetAddress(u8g, dev, 1); /* data mode */ + u8g_SetAddress(u8g, dev, 1); // Data mode u8g_WriteSequence(u8g, dev, (LCD_PIXEL_WIDTH) / 8, ptr); ptr += (LCD_PIXEL_WIDTH) / 8; y++; @@ -160,24 +160,24 @@ uint8_t u8g_dev_st7920_128x64_HAL_4x_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, uint8_t *ptr; u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem); - u8g_SetAddress(u8g, dev, 0); /* cmd mode */ + u8g_SetAddress(u8g, dev, 0); // Cmd mode u8g_SetChipSelect(u8g, dev, 1); y = pb->p.page_y0; ptr = (uint8_t *)pb->buf; for (i = 0; i < 32; i ++) { - u8g_SetAddress(u8g, dev, 0); /* cmd mode */ - u8g_WriteByte(u8g, dev, 0x03E ); /* enable extended mode */ + u8g_SetAddress(u8g, dev, 0); // Cmd mode + u8g_WriteByte(u8g, dev, 0x03E ); // Enable extended mode if (y < 32) { - u8g_WriteByte(u8g, dev, 0x080 | y ); /* y pos */ - u8g_WriteByte(u8g, dev, 0x080 ); /* set x pos to 0*/ + u8g_WriteByte(u8g, dev, 0x080 | y ); // Y pos + u8g_WriteByte(u8g, dev, 0x080 ); // Set x pos to 0 } else { - u8g_WriteByte(u8g, dev, 0x080 | (y-32) ); /* y pos */ - u8g_WriteByte(u8g, dev, 0x080 | 8); /* set x pos to 64*/ + u8g_WriteByte(u8g, dev, 0x080 | (y-32) ); // Y pos + u8g_WriteByte(u8g, dev, 0x080 | 8); // Set x pos to 64 } - u8g_SetAddress(u8g, dev, 1); /* data mode */ + u8g_SetAddress(u8g, dev, 1); // Data mode u8g_WriteSequence(u8g, dev, (LCD_PIXEL_WIDTH) / 8, ptr); ptr += (LCD_PIXEL_WIDTH) / 8; y++; @@ -200,7 +200,7 @@ U8G_PB_DEV(u8g_dev_st7920_128x64_HAL_hw_spi, LCD_PIXEL_WIDTH, LCD_PIXEL_HEIGHT, u8g_dev_t u8g_dev_st7920_128x64_HAL_4x_hw_spi = { u8g_dev_st7920_128x64_HAL_4x_fn, &u8g_dev_st7920_128x64_HAL_4x_pb, U8G_COM_ST7920_HAL_HW_SPI }; #if NONE(__AVR__, ARDUINO_ARCH_STM32, ARDUINO_ARCH_ESP32) || defined(U8G_HAL_LINKS) - // Also use this device for HAL version of rrd class. This results in the same device being used + // Also use this device for HAL version of RRD class. This results in the same device being used // for the ST7920 for HAL systems no matter what is selected in marlinui_DOGM.h. u8g_dev_t u8g_dev_st7920_128x64_rrd_sw_spi = { u8g_dev_st7920_128x64_HAL_4x_fn, &u8g_dev_st7920_128x64_HAL_4x_pb, U8G_COM_ST7920_HAL_SW_SPI }; #endif diff --git a/Marlin/src/lcd/dogm/u8g/u8g_dev_uc1701_mini12864_HAL.cpp b/Marlin/src/lcd/dogm/u8g/u8g_dev_uc1701_mini12864_HAL.cpp index f9c68c15fc..1d1291ff9a 100644 --- a/Marlin/src/lcd/dogm/u8g/u8g_dev_uc1701_mini12864_HAL.cpp +++ b/Marlin/src/lcd/dogm/u8g/u8g_dev_uc1701_mini12864_HAL.cpp @@ -83,59 +83,59 @@ #define UC1701_BOOST_RATIO(N) (0xF8), (N) static const uint8_t u8g_dev_uc1701_mini12864_HAL_init_seq[] PROGMEM = { - U8G_ESC_CS(0), // disable chip - U8G_ESC_ADR(0), // instruction mode - U8G_ESC_RST(1), // do reset low pulse with (1*16)+2 milliseconds - U8G_ESC_CS(1), // enable chip + U8G_ESC_CS(0), // Disable chip + U8G_ESC_ADR(0), // Instruction mode + U8G_ESC_RST(1), // Do reset low pulse with (1*16)+2 milliseconds + U8G_ESC_CS(1), // Enable chip - UC1701_RESET(), // soft reset - UC1701_START_LINE(0), // set display start line to 0 + UC1701_RESET(), // Soft reset + UC1701_START_LINE(0), // Set display start line to 0 UC1701_ADC_REVERSE(0), // ADC set to reverse - UC1701_OUT_MODE(1), // common output mode - UC1701_INVERTED(0), // display normal, bit val 0: LCD pixel off + UC1701_OUT_MODE(1), // Common output mode + UC1701_INVERTED(0), // Display normal, bit val 0: LCD pixel off UC1701_BIAS_MODE(0), // LCD bias 1/9 - UC1701_POWER_CONTROL(0x7), // all power control circuits on - UC1701_BOOST_RATIO(0x0), // set booster ratio to 4x - UC1701_V5_RATIO(3), // set V0 voltage resistor ratio to large - UC1701_CONTRAST(0x27), // set contrast - UC1701_INDICATOR(0), // indicator disable - UC1701_ON(1), // display on + UC1701_POWER_CONTROL(0x7), // All power control circuits on + UC1701_BOOST_RATIO(0x0), // Set booster ratio to 4x + UC1701_V5_RATIO(3), // Set V0 voltage resistor ratio to large + UC1701_CONTRAST(0x27), // Set contrast + UC1701_INDICATOR(0), // Indicator disable + UC1701_ON(1), // Display on - U8G_ESC_CS(0), // disable chip - U8G_ESC_DLY(100), // delay 100 ms - U8G_ESC_CS(1), // enable chip + U8G_ESC_CS(0), // Disable chip + U8G_ESC_DLY(100), // Delay 100 ms + U8G_ESC_CS(1), // Enable chip - UC1701_ALL_PIX(1), // display all points, ST7565 - U8G_ESC_CS(0), // disable chip - U8G_ESC_DLY(100), // delay 100 ms - U8G_ESC_DLY(100), // delay 100 ms - U8G_ESC_CS(1), // enable chip - UC1701_ALL_PIX(0), // normal display - U8G_ESC_CS(0), // disable chip - U8G_ESC_DLY(150), // delay 150 ms before sending any data - U8G_ESC_END // end of sequence + UC1701_ALL_PIX(1), // Display all points, ST7565 + U8G_ESC_CS(0), // Disable chip + U8G_ESC_DLY(100), // Delay 100 ms + U8G_ESC_DLY(100), // Delay 100 ms + U8G_ESC_CS(1), // Enable chip + UC1701_ALL_PIX(0), // Normal display + U8G_ESC_CS(0), // Disable chip + U8G_ESC_DLY(150), // Delay 150 ms before sending any data + U8G_ESC_END // End of sequence }; static const uint8_t u8g_dev_uc1701_mini12864_HAL_data_start[] PROGMEM = { - U8G_ESC_ADR(0), // instruction mode - U8G_ESC_CS(1), // enable chip + U8G_ESC_ADR(0), // Instruction mode + U8G_ESC_CS(1), // Enable chip #if ANY(MKS_MINI_12864, ENDER2_STOCKDISPLAY, FYSETC_MINI_12864) - UC1701_START_LINE(0), // set display start line to 0 + UC1701_START_LINE(0), // Set display start line to 0 UC1701_ADC_REVERSE(0), // ADC set to reverse - UC1701_OUT_MODE(1), // common output mode - UC1701_INVERTED(0), // display normal, bit val 0: LCD pixel off + UC1701_OUT_MODE(1), // Common output mode + UC1701_INVERTED(0), // Display normal, bit val 0: LCD pixel off UC1701_BIAS_MODE(0), // LCD bias 1/9 - UC1701_POWER_CONTROL(0x7),// all power control circuits on - UC1701_BOOST_RATIO(0x0), // set booster ratio to 4x - UC1701_V5_RATIO(3), // set V0 voltage resistor ratio to large - UC1701_INDICATOR(0), // indicator disable - UC1701_ON(1), // display on - UC1701_COLUMN_HI(0), // set upper 4 bits of the col adr to 0 - U8G_ESC_END, // end of sequence - U8G_ESC_DLY(5) // delay 5 ms + UC1701_POWER_CONTROL(0x7),// All power control circuits on + UC1701_BOOST_RATIO(0x0), // Set booster ratio to 4x + UC1701_V5_RATIO(3), // Set V0 voltage resistor ratio to large + UC1701_INDICATOR(0), // Indicator disable + UC1701_ON(1), // Display on + UC1701_COLUMN_HI(0), // Set upper 4 bits of the col adr to 0 + U8G_ESC_END, // End of sequence + U8G_ESC_DLY(5) // Delay 5 ms #else - UC1701_COLUMN_ADR(0), // address 0 - U8G_ESC_END // end of sequence + UC1701_COLUMN_ADR(0), // Address 0 + U8G_ESC_END // End of sequence #endif }; @@ -151,15 +151,15 @@ uint8_t u8g_dev_uc1701_mini12864_HAL_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, case U8G_DEV_MSG_PAGE_NEXT: { u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem); u8g_WriteEscSeqP(u8g, dev, u8g_dev_uc1701_mini12864_HAL_data_start); - u8g_WriteByte(u8g, dev, 0x0B0 | pb->p.page); /* select current page */ - u8g_SetAddress(u8g, dev, 1); /* data mode */ + u8g_WriteByte(u8g, dev, 0x0B0 | pb->p.page); // Select current page + u8g_SetAddress(u8g, dev, 1); // Data mode if (!u8g_pb_WriteBuffer(pb, u8g, dev)) return 0; u8g_SetChipSelect(u8g, dev, 0); } break; case U8G_DEV_MSG_CONTRAST: u8g_SetChipSelect(u8g, dev, 1); - u8g_SetAddress(u8g, dev, 0); /* instruction mode */ + u8g_SetAddress(u8g, dev, 0); // Instruction mode u8g_WriteByte(u8g, dev, 0x081); u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) >> 2); u8g_SetChipSelect(u8g, dev, 0); @@ -180,20 +180,20 @@ uint8_t u8g_dev_uc1701_mini12864_HAL_2x_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t m case U8G_DEV_MSG_PAGE_NEXT: { u8g_pb_t *pb = (u8g_pb_t *)(dev->dev_mem); u8g_WriteEscSeqP(u8g, dev, u8g_dev_uc1701_mini12864_HAL_data_start); - u8g_WriteByte(u8g, dev, 0x0B0 | (2 * pb->p.page)); /* select current page */ - u8g_SetAddress(u8g, dev, 1); /* data mode */ + u8g_WriteByte(u8g, dev, 0x0B0 | (2 * pb->p.page)); // Select current page + u8g_SetAddress(u8g, dev, 1); // Data mode u8g_WriteSequence(u8g, dev, pb->width, (uint8_t *)pb->buf); u8g_SetChipSelect(u8g, dev, 0); u8g_WriteEscSeqP(u8g, dev, u8g_dev_uc1701_mini12864_HAL_data_start); - u8g_WriteByte(u8g, dev, 0x0B0 | (2 * pb->p.page + 1)); /* select current page */ - u8g_SetAddress(u8g, dev, 1); /* data mode */ + u8g_WriteByte(u8g, dev, 0x0B0 | (2 * pb->p.page + 1)); // Select current page + u8g_SetAddress(u8g, dev, 1); // Data mode u8g_WriteSequence(u8g, dev, pb->width, (uint8_t *)(pb->buf)+pb->width); u8g_SetChipSelect(u8g, dev, 0); } break; case U8G_DEV_MSG_CONTRAST: u8g_SetChipSelect(u8g, dev, 1); - u8g_SetAddress(u8g, dev, 0); /* instruction mode */ + u8g_SetAddress(u8g, dev, 0); // Instruction mode u8g_WriteByte(u8g, dev, 0x081); u8g_WriteByte(u8g, dev, (*(uint8_t *)arg) >> 2); u8g_SetChipSelect(u8g, dev, 0); diff --git a/Marlin/src/lcd/dogm/u8g/ultralcd_st7920_u8glib_rrd_AVR.cpp b/Marlin/src/lcd/dogm/u8g/ultralcd_st7920_u8glib_rrd_AVR.cpp index cd7445e019..6f8990bf20 100644 --- a/Marlin/src/lcd/dogm/u8g/ultralcd_st7920_u8glib_rrd_AVR.cpp +++ b/Marlin/src/lcd/dogm/u8g/ultralcd_st7920_u8glib_rrd_AVR.cpp @@ -20,8 +20,8 @@ * */ -// NOTE - the HAL version of the rrd device uses a generic ST7920 device. -// See u8g_dev_st7920_128x64_HAL.cpp for the HAL version. +// NOTE - The HAL version of the RRD device uses a generic ST7920 device. +// See u8g_dev_st7920_128x64_HAL.cpp #include "../../../inc/MarlinConfigPre.h" diff --git a/Marlin/src/lcd/dogm/u8g_fontutf8.cpp b/Marlin/src/lcd/dogm/u8g_fontutf8.cpp index 5d9ef627c9..1ee71f7c59 100644 --- a/Marlin/src/lcd/dogm/u8g_fontutf8.cpp +++ b/Marlin/src/lcd/dogm/u8g_fontutf8.cpp @@ -1,3 +1,25 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2018 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 . + * + */ + /** * @file u8g_fontutf8.cpp * @brief font api for u8g lib diff --git a/Marlin/src/lcd/dogm/u8g_fontutf8.h b/Marlin/src/lcd/dogm/u8g_fontutf8.h index 281894509d..00df000d9c 100644 --- a/Marlin/src/lcd/dogm/u8g_fontutf8.h +++ b/Marlin/src/lcd/dogm/u8g_fontutf8.h @@ -1,3 +1,25 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2018 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 . + * + */ + /** * @file fontutf8.h * @brief font api for u8g lib diff --git a/Marlin/src/pins/esp32/pins_GODI_CONTROLLER_V1_0.h b/Marlin/src/pins/esp32/pins_GODI_CONTROLLER_V1_0.h index 7cbaa96088..cffb7f3cb4 100644 --- a/Marlin/src/pins/esp32/pins_GODI_CONTROLLER_V1_0.h +++ b/Marlin/src/pins/esp32/pins_GODI_CONTROLLER_V1_0.h @@ -130,7 +130,6 @@ // #if ANY(EDUTRONICS_12864OLED_SH1106, EDUTRONICS_12864OLED_SSD1306) - #define LCDSCREEN_NAME "EDUTRONICS 12864 OLED" #define BTN_EN2 1 #define BTN_EN1 3 #define BTN_ENC 0 diff --git a/Marlin/src/pins/ramps/pins_DAGOMA_D6.h b/Marlin/src/pins/ramps/pins_DAGOMA_D6.h index f44657d2b5..99b04070d8 100644 --- a/Marlin/src/pins/ramps/pins_DAGOMA_D6.h +++ b/Marlin/src/pins/ramps/pins_DAGOMA_D6.h @@ -55,15 +55,9 @@ // Alter timing for graphical display #if IS_U8GLIB_ST7920 - #ifndef BOARD_ST7920_DELAY_1 - #define BOARD_ST7920_DELAY_1 0 - #endif - #ifndef BOARD_ST7920_DELAY_2 - #define BOARD_ST7920_DELAY_2 250 - #endif - #ifndef BOARD_ST7920_DELAY_3 - #define BOARD_ST7920_DELAY_3 250 - #endif + #define BOARD_ST7920_DELAY_1 0 + #define BOARD_ST7920_DELAY_2 250 + #define BOARD_ST7920_DELAY_3 250 #endif #define KILL_PIN -1 // NC diff --git a/Marlin/src/pins/ramps/pins_ZRIB_V53.h b/Marlin/src/pins/ramps/pins_ZRIB_V53.h index 22b806a2b6..2b99921909 100644 --- a/Marlin/src/pins/ramps/pins_ZRIB_V53.h +++ b/Marlin/src/pins/ramps/pins_ZRIB_V53.h @@ -334,7 +334,6 @@ // #if ENABLED(ZONESTAR_12864LCD) - #define LCDSCREEN_NAME "ZONESTAR LCD12864" #define LCD_SDSS_PIN 16 #define LCD_PINS_RS 16 // ST7920 CS (LCD-4) #define LCD_PINS_EN 23 // ST7920 DAT LCD-R/W (LCD-5) @@ -345,7 +344,6 @@ #define BEEPER_PIN 37 #define KILL_PIN 35 #elif ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) - #define LCDSCREEN_NAME "Reprap LCD12864" // Use EXP1 & EXP2 connector #define LCD_PINS_RS 16 // ST7920 CS #define LCD_PINS_EN 17 // ST7920 DAT @@ -362,7 +360,6 @@ //================================================================================ #if ANY(ZONESTAR_12864OLED, ZONESTAR_12864OLED_SSD1306) - #define LCDSCREEN_NAME "ZONESTAR 12864OLED" #define LCD_SDSS_PIN 16 #define LCD_PINS_RS 23 // RESET Pull low for 1s to init #define LCD_PINS_DC 17 @@ -386,7 +383,6 @@ //================================================================================ #if ENABLED(ZONESTAR_LCD) - #define LCDSCREEN_NAME "LCD2004 ADCKEY" #define LCD_PINS_RS EXP1_04_PIN #define LCD_PINS_EN EXP1_03_PIN #define LCD_PINS_D4 EXP1_05_PIN diff --git a/Marlin/src/pins/sanguino/pins_ZMIB_V2.h b/Marlin/src/pins/sanguino/pins_ZMIB_V2.h index b583c17b31..0446f99dd3 100644 --- a/Marlin/src/pins/sanguino/pins_ZMIB_V2.h +++ b/Marlin/src/pins/sanguino/pins_ZMIB_V2.h @@ -189,7 +189,6 @@ // // LCD 128x64 // - #define LCDSCREEN_NAME "ZONESTAR_12864LCD" #define FORCE_SOFT_SPI //#define LCD_SDSS_PIN EXP1_03_PIN #define LCD_PINS_RS EXP1_03_PIN // ST7920 CS (LCD-4) @@ -204,7 +203,6 @@ // // OLED 128x64 // - #define LCDSCREEN_NAME "ZONESTAR 12864OLED" #define FORCE_SOFT_SPI #define LCD_PINS_RS EXP1_06_PIN #define LCD_PINS_DC EXP1_04_PIN diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h index 54a8ae104b..06c7cacc5b 100644 --- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h @@ -300,8 +300,14 @@ #define LCD_BACKLIGHT_PIN -1 #define FORCE_SOFT_SPI + #elif ENABLED(ULTI_CONTROLLER) + + #define LCD_PINS_D6 EXP1_03_PIN + #define DOGLCD_SCL_PIN EXP1_07_PIN // I2C1 + #define DOGLCD_SDA_PIN EXP1_08_PIN // I2C1 + #else - #error "Only CR10_STOCKDISPLAY, ZONESTAR_LCD, ENDER2_STOCKDISPLAY, MKS_MINI_12864, FYSETC_MINI_12864_2_1 and MKS_LCD12864A/B are currently supported on the SKR E3 DIP." + #error "Only CR10_STOCKDISPLAY, ZONESTAR_LCD, ENDER2_STOCKDISPLAY, ULTI_CONTROLLER, MKS_MINI_12864, FYSETC_MINI_12864_2_1 and MKS_LCD12864A/B are currently supported on the SKR E3 DIP." #endif #endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h b/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h index 0364517e24..a2b0f2a99d 100644 --- a/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h +++ b/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h @@ -166,7 +166,7 @@ #define DOGLCD_SCK EXP1_06_PIN #define DOGLCD_MOSI EXP1_08_PIN - #if ANY(FYSETC_MINI_12864, U8GLIB_ST7920) + #if ANY(FYSETC_MINI_12864, IS_U8GLIB_ST7920) #define FORCE_SOFT_SPI #endif //#define LCD_SCREEN_ROTATE 180 // 0, 90, 180, 270 diff --git a/Marlin/src/pins/stm32f1/pins_MD_D301.h b/Marlin/src/pins/stm32f1/pins_MD_D301.h index 3cd7dffed3..629d22c83f 100644 --- a/Marlin/src/pins/stm32f1/pins_MD_D301.h +++ b/Marlin/src/pins/stm32f1/pins_MD_D301.h @@ -49,11 +49,6 @@ // #define SERVO0_PIN PB0 -// -// Z Probe must be this pin -// -#define Z_MIN_PROBE_PIN PB1 - // // Limit Switches // @@ -61,13 +56,20 @@ #define X_MAX_PIN PF11 #define Y_MIN_PIN PF14 #define Y_MAX_PIN PF13 -#ifdef Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN - #define Z_MIN_PIN PB1 -#else - #define Z_MIN_PIN PG0 -#endif +#define Z_MIN_PIN PG0 #define Z_MAX_PIN PF15 +// +// Z Probe must be this pin +// +#ifndef Z_MIN_PROBE_PIN + #define Z_MIN_PROBE_PIN PB1 +#endif + +#if ENABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) + #error "It's physically impossible to connect the Z Probe to the Z Min Endstop pin on this board." +#endif + // // Filament Sensor // diff --git a/Marlin/src/pins/stm32f1/pins_ZM3E2_V1_0.h b/Marlin/src/pins/stm32f1/pins_ZM3E2_V1_0.h index ecea985494..86cbf5c677 100644 --- a/Marlin/src/pins/stm32f1/pins_ZM3E2_V1_0.h +++ b/Marlin/src/pins/stm32f1/pins_ZM3E2_V1_0.h @@ -192,7 +192,6 @@ // 2 +5V // 1 GND - #define LCDSCREEN_NAME "ZONESTAR LCD12864" #define LCD_PINS_RS EXP1_03_PIN #define LCD_PINS_EN EXP1_06_PIN #define LCD_PINS_D4 EXP1_04_PIN @@ -220,7 +219,6 @@ // 3 RX3 PB11 KNOB_ENB #define FORCE_SOFT_SPI - #define LCDSCREEN_NAME "ZONESTAR 12864OLED" #define LCD_PINS_RS EXP1_06_PIN // = LCD_RESET_PIN #define LCD_PINS_DC EXP1_04_PIN // DC #define DOGLCD_CS EXP1_03_PIN // CS diff --git a/Marlin/src/pins/stm32f1/pins_ZM3E4_V1_0.h b/Marlin/src/pins/stm32f1/pins_ZM3E4_V1_0.h index 069086a43b..009d1f897c 100644 --- a/Marlin/src/pins/stm32f1/pins_ZM3E4_V1_0.h +++ b/Marlin/src/pins/stm32f1/pins_ZM3E4_V1_0.h @@ -280,7 +280,6 @@ // #if ENABLED(ZONESTAR_12864LCD) - #define LCDSCREEN_NAME "ZONESTAR LCD12864" #define LCD_PINS_RS EXP1_03_PIN // 7 CS make sure for zonestar zm3e4! #define LCD_PINS_EN EXP1_06_PIN // 6 DATA make sure for zonestar zm3e4! #define LCD_PINS_D4 EXP1_04_PIN // 8 SCK make sure for zonestar zm3e4! @@ -290,7 +289,6 @@ #define BTN_EN2 EXP1_08_PIN #define BTN_ENC EXP1_07_PIN #elif ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) - #define LCDSCREEN_NAME "REPRAPDISCOUNT LCD12864" #define LCD_PINS_RS EXP1_03_PIN // 7 CS make sure for zonestar zm3e4! #define LCD_PINS_EN EXP1_04_PIN // 6 DATA make sure for zonestar zm3e4! #define LCD_PINS_D4 EXP1_06_PIN // 8 SCK make sure for zonestar zm3e4! @@ -301,7 +299,6 @@ #define BTN_ENC EXP1_01_PIN #elif ENABLED(ZONESTAR_DWIN_LCD) // Connect to EXP2 connector - #define LCDSCREEN_NAME "ZONESTAR DWIN LCD" #define BEEPER_PIN EXP2_05_PIN #define KILL_PIN PC0 #define BTN_EN1 EXP2_08_PIN @@ -310,7 +307,6 @@ #endif #if ENABLED(ZONESTAR_LCD2004_KNOB) - #define LCDSCREEN_NAME "LCD2004 KNOB" #define LCD_PINS_RS EXP1_03_PIN #define LCD_PINS_EN EXP1_04_PIN #define LCD_PINS_D4 EXP1_06_PIN @@ -323,7 +319,6 @@ #define BEEPER_PIN EXP1_02_PIN #define KILL_PIN EXP2_07_PIN #elif ENABLED(ZONESTAR_LCD2004_ADCKEY) - #define LCDSCREEN_NAME "LCD2004 5KEY" #define LCD_PINS_RS EXP1_03_PIN #define LCD_PINS_EN EXP1_04_PIN #define LCD_PINS_D4 EXP1_06_PIN diff --git a/Marlin/src/pins/stm32f1/pins_ZM3E4_V2_0.h b/Marlin/src/pins/stm32f1/pins_ZM3E4_V2_0.h index 66e538cb48..833c3427c1 100644 --- a/Marlin/src/pins/stm32f1/pins_ZM3E4_V2_0.h +++ b/Marlin/src/pins/stm32f1/pins_ZM3E4_V2_0.h @@ -276,7 +276,6 @@ #define WIFI_EN PC14 #if ENABLED(ZONESTAR_12864LCD) - #define LCDSCREEN_NAME "ZONESTAR LCD12864" #define LCD_PINS_RS EXP1_03_PIN // 7 CS make sure for zonestar zm3e4! #define LCD_PINS_EN EXP1_06_PIN // 6 DATA make sure for zonestar zm3e4! #define LCD_PINS_D4 EXP1_04_PIN // 8 SCK make sure for zonestar zm3e4! @@ -286,7 +285,6 @@ #define BTN_EN2 EXP1_08_PIN #define BTN_ENC EXP1_07_PIN #elif ENABLED(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER) - #define LCDSCREEN_NAME "REPRAPDISCOUNT LCD12864" #define LCD_PINS_RS EXP2_03_PIN // 7 CS make sure for zonestar zm3e4! #define LCD_PINS_EN EXP2_06_PIN // 6 DATA make sure for zonestar zm3e4! #define LCD_PINS_D4 EXP2_04_PIN // 8 SCK make sure for zonestar zm3e4! @@ -297,7 +295,6 @@ #define BTN_ENC EXP2_07_PIN #elif ENABLED(ZONESTAR_DWIN_LCD) // Connect to EXP2 connector - #define LCDSCREEN_NAME "ZONESTAR DWIN LCD" #define BEEPER_PIN EXP2_05_PIN // PE11 #define KILL_PIN -1 // EXP1_01_PIN #define BTN_EN2 EXP2_07_PIN // PE8 diff --git a/Marlin/src/pins/stm32f4/pins_FYSETC_CHEETAH_V30.h b/Marlin/src/pins/stm32f4/pins_FYSETC_CHEETAH_V30.h index 54e1acc936..d0427b2c31 100644 --- a/Marlin/src/pins/stm32f4/pins_FYSETC_CHEETAH_V30.h +++ b/Marlin/src/pins/stm32f4/pins_FYSETC_CHEETAH_V30.h @@ -280,7 +280,7 @@ #endif // HAS_WIRED_LCD // Alter timing for graphical display -#if ENABLED(U8GLIB_ST7920) +#if IS_U8GLIB_ST7920 #define BOARD_ST7920_DELAY_1 96 #define BOARD_ST7920_DELAY_2 48 #define BOARD_ST7920_DELAY_3 600 diff --git a/Marlin/src/pins/stm32f4/pins_I3DBEEZ9.h b/Marlin/src/pins/stm32f4/pins_I3DBEEZ9.h index e36bdae3a8..1620c86bed 100644 --- a/Marlin/src/pins/stm32f4/pins_I3DBEEZ9.h +++ b/Marlin/src/pins/stm32f4/pins_I3DBEEZ9.h @@ -571,15 +571,9 @@ // Alter timing for graphical display #if IS_U8GLIB_ST7920 - #ifndef BOARD_ST7920_DELAY_1 - #define BOARD_ST7920_DELAY_1 125 - #endif - #ifndef BOARD_ST7920_DELAY_2 - #define BOARD_ST7920_DELAY_2 90 - #endif - #ifndef BOARD_ST7920_DELAY_3 - #define BOARD_ST7920_DELAY_3 600 - #endif + #define BOARD_ST7920_DELAY_1 125 + #define BOARD_ST7920_DELAY_2 90 + #define BOARD_ST7920_DELAY_3 600 #endif #if ENABLED(WIFISUPPORT) diff --git a/Marlin/src/pins/stm32f4/pins_MELLOW_FLY_E3_V2.h b/Marlin/src/pins/stm32f4/pins_MELLOW_FLY_E3_V2.h index 3fff8515b9..3ae1432a14 100644 --- a/Marlin/src/pins/stm32f4/pins_MELLOW_FLY_E3_V2.h +++ b/Marlin/src/pins/stm32f4/pins_MELLOW_FLY_E3_V2.h @@ -480,15 +480,9 @@ // Alter timing for graphical display #if IS_U8GLIB_ST7920 - #ifndef BOARD_ST7920_DELAY_1 - #define BOARD_ST7920_DELAY_1 120 - #endif - #ifndef BOARD_ST7920_DELAY_2 - #define BOARD_ST7920_DELAY_2 80 - #endif - #ifndef BOARD_ST7920_DELAY_3 - #define BOARD_ST7920_DELAY_3 580 - #endif + #define BOARD_ST7920_DELAY_1 120 + #define BOARD_ST7920_DELAY_2 80 + #define BOARD_ST7920_DELAY_3 580 #endif //#define POWER_MONITOR_VOLTAGE_PIN PC3 diff --git a/Marlin/src/pins/stm32f4/pins_XTLW_CLIMBER_8TH.h b/Marlin/src/pins/stm32f4/pins_XTLW_CLIMBER_8TH.h index 3ed778c16f..053fb19525 100644 --- a/Marlin/src/pins/stm32f4/pins_XTLW_CLIMBER_8TH.h +++ b/Marlin/src/pins/stm32f4/pins_XTLW_CLIMBER_8TH.h @@ -275,14 +275,8 @@ #endif // HAS_WIRED_LCD // Alter timing for graphical display -#if ENABLED(U8GLIB_ST7920) - #ifndef BOARD_ST7920_DELAY_1 - #define BOARD_ST7920_DELAY_1 120 - #endif - #ifndef BOARD_ST7920_DELAY_2 - #define BOARD_ST7920_DELAY_2 80 - #endif - #ifndef BOARD_ST7920_DELAY_3 - #define BOARD_ST7920_DELAY_3 580 - #endif +#if IS_U8GLIB_ST7920 + #define BOARD_ST7920_DELAY_1 120 + #define BOARD_ST7920_DELAY_2 80 + #define BOARD_ST7920_DELAY_3 580 #endif diff --git a/Marlin/src/pins/stm32g0/pins_BTT_MANTA_M4P_V2_1.h b/Marlin/src/pins/stm32g0/pins_BTT_MANTA_M4P_V2_1.h index 9c50f4b7d8..ec6784b3b5 100644 --- a/Marlin/src/pins/stm32g0/pins_BTT_MANTA_M4P_V2_1.h +++ b/Marlin/src/pins/stm32g0/pins_BTT_MANTA_M4P_V2_1.h @@ -282,15 +282,9 @@ // Alter timing for graphical display #if IS_U8GLIB_ST7920 - #ifndef BOARD_ST7920_DELAY_1 - #define BOARD_ST7920_DELAY_1 120 - #endif - #ifndef BOARD_ST7920_DELAY_2 - #define BOARD_ST7920_DELAY_2 80 - #endif - #ifndef BOARD_ST7920_DELAY_3 - #define BOARD_ST7920_DELAY_3 580 - #endif + #define BOARD_ST7920_DELAY_1 120 + #define BOARD_ST7920_DELAY_2 80 + #define BOARD_ST7920_DELAY_3 580 #endif // diff --git a/Marlin/src/pins/stm32g0/pins_BTT_MANTA_M5P_V1_0.h b/Marlin/src/pins/stm32g0/pins_BTT_MANTA_M5P_V1_0.h index dce4f87cdf..4ff278acc5 100644 --- a/Marlin/src/pins/stm32g0/pins_BTT_MANTA_M5P_V1_0.h +++ b/Marlin/src/pins/stm32g0/pins_BTT_MANTA_M5P_V1_0.h @@ -308,15 +308,9 @@ // Alter timing for graphical display #if IS_U8GLIB_ST7920 - #ifndef BOARD_ST7920_DELAY_1 - #define BOARD_ST7920_DELAY_1 120 - #endif - #ifndef BOARD_ST7920_DELAY_2 - #define BOARD_ST7920_DELAY_2 80 - #endif - #ifndef BOARD_ST7920_DELAY_3 - #define BOARD_ST7920_DELAY_3 580 - #endif + #define BOARD_ST7920_DELAY_1 120 + #define BOARD_ST7920_DELAY_2 80 + #define BOARD_ST7920_DELAY_3 580 #endif // diff --git a/Marlin/src/pins/stm32g0/pins_BTT_SKRAT_V1_0.h b/Marlin/src/pins/stm32g0/pins_BTT_SKRAT_V1_0.h index 5b3ff90f9e..2a112f34b1 100644 --- a/Marlin/src/pins/stm32g0/pins_BTT_SKRAT_V1_0.h +++ b/Marlin/src/pins/stm32g0/pins_BTT_SKRAT_V1_0.h @@ -518,15 +518,9 @@ // Alter timing for graphical display #if IS_U8GLIB_ST7920 - #ifndef BOARD_ST7920_DELAY_1 - #define BOARD_ST7920_DELAY_1 120 - #endif - #ifndef BOARD_ST7920_DELAY_2 - #define BOARD_ST7920_DELAY_2 80 - #endif - #ifndef BOARD_ST7920_DELAY_3 - #define BOARD_ST7920_DELAY_3 580 - #endif + #define BOARD_ST7920_DELAY_1 120 + #define BOARD_ST7920_DELAY_2 80 + #define BOARD_ST7920_DELAY_3 580 #endif #if HAS_SPI_TFT From 2cf4d02a32e717ef6b1d348fe0504aba15cafb23 Mon Sep 17 00:00:00 2001 From: ellensp <530024+ellensp@users.noreply.github.com> Date: Fri, 21 Mar 2025 15:03:14 +1300 Subject: [PATCH 42/74] =?UTF-8?q?=F0=9F=A9=B9=20Fix=20TOUCH=5FUI=5FFTDI=5F?= =?UTF-8?q?EVE=20build=20(#27667)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Followup to #27275 --- .../lcd/extui/ftdi_eve_touch_ui/generic/leveling_menu.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/leveling_menu.cpp b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/leveling_menu.cpp index ce281c685b..44e5341f64 100644 --- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/leveling_menu.cpp +++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/leveling_menu.cpp @@ -70,6 +70,10 @@ using namespace Theme; #define BACK_POS BTN_POS(1,6), BTN_SIZE(3,1) #endif +#ifndef Z_ALIGN_COMMANDS + #define Z_ALIGN_COMMANDS "G34" +#endif + void LevelingMenu::onRedraw(draw_mode_t what) { if (what & BACKGROUND) { CommandProcessor cmd; @@ -116,7 +120,7 @@ bool LevelingMenu::onTouchEnd(uint8_t tag) { switch (tag) { case 1: GOTO_PREVIOUS(); break; #if ANY(Z_STEPPER_AUTO_ALIGN, MECHANICAL_GANTRY_CALIBRATION, X_LEVEL_SEQUENCE) - case 2: SpinnerDialogBox::enqueueAndWait(F(LEVELING_COMMANDS)); break; + case 2: SpinnerDialogBox::enqueueAndWait(F(Z_ALIGN_COMMANDS)); break; #endif #if HAS_BED_PROBE case 3: From c29b44fcca8562b20342ad81ba117c78ef39cf40 Mon Sep 17 00:00:00 2001 From: ellensp <530024+ellensp@users.noreply.github.com> Date: Fri, 21 Mar 2025 15:44:43 +1300 Subject: [PATCH 43/74] =?UTF-8?q?=F0=9F=A9=B9=20Fix=20Simulator=20KILL=20p?= =?UTF-8?q?in=20overlap=20(#27668)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/pins/native/pins_RAMPS_NATIVE.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/pins/native/pins_RAMPS_NATIVE.h b/Marlin/src/pins/native/pins_RAMPS_NATIVE.h index ffc716a502..b27b9c7b49 100644 --- a/Marlin/src/pins/native/pins_RAMPS_NATIVE.h +++ b/Marlin/src/pins/native/pins_RAMPS_NATIVE.h @@ -730,5 +730,5 @@ #endif // HAS_WIRED_LCD #ifndef KILL_PIN - #define KILL_PIN EXP2_08_PIN + #define KILL_PIN 11 #endif From a68b70de15282b2f15cb2e96e44ea31fd4b4eedd Mon Sep 17 00:00:00 2001 From: ellensp <530024+ellensp@users.noreply.github.com> Date: Fri, 21 Mar 2025 15:48:18 +1300 Subject: [PATCH 44/74] =?UTF-8?q?=F0=9F=93=8C=20Clean=20up=20ESP32=20build?= =?UTF-8?q?=20(#27672)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/libs/numtostr.cpp | 4 +++- ini/esp32.ini | 2 +- ini/features.ini | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/Marlin/src/libs/numtostr.cpp b/Marlin/src/libs/numtostr.cpp index b9503cb242..aa00b5d6e2 100644 --- a/Marlin/src/libs/numtostr.cpp +++ b/Marlin/src/libs/numtostr.cpp @@ -25,7 +25,9 @@ #include "../inc/MarlinConfigPre.h" #include "../core/utility.h" -#pragma GCC diagnostic ignored "-Wimplicit-fallthrough" +#if !ARDUINO_ARCH_ESP32 + #pragma GCC diagnostic ignored "-Wimplicit-fallthrough" +#endif constexpr char DIGIT(const uint8_t n) { return '0' + n; } diff --git a/ini/esp32.ini b/ini/esp32.ini index 4afaeaa030..f40b37ef14 100644 --- a/ini/esp32.ini +++ b/ini/esp32.ini @@ -45,7 +45,7 @@ extends = env:esp32 board = marlin_MKS_TinyBee platform = espressif32@~3.5.0 board_build.partitions = default_8MB.csv -build_src_flags = -O3 -Wno-volatile +build_src_flags = -O3 monitor_filters = esp32_exception_decoder [env:godi_esp32] diff --git a/ini/features.ini b/ini/features.ini index 49e0c5054e..f56175a3d6 100644 --- a/ini/features.ini +++ b/ini/features.ini @@ -375,7 +375,7 @@ IS_SCARA = build_src_filter=+ + MORGAN_SCARA = build_src_filter=+ HAS_MICROSTEPS = build_src_filter=+ -(ESP3D_)?WIFISUPPORT = AsyncTCP, ESP Async WebServer +(ESP3D_)?WIFISUPPORT = esp32async/AsyncTCP@3.3.3, mathieucarbou/ESP Async WebServer@3.0.6 ESP3DLib=https://github.com/luc-github/ESP3DLib/archive/dc0f3d96c6.zip arduinoWebSockets=links2004/WebSockets@2.3.4 luc-github/ESP32SSDP@1.1.1 From 363f324179b608d3be5eabcb0e964ee8a9d0b2ab Mon Sep 17 00:00:00 2001 From: Teemo Vaas Date: Fri, 22 Dec 2023 06:47:36 +0200 Subject: [PATCH 45/74] =?UTF-8?q?=F0=9F=9A=B8=20Fix=20G4=20Dwell=20overflo?= =?UTF-8?q?w?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/core/millis_t.h | 5 ++++- Marlin/src/gcode/gcode.cpp | 8 ++++---- Marlin/src/gcode/gcode.h | 2 +- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/Marlin/src/core/millis_t.h b/Marlin/src/core/millis_t.h index e7032a2e55..7c00b91a5b 100644 --- a/Marlin/src/core/millis_t.h +++ b/Marlin/src/core/millis_t.h @@ -30,5 +30,8 @@ typedef uint32_t millis_t; #define MS_TO_SEC(N) millis_t((N)/1000UL) #define MS_TO_SEC_PRECISE(N) (float(N)/1000.0f) -#define PENDING(NOW,SOON) ((int32_t)(NOW-(SOON))<0) +#define FUTURE(START,DURA) (millis_t(millis()-(START))<(DURA)) +#define PAST(START,DURA) (!FUTURE(START,DURA)) + +#define PENDING(NOW,SOON) (int32_t((NOW)-(SOON))<0) #define ELAPSED(NOW,SOON) (!PENDING(NOW,SOON)) diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index 881149fb52..69d77e875e 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -242,11 +242,11 @@ void GcodeSuite::get_destination_from_command() { } /** - * Dwell waits immediately. It does not synchronize. Use M400 instead of G4 + * Dwell waits immediately. It does not synchronize. */ -void GcodeSuite::dwell(millis_t time) { - time += millis(); - while (PENDING(millis(), time)) idle(); +void GcodeSuite::dwell(const millis_t time) { + const millis_t startMillis = millis(); + while (FUTURE(startMillis, time)) idle(); } /** diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h index e86a58d85d..1f3ccba37c 100644 --- a/Marlin/src/gcode/gcode.h +++ b/Marlin/src/gcode/gcode.h @@ -503,7 +503,7 @@ public: #define KEEPALIVE_STATE(N) NOOP #endif - static void dwell(millis_t time); + static void dwell(const millis_t time); private: From 91a87f45d9d491a259446f439fe9a3ceadecbf87 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 21 Mar 2025 13:51:08 -0500 Subject: [PATCH 46/74] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20Some?= =?UTF-8?q?=20millis()=20'unsigned=20long'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/HAL/LINUX/arduino.cpp | 4 ++-- Marlin/src/HAL/LINUX/include/Arduino.h | 4 ++-- Marlin/src/HAL/LPC1768/u8g/LCD_I2C_routines.cpp | 2 +- Marlin/src/HAL/STM32F1/sdio.cpp | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Marlin/src/HAL/LINUX/arduino.cpp b/Marlin/src/HAL/LINUX/arduino.cpp index 0a48697a9c..a387a9623e 100644 --- a/Marlin/src/HAL/LINUX/arduino.cpp +++ b/Marlin/src/HAL/LINUX/arduino.cpp @@ -33,8 +33,8 @@ void sei() { } // Enable // Time functions void _delay_ms(const int ms) { delay(ms); } -uint32_t millis() { - return (uint32_t)Clock::millis(); +unsigned long millis() { + return (unsigned long)Clock::millis(); } // This is required for some Arduino libraries we are using diff --git a/Marlin/src/HAL/LINUX/include/Arduino.h b/Marlin/src/HAL/LINUX/include/Arduino.h index f05aaed880..b11e75ccbc 100644 --- a/Marlin/src/HAL/LINUX/include/Arduino.h +++ b/Marlin/src/HAL/LINUX/include/Arduino.h @@ -76,9 +76,9 @@ extern "C" { extern "C" void delay(const int ms); void _delay_ms(const int ms); void delayMicroseconds(unsigned long); -uint32_t millis(); +unsigned long millis(); -//IO functions +// IO functions void pinMode(const pin_t, const uint8_t); void digitalWrite(pin_t, uint8_t); bool digitalRead(pin_t); diff --git a/Marlin/src/HAL/LPC1768/u8g/LCD_I2C_routines.cpp b/Marlin/src/HAL/LPC1768/u8g/LCD_I2C_routines.cpp index e714c3c16d..09603de972 100644 --- a/Marlin/src/HAL/LPC1768/u8g/LCD_I2C_routines.cpp +++ b/Marlin/src/HAL/LPC1768/u8g/LCD_I2C_routines.cpp @@ -28,7 +28,7 @@ #include "../include/i2c_util.h" #include "../../../core/millis_t.h" -extern int millis(); +uint32_t millis(); #ifdef __cplusplus extern "C" { diff --git a/Marlin/src/HAL/STM32F1/sdio.cpp b/Marlin/src/HAL/STM32F1/sdio.cpp index 23f984eff3..5bb1ddb6c5 100644 --- a/Marlin/src/HAL/STM32F1/sdio.cpp +++ b/Marlin/src/HAL/STM32F1/sdio.cpp @@ -145,7 +145,7 @@ bool SDIO_ReadBlock(uint32_t blockAddress, uint8_t *data) { return false; } -uint32_t millis(); +unsigned long millis(); bool SDIO_WriteBlock(uint32_t blockAddress, const uint8_t *data) { if (SDIO_GetCardState() != SDIO_CARD_TRANSFER) return false; From 14fa7057718acbed8d0e4238f2eba9b9f645db64 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Sat, 22 Mar 2025 00:28:38 +0000 Subject: [PATCH 47/74] [cron] Bump distribution date (2025-03-22) --- 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 a1aa9e6164..f31c7298a1 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-03-21" +//#define STRING_DISTRIBUTION_DATE "2025-03-22" /** * 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 ce3bc61e5c..a24628c209 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-03-21" + #define STRING_DISTRIBUTION_DATE "2025-03-22" #endif /** From 1701fd8f641757fa752acf40a6a1a7bdc4d572d4 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 25 Mar 2025 16:39:09 -0500 Subject: [PATCH 48/74] =?UTF-8?q?=F0=9F=94=A5=20DELTA=5FMAX=5FRADIUS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/Configuration.h | 3 --- 1 file changed, 3 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 1202bc1e53..9a96169646 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -1025,9 +1025,6 @@ // Print surface diameter/2 minus unreachable space (avoid collisions with vertical towers). #define PRINTABLE_RADIUS 140.0 // (mm) - // Maximum reachable area - #define DELTA_MAX_RADIUS 140.0 // (mm) - // Center-to-center distance of the holes in the diagonal push rods. #define DELTA_DIAGONAL_ROD 250.0 // (mm) From a8fea3d67451ef9b0593b2d790ad92cad0a5f9a8 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 25 Mar 2025 16:41:40 -0500 Subject: [PATCH 49/74] =?UTF-8?q?=F0=9F=A9=B9=20Cleanup=20(for=20STM32=20I?= =?UTF-8?q?2C=20LCD)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Followup to 9a8b1eab --- Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h index 06c7cacc5b..9c7c8148cb 100644 --- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_E3_DIP.h @@ -302,9 +302,9 @@ #elif ENABLED(ULTI_CONTROLLER) - #define LCD_PINS_D6 EXP1_03_PIN - #define DOGLCD_SCL_PIN EXP1_07_PIN // I2C1 - #define DOGLCD_SDA_PIN EXP1_08_PIN // I2C1 + #define LCD_PINS_D6 EXP1_03_PIN + #define DOGLCD_SCL_PIN EXP1_07_PIN // I2C1 + #define DOGLCD_SDA_PIN EXP1_08_PIN // I2C1 #else #error "Only CR10_STOCKDISPLAY, ZONESTAR_LCD, ENDER2_STOCKDISPLAY, ULTI_CONTROLLER, MKS_MINI_12864, FYSETC_MINI_12864_2_1 and MKS_LCD12864A/B are currently supported on the SKR E3 DIP." From dda42fb599d17fd049ee38a95b4e80dc95c9cbd2 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Wed, 26 Mar 2025 00:29:30 +0000 Subject: [PATCH 50/74] [cron] Bump distribution date (2025-03-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 f31c7298a1..18f9ce19e8 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-03-22" +//#define STRING_DISTRIBUTION_DATE "2025-03-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 a24628c209..0d24f4c508 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-03-22" + #define STRING_DISTRIBUTION_DATE "2025-03-26" #endif /** From ac5fa61de5775b54e1a9f4dc9ad8a7583ef93996 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 27 Mar 2025 02:25:43 -0500 Subject: [PATCH 51/74] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20More?= =?UTF-8?q?=20robust=20TERN=5F=20macro?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/core/macros.h | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/Marlin/src/core/macros.h b/Marlin/src/core/macros.h index 21d9929bc5..344ab04e74 100644 --- a/Marlin/src/core/macros.h +++ b/Marlin/src/core/macros.h @@ -206,19 +206,23 @@ #define TERN(O,A,B) _TERN(_ENA_1(O),B,A) // OPTION ? 'A' : 'B' #define TERN0(O,A) _TERN(_ENA_1(O),0,A) // OPTION ? 'A' : '0' #define TERN1(O,A) _TERN(_ENA_1(O),1,A) // OPTION ? 'A' : '1' -#define TERN_(O,A) _TERN(_ENA_1(O),,A) // OPTION ? 'A' : '' #define _TERN(E,V...) __TERN(_CAT(T_,E),V) // Prepend 'T_' to get 'T_0' or 'T_1' #define __TERN(T,V...) ___TERN(_CAT(_NO,T),V) // Prepend '_NO' to get '_NOT_0' or '_NOT_1' #define ___TERN(P,V...) THIRD(P,V) // If first argument has a comma, A. Else B. #define IF_DISABLED(O,A) TERN(O,,A) +// "Ternary" that emits or omits the given content +#define EMIT(V...) V +#define OMIT(...) +#define TERN_(O,A) _TERN(_ENA_1(O),OMIT,EMIT)(A) // OPTION ? 'A' : '' + // Macros to conditionally emit array items and function arguments #define _OPTITEM(A...) A, -#define OPTITEM(O,A...) TERN_(O,DEFER4(_OPTITEM)(A)) +#define OPTITEM(O,A...) TERN_(O,DEFER(_OPTITEM)(A)) #define _OPTARG(A...) , A -#define OPTARG(O,A...) TERN_(O,DEFER4(_OPTARG)(A)) +#define OPTARG(O,A...) TERN_(O,DEFER(_OPTARG)(A)) #define _OPTCODE(A) A; -#define OPTCODE(O,A) TERN_(O,DEFER4(_OPTCODE)(A)) +#define OPTCODE(O,A) TERN_(O,DEFER(_OPTCODE)(A)) // Macros to avoid operations that aren't always optimized away (e.g., 'f + 0.0' and 'f * 1.0'). // Compiler flags -fno-signed-zeros -ffinite-math-only also cover 'f * 1.0', 'f - f', etc. From add72fd0452addb13ac7c1fea7d7476dd991cd93 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 27 Mar 2025 02:29:11 -0500 Subject: [PATCH 52/74] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20Indiv?= =?UTF-8?q?idual=20TMC=20flags?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/feature/digipot/digipot_mcp4451.cpp | 8 +- Marlin/src/feature/tmc_util.cpp | 481 +++++------------- Marlin/src/gcode/calibrate/G28.cpp | 12 +- Marlin/src/gcode/calibrate/G34.cpp | 49 +- Marlin/src/gcode/feature/trinamic/M906.cpp | 251 +++------ .../src/gcode/feature/trinamic/M911-M914.cpp | 176 +++---- Marlin/src/gcode/feature/trinamic/M919.cpp | 157 ++---- Marlin/src/gcode/gcode.cpp | 1 + Marlin/src/gcode/gcode.h | 15 +- Marlin/src/inc/Conditionals-4-adv.h | 69 ++- Marlin/src/inc/Conditionals-5-post.h | 88 ++-- Marlin/src/inc/Conditionals-6-type.h | 47 +- Marlin/src/inc/SanityCheck.h | 22 +- Marlin/src/inc/Warnings.cpp | 32 +- Marlin/src/lcd/e3v2/jyersui/dwin.cpp | 8 +- Marlin/src/lcd/e3v2/proui/dwin.cpp | 39 +- .../src/lcd/extui/dgus/mks/DGUSDisplayDef.cpp | 16 +- .../lcd/extui/dgus/mks/DGUSScreenHandler.cpp | 16 +- .../generic/stepper_current_screen.cpp | 68 +-- .../src/lcd/extui/mks_ui/draw_number_key.cpp | 52 +- .../mks_ui/draw_tmc_current_settings.cpp | 71 +-- Marlin/src/lcd/extui/ui_api.cpp | 232 +++------ Marlin/src/lcd/menu/menu_tmc.cpp | 80 +-- Marlin/src/lcd/sovol_rts/sovol_rts.cpp | 57 +-- Marlin/src/module/motion.cpp | 344 +++---------- Marlin/src/module/motion.h | 3 + Marlin/src/module/settings.cpp | 176 ++----- Marlin/src/module/stepper.cpp | 124 ++--- Marlin/src/module/stepper/indirection.h | 204 ++------ Marlin/src/module/stepper/trinamic.cpp | 194 ++----- Marlin/src/module/stepper/trinamic.h | 44 +- 31 files changed, 958 insertions(+), 2178 deletions(-) diff --git a/Marlin/src/feature/digipot/digipot_mcp4451.cpp b/Marlin/src/feature/digipot/digipot_mcp4451.cpp index e35b42a28b..156755856c 100644 --- a/Marlin/src/feature/digipot/digipot_mcp4451.cpp +++ b/Marlin/src/feature/digipot/digipot_mcp4451.cpp @@ -87,13 +87,7 @@ void DigipotI2C::init() { Wire.begin(); #endif // Set up initial currents as defined in Configuration_adv.h - static const float digipot_motor_current[] PROGMEM = - #if ENABLED(DIGIPOT_USE_RAW_VALUES) - DIGIPOT_MOTOR_CURRENT - #else - DIGIPOT_I2C_MOTOR_CURRENTS - #endif - ; + static const float digipot_motor_current[] PROGMEM = TERN(DIGIPOT_USE_RAW_VALUES, DIGIPOT_MOTOR_CURRENT, DIGIPOT_I2C_MOTOR_CURRENTS); for (uint8_t i = 0; i < COUNT(digipot_motor_current); ++i) set_current(i, pgm_read_float(&digipot_motor_current[i])); } diff --git a/Marlin/src/feature/tmc_util.cpp b/Marlin/src/feature/tmc_util.cpp index 6afbf4a0ce..62972eb7f5 100644 --- a/Marlin/src/feature/tmc_util.cpp +++ b/Marlin/src/feature/tmc_util.cpp @@ -344,127 +344,70 @@ if (need_update_error_counters || need_debug_reporting) { - #if AXIS_IS_TMC(X) || AXIS_IS_TMC(X2) - { - bool result = false; - #if AXIS_IS_TMC(X) - if (monitor_tmc_driver(stepperX, need_update_error_counters, need_debug_reporting)) result = true; - #endif - #if AXIS_IS_TMC(X2) - if (monitor_tmc_driver(stepperX2, need_update_error_counters, need_debug_reporting)) result = true; - #endif - if (result) { - #if AXIS_IS_TMC(X) - step_current_down(stepperX); - #endif - #if AXIS_IS_TMC(X2) - step_current_down(stepperX2); - #endif + #if X_IS_TRINAMIC || X2_IS_TRINAMIC + if ( TERN0(X_IS_TRINAMIC, monitor_tmc_driver(stepperX, need_update_error_counters, need_debug_reporting)) + || TERN0(X2_IS_TRINAMIC, monitor_tmc_driver(stepperX2, need_update_error_counters, need_debug_reporting)) + ) { + TERN_(X_IS_TRINAMIC, step_current_down(stepperX)); + TERN_(X2_IS_TRINAMIC, step_current_down(stepperX2)); } - } #endif - #if AXIS_IS_TMC(Y) || AXIS_IS_TMC(Y2) - { - bool result = false; - #if AXIS_IS_TMC(Y) - if (monitor_tmc_driver(stepperY, need_update_error_counters, need_debug_reporting)) result = true; - #endif - #if AXIS_IS_TMC(Y2) - if (monitor_tmc_driver(stepperY2, need_update_error_counters, need_debug_reporting)) result = true; - #endif - if (result) { - #if AXIS_IS_TMC(Y) - step_current_down(stepperY); - #endif - #if AXIS_IS_TMC(Y2) - step_current_down(stepperY2); - #endif + #if Y_IS_TRINAMIC || Y2_IS_TRINAMIC + if ( TERN0(Y_IS_TRINAMIC, monitor_tmc_driver(stepperY, need_update_error_counters, need_debug_reporting)) + || TERN0(Y2_IS_TRINAMIC, monitor_tmc_driver(stepperY2, need_update_error_counters, need_debug_reporting)) + ) { + TERN_(Y_IS_TRINAMIC, step_current_down(stepperY)); + TERN_(Y2_IS_TRINAMIC, step_current_down(stepperY2)); } - } #endif - #if AXIS_IS_TMC(Z) || AXIS_IS_TMC(Z2) || AXIS_IS_TMC(Z3) || AXIS_IS_TMC(Z4) - { - bool result = false; - #if AXIS_IS_TMC(Z) - if (monitor_tmc_driver(stepperZ, need_update_error_counters, need_debug_reporting)) result = true; - #endif - #if AXIS_IS_TMC(Z2) - if (monitor_tmc_driver(stepperZ2, need_update_error_counters, need_debug_reporting)) result = true; - #endif - #if AXIS_IS_TMC(Z3) - if (monitor_tmc_driver(stepperZ3, need_update_error_counters, need_debug_reporting)) result = true; - #endif - #if AXIS_IS_TMC(Z4) - if (monitor_tmc_driver(stepperZ4, need_update_error_counters, need_debug_reporting)) result = true; - #endif - if (result) { - #if AXIS_IS_TMC(Z) - step_current_down(stepperZ); - #endif - #if AXIS_IS_TMC(Z2) - step_current_down(stepperZ2); - #endif - #if AXIS_IS_TMC(Z3) - step_current_down(stepperZ3); - #endif - #if AXIS_IS_TMC(Z4) - step_current_down(stepperZ4); - #endif + #if ANY(Z_IS_TRINAMIC, Z2_IS_TRINAMIC, Z3_IS_TRINAMIC, Z4_IS_TRINAMIC) + if ( TERN0(Z_IS_TRINAMIC, monitor_tmc_driver(stepperZ, need_update_error_counters, need_debug_reporting)) + || TERN0(Z2_IS_TRINAMIC, monitor_tmc_driver(stepperZ2, need_update_error_counters, need_debug_reporting)) + || TERN0(Z3_IS_TRINAMIC, monitor_tmc_driver(stepperZ3, need_update_error_counters, need_debug_reporting)) + || TERN0(Z4_IS_TRINAMIC, monitor_tmc_driver(stepperZ4, need_update_error_counters, need_debug_reporting)) + ) { + TERN_(Z_IS_TRINAMIC, step_current_down(stepperZ)); + TERN_(Z2_IS_TRINAMIC, step_current_down(stepperZ2)); + TERN_(Z3_IS_TRINAMIC, step_current_down(stepperZ3)); + TERN_(Z4_IS_TRINAMIC, step_current_down(stepperZ4)); } - } #endif - #if AXIS_IS_TMC(I) + #if I_IS_TRINAMIC if (monitor_tmc_driver(stepperI, need_update_error_counters, need_debug_reporting)) step_current_down(stepperI); #endif - #if AXIS_IS_TMC(J) + #if J_IS_TRINAMIC if (monitor_tmc_driver(stepperJ, need_update_error_counters, need_debug_reporting)) step_current_down(stepperJ); #endif - #if AXIS_IS_TMC(K) + #if K_IS_TRINAMIC if (monitor_tmc_driver(stepperK, need_update_error_counters, need_debug_reporting)) step_current_down(stepperK); #endif - #if AXIS_IS_TMC(U) + #if U_IS_TRINAMIC if (monitor_tmc_driver(stepperU, need_update_error_counters, need_debug_reporting)) step_current_down(stepperU); #endif - #if AXIS_IS_TMC(V) + #if V_IS_TRINAMIC if (monitor_tmc_driver(stepperV, need_update_error_counters, need_debug_reporting)) step_current_down(stepperV); #endif - #if AXIS_IS_TMC(W) + #if W_IS_TRINAMIC if (monitor_tmc_driver(stepperW, need_update_error_counters, need_debug_reporting)) step_current_down(stepperW); #endif - #if AXIS_IS_TMC(E0) - (void)monitor_tmc_driver(stepperE0, need_update_error_counters, need_debug_reporting); - #endif - #if AXIS_IS_TMC(E1) - (void)monitor_tmc_driver(stepperE1, need_update_error_counters, need_debug_reporting); - #endif - #if AXIS_IS_TMC(E2) - (void)monitor_tmc_driver(stepperE2, need_update_error_counters, need_debug_reporting); - #endif - #if AXIS_IS_TMC(E3) - (void)monitor_tmc_driver(stepperE3, need_update_error_counters, need_debug_reporting); - #endif - #if AXIS_IS_TMC(E4) - (void)monitor_tmc_driver(stepperE4, need_update_error_counters, need_debug_reporting); - #endif - #if AXIS_IS_TMC(E5) - (void)monitor_tmc_driver(stepperE5, need_update_error_counters, need_debug_reporting); - #endif - #if AXIS_IS_TMC(E6) - (void)monitor_tmc_driver(stepperE6, need_update_error_counters, need_debug_reporting); - #endif - #if AXIS_IS_TMC(E7) - (void)monitor_tmc_driver(stepperE7, need_update_error_counters, need_debug_reporting); - #endif + TERN_(E0_IS_TRINAMIC, (void)monitor_tmc_driver(stepperE0, need_update_error_counters, need_debug_reporting)); + TERN_(E1_IS_TRINAMIC, (void)monitor_tmc_driver(stepperE1, need_update_error_counters, need_debug_reporting)); + TERN_(E2_IS_TRINAMIC, (void)monitor_tmc_driver(stepperE2, need_update_error_counters, need_debug_reporting)); + TERN_(E3_IS_TRINAMIC, (void)monitor_tmc_driver(stepperE3, need_update_error_counters, need_debug_reporting)); + TERN_(E4_IS_TRINAMIC, (void)monitor_tmc_driver(stepperE4, need_update_error_counters, need_debug_reporting)); + TERN_(E5_IS_TRINAMIC, (void)monitor_tmc_driver(stepperE5, need_update_error_counters, need_debug_reporting)); + TERN_(E6_IS_TRINAMIC, (void)monitor_tmc_driver(stepperE6, need_update_error_counters, need_debug_reporting)); + TERN_(E7_IS_TRINAMIC, (void)monitor_tmc_driver(stepperE7, need_update_error_counters, need_debug_reporting)); if (TERN0(TMC_DEBUG, need_debug_reporting)) SERIAL_EOL(); } @@ -781,82 +724,38 @@ static void tmc_debug_loop(const TMC_debug_enum n OPTARGS_LOGICAL(const bool)) { if (TERN0(HAS_X_AXIS, x)) { - #if AXIS_IS_TMC(X) - tmc_status(stepperX, n); - #endif - #if AXIS_IS_TMC(X2) - tmc_status(stepperX2, n); - #endif + TERN_(X_IS_TRINAMIC, tmc_status(stepperX, n)); + TERN_(X2_IS_TRINAMIC, tmc_status(stepperX2, n)); } if (TERN0(HAS_Y_AXIS, y)) { - #if AXIS_IS_TMC(Y) - tmc_status(stepperY, n); - #endif - #if AXIS_IS_TMC(Y2) - tmc_status(stepperY2, n); - #endif + TERN_(Y_IS_TRINAMIC, tmc_status(stepperY, n)); + TERN_(Y2_IS_TRINAMIC, tmc_status(stepperY2, n)); } if (TERN0(HAS_Z_AXIS, z)) { - #if AXIS_IS_TMC(Z) - tmc_status(stepperZ, n); - #endif - #if AXIS_IS_TMC(Z2) - tmc_status(stepperZ2, n); - #endif - #if AXIS_IS_TMC(Z3) - tmc_status(stepperZ3, n); - #endif - #if AXIS_IS_TMC(Z4) - tmc_status(stepperZ4, n); - #endif + TERN_(Z_IS_TRINAMIC, tmc_status(stepperZ, n)); + TERN_(Z2_IS_TRINAMIC, tmc_status(stepperZ2, n)); + TERN_(Z3_IS_TRINAMIC, tmc_status(stepperZ3, n)); + TERN_(Z4_IS_TRINAMIC, tmc_status(stepperZ4, n)); } - #if AXIS_IS_TMC(I) - if (i) tmc_status(stepperI, n); - #endif - #if AXIS_IS_TMC(J) - if (j) tmc_status(stepperJ, n); - #endif - #if AXIS_IS_TMC(K) - if (k) tmc_status(stepperK, n); - #endif - #if AXIS_IS_TMC(U) - if (u) tmc_status(stepperU, n); - #endif - #if AXIS_IS_TMC(V) - if (v) tmc_status(stepperV, n); - #endif - #if AXIS_IS_TMC(W) - if (w) tmc_status(stepperW, n); - #endif + TERN_(I_IS_TRINAMIC, if (i) tmc_status(stepperI, n)); + TERN_(J_IS_TRINAMIC, if (j) tmc_status(stepperJ, n)); + TERN_(K_IS_TRINAMIC, if (k) tmc_status(stepperK, n)); + TERN_(U_IS_TRINAMIC, if (u) tmc_status(stepperU, n)); + TERN_(V_IS_TRINAMIC, if (v) tmc_status(stepperV, n)); + TERN_(W_IS_TRINAMIC, if (w) tmc_status(stepperW, n)); if (TERN0(HAS_EXTRUDERS, e)) { - #if AXIS_IS_TMC(E0) - tmc_status(stepperE0, n); - #endif - #if AXIS_IS_TMC(E1) - tmc_status(stepperE1, n); - #endif - #if AXIS_IS_TMC(E2) - tmc_status(stepperE2, n); - #endif - #if AXIS_IS_TMC(E3) - tmc_status(stepperE3, n); - #endif - #if AXIS_IS_TMC(E4) - tmc_status(stepperE4, n); - #endif - #if AXIS_IS_TMC(E5) - tmc_status(stepperE5, n); - #endif - #if AXIS_IS_TMC(E6) - tmc_status(stepperE6, n); - #endif - #if AXIS_IS_TMC(E7) - tmc_status(stepperE7, n); - #endif + TERN_(E0_IS_TRINAMIC, tmc_status(stepperE0, n)); + TERN_(E1_IS_TRINAMIC, tmc_status(stepperE1, n)); + TERN_(E2_IS_TRINAMIC, tmc_status(stepperE2, n)); + TERN_(E3_IS_TRINAMIC, tmc_status(stepperE3, n)); + TERN_(E4_IS_TRINAMIC, tmc_status(stepperE4, n)); + TERN_(E5_IS_TRINAMIC, tmc_status(stepperE5, n)); + TERN_(E6_IS_TRINAMIC, tmc_status(stepperE6, n)); + TERN_(E7_IS_TRINAMIC, tmc_status(stepperE7, n)); } SERIAL_EOL(); @@ -864,82 +763,38 @@ static void drv_status_loop(const TMC_drv_status_enum n OPTARGS_LOGICAL(const bool)) { if (TERN0(HAS_X_AXIS, x)) { - #if AXIS_IS_TMC(X) - tmc_parse_drv_status(stepperX, n); - #endif - #if AXIS_IS_TMC(X2) - tmc_parse_drv_status(stepperX2, n); - #endif + TERN_(X_IS_TRINAMIC, tmc_parse_drv_status(stepperX, n)); + TERN_(X2_IS_TRINAMIC, tmc_parse_drv_status(stepperX2, n)); } if (TERN0(HAS_Y_AXIS, y)) { - #if AXIS_IS_TMC(Y) - tmc_parse_drv_status(stepperY, n); - #endif - #if AXIS_IS_TMC(Y2) - tmc_parse_drv_status(stepperY2, n); - #endif + TERN_(Y_IS_TRINAMIC, tmc_parse_drv_status(stepperY, n)); + TERN_(Y2_IS_TRINAMIC, tmc_parse_drv_status(stepperY2, n)); } if (TERN0(HAS_Z_AXIS, z)) { - #if AXIS_IS_TMC(Z) - tmc_parse_drv_status(stepperZ, n); - #endif - #if AXIS_IS_TMC(Z2) - tmc_parse_drv_status(stepperZ2, n); - #endif - #if AXIS_IS_TMC(Z3) - tmc_parse_drv_status(stepperZ3, n); - #endif - #if AXIS_IS_TMC(Z4) - tmc_parse_drv_status(stepperZ4, n); - #endif + TERN_(Z_IS_TRINAMIC, tmc_parse_drv_status(stepperZ, n)); + TERN_(Z2_IS_TRINAMIC, tmc_parse_drv_status(stepperZ2, n)); + TERN_(Z3_IS_TRINAMIC, tmc_parse_drv_status(stepperZ3, n)); + TERN_(Z4_IS_TRINAMIC, tmc_parse_drv_status(stepperZ4, n)); } - #if AXIS_IS_TMC(I) - if (i) tmc_parse_drv_status(stepperI, n); - #endif - #if AXIS_IS_TMC(J) - if (j) tmc_parse_drv_status(stepperJ, n); - #endif - #if AXIS_IS_TMC(K) - if (k) tmc_parse_drv_status(stepperK, n); - #endif - #if AXIS_IS_TMC(U) - if (u) tmc_parse_drv_status(stepperU, n); - #endif - #if AXIS_IS_TMC(V) - if (v) tmc_parse_drv_status(stepperV, n); - #endif - #if AXIS_IS_TMC(W) - if (w) tmc_parse_drv_status(stepperW, n); - #endif + TERN_(I_IS_TRINAMIC, if (i) tmc_parse_drv_status(stepperI, n)); + TERN_(J_IS_TRINAMIC, if (j) tmc_parse_drv_status(stepperJ, n)); + TERN_(K_IS_TRINAMIC, if (k) tmc_parse_drv_status(stepperK, n)); + TERN_(U_IS_TRINAMIC, if (u) tmc_parse_drv_status(stepperU, n)); + TERN_(V_IS_TRINAMIC, if (v) tmc_parse_drv_status(stepperV, n)); + TERN_(W_IS_TRINAMIC, if (w) tmc_parse_drv_status(stepperW, n)); if (TERN0(HAS_EXTRUDERS, e)) { - #if AXIS_IS_TMC(E0) - tmc_parse_drv_status(stepperE0, n); - #endif - #if AXIS_IS_TMC(E1) - tmc_parse_drv_status(stepperE1, n); - #endif - #if AXIS_IS_TMC(E2) - tmc_parse_drv_status(stepperE2, n); - #endif - #if AXIS_IS_TMC(E3) - tmc_parse_drv_status(stepperE3, n); - #endif - #if AXIS_IS_TMC(E4) - tmc_parse_drv_status(stepperE4, n); - #endif - #if AXIS_IS_TMC(E5) - tmc_parse_drv_status(stepperE5, n); - #endif - #if AXIS_IS_TMC(E6) - tmc_parse_drv_status(stepperE6, n); - #endif - #if AXIS_IS_TMC(E7) - tmc_parse_drv_status(stepperE7, n); - #endif + TERN_(E0_IS_TRINAMIC, tmc_parse_drv_status(stepperE0, n)); + TERN_(E1_IS_TRINAMIC, tmc_parse_drv_status(stepperE1, n)); + TERN_(E2_IS_TRINAMIC, tmc_parse_drv_status(stepperE2, n)); + TERN_(E3_IS_TRINAMIC, tmc_parse_drv_status(stepperE3, n)); + TERN_(E4_IS_TRINAMIC, tmc_parse_drv_status(stepperE4, n)); + TERN_(E5_IS_TRINAMIC, tmc_parse_drv_status(stepperE5, n)); + TERN_(E6_IS_TRINAMIC, tmc_parse_drv_status(stepperE6, n)); + TERN_(E7_IS_TRINAMIC, tmc_parse_drv_status(stepperE7, n)); } SERIAL_EOL(); @@ -1078,82 +933,38 @@ static void tmc_get_registers(TMC_get_registers_enum n OPTARGS_LOGICAL(const bool)) { if (TERN0(HAS_X_AXIS, x)) { - #if AXIS_IS_TMC(X) - tmc_get_registers(stepperX, n); - #endif - #if AXIS_IS_TMC(X2) - tmc_get_registers(stepperX2, n); - #endif + TERN_(X_IS_TRINAMIC, tmc_get_registers(stepperX, n)); + TERN_(X2_IS_TRINAMIC, tmc_get_registers(stepperX2, n)); } if (TERN0(HAS_Y_AXIS, y)) { - #if AXIS_IS_TMC(Y) - tmc_get_registers(stepperY, n); - #endif - #if AXIS_IS_TMC(Y2) - tmc_get_registers(stepperY2, n); - #endif + TERN_(Y_IS_TRINAMIC, tmc_get_registers(stepperY, n)); + TERN_(Y2_IS_TRINAMIC, tmc_get_registers(stepperY2, n)); } if (TERN0(HAS_Z_AXIS, z)) { - #if AXIS_IS_TMC(Z) - tmc_get_registers(stepperZ, n); - #endif - #if AXIS_IS_TMC(Z2) - tmc_get_registers(stepperZ2, n); - #endif - #if AXIS_IS_TMC(Z3) - tmc_get_registers(stepperZ3, n); - #endif - #if AXIS_IS_TMC(Z4) - tmc_get_registers(stepperZ4, n); - #endif + TERN_(Z_IS_TRINAMIC, tmc_get_registers(stepperZ, n)); + TERN_(Z2_IS_TRINAMIC, tmc_get_registers(stepperZ2, n)); + TERN_(Z3_IS_TRINAMIC, tmc_get_registers(stepperZ3, n)); + TERN_(Z4_IS_TRINAMIC, tmc_get_registers(stepperZ4, n)); } - #if AXIS_IS_TMC(I) - if (i) tmc_get_registers(stepperI, n); - #endif - #if AXIS_IS_TMC(J) - if (j) tmc_get_registers(stepperJ, n); - #endif - #if AXIS_IS_TMC(K) - if (k) tmc_get_registers(stepperK, n); - #endif - #if AXIS_IS_TMC(U) - if (u) tmc_get_registers(stepperU, n); - #endif - #if AXIS_IS_TMC(V) - if (v) tmc_get_registers(stepperV, n); - #endif - #if AXIS_IS_TMC(W) - if (w) tmc_get_registers(stepperW, n); - #endif + TERN_(I_IS_TRINAMIC, if (i) tmc_get_registers(stepperI, n)); + TERN_(J_IS_TRINAMIC, if (j) tmc_get_registers(stepperJ, n)); + TERN_(K_IS_TRINAMIC, if (k) tmc_get_registers(stepperK, n)); + TERN_(U_IS_TRINAMIC, if (u) tmc_get_registers(stepperU, n)); + TERN_(V_IS_TRINAMIC, if (v) tmc_get_registers(stepperV, n)); + TERN_(W_IS_TRINAMIC, if (w) tmc_get_registers(stepperW, n)); if (TERN0(HAS_EXTRUDERS, e)) { - #if AXIS_IS_TMC(E0) - tmc_get_registers(stepperE0, n); - #endif - #if AXIS_IS_TMC(E1) - tmc_get_registers(stepperE1, n); - #endif - #if AXIS_IS_TMC(E2) - tmc_get_registers(stepperE2, n); - #endif - #if AXIS_IS_TMC(E3) - tmc_get_registers(stepperE3, n); - #endif - #if AXIS_IS_TMC(E4) - tmc_get_registers(stepperE4, n); - #endif - #if AXIS_IS_TMC(E5) - tmc_get_registers(stepperE5, n); - #endif - #if AXIS_IS_TMC(E6) - tmc_get_registers(stepperE6, n); - #endif - #if AXIS_IS_TMC(E7) - tmc_get_registers(stepperE7, n); - #endif + TERN_(E0_IS_TRINAMIC, tmc_get_registers(stepperE0, n)); + TERN_(E1_IS_TRINAMIC, tmc_get_registers(stepperE1, n)); + TERN_(E2_IS_TRINAMIC, tmc_get_registers(stepperE2, n)); + TERN_(E3_IS_TRINAMIC, tmc_get_registers(stepperE3, n)); + TERN_(E4_IS_TRINAMIC, tmc_get_registers(stepperE4, n)); + TERN_(E5_IS_TRINAMIC, tmc_get_registers(stepperE5, n)); + TERN_(E6_IS_TRINAMIC, tmc_get_registers(stepperE6, n)); + TERN_(E7_IS_TRINAMIC, tmc_get_registers(stepperE7, n)); } SERIAL_EOL(); @@ -1243,82 +1054,38 @@ void test_tmc_connection(LOGICAL_AXIS_ARGS_LC(const bool)) { uint8_t axis_connection = 0; if (TERN0(HAS_X_AXIS, x)) { - #if AXIS_IS_TMC(X) - axis_connection += test_connection(stepperX); - #endif - #if AXIS_IS_TMC(X2) - axis_connection += test_connection(stepperX2); - #endif + TERN_(X_IS_TRINAMIC, axis_connection += test_connection(stepperX)); + TERN_(X2_IS_TRINAMIC, axis_connection += test_connection(stepperX2)); } if (TERN0(HAS_Y_AXIS, y)) { - #if AXIS_IS_TMC(Y) - axis_connection += test_connection(stepperY); - #endif - #if AXIS_IS_TMC(Y2) - axis_connection += test_connection(stepperY2); - #endif + TERN_(Y_IS_TRINAMIC, axis_connection += test_connection(stepperY)); + TERN_(Y2_IS_TRINAMIC, axis_connection += test_connection(stepperY2)); } if (TERN0(HAS_Z_AXIS, z)) { - #if AXIS_IS_TMC(Z) - axis_connection += test_connection(stepperZ); - #endif - #if AXIS_IS_TMC(Z2) - axis_connection += test_connection(stepperZ2); - #endif - #if AXIS_IS_TMC(Z3) - axis_connection += test_connection(stepperZ3); - #endif - #if AXIS_IS_TMC(Z4) - axis_connection += test_connection(stepperZ4); - #endif + TERN_(Z_IS_TRINAMIC, axis_connection += test_connection(stepperZ)); + TERN_(Z2_IS_TRINAMIC, axis_connection += test_connection(stepperZ2)); + TERN_(Z3_IS_TRINAMIC, axis_connection += test_connection(stepperZ3)); + TERN_(Z4_IS_TRINAMIC, axis_connection += test_connection(stepperZ4)); } - #if AXIS_IS_TMC(I) - if (i) axis_connection += test_connection(stepperI); - #endif - #if AXIS_IS_TMC(J) - if (j) axis_connection += test_connection(stepperJ); - #endif - #if AXIS_IS_TMC(K) - if (k) axis_connection += test_connection(stepperK); - #endif - #if AXIS_IS_TMC(U) - if (u) axis_connection += test_connection(stepperU); - #endif - #if AXIS_IS_TMC(V) - if (v) axis_connection += test_connection(stepperV); - #endif - #if AXIS_IS_TMC(W) - if (w) axis_connection += test_connection(stepperW); - #endif + TERN_(I_IS_TRINAMIC, if (i) axis_connection += test_connection(stepperI)); + TERN_(J_IS_TRINAMIC, if (j) axis_connection += test_connection(stepperJ)); + TERN_(K_IS_TRINAMIC, if (k) axis_connection += test_connection(stepperK)); + TERN_(U_IS_TRINAMIC, if (u) axis_connection += test_connection(stepperU)); + TERN_(V_IS_TRINAMIC, if (v) axis_connection += test_connection(stepperV)); + TERN_(W_IS_TRINAMIC, if (w) axis_connection += test_connection(stepperW)); if (TERN0(HAS_EXTRUDERS, e)) { - #if AXIS_IS_TMC(E0) - axis_connection += test_connection(stepperE0); - #endif - #if AXIS_IS_TMC(E1) - axis_connection += test_connection(stepperE1); - #endif - #if AXIS_IS_TMC(E2) - axis_connection += test_connection(stepperE2); - #endif - #if AXIS_IS_TMC(E3) - axis_connection += test_connection(stepperE3); - #endif - #if AXIS_IS_TMC(E4) - axis_connection += test_connection(stepperE4); - #endif - #if AXIS_IS_TMC(E5) - axis_connection += test_connection(stepperE5); - #endif - #if AXIS_IS_TMC(E6) - axis_connection += test_connection(stepperE6); - #endif - #if AXIS_IS_TMC(E7) - axis_connection += test_connection(stepperE7); - #endif + TERN_(E0_IS_TRINAMIC, axis_connection += test_connection(stepperE0)); + TERN_(E1_IS_TRINAMIC, axis_connection += test_connection(stepperE1)); + TERN_(E2_IS_TRINAMIC, axis_connection += test_connection(stepperE2)); + TERN_(E3_IS_TRINAMIC, axis_connection += test_connection(stepperE3)); + TERN_(E4_IS_TRINAMIC, axis_connection += test_connection(stepperE4)); + TERN_(E5_IS_TRINAMIC, axis_connection += test_connection(stepperE5)); + TERN_(E6_IS_TRINAMIC, axis_connection += test_connection(stepperE6)); + TERN_(E7_IS_TRINAMIC, axis_connection += test_connection(stepperE7)); } if (axis_connection) LCD_MESSAGE(MSG_ERROR_TMC); diff --git a/Marlin/src/gcode/calibrate/G28.cpp b/Marlin/src/gcode/calibrate/G28.cpp index 85d27e14e8..6c8af9ddb0 100644 --- a/Marlin/src/gcode/calibrate/G28.cpp +++ b/Marlin/src/gcode/calibrate/G28.cpp @@ -88,10 +88,8 @@ fr_mm_s = HYPOT(minfr, minfr); // Set homing current to X and Y axis if defined - #if HAS_CURRENT_HOME(X) - set_homing_current(X_AXIS); - #endif - #if HAS_CURRENT_HOME(Y) && NONE(CORE_IS_XY, MARKFORGED_XY, MARKFORGED_YX) + TERN_(X_HAS_HOME_CURRENT, set_homing_current(X_AXIS)); + #if Y_HAS_HOME_CURRENT && NONE(CORE_IS_XY, MARKFORGED_XY, MARKFORGED_YX) set_homing_current(Y_AXIS); #endif @@ -113,10 +111,8 @@ current_position.set(0.0, 0.0); - #if HAS_CURRENT_HOME(X) - restore_homing_current(X_AXIS); - #endif - #if HAS_CURRENT_HOME(Y) && NONE(CORE_IS_XY, MARKFORGED_XY, MARKFORGED_YX) + TERN_(X_HAS_HOME_CURRENT, restore_homing_current(X_AXIS)); + #if Y_HAS_HOME_CURRENT && NONE(CORE_IS_XY, MARKFORGED_XY, MARKFORGED_YX) restore_homing_current(Y_AXIS); #endif diff --git a/Marlin/src/gcode/calibrate/G34.cpp b/Marlin/src/gcode/calibrate/G34.cpp index 9a0cb0054b..0654eb0ec9 100644 --- a/Marlin/src/gcode/calibrate/G34.cpp +++ b/Marlin/src/gcode/calibrate/G34.cpp @@ -95,37 +95,36 @@ void GcodeSuite::G34() { #if HAS_MOTOR_CURRENT_SPI const uint16_t target_current = parser.intval('S', GANTRY_CALIBRATION_CURRENT); - const uint32_t previous_current = stepper.motor_current_setting[Z_AXIS]; + const uint32_t previous_current_Z = stepper.motor_current_setting[Z_AXIS]; stepper.set_digipot_current(Z_AXIS, target_current); #elif HAS_MOTOR_CURRENT_PWM const uint16_t target_current = parser.intval('S', GANTRY_CALIBRATION_CURRENT); - const uint32_t previous_current = stepper.motor_current_setting[1]; // Z + const uint32_t previous_current_Z = stepper.motor_current_setting[1]; // Z stepper.set_digipot_current(1, target_current); #elif HAS_MOTOR_CURRENT_DAC const float target_current = parser.floatval('S', GANTRY_CALIBRATION_CURRENT); - const float previous_current = dac_amps(Z_AXIS, target_current); + const float previous_current_Z = dac_amps(Z_AXIS, target_current); stepper_dac.set_current_value(Z_AXIS, target_current); #elif HAS_MOTOR_CURRENT_I2C const uint16_t target_current = parser.intval('S', GANTRY_CALIBRATION_CURRENT); - previous_current = dac_amps(Z_AXIS); + const float previous_current_Z = dac_amps(Z_AXIS); digipot_i2c.set_current(Z_AXIS, target_current) #elif HAS_TRINAMIC_CONFIG const uint16_t target_current = parser.intval('S', GANTRY_CALIBRATION_CURRENT); - static uint16_t previous_current_arr[NUM_Z_STEPPERS]; - #if AXIS_IS_TMC(Z) - previous_current_arr[0] = stepperZ.getMilliamps(); + #if Z_IS_TRINAMIC + static uint16_t previous_current_Z = stepperZ.getMilliamps(); stepperZ.rms_current(target_current); #endif - #if AXIS_IS_TMC(Z2) - previous_current_arr[1] = stepperZ2.getMilliamps(); + #if Z2_IS_TRINAMIC + static uint16_t previous_current_Z2 = stepperZ2.getMilliamps(); stepperZ2.rms_current(target_current); #endif - #if AXIS_IS_TMC(Z3) - previous_current_arr[2] = stepperZ3.getMilliamps(); + #if Z3_IS_TRINAMIC + static uint16_t previous_current_Z3 = stepperZ3.getMilliamps(); stepperZ3.rms_current(target_current); #endif - #if AXIS_IS_TMC(Z4) - previous_current_arr[3] = stepperZ4.getMilliamps(); + #if Z4_IS_TRINAMIC + static uint16_t previous_current_Z4 = stepperZ4.getMilliamps(); stepperZ4.rms_current(target_current); #endif #endif @@ -140,26 +139,18 @@ void GcodeSuite::G34() { #endif #if HAS_MOTOR_CURRENT_SPI - stepper.set_digipot_current(Z_AXIS, previous_current); + stepper.set_digipot_current(Z_AXIS, previous_current_Z); #elif HAS_MOTOR_CURRENT_PWM - stepper.set_digipot_current(1, previous_current); + stepper.set_digipot_current(1, previous_current_Z); #elif HAS_MOTOR_CURRENT_DAC - stepper_dac.set_current_value(Z_AXIS, previous_current); + stepper_dac.set_current_value(Z_AXIS, previous_current_Z); #elif HAS_MOTOR_CURRENT_I2C - digipot_i2c.set_current(Z_AXIS, previous_current) + digipot_i2c.set_current(Z_AXIS, previous_current_Z) #elif HAS_TRINAMIC_CONFIG - #if AXIS_IS_TMC(Z) - stepperZ.rms_current(previous_current_arr[0]); - #endif - #if AXIS_IS_TMC(Z2) - stepperZ2.rms_current(previous_current_arr[1]); - #endif - #if AXIS_IS_TMC(Z3) - stepperZ3.rms_current(previous_current_arr[2]); - #endif - #if AXIS_IS_TMC(Z4) - stepperZ4.rms_current(previous_current_arr[3]); - #endif + TERN_(Z_IS_TRINAMIC, stepperZ.rms_current(previous_current_Z)); + TERN_(Z2_IS_TRINAMIC, stepperZ2.rms_current(previous_current_Z2)); + TERN_(Z3_IS_TRINAMIC, stepperZ3.rms_current(previous_current_Z3)); + TERN_(Z4_IS_TRINAMIC, stepperZ4.rms_current(previous_current_Z4)); #endif // Back off end plate, back to normal motion range diff --git a/Marlin/src/gcode/feature/trinamic/M906.cpp b/Marlin/src/gcode/feature/trinamic/M906.cpp index c0dc456a8a..43d980098e 100644 --- a/Marlin/src/gcode/feature/trinamic/M906.cpp +++ b/Marlin/src/gcode/feature/trinamic/M906.cpp @@ -60,173 +60,96 @@ void GcodeSuite::M906() { bool report = true; - #if AXIS_IS_TMC(X2) || AXIS_IS_TMC(Y2) || AXIS_IS_TMC(Z2) || AXIS_IS_TMC(Z3) || AXIS_IS_TMC(Z4) + #if ANY(X2_IS_TRINAMIC, Y2_IS_TRINAMIC, Z2_IS_TRINAMIC, Z3_IS_TRINAMIC, Z4_IS_TRINAMIC) const int8_t index = parser.byteval('I', -1); - #elif AXIS_IS_TMC(X) || AXIS_IS_TMC(Y) || AXIS_IS_TMC(Z) + #elif ANY(X_IS_TRINAMIC, Y_IS_TRINAMIC, Z_IS_TRINAMIC) constexpr int8_t index = -1; #endif LOOP_LOGICAL_AXES(i) if (uint16_t value = parser.intval(AXIS_CHAR(i))) { report = false; switch (i) { - #if AXIS_IS_TMC(X) || AXIS_IS_TMC(X2) + #if X_IS_TRINAMIC || X2_IS_TRINAMIC case X_AXIS: - #if AXIS_IS_TMC(X) - if (index < 0 || index == 0) TMC_SET_CURRENT(X); - #endif - #if AXIS_IS_TMC(X2) - if (index < 0 || index == 1) TMC_SET_CURRENT(X2); - #endif + TERN_(X_IS_TRINAMIC, if (index < 0 || index == 0) TMC_SET_CURRENT(X)); + TERN_(X2_IS_TRINAMIC, if (index < 0 || index == 1) TMC_SET_CURRENT(X2)); break; #endif - #if AXIS_IS_TMC(Y) || AXIS_IS_TMC(Y2) + #if Y_IS_TRINAMIC || Y2_IS_TRINAMIC case Y_AXIS: - #if AXIS_IS_TMC(Y) - if (index < 0 || index == 0) TMC_SET_CURRENT(Y); - #endif - #if AXIS_IS_TMC(Y2) - if (index < 0 || index == 1) TMC_SET_CURRENT(Y2); - #endif + TERN_(Y_IS_TRINAMIC, if (index < 0 || index == 0) TMC_SET_CURRENT(Y)); + TERN_(Y2_IS_TRINAMIC, if (index < 0 || index == 1) TMC_SET_CURRENT(Y2)); break; #endif - #if AXIS_IS_TMC(Z) || AXIS_IS_TMC(Z2) || AXIS_IS_TMC(Z3) || AXIS_IS_TMC(Z4) + #if ANY(Z_IS_TRINAMIC, Z2_IS_TRINAMIC, Z3_IS_TRINAMIC, Z4_IS_TRINAMIC) case Z_AXIS: - #if AXIS_IS_TMC(Z) - if (index < 0 || index == 0) TMC_SET_CURRENT(Z); - #endif - #if AXIS_IS_TMC(Z2) - if (index < 0 || index == 1) TMC_SET_CURRENT(Z2); - #endif - #if AXIS_IS_TMC(Z3) - if (index < 0 || index == 2) TMC_SET_CURRENT(Z3); - #endif - #if AXIS_IS_TMC(Z4) - if (index < 0 || index == 3) TMC_SET_CURRENT(Z4); - #endif + TERN_(Z_IS_TRINAMIC, if (index < 0 || index == 0) TMC_SET_CURRENT(Z)); + TERN_(Z2_IS_TRINAMIC, if (index < 0 || index == 1) TMC_SET_CURRENT(Z2)); + TERN_(Z3_IS_TRINAMIC, if (index < 0 || index == 2) TMC_SET_CURRENT(Z3)); + TERN_(Z4_IS_TRINAMIC, if (index < 0 || index == 3) TMC_SET_CURRENT(Z4)); break; #endif - #if AXIS_IS_TMC(I) + #if I_IS_TRINAMIC case I_AXIS: TMC_SET_CURRENT(I); break; #endif - #if AXIS_IS_TMC(J) + #if J_IS_TRINAMIC case J_AXIS: TMC_SET_CURRENT(J); break; #endif - #if AXIS_IS_TMC(K) + #if K_IS_TRINAMIC case K_AXIS: TMC_SET_CURRENT(K); break; #endif - #if AXIS_IS_TMC(U) + #if U_IS_TRINAMIC case U_AXIS: TMC_SET_CURRENT(U); break; #endif - #if AXIS_IS_TMC(V) + #if V_IS_TRINAMIC case V_AXIS: TMC_SET_CURRENT(V); break; #endif - #if AXIS_IS_TMC(W) + #if W_IS_TRINAMIC case W_AXIS: TMC_SET_CURRENT(W); break; #endif - #if AXIS_IS_TMC(E0) || AXIS_IS_TMC(E1) || AXIS_IS_TMC(E2) || AXIS_IS_TMC(E3) || AXIS_IS_TMC(E4) || AXIS_IS_TMC(E5) || AXIS_IS_TMC(E6) || AXIS_IS_TMC(E7) + #if ANY(E0_IS_TRINAMIC, E1_IS_TRINAMIC, E2_IS_TRINAMIC, E3_IS_TRINAMIC, E4_IS_TRINAMIC, E5_IS_TRINAMIC, E6_IS_TRINAMIC, E7_IS_TRINAMIC) case E_AXIS: { const int8_t eindex = get_target_e_stepper_from_command(-2); - #if AXIS_IS_TMC(E0) - if (eindex < 0 || eindex == 0) TMC_SET_CURRENT(E0); - #endif - #if AXIS_IS_TMC(E1) - if (eindex < 0 || eindex == 1) TMC_SET_CURRENT(E1); - #endif - #if AXIS_IS_TMC(E2) - if (eindex < 0 || eindex == 2) TMC_SET_CURRENT(E2); - #endif - #if AXIS_IS_TMC(E3) - if (eindex < 0 || eindex == 3) TMC_SET_CURRENT(E3); - #endif - #if AXIS_IS_TMC(E4) - if (eindex < 0 || eindex == 4) TMC_SET_CURRENT(E4); - #endif - #if AXIS_IS_TMC(E5) - if (eindex < 0 || eindex == 5) TMC_SET_CURRENT(E5); - #endif - #if AXIS_IS_TMC(E6) - if (eindex < 0 || eindex == 6) TMC_SET_CURRENT(E6); - #endif - #if AXIS_IS_TMC(E7) - if (eindex < 0 || eindex == 7) TMC_SET_CURRENT(E7); - #endif + TERN_(E0_IS_TRINAMIC, if (eindex < 0 || eindex == 0) TMC_SET_CURRENT(E0)); + TERN_(E1_IS_TRINAMIC, if (eindex < 0 || eindex == 1) TMC_SET_CURRENT(E1)); + TERN_(E2_IS_TRINAMIC, if (eindex < 0 || eindex == 2) TMC_SET_CURRENT(E2)); + TERN_(E3_IS_TRINAMIC, if (eindex < 0 || eindex == 3) TMC_SET_CURRENT(E3)); + TERN_(E4_IS_TRINAMIC, if (eindex < 0 || eindex == 4) TMC_SET_CURRENT(E4)); + TERN_(E5_IS_TRINAMIC, if (eindex < 0 || eindex == 5) TMC_SET_CURRENT(E5)); + TERN_(E6_IS_TRINAMIC, if (eindex < 0 || eindex == 6) TMC_SET_CURRENT(E6)); + TERN_(E7_IS_TRINAMIC, if (eindex < 0 || eindex == 7) TMC_SET_CURRENT(E7)); } break; #endif } } if (report) { - #if AXIS_IS_TMC(X) - TMC_SAY_CURRENT(X); - #endif - #if AXIS_IS_TMC(X2) - TMC_SAY_CURRENT(X2); - #endif - #if AXIS_IS_TMC(Y) - TMC_SAY_CURRENT(Y); - #endif - #if AXIS_IS_TMC(Y2) - TMC_SAY_CURRENT(Y2); - #endif - #if AXIS_IS_TMC(Z) - TMC_SAY_CURRENT(Z); - #endif - #if AXIS_IS_TMC(Z2) - TMC_SAY_CURRENT(Z2); - #endif - #if AXIS_IS_TMC(Z3) - TMC_SAY_CURRENT(Z3); - #endif - #if AXIS_IS_TMC(Z4) - TMC_SAY_CURRENT(Z4); - #endif - #if AXIS_IS_TMC(I) - TMC_SAY_CURRENT(I); - #endif - #if AXIS_IS_TMC(J) - TMC_SAY_CURRENT(J); - #endif - #if AXIS_IS_TMC(K) - TMC_SAY_CURRENT(K); - #endif - #if AXIS_IS_TMC(U) - TMC_SAY_CURRENT(U); - #endif - #if AXIS_IS_TMC(V) - TMC_SAY_CURRENT(V); - #endif - #if AXIS_IS_TMC(W) - TMC_SAY_CURRENT(W); - #endif - - #if AXIS_IS_TMC(E0) - TMC_SAY_CURRENT(E0); - #endif - #if AXIS_IS_TMC(E1) - TMC_SAY_CURRENT(E1); - #endif - #if AXIS_IS_TMC(E2) - TMC_SAY_CURRENT(E2); - #endif - #if AXIS_IS_TMC(E3) - TMC_SAY_CURRENT(E3); - #endif - #if AXIS_IS_TMC(E4) - TMC_SAY_CURRENT(E4); - #endif - #if AXIS_IS_TMC(E5) - TMC_SAY_CURRENT(E5); - #endif - #if AXIS_IS_TMC(E6) - TMC_SAY_CURRENT(E6); - #endif - #if AXIS_IS_TMC(E7) - TMC_SAY_CURRENT(E7); - #endif + TERN_(X_IS_TRINAMIC, TMC_SAY_CURRENT(X)); + TERN_(X2_IS_TRINAMIC, TMC_SAY_CURRENT(X2)); + TERN_(Y_IS_TRINAMIC, TMC_SAY_CURRENT(Y)); + TERN_(Y2_IS_TRINAMIC, TMC_SAY_CURRENT(Y2)); + TERN_(Z_IS_TRINAMIC, TMC_SAY_CURRENT(Z)); + TERN_(Z2_IS_TRINAMIC, TMC_SAY_CURRENT(Z2)); + TERN_(Z3_IS_TRINAMIC, TMC_SAY_CURRENT(Z3)); + TERN_(Z4_IS_TRINAMIC, TMC_SAY_CURRENT(Z4)); + TERN_(I_IS_TRINAMIC, TMC_SAY_CURRENT(I)); + TERN_(J_IS_TRINAMIC, TMC_SAY_CURRENT(J)); + TERN_(K_IS_TRINAMIC, TMC_SAY_CURRENT(K)); + TERN_(U_IS_TRINAMIC, TMC_SAY_CURRENT(U)); + TERN_(V_IS_TRINAMIC, TMC_SAY_CURRENT(V)); + TERN_(W_IS_TRINAMIC, TMC_SAY_CURRENT(W)); + TERN_(E0_IS_TRINAMIC, TMC_SAY_CURRENT(E0)); + TERN_(E1_IS_TRINAMIC, TMC_SAY_CURRENT(E1)); + TERN_(E2_IS_TRINAMIC, TMC_SAY_CURRENT(E2)); + TERN_(E3_IS_TRINAMIC, TMC_SAY_CURRENT(E3)); + TERN_(E4_IS_TRINAMIC, TMC_SAY_CURRENT(E4)); + TERN_(E5_IS_TRINAMIC, TMC_SAY_CURRENT(E5)); + TERN_(E6_IS_TRINAMIC, TMC_SAY_CURRENT(E6)); + TERN_(E7_IS_TRINAMIC, TMC_SAY_CURRENT(E7)); } } @@ -240,93 +163,67 @@ void GcodeSuite::M906_report(const bool forReplay/*=true*/) { SERIAL_ECHOPGM(" M906"); }; - #if AXIS_IS_TMC(X) || AXIS_IS_TMC(Y) || AXIS_IS_TMC(Z) \ - || AXIS_IS_TMC(I) || AXIS_IS_TMC(J) || AXIS_IS_TMC(K) \ - || AXIS_IS_TMC(U) || AXIS_IS_TMC(V) || AXIS_IS_TMC(W) + #if ANY(X_IS_TRINAMIC, Y_IS_TRINAMIC, Z_IS_TRINAMIC, I_IS_TRINAMIC, J_IS_TRINAMIC, K_IS_TRINAMIC, U_IS_TRINAMIC, V_IS_TRINAMIC, W_IS_TRINAMIC) say_M906(forReplay); - #if AXIS_IS_TMC(X) - SERIAL_ECHOPGM_P(SP_X_STR, stepperX.getMilliamps()); - #endif - #if AXIS_IS_TMC(Y) - SERIAL_ECHOPGM_P(SP_Y_STR, stepperY.getMilliamps()); - #endif - #if AXIS_IS_TMC(Z) - SERIAL_ECHOPGM_P(SP_Z_STR, stepperZ.getMilliamps()); - #endif - #if AXIS_IS_TMC(I) - SERIAL_ECHOPGM_P(SP_I_STR, stepperI.getMilliamps()); - #endif - #if AXIS_IS_TMC(J) - SERIAL_ECHOPGM_P(SP_J_STR, stepperJ.getMilliamps()); - #endif - #if AXIS_IS_TMC(K) - SERIAL_ECHOPGM_P(SP_K_STR, stepperK.getMilliamps()); - #endif - #if AXIS_IS_TMC(U) - SERIAL_ECHOPGM_P(SP_U_STR, stepperU.getMilliamps()); - #endif - #if AXIS_IS_TMC(V) - SERIAL_ECHOPGM_P(SP_V_STR, stepperV.getMilliamps()); - #endif - #if AXIS_IS_TMC(W) - SERIAL_ECHOPGM_P(SP_W_STR, stepperW.getMilliamps()); - #endif + TERN_(X_IS_TRINAMIC, SERIAL_ECHOPGM_P(SP_X_STR, stepperX.getMilliamps())); + TERN_(Y_IS_TRINAMIC, SERIAL_ECHOPGM_P(SP_Y_STR, stepperY.getMilliamps())); + TERN_(Z_IS_TRINAMIC, SERIAL_ECHOPGM_P(SP_Z_STR, stepperZ.getMilliamps())); + TERN_(I_IS_TRINAMIC, SERIAL_ECHOPGM_P(SP_I_STR, stepperI.getMilliamps())); + TERN_(J_IS_TRINAMIC, SERIAL_ECHOPGM_P(SP_J_STR, stepperJ.getMilliamps())); + TERN_(K_IS_TRINAMIC, SERIAL_ECHOPGM_P(SP_K_STR, stepperK.getMilliamps())); + TERN_(U_IS_TRINAMIC, SERIAL_ECHOPGM_P(SP_U_STR, stepperU.getMilliamps())); + TERN_(V_IS_TRINAMIC, SERIAL_ECHOPGM_P(SP_V_STR, stepperV.getMilliamps())); + TERN_(W_IS_TRINAMIC, SERIAL_ECHOPGM_P(SP_W_STR, stepperW.getMilliamps())); SERIAL_EOL(); #endif - #if AXIS_IS_TMC(X2) || AXIS_IS_TMC(Y2) || AXIS_IS_TMC(Z2) + #if X2_IS_TRINAMIC || Y2_IS_TRINAMIC || Z2_IS_TRINAMIC say_M906(forReplay); SERIAL_ECHOPGM(" I1"); - #if AXIS_IS_TMC(X2) - SERIAL_ECHOPGM_P(SP_X_STR, stepperX2.getMilliamps()); - #endif - #if AXIS_IS_TMC(Y2) - SERIAL_ECHOPGM_P(SP_Y_STR, stepperY2.getMilliamps()); - #endif - #if AXIS_IS_TMC(Z2) - SERIAL_ECHOPGM_P(SP_Z_STR, stepperZ2.getMilliamps()); - #endif + TERN_(X2_IS_TRINAMIC, SERIAL_ECHOPGM_P(SP_X_STR, stepperX2.getMilliamps())); + TERN_(Y2_IS_TRINAMIC, SERIAL_ECHOPGM_P(SP_Y_STR, stepperY2.getMilliamps())); + TERN_(Z2_IS_TRINAMIC, SERIAL_ECHOPGM_P(SP_Z_STR, stepperZ2.getMilliamps())); SERIAL_EOL(); #endif - #if AXIS_IS_TMC(Z3) + #if Z3_IS_TRINAMIC say_M906(forReplay); SERIAL_ECHOLNPGM(" I2 Z", stepperZ3.getMilliamps()); #endif - #if AXIS_IS_TMC(Z4) + #if Z4_IS_TRINAMIC say_M906(forReplay); SERIAL_ECHOLNPGM(" I3 Z", stepperZ4.getMilliamps()); #endif - #if AXIS_IS_TMC(E0) + #if E0_IS_TRINAMIC say_M906(forReplay); SERIAL_ECHOLNPGM(" T0 E", stepperE0.getMilliamps()); #endif - #if AXIS_IS_TMC(E1) + #if E1_IS_TRINAMIC say_M906(forReplay); SERIAL_ECHOLNPGM(" T1 E", stepperE1.getMilliamps()); #endif - #if AXIS_IS_TMC(E2) + #if E2_IS_TRINAMIC say_M906(forReplay); SERIAL_ECHOLNPGM(" T2 E", stepperE2.getMilliamps()); #endif - #if AXIS_IS_TMC(E3) + #if E3_IS_TRINAMIC say_M906(forReplay); SERIAL_ECHOLNPGM(" T3 E", stepperE3.getMilliamps()); #endif - #if AXIS_IS_TMC(E4) + #if E4_IS_TRINAMIC say_M906(forReplay); SERIAL_ECHOLNPGM(" T4 E", stepperE4.getMilliamps()); #endif - #if AXIS_IS_TMC(E5) + #if E5_IS_TRINAMIC say_M906(forReplay); SERIAL_ECHOLNPGM(" T5 E", stepperE5.getMilliamps()); #endif - #if AXIS_IS_TMC(E6) + #if E6_IS_TRINAMIC say_M906(forReplay); SERIAL_ECHOLNPGM(" T6 E", stepperE6.getMilliamps()); #endif - #if AXIS_IS_TMC(E7) + #if E7_IS_TRINAMIC say_M906(forReplay); SERIAL_ECHOLNPGM(" T7 E", stepperE7.getMilliamps()); #endif diff --git a/Marlin/src/gcode/feature/trinamic/M911-M914.cpp b/Marlin/src/gcode/feature/trinamic/M911-M914.cpp index ba6d9538a4..f4b0ac3670 100644 --- a/Marlin/src/gcode/feature/trinamic/M911-M914.cpp +++ b/Marlin/src/gcode/feature/trinamic/M911-M914.cpp @@ -274,7 +274,23 @@ } /** - * M913: Set HYBRID_THRESHOLD speed. + * M913: Set HYBRID_THRESHOLD speed, aka PWM Threshold. + * + * Parameters: + * I - For multi-stepper axes, the one-based index of the stepper to modify in each set + * + * E - Set threshold for one or more Extruders + * T - The zero-based index of the Extruder to modify + * + * X - Set threshold for one or more X axis steppers + * Y - Set threshold for one or more Y axis steppers + * Z - Set threshold for one or more Z axis steppers + * A - Set threshold for one or more A axis steppers + * B - Set threshold for one or more B axis steppers + * C - Set threshold for one or more C axis steppers + * U - Set threshold for one or more U axis steppers + * V - Set threshold for one or more V axis steppers + * W - Set threshold for one or more W axis steppers */ void GcodeSuite::M913() { #define TMC_SAY_PWMTHRS(A,Q) tmc_print_pwmthrs(stepper##Q) @@ -283,9 +299,9 @@ #define TMC_SET_PWMTHRS_E(E) stepperE##E.set_pwm_thrs(value) bool report = true; - #if AXIS_IS_TMC(X2) || AXIS_IS_TMC(Y2) || AXIS_IS_TMC(Z2) || AXIS_IS_TMC(Z3) || AXIS_IS_TMC(Z4) + #if ANY(X2_IS_TRINAMIC, Y2_IS_TRINAMIC, Z2_IS_TRINAMIC, Z3_IS_TRINAMIC, Z4_IS_TRINAMIC) const uint8_t index = parser.byteval('I'); - #elif AXIS_IS_TMC(X) || AXIS_IS_TMC(Y) || AXIS_IS_TMC(Z) + #elif ANY(X_IS_TRINAMIC, Y_IS_TRINAMIC, Z_IS_TRINAMIC) constexpr uint8_t index = 0; #endif LOOP_LOGICAL_AXES(i) if (int32_t value = parser.longval(AXIS_CHAR(i))) { @@ -387,70 +403,37 @@ SERIAL_ECHOPGM(" M913"); }; - #if X_HAS_STEALTHCHOP || Y_HAS_STEALTHCHOP || Z_HAS_STEALTHCHOP + #if ANY(X_HAS_STEALTHCHOP, Y_HAS_STEALTHCHOP, Z_HAS_STEALTHCHOP, I_HAS_STEALTHCHOP, J_HAS_STEALTHCHOP, K_HAS_STEALTHCHOP, U_HAS_STEALTHCHOP, V_HAS_STEALTHCHOP, W_HAS_STEALTHCHOP) say_M913(forReplay); - #if X_HAS_STEALTHCHOP - SERIAL_ECHOPGM_P(SP_X_STR, stepperX.get_pwm_thrs()); - #endif - #if Y_HAS_STEALTHCHOP - SERIAL_ECHOPGM_P(SP_Y_STR, stepperY.get_pwm_thrs()); - #endif - #if Z_HAS_STEALTHCHOP - SERIAL_ECHOPGM_P(SP_Z_STR, stepperZ.get_pwm_thrs()); - #endif + TERN_(X_HAS_STEALTHCHOP, SERIAL_ECHOPGM_P(SP_X_STR, stepperX.get_pwm_thrs())); + TERN_(Y_HAS_STEALTHCHOP, SERIAL_ECHOPGM_P(SP_Y_STR, stepperY.get_pwm_thrs())); + TERN_(Z_HAS_STEALTHCHOP, SERIAL_ECHOPGM_P(SP_Z_STR, stepperZ.get_pwm_thrs())); + TERN_(I_HAS_STEALTHCHOP, SERIAL_ECHOPGM_P(SP_I_STR, stepperI.get_pwm_thrs())); + TERN_(J_HAS_STEALTHCHOP, SERIAL_ECHOPGM_P(SP_J_STR, stepperJ.get_pwm_thrs())); + TERN_(K_HAS_STEALTHCHOP, SERIAL_ECHOPGM_P(SP_K_STR, stepperK.get_pwm_thrs())); + TERN_(U_HAS_STEALTHCHOP, SERIAL_ECHOPGM_P(SP_U_STR, stepperU.get_pwm_thrs())); + TERN_(V_HAS_STEALTHCHOP, SERIAL_ECHOPGM_P(SP_V_STR, stepperV.get_pwm_thrs())); + TERN_(W_HAS_STEALTHCHOP, SERIAL_ECHOPGM_P(SP_W_STR, stepperW.get_pwm_thrs())); SERIAL_EOL(); #endif #if X2_HAS_STEALTHCHOP || Y2_HAS_STEALTHCHOP || Z2_HAS_STEALTHCHOP say_M913(forReplay); SERIAL_ECHOPGM(" I2"); - #if X2_HAS_STEALTHCHOP - SERIAL_ECHOPGM_P(SP_X_STR, stepperX2.get_pwm_thrs()); - #endif - #if Y2_HAS_STEALTHCHOP - SERIAL_ECHOPGM_P(SP_Y_STR, stepperY2.get_pwm_thrs()); - #endif - #if Z2_HAS_STEALTHCHOP - SERIAL_ECHOPGM_P(SP_Z_STR, stepperZ2.get_pwm_thrs()); - #endif + TERN_(X2_HAS_STEALTHCHOP, SERIAL_ECHOPGM_P(SP_X_STR, stepperX2.get_pwm_thrs())); + TERN_(Y2_HAS_STEALTHCHOP, SERIAL_ECHOPGM_P(SP_Y_STR, stepperY2.get_pwm_thrs())); + TERN_(Z2_HAS_STEALTHCHOP, SERIAL_ECHOPGM_P(SP_Z_STR, stepperZ2.get_pwm_thrs())); SERIAL_EOL(); #endif - #if Z3_HAS_STEALTHCHOP say_M913(forReplay); SERIAL_ECHOLNPGM(" I3 Z", stepperZ3.get_pwm_thrs()); #endif - #if Z4_HAS_STEALTHCHOP say_M913(forReplay); SERIAL_ECHOLNPGM(" I4 Z", stepperZ4.get_pwm_thrs()); #endif - #if I_HAS_STEALTHCHOP - say_M913(forReplay); - SERIAL_ECHOLNPGM_P(SP_I_STR, stepperI.get_pwm_thrs()); - #endif - #if J_HAS_STEALTHCHOP - say_M913(forReplay); - SERIAL_ECHOLNPGM_P(SP_J_STR, stepperJ.get_pwm_thrs()); - #endif - #if K_HAS_STEALTHCHOP - say_M913(forReplay); - SERIAL_ECHOLNPGM_P(SP_K_STR, stepperK.get_pwm_thrs()); - #endif - #if U_HAS_STEALTHCHOP - say_M913(forReplay); - SERIAL_ECHOLNPGM_P(SP_U_STR, stepperU.get_pwm_thrs()); - #endif - #if V_HAS_STEALTHCHOP - say_M913(forReplay); - SERIAL_ECHOLNPGM_P(SP_V_STR, stepperV.get_pwm_thrs()); - #endif - #if W_HAS_STEALTHCHOP - say_M913(forReplay); - SERIAL_ECHOLNPGM_P(SP_W_STR, stepperW.get_pwm_thrs()); - #endif - #if E0_HAS_STEALTHCHOP say_M913(forReplay); SERIAL_ECHOLNPGM(" T0 E", stepperE0.get_pwm_thrs()); @@ -498,7 +481,19 @@ } /** - * M914: Set StallGuard sensitivity. + * M914: Set StallGuard sensitivity in terms of "homing threshold" (not for stall detection during printing). + * + * Parameters: + * I - For multi-stepper axes, the one-based index of the stepper to modify in each set + * X - Set threshold for one or more X axis steppers + * Y - Set threshold for one or more Y axis steppers + * Z - Set threshold for one or more Z axis steppers + * A - Set threshold for one or more A axis steppers + * B - Set threshold for one or more B axis steppers + * C - Set threshold for one or more C axis steppers + * U - Set threshold for one or more U axis steppers + * V - Set threshold for one or more V axis steppers + * W - Set threshold for one or more W axis steppers */ void GcodeSuite::M914() { bool report = true; @@ -536,33 +531,33 @@ #if K_SENSORLESS case K_AXIS: stepperK.homing_threshold(value); break; #endif - #if U_SENSORLESS && AXIS_HAS_STALLGUARD(U) + #if U_SENSORLESS case U_AXIS: stepperU.homing_threshold(value); break; #endif - #if V_SENSORLESS && AXIS_HAS_STALLGUARD(V) + #if V_SENSORLESS case V_AXIS: stepperV.homing_threshold(value); break; #endif - #if W_SENSORLESS && AXIS_HAS_STALLGUARD(W) + #if W_SENSORLESS case W_AXIS: stepperW.homing_threshold(value); break; #endif } } if (report) { - TERN_(X_SENSORLESS, tmc_print_sgt(stepperX)); + TERN_( X_SENSORLESS, tmc_print_sgt(stepperX)); TERN_(X2_SENSORLESS, tmc_print_sgt(stepperX2)); - TERN_(Y_SENSORLESS, tmc_print_sgt(stepperY)); + TERN_( Y_SENSORLESS, tmc_print_sgt(stepperY)); TERN_(Y2_SENSORLESS, tmc_print_sgt(stepperY2)); - TERN_(Z_SENSORLESS, tmc_print_sgt(stepperZ)); + TERN_( Z_SENSORLESS, tmc_print_sgt(stepperZ)); TERN_(Z2_SENSORLESS, tmc_print_sgt(stepperZ2)); TERN_(Z3_SENSORLESS, tmc_print_sgt(stepperZ3)); TERN_(Z4_SENSORLESS, tmc_print_sgt(stepperZ4)); - TERN_(I_SENSORLESS, tmc_print_sgt(stepperI)); - TERN_(J_SENSORLESS, tmc_print_sgt(stepperJ)); - TERN_(K_SENSORLESS, tmc_print_sgt(stepperK)); - TERN_(U_SENSORLESS, tmc_print_sgt(stepperU)); - TERN_(V_SENSORLESS, tmc_print_sgt(stepperV)); - TERN_(W_SENSORLESS, tmc_print_sgt(stepperW)); + TERN_( I_SENSORLESS, tmc_print_sgt(stepperI)); + TERN_( J_SENSORLESS, tmc_print_sgt(stepperJ)); + TERN_( K_SENSORLESS, tmc_print_sgt(stepperK)); + TERN_( U_SENSORLESS, tmc_print_sgt(stepperU)); + TERN_( V_SENSORLESS, tmc_print_sgt(stepperV)); + TERN_( W_SENSORLESS, tmc_print_sgt(stepperW)); } } @@ -578,67 +573,34 @@ #if X_SENSORLESS || Y_SENSORLESS || Z_SENSORLESS say_M914(forReplay); - #if X_SENSORLESS - SERIAL_ECHOPGM_P(SP_X_STR, stepperX.homing_threshold()); - #endif - #if Y_SENSORLESS - SERIAL_ECHOPGM_P(SP_Y_STR, stepperY.homing_threshold()); - #endif - #if Z_SENSORLESS - SERIAL_ECHOPGM_P(SP_Z_STR, stepperZ.homing_threshold()); - #endif + TERN_(X_SENSORLESS, SERIAL_ECHOPGM_P(SP_X_STR, stepperX.homing_threshold())); + TERN_(Y_SENSORLESS, SERIAL_ECHOPGM_P(SP_Y_STR, stepperY.homing_threshold())); + TERN_(Z_SENSORLESS, SERIAL_ECHOPGM_P(SP_Z_STR, stepperZ.homing_threshold())); + TERN_(I_SENSORLESS, SERIAL_ECHOPGM_P(SP_I_STR, stepperI.homing_threshold())); + TERN_(J_SENSORLESS, SERIAL_ECHOPGM_P(SP_J_STR, stepperJ.homing_threshold())); + TERN_(K_SENSORLESS, SERIAL_ECHOPGM_P(SP_K_STR, stepperK.homing_threshold())); + TERN_(U_SENSORLESS, SERIAL_ECHOPGM_P(SP_U_STR, stepperU.homing_threshold())); + TERN_(V_SENSORLESS, SERIAL_ECHOPGM_P(SP_V_STR, stepperV.homing_threshold())); + TERN_(W_SENSORLESS, SERIAL_ECHOPGM_P(SP_W_STR, stepperW.homing_threshold())); SERIAL_EOL(); #endif #if X2_SENSORLESS || Y2_SENSORLESS || Z2_SENSORLESS say_M914(forReplay); SERIAL_ECHOPGM(" I2"); - #if X2_SENSORLESS - SERIAL_ECHOPGM_P(SP_X_STR, stepperX2.homing_threshold()); - #endif - #if Y2_SENSORLESS - SERIAL_ECHOPGM_P(SP_Y_STR, stepperY2.homing_threshold()); - #endif - #if Z2_SENSORLESS - SERIAL_ECHOPGM_P(SP_Z_STR, stepperZ2.homing_threshold()); - #endif + TERN_(X2_SENSORLESS, SERIAL_ECHOPGM_P(SP_X_STR, stepperX2.homing_threshold())); + TERN_(Y2_SENSORLESS, SERIAL_ECHOPGM_P(SP_Y_STR, stepperY2.homing_threshold())); + TERN_(Z2_SENSORLESS, SERIAL_ECHOPGM_P(SP_Z_STR, stepperZ2.homing_threshold())); SERIAL_EOL(); #endif - #if Z3_SENSORLESS say_M914(forReplay); SERIAL_ECHOLNPGM(" I3 Z", stepperZ3.homing_threshold()); #endif - #if Z4_SENSORLESS say_M914(forReplay); SERIAL_ECHOLNPGM(" I4 Z", stepperZ4.homing_threshold()); #endif - - #if I_SENSORLESS - say_M914(forReplay); - SERIAL_ECHOLNPGM_P(SP_I_STR, stepperI.homing_threshold()); - #endif - #if J_SENSORLESS - say_M914(forReplay); - SERIAL_ECHOLNPGM_P(SP_J_STR, stepperJ.homing_threshold()); - #endif - #if K_SENSORLESS - say_M914(forReplay); - SERIAL_ECHOLNPGM_P(SP_K_STR, stepperK.homing_threshold()); - #endif - #if U_SENSORLESS - say_M914(forReplay); - SERIAL_ECHOLNPGM_P(SP_U_STR, stepperU.homing_threshold()); - #endif - #if V_SENSORLESS - say_M914(forReplay); - SERIAL_ECHOLNPGM_P(SP_V_STR, stepperV.homing_threshold()); - #endif - #if W_SENSORLESS - say_M914(forReplay); - SERIAL_ECHOLNPGM_P(SP_W_STR, stepperW.homing_threshold()); - #endif } #endif // USE_SENSORLESS diff --git a/Marlin/src/gcode/feature/trinamic/M919.cpp b/Marlin/src/gcode/feature/trinamic/M919.cpp index 98227c7125..cabb30d7ff 100644 --- a/Marlin/src/gcode/feature/trinamic/M919.cpp +++ b/Marlin/src/gcode/feature/trinamic/M919.cpp @@ -91,9 +91,9 @@ void GcodeSuite::M919() { if (err) return; - #if AXIS_IS_TMC(X2) || AXIS_IS_TMC(Y2) || AXIS_IS_TMC(Z2) || AXIS_IS_TMC(Z3) || AXIS_IS_TMC(Z4) + #if ANY(X2_IS_TRINAMIC, Y2_IS_TRINAMIC, Z2_IS_TRINAMIC, Z3_IS_TRINAMIC, Z4_IS_TRINAMIC) const int8_t index = parser.byteval('I'); - #elif AXIS_IS_TMC(X) || AXIS_IS_TMC(Y) || AXIS_IS_TMC(Z) + #elif ANY(X_IS_TRINAMIC, Y_IS_TRINAMIC, Z_IS_TRINAMIC) constexpr int8_t index = -1; #endif @@ -107,7 +107,7 @@ void GcodeSuite::M919() { #define TMC_SET_CHOPPER_TIME(Q) stepper##Q.set_chopper_times(make_chopper_timing(CHOPPER_TIMING_##Q, toff, hend, hstrt)) - #if AXIS_IS_TMC(E0) || AXIS_IS_TMC(E1) || AXIS_IS_TMC(E2) || AXIS_IS_TMC(E3) || AXIS_IS_TMC(E4) || AXIS_IS_TMC(E5) || AXIS_IS_TMC(E6) || AXIS_IS_TMC(E7) + #if ANY(E0_IS_TRINAMIC, E1_IS_TRINAMIC, E2_IS_TRINAMIC, E3_IS_TRINAMIC, E4_IS_TRINAMIC, E5_IS_TRINAMIC, E6_IS_TRINAMIC, E7_IS_TRINAMIC) #define HAS_E_CHOPPER 1 int8_t eindex = -1; #endif @@ -121,163 +121,66 @@ void GcodeSuite::M919() { SERIAL_ECHOLNPGM(GCODE_ERR_MSG("Axis ", C(AXIS_CHAR(i)), " has no TMC drivers.")); break; - #if AXIS_IS_TMC(X) || AXIS_IS_TMC(X2) + #if X_IS_TRINAMIC || X2_IS_TRINAMIC case X_AXIS: - #if AXIS_IS_TMC(X) - if (index <= 0) TMC_SET_CHOPPER_TIME(X); - #endif - #if AXIS_IS_TMC(X2) - if (index < 0 || index == 1) TMC_SET_CHOPPER_TIME(X2); - #endif + TERN_(X_IS_TRINAMIC, if (index <= 0) TMC_SET_CHOPPER_TIME(X)); + TERN_(X2_IS_TRINAMIC, if (index < 0 || index == 1) TMC_SET_CHOPPER_TIME(X2)); break; #endif - #if AXIS_IS_TMC(Y) || AXIS_IS_TMC(Y2) + #if Y_IS_TRINAMIC || Y2_IS_TRINAMIC case Y_AXIS: - #if AXIS_IS_TMC(Y) - if (index <= 0) TMC_SET_CHOPPER_TIME(Y); - #endif - #if AXIS_IS_TMC(Y2) - if (index < 0 || index == 1) TMC_SET_CHOPPER_TIME(Y2); - #endif + TERN_(Y_IS_TRINAMIC, if (index <= 0) TMC_SET_CHOPPER_TIME(Y)); + TERN_(Y2_IS_TRINAMIC, if (index < 0 || index == 1) TMC_SET_CHOPPER_TIME(Y2)); break; #endif - #if AXIS_IS_TMC(Z) || AXIS_IS_TMC(Z2) || AXIS_IS_TMC(Z3) || AXIS_IS_TMC(Z4) + #if ANY(Z_IS_TRINAMIC, Z2_IS_TRINAMIC, Z3_IS_TRINAMIC, Z4_IS_TRINAMIC) case Z_AXIS: - #if AXIS_IS_TMC(Z) - if (index <= 0) TMC_SET_CHOPPER_TIME(Z); - #endif - #if AXIS_IS_TMC(Z2) - if (index < 0 || index == 1) TMC_SET_CHOPPER_TIME(Z2); - #endif - #if AXIS_IS_TMC(Z3) - if (index < 0 || index == 2) TMC_SET_CHOPPER_TIME(Z3); - #endif - #if AXIS_IS_TMC(Z4) - if (index < 0 || index == 3) TMC_SET_CHOPPER_TIME(Z4); - #endif + TERN_(Z_IS_TRINAMIC, if (index <= 0) TMC_SET_CHOPPER_TIME(Z)); + TERN_(Z2_IS_TRINAMIC, if (index < 0 || index == 1) TMC_SET_CHOPPER_TIME(Z2)); + TERN_(Z3_IS_TRINAMIC, if (index < 0 || index == 2) TMC_SET_CHOPPER_TIME(Z3)); + TERN_(Z4_IS_TRINAMIC, if (index < 0 || index == 3) TMC_SET_CHOPPER_TIME(Z4)); break; #endif - #if AXIS_IS_TMC(I) + #if I_IS_TRINAMIC case I_AXIS: TMC_SET_CHOPPER_TIME(I); break; #endif - #if AXIS_IS_TMC(J) + #if J_IS_TRINAMIC case J_AXIS: TMC_SET_CHOPPER_TIME(J); break; #endif - #if AXIS_IS_TMC(K) + #if K_IS_TRINAMIC case K_AXIS: TMC_SET_CHOPPER_TIME(K); break; #endif - #if AXIS_IS_TMC(U) + #if U_IS_TRINAMIC case U_AXIS: TMC_SET_CHOPPER_TIME(U); break; #endif - #if AXIS_IS_TMC(V) + #if V_IS_TRINAMIC case V_AXIS: TMC_SET_CHOPPER_TIME(V); break; #endif - #if AXIS_IS_TMC(W) + #if W_IS_TRINAMIC case W_AXIS: TMC_SET_CHOPPER_TIME(W); break; #endif #if HAS_E_CHOPPER case E_AXIS: { - #if AXIS_IS_TMC(E0) - if (eindex <= 0) TMC_SET_CHOPPER_TIME(E0); - #endif - #if AXIS_IS_TMC(E1) - if (eindex < 0 || eindex == 1) TMC_SET_CHOPPER_TIME(E1); - #endif - #if AXIS_IS_TMC(E2) - if (eindex < 0 || eindex == 2) TMC_SET_CHOPPER_TIME(E2); - #endif - #if AXIS_IS_TMC(E3) - if (eindex < 0 || eindex == 3) TMC_SET_CHOPPER_TIME(E3); - #endif - #if AXIS_IS_TMC(E4) - if (eindex < 0 || eindex == 4) TMC_SET_CHOPPER_TIME(E4); - #endif - #if AXIS_IS_TMC(E5) - if (eindex < 0 || eindex == 5) TMC_SET_CHOPPER_TIME(E5); - #endif - #if AXIS_IS_TMC(E6) - if (eindex < 0 || eindex == 6) TMC_SET_CHOPPER_TIME(E6); - #endif - #if AXIS_IS_TMC(E7) - if (eindex < 0 || eindex == 7) TMC_SET_CHOPPER_TIME(E7); - #endif + TERN_(E0_IS_TRINAMIC, if (eindex <= 0) TMC_SET_CHOPPER_TIME(E0)); + TERN_(E1_IS_TRINAMIC, if (eindex < 0 || eindex == 1) TMC_SET_CHOPPER_TIME(E1)); + TERN_(E2_IS_TRINAMIC, if (eindex < 0 || eindex == 2) TMC_SET_CHOPPER_TIME(E2)); + TERN_(E3_IS_TRINAMIC, if (eindex < 0 || eindex == 3) TMC_SET_CHOPPER_TIME(E3)); + TERN_(E4_IS_TRINAMIC, if (eindex < 0 || eindex == 4) TMC_SET_CHOPPER_TIME(E4)); + TERN_(E5_IS_TRINAMIC, if (eindex < 0 || eindex == 5) TMC_SET_CHOPPER_TIME(E5)); + TERN_(E6_IS_TRINAMIC, if (eindex < 0 || eindex == 6) TMC_SET_CHOPPER_TIME(E6)); + TERN_(E7_IS_TRINAMIC, if (eindex < 0 || eindex == 7) TMC_SET_CHOPPER_TIME(E7)); } break; #endif } } if (report) { - #define TMC_SAY_CHOPPER_TIME(Q) tmc_print_chopper_time(stepper##Q) - #if AXIS_IS_TMC(X) - TMC_SAY_CHOPPER_TIME(X); - #endif - #if AXIS_IS_TMC(X2) - TMC_SAY_CHOPPER_TIME(X2); - #endif - #if AXIS_IS_TMC(Y) - TMC_SAY_CHOPPER_TIME(Y); - #endif - #if AXIS_IS_TMC(Y2) - TMC_SAY_CHOPPER_TIME(Y2); - #endif - #if AXIS_IS_TMC(Z) - TMC_SAY_CHOPPER_TIME(Z); - #endif - #if AXIS_IS_TMC(Z2) - TMC_SAY_CHOPPER_TIME(Z2); - #endif - #if AXIS_IS_TMC(Z3) - TMC_SAY_CHOPPER_TIME(Z3); - #endif - #if AXIS_IS_TMC(Z4) - TMC_SAY_CHOPPER_TIME(Z4); - #endif - #if AXIS_IS_TMC(I) - TMC_SAY_CHOPPER_TIME(I); - #endif - #if AXIS_IS_TMC(J) - TMC_SAY_CHOPPER_TIME(J); - #endif - #if AXIS_IS_TMC(K) - TMC_SAY_CHOPPER_TIME(K); - #endif - #if AXIS_IS_TMC(U) - TMC_SAY_CHOPPER_TIME(U); - #endif - #if AXIS_IS_TMC(V) - TMC_SAY_CHOPPER_TIME(V); - #endif - #if AXIS_IS_TMC(W) - TMC_SAY_CHOPPER_TIME(W); - #endif - #if AXIS_IS_TMC(E0) - TMC_SAY_CHOPPER_TIME(E0); - #endif - #if AXIS_IS_TMC(E1) - TMC_SAY_CHOPPER_TIME(E1); - #endif - #if AXIS_IS_TMC(E2) - TMC_SAY_CHOPPER_TIME(E2); - #endif - #if AXIS_IS_TMC(E3) - TMC_SAY_CHOPPER_TIME(E3); - #endif - #if AXIS_IS_TMC(E4) - TMC_SAY_CHOPPER_TIME(E4); - #endif - #if AXIS_IS_TMC(E5) - TMC_SAY_CHOPPER_TIME(E5); - #endif - #if AXIS_IS_TMC(E6) - TMC_SAY_CHOPPER_TIME(E6); - #endif - #if AXIS_IS_TMC(E7) - TMC_SAY_CHOPPER_TIME(E7); - #endif + #define TMC_SAY_CHOPPER_TIME(Q) OPTCODE(Q##_IS_TRINAMIC, tmc_print_chopper_time(stepper##Q)) + MAP(TMC_SAY_CHOPPER_TIME, ALL_AXIS_NAMES) } } diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index 69d77e875e..64326b32af 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -139,6 +139,7 @@ int8_t GcodeSuite::get_target_extruder_from_command() { * Get the target E stepper from the 'T' parameter. * If there is no 'T' parameter then dval will be substituted. * Returns -1 if the resulting E stepper index is out of range. + * Use a default of -2 for silent failure. */ int8_t GcodeSuite::get_target_e_stepper_from_command(const int8_t dval/*=-1*/) { const int8_t e = parser.intval('T', dval); diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h index 1f3ccba37c..7ba1c58d2a 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 at least one _DRIVER_TYPE defined as TMC2130/2160/5130/5160/2208/2209/2660) + * M122 - Debug stepper (Requires *_DRIVER_TYPE TMC(2130|2160|5130|5160|2208|2209|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 at least one _DRIVER_TYPE to be TMC2130/2160/2208/2209/5130/5160) + * M569 - Enable stealthChop on an axis. (Requires *_DRIVER_TYPE TMC(2130|2160|2208|2209|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]) @@ -308,17 +308,18 @@ * * 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 - Get or Set Linear Advance K-factor. (Requires LIN_ADVANCE) - * M906 - Set or get motor current in milliamps using axis codes XYZE, etc. Report values if no axis codes given. (Requires at least one _DRIVER_TYPE defined as TMC2130/2160/5130/5160/2208/2209/2660) + * 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)) * 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 at least one _DRIVER_TYPE defined as TMC2130/2160/5130/5160/2208/2209/2660) - * M912 - Clear stepper driver overtemperature pre-warn condition flag. (Requires at least one _DRIVER_TYPE defined as TMC2130/2160/5130/5160/2208/2209/2660) + * 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)) * M913 - Set HYBRID_THRESHOLD speed. (Requires HYBRID_THRESHOLD) * M914 - Set StallGuard sensitivity. (Requires SENSORLESS_HOMING or SENSORLESS_PROBING) - * M919 - Get or Set motor Chopper Times (time_off, hysteresis_end, hysteresis_start) using axis codes XYZE, etc. If no parameters are given, report. (Requires at least one _DRIVER_TYPE defined as TMC2130/2160/5130/5160/2208/2209/2660) + * 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)) * M936 - OTA update firmware. (Requires OTA_FIRMWARE_UPDATE) * M951 - Set Magnetic Parking Extruder parameters. (Requires MAGNETIC_PARKING_EXTRUDER) * M3426 - Read MCP3426 ADC over I2C. (Requires HAS_MCP3426_ADC) diff --git a/Marlin/src/inc/Conditionals-4-adv.h b/Marlin/src/inc/Conditionals-4-adv.h index b697f22a20..eaa8aca5b0 100644 --- a/Marlin/src/inc/Conditionals-4-adv.h +++ b/Marlin/src/inc/Conditionals-4-adv.h @@ -1307,8 +1307,75 @@ #endif #endif +#if AXIS_IS_TMC(X) + #define X_IS_TRINAMIC 1 +#endif +#if AXIS_IS_TMC(Y) + #define Y_IS_TRINAMIC 1 +#endif +#if AXIS_IS_TMC(Z) + #define Z_IS_TRINAMIC 1 +#endif +#if AXIS_IS_TMC(I) + #define I_IS_TRINAMIC 1 +#endif +#if AXIS_IS_TMC(J) + #define J_IS_TRINAMIC 1 +#endif +#if AXIS_IS_TMC(K) + #define K_IS_TRINAMIC 1 +#endif +#if AXIS_IS_TMC(U) + #define U_IS_TRINAMIC 1 +#endif +#if AXIS_IS_TMC(V) + #define V_IS_TRINAMIC 1 +#endif +#if AXIS_IS_TMC(W) + #define W_IS_TRINAMIC 1 +#endif +#if AXIS_IS_TMC(X2) + #define X2_IS_TRINAMIC 1 +#endif +#if AXIS_IS_TMC(Y2) + #define Y2_IS_TRINAMIC 1 +#endif +#if AXIS_IS_TMC(Z2) + #define Z2_IS_TRINAMIC 1 +#endif +#if AXIS_IS_TMC(Z3) + #define Z3_IS_TRINAMIC 1 +#endif +#if AXIS_IS_TMC(Z4) + #define Z4_IS_TRINAMIC 1 +#endif +#if AXIS_IS_TMC(E0) + #define E0_IS_TRINAMIC 1 +#endif +#if AXIS_IS_TMC(E1) + #define E1_IS_TRINAMIC 1 +#endif +#if AXIS_IS_TMC(E2) + #define E2_IS_TRINAMIC 1 +#endif +#if AXIS_IS_TMC(E3) + #define E3_IS_TRINAMIC 1 +#endif +#if AXIS_IS_TMC(E4) + #define E4_IS_TRINAMIC 1 +#endif +#if AXIS_IS_TMC(E5) + #define E5_IS_TRINAMIC 1 +#endif +#if AXIS_IS_TMC(E6) + #define E6_IS_TRINAMIC 1 +#endif +#if AXIS_IS_TMC(E7) + #define E7_IS_TRINAMIC 1 +#endif + // Test for edge stepping on any axis -#define AXIS_HAS_DEDGE(A) (ENABLED(EDGE_STEPPING) && AXIS_IS_TMC(A)) +#define AXIS_HAS_DEDGE(A) ALL(EDGE_STEPPING, A##_IS_TRINAMIC) #if ENABLED(DIRECT_STEPPING) #ifndef STEPPER_PAGES diff --git a/Marlin/src/inc/Conditionals-5-post.h b/Marlin/src/inc/Conditionals-5-post.h index d07a5914cd..93be95c95d 100644 --- a/Marlin/src/inc/Conditionals-5-post.h +++ b/Marlin/src/inc/Conditionals-5-post.h @@ -1052,7 +1052,7 @@ // Steppers #if HAS_X_AXIS - #if PIN_EXISTS(X_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(X)) + #if PIN_EXISTS(X_ENABLE) || ALL(SOFTWARE_DRIVER_ENABLE, X_IS_TRINAMIC) #define HAS_X_ENABLE 1 #endif #if PIN_EXISTS(X_DIR) @@ -1065,7 +1065,7 @@ #define HAS_X_MS_PINS 1 #endif - #if PIN_EXISTS(X2_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(X2)) + #if PIN_EXISTS(X2_ENABLE) || ALL(SOFTWARE_DRIVER_ENABLE, X2_IS_TRINAMIC) #define HAS_X2_ENABLE 1 #endif #if PIN_EXISTS(X2_DIR) @@ -1084,7 +1084,7 @@ */ #if HAS_Y_AXIS - #if PIN_EXISTS(Y_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(Y)) + #if PIN_EXISTS(Y_ENABLE) || ALL(SOFTWARE_DRIVER_ENABLE, Y_IS_TRINAMIC) #define HAS_Y_ENABLE 1 #endif #if PIN_EXISTS(Y_DIR) @@ -1098,7 +1098,7 @@ #endif #if HAS_Y2_STEPPER - #if PIN_EXISTS(Y2_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(Y2)) + #if PIN_EXISTS(Y2_ENABLE) || ALL(SOFTWARE_DRIVER_ENABLE, Y2_IS_TRINAMIC) #define HAS_Y2_ENABLE 1 #endif #if PIN_EXISTS(Y2_DIR) @@ -1114,7 +1114,7 @@ #endif #if HAS_Z_AXIS - #if PIN_EXISTS(Z_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(Z)) + #if PIN_EXISTS(Z_ENABLE) || ALL(SOFTWARE_DRIVER_ENABLE, Z_IS_TRINAMIC) #define HAS_Z_ENABLE 1 #endif #if PIN_EXISTS(Z_DIR) @@ -1129,7 +1129,7 @@ #endif #if NUM_Z_STEPPERS >= 2 - #if PIN_EXISTS(Z2_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(Z2)) + #if PIN_EXISTS(Z2_ENABLE) || ALL(SOFTWARE_DRIVER_ENABLE, Z2_IS_TRINAMIC) #define HAS_Z2_ENABLE 1 #endif #if PIN_EXISTS(Z2_DIR) @@ -1144,7 +1144,7 @@ #endif #if NUM_Z_STEPPERS >= 3 - #if PIN_EXISTS(Z3_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(Z3)) + #if PIN_EXISTS(Z3_ENABLE) || ALL(SOFTWARE_DRIVER_ENABLE, Z3_IS_TRINAMIC) #define HAS_Z3_ENABLE 1 #endif #if PIN_EXISTS(Z3_DIR) @@ -1159,7 +1159,7 @@ #endif #if NUM_Z_STEPPERS >= 4 - #if PIN_EXISTS(Z4_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(Z4)) + #if PIN_EXISTS(Z4_ENABLE) || ALL(SOFTWARE_DRIVER_ENABLE, Z4_IS_TRINAMIC) #define HAS_Z4_ENABLE 1 #endif #if PIN_EXISTS(Z4_DIR) @@ -1174,7 +1174,7 @@ #endif #if HAS_I_AXIS - #if PIN_EXISTS(I_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(I)) + #if PIN_EXISTS(I_ENABLE) || ALL(SOFTWARE_DRIVER_ENABLE, I_IS_TRINAMIC) #define HAS_I_ENABLE 1 #endif #if PIN_EXISTS(I_DIR) @@ -1189,7 +1189,7 @@ #endif #if HAS_J_AXIS - #if PIN_EXISTS(J_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(J)) + #if PIN_EXISTS(J_ENABLE) || ALL(SOFTWARE_DRIVER_ENABLE, J_IS_TRINAMIC) #define HAS_J_ENABLE 1 #endif #if PIN_EXISTS(J_DIR) @@ -1204,7 +1204,7 @@ #endif #if HAS_K_AXIS - #if PIN_EXISTS(K_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(K)) + #if PIN_EXISTS(K_ENABLE) || ALL(SOFTWARE_DRIVER_ENABLE, K_IS_TRINAMIC) #define HAS_K_ENABLE 1 #endif #if PIN_EXISTS(K_DIR) @@ -1219,7 +1219,7 @@ #endif #if HAS_U_AXIS - #if PIN_EXISTS(U_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(U)) + #if PIN_EXISTS(U_ENABLE) || ALL(SOFTWARE_DRIVER_ENABLE, U_IS_TRINAMIC) #define HAS_U_ENABLE 1 #endif #if PIN_EXISTS(U_DIR) @@ -1234,7 +1234,7 @@ #endif #if HAS_V_AXIS - #if PIN_EXISTS(V_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(V)) + #if PIN_EXISTS(V_ENABLE) || ALL(SOFTWARE_DRIVER_ENABLE, V_IS_TRINAMIC) #define HAS_V_ENABLE 1 #endif #if PIN_EXISTS(V_DIR) @@ -1249,7 +1249,7 @@ #endif #if HAS_W_AXIS - #if PIN_EXISTS(W_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(W)) + #if PIN_EXISTS(W_ENABLE) || ALL(SOFTWARE_DRIVER_ENABLE, W_IS_TRINAMIC) #define HAS_W_ENABLE 1 #endif #if PIN_EXISTS(W_DIR) @@ -1266,7 +1266,7 @@ // Extruder steppers and solenoids #if HAS_EXTRUDERS - #if PIN_EXISTS(E0_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E0)) + #if PIN_EXISTS(E0_ENABLE) || ALL(SOFTWARE_DRIVER_ENABLE, E0_IS_TRINAMIC) #define HAS_E0_ENABLE 1 #endif #if PIN_EXISTS(E0_DIR) @@ -1280,7 +1280,7 @@ #endif #if E_STEPPERS > 1 || ENABLED(E_DUAL_STEPPER_DRIVERS) - #if PIN_EXISTS(E1_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E1)) + #if PIN_EXISTS(E1_ENABLE) || ALL(SOFTWARE_DRIVER_ENABLE, E1_IS_TRINAMIC) #define HAS_E1_ENABLE 1 #endif #if PIN_EXISTS(E1_DIR) @@ -1295,7 +1295,7 @@ #endif #if E_STEPPERS > 2 - #if PIN_EXISTS(E2_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E2)) + #if PIN_EXISTS(E2_ENABLE) || ALL(SOFTWARE_DRIVER_ENABLE, E2_IS_TRINAMIC) #define HAS_E2_ENABLE 1 #endif #if PIN_EXISTS(E2_DIR) @@ -1310,7 +1310,7 @@ #endif #if E_STEPPERS > 3 - #if PIN_EXISTS(E3_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E3)) + #if PIN_EXISTS(E3_ENABLE) || ALL(SOFTWARE_DRIVER_ENABLE, E3_IS_TRINAMIC) #define HAS_E3_ENABLE 1 #endif #if PIN_EXISTS(E3_DIR) @@ -1325,7 +1325,7 @@ #endif #if E_STEPPERS > 4 - #if PIN_EXISTS(E4_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E4)) + #if PIN_EXISTS(E4_ENABLE) || ALL(SOFTWARE_DRIVER_ENABLE, E4_IS_TRINAMIC) #define HAS_E4_ENABLE 1 #endif #if PIN_EXISTS(E4_DIR) @@ -1340,7 +1340,7 @@ #endif #if E_STEPPERS > 5 - #if PIN_EXISTS(E5_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E5)) + #if PIN_EXISTS(E5_ENABLE) || ALL(SOFTWARE_DRIVER_ENABLE, E5_IS_TRINAMIC) #define HAS_E5_ENABLE 1 #endif #if PIN_EXISTS(E5_DIR) @@ -1355,7 +1355,7 @@ #endif #if E_STEPPERS > 6 - #if PIN_EXISTS(E6_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E6)) + #if PIN_EXISTS(E6_ENABLE) || ALL(SOFTWARE_DRIVER_ENABLE, E6_IS_TRINAMIC) #define HAS_E6_ENABLE 1 #endif #if PIN_EXISTS(E6_DIR) @@ -1370,7 +1370,7 @@ #endif #if E_STEPPERS > 7 - #if PIN_EXISTS(E7_ENABLE) || (ENABLED(SOFTWARE_DRIVER_ENABLE) && AXIS_IS_TMC(E7)) + #if PIN_EXISTS(E7_ENABLE) || ALL(SOFTWARE_DRIVER_ENABLE, E7_IS_TRINAMIC) #define HAS_E7_ENABLE 1 #endif #if PIN_EXISTS(E7_DIR) @@ -1441,7 +1441,7 @@ #undef Z4_STALL_SENSITIVITY #endif - #if AXIS_IS_TMC(X) + #if X_IS_TRINAMIC #if defined(X_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(X) #define X_SENSORLESS 1 #if ENABLED(SPI_ENDSTOPS) && AXIS_HAS_SPI(X) @@ -1461,7 +1461,7 @@ #define X_SLAVE_ADDRESS 0 #endif #endif - #if AXIS_IS_TMC(X2) + #if X2_IS_TRINAMIC #if defined(X2_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(X2) #define X2_SENSORLESS 1 #endif @@ -1479,7 +1479,7 @@ #endif #endif - #if AXIS_IS_TMC(Y) + #if Y_IS_TRINAMIC #if defined(Y_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(Y) #define Y_SENSORLESS 1 #if ENABLED(SPI_ENDSTOPS) && AXIS_HAS_SPI(Y) @@ -1499,7 +1499,7 @@ #define Y_SLAVE_ADDRESS 0 #endif #endif - #if AXIS_IS_TMC(Y2) + #if Y2_IS_TRINAMIC #if defined(Y2_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(Y2) #define Y2_SENSORLESS 1 #endif @@ -1517,7 +1517,7 @@ #endif #endif - #if AXIS_IS_TMC(Z) + #if Z_IS_TRINAMIC #if defined(Z_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(Z) #define Z_SENSORLESS 1 #if ENABLED(SPI_ENDSTOPS) && AXIS_HAS_SPI(Z) @@ -1537,7 +1537,7 @@ #define Z_SLAVE_ADDRESS 0 #endif #endif - #if NUM_Z_STEPPERS >= 2 && AXIS_IS_TMC(Z2) + #if NUM_Z_STEPPERS >= 2 && Z2_IS_TRINAMIC #if defined(Z2_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(Z2) #define Z2_SENSORLESS 1 #endif @@ -1554,7 +1554,7 @@ #define Z2_SLAVE_ADDRESS 0 #endif #endif - #if NUM_Z_STEPPERS >= 3 && AXIS_IS_TMC(Z3) + #if NUM_Z_STEPPERS >= 3 && Z3_IS_TRINAMIC #if defined(Z3_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(Z3) #define Z3_SENSORLESS 1 #endif @@ -1571,7 +1571,7 @@ #define Z3_SLAVE_ADDRESS 0 #endif #endif - #if NUM_Z_STEPPERS >= 4 && AXIS_IS_TMC(Z4) + #if NUM_Z_STEPPERS >= 4 && Z4_IS_TRINAMIC #if defined(Z4_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(Z4) #define Z4_SENSORLESS 1 #endif @@ -1589,7 +1589,7 @@ #endif #endif - #if AXIS_IS_TMC(I) + #if I_IS_TRINAMIC #if defined(I_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(I) #define I_SENSORLESS 1 #if ENABLED(SPI_ENDSTOPS) && AXIS_HAS_SPI(I) @@ -1610,7 +1610,7 @@ #endif #endif - #if AXIS_IS_TMC(J) + #if J_IS_TRINAMIC #if defined(J_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(J) #define J_SENSORLESS 1 #if ENABLED(SPI_ENDSTOPS) && AXIS_HAS_SPI(J) @@ -1631,7 +1631,7 @@ #endif #endif - #if AXIS_IS_TMC(K) + #if K_IS_TRINAMIC #if defined(K_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(K) #define K_SENSORLESS 1 #if ENABLED(SPI_ENDSTOPS) && AXIS_HAS_SPI(K) @@ -1652,7 +1652,7 @@ #endif #endif - #if AXIS_IS_TMC(U) + #if U_IS_TRINAMIC #if defined(U_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(U) #define U_SENSORLESS 1 #if ENABLED(SPI_ENDSTOPS) && AXIS_HAS_SPI(U) @@ -1673,7 +1673,7 @@ #endif #endif - #if AXIS_IS_TMC(V) + #if V_IS_TRINAMIC #if defined(V_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(V) #define V_SENSORLESS 1 #if ENABLED(SPI_ENDSTOPS) && AXIS_HAS_SPI(V) @@ -1694,7 +1694,7 @@ #endif #endif - #if AXIS_IS_TMC(W) + #if W_IS_TRINAMIC #if defined(W_STALL_SENSITIVITY) && AXIS_HAS_STALLGUARD(W) #define W_SENSORLESS 1 #if ENABLED(SPI_ENDSTOPS) && AXIS_HAS_SPI(W) @@ -1715,7 +1715,7 @@ #endif #endif - #if AXIS_IS_TMC(E0) + #if E0_IS_TRINAMIC #if AXIS_HAS_STEALTHCHOP(E0) #define E0_HAS_STEALTHCHOP 1 #endif @@ -1729,7 +1729,7 @@ #define E0_SLAVE_ADDRESS 0 #endif #endif - #if AXIS_IS_TMC(E1) + #if E1_IS_TRINAMIC #if AXIS_HAS_STEALTHCHOP(E1) #define E1_HAS_STEALTHCHOP 1 #endif @@ -1743,7 +1743,7 @@ #define E1_SLAVE_ADDRESS 0 #endif #endif - #if AXIS_IS_TMC(E2) + #if E2_IS_TRINAMIC #if AXIS_HAS_STEALTHCHOP(E2) #define E2_HAS_STEALTHCHOP 1 #endif @@ -1757,7 +1757,7 @@ #define E2_SLAVE_ADDRESS 0 #endif #endif - #if AXIS_IS_TMC(E3) + #if E3_IS_TRINAMIC #if AXIS_HAS_STEALTHCHOP(E3) #define E3_HAS_STEALTHCHOP 1 #endif @@ -1771,7 +1771,7 @@ #define E3_SLAVE_ADDRESS 0 #endif #endif - #if AXIS_IS_TMC(E4) + #if E4_IS_TRINAMIC #if AXIS_HAS_STEALTHCHOP(E4) #define E4_HAS_STEALTHCHOP 1 #endif @@ -1785,7 +1785,7 @@ #define E4_SLAVE_ADDRESS 0 #endif #endif - #if AXIS_IS_TMC(E5) + #if E5_IS_TRINAMIC #if AXIS_HAS_STEALTHCHOP(E5) #define E5_HAS_STEALTHCHOP 1 #endif @@ -1799,7 +1799,7 @@ #define E5_SLAVE_ADDRESS 0 #endif #endif - #if AXIS_IS_TMC(E6) + #if E6_IS_TRINAMIC #if AXIS_HAS_STEALTHCHOP(E6) #define E6_HAS_STEALTHCHOP 1 #endif @@ -1813,7 +1813,7 @@ #define E6_SLAVE_ADDRESS 0 #endif #endif - #if AXIS_IS_TMC(E7) + #if E7_IS_TRINAMIC #if AXIS_HAS_STEALTHCHOP(E7) #define E7_HAS_STEALTHCHOP 1 #endif diff --git a/Marlin/src/inc/Conditionals-6-type.h b/Marlin/src/inc/Conditionals-6-type.h index e14c6d7ce5..bd8e3b78b4 100644 --- a/Marlin/src/inc/Conditionals-6-type.h +++ b/Marlin/src/inc/Conditionals-6-type.h @@ -38,10 +38,53 @@ #endif // If an axis's Homing Current differs from standard current... -#define HAS_CURRENT_HOME(N) (N##_CURRENT_HOME > 0 && N##_CURRENT_HOME != N##_CURRENT) +#define HAS_HOME_CURRENT(N) (N##_CURRENT_HOME > 0 && N##_CURRENT_HOME != N##_CURRENT) +#if HAS_HOME_CURRENT(X) + #define X_HAS_HOME_CURRENT 1 +#endif +#if HAS_HOME_CURRENT(Y) + #define Y_HAS_HOME_CURRENT 1 +#endif +#if HAS_HOME_CURRENT(Z) + #define Z_HAS_HOME_CURRENT 1 +#endif +#if HAS_HOME_CURRENT(I) + #define I_HAS_HOME_CURRENT 1 +#endif +#if HAS_HOME_CURRENT(J) + #define J_HAS_HOME_CURRENT 1 +#endif +#if HAS_HOME_CURRENT(K) + #define K_HAS_HOME_CURRENT 1 +#endif +#if HAS_HOME_CURRENT(U) + #define U_HAS_HOME_CURRENT 1 +#endif +#if HAS_HOME_CURRENT(V) + #define V_HAS_HOME_CURRENT 1 +#endif +#if HAS_HOME_CURRENT(W) + #define W_HAS_HOME_CURRENT 1 +#endif +#if HAS_HOME_CURRENT(X2) + #define X2_HAS_HOME_CURRENT 1 +#endif +#if HAS_HOME_CURRENT(Y2) + #define Y2_HAS_HOME_CURRENT 1 +#endif +#if HAS_HOME_CURRENT(Z2) + #define Z2_HAS_HOME_CURRENT 1 +#endif +#if HAS_HOME_CURRENT(Z3) + #define Z3_HAS_HOME_CURRENT 1 +#endif +#if HAS_HOME_CURRENT(Z4) + #define Z4_HAS_HOME_CURRENT 1 +#endif +#undef HAS_HOME_CURRENT // Does any axis have homing current? -#define _OR_HAS_CURR_HOME(N) HAS_CURRENT_HOME(N) || +#define _OR_HAS_CURR_HOME(N) N##_HAS_HOME_CURRENT || #if MAIN_AXIS_MAP(_OR_HAS_CURR_HOME) MAP(_OR_HAS_CURR_HOME, X2, Y2, Z2, Z3, Z4) 0 #define HAS_HOMING_CURRENT 1 #endif diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 0029980ada..3c4cd44561 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -1805,8 +1805,8 @@ static_assert(NUM_SERVOS <= NUM_SERVO_PLUGS, "NUM_SERVOS (or some servo index) i #undef _BAD_HOME_CURRENT #if ENABLED(PROBING_USE_CURRENT_HOME) - #if (defined(Z_CURRENT_HOME) && !HAS_CURRENT_HOME(Z)) || (defined(Z2_CURRENT_HOME) && !HAS_CURRENT_HOME(Z2)) \ - || (defined(Z3_CURRENT_HOME) && !HAS_CURRENT_HOME(Z3)) || (defined(Z4_CURRENT_HOME) && !HAS_CURRENT_HOME(Z4)) + #if (defined(Z_CURRENT_HOME) && !Z_HAS_HOME_CURRENT) || (defined(Z2_CURRENT_HOME) && !Z2_HAS_HOME_CURRENT) \ + || (defined(Z3_CURRENT_HOME) && !Z3_HAS_HOME_CURRENT) || (defined(Z4_CURRENT_HOME) && !Z4_HAS_HOME_CURRENT) #error "PROBING_USE_CURRENT_HOME requires a Z_CURRENT_HOME value that differs from Z_CURRENT." #endif #endif @@ -2452,28 +2452,28 @@ static_assert(NUM_SERVOS <= NUM_SERVO_PLUGS, "NUM_SERVOS (or some servo index) i #endif #endif -#if E_STEPPERS > 0 && !(PINS_EXIST(E0_STEP, E0_DIR) && HAS_E0_ENABLE) +#if E_STEPPERS > 0 && !ALL(HAS_E0_DIR, HAS_E0_STEP, HAS_E0_ENABLE) #error "E0_STEP_PIN, E0_DIR_PIN, or E0_ENABLE_PIN not defined for this board." #endif -#if E_STEPPERS > 1 && !(PINS_EXIST(E1_STEP, E1_DIR) && HAS_E1_ENABLE) +#if E_STEPPERS > 1 && !ALL(HAS_E1_DIR, HAS_E1_STEP, HAS_E1_ENABLE) #error "E1_STEP_PIN, E1_DIR_PIN, or E1_ENABLE_PIN not defined for this board." #endif -#if E_STEPPERS > 2 && !(PINS_EXIST(E2_STEP, E2_DIR) && HAS_E2_ENABLE) +#if E_STEPPERS > 2 && !ALL(HAS_E2_DIR, HAS_E2_STEP, HAS_E2_ENABLE) #error "E2_STEP_PIN, E2_DIR_PIN, or E2_ENABLE_PIN not defined for this board." #endif -#if E_STEPPERS > 3 && !(PINS_EXIST(E3_STEP, E3_DIR) && HAS_E3_ENABLE) +#if E_STEPPERS > 3 && !ALL(HAS_E3_DIR, HAS_E3_STEP, HAS_E3_ENABLE) #error "E3_STEP_PIN, E3_DIR_PIN, or E3_ENABLE_PIN not defined for this board." #endif -#if E_STEPPERS > 4 && !(PINS_EXIST(E4_STEP, E4_DIR) && HAS_E4_ENABLE) +#if E_STEPPERS > 4 && !ALL(HAS_E4_DIR, HAS_E4_STEP, HAS_E4_ENABLE) #error "E4_STEP_PIN, E4_DIR_PIN, or E4_ENABLE_PIN not defined for this board." #endif -#if E_STEPPERS > 5 && !(PINS_EXIST(E5_STEP, E5_DIR) && HAS_E5_ENABLE) +#if E_STEPPERS > 5 && !ALL(HAS_E5_DIR, HAS_E5_STEP, HAS_E5_ENABLE) #error "E5_STEP_PIN, E5_DIR_PIN, or E5_ENABLE_PIN not defined for this board." #endif -#if E_STEPPERS > 6 && !(PINS_EXIST(E6_STEP, E6_DIR) && HAS_E6_ENABLE) +#if E_STEPPERS > 6 && !ALL(HAS_E6_DIR, HAS_E6_STEP, HAS_E6_ENABLE) #error "E6_STEP_PIN, E6_DIR_PIN, or E6_ENABLE_PIN not defined for this board." #endif -#if E_STEPPERS > 7 && !(PINS_EXIST(E7_STEP, E7_DIR) && HAS_E7_ENABLE) +#if E_STEPPERS > 7 && !ALL(HAS_E7_DIR, HAS_E7_STEP, HAS_E7_ENABLE) #error "E7_STEP_PIN, E7_DIR_PIN, or E7_ENABLE_PIN not defined for this board." #endif @@ -3230,7 +3230,7 @@ static_assert(NUM_SERVOS <= NUM_SERVO_PLUGS, "NUM_SERVOS (or some servo index) i #undef INVALID_TMC_ADDRESS #define _TMC_MICROSTEP_IS_VALID(MS) (MS == 0 || MS == 2 || MS == 4 || MS == 8 || MS == 16 || MS == 32 || MS == 64 || MS == 128 || MS == 256) -#define TMC_MICROSTEP_IS_VALID(M) (!AXIS_IS_TMC(M) || _TMC_MICROSTEP_IS_VALID(M##_MICROSTEPS)) +#define TMC_MICROSTEP_IS_VALID(M) (!M##_IS_TRINAMIC || _TMC_MICROSTEP_IS_VALID(M##_MICROSTEPS)) #define INVALID_TMC_MS(ST) static_assert(0, "Invalid " STRINGIFY(ST) "_MICROSTEPS. Valid values are 0, 2, 4, 8, 16, 32, 64, 128, and 256.") #if !TMC_MICROSTEP_IS_VALID(X) diff --git a/Marlin/src/inc/Warnings.cpp b/Marlin/src/inc/Warnings.cpp index df2279a08b..7c107220af 100644 --- a/Marlin/src/inc/Warnings.cpp +++ b/Marlin/src/inc/Warnings.cpp @@ -742,24 +742,24 @@ #endif #if USE_SENSORLESS && DISABLED(NO_HOMING_CURRENT_WARNING) - #if ENABLED(X_SENSORLESS) && defined(X_CURRENT_HOME) && !HAS_CURRENT_HOME(X) - #warning "It's recommended to set X_CURRENT_HOME lower than X_CURRENT with SENSORLESS_HOMING. (Define NO_HOMING_CURRENT_WARNING to suppress this warning.)" - #elif ENABLED(X2_SENSORLESS) && defined(X2_CURRENT_HOME) && !HAS_CURRENT_HOME(X2) - #warning "It's recommended to set X2_CURRENT_HOME lower than X2_CURRENT with SENSORLESS_HOMING. (Define NO_HOMING_CURRENT_WARNING to suppress this warning.)" + #if ENABLED(X_SENSORLESS) && defined(X_CURRENT_HOME) && !X_HAS_HOME_CURRENT + #warning "With SENSORLESS_HOMING it is recommended to set X_CURRENT_HOME less than X_CURRENT. (Define NO_HOMING_CURRENT_WARNING to suppress this warning.)" + #elif ENABLED(X2_SENSORLESS) && defined(X2_CURRENT_HOME) && !X2_HAS_HOME_CURRENT + #warning "With SENSORLESS_HOMING it is recommended to set X2_CURRENT_HOME less than X2_CURRENT. (Define NO_HOMING_CURRENT_WARNING to suppress this warning.)" #endif - #if ENABLED(Y_SENSORLESS) && defined(Y_CURRENT_HOME) && !HAS_CURRENT_HOME(Y) - #warning "It's recommended to set Y_CURRENT_HOME lower than Y_CURRENT with SENSORLESS_HOMING. (Define NO_HOMING_CURRENT_WARNING to suppress this warning.)" - #elif ENABLED(Y2_SENSORLESS) && defined(Y2_CURRENT_HOME) && !HAS_CURRENT_HOME(Y2) - #warning "It's recommended to set Y2_CURRENT_HOME lower than Y2_CURRENT with SENSORLESS_HOMING. (Define NO_HOMING_CURRENT_WARNING to suppress this warning.)" + #if ENABLED(Y_SENSORLESS) && defined(Y_CURRENT_HOME) && !Y_HAS_HOME_CURRENT + #warning "With SENSORLESS_HOMING it is recommended to set Y_CURRENT_HOME less than Y_CURRENT. (Define NO_HOMING_CURRENT_WARNING to suppress this warning.)" + #elif ENABLED(Y2_SENSORLESS) && defined(Y2_CURRENT_HOME) && !Y2_HAS_HOME_CURRENT + #warning "With SENSORLESS_HOMING it is recommended to set Y2_CURRENT_HOME less than Y2_CURRENT. (Define NO_HOMING_CURRENT_WARNING to suppress this warning.)" #endif - #if ENABLED(Z_SENSORLESS) && defined(Z_CURRENT_HOME) && !HAS_CURRENT_HOME(Z) - #warning "It's recommended to set Z_CURRENT_HOME lower than Z_CURRENT with SENSORLESS_HOMING. (Define NO_HOMING_CURRENT_WARNING to suppress this warning.)" - #elif ENABLED(Z2_SENSORLESS) && defined(Z2_CURRENT_HOME) && !HAS_CURRENT_HOME(Z2) - #warning "It's recommended to set Z2_CURRENT_HOME lower than Z2_CURRENT with SENSORLESS_HOMING. (Define NO_HOMING_CURRENT_WARNING to suppress this warning.)" - #elif ENABLED(Z3_SENSORLESS) && defined(Z3_CURRENT_HOME) && !HAS_CURRENT_HOME(Z3) - #warning "It's recommended to set Z3_CURRENT_HOME lower than Z3_CURRENT with SENSORLESS_HOMING. (Define NO_HOMING_CURRENT_WARNING to suppress this warning.)" - #elif ENABLED(Z4_SENSORLESS) && defined(Z4_CURRENT_HOME) && !HAS_CURRENT_HOME(Z4) - #warning "It's recommended to set Z4_CURRENT_HOME lower than Z4_CURRENT with SENSORLESS_HOMING. (Define NO_HOMING_CURRENT_WARNING to suppress this warning.)" + #if ENABLED(Z_SENSORLESS) && defined(Z_CURRENT_HOME) && !Z_HAS_HOME_CURRENT + #warning "With SENSORLESS_HOMING it is recommended to set Z_CURRENT_HOME less than Z_CURRENT. (Define NO_HOMING_CURRENT_WARNING to suppress this warning.)" + #elif ENABLED(Z2_SENSORLESS) && defined(Z2_CURRENT_HOME) && !Z2_HAS_HOME_CURRENT + #warning "With SENSORLESS_HOMING it is recommended to set Z2_CURRENT_HOME less than Z2_CURRENT. (Define NO_HOMING_CURRENT_WARNING to suppress this warning.)" + #elif ENABLED(Z3_SENSORLESS) && defined(Z3_CURRENT_HOME) && !Z3_HAS_HOME_CURRENT + #warning "With SENSORLESS_HOMING it is recommended to set Z3_CURRENT_HOME less than Z3_CURRENT. (Define NO_HOMING_CURRENT_WARNING to suppress this warning.)" + #elif ENABLED(Z4_SENSORLESS) && defined(Z4_CURRENT_HOME) && !Z4_HAS_HOME_CURRENT + #warning "With SENSORLESS_HOMING it is recommended to set Z4_CURRENT_HOME less than Z4_CURRENT. (Define NO_HOMING_CURRENT_WARNING to suppress this warning.)" #endif #endif diff --git a/Marlin/src/lcd/e3v2/jyersui/dwin.cpp b/Marlin/src/lcd/e3v2/jyersui/dwin.cpp index 09100e5029..b9c637d722 100644 --- a/Marlin/src/lcd/e3v2/jyersui/dwin.cpp +++ b/Marlin/src/lcd/e3v2/jyersui/dwin.cpp @@ -3068,7 +3068,7 @@ void JyersDWIN::menuItemHandler(const uint8_t menu, const uint8_t item, bool dra drawMenu(ID_Advanced, ADVANCED_TMC); break; - #if AXIS_IS_TMC(X) + #if X_IS_TRINAMIC case TMC_STEPPER_CURRENT_X: static float stepper_current_x; @@ -3084,7 +3084,7 @@ void JyersDWIN::menuItemHandler(const uint8_t menu, const uint8_t item, bool dra break; #endif - #if AXIS_IS_TMC(Y) + #if Y_IS_TRINAMIC case TMC_STEPPER_CURRENT_Y: static float stepper_current_y; if (draw) { @@ -3098,7 +3098,7 @@ void JyersDWIN::menuItemHandler(const uint8_t menu, const uint8_t item, bool dra break; #endif - #if AXIS_IS_TMC(Z) + #if Z_IS_TRINAMIC case TMC_STEPPER_CURRENT_Z: static float stepper_current_z; if (draw) { @@ -3112,7 +3112,7 @@ void JyersDWIN::menuItemHandler(const uint8_t menu, const uint8_t item, bool dra break; #endif - #if AXIS_IS_TMC(E0) + #if E0_IS_TRINAMIC case TMC_STEPPER_CURRENT_E: static float stepper_current_e; if (draw) { diff --git a/Marlin/src/lcd/e3v2/proui/dwin.cpp b/Marlin/src/lcd/e3v2/proui/dwin.cpp index a775d2ae27..7428a4b254 100644 --- a/Marlin/src/lcd/e3v2/proui/dwin.cpp +++ b/Marlin/src/lcd/e3v2/proui/dwin.cpp @@ -3607,49 +3607,28 @@ void drawTuneMenu() { #endif #if HAS_TRINAMIC_CONFIG - #if AXIS_IS_TMC(X) + #if X_IS_TRINAMIC void setXTMCCurrent() { setPIntOnClick(MIN_TMC_CURRENT, MAX_TMC_CURRENT, []{ stepperX.refresh_stepper_current(); }); } #endif - #if AXIS_IS_TMC(Y) + #if Y_IS_TRINAMIC void setYTMCCurrent() { setPIntOnClick(MIN_TMC_CURRENT, MAX_TMC_CURRENT, []{ stepperY.refresh_stepper_current(); }); } #endif - #if AXIS_IS_TMC(Z) + #if Z_IS_TRINAMIC void setZTMCCurrent() { setPIntOnClick(MIN_TMC_CURRENT, MAX_TMC_CURRENT, []{ stepperZ.refresh_stepper_current(); }); } #endif - #if AXIS_IS_TMC(E0) + #if E0_IS_TRINAMIC void setETMCCurrent() { setPIntOnClick(MIN_TMC_CURRENT, MAX_TMC_CURRENT, []{ stepperE0.refresh_stepper_current(); }); } #endif void drawTrinamicConfigMenu() { - constexpr uint8_t items = (1 - #if AXIS_IS_TMC(X) - + 1 - #endif - #if AXIS_IS_TMC(Y) - + 1 - #endif - #if AXIS_IS_TMC(Z) - + 1 - #endif - #if AXIS_IS_TMC(E0) - + 1 - #endif - ); + constexpr uint8_t items = 1 + COUNT_ENABLED(X_IS_TRINAMIC, Y_IS_TRINAMIC, Z_IS_TRINAMIC, E0_IS_TRINAMIC); checkkey = ID_Menu; if (SET_MENU(trinamicConfigMenu, MSG_TMC_DRIVERS, items)) { BACK_ITEM(drawAdvancedSettingsMenu); - #if AXIS_IS_TMC(X) - EDIT_ITEM(ICON_TMCXSet, MSG_TMC_ACURRENT, onDrawPIntMenu, setXTMCCurrent, &stepperX.val_mA); - #endif - #if AXIS_IS_TMC(Y) - EDIT_ITEM(ICON_TMCYSet, MSG_TMC_BCURRENT, onDrawPIntMenu, setYTMCCurrent, &stepperY.val_mA); - #endif - #if AXIS_IS_TMC(Z) - EDIT_ITEM(ICON_TMCZSet, MSG_TMC_CCURRENT, onDrawPIntMenu, setZTMCCurrent, &stepperZ.val_mA); - #endif - #if AXIS_IS_TMC(E0) - EDIT_ITEM(ICON_TMCESet, MSG_TMC_ECURRENT, onDrawPIntMenu, setETMCCurrent, &stepperE0.val_mA); - #endif + TERN_(X_IS_TRINAMIC, EDIT_ITEM(ICON_TMCXSet, MSG_TMC_ACURRENT, onDrawPIntMenu, setXTMCCurrent, &stepperX.val_mA)); + TERN_(Y_IS_TRINAMIC, EDIT_ITEM(ICON_TMCYSet, MSG_TMC_BCURRENT, onDrawPIntMenu, setYTMCCurrent, &stepperY.val_mA)); + TERN_(Z_IS_TRINAMIC, EDIT_ITEM(ICON_TMCZSet, MSG_TMC_CCURRENT, onDrawPIntMenu, setZTMCCurrent, &stepperZ.val_mA)); + TERN_(E0_IS_TRINAMIC, EDIT_ITEM(ICON_TMCESet, MSG_TMC_ECURRENT, onDrawPIntMenu, setETMCCurrent, &stepperE0.val_mA)); } updateMenu(trinamicConfigMenu); } diff --git a/Marlin/src/lcd/extui/dgus/mks/DGUSDisplayDef.cpp b/Marlin/src/lcd/extui/dgus/mks/DGUSDisplayDef.cpp index 4182c3f2ca..08eff9d41e 100644 --- a/Marlin/src/lcd/extui/dgus/mks/DGUSDisplayDef.cpp +++ b/Marlin/src/lcd/extui/dgus/mks/DGUSDisplayDef.cpp @@ -707,28 +707,28 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { #endif #if HAS_TRINAMIC_CONFIG // TMC Current Setting - #if AXIS_IS_TMC(X) + #if X_IS_TRINAMIC VPHELPER(VP_TMC_X_Current, &stepperX.val_mA, screen.tmcChangeConfig, screen.sendWordValueToDisplay), #endif - #if AXIS_IS_TMC(Y) + #if Y_IS_TRINAMIC VPHELPER(VP_TMC_Y_Current, &stepperY.val_mA, screen.tmcChangeConfig, screen.sendWordValueToDisplay), #endif - #if AXIS_IS_TMC(Z) + #if Z_IS_TRINAMIC VPHELPER(VP_TMC_Z_Current, &stepperZ.val_mA, screen.tmcChangeConfig, screen.sendWordValueToDisplay), #endif - #if AXIS_IS_TMC(E0) + #if E0_IS_TRINAMIC VPHELPER(VP_TMC_E0_Current, &stepperE0.val_mA, screen.tmcChangeConfig, screen.sendWordValueToDisplay), #endif - #if AXIS_IS_TMC(E1) + #if E1_IS_TRINAMIC VPHELPER(VP_TMC_E1_Current, &stepperE1.val_mA, screen.tmcChangeConfig, screen.sendWordValueToDisplay), #endif - #if AXIS_IS_TMC(X2) + #if X2_IS_TRINAMIC VPHELPER(VP_TMC_X1_Current, &stepperX2.val_mA, screen.tmcChangeConfig, screen.sendWordValueToDisplay), #endif - #if AXIS_IS_TMC(Y2) + #if Y2_IS_TRINAMIC VPHELPER(VP_TMC_Y1_Current, &stepperY2.val_mA, screen.tmcChangeConfig, screen.sendWordValueToDisplay), #endif - #if AXIS_IS_TMC(Z2) + #if Z2_IS_TRINAMIC VPHELPER(VP_TMC_Z1_Current, &stepperZ2.val_mA, screen.tmcChangeConfig, screen.sendWordValueToDisplay), #endif #endif diff --git a/Marlin/src/lcd/extui/dgus/mks/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/dgus/mks/DGUSScreenHandler.cpp index 1999518607..1761451da1 100644 --- a/Marlin/src/lcd/extui/dgus/mks/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/dgus/mks/DGUSScreenHandler.cpp @@ -673,49 +673,49 @@ void DGUSScreenHandlerMKS::tmcChangeConfig(DGUS_VP_Variable &var, void *val_ptr) #endif break; case VP_TMC_X_Current: - #if AXIS_IS_TMC(X) + #if X_IS_TRINAMIC stepperX.rms_current(tmc_val); settings.save(); #endif break; case VP_TMC_X1_Current: - #if AXIS_IS_TMC(X2) + #if X2_IS_TRINAMIC stepperX2.rms_current(tmc_val); settings.save(); #endif break; case VP_TMC_Y_Current: - #if AXIS_IS_TMC(Y) + #if Y_IS_TRINAMIC stepperY.rms_current(tmc_val); settings.save(); #endif break; case VP_TMC_Y1_Current: - #if AXIS_IS_TMC(X2) + #if X2_IS_TRINAMIC stepperY2.rms_current(tmc_val); settings.save(); #endif break; case VP_TMC_Z_Current: - #if AXIS_IS_TMC(Z) + #if Z_IS_TRINAMIC stepperZ.rms_current(tmc_val); settings.save(); #endif break; case VP_TMC_Z1_Current: - #if AXIS_IS_TMC(Z2) + #if Z2_IS_TRINAMIC stepperZ2.rms_current(tmc_val); settings.save(); #endif break; case VP_TMC_E0_Current: - #if AXIS_IS_TMC(E0) + #if E0_IS_TRINAMIC stepperE0.rms_current(tmc_val); settings.save(); #endif break; case VP_TMC_E1_Current: - #if AXIS_IS_TMC(E1) + #if E1_IS_TRINAMIC stepperE1.rms_current(tmc_val); settings.save(); #endif diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/stepper_current_screen.cpp b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/stepper_current_screen.cpp index ddd273aa47..3511ce3719 100644 --- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/stepper_current_screen.cpp +++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/stepper_current_screen.cpp @@ -33,86 +33,60 @@ void StepperCurrentScreen::onRedraw(draw_mode_t what) { widgets_t w(what); w.precision(0); w.units(GET_TEXT_F(MSG_UNITS_MILLIAMP)); - w.heading( GET_TEXT_F(MSG_TMC_CURRENT)); - #if AXIS_IS_TMC(X) - w.color(x_axis) .adjuster( 2, GET_TEXT_F(MSG_AXIS_X), getAxisCurrent_mA(X) ); - #endif - #if AXIS_IS_TMC(X2) - w.color(x_axis) .adjuster( 4, GET_TEXT_F(MSG_AXIS_X2), getAxisCurrent_mA(X2) ); - #endif - #if AXIS_IS_TMC(Y) - w.color(y_axis) .adjuster( 6, GET_TEXT_F(MSG_AXIS_Y), getAxisCurrent_mA(Y) ); - #endif - #if AXIS_IS_TMC(Y2) - w.color(x_axis) .adjuster( 8, GET_TEXT_F(MSG_AXIS_Y2), getAxisCurrent_mA(Y2) ); - #endif - #if AXIS_IS_TMC(Z) - w.color(z_axis) .adjuster(10, GET_TEXT_F(MSG_AXIS_Z), getAxisCurrent_mA(Z) ); - #endif - #if AXIS_IS_TMC(Z2) - w.color(z_axis) .adjuster(12, GET_TEXT_F(MSG_AXIS_Z2), getAxisCurrent_mA(Z2) ); - #endif - #if AXIS_IS_TMC(E0) - w.color(e_axis) .adjuster(14, GET_TEXT_F( - #if EXTRUDERS == 1 - MSG_AXIS_E - #else - MSG_AXIS_E1 - #endif - ), getAxisCurrent_mA(E0) ); - #endif - #if AXIS_IS_TMC(E1) - w.color(e_axis).adjuster(16, GET_TEXT_F(MSG_AXIS_E2), getAxisCurrent_mA(E1) ); - #endif - #if AXIS_IS_TMC(E2) - w.color(e_axis).adjuster(18, GET_TEXT_F(MSG_AXIS_E3), getAxisCurrent_mA(E2) ); - #endif - #if AXIS_IS_TMC(E3) - w.color(e_axis).adjuster(20, GET_TEXT_F(MSG_AXIS_E4), getAxisCurrent_mA(E3) ); - #endif + w.heading(GET_TEXT_F(MSG_TMC_CURRENT)); + TERN_(X_IS_TRINAMIC, w.color(x_axis) .adjuster( 2, GET_TEXT_F(MSG_AXIS_X), getAxisCurrent_mA(X) ) ); + TERN_(X2_IS_TRINAMIC, w.color(x_axis) .adjuster( 4, GET_TEXT_F(MSG_AXIS_X2), getAxisCurrent_mA(X2)) ); + TERN_(Y_IS_TRINAMIC, w.color(y_axis) .adjuster( 6, GET_TEXT_F(MSG_AXIS_Y), getAxisCurrent_mA(Y) ) ); + TERN_(Y2_IS_TRINAMIC, w.color(x_axis) .adjuster( 8, GET_TEXT_F(MSG_AXIS_Y2), getAxisCurrent_mA(Y2)) ); + TERN_(Z_IS_TRINAMIC, w.color(z_axis) .adjuster(10, GET_TEXT_F(MSG_AXIS_Z), getAxisCurrent_mA(Z) ) ); + TERN_(Z2_IS_TRINAMIC, w.color(z_axis) .adjuster(12, GET_TEXT_F(MSG_AXIS_Z2), getAxisCurrent_mA(Z2)) ); + TERN_(E0_IS_TRINAMIC, w.color(e_axis) .adjuster(14, GET_TEXT_F(TERN(HAS_MULTI_EXTRUDER, MSG_AXIS_E1, MSG_AXIS_E)), getAxisCurrent_mA(E0)) ); + TERN_(E1_IS_TRINAMIC, w.color(e_axis) .adjuster(16, GET_TEXT_F(MSG_AXIS_E2), getAxisCurrent_mA(E1)) ); + TERN_(E2_IS_TRINAMIC, w.color(e_axis) .adjuster(18, GET_TEXT_F(MSG_AXIS_E3), getAxisCurrent_mA(E2)) ); + TERN_(E3_IS_TRINAMIC, w.color(e_axis) .adjuster(20, GET_TEXT_F(MSG_AXIS_E4), getAxisCurrent_mA(E3)) ); w.increments(); } bool StepperCurrentScreen::onTouchHeld(uint8_t tag) { const float increment = getIncrement(); switch (tag) { - #if AXIS_IS_TMC(X) + #if X_IS_TRINAMIC case 2: UI_DECREMENT(AxisCurrent_mA, X ); break; case 3: UI_INCREMENT(AxisCurrent_mA, X ); break; #endif - #if AXIS_IS_TMC(X2) + #if X2_IS_TRINAMIC case 4: UI_DECREMENT(AxisCurrent_mA, X2 ); break; case 5: UI_INCREMENT(AxisCurrent_mA, X2 ); break; #endif - #if AXIS_IS_TMC(Y) + #if Y_IS_TRINAMIC case 6: UI_DECREMENT(AxisCurrent_mA, Y ); break; case 7: UI_INCREMENT(AxisCurrent_mA, Y ); break; #endif - #if AXIS_IS_TMC(Y2) + #if Y2_IS_TRINAMIC case 8: UI_DECREMENT(AxisCurrent_mA, Y2 ); break; case 9: UI_INCREMENT(AxisCurrent_mA, Y2 ); break; #endif - #if AXIS_IS_TMC(Z) + #if Z_IS_TRINAMIC case 10: UI_DECREMENT(AxisCurrent_mA, Z ); break; case 11: UI_INCREMENT(AxisCurrent_mA, Z ); break; #endif - #if AXIS_IS_TMC(Z2) + #if Z2_IS_TRINAMIC case 12: UI_DECREMENT(AxisCurrent_mA, Z2 ); break; case 13: UI_INCREMENT(AxisCurrent_mA, Z2 ); break; #endif - #if AXIS_IS_TMC(E0) + #if E0_IS_TRINAMIC case 14: UI_DECREMENT(AxisCurrent_mA, E0); break; case 15: UI_INCREMENT(AxisCurrent_mA, E0); break; #endif - #if AXIS_IS_TMC(E1) + #if E1_IS_TRINAMIC case 16: UI_DECREMENT(AxisCurrent_mA, E1); break; case 17: UI_INCREMENT(AxisCurrent_mA, E1); break; #endif - #if AXIS_IS_TMC(E2) + #if E2_IS_TRINAMIC case 18: UI_DECREMENT(AxisCurrent_mA, E2); break; case 19: UI_INCREMENT(AxisCurrent_mA, E2); break; #endif - #if AXIS_IS_TMC(E3) + #if E3_IS_TRINAMIC case 20: UI_DECREMENT(AxisCurrent_mA, E3); break; case 21: UI_INCREMENT(AxisCurrent_mA, E3); break; #endif 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 400b294701..c44cabd10a 100644 --- a/Marlin/src/lcd/extui/mks_ui/draw_number_key.cpp +++ b/Marlin/src/lcd/extui/mks_ui/draw_number_key.cpp @@ -102,13 +102,13 @@ static void disp_key_value() { #endif #if HAS_X_AXIS - case XMaxFeedRate: dtostrf(planner.settings.max_feedrate_mm_s[X_AXIS], 1, 1, public_buf_m); break; + case XMaxFeedRate: dtostrf(planner.settings.max_feedrate_mm_s[X_AXIS], 1, 1, public_buf_m); break; #endif #if HAS_Y_AXIS - case YMaxFeedRate: dtostrf(planner.settings.max_feedrate_mm_s[Y_AXIS], 1, 1, public_buf_m); break; + case YMaxFeedRate: dtostrf(planner.settings.max_feedrate_mm_s[Y_AXIS], 1, 1, public_buf_m); break; #endif #if HAS_Z_AXIS - case ZMaxFeedRate: dtostrf(planner.settings.max_feedrate_mm_s[Z_AXIS], 1, 1, public_buf_m); break; + case ZMaxFeedRate: dtostrf(planner.settings.max_feedrate_mm_s[Z_AXIS], 1, 1, public_buf_m); break; #endif #if HAS_EXTRUDERS case E0MaxFeedRate: dtostrf(planner.settings.max_feedrate_mm_s[E_AXIS], 1, 1, public_buf_m); break; @@ -134,13 +134,13 @@ static void disp_key_value() { #if ENABLED(EDITABLE_STEPS_PER_UNIT) #if HAS_X_AXIS - case Xstep: dtostrf(planner.settings.axis_steps_per_mm[X_AXIS], 1, 1, public_buf_m); break; + case Xstep: dtostrf(planner.settings.axis_steps_per_mm[X_AXIS], 1, 1, public_buf_m); break; #endif #if HAS_Y_AXIS - case Ystep: dtostrf(planner.settings.axis_steps_per_mm[Y_AXIS], 1, 1, public_buf_m); break; + case Ystep: dtostrf(planner.settings.axis_steps_per_mm[Y_AXIS], 1, 1, public_buf_m); break; #endif #if HAS_Z_AXIS - case Zstep: dtostrf(planner.settings.axis_steps_per_mm[Z_AXIS], 1, 1, public_buf_m); break; + case Zstep: dtostrf(planner.settings.axis_steps_per_mm[Z_AXIS], 1, 1, public_buf_m); break; #endif #if HAS_EXTRUDERS case E0step: dtostrf(planner.settings.axis_steps_per_mm[E_AXIS], 1, 1, public_buf_m); break; @@ -150,21 +150,11 @@ static void disp_key_value() { #endif #endif - #if AXIS_IS_TMC(X) - case Xcurrent: dtostrf(stepperX.getMilliamps(), 1, 1, public_buf_m); break; - #endif - #if AXIS_IS_TMC(Y) - case Ycurrent: dtostrf(stepperY.getMilliamps(), 1, 1, public_buf_m); break; - #endif - #if AXIS_IS_TMC(Z) - case Zcurrent: dtostrf(stepperZ.getMilliamps(), 1, 1, public_buf_m); break; - #endif - #if AXIS_IS_TMC(E0) - case E0current: dtostrf(stepperE0.getMilliamps(), 1, 1, public_buf_m); break; - #endif - #if AXIS_IS_TMC(E1) - case E1current: dtostrf(stepperE1.getMilliamps(), 1, 1, public_buf_m); break; - #endif + case Xcurrent: TERN_(X_IS_TRINAMIC, dtostrf(stepperX.getMilliamps(), 1, 1, public_buf_m)); break; + case Ycurrent: TERN_(Y_IS_TRINAMIC, dtostrf(stepperY.getMilliamps(), 1, 1, public_buf_m)); break; + case Zcurrent: TERN_(Z_IS_TRINAMIC, dtostrf(stepperZ.getMilliamps(), 1, 1, public_buf_m)); break; + case E0current: TERN_(E0_IS_TRINAMIC, dtostrf(stepperE0.getMilliamps(), 1, 1, public_buf_m)); break; + case E1current: TERN_(E1_IS_TRINAMIC, dtostrf(stepperE1.getMilliamps(), 1, 1, public_buf_m)); break; case pause_pos_x: dtostrf(gCfgItems.pausePosX, 1, 1, public_buf_m); break; case pause_pos_y: dtostrf(gCfgItems.pausePosY, 1, 1, public_buf_m); break; @@ -275,21 +265,11 @@ static void set_value_confirm() { case E1step: planner.settings.axis_steps_per_mm[E_AXIS_N(1)] = atof(key_value); planner.refresh_positioning(); break; #endif - #if AXIS_IS_TMC(X) - case Xcurrent: stepperX.rms_current(atoi(key_value)); break; - #endif - #if AXIS_IS_TMC(Y) - case Ycurrent: stepperY.rms_current(atoi(key_value)); break; - #endif - #if AXIS_IS_TMC(Z) - case Zcurrent: stepperZ.rms_current(atoi(key_value)); break; - #endif - #if AXIS_IS_TMC(E0) - case E0current: stepperE0.rms_current(atoi(key_value)); break; - #endif - #if AXIS_IS_TMC(E1) - case E1current: stepperE1.rms_current(atoi(key_value)); break; - #endif + case Xcurrent: TERN_(X_IS_TRINAMIC, stepperX.rms_current(atoi(key_value))); break; + case Ycurrent: TERN_(Y_IS_TRINAMIC, stepperY.rms_current(atoi(key_value))); break; + case Zcurrent: TERN_(Z_IS_TRINAMIC, stepperZ.rms_current(atoi(key_value))); break; + case E0current: TERN_(E0_IS_TRINAMIC, stepperE0.rms_current(atoi(key_value))); break; + case E1current: TERN_(E1_IS_TRINAMIC, stepperE1.rms_current(atoi(key_value))); break; case pause_pos_x: gCfgItems.pausePosX = atof(key_value); update_spi_flash(); break; case pause_pos_y: gCfgItems.pausePosY = atof(key_value); update_spi_flash(); break; diff --git a/Marlin/src/lcd/extui/mks_ui/draw_tmc_current_settings.cpp b/Marlin/src/lcd/extui/mks_ui/draw_tmc_current_settings.cpp index b243c88705..cbb2bc059f 100644 --- a/Marlin/src/lcd/extui/mks_ui/draw_tmc_current_settings.cpp +++ b/Marlin/src/lcd/extui/mks_ui/draw_tmc_current_settings.cpp @@ -49,34 +49,16 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { if (event != LV_EVENT_RELEASED) return; lv_clear_tmc_current_settings(); switch (obj->mks_obj_id) { - case ID_TMC_CURRENT_RETURN: - uiCfg.para_ui_page = false; - draw_return_ui(); - return; - #if AXIS_IS_TMC(X) - case ID_TMC_CURRENT_X: value = Xcurrent; break; - #endif - #if AXIS_IS_TMC(Y) - case ID_TMC_CURRENT_Y: value = Ycurrent; break; - #endif - #if AXIS_IS_TMC(Z) - case ID_TMC_CURRENT_Z: value = Zcurrent; break; - #endif - #if AXIS_IS_TMC(E0) - case ID_TMC_CURRENT_E0: value = E0current; break; - #endif - #if AXIS_IS_TMC(E1) - case ID_TMC_CURRENT_E1: value = E1current; break; - #endif + case ID_TMC_CURRENT_RETURN: uiCfg.para_ui_page = false; draw_return_ui(); return; - case ID_TMC_CURRENT_UP: - uiCfg.para_ui_page = false; - lv_draw_tmc_current_settings(); - return; - case ID_TMC_CURRENT_DOWN: - uiCfg.para_ui_page = true; - lv_draw_tmc_current_settings(); - return; + case ID_TMC_CURRENT_X: TERN_(X_IS_TRINAMIC, value = Xcurrent); break; + case ID_TMC_CURRENT_Y: TERN_(Y_IS_TRINAMIC, value = Ycurrent); break; + case ID_TMC_CURRENT_Z: TERN_(Z_IS_TRINAMIC, value = Zcurrent); break; + case ID_TMC_CURRENT_E0: TERN_(E0_IS_TRINAMIC, value = E0current); break; + case ID_TMC_CURRENT_E1: TERN_(E1_IS_TRINAMIC, value = E1current); break; + + case ID_TMC_CURRENT_UP: uiCfg.para_ui_page = false; lv_draw_tmc_current_settings(); return; + case ID_TMC_CURRENT_DOWN: uiCfg.para_ui_page = true; lv_draw_tmc_current_settings(); return; } lv_draw_number_key(); @@ -87,46 +69,26 @@ void lv_draw_tmc_current_settings() { float milliamps; if (!uiCfg.para_ui_page) { - #if AXIS_IS_TMC(X) - milliamps = stepperX.getMilliamps(); - #else - milliamps = -1; - #endif + milliamps = TERN(X_IS_TRINAMIC, stepperX.getMilliamps(), -1); dtostrf(milliamps, 1, 1, public_buf_l); lv_screen_menu_item_1_edit(scr, machine_menu.X_Current, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_TMC_CURRENT_X, 0, public_buf_l); - #if AXIS_IS_TMC(Y) - milliamps = stepperY.getMilliamps(); - #else - milliamps = -1; - #endif + milliamps = TERN(Y_IS_TRINAMIC, stepperY.getMilliamps(), -1); dtostrf(milliamps, 1, 1, public_buf_l); lv_screen_menu_item_1_edit(scr, machine_menu.Y_Current, PARA_UI_POS_X, PARA_UI_POS_Y * 2, event_handler, ID_TMC_CURRENT_Y, 1, public_buf_l); - #if AXIS_IS_TMC(Z) - milliamps = stepperZ.getMilliamps(); - #else - milliamps = -1; - #endif + milliamps = TERN(Z_IS_TRINAMIC, stepperZ.getMilliamps(), -1); dtostrf(milliamps, 1, 1, public_buf_l); lv_screen_menu_item_1_edit(scr, machine_menu.Z_Current, PARA_UI_POS_X, PARA_UI_POS_Y * 3, event_handler, ID_TMC_CURRENT_Z, 2, public_buf_l); - #if AXIS_IS_TMC(E0) - milliamps = stepperE0.getMilliamps(); - #else - milliamps = -1; - #endif + milliamps = TERN(E0_IS_TRINAMIC, stepperE0.getMilliamps(), -1); dtostrf(milliamps, 1, 1, public_buf_l); lv_screen_menu_item_1_edit(scr, machine_menu.E0_Current, PARA_UI_POS_X, PARA_UI_POS_Y * 4, event_handler, ID_TMC_CURRENT_E0, 3, public_buf_l); lv_big_button_create(scr, "F:/bmp_back70x40.bin", machine_menu.next, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y, event_handler, ID_TMC_CURRENT_DOWN, true); } else { - #if AXIS_IS_TMC(E1) - milliamps = stepperE1.getMilliamps(); - #else - milliamps = -1; - #endif + milliamps = TERN(E1_IS_TRINAMIC, stepperE1.getMilliamps(), -1); dtostrf(milliamps, 1, 1, public_buf_l); lv_screen_menu_item_1_edit(scr, machine_menu.E1_Current, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_TMC_CURRENT_E1, 0, public_buf_l); @@ -137,9 +99,8 @@ void lv_draw_tmc_current_settings() { } void lv_clear_tmc_current_settings() { - #if HAS_ROTARY_ENCODER - if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); - #endif + if (TERN0(HAS_ROTARY_ENCODER, gCfgItems.encoder_enable)) + lv_group_remove_all_objs(g); lv_obj_del(scr); } diff --git a/Marlin/src/lcd/extui/ui_api.cpp b/Marlin/src/lcd/extui/ui_api.cpp index 5b6caf378a..b88df6ee9d 100644 --- a/Marlin/src/lcd/extui/ui_api.cpp +++ b/Marlin/src/lcd/extui/ui_api.cpp @@ -438,156 +438,68 @@ namespace ExtUI { #if HAS_TRINAMIC_CONFIG float getAxisCurrent_mA(const axis_t axis) { switch (axis) { - #if AXIS_IS_TMC(X) - case X: return stepperX.getMilliamps(); - #endif - #if AXIS_IS_TMC(Y) - case Y: return stepperY.getMilliamps(); - #endif - #if AXIS_IS_TMC(Z) - case Z: return stepperZ.getMilliamps(); - #endif - #if AXIS_IS_TMC(I) - case I: return stepperI.getMilliamps(); - #endif - #if AXIS_IS_TMC(J) - case J: return stepperJ.getMilliamps(); - #endif - #if AXIS_IS_TMC(K) - case K: return stepperK.getMilliamps(); - #endif - #if AXIS_IS_TMC(U) - case U: return stepperU.getMilliamps(); - #endif - #if AXIS_IS_TMC(V) - case V: return stepperV.getMilliamps(); - #endif - #if AXIS_IS_TMC(W) - case W: return stepperW.getMilliamps(); - #endif - #if AXIS_IS_TMC(X2) - case X2: return stepperX2.getMilliamps(); - #endif - #if AXIS_IS_TMC(Y2) - case Y2: return stepperY2.getMilliamps(); - #endif - #if AXIS_IS_TMC(Z2) - case Z2: return stepperZ2.getMilliamps(); - #endif - #if AXIS_IS_TMC(Z3) - case Z3: return stepperZ3.getMilliamps(); - #endif - #if AXIS_IS_TMC(Z4) - case Z4: return stepperZ4.getMilliamps(); - #endif + OPTCODE(X_IS_TRINAMIC, case X: return stepperX.getMilliamps()) + OPTCODE(Y_IS_TRINAMIC, case Y: return stepperY.getMilliamps()) + OPTCODE(Z_IS_TRINAMIC, case Z: return stepperZ.getMilliamps()) + OPTCODE(I_IS_TRINAMIC, case I: return stepperI.getMilliamps()) + OPTCODE(J_IS_TRINAMIC, case J: return stepperJ.getMilliamps()) + OPTCODE(K_IS_TRINAMIC, case K: return stepperK.getMilliamps()) + OPTCODE(U_IS_TRINAMIC, case U: return stepperU.getMilliamps()) + OPTCODE(V_IS_TRINAMIC, case V: return stepperV.getMilliamps()) + OPTCODE(W_IS_TRINAMIC, case W: return stepperW.getMilliamps()) + OPTCODE(X2_IS_TRINAMIC, case X2: return stepperX2.getMilliamps()) + OPTCODE(Y2_IS_TRINAMIC, case Y2: return stepperY2.getMilliamps()) + OPTCODE(Z2_IS_TRINAMIC, case Z2: return stepperZ2.getMilliamps()) + OPTCODE(Z3_IS_TRINAMIC, case Z3: return stepperZ3.getMilliamps()) + OPTCODE(Z4_IS_TRINAMIC, case Z4: return stepperZ4.getMilliamps()) default: return NAN; }; } float getAxisCurrent_mA(const extruder_t extruder) { switch (extruder) { - #if AXIS_IS_TMC(E0) - case E0: return stepperE0.getMilliamps(); - #endif - #if AXIS_IS_TMC(E1) - case E1: return stepperE1.getMilliamps(); - #endif - #if AXIS_IS_TMC(E2) - case E2: return stepperE2.getMilliamps(); - #endif - #if AXIS_IS_TMC(E3) - case E3: return stepperE3.getMilliamps(); - #endif - #if AXIS_IS_TMC(E4) - case E4: return stepperE4.getMilliamps(); - #endif - #if AXIS_IS_TMC(E5) - case E5: return stepperE5.getMilliamps(); - #endif - #if AXIS_IS_TMC(E6) - case E6: return stepperE6.getMilliamps(); - #endif - #if AXIS_IS_TMC(E7) - case E7: return stepperE7.getMilliamps(); - #endif + OPTCODE(E0_IS_TRINAMIC, case E0: return stepperE0.getMilliamps()) + OPTCODE(E1_IS_TRINAMIC, case E1: return stepperE1.getMilliamps()) + OPTCODE(E2_IS_TRINAMIC, case E2: return stepperE2.getMilliamps()) + OPTCODE(E3_IS_TRINAMIC, case E3: return stepperE3.getMilliamps()) + OPTCODE(E4_IS_TRINAMIC, case E4: return stepperE4.getMilliamps()) + OPTCODE(E5_IS_TRINAMIC, case E5: return stepperE5.getMilliamps()) + OPTCODE(E6_IS_TRINAMIC, case E6: return stepperE6.getMilliamps()) + OPTCODE(E7_IS_TRINAMIC, case E7: return stepperE7.getMilliamps()) default: return NAN; }; } void setAxisCurrent_mA(const_float_t mA, const axis_t axis) { switch (axis) { - #if AXIS_IS_TMC(X) - case X: stepperX.rms_current(constrain(mA, 400, 1500)); break; - #endif - #if AXIS_IS_TMC(Y) - case Y: stepperY.rms_current(constrain(mA, 400, 1500)); break; - #endif - #if AXIS_IS_TMC(Z) - case Z: stepperZ.rms_current(constrain(mA, 400, 1500)); break; - #endif - #if AXIS_IS_TMC(I) - case I: stepperI.rms_current(constrain(mA, 400, 1500)); break; - #endif - #if AXIS_IS_TMC(J) - case J: stepperJ.rms_current(constrain(mA, 400, 1500)); break; - #endif - #if AXIS_IS_TMC(K) - case K: stepperK.rms_current(constrain(mA, 400, 1500)); break; - #endif - #if AXIS_IS_TMC(U) - case U: stepperU.rms_current(constrain(mA, 400, 1500)); break; - #endif - #if AXIS_IS_TMC(V) - case V: stepperV.rms_current(constrain(mA, 400, 1500)); break; - #endif - #if AXIS_IS_TMC(W) - case W: stepperW.rms_current(constrain(mA, 400, 1500)); break; - #endif - #if AXIS_IS_TMC(X2) - case X2: stepperX2.rms_current(constrain(mA, 400, 1500)); break; - #endif - #if AXIS_IS_TMC(Y2) - case Y2: stepperY2.rms_current(constrain(mA, 400, 1500)); break; - #endif - #if AXIS_IS_TMC(Z2) - case Z2: stepperZ2.rms_current(constrain(mA, 400, 1500)); break; - #endif - #if AXIS_IS_TMC(Z3) - case Z3: stepperZ3.rms_current(constrain(mA, 400, 1500)); break; - #endif - #if AXIS_IS_TMC(Z4) - case Z4: stepperZ4.rms_current(constrain(mA, 400, 1500)); break; - #endif + case X: TERN_(X_IS_TRINAMIC, stepperX.rms_current(constrain(mA, 400, 1500))); break; + case Y: TERN_(Y_IS_TRINAMIC, stepperY.rms_current(constrain(mA, 400, 1500))); break; + case Z: TERN_(Z_IS_TRINAMIC, stepperZ.rms_current(constrain(mA, 400, 1500))); break; + case I: TERN_(I_IS_TRINAMIC, stepperI.rms_current(constrain(mA, 400, 1500))); break; + case J: TERN_(J_IS_TRINAMIC, stepperJ.rms_current(constrain(mA, 400, 1500))); break; + case K: TERN_(K_IS_TRINAMIC, stepperK.rms_current(constrain(mA, 400, 1500))); break; + case U: TERN_(U_IS_TRINAMIC, stepperU.rms_current(constrain(mA, 400, 1500))); break; + case V: TERN_(V_IS_TRINAMIC, stepperV.rms_current(constrain(mA, 400, 1500))); break; + case W: TERN_(W_IS_TRINAMIC, stepperW.rms_current(constrain(mA, 400, 1500))); break; + case X2: TERN_(X2_IS_TRINAMIC, stepperX2.rms_current(constrain(mA, 400, 1500))); break; + case Y2: TERN_(Y2_IS_TRINAMIC, stepperY2.rms_current(constrain(mA, 400, 1500))); break; + case Z2: TERN_(Z2_IS_TRINAMIC, stepperZ2.rms_current(constrain(mA, 400, 1500))); break; + case Z3: TERN_(Z3_IS_TRINAMIC, stepperZ3.rms_current(constrain(mA, 400, 1500))); break; + case Z4: TERN_(Z4_IS_TRINAMIC, stepperZ4.rms_current(constrain(mA, 400, 1500))); break; default: break; }; } void setAxisCurrent_mA(const_float_t mA, const extruder_t extruder) { switch (extruder) { - #if AXIS_IS_TMC(E0) - case E0: stepperE0.rms_current(constrain(mA, 400, 1500)); break; - #endif - #if AXIS_IS_TMC(E1) - case E1: stepperE1.rms_current(constrain(mA, 400, 1500)); break; - #endif - #if AXIS_IS_TMC(E2) - case E2: stepperE2.rms_current(constrain(mA, 400, 1500)); break; - #endif - #if AXIS_IS_TMC(E3) - case E3: stepperE3.rms_current(constrain(mA, 400, 1500)); break; - #endif - #if AXIS_IS_TMC(E4) - case E4: stepperE4.rms_current(constrain(mA, 400, 1500)); break; - #endif - #if AXIS_IS_TMC(E5) - case E5: stepperE5.rms_current(constrain(mA, 400, 1500)); break; - #endif - #if AXIS_IS_TMC(E6) - case E6: stepperE6.rms_current(constrain(mA, 400, 1500)); break; - #endif - #if AXIS_IS_TMC(E7) - case E7: stepperE7.rms_current(constrain(mA, 400, 1500)); break; - #endif + case E0: TERN_(E0_IS_TRINAMIC, stepperE0.rms_current(constrain(mA, 400, 1500))); break; + case E1: TERN_(E1_IS_TRINAMIC, stepperE1.rms_current(constrain(mA, 400, 1500))); break; + case E2: TERN_(E2_IS_TRINAMIC, stepperE2.rms_current(constrain(mA, 400, 1500))); break; + case E3: TERN_(E3_IS_TRINAMIC, stepperE3.rms_current(constrain(mA, 400, 1500))); break; + case E4: TERN_(E4_IS_TRINAMIC, stepperE4.rms_current(constrain(mA, 400, 1500))); break; + case E5: TERN_(E5_IS_TRINAMIC, stepperE5.rms_current(constrain(mA, 400, 1500))); break; + case E6: TERN_(E6_IS_TRINAMIC, stepperE6.rms_current(constrain(mA, 400, 1500))); break; + case E7: TERN_(E7_IS_TRINAMIC, stepperE7.rms_current(constrain(mA, 400, 1500))); break; default: break; }; } @@ -614,48 +526,20 @@ namespace ExtUI { void setTMCBumpSensitivity(const_float_t value, const axis_t axis) { switch (axis) { - #if X_SENSORLESS - case X: stepperX.homing_threshold(value); break; - #endif - #if Y_SENSORLESS - case Y: stepperY.homing_threshold(value); break; - #endif - #if Z_SENSORLESS - case Z: stepperZ.homing_threshold(value); break; - #endif - #if I_SENSORLESS - case I: stepperI.homing_threshold(value); break; - #endif - #if J_SENSORLESS - case J: stepperJ.homing_threshold(value); break; - #endif - #if K_SENSORLESS - case K: stepperK.homing_threshold(value); break; - #endif - #if U_SENSORLESS - case U: stepperU.homing_threshold(value); break; - #endif - #if V_SENSORLESS - case V: stepperV.homing_threshold(value); break; - #endif - #if W_SENSORLESS - case W: stepperW.homing_threshold(value); break; - #endif - #if X2_SENSORLESS - case X2: stepperX2.homing_threshold(value); break; - #endif - #if Y2_SENSORLESS - case Y2: stepperY2.homing_threshold(value); break; - #endif - #if Z2_SENSORLESS - case Z2: stepperZ2.homing_threshold(value); break; - #endif - #if Z3_SENSORLESS - case Z3: stepperZ3.homing_threshold(value); break; - #endif - #if Z4_SENSORLESS - case Z4: stepperZ4.homing_threshold(value); break; - #endif + case X: TERN_(X_SENSORLESS, stepperX.homing_threshold(value)); break; + case Y: TERN_(Y_SENSORLESS, stepperY.homing_threshold(value)); break; + case Z: TERN_(Z_SENSORLESS, stepperZ.homing_threshold(value)); break; + case I: TERN_(I_SENSORLESS, stepperI.homing_threshold(value)); break; + case J: TERN_(J_SENSORLESS, stepperJ.homing_threshold(value)); break; + case K: TERN_(K_SENSORLESS, stepperK.homing_threshold(value)); break; + case U: TERN_(U_SENSORLESS, stepperU.homing_threshold(value)); break; + case V: TERN_(V_SENSORLESS, stepperV.homing_threshold(value)); break; + case W: TERN_(W_SENSORLESS, stepperW.homing_threshold(value)); break; + case X2: TERN_(X2_SENSORLESS, stepperX2.homing_threshold(value)); break; + case Y2: TERN_(Y2_SENSORLESS, stepperY2.homing_threshold(value)); break; + case Z2: TERN_(Z2_SENSORLESS, stepperZ2.homing_threshold(value)); break; + case Z3: TERN_(Z3_SENSORLESS, stepperZ3.homing_threshold(value)); break; + case Z4: TERN_(Z4_SENSORLESS, stepperZ4.homing_threshold(value)); break; default: break; } UNUSED(value); diff --git a/Marlin/src/lcd/menu/menu_tmc.cpp b/Marlin/src/lcd/menu/menu_tmc.cpp index c708bb5fa2..f73dd971df 100644 --- a/Marlin/src/lcd/menu/menu_tmc.cpp +++ b/Marlin/src/lcd/menu/menu_tmc.cpp @@ -32,74 +32,42 @@ #include "../../module/stepper/indirection.h" #include "../../feature/tmc_util.h" -#define TMC_EDIT_STORED_I_RMS(ST,STR) EDIT_ITEM_F(uint16_4, F(STR), &stepper##ST.val_mA, 100, 3000, []{ stepper##ST.refresh_stepper_current(); }) +#define TMC_EDIT_STORED_I_RMS(ST,STR) EDIT_ITEM_FAST_F(uint16_4, F(STR), &stepper##ST.val_mA, 100, 3000, []{ stepper##ST.refresh_stepper_current(); }) void menu_tmc_current() { START_MENU(); BACK_ITEM(MSG_TMC_DRIVERS); - #if AXIS_IS_TMC(X) - TMC_EDIT_STORED_I_RMS(X, STR_A); - #endif - #if AXIS_IS_TMC(Y) - TMC_EDIT_STORED_I_RMS(Y, STR_B); - #endif - #if AXIS_IS_TMC(Z) - TMC_EDIT_STORED_I_RMS(Z, STR_C); - #endif - #if AXIS_IS_TMC(X2) - TMC_EDIT_STORED_I_RMS(X2, STR_X2); - #endif - #if AXIS_IS_TMC(Y2) - TMC_EDIT_STORED_I_RMS(Y2, STR_Y2); - #endif - #if AXIS_IS_TMC(Z2) - TMC_EDIT_STORED_I_RMS(Z2, STR_Z2); - #endif - #if AXIS_IS_TMC(Z3) - TMC_EDIT_STORED_I_RMS(Z3, STR_Z3); - #endif - #if AXIS_IS_TMC(Z4) - TMC_EDIT_STORED_I_RMS(Z4, STR_Z4); - #endif - #if AXIS_IS_TMC(E0) - TMC_EDIT_STORED_I_RMS(E0, STR_E0); - #endif - #if AXIS_IS_TMC(E1) - TMC_EDIT_STORED_I_RMS(E1, STR_E1); - #endif - #if AXIS_IS_TMC(E2) - TMC_EDIT_STORED_I_RMS(E2, STR_E2); - #endif - #if AXIS_IS_TMC(E3) - TMC_EDIT_STORED_I_RMS(E3, STR_E3); - #endif - #if AXIS_IS_TMC(E4) - TMC_EDIT_STORED_I_RMS(E4, STR_E4); - #endif - #if AXIS_IS_TMC(E5) - TMC_EDIT_STORED_I_RMS(E5, STR_E5); - #endif - #if AXIS_IS_TMC(E6) - TMC_EDIT_STORED_I_RMS(E6, STR_E6); - #endif - #if AXIS_IS_TMC(E7) - TMC_EDIT_STORED_I_RMS(E7, STR_E7); - #endif + TERN_(X_IS_TRINAMIC, TMC_EDIT_STORED_I_RMS(X, STR_A)); + TERN_(X2_IS_TRINAMIC, TMC_EDIT_STORED_I_RMS(X2, STR_X2)); + TERN_(Y_IS_TRINAMIC, TMC_EDIT_STORED_I_RMS(Y, STR_B)); + TERN_(Y2_IS_TRINAMIC, TMC_EDIT_STORED_I_RMS(Y2, STR_Y2)); + TERN_(Z_IS_TRINAMIC, TMC_EDIT_STORED_I_RMS(Z, STR_C)); + TERN_(Z2_IS_TRINAMIC, TMC_EDIT_STORED_I_RMS(Z2, STR_Z2)); + TERN_(Z3_IS_TRINAMIC, TMC_EDIT_STORED_I_RMS(Z3, STR_Z3)); + TERN_(Z4_IS_TRINAMIC, TMC_EDIT_STORED_I_RMS(Z4, STR_Z4)); + TERN_(E0_IS_TRINAMIC, TMC_EDIT_STORED_I_RMS(E0, STR_E0)); + TERN_(E1_IS_TRINAMIC, TMC_EDIT_STORED_I_RMS(E1, STR_E1)); + TERN_(E2_IS_TRINAMIC, TMC_EDIT_STORED_I_RMS(E2, STR_E2)); + TERN_(E3_IS_TRINAMIC, TMC_EDIT_STORED_I_RMS(E3, STR_E3)); + TERN_(E4_IS_TRINAMIC, TMC_EDIT_STORED_I_RMS(E4, STR_E4)); + TERN_(E5_IS_TRINAMIC, TMC_EDIT_STORED_I_RMS(E5, STR_E5)); + TERN_(E6_IS_TRINAMIC, TMC_EDIT_STORED_I_RMS(E6, STR_E6)); + TERN_(E7_IS_TRINAMIC, TMC_EDIT_STORED_I_RMS(E7, STR_E7)); END_MENU(); } #if ENABLED(HYBRID_THRESHOLD) - #define TMC_EDIT_STORED_HYBRID_THRS(ST, STR) EDIT_ITEM_F(uint16_3, F(STR), &stepper##ST.stored.hybrid_thrs, 0, STEPPER_MAX_THRS(ST), []{ stepper##ST.refresh_hybrid_thrs(); }); + #define TMC_EDIT_STORED_HYBRID_THRS(ST, STR) EDIT_ITEM_FAST_F(uint16_3, F(STR), &stepper##ST.stored.hybrid_thrs, 0, STEPPER_MAX_THRS(ST), []{ stepper##ST.refresh_hybrid_thrs(); }); void menu_tmc_hybrid_thrs() { START_MENU(); BACK_ITEM(MSG_TMC_DRIVERS); - TERN_(X_HAS_STEALTHCHOP, TMC_EDIT_STORED_HYBRID_THRS(X, STR_X)); - TERN_(Y_HAS_STEALTHCHOP, TMC_EDIT_STORED_HYBRID_THRS(Y, STR_Y)); - TERN_(Z_HAS_STEALTHCHOP, TMC_EDIT_STORED_HYBRID_THRS(Z, STR_Z)); + TERN_( X_HAS_STEALTHCHOP, TMC_EDIT_STORED_HYBRID_THRS(X, STR_X)); TERN_(X2_HAS_STEALTHCHOP, TMC_EDIT_STORED_HYBRID_THRS(X2, STR_X2)); + TERN_( Y_HAS_STEALTHCHOP, TMC_EDIT_STORED_HYBRID_THRS(Y, STR_Y)); TERN_(Y2_HAS_STEALTHCHOP, TMC_EDIT_STORED_HYBRID_THRS(Y2, STR_Y2)); + TERN_( Z_HAS_STEALTHCHOP, TMC_EDIT_STORED_HYBRID_THRS(Z, STR_Z)); TERN_(Z2_HAS_STEALTHCHOP, TMC_EDIT_STORED_HYBRID_THRS(Z2, STR_Z2)); TERN_(Z3_HAS_STEALTHCHOP, TMC_EDIT_STORED_HYBRID_THRS(Z3, STR_Z3)); TERN_(Z4_HAS_STEALTHCHOP, TMC_EDIT_STORED_HYBRID_THRS(Z4, STR_Z4)); @@ -114,7 +82,7 @@ void menu_tmc_current() { END_MENU(); } -#endif +#endif // HYBRID_THRESHOLD #if ENABLED(SENSORLESS_HOMING) @@ -140,7 +108,7 @@ void menu_tmc_current() { END_MENU(); } -#endif +#endif // SENSORLESS_HOMING #if HAS_STEALTHCHOP @@ -169,7 +137,7 @@ void menu_tmc_current() { END_MENU(); } -#endif +#endif // HAS_STEALTHCHOP void menu_tmc() { START_MENU(); diff --git a/Marlin/src/lcd/sovol_rts/sovol_rts.cpp b/Marlin/src/lcd/sovol_rts/sovol_rts.cpp index 1f3322ded7..c92850494b 100644 --- a/Marlin/src/lcd/sovol_rts/sovol_rts.cpp +++ b/Marlin/src/lcd/sovol_rts/sovol_rts.cpp @@ -122,7 +122,6 @@ bool card_insert_st; bool sd_printing; int16_t fan_speed; -char cmd[MAX_CMD_SIZE + 16]; inline void RTS_line_to_current(const AxisEnum axis) { if (!planner.is_full()) @@ -1398,18 +1397,10 @@ void RTS::handleData() { case TMCDriver: switch (recdat.data[0]) { case 1: // Current - #if AXIS_IS_TMC(X) - sendData(stepperX.getMilliamps(), Current_X_VP); - #endif - #if AXIS_IS_TMC(Y) - sendData(stepperY.getMilliamps(), Current_Y_VP); - #endif - #if AXIS_IS_TMC(Z) - sendData(stepperZ.getMilliamps(), Current_Z_VP); - #endif - #if AXIS_IS_TMC(E0) - sendData(stepperE0.getMilliamps(), Current_E_VP); - #endif + TERN_(X_IS_TRINAMIC, sendData(stepperX.getMilliamps(), Current_X_VP)); + TERN_(Y_IS_TRINAMIC, sendData(stepperY.getMilliamps(), Current_Y_VP)); + TERN_(Z_IS_TRINAMIC, sendData(stepperZ.getMilliamps(), Current_Z_VP)); + TERN_(E0_IS_TRINAMIC, sendData(stepperE0.getMilliamps(), Current_E_VP)); gotoPage(ID_DriverA_L, ID_DriverA_D); break; @@ -1434,39 +1425,19 @@ void RTS::handleData() { } break; - #if AXIS_IS_TMC(X) - case Current_X: sprintf_P(cmd, PSTR("M906 X%i"), recdat.data[0]); queue.inject(cmd); break; - #endif - #if X_HAS_STEALTHCHOP - case Threshold_X: sprintf_P(cmd, PSTR("M913 X%i"), recdat.data[0]); queue.inject(cmd); break; - #endif - #if X_SENSORLESS - case Sensorless_X: sprintf_P(cmd, PSTR("M914 X%i"), recdat.data[0]); queue.inject(cmd); break; - #endif + case Current_X: TERN_(X_IS_TRINAMIC, queue.inject(TS(F("M906X"), int(recdat.data[0])))); break; + case Threshold_X: TERN_(X_HAS_STEALTHCHOP, queue.inject(TS(F("M913X"), int(recdat.data[0])))); break; + case Sensorless_X: TERN_(X_SENSORLESS, queue.inject(TS(F("M914X"), int(recdat.data[0])))); break; - #if AXIS_IS_TMC(Y) - case Current_Y: sprintf_P(cmd, PSTR("M906 Y%i"), recdat.data[0]); queue.inject(cmd); break; - #endif - #if Y_HAS_STEALTHCHOP - case Threshold_Y: sprintf_P(cmd, PSTR("M913 Y%i"), recdat.data[0]); queue.inject(cmd); break; - #endif - #if Y_SENSORLESS - case Sensorless_Y: sprintf_P(cmd, PSTR("M914 Y%i"), recdat.data[0]); queue.inject(cmd); break; - #endif + case Current_Y: TERN_(X_IS_TRINAMIC, queue.inject(TS(F("M906Y"), int(recdat.data[0])))); break; + case Threshold_Y: TERN_(Y_HAS_STEALTHCHOP, queue.inject(TS(F("M913Y"), int(recdat.data[0])))); break; + case Sensorless_Y: TERN_(Y_SENSORLESS, queue.inject(TS(F("M914Y"), int(recdat.data[0])))); break; - #if AXIS_IS_TMC(Z) - case Current_Z: sprintf_P(cmd, PSTR("M906 Z%i"), recdat.data[0]); queue.inject(cmd); break; - #endif - #if Z_HAS_STEALTHCHOP - case Threshold_Z: sprintf_P(cmd, PSTR("M913 Z%i"), recdat.data[0]); queue.inject(cmd); break; - #endif + case Current_Z: TERN_(Z_IS_TRINAMIC, queue.inject(TS(F("M906Z"), int(recdat.data[0])))); break; + case Threshold_Z: TERN_(Z_HAS_STEALTHCHOP, queue.inject(TS(F("M913Z"), int(recdat.data[0])))); break; - #if AXIS_IS_TMC(E0) - case Current_E: sprintf_P(cmd, PSTR("M906 E%i"), recdat.data[0]); queue.inject(cmd); break; - #endif - #if E0_HAS_STEALTHCHOP - case Threshold_E: sprintf_P(cmd, PSTR("M913 E%i"), recdat.data[0]); queue.inject(cmd); break; - #endif + case Current_E: TERN_(AXIS_IS_TMC_E, queue.inject(TS(F("M906E"), int(recdat.data[0])))); break; + case Threshold_E: TERN_(E_HAS_STEALTHCHOP, queue.inject(TS(F("M913E"), int(recdat.data[0])))); break; #endif // HAS_TRINAMIC_CONFIG diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index 6a039c8ab9..386d46665d 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -271,46 +271,46 @@ void report_current_position_projected() { #define debug_current(...) #endif - #if HAS_CURRENT_HOME(X) + #if HAS_CURRENT_HOME_X int16_t saved_current_X; #endif - #if HAS_CURRENT_HOME(Y) + #if HAS_CURRENT_HOME_Y int16_t saved_current_Y; #endif - #if HAS_CURRENT_HOME(Z) + #if HAS_CURRENT_HOME_Z int16_t saved_current_Z; #endif - #if HAS_CURRENT_HOME(X2) + #if HAS_CURRENT_HOME_X2 int16_t saved_current_X2; #endif - #if HAS_CURRENT_HOME(Y2) + #if HAS_CURRENT_HOME_Y2 int16_t saved_current_Y2; #endif - #if HAS_CURRENT_HOME(Z2) + #if HAS_CURRENT_HOME_Z2 int16_t saved_current_Z2; #endif - #if HAS_CURRENT_HOME(Z3) + #if HAS_CURRENT_HOME_Z3 int16_t saved_current_Z3; #endif - #if HAS_CURRENT_HOME(Z4) + #if HAS_CURRENT_HOME_Z4 int16_t saved_current_Z4; #endif - #if HAS_CURRENT_HOME(I) + #if HAS_CURRENT_HOME_I int16_t saved_current_I; #endif - #if HAS_CURRENT_HOME(J) + #if HAS_CURRENT_HOME_J int16_t saved_current_J; #endif - #if HAS_CURRENT_HOME(K) + #if HAS_CURRENT_HOME_K int16_t saved_current_K; #endif - #if HAS_CURRENT_HOME(U) + #if HAS_CURRENT_HOME_U int16_t saved_current_U; #endif - #if HAS_CURRENT_HOME(V) + #if HAS_CURRENT_HOME_V int16_t saved_current_V; #endif - #if HAS_CURRENT_HOME(W) + #if HAS_CURRENT_HOME_W int16_t saved_current_W; #endif @@ -326,6 +326,8 @@ void report_current_position_projected() { stepper##A.rms_current(A##_CURRENT_HOME); \ debug_current(F(STR_##A), saved_current_##A, A##_CURRENT_HOME) + #define _MAP_SAVE_SET(A) OPTCODE(A##_HAS_HOME_CURRENT, _SAVE_SET_CURRENT(A)) + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Setting homing driver current"); #if ANY(CORE_IS_XY, MARKFORGED_XY, MARKFORGED_YX) @@ -333,34 +335,8 @@ void report_current_position_projected() { // CORE and Markforged kinematics switch (axis) { default: break; - case X_AXIS: case Y_AXIS: - #if HAS_CURRENT_HOME(X) - _SAVE_SET_CURRENT(X); - #endif - #if HAS_CURRENT_HOME(X2) - _SAVE_SET_CURRENT(X2); - #endif - #if HAS_CURRENT_HOME(Y) - _SAVE_SET_CURRENT(Y); - #endif - #if HAS_CURRENT_HOME(Y2) - _SAVE_SET_CURRENT(Y2); - #endif - break; - case Z_AXIS: - #if HAS_CURRENT_HOME(Z) - _SAVE_SET_CURRENT(Z); - #endif - #if HAS_CURRENT_HOME(Z2) - _SAVE_SET_CURRENT(Z2); - #endif - #if HAS_CURRENT_HOME(Z3) - _SAVE_SET_CURRENT(Z3); - #endif - #if HAS_CURRENT_HOME(Z4) - _SAVE_SET_CURRENT(Z4); - #endif - break; + case X_AXIS: case Y_AXIS: MAP(_MAP_SAVE_SET, X, X2, Y, Y2); break; + case Z_AXIS: MAP(_MAP_SAVE_SET, Z, Z2, Z3, Z4); break; } #elif CORE_IS_XZ @@ -368,22 +344,8 @@ void report_current_position_projected() { // CORE XZ / ZX switch (axis) { default: break; - case X_AXIS: case Z_AXIS: - #if HAS_CURRENT_HOME(X) - _SAVE_SET_CURRENT(X); - #endif - #if HAS_CURRENT_HOME(Z) - _SAVE_SET_CURRENT(Z); - #endif - break; - case Y_AXIS: - #if HAS_CURRENT_HOME(Y) - _SAVE_SET_CURRENT(Y); - #endif - #if HAS_CURRENT_HOME(Y2) - _SAVE_SET_CURRENT(Y2); - #endif - break; + case X_AXIS: case Z_AXIS: MAP(_MAP_SAVE_SET, X, Z); break; + case Y_AXIS: MAP(_MAP_SAVE_SET, Y, Y2); break; } #elif CORE_IS_YZ @@ -391,22 +353,8 @@ void report_current_position_projected() { // CORE YZ / ZY switch (axis) { default: break; - case X_AXIS: - #if HAS_CURRENT_HOME(X) - _SAVE_SET_CURRENT(X); - #endif - #if HAS_CURRENT_HOME(X2) - _SAVE_SET_CURRENT(X2); - #endif - break; - case Y_AXIS: case Z_AXIS: - #if HAS_CURRENT_HOME(Y) - _SAVE_SET_CURRENT(Y); - #endif - #if HAS_CURRENT_HOME(Z) - _SAVE_SET_CURRENT(Z); - #endif - break; + case X_AXIS: MAP(_MAP_SAVE_SET, X, X2); break; + case Y_AXIS: case Z_AXIS: MAP(_MAP_SAVE_SET, Y, Z); break; } #elif IS_SCARA @@ -414,13 +362,13 @@ void report_current_position_projected() { // SCARA kinematics switch (axis) { default: break; - #if HAS_CURRENT_HOME(X) + #if X_HAS_HOME_CURRENT case A_AXIS: _SAVE_SET_CURRENT(X); break; #endif - #if HAS_CURRENT_HOME(Y) + #if Y_HAS_HOME_CURRENT case B_AXIS: _SAVE_SET_CURRENT(Y); break; #endif - #if HAS_CURRENT_HOME(Z) + #if Z_HAS_HOME_CURRENT case C_AXIS: _SAVE_SET_CURRENT(Z); break; #endif } @@ -429,13 +377,13 @@ void report_current_position_projected() { // TPARA or DELTA kinematics. // Z_AXIS is a special mode to apply homing current to all axes. - #if HAS_CURRENT_HOME(X) + #if X_HAS_HOME_CURRENT if (axis == A_AXIS || axis == Z_AXIS) _SAVE_SET_CURRENT(X); #endif - #if HAS_CURRENT_HOME(Y) + #if Y_HAS_HOME_CURRENT if (axis == B_AXIS || axis == Z_AXIS) _SAVE_SET_CURRENT(Y); #endif - #if HAS_CURRENT_HOME(Z) + #if Z_HAS_HOME_CURRENT if (axis == C_AXIS) _SAVE_SET_CURRENT(Z); #endif @@ -444,13 +392,13 @@ void report_current_position_projected() { // POLAR kinematics switch (axis) { default: break; - #if HAS_CURRENT_HOME(X) + #if X_HAS_HOME_CURRENT case A_AXIS: _SAVE_SET_CURRENT(X); break; #endif - #if HAS_CURRENT_HOME(Y) + #if Y_HAS_HOME_CURRENT case B_AXIS: _SAVE_SET_CURRENT(Y); break; #endif - #if HAS_CURRENT_HOME(Z) + #if Z_HAS_HOME_CURRENT case C_AXIS: _SAVE_SET_CURRENT(Z); break; #endif } @@ -461,13 +409,13 @@ void report_current_position_projected() { // Useful? switch (axis) { default: break; - #if HAS_CURRENT_HOME(X) + #if X_HAS_HOME_CURRENT case A_AXIS: _SAVE_SET_CURRENT(X); break; #endif - #if HAS_CURRENT_HOME(Y) + #if Y_HAS_HOME_CURRENT case B_AXIS: _SAVE_SET_CURRENT(Y); break; #endif - #if HAS_CURRENT_HOME(Z) + #if Z_HAS_HOME_CURRENT case C_AXIS: _SAVE_SET_CURRENT(Z); break; #endif } @@ -477,27 +425,9 @@ void report_current_position_projected() { // Foam cutter switch (axis) { default: break; - case X_AXIS: case I_AXIS: - #if HAS_CURRENT_HOME(X) - _SAVE_SET_CURRENT(X); - #endif - #if HAS_CURRENT_HOME(I) - _SAVE_SET_CURRENT(I); - #endif - break; - case Y_AXIS: case J_AXIS: - #if HAS_CURRENT_HOME(Y) - _SAVE_SET_CURRENT(Y); - #endif - #if HAS_CURRENT_HOME(J) - _SAVE_SET_CURRENT(J); - #endif - break; - case Z_AXIS: - #if HAS_CURRENT_HOME(Z) - _SAVE_SET_CURRENT(Z); - #endif - break; + case X_AXIS: case I_AXIS: MAP(_MAP_SAVE_SET, X, I); break; + case Y_AXIS: case J_AXIS: MAP(_MAP_SAVE_SET, Y, J); break; + case Z_AXIS: MAP(_MAP_SAVE_SET, Z); break; } #else @@ -505,58 +435,31 @@ void report_current_position_projected() { // Cartesian kinematics switch (axis) { default: break; - case X_AXIS: - #if HAS_CURRENT_HOME(X) - _SAVE_SET_CURRENT(X); - #endif - #if HAS_CURRENT_HOME(X2) - _SAVE_SET_CURRENT(X2); - #endif - break; - case Y_AXIS: - #if HAS_CURRENT_HOME(Y) - _SAVE_SET_CURRENT(Y); - #endif - #if HAS_CURRENT_HOME(Y2) - _SAVE_SET_CURRENT(Y2); - #endif - break; - case Z_AXIS: - #if HAS_CURRENT_HOME(Z) - _SAVE_SET_CURRENT(Z); - #endif - #if HAS_CURRENT_HOME(Z2) - _SAVE_SET_CURRENT(Z2); - #endif - #if HAS_CURRENT_HOME(Z3) - _SAVE_SET_CURRENT(Z3); - #endif - #if HAS_CURRENT_HOME(Z4) - _SAVE_SET_CURRENT(Z4); - #endif - break; + case X_AXIS: MAP(_MAP_SAVE_SET, X, X2); break; + case Y_AXIS: MAP(_MAP_SAVE_SET, Y, Y2); break; + case Z_AXIS: MAP(_MAP_SAVE_SET, Z, Z2, Z3, Z4); break; } #endif // kinematics switch (axis) { default: break; - #if HAS_CURRENT_HOME(I) && DISABLED(FOAMCUTTER_XYUV) + #if I_HAS_HOME_CURRENT && DISABLED(FOAMCUTTER_XYUV) case I_AXIS: _SAVE_SET_CURRENT(I); break; #endif - #if HAS_CURRENT_HOME(J) && DISABLED(FOAMCUTTER_XYUV) + #if J_HAS_HOME_CURRENT && DISABLED(FOAMCUTTER_XYUV) case J_AXIS: _SAVE_SET_CURRENT(J); break; #endif - #if HAS_CURRENT_HOME(K) + #if K_HAS_HOME_CURRENT case K_AXIS: _SAVE_SET_CURRENT(K); break; #endif - #if HAS_CURRENT_HOME(U) + #if U_HAS_HOME_CURRENT case U_AXIS: _SAVE_SET_CURRENT(U); break; #endif - #if HAS_CURRENT_HOME(V) + #if V_HAS_HOME_CURRENT case V_AXIS: _SAVE_SET_CURRENT(V); break; #endif - #if HAS_CURRENT_HOME(W) + #if W_HAS_HOME_CURRENT case W_AXIS: _SAVE_SET_CURRENT(W); break; #endif } @@ -578,6 +481,8 @@ void report_current_position_projected() { stepper##A.rms_current(saved_current_##A); \ debug_current(F(STR_##A), A##_CURRENT_HOME, saved_current_##A) + #define _MAP_RESTORE(A) OPTCODE(A##_HAS_HOME_CURRENT, _RESTORE_CURRENT(A)) + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Restore driver current"); #if ANY(CORE_IS_XY, MARKFORGED_XY, MARKFORGED_YX) @@ -585,28 +490,8 @@ void report_current_position_projected() { // CORE and Markforged kinematics switch (axis) { default: break; - case X_AXIS: case Y_AXIS: - #if HAS_CURRENT_HOME(X) - _RESTORE_CURRENT(X); - #endif - #if HAS_CURRENT_HOME(Y) - _RESTORE_CURRENT(Y); - #endif - break; - case Z_AXIS: - #if HAS_CURRENT_HOME(Z) - _RESTORE_CURRENT(Z); - #endif - #if HAS_CURRENT_HOME(Z2) - _RESTORE_CURRENT(Z2); - #endif - #if HAS_CURRENT_HOME(Z3) - _RESTORE_CURRENT(Z3); - #endif - #if HAS_CURRENT_HOME(Z4) - _RESTORE_CURRENT(Z4); - #endif - break; + case X_AXIS: case Y_AXIS: MAP(_MAP_RESTORE, X, Y); break; + case Z_AXIS: MAP(_MAP_RESTORE, Z, Z2, Z3, Z4); break; } #elif CORE_IS_XZ @@ -614,22 +499,8 @@ void report_current_position_projected() { // CORE XZ / ZX switch (axis) { default: break; - case X_AXIS: case Z_AXIS: - #if HAS_CURRENT_HOME(X) - _RESTORE_CURRENT(X); - #endif - #if HAS_CURRENT_HOME(Z) - _RESTORE_CURRENT(Z); - #endif - break; - case Y_AXIS: - #if HAS_CURRENT_HOME(Y) - _RESTORE_CURRENT(Y); - #endif - #if HAS_CURRENT_HOME(Y2) - _RESTORE_CURRENT(Y2); - #endif - break; + case X_AXIS: case Z_AXIS: MAP(_MAP_RESTORE, X, Z); break; + case Y_AXIS: MAP(_MAP_RESTORE, Y, Y2); break; } #elif CORE_IS_YZ @@ -637,22 +508,8 @@ void report_current_position_projected() { // CORE YZ / ZY switch (axis) { default: break; - case X_AXIS: - #if HAS_CURRENT_HOME(X) - _RESTORE_CURRENT(X); - #endif - #if HAS_CURRENT_HOME(X2) - _RESTORE_CURRENT(X2); - #endif - break; - case Y_AXIS: case Z_AXIS: - #if HAS_CURRENT_HOME(Y) - _RESTORE_CURRENT(Y); - #endif - #if HAS_CURRENT_HOME(Z) - _RESTORE_CURRENT(Z); - #endif - break; + case X_AXIS: MAP(_MAP_RESTORE, X, X2); break; + case Y_AXIS: case Z_AXIS: MAP(_MAP_RESTORE, Y, Z); break; } #elif IS_SCARA // Unsupported for now? @@ -660,13 +517,13 @@ void report_current_position_projected() { // SCARA kinematics switch (axis) { default: break; - #if HAS_CURRENT_HOME(X) + #if X_HAS_HOME_CURRENT case A_AXIS: _RESTORE_CURRENT(X); break; #endif - #if HAS_CURRENT_HOME(Y) + #if Y_HAS_HOME_CURRENT case B_AXIS: _RESTORE_CURRENT(Y); break; #endif - #if HAS_CURRENT_HOME(Z) + #if Z_HAS_HOME_CURRENT case C_AXIS: _RESTORE_CURRENT(Z); break; #endif } @@ -675,13 +532,13 @@ void report_current_position_projected() { // TPARA or DELTA kinematics // Z_AXIS is a special mode to set homing current to all axes - #if HAS_CURRENT_HOME(X) + #if X_HAS_HOME_CURRENT if (axis == A_AXIS || axis == Z_AXIS) _RESTORE_CURRENT(X); #endif - #if HAS_CURRENT_HOME(Y) + #if Y_HAS_HOME_CURRENT if (axis == B_AXIS || axis == Z_AXIS) _RESTORE_CURRENT(Y); #endif - #if HAS_CURRENT_HOME(Z) + #if Z_HAS_HOME_CURRENT if (axis == C_AXIS) _RESTORE_CURRENT(Z); #endif @@ -690,13 +547,13 @@ void report_current_position_projected() { // POLAR kinematics switch (axis) { default: break; - #if HAS_CURRENT_HOME(X) + #if X_HAS_HOME_CURRENT case A_AXIS: _RESTORE_CURRENT(X); break; #endif - #if HAS_CURRENT_HOME(Y) + #if Y_HAS_HOME_CURRENT case B_AXIS: _RESTORE_CURRENT(Y); break; #endif - #if HAS_CURRENT_HOME(Z) + #if Z_HAS_HOME_CURRENT case C_AXIS: _RESTORE_CURRENT(Z); break; #endif } @@ -707,13 +564,13 @@ void report_current_position_projected() { // Useful? switch (axis) { default: break; - #if HAS_CURRENT_HOME(X) + #if X_HAS_HOME_CURRENT case A_AXIS: _RESTORE_CURRENT(X); break; #endif - #if HAS_CURRENT_HOME(Y) + #if Y_HAS_HOME_CURRENT case B_AXIS: _RESTORE_CURRENT(Y); break; #endif - #if HAS_CURRENT_HOME(Z) + #if Z_HAS_HOME_CURRENT case C_AXIS: _RESTORE_CURRENT(Z); break; #endif } @@ -723,27 +580,9 @@ void report_current_position_projected() { // Foam cutter switch (axis) { default: break; - case X_AXIS: case I_AXIS: - #if HAS_CURRENT_HOME(X) - _RESTORE_CURRENT(X); - #endif - #if HAS_CURRENT_HOME(I) - _RESTORE_CURRENT(I); - #endif - break; - case Y_AXIS: case J_AXIS: - #if HAS_CURRENT_HOME(Y) - _RESTORE_CURRENT(Y); - #endif - #if HAS_CURRENT_HOME(J) - _RESTORE_CURRENT(J); - #endif - break; - case Z_AXIS: - #if HAS_CURRENT_HOME(Z) - _RESTORE_CURRENT(Z); - #endif - break; + case X_AXIS: case I_AXIS: MAP(_MAP_RESTORE, X, I); break; + case Y_AXIS: case J_AXIS: MAP(_MAP_RESTORE, Y, J); break; + case Z_AXIS: MAP(_MAP_RESTORE, Z); break; } #else @@ -751,58 +590,31 @@ void report_current_position_projected() { // Cartesian kinematics switch (axis) { default: break; - case X_AXIS: - #if HAS_CURRENT_HOME(X) - _RESTORE_CURRENT(X); - #endif - #if HAS_CURRENT_HOME(X2) - _RESTORE_CURRENT(X2); - #endif - break; - case Y_AXIS: - #if HAS_CURRENT_HOME(Y) - _RESTORE_CURRENT(Y); - #endif - #if HAS_CURRENT_HOME(Y2) - _RESTORE_CURRENT(Y2); - #endif - break; - case Z_AXIS: - #if HAS_CURRENT_HOME(Z) - _RESTORE_CURRENT(Z); - #endif - #if HAS_CURRENT_HOME(Z2) - _RESTORE_CURRENT(Z2); - #endif - #if HAS_CURRENT_HOME(Z3) - _RESTORE_CURRENT(Z3); - #endif - #if HAS_CURRENT_HOME(Z4) - _RESTORE_CURRENT(Z4); - #endif - break; + case X_AXIS: MAP(_MAP_RESTORE, X, X2); break; + case Y_AXIS: MAP(_MAP_RESTORE, Y, Y2); break; + case Z_AXIS: MAP(_MAP_RESTORE, Z, Z2, Z3, Z4); break; } #endif // kinematics switch (axis) { default: break; - #if HAS_CURRENT_HOME(I) && DISABLED(FOAMCUTTER_XYUV) + #if I_HAS_HOME_CURRENT && DISABLED(FOAMCUTTER_XYUV) case I_AXIS: _RESTORE_CURRENT(I); break; #endif - #if HAS_CURRENT_HOME(J) && DISABLED(FOAMCUTTER_XYUV) + #if J_HAS_HOME_CURRENT && DISABLED(FOAMCUTTER_XYUV) case J_AXIS: _RESTORE_CURRENT(J); break; #endif - #if HAS_CURRENT_HOME(K) + #if K_HAS_HOME_CURRENT case K_AXIS: _RESTORE_CURRENT(K); break; #endif - #if HAS_CURRENT_HOME(U) + #if U_HAS_HOME_CURRENT case U_AXIS: _RESTORE_CURRENT(U); break; #endif - #if HAS_CURRENT_HOME(V) + #if V_HAS_HOME_CURRENT case V_AXIS: _RESTORE_CURRENT(V); break; #endif - #if HAS_CURRENT_HOME(W) + #if W_HAS_HOME_CURRENT case W_AXIS: _RESTORE_CURRENT(W); break; #endif } diff --git a/Marlin/src/module/motion.h b/Marlin/src/module/motion.h index 6d3bfaed0d..18376cf773 100644 --- a/Marlin/src/module/motion.h +++ b/Marlin/src/module/motion.h @@ -636,6 +636,9 @@ void home_if_needed(const bool keeplev=false); void set_home_offset(const AxisEnum axis, const_float_t v); #endif +// +// Trinamic Stepper Drivers +// #if USE_SENSORLESS struct sensorless_t; sensorless_t start_sensorless_homing_per_axis(const AxisEnum axis); diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index 8c33e73f00..a7e791951b 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -1393,72 +1393,28 @@ void MarlinSettings::postprocess() { per_stepper_uint16_t tmc_stepper_current{0}; #if HAS_TRINAMIC_CONFIG - #if AXIS_IS_TMC(X) - tmc_stepper_current.X = stepperX.getMilliamps(); - #endif - #if AXIS_IS_TMC(Y) - tmc_stepper_current.Y = stepperY.getMilliamps(); - #endif - #if AXIS_IS_TMC(Z) - tmc_stepper_current.Z = stepperZ.getMilliamps(); - #endif - #if AXIS_IS_TMC(I) - tmc_stepper_current.I = stepperI.getMilliamps(); - #endif - #if AXIS_IS_TMC(J) - tmc_stepper_current.J = stepperJ.getMilliamps(); - #endif - #if AXIS_IS_TMC(K) - tmc_stepper_current.K = stepperK.getMilliamps(); - #endif - #if AXIS_IS_TMC(U) - tmc_stepper_current.U = stepperU.getMilliamps(); - #endif - #if AXIS_IS_TMC(V) - tmc_stepper_current.V = stepperV.getMilliamps(); - #endif - #if AXIS_IS_TMC(W) - tmc_stepper_current.W = stepperW.getMilliamps(); - #endif - #if AXIS_IS_TMC(X2) - tmc_stepper_current.X2 = stepperX2.getMilliamps(); - #endif - #if AXIS_IS_TMC(Y2) - tmc_stepper_current.Y2 = stepperY2.getMilliamps(); - #endif - #if AXIS_IS_TMC(Z2) - tmc_stepper_current.Z2 = stepperZ2.getMilliamps(); - #endif - #if AXIS_IS_TMC(Z3) - tmc_stepper_current.Z3 = stepperZ3.getMilliamps(); - #endif - #if AXIS_IS_TMC(Z4) - tmc_stepper_current.Z4 = stepperZ4.getMilliamps(); - #endif - #if AXIS_IS_TMC(E0) - tmc_stepper_current.E0 = stepperE0.getMilliamps(); - #endif - #if AXIS_IS_TMC(E1) - tmc_stepper_current.E1 = stepperE1.getMilliamps(); - #endif - #if AXIS_IS_TMC(E2) - tmc_stepper_current.E2 = stepperE2.getMilliamps(); - #endif - #if AXIS_IS_TMC(E3) - tmc_stepper_current.E3 = stepperE3.getMilliamps(); - #endif - #if AXIS_IS_TMC(E4) - tmc_stepper_current.E4 = stepperE4.getMilliamps(); - #endif - #if AXIS_IS_TMC(E5) - tmc_stepper_current.E5 = stepperE5.getMilliamps(); - #endif - #if AXIS_IS_TMC(E6) - tmc_stepper_current.E6 = stepperE6.getMilliamps(); - #endif - #if AXIS_IS_TMC(E7) - tmc_stepper_current.E7 = stepperE7.getMilliamps(); - #endif + TERN_(X_IS_TRINAMIC, tmc_stepper_current.X = stepperX.getMilliamps()); + TERN_(Y_IS_TRINAMIC, tmc_stepper_current.Y = stepperY.getMilliamps()); + TERN_(Z_IS_TRINAMIC, tmc_stepper_current.Z = stepperZ.getMilliamps()); + TERN_(I_IS_TRINAMIC, tmc_stepper_current.I = stepperI.getMilliamps()); + TERN_(J_IS_TRINAMIC, tmc_stepper_current.J = stepperJ.getMilliamps()); + TERN_(K_IS_TRINAMIC, tmc_stepper_current.K = stepperK.getMilliamps()); + TERN_(U_IS_TRINAMIC, tmc_stepper_current.U = stepperU.getMilliamps()); + TERN_(V_IS_TRINAMIC, tmc_stepper_current.V = stepperV.getMilliamps()); + TERN_(W_IS_TRINAMIC, tmc_stepper_current.W = stepperW.getMilliamps()); + TERN_(X2_IS_TRINAMIC, tmc_stepper_current.X2 = stepperX2.getMilliamps()); + TERN_(Y2_IS_TRINAMIC, tmc_stepper_current.Y2 = stepperY2.getMilliamps()); + TERN_(Z2_IS_TRINAMIC, tmc_stepper_current.Z2 = stepperZ2.getMilliamps()); + TERN_(Z3_IS_TRINAMIC, tmc_stepper_current.Z3 = stepperZ3.getMilliamps()); + TERN_(Z4_IS_TRINAMIC, tmc_stepper_current.Z4 = stepperZ4.getMilliamps()); + TERN_(E0_IS_TRINAMIC, tmc_stepper_current.E0 = stepperE0.getMilliamps()); + TERN_(E1_IS_TRINAMIC, tmc_stepper_current.E1 = stepperE1.getMilliamps()); + TERN_(E2_IS_TRINAMIC, tmc_stepper_current.E2 = stepperE2.getMilliamps()); + TERN_(E3_IS_TRINAMIC, tmc_stepper_current.E3 = stepperE3.getMilliamps()); + TERN_(E4_IS_TRINAMIC, tmc_stepper_current.E4 = stepperE4.getMilliamps()); + TERN_(E5_IS_TRINAMIC, tmc_stepper_current.E5 = stepperE5.getMilliamps()); + TERN_(E6_IS_TRINAMIC, tmc_stepper_current.E6 = stepperE6.getMilliamps()); + TERN_(E7_IS_TRINAMIC, tmc_stepper_current.E7 = stepperE7.getMilliamps()); #endif EEPROM_WRITE(tmc_stepper_current); } @@ -2499,72 +2455,28 @@ void MarlinSettings::postprocess() { #define SET_CURR(Q) stepper##Q.rms_current(currents.Q ? currents.Q : Q##_CURRENT) if (!validating) { - #if AXIS_IS_TMC(X) - SET_CURR(X); - #endif - #if AXIS_IS_TMC(Y) - SET_CURR(Y); - #endif - #if AXIS_IS_TMC(Z) - SET_CURR(Z); - #endif - #if AXIS_IS_TMC(X2) - SET_CURR(X2); - #endif - #if AXIS_IS_TMC(Y2) - SET_CURR(Y2); - #endif - #if AXIS_IS_TMC(Z2) - SET_CURR(Z2); - #endif - #if AXIS_IS_TMC(Z3) - SET_CURR(Z3); - #endif - #if AXIS_IS_TMC(Z4) - SET_CURR(Z4); - #endif - #if AXIS_IS_TMC(I) - SET_CURR(I); - #endif - #if AXIS_IS_TMC(J) - SET_CURR(J); - #endif - #if AXIS_IS_TMC(K) - SET_CURR(K); - #endif - #if AXIS_IS_TMC(U) - SET_CURR(U); - #endif - #if AXIS_IS_TMC(V) - SET_CURR(V); - #endif - #if AXIS_IS_TMC(W) - SET_CURR(W); - #endif - #if AXIS_IS_TMC(E0) - SET_CURR(E0); - #endif - #if AXIS_IS_TMC(E1) - SET_CURR(E1); - #endif - #if AXIS_IS_TMC(E2) - SET_CURR(E2); - #endif - #if AXIS_IS_TMC(E3) - SET_CURR(E3); - #endif - #if AXIS_IS_TMC(E4) - SET_CURR(E4); - #endif - #if AXIS_IS_TMC(E5) - SET_CURR(E5); - #endif - #if AXIS_IS_TMC(E6) - SET_CURR(E6); - #endif - #if AXIS_IS_TMC(E7) - SET_CURR(E7); - #endif + TERN_(X_IS_TRINAMIC, SET_CURR(X)); + TERN_(Y_IS_TRINAMIC, SET_CURR(Y)); + TERN_(Z_IS_TRINAMIC, SET_CURR(Z)); + TERN_(I_IS_TRINAMIC, SET_CURR(I)); + TERN_(J_IS_TRINAMIC, SET_CURR(J)); + TERN_(K_IS_TRINAMIC, SET_CURR(K)); + TERN_(U_IS_TRINAMIC, SET_CURR(U)); + TERN_(V_IS_TRINAMIC, SET_CURR(V)); + TERN_(W_IS_TRINAMIC, SET_CURR(W)); + TERN_(X2_IS_TRINAMIC, SET_CURR(X2)); + TERN_(Y2_IS_TRINAMIC, SET_CURR(Y2)); + TERN_(Z2_IS_TRINAMIC, SET_CURR(Z2)); + TERN_(Z3_IS_TRINAMIC, SET_CURR(Z3)); + TERN_(Z4_IS_TRINAMIC, SET_CURR(Z4)); + TERN_(E0_IS_TRINAMIC, SET_CURR(E0)); + TERN_(E1_IS_TRINAMIC, SET_CURR(E1)); + TERN_(E2_IS_TRINAMIC, SET_CURR(E2)); + TERN_(E3_IS_TRINAMIC, SET_CURR(E3)); + TERN_(E4_IS_TRINAMIC, SET_CURR(E4)); + TERN_(E5_IS_TRINAMIC, SET_CURR(E5)); + TERN_(E6_IS_TRINAMIC, SET_CURR(E6)); + TERN_(E7_IS_TRINAMIC, SET_CURR(E7)); } #endif } diff --git a/Marlin/src/module/stepper.cpp b/Marlin/src/module/stepper.cpp index 69c6f66fbc..1ec82ba340 100644 --- a/Marlin/src/module/stepper.cpp +++ b/Marlin/src/module/stepper.cpp @@ -2949,54 +2949,20 @@ void Stepper::init() { TERN_(HAS_MICROSTEPS, microstep_init()); // Init Dir Pins - TERN_(HAS_X_DIR, X_DIR_INIT()); + TERN_(HAS_X_DIR, X_DIR_INIT()); TERN_(HAS_X2_DIR, X2_DIR_INIT()); - #if HAS_Y_DIR - Y_DIR_INIT(); - #if ALL(HAS_Y2_STEPPER, HAS_Y2_DIR) - Y2_DIR_INIT(); - #endif - #endif - #if HAS_Z_DIR - Z_DIR_INIT(); - #if NUM_Z_STEPPERS >= 2 && HAS_Z2_DIR - Z2_DIR_INIT(); - #endif - #if NUM_Z_STEPPERS >= 3 && HAS_Z3_DIR - Z3_DIR_INIT(); - #endif - #if NUM_Z_STEPPERS >= 4 && HAS_Z4_DIR - Z4_DIR_INIT(); - #endif - #endif - SECONDARY_AXIS_CODE( - I_DIR_INIT(), J_DIR_INIT(), K_DIR_INIT(), - U_DIR_INIT(), V_DIR_INIT(), W_DIR_INIT() - ); - #if HAS_E0_DIR - E0_DIR_INIT(); - #endif - #if HAS_E1_DIR - E1_DIR_INIT(); - #endif - #if HAS_E2_DIR - E2_DIR_INIT(); - #endif - #if HAS_E3_DIR - E3_DIR_INIT(); - #endif - #if HAS_E4_DIR - E4_DIR_INIT(); - #endif - #if HAS_E5_DIR - E5_DIR_INIT(); - #endif - #if HAS_E6_DIR - E6_DIR_INIT(); - #endif - #if HAS_E7_DIR - E7_DIR_INIT(); - #endif + TERN_(HAS_Y_DIR, Y_DIR_INIT()); + TERN_(HAS_Y2_DIR, Y2_DIR_INIT()); + TERN_(HAS_Z_DIR, Z_DIR_INIT()); + TERN_(HAS_Z2_DIR, Z2_DIR_INIT()); + TERN_(HAS_Z3_DIR, Z3_DIR_INIT()); + TERN_(HAS_Z4_DIR, Z4_DIR_INIT()); + TERN_(HAS_I_DIR, I_DIR_INIT()); + TERN_(HAS_K_DIR, K_DIR_INIT()); + TERN_(HAS_K_DIR, K_DIR_INIT()); + TERN_(HAS_U_DIR, U_DIR_INIT()); + TERN_(HAS_V_DIR, V_DIR_INIT()); + TERN_(HAS_W_DIR, W_DIR_INIT()); // Init Enable Pins - steppers default to disabled. #if HAS_X_ENABLE @@ -3027,15 +2993,15 @@ void Stepper::init() { #endif Z_ENABLE_INIT(); if (Z_ENABLE_INIT_STATE) Z_ENABLE_WRITE(Z_ENABLE_INIT_STATE); - #if NUM_Z_STEPPERS >= 2 && HAS_Z2_ENABLE + #if HAS_Z2_ENABLE Z2_ENABLE_INIT(); if (Z_ENABLE_INIT_STATE) Z2_ENABLE_WRITE(Z_ENABLE_INIT_STATE); #endif - #if NUM_Z_STEPPERS >= 3 && HAS_Z3_ENABLE + #if HAS_Z3_ENABLE Z3_ENABLE_INIT(); if (Z_ENABLE_INIT_STATE) Z3_ENABLE_WRITE(Z_ENABLE_INIT_STATE); #endif - #if NUM_Z_STEPPERS >= 4 && HAS_Z4_ENABLE + #if HAS_Z4_ENABLE Z4_ENABLE_INIT(); if (Z_ENABLE_INIT_STATE) Z4_ENABLE_WRITE(Z_ENABLE_INIT_STATE); #endif @@ -3133,7 +3099,7 @@ void Stepper::init() { _WRITE_STEP(AXIS, !_STEP_STATE(PIN)); \ _DISABLE_AXIS(AXIS) - #define E_AXIS_INIT(NUM) AXIS_INIT(E## NUM, E) + #define E_AXIS_INIT(NUM) DEFER(AXIS_INIT)(E##NUM, E) // Init Step Pins #if HAS_X_STEP @@ -3167,49 +3133,21 @@ void Stepper::init() { #endif AXIS_INIT(Z, Z); #endif - #if HAS_I_STEP - AXIS_INIT(I, I); - #endif - #if HAS_J_STEP - AXIS_INIT(J, J); - #endif - #if HAS_K_STEP - AXIS_INIT(K, K); - #endif - #if HAS_U_STEP - AXIS_INIT(U, U); - #endif - #if HAS_V_STEP - AXIS_INIT(V, V); - #endif - #if HAS_W_STEP - AXIS_INIT(W, W); - #endif + TERN_(HAS_I_STEP, AXIS_INIT(I, I)); + TERN_(HAS_J_STEP, AXIS_INIT(J, J)); + TERN_(HAS_K_STEP, AXIS_INIT(K, K)); + TERN_(HAS_U_STEP, AXIS_INIT(U, U)); + TERN_(HAS_V_STEP, AXIS_INIT(V, V)); + TERN_(HAS_W_STEP, AXIS_INIT(W, W)); - #if E_STEPPERS && HAS_E0_STEP - E_AXIS_INIT(0); - #endif - #if (E_STEPPERS > 1 || ENABLED(E_DUAL_STEPPER_DRIVERS)) && HAS_E1_STEP - E_AXIS_INIT(1); - #endif - #if E_STEPPERS > 2 && HAS_E2_STEP - E_AXIS_INIT(2); - #endif - #if E_STEPPERS > 3 && HAS_E3_STEP - E_AXIS_INIT(3); - #endif - #if E_STEPPERS > 4 && HAS_E4_STEP - E_AXIS_INIT(4); - #endif - #if E_STEPPERS > 5 && HAS_E5_STEP - E_AXIS_INIT(5); - #endif - #if E_STEPPERS > 6 && HAS_E6_STEP - E_AXIS_INIT(6); - #endif - #if E_STEPPERS > 7 && HAS_E7_STEP - E_AXIS_INIT(7); - #endif + TERN_(HAS_E0_STEP, E_AXIS_INIT(0)); + TERN_(HAS_E1_STEP, E_AXIS_INIT(1)); + TERN_(HAS_E2_STEP, E_AXIS_INIT(2)); + TERN_(HAS_E3_STEP, E_AXIS_INIT(3)); + TERN_(HAS_E4_STEP, E_AXIS_INIT(4)); + TERN_(HAS_E5_STEP, E_AXIS_INIT(5)); + TERN_(HAS_E6_STEP, E_AXIS_INIT(6)); + TERN_(HAS_E7_STEP, E_AXIS_INIT(7)); #if DISABLED(I2S_STEPPER_STREAM) HAL_timer_start(MF_TIMER_STEP, 122); // Init Stepper ISR to 122 Hz for quick starting diff --git a/Marlin/src/module/stepper/indirection.h b/Marlin/src/module/stepper/indirection.h index 4c83cbd6a6..d18fe830cc 100644 --- a/Marlin/src/module/stepper/indirection.h +++ b/Marlin/src/module/stepper/indirection.h @@ -810,48 +810,24 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset #endif #ifndef ENABLE_STEPPER_U - #if HAS_U_ENABLE - #define ENABLE_STEPPER_U() U_ENABLE_WRITE( U_ENABLE_ON) - #else - #define ENABLE_STEPPER_U() NOOP - #endif + #define ENABLE_STEPPER_U() TERN(HAS_U_ENABLE, U_ENABLE_WRITE( U_ENABLE_ON), NOOP) #endif #ifndef DISABLE_STEPPER_U - #if HAS_U_ENABLE - #define DISABLE_STEPPER_U() U_ENABLE_WRITE(!U_ENABLE_ON) - #else - #define DISABLE_STEPPER_U() NOOP - #endif + #define DISABLE_STEPPER_U() TERN(HAS_U_ENABLE, U_ENABLE_WRITE(!U_ENABLE_ON), NOOP) #endif #ifndef ENABLE_STEPPER_V - #if HAS_V_ENABLE - #define ENABLE_STEPPER_V() V_ENABLE_WRITE( V_ENABLE_ON) - #else - #define ENABLE_STEPPER_V() NOOP - #endif + #define ENABLE_STEPPER_V() TERN(HAS_V_ENABLE, V_ENABLE_WRITE( V_ENABLE_ON), NOOP) #endif #ifndef DISABLE_STEPPER_V - #if HAS_V_ENABLE - #define DISABLE_STEPPER_V() V_ENABLE_WRITE(!V_ENABLE_ON) - #else - #define DISABLE_STEPPER_V() NOOP - #endif + #define DISABLE_STEPPER_V() TERN(HAS_V_ENABLE, V_ENABLE_WRITE(!V_ENABLE_ON), NOOP) #endif #ifndef ENABLE_STEPPER_W - #if HAS_W_ENABLE - #define ENABLE_STEPPER_W() W_ENABLE_WRITE( W_ENABLE_ON) - #else - #define ENABLE_STEPPER_W() NOOP - #endif + #define ENABLE_STEPPER_W() TERN(HAS_W_ENABLE, W_ENABLE_WRITE( W_ENABLE_ON), NOOP) #endif #ifndef DISABLE_STEPPER_W - #if HAS_W_ENABLE - #define DISABLE_STEPPER_W() W_ENABLE_WRITE(!W_ENABLE_ON) - #else - #define DISABLE_STEPPER_W() NOOP - #endif + #define DISABLE_STEPPER_W() TERN(HAS_W_ENABLE, W_ENABLE_WRITE(!W_ENABLE_ON), NOOP) #endif #ifndef ENABLE_STEPPER_E0 @@ -877,93 +853,45 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset #endif #ifndef ENABLE_STEPPER_E2 - #if E_STEPPERS > 2 && HAS_E2_ENABLE - #define ENABLE_STEPPER_E2() E2_ENABLE_WRITE( E_ENABLE_ON) - #else - #define ENABLE_STEPPER_E2() NOOP - #endif + #define ENABLE_STEPPER_E2() TERN(HAS_E2_ENABLE, E2_ENABLE_WRITE( E_ENABLE_ON), NOOP) #endif #ifndef DISABLE_STEPPER_E2 - #if E_STEPPERS > 2 && HAS_E2_ENABLE - #define DISABLE_STEPPER_E2() E2_ENABLE_WRITE(!E_ENABLE_ON) - #else - #define DISABLE_STEPPER_E2() NOOP - #endif + #define DISABLE_STEPPER_E2() TERN(HAS_E2_ENABLE, E2_ENABLE_WRITE(!E_ENABLE_ON), NOOP) #endif #ifndef ENABLE_STEPPER_E3 - #if E_STEPPERS > 3 && HAS_E3_ENABLE - #define ENABLE_STEPPER_E3() E3_ENABLE_WRITE( E_ENABLE_ON) - #else - #define ENABLE_STEPPER_E3() NOOP - #endif + #define ENABLE_STEPPER_E3() TERN(HAS_E3_ENABLE, E3_ENABLE_WRITE( E_ENABLE_ON), NOOP) #endif #ifndef DISABLE_STEPPER_E3 - #if E_STEPPERS > 3 && HAS_E3_ENABLE - #define DISABLE_STEPPER_E3() E3_ENABLE_WRITE(!E_ENABLE_ON) - #else - #define DISABLE_STEPPER_E3() NOOP - #endif + #define DISABLE_STEPPER_E3() TERN(HAS_E3_ENABLE, E3_ENABLE_WRITE(!E_ENABLE_ON), NOOP) #endif #ifndef ENABLE_STEPPER_E4 - #if E_STEPPERS > 4 && HAS_E4_ENABLE - #define ENABLE_STEPPER_E4() E4_ENABLE_WRITE( E_ENABLE_ON) - #else - #define ENABLE_STEPPER_E4() NOOP - #endif + #define ENABLE_STEPPER_E4() TERN(HAS_E4_ENABLE, E4_ENABLE_WRITE( E_ENABLE_ON), NOOP) #endif #ifndef DISABLE_STEPPER_E4 - #if E_STEPPERS > 4 && HAS_E4_ENABLE - #define DISABLE_STEPPER_E4() E4_ENABLE_WRITE(!E_ENABLE_ON) - #else - #define DISABLE_STEPPER_E4() NOOP - #endif + #define DISABLE_STEPPER_E4() TERN(HAS_E4_ENABLE, E4_ENABLE_WRITE(!E_ENABLE_ON), NOOP) #endif #ifndef ENABLE_STEPPER_E5 - #if E_STEPPERS > 5 && HAS_E5_ENABLE - #define ENABLE_STEPPER_E5() E5_ENABLE_WRITE( E_ENABLE_ON) - #else - #define ENABLE_STEPPER_E5() NOOP - #endif + #define ENABLE_STEPPER_E5() TERN(HAS_E5_ENABLE, E5_ENABLE_WRITE( E_ENABLE_ON), NOOP) #endif #ifndef DISABLE_STEPPER_E5 - #if E_STEPPERS > 5 && HAS_E5_ENABLE - #define DISABLE_STEPPER_E5() E5_ENABLE_WRITE(!E_ENABLE_ON) - #else - #define DISABLE_STEPPER_E5() NOOP - #endif + #define DISABLE_STEPPER_E5() TERN(HAS_E5_ENABLE, E5_ENABLE_WRITE(!E_ENABLE_ON), NOOP) #endif #ifndef ENABLE_STEPPER_E6 - #if E_STEPPERS > 6 && HAS_E6_ENABLE - #define ENABLE_STEPPER_E6() E6_ENABLE_WRITE( E_ENABLE_ON) - #else - #define ENABLE_STEPPER_E6() NOOP - #endif + #define ENABLE_STEPPER_E6() TERN(HAS_E6_ENABLE, E6_ENABLE_WRITE( E_ENABLE_ON), NOOP) #endif #ifndef DISABLE_STEPPER_E6 - #if E_STEPPERS > 6 && HAS_E6_ENABLE - #define DISABLE_STEPPER_E6() E6_ENABLE_WRITE(!E_ENABLE_ON) - #else - #define DISABLE_STEPPER_E6() NOOP - #endif + #define DISABLE_STEPPER_E6() TERN(HAS_E6_ENABLE, E6_ENABLE_WRITE(!E_ENABLE_ON), NOOP) #endif #ifndef ENABLE_STEPPER_E7 - #if E_STEPPERS > 7 && HAS_E7_ENABLE - #define ENABLE_STEPPER_E7() E7_ENABLE_WRITE( E_ENABLE_ON) - #else - #define ENABLE_STEPPER_E7() NOOP - #endif + #define ENABLE_STEPPER_E7() TERN(HAS_E7_ENABLE, E7_ENABLE_WRITE( E_ENABLE_ON), NOOP) #endif #ifndef DISABLE_STEPPER_E7 - #if E_STEPPERS > 7 && HAS_E7_ENABLE - #define DISABLE_STEPPER_E7() E7_ENABLE_WRITE(!E_ENABLE_ON) - #else - #define DISABLE_STEPPER_E7() NOOP - #endif + #define DISABLE_STEPPER_E7() TERN(HAS_E7_ENABLE, E7_ENABLE_WRITE(!E_ENABLE_ON), NOOP) #endif // @@ -1077,121 +1005,57 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset #endif #ifndef ENABLE_AXIS_E0 - #if E_STEPPERS && HAS_E0_ENABLE - #define ENABLE_AXIS_E0() ENABLE_STEPPER_E0() - #else - #define ENABLE_AXIS_E0() NOOP - #endif + #define ENABLE_AXIS_E0() TERN(HAS_E0_ENABLE, ENABLE_STEPPER_E0(), NOOP) #endif #ifndef DISABLE_AXIS_E0 - #if E_STEPPERS && HAS_E0_ENABLE - #define DISABLE_AXIS_E0() DISABLE_STEPPER_E0() - #else - #define DISABLE_AXIS_E0() NOOP - #endif + #define DISABLE_AXIS_E0() TERN(HAS_E0_ENABLE, DISABLE_STEPPER_E0(), NOOP) #endif #ifndef ENABLE_AXIS_E1 - #if E_STEPPERS > 1 && HAS_E1_ENABLE - #define ENABLE_AXIS_E1() ENABLE_STEPPER_E1() - #else - #define ENABLE_AXIS_E1() NOOP - #endif + #define ENABLE_AXIS_E1() TERN(HAS_E1_ENABLE, ENABLE_STEPPER_E1(), NOOP) #endif #ifndef DISABLE_AXIS_E1 - #if E_STEPPERS > 1 && HAS_E1_ENABLE - #define DISABLE_AXIS_E1() DISABLE_STEPPER_E1() - #else - #define DISABLE_AXIS_E1() NOOP - #endif + #define DISABLE_AXIS_E1() TERN(HAS_E1_ENABLE, DISABLE_STEPPER_E1(), NOOP) #endif #ifndef ENABLE_AXIS_E2 - #if E_STEPPERS > 2 && HAS_E2_ENABLE - #define ENABLE_AXIS_E2() ENABLE_STEPPER_E2() - #else - #define ENABLE_AXIS_E2() NOOP - #endif + #define ENABLE_AXIS_E2() TERN(HAS_E2_ENABLE, ENABLE_STEPPER_E2(), NOOP) #endif #ifndef DISABLE_AXIS_E2 - #if E_STEPPERS > 2 && HAS_E2_ENABLE - #define DISABLE_AXIS_E2() DISABLE_STEPPER_E2() - #else - #define DISABLE_AXIS_E2() NOOP - #endif + #define DISABLE_AXIS_E2() TERN(HAS_E2_ENABLE, DISABLE_STEPPER_E2(), NOOP) #endif #ifndef ENABLE_AXIS_E3 - #if E_STEPPERS > 3 && HAS_E3_ENABLE - #define ENABLE_AXIS_E3() ENABLE_STEPPER_E3() - #else - #define ENABLE_AXIS_E3() NOOP - #endif + #define ENABLE_AXIS_E3() TERN(HAS_E3_ENABLE, ENABLE_STEPPER_E3(), NOOP) #endif #ifndef DISABLE_AXIS_E3 - #if E_STEPPERS > 3 && HAS_E3_ENABLE - #define DISABLE_AXIS_E3() DISABLE_STEPPER_E3() - #else - #define DISABLE_AXIS_E3() NOOP - #endif + #define DISABLE_AXIS_E3() TERN(HAS_E3_ENABLE, DISABLE_STEPPER_E3(), NOOP) #endif #ifndef ENABLE_AXIS_E4 - #if E_STEPPERS > 4 && HAS_E4_ENABLE - #define ENABLE_AXIS_E4() ENABLE_STEPPER_E4() - #else - #define ENABLE_AXIS_E4() NOOP - #endif + #define ENABLE_AXIS_E4() TERN(HAS_E4_ENABLE, ENABLE_STEPPER_E4(), NOOP) #endif #ifndef DISABLE_AXIS_E4 - #if E_STEPPERS > 4 && HAS_E4_ENABLE - #define DISABLE_AXIS_E4() DISABLE_STEPPER_E4() - #else - #define DISABLE_AXIS_E4() NOOP - #endif + #define DISABLE_AXIS_E4() TERN(HAS_E4_ENABLE, DISABLE_STEPPER_E4(), NOOP) #endif #ifndef ENABLE_AXIS_E5 - #if E_STEPPERS > 5 && HAS_E5_ENABLE - #define ENABLE_AXIS_E5() ENABLE_STEPPER_E5() - #else - #define ENABLE_AXIS_E5() NOOP - #endif + #define ENABLE_AXIS_E5() TERN(HAS_E5_ENABLE, ENABLE_STEPPER_E5(), NOOP) #endif #ifndef DISABLE_AXIS_E5 - #if E_STEPPERS > 5 && HAS_E5_ENABLE - #define DISABLE_AXIS_E5() DISABLE_STEPPER_E5() - #else - #define DISABLE_AXIS_E5() NOOP - #endif + #define DISABLE_AXIS_E5() TERN(HAS_E5_ENABLE, DISABLE_STEPPER_E5(), NOOP) #endif #ifndef ENABLE_AXIS_E6 - #if E_STEPPERS > 6 && HAS_E6_ENABLE - #define ENABLE_AXIS_E6() ENABLE_STEPPER_E6() - #else - #define ENABLE_AXIS_E6() NOOP - #endif + #define ENABLE_AXIS_E6() TERN(HAS_E6_ENABLE, ENABLE_STEPPER_E6(), NOOP) #endif #ifndef DISABLE_AXIS_E6 - #if E_STEPPERS > 6 && HAS_E6_ENABLE - #define DISABLE_AXIS_E6() DISABLE_STEPPER_E6() - #else - #define DISABLE_AXIS_E6() NOOP - #endif + #define DISABLE_AXIS_E6() TERN(HAS_E6_ENABLE, DISABLE_STEPPER_E6(), NOOP) #endif #ifndef ENABLE_AXIS_E7 - #if E_STEPPERS > 7 && HAS_E7_ENABLE - #define ENABLE_AXIS_E7() ENABLE_STEPPER_E7() - #else - #define ENABLE_AXIS_E7() NOOP - #endif + #define ENABLE_AXIS_E7() TERN(HAS_E7_ENABLE, ENABLE_STEPPER_E7(), NOOP) #endif #ifndef DISABLE_AXIS_E7 - #if E_STEPPERS > 7 && HAS_E7_ENABLE - #define DISABLE_AXIS_E7() DISABLE_STEPPER_E7() - #else - #define DISABLE_AXIS_E7() NOOP - #endif + #define DISABLE_AXIS_E7() TERN(HAS_E7_ENABLE, DISABLE_STEPPER_E7(), NOOP) #endif diff --git a/Marlin/src/module/stepper/trinamic.cpp b/Marlin/src/module/stepper/trinamic.cpp index c0fb083d61..3ec8ff4325 100644 --- a/Marlin/src/module/stepper/trinamic.cpp +++ b/Marlin/src/module/stepper/trinamic.cpp @@ -847,72 +847,28 @@ enum StealthIndex : uint8_t { #endif // TMC5160 void restore_trinamic_drivers() { - #if AXIS_IS_TMC(X) - stepperX.push(); - #endif - #if AXIS_IS_TMC(X2) - stepperX2.push(); - #endif - #if AXIS_IS_TMC(Y) - stepperY.push(); - #endif - #if AXIS_IS_TMC(Y2) - stepperY2.push(); - #endif - #if AXIS_IS_TMC(Z) - stepperZ.push(); - #endif - #if AXIS_IS_TMC(Z2) - stepperZ2.push(); - #endif - #if AXIS_IS_TMC(Z3) - stepperZ3.push(); - #endif - #if AXIS_IS_TMC(Z4) - stepperZ4.push(); - #endif - #if AXIS_IS_TMC(I) - stepperI.push(); - #endif - #if AXIS_IS_TMC(J) - stepperJ.push(); - #endif - #if AXIS_IS_TMC(K) - stepperK.push(); - #endif - #if AXIS_IS_TMC(U) - stepperU.push(); - #endif - #if AXIS_IS_TMC(V) - stepperV.push(); - #endif - #if AXIS_IS_TMC(W) - stepperW.push(); - #endif - #if AXIS_IS_TMC(E0) - stepperE0.push(); - #endif - #if AXIS_IS_TMC(E1) - stepperE1.push(); - #endif - #if AXIS_IS_TMC(E2) - stepperE2.push(); - #endif - #if AXIS_IS_TMC(E3) - stepperE3.push(); - #endif - #if AXIS_IS_TMC(E4) - stepperE4.push(); - #endif - #if AXIS_IS_TMC(E5) - stepperE5.push(); - #endif - #if AXIS_IS_TMC(E6) - stepperE6.push(); - #endif - #if AXIS_IS_TMC(E7) - stepperE7.push(); - #endif + TERN_(X_IS_TRINAMIC, stepperX.push()); + TERN_(X2_IS_TRINAMIC, stepperX2.push()); + TERN_(Y_IS_TRINAMIC, stepperY.push()); + TERN_(Y2_IS_TRINAMIC, stepperY2.push()); + TERN_(Z_IS_TRINAMIC, stepperZ.push()); + TERN_(Z2_IS_TRINAMIC, stepperZ2.push()); + TERN_(Z3_IS_TRINAMIC, stepperZ3.push()); + TERN_(Z4_IS_TRINAMIC, stepperZ4.push()); + TERN_(I_IS_TRINAMIC, stepperI.push()); + TERN_(J_IS_TRINAMIC, stepperJ.push()); + TERN_(K_IS_TRINAMIC, stepperK.push()); + TERN_(U_IS_TRINAMIC, stepperU.push()); + TERN_(V_IS_TRINAMIC, stepperV.push()); + TERN_(W_IS_TRINAMIC, stepperW.push()); + TERN_(E0_IS_TRINAMIC, stepperE0.push()); + TERN_(E1_IS_TRINAMIC, stepperE1.push()); + TERN_(E2_IS_TRINAMIC, stepperE2.push()); + TERN_(E3_IS_TRINAMIC, stepperE3.push()); + TERN_(E4_IS_TRINAMIC, stepperE4.push()); + TERN_(E5_IS_TRINAMIC, stepperE5.push()); + TERN_(E6_IS_TRINAMIC, stepperE6.push()); + TERN_(E7_IS_TRINAMIC, stepperE7.push()); } void reset_trinamic_drivers() { @@ -923,88 +879,44 @@ void reset_trinamic_drivers() { ENABLED(STEALTHCHOP_U), ENABLED(STEALTHCHOP_V), ENABLED(STEALTHCHOP_W) ); - #if AXIS_IS_TMC(X) - TMC_INIT(X, STEALTH_AXIS_X); - #endif - #if AXIS_IS_TMC(X2) - TMC_INIT(X2, STEALTH_AXIS_X); - #endif - #if AXIS_IS_TMC(Y) - TMC_INIT(Y, STEALTH_AXIS_Y); - #endif - #if AXIS_IS_TMC(Y2) - TMC_INIT(Y2, STEALTH_AXIS_Y); - #endif - #if AXIS_IS_TMC(Z) - TMC_INIT(Z, STEALTH_AXIS_Z); - #endif - #if AXIS_IS_TMC(Z2) - TMC_INIT(Z2, STEALTH_AXIS_Z); - #endif - #if AXIS_IS_TMC(Z3) - TMC_INIT(Z3, STEALTH_AXIS_Z); - #endif - #if AXIS_IS_TMC(Z4) - TMC_INIT(Z4, STEALTH_AXIS_Z); - #endif - #if AXIS_IS_TMC(I) - TMC_INIT(I, STEALTH_AXIS_I); - #endif - #if AXIS_IS_TMC(J) - TMC_INIT(J, STEALTH_AXIS_J); - #endif - #if AXIS_IS_TMC(K) - TMC_INIT(K, STEALTH_AXIS_K); - #endif - #if AXIS_IS_TMC(U) - TMC_INIT(U, STEALTH_AXIS_U); - #endif - #if AXIS_IS_TMC(V) - TMC_INIT(V, STEALTH_AXIS_V); - #endif - #if AXIS_IS_TMC(W) - TMC_INIT(W, STEALTH_AXIS_W); - #endif - #if AXIS_IS_TMC(E0) - TMC_INIT(E0, STEALTH_AXIS_E); - #endif - #if AXIS_IS_TMC(E1) - TMC_INIT(E1, STEALTH_AXIS_E); - #endif - #if AXIS_IS_TMC(E2) - TMC_INIT(E2, STEALTH_AXIS_E); - #endif - #if AXIS_IS_TMC(E3) - TMC_INIT(E3, STEALTH_AXIS_E); - #endif - #if AXIS_IS_TMC(E4) - TMC_INIT(E4, STEALTH_AXIS_E); - #endif - #if AXIS_IS_TMC(E5) - TMC_INIT(E5, STEALTH_AXIS_E); - #endif - #if AXIS_IS_TMC(E6) - TMC_INIT(E6, STEALTH_AXIS_E); - #endif - #if AXIS_IS_TMC(E7) - TMC_INIT(E7, STEALTH_AXIS_E); - #endif + TERN_(X_IS_TRINAMIC, TMC_INIT(X, STEALTH_AXIS_X)); + TERN_(X2_IS_TRINAMIC, TMC_INIT(X2, STEALTH_AXIS_X)); + TERN_(Y_IS_TRINAMIC, TMC_INIT(Y, STEALTH_AXIS_Y)); + TERN_(Y2_IS_TRINAMIC, TMC_INIT(Y2, STEALTH_AXIS_Y)); + TERN_(Z_IS_TRINAMIC, TMC_INIT(Z, STEALTH_AXIS_Z)); + TERN_(Z2_IS_TRINAMIC, TMC_INIT(Z2, STEALTH_AXIS_Z)); + TERN_(Z3_IS_TRINAMIC, TMC_INIT(Z3, STEALTH_AXIS_Z)); + TERN_(Z4_IS_TRINAMIC, TMC_INIT(Z4, STEALTH_AXIS_Z)); + TERN_(I_IS_TRINAMIC, TMC_INIT(I, STEALTH_AXIS_I)); + TERN_(J_IS_TRINAMIC, TMC_INIT(J, STEALTH_AXIS_J)); + TERN_(K_IS_TRINAMIC, TMC_INIT(K, STEALTH_AXIS_K)); + TERN_(U_IS_TRINAMIC, TMC_INIT(U, STEALTH_AXIS_U)); + TERN_(V_IS_TRINAMIC, TMC_INIT(V, STEALTH_AXIS_V)); + TERN_(W_IS_TRINAMIC, TMC_INIT(W, STEALTH_AXIS_W)); + TERN_(E0_IS_TRINAMIC, TMC_INIT(E0, STEALTH_AXIS_E)); + TERN_(E1_IS_TRINAMIC, TMC_INIT(E1, STEALTH_AXIS_E)); + TERN_(E2_IS_TRINAMIC, TMC_INIT(E2, STEALTH_AXIS_E)); + TERN_(E3_IS_TRINAMIC, TMC_INIT(E3, STEALTH_AXIS_E)); + TERN_(E4_IS_TRINAMIC, TMC_INIT(E4, STEALTH_AXIS_E)); + TERN_(E5_IS_TRINAMIC, TMC_INIT(E5, STEALTH_AXIS_E)); + TERN_(E6_IS_TRINAMIC, TMC_INIT(E6, STEALTH_AXIS_E)); + TERN_(E7_IS_TRINAMIC, TMC_INIT(E7, STEALTH_AXIS_E)); #if USE_SENSORLESS - TERN_(X_SENSORLESS, stepperX.homing_threshold(X_STALL_SENSITIVITY)); + TERN_(X_SENSORLESS, stepperX.homing_threshold(X_STALL_SENSITIVITY)); TERN_(X2_SENSORLESS, stepperX2.homing_threshold(X2_STALL_SENSITIVITY)); - TERN_(Y_SENSORLESS, stepperY.homing_threshold(Y_STALL_SENSITIVITY)); + TERN_(Y_SENSORLESS, stepperY.homing_threshold(Y_STALL_SENSITIVITY)); TERN_(Y2_SENSORLESS, stepperY2.homing_threshold(Y2_STALL_SENSITIVITY)); - TERN_(Z_SENSORLESS, stepperZ.homing_threshold(Z_STALL_SENSITIVITY)); + TERN_(Z_SENSORLESS, stepperZ.homing_threshold(Z_STALL_SENSITIVITY)); TERN_(Z2_SENSORLESS, stepperZ2.homing_threshold(Z2_STALL_SENSITIVITY)); TERN_(Z3_SENSORLESS, stepperZ3.homing_threshold(Z3_STALL_SENSITIVITY)); TERN_(Z4_SENSORLESS, stepperZ4.homing_threshold(Z4_STALL_SENSITIVITY)); - TERN_(I_SENSORLESS, stepperI.homing_threshold(I_STALL_SENSITIVITY)); - TERN_(J_SENSORLESS, stepperJ.homing_threshold(J_STALL_SENSITIVITY)); - TERN_(K_SENSORLESS, stepperK.homing_threshold(K_STALL_SENSITIVITY)); - TERN_(U_SENSORLESS, stepperU.homing_threshold(U_STALL_SENSITIVITY)); - TERN_(V_SENSORLESS, stepperV.homing_threshold(V_STALL_SENSITIVITY)); - TERN_(W_SENSORLESS, stepperW.homing_threshold(W_STALL_SENSITIVITY)); + TERN_(I_SENSORLESS, stepperI.homing_threshold(I_STALL_SENSITIVITY)); + TERN_(J_SENSORLESS, stepperJ.homing_threshold(J_STALL_SENSITIVITY)); + TERN_(K_SENSORLESS, stepperK.homing_threshold(K_STALL_SENSITIVITY)); + TERN_(U_SENSORLESS, stepperU.homing_threshold(U_STALL_SENSITIVITY)); + TERN_(V_SENSORLESS, stepperV.homing_threshold(V_STALL_SENSITIVITY)); + TERN_(W_SENSORLESS, stepperW.homing_threshold(W_STALL_SENSITIVITY)); #endif #ifdef TMC_ADV diff --git a/Marlin/src/module/stepper/trinamic.h b/Marlin/src/module/stepper/trinamic.h index bf7eaf7f95..0fd48f18cb 100644 --- a/Marlin/src/module/stepper/trinamic.h +++ b/Marlin/src/module/stepper/trinamic.h @@ -116,7 +116,7 @@ void restore_trinamic_drivers(); void reset_trinamic_drivers(); // X Stepper -#if AXIS_IS_TMC(X) +#if X_IS_TRINAMIC extern TMC_CLASS(X, X) stepperX; static constexpr chopper_timing_t chopper_timing_X = CHOPPER_TIMING_X; #if ENABLED(SOFTWARE_DRIVER_ENABLE) @@ -130,7 +130,7 @@ void reset_trinamic_drivers(); #endif // Y Stepper -#if AXIS_IS_TMC(Y) +#if Y_IS_TRINAMIC extern TMC_CLASS(Y, Y) stepperY; static constexpr chopper_timing_t chopper_timing_Y = CHOPPER_TIMING_Y; #if ENABLED(SOFTWARE_DRIVER_ENABLE) @@ -144,7 +144,7 @@ void reset_trinamic_drivers(); #endif // Z Stepper -#if AXIS_IS_TMC(Z) +#if Z_IS_TRINAMIC extern TMC_CLASS(Z, Z) stepperZ; static constexpr chopper_timing_t chopper_timing_Z = CHOPPER_TIMING_Z; #if ENABLED(SOFTWARE_DRIVER_ENABLE) @@ -158,7 +158,7 @@ void reset_trinamic_drivers(); #endif // X2 Stepper -#if HAS_X2_ENABLE && AXIS_IS_TMC(X2) +#if X2_IS_TRINAMIC extern TMC_CLASS(X2, X) stepperX2; #ifndef CHOPPER_TIMING_X2 #define CHOPPER_TIMING_X2 CHOPPER_TIMING_X @@ -175,7 +175,7 @@ void reset_trinamic_drivers(); #endif // Y2 Stepper -#if HAS_Y2_ENABLE && AXIS_IS_TMC(Y2) +#if Y2_IS_TRINAMIC extern TMC_CLASS(Y2, Y) stepperY2; #ifndef CHOPPER_TIMING_Y2 #define CHOPPER_TIMING_Y2 CHOPPER_TIMING_Y @@ -192,7 +192,7 @@ void reset_trinamic_drivers(); #endif // Z2 Stepper -#if HAS_Z2_ENABLE && AXIS_IS_TMC(Z2) +#if Z2_IS_TRINAMIC extern TMC_CLASS(Z2, Z) stepperZ2; #ifndef CHOPPER_TIMING_Z2 #define CHOPPER_TIMING_Z2 CHOPPER_TIMING_Z @@ -209,7 +209,7 @@ void reset_trinamic_drivers(); #endif // Z3 Stepper -#if HAS_Z3_ENABLE && AXIS_IS_TMC(Z3) +#if Z3_IS_TRINAMIC extern TMC_CLASS(Z3, Z) stepperZ3; #ifndef CHOPPER_TIMING_Z3 #define CHOPPER_TIMING_Z3 CHOPPER_TIMING_Z @@ -226,7 +226,7 @@ void reset_trinamic_drivers(); #endif // Z4 Stepper -#if HAS_Z4_ENABLE && AXIS_IS_TMC(Z4) +#if Z4_IS_TRINAMIC extern TMC_CLASS(Z4, Z) stepperZ4; #ifndef CHOPPER_TIMING_Z4 #define CHOPPER_TIMING_Z4 CHOPPER_TIMING_Z @@ -243,7 +243,7 @@ void reset_trinamic_drivers(); #endif // I Stepper -#if AXIS_IS_TMC(I) +#if I_IS_TRINAMIC extern TMC_CLASS(I, I) stepperI; static constexpr chopper_timing_t chopper_timing_I = CHOPPER_TIMING_I; #if ENABLED(SOFTWARE_DRIVER_ENABLE) @@ -257,7 +257,7 @@ void reset_trinamic_drivers(); #endif // J Stepper -#if AXIS_IS_TMC(J) +#if J_IS_TRINAMIC extern TMC_CLASS(J, J) stepperJ; static constexpr chopper_timing_t chopper_timing_J = CHOPPER_TIMING_J; #if ENABLED(SOFTWARE_DRIVER_ENABLE) @@ -271,7 +271,7 @@ void reset_trinamic_drivers(); #endif // K Stepper -#if AXIS_IS_TMC(K) +#if K_IS_TRINAMIC extern TMC_CLASS(K, K) stepperK; static constexpr chopper_timing_t chopper_timing_K = CHOPPER_TIMING_K; #if ENABLED(SOFTWARE_DRIVER_ENABLE) @@ -285,7 +285,7 @@ void reset_trinamic_drivers(); #endif // U Stepper -#if AXIS_IS_TMC(U) +#if U_IS_TRINAMIC extern TMC_CLASS(U, U) stepperU; static constexpr chopper_timing_t chopper_timing_U = CHOPPER_TIMING_U; #if ENABLED(SOFTWARE_DRIVER_ENABLE) @@ -299,7 +299,7 @@ void reset_trinamic_drivers(); #endif // V Stepper -#if AXIS_IS_TMC(V) +#if V_IS_TRINAMIC extern TMC_CLASS(V, V) stepperV; static constexpr chopper_timing_t chopper_timing_V = CHOPPER_TIMING_V; #if ENABLED(SOFTWARE_DRIVER_ENABLE) @@ -313,7 +313,7 @@ void reset_trinamic_drivers(); #endif // W Stepper -#if AXIS_IS_TMC(W) +#if W_IS_TRINAMIC extern TMC_CLASS(W, W) stepperW; static constexpr chopper_timing_t chopper_timing_W = CHOPPER_TIMING_W; #if ENABLED(SOFTWARE_DRIVER_ENABLE) @@ -327,7 +327,7 @@ void reset_trinamic_drivers(); #endif // E0 Stepper -#if AXIS_IS_TMC(E0) +#if E0_IS_TRINAMIC extern TMC_CLASS_E(0) stepperE0; #ifndef CHOPPER_TIMING_E0 #define CHOPPER_TIMING_E0 CHOPPER_TIMING_E @@ -344,7 +344,7 @@ void reset_trinamic_drivers(); #endif // E1 Stepper -#if AXIS_IS_TMC(E1) +#if E1_IS_TRINAMIC extern TMC_CLASS_E(1) stepperE1; #ifndef CHOPPER_TIMING_E1 #define CHOPPER_TIMING_E1 CHOPPER_TIMING_E @@ -361,7 +361,7 @@ void reset_trinamic_drivers(); #endif // E2 Stepper -#if AXIS_IS_TMC(E2) +#if E2_IS_TRINAMIC extern TMC_CLASS_E(2) stepperE2; #ifndef CHOPPER_TIMING_E2 #define CHOPPER_TIMING_E2 CHOPPER_TIMING_E @@ -378,7 +378,7 @@ void reset_trinamic_drivers(); #endif // E3 Stepper -#if AXIS_IS_TMC(E3) +#if E3_IS_TRINAMIC extern TMC_CLASS_E(3) stepperE3; #ifndef CHOPPER_TIMING_E3 #define CHOPPER_TIMING_E3 CHOPPER_TIMING_E @@ -395,7 +395,7 @@ void reset_trinamic_drivers(); #endif // E4 Stepper -#if AXIS_IS_TMC(E4) +#if E4_IS_TRINAMIC extern TMC_CLASS_E(4) stepperE4; #ifndef CHOPPER_TIMING_E4 #define CHOPPER_TIMING_E4 CHOPPER_TIMING_E @@ -412,7 +412,7 @@ void reset_trinamic_drivers(); #endif // E5 Stepper -#if AXIS_IS_TMC(E5) +#if E5_IS_TRINAMIC extern TMC_CLASS_E(5) stepperE5; #ifndef CHOPPER_TIMING_E5 #define CHOPPER_TIMING_E5 CHOPPER_TIMING_E @@ -429,7 +429,7 @@ void reset_trinamic_drivers(); #endif // E6 Stepper -#if AXIS_IS_TMC(E6) +#if E6_IS_TRINAMIC extern TMC_CLASS_E(6) stepperE6; #ifndef CHOPPER_TIMING_E6 #define CHOPPER_TIMING_E6 CHOPPER_TIMING_E @@ -446,7 +446,7 @@ void reset_trinamic_drivers(); #endif // E7 Stepper -#if AXIS_IS_TMC(E7) +#if E7_IS_TRINAMIC extern TMC_CLASS_E(7) stepperE7; #ifndef CHOPPER_TIMING_E7 #define CHOPPER_TIMING_E7 CHOPPER_TIMING_E From 7bd74fecbbdf5013d9be612af6c48f1030348bbb Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 27 Mar 2025 02:29:58 -0500 Subject: [PATCH 53/74] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20Langu?= =?UTF-8?q?age=20tweaks?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit lang --- Marlin/src/lcd/language/language_cz.h | 3 ++- Marlin/src/lcd/language/language_de.h | 3 ++- Marlin/src/lcd/language/language_en.h | 4 +++- Marlin/src/lcd/language/language_es.h | 3 ++- Marlin/src/lcd/language/language_fr.h | 3 ++- Marlin/src/lcd/language/language_fr_na.h | 3 ++- Marlin/src/lcd/language/language_gl.h | 3 ++- Marlin/src/lcd/language/language_hu.h | 3 ++- Marlin/src/lcd/language/language_it.h | 3 ++- Marlin/src/lcd/language/language_ro.h | 3 ++- Marlin/src/lcd/language/language_ru.h | 2 +- Marlin/src/lcd/language/language_sk.h | 3 ++- Marlin/src/lcd/language/language_sv.h | 3 ++- Marlin/src/lcd/language/language_tr.h | 3 ++- Marlin/src/lcd/language/language_uk.h | 3 ++- Marlin/src/lcd/language/language_vi.h | 2 +- Marlin/src/lcd/language/language_zh_CN.h | 3 ++- Marlin/src/lcd/menu/menu_tmc.cpp | 2 +- 18 files changed, 34 insertions(+), 18 deletions(-) diff --git a/Marlin/src/lcd/language/language_cz.h b/Marlin/src/lcd/language/language_cz.h index 814c9ffde8..9a01466227 100644 --- a/Marlin/src/lcd/language/language_cz.h +++ b/Marlin/src/lcd/language/language_cz.h @@ -534,7 +534,8 @@ namespace LanguageNarrow_cz { LSTR MSG_TMC_HYBRID_THRS = _UxGT("Hybridní práh"); LSTR MSG_TMC_HOMING_THRS = _UxGT("Domů bez senzorů"); LSTR MSG_TMC_STEPPING_MODE = _UxGT("Režim kroků"); - LSTR MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop povolen"); + LSTR MSG_TMC_STEALTHCHOP = _UxGT("StealthChop"); + LSTR MSG_SERVICE_RESET = _UxGT("Reset"); LSTR MSG_SERVICE_IN = _UxGT(" za:"); LSTR MSG_BACKLASH = _UxGT("Vůle"); diff --git a/Marlin/src/lcd/language/language_de.h b/Marlin/src/lcd/language/language_de.h index edc3d4361d..23730d321a 100644 --- a/Marlin/src/lcd/language/language_de.h +++ b/Marlin/src/lcd/language/language_de.h @@ -719,7 +719,8 @@ namespace LanguageNarrow_de { LSTR MSG_TMC_HYBRID_THRS = _UxGT("Hybrid threshold"); LSTR MSG_TMC_HOMING_THRS = _UxGT("Sensorloses Homing"); LSTR MSG_TMC_STEPPING_MODE = _UxGT("Schrittmodus"); - LSTR MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop einsch."); + LSTR MSG_TMC_STEALTHCHOP = _UxGT("StealthChop"); + LSTR MSG_SERVICE_RESET = _UxGT("Reset"); LSTR MSG_SERVICE_IN = _UxGT(" im:"); LSTR MSG_BACKLASH = _UxGT("Spiel"); diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index 5762fa150e..ca2e50d063 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -872,6 +872,7 @@ namespace LanguageNarrow_en { LSTR MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("Purging...")); LSTR MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_1_LINE("Click to finish")); LSTR MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Resuming...")); + LSTR MSG_TMC_DRIVERS = _UxGT("TMC Drivers"); LSTR MSG_TMC_CURRENT = _UxGT("Driver Current"); LSTR MSG_TMC_ACURRENT = STR_A _UxGT("Driver Current"); @@ -881,7 +882,8 @@ namespace LanguageNarrow_en { LSTR MSG_TMC_HYBRID_THRS = _UxGT("Hybrid Threshold"); LSTR MSG_TMC_HOMING_THRS = _UxGT("Sensorless Homing"); LSTR MSG_TMC_STEPPING_MODE = _UxGT("Stepping Mode"); - LSTR MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop Enabled"); + LSTR MSG_TMC_STEALTHCHOP = _UxGT("StealthChop"); + LSTR MSG_SERVICE_RESET = _UxGT("Reset"); LSTR MSG_SERVICE_IN = _UxGT(" in:"); LSTR MSG_BACKLASH = _UxGT("Backlash"); diff --git a/Marlin/src/lcd/language/language_es.h b/Marlin/src/lcd/language/language_es.h index 1c7d5199d3..058b550f67 100644 --- a/Marlin/src/lcd/language/language_es.h +++ b/Marlin/src/lcd/language/language_es.h @@ -543,7 +543,8 @@ namespace LanguageNarrow_es { LSTR MSG_TMC_HYBRID_THRS = _UxGT("Límite Hibrido"); LSTR MSG_TMC_HOMING_THRS = _UxGT("Origen sin sensores"); LSTR MSG_TMC_STEPPING_MODE = _UxGT("Modo de pasos"); - LSTR MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop Habilit."); + LSTR MSG_TMC_STEALTHCHOP = _UxGT("StealthChop"); + LSTR MSG_SERVICE_RESET = _UxGT("Reiniciar"); LSTR MSG_SERVICE_IN = _UxGT(" dentro:"); LSTR MSG_BACKLASH = _UxGT("Backlash"); diff --git a/Marlin/src/lcd/language/language_fr.h b/Marlin/src/lcd/language/language_fr.h index b499b32f7b..13bee9fbb8 100644 --- a/Marlin/src/lcd/language/language_fr.h +++ b/Marlin/src/lcd/language/language_fr.h @@ -573,7 +573,8 @@ namespace LanguageNarrow_fr { LSTR MSG_TMC_HYBRID_THRS = _UxGT("Seuil hybride"); LSTR MSG_TMC_HOMING_THRS = _UxGT("Home sans capteur"); LSTR MSG_TMC_STEPPING_MODE = _UxGT("Mode pas à pas"); - LSTR MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop activé"); + LSTR MSG_TMC_STEALTHCHOP = _UxGT("StealthChop"); + LSTR MSG_SERVICE_RESET = _UxGT("Réinit."); LSTR MSG_SERVICE_IN = _UxGT(" dans:"); LSTR MSG_BACKLASH_CORRECTION = _UxGT("Correction"); diff --git a/Marlin/src/lcd/language/language_fr_na.h b/Marlin/src/lcd/language/language_fr_na.h index 995a5ecd27..a3da3082de 100644 --- a/Marlin/src/lcd/language/language_fr_na.h +++ b/Marlin/src/lcd/language/language_fr_na.h @@ -576,7 +576,8 @@ namespace LanguageNarrow_fr_na { LSTR MSG_TMC_HYBRID_THRS = _UxGT("Seuil hybride"); LSTR MSG_TMC_HOMING_THRS = _UxGT("Home sans capteur"); LSTR MSG_TMC_STEPPING_MODE = _UxGT("Mode pas a pas"); - LSTR MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop active"); + LSTR MSG_TMC_STEALTHCHOP = _UxGT("StealthChop"); + LSTR MSG_SERVICE_RESET = _UxGT("Reinit."); LSTR MSG_SERVICE_IN = _UxGT(" dans:"); LSTR MSG_BACKLASH_CORRECTION = _UxGT("Correction"); diff --git a/Marlin/src/lcd/language/language_gl.h b/Marlin/src/lcd/language/language_gl.h index 37c1aa292a..3287ae2676 100644 --- a/Marlin/src/lcd/language/language_gl.h +++ b/Marlin/src/lcd/language/language_gl.h @@ -558,7 +558,8 @@ namespace LanguageNarrow_gl { LSTR MSG_TMC_HYBRID_THRS = _UxGT("Limiar Hibrido"); LSTR MSG_TMC_HOMING_THRS = _UxGT("Orixe sen Sensores"); LSTR MSG_TMC_STEPPING_MODE = _UxGT("Modo de pasos"); - LSTR MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop Habilit."); + LSTR MSG_TMC_STEALTHCHOP = _UxGT("StealthChop"); + LSTR MSG_SERVICE_RESET = _UxGT("Reiniciar"); LSTR MSG_SERVICE_IN = _UxGT(" dentro:"); LSTR MSG_BACKLASH = _UxGT("Reacción"); diff --git a/Marlin/src/lcd/language/language_hu.h b/Marlin/src/lcd/language/language_hu.h index d987416269..a626aa2209 100644 --- a/Marlin/src/lcd/language/language_hu.h +++ b/Marlin/src/lcd/language/language_hu.h @@ -630,7 +630,8 @@ namespace LanguageNarrow_hu { LSTR MSG_TMC_HYBRID_THRS = _UxGT("Hibrid küszöbérték"); LSTR MSG_TMC_HOMING_THRS = _UxGT("Motoros kezdöpont"); LSTR MSG_TMC_STEPPING_MODE = _UxGT("Léptetö mód"); - LSTR MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop mód"); + LSTR MSG_TMC_STEALTHCHOP = _UxGT("StealthChop"); + LSTR MSG_SERVICE_RESET = _UxGT("Újraindítás"); LSTR MSG_SERVICE_IN = _UxGT(" be:"); LSTR MSG_BACKLASH = _UxGT("Holtjáték"); diff --git a/Marlin/src/lcd/language/language_it.h b/Marlin/src/lcd/language/language_it.h index 0a7302b0f8..1e81514440 100644 --- a/Marlin/src/lcd/language/language_it.h +++ b/Marlin/src/lcd/language/language_it.h @@ -852,7 +852,8 @@ namespace LanguageNarrow_it { LSTR MSG_TMC_HYBRID_THRS = _UxGT("Soglia modo ibrido"); LSTR MSG_TMC_HOMING_THRS = _UxGT("Sensorless homing"); LSTR MSG_TMC_STEPPING_MODE = _UxGT("Modo Stepping"); - LSTR MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop abil."); + LSTR MSG_TMC_STEALTHCHOP = _UxGT("StealthChop"); + LSTR MSG_SERVICE_RESET = _UxGT("Resetta"); LSTR MSG_SERVICE_IN = _UxGT(" tra:"); LSTR MSG_BACKLASH = _UxGT("Gioco"); diff --git a/Marlin/src/lcd/language/language_ro.h b/Marlin/src/lcd/language/language_ro.h index ff82bb39ba..0b263a4ea6 100644 --- a/Marlin/src/lcd/language/language_ro.h +++ b/Marlin/src/lcd/language/language_ro.h @@ -570,7 +570,8 @@ namespace LanguageNarrow_ro { LSTR MSG_TMC_HYBRID_THRS = _UxGT("Hybrid Threshold"); LSTR MSG_TMC_HOMING_THRS = _UxGT("Sensorless Homing"); LSTR MSG_TMC_STEPPING_MODE = _UxGT("Stepping Mode"); - LSTR MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop Enabled"); + LSTR MSG_TMC_STEALTHCHOP = _UxGT("StealthChop"); + LSTR MSG_SERVICE_RESET = _UxGT("Reset"); LSTR MSG_SERVICE_IN = _UxGT(" in:"); LSTR MSG_BACKLASH = _UxGT("Backlash"); diff --git a/Marlin/src/lcd/language/language_ru.h b/Marlin/src/lcd/language/language_ru.h index 6b3fbebd08..92011f66a6 100644 --- a/Marlin/src/lcd/language/language_ru.h +++ b/Marlin/src/lcd/language/language_ru.h @@ -636,7 +636,7 @@ namespace LanguageNarrow_ru { LSTR MSG_TMC_HYBRID_THRS = _UxGT("Гибридный режим"); LSTR MSG_TMC_HOMING_THRS = _UxGT("Чувствительность"); LSTR MSG_TMC_STEPPING_MODE = _UxGT("Режим драйвера"); - LSTR MSG_TMC_STEALTH_ENABLED = _UxGT("Тихий режим вкл"); + LSTR MSG_TMC_STEALTHCHOP = _UxGT("Тихий режим вкл"); LSTR MSG_SERVICE_RESET = _UxGT("Сброс"); LSTR MSG_SERVICE_IN = _UxGT(" в:"); diff --git a/Marlin/src/lcd/language/language_sk.h b/Marlin/src/lcd/language/language_sk.h index 32683cf2ed..782f42f118 100644 --- a/Marlin/src/lcd/language/language_sk.h +++ b/Marlin/src/lcd/language/language_sk.h @@ -761,7 +761,8 @@ namespace LanguageNarrow_sk { LSTR MSG_TMC_HYBRID_THRS = _UxGT("Hybridný prah"); LSTR MSG_TMC_HOMING_THRS = _UxGT("Bezsenzor. domov"); LSTR MSG_TMC_STEPPING_MODE = _UxGT("Režim krokovania"); - LSTR MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop zapnutý"); + LSTR MSG_TMC_STEALTHCHOP = _UxGT("StealthChop"); + LSTR MSG_SERVICE_RESET = _UxGT("Vynulovať"); LSTR MSG_SERVICE_IN = _UxGT("za:"); LSTR MSG_BACKLASH = _UxGT("Kompenz. vôle"); diff --git a/Marlin/src/lcd/language/language_sv.h b/Marlin/src/lcd/language/language_sv.h index 8827252132..356a253b6e 100644 --- a/Marlin/src/lcd/language/language_sv.h +++ b/Marlin/src/lcd/language/language_sv.h @@ -614,7 +614,8 @@ namespace LanguageNarrow_sv { LSTR MSG_TMC_HYBRID_THRS = _UxGT("Hybrid Tröskelvärde"); LSTR MSG_TMC_HOMING_THRS = _UxGT("Sensorlös Hemning"); LSTR MSG_TMC_STEPPING_MODE = _UxGT("Stegningsläge"); - LSTR MSG_TMC_STEALTH_ENABLED = _UxGT("Smyghack Aktiverad"); + LSTR MSG_TMC_STEALTHCHOP = _UxGT("Smyghack"); + LSTR MSG_SERVICE_RESET = _UxGT("Återställ"); LSTR MSG_SERVICE_IN = _UxGT(" in:"); LSTR MSG_BACKLASH = _UxGT("Backlash"); diff --git a/Marlin/src/lcd/language/language_tr.h b/Marlin/src/lcd/language/language_tr.h index baebbe9d1e..b52ded8db8 100644 --- a/Marlin/src/lcd/language/language_tr.h +++ b/Marlin/src/lcd/language/language_tr.h @@ -787,7 +787,8 @@ namespace LanguageNarrow_tr { LSTR MSG_TMC_HYBRID_THRS = _UxGT("Hibrit Eşiği"); LSTR MSG_TMC_HOMING_THRS = _UxGT("Sensörsüz Sıfırlama"); LSTR MSG_TMC_STEPPING_MODE = _UxGT("Adım Modu"); - LSTR MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop Aktif"); + LSTR MSG_TMC_STEALTHCHOP = _UxGT("StealthChop"); + LSTR MSG_SERVICE_RESET = _UxGT("Resetle"); LSTR MSG_SERVICE_IN = _UxGT(" içinde:"); LSTR MSG_BACKLASH = _UxGT("Ters Tepki"); diff --git a/Marlin/src/lcd/language/language_uk.h b/Marlin/src/lcd/language/language_uk.h index 104d7f1ecf..c061b9ad02 100644 --- a/Marlin/src/lcd/language/language_uk.h +++ b/Marlin/src/lcd/language/language_uk.h @@ -663,7 +663,8 @@ namespace LanguageNarrow_uk { LSTR MSG_TMC_HYBRID_THRS = _UxGT("Гібридний поріг"); LSTR MSG_TMC_HOMING_THRS = _UxGT("Дім без кінцевиків"); LSTR MSG_TMC_STEPPING_MODE = _UxGT("Режим мікрокроку"); - LSTR MSG_TMC_STEALTH_ENABLED = _UxGT("Тихий режим увімк."); + LSTR MSG_TMC_STEALTHCHOP = _UxGT("Тихий режим увімк."); + LSTR MSG_SERVICE_RESET = _UxGT("Зкидання"); LSTR MSG_SERVICE_IN = _UxGT(" в:"); LSTR MSG_BACKLASH = _UxGT("Люфт"); diff --git a/Marlin/src/lcd/language/language_vi.h b/Marlin/src/lcd/language/language_vi.h index d1e98637b9..fb158e306b 100644 --- a/Marlin/src/lcd/language/language_vi.h +++ b/Marlin/src/lcd/language/language_vi.h @@ -436,7 +436,7 @@ namespace LanguageNarrow_vi { LSTR MSG_TMC_HYBRID_THRS = _UxGT("Ngưỡng Hỗn Hợp"); // Hybrid threshold LSTR MSG_TMC_HOMING_THRS = _UxGT("Vô cảm biến"); // Sensorless homing LSTR MSG_TMC_STEPPING_MODE = _UxGT("Chế độ từng bước"); // Stepping mode - LSTR MSG_TMC_STEALTH_ENABLED = _UxGT("CắtTàngHình được kích hoạt"); // StealthChop enabled + LSTR MSG_TMC_STEALTHCHOP = _UxGT("CắtTàngHình"); // StealthChop LSTR MSG_SHORT_DAY = _UxGT("n"); // d - ngày - One character only LSTR MSG_SHORT_HOUR = _UxGT("g"); // h - giờ - One character only diff --git a/Marlin/src/lcd/language/language_zh_CN.h b/Marlin/src/lcd/language/language_zh_CN.h index eb6a973205..680ff8c9b0 100644 --- a/Marlin/src/lcd/language/language_zh_CN.h +++ b/Marlin/src/lcd/language/language_zh_CN.h @@ -580,7 +580,8 @@ namespace LanguageNarrow_zh_CN { LSTR MSG_TMC_HYBRID_THRS = _UxGT("混合阈值"); LSTR MSG_TMC_HOMING_THRS = _UxGT("无感回零"); LSTR MSG_TMC_STEPPING_MODE = _UxGT("步进模式"); - LSTR MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop已使能"); + LSTR MSG_TMC_STEALTHCHOP = _UxGT("StealthChop已使能"); + LSTR MSG_SERVICE_RESET = _UxGT("复位"); LSTR MSG_SERVICE_IN = _UxGT(" 在:"); LSTR MSG_BACKLASH = _UxGT("回差"); diff --git a/Marlin/src/lcd/menu/menu_tmc.cpp b/Marlin/src/lcd/menu/menu_tmc.cpp index f73dd971df..2cf180ac97 100644 --- a/Marlin/src/lcd/menu/menu_tmc.cpp +++ b/Marlin/src/lcd/menu/menu_tmc.cpp @@ -116,7 +116,7 @@ void menu_tmc_current() { void menu_tmc_step_mode() { START_MENU(); - STATIC_ITEM(MSG_TMC_STEALTH_ENABLED); + STATIC_ITEM(MSG_TMC_STEALTHCHOP); BACK_ITEM(MSG_TMC_DRIVERS); TERN_( X_HAS_STEALTHCHOP, TMC_EDIT_STEP_MODE(X, STR_X)); TERN_(X2_HAS_STEALTHCHOP, TMC_EDIT_STEP_MODE(X2, STR_X2)); From 460bf112d8a52c67055c253569023178af8dd218 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 27 Mar 2025 03:33:27 -0500 Subject: [PATCH 54/74] =?UTF-8?q?=E2=9C=A8=20EDITABLE=5FHOMING=5FCURRENT?= =?UTF-8?q?=20(#27760)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/Configuration_adv.h | 2 + Marlin/src/core/language.h | 3 +- Marlin/src/feature/tmc_util.cpp | 4 + Marlin/src/feature/tmc_util.h | 26 ++++ Marlin/src/gcode/feature/trinamic/M906.cpp | 9 +- Marlin/src/gcode/feature/trinamic/M920.cpp | 144 +++++++++++++++++++++ Marlin/src/gcode/gcode.cpp | 7 +- Marlin/src/gcode/gcode.h | 5 + Marlin/src/lcd/language/language_en.h | 1 + Marlin/src/lcd/menu/menu_tmc.cpp | 34 ++++- Marlin/src/module/motion.cpp | 55 ++------ Marlin/src/module/settings.cpp | 51 ++++++++ buildroot/tests/STM32F103RC_btt | 5 +- ini/features.ini | 1 + 14 files changed, 291 insertions(+), 56 deletions(-) create mode 100644 Marlin/src/gcode/feature/trinamic/M920.cpp diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 7cc54b2a96..f24ece5986 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -2995,6 +2995,8 @@ #define HOLD_MULTIPLIER 0.5 // Scales down the holding current from run current + //#define EDITABLE_HOMING_CURRENT // Add a G-code and menu to modify the Homing Current + /** * Interpolate microsteps to 256 * Override for each driver with _INTERPOLATE settings below diff --git a/Marlin/src/core/language.h b/Marlin/src/core/language.h index dddc00dba8..3a50fcdc6b 100644 --- a/Marlin/src/core/language.h +++ b/Marlin/src/core/language.h @@ -312,8 +312,9 @@ #define STR_FILAMENT_RUNOUT_SENSOR "Filament runout sensor" #define STR_DRIVER_STEPPING_MODE "Driver stepping mode" #define STR_STEPPER_DRIVER_CURRENT "Stepper driver current" +#define STR_HOMING_CURRENT "Homing Current (mA)" #define STR_HYBRID_THRESHOLD "Hybrid Threshold" -#define STR_STALLGUARD_THRESHOLD "StallGuard threshold" +#define STR_STALLGUARD_THRESHOLD "StallGuard Threshold" #define STR_HOME_OFFSET "Home offset" #define STR_SOFT_ENDSTOPS "Soft endstops" #define STR_MATERIAL_HEATUP "Material heatup parameters" diff --git a/Marlin/src/feature/tmc_util.cpp b/Marlin/src/feature/tmc_util.cpp index 62972eb7f5..753cb003ff 100644 --- a/Marlin/src/feature/tmc_util.cpp +++ b/Marlin/src/feature/tmc_util.cpp @@ -43,6 +43,10 @@ #endif #endif +#if ENABLED(EDITABLE_HOMING_CURRENT) + homing_current_t homing_current_mA; +#endif + /** * Check for over temperature or short to ground error flags. * Report and log warning of overtemperature condition. diff --git a/Marlin/src/feature/tmc_util.h b/Marlin/src/feature/tmc_util.h index 27aae23f89..4cac2969a7 100644 --- a/Marlin/src/feature/tmc_util.h +++ b/Marlin/src/feature/tmc_util.h @@ -375,6 +375,32 @@ void test_tmc_connection(LOGICAL_AXIS_DECL_LC(const bool, true)); #endif // USE_SENSORLESS +#if HAS_HOMING_CURRENT + + // Axes that have a distinct homing current + struct homing_current_t { + OPTCODE(X_HAS_HOME_CURRENT, uint16_t X) + OPTCODE(Y_HAS_HOME_CURRENT, uint16_t Y) + OPTCODE(Z_HAS_HOME_CURRENT, uint16_t Z) + OPTCODE(X2_HAS_HOME_CURRENT, uint16_t X2) + OPTCODE(Y2_HAS_HOME_CURRENT, uint16_t Y2) + OPTCODE(Z2_HAS_HOME_CURRENT, uint16_t Z2) + OPTCODE(Z3_HAS_HOME_CURRENT, uint16_t Z3) + OPTCODE(Z4_HAS_HOME_CURRENT, uint16_t Z4) + OPTCODE(I_HAS_HOME_CURRENT, uint16_t I) + OPTCODE(J_HAS_HOME_CURRENT, uint16_t J) + OPTCODE(K_HAS_HOME_CURRENT, uint16_t K) + OPTCODE(U_HAS_HOME_CURRENT, uint16_t U) + OPTCODE(V_HAS_HOME_CURRENT, uint16_t V) + OPTCODE(W_HAS_HOME_CURRENT, uint16_t W) + }; + + #if ENABLED(EDITABLE_HOMING_CURRENT) + extern homing_current_t homing_current_mA; + #endif + +#endif // HAS_HOMING_CURRENT + #endif // HAS_TRINAMIC_CONFIG #if HAS_TMC_SPI diff --git a/Marlin/src/gcode/feature/trinamic/M906.cpp b/Marlin/src/gcode/feature/trinamic/M906.cpp index 43d980098e..74bbf9cae0 100644 --- a/Marlin/src/gcode/feature/trinamic/M906.cpp +++ b/Marlin/src/gcode/feature/trinamic/M906.cpp @@ -37,6 +37,8 @@ static void tmc_print_current(TMC &st) { /** * M906: Set motor current in milliamps. * + * With no parameters report driver currents. + * * Parameters: * X[current] - Set mA current for X driver(s) * Y[current] - Set mA current for Y driver(s) @@ -52,9 +54,14 @@ static void tmc_print_current(TMC &st) { * I[index] - Axis sub-index (Omit or 0 for X, Y, Z; 1 for X2, Y2, Z2; 2 for Z3; 3 for Z4.) * T[index] - Extruder index (Zero-based. Omit for E0 only.) * - * With no parameters report driver currents. + * With EDITABLE_HOMING_CURRENT: + * H - Set / Report Homing Current. Alias for M920. */ void GcodeSuite::M906() { + #if ENABLED(EDITABLE_HOMING_CURRENT) + if (parser.seen_test('H')) return M920(); + #endif + #define TMC_SAY_CURRENT(Q) tmc_print_current(stepper##Q) #define TMC_SET_CURRENT(Q) stepper##Q.rms_current(value) diff --git a/Marlin/src/gcode/feature/trinamic/M920.cpp b/Marlin/src/gcode/feature/trinamic/M920.cpp new file mode 100644 index 0000000000..2852f8bf44 --- /dev/null +++ b/Marlin/src/gcode/feature/trinamic/M920.cpp @@ -0,0 +1,144 @@ +/** + * 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 . + * + */ + +#include "../../../inc/MarlinConfigPre.h" + +#if ENABLED(EDITABLE_HOMING_CURRENT) + +#include "../../gcode.h" +#include "../../../feature/tmc_util.h" + +#if AXIS_COLLISION('I') + #define I_PARAM 'S' + #define I_PARAM_STR "S" + #warning "Use 'M920 S' instead of 'M920 I' for the stepper number." +#else + #define I_PARAM 'I' + #define I_PARAM_STR "I" +#endif + +/** + * M920: Set Homing Current for one or more axes + * + * Parameters: + * X[current] - Homing Current to use for X axis stepper(s) + * Y[current] - Homing Current to use for Y axis stepper(s) + * Z[current] - Homing Current to use for Z axis stepper(s) + * A[current] - Homing Current to use for A axis stepper(s) + * B[current] - Homing Current to use for B axis stepper(s) + * C[current] - Homing Current to use for C axis stepper(s) + * U[current] - Homing Current to use for U axis stepper(s) + * V[current] - Homing Current to use for V axis stepper(s) + * W[current] - Homing Current to use for W axis stepper(s) + * + * I - For multi-stepper axes, the zero-based index of the stepper to modify in each axis. + * If omitted all steppers of each axis will be set to the given axis current. + */ +void GcodeSuite::M920() { + bool report = true; + const uint8_t index = parser.byteval(I_PARAM); + LOOP_NUM_AXES(i) if (parser.seen(AXIS_CHAR(i))) { + const int16_t value = parser.value_int(); + report = false; + switch (i) { + #if X_HAS_HOME_CURRENT + case X_AXIS: + if (index < 1) homing_current_mA.X = value; + TERN_(X2_HAS_HOME_CURRENT, if (!index || index == 1) homing_current_mA.X2 = value); + break; + #endif + #if Y_HAS_HOME_CURRENT + case Y_AXIS: + if (index < 1) homing_current_mA.Y = value; + TERN_(Y2_HAS_HOME_CURRENT, if (!index || index == 1) homing_current_mA.Y2 = value); + break; + #endif + #if Z_HAS_HOME_CURRENT + case Z_AXIS: + if (index < 1) homing_current_mA.Z = value; + TERN_(Z2_HAS_HOME_CURRENT, if (!index || index == 1) homing_current_mA.Z2 = value); + TERN_(Z3_HAS_HOME_CURRENT, if (!index || index == 2) homing_current_mA.Z3 = value); + TERN_(Z4_HAS_HOME_CURRENT, if (!index || index == 3) homing_current_mA.Z4 = value); + break; + #endif + OPTCODE(I_HAS_HOME_CURRENT, case I_AXIS: homing_current_mA.I = value; break) + OPTCODE(J_HAS_HOME_CURRENT, case J_AXIS: homing_current_mA.J = value; break) + OPTCODE(K_HAS_HOME_CURRENT, case K_AXIS: homing_current_mA.K = value; break) + OPTCODE(U_HAS_HOME_CURRENT, case U_AXIS: homing_current_mA.U = value; break) + OPTCODE(V_HAS_HOME_CURRENT, case V_AXIS: homing_current_mA.V = value; break) + OPTCODE(W_HAS_HOME_CURRENT, case W_AXIS: homing_current_mA.W = value; break) + } + } + + if (report) M920_report(); +} + +void GcodeSuite::M920_report(const bool forReplay/*=true*/) { + TERN_(MARLIN_SMALL_BUILD, return); + + report_heading(forReplay, F(STR_HOMING_CURRENT)); + + auto say_M920 = [](const bool forReplay, int16_t index=-1) { + report_echo_start(forReplay); + SERIAL_ECHOPGM(" M920"); + if (index >= 0) SERIAL_ECHOPGM(" " I_PARAM_STR, index); + }; + + #if X_SENSORLESS || Y_SENSORLESS || Z_SENSORLESS + #if X2_SENSORLESS || Y2_SENSORLESS || Z2_SENSORLESS || Z3_SENSORLESS || Z4_SENSORLESS + say_M920(forReplay, 0); + #else + say_M920(forReplay); + #endif + TERN_(X_SENSORLESS, SERIAL_ECHOPGM_P(SP_X_STR, homing_current_mA.X)); + TERN_(Y_SENSORLESS, SERIAL_ECHOPGM_P(SP_Y_STR, homing_current_mA.Y)); + TERN_(Z_SENSORLESS, SERIAL_ECHOPGM_P(SP_Z_STR, homing_current_mA.Z)); + #if X2_SENSORLESS || Y2_SENSORLESS || Z2_SENSORLESS || Z3_SENSORLESS || Z4_SENSORLESS + say_M920(forReplay); + #endif + TERN_(I_SENSORLESS, SERIAL_ECHOPGM_P(SP_I_STR, homing_current_mA.I)); + TERN_(J_SENSORLESS, SERIAL_ECHOPGM_P(SP_J_STR, homing_current_mA.J)); + TERN_(K_SENSORLESS, SERIAL_ECHOPGM_P(SP_K_STR, homing_current_mA.K)); + TERN_(U_SENSORLESS, SERIAL_ECHOPGM_P(SP_U_STR, homing_current_mA.U)); + TERN_(V_SENSORLESS, SERIAL_ECHOPGM_P(SP_V_STR, homing_current_mA.V)); + TERN_(W_SENSORLESS, SERIAL_ECHOPGM_P(SP_W_STR, homing_current_mA.W)); + SERIAL_EOL(); + #endif + + #if X2_SENSORLESS || Y2_SENSORLESS || Z2_SENSORLESS + say_M920(forReplay, 1); + TERN_(X2_SENSORLESS, SERIAL_ECHOPGM_P(SP_X_STR, homing_current_mA.X2)); + TERN_(Y2_SENSORLESS, SERIAL_ECHOPGM_P(SP_Y_STR, homing_current_mA.Y2)); + TERN_(Z2_SENSORLESS, SERIAL_ECHOPGM_P(SP_Z_STR, homing_current_mA.Z2)); + SERIAL_EOL(); + #endif + #if Z3_SENSORLESS + say_M920(forReplay, 2); + SERIAL_ECHOLNPGM(" Z", homing_current_mA.Z3); + #endif + #if Z4_SENSORLESS + say_M920(forReplay, 3); + SERIAL_ECHOLNPGM(" Z", homing_current_mA.Z4); + #endif +} + +#endif // EDITABLE_HOMING_CURRENT diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index 64326b32af..8a444053e6 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -1056,12 +1056,15 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { case 912: M912(); break; // M912: Clear TMC2130 prewarn triggered flags #endif #if ENABLED(HYBRID_THRESHOLD) - case 913: M913(); break; // M913: Set HYBRID_THRESHOLD speed. + case 913: M913(); break; // M913: Set HYBRID_THRESHOLD speed #endif #if USE_SENSORLESS - case 914: M914(); break; // M914: Set StallGuard sensitivity. + case 914: M914(); break; // M914: Set StallGuard sensitivity #endif case 919: M919(); break; // M919: Set stepper Chopper Times + #if ENABLED(EDITABLE_HOMING_CURRENT) + case 920: M920(); break; // M920: Set Homing Current + #endif #endif #if HAS_MICROSTEPS diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h index 7ba1c58d2a..1d39dc3a6b 100644 --- a/Marlin/src/gcode/gcode.h +++ b/Marlin/src/gcode/gcode.h @@ -320,6 +320,7 @@ * 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)) + * 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) * M3426 - Read MCP3426 ADC over I2C. (Requires HAS_MCP3426_ADC) @@ -1259,6 +1260,10 @@ private: static void M914_report(const bool forReplay=true); #endif static void M919(); + #if ENABLED(EDITABLE_HOMING_CURRENT) + static void M920(); + static void M920_report(const bool forReplay=true); + #endif #endif #if HAS_MOTOR_CURRENT_SPI || HAS_MOTOR_CURRENT_PWM || HAS_MOTOR_CURRENT_I2C || HAS_MOTOR_CURRENT_DAC diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index ca2e50d063..571f85e8ce 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -883,6 +883,7 @@ namespace LanguageNarrow_en { LSTR MSG_TMC_HOMING_THRS = _UxGT("Sensorless Homing"); LSTR MSG_TMC_STEPPING_MODE = _UxGT("Stepping Mode"); LSTR MSG_TMC_STEALTHCHOP = _UxGT("StealthChop"); + LSTR MSG_TMC_HOMING_CURRENT = _UxGT("Homing Current"); LSTR MSG_SERVICE_RESET = _UxGT("Reset"); LSTR MSG_SERVICE_IN = _UxGT(" in:"); diff --git a/Marlin/src/lcd/menu/menu_tmc.cpp b/Marlin/src/lcd/menu/menu_tmc.cpp index 2cf180ac97..2ddb38f3a4 100644 --- a/Marlin/src/lcd/menu/menu_tmc.cpp +++ b/Marlin/src/lcd/menu/menu_tmc.cpp @@ -110,6 +110,33 @@ void menu_tmc_current() { #endif // SENSORLESS_HOMING +#if ENABLED(EDITABLE_HOMING_CURRENT) + + #define TMC_EDIT_HOMING_CURRENT(ST, STR) EDIT_ITEM_FAST_F(uint16_4, F(STR), &homing_current_mA.ST, ST##_CURRENT / 3, ST##_CURRENT) + + void menu_tmc_homing_current() { + START_MENU(); + STATIC_ITEM(MSG_TMC_HOMING_CURRENT); + BACK_ITEM(MSG_TMC_DRIVERS); + TERN_( X_HAS_HOME_CURRENT, TMC_EDIT_HOMING_CURRENT(X, STR_X)); + TERN_(X2_HAS_HOME_CURRENT, TMC_EDIT_HOMING_CURRENT(X2, STR_X2)); + TERN_( Y_HAS_HOME_CURRENT, TMC_EDIT_HOMING_CURRENT(Y, STR_Y)); + TERN_(Y2_HAS_HOME_CURRENT, TMC_EDIT_HOMING_CURRENT(Y2, STR_Y2)); + TERN_( Z_HAS_HOME_CURRENT, TMC_EDIT_HOMING_CURRENT(Z, STR_Z)); + TERN_(Z2_HAS_HOME_CURRENT, TMC_EDIT_HOMING_CURRENT(Z2, STR_Z2)); + TERN_(Z3_HAS_HOME_CURRENT, TMC_EDIT_HOMING_CURRENT(Z3, STR_Z3)); + TERN_(Z4_HAS_HOME_CURRENT, TMC_EDIT_HOMING_CURRENT(Z4, STR_Z4)); + TERN_( I_HAS_HOME_CURRENT, TMC_EDIT_HOMING_CURRENT(I, STR_I)); + TERN_( J_HAS_HOME_CURRENT, TMC_EDIT_HOMING_CURRENT(J, STR_J)); + TERN_( K_HAS_HOME_CURRENT, TMC_EDIT_HOMING_CURRENT(K, STR_K)); + TERN_( U_HAS_HOME_CURRENT, TMC_EDIT_HOMING_CURRENT(U, STR_U)); + TERN_( V_HAS_HOME_CURRENT, TMC_EDIT_HOMING_CURRENT(V, STR_V)); + TERN_( W_HAS_HOME_CURRENT, TMC_EDIT_HOMING_CURRENT(W, STR_W)); + END_MENU(); + } + +#endif // EDITABLE_HOMING_CURRENT + #if HAS_STEALTHCHOP #define TMC_EDIT_STEP_MODE(ST, STR) EDIT_ITEM_F(bool, F(STR), &stepper##ST.stored.stealthChop_enabled, []{ stepper##ST.refresh_stepping_mode(); }) @@ -143,9 +170,10 @@ void menu_tmc() { START_MENU(); BACK_ITEM(MSG_ADVANCED_SETTINGS); SUBMENU(MSG_TMC_CURRENT, menu_tmc_current); - TERN_(HYBRID_THRESHOLD, SUBMENU(MSG_TMC_HYBRID_THRS, menu_tmc_hybrid_thrs)); - TERN_(SENSORLESS_HOMING, SUBMENU(MSG_TMC_HOMING_THRS, menu_tmc_homing_thrs)); - TERN_(HAS_STEALTHCHOP, SUBMENU(MSG_TMC_STEPPING_MODE, menu_tmc_step_mode)); + TERN_(HYBRID_THRESHOLD, SUBMENU(MSG_TMC_HYBRID_THRS, menu_tmc_hybrid_thrs)); + TERN_(SENSORLESS_HOMING, SUBMENU(MSG_TMC_HOMING_THRS, menu_tmc_homing_thrs)); + TERN_(EDITABLE_HOMING_CURRENT, SUBMENU(MSG_TMC_HOMING_CURRENT, menu_tmc_homing_current)); + TERN_(HAS_STEALTHCHOP, SUBMENU(MSG_TMC_STEALTHCHOP, menu_tmc_step_mode)); END_MENU(); } diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index 386d46665d..fcaaf613e4 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -271,48 +271,7 @@ void report_current_position_projected() { #define debug_current(...) #endif - #if HAS_CURRENT_HOME_X - int16_t saved_current_X; - #endif - #if HAS_CURRENT_HOME_Y - int16_t saved_current_Y; - #endif - #if HAS_CURRENT_HOME_Z - int16_t saved_current_Z; - #endif - #if HAS_CURRENT_HOME_X2 - int16_t saved_current_X2; - #endif - #if HAS_CURRENT_HOME_Y2 - int16_t saved_current_Y2; - #endif - #if HAS_CURRENT_HOME_Z2 - int16_t saved_current_Z2; - #endif - #if HAS_CURRENT_HOME_Z3 - int16_t saved_current_Z3; - #endif - #if HAS_CURRENT_HOME_Z4 - int16_t saved_current_Z4; - #endif - #if HAS_CURRENT_HOME_I - int16_t saved_current_I; - #endif - #if HAS_CURRENT_HOME_J - int16_t saved_current_J; - #endif - #if HAS_CURRENT_HOME_K - int16_t saved_current_K; - #endif - #if HAS_CURRENT_HOME_U - int16_t saved_current_U; - #endif - #if HAS_CURRENT_HOME_V - int16_t saved_current_V; - #endif - #if HAS_CURRENT_HOME_W - int16_t saved_current_W; - #endif + homing_current_t saved_current_mA; /** * Set motors to their homing / probing currents. @@ -320,11 +279,13 @@ void report_current_position_projected() { */ void set_homing_current(const AxisEnum axis) { + #define HOMING_CURRENT(A) TERN(EDITABLE_HOMING_CURRENT, homing_current_mA.A, A##_CURRENT_HOME) + // Saves the running current of the motor at the moment the function is called and sets current to CURRENT_HOME #define _SAVE_SET_CURRENT(A) \ - saved_current_##A = stepper##A.getMilliamps(); \ - stepper##A.rms_current(A##_CURRENT_HOME); \ - debug_current(F(STR_##A), saved_current_##A, A##_CURRENT_HOME) + saved_current_mA.A = stepper##A.getMilliamps(); \ + stepper##A.rms_current(HOMING_CURRENT(A)); \ + debug_current(F(STR_##A), saved_current_mA.A, HOMING_CURRENT(A)) #define _MAP_SAVE_SET(A) OPTCODE(A##_HAS_HOME_CURRENT, _SAVE_SET_CURRENT(A)) @@ -478,8 +439,8 @@ void report_current_position_projected() { // Restore the saved current #define _RESTORE_CURRENT(A) \ - stepper##A.rms_current(saved_current_##A); \ - debug_current(F(STR_##A), A##_CURRENT_HOME, saved_current_##A) + stepper##A.rms_current(saved_current_mA.A); \ + debug_current(F(STR_##A), HOMING_CURRENT(A), saved_current_mA.A) #define _MAP_RESTORE(A) OPTCODE(A##_HAS_HOME_CURRENT, _RESTORE_CURRENT(A)) diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index a7e791951b..c2b4e3da38 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -469,6 +469,13 @@ typedef struct SettingsDataStruct { xyz_feedrate_t homing_feedrate_mm_m; // M210 X Y Z I J K U V W #endif + // + // TMC Homing Current + // + #if ENABLED(EDITABLE_HOMING_CURRENT) + homing_current_t homing_current_mA; // M920 X Y Z... + #endif + // // !NO_VOLUMETRIC // @@ -1355,6 +1362,14 @@ void MarlinSettings::postprocess() { EEPROM_WRITE(homing_feedrate_mm_m); #endif + // + // TMC Homing Current + // + #if ENABLED(EDITABLE_HOMING_CURRENT) + _FIELD_TEST(homing_current_mA); + EEPROM_WRITE(homing_current_mA); + #endif + // // Volumetric & Filament Size // @@ -2414,6 +2429,14 @@ void MarlinSettings::postprocess() { EEPROM_READ(homing_feedrate_mm_m); #endif + // + // TMC Homing Current + // + #if ENABLED(EDITABLE_HOMING_CURRENT) + _FIELD_TEST(homing_current_mA); + EEPROM_READ(homing_current_mA); + #endif + // // Volumetric & Filament Size // @@ -3626,6 +3649,29 @@ void MarlinSettings::reset() { // TERN_(EDITABLE_HOMING_FEEDRATE, homing_feedrate_mm_m = xyz_feedrate_t(HOMING_FEEDRATE_MM_M)); + // + // TMC Homing Current + // + #if ENABLED(EDITABLE_HOMING_CURRENT) + homing_current_t base_homing_current_mA = { + OPTITEM(X_HAS_HOME_CURRENT, X_CURRENT_HOME) + OPTITEM(Y_HAS_HOME_CURRENT, Y_CURRENT_HOME) + OPTITEM(Z_HAS_HOME_CURRENT, Z_CURRENT_HOME) + OPTITEM(X2_HAS_HOME_CURRENT, X2_CURRENT_HOME) + OPTITEM(Y2_HAS_HOME_CURRENT, Y2_CURRENT_HOME) + OPTITEM(Z2_HAS_HOME_CURRENT, Z2_CURRENT_HOME) + OPTITEM(Z3_HAS_HOME_CURRENT, Z3_CURRENT_HOME) + OPTITEM(Z4_HAS_HOME_CURRENT, Z4_CURRENT_HOME) + OPTITEM(I_HAS_HOME_CURRENT, I_CURRENT_HOME) + OPTITEM(J_HAS_HOME_CURRENT, J_CURRENT_HOME) + OPTITEM(K_HAS_HOME_CURRENT, K_CURRENT_HOME) + OPTITEM(U_HAS_HOME_CURRENT, U_CURRENT_HOME) + OPTITEM(V_HAS_HOME_CURRENT, V_CURRENT_HOME) + OPTITEM(W_HAS_HOME_CURRENT, W_CURRENT_HOME) + }; + homing_current_mA = base_homing_current_mA; + #endif + // // Volumetric & Filament Size // @@ -4058,6 +4104,11 @@ void MarlinSettings::reset() { TERN_(USE_SENSORLESS, gcode.M914_report(forReplay)); #endif + // + // TMC Homing Current + // + TERN_(EDITABLE_HOMING_CURRENT, gcode.M920_report(forReplay)); + // // TMC stepping mode // diff --git a/buildroot/tests/STM32F103RC_btt b/buildroot/tests/STM32F103RC_btt index 178170455f..2b05d42922 100755 --- a/buildroot/tests/STM32F103RC_btt +++ b/buildroot/tests/STM32F103RC_btt @@ -11,8 +11,9 @@ set -e # restore_configs opt_set MOTHERBOARD BOARD_BTT_SKR_MINI_E3_V1_0 SERIAL_PORT 1 SERIAL_PORT_2 -1 \ - X_DRIVER_TYPE TMC2209 Y_DRIVER_TYPE TMC2209 Z_DRIVER_TYPE TMC2209 E0_DRIVER_TYPE TMC2209 -opt_enable CR10_STOCKDISPLAY PINS_DEBUGGING Z_IDLE_HEIGHT \ + X_DRIVER_TYPE TMC2209 Y_DRIVER_TYPE TMC2209 Z_DRIVER_TYPE TMC2209 E0_DRIVER_TYPE TMC2209 \ + 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 exec_test $1 $2 "BigTreeTech SKR Mini E3 1.0 - TMC2209 HW Serial, FT_MOTION" "$3" diff --git a/ini/features.ini b/ini/features.ini index f56175a3d6..1cff1a61f4 100644 --- a/ini/features.ini +++ b/ini/features.ini @@ -23,6 +23,7 @@ MKS_WIFI_MODULE = QRCode=https://github.com/makerbase-mks HAS_TRINAMIC_CONFIG = TMCStepper=https://github.com/MarlinFirmware/TMCStepper/archive/marlin-2.1.3.x.zip build_src_filter=+ + + + + HAS_T(RINAMIC_CONFIG|MC_SPI) = build_src_filter=+ +EDITABLE_HOMING_CURRENT = build_src_filter=+ SR_LCD_3W_NL = SailfishLCD=https://github.com/mikeshub/SailfishLCD/archive/6f53c19a8a.zip HAS_MOTOR_CURRENT_(I2C|DAC|SPI|PWM) = build_src_filter=+ HAS_MOTOR_CURRENT_I2C = SlowSoftI2CMaster From 5c59abaf6f273be325d92d79ae63e393e8c6038a Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Thu, 27 Mar 2025 12:11:04 +0000 Subject: [PATCH 55/74] [cron] Bump distribution date (2025-03-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 18f9ce19e8..c24e090c3d 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-03-26" +//#define STRING_DISTRIBUTION_DATE "2025-03-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 0d24f4c508..690de1c353 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-03-26" + #define STRING_DISTRIBUTION_DATE "2025-03-27" #endif /** From 9a8ad9d1013e7273ee7ef679ddf212f537c4708e Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 27 Mar 2025 17:34:33 -0500 Subject: [PATCH 56/74] =?UTF-8?q?=F0=9F=8E=A8=20Comment=20long=20functions?= =?UTF-8?q?=20end?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/HAL/RP2040/pinsDebug.h | 2 +- Marlin/src/MarlinCore.cpp | 10 +++++----- Marlin/src/module/probe.cpp | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Marlin/src/HAL/RP2040/pinsDebug.h b/Marlin/src/HAL/RP2040/pinsDebug.h index 964fb71086..f3842c4aff 100644 --- a/Marlin/src/HAL/RP2040/pinsDebug.h +++ b/Marlin/src/HAL/RP2040/pinsDebug.h @@ -107,7 +107,7 @@ uint8_t get_pin_mode(const pin_t Ard_num) { uint dir = gpio_get_dir( Ard_num); - if(dir) return MODE_PIN_OUTPUT; + if (dir) return MODE_PIN_OUTPUT; else return MODE_PIN_INPUT; } diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 689f71f8e5..3c44a9b71f 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -736,7 +736,7 @@ inline void manage_inactivity(const bool no_stepper_sleep=false) { WRITE(FET_SAFETY_PIN, FET_SAFETY_INVERTED); } #endif -} +} // manage_inactivity() #if ALL(EP_BABYSTEPPING, EMERGENCY_PARSER) #include "feature/babystep.h" @@ -890,7 +890,7 @@ void idle(const bool no_stepper_sleep/*=false*/) { TERN_(MARLIN_DEV_MODE, idle_depth--); return; -} +} // idle() /** * Kill all activity and lock the machine. @@ -983,7 +983,7 @@ void stop() { safe_delay(350); // allow enough time for messages to get out before stopping marlin_state = MarlinState::MF_STOPPED; } -} +} // stop() inline void tmc_standby_setup() { #if PIN_EXISTS(X_STDBY) @@ -1052,7 +1052,7 @@ inline void tmc_standby_setup() { #if PIN_EXISTS(E7_STDBY) SET_INPUT_PULLDOWN(E7_STDBY_PIN); #endif -} +} // tmc_standby_setup() /** * Marlin Firmware entry-point. Abandon Hope All Ye Who Enter Here. @@ -1702,7 +1702,7 @@ void setup() { SETUP_LOG("setup() completed."); TERN_(MARLIN_TEST_BUILD, runStartupTests()); -} +} // setup() /** * The main Marlin program loop diff --git a/Marlin/src/module/probe.cpp b/Marlin/src/module/probe.cpp index e121bca812..4f7d7c7690 100644 --- a/Marlin/src/module/probe.cpp +++ b/Marlin/src/module/probe.cpp @@ -275,7 +275,7 @@ xyz_pos_t Probe::offset; // Initialized by settings.load #ifdef MAG_MOUNTED_PRE_DEPLOY constexpr mag_probe_move_t pre_deploy = MAG_MOUNTED_PRE_DEPLOY; do_blocking_move_to(pre_deploy.where, MMM_TO_MMS(pre_deploy.fr_mm_min)); - #endif + #endif #if HAS_MAG_MOUNTED_SERVO_PROBE servo[MAG_MOUNTED_PROBE_SERVO_NR].move(servo_angles[MAG_MOUNTED_PROBE_SERVO_NR][0]); #endif From b5068bbc17ed395103564f302aa0cbdde8c004c1 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 27 Mar 2025 17:36:16 -0500 Subject: [PATCH 57/74] =?UTF-8?q?=F0=9F=94=A8=20Reduce=20warnings=20on=20t?= =?UTF-8?q?ypes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/core/types.h | 77 ++++++++++++++++++++++----------------- Marlin/src/core/utility.h | 11 ------ 2 files changed, 44 insertions(+), 44 deletions(-) diff --git a/Marlin/src/core/types.h b/Marlin/src/core/types.h index 68adadc95d..395dc430f5 100644 --- a/Marlin/src/core/types.h +++ b/Marlin/src/core/types.h @@ -566,11 +566,11 @@ struct XYval { FI XYval& operator= (const XYZEval &rs) { set(XY_LIST(rs.x, rs.y)); return *this; } // Override other operators to get intuitive behaviors - #define XY_OP(OP) { x TERN_(HAS_X_AXIS, OP rs.x), y TERN_(HAS_Y_AXIS, OP rs.y) } - FI constexpr XYval operator+ (const XYval &rs) const { return { x + rs.x, y + rs.y }; } - FI constexpr XYval operator- (const XYval &rs) const { return { x - rs.x, y - rs.y }; } - FI constexpr XYval operator* (const XYval &rs) const { return { x * rs.x, y * rs.y }; } - FI constexpr XYval operator/ (const XYval &rs) const { return { x / rs.x, y / rs.y }; } + #define XY_OP(OP) { T(x TERN_(HAS_X_AXIS, OP rs.x)), T(y TERN_(HAS_Y_AXIS, OP rs.y)) } + FI constexpr XYval operator+ (const XYval &rs) const { return { T(x + rs.x), T(y + rs.y) }; } + FI constexpr XYval operator- (const XYval &rs) const { return { T(x - rs.x), T(y - rs.y) }; } + FI constexpr XYval operator* (const XYval &rs) const { return { T(x * rs.x), T(y * rs.y) }; } + FI constexpr XYval operator/ (const XYval &rs) const { return { T(x / rs.x), T(y / rs.y) }; } FI constexpr XYval operator+ (const XYZval &rs) const { return { XY_OP(+) }; } FI constexpr XYval operator- (const XYZval &rs) const { return { XY_OP(-) }; } FI constexpr XYval operator* (const XYZval &rs) const { return { XY_OP(*) }; } @@ -721,21 +721,21 @@ struct XYZval { FI XYZval& operator= (const XYZEval &rs) { set(NUM_AXIS_ELEM_LC(rs)); return *this; } // Override other operators to get intuitive behaviors - FI constexpr XYZval operator+ (const XYval &rs) const { return NUM_AXIS_ARRAY(x + rs.x, y + rs.y, z, i, j, k, u, v, w ); } - FI constexpr XYZval operator- (const XYval &rs) const { return NUM_AXIS_ARRAY(x - rs.x, y - rs.y, z, i, j, k, u, v, w ); } - FI constexpr XYZval operator* (const XYval &rs) const { return NUM_AXIS_ARRAY(x * rs.x, y * rs.y, z, i, j, k, u, v, w ); } - FI constexpr XYZval operator/ (const XYval &rs) const { return NUM_AXIS_ARRAY(x / rs.x, y / rs.y, z, i, j, k, u, v, w ); } - FI constexpr XYZval operator+ (const XYZval &rs) const { return NUM_AXIS_ARRAY(x + rs.x, y + rs.y, z + rs.z, i + rs.i, j + rs.j, k + rs.k, u + rs.u, v + rs.v, w + rs.w ); } - FI constexpr XYZval operator- (const XYZval &rs) const { return NUM_AXIS_ARRAY(x - rs.x, y - rs.y, z - rs.z, i - rs.i, j - rs.j, k - rs.k, u - rs.u, v - rs.v, w - rs.w ); } - FI constexpr XYZval operator* (const XYZval &rs) const { return NUM_AXIS_ARRAY(x * rs.x, y * rs.y, z * rs.z, i * rs.i, j * rs.j, k * rs.k, u * rs.u, v * rs.v, w * rs.w ); } - FI constexpr XYZval operator/ (const XYZval &rs) const { return NUM_AXIS_ARRAY(x / rs.x, y / rs.y, z / rs.z, i / rs.i, j / rs.j, k / rs.k, u / rs.u, v / rs.v, w / rs.w ); } - FI constexpr XYZval operator+ (const XYZEval &rs) const { return NUM_AXIS_ARRAY(x + rs.x, y + rs.y, z + rs.z, i + rs.i, j + rs.j, k + rs.k, u + rs.u, v + rs.v, w + rs.w ); } - FI constexpr XYZval operator- (const XYZEval &rs) const { return NUM_AXIS_ARRAY(x - rs.x, y - rs.y, z - rs.z, i - rs.i, j - rs.j, k - rs.k, u - rs.u, v - rs.v, w - rs.w ); } - FI constexpr XYZval operator* (const XYZEval &rs) const { return NUM_AXIS_ARRAY(x * rs.x, y * rs.y, z * rs.z, i * rs.i, j * rs.j, k * rs.k, u * rs.u, v * rs.v, w * rs.w ); } - FI constexpr XYZval operator/ (const XYZEval &rs) const { return NUM_AXIS_ARRAY(x / rs.x, y / rs.y, z / rs.z, i / rs.i, j / rs.j, k / rs.k, u / rs.u, v / rs.v, w / rs.w ); } - FI constexpr XYZval operator* (const float &p) const { return NUM_AXIS_ARRAY((T)(x * p), (T)(y * p), (T)(z * p), (T)(i * p), (T)(j * p), (T)(k * p), (T)(u * p), (T)(v * p), (T)(w * p)); } + FI constexpr XYZval operator+ (const XYval &rs) const { return NUM_AXIS_ARRAY(T(x + rs.x), T(y + rs.y), z, i, j, k, u, v, w ); } + FI constexpr XYZval operator- (const XYval &rs) const { return NUM_AXIS_ARRAY(T(x - rs.x), T(y - rs.y), z, i, j, k, u, v, w ); } + FI constexpr XYZval operator* (const XYval &rs) const { return NUM_AXIS_ARRAY(T(x * rs.x), T(y * rs.y), z, i, j, k, u, v, w ); } + FI constexpr XYZval operator/ (const XYval &rs) const { return NUM_AXIS_ARRAY(T(x / rs.x), T(y / rs.y), z, i, j, k, u, v, w ); } + FI constexpr XYZval operator+ (const XYZval &rs) const { return NUM_AXIS_ARRAY(T(x + rs.x), T(y + rs.y), T(z + rs.z), T(i + rs.i), T(j + rs.j), T(k + rs.k), T(u + rs.u), T(v + rs.v), T(w + rs.w) ); } + FI constexpr XYZval operator- (const XYZval &rs) const { return NUM_AXIS_ARRAY(T(x - rs.x), T(y - rs.y), T(z - rs.z), T(i - rs.i), T(j - rs.j), T(k - rs.k), T(u - rs.u), T(v - rs.v), T(w - rs.w) ); } + FI constexpr XYZval operator* (const XYZval &rs) const { return NUM_AXIS_ARRAY(T(x * rs.x), T(y * rs.y), T(z * rs.z), T(i * rs.i), T(j * rs.j), T(k * rs.k), T(u * rs.u), T(v * rs.v), T(w * rs.w) ); } + FI constexpr XYZval operator/ (const XYZval &rs) const { return NUM_AXIS_ARRAY(T(x / rs.x), T(y / rs.y), T(z / rs.z), T(i / rs.i), T(j / rs.j), T(k / rs.k), T(u / rs.u), T(v / rs.v), T(w / rs.w) ); } + FI constexpr XYZval operator+ (const XYZEval &rs) const { return NUM_AXIS_ARRAY(T(x + rs.x), T(y + rs.y), T(z + rs.z), T(i + rs.i), T(j + rs.j), T(k + rs.k), T(u + rs.u), T(v + rs.v), T(w + rs.w) ); } + FI constexpr XYZval operator- (const XYZEval &rs) const { return NUM_AXIS_ARRAY(T(x - rs.x), T(y - rs.y), T(z - rs.z), T(i - rs.i), T(j - rs.j), T(k - rs.k), T(u - rs.u), T(v - rs.v), T(w - rs.w) ); } + FI constexpr XYZval operator* (const XYZEval &rs) const { return NUM_AXIS_ARRAY(T(x * rs.x), T(y * rs.y), T(z * rs.z), T(i * rs.i), T(j * rs.j), T(k * rs.k), T(u * rs.u), T(v * rs.v), T(w * rs.w) ); } + FI constexpr XYZval operator/ (const XYZEval &rs) const { return NUM_AXIS_ARRAY(T(x / rs.x), T(y / rs.y), T(z / rs.z), T(i / rs.i), T(j / rs.j), T(k / rs.k), T(u / rs.u), T(v / rs.v), T(w / rs.w) ); } + FI constexpr XYZval operator* (const float &p) const { return NUM_AXIS_ARRAY(T(x * p), T(y * p), T(z * p), T(i * p), T(j * p), T(k * p), T(u * p), T(v * p), T(w * p)); } FI constexpr XYZval operator* (const int &p) const { return NUM_AXIS_ARRAY(x * p, y * p, z * p, i * p, j * p, k * p, u * p, v * p, w * p); } - FI constexpr XYZval operator/ (const float &p) const { return NUM_AXIS_ARRAY((T)(x / p), (T)(y / p), (T)(z / p), (T)(i / p), (T)(j / p), (T)(k / p), (T)(u / p), (T)(v / p), (T)(w / p)); } + FI constexpr XYZval operator/ (const float &p) const { return NUM_AXIS_ARRAY(T(x / p), T(y / p), T(z / p), T(i / p), T(j / p), T(k / p), T(u / p), T(v / p), T(w / p)); } FI constexpr XYZval operator/ (const int &p) const { return NUM_AXIS_ARRAY(x / p, y / p, z / p, i / p, j / p, k / p, u / p, v / p, w / p); } FI constexpr XYZval operator>>(const int &p) const { return NUM_AXIS_ARRAY(_RS(x), _RS(y), _RS(z), _RS(i), _RS(j), _RS(k), _RS(u), _RS(v), _RS(w)); } FI constexpr XYZval operator<<(const int &p) const { return NUM_AXIS_ARRAY(_LS(x), _LS(y), _LS(z), _LS(i), _LS(j), _LS(k), _LS(u), _LS(v), _LS(w)); } @@ -870,21 +870,21 @@ struct XYZEval { FI XYZEval& operator= (const XYZval &rs) { set(NUM_AXIS_ELEM_LC(rs)); return *this; } // Override other operators to get intuitive behaviors - FI constexpr XYZEval operator+ (const XYval &rs) const { return LOGICAL_AXIS_ARRAY(e, x + rs.x, y + rs.y, z, i, j, k, u, v, w); } - FI constexpr XYZEval operator- (const XYval &rs) const { return LOGICAL_AXIS_ARRAY(e, x - rs.x, y - rs.y, z, i, j, k, u, v, w); } - FI constexpr XYZEval operator* (const XYval &rs) const { return LOGICAL_AXIS_ARRAY(e, x * rs.x, y * rs.y, z, i, j, k, u, v, w); } - FI constexpr XYZEval operator/ (const XYval &rs) const { return LOGICAL_AXIS_ARRAY(e, x / rs.x, y / rs.y, z, i, j, k, u, v, w); } - FI constexpr XYZEval operator+ (const XYZval &rs) const { return LOGICAL_AXIS_ARRAY(e, x + rs.x, y + rs.y, z + rs.z, i + rs.i, j + rs.j, k + rs.k, u + rs.u, v + rs.v, w + rs.w); } - FI constexpr XYZEval operator- (const XYZval &rs) const { return LOGICAL_AXIS_ARRAY(e, x - rs.x, y - rs.y, z - rs.z, i - rs.i, j - rs.j, k - rs.k, u - rs.u, v - rs.v, w - rs.w); } - FI constexpr XYZEval operator* (const XYZval &rs) const { return LOGICAL_AXIS_ARRAY(e, x * rs.x, y * rs.y, z * rs.z, i * rs.i, j * rs.j, k * rs.k, u * rs.u, v * rs.v, w * rs.w); } - FI constexpr XYZEval operator/ (const XYZval &rs) const { return LOGICAL_AXIS_ARRAY(e, x / rs.x, y / rs.y, z / rs.z, i / rs.i, j / rs.j, k / rs.k, u / rs.u, v / rs.v, w / rs.w); } - FI constexpr XYZEval operator+ (const XYZEval &rs) const { return LOGICAL_AXIS_ARRAY(e + rs.e, x + rs.x, y + rs.y, z + rs.z, i + rs.i, j + rs.j, k + rs.k, u + rs.u, v + rs.v, w + rs.w); } - FI constexpr XYZEval operator- (const XYZEval &rs) const { return LOGICAL_AXIS_ARRAY(e - rs.e, x - rs.x, y - rs.y, z - rs.z, i - rs.i, j - rs.j, k - rs.k, u - rs.u, v - rs.v, w - rs.w); } - FI constexpr XYZEval operator* (const XYZEval &rs) const { return LOGICAL_AXIS_ARRAY(e * rs.e, x * rs.x, y * rs.y, z * rs.z, i * rs.i, j * rs.j, k * rs.k, u * rs.u, v * rs.v, w * rs.w); } - FI constexpr XYZEval operator/ (const XYZEval &rs) const { return LOGICAL_AXIS_ARRAY(e / rs.e, x / rs.x, y / rs.y, z / rs.z, i / rs.i, j / rs.j, k / rs.k, u / rs.u, v / rs.v, w / rs.w); } - FI constexpr XYZEval operator* (const float &p) const { return LOGICAL_AXIS_ARRAY((T)(e * p), (T)(x * p), (T)(y * p), (T)(z * p), (T)(i * p), (T)(j * p), (T)(k * p), (T)(u * p), (T)(v * p), (T)(w * p)); } + FI constexpr XYZEval operator+ (const XYval &rs) const { return LOGICAL_AXIS_ARRAY(e, T(x + rs.x), T(y + rs.y), z, i, j, k, u, v, w); } + FI constexpr XYZEval operator- (const XYval &rs) const { return LOGICAL_AXIS_ARRAY(e, T(x - rs.x), T(y - rs.y), z, i, j, k, u, v, w); } + FI constexpr XYZEval operator* (const XYval &rs) const { return LOGICAL_AXIS_ARRAY(e, T(x * rs.x), T(y * rs.y), z, i, j, k, u, v, w); } + FI constexpr XYZEval operator/ (const XYval &rs) const { return LOGICAL_AXIS_ARRAY(e, T(x / rs.x), T(y / rs.y), z, i, j, k, u, v, w); } + FI constexpr XYZEval operator+ (const XYZval &rs) const { return LOGICAL_AXIS_ARRAY(e, T(x + rs.x), T(y + rs.y), T(z + rs.z), T(i + rs.i), T(j + rs.j), T(k + rs.k), T(u + rs.u), T(v + rs.v), T(w + rs.w)); } + FI constexpr XYZEval operator- (const XYZval &rs) const { return LOGICAL_AXIS_ARRAY(e, T(x - rs.x), T(y - rs.y), T(z - rs.z), T(i - rs.i), T(j - rs.j), T(k - rs.k), T(u - rs.u), T(v - rs.v), T(w - rs.w)); } + FI constexpr XYZEval operator* (const XYZval &rs) const { return LOGICAL_AXIS_ARRAY(e, T(x * rs.x), T(y * rs.y), T(z * rs.z), T(i * rs.i), T(j * rs.j), T(k * rs.k), T(u * rs.u), T(v * rs.v), T(w * rs.w)); } + FI constexpr XYZEval operator/ (const XYZval &rs) const { return LOGICAL_AXIS_ARRAY(e, T(x / rs.x), T(y / rs.y), T(z / rs.z), T(i / rs.i), T(j / rs.j), T(k / rs.k), T(u / rs.u), T(v / rs.v), T(w / rs.w)); } + FI constexpr XYZEval operator+ (const XYZEval &rs) const { return LOGICAL_AXIS_ARRAY(T(e + rs.e), T(x + rs.x), T(y + rs.y), T(z + rs.z), T(i + rs.i), T(j + rs.j), T(k + rs.k), T(u + rs.u), T(v + rs.v), T(w + rs.w)); } + FI constexpr XYZEval operator- (const XYZEval &rs) const { return LOGICAL_AXIS_ARRAY(T(e - rs.e), T(x - rs.x), T(y - rs.y), T(z - rs.z), T(i - rs.i), T(j - rs.j), T(k - rs.k), T(u - rs.u), T(v - rs.v), T(w - rs.w)); } + FI constexpr XYZEval operator* (const XYZEval &rs) const { return LOGICAL_AXIS_ARRAY(T(e * rs.e), T(x * rs.x), T(y * rs.y), T(z * rs.z), T(i * rs.i), T(j * rs.j), T(k * rs.k), T(u * rs.u), T(v * rs.v), T(w * rs.w)); } + FI constexpr XYZEval operator/ (const XYZEval &rs) const { return LOGICAL_AXIS_ARRAY(T(e / rs.e), T(x / rs.x), T(y / rs.y), T(z / rs.z), T(i / rs.i), T(j / rs.j), T(k / rs.k), T(u / rs.u), T(v / rs.v), T(w / rs.w)); } + FI constexpr XYZEval operator* (const float &p) const { return LOGICAL_AXIS_ARRAY(T(e * p), T(x * p), T(y * p), T(z * p), T(i * p), T(j * p), T(k * p), T(u * p), T(v * p), T(w * p)); } FI constexpr XYZEval operator* (const int &p) const { return LOGICAL_AXIS_ARRAY(e * p, x * p, y * p, z * p, i * p, j * p, k * p, u * p, v * p, w * p); } - FI constexpr XYZEval operator/ (const float &p) const { return LOGICAL_AXIS_ARRAY((T)(e / p), (T)(x / p), (T)(y / p), (T)(z / p), (T)(i / p), (T)(j / p), (T)(k / p), (T)(u / p), (T)(v / p), (T)(w / p)); } + FI constexpr XYZEval operator/ (const float &p) const { return LOGICAL_AXIS_ARRAY(T(e / p), T(x / p), T(y / p), T(z / p), T(i / p), T(j / p), T(k / p), T(u / p), T(v / p), T(w / p)); } FI constexpr XYZEval operator/ (const int &p) const { return LOGICAL_AXIS_ARRAY(e / p, x / p, y / p, z / p, i / p, j / p, k / p, u / p, v / p, w / p); } FI constexpr XYZEval operator>>(const int &p) const { return LOGICAL_AXIS_ARRAY(_RS(e), _RS(x), _RS(y), _RS(z), _RS(i), _RS(j), _RS(k), _RS(u), _RS(v), _RS(w)); } FI constexpr XYZEval operator<<(const int &p) const { return LOGICAL_AXIS_ARRAY(_LS(e), _LS(x), _LS(y), _LS(z), _LS(i), _LS(j), _LS(k), _LS(u), _LS(v), _LS(w)); } @@ -1231,3 +1231,14 @@ public: #undef _LSE #undef _RSE #undef FI + +// Axis names for G-code parsing, reports, etc. +constexpr xyze_char_t axis_codes LOGICAL_AXIS_ARRAY('E', 'X', 'Y', 'Z', AXIS4_NAME, AXIS5_NAME, AXIS6_NAME, AXIS7_NAME, AXIS8_NAME, AXIS9_NAME); +#if NUM_AXES <= XYZ && !HAS_EXTRUDERS + #define AXIS_CHAR(A) ((char)('X' + A)) + #define IAXIS_CHAR AXIS_CHAR +#else + constexpr xyze_char_t iaxis_codes LOGICAL_AXIS_ARRAY('E', 'X', 'Y', 'Z', 'I', 'J', 'K', 'U', 'V', 'W'); + #define AXIS_CHAR(A) axis_codes[A] + #define IAXIS_CHAR(A) iaxis_codes[A] +#endif diff --git a/Marlin/src/core/utility.h b/Marlin/src/core/utility.h index c3324443ba..77e8bac016 100644 --- a/Marlin/src/core/utility.h +++ b/Marlin/src/core/utility.h @@ -82,17 +82,6 @@ public: // in the range 0-100 while avoiding rounding artifacts constexpr uint8_t ui8_to_percent(const uint8_t i) { return (int(i) * 100 + 127) / 255; } -// Axis names for G-code parsing, reports, etc. -const xyze_char_t axis_codes LOGICAL_AXIS_ARRAY('E', 'X', 'Y', 'Z', AXIS4_NAME, AXIS5_NAME, AXIS6_NAME, AXIS7_NAME, AXIS8_NAME, AXIS9_NAME); -#if NUM_AXES <= XYZ && !HAS_EXTRUDERS - #define AXIS_CHAR(A) ((char)('X' + A)) - #define IAXIS_CHAR AXIS_CHAR -#else - const xyze_char_t iaxis_codes LOGICAL_AXIS_ARRAY('E', 'X', 'Y', 'Z', 'I', 'J', 'K', 'U', 'V', 'W'); - #define AXIS_CHAR(A) axis_codes[A] - #define IAXIS_CHAR(A) iaxis_codes[A] -#endif - #if ENABLED(MARLIN_DEV_MODE) enum MarlinError : uint8_t { ERR_NONE, From c1e8d46d219493b2072e3df24c4dca0ac9b39998 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 27 Mar 2025 18:36:04 -0500 Subject: [PATCH 58/74] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20ELAPSED=20/=20PENDIN?= =?UTF-8?q?G=20(ms,=20start,=20duration)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/MarlinCore.cpp | 4 ++-- Marlin/src/core/millis_t.h | 9 ++++----- Marlin/src/feature/controllerfan.cpp | 2 +- Marlin/src/feature/easythreed_ui.cpp | 10 +++++----- Marlin/src/feature/max7219.h | 2 +- Marlin/src/feature/mmu/mmu2.cpp | 8 ++++---- Marlin/src/feature/power.cpp | 2 +- Marlin/src/gcode/gcode.cpp | 4 ++-- Marlin/src/gcode/gcode.h | 4 ++-- Marlin/src/gcode/queue.cpp | 2 +- Marlin/src/lcd/HD44780/marlinui_HD44780.cpp | 2 +- Marlin/src/lcd/marlinui.cpp | 2 +- Marlin/src/lcd/tft/touch.cpp | 2 +- Marlin/src/libs/MAX31865.cpp | 2 +- Marlin/src/module/temperature.cpp | 12 ++++++------ Marlin/tests/core/test_types.cpp | 9 +++++++++ 16 files changed, 42 insertions(+), 34 deletions(-) diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 3c44a9b71f..bfe69ba94e 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -678,14 +678,14 @@ inline void manage_inactivity(const bool no_stepper_sleep=false) { TERN_(HOTEND_IDLE_TIMEOUT, hotend_idle.check()); #if ANY(PSU_CONTROL, AUTO_POWER_CONTROL) && PIN_EXISTS(PS_ON_EDM) - if ( ELAPSED(ms, powerManager.last_state_change_ms + PS_EDM_RESPONSE) + if ( ELAPSED(ms, powerManager.last_state_change_ms, PS_EDM_RESPONSE) && (READ(PS_ON_PIN) != READ(PS_ON_EDM_PIN) || TERN0(PSU_OFF_REDUNDANT, extDigitalRead(PS_ON1_PIN) != extDigitalRead(PS_ON1_EDM_PIN))) ) kill(GET_TEXT_F(MSG_POWER_EDM_FAULT)); #endif #if ENABLED(EXTRUDER_RUNOUT_PREVENT) if (thermalManager.degHotend(active_extruder) > (EXTRUDER_RUNOUT_MINTEMP) - && ELAPSED(ms, gcode.previous_move_ms + SEC_TO_MS(EXTRUDER_RUNOUT_SECONDS)) + && ELAPSED(ms, gcode.previous_move_ms, SEC_TO_MS(EXTRUDER_RUNOUT_SECONDS)) && !planner.has_blocks_queued() ) { const int8_t e_stepper = TERN(HAS_SWITCHING_EXTRUDER, active_extruder >> 1, active_extruder); diff --git a/Marlin/src/core/millis_t.h b/Marlin/src/core/millis_t.h index 7c00b91a5b..1d3cc853b3 100644 --- a/Marlin/src/core/millis_t.h +++ b/Marlin/src/core/millis_t.h @@ -30,8 +30,7 @@ typedef uint32_t millis_t; #define MS_TO_SEC(N) millis_t((N)/1000UL) #define MS_TO_SEC_PRECISE(N) (float(N)/1000.0f) -#define FUTURE(START,DURA) (millis_t(millis()-(START))<(DURA)) -#define PAST(START,DURA) (!FUTURE(START,DURA)) - -#define PENDING(NOW,SOON) (int32_t((NOW)-(SOON))<0) -#define ELAPSED(NOW,SOON) (!PENDING(NOW,SOON)) +constexpr bool _PENDING(const millis_t now, const millis_t when) { return int32_t(when - now) > 0; } +constexpr bool _PENDING(const millis_t now, const millis_t start, const millis_t interval) { return (now - start) < interval; } +#define PENDING(V...) _PENDING(V) +#define ELAPSED(V...) !_PENDING(V) diff --git a/Marlin/src/feature/controllerfan.cpp b/Marlin/src/feature/controllerfan.cpp index 323d988a2d..585568b250 100644 --- a/Marlin/src/feature/controllerfan.cpp +++ b/Marlin/src/feature/controllerfan.cpp @@ -87,7 +87,7 @@ void ControllerFan::update() { * - If System is on idle and idle fan speed settings is activated. */ set_fan_speed( - settings.auto_mode && lastComponentOn && PENDING(ms, lastComponentOn + SEC_TO_MS(settings.duration)) + settings.auto_mode && lastComponentOn && PENDING(ms, lastComponentOn, SEC_TO_MS(settings.duration)) ? settings.active_speed : settings.idle_speed ); diff --git a/Marlin/src/feature/easythreed_ui.cpp b/Marlin/src/feature/easythreed_ui.cpp index 9617c62eb9..8974c5befd 100644 --- a/Marlin/src/feature/easythreed_ui.cpp +++ b/Marlin/src/feature/easythreed_ui.cpp @@ -78,9 +78,9 @@ void EasythreedUI::blinkLED() { prev_blink_interval_ms = blink_interval_ms; blink_start_ms = ms; } - if (PENDING(ms, blink_start_ms + blink_interval_ms)) + if (PENDING(ms, blink_start_ms, blink_interval_ms)) WRITE(EASYTHREED_LED_PIN, LOW); - else if (PENDING(ms, blink_start_ms + 2 * blink_interval_ms)) + else if (PENDING(ms, blink_start_ms, 2 * blink_interval_ms)) WRITE(EASYTHREED_LED_PIN, HIGH); else blink_start_ms = ms; @@ -107,7 +107,7 @@ void EasythreedUI::loadButton() { break; case FS_PRESS: - if (ELAPSED(millis(), filament_time + BTN_DEBOUNCE_MS)) { // After a short debounce delay... + if (ELAPSED(millis(), filament_time, BTN_DEBOUNCE_MS)) { // After a short debounce delay... if (!READ(BTN_RETRACT) || !READ(BTN_FEED)) { // ...if switch still toggled... thermalManager.setTargetHotend(EXTRUDE_MINTEMP + 10, 0); // Start heating up blink_interval_ms = LED_BLINK_7; // Set the LED to blink fast @@ -175,14 +175,14 @@ void EasythreedUI::printButton() { break; case KS_PRESS: - if (ELAPSED(ms, key_time + BTN_DEBOUNCE_MS)) // Wait for debounce interval to expire + if (ELAPSED(ms, key_time, BTN_DEBOUNCE_MS)) // Wait for debounce interval to expire key_status = READ(BTN_PRINT) ? KS_IDLE : KS_PROCEED; // Proceed if still pressed break; case KS_PROCEED: if (!READ(BTN_PRINT)) break; // Wait for the button to be released key_status = KS_IDLE; // Ready for the next press - if (PENDING(ms, key_time + 1200 - BTN_DEBOUNCE_MS)) { // Register a press < 1.2 seconds + if (PENDING(ms, key_time, 1200 - BTN_DEBOUNCE_MS)) { // Register a press < 1.2 seconds switch (print_key_flag) { case PF_START: { // The "Print" button starts an SD card print if (printingIsActive()) break; // Already printing? (find another line that checks for 'is planner doing anything else right now?') diff --git a/Marlin/src/feature/max7219.h b/Marlin/src/feature/max7219.h index a6b110fdf4..f476f7cde4 100644 --- a/Marlin/src/feature/max7219.h +++ b/Marlin/src/feature/max7219.h @@ -110,7 +110,7 @@ if (mode == ACCUMULATE_TOTAL) return; // update time_fraction every hundred milliseconds - if (instance_count == 0 && ELAPSED(now, last_calc_time + 100000)) { + if (instance_count == 0 && now - last_calc_time > 100000) { time_fraction = total_time * 128 / (now - last_calc_time); last_calc_time = now; total_time = 0; diff --git a/Marlin/src/feature/mmu/mmu2.cpp b/Marlin/src/feature/mmu/mmu2.cpp index d5f115e74c..96724d0d70 100644 --- a/Marlin/src/feature/mmu/mmu2.cpp +++ b/Marlin/src/feature/mmu/mmu2.cpp @@ -164,7 +164,7 @@ void MMU2::mmu_loop() { MMU2_SEND("S1"); // Read Version state = -2; } - else if (ELAPSED(millis(), prev_request + 30000)) { // 30sec after reset disable MMU + else if (ELAPSED(millis(), prev_request, 30000)) { // 30sec after reset disable MMU SERIAL_ECHOLNPGM("MMU not responding - DISABLED"); state = 0; } @@ -276,7 +276,7 @@ void MMU2::mmu_loop() { last_cmd = cmd; cmd = MMU_CMD_NONE; } - else if (ELAPSED(millis(), prev_P0_request + 300)) { + else if (ELAPSED(millis(), prev_P0_request, 300)) { MMU2_SEND("P0"); // Read FINDA state = 2; // wait for response } @@ -296,7 +296,7 @@ void MMU2::mmu_loop() { if (cmd == MMU_CMD_NONE) ready = true; state = 1; } - else if (ELAPSED(millis(), prev_request + MMU_P0_TIMEOUT)) // Resend request after timeout (3s) + else if (ELAPSED(millis(), prev_request, MMU_P0_TIMEOUT)) // Resend request after timeout (3s) state = 1; TERN_(HAS_PRUSA_MMU2S, check_filament()); @@ -335,7 +335,7 @@ void MMU2::mmu_loop() { last_cmd = MMU_CMD_NONE; } } - else if (ELAPSED(millis(), prev_request + MMU_CMD_TIMEOUT)) { + else if (ELAPSED(millis(), prev_request, MMU_CMD_TIMEOUT)) { // resend request after timeout if (last_cmd) { DEBUG_ECHOLNPGM("MMU retry"); diff --git a/Marlin/src/feature/power.cpp b/Marlin/src/feature/power.cpp index c6dc562836..a28d95d967 100644 --- a/Marlin/src/feature/power.cpp +++ b/Marlin/src/feature/power.cpp @@ -261,7 +261,7 @@ void Power::power_off() { nextPowerCheck = now + 2500UL; if (is_power_needed()) power_on(); - else if (!lastPowerOn || (POWER_TIMEOUT > 0 && ELAPSED(now, lastPowerOn + SEC_TO_MS(POWER_TIMEOUT)))) + else if (!lastPowerOn || (POWER_TIMEOUT > 0 && ELAPSED(now, lastPowerOn, SEC_TO_MS(POWER_TIMEOUT)))) power_off(); } } diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index 8a444053e6..6dfc54d99e 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -246,8 +246,8 @@ void GcodeSuite::get_destination_from_command() { * Dwell waits immediately. It does not synchronize. */ void GcodeSuite::dwell(const millis_t time) { - const millis_t startMillis = millis(); - while (FUTURE(startMillis, time)) idle(); + const millis_t start_ms = millis(); + while (PENDING(millis(), start_ms, time)) idle(); } /** diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h index 1d39dc3a6b..911820ee7b 100644 --- a/Marlin/src/gcode/gcode.h +++ b/Marlin/src/gcode/gcode.h @@ -433,14 +433,14 @@ public: static millis_t previous_move_ms, max_inactive_time; FORCE_INLINE static bool stepper_max_timed_out(const millis_t ms=millis()) { - return max_inactive_time && ELAPSED(ms, previous_move_ms + max_inactive_time); + return max_inactive_time && ELAPSED(ms, previous_move_ms, max_inactive_time); } FORCE_INLINE static void reset_stepper_timeout(const millis_t ms=millis()) { previous_move_ms = ms; } #if HAS_DISABLE_IDLE_AXES static millis_t stepper_inactive_time; FORCE_INLINE static bool stepper_inactive_timeout(const millis_t ms=millis()) { - return ELAPSED(ms, previous_move_ms + stepper_inactive_time); + return ELAPSED(ms, previous_move_ms, stepper_inactive_time); } #else static bool stepper_inactive_timeout(const millis_t) { return false; } diff --git a/Marlin/src/gcode/queue.cpp b/Marlin/src/gcode/queue.cpp index 3475450045..657bfab08b 100644 --- a/Marlin/src/gcode/queue.cpp +++ b/Marlin/src/gcode/queue.cpp @@ -426,7 +426,7 @@ void GCodeQueue::get_serial_commands() { // send "wait" to indicate Marlin is still waiting. #if NO_TIMEOUTS > 0 const millis_t ms = millis(); - if (ring_buffer.empty() && !any_serial_data_available() && ELAPSED(ms, last_command_time + NO_TIMEOUTS)) { + if (ring_buffer.empty() && !any_serial_data_available() && ELAPSED(ms, last_command_time, NO_TIMEOUTS)) { SERIAL_ECHOLNPGM(STR_WAIT); last_command_time = ms; } diff --git a/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp b/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp index 071a88e475..a0145d6165 100644 --- a/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp +++ b/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp @@ -755,7 +755,7 @@ void MarlinUI::draw_status_message(const bool blink) { // Draw the progress bar if the message has shown long enough // or if there is no message set. - if (ELAPSED(millis(), progress_bar_ms + PROGRESS_BAR_MSG_TIME) || !has_status()) { + if (ELAPSED(millis(), progress_bar_ms, PROGRESS_BAR_MSG_TIME) || !has_status()) { const uint8_t progress = get_progress_percent(); if (progress > 2) return draw_progress_bar(progress); } diff --git a/Marlin/src/lcd/marlinui.cpp b/Marlin/src/lcd/marlinui.cpp index 679c43b402..2114209b98 100644 --- a/Marlin/src/lcd/marlinui.cpp +++ b/Marlin/src/lcd/marlinui.cpp @@ -632,7 +632,7 @@ void MarlinUI::init() { // If the message will blink rather than expire... #if DISABLED(PROGRESS_MSG_ONCE) - if (ELAPSED(ms, progress_bar_ms + PROGRESS_BAR_MSG_TIME + PROGRESS_BAR_BAR_TIME)) + if (ELAPSED(ms, progress_bar_ms, PROGRESS_BAR_MSG_TIME + PROGRESS_BAR_BAR_TIME)) progress_bar_ms = ms; #endif diff --git a/Marlin/src/lcd/tft/touch.cpp b/Marlin/src/lcd/tft/touch.cpp index 932418331b..bb226e50c6 100644 --- a/Marlin/src/lcd/tft/touch.cpp +++ b/Marlin/src/lcd/tft/touch.cpp @@ -102,7 +102,7 @@ void Touch::idle() { if (touch_time) { #if ENABLED(TOUCH_SCREEN_CALIBRATION) - if (touch_control_type == NONE && ELAPSED(now, touch_time + TOUCH_SCREEN_HOLD_TO_CALIBRATE_MS) && ui.on_status_screen()) + if (touch_control_type == NONE && ELAPSED(now, touch_time, TOUCH_SCREEN_HOLD_TO_CALIBRATE_MS) && ui.on_status_screen()) ui.goto_screen(touch_screen_calibration); #endif return; diff --git a/Marlin/src/libs/MAX31865.cpp b/Marlin/src/libs/MAX31865.cpp index 3fe0694644..83b03e24fd 100644 --- a/Marlin/src/libs/MAX31865.cpp +++ b/Marlin/src/libs/MAX31865.cpp @@ -346,7 +346,7 @@ inline uint16_t MAX31865::readRawImmediate() { } else { TERN_(MAX31865_USE_READ_ERROR_DETECTION, const millis_t ms = millis()); - if (TERN0(MAX31865_USE_READ_ERROR_DETECTION, ABS((int)(lastRead - rtd)) > 500 && PENDING(ms, lastReadStamp + 1000))) { + if (TERN0(MAX31865_USE_READ_ERROR_DETECTION, ABS(int(lastRead - rtd)) > 500 && PENDING(ms, lastReadStamp, 1000UL))) { // If 2 readings within 1s differ too much (~20°C) it's a read error. lastFault = 0x01; lastRead |= 1; diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 217405eae6..7da051f9d7 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -823,7 +823,7 @@ volatile bool Temperature::raw_temps_ready = false; ONHEATING(start_temp, current_temp, target); #endif - if (heating && current_temp > target && ELAPSED(ms, t2 + 5000UL)) { + if (heating && current_temp > target && ELAPSED(ms, t2, 5000UL)) { heating = false; SHV((bias - d) >> 1); t1 = ms; @@ -831,7 +831,7 @@ volatile bool Temperature::raw_temps_ready = false; maxT = target; } - if (!heating && current_temp < target && ELAPSED(ms, t1 + 5000UL)) { + if (!heating && current_temp < target && ELAPSED(ms, t1, 5000UL)) { heating = true; t2 = ms; t_low = t2 - t1; @@ -4666,7 +4666,7 @@ void Temperature::isr() { millis_t residency_start_ms = 0; bool first_loop = true; // Loop until the temperature has stabilized - #define TEMP_CONDITIONS (!residency_start_ms || PENDING(now, residency_start_ms + SEC_TO_MS(TEMP_RESIDENCY_TIME))) + #define TEMP_CONDITIONS (!residency_start_ms || PENDING(now, residency_start_ms, SEC_TO_MS(TEMP_RESIDENCY_TIME))) #else // Loop until the temperature is very close target #define TEMP_CONDITIONS (wants_to_cool ? isCoolingHotend(target_extruder) : isHeatingHotend(target_extruder)) @@ -4808,7 +4808,7 @@ void Temperature::isr() { millis_t residency_start_ms = 0; bool first_loop = true; // Loop until the temperature has stabilized - #define TEMP_BED_CONDITIONS (!residency_start_ms || PENDING(now, residency_start_ms + SEC_TO_MS(TEMP_BED_RESIDENCY_TIME))) + #define TEMP_BED_CONDITIONS (!residency_start_ms || PENDING(now, residency_start_ms, SEC_TO_MS(TEMP_BED_RESIDENCY_TIME))) #else // Loop until the temperature is very close target #define TEMP_BED_CONDITIONS (wants_to_cool ? isCoolingBed() : isHeatingBed()) @@ -5008,7 +5008,7 @@ void Temperature::isr() { millis_t residency_start_ms = 0; bool first_loop = true; // Loop until the temperature has stabilized - #define TEMP_CHAMBER_CONDITIONS (!residency_start_ms || PENDING(now, residency_start_ms + SEC_TO_MS(TEMP_CHAMBER_RESIDENCY_TIME))) + #define TEMP_CHAMBER_CONDITIONS (!residency_start_ms || PENDING(now, residency_start_ms, SEC_TO_MS(TEMP_CHAMBER_RESIDENCY_TIME))) #else // Loop until the temperature is very close target #define TEMP_CHAMBER_CONDITIONS (wants_to_cool ? isCoolingChamber() : isHeatingChamber()) @@ -5108,7 +5108,7 @@ void Temperature::isr() { millis_t residency_start_ms = 0; bool first_loop = true; // Loop until the temperature has stabilized - #define TEMP_COOLER_CONDITIONS (!residency_start_ms || PENDING(now, residency_start_ms + SEC_TO_MS(TEMP_COOLER_RESIDENCY_TIME))) + #define TEMP_COOLER_CONDITIONS (!residency_start_ms || PENDING(now, residency_start_ms, SEC_TO_MS(TEMP_COOLER_RESIDENCY_TIME))) #else // Loop until the temperature is very close target #define TEMP_COOLER_CONDITIONS (wants_to_cool ? isLaserHeating() : isLaserCooling()) diff --git a/Marlin/tests/core/test_types.cpp b/Marlin/tests/core/test_types.cpp index d569386265..317b961626 100644 --- a/Marlin/tests/core/test_types.cpp +++ b/Marlin/tests/core/test_types.cpp @@ -22,6 +22,7 @@ #include "../test/unit_tests.h" #include "src/core/types.h" +#include "src/core/millis_t.h" MARLIN_TEST(types, XYval_const_as_bools) { const XYval xy_const_true = {1, 2}; @@ -656,3 +657,11 @@ MARLIN_TEST(types, SString) { TEST_ASSERT_TRUE(strcmp_P(str, PSTR("Hello World!-123456------ < spaces!33\n^ eol! ... 1234.50*2345.602 = 2895645.67")) == 0); } + +MARLIN_TEST(types, PENDING) { + TEST_ASSERT_TRUE(PENDING(0x0000FFFF, 0x00010000)); // <= ~24.4 days + TEST_ASSERT_TRUE(ELAPSED(0x0090000A, 0x00900000)); // <= ~24.4 days + TEST_ASSERT_FALSE(PENDING(0x00000000, 0x80000000)); // > ~24.4 days + TEST_ASSERT_TRUE(PENDING(0x00000000, 0, 0x80000000)); // <= ~48.8 days + TEST_ASSERT_TRUE(PENDING(0x80000000, 0x7FFFFFF0, 0x0020)); // <= ~48.8 days +} From 448ff71899a46c71ace774dfd47767a76a226c54 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 27 Mar 2025 19:03:53 -0500 Subject: [PATCH 59/74] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20Tweak?= =?UTF-8?q?=20MAX7219=20test=20pattern?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/feature/max7219.cpp | 40 +++++++++++++++------------------- 1 file changed, 18 insertions(+), 22 deletions(-) diff --git a/Marlin/src/feature/max7219.cpp b/Marlin/src/feature/max7219.cpp index 51ec219e20..5a25ea6710 100644 --- a/Marlin/src/feature/max7219.cpp +++ b/Marlin/src/feature/max7219.cpp @@ -480,32 +480,30 @@ void Max7219::register_setup() { #if MAX7219_INIT_TEST uint8_t test_mode = 0; - millis_t next_patt_ms; bool patt_on; #if MAX7219_INIT_TEST == 2 #define MAX7219_LEDS (MAX7219_X_LEDS * MAX7219_Y_LEDS) - constexpr millis_t pattern_delay = 4; - - int8_t spiralx, spiraly, spiral_dir; + xy_int8_t spiral; + int8_t spiral_dir; uvalue_t(MAX7219_LEDS) spiral_count; - void Max7219::test_pattern() { - constexpr int8_t way[][2] = { { 1, 0 }, { 0, 1 }, { -1, 0 }, { 0, -1 } }; - led_set(spiralx, spiraly, patt_on); - const int8_t x = spiralx + way[spiral_dir][0], y = spiraly + way[spiral_dir][1]; - if (!WITHIN(x, 0, MAX7219_X_LEDS - 1) || !WITHIN(y, 0, MAX7219_Y_LEDS - 1) || BIT_7219(x, y) == patt_on) + void Max7219::run_test_pattern() { + constexpr xy_int8_t way[] = { { 1, 0 }, { 0, 1 }, { -1, 0 }, { 0, -1 } }; + led_set(spiral.x, spiral.y, patt_on); + const xy_int8_t xy = spiral + way[spiral_dir]; + if (!WITHIN(xy.x, 0, MAX7219_X_LEDS - 1) || !WITHIN(xy.y, 0, MAX7219_Y_LEDS - 1) || BIT_7219(xy.x, xy.y) == patt_on) spiral_dir = (spiral_dir + 1) & 0x3; - spiralx += way[spiral_dir][0]; - spiraly += way[spiral_dir][1]; + spiral += way[spiral_dir]; if (!spiral_count--) { if (!patt_on) test_mode = 0; else { spiral_count = MAX7219_LEDS; - spiralx = spiraly = spiral_dir = 0; + spiral.reset(); + spiral_dir = 0; patt_on = false; } } @@ -516,7 +514,11 @@ void Max7219::register_setup() { constexpr millis_t pattern_delay = 20; int8_t sweep_count, sweepx, sweep_dir; - void Max7219::test_pattern() { + void Max7219::run_test_pattern() { + static millis_t next_pattern_ms = 0; + const millis_t ms = millis(); + if (PENDING(ms, next_pattern_ms)) return; + next_pattern_ms = ms + pattern_delay; set_column(sweepx, patt_on ? 0xFFFFFFFF : 0x00000000); sweepx += sweep_dir; if (!WITHIN(sweepx, 0, MAX7219_X_LEDS - 1)) { @@ -527,26 +529,20 @@ void Max7219::register_setup() { else sweepx -= MAX7219_X_LEDS * sweep_dir; FLIP(patt_on); - next_patt_ms += 100; + next_pattern_ms += 100; if (++test_mode > 4) test_mode = 0; } } #endif - void Max7219::run_test_pattern() { - const millis_t ms = millis(); - if (PENDING(ms, next_patt_ms)) return; - next_patt_ms = ms + pattern_delay; - test_pattern(); - } - void Max7219::start_test_pattern() { clear(); test_mode = 1; patt_on = true; #if MAX7219_INIT_TEST == 2 - spiralx = spiraly = spiral_dir = 0; + spiral.reset(); + spiral_dir = 0; spiral_count = MAX7219_LEDS; #else sweep_dir = 1; From efa175820f2e379b569ae01cdc422a8ef12c1f4d Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 27 Mar 2025 20:55:59 -0500 Subject: [PATCH 60/74] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20Allow?= =?UTF-8?q?=20for=20tests=20on=20macOS=20/=20Windows?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 2 +- Marlin/src/pins/pins.h | 2 +- buildroot/share/PlatformIO/scripts/collect-code-tests.py | 6 +++--- buildroot/share/PlatformIO/scripts/preflight-checks.py | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index 83b27e566a..23826497b6 100644 --- a/Makefile +++ b/Makefile @@ -17,7 +17,7 @@ help: @echo "make tests-all-local-docker : Run all tests locally, using docker" @echo "make unit-test-single-local : Run unit tests for a single config locally" @echo "make unit-test-single-local-docker : Run unit tests for a single config locally, using docker" - @echo "make unit-test-all-local : Run all code tests locally" + @echo "make unit-test-all-local : Run all code tests locally" @echo "make unit-test-all-local-docker : Run all code tests locally, using docker" @echo "make setup-local-docker : Setup local docker using buildx" @echo "" diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 01ff13f8c2..55dc00c60d 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -985,7 +985,7 @@ // #elif MB(SIMULATED) - #include "native/pins_RAMPS_NATIVE.h" // Native or Simulation lin:linux_native mac:simulator_macos_debug mac:simulator_macos_release win:simulator_windows lin:simulator_linux_debug lin:simulator_linux_release + #include "native/pins_RAMPS_NATIVE.h" // Native or Simulation lin:linux_native lin:simulator_linux_debug lin:simulator_linux_release lin:linux_native_test mac:simulator_macos_debug mac:simulator_macos_release win:simulator_windows #else diff --git a/buildroot/share/PlatformIO/scripts/collect-code-tests.py b/buildroot/share/PlatformIO/scripts/collect-code-tests.py index 576e3dd06d..62f95f4b4b 100644 --- a/buildroot/share/PlatformIO/scripts/collect-code-tests.py +++ b/buildroot/share/PlatformIO/scripts/collect-code-tests.py @@ -1,6 +1,6 @@ # # collect-code-tests.py -# Convenience script to collect all code tests. Used by env:linux_native_test in native.ini. +# Convenience script to collect all code tests. Used by test envs in native.ini. # import pioutil @@ -32,7 +32,7 @@ if pioutil.is_pio_build(): "restore_configs", f"cp -f {path} ./Marlin/config.ini", "python ./buildroot/share/PlatformIO/scripts/configuration.py", - f"platformio test -e linux_native_test -f {name}", + f"platformio test -e {env['PIOENV']} -f {name}", "restore_configs", ], title = "Marlin: {}".format(name.lower().title().replace("_", " ")), @@ -46,7 +46,7 @@ if pioutil.is_pio_build(): name = "test-marlin", dependencies = None, actions = [ - f"platformio run -t marlin_{name} -e linux_native_test" + f"platformio run -t marlin_{name} -e {env['PIOENV']}" for name in targets ], title = "Marlin: Test all code test suites", diff --git a/buildroot/share/PlatformIO/scripts/preflight-checks.py b/buildroot/share/PlatformIO/scripts/preflight-checks.py index 94b39927e0..ea642809d5 100644 --- a/buildroot/share/PlatformIO/scripts/preflight-checks.py +++ b/buildroot/share/PlatformIO/scripts/preflight-checks.py @@ -95,7 +95,7 @@ if pioutil.is_pio_build(): # Make sure board is compatible with the build environment. Skip for _test, # since the board is manipulated as each unit test is executed. - if not result and build_env != "linux_native_test": + if not result and not build_env.endswith("_native_test"): err = "Error: Build environment '%s' is incompatible with %s. Use one of these environments: %s" % \ ( build_env, motherboard, ", ".join([ e[4:] for e in board_envs if e.startswith("env:") ]) ) raise SystemExit(err) From f6eaca6fcdd31d1d1ada67a7b3e3e15135e224f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ferm=C3=ADn=20Olaiz?= Date: Fri, 28 Mar 2025 00:18:08 -0300 Subject: [PATCH 61/74] =?UTF-8?q?=F0=9F=A9=B9=20MKS=5FTINYBEE=20ADC=20refe?= =?UTF-8?q?rence=20voltage=20warning=20(#27755)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/inc/Warnings.cpp | 7 +++++++ Marlin/src/pins/esp32/pins_MKS_TINYBEE.h | 19 +++++++++++++++---- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/Marlin/src/inc/Warnings.cpp b/Marlin/src/inc/Warnings.cpp index 7c107220af..70a6905d9f 100644 --- a/Marlin/src/inc/Warnings.cpp +++ b/Marlin/src/inc/Warnings.cpp @@ -898,6 +898,13 @@ #warning "The (-1) AD595 Thermocouple Amplifier requires 5V input supply! Use AD8495 for 3.3V ADC." #endif +/** + * MKS_TINYBEE Analog Reference + */ +#if ENABLED(EMIT_ADC_REFERENCE_VOLTAGE_WARNING) + #warning "Check your ADC_REFERENCE_VOLTAGE on MKS TinyBee! Measure the Analog Reference voltage on the board. See pins_MKS_TINYBEE.h for details." +#endif + /** * No PWM on the Piezo Beeper? */ diff --git a/Marlin/src/pins/esp32/pins_MKS_TINYBEE.h b/Marlin/src/pins/esp32/pins_MKS_TINYBEE.h index 6b5411e09d..11f18f4496 100644 --- a/Marlin/src/pins/esp32/pins_MKS_TINYBEE.h +++ b/Marlin/src/pins/esp32/pins_MKS_TINYBEE.h @@ -115,10 +115,21 @@ //#define CONTROLLER_FAN_PIN 148 // FAN2 //#define E0_AUTO_FAN_PIN 148 // FAN2 -// -// ADC Reference Voltage -// -#define ADC_REFERENCE_VOLTAGE 2.565 // 2.5V reference VDDA +/** + * ADC Reference Voltage + * + * In some boards the voltage reference is a bit off due to low quality + * components. That is enough to throw off the ADC readings and thus the + * temperatures by more than 10°C in some cases. If you experience that + * problem, measure the reference voltage (VDDA) at the 2nd pin of + * TH1/TH2 (with the sensors disconnected) and set ADC_REFERENCE_VOLTAGE + * in your config. + */ + +#ifndef ADC_REFERENCE_VOLTAGE + #define EMIT_ADC_REFERENCE_VOLTAGE_WARNING + #define ADC_REFERENCE_VOLTAGE 2.565 +#endif /** * ------ ------ From 78d6fec6525924cf659a3d720a5960bfa1eea286 Mon Sep 17 00:00:00 2001 From: Boyd Date: Thu, 27 Mar 2025 22:31:45 -0700 Subject: [PATCH 62/74] =?UTF-8?q?=F0=9F=9A=80=20HAL=20for=20GD32=20MFL=20(?= =?UTF-8?q?Creality=20v4.2.2)=20(#27744)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/ci-build-tests.yml | 3 + Marlin/src/HAL/GD32_MFL/HAL.cpp | 120 ++ Marlin/src/HAL/GD32_MFL/HAL.h | 158 +++ Marlin/src/HAL/GD32_MFL/MarlinSPI.h | 26 + Marlin/src/HAL/GD32_MFL/MarlinSerial.cpp | 101 ++ Marlin/src/HAL/GD32_MFL/MarlinSerial.h | 75 ++ Marlin/src/HAL/GD32_MFL/MinSerial.cpp | 163 +++ Marlin/src/HAL/GD32_MFL/README.md | 8 + Marlin/src/HAL/GD32_MFL/SDCard.cpp | 1022 +++++++++++++++++ Marlin/src/HAL/GD32_MFL/SDCard.h | 214 ++++ Marlin/src/HAL/GD32_MFL/Servo.cpp | 122 ++ Marlin/src/HAL/GD32_MFL/Servo.h | 56 + .../HAL/GD32_MFL/dogm/u8g_com_mfl_swspi.cpp | 129 +++ Marlin/src/HAL/GD32_MFL/eeprom_bl24cxx.cpp | 93 ++ Marlin/src/HAL/GD32_MFL/eeprom_if_iic.cpp | 54 + Marlin/src/HAL/GD32_MFL/eeprom_wired.cpp | 96 ++ Marlin/src/HAL/GD32_MFL/endstop_interrupts.h | 61 + Marlin/src/HAL/GD32_MFL/fast_pwm.cpp | 97 ++ Marlin/src/HAL/GD32_MFL/fastio.h | 82 ++ .../src/HAL/GD32_MFL/inc/Conditionals_LCD.h | 26 + .../src/HAL/GD32_MFL/inc/Conditionals_adv.h | 26 + .../src/HAL/GD32_MFL/inc/Conditionals_post.h | 29 + .../src/HAL/GD32_MFL/inc/Conditionals_type.h | 22 + Marlin/src/HAL/GD32_MFL/inc/SanityCheck.h | 97 ++ Marlin/src/HAL/GD32_MFL/pinsDebug.h | 102 ++ Marlin/src/HAL/GD32_MFL/sdio.cpp | 233 ++++ Marlin/src/HAL/GD32_MFL/sdio.h | 36 + Marlin/src/HAL/GD32_MFL/spi_pins.h | 32 + Marlin/src/HAL/GD32_MFL/temp_soc.h | 29 + Marlin/src/HAL/GD32_MFL/timers.cpp | 233 ++++ Marlin/src/HAL/GD32_MFL/timers.h | 145 +++ Marlin/src/HAL/GD32_MFL/u8g/LCD_defines.h | 26 + Marlin/src/HAL/HC32/eeprom_wired.cpp | 3 + Marlin/src/HAL/HC32/pinsDebug.h | 3 + Marlin/src/HAL/HC32/spi_pins.h | 3 + Marlin/src/HAL/platforms.h | 2 + Marlin/src/HAL/shared/servo.h | 2 + Marlin/src/core/boards.h | 12 +- Marlin/src/inc/SanityCheck.h | 6 +- Marlin/src/inc/Warnings.cpp | 13 +- .../dogm/u8g/u8g_dev_st7920_128x64_HAL.cpp | 2 +- .../u8g/ultralcd_st7920_u8glib_rrd_AVR.cpp | 4 +- Marlin/src/libs/BL24CXX.cpp | 2 +- .../pins/gd32f3/pins_CREALITY_V422_GD32_MFL.h | 37 + Marlin/src/pins/pins.h | 7 + Marlin/src/pins/pinsDebug_list.h | 2 + Marlin/src/pins/stm32f1/env_validate.h | 7 +- README.md | 3 +- buildroot/tests/GD32F303RE_creality_mfl | 17 + ini/gd32.ini | 47 + platformio.ini | 1 + 51 files changed, 3873 insertions(+), 16 deletions(-) create mode 100644 Marlin/src/HAL/GD32_MFL/HAL.cpp create mode 100644 Marlin/src/HAL/GD32_MFL/HAL.h create mode 100644 Marlin/src/HAL/GD32_MFL/MarlinSPI.h create mode 100644 Marlin/src/HAL/GD32_MFL/MarlinSerial.cpp create mode 100644 Marlin/src/HAL/GD32_MFL/MarlinSerial.h create mode 100644 Marlin/src/HAL/GD32_MFL/MinSerial.cpp create mode 100644 Marlin/src/HAL/GD32_MFL/README.md create mode 100644 Marlin/src/HAL/GD32_MFL/SDCard.cpp create mode 100644 Marlin/src/HAL/GD32_MFL/SDCard.h create mode 100644 Marlin/src/HAL/GD32_MFL/Servo.cpp create mode 100644 Marlin/src/HAL/GD32_MFL/Servo.h create mode 100644 Marlin/src/HAL/GD32_MFL/dogm/u8g_com_mfl_swspi.cpp create mode 100644 Marlin/src/HAL/GD32_MFL/eeprom_bl24cxx.cpp create mode 100644 Marlin/src/HAL/GD32_MFL/eeprom_if_iic.cpp create mode 100644 Marlin/src/HAL/GD32_MFL/eeprom_wired.cpp create mode 100644 Marlin/src/HAL/GD32_MFL/endstop_interrupts.h create mode 100644 Marlin/src/HAL/GD32_MFL/fast_pwm.cpp create mode 100644 Marlin/src/HAL/GD32_MFL/fastio.h create mode 100644 Marlin/src/HAL/GD32_MFL/inc/Conditionals_LCD.h create mode 100644 Marlin/src/HAL/GD32_MFL/inc/Conditionals_adv.h create mode 100644 Marlin/src/HAL/GD32_MFL/inc/Conditionals_post.h create mode 100644 Marlin/src/HAL/GD32_MFL/inc/Conditionals_type.h create mode 100644 Marlin/src/HAL/GD32_MFL/inc/SanityCheck.h create mode 100644 Marlin/src/HAL/GD32_MFL/pinsDebug.h create mode 100644 Marlin/src/HAL/GD32_MFL/sdio.cpp create mode 100644 Marlin/src/HAL/GD32_MFL/sdio.h create mode 100644 Marlin/src/HAL/GD32_MFL/spi_pins.h create mode 100644 Marlin/src/HAL/GD32_MFL/temp_soc.h create mode 100644 Marlin/src/HAL/GD32_MFL/timers.cpp create mode 100644 Marlin/src/HAL/GD32_MFL/timers.h create mode 100644 Marlin/src/HAL/GD32_MFL/u8g/LCD_defines.h create mode 100644 Marlin/src/pins/gd32f3/pins_CREALITY_V422_GD32_MFL.h create mode 100755 buildroot/tests/GD32F303RE_creality_mfl create mode 100644 ini/gd32.ini diff --git a/.github/workflows/ci-build-tests.yml b/.github/workflows/ci-build-tests.yml index 320cda5b18..2fd316ec0f 100644 --- a/.github/workflows/ci-build-tests.yml +++ b/.github/workflows/ci-build-tests.yml @@ -151,6 +151,9 @@ jobs: # HC32 - HC32F460C_aquila_101 + # GD32F3 + - GD32F303RE_creality_mfl + # LPC176x - Lengthy tests - LPC1768 - LPC1769 diff --git a/Marlin/src/HAL/GD32_MFL/HAL.cpp b/Marlin/src/HAL/GD32_MFL/HAL.cpp new file mode 100644 index 0000000000..460ed52297 --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/HAL.cpp @@ -0,0 +1,120 @@ +/** + * 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 . + * + */ + +#include "../platforms.h" + +#ifdef ARDUINO_ARCH_MFL + +#include "../../inc/MarlinConfig.h" +#include "../shared/Delay.h" + +uint16_t MarlinHAL::adc_result; + +#if ENABLED(POSTMORTEM_DEBUGGING) + extern void install_min_serial(); +#endif + +#if ENABLED(MARLIN_DEV_MODE) + // Dump the clock frequencies of the system, AHB, APB1, APB2, and F_CPU. + static inline void HAL_clock_frequencies_dump() { + auto& rcuInstance = rcu::RCU::get_instance(); + uint32_t freq = rcuInstance.get_clock_frequency(rcu::Clock_Frequency::CK_SYS); + SERIAL_ECHOPGM("\nSYSTEM_CLOCK=", freq); + freq = rcuInstance.get_clock_frequency(rcu::Clock_Frequency::CK_AHB); + SERIAL_ECHOPGM("\nABH_CLOCK=", freq); + freq = rcuInstance.get_clock_frequency(rcu::Clock_Frequency::CK_APB1); + SERIAL_ECHOPGM("\nAPB1_CLOCK=", freq); + freq = rcuInstance.get_clock_frequency(rcu::Clock_Frequency::CK_APB2); + SERIAL_ECHOPGM("\nAPB2_CLOCK=", freq, + "\nF_CPU=", F_CPU); + // Done + SERIAL_ECHOPGM("\n--\n"); + } +#endif // MARLIN_DEV_MODE + +// Initializes the Marlin HAL +void MarlinHAL::init() { + constexpr unsigned int cpuFreq = F_CPU; + UNUSED(cpuFreq); + +#if PIN_EXISTS(LED) + OUT_WRITE(LED_PIN, LOW); +#endif + + SetTimerInterruptPriorities(); + + // Print clock frequencies to host serial + TERN_(MARLIN_DEV_MODE, HAL_clock_frequencies_dump()); + + // Register min serial + TERN_(POSTMORTEM_DEBUGGING, install_min_serial()); +} + +// Returns the reset source based on the flags set in the RCU module +uint8_t MarlinHAL::get_reset_source() { + return + (RCU_I.get_flag(rcu::Status_Flags::FLAG_FWDGTRST)) ? RST_WATCHDOG : + (RCU_I.get_flag(rcu::Status_Flags::FLAG_SWRST)) ? RST_SOFTWARE : + (RCU_I.get_flag(rcu::Status_Flags::FLAG_EPRST)) ? RST_EXTERNAL : + (RCU_I.get_flag(rcu::Status_Flags::FLAG_PORRST)) ? RST_POWER_ON : + (RCU_I.get_flag(rcu::Status_Flags::FLAG_LPRST)) ? RST_BROWN_OUT : + 0; +} + +// Returns the amount of free memory available in bytes +int MarlinHAL::freeMemory() { + volatile char top; + return &top - reinterpret_cast(_sbrk(0)); +} + +// Watchdog Timer +#if ENABLED(USE_WATCHDOG) + #define WDT_TIMEOUT_US TERN(WATCHDOG_DURATION_8S, 8000000, 4000000) // 4 or 8 second timeout + + #include + + FWatchdogTimer& watchdogTimer = FWatchdogTimer::get_instance(); + + // Initializes the watchdog timer + void MarlinHAL::watchdog_init() { + IF_DISABLED(DISABLE_WATCHDOG_INIT, watchdogTimer.begin(WDT_TIMEOUT_US)); + } + + // Refreshes the watchdog timer to prevent system reset + void MarlinHAL::watchdog_refresh() { + watchdogTimer.reload(); + #if DISABLED(PINS_DEBUGGING) && PIN_EXISTS(LED) + TOGGLE(LED_PIN); // Heartbeat indicator + #endif + } +#endif + +extern "C" { + extern unsigned int _ebss; // End of bss section +} + +// Resets the system to initiate a firmware flash. +WEAK void flashFirmware(const int16_t) { + hal.reboot(); +} + +#endif // ARDUINO_ARCH_MFL diff --git a/Marlin/src/HAL/GD32_MFL/HAL.h b/Marlin/src/HAL/GD32_MFL/HAL.h new file mode 100644 index 0000000000..a8a28cc7f3 --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/HAL.h @@ -0,0 +1,158 @@ +/** + * 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 + +#define CPU_32_BIT + +#include "../../core/macros.h" +#include "../shared/Marduino.h" +#include "../shared/math_32bit.h" +#include "../shared/HAL_SPI.h" + +#include "temp_soc.h" +#include "fastio.h" +#include "Servo.h" + +#include "../../inc/MarlinConfigPre.h" + +#include +#include +#include + +// Default graphical display delays +#define CPU_ST7920_DELAY_1 300 +#define CPU_ST7920_DELAY_2 40 +#define CPU_ST7920_DELAY_3 340 + +// Serial Ports +#include "MarlinSerial.h" + +// Interrupts +#define CRITICAL_SECTION_START() const bool irqon = !__get_PRIMASK(); __disable_irq() +#define CRITICAL_SECTION_END() if (irqon) __enable_irq() + +#define cli() __disable_irq() +#define sei() __enable_irq() + +// Alias of __bss_end__ +#define __bss_end __bss_end__ + +// Types +typedef double isr_float_t; // FPU ops are used for single-precision, so use double for ISRs. +typedef uint8_t pin_t; // Parity with mfl platform + +// Servo +class libServo; +typedef libServo hal_servo_t; +#define PAUSE_SERVO_OUTPUT() libServo::pause_all_servos() +#define RESUME_SERVO_OUTPUT() libServo::resume_all_servos() + +// Debugging +#define JTAG_DISABLE() AFIO_I.set_remap(gpio::Pin_Remap_Select::SWJ_DP_ONLY_REMAP) +#define JTAGSWD_DISABLE() AFIO_I.set_remap(gpio::Pin_Remap_Select::SWJ_ALL_DISABLED_REMAP) +#define JTAGSWD_RESET() AFIO_I.set_remap(gpio::Pin_Remap_Select::FULL_SWJ_REMAP) + +// ADC +#ifdef ADC_RESOLUTION + #define HAL_ADC_RESOLUTION ADC_RESOLUTION +#else + #define HAL_ADC_RESOLUTION 12 +#endif + +#define HAL_ADC_VREF_MV 3300 + +// Disable Marlin's software oversampling. +// The MFL framework uses 16x hardware oversampling by default +#define HAL_ADC_FILTERED + +#define GET_PIN_MAP_PIN(index) index +#define GET_PIN_MAP_INDEX(pin) pin +#define PARSED_PIN_INDEX(code, dval) parser.intval(code, dval) + +#ifndef PLATFORM_M997_SUPPORT + #define PLATFORM_M997_SUPPORT +#endif + +void flashFirmware(const int16_t); + +#define HAL_CAN_SET_PWM_FREQ // This HAL supports PWM Frequency adjustment + +extern "C" char* _sbrk(int incr); +extern "C" char* dtostrf(double val, signed char width, unsigned char prec, char* sout); + +// MarlinHAL Class +class MarlinHAL { +public: + // Before setup() + MarlinHAL() {} + + // Watchdog + static void watchdog_init() IF_DISABLED(USE_WATCHDOG, {}); + static void watchdog_refresh() IF_DISABLED(USE_WATCHDOG, {}); + + static void init(); // called early in setup() + static void init_board() {} // called less early in setup() + static void reboot() { NVIC_SystemReset(); } // restart the firmware from 0x0 + + // Interrupts + static bool isr_state() { return !__get_PRIMASK(); } + static void isr_on() { sei(); } + static void isr_off() { cli(); } + static void delay_ms(const int ms) { delay(ms); } + + // Tasks called from idle() + static void idletask() {} + + // Reset + static uint8_t get_reset_source(); + static void clear_reset_source() { RCU_I.clear_all_reset_flags(); } + + // Free SRAM + static int freeMemory(); + + // ADC methods + static uint16_t adc_result; + + // Called by Temperature::init once at startup + static void adc_init() { analogReadResolution(HAL_ADC_RESOLUTION); } + + // Called by Temperature::init for each sensor at startup + static void adc_enable(const pin_t pin) { pinMode(pin, INPUT); } + + // Called from Temperature::isr to start ADC sampling on the given pin + static void adc_start(const pin_t pin) { adc_result = static_cast(analogRead(pin)); } + + // Check if ADC is ready for reading + static bool adc_ready() { return true; } + + // Current value of the ADC register + static uint16_t adc_value() { return adc_result; } + + // Set the PWM duty cycle for the pin to the given value. + // Optionally invert the duty cycle [default = false] + // Optionally change the maximum size of the provided value to enable finer PWM duty control [default = 255] + static void set_pwm_duty(const pin_t pin, const uint16_t value, const uint16_t scale = 255U, const bool invert = false); + + // Set the frequency of the timer for the given pin. + // All Timer PWM pins run at the same frequency. + static void set_pwm_frequency(const pin_t pin, const uint16_t f_desired); +}; diff --git a/Marlin/src/HAL/GD32_MFL/MarlinSPI.h b/Marlin/src/HAL/GD32_MFL/MarlinSPI.h new file mode 100644 index 0000000000..d0731f9e84 --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/MarlinSPI.h @@ -0,0 +1,26 @@ +/** + * 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 + +#include + +using MarlinSPI = SPIClass; diff --git a/Marlin/src/HAL/GD32_MFL/MarlinSerial.cpp b/Marlin/src/HAL/GD32_MFL/MarlinSerial.cpp new file mode 100644 index 0000000000..c9b76a4ca4 --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/MarlinSerial.cpp @@ -0,0 +1,101 @@ +/** + * 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 . + * + */ + +#include "../platforms.h" + +#ifdef ARDUINO_ARCH_MFL + +#include "../../inc/MarlinConfig.h" +#include "MarlinSerial.h" + +#if ENABLED(EMERGENCY_PARSER) + #include "../../feature/e_parser.h" +#endif + +using namespace arduino; + +MarlinSerial& MarlinSerial::get_instance(usart::USART_Base Base, pin_size_t rxPin, pin_size_t txPin) { + UsartSerial& serial = UsartSerial::get_instance(Base, rxPin, txPin); + return *reinterpret_cast(&serial); +} + +#if USING_HW_SERIAL0 + MSerialT MSerial0(true, MarlinSerial::get_instance(usart::USART_Base::USART0_BASE, NO_PIN, NO_PIN)); +#endif +#if USING_HW_SERIAL1 + MSerialT MSerial1(true, MarlinSerial::get_instance(usart::USART_Base::USART1_BASE, NO_PIN, NO_PIN)); +#endif +#if USING_HW_SERIAL2 + MSerialT MSerial2(true, MarlinSerial::get_instance(usart::USART_Base::USART2_BASE, NO_PIN, NO_PIN)); +#endif +#if USING_HW_SERIAL3 + MSerialT MSerial3(true, MarlinSerial::get_instance(usart::USART_Base::UART3_BASE, NO_PIN, NO_PIN)); +#endif +#if USING_HW_SERIAL4 + MSerialT MSerial4(true, MarlinSerial::get_instance(usart::USART_Base::UART4_BASE, NO_PIN, NO_PIN)); +#endif + +#if ENABLED(EMERGENCY_PARSER) + // This callback needs to access the specific MarlinSerial instance + // We'll use a static pointer to track the current instance + static MarlinSerial* current_serial_instance = nullptr; + + static void emergency_callback() { + if (current_serial_instance) { + uint8_t last_data = current_serial_instance->get_last_data(); + emergency_parser.update(current_serial_instance->emergency_state, last_data); + } + } + + void MarlinSerial::register_emergency_callback(void (*callback)()) { + usart_.register_interrupt_callback(usart::Interrupt_Type::INTR_RBNEIE, callback); + } +#endif + +void MarlinSerial::begin(unsigned long baudrate, uint16_t config) { + UsartSerial::begin(baudrate, config); + #if DISABLED(SERIAL_DMA) + #if ENABLED(EMERGENCY_PARSER) + current_serial_instance = this; + register_emergency_callback(emergency_callback); + #endif + #endif +} + +void MarlinSerial::updateRxDmaBuffer() { + #if ENABLED(EMERGENCY_PARSER) + // Get the number of bytes available in the receive buffer + size_t available_bytes = usart_.available_for_read(true); + uint8_t data; + + // Process only the available data + for (size_t i = 0; i < available_bytes; ++i) { + if (usart_.read_rx_buffer(data)) { + emergency_parser.update(emergency_state, data); + } + } + #endif + // Call the base class implementation to handle any additional updates + UsartSerial::updateRxDmaBuffer(); +} + +#endif // ARDUINO_ARCH_MFL diff --git a/Marlin/src/HAL/GD32_MFL/MarlinSerial.h b/Marlin/src/HAL/GD32_MFL/MarlinSerial.h new file mode 100644 index 0000000000..f47c6da032 --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/MarlinSerial.h @@ -0,0 +1,75 @@ +/** + * 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 + +#include "../../inc/MarlinConfigPre.h" + +#if ENABLED(EMERGENCY_PARSER) + #include "../../feature/e_parser.h" +#endif + +#include + +#include "../../core/serial_hook.h" + +#define SERIAL_INDEX_MIN 0 +#define SERIAL_INDEX_MAX 4 + +#include "../shared/serial_ports.h" + +#if defined(LCD_SERIAL_PORT) && ANY(HAS_DGUS_LCD, EXTENSIBLE_UI) + #define LCD_SERIAL_TX_BUFFER_FREE() LCD_SERIAL.availableForWrite() +#endif + +using namespace arduino; + +struct MarlinSerial : public UsartSerial { + static MarlinSerial& get_instance(usart::USART_Base Base, pin_size_t rxPin = NO_PIN, pin_size_t txPin = NO_PIN); + + void begin(unsigned long baudrate, uint16_t config); + inline void begin(unsigned long baudrate) { begin(baudrate, SERIAL_8N1); } + void updateRxDmaBuffer(); + + #if DISABLED(SERIAL_DMA) + FORCE_INLINE static uint8_t buffer_overruns() { return 0; } + #endif + + #if ENABLED(EMERGENCY_PARSER) + EmergencyParser::State emergency_state; + + // Accessor method to get the last received byte + uint8_t get_last_data() { return usart_.get_last_data(); } + + // Register the emergency callback + void register_emergency_callback(void (*callback)()); + #endif + +protected: + using UsartSerial::UsartSerial; +}; + +typedef Serial1Class MSerialT; +extern MSerialT MSerial0; +extern MSerialT MSerial1; +extern MSerialT MSerial2; +extern MSerialT MSerial3; +extern MSerialT MSerial4; diff --git a/Marlin/src/HAL/GD32_MFL/MinSerial.cpp b/Marlin/src/HAL/GD32_MFL/MinSerial.cpp new file mode 100644 index 0000000000..d5e8147798 --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/MinSerial.cpp @@ -0,0 +1,163 @@ +/** + * 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 . + * + */ +#include "../platforms.h" + +#ifdef ARDUINO_ARCH_MFL + +#include "../../inc/MarlinConfigPre.h" + +#if ENABLED(POSTMORTEM_DEBUGGING) +#include "../shared/MinSerial.h" + +// Base addresses for USART peripherals +static constexpr uintptr_t USART_base[] = { + 0x40013800, // USART0 + 0x40004400, // USART1 + 0x40004800, // USART2 + 0x40004C00, // UART3 + 0x40005000 // UART4 +}; + +// Register offsets +static constexpr uint32_t STAT0_OFFSET = 0x00U; +static constexpr uint32_t DATA_OFFSET = 0x04U; +static constexpr uint32_t BAUD_OFFSET = 0x08U; +static constexpr uint32_t CTL0_OFFSET = 0x0CU; +static constexpr uint32_t CTL1_OFFSET = 0x14U; + +// Bit positions +static constexpr uint32_t TBE_BIT = 7; +static constexpr uint32_t TEN_BIT = 3; +static constexpr uint32_t UEN_BIT = 13; + +// NVIC interrupt numbers for USART +static constexpr int nvicUART[] = { 37, 38, 39, 52, 53 }; + +// RCU PCLK values for USART +static constexpr rcu::RCU_PCLK clockRegs[] = { + rcu::RCU_PCLK::PCLK_USART0, + rcu::RCU_PCLK::PCLK_USART1, + rcu::RCU_PCLK::PCLK_USART2, + rcu::RCU_PCLK::PCLK_UART3, + rcu::RCU_PCLK::PCLK_UART4 +}; + +// Memory barrier instructions +#define isb() __asm__ __volatile__ ("isb" : : : "memory") +#define dsb() __asm__ __volatile__ ("dsb" : : : "memory") +#define sw_barrier() __asm__ volatile("" : : : "memory") + +// Direct register access macros +#define USART_REG(offset) (*(volatile uint32_t*)(USART_base[SERIAL_PORT] + (offset))) +#define USART_STAT0 USART_REG(STAT0_OFFSET) +#define USART_DATA USART_REG(DATA_OFFSET) +#define USART_BAUD USART_REG(BAUD_OFFSET) +#define USART_CTL0 USART_REG(CTL0_OFFSET) +#define USART_CTL1 USART_REG(CTL1_OFFSET) + +// Bit manipulation macros +#define READ_BIT(reg, bit) (((reg) >> (bit)) & 1U) +#define SET_BIT(reg, bit) ((reg) |= (1U << (bit))) +#define CLEAR_BIT(reg, bit) ((reg) &= ~(1U << (bit))) + +// Initializes the MinSerial interface. +// This function sets up the USART interface for serial communication. +// If the selected serial port is not a hardware port, it disables the severe error reporting feature. +static void MinSerialBegin() { + #if !WITHIN(SERIAL_PORT, 0, 4) + #warning "Using POSTMORTEM_DEBUGGING requires a physical U(S)ART hardware in case of severe error." + #warning "Disabling the severe error reporting feature currently because the used serial port is not a HW port." + #else + int nvicIndex = nvicUART[SERIAL_PORT]; + + // NVIC base address for interrupt disable + struct NVICMin { + volatile uint32_t ISER[32]; + volatile uint32_t ICER[32]; + }; + NVICMin *nvicBase = (NVICMin*)0xE000E100; + + SBI32(nvicBase->ICER[nvicIndex >> 5], nvicIndex & 0x1F); + + // We require memory barriers to properly disable interrupts + // (https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the) + dsb(); + isb(); + + // Get the RCU PCLK for this USART + rcu::RCU_PCLK pclk = clockRegs[SERIAL_PORT]; + + // Disable then enable usart peripheral clocks + rcu::RCU_DEVICE.set_pclk_enable(pclk, false); + rcu::RCU_DEVICE.set_pclk_enable(pclk, true); + + // Save current baudrate + uint32_t baudrate = USART_BAUD; + + // Reset USART control registers + USART_CTL0 = 0; + USART_CTL1 = 0; // 1 stop bit + + // Restore baudrate + USART_BAUD = baudrate; + + // Enable transmitter and USART (8 bits, no parity, 1 stop bit) + SET_BIT(USART_CTL0, TEN_BIT); + SET_BIT(USART_CTL0, UEN_BIT); + #endif +} + +// Writes a single character to the serial port. +static void MinSerialWrite(char c) { + #if WITHIN(SERIAL_PORT, 0, 4) + // Wait until transmit buffer is empty + while (!READ_BIT(USART_STAT0, TBE_BIT)) { + hal.watchdog_refresh(); + sw_barrier(); + } + // Write character to data register + USART_DATA = c; + #endif +} + +// Installs the minimum serial interface. +// Sets the HAL_min_serial_init and HAL_min_serial_out function pointers to MinSerialBegin and MinSerialWrite respectively. +void install_min_serial() { + HAL_min_serial_init = &MinSerialBegin; + HAL_min_serial_out = &MinSerialWrite; +} + +extern "C" { + // A low-level assembly-based jump handler. + // Unconditionally branches to the CommonHandler_ASM function. + __attribute__((naked, aligned(4))) void JumpHandler_ASM() { + __asm__ __volatile__ ("b CommonHandler_ASM\n"); + } + void __attribute__((naked, alias("JumpHandler_ASM"), nothrow)) HardFault_Handler(); + void __attribute__((naked, alias("JumpHandler_ASM"), nothrow)) BusFault_Handler(); + void __attribute__((naked, alias("JumpHandler_ASM"), nothrow)) UsageFault_Handler(); + void __attribute__((naked, alias("JumpHandler_ASM"), nothrow)) MemManage_Handler(); + void __attribute__((naked, alias("JumpHandler_ASM"), nothrow)) NMI_Handler(); +} + +#endif // POSTMORTEM_DEBUGGING +#endif // ARDUINO_ARCH_MFL diff --git a/Marlin/src/HAL/GD32_MFL/README.md b/Marlin/src/HAL/GD32_MFL/README.md new file mode 100644 index 0000000000..af23a37f2f --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/README.md @@ -0,0 +1,8 @@ +# Generic GD32 HAL based on the MFL Arduino Core + +This HAL is eventually intended to act as the generic HAL for all GD32 chips using the MFL library. + +Currently it supports: + * GD32F303RET6 + +Targeting the official [MFL Arduino Core](https://github.com/bnmguy/ArduinoCore_MFL). diff --git a/Marlin/src/HAL/GD32_MFL/SDCard.cpp b/Marlin/src/HAL/GD32_MFL/SDCard.cpp new file mode 100644 index 0000000000..15d33d2596 --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/SDCard.cpp @@ -0,0 +1,1022 @@ +// +// MFL gd32f30x SDCARD using DMA through SDIO in C++ +// +// Copyright (C) 2025 B. Mourit +// +// This software is free software: you can redistribute it and/or modify it under the terms of the +// GNU Lesser General Public License as published by the Free Software Foundation, +// either version 3 of the License, or (at your option) any later version. +// +// This software 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 Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License along with this software. +// If not, see . +// + +#include "../platforms.h" + +#ifdef ARDUINO_ARCH_MFL + +#include "../../inc/MarlinConfig.h" +#include "../shared/Delay.h" + +#include "SDCard.h" +#include +#include + +namespace sdio { + +CardDMA& CardDMA::get_instance() { + static CardDMA instance; + return instance; +} + +CardDMA::CardDMA() : + sdcard_csd_{0U, 0U, 0U, 0U}, + sdcard_cid_{0U, 0U, 0U, 0U}, + sdcard_scr_{0U, 0U}, + desired_clock_(Default_Desired_Clock), + stop_condition_(0U), + total_bytes_(0U), + count_(0U), + sdio_(SDIO::get_instance()), + config_(sdio_.get_config()), + dmaBase_(dma::DMA_Base::DMA1_BASE), + dmaChannel_(dma::DMA_Channel::CHANNEL3), + dma_(dma::DMA::get_instance(dmaBase_, dmaChannel_).value()), + sdcard_rca_(0U), + transfer_error_(SDIO_Error_Type::OK), + interface_version_(Interface_Version::UNKNOWN), + card_type_(Card_Type::UNKNOWN), + transfer_end_(false), + is_rx_(false), + multiblock_(false), + current_state_(Operational_State::READY) +{ +} + +// Initialize card and put in standby state +SDIO_Error_Type CardDMA::init() { + // Reset SDIO peripheral + sdio_.reset(); + sync_domains(); + + // Initialize SDIO peripheral + // If no SDIO_Config structure is provided the default is used. + // The default provides the parameters for initialization + // using a very low clock speed (typically <= 400KHz). + sdio_.init(); + sync_domains(); + + SDIO_Error_Type result = begin_startup_procedure(); + if (result != SDIO_Error_Type::OK) { + return result; + } + + return card_init(); +} + +// Startup command procedure according to SDIO specification +SDIO_Error_Type CardDMA::begin_startup_procedure() { + sdio_.set_power_mode(Power_Control::POWER_ON); + sdio_.set_clock_enable(true); + sync_domains(); + + // CMD0 (GO_IDLE_STATE) + if (send_command_and_check(Command_Index::CMD0, 0, Command_Response::RSP_NONE, Wait_Type::WT_NONE, [this]() { + return this->get_command_sent_result(); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::CMD0_FAILED; + } + + // CMD8 + if (send_command_and_check(Command_Index::CMD8, Check_Pattern, Command_Response::RSP_SHORT, Wait_Type::WT_NONE, [this]() { + return this->get_r7_result(); + }) != SDIO_Error_Type::OK) { + // V1.0 card + // CMD0 (GO_IDLE_STATE) + interface_version_ = Interface_Version::INTERFACE_V1_1; + if (send_command_and_check(Command_Index::CMD0, 0, Command_Response::RSP_NONE, Wait_Type::WT_NONE, [this]() { + return this->get_command_sent_result(); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::CMD0_FAILED; + } + } else { + // V2.0 card + // CMD55 + interface_version_ = Interface_Version::INTERFACE_V2_0; + if (send_command_and_check(Command_Index::CMD55, 0, Command_Response::RSP_SHORT, Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD55]() { + return get_r1_result(cmd); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::CMD55_FAILED; + } + } + + if (send_command_and_check(Command_Index::CMD55, 0, Command_Response::RSP_SHORT, Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD55]() { + return get_r1_result(cmd); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::CMD55_FAILED; + } + + return validate_voltage(); +} + +// Voltage validation +SDIO_Error_Type CardDMA::validate_voltage() { + uint32_t response = 0U; + uint32_t count = 0U; + bool valid_voltage = false; + + while ((count < Max_Voltage_Checks) && (valid_voltage == false)) { + if (send_command_and_check(Command_Index::CMD55, 0, Command_Response::RSP_SHORT, + Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD55]() { + return get_r1_result(cmd); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::CMD55_FAILED; + } + + if (send_command_and_check(Command_Index::ACMD41, Voltage_Window | SDCARD_HCS | Switch_1_8V_Capacity, + Command_Response::RSP_SHORT, Wait_Type::WT_NONE, [this, cmd = Command_Index::INVALID, index = false, crc = true]() { + return check_sdio_status(cmd, index, crc); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::ACMD41_FAILED; + } + response = sdio_.get_response(Response_Type::RESPONSE0); + valid_voltage = (((response >> 31U) == 1U) ? true : false); + count++; + } + + if (count >= Max_Voltage_Checks) { + return SDIO_Error_Type::INVALID_VOLTAGE; + } + + card_type_ = (response & SDCARD_HCS) ? Card_Type::SDCARD_HIGH_CAPACITY : Card_Type::SDCARD_STANDARD_CAPACITY; + + #if ENABLED(MARLIN_DEV_MODE) + if (card_type_ == Card_Type::SDCARD_HIGH_CAPACITY) { + SERIAL_ECHOPGM("\n SDHC!"); + } else { + SERIAL_ECHOPGM("\n SDSC!"); + } + #endif + + return SDIO_Error_Type::OK; +} + +// Shutdown +void CardDMA::begin_shutdown_procedure() { + sdio_.set_power_mode(Power_Control::POWER_OFF); +} + +// Initialize card +SDIO_Error_Type CardDMA::card_init() { + if (sdio_.get_power_mode() == static_cast(Power_Control::POWER_OFF)) { + return SDIO_Error_Type::INVALID_OPERATION; + } + + // Skip CID/RCA for IO cards + if (card_type_ != Card_Type::SD_IO_CARD) { + if (send_command_and_check(Command_Index::CMD2, 0U, Command_Response::RSP_LONG, Wait_Type::WT_NONE, + [this, cmd = Command_Index::INVALID, index = false, crc = true]() { + return check_sdio_status(cmd, index, crc); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::CMD2_FAILED; + } + // Store CID + store_cid(); + + // Get RCA + uint16_t r6_rca; + if (send_command_and_check(Command_Index::CMD3, 0U, Command_Response::RSP_SHORT, Wait_Type::WT_NONE, + [this, cmd = Command_Index::CMD3, rca = &r6_rca]() { + return get_r6_result(cmd, rca); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::CMD3_FAILED; + } + // Store RCA + sdcard_rca_ = r6_rca; + if (send_command_and_check(Command_Index::CMD9, static_cast(sdcard_rca_ << RCA_Shift), + Command_Response::RSP_LONG, Wait_Type::WT_NONE, + [this, cmd = Command_Index::INVALID, index = false, crc = true]() { + return check_sdio_status(cmd, index, crc); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::CMD9_FAILED; + } + // Store CSD + store_csd(); + } + + Card_Info card_info; + SDIO_Error_Type result = get_card_specific_data(&card_info); + if (result != SDIO_Error_Type::OK) { + return result; + } + + if (select_deselect() != SDIO_Error_Type::OK) { + return SDIO_Error_Type::SELECT_DESELECT_FAILED; + } + + return SDIO_Error_Type::OK; +} + +SDIO_Error_Type CardDMA::store_cid() { + // Store the CID register values + sdcard_cid_[0] = sdio_.get_response(Response_Type::RESPONSE0); + sdcard_cid_[1] = sdio_.get_response(Response_Type::RESPONSE1); + sdcard_cid_[2] = sdio_.get_response(Response_Type::RESPONSE2); + sdcard_cid_[3] = sdio_.get_response(Response_Type::RESPONSE3); + + return SDIO_Error_Type::OK; +} + +SDIO_Error_Type CardDMA::store_csd() { + // Store the CSD register values + sdcard_csd_[0] = sdio_.get_response(Response_Type::RESPONSE0); + sdcard_csd_[1] = sdio_.get_response(Response_Type::RESPONSE1); + sdcard_csd_[2] = sdio_.get_response(Response_Type::RESPONSE2); + sdcard_csd_[3] = sdio_.get_response(Response_Type::RESPONSE3); + + return SDIO_Error_Type::OK; +} + +SDIO_Error_Type CardDMA::set_hardware_bus_width(Bus_Width width) { + if (card_type_ == Card_Type::SD_MMC || width == Bus_Width::WIDTH_8BIT) { + return SDIO_Error_Type::UNSUPPORTED_FUNCTION; + } + + // Retrieve SCR + SDIO_Error_Type result = get_scr(sdcard_rca_, sdcard_scr_); + if (result != SDIO_Error_Type::OK) { + return result; + } + + // Check and set bus width + // This function is only used to set a higher width than the default 1bit + // so no 1bit configuration logic is required. + if (width == Bus_Width::WIDTH_4BIT) { + // Send CMD55 (APP_CMD) + if (send_command_and_check(Command_Index::CMD55, static_cast(sdcard_rca_ << RCA_Shift), Command_Response::RSP_SHORT, + Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD55]() { + return get_r1_result(cmd); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::CMD55_FAILED; + } + + // Send ACMD6 (SET_BUS_WIDTH) + if (send_command_and_check(Command_Index::ACMD6, 2U, Command_Response::RSP_SHORT, + Wait_Type::WT_NONE, [this, cmd = Command_Index::ACMD6]() { + return get_r1_result(cmd); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::ACMD6_FAILED; + } + + #if ENABLED(MARLIN_DEV_MODE) + SERIAL_ECHOPGM("\n wide bus set!"); + #endif + sdio_.set_bus_width(Bus_Width::WIDTH_4BIT); + + return SDIO_Error_Type::OK; + } + + return SDIO_Error_Type::UNSUPPORTED_FUNCTION; +} + +SDIO_Error_Type CardDMA::read(uint8_t* buf, uint32_t address, uint32_t count) { + if (current_state_ == Operational_State::READY) { + transfer_error_ = SDIO_Error_Type::OK; + current_state_ = Operational_State::BUSY; + is_rx_ = true; + multiblock_ = (count > 1); + + sdio_.clear_data_state_machine(Transfer_Direction::CARD_TO_SDIO); + + // Enable the interrupts + sdio_.set_interrupt_enable(Interrupt_Type::DTCRCERRIE, true); + sdio_.set_interrupt_enable(Interrupt_Type::DTTMOUTIE, true); + sdio_.set_interrupt_enable(Interrupt_Type::RXOREIE, true); + sdio_.set_interrupt_enable(Interrupt_Type::DTENDIE, true); + sdio_.set_interrupt_enable(Interrupt_Type::STBITEIE, true); + + total_bytes_ = BLOCK_SIZE * count; + + // Set DMA transfer parameters + set_dma_parameters(buf, (total_bytes_ / 4U), false); + sdio_.set_dma_enable(true); + + if (card_type_ != Card_Type::SDCARD_HIGH_CAPACITY) { + address *= 512U; + } + + // CMD16 set card block size + if (send_command_and_check(Command_Index::CMD16, BLOCK_SIZE, Command_Response::RSP_SHORT, + Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD16]() { + return get_r1_result(cmd); + }) != SDIO_Error_Type::OK) { + sdio_.clear_multiple_interrupt_flags(clear_common_flags); + current_state_ = Operational_State::READY; + return SDIO_Error_Type::CMD16_FAILED; + } + + Block_Size block_size = get_data_block_size_index(BLOCK_SIZE); + + sdio_.set_data_state_machine_and_send(Data_Timeout, total_bytes_, block_size, + Transfer_Mode::BLOCK, Transfer_Direction::CARD_TO_SDIO, true); + + // CMD17/CMD18 (READ_SINGLE_BLOCK/READ_MULTIPLE_BLOCKS) send read command + Command_Index read_cmd = (count > 1U) ? Command_Index::CMD18 : Command_Index::CMD17; + if (send_command_and_check(read_cmd, address, + Command_Response::RSP_SHORT, Wait_Type::WT_NONE, [this, cmd = read_cmd]() { + return get_r1_result(cmd); + }) != SDIO_Error_Type::OK) { + sdio_.clear_multiple_interrupt_flags(clear_common_flags); + current_state_ = Operational_State::READY; + return (count > 1U) ? SDIO_Error_Type::CMD18_FAILED : SDIO_Error_Type::CMD17_FAILED; + } + return SDIO_Error_Type::OK; + } else { + return SDIO_Error_Type::BUSY; + } +} + +SDIO_Error_Type CardDMA::write(uint8_t* buf, uint32_t address, uint32_t count) { + // Enable the interrupts + sdio_.set_interrupt_enable(Interrupt_Type::DTCRCERRIE, true); + sdio_.set_interrupt_enable(Interrupt_Type::DTTMOUTIE, true); + sdio_.set_interrupt_enable(Interrupt_Type::STBITEIE, true); + sdio_.set_interrupt_enable(Interrupt_Type::TXUREIE, true); + + if (card_type_ != Card_Type::SDCARD_HIGH_CAPACITY) { + address *= 512U; + } + + // CMD16 + if (send_command_and_check(Command_Index::CMD16, BLOCK_SIZE, Command_Response::RSP_SHORT, + Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD16]() { + return get_r1_result(cmd); + }) != SDIO_Error_Type::OK) { + sdio_.clear_multiple_interrupt_flags(clear_common_flags); + return SDIO_Error_Type::CMD16_FAILED; + } + + // CMD25/CMD24 (WRITE_MULTIPLE_BLOCK/WRITE_BLOCK) send write command + Command_Index write_cmd = (count > 1U) ? Command_Index::CMD25 : Command_Index::CMD24; + if (send_command_and_check(write_cmd, address, Command_Response::RSP_SHORT, + Wait_Type::WT_NONE, [this, cmd = write_cmd]() { + return get_r1_result(cmd); + }) != SDIO_Error_Type::OK) { + sdio_.clear_multiple_interrupt_flags(clear_common_flags); + return (count > 1U) ? SDIO_Error_Type::CMD25_FAILED : SDIO_Error_Type::CMD24_FAILED; + } + + total_bytes_ = BLOCK_SIZE * count; + // Start DMA transfer + set_dma_parameters(buf, (total_bytes_ / 4U), true); + sdio_.set_dma_enable(true); + + sdio_.clear_data_state_machine(Transfer_Direction::SDIO_TO_CARD); + Block_Size block_size = get_data_block_size_index(total_bytes_); + + sdio_.set_data_state_machine_and_send(Data_Timeout, total_bytes_, block_size, + Transfer_Mode::BLOCK, Transfer_Direction::SDIO_TO_CARD, true); + + while ((dma_.get_flag(dma::Status_Flags::FLAG_FTFIF)) || (dma_.get_flag(dma::Status_Flags::FLAG_ERRIF))) { + // Wait for the IRQ handler to clear + } + + return SDIO_Error_Type::OK; +} + +SDIO_Error_Type CardDMA::erase(uint32_t address_start, uint32_t address_end) { + SDIO_Error_Type result = SDIO_Error_Type::OK; + + // Card command classes CSD + uint8_t temp_byte = static_cast((sdcard_csd_[1] & (0xFFU << 24U)) >> 24U); + uint16_t classes = static_cast(temp_byte << 4U); + temp_byte = static_cast((sdcard_csd_[1] & (0xFFU << 16U)) >> 16U); + classes |= static_cast((temp_byte & 0xF0U) >> 4U); + + if ((classes & (1U << static_cast(Card_Command_Class::ERASE))) == Clear) { + return SDIO_Error_Type::UNSUPPORTED_FUNCTION; + } + + uint32_t delay_time = 120000U / sdio_.get_clock_divider(); + + if (sdio_.get_response(Response_Type::RESPONSE0) & Card_Locked) { + return SDIO_Error_Type::LOCK_UNLOCK_FAILED; + } + + // Size is fixed at 512 bytes for SDHC + if (card_type_ != Card_Type::SDCARD_HIGH_CAPACITY) { + address_start *= 512U; + address_end *= 512U; + } + + if ((card_type_ == Card_Type::SDCARD_STANDARD_CAPACITY) || (card_type_ == Card_Type::SDCARD_HIGH_CAPACITY)) { + // CMD32 (ERASE_WR_BLK_START) + if (send_command_and_check(Command_Index::CMD32, address_start, Command_Response::RSP_SHORT, + Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD32]() { + return get_r1_result(cmd); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::CMD32_FAILED; + } + // CMD33 (ERASE_WR_BLK_END) + if (send_command_and_check(Command_Index::CMD33, address_end, Command_Response::RSP_SHORT, + Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD33]() { + return get_r1_result(cmd); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::CMD33_FAILED; + } + } + + // CMD38 (ERASE) + if (send_command_and_check(Command_Index::CMD38, 0U, Command_Response::RSP_SHORT, + Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD38]() { + return get_r1_result(cmd); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::CMD38_FAILED; + } + + // Loop until the counter reaches the calculated time + for (uint32_t count = 0U; count < delay_time; count++) {} + + Card_State card_state; + result = get_card_state(&card_state); + while ((result == SDIO_Error_Type::OK) && ((card_state == Card_State::PROGRAMMING) || (card_state == Card_State::RECEIVE_DATA))) { + result = get_card_state(&card_state); + } + + return result; +} + +void CardDMA::handle_interrupts() { + transfer_error_ = SDIO_Error_Type::OK; + + if (sdio_.get_interrupt_flag(Interrupt_Flags::FLAG_INTR_DTEND)) { + sdio_.clear_interrupt_flag(Clear_Flags::FLAG_DTENDC); + // Disable all interrupts + disable_all_interrupts(); + sdio_.set_data_state_machine_enable(false); + + if ((multiblock_) && (!is_rx_)) { + transfer_error_ = stop_transfer(); + if (transfer_error_ != SDIO_Error_Type::OK) {} + } + + if (!is_rx_) { + sdio_.set_dma_enable(false); + current_state_ = Operational_State::READY; + } + } else if (sdio_.get_interrupt_flag(Interrupt_Flags::FLAG_INTR_DTCRCERR) || + sdio_.get_interrupt_flag(Interrupt_Flags::FLAG_INTR_DTTMOUT) || + sdio_.get_interrupt_flag(Interrupt_Flags::FLAG_INTR_STBITE) || + sdio_.get_interrupt_flag(Interrupt_Flags::FLAG_INTR_TXURE) || + sdio_.get_interrupt_flag(Interrupt_Flags::FLAG_INTR_RXORE)) { + + if (sdio_.get_interrupt_flag(Interrupt_Flags::FLAG_INTR_DTCRCERR)) { + transfer_error_ = SDIO_Error_Type::DATA_CRC_ERROR; + } + if (sdio_.get_interrupt_flag(Interrupt_Flags::FLAG_INTR_DTTMOUT)) { + transfer_error_ = SDIO_Error_Type::DATA_TIMEOUT; + } + if (sdio_.get_interrupt_flag(Interrupt_Flags::FLAG_INTR_STBITE)) { + transfer_error_ = SDIO_Error_Type::START_BIT_ERROR; + } + if (sdio_.get_interrupt_flag(Interrupt_Flags::FLAG_INTR_TXURE)) { + transfer_error_ = SDIO_Error_Type::TX_FIFO_UNDERRUN; + } + if (sdio_.get_interrupt_flag(Interrupt_Flags::FLAG_INTR_RXORE)) { + transfer_error_ = SDIO_Error_Type::RX_FIFO_OVERRUN; + } + sdio_.clear_multiple_interrupt_flags(clear_data_flags); + sdio_.clear_interrupt_flag(Clear_Flags::FLAG_STBITEC); + disable_all_interrupts(); + + dma_.set_transfer_abandon(); + } +} + +SDIO_Error_Type CardDMA::select_deselect() { + // CMD7 (SELECT/DESELECT_CARD) + if (send_command_and_check(Command_Index::CMD7, static_cast(sdcard_rca_ << RCA_Shift), + Command_Response::RSP_SHORT, Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD7]() { + return get_r1_result(cmd); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::CMD7_FAILED; + } + return SDIO_Error_Type::OK; +} + +SDIO_Error_Type CardDMA::get_card_interface_status(uint32_t* status) { + if (status == nullptr) return SDIO_Error_Type::INVALID_PARAMETER; + + // CMD13 (SEND_STATUS) + if (send_command_and_check(Command_Index::CMD13, static_cast(sdcard_rca_ << RCA_Shift), + Command_Response::RSP_SHORT, Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD13]() { + return get_r1_result(cmd); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::CMD13_FAILED; + } + + *status = sdio_.get_response(Response_Type::RESPONSE0); + + return SDIO_Error_Type::OK; +} + +SDIO_Error_Type CardDMA::get_sdcard_status(uint32_t* status) { + uint32_t count = 0U; + + // CMD16 (SET_BLOCKLEN) + if (send_command_and_check(Command_Index::CMD16, 64U, + Command_Response::RSP_SHORT, Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD16]() { + return get_r1_result(cmd); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::CMD16_FAILED; + } + + // CMD55 (APP_CMD) + if (send_command_and_check(Command_Index::CMD55, static_cast(sdcard_rca_ << RCA_Shift), + Command_Response::RSP_SHORT, Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD55]() { + return get_r1_result(cmd); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::CMD55_FAILED; + } + + sdio_.set_data_state_machine_and_send(Data_Timeout, 64U, Block_Size::BYTES_64, Transfer_Mode::BLOCK, Transfer_Direction::CARD_TO_SDIO, true); + + // ACMD13 (SD_STATUS) + if (send_command_and_check(Command_Index::ACMD13, 0U, + Command_Response::RSP_SHORT, Wait_Type::WT_NONE, [this, cmd = Command_Index::ACMD13]() { + return get_r1_result(cmd); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::ACMD13_FAILED; + } + + while (!sdio_.check_scr_flags()) { + if (sdio_.get_flag(Status_Flags::FLAG_RFH)) { + for (count = 0U; count < FIFO_Half_Words; count++) { + *(status + count) = sdio_.read_fifo_word(); + } + status += FIFO_Half_Words; + } + + //SDIO_Error_Type result = SDIO_Error_Type::OK; + if (sdio_.get_flag(Status_Flags::FLAG_DTCRCERR)) { + sdio_.clear_flag(Clear_Flags::FLAG_DTCRCERRC); + return SDIO_Error_Type::DATA_CRC_ERROR; + } else if (sdio_.get_flag(Status_Flags::FLAG_DTTMOUT)) { + sdio_.clear_flag(Clear_Flags::FLAG_DTTMOUTC); + return SDIO_Error_Type::DATA_TIMEOUT; + } else if (sdio_.get_flag(Status_Flags::FLAG_RXORE)) { + sdio_.clear_flag(Clear_Flags::FLAG_RXOREC); + return SDIO_Error_Type::RX_FIFO_OVERRUN; + } else if (sdio_.get_flag(Status_Flags::FLAG_STBITE)) { + sdio_.clear_flag(Clear_Flags::FLAG_STBITEC); + return SDIO_Error_Type::START_BIT_ERROR; + } + while (sdio_.get_flag(Status_Flags::FLAG_RXDTVAL)) { + *status = sdio_.read_fifo_word(); + ++status; + } + + sdio_.clear_multiple_interrupt_flags(clear_data_flags); + status -= 16U; + for (count = 0U; count < 16U; count++) { + status[count] = ((status[count] & 0xFFU) << 24U) | + ((status[count] & (0xFFU << 8U)) << 8U) | + ((status[count] & (0xFFU << 16U)) >> 8U) | + ((status[count] & (0xFFU << 24U)) >> 24U); + } + } + + return SDIO_Error_Type::OK; +} + +void CardDMA::check_dma_complete() { + while ((dma_.get_flag(dma::Status_Flags::FLAG_FTFIF)) || (dma_.get_flag(dma::Status_Flags::FLAG_ERRIF))) { + // Wait for the IRQ handler to clear + } +} + +SDIO_Error_Type CardDMA::stop_transfer() { + // CMD12 (STOP_TRANSMISSION) + if (send_command_and_check(Command_Index::CMD12, 0, Command_Response::RSP_SHORT, Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD12]() { + return get_r1_result(cmd); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::CMD12_FAILED; + } + return SDIO_Error_Type::OK; +} + +Transfer_State CardDMA::get_transfer_state() { + Transfer_State transfer_state = Transfer_State::IDLE; + if (sdio_.get_flag(Status_Flags::FLAG_TXRUN) | sdio_.get_flag(Status_Flags::FLAG_RXRUN)) { + transfer_state = Transfer_State::BUSY; + } + + return transfer_state; +} + +uint32_t CardDMA::get_card_capacity() const { + auto extract_bits = [](uint32_t value, uint8_t start_bit, uint8_t length) -> uint32_t { + return (value >> start_bit) & ((1U << length) - 1U); + }; + + uint32_t capacity = 0U; + uint32_t device_size = 0U; + + if (card_type_ == Card_Type::SDCARD_STANDARD_CAPACITY) { + // Extract fields from CSD data using bit manipulation + uint8_t device_size_high = static_cast(extract_bits(sdcard_csd_[1], 8U, 2U)); // Bits [73:72] + uint8_t device_size_mid = static_cast(extract_bits(sdcard_csd_[1], 0U, 8U)); // Bits [71:64] + uint8_t device_size_low = static_cast(extract_bits(sdcard_csd_[2], 24U, 2U)); // Bits [63:62] + + device_size = static_cast((device_size_high) << 10U) | + static_cast((device_size_mid) << 2U) | + static_cast((device_size_low)); + + uint8_t device_size_multiplier_high = static_cast(extract_bits(sdcard_csd_[2], 16U, 2U)); // Bits [49:48] + uint8_t device_size_multiplier_low = static_cast(extract_bits(sdcard_csd_[2], 8U, 1U)); // Bit [47] + uint8_t device_size_multiplier = static_cast((device_size_multiplier_high << 1U) | device_size_multiplier_low); + uint8_t read_block_length = static_cast(extract_bits(sdcard_csd_[1], 16U, 4U)); // Bits [83:80] + + // Capacity = (device_size + 1) * MULT * BLOCK_LEN + uint32_t mult = static_cast(1U << (device_size_multiplier + 2U)); // MULT = 2 ^ (C_SIZE_MULT + 2) + uint32_t block_length = static_cast(1U << read_block_length); // BLOCK_LEN = 2 ^ READ_BL_LEN + + capacity = (device_size + 1U) * mult * block_length; + capacity /= KILOBYTE; // Convert capacity to kilobytes + + } else if (card_type_ == Card_Type::SDCARD_HIGH_CAPACITY) { + // High-capacity card calculation + uint8_t device_size_high = static_cast(extract_bits(sdcard_csd_[1], 0U, 6U)); // Bits [69:64] + uint8_t device_size_mid = static_cast(extract_bits(sdcard_csd_[2], 24U, 8U)); // Bits [55:48] + uint8_t device_size_low = static_cast(extract_bits(sdcard_csd_[2], 16U, 8U)); // Bits [47:40] + + device_size = static_cast((device_size_high) << 16U) | + static_cast((device_size_mid) << 8U) | + static_cast(device_size_low); + + // Capacity in kilobytes + capacity = (device_size + 1U) * BLOCK_SIZE; + } + + return capacity; +} + +SDIO_Error_Type CardDMA::get_card_specific_data(Card_Info* info) { + if (info == nullptr) return SDIO_Error_Type::INVALID_PARAMETER; + + // Store basic card information + info->type = card_type_; + info->relative_address = sdcard_rca_; + + // Helper function to convert 32-bit registers to byte array + auto convert_registers_to_bytes = [](const uint32_t* registers, uint8_t* bytes, size_t reg_count) { + for (size_t i = 0U; i < reg_count; ++i) { + for (size_t j = 0U; j < 4U; ++j) { + bytes[i * 4U + j] = (registers[i] >> (24U - j * 8U)) & 0xFFU; + } + } + }; + + // Process CID data + uint8_t cid_bytes[16]; + convert_registers_to_bytes(sdcard_cid_, cid_bytes, 4); + + info->cid = { + .manufacture_id = cid_bytes[0], + .oem_id = static_cast( + (cid_bytes[1] << 8U) | + cid_bytes[2] + ), + .name0 = static_cast( + (cid_bytes[3] << 24U) | + (cid_bytes[4] << 16U) | + (cid_bytes[5] << 8U) | + cid_bytes[6] + ), + .name1 = cid_bytes[7], + .revision = cid_bytes[8], + .serial_number = static_cast( + (cid_bytes[9] << 24U) | + (cid_bytes[10] << 16U) | + (cid_bytes[11] << 8U) | + cid_bytes[12] + ), + .manufacture_date = static_cast( + ((cid_bytes[13] & 0x0FU) << 8U) | + cid_bytes[14] + ), + .checksum = static_cast(((cid_bytes[15] & 0xFEU) >> 1U)) + }; + + // Process CSD data + uint8_t csd_bytes[16]; + convert_registers_to_bytes(sdcard_csd_, csd_bytes, 4U); + + // Fill common CSD fields + info->csd = { + .transfer_speed = csd_bytes[3], + .card_command_class = static_cast((csd_bytes[4] << 4U) | ((csd_bytes[5] & 0xF0U) >> 4U)), + }; + + // Process card-type specific CSD fields and calculate capacity + if (card_type_ == Card_Type::SDCARD_STANDARD_CAPACITY) { + process_sdsc_specific_csd(info, csd_bytes); + } else if (card_type_ == Card_Type::SDCARD_HIGH_CAPACITY) { + process_sdhc_specific_csd(info, csd_bytes); + } + + // Fill remaining common CSD fields + process_common_csd_tail(info, csd_bytes); + + return SDIO_Error_Type::OK; +} + +constexpr Block_Size CardDMA::get_data_block_size_index(uint16_t size) { + switch (size) { + case 1: return Block_Size::BYTES_1; + case 2: return Block_Size::BYTES_2; + case 4: return Block_Size::BYTES_4; + case 8: return Block_Size::BYTES_8; + case 16: return Block_Size::BYTES_16; + case 32: return Block_Size::BYTES_32; + case 64: return Block_Size::BYTES_64; + case 128: return Block_Size::BYTES_128; + case 256: return Block_Size::BYTES_256; + case 512: return Block_Size::BYTES_512; + case 1024: return Block_Size::BYTES_1024; + case 2048: return Block_Size::BYTES_2048; + case 4096: return Block_Size::BYTES_4096; + case 8192: return Block_Size::BYTES_8192; + case 16384: return Block_Size::BYTES_16384; + default: return Block_Size::BYTES_1; + } +} + +SDIO_Error_Type CardDMA::get_card_state(Card_State* card_state) { + // CMD13 (SEND_STATUS) + if (send_command_and_check(Command_Index::CMD13, static_cast(sdcard_rca_ << RCA_Shift), + Command_Response::RSP_SHORT, Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD13]() { + return get_r1_result(cmd); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::CMD13_FAILED; + } + + uint32_t response = sdio_.get_response(Response_Type::RESPONSE0); + *card_state = static_cast((response >> 9U) & CardStateMask); + if ((response & All_R1_Error_Bits) == 0U) { + return SDIO_Error_Type::OK; + } + + if (response & All_R1_Error_Bits) { + for (const auto& entry : errorTableR1) { + if (response & entry.mask) { + return entry.errorType; + } + } + return SDIO_Error_Type::ERROR; + } + + return SDIO_Error_Type::OK; +} + +SDIO_Error_Type CardDMA::get_command_sent_result() { + volatile uint32_t timeout = 0x00FFFFFFU; + + while ((sdio_.get_flag(Status_Flags::FLAG_CMDSEND) == false) && (timeout != 0U)) { + timeout = timeout - 1U; + } + if (timeout == 0U) return SDIO_Error_Type::RESPONSE_TIMEOUT; + sdio_.clear_multiple_interrupt_flags(clear_command_flags); + + return SDIO_Error_Type::OK; +} + +SDIO_Error_Type CardDMA::check_sdio_status(Command_Index index, bool check_index, bool ignore_crc) { + // Wait until one of the relevant flags is set + bool flag_set = sdio_.wait_cmd_flags(); + + if (!flag_set) { + return SDIO_Error_Type::RESPONSE_TIMEOUT; + } + + // Check the cmd received bit first, since noise can sometimes + // cause the timeout bit to get erroneously set + // If cmd was received we can safely ignore other checks + if (sdio_.get_flag(Status_Flags::FLAG_CMDRECV)) { + // If cmd was received, check the index + // Responses that dont do an index check will send an invalid cmd index + if (check_index && (index != Command_Index::INVALID)) { + uint8_t idx = sdio_.get_command_index(); + if (idx != static_cast(index)) { + return SDIO_Error_Type::ILLEGAL_COMMAND; + } + } + // Clear all flags before returning + sdio_.clear_multiple_interrupt_flags(clear_command_flags); + return SDIO_Error_Type::OK; + } + + // Timeout check + if (sdio_.get_flag(Status_Flags::FLAG_CMDTMOUT)) { + sdio_.clear_flag(Clear_Flags::FLAG_CMDTMOUTC); + return SDIO_Error_Type::RESPONSE_TIMEOUT; + } + + // CRC check + if (!ignore_crc) { + if (sdio_.get_flag(Status_Flags::FLAG_CCRCERR)) { + sdio_.clear_flag(Clear_Flags::FLAG_CCRCERRC); + return SDIO_Error_Type::COMMAND_CRC_ERROR; + } + } + + // Responses that dont do an index check will send an invalid cmd index + if (check_index && (index != Command_Index::INVALID)) { + uint8_t idx = sdio_.get_command_index(); + if (idx != static_cast(index)) { + return SDIO_Error_Type::ILLEGAL_COMMAND; + } + } + + // Clear all flags before returning + sdio_.clear_multiple_interrupt_flags(clear_command_flags); + + return SDIO_Error_Type::OK; +} + +SDIO_Error_Type CardDMA::get_r1_result(Command_Index index) { + SDIO_Error_Type result = check_sdio_status(index, true, false); + if (result != SDIO_Error_Type::OK) { + return result; + } + + // Get the R1 response and check for errors + uint32_t response = sdio_.get_response(Response_Type::RESPONSE0); + + if (response & All_R1_Error_Bits) { + for (const auto& entry : errorTableR1) { + if (response & entry.mask) { + return entry.errorType; + } + } + return SDIO_Error_Type::ERROR; + } + + return SDIO_Error_Type::OK; +} + +SDIO_Error_Type CardDMA::get_r6_result(Command_Index index, uint16_t* rca) { + SDIO_Error_Type result = check_sdio_status(index, true, false); + if (result != SDIO_Error_Type::OK) return result; + + uint32_t response = sdio_.get_response(Response_Type::RESPONSE0); + + if (response & R6_Error_Bits) { + for (const auto& entry : errorTableR6) { + if (response & entry.mask) { + return entry.errorType; + } + } + return SDIO_Error_Type::ERROR; + } + *rca = static_cast(response >> 16U); + + return SDIO_Error_Type::OK; +} + +SDIO_Error_Type CardDMA::get_r7_result() { + return check_sdio_status(Command_Index::INVALID, false, false); +} + +SDIO_Error_Type CardDMA::get_scr(uint16_t rca, uint32_t* scr) { + uint32_t temp_scr[2] = {0U, 0U}; + uint32_t index_scr = 0U; + uint32_t* src_data = scr; + + // CMD16 (SET_BLOCKLEN) + if (send_command_and_check(Command_Index::CMD16, 8U, Command_Response::RSP_SHORT, + Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD16]() { + return get_r1_result(cmd); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::CMD16_FAILED; + } + + // CMD55 (APP_CMD) + if (send_command_and_check(Command_Index::CMD55, static_cast(sdcard_rca_ << RCA_Shift), + Command_Response::RSP_SHORT, Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD55]() { + return get_r1_result(cmd); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::CMD55_FAILED; + } + + // Set data parameters + sdio_.set_data_state_machine_and_send(Data_Timeout, 8U, Block_Size::BYTES_8, + Transfer_Mode::BLOCK, Transfer_Direction::CARD_TO_SDIO, true); + + // ACMD51 (SEND_SCR) + if (send_command_and_check(Command_Index::ACMD51, 0U, Command_Response::RSP_SHORT, + Wait_Type::WT_NONE, [this, cmd = Command_Index::ACMD51]() { + return get_r1_result(cmd); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::ACMD51_FAILED; + } + + // Store SCR + while (!sdio_.check_scr_flags()) { + if (sdio_.get_flag(Status_Flags::FLAG_RXDTVAL)) { + *(temp_scr + index_scr) = sdio_.read_fifo_word(); + ++index_scr; + } + } + + if (sdio_.get_flag(Status_Flags::FLAG_DTTMOUT)) { + sdio_.clear_flag(Clear_Flags::FLAG_DTTMOUTC); + return SDIO_Error_Type::DATA_TIMEOUT; + } else if (sdio_.get_flag(Status_Flags::FLAG_DTCRCERR)) { + sdio_.clear_flag(Clear_Flags::FLAG_DTCRCERRC); + return SDIO_Error_Type::DATA_CRC_ERROR; + } else if (sdio_.get_flag(Status_Flags::FLAG_RXORE)) { + sdio_.clear_flag(Clear_Flags::FLAG_RXOREC); + return SDIO_Error_Type::RX_FIFO_OVERRUN; + } + + sdio_.clear_multiple_interrupt_flags(clear_data_flags); + + constexpr uint32_t Zero_Seven = (0xFFU << 0U); + constexpr uint32_t Eight_Fifteen = (0xFFU << 8U); + constexpr uint32_t Sixteen_Twentythree = (0xFFU << 16U); + constexpr uint32_t TwentyFour_Thirtyone = (0xFFU << 24U); + + // adjust SCR value + *src_data = ((temp_scr[1] & Zero_Seven) << 24U) | ((temp_scr[1] & Eight_Fifteen) << 8U) | + ((temp_scr[1] & Sixteen_Twentythree) >> 8U) | ((temp_scr[1] & TwentyFour_Thirtyone) >> 24U); + + src_data = src_data + 1U; + *src_data = ((temp_scr[0] & Zero_Seven) << 24U) | ((temp_scr[0] & Eight_Fifteen) << 8U) | + ((temp_scr[0] & Sixteen_Twentythree) >> 8U) | ((temp_scr[0] & TwentyFour_Thirtyone) >> 24U); + + return SDIO_Error_Type::OK; +} + +// DMA for rx/tx is always DMA1 channel 3 +void CardDMA::set_dma_parameters(uint8_t* buf, uint32_t count, bool is_write) { + constexpr uint32_t flag_bits = (1U << static_cast(dma::INTF_Bits::GIF3)); + + dma_.clear_flags(flag_bits); + + // Disable and reset DMA + dma_.set_channel_enable(false); + dma_.clear_channel(); + + dma_.init({ + count, + static_cast(reinterpret_cast(buf)), + static_cast(reinterpret_cast(sdio_.reg_address(SDIO_Regs::FIFO))), + dma::Bit_Width::WIDTH_32BIT, + dma::Bit_Width::WIDTH_32BIT, + dma::Increase_Mode::INCREASE_DISABLE, + dma::Increase_Mode::INCREASE_ENABLE, + dma::Channel_Priority::MEDIUM_PRIORITY, + is_write ? dma::Transfer_Direction::M2P : dma::Transfer_Direction::P2M + }); + + dma_.set_memory_to_memory_enable(false); + dma_.set_circulation_mode_enable(false); + + // Enable DMA interrupts for transfer complete and error + dma_.set_interrupt_enable(dma::Interrupt_Type::INTR_FTFIE, true); + dma_.set_interrupt_enable(dma::Interrupt_Type::INTR_ERRIE, true); + + // Start the DMA channel + dma_.set_channel_enable(true); +} + +SDIO_Error_Type CardDMA::wait_for_card_ready() { + volatile uint32_t timeout = 0x00FFFFFFU; + uint32_t response = sdio_.get_response(Response_Type::RESPONSE0); + + while (((response & static_cast(R1_Status::READY_FOR_DATA)) == 0U) && (timeout != 0U)) { + // Continue to send CMD13 to poll the state of card until buffer empty or timeout + timeout = timeout - 1U; + // CMD13 (SEND_STATUS) + if (send_command_and_check(Command_Index::CMD13, static_cast(sdcard_rca_ << RCA_Shift), + Command_Response::RSP_SHORT, Wait_Type::WT_NONE, [this, cmd = Command_Index::CMD13]() { + return get_r1_result(cmd); + }) != SDIO_Error_Type::OK) { + return SDIO_Error_Type::CMD13_FAILED; + } + response = sdio_.get_response(Response_Type::RESPONSE0); + } + + return (timeout == 0U) ? SDIO_Error_Type::ERROR : SDIO_Error_Type::OK; +} + +} // namespace sdio + +sdio::CardDMA& CardDMA_I = sdio::CardDMA::get_instance(); + +#endif // ARDUINO_ARCH_MFL diff --git a/Marlin/src/HAL/GD32_MFL/SDCard.h b/Marlin/src/HAL/GD32_MFL/SDCard.h new file mode 100644 index 0000000000..b14063b69f --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/SDCard.h @@ -0,0 +1,214 @@ +// +// MFL gd32f30x SDCARD using DMA through SDIO in C++ +// +// Copyright (C) 2025 B. Mourit +// +// This software is free software: you can redistribute it and/or modify it under the terms of the +// GNU Lesser General Public License as published by the Free Software Foundation, +// either version 3 of the License, or (at your option) any later version. +// +// This software 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 Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public License along with this software. +// If not, see . +// +#pragma once + +#include "../../inc/MarlinConfig.h" + +#include "SDIO.hpp" + +namespace sdio { + +class DMA; + +class CardDMA { +public: + static CardDMA& get_instance(); + + SDIO_Error_Type init(); + SDIO_Error_Type card_init(); + SDIO_Error_Type begin_startup_procedure(); + void begin_shutdown_procedure(); + // Configuration + SDIO_Error_Type set_hardware_bus_width(Bus_Width width); + // Main read/write functions for single and multiblock transfers + SDIO_Error_Type read(uint8_t* buf, uint32_t address, uint32_t count); + SDIO_Error_Type write(uint8_t* buf, uint32_t address, uint32_t count); + // DMA transfers + // Other card functions + SDIO_Error_Type erase(uint32_t address_start, uint32_t address_end); + // Interrupt handler + void handle_interrupts(); + // Card select + SDIO_Error_Type select_deselect(); + + SDIO_Error_Type get_card_interface_status(uint32_t* status); + SDIO_Error_Type get_sdcard_status(uint32_t* status); + + void check_dma_complete(); + SDIO_Error_Type stop_transfer(); + + Transfer_State get_transfer_state(); + uint32_t get_card_capacity() const; + + SDIO_Error_Type send_bus_width_command(uint32_t width_value); + + SDIO_Error_Type get_card_specific_data(Card_Info* info); + constexpr Block_Size get_data_block_size_index(uint16_t size); + + SDIO_Error_Type get_card_state(Card_State* card_state); + SDIO_Error_Type check_sdio_status(Command_Index index = Command_Index::INVALID, bool check_index = false, bool ignore_crc = false); + + // DMA configuration + void set_dma_parameters(uint8_t* buf, uint32_t count, bool is_write); + + // SDIO configuration + void sdio_configure(const SDIO_Config config) { sdio_.init(config); } + + // Varaible stored parameters + SDIO_Error_Type get_scr(uint16_t rca, uint32_t* scr); + SDIO_Error_Type store_cid(); + SDIO_Error_Type store_csd(); + + // Accessor methods + SDIO_Config& get_config() { return config_; } + dma::DMA& get_dma_instance() { return dma_; } + void set_data_end_interrupt() { sdio_.set_interrupt_enable(Interrupt_Type::DTENDIE, true); } + void set_sdio_dma_enable(bool enable) { sdio_.set_dma_enable(enable); } + bool get_is_sdio_rx() { return is_rx_; } + void clear_sdio_data_flags() { sdio_.clear_multiple_interrupt_flags(clear_data_flags); } + void clear_sdio_cmd_flags() { sdio_.clear_multiple_interrupt_flags(clear_command_flags); } + void clear_sdio_common_flags() { sdio_.clear_multiple_interrupt_flags(clear_common_flags); } + Operational_State get_state() { return current_state_; } + void set_state(Operational_State state) { current_state_ = state; } + void set_transfer_end(bool value) { transfer_end_ = value; } + void set_transfer_error(SDIO_Error_Type error) { transfer_error_ = error; } + + inline SDIO_Error_Type set_desired_clock(uint32_t desired_clock, bool wide_bus, bool low_power) { + sdio_.init({ + desired_clock, + Clock_Edge::RISING_EDGE, + wide_bus ? Bus_Width::WIDTH_4BIT : Bus_Width::WIDTH_1BIT, + false, + low_power, + false + }); + sync_domains(); + desired_clock_ = desired_clock; + + return SDIO_Error_Type::OK; + } + +private: + CardDMA(); + + // Prevent copying or assigning + CardDMA(const CardDMA&) = delete; + CardDMA& operator=(const CardDMA&) = delete; + + // Helper function + SDIO_Error_Type wait_for_card_ready(); + + // Member variables + alignas(4) uint32_t sdcard_csd_[4]; + alignas(4) uint32_t sdcard_cid_[4]; + alignas(4) uint32_t sdcard_scr_[2]; + uint32_t desired_clock_; + uint32_t stop_condition_; + uint32_t total_bytes_; + uint32_t count_; + SDIO& sdio_; + SDIO_Config& config_; + const dma::DMA_Base dmaBase_; + const dma::DMA_Channel dmaChannel_; + dma::DMA& dma_; + uint16_t sdcard_rca_; + SDIO_Error_Type transfer_error_; + Interface_Version interface_version_; + Card_Type card_type_; + volatile bool transfer_end_; + volatile bool is_rx_; + volatile bool multiblock_; + volatile Operational_State current_state_; + + // Private helper methods + SDIO_Error_Type validate_voltage(); + SDIO_Error_Type get_r1_result(Command_Index index); + //SDIO_Error_Type get_r2_r3_result(); + SDIO_Error_Type get_r6_result(Command_Index index, uint16_t* rca); + SDIO_Error_Type get_r7_result(); + //SDIO_Error_Type get_r1_error_type(uint32_t response); + SDIO_Error_Type get_command_sent_result(); + + inline void sync_domains() { + delayMicroseconds(8); + } + + inline bool validate_transfer_params(uint32_t* buf, uint16_t size) { + if (buf == nullptr) return false; + // Size must be > 0, <= 2048 and power of 2 + if ((size == 0U) || (size > 2048U) || (size & (size - 1U))) { + return false; + } + return true; + } + + void process_sdsc_specific_csd(Card_Info* info, const uint8_t* csd_bytes) { + info->csd.device_size = (static_cast(csd_bytes[6] & 0x03U) << 10U) | + (static_cast(csd_bytes[7]) << 2U) | + (static_cast((csd_bytes[8] & 0xC0U) >> 6U)); + info->csd.device_size_multiplier = static_cast((csd_bytes[9] & 0x03U) << 1U | + (csd_bytes[10] & 0x80U) >> 7U); + + info->block_size = static_cast(1 << info->csd.read_block_length); + info->capacity = static_cast((info->csd.device_size + 1U) * + (1U << (info->csd.device_size_multiplier + 2U)) * + info->block_size); + } + + void process_sdhc_specific_csd(Card_Info* info, const uint8_t* csd_bytes) { + info->csd.device_size = static_cast((csd_bytes[7] & 0x3FU) << 16U) | + static_cast((csd_bytes[8]) << 8U) | + static_cast(csd_bytes[9]); + + info->block_size = BLOCK_SIZE; + info->capacity = static_cast((info->csd.device_size + 1U) * + BLOCK_SIZE * KILOBYTE); + } + + void process_common_csd_tail(Card_Info* info, const uint8_t* csd_bytes) { + info->csd.sector_size = static_cast(((csd_bytes[9] & 0x3FU) << 1U) | + (csd_bytes[10] & 0x80U) >> 7U); + info->csd.speed_factor = static_cast((csd_bytes[11] & 0x1CU) >> 2U); + info->csd.write_block_length = static_cast(((csd_bytes[11] & 0x03U) << 2U) | + ((csd_bytes[12] & 0xC0U) >> 6U)); + info->csd.checksum = static_cast((csd_bytes[15] & 0xFEU) >> 1U); + } + + inline void disable_all_interrupts() { + sdio_.set_interrupt_enable(Interrupt_Type::DTCRCERRIE, false); + sdio_.set_interrupt_enable(Interrupt_Type::DTTMOUTIE, false); + sdio_.set_interrupt_enable(Interrupt_Type::DTENDIE, false); + sdio_.set_interrupt_enable(Interrupt_Type::STBITEIE, false); + sdio_.set_interrupt_enable(Interrupt_Type::TFHIE, false); + sdio_.set_interrupt_enable(Interrupt_Type::RFHIE, false); + sdio_.set_interrupt_enable(Interrupt_Type::TXUREIE, false); + sdio_.set_interrupt_enable(Interrupt_Type::RXOREIE, false); + } + + template + inline SDIO_Error_Type send_command_and_check(Command_Index command, uint32_t argument, + Command_Response response, Wait_Type type, CheckFunc check_result) { + sdio_.set_command_state_machine(command, argument, response, type); + sync_domains(); + sdio_.set_command_state_machine_enable(true); + return check_result(); + } +}; + +} // namespace sdio + +extern sdio::CardDMA& CardDMA_I; diff --git a/Marlin/src/HAL/GD32_MFL/Servo.cpp b/Marlin/src/HAL/GD32_MFL/Servo.cpp new file mode 100644 index 0000000000..d5f8533544 --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/Servo.cpp @@ -0,0 +1,122 @@ +/** + * 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 . + * + */ +#include "../platforms.h" + +#ifdef ARDUINO_ARCH_MFL + +#include "../../inc/MarlinConfig.h" + +#if HAS_SERVOS + +#include "Servo.h" + +static uint_fast8_t servoCount = 0; +static libServo* servos[NUM_SERVOS] = {0}; +constexpr millis_t servoDelay[] = SERVO_DELAY; +static_assert(COUNT(servoDelay) == NUM_SERVOS, "SERVO_DELAY must be an array NUM_SERVOS long."); + +// Initialize to the default timer priority. This will be overridden by a call from timers.cpp. +// This allows all timer interrupt priorities to be managed from a single location in the HAL. +static uint32_t servo_interrupt_priority = NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 12, 0); + +// This must be called after the MFL Servo class has initialized the timer. +// To be safe this is currently called after every call to attach(). +static void fixServoTimerInterruptPriority() { + NVIC_SetPriority(getTimerUpIRQ(TIMER_SERVO), servo_interrupt_priority); +} + +// Default constructor for libServo class. +// Initializes the servo delay, pause state, and pause value. +// Registers the servo instance in the servos array. +libServo::libServo() : delay(servoDelay[servoCount]), + was_attached_before_pause(false), + value_before_pause(0) { + servos[servoCount++] = this; +} + +// Attaches a servo to a specified pin. +int8_t libServo::attach(const int pin) { + if (servoCount >= MAX_SERVOS) return -1; + if (pin > 0) servo_pin = pin; + auto result = mflServo.attach(servo_pin); + fixServoTimerInterruptPriority(); + return result; +} + +// Attaches a servo to a specified pin with minimum and maximum pulse widths. +int8_t libServo::attach(const int pin, const int min, const int max) { + if (servoCount >= MAX_SERVOS) return -1; + if (pin > 0) servo_pin = pin; + auto result = mflServo.attach(servo_pin, min, max); + fixServoTimerInterruptPriority(); + return result; +} + +// Moves the servo to a specified position. +void libServo::move(const int value) { + if (attach(0) >= 0) { + mflServo.write(value); + safe_delay(delay); + TERN_(DEACTIVATE_SERVOS_AFTER_MOVE, detach()); + } +} + +// Pause the servo by detaching it and storing its current state. +void libServo::pause() { + was_attached_before_pause = mflServo.attached(); + if (was_attached_before_pause) { + value_before_pause = mflServo.read(); + mflServo.detach(); + } +} + +// Resume a previously paused servo. +// If the servo was attached before the pause, this function re-attaches +// the servo and moves it to the position it was in before the pause. +void libServo::resume() { + if (was_attached_before_pause) { + attach(); + move(value_before_pause); + } +} + +// Pause all servos by stopping their timers. +void libServo::pause_all_servos() { + for (auto& servo : servos) + if (servo) servo->pause(); +} + +// Resume all paused servos by starting their timers. +void libServo::resume_all_servos() { + for (auto& servo : servos) + if (servo) servo->resume(); +} + +// Set the interrupt priority for the servo. +// @param preemptPriority The preempt priority level. +// @param subPriority The sub priority level. +void libServo::setInterruptPriority(uint32_t preemptPriority, uint32_t subPriority) { + servo_interrupt_priority = NVIC_EncodePriority(NVIC_GetPriorityGrouping(), preemptPriority, subPriority); +} + +#endif // HAS_SERVOS +#endif // ARDUINO_ARCH_MFL diff --git a/Marlin/src/HAL/GD32_MFL/Servo.h b/Marlin/src/HAL/GD32_MFL/Servo.h new file mode 100644 index 0000000000..80cff46ff8 --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/Servo.h @@ -0,0 +1,56 @@ +/** + * 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 + +#include + +#include "../../core/millis_t.h" + +// Inherit and expand on the official library +class libServo { +public: + libServo(); + + int8_t attach(const int pin = 0); // pin == 0 uses value from previous call + int8_t attach(const int pin, const int min, const int max); + void detach() { mflServo.detach(); } + + int read() { return mflServo.read(); } + void move(const int value); + + void pause(); + void resume(); + + static void pause_all_servos(); + static void resume_all_servos(); + + static void setInterruptPriority(uint32_t preemptPriority, uint32_t subPriority); + +private: + Servo mflServo; + + int servoPin = 0; + millis_t delay = 0; + + bool was_attached_before_pause; + int value_before_pause; +}; diff --git a/Marlin/src/HAL/GD32_MFL/dogm/u8g_com_mfl_swspi.cpp b/Marlin/src/HAL/GD32_MFL/dogm/u8g_com_mfl_swspi.cpp new file mode 100644 index 0000000000..b36cbfe44d --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/dogm/u8g_com_mfl_swspi.cpp @@ -0,0 +1,129 @@ +/** + * 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 / Ryan Power + * + * 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 . + * + */ + +#ifdef ARDUINO_ARCH_MFL + +#include "../../../inc/MarlinConfig.h" + +#if ALL(HAS_MARLINUI_U8GLIB, FORCE_SOFT_SPI) + +#include +#include "../../shared/HAL_SPI.h" + +#define nop asm volatile ("\tnop\n") + +static inline uint8_t swSpiTransfer_mode_0(uint8_t b) { + for (uint8_t i = 0; i < 8; ++i) { + const uint8_t state = (b & 0x80) ? HIGH : LOW; + WRITE(DOGLCD_SCK, HIGH); + WRITE(DOGLCD_MOSI, state); + b <<= 1; + WRITE(DOGLCD_SCK, LOW); + } + return b; +} + +static inline uint8_t swSpiTransfer_mode_3(uint8_t b) { + for (uint8_t i = 0; i < 8; ++i) { + const uint8_t state = (b & 0x80) ? HIGH : LOW; + WRITE(DOGLCD_SCK, LOW); + WRITE(DOGLCD_MOSI, state); + b <<= 1; + WRITE(DOGLCD_SCK, HIGH); + } + return b; +} + +static void u8g_sw_spi_shift_out(uint8_t val) { + #if U8G_SPI_USE_MODE_3 + swSpiTransfer_mode_3(val); + #else + swSpiTransfer_mode_0(val); + #endif +} + +static void swSpiInit() { + #if PIN_EXISTS(LCD_RESET) + SET_OUTPUT(LCD_RESET_PIN); + #endif + SET_OUTPUT(DOGLCD_A0); + OUT_WRITE(DOGLCD_SCK, LOW); + OUT_WRITE(DOGLCD_MOSI, LOW); + OUT_WRITE(DOGLCD_CS, HIGH); +} + +uint8_t u8g_com_HAL_MFL_sw_spi_fn(u8g_t *u8g, uint8_t msg, uint8_t arg_val, void *arg_ptr) { + switch (msg) { + case U8G_COM_MSG_INIT: + swSpiInit(); + break; + case U8G_COM_MSG_STOP: + break; + case U8G_COM_MSG_RESET: + #if PIN_EXISTS(LCD_RESET) + WRITE(LCD_RESET_PIN, arg_val); + #endif + break; + case U8G_COM_MSG_CHIP_SELECT: + #if U8G_SPI_USE_MODE_3 // This LCD SPI is running mode 3 while SD card is running mode 0 + if (arg_val) { // SCK idle state needs to be set to the proper idle state before + // the next chip select goes active + WRITE(DOGLCD_SCK, HIGH); // Set SCK to mode 3 idle state before CS goes active + WRITE(DOGLCD_CS, LOW); + nop; // Hold SCK high for a few ns + nop; + } + else { + WRITE(DOGLCD_CS, HIGH); + WRITE(DOGLCD_SCK, LOW); // Set SCK to mode 0 idle state after CS goes inactive + } + #else + WRITE(DOGLCD_CS, !arg_val); + #endif + break; + case U8G_COM_MSG_WRITE_BYTE: + u8g_sw_spi_shift_out(arg_val); + break; + case U8G_COM_MSG_WRITE_SEQ: { + uint8_t* ptr = (uint8_t*)arg_ptr; + while (arg_val > 0) { + u8g_sw_spi_shift_out(*ptr++); + arg_val--; + } + } break; + case U8G_COM_MSG_WRITE_SEQ_P: { + uint8_t* ptr = (uint8_t*)arg_ptr; + while (arg_val > 0) { + u8g_sw_spi_shift_out(u8g_pgm_read(ptr)); + ptr++; + arg_val--; + } + } break; + case U8G_COM_MSG_ADDRESS: // Define cmd (arg_val = 0) or data mode (arg_val = 1) + WRITE(DOGLCD_A0, arg_val); + break; + } + return 1; +} + +#endif // HAS_MARLINUI_U8GLIB && FORCE_SOFT_SPI +#endif // ARDUINO_ARCH_MFL diff --git a/Marlin/src/HAL/GD32_MFL/eeprom_bl24cxx.cpp b/Marlin/src/HAL/GD32_MFL/eeprom_bl24cxx.cpp new file mode 100644 index 0000000000..2d3329c7f6 --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/eeprom_bl24cxx.cpp @@ -0,0 +1,93 @@ +/** + * 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 . + * + */ + +/** + * PersistentStore for Arduino-style EEPROM interface + * with simple implementations supplied by Marlin. + */ + +#include "../platforms.h" + +#ifdef ARDUINO_ARCH_MFL + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(IIC_BL24CXX_EEPROM) + +#include "../shared/eeprom_if.h" +#include "../shared/eeprom_api.h" + +#ifndef MARLIN_EEPROM_SIZE + #error "MARLIN_EEPROM_SIZE is required for IIC_BL24CXX_EEPROM." +#endif + +size_t PersistentStore::capacity() { + return MARLIN_EEPROM_SIZE - eeprom_exclude_size; +} + +bool PersistentStore::access_start() { + eeprom_init(); + return true; +} + +bool PersistentStore::access_finish() { + return true; +} + +bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { + uint16_t written = 0; + while (size--) { + uint8_t v = *value; + uint8_t * const p = (uint8_t * const)REAL_EEPROM_ADDR(pos); + // EPROM has only ~100,000 write cycles, + // so only write bytes that have changed! + if (v != eeprom_read_byte(p)) { + eeprom_write_byte(p, v); + if (++written & 0x7F) delay(4); else safe_delay(4); + if (eeprom_read_byte(p) != v) { + SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE); + return true; + } + } + + crc16(crc, &v, 1); + pos++; + value++; + } + + return false; +} + +bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t *crc, const bool writing/*=true*/) { + do { + const uint8_t c = eeprom_read_byte((uint8_t*)REAL_EEPROM_ADDR(pos)); + if (writing) *value = c; + crc16(crc, &c, 1); + pos++; + value++; + } while (--size); + + return false; +} + +#endif // IIC_BL24CXX_EEPROM +#endif // ARDUINO_ARCH_MFL diff --git a/Marlin/src/HAL/GD32_MFL/eeprom_if_iic.cpp b/Marlin/src/HAL/GD32_MFL/eeprom_if_iic.cpp new file mode 100644 index 0000000000..96eebea122 --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/eeprom_if_iic.cpp @@ -0,0 +1,54 @@ +/** + * 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 . + * + */ + +/** + * Platform-independent Arduino functions for I2C EEPROM. + * Enable USE_SHARED_EEPROM if not supplied by the framework. + */ + +#include "../platforms.h" + +#ifdef ARDUINO_ARCH_MFL + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(IIC_BL24CXX_EEPROM) + +#include "../../libs/BL24CXX.h" +#include "../shared/eeprom_if.h" + +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); +} + +uint8_t eeprom_read_byte(uint8_t *pos) { + const unsigned eeprom_address = (unsigned)pos; + return BL24CXX::readOneByte(eeprom_address); +} + +#endif // IIC_BL24CXX_EEPROM +#endif // ARDUINO_ARCH_MFL diff --git a/Marlin/src/HAL/GD32_MFL/eeprom_wired.cpp b/Marlin/src/HAL/GD32_MFL/eeprom_wired.cpp new file mode 100644 index 0000000000..58a6f85e7f --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/eeprom_wired.cpp @@ -0,0 +1,96 @@ +/** + * 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 . + * + */ +#include "../platforms.h" + +#ifdef ARDUINO_ARCH_MFL + +#include "../../inc/MarlinConfig.h" + +#if USE_WIRED_EEPROM + +/** + * PersistentStore for Arduino-style EEPROM interface + * with simple implementations supplied by Marlin. + */ + +#include "../shared/eeprom_if.h" +#include "../shared/eeprom_api.h" + +#ifndef MARLIN_EEPROM_SIZE + #define MARLIN_EEPROM_SIZE size_t(E2END + 1) +#endif + +size_t PersistentStore::capacity() { + return MARLIN_EEPROM_SIZE - eeprom_exclude_size; +} + +bool PersistentStore::access_start() { + eeprom_init(); + return true; +} + +bool PersistentStore::access_finish() { + return true; +} + +bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { + uint16_t written = 0; + while (size--) { + uint8_t v = *value; + uint8_t * const p = (uint8_t * const)REAL_EEPROM_ADDR(pos); + // EEPROM has only ~100,000 write cycles, + // so only write bytes that have changed! + if (v != eeprom_read_byte(p)) { + eeprom_write_byte(p, v); + // Avoid triggering watchdog during long EEPROM writes + if (++written & 0x7F) + delay(2); + else + safe_delay(2); + if (eeprom_read_byte(p) != v) { + SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE); + return true; + } + } + crc16(crc, &v, 1); + pos++; + value++; + } + + return false; +} + +bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t *crc, const bool writing/*=true*/) { + do { + const uint8_t c = eeprom_read_byte((uint8_t*)REAL_EEPROM_ADDR(pos)); + if (writing) + *value = c; + crc16(crc, &c, 1); + pos++; + value++; + } while (--size); + + return false; +} + +#endif // USE_WIRED_EEPROM +#endif // ARDUINO_ARCH_MFL diff --git a/Marlin/src/HAL/GD32_MFL/endstop_interrupts.h b/Marlin/src/HAL/GD32_MFL/endstop_interrupts.h new file mode 100644 index 0000000000..175dec3959 --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/endstop_interrupts.h @@ -0,0 +1,61 @@ +/** + * 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 + +#include "../../module/endstops.h" + +// One ISR for all EXT-Interrupts +void endstop_ISR() { endstops.update(); } + +void setup_endstop_interrupts() { + #define _ATTACH(P) attachInterrupt(P, endstop_ISR, CHANGE) + TERN_(USE_X_MAX, _ATTACH(X_MAX_PIN)); + TERN_(USE_X_MIN, _ATTACH(X_MIN_PIN)); + TERN_(USE_Y_MAX, _ATTACH(Y_MAX_PIN)); + TERN_(USE_Y_MIN, _ATTACH(Y_MIN_PIN)); + TERN_(USE_Z_MAX, _ATTACH(Z_MAX_PIN)); + TERN_(USE_Z_MIN, _ATTACH(Z_MIN_PIN)); + TERN_(USE_X2_MAX, _ATTACH(X2_MAX_PIN)); + TERN_(USE_X2_MIN, _ATTACH(X2_MIN_PIN)); + TERN_(USE_Y2_MAX, _ATTACH(Y2_MAX_PIN)); + TERN_(USE_Y2_MIN, _ATTACH(Y2_MIN_PIN)); + TERN_(USE_Z2_MAX, _ATTACH(Z2_MAX_PIN)); + TERN_(USE_Z2_MIN, _ATTACH(Z2_MIN_PIN)); + TERN_(USE_Z3_MAX, _ATTACH(Z3_MAX_PIN)); + TERN_(USE_Z3_MIN, _ATTACH(Z3_MIN_PIN)); + TERN_(USE_Z4_MAX, _ATTACH(Z4_MAX_PIN)); + TERN_(USE_Z4_MIN, _ATTACH(Z4_MIN_PIN)); + TERN_(USE_Z_MIN_PROBE, _ATTACH(Z_MIN_PROBE_PIN)); + TERN_(USE_CALIBRATION, _ATTACH(CALIBRATION_PIN)); + TERN_(USE_I_MAX, _ATTACH(I_MAX_PIN)); + TERN_(USE_I_MIN, _ATTACH(I_MIN_PIN)); + TERN_(USE_J_MAX, _ATTACH(J_MAX_PIN)); + TERN_(USE_J_MIN, _ATTACH(J_MIN_PIN)); + TERN_(USE_K_MAX, _ATTACH(K_MAX_PIN)); + TERN_(USE_K_MIN, _ATTACH(K_MIN_PIN)); + TERN_(USE_U_MAX, _ATTACH(U_MAX_PIN)); + TERN_(USE_U_MIN, _ATTACH(U_MIN_PIN)); + TERN_(USE_V_MAX, _ATTACH(V_MAX_PIN)); + TERN_(USE_V_MIN, _ATTACH(V_MIN_PIN)); + TERN_(USE_W_MAX, _ATTACH(W_MAX_PIN)); + TERN_(USE_W_MIN, _ATTACH(W_MIN_PIN)); +} diff --git a/Marlin/src/HAL/GD32_MFL/fast_pwm.cpp b/Marlin/src/HAL/GD32_MFL/fast_pwm.cpp new file mode 100644 index 0000000000..9fba673efc --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/fast_pwm.cpp @@ -0,0 +1,97 @@ +/** + * 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 . + * + */ + +#include "../platforms.h" + +#ifdef ARDUINO_ARCH_MFL + +#include "../../inc/MarlinConfig.h" + +#include +#include +#include "timers.h" + +static uint16_t timer_frequency[TIMER_COUNT]; + +void MarlinHAL::set_pwm_duty(const pin_t pin, const uint16_t value, const uint16_t scale, const bool invert) { + // Calculate duty cycle based on inversion flag + const uint16_t duty = invert ? scale - value : value; + + // Check if the pin supports PWM + if (PWM_PIN(pin)) { + // Get the timer peripheral base associated with the pin + const auto timer_base = getPinOpsPeripheralBase(TIMER_PinOps, static_cast(pin)); + + // Initialize the timer instance + auto& TimerInstance = GeneralTimer::get_instance(timer_base); + + // Get channel and previous channel mode + const auto channel = getPackedPinChannel(getPackedPinOps(TIMER_PinOps, static_cast(pin))); + const InputOutputMode previous = TimerInstance.getChannelMode(channel); + + if (timer_frequency[static_cast(timer_base)] == 0) { + set_pwm_frequency(pin, PWM_FREQUENCY); + } + + // Set the PWM duty cycle + TimerInstance.setCaptureCompare(channel, duty, CCFormat::B8); + + // Configure pin as PWM output + pinOpsPinout(TIMER_PinOps, static_cast(pin)); + + // Set channel mode if not already set and start timer + if (previous != InputOutputMode::PWM0) { + TimerInstance.setChannelMode(channel, InputOutputMode::PWM0, static_cast(pin)); + TimerInstance.start(); + } + } else { + pinMode(pin, OUTPUT); + digitalWrite(pin, duty < scale / 2 ? LOW : HIGH); + } +} + +void MarlinHAL::set_pwm_frequency(const pin_t pin, const uint16_t f_desired) { + // Check if the pin supports PWM + if (!PWM_PIN(pin)) return; + + // Get the timer peripheral base associated with the pin + const auto timer_base = getPinOpsPeripheralBase(TIMER_PinOps, static_cast(pin)); + + // Guard against modifying protected timers + #ifdef STEP_TIMER + if (timer_base == static_cast(STEP_TIMER)) return; + #endif + #ifdef TEMP_TIMER + if (timer_base == static_cast(TEMP_TIMER)) return; + #endif + #if defined(PULSE_TIMER) && MF_TIMER_PULSE != MF_TIMER_STEP + if (timer_base == static_cast(PULSE_TIMER)) return; + #endif + + // Initialize the timer instance + auto& TimerInstance = GeneralTimer::get_instance(timer_base); + + TimerInstance.setRolloverValue(f_desired, TimerFormat::HERTZ); + timer_frequency[timer_base_to_index(timer_base)] = f_desired; +} + +#endif // ARDUINO_ARCH_MFL diff --git a/Marlin/src/HAL/GD32_MFL/fastio.h b/Marlin/src/HAL/GD32_MFL/fastio.h new file mode 100644 index 0000000000..8185be73a4 --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/fastio.h @@ -0,0 +1,82 @@ +/** + * 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 + +// Fast I/O interfaces for GD32F303RE + +#include +#include +#include + +static inline void fast_write_pin_wrapper(pin_size_t IO, bool V) { + if (V) gpio::fast_set_pin(getPortFromPin(IO), getPinInPort(IO)); + else gpio::fast_clear_pin(getPortFromPin(IO), getPinInPort(IO)); +} + +static inline bool fast_read_pin_wrapper(pin_size_t IO) { + return gpio::fast_read_pin(getPortFromPin(IO), getPinInPort(IO)); +} + +static inline void fast_toggle_pin_wrapper(pin_size_t IO) { + gpio::fast_toggle_pin(getPortFromPin(IO), getPinInPort(IO)); +} + +// ------------------------ +// Defines +// ------------------------ + +#ifndef PWM + #define PWM OUTPUT +#endif + +#define _WRITE(IO, V) fast_write_pin_wrapper(IO, V) +#define _READ(IO) fast_read_pin_wrapper(IO) +#define _TOGGLE(IO) fast_toggle_pin_wrapper(IO) + +#define _GET_MODE(IO) +#define _SET_MODE(IO, M) pinMode((IO), (M)) +#define _SET_OUTPUT(IO) pinMode((IO), OUTPUT) +#define _SET_OUTPUT_OD(IO) pinMode((IO), OUTPUT_OPEN_DRAIN) + +#define WRITE(IO, V) _WRITE((IO), (V)) +#define READ(IO) _READ(IO) +#define TOGGLE(IO) _TOGGLE(IO) + +#define OUT_WRITE(IO, V) do { _SET_OUTPUT(IO); WRITE((IO), (V)); } while (0) +#define OUT_WRITE_OD(IO, V) do { _SET_OUTPUT_OD(IO); WRITE((IO), (V)); } while (0) + +#define SET_INPUT(IO) _SET_MODE((IO), INPUT) +#define SET_INPUT_PULLUP(IO) _SET_MODE((IO), INPUT_PULLUP) +#define SET_INPUT_PULLDOWN(IO) _SET_MODE((IO), INPUT_PULLDOWN) +#define SET_OUTPUT(IO) OUT_WRITE((IO), LOW) +#define SET_OUTPUT_OD(IO) OUT_WRITE_OD((IO), LOW) +#define SET_PWM(IO) _SET_MODE((IO), PWM) + +#define IS_INPUT(IO) +#define IS_OUTPUT(IO) + +#define PWM_PIN(P) isPinInPinOps(TIMER_PinOps, P) +#define NO_COMPILE_TIME_PWM + +// Wrappers for digitalRead and digitalWrite +#define extDigitalRead(IO) digitalRead(IO) +#define extDigitalWrite(IO, V) digitalWrite((IO), (V)) diff --git a/Marlin/src/HAL/GD32_MFL/inc/Conditionals_LCD.h b/Marlin/src/HAL/GD32_MFL/inc/Conditionals_LCD.h new file mode 100644 index 0000000000..379ecfa7f0 --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/inc/Conditionals_LCD.h @@ -0,0 +1,26 @@ +/** + * 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 + +#if ALL(HAS_MARLINUI_U8GLIB, FORCE_SOFT_SPI) + #define U8G_SW_SPI_MFL 1 +#endif diff --git a/Marlin/src/HAL/GD32_MFL/inc/Conditionals_adv.h b/Marlin/src/HAL/GD32_MFL/inc/Conditionals_adv.h new file mode 100644 index 0000000000..6df84f6f92 --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/inc/Conditionals_adv.h @@ -0,0 +1,26 @@ +/** + * 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 + +#if ALL(HAS_MEDIA, USBD_USE_CDC_MSC) + #define HAS_SD_HOST_DRIVE 1 +#endif diff --git a/Marlin/src/HAL/GD32_MFL/inc/Conditionals_post.h b/Marlin/src/HAL/GD32_MFL/inc/Conditionals_post.h new file mode 100644 index 0000000000..a3db122682 --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/inc/Conditionals_post.h @@ -0,0 +1,29 @@ +/** + * 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 + +// If no real or emulated EEPROM selected, fall back to SD emulation +#if USE_FALLBACK_EEPROM + #define SDCARD_EEPROM_EMULATION +#elif ANY(I2C_EEPROM, SPI_EEPROM) + #define USE_SHARED_EEPROM 1 +#endif diff --git a/Marlin/src/HAL/GD32_MFL/inc/Conditionals_type.h b/Marlin/src/HAL/GD32_MFL/inc/Conditionals_type.h new file mode 100644 index 0000000000..92cc457df5 --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/inc/Conditionals_type.h @@ -0,0 +1,22 @@ +/** + * 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 diff --git a/Marlin/src/HAL/GD32_MFL/inc/SanityCheck.h b/Marlin/src/HAL/GD32_MFL/inc/SanityCheck.h new file mode 100644 index 0000000000..366765dcd5 --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/inc/SanityCheck.h @@ -0,0 +1,97 @@ +/** + * 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 + +// Test MFL GD32 specific configuration values for errors at compile-time. +#if ENABLED(SDCARD_EEPROM_EMULATION) && !HAS_MEDIA + #undef SDCARD_EEPROM_EMULATION // avoid additional error noise + #if USE_FALLBACK_EEPROM + #warning "EEPROM type not specified. Fallback is SDCARD_EEPROM_EMULATION." + #endif + #error "SDCARD_EEPROM_EMULATION requires SDSUPPORT. Enable SDSUPPORT or choose another EEPROM emulation." +#endif + +#if ENABLED(FLASH_EEPROM_LEVELING) + #error "FLASH_EEPROM_LEVELING is not supported on GD32." +#endif + +#if ENABLED(SERIAL_STATS_MAX_RX_QUEUED) + #error "SERIAL_STATS_MAX_RX_QUEUED is not supported on GD32." +#elif ENABLED(SERIAL_STATS_DROPPED_RX) + #error "SERIAL_STATS_DROPPED_RX is not supported on GD32." +#endif + +#if TEMP_SENSOR_SOC && defined(ATEMP) && TEMP_SOC_PIN != ATEMP + #error "TEMP_SENSOR_SOC requires 'TEMP_SOC_PIN ATEMP' on GD32" +#endif + +// Check for common serial pin conflicts +#define _CHECK_SERIAL_PIN(N) (( \ + BTN_EN1 == N || BTN_EN2 == N || DOGLCD_CS == N || HEATER_BED_PIN == N || FAN0_PIN == N || \ + SDIO_D2_PIN == N || SDIO_D3_PIN == N || SDIO_CK_PIN == N || SDIO_CMD_PIN == N || \ + Y_STEP_PIN == N || Y_ENABLE_PIN == N || E0_ENABLE_PIN == N || POWER_LOSS_PIN == N \ + )) + +#define CHECK_SERIAL_PIN(T, N) defined(UART##N##_##T##_PIN) && _CHECK_SERIAL_PIN(UART##N##_##T##_PIN) + +#if SERIAL_IN_USE(0) + #if CHECK_SERIAL_PIN(TX, 0) + #error "Serial Port 0 TX IO pins conflict with another pin on the board." + #endif + #if CHECK_SERIAL_PIN(RX, 0) + #error "Serial Port 0 RX IO pins conflict with another pin on the board." + #endif +#endif +#if SERIAL_IN_USE(1) + #if CHECK_SERIAL_PIN(TX, 1) + #error "Serial Port 1 TX IO pins conflict with another pin on the board." + #endif + #if CHECK_SERIAL_PIN(RX, 1) + #error "Serial Port 1 RX IO pins conflict with another pin on the board." + #endif +#endif +#if SERIAL_IN_USE(2) + #if CHECK_SERIAL_PIN(TX, 2) + #error "Serial Port 2 TX IO pins conflict with another pin on the board." + #endif + #if CHECK_SERIAL_PIN(RX, 2) + #error "Serial Port 2 RX IO pins conflict with another pin on the board." + #endif +#endif +#if SERIAL_IN_USE(3) + #if CHECK_SERIAL_PIN(TX, 3) + #error "Serial Port 3 TX IO pins conflict with another pin on the board." + #endif + #if CHECK_SERIAL_PIN(RX, 3) + #error "Serial Port 3 RX IO pins conflict with another pin on the board." + #endif +#endif +#if SERIAL_IN_USE(4) + #if CHECK_SERIAL_PIN(TX, 4) + #error "Serial Port 4 TX IO pins conflict with another pin on the board." + #endif + #if CHECK_SERIAL_PIN(RX, 4) + #error "Serial Port 4 RX IO pins conflict with another pin on the board." + #endif +#endif +#undef CHECK_SERIAL_PIN +#undef _CHECK_SERIAL_PIN diff --git a/Marlin/src/HAL/GD32_MFL/pinsDebug.h b/Marlin/src/HAL/GD32_MFL/pinsDebug.h new file mode 100644 index 0000000000..d3b3794df2 --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/pinsDebug.h @@ -0,0 +1,102 @@ +/** + * 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 + +/** + * Pins Debugging for GD32 + * + * - NUMBER_PINS_TOTAL + * - MULTI_NAME_PAD + * - getPinByIndex(index) + * - printPinNameByIndex(index) + * - getPinIsDigitalByIndex(index) + * - digitalPinToAnalogIndex(pin) + * - getValidPinMode(pin) + * - isValidPin(pin) + * - isAnalogPin(pin) + * - digitalRead_mod(pin) + * - pwm_status(pin) + * - printPinPWM(pin) + * - printPinPort(pin) + * - printPinNumber(pin) + * - printPinAnalog(pin) + */ + +#include "../../inc/MarlinConfig.h" +#include +#include +#include + +#ifndef TOTAL_PIN_COUNT + #error "Expected TOTAL_PIN_COUNT not found." +#endif + +#define NUM_DIGITAL_PINS TOTAL_PIN_COUNT +#define NUMBER_PINS_TOTAL TOTAL_PIN_COUNT + +#define getPinByIndex(x) pin_t(pin_array[x].pin) +#define isValidPin(P) WITHIN(P, 0, (NUM_DIGITAL_PINS - 1)) +#define digitalRead_mod(P) extDigitalRead(P) +#define printPinNumber(P) do { sprintf_P(buffer, PSTR("%3hd "), pin_t(P)); SERIAL_ECHO(buffer); } while (0) +#define printPinAnalog(P) do { sprintf_P(buffer, PSTR(" (A%2d) "), pin_t(getAdcChannelFromPin(P))); SERIAL_ECHO(buffer); } while (0) +#define printPinNameByIndex(x) do { sprintf_P(buffer, PSTR("%-" STRINGIFY(MAX_NAME_LENGTH) "s"), pin_array[x].name); SERIAL_ECHO(buffer); } while (0) + +#define MULTI_NAME_PAD 21 // Space needed to be pretty if not first name assigned to a pin + +#ifndef M43_NEVER_TOUCH + #define M43_NEVER_TOUCH(x) WITHIN(x, 9, 10) // SERIAL pins: PA9(TX) PA10(RX) +#endif + +bool isAnalogPin(const pin_t pin) { + if (!isValidPin(pin)) return false; + + if (getAdcChannel(pin) != adc::ADC_Channel::INVALID) { + auto& instance = gpio::GPIO::get_instance(getPortFromPin(pin)).value(); + return instance.get_pin_mode(getPinInPort(pin)) == gpio::Pin_Mode::ANALOG && !M43_NEVER_TOUCH(pin); + } + + return false; +} + +bool getValidPinMode(const pin_t pin) { + if (!isValidPin(pin)) return false; + + auto& instance = gpio::GPIO::get_instance(getPortFromPin(pin)).value(); + gpio::Pin_Mode mode = instance.get_pin_mode(getPinInPort(pin)); + + return mode != gpio::Pin_Mode::ANALOG && mode != gpio::Pin_Mode::INPUT_FLOATING && + mode != gpio::Pin_Mode::INPUT_PULLUP && mode != gpio::Pin_Mode::INPUT_PULLDOWN; +} + +bool getPinIsDigitalByIndex(const int16_t index) { + const pin_t pin = getPinByIndex(index); + return (!isAnalogPin(pin)); +} + +int8_t digitalPinToAnalogIndex(const pin_t pin) { + if (!isValidPin(pin) || !isAnalogPin(pin)) return -1; + return pin; // Analog and digital pin indexes are shared +} + +bool pwm_status(const pin_t pin) { return false; } +void printPinPWM(const pin_t pin) { /* TODO */ } +void printPinPort(const pin_t pin) { /* TODO */ } diff --git a/Marlin/src/HAL/GD32_MFL/sdio.cpp b/Marlin/src/HAL/GD32_MFL/sdio.cpp new file mode 100644 index 0000000000..4b6d75d74f --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/sdio.cpp @@ -0,0 +1,233 @@ +/** + * 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 . + * + */ + +#include "../platforms.h" + +#ifdef ARDUINO_ARCH_MFL + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(ONBOARD_SDIO) + +#include +#include +#include "SDCard.h" +#include "sdio.h" + +using namespace sdio; + +#define TARGET_CLOCK 6000000U +#define BLOCK_SIZE 512U +#define CARD_TIMEOUT 500 // ms +#define READ_RETRIES 3U + +inline constexpr uint32_t TARGET_SDIO_CLOCK = TARGET_CLOCK; +inline constexpr uint32_t SDIO_BLOCK_SIZE = BLOCK_SIZE; +inline constexpr uint32_t SD_TIMEOUT = CARD_TIMEOUT; +inline constexpr uint8_t SDIO_READ_RETRIES = READ_RETRIES; + +Card_State cardState = Card_State::READY; + +bool SDIO_SetBusWidth(Bus_Width width) { + return (CardDMA_I.set_hardware_bus_width(width) == SDIO_Error_Type::OK); +} + +void mfl_sdio_init() { + pinOpsPinout(SD_CMD_PinOps, static_cast(SDIO_CMD_PIN)); + pinOpsPinout(SD_CK_PinOps, static_cast(SDIO_CK_PIN)); + pinOpsPinout(SD_DATA0_PinOps, static_cast(SDIO_D0_PIN)); + pinOpsPinout(SD_DATA1_PinOps, static_cast(SDIO_D1_PIN)); + pinOpsPinout(SD_DATA2_PinOps, static_cast(SDIO_D2_PIN)); + pinOpsPinout(SD_DATA3_PinOps, static_cast(SDIO_D3_PIN)); + + NVIC_EnableIRQ(DMA1_Channel3_4_IRQn); + NVIC_EnableIRQ(SDIO_IRQn); +} + +bool SDIO_Init() { + SDIO_Error_Type result = SDIO_Error_Type::OK; + uint8_t retryCount = SDIO_READ_RETRIES; + + mfl_sdio_init(); + + uint8_t retries = retryCount; + for (;;) { + hal.watchdog_refresh(); + result = CardDMA_I.init(); + if (result == SDIO_Error_Type::OK) break; + if (!--retries) return false; + } + + CardDMA_I.set_desired_clock(TARGET_SDIO_CLOCK, false, false); + + retries = retryCount; + for (;;) { + hal.watchdog_refresh(); + if (SDIO_SetBusWidth(Bus_Width::WIDTH_4BIT)) break; + if (!--retries) break; + } + + CardDMA_I.set_desired_clock(TARGET_SDIO_CLOCK, true, true); + + // Fallback + if (!retries) { + mfl_sdio_init(); + retries = retryCount; + for (;;) { + hal.watchdog_refresh(); + result = CardDMA_I.init(); + if (result == SDIO_Error_Type::OK) break; + if (!--retries) return false; + } + CardDMA_I.set_desired_clock(TARGET_SDIO_CLOCK, false, true); + } + + return true; +} + +static bool SDIO_ReadWriteBlock_DMA(uint32_t block, const uint8_t* src, uint8_t* dst) { + hal.watchdog_refresh(); + SDIO_Error_Type result = SDIO_Error_Type::OK; + + // Write + if (src) { + result = CardDMA_I.write(reinterpret_cast(const_cast(src)), block, 1); + } + // Read + else { + result = CardDMA_I.read(dst, block, 1); + } + + if (result != SDIO_Error_Type::OK) { + return false; + } + + millis_t timeout = millis() + SD_TIMEOUT; + while (CardDMA_I.get_state() != sdio::Operational_State::READY) { + if (ELAPSED(millis(), timeout)) { + return false; + } + } + + CardDMA_I.check_dma_complete(); + + timeout = millis() + SD_TIMEOUT; + do { + result = CardDMA_I.get_card_state(&cardState); + if (ELAPSED(millis(), timeout)) { + return false; + } + } while (result == SDIO_Error_Type::OK && cardState != sdio::Card_State::TRANSFER); + + return true; +} + +bool SDIO_ReadBlock(uint32_t block, uint8_t* dst) { + // Check if the address is aligned to 4 bytes + if (reinterpret_cast(dst) & 0x03) { + return false; + } + + uint8_t retries = SDIO_READ_RETRIES; + while (retries--) { + if (SDIO_ReadWriteBlock_DMA(block, nullptr, dst)) { + return true; + } + } + + return false; +} + +bool SDIO_WriteBlock(uint32_t block, const uint8_t* src) { + // Check if the address is aligned to 4 bytes + if (reinterpret_cast(src) & 0x03) { + return false; + } + + uint8_t retries = SDIO_READ_RETRIES; + while (retries--) { + if (SDIO_ReadWriteBlock_DMA(block, src, nullptr)) { + return true; + delay(10); + } + } + + return false; +} + +bool SDIO_IsReady() { + return (CardDMA_I.get_state() == sdio::Operational_State::READY); +} + +uint32_t SDIO_GetCardSize() { + return CardDMA_I.get_card_capacity(); +} + +// DMA interrupt handler +void DMA1_IRQHandler() { + auto& dma_instance = CardDMA_I.get_dma_instance(); + bool is_receive = CardDMA_I.get_is_sdio_rx(); + + // Check for Transfer Complete Interrupt + if (dma_instance.get_interrupt_flag(dma::Interrupt_Flags::INTR_FLAG_FTFIF)) { + dma_instance.set_interrupt_enable(dma::Interrupt_Type::INTR_FTFIE, false); + dma_instance.set_interrupt_enable(dma::Interrupt_Type::INTR_ERRIE, false); + dma_instance.clear_interrupt_flag(dma::Interrupt_Flags::INTR_FLAG_FTFIF); + if (is_receive) { + CardDMA_I.set_sdio_dma_enable(false); + CardDMA_I.clear_sdio_data_flags(); + CardDMA_I.set_state(sdio::Operational_State::READY); + } else { + CardDMA_I.set_data_end_interrupt(); + } + // Signal that transfer is complete + CardDMA_I.set_transfer_end(true); + } + + else if (dma_instance.get_interrupt_flag(dma::Interrupt_Flags::INTR_FLAG_ERRIF)) { + dma_instance.set_interrupt_enable(dma::Interrupt_Type::INTR_HTFIE, false); + dma_instance.set_interrupt_enable(dma::Interrupt_Type::INTR_ERRIE, false); + dma_instance.set_interrupt_enable(dma::Interrupt_Type::INTR_FTFIE, false); + // Clear all flags + dma_instance.clear_interrupt_flag(dma::Interrupt_Flags::INTR_FLAG_GIF); + // Signal that an error occurred + CardDMA_I.set_transfer_error(SDIO_Error_Type::ERROR); + CardDMA_I.set_state(sdio::Operational_State::READY); + } +} + + +extern "C" { + + void SDIO_IRQHandler(void) { + CardDMA_I.handle_interrupts(); + } + + void DMA1_Channel3_4_IRQHandler(void) { + DMA1_IRQHandler(); + } + +} // extern "C" + + +#endif // ONBOARD_SDIO +#endif // ARDUINO_ARCH_MFL diff --git a/Marlin/src/HAL/GD32_MFL/sdio.h b/Marlin/src/HAL/GD32_MFL/sdio.h new file mode 100644 index 0000000000..b6b027ba77 --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/sdio.h @@ -0,0 +1,36 @@ +/** + * 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 + +#include +#include + +#define SDIO_D0_PIN PC8 +#define SDIO_D1_PIN PC9 +#define SDIO_D2_PIN PC10 +#define SDIO_D3_PIN PC11 +#define SDIO_CK_PIN PC12 +#define SDIO_CMD_PIN PD2 + +void sdio_mfl_init(); +bool SDIO_SetBusWidth(sdio::Bus_Width width); +void DMA1_IRQHandler(dma::DMA_Channel channel); diff --git a/Marlin/src/HAL/GD32_MFL/spi_pins.h b/Marlin/src/HAL/GD32_MFL/spi_pins.h new file mode 100644 index 0000000000..c8a5836838 --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/spi_pins.h @@ -0,0 +1,32 @@ +/** + * 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 + +// Define SPI Pins: SCK, MISO, MOSI +#ifndef SD_SCK_PIN + #define SD_SCK_PIN PIN_SPI_SCK +#endif +#ifndef SD_MISO_PIN + #define SD_MISO_PIN PIN_SPI_MISO +#endif +#ifndef SD_MOSI_PIN + #define SD_MOSI_PIN PIN_SPI_MOSI +#endif diff --git a/Marlin/src/HAL/GD32_MFL/temp_soc.h b/Marlin/src/HAL/GD32_MFL/temp_soc.h new file mode 100644 index 0000000000..eeb144c422 --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/temp_soc.h @@ -0,0 +1,29 @@ +/** + * 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 + +#define TS_TYPICAL_V 1.405 +#define TS_TYPICAL_TEMP 25 +#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) diff --git a/Marlin/src/HAL/GD32_MFL/timers.cpp b/Marlin/src/HAL/GD32_MFL/timers.cpp new file mode 100644 index 0000000000..bdcf5ed0ed --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/timers.cpp @@ -0,0 +1,233 @@ +/** + * 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 . + * + */ +#include "../platforms.h" + +#ifdef ARDUINO_ARCH_MFL + +#include "../../inc/MarlinConfig.h" +#include "timers.h" + +// ------------------------ +// Local defines +// ------------------------ + +#define SWSERIAL_TIMER_IRQ_PRIORITY_DEFAULT 1 // Requires tight bit timing to communicate reliably with TMC drivers +#define SERVO_TIMER_IRQ_PRIORITY_DEFAULT 1 // Requires tight PWM timing to control a BLTouch reliably +#define STEP_TIMER_IRQ_PRIORITY_DEFAULT 2 +#define TEMP_TIMER_IRQ_PRIORITY_DEFAULT 14 // Low priority avoids interference with other hardware and timers + +#ifndef TIMER_IRQ_PRIORITY + #define TIMER_IRQ_PRIORITY 12 +#endif + +#ifndef STEP_TIMER_IRQ_PRIORITY + #define STEP_TIMER_IRQ_PRIORITY STEP_TIMER_IRQ_PRIORITY_DEFAULT +#endif + +#ifndef TEMP_TIMER_IRQ_PRIORITY + #define TEMP_TIMER_IRQ_PRIORITY TEMP_TIMER_IRQ_PRIORITY_DEFAULT +#endif + +#if HAS_TMC_SW_SERIAL + #include + #ifndef SWSERIAL_TIMER_IRQ_PRIORITY + #define SWSERIAL_TIMER_IRQ_PRIORITY SWSERIAL_TIMER_IRQ_PRIORITY_DEFAULT + #endif +#endif + +#if HAS_SERVOS + #include "Servo.h" + #ifndef SERVO_TIMER_IRQ_PRIORITY + #define SERVO_TIMER_IRQ_PRIORITY SERVO_TIMER_IRQ_PRIORITY_DEFAULT + #endif +#endif + +#if ENABLED(SPEAKER) + // The MFL framework default timer priority is 12. The TEMP timer must have lower priority + // than this due to the long running temperature ISR, and STEP timer should higher priority. + #if !(TIMER_IRQ_PRIORITY > STEP_TIMER_IRQ_PRIORITY && TIMER_IRQ_PRIORITY < TEMP_TIMER_IRQ_PRIORITY) + #error "Default timer interrupt priority is unspecified or set to a value which may degrade performance." + #endif +#endif + +#ifndef HAL_TIMER_RATE + #define HAL_TIMER_RATE GetStepperTimerClkFreq() +#endif + +#ifndef STEP_TIMER + #define STEP_TIMER MF_TIMER_STEP +#endif +#ifndef TEMP_TIMER + #define TEMP_TIMER MF_TIMER_TEMP +#endif + +GeneralTimer& Step_Timer = GeneralTimer::get_instance(static_cast(STEP_TIMER)); +GeneralTimer& Temp_Timer = GeneralTimer::get_instance(static_cast(TEMP_TIMER)); + +bool is_step_timer_initialized = false; +bool is_temp_timer_initialized = false; + +// ------------------------ +// Public functions +// ------------------------ + +// Retrieves the clock frequency of the stepper timer +uint32_t GetStepperTimerClkFreq() { + return Step_Timer.getTimerClockFrequency(); +} + +/** + * @brief Starts a hardware timer + * + * If the timer is not already initialized, this function will initialize it with the given frequency. + * The timer is started immediately after initialization + * + * @param timer The timer base index to start + * @param frequency The frequency at which the timer should run + * @return None + */ +void HAL_timer_start(const uint8_t timer_number, const uint32_t frequency) { + if (HAL_timer_initialized(timer_number) || (timer_number != MF_TIMER_STEP && timer_number != MF_TIMER_TEMP)) + return; + + const bool is_step = (timer_number == MF_TIMER_STEP); + const uint8_t priority = is_step ? + static_cast(STEP_TIMER_IRQ_PRIORITY) : + static_cast(TEMP_TIMER_IRQ_PRIORITY); + + // Get the reference of the timer instance + GeneralTimer& timer = is_step ? Step_Timer : Temp_Timer; + + if (is_step) { + timer.setPrescaler(STEPPER_TIMER_PRESCALE); + timer.setRolloverValue(_MIN(static_cast(HAL_TIMER_TYPE_MAX), + (HAL_TIMER_RATE) / (STEPPER_TIMER_PRESCALE)), + TimerFormat::TICK); + is_step_timer_initialized = true; + } + else { + timer.setRolloverValue(frequency, TimerFormat::HERTZ); + is_temp_timer_initialized = true; + } + + timer.setAutoReloadEnable(false); + timer.setInterruptPriority(priority, 0U); + HAL_timer_enable_interrupt(timer_number); + timer.start(); +} + +/** + * @brief Enables the interrupt for the specified timer + * + * @param handle The timer handle for which to enable the interrupt + * @return None + */ +void HAL_timer_enable_interrupt(const uint8_t timer_number) { + if (!HAL_timer_initialized(timer_number)) return; + + GeneralTimer& timer = (timer_number == MF_TIMER_STEP) ? Step_Timer : Temp_Timer; + + if (timer_number == MF_TIMER_STEP && !timer.hasInterrupt()) + timer.attachInterrupt(Step_Handler); + else if (timer_number == MF_TIMER_TEMP && !timer.hasInterrupt()) + timer.attachInterrupt(Temp_Handler); +} + +/** + * @brief Disables the interrupt for the specified timer + * + * @param handle The timer handle for which to disable the interrupt + * @return None + */ +void HAL_timer_disable_interrupt(const uint8_t timer_number) { + if (!HAL_timer_initialized(timer_number)) return; + + GeneralTimer& timer = (timer_number == MF_TIMER_STEP) ? Step_Timer : Temp_Timer; + if (timer_number == MF_TIMER_STEP || timer_number == MF_TIMER_TEMP) + timer.detachInterrupt(); +} + +/** + * @brief Checks if the interrupt is enabled for the specified timer + * + * @param handle The timer handle to check + * @return True if the interrupt is enabled, false otherwise + */ +bool HAL_timer_interrupt_enabled(const uint8_t timer_number) { + if (!HAL_timer_initialized(timer_number)) return false; + + GeneralTimer& timer = (timer_number == MF_TIMER_STEP) ? Step_Timer : Temp_Timer; + return (timer_number == MF_TIMER_STEP || timer_number == MF_TIMER_TEMP) + ? timer.hasInterrupt() + : false; +} + +// Sets the interrupt priorities for timers used by TMC SW serial and servos. +void SetTimerInterruptPriorities() { + TERN_(HAS_TMC_SW_SERIAL, SoftwareSerial::setInterruptPriority(SWSERIAL_TIMER_IRQ_PRIORITY, 0)); + TERN_(HAS_SERVOS, libServo::setInterruptPriority(SERVO_TIMER_IRQ_PRIORITY, 0)); +} + +// ------------------------ +// Detect timer conflicts +// ------------------------ + +TERN_(SPEAKER, static constexpr timer::TIMER_Base timer_tone[] = {static_cast(TIMER_TONE)}); +TERN_(HAS_SERVOS, static constexpr timer::TIMER_Base timer_servo[] = {static_cast(TIMER_SERVO)}); + +enum TimerPurpose { + PURPOSE_TONE, + PURPOSE_SERVO, + PURPOSE_STEP, + PURPOSE_TEMP +}; + +// List of timers to check for conflicts +// Includes the timer purpose to ease debugging when evaluating at build-time +// This cannot yet account for timers used for PWM output, such as for fans +static constexpr struct { TimerPurpose p; int t; } timers_in_use[] = { + #if ENABLED(SPEAKER) + { PURPOSE_TONE, timer_base_to_index(timer_tone[0]) }, // Set in variant.h + #endif + #if HAS_SERVOS + { PURPOSE_SERVO, timer_base_to_index(timer_servo[0]) }, // Set in variant.h + #endif + { PURPOSE_STEP, MF_TIMER_STEP }, + { PURPOSE_TEMP, MF_TIMER_TEMP }, +}; + +// Verifies if there are any timer conflicts in the timers_in_use array +static constexpr bool verify_no_timer_conflicts() { + for (uint8_t i = 0; i < COUNT(timers_in_use); i++) + for (uint8_t j = i + 1; j < COUNT(timers_in_use); j++) + if (timers_in_use[i].t == timers_in_use[j].t) + return false; + + return true; +} + +// If this assertion fails at compile time, review the timers_in_use array. +// If default_envs is defined properly in platformio.ini, VSCode can evaluate the array +// when hovering over it, making it easy to identify the conflicting timers +static_assert(verify_no_timer_conflicts(), "One or more timer conflict detected. Examine \"timers_in_use\" to help identify conflict."); + +#endif // ARDUINO_ARCH_MFL diff --git a/Marlin/src/HAL/GD32_MFL/timers.h b/Marlin/src/HAL/GD32_MFL/timers.h new file mode 100644 index 0000000000..539f599a16 --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/timers.h @@ -0,0 +1,145 @@ +/** + * 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 + +#include "../../inc/MarlinConfig.h" + +#include + +// ------------------------ +// Defines +// ------------------------ + +// Timer configuration constants +#define STEPPER_TIMER_RATE 2000000 +#define TEMP_TIMER_FREQUENCY 1000 + +// Timer instance definitions +#define MF_TIMER_STEP 3 +#define MF_TIMER_TEMP 1 +#define MF_TIMER_PULSE MF_TIMER_STEP + +#define hal_timer_t uint32_t +#define HAL_TIMER_TYPE_MAX UINT16_MAX + +extern uint32_t GetStepperTimerClkFreq(); + +// Timer prescaler calculations +#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 PULSE_TIMER_RATE STEPPER_TIMER_RATE +#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US + +// Timer interrupt priorities +#define STEP_TIMER_IRQ_PRIORITY 2 +#define TEMP_TIMER_IRQ_PRIORITY 14 + +#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 DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_TEMP) + +extern void Step_Handler(); +extern void Temp_Handler(); + +#ifndef HAL_STEP_TIMER_ISR + #define HAL_STEP_TIMER_ISR() void Step_Handler() +#endif +#ifndef HAL_TEMP_TIMER_ISR + #define HAL_TEMP_TIMER_ISR() void Temp_Handler() +#endif + +extern GeneralTimer& Step_Timer; +extern GeneralTimer& Temp_Timer; + +extern bool is_step_timer_initialized; +extern bool is_temp_timer_initialized; + +// Build-time mapping between timer base and index. Used in timers.cpp and fast_pwm.cpp +static inline constexpr struct {timer::TIMER_Base base; uint8_t timer_number;} base_to_index[] = { + { timer::TIMER_Base::TIMER0_BASE, 0 }, + { timer::TIMER_Base::TIMER1_BASE, 1 }, + { timer::TIMER_Base::TIMER2_BASE, 2 }, + { timer::TIMER_Base::TIMER3_BASE, 3 }, + { timer::TIMER_Base::TIMER4_BASE, 4 }, + { timer::TIMER_Base::TIMER5_BASE, 5 }, + { timer::TIMER_Base::TIMER6_BASE, 6 }, + { timer::TIMER_Base::TIMER7_BASE, 7 } +}; + +// Converts a timer base to an integer timer index. +constexpr int timer_base_to_index(timer::TIMER_Base base) { + for (const auto& timer : base_to_index) { + if (timer.base == base) { + return static_cast(timer.timer_number); + } + } + return -1; +} + +// ------------------------ +// Public functions +// ------------------------ + +void HAL_timer_start(const uint8_t timer, const uint32_t frequency); +void HAL_timer_enable_interrupt(const uint8_t timer); +void HAL_timer_disable_interrupt(const uint8_t timer); +bool HAL_timer_interrupt_enabled(const uint8_t timer); + +// Configure timer priorities for peripherals such as Software Serial or Servos. +// Exposed here to allow all timer priority information to reside in timers.cpp +void SetTimerInterruptPriorities(); + +// FORCE_INLINE because these are used in performance-critical situations +FORCE_INLINE bool HAL_timer_initialized(const uint8_t timer_number) { + return (timer_number == MF_TIMER_STEP) ? is_step_timer_initialized : + (timer_number == MF_TIMER_TEMP) ? is_temp_timer_initialized : + false; +} + +FORCE_INLINE static hal_timer_t HAL_timer_get_count(const uint8_t timer_number) { + if (!HAL_timer_initialized(timer_number)) return 0U; + + GeneralTimer& timer = (timer_number == MF_TIMER_STEP) ? Step_Timer : Temp_Timer; + + return (timer_number == MF_TIMER_STEP || timer_number == MF_TIMER_TEMP) + ? timer.getCounter(TimerFormat::TICK) + : 0U; +} + +FORCE_INLINE static void HAL_timer_set_compare(const uint8_t timer_number, const hal_timer_t value) { + if (!HAL_timer_initialized(timer_number)) return; + + const uint32_t new_value = static_cast(value + 1U); + GeneralTimer& timer = (timer_number == MF_TIMER_STEP) ? Step_Timer : Temp_Timer; + + if (timer_number == MF_TIMER_STEP || timer_number == MF_TIMER_TEMP) { + timer.setRolloverValue(new_value, TimerFormat::TICK); + if (value < static_cast(timer.getCounter(TimerFormat::TICK))) + timer.refresh(); + } +} + +#define HAL_timer_isr_prologue(T) NOOP +#define HAL_timer_isr_epilogue(T) NOOP diff --git a/Marlin/src/HAL/GD32_MFL/u8g/LCD_defines.h b/Marlin/src/HAL/GD32_MFL/u8g/LCD_defines.h new file mode 100644 index 0000000000..720d958779 --- /dev/null +++ b/Marlin/src/HAL/GD32_MFL/u8g/LCD_defines.h @@ -0,0 +1,26 @@ +/** + * 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 + +// MFL LCD-specific defines +uint8_t u8g_com_HAL_MFL_sw_spi_fn(u8g_t* u8g, uint8_t msg, uint8_t arg_val, void* arg_ptr); // u8g_com_mfl_swspi.cpp +#define U8G_COM_HAL_SW_SPI_FN u8g_com_HAL_MFL_sw_spi_fn diff --git a/Marlin/src/HAL/HC32/eeprom_wired.cpp b/Marlin/src/HAL/HC32/eeprom_wired.cpp index d9be65b4c0..aea5fc87db 100644 --- a/Marlin/src/HAL/HC32/eeprom_wired.cpp +++ b/Marlin/src/HAL/HC32/eeprom_wired.cpp @@ -2,6 +2,9 @@ * Marlin 3D Printer Firmware * Copyright (c) 2023 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 diff --git a/Marlin/src/HAL/HC32/pinsDebug.h b/Marlin/src/HAL/HC32/pinsDebug.h index e80b5a081e..9f8e23ce44 100644 --- a/Marlin/src/HAL/HC32/pinsDebug.h +++ b/Marlin/src/HAL/HC32/pinsDebug.h @@ -2,6 +2,9 @@ * Marlin 3D Printer Firmware * Copyright (c) 2023 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 diff --git a/Marlin/src/HAL/HC32/spi_pins.h b/Marlin/src/HAL/HC32/spi_pins.h index 8a8e054b9b..5f1a94e920 100644 --- a/Marlin/src/HAL/HC32/spi_pins.h +++ b/Marlin/src/HAL/HC32/spi_pins.h @@ -2,6 +2,9 @@ * Marlin 3D Printer Firmware * Copyright (c) 2023 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 diff --git a/Marlin/src/HAL/platforms.h b/Marlin/src/HAL/platforms.h index 36fb792776..e7eea44308 100644 --- a/Marlin/src/HAL/platforms.h +++ b/Marlin/src/HAL/platforms.h @@ -37,6 +37,8 @@ #define HAL_PATH(PATH, NAME) XSTR(PATH/HAL/LPC1768/NAME) #elif defined(ARDUINO_ARCH_HC32) #define HAL_PATH(PATH, NAME) XSTR(PATH/HAL/HC32/NAME) +#elif defined(ARDUINO_ARCH_MFL) + #define HAL_PATH(PATH, NAME) XSTR(PATH/HAL/GD32_MFL/NAME) #elif defined(__STM32F1__) || defined(TARGET_STM32F1) #define HAL_PATH(PATH, NAME) XSTR(PATH/HAL/STM32F1/NAME) #elif defined(ARDUINO_ARCH_STM32) diff --git a/Marlin/src/HAL/shared/servo.h b/Marlin/src/HAL/shared/servo.h index fa75445ed7..0101fcb628 100644 --- a/Marlin/src/HAL/shared/servo.h +++ b/Marlin/src/HAL/shared/servo.h @@ -76,6 +76,8 @@ #include "../LPC1768/Servo.h" #elif defined(ARDUINO_ARCH_HC32) #include "../HC32/Servo.h" +#elif defined(ARDUINO_ARCH_MFL) + #include "../GD32_MFL/Servo.h" #elif defined(__STM32F1__) || defined(TARGET_STM32F1) #include "../STM32F1/Servo.h" #elif defined(ARDUINO_ARCH_STM32) diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index c6713d0c98..3d34e3717e 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -383,7 +383,7 @@ #define BOARD_CHITU3D_V6 5036 // Chitu3D TronXY X5SA V6 Board (STM32F103ZE) #define BOARD_CHITU3D_V9 5037 // Chitu3D TronXY X5SA V9 Board (STM32F103ZE) #define BOARD_CREALITY_V4 5038 // Creality v4.x (STM32F103RC / STM32F103RE) -#define BOARD_CREALITY_V422 5039 // Creality v4.2.2 (STM32F103RC / STM32F103RE) +#define BOARD_CREALITY_V422 5039 // Creality v4.2.2 (STM32F103RC / STM32F103RE) ... GD32 Variant Below! #define BOARD_CREALITY_V423 5040 // Creality v4.2.3 (STM32F103RC / STM32F103RE) #define BOARD_CREALITY_V425 5041 // Creality v4.2.5 (STM32F103RC / STM32F103RE) #define BOARD_CREALITY_V427 5042 // Creality v4.2.7 (STM32F103RC / STM32F103RE) @@ -552,12 +552,18 @@ #define BOARD_AQUILA_V101 7200 // Voxelab Aquila V1.0.0/V1.0.1/V1.0.2/V1.0.3 as found in the Voxelab Aquila X2 and C2 #define BOARD_CREALITY_ENDER2P_V24S4 7201 // Creality Ender 2 Pro v2.4.S4_170 (HC32f460kcta) +// +// GD32 ARM Cortex-M4 +// + +#define BOARD_CREALITY_V422_GD32_MFL 7300 // Creality V4.2.2 MFL (GD32F303RE) ... STM32 Variant Above! + // // Raspberry Pi // -#define BOARD_RP2040 6200 // Generic RP2040 Test board -#define BOARD_BTT_SKR_PICO 6201 // BigTreeTech SKR Pico 1.x +#define BOARD_RP2040 6200 // Generic RP2040 Test board +#define BOARD_BTT_SKR_PICO 6201 // BigTreeTech SKR Pico 1.x // // Custom board diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 3c4cd44561..1a86bb37de 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -241,10 +241,10 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L #error "SERIAL_XON_XOFF and SERIAL_STATS_* features not supported on USB-native AVR devices." #endif -// Serial DMA is only available for some STM32 MCUs and HC32 +// Serial DMA is only available for some STM32 MCUs, HC32 and GD32 #if ENABLED(SERIAL_DMA) - #ifdef ARDUINO_ARCH_HC32 - // checks for HC32 are located in HAL/HC32/inc/SanityCheck.h + #if ANY(ARDUINO_ARCH_HC32, ARDUINO_ARCH_MFL) + // See HAL/.../inc/SanityCheck.h #elif DISABLED(HAL_STM32) || NONE(STM32F0xx, STM32F1xx, STM32F2xx, STM32F4xx, STM32F7xx, STM32H7xx) #error "SERIAL_DMA is only available for some STM32 MCUs and requires HAL/STM32." #elif !defined(HAL_UART_MODULE_ENABLED) || defined(HAL_UART_MODULE_ONLY) diff --git a/Marlin/src/inc/Warnings.cpp b/Marlin/src/inc/Warnings.cpp index 70a6905d9f..119e2205ab 100644 --- a/Marlin/src/inc/Warnings.cpp +++ b/Marlin/src/inc/Warnings.cpp @@ -696,9 +696,16 @@ #warning "Don't forget to update your TFT settings in Configuration.h." #endif -#if ENABLED(EMIT_CREALITY_422_WARNING) && DISABLED(NO_CREALITY_422_DRIVER_WARNING) - // Driver labels: A=TMC2208, B=TMC2209, C=HR4988, E=A4988, H=TMC2225, H8=HR4988 - #warning "Creality 4.2.2 boards come with a variety of stepper drivers. Check the board label (typically on SD Card module) and set the correct *_DRIVER_TYPE! (A/H: TMC2208_STANDALONE B: TMC2209_STANDALONE C/E/H8: A4988). (Define NO_CREALITY_422_DRIVER_WARNING to suppress this warning.)" +#if ENABLED(EMIT_CREALITY_422_WARNING) + #if DISABLED(NO_CREALITY_422_MCU_WARNING) + #warning "Double-check your 4.2.2 board for STM32 / GD32. Use BOARD_CREALITY_V422 or BOARD_CREALITY_V422_GD32_MFL as appropriate for your MCU." + #warning "GD32 Serial Ports are numbered starting from 0. STM32 Serial Ports are numbered starting from 1." + #warning "(Define NO_CREALITY_422_MCU_WARNING to suppress these warnings.)" + #endif + #if DISABLED(NO_CREALITY_422_DRIVER_WARNING) + // Driver labels: A=TMC2208, B=TMC2209, C=HR4988, E=A4988, H=TMC2225, H8=HR4988 + #warning "Creality 4.2.2 boards come with a variety of stepper drivers. Check the board label (typically on SD Card module) and set the correct *_DRIVER_TYPE! (A/H: TMC2208_STANDALONE B: TMC2209_STANDALONE C/E/H8: A4988). (Define NO_CREALITY_422_DRIVER_WARNING to suppress this warning.)" + #endif #endif #if ENABLED(PRINTCOUNTER_SYNC) diff --git a/Marlin/src/lcd/dogm/u8g/u8g_dev_st7920_128x64_HAL.cpp b/Marlin/src/lcd/dogm/u8g/u8g_dev_st7920_128x64_HAL.cpp index 6c330db204..76d15ce8a2 100644 --- a/Marlin/src/lcd/dogm/u8g/u8g_dev_st7920_128x64_HAL.cpp +++ b/Marlin/src/lcd/dogm/u8g/u8g_dev_st7920_128x64_HAL.cpp @@ -199,7 +199,7 @@ u8g_dev_t u8g_dev_st7920_128x64_HAL_4x_sw_spi = { u8g_dev_st7920_128x64_HAL_4x_f U8G_PB_DEV(u8g_dev_st7920_128x64_HAL_hw_spi, LCD_PIXEL_WIDTH, LCD_PIXEL_HEIGHT, PAGE_HEIGHT, u8g_dev_st7920_128x64_HAL_fn, U8G_COM_ST7920_HAL_HW_SPI); u8g_dev_t u8g_dev_st7920_128x64_HAL_4x_hw_spi = { u8g_dev_st7920_128x64_HAL_4x_fn, &u8g_dev_st7920_128x64_HAL_4x_pb, U8G_COM_ST7920_HAL_HW_SPI }; -#if NONE(__AVR__, ARDUINO_ARCH_STM32, ARDUINO_ARCH_ESP32) || defined(U8G_HAL_LINKS) +#if NONE(__AVR__, ARDUINO_ARCH_STM32, ARDUINO_ARCH_ESP32, ARDUINO_ARCH_MFL) || defined(U8G_HAL_LINKS) // Also use this device for HAL version of RRD class. This results in the same device being used // for the ST7920 for HAL systems no matter what is selected in marlinui_DOGM.h. u8g_dev_t u8g_dev_st7920_128x64_rrd_sw_spi = { u8g_dev_st7920_128x64_HAL_4x_fn, &u8g_dev_st7920_128x64_HAL_4x_pb, U8G_COM_ST7920_HAL_SW_SPI }; diff --git a/Marlin/src/lcd/dogm/u8g/ultralcd_st7920_u8glib_rrd_AVR.cpp b/Marlin/src/lcd/dogm/u8g/ultralcd_st7920_u8glib_rrd_AVR.cpp index 6f8990bf20..f7b50741ac 100644 --- a/Marlin/src/lcd/dogm/u8g/ultralcd_st7920_u8glib_rrd_AVR.cpp +++ b/Marlin/src/lcd/dogm/u8g/ultralcd_st7920_u8glib_rrd_AVR.cpp @@ -25,7 +25,7 @@ #include "../../../inc/MarlinConfigPre.h" -#if ANY(__AVR__, ARDUINO_ARCH_STM32, ARDUINO_ARCH_ESP32) +#if ANY(__AVR__, ARDUINO_ARCH_STM32, ARDUINO_ARCH_ESP32, ARDUINO_ARCH_MFL) #include "../../../inc/MarlinConfig.h" @@ -193,4 +193,4 @@ u8g_dev_t u8g_dev_st7920_128x64_rrd_sw_spi = { u8g_dev_rrd_st7920_128x64_fn, &u8 #endif #endif // IS_U8GLIB_ST7920 -#endif // __AVR__ || ARDUINO_ARCH_STM32 || ARDUINO_ARCH_ESP32 +#endif // __AVR__ || ARDUINO_ARCH_STM32 || ARDUINO_ARCH_ESP32 || ARDUINO_ARCH_MFL diff --git a/Marlin/src/libs/BL24CXX.cpp b/Marlin/src/libs/BL24CXX.cpp index 767561143c..43c68887b1 100644 --- a/Marlin/src/libs/BL24CXX.cpp +++ b/Marlin/src/libs/BL24CXX.cpp @@ -48,7 +48,7 @@ #ifdef __STM32F1__ #define SDA_IN() do{ PIN_MAP[IIC_EEPROM_SDA].gpio_device->regs->CRH &= 0XFFFF0FFF; PIN_MAP[IIC_EEPROM_SDA].gpio_device->regs->CRH |= 8 << 12; }while(0) #define SDA_OUT() do{ PIN_MAP[IIC_EEPROM_SDA].gpio_device->regs->CRH &= 0XFFFF0FFF; PIN_MAP[IIC_EEPROM_SDA].gpio_device->regs->CRH |= 3 << 12; }while(0) -#elif defined(STM32F1) || defined(STM32F4) || defined(ARDUINO_ARCH_HC32) +#elif ANY(STM32F1, STM32F4, ARDUINO_ARCH_HC32, ARDUINO_ARCH_MFL) #define SDA_IN() SET_INPUT(IIC_EEPROM_SDA) #define SDA_OUT() SET_OUTPUT(IIC_EEPROM_SDA) #endif diff --git a/Marlin/src/pins/gd32f3/pins_CREALITY_V422_GD32_MFL.h b/Marlin/src/pins/gd32f3/pins_CREALITY_V422_GD32_MFL.h new file mode 100644 index 0000000000..70b171eef9 --- /dev/null +++ b/Marlin/src/pins/gd32f3/pins_CREALITY_V422_GD32_MFL.h @@ -0,0 +1,37 @@ +/** + * 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 + +/** + * Creality MFL GD32 V4.2.2 (GD32F303RE) board pin assignments + */ + +#define ALLOW_GD32F3 + +#ifndef BOARD_INFO_NAME + #define BOARD_INFO_NAME "Creality V4.2.2 MFL" +#endif +#ifndef DEFAULT_MACHINE_NAME + #define DEFAULT_MACHINE_NAME "Ender-3 MFL" +#endif + +#include "../stm32f1/pins_CREALITY_V4.h" diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 55dc00c60d..2e0919062c 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -964,6 +964,13 @@ #elif MB(CREALITY_ENDER2P_V24S4) #include "hc32f4/pins_CREALITY_ENDER2P_V24S4.h" // HC32F460 env:HC32F460C_e2p24s4 +// +// GD32 ARM Cortex-M4 +// + +#elif MB(CREALITY_V422_GD32_MFL) + #include "gd32f3/pins_CREALITY_V422_GD32_MFL.h" // GD32F303RE env:GD32F303RE_creality_mfl + // // Raspberry Pi RP2040 // diff --git a/Marlin/src/pins/pinsDebug_list.h b/Marlin/src/pins/pinsDebug_list.h index e93f232545..fe7f1d21ee 100644 --- a/Marlin/src/pins/pinsDebug_list.h +++ b/Marlin/src/pins/pinsDebug_list.h @@ -27,6 +27,8 @@ #if TARGET_LPC1768 #define ANALOG_OK(PN) (WITHIN(PN, P0_02, P0_03) || WITHIN(PN, P0_23, P0_26) || WITHIN(PN, P1_30, P1_31)) +#elif ARDUINO_ARCH_MFL + #define ANALOG_OK(PN) (WITHIN(PN, 0, 7) || WITHIN(PN, 16, 17) || WITHIN(PN, 32, 37)) #else #define ANALOG_OK(PN) WITHIN(PN, 0, NUM_ANALOG_INPUTS - 1) #endif diff --git a/Marlin/src/pins/stm32f1/env_validate.h b/Marlin/src/pins/stm32f1/env_validate.h index 47399a062d..34b07723e7 100644 --- a/Marlin/src/pins/stm32f1/env_validate.h +++ b/Marlin/src/pins/stm32f1/env_validate.h @@ -23,13 +23,16 @@ #define ENV_VALIDATE_H #if NOT_TARGET(__STM32F1__, STM32F1) - #if DISABLED(ALLOW_STM32F4) + #if NONE(ALLOW_STM32F4, ALLOW_GD32F3) #error "Oops! Select an STM32F1 board in 'Tools > Board.'" - #elif NOT_TARGET(STM32F4) + #elif ENABLED(ALLOW_STM32F4) && NOT_TARGET(STM32F4) #error "Oops! Select an STM32F4 board in 'Tools > Board.'" + #elif ENABLED(ALLOW_GD32F3) && NOT_TARGET(ARDUINO_ARCH_MFL) + #error "Oops! Make sure you have a GD32F3 MFL environment selected." #endif #endif #undef ALLOW_STM32F4 +#undef ALLOW_GD32F3 #endif diff --git a/README.md b/README.md index 160c288aad..50b86d3213 100644 --- a/README.md +++ b/README.md @@ -58,12 +58,13 @@ Every new HAL opens up a world of hardware. At this time we need HALs for RP2040 [Teensy++ 2.0](//www.microchip.com/en-us/product/AT90USB1286)|AT90USB1286|Printrboard [Arduino Due](//www.arduino.cc/en/Guide/ArduinoDue)|SAM3X8E|RAMPS-FD, RADDS, RAMPS4DUE [ESP32](//github.com/espressif/arduino-esp32)|ESP32|FYSETC E4, E4d@BOX, MRR + [GD32](//www.gigadevice.com/)|GD32 ARM Cortex-M4|Creality MFL GD32 V4.2.2 [HC32](//www.huazhoucn.com/)|HC32|Ender-2 Pro, Voxelab Aquila [LPC1768](//www.nxp.com/products/processors-and-microcontrollers/arm-microcontrollers/general-purpose-mcus/lpc1700-cortex-m3/512-kb-flash-64-kb-sram-ethernet-usb-lqfp100-package:LPC1768FBD100)|ARM® Cortex-M3|MKS SBASE, Re-ARM, Selena Compact [LPC1769](//www.nxp.com/products/processors-and-microcontrollers/arm-microcontrollers/general-purpose-mcus/lpc1700-cortex-m3/512-kb-flash-64-kb-sram-ethernet-usb-lqfp100-package:LPC1769FBD100)|ARM® Cortex-M3|Smoothieboard, Azteeg X5 mini, TH3D EZBoard + [Pico RP2040](//www.raspberrypi.com/documentation/microcontrollers/pico-series.html)|Dual Cortex M0+|BigTreeTech SKR Pico [STM32F103](//www.st.com/en/microcontrollers-microprocessors/stm32f103.html)|ARM® Cortex-M3|Malyan M200, GTM32 Pro, MKS Robin, BTT SKR Mini [STM32F401](//www.st.com/en/microcontrollers-microprocessors/stm32f401.html)|ARM® Cortex-M4|ARMED, Rumba32, SKR Pro, Lerdge, FYSETC S6, Artillery Ruby - [Pico RP2040](//www.raspberrypi.com/documentation/microcontrollers/pico-series.html)|Dual Cortex M0+|BigTreeTech SKR Pico [STM32F7x6](//www.st.com/en/microcontrollers-microprocessors/stm32f7x6.html)|ARM® Cortex-M7|The Borg, RemRam V1 [STM32G0B1RET6](//www.st.com/en/microcontrollers-microprocessors/stm32g0x1.html)|ARM® Cortex-M0+|BigTreeTech SKR mini E3 V3.0 [STM32H743xIT6](//www.st.com/en/microcontrollers-microprocessors/stm32h743-753.html)|ARM® Cortex-M7|BigTreeTech SKR V3.0, SKR EZ V3.0, SKR SE BX V2.0/V3.0 diff --git a/buildroot/tests/GD32F303RE_creality_mfl b/buildroot/tests/GD32F303RE_creality_mfl new file mode 100755 index 0000000000..6e0b9ff866 --- /dev/null +++ b/buildroot/tests/GD32F303RE_creality_mfl @@ -0,0 +1,17 @@ +#!/usr/bin/env bash +# +# Build tests for GD32F303RE_creality_mfl +# + +# exit on first failure +set -e + +restore_configs +opt_set MOTHERBOARD BOARD_CREALITY_V422_GD32_MFL SERIAL_PORT 0 +opt_enable EEPROM_SETTINGS SDSUPPORT EMERGENCY_PARSER FAN_SOFT_PWM PINS_DEBUGGING +opt_add NO_CREALITY_422_DRIVER_WARNING +opt_add NO_AUTO_ASSIGN_WARNING +exec_test $1 $2 "Creality V4.2.2 MFL GD32 Default Configuration" "$3" + +# cleanup +restore_configs diff --git a/ini/gd32.ini b/ini/gd32.ini new file mode 100644 index 0000000000..2e5bcea3b5 --- /dev/null +++ b/ini/gd32.ini @@ -0,0 +1,47 @@ +# +# Marlin Firmware +# PlatformIO Configuration File +# + +#################################### +# +# HAL/MFL GD32 Environments +# +#################################### + +[gd32_base] +platform = https://github.com/bmourit/platform-mfl/archive/refs/tags/V1.0.2.zip +board_build.core = gd32 +build_src_filter = ${common.default_src_filter} + + +build_unflags = -std=gnu++11 -std=gnu++14 -std=gnu++17 +build_flags = -std=gnu++23 + -DARDUINO_ARCH_MFL + -DPLATFORM_M997_SUPPORT + -DTIMER_IRQ_PRIORITY=12 + -DADC_RESOLUTION=12 + -DCORE_DEBUG + -Wno-deprecated-declarations + -Wno-volatile +extra_scripts = ${common.extra_scripts} + +# +# Creality (GD32F303RE) +# +[env:GD32F303RE_creality_mfl] +extends = gd32_base +board = mfl_creality_422 +board_build.offset = 0x7000 +board_build.rename = firmware-{time}.bin +board_upload.offset_address = 0x08007000 +build_flags = ${gd32_base.build_flags} + -DMCU_GD32F303RE + -DGD32F303RE + -DTIMER_TONE=2 + -DSS_TIMER=3 + -DTIMER_SERVO=4 + -DTRANSFER_CLOCK_DIV=8 + -fsingle-precision-constant +extra_scripts = ${gd32_base.extra_scripts} + buildroot/share/PlatformIO/scripts/offset_and_rename.py + +monitor_speed = 115200 diff --git a/platformio.ini b/platformio.ini index ed1670dc6d..d69fdc6cea 100644 --- a/platformio.ini +++ b/platformio.ini @@ -22,6 +22,7 @@ extra_configs = ini/esp32.ini ini/features.ini ini/hc32.ini + ini/gd32.ini ini/lpc176x.ini ini/native.ini ini/samd21.ini From 849e432d62ecd9ebe23cb81b66829755b19362f9 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Fri, 28 Mar 2025 06:09:42 +0000 Subject: [PATCH 63/74] [cron] Bump distribution date (2025-03-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 c24e090c3d..4947d61a01 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-03-27" +//#define STRING_DISTRIBUTION_DATE "2025-03-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 690de1c353..18f02773cf 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-03-27" + #define STRING_DISTRIBUTION_DATE "2025-03-28" #endif /** From aad10ea1c7c1aac37d83c3d8537b4040f6f0e259 Mon Sep 17 00:00:00 2001 From: ellensp <530024+ellensp@users.noreply.github.com> Date: Sun, 30 Mar 2025 14:58:16 +1300 Subject: [PATCH 64/74] =?UTF-8?q?=F0=9F=90=9B=20Fix=20E=20DIR=20init=20(#2?= =?UTF-8?q?7770)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Followup to add72fd045 --- Marlin/src/module/stepper.cpp | 10 +- Marlin/src/module/stepper/indirection.h | 240 +++++++++++++----------- 2 files changed, 137 insertions(+), 113 deletions(-) diff --git a/Marlin/src/module/stepper.cpp b/Marlin/src/module/stepper.cpp index 1ec82ba340..a86a33dda3 100644 --- a/Marlin/src/module/stepper.cpp +++ b/Marlin/src/module/stepper.cpp @@ -2958,11 +2958,19 @@ void Stepper::init() { TERN_(HAS_Z3_DIR, Z3_DIR_INIT()); TERN_(HAS_Z4_DIR, Z4_DIR_INIT()); TERN_(HAS_I_DIR, I_DIR_INIT()); - TERN_(HAS_K_DIR, K_DIR_INIT()); + TERN_(HAS_J_DIR, J_DIR_INIT()); TERN_(HAS_K_DIR, K_DIR_INIT()); TERN_(HAS_U_DIR, U_DIR_INIT()); TERN_(HAS_V_DIR, V_DIR_INIT()); TERN_(HAS_W_DIR, W_DIR_INIT()); + TERN_(HAS_E0_DIR, E0_DIR_INIT()); + TERN_(HAS_E1_DIR, E1_DIR_INIT()); + TERN_(HAS_E2_DIR, E2_DIR_INIT()); + TERN_(HAS_E3_DIR, E3_DIR_INIT()); + TERN_(HAS_E4_DIR, E4_DIR_INIT()); + TERN_(HAS_E5_DIR, E5_DIR_INIT()); + TERN_(HAS_E6_DIR, E6_DIR_INIT()); + TERN_(HAS_E7_DIR, E7_DIR_INIT()); // Init Enable Pins - steppers default to disabled. #if HAS_X_ENABLE diff --git a/Marlin/src/module/stepper/indirection.h b/Marlin/src/module/stepper/indirection.h index d18fe830cc..e55b8ac45d 100644 --- a/Marlin/src/module/stepper/indirection.h +++ b/Marlin/src/module/stepper/indirection.h @@ -353,140 +353,156 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset #endif // E0 Stepper -#ifndef E0_ENABLE_INIT - #define E0_ENABLE_INIT() SET_OUTPUT(E0_ENABLE_PIN) - #define E0_ENABLE_WRITE(STATE) WRITE(E0_ENABLE_PIN,STATE) - #define E0_ENABLE_READ() bool(READ(E0_ENABLE_PIN)) +#if E_STEPPERS > 0 + #ifndef E0_ENABLE_INIT + #define E0_ENABLE_INIT() SET_OUTPUT(E0_ENABLE_PIN) + #define E0_ENABLE_WRITE(STATE) WRITE(E0_ENABLE_PIN,STATE) + #define E0_ENABLE_READ() bool(READ(E0_ENABLE_PIN)) + #endif + #ifndef E0_DIR_INIT + #define E0_DIR_INIT() SET_OUTPUT(E0_DIR_PIN) + #define E0_DIR_WRITE(STATE) WRITE(E0_DIR_PIN,INVERT_DIR(E0, STATE)) + #define E0_DIR_READ() INVERT_DIR(E0, bool(READ(E0_DIR_PIN))) + #endif + #define E0_STEP_INIT() SET_OUTPUT(E0_STEP_PIN) + #ifndef E0_STEP_WRITE + #define E0_STEP_WRITE(STATE) WRITE(E0_STEP_PIN,STATE) + #endif + #define E0_STEP_READ() bool(READ(E0_STEP_PIN)) #endif -#ifndef E0_DIR_INIT - #define E0_DIR_INIT() SET_OUTPUT(E0_DIR_PIN) - #define E0_DIR_WRITE(STATE) WRITE(E0_DIR_PIN,INVERT_DIR(E0, STATE)) - #define E0_DIR_READ() INVERT_DIR(E0, bool(READ(E0_DIR_PIN))) -#endif -#define E0_STEP_INIT() SET_OUTPUT(E0_STEP_PIN) -#ifndef E0_STEP_WRITE - #define E0_STEP_WRITE(STATE) WRITE(E0_STEP_PIN,STATE) -#endif -#define E0_STEP_READ() bool(READ(E0_STEP_PIN)) // E1 Stepper -#ifndef E1_ENABLE_INIT - #define E1_ENABLE_INIT() SET_OUTPUT(E1_ENABLE_PIN) - #define E1_ENABLE_WRITE(STATE) WRITE(E1_ENABLE_PIN,STATE) - #define E1_ENABLE_READ() bool(READ(E1_ENABLE_PIN)) +#if E_STEPPERS > 1 || ENABLED(E_DUAL_STEPPER_DRIVERS) + #ifndef E1_ENABLE_INIT + #define E1_ENABLE_INIT() SET_OUTPUT(E1_ENABLE_PIN) + #define E1_ENABLE_WRITE(STATE) WRITE(E1_ENABLE_PIN,STATE) + #define E1_ENABLE_READ() bool(READ(E1_ENABLE_PIN)) + #endif + #ifndef E1_DIR_INIT + #define E1_DIR_INIT() SET_OUTPUT(E1_DIR_PIN) + #define E1_DIR_WRITE(STATE) WRITE(E1_DIR_PIN,INVERT_DIR(E1, STATE)) + #define E1_DIR_READ() INVERT_DIR(E1, bool(READ(E1_DIR_PIN))) + #endif + #define E1_STEP_INIT() SET_OUTPUT(E1_STEP_PIN) + #ifndef E1_STEP_WRITE + #define E1_STEP_WRITE(STATE) WRITE(E1_STEP_PIN,STATE) + #endif + #define E1_STEP_READ() bool(READ(E1_STEP_PIN)) #endif -#ifndef E1_DIR_INIT - #define E1_DIR_INIT() SET_OUTPUT(E1_DIR_PIN) - #define E1_DIR_WRITE(STATE) WRITE(E1_DIR_PIN,INVERT_DIR(E1, STATE)) - #define E1_DIR_READ() INVERT_DIR(E1, bool(READ(E1_DIR_PIN))) -#endif -#define E1_STEP_INIT() SET_OUTPUT(E1_STEP_PIN) -#ifndef E1_STEP_WRITE - #define E1_STEP_WRITE(STATE) WRITE(E1_STEP_PIN,STATE) -#endif -#define E1_STEP_READ() bool(READ(E1_STEP_PIN)) // E2 Stepper -#ifndef E2_ENABLE_INIT - #define E2_ENABLE_INIT() SET_OUTPUT(E2_ENABLE_PIN) - #define E2_ENABLE_WRITE(STATE) WRITE(E2_ENABLE_PIN,STATE) - #define E2_ENABLE_READ() bool(READ(E2_ENABLE_PIN)) +#if E_STEPPERS > 2 + #ifndef E2_ENABLE_INIT + #define E2_ENABLE_INIT() SET_OUTPUT(E2_ENABLE_PIN) + #define E2_ENABLE_WRITE(STATE) WRITE(E2_ENABLE_PIN,STATE) + #define E2_ENABLE_READ() bool(READ(E2_ENABLE_PIN)) + #endif + #ifndef E2_DIR_INIT + #define E2_DIR_INIT() SET_OUTPUT(E2_DIR_PIN) + #define E2_DIR_WRITE(STATE) WRITE(E2_DIR_PIN,INVERT_DIR(E2, STATE)) + #define E2_DIR_READ() INVERT_DIR(E2, bool(READ(E2_DIR_PIN))) + #endif + #define E2_STEP_INIT() SET_OUTPUT(E2_STEP_PIN) + #ifndef E2_STEP_WRITE + #define E2_STEP_WRITE(STATE) WRITE(E2_STEP_PIN,STATE) + #endif + #define E2_STEP_READ() bool(READ(E2_STEP_PIN)) #endif -#ifndef E2_DIR_INIT - #define E2_DIR_INIT() SET_OUTPUT(E2_DIR_PIN) - #define E2_DIR_WRITE(STATE) WRITE(E2_DIR_PIN,INVERT_DIR(E2, STATE)) - #define E2_DIR_READ() INVERT_DIR(E2, bool(READ(E2_DIR_PIN))) -#endif -#define E2_STEP_INIT() SET_OUTPUT(E2_STEP_PIN) -#ifndef E2_STEP_WRITE - #define E2_STEP_WRITE(STATE) WRITE(E2_STEP_PIN,STATE) -#endif -#define E2_STEP_READ() bool(READ(E2_STEP_PIN)) // E3 Stepper -#ifndef E3_ENABLE_INIT - #define E3_ENABLE_INIT() SET_OUTPUT(E3_ENABLE_PIN) - #define E3_ENABLE_WRITE(STATE) WRITE(E3_ENABLE_PIN,STATE) - #define E3_ENABLE_READ() bool(READ(E3_ENABLE_PIN)) +#if E_STEPPERS > 3 + #ifndef E3_ENABLE_INIT + #define E3_ENABLE_INIT() SET_OUTPUT(E3_ENABLE_PIN) + #define E3_ENABLE_WRITE(STATE) WRITE(E3_ENABLE_PIN,STATE) + #define E3_ENABLE_READ() bool(READ(E3_ENABLE_PIN)) + #endif + #ifndef E3_DIR_INIT + #define E3_DIR_INIT() SET_OUTPUT(E3_DIR_PIN) + #define E3_DIR_WRITE(STATE) WRITE(E3_DIR_PIN,INVERT_DIR(E3, STATE)) + #define E3_DIR_READ() INVERT_DIR(E3, bool(READ(E3_DIR_PIN))) + #endif + #define E3_STEP_INIT() SET_OUTPUT(E3_STEP_PIN) + #ifndef E3_STEP_WRITE + #define E3_STEP_WRITE(STATE) WRITE(E3_STEP_PIN,STATE) + #endif + #define E3_STEP_READ() bool(READ(E3_STEP_PIN)) #endif -#ifndef E3_DIR_INIT - #define E3_DIR_INIT() SET_OUTPUT(E3_DIR_PIN) - #define E3_DIR_WRITE(STATE) WRITE(E3_DIR_PIN,INVERT_DIR(E3, STATE)) - #define E3_DIR_READ() INVERT_DIR(E3, bool(READ(E3_DIR_PIN))) -#endif -#define E3_STEP_INIT() SET_OUTPUT(E3_STEP_PIN) -#ifndef E3_STEP_WRITE - #define E3_STEP_WRITE(STATE) WRITE(E3_STEP_PIN,STATE) -#endif -#define E3_STEP_READ() bool(READ(E3_STEP_PIN)) // E4 Stepper -#ifndef E4_ENABLE_INIT - #define E4_ENABLE_INIT() SET_OUTPUT(E4_ENABLE_PIN) - #define E4_ENABLE_WRITE(STATE) WRITE(E4_ENABLE_PIN,STATE) - #define E4_ENABLE_READ() bool(READ(E4_ENABLE_PIN)) +#if E_STEPPERS > 4 + #ifndef E4_ENABLE_INIT + #define E4_ENABLE_INIT() SET_OUTPUT(E4_ENABLE_PIN) + #define E4_ENABLE_WRITE(STATE) WRITE(E4_ENABLE_PIN,STATE) + #define E4_ENABLE_READ() bool(READ(E4_ENABLE_PIN)) + #endif + #ifndef E4_DIR_INIT + #define E4_DIR_INIT() SET_OUTPUT(E4_DIR_PIN) + #define E4_DIR_WRITE(STATE) WRITE(E4_DIR_PIN,INVERT_DIR(E4, STATE)) + #define E4_DIR_READ() INVERT_DIR(E4, bool(READ(E4_DIR_PIN))) + #endif + #define E4_STEP_INIT() SET_OUTPUT(E4_STEP_PIN) + #ifndef E4_STEP_WRITE + #define E4_STEP_WRITE(STATE) WRITE(E4_STEP_PIN,STATE) + #endif + #define E4_STEP_READ() bool(READ(E4_STEP_PIN)) #endif -#ifndef E4_DIR_INIT - #define E4_DIR_INIT() SET_OUTPUT(E4_DIR_PIN) - #define E4_DIR_WRITE(STATE) WRITE(E4_DIR_PIN,INVERT_DIR(E4, STATE)) - #define E4_DIR_READ() INVERT_DIR(E4, bool(READ(E4_DIR_PIN))) -#endif -#define E4_STEP_INIT() SET_OUTPUT(E4_STEP_PIN) -#ifndef E4_STEP_WRITE - #define E4_STEP_WRITE(STATE) WRITE(E4_STEP_PIN,STATE) -#endif -#define E4_STEP_READ() bool(READ(E4_STEP_PIN)) // E5 Stepper -#ifndef E5_ENABLE_INIT - #define E5_ENABLE_INIT() SET_OUTPUT(E5_ENABLE_PIN) - #define E5_ENABLE_WRITE(STATE) WRITE(E5_ENABLE_PIN,STATE) - #define E5_ENABLE_READ() bool(READ(E5_ENABLE_PIN)) +#if E_STEPPERS > 5 + #ifndef E5_ENABLE_INIT + #define E5_ENABLE_INIT() SET_OUTPUT(E5_ENABLE_PIN) + #define E5_ENABLE_WRITE(STATE) WRITE(E5_ENABLE_PIN,STATE) + #define E5_ENABLE_READ() bool(READ(E5_ENABLE_PIN)) + #endif + #ifndef E5_DIR_INIT + #define E5_DIR_INIT() SET_OUTPUT(E5_DIR_PIN) + #define E5_DIR_WRITE(STATE) WRITE(E5_DIR_PIN,INVERT_DIR(E5, STATE)) + #define E5_DIR_READ() INVERT_DIR(E5, bool(READ(E5_DIR_PIN))) + #endif + #define E5_STEP_INIT() SET_OUTPUT(E5_STEP_PIN) + #ifndef E5_STEP_WRITE + #define E5_STEP_WRITE(STATE) WRITE(E5_STEP_PIN,STATE) + #endif + #define E5_STEP_READ() bool(READ(E5_STEP_PIN)) #endif -#ifndef E5_DIR_INIT - #define E5_DIR_INIT() SET_OUTPUT(E5_DIR_PIN) - #define E5_DIR_WRITE(STATE) WRITE(E5_DIR_PIN,INVERT_DIR(E5, STATE)) - #define E5_DIR_READ() INVERT_DIR(E5, bool(READ(E5_DIR_PIN))) -#endif -#define E5_STEP_INIT() SET_OUTPUT(E5_STEP_PIN) -#ifndef E5_STEP_WRITE - #define E5_STEP_WRITE(STATE) WRITE(E5_STEP_PIN,STATE) -#endif -#define E5_STEP_READ() bool(READ(E5_STEP_PIN)) // E6 Stepper -#ifndef E6_ENABLE_INIT - #define E6_ENABLE_INIT() SET_OUTPUT(E6_ENABLE_PIN) - #define E6_ENABLE_WRITE(STATE) WRITE(E6_ENABLE_PIN,STATE) - #define E6_ENABLE_READ() bool(READ(E6_ENABLE_PIN)) +#if E_STEPPERS > 6 + #ifndef E6_ENABLE_INIT + #define E6_ENABLE_INIT() SET_OUTPUT(E6_ENABLE_PIN) + #define E6_ENABLE_WRITE(STATE) WRITE(E6_ENABLE_PIN,STATE) + #define E6_ENABLE_READ() bool(READ(E6_ENABLE_PIN)) + #endif + #ifndef E6_DIR_INIT + #define E6_DIR_INIT() SET_OUTPUT(E6_DIR_PIN) + #define E6_DIR_WRITE(STATE) WRITE(E6_DIR_PIN,INVERT_DIR(E6, STATE)) + #define E6_DIR_READ() INVERT_DIR(E6, bool(READ(E6_DIR_PIN))) + #endif + #define E6_STEP_INIT() SET_OUTPUT(E6_STEP_PIN) + #ifndef E6_STEP_WRITE + #define E6_STEP_WRITE(STATE) WRITE(E6_STEP_PIN,STATE) + #endif + #define E6_STEP_READ() bool(READ(E6_STEP_PIN)) #endif -#ifndef E6_DIR_INIT - #define E6_DIR_INIT() SET_OUTPUT(E6_DIR_PIN) - #define E6_DIR_WRITE(STATE) WRITE(E6_DIR_PIN,INVERT_DIR(E6, STATE)) - #define E6_DIR_READ() INVERT_DIR(E6, bool(READ(E6_DIR_PIN))) -#endif -#define E6_STEP_INIT() SET_OUTPUT(E6_STEP_PIN) -#ifndef E6_STEP_WRITE - #define E6_STEP_WRITE(STATE) WRITE(E6_STEP_PIN,STATE) -#endif -#define E6_STEP_READ() bool(READ(E6_STEP_PIN)) // E7 Stepper -#ifndef E7_ENABLE_INIT - #define E7_ENABLE_INIT() SET_OUTPUT(E7_ENABLE_PIN) - #define E7_ENABLE_WRITE(STATE) WRITE(E7_ENABLE_PIN,STATE) - #define E7_ENABLE_READ() bool(READ(E7_ENABLE_PIN)) +#if E_STEPPERS > 7 + #ifndef E7_ENABLE_INIT + #define E7_ENABLE_INIT() SET_OUTPUT(E7_ENABLE_PIN) + #define E7_ENABLE_WRITE(STATE) WRITE(E7_ENABLE_PIN,STATE) + #define E7_ENABLE_READ() bool(READ(E7_ENABLE_PIN)) + #endif + #ifndef E7_DIR_INIT + #define E7_DIR_INIT() SET_OUTPUT(E7_DIR_PIN) + #define E7_DIR_WRITE(STATE) WRITE(E7_DIR_PIN,INVERT_DIR(E7, STATE)) + #define E7_DIR_READ() INVERT_DIR(E7, bool(READ(E7_DIR_PIN))) + #endif + #define E7_STEP_INIT() SET_OUTPUT(E7_STEP_PIN) + #ifndef E7_STEP_WRITE + #define E7_STEP_WRITE(STATE) WRITE(E7_STEP_PIN,STATE) + #endif + #define E7_STEP_READ() bool(READ(E7_STEP_PIN)) #endif -#ifndef E7_DIR_INIT - #define E7_DIR_INIT() SET_OUTPUT(E7_DIR_PIN) - #define E7_DIR_WRITE(STATE) WRITE(E7_DIR_PIN,INVERT_DIR(E7, STATE)) - #define E7_DIR_READ() INVERT_DIR(E7, bool(READ(E7_DIR_PIN))) -#endif -#define E7_STEP_INIT() SET_OUTPUT(E7_STEP_PIN) -#ifndef E7_STEP_WRITE - #define E7_STEP_WRITE(STATE) WRITE(E7_STEP_PIN,STATE) -#endif -#define E7_STEP_READ() bool(READ(E7_STEP_PIN)) /** * Extruder indirection for the single E axis From fd17cc962b4788185f9f2e04c96ce608691afc4a Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Sun, 30 Mar 2025 06:08:25 +0000 Subject: [PATCH 65/74] [cron] Bump distribution date (2025-03-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 4947d61a01..a0cbd5cf9b 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-03-28" +//#define STRING_DISTRIBUTION_DATE "2025-03-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 18f02773cf..b717290a77 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-03-28" + #define STRING_DISTRIBUTION_DATE "2025-03-30" #endif /** From 73ed54308a6da8244ac10de04fb19d173fa54c83 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 30 Mar 2025 14:56:55 -0500 Subject: [PATCH 66/74] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20Move?= =?UTF-8?q?=20ENABLE=20to=20indirection.h?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Followup to add72fd045 --- Marlin/src/inc/Conditionals-5-post.h | 24 ++-- Marlin/src/module/stepper.cpp | 149 ++++-------------------- Marlin/src/module/stepper/indirection.h | 71 ++++++++++- 3 files changed, 107 insertions(+), 137 deletions(-) diff --git a/Marlin/src/inc/Conditionals-5-post.h b/Marlin/src/inc/Conditionals-5-post.h index 93be95c95d..f83c063d11 100644 --- a/Marlin/src/inc/Conditionals-5-post.h +++ b/Marlin/src/inc/Conditionals-5-post.h @@ -1065,17 +1065,19 @@ #define HAS_X_MS_PINS 1 #endif - #if PIN_EXISTS(X2_ENABLE) || ALL(SOFTWARE_DRIVER_ENABLE, X2_IS_TRINAMIC) - #define HAS_X2_ENABLE 1 - #endif - #if PIN_EXISTS(X2_DIR) - #define HAS_X2_DIR 1 - #endif - #if PIN_EXISTS(X2_STEP) - #define HAS_X2_STEP 1 - #endif - #if PIN_EXISTS(X2_MS1) - #define HAS_X2_MS_PINS 1 + #if HAS_X2_STEPPER + #if PIN_EXISTS(X2_ENABLE) || ALL(SOFTWARE_DRIVER_ENABLE, X2_IS_TRINAMIC) + #define HAS_X2_ENABLE 1 + #endif + #if PIN_EXISTS(X2_DIR) + #define HAS_X2_DIR 1 + #endif + #if PIN_EXISTS(X2_STEP) + #define HAS_X2_STEP 1 + #endif + #if PIN_EXISTS(X2_MS1) + #define HAS_X2_MS_PINS 1 + #endif #endif #endif diff --git a/Marlin/src/module/stepper.cpp b/Marlin/src/module/stepper.cpp index a86a33dda3..f55465ea56 100644 --- a/Marlin/src/module/stepper.cpp +++ b/Marlin/src/module/stepper.cpp @@ -2972,131 +2972,30 @@ void Stepper::init() { TERN_(HAS_E6_DIR, E6_DIR_INIT()); TERN_(HAS_E7_DIR, E7_DIR_INIT()); - // Init Enable Pins - steppers default to disabled. - #if HAS_X_ENABLE - #ifndef X_ENABLE_INIT_STATE - #define X_ENABLE_INIT_STATE !X_ENABLE_ON - #endif - X_ENABLE_INIT(); - if (X_ENABLE_INIT_STATE) X_ENABLE_WRITE(X_ENABLE_INIT_STATE); - #if ALL(HAS_X2_STEPPER, HAS_X2_ENABLE) - X2_ENABLE_INIT(); - if (X_ENABLE_INIT_STATE) X2_ENABLE_WRITE(X_ENABLE_INIT_STATE); - #endif - #endif - #if HAS_Y_ENABLE - #ifndef Y_ENABLE_INIT_STATE - #define Y_ENABLE_INIT_STATE !Y_ENABLE_ON - #endif - Y_ENABLE_INIT(); - if (Y_ENABLE_INIT_STATE) Y_ENABLE_WRITE(Y_ENABLE_INIT_STATE); - #if ALL(HAS_Y2_STEPPER, HAS_Y2_ENABLE) - Y2_ENABLE_INIT(); - if (Y_ENABLE_INIT_STATE) Y2_ENABLE_WRITE(Y_ENABLE_INIT_STATE); - #endif - #endif - #if HAS_Z_ENABLE - #ifndef Z_ENABLE_INIT_STATE - #define Z_ENABLE_INIT_STATE !Z_ENABLE_ON - #endif - Z_ENABLE_INIT(); - if (Z_ENABLE_INIT_STATE) Z_ENABLE_WRITE(Z_ENABLE_INIT_STATE); - #if HAS_Z2_ENABLE - Z2_ENABLE_INIT(); - if (Z_ENABLE_INIT_STATE) Z2_ENABLE_WRITE(Z_ENABLE_INIT_STATE); - #endif - #if HAS_Z3_ENABLE - Z3_ENABLE_INIT(); - if (Z_ENABLE_INIT_STATE) Z3_ENABLE_WRITE(Z_ENABLE_INIT_STATE); - #endif - #if HAS_Z4_ENABLE - Z4_ENABLE_INIT(); - if (Z_ENABLE_INIT_STATE) Z4_ENABLE_WRITE(Z_ENABLE_INIT_STATE); - #endif - #endif - #if HAS_I_ENABLE - I_ENABLE_INIT(); - if (!I_ENABLE_ON) I_ENABLE_WRITE(HIGH); - #endif - #if HAS_J_ENABLE - J_ENABLE_INIT(); - if (!J_ENABLE_ON) J_ENABLE_WRITE(HIGH); - #endif - #if HAS_K_ENABLE - K_ENABLE_INIT(); - if (!K_ENABLE_ON) K_ENABLE_WRITE(HIGH); - #endif - #if HAS_U_ENABLE - U_ENABLE_INIT(); - if (!U_ENABLE_ON) U_ENABLE_WRITE(HIGH); - #endif - #if HAS_V_ENABLE - V_ENABLE_INIT(); - if (!V_ENABLE_ON) V_ENABLE_WRITE(HIGH); - #endif - #if HAS_W_ENABLE - W_ENABLE_INIT(); - if (!W_ENABLE_ON) W_ENABLE_WRITE(HIGH); - #endif - #if HAS_E0_ENABLE - #ifndef E_ENABLE_INIT_STATE - #define E_ENABLE_INIT_STATE !E_ENABLE_ON - #endif - #ifndef E0_ENABLE_INIT_STATE - #define E0_ENABLE_INIT_STATE E_ENABLE_INIT_STATE - #endif - E0_ENABLE_INIT(); - if (E0_ENABLE_INIT_STATE) E0_ENABLE_WRITE(E0_ENABLE_INIT_STATE); - #endif - #if HAS_E1_ENABLE - #ifndef E1_ENABLE_INIT_STATE - #define E1_ENABLE_INIT_STATE E_ENABLE_INIT_STATE - #endif - E1_ENABLE_INIT(); - if (E1_ENABLE_INIT_STATE) E1_ENABLE_WRITE(E1_ENABLE_INIT_STATE); - #endif - #if HAS_E2_ENABLE - #ifndef E2_ENABLE_INIT_STATE - #define E2_ENABLE_INIT_STATE E_ENABLE_INIT_STATE - #endif - E2_ENABLE_INIT(); - if (E2_ENABLE_INIT_STATE) E2_ENABLE_WRITE(E2_ENABLE_INIT_STATE); - #endif - #if HAS_E3_ENABLE - #ifndef E3_ENABLE_INIT_STATE - #define E3_ENABLE_INIT_STATE E_ENABLE_INIT_STATE - #endif - E3_ENABLE_INIT(); - if (E3_ENABLE_INIT_STATE) E3_ENABLE_WRITE(E3_ENABLE_INIT_STATE); - #endif - #if HAS_E4_ENABLE - #ifndef E4_ENABLE_INIT_STATE - #define E4_ENABLE_INIT_STATE E_ENABLE_INIT_STATE - #endif - E4_ENABLE_INIT(); - if (E4_ENABLE_INIT_STATE) E4_ENABLE_WRITE(E4_ENABLE_INIT_STATE); - #endif - #if HAS_E5_ENABLE - #ifndef E5_ENABLE_INIT_STATE - #define E5_ENABLE_INIT_STATE E_ENABLE_INIT_STATE - #endif - E5_ENABLE_INIT(); - if (E5_ENABLE_INIT_STATE) E5_ENABLE_WRITE(E5_ENABLE_INIT_STATE); - #endif - #if HAS_E6_ENABLE - #ifndef E6_ENABLE_INIT_STATE - #define E6_ENABLE_INIT_STATE E_ENABLE_INIT_STATE - #endif - E6_ENABLE_INIT(); - if (E6_ENABLE_INIT_STATE) E6_ENABLE_WRITE(E6_ENABLE_INIT_STATE); - #endif - #if HAS_E7_ENABLE - #ifndef E7_ENABLE_INIT_STATE - #define E7_ENABLE_INIT_STATE E_ENABLE_INIT_STATE - #endif - E7_ENABLE_INIT(); - if (E7_ENABLE_INIT_STATE) E7_ENABLE_WRITE(E7_ENABLE_INIT_STATE); - #endif + // Init Enable Pins - Steppers default to disabled. + #define _INIT_CONFIG_ENABLE(A) do{ A##_ENABLE_INIT(); if (A##_ENABLE_INIT_STATE) A##_ENABLE_WRITE(HIGH); }while(0) + TERN_(HAS_X_ENABLE, _INIT_CONFIG_ENABLE(X)); + TERN_(HAS_X2_ENABLE, _INIT_CONFIG_ENABLE(X2)); + TERN_(HAS_Y_ENABLE, _INIT_CONFIG_ENABLE(Y)); + TERN_(HAS_Y2_ENABLE, _INIT_CONFIG_ENABLE(Y2)); + TERN_(HAS_Z_ENABLE, _INIT_CONFIG_ENABLE(Z)); + TERN_(HAS_Z2_ENABLE, _INIT_CONFIG_ENABLE(Z2)); + TERN_(HAS_Z3_ENABLE, _INIT_CONFIG_ENABLE(Z3)); + TERN_(HAS_Z4_ENABLE, _INIT_CONFIG_ENABLE(Z4)); + TERN_(HAS_I_ENABLE, _INIT_CONFIG_ENABLE(I)); + TERN_(HAS_J_ENABLE, _INIT_CONFIG_ENABLE(J)); + TERN_(HAS_K_ENABLE, _INIT_CONFIG_ENABLE(K)); + TERN_(HAS_U_ENABLE, _INIT_CONFIG_ENABLE(U)); + TERN_(HAS_V_ENABLE, _INIT_CONFIG_ENABLE(V)); + TERN_(HAS_W_ENABLE, _INIT_CONFIG_ENABLE(W)); + TERN_(HAS_E0_ENABLE, _INIT_CONFIG_ENABLE(E0)); + TERN_(HAS_E1_ENABLE, _INIT_CONFIG_ENABLE(E1)); + TERN_(HAS_E2_ENABLE, _INIT_CONFIG_ENABLE(E2)); + TERN_(HAS_E3_ENABLE, _INIT_CONFIG_ENABLE(E3)); + TERN_(HAS_E4_ENABLE, _INIT_CONFIG_ENABLE(E4)); + TERN_(HAS_E5_ENABLE, _INIT_CONFIG_ENABLE(E5)); + TERN_(HAS_E6_ENABLE, _INIT_CONFIG_ENABLE(E6)); + TERN_(HAS_E7_ENABLE, _INIT_CONFIG_ENABLE(E7)); #define _STEP_INIT(AXIS) AXIS ##_STEP_INIT() #define _WRITE_STEP(AXIS, HIGHLOW) AXIS ##_STEP_WRITE(HIGHLOW) diff --git a/Marlin/src/module/stepper/indirection.h b/Marlin/src/module/stepper/indirection.h index e55b8ac45d..19594df66c 100644 --- a/Marlin/src/module/stepper/indirection.h +++ b/Marlin/src/module/stepper/indirection.h @@ -80,6 +80,9 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset // X Stepper #if HAS_X_AXIS + #ifndef X_ENABLE_INIT_STATE + #define X_ENABLE_INIT_STATE !X_ENABLE_ON + #endif #ifndef X_ENABLE_INIT #define X_ENABLE_INIT() SET_OUTPUT(X_ENABLE_PIN) #define X_ENABLE_WRITE(STATE) WRITE(X_ENABLE_PIN,STATE) @@ -99,6 +102,9 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset // Y Stepper #if HAS_Y_AXIS + #ifndef Y_ENABLE_INIT_STATE + #define Y_ENABLE_INIT_STATE !Y_ENABLE_ON + #endif #ifndef Y_ENABLE_INIT #define Y_ENABLE_INIT() SET_OUTPUT(Y_ENABLE_PIN) #define Y_ENABLE_WRITE(STATE) WRITE(Y_ENABLE_PIN,STATE) @@ -118,6 +124,9 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset // Z Stepper #if HAS_Z_AXIS + #ifndef Z_ENABLE_INIT_STATE + #define Z_ENABLE_INIT_STATE !Z_ENABLE_ON + #endif #ifndef Z_ENABLE_INIT #define Z_ENABLE_INIT() SET_OUTPUT(Z_ENABLE_PIN) #define Z_ENABLE_WRITE(STATE) WRITE(Z_ENABLE_PIN,STATE) @@ -137,6 +146,9 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset // X2 Stepper #if HAS_X2_ENABLE + #ifndef X2_ENABLE_INIT_STATE + #define X2_ENABLE_INIT_STATE X_ENABLE_INIT_STATE + #endif #ifndef X2_ENABLE_INIT #define X2_ENABLE_INIT() SET_OUTPUT(X2_ENABLE_PIN) #define X2_ENABLE_WRITE(STATE) WRITE(X2_ENABLE_PIN,STATE) @@ -156,6 +168,9 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset // Y2 Stepper #if HAS_Y2_ENABLE + #ifndef Y2_ENABLE_INIT_STATE + #define Y2_ENABLE_INIT_STATE Y_ENABLE_INIT_STATE + #endif #ifndef Y2_ENABLE_INIT #define Y2_ENABLE_INIT() SET_OUTPUT(Y2_ENABLE_PIN) #define Y2_ENABLE_WRITE(STATE) WRITE(Y2_ENABLE_PIN,STATE) @@ -177,6 +192,9 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset // Z2 Stepper #if HAS_Z2_ENABLE + #ifndef Z2_ENABLE_INIT_STATE + #define Z2_ENABLE_INIT_STATE Z_ENABLE_INIT_STATE + #endif #ifndef Z2_ENABLE_INIT #define Z2_ENABLE_INIT() SET_OUTPUT(Z2_ENABLE_PIN) #define Z2_ENABLE_WRITE(STATE) WRITE(Z2_ENABLE_PIN,STATE) @@ -198,6 +216,9 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset // Z3 Stepper #if HAS_Z3_ENABLE + #ifndef Z3_ENABLE_INIT_STATE + #define Z3_ENABLE_INIT_STATE Z_ENABLE_INIT_STATE + #endif #ifndef Z3_ENABLE_INIT #define Z3_ENABLE_INIT() SET_OUTPUT(Z3_ENABLE_PIN) #define Z3_ENABLE_WRITE(STATE) WRITE(Z3_ENABLE_PIN,STATE) @@ -219,6 +240,9 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset // Z4 Stepper #if HAS_Z4_ENABLE + #ifndef Z4_ENABLE_INIT_STATE + #define Z4_ENABLE_INIT_STATE Z_ENABLE_INIT_STATE + #endif #ifndef Z4_ENABLE_INIT #define Z4_ENABLE_INIT() SET_OUTPUT(Z4_ENABLE_PIN) #define Z4_ENABLE_WRITE(STATE) WRITE(Z4_ENABLE_PIN,STATE) @@ -240,6 +264,9 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset // I Stepper #if HAS_I_AXIS + #ifndef I_ENABLE_INIT_STATE + #define I_ENABLE_INIT_STATE !I_ENABLE_ON + #endif #ifndef I_ENABLE_INIT #define I_ENABLE_INIT() SET_OUTPUT(I_ENABLE_PIN) #define I_ENABLE_WRITE(STATE) WRITE(I_ENABLE_PIN,STATE) @@ -259,6 +286,9 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset // J Stepper #if HAS_J_AXIS + #ifndef J_ENABLE_INIT_STATE + #define J_ENABLE_INIT_STATE !J_ENABLE_ON + #endif #ifndef J_ENABLE_INIT #define J_ENABLE_INIT() SET_OUTPUT(J_ENABLE_PIN) #define J_ENABLE_WRITE(STATE) WRITE(J_ENABLE_PIN,STATE) @@ -278,6 +308,9 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset // K Stepper #if HAS_K_AXIS + #ifndef K_ENABLE_INIT_STATE + #define K_ENABLE_INIT_STATE !K_ENABLE_ON + #endif #ifndef K_ENABLE_INIT #define K_ENABLE_INIT() SET_OUTPUT(K_ENABLE_PIN) #define K_ENABLE_WRITE(STATE) WRITE(K_ENABLE_PIN,STATE) @@ -297,6 +330,9 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset // U Stepper #if HAS_U_AXIS + #ifndef U_ENABLE_INIT_STATE + #define U_ENABLE_INIT_STATE !U_ENABLE_ON + #endif #ifndef U_ENABLE_INIT #define U_ENABLE_INIT() SET_OUTPUT(U_ENABLE_PIN) #define U_ENABLE_WRITE(STATE) WRITE(U_ENABLE_PIN,STATE) @@ -316,6 +352,9 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset // V Stepper #if HAS_V_AXIS + #ifndef V_ENABLE_INIT_STATE + #define V_ENABLE_INIT_STATE !V_ENABLE_ON + #endif #ifndef V_ENABLE_INIT #define V_ENABLE_INIT() SET_OUTPUT(V_ENABLE_PIN) #define V_ENABLE_WRITE(STATE) WRITE(V_ENABLE_PIN,STATE) @@ -335,6 +374,9 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset // W Stepper #if HAS_W_AXIS + #ifndef W_ENABLE_INIT_STATE + #define W_ENABLE_INIT_STATE !W_ENABLE_ON + #endif #ifndef W_ENABLE_INIT #define W_ENABLE_INIT() SET_OUTPUT(W_ENABLE_PIN) #define W_ENABLE_WRITE(STATE) WRITE(W_ENABLE_PIN,STATE) @@ -353,7 +395,13 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset #endif // E0 Stepper -#if E_STEPPERS > 0 +#if HAS_EXTRUDERS + #ifndef E_ENABLE_INIT_STATE + #define E_ENABLE_INIT_STATE !E_ENABLE_ON + #endif + #ifndef E0_ENABLE_INIT_STATE + #define E0_ENABLE_INIT_STATE E_ENABLE_INIT_STATE + #endif #ifndef E0_ENABLE_INIT #define E0_ENABLE_INIT() SET_OUTPUT(E0_ENABLE_PIN) #define E0_ENABLE_WRITE(STATE) WRITE(E0_ENABLE_PIN,STATE) @@ -373,6 +421,9 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset // E1 Stepper #if E_STEPPERS > 1 || ENABLED(E_DUAL_STEPPER_DRIVERS) + #ifndef E1_ENABLE_INIT_STATE + #define E1_ENABLE_INIT_STATE E_ENABLE_INIT_STATE + #endif #ifndef E1_ENABLE_INIT #define E1_ENABLE_INIT() SET_OUTPUT(E1_ENABLE_PIN) #define E1_ENABLE_WRITE(STATE) WRITE(E1_ENABLE_PIN,STATE) @@ -392,6 +443,9 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset // E2 Stepper #if E_STEPPERS > 2 + #ifndef E2_ENABLE_INIT_STATE + #define E2_ENABLE_INIT_STATE E_ENABLE_INIT_STATE + #endif #ifndef E2_ENABLE_INIT #define E2_ENABLE_INIT() SET_OUTPUT(E2_ENABLE_PIN) #define E2_ENABLE_WRITE(STATE) WRITE(E2_ENABLE_PIN,STATE) @@ -411,6 +465,9 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset // E3 Stepper #if E_STEPPERS > 3 + #ifndef E3_ENABLE_INIT_STATE + #define E3_ENABLE_INIT_STATE E_ENABLE_INIT_STATE + #endif #ifndef E3_ENABLE_INIT #define E3_ENABLE_INIT() SET_OUTPUT(E3_ENABLE_PIN) #define E3_ENABLE_WRITE(STATE) WRITE(E3_ENABLE_PIN,STATE) @@ -430,6 +487,9 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset // E4 Stepper #if E_STEPPERS > 4 + #ifndef E4_ENABLE_INIT_STATE + #define E4_ENABLE_INIT_STATE E_ENABLE_INIT_STATE + #endif #ifndef E4_ENABLE_INIT #define E4_ENABLE_INIT() SET_OUTPUT(E4_ENABLE_PIN) #define E4_ENABLE_WRITE(STATE) WRITE(E4_ENABLE_PIN,STATE) @@ -449,6 +509,9 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset // E5 Stepper #if E_STEPPERS > 5 + #ifndef E5_ENABLE_INIT_STATE + #define E5_ENABLE_INIT_STATE E_ENABLE_INIT_STATE + #endif #ifndef E5_ENABLE_INIT #define E5_ENABLE_INIT() SET_OUTPUT(E5_ENABLE_PIN) #define E5_ENABLE_WRITE(STATE) WRITE(E5_ENABLE_PIN,STATE) @@ -468,6 +531,9 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset // E6 Stepper #if E_STEPPERS > 6 + #ifndef E6_ENABLE_INIT_STATE + #define E6_ENABLE_INIT_STATE E_ENABLE_INIT_STATE + #endif #ifndef E6_ENABLE_INIT #define E6_ENABLE_INIT() SET_OUTPUT(E6_ENABLE_PIN) #define E6_ENABLE_WRITE(STATE) WRITE(E6_ENABLE_PIN,STATE) @@ -487,6 +553,9 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset // E7 Stepper #if E_STEPPERS > 7 + #ifndef E7_ENABLE_INIT_STATE + #define E7_ENABLE_INIT_STATE E_ENABLE_INIT_STATE + #endif #ifndef E7_ENABLE_INIT #define E7_ENABLE_INIT() SET_OUTPUT(E7_ENABLE_PIN) #define E7_ENABLE_WRITE(STATE) WRITE(E7_ENABLE_PIN,STATE) From 43177af21c279e48f41f2ad8bcaf9a0c294e6b3b Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 30 Mar 2025 14:57:01 -0500 Subject: [PATCH 67/74] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20Digip?= =?UTF-8?q?ot=20settings=20cleanup?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/module/settings.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index c2b4e3da38..4205261a3c 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -3712,7 +3712,7 @@ void MarlinSettings::reset() { #if HAS_MOTOR_CURRENT_PWM constexpr uint32_t tmp_motor_current_setting[MOTOR_CURRENT_COUNT] = PWM_MOTOR_CURRENT; for (uint8_t q = 0; q < MOTOR_CURRENT_COUNT; ++q) - stepper.set_digipot_current(q, (stepper.motor_current_setting[q] = tmp_motor_current_setting[q])); + stepper.set_digipot_current(q, tmp_motor_current_setting[q]); #endif // @@ -3720,10 +3720,8 @@ void MarlinSettings::reset() { // #if HAS_MOTOR_CURRENT_SPI static constexpr uint32_t tmp_motor_current_setting[] = DIGIPOT_MOTOR_CURRENT; - DEBUG_ECHOLNPGM("Writing Digipot"); for (uint8_t q = 0; q < COUNT(tmp_motor_current_setting); ++q) stepper.set_digipot_current(q, tmp_motor_current_setting[q]); - DEBUG_ECHOLNPGM("Digipot Written"); #endif // From d2b47c354c496896866de07907e355ff96e453dd Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Mon, 31 Mar 2025 00:31:54 +0000 Subject: [PATCH 68/74] [cron] Bump distribution date (2025-03-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 a0cbd5cf9b..d49c6c4e3b 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-03-30" +//#define STRING_DISTRIBUTION_DATE "2025-03-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 b717290a77..5ee57c2fc0 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-03-30" + #define STRING_DISTRIBUTION_DATE "2025-03-31" #endif /** From 15ce5d06127553050d20f1e92cca8b67bdbddf66 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 30 Mar 2025 23:30:31 -0500 Subject: [PATCH 69/74] =?UTF-8?q?=F0=9F=94=A8=F0=9F=A9=B9=20Misc.=20code?= =?UTF-8?q?=20corrections,=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/gcode/feature/digipot/M907-M910.cpp | 29 ++++++++++++++----- Marlin/src/inc/Conditionals-6-type.h | 2 +- Marlin/src/inc/SanityCheck.h | 8 ++--- Marlin/src/module/stepper.cpp | 2 +- 4 files changed, 27 insertions(+), 14 deletions(-) diff --git a/Marlin/src/gcode/feature/digipot/M907-M910.cpp b/Marlin/src/gcode/feature/digipot/M907-M910.cpp index ab1c316705..b1bd9b4f95 100644 --- a/Marlin/src/gcode/feature/digipot/M907-M910.cpp +++ b/Marlin/src/gcode/feature/digipot/M907-M910.cpp @@ -51,10 +51,25 @@ void GcodeSuite::M907() { if (!parser.seen("BS" STR_AXES_LOGICAL)) return M907_report(); - if (parser.seenval('S')) for (uint8_t i = 0; i < MOTOR_CURRENT_COUNT; ++i) stepper.set_digipot_current(i, parser.value_int()); - LOOP_LOGICAL_AXES(i) if (parser.seenval(IAXIS_CHAR(i))) stepper.set_digipot_current(i, parser.value_int()); // X Y Z (I J K U V W) E (map to drivers according to DIGIPOT_CHANNELS. Default with NUM_AXES 3: map X Y Z E to X Y Z E0) - // Additional extruders use B,C. - // TODO: Change these parameters because 'E' is used and D should be reserved for debugging. B? + // S - Set current in mA for all axes + if (parser.seenval('S')) + for (uint8_t i = 0; i < MOTOR_CURRENT_COUNT; ++i) + stepper.set_digipot_current(i, parser.value_int()); + + // X Y Z (I J K U V W) E (map to drivers according to DIGIPOT_CHANNELS. + // Default with NUM_AXES 3: map X Y Z E to X Y Z E0) + LOOP_LOGICAL_AXES(i) + if (parser.seenval(IAXIS_CHAR(i))) + stepper.set_digipot_current(i, parser.value_int()); + + /** + * Additional extruders use B,C in this legacy protocol + * TODO: Update to allow for an index with X, Y, Z, E axis to isolate a single stepper + * and use configured axis names instead of IJKUVW. i.e., Match the behavior of + * other G-codes that set stepper-specific parameters. If necessary deprecate G-codes. + * Bonus Points: Standardize a method that all G-codes can use to refer to one or + * more steppers/drivers and apply to various G-codes. + */ #if E_STEPPERS >= 2 if (parser.seenval('B')) stepper.set_digipot_current(E_AXIS + 1, parser.value_int()); #if E_STEPPERS >= 3 @@ -72,14 +87,12 @@ void GcodeSuite::M907() { if (!parser.seen("S" #if HAS_X_Y_XY_I_J_K_U_V_W - "XY" SECONDARY_AXIS_GANG("I", "J", "K", "U", "V", "W") + NUM_AXIS_GANG("X", "Y",, "I", "J", "K", "U", "V", "W") #endif #if PIN_EXISTS(MOTOR_CURRENT_PWM_Z) "Z" #endif - #if HAS_MOTOR_CURRENT_PWM_E - "E" - #endif + TERN_(HAS_MOTOR_CURRENT_PWM_E, "E") )) return M907_report(); if (parser.seenval('S')) for (uint8_t a = 0; a < MOTOR_CURRENT_COUNT; ++a) stepper.set_digipot_current(a, parser.value_int()); diff --git a/Marlin/src/inc/Conditionals-6-type.h b/Marlin/src/inc/Conditionals-6-type.h index bd8e3b78b4..9f0c0c3564 100644 --- a/Marlin/src/inc/Conditionals-6-type.h +++ b/Marlin/src/inc/Conditionals-6-type.h @@ -38,7 +38,7 @@ #endif // If an axis's Homing Current differs from standard current... -#define HAS_HOME_CURRENT(N) (N##_CURRENT_HOME > 0 && N##_CURRENT_HOME != N##_CURRENT) +#define HAS_HOME_CURRENT(N) TERN0(EDITABLE_HOMING_CURRENT, N##_IS_TRINAMIC && N##_HOME_DIR != 0) || (N##_CURRENT_HOME > 0 && N##_CURRENT_HOME != N##_CURRENT) #if HAS_HOME_CURRENT(X) #define X_HAS_HOME_CURRENT 1 #endif diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 1a86bb37de..62e16b0156 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -1890,7 +1890,7 @@ static_assert(NUM_SERVOS <= NUM_SERVO_PLUGS, "NUM_SERVOS (or some servo index) i /** * ULTIPANEL encoder */ -#if IS_ULTIPANEL && NONE(IS_NEWPANEL, SR_LCD_2W_NL) && !PIN_EXISTS(SHIFT_CLK) +#if IS_ULTIPANEL && NONE(HAS_ROTARY_ENCODER, SR_LCD_2W_NL, SR_LCD_3W_NL) && !PIN_EXISTS(SHIFT_CLK) #error "ULTIPANEL controllers require some kind of encoder." #endif @@ -4041,11 +4041,11 @@ static_assert(_PLUS_TEST(3), "DEFAULT_MAX_ACCELERATION values must be positive." #elif _PIN_CONFLICT(CONTROLLERFAN) #error "SPINDLE_LASER_PWM_PIN conflicts with CONTROLLERFAN_PIN." #elif _PIN_CONFLICT(MOTOR_CURRENT_PWM_XY) - #error "SPINDLE_LASER_PWM_PIN conflicts with MOTOR_CURRENT_PWM_XY." + #error "SPINDLE_LASER_PWM_PIN conflicts with MOTOR_CURRENT_PWM_XY_PIN." #elif _PIN_CONFLICT(MOTOR_CURRENT_PWM_Z) - #error "SPINDLE_LASER_PWM_PIN conflicts with MOTOR_CURRENT_PWM_Z." + #error "SPINDLE_LASER_PWM_PIN conflicts with MOTOR_CURRENT_PWM_Z_PIN." #elif _PIN_CONFLICT(MOTOR_CURRENT_PWM_E) - #error "SPINDLE_LASER_PWM_PIN conflicts with MOTOR_CURRENT_PWM_E." + #error "SPINDLE_LASER_PWM_PIN conflicts with MOTOR_CURRENT_PWM_E_PIN." #endif #endif #undef _PIN_CONFLICT diff --git a/Marlin/src/module/stepper.cpp b/Marlin/src/module/stepper.cpp index f55465ea56..3ee2d6e91c 100644 --- a/Marlin/src/module/stepper.cpp +++ b/Marlin/src/module/stepper.cpp @@ -3673,7 +3673,7 @@ void Stepper::report_positions() { #if HAS_MOTOR_CURRENT_SPI || HAS_MOTOR_CURRENT_PWM void Stepper::set_digipot_current(const uint8_t driver, const int16_t current) { - if (WITHIN(driver, 0, MOTOR_CURRENT_COUNT - 1)) + if (WITHIN(driver, 0, COUNT(motor_current_setting) - 1)) motor_current_setting[driver] = current; // update motor_current_setting if (!initialized) return; From d638ee02c6ece3df4c552866ce1f1009a00b5bc1 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Tue, 1 Apr 2025 00:34:19 +0000 Subject: [PATCH 70/74] [cron] Bump distribution date (2025-04-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 d49c6c4e3b..bb3996fb73 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-03-31" +//#define STRING_DISTRIBUTION_DATE "2025-04-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 5ee57c2fc0..64a8aded74 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-03-31" + #define STRING_DISTRIBUTION_DATE "2025-04-01" #endif /** From 766dfda80e57335d11aee8501cc36606f7d2d2f9 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 31 Mar 2025 21:55:58 -0500 Subject: [PATCH 71/74] =?UTF-8?q?=F0=9F=94=A8=F0=9F=A9=B9=20Pass=20Ultipan?= =?UTF-8?q?el=20with=20ADC=5FKEYPAD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/inc/SanityCheck.h | 2 +- buildroot/tests/sanguino1284p | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 62e16b0156..cdd87b1e93 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -1890,7 +1890,7 @@ static_assert(NUM_SERVOS <= NUM_SERVO_PLUGS, "NUM_SERVOS (or some servo index) i /** * ULTIPANEL encoder */ -#if IS_ULTIPANEL && NONE(HAS_ROTARY_ENCODER, SR_LCD_2W_NL, SR_LCD_3W_NL) && !PIN_EXISTS(SHIFT_CLK) +#if IS_ULTIPANEL && NONE(HAS_ROTARY_ENCODER, SR_LCD_2W_NL, SR_LCD_3W_NL) && !ANY_PIN(SHIFT_CLK, ADC_KEYPAD) #error "ULTIPANEL controllers require some kind of encoder." #endif diff --git a/buildroot/tests/sanguino1284p b/buildroot/tests/sanguino1284p index 345383cc70..0e861892d8 100755 --- a/buildroot/tests/sanguino1284p +++ b/buildroot/tests/sanguino1284p @@ -14,7 +14,7 @@ opt_set MOTHERBOARD BOARD_SANGUINOLOLU_12 \ LCD_LANGUAGE de \ CONTROLLER_FAN_PIN 27 opt_enable MINIPANEL USE_CONTROLLER_FAN CONTROLLER_FAN_EDITABLE -exec_test $1 $2 "Default Configuration | MINIPANAL | CONTROLLER_FAN" "$3" +exec_test $1 $2 "Default Configuration | MINIPANEL | CONTROLLER_FAN" "$3" # # Start with default configurations... From 99b790cc92a3af0c58058271d3669723149c178d Mon Sep 17 00:00:00 2001 From: Boyd Date: Mon, 31 Mar 2025 20:30:23 -0700 Subject: [PATCH 72/74] =?UTF-8?q?=F0=9F=94=A8=20Fix=20GCC14=20/=20C++23=20?= =?UTF-8?q?volatile=20warnings=20(#27768)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/module/planner.cpp | 4 +++- Marlin/src/module/planner.h | 6 +++++- ini/gd32.ini | 1 - 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/Marlin/src/module/planner.cpp b/Marlin/src/module/planner.cpp index 630557180b..561d13fa2a 100644 --- a/Marlin/src/module/planner.cpp +++ b/Marlin/src/module/planner.cpp @@ -1582,7 +1582,9 @@ void Planner::quick_stop() { const bool was_enabled = stepper.suspend(); // Drop all queue entries - block_buffer_nonbusy = block_buffer_head = block_buffer_tail; + const uint8_t tail_value = block_buffer_tail; // Read tail value once + block_buffer_head = tail_value; + block_buffer_nonbusy = tail_value; // Restart the block delay for the first movement - As the queue was // forced to empty, there's no risk the ISR will touch this. diff --git a/Marlin/src/module/planner.h b/Marlin/src/module/planner.h index b2df5824de..318be33131 100644 --- a/Marlin/src/module/planner.h +++ b/Marlin/src/module/planner.h @@ -816,7 +816,11 @@ class Planner { FORCE_INLINE static uint8_t nonbusy_movesplanned() { return block_dec_mod(block_buffer_head, block_buffer_nonbusy); } // Remove all blocks from the buffer - FORCE_INLINE static void clear_block_buffer() { block_buffer_nonbusy = block_buffer_head = block_buffer_tail = 0; } + FORCE_INLINE static void clear_block_buffer() { + block_buffer_tail = 0; + block_buffer_head = 0; + block_buffer_nonbusy = 0; + } // Check if movement queue is full FORCE_INLINE static bool is_full() { return block_buffer_tail == next_block_index(block_buffer_head); } diff --git a/ini/gd32.ini b/ini/gd32.ini index 2e5bcea3b5..1286772786 100644 --- a/ini/gd32.ini +++ b/ini/gd32.ini @@ -21,7 +21,6 @@ build_flags = -std=gnu++23 -DADC_RESOLUTION=12 -DCORE_DEBUG -Wno-deprecated-declarations - -Wno-volatile extra_scripts = ${common.extra_scripts} # From 59423da42fe3d94003ec98e2de9bb432bf350512 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 31 Mar 2025 21:19:14 -0500 Subject: [PATCH 73/74] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20HAS?= =?UTF-8?q?=5FMOTOR=5FCURRENT=5FPWM=5FZ?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/HAL/DUE/fastio/G2_PWM.cpp | 25 ++--- .../src/gcode/feature/digipot/M907-M910.cpp | 96 +++++++++++++------ Marlin/src/inc/Conditionals-5-post.h | 5 +- Marlin/src/lcd/menu/menu_advanced.cpp | 2 +- Marlin/src/module/stepper.cpp | 6 +- Marlin/src/pins/pinsDebug_list.h | 2 +- 6 files changed, 88 insertions(+), 48 deletions(-) diff --git a/Marlin/src/HAL/DUE/fastio/G2_PWM.cpp b/Marlin/src/HAL/DUE/fastio/G2_PWM.cpp index 5cf86f147c..403e3356e1 100644 --- a/Marlin/src/HAL/DUE/fastio/G2_PWM.cpp +++ b/Marlin/src/HAL/DUE/fastio/G2_PWM.cpp @@ -56,16 +56,12 @@ #else #define G2_PWM_Y 0 #endif -#if PIN_EXISTS(MOTOR_CURRENT_PWM_Z) +#if HAS_MOTOR_CURRENT_PWM_Z #define G2_PWM_Z 1 #else #define G2_PWM_Z 0 #endif -#if HAS_MOTOR_CURRENT_PWM_E - #define G2_PWM_E 1 -#else - #define G2_PWM_E 0 -#endif +#define G2_PWM_E HAS_MOTOR_CURRENT_PWM_E #define G2_MASK_X(V) (G2_PWM_X * (V)) #define G2_MASK_Y(V) (G2_PWM_Y * (V)) #define G2_MASK_Z(V) (G2_PWM_Z * (V)) @@ -80,17 +76,22 @@ PWM_map ISR_table[NUM_PWMS] = PWM_MAP_INIT; void Stepper::digipot_init() { - #if PIN_EXISTS(MOTOR_CURRENT_PWM_X) - OUT_WRITE(MOTOR_CURRENT_PWM_X_PIN, 0); // init pins + #if G2_PWM_X + OUT_WRITE(MOTOR_CURRENT_PWM_X_PIN, LOW); // init pins #endif - #if PIN_EXISTS(MOTOR_CURRENT_PWM_Y) - OUT_WRITE(MOTOR_CURRENT_PWM_Y_PIN, 0); + #if G2_PWM_Y + OUT_WRITE(MOTOR_CURRENT_PWM_Y_PIN, LOW); #endif #if G2_PWM_Z - OUT_WRITE(MOTOR_CURRENT_PWM_Z_PIN, 0); + OUT_WRITE(MOTOR_CURRENT_PWM_Z_PIN, LOW); #endif #if G2_PWM_E - OUT_WRITE(MOTOR_CURRENT_PWM_E_PIN, 0); + #if PIN_EXISTS(MOTOR_CURRENT_PWM_E) + OUT_WRITE(MOTOR_CURRENT_PWM_E_PIN, LOW); + #endif + #if PIN_EXISTS(MOTOR_CURRENT_PWM_E0) + OUT_WRITE(MOTOR_CURRENT_PWM_E0_PIN, LOW); + #endif #endif #define WPKEY (0x50574D << 8) // “PWM” in ASCII diff --git a/Marlin/src/gcode/feature/digipot/M907-M910.cpp b/Marlin/src/gcode/feature/digipot/M907-M910.cpp index b1bd9b4f95..a73f88ca89 100644 --- a/Marlin/src/gcode/feature/digipot/M907-M910.cpp +++ b/Marlin/src/gcode/feature/digipot/M907-M910.cpp @@ -46,6 +46,7 @@ * Set percentage of max current for all axes (Requires HAS_DIGIPOT_DAC) */ void GcodeSuite::M907() { + #if HAS_MOTOR_CURRENT_SPI if (!parser.seen("BS" STR_AXES_LOGICAL)) @@ -56,8 +57,9 @@ void GcodeSuite::M907() { for (uint8_t i = 0; i < MOTOR_CURRENT_COUNT; ++i) stepper.set_digipot_current(i, parser.value_int()); - // X Y Z (I J K U V W) E (map to drivers according to DIGIPOT_CHANNELS. - // Default with NUM_AXES 3: map X Y Z E to X Y Z E0) + // X Y Z I J K U V W E + // Map to drivers according to pots addresses. + // Default with NUM_AXES 3: map X Y Z E to X Y Z E0. LOOP_LOGICAL_AXES(i) if (parser.seenval(IAXIS_CHAR(i))) stepper.set_digipot_current(i, parser.value_int()); @@ -83,56 +85,88 @@ void GcodeSuite::M907() { #define HAS_X_Y_XY_I_J_K_U_V_W 1 #endif - #if HAS_X_Y_XY_I_J_K_U_V_W || HAS_MOTOR_CURRENT_PWM_E || PIN_EXISTS(MOTOR_CURRENT_PWM_Z) + #if ANY(HAS_X_Y_XY_I_J_K_U_V_W, HAS_MOTOR_CURRENT_PWM_E, HAS_MOTOR_CURRENT_PWM_Z) if (!parser.seen("S" #if HAS_X_Y_XY_I_J_K_U_V_W NUM_AXIS_GANG("X", "Y",, "I", "J", "K", "U", "V", "W") #endif - #if PIN_EXISTS(MOTOR_CURRENT_PWM_Z) - "Z" - #endif + TERN_(HAS_MOTOR_CURRENT_PWM_Z, "Z") TERN_(HAS_MOTOR_CURRENT_PWM_E, "E") )) return M907_report(); - if (parser.seenval('S')) for (uint8_t a = 0; a < MOTOR_CURRENT_COUNT; ++a) stepper.set_digipot_current(a, parser.value_int()); + // S - Set all stepper current to the same value + if (parser.seenval('S')) { + const int16_t v = parser.value_int(); + for (uint8_t a = 0; a < MOTOR_CURRENT_COUNT; ++a) + stepper.set_digipot_current(a, v); + } - #if HAS_X_Y_XY_I_J_K_U_V_W - if (NUM_AXIS_GANG( - parser.seenval('X'), || parser.seenval('Y'), || false, - || parser.seenval('I'), || parser.seenval('J'), || parser.seenval('K'), - || parser.seenval('U'), || parser.seenval('V'), || parser.seenval('W') - )) stepper.set_digipot_current(0, parser.value_int()); - #endif - #if PIN_EXISTS(MOTOR_CURRENT_PWM_Z) - if (parser.seenval('Z')) stepper.set_digipot_current(1, parser.value_int()); - #endif - #if HAS_MOTOR_CURRENT_PWM_E - if (parser.seenval('E')) stepper.set_digipot_current(2, parser.value_int()); - #endif + // X Y I J K U V W - All aliases to set the current for "most axes." + // Only the value of the last given parameter is used. + if (ENABLED(HAS_X_Y_XY_I_J_K_U_V_W) && NUM_AXIS_GANG( + parser.seenval('X'), || parser.seenval('Y'), || false, + || parser.seenval('I'), || parser.seenval('J'), || parser.seenval('K'), + || parser.seenval('U'), || parser.seenval('V'), || parser.seenval('W') + )) + stepper.set_digipot_current(0, parser.value_int()); + + // Z - Set the current just for the Z axis + if (TERN0(HAS_MOTOR_CURRENT_PWM_Z, parser.seenval('Z'))) + stepper.set_digipot_current(1, parser.value_int()); + + // Z - Set the current just for the Extruder + if (TERN0(HAS_MOTOR_CURRENT_PWM_E, parser.seenval('E'))) + stepper.set_digipot_current(2, parser.value_int()); #endif #endif // HAS_MOTOR_CURRENT_PWM #if HAS_MOTOR_CURRENT_I2C - // this one uses actual amps in floating point - if (parser.seenval('S')) for (uint8_t q = 0; q < DIGIPOT_I2C_NUM_CHANNELS; ++q) digipot_i2c.set_current(q, parser.value_float()); - LOOP_LOGICAL_AXES(i) if (parser.seenval(IAXIS_CHAR(i))) digipot_i2c.set_current(i, parser.value_float()); // X Y Z (I J K U V W) E (map to drivers according to pots adresses. Default with NUM_AXES 3 X Y Z E: map to X Y Z E0) + // This current driver takes actual Amps in floating point + // rather than milli-amps or some scalar unit. + + // S - Set the same current in Amps on all channels + if (parser.seenval('S')) { + const float v = parser.value_float(); + for (uint8_t q = 0; q < DIGIPOT_I2C_NUM_CHANNELS; ++q) + digipot_i2c.set_current(q, v); + } + + // X Y Z I J K U V W E + // Map to drivers according to pots addresses. + // Default with NUM_AXES 3: map X Y Z E to X Y Z E0. + LOOP_LOGICAL_AXES(i) + if (parser.seenval(IAXIS_CHAR(i))) + digipot_i2c.set_current(i, parser.value_float()); + // Additional extruders use B,C,D. - // TODO: Change these parameters because 'E' is used and because 'D' should be reserved for debugging. B? + // TODO: Make parameters work like other axis-specific / stepper-specific. See above. #if E_STEPPERS >= 2 for (uint8_t i = E_AXIS + 1; i < _MAX(DIGIPOT_I2C_NUM_CHANNELS, (NUM_AXES + 3)); i++) - if (parser.seenval('B' + i - (E_AXIS + 1))) digipot_i2c.set_current(i, parser.value_float()); + if (parser.seenval('B' + i - (E_AXIS + 1))) + digipot_i2c.set_current(i, parser.value_float()); #endif - #endif + + #endif // HAS_MOTOR_CURRENT_I2C #if HAS_MOTOR_CURRENT_DAC + + // S - Set the same current percentage on all axes if (parser.seenval('S')) { const float dac_percent = parser.value_float(); - LOOP_LOGICAL_AXES(i) stepper_dac.set_current_percent(i, dac_percent); + LOOP_LOGICAL_AXES(i) + stepper_dac.set_current_percent(i, dac_percent); } - LOOP_LOGICAL_AXES(i) if (parser.seenval(IAXIS_CHAR(i))) stepper_dac.set_current_percent(i, parser.value_float()); // X Y Z (I J K U V W) E (map to drivers according to DAC_STEPPER_ORDER. Default with NUM_AXES 3: X Y Z E map to X Y Z E0) + + // X Y Z I J K U V W E + // Map to drivers according to pots addresses. + // Default with NUM_AXES 3: map X Y Z E to X Y Z E0. + LOOP_LOGICAL_AXES(i) + if (parser.seenval(IAXIS_CHAR(i))) + stepper_dac.set_current_percent(i, parser.value_float()); + #endif } @@ -144,8 +178,10 @@ void GcodeSuite::M907() { report_heading_etc(forReplay, F(STR_STEPPER_MOTOR_CURRENTS)); #if HAS_MOTOR_CURRENT_PWM SERIAL_ECHOLNPGM_P( // PWM-based has 3 values: - PSTR(" M907 X"), stepper.motor_current_setting[0] // X, Y, (I, J, K, U, V, W) - , SP_Z_STR, stepper.motor_current_setting[1] // Z + PSTR(" M907 X"), stepper.motor_current_setting[0] // X, Y, (I, J, K, U, V, W) + #if HAS_MOTOR_CURRENT_PWM_Z + , SP_Z_STR, stepper.motor_current_setting[1] // Z + #endif #if HAS_MOTOR_CURRENT_PWM_E , SP_E_STR, stepper.motor_current_setting[2] // E #endif diff --git a/Marlin/src/inc/Conditionals-5-post.h b/Marlin/src/inc/Conditionals-5-post.h index f83c063d11..9b16f515d6 100644 --- a/Marlin/src/inc/Conditionals-5-post.h +++ b/Marlin/src/inc/Conditionals-5-post.h @@ -2993,7 +2993,10 @@ #if ANY_PIN(MOTOR_CURRENT_PWM_E, MOTOR_CURRENT_PWM_E0, MOTOR_CURRENT_PWM_E1) #define HAS_MOTOR_CURRENT_PWM_E 1 #endif -#if HAS_MOTOR_CURRENT_PWM_E || ANY_PIN(MOTOR_CURRENT_PWM_X, MOTOR_CURRENT_PWM_Y, MOTOR_CURRENT_PWM_XY, MOTOR_CURRENT_PWM_Z, MOTOR_CURRENT_PWM_I, MOTOR_CURRENT_PWM_J, MOTOR_CURRENT_PWM_K, MOTOR_CURRENT_PWM_U, MOTOR_CURRENT_PWM_V, MOTOR_CURRENT_PWM_W) +#if PIN_EXISTS(MOTOR_CURRENT_PWM_Z) + #define HAS_MOTOR_CURRENT_PWM_Z 1 +#endif +#if HAS_MOTOR_CURRENT_PWM_Z || HAS_MOTOR_CURRENT_PWM_E || ANY_PIN(MOTOR_CURRENT_PWM_X, MOTOR_CURRENT_PWM_Y, MOTOR_CURRENT_PWM_XY, MOTOR_CURRENT_PWM_I, MOTOR_CURRENT_PWM_J, MOTOR_CURRENT_PWM_K, MOTOR_CURRENT_PWM_U, MOTOR_CURRENT_PWM_V, MOTOR_CURRENT_PWM_W) #define HAS_MOTOR_CURRENT_PWM 1 #endif diff --git a/Marlin/src/lcd/menu/menu_advanced.cpp b/Marlin/src/lcd/menu/menu_advanced.cpp index b886902d91..99ece89f27 100644 --- a/Marlin/src/lcd/menu/menu_advanced.cpp +++ b/Marlin/src/lcd/menu/menu_advanced.cpp @@ -88,7 +88,7 @@ void menu_backlash(); #if ANY_PIN(MOTOR_CURRENT_PWM_XY, MOTOR_CURRENT_PWM_X, MOTOR_CURRENT_PWM_Y) EDIT_CURRENT_PWM(STR_A STR_B, 0); #endif - #if PIN_EXISTS(MOTOR_CURRENT_PWM_Z) + #if HAS_MOTOR_CURRENT_PWM_Z EDIT_CURRENT_PWM(STR_C, 1); #endif #if HAS_MOTOR_CURRENT_PWM_E diff --git a/Marlin/src/module/stepper.cpp b/Marlin/src/module/stepper.cpp index 3ee2d6e91c..85c7521960 100644 --- a/Marlin/src/module/stepper.cpp +++ b/Marlin/src/module/stepper.cpp @@ -3654,7 +3654,7 @@ void Stepper::report_positions() { #if ANY_PIN(MOTOR_CURRENT_PWM_XY, MOTOR_CURRENT_PWM_X, MOTOR_CURRENT_PWM_Y, MOTOR_CURRENT_PWM_I, MOTOR_CURRENT_PWM_J, MOTOR_CURRENT_PWM_K, MOTOR_CURRENT_PWM_U, MOTOR_CURRENT_PWM_V, MOTOR_CURRENT_PWM_W) case 0: #endif - #if PIN_EXISTS(MOTOR_CURRENT_PWM_Z) + #if HAS_MOTOR_CURRENT_PWM_Z case 1: #endif #if HAS_MOTOR_CURRENT_PWM_E @@ -3719,7 +3719,7 @@ void Stepper::report_positions() { #endif break; case 1: - #if PIN_EXISTS(MOTOR_CURRENT_PWM_Z) + #if HAS_MOTOR_CURRENT_PWM_Z _WRITE_CURRENT_PWM(Z); #endif break; @@ -3784,7 +3784,7 @@ void Stepper::report_positions() { #if PIN_EXISTS(MOTOR_CURRENT_PWM_W) INIT_CURRENT_PWM(W); #endif - #if PIN_EXISTS(MOTOR_CURRENT_PWM_Z) + #if HAS_MOTOR_CURRENT_PWM_Z INIT_CURRENT_PWM(Z); #endif #if PIN_EXISTS(MOTOR_CURRENT_PWM_E) diff --git a/Marlin/src/pins/pinsDebug_list.h b/Marlin/src/pins/pinsDebug_list.h index fe7f1d21ee..ad17fe2436 100644 --- a/Marlin/src/pins/pinsDebug_list.h +++ b/Marlin/src/pins/pinsDebug_list.h @@ -1119,7 +1119,7 @@ #if PIN_EXISTS(MOTOR_CURRENT_PWM_XY) REPORT_NAME_DIGITAL(__LINE__, MOTOR_CURRENT_PWM_XY_PIN) #endif -#if PIN_EXISTS(MOTOR_CURRENT_PWM_Z) +#if HAS_MOTOR_CURRENT_PWM_Z REPORT_NAME_DIGITAL(__LINE__, MOTOR_CURRENT_PWM_Z_PIN) #endif #if PIN_EXISTS(MOTOR_CURRENT_PWM_I) From 2004198b078e8809540e3cd56dfaaf3bbf610ee3 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 31 Mar 2025 22:53:31 -0500 Subject: [PATCH 74/74] =?UTF-8?q?=F0=9F=94=A8=F0=9F=A9=B9=20Pass=20Ultipan?= =?UTF-8?q?el=20with=20TOUCH=5FSCREEN?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/inc/SanityCheck.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index cdd87b1e93..b09bc9854a 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -1888,9 +1888,9 @@ static_assert(NUM_SERVOS <= NUM_SERVO_PLUGS, "NUM_SERVOS (or some servo index) i #endif /** - * ULTIPANEL encoder + * ULTIPANEL expects an encoder */ -#if IS_ULTIPANEL && NONE(HAS_ROTARY_ENCODER, SR_LCD_2W_NL, SR_LCD_3W_NL) && !ANY_PIN(SHIFT_CLK, ADC_KEYPAD) +#if IS_ULTIPANEL && NONE(HAS_ROTARY_ENCODER, SR_LCD_2W_NL, SR_LCD_3W_NL, TOUCH_SCREEN) && !ANY_PIN(SHIFT_CLK, ADC_KEYPAD) #error "ULTIPANEL controllers require some kind of encoder." #endif