Merge branch 'bugfix-2.1.x' into pr/26944

This commit is contained in:
Scott Lahteine
2025-05-27 00:09:04 -05:00
138 changed files with 1852 additions and 1768 deletions
+10
View File
@@ -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 }}
+4 -3
View File
@@ -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
//===========================================================================
+27 -17
View File
@@ -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
+4 -4
View File
@@ -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)
+1 -1
View File
@@ -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
@@ -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) {
+3 -3
View File
@@ -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();
+1 -1
View File
@@ -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) {
+13 -6
View File
@@ -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':
#
@@ -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) {
@@ -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) {
+3 -3
View File
@@ -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
+26 -10
View File
@@ -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
-4
View File
@@ -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));
+3 -3
View File
@@ -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);
+19 -19
View File
@@ -168,7 +168,7 @@ template <class L, class R> struct IF<true, L, R> { typedef L type; };
// Helpers
#define _RECIP(N) ((N) ? 1.0f / static_cast<float>(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<T> pxy) { XY_CODE(x = pxy.x, y = pxy.y); }
FI void set(const XYval<T> pxy, const T pz) { XYZ_CODE(x = pxy.x, y = pxy.y, z = pz); }
FI void set(const XYval<T> &pxy) { XY_CODE(x = pxy.x, y = pxy.y); }
FI void set(const XYval<T> &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<T> diff(const XYZEval<T> &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<T> diff(const XYZval<T> &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<T> diff(const XYZval<T> &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<T> diff(const XYval<T> &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<T> pxy) { XY_CODE(x = pxy.x, y = pxy.y); }
FI void set(const XYval<T> pxy, const T pz) { XYZ_CODE(x = pxy.x, y = pxy.y, z = pz); }
FI void set(const XYZval<T> 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<T> &pxy) { XY_CODE(x = pxy.x, y = pxy.y); }
FI void set(const XYval<T> &pxy, const T pz) { XYZ_CODE(x = pxy.x, y = pxy.y, z = pz); }
FI void set(const XYZval<T> &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<T> pxy, const T pz, const T pe) { set(pxy, pz); e = pe; }
FI void set(const XYZval<T> 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<T> &pxy, const T pz, const T pe) { set(pxy, pz); e = pe; }
FI void set(const XYZval<T> &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<T> p) { NUM_AXIS_CODE(x[n]=p.x, y[n]=p.y,,,,,,,); }
FI void set(const int n, const XYZval<T> 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<T> 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<T> &p) { NUM_AXIS_CODE(x[n]=p.x, y[n]=p.y,,,,,,,); }
FI void set(const int n, const XYZval<T> &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<T> &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<T> p) { NUM_AXIS_CODE(x[n]=p.x, y[n]=p.y,,,,,,,); }
FI void set(const int n, const XYZval<T> 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<T> 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<T> &p) { NUM_AXIS_CODE(x[n]=p.x, y[n]=p.y,,,,,,,); }
FI void set(const int n, const XYZval<T> &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<T> &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); }
+1
View File
@@ -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))
);
}
+5 -3
View File
@@ -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")
);
}
/**
+167 -50
View File
@@ -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<class TMC>
static void print_vsense(TMC &st) { SERIAL_ECHO(st.vsense() ? F("1=.18") : F("0=.325")); }
#if HAS_DRIVER(TMC2160)
template<char AXIS_LETTER, char DRIVER_ID, AxisEnum AXIS_ID>
void print_vsense(TMCMarlin<TMC2160Stepper, AXIS_LETTER, DRIVER_ID, AXIS_ID> &) { }
#endif
#if HAS_DRIVER(TMC5160)
template<char AXIS_LETTER, char DRIVER_ID, AxisEnum AXIS_ID>
void print_vsense(TMCMarlin<TMC5160Stepper, AXIS_LETTER, DRIVER_ID, AXIS_ID> &) { }
#endif
#if HAS_DRIVER(TMC2240)
template<char AXIS_LETTER, char DRIVER_ID, AxisEnum AXIS_ID>
void print_vsense(TMCMarlin<TMC2240Stepper, AXIS_LETTER, DRIVER_ID, AXIS_ID> &) { }
#endif
template <typename TMC>
void print_cs_actual(TMC &st) { SERIAL_ECHO(st.cs_actual(), F("/31")); }
#if HAS_DRIVER(TMC2240)
template<char AXIS_LETTER, char DRIVER_ID, AxisEnum AXIS_ID>
void print_cs_actual(TMCMarlin<TMC2240Stepper, AXIS_LETTER, DRIVER_ID, AXIS_ID> &) { }
#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<char AXIS_LETTER, char DRIVER_ID, AxisEnum AXIS_ID>
void print_vsense(TMCMarlin<TMC2160Stepper, AXIS_LETTER, DRIVER_ID, AXIS_ID> &) { }
template<char AXIS_LETTER, char DRIVER_ID, AxisEnum AXIS_ID>
void print_vsense(TMCMarlin<TMC5160Stepper, AXIS_LETTER, DRIVER_ID, AXIS_ID> &) { }
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 <typename TMC>
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 <typename TMC>
void print_blank_time(TMC &st) { SERIAL_ECHO(st.blank_time()); }
template<char AXIS_LETTER, char DRIVER_ID, AxisEnum AXIS_ID>
void print_blank_time(TMCMarlin<TMC2240Stepper, AXIS_LETTER, DRIVER_ID, AXIS_ID> &) { }
template <typename TMC>
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<class TMC>
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<class TMC>
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 <char AXIS_LETTER, char DRIVER_ID, AxisEnum AXIS_ID>
static void tmc_get_registers(TMCMarlin<TMC2660Stepper, AXIS_LETTER, DRIVER_ID, AXIS_ID> &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
+76 -4
View File
@@ -95,7 +95,7 @@ class TMCMarlin : public TMC, public TMCStorage<AXIS_LETTER, DRIVER_ID> {
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<AXIS_LETTER, DRIVER_ID> {
#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<TMC2208Stepper, AXIS_LETTER, DRIVER_ID, AXIS_ID> : 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<TMC2209Stepper, AXIS_LETTER, DRIVER_ID, AXIS_ID> : 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<TMC2209Stepper, AXIS_LETTER, DRIVER_ID, AXIS_ID> : public TMC220
sgt_max = 255;
};
template<char AXIS_LETTER, char DRIVER_ID, AxisEnum AXIS_ID>
class TMCMarlin<TMC2240Stepper, AXIS_LETTER, DRIVER_ID, AXIS_ID> : public TMC2240Stepper, public TMCStorage<AXIS_LETTER, DRIVER_ID> {
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<char AXIS_LETTER, char DRIVER_ID, AxisEnum AXIS_ID>
class TMCMarlin<TMC2660Stepper, AXIS_LETTER, DRIVER_ID, AXIS_ID> : public TMC2660Stepper, public TMCStorage<AXIS_LETTER, DRIVER_ID> {
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);
+4 -2
View File
@@ -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);
+3 -6
View File
@@ -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
+1 -1
View File
@@ -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
+2 -2
View File
@@ -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);
+23 -6
View File
@@ -124,8 +124,13 @@
* S<percent> : 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) {
+1 -2
View File
@@ -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(),
+1 -2
View File
@@ -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(' '); }
+22 -24
View File
@@ -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
+1 -2
View File
@@ -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)
@@ -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
+4 -5
View File
@@ -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
@@ -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);
+4 -7
View File
@@ -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
@@ -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<typename TMC>
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<typename TMC>
+2 -2
View File
@@ -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
+7 -7
View File
@@ -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
+115 -64
View File
@@ -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 <cstddef>
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<PGM_P>(pref));
if (ind >= 0) { SERIAL_ECHO(ind); SERIAL_CHAR(':'); }
SERIAL_ECHOPGM_P(name, C(':'));
SERIAL_ECHOPGM_P(static_cast<PGM_P>(name), C(':'));
}
static void config_line(PGM_P const name, const float val, PGM_P const pref=nullptr, const int8_t ind=-1) {
template<typename T>
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<typename T>
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
+4 -3
View File
@@ -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;
}
}
}
+1 -3
View File
@@ -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
+1 -1
View File
@@ -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
+4 -1
View File
@@ -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;
+1 -3
View File
@@ -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
+6 -6
View File
@@ -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
-8
View File
@@ -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
*
-5
View File
@@ -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
*/
+4
View File
@@ -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
+33 -35
View File
@@ -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?)"
+1 -1
View File
@@ -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
/**
+16 -9
View File
@@ -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
+27 -20
View File
@@ -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<MenuItemPtr*>(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<MenuItemPtr*>(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<MenuItemPtr*>(menuitem)->value)); }
void onDrawPIDd(MenuItem* menuitem, int8_t line) { onDrawFloatMenu(menuitem, line, 2, unscalePID_d(*(float*)static_cast<MenuItemPtr*>(menuitem)->value)); }
void onDrawPIDi(MenuItem* menuitem, int8_t line) { onDrawFloatMenu(menuitem, line, PID_FDIGITS, unscalePID_i(*(float*)static_cast<MenuItemPtr*>(menuitem)->value)); }
void onDrawPIDd(MenuItem* menuitem, int8_t line) { onDrawFloatMenu(menuitem, line, PID_FDIGITS, unscalePID_d(*(float*)static_cast<MenuItemPtr*>(menuitem)->value)); }
#endif // PID_EDIT_MENU
#endif // HAS_PID_HEATING
@@ -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
+4 -4
View File
@@ -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
+4 -3
View File
@@ -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");
+4 -3
View File
@@ -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ü");
+4 -4
View File
@@ -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");
+4 -5
View File
@@ -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
+4 -3
View File
@@ -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");
+4 -3
View File
@@ -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");
+4 -3
View File
@@ -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");
+4 -3
View File
@@ -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");
+4 -3
View File
@@ -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("<Fömenü>");
+96 -23
View File
@@ -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
}
+4 -3
View File
@@ -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");
+4 -3
View File
@@ -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");
+4 -3
View File
@@ -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");
+4 -3
View File
@@ -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("Главное меню");
+4 -3
View File
@@ -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");
+4 -3
View File
@@ -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");
+4 -3
View File
@@ -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");
+4 -3
View File
@@ -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("Основне меню");
+4 -3
View File
@@ -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
+4 -3
View File
@@ -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"
+4 -3
View File
@@ -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"
+8 -7
View File
@@ -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);
+5 -1
View File
@@ -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
+18 -10
View File
@@ -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)
+8 -7
View File
@@ -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() {
+74 -22
View File
@@ -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() {
+6 -3
View File
@@ -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)
+3 -3
View File
@@ -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;
+41 -35
View File
@@ -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
+18 -9
View File
@@ -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)
+6
View File
@@ -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
+1 -1
View File
@@ -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]);
+9 -6
View File
@@ -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<T> 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(
+21 -6
View File
@@ -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();
+31 -11
View File
@@ -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:
/**
+1 -1
View File
@@ -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());
+21 -23
View File
@@ -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
+125 -112
View File
@@ -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
+34 -19
View File
@@ -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<unsigned int INDEX=DISTINCT_AXES> constexpr float max_isr_rate() {
template<int INDEX=DISTINCT_AXES> constexpr float max_isr_rate() {
return _MAX(_ISDMF[ALIM(INDEX - 1, _ISDMF)] * _ISDASU[ALIM(INDEX - 1, _ISDASU)], max_isr_rate<INDEX - 1>());
}
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;
// α=1exp(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)
+99 -15
View File
@@ -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<IC##Stepper, L, AI> 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<IC##Stepper, L, LI, AI> 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<IC##Stepper, L, LI, AI> 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<IC##Stepper, L, AI> stepper##ST(ST##_CS_PIN, float(ST##_RSENSE), ST##_CHAIN_POS)
#define __TMC_SPI_RSENSE_DEFINE(IC, ST, L, LI, AI) TMCMarlin<IC##Stepper, L, LI, AI> stepper##ST(ST##_CS_PIN, float(ST##_RSENSE), ST##_CHAIN_POS)
#define __TMC_SPI_DEFINE_TMC2240(IC, ST, L, LI, AI) TMCMarlin<IC##Stepper, L, LI, AI> 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<IC##Stepper, L, AI> 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<char AXIS_LETTER, char DRIVER_ID, AxisEnum AXIS_ID>
void tmc_init(TMCMarlin<TMC2130Stepper, AXIS_LETTER, DRIVER_ID, AXIS_ID> &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<TMC2130Stepper, AXIS_LETTER, DRIVER_ID, AXIS_ID> &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<char AXIS_LETTER, char DRIVER_ID, AxisEnum AXIS_ID>
void tmc_init(TMCMarlin<TMC2160Stepper, AXIS_LETTER, DRIVER_ID, AXIS_ID> &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<TMC2160Stepper, AXIS_LETTER, DRIVER_ID, AXIS_ID> &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<char AXIS_LETTER, char DRIVER_ID, AxisEnum AXIS_ID>
void tmc_init(TMCMarlin<TMC2208Stepper, AXIS_LETTER, DRIVER_ID, AXIS_ID> &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<TMC2208Stepper, AXIS_LETTER, DRIVER_ID, AXIS_ID> &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<char AXIS_LETTER, char DRIVER_ID, AxisEnum AXIS_ID>
void tmc_init(TMCMarlin<TMC2209Stepper, AXIS_LETTER, DRIVER_ID, AXIS_ID> &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<TMC2209Stepper, AXIS_LETTER, DRIVER_ID, AXIS_ID> &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<char AXIS_LETTER, char DRIVER_ID, AxisEnum AXIS_ID>
void tmc_init(TMCMarlin<TMC2240Stepper, AXIS_LETTER, DRIVER_ID, AXIS_ID> &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<char AXIS_LETTER, char DRIVER_ID, AxisEnum AXIS_ID>
void tmc_init(TMCMarlin<TMC2660Stepper, AXIS_LETTER, DRIVER_ID, AXIS_ID> &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<TMC2660Stepper, AXIS_LETTER, DRIVER_ID, AXIS_ID> &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<char AXIS_LETTER, char DRIVER_ID, AxisEnum AXIS_ID>
void tmc_init(TMCMarlin<TMC5130Stepper, AXIS_LETTER, DRIVER_ID, AXIS_ID> &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<TMC5130Stepper, AXIS_LETTER, DRIVER_ID, AXIS_ID> &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<char AXIS_LETTER, char DRIVER_ID, AxisEnum AXIS_ID>
void tmc_init(TMCMarlin<TMC5160Stepper, AXIS_LETTER, DRIVER_ID, AXIS_ID> &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<TMC5160Stepper, AXIS_LETTER, DRIVER_ID, AXIS_ID> &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
+1
View File
@@ -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
+4
View File
@@ -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);
}
+1 -1
View File
@@ -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) \
+9 -62
View File
@@ -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
+6 -53
View File
@@ -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)
+6 -35
View File
@@ -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)
+6 -35
View File
@@ -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)
-51
View File
@@ -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

Some files were not shown because too many files have changed in this diff Show More