diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h
index 2ce47849fb..1503257c14 100644
--- a/Marlin/Configuration.h
+++ b/Marlin/Configuration.h
@@ -280,7 +280,7 @@
*
* Advanced settings can be found in Configuration_adv.h
*/
-#define CONFIGURATION_H_VERSION 02000901
+#define CONFIGURATION_H_VERSION 02000902
//===========================================================================
//============================= Getting Started =============================
@@ -3898,7 +3898,7 @@
// - Copy the downloaded DWIN_SET folder to the SD card.
//
// RELOADED (T5UID1)
-// - Download https://github.com/Desuuuu/DGUS-reloaded
+// - Download https://github.com/Desuuuu/DGUS-reloaded/releases
// - Copy the downloaded DWIN_SET folder to the SD card.
//
//#define DGUS_LCD_UI_ORIGIN
@@ -4124,6 +4124,8 @@
#define BUTTON_DELAY_EDIT 50 // (ms) Button repeat delay for edit screens
#define BUTTON_DELAY_MENU 250 // (ms) Button repeat delay for menus
+ //#define TOUCH_IDLE_SLEEP 300 // (secs) Turn off the TFT backlight if set (5mn)
+
#define TOUCH_SCREEN_CALIBRATION
//#define TOUCH_CALIBRATION_X 12316
diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h
index 2cb579ae4b..533dafe643 100644
--- a/Marlin/Configuration_adv.h
+++ b/Marlin/Configuration_adv.h
@@ -30,7 +30,7 @@
*
* Basic settings can be found in Configuration.h
*/
-#define CONFIGURATION_ADV_H_VERSION 02000901
+#define CONFIGURATION_ADV_H_VERSION 02000902
//===========================================================================
//============================= Thermal Settings ============================
@@ -3472,11 +3472,13 @@
//#define SPINDLE_FEATURE
//#define LASER_FEATURE
#if EITHER(SPINDLE_FEATURE, LASER_FEATURE)
- #define SPINDLE_LASER_ACTIVE_STATE LOW // Set to "HIGH" if the on/off function is active HIGH
- #define SPINDLE_LASER_PWM true // Set to "true" if your controller supports setting the speed/power
- #define SPINDLE_LASER_PWM_INVERT false // Set to "true" if the speed/power goes up when you want it to go slower
+ #define SPINDLE_LASER_ACTIVE_STATE LOW // Set to "HIGH" if SPINDLE_LASER_ENA_PIN is active HIGH
- #define SPINDLE_LASER_FREQUENCY 2500 // (Hz) Spindle/laser frequency (only on supported HALs: AVR and LPC)
+ #define SPINDLE_LASER_USE_PWM // Enable if your controller supports setting the speed/power
+ #if ENABLED(SPINDLE_LASER_USE_PWM)
+ #define SPINDLE_LASER_PWM_INVERT false // Set to "true" if the speed/power goes up when you want it to go slower
+ #define SPINDLE_LASER_FREQUENCY 2500 // (Hz) Spindle/laser frequency (only on supported HALs: AVR and LPC)
+ #endif
//#define AIR_EVACUATION // Cutter Vacuum / Laser Blower motor control with G-codes M10-M11
#if ENABLED(AIR_EVACUATION)
@@ -3532,17 +3534,21 @@
* Speed/Power = (PWMDC / 255 * 100 - SPEED_POWER_INTERCEPT) / SPEED_POWER_SLOPE
* PWMDC = (spdpwr - SPEED_POWER_MIN) / (SPEED_POWER_MAX - SPEED_POWER_MIN) / SPEED_POWER_SLOPE
*/
- #define SPEED_POWER_INTERCEPT 0 // (%) 0-100 i.e., Minimum power percentage
- #define SPEED_POWER_MIN 5000 // (RPM)
- #define SPEED_POWER_MAX 30000 // (RPM) SuperPID router controller 0 - 30,000 RPM
- #define SPEED_POWER_STARTUP 25000 // (RPM) M3/M4 speed/power default (with no arguments)
+ #if ENABLED(SPINDLE_LASER_USE_PWM)
+ #define SPEED_POWER_INTERCEPT 0 // (%) 0-100 i.e., Minimum power percentage
+ #define SPEED_POWER_MIN 5000 // (RPM)
+ #define SPEED_POWER_MAX 30000 // (RPM) SuperPID router controller 0 - 30,000 RPM
+ #define SPEED_POWER_STARTUP 25000 // (RPM) M3/M4 speed/power default (with no arguments)
+ #endif
#else
- #define SPEED_POWER_INTERCEPT 0 // (%) 0-100 i.e., Minimum power percentage
- #define SPEED_POWER_MIN 0 // (%) 0-100
- #define SPEED_POWER_MAX 100 // (%) 0-100
- #define SPEED_POWER_STARTUP 80 // (%) M3/M4 speed/power default (with no arguments)
+ #if ENABLED(SPINDLE_LASER_USE_PWM)
+ #define SPEED_POWER_INTERCEPT 0 // (%) 0-100 i.e., Minimum power percentage
+ #define SPEED_POWER_MIN 0 // (%) 0-100
+ #define SPEED_POWER_MAX 100 // (%) 0-100
+ #define SPEED_POWER_STARTUP 80 // (%) M3/M4 speed/power default (with no arguments)
+ #endif
// Define the minimum and maximum test pulse time values for a laser test fire function
#define LASER_TEST_PULSE_MIN 1 // Used with Laser Control Menu
diff --git a/Marlin/Version.h b/Marlin/Version.h
index 4b08af89b3..2f65028f6f 100644
--- a/Marlin/Version.h
+++ b/Marlin/Version.h
@@ -119,7 +119,7 @@
* here we define this default string as the date where the latest release
* version was tagged.
*/
-#define STRING_DISTRIBUTION_DATE "2021-09-10"
+#define STRING_DISTRIBUTION_DATE "2021-09-14"
/**
* Defines a generic printer name to be output to the LCD after booting Marlin.
diff --git a/Marlin/src/HAL/AVR/inc/SanityCheck.h b/Marlin/src/HAL/AVR/inc/SanityCheck.h
index 51ba247953..79809b8f61 100644
--- a/Marlin/src/HAL/AVR/inc/SanityCheck.h
+++ b/Marlin/src/HAL/AVR/inc/SanityCheck.h
@@ -35,7 +35,7 @@
/**
* Sanity checks for Spindle / Laser PWM
*/
-#if ENABLED(SPINDLE_LASER_PWM)
+#if ENABLED(SPINDLE_LASER_USE_PWM)
#include "../ServoTimers.h" // Needed to check timer availability (_useTimer3)
#if SPINDLE_LASER_PWM_PIN == 4 || WITHIN(SPINDLE_LASER_PWM_PIN, 11, 13)
#error "Counter/Timer for SPINDLE_LASER_PWM_PIN is used by a system interrupt."
@@ -43,7 +43,7 @@
#error "Counter/Timer for SPINDLE_LASER_PWM_PIN is used by the servo system."
#endif
#elif defined(SPINDLE_LASER_FREQUENCY)
- #error "SPINDLE_LASER_FREQUENCY requires SPINDLE_LASER_PWM."
+ #error "SPINDLE_LASER_FREQUENCY requires SPINDLE_LASER_USE_PWM."
#endif
/**
diff --git a/Marlin/src/HAL/LINUX/inc/SanityCheck.h b/Marlin/src/HAL/LINUX/inc/SanityCheck.h
index 45bb2662ac..36d3190a3e 100644
--- a/Marlin/src/HAL/LINUX/inc/SanityCheck.h
+++ b/Marlin/src/HAL/LINUX/inc/SanityCheck.h
@@ -26,7 +26,7 @@
*/
// Emulating RAMPS
-#if ENABLED(SPINDLE_LASER_PWM) && !(SPINDLE_LASER_PWM_PIN == 4 || SPINDLE_LASER_PWM_PIN == 6 || SPINDLE_LASER_PWM_PIN == 11)
+#if ENABLED(SPINDLE_LASER_USE_PWM) && !(SPINDLE_LASER_PWM_PIN == 4 || SPINDLE_LASER_PWM_PIN == 6 || SPINDLE_LASER_PWM_PIN == 11)
#error "SPINDLE_LASER_PWM_PIN must use SERVO0, SERVO1 or SERVO3 connector"
#endif
diff --git a/Marlin/src/HAL/LPC1768/HAL.h b/Marlin/src/HAL/LPC1768/HAL.h
index fc2fc57378..ca4e2decab 100644
--- a/Marlin/src/HAL/LPC1768/HAL.h
+++ b/Marlin/src/HAL/LPC1768/HAL.h
@@ -107,7 +107,7 @@ extern DefaultSerial1 USBSerial;
#error "LCD_SERIAL_PORT must be from 0 to 3. You can also use -1 if the board supports Native USB."
#endif
#if HAS_DGUS_LCD
- #define SERIAL_GET_TX_BUFFER_FREE() MSerial0.available()
+ #define SERIAL_GET_TX_BUFFER_FREE() LCD_SERIAL.available()
#endif
#endif
diff --git a/Marlin/src/HAL/LPC1768/MarlinSerial.h b/Marlin/src/HAL/LPC1768/MarlinSerial.h
index 808d19f8c5..3e6848a1e3 100644
--- a/Marlin/src/HAL/LPC1768/MarlinSerial.h
+++ b/Marlin/src/HAL/LPC1768/MarlinSerial.h
@@ -46,6 +46,8 @@ public:
void end() {}
+ uint8_t availableForWrite(void) { /* flushTX(); */ return TX_BUFFER_SIZE; }
+
#if ENABLED(EMERGENCY_PARSER)
bool recv_callback(const char c) override;
#endif
diff --git a/Marlin/src/HAL/LPC1768/eeprom_sdcard.cpp b/Marlin/src/HAL/LPC1768/eeprom_sdcard.cpp
index 122c8ef81a..6570a599a4 100644
--- a/Marlin/src/HAL/LPC1768/eeprom_sdcard.cpp
+++ b/Marlin/src/HAL/LPC1768/eeprom_sdcard.cpp
@@ -1,10 +1,9 @@
/**
* Marlin 3D Printer Firmware
- *
* Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
- * Copyright (c) 2016 Bob Cousins bobcousins42@googlemail.com
- * Copyright (c) 2015-2016 Nico Tonnhofer wurstnase.reprap@gmail.com
- * Copyright (c) 2016 Victor Perez victor_pv@hotmail.com
+ *
+ * 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
@@ -20,12 +19,19 @@
* along with this program. If not, see .
*
*/
+
+/**
+ * Implementation of EEPROM settings in SD Card
+ */
+
#ifdef TARGET_LPC1768
#include "../../inc/MarlinConfig.h"
#if ENABLED(SDCARD_EEPROM_EMULATION)
+//#define DEBUG_SD_EEPROM_EMULATION
+
#include "../shared/eeprom_api.h"
#include
@@ -38,9 +44,11 @@ FATFS fat_fs;
FIL eeprom_file;
bool eeprom_file_open = false;
+#define EEPROM_FILENAME "eeprom.dat"
#ifndef MARLIN_EEPROM_SIZE
#define MARLIN_EEPROM_SIZE size_t(0x1000) // 4KiB of Emulated EEPROM
#endif
+
size_t PersistentStore::capacity() { return MARLIN_EEPROM_SIZE; }
bool PersistentStore::access_start() {
@@ -50,7 +58,7 @@ bool PersistentStore::access_start() {
MSC_Release_Lock();
return false;
}
- FRESULT res = f_open(&eeprom_file, "eeprom.dat", FA_OPEN_ALWAYS | FA_WRITE | FA_READ);
+ FRESULT res = f_open(&eeprom_file, EEPROM_FILENAME, FA_OPEN_ALWAYS | FA_WRITE | FA_READ);
if (res) MSC_Release_Lock();
if (res == FR_OK) {
@@ -81,18 +89,20 @@ bool PersistentStore::access_finish() {
// This extra chit-chat goes away soon, but is helpful for now
// to see errors that are happening in read_data / write_data
static void debug_rw(const bool write, int &pos, const uint8_t *value, const size_t size, const FRESULT s, const size_t total=0) {
- PGM_P const rw_str = write ? PSTR("write") : PSTR("read");
- SERIAL_CHAR(' ');
- SERIAL_ECHOPGM_P(rw_str);
- SERIAL_ECHOLNPGM("_data(", pos, ",", value, ",", size, ", ...)");
- if (total) {
- SERIAL_ECHOPGM(" f_");
+ #if ENABLED(DEBUG_SD_EEPROM_EMULATION)
+ PGM_P const rw_str = write ? PSTR("write") : PSTR("read");
+ SERIAL_CHAR(' ');
SERIAL_ECHOPGM_P(rw_str);
- SERIAL_ECHOPGM("()=", s, "\n size=", size, "\n bytes_");
- SERIAL_ECHOLNPGM_P(write ? PSTR("written=") : PSTR("read="), total);
- }
- else
- SERIAL_ECHOLNPGM(" f_lseek()=", s);
+ SERIAL_ECHOLNPGM("_data(", pos, ",", *value, ",", size, ", ...)");
+ if (total) {
+ SERIAL_ECHOPGM(" f_");
+ SERIAL_ECHOPGM_P(rw_str);
+ SERIAL_ECHOPGM("()=", s, "\n size=", size, "\n bytes_");
+ SERIAL_ECHOLNPGM_P(write ? PSTR("written=") : PSTR("read="), total);
+ }
+ else
+ SERIAL_ECHOLNPGM(" f_lseek()=", s);
+ #endif
}
// File function return codes for type FRESULT. This goes away soon, but
diff --git a/Marlin/src/HAL/LPC1768/inc/SanityCheck.h b/Marlin/src/HAL/LPC1768/inc/SanityCheck.h
index 23d797b2ab..3ea054589e 100644
--- a/Marlin/src/HAL/LPC1768/inc/SanityCheck.h
+++ b/Marlin/src/HAL/LPC1768/inc/SanityCheck.h
@@ -67,7 +67,7 @@ static_assert(!(NUM_SERVOS && ENABLED(FAST_PWM_FAN)), "BLTOUCH and Servos are in
* Test LPC176x-specific configuration values for errors at compile-time.
*/
-//#if ENABLED(SPINDLE_LASER_PWM) && !(SPINDLE_LASER_PWM_PIN == 4 || SPINDLE_LASER_PWM_PIN == 6 || SPINDLE_LASER_PWM_PIN == 11)
+//#if ENABLED(SPINDLE_LASER_USE_PWM) && !(SPINDLE_LASER_PWM_PIN == 4 || SPINDLE_LASER_PWM_PIN == 6 || SPINDLE_LASER_PWM_PIN == 11)
// #error "SPINDLE_LASER_PWM_PIN must use SERVO0, SERVO1 or SERVO3 connector"
//#endif
diff --git a/Marlin/src/HAL/NATIVE_SIM/inc/SanityCheck.h b/Marlin/src/HAL/NATIVE_SIM/inc/SanityCheck.h
index 104af9af5b..2d7bef23a3 100644
--- a/Marlin/src/HAL/NATIVE_SIM/inc/SanityCheck.h
+++ b/Marlin/src/HAL/NATIVE_SIM/inc/SanityCheck.h
@@ -26,7 +26,7 @@
*/
// Emulating RAMPS
-#if ENABLED(SPINDLE_LASER_PWM) && !(SPINDLE_LASER_PWM_PIN == 4 || SPINDLE_LASER_PWM_PIN == 6 || SPINDLE_LASER_PWM_PIN == 11)
+#if ENABLED(SPINDLE_LASER_USE_PWM) && !(SPINDLE_LASER_PWM_PIN == 4 || SPINDLE_LASER_PWM_PIN == 6 || SPINDLE_LASER_PWM_PIN == 11)
#error "SPINDLE_LASER_PWM_PIN must use SERVO0, SERVO1 or SERVO3 connector"
#endif
diff --git a/Marlin/src/HAL/STM32/inc/SanityCheck.h b/Marlin/src/HAL/STM32/inc/SanityCheck.h
index 12ff2abec7..0f1a2acaa4 100644
--- a/Marlin/src/HAL/STM32/inc/SanityCheck.h
+++ b/Marlin/src/HAL/STM32/inc/SanityCheck.h
@@ -24,7 +24,7 @@
/**
* Test STM32-specific configuration values for errors at compile-time.
*/
-//#if ENABLED(SPINDLE_LASER_PWM) && !(SPINDLE_LASER_PWM_PIN == 4 || SPINDLE_LASER_PWM_PIN == 6 || SPINDLE_LASER_PWM_PIN == 11)
+//#if ENABLED(SPINDLE_LASER_USE_PWM) && !(SPINDLE_LASER_PWM_PIN == 4 || SPINDLE_LASER_PWM_PIN == 6 || SPINDLE_LASER_PWM_PIN == 11)
// #error "SPINDLE_LASER_PWM_PIN must use SERVO0, SERVO1 or SERVO3 connector"
//#endif
diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp
index 5bbfcd087b..07a9d0186f 100644
--- a/Marlin/src/MarlinCore.cpp
+++ b/Marlin/src/MarlinCore.cpp
@@ -542,6 +542,7 @@ inline void manage_inactivity(const bool no_stepper_sleep=false) {
next_cub_ms_##N = ms + CUB_DEBOUNCE_DELAY_##N; \
CODE; \
queue.inject_P(PSTR(BUTTON##N##_GCODE)); \
+ TERN_(HAS_LCD_MENU, ui.quick_feedback()); \
} \
} \
}while(0)
@@ -1354,7 +1355,7 @@ void setup() {
#endif
#if HAS_TOUCH_BUTTONS
- SETUP_RUN(touch.init());
+ SETUP_RUN(touchBt.init());
#endif
TERN_(HAS_M206_COMMAND, current_position += home_offset); // Init current position based on home_offset
diff --git a/Marlin/src/MarlinCore.h b/Marlin/src/MarlinCore.h
index 6147d43f17..6428b77398 100644
--- a/Marlin/src/MarlinCore.h
+++ b/Marlin/src/MarlinCore.h
@@ -23,10 +23,6 @@
#include "inc/MarlinConfig.h"
-#ifdef DEBUG_GCODE_PARSER
- #include "gcode/parser.h"
-#endif
-
#include
#include
#include
diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h
index dd181baed9..46b2e5cf0c 100644
--- a/Marlin/src/core/boards.h
+++ b/Marlin/src/core/boards.h
@@ -340,17 +340,21 @@
#define BOARD_CREALITY_V427 4040 // Creality v4.2.7 (STM32F103RE)
#define BOARD_CREALITY_V4210 4041 // Creality v4.2.10 (STM32F103RE) as found in the CR-30
#define BOARD_CREALITY_V431 4042 // Creality v4.3.1 (STM32F103RE)
-#define BOARD_CREALITY_V452 4043 // Creality v4.5.2 (STM32F103RE)
-#define BOARD_CREALITY_V453 4044 // Creality v4.5.3 (STM32F103RE)
-#define BOARD_TRIGORILLA_PRO 4045 // Trigorilla Pro (STM32F103ZET6)
-#define BOARD_FLY_MINI 4046 // FLYmaker FLY MINI (STM32F103RCT6)
-#define BOARD_FLSUN_HISPEED 4047 // FLSUN HiSpeedV1 (STM32F103VET6)
-#define BOARD_BEAST 4048 // STM32F103RET6 Libmaple-based controller
-#define BOARD_MINGDA_MPX_ARM_MINI 4049 // STM32F103ZET6 Mingda MD-16
-#define BOARD_GTM32_PRO_VD 4050 // STM32F103VET6 controller
-#define BOARD_ZONESTAR_ZM3E2 4051 // Zonestar ZM3E2 (STM32F103RCT6)
-#define BOARD_ZONESTAR_ZM3E4 4052 // Zonestar ZM3E4 V1 (STM32F103VCT6)
-#define BOARD_ZONESTAR_ZM3E4V2 4053 // Zonestar ZM3E4 V2 (STM32F103VCT6)
+#define BOARD_CREALITY_V431_A 4043 // Creality v4.3.1a (STM32F103RE)
+#define BOARD_CREALITY_V431_B 4044 // Creality v4.3.1b (STM32F103RE)
+#define BOARD_CREALITY_V431_C 4045 // Creality v4.3.1c (STM32F103RE)
+#define BOARD_CREALITY_V431_D 4046 // Creality v4.3.1d (STM32F103RE)
+#define BOARD_CREALITY_V452 4047 // Creality v4.5.2 (STM32F103RE)
+#define BOARD_CREALITY_V453 4048 // Creality v4.5.3 (STM32F103RE)
+#define BOARD_TRIGORILLA_PRO 4049 // Trigorilla Pro (STM32F103ZET6)
+#define BOARD_FLY_MINI 4050 // FLYmaker FLY MINI (STM32F103RCT6)
+#define BOARD_FLSUN_HISPEED 4051 // FLSUN HiSpeedV1 (STM32F103VET6)
+#define BOARD_BEAST 4052 // STM32F103RET6 Libmaple-based controller
+#define BOARD_MINGDA_MPX_ARM_MINI 4053 // STM32F103ZET6 Mingda MD-16
+#define BOARD_GTM32_PRO_VD 4054 // STM32F103VET6 controller
+#define BOARD_ZONESTAR_ZM3E2 4055 // Zonestar ZM3E2 (STM32F103RCT6)
+#define BOARD_ZONESTAR_ZM3E4 4056 // Zonestar ZM3E4 V1 (STM32F103VCT6)
+#define BOARD_ZONESTAR_ZM3E4V2 4057 // Zonestar ZM3E4 V2 (STM32F103VCT6)
//
// ARM Cortex-M4F
@@ -397,6 +401,7 @@
#define BOARD_FYSETC_CHEETAH_V20 4231 // FYSETC Cheetah V2.0
#define BOARD_TH3D_EZBOARD_LITE_V2 4232 // TH3D EZBoard Lite v2.0
#define BOARD_INDEX_REV03 4233 // Index PnP Controller REV03 (STM32F407VET6/VGT6)
+#define BOARD_MKS_ROBIN_NANO_V1_3_F4 4234 // MKS Robin Nano V1.3 and MKS Robin Nano-S V1.3 (STM32F407VET6)
//
// ARM Cortex M7
diff --git a/Marlin/src/core/debug_out.h b/Marlin/src/core/debug_out.h
index 3187e03254..4e30a5306e 100644
--- a/Marlin/src/core/debug_out.h
+++ b/Marlin/src/core/debug_out.h
@@ -56,7 +56,6 @@
#include "debug_section.h"
#define DEBUG_SECTION(N,S,D) SectionLog N(PSTR(S),D)
- #define DEBUG_ECHOPGM_P(P) SERIAL_ECHOPGM_P(P)
#define DEBUG_ECHO_START SERIAL_ECHO_START
#define DEBUG_ERROR_START SERIAL_ERROR_START
#define DEBUG_CHAR SERIAL_CHAR
diff --git a/Marlin/src/feature/mmu/mmu2.cpp b/Marlin/src/feature/mmu/mmu2.cpp
index 31e64f4953..cf03eaf7f6 100644
--- a/Marlin/src/feature/mmu/mmu2.cpp
+++ b/Marlin/src/feature/mmu/mmu2.cpp
@@ -962,7 +962,7 @@ bool MMU2::eject_filament(const uint8_t index, const bool recover) {
BUZZ(200, 404);
TERN_(HOST_PROMPT_SUPPORT, host_prompt_do(PROMPT_USER_CONTINUE, PSTR("MMU2 Eject Recover"), CONTINUE_STR));
TERN_(EXTENSIBLE_UI, ExtUI::onUserConfirmRequired_P(PSTR("MMU2 Eject Recover")));
- wait_for_user_response();
+ TERN_(HAS_RESUME_CONTINUE, wait_for_user_response());
BUZZ(200, 404);
BUZZ(200, 404);
diff --git a/Marlin/src/feature/pause.cpp b/Marlin/src/feature/pause.cpp
index d7bab549ed..3474dbe4b7 100644
--- a/Marlin/src/feature/pause.cpp
+++ b/Marlin/src/feature/pause.cpp
@@ -525,7 +525,7 @@ void wait_for_confirmation(const bool is_reload/*=false*/, const int8_t max_beep
TERN_(EXTENSIBLE_UI, ExtUI::onUserConfirmRequired_P(GET_TEXT(MSG_HEATER_TIMEOUT)));
- wait_for_user_response(0, true); // Wait for LCD click or M108
+ TERN_(HAS_RESUME_CONTINUE, wait_for_user_response(0, true)); // Wait for LCD click or M108
TERN_(HOST_PROMPT_SUPPORT, host_prompt_do(PROMPT_INFO, GET_TEXT(MSG_REHEATING)));
diff --git a/Marlin/src/feature/spindle_laser.cpp b/Marlin/src/feature/spindle_laser.cpp
index 68a84e1aba..ea6fc4990e 100644
--- a/Marlin/src/feature/spindle_laser.cpp
+++ b/Marlin/src/feature/spindle_laser.cpp
@@ -64,7 +64,7 @@ void SpindleLaser::init() {
#if ENABLED(SPINDLE_CHANGE_DIR)
OUT_WRITE(SPINDLE_DIR_PIN, SPINDLE_INVERT_DIR ? 255 : 0); // Init rotation to clockwise (M3)
#endif
- #if ENABLED(SPINDLE_LASER_PWM)
+ #if ENABLED(SPINDLE_LASER_USE_PWM)
SET_PWM(SPINDLE_LASER_PWM_PIN);
analogWrite(pin_t(SPINDLE_LASER_PWM_PIN), SPINDLE_LASER_PWM_OFF); // Set to lowest speed
#endif
@@ -83,7 +83,7 @@ void SpindleLaser::init() {
#endif
}
-#if ENABLED(SPINDLE_LASER_PWM)
+#if ENABLED(SPINDLE_LASER_USE_PWM)
/**
* Set the cutter PWM directly to the given ocr value
*
@@ -107,7 +107,7 @@ void SpindleLaser::init() {
WRITE(SPINDLE_LASER_ENA_PIN, !SPINDLE_LASER_ACTIVE_STATE); // Cutter OFF
_set_ocr(0);
}
-#endif // SPINDLE_LASER_PWM
+#endif // SPINDLE_LASER_USE_PWM
/**
* Apply power for laser/spindle
@@ -121,7 +121,7 @@ void SpindleLaser::apply_power(const uint8_t opwr) {
if (opwr == last_power_applied) return;
last_power_applied = opwr;
power = opwr;
- #if ENABLED(SPINDLE_LASER_PWM)
+ #if ENABLED(SPINDLE_LASER_USE_PWM)
if (cutter.unitPower == 0 && CUTTER_UNIT_IS(RPM)) {
ocr_off();
isReady = false;
diff --git a/Marlin/src/feature/spindle_laser.h b/Marlin/src/feature/spindle_laser.h
index 9a2d05c79d..ba82c4d731 100644
--- a/Marlin/src/feature/spindle_laser.h
+++ b/Marlin/src/feature/spindle_laser.h
@@ -123,7 +123,7 @@ public:
FORCE_INLINE static void refresh() { apply_power(power); }
FORCE_INLINE static void set_power(const uint8_t upwr) { power = upwr; refresh(); }
- #if ENABLED(SPINDLE_LASER_PWM)
+ #if ENABLED(SPINDLE_LASER_USE_PWM)
private:
@@ -186,7 +186,7 @@ public:
}
return upwr;
}
- #endif // SPINDLE_LASER_PWM
+ #endif // SPINDLE_LASER_USE_PWM
/**
* Enable/Disable spindle/laser
@@ -195,7 +195,7 @@ public:
static inline void set_enabled(const bool enable) {
uint8_t value = 0;
if (enable) {
- #if ENABLED(SPINDLE_LASER_PWM)
+ #if ENABLED(SPINDLE_LASER_USE_PWM)
if (power)
value = power;
else if (unitPower)
@@ -249,7 +249,7 @@ public:
#if HAS_LCD_MENU
static inline void enable_with_dir(const bool reverse) {
isReady = true;
- const uint8_t ocr = TERN(SPINDLE_LASER_PWM, upower_to_ocr(menuPower), 255);
+ const uint8_t ocr = TERN(SPINDLE_LASER_USE_PWM, upower_to_ocr(menuPower), 255);
if (menuPower)
power = ocr;
else
@@ -262,7 +262,7 @@ public:
FORCE_INLINE static void enable_reverse() { enable_with_dir(true); }
FORCE_INLINE static void enable_same_dir() { enable_with_dir(is_reverse()); }
- #if ENABLED(SPINDLE_LASER_PWM)
+ #if ENABLED(SPINDLE_LASER_USE_PWM)
static inline void update_from_mpower() {
if (isReady) power = upower_to_ocr(menuPower);
unitPower = menuPower;
@@ -308,14 +308,14 @@ public:
isReady = false;
unitPower = menuPower = 0;
planner.laser_inline.status.isPlanned = false;
- TERN(SPINDLE_LASER_PWM, inline_ocr_power, inline_power)(0);
+ TERN(SPINDLE_LASER_USE_PWM, inline_ocr_power, inline_power)(0);
}
}
// Set the power for subsequent movement blocks
static void inline_power(const cutter_power_t upwr) {
unitPower = menuPower = upwr;
- #if ENABLED(SPINDLE_LASER_PWM)
+ #if ENABLED(SPINDLE_LASER_USE_PWM)
#if ENABLED(SPEED_POWER_RELATIVE) && !CUTTER_UNIT_IS(RPM) // relative mode does not turn laser off at 0, except for RPM
planner.laser_inline.status.isEnabled = true;
planner.laser_inline.power = upower_to_ocr(upwr);
@@ -332,7 +332,7 @@ public:
static inline void inline_direction(const bool) { /* never */ }
- #if ENABLED(SPINDLE_LASER_PWM)
+ #if ENABLED(SPINDLE_LASER_USE_PWM)
static inline void inline_ocr_power(const uint8_t ocrpwr) {
isReady = ocrpwr > 0;
planner.laser_inline.status.isEnabled = ocrpwr > 0;
diff --git a/Marlin/src/gcode/calibrate/G33.cpp b/Marlin/src/gcode/calibrate/G33.cpp
index 597801cf52..8867c168d2 100644
--- a/Marlin/src/gcode/calibrate/G33.cpp
+++ b/Marlin/src/gcode/calibrate/G33.cpp
@@ -69,6 +69,8 @@ enum CalEnum : char { // the 7 main calibration points -
float lcd_probe_pt(const xy_pos_t &xy);
+float dcr;
+
void ac_home() {
endstops.enable(true);
TERN_(SENSORLESS_HOMING, probe.set_homing_current(true));
@@ -175,9 +177,9 @@ static float std_dev_points(float z_pt[NPP + 1], const bool _0p_cal, const bool
/**
* - Probe a point
*/
-static float calibration_probe(const xy_pos_t &xy, const bool stow) {
+static float calibration_probe(const xy_pos_t &xy, const bool stow, const bool probe_at_offset) {
#if HAS_BED_PROBE
- return probe.probe_at_point(xy, stow ? PROBE_PT_STOW : PROBE_PT_RAISE, 0, true, false);
+ return probe.probe_at_point(xy, stow ? PROBE_PT_STOW : PROBE_PT_RAISE, 0, true, probe_at_offset);
#else
UNUSED(stow);
return lcd_probe_pt(xy);
@@ -187,7 +189,7 @@ static float calibration_probe(const xy_pos_t &xy, const bool stow) {
/**
* - Probe a grid
*/
-static bool probe_calibration_points(float z_pt[NPP + 1], const int8_t probe_points, const bool towers_set, const bool stow_after_each) {
+static bool probe_calibration_points(float z_pt[NPP + 1], const int8_t probe_points, const bool towers_set, const bool stow_after_each, const bool probe_at_offset) {
const bool _0p_calibration = probe_points == 0,
_1p_calibration = probe_points == 1 || probe_points == -1,
_4p_calibration = probe_points == 2,
@@ -209,11 +211,9 @@ static bool probe_calibration_points(float z_pt[NPP + 1], const int8_t probe_poi
if (!_0p_calibration) {
- const float dcr = delta_calibration_radius();
-
if (!_7p_no_intermediates && !_7p_4_intermediates && !_7p_11_intermediates) { // probe the center
const xy_pos_t center{0};
- z_pt[CEN] += calibration_probe(center, stow_after_each);
+ z_pt[CEN] += calibration_probe(center, stow_after_each, probe_at_offset);
if (isnan(z_pt[CEN])) return false;
}
@@ -224,7 +224,7 @@ static bool probe_calibration_points(float z_pt[NPP + 1], const int8_t probe_poi
const float a = RADIANS(210 + (360 / NPP) * (rad - 1)),
r = dcr * 0.1;
const xy_pos_t vec = { cos(a), sin(a) };
- z_pt[CEN] += calibration_probe(vec * r, stow_after_each);
+ z_pt[CEN] += calibration_probe(vec * r, stow_after_each, probe_at_offset);
if (isnan(z_pt[CEN])) return false;
}
z_pt[CEN] /= float(_7p_2_intermediates ? 7 : probe_points);
@@ -249,7 +249,7 @@ static bool probe_calibration_points(float z_pt[NPP + 1], const int8_t probe_poi
r = dcr * (1 - 0.1 * (zig_zag ? offset - circle : circle)),
interpol = FMOD(rad, 1);
const xy_pos_t vec = { cos(a), sin(a) };
- const float z_temp = calibration_probe(vec * r, stow_after_each);
+ const float z_temp = calibration_probe(vec * r, stow_after_each, probe_at_offset);
if (isnan(z_temp)) return false;
// split probe point to neighbouring calibration points
z_pt[uint8_t(LROUND(rad - interpol + NPP - 1)) % NPP + 1] += z_temp * sq(cos(RADIANS(interpol * 90)));
@@ -276,7 +276,6 @@ static bool probe_calibration_points(float z_pt[NPP + 1], const int8_t probe_poi
static void reverse_kinematics_probe_points(float z_pt[NPP + 1], abc_float_t mm_at_pt_axis[NPP + 1]) {
xyz_pos_t pos{0};
- const float dcr = delta_calibration_radius();
LOOP_CAL_ALL(rad) {
const float a = RADIANS(210 + (360 / NPP) * (rad - 1)),
r = (rad == CEN ? 0.0f : dcr);
@@ -287,7 +286,7 @@ static void reverse_kinematics_probe_points(float z_pt[NPP + 1], abc_float_t mm_
}
static void forward_kinematics_probe_points(abc_float_t mm_at_pt_axis[NPP + 1], float z_pt[NPP + 1]) {
- const float r_quot = delta_calibration_radius() / delta_radius;
+ const float r_quot = dcr / delta_radius;
#define ZPP(N,I,A) (((1.0f + r_quot * (N)) / 3.0f) * mm_at_pt_axis[I].A)
#define Z00(I, A) ZPP( 0, I, A)
@@ -328,7 +327,7 @@ static void calc_kinematics_diff_probe_points(float z_pt[NPP + 1], abc_float_t d
}
static float auto_tune_h() {
- const float r_quot = delta_calibration_radius() / delta_radius;
+ const float r_quot = dcr / delta_radius;
return RECIPROCAL(r_quot / (2.0f / 3.0f)); // (2/3)/CR
}
@@ -373,6 +372,8 @@ static float auto_tune_a() {
* P3 Probe all positions: center, towers and opposite towers. Calibrate all.
* P4-P10 Probe all positions at different intermediate locations and average them.
*
+ * Rn.nn override default calibration Radius
+ *
* T Don't calibrate tower angle corrections
*
* Cn.nn Calibration precision; when omitted calibrates to maximum precision
@@ -387,6 +388,8 @@ static float auto_tune_a() {
*
* E Engage the probe for each point
*
+ * O Probe at offset points (this is wrong but it seems to work)
+ *
* With SENSORLESS_PROBING:
* Use these flags to calibrate stall sensitivity: (e.g., `G33 P1 Y Z` to calibrate X only.)
* X Don't activate stallguard on X.
@@ -403,7 +406,27 @@ void GcodeSuite::G33() {
return;
}
- const bool towers_set = !parser.seen_test('T');
+ const bool probe_at_offset = TERN0(HAS_PROBE_XY_OFFSET, parser.boolval('O')),
+ towers_set = !parser.seen_test('T');
+
+ float max_dcr = dcr = DELTA_PRINTABLE_RADIUS;
+ #if HAS_PROBE_XY_OFFSET
+ // For offset probes the calibration radius is set to a safe but non-optimal value
+ dcr -= HYPOT(probe.offset_xy.x, probe.offset_xy.y);
+ if (probe_at_offset) {
+ // With probe positions both probe and nozzle need to be within the printable area
+ max_dcr = dcr;
+ }
+ // else with nozzle positions there is a risk of the probe being outside the bed
+ // but as long the nozzle stays within the printable area there is no risk of
+ // the effector crashing into the towers.
+ #endif
+
+ if (parser.seenval('R')) dcr = parser.value_float();
+ if (!WITHIN(dcr, 0, max_dcr)) {
+ SERIAL_ECHOLNPGM("?calibration (R)adius implausible.");
+ return;
+ }
const float calibration_precision = parser.floatval('C', 0.0f);
if (calibration_precision < 0) {
@@ -425,7 +448,7 @@ void GcodeSuite::G33() {
const bool stow_after_each = parser.seen_test('E');
- #if ENABLED(SENSORLESS_PROBING)
+ #if HAS_DELTA_SENSORLESS_PROBING
probe.test_sensitivity.x = !parser.seen_test('X');
TERN_(HAS_Y_AXIS, probe.test_sensitivity.y = !parser.seen_test('Y'));
TERN_(HAS_Z_AXIS, probe.test_sensitivity.z = !parser.seen_test('Z'));
@@ -453,18 +476,6 @@ void GcodeSuite::G33() {
SERIAL_ECHOLNPGM("G33 Auto Calibrate");
- const float dcr = delta_calibration_radius();
-
- if (!_1p_calibration && !_0p_calibration) { // test if the outer radius is reachable
- LOOP_CAL_RAD(axis) {
- const float a = RADIANS(210 + (360 / NPP) * (axis - 1));
- if (!position_is_reachable(cos(a) * dcr, sin(a) * dcr)) {
- SERIAL_ECHOLNPGM("?Bed calibration radius implausible.");
- return;
- }
- }
- }
-
// Report settings
PGM_P const checkingac = PSTR("Checking... AC");
SERIAL_ECHOPGM_P(checkingac);
@@ -487,7 +498,7 @@ void GcodeSuite::G33() {
// Probe the points
zero_std_dev_old = zero_std_dev;
- if (!probe_calibration_points(z_at_pt, probe_points, towers_set, stow_after_each)) {
+ if (!probe_calibration_points(z_at_pt, probe_points, towers_set, stow_after_each, probe_at_offset)) {
SERIAL_ECHOLNPGM("Correct delta settings with M665 and M666");
return ac_cleanup(TERN_(HAS_MULTI_HOTEND, old_tool_index));
}
@@ -526,11 +537,11 @@ void GcodeSuite::G33() {
#define Z0(I) ZP(0, I)
// calculate factors
- if (_7p_9_center) calibration_radius_factor = 0.9f;
+ if (_7p_9_center) dcr *= 0.9f;
h_factor = auto_tune_h();
r_factor = auto_tune_r();
a_factor = auto_tune_a();
- calibration_radius_factor = 1.0f;
+ dcr /= 0.9f;
switch (probe_points) {
case 0:
diff --git a/Marlin/src/gcode/control/M3-M5.cpp b/Marlin/src/gcode/control/M3-M5.cpp
index ff5ab5086e..ecae8b06c6 100644
--- a/Marlin/src/gcode/control/M3-M5.cpp
+++ b/Marlin/src/gcode/control/M3-M5.cpp
@@ -72,7 +72,7 @@ void GcodeSuite::M3_M4(const bool is_M4) {
#if ENABLED(SPINDLE_SERVO)
cutter.unitPower = spwr;
#else
- cutter.unitPower = TERN(SPINDLE_LASER_PWM,
+ cutter.unitPower = TERN(SPINDLE_LASER_USE_PWM,
cutter.power_to_range(cutter_power_t(round(spwr))),
spwr > 0 ? 255 : 0);
#endif
@@ -86,7 +86,7 @@ void GcodeSuite::M3_M4(const bool is_M4) {
if (parser.seen('I') == DISABLED(LASER_POWER_INLINE_INVERT)) {
// Laser power in inline mode
cutter.inline_direction(is_M4); // Should always be unused
- #if ENABLED(SPINDLE_LASER_PWM)
+ #if ENABLED(SPINDLE_LASER_USE_PWM)
if (parser.seen('O')) {
cutter.unitPower = cutter.power_to_range(parser.value_byte(), 0);
cutter.inline_ocr_power(cutter.unitPower); // The OCR is a value from 0 to 255 (uint8_t)
@@ -105,7 +105,7 @@ void GcodeSuite::M3_M4(const bool is_M4) {
planner.synchronize(); // Wait for previous movement commands (G0/G0/G2/G3) to complete before changing power
cutter.set_reverse(is_M4);
- #if ENABLED(SPINDLE_LASER_PWM)
+ #if ENABLED(SPINDLE_LASER_USE_PWM)
if (parser.seenval('O')) {
cutter.unitPower = cutter.power_to_range(parser.value_byte(), 0);
cutter.ocr_set_power(cutter.unitPower); // The OCR is a value from 0 to 255 (uint8_t)
diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp
index 477d43ed63..e3b90b65b3 100644
--- a/Marlin/src/gcode/gcode.cpp
+++ b/Marlin/src/gcode/gcode.cpp
@@ -215,7 +215,7 @@ void GcodeSuite::get_destination_from_command() {
// Set the laser power in the planner to configure this move
if (parser.seen('S')) {
const float spwr = parser.value_float();
- cutter.inline_power(TERN(SPINDLE_LASER_PWM, cutter.power_to_range(cutter_power_t(round(spwr))), spwr > 0 ? 255 : 0));
+ cutter.inline_power(TERN(SPINDLE_LASER_USE_PWM, cutter.power_to_range(cutter_power_t(round(spwr))), spwr > 0 ? 255 : 0));
}
else if (ENABLED(LASER_MOVE_G0_OFF) && parser.codenum == 0) // G0
cutter.set_inline_enabled(false);
diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h
index cd190387b0..16cee3481d 100644
--- a/Marlin/src/gcode/gcode.h
+++ b/Marlin/src/gcode/gcode.h
@@ -21,10 +21,6 @@
*/
#pragma once
-/**
- * gcode.h - Temporary container for all gcode handlers
- */
-
/**
* -----------------
* G-Codes in Marlin
diff --git a/Marlin/src/gcode/lcd/M0_M1.cpp b/Marlin/src/gcode/lcd/M0_M1.cpp
index cb37bfec24..9ba6ed5fc7 100644
--- a/Marlin/src/gcode/lcd/M0_M1.cpp
+++ b/Marlin/src/gcode/lcd/M0_M1.cpp
@@ -83,7 +83,7 @@ void GcodeSuite::M0_M1() {
TERN_(HOST_PROMPT_SUPPORT, host_prompt_do(PROMPT_USER_CONTINUE, parser.codenum ? PSTR("M1 Stop") : PSTR("M0 Stop"), CONTINUE_STR));
- wait_for_user_response(ms);
+ TERN_(HAS_RESUME_CONTINUE, wait_for_user_response(ms));
TERN_(HAS_LCD_MENU, ui.reset_status());
}
diff --git a/Marlin/src/gcode/sd/M1001.cpp b/Marlin/src/gcode/sd/M1001.cpp
index 14bd712d27..f5ee6a94d1 100644
--- a/Marlin/src/gcode/sd/M1001.cpp
+++ b/Marlin/src/gcode/sd/M1001.cpp
@@ -97,7 +97,7 @@ void GcodeSuite::M1001() {
printerEventLEDs.onPrintCompleted();
TERN_(EXTENSIBLE_UI, ExtUI::onUserConfirmRequired_P(GET_TEXT(MSG_PRINT_DONE)));
TERN_(HOST_PROMPT_SUPPORT, host_prompt_do(PROMPT_USER_CONTINUE, GET_TEXT(MSG_PRINT_DONE), CONTINUE_STR));
- wait_for_user_response(SEC_TO_MS(TERN(HAS_LCD_MENU, PE_LEDS_COMPLETED_TIME, 30)));
+ TERN_(HAS_RESUME_CONTINUE, wait_for_user_response(SEC_TO_MS(TERN(HAS_LCD_MENU, PE_LEDS_COMPLETED_TIME, 30))));
printerEventLEDs.onResumeAfterWait();
}
#endif
diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h
index 52b0b93ab1..893abae2d7 100644
--- a/Marlin/src/inc/Conditionals_LCD.h
+++ b/Marlin/src/inc/Conditionals_LCD.h
@@ -241,7 +241,7 @@
#define LCD_ST7920_DELAY_2 125
#define LCD_ST7920_DELAY_3 125
-#elif ENABLED(ANET_FULL_GRAPHICS_LCD, ANET_FULL_GRAPHICS_LCD_ALT_WIRING)
+#elif EITHER(ANET_FULL_GRAPHICS_LCD, ANET_FULL_GRAPHICS_LCD_ALT_WIRING)
#define IS_RRD_FG_SC 1
#define LCD_ST7920_DELAY_1 150
@@ -931,7 +931,10 @@
#if DISABLED(NOZZLE_AS_PROBE)
#define HAS_PROBE_XY_OFFSET 1
#endif
- #if DISABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) && !BOTH(DELTA, SENSORLESS_PROBING)
+ #if BOTH(DELTA, SENSORLESS_PROBING)
+ #define HAS_DELTA_SENSORLESS_PROBING 1
+ #endif
+ #if NONE(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN, HAS_DELTA_SENSORLESS_PROBING)
#define USES_Z_MIN_PROBE_PIN 1
#endif
#if Z_HOME_TO_MIN && TERN1(USES_Z_MIN_PROBE_PIN, ENABLED(USE_PROBE_FOR_Z_HOMING))
@@ -1357,6 +1360,9 @@
// This emulated DOGM has 'touch/xpt2046', not 'tft/xpt2046'
#if ENABLED(TOUCH_SCREEN)
+ #if TOUCH_IDLE_SLEEP
+ #define HAS_TOUCH_SLEEP 1
+ #endif
#if NONE(TFT_TOUCH_DEVICE_GT911, TFT_TOUCH_DEVICE_XPT2046)
#define TFT_TOUCH_DEVICE_XPT2046 // ADS7843/XPT2046 ADC Touchscreen such as ILI9341 2.8
#endif
diff --git a/Marlin/src/inc/Conditionals_adv.h b/Marlin/src/inc/Conditionals_adv.h
index 9fae92affe..94332c9268 100644
--- a/Marlin/src/inc/Conditionals_adv.h
+++ b/Marlin/src/inc/Conditionals_adv.h
@@ -658,7 +658,7 @@
#endif
// Add features that need hardware PWM here
-#if ANY(FAST_PWM_FAN, SPINDLE_LASER_PWM)
+#if ANY(FAST_PWM_FAN, SPINDLE_LASER_USE_PWM)
#define NEEDS_HARDWARE_PWM 1
#endif
diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h
index d849a57b8d..caecc1cfd5 100644
--- a/Marlin/src/inc/SanityCheck.h
+++ b/Marlin/src/inc/SanityCheck.h
@@ -43,7 +43,7 @@
#define TEST2 1
#define TEST3 0
#define TEST4 true
-#if ENABLED(TEST0) || !ENABLED(TEST2) || ENABLED(TEST3)
+#if ENABLED(TEST0) || !ENABLED(TEST2) || ENABLED(TEST3) || !ENABLED(TEST1, TEST2, TEST4)
#error "ENABLED is borked!"
#endif
#if BOTH(TEST0, TEST1)
@@ -593,6 +593,8 @@
#error "ARC_SUPPORT no longer uses ARC_SEGMENTS_PER_R."
#elif ENABLED(ARC_SUPPORT) && (!defined(MIN_ARC_SEGMENT_MM) || !defined(MAX_ARC_SEGMENT_MM))
#error "ARC_SUPPORT now requires MIN_ARC_SEGMENT_MM and MAX_ARC_SEGMENT_MM."
+#elif defined(SPINDLE_LASER_PWM)
+ #error "SPINDLE_LASER_PWM (true) is now set with SPINDLE_LASER_USE_PWM (enabled)."
#endif
#if MOTHERBOARD == BOARD_DUE3DOM_MINI && PIN_EXISTS(TEMP_2) && DISABLED(TEMP_SENSOR_BOARD)
@@ -999,6 +1001,10 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS
static_assert(WITHIN(npp_xyz.z, Z_MIN_POS, Z_MAX_POS), "NOZZLE_PARK_POINT.Z is out of bounds (Z_MIN_POS, Z_MAX_POS).");
#endif
+#if !HAS_RESUME_CONTINUE && DISABLED(HOST_PROMPT_SUPPORT) && DISABLED(EXTENSIBLE_UI)
+ #warning "Your Configuration provides no method to acquire user feedback!"
+#endif
+
/**
* Instant Freeze
*/
@@ -3554,8 +3560,8 @@ static_assert( _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2)
#error "LASER_MOVE_G0_OFF requires LASER_MOVE_POWER."
#endif
#if ENABLED(LASER_POWER_INLINE_TRAPEZOID)
- #if DISABLED(SPINDLE_LASER_PWM)
- #error "LASER_POWER_INLINE_TRAPEZOID requires SPINDLE_LASER_PWM to function."
+ #if DISABLED(SPINDLE_LASER_USE_PWM)
+ #error "LASER_POWER_INLINE_TRAPEZOID requires SPINDLE_LASER_USE_PWM to function."
#elif ENABLED(S_CURVE_ACCELERATION)
//#ifndef LASER_POWER_INLINE_S_CURVE_ACCELERATION_WARN
// #define LASER_POWER_INLINE_S_CURVE_ACCELERATION_WARN
@@ -3587,21 +3593,21 @@ static_assert( _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2)
#error "(SPINDLE|LASER)_FEATURE requires SPINDLE_LASER_ENA_PIN or SPINDLE_SERVO to control the power."
#elif ENABLED(SPINDLE_CHANGE_DIR) && !PIN_EXISTS(SPINDLE_DIR)
#error "SPINDLE_DIR_PIN is required for SPINDLE_CHANGE_DIR."
- #elif ENABLED(SPINDLE_LASER_PWM)
+ #elif ENABLED(SPINDLE_LASER_USE_PWM)
#if !defined(SPINDLE_LASER_PWM_PIN) || SPINDLE_LASER_PWM_PIN < 0
- #error "SPINDLE_LASER_PWM_PIN is required for SPINDLE_LASER_PWM."
+ #error "SPINDLE_LASER_PWM_PIN is required for SPINDLE_LASER_USE_PWM."
#elif !_TEST_PWM(SPINDLE_LASER_PWM_PIN)
#error "SPINDLE_LASER_PWM_PIN not assigned to a PWM pin."
#elif !defined(SPINDLE_LASER_PWM_INVERT)
#error "SPINDLE_LASER_PWM_INVERT is required for (SPINDLE|LASER)_FEATURE."
#elif !(defined(SPEED_POWER_INTERCEPT) && defined(SPEED_POWER_MIN) && defined(SPEED_POWER_MAX) && defined(SPEED_POWER_STARTUP))
- #error "SPINDLE_LASER_PWM equation constant(s) missing."
+ #error "SPINDLE_LASER_USE_PWM equation constant(s) missing."
#elif _PIN_CONFLICT(X_MIN)
- #error "SPINDLE_LASER_PWM pin conflicts with X_MIN_PIN."
+ #error "SPINDLE_LASER_USE_PWM pin conflicts with X_MIN_PIN."
#elif _PIN_CONFLICT(X_MAX)
- #error "SPINDLE_LASER_PWM pin conflicts with X_MAX_PIN."
+ #error "SPINDLE_LASER_USE_PWM pin conflicts with X_MAX_PIN."
#elif _PIN_CONFLICT(Z_STEP)
- #error "SPINDLE_LASER_PWM pin conflicts with Z_STEP_PIN."
+ #error "SPINDLE_LASER_USE_PWM pin conflicts with Z_STEP_PIN."
#elif _PIN_CONFLICT(CASE_LIGHT)
#error "SPINDLE_LASER_PWM_PIN conflicts with CASE_LIGHT_PIN."
#elif _PIN_CONFLICT(E0_AUTO_FAN)
diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h
index 12c8b6b3ad..be693c73c8 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 "2021-09-10"
+ #define STRING_DISTRIBUTION_DATE "2021-09-14"
#endif
/**
@@ -52,7 +52,7 @@
* to alert users to major changes.
*/
-#define MARLIN_HEX_VERSION 02000901
+#define MARLIN_HEX_VERSION 02000902
#ifndef REQUIRED_CONFIGURATION_H_VERSION
#define REQUIRED_CONFIGURATION_H_VERSION MARLIN_HEX_VERSION
#endif
diff --git a/Marlin/src/lcd/dogm/u8g_dev_tft_upscale_from_128x64.cpp b/Marlin/src/lcd/dogm/u8g_dev_tft_upscale_from_128x64.cpp
index 9b5f206fa9..df7b4000a9 100644
--- a/Marlin/src/lcd/dogm/u8g_dev_tft_upscale_from_128x64.cpp
+++ b/Marlin/src/lcd/dogm/u8g_dev_tft_upscale_from_128x64.cpp
@@ -73,13 +73,18 @@ TFT_IO tftio;
#define HEIGHT LCD_PIXEL_HEIGHT
#define PAGE_HEIGHT 8
-#include "../touch/touch_buttons.h"
-
#if ENABLED(TOUCH_SCREEN_CALIBRATION)
#include "../tft_io/touch_calibration.h"
#include "../marlinui.h"
#endif
+#if HAS_TOUCH_BUTTONS
+ #include "../touch/touch_buttons.h"
+ #if HAS_TOUCH_SLEEP
+ #define HAS_TOUCH_BUTTONS_SLEEP 1
+ #endif
+#endif
+
#define X_HI (UPSCALE(TFT_PIXEL_OFFSET_X, WIDTH) - 1)
#define Y_HI (UPSCALE(TFT_PIXEL_OFFSET_Y, HEIGHT) - 1)
@@ -340,6 +345,18 @@ static uint8_t page;
}
#endif // HAS_TOUCH_BUTTONS
+static void u8g_upscale_clear_lcd(u8g_t *u8g, u8g_dev_t *dev, uint16_t *buffer) {
+ setWindow(u8g, dev, 0, 0, (TFT_WIDTH) - 1, (TFT_HEIGHT) - 1);
+ #if HAS_LCD_IO
+ UNUSED(buffer);
+ tftio.WriteMultiple(TFT_MARLINBG_COLOR, (TFT_WIDTH) * (TFT_HEIGHT));
+ #else
+ memset2(buffer, TFT_MARLINBG_COLOR, (TFT_WIDTH) / 2);
+ for (uint16_t i = 0; i < (TFT_HEIGHT) * sq(GRAPHICAL_TFT_UPSCALE); i++)
+ u8g_WriteSequence(u8g, dev, (TFT_WIDTH) / 2, (uint8_t *)buffer);
+ #endif
+}
+
static uint8_t msgInitCount = 2; // Ignore all messages until 2nd U8G_COM_MSG_INIT
uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, void *arg) {
@@ -365,27 +382,32 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u
tftio.Init();
tftio.InitTFT();
TERN_(TOUCH_SCREEN_CALIBRATION, touch_calibration.calibration_reset());
-
- // Clear Screen
- setWindow(u8g, dev, 0, 0, (TFT_WIDTH) - 1, (TFT_HEIGHT) - 1);
- #if HAS_LCD_IO
- tftio.WriteMultiple(TFT_MARLINBG_COLOR, (TFT_WIDTH) * (TFT_HEIGHT));
- #else
- memset2(buffer, TFT_MARLINBG_COLOR, (TFT_WIDTH) / 2);
- for (uint16_t i = 0; i < (TFT_HEIGHT) * sq(GRAPHICAL_TFT_UPSCALE); i++)
- u8g_WriteSequence(u8g, dev, (TFT_WIDTH) / 2, (uint8_t *)buffer);
- #endif
+ u8g_upscale_clear_lcd(u8g, dev, buffer);
return 0;
case U8G_DEV_MSG_STOP: preinit = true; break;
- case U8G_DEV_MSG_PAGE_FIRST:
+ case U8G_DEV_MSG_PAGE_FIRST: {
page = 0;
+ #if HAS_TOUCH_BUTTONS_SLEEP
+ static bool sleepCleared;
+ if (touchBt.isSleeping()) {
+ if (!sleepCleared) {
+ sleepCleared = true;
+ u8g_upscale_clear_lcd(u8g, dev, buffer);
+ IF_ENABLED(HAS_TOUCH_BUTTONS, redrawTouchButtons = true);
+ }
+ break;
+ }
+ else
+ sleepCleared = false;
+ #endif
TERN_(HAS_TOUCH_BUTTONS, drawTouchButtons(u8g, dev));
setWindow(u8g, dev, TFT_PIXEL_OFFSET_X, TFT_PIXEL_OFFSET_Y, X_HI, Y_HI);
- break;
+ } break;
case U8G_DEV_MSG_PAGE_NEXT:
+ if (TERN0(HAS_TOUCH_BUTTONS_SLEEP, touchBt.isSleeping())) break;
if (++page > (HEIGHT / PAGE_HEIGHT)) return 1;
LOOP_L_N(y, PAGE_HEIGHT) {
diff --git a/Marlin/src/lcd/e3v2/creality/rotary_encoder.cpp b/Marlin/src/lcd/e3v2/creality/rotary_encoder.cpp
index f46fef073e..6bb8d79be8 100644
--- a/Marlin/src/lcd/e3v2/creality/rotary_encoder.cpp
+++ b/Marlin/src/lcd/e3v2/creality/rotary_encoder.cpp
@@ -145,7 +145,9 @@ ENCODER_DiffState Encoder_ReceiveAnalyze() {
const float encoderStepRate = encoderMovementSteps / float(ms - EncoderRate.lastEncoderTime) * 1000;
if (encoderStepRate >= ENCODER_100X_STEPS_PER_SEC) encoderMultiplier = 100;
else if (encoderStepRate >= ENCODER_10X_STEPS_PER_SEC) encoderMultiplier = 10;
- else if (encoderStepRate >= ENCODER_5X_STEPS_PER_SEC) encoderMultiplier = 5;
+ #if ENCODER_5X_STEPS_PER_SEC
+ else if (encoderStepRate >= ENCODER_5X_STEPS_PER_SEC) encoderMultiplier = 5;
+ #endif
}
EncoderRate.lastEncoderTime = ms;
}
diff --git a/Marlin/src/lcd/e3v2/enhanced/dwin.cpp b/Marlin/src/lcd/e3v2/enhanced/dwin.cpp
index 9e43e4198e..cea36e21d6 100644
--- a/Marlin/src/lcd/e3v2/enhanced/dwin.cpp
+++ b/Marlin/src/lcd/e3v2/enhanced/dwin.cpp
@@ -33,13 +33,15 @@
#include "../../../MarlinCore.h"
#include "../../../core/serial.h"
#include "../../../core/macros.h"
-#include "../../../gcode/queue.h"
#include "../../../module/temperature.h"
#include "../../../module/printcounter.h"
#include "../../../module/motion.h"
#include "../../../module/planner.h"
+#include "../../../gcode/gcode.h"
+#include "../../../gcode/queue.h"
+
#if HAS_FILAMENT_SENSOR
#include "../../../feature/runout.h"
#endif
@@ -187,16 +189,24 @@ MenuClass *LevBedMenu = nullptr;
MenuClass *MoveMenu = nullptr;
MenuClass *ControlMenu = nullptr;
MenuClass *AdvancedSettings = nullptr;
-TERN_(HAS_HOME_OFFSET, MenuClass *HomeOffMenu = nullptr);
-TERN_(HAS_BED_PROBE, MenuClass *ProbeSetMenu = nullptr);
+#if HAS_HOME_OFFSET
+ MenuClass *HomeOffMenu = nullptr;
+#endif
+#if HAS_BED_PROBE
+ MenuClass *ProbeSetMenu = nullptr;
+#endif
MenuClass *FilSetMenu = nullptr;
MenuClass *SelectColorMenu = nullptr;
MenuClass *GetColorMenu = nullptr;
MenuClass *TuneMenu = nullptr;
MenuClass *MotionMenu = nullptr;
MenuClass *FilamentMenu = nullptr;
-TERN_(MESH_BED_LEVELING, MenuClass *ManualMesh = nullptr);
-TERN_(HAS_HOTEND, MenuClass *PreheatMenu = nullptr);
+#if ENABLED(MESH_BED_LEVELING)
+ MenuClass *ManualMesh = nullptr;
+#endif
+#if HAS_HOTEND
+ MenuClass *PreheatMenu = nullptr;
+#endif
MenuClass *TemperatureMenu = nullptr;
MenuClass *MaxSpeedMenu = nullptr;
MenuClass *MaxAccelMenu = nullptr;
@@ -1558,6 +1568,7 @@ void EachMomentUpdate() {
select_page.set(0);
Goto_Main_Menu();
}
+
#if ENABLED(POWER_LOSS_RECOVERY)
else if (DWIN_lcd_sd_status && recovery.dwin_flag) { // resume print before power off
static bool recovery_flag = false;
@@ -1679,7 +1690,7 @@ void DWIN_MeshLevelingStart() {
void DWIN_CompletedLeveling() { HMI_ReturnScreen(); }
-#if ENABLED(MESH_BED_LEVELING)
+#if HAS_MESH
void DWIN_MeshUpdate(const int8_t xpos, const int8_t ypos, const float zval) {
char msg[33] = "";
char str_1[6] = "";
@@ -1837,10 +1848,10 @@ void DWIN_SetColorDefaults() {
void DWIN_SetDataDefaults() {
DWIN_SetColorDefaults();
DWINUI::SetColors(HMI_data.Text_Color, HMI_data.Background_Color);
- TERN_(HAS_HOTEND, HMI_data.HotendPidT = PREHEAT_1_TEMP_HOTEND);
- TERN_(HAS_HEATED_BED, HMI_data.BedPidT = PREHEAT_1_TEMP_BED);
- TERN_(HAS_HOTEND, HMI_data.PidCycles = 5);
- TERN_(PREVENT_COLD_EXTRUSION, HMI_data.ExtMinT = EXTRUDE_MINTEMP);
+ TERN_(HAS_HOTEND, HMI_data.HotendPidT = PREHEAT_1_TEMP_HOTEND);
+ TERN_(HAS_HEATED_BED, HMI_data.BedPidT = PREHEAT_1_TEMP_BED);
+ TERN_(HAS_HOTEND, HMI_data.PidCycles = 5);
+ TERN_(PREVENT_COLD_EXTRUSION, HMI_data.ExtMinT = EXTRUDE_MINTEMP);
}
void DWIN_StoreSettings(char *buff) {
@@ -2112,9 +2123,9 @@ void SetHome() {
#if HAS_PREHEAT
void SetPreheat(const uint8_t i) {
- TERN_(HAS_HOTEND, thermalManager.setTargetHotend(ui.material_preset[i].hotend_temp, 0));
+ TERN_(HAS_HOTEND, thermalManager.setTargetHotend(ui.material_preset[i].hotend_temp, 0));
TERN_(HAS_HEATED_BED, thermalManager.setTargetBed(ui.material_preset[i].bed_temp));
- TERN_(HAS_FAN, thermalManager.set_fan_speed(0, ui.material_preset[i].fan_speed));
+ TERN_(HAS_FAN, thermalManager.set_fan_speed(0, ui.material_preset[i].fan_speed));
}
void SetPreheat0() { SetPreheat(0); }
void SetPreheat1() { SetPreheat(1); }
@@ -2193,14 +2204,20 @@ void SetPID(celsius_t t, heater_id_t h) {
planner.synchronize();
thermalManager.PID_autotune(t, h, HMI_data.PidCycles, true);
}
-TERN_(HAS_HOTEND, void HotendPID() { SetPID(HMI_data.HotendPidT, H_E0); })
-TERN_(HAS_HEATED_BED, void BedPID() { SetPID(HMI_data.BedPidT, H_BED); })
+#if HAS_HOTEND
+ void HotendPID() { SetPID(HMI_data.HotendPidT, H_E0); }
+#endif
+#if HAS_HEATED_BED
+ void BedPID() { SetPID(HMI_data.BedPidT, H_BED); }
+#endif
-void SetPwrLossr() {
- recovery.enable(!recovery.enabled);
- Draw_Chkb_Line(CurrentMenu->line(), recovery.enabled);
- DWIN_UpdateLCD();
-}
+#if ENABLED(POWER_LOSS_RECOVERY)
+ void SetPwrLossr() {
+ recovery.enable(!recovery.enabled);
+ Draw_Chkb_Line(CurrentMenu->line(), recovery.enabled);
+ DWIN_UpdateLCD();
+ }
+#endif
#if HAS_LCD_BRIGHTNESS
void ApplyBrightness() { ui.set_brightness(HMI_value.Value); }
@@ -2250,11 +2267,15 @@ void Goto_LockScreen() {
#endif
#endif
-TERN_(ADVANCED_PAUSE_FEATURE, void SetFilLoad() { SetPFloatOnClick(0, MAX_LOAD_UNLOAD, UNITFDIGITS); });
-TERN_(ADVANCED_PAUSE_FEATURE, void SetFilUnload() { SetPFloatOnClick(0, MAX_LOAD_UNLOAD, UNITFDIGITS); });
+#if ENABLED(ADVANCED_PAUSE_FEATURE)
+ void SetFilLoad() { SetPFloatOnClick(0, MAX_LOAD_UNLOAD, UNITFDIGITS); }
+ void SetFilUnload() { SetPFloatOnClick(0, MAX_LOAD_UNLOAD, UNITFDIGITS); }
+#endif
-TERN_(PREVENT_COLD_EXTRUSION, void ApplyExtMinT() { thermalManager.extrude_min_temp = HMI_data.ExtMinT; thermalManager.allow_cold_extrude = (HMI_data.ExtMinT == 0); });
-TERN_(PREVENT_COLD_EXTRUSION, void SetExtMinT() { SetPIntOnClick(MIN_ETEMP, MAX_ETEMP, ApplyExtMinT); });
+#if ENABLED(PREVENT_COLD_EXTRUSION)
+ void ApplyExtMinT() { thermalManager.extrude_min_temp = HMI_data.ExtMinT; thermalManager.allow_cold_extrude = (HMI_data.ExtMinT == 0); }
+ void SetExtMinT() { SetPIntOnClick(MIN_ETEMP, MAX_ETEMP, ApplyExtMinT); }
+#endif
void RestoreDefaultsColors() {
DWIN_SetColorDefaults();
@@ -2425,38 +2446,53 @@ void LevBedC () { LevBed(4); }
#endif
#if HAS_PREHEAT
- TERN_(HAS_HOTEND, void SetPreheatEndTemp() { SetPIntOnClick(MIN_ETEMP, MAX_ETEMP); });
- TERN_(HAS_HEATED_BED, void SetPreheatBedTemp() { SetPIntOnClick(BED_MINTEMP, BED_MAX_TARGET); });
- TERN_(HAS_FAN, void SetPreheatFanSpeed() { SetPIntOnClick(0, 255); });
+ #if HAS_HOTEND
+ void SetPreheatEndTemp() { SetPIntOnClick(MIN_ETEMP, MAX_ETEMP); }
+ #endif
+ #if HAS_HEATED_BED
+ void SetPreheatBedTemp() { SetPIntOnClick(BED_MINTEMP, BED_MAX_TARGET); }
+ #endif
+ #if HAS_FAN
+ void SetPreheatFanSpeed() { SetPIntOnClick(0, 255); }
+ #endif
#endif
void ApplyMaxSpeed() { planner.set_max_feedrate(HMI_value.axis, HMI_value.Value / MINUNITMULT); }
void SetMaxSpeedX() { HMI_value.axis = X_AXIS, SetFloatOnClick(MIN_MAXFEEDSPEED, default_max_feedrate[X_AXIS] * 2, UNITFDIGITS, planner.settings.max_feedrate_mm_s[X_AXIS], ApplyMaxSpeed); }
void SetMaxSpeedY() { HMI_value.axis = Y_AXIS, SetFloatOnClick(MIN_MAXFEEDSPEED, default_max_feedrate[Y_AXIS] * 2, UNITFDIGITS, planner.settings.max_feedrate_mm_s[Y_AXIS], ApplyMaxSpeed); }
void SetMaxSpeedZ() { HMI_value.axis = Z_AXIS, SetFloatOnClick(MIN_MAXFEEDSPEED, default_max_feedrate[Z_AXIS] * 2, UNITFDIGITS, planner.settings.max_feedrate_mm_s[Z_AXIS], ApplyMaxSpeed); }
-TERN_(HAS_HOTEND, void SetMaxSpeedE() { HMI_value.axis = E_AXIS; SetFloatOnClick(MIN_MAXFEEDSPEED, default_max_feedrate[E_AXIS] * 2, UNITFDIGITS, planner.settings.max_feedrate_mm_s[E_AXIS], ApplyMaxSpeed); });
+#if HAS_HOTEND
+ void SetMaxSpeedE() { HMI_value.axis = E_AXIS; SetFloatOnClick(MIN_MAXFEEDSPEED, default_max_feedrate[E_AXIS] * 2, UNITFDIGITS, planner.settings.max_feedrate_mm_s[E_AXIS], ApplyMaxSpeed); }
+#endif
void ApplyMaxAccel() { planner.set_max_acceleration(HMI_value.axis, HMI_value.Value); }
void SetMaxAccelX() { HMI_value.axis = X_AXIS, SetIntOnClick(MIN_MAXACCELERATION, default_max_acceleration[X_AXIS] * 2, planner.settings.max_acceleration_mm_per_s2[X_AXIS], ApplyMaxAccel); }
void SetMaxAccelY() { HMI_value.axis = Y_AXIS, SetIntOnClick(MIN_MAXACCELERATION, default_max_acceleration[Y_AXIS] * 2, planner.settings.max_acceleration_mm_per_s2[Y_AXIS], ApplyMaxAccel); }
void SetMaxAccelZ() { HMI_value.axis = Z_AXIS, SetIntOnClick(MIN_MAXACCELERATION, default_max_acceleration[Z_AXIS] * 2, planner.settings.max_acceleration_mm_per_s2[Z_AXIS], ApplyMaxAccel); }
-TERN_(HAS_HOTEND, void SetMaxAccelE() { HMI_value.axis = E_AXIS; SetIntOnClick(MIN_MAXACCELERATION, default_max_acceleration[E_AXIS] * 2, planner.settings.max_acceleration_mm_per_s2[E_AXIS], ApplyMaxAccel); });
+#if HAS_HOTEND
+ void SetMaxAccelE() { HMI_value.axis = E_AXIS; SetIntOnClick(MIN_MAXACCELERATION, default_max_acceleration[E_AXIS] * 2, planner.settings.max_acceleration_mm_per_s2[E_AXIS], ApplyMaxAccel); }
+#endif
#if HAS_CLASSIC_JERK
void ApplyMaxJerk() { planner.set_max_jerk(HMI_value.axis, HMI_value.Value / MINUNITMULT); }
void SetMaxJerkX() { HMI_value.axis = X_AXIS, SetFloatOnClick(MIN_MAXJERK, default_max_jerk[X_AXIS] * 2, UNITFDIGITS, planner.max_jerk[X_AXIS], ApplyMaxJerk); }
void SetMaxJerkY() { HMI_value.axis = Y_AXIS, SetFloatOnClick(MIN_MAXJERK, default_max_jerk[Y_AXIS] * 2, UNITFDIGITS, planner.max_jerk[Y_AXIS], ApplyMaxJerk); }
void SetMaxJerkZ() { HMI_value.axis = Z_AXIS, SetFloatOnClick(MIN_MAXJERK, default_max_jerk[Z_AXIS] * 2, UNITFDIGITS, planner.max_jerk[Z_AXIS], ApplyMaxJerk); }
- TERN_(HAS_HOTEND, void SetMaxJerkE() { HMI_value.axis = E_AXIS; SetFloatOnClick(MIN_MAXJERK, default_max_jerk[E_AXIS] * 2, UNITFDIGITS, planner.max_jerk[E_AXIS], ApplyMaxJerk); });
+ #if HAS_HOTEND
+ void SetMaxJerkE() { HMI_value.axis = E_AXIS; SetFloatOnClick(MIN_MAXJERK, default_max_jerk[E_AXIS] * 2, UNITFDIGITS, planner.max_jerk[E_AXIS], ApplyMaxJerk); }
+ #endif
#endif
void SetStepsX() { HMI_value.axis = X_AXIS, SetPFloatOnClick( MIN_STEP, MAX_STEP, UNITFDIGITS); }
void SetStepsY() { HMI_value.axis = Y_AXIS, SetPFloatOnClick( MIN_STEP, MAX_STEP, UNITFDIGITS); }
void SetStepsZ() { HMI_value.axis = Z_AXIS, SetPFloatOnClick( MIN_STEP, MAX_STEP, UNITFDIGITS); }
-TERN_(HAS_HOTEND, void SetStepsE() { HMI_value.axis = E_AXIS; SetPFloatOnClick( MIN_STEP, MAX_STEP, UNITFDIGITS); });
-
-TERN_(HAS_HOTEND, void SetHotendPidT() { SetPIntOnClick(MIN_ETEMP, MAX_ETEMP); })
-TERN_(HAS_HEATED_BED, void SetBedPidT() { SetPIntOnClick(BED_MINTEMP, BED_MAX_TARGET); })
+#if HAS_HOTEND
+ void SetStepsE() { HMI_value.axis = E_AXIS; SetPFloatOnClick( MIN_STEP, MAX_STEP, UNITFDIGITS); }
+ void SetHotendPidT() { SetPIntOnClick(MIN_ETEMP, MAX_ETEMP); }
+#endif
+#if HAS_HEATED_BED
+ void SetBedPidT() { SetPIntOnClick(BED_MINTEMP, BED_MAX_TARGET); }
+#endif
#if HAS_HOTEND || HAS_HEATED_BED
void SetPidCycles() { SetPIntOnClick(3, 50); }
@@ -2649,7 +2685,9 @@ void onDrawLanguage(MenuItemClass* menuitem, int8_t line) {
DWINUI::Draw_String(VALX, MBASE(line), HMI_IsChinese() ? F("CN") : F("EN"));
}
-void onDrawPwrLossR(MenuItemClass* menuitem, int8_t line) { onDrawChkbMenu(menuitem, line, recovery.enabled); }
+#if ENABLED(POWER_LOSS_RECOVERY)
+ void onDrawPwrLossR(MenuItemClass* menuitem, int8_t line) { onDrawChkbMenu(menuitem, line, recovery.enabled); }
+#endif
void onDrawEnableSound(MenuItemClass* menuitem, int8_t line) { onDrawChkbMenu(menuitem, line, ui.buzzer_enabled); }
@@ -3076,12 +3114,16 @@ void Draw_Prepare_Menu() {
SetMenuTitle({133, 1, 28, 13}, {179, 0, 48, 14}, GET_TEXT_F(MSG_PREPARE));
DWINUI::MenuItemsPrepare(13);
ADDMENUITEM(ICON_Back, GET_TEXT(MSG_BUTTON_BACK), onDrawBack, Goto_Main_Menu);
- TERN_(ADVANCED_PAUSE_FEATURE, ADDMENUITEM(ICON_FilMan, GET_TEXT(MSG_FILAMENT_MAN), onDrawSubMenu, Draw_FilamentMan_Menu));
+ #if ENABLED(ADVANCED_PAUSE_FEATURE)
+ ADDMENUITEM(ICON_FilMan, GET_TEXT(MSG_FILAMENT_MAN), onDrawSubMenu, Draw_FilamentMan_Menu);
+ #endif
ADDMENUITEM(ICON_Axis, GET_TEXT(MSG_MOVE_AXIS), onDrawMoveSubMenu, Draw_Move_Menu);
ADDMENUITEM(ICON_LevBed, GET_TEXT(MSG_BED_LEVELING), onDrawSubMenu, Draw_LevBedCorners_Menu);
ADDMENUITEM(ICON_CloseMotor, GET_TEXT(MSG_DISABLE_STEPPERS), onDrawDisableMotors, DisableMotors);
ADDMENUITEM(ICON_Homing, GET_TEXT(MSG_AUTO_HOME), onDrawAutoHome, AutoHome);
- TERN_(MESH_BED_LEVELING, ADDMENUITEM(ICON_ManualMesh, GET_TEXT(MSG_MANUAL_MESH), onDrawSubMenu, Draw_ManualMesh_Menu));
+ #if ENABLED(MESH_BED_LEVELING)
+ ADDMENUITEM(ICON_ManualMesh, GET_TEXT(MSG_MANUAL_MESH), onDrawSubMenu, Draw_ManualMesh_Menu);
+ #endif
#if HAS_ZOFFSET_ITEM
#if EITHER(HAS_BED_PROBE, BABYSTEPPING)
ADDMENUITEM(ICON_SetZOffset, GET_TEXT(MSG_PROBE_WIZARD), onDrawSubMenu, Draw_ZOffsetWiz_Menu);
@@ -3094,7 +3136,9 @@ void Draw_Prepare_Menu() {
ADDMENUITEM(ICON_ABSPreheat, PSTR("Preheat " PREHEAT_2_LABEL), onDrawPreheat2, SetPreheat1);
ADDMENUITEM(ICON_CustomPreheat, GET_TEXT(MSG_PREHEAT_CUSTOM), onDrawMenuItem, SetPreheat2);
#endif
- TERN_(HAS_PREHEAT, ADDMENUITEM(ICON_Cool, GET_TEXT(MSG_COOLDOWN), onDrawCooldown, SetCoolDown));
+ #if HAS_PREHEAT
+ ADDMENUITEM(ICON_Cool, GET_TEXT(MSG_COOLDOWN), onDrawCooldown, SetCoolDown);
+ #endif
ADDMENUITEM(ICON_Language, PSTR("UI Language"), onDrawLanguage, SetLanguage);
}
CurrentMenu->Draw();
@@ -3148,15 +3192,31 @@ void Draw_AdvancedSettings_Menu() {
SetMenuTitle({0}, {0}, GET_TEXT_F(MSG_ADVANCED_SETTINGS)); // TODO: Chinese, English "Advanced Settings" JPG
DWINUI::MenuItemsPrepare(11);
ADDMENUITEM(ICON_Back, GET_TEXT(MSG_BUTTON_BACK), onDrawBack, Draw_Control_Menu);
- TERN_(HAS_HOME_OFFSET, ADDMENUITEM(ICON_HomeOffset, GET_TEXT(MSG_SET_HOME_OFFSETS), onDrawSubMenu, Draw_HomeOffset_Menu));
- TERN_(HAS_BED_PROBE, ADDMENUITEM(ICON_ProbeSet, GET_TEXT(MSG_ZPROBE_SETTINGS), onDrawSubMenu, Draw_ProbeSet_Menu));
- TERN_(HAS_HOTEND, ADDMENUITEM(ICON_PIDNozzle, F("Hotend PID Settings"), onDrawSubMenu, Draw_HotendPID_Menu));
- TERN_(HAS_HEATED_BED, ADDMENUITEM(ICON_PIDbed, F("Bed PID Settings"), onDrawSubMenu, Draw_BedPID_Menu));
- TERN_(HAS_FILAMENT_SENSOR, ADDMENUITEM(ICON_FilSet, GET_TEXT(MSG_FILAMENT_SET), onDrawSubMenu, Draw_FilSet_Menu));
- TERN_(POWER_LOSS_RECOVERY, ADDMENUITEM(ICON_Pwrlossr, F("Power-loss recovery"), onDrawPwrLossR, SetPwrLossr));
- TERN_(HAS_LCD_BRIGHTNESS, ADDMENUITEM_P(ICON_Brightness, F("LCD Brightness"), onDrawPInt8Menu, SetBrightness, &ui.brightness));
+ #if HAS_HOME_OFFSET
+ ADDMENUITEM(ICON_HomeOffset, GET_TEXT(MSG_SET_HOME_OFFSETS), onDrawSubMenu, Draw_HomeOffset_Menu);
+ #endif
+ #if HAS_BED_PROBE
+ ADDMENUITEM(ICON_ProbeSet, GET_TEXT(MSG_ZPROBE_SETTINGS), onDrawSubMenu, Draw_ProbeSet_Menu);
+ #endif
+ #if HAS_HOTEND
+ ADDMENUITEM(ICON_PIDNozzle, F("Hotend PID Settings"), onDrawSubMenu, Draw_HotendPID_Menu);
+ #endif
+ #if HAS_HEATED_BED
+ ADDMENUITEM(ICON_PIDbed, F("Bed PID Settings"), onDrawSubMenu, Draw_BedPID_Menu);
+ #endif
+ #if HAS_FILAMENT_SENSOR
+ ADDMENUITEM(ICON_FilSet, GET_TEXT(MSG_FILAMENT_SET), onDrawSubMenu, Draw_FilSet_Menu);
+ #endif
+ #if ENABLED(POWER_LOSS_RECOVERY)
+ ADDMENUITEM(ICON_Pwrlossr, F("Power-loss recovery"), onDrawPwrLossR, SetPwrLossr);
+ #endif
+ #if HAS_LCD_BRIGHTNESS
+ ADDMENUITEM_P(ICON_Brightness, F("LCD Brightness"), onDrawPInt8Menu, SetBrightness, &ui.brightness);
+ #endif
ADDMENUITEM(ICON_Scolor, F("Select Colors"), onDrawSubMenu, Draw_SelectColors_Menu);
- TERN_(SOUND_MENU_ITEM, ADDMENUITEM(ICON_Sound, F("Enable Sound"), onDrawEnableSound, SetEnableSound));
+ #if ENABLED(SOUND_MENU_ITEM)
+ ADDMENUITEM(ICON_Sound, F("Enable Sound"), onDrawEnableSound, SetEnableSound);
+ #endif
ADDMENUITEM(ICON_Lock, F("Lock Screen"), onDrawMenuItem, Goto_LockScreen);
}
CurrentMenu->Draw();
@@ -3173,7 +3233,9 @@ void Draw_Move_Menu() {
ADDMENUITEM_P(ICON_MoveX, GET_TEXT(MSG_MOVE_X), onDrawMoveX, SetMoveX, ¤t_position.x);
ADDMENUITEM_P(ICON_MoveY, GET_TEXT(MSG_MOVE_Y), onDrawMoveY, SetMoveY, ¤t_position.y);
ADDMENUITEM_P(ICON_MoveZ, GET_TEXT(MSG_MOVE_Z), onDrawMoveZ, SetMoveZ, ¤t_position.z);
- TERN_(HAS_HOTEND, ADDMENUITEM_P(ICON_Extruder, GET_TEXT(MSG_MOVE_E), onDrawMoveE, SetMoveE, ¤t_position.e));
+ #if HAS_HOTEND
+ ADDMENUITEM_P(ICON_Extruder, GET_TEXT(MSG_MOVE_E), onDrawMoveE, SetMoveE, ¤t_position.e);
+ #endif
}
CurrentMenu->Draw();
if (!all_axes_trusted()) ui.set_status_P(PSTR("WARNING: position is unknow"));
@@ -3223,11 +3285,19 @@ void Draw_Move_Menu() {
CurrentMenu->MenuTitle.SetCaption(GET_TEXT_F(MSG_FILAMENT_SET));
DWINUI::MenuItemsPrepare(6);
ADDMENUITEM(ICON_Back, GET_TEXT(MSG_BUTTON_BACK), onDrawMenuItem, Draw_AdvancedSettings_Menu);
- TERN_(HAS_FILAMENT_SENSOR, ADDMENUITEM(ICON_Runout, GET_TEXT(MSG_RUNOUT_ENABLE), onDrawRunoutEnable, SetRunoutEnable));
- TERN_(HAS_FILAMENT_RUNOUT_DISTANCE, ADDMENUITEM_P(ICON_Runout, F("Runout Distance"), onDrawPFloatMenu, SetRunoutDistance, &runout.runout_distance()));
- TERN_(PREVENT_COLD_EXTRUSION, ADDMENUITEM_P(ICON_ExtrudeMinT, F("Extrude Min Temp."), onDrawPIntMenu, SetExtMinT, &HMI_data.ExtMinT));
- TERN_(ADVANCED_PAUSE_FEATURE, ADDMENUITEM_P(ICON_FilLoad, GET_TEXT(MSG_FILAMENT_LOAD), onDrawPFloatMenu, SetFilLoad, &fc_settings[0].load_length));
- TERN_(ADVANCED_PAUSE_FEATURE, ADDMENUITEM_P(ICON_FilUnload, GET_TEXT(MSG_FILAMENT_UNLOAD), onDrawPFloatMenu, SetFilUnload, &fc_settings[0].unload_length));
+ #if HAS_FILAMENT_SENSOR
+ ADDMENUITEM(ICON_Runout, GET_TEXT(MSG_RUNOUT_ENABLE), onDrawRunoutEnable, SetRunoutEnable);
+ #endif
+ #if HAS_FILAMENT_RUNOUT_DISTANCE
+ ADDMENUITEM_P(ICON_Runout, F("Runout Distance"), onDrawPFloatMenu, SetRunoutDistance, &runout.runout_distance());
+ #endif
+ #if ENABLED(PREVENT_COLD_EXTRUSION)
+ ADDMENUITEM_P(ICON_ExtrudeMinT, F("Extrude Min Temp."), onDrawPIntMenu, SetExtMinT, &HMI_data.ExtMinT);
+ #endif
+ #if ENABLED(ADVANCED_PAUSE_FEATURE)
+ ADDMENUITEM_P(ICON_FilLoad, GET_TEXT(MSG_FILAMENT_LOAD), onDrawPFloatMenu, SetFilLoad, &fc_settings[0].load_length);
+ ADDMENUITEM_P(ICON_FilUnload, GET_TEXT(MSG_FILAMENT_UNLOAD), onDrawPFloatMenu, SetFilUnload, &fc_settings[0].unload_length);
+ #endif
}
CurrentMenu->Draw();
}
@@ -3289,16 +3359,26 @@ void Draw_Tune_Menu() {
DWINUI::MenuItemsPrepare(10);
ADDMENUITEM(ICON_Back, GET_TEXT(MSG_BUTTON_BACK), onDrawBack, Goto_PrintProcess);
ADDMENUITEM_P(ICON_Speed, GET_TEXT(MSG_SPEED), onDrawSpeedItem, SetSpeed, &feedrate_percentage);
- TERN_(HAS_HOTEND, HotendTargetItem = ADDMENUITEM_P(ICON_HotendTemp, GET_TEXT(MSG_UBL_SET_TEMP_HOTEND), onDrawHotendTemp, SetHotendTemp, &thermalManager.temp_hotend[0].target));
- TERN_(HAS_HEATED_BED, BedTargetItem = ADDMENUITEM_P(ICON_BedTemp, GET_TEXT(MSG_UBL_SET_TEMP_BED), onDrawBedTemp, SetBedTemp, &thermalManager.temp_bed.target));
- TERN_(HAS_FAN, FanSpeedItem = ADDMENUITEM_P(ICON_FanSpeed, GET_TEXT(MSG_FAN_SPEED), onDrawFanSpeed, SetFanSpeed, &thermalManager.fan_speed[0]));
+ #if HAS_HOTEND
+ HotendTargetItem = ADDMENUITEM_P(ICON_HotendTemp, GET_TEXT(MSG_UBL_SET_TEMP_HOTEND), onDrawHotendTemp, SetHotendTemp, &thermalManager.temp_hotend[0].target);
+ #endif
+ #if HAS_HEATED_BED
+ BedTargetItem = ADDMENUITEM_P(ICON_BedTemp, GET_TEXT(MSG_UBL_SET_TEMP_BED), onDrawBedTemp, SetBedTemp, &thermalManager.temp_bed.target);
+ #endif
+ #if HAS_FAN
+ FanSpeedItem = ADDMENUITEM_P(ICON_FanSpeed, GET_TEXT(MSG_FAN_SPEED), onDrawFanSpeed, SetFanSpeed, &thermalManager.fan_speed[0]);
+ #endif
#if HAS_ZOFFSET_ITEM && EITHER(HAS_BED_PROBE, BABYSTEPPING)
ADDMENUITEM_P(ICON_Zoffset, GET_TEXT(MSG_ZPROBE_ZOFFSET), onDrawZOffset, SetZOffset, &BABY_Z_VAR);
#endif
ADDMENUITEM_P(ICON_Flow, GET_TEXT(MSG_FLOW), onDrawPIntMenu, SetFlow, &planner.flow_percentage[0]);
- TERN_(ADVANCED_PAUSE_FEATURE, ADDMENUITEM(ICON_FilMan, GET_TEXT(MSG_FILAMENTCHANGE), onDrawMenuItem, ChangeFilament));
+ #if ENABLED(ADVANCED_PAUSE_FEATURE)
+ ADDMENUITEM(ICON_FilMan, GET_TEXT(MSG_FILAMENTCHANGE), onDrawMenuItem, ChangeFilament);
+ #endif
ADDMENUITEM(ICON_Lock, F("Lock Screen"), onDrawMenuItem, Goto_LockScreen);
- TERN_(HAS_LCD_BRIGHTNESS, ADDMENUITEM_P(ICON_Brightness, F("LCD Brightness"), onDrawPInt8Menu, SetBrightness, &ui.brightness));
+ #if HAS_LCD_BRIGHTNESS
+ ADDMENUITEM_P(ICON_Brightness, F("LCD Brightness"), onDrawPInt8Menu, SetBrightness, &ui.brightness);
+ #endif
}
CurrentMenu->Draw();
}
@@ -3313,7 +3393,9 @@ void Draw_Motion_Menu() {
ADDMENUITEM(ICON_Back, GET_TEXT(MSG_BUTTON_BACK), onDrawBack, Draw_Control_Menu);
ADDMENUITEM(ICON_MaxSpeed, GET_TEXT(MSG_SPEED), onDrawSpeed, Draw_MaxSpeed_Menu);
ADDMENUITEM(ICON_MaxAccelerated, GET_TEXT(MSG_ACCELERATION), onDrawAcc, Draw_MaxAccel_Menu);
- TERN_(HAS_CLASSIC_JERK, ADDMENUITEM(ICON_MaxJerk, GET_TEXT(MSG_JERK), onDrawJerk, Draw_MaxJerk_Menu));
+ #if HAS_CLASSIC_JERK
+ ADDMENUITEM(ICON_MaxJerk, GET_TEXT(MSG_JERK), onDrawJerk, Draw_MaxJerk_Menu);
+ #endif
ADDMENUITEM(ICON_Step, GET_TEXT(MSG_STEPS_PER_MM), onDrawSteps, Draw_Steps_Menu);
ADDMENUITEM_P(ICON_Flow, GET_TEXT(MSG_FLOW), onDrawPIntMenu, SetFlow, &planner.flow_percentage[0]);
}
@@ -3331,8 +3413,10 @@ void Draw_Motion_Menu() {
ADDMENUITEM(ICON_Back, GET_TEXT(MSG_BUTTON_BACK), onDrawBack, Draw_Prepare_Menu);
ADDMENUITEM(ICON_Park, GET_TEXT(MSG_FILAMENT_PARK_ENABLED), onDrawMenuItem, ParkHead);
ADDMENUITEM(ICON_FilMan, GET_TEXT(MSG_FILAMENTCHANGE), onDrawMenuItem, ChangeFilament);
- TERN_(FILAMENT_LOAD_UNLOAD_GCODES, ADDMENUITEM(ICON_FilUnload, GET_TEXT(MSG_FILAMENTUNLOAD), onDrawMenuItem, UnloadFilament));
- TERN_(FILAMENT_LOAD_UNLOAD_GCODES, ADDMENUITEM(ICON_FilLoad, GET_TEXT(MSG_FILAMENTLOAD), onDrawMenuItem, LoadFilament));
+ #if ENABLED(FILAMENT_LOAD_UNLOAD_GCODES)
+ ADDMENUITEM(ICON_FilUnload, GET_TEXT(MSG_FILAMENTUNLOAD), onDrawMenuItem, UnloadFilament);
+ ADDMENUITEM(ICON_FilLoad, GET_TEXT(MSG_FILAMENTLOAD), onDrawMenuItem, LoadFilament);
+ #endif
}
CurrentMenu->Draw();
}
@@ -3364,10 +3448,18 @@ void Draw_Motion_Menu() {
SetMenuTitle(cn, en, text);
DWINUI::MenuItemsPrepare(5);
ADDMENUITEM(ICON_Back, GET_TEXT(MSG_BUTTON_BACK), onDrawBack, Draw_Temperature_Menu);
- TERN_(HAS_HOTEND, ADDMENUITEM_P(ICON_SetEndTemp, GET_TEXT(MSG_UBL_SET_TEMP_HOTEND), onDrawSetPreheatHotend, SetPreheatEndTemp, &ui.material_preset[HMI_value.Preheat].hotend_temp));
- TERN_(HAS_HEATED_BED, ADDMENUITEM_P(ICON_SetBedTemp, GET_TEXT(MSG_UBL_SET_TEMP_BED), onDrawSetPreheatBed, SetPreheatBedTemp, &ui.material_preset[HMI_value.Preheat].bed_temp));
- TERN_(HAS_FAN, ADDMENUITEM_P(ICON_FanSpeed, GET_TEXT(MSG_FAN_SPEED), onDrawSetPreheatFan, SetPreheatFanSpeed, &ui.material_preset[HMI_value.Preheat].fan_speed));
- TERN_(EEPROM_SETTINGS, ADDMENUITEM(ICON_WriteEEPROM, GET_TEXT(MSG_STORE_EEPROM), onDrawWriteEeprom, WriteEeprom));
+ #if HAS_HOTEND
+ ADDMENUITEM_P(ICON_SetEndTemp, GET_TEXT(MSG_UBL_SET_TEMP_HOTEND), onDrawSetPreheatHotend, SetPreheatEndTemp, &ui.material_preset[HMI_value.Preheat].hotend_temp);
+ #endif
+ #if HAS_HEATED_BED
+ ADDMENUITEM_P(ICON_SetBedTemp, GET_TEXT(MSG_UBL_SET_TEMP_BED), onDrawSetPreheatBed, SetPreheatBedTemp, &ui.material_preset[HMI_value.Preheat].bed_temp);
+ #endif
+ #if HAS_FAN
+ ADDMENUITEM_P(ICON_FanSpeed, GET_TEXT(MSG_FAN_SPEED), onDrawSetPreheatFan, SetPreheatFanSpeed, &ui.material_preset[HMI_value.Preheat].fan_speed);
+ #endif
+ #if ENABLED(EEPROM_SETTINGS)
+ ADDMENUITEM(ICON_WriteEEPROM, GET_TEXT(MSG_STORE_EEPROM), onDrawWriteEeprom, WriteEeprom);
+ #endif
}
CurrentMenu->Draw();
}
@@ -3403,9 +3495,15 @@ void Draw_Temperature_Menu() {
SetMenuTitle({236, 2, 28, 12}, {56, 15, 85, 14}, GET_TEXT_F(MSG_TEMPERATURE));
DWINUI::MenuItemsPrepare(7);
ADDMENUITEM(ICON_Back, GET_TEXT(MSG_BUTTON_BACK), onDrawBack, Draw_Control_Menu);
- TERN_(HAS_HOTEND, HotendTargetItem = ADDMENUITEM_P(ICON_SetEndTemp, GET_TEXT(MSG_UBL_SET_TEMP_HOTEND), onDrawHotendTemp, SetHotendTemp, &thermalManager.temp_hotend[0].target));
- TERN_(HAS_HEATED_BED, BedTargetItem = ADDMENUITEM_P(ICON_SetBedTemp, GET_TEXT(MSG_UBL_SET_TEMP_BED), onDrawBedTemp, SetBedTemp, &thermalManager.temp_bed.target));
- TERN_(HAS_FAN, FanSpeedItem = ADDMENUITEM_P(ICON_FanSpeed, GET_TEXT(MSG_FAN_SPEED), onDrawFanSpeed, SetFanSpeed, &thermalManager.fan_speed[0]));
+ #if HAS_HOTEND
+ HotendTargetItem = ADDMENUITEM_P(ICON_SetEndTemp, GET_TEXT(MSG_UBL_SET_TEMP_HOTEND), onDrawHotendTemp, SetHotendTemp, &thermalManager.temp_hotend[0].target);
+ #endif
+ #if HAS_HEATED_BED
+ BedTargetItem = ADDMENUITEM_P(ICON_SetBedTemp, GET_TEXT(MSG_UBL_SET_TEMP_BED), onDrawBedTemp, SetBedTemp, &thermalManager.temp_bed.target);
+ #endif
+ #if HAS_FAN
+ FanSpeedItem = ADDMENUITEM_P(ICON_FanSpeed, GET_TEXT(MSG_FAN_SPEED), onDrawFanSpeed, SetFanSpeed, &thermalManager.fan_speed[0]);
+ #endif
#if HAS_HOTEND
ADDMENUITEM(ICON_SetPLAPreheat, F(PREHEAT_1_LABEL " Preheat Settings"), onDrawPLAPreheatSubMenu, Draw_Preheat1_Menu);
ADDMENUITEM(ICON_SetABSPreheat, F(PREHEAT_2_LABEL " Preheat Settings"), onDrawABSPreheatSubMenu, Draw_Preheat2_Menu);
@@ -3428,7 +3526,9 @@ void Draw_MaxSpeed_Menu() {
ADDMENUITEM_P(ICON_MaxSpeedX, GET_TEXT(MSG_MAXSPEED_X), onDrawMaxSpeedX, SetMaxSpeedX, &planner.settings.max_feedrate_mm_s[X_AXIS]);
ADDMENUITEM_P(ICON_MaxSpeedY, GET_TEXT(MSG_MAXSPEED_Y), onDrawMaxSpeedY, SetMaxSpeedY, &planner.settings.max_feedrate_mm_s[Y_AXIS]);
ADDMENUITEM_P(ICON_MaxSpeedZ, GET_TEXT(MSG_MAXSPEED_Z), onDrawMaxSpeedZ, SetMaxSpeedZ, &planner.settings.max_feedrate_mm_s[Z_AXIS]);
- TERN_(HAS_HOTEND, ADDMENUITEM_P(ICON_MaxSpeedE, GET_TEXT(MSG_MAXSPEED_E), onDrawMaxSpeedE, SetMaxSpeedE, &planner.settings.max_feedrate_mm_s[Z_AXIS]));
+ #if HAS_HOTEND
+ ADDMENUITEM_P(ICON_MaxSpeedE, GET_TEXT(MSG_MAXSPEED_E), onDrawMaxSpeedE, SetMaxSpeedE, &planner.settings.max_feedrate_mm_s[Z_AXIS]);
+ #endif
}
CurrentMenu->Draw();
}
@@ -3444,7 +3544,9 @@ void Draw_MaxAccel_Menu() {
ADDMENUITEM_P(ICON_MaxAccX, GET_TEXT(MSG_AMAX_A), onDrawMaxAccelX, SetMaxAccelX, &planner.settings.max_acceleration_mm_per_s2[X_AXIS]);
ADDMENUITEM_P(ICON_MaxAccY, GET_TEXT(MSG_AMAX_B), onDrawMaxAccelY, SetMaxAccelY, &planner.settings.max_acceleration_mm_per_s2[Y_AXIS]);
ADDMENUITEM_P(ICON_MaxAccZ, GET_TEXT(MSG_AMAX_C), onDrawMaxAccelZ, SetMaxAccelZ, &planner.settings.max_acceleration_mm_per_s2[Z_AXIS]);
- TERN_(HAS_HOTEND, ADDMENUITEM_P(ICON_MaxAccE, GET_TEXT(MSG_AMAX_E), onDrawMaxAccelE, SetMaxAccelE, &planner.settings.max_acceleration_mm_per_s2[E_AXIS]));
+ #if HAS_HOTEND
+ ADDMENUITEM_P(ICON_MaxAccE, GET_TEXT(MSG_AMAX_E), onDrawMaxAccelE, SetMaxAccelE, &planner.settings.max_acceleration_mm_per_s2[E_AXIS]);
+ #endif
}
CurrentMenu->Draw();
}
@@ -3461,7 +3563,9 @@ void Draw_MaxAccel_Menu() {
ADDMENUITEM_P(ICON_MaxSpeedJerkX, GET_TEXT(MSG_VA_JERK), onDrawMaxJerkX, SetMaxJerkX, &planner.max_jerk[X_AXIS]);
ADDMENUITEM_P(ICON_MaxSpeedJerkY, GET_TEXT(MSG_VB_JERK), onDrawMaxJerkY, SetMaxJerkY, &planner.max_jerk[Y_AXIS]);
ADDMENUITEM_P(ICON_MaxSpeedJerkZ, GET_TEXT(MSG_VC_JERK), onDrawMaxJerkZ, SetMaxJerkZ, &planner.max_jerk[Z_AXIS]);
- TERN_(HAS_HOTEND, ADDMENUITEM_P(ICON_MaxSpeedJerkE, GET_TEXT(MSG_VE_JERK), onDrawMaxJerkE, SetMaxJerkE, &planner.max_jerk[E_AXIS]));
+ #if HAS_HOTEND
+ ADDMENUITEM_P(ICON_MaxSpeedJerkE, GET_TEXT(MSG_VE_JERK), onDrawMaxJerkE, SetMaxJerkE, &planner.max_jerk[E_AXIS]);
+ #endif
}
CurrentMenu->Draw();
}
@@ -3478,7 +3582,9 @@ void Draw_Steps_Menu() {
ADDMENUITEM_P(ICON_StepX, GET_TEXT(MSG_A_STEPS), onDrawStepsX, SetStepsX, &planner.settings.axis_steps_per_mm[X_AXIS]);
ADDMENUITEM_P(ICON_StepY, GET_TEXT(MSG_B_STEPS), onDrawStepsY, SetStepsY, &planner.settings.axis_steps_per_mm[Y_AXIS]);
ADDMENUITEM_P(ICON_StepZ, GET_TEXT(MSG_C_STEPS), onDrawStepsZ, SetStepsZ, &planner.settings.axis_steps_per_mm[Z_AXIS]);
- TERN_(HAS_HOTEND, ADDMENUITEM_P(ICON_StepE, GET_TEXT(MSG_E_STEPS), onDrawStepsE, SetStepsE, &planner.settings.axis_steps_per_mm[E_AXIS]));
+ #if HAS_HOTEND
+ ADDMENUITEM_P(ICON_StepE, GET_TEXT(MSG_E_STEPS), onDrawStepsE, SetStepsE, &planner.settings.axis_steps_per_mm[E_AXIS]);
+ #endif
}
CurrentMenu->Draw();
}
@@ -3498,7 +3604,9 @@ void Draw_Steps_Menu() {
ADDMENUITEM_P(ICON_PIDValue, F("Set" STR_KD), onDrawPIDd, SetKd, &thermalManager.temp_hotend[0].pid.Kd);
ADDMENUITEM_P(ICON_Temperature, GET_TEXT(MSG_TEMPERATURE), onDrawPIntMenu, SetHotendPidT, &HMI_data.HotendPidT);
ADDMENUITEM_P(ICON_PIDcycles, GET_TEXT(MSG_PID_CYCLE), onDrawPIntMenu, SetPidCycles, &HMI_data.PidCycles);
- TERN_(EEPROM_SETTINGS, ADDMENUITEM(ICON_WriteEEPROM, GET_TEXT(MSG_STORE_EEPROM), onDrawMenuItem, WriteEeprom));
+ #if ENABLED(EEPROM_SETTINGS)
+ ADDMENUITEM(ICON_WriteEEPROM, GET_TEXT(MSG_STORE_EEPROM), onDrawMenuItem, WriteEeprom);
+ #endif
}
CurrentMenu->Draw();
}
@@ -3519,7 +3627,9 @@ void Draw_Steps_Menu() {
ADDMENUITEM_P(ICON_PIDValue, F("Set" STR_KD), onDrawPIDd, SetKd, &thermalManager.temp_bed.pid.Kd);
ADDMENUITEM_P(ICON_Temperature, GET_TEXT(MSG_TEMPERATURE), onDrawPIntMenu, SetBedPidT, &HMI_data.BedPidT);
ADDMENUITEM_P(ICON_PIDcycles, GET_TEXT(MSG_PID_CYCLE), onDrawPIntMenu, SetPidCycles, &HMI_data.PidCycles);
- TERN_(EEPROM_SETTINGS, ADDMENUITEM(ICON_WriteEEPROM, GET_TEXT(MSG_STORE_EEPROM), onDrawMenuItem, WriteEeprom));
+ #if ENABLED(EEPROM_SETTINGS)
+ ADDMENUITEM(ICON_WriteEEPROM, GET_TEXT(MSG_STORE_EEPROM), onDrawMenuItem, WriteEeprom);
+ #endif
}
CurrentMenu->Draw();
}
diff --git a/Marlin/src/lcd/e3v2/enhanced/dwin.h b/Marlin/src/lcd/e3v2/enhanced/dwin.h
index ee83f9ad7c..db4cc2121f 100644
--- a/Marlin/src/lcd/e3v2/enhanced/dwin.h
+++ b/Marlin/src/lcd/e3v2/enhanced/dwin.h
@@ -196,7 +196,9 @@ void DWIN_StatusChanged(const char * const text);
void DWIN_StatusChanged_P(PGM_P const text);
void DWIN_StartHoming();
void DWIN_CompletedHoming();
-TERN_(MESH_BED_LEVELING, void DWIN_MeshUpdate(const int8_t xpos, const int8_t ypos, const float zval));
+#if HAS_MESH
+ void DWIN_MeshUpdate(const int8_t xpos, const int8_t ypos, const float zval);
+#endif
void DWIN_MeshLevelingStart();
void DWIN_CompletedLeveling();
void DWIN_PidTuning(pidresult_t result);
diff --git a/Marlin/src/lcd/e3v2/enhanced/rotary_encoder.cpp b/Marlin/src/lcd/e3v2/enhanced/rotary_encoder.cpp
index 4f815fdee0..de478f79f4 100644
--- a/Marlin/src/lcd/e3v2/enhanced/rotary_encoder.cpp
+++ b/Marlin/src/lcd/e3v2/enhanced/rotary_encoder.cpp
@@ -145,7 +145,9 @@ ENCODER_DiffState Encoder_ReceiveAnalyze() {
const float encoderStepRate = encoderMovementSteps / float(ms - EncoderRate.lastEncoderTime) * 1000;
if (encoderStepRate >= ENCODER_100X_STEPS_PER_SEC) encoderMultiplier = 100;
else if (encoderStepRate >= ENCODER_10X_STEPS_PER_SEC) encoderMultiplier = 10;
- else if (encoderStepRate >= ENCODER_5X_STEPS_PER_SEC) encoderMultiplier = 5;
+ #if ENCODER_5X_STEPS_PER_SEC
+ else if (encoderStepRate >= ENCODER_5X_STEPS_PER_SEC) encoderMultiplier = 5;
+ #endif
}
EncoderRate.lastEncoderTime = ms;
}
diff --git a/Marlin/src/lcd/e3v2/jyersui/dwin.cpp b/Marlin/src/lcd/e3v2/jyersui/dwin.cpp
index e41e51bee4..c02aa48b1a 100644
--- a/Marlin/src/lcd/e3v2/jyersui/dwin.cpp
+++ b/Marlin/src/lcd/e3v2/jyersui/dwin.cpp
@@ -33,6 +33,7 @@
#include "../../marlinui.h"
#include "../../../MarlinCore.h"
+#include "../../../gcode/gcode.h"
#include "../../../module/temperature.h"
#include "../../../module/planner.h"
#include "../../../module/settings.h"
@@ -180,6 +181,7 @@ bool probe_deployed = false;
CrealityDWINClass CrealityDWIN;
#if HAS_MESH
+
struct Mesh_Settings {
bool viewer_asymmetric_range = false;
bool viewer_print_value = false;
@@ -305,16 +307,16 @@ CrealityDWINClass CrealityDWIN;
const uint16_t total_width_px = DWIN_WIDTH - padding_x - padding_x;
const uint16_t cell_width_px = total_width_px / GRID_MAX_POINTS_X;
const uint16_t cell_height_px = total_width_px / GRID_MAX_POINTS_Y;
- const float v_max = abs(get_max_value()), v_min = abs(get_min_value()), range = max(v_min, v_max);
+ const float v_max = abs(get_max_value()), v_min = abs(get_min_value()), range = _MAX(v_min, v_max);
// Clear background from previous selection and select new square
- DWIN_Draw_Rectangle(1, Color_Bg_Black, max(0, padding_x - gridline_width), max(0, padding_y_top - gridline_width), padding_x + total_width_px, padding_y_top + total_width_px);
+ DWIN_Draw_Rectangle(1, Color_Bg_Black, _MAX(0, padding_x - gridline_width), _MAX(0, padding_y_top - gridline_width), padding_x + total_width_px, padding_y_top + total_width_px);
if (selected >= 0) {
const auto selected_y = selected / GRID_MAX_POINTS_X;
const auto selected_x = selected - (GRID_MAX_POINTS_X * selected_y);
const auto start_y_px = padding_y_top + selected_y * cell_height_px;
const auto start_x_px = padding_x + selected_x * cell_width_px;
- DWIN_Draw_Rectangle(1, Color_White, max(0, start_x_px - gridline_width), max(0, start_y_px - gridline_width), start_x_px + cell_width_px, start_y_px + cell_height_px);
+ DWIN_Draw_Rectangle(1, Color_White, _MAX(0, start_x_px - gridline_width), _MAX(0, start_y_px - gridline_width), start_x_px + cell_width_px, start_y_px + cell_height_px);
}
// Draw value square grid
@@ -324,21 +326,20 @@ CrealityDWINClass CrealityDWIN;
const auto end_x_px = start_x_px + cell_width_px - 1 - gridline_width;
const auto start_y_px = padding_y_top + (GRID_MAX_POINTS_Y - y - 1) * cell_height_px;
const auto end_y_px = start_y_px + cell_height_px - 1 - gridline_width;
- DWIN_Draw_Rectangle(1, // RGB565 colors: http://www.barth-dev.de/online/rgb565-color-picker/
- isnan(mesh_z_values[x][y]) ? Color_Grey : ( // gray if undefined
+ DWIN_Draw_Rectangle(1, // RGB565 colors: http://www.barth-dev.de/online/rgb565-color-picker/
+ isnan(mesh_z_values[x][y]) ? Color_Grey : ( // gray if undefined
(mesh_z_values[x][y] < 0 ?
- (uint16_t)round(0b11111 * -mesh_z_values[x][y] / (!viewer_asymmetric_range ? range : v_min)) << 11 : // red if mesh point value is negative
- (uint16_t)round(0b111111 * mesh_z_values[x][y] / (!viewer_asymmetric_range ? range : v_max)) << 5) | // green if mesh point value is positive
- min(0b11111, (((uint8_t)abs(mesh_z_values[x][y]) / 10) * 4))), // + blue stepping for every mm
- start_x_px, start_y_px, end_x_px, end_y_px);
- while (LCD_SERIAL.availableForWrite() < 32) { // wait for serial to be available without blocking and resetting the MCU
- gcode.process_subcommands_now_P("G4 P10");
- planner.synchronize();
- }
+ (uint16_t)round(0x1F * -mesh_z_values[x][y] / (!viewer_asymmetric_range ? range : v_min)) << 11 : // red if mesh point value is negative
+ (uint16_t)round(0x3F * mesh_z_values[x][y] / (!viewer_asymmetric_range ? range : v_max)) << 5) | // green if mesh point value is positive
+ _MIN(0x1F, (((uint8_t)abs(mesh_z_values[x][y]) / 10) * 4))), // + blue stepping for every mm
+ start_x_px, start_y_px, end_x_px, end_y_px
+ );
+
+ safe_delay(10);
+ LCD_SERIAL.flushTX();
+
// Draw value text on
if (viewer_print_value) {
- gcode.process_subcommands_now_P("G4 P10"); // still fails without additional delay...
- planner.synchronize();
int8_t offset_x, offset_y = cell_height_px / 2 - 6;
if (isnan(mesh_z_values[x][y])) { // undefined
DWIN_Draw_String(false, false, font6x12, Color_White, Color_Bg_Blue, start_x_px + cell_width_px / 2 - 5, start_y_px + offset_y, F("X"));
@@ -353,16 +354,18 @@ CrealityDWINClass CrealityDWIN;
DWIN_Draw_String(false, false, font6x12, Color_White, Color_Bg_Blue, start_x_px - 2 + offset_x, start_y_px + offset_y /*+ square / 2 - 6*/, F("."));
DWIN_Draw_String(false, false, font6x12, Color_White, Color_Bg_Blue, start_x_px + 1 + offset_x, start_y_px + offset_y /*+ square / 2 - 6*/, buf);
}
+ safe_delay(10);
+ LCD_SERIAL.flushTX();
}
}
}
void Set_Mesh_Viewer_Status() { // TODO: draw gradient with values as a legend instead
- float v_max = abs(get_max_value()), v_min = abs(get_min_value()), range = max(v_min, v_max);
+ float v_max = abs(get_max_value()), v_min = abs(get_min_value()), range = _MAX(v_min, v_max);
if (v_min > 3e+10F) v_min = 0.0000001;
if (v_max > 3e+10F) v_max = 0.0000001;
if (range > 3e+10F) range = 0.0000001;
- char msg[32];
+ char msg[46];
if (viewer_asymmetric_range) {
dtostrf(-v_min, 1, 3, str_1);
dtostrf( v_max, 1, 3, str_2);
@@ -378,7 +381,8 @@ CrealityDWINClass CrealityDWIN;
};
Mesh_Settings mesh_conf;
-#endif
+
+#endif // HAS_MESH
/* General Display Functions */
@@ -467,8 +471,8 @@ void CrealityDWINClass::Draw_Title(const char * title) {
void CrealityDWINClass::Draw_Menu_Item(uint8_t row, uint8_t icon/*=0*/, const char * label1, const char * label2, bool more/*=false*/, bool centered/*=false*/) {
const uint8_t label_offset_y = !(label1 && label2) ? 0 : MENU_CHR_H * 3 / 5;
- const uint8_t label1_offset_x = !centered ? LBLX : LBLX * 4/5 + max(LBLX * 1U/5, (DWIN_WIDTH - LBLX - (label1 ? strlen(label1) : 0) * MENU_CHR_W) / 2);
- const uint8_t label2_offset_x = !centered ? LBLX : LBLX * 4/5 + max(LBLX * 1U/5, (DWIN_WIDTH - LBLX - (label2 ? strlen(label2) : 0) * MENU_CHR_W) / 2);
+ const uint8_t label1_offset_x = !centered ? LBLX : LBLX * 4/5 + _MAX(LBLX * 1U/5, (DWIN_WIDTH - LBLX - (label1 ? strlen(label1) : 0) * MENU_CHR_W) / 2);
+ const uint8_t label2_offset_x = !centered ? LBLX : LBLX * 4/5 + _MAX(LBLX * 1U/5, (DWIN_WIDTH - LBLX - (label2 ? strlen(label2) : 0) * MENU_CHR_W) / 2);
if (label1) DWIN_Draw_String(false, false, DWIN_FONT_MENU, Color_White, Color_Bg_Black, label1_offset_x, MBASE(row) - 1 - label_offset_y, label1); // Draw Label
if (label2) DWIN_Draw_String(false, false, DWIN_FONT_MENU, Color_White, Color_Bg_Black, label2_offset_x, MBASE(row) - 1 + label_offset_y, label2); // Draw Label
if (icon) DWIN_ICON_Show(ICON, icon, 26, MBASE(row) - 3); //Draw Menu Icon
@@ -498,7 +502,7 @@ void CrealityDWINClass::Draw_Menu(uint8_t menu, uint8_t select/*=0*/, uint8_t sc
last_menu = active_menu;
if (process == Menu) last_selection = selection;
}
- selection = min(select, Get_Menu_Size(menu));
+ selection = _MIN(select, Get_Menu_Size(menu));
scrollpos = scroll;
if (selection - scrollpos > MROWS)
scrollpos = selection - MROWS;
@@ -4754,11 +4758,13 @@ void CrealityDWINClass::Start_Print(bool sd) {
printing = true;
statusmsg[0] = '\0';
if (sd) {
- if (recovery.valid()) {
- SdFile *diveDir = nullptr;
- const char * const fname = card.diveToFile(true, diveDir, recovery.info.sd_filename);
- card.selectFileByName(fname);
- }
+ #if ENABLED(POWER_LOSS_RECOVERY)
+ if (recovery.valid()) {
+ SdFile *diveDir = nullptr;
+ const char * const fname = card.diveToFile(true, diveDir, recovery.info.sd_filename);
+ card.selectFileByName(fname);
+ }
+ #endif
strcpy_P(filename, card.longest_filename());
}
else
@@ -4798,7 +4804,7 @@ void MarlinUI::update() { CrealityDWIN.Update(); }
void CrealityDWINClass::State_Update() {
if ((print_job_timer.isRunning() || print_job_timer.isPaused()) != printing) {
- if (!printing) Start_Print((card.isFileOpen() || recovery.valid()));
+ if (!printing) Start_Print(card.isFileOpen() || TERN0(POWER_LOSS_RECOVERY, recovery.valid()));
else Stop_Print();
}
if (print_job_timer.isPaused() != paused) {
@@ -4970,11 +4976,11 @@ void CrealityDWINClass::AudioFeedback(const bool success/*=true*/) {
void CrealityDWINClass::Save_Settings(char *buff) {
TERN_(AUTO_BED_LEVELING_UBL, eeprom_settings.tilt_grid_size = mesh_conf.tilt_grid - 1);
eeprom_settings.corner_pos = corner_pos * 10;
- memcpy(buff, &eeprom_settings, min(sizeof(eeprom_settings), eeprom_data_size));
+ memcpy(buff, &eeprom_settings, _MIN(sizeof(eeprom_settings), eeprom_data_size));
}
void CrealityDWINClass::Load_Settings(const char *buff) {
- memcpy(&eeprom_settings, buff, min(sizeof(eeprom_settings), eeprom_data_size));
+ memcpy(&eeprom_settings, buff, _MIN(sizeof(eeprom_settings), eeprom_data_size));
TERN_(AUTO_BED_LEVELING_UBL, mesh_conf.tilt_grid = eeprom_settings.tilt_grid_size + 1);
if (eeprom_settings.corner_pos == 0) eeprom_settings.corner_pos = 325;
corner_pos = eeprom_settings.corner_pos / 10.0f;
diff --git a/Marlin/src/lcd/e3v2/jyersui/dwin_lcd.cpp b/Marlin/src/lcd/e3v2/jyersui/dwin_lcd.cpp
index 5380d1b93e..92f4be4548 100644
--- a/Marlin/src/lcd/e3v2/jyersui/dwin_lcd.cpp
+++ b/Marlin/src/lcd/e3v2/jyersui/dwin_lcd.cpp
@@ -92,7 +92,7 @@ bool DWIN_Handshake(void) {
#endif
LCD_SERIAL.begin(LCD_BAUDRATE);
const millis_t serial_connect_timeout = millis() + 1000UL;
- while (!LCD_SERIAL && PENDING(millis(), serial_connect_timeout)) { /*nada*/ }
+ while (!LCD_SERIAL.connected() && PENDING(millis(), serial_connect_timeout)) { /*nada*/ }
size_t i = 0;
DWIN_Byte(i, 0x00);
diff --git a/Marlin/src/lcd/e3v2/jyersui/rotary_encoder.cpp b/Marlin/src/lcd/e3v2/jyersui/rotary_encoder.cpp
index 47ddc90184..23494aa693 100644
--- a/Marlin/src/lcd/e3v2/jyersui/rotary_encoder.cpp
+++ b/Marlin/src/lcd/e3v2/jyersui/rotary_encoder.cpp
@@ -145,7 +145,9 @@ ENCODER_DiffState Encoder_ReceiveAnalyze() {
const float encoderStepRate = encoderMovementSteps / float(ms - EncoderRate.lastEncoderTime) * 1000;
if (encoderStepRate >= ENCODER_100X_STEPS_PER_SEC) encoderMultiplier = 100;
else if (encoderStepRate >= ENCODER_10X_STEPS_PER_SEC) encoderMultiplier = 10;
- else if (encoderStepRate >= ENCODER_5X_STEPS_PER_SEC) encoderMultiplier = 5;
+ #if ENCODER_5X_STEPS_PER_SEC
+ else if (encoderStepRate >= ENCODER_5X_STEPS_PER_SEC) encoderMultiplier = 5;
+ #endif
}
EncoderRate.lastEncoderTime = ms;
}
diff --git a/Marlin/src/lcd/extui/dgus_reloaded/DGUSRxHandler.cpp b/Marlin/src/lcd/extui/dgus_reloaded/DGUSRxHandler.cpp
index 5f36dac7f6..20a4bee234 100644
--- a/Marlin/src/lcd/extui/dgus_reloaded/DGUSRxHandler.cpp
+++ b/Marlin/src/lcd/extui/dgus_reloaded/DGUSRxHandler.cpp
@@ -63,13 +63,13 @@ void DGUSRxHandler::ScreenChange(DGUS_VP &vp, void *data_ptr) {
}
if (vp.addr == DGUS_Addr::SCREENCHANGE_Idle
- && (printingIsActive() || printingIsPaused())) {
+ && (ExtUI::isPrinting() || ExtUI::isPrintingPaused())) {
dgus_screen_handler.SetStatusMessagePGM(PSTR("Impossible while printing"));
return;
}
if (vp.addr == DGUS_Addr::SCREENCHANGE_Printing
- && (!printingIsActive() && !printingIsPaused())) {
+ && (!ExtUI::isPrinting() && !ExtUI::isPrintingPaused())) {
dgus_screen_handler.SetStatusMessagePGM(PSTR("Impossible while idle"));
return;
}
@@ -166,7 +166,7 @@ void DGUSRxHandler::PrintAbort(DGUS_VP &vp, void *data_ptr) {
return;
}
- if (!printingIsActive() && !printingIsPaused()) {
+ if (!ExtUI::isPrinting() && !ExtUI::isPrintingPaused()) {
dgus_screen_handler.TriggerFullUpdate();
return;
}
@@ -183,7 +183,7 @@ void DGUSRxHandler::PrintPause(DGUS_VP &vp, void *data_ptr) {
return;
}
- if (!printingIsActive()) {
+ if (!ExtUI::isPrinting()) {
dgus_screen_handler.TriggerFullUpdate();
return;
}
@@ -200,7 +200,7 @@ void DGUSRxHandler::PrintResume(DGUS_VP &vp, void *data_ptr) {
return;
}
- if (!printingIsPaused()) {
+ if (!ExtUI::isPrintingPaused()) {
dgus_screen_handler.TriggerFullUpdate();
return;
}
@@ -984,20 +984,11 @@ void DGUSRxHandler::WaitAbort(DGUS_VP &vp, void *data_ptr) {
return;
}
- if (!printingIsPaused()
- #if ENABLED(ADVANCED_PAUSE_FEATURE)
- || !did_pause_print
- #endif
- ) {
+ if (!ExtUI::isPrintingPaused()) {
dgus_screen_handler.TriggerFullUpdate();
return;
}
- #if ENABLED(ADVANCED_PAUSE_FEATURE)
- did_pause_print = 0;
- #endif
-
- ExtUI::setUserConfirmed();
ExtUI::stopPrint();
dgus_screen_handler.TriggerFullUpdate();
diff --git a/Marlin/src/lcd/extui/dgus_reloaded/DGUSSetupHandler.cpp b/Marlin/src/lcd/extui/dgus_reloaded/DGUSSetupHandler.cpp
index c12282c4ef..0d94751fc2 100644
--- a/Marlin/src/lcd/extui/dgus_reloaded/DGUSSetupHandler.cpp
+++ b/Marlin/src/lcd/extui/dgus_reloaded/DGUSSetupHandler.cpp
@@ -47,7 +47,7 @@
#endif
bool DGUSSetupHandler::PrintStatus() {
- if (printingIsActive() || printingIsPaused()) {
+ if (ExtUI::isPrinting() || ExtUI::isPrintingPaused()) {
return true;
}
@@ -56,7 +56,7 @@ bool DGUSSetupHandler::PrintStatus() {
}
bool DGUSSetupHandler::PrintAdjust() {
- if (printingIsActive() || printingIsPaused()) {
+ if (ExtUI::isPrinting() || ExtUI::isPrintingPaused()) {
return true;
}
diff --git a/Marlin/src/lcd/extui/dgus_reloaded/DGUSTxHandler.cpp b/Marlin/src/lcd/extui/dgus_reloaded/DGUSTxHandler.cpp
index 04362b07e8..b2fa8c18b3 100644
--- a/Marlin/src/lcd/extui/dgus_reloaded/DGUSTxHandler.cpp
+++ b/Marlin/src/lcd/extui/dgus_reloaded/DGUSTxHandler.cpp
@@ -214,7 +214,7 @@ void DGUSTxHandler::Percent(DGUS_VP &vp) {
void DGUSTxHandler::StatusIcons(DGUS_VP &vp) {
uint16_t icons = 0;
- if (printingIsActive()) {
+ if (ExtUI::isPrinting()) {
icons |= (uint16_t)DGUS_Data::StatusIcon::PAUSE;
dgus_display.EnableControl(DGUS_Screen::PRINT_STATUS,
@@ -227,7 +227,7 @@ void DGUSTxHandler::StatusIcons(DGUS_VP &vp) {
DGUS_Control::PAUSE);
}
- if (printingIsPaused()) {
+ if (ExtUI::isPrintingPaused()) {
icons |= (uint16_t)DGUS_Data::StatusIcon::RESUME;
dgus_display.EnableControl(DGUS_Screen::PRINT_STATUS,
@@ -561,11 +561,7 @@ void DGUSTxHandler::FilamentUsed(DGUS_VP &vp) {
void DGUSTxHandler::WaitIcons(DGUS_VP &vp) {
uint16_t icons = 0;
- if (printingIsPaused()
- #if ENABLED(ADVANCED_PAUSE_FEATURE)
- && did_pause_print
- #endif
- ) {
+ if (ExtUI::isPrintingPaused()) {
icons |= (uint16_t)DGUS_Data::WaitIcon::ABORT;
dgus_display.EnableControl(DGUS_Screen::WAIT,
diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/compat.h b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/compat.h
index 2b7eca0cce..4e11c73226 100644
--- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/compat.h
+++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/compat.h
@@ -296,3 +296,7 @@
#endif
#endif // !__MARLIN_FIRMWARE__
+
+#ifndef SD_SPI_SPEED
+ #define SD_SPI_SPEED SPI_FULL_SPEED
+#endif
diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_ellipsis.cpp b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_ellipsis.cpp
index 4262dd1155..463d5ad316 100644
--- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_ellipsis.cpp
+++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_ellipsis.cpp
@@ -34,7 +34,6 @@ namespace FTDI {
#define CHAR_WIDTH(c) use_utf8 ? utf8_fm.get_char_width(c) : clcd_fm.char_widths[(uint8_t)c]
#else
#define CHAR_WIDTH(c) utf8_fm.get_char_width(c)
- constexpr bool use_utf8 = false;
#endif
FontMetrics utf8_fm(font);
CLCD::FontMetrics clcd_fm;
@@ -46,12 +45,12 @@ namespace FTDI {
// split and still allow the ellipsis to fit.
int16_t lineWidth = 0;
char *breakPoint = str;
- char *next = str;
+ const char *next = str;
while (*next) {
const utf8_char_t c = get_utf8_char_and_inc(next);
lineWidth += CHAR_WIDTH(c);
if (lineWidth + ellipsisWidth < w)
- breakPoint = next;
+ breakPoint = (char*)next;
}
if (lineWidth > w) {
diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/unicode.cpp b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/unicode.cpp
index 2da5d55ff0..15e613cf69 100644
--- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/unicode.cpp
+++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/unicode.cpp
@@ -66,7 +66,7 @@
* character (this is not the unicode codepoint)
*/
- utf8_char_t FTDI::get_utf8_char_and_inc(const char *&c) {
+ utf8_char_t FTDI::get_utf8_char_and_inc(char *&c) {
utf8_char_t val = *(uint8_t*)c++;
if ((val & 0xC0) == 0xC0)
while ((*c & 0xC0) == 0x80)
diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/unicode.h b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/unicode.h
index 3ca6dfd563..391c8bf6cf 100644
--- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/unicode.h
+++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/ftdi_eve_lib/extended/unicode/unicode.h
@@ -51,14 +51,14 @@ namespace FTDI {
/* Returns the next character in a UTF8 string, without incrementing */
- inline utf8_char_t get_utf8_char(const char *c) {return get_utf8_char_and_inc(c);}
+ inline utf8_char_t get_utf8_char(const char *c) { return get_utf8_char_and_inc(c); }
void load_utf8_data(uint32_t addr);
#else
typedef char utf8_char_t;
- inline utf8_char_t get_utf8_char_and_inc(const char *&c) {return *c++;}
- inline utf8_char_t get_utf8_char(const char *c) {return *c;}
+ inline utf8_char_t get_utf8_char_and_inc(const char *&c) { return *c++; }
+ inline utf8_char_t get_utf8_char(const char *c) { return *c; }
inline void load_utf8_data(uint32_t) {}
#endif
diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/confirm_start_print_dialog_box.cpp b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/confirm_start_print_dialog_box.cpp
index 47aac62860..7f566539a1 100644
--- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/confirm_start_print_dialog_box.cpp
+++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/confirm_start_print_dialog_box.cpp
@@ -33,7 +33,7 @@ using namespace ExtUI;
constexpr static ConfirmStartPrintDialogBoxData &mydata = screen_data.ConfirmStartPrintDialogBox;
void ConfirmStartPrintDialogBox::onRedraw(draw_mode_t) {
- const char *filename = getLongFilename();
+ const char *filename = getFilename();
char buffer[strlen_P(GET_TEXT(MSG_START_PRINT_CONFIRMATION)) + strlen(filename) + 1];
sprintf_P(buffer, GET_TEXT(MSG_START_PRINT_CONFIRMATION), filename);
drawMessage((const char *)buffer);
@@ -52,10 +52,10 @@ bool ConfirmStartPrintDialogBox::onTouchEnd(uint8_t tag) {
}
}
-const char *ConfirmStartPrintDialogBox::getFilename(bool longName) {
+const char *ConfirmStartPrintDialogBox::getFilename(bool shortName) {
FileList files;
files.seek(mydata.file_index, true);
- return longName ? files.longFilename() : files.shortFilename();
+ return shortName ? files.shortFilename() : files.filename();
}
void ConfirmStartPrintDialogBox::show(uint8_t file_index) {
diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/confirm_start_print_dialog_box.h b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/confirm_start_print_dialog_box.h
index e073ed55fa..1f74fde94b 100644
--- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/confirm_start_print_dialog_box.h
+++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/confirm_start_print_dialog_box.h
@@ -31,10 +31,9 @@ struct ConfirmStartPrintDialogBoxData {
class ConfirmStartPrintDialogBox : public DialogBoxBaseClass, public UncachedScreen {
private:
- inline static const char *getShortFilename() {return getFilename(false);}
- inline static const char *getLongFilename() {return getFilename(true);}
+ inline static const char *getShortFilename() {return getFilename(true);}
- static const char *getFilename(bool longName);
+ static const char *getFilename(bool shortName = false);
public:
static void onRedraw(draw_mode_t);
static bool onTouchEnd(uint8_t);
diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/files_screen.cpp b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/files_screen.cpp
index 8b9c877fc5..5076e58adf 100644
--- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/files_screen.cpp
+++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/files_screen.cpp
@@ -70,10 +70,10 @@ void FilesScreen::onEntry() {
BaseScreen::onEntry();
}
-const char *FilesScreen::getSelectedFilename(bool longName) {
+const char *FilesScreen::getSelectedFilename(bool shortName) {
FileList files;
files.seek(getSelectedFileIndex(), true);
- return longName ? files.longFilename() : files.shortFilename();
+ return shortName ? files.shortFilename() : files.filename();
}
void FilesScreen::drawSelectedFile() {
@@ -132,13 +132,13 @@ void FilesScreen::drawFileList() {
mydata.num_page = max(1,ceil(float(files.count()) / FILES_PER_PAGE));
mydata.cur_page = min(mydata.cur_page, mydata.num_page-1);
mydata.flags.is_root = files.isAtRootDir();
+ mydata.flags.is_empty = true;
uint16_t fileIndex = mydata.cur_page * FILES_PER_PAGE;
for (uint8_t i = 0; i < FILES_PER_PAGE; i++, fileIndex++) {
- if (files.seek(fileIndex))
- drawFileButton(files.filename(), getTagForLine(i), files.isDir(), false);
- else
- break;
+ if (!files.seek(fileIndex)) break;
+ drawFileButton(files.filename(), getTagForLine(i), files.isDir(), false);
+ mydata.flags.is_empty = false;
}
}
@@ -252,11 +252,11 @@ bool FilesScreen::onTouchEnd(uint8_t tag) {
mydata.scroll_pos = 0;
mydata.scroll_max = 0;
if (FTDI::ftdi_chip >= 810) {
- const char *longFilename = getSelectedLongFilename();
- if (longFilename[0]) {
+ const char *filename = getSelectedFilename();
+ if (filename[0]) {
CommandProcessor cmd;
constexpr int dim[4] = {LIST_POS};
- const uint16_t text_width = cmd.font(font_medium).text_width(longFilename);
+ const uint16_t text_width = cmd.font(font_medium).text_width(filename);
if (text_width > dim[2])
mydata.scroll_max = text_width - dim[2] + MARGIN_L + MARGIN_R + 10;
}
diff --git a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/files_screen.h b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/files_screen.h
index bf2b415364..cb950d4cac 100644
--- a/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/files_screen.h
+++ b/Marlin/src/lcd/extui/ftdi_eve_touch_ui/generic/files_screen.h
@@ -27,8 +27,9 @@
struct FilesScreenData {
struct {
- uint8_t is_dir : 1;
- uint8_t is_root : 1;
+ uint8_t is_dir : 1;
+ uint8_t is_root : 1;
+ uint8_t is_empty : 1;
} flags;
uint8_t selected_tag;
uint8_t num_page;
@@ -46,9 +47,8 @@ class FilesScreen : public BaseScreen, public CachedScreen 0);
add_control(796, TFT_HEIGHT - 50, PAGE_DOWN, imgPageDown, encoderTopLine + LCD_HEIGHT < screen_items);
diff --git a/Marlin/src/lcd/tft/ui_320x240.cpp b/Marlin/src/lcd/tft/ui_320x240.cpp
index 786dc61f60..deffbae94c 100644
--- a/Marlin/src/lcd/tft/ui_320x240.cpp
+++ b/Marlin/src/lcd/tft/ui_320x240.cpp
@@ -47,6 +47,7 @@
void MarlinUI::tft_idle() {
#if ENABLED(TOUCH_SCREEN)
+ if (TERN0(HAS_TOUCH_SLEEP, lcd_sleep_task())) return;
if (draw_menu_navigation) {
add_control(48, 206, PAGE_UP, imgPageUp, encoderTopLine > 0);
add_control(240, 206, PAGE_DOWN, imgPageDown, encoderTopLine + LCD_HEIGHT < screen_items);
diff --git a/Marlin/src/lcd/tft/ui_480x320.cpp b/Marlin/src/lcd/tft/ui_480x320.cpp
index 02e3354d93..c8333f7e4b 100644
--- a/Marlin/src/lcd/tft/ui_480x320.cpp
+++ b/Marlin/src/lcd/tft/ui_480x320.cpp
@@ -47,6 +47,7 @@
void MarlinUI::tft_idle() {
#if ENABLED(TOUCH_SCREEN)
+ if (TERN0(HAS_TOUCH_SLEEP, lcd_sleep_task())) return;
if (draw_menu_navigation) {
add_control(104, TFT_HEIGHT - 34, PAGE_UP, imgPageUp, encoderTopLine > 0);
add_control(344, TFT_HEIGHT - 34, PAGE_DOWN, imgPageDown, encoderTopLine + LCD_HEIGHT < screen_items);
diff --git a/Marlin/src/lcd/tft/ui_common.cpp b/Marlin/src/lcd/tft/ui_common.cpp
index 7c053e7be7..a5f41874b0 100644
--- a/Marlin/src/lcd/tft/ui_common.cpp
+++ b/Marlin/src/lcd/tft/ui_common.cpp
@@ -37,6 +37,27 @@ static xy_uint_t cursor;
bool draw_menu_navigation = false;
#endif
+#if HAS_TOUCH_SLEEP
+
+ bool lcd_sleep_task() {
+ static bool sleepCleared;
+ if (touch.isSleeping()) {
+ tft.queue.reset();
+ if (!sleepCleared) {
+ sleepCleared = true;
+ ui.clear_lcd();
+ tft.queue.async();
+ }
+ touch.idle();
+ return true;
+ }
+ else
+ sleepCleared = false;
+ return false;
+ }
+
+#endif
+
void menu_line(const uint8_t row, uint16_t color) {
cursor.set(0, row);
tft.canvas(0, TFT_TOP_LINE_Y + cursor.y * MENU_LINE_HEIGHT, TFT_WIDTH, MENU_ITEM_HEIGHT);
diff --git a/Marlin/src/lcd/tft/ui_common.h b/Marlin/src/lcd/tft/ui_common.h
index 759712b64c..d3ffd4bc31 100644
--- a/Marlin/src/lcd/tft/ui_common.h
+++ b/Marlin/src/lcd/tft/ui_common.h
@@ -51,6 +51,10 @@ void draw_fan_status(uint16_t x, uint16_t y, const bool blink);
void menu_line(const uint8_t row, uint16_t color=COLOR_BACKGROUND);
void menu_item(const uint8_t row, bool sel = false);
+#if HAS_TOUCH_SLEEP
+ bool lcd_sleep_task();
+#endif
+
#define ABSOLUTE_ZERO -273.15
#if HAS_TEMP_CHAMBER && HOTENDS > 1
diff --git a/Marlin/src/lcd/tft_io/tft_io.h b/Marlin/src/lcd/tft_io/tft_io.h
index 0e4322f0d7..65602240d6 100644
--- a/Marlin/src/lcd/tft_io/tft_io.h
+++ b/Marlin/src/lcd/tft_io/tft_io.h
@@ -59,7 +59,6 @@
#define TFT_ROTATION TFT_NO_ROTATION
#endif
-
// TFT_ORIENTATION is the "sum" of TFT_DEFAULT_ORIENTATION plus user TFT_ROTATION
#define TFT_ORIENTATION ((TFT_DEFAULT_ORIENTATION) ^ (TFT_ROTATION))
diff --git a/Marlin/src/lcd/touch/touch_buttons.cpp b/Marlin/src/lcd/touch/touch_buttons.cpp
index c9476bd2bb..2d6158961e 100644
--- a/Marlin/src/lcd/touch/touch_buttons.cpp
+++ b/Marlin/src/lcd/touch/touch_buttons.cpp
@@ -38,6 +38,10 @@
#include "../tft_io/touch_calibration.h"
#endif
+#if HAS_TOUCH_SLEEP
+ millis_t TouchButtons::next_sleep_ms;
+#endif
+
#include "../buttons.h" // For EN_C bit mask
#include "../marlinui.h" // For ui.refresh
#include "../tft_io/tft_io.h"
@@ -50,15 +54,24 @@
#define BUTTON_AREA_TOP BUTTON_Y_LO
#define BUTTON_AREA_BOT BUTTON_Y_HI
-TouchButtons touch;
+TouchButtons touchBt;
-void TouchButtons::init() { touchIO.Init(); }
+void TouchButtons::init() {
+ touchIO.Init();
+ TERN_(HAS_TOUCH_SLEEP, next_sleep_ms = millis() + SEC_TO_MS(TOUCH_IDLE_SLEEP));
+}
uint8_t TouchButtons::read_buttons() {
#ifdef HAS_WIRED_LCD
int16_t x, y;
const bool is_touched = (TERN(TOUCH_SCREEN_CALIBRATION, touch_calibration.calibration.orientation, TOUCH_ORIENTATION) == TOUCH_PORTRAIT ? touchIO.getRawPoint(&y, &x) : touchIO.getRawPoint(&x, &y));
+ #if HAS_TOUCH_SLEEP
+ if (is_touched)
+ wakeUp();
+ else if (!isSleeping() && ELAPSED(millis(), next_sleep_ms) && ui.on_status_screen())
+ sleepTimeout();
+ #endif
if (!is_touched) return 0;
#if ENABLED(TOUCH_SCREEN_CALIBRATION)
@@ -96,4 +109,23 @@ uint8_t TouchButtons::read_buttons() {
return 0;
}
+#if HAS_TOUCH_SLEEP
+
+ void TouchButtons::sleepTimeout() {
+ #if PIN_EXISTS(TFT_BACKLIGHT)
+ OUT_WRITE(TFT_BACKLIGHT_PIN, LOW);
+ #endif
+ next_sleep_ms = TSLP_SLEEPING;
+ }
+ void TouchButtons::wakeUp() {
+ if (isSleeping()) {
+ #if PIN_EXISTS(TFT_BACKLIGHT)
+ WRITE(TFT_BACKLIGHT_PIN, HIGH);
+ #endif
+ }
+ next_sleep_ms = millis() + SEC_TO_MS(TOUCH_IDLE_SLEEP);
+ }
+
+#endif // HAS_TOUCH_SLEEP
+
#endif // HAS_TOUCH_BUTTONS
diff --git a/Marlin/src/lcd/touch/touch_buttons.h b/Marlin/src/lcd/touch/touch_buttons.h
index a79bb15be4..36be0ee134 100644
--- a/Marlin/src/lcd/touch/touch_buttons.h
+++ b/Marlin/src/lcd/touch/touch_buttons.h
@@ -50,10 +50,19 @@
#define BUTTON_Y_HI (TFT_HEIGHT) - BUTTON_SPACING
#define BUTTON_Y_LO BUTTON_Y_HI - BUTTON_HEIGHT
+#define TSLP_PREINIT 0
+#define TSLP_SLEEPING 1
+
class TouchButtons {
public:
static void init();
static uint8_t read_buttons();
+ #if HAS_TOUCH_SLEEP
+ static millis_t next_sleep_ms;
+ static bool isSleeping() { return next_sleep_ms == TSLP_SLEEPING; }
+ static void sleepTimeout();
+ static void wakeUp();
+ #endif
};
-extern TouchButtons touch;
+extern TouchButtons touchBt;
diff --git a/Marlin/src/module/delta.cpp b/Marlin/src/module/delta.cpp
index 899848d7f2..2a4efb47da 100644
--- a/Marlin/src/module/delta.cpp
+++ b/Marlin/src/module/delta.cpp
@@ -82,28 +82,6 @@ void recalc_delta_settings() {
set_all_unhomed();
}
-/**
- * Get a safe radius for calibration
- */
-
-#if EITHER(DELTA_AUTO_CALIBRATION, DELTA_CALIBRATION_MENU)
-
- #if ENABLED(DELTA_AUTO_CALIBRATION)
- float calibration_radius_factor = 1;
- #endif
-
- float delta_calibration_radius() {
- return calibration_radius_factor * (
- #if HAS_BED_PROBE
- FLOOR((DELTA_PRINTABLE_RADIUS) - _MAX(HYPOT(probe.offset_xy.x, probe.offset_xy.y), PROBING_MARGIN))
- #else
- DELTA_PRINTABLE_RADIUS
- #endif
- );
- }
-
-#endif
-
/**
* Delta Inverse Kinematics
*
@@ -254,7 +232,7 @@ void home_delta() {
current_position.z = DIFF_TERN(HAS_BED_PROBE, delta_height + 10, probe.offset.z);
line_to_current_position(homing_feedrate(Z_AXIS));
planner.synchronize();
- TERN_(SENSORLESS_PROBING,endstops.report_states());
+ TERN_(HAS_DELTA_SENSORLESS_PROBING, endstops.report_states());
// Re-enable stealthChop if used. Disable diag1 pin on driver.
#if ENABLED(SENSORLESS_HOMING) && DISABLED(ENDSTOPS_ALWAYS_ON_DEFAULT)
diff --git a/Marlin/src/module/delta.h b/Marlin/src/module/delta.h
index 308e206700..f1e43c7e4c 100644
--- a/Marlin/src/module/delta.h
+++ b/Marlin/src/module/delta.h
@@ -45,19 +45,6 @@ extern abc_float_t delta_diagonal_rod_trim;
*/
void recalc_delta_settings();
-/**
- * Get a safe radius for calibration
- */
-#if ENABLED(DELTA_AUTO_CALIBRATION)
- extern float calibration_radius_factor;
-#else
- constexpr float calibration_radius_factor = 1;
-#endif
-
-#if EITHER(DELTA_AUTO_CALIBRATION, DELTA_CALIBRATION_MENU)
- float delta_calibration_radius();
-#endif
-
/**
* Delta Inverse Kinematics
*
diff --git a/Marlin/src/module/endstops.cpp b/Marlin/src/module/endstops.cpp
index b5315f2f01..d29fd3ecb3 100644
--- a/Marlin/src/module/endstops.cpp
+++ b/Marlin/src/module/endstops.cpp
@@ -595,7 +595,7 @@ void _O2 Endstops::report_states() {
// The following routines are called from an ISR context. It could be the temperature ISR, the
// endstop ISR or the Stepper ISR.
-#if BOTH(DELTA, SENSORLESS_PROBING)
+#if HAS_DELTA_SENSORLESS_PROBING
#define __ENDSTOP(AXIS, ...) AXIS ##_MAX
#define _ENDSTOP_PIN(AXIS, ...) AXIS ##_MAX_PIN
#define _ENDSTOP_INVERTING(AXIS, ...) AXIS ##_MAX_ENDSTOP_INVERTING
diff --git a/Marlin/src/module/endstops.h b/Marlin/src/module/endstops.h
index e688d3a788..a35966a98c 100644
--- a/Marlin/src/module/endstops.h
+++ b/Marlin/src/module/endstops.h
@@ -59,7 +59,9 @@ enum EndstopEnum : char {
_ES_ITEM(HAS_Z4_MAX, Z4_MAX)
// Bed Probe state is distinct or shared with Z_MIN (i.e., when the probe is the only Z endstop)
- _ES_ITEM(HAS_BED_PROBE, Z_MIN_PROBE IF_DISABLED(USES_Z_MIN_PROBE_PIN, = Z_MIN))
+ #if !HAS_DELTA_SENSORLESS_PROBING
+ _ES_ITEM(HAS_BED_PROBE, Z_MIN_PROBE IF_DISABLED(USES_Z_MIN_PROBE_PIN, = Z_MIN))
+ #endif
// The total number of states
NUM_ENDSTOP_STATES
diff --git a/Marlin/src/module/probe.cpp b/Marlin/src/module/probe.cpp
index 16ff166493..071ff25c20 100644
--- a/Marlin/src/module/probe.cpp
+++ b/Marlin/src/module/probe.cpp
@@ -141,7 +141,7 @@ xyz_pos_t Probe::offset; // Initialized by settings.load()
ui.return_to_status();
TERN_(HOST_PROMPT_SUPPORT, host_prompt_do(PROMPT_USER_CONTINUE, PSTR("Deploy TouchMI"), CONTINUE_STR));
- wait_for_user_response();
+ TERN_(HAS_RESUME_CONTINUE, wait_for_user_response());
ui.reset_status();
ui.goto_screen(prev_screen);
@@ -298,7 +298,7 @@ FORCE_INLINE void probe_specific_action(const bool deploy) {
TERN_(HOST_PROMPT_SUPPORT, host_prompt_do(PROMPT_USER_CONTINUE, PSTR("Stow Probe"), CONTINUE_STR));
TERN_(EXTENSIBLE_UI, ExtUI::onUserConfirmRequired_P(PSTR("Stow Probe")));
TERN_(DWIN_CREALITY_LCD_ENHANCED, DWIN_Popup_Confirm(ICON_BLTouch, PSTR("Stow Probe"), CONTINUE_STR));
- wait_for_user_response();
+ TERN_(HAS_RESUME_CONTINUE, wait_for_user_response());
ui.reset_status();
} while (ENABLED(PAUSE_PROBE_DEPLOY_WHEN_TRIGGERED));
@@ -493,7 +493,7 @@ bool Probe::probe_down_to_z(const_float_t z, const_feedRate_t fr_mm_s) {
// Disable stealthChop if used. Enable diag1 pin on driver.
#if ENABLED(SENSORLESS_PROBING)
sensorless_t stealth_states { false };
- #if ENABLED(DELTA)
+ #if HAS_DELTA_SENSORLESS_PROBING
if (probe.test_sensitivity.x) stealth_states.x = tmc_enable_stallguard(stepperX); // Delta watches all DIAG pins for a stall
if (probe.test_sensitivity.y) stealth_states.y = tmc_enable_stallguard(stepperY);
#endif
@@ -509,7 +509,7 @@ bool Probe::probe_down_to_z(const_float_t z, const_feedRate_t fr_mm_s) {
// Check to see if the probe was triggered
const bool probe_triggered =
- #if BOTH(DELTA, SENSORLESS_PROBING)
+ #if HAS_DELTA_SENSORLESS_PROBING
endstops.trigger_state() & (_BV(X_MAX) | _BV(Y_MAX) | _BV(Z_MAX))
#else
TEST(endstops.trigger_state(), Z_MIN_PROBE)
@@ -521,7 +521,7 @@ bool Probe::probe_down_to_z(const_float_t z, const_feedRate_t fr_mm_s) {
// Re-enable stealthChop if used. Disable diag1 pin on driver.
#if ENABLED(SENSORLESS_PROBING)
endstops.not_homing();
- #if ENABLED(DELTA)
+ #if HAS_DELTA_SENSORLESS_PROBING
if (probe.test_sensitivity.x) tmc_disable_stallguard(stepperX, stealth_states.x);
if (probe.test_sensitivity.y) tmc_disable_stallguard(stepperY, stealth_states.y);
#endif
@@ -765,7 +765,7 @@ float Probe::probe_at_point(const_float_t rx, const_float_t ry, const ProbePtRai
#endif
// On delta keep Z below clip height or do_blocking_move_to will abort
- xyz_pos_t npos = { rx, ry, _MIN(TERN(DELTA, delta_clip_start_height, current_position.z), current_position.z) };
+ xyz_pos_t npos = { rx, ry, TERN(DELTA, _MIN(delta_clip_start_height, current_position.z), current_position.z) };
if (probe_relative) { // The given position is in terms of the probe
if (!can_reach(npos)) {
if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Position Not Reachable");
@@ -827,7 +827,7 @@ float Probe::probe_at_point(const_float_t rx, const_float_t ry, const ProbePtRai
*/
void Probe::enable_stallguard_diag1() {
#if ENABLED(SENSORLESS_PROBING)
- #if ENABLED(DELTA)
+ #if HAS_DELTA_SENSORLESS_PROBING
stealth_states.x = tmc_enable_stallguard(stepperX);
stealth_states.y = tmc_enable_stallguard(stepperY);
#endif
@@ -842,7 +842,7 @@ float Probe::probe_at_point(const_float_t rx, const_float_t ry, const ProbePtRai
void Probe::disable_stallguard_diag1() {
#if ENABLED(SENSORLESS_PROBING)
endstops.not_homing();
- #if ENABLED(DELTA)
+ #if HAS_DELTA_SENSORLESS_PROBING
tmc_disable_stallguard(stepperX, stealth_states.x);
tmc_disable_stallguard(stepperY, stealth_states.y);
#endif
@@ -907,6 +907,6 @@ float Probe::probe_at_point(const_float_t rx, const_float_t ry, const ProbePtRai
#endif
}
-#endif // SENSORLESS_PROBING
+#endif // SENSORLESS_PROBING || SENSORLESS_HOMING
#endif // HAS_BED_PROBE
diff --git a/Marlin/src/module/stepper.cpp b/Marlin/src/module/stepper.cpp
index aea5f88c06..83aa15063b 100644
--- a/Marlin/src/module/stepper.cpp
+++ b/Marlin/src/module/stepper.cpp
@@ -2255,7 +2255,7 @@ uint32_t Stepper::block_phase_isr() {
}
#else
if (stat.isPlanned) { // Planner controls the laser
- #if ENABLED(SPINDLE_LASER_PWM)
+ #if ENABLED(SPINDLE_LASER_USE_PWM)
cutter.ocr_set_power(
stat.isEnabled ? current_block->laser.power : 0 // ON with power or OFF
);
@@ -2303,7 +2303,7 @@ uint32_t Stepper::block_phase_isr() {
// This should mean ending file with 'M5 I' will stop the laser; thus the inline flag isn't needed
const power_status_t stat = planner.laser_inline.status;
if (stat.isPlanned) { // Planner controls the laser
- #if ENABLED(SPINDLE_LASER_PWM)
+ #if ENABLED(SPINDLE_LASER_USE_PWM)
cutter.ocr_set_power(
stat.isEnabled ? planner.laser_inline.power : 0 // ON with power or OFF
);
diff --git a/Marlin/src/module/stepper.h b/Marlin/src/module/stepper.h
index 236ba5ee98..d2f42b63fc 100644
--- a/Marlin/src/module/stepper.h
+++ b/Marlin/src/module/stepper.h
@@ -372,11 +372,11 @@ class Stepper {
uint8_t cur_power; // Current laser power
bool cruise_set; // Power set up for cruising?
- #if DISABLED(LASER_POWER_INLINE_TRAPEZOID_CONT)
+ #if ENABLED(LASER_POWER_INLINE_TRAPEZOID_CONT)
+ uint16_t till_update; // Countdown to the next update
+ #else
uint32_t last_step_count, // Step count from the last update
acc_step_count; // Bresenham counter for laser accel/decel
- #else
- uint16_t till_update; // Countdown to the next update
#endif
} stepper_laser_t;
diff --git a/Marlin/src/pins/mega/pins_HJC2560C_REV2.h b/Marlin/src/pins/mega/pins_HJC2560C_REV2.h
index 27ec998891..dcf25da070 100644
--- a/Marlin/src/pins/mega/pins_HJC2560C_REV2.h
+++ b/Marlin/src/pins/mega/pins_HJC2560C_REV2.h
@@ -112,9 +112,9 @@
//
// M3/M4/M5 - Spindle/Laser Control
//
-#if ENABLED(SPINDLE_LASER_ENABLE)
+#if EITHER(SPINDLE_FEATURE, LASER_FEATURE)
#define SPINDLE_DIR_PIN 16
- #define SPINDLE_LASER_ENABLE_PIN 17 // Pin should have a pullup!
+ #define SPINDLE_LASER_ENA_PIN 17 // Pin should have a pullup!
#define SPINDLE_LASER_PWM_PIN 9 // Hardware PWM
#endif
diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h
index 7a0d932c61..0293da1dba 100644
--- a/Marlin/src/pins/pins.h
+++ b/Marlin/src/pins/pins.h
@@ -549,7 +549,7 @@
#include "stm32f1/pins_CREALITY_V4210.h" // STM32F1 env:STM32F103RET6_creality env:STM32F103RET6_creality_maple
#elif MB(CREALITY_V427)
#include "stm32f1/pins_CREALITY_V427.h" // STM32F1 env:STM32F103RET6_creality env:STM32F103RET6_creality_maple
-#elif MB(CREALITY_V431)
+#elif MB(CREALITY_V431, CREALITY_V431_A, CREALITY_V431_B, CREALITY_V431_C, CREALITY_V431_D)
#include "stm32f1/pins_CREALITY_V431.h" // STM32F1 env:STM32F103RET6_creality env:STM32F103RET6_creality_maple
#elif MB(CREALITY_V452)
#include "stm32f1/pins_CREALITY_V452.h" // STM32F1 env:STM32F103RET6_creality env:STM32F103RET6_creality_maple
@@ -649,6 +649,8 @@
#include "stm32f4/pins_TH3D_EZBOARD_LITE_V2.h" // STM32F4 env:TH3D_EZBoard_Lite_V2
#elif MB(INDEX_REV03)
#include "stm32f4/pins_INDEX_REV03.h" // STM32F4 env:Index_Mobo_Rev03
+#elif MB(MKS_ROBIN_NANO_V1_3_F4)
+ #include "stm32f4/pins_MKS_ROBIN_NANO_V1_3_F4.h" // STM32F4 env:mks_robin_nano_v1_3_f4
//
// ARM Cortex M7
diff --git a/Marlin/src/pins/ramps/pins_TT_OSCAR.h b/Marlin/src/pins/ramps/pins_TT_OSCAR.h
index a43f10fc93..01769fbff0 100644
--- a/Marlin/src/pins/ramps/pins_TT_OSCAR.h
+++ b/Marlin/src/pins/ramps/pins_TT_OSCAR.h
@@ -224,28 +224,28 @@
#endif
//
-// Case Light
+// M3/M4/M5 - Spindle/Laser Control
//
-#if ENABLED(CASE_LIGHT_ENABLE) && !PIN_EXISTS(CASE_LIGHT) && !defined(SPINDLE_LASER_ENABLE_PIN)
+#if EITHER(SPINDLE_FEATURE, LASER_FEATURE) && !PIN_EXISTS(SPINDLE_LASER_ENA)
#if !NUM_SERVOS // Prefer the servo connector
- #define CASE_LIGHT_PIN 6 // Hardware PWM
+ #define SPINDLE_LASER_ENA_PIN 4 // Pullup or pulldown!
+ #define SPINDLE_LASER_PWM_PIN 6 // Hardware PWM
+ #define SPINDLE_DIR_PIN 5
#elif HAS_FREE_AUX2_PINS // Try to use AUX 2
- #define CASE_LIGHT_PIN 44 // Hardware PWM
+ #define SPINDLE_LASER_ENA_PIN 40 // Pullup or pulldown!
+ #define SPINDLE_LASER_PWM_PIN 44 // Hardware PWM
+ #define SPINDLE_DIR_PIN 65
#endif
#endif
//
-// M3/M4/M5 - Spindle/Laser Control
+// Case Light
//
-#if ENABLED(SPINDLE_LASER_ENABLE) && !PIN_EXISTS(SPINDLE_LASER_ENABLE)
+#if ENABLED(CASE_LIGHT_ENABLE) && !PIN_EXISTS(CASE_LIGHT) && !defined(SPINDLE_LASER_ENA_PIN)
#if !NUM_SERVOS // Prefer the servo connector
- #define SPINDLE_LASER_ENABLE_PIN 4 // Pullup or pulldown!
- #define SPINDLE_LASER_PWM_PIN 6 // Hardware PWM
- #define SPINDLE_DIR_PIN 5
+ #define CASE_LIGHT_PIN 6 // Hardware PWM
#elif HAS_FREE_AUX2_PINS // Try to use AUX 2
- #define SPINDLE_LASER_ENABLE_PIN 40 // Pullup or pulldown!
- #define SPINDLE_LASER_PWM_PIN 44 // Hardware PWM
- #define SPINDLE_DIR_PIN 65
+ #define CASE_LIGHT_PIN 44 // Hardware PWM
#endif
#endif
diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h
index 2aa48b7499..c60d4dc2ba 100644
--- a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h
+++ b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h
@@ -88,37 +88,37 @@
//
// Steppers
//
-#define X_ENABLE_PIN PC3
#ifndef X_STEP_PIN
#define X_STEP_PIN PC2
#endif
#ifndef X_DIR_PIN
#define X_DIR_PIN PB9
#endif
+#define X_ENABLE_PIN PC3 // Shared
-#define Y_ENABLE_PIN PC3
#ifndef Y_STEP_PIN
#define Y_STEP_PIN PB8
#endif
#ifndef Y_DIR_PIN
#define Y_DIR_PIN PB7
#endif
+#define Y_ENABLE_PIN X_ENABLE_PIN
-#define Z_ENABLE_PIN PC3
#ifndef Z_STEP_PIN
#define Z_STEP_PIN PB6
#endif
#ifndef Z_DIR_PIN
#define Z_DIR_PIN PB5
#endif
+#define Z_ENABLE_PIN X_ENABLE_PIN
-#define E0_ENABLE_PIN PC3
#ifndef E0_STEP_PIN
#define E0_STEP_PIN PB4
#endif
#ifndef E0_DIR_PIN
#define E0_DIR_PIN PB3
#endif
+#define E0_ENABLE_PIN X_ENABLE_PIN
//
// Release PB4 (Y_ENABLE_PIN) from JTAG NRST role
diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V431.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V431.h
index e8ae84da8f..2f1f2ffb41 100644
--- a/Marlin/src/pins/stm32f1/pins_CREALITY_V431.h
+++ b/Marlin/src/pins/stm32f1/pins_CREALITY_V431.h
@@ -31,10 +31,21 @@
//
// Steppers
//
-#define X_STEP_PIN PB8
-#define X_DIR_PIN PB7
+#if MB(CREALITY_V431, CREALITY_V431_A, CREALITY_V431_B)
-#define Y_STEP_PIN PC2
-#define Y_DIR_PIN PB9
+ #define X_STEP_PIN PB8
+ #define X_DIR_PIN PB7
+
+ #define Y_STEP_PIN PC2
+ #define Y_DIR_PIN PB9
+
+#endif
+
+#if MB(CREALITY_V431_B, CREALITY_V431_C)
+
+ #define E0_STEP_PIN PB3
+ #define E0_DIR_PIN PB4
+
+#endif
#include "pins_CREALITY_V4.h"
diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h
index 975ecb8bd5..c729274c54 100644
--- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h
+++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO.h
@@ -26,200 +26,22 @@
* https://github.com/makerbase-mks/MKS-Robin-Nano-V1.X/tree/master/hardware
*/
-#if NOT_TARGET(STM32F1, STM32F1xx)
- #error "Oops! Select an STM32F1 board in 'Tools > Board.'"
-#elif HOTENDS > 2 || E_STEPPERS > 2
- #error "MKS Robin nano supports up to 2 hotends / E-steppers. Comment out this line to continue."
-#endif
+#define ALLOW_STM32DUINO
+#include "env_validate.h"
#define BOARD_INFO_NAME "MKS Robin Nano"
-#define BOARD_NO_NATIVE_USB
-
-// Avoid conflict with TIMER_SERVO when using the STM32 HAL
-#define TEMP_TIMER 5
-
//
// Release PB4 (Y_ENABLE_PIN) from JTAG NRST role
//
#define DISABLE_JTAG
-//
-// EEPROM
-//
-#if EITHER(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION)
- #define FLASH_EEPROM_EMULATION
- #define EEPROM_PAGE_SIZE (0x800U) // 2KB
- #define EEPROM_START_ADDRESS (0x8000000UL + (STM32_FLASH_SIZE) * 1024UL - (EEPROM_PAGE_SIZE) * 2UL)
- #define MARLIN_EEPROM_SIZE EEPROM_PAGE_SIZE // 2KB
-#endif
-
-#define SPI_DEVICE 2
-
-//
-// Servos
-//
-#define SERVO0_PIN PA8 // Enable BLTOUCH
-
-//
-// Limit Switches
-//
-#define X_STOP_PIN PA15
-#define Y_STOP_PIN PA12
-#define Z_MIN_PIN PA11
-#define Z_MAX_PIN PC4
-
-//
-// Steppers
-//
-#define X_ENABLE_PIN PE4
-#define X_STEP_PIN PE3
-#define X_DIR_PIN PE2
-
-#define Y_ENABLE_PIN PE1
-#define Y_STEP_PIN PE0
-#define Y_DIR_PIN PB9
-
-#define Z_ENABLE_PIN PB8
-#define Z_STEP_PIN PB5
-#define Z_DIR_PIN PB4
-
-#define E0_ENABLE_PIN PB3
-#define E0_STEP_PIN PD6
-#define E0_DIR_PIN PD3
-
-#define E1_ENABLE_PIN PA3
-#define E1_STEP_PIN PA6
-#define E1_DIR_PIN PA1
-
-//
-// Temperature Sensors
-//
-#define TEMP_0_PIN PC1 // TH1
-#define TEMP_1_PIN PC2 // TH2
-#define TEMP_BED_PIN PC0 // TB1
-
-//
-// Heaters / Fans
-//
-#ifndef HEATER_0_PIN
- #define HEATER_0_PIN PC3
-#endif
-#if HOTENDS == 1 && DISABLED(HEATERS_PARALLEL)
- #ifndef FAN1_PIN
- #define FAN1_PIN PB0
- #endif
-#else
- #ifndef HEATER_1_PIN
- #define HEATER_1_PIN PB0
- #endif
-#endif
-#ifndef FAN_PIN
- #define FAN_PIN PB1 // FAN
-#endif
-#ifndef HEATER_BED_PIN
- #define HEATER_BED_PIN PA0
-#endif
-
//
// Thermocouples
//
//#define TEMP_0_CS_PIN PE5 // TC1 - CS1
//#define TEMP_0_CS_PIN PE6 // TC2 - CS2
-//
-// Power Supply Control
-//
-#if ENABLED(MKS_PWC)
- #if ENABLED(TFT_LVGL_UI)
- #undef PSU_CONTROL
- #undef MKS_PWC
- #define SUICIDE_PIN PB2
- #define SUICIDE_PIN_STATE LOW
- #else
- #define PS_ON_PIN PB2 // PW_OFF
- #endif
- #define KILL_PIN PA2
- #define KILL_PIN_STATE HIGH
-#endif
-
-//
-// Misc. Functions
-//
-#if HAS_TFT_LVGL_UI
- #define MT_DET_1_PIN PA4
- #define MT_DET_2_PIN PE6
- #define MT_DET_PIN_STATE LOW
-
- #define WIFI_IO0_PIN PC13
- #define WIFI_IO1_PIN PC7
- #define WIFI_RESET_PIN PA5
-#else
- //#define POWER_LOSS_PIN PA2 // PW_DET
- //#define PS_ON_PIN PB2 // PW_OFF
- #define FIL_RUNOUT_PIN PA4
- #define FIL_RUNOUT2_PIN PE6
-#endif
-
//#define LED_PIN PB2
-//
-// SD Card
-//
-#ifndef SDCARD_CONNECTION
- #define SDCARD_CONNECTION ONBOARD
-#endif
-
-#define SDIO_SUPPORT
-#define SDIO_CLOCK 4500000 // 4.5 MHz
-#define SD_DETECT_PIN PD12
-#define ONBOARD_SD_CS_PIN PC11
-
-//
-// LCD / Controller
-//
-#define BEEPER_PIN PC5
-
-//
-// TFT with FSMC interface
-//
-#if HAS_FSMC_TFT
- /**
- * Note: MKS Robin TFT screens use various TFT controllers.
- * If the screen stays white, disable 'TFT_RESET_PIN'
- * to let the bootloader init the screen.
- */
- #define TFT_RESET_PIN PC6 // FSMC_RST
- #define TFT_BACKLIGHT_PIN PD13
-
- #define DOGLCD_MOSI -1 // Prevent auto-define by Conditionals_post.h
- #define DOGLCD_SCK -1
-
- #define TOUCH_CS_PIN PA7 // SPI2_NSS
- #define TOUCH_SCK_PIN PB13 // SPI2_SCK
- #define TOUCH_MISO_PIN PB14 // SPI2_MISO
- #define TOUCH_MOSI_PIN PB15 // SPI2_MOSI
-
- #define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT
- #define FSMC_CS_PIN PD7
- #define FSMC_RS_PIN PD11
- #define FSMC_DMA_DEV DMA2
- #define FSMC_DMA_CHANNEL DMA_CH5
-
- #define TFT_CS_PIN FSMC_CS_PIN
- #define TFT_RS_PIN FSMC_RS_PIN
-
- #define TOUCH_BUTTONS_HW_SPI
- #define TOUCH_BUTTONS_HW_SPI_DEVICE 2
-
- #define TFT_BUFFER_SIZE 14400
-#endif
-
-#define HAS_SPI_FLASH 1
-#if HAS_SPI_FLASH
- #define SPI_FLASH_SIZE 0x1000000 // 16MB
- #define SPI_FLASH_CS_PIN PB12
- #define SPI_FLASH_MOSI_PIN PB15
- #define SPI_FLASH_MISO_PIN PB14
- #define SPI_FLASH_SCK_PIN PB13
-#endif
+#include "pins_MKS_ROBIN_NANO_common.h"
diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_common.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_common.h
new file mode 100644
index 0000000000..c76175a35c
--- /dev/null
+++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_NANO_common.h
@@ -0,0 +1,210 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2021 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
+
+/**
+ * MKS Robin Nano board common pin assignments
+ */
+
+#if HOTENDS > 2 || E_STEPPERS > 2
+ #error "MKS Robin nano supports up to 2 hotends / E-steppers. Comment out this line to continue."
+#endif
+
+#define BOARD_NO_NATIVE_USB
+
+// Avoid conflict with TIMER_SERVO when using the STM32 HAL
+#define TEMP_TIMER 5
+
+//
+// EEPROM
+//
+#if ENABLED(SRAM_EEPROM_EMULATION)
+ #undef NO_EEPROM_SELECTED
+#endif
+#if EITHER(NO_EEPROM_SELECTED, FLASH_EEPROM_EMULATION)
+ #define FLASH_EEPROM_EMULATION
+ #define EEPROM_PAGE_SIZE (0x800U) // 2KB
+ #define EEPROM_START_ADDRESS (0x8000000UL + (STM32_FLASH_SIZE) * 1024UL - (EEPROM_PAGE_SIZE) * 2UL)
+ #define MARLIN_EEPROM_SIZE EEPROM_PAGE_SIZE // 2KB
+#endif
+
+#define SPI_DEVICE 2
+
+//
+// Servos
+//
+#define SERVO0_PIN PA8 // Enable BLTOUCH
+
+//
+// Limit Switches
+//
+#define X_STOP_PIN PA15
+#define Y_STOP_PIN PA12
+#define Z_MIN_PIN PA11
+#define Z_MAX_PIN PC4
+
+//
+// Steppers
+//
+#define X_ENABLE_PIN PE4
+#define X_STEP_PIN PE3
+#define X_DIR_PIN PE2
+
+#define Y_ENABLE_PIN PE1
+#define Y_STEP_PIN PE0
+#define Y_DIR_PIN PB9
+
+#define Z_ENABLE_PIN PB8
+#define Z_STEP_PIN PB5
+#define Z_DIR_PIN PB4
+
+#define E0_ENABLE_PIN PB3
+#define E0_STEP_PIN PD6
+#define E0_DIR_PIN PD3
+
+#define E1_ENABLE_PIN PA3
+#define E1_STEP_PIN PA6
+#define E1_DIR_PIN PA1
+
+//
+// Temperature Sensors
+//
+#define TEMP_0_PIN PC1 // TH1
+#define TEMP_1_PIN PC2 // TH2
+#define TEMP_BED_PIN PC0 // TB1
+
+//
+// Heaters / Fans
+//
+#ifndef HEATER_0_PIN
+ #define HEATER_0_PIN PC3
+#endif
+#if HOTENDS == 1 && DISABLED(HEATERS_PARALLEL)
+ #ifndef FAN1_PIN
+ #define FAN1_PIN PB0
+ #endif
+#else
+ #ifndef HEATER_1_PIN
+ #define HEATER_1_PIN PB0
+ #endif
+#endif
+#ifndef FAN_PIN
+ #define FAN_PIN PB1 // FAN
+#endif
+#ifndef HEATER_BED_PIN
+ #define HEATER_BED_PIN PA0
+#endif
+
+//
+// Power Supply Control
+//
+#if ENABLED(MKS_PWC)
+ #if ENABLED(TFT_LVGL_UI)
+ #undef PSU_CONTROL
+ #undef MKS_PWC
+ #define SUICIDE_PIN PB2
+ #define SUICIDE_PIN_STATE LOW
+ #else
+ #define PS_ON_PIN PB2 // PW_OFF
+ #endif
+ #define KILL_PIN PA2
+ #define KILL_PIN_STATE HIGH
+#endif
+
+//
+// Misc. Functions
+//
+#if HAS_TFT_LVGL_UI
+ #define MT_DET_1_PIN PA4
+ #define MT_DET_2_PIN PE6
+ #define MT_DET_PIN_STATE LOW
+
+ #define WIFI_IO0_PIN PC13
+ #define WIFI_IO1_PIN PC7
+ #define WIFI_RESET_PIN PA5
+#else
+ //#define POWER_LOSS_PIN PA2 // PW_DET
+ //#define PS_ON_PIN PB2 // PW_OFF
+ #define FIL_RUNOUT_PIN PA4
+ #define FIL_RUNOUT2_PIN PE6
+#endif
+
+//
+// SD Card
+//
+#ifndef SDCARD_CONNECTION
+ #define SDCARD_CONNECTION ONBOARD
+#endif
+
+#define SDIO_SUPPORT
+#define SDIO_CLOCK 4500000 // 4.5 MHz
+#define SD_DETECT_PIN PD12
+#define ONBOARD_SD_CS_PIN PC11
+
+//
+// LCD / Controller
+//
+#define BEEPER_PIN PC5
+
+//
+// TFT with FSMC interface
+//
+#if HAS_FSMC_TFT
+ /**
+ * Note: MKS Robin TFT screens use various TFT controllers.
+ * If the screen stays white, disable 'TFT_RESET_PIN'
+ * to let the bootloader init the screen.
+ */
+ #define TFT_RESET_PIN PC6 // FSMC_RST
+ #define TFT_BACKLIGHT_PIN PD13
+
+ #define DOGLCD_MOSI -1 // Prevent auto-define by Conditionals_post.h
+ #define DOGLCD_SCK -1
+
+ #define TOUCH_CS_PIN PA7 // SPI2_NSS
+ #define TOUCH_SCK_PIN PB13 // SPI2_SCK
+ #define TOUCH_MISO_PIN PB14 // SPI2_MISO
+ #define TOUCH_MOSI_PIN PB15 // SPI2_MOSI
+
+ #define LCD_USE_DMA_FSMC // Use DMA transfers to send data to the TFT
+ #define FSMC_CS_PIN PD7
+ #define FSMC_RS_PIN PD11
+ #define FSMC_DMA_DEV DMA2
+ #define FSMC_DMA_CHANNEL DMA_CH5
+
+ #define TFT_CS_PIN FSMC_CS_PIN
+ #define TFT_RS_PIN FSMC_RS_PIN
+
+ #define TOUCH_BUTTONS_HW_SPI
+ #define TOUCH_BUTTONS_HW_SPI_DEVICE 2
+
+ #define TFT_BUFFER_SIZE 14400
+#endif
+
+#define HAS_SPI_FLASH 1
+#if HAS_SPI_FLASH
+ #define SPI_FLASH_SIZE 0x1000000 // 16MB
+ #define SPI_FLASH_CS_PIN PB12
+ #define SPI_FLASH_MOSI_PIN PB15
+ #define SPI_FLASH_MISO_PIN PB14
+ #define SPI_FLASH_SCK_PIN PB13
+#endif
diff --git a/Marlin/src/pins/stm32f4/pins_ARMED.h b/Marlin/src/pins/stm32f4/pins_ARMED.h
index 4d0369b044..7cccac7caa 100644
--- a/Marlin/src/pins/stm32f4/pins_ARMED.h
+++ b/Marlin/src/pins/stm32f4/pins_ARMED.h
@@ -38,8 +38,10 @@
#define BOARD_INFO_NAME "Arm'ed"
#define DEFAULT_MACHINE_NAME BOARD_INFO_NAME
-#define I2C_EEPROM
-#define MARLIN_EEPROM_SIZE 0x1000 // 4KB
+#if NO_EEPROM_SELECTED
+ #define I2C_EEPROM
+ #define MARLIN_EEPROM_SIZE 0x1000 // 4KB
+#endif
//
// Limit Switches
diff --git a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V1_3_F4.h b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V1_3_F4.h
new file mode 100644
index 0000000000..3cba69a7b3
--- /dev/null
+++ b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V1_3_F4.h
@@ -0,0 +1,45 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (c) 2021 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
+
+/**
+ * MKS Robin nano V1.3 (STM32F407VET6) board pin assignments
+ * https://github.com/makerbase-mks/MKS-Robin-Nano-V1.X/tree/master/hardware
+ */
+
+#define ALLOW_STM32DUINO
+#include "env_validate.h"
+
+#define BOARD_INFO_NAME "MKS Robin Nano V1.3"
+
+//
+// EEPROM
+// Use one of these or SDCard-based Emulation will be used
+//
+#if NO_EEPROM_SELECTED
+ //#define SRAM_EEPROM_EMULATION // Use BackSRAM-based EEPROM emulation
+ //#define FLASH_EEPROM_EMULATION // Use Flash-based EEPROM emulation
+#endif
+
+#define LED_PIN PB1
+
+#include "../stm32f1/pins_MKS_ROBIN_NANO_common.h"
diff --git a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h
index e78807e1af..c9762a6914 100644
--- a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h
+++ b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h
@@ -67,11 +67,10 @@
#define E0_DIAG_PIN PC4
#define E1_DIAG_PIN PE7
-//
-#define X_STOP_PIN PA15
-#define Y_STOP_PIN PD2
-#define Z_MIN_PIN PC8
-#define Z_MAX_PIN PC4
+#define X_STOP_PIN X_DIAG_PIN
+#define Y_STOP_PIN Y_DIAG_PIN
+#define Z_MIN_PIN Z_DIAG_PIN
+#define Z_MAX_PIN E0_DIAG_PIN
//
// Steppers
diff --git a/ini/stm32f1.ini b/ini/stm32f1.ini
index a27d275fc1..da7cedd3a3 100644
--- a/ini/stm32f1.ini
+++ b/ini/stm32f1.ini
@@ -352,7 +352,6 @@ platform = ${stm32_variant.platform}
extends = stm32_variant
board = genericSTM32F103ZE
board_build.variant = MARLIN_F103Zx
-board_build.offset = 0x7000
build_flags = ${stm32_variant.build_flags}
-DENABLE_HWSERIAL3 -DTIMER_SERIAL=TIM5
build_unflags = ${stm32_variant.build_unflags}
diff --git a/ini/stm32f4.ini b/ini/stm32f4.ini
index 84256d3be9..c8f8676b68 100644
--- a/ini/stm32f4.ini
+++ b/ini/stm32f4.ini
@@ -464,3 +464,27 @@ board_upload.offset_address = 0x0800C000
build_flags = ${stm32_variant.build_flags} -DHSE_VALUE=12000000U -O0
debug_tool = stlink
upload_protocol = stlink
+
+#
+# BOARD_MKS_ROBIN_NANO_V1_3_F4
+# - MKS Robin Nano V1.3 (STM32F407VET6) 5 Pololu Plug
+# - MKS Robin Nano-S V1.3 (STM32F407VET6) 4 TMC2225 + 1 Pololu Plug
+#
+[env:mks_robin_nano_v1_3_f4]
+platform = ${common_stm32.platform}
+extends = stm32_variant
+board = marlin_STM32F407VGT6_CCM
+board_build.variant = MARLIN_F4x7Vx
+board_build.offset = 0x8000
+board_upload.offset_address = 0x08008000
+board_build.rename = Robin_nano35.bin
+build_flags = ${stm32_variant.build_flags}
+ -DMCU_STM32F407VE -DSS_TIMER=4 -DENABLE_HWSERIAL3
+ -DSTM32_FLASH_SIZE=512
+ -DTIMER_TONE=TIM3 -DTIMER_SERVO=TIM2
+ -DHAL_SD_MODULE_ENABLED
+ -DHAL_SRAM_MODULE_ENABLED
+build_unflags = ${stm32_variant.build_unflags}
+ -DUSBCON -DUSBD_USE_CDC
+debug_tool = jlink
+upload_protocol = jlink