From 59cee1cb87903f0c7d12f733c00acd42c7d88661 Mon Sep 17 00:00:00 2001 From: ellensp <530024+ellensp@users.noreply.github.com> Date: Sun, 9 Nov 2025 12:20:58 +1300 Subject: [PATCH 1/8] =?UTF-8?q?=F0=9F=94=A7=20Custom=20boot=20screen=20for?= =?UTF-8?q?=20Graphical=20TFT=20(#28160)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/Configuration_adv.h | 2 +- Marlin/src/inc/SanityCheck.h | 4 +- Marlin/src/lcd/tft/canvas.cpp | 11 +++++ Marlin/src/lcd/tft/tft_image.cpp | 69 +++++++++++++++--------------- Marlin/src/lcd/tft/tft_image.h | 11 ++++- Marlin/src/lcd/tft/ui_color_ui.cpp | 14 ++++++ Marlin/src/lcd/tft/ui_common.h | 29 +++++++++++-- 7 files changed, 99 insertions(+), 41 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index ae4acaa56b..ffcecc3533 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1628,7 +1628,7 @@ #if HAS_MARLINUI_U8GLIB //#define BOOT_MARLIN_LOGO_ANIMATED // Animated Marlin logo. Costs ~3260 (or ~940) bytes of flash. #endif - #if ANY(HAS_MARLINUI_U8GLIB, TOUCH_UI_FTDI_EVE, HAS_MARLINUI_HD44780) + #if ANY(HAS_MARLINUI_U8GLIB, TOUCH_UI_FTDI_EVE, HAS_MARLINUI_HD44780, HAS_GRAPHICAL_TFT) //#define SHOW_CUSTOM_BOOTSCREEN // Show the bitmap in Marlin/_Bootscreen.h on startup. #endif #endif diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index e0a42cdf37..f5c593fccd 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -399,8 +399,8 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L /** * Custom Boot and Status screens */ -#if ENABLED(SHOW_CUSTOM_BOOTSCREEN) && NONE(HAS_MARLINUI_HD44780, HAS_MARLINUI_U8GLIB, TOUCH_UI_FTDI_EVE, IS_DWIN_MARLINUI) - #error "SHOW_CUSTOM_BOOTSCREEN requires Character LCD, Graphical LCD, or TOUCH_UI_FTDI_EVE." +#if ENABLED(SHOW_CUSTOM_BOOTSCREEN) && NONE(TFT_COLOR_UI, HAS_MARLINUI_HD44780, HAS_MARLINUI_U8GLIB, TOUCH_UI_FTDI_EVE, IS_DWIN_MARLINUI) + #error "SHOW_CUSTOM_BOOTSCREEN requires Character LCD, Graphical LCD, TOUCH_UI_FTDI_EVE, or TFT_COLOR_UI." #elif ENABLED(SHOW_CUSTOM_BOOTSCREEN) && DISABLED(SHOW_BOOTSCREEN) #error "SHOW_CUSTOM_BOOTSCREEN requires SHOW_BOOTSCREEN." #elif ENABLED(CUSTOM_STATUS_SCREEN_IMAGE) && !HAS_MARLINUI_U8GLIB diff --git a/Marlin/src/lcd/tft/canvas.cpp b/Marlin/src/lcd/tft/canvas.cpp index 0f77149a5a..a237bb8434 100644 --- a/Marlin/src/lcd/tft/canvas.cpp +++ b/Marlin/src/lcd/tft/canvas.cpp @@ -134,11 +134,22 @@ void Canvas::addImage(int16_t x, int16_t y, MarlinImage image, uint16_t *colors) uint32_t rle_offset; } rle_state; + #if ENABLED(SHOW_CUSTOM_BOOTSCREEN) + static MarlinImage last_image = noImage; + #endif + // RLE16 HIGHCOLOR - 16 bits per pixel if (color_mode == RLE16) { uint8_t *bytedata = (uint8_t *)images[image].data; if (!bytedata) return; + #if ENABLED(SHOW_CUSTOM_BOOTSCREEN) // Reset RLE state if a different image + if (image != last_image) { + rle_state.has_rle_state = false; + last_image = image; + } + #endif + // Loop through the image data advancing the row and column as needed int16_t srcy = 0, srcx = 0, // Image data line / column index dsty = y, dstx = x; // Destination line / column index diff --git a/Marlin/src/lcd/tft/tft_image.cpp b/Marlin/src/lcd/tft/tft_image.cpp index 1d287f4ba6..25fefbf8c5 100644 --- a/Marlin/src/lcd/tft/tft_image.cpp +++ b/Marlin/src/lcd/tft/tft_image.cpp @@ -30,40 +30,41 @@ const tImage NoLogo = { nullptr, 0, 0, NOCOLORS }; const tImage images[imgCount] = { - TERN(SHOW_BOOTSCREEN, BOOTSCREEN_LOGO, NoLogo), // imgBootScreen - HotEnd_64x64x4, // imgHotEnd - Bed_64x64x4, // imgBed - Bed_Heated_64x64x4, // imgBedHeated - Chamber_64x64x4, // imgChamber - Chamber_Heated_64x64x4, // imgChamberHeated - Fan0_64x64x4, // imgFanIdle - Fan_Slow0_64x64x4, // imgFanSlow0 - Fan_Slow1_64x64x4, // imgFanSlow1 - Fan_Fast0_64x64x4, // imgFanFast0 - Fan_Fast1_64x64x4, // imgFanFast1 - Feedrate_32x32x4, // imgFeedRate - Flowrate_32x32x4, // imgFlowRate - SD_64x64x4, // imgSD - Menu_64x64x4, // imgMenu - Settings_64x64x4, // imgSettings - Directory_32x32x4, // imgDirectory - Confirm_64x64x4, // imgConfirm - Cancel_64x64x4, // imgCancel - Increase_64x64x4, // imgIncrease - Decrease_64x64x4, // imgDecrease - Back_32x32x4, // imgBack - Up_32x32x4, // imgUp - Down_32x32x4, // imgDown - Left_32x32x4, // imgLeft - Right_32x32x4, // imgRight - Refresh_32x32x4, // imgRefresh - Leveling_32x32x4, // imgLeveling - Slider8x16x4, // imgSlider - Home_64x64x4, // imgHome - BtnRounded_64x52x4, // imgBtn52Rounded - BtnRounded_42x39x4, // imgBtn39Rounded - Time_Elapsed_32x32x4, // imgTimeElapsed - Time_Remaining_32x32x4, // imgTimeRemaining + TERN(SHOW_CUSTOM_BOOTSCREEN, CUSTOM_BOOTSCREEN, NoLogo), // imgCustomBoot + TERN(SHOW_BOOTSCREEN, BOOTSCREEN_LOGO, NoLogo), // imgBootScreen + HotEnd_64x64x4, // imgHotEnd + Bed_64x64x4, // imgBed + Bed_Heated_64x64x4, // imgBedHeated + Chamber_64x64x4, // imgChamber + Chamber_Heated_64x64x4, // imgChamberHeated + Fan0_64x64x4, // imgFanIdle + Fan_Slow0_64x64x4, // imgFanSlow0 + Fan_Slow1_64x64x4, // imgFanSlow1 + Fan_Fast0_64x64x4, // imgFanFast0 + Fan_Fast1_64x64x4, // imgFanFast1 + Feedrate_32x32x4, // imgFeedRate + Flowrate_32x32x4, // imgFlowRate + SD_64x64x4, // imgSD + Menu_64x64x4, // imgMenu + Settings_64x64x4, // imgSettings + Directory_32x32x4, // imgDirectory + Confirm_64x64x4, // imgConfirm + Cancel_64x64x4, // imgCancel + Increase_64x64x4, // imgIncrease + Decrease_64x64x4, // imgDecrease + Back_32x32x4, // imgBack + Up_32x32x4, // imgUp + Down_32x32x4, // imgDown + Left_32x32x4, // imgLeft + Right_32x32x4, // imgRight + Refresh_32x32x4, // imgRefresh + Leveling_32x32x4, // imgLeveling + Slider8x16x4, // imgSlider + Home_64x64x4, // imgHome + BtnRounded_64x52x4, // imgBtn52Rounded + BtnRounded_42x39x4, // imgBtn39Rounded + Time_Elapsed_32x32x4, // imgTimeElapsed + Time_Remaining_32x32x4, // imgTimeRemaining }; #endif // HAS_GRAPHICAL_TFT diff --git a/Marlin/src/lcd/tft/tft_image.h b/Marlin/src/lcd/tft/tft_image.h index 8abca6f330..e1f078a90b 100644 --- a/Marlin/src/lcd/tft/tft_image.h +++ b/Marlin/src/lcd/tft/tft_image.h @@ -25,12 +25,21 @@ #if ENABLED(COMPACT_MARLIN_BOOT_LOGO) #define MARLIN_LOGO_CHOSEN(W,H) { (void *)marlin_logo_##W##x##H##x16_rle16, W, H, RLE16 } + #if ENABLED(SHOW_CUSTOM_BOOTSCREEN) + #define _CUSTOM_BOOTSCREEN_CHOSEN(W,H) { (void *)custom_bootscreen_##W##x##H##x16_rle16, W, H, RLE16 } + #define CUSTOM_BOOTSCREEN_CHOSEN(W,H) _CUSTOM_BOOTSCREEN_CHOSEN(W,H) + #endif #else #define MARLIN_LOGO_CHOSEN(W,H) { (void *)marlin_logo_##W##x##H##x16, W, H, HIGHCOLOR } + #if ENABLED(SHOW_CUSTOM_BOOTSCREEN) + #define _CUSTOM_BOOTSCREEN_CHOSEN(W,H){ (void *)custom_bootscreen_##W##x##H##x16, W, H, HIGHCOLOR } + #define CUSTOM_BOOTSCREEN_CHOSEN(W,H) _CUSTOM_BOOTSCREEN_CHOSEN(W,H) + #endif #endif enum MarlinImage : uint8_t { - imgBootScreen = 0x00, // BOOTSCREEN_LOGO / NoLogo + imgCustomBoot = 0x00, // CUSTOM_BOOTSCREEN + imgBootScreen, // BOOTSCREEN_LOGO / NoLogo imgHotEnd, // HotEnd_64x64x4 imgBed, // Bed_64x64x4 imgBedHeated, // Bed_Heated_64x64x4 diff --git a/Marlin/src/lcd/tft/ui_color_ui.cpp b/Marlin/src/lcd/tft/ui_color_ui.cpp index 6c90cb6c36..3287285f69 100644 --- a/Marlin/src/lcd/tft/ui_color_ui.cpp +++ b/Marlin/src/lcd/tft/ui_color_ui.cpp @@ -64,6 +64,20 @@ void MarlinUI::tft_idle() { #if ENABLED(SHOW_BOOTSCREEN) void MarlinUI::show_bootscreen() { + #if ENABLED(SHOW_CUSTOM_BOOTSCREEN) + tft.queue.reset(); + tft.canvas(CUSTOM_BOOTSCREEN_X, CUSTOM_BOOTSCREEN_Y, CUSTOM_BOOTSCREEN_WIDTH, CUSTOM_BOOTSCREEN_HEIGHT); + tft.set_background(COLOR_BACKGROUND); + tft.add_image(0, 0, imgCustomBoot); + tft.queue.sync(); + #ifndef CUSTOM_BOOTSCREEN_TIMEOUT + #define CUSTOM_BOOTSCREEN_TIMEOUT 2500 + #endif + #if CUSTOM_BOOTSCREEN_TIMEOUT + safe_delay(CUSTOM_BOOTSCREEN_TIMEOUT); + #endif + #endif + tft.queue.reset(); tft.canvas(0, 0, TFT_WIDTH, TFT_HEIGHT); diff --git a/Marlin/src/lcd/tft/ui_common.h b/Marlin/src/lcd/tft/ui_common.h index ef26d6745f..f43dc95fb2 100644 --- a/Marlin/src/lcd/tft/ui_common.h +++ b/Marlin/src/lcd/tft/ui_common.h @@ -30,14 +30,37 @@ #include "tft.h" #include "tft_image.h" +#if ENABLED(SHOW_CUSTOM_BOOTSCREEN) + + #include "../../../_Bootscreen.h" + + #ifndef CUSTOM_BOOTSCREEN + #define CUSTOM_BOOTSCREEN CustomBootscreen + #endif + #ifndef CUSTOM_BOOTSCREEN_WIDTH + #define CUSTOM_BOOTSCREEN_WIDTH TFT_WIDTH + #endif + #ifndef CUSTOM_BOOTSCREEN_HEIGHT + #define CUSTOM_BOOTSCREEN_HEIGHT TFT_HEIGHT + #endif + + #ifndef CUSTOM_BOOTSCREEN_X + #define CUSTOM_BOOTSCREEN_X ((TFT_WIDTH - (CUSTOM_BOOTSCREEN_WIDTH)) / 2) + #endif + #ifndef CUSTOM_BOOTSCREEN_Y + #define CUSTOM_BOOTSCREEN_Y ((TFT_HEIGHT - (CUSTOM_BOOTSCREEN_HEIGHT)) / 2) + #endif + + const tImage CustomBootscreen = CUSTOM_BOOTSCREEN_CHOSEN(CUSTOM_BOOTSCREEN_WIDTH, CUSTOM_BOOTSCREEN_HEIGHT); + +#endif // SHOW_CUSTOM_BOOTSCREEN + #if ENABLED(TOUCH_SCREEN) #include "touch.h" extern bool draw_menu_navigation; #else // add_control() function is used to display encoder-controlled elements - enum TouchControlType : uint16_t { - NONE = 0x0000, - }; + enum TouchControlType : uint16_t { NONE = 0x0000 }; #endif #define UI_INCL_(W, H) STRINGIFY_(ui_##W##x##H.h) From cf9f20503080bc9f048f04fc539f673afe7bbe17 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Sun, 9 Nov 2025 01:43:06 +0000 Subject: [PATCH 2/8] [cron] Bump distribution date (2025-11-09) --- Marlin/Version.h | 2 +- Marlin/src/inc/Version.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/Version.h b/Marlin/Version.h index edf9a292d9..c0c9196ea9 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-11-08" +//#define STRING_DISTRIBUTION_DATE "2025-11-09" /** * The protocol for communication to the host. Protocol indicates communication diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 5f4b7b8320..b74c79d301 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-11-08" + #define STRING_DISTRIBUTION_DATE "2025-11-09" #endif /** From 6e01ba3ce8593f6fb75e76b2e69b9c1c5142544e Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 9 Nov 2025 17:33:29 -0600 Subject: [PATCH 3/8] =?UTF-8?q?=F0=9F=A7=91=E2=80=8D=F0=9F=92=BB=20Probe?= =?UTF-8?q?=20code=20refinements?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/Configuration.h | 3 +- Marlin/src/gcode/calibrate/G33.cpp | 6 +-- Marlin/src/inc/Conditionals-5-post.h | 3 ++ Marlin/src/inc/SanityCheck.h | 78 +++++++++++----------------- Marlin/src/module/motion.cpp | 4 +- Marlin/src/module/probe.cpp | 16 +++--- Marlin/src/module/probe.h | 34 +++++++----- 7 files changed, 71 insertions(+), 73 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index e51d16d565..a327c406ef 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -1053,7 +1053,8 @@ // Delta radius and diagonal rod adjustments //#define DELTA_RADIUS_TRIM_TOWER { 0.0, 0.0, 0.0 } // (mm) //#define DELTA_DIAGONAL_ROD_TRIM_TOWER { 0.0, 0.0, 0.0 } // (mm) -#endif + +#endif // DELTA // @section scara diff --git a/Marlin/src/gcode/calibrate/G33.cpp b/Marlin/src/gcode/calibrate/G33.cpp index 1eabb30ffa..0a8dd459ca 100644 --- a/Marlin/src/gcode/calibrate/G33.cpp +++ b/Marlin/src/gcode/calibrate/G33.cpp @@ -380,9 +380,9 @@ static float auto_tune_a(const float dcr) { * With HAS_DELTA_SENSORLESS_PROBING: * Use these flags to calibrate stall sensitivity: * Example: G33 P1 Y Z - to calibrate X only - * X Don't activate stallguard on X - * Y Don't activate stallguard on Y - * Z Don't activate stallguard on Z + * X Don't activate StallGuard on X + * Y Don't activate StallGuard on Y + * Z Don't activate StallGuard on Z * S Save offset_sensorless_adj */ void GcodeSuite::G33() { diff --git a/Marlin/src/inc/Conditionals-5-post.h b/Marlin/src/inc/Conditionals-5-post.h index 4bed697726..77982c2c0b 100644 --- a/Marlin/src/inc/Conditionals-5-post.h +++ b/Marlin/src/inc/Conditionals-5-post.h @@ -3303,6 +3303,9 @@ #if ANY(ADVANCED_PAUSE_FEATURE, PROBING_HEATERS_OFF) #define HEATER_IDLE_HANDLER 1 #endif +#if ENABLED(DELTA) + #undef PROBING_STEPPERS_OFF +#endif #if HAS_BED_PROBE && (ANY(PROBING_HEATERS_OFF, PROBING_STEPPERS_OFF, PROBING_ESTEPPERS_OFF, PROBING_FANS_OFF) || DELAY_BEFORE_PROBING > 0) #define HAS_QUIET_PROBING 1 #endif diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index f5c593fccd..c13c0ded82 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -1277,53 +1277,22 @@ static_assert(NUM_SERVOS <= NUM_SERVO_PLUGS, "NUM_SERVOS (or some servo index) i + (DISABLED(BLTOUCH) && HAS_Z_SERVO_PROBE) \ + COUNT_ENABLED(PROBE_MANUALLY, BLTOUCH, BD_SENSOR, FIX_MOUNTED_PROBE, NOZZLE_AS_PROBE, TOUCH_MI_PROBE, SOLENOID_PROBE, Z_PROBE_ALLEN_KEY, Z_PROBE_SLED, RACK_AND_PINION_PROBE, SENSORLESS_PROBING, MAGLEV4, MAG_MOUNTED_PROBE, BIQU_MICROPROBE_V1, BIQU_MICROPROBE_V2) #error "Please enable only one probe option. See the following errors:" - #if ENABLED(BLTOUCH) - #error "(BLTOUCH is enabled.)" - #elif HAS_Z_SERVO_PROBE - #error "(Z_SERVO_PROBE is enabled.)" - #endif - #if ENABLED(PROBE_MANUALLY) - #error "(PROBE_MANUALLY is enabled.)" - #endif - #if ENABLED(BD_SENSOR) - #error "(BD_SENSOR is enabled.)" - #endif - #if ENABLED(FIX_MOUNTED_PROBE) - #error "(FIX_MOUNTED_PROBE is enabled.)" - #endif - #if ENABLED(NOZZLE_AS_PROBE) - #error "(NOZZLE_AS_PROBE is enabled.)" - #endif - #if ENABLED(TOUCH_MI_PROBE) - #error "(TOUCH_MI_PROBE is enabled.)" - #endif - #if ENABLED(SOLENOID_PROBE) - #error "(SOLENOID_PROBE is enabled.)" - #endif - #if ENABLED(Z_PROBE_ALLEN_KEY) - #error "(Z_PROBE_ALLEN_KEY is enabled.)" - #endif - #if ENABLED(Z_PROBE_SLED) - #error "(Z_PROBE_SLED is enabled.)" - #endif - #if ENABLED(RACK_AND_PINION_PROBE) - #error "(RACK_AND_PINION_PROBE is enabled.)" - #endif - #if ENABLED(SENSORLESS_PROBING) - #error "(SENSORLESS_PROBING is enabled.)" - #endif - #if ENABLED(MAGLEV4) - #error "(MAGLEV4 is enabled.)" - #endif - #if ENABLED(MAG_MOUNTED_PROBE) - #error "(MAG_MOUNTED_PROBE is enabled.)" - #endif - #if ENABLED(BIQU_MICROPROBE_V1) - #error "(BIQU_MICROPROBE_V1 is enabled.)" - #endif - #if ENABLED(BIQU_MICROPROBE_V2) - #error "(BIQU_MICROPROBE_V2 is enabled.)" - #endif + static_assert(DISABLED(BLTOUCH), "(BLTOUCH is enabled.)"); + static_assert(ENABLED(BLTOUCH) || DISABLED(HAS_Z_SERVO_PROBE), "(Z_SERVO_PROBE is enabled.)"); + static_assert(DISABLED(PROBE_MANUALLY), "(PROBE_MANUALLY is enabled.)"); + static_assert(DISABLED(BD_SENSOR), "(BD_SENSOR is enabled.)"); + static_assert(DISABLED(FIX_MOUNTED_PROBE), "(FIX_MOUNTED_PROBE is enabled.)"); + static_assert(DISABLED(NOZZLE_AS_PROBE), "(NOZZLE_AS_PROBE is enabled.)"); + static_assert(DISABLED(TOUCH_MI_PROBE), "(TOUCH_MI_PROBE is enabled.)"); + static_assert(DISABLED(SOLENOID_PROBE), "(SOLENOID_PROBE is enabled.)"); + static_assert(DISABLED(Z_PROBE_ALLEN_KEY), "(Z_PROBE_ALLEN_KEY is enabled.)"); + static_assert(DISABLED(Z_PROBE_SLED), "(Z_PROBE_SLED is enabled.)"); + static_assert(DISABLED(RACK_AND_PINION_PROBE), "(RACK_AND_PINION_PROBE is enabled.)"); + static_assert(DISABLED(SENSORLESS_PROBING), "(SENSORLESS_PROBING is enabled.)"); + static_assert(DISABLED(MAGLEV4), "(MAGLEV4 is enabled.)"); + static_assert(DISABLED(MAG_MOUNTED_PROBE), "(MAG_MOUNTED_PROBE is enabled.)"); + static_assert(DISABLED(BIQU_MICROPROBE_V1), "(BIQU_MICROPROBE_V1 is enabled.)"); + static_assert(DISABLED(BIQU_MICROPROBE_V2), "(BIQU_MICROPROBE_V2 is enabled.)"); #endif #if HAS_BED_PROBE @@ -1500,7 +1469,6 @@ static_assert(NUM_SERVOS <= NUM_SERVO_PLUGS, "NUM_SERVOS (or some servo index) i #elif !PIN_EXISTS(PROBE_ENABLE) #error "BIQU MicroProbe requires a PROBE_ENABLE_PIN." #endif - #if ENABLED(BIQU_MICROPROBE_V1) #if ENABLED(INVERTED_PROBE_STATE) #if Z_MIN_PROBE_ENDSTOP_HIT_STATE != LOW @@ -1518,6 +1486,13 @@ static_assert(NUM_SERVOS <= NUM_SERVO_PLUGS, "NUM_SERVOS (or some servo index) i #error "BIQU_MICROPROBE_V1 requires Z_MIN_ENDSTOP_HIT_STATE HIGH." #endif #endif + #if NONE(ONBOARD_ENDSTOPPULLUPS, ENDSTOPPULLUPS, ENDSTOPPULLUP_ZMIN, ENDSTOPPULLUP_ZMIN_PROBE) + #if USE_Z_MIN_PROBE + #error "BIQU_MICROPROBE_V1 on Z_MIN_PROBE_PIN requires ENDSTOPPULLUP_ZMIN_PROBE, or ENDSTOPPULLUPS." + #else + #error "BIQU_MICROPROBE_V1 on Z_MIN_PIN requires ENDSTOPPULLUP_ZMIN, or ENDSTOPPULLUPS." + #endif + #endif #elif ENABLED(BIQU_MICROPROBE_V2) #if ENABLED(INVERTED_PROBE_STATE) #if Z_MIN_PROBE_ENDSTOP_HIT_STATE != HIGH @@ -1536,6 +1511,13 @@ static_assert(NUM_SERVOS <= NUM_SERVO_PLUGS, "NUM_SERVOS (or some servo index) i #endif #endif #endif + #if NONE(ONBOARD_ENDSTOPPULLUPS, ENDSTOPPULLUPS, ENDSTOPPULLUP_ZMIN, ENDSTOPPULLUP_ZMIN_PROBE) + #if USE_Z_MIN_PROBE + #error "BIQU_MICROPROBE_V2 on Z_MIN_PROBE_PIN requires ENDSTOPPULLUP_ZMIN_PROBE, or ENDSTOPPULLUPS." + #else + #error "BIQU_MICROPROBE_V2 on Z_MIN_PIN requires ENDSTOPPULLUP_ZMIN, or ENDSTOPPULLUPS." + #endif + #endif #endif // BIQU_MICROPROBE_V1 || BIQU_MICROPROBE_V2 /** diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index cb99000451..cf524cbdb9 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -2207,7 +2207,7 @@ void prepare_line_to_destination() { thermalManager.wait_for_hotend_heating(active_extruder); #endif - TERN_(HAS_QUIET_PROBING, if (final_approach) probe.set_probing_paused(true)); + TERN_(HAS_QUIET_PROBING, if (final_approach) probe.set_devices_paused_for_probing(true)); } // Disable stealthChop if used. Enable diag1 pin on driver. @@ -2246,7 +2246,7 @@ void prepare_line_to_destination() { if (is_home_dir) { #if HOMING_Z_WITH_PROBE && HAS_QUIET_PROBING - if (axis == Z_AXIS && final_approach) probe.set_probing_paused(false); + if (axis == Z_AXIS && final_approach) probe.set_devices_paused_for_probing(false); #endif endstops.validate_homing_move(); diff --git a/Marlin/src/module/probe.cpp b/Marlin/src/module/probe.cpp index 937b8ebeeb..ae688a864e 100644 --- a/Marlin/src/module/probe.cpp +++ b/Marlin/src/module/probe.cpp @@ -347,12 +347,16 @@ xyz_pos_t Probe::offset; // Initialized by settings.load #define DELAY_BEFORE_PROBING 25 #endif - void Probe::set_probing_paused(const bool dopause) { + /** + * Optionally turn off noisy components so we get a cleaner probe signal. + * Pause for at least 25ms when preparing to probe (dopause == true). + */ + void Probe::set_devices_paused_for_probing(const bool dopause) { TERN_(PROBING_HEATERS_OFF, thermalManager.pause_heaters(dopause)); TERN_(PROBING_FANS_OFF, thermalManager.set_fans_paused(dopause)); TERN_(PROBING_ESTEPPERS_OFF, if (dopause) stepper.disable_e_steppers()); - #if ENABLED(PROBING_STEPPERS_OFF) && DISABLED(DELTA) - static uint8_t old_trusted; + #if ENABLED(PROBING_STEPPERS_OFF) + static main_axes_bits_t old_trusted; if (dopause) { old_trusted = axes_trusted; stepper.disable_axis(X_AXIS); @@ -660,7 +664,7 @@ bool Probe::probe_down_to_z(const float z, const feedRate_t fr_mm_s) { endstops.enable(true); #endif // SENSORLESS_PROBING - TERN_(HAS_QUIET_PROBING, set_probing_paused(true)); + TERN_(HAS_QUIET_PROBING, set_devices_paused_for_probing(true)); // Move down until the probe is triggered do_blocking_move_to_z(z, fr_mm_s); @@ -668,7 +672,7 @@ bool Probe::probe_down_to_z(const float z, const feedRate_t fr_mm_s) { // Check to see if the probe was triggered const bool probe_triggered = ( #if HAS_DELTA_SENSORLESS_PROBING - endstops.trigger_state() & (_BV(X_MAX) | _BV(Y_MAX) | _BV(Z_MAX)) + PROBE_TRIGGERED() #else TEST(endstops.trigger_state(), Z_MIN_PROBE) #endif @@ -679,7 +683,7 @@ bool Probe::probe_down_to_z(const float z, const feedRate_t fr_mm_s) { if (probe_triggered) refresh_largest_sensorless_adj(); #endif - TERN_(HAS_QUIET_PROBING, set_probing_paused(false)); + TERN_(HAS_QUIET_PROBING, set_devices_paused_for_probing(false)); // Re-enable stealthChop if used. Disable diag1 pin on driver. #if ENABLED(SENSORLESS_PROBING) diff --git a/Marlin/src/module/probe.h b/Marlin/src/module/probe.h index 74904d35c5..d0f0ada34c 100644 --- a/Marlin/src/module/probe.h +++ b/Marlin/src/module/probe.h @@ -33,6 +33,10 @@ #include "../feature/bltouch.h" #endif +#if ANY(BD_SENSOR, HAS_DELTA_SENSORLESS_PROBING) + #include "endstops.h" +#endif + #define DEBUG_OUT ENABLED(DEBUG_LEVELING_FEATURE) #include "../core/debug_out.h" @@ -45,20 +49,24 @@ }; #endif -#if ENABLED(BD_SENSOR) - #include "endstops.h" - #define PROBE_READ() endstops.bdp_state -#elif USE_Z_MIN_PROBE - #define PROBE_READ() READ(Z_MIN_PROBE_PIN) +#if HAS_DELTA_SENSORLESS_PROBING + #define PROBE_READ() (endstops.trigger_state() & (_BV(X_MAX) | _BV(Y_MAX) | _BV(Z_MAX))) + #define PROBE_TRIGGERED() (PROBE_READ() != 0) #else - #define PROBE_READ() READ(Z_MIN_PIN) + #if ENABLED(BD_SENSOR) + #define PROBE_READ() endstops.bdp_state + #elif USE_Z_MIN_PROBE + #define PROBE_READ() READ(Z_MIN_PROBE_PIN) + #else + #define PROBE_READ() READ(Z_MIN_PIN) + #endif + #if USE_Z_MIN_PROBE + #define PROBE_HIT_STATE Z_MIN_PROBE_ENDSTOP_HIT_STATE + #else + #define PROBE_HIT_STATE Z_MIN_ENDSTOP_HIT_STATE + #endif + #define PROBE_TRIGGERED() (PROBE_READ() == PROBE_HIT_STATE) #endif -#if USE_Z_MIN_PROBE - #define PROBE_HIT_STATE Z_MIN_PROBE_ENDSTOP_HIT_STATE -#else - #define PROBE_HIT_STATE Z_MIN_ENDSTOP_HIT_STATE -#endif -#define PROBE_TRIGGERED() (PROBE_READ() == PROBE_HIT_STATE) // In BLTOUCH HS mode, the probe travels in a deployed state. #define Z_TWEEN_SAFE_CLEARANCE SUM_TERN(BLTOUCH, Z_CLEARANCE_BETWEEN_PROBES, bltouch.z_extra_clearance()) @@ -347,7 +355,7 @@ public: #endif #if HAS_QUIET_PROBING - static void set_probing_paused(const bool p); + static void set_devices_paused_for_probing(const bool p); #endif #if ENABLED(PROBE_TARE) From cf609152c275b95f7b1c6ec1409dd9dfb286a4e9 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Mon, 10 Nov 2025 00:34:05 +0000 Subject: [PATCH 4/8] [cron] Bump distribution date (2025-11-10) --- 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 c0c9196ea9..da42afd480 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-11-09" +//#define STRING_DISTRIBUTION_DATE "2025-11-10" /** * 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 b74c79d301..7a198943a2 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-11-09" + #define STRING_DISTRIBUTION_DATE "2025-11-10" #endif /** From 27dcfe0ea82b22ac3b5cf1cc72ebd7e55449c3a3 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 9 Nov 2025 18:37:18 -0600 Subject: [PATCH 5/8] =?UTF-8?q?=E2=9C=85=20New=20rule=20in=20use=5Fexample?= =?UTF-8?q?=5Fconfigs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- buildroot/bin/use_example_configs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/buildroot/bin/use_example_configs b/buildroot/bin/use_example_configs index 401e15da61..72930d8c45 100755 --- a/buildroot/bin/use_example_configs +++ b/buildroot/bin/use_example_configs @@ -101,6 +101,8 @@ def main(): if branch.startswith("bugfix-2."): branch = branch + elif branch.endswith("bugfix-2.1.x"): + branch = "bugfix-2.1.x" elif branch.endswith("-2.1.x") or branch == "2.1.x": branch = "latest-2.1.x" elif branch.endswith("-2.0.x") or branch == "2.0.x": From 88a4e559451f631a62882e3cd6fa4df42f32d056 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 9 Nov 2025 21:25:25 -0600 Subject: [PATCH 6/8] =?UTF-8?q?=F0=9F=A9=B9=20Fix=20SMOOTH=5FSET?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Followup to ce7edc6223 --- Marlin/src/gcode/feature/ft_motion/M494.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/gcode/feature/ft_motion/M494.cpp b/Marlin/src/gcode/feature/ft_motion/M494.cpp index 840333f896..f3a4e61123 100644 --- a/Marlin/src/gcode/feature/ft_motion/M494.cpp +++ b/Marlin/src/gcode/feature/ft_motion/M494.cpp @@ -121,7 +121,7 @@ void GcodeSuite::M494() { report = true; \ } \ else \ - SERIAL_ECHOLN("?Invalid ", C(N), " smoothing time [", C(CHARIFY(A)), "] value."); \ + SERIAL_ECHOLNPGM("?Invalid ", C(N), " smoothing time [", C(CHARIFY(A)), "] value."); \ } CARTES_GANG( From a420e3c15585286f6faedb18fae7c2c1fafb7664 Mon Sep 17 00:00:00 2001 From: David Buezas Date: Mon, 10 Nov 2025 06:43:37 +0100 Subject: [PATCH 7/8] =?UTF-8?q?=F0=9F=94=A7=20PROBE=5FWAKEUP=5FTIME=5FMS?= =?UTF-8?q?=2030=20for=20BIQU=20probes=20(#28153)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/inc/Conditionals-5-post.h | 6 ++++++ Marlin/src/inc/Warnings.cpp | 13 +++++++++---- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/Marlin/src/inc/Conditionals-5-post.h b/Marlin/src/inc/Conditionals-5-post.h index 77982c2c0b..9eb5031055 100644 --- a/Marlin/src/inc/Conditionals-5-post.h +++ b/Marlin/src/inc/Conditionals-5-post.h @@ -3687,4 +3687,10 @@ #define FTM_BUFFER_SIZE 128 #endif #define FTM_BUFFER_MASK (FTM_BUFFER_SIZE - 1u) + #if ANY(BIQU_MICROPROBE_V1, BIQU_MICROPROBE_V2) + #ifndef PROBE_WAKEUP_TIME_MS + #define PROBE_WAKEUP_TIME_MS 30 + #define PROBE_WAKEUP_TIME_WARNING 1 + #endif + #endif #endif diff --git a/Marlin/src/inc/Warnings.cpp b/Marlin/src/inc/Warnings.cpp index be617aa2e8..6da36d832f 100644 --- a/Marlin/src/inc/Warnings.cpp +++ b/Marlin/src/inc/Warnings.cpp @@ -724,6 +724,10 @@ #warning "BIQU MicroProbe V2 detect signal requires a strong pull-up. Some processors have weak internal pull-up capabilities, so we recommended connecting MicroProbe SIGNAL / GND to Z-MIN / Z-STOP instead of the dedicated PROBE port. (Define NO_MICROPROBE_WARNING to suppress this warning.)" #endif +#if PROBE_WAKEUP_TIME_WARNING + #warning "PROBE_WAKEUP_TIME_MS has been set to the default 30ms." +#endif + // // Warn users of potential endstop/DIAG pin conflicts to prevent homing issues when not using sensorless homing // @@ -943,6 +947,9 @@ #if ENABLED(FTM_HOME_AND_PROBE) #if ANY(BIQU_MICROPROBE_V1, BIQU_MICROPROBE_V2) #warning "Let us know if you experience any issues with BIQU Microprobe and FT_MOTION." + #if PROBE_WAKEUP_TIME_MS <= 25 + #warning "A PROBE_WAKEUP_TIME_MS over 25 ms is recommended with FT_MOTION and BIQU_MICROPROBE_V1 or BIQU_MICROPROBE_V2." + #endif #endif #if PROBE_WAKEUP_TIME_MS < 30 #warning "A PROBE_WAKEUP_TIME_MS over 30 ms is recommended with FT_MOTION." @@ -973,8 +980,6 @@ /** * Smooth Linear Advance with Mixing Extruder, S-Curve Acceleration */ -#if ENABLED(SMOOTH_LIN_ADVANCE) - #if ENABLED(MIXING_EXTRUDER) - #warning "SMOOTH_LIN_ADVANCE with MIXING_EXTRUDER is untested. Use with caution." - #endif +#if ALL(SMOOTH_LIN_ADVANCE, MIXING_EXTRUDER) + #warning "SMOOTH_LIN_ADVANCE with MIXING_EXTRUDER is untested. Use with caution." #endif From cda684b6fdd7ec7ab5762fac77687ffc6c4de557 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 10 Nov 2025 00:18:11 -0600 Subject: [PATCH 8/8] =?UTF-8?q?=F0=9F=8E=A8=20LCD=20cosmetic,=20babystep?= =?UTF-8?q?=20size?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/lcd/e3v2/proui/dwin.cpp | 18 +++++++++--------- .../src/lcd/extui/anycubic_vyper/dgus_tft.cpp | 8 ++++---- Marlin/src/lcd/extui/ui_api.h | 2 +- 3 files changed, 14 insertions(+), 14 deletions(-) diff --git a/Marlin/src/lcd/e3v2/proui/dwin.cpp b/Marlin/src/lcd/e3v2/proui/dwin.cpp index 8ff1fe6412..974a0a8866 100644 --- a/Marlin/src/lcd/e3v2/proui/dwin.cpp +++ b/Marlin/src/lcd/e3v2/proui/dwin.cpp @@ -200,7 +200,7 @@ typedef struct { select_t select_page{0}, select_print{0}; #if ENABLED(LCD_BED_TRAMMING) - constexpr float bed_tramming_inset_lfbr[] = BED_TRAMMING_INSET_LFRB; + constexpr float bed_tramming_inset_lfrb[] = BED_TRAMMING_INSET_LFRB; #endif bool hash_changed = true; // Flag to know if message status was changed @@ -2435,23 +2435,23 @@ void setFlow() { setPIntOnClick(FLOW_EDIT_MIN, FLOW_EDIT_MAX, []{ planner.refres switch (point) { case 0: LCD_MESSAGE(MSG_TRAM_FL); - x = bed_tramming_inset_lfbr[0]; - y = bed_tramming_inset_lfbr[1]; + x = bed_tramming_inset_lfrb[0]; + y = bed_tramming_inset_lfrb[1]; break; case 1: LCD_MESSAGE(MSG_TRAM_FR); - x = X_BED_SIZE - bed_tramming_inset_lfbr[2]; - y = bed_tramming_inset_lfbr[1]; + x = X_BED_SIZE - bed_tramming_inset_lfrb[2]; + y = bed_tramming_inset_lfrb[1]; break; case 2: LCD_MESSAGE(MSG_TRAM_BR); - x = X_BED_SIZE - bed_tramming_inset_lfbr[2]; - y = Y_BED_SIZE - bed_tramming_inset_lfbr[3]; + x = X_BED_SIZE - bed_tramming_inset_lfrb[2]; + y = Y_BED_SIZE - bed_tramming_inset_lfrb[3]; break; case 3: LCD_MESSAGE(MSG_TRAM_BL); - x = bed_tramming_inset_lfbr[0]; - y = Y_BED_SIZE - bed_tramming_inset_lfbr[3]; + x = bed_tramming_inset_lfrb[0]; + y = Y_BED_SIZE - bed_tramming_inset_lfrb[3]; break; #if ENABLED(BED_TRAMMING_INCLUDE_CENTER) case 4: diff --git a/Marlin/src/lcd/extui/anycubic_vyper/dgus_tft.cpp b/Marlin/src/lcd/extui/anycubic_vyper/dgus_tft.cpp index af5e20d3a1..5678cb3d3f 100644 --- a/Marlin/src/lcd/extui/anycubic_vyper/dgus_tft.cpp +++ b/Marlin/src/lcd/extui/anycubic_vyper/dgus_tft.cpp @@ -1967,14 +1967,14 @@ namespace Anycubic { setSoftEndstopState(false); - z_off = getZOffset_mm() - 0.01f; + z_off = getZOffset_mm() - BABYSTEP_SIZE_Z; setZOffset_mm(z_off); sendTxtToTFT(ftostr52sprj(getZOffset_mm()) + 2, TXT_LEVEL_OFFSET); if (isAxisPositionKnown(Z)) { const float currZpos = getAxisPosition_mm(Z); - setAxisPosition_mm(currZpos - 0.01f, Z); + setAxisPosition_mm(currZpos - BABYSTEP_SIZE_Z, Z); } setSoftEndstopState(true); @@ -1985,14 +1985,14 @@ namespace Anycubic { setSoftEndstopState(false); - z_off = getZOffset_mm() + 0.01f; + z_off = getZOffset_mm() + BABYSTEP_SIZE_Z; setZOffset_mm(z_off); sendTxtToTFT(ftostr52sprj(getZOffset_mm()) + 2, TXT_LEVEL_OFFSET); if (isAxisPositionKnown(Z)) { // Move Z axis const float currZpos = getAxisPosition_mm(Z); - setAxisPosition_mm(currZpos + 0.01f, Z); + setAxisPosition_mm(currZpos + BABYSTEP_SIZE_Z, Z); } setSoftEndstopState(true); diff --git a/Marlin/src/lcd/extui/ui_api.h b/Marlin/src/lcd/extui/ui_api.h index a4b514d3ce..88145621e5 100644 --- a/Marlin/src/lcd/extui/ui_api.h +++ b/Marlin/src/lcd/extui/ui_api.h @@ -74,7 +74,7 @@ namespace ExtUI { #if ENABLED(MPC_AUTOTUNE) enum mpcresult_t : uint8_t { MPC_STARTED, MPC_TEMP_ERROR, MPC_INTERRUPTED, MPC_DONE }; #endif - struct probe_limits_t { float xmin, ymin, xmax, ymax; }; + typedef struct { float xmin, ymin, xmax, ymax; } probe_limits_t; constexpr uint8_t extruderCount = EXTRUDERS; constexpr uint8_t hotendCount = HOTENDS;