Merge branch 'bugfix-2.1.x' into pr/26944
This commit is contained in:
@@ -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 }}
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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) {
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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
@@ -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); }
|
||||
|
||||
@@ -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))
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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(),
|
||||
|
||||
@@ -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(' '); }
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
*
|
||||
|
||||
@@ -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
|
||||
*/
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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?)"
|
||||
|
||||
@@ -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
|
||||
|
||||
/**
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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ü");
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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ü>");
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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("Главное меню");
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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("Основне меню");
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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]);
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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
@@ -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:
|
||||
|
||||
/**
|
||||
|
||||
@@ -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());
|
||||
|
||||
|
||||
@@ -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
@@ -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
@@ -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;
|
||||
// α=1−exp(−dt/τ)
|
||||
extruder_advance_alpha[e] = 1.0f - expf(-(SMOOTH_LIN_ADV_INTERVAL) * (SMOOTH_LIN_ADV_EXP_ORDER) / extruder_advance_tau_ticks[e]);
|
||||
const float alpha_float = 1.0f - expf(-float(SMOOTH_LIN_ADV_INTERVAL) * (SMOOTH_LIN_ADV_EXP_ORDER) / extruder_advance_tau_ticks[i]);
|
||||
extruder_advance_alpha_q30[i] = int32_t(alpha_float * _BV32(30));
|
||||
}
|
||||
static float get_advance_tau(const uint8_t e=active_extruder) {
|
||||
return extruder_advance_tau[E_INDEX_N(e)];
|
||||
}
|
||||
static float get_advance_tau(const uint8_t e=E_INDEX_N(active_extruder)) { return extruder_advance_tau[e]; }
|
||||
#endif
|
||||
|
||||
private:
|
||||
@@ -449,12 +464,11 @@ class Stepper {
|
||||
static hal_timer_t nextAdvanceISR,
|
||||
la_interval; // Interval between ISR calls for LA
|
||||
#if ENABLED(SMOOTH_LIN_ADVANCE)
|
||||
static uint32_t curr_timer_tick, // Current tick relative to block start
|
||||
curr_step_rate; // Current motion step rate
|
||||
static float extruder_advance_tau[DISTINCT_E], // Smoothing time; also the lookahead time of the smoother
|
||||
extruder_advance_tau_ticks[DISTINCT_E], // Same as extruder_advance_tau but in in stepper timer ticks
|
||||
extruder_advance_alpha[DISTINCT_E]; // The smoothing factor of each stage of the high-order exponential
|
||||
// smoothing filter (calculated from tau)
|
||||
static uint32_t curr_timer_tick, // Current tick relative to block start
|
||||
curr_step_rate; // Current motion step rate
|
||||
static uint32_t extruder_advance_tau_ticks[DISTINCT_E], // Same as extruder_advance_tau but in in stepper timer ticks
|
||||
extruder_advance_alpha_q30[DISTINCT_E]; // The smoothing factor of each stage of the high-order exponential
|
||||
// smoothing filter (calculated from tau)
|
||||
#else
|
||||
static int32_t la_delta_error, // Analogue of delta_error.e for E steps in LA ISR
|
||||
la_dividend, // Analogue of advance_dividend.e for E steps in LA ISR
|
||||
@@ -463,10 +477,9 @@ class Stepper {
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if ENABLED(NONLINEAR_EXTRUSION)
|
||||
#if NONLINEAR_EXTRUSION_Q24
|
||||
static int32_t ne_edividend;
|
||||
static uint32_t ne_scale;
|
||||
static ne_fix_t ne_fix;
|
||||
static uint32_t ne_scale_q24;
|
||||
#endif
|
||||
|
||||
#if ENABLED(BABYSTEPPING)
|
||||
@@ -527,7 +540,7 @@ class Stepper {
|
||||
// The Linear advance ISR phase
|
||||
static void advance_isr();
|
||||
#if ENABLED(SMOOTH_LIN_ADVANCE)
|
||||
static void set_la_interval(const int32_t rate);
|
||||
static void set_la_interval(int32_t step_rate);
|
||||
static hal_timer_t smooth_lin_adv_isr();
|
||||
#endif
|
||||
#endif
|
||||
@@ -734,8 +747,10 @@ class Stepper {
|
||||
// Evaluate axis motions and set bits in axis_did_move
|
||||
static void set_axis_moved_for_current_block();
|
||||
|
||||
#if ENABLED(NONLINEAR_EXTRUSION)
|
||||
static void calc_nonlinear_e(uint32_t step_rate);
|
||||
#if NONLINEAR_EXTRUSION_Q24
|
||||
static void calc_nonlinear_e(const uint32_t step_rate);
|
||||
#else
|
||||
static void calc_nonlinear_e(const uint32_t) {}
|
||||
#endif
|
||||
|
||||
#if ENABLED(S_CURVE_ACCELERATION)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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) \
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user