diff --git a/.github/workflows/ci-build-tests.yml b/.github/workflows/ci-build-tests.yml
index f80417c0fe..b65a71ab56 100644
--- a/.github/workflows/ci-build-tests.yml
+++ b/.github/workflows/ci-build-tests.yml
@@ -36,6 +36,9 @@ jobs:
runs-on: ubuntu-22.04
+ env:
+ CONFIG_BRANCH: ${{ github.base_ref || github.ref_name }}
+
strategy:
fail-fast: true
matrix:
@@ -205,6 +208,13 @@ jobs:
sudo apt-get install libsdl2-net-dev
sudo apt-get install libglm-dev
+ - name: Checkout Configurations
+ uses: actions/checkout@v4
+ with:
+ repository: MarlinFirmware/Configurations
+ ref: ${{ env.CONFIG_BRANCH }}
+ path: ConfigurationsRepo
+
- name: Run ${{ matrix.test-platform }} Tests
run: |
make tests-single-ci TEST_TARGET=${{ matrix.test-platform }}
diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h
index dc042ff1cb..08216d17b8 100644
--- a/Marlin/Configuration.h
+++ b/Marlin/Configuration.h
@@ -148,9 +148,9 @@
* Options: A4988, A5984, DRV8825, LV8729, TB6560, TB6600, TMC2100,
* TMC2130, TMC2130_STANDALONE, TMC2160, TMC2160_STANDALONE,
* TMC2208, TMC2208_STANDALONE, TMC2209, TMC2209_STANDALONE,
- * TMC2660, TMC2660_STANDALONE, TMC5130, TMC5130_STANDALONE,
- * TMC5160, TMC5160_STANDALONE
- * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2160', 'TMC2160_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC2209', 'TMC2209_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE', 'TMC5160', 'TMC5160_STANDALONE']
+ * TMC2240, TMC2240_STANDALONE, TMC2660, TMC2660_STANDALONE,
+ * TMC5130, TMC5130_STANDALONE, TMC5160, TMC5160_STANDALONE
+ * :['A4988', 'A5984', 'DRV8825', 'LV8729', 'TB6560', 'TB6600', 'TMC2100', 'TMC2130', 'TMC2130_STANDALONE', 'TMC2160', 'TMC2160_STANDALONE', 'TMC2208', 'TMC2208_STANDALONE', 'TMC2209', 'TMC2209_STANDALONE', 'TMC2240', 'TMC2240_STANDALONE', 'TMC2660', 'TMC2660_STANDALONE', 'TMC5130', 'TMC5130_STANDALONE', 'TMC5160', 'TMC5160_STANDALONE']
*/
#define X_DRIVER_TYPE A4988
#define Y_DRIVER_TYPE A4988
@@ -767,6 +767,7 @@
#define MPC_TUNING_POS { X_CENTER, Y_CENTER, 1.0f } // (mm) M306 Autotuning position, ideally bed center at first layer height.
#define MPC_TUNING_END_Z 10.0f // (mm) M306 Autotuning final Z position.
+ //#define EVENT_GCODE_AFTER_MPC_TUNE "M84" // G-code to execute after MPC tune finished and Z raised.
#endif
//===========================================================================
diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h
index f31a284d81..7939b5cc9b 100644
--- a/Marlin/Configuration_adv.h
+++ b/Marlin/Configuration_adv.h
@@ -1673,11 +1673,12 @@
#endif // HAS_DISPLAY
-#if HAS_FEEDRATE_EDIT
+// Some displays offer Feedrate / Flow editing.
+#if ANY(HAS_MARLINUI_MENU, DWIN_CREALITY_LCD, DWIN_LCD_PROUI, MALYAN_LCD, TOUCH_SCREEN, ULTIPANEL_FEEDMULTIPLY)
#define SPEED_EDIT_MIN 10 // (%) Feedrate percentage edit range minimum
#define SPEED_EDIT_MAX 999 // (%) Feedrate percentage edit range maximum
#endif
-#if HAS_FLOW_EDIT
+#if ANY(HAS_MARLINUI_MENU, DWIN_CREALITY_LCD, DWIN_LCD_PROUI, MALYAN_LCD, TOUCH_SCREEN)
#define FLOW_EDIT_MIN 10 // (%) Flow percentage edit range minimum
#define FLOW_EDIT_MAX 999 // (%) Flow percentage edit range maximum
#endif
@@ -2366,11 +2367,11 @@
* Higher k and higher XY acceleration may require larger ADVANCE_TAU to avoid skipping steps.
*/
#if ENABLED(DISTINCT_E_FACTORS)
- #define ADVANCE_TAU { 0.01 } // (s) Smoothing time to reduce extruder acceleration, per extruder
+ #define ADVANCE_TAU { 0.02 } // (s) Smoothing time to reduce extruder acceleration, per extruder
#else
- #define ADVANCE_TAU 0.01 // (s) Smoothing time to reduce extruder acceleration
+ #define ADVANCE_TAU 0.02 // (s) Smoothing time to reduce extruder acceleration
#endif
- #define SMOOTH_LIN_ADV_HZ 5000 // (Hz) How often to update extruder speed
+ #define SMOOTH_LIN_ADV_HZ 1000 // (Hz) How often to update extruder speed
#define INPUT_SHAPING_E_SYNC // Synchronize the extruder-shaped XY axes (to increase precision)
#endif
#endif
@@ -2996,7 +2997,7 @@
/**
* Trinamic Smart Drivers
*
- * To use TMC2130, TMC2160, TMC2660, TMC5130, TMC5160 stepper drivers in SPI mode:
+ * To use TMC2130, TMC2160, TMC2240, TMC2660, TMC5130, TMC5160 stepper drivers in SPI mode:
* - Connect your SPI pins to the Hardware SPI interface on the board.
* Some boards have simple jumper connections! See your board's documentation.
* - Define the required Stepper CS pins in your `pins_MYBOARD.h` file.
@@ -3026,6 +3027,15 @@
*/
#define INTERPOLATE true
+ #if HAS_DRIVER(TMC2240)
+ #define TMC2240_CURRENT_RANGE 1 // RMS: { 0:'690mA', 1:'1410mA', 2:'2120mA', 3:'2110mA' }
+ // PEAK:{ 0:'1A', 1:'2A', 2:'3A', 3:'3A' }
+ // Determines max current. Lower is more internal current resolution. Higher runs cooler.
+ #define TMC2240_Rref 12000 // ('rref', 12000, minval=12000, maxval=60000)
+ #define TMC2240_SLOPE_CONTROL 0 // :{ 0:'100V/us', 1:'200V/us', 2:'400V/us', 3:'800V/us' }
+ // Lower is more silent. Higher runs cooler.
+ #endif
+
#if AXIS_IS_TMC_CONFIG(X)
#define X_CURRENT 800 // (mA) RMS current. Multiply by 1.414 for peak current.
#define X_CURRENT_HOME X_CURRENT // (mA) RMS current for homing. (Typically lower than *_CURRENT.)
@@ -3248,7 +3258,7 @@
// @section tmc/spi
/**
- * Override default SPI pins for TMC2130, TMC2160, TMC2660, TMC5130 and TMC5160 drivers here.
+ * Override default SPI pins for TMC2130, TMC2160, TMC2240, TMC2660, TMC5130 and TMC5160 drivers here.
* The default pins can be found in your board's pins file.
*/
//#define X_CS_PIN -1
@@ -3275,7 +3285,7 @@
//#define E7_CS_PIN -1
/**
- * Software option for SPI driven drivers (TMC2130, TMC2160, TMC2660, TMC5130 and TMC5160).
+ * Software option for SPI driven drivers (TMC2130, TMC2160, TMC2240, TMC2660, TMC5130 and TMC5160).
* The default SW SPI pins are defined the respective pins files,
* but you can override or define them here.
*/
@@ -3334,7 +3344,7 @@
// @section tmc/stealthchop
/**
- * TMC2130, TMC2160, TMC2208, TMC2209, TMC5130 and TMC5160 only
+ * TMC2130, TMC2160, TMC2208, TMC2209, TMC2240, TMC5130 and TMC5160 only
* Use Trinamic's ultra quiet stepping mode.
* When disabled, Marlin will use spreadCycle stepping mode.
*/
@@ -3413,7 +3423,7 @@
// @section tmc/hybrid
/**
- * TMC2130, TMC2160, TMC2208, TMC2209, TMC5130 and TMC5160 only
+ * TMC2130, TMC2160, TMC2208, TMC2209, TMC2240, TMC5130 and TMC5160 only
* The driver will switch to spreadCycle when stepper speed is over HYBRID_THRESHOLD.
* This mode allows for faster movements at the expense of higher noise levels.
* STEALTHCHOP_(XY|Z|E) must be enabled to use HYBRID_THRESHOLD.
@@ -3447,20 +3457,20 @@
/**
* Use StallGuard to home / probe X, Y, Z.
*
- * TMC2130, TMC2160, TMC2209, TMC2660, TMC5130, and TMC5160 only
+ * TMC2130, TMC2160, TMC2209, TMC2240, TMC2660, TMC5130, and TMC5160 only
* Connect the stepper driver's DIAG1 pin to the X/Y endstop pin.
* X, Y, and Z homing will always be done in spreadCycle mode.
*
* X/Y/Z_STALL_SENSITIVITY is the default stall threshold.
* Use M914 X Y Z to set the stall threshold at runtime:
*
- * Sensitivity TMC2209 Others
- * HIGHEST 255 -64 (Too sensitive => False positive)
- * LOWEST 0 63 (Too insensitive => No trigger)
+ * Sensitivity TMC2209/2240 Others
+ * HIGHEST 255 -64 (Too sensitive => False positive)
+ * LOWEST 0 63 (Too insensitive => No trigger)
*
* It is recommended to set HOMING_BUMP_MM to { 0, 0, 0 }.
*
- * SPI_ENDSTOPS *** TMC2130/TMC5160 Only ***
+ * SPI_ENDSTOPS *** TMC2130, TMC2240, and TMC5160 Only ***
* Poll the driver through SPI to determine load when homing.
* Removes the need for a wire from DIAG1 to an endstop pin.
*
@@ -3473,7 +3483,7 @@
//#define SENSORLESS_HOMING // StallGuard capable drivers only
#if ANY(SENSORLESS_HOMING, SENSORLESS_PROBING)
- // TMC2209: 0...255. TMC2130: -64...63
+ // TMC2209/2240: 0...255. TMC2130: -64...63
#define X_STALL_SENSITIVITY 8
#define X2_STALL_SENSITIVITY X_STALL_SENSITIVITY
#define Y_STALL_SENSITIVITY 8
@@ -3488,7 +3498,7 @@
//#define U_STALL_SENSITIVITY 8
//#define V_STALL_SENSITIVITY 8
//#define W_STALL_SENSITIVITY 8
- //#define SPI_ENDSTOPS // TMC2130/TMC5160 only
+ //#define SPI_ENDSTOPS // TMC2130, TMC2240, and TMC5160
//#define IMPROVE_HOMING_RELIABILITY
#endif
diff --git a/Marlin/Makefile b/Marlin/Makefile
index ce26bd3572..9acab53673 100644
--- a/Marlin/Makefile
+++ b/Marlin/Makefile
@@ -798,10 +798,10 @@ endif
ifeq ($(TMC), 1)
LIB_CXXSRC += TMCStepper.cpp COOLCONF.cpp DRV_STATUS.cpp IHOLD_IRUN.cpp \
- CHOPCONF.cpp GCONF.cpp PWMCONF.cpp DRV_CONF.cpp DRVCONF.cpp DRVCTRL.cpp \
- DRVSTATUS.cpp ENCMODE.cpp RAMP_STAT.cpp SGCSCONF.cpp SHORT_CONF.cpp \
- SMARTEN.cpp SW_MODE.cpp SW_SPI.cpp TMC2130Stepper.cpp TMC2208Stepper.cpp \
- TMC2209Stepper.cpp TMC2660Stepper.cpp TMC5130Stepper.cpp TMC5160Stepper.cpp
+ CHOPCONF.cpp GCONF.cpp PWMCONF.cpp DRV_CONF.cpp DRVCONF.cpp DRVCTRL.cpp DRVSTATUS.cpp \
+ GLOBAL_SCALER.cpp SLAVECONF.cpp IOIN.cpp ENCMODE.cpp RAMP_STAT.cpp SGCSCONF.cpp \
+ SHORT_CONF.cpp SMARTEN.cpp SW_MODE.cpp SW_SPI.cpp TMC2130Stepper.cpp TMC2208Stepper.cpp \
+ TMC2209Stepper.cpp TMC2240Stepper.cpp TMC2660Stepper.cpp TMC5130Stepper.cpp TMC5160Stepper.cpp
endif
ifeq ($(RELOC_WORKAROUND), 1)
diff --git a/Marlin/Version.h b/Marlin/Version.h
index 3c4711b876..34ac9adaa3 100644
--- a/Marlin/Version.h
+++ b/Marlin/Version.h
@@ -41,7 +41,7 @@
* here we define this default string as the date where the latest release
* version was tagged.
*/
-//#define STRING_DISTRIBUTION_DATE "2025-05-10"
+//#define STRING_DISTRIBUTION_DATE "2025-05-27"
/**
* The protocol for communication to the host. Protocol indicates communication
diff --git a/Marlin/src/HAL/GD32_MFL/eeprom/eeprom_if_iic.cpp b/Marlin/src/HAL/GD32_MFL/eeprom/eeprom_if_iic.cpp
index ea563f742c..765c997e1f 100644
--- a/Marlin/src/HAL/GD32_MFL/eeprom/eeprom_if_iic.cpp
+++ b/Marlin/src/HAL/GD32_MFL/eeprom/eeprom_if_iic.cpp
@@ -42,7 +42,7 @@ void eeprom_init() {
void eeprom_write_byte(uint8_t *pos, uint8_t value) {
const unsigned eeprom_address = (unsigned)pos;
- return BL24CXX::writeOneByte(eeprom_address, value);
+ BL24CXX::writeOneByte(eeprom_address, value);
}
uint8_t eeprom_read_byte(uint8_t *pos) {
diff --git a/Marlin/src/HAL/GD32_MFL/timers.h b/Marlin/src/HAL/GD32_MFL/timers.h
index 49d005b8cd..a5d36d9eca 100644
--- a/Marlin/src/HAL/GD32_MFL/timers.h
+++ b/Marlin/src/HAL/GD32_MFL/timers.h
@@ -44,9 +44,9 @@
extern uint32_t GetStepperTimerClkFreq();
// Timer prescaler calculations
-#define STEPPER_TIMER_PRESCALE (GetStepperTimerClkFreq() / STEPPER_TIMER_RATE) // Prescaler = 30
+#define STEPPER_TIMER_PRESCALE (GetStepperTimerClkFreq() / STEPPER_TIMER_RATE) // Prescaler = 30
#define PULSE_TIMER_PRESCALE STEPPER_TIMER_PRESCALE
-#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // Stepper timer ticks per µs
+#define STEPPER_TIMER_TICKS_PER_US ((STEPPER_TIMER_RATE) / 1000000) // Stepper timer ticks per µs
#define PULSE_TIMER_RATE STEPPER_TIMER_RATE
#define PULSE_TIMER_TICKS_PER_US STEPPER_TIMER_TICKS_PER_US
@@ -57,7 +57,7 @@ extern uint32_t GetStepperTimerClkFreq();
#define ENABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_STEP)
#define DISABLE_STEPPER_DRIVER_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_STEP)
#define STEPPER_ISR_ENABLED() HAL_timer_interrupt_enabled(MF_TIMER_STEP)
-#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_TEMP)
+#define ENABLE_TEMPERATURE_INTERRUPT() HAL_timer_enable_interrupt(MF_TIMER_TEMP)
#define DISABLE_TEMPERATURE_INTERRUPT() HAL_timer_disable_interrupt(MF_TIMER_TEMP)
extern void Step_Handler();
diff --git a/Marlin/src/HAL/HC32/eeprom/eeprom_if_iic.cpp b/Marlin/src/HAL/HC32/eeprom/eeprom_if_iic.cpp
index 85d21a972a..0a161f23f2 100644
--- a/Marlin/src/HAL/HC32/eeprom/eeprom_if_iic.cpp
+++ b/Marlin/src/HAL/HC32/eeprom/eeprom_if_iic.cpp
@@ -39,7 +39,7 @@ void eeprom_init() {
void eeprom_write_byte(uint8_t *pos, unsigned char value) {
const unsigned eeprom_address = (unsigned)pos;
- return BL24CXX::writeOneByte(eeprom_address, value);
+ BL24CXX::writeOneByte(eeprom_address, value);
}
uint8_t eeprom_read_byte(uint8_t *pos) {
diff --git a/Marlin/src/HAL/LPC1768/upload_extra_script.py b/Marlin/src/HAL/LPC1768/upload_extra_script.py
index ce241c4658..f9be140592 100755
--- a/Marlin/src/HAL/LPC1768/upload_extra_script.py
+++ b/Marlin/src/HAL/LPC1768/upload_extra_script.py
@@ -54,18 +54,25 @@ if pioutil.is_pio_build():
final_drive_name = drive + ':'
# print ('disc check: {}'.format(final_drive_name))
try:
- volume_info = str(subprocess.check_output('cmd /C dir ' + final_drive_name, stderr=subprocess.STDOUT))
+ volume_info = str(subprocess.check_output('cmd /C vol ' + final_drive_name, stderr=subprocess.STDOUT))
except Exception as e:
print ('error:{}'.format(e))
continue
else:
- if target_drive in volume_info and not target_file_found: # set upload if not found target file yet
- target_drive_found = True
+ if target_drive in volume_info: # set upload
upload_disk = PureWindowsPath(final_drive_name)
- if target_filename in volume_info:
- if not target_file_found:
+ target_drive_found = True
+ break
+ try:
+ dir_info = str(subprocess.check_output('cmd /C dir ' + final_drive_name, stderr=subprocess.STDOUT))
+ except Exception as e:
+ print ('error:{}'.format(e))
+ continue
+ else:
+ if target_filename in dir_info:
upload_disk = PureWindowsPath(final_drive_name)
- target_file_found = True
+ target_file_found = True
+ break
elif current_OS == 'Linux':
#
diff --git a/Marlin/src/HAL/STM32/eeprom/eeprom_if_iic.cpp b/Marlin/src/HAL/STM32/eeprom/eeprom_if_iic.cpp
index 9cabdd681b..2733c8f283 100644
--- a/Marlin/src/HAL/STM32/eeprom/eeprom_if_iic.cpp
+++ b/Marlin/src/HAL/STM32/eeprom/eeprom_if_iic.cpp
@@ -44,7 +44,7 @@ void eeprom_init() { BL24CXX::init(); }
void eeprom_write_byte(uint8_t *pos, uint8_t value) {
const unsigned eeprom_address = (unsigned)pos;
- return BL24CXX::writeOneByte(eeprom_address, value);
+ BL24CXX::writeOneByte(eeprom_address, value);
}
uint8_t eeprom_read_byte(uint8_t *pos) {
diff --git a/Marlin/src/HAL/STM32F1/eeprom/eeprom_if_iic.cpp b/Marlin/src/HAL/STM32F1/eeprom/eeprom_if_iic.cpp
index e1d5e06b68..e7e7fc1db1 100644
--- a/Marlin/src/HAL/STM32F1/eeprom/eeprom_if_iic.cpp
+++ b/Marlin/src/HAL/STM32F1/eeprom/eeprom_if_iic.cpp
@@ -42,7 +42,7 @@ void eeprom_init() { BL24CXX::init(); }
void eeprom_write_byte(uint8_t *pos, uint8_t value) {
const unsigned eeprom_address = (unsigned)pos;
- return BL24CXX::writeOneByte(eeprom_address, value);
+ BL24CXX::writeOneByte(eeprom_address, value);
}
uint8_t eeprom_read_byte(uint8_t *pos) {
diff --git a/Marlin/src/HAL/shared/Delay.h b/Marlin/src/HAL/shared/Delay.h
index 4751d7a5e2..eeaf4c59fc 100644
--- a/Marlin/src/HAL/shared/Delay.h
+++ b/Marlin/src/HAL/shared/Delay.h
@@ -100,7 +100,7 @@ void calibrate_delay_loop();
// For delay in microseconds, no smart delay selection is required, directly call the delay function
// Teensy compiler is too old and does not accept smart delay compile-time / run-time selection correctly
- #define DELAY_US(x) DelayCycleFnc((x) * ((F_CPU) / 1000000UL))
+ #define DELAY_US(x) DelayCycleFnc((unsigned long)(x) * ((F_CPU) / 1000000UL))
#elif defined(__AVR__)
FORCE_INLINE static void __delay_up_to_3c(uint8_t cycles) {
@@ -164,7 +164,7 @@ void calibrate_delay_loop();
}
// Delay in microseconds
- #define DELAY_US(x) DELAY_CYCLES((x) * ((F_CPU) / 1000000UL))
+ #define DELAY_US(x) DELAY_CYCLES((unsigned long)(x) * ((F_CPU) / 1000000UL))
#define DELAY_CYCLES_VAR DELAY_CYCLES
@@ -173,7 +173,7 @@ void calibrate_delay_loop();
// DELAY_CYCLES specified inside platform
// Delay in microseconds
- #define DELAY_US(x) DELAY_CYCLES((x) * ((F_CPU) / 1000000UL))
+ #define DELAY_US(x) DELAY_CYCLES((unsigned long)(x) * ((F_CPU) / 1000000UL))
#define DELAY_CYCLES_VAR DELAY_CYCLES
diff --git a/Marlin/src/core/drivers.h b/Marlin/src/core/drivers.h
index c54e42c8fe..3a53360e26 100644
--- a/Marlin/src/core/drivers.h
+++ b/Marlin/src/core/drivers.h
@@ -41,6 +41,8 @@
#define _TMC2208_STANDALONE 0x2208B
#define _TMC2209 0x2209A
#define _TMC2209_STANDALONE 0x2209B
+#define _TMC2240 0x2240A
+#define _TMC2240_STANDALONE 0x2240B
#define _TMC2660 0x2660A
#define _TMC2660_STANDALONE 0x2660B
#define _TMC5130 0x5130A
@@ -96,7 +98,7 @@
// Does not match standalone configurations
#if ( HAS_DRIVER(TMC2130) || HAS_DRIVER(TMC2160) \
|| HAS_DRIVER(TMC2208) || HAS_DRIVER(TMC2209) \
- || HAS_DRIVER(TMC2660) \
+ || HAS_DRIVER(TMC2240) || HAS_DRIVER(TMC2660) \
|| HAS_DRIVER(TMC5130) || HAS_DRIVER(TMC5160) )
#define HAS_TRINAMIC_CONFIG 1
#endif
@@ -106,22 +108,33 @@
#if ( HAS_DRIVER(TMC2100) \
|| HAS_DRIVER(TMC2130_STANDALONE) || HAS_DRIVER(TMC2160_STANDALONE) \
|| HAS_DRIVER(TMC2208_STANDALONE) || HAS_DRIVER(TMC2209_STANDALONE) \
- || HAS_DRIVER(TMC2660_STANDALONE) || HAS_DRIVER(TMC5130_STANDALONE) \
- || HAS_DRIVER(TMC5160_STANDALONE) )
+ || HAS_DRIVER(TMC2240_STANDALONE) || HAS_DRIVER(TMC2660_STANDALONE) \
+ || HAS_DRIVER(TMC5130_STANDALONE) || HAS_DRIVER(TMC5160_STANDALONE) )
#define HAS_TRINAMIC_STANDALONE 1
#endif
#if HAS_DRIVER(TMC2130) || HAS_DRIVER(TMC2160) || HAS_DRIVER(TMC5130) || HAS_DRIVER(TMC5160)
#define HAS_TMCX1X0 1
#endif
-
+#if HAS_TMCX1X0 || HAS_DRIVER(TMC2240)
+ #define HAS_TMCX1X0_OR_2240 1
+#endif
#if HAS_DRIVER(TMC2208) || HAS_DRIVER(TMC2209)
#define HAS_TMC220x 1
#endif
+//#if HAS_TMC_220x || HAS_DRIVER(TMC2240)
+// #define HAS_TMC22xx 1
+//#endif
+//#if HAS_TMCX1X0 || HAS_TMC220x
+// #define HAS_TMC_CS_ACTUAL 1
+//#endif
+//#if HAS_TMCX1X0 || HAS_DRIVER(TMC2209)
+// #define HAS_TMC_SG_RESULT 1
+//#endif
#define AXIS_IS_TMC(A) ( AXIS_DRIVER_TYPE(A,TMC2130) || AXIS_DRIVER_TYPE(A,TMC2160) \
|| AXIS_DRIVER_TYPE(A,TMC2208) || AXIS_DRIVER_TYPE(A,TMC2209) \
- || AXIS_DRIVER_TYPE(A,TMC2660) \
+ || AXIS_DRIVER_TYPE(A,TMC2240) || AXIS_DRIVER_TYPE(A,TMC2660) \
|| AXIS_DRIVER_TYPE(A,TMC5130) || AXIS_DRIVER_TYPE(A,TMC5160) )
#define AXIS_IS_TMC_CONFIG AXIS_IS_TMC
@@ -129,8 +142,8 @@
// Test for a driver that uses SPI - this allows checking whether a _CS_ pin
// is considered sensitive
#define AXIS_HAS_SPI(A) ( AXIS_DRIVER_TYPE(A,TMC2130) || AXIS_DRIVER_TYPE(A,TMC2160) \
- || AXIS_DRIVER_TYPE(A,TMC2660) || AXIS_DRIVER_TYPE(A,TMC5130) \
- || AXIS_DRIVER_TYPE(A,TMC5160) )
+ || AXIS_DRIVER_TYPE(A,TMC2240) || AXIS_DRIVER_TYPE(A,TMC2660) \
+ || AXIS_DRIVER_TYPE(A,TMC5130) || AXIS_DRIVER_TYPE(A,TMC5160) )
#define AXIS_HAS_UART(A) ( AXIS_DRIVER_TYPE(A,TMC2208) || AXIS_DRIVER_TYPE(A,TMC2209) )
@@ -140,19 +153,21 @@
#define AXIS_HAS_SW_SERIAL(A) ( AXIS_HAS_UART(A) && !defined(A##_HARDWARE_SERIAL) )
#define AXIS_HAS_STALLGUARD(A) ( AXIS_DRIVER_TYPE(A,TMC2130) || AXIS_DRIVER_TYPE(A,TMC2160) \
- || AXIS_DRIVER_TYPE(A,TMC2209) \
+ || AXIS_DRIVER_TYPE(A,TMC2209) || AXIS_DRIVER_TYPE(A,TMC2240) \
|| AXIS_DRIVER_TYPE(A,TMC2660) \
|| AXIS_DRIVER_TYPE(A,TMC5130) || AXIS_DRIVER_TYPE(A,TMC5160) )
#define AXIS_HAS_STEALTHCHOP(A) ( AXIS_DRIVER_TYPE(A,TMC2130) || AXIS_DRIVER_TYPE(A,TMC2160) \
|| AXIS_DRIVER_TYPE(A,TMC2208) || AXIS_DRIVER_TYPE(A,TMC2209) \
+ || AXIS_DRIVER_TYPE(A,TMC2240) \
|| AXIS_DRIVER_TYPE(A,TMC5130) || AXIS_DRIVER_TYPE(A,TMC5160) )
#define AXIS_HAS_SG_RESULT(A) ( AXIS_DRIVER_TYPE(A,TMC2130) || AXIS_DRIVER_TYPE(A,TMC2160) \
- || AXIS_DRIVER_TYPE(A,TMC2208) || AXIS_DRIVER_TYPE(A,TMC2209) )
+ || AXIS_DRIVER_TYPE(A,TMC2208) || AXIS_DRIVER_TYPE(A,TMC2209) \
+ || AXIS_DRIVER_TYPE(A,TMC2240) )
#define AXIS_HAS_COOLSTEP(A) ( AXIS_DRIVER_TYPE(A,TMC2130) \
- || AXIS_DRIVER_TYPE(A,TMC2209) \
+ || AXIS_DRIVER_TYPE(A,TMC2209) || AXIS_DRIVER_TYPE(A,TMC2240) \
|| AXIS_DRIVER_TYPE(A,TMC5130) || AXIS_DRIVER_TYPE(A,TMC5160) )
#define _OR_EAH(N,T) || AXIS_HAS_##T(E##N)
@@ -195,6 +210,7 @@
#define THRS_TMC2160 255
#define THRS_TMC2208 255
#define THRS_TMC2209 255
+#define THRS_TMC2240 255
#define THRS_TMC2660 65535
#define THRS_TMC5130 65535
#define THRS_TMC5160 65535
diff --git a/Marlin/src/core/serial.cpp b/Marlin/src/core/serial.cpp
index 8a8378330f..3ddfa6d345 100644
--- a/Marlin/src/core/serial.cpp
+++ b/Marlin/src/core/serial.cpp
@@ -114,10 +114,6 @@ void serial_ternary(FSTR_P const pre, const bool onoff, FSTR_P const on, FSTR_P
if (post) SERIAL_ECHO(post);
}
-void serialprint_onoff(const bool onoff) { SERIAL_ECHO(onoff ? F(STR_ON) : F(STR_OFF)); }
-void serialprintln_onoff(const bool onoff) { serialprint_onoff(onoff); SERIAL_EOL(); }
-void serialprint_truefalse(const bool tf) { SERIAL_ECHO(tf ? F("true") : F("false")); }
-
void print_bin(uint16_t val) {
for (uint8_t i = 16; i--;) {
SERIAL_CHAR('0' + TEST(val, i));
diff --git a/Marlin/src/core/serial.h b/Marlin/src/core/serial.h
index 97f31dea35..8ec8b8db2a 100644
--- a/Marlin/src/core/serial.h
+++ b/Marlin/src/core/serial.h
@@ -233,9 +233,9 @@ void serial_ternary(FSTR_P const pre, const bool onoff, FSTR_P const on, FSTR_P
// Print up to 255 spaces
void SERIAL_ECHO_SP(uint8_t count);
-void serialprint_onoff(const bool onoff);
-void serialprintln_onoff(const bool onoff);
-void serialprint_truefalse(const bool tf);
+inline FSTR_P const ON_OFF(const bool onoff) { return onoff ? F("ON") : F("OFF"); }
+inline FSTR_P const TRUE_FALSE(const bool tf) { return tf ? F("true") : F("false"); }
+
void serial_offset(const_float_t v, const uint8_t sp=0); // For v==0 draw space (sp==1) or plus (sp==2)
void print_bin(const uint16_t val);
diff --git a/Marlin/src/core/types.h b/Marlin/src/core/types.h
index 0de49771ee..86f6ae69dc 100644
--- a/Marlin/src/core/types.h
+++ b/Marlin/src/core/types.h
@@ -168,7 +168,7 @@ template struct IF { typedef L type; };
// Helpers
#define _RECIP(N) ((N) ? 1.0f / static_cast(N) : 0.0f)
-#define _ABS(N) ((N) < 0 ? -(N) : (N))
+#define _ABS(N) ((N) < decltype(N)(0) ? -(N) : (N))
#define _LS(N) T(uint32_t(N) << p)
#define _RS(N) T(uint32_t(N) >> p)
#define _LSE(N) N = T(uint32_t(N) << p)
@@ -640,8 +640,8 @@ struct XYZval {
FI void reset() { NUM_AXIS_CODE(x = 0, y = 0, z = 0, i = 0, j = 0, k = 0, u = 0, v = 0, w = 0); }
// Setters taking struct types and arrays
- FI void set(const XYval pxy) { XY_CODE(x = pxy.x, y = pxy.y); }
- FI void set(const XYval pxy, const T pz) { XYZ_CODE(x = pxy.x, y = pxy.y, z = pz); }
+ FI void set(const XYval &pxy) { XY_CODE(x = pxy.x, y = pxy.y); }
+ FI void set(const XYval &pxy, const T pz) { XYZ_CODE(x = pxy.x, y = pxy.y, z = pz); }
FI void set(const T (&arr)[NUM_AXES]) { NUM_AXIS_CODE(x = arr[0], y = arr[1], z = arr[2], i = arr[3], j = arr[4], k = arr[5], u = arr[6], v = arr[7], w = arr[8]); }
#if LOGICAL_AXES > NUM_AXES
FI void set(const T (&arr)[LOGICAL_AXES]) { NUM_AXIS_CODE(x = arr[0], y = arr[1], z = arr[2], i = arr[3], j = arr[4], k = arr[5], u = arr[6], v = arr[7], w = arr[8]); }
@@ -743,7 +743,7 @@ struct XYZval {
// Absolute difference between two objects
FI constexpr XYZval diff(const XYZEval &rs) const { return NUM_AXIS_ARRAY(T(_ABS(x - rs.x)), T(_ABS(y - rs.y)), T(_ABS(z - rs.z)), T(_ABS(i - rs.i)), T(_ABS(j - rs.j)), T(_ABS(k - rs.k)), T(_ABS(u - rs.u)), T(_ABS(v - rs.v)), T(_ABS(w - rs.w)) ); }
- FI constexpr XYZval diff(const XYZval &rs) const { return NUM_AXIS_ARRAY(T(_ABS(x - rs.x)), T(_ABS(y - rs.y)), T(_ABS(z - rs.z)), T(_ABS(i - rs.i)), T(_ABS(j - rs.j)), T(_ABS(k - rs.k)), T(_ABS(u - rs.u)), T(_ABS(v - rs.v)), T(_ABS(w - rs.w)) ); }
+ FI constexpr XYZval diff(const XYZval &rs) const { return NUM_AXIS_ARRAY(T(_ABS(x - rs.x)), T(_ABS(y - rs.y)), T(_ABS(z - rs.z)), T(_ABS(i - rs.i)), T(_ABS(j - rs.j)), T(_ABS(k - rs.k)), T(_ABS(u - rs.u)), T(_ABS(v - rs.v)), T(_ABS(w - rs.w)) ); }
FI constexpr XYZval diff(const XYval &rs) const { return NUM_AXIS_ARRAY(T(_ABS(x - rs.x)), T(_ABS(y - rs.y)), z, i, j, k, u, v, w ); }
// Modifier operators
@@ -787,17 +787,17 @@ struct XYZEval {
FI void reset() { LOGICAL_AXIS_GANG(e =, x =, y =, z =, i =, j =, k =, u =, v =, w =) 0; }
// Setters taking struct types and arrays
- FI void set(const XYval pxy) { XY_CODE(x = pxy.x, y = pxy.y); }
- FI void set(const XYval pxy, const T pz) { XYZ_CODE(x = pxy.x, y = pxy.y, z = pz); }
- FI void set(const XYZval pxyz) { set(NUM_AXIS_ELEM_LC(pxyz)); }
- FI void set(const T (&arr)[NUM_AXES]) { NUM_AXIS_CODE(x = arr[0], y = arr[1], z = arr[2], i = arr[3], j = arr[4], k = arr[5], u = arr[6], v = arr[7], w = arr[8]); }
+ FI void set(const XYval &pxy) { XY_CODE(x = pxy.x, y = pxy.y); }
+ FI void set(const XYval &pxy, const T pz) { XYZ_CODE(x = pxy.x, y = pxy.y, z = pz); }
+ FI void set(const XYZval &pxyz) { set(NUM_AXIS_ELEM_LC(pxyz)); }
+ FI void set(const T (&arr)[NUM_AXES]) { NUM_AXIS_CODE(x = arr[0], y = arr[1], z = arr[2], i = arr[3], j = arr[4], k = arr[5], u = arr[6], v = arr[7], w = arr[8]); }
#if LOGICAL_AXES > NUM_AXES
- FI void set(const T (&arr)[LOGICAL_AXES]) { LOGICAL_AXIS_CODE(e = arr[LOGICAL_AXES-1], x = arr[0], y = arr[1], z = arr[2], i = arr[3], j = arr[4], k = arr[5], u = arr[6], v = arr[7], w = arr[8]); }
- FI void set(const XYval pxy, const T pz, const T pe) { set(pxy, pz); e = pe; }
- FI void set(const XYZval pxyz, const T pe) { set(pxyz); e = pe; }
- FI void set(LOGICAL_AXIS_ARGS_LC(const T)) { LOGICAL_AXIS_CODE(_e = e, a = x, b = y, c = z, _i = i, _j = j, _k = k, _u = u, _v = v, _w = w); }
+ FI void set(const T (&arr)[LOGICAL_AXES]) { LOGICAL_AXIS_CODE(e = arr[LOGICAL_AXES-1], x = arr[0], y = arr[1], z = arr[2], i = arr[3], j = arr[4], k = arr[5], u = arr[6], v = arr[7], w = arr[8]); }
+ FI void set(const XYval &pxy, const T pz, const T pe) { set(pxy, pz); e = pe; }
+ FI void set(const XYZval &pxyz, const T pe) { set(pxyz); e = pe; }
+ FI void set(LOGICAL_AXIS_ARGS_LC(const T)) { LOGICAL_AXIS_CODE(_e = e, a = x, b = y, c = z, _i = i, _j = j, _k = k, _u = u, _v = v, _w = w); }
#if DISTINCT_AXES > LOGICAL_AXES
- FI void set(const T (&arr)[DISTINCT_AXES]) { LOGICAL_AXIS_CODE(e = arr[LOGICAL_AXES-1], x = arr[0], y = arr[1], z = arr[2], i = arr[3], j = arr[4], k = arr[5], u = arr[6], v = arr[7], w = arr[8]); }
+ FI void set(const T (&arr)[DISTINCT_AXES]) { LOGICAL_AXIS_CODE(e = arr[LOGICAL_AXES-1], x = arr[0], y = arr[1], z = arr[2], i = arr[3], j = arr[4], k = arr[5], u = arr[6], v = arr[7], w = arr[8]); }
#endif
#endif
@@ -933,9 +933,9 @@ struct XYZarray {
};
FI void reset() { ZERO(data); }
- FI void set(const int n, const XYval p) { NUM_AXIS_CODE(x[n]=p.x, y[n]=p.y,,,,,,,); }
- FI void set(const int n, const XYZval p) { NUM_AXIS_CODE(x[n]=p.x, y[n]=p.y, z[n]=p.z, i[n]=p.i, j[n]=p.j, k[n]=p.k, u[n]=p.u, v[n]=p.v, w[n]=p.w ); }
- FI void set(const int n, const XYZEval p) { NUM_AXIS_CODE(x[n]=p.x, y[n]=p.y, z[n]=p.z, i[n]=p.i, j[n]=p.j, k[n]=p.k, u[n]=p.u, v[n]=p.v, w[n]=p.w ); }
+ FI void set(const int n, const XYval &p) { NUM_AXIS_CODE(x[n]=p.x, y[n]=p.y,,,,,,,); }
+ FI void set(const int n, const XYZval &p) { NUM_AXIS_CODE(x[n]=p.x, y[n]=p.y, z[n]=p.z, i[n]=p.i, j[n]=p.j, k[n]=p.k, u[n]=p.u, v[n]=p.v, w[n]=p.w ); }
+ FI void set(const int n, const XYZEval &p) { NUM_AXIS_CODE(x[n]=p.x, y[n]=p.y, z[n]=p.z, i[n]=p.i, j[n]=p.j, k[n]=p.k, u[n]=p.u, v[n]=p.v, w[n]=p.w ); }
// Setter for all individual args
FI void set(const int n OPTARGS_NUM(const T)) { NUM_AXIS_CODE(a[n] = x, b[n] = y, c[n] = z, _i[n] = i, _j[n] = j, _k[n] = k, _u[n] = u, _v[n] = v, _w[n] = w); }
@@ -981,9 +981,9 @@ struct XYZEarray {
};
FI void reset() { ZERO(data); }
- FI void set(const int n, const XYval p) { NUM_AXIS_CODE(x[n]=p.x, y[n]=p.y,,,,,,,); }
- FI void set(const int n, const XYZval p) { NUM_AXIS_CODE(x[n]=p.x, y[n]=p.y, z[n]=p.z, i[n]=p.i, j[n]=p.j, k[n]=p.k, u[n]=p.u, v[n]=p.v, w[n]=p.w ); }
- FI void set(const int n, const XYZEval p) { LOGICAL_AXIS_CODE(e[n]=p.e, x[n]=p.x, y[n]=p.y, z[n]=p.z, i[n]=p.i, j[n]=p.j, k[n]=p.k, u[n]=p.u, v[n]=p.v, w[n]=p.w ); }
+ FI void set(const int n, const XYval &p) { NUM_AXIS_CODE(x[n]=p.x, y[n]=p.y,,,,,,,); }
+ FI void set(const int n, const XYZval &p) { NUM_AXIS_CODE(x[n]=p.x, y[n]=p.y, z[n]=p.z, i[n]=p.i, j[n]=p.j, k[n]=p.k, u[n]=p.u, v[n]=p.v, w[n]=p.w ); }
+ FI void set(const int n, const XYZEval &p) { LOGICAL_AXIS_CODE(e[n]=p.e, x[n]=p.x, y[n]=p.y, z[n]=p.z, i[n]=p.i, j[n]=p.j, k[n]=p.k, u[n]=p.u, v[n]=p.v, w[n]=p.w ); }
// Setter for all individual args
FI void set(const int n OPTARGS_NUM(const T)) { NUM_AXIS_CODE(a[n] = x, b[n] = y, c[n] = z, _i[n] = i, _j[n] = j, _k[n] = k, _u[n] = u, _v[n] = v, _w[n] = w); }
diff --git a/Marlin/src/feature/fwretract.cpp b/Marlin/src/feature/fwretract.cpp
index fff2a1ed39..8944d2bd35 100644
--- a/Marlin/src/feature/fwretract.cpp
+++ b/Marlin/src/feature/fwretract.cpp
@@ -244,6 +244,7 @@ void FWRetract::M208_report() {
" M208 S", LINEAR_UNIT(settings.retract_recover_extra)
, " W", LINEAR_UNIT(settings.swap_retract_recover_extra)
, " F", LINEAR_UNIT(MMS_TO_MMM(settings.retract_recover_feedrate_mm_s))
+ , " R", LINEAR_UNIT(MMS_TO_MMM(settings.swap_retract_recover_feedrate_mm_s))
);
}
diff --git a/Marlin/src/feature/meatpack.cpp b/Marlin/src/feature/meatpack.cpp
index fe3dabe8da..3b762d4ded 100644
--- a/Marlin/src/feature/meatpack.cpp
+++ b/Marlin/src/feature/meatpack.cpp
@@ -169,9 +169,11 @@ void MeatPack::handle_command(const MeatPack_Command c) {
void MeatPack::report_state() {
// NOTE: if any configuration vars are added below, the outgoing sync text for host plugin
// should not contain the "PV' substring, as this is used to indicate protocol version
- SERIAL_ECHOPGM("[MP] " MeatPack_ProtocolVersion " ");
- serialprint_onoff(TEST(state, MPConfig_Bit_Active));
- SERIAL_ECHO(TEST(state, MPConfig_Bit_NoSpaces) ? F(" NSP\n") : F(" ESP\n"));
+ SERIAL_ECHO(
+ F("[MP] " MeatPack_ProtocolVersion " "),
+ ON_OFF(TEST(state, MPConfig_Bit_Active)),
+ TEST(state, MPConfig_Bit_NoSpaces) ? F(" NSP\n") : F(" ESP\n")
+ );
}
/**
diff --git a/Marlin/src/feature/tmc_util.cpp b/Marlin/src/feature/tmc_util.cpp
index 753cb003ff..d280b55854 100644
--- a/Marlin/src/feature/tmc_util.cpp
+++ b/Marlin/src/feature/tmc_util.cpp
@@ -72,7 +72,7 @@
#endif
;
#if ENABLED(TMC_DEBUG)
- #if HAS_TMCX1X0 || HAS_TMC220x
+ #if HAS_TMCX1X0_OR_2240 || HAS_TMC220x
uint8_t cs_actual;
#endif
#if HAS_STALLGUARD
@@ -142,6 +142,67 @@
#endif // HAS_TMCX1X0
+ #if HAS_DRIVER(TMC2240)
+
+ #if ENABLED(TMC_DEBUG)
+ static uint32_t get_pwm_scale(TMC2240Stepper &st) { return st.PWM_SCALE(); }
+ #endif
+
+ static TMC_driver_data get_driver_data(TMC2240Stepper &st) {
+ constexpr uint8_t OT_bp = 25, OTPW_bp = 26;
+ constexpr uint32_t S2G_bm = 0x18000000;
+ #if ENABLED(TMC_DEBUG)
+ constexpr uint16_t SG_RESULT_bm = 0x3FF; // 0:9
+ constexpr uint8_t STEALTH_bp = 14;
+ constexpr uint32_t CS_ACTUAL_bm = 0x1F0000; // 16:20
+ constexpr uint8_t STALL_GUARD_bp = 24;
+ constexpr uint8_t STST_bp = 31;
+ #endif
+ TMC_driver_data data;
+ const auto ds = data.drv_status = st.DRV_STATUS();
+ #ifdef __AVR__
+
+ // 8-bit optimization saves up to 70 bytes of PROGMEM per axis
+ uint8_t spart;
+ #if ENABLED(TMC_DEBUG)
+ data.sg_result = ds & SG_RESULT_bm;
+ spart = ds >> 8;
+ data.is_stealth = TEST(spart, STEALTH_bp - 8);
+ spart = ds >> 16;
+ data.cs_actual = spart & (CS_ACTUAL_bm >> 16);
+ #endif
+ spart = ds >> 24;
+ data.is_ot = TEST(spart, OT_bp - 24);
+ data.is_otpw = TEST(spart, OTPW_bp - 24);
+ data.is_s2g = !!(spart & (S2G_bm >> 24));
+ #if ENABLED(TMC_DEBUG)
+ data.is_stall = TEST(spart, STALL_GUARD_bp - 24);
+ data.is_standstill = TEST(spart, STST_bp - 24);
+ data.sg_result_reasonable = !data.is_standstill; // sg_result has no reasonable meaning while standstill
+ #endif
+
+ #else // !__AVR__
+
+ data.is_ot = TEST(ds, OT_bp);
+ data.is_otpw = TEST(ds, OTPW_bp);
+ data.is_s2g = !!(ds & S2G_bm);
+ #if ENABLED(TMC_DEBUG)
+ constexpr uint8_t CS_ACTUAL_sb = 16;
+ data.sg_result = ds & SG_RESULT_bm;
+ data.is_stealth = TEST(ds, STEALTH_bp);
+ data.cs_actual = (ds & CS_ACTUAL_bm) >> CS_ACTUAL_sb;
+ data.is_stall = TEST(ds, STALL_GUARD_bp);
+ data.is_standstill = TEST(ds, STST_bp);
+ data.sg_result_reasonable = !data.is_standstill; // sg_result has no reasonable meaning while standstill
+ #endif
+
+ #endif // !__AVR__
+
+ return data;
+ }
+
+ #endif // TMC2240
+
#if HAS_TMC220x
#if ENABLED(TMC_DEBUG)
@@ -237,7 +298,7 @@
st.printLabel();
SString<60> report(':', pwm_scale);
#if ENABLED(TMC_DEBUG)
- #if HAS_TMCX1X0 || HAS_TMC220x
+ #if HAS_TMCX1X0_OR_2240 || HAS_TMC220x
report.append('/', data.cs_actual);
#endif
#if HAS_STALLGUARD
@@ -514,14 +575,35 @@
template
static void print_vsense(TMC &st) { SERIAL_ECHO(st.vsense() ? F("1=.18") : F("0=.325")); }
+ #if HAS_DRIVER(TMC2160)
+ template
+ void print_vsense(TMCMarlin &) { }
+ #endif
+ #if HAS_DRIVER(TMC5160)
+ template
+ void print_vsense(TMCMarlin &) { }
+ #endif
+ #if HAS_DRIVER(TMC2240)
+ template
+ void print_vsense(TMCMarlin &) { }
+ #endif
+
+ template
+ void print_cs_actual(TMC &st) { SERIAL_ECHO(st.cs_actual(), F("/31")); }
+ #if HAS_DRIVER(TMC2240)
+ template
+ void print_cs_actual(TMCMarlin &) { }
+ #endif
+
+ static void print_true_or_false(const bool tf) { SERIAL_ECHO(TRUE_FALSE(tf)); }
#if HAS_DRIVER(TMC2130) || HAS_DRIVER(TMC5130)
static void _tmc_status(TMC2130Stepper &st, const TMC_debug_enum i) {
switch (i) {
case TMC_PWM_SCALE: SERIAL_ECHO(st.PWM_SCALE()); break;
case TMC_SGT: SERIAL_ECHO(st.sgt()); break;
- case TMC_STEALTHCHOP: serialprint_truefalse(st.en_pwm_mode()); break;
- case TMC_INTERPOLATE: serialprint_truefalse(st.intpol()); break;
+ case TMC_STEALTHCHOP: print_true_or_false(st.en_pwm_mode()); break;
+ case TMC_INTERPOLATE: print_true_or_false(st.intpol()); break;
default: break;
}
}
@@ -539,17 +621,11 @@
#endif
#if HAS_DRIVER(TMC2160) || HAS_DRIVER(TMC5160)
- template
- void print_vsense(TMCMarlin &) { }
-
- template
- void print_vsense(TMCMarlin &) { }
-
static void _tmc_status(TMC2160Stepper &st, const TMC_debug_enum i) {
switch (i) {
case TMC_PWM_SCALE: SERIAL_ECHO(st.PWM_SCALE()); break;
case TMC_SGT: SERIAL_ECHO(st.sgt()); break;
- case TMC_STEALTHCHOP: serialprint_truefalse(st.en_pwm_mode()); break;
+ case TMC_STEALTHCHOP: print_true_or_false(st.en_pwm_mode()); break;
case TMC_GLOBAL_SCALER:
{
const uint16_t value = st.GLOBAL_SCALER();
@@ -557,7 +633,7 @@
SERIAL_ECHOPGM("/256");
}
break;
- case TMC_INTERPOLATE: serialprint_truefalse(st.intpol()); break;
+ case TMC_INTERPOLATE: print_true_or_false(st.intpol()); break;
default: break;
}
}
@@ -571,8 +647,8 @@
case TMC_PWM_SCALE_AUTO: SERIAL_ECHO(st.pwm_scale_auto()); break;
case TMC_PWM_OFS_AUTO: SERIAL_ECHO(st.pwm_ofs_auto()); break;
case TMC_PWM_GRAD_AUTO: SERIAL_ECHO(st.pwm_grad_auto()); break;
- case TMC_STEALTHCHOP: serialprint_truefalse(st.stealth()); break;
- case TMC_INTERPOLATE: serialprint_truefalse(st.intpol()); break;
+ case TMC_STEALTHCHOP: print_true_or_false(st.stealth()); break;
+ case TMC_INTERPOLATE: print_true_or_false(st.intpol()); break;
default: break;
}
}
@@ -615,22 +691,52 @@
#endif // HAS_TMC220x
+ #if HAS_DRIVER(TMC2240)
+ static void _tmc_parse_drv_status(TMC2240Stepper, const TMC_drv_status_enum) { }
+ static void _tmc_status(TMC2240Stepper &st, const TMC_debug_enum i) {
+ switch (i) {
+ case TMC_PWM_SCALE_SUM: SERIAL_ECHO(st.pwm_scale_sum()); break;
+ case TMC_PWM_SCALE_AUTO: SERIAL_ECHO(st.pwm_scale_auto()); break;
+ case TMC_PWM_OFS_AUTO: SERIAL_ECHO(st.pwm_ofs_auto()); break;
+ case TMC_PWM_GRAD_AUTO: SERIAL_ECHO(st.pwm_grad_auto()); break;
+ case TMC_STEALTHCHOP: print_true_or_false(st.stealth()); break;
+ case TMC_INTERPOLATE: print_true_or_false(st.intpol()); break;
+ default: break;
+ }
+ }
+ #endif
+
#if HAS_DRIVER(TMC2660)
static void _tmc_parse_drv_status(TMC2660Stepper, const TMC_drv_status_enum) { }
static void _tmc_status(TMC2660Stepper &st, const TMC_debug_enum i) {
switch (i) {
- case TMC_INTERPOLATE: serialprint_truefalse(st.intpol()); break;
+ case TMC_INTERPOLATE: print_true_or_false(st.intpol()); break;
default: break;
}
}
#endif
+ template
+ void print_tstep(TMC &st) {
+ const uint32_t tstep_value = st.TSTEP();
+ if (tstep_value != 0xFFFFF)
+ SERIAL_ECHO(tstep_value);
+ else
+ SERIAL_ECHOPGM("max");
+ }
+ void print_tstep(TMC2660Stepper &st) { }
+
+ template
+ void print_blank_time(TMC &st) { SERIAL_ECHO(st.blank_time()); }
+ template
+ void print_blank_time(TMCMarlin &) { }
+
template
static void tmc_status(TMC &st, const TMC_debug_enum i) {
SERIAL_CHAR('\t');
switch (i) {
case TMC_CODES: st.printLabel(); break;
- case TMC_ENABLED: serialprint_truefalse(st.isEnabled()); break;
+ case TMC_ENABLED: print_true_or_false(st.isEnabled()); break;
case TMC_CURRENT: SERIAL_ECHO(st.getMilliamps()); break;
case TMC_RMS_CURRENT: SERIAL_ECHO(st.rms_current()); break;
case TMC_MAX_CURRENT: SERIAL_ECHO(p_float_t(st.rms_current() * 1.41, 0)); break;
@@ -642,16 +748,10 @@
SERIAL_ECHO(st.ihold());
SERIAL_ECHOPGM("/31");
break;
- case TMC_CS_ACTUAL:
- SERIAL_ECHO(st.cs_actual());
- SERIAL_ECHOPGM("/31");
- break;
+ case TMC_CS_ACTUAL: print_cs_actual(st); break;
case TMC_VSENSE: print_vsense(st); break;
case TMC_MICROSTEPS: SERIAL_ECHO(st.microsteps()); break;
- case TMC_TSTEP: {
- const uint32_t tstep_value = st.TSTEP();
- if (tstep_value != 0xFFFFF) SERIAL_ECHO(tstep_value); else SERIAL_ECHOPGM("max");
- } break;
+ case TMC_TSTEP: print_tstep(st); break;
#if ENABLED(HYBRID_THRESHOLD)
case TMC_TPWMTHRS: SERIAL_ECHO(uint32_t(st.TPWMTHRS())); break;
case TMC_TPWMTHRS_MMS: {
@@ -659,12 +759,12 @@
if (tpwmthrs_val) SERIAL_ECHO(tpwmthrs_val); else SERIAL_CHAR('-');
} break;
#endif
- case TMC_OTPW: serialprint_truefalse(st.otpw()); break;
+ case TMC_OTPW: print_true_or_false(st.otpw()); break;
#if ENABLED(MONITOR_DRIVER_STATUS)
- case TMC_OTPW_TRIGGERED: serialprint_truefalse(st.getOTPW()); break;
+ case TMC_OTPW_TRIGGERED: print_true_or_false(st.getOTPW()); break;
#endif
case TMC_TOFF: SERIAL_ECHO(st.toff()); break;
- case TMC_TBL: SERIAL_ECHO(st.blank_time()); break;
+ case TMC_TBL: print_blank_time(st); break;
case TMC_HEND: SERIAL_ECHO(st.hysteresis_end()); break;
case TMC_HSTRT: SERIAL_ECHO(st.hysteresis_start()); break;
case TMC_MSCNT: SERIAL_ECHO(st.get_microstep_counter()); break;
@@ -678,7 +778,7 @@
SERIAL_CHAR('\t');
switch (i) {
case TMC_CODES: st.printLabel(); break;
- case TMC_ENABLED: serialprint_truefalse(st.isEnabled()); break;
+ case TMC_ENABLED: print_true_or_false(st.isEnabled()); break;
case TMC_CURRENT: SERIAL_ECHO(st.getMilliamps()); break;
case TMC_RMS_CURRENT: SERIAL_ECHO(st.rms_current()); break;
case TMC_MAX_CURRENT: SERIAL_ECHO(p_float_t(st.rms_current() * 1.41, 0)); break;
@@ -688,14 +788,14 @@
break;
case TMC_VSENSE: SERIAL_ECHO(st.vsense() ? F("1=.165") : F("0=.310")); break;
case TMC_MICROSTEPS: SERIAL_ECHO(st.microsteps()); break;
- //case TMC_OTPW: serialprint_truefalse(st.otpw()); break;
- //case TMC_OTPW_TRIGGERED: serialprint_truefalse(st.getOTPW()); break;
+ //case TMC_OTPW: print_true_or_false(st.otpw()); break;
+ //case TMC_OTPW_TRIGGERED: print_true_or_false(st.getOTPW()); break;
case TMC_SGT: SERIAL_ECHO(st.sgt()); break;
case TMC_TOFF: SERIAL_ECHO(st.toff()); break;
- case TMC_TBL: SERIAL_ECHO(st.blank_time()); break;
+ case TMC_TBL: print_blank_time(st); break;
case TMC_HEND: SERIAL_ECHO(st.hysteresis_end()); break;
case TMC_HSTRT: SERIAL_ECHO(st.hysteresis_start()); break;
- default: break;
+ default: _tmc_status(st, i); break;
}
}
#endif
@@ -855,10 +955,10 @@
TMC_REPORT("Stallguard thrs", TMC_SGT);
TMC_REPORT("uStep count", TMC_MSCNT);
DRV_REPORT("DRVSTATUS", TMC_DRV_CODES);
- #if HAS_TMCX1X0 || HAS_TMC220x
+ #if HAS_TMCX1X0_OR_2240 || HAS_TMC220x
DRV_REPORT("sg_result", TMC_SG_RESULT);
#endif
- #if HAS_TMCX1X0
+ #if HAS_TMCX1X0_OR_2240
DRV_REPORT("stallguard", TMC_STALLGUARD);
DRV_REPORT("fsactive", TMC_FSACTIVE);
#endif
@@ -883,21 +983,22 @@
#define PRINT_TMC_REGISTER(REG_CASE) case TMC_GET_##REG_CASE: print_hex_long(st.REG_CASE(), ':'); break
- #if HAS_TMCX1X0
- static void tmc_get_ic_registers(TMC2130Stepper &st, const TMC_get_registers_enum i) {
- switch (i) {
- PRINT_TMC_REGISTER(TCOOLTHRS);
- PRINT_TMC_REGISTER(THIGH);
- PRINT_TMC_REGISTER(COOLCONF);
- default: SERIAL_CHAR('\t'); break;
- }
- }
- #endif
- #if HAS_TMC220x
- static void tmc_get_ic_registers(TMC2208Stepper, const TMC_get_registers_enum) { SERIAL_CHAR('\t'); }
- #endif
-
#if HAS_TRINAMIC_CONFIG
+
+ template
+ static void tmc_get_ic_registers(TMC &, const TMC_get_registers_enum) { SERIAL_CHAR('\t'); }
+
+ #if HAS_TMCX1X0
+ static void tmc_get_ic_registers(TMC2130Stepper &st, const TMC_get_registers_enum i) {
+ switch (i) {
+ PRINT_TMC_REGISTER(TCOOLTHRS);
+ PRINT_TMC_REGISTER(THIGH);
+ PRINT_TMC_REGISTER(COOLCONF);
+ default: SERIAL_CHAR('\t'); break;
+ }
+ }
+ #endif
+
template
static void tmc_get_registers(TMC &st, const TMC_get_registers_enum i) {
switch (i) {
@@ -917,7 +1018,8 @@
}
SERIAL_CHAR('\t');
}
- #endif
+ #endif // HAS_TRINAMIC_CONFIG
+
#if HAS_DRIVER(TMC2660)
template
static void tmc_get_registers(TMCMarlin &st, const TMC_get_registers_enum i) {
@@ -1025,11 +1127,26 @@
st.TCOOLTHRS(0);
}
+ bool tmc_enable_stallguard(TMC2240Stepper &st) {
+ const bool stealthchop_was_enabled = st.en_pwm_mode();
+
+ st.TCOOLTHRS(0xFFFFF);
+ st.en_pwm_mode(false);
+ st.diag0_stall(true);
+
+ return stealthchop_was_enabled;
+ }
+ void tmc_disable_stallguard(TMC2240Stepper &st, const bool restore_stealth) {
+ st.TCOOLTHRS(0);
+ st.en_pwm_mode(restore_stealth);
+ st.diag0_stall(false);
+ }
+
bool tmc_enable_stallguard(TMC2660Stepper) {
// TODO
return false;
}
- void tmc_disable_stallguard(TMC2660Stepper, const bool) {};
+ void tmc_disable_stallguard(TMC2660Stepper, const bool) { }
#endif // USE_SENSORLESS
diff --git a/Marlin/src/feature/tmc_util.h b/Marlin/src/feature/tmc_util.h
index 4cac2969a7..99d9dc4bc1 100644
--- a/Marlin/src/feature/tmc_util.h
+++ b/Marlin/src/feature/tmc_util.h
@@ -95,7 +95,7 @@ class TMCMarlin : public TMC, public TMCStorage {
TMC(CS, RS, pinMOSI, pinMISO, pinSCK)
{}
TMCMarlin(const uint16_t CS, const float RS, const uint16_t pinMOSI, const uint16_t pinMISO, const uint16_t pinSCK, const uint8_t axis_chain_index) :
- TMC(CS, RS, pinMOSI, pinMISO, pinSCK, axis_chain_index)
+ TMC(CS, RS, pinMOSI, pinMISO, pinSCK, axis_chain_index)
{}
uint16_t rms_current() { return TMC::rms_current(); }
void rms_current(uint16_t mA) {
@@ -124,7 +124,7 @@ class TMCMarlin : public TMC, public TMCStorage {
#if ENABLED(HYBRID_THRESHOLD)
uint32_t get_pwm_thrs() {
- return _tmc_thrs(this->microsteps(), this->TPWMTHRS(), planner.settings.axis_steps_per_mm[AXIS_ID]);
+ return _tmc_thrs(this->microsteps(), TMC::TPWMTHRS(), planner.settings.axis_steps_per_mm[AXIS_ID]);
}
void set_pwm_thrs(const uint32_t thrs) {
TMC::TPWMTHRS(_tmc_thrs(this->microsteps(), thrs, planner.settings.axis_steps_per_mm[AXIS_ID]));
@@ -197,7 +197,7 @@ class TMCMarlin : public TMC220
#if ENABLED(HYBRID_THRESHOLD)
uint32_t get_pwm_thrs() {
- return _tmc_thrs(this->microsteps(), this->TPWMTHRS(), planner.settings.axis_steps_per_mm[AXIS_ID]);
+ return _tmc_thrs(this->microsteps(), TMC2208Stepper::TPWMTHRS(), planner.settings.axis_steps_per_mm[AXIS_ID]);
}
void set_pwm_thrs(const uint32_t thrs) {
TMC2208Stepper::TPWMTHRS(_tmc_thrs(this->microsteps(), thrs, planner.settings.axis_steps_per_mm[AXIS_ID]));
@@ -249,13 +249,14 @@ class TMCMarlin : public TMC220
#if ENABLED(HYBRID_THRESHOLD)
uint32_t get_pwm_thrs() {
- return _tmc_thrs(this->microsteps(), this->TPWMTHRS(), planner.settings.axis_steps_per_mm[AXIS_ID]);
+ return _tmc_thrs(this->microsteps(), TMC2209Stepper::TPWMTHRS(), planner.settings.axis_steps_per_mm[AXIS_ID]);
}
void set_pwm_thrs(const uint32_t thrs) {
TMC2209Stepper::TPWMTHRS(_tmc_thrs(this->microsteps(), thrs, planner.settings.axis_steps_per_mm[AXIS_ID]));
TERN_(HAS_MARLINUI_MENU, this->stored.hybrid_thrs = thrs);
}
#endif
+
#if USE_SENSORLESS
int16_t homing_threshold() { return TMC2209Stepper::SGTHRS(); }
void homing_threshold(int16_t sgt_val) {
@@ -278,6 +279,74 @@ class TMCMarlin : public TMC220
sgt_max = 255;
};
+template
+class TMCMarlin : public TMC2240Stepper, public TMCStorage {
+ public:
+ TMCMarlin(const uint16_t cs_pin, const uint8_t axis_chain_index) :
+ TMC2240Stepper(cs_pin, axis_chain_index)
+ {}
+ TMCMarlin(const uint16_t CS, const uint16_t pinMOSI, const uint16_t pinMISO, const uint16_t pinSCK, const uint8_t axis_chain_index) :
+ TMC2240Stepper(CS, pinMOSI, pinMISO, pinSCK, axis_chain_index )
+ {}
+
+ //uint8_t get_address() { return slave_address; }
+ uint16_t get_microstep_counter() { return microsteps(); }
+
+ uint16_t rms_current() { return TMC2240Stepper::rms_current(); }
+ void rms_current(const uint16_t mA) {
+ this->val_mA = mA;
+ TMC2240Stepper::rms_current(mA);
+ }
+ void rms_current(const uint16_t mA, const float mult) {
+ this->val_mA = mA;
+ TMC2240Stepper::rms_current(mA, mult);
+ }
+
+ #if HAS_STEALTHCHOP
+ bool get_stealthChop() { return this->en_pwm_mode(); }
+ bool get_stored_stealthChop() { return this->stored.stealthChop_enabled; }
+ void refresh_stepping_mode() { this->en_pwm_mode(this->stored.stealthChop_enabled); }
+ void set_stealthChop(const bool stch) { this->stored.stealthChop_enabled = stch; refresh_stepping_mode(); }
+ bool toggle_stepping_mode() { set_stealthChop(!this->stored.stealthChop_enabled); return get_stealthChop(); }
+ #endif
+
+ void set_chopper_times(const chopper_timing_t &ct) {
+ TMC2240Stepper::toff(ct.toff);
+ TMC2240Stepper::hysteresis_end(ct.hend);
+ TMC2240Stepper::hysteresis_start(ct.hstrt);
+ }
+
+ #if ENABLED(HYBRID_THRESHOLD)
+ uint32_t get_pwm_thrs() {
+ return _tmc_thrs(this->microsteps(), TMC2240Stepper::TPWMTHRS(), planner.settings.axis_steps_per_mm[AXIS_ID]);
+ }
+ void set_pwm_thrs(const uint32_t thrs) {
+ TMC2240Stepper::TPWMTHRS(_tmc_thrs(this->microsteps(), thrs, planner.settings.axis_steps_per_mm[AXIS_ID]));
+ TERN_(HAS_MARLINUI_MENU, this->stored.hybrid_thrs = thrs);
+ }
+ #endif
+
+ #if USE_SENSORLESS
+ int16_t homing_threshold() { return TMC2240Stepper::sgt(); }
+ void homing_threshold(int16_t sgt_val) {
+ sgt_val = (int16_t)constrain(sgt_val, sgt_min, sgt_max);
+ TMC2240Stepper::sgt(sgt_val);
+ TERN_(HAS_MARLINUI_MENU, this->stored.homing_thrs = sgt_val);
+ }
+ #endif
+
+ void refresh_stepper_current() { rms_current(this->val_mA); }
+ #if ENABLED(HYBRID_THRESHOLD)
+ void refresh_hybrid_thrs() { set_pwm_thrs(this->stored.hybrid_thrs); }
+ #endif
+ #if USE_SENSORLESS
+ void refresh_homing_thrs() { homing_threshold(this->stored.homing_thrs); }
+ #endif
+
+ static constexpr int8_t sgt_min = -64,
+ sgt_max = 63;
+};
+
template
class TMCMarlin : public TMC2660Stepper, public TMCStorage {
public:
@@ -353,6 +422,9 @@ void test_tmc_connection(LOGICAL_AXIS_DECL_LC(const bool, true));
bool tmc_enable_stallguard(TMC2209Stepper &st);
void tmc_disable_stallguard(TMC2209Stepper &st, const bool restore_stealth);
+ bool tmc_enable_stallguard(TMC2240Stepper &st);
+ void tmc_disable_stallguard(TMC2240Stepper &st, const bool restore_stealth);
+
bool tmc_enable_stallguard(TMC2660Stepper);
void tmc_disable_stallguard(TMC2660Stepper, const bool);
diff --git a/Marlin/src/gcode/bedlevel/G26.cpp b/Marlin/src/gcode/bedlevel/G26.cpp
index 8c26ca4e8f..94e9b82506 100644
--- a/Marlin/src/gcode/bedlevel/G26.cpp
+++ b/Marlin/src/gcode/bedlevel/G26.cpp
@@ -268,8 +268,10 @@ typedef struct {
// If the end point of the line is closer to the nozzle, flip the direction,
// moving from the end to the start. On very small lines the optimization isn't worth it.
- if (dist_end < dist_start && (INTERSECTION_CIRCLE_RADIUS) < ABS(line_length))
- return print_line_from_here_to_there(e, s);
+ if (dist_end < dist_start && (INTERSECTION_CIRCLE_RADIUS) < ABS(line_length)) {
+ print_line_from_here_to_there(e, s);
+ return;
+ }
// Decide whether to retract & lift
if (dist_start > 2.0) retract_lift_move(s);
diff --git a/Marlin/src/gcode/bedlevel/M420.cpp b/Marlin/src/gcode/bedlevel/M420.cpp
index 8711bab9c8..7903cc623c 100644
--- a/Marlin/src/gcode/bedlevel/M420.cpp
+++ b/Marlin/src/gcode/bedlevel/M420.cpp
@@ -228,9 +228,7 @@ void GcodeSuite::M420() {
if (to_enable && !planner.leveling_active)
SERIAL_ERROR_MSG(STR_ERR_M420_FAILED);
- SERIAL_ECHO_START();
- SERIAL_ECHOPGM("Bed Leveling ");
- serialprintln_onoff(planner.leveling_active);
+ SERIAL_ECHO_MSG("Bed Leveling ", ON_OFF(planner.leveling_active));
#if ENABLED(ENABLE_LEVELING_FADE_HEIGHT)
SERIAL_ECHO_START();
@@ -252,14 +250,13 @@ void GcodeSuite::M420_report(const bool forReplay/*=true*/) {
report_heading_etc(forReplay, F(
TERN(MESH_BED_LEVELING, "Mesh Bed Leveling", TERN(AUTO_BED_LEVELING_UBL, "Unified Bed Leveling", "Auto Bed Leveling"))
));
- SERIAL_ECHO(
+ SERIAL_ECHOLN(
F(" M420 S"), planner.leveling_active
#if ENABLED(ENABLE_LEVELING_FADE_HEIGHT)
, FPSTR(SP_Z_STR), LINEAR_UNIT(planner.z_fade_height)
#endif
- , F(" ; Leveling ")
+ , F(" ; Leveling "), ON_OFF(planner.leveling_active)
);
- serialprintln_onoff(planner.leveling_active);
}
#endif // HAS_LEVELING
diff --git a/Marlin/src/gcode/bedlevel/mbl/G29.cpp b/Marlin/src/gcode/bedlevel/mbl/G29.cpp
index be0e5d7f18..4bd444c5a3 100644
--- a/Marlin/src/gcode/bedlevel/mbl/G29.cpp
+++ b/Marlin/src/gcode/bedlevel/mbl/G29.cpp
@@ -99,7 +99,7 @@ void GcodeSuite::G29() {
case MeshReport:
SERIAL_ECHOPGM("Mesh Bed Leveling ");
if (leveling_is_valid()) {
- serialprintln_onoff(planner.leveling_active);
+ SERIAL_ECHOLN(ON_OFF(planner.leveling_active));
bedlevel.report_mesh();
}
else
diff --git a/Marlin/src/gcode/calibrate/G33.cpp b/Marlin/src/gcode/calibrate/G33.cpp
index 395da649d3..76bf250346 100644
--- a/Marlin/src/gcode/calibrate/G33.cpp
+++ b/Marlin/src/gcode/calibrate/G33.cpp
@@ -598,7 +598,7 @@ void GcodeSuite::G33() {
LOOP_NUM_AXES(axis) delta_tower_angle_trim[axis] -= a_sum / 3.0f;
}
- // adjust delta_height and endstops by the max amount
+ // Adjust delta_height and endstops by the max amount
const float z_temp = _MAX(delta_endstop_adj.a, delta_endstop_adj.b, delta_endstop_adj.c);
delta_height -= z_temp;
LOOP_NUM_AXES(axis) delta_endstop_adj[axis] -= z_temp;
@@ -606,7 +606,7 @@ void GcodeSuite::G33() {
recalc_delta_settings();
NOMORE(zero_std_dev_min, zero_std_dev);
- // print report
+ // Print report
if (verbose_level == 3 || verbose_level == 0) {
print_calibration_results(z_at_pt, _tower_results, _opposite_results);
diff --git a/Marlin/src/gcode/config/M200-M205.cpp b/Marlin/src/gcode/config/M200-M205.cpp
index a55813aeae..7ad7de8617 100644
--- a/Marlin/src/gcode/config/M200-M205.cpp
+++ b/Marlin/src/gcode/config/M200-M205.cpp
@@ -124,8 +124,13 @@
* S : Speed factor percentage.
*/
void GcodeSuite::M201() {
- if (!parser.seen("T" STR_AXES_LOGICAL TERN_(XY_FREQUENCY_LIMIT, "FS")))
+ if (!parser.seen("T" STR_AXES_LOGICAL
+ #ifdef XY_FREQUENCY_LIMIT
+ "FS"
+ #endif
+ )) {
return M201_report();
+ }
const int8_t target_extruder = get_target_extruder_from_command();
if (target_extruder < 0) return;
@@ -147,7 +152,11 @@ void GcodeSuite::M201_report(const bool forReplay/*=true*/) {
TERN_(MARLIN_SMALL_BUILD, return);
report_heading_etc(forReplay, F(STR_MAX_ACCELERATION));
+
+ bool eol = false;
+
#if NUM_AXES
+ eol = true;
SERIAL_ECHOPGM_P(
LIST_N(DOUBLE(NUM_AXES),
PSTR(" M201 X"), LINEAR_UNIT(planner.settings.max_acceleration_mm_per_s2[X_AXIS]),
@@ -164,13 +173,18 @@ void GcodeSuite::M201_report(const bool forReplay/*=true*/) {
#endif
#if HAS_EXTRUDERS && DISABLED(DISTINCT_E_FACTORS)
+ eol = true;
SERIAL_ECHOPGM_P(SP_E_STR, VOLUMETRIC_UNIT(planner.settings.max_acceleration_mm_per_s2[E_AXIS]));
#endif
- #if NUM_AXES || (HAS_EXTRUDERS && DISABLED(DISTINCT_E_FACTORS))
- SERIAL_EOL();
+ #ifdef XY_FREQUENCY_LIMIT
+ eol = true;
+ SERIAL_ECHOPGM_P(PSTR(" F"), planner.xy_freq_limit_hz);
+ SERIAL_ECHOPGM_P(PSTR(" S"), (planner.xy_freq_min_speed_factor * 100));
#endif
+ if (eol) SERIAL_EOL();
+
#if ENABLED(DISTINCT_E_FACTORS)
for (uint8_t i = 0; i < E_STEPPERS; ++i) {
report_echo_start(forReplay);
@@ -205,7 +219,11 @@ void GcodeSuite::M203_report(const bool forReplay/*=true*/) {
TERN_(MARLIN_SMALL_BUILD, return);
report_heading_etc(forReplay, F(STR_MAX_FEEDRATES));
+
+ bool eol = false;
+
#if NUM_AXES
+ eol = true;
SERIAL_ECHOPGM_P(
LIST_N(DOUBLE(NUM_AXES),
PSTR(" M203 X"), LINEAR_UNIT(planner.settings.max_feedrate_mm_s[X_AXIS]),
@@ -222,12 +240,11 @@ void GcodeSuite::M203_report(const bool forReplay/*=true*/) {
#endif
#if HAS_EXTRUDERS && DISABLED(DISTINCT_E_FACTORS)
+ eol = true;
SERIAL_ECHOPGM_P(SP_E_STR, VOLUMETRIC_UNIT(planner.settings.max_feedrate_mm_s[E_AXIS]));
#endif
- #if NUM_AXES || (HAS_EXTRUDERS && DISABLED(DISTINCT_E_FACTORS))
- SERIAL_EOL();
- #endif
+ if (eol) SERIAL_EOL();
#if ENABLED(DISTINCT_E_FACTORS)
for (uint8_t i = 0; i < E_STEPPERS; ++i) {
diff --git a/Marlin/src/gcode/control/M211.cpp b/Marlin/src/gcode/control/M211.cpp
index 471ca6c448..e51a9d5297 100644
--- a/Marlin/src/gcode/control/M211.cpp
+++ b/Marlin/src/gcode/control/M211.cpp
@@ -43,8 +43,7 @@ void GcodeSuite::M211_report(const bool forReplay/*=true*/) {
TERN_(MARLIN_SMALL_BUILD, return);
report_heading_etc(forReplay, F(STR_SOFT_ENDSTOPS));
- SERIAL_ECHOPGM(" M211 S", AS_DIGIT(soft_endstop._enabled), " ; ");
- serialprintln_onoff(soft_endstop._enabled);
+ SERIAL_ECHOLNPGM(" M211 S", AS_DIGIT(soft_endstop._enabled), " ; ", ON_OFF(soft_endstop._enabled));
report_echo_start(forReplay);
const xyz_pos_t l_soft_min = soft_endstop.min.asLogical(),
diff --git a/Marlin/src/gcode/control/M605.cpp b/Marlin/src/gcode/control/M605.cpp
index 56d7594b08..4679422dfb 100644
--- a/Marlin/src/gcode/control/M605.cpp
+++ b/Marlin/src/gcode/control/M605.cpp
@@ -173,8 +173,7 @@
set_duplication_enabled(ena && (duplication_e_mask >= 3));
}
SERIAL_ECHO_START();
- SERIAL_ECHOPGM(STR_DUPLICATION_MODE);
- serialprint_onoff(extruder_duplication_enabled);
+ SERIAL_ECHOPGM(STR_DUPLICATION_MODE, ON_OFF(extruder_duplication_enabled));
if (ena) {
SERIAL_ECHOPGM(" ( ");
HOTEND_LOOP() if (TEST(duplication_e_mask, e)) { SERIAL_ECHO(e); SERIAL_CHAR(' '); }
diff --git a/Marlin/src/gcode/feature/advance/M900.cpp b/Marlin/src/gcode/feature/advance/M900.cpp
index dc59b5bc90..7b92cad9d2 100644
--- a/Marlin/src/gcode/feature/advance/M900.cpp
+++ b/Marlin/src/gcode/feature/advance/M900.cpp
@@ -29,7 +29,7 @@
#include "../../../module/stepper.h"
#if ENABLED(ADVANCE_K_EXTRA)
- float other_extruder_advance_K[DISTINCT_E];
+ float other_extruder_advance_K[EXTRUDERS];
uint8_t lin_adv_slot = 0;
#endif
@@ -62,17 +62,17 @@ void GcodeSuite::M900() {
}
#endif
- float &kref = planner.extruder_advance_K[E_INDEX_N(tool_index)], newK = kref;
- const float oldK = newK;
+ const float oldK = planner.get_advance_k(tool_index);
+ float newK = oldK;
#if ENABLED(SMOOTH_LIN_ADVANCE)
- const float oldU = stepper.get_advance_tau(E_INDEX_N(tool_index));
+ const float oldU = stepper.get_advance_tau(tool_index);
float newU = oldU;
#endif
#if ENABLED(ADVANCE_K_EXTRA)
- float &lref = other_extruder_advance_K[E_INDEX_N(tool_index)];
+ float &lref = other_extruder_advance_K[tool_index];
const bool old_slot = TEST(lin_adv_slot, tool_index), // Each tool uses 1 bit to store its current slot (0 or 1)
new_slot = parser.boolval('S', old_slot); // The new slot (0 or 1) to set for the tool (default = no change)
@@ -125,9 +125,9 @@ void GcodeSuite::M900() {
if (newK != oldK || TERN0(SMOOTH_LIN_ADVANCE, newU != oldU)) {
planner.synchronize();
- if (newK != oldK) kref = newK;
+ if (newK != oldK) planner.set_advance_k(newK, tool_index);
#if ENABLED(SMOOTH_LIN_ADVANCE)
- if (newU != oldU) stepper.set_advance_tau(newU);
+ if (newU != oldU) stepper.set_advance_tau(newU, tool_index);
#endif
}
@@ -136,11 +136,11 @@ void GcodeSuite::M900() {
#if ENABLED(ADVANCE_K_EXTRA)
#if DISABLED(DISTINCT_E_FACTORS)
- SERIAL_ECHOLNPGM("Advance S", new_slot, " K", kref, "(S", !new_slot, " K", lref, ")");
+ SERIAL_ECHOLNPGM("Advance S", new_slot, " K", newK, "(S", !new_slot, " K", lref, ")");
#else
EXTRUDER_LOOP() {
const bool slot = TEST(lin_adv_slot, e);
- SERIAL_ECHOLNPGM("Advance T", e, " S", slot, " K", planner.extruder_advance_K[e],
+ SERIAL_ECHOLNPGM("Advance T", e, " S", slot, " K", planner.get_advance_k(e),
"(S", !slot, " K", other_extruder_advance_K[e], ")");
}
#endif
@@ -149,14 +149,14 @@ void GcodeSuite::M900() {
SERIAL_ECHO_START();
#if DISABLED(DISTINCT_E_FACTORS)
- SERIAL_ECHOPGM("Advance K=", planner.extruder_advance_K[0]);
+ SERIAL_ECHOPGM("Advance K=", planner.get_advance_k());
#if ENABLED(SMOOTH_LIN_ADVANCE)
SERIAL_ECHOPGM(" TAU=", stepper.get_advance_tau());
#endif
SERIAL_EOL();
#else
SERIAL_ECHOPGM("Advance K");
- EXTRUDER_LOOP() SERIAL_ECHO(C(' '), C('0' + e), C(':'), planner.extruder_advance_K[e]);
+ EXTRUDER_LOOP() SERIAL_ECHO(C(' '), C('0' + e), C(':'), planner.get_advance_k(e));
SERIAL_EOL();
#if ENABLED(SMOOTH_LIN_ADVANCE)
SERIAL_ECHOPGM("Advance TAU");
@@ -174,23 +174,21 @@ void GcodeSuite::M900_report(const bool forReplay/*=true*/) {
TERN_(MARLIN_SMALL_BUILD, return);
report_heading(forReplay, F(STR_LINEAR_ADVANCE));
- #if DISABLED(DISTINCT_E_FACTORS)
+ DISTINCT_E_LOOP() {
report_echo_start(forReplay);
- SERIAL_ECHOPGM(" M900 K", planner.extruder_advance_K[0]);
+ SERIAL_ECHOPGM(
+ #if ENABLED(DISTINCT_E_FACTORS)
+ " M900 T", e, " K"
+ #else
+ " M900 K"
+ #endif
+ );
+ SERIAL_ECHO(planner.get_advance_k(e));
#if ENABLED(SMOOTH_LIN_ADVANCE)
- SERIAL_ECHOPGM(" M900 U", stepper.get_advance_tau());
+ SERIAL_ECHOPGM(" U", stepper.get_advance_tau(e));
#endif
SERIAL_EOL();
- #else
- EXTRUDER_LOOP() {
- report_echo_start(forReplay);
- SERIAL_ECHOPGM(" M900 T", e, " K", planner.extruder_advance_K[e]);
- #if ENABLED(SMOOTH_LIN_ADVANCE)
- SERIAL_ECHOPGM(" U", stepper.get_advance_tau(e));
- #endif
- SERIAL_EOL();
- }
- #endif
+ }
}
#endif // LIN_ADVANCE
diff --git a/Marlin/src/gcode/feature/mixing/M166.cpp b/Marlin/src/gcode/feature/mixing/M166.cpp
index f42583d052..29411f2122 100644
--- a/Marlin/src/gcode/feature/mixing/M166.cpp
+++ b/Marlin/src/gcode/feature/mixing/M166.cpp
@@ -68,8 +68,7 @@ void GcodeSuite::M166() {
mixer.refresh_gradient();
- SERIAL_ECHOPGM("Gradient Mix ");
- serialprint_onoff(mixer.gradient.enabled);
+ SERIAL_ECHOPGM("Gradient Mix ", ON_OFF(mixer.gradient.enabled));
if (mixer.gradient.enabled) {
#if ENABLED(GRADIENT_VTOOL)
diff --git a/Marlin/src/gcode/feature/nonlinear/M592.cpp b/Marlin/src/gcode/feature/nonlinear/M592.cpp
index 77a6258ddc..78c15443f8 100644
--- a/Marlin/src/gcode/feature/nonlinear/M592.cpp
+++ b/Marlin/src/gcode/feature/nonlinear/M592.cpp
@@ -49,6 +49,12 @@ void GcodeSuite::M592() {
if (parser.seenval('A')) stepper.ne.A = parser.value_float();
if (parser.seenval('B')) stepper.ne.B = parser.value_float();
if (parser.seenval('C')) stepper.ne.C = parser.value_float();
+
+ #if ENABLED(SMOOTH_LIN_ADVANCE)
+ stepper.ne_q30.A = _BV32(30) * (stepper.ne.A * planner.mm_per_step[E_AXIS_N(0)] * planner.mm_per_step[E_AXIS_N(0)]);
+ stepper.ne_q30.B = _BV32(30) * (stepper.ne.B * planner.mm_per_step[E_AXIS_N(0)]);
+ stepper.ne_q30.C = _BV32(30) * stepper.ne.C;
+ #endif
}
#endif // NONLINEAR_EXTRUSION
diff --git a/Marlin/src/gcode/feature/powerloss/M413.cpp b/Marlin/src/gcode/feature/powerloss/M413.cpp
index b12257b4e5..68cdc01668 100644
--- a/Marlin/src/gcode/feature/powerloss/M413.cpp
+++ b/Marlin/src/gcode/feature/powerloss/M413.cpp
@@ -41,10 +41,10 @@
*/
void GcodeSuite::M413() {
+ if (!parser.seen_any()) return M413_report();
+
if (parser.seen('S'))
recovery.enable(parser.value_bool());
- else
- M413_report();
#if HAS_PLR_BED_THRESHOLD
if (parser.seenval('B'))
@@ -67,13 +67,12 @@ void GcodeSuite::M413_report(const bool forReplay/*=true*/) {
TERN_(MARLIN_SMALL_BUILD, return);
report_heading_etc(forReplay, F(STR_POWER_LOSS_RECOVERY));
- SERIAL_ECHOPGM(" M413 S", AS_DIGIT(recovery.enabled)
+ SERIAL_ECHOLNPGM(" M413 S", AS_DIGIT(recovery.enabled)
#if HAS_PLR_BED_THRESHOLD
, " B", recovery.bed_temp_threshold
#endif
+ , " ; ", ON_OFF(recovery.enabled)
);
- SERIAL_ECHO(" ; ");
- serialprintln_onoff(recovery.enabled);
}
#endif // POWER_LOSS_RECOVERY
diff --git a/Marlin/src/gcode/feature/prusa_MMU2/M704-M709.cpp b/Marlin/src/gcode/feature/prusa_MMU2/M704-M709.cpp
index f6af70b8dd..19aea31ff1 100644
--- a/Marlin/src/gcode/feature/prusa_MMU2/M704-M709.cpp
+++ b/Marlin/src/gcode/feature/prusa_MMU2/M704-M709.cpp
@@ -185,13 +185,12 @@ void GcodeSuite::M709() {
void GcodeSuite::MMU3_report(const bool forReplay/*=true*/) {
using namespace MMU3;
report_heading(forReplay, F("MMU3 Operational Stats"));
- SERIAL_ECHOPGM(" MMU "); serialprintln_onoff(mmu3.mmu_hw_enabled);
- SERIAL_ECHOPGM(" Stealth Mode "); serialprintln_onoff(mmu3.stealth_mode);
+ SERIAL_ECHOLNPGM(" MMU ", ON_OFF(mmu3.mmu_hw_enabled));
+ SERIAL_ECHOLNPGM(" Stealth Mode ", ON_OFF(mmu3.stealth_mode));
#if ENABLED(MMU3_HAS_CUTTER)
- SERIAL_ECHOPGM(" Cutter ");
- serialprintln_onoff(mmu3.cutter_mode != 0);
+ SERIAL_ECHOLNPGM(" Cutter ", ON_OFF(mmu3.cutter_mode != 0));
#endif
- SERIAL_ECHOPGM(" SpoolJoin "); serialprintln_onoff(spooljoin.enabled);
+ SERIAL_ECHOLNPGM(" SpoolJoin ", ON_OFF(spooljoin.enabled));
SERIAL_ECHOLNPGM(" Tool Changes ", operation_statistics.tool_change_counter);
SERIAL_ECHOLNPGM(" Total Tool Changes ", operation_statistics.tool_change_total_counter);
SERIAL_ECHOLNPGM(" Fails ", operation_statistics.fail_num);
diff --git a/Marlin/src/gcode/feature/runout/M412.cpp b/Marlin/src/gcode/feature/runout/M412.cpp
index 4cfb238309..1b8936e6bd 100644
--- a/Marlin/src/gcode/feature/runout/M412.cpp
+++ b/Marlin/src/gcode/feature/runout/M412.cpp
@@ -53,14 +53,12 @@ void GcodeSuite::M412() {
}
else {
SERIAL_ECHO_START();
- SERIAL_ECHOPGM("Filament runout ");
- serialprint_onoff(runout.enabled);
+ SERIAL_ECHOPGM("Filament runout ", ON_OFF(runout.enabled));
#if HAS_FILAMENT_RUNOUT_DISTANCE
SERIAL_ECHOPGM(" ; Distance ", runout.runout_distance(), "mm");
#endif
#if ENABLED(HOST_ACTION_COMMANDS)
- SERIAL_ECHOPGM(" ; Host handling ");
- serialprint_onoff(runout.host_handling);
+ SERIAL_ECHOPGM(" ; Host handling ", ON_OFF(runout.host_handling));
#endif
SERIAL_EOL();
}
@@ -70,14 +68,13 @@ void GcodeSuite::M412_report(const bool forReplay/*=true*/) {
TERN_(MARLIN_SMALL_BUILD, return);
report_heading_etc(forReplay, F(STR_FILAMENT_RUNOUT_SENSOR));
- SERIAL_ECHOPGM(
+ SERIAL_ECHOLNPGM(
" M412 S", runout.enabled
#if HAS_FILAMENT_RUNOUT_DISTANCE
, " D", LINEAR_UNIT(runout.runout_distance())
#endif
- , " ; Sensor "
+ , " ; Sensor ", ON_OFF(runout.enabled)
);
- serialprintln_onoff(runout.enabled);
}
#endif // HAS_FILAMENT_SENSOR
diff --git a/Marlin/src/gcode/feature/trinamic/M911-M914.cpp b/Marlin/src/gcode/feature/trinamic/M911-M914.cpp
index f4b0ac3670..336e881372 100644
--- a/Marlin/src/gcode/feature/trinamic/M911-M914.cpp
+++ b/Marlin/src/gcode/feature/trinamic/M911-M914.cpp
@@ -32,7 +32,9 @@
#if ENABLED(MONITOR_DRIVER_STATUS)
- #define M91x_USE(ST) (AXIS_DRIVER_TYPE(ST, TMC2130) || AXIS_DRIVER_TYPE(ST, TMC2160) || AXIS_DRIVER_TYPE(ST, TMC2208) || AXIS_DRIVER_TYPE(ST, TMC2209) || AXIS_DRIVER_TYPE(ST, TMC2660) || AXIS_DRIVER_TYPE(ST, TMC5130) || AXIS_DRIVER_TYPE(ST, TMC5160))
+ #define M91x_USE(ST) (AXIS_DRIVER_TYPE(ST, TMC2130) || AXIS_DRIVER_TYPE(ST, TMC2160) \
+ || AXIS_DRIVER_TYPE(ST, TMC2208) || AXIS_DRIVER_TYPE(ST, TMC2209) || AXIS_DRIVER_TYPE(ST, TMC2240) \
+ || AXIS_DRIVER_TYPE(ST, TMC2660) || AXIS_DRIVER_TYPE(ST, TMC5130) || AXIS_DRIVER_TYPE(ST, TMC5160))
#define M91x_USE_E(N) (E_STEPPERS > N && M91x_USE(E##N))
#if HAS_X_AXIS && (M91x_USE(X) || M91x_USE(X2))
@@ -68,15 +70,13 @@
#endif
#if !M91x_SOME_X && !M91x_SOME_Y && !M91x_SOME_Z && !M91x_USE_I && !M91x_USE_J && !M91x_USE_K && !M91x_USE_U && !M91x_USE_V && !M91x_USE_W && !M91x_SOME_E
- #error "MONITOR_DRIVER_STATUS requires at least one TMC2130, 2160, 2208, 2209, 2660, 5130, or 5160."
+ #error "MONITOR_DRIVER_STATUS requires at least one TMC2130, 2160, 2208, 2209, 2240, 2660, 5130, or 5160."
#endif
template
static void tmc_report_otpw(TMC &st) {
st.printLabel();
- SERIAL_ECHOPGM(" temperature prewarn triggered: ");
- serialprint_truefalse(st.getOTPW());
- SERIAL_EOL();
+ SERIAL_ECHOLNPGM(" temperature prewarn triggered: ", TRUE_FALSE(st.getOTPW()));
}
template
diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp
index 330adaf860..3ed7bd0af9 100644
--- a/Marlin/src/gcode/gcode.cpp
+++ b/Marlin/src/gcode/gcode.cpp
@@ -319,7 +319,7 @@ void GcodeSuite::dwell(const millis_t time) {
/**
* Process the parsed command and dispatch it to its handler
*/
-void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) {
+void GcodeSuite::process_parsed_command(bool no_ok/*=false*/) {
TERN_(HAS_FANCHECK, fan_check.check_deferred_error());
KEEPALIVE_STATE(IN_HANDLER);
@@ -582,7 +582,7 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) {
case 109: M109(); break; // M109: Wait for hotend temperature to reach target
#endif
- case 105: M105(); return; // M105: Report Temperatures (and say "ok")
+ case 105: M105(); no_ok = true; break; // M105: Report Temperatures (and say "ok")
#if HAS_FAN
case 106: M106(); break; // M106: Fan On
diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h
index 457185a1a8..cd0c249d21 100644
--- a/Marlin/src/gcode/gcode.h
+++ b/Marlin/src/gcode/gcode.h
@@ -159,7 +159,7 @@
* M120 - Enable endstops detection.
* M121 - Disable endstops detection.
*
- * M122 - Debug stepper (Requires *_DRIVER_TYPE TMC(2130|2160|5130|5160|2208|2209|2660))
+ * M122 - Debug stepper (Requires *_DRIVER_TYPE TMC(2130|2160|5130|5160|2208|2209|2240|2660))
* M123 - Report fan tachometers. (Requires En_FAN_TACHO_PIN) Optionally set auto-report interval. (Requires AUTO_REPORT_FANS)
* M125 - Save current position and move to filament change position. (Requires PARK_HEAD_ON_PAUSE)
*
@@ -265,7 +265,7 @@
* M552 - Get or set IP address. Enable/disable network interface. (Requires enabled Ethernet port)
* M553 - Get or set IP netmask. (Requires enabled Ethernet port)
* M554 - Get or set IP gateway. (Requires enabled Ethernet port)
- * M569 - Enable stealthChop on an axis. (Requires *_DRIVER_TYPE TMC(2130|2160|2208|2209|5130|5160))
+ * M569 - Enable stealthChop on an axis. (Requires *_DRIVER_TYPE TMC(2130|2160|2208|2209|2240|5130|5160))
* M575 - Change the serial baud rate. (Requires BAUD_RATE_GCODE)
* M592 - Get or set Nonlinear Extrusion parameters. (Requires NONLINEAR_EXTRUSION)
* M593 - Get or set input shaping parameters. (Requires INPUT_SHAPING_[XY])
@@ -309,17 +309,17 @@
* M871 - Print/reset/clear first layer temperature offset values. (Requires PTC_PROBE, PTC_BED, or PTC_HOTEND)
* M876 - Handle Prompt Response. (Requires HOST_PROMPT_SUPPORT)
* M900 - Set or Report Linear Advance K-factor. (Requires LIN_ADVANCE)
- * M906 - Set or Report motor current in milliamps using axis codes XYZE, etc. Report values if no axis codes given. (Requires *_DRIVER_TYPE TMC(2130|2160|5130|5160|2208|2209|2660))
+ * M906 - Set or Report motor current in milliamps using axis codes XYZE, etc. Report values if no axis codes given. (Requires *_DRIVER_TYPE TMC(2130|2160|5130|5160|2208|2209|2240|2660))
* M907 - Set digital trimpot motor current using axis codes. (Requires a board with digital trimpots)
* M908 - Control digital trimpot directly. (Requires HAS_MOTOR_CURRENT_DAC or DIGIPOTSS_PIN)
* M909 - Print digipot/DAC current value. (Requires HAS_MOTOR_CURRENT_DAC)
* M910 - Commit digipot/DAC value to external EEPROM via I2C. (Requires HAS_MOTOR_CURRENT_DAC)
- * M911 - Report stepper driver overtemperature pre-warn condition. (Requires *_DRIVER_TYPE TMC(2130|2160|5130|5160|2208|2209|2660))
- * M912 - Clear stepper driver overtemperature pre-warn condition flag. (Requires *_DRIVER_TYPE TMC(2130|2160|5130|5160|2208|2209|2660))
+ * M911 - Report stepper driver overtemperature pre-warn condition. (Requires *_DRIVER_TYPE TMC(2130|2160|5130|5160|2208|2209|2240|2660))
+ * M912 - Clear stepper driver overtemperature pre-warn condition flag. (Requires *_DRIVER_TYPE TMC(2130|2160|5130|5160|2208|2209|2240|2660))
* M913 - Set HYBRID_THRESHOLD speed. (Requires HYBRID_THRESHOLD)
* M914 - Set StallGuard sensitivity. (Requires SENSORLESS_HOMING or SENSORLESS_PROBING)
* M919 - Set or Report motor Chopper Times (time_off, hysteresis_end, hysteresis_start) using axis codes XYZE, etc.
- * If no parameters are given, report. (Requires *_DRIVER_TYPE TMC(2130|2160|5130|5160|2208|2209|2660))
+ * If no parameters are given, report. (Requires *_DRIVER_TYPE TMC(2130|2160|5130|5160|2208|2209|2240|2660))
* M920 - Set Homing Current. (Requires distinct *_CURRENT_HOME settings)
* M936 - OTA update firmware. (Requires OTA_FIRMWARE_UPDATE)
* M951 - Set Magnetic Parking Extruder parameters. (Requires MAGNETIC_PARKING_EXTRUDER)
@@ -458,7 +458,7 @@ public:
static int8_t get_target_e_stepper_from_command(const int8_t dval=-1);
static void get_destination_from_command();
- static void process_parsed_command(const bool no_ok=false);
+ static void process_parsed_command(bool no_ok=false);
static void process_next_command();
// Execute G-code in-place, preserving current G-code parameters
diff --git a/Marlin/src/gcode/host/M360.cpp b/Marlin/src/gcode/host/M360.cpp
index 63071f6113..a3f86d615d 100644
--- a/Marlin/src/gcode/host/M360.cpp
+++ b/Marlin/src/gcode/host/M360.cpp
@@ -22,6 +22,10 @@
#include "../../inc/MarlinConfig.h"
+/**
+ * M360 Report Printer Configuration - Repetier Firmware
+ * See https://github.com/repetier/Repetier-Firmware/blob/master/src/ArduinoAVR/Repetier/Printer.cpp
+ */
#if ENABLED(REPETIER_GCODE_M360)
#include "../gcode.h"
@@ -33,74 +37,112 @@
#include "../../module/temperature.h"
#endif
-static void config_prefix(PGM_P const name, PGM_P const pref=nullptr, const int8_t ind=-1) {
+#include
+
+struct ProgStr {
+ PGM_P ptr;
+ constexpr ProgStr(PGM_P p) : ptr(p) {}
+ ProgStr(FSTR_P f) : ptr(FTOP(f)) {}
+ ProgStr(std::nullptr_t) : ptr(nullptr) {}
+
+ constexpr operator PGM_P() const { return ptr; }
+ constexpr explicit operator bool() const { return ptr != nullptr; }
+};
+
+static void config_prefix(ProgStr name, ProgStr pref=nullptr, int8_t ind=-1) {
SERIAL_ECHOPGM("Config:");
- if (pref) SERIAL_ECHOPGM_P(pref);
+ if (pref) SERIAL_ECHOPGM_P(static_cast(pref));
if (ind >= 0) { SERIAL_ECHO(ind); SERIAL_CHAR(':'); }
- SERIAL_ECHOPGM_P(name, C(':'));
+ SERIAL_ECHOPGM_P(static_cast(name), C(':'));
}
-static void config_line(PGM_P const name, const float val, PGM_P const pref=nullptr, const int8_t ind=-1) {
+
+template
+static void config_line(ProgStr name, const T val, ProgStr pref=nullptr, int8_t ind=-1) {
config_prefix(name, pref, ind);
SERIAL_ECHOLN(val);
}
-static void config_line(FSTR_P const name, const float val, FSTR_P const pref=nullptr, const int8_t ind=-1) {
- config_line(FTOP(name), val, FTOP(pref), ind);
-}
-static void config_line_e(const int8_t e, PGM_P const name, const float val) {
+
+template
+static void config_line_e(int8_t e, ProgStr name, const T val) {
config_line(name, val, PSTR("Extr."), e + 1);
}
-static void config_line_e(const int8_t e, FSTR_P const name, const float val) {
- config_line_e(e, FTOP(name), val);
-}
-
/**
* M360: Report Firmware configuration
* in RepRapFirmware-compatible format
*/
void GcodeSuite::M360() {
- PGMSTR(X_STR, "X");
- PGMSTR(Y_STR, "Y");
- PGMSTR(Z_STR, "Z");
- #if ANY(CLASSIC_JERK, HAS_LINEAR_E_JERK)
- PGMSTR(JERK_STR, "Jerk");
- #endif
-
//
// Basics and Enabled items
//
config_line(F("Baudrate"), BAUDRATE);
config_line(F("InputBuffer"), MAX_CMD_SIZE);
config_line(F("PrintlineCache"), BUFSIZE);
- config_line(F("MixingExtruder"), ENABLED(MIXING_EXTRUDER));
- config_line(F("SDCard"), ENABLED(HAS_MEDIA));
- config_line(F("Fan"), ENABLED(HAS_FAN));
- config_line(F("LCD"), ENABLED(HAS_DISPLAY));
+ config_line(F("MixingExtruder"), bool(ENABLED(MIXING_EXTRUDER)));
+ config_line(F("SDCard"), bool(ENABLED(HAS_MEDIA)));
+ config_line(F("Fan"), bool(ENABLED(HAS_FAN)));
+ config_line(F("LCD"), bool(ENABLED(HAS_DISPLAY)));
config_line(F("SoftwarePowerSwitch"), 1);
- config_line(F("SupportLocalFilamentchange"), ENABLED(ADVANCED_PAUSE_FEATURE));
- config_line(F("CaseLights"), ENABLED(CASE_LIGHT_ENABLE));
- config_line(F("ZProbe"), ENABLED(HAS_BED_PROBE));
- config_line(F("Autolevel"), ENABLED(HAS_LEVELING));
- config_line(F("EEPROM"), ENABLED(EEPROM_SETTINGS));
+ config_line(F("SupportLocalFilamentchange"), bool(ENABLED(ADVANCED_PAUSE_FEATURE)));
+ config_line(F("CaseLights"), bool(ENABLED(CASE_LIGHT_ENABLE)));
+ config_line(F("ZProbe"), bool(ENABLED(HAS_BED_PROBE)));
+ config_line(F("Autolevel"), bool(ENABLED(HAS_LEVELING)));
+ config_line(F("EEPROM"), bool(ENABLED(EEPROM_SETTINGS)));
+
+ //
+ // Axis letters, in PROGMEM
+ //
+ #define _DEFINE_A_STR(Q) PGMSTR(Q##_STR, STR_##Q);
+ MAIN_AXIS_MAP(_DEFINE_A_STR);
//
// Homing Directions
//
PGMSTR(H_DIR_STR, "HomeDir");
- config_line(H_DIR_STR, X_HOME_DIR, X_STR);
- config_line(H_DIR_STR, Y_HOME_DIR, Y_STR);
- config_line(H_DIR_STR, Z_HOME_DIR, Z_STR);
+ #if X_HOME_DIR
+ config_line(H_DIR_STR, X_HOME_DIR, X_STR);
+ #endif
+ #if Y_HOME_DIR
+ config_line(H_DIR_STR, Y_HOME_DIR, Y_STR);
+ #endif
+ #if Z_HOME_DIR
+ config_line(H_DIR_STR, Z_HOME_DIR, Z_STR);
+ #endif
+ #if I_HOME_DIR
+ config_line(H_DIR_STR, I_HOME_DIR, I_STR);
+ #endif
+ #if J_HOME_DIR
+ config_line(H_DIR_STR, J_HOME_DIR, J_STR);
+ #endif
+ #if K_HOME_DIR
+ config_line(H_DIR_STR, K_HOME_DIR, K_STR);
+ #endif
+ #if U_HOME_DIR
+ config_line(H_DIR_STR, U_HOME_DIR, U_STR);
+ #endif
+ #if V_HOME_DIR
+ config_line(H_DIR_STR, V_HOME_DIR, V_STR);
+ #endif
+ #if W_HOME_DIR
+ config_line(H_DIR_STR, W_HOME_DIR, W_STR);
+ #endif
+
+ #if ANY(CLASSIC_JERK, HAS_LINEAR_E_JERK)
+ PGMSTR(JERK_STR, "Jerk");
+ #endif
//
// XYZ Axis Jerk
//
#if ENABLED(CLASSIC_JERK)
- if (planner.max_jerk.x == planner.max_jerk.y)
- config_line(F("XY"), planner.max_jerk.x, FPSTR(JERK_STR));
+ #define _REPORT_JERK(Q) config_line(Q##_STR, planner.max_jerk.Q, JERK_STR);
+ if (TERN0(HAS_Y_AXIS, planner.max_jerk.x == planner.max_jerk.y))
+ config_line(F("XY"), planner.max_jerk.x, JERK_STR);
else {
- config_line(X_STR, planner.max_jerk.x, JERK_STR);
- config_line(Y_STR, planner.max_jerk.y, JERK_STR);
+ TERN_(HAS_X_AXIS, _REPORT_JERK(X));
+ TERN_(HAS_Y_AXIS, _REPORT_JERK(Y));
}
- config_line(Z_STR, planner.max_jerk.z, JERK_STR);
+ TERN_(HAS_Z_AXIS, config_line(Z_STR, planner.max_jerk.z, JERK_STR));
+ SECONDARY_AXIS_MAP(_REPORT_JERK);
#endif
//
@@ -112,53 +154,62 @@ void GcodeSuite::M360() {
PGMSTR(UNRET_STR, "RetractionUndo");
PGMSTR(SPEED_STR, "Speed");
// M10 Retract with swap (long) moves
- config_line(F("Length"), fwretract.settings.retract_length, FPSTR(RET_STR));
+ config_line(F("Length"), fwretract.settings.retract_length, RET_STR);
+ config_line(F("LongLength"), fwretract.settings.swap_retract_length, RET_STR);
config_line(SPEED_STR, fwretract.settings.retract_feedrate_mm_s, RET_STR);
- config_line(F("ZLift"), fwretract.settings.retract_zraise, FPSTR(RET_STR));
- config_line(F("LongLength"), fwretract.settings.swap_retract_length, FPSTR(RET_STR));
+ config_line(F("ZLift"), fwretract.settings.retract_zraise, RET_STR);
// M11 Recover (undo) with swap (long) moves
+ config_line(F("ExtraLength"), fwretract.settings.retract_recover_extra, UNRET_STR);
+ config_line(F("ExtraLongLength"), fwretract.settings.swap_retract_recover_extra, UNRET_STR);
config_line(SPEED_STR, fwretract.settings.retract_recover_feedrate_mm_s, UNRET_STR);
- config_line(F("ExtraLength"), fwretract.settings.retract_recover_extra, FPSTR(UNRET_STR));
- config_line(F("ExtraLongLength"), fwretract.settings.swap_retract_recover_extra, FPSTR(UNRET_STR));
- config_line(F("LongSpeed"), fwretract.settings.swap_retract_recover_feedrate_mm_s, FPSTR(UNRET_STR));
+ config_line(F("LongSpeed"), fwretract.settings.swap_retract_recover_feedrate_mm_s, UNRET_STR);
#endif
//
// Workspace boundaries
//
- const xyz_pos_t dmin = { X_MIN_POS, Y_MIN_POS, Z_MIN_POS },
- dmax = { X_MAX_POS, Y_MAX_POS, Z_MAX_POS };
+ const xyz_pos_t dmin = NUM_AXIS_ARRAY(X_MIN_POS, Y_MIN_POS, Z_MIN_POS, I_MIN_POS, J_MIN_POS, K_MIN_POS, U_MIN_POS, V_MIN_POS, W_MIN_POS),
+ dmax = NUM_AXIS_ARRAY(X_MAX_POS, Y_MAX_POS, Z_MAX_POS, I_MAX_POS, J_MAX_POS, K_MAX_POS, U_MAX_POS, V_MAX_POS, W_MAX_POS);
xyz_pos_t cmin = dmin, cmax = dmax;
apply_motion_limits(cmin);
apply_motion_limits(cmax);
const xyz_pos_t wmin = cmin.asLogical(), wmax = cmax.asLogical();
PGMSTR(MIN_STR, "Min");
+ #define _REPORT_MIN(Q) config_line(MIN_STR, wmin.Q, Q##_STR);
+ MAIN_AXIS_MAP(_REPORT_MIN);
+
PGMSTR(MAX_STR, "Max");
+ #define _REPORT_MAX(Q) config_line(MAX_STR, wmax.Q, Q##_STR);
+ MAIN_AXIS_MAP(_REPORT_MAX);
+
PGMSTR(SIZE_STR, "Size");
- config_line(MIN_STR, wmin.x, X_STR);
- config_line(MIN_STR, wmin.y, Y_STR);
- config_line(MIN_STR, wmin.z, Z_STR);
- config_line(MAX_STR, wmax.x, X_STR);
- config_line(MAX_STR, wmax.y, Y_STR);
- config_line(MAX_STR, wmax.z, Z_STR);
- config_line(SIZE_STR, wmax.x - wmin.x, X_STR);
- config_line(SIZE_STR, wmax.y - wmin.y, Y_STR);
- config_line(SIZE_STR, wmax.z - wmin.z, Z_STR);
+ #define _REPORT_SIZE(Q) config_line(SIZE_STR, wmax.Q - wmin.Q, Q##_STR);
+ MAIN_AXIS_MAP(_REPORT_SIZE);
+
+ //
+ // Axis Steps per mm
+ //
+ PGMSTR(S_MM_STR, "Steps/mm");
+ #define _REPORT_S_MM(Q) config_line(S_MM_STR, planner.settings.axis_steps_per_mm[_AXIS(Q)], Q##_STR);
+ MAIN_AXIS_MAP(_REPORT_S_MM);
//
// Print and Travel Acceleration
//
- #define _ACCEL(A,B) _MIN(planner.settings.max_acceleration_mm_per_s2[A##_AXIS], planner.settings.B)
- PGMSTR(P_ACC_STR, "PrintAccel");
- PGMSTR(T_ACC_STR, "TravelAccel");
- config_line(P_ACC_STR, _ACCEL(X, acceleration), X_STR);
- config_line(P_ACC_STR, _ACCEL(Y, acceleration), Y_STR);
- config_line(P_ACC_STR, _ACCEL(Z, acceleration), Z_STR);
- config_line(T_ACC_STR, _ACCEL(X, travel_acceleration), X_STR);
- config_line(T_ACC_STR, _ACCEL(Y, travel_acceleration), Y_STR);
- config_line(T_ACC_STR, _ACCEL(Z, travel_acceleration), Z_STR);
+ #define _ACCEL(Q,B) _MIN(planner.settings.max_acceleration_mm_per_s2[Q##_AXIS], planner.settings.B)
+ PGMSTR(P_ACC_STR, "PrintAccel");
+ #define _REPORT_P_ACC(Q) config_line(P_ACC_STR, _ACCEL(Q, acceleration), Q##_STR);
+ MAIN_AXIS_MAP(_REPORT_P_ACC);
+
+ PGMSTR(T_ACC_STR, "TravelAccel");
+ #define _REPORT_T_ACC(Q) config_line(T_ACC_STR, _ACCEL(Q, travel_acceleration), Q##_STR);
+ MAIN_AXIS_MAP(_REPORT_T_ACC);
+
+ //
+ // Printer Type
+ //
config_prefix(PSTR("PrinterType"));
SERIAL_ECHOLNPGM(
TERN_(DELTA, "Delta")
@@ -189,12 +240,12 @@ void GcodeSuite::M360() {
#elif ENABLED(CLASSIC_JERK)
config_line_e(e, JERK_STR, planner.max_jerk.e);
#endif
- config_line_e(e, F("MaxSpeed"), planner.settings.max_feedrate_mm_s[E_AXIS_N(e)]);
config_line_e(e, F("Acceleration"), planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(e)]);
+ config_line_e(e, F("MaxSpeed"), planner.settings.max_feedrate_mm_s[E_AXIS_N(e)]);
config_line_e(e, F("Diameter"), TERN(NO_VOLUMETRICS, DEFAULT_NOMINAL_FILAMENT_DIA, planner.filament_size[e]));
config_line_e(e, F("MaxTemp"), thermalManager.hotend_maxtemp[e]);
}
#endif
}
-#endif
+#endif // REPETIER_GCODE_M360
diff --git a/Marlin/src/gcode/motion/G0_G1.cpp b/Marlin/src/gcode/motion/G0_G1.cpp
index c6c1833806..b489b659ae 100644
--- a/Marlin/src/gcode/motion/G0_G1.cpp
+++ b/Marlin/src/gcode/motion/G0_G1.cpp
@@ -86,9 +86,10 @@ void GcodeSuite::G0_G1(TERN_(HAS_FAST_MOVES, const bool fast_move/*=false*/)) {
const float echange = destination.e - current_position.e;
// Is this a retract or recover move?
if (WITHIN(ABS(echange), MIN_AUTORETRACT, MAX_AUTORETRACT) && fwretract.retracted[active_extruder] == (echange > 0.0)) {
- current_position.e = destination.e; // Hide a G1-based retract/recover from calculations
- sync_plan_position_e(); // AND from the planner
- return fwretract.retract(echange < 0.0); // Firmware-based retract/recover (double-retract ignored)
+ current_position.e = destination.e; // Hide a G1-based retract/recover from calculations
+ sync_plan_position_e(); // AND from the planner
+ fwretract.retract(echange < 0.0); // Firmware-based retract/recover (double-retract ignored)
+ return;
}
}
}
diff --git a/Marlin/src/gcode/probe/M401_M402.cpp b/Marlin/src/gcode/probe/M401_M402.cpp
index 05230e05ea..237f841212 100644
--- a/Marlin/src/gcode/probe/M401_M402.cpp
+++ b/Marlin/src/gcode/probe/M401_M402.cpp
@@ -47,9 +47,7 @@ void GcodeSuite::M401() {
seenS = parser.seen('S');
if (seenH || seenS) {
if (seenS) bltouch.high_speed_mode = parser.value_bool();
- SERIAL_ECHO_START();
- SERIAL_ECHOPGM("BLTouch HS mode ");
- serialprintln_onoff(bltouch.high_speed_mode);
+ SERIAL_ECHO_MSG("BLTouch HS mode ", ON_OFF(bltouch.high_speed_mode));
return;
}
#endif
diff --git a/Marlin/src/gcode/probe/M951.cpp b/Marlin/src/gcode/probe/M951.cpp
index db0278e431..15d3d47af0 100644
--- a/Marlin/src/gcode/probe/M951.cpp
+++ b/Marlin/src/gcode/probe/M951.cpp
@@ -80,7 +80,7 @@ void GcodeSuite::M951() {
if (parser.seenval('H')) mpe_settings.fast_feedrate = MMM_TO_MMS(parser.value_linear_units());
if (parser.seenval('D')) mpe_settings.travel_distance = parser.value_linear_units();
if (parser.seenval('C')) mpe_settings.compensation_factor = parser.value_float();
- if (!parser.seen("CDHIJLR")) mpe_settings_report();
+ if (!parser.seen_any()) mpe_settings_report();
}
#endif // MAGNETIC_PARKING_EXTRUDER
diff --git a/Marlin/src/gcode/temp/M106_M107.cpp b/Marlin/src/gcode/temp/M106_M107.cpp
index afa2ebfc56..ddfc8514c0 100644
--- a/Marlin/src/gcode/temp/M106_M107.cpp
+++ b/Marlin/src/gcode/temp/M106_M107.cpp
@@ -65,7 +65,10 @@ void GcodeSuite::M106() {
#if ENABLED(EXTRA_FAN_SPEED)
const uint16_t t = parser.intval('T');
- if (t > 0) return thermalManager.set_temp_fan_speed(pfan, t);
+ if (t > 0) {
+ thermalManager.set_temp_fan_speed(pfan, t);
+ return;
+ }
#endif
const uint16_t dspeed = parser.seen_test('A') ? thermalManager.fan_speed[active_extruder] : 255;
diff --git a/Marlin/src/gcode/temp/M303.cpp b/Marlin/src/gcode/temp/M303.cpp
index c08b99edc6..ffa4efb699 100644
--- a/Marlin/src/gcode/temp/M303.cpp
+++ b/Marlin/src/gcode/temp/M303.cpp
@@ -50,9 +50,7 @@ void GcodeSuite::M303() {
#if HAS_PID_DEBUG
if (parser.seen_test('D')) {
FLIP(thermalManager.pid_debug_flag);
- SERIAL_ECHO_START();
- SERIAL_ECHOPGM("PID Debug ");
- serialprintln_onoff(thermalManager.pid_debug_flag);
+ SERIAL_ECHO_MSG("PID Debug ", ON_OFF(thermalManager.pid_debug_flag));
return;
}
#endif
diff --git a/Marlin/src/inc/Changes.h b/Marlin/src/inc/Changes.h
index 839804d920..cbfdcfc47f 100644
--- a/Marlin/src/inc/Changes.h
+++ b/Marlin/src/inc/Changes.h
@@ -765,15 +765,15 @@
#endif
// Consolidate TMC26X, validate migration (#24373)
-#define _ISMAX_1(A) defined(A##_MAX_CURRENT)
-#define _ISSNS_1(A) defined(A##_SENSE_RESISTOR)
-#if DO(ISMAX,||,ALL_AXIS_NAMES)
+#define _ISMAX(A) defined(A##_MAX_CURRENT) ||
+#define _ISSNS(A) defined(A##_SENSE_RESISTOR) ||
+#if MAP(_ISMAX, ALL_AXIS_NAMES) 0
#error "*_MAX_CURRENT is now set with *_CURRENT."
-#elif DO(ISSNS,||,ALL_AXIS_NAMES)
+#elif MAP(_ISSNS, ALL_AXIS_NAMES) 0
#error "*_SENSE_RESISTOR (in Milli-Ohms) is now set with *_RSENSE (in Ohms), so you must divide values by 1000."
#endif
-#undef _ISMAX_1
-#undef _ISSNS_1
+#undef _ISMAX
+#undef _ISSNS
// L64xx stepper drivers have been removed
#define _L6470 0x6470
diff --git a/Marlin/src/inc/Conditionals-2-LCD.h b/Marlin/src/inc/Conditionals-2-LCD.h
index 2bf663b6f0..8f92948d56 100644
--- a/Marlin/src/inc/Conditionals-2-LCD.h
+++ b/Marlin/src/inc/Conditionals-2-LCD.h
@@ -663,14 +663,6 @@
#define BOOT_MARLIN_LOGO_SMALL
#endif
-// Flow and feedrate editing
-#if HAS_EXTRUDERS && ANY(HAS_MARLINUI_MENU, DWIN_CREALITY_LCD, DWIN_LCD_PROUI, MALYAN_LCD, TOUCH_SCREEN)
- #define HAS_FLOW_EDIT 1
-#endif
-#if ANY(HAS_MARLINUI_MENU, ULTIPANEL_FEEDMULTIPLY, DWIN_CREALITY_LCD, DWIN_LCD_PROUI, MALYAN_LCD, TOUCH_SCREEN)
- #define HAS_FEEDRATE_EDIT 1
-#endif
-
/**
* TFT Displays
*
diff --git a/Marlin/src/inc/Conditionals-3-etc.h b/Marlin/src/inc/Conditionals-3-etc.h
index b361a50a58..00bff0e072 100644
--- a/Marlin/src/inc/Conditionals-3-etc.h
+++ b/Marlin/src/inc/Conditionals-3-etc.h
@@ -560,11 +560,6 @@
#undef Z_CLEARANCE_DEPLOY_PROBE
#endif
-#if !(ANY(HAS_BED_PROBE, BACKLASH_GCODE) || (ENABLED(EXTENSIBLE_UI) && ANY(MESH_BED_LEVELING, AUTO_BED_LEVELING_UBL)))
- #undef Z_PROBE_FEEDRATE_FAST
- #undef Z_PROBE_FEEDRATE_SLOW
-#endif
-
/**
* Z_CLEARANCE_FOR_HOMING
*/
diff --git a/Marlin/src/inc/Conditionals-4-adv.h b/Marlin/src/inc/Conditionals-4-adv.h
index c90fc2d5ad..30b8a57433 100644
--- a/Marlin/src/inc/Conditionals-4-adv.h
+++ b/Marlin/src/inc/Conditionals-4-adv.h
@@ -105,6 +105,10 @@
#endif
#endif
+#if !(ANY(HAS_BED_PROBE, BACKLASH_GCODE) || (ENABLED(EXTENSIBLE_UI) && ANY(MESH_BED_LEVELING, AUTO_BED_LEVELING_UBL)))
+ #undef Z_PROBE_FEEDRATE_FAST
+ #undef Z_PROBE_FEEDRATE_SLOW
+#endif
#if !HAS_BED_PROBE
#undef BABYSTEP_ZPROBE_OFFSET
#undef PROBING_USE_CURRENT_HOME
diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h
index ff75824673..98498f4355 100644
--- a/Marlin/src/inc/SanityCheck.h
+++ b/Marlin/src/inc/SanityCheck.h
@@ -868,8 +868,6 @@ static_assert(COUNT(arm) == LOGICAL_AXES, "AXIS_RELATIVE_MODES must contain " _L
#error "SMOOTH_LIN_ADVANCE requires a 32-bit CPU."
#elif ENABLED(S_CURVE_ACCELERATION)
#error "SMOOTH_LIN_ADVANCE is not compatible with S_CURVE_ACCELERATION."
- #elif ENABLED(NONLINEAR_EXTRUSION)
- #error "SMOOTH_LIN_ADVANCE doesn't currently support NONLINEAR_EXTRUSION."
#elif ENABLED(INPUT_SHAPING_E_SYNC) && NONE(INPUT_SHAPING_X, INPUT_SHAPING_Y)
#error "INPUT_SHAPING_E_SYNC requires INPUT_SHAPING_X or INPUT_SHAPING_Y."
#endif
@@ -3380,19 +3378,19 @@ static_assert(NUM_SERVOS <= NUM_SERVO_PLUGS, "NUM_SERVOS (or some servo index) i
#error "SPI_ENDSTOPS requires stepper drivers with SPI support."
#endif
#else // !SPI_ENDSTOPS
- // Stall detection DIAG = HIGH : TMC2209
- // Stall detection DIAG = LOW : TMC2130/TMC2160/TMC2660/TMC5130/TMC5160
+ // Stall detection DIAG = HIGH : TMC2209/2240
+ // Stall detection DIAG = LOW : TMC2130/2160/2660/5130/5160
#if X_SENSORLESS
- #define _HIT_STATE AXIS_DRIVER_TYPE(X,TMC2209)
+ #define _HIT_STATE (AXIS_DRIVER_TYPE(X,TMC2209) || AXIS_DRIVER_TYPE(X,TMC2240))
#if X_HOME_TO_MIN && X_MIN_ENDSTOP_HIT_STATE != _HIT_STATE
#if _HIT_STATE
- #error "SENSORLESS_HOMING requires X_MIN_ENDSTOP_HIT_STATE HIGH for X MIN homing with TMC2209."
+ #error "SENSORLESS_HOMING requires X_MIN_ENDSTOP_HIT_STATE HIGH for X MIN homing with TMC2209/2240."
#else
#error "SENSORLESS_HOMING requires X_MIN_ENDSTOP_HIT_STATE LOW for X MIN homing."
#endif
#elif X_HOME_TO_MAX && X_MAX_ENDSTOP_HIT_STATE != _HIT_STATE
#if _HIT_STATE
- #error "SENSORLESS_HOMING requires X_MAX_ENDSTOP_HIT_STATE HIGH for X MAX homing with TMC2209."
+ #error "SENSORLESS_HOMING requires X_MAX_ENDSTOP_HIT_STATE HIGH for X MAX homing with TMC2209/2240."
#else
#error "SENSORLESS_HOMING requires X_MAX_ENDSTOP_HIT_STATE LOW for X MAX homing."
#endif
@@ -3401,16 +3399,16 @@ static_assert(NUM_SERVOS <= NUM_SERVO_PLUGS, "NUM_SERVOS (or some servo index) i
#endif
#if Y_SENSORLESS
- #define _HIT_STATE AXIS_DRIVER_TYPE(Y,TMC2209)
+ #define _HIT_STATE (AXIS_DRIVER_TYPE(Y,TMC2209) || AXIS_DRIVER_TYPE(Y,TMC2240))
#if Y_HOME_TO_MIN && Y_MIN_ENDSTOP_HIT_STATE != _HIT_STATE
#if _HIT_STATE
- #error "SENSORLESS_HOMING requires Y_MIN_ENDSTOP_HIT_STATE HIGH for Y MIN homing with TMC2209."
+ #error "SENSORLESS_HOMING requires Y_MIN_ENDSTOP_HIT_STATE HIGH for Y MIN homing with TMC2209/2240."
#else
#error "SENSORLESS_HOMING requires Y_MIN_ENDSTOP_HIT_STATE LOW for Y MIN homing."
#endif
#elif Y_HOME_TO_MAX && Y_MAX_ENDSTOP_HIT_STATE != _HIT_STATE
#if _HIT_STATE
- #error "SENSORLESS_HOMING requires Y_MAX_ENDSTOP_HIT_STATE HIGH for Y MAX homing with TMC2209."
+ #error "SENSORLESS_HOMING requires Y_MAX_ENDSTOP_HIT_STATE HIGH for Y MAX homing with TMC2209/2240."
#else
#error "SENSORLESS_HOMING requires Y_MAX_ENDSTOP_HIT_STATE LOW for Y MAX homing."
#endif
@@ -3419,16 +3417,16 @@ static_assert(NUM_SERVOS <= NUM_SERVO_PLUGS, "NUM_SERVOS (or some servo index) i
#endif
#if Z_SENSORLESS
- #define _HIT_STATE AXIS_DRIVER_TYPE(Z,TMC2209)
+ #define _HIT_STATE (AXIS_DRIVER_TYPE(Z,TMC2209) || AXIS_DRIVER_TYPE(Z,TMC2240))
#if Z_HOME_TO_MIN && Z_MIN_ENDSTOP_HIT_STATE != _HIT_STATE
#if _HIT_STATE
- #error "SENSORLESS_HOMING requires Z_MIN_ENDSTOP_HIT_STATE HIGH for Z MIN homing with TMC2209."
+ #error "SENSORLESS_HOMING requires Z_MIN_ENDSTOP_HIT_STATE HIGH for Z MIN homing with TMC2209/2240."
#else
#error "SENSORLESS_HOMING requires Z_MIN_ENDSTOP_HIT_STATE LOW for Z MIN homing."
#endif
#elif Z_HOME_TO_MAX && Z_MAX_ENDSTOP_HIT_STATE != _HIT_STATE
#if _HIT_STATE
- #error "SENSORLESS_HOMING requires Z_MAX_ENDSTOP_HIT_STATE HIGH for Z MAX homing with TMC2209."
+ #error "SENSORLESS_HOMING requires Z_MAX_ENDSTOP_HIT_STATE HIGH for Z MAX homing with TMC2209/2240."
#else
#error "SENSORLESS_HOMING requires Z_MAX_ENDSTOP_HIT_STATE LOW for Z MAX homing."
#endif
@@ -3437,16 +3435,16 @@ static_assert(NUM_SERVOS <= NUM_SERVO_PLUGS, "NUM_SERVOS (or some servo index) i
#endif
#if I_SENSORLESS
- #define _HIT_STATE AXIS_DRIVER_TYPE(I,TMC2209)
+ #define _HIT_STATE (AXIS_DRIVER_TYPE(I,TMC2209) || AXIS_DRIVER_TYPE(I,TMC2240))
#if I_HOME_TO_MIN && I_MIN_ENDSTOP_HIT_STATE != _HIT_STATE
#if _HIT_STATE
- #error "SENSORLESS_HOMING requires I_MIN_ENDSTOP_HIT_STATE HIGH for I MIN homing with TMC2209."
+ #error "SENSORLESS_HOMING requires I_MIN_ENDSTOP_HIT_STATE HIGH for I MIN homing with TMC2209/2240."
#else
#error "SENSORLESS_HOMING requires I_MIN_ENDSTOP_HIT_STATE LOW for I MIN homing."
#endif
#elif I_HOME_TO_MAX && I_MAX_ENDSTOP_HIT_STATE != _HIT_STATE
#if _HIT_STATE
- #error "SENSORLESS_HOMING requires I_MAX_ENDSTOP_HIT_STATE HIGH for I MAX homing with TMC2209."
+ #error "SENSORLESS_HOMING requires I_MAX_ENDSTOP_HIT_STATE HIGH for I MAX homing with TMC2209/2240."
#else
#error "SENSORLESS_HOMING requires I_MAX_ENDSTOP_HIT_STATE LOW for I MAX homing."
#endif
@@ -3455,16 +3453,16 @@ static_assert(NUM_SERVOS <= NUM_SERVO_PLUGS, "NUM_SERVOS (or some servo index) i
#endif
#if J_SENSORLESS
- #define _HIT_STATE AXIS_DRIVER_TYPE(J,TMC2209)
+ #define _HIT_STATE (AXIS_DRIVER_TYPE(J,TMC2209) || AXIS_DRIVER_TYPE(J,TMC2240))
#if J_HOME_TO_MIN && J_MIN_ENDSTOP_HIT_STATE != _HIT_STATE
#if _HIT_STATE
- #error "SENSORLESS_HOMING requires J_MIN_ENDSTOP_HIT_STATE HIGH for J MIN homing with TMC2209."
+ #error "SENSORLESS_HOMING requires J_MIN_ENDSTOP_HIT_STATE HIGH for J MIN homing with TMC2209/2240."
#else
#error "SENSORLESS_HOMING requires J_MIN_ENDSTOP_HIT_STATE LOW for J MIN homing."
#endif
#elif J_HOME_TO_MAX && J_MAX_ENDSTOP_HIT_STATE != _HIT_STATE
#if _HIT_STATE
- #error "SENSORLESS_HOMING requires J_MAX_ENDSTOP_HIT_STATE HIGH for J MAX homing with TMC2209."
+ #error "SENSORLESS_HOMING requires J_MAX_ENDSTOP_HIT_STATE HIGH for J MAX homing with TMC2209/2240."
#else
#error "SENSORLESS_HOMING requires J_MAX_ENDSTOP_HIT_STATE LOW for J MAX homing."
#endif
@@ -3473,16 +3471,16 @@ static_assert(NUM_SERVOS <= NUM_SERVO_PLUGS, "NUM_SERVOS (or some servo index) i
#endif
#if K_SENSORLESS
- #define _HIT_STATE AXIS_DRIVER_TYPE(K,TMC2209)
+ #define _HIT_STATE (AXIS_DRIVER_TYPE(K,TMC2209) || AXIS_DRIVER_TYPE(K,TMC2240))
#if K_HOME_TO_MIN && K_MIN_ENDSTOP_HIT_STATE != _HIT_STATE
#if _HIT_STATE
- #error "SENSORLESS_HOMING requires K_MIN_ENDSTOP_HIT_STATE HIGH for K MIN homing with TMC2209."
+ #error "SENSORLESS_HOMING requires K_MIN_ENDSTOP_HIT_STATE HIGH for K MIN homing with TMC2209/2240."
#else
#error "SENSORLESS_HOMING requires K_MIN_ENDSTOP_HIT_STATE LOW for K MIN homing."
#endif
#elif K_HOME_TO_MAX && K_MAX_ENDSTOP_HIT_STATE != _HIT_STATE
#if _HIT_STATE
- #error "SENSORLESS_HOMING requires K_MAX_ENDSTOP_HIT_STATE HIGH for K MAX homing with TMC2209."
+ #error "SENSORLESS_HOMING requires K_MAX_ENDSTOP_HIT_STATE HIGH for K MAX homing with TMC2209/2240."
#else
#error "SENSORLESS_HOMING requires K_MAX_ENDSTOP_HIT_STATE LOW for K MAX homing."
#endif
@@ -3491,16 +3489,16 @@ static_assert(NUM_SERVOS <= NUM_SERVO_PLUGS, "NUM_SERVOS (or some servo index) i
#endif
#if U_SENSORLESS
- #define _HIT_STATE AXIS_DRIVER_TYPE(U,TMC2209)
+ #define _HIT_STATE (AXIS_DRIVER_TYPE(U,TMC2209) || AXIS_DRIVER_TYPE(U,TMC2240))
#if U_HOME_TO_MIN && U_MIN_ENDSTOP_HIT_STATE != _HIT_STATE
#if _HIT_STATE
- #error "SENSORLESS_HOMING requires U_MIN_ENDSTOP_HIT_STATE HIGH for U MIN homing with TMC2209."
+ #error "SENSORLESS_HOMING requires U_MIN_ENDSTOP_HIT_STATE HIGH for U MIN homing with TMC2209/2240."
#else
#error "SENSORLESS_HOMING requires U_MIN_ENDSTOP_HIT_STATE LOW for U MIN homing."
#endif
#elif U_HOME_TO_MAX && U_MAX_ENDSTOP_HIT_STATE != _HIT_STATE
#if _HIT_STATE
- #error "SENSORLESS_HOMING requires U_MAX_ENDSTOP_HIT_STATE HIGH for U MAX homing with TMC2209."
+ #error "SENSORLESS_HOMING requires U_MAX_ENDSTOP_HIT_STATE HIGH for U MAX homing with TMC2209/2240."
#else
#error "SENSORLESS_HOMING requires U_MAX_ENDSTOP_HIT_STATE LOW for U MAX homing."
#endif
@@ -3509,16 +3507,16 @@ static_assert(NUM_SERVOS <= NUM_SERVO_PLUGS, "NUM_SERVOS (or some servo index) i
#endif
#if V_SENSORLESS
- #define _HIT_STATE AXIS_DRIVER_TYPE(V,TMC2209)
+ #define _HIT_STATE (AXIS_DRIVER_TYPE(V,TMC2209) || AXIS_DRIVER_TYPE(V,TMC2240))
#if V_HOME_TO_MIN && V_MIN_ENDSTOP_HIT_STATE != _HIT_STATE
#if _HIT_STATE
- #error "SENSORLESS_HOMING requires V_MIN_ENDSTOP_HIT_STATE HIGH for V MIN homing with TMC2209."
+ #error "SENSORLESS_HOMING requires V_MIN_ENDSTOP_HIT_STATE HIGH for V MIN homing with TMC2209/2240."
#else
#error "SENSORLESS_HOMING requires V_MIN_ENDSTOP_HIT_STATE LOW for V MIN homing."
#endif
#elif V_HOME_TO_MAX && V_MAX_ENDSTOP_HIT_STATE != _HIT_STATE
#if _HIT_STATE
- #error "SENSORLESS_HOMING requires V_MAX_ENDSTOP_HIT_STATE HIGH for V MAX homing with TMC2209."
+ #error "SENSORLESS_HOMING requires V_MAX_ENDSTOP_HIT_STATE HIGH for V MAX homing with TMC2209/2240."
#else
#error "SENSORLESS_HOMING requires V_MAX_ENDSTOP_HIT_STATE LOW for V MAX homing."
#endif
@@ -3527,16 +3525,16 @@ static_assert(NUM_SERVOS <= NUM_SERVO_PLUGS, "NUM_SERVOS (or some servo index) i
#endif
#if W_SENSORLESS
- #define _HIT_STATE AXIS_DRIVER_TYPE(W,TMC2209)
+ #define _HIT_STATE (AXIS_DRIVER_TYPE(W,TMC2209) || AXIS_DRIVER_TYPE(W,TMC2240))
#if W_HOME_TO_MIN && W_MIN_ENDSTOP_HIT_STATE != _HIT_STATE
#if _HIT_STATE
- #error "SENSORLESS_HOMING requires W_MIN_ENDSTOP_HIT_STATE HIGH for W MIN homing with TMC2209."
+ #error "SENSORLESS_HOMING requires W_MIN_ENDSTOP_HIT_STATE HIGH for W MIN homing with TMC2209/2240."
#else
#error "SENSORLESS_HOMING requires W_MIN_ENDSTOP_HIT_STATE LOW for W MIN homing."
#endif
#elif W_HOME_TO_MAX && W_MAX_ENDSTOP_HIT_STATE != _HIT_STATE
#if _HIT_STATE
- #error "SENSORLESS_HOMING requires W_MAX_ENDSTOP_HIT_STATE HIGH for W MAX homing with TMC2209."
+ #error "SENSORLESS_HOMING requires W_MAX_ENDSTOP_HIT_STATE HIGH for W MAX homing with TMC2209/2240."
#else
#error "SENSORLESS_HOMING requires W_MAX_ENDSTOP_HIT_STATE LOW for W MAX homing."
#endif
@@ -3633,11 +3631,11 @@ static_assert(NUM_SERVOS <= NUM_SERVO_PLUGS, "NUM_SERVOS (or some servo index) i
// Other TMC feature requirements
#if ENABLED(SENSORLESS_HOMING) && !HAS_STALLGUARD
- #error "SENSORLESS_HOMING requires TMC2130, TMC2160, TMC2209, TMC2660, or TMC5160 stepper drivers."
+ #error "SENSORLESS_HOMING requires TMC2130, TMC2160, TMC2209, TMC2240, TMC2660, or TMC5160 stepper drivers."
#elif ENABLED(SENSORLESS_PROBING) && !HAS_STALLGUARD
- #error "SENSORLESS_PROBING requires TMC2130, TMC2160, TMC2209, TMC2660, or TMC5160 stepper drivers."
+ #error "SENSORLESS_PROBING requires TMC2130, TMC2160, TMC2209, TMC2240, TMC2660, or TMC5160 stepper drivers."
#elif STEALTHCHOP_ENABLED && !HAS_STEALTHCHOP
- #error "STEALTHCHOP requires TMC2130, TMC2160, TMC2208, TMC2209, or TMC5160 stepper drivers."
+ #error "STEALTHCHOP requires TMC2130, TMC2160, TMC2208, TMC2209, TMC2240, or TMC5160 stepper drivers."
#endif
/**
@@ -3725,7 +3723,7 @@ static_assert(NUM_SERVOS <= NUM_SERVO_PLUGS, "NUM_SERVOS (or some servo index) i
* Check per-axis initializers for errors
*/
-#define __PLUS_TEST(I,A) && (sanity_arr_##A[_MIN(I,signed(COUNT(sanity_arr_##A)-1))] > 0)
+#define __PLUS_TEST(I,A) && (sanity_arr_##A[ALIM(I,sanity_arr_##A)] > 0)
#define _PLUS_TEST(A) (1 REPEAT2(14,__PLUS_TEST,A))
#if HAS_MULTI_EXTRUDER
#define _EXTRA_NOTE " (Did you forget to enable DISTINCT_E_FACTORS?)"
diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h
index 64a498179d..8d0c6361af 100644
--- a/Marlin/src/inc/Version.h
+++ b/Marlin/src/inc/Version.h
@@ -42,7 +42,7 @@
* version was tagged.
*/
#ifndef STRING_DISTRIBUTION_DATE
- #define STRING_DISTRIBUTION_DATE "2025-05-10"
+ #define STRING_DISTRIBUTION_DATE "2025-05-27"
#endif
/**
diff --git a/Marlin/src/lcd/e3v2/jyersui/dwin.cpp b/Marlin/src/lcd/e3v2/jyersui/dwin.cpp
index aa087cefc4..f2c54da745 100644
--- a/Marlin/src/lcd/e3v2/jyersui/dwin.cpp
+++ b/Marlin/src/lcd/e3v2/jyersui/dwin.cpp
@@ -2398,10 +2398,13 @@ void JyersDWIN::menuItemHandler(const uint8_t menu, const uint8_t item, bool dra
case MOTION_LA:
if (draw) {
drawMenuItem(row, ICON_MaxAccelerated, GET_TEXT_F(MSG_ADVANCE_K));
- drawFloat(planner.extruder_advance_K[0], row, false, 100);
+ drawFloat(planner.get_advance_k(), row, false, 100);
}
- else
- modifyValue(planner.extruder_advance_K[0], 0, 10, 100);
+ else {
+ static float k = planner.get_advance_k();
+ modifyValue(k, 0, 10, 100, []{ planner.set_advance_k(k); });
+ }
+
break;
#endif
}
@@ -2914,10 +2917,12 @@ void JyersDWIN::menuItemHandler(const uint8_t menu, const uint8_t item, bool dra
case ADVANCED_LA:
if (draw) {
drawMenuItem(row, ICON_MaxAccelerated, GET_TEXT_F(MSG_ADVANCE_K));
- drawFloat(planner.extruder_advance_K[0], row, false, 100);
+ drawFloat(planner.get_advance_k(), row, false, 100);
+ }
+ else {
+ static float k = planner.get_advance_k();
+ modifyValue(k, 0, 10, 100, []{ planner.set_advance_k(k); });
}
- else
- modifyValue(planner.extruder_advance_K[0], 0, 10, 100);
break;
#endif
@@ -3925,10 +3930,12 @@ void JyersDWIN::menuItemHandler(const uint8_t menu, const uint8_t item, bool dra
case TUNE_LA:
if (draw) {
drawMenuItem(row, ICON_MaxAccelerated, GET_TEXT_F(MSG_ADVANCE_K));
- drawFloat(planner.extruder_advance_K[0], row, false, 100);
+ drawFloat(planner.get_advance_k(), row, false, 100);
+ }
+ else {
+ static float k = planner.get_advance_k();
+ modifyValue(k, 0, 10, 100, []{ planner.set_advance_k(k); });
}
- else
- modifyValue(planner.extruder_advance_K[0], 0, 10, 100);
break;
#endif
diff --git a/Marlin/src/lcd/e3v2/proui/dwin.cpp b/Marlin/src/lcd/e3v2/proui/dwin.cpp
index c3a69c1c66..9d857f1e3a 100644
--- a/Marlin/src/lcd/e3v2/proui/dwin.cpp
+++ b/Marlin/src/lcd/e3v2/proui/dwin.cpp
@@ -2382,6 +2382,7 @@ void setMoveZ() { hmiValue.axis = Z_AXIS; setPFloatOnClick(Z_MIN_POS, Z_MAX_POS,
#endif
void setSpeed() { setPIntOnClick(SPEED_EDIT_MIN, SPEED_EDIT_MAX); }
+void setFlow() { setPIntOnClick(FLOW_EDIT_MIN, FLOW_EDIT_MAX, []{ planner.refresh_e_factor(0); }); }
#if HAS_HOTEND
void applyHotendTemp() { thermalManager.setTargetHotend(menuData.value, 0); }
@@ -2426,8 +2427,6 @@ void setSpeed() { setPIntOnClick(SPEED_EDIT_MIN, SPEED_EDIT_MAX); }
#endif // ADVANCED_PAUSE_FEATURE
-void setFlow() { setPIntOnClick(FLOW_EDIT_MIN, FLOW_EDIT_MAX, []{ planner.refresh_e_factor(0); }); }
-
// Bed Tramming
#if ENABLED(LCD_BED_TRAMMING)
@@ -2596,23 +2595,25 @@ void setFlow() { setPIntOnClick(FLOW_EDIT_MIN, FLOW_EDIT_MAX, []{ planner.refres
#if ENABLED(MESH_BED_LEVELING)
+ #define MESH_Z_FDIGITS 2
+
void manualMeshStart() {
LCD_MESSAGE(MSG_UBL_BUILD_MESH_MENU);
gcode.process_subcommands_now(F("G28XYO\nG28Z\nM211S0\nG29S1"));
#ifdef MANUAL_PROBE_START_Z
const uint8_t line = currentMenu->line(mMeshMoveZItem->pos);
- DWINUI::drawSignedFloat(hmiData.colorText, hmiData.colorBackground, 3, 2, VALX - 2 * DWINUI::fontWidth(DWIN_FONT_MENU), MBASE(line), MANUAL_PROBE_START_Z);
+ DWINUI::drawSignedFloat(hmiData.colorText, hmiData.colorBackground, 3, MESH_Z_FDIGITS, VALX - 2 * DWINUI::fontWidth(DWIN_FONT_MENU), MBASE(line), MANUAL_PROBE_START_Z);
#endif
}
void liveMeshMoveZ() {
- *menuData.floatPtr = menuData.value / POW(10, 2);
+ *menuData.floatPtr = menuData.value / POW(10, MESH_Z_FDIGITS);
if (!planner.is_full()) {
planner.synchronize();
planner.buffer_line(current_position, manual_feedrate_mm_s[Z_AXIS]);
}
}
- void setMMeshMoveZ() { setPFloatOnClick(-1, 1, 2, planner.synchronize, liveMeshMoveZ); }
+ void setMMeshMoveZ() { setPFloatOnClick(-1, 1, MESH_Z_FDIGITS, planner.synchronize, liveMeshMoveZ); }
void manualMeshContinue() {
gcode.process_subcommands_now(F("G29S2"));
@@ -2686,7 +2687,9 @@ void applyMaxAccel() { planner.set_max_acceleration(hmiValue.axis, menuData.valu
#endif
#if ENABLED(LIN_ADVANCE)
- void setLA_K() { setPFloatOnClick(0, 10, 3); }
+ #define LA_FDIGITS 3
+ void applyLA_K() { planner.set_advance_k(menuData.value / POW(10, LA_FDIGITS)); }
+ void setLA_K() { setPFloatOnClick(0, 10, LA_FDIGITS, applyLA_K); }
#endif
#if HAS_X_AXIS
@@ -3514,6 +3517,7 @@ void drawTuneMenu() {
if (SET_MENU_R(tuneMenu, selrect({73, 2, 28, 12}), MSG_TUNE, items)) {
BACK_ITEM(gotoPrintProcess);
EDIT_ITEM(ICON_Speed, MSG_SPEED, onDrawSpeedItem, setSpeed, &feedrate_percentage);
+ EDIT_ITEM(ICON_Flow, MSG_FLOW, onDrawPIntMenu, setFlow, &planner.flow_percentage[0]);
#if HAS_HOTEND
hotendTargetItem = EDIT_ITEM(ICON_HotendTemp, MSG_UBL_SET_TEMP_HOTEND, onDrawHotendTemp, setHotendTemp, &thermalManager.temp_hotend[0].target);
#endif
@@ -3528,7 +3532,6 @@ void drawTuneMenu() {
#elif ALL(HAS_ZOFFSET_ITEM, MESH_BED_LEVELING, BABYSTEPPING)
EDIT_ITEM(ICON_Zoffset, MSG_HOME_OFFSET_Z, onDrawPFloat2Menu, setZOffset, &BABY_Z_VAR);
#endif
- EDIT_ITEM(ICON_Flow, MSG_FLOW, onDrawPIntMenu, setFlow, &planner.flow_percentage[0]);
#if ENABLED(ADVANCED_PAUSE_FEATURE)
MENU_ITEM(ICON_FilMan, MSG_FILAMENTCHANGE, onDrawMenuItem, changeFilament);
#endif
@@ -3545,7 +3548,8 @@ void drawTuneMenu() {
EDIT_ITEM(ICON_JDmm, MSG_JUNCTION_DEVIATION, onDrawPFloat3Menu, setJDmm, &planner.junction_deviation_mm);
#endif
#if ENABLED(PROUI_ITEM_ADVK)
- EDIT_ITEM(ICON_MaxAccelerated, MSG_ADVANCE_K, onDrawPFloat3Menu, setLA_K, &planner.extruder_advance_K[0]);
+ float editable_k = planner.get_advance_k();
+ EDIT_ITEM(ICON_MaxAccelerated, MSG_ADVANCE_K, onDrawPFloat3Menu, setLA_K, &editable_k);
#endif
#if HAS_LOCKSCREEN
MENU_ITEM(ICON_Lock, MSG_LOCKSCREEN, onDrawMenuItem, dwinLockScreen);
@@ -3683,7 +3687,8 @@ void drawMotionMenu() {
MENU_ITEM(ICON_Homing, MSG_HOMING_FEEDRATE, onDrawSubMenu, drawHomingFRMenu);
#endif
#if ENABLED(LIN_ADVANCE)
- EDIT_ITEM(ICON_MaxAccelerated, MSG_ADVANCE_K, onDrawPFloat3Menu, setLA_K, &planner.extruder_advance_K[0]);
+ float editable_k = planner.get_advance_k();
+ EDIT_ITEM(ICON_MaxAccelerated, MSG_ADVANCE_K, onDrawPFloat3Menu, setLA_K, &editable_k);
#endif
#if ENABLED(SHAPING_MENU)
MENU_ITEM(ICON_InputShaping, MSG_INPUT_SHAPING, onDrawSubMenu, drawInputShaping_menu);
@@ -3691,8 +3696,8 @@ void drawMotionMenu() {
#if ENABLED(ADAPTIVE_STEP_SMOOTHING_TOGGLE)
EDIT_ITEM(ICON_UBLActive, MSG_STEP_SMOOTHING, onDrawChkbMenu, setAdaptiveStepSmoothing, &stepper.adaptive_step_smoothing_enabled);
#endif
+ EDIT_ITEM(ICON_Speed, MSG_SPEED, onDrawSpeedItem, setSpeed, &feedrate_percentage);
EDIT_ITEM(ICON_Flow, MSG_FLOW, onDrawPIntMenu, setFlow, &planner.flow_percentage[0]);
- EDIT_ITEM(ICON_Speed, MSG_SPEED, onDrawPIntMenu, setSpeed, &feedrate_percentage);
}
updateMenu(motionMenu);
}
@@ -4025,9 +4030,10 @@ void drawMaxAccelMenu() {
void setSensorResponse() { setPFloatOnClick(0, 1, 4); }
void setAmbientXfer() { setPFloatOnClick(0, 1, 4); }
#if ENABLED(MPC_INCLUDE_FAN)
- void onDrawFanAdj(MenuItem* menuitem, int8_t line) { onDrawFloatMenu(menuitem, line, 4, thermalManager.temp_hotend[0].fanCoefficient()); }
- void applyFanAdj() { thermalManager.temp_hotend[0].applyFanAdjustment(menuData.value / POW(10, 4)); }
- void setFanAdj() { setFloatOnClick(0, 1, 4, thermalManager.temp_hotend[0].fanCoefficient(), applyFanAdj); }
+ #define MPC_FAN_FDIGITS 4
+ void onDrawFanAdj(MenuItem* menuitem, int8_t line) { onDrawFloatMenu(menuitem, line, MPC_FAN_FDIGITS, thermalManager.temp_hotend[0].fanCoefficient()); }
+ void applyFanAdj() { thermalManager.temp_hotend[0].applyFanAdjustment(menuData.value / POW(10, MPC_FAN_FDIGITS)); }
+ void setFanAdj() { setFloatOnClick(0, 1, MPC_FAN_FDIGITS, thermalManager.temp_hotend[0].fanCoefficient(), applyFanAdj); }
#endif
#endif
@@ -4071,27 +4077,28 @@ void drawMaxAccelMenu() {
#endif
#if ENABLED(PID_EDIT_MENU)
- void setKp() { setPFloatOnClick(0, 1000, 2); }
+ #define PID_FDIGITS 2
+ void setKp() { setPFloatOnClick(0, 1000, PID_FDIGITS); }
void applyPIDi() {
- *menuData.floatPtr = scalePID_i(menuData.value / POW(10, 2));
+ *menuData.floatPtr = scalePID_i(menuData.value / POW(10, PID_FDIGITS));
TERN_(PIDTEMP, thermalManager.updatePID());
}
void applyPIDd() {
- *menuData.floatPtr = scalePID_d(menuData.value / POW(10, 2));
+ *menuData.floatPtr = scalePID_d(menuData.value / POW(10, PID_FDIGITS));
TERN_(PIDTEMP, thermalManager.updatePID());
}
void setKi() {
menuData.floatPtr = (float*)static_cast(currentMenu->selectedItem())->value;
const float value = unscalePID_i(*menuData.floatPtr);
- setFloatOnClick(0, 1000, 2, value, applyPIDi);
+ setFloatOnClick(0, 1000, PID_FDIGITS, value, applyPIDi);
}
void setKd() {
menuData.floatPtr = (float*)static_cast(currentMenu->selectedItem())->value;
const float value = unscalePID_d(*menuData.floatPtr);
- setFloatOnClick(0, 1000, 2, value, applyPIDd);
+ setFloatOnClick(0, 1000, PID_FDIGITS, value, applyPIDd);
}
- void onDrawPIDi(MenuItem* menuitem, int8_t line) { onDrawFloatMenu(menuitem, line, 2, unscalePID_i(*(float*)static_cast(menuitem)->value)); }
- void onDrawPIDd(MenuItem* menuitem, int8_t line) { onDrawFloatMenu(menuitem, line, 2, unscalePID_d(*(float*)static_cast(menuitem)->value)); }
+ void onDrawPIDi(MenuItem* menuitem, int8_t line) { onDrawFloatMenu(menuitem, line, PID_FDIGITS, unscalePID_i(*(float*)static_cast(menuitem)->value)); }
+ void onDrawPIDd(MenuItem* menuitem, int8_t line) { onDrawFloatMenu(menuitem, line, PID_FDIGITS, unscalePID_d(*(float*)static_cast(menuitem)->value)); }
#endif // PID_EDIT_MENU
#endif // HAS_PID_HEATING
diff --git a/Marlin/src/lcd/extui/mks_ui/draw_number_key.cpp b/Marlin/src/lcd/extui/mks_ui/draw_number_key.cpp
index c44cabd10a..a117775793 100644
--- a/Marlin/src/lcd/extui/mks_ui/draw_number_key.cpp
+++ b/Marlin/src/lcd/extui/mks_ui/draw_number_key.cpp
@@ -243,10 +243,10 @@ static void set_value_confirm() {
#if HAS_Z_AXIS
case ZMaxFeedRate: planner.settings.max_feedrate_mm_s[Z_AXIS] = atof(key_value); break;
#endif
- #if HAS_E0_AXIS
+ #if HAS_EXTRUDERS
case E0MaxFeedRate: planner.settings.max_feedrate_mm_s[E_AXIS] = atof(key_value); break;
#endif
- #if HAS_E1_AXIS
+ #if HAS_MULTI_EXTRUDER
case E1MaxFeedRate: planner.settings.max_feedrate_mm_s[E_AXIS_N(1)] = atof(key_value); break;
#endif
diff --git a/Marlin/src/lcd/extui/ui_api.cpp b/Marlin/src/lcd/extui/ui_api.cpp
index b3f4c39c24..badb3335a3 100644
--- a/Marlin/src/lcd/extui/ui_api.cpp
+++ b/Marlin/src/lcd/extui/ui_api.cpp
@@ -643,12 +643,12 @@ namespace ExtUI {
#if ENABLED(LIN_ADVANCE)
float getLinearAdvance_mm_mm_s(const extruder_t extruder) {
- return (extruder < EXTRUDERS) ? planner.extruder_advance_K[E_INDEX_N(extruder - E0)] : 0;
+ return (extruder < EXTRUDERS) ? planner.get_advance_k(E_INDEX_N(extruder - E0)) : 0;
}
void setLinearAdvance_mm_mm_s(const_float_t value, const extruder_t extruder) {
if (extruder < EXTRUDERS)
- planner.extruder_advance_K[E_INDEX_N(extruder - E0)] = constrain(value, 0, 10);
+ planner.set_advance_k(constrain(value, 0, 10), E_INDEX_N(extruder - E0));
}
#endif
@@ -887,14 +887,14 @@ namespace ExtUI {
y_target = MESH_MIN_Y + pos.y * (MESH_Y_DIST);
if (x_target != current_position.x || y_target != current_position.y) {
// If moving across bed, raise nozzle to safe height over bed
- feedrate_mm_s = MMM_TO_MMS(Z_PROBE_FEEDRATE_FAST);
+ feedrate_mm_s = z_probe_fast_mm_s;
destination.set(current_position.x, current_position.y, Z_CLEARANCE_BETWEEN_PROBES);
prepare_line_to_destination();
if (XY_PROBE_FEEDRATE_MM_S) feedrate_mm_s = XY_PROBE_FEEDRATE_MM_S;
destination.set(x_target, y_target);
prepare_line_to_destination();
}
- feedrate_mm_s = MMM_TO_MMS(Z_PROBE_FEEDRATE_FAST);
+ feedrate_mm_s = z_probe_fast_mm_s;
destination.z = z;
prepare_line_to_destination();
#else
diff --git a/Marlin/src/lcd/language/language_cz.h b/Marlin/src/lcd/language/language_cz.h
index ac23bc8daf..2b5fb524d4 100644
--- a/Marlin/src/lcd/language/language_cz.h
+++ b/Marlin/src/lcd/language/language_cz.h
@@ -45,13 +45,14 @@ namespace LanguageNarrow_cz {
LSTR MSG_YES = _UxGT("ANO");
LSTR MSG_NO = _UxGT("NE");
LSTR MSG_BACK = _UxGT("Zpět");
+
LSTR MSG_MEDIA_ABORTING = _UxGT("Rušení...");
LSTR MSG_MEDIA_INSERTED = _UxGT("Médium vloženo");
LSTR MSG_MEDIA_REMOVED = _UxGT("Médium vyjmuto");
- LSTR MSG_MEDIA_WAITING = _UxGT("Čekání na médium");
LSTR MSG_MEDIA_READ_ERROR = _UxGT("Chyba čtení média");
- LSTR MSG_MEDIA_USB_REMOVED = _UxGT("USB odstraněno");
- LSTR MSG_MEDIA_USB_FAILED = _UxGT("Chyba USB");
+ LSTR MSG_USB_FD_DEVICE_REMOVED = _UxGT("USB odstraněno");
+ LSTR MSG_USB_FD_USB_FAILED = _UxGT("Chyba USB");
+
LSTR MSG_LCD_ENDSTOPS = _UxGT("Endstopy"); // max 8 znaku
LSTR MSG_LCD_SOFT_ENDSTOPS = _UxGT("Soft Endstopy");
LSTR MSG_MAIN_MENU = _UxGT("Hlavní nabídka");
diff --git a/Marlin/src/lcd/language/language_de.h b/Marlin/src/lcd/language/language_de.h
index e681317fb8..4f2cdb79ff 100644
--- a/Marlin/src/lcd/language/language_de.h
+++ b/Marlin/src/lcd/language/language_de.h
@@ -41,15 +41,16 @@ namespace LanguageNarrow_de {
LSTR MSG_LOW = _UxGT("RUNTER");
LSTR MSG_BACK = _UxGT("Zurück");
LSTR MSG_ERROR = _UxGT("Fehler");
+
LSTR MSG_MEDIA_ABORTING = _UxGT("Abbruch...");
LSTR MSG_MEDIA_INSERTED = _UxGT("Medium erkannt");
LSTR MSG_MEDIA_REMOVED = _UxGT("Medium entfernt");
- LSTR MSG_MEDIA_WAITING = _UxGT("Warten auf Medium");
LSTR MSG_MEDIA_INIT_FAIL = _UxGT("Medium Init fehlgesch.");
LSTR MSG_MEDIA_READ_ERROR = _UxGT("Medium Lesefehler");
- LSTR MSG_MEDIA_USB_REMOVED = _UxGT("USB Gerät entfernt");
- LSTR MSG_MEDIA_USB_FAILED = _UxGT("USB Start fehlge.");
+ LSTR MSG_USB_FD_DEVICE_REMOVED = _UxGT("USB Gerät entfernt");
+ LSTR MSG_USB_FD_USB_FAILED = _UxGT("USB Start fehlge.");
LSTR MSG_KILL_SUBCALL_OVERFLOW = _UxGT("Subcall überschritten");
+
LSTR MSG_LCD_ENDSTOPS = _UxGT("Endstopp"); // Max length 8 characters
LSTR MSG_LCD_SOFT_ENDSTOPS = _UxGT("Software-Endstopp");
LSTR MSG_MAIN_MENU = _UxGT("Hauptmenü");
diff --git a/Marlin/src/lcd/language/language_el.h b/Marlin/src/lcd/language/language_el.h
index 0d3d355cb0..ab816adae0 100644
--- a/Marlin/src/lcd/language/language_el.h
+++ b/Marlin/src/lcd/language/language_el.h
@@ -45,12 +45,12 @@ namespace LanguageNarrow_el {
LSTR MSG_MEDIA_INSERTED = _UxGT("Κάρτα εισήχθη");
LSTR MSG_MEDIA_REMOVED = _UxGT("Κάρτα αφαιρέθη");
- LSTR MSG_MEDIA_WAITING = _UxGT("Αναμονή για κάρτα");
LSTR MSG_MEDIA_ABORTING = _UxGT("Ματαίωση...");
- LSTR MSG_MEDIA_READ_ERROR = MEDIA_TYPE_EN _UxGT(" σφάλμα ανάγνωσης");
- LSTR MSG_MEDIA_USB_REMOVED = _UxGT("USB αφαιρέθη");
- LSTR MSG_MEDIA_USB_FAILED = _UxGT("Αποτυχία εκκίνησης USB");
LSTR MSG_MEDIA_INIT_FAIL = _UxGT("Αποτυχία αρχικοποίησης SD");
+ LSTR MSG_MEDIA_READ_ERROR = MEDIA_TYPE_EN _UxGT(" σφάλμα ανάγνωσης");
+ LSTR MSG_USB_FD_DEVICE_REMOVED = _UxGT("USB αφαιρέθη");
+ LSTR MSG_USB_FD_USB_FAILED = _UxGT("Αποτυχία εκκίνησης USB");
+
LSTR MSG_MAIN_MENU = _UxGT("Αρχική Οθόνη");
LSTR MSG_DISABLE_STEPPERS = _UxGT("Απενεργοποίηση μοτέρ");
LSTR MSG_AUTO_HOME = _UxGT("Αυτόμ. επαναφορά XYZ");
diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h
index 5ed5b24635..a74d28b82a 100644
--- a/Marlin/src/lcd/language/language_en.h
+++ b/Marlin/src/lcd/language/language_en.h
@@ -90,17 +90,16 @@ namespace LanguageNarrow_en {
LSTR MSG_MEDIA_REMOVED = MEDIA_TYPE_EN _UxGT(" Removed");
LSTR MSG_MEDIA_REMOVED_SD = _UxGT("SD Card Removed");
LSTR MSG_MEDIA_REMOVED_USB = _UxGT("USB Drive Removed");
- LSTR MSG_MEDIA_WAITING = _UxGT("Waiting for ") MEDIA_TYPE_EN;
- LSTR MSG_MEDIA_WAITING_SD = _UxGT("Waiting for SD Card");
- LSTR MSG_MEDIA_WAITING_USB = _UxGT("Waiting for USB Drive");
LSTR MSG_MEDIA_INIT_FAIL = MEDIA_TYPE_EN _UxGT(" Init Fail");
LSTR MSG_MEDIA_INIT_FAIL_SD = _UxGT("SD Card Init Fail");
LSTR MSG_MEDIA_INIT_FAIL_USB = _UxGT("USB Drive Init Fail");
LSTR MSG_MEDIA_READ_ERROR = MEDIA_TYPE_EN _UxGT(" read error");
- LSTR MSG_MEDIA_USB_REMOVED = _UxGT("USB device removed");
- LSTR MSG_MEDIA_USB_FAILED = _UxGT("USB start failed");
LSTR MSG_MEDIA_SORT = _UxGT("Sort ") MEDIA_TYPE_EN;
LSTR MSG_MEDIA_UPDATE = MEDIA_TYPE_EN _UxGT(" Update");
+ LSTR MSG_USB_FD_WAITING_FOR_MEDIA = _UxGT("Wait for USB Drive");
+ LSTR MSG_USB_FD_MEDIA_REMOVED = _UxGT("USB Drive Removed");
+ LSTR MSG_USB_FD_DEVICE_REMOVED = _UxGT("USB device removed");
+ LSTR MSG_USB_FD_USB_FAILED = _UxGT("USB start failed");
LSTR MSG_KILL_SUBCALL_OVERFLOW = _UxGT("Subcall Overflow");
LSTR MSG_LCD_ENDSTOPS = _UxGT("Endstops"); // Max length 8 characters
diff --git a/Marlin/src/lcd/language/language_es.h b/Marlin/src/lcd/language/language_es.h
index a92efd5389..2646a85f09 100644
--- a/Marlin/src/lcd/language/language_es.h
+++ b/Marlin/src/lcd/language/language_es.h
@@ -46,15 +46,16 @@ namespace LanguageNarrow_es {
LSTR MSG_YES = _UxGT("SI");
LSTR MSG_NO = _UxGT("NO");
LSTR MSG_BACK = _UxGT("Atrás");
+
LSTR MSG_MEDIA_ABORTING = _UxGT("Cancelando...");
LSTR MSG_MEDIA_INSERTED = MEDIA_TYPE_ES _UxGT(" insertado");
LSTR MSG_MEDIA_REMOVED = MEDIA_TYPE_ES _UxGT(" retirado");
- LSTR MSG_MEDIA_WAITING = _UxGT("Esperando al ") MEDIA_TYPE_ES;
LSTR MSG_MEDIA_INIT_FAIL = _UxGT("Fallo al iniciar ") MEDIA_TYPE_ES;
LSTR MSG_MEDIA_READ_ERROR = _UxGT("Error lectura ") MEDIA_TYPE_ES;
- LSTR MSG_MEDIA_USB_REMOVED = _UxGT("Disp. USB retirado");
- LSTR MSG_MEDIA_USB_FAILED = _UxGT("Inicio USB fallido");
+ LSTR MSG_USB_FD_DEVICE_REMOVED = _UxGT("Disp. USB retirado");
+ LSTR MSG_USB_FD_USB_FAILED = _UxGT("Inicio USB fallido");
LSTR MSG_KILL_SUBCALL_OVERFLOW = _UxGT("Desbordamiento de subllamada");
+
LSTR MSG_LCD_ENDSTOPS = _UxGT("Endstops"); // Max length 8 characters
LSTR MSG_LCD_SOFT_ENDSTOPS = _UxGT("Soft Endstops");
LSTR MSG_MAIN_MENU = _UxGT("Menú principal");
diff --git a/Marlin/src/lcd/language/language_fr.h b/Marlin/src/lcd/language/language_fr.h
index 6d9fd3b4f4..6f0e870807 100644
--- a/Marlin/src/lcd/language/language_fr.h
+++ b/Marlin/src/lcd/language/language_fr.h
@@ -40,13 +40,14 @@ namespace LanguageNarrow_fr {
LSTR MSG_YES = _UxGT("Oui");
LSTR MSG_NO = _UxGT("Non");
LSTR MSG_BACK = _UxGT("Retour");
+
LSTR MSG_MEDIA_ABORTING = _UxGT("Annulation...");
LSTR MSG_MEDIA_INSERTED = _UxGT("Média inséré");
LSTR MSG_MEDIA_REMOVED = _UxGT("Média retiré");
- LSTR MSG_MEDIA_WAITING = _UxGT("Attente média");
LSTR MSG_MEDIA_READ_ERROR = _UxGT("Err lecture média");
- LSTR MSG_MEDIA_USB_REMOVED = _UxGT("USB débranché");
- LSTR MSG_MEDIA_USB_FAILED = _UxGT("Erreur média USB");
+ LSTR MSG_USB_FD_DEVICE_REMOVED = _UxGT("USB débranché");
+ LSTR MSG_USB_FD_USB_FAILED = _UxGT("Erreur média USB");
+
LSTR MSG_LCD_ENDSTOPS = _UxGT("Butées");
LSTR MSG_LCD_SOFT_ENDSTOPS = _UxGT("Butées SW");
LSTR MSG_MAIN_MENU = _UxGT("Menu principal");
diff --git a/Marlin/src/lcd/language/language_fr_na.h b/Marlin/src/lcd/language/language_fr_na.h
index 07f2b86499..ef1e29a6b9 100644
--- a/Marlin/src/lcd/language/language_fr_na.h
+++ b/Marlin/src/lcd/language/language_fr_na.h
@@ -40,13 +40,14 @@ namespace LanguageNarrow_fr_na {
LSTR MSG_YES = _UxGT("Oui");
LSTR MSG_NO = _UxGT("Non");
LSTR MSG_BACK = _UxGT("Retour");
+
LSTR MSG_MEDIA_ABORTING = _UxGT("Annulation...");
LSTR MSG_MEDIA_INSERTED = _UxGT("Media insere");
LSTR MSG_MEDIA_REMOVED = _UxGT("Media retire");
- LSTR MSG_MEDIA_WAITING = _UxGT("Attente media");
LSTR MSG_MEDIA_READ_ERROR = _UxGT("Err lecture media");
- LSTR MSG_MEDIA_USB_REMOVED = _UxGT("USB debranche");
- LSTR MSG_MEDIA_USB_FAILED = _UxGT("Erreur media USB");
+ LSTR MSG_USB_FD_DEVICE_REMOVED = _UxGT("USB debranche");
+ LSTR MSG_USB_FD_USB_FAILED = _UxGT("Erreur media USB");
+
LSTR MSG_LCD_ENDSTOPS = _UxGT("Butees");
LSTR MSG_LCD_SOFT_ENDSTOPS = _UxGT("Butees SW");
LSTR MSG_MAIN_MENU = _UxGT("Menu principal");
diff --git a/Marlin/src/lcd/language/language_gl.h b/Marlin/src/lcd/language/language_gl.h
index 3b7620de90..6285626625 100644
--- a/Marlin/src/lcd/language/language_gl.h
+++ b/Marlin/src/lcd/language/language_gl.h
@@ -48,14 +48,15 @@ namespace LanguageNarrow_gl {
LSTR MSG_YES = _UxGT("SI");
LSTR MSG_NO = _UxGT("NON");
LSTR MSG_BACK = _UxGT("Atrás");
+
LSTR MSG_MEDIA_ABORTING = _UxGT("Cancelando...");
LSTR MSG_MEDIA_INSERTED = _UxGT("Tarxeta inserida");
LSTR MSG_MEDIA_REMOVED = _UxGT("Tarxeta retirada");
- LSTR MSG_MEDIA_WAITING = _UxGT("Agardando ao ") MEDIA_TYPE_GL;
LSTR MSG_MEDIA_READ_ERROR = _UxGT("Erro lectura ") MEDIA_TYPE_GL;
- LSTR MSG_MEDIA_USB_REMOVED = _UxGT("Disp. USB retirado");
- LSTR MSG_MEDIA_USB_FAILED = _UxGT("Inicio USB fallido");
+ LSTR MSG_USB_FD_DEVICE_REMOVED = _UxGT("Disp. USB retirado");
+ LSTR MSG_USB_FD_USB_FAILED = _UxGT("Inicio USB fallido");
LSTR MSG_KILL_SUBCALL_OVERFLOW = _UxGT("Desbord. Subch.");
+
LSTR MSG_LCD_ENDSTOPS = _UxGT("FinCarro");
LSTR MSG_LCD_SOFT_ENDSTOPS = _UxGT("FinCarro SW");
LSTR MSG_MAIN_MENU = _UxGT("Menú principal");
diff --git a/Marlin/src/lcd/language/language_hu.h b/Marlin/src/lcd/language/language_hu.h
index 3159b79827..7a3e51539c 100644
--- a/Marlin/src/lcd/language/language_hu.h
+++ b/Marlin/src/lcd/language/language_hu.h
@@ -43,15 +43,16 @@ namespace LanguageNarrow_hu {
LSTR MSG_YES = _UxGT("IGEN");
LSTR MSG_NO = _UxGT("NEM");
LSTR MSG_BACK = _UxGT("Vissza");
+
LSTR MSG_MEDIA_ABORTING = _UxGT("Megszakítás...");
LSTR MSG_MEDIA_INSERTED = _UxGT("Tároló behelyezve");
LSTR MSG_MEDIA_REMOVED = _UxGT("Tároló eltávolítva");
- LSTR MSG_MEDIA_WAITING = _UxGT("Várakozás a tárolóra");
LSTR MSG_MEDIA_INIT_FAIL = _UxGT("Tároló-kártya hiba");
LSTR MSG_MEDIA_READ_ERROR = _UxGT("Tároló olvasási hiba");
- LSTR MSG_MEDIA_USB_REMOVED = _UxGT("USB eltávolítva");
- LSTR MSG_MEDIA_USB_FAILED = _UxGT("USB eszköz hiba");
+ LSTR MSG_USB_FD_DEVICE_REMOVED = _UxGT("USB eltávolítva");
+ LSTR MSG_USB_FD_USB_FAILED = _UxGT("USB eszköz hiba");
LSTR MSG_KILL_SUBCALL_OVERFLOW = _UxGT("Túlfolyás");
+
LSTR MSG_LCD_ENDSTOPS = _UxGT("Végállás"); // Maximum 8 karakter
LSTR MSG_LCD_SOFT_ENDSTOPS = _UxGT("Szoft. végállás");
LSTR MSG_MAIN_MENU = _UxGT("");
diff --git a/Marlin/src/lcd/language/language_it.h b/Marlin/src/lcd/language/language_it.h
index 4bcde87859..dbf093c042 100644
--- a/Marlin/src/lcd/language/language_it.h
+++ b/Marlin/src/lcd/language/language_it.h
@@ -59,16 +59,25 @@ namespace LanguageNarrow_it {
LSTR MSG_LOW = _UxGT("BASSO");
LSTR MSG_BACK = _UxGT("Indietro");
LSTR MSG_ERROR = _UxGT("Errore");
+
LSTR MSG_MEDIA_ABORTING = _UxGT("Annullando...");
- LSTR MSG_MEDIA_INSERTED = MEDIA_TYPE_IT _UxGT(" inserito");
- LSTR MSG_MEDIA_REMOVED = MEDIA_TYPE_IT _UxGT(" rimosso");
- LSTR MSG_MEDIA_WAITING = _UxGT("Aspettando ") MEDIA_TYPE_IT;
+ LSTR MSG_MEDIA_INSERTED = MEDIA_TYPE_IT _UxGT(" inserita");
+ LSTR MSG_MEDIA_INSERTED_SD = _UxGT("Scheda SD inserita");
+ LSTR MSG_MEDIA_INSERTED_USB = _UxGT("Unità USB inserita");
+ LSTR MSG_MEDIA_REMOVED = MEDIA_TYPE_IT _UxGT(" rimossa");
+ LSTR MSG_MEDIA_REMOVED_SD = _UxGT("Scheda SD rimossa");
+ LSTR MSG_MEDIA_REMOVED_USB = _UxGT("Unità USB rimossa");
LSTR MSG_MEDIA_INIT_FAIL = _UxGT("Iniz.") MEDIA_TYPE_IT _UxGT(" fallita");
+ LSTR MSG_MEDIA_INIT_FAIL_SD = _UxGT("Iniz. SD fallita");
+ LSTR MSG_MEDIA_INIT_FAIL_USB = _UxGT("Iniz. USB fallita");
LSTR MSG_MEDIA_READ_ERROR = _UxGT("Err.leggendo ") MEDIA_TYPE_IT;
- LSTR MSG_MEDIA_USB_REMOVED = _UxGT("Dispos.USB rimosso");
- LSTR MSG_MEDIA_USB_FAILED = _UxGT("Avvio USB fallito");
LSTR MSG_MEDIA_SORT = _UxGT("Ordina ") MEDIA_TYPE_IT;
LSTR MSG_MEDIA_UPDATE = _UxGT("Aggiorna ") MEDIA_TYPE_IT;
+ LSTR MSG_USB_FD_WAITING_FOR_MEDIA = _UxGT("In attesa unità USB");
+ LSTR MSG_USB_FD_MEDIA_REMOVED = _UxGT("Unità USB rimossa");
+ LSTR MSG_USB_FD_DEVICE_REMOVED = _UxGT("Unità USB rimossa");
+ LSTR MSG_USB_FD_USB_FAILED = _UxGT("Iniz. USB fallita");
+
LSTR MSG_KILL_SUBCALL_OVERFLOW = _UxGT("Overflow sottochiamate");
LSTR MSG_LCD_ENDSTOPS = _UxGT("Finecor."); // Max 8 characters
LSTR MSG_LCD_SOFT_ENDSTOPS = _UxGT("Finecorsa soft");
@@ -133,11 +142,12 @@ namespace LanguageNarrow_it {
LSTR MSG_PREHEAT_M = _UxGT("Preriscalda $");
LSTR MSG_PREHEAT_M_H = _UxGT("Preriscalda $ ~");
- LSTR MSG_PREHEAT_M_END = _UxGT("Preris.$ ugello");
- LSTR MSG_PREHEAT_M_END_E = _UxGT("Preris.$ ugello ~");
- LSTR MSG_PREHEAT_M_ALL = _UxGT("Preris.$ tutto");
- LSTR MSG_PREHEAT_M_BEDONLY = _UxGT("Preris.$ piatto");
- LSTR MSG_PREHEAT_M_SETTINGS = _UxGT("Preris.$ conf");
+ LSTR MSG_PREHEAT_M_END = _UxGT("Preris.ugello $");
+ LSTR MSG_PREHEAT_M_END_E = _UxGT("Preris.ugello ~ $");
+ LSTR MSG_PREHEAT_M_ALL = _UxGT("Preris.tutto $");
+ LSTR MSG_PREHEAT_M_BEDONLY = _UxGT("Preris.piatto $");
+ LSTR MSG_PREHEAT_M_CHAMBER = _UxGT("Preris.camera $");
+ LSTR MSG_PREHEAT_M_SETTINGS = _UxGT("Preris.conf $");
LSTR MSG_PREHEAT_HOTEND = _UxGT("Prerisc.ugello");
LSTR MSG_PREHEAT_CUSTOM = _UxGT("Prerisc.personal.");
@@ -161,6 +171,7 @@ namespace LanguageNarrow_it {
LSTR MSG_SPINDLE_REVERSE = _UxGT("Inverti mandrino");
LSTR MSG_SWITCH_PS_ON = _UxGT("Accendi aliment.");
LSTR MSG_SWITCH_PS_OFF = _UxGT("Spegni aliment.");
+ LSTR MSG_POWER_EDM_FAULT = _UxGT("Anomalia alim.EDM");
LSTR MSG_EXTRUDE = _UxGT("Estrudi");
LSTR MSG_RETRACT = _UxGT("Ritrai");
LSTR MSG_MOVE_AXIS = _UxGT("Muovi asse");
@@ -178,6 +189,7 @@ namespace LanguageNarrow_it {
LSTR MSG_MESH_VIEWER = _UxGT("Visualiz. mesh");
LSTR MSG_EDIT_MESH = _UxGT("Modifica mesh");
LSTR MSG_MESH_VIEW = _UxGT("Visualizza mesh");
+ LSTR MSG_MESH_VIEW_GRID = _UxGT("Vis.mesh (griglia)");
LSTR MSG_EDITING_STOPPED = _UxGT("Modif. mesh fermata");
LSTR MSG_NO_VALID_MESH = _UxGT("Mesh non valida");
LSTR MSG_ACTIVATE_MESH = _UxGT("Attiva livellamento");
@@ -201,7 +213,9 @@ namespace LanguageNarrow_it {
LSTR MSG_M48_TEST = _UxGT("Test sonda M48");
LSTR MSG_M48_POINT = _UxGT("Punto M48");
LSTR MSG_M48_OUT_OF_BOUNDS = _UxGT("Sonda oltre i limiti");
+ LSTR MSG_M48_DEV = _UxGT("Dev");
LSTR MSG_M48_DEVIATION = _UxGT("Deviazione");
+ LSTR MSG_M48_MAX_DELTA = _UxGT("Delta max");
LSTR MSG_IDEX_MENU = _UxGT("Modo IDEX");
LSTR MSG_OFFSETS_MENU = _UxGT("Strumenti offsets");
LSTR MSG_IDEX_MODE_AUTOPARK = _UxGT("Auto-Park");
@@ -428,6 +442,7 @@ namespace LanguageNarrow_it {
LSTR MSG_AMAX_EN = _UxGT("Acc.massima *");
LSTR MSG_A_RETRACT = _UxGT("A-Ritrazione");
LSTR MSG_A_TRAVEL = _UxGT("A-Spostamento");
+ LSTR MSG_A_SPINDLE = _UxGT("Acc.mandrino");
LSTR MSG_INPUT_SHAPING = _UxGT("Input shaping");
LSTR MSG_SHAPING_ENABLE_N = _UxGT("Abilita shaping @");
LSTR MSG_SHAPING_DISABLE_N = _UxGT("Disabil. shaping @");
@@ -466,8 +481,10 @@ namespace LanguageNarrow_it {
LSTR MSG_DRAW_MAX_Y = _UxGT("Max Y area disegno");
LSTR MSG_MAX_BELT_LEN = _UxGT("Lungh.max cinghia");
LSTR MSG_LINEAR_ADVANCE = _UxGT("Avanzam.lineare");
- LSTR MSG_ADVANCE_K = _UxGT("K Avanzamento");
- LSTR MSG_ADVANCE_K_E = _UxGT("K Avanzamento *");
+ LSTR MSG_ADVANCE_K = _UxGT("K advance");
+ LSTR MSG_ADVANCE_TAU = _UxGT("Tau advance");
+ LSTR MSG_ADVANCE_K_E = _UxGT("K advance *");
+ LSTR MSG_ADVANCE_TAU_E = _UxGT("Tau advance *");
LSTR MSG_CONTRAST = _UxGT("Contrasto LCD");
LSTR MSG_BRIGHTNESS = _UxGT("Luminosità LCD");
LSTR MSG_SCREEN_TIMEOUT = _UxGT("Timeout LCD (m)");
@@ -532,10 +549,8 @@ namespace LanguageNarrow_it {
LSTR MSG_CANCEL_OBJECT = _UxGT("Cancella oggetto");
LSTR MSG_CANCEL_OBJECT_N = _UxGT("Canc. oggetto {");
LSTR MSG_CONTINUE_PRINT_JOB = _UxGT("Cont.proc.stampa");
- LSTR MSG_MEDIA_MENU = _UxGT("Stampa da ") MEDIA_TYPE_IT;
LSTR MSG_TURN_OFF = _UxGT("Spegni stampante");
LSTR MSG_END_LOOPS = _UxGT("Fine cicli di rip.");
- LSTR MSG_NO_MEDIA = MEDIA_TYPE_IT _UxGT(" non presente");
LSTR MSG_DWELL = _UxGT("Sospensione...");
LSTR MSG_USERWAIT = _UxGT("Premi tasto..");
LSTR MSG_PRINT_PAUSED = _UxGT("Stampa sospesa");
@@ -589,10 +604,20 @@ namespace LanguageNarrow_it {
LSTR MSG_ATTACH_MEDIA = _UxGT("Collega ") MEDIA_TYPE_IT;
LSTR MSG_ATTACH_SD = _UxGT("Collega scheda SD");
- LSTR MSG_ATTACH_USB = _UxGT("Collega penna USB");
- LSTR MSG_CHANGE_MEDIA = _UxGT("Cambia ") MEDIA_TYPE_IT;
+ LSTR MSG_ATTACH_USB = _UxGT("Collega unità USB");
LSTR MSG_RELEASE_MEDIA = _UxGT("Rilascia ") MEDIA_TYPE_IT;
- LSTR MSG_RUN_AUTOFILES = _UxGT("Esegui files auto");
+ LSTR MSG_RELEASE_SD = _UxGT("Rilascia sceda SD");
+ LSTR MSG_RELEASE_USB = _UxGT("Rilascia unità USB");
+ LSTR MSG_CHANGE_MEDIA = _UxGT("Selez.") MEDIA_TYPE_IT;
+ LSTR MSG_CHANGE_SD = _UxGT("Selez. scheda SD");
+ LSTR MSG_CHANGE_USB = _UxGT("Selez. unità USB");
+ LSTR MSG_RUN_AUTOFILES = _UxGT("Esegui Autofiles");
+ LSTR MSG_RUN_AUTOFILES_SD = _UxGT("Esegui Autofiles SD");
+ LSTR MSG_RUN_AUTOFILES_USB = _UxGT("Esegui Autofiles USB");
+ LSTR MSG_MEDIA_MENU = _UxGT("Stampa da ") MEDIA_TYPE_IT;
+ LSTR MSG_MEDIA_MENU_SD = _UxGT("Selez. da SD");
+ LSTR MSG_MEDIA_MENU_USB = _UxGT("Selez. da USB");
+ LSTR MSG_NO_MEDIA = MEDIA_TYPE_IT _UxGT(" non rilevato");
LSTR MSG_ZPROBE_OUT = _UxGT("Z probe fuori piatto");
LSTR MSG_SKEW_FACTOR = _UxGT("Fattore distorsione");
@@ -848,6 +873,7 @@ namespace LanguageNarrow_it {
LSTR MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("Spurgo filamento"));
LSTR MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_1_LINE("Premi x terminare"));
LSTR MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Ripresa..."));
+
LSTR MSG_TMC_DRIVERS = _UxGT("Driver TMC");
LSTR MSG_TMC_CURRENT = _UxGT("Corrente driver");
LSTR MSG_TMC_ACURRENT = _UxGT("Corrente driver ") STR_A;
@@ -858,6 +884,7 @@ namespace LanguageNarrow_it {
LSTR MSG_TMC_HOMING_THRS = _UxGT("Sensorless homing");
LSTR MSG_TMC_STEPPING_MODE = _UxGT("Modo Stepping");
LSTR MSG_TMC_STEALTHCHOP = _UxGT("StealthChop");
+ LSTR MSG_TMC_HOMING_CURRENT = _UxGT("Corrente homing");
LSTR MSG_SERVICE_RESET = _UxGT("Resetta");
LSTR MSG_SERVICE_IN = _UxGT(" tra:");
@@ -897,6 +924,7 @@ namespace LanguageNarrow_it {
LSTR MSG_BOTTOM_LEFT = _UxGT("Basso sinistra");
LSTR MSG_TOP_RIGHT = _UxGT("Alto destra");
LSTR MSG_BOTTOM_RIGHT = _UxGT("Basso destra");
+ LSTR MSG_TOUCH_CALIBRATION = _UxGT("Calibrazione touch");
LSTR MSG_CALIBRATION_COMPLETED = _UxGT("Calibrazione completata");
LSTR MSG_CALIBRATION_FAILED = _UxGT("Calibrazione fallita");
@@ -907,7 +935,7 @@ namespace LanguageNarrow_it {
LSTR MSG_HOST_SHUTDOWN = _UxGT("Arresta host");
-// DGUS-Specific message strings, not used elsewhere
+ // DGUS-Specific message strings, not used elsewhere
LSTR DGUS_MSG_NOT_WHILE_PRINTING = _UxGT("Non ammesso durante la stampa");
LSTR DGUS_MSG_NOT_WHILE_IDLE = _UxGT("Non ammesso mentre è in riposo");
LSTR DGUS_MSG_NO_FILE_SELECTED = _UxGT("Nessun file selezionato");
@@ -939,17 +967,56 @@ namespace LanguageNarrow_it {
LSTR MSG_BTN_STOP = _UxGT("Stop");
LSTR MSG_BTN_DISABLE_MMU = _UxGT("Disabilita");
LSTR MSG_BTN_MORE = _UxGT("Più info");
+
+ // Prusa MMU
+ LSTR MSG_DONE = _UxGT("Eseguito");
+ LSTR MSG_FINISHING_MOVEMENTS = _UxGT("Termina movimenti");
+ LSTR MSG_LOADING_FILAMENT = _UxGT("Carica. filamento");
+ LSTR MSG_UNLOADING_FILAMENT = _UxGT("Scarico filamento");
+ LSTR MSG_TESTING_FILAMENT = _UxGT("Testando filamento");
+ LSTR MSG_EJECT_FROM_MMU = _UxGT("Espelli da MMU");
+ LSTR MSG_CUT_FILAMENT = _UxGT("Taglia filamento");
+ LSTR MSG_OFF = _UxGT("Off");
+ LSTR MSG_ON = _UxGT("On");
+ LSTR MSG_PROGRESS_OK = _UxGT("OK");
+ LSTR MSG_PROGRESS_ENGAGE_IDLER = _UxGT("Innesto idler");
+ LSTR MSG_PROGRESS_DISENGAGE_IDLER = _UxGT("Disinnesto idler");
+ LSTR MSG_PROGRESS_UNLOAD_FINDA = _UxGT("Scarico a FINDA");
+ LSTR MSG_PROGRESS_UNLOAD_PULLEY = _UxGT("Scarico a puleggia");
+ LSTR MSG_PROGRESS_FEED_FINDA = _UxGT("Alim. a FINDA");
+ LSTR MSG_PROGRESS_FEED_EXTRUDER = _UxGT("Alim. all'estrusore");
+ LSTR MSG_PROGRESS_FEED_NOZZLE = _UxGT("Alim. all'ugello");
+ LSTR MSG_PROGRESS_AVOID_GRIND = _UxGT("Evita grind");
+ LSTR MSG_PROGRESS_WAIT_USER = _UxGT("ERR attesa utente");
+ LSTR MSG_PROGRESS_ERR_INTERNAL = _UxGT("ERR interno");
+ LSTR MSG_PROGRESS_ERR_HELP_FIL = _UxGT("ERR aiuto filamento");
+ LSTR MSG_PROGRESS_ERR_TMC = _UxGT("ERR anomalia TMC");
+ LSTR MSG_PROGRESS_SELECT_SLOT = _UxGT("Selez.slot filam.");
+ LSTR MSG_PROGRESS_PREPARE_BLADE = _UxGT("Preparaz.lama");
+ LSTR MSG_PROGRESS_PUSH_FILAMENT = _UxGT("Spinta fialmento");
+ LSTR MSG_PROGRESS_PERFORM_CUT = _UxGT("Esecuzione taglio");
+ LSTR MSG_PROGRESSPSTRETURN_SELECTOR = _UxGT("Ritorno selettore");
+ LSTR MSG_PROGRESS_PARK_SELECTOR = _UxGT("Parcheggio selettore");
+ LSTR MSG_PROGRESS_EJECT_FILAMENT = _UxGT("Esplusione filamento");
+ LSTR MSG_PROGRESSPSTRETRACT_FINDA = _UxGT("Ritrai a FINDA");
+ LSTR MSG_PROGRESS_HOMING = _UxGT("Homing");
+ LSTR MSG_PROGRESS_MOVING_SELECTOR = _UxGT("Movim. selettore");
+ LSTR MSG_PROGRESS_FEED_FSENSOR = _UxGT("Alim. a FSensor");
}
namespace LanguageWide_it {
using namespace LanguageNarrow_it;
#if LCD_WIDTH >= 20 || HAS_DWIN_E3V2
+ LSTR MSG_LIVE_MOVE = _UxGT("Movimento live");
LSTR MSG_HOST_START_PRINT = _UxGT("Avvio stampa host");
- LSTR MSG_PRINTING_OBJECT = _UxGT("Sto stampando l'oggetto");
- LSTR MSG_CANCEL_OBJECT = _UxGT("Cancella l'oggetto");
- LSTR MSG_CANCEL_OBJECT_N = _UxGT("Cancella l'oggetto {");
+ LSTR MSG_PRINTING_OBJECT = _UxGT("Stampa oggetto");
+ LSTR MSG_CANCEL_OBJECT = _UxGT("Cancella oggetto");
+ LSTR MSG_CANCEL_OBJECT_N = _UxGT("Cancella oggetto {");
LSTR MSG_CONTINUE_PRINT_JOB = _UxGT("Continua il job di stampa");
- LSTR MSG_MEDIA_MENU = _UxGT("Selez.da supporto");
+ LSTR MSG_MEDIA_MENU = _UxGT("Seleziona da ") MEDIA_TYPE_IT;
+ LSTR MSG_MEDIA_MENU_SD = _UxGT("Seleziona da scheda SD");
+ LSTR MSG_MEDIA_MENU_USB = _UxGT("Seleziona da unità USB");
+ LSTR MSG_NO_MEDIA = MEDIA_TYPE_EN _UxGT(" non trovato");
LSTR MSG_TURN_OFF = _UxGT("Spegni la stampante");
LSTR MSG_END_LOOPS = _UxGT("Termina i cicli di ripetizione");
LSTR MSG_MEDIA_NOT_INSERTED = _UxGT("Nessun supporto inserito."); // ProUI
@@ -959,7 +1026,13 @@ namespace LanguageWide_it {
LSTR MSG_INFO_PRINT_TIME = _UxGT("Tempo totale");
LSTR MSG_INFO_PRINT_LONGEST = _UxGT("Lavoro più lungo");
LSTR MSG_INFO_PRINT_FILAMENT = _UxGT("Totale estruso");
- LSTR MSG_TEMP_TOO_LOW = _UxGT("Temperatura troppo bassa");
+ LSTR MSG_HOMING_FEEDRATE_N = _UxGT("Velocità @ di homing");
+ LSTR MSG_HOMING_FEEDRATE_X = _UxGT("Velocità X di homing");
+ LSTR MSG_HOMING_FEEDRATE_Y = _UxGT("Velocità Y di homing");
+ LSTR MSG_HOMING_FEEDRATE_Z = _UxGT("Velocità Z di homing");
+ LSTR MSG_EEPROM_INITIALIZED = _UxGT("Ripristinate impostazioni predefinite");
+ LSTR MSG_PREHEAT_M_CHAMBER = _UxGT("Preriscalda camera per $");
+ LSTR MSG_PREHEAT_M_SETTINGS = _UxGT("Configurazioni preriscaldo $");
#endif
}
diff --git a/Marlin/src/lcd/language/language_pl.h b/Marlin/src/lcd/language/language_pl.h
index 7c7297d184..df0f995416 100644
--- a/Marlin/src/lcd/language/language_pl.h
+++ b/Marlin/src/lcd/language/language_pl.h
@@ -48,14 +48,15 @@ namespace LanguageNarrow_pl {
LSTR MSG_YES = _UxGT("TAK");
LSTR MSG_NO = _UxGT("NIE");
LSTR MSG_BACK = _UxGT("Wstecz");
+
LSTR MSG_MEDIA_ABORTING = _UxGT("Przerywanie...");
LSTR MSG_MEDIA_INSERTED = _UxGT("Karta włożona");
LSTR MSG_MEDIA_REMOVED = _UxGT("Karta usunięta");
- LSTR MSG_MEDIA_WAITING = _UxGT("Oczekiwanie na kartę");
LSTR MSG_MEDIA_INIT_FAIL = _UxGT("Błąd inicializacji karty");
LSTR MSG_MEDIA_READ_ERROR = _UxGT("Bład odczytu karty");
- LSTR MSG_MEDIA_USB_REMOVED = _UxGT("Urządzenie USB usunięte");
- LSTR MSG_MEDIA_USB_FAILED = _UxGT("Błąd uruchomienia USB");
+ LSTR MSG_USB_FD_DEVICE_REMOVED = _UxGT("Urządzenie USB usunięte");
+ LSTR MSG_USB_FD_USB_FAILED = _UxGT("Błąd uruchomienia USB");
+
LSTR MSG_LCD_ENDSTOPS = _UxGT("Krańców."); // Max length 8 characters
LSTR MSG_LCD_SOFT_ENDSTOPS = _UxGT("Progr. Krańcówki");
LSTR MSG_MAIN_MENU = _UxGT("Menu główne");
diff --git a/Marlin/src/lcd/language/language_pt_br.h b/Marlin/src/lcd/language/language_pt_br.h
index 80a8d95bdb..49c52300f9 100644
--- a/Marlin/src/lcd/language/language_pt_br.h
+++ b/Marlin/src/lcd/language/language_pt_br.h
@@ -38,13 +38,14 @@ namespace LanguageNarrow_pt_br {
LSTR MSG_YES = _UxGT("SIM");
LSTR MSG_NO = _UxGT("NÃO");
LSTR MSG_BACK = _UxGT("Voltar");
+
LSTR MSG_MEDIA_ABORTING = _UxGT("Abortando...");
LSTR MSG_MEDIA_INSERTED = _UxGT("Cartão inserido");
LSTR MSG_MEDIA_REMOVED = _UxGT("Cartão removido");
- LSTR MSG_MEDIA_WAITING = _UxGT("Aguardando cartão");
LSTR MSG_MEDIA_READ_ERROR = _UxGT("Erro de leitura");
- LSTR MSG_MEDIA_USB_REMOVED = _UxGT("USB removido");
- LSTR MSG_MEDIA_USB_FAILED = _UxGT("USB falhou");
+ LSTR MSG_USB_FD_DEVICE_REMOVED = _UxGT("USB removido");
+ LSTR MSG_USB_FD_USB_FAILED = _UxGT("USB falhou");
+
LSTR MSG_LCD_ENDSTOPS = _UxGT("Fins de curso");
LSTR MSG_LCD_SOFT_ENDSTOPS = _UxGT("Soft Fins curso");
LSTR MSG_MAIN_MENU = _UxGT("Menu principal");
diff --git a/Marlin/src/lcd/language/language_ro.h b/Marlin/src/lcd/language/language_ro.h
index 7337862909..3a939c6a3d 100644
--- a/Marlin/src/lcd/language/language_ro.h
+++ b/Marlin/src/lcd/language/language_ro.h
@@ -39,14 +39,15 @@ namespace LanguageNarrow_ro {
LSTR MSG_YES = _UxGT("DA");
LSTR MSG_NO = _UxGT("NU");
LSTR MSG_BACK = _UxGT("Inapoi");
+
LSTR MSG_MEDIA_ABORTING = _UxGT("Abandon...");
LSTR MSG_MEDIA_INSERTED = _UxGT("Media Introdus");
LSTR MSG_MEDIA_REMOVED = _UxGT("Media Inlaturat");
- LSTR MSG_MEDIA_WAITING = _UxGT("Astept Media");
LSTR MSG_MEDIA_READ_ERROR = _UxGT("Eroare Citire Media");
- LSTR MSG_MEDIA_USB_REMOVED = _UxGT("Dispozitiv USB Inlaturat");
- LSTR MSG_MEDIA_USB_FAILED = _UxGT("Pornire USB Esuata");
+ LSTR MSG_USB_FD_DEVICE_REMOVED = _UxGT("Dispozitiv USB Inlaturat");
+ LSTR MSG_USB_FD_USB_FAILED = _UxGT("Pornire USB Esuata");
LSTR MSG_KILL_SUBCALL_OVERFLOW = _UxGT("Eroare:Subcall Overflow");
+
LSTR MSG_LCD_ENDSTOPS = _UxGT("Endstops"); // Max length 8 characters
LSTR MSG_LCD_SOFT_ENDSTOPS = _UxGT("Soft Endstops");
LSTR MSG_MAIN_MENU = _UxGT("Principal");
diff --git a/Marlin/src/lcd/language/language_ru.h b/Marlin/src/lcd/language/language_ru.h
index 40b3a03d3d..37bc17aa0c 100644
--- a/Marlin/src/lcd/language/language_ru.h
+++ b/Marlin/src/lcd/language/language_ru.h
@@ -39,16 +39,17 @@ namespace LanguageNarrow_ru {
LSTR MSG_YES = _UxGT("Да");
LSTR MSG_NO = _UxGT("Нет");
LSTR MSG_BACK = _UxGT("Назад");
+
LSTR MSG_MEDIA_ABORTING = _UxGT("Прерывание...");
LSTR MSG_MEDIA_INSERTED = _UxGT("SD карта вставлена");
LSTR MSG_MEDIA_REMOVED = _UxGT("SD карта извлечена");
- LSTR MSG_MEDIA_WAITING = _UxGT("Вставьте SD карту");
LSTR MSG_MEDIA_INIT_FAIL = _UxGT("Сбой инициализ. SD");
LSTR MSG_ADVANCED_SETTINGS = _UxGT("Расшир. настройки");
LSTR MSG_KILL_SUBCALL_OVERFLOW = _UxGT("Переполн. вызова");
LSTR MSG_MEDIA_READ_ERROR = _UxGT("Ошибка чтения");
- LSTR MSG_MEDIA_USB_REMOVED = _UxGT("USB диск удалён");
- LSTR MSG_MEDIA_USB_FAILED = _UxGT("Ошибка USB диска");
+ LSTR MSG_USB_FD_DEVICE_REMOVED = _UxGT("USB диск удалён");
+ LSTR MSG_USB_FD_USB_FAILED = _UxGT("Ошибка USB диска");
+
LSTR MSG_LCD_SOFT_ENDSTOPS = _UxGT("Прогр. концевики");
LSTR MSG_LCD_ENDSTOPS = _UxGT("Концевик"); // Max length 8 characters
LSTR MSG_MAIN_MENU = _UxGT("Главное меню");
diff --git a/Marlin/src/lcd/language/language_sk.h b/Marlin/src/lcd/language/language_sk.h
index 7a8c228d84..f1efc0e7c3 100644
--- a/Marlin/src/lcd/language/language_sk.h
+++ b/Marlin/src/lcd/language/language_sk.h
@@ -54,14 +54,15 @@ namespace LanguageNarrow_sk {
LSTR MSG_LOW = _UxGT("NÍZKA");
LSTR MSG_BACK = _UxGT("Naspäť");
LSTR MSG_ERROR = _UxGT("Chyba");
+
LSTR MSG_MEDIA_ABORTING = _UxGT("Ruším...");
LSTR MSG_MEDIA_INSERTED = _UxGT("Karta vložená");
LSTR MSG_MEDIA_REMOVED = _UxGT("Karta vybraná");
- LSTR MSG_MEDIA_WAITING = _UxGT("Čakám na kartu");
LSTR MSG_MEDIA_INIT_FAIL = _UxGT("Inicial.karty zlyhala");
LSTR MSG_MEDIA_READ_ERROR = _UxGT("Chyba čítania karty");
- LSTR MSG_MEDIA_USB_REMOVED = _UxGT("USB zaria. odstrán.");
- LSTR MSG_MEDIA_USB_FAILED = _UxGT("Chyba spúšťania USB");
+ LSTR MSG_USB_FD_DEVICE_REMOVED = _UxGT("USB zaria. odstrán.");
+ LSTR MSG_USB_FD_USB_FAILED = _UxGT("Chyba spúšťania USB");
+
LSTR MSG_KILL_SUBCALL_OVERFLOW = _UxGT("Preteč. podprogramu");
LSTR MSG_LCD_ENDSTOPS = _UxGT("Endstopy"); // max 8 znakov
LSTR MSG_LCD_SOFT_ENDSTOPS = _UxGT("Soft. endstopy");
diff --git a/Marlin/src/lcd/language/language_sv.h b/Marlin/src/lcd/language/language_sv.h
index e2e408391c..33ffe8a77d 100644
--- a/Marlin/src/lcd/language/language_sv.h
+++ b/Marlin/src/lcd/language/language_sv.h
@@ -40,15 +40,16 @@ namespace LanguageNarrow_sv {
LSTR MSG_YES = _UxGT("JA");
LSTR MSG_NO = _UxGT("NEJ");
LSTR MSG_BACK = _UxGT("Bakåt");
+
LSTR MSG_MEDIA_ABORTING = _UxGT("Avbryter...");
LSTR MSG_MEDIA_INSERTED = _UxGT("Media Instatt");
LSTR MSG_MEDIA_REMOVED = _UxGT("Media Borttaget");
- LSTR MSG_MEDIA_WAITING = _UxGT("Väntar på media");
LSTR MSG_MEDIA_INIT_FAIL = _UxGT("Media init misslyckades");
LSTR MSG_MEDIA_READ_ERROR = _UxGT("Media läsningsfel");
- LSTR MSG_MEDIA_USB_REMOVED = _UxGT("USB enhet borttagen");
- LSTR MSG_MEDIA_USB_FAILED = _UxGT("USB start misslyckad");
+ LSTR MSG_USB_FD_DEVICE_REMOVED = _UxGT("USB enhet borttagen");
+ LSTR MSG_USB_FD_USB_FAILED = _UxGT("USB start misslyckad");
LSTR MSG_KILL_SUBCALL_OVERFLOW = _UxGT("Underanrop överskriden");
+
LSTR MSG_LCD_ENDSTOPS = _UxGT("Slutstop"); // Max length 8 characters
LSTR MSG_LCD_SOFT_ENDSTOPS = _UxGT("Mjuk slutstopp");
LSTR MSG_MAIN_MENU = _UxGT("Huvud");
diff --git a/Marlin/src/lcd/language/language_tr.h b/Marlin/src/lcd/language/language_tr.h
index 36fe4188fa..9e4f261271 100644
--- a/Marlin/src/lcd/language/language_tr.h
+++ b/Marlin/src/lcd/language/language_tr.h
@@ -52,17 +52,18 @@ namespace LanguageNarrow_tr {
LSTR MSG_LOW = _UxGT("DÜŞÜK");
LSTR MSG_BACK = _UxGT("Geri");
LSTR MSG_ERROR = _UxGT("Hata");
+
LSTR MSG_MEDIA_ABORTING = _UxGT("Durduruluyor...");
LSTR MSG_MEDIA_INSERTED = _UxGT("SD K. Yerleştirildi.");
LSTR MSG_MEDIA_REMOVED = _UxGT("SD Kart Çıkarıldı.");
- LSTR MSG_MEDIA_WAITING = _UxGT("SD Kart Bekleniyor");
LSTR MSG_MEDIA_INIT_FAIL = _UxGT("SD K. Başlatma Hatası");
LSTR MSG_MEDIA_READ_ERROR = _UxGT("Kart Okuma Hatası");
- LSTR MSG_MEDIA_USB_REMOVED = _UxGT("USB Çıkarıldı");
- LSTR MSG_MEDIA_USB_FAILED = _UxGT("USB Başlat. Hatası");
+ LSTR MSG_USB_FD_DEVICE_REMOVED = _UxGT("USB Çıkarıldı");
+ LSTR MSG_USB_FD_USB_FAILED = _UxGT("USB Başlat. Hatası");
LSTR MSG_MEDIA_SORT = _UxGT("Medyayı Sırala");
LSTR MSG_MEDIA_UPDATE = _UxGT("Medyayı Güncelle");
LSTR MSG_KILL_SUBCALL_OVERFLOW = _UxGT("Subcall Overflow");
+
LSTR MSG_LCD_ENDSTOPS = _UxGT("Endstops"); // Max length 8 characters
LSTR MSG_LCD_SOFT_ENDSTOPS = _UxGT("Soft Endstops");
LSTR MSG_MAIN_MENU = _UxGT("Ana");
diff --git a/Marlin/src/lcd/language/language_uk.h b/Marlin/src/lcd/language/language_uk.h
index 4d323d6ba7..a6d87e2ae8 100644
--- a/Marlin/src/lcd/language/language_uk.h
+++ b/Marlin/src/lcd/language/language_uk.h
@@ -40,15 +40,16 @@ namespace LanguageNarrow_uk {
LSTR MSG_YES = _UxGT("ТАК");
LSTR MSG_NO = _UxGT("НІ");
LSTR MSG_BACK = _UxGT("Назад");
+
LSTR MSG_MEDIA_ABORTING = _UxGT("Переривання...");
LSTR MSG_MEDIA_INSERTED = _UxGT("SD-картка вставлена");
LSTR MSG_MEDIA_REMOVED = _UxGT("SD-картка видалена");
- LSTR MSG_MEDIA_WAITING = _UxGT("Вставте SD-картку");
LSTR MSG_MEDIA_INIT_FAIL = _UxGT("Збій ініціаліз. SD");
LSTR MSG_MEDIA_READ_ERROR = _UxGT("Помилка зчитування");
- LSTR MSG_MEDIA_USB_REMOVED = _UxGT("USB диск видалений");
- LSTR MSG_MEDIA_USB_FAILED = _UxGT("Помилка USB диску");
+ LSTR MSG_USB_FD_DEVICE_REMOVED = _UxGT("USB диск видалений");
+ LSTR MSG_USB_FD_USB_FAILED = _UxGT("Помилка USB диску");
LSTR MSG_KILL_SUBCALL_OVERFLOW = _UxGT("Переповн. виклику");
+
LSTR MSG_LCD_SOFT_ENDSTOPS = _UxGT("Прогр.кінцевики");
LSTR MSG_LCD_ENDSTOPS = _UxGT("Кінцевик"); // Max length 8 characters
LSTR MSG_MAIN_MENU = _UxGT("Основне меню");
diff --git a/Marlin/src/lcd/language/language_vi.h b/Marlin/src/lcd/language/language_vi.h
index f7f5545bcb..e411668a91 100644
--- a/Marlin/src/lcd/language/language_vi.h
+++ b/Marlin/src/lcd/language/language_vi.h
@@ -35,13 +35,14 @@ namespace LanguageNarrow_vi {
LSTR WELCOME_MSG = MACHINE_NAME_SUBST _UxGT(" Sẵn sàng."); // Ready
LSTR MSG_BACK = _UxGT("Trở lại"); // Back
+
LSTR MSG_MEDIA_ABORTING = _UxGT("Đang hủy bỏ...");
LSTR MSG_MEDIA_INSERTED = _UxGT("Phương tiện được cắm vào"); // Media inserted
LSTR MSG_MEDIA_REMOVED = _UxGT("Phương tiện được rút ra");
- LSTR MSG_MEDIA_WAITING = _UxGT("Chờ đợi phương tiện");
LSTR MSG_MEDIA_READ_ERROR = _UxGT("Lỗi đọc phương tiện");
- LSTR MSG_MEDIA_USB_REMOVED = _UxGT("USB được rút ra");
- LSTR MSG_MEDIA_USB_FAILED = _UxGT("USB khởi thất bại");
+ LSTR MSG_USB_FD_DEVICE_REMOVED = _UxGT("USB được rút ra");
+ LSTR MSG_USB_FD_USB_FAILED = _UxGT("USB khởi thất bại");
+
LSTR MSG_LCD_ENDSTOPS = _UxGT("Công tắc"); // Endstops - công tắc hành trình
LSTR MSG_LCD_SOFT_ENDSTOPS = _UxGT("Công tắc mềm"); // Soft Endstops
LSTR MSG_MAIN_MENU = _UxGT("Chính"); // Main
diff --git a/Marlin/src/lcd/language/language_zh_CN.h b/Marlin/src/lcd/language/language_zh_CN.h
index 01f9f53d0c..ff095889af 100644
--- a/Marlin/src/lcd/language/language_zh_CN.h
+++ b/Marlin/src/lcd/language/language_zh_CN.h
@@ -41,14 +41,15 @@ namespace LanguageNarrow_zh_CN {
LSTR MSG_LOW = _UxGT("低");
LSTR MSG_BACK = _UxGT("返回"); // ”Back“
LSTR MSG_ERROR = _UxGT("错误");
+
LSTR MSG_MEDIA_ABORTING = _UxGT("存储卡中止...");
LSTR MSG_MEDIA_INSERTED = _UxGT("存储卡已插入"); // "Card inserted"
LSTR MSG_MEDIA_REMOVED = _UxGT("存储卡被拔出"); // "Card removed"
- LSTR MSG_MEDIA_WAITING = _UxGT("等待存储器");
LSTR MSG_MEDIA_READ_ERROR = _UxGT("卡读卡器错误");
- LSTR MSG_MEDIA_USB_REMOVED = _UxGT("USB设备已弹出");
- LSTR MSG_MEDIA_USB_FAILED = _UxGT("USB读取失败");
+ LSTR MSG_USB_FD_DEVICE_REMOVED = _UxGT("USB设备已弹出");
+ LSTR MSG_USB_FD_USB_FAILED = _UxGT("USB读取失败");
LSTR MSG_KILL_SUBCALL_OVERFLOW = _UxGT("子响应溢出");
+
LSTR MSG_LCD_ENDSTOPS = _UxGT("挡块"); // "Endstops" // Max length 8 characters
LSTR MSG_LCD_SOFT_ENDSTOPS = _UxGT("软挡块");
LSTR MSG_MAIN_MENU = _UxGT("主菜单"); // "Main"
diff --git a/Marlin/src/lcd/language/language_zh_TW.h b/Marlin/src/lcd/language/language_zh_TW.h
index 7321252de7..ecacf7e33d 100644
--- a/Marlin/src/lcd/language/language_zh_TW.h
+++ b/Marlin/src/lcd/language/language_zh_TW.h
@@ -37,13 +37,14 @@ namespace LanguageNarrow_zh_TW {
LSTR MSG_YES = _UxGT("是"); // "YES"
LSTR MSG_NO = _UxGT("否"); // "NO"
LSTR MSG_BACK = _UxGT("返回"); // "Back"
+
LSTR MSG_MEDIA_ABORTING = _UxGT("正在中止..."); // "Aborting..."
LSTR MSG_MEDIA_INSERTED = _UxGT("記憶卡已插入"); // "Card inserted"
LSTR MSG_MEDIA_REMOVED = _UxGT("記憶卡被拔出"); // "Card removed"
- LSTR MSG_MEDIA_WAITING = _UxGT("等待記憶卡"); // "Waiting for media"
LSTR MSG_MEDIA_READ_ERROR = _UxGT("記憶卡讀取錯誤"); //"Media read error"
- LSTR MSG_MEDIA_USB_REMOVED = _UxGT("USB裝置已移除"); // "USB device removed"
- LSTR MSG_MEDIA_USB_FAILED = _UxGT("USB啟動失敗"); // "USB start failed"
+ LSTR MSG_USB_FD_DEVICE_REMOVED = _UxGT("USB裝置已移除"); // "USB device removed"
+ LSTR MSG_USB_FD_USB_FAILED = _UxGT("USB啟動失敗"); // "USB start failed"
+
LSTR MSG_LCD_ENDSTOPS = _UxGT("擋塊"); // "Endstops" // Max length 8 characters
LSTR MSG_LCD_SOFT_ENDSTOPS = _UxGT("軟體擋塊"); // "Soft Endstops"
LSTR MSG_MAIN_MENU = _UxGT("主選單"); // "Main"
diff --git a/Marlin/src/lcd/marlinui.cpp b/Marlin/src/lcd/marlinui.cpp
index 28697affab..9cfc6498a8 100644
--- a/Marlin/src/lcd/marlinui.cpp
+++ b/Marlin/src/lcd/marlinui.cpp
@@ -62,6 +62,10 @@ MarlinUI ui;
#include "../module/printcounter.h"
#endif
+#if HAS_WIRED_LCD || HAS_PREHEAT
+ #include "../module/temperature.h"
+#endif
+
#if LCD_HAS_WAIT_FOR_MOVE
bool MarlinUI::wait_for_move; // = false
#endif
@@ -136,8 +140,6 @@ constexpr uint8_t epps = ENCODER_PULSES_PER_STEP;
#endif
#if HAS_PREHEAT
- #include "../module/temperature.h"
-
preheat_t MarlinUI::material_preset[PREHEAT_COUNT]; // Initialized by settings.load
void MarlinUI::reset_material_presets() {
@@ -331,7 +333,6 @@ void MarlinUI::init() {
#include "lcdprint.h"
- #include "../module/temperature.h"
#include "../module/planner.h"
#include "../module/motion.h"
@@ -1224,7 +1225,7 @@ void MarlinUI::init() {
#ifdef NEOPIXEL_BKGD_INDEX_FIRST
neo.set_background_off();
neo.show();
- #elif PIN_EXIST(LCD_BACKLIGHT)
+ #elif PIN_EXISTS(LCD_BACKLIGHT)
WRITE(LCD_BACKLIGHT_PIN, LOW); // Backlight off
#endif
backlight_off_ms = 0;
@@ -1883,7 +1884,7 @@ uint8_t expand_u8str_P(char * const outstr, PGM_P const ptpl, const int8_t ind,
);
}
- #if LCD_WITH_BLINK && HAS_EXTRA_PROGRESS
+ #if HAS_ROTATE_PROGRESS
// Renew and redraw all enabled progress strings
void MarlinUI::rotate_progress() {
@@ -1903,7 +1904,7 @@ uint8_t expand_u8str_P(char * const outstr, PGM_P const ptpl, const int8_t ind,
}
}
- #endif // LCD_WITH_BLINK && HAS_EXTRA_PROGRESS
+ #endif // HAS_ROTATE_PROGRESS
#endif // HAS_PRINT_PROGRESS
@@ -1956,7 +1957,7 @@ uint8_t expand_u8str_P(char * const outstr, PGM_P const ptpl, const int8_t ind,
if ((old_status ^ status) & INSERT_SD)
LCD_MESSAGE(MSG_MEDIA_REMOVED_SD);
else if ((old_status ^ status) & INSERT_USB)
- LCD_MESSAGE(MSG_MEDIA_REMOVED_USB);
+ LCD_MESSAGE(MSG_USB_FD_MEDIA_REMOVED);
else
LCD_MESSAGE(MSG_MEDIA_REMOVED);
diff --git a/Marlin/src/lcd/marlinui.h b/Marlin/src/lcd/marlinui.h
index 578d143d96..adfecdbaf5 100644
--- a/Marlin/src/lcd/marlinui.h
+++ b/Marlin/src/lcd/marlinui.h
@@ -95,6 +95,10 @@ typedef bool (*statusResetFunc_t)();
#define LCD_UPDATE_INTERVAL DIV_TERN(DOUBLE_LCD_FRAMERATE, TERN(HAS_TOUCH_BUTTONS, 50, 100), 2)
#endif
+#if LCD_WITH_BLINK && HAS_EXTRA_PROGRESS && !IS_DWIN_MARLINUI
+ #define HAS_ROTATE_PROGRESS 1
+#endif
+
#if HAS_MARLINUI_U8GLIB
enum MarlinFont : uint8_t {
FONT_STATUSMENU = 1,
@@ -347,7 +351,7 @@ public:
FORCE_INLINE static uint16_t get_progress_permyriad() { return _get_progress(); }
#endif
static uint8_t get_progress_percent() { return uint8_t(_get_progress() / (PROGRESS_SCALE)); }
- #if LCD_WITH_BLINK && HAS_EXTRA_PROGRESS
+ #if HAS_ROTATE_PROGRESS
#if ENABLED(SHOW_PROGRESS_PERCENT)
static void drawPercent();
#endif
diff --git a/Marlin/src/lcd/menu/menu_advanced.cpp b/Marlin/src/lcd/menu/menu_advanced.cpp
index 92f2f51536..b15a21fc7b 100644
--- a/Marlin/src/lcd/menu/menu_advanced.cpp
+++ b/Marlin/src/lcd/menu/menu_advanced.cpp
@@ -117,10 +117,13 @@ void menu_backlash();
#if ENABLED(LIN_ADVANCE)
#if DISABLED(DISTINCT_E_FACTORS)
- EDIT_ITEM(float42_52, MSG_ADVANCE_K, &planner.extruder_advance_K[0], 0, 10);
+ editable.decimal = planner.get_advance_k();
+ EDIT_ITEM(float42_52, MSG_ADVANCE_K, &editable.decimal, 0.0f, 10.0f, []{ planner.set_advance_k(editable.decimal); });
#else
- EXTRUDER_LOOP()
- EDIT_ITEM_N(float42_52, e, MSG_ADVANCE_K_E, &planner.extruder_advance_K[e], 0, 10);
+ EXTRUDER_LOOP() {
+ editable.decimal = planner.get_advance_k(e);
+ EDIT_ITEM_N(float42_52, e, MSG_ADVANCE_K_E, &editable.decimal, 0.0f, 10.0f, []{ planner.set_advance_k(editable.decimal, MenuItemBase::itemIndex); });
+ }
#endif
#if ENABLED(SMOOTH_LIN_ADVANCE)
#if DISABLED(DISTINCT_E_FACTORS)
@@ -745,15 +748,19 @@ void menu_advanced_settings() {
#endif
#if HAS_ADV_FILAMENT_MENU
- SUBMENU(MSG_FILAMENT, menu_advanced_filament);
- #endif
- #if ENABLED(LIN_ADVANCE) && DISABLED(HAS_ADV_FILAMENT_MENU)
+ SUBMENU(MSG_FILAMENT, menu_advanced_filament);
+
+ #elif ENABLED(LIN_ADVANCE)
+
#if DISABLED(DISTINCT_E_FACTORS)
- EDIT_ITEM(float42_52, MSG_ADVANCE_K, &planner.extruder_advance_K[0], 0, 10);
+ editable.decimal = planner.get_advance_k();
+ EDIT_ITEM(float42_52, MSG_ADVANCE_K, &editable.decimal, 0.0f, 10.0f, []{ planner.set_advance_k(editable.decimal); });
#else
- EXTRUDER_LOOP()
- EDIT_ITEM_N(float42_52, e, MSG_ADVANCE_K_E, &planner.extruder_advance_K[e], 0, 10);
+ EXTRUDER_LOOP() {
+ editable.decimal = planner.get_advance_k(e);
+ EDIT_ITEM_N(float42_52, e, MSG_ADVANCE_K_E, &editable.decimal, 0.0f, 10.0f, []{ planner.set_advance_k(editable.decimal, MenuItemBase::itemIndex); });
+ }
#endif
#if ENABLED(SMOOTH_LIN_ADVANCE)
#if DISABLED(DISTINCT_E_FACTORS)
@@ -766,7 +773,8 @@ void menu_advanced_settings() {
}
#endif
#endif
- #endif
+
+ #endif // LIN_ADVANCE && !HAS_ADV_FILAMENT_MENU
// M540 S - Abort on endstop hit when SD printing
#if ENABLED(SD_ABORT_ON_ENDSTOP_HIT)
diff --git a/Marlin/src/lcd/menu/menu_bed_tramming.cpp b/Marlin/src/lcd/menu/menu_bed_tramming.cpp
index d749763808..0d5feddce6 100644
--- a/Marlin/src/lcd/menu/menu_bed_tramming.cpp
+++ b/Marlin/src/lcd/menu/menu_bed_tramming.cpp
@@ -230,11 +230,12 @@ static void _lcd_goto_next_corner() {
);
}
+ // Probe down and return 'true' if the probe triggered
bool _lcd_bed_tramming_probe(const bool verify=false) {
- if (verify) line_to_z(current_position.z + (BED_TRAMMING_Z_HOP)); // do clearance if needed
- TERN_(BLTOUCH, if (!bltouch.high_speed_mode) bltouch.deploy()); // Deploy in LOW SPEED MODE on every probe action
- do_blocking_move_to_z(last_z - BED_TRAMMING_PROBE_TOLERANCE, MMM_TO_MMS(Z_PROBE_FEEDRATE_SLOW)); // Move down to lower tolerance
- if (TEST(endstops.trigger_state(), Z_MIN_PROBE)) { // check if probe triggered
+ if (verify) line_to_z(current_position.z + (BED_TRAMMING_Z_HOP)); // Do clearance if needed
+ TERN_(BLTOUCH, if (!bltouch.high_speed_mode) bltouch.deploy()); // Deploy in LOW SPEED MODE on every probe action
+ do_blocking_move_to_z(last_z - BED_TRAMMING_PROBE_TOLERANCE, z_probe_slow_mm_s); // Move down to lower tolerance
+ if (TEST(endstops.trigger_state(), Z_MIN_PROBE)) { // Probe triggered?
endstops.hit_on_purpose();
set_current_from_steppers_for_axis(Z_AXIS);
sync_plan_position();
@@ -251,10 +252,10 @@ static void _lcd_goto_next_corner() {
if (TERN0(NEEDS_PROBE_DEPLOY, good_points == nr_edge_points - 1))
do_z_clearance(BED_TRAMMING_Z_HOP);
- return true; // probe triggered
+ return true; // Triggered
}
- line_to_z(last_z); // go back to tolerance middle point before raise
- return false; // probe not triggered
+ line_to_z(last_z); // Go back to tolerance middle point before raise
+ return false; // Not triggered
}
bool _lcd_bed_tramming_raise() {
diff --git a/Marlin/src/lcd/menu/menu_motion.cpp b/Marlin/src/lcd/menu/menu_motion.cpp
index e2adbfded2..956b58c633 100644
--- a/Marlin/src/lcd/menu/menu_motion.cpp
+++ b/Marlin/src/lcd/menu/menu_motion.cpp
@@ -401,19 +401,48 @@ void menu_move() {
#endif // HAS_DYNAMIC_FREQ
+ // Suppress warning about storing a stack address in a static string pointer
+ #pragma GCC diagnostic push
+ #pragma GCC diagnostic ignored "-Wdangling-pointer"
+
+ #if ALL(__AVR__, HAS_MARLINUI_U8GLIB) && DISABLED(REDUCE_CODE_SIZE_FOR_FT_MOTION_ON_AVR)
+ #define CACHE_PREV_STRING
+ #endif
+
void menu_ft_motion() {
// Define stuff ahead of the menu loop
- MString<20> shaper_name[NUM_AXES_SHAPED] {};
- #if HAS_X_AXIS
- for (uint_fast8_t a = X_AXIS; a < NUM_AXES_SHAPED; ++a)
- shaper_name[a] = get_shaper_name(AxisEnum(a));
- #endif
- #if HAS_DYNAMIC_FREQ
- MString<20> dmode = get_dyn_freq_mode_name();
- #endif
-
ft_config_t &c = ftMotion.cfg;
+ #ifdef __AVR__
+ // Copy Flash strings to RAM for C-string substitution
+ // For U8G paged rendering check and skip extra string copy
+ #if HAS_X_AXIS
+ MString<20> shaper_name;
+ TERN_(CACHE_PREV_STRING, int8_t prev_a = -1);
+ auto _shaper_name = [&](const AxisEnum a) {
+ if (TERN1(CACHE_PREV_STRING, a != prev_a)) {
+ TERN_(CACHE_PREV_STRING, prev_a = a);
+ shaper_name = get_shaper_name(a);
+ }
+ return shaper_name;
+ };
+ #endif
+ #if HAS_DYNAMIC_FREQ
+ MString<20> dmode;
+ TERN_(CACHE_PREV_STRING, bool got_d = false);
+ auto _dmode = [&]{
+ if (TERN1(CACHE_PREV_STRING, !got_d)) {
+ TERN_(CACHE_PREV_STRING, got_d = true);
+ dmode = get_dyn_freq_mode_name();
+ }
+ return dmode;
+ };
+ #endif
+ #else
+ auto _shaper_name = [](const AxisEnum a) { return get_shaper_name(a); };
+ auto _dmode = []{ return get_dyn_freq_mode_name(); };
+ #endif
+
START_MENU();
BACK_ITEM(MSG_MOTION);
@@ -426,7 +455,7 @@ void menu_move() {
// Show only when FT Motion is active (or optionally always show)
if (c.active || ENABLED(FT_MOTION_NO_MENU_TOGGLE)) {
#if HAS_X_AXIS
- SUBMENU_N_S(X_AXIS, shaper_name[X_AXIS], MSG_FTM_CMPN_MODE, menu_ftm_shaper_x);
+ SUBMENU_N_S(X_AXIS, _shaper_name(X_AXIS), MSG_FTM_CMPN_MODE, menu_ftm_shaper_x);
if (AXIS_HAS_SHAPER(X)) {
EDIT_ITEM_FAST_N(float42_52, X_AXIS, MSG_FTM_BASE_FREQ_N, &c.baseFreq.x, FTM_MIN_SHAPE_FREQ, (FTM_FS) / 2, ftMotion.update_shaping_params);
@@ -436,7 +465,7 @@ void menu_move() {
}
#endif
#if HAS_Y_AXIS
- SUBMENU_N_S(Y_AXIS, shaper_name[Y_AXIS], MSG_FTM_CMPN_MODE, menu_ftm_shaper_y);
+ SUBMENU_N_S(Y_AXIS, _shaper_name(Y_AXIS), MSG_FTM_CMPN_MODE, menu_ftm_shaper_y);
if (AXIS_HAS_SHAPER(Y)) {
EDIT_ITEM_FAST_N(float42_52, Y_AXIS, MSG_FTM_BASE_FREQ_N, &c.baseFreq.y, FTM_MIN_SHAPE_FREQ, (FTM_FS) / 2, ftMotion.update_shaping_params);
@@ -447,7 +476,7 @@ void menu_move() {
#endif
#if HAS_DYNAMIC_FREQ
- SUBMENU_S(dmode, MSG_FTM_DYN_MODE, menu_ftm_dyn_mode);
+ SUBMENU_S(_dmode(), MSG_FTM_DYN_MODE, menu_ftm_dyn_mode);
if (c.dynFreqMode != dynFreqMode_DISABLED) {
#if HAS_X_AXIS
EDIT_ITEM_FAST_N(float42_52, X_AXIS, MSG_FTM_DFREQ_K_N, &c.dynFreqK.x, 0.0f, 20.0f);
@@ -469,13 +498,34 @@ void menu_move() {
void menu_tune_ft_motion() {
// Define stuff ahead of the menu loop
- MString<20> shaper_name[NUM_AXES_SHAPED] {};
- #if HAS_X_AXIS
- for (uint_fast8_t a = X_AXIS; a < NUM_AXES_SHAPED; ++a)
- shaper_name[a] = get_shaper_name(AxisEnum(a));
- #endif
- #if HAS_DYNAMIC_FREQ
- MString<20> dmode = get_dyn_freq_mode_name();
+ #ifdef __AVR__
+ // Copy Flash strings to RAM for C-string substitution
+ // For U8G paged rendering check and skip extra string copy
+ #if HAS_X_AXIS
+ MString<20> shaper_name;
+ TERN_(CACHE_PREV_STRING, int8_t prev_a = -1);
+ auto _shaper_name = [&](const AxisEnum a) {
+ if (TERN1(CACHE_PREV_STRING, a != prev_a)) {
+ TERN_(CACHE_PREV_STRING, prev_a = a);
+ shaper_name = get_shaper_name(a);
+ }
+ return shaper_name;
+ };
+ #endif
+ #if HAS_DYNAMIC_FREQ
+ MString<20> dmode;
+ TERN_(CACHE_PREV_STRING, bool got_d = false);
+ auto _dmode = [&]{
+ if (TERN1(CACHE_PREV_STRING, !got_d)) {
+ TERN_(CACHE_PREV_STRING, got_d = true);
+ dmode = get_dyn_freq_mode_name();
+ }
+ return dmode;
+ };
+ #endif
+ #else
+ auto _shaper_name = [](const AxisEnum a) { return get_shaper_name(a); };
+ auto _dmode = []{ return get_dyn_freq_mode_name(); };
#endif
#if HAS_EXTRUDERS
@@ -486,13 +536,13 @@ void menu_move() {
BACK_ITEM(MSG_TUNE);
#if HAS_X_AXIS
- SUBMENU_N_S(X_AXIS, shaper_name[X_AXIS], MSG_FTM_CMPN_MODE, menu_ftm_shaper_x);
+ SUBMENU_N_S(X_AXIS, _shaper_name(X_AXIS), MSG_FTM_CMPN_MODE, menu_ftm_shaper_x);
#endif
#if HAS_Y_AXIS
- SUBMENU_N_S(Y_AXIS, shaper_name[Y_AXIS], MSG_FTM_CMPN_MODE, menu_ftm_shaper_y);
+ SUBMENU_N_S(Y_AXIS, _shaper_name(Y_AXIS), MSG_FTM_CMPN_MODE, menu_ftm_shaper_y);
#endif
#if HAS_DYNAMIC_FREQ
- SUBMENU_S(dmode, MSG_FTM_DYN_MODE, menu_ftm_dyn_mode);
+ SUBMENU_S(_dmode(), MSG_FTM_DYN_MODE, menu_ftm_dyn_mode);
#endif
#if HAS_EXTRUDERS
EDIT_ITEM(bool, MSG_LINEAR_ADVANCE, &c.linearAdvEna);
@@ -503,6 +553,8 @@ void menu_move() {
END_MENU();
}
+ #pragma GCC diagnostic pop
+
#endif // FT_MOTION_MENU
void menu_motion() {
diff --git a/Marlin/src/lcd/menu/menu_tune.cpp b/Marlin/src/lcd/menu/menu_tune.cpp
index d5cb805244..7f4696a3f1 100644
--- a/Marlin/src/lcd/menu/menu_tune.cpp
+++ b/Marlin/src/lcd/menu/menu_tune.cpp
@@ -216,10 +216,13 @@ void menu_tune() {
//
#if ENABLED(LIN_ADVANCE) && DISABLED(SLIM_LCD_MENUS)
#if DISABLED(DISTINCT_E_FACTORS)
- EDIT_ITEM(float42_52, MSG_ADVANCE_K, &planner.extruder_advance_K[0], 0, 10);
+ editable.decimal = planner.get_advance_k();
+ EDIT_ITEM(float42_52, MSG_ADVANCE_K, &editable.decimal, 0.0f, 10.0f, []{ planner.set_advance_k(editable.decimal); });
#else
- EXTRUDER_LOOP()
- EDIT_ITEM_N(float42_52, e, MSG_ADVANCE_K_E, &planner.extruder_advance_K[e], 0, 10);
+ EXTRUDER_LOOP() {
+ editable.decimal = planner.get_advance_k(e);
+ EDIT_ITEM_N(float42_52, e, MSG_ADVANCE_K_E, &editable.decimal, 0.0f, 10.0f, []{ planner.set_advance_k(editable.decimal, MenuItemBase::itemIndex); });
+ }
#endif
#if ENABLED(SMOOTH_LIN_ADVANCE)
#if DISABLED(DISTINCT_E_FACTORS)
diff --git a/Marlin/src/lcd/sovol_rts/sovol_rts.cpp b/Marlin/src/lcd/sovol_rts/sovol_rts.cpp
index bea95be96a..3c09838684 100644
--- a/Marlin/src/lcd/sovol_rts/sovol_rts.cpp
+++ b/Marlin/src/lcd/sovol_rts/sovol_rts.cpp
@@ -894,7 +894,7 @@ void RTS::handleData() {
break;
case 4: // Go to Advanced Settings
- TERN_(LIN_ADVANCE, sendData(planner.extruder_advance_K[0] * 100, Advance_K_VP));
+ TERN_(LIN_ADVANCE, sendData(planner.get_advance_k() * 100, Advance_K_VP));
gotoPage(ID_AdvWarn_L, ID_AdvWarn_D);
break;
@@ -1292,7 +1292,7 @@ void RTS::handleData() {
#if ENABLED(LIN_ADVANCE)
case 7: // Confirm
- sendData(planner.extruder_advance_K[0] * 100, Advance_K_VP);
+ sendData(planner.get_advance_k() * 100, Advance_K_VP);
gotoPage(ID_Advanced_L, ID_Advanced_D);
break;
#endif
@@ -1350,7 +1350,7 @@ void RTS::handleData() {
#endif
case A_Retract: planner.settings.retract_acceleration = recdat.data[0]; break;
#if ENABLED(LIN_ADVANCE)
- case Advance_K: planner.extruder_advance_K[0] = float(recdat.data[0]) / 100.0f; break;
+ case Advance_K: planner.set_advance_k(float(recdat.data[0]) / 100.0f); break;
#endif
#endif
case Accel: planner.settings.acceleration = recdat.data[0]; break;
diff --git a/Marlin/src/lcd/tft/touch.cpp b/Marlin/src/lcd/tft/touch.cpp
index bb226e50c6..fbba927a86 100644
--- a/Marlin/src/lcd/tft/touch.cpp
+++ b/Marlin/src/lcd/tft/touch.cpp
@@ -181,44 +181,51 @@ void Touch::touch(touch_control_t *control) {
case SLIDER: hold(control); ui.encoderPosition = (x - control->x) * control->data / control->width; break;
case INCREASE: hold(control, repeat_delay - 5); TERN(AUTO_BED_LEVELING_UBL, ui.external_control ? bedlevel.encoder_diff++ : ui.encoderPosition++, ui.encoderPosition++); break;
case DECREASE: hold(control, repeat_delay - 5); TERN(AUTO_BED_LEVELING_UBL, ui.external_control ? bedlevel.encoder_diff-- : ui.encoderPosition--, ui.encoderPosition--); break;
- case HEATER:
- int8_t heater;
- heater = control->data;
+ case HEATER: {
ui.clear_for_drawing();
- #if HAS_HOTEND
- if (heater >= 0) { // HotEnd
- #if HOTENDS == 1
- MenuItem_int3::action(GET_TEXT_F(MSG_NOZZLE), &thermalManager.temp_hotend[0].target, 0, thermalManager.hotend_max_target(0), []{ thermalManager.start_watching_hotend(0); });
- #else
- MenuItemBase::itemIndex = heater;
- MenuItem_int3::action(GET_TEXT_F(MSG_NOZZLE_N), &thermalManager.temp_hotend[heater].target, 0, thermalManager.hotend_max_target(heater), []{ thermalManager.start_watching_hotend(MenuItemBase::itemIndex); });
+ const int8_t heater = control->data;
+ switch (heater) {
+ default: // Hotend
+ #if HAS_HOTEND
+ #define HOTEND_HEATER(N) TERN0(HAS_MULTI_HOTEND, N)
+ TERN_(HAS_MULTI_HOTEND, MenuItemBase::itemIndex = heater);
+ MenuItem_int3::action(GET_TEXT_F(TERN(HAS_MULTI_HOTEND, MSG_NOZZLE_N, MSG_NOZZLE)),
+ &thermalManager.temp_hotend[HOTEND_HEATER(heater)].target, 0, thermalManager.hotend_max_target(HOTEND_HEATER(heater)),
+ []{ thermalManager.start_watching_hotend(HOTEND_HEATER(MenuItemBase::itemIndex)); }
+ );
#endif
- }
- #endif
- #if HAS_HEATED_BED
- else if (heater == H_BED) {
- MenuItem_int3::action(GET_TEXT_F(MSG_BED), &thermalManager.temp_bed.target, 0, BED_MAX_TARGET, thermalManager.start_watching_bed);
- }
- #endif
- #if HAS_HEATED_CHAMBER
- else if (heater == H_CHAMBER) {
- MenuItem_int3::action(GET_TEXT_F(MSG_CHAMBER), &thermalManager.temp_chamber.target, 0, CHAMBER_MAX_TARGET, thermalManager.start_watching_chamber);
- }
- #endif
- #if HAS_COOLER
- else if (heater == H_COOLER) {
- MenuItem_int3::action(GET_TEXT_F(MSG_COOLER), &thermalManager.temp_cooler.target, 0, COOLER_MAX_TARGET, thermalManager.start_watching_cooler);
- }
- #endif
+ break;
- break;
- case FAN:
+ #if HAS_HEATED_BED
+ case H_BED:
+ MenuItem_int3::action(GET_TEXT_F(MSG_BED), &thermalManager.temp_bed.target, 0, BED_MAX_TARGET, thermalManager.start_watching_bed);
+ break;
+ #endif
+
+ #if HAS_HEATED_CHAMBER
+ case H_CHAMBER:
+ MenuItem_int3::action(GET_TEXT_F(MSG_CHAMBER), &thermalManager.temp_chamber.target, 0, CHAMBER_MAX_TARGET, thermalManager.start_watching_chamber);
+ break;
+ #endif
+
+ #if HAS_COOLER
+ case H_COOLER:
+ MenuItem_int3::action(GET_TEXT_F(MSG_COOLER), &thermalManager.temp_cooler.target, 0, COOLER_MAX_TARGET, thermalManager.start_watching_cooler);
+ break;
+ #endif
+
+ } // switch
+
+ } break;
+
+ case FAN: {
ui.clear_for_drawing();
static uint8_t fan, fan_speed;
fan = 0;
fan_speed = thermalManager.fan_speed[fan];
MenuItem_percent::action(GET_TEXT_F(MSG_FIRST_FAN_SPEED), &fan_speed, 0, 255, []{ thermalManager.set_fan_speed(fan, fan_speed); TERN_(LASER_SYNCHRONOUS_M106_M107, planner.buffer_sync_block(BLOCK_BIT_SYNC_FANS));});
- break;
+ } break;
+
case FEEDRATE:
ui.clear_for_drawing();
MenuItem_int3::action(GET_TEXT_F(MSG_SPEED), &feedrate_percentage, SPEED_EDIT_MIN, SPEED_EDIT_MAX);
@@ -228,11 +235,10 @@ void Touch::touch(touch_control_t *control) {
case FLOWRATE:
ui.clear_for_drawing();
MenuItemBase::itemIndex = control->data;
- #if EXTRUDERS == 1
- MenuItem_int3::action(GET_TEXT_F(MSG_FLOW), &planner.flow_percentage[MenuItemBase::itemIndex], FLOW_EDIT_MIN, FLOW_EDIT_MAX, []{ planner.refresh_e_factor(MenuItemBase::itemIndex); });
- #else
- MenuItem_int3::action(GET_TEXT_F(MSG_FLOW_N), &planner.flow_percentage[MenuItemBase::itemIndex], FLOW_EDIT_MIN, FLOW_EDIT_MAX, []{ planner.refresh_e_factor(MenuItemBase::itemIndex); });
- #endif
+ MenuItem_int3::action(GET_TEXT_F(TERN(HAS_MULTI_EXTRUDER, MSG_FLOW_N, MSG_FLOW)),
+ &planner.flow_percentage[MenuItemBase::itemIndex], FLOW_EDIT_MIN, FLOW_EDIT_MAX,
+ []{ planner.refresh_e_factor(MenuItemBase::itemIndex); }
+ );
break;
#endif
diff --git a/Marlin/src/module/ft_motion.cpp b/Marlin/src/module/ft_motion.cpp
index 88d2fb60b3..cb31525572 100644
--- a/Marlin/src/module/ft_motion.cpp
+++ b/Marlin/src/module/ft_motion.cpp
@@ -89,6 +89,12 @@ xyze_long_t FTMotion::steps = { 0 }; // Step count accumulator.
uint32_t FTMotion::interpIdx = 0; // Index of current data point being interpolated.
+#if ENABLED(DISTINCT_E_FACTORS)
+ uint8_t FTMotion::block_extruder_axis; // Cached E Axis from last-fetched block
+#else
+ constexpr uint8_t FTMotion::block_extruder_axis;
+#endif
+
// Shaping variables.
#if HAS_FTM_SHAPING
FTMotion::shaping_t FTMotion::shaping = {
@@ -143,6 +149,12 @@ void FTMotion::loop() {
continue;
}
loadBlockData(stepper.current_block);
+
+ // If the endstop is already pressed, endstop interrupts won't invoke
+ // endstop_triggered and the move will grind. So check here for a
+ // triggered endstop, which shortly marks the block for discard.
+ endstops.update();
+
blockProcRdy = true;
// Some kinematics track axis motion in HX, HY, HZ
#if ANY(CORE_IS_XY, CORE_IS_XZ, MARKFORGED_XY, MARKFORGED_YX)
@@ -389,6 +401,7 @@ void FTMotion::reset() {
#endif
TERN_(HAS_EXTRUDERS, e_raw_z1 = e_advanced_z1 = 0.0f);
+ TERN_(DISTINCT_E_FACTORS, block_extruder_axis = E_AXIS);
axis_move_end_ti.reset();
}
@@ -453,13 +466,15 @@ void FTMotion::init() {
// Load / convert block data from planner to fixed-time control variables.
void FTMotion::loadBlockData(block_t * const current_block) {
+ // Cache the extruder index for this block
+ TERN_(DISTINCT_E_FACTORS, block_extruder_axis = E_AXIS_N(current_block->extruder));
const float totalLength = current_block->millimeters,
oneOverLength = 1.0f / totalLength;
startPosn = endPosn_prevBlock;
const xyze_pos_t moveDist = LOGICAL_AXIS_ARRAY(
- current_block->steps.e * planner.mm_per_step[E_AXIS_N(current_block->extruder)] * (current_block->direction_bits.e ? 1 : -1),
+ current_block->steps.e * planner.mm_per_step[block_extruder_axis] * (current_block->direction_bits.e ? 1 : -1),
current_block->steps.x * planner.mm_per_step[X_AXIS] * (current_block->direction_bits.x ? 1 : -1),
current_block->steps.y * planner.mm_per_step[Y_AXIS] * (current_block->direction_bits.y ? 1 : -1),
current_block->steps.z * planner.mm_per_step[Z_AXIS] * (current_block->direction_bits.z ? 1 : -1),
@@ -568,12 +583,6 @@ void FTMotion::loadBlockData(block_t * const current_block) {
#endif
TERN_(HAS_Z_AXIS, _SET_MOVE_END(Z));
SECONDARY_AXIS_MAP(_SET_MOVE_END);
-
- // If the endstop is already pressed, endstop interrupts won't invoke
- // endstop_triggered and the move will grind. So check here for a
- // triggered endstop, which shortly marks the block for discard.
- endstops.update();
-
}
// Generate data points of the trajectory.
@@ -721,7 +730,7 @@ void FTMotion::convertToSteps(const uint32_t idx) {
#if ENABLED(STEPS_ROUNDING)
#define TOSTEPS(A,B) int32_t(trajMod.A[idx] * planner.settings.axis_steps_per_mm[B] + (trajMod.A[idx] < 0.0f ? -0.5f : 0.5f))
const xyze_long_t steps_tar = LOGICAL_AXIS_ARRAY(
- TOSTEPS(e, E_AXIS_N(stepper.current_block->extruder)), // May be eliminated if guaranteed positive.
+ TOSTEPS(e, block_extruder_axis), // May be eliminated if guaranteed positive.
TOSTEPS(x, X_AXIS), TOSTEPS(y, Y_AXIS), TOSTEPS(z, Z_AXIS),
TOSTEPS(i, I_AXIS), TOSTEPS(j, J_AXIS), TOSTEPS(k, K_AXIS),
TOSTEPS(u, U_AXIS), TOSTEPS(v, V_AXIS), TOSTEPS(w, W_AXIS)
@@ -730,7 +739,7 @@ void FTMotion::convertToSteps(const uint32_t idx) {
#else
#define TOSTEPS(A,B) int32_t(trajMod.A[idx] * planner.settings.axis_steps_per_mm[B]) - steps.A
xyze_long_t delta = LOGICAL_AXIS_ARRAY(
- TOSTEPS(e, E_AXIS_N(stepper.current_block->extruder)),
+ TOSTEPS(e, block_extruder_axis),
TOSTEPS(x, X_AXIS), TOSTEPS(y, Y_AXIS), TOSTEPS(z, Z_AXIS),
TOSTEPS(i, I_AXIS), TOSTEPS(j, J_AXIS), TOSTEPS(k, K_AXIS),
TOSTEPS(u, U_AXIS), TOSTEPS(v, V_AXIS), TOSTEPS(w, W_AXIS)
diff --git a/Marlin/src/module/ft_motion.h b/Marlin/src/module/ft_motion.h
index f6ce81af12..4cf8017083 100644
--- a/Marlin/src/module/ft_motion.h
+++ b/Marlin/src/module/ft_motion.h
@@ -169,6 +169,12 @@ class FTMotion {
static xyze_long_t steps;
+ #if ENABLED(DISTINCT_E_FACTORS)
+ static uint8_t block_extruder_axis; // Cached extruder axis index
+ #else
+ static constexpr uint8_t block_extruder_axis = E_AXIS;
+ #endif
+
// Shaping variables.
#if HAS_FTM_SHAPING
diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp
index fcaaf613e4..f2f27ee6a9 100644
--- a/Marlin/src/module/motion.cpp
+++ b/Marlin/src/module/motion.cpp
@@ -1990,7 +1990,7 @@ void prepare_line_to_destination() {
*/
feedRate_t get_homing_bump_feedrate(const AxisEnum axis) {
#if HOMING_Z_WITH_PROBE
- if (axis == Z_AXIS) return MMM_TO_MMS(Z_PROBE_FEEDRATE_SLOW);
+ if (axis == Z_AXIS) return z_probe_slow_mm_s;
#endif
static const uint8_t homing_bump_divisor[] PROGMEM = HOMING_BUMP_DIVISOR;
uint8_t hbd = pgm_read_byte(&homing_bump_divisor[axis]);
diff --git a/Marlin/src/module/motion.h b/Marlin/src/module/motion.h
index 18376cf773..edee41a903 100644
--- a/Marlin/src/module/motion.h
+++ b/Marlin/src/module/motion.h
@@ -71,7 +71,10 @@ extern xyz_pos_t cartes;
#define XY_PROBE_FEEDRATE_MM_S PLANNER_XY_FEEDRATE_MM_S
#endif
-#if HAS_BED_PROBE
+#ifdef Z_PROBE_FEEDRATE_SLOW
+ constexpr feedRate_t z_probe_slow_mm_s = MMM_TO_MMS(Z_PROBE_FEEDRATE_SLOW);
+#endif
+#ifdef Z_PROBE_FEEDRATE_FAST
constexpr feedRate_t z_probe_fast_mm_s = MMM_TO_MMS(Z_PROBE_FEEDRATE_FAST);
#endif
@@ -141,11 +144,11 @@ inline int8_t pgm_read_any(const int8_t *p) { return TERN(__IMXRT1062__, *p, pgm
static const XYZval NAME##_P DEFS_PROGMEM = NUM_AXIS_ARRAY(X_##OPT, Y_##OPT, Z_##OPT, I_##OPT, J_##OPT, K_##OPT, U_##OPT, V_##OPT, W_##OPT); \
return pgm_read_any(&NAME##_P[axis]); \
}
-XYZ_DEFS(float, base_min_pos, MIN_POS);
-XYZ_DEFS(float, base_max_pos, MAX_POS);
-XYZ_DEFS(float, base_home_pos, HOME_POS);
-XYZ_DEFS(float, max_length, MAX_LENGTH);
-XYZ_DEFS(int8_t, home_dir, HOME_DIR);
+XYZ_DEFS(float, base_min_pos, MIN_POS); // base_min_pos(axis)
+XYZ_DEFS(float, base_max_pos, MAX_POS); // base_max_pos(axis)
+XYZ_DEFS(float, base_home_pos, HOME_POS); // base_home_pos(axis)
+XYZ_DEFS(float, max_length, MAX_LENGTH); // max_length(axis)
+XYZ_DEFS(int8_t, home_dir, HOME_DIR); // home_dir(axis)
// Flags for rotational axes
constexpr AxisFlags rotational{0 LOGICAL_AXIS_GANG(
diff --git a/Marlin/src/module/planner.cpp b/Marlin/src/module/planner.cpp
index 87cb4cd21b..8678c82130 100644
--- a/Marlin/src/module/planner.cpp
+++ b/Marlin/src/module/planner.cpp
@@ -236,6 +236,9 @@ float Planner::previous_nominal_speed;
#if ENABLED(LIN_ADVANCE)
float Planner::extruder_advance_K[DISTINCT_E]; // Initialized by settings.load
+ #if ENABLED(SMOOTH_LIN_ADVANCE)
+ uint32_t Planner::extruder_advance_K_q27[DISTINCT_E];
+ #endif
#endif
#if HAS_POSITION_FLOAT
@@ -1502,10 +1505,12 @@ void Planner::check_axes_activity() {
#if HAS_LEVELING
- constexpr xy_pos_t level_fulcrum = {
- TERN(Z_SAFE_HOMING, Z_SAFE_HOMING_X_POINT, X_HOME_POS),
- TERN(Z_SAFE_HOMING, Z_SAFE_HOMING_Y_POINT, Y_HOME_POS)
- };
+ #if ABL_PLANAR
+ constexpr xy_pos_t level_fulcrum = {
+ TERN(Z_SAFE_HOMING, Z_SAFE_HOMING_X_POINT, X_HOME_POS),
+ TERN(Z_SAFE_HOMING, Z_SAFE_HOMING_Y_POINT, Y_HOME_POS)
+ };
+ #endif
/**
* rx, ry, rz - Cartesian positions in mm
@@ -2457,7 +2462,7 @@ bool Planner::_populate_block(
block->acceleration_steps_per_s2 = accel;
block->acceleration = accel / steps_per_mm;
#if DISABLED(S_CURVE_ACCELERATION)
- block->acceleration_rate = uint32_t(accel * (float(1UL << 24) / (STEPPER_TIMER_RATE)));
+ block->acceleration_rate = uint32_t(accel * (float(_BV32(24)) / (STEPPER_TIMER_RATE)));
#endif
#if HAS_ROUGH_LIN_ADVANCE
@@ -2478,7 +2483,13 @@ bool Planner::_populate_block(
}
#elif ENABLED(SMOOTH_LIN_ADVANCE)
block->use_advance_lead = use_advance_lead;
- block->e_step_ratio = (block->direction_bits.e ? 1 : -1) * float(block->steps.e) / block->step_event_count;
+ const uint32_t ratio = (uint64_t(block->steps.e) * _BV32(30)) / block->step_event_count;
+ block->e_step_ratio_q30 = block->direction_bits.e ? ratio : -ratio;
+
+ #if ENABLED(INPUT_SHAPING_E_SYNC)
+ const uint32_t xy_steps = TERN0(INPUT_SHAPING_X, block->steps.x) + TERN0(INPUT_SHAPING_Y, block->steps.y);
+ block->xy_length_inv_q30 = xy_steps ? (_BV32(30) / xy_steps) : 0;
+ #endif
#endif
// Formula for the average speed over a 1 step worth of distance if starting from zero and
@@ -3243,6 +3254,10 @@ void Planner::refresh_acceleration_rates() {
void Planner::refresh_positioning() {
#if ENABLED(EDITABLE_STEPS_PER_UNIT)
LOOP_DISTINCT_AXES(i) mm_per_step[i] = 1.0f / settings.axis_steps_per_mm[i];
+ #if ALL(NONLINEAR_EXTRUSION, SMOOTH_LIN_ADVANCE)
+ stepper.ne_q30.A = _BV32(30) * (stepper.ne.A * mm_per_step[E_AXIS_N(0)] * mm_per_step[E_AXIS_N(0)]);
+ stepper.ne_q30.B = _BV32(30) * (stepper.ne.B * mm_per_step[E_AXIS_N(0)]);
+ #endif
#endif
set_position_mm(current_position);
refresh_acceleration_rates();
diff --git a/Marlin/src/module/planner.h b/Marlin/src/module/planner.h
index 1c23f95cb1..bda5720919 100644
--- a/Marlin/src/module/planner.h
+++ b/Marlin/src/module/planner.h
@@ -247,7 +247,10 @@ typedef struct PlannerBlock {
#if ENABLED(SMOOTH_LIN_ADVANCE)
uint32_t cruise_time; // Cruise time in STEP timer counts
- float e_step_ratio;
+ int32_t e_step_ratio_q30; // Ratio of e steps to block steps.
+ #if ENABLED(INPUT_SHAPING_E_SYNC)
+ uint32_t xy_length_inv_q30; // Inverse of block->steps.x + block.steps.y
+ #endif
#endif
#if ANY(S_CURVE_ACCELERATION, SMOOTH_LIN_ADVANCE)
uint32_t cruise_rate, // The actual cruise rate to use, between end of the acceleration phase and start of deceleration phase
@@ -359,24 +362,22 @@ typedef struct PlannerSettings {
#if ENABLED(EDITABLE_STEPS_PER_UNIT)
float axis_steps_per_mm[DISTINCT_AXES];
#else
- #define _DLIM(I) ALIM(I, _dasu)
- #define _DASU(N) _dasu[_DLIM(N)],
- #define _EASU(N) _dasu[_DLIM(E_AXIS + N)],
+ #define _DASU(N) _dasu[ALIM(N, _dasu)],
+ #define _EASU(N) _dasu[ALIM(E_AXIS + N, _dasu)],
static constexpr float axis_steps_per_mm[DISTINCT_AXES] = {
REPEAT(NUM_AXES, _DASU)
TERN_(HAS_EXTRUDERS, REPEAT(DISTINCT_E, _EASU))
};
#undef _EASU
#undef _DASU
- #undef _DLIM
#endif
- feedRate_t max_feedrate_mm_s[DISTINCT_AXES]; // (mm/s) M203 XYZE - Max speeds
- float acceleration, // (mm/s^2) M204 S - Normal acceleration. DEFAULT ACCELERATION for all printing moves.
- retract_acceleration, // (mm/s^2) M204 R - Retract acceleration. Filament pull-back and push-forward while standing still in the other axes
- travel_acceleration; // (mm/s^2) M204 T - Travel acceleration. DEFAULT ACCELERATION for all NON printing moves.
- feedRate_t min_feedrate_mm_s, // (mm/s) M205 S - Minimum linear feedrate
- min_travel_feedrate_mm_s; // (mm/s) M205 T - Minimum travel feedrate
+ feedRate_t max_feedrate_mm_s[DISTINCT_AXES]; // (mm/s) M203 XYZE - Max speeds
+ float acceleration, // (mm/s^2) M204 S - Normal acceleration. DEFAULT ACCELERATION for all printing moves.
+ retract_acceleration, // (mm/s^2) M204 R - Retract acceleration. Filament pull-back and push-forward while standing still in the other axes
+ travel_acceleration; // (mm/s^2) M204 T - Travel acceleration. DEFAULT ACCELERATION for all NON printing moves.
+ feedRate_t min_feedrate_mm_s, // (mm/s) M205 S - Minimum linear feedrate
+ min_travel_feedrate_mm_s; // (mm/s) M205 T - Minimum travel feedrate
} planner_settings_t;
#if ENABLED(IMPROVE_HOMING_RELIABILITY)
@@ -526,6 +527,21 @@ class Planner {
#if ENABLED(LIN_ADVANCE)
static float extruder_advance_K[DISTINCT_E];
+ static void set_advance_k(const_float_t k, const uint8_t e=active_extruder) {
+ UNUSED(e);
+ extruder_advance_K[E_INDEX_N(e)] = k;
+ TERN_(SMOOTH_LIN_ADVANCE, extruder_advance_K_q27[E_INDEX_N(e)] = k * _BV32(27));
+ }
+ static float get_advance_k(const uint8_t e=active_extruder) {
+ UNUSED(e);
+ return extruder_advance_K[E_INDEX_N(e)];
+ }
+ #if ENABLED(SMOOTH_LIN_ADVANCE)
+ static uint32_t get_advance_k_q27(const uint8_t e=active_extruder) {
+ UNUSED(e);
+ return extruder_advance_K_q27[E_INDEX_N(e)];
+ }
+ #endif
#endif
/**
@@ -602,6 +618,10 @@ class Planner {
volatile static uint32_t block_buffer_runtime_us; // Theoretical block buffer runtime in µs
#endif
+ #if ENABLED(SMOOTH_LIN_ADVANCE)
+ static uint32_t extruder_advance_K_q27[DISTINCT_E];
+ #endif
+
public:
/**
diff --git a/Marlin/src/module/probe.cpp b/Marlin/src/module/probe.cpp
index 9a998ec569..b1f1f2cf40 100644
--- a/Marlin/src/module/probe.cpp
+++ b/Marlin/src/module/probe.cpp
@@ -854,7 +854,7 @@ float Probe::run_z_probe(const bool sanity_check/*=true*/, const_float_t z_min_p
// Probe downward slowly to find the bed
if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPGM("Slow Probe:");
- if (try_to_probe(PSTR("SLOW"), z_probe_low_point, MMM_TO_MMS(Z_PROBE_FEEDRATE_SLOW), sanity_check)) return NAN;
+ if (try_to_probe(PSTR("SLOW"), z_probe_low_point, z_probe_slow_mm_s, sanity_check)) return NAN;
TERN_(MEASURE_BACKLASH_WHEN_PROBING, backlash.measure_with_probe());
diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp
index 1a46c6cc2a..59cb7244e9 100644
--- a/Marlin/src/module/settings.cpp
+++ b/Marlin/src/module/settings.cpp
@@ -126,7 +126,7 @@
#endif
#if ENABLED(ADVANCE_K_EXTRA)
- extern float other_extruder_advance_K[DISTINCT_E];
+ extern float other_extruder_advance_K[EXTRUDERS];
#endif
#if HAS_MULTI_EXTRUDER
@@ -2641,18 +2641,14 @@ void MarlinSettings::postprocess() {
_FIELD_TEST(planner_extruder_advance_K);
EEPROM_READ(extruder_advance_K);
if (!validating)
- COPY(planner.extruder_advance_K, extruder_advance_K);
+ DISTINCT_E_LOOP() planner.set_advance_k(extruder_advance_K[e], e);
+
#if ENABLED(SMOOTH_LIN_ADVANCE)
_FIELD_TEST(stepper_extruder_advance_tau);
float tau[DISTINCT_E];
EEPROM_READ(tau);
- if (!validating) {
- #if ENABLED(DISTINCT_E_FACTORS)
- EXTRUDER_LOOP() stepper.set_advance_tau(tau[e], e);
- #else
- stepper.set_advance_tau(tau[0]);
- #endif
- }
+ if (!validating)
+ DISTINCT_E_LOOP() stepper.set_advance_tau(tau[e], e);
#endif
}
#endif
@@ -3615,21 +3611,23 @@ void MarlinSettings::reset() {
#if ENABLED(DISTINCT_E_FACTORS)
constexpr float linAdvanceK[] = ADVANCE_K;
- EXTRUDER_LOOP() {
- const float a = linAdvanceK[ALIM(e, linAdvanceK)];
- planner.extruder_advance_K[e] = a;
- TERN_(ADVANCE_K_EXTRA, other_extruder_advance_K[e] = a);
- }
- #else
- planner.extruder_advance_K[0] = ADVANCE_K;
- #endif
- #if ENABLED(SMOOTH_LIN_ADVANCE)
- #if ENABLED(DISTINCT_E_FACTORS)
+ #if ENABLED(SMOOTH_LIN_ADVANCE)
constexpr float linAdvanceTau[] = ADVANCE_TAU;
- EXTRUDER_LOOP()
- stepper.set_advance_tau(linAdvanceTau[ALIM(e, linAdvanceTau)], e);
- #else
- stepper.set_advance_tau(ADVANCE_TAU);
+ #endif
+
+ EXTRUDER_LOOP() {
+ const float k = linAdvanceK[ALIM(e, linAdvanceK)];
+ planner.set_advance_k(k, e);
+ TERN_(SMOOTH_LIN_ADVANCE, stepper.set_advance_tau(linAdvanceTau[ALIM(e, linAdvanceTau)], e));
+ TERN_(ADVANCE_K_EXTRA, other_extruder_advance_K[e] = k);
+ }
+
+ #else // !DISTINCT_E_FACTORS
+
+ planner.set_advance_k(ADVANCE_K);
+ TERN_(SMOOTH_LIN_ADVANCE, stepper.set_advance_tau(ADVANCE_TAU));
+ #if ENABLED(ADVANCE_K_EXTRA)
+ EXTRUDER_LOOP() other_extruder_advance_K[e] = ADVANCE_K;
#endif
#endif
diff --git a/Marlin/src/module/stepper.cpp b/Marlin/src/module/stepper.cpp
index e9f83aa532..ad7995bfc7 100644
--- a/Marlin/src/module/stepper.cpp
+++ b/Marlin/src/module/stepper.cpp
@@ -257,9 +257,16 @@ uint32_t Stepper::advance_divisor = 0,
#if ENABLED(NONLINEAR_EXTRUSION)
ne_coeff_t Stepper::ne;
- ne_fix_t Stepper::ne_fix;
- int32_t Stepper::ne_edividend;
- uint32_t Stepper::ne_scale;
+ #if NONLINEAR_EXTRUSION_Q24
+ ne_q24_t Stepper::ne_q24;
+ #else
+ ne_q30_t Stepper::ne_q30;
+ #endif
+ // private:
+ #if NONLINEAR_EXTRUSION_Q24
+ int32_t Stepper::ne_edividend;
+ uint32_t Stepper::ne_scale_q24;
+ #endif
#endif
#if HAS_ZV_SHAPING
@@ -1510,6 +1517,10 @@ HAL_STEP_TIMER_ISR() {
#define STEP_MULTIPLY(A,B) MultiU24X32toH16(A, B)
#endif
+#if ENABLED(SMOOTH_LIN_ADVANCE)
+ FORCE_INLINE static constexpr int32_t MULT_Q(uint8_t q, int32_t x, int32_t y) { return (int64_t(x) * y) >> q; }
+#endif
+
void Stepper::isr() {
static hal_timer_t nextMainISR = 0; // Interval until the next main Stepper Pulse phase (0 = Now)
@@ -1530,7 +1541,7 @@ void Stepper::isr() {
uint8_t max_loops = 10;
#if ENABLED(FT_MOTION)
- static uint32_t ftMotion_nextAuxISR = 0U; // Storage for the next ISR of the auxilliary tasks.
+ static uint32_t ftMotion_nextAuxISR = 0U; // Storage for the next ISR of the auxiliary tasks.
const bool using_ftMotion = ftMotion.cfg.active;
#else
constexpr bool using_ftMotion = false;
@@ -1545,21 +1556,18 @@ void Stepper::isr() {
#if ENABLED(FT_MOTION)
if (using_ftMotion) {
- if (!nextMainISR) { // Main ISR is ready to fire during this iteration?
- nextMainISR = FTM_MIN_TICKS; // Set to minimum interval (a limit on the top speed)
- ftMotion_stepper(); // Run FTM Stepping
- // Define 2.5 msec task for auxilliary functions.
- if (!ftMotion_nextAuxISR) {
- TERN_(BABYSTEPPING, if (babystep.has_steps()) babystepping_isr());
- ftMotion_nextAuxISR = (STEPPER_TIMER_RATE) / 400;
- }
+ ftMotion_stepper(); // Run FTM Stepping
+
+ // Define 2.5 msec task for auxiliary functions.
+ if (!ftMotion_nextAuxISR) {
+ TERN_(BABYSTEPPING, if (babystep.has_steps()) babystepping_isr());
+ ftMotion_nextAuxISR = (STEPPER_TIMER_RATE) / 400;
}
- // Enable ISRs to reduce latency for higher priority ISRs, or all ISRs if no prioritization.
+ // Enable ISRs to reduce latency for higher priority ISRs
hal.isr_on();
-
- interval = _MIN(nextMainISR, ftMotion_nextAuxISR);
- nextMainISR -= interval;
+
+ interval = FTM_MIN_TICKS;
ftMotion_nextAuxISR -= interval;
}
@@ -2237,13 +2245,13 @@ hal_timer_t Stepper::calc_timer_interval(uint32_t step_rate) {
#endif // !CPU_32_BIT
}
-#if ENABLED(NONLINEAR_EXTRUSION)
- void Stepper::calc_nonlinear_e(uint32_t step_rate) {
- const uint32_t velocity = ne_scale * step_rate; // Scale step_rate first so all intermediate values stay in range of 8.24 fixed point math
- int32_t vd = (((((int64_t)ne_fix.A * velocity) >> 24) * velocity) >> 24) + (((int64_t)ne_fix.B * velocity) >> 24);
- NOLESS(vd, 0);
+#if NONLINEAR_EXTRUSION_Q24
+ void Stepper::calc_nonlinear_e(const uint32_t step_rate) {
+ const uint32_t velocity_q24 = ne_scale_q24 * step_rate; // Scale step_rate first so all intermediate values stay in range of 8.24 fixed point math
+ int32_t vd_q24 = (((((int64_t)ne_q24.A * velocity_q24) >> 24) * velocity_q24) >> 24) + (((int64_t)ne_q24.B * velocity_q24) >> 24);
+ NOLESS(vd_q24, 0);
- advance_dividend.e = (uint64_t(ne_fix.C + vd) * ne_edividend) >> 24;
+ advance_dividend.e = (uint64_t(ne_q24.C + vd_q24) * ne_edividend) >> 24;
}
#endif
@@ -2459,9 +2467,7 @@ hal_timer_t Stepper::block_phase_isr() {
acceleration_time += interval;
deceleration_time = 0; // Reset since we're doing acceleration first.
- #if ENABLED(NONLINEAR_EXTRUSION)
- calc_nonlinear_e(acc_step_rate << oversampling_factor);
- #endif
+ calc_nonlinear_e(acc_step_rate << oversampling_factor);
#if HAS_ROUGH_LIN_ADVANCE
if (la_active) {
@@ -2525,9 +2531,7 @@ hal_timer_t Stepper::block_phase_isr() {
interval = calc_multistep_timer_interval(step_rate << oversampling_factor);
deceleration_time += interval;
- #if ENABLED(NONLINEAR_EXTRUSION)
- calc_nonlinear_e(step_rate << oversampling_factor);
- #endif
+ calc_nonlinear_e(step_rate << oversampling_factor);
#if HAS_ROUGH_LIN_ADVANCE
if (la_active) {
@@ -2580,9 +2584,7 @@ hal_timer_t Stepper::block_phase_isr() {
TERN_(SMOOTH_LIN_ADVANCE, curr_step_rate = current_block->nominal_rate;)
deceleration_time = ticks_nominal / 2;
- #if ENABLED(NONLINEAR_EXTRUSION)
- calc_nonlinear_e(current_block->nominal_rate << oversampling_factor);
- #endif
+ calc_nonlinear_e(current_block->nominal_rate << oversampling_factor);
#if HAS_ROUGH_LIN_ADVANCE
if (la_active)
@@ -2832,18 +2834,18 @@ hal_timer_t Stepper::block_phase_isr() {
acc_step_rate = current_block->initial_rate;
#endif
- #if ENABLED(NONLINEAR_EXTRUSION)
+ #if NONLINEAR_EXTRUSION_Q24
ne_edividend = advance_dividend.e;
const float scale = (float(ne_edividend) / advance_divisor) * planner.mm_per_step[E_AXIS_N(current_block->extruder)];
- ne_scale = (1L << 24) * scale;
+ ne_scale_q24 = _BV32(24) * scale;
if (current_block->direction_bits.e && ANY_AXIS_MOVES(current_block)) {
- ne_fix.A = (1L << 24) * ne.A;
- ne_fix.B = (1L << 24) * ne.B;
- ne_fix.C = (1L << 24) * ne.C;
+ ne_q24.A = _BV32(24) * ne.A;
+ ne_q24.B = _BV32(24) * ne.B;
+ ne_q24.C = _BV32(24) * ne.C;
}
else {
- ne_fix.A = ne_fix.B = 0;
- ne_fix.C = (1L << 24);
+ ne_q24.A = ne_q24.B = 0;
+ ne_q24.C = _BV32(24);
}
#endif
@@ -2852,9 +2854,7 @@ hal_timer_t Stepper::block_phase_isr() {
// Initialize ac/deceleration time as if half the time passed.
acceleration_time = deceleration_time = interval / 2;
- #if ENABLED(NONLINEAR_EXTRUSION)
- calc_nonlinear_e(current_block->initial_rate << oversampling_factor);
- #endif
+ calc_nonlinear_e(current_block->initial_rate << oversampling_factor);
#if ENABLED(LIN_ADVANCE)
#if ENABLED(SMOOTH_LIN_ADVANCE)
@@ -2877,17 +2877,27 @@ hal_timer_t Stepper::block_phase_isr() {
#if ENABLED(SMOOTH_LIN_ADVANCE)
- float Stepper::extruder_advance_tau[DISTINCT_E],
- Stepper::extruder_advance_tau_ticks[DISTINCT_E],
- Stepper::extruder_advance_alpha[DISTINCT_E];
+ float Stepper::extruder_advance_tau[DISTINCT_E];
+ uint32_t Stepper::extruder_advance_tau_ticks[DISTINCT_E],
+ Stepper::extruder_advance_alpha_q30[DISTINCT_E];
- void Stepper::set_la_interval(const int32_t rate) {
- if (rate == 0) {
+ void Stepper::set_la_interval(int32_t step_rate) {
+ if (step_rate == 0) {
la_interval = LA_ADV_NEVER;
}
else {
- const bool forward_e = rate > 0;
- la_interval = calc_timer_interval(uint32_t(ABS(rate)));
+ const bool forward_e = step_rate > 0;
+
+ #if ENABLED(NONLINEAR_EXTRUSION)
+ if (forward_e && ANY_AXIS_MOVES(current_block)) {
+ // Maximum polynomial value is just above 1, like 1.05..1.2, less than 2 anyway, so we can use 30 bits for fractional part
+ int32_t vd_q30 = ne_q30.A*step_rate*step_rate + ne_q30.B*step_rate;
+ NOLESS(vd_q30, 0);
+ step_rate = (int64_t(step_rate) * (ne_q30.C + vd_q30)) >> 30;
+ }
+ #endif
+
+ la_interval = calc_timer_interval(uint32_t(ABS(step_rate)));
if (forward_e != motor_direction(E_AXIS)) {
last_direction_bits.toggle(E_AXIS);
count_direction.e = -count_direction.e;
@@ -2904,117 +2914,119 @@ hal_timer_t Stepper::block_phase_isr() {
constexpr uint16_t IS_COMPENSATION_BUFFER_SIZE = uint16_t(float(SMOOTH_LIN_ADV_HZ) / float(SHAPING_MIN_FREQ) / 2.0f + 0.5f);
typedef struct {
- xy_float_t buffer[IS_COMPENSATION_BUFFER_SIZE];
+ xy_long_t buffer[IS_COMPENSATION_BUFFER_SIZE];
uint16_t index;
+ FORCE_INLINE void add(const xy_long_t &input) {
+ buffer[index] = input;
+ if (++index == IS_COMPENSATION_BUFFER_SIZE) index = 0;
+ }
+ FORCE_INLINE xy_long_t past_item(const uint16_t n) {
+ const int16_t i = int16_t(index) - n;
+ return buffer[i >= 0 ? i : i + IS_COMPENSATION_BUFFER_SIZE];
+ }
} DelayBuffer;
DelayBuffer delayBuffer;
- void add_to_buffer(xy_float_t input) {
- delayBuffer.buffer[delayBuffer.index++] = input;
- if (delayBuffer.index == IS_COMPENSATION_BUFFER_SIZE)
- delayBuffer.index = 0;
- }
-
- xy_float_t lookback(shaping_time_t t /* in stepper timer ticks */) {
- constexpr float ADV_TICKS_PER_STEPPER_TICKS = float(SMOOTH_LIN_ADV_HZ) / (STEPPER_TIMER_RATE);
- uint32_t delay_steps = t * ADV_TICKS_PER_STEPPER_TICKS + 0.5f; // Convert time to steps
- uint16_t past_i;
- if (delay_steps>= IS_COMPENSATION_BUFFER_SIZE) {
- // this means the buffer is too small. TODO: how to inform user?
- past_i = delayBuffer.index;
- }
- else {
- past_i = (delayBuffer.index + IS_COMPENSATION_BUFFER_SIZE - delay_steps) % IS_COMPENSATION_BUFFER_SIZE;
- }
- return delayBuffer.buffer[past_i];
+ xy_long_t smooth_lin_adv_lookback(const shaping_time_t stepper_ticks) {
+ constexpr uint32_t ADV_TICKS_PER_STEPPER_TICKS_Q30 = (uint64_t(SMOOTH_LIN_ADV_HZ) * _BV32(30)) / STEPPER_TIMER_RATE;
+ const uint16_t delay_steps = MULT_Q(30, stepper_ticks, ADV_TICKS_PER_STEPPER_TICKS_Q30);
+ return delayBuffer.past_item(delay_steps);
}
#endif // INPUT_SHAPING_E_SYNC
- float lookahead(uint32_t t) {
+ int32_t smooth_lin_adv_lookahead(uint32_t stepper_ticks) {
for (uint8_t i = 0; block_t *block = planner.get_future_block(i); i++) {
if (block->is_sync()) continue;
- if (t <= block->acceleration_time) {
- if (!block->use_advance_lead) return 0.0f;
- uint32_t rate = STEP_MULTIPLY(t, block->acceleration_rate) + block->initial_rate;
+ if (stepper_ticks <= block->acceleration_time) {
+ if (!block->use_advance_lead) return 0;
+ uint32_t rate = STEP_MULTIPLY(stepper_ticks, block->acceleration_rate) + block->initial_rate;
NOMORE(rate, block->nominal_rate);
- return rate * block->e_step_ratio;
+ return MULT_Q(30, rate, block->e_step_ratio_q30);
}
- t -= block->acceleration_time;
+ stepper_ticks -= block->acceleration_time;
- if (t <= block->cruise_time) {
- if (!block->use_advance_lead) return 0.0f;
- return block->cruise_rate * block->e_step_ratio;
+ if (stepper_ticks <= block->cruise_time) {
+ if (!block->use_advance_lead) return 0;
+ return MULT_Q(30, block->cruise_rate, block->e_step_ratio_q30);
}
- t -= block->cruise_time;
+ stepper_ticks -= block->cruise_time;
- if (t <= block->deceleration_time) {
- if (!block->use_advance_lead) return 0.0f;
- uint32_t rate = STEP_MULTIPLY(t, block->acceleration_rate);
+ if (stepper_ticks <= block->deceleration_time) {
+ if (!block->use_advance_lead) return 0;
+ uint32_t rate = STEP_MULTIPLY(stepper_ticks, block->acceleration_rate);
if (rate < block->cruise_rate) {
rate = block->cruise_rate - rate;
NOLESS(rate, block->final_rate);
}
else
rate = block->final_rate;
- return rate * block->e_step_ratio;
+ return MULT_Q(30, rate, block->e_step_ratio_q30);
}
- t -= block->deceleration_time;
+ stepper_ticks -= block->deceleration_time;
}
- return 0.0f;
+ return 0;
}
hal_timer_t Stepper::smooth_lin_adv_isr() {
- float target_adv_steps = 0;
+ int32_t target_adv_steps = 0;
if (current_block) {
- const uint32_t t = extruder_advance_tau_ticks[0] + curr_timer_tick;
- target_adv_steps = lookahead(t) * planner.extruder_advance_K[0];
+ const uint32_t stepper_ticks = extruder_advance_tau_ticks[E_INDEX_N(active_extruder)] + curr_timer_tick;
+ target_adv_steps = MULT_Q(27, smooth_lin_adv_lookahead(stepper_ticks), planner.get_advance_k_q27());
}
else {
curr_step_rate = 0;
}
- static float last_target_adv_steps = 0;
- constexpr float dt_inv = SMOOTH_LIN_ADV_HZ;
- float la_step_rate = (target_adv_steps - last_target_adv_steps) * dt_inv;
+ static int32_t last_target_adv_steps = 0;
+ constexpr uint16_t dt_inv = SMOOTH_LIN_ADV_HZ;
+ int32_t la_step_rate = (target_adv_steps - last_target_adv_steps) * dt_inv;
last_target_adv_steps = target_adv_steps;
- static float smoothed_vals[SMOOTH_LIN_ADV_EXP_ORDER] = {0};
+ static int32_t smoothed_vals[SMOOTH_LIN_ADV_EXP_ORDER] = {0};
+
for (uint8_t i = 0; i < SMOOTH_LIN_ADV_EXP_ORDER; i++) {
// Approximate gaussian smoothing via higher order exponential smoothing
- la_step_rate = extruder_advance_alpha[0] * la_step_rate + (1 - extruder_advance_alpha[0]) * smoothed_vals[i];
- smoothed_vals[i] = la_step_rate;
+ smoothed_vals[i] += MULT_Q(30, la_step_rate - smoothed_vals[i], extruder_advance_alpha_q30[E_INDEX_N(active_extruder)]);
+ la_step_rate = smoothed_vals[i];
}
- const float planned_step_rate = current_block ? curr_step_rate * current_block->e_step_ratio : 0;
- float total_step_rate = la_step_rate + planned_step_rate;
+
+ const int32_t planned_step_rate = current_block
+ ? MULT_Q(30, curr_step_rate, current_block->e_step_ratio_q30)
+ : 0;
+
+ int32_t total_step_rate = la_step_rate + planned_step_rate;
#if ENABLED(INPUT_SHAPING_E_SYNC)
- xy_float_t pre_shaping_rate = xy_float_t({0, 0}),
- first_pulse_rate = xy_float_t({0, 0});
- float unshaped_rate_e = total_step_rate;
+ xy_long_t pre_shaping_rate = xy_long_t({0, 0}),
+ first_pulse_rate = xy_long_t({0, 0});
+ int32_t unshaped_rate_e = total_step_rate;
if (current_block) {
- const float xy_length = TERN0(INPUT_SHAPING_X, current_block->steps.x) + TERN0(INPUT_SHAPING_Y, current_block->steps.y);
- if (xy_length > 0) {
+ if (current_block->xy_length_inv_q30 > 0) {
unshaped_rate_e = 0;
- pre_shaping_rate = xy_float_t({
- TERN0(INPUT_SHAPING_X, total_step_rate * current_block->steps.x / xy_length),
- TERN0(INPUT_SHAPING_Y, total_step_rate * current_block->steps.y / xy_length)
+
+ pre_shaping_rate = xy_long_t({
+ TERN0(INPUT_SHAPING_X, MULT_Q(30, total_step_rate * current_block->steps.x, current_block->xy_length_inv_q30)),
+ TERN0(INPUT_SHAPING_Y, MULT_Q(30, total_step_rate * current_block->steps.y, current_block->xy_length_inv_q30))
});
- first_pulse_rate = xy_float_t({
- TERN0(INPUT_SHAPING_X, pre_shaping_rate.x * Stepper::shaping_x.factor1 / 128.0f),
- TERN0(INPUT_SHAPING_Y, pre_shaping_rate.y * Stepper::shaping_y.factor1 / 128.0f)
+
+ first_pulse_rate = xy_long_t({
+ TERN0(INPUT_SHAPING_X, (pre_shaping_rate.x * Stepper::shaping_x.factor1) >> 7),
+ TERN0(INPUT_SHAPING_Y, (pre_shaping_rate.y * Stepper::shaping_y.factor1) >> 7)
});
}
}
- const xy_float_t second_pulse_rate = {
- TERN0(INPUT_SHAPING_X, lookback(ShapingQueue::get_delay_x()).x * Stepper::shaping_x.factor2 / 128.0f),
- TERN0(INPUT_SHAPING_Y, lookback(ShapingQueue::get_delay_y()).y * Stepper::shaping_y.factor2 / 128.0f)
- };
- add_to_buffer(pre_shaping_rate);
- const float x = TERN0(INPUT_SHAPING_X, first_pulse_rate.x + second_pulse_rate.x),
- y = TERN0(INPUT_SHAPING_Y, first_pulse_rate.y + second_pulse_rate.y);
+ const xy_long_t second_pulse_rate = {
+ TERN0(INPUT_SHAPING_X, (smooth_lin_adv_lookback(ShapingQueue::get_delay_x()).x * Stepper::shaping_x.factor2)) >> 7,
+ TERN0(INPUT_SHAPING_Y, (smooth_lin_adv_lookback(ShapingQueue::get_delay_y()).y * Stepper::shaping_y.factor2)) >> 7
+ };
+
+ delayBuffer.add(pre_shaping_rate);
+
+ const int32_t x = TERN0(INPUT_SHAPING_X, first_pulse_rate.x + second_pulse_rate.x),
+ y = TERN0(INPUT_SHAPING_Y, first_pulse_rate.y + second_pulse_rate.y);
total_step_rate = unshaped_rate_e + x + y;
@@ -3025,6 +3037,7 @@ hal_timer_t Stepper::block_phase_isr() {
curr_timer_tick += SMOOTH_LIN_ADV_INTERVAL;
return SMOOTH_LIN_ADV_INTERVAL;
}
+
#endif // SMOOTH_LIN_ADVANCE
// Timer interrupt for E. LA_steps is set in the main routine
diff --git a/Marlin/src/module/stepper.h b/Marlin/src/module/stepper.h
index 1c06d83351..73fd28fe85 100644
--- a/Marlin/src/module/stepper.h
+++ b/Marlin/src/module/stepper.h
@@ -147,7 +147,7 @@ constexpr ena_mask_t enable_overlap[] = {
TERN0(INPUT_SHAPING_Z, _ISDMF[Z_AXIS] * _ISDASU[Z_AXIS]);
#if defined(__AVR__) || !defined(ADAPTIVE_STEP_SMOOTHING)
// min_step_isr_frequency is known at compile time on AVRs and any reduction in SRAM is welcome
- template constexpr float max_isr_rate() {
+ template constexpr float max_isr_rate() {
return _MAX(_ISDMF[ALIM(INDEX - 1, _ISDMF)] * _ISDASU[ALIM(INDEX - 1, _ISDASU)], max_isr_rate());
}
template<> constexpr float max_isr_rate<0>() {
@@ -285,7 +285,12 @@ constexpr ena_mask_t enable_overlap[] = {
#if ENABLED(NONLINEAR_EXTRUSION)
typedef struct { float A, B, C; void reset() { A = B = 0.0f; C = 1.0f; } } ne_coeff_t;
- typedef struct { int32_t A, B, C; } ne_fix_t;
+ #if DISABLED(SMOOTH_LIN_ADVANCE)
+ #define NONLINEAR_EXTRUSION_Q24 1
+ typedef struct { int32_t A, B, C; } ne_q24_t;
+ #else
+ typedef struct { int32_t A, B, C; } ne_q30_t;
+ #endif
#endif
//
@@ -343,6 +348,11 @@ class Stepper {
#if ENABLED(NONLINEAR_EXTRUSION)
static ne_coeff_t ne;
+ #if NONLINEAR_EXTRUSION_Q24
+ static ne_q24_t ne_q24;
+ #else
+ static ne_q30_t ne_q30;
+ #endif
#endif
#if ENABLED(ADAPTIVE_STEP_SMOOTHING_TOGGLE)
@@ -352,13 +362,18 @@ class Stepper {
#endif
#if ENABLED(SMOOTH_LIN_ADVANCE)
- static void set_advance_tau(const_float_t tau, const uint8_t e=E_INDEX_N(active_extruder)) {
- extruder_advance_tau[e] = tau;
- extruder_advance_tau_ticks[e] = tau * (STEPPER_TIMER_RATE); // i.e., <= STEPPER_TIMER_RATE / 2
+ static float extruder_advance_tau[DISTINCT_E]; // Smoothing time; also the lookahead time of the smoother
+ static void set_advance_tau(const_float_t tau, const uint8_t e=active_extruder) {
+ const uint8_t i = E_INDEX_N(e);
+ extruder_advance_tau[i] = tau;
+ extruder_advance_tau_ticks[i] = tau * STEPPER_TIMER_RATE;
// α=1−exp(−dt/τ)
- extruder_advance_alpha[e] = 1.0f - expf(-(SMOOTH_LIN_ADV_INTERVAL) * (SMOOTH_LIN_ADV_EXP_ORDER) / extruder_advance_tau_ticks[e]);
+ const float alpha_float = 1.0f - expf(-float(SMOOTH_LIN_ADV_INTERVAL) * (SMOOTH_LIN_ADV_EXP_ORDER) / extruder_advance_tau_ticks[i]);
+ extruder_advance_alpha_q30[i] = int32_t(alpha_float * _BV32(30));
+ }
+ static float get_advance_tau(const uint8_t e=active_extruder) {
+ return extruder_advance_tau[E_INDEX_N(e)];
}
- static float get_advance_tau(const uint8_t e=E_INDEX_N(active_extruder)) { return extruder_advance_tau[e]; }
#endif
private:
@@ -449,12 +464,11 @@ class Stepper {
static hal_timer_t nextAdvanceISR,
la_interval; // Interval between ISR calls for LA
#if ENABLED(SMOOTH_LIN_ADVANCE)
- static uint32_t curr_timer_tick, // Current tick relative to block start
- curr_step_rate; // Current motion step rate
- static float extruder_advance_tau[DISTINCT_E], // Smoothing time; also the lookahead time of the smoother
- extruder_advance_tau_ticks[DISTINCT_E], // Same as extruder_advance_tau but in in stepper timer ticks
- extruder_advance_alpha[DISTINCT_E]; // The smoothing factor of each stage of the high-order exponential
- // smoothing filter (calculated from tau)
+ static uint32_t curr_timer_tick, // Current tick relative to block start
+ curr_step_rate; // Current motion step rate
+ static uint32_t extruder_advance_tau_ticks[DISTINCT_E], // Same as extruder_advance_tau but in in stepper timer ticks
+ extruder_advance_alpha_q30[DISTINCT_E]; // The smoothing factor of each stage of the high-order exponential
+ // smoothing filter (calculated from tau)
#else
static int32_t la_delta_error, // Analogue of delta_error.e for E steps in LA ISR
la_dividend, // Analogue of advance_dividend.e for E steps in LA ISR
@@ -463,10 +477,9 @@ class Stepper {
#endif
#endif
- #if ENABLED(NONLINEAR_EXTRUSION)
+ #if NONLINEAR_EXTRUSION_Q24
static int32_t ne_edividend;
- static uint32_t ne_scale;
- static ne_fix_t ne_fix;
+ static uint32_t ne_scale_q24;
#endif
#if ENABLED(BABYSTEPPING)
@@ -527,7 +540,7 @@ class Stepper {
// The Linear advance ISR phase
static void advance_isr();
#if ENABLED(SMOOTH_LIN_ADVANCE)
- static void set_la_interval(const int32_t rate);
+ static void set_la_interval(int32_t step_rate);
static hal_timer_t smooth_lin_adv_isr();
#endif
#endif
@@ -734,8 +747,10 @@ class Stepper {
// Evaluate axis motions and set bits in axis_did_move
static void set_axis_moved_for_current_block();
- #if ENABLED(NONLINEAR_EXTRUSION)
- static void calc_nonlinear_e(uint32_t step_rate);
+ #if NONLINEAR_EXTRUSION_Q24
+ static void calc_nonlinear_e(const uint32_t step_rate);
+ #else
+ static void calc_nonlinear_e(const uint32_t) {}
#endif
#if ENABLED(S_CURVE_ACCELERATION)
diff --git a/Marlin/src/module/stepper/trinamic.cpp b/Marlin/src/module/stepper/trinamic.cpp
index 3ec8ff4325..0f4a8aa89c 100644
--- a/Marlin/src/module/stepper/trinamic.cpp
+++ b/Marlin/src/module/stepper/trinamic.cpp
@@ -40,15 +40,37 @@ enum StealthIndex : uint8_t {
};
#define TMC_INIT(ST, STEALTH_INDEX) tmc_init(stepper##ST, ST##_CURRENT, ST##_MICROSTEPS, ST##_HYBRID_THRESHOLD, stealthchop_by_axis[STEALTH_INDEX], chopper_timing_##ST, ST##_INTERPOLATE, ST##_HOLD_MULTIPLIER)
+//
// IC = TMC model number
// ST = Stepper object letter
// L = Label characters
// AI = Axis Enum Index
// SWHW = SW/SH UART selection
+//
+
#if ENABLED(TMC_USE_SW_SPI)
- #define __TMC_SPI_DEFINE(IC, ST, L, AI) TMCMarlin stepper##ST(ST##_CS_PIN, float(ST##_RSENSE), TMC_SPI_MOSI, TMC_SPI_MISO, TMC_SPI_SCK, ST##_CHAIN_POS)
+ #define __TMC_SPI_RSENSE_DEFINE(IC, ST, L, LI, AI) TMCMarlin stepper##ST(ST##_CS_PIN, float(ST##_RSENSE), TMC_SPI_MOSI, TMC_SPI_MISO, TMC_SPI_SCK, ST##_CHAIN_POS)
+ #define __TMC_SPI_DEFINE_TMC2240(IC, ST, L, LI, AI) TMCMarlin stepper##ST(ST##_CS_PIN, TMC_SPI_MOSI, TMC_SPI_MISO, TMC_SPI_SCK, ST##_CHAIN_POS)
#else
- #define __TMC_SPI_DEFINE(IC, ST, L, AI) TMCMarlin stepper##ST(ST##_CS_PIN, float(ST##_RSENSE), ST##_CHAIN_POS)
+ #define __TMC_SPI_RSENSE_DEFINE(IC, ST, L, LI, AI) TMCMarlin stepper##ST(ST##_CS_PIN, float(ST##_RSENSE), ST##_CHAIN_POS)
+ #define __TMC_SPI_DEFINE_TMC2240(IC, ST, L, LI, AI) TMCMarlin stepper##ST(ST##_CS_PIN, ST##_CHAIN_POS)
+#endif
+#define __TMC_SPI_DEFINE_TMC2100 __TMC_SPI_RSENSE_DEFINE
+#define __TMC_SPI_DEFINE_TMC2130 __TMC_SPI_RSENSE_DEFINE
+#define __TMC_SPI_DEFINE_TMC2160 __TMC_SPI_RSENSE_DEFINE
+#define __TMC_SPI_DEFINE_TMC2208 __TMC_SPI_RSENSE_DEFINE
+#define __TMC_SPI_DEFINE_TMC2209 __TMC_SPI_RSENSE_DEFINE
+#define __TMC_SPI_DEFINE_TMC2660 __TMC_SPI_RSENSE_DEFINE
+#define __TMC_SPI_DEFINE_TMC5130 __TMC_SPI_RSENSE_DEFINE
+#define __TMC_SPI_DEFINE_TMC5160 __TMC_SPI_RSENSE_DEFINE
+
+#define __TMC_SPI_DEFINE(IC, ST, LandI, AI) __TMC_SPI_DEFINE_##IC(IC, ST, LandI, AI)
+#define _TMC_SPI_DEFINE(IC, ST, AI) __TMC_SPI_DEFINE(IC, ST, TMC_##ST##_LABEL, AI)
+#define TMC_SPI_DEFINE(ST, AI) _TMC_SPI_DEFINE(ST##_DRIVER_TYPE, ST, AI##_AXIS)
+#if ENABLED(DISTINCT_E_FACTORS)
+ #define TMC_SPI_DEFINE_E(AI) TMC_SPI_DEFINE(E##AI, E##AI)
+#else
+ #define TMC_SPI_DEFINE_E(AI) TMC_SPI_DEFINE(E##AI, E)
#endif
#if ENABLED(TMC_SERIAL_MULTIPLEXER)
@@ -59,17 +81,11 @@ enum StealthIndex : uint8_t {
#define TMC_UART_SW_DEFINE(IC, ST, L, AI) TMCMarlin stepper##ST(ST##_SERIAL_RX_PIN, ST##_SERIAL_TX_PIN, float(ST##_RSENSE), ST##_SLAVE_ADDRESS)
-#define _TMC_SPI_DEFINE(IC, ST, AI) __TMC_SPI_DEFINE(IC, ST, TMC_##ST##_LABEL, AI)
-#define TMC_SPI_DEFINE(ST, AI) _TMC_SPI_DEFINE(ST##_DRIVER_TYPE, ST, AI##_AXIS)
-
#define _TMC_UART_DEFINE(SWHW, IC, ST, AI) TMC_UART_##SWHW##_DEFINE(IC, ST, TMC_##ST##_LABEL, AI)
#define TMC_UART_DEFINE(SWHW, ST, AI) _TMC_UART_DEFINE(SWHW, ST##_DRIVER_TYPE, ST, AI##_AXIS)
-
#if ENABLED(DISTINCT_E_FACTORS)
- #define TMC_SPI_DEFINE_E(AI) TMC_SPI_DEFINE(E##AI, E##AI)
#define TMC_UART_DEFINE_E(SWHW, AI) TMC_UART_DEFINE(SWHW, E##AI, E##AI)
#else
- #define TMC_SPI_DEFINE_E(AI) TMC_SPI_DEFINE(E##AI, E)
#define TMC_UART_DEFINE_E(SWHW, AI) TMC_UART_DEFINE(SWHW, E##AI, E)
#endif
@@ -219,7 +235,10 @@ enum StealthIndex : uint8_t {
#if HAS_DRIVER(TMC2130)
template
- void tmc_init(TMCMarlin &st, const uint16_t mA, const uint16_t microsteps, const uint32_t hyb_thrs, const bool stealth, const chopper_timing_t &chop_init, const bool interpolate, float hold_multiplier) {
+ void tmc_init(TMCMarlin &st,
+ const uint16_t mA, const uint16_t microsteps, const uint32_t hyb_thrs, const bool stealth,
+ const chopper_timing_t &chop_init, const bool interpolate, float hold_multiplier
+ ) {
st.begin();
CHOPCONF_t chopconf{0};
@@ -254,7 +273,10 @@ enum StealthIndex : uint8_t {
#if HAS_DRIVER(TMC2160)
template
- void tmc_init(TMCMarlin &st, const uint16_t mA, const uint16_t microsteps, const uint32_t hyb_thrs, const bool stealth, const chopper_timing_t &chop_init, const bool interpolate, float hold_multiplier) {
+ void tmc_init(TMCMarlin &st,
+ const uint16_t mA, const uint16_t microsteps, const uint32_t hyb_thrs, const bool stealth,
+ const chopper_timing_t &chop_init, const bool interpolate, float hold_multiplier
+ ) {
st.begin();
CHOPCONF_t chopconf{0};
@@ -670,7 +692,10 @@ enum StealthIndex : uint8_t {
#if HAS_DRIVER(TMC2208)
template
- void tmc_init(TMCMarlin &st, const uint16_t mA, const uint16_t microsteps, const uint32_t hyb_thrs, const bool stealth, const chopper_timing_t &chop_init, const bool interpolate, float hold_multiplier) {
+ void tmc_init(TMCMarlin &st,
+ const uint16_t mA, const uint16_t microsteps, const uint32_t hyb_thrs, const bool stealth,
+ const chopper_timing_t &chop_init, const bool interpolate, float hold_multiplier
+ ) {
TMC2208_n::GCONF_t gconf{0};
gconf.pdn_disable = true; // Use UART
gconf.mstep_reg_select = true; // Select microsteps with UART
@@ -712,7 +737,10 @@ enum StealthIndex : uint8_t {
#if HAS_DRIVER(TMC2209)
template
- void tmc_init(TMCMarlin &st, const uint16_t mA, const uint16_t microsteps, const uint32_t hyb_thrs, const bool stealth, const chopper_timing_t &chop_init, const bool interpolate, float hold_multiplier) {
+ void tmc_init(TMCMarlin &st,
+ const uint16_t mA, const uint16_t microsteps, const uint32_t hyb_thrs, const bool stealth,
+ const chopper_timing_t &chop_init, const bool interpolate, float hold_multiplier
+ ) {
TMC2208_n::GCONF_t gconf{0};
gconf.pdn_disable = true; // Use UART
gconf.mstep_reg_select = true; // Select microsteps with UART
@@ -752,9 +780,58 @@ enum StealthIndex : uint8_t {
}
#endif // TMC2209
+#if HAS_DRIVER(TMC2240)
+ template
+ void tmc_init(TMCMarlin &st,
+ const uint16_t mA, const uint16_t microsteps, const uint32_t hyb_thrs, const bool stealth,
+ const chopper_timing_t &chop_init, const bool interpolate, float hold_multiplier
+ ) {
+ st.begin();
+
+ st.Rref = TMC2240_Rref;
+ TMC2240_n::DRV_CONF_t drv_conf{0};
+ drv_conf.current_range = TMC2240_CURRENT_RANGE;
+ drv_conf.slope_control = TMC2240_SLOPE_CONTROL;
+ st.DRV_CONF(drv_conf.sr);
+
+ CHOPCONF_t chopconf{0};
+ chopconf.tbl = 0b01;
+ chopconf.toff = chop_init.toff;
+ chopconf.intpol = interpolate;
+ chopconf.hend = chop_init.hend + 3;
+ chopconf.hstrt = chop_init.hstrt - 1;
+ TERN_(EDGE_STEPPING, chopconf.dedge = true);
+ st.CHOPCONF(chopconf.sr);
+
+ st.rms_current(mA, hold_multiplier);
+ st.microsteps(microsteps);
+ st.iholddelay(10);
+ st.TPOWERDOWN(128); // ~2s until driver lowers to hold current
+
+ st.en_pwm_mode(stealth);
+ st.stored.stealthChop_enabled = stealth;
+
+ TMC2240_n::PWMCONF_t pwmconf{0};
+ pwmconf.pwm_lim = 12;
+ pwmconf.pwm_reg = 8;
+ pwmconf.pwm_autograd = true;
+ pwmconf.pwm_autoscale = true;
+ pwmconf.pwm_freq = 0b01;
+ pwmconf.pwm_grad = 14;
+ pwmconf.pwm_ofs = 36;
+ st.PWMCONF(pwmconf.sr);
+
+ TERN(HYBRID_THRESHOLD, st.set_pwm_thrs(hyb_thrs), UNUSED(hyb_thrs));
+ st.GSTAT(); // Clear GSTAT
+ }
+#endif // TMC2240
+
#if HAS_DRIVER(TMC2660)
template
- void tmc_init(TMCMarlin &st, const uint16_t mA, const uint16_t microsteps, const uint32_t, const bool, const chopper_timing_t &chop_init, const bool interpolate, float hold_multiplier) {
+ void tmc_init(TMCMarlin &st,
+ const uint16_t mA, const uint16_t microsteps, const uint32_t, const bool,
+ const chopper_timing_t &chop_init, const bool interpolate, float hold_multiplier
+ ) {
st.begin();
TMC2660_n::CHOPCONF_t chopconf{0};
@@ -776,7 +853,10 @@ enum StealthIndex : uint8_t {
#if HAS_DRIVER(TMC5130)
template
- void tmc_init(TMCMarlin &st, const uint16_t mA, const uint16_t microsteps, const uint32_t hyb_thrs, const bool stealth, const chopper_timing_t &chop_init, const bool interpolate, float hold_multiplier) {
+ void tmc_init(TMCMarlin &st,
+ const uint16_t mA, const uint16_t microsteps, const uint32_t hyb_thrs, const bool stealth,
+ const chopper_timing_t &chop_init, const bool interpolate, float hold_multiplier
+ ) {
st.begin();
CHOPCONF_t chopconf{0};
@@ -811,7 +891,10 @@ enum StealthIndex : uint8_t {
#if HAS_DRIVER(TMC5160)
template
- void tmc_init(TMCMarlin &st, const uint16_t mA, const uint16_t microsteps, const uint32_t hyb_thrs, const bool stealth, const chopper_timing_t &chop_init, const bool interpolate, float hold_multiplier) {
+ void tmc_init(TMCMarlin &st,
+ const uint16_t mA, const uint16_t microsteps, const uint32_t hyb_thrs, const bool stealth,
+ const chopper_timing_t &chop_init, const bool interpolate, float hold_multiplier
+ ) {
st.begin();
CHOPCONF_t chopconf{0};
@@ -842,6 +925,7 @@ enum StealthIndex : uint8_t {
st.PWMCONF(pwmconf.sr);
TERN(HYBRID_THRESHOLD, st.set_pwm_thrs(hyb_thrs), UNUSED(hyb_thrs));
+
st.GSTAT(); // Clear GSTAT
}
#endif // TMC5160
diff --git a/Marlin/src/module/stepper/trinamic.h b/Marlin/src/module/stepper/trinamic.h
index 0fd48f18cb..d43a1d231b 100644
--- a/Marlin/src/module/stepper/trinamic.h
+++ b/Marlin/src/module/stepper/trinamic.h
@@ -38,6 +38,7 @@
#define CLASS_TMC2160 TMC2160Stepper
#define CLASS_TMC2208 TMC2208Stepper
#define CLASS_TMC2209 TMC2209Stepper
+#define CLASS_TMC2240 TMC2240Stepper
#define CLASS_TMC2660 TMC2660Stepper
#define CLASS_TMC5130 TMC5130Stepper
#define CLASS_TMC5160 TMC5160Stepper
diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp
index 30690345a5..5c760a7689 100644
--- a/Marlin/src/module/temperature.cpp
+++ b/Marlin/src/module/temperature.cpp
@@ -1104,6 +1104,10 @@ void Temperature::factory_reset() {
do_z_clearance(MPC_TUNING_END_Z, false);
+ #ifdef EVENT_GCODE_AFTER_MPC_TUNE
+ gcode.process_subcommands_now(F(EVENT_GCODE_AFTER_MPC_TUNE));
+ #endif
+
TERN_(TEMP_TUNING_MAINTAIN_FAN, adaptive_fan_slowing = true);
}
diff --git a/Marlin/src/module/tool_change.cpp b/Marlin/src/module/tool_change.cpp
index fcaa64cefe..980f9327b5 100644
--- a/Marlin/src/module/tool_change.cpp
+++ b/Marlin/src/module/tool_change.cpp
@@ -1587,7 +1587,7 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) {
#endif
// Migrate Linear Advance K factor to the new extruder
- TERN_(LIN_ADVANCE, planner.extruder_advance_K[active_extruder] = planner.extruder_advance_K[migration_extruder]);
+ TERN_(LIN_ADVANCE, planner.set_advance_k(planner.get_advance_k(migration_extruder), active_extruder));
// Temporary migration toolchange_settings restored on exit. i.e., before next tool_change().
#if defined(MIGRATION_FS_EXTRA_PRIME) \
diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h
index e6b4baddaf..3afb7fe072 100644
--- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h
+++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_3.h
@@ -43,71 +43,18 @@
//
// Limit Switches
//
-#ifdef X_STALL_SENSITIVITY
- #ifndef X_STOP_PIN
- #define X_STOP_PIN X_DIAG_PIN
- #endif
- #if X_HOME_TO_MIN
- #ifndef X_MAX_PIN
- #define X_MAX_PIN P1_28 // X+
- #endif
- #else
- #ifndef X_MIN_PIN
- #define X_MIN_PIN P1_28 // X+
- #endif
- #endif
-#else
- #ifndef X_MIN_PIN
- #define X_MIN_PIN P1_29 // X-
- #endif
- #ifndef X_MAX_PIN
- #define X_MAX_PIN P1_28 // X+
- #endif
+#ifndef X_STOP_PIN
+ #define X_STOP_PIN X_DIAG_PIN
#endif
-
-#ifdef Y_STALL_SENSITIVITY
- #ifndef Y_STOP_PIN
- #define Y_STOP_PIN Y_DIAG_PIN
- #endif
- #if Y_HOME_TO_MIN
- #ifndef Y_MAX_PIN
- #define Y_MAX_PIN P1_26 // Y+
- #endif
- #else
- #ifndef Y_MIN_PIN
- #define Y_MIN_PIN P1_26 // Y+
- #endif
- #endif
-#else
- #ifndef Y_MIN_PIN
- #define Y_MIN_PIN P1_27 // Y-
- #endif
- #ifndef Y_MAX_PIN
- #define Y_MAX_PIN P1_26 // Y+
- #endif
+#define X_OTHR_PIN P1_28 // X+
+#ifndef Y_STOP_PIN
+ #define Y_STOP_PIN Y_DIAG_PIN
#endif
-
-#ifdef Z_STALL_SENSITIVITY
- #ifndef Z_STOP_PIN
- #define Z_STOP_PIN Z_DIAG_PIN
- #endif
- #if Z_HOME_TO_MIN
- #ifndef Z_MAX_PIN
- #define Z_MAX_PIN P1_24 // Z+
- #endif
- #else
- #ifndef Z_MIN_PIN
- #define Z_MIN_PIN P1_24 // Z+
- #endif
- #endif
-#else
- #ifndef Z_MIN_PIN
- #define Z_MIN_PIN P1_25 // Z-
- #endif
- #ifndef Z_MAX_PIN
- #define Z_MAX_PIN P1_24 // Z+
- #endif
+#define Y_OTHR_PIN P1_26 // Y+
+#ifndef Z_STOP_PIN
+ #define Z_STOP_PIN Z_DIAG_PIN
#endif
+#define Z_OTHR_PIN P1_24 // Z+
#define ONBOARD_ENDSTOPPULLUPS // Board has built-in pullups
diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h
index 65718bbf45..dbb8210fd1 100644
--- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h
+++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h
@@ -70,61 +70,14 @@
//
// Limit Switches
//
-#ifdef X_STALL_SENSITIVITY
- #define X_STOP_PIN X_DIAG_PIN
- #if X_HOME_TO_MIN
- #define X_MAX_PIN P1_26 // E0DET
- #else
- #define X_MIN_PIN P1_26 // E0DET
- #endif
-#elif ENABLED(X_DUAL_ENDSTOPS)
- #ifndef X_MIN_PIN
- #define X_MIN_PIN P1_29 // X-STOP
- #endif
- #ifndef X_MAX_PIN
- #define X_MAX_PIN P1_26 // E0DET
- #endif
-#else
- #define X_STOP_PIN P1_29 // X-STOP
-#endif
-
-#ifdef Y_STALL_SENSITIVITY
- #define Y_STOP_PIN Y_DIAG_PIN
- #if Y_HOME_TO_MIN
- #define Y_MAX_PIN P1_25 // E1DET
- #else
- #define Y_MIN_PIN P1_25 // E1DET
- #endif
-#elif ENABLED(Y_DUAL_ENDSTOPS)
- #ifndef Y_MIN_PIN
- #define Y_MIN_PIN P1_28 // Y-STOP
- #endif
- #ifndef Y_MAX_PIN
- #define Y_MAX_PIN P1_25 // E1DET
- #endif
-#else
- #define Y_STOP_PIN P1_28 // Y-STOP
-#endif
-
-#ifdef Z_STALL_SENSITIVITY
+#define X_STOP_PIN X_DIAG_PIN
+#define X_OTHR_PIN P1_26 // E0DET
+#define Y_STOP_PIN Y_DIAG_PIN
+#define Y_OTHR_PIN P1_25 // E1DET
+#ifndef Z_STOP_PIN
#define Z_STOP_PIN Z_DIAG_PIN
- #if Z_HOME_TO_MIN
- #define Z_MAX_PIN P1_00 // PWRDET
- #else
- #define Z_MIN_PIN P1_00 // PWRDET
- #endif
-#elif ENABLED(Z_MULTI_ENDSTOPS)
- #ifndef Z_MIN_PIN
- #define Z_MIN_PIN P1_27 // Z-STOP
- #endif
- #ifndef Z_MAX_PIN
- #define Z_MAX_PIN P1_00 // PWRDET
- #endif
-#else
- #ifndef Z_STOP_PIN
- #define Z_STOP_PIN P1_27 // Z-STOP
- #endif
#endif
+#define Z_OTHR_PIN P1_00 // PWRDET
//
// Z Probe (when not Z_MIN_PIN)
diff --git a/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h b/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h
index 9b1258bec2..d3451665ac 100644
--- a/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h
+++ b/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h
@@ -51,41 +51,12 @@
//
// Limit Switches
//
-#ifdef X_STALL_SENSITIVITY
- #define X_STOP_PIN X_DIAG_PIN
- #if X_HOME_TO_MIN
- #define X_MAX_PIN P1_28 // X+
- #else
- #define X_MIN_PIN P1_28 // X+
- #endif
-#else
- #define X_MIN_PIN P1_29 // X-
- #define X_MAX_PIN P1_28 // X+
-#endif
-
-#ifdef Y_STALL_SENSITIVITY
- #define Y_STOP_PIN Y_DIAG_PIN
- #if Y_HOME_TO_MIN
- #define Y_MAX_PIN P1_26 // Y+
- #else
- #define Y_MIN_PIN P1_26 // Y+
- #endif
-#else
- #define Y_MIN_PIN P1_27 // Y-
- #define Y_MAX_PIN P1_26 // Y+
-#endif
-
-#ifdef Z_STALL_SENSITIVITY
- #define Z_STOP_PIN Z_DIAG_PIN
- #if Z_HOME_TO_MIN
- #define Z_MAX_PIN P1_24 // Z+
- #else
- #define Z_MIN_PIN P1_24 // Z+
- #endif
-#else
- #define Z_MIN_PIN P1_25 // Z-
- #define Z_MAX_PIN P1_24 // Z+
-#endif
+#define X_STOP_PIN X_DIAG_PIN
+#define X_OTHR_PIN P1_28 // X+
+#define Y_STOP_PIN Y_DIAG_PIN
+#define Y_OTHR_PIN P1_26 // Y+
+#define Z_STOP_PIN Z_DIAG_PIN
+#define Z_OTHR_PIN P1_24 // Z+
//
// Z Probe (when not Z_MIN_PIN)
diff --git a/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h b/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h
index eb2f31cbcb..f98449ff53 100644
--- a/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h
+++ b/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h
@@ -59,41 +59,12 @@
//
// Limit Switches
//
-#if X_STALL_SENSITIVITY
- #define X_STOP_PIN X_DIAG_PIN
- #if X_HOME_TO_MIN
- #define X_MAX_PIN P1_28 // X+
- #else
- #define X_MIN_PIN P1_28 // X+
- #endif
-#else
- #define X_MIN_PIN P1_29 // X-
- #define X_MAX_PIN P1_28 // X+
-#endif
-
-#if Y_STALL_SENSITIVITY
- #define Y_STOP_PIN Y_DIAG_PIN
- #if Y_HOME_TO_MIN
- #define Y_MAX_PIN P1_26 // Y+
- #else
- #define Y_MIN_PIN P1_26 // Y+
- #endif
-#else
- #define Y_MIN_PIN P1_27 // Y-
- #define Y_MAX_PIN P1_26 // Y+
-#endif
-
-#if Z_STALL_SENSITIVITY
- #define Z_STOP_PIN Z_DIAG_PIN
- #if Z_HOME_TO_MIN
- #define Z_MAX_PIN P1_24 // Z+
- #else
- #define Z_MIN_PIN P1_24 // Z+
- #endif
-#else
- #define Z_MIN_PIN P1_25 // Z-
- #define Z_MAX_PIN P1_24 // Z+
-#endif
+#define X_STOP_PIN X_DIAG_PIN // X-
+#define X_OTHR_PIN P1_28 // X+
+#define Y_STOP_PIN Y_DIAG_PIN // Y-
+#define Y_OTHR_PIN P1_26 // Y+
+#define Z_STOP_PIN Z_DIAG_PIN // Z-
+#define Z_OTHR_PIN P1_24 // Z+
//
// Z Probe (when not Z_MIN_PIN)
diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h
index 7b2daae1ea..4a05b72a23 100644
--- a/Marlin/src/pins/pins.h
+++ b/Marlin/src/pins/pins.h
@@ -65,57 +65,6 @@
#define HAS_FREE_AUX2_PINS 1
#endif
-//
-// Check for additional used endstop pins
-//
-#ifndef X_MIN_PIN
- #define X_MIN_PIN 1001
-#endif
-#ifndef Y_MIN_PIN
- #define Y_MIN_PIN 1002
-#endif
-#ifndef Z_MIN_PIN
- #define Z_MIN_PIN 1003
-#endif
-#ifndef X_MAX_PIN
- #define X_MAX_PIN 1004
-#endif
-#ifndef Y_MAX_PIN
- #define Y_MAX_PIN 1005
-#endif
-#ifndef Z_MAX_PIN
- #define Z_MAX_PIN 1006
-#endif
-#define _ENDSTOP_IS_ANY(P) (HAS_EXTRA_ENDSTOPS && (X2_STOP_PIN == P || Y2_STOP_PIN == P || Z2_STOP_PIN == P || Z3_STOP_PIN == P || Z4_STOP_PIN == P))
-#if ENABLED(DUAL_X_CARRIAGE) || _ENDSTOP_IS_ANY(X_MIN_PIN) || _ENDSTOP_IS_ANY(X_MAX_PIN)
- #define NEEDS_X_MINMAX 1
-#endif
-#if _ENDSTOP_IS_ANY(Y_MIN_PIN) || _ENDSTOP_IS_ANY(Y_MAX_PIN)
- #define NEEDS_Y_MINMAX 1
-#endif
-#if _ENDSTOP_IS_ANY(Z_MIN_PIN) || _ENDSTOP_IS_ANY(Z_MAX_PIN) || ALL(Z_HOME_TO_MAX, Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN)
- #define NEEDS_Z_MINMAX 1
-#endif
-#undef _ENDSTOP_IS_ANY
-#if X_MIN_PIN > 1000
- #undef X_MIN_PIN
-#endif
-#if Y_MIN_PIN > 1000
- #undef Y_MIN_PIN
-#endif
-#if Z_MIN_PIN > 1000
- #undef Z_MIN_PIN
-#endif
-#if X_MAX_PIN > 1000
- #undef X_MAX_PIN
-#endif
-#if Y_MAX_PIN > 1000
- #undef Y_MAX_PIN
-#endif
-#if Z_MAX_PIN > 1000
- #undef Z_MAX_PIN
-#endif
-
// Test the target within the included pins file
#ifdef __MARLIN_DEPS__
#define NOT_TARGET(V...) 0
diff --git a/Marlin/src/pins/pins_postprocess.h b/Marlin/src/pins/pins_postprocess.h
index a18c099196..2c29cf4d8c 100644
--- a/Marlin/src/pins/pins_postprocess.h
+++ b/Marlin/src/pins/pins_postprocess.h
@@ -604,14 +604,30 @@
#define NUM_SERVO_PLUGS 0
#endif
-// Only used within pins files
-#undef NEEDS_X_MINMAX
-#undef NEEDS_Y_MINMAX
-#undef NEEDS_Z_MINMAX
+/**
+ * Endstop Pins
+ *
+ * The general idea is to provide STOP and MIN|MAX pins as needed...
+ *
+ * - Standard Homing : X_STOP_PIN with alias X_(MIN|MAX)_PIN. Same for Y, Z, etc.
+ * - DUAL_X_CARRIAGE : Asserts both X_MIN_PIN and X_MAX_PIN must be defined.
+ * - X_DUAL_ENDSTOPS : Also define X2_STOP_PIN with alias X2_(MIN|MAX)_PIN.
+ * - Y_DUAL_ENDSTOPS : Also define Y2_STOP_PIN with alias Y2_(MIN|MAX)_PIN.
+ * - Z_MULTI_ENDSTOPS : Also define Z2_STOP_PIN with alias Z2_(MIN|MAX)_PIN. Same for Z3, Z4.
+ *
+ * Pins files should define pins according to usability:
+ * - Define X_STOP_PIN for boards with a preferred endstop plug, including Sensorless.
+ * - Define X_OTHR_PIN for the "other" endstop pin on the axis.
+ * - Define X_MIN_PIN and/or X_MAX_PIN as preferred connectors.
+ * - Allow user override of these pins for easier swapping.
+ *
+ * See also Conditionals-5-post.h >> "Endstop and probe flags"
+ */
//
// Assign endstop pins, with handling for boards that have only 3 connectors
//
+
#if HAS_X_AXIS
#ifdef X_STOP_PIN
#if X_HOME_TO_MIN
@@ -624,8 +640,19 @@
#elif X_HOME_TO_MAX
#define X_STOP_PIN X_MAX_PIN
#endif
- #if !defined(X2_STOP_PIN) && ENABLED(X_DUAL_ENDSTOPS) && PIN_EXISTS(X_STOP)
- #define X2_STOP_PIN X_STOP_PIN
+ #if ENABLED(X_DUAL_ENDSTOPS) && PIN_EXISTS(X_STOP)
+ #ifndef X_MIN_PIN
+ #define X_MIN_PIN X_STOP_PIN
+ #endif
+ #ifndef X2_STOP_PIN
+ #define X2_STOP_PIN X_STOP_PIN
+ #endif
+ #endif
+ #if !defined(X_MIN_PIN) && X_HOME_TO_MAX && defined(X_OTHR_PIN)
+ #define X_MIN_PIN X_OTHR_PIN
+ #endif
+ #if !defined(X_MAX_PIN) && X_HOME_TO_MIN && defined(X_OTHR_PIN)
+ #define X_MAX_PIN X_OTHR_PIN
#endif
#endif
@@ -641,8 +668,19 @@
#elif Y_HOME_TO_MAX
#define Y_STOP_PIN Y_MAX_PIN
#endif
- #if !defined(Y2_STOP_PIN) && ENABLED(Y_DUAL_ENDSTOPS) && PIN_EXISTS(Y_STOP)
- #define Y2_STOP_PIN Y_STOP_PIN
+ #if ENABLED(Y_DUAL_ENDSTOPS) && PIN_EXISTS(Y_STOP)
+ #ifndef Y_MIN_PIN
+ #define Y_MIN_PIN Y_STOP_PIN
+ #endif
+ #ifndef Y2_STOP_PIN
+ #define Y2_STOP_PIN Y_STOP_PIN
+ #endif
+ #endif
+ #if !defined(Y_MIN_PIN) && Y_HOME_TO_MAX && defined(Y_OTHR_PIN)
+ #define Y_MIN_PIN Y_OTHR_PIN
+ #endif
+ #if !defined(Y_MAX_PIN) && Y_HOME_TO_MIN && defined(Y_OTHR_PIN)
+ #define Y_MAX_PIN Y_OTHR_PIN
#endif
#endif
@@ -654,6 +692,12 @@
#define Z_MAX_PIN Z_STOP_PIN
#endif
#endif
+ #if !defined(Z_MIN_PIN) && Z_HOME_TO_MAX && defined(Z_OTHR_PIN)
+ #define Z_MIN_PIN Z_OTHR_PIN
+ #endif
+ #if !defined(Z_MAX_PIN) && Z_HOME_TO_MIN && defined(Z_OTHR_PIN)
+ #define Z_MAX_PIN Z_OTHR_PIN
+ #endif
#if ENABLED(Z_MULTI_ENDSTOPS)
#if ((Z_HOME_TO_MIN && !defined(Z2_MIN_PIN)) || (Z_HOME_TO_MAX && !defined(Z2_MAX_PIN))) && !defined(Z2_STOP_PIN)
#error "Z2_STOP_PIN is required for Z_MULTI_ENDSTOPS. Define Z2_STOP_PIN in Configuration_adv.h."
diff --git a/Marlin/src/pins/rambo/pins_EINSY_RAMBO.h b/Marlin/src/pins/rambo/pins_EINSY_RAMBO.h
index 98a16764af..ff36b4ac54 100644
--- a/Marlin/src/pins/rambo/pins_EINSY_RAMBO.h
+++ b/Marlin/src/pins/rambo/pins_EINSY_RAMBO.h
@@ -40,7 +40,9 @@
#error "For EinsyRambo you must set all *_DRIVER_TYPE to TMC2130 in Configuration.h."
#endif
-// TMC2130 Diag Pins (currently just for reference)
+//
+// Trinamic TMC2130 distinct DIAG pins
+//
#define X_DIAG_PIN 64
#define Y_DIAG_PIN 69
#define Z_DIAG_PIN 68
@@ -55,31 +57,31 @@
// SERVO0_PIN and Z_MIN_PIN configuration for BLTOUCH sensor when combined with SENSORLESS_HOMING.
//
-#if DISABLED(SENSORLESS_HOMING)
-
- #define X_STOP_PIN 12
- #define Y_STOP_PIN 11
- #define Z_STOP_PIN 10
-
-#else
+#if ENABLED(SENSORLESS_HOMING)
#define X_STOP_PIN X_DIAG_PIN
#define Y_STOP_PIN Y_DIAG_PIN
#if ENABLED(BLTOUCH)
+ #define SERVO0_PIN 10 // PROBE-S
#define Z_STOP_PIN 11 // Y-MIN
- #define SERVO0_PIN 10 // Z-MIN
#else
- #define Z_STOP_PIN 10
+ #define Z_STOP_PIN 10 // PROBE-S
#endif
+#else
+
+ #define X_STOP_PIN 12 // X-MIN
+ #define Y_STOP_PIN 11 // Y-MIN
+ #define Z_STOP_PIN 10 // PROBE-S
+
#endif
//
// Z Probe (when not Z_MIN_PIN)
//
#ifndef Z_MIN_PROBE_PIN
- #define Z_MIN_PROBE_PIN 10
+ #define Z_MIN_PROBE_PIN 10 // PROBE-S
#endif
//
diff --git a/Marlin/src/pins/rambo/pins_EINSY_RETRO.h b/Marlin/src/pins/rambo/pins_EINSY_RETRO.h
index ca681b8174..99cee17cc1 100644
--- a/Marlin/src/pins/rambo/pins_EINSY_RETRO.h
+++ b/Marlin/src/pins/rambo/pins_EINSY_RETRO.h
@@ -53,29 +53,20 @@
// SERVO0_PIN and Z_MIN_PIN configuration for BLTOUCH sensor when combined with SENSORLESS_HOMING.
//
-#if DISABLED(SENSORLESS_HOMING)
-
- #define X_MIN_PIN 12 // X-
- #define Y_MIN_PIN 11 // Y-
- #define X_MAX_PIN 81 // X+
- #define Y_MAX_PIN 57 // Y+
-
-#else
+#if ENABLED(SENSORLESS_HOMING)
+ #define X_STOP_PIN X_DIAG_PIN
#if X_HOME_TO_MIN
- #define X_MIN_PIN X_DIAG_PIN
- #define X_MAX_PIN 81 // X+
+ #define X_OTHR_PIN 81 // X+
#else
- #define X_MIN_PIN 12 // X-
- #define X_MAX_PIN X_DIAG_PIN
+ #define X_OTHR_PIN 12 // X-
#endif
+ #define Y_STOP_PIN Y_DIAG_PIN
#if Y_HOME_TO_MIN
- #define Y_MIN_PIN Y_DIAG_PIN
- #define Y_MAX_PIN 57 // Y+
+ #define Y_OTHR_PIN 57 // Y+
#else
- #define Y_MIN_PIN 11 // Y-
- #define Y_MAX_PIN Y_DIAG_PIN
+ #define Y_OTHR_PIN 11 // Y-
#endif
#if ENABLED(BLTOUCH)
@@ -83,9 +74,16 @@
#define SERVO0_PIN 10 // Z-
#endif
+#else
+
+ #define X_MIN_PIN 12 // X-
+ #define Y_MIN_PIN 11 // Y-
+ #define X_MAX_PIN 81 // X+
+ #define Y_MAX_PIN 57 // Y+
+
#endif
-#define Z_MAX_PIN 7
+#define Z_MAX_PIN 7 // Z+
#ifndef Z_MIN_PIN
#define Z_MIN_PIN 10 // Z-
#endif
@@ -94,7 +92,7 @@
// Z Probe (when not Z_MIN_PIN)
//
#ifndef Z_MIN_PROBE_PIN
- #define Z_MIN_PROBE_PIN 10
+ #define Z_MIN_PROBE_PIN 10 // Z-
#endif
//
diff --git a/Marlin/src/pins/ramps/pins_TRIGORILLA_14.h b/Marlin/src/pins/ramps/pins_TRIGORILLA_14.h
index d3c921a5f6..7c01c8aba8 100644
--- a/Marlin/src/pins/ramps/pins_TRIGORILLA_14.h
+++ b/Marlin/src/pins/ramps/pins_TRIGORILLA_14.h
@@ -120,7 +120,7 @@
#define Y_STOP_PIN 42 // AUX (1)
#define Z_STOP_PIN 43 // AUX (2)
#ifndef Z2_STOP_PIN
- #define Z2_STOP_PIN 18 // Z-
+ #define Z2_STOP_PIN 18 // Z-
#endif
#ifndef Z_MIN_PROBE_PIN
diff --git a/Marlin/src/pins/sam/pins_ARCHIM2.h b/Marlin/src/pins/sam/pins_ARCHIM2.h
index 2d0a42c03d..38722326cd 100644
--- a/Marlin/src/pins/sam/pins_ARCHIM2.h
+++ b/Marlin/src/pins/sam/pins_ARCHIM2.h
@@ -71,20 +71,18 @@
#define E0_DIAG_PIN 78 // PB23
#define E1_DIAG_PIN 25 // PD0
+ #define X_STOP_PIN X_DIAG_PIN
#if X_HOME_TO_MIN
- #define X_MIN_PIN X_DIAG_PIN
- #define X_MAX_PIN 32
+ #define X_OTHR_PIN 32 // PD10 MAX ES1
#else
- #define X_MIN_PIN 14
- #define X_MAX_PIN X_DIAG_PIN
+ #define X_OTHR_PIN 14 // PD4 MIN ES1
#endif
+ #define Y_STOP_PIN Y_DIAG_PIN
#if Y_HOME_TO_MIN
- #define Y_MIN_PIN Y_DIAG_PIN
- #define Y_MAX_PIN 15
+ #define Y_OTHR_PIN 15 // PD5 MAX ES2
#else
- #define Y_MIN_PIN 29
- #define Y_MAX_PIN Y_DIAG_PIN
+ #define Y_OTHR_PIN 29 // PD6 MIN ES2
#endif
#else
@@ -103,7 +101,7 @@
// Z Probe (when not Z_MIN_PIN)
//
#ifndef Z_MIN_PROBE_PIN
- #define Z_MIN_PROBE_PIN 32
+ #define Z_MIN_PROBE_PIN 32 // PD10 MAX ES1
#endif
//
diff --git a/Marlin/src/pins/stm32f0/pins_FLY_D5.h b/Marlin/src/pins/stm32f0/pins_FLY_D5.h
index c98dcb0b7e..b3b51f6bde 100644
--- a/Marlin/src/pins/stm32f0/pins_FLY_D5.h
+++ b/Marlin/src/pins/stm32f0/pins_FLY_D5.h
@@ -114,6 +114,12 @@
#define Z_SERIAL_TX_PIN PA3
#define E0_SERIAL_TX_PIN PA7
#define E1_SERIAL_TX_PIN PB1
+
+// Reduce baud rate to improve software serial reliability
+#ifndef TMC_BAUD_RATE
+ #define TMC_BAUD_RATE 9600
+#endif
+
#endif
//
diff --git a/Marlin/src/pins/stm32f0/pins_FLY_D7.h b/Marlin/src/pins/stm32f0/pins_FLY_D7.h
index 78ce01d385..136b2c5f9c 100644
--- a/Marlin/src/pins/stm32f0/pins_FLY_D7.h
+++ b/Marlin/src/pins/stm32f0/pins_FLY_D7.h
@@ -133,6 +133,12 @@
#define E1_SERIAL_TX_PIN PB1
#define E2_SERIAL_TX_PIN PB6
#define E3_SERIAL_TX_PIN PC10
+
+// Reduce baud rate to improve software serial reliability
+#ifndef TMC_BAUD_RATE
+ #define TMC_BAUD_RATE 9600
+#endif
+
#endif
//
diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V9.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V9.h
index 0d02e1d5d9..7c6b75a082 100755
--- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V9.h
+++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V9.h
@@ -23,11 +23,11 @@
#define BOARD_INFO_NAME "Chitu3D V9"
-#define Z_STOP_PIN PA14
-
#define Z2_ENABLE_PIN PF3
#define Z2_STEP_PIN PF5
#define Z2_DIR_PIN PF1
+
+#define Z_STOP_PIN PA14
#define Z2_STOP_PIN PA13
#ifndef Z_MIN_PROBE_PIN
diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V521.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V521.h
index 60a0062621..0717506fff 100644
--- a/Marlin/src/pins/stm32f1/pins_CREALITY_V521.h
+++ b/Marlin/src/pins/stm32f1/pins_CREALITY_V521.h
@@ -67,11 +67,11 @@
//
// Limit Switches
//
-#define X_STOP_PIN PD10 // X
-#define X2_STOP_PIN PE15 // X2
+#define X_MIN_PIN PD10 // X
+#define X_MAX_PIN PE15 // X2
#define Y_STOP_PIN PE0 // Y
-#define Z_STOP_PIN PE1 // Z
-#define Z2_STOP_PIN PE2 // Z2
+#define Z_MIN_PIN PE1 // Z
+#define Z_MAX_PIN PE2 // Z2
#ifndef Z_MIN_PROBE_PIN
#define Z_MIN_PROBE_PIN PD12 // BLTouch IN
diff --git a/Marlin/src/pins/stm32f4/pins_ARTILLERY_RUBY.h b/Marlin/src/pins/stm32f4/pins_ARTILLERY_RUBY.h
index 8b60b234cd..6dd25ad464 100644
--- a/Marlin/src/pins/stm32f4/pins_ARTILLERY_RUBY.h
+++ b/Marlin/src/pins/stm32f4/pins_ARTILLERY_RUBY.h
@@ -40,27 +40,10 @@
//
// Limit Switches
//
-#if (X_HOME_DIR == 1)
- #define X_MIN_PIN -1
- #define X_MAX_PIN PA2
-#else
- #define X_MIN_PIN PA2
- #define X_MAX_PIN -1
-#endif
-#if (Y_HOME_DIR == 1)
- #define Y_MIN_PIN -1
- #define Y_MAX_PIN PA1
-#else
- #define Y_MIN_PIN PA1
- #define Y_MAX_PIN -1
-#endif
-#if (Z_HOME_DIR == 1)
- #define Z_MIN_PIN PC2
- #define Z_MAX_PIN PA0
-#else
- #define Z_MIN_PIN PA0
- #define Z_MAX_PIN PC2
-#endif
+#define X_STOP_PIN PA2
+#define Y_STOP_PIN PA1
+#define Z_STOP_PIN PA0
+#define Z_OTHR_PIN PC2
//
// Steppers
diff --git a/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h b/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h
index be98edd605..1d3975ab8f 100644
--- a/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h
+++ b/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h
@@ -68,38 +68,24 @@
//
#ifdef X_STALL_SENSITIVITY
#define X_STOP_PIN X_DIAG_PIN
- #if X_HOME_TO_MIN
- #define X_MAX_PIN E0_DIAG_PIN // X+
- #else
- #define X_MIN_PIN E0_DIAG_PIN // X+
- #endif
+ #define X_OTHR_PIN PG14 // X+
#else
- #define X_MIN_PIN X_DIAG_PIN // X-
- #define X_MAX_PIN E0_DIAG_PIN // X+
+ #define X_MIN_PIN PF2 // X-
+ #define X_MAX_PIN PG14 // X+
#endif
-
#ifdef Y_STALL_SENSITIVITY
#define Y_STOP_PIN Y_DIAG_PIN
- #if Y_HOME_TO_MIN
- #define Y_MAX_PIN E1_DIAG_PIN // Y+
- #else
- #define Y_MIN_PIN E1_DIAG_PIN // Y+
- #endif
+ #define Y_OTHR_PIN PG9 // Y+
#else
- #define Y_MIN_PIN Y_DIAG_PIN // Y-
- #define Y_MAX_PIN E1_DIAG_PIN // Y+
+ #define Y_MIN_PIN PC13 // Y-
+ #define Y_MAX_PIN PG9 // Y+
#endif
-
#ifdef Z_STALL_SENSITIVITY
#define Z_STOP_PIN Z_DIAG_PIN
- #if Z_HOME_TO_MIN
- #define Z_MAX_PIN E2_DIAG_PIN // Z+
- #else
- #define Z_MIN_PIN E2_DIAG_PIN // Z+
- #endif
+ #define Z_OTHR_PIN PD3 // Z+
#else
- #define Z_MIN_PIN Z_DIAG_PIN // Z-
- #define Z_MAX_PIN E2_DIAG_PIN // Z+
+ #define Z_MIN_PIN PE0 // Z-
+ #define Z_MAX_PIN PD3 // Z+
#endif
//
diff --git a/Marlin/src/pins/stm32f4/pins_BTT_OCTOPUS_V1_common.h b/Marlin/src/pins/stm32f4/pins_BTT_OCTOPUS_V1_common.h
index ac96042b23..9388c8a1f4 100644
--- a/Marlin/src/pins/stm32f4/pins_BTT_OCTOPUS_V1_common.h
+++ b/Marlin/src/pins/stm32f4/pins_BTT_OCTOPUS_V1_common.h
@@ -65,59 +65,12 @@
//
// Limit Switches
//
-#ifdef X_STALL_SENSITIVITY
- #define X_STOP_PIN X_DIAG_PIN
- #if X_HOME_TO_MIN
- #define X_MAX_PIN E0_DIAG_PIN // E0DET
- #else
- #define X_MIN_PIN E0_DIAG_PIN // E0DET
- #endif
-#elif NEEDS_X_MINMAX
- #ifndef X_MIN_PIN
- #define X_MIN_PIN X_DIAG_PIN // X-STOP
- #endif
- #ifndef X_MAX_PIN
- #define X_MAX_PIN E0_DIAG_PIN // E0DET
- #endif
-#else
- #define X_STOP_PIN X_DIAG_PIN // X-STOP
-#endif
-
-#ifdef Y_STALL_SENSITIVITY
- #define Y_STOP_PIN Y_DIAG_PIN
- #if Y_HOME_TO_MIN
- #define Y_MAX_PIN E1_DIAG_PIN // E1DET
- #else
- #define Y_MIN_PIN E1_DIAG_PIN // E1DET
- #endif
-#elif NEEDS_Y_MINMAX
- #ifndef Y_MIN_PIN
- #define Y_MIN_PIN Y_DIAG_PIN // Y-STOP
- #endif
- #ifndef Y_MAX_PIN
- #define Y_MAX_PIN E1_DIAG_PIN // E1DET
- #endif
-#else
- #define Y_STOP_PIN Y_DIAG_PIN // Y-STOP
-#endif
-
-#ifdef Z_STALL_SENSITIVITY
- #define Z_STOP_PIN Z_DIAG_PIN
- #if Z_HOME_TO_MIN
- #define Z_MAX_PIN E2_DIAG_PIN // PWRDET
- #else
- #define Z_MIN_PIN E2_DIAG_PIN // PWRDET
- #endif
-#elif NEEDS_Z_MINMAX
- #ifndef Z_MIN_PIN
- #define Z_MIN_PIN Z_DIAG_PIN // Z-STOP
- #endif
- #ifndef Z_MAX_PIN
- #define Z_MAX_PIN E2_DIAG_PIN // PWRDET
- #endif
-#else
- #define Z_STOP_PIN Z_DIAG_PIN // Z-STOP
-#endif
+#define X_STOP_PIN X_DIAG_PIN // X-STOP
+#define Y_STOP_PIN Y_DIAG_PIN // Y-STOP
+#define Z_STOP_PIN Z_DIAG_PIN // Z-STOP
+#define X_OTHR_PIN E0_DIAG_PIN // E0DET
+#define Y_OTHR_PIN E1_DIAG_PIN // E1DET
+#define Z_OTHR_PIN E2_DIAG_PIN // E2DET
//
// Z Probe (when not Z_MIN_PIN)
diff --git a/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h b/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h
index 943c0ed761..5b42a05c70 100644
--- a/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h
+++ b/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h
@@ -70,41 +70,12 @@
//
// Limit Switches
//
-#ifdef X_STALL_SENSITIVITY
- #define X_STOP_PIN X_DIAG_PIN
- #if X_HOME_TO_MIN
- #define X_MAX_PIN PE15 // E0
- #else
- #define X_MIN_PIN PE15 // E0
- #endif
-#else
- #define X_MIN_PIN PB10 // X-
- #define X_MAX_PIN PE15 // E0
-#endif
-
-#ifdef Y_STALL_SENSITIVITY
- #define Y_STOP_PIN Y_DIAG_PIN
- #if Y_HOME_TO_MIN
- #define Y_MAX_PIN PE10 // E1
- #else
- #define Y_MIN_PIN PE10 // E1
- #endif
-#else
- #define Y_MIN_PIN PE12 // Y-
- #define Y_MAX_PIN PE10 // E1
-#endif
-
-#ifdef Z_STALL_SENSITIVITY
- #define Z_STOP_PIN Z_DIAG_PIN
- #if Z_HOME_TO_MIN
- #define Z_MAX_PIN PG5 // E2
- #else
- #define Z_MIN_PIN PG5 // E2
- #endif
-#else
- #define Z_MIN_PIN PG8 // Z-
- #define Z_MAX_PIN PG5 // E2
-#endif
+#define X_STOP_PIN X_DIAG_PIN // X-
+#define Y_STOP_PIN Y_DIAG_PIN // Y-
+#define Z_STOP_PIN Z_DIAG_PIN // Z-
+#define X_OTHR_PIN PE15 // E0
+#define Y_OTHR_PIN PE10 // E1
+#define Z_OTHR_PIN PG5 // E2
//
// Z Probe must be this pin
diff --git a/Marlin/src/pins/stm32f4/pins_BTT_SKR_V2_0_common.h b/Marlin/src/pins/stm32f4/pins_BTT_SKR_V2_0_common.h
index 51b27efa39..fa0e1ed516 100644
--- a/Marlin/src/pins/stm32f4/pins_BTT_SKR_V2_0_common.h
+++ b/Marlin/src/pins/stm32f4/pins_BTT_SKR_V2_0_common.h
@@ -71,61 +71,12 @@
//
// Limit Switches
//
-#ifdef X_STALL_SENSITIVITY
- #define X_STOP_PIN X_DIAG_PIN
- #if X_HOME_TO_MIN
- #define X_MAX_PIN PC2 // E0DET
- #else
- #define X_MIN_PIN PC2 // E0DET
- #endif
-#elif ENABLED(X_DUAL_ENDSTOPS)
- #ifndef X_MIN_PIN
- #define X_MIN_PIN PC1 // X-STOP
- #endif
- #ifndef X_MAX_PIN
- #define X_MAX_PIN PC2 // E0DET
- #endif
-#else
- #define X_STOP_PIN PC1 // X-STOP
-#endif
-
-#ifdef Y_STALL_SENSITIVITY
- #define Y_STOP_PIN Y_DIAG_PIN
- #if Y_HOME_TO_MIN
- #define Y_MAX_PIN PA0 // E1DET
- #else
- #define Y_MIN_PIN PA0 // E1DET
- #endif
-#elif ENABLED(Y_DUAL_ENDSTOPS)
- #ifndef Y_MIN_PIN
- #define Y_MIN_PIN PC3 // Y-STOP
- #endif
- #ifndef Y_MAX_PIN
- #define Y_MAX_PIN PA0 // E1DET
- #endif
-#else
- #define Y_STOP_PIN PC3 // Y-STOP
-#endif
-
-#ifdef Z_STALL_SENSITIVITY
- #define Z_STOP_PIN Z_DIAG_PIN
- #if Z_HOME_TO_MIN
- #define Z_MAX_PIN PC15 // PWRDET
- #else
- #define Z_MIN_PIN PC15 // PWRDET
- #endif
-#elif ENABLED(Z_MULTI_ENDSTOPS)
- #ifndef Z_MIN_PIN
- #define Z_MIN_PIN PC0 // Z-STOP
- #endif
- #ifndef Z_MAX_PIN
- #define Z_MAX_PIN PC15 // PWRDET
- #endif
-#else
- #ifndef Z_STOP_PIN
- #define Z_STOP_PIN PC0 // Z-STOP
- #endif
-#endif
+#define X_STOP_PIN X_DIAG_PIN // X-STOP
+#define Y_STOP_PIN Y_DIAG_PIN // Y-STOP
+#define Z_STOP_PIN Z_DIAG_PIN // Z-STOP
+#define X_OTHR_PIN PC2 // E0DET
+#define Y_OTHR_PIN PA0 // E1DET
+#define Z_OTHR_PIN PC15 // PWRDET
//
// Z Probe (when not Z_MIN_PIN)
diff --git a/Marlin/src/pins/stm32f4/pins_I3DBEEZ9.h b/Marlin/src/pins/stm32f4/pins_I3DBEEZ9.h
index 1620c86bed..13dc536cfa 100644
--- a/Marlin/src/pins/stm32f4/pins_I3DBEEZ9.h
+++ b/Marlin/src/pins/stm32f4/pins_I3DBEEZ9.h
@@ -77,53 +77,12 @@
//
// Limit Switches
//
-#ifdef X_STALL_SENSITIVITY
- #define X_STOP_PIN X_DIAG_PIN
- #if X_HOME_TO_MIN
- #define X_MAX_PIN PE15 // E0
- #else
- #define X_MIN_PIN PE15 // E0
- #endif
-#else
- #define X_MIN_PIN PB10 // X-
- #define X_MAX_PIN PE15 // E0
-#endif
-
-#ifdef Y_STALL_SENSITIVITY
- #define Y_STOP_PIN Y_DIAG_PIN
- #if Y_HOME_TO_MIN
- #define Y_MAX_PIN PE10 // E1
- #else
- #define Y_MIN_PIN PE10 // E1
- #endif
-#else
- #define Y_MIN_PIN PE12 // Y-
- #define Y_MAX_PIN PE10 // E1
-#endif
-
-#ifdef Z_STALL_SENSITIVITY
- #define Z_STOP_PIN Z_DIAG_PIN
- #if Z_HOME_TO_MIN
- #define Z_MAX_PIN PG5 // E2
- #else
- #define Z_MIN_PIN PG5 // E2
- #endif
-#else
- #define Z_MIN_PIN PG8 // Z-
- #define Z_MAX_PIN PG5 // E2
-#endif
-
-#ifdef Z2_STALL_SENSITIVITY
- #define Z2_STOP_PIN E1_DIAG_PIN
- #if Z2_HOME_TO_MIN
- #define Z2_MAX_PIN PD0 // E3
- #else
- #define Z2_MIN_PIN PD0 // E3
- #endif
-#else
- #define Z2_MIN_PIN PD0 // Z2- [E3]
- #define Z2_MAX_PIN PD6 // E4
-#endif
+#define X_STOP_PIN X_DIAG_PIN // X-
+#define Y_STOP_PIN Y_DIAG_PIN // Y-
+#define Z_STOP_PIN Z_DIAG_PIN // Z-
+#define X_OTHR_PIN PE15 // E0
+#define Y_OTHR_PIN PE10 // E1
+#define Z_OTHR_PIN PG5 // E2
//
// Z Probe must be this pin
diff --git a/Marlin/src/pins/stm32f4/pins_MELLOW_FLY_E3_V2.h b/Marlin/src/pins/stm32f4/pins_MELLOW_FLY_E3_V2.h
index 4626176a99..d6b5c31bbf 100644
--- a/Marlin/src/pins/stm32f4/pins_MELLOW_FLY_E3_V2.h
+++ b/Marlin/src/pins/stm32f4/pins_MELLOW_FLY_E3_V2.h
@@ -66,24 +66,14 @@
//
// Limit Switches
//
-#ifdef X_STALL_SENSITIVITY
- #define X_STOP_PIN X_DIAG_PIN
-#else
- #define X_STOP_PIN PE7 // X-STOP
+#ifndef X_STOP_PIN
+ #define X_STOP_PIN X_DIAG_PIN // X-STOP
#endif
-
-#ifdef Y_STALL_SENSITIVITY
- #define Y_STOP_PIN Y_DIAG_PIN
-#else
- #define Y_STOP_PIN PE8 // Y-STOP
+#ifndef Y_STOP_PIN
+ #define Y_STOP_PIN Y_DIAG_PIN // Y-STOP
#endif
-
-#ifdef Z_STALL_SENSITIVITY
- #define Z_STOP_PIN Z_DIAG_PIN
-#else
- #ifndef Z_STOP_PIN
- #define Z_STOP_PIN PE9 // Z-STOP
- #endif
+#ifndef Z_STOP_PIN
+ #define Z_STOP_PIN Z_DIAG_PIN // Z-STOP
#endif
//
diff --git a/Marlin/src/pins/stm32f4/pins_MKS_SKIPR_V1_0.h b/Marlin/src/pins/stm32f4/pins_MKS_SKIPR_V1_0.h
index b0eb8bf24f..b060ac56e5 100644
--- a/Marlin/src/pins/stm32f4/pins_MKS_SKIPR_V1_0.h
+++ b/Marlin/src/pins/stm32f4/pins_MKS_SKIPR_V1_0.h
@@ -56,49 +56,15 @@
//
// Limit Switches
//
-#ifdef X_STALL_SENSITIVITY
- #define X_STOP_PIN X_DIAG_PIN // X-
-#elif NEEDS_X_MINMAX
- #ifndef X_MIN_PIN
- #define X_MIN_PIN X_DIAG_PIN // X-
- #endif
- #ifndef X_MAX_PIN
- #define X_MAX_PIN E0_DIAG_PIN // MT-DET
- #endif
-#else
- #define X_STOP_PIN X_DIAG_PIN // X-
-#endif
+#define X_STOP_PIN X_DIAG_PIN // X-
+#define Y_STOP_PIN Y_DIAG_PIN // Y-
+#define Z_STOP_PIN Z_DIAG_PIN // Z+
+#define X_OTHR_PIN E0_DIAG_PIN // MT-DET
+#define Y_OTHR_PIN E1_DIAG_PIN // NEOPIXEL
+#define Z_OTHR_PIN E2_DIAG_PIN // PWRDET
-#ifdef Y_STALL_SENSITIVITY
- #define Y_STOP_PIN Y_DIAG_PIN // Y-
-#elif NEEDS_Y_MINMAX
- #ifndef Y_MIN_PIN
- #define Y_MIN_PIN Y_DIAG_PIN // Y-
- #endif
- #ifndef Y_MAX_PIN
- #define Y_MAX_PIN E1_DIAG_PIN // NEOPIXEL
- #endif
-#else
- #define Y_STOP_PIN Y_DIAG_PIN // Y-
-#endif
-
-#ifdef Z_STALL_SENSITIVITY
- #define Z_STOP_PIN Z_DIAG_PIN // Z-
-#elif NEEDS_Z_MINMAX
- #ifndef Z_MIN_PIN
- #define Z_MIN_PIN Z_DIAG_PIN // Z-
- #endif
- #ifndef Z_MAX_PIN
- #define Z_MAX_PIN E2_DIAG_PIN // Z+
- #endif
-#else
- #define Z_STOP_PIN Z_DIAG_PIN // Z-
-#endif
-
-#if DISABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) || ENABLED(USE_PROBE_FOR_Z_HOMING)
- #ifndef Z_MIN_PROBE_PIN
- #define Z_MIN_PROBE_PIN E2_DIAG_PIN // defaults to 'Z+' connector
- #endif
+#ifndef Z_MIN_PROBE_PIN
+ #define Z_MIN_PROBE_PIN E2_DIAG_PIN // Z+
#endif
//
diff --git a/Marlin/src/pins/stm32f7/pins_REMRAM_V1.h b/Marlin/src/pins/stm32f7/pins_REMRAM_V1.h
index 7cf8d813a0..8aeec7bc95 100644
--- a/Marlin/src/pins/stm32f7/pins_REMRAM_V1.h
+++ b/Marlin/src/pins/stm32f7/pins_REMRAM_V1.h
@@ -36,21 +36,44 @@
#error "RemRam only supports 1 hotend / E stepper."
#endif
+//
+// Timers
+//
+#define STEP_TIMER 2
+
+//
+// Servos
+//
+#define SERVO0_PIN 26 // PWM_EXT1
+#define SERVO1_PIN 27 // PWM_EXT2
+
//
// Limit Switches
//
-#if DISABLED(SENSORLESS_HOMING)
- #define X_MIN_PIN 58
- #define X_MAX_PIN 59
- #define Y_MIN_PIN 60
- #define Y_MAX_PIN 61
- #define Z_MAX_PIN 63
+#define X_DIAG_PIN 36
+#define Y_DIAG_PIN 39
+#define Z_DIAG_PIN 42
+
+// Direct endstop pin references
+#define _X_MIN_PIN 58
+#define _X_MAX_PIN 59
+#define _Y_MIN_PIN 60
+#define _Y_MAX_PIN 61
+#define _Z_MIN_PIN 62
+#define _Z_MAX_PIN 63
+
+#if ENABLED(SENSORLESS_HOMING)
+ #define X_STOP_PIN X_DIAG_PIN
+ #define Y_STOP_PIN Y_DIAG_PIN
+ #define Z_STOP_PIN Z_DIAG_PIN
#else
- #define X_STOP_PIN 36
- #define Y_STOP_PIN 39
- #define Z_MAX_PIN 42
+ #define X_MIN_PIN _X_MIN_PIN
+ #define X_MAX_PIN _X_MAX_PIN
+ #define Y_MIN_PIN _Y_MIN_PIN
+ #define Y_MAX_PIN _Y_MAX_PIN
+ #define Z_MIN_PIN _Z_MIN_PIN
+ #define Z_MAX_PIN _Z_MAX_PIN
#endif
-#define Z_MIN_PIN 62
//
// Z Probe (when not Z_MIN_PIN)
@@ -105,19 +128,17 @@
#endif
//
-// Servos
+// SD Card
//
-#define SERVO0_PIN 26 // PWM_EXT1
-#define SERVO1_PIN 27 // PWM_EXT2
-
+#define SD_DETECT_PIN 56 // SD_CARD_DET
#define SD_SS_PIN 57 // Onboard SD card reader
//#define SD_SS_PIN 9 // LCD SD card reader
+
#define LED_PIN 21 // STATUS_LED
//
// LCD / Controller
//
-#define SD_DETECT_PIN 56 // SD_CARD_DET
#define BEEPER_PIN 46 // LCD_BEEPER
#define LCD_PINS_RS 49 // LCD_RS
#define LCD_PINS_EN 48 // LCD_EN
@@ -128,9 +149,3 @@
#define BTN_EN1 54 // BTN_EN1
#define BTN_EN2 55 // BTN_EN2
#define BTN_ENC 47 // BTN_ENC
-
-//
-// Timers
-//
-
-#define STEP_TIMER 2
diff --git a/Marlin/src/pins/stm32g0/pins_BTT_MANTA_M8P_common.h b/Marlin/src/pins/stm32g0/pins_BTT_MANTA_M8P_common.h
index 0af45e6645..901f1c8919 100644
--- a/Marlin/src/pins/stm32g0/pins_BTT_MANTA_M8P_common.h
+++ b/Marlin/src/pins/stm32g0/pins_BTT_MANTA_M8P_common.h
@@ -76,43 +76,11 @@
//
// Limit Switches
//
-#ifdef X_STALL_SENSITIVITY
- #define X_STOP_PIN X_DIAG_PIN
- #if X_HOME_TO_MIN
- #define X_MAX_PIN E0_DIAG_PIN // MIN5
- #else
- #define X_MIN_PIN E0_DIAG_PIN // MIN5
- #endif
-#elif NEEDS_X_MINMAX
- #ifndef X_MIN_PIN
- #define X_MIN_PIN X_DIAG_PIN // MIN1
- #endif
- #ifndef X_MAX_PIN
- #define X_MAX_PIN E0_DIAG_PIN // MIN5
- #endif
-#else
- #define X_STOP_PIN X_DIAG_PIN // MIN1
-#endif
-
-#ifdef Y_STALL_SENSITIVITY
- #define Y_STOP_PIN Y_DIAG_PIN
- #if Y_HOME_TO_MIN
- #define Y_MAX_PIN E1_DIAG_PIN // MIN6
- #else
- #define Y_MIN_PIN E1_DIAG_PIN // MIN6
- #endif
-#elif NEEDS_Y_MINMAX
- #ifndef Y_MIN_PIN
- #define Y_MIN_PIN Y_DIAG_PIN // MIN2
- #endif
- #ifndef Y_MAX_PIN
- #define Y_MAX_PIN E1_DIAG_PIN // MIN6
- #endif
-#else
- #define Y_STOP_PIN Y_DIAG_PIN // MIN2
-#endif
-
+#define X_STOP_PIN X_DIAG_PIN // MIN1
+#define Y_STOP_PIN Y_DIAG_PIN // MIN2
#define Z_STOP_PIN Z_DIAG_PIN // MIN3
+#define X_OTHR_PIN E0_DIAG_PIN // MIN5
+#define Y_OTHR_PIN E1_DIAG_PIN // MIN6
//
// Filament Runout Sensors
diff --git a/Marlin/src/pins/stm32g0/pins_BTT_SKRAT_V1_0.h b/Marlin/src/pins/stm32g0/pins_BTT_SKRAT_V1_0.h
index 2a112f34b1..e760306780 100644
--- a/Marlin/src/pins/stm32g0/pins_BTT_SKRAT_V1_0.h
+++ b/Marlin/src/pins/stm32g0/pins_BTT_SKRAT_V1_0.h
@@ -79,61 +79,18 @@
//
// Limit Switches
//
-#ifdef X_STALL_SENSITIVITY
- #define X_STOP_PIN X_DIAG_PIN
- #if X_HOME_TO_MIN
- #define X_MAX_PIN PF4 // E0_DET
- #else
- #define X_MIN_PIN PF4 // E0_DET
- #endif
-#elif ENABLED(X_DUAL_ENDSTOPS)
- #ifndef X_MIN_PIN
- #define X_MIN_PIN PB5 // X-STOP
- #endif
- #ifndef X_MAX_PIN
- #define X_MAX_PIN PF4 // E0_DET
- #endif
-#else
- #define X_STOP_PIN PB5 // X-STOP
+#ifndef X_STOP_PIN
+ #define X_STOP_PIN X_DIAG_PIN // X-STOP
#endif
-
-#ifdef Y_STALL_SENSITIVITY
- #define Y_STOP_PIN Y_DIAG_PIN
- #if Y_HOME_TO_MIN
- #define Y_MAX_PIN PF5 // E1_DET
- #else
- #define Y_MIN_PIN PF5 // E1_DET
- #endif
-#elif ENABLED(Y_DUAL_ENDSTOPS)
- #ifndef Y_MIN_PIN
- #define Y_MIN_PIN PC1 // Y-STOP
- #endif
- #ifndef Y_MAX_PIN
- #define Y_MAX_PIN PF5 // E1_DET
- #endif
-#else
- #define Y_STOP_PIN PC1 // Y-STOP
+#ifndef Y_STOP_PIN
+ #define Y_STOP_PIN Y_DIAG_PIN // Y-STOP
#endif
-
-#ifdef Z_STALL_SENSITIVITY
- #define Z_STOP_PIN Z_DIAG_PIN
- #if Z_HOME_TO_MIN
- #define Z_MAX_PIN PE12 // PWR_DET
- #else
- #define Z_MIN_PIN PE12 // PWR_DET
- #endif
-#elif ENABLED(Z_MULTI_ENDSTOPS)
- #ifndef Z_MIN_PIN
- #define Z_MIN_PIN PC0 // Z-STOP
- #endif
- #ifndef Z_MAX_PIN
- #define Z_MAX_PIN PE12 // PWR_DET
- #endif
-#else
- #ifndef Z_STOP_PIN
- #define Z_STOP_PIN PC0 // Z-STOP
- #endif
+#ifndef Z_STOP_PIN
+ #define Z_STOP_PIN Z_DIAG_PIN // Z-STOP
#endif
+#define X_OTHR_PIN PF4 // E0_DET
+#define Y_OTHR_PIN E1_DIAG_PIN // E1_DET
+#define Z_OTHR_PIN PE12 // PWR_DET
//
// Z Probe (when not Z_MIN_PIN)
diff --git a/Marlin/src/pins/stm32h7/pins_BTT_KRAKEN_V1_0.h b/Marlin/src/pins/stm32h7/pins_BTT_KRAKEN_V1_0.h
index 3a0cc346e5..8ed780b6c7 100644
--- a/Marlin/src/pins/stm32h7/pins_BTT_KRAKEN_V1_0.h
+++ b/Marlin/src/pins/stm32h7/pins_BTT_KRAKEN_V1_0.h
@@ -65,59 +65,12 @@
//
// Limit Switches
//
-#ifdef X_STALL_SENSITIVITY
- #define X_STOP_PIN X_DIAG_PIN
- #if X_HOME_TO_MIN
- #define X_MAX_PIN E0_DIAG_PIN // MIN4
- #else
- #define X_MIN_PIN E0_DIAG_PIN // MIN4
- #endif
-#elif NEEDS_X_MINMAX
- #ifndef X_MIN_PIN
- #define X_MIN_PIN X_DIAG_PIN // MIN1
- #endif
- #ifndef X_MAX_PIN
- #define X_MAX_PIN E0_DIAG_PIN // MIN4
- #endif
-#else
- #define X_STOP_PIN X_DIAG_PIN // MIN1
-#endif
-
-#ifdef Y_STALL_SENSITIVITY
- #define Y_STOP_PIN Y_DIAG_PIN
- #if Y_HOME_TO_MIN
- #define Y_MAX_PIN E1_DIAG_PIN // MIN5
- #else
- #define Y_MIN_PIN E1_DIAG_PIN // MIN5
- #endif
-#elif NEEDS_Y_MINMAX
- #ifndef Y_MIN_PIN
- #define Y_MIN_PIN Y_DIAG_PIN // MIN2
- #endif
- #ifndef Y_MAX_PIN
- #define Y_MAX_PIN E1_DIAG_PIN // MIN5
- #endif
-#else
- #define Y_STOP_PIN Y_DIAG_PIN // MIN2
-#endif
-
-#ifdef Z_STALL_SENSITIVITY
- #define Z_STOP_PIN Z_DIAG_PIN
- #if Z_HOME_TO_MIN
- #define Z_MAX_PIN E2_DIAG_PIN // MIN6
- #else
- #define Z_MIN_PIN E2_DIAG_PIN // MIN6
- #endif
-#elif NEEDS_Z_MINMAX
- #ifndef Z_MIN_PIN
- #define Z_MIN_PIN Z_DIAG_PIN // MIN3
- #endif
- #ifndef Z_MAX_PIN
- #define Z_MAX_PIN E2_DIAG_PIN // MIN6
- #endif
-#else
- #define Z_STOP_PIN Z_DIAG_PIN // MIN3
-#endif
+#define X_STOP_PIN X_DIAG_PIN // MIN1
+#define Y_STOP_PIN Y_DIAG_PIN // MIN2
+#define Z_STOP_PIN Z_DIAG_PIN // MIN3
+#define X_OTHR_PIN E0_DIAG_PIN // MIN4
+#define Y_OTHR_PIN E1_DIAG_PIN // MIN5
+#define Z_OTHR_PIN E2_DIAG_PIN // MIN6
//
// Z Probe (when not Z_MIN_PIN)
diff --git a/Marlin/src/pins/stm32h7/pins_BTT_MANTA_M8P_V2_0.h b/Marlin/src/pins/stm32h7/pins_BTT_MANTA_M8P_V2_0.h
index 941d6ab068..29e57b42a2 100644
--- a/Marlin/src/pins/stm32h7/pins_BTT_MANTA_M8P_V2_0.h
+++ b/Marlin/src/pins/stm32h7/pins_BTT_MANTA_M8P_V2_0.h
@@ -64,59 +64,12 @@
//
// Limit Switches
//
-#ifdef X_STALL_SENSITIVITY
- #define X_STOP_PIN X_DIAG_PIN // M1-STOP
- #if X_HOME_TO_MIN
- #define X_MAX_PIN E0_DIAG_PIN // M4-STOP
- #else
- #define X_MIN_PIN E0_DIAG_PIN // M4-STOP
- #endif
-#elif NEEDS_X_MINMAX
- #ifndef X_MIN_PIN
- #define X_MIN_PIN X_DIAG_PIN // M1-STOP
- #endif
- #ifndef X_MAX_PIN
- #define X_MAX_PIN E0_DIAG_PIN // M4-STOP
- #endif
-#else
- #define X_STOP_PIN X_DIAG_PIN // M1-STOP
-#endif
-
-#ifdef Y_STALL_SENSITIVITY
- #define Y_STOP_PIN Y_DIAG_PIN // M2-STOP
- #if Y_HOME_TO_MIN
- #define Y_MAX_PIN E1_DIAG_PIN // M5-STOP
- #else
- #define Y_MIN_PIN E1_DIAG_PIN // M5-STOP
- #endif
-#elif NEEDS_Y_MINMAX
- #ifndef Y_MIN_PIN
- #define Y_MIN_PIN Y_DIAG_PIN // M2-STOP
- #endif
- #ifndef Y_MAX_PIN
- #define Y_MAX_PIN E1_DIAG_PIN // M5-STOP
- #endif
-#else
- #define Y_STOP_PIN Y_DIAG_PIN // M2-STOP
-#endif
-
-#ifdef Z_STALL_SENSITIVITY
- #define Z_STOP_PIN Z_DIAG_PIN // M3-STOP
- #if Z_HOME_TO_MIN
- #define Z_MAX_PIN E2_DIAG_PIN // M6-STOP
- #else
- #define Z_MIN_PIN E2_DIAG_PIN // M6-STOP
- #endif
-#elif NEEDS_Z_MINMAX
- #ifndef Z_MIN_PIN
- #define Z_MIN_PIN Z_DIAG_PIN // M3-STOP
- #endif
- #ifndef Z_MAX_PIN
- #define Z_MAX_PIN E2_DIAG_PIN // M6-STOP
- #endif
-#else
- #define Z_STOP_PIN Z_DIAG_PIN // M3-STOP
-#endif
+#define X_STOP_PIN X_DIAG_PIN // M1-STOP
+#define Y_STOP_PIN Y_DIAG_PIN // M2-STOP
+#define Z_STOP_PIN Z_DIAG_PIN // M3-STOP
+#define X_OTHR_PIN E0_DIAG_PIN // M4-STOP
+#define Y_OTHR_PIN E1_DIAG_PIN // M5-STOP
+#define Z_OTHR_PIN E2_DIAG_PIN // M6-STOP
//
// Z Probe (when not Z_MIN_PIN)
diff --git a/Marlin/src/pins/stm32h7/pins_BTT_OCTOPUS_MAX_EZ.h b/Marlin/src/pins/stm32h7/pins_BTT_OCTOPUS_MAX_EZ.h
index b995b2269e..a60b3bdf43 100644
--- a/Marlin/src/pins/stm32h7/pins_BTT_OCTOPUS_MAX_EZ.h
+++ b/Marlin/src/pins/stm32h7/pins_BTT_OCTOPUS_MAX_EZ.h
@@ -59,59 +59,12 @@
//
// Limit Switches
//
-#ifdef X_STALL_SENSITIVITY
- #define X_STOP_PIN X_DIAG_PIN
- #if X_HOME_TO_MIN
- #define X_MAX_PIN E0_DIAG_PIN // M4-DET
- #else
- #define X_MIN_PIN E0_DIAG_PIN // M4-DET
- #endif
-#elif NEEDS_X_MINMAX
- #ifndef X_MIN_PIN
- #define X_MIN_PIN X_DIAG_PIN // X-STOP
- #endif
- #ifndef X_MAX_PIN
- #define X_MAX_PIN E0_DIAG_PIN // M4-DET
- #endif
-#else
- #define X_STOP_PIN X_DIAG_PIN // X-STOP
-#endif
-
-#ifdef Y_STALL_SENSITIVITY
- #define Y_STOP_PIN Y_DIAG_PIN
- #if Y_HOME_TO_MIN
- #define Y_MAX_PIN E1_DIAG_PIN // M5-DET
- #else
- #define Y_MIN_PIN E1_DIAG_PIN // M5-DET
- #endif
-#elif NEEDS_Y_MINMAX
- #ifndef Y_MIN_PIN
- #define Y_MIN_PIN Y_DIAG_PIN // Y-STOP
- #endif
- #ifndef Y_MAX_PIN
- #define Y_MAX_PIN E1_DIAG_PIN // M5-DET
- #endif
-#else
- #define Y_STOP_PIN Y_DIAG_PIN // Y-STOP
-#endif
-
-#ifdef Z_STALL_SENSITIVITY
- #define Z_STOP_PIN Z_DIAG_PIN
- #if Z_HOME_TO_MIN
- #define Z_MAX_PIN E2_DIAG_PIN // PWRDET
- #else
- #define Z_MIN_PIN E2_DIAG_PIN // PWRDET
- #endif
-#elif NEEDS_Z_MINMAX
- #ifndef Z_MIN_PIN
- #define Z_MIN_PIN Z_DIAG_PIN // Z-STOP
- #endif
- #ifndef Z_MAX_PIN
- #define Z_MAX_PIN E2_DIAG_PIN // PWRDET
- #endif
-#else
- #define Z_STOP_PIN Z_DIAG_PIN // Z-STOP
-#endif
+#define X_STOP_PIN X_DIAG_PIN // M1-STOP
+#define Y_STOP_PIN Y_DIAG_PIN // M2-STOP
+#define Z_STOP_PIN Z_DIAG_PIN // M3-STOP
+#define X_OTHR_PIN E0_DIAG_PIN // M5-STOP
+#define Y_OTHR_PIN E1_DIAG_PIN // M6-STOP
+#define Z_OTHR_PIN E2_DIAG_PIN // M7-STOP
//
// Z Probe (when not Z_MIN_PIN)
diff --git a/Marlin/src/pins/stm32h7/pins_BTT_OCTOPUS_PRO_V1_common.h b/Marlin/src/pins/stm32h7/pins_BTT_OCTOPUS_PRO_V1_common.h
index 8c8cd1d8a1..7339d74376 100644
--- a/Marlin/src/pins/stm32h7/pins_BTT_OCTOPUS_PRO_V1_common.h
+++ b/Marlin/src/pins/stm32h7/pins_BTT_OCTOPUS_PRO_V1_common.h
@@ -59,59 +59,12 @@
//
// Limit Switches
//
-#ifdef X_STALL_SENSITIVITY
- #define X_STOP_PIN X_DIAG_PIN
- #if X_HOME_TO_MIN
- #define X_MAX_PIN E0_DIAG_PIN // E0DET
- #else
- #define X_MIN_PIN E0_DIAG_PIN // E0DET
- #endif
-#elif NEEDS_X_MINMAX
- #ifndef X_MIN_PIN
- #define X_MIN_PIN X_DIAG_PIN // X-STOP
- #endif
- #ifndef X_MAX_PIN
- #define X_MAX_PIN E0_DIAG_PIN // E0DET
- #endif
-#else
- #define X_STOP_PIN X_DIAG_PIN // X-STOP
-#endif
-
-#ifdef Y_STALL_SENSITIVITY
- #define Y_STOP_PIN Y_DIAG_PIN
- #if Y_HOME_TO_MIN
- #define Y_MAX_PIN E1_DIAG_PIN // E1DET
- #else
- #define Y_MIN_PIN E1_DIAG_PIN // E1DET
- #endif
-#elif NEEDS_Y_MINMAX
- #ifndef Y_MIN_PIN
- #define Y_MIN_PIN Y_DIAG_PIN // Y-STOP
- #endif
- #ifndef Y_MAX_PIN
- #define Y_MAX_PIN E1_DIAG_PIN // E1DET
- #endif
-#else
- #define Y_STOP_PIN Y_DIAG_PIN // Y-STOP
-#endif
-
-#ifdef Z_STALL_SENSITIVITY
- #define Z_STOP_PIN Z_DIAG_PIN
- #if Z_HOME_TO_MIN
- #define Z_MAX_PIN E2_DIAG_PIN // PWRDET
- #else
- #define Z_MIN_PIN E2_DIAG_PIN // PWRDET
- #endif
-#elif NEEDS_Z_MINMAX
- #ifndef Z_MIN_PIN
- #define Z_MIN_PIN Z_DIAG_PIN // Z-STOP
- #endif
- #ifndef Z_MAX_PIN
- #define Z_MAX_PIN E2_DIAG_PIN // PWRDET
- #endif
-#else
- #define Z_STOP_PIN Z_DIAG_PIN // Z-STOP
-#endif
+#define X_STOP_PIN X_DIAG_PIN // X-STOP
+#define Y_STOP_PIN Y_DIAG_PIN // Y-STOP
+#define Z_STOP_PIN Z_DIAG_PIN // Z-STOP
+#define X_OTHR_PIN E0_DIAG_PIN // E0DET
+#define Y_OTHR_PIN E1_DIAG_PIN // E1DET
+#define Z_OTHR_PIN E2_DIAG_PIN // E2DET
//
// Z Probe (when not Z_MIN_PIN)
diff --git a/Marlin/src/pins/stm32h7/pins_BTT_SKR_SE_BX_common.h b/Marlin/src/pins/stm32h7/pins_BTT_SKR_SE_BX_common.h
index 529e610624..736f79e664 100644
--- a/Marlin/src/pins/stm32h7/pins_BTT_SKR_SE_BX_common.h
+++ b/Marlin/src/pins/stm32h7/pins_BTT_SKR_SE_BX_common.h
@@ -124,16 +124,19 @@
#endif
//
-// SPI pins for TMC2130 stepper drivers
+// SPI pins for TMC2130, TMC2160, TMC2240, TMC2660, TMC5130, or TMC5160 stepper drivers
//
-#ifndef TMC_SPI_MOSI
- #define TMC_SPI_MOSI PC6
-#endif
-#ifndef TMC_SPI_MISO
- #define TMC_SPI_MISO PG3
-#endif
-#ifndef TMC_SPI_SCK
- #define TMC_SPI_SCK PC7
+#if HAS_TMC_SPI
+ #define TMC_USE_SW_SPI
+ #ifndef TMC_SPI_MOSI
+ #define TMC_SPI_MOSI PC6
+ #endif
+ #ifndef TMC_SPI_MISO
+ #define TMC_SPI_MISO PG3
+ #endif
+ #ifndef TMC_SPI_SCK
+ #define TMC_SPI_SCK PC7
+ #endif
#endif
#if HAS_TMC_UART
diff --git a/Marlin/src/pins/stm32h7/pins_BTT_SKR_V3_0_common.h b/Marlin/src/pins/stm32h7/pins_BTT_SKR_V3_0_common.h
index 7456236669..320d396d76 100644
--- a/Marlin/src/pins/stm32h7/pins_BTT_SKR_V3_0_common.h
+++ b/Marlin/src/pins/stm32h7/pins_BTT_SKR_V3_0_common.h
@@ -70,61 +70,19 @@
//
// Limit Switches
//
-#ifdef X_STALL_SENSITIVITY
- #define X_STOP_PIN X_DIAG_PIN
- #if X_HOME_TO_MIN
- #define X_MAX_PIN PC2 // E0DET
- #else
- #define X_MIN_PIN PC2 // E0DET
- #endif
-#elif ENABLED(X_DUAL_ENDSTOPS)
- #ifndef X_MIN_PIN
- #define X_MIN_PIN PC1 // X-STOP
- #endif
- #ifndef X_MAX_PIN
- #define X_MAX_PIN PC2 // E0DET
- #endif
-#else
- #define X_STOP_PIN PC1 // X-STOP
+#ifndef X_STOP_PIN
+ #define X_STOP_PIN X_DIAG_PIN // X-STOP
#endif
+#ifndef Y_STOP_PIN
+ #define Y_STOP_PIN Y_DIAG_PIN // Y-STOP
+#endif
+#ifndef Z_STOP_PIN
+ #define Z_STOP_PIN Z_DIAG_PIN // Z-STOP
+#endif
+#define X_OTHR_PIN PC2 // E0DET
+#define Y_OTHR_PIN PA0 // E1DET
+#define Z_OTHR_PIN PC15 // PWRDET
-#ifdef Y_STALL_SENSITIVITY
- #define Y_STOP_PIN Y_DIAG_PIN
- #if Y_HOME_TO_MIN
- #define Y_MAX_PIN PA0 // E1DET
- #else
- #define Y_MIN_PIN PA0 // E1DET
- #endif
-#elif ENABLED(Y_DUAL_ENDSTOPS)
- #ifndef Y_MIN_PIN
- #define Y_MIN_PIN PC3 // Y-STOP
- #endif
- #ifndef Y_MAX_PIN
- #define Y_MAX_PIN PA0 // E1DET
- #endif
-#else
- #define Y_STOP_PIN PC3 // Y-STOP
-#endif
-
-#ifdef Z_STALL_SENSITIVITY
- #define Z_STOP_PIN Z_DIAG_PIN
- #if Z_HOME_TO_MIN
- #define Z_MAX_PIN PC15 // PWRDET
- #else
- #define Z_MIN_PIN PC15 // PWRDET
- #endif
-#elif ENABLED(Z_MULTI_ENDSTOPS)
- #ifndef Z_MIN_PIN
- #define Z_MIN_PIN PC0 // Z-STOP
- #endif
- #ifndef Z_MAX_PIN
- #define Z_MAX_PIN PC15 // PWRDET
- #endif
-#else
- #ifndef Z_STOP_PIN
- #define Z_STOP_PIN PC0 // Z-STOP
- #endif
-#endif
#define ONBOARD_ENDSTOPPULLUPS // Board has built-in pullups
//
diff --git a/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.cpp b/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.cpp
index 8b25df16b9..fde697c1f4 100644
--- a/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.cpp
+++ b/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.cpp
@@ -128,7 +128,7 @@ bool DiskIODriver_USBFlash::usbStartup() {
SERIAL_ECHOPGM("Starting USB host...");
if (!UHS_START) {
SERIAL_ECHOLNPGM(" failed.");
- LCD_MESSAGE(MSG_MEDIA_USB_FAILED);
+ LCD_MESSAGE(MSG_USB_FD_USB_FAILED);
return false;
}
@@ -223,8 +223,8 @@ void DiskIODriver_USBFlash::idle() {
#endif
#if USB_DEBUG >= 1
SERIAL_ECHOLNPGM("Waiting for media");
+ LCD_MESSAGE(MSG_USB_FD_WAITING_FOR_MEDIA);
#endif
- LCD_MESSAGE(MSG_MEDIA_WAITING);
GOTO_STATE_AFTER_DELAY(state, 2000);
}
break;
@@ -237,9 +237,9 @@ void DiskIODriver_USBFlash::idle() {
// Handle device removal events
#if USB_DEBUG >= 1
SERIAL_ECHOLNPGM("USB device removed");
+ if (state != MEDIA_READY)
+ LCD_MESSAGE(MSG_USB_FD_DEVICE_REMOVED);
#endif
- if (state != MEDIA_READY)
- LCD_MESSAGE(MSG_MEDIA_USB_REMOVED);
GOTO_STATE_AFTER_DELAY(WAIT_FOR_DEVICE, 0);
}
@@ -247,8 +247,8 @@ void DiskIODriver_USBFlash::idle() {
// Handle media removal events
#if USB_DEBUG >= 1
SERIAL_ECHOLNPGM("Media removed");
+ LCD_MESSAGE(MSG_USB_FD_MEDIA_REMOVED);
#endif
- LCD_MESSAGE(MSG_MEDIA_REMOVED);
GOTO_STATE_AFTER_DELAY(WAIT_FOR_DEVICE, 0);
}
diff --git a/README-PT-BR.md b/README-PT-BR.md
new file mode 100644
index 0000000000..3c730967ae
--- /dev/null
+++ b/README-PT-BR.md
@@ -0,0 +1,81 @@
+
+
+
+Firmware de Impressora 3D Marlin
+
+
+
+
+
+
+
+
+
+
+
+
+Documentação adicional pode ser encontrada na [Página Inicial do Marlin](//marlinfw.org/).
+Por favor, teste este firmware e nos avise se encontrar algum problema. Voluntários estão prontos para ajudar!
+
+## Branch de Correções do Marlin 2.1
+
+__Não é para uso em produção. Use com cautela!__
+
+O Marlin 2.1 continua oferecendo suporte a placas ARM 32 bits e AVR 8 bits, além de adicionar suporte para até 9 eixos coordenados e até 8 extrusoras.
+
+Este branch é para correções da versão mais recente 2.1.x. Periodicamente, ele servirá de base para o próximo lançamento menor da linha 2.1.x.
+
+Versões anteriores do Marlin podem ser baixadas na [página de lançamentos](//github.com/MarlinFirmware/Marlin/releases).
+
+## Configurações de Exemplo
+
+Antes de compilar o Marlin para sua máquina, você precisará de uma configuração específica para o seu hardware. Ao solicitar, seu fornecedor deve fornecer o código-fonte completo e as configurações da sua máquina. No entanto, se quiser instalar uma versão mais recente do Marlin, você precisará de arquivos de configuração atualizados. Felizmente, a comunidade do Marlin já contribuiu com dezenas de configurações testadas para ajudar no início. Visite o repositório [MarlinFirmware/Configurations](//github.com/MarlinFirmware/Configurations) para encontrar a configuração mais próxima da sua impressora.
+
+## Compilando o Marlin 2.1
+
+Para compilar e enviar o Marlin você pode usar uma destas ferramentas:
+
+- O [Visual Studio Code](//code.visualstudio.com/download) com a extensão [Auto Build Marlin](//marlinfw.org/docs/basics/auto_build_marlin.html).
+- A [IDE do Arduino](//www.arduino.cc/en/main/software): Veja [Compilando Marlin com Arduino](//marlinfw.org/docs/basics/install_arduino.html).
+- Também é possível usar VSCode com devcontainer: Veja [Instalando Marlin (VSCode devcontainer)](http://marlinfw.org/docs/basics/install_devcontainer_vscode.html).
+
+O Marlin é otimizado para ser compilado com a extensão **PlatformIO IDE** no **Visual Studio Code**. Ainda é possível compilar com a **IDE do Arduino**, e temos planos para melhorar essa experiência, mas por enquanto o PlatformIO é a melhor escolha.
+
+## Placas AVR 8 Bits
+
+Pretendemos continuar oferecendo suporte às placas AVR 8 bits indefinidamente, mantendo uma base de código única que possa ser aplicada a todas as máquinas. Queremos que hobbystas, experimentadores e donos de máquinas antigas também se beneficiem das inovações da comunidade tanto quanto os donos de equipamentos mais modernos. Além disso, essas máquinas baseadas em AVR costumam ser ideais para testes e feedbacks!
+
+## Camada de Abstração de Hardware (HAL)
+
+O Marlin inclui uma camada de abstração de hardware para portar o firmware para uma grande variedade de chips. Essa camada trata das diferenças entre chips de forma modular, permitindo que as funcionalidades do Marlin sejam aproveitadas ao máximo.
+
+## Licença
+
+Marlin é publicado sob a licença GPL, então você pode usar, redistribuir e modificar o código-fonte, desde que o código derivado também seja publicado sob a mesma licença. Consulte o arquivo [LICENSE](https://github.com/MarlinFirmware/Marlin/blob/bugfix-2.1.x/LICENSE) para mais detalhes.
+
+## Ajude o Marlin!
+
+Você pode ajudar o projeto Marlin contribuindo com código, traduções, testes ou apoiando financeiramente no [GitHub Sponsors](https://github.com/sponsors/thinkyhead).
+
+...Marlin para diferentes plataformas de hardware. O HAL define as interfaces entre o núcleo do Marlin e o hardware da plataforma. O Marlin suporta atualmente as seguintes arquiteturas:
+
+- AVR
+- SAM (Arduino Due)
+- SAMD (Arduino Zero, etc.)
+- STM32F1, STM32F4, STM32F7, STM32H7
+- LPC176x (Smoothieboard, ReARM, Archim, MKS Sbase, etc.)
+- Teensy 3.5 e 3.6 (ARM Cortex-M4)
+- ESP32 (experimental)
+
+## Comunicação Serial
+
+- **Baudrates suportados:** 250000, 115200, 57600, 38400, 19200, 9600
+- O baudrate padrão é 250000 para maior velocidade e estabilidade
+
+## Atualizações e Contribuições
+
+Aceitamos correções de bugs, melhorias de desempenho e novas funcionalidades. Veja as instruções de contribuição na [Wiki do Marlin](https://github.com/MarlinFirmware/Marlin/wiki/Contributing).
+
+## Licença
+
+Marlin é um software livre licenciado sob a [GNU General Public License v3.0](https://www.gnu.org/licenses/gpl-3.0.html). Você pode redistribuí-lo e/ou modificá-lo sob os termos da GPL. Para mais detalhes, veja o arquivo [LICENSE](LICENSE).
diff --git a/README.md b/README.md
index 50b86d3213..69979f4884 100644
--- a/README.md
+++ b/README.md
@@ -9,13 +9,17 @@
-
+
Additional documentation can be found at the [Marlin Home Page](//marlinfw.org/).
Please test this firmware and let us know if it misbehaves in any way. Volunteers are standing by!
+---
+This README is available in other languages
+> **Versão em português:** [README-PT-BR.md](README-PT-BR.md)
+
## Marlin 2.1 Bugfix Branch
__Not for production use. Use with caution!__
diff --git a/buildroot/bin/mac_gcc b/buildroot/bin/mac_gcc
index 6c5d7ea24a..14ae3c4500 100755
--- a/buildroot/bin/mac_gcc
+++ b/buildroot/bin/mac_gcc
@@ -10,30 +10,29 @@
which port >/dev/null && HAS_MACPORTS=1
which brew >/dev/null && HAS_HOMEBREW=1
-MACPORTS_PATH=$(dirname "$(which port)")
+if ((HAS_MACPORTS)); then
+ MACPORTS_PATH=$(dirname "$(which port)")
+ cd $MACPORTS_PATH
+ sudo rm -f cpp gcc g++ cc ld
+ cd -
+fi
+
if ((HAS_HOMEBREW)); then
HOMEBREW_PATH="$(brew --prefix)/bin"
+ cd $HOMEBREW_PATH
+ rm -f cpp gcc g++ cc ld
+ cd -
fi
if [[ $1 == "apple" || $1 == "darwin" || $1 == "system" ]]; then
- if ((HAS_MACPORTS)); then
- cd $MACPORTS_PATH
- sudo rm -f gcc g++ cc ld
- cd -
- fi
-
- if ((HAS_HOMEBREW)); then
- cd $HOMEBREW_PATH
- sudo rm -f gcc g++ cc
- cd -
- fi
+ # Nothing to do
elif [[ $1 =~ ".*ports" ]]; then
((HAS_MACPORTS)) || { echo "MacPorts is not installed"; exit 1; }
- GCCV=$( find $MACPORTS_PATH -name "gcc-mp-*" | sort -r | head -1 | sed 's/.*gcc-mp-//' )
+ GCCV=$( find $MACPORTS_PATH -name "cpp-mp-*" | sort -r | head -1 | sed 's/.*cpp-mp-//' )
[[ $GCCV -ge 11 ]] || GCCV=14
getport() { port installed $1 | grep $1 || sudo port install $1; }
@@ -42,7 +41,7 @@ elif [[ $1 =~ ".*ports" ]]; then
getports "gcc$GCCV" glm mesa libsdl2 libsdl2_net
cd $MACPORTS_PATH
- sudo rm -f gcc g++ cc ld
+ sudo ln -s "cpp-mp-$GCCV" cpp
sudo ln -s "gcc-mp-$GCCV" gcc
sudo ln -s "g++-mp-$GCCV" g++
sudo ln -s g++ cc
@@ -53,16 +52,22 @@ elif [[ $1 =~ ".*brew" ]]; then
((HAS_HOMEBREW)) || { echo "Homebrew is not installed"; exit 1; }
- GCCV=$( find $HOMEBREW_PATH -name "gcc-*" | sort -r | head -1 | sed 's/.*gcc-//' )
- [[ $GCCV -ge 11 ]] || { brew install gcc@14 ; GCCV=14 }
+ GCCV=$( find $HOMEBREW_PATH -name "cpp-*" | sort -r | head -1 | sed 's/.*cpp-//' )
+ [[ $GCCV -ge 11 ]] || brew install gcc
+ GCCV=$( find $HOMEBREW_PATH -name "cpp-*" | sort -r | head -1 | sed 's/.*cpp-//' )
brew install glm mesa sdl2 sdl2_net
cd $HOMEBREW_PATH
- sudo rm -f gcc g++ cc
- sudo ln -s "gcc-$GCCV" gcc
- sudo ln -s "g++-$GCCV" g++
- sudo ln -s g++ cc
+ ln -s "cpp-$GCCV" cpp
+ ln -s "gcc-$GCCV" gcc
+ ln -s "g++-$GCCV" g++
+ ln -s g++ cc
+ if [[ -f "$MACPORTS_PATH/ld-classic" ]]; then
+ ln -s "$MACPORTS_PATH/ld-classic" ld
+ else
+ echo "MacPorts may be required for a compatible 'ld' linker!"
+ fi
cd -
else
diff --git a/buildroot/bin/use_example_configs b/buildroot/bin/use_example_configs
index 193da74901..9a3a7a34d4 100755
--- a/buildroot/bin/use_example_configs
+++ b/buildroot/bin/use_example_configs
@@ -15,6 +15,9 @@
#
import os, subprocess, sys, urllib.request
+from pathlib import Path
+
+CONFIG_FILES = ("Configuration.h", "Configuration_adv.h", "_Bootscreen.h", "_Statusscreen.h")
def get_current_branch():
try:
@@ -25,19 +28,45 @@ def get_current_branch():
except subprocess.CalledProcessError:
return None
-def fetch_configs(branch, config_path):
- print(f"Fetching {config_path} configurations from {branch}...")
- base_url = f"https://raw.githubusercontent.com/MarlinFirmware/Configurations/{branch}/config/{config_path}"
- files = ["Configuration.h", "Configuration_adv.h", "_Bootscreen.h", "_Statusscreen.h"]
- marlin_dir = os.path.join(os.getcwd(), "Marlin")
- if not os.path.exists(marlin_dir):
- print(f"Directory {marlin_dir} does not exist.")
- sys.exit(1)
- for file in files:
+def sparse_checkout(branch, config_path, repo_url="https://github.com/MarlinFirmware/Configurations.git"):
+ configs_dir = Path("ConfigurationsRepo")
+ config_subdir = f"config/{config_path}"
+
+ if not configs_dir.exists():
+ # Step 1: Clone with no checkout
+ subprocess.run([
+ "git", "clone", "--depth", "1", "--filter=blob:none", "--sparse",
+ "--branch", branch, repo_url, str(configs_dir)
+ ], check=True)
+
+ # Step 2: Enable sparse checkout and set the folder
+ subprocess.run(["git", "sparse-checkout", "set", config_subdir], cwd=str(configs_dir), check=True)
+ # Step 3: Pull the latest for that branch/folder
+ subprocess.run(["git", "pull"], cwd=str(configs_dir), check=True)
+
+def copy_config_files(branch, config_path, dest_dir):
+ sparse_checkout(branch, config_path)
+
+ src_dir = Path("ConfigurationsRepo") / "config" / config_path
+ for fname in CONFIG_FILES:
+ src_file = src_dir / fname
+ if src_file.exists():
+ dest_file = dest_dir / fname
+ print(f"Copying {src_file} to {dest_file}")
+ dest_file.write_bytes(src_file.read_bytes())
+ else:
+ print(f"{fname} not found in {src_dir}")
+
+def fetch_config_files(branch, config_path, dest_dir):
+ config_path_url = config_path.replace(' ', '%20')
+ base_url = f"https://raw.githubusercontent.com/MarlinFirmware/Configurations/{branch}/config/{config_path_url}"
+
+ for file in CONFIG_FILES:
url = f"{base_url}/{file}"
- dest_file = os.path.join(marlin_dir, file)
+ dest_file = dest_dir / file
if os.getenv('DEBUG', '0') == '1':
print(f"Fetching {file} from {url} to {dest_file}")
+
try:
urllib.request.urlretrieve(url, dest_file)
except urllib.error.HTTPError as e:
@@ -47,6 +76,19 @@ def fetch_configs(branch, config_path):
else:
raise
+def fetch_configs(branch, config_path):
+ print(f"Fetching {config_path} configurations from {branch}...")
+
+ marlin_dir = Path("Marlin")
+ if not marlin_dir.exists():
+ print(f"Directory 'Marlin' not found at the current location.")
+ sys.exit(1)
+
+ if os.environ.get('GITHUB_ACTIONS'): # Running on GitHub ?
+ copy_config_files(branch, config_path, marlin_dir)
+ else:
+ fetch_config_files(branch, config_path, marlin_dir)
+
def main():
branch = get_current_branch()
if not branch:
@@ -74,7 +116,7 @@ def main():
branch = part1
else:
config_path = arg
- config_path = 'examples/'+config_path.replace(' ', '%20')
+ config_path = 'examples/'+config_path
else:
config_path = "default"
@@ -82,6 +124,7 @@ def main():
subprocess.run(['restore_configs'], check=True)
except FileNotFoundError:
print("restore_configs not found, skipping.")
+
fetch_configs(branch, config_path)
if __name__ == "__main__":
diff --git a/buildroot/share/PlatformIO/variants/README.md b/buildroot/share/PlatformIO/variants/README.md
index ae64b1b439..0217e2ebd9 100644
--- a/buildroot/share/PlatformIO/variants/README.md
+++ b/buildroot/share/PlatformIO/variants/README.md
@@ -3,7 +3,7 @@
This `buildroot/share/PlatformIO/variants` folder contains Marlin custom variants for both generic and custom boards.
Marlin specifies board variants in PlatformIO INI files in one of two ways:
-- The `board_build.variant = VARIANT_MAME` field specifies the variant subfolder name directly.
+- The `board_build.variant = VARIANT_NAME` field specifies the variant subfolder name directly.
- The `board = board_name` field names a custom board JSON file that contains a `build.variant` field.
## Variant File Naming
diff --git a/buildroot/tests/BTT_BTT002 b/buildroot/tests/BTT_BTT002
index 121aace895..054b179bfe 100755
--- a/buildroot/tests/BTT_BTT002
+++ b/buildroot/tests/BTT_BTT002
@@ -12,7 +12,8 @@ set -e
restore_configs
opt_set MOTHERBOARD BOARD_BTT_BTT002_V1_0 \
SERIAL_PORT 1 \
- X_DRIVER_TYPE TMC2209 Y_DRIVER_TYPE TMC2130
+ X_DRIVER_TYPE TMC2209 Y_DRIVER_TYPE TMC2130 Z_DRIVER_TYPE TMC2240 \
+ X_CURRENT_HOME '(X_CURRENT - 100)' Y_CURRENT_HOME '(Y_CURRENT - 100)'
opt_enable SENSORLESS_HOMING X_STALL_SENSITIVITY Y_STALL_SENSITIVITY SPI_ENDSTOPS
exec_test $1 $2 "BigTreeTech BTT002 Default Configuration plus TMC steppers" "$3"
diff --git a/buildroot/tests/STM32F103RE_creality b/buildroot/tests/STM32F103RE_creality
index 0a1b1bc79d..0855a71ee4 100755
--- a/buildroot/tests/STM32F103RE_creality
+++ b/buildroot/tests/STM32F103RE_creality
@@ -20,15 +20,17 @@ exec_test $1 $2 "Ender-3 V2 - JyersUI (ABL Bilinear/Manual)" "$3"
use_example_configs "Creality/Ender-3 V2/CrealityV422/CrealityUI"
opt_disable DWIN_CREALITY_LCD PIDTEMP
-opt_enable DWIN_MARLINUI_LANDSCAPE LCD_ENDSTOP_TEST AUTO_BED_LEVELING_UBL BLTOUCH Z_SAFE_HOMING MPCTEMP MPC_AUTOTUNE \
+opt_enable DWIN_MARLINUI_LANDSCAPE LCD_ENDSTOP_TEST AUTO_BED_LEVELING_UBL BLTOUCH Z_SAFE_HOMING \
+ MPCTEMP MPC_AUTOTUNE EVENT_GCODE_AFTER_MPC_TUNE \
MARLIN_BRICKOUT MARLIN_INVADERS MARLIN_SNAKE GAMES_EASTER_EGG
exec_test $1 $2 "Ender-3 V2 - MarlinUI (Games, UBL+BLTOUCH, MPCTEMP, LCD_ENDSTOP_TEST)" "$3"
use_example_configs "Creality/Ender-3 S1/STM32F1"
opt_disable DWIN_CREALITY_LCD Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN AUTO_BED_LEVELING_BILINEAR CANCEL_OBJECTS FWRETRACT EVENT_GCODE_SD_ABORT
-opt_enable DWIN_LCD_PROUI INDIVIDUAL_AXIS_HOMING_SUBMENU SET_PROGRESS_MANUALLY SET_PROGRESS_PERCENT STATUS_MESSAGE_SCROLLING \
+opt_enable DWIN_LCD_PROUI INDIVIDUAL_AXIS_HOMING_SUBMENU PID_AUTOTUNE_MENU PID_EDIT_MENU \
+ SET_PROGRESS_MANUALLY SET_PROGRESS_PERCENT STATUS_MESSAGE_SCROLLING \
SOUND_MENU_ITEM PRINTCOUNTER NOZZLE_PARK_FEATURE ADVANCED_PAUSE_FEATURE FILAMENT_RUNOUT_SENSOR \
- BLTOUCH Z_SAFE_HOMING AUTO_BED_LEVELING_UBL MESH_EDIT_MENU LCD_BED_TRAMMING \
+ BLTOUCH Z_SAFE_HOMING AUTO_BED_LEVELING_UBL MESH_EDIT_MENU LCD_BED_TRAMMING LIN_ADVANCE \
LIMITED_MAX_FR_EDITING LIMITED_MAX_ACCEL_EDITING LIMITED_JERK_EDITING BAUD_RATE_GCODE \
CASE_LIGHT_ENABLE CASE_LIGHT_MENU CASE_LIGHT_NO_BRIGHTNESS
opt_set PREHEAT_3_LABEL '"CUSTOM"' PREHEAT_3_TEMP_HOTEND 240 PREHEAT_3_TEMP_BED 60 PREHEAT_3_FAN_SPEED 128 BOOTSCREEN_TIMEOUT 1100 CASE_LIGHT_PIN 4
diff --git a/ini/features.ini b/ini/features.ini
index 20de80dfbc..8d7e755406 100644
--- a/ini/features.ini
+++ b/ini/features.ini
@@ -20,7 +20,7 @@ MARLIN_TEST_BUILD = build_src_filter=+
POSTMORTEM_DEBUGGING = build_src_filter=+ +
build_flags=-funwind-tables
MKS_WIFI_MODULE = QRCode=https://github.com/makerbase-mks/QRCode/archive/261c5a696a.zip
-HAS_TRINAMIC_CONFIG = TMCStepper=https://github.com/MarlinFirmware/TMCStepper/archive/marlin-2.1.3.x.zip
+HAS_TRINAMIC_CONFIG = TMCStepper=https://github.com/MarlinFirmware/TMCStepper/archive/v0.8.2.zip
build_src_filter=+ + + + +
HAS_STEPPER_CONTROL = build_src_filter=+
HAS_T(RINAMIC_CONFIG|MC_SPI) = build_src_filter=+
@@ -378,7 +378,7 @@ HAS_SERVOS = build_src_filter=+
HAS_MICROSTEPS = build_src_filter=+
(ESP3D_)?WIFISUPPORT = esp32async/AsyncTCP@3.3.3, mathieucarbou/ESP Async WebServer@3.0.6
- ESP3DLib=https://github.com/luc-github/ESP3DLib/archive/dc0f3d96c6.zip
+ ESP3DLib=https://github.com/luc-github/ESP3DLib/archive/6d62f76c3f.zip
arduinoWebSockets=links2004/WebSockets@2.3.4
luc-github/ESP32SSDP@1.1.1
lib_ignore=ESPAsyncTCP
diff --git a/ini/hc32.ini b/ini/hc32.ini
index 8a55e3b495..19baeda210 100644
--- a/ini/hc32.ini
+++ b/ini/hc32.ini
@@ -27,8 +27,8 @@
# Base Environment for all HC32F460 variants
#
[HC32F460_base]
-platform = https://github.com/shadow578/platform-hc32f46x/archive/1.1.0.zip
-platform_packages = framework-hc32f46x-ddl@https://github.com/shadow578/framework-hc32f46x-ddl/archive/2.2.2.zip
+platform = https://github.com/shadow578/platform-hc32f46x/archive/1.1.1.zip
+platform_packages = framework-hc32f46x-ddl@https://github.com/shadow578/framework-hc32f46x-ddl/archive/2.2.3.zip
framework-arduino-hc32f46x@https://github.com/shadow578/framework-arduino-hc32f46x/archive/1.2.0.zip
board = generic_hc32f460
build_src_filter = ${common.default_src_filter} + +
diff --git a/ini/native.ini b/ini/native.ini
index f27285e83a..5f56b1c843 100644
--- a/ini/native.ini
+++ b/ini/native.ini
@@ -58,7 +58,7 @@ debug_build_flags = -fstack-protector-strong -g -g3 -ggdb
lib_compat_mode = off
build_src_filter = ${common.default_src_filter} +
lib_deps = ${common.lib_deps}
- MarlinSimUI=https://github.com/p3p/MarlinSimUI/archive/dd9c41f1b2.zip
+ MarlinSimUI=https://github.com/p3p/MarlinSimUI/archive/af62611296.zip
Adafruit NeoPixel=https://github.com/p3p/Adafruit_NeoPixel/archive/c6b319f447.zip
LiquidCrystal=https://github.com/p3p/LiquidCrystal/archive/322fb5fc23.zip
extra_scripts = ${common.extra_scripts}
@@ -115,7 +115,7 @@ build_flags = -g2
-DHAS_LIBBSD
-I/opt/local/include
-I/opt/local/include/freetype2
- -I/opt/local/include/SDL2/
+ -I/opt/local/include/SDL2
-L/opt/local/lib
-Wl,-framework,OpenGl
-Wl,-framework,CoreFoundation
diff --git a/ini/stm32f1-maple.ini b/ini/stm32f1-maple.ini
index ddd75549c8..17bcb2eb60 100644
--- a/ini/stm32f1-maple.ini
+++ b/ini/stm32f1-maple.ini
@@ -389,7 +389,7 @@ build_flags = ${STM32F1_maple.build_flags}
-D__STM32F1__=1 -DDEBUG_LEVEL=0 -DSS_TIMER=4 -DSERIAL_USB
lib_deps = ${STM32F1_maple.lib_deps}
USBComposite for STM32F1@0.91
-lib_ignore = Adafruit NeoPixel, SPI, SailfishLCD, SailfishRGB_LED, SlowSoftI2CMaster, TMCStepper
+lib_ignore = Adafruit NeoPixel, SPI, SailfishLCD, SailfishRGB_LED, SlowSoftI2CMaster
[env:STM32F103RC_ZM3E2_USB_maple]
extends = ZONESTAR_ZM3E_maple