diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h
index dfa1ef79d6..b3ca349b67 100644
--- a/Marlin/Configuration.h
+++ b/Marlin/Configuration.h
@@ -25,7 +25,7 @@
//#define X_2208
//#define X_Spreadcycle
-//#define Y_2208
+//#define Y_2208 // Highly recommended as large prints with high mass can cause layer shifts with stealthchop at high speed
//#define Y_Spreadcycle
//#define Z_2208 // NOT Recommended! Dual stepper current draw is above the recommended limit for this driver
//#define Y_Spreadcycle
@@ -1055,7 +1055,11 @@
#define FILAMENT_RUNOUT_SENSOR
#endif
#if ENABLED(FILAMENT_RUNOUT_SENSOR)
+ #if ENABLED(TREX3)
+ #define NUM_RUNOUT_SENSORS 2
+ #else
#define NUM_RUNOUT_SENSORS 1 // Number of sensors, up to one per extruder. Define a FIL_RUNOUT#_PIN for each.
+ #endif
#define FIL_RUNOUT_INVERTING true // set to true to invert the logic of the sensor.
#define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins.
//#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins.
diff --git a/Marlin/src/HAL/HAL_AVR/persistent_store_eeprom.cpp b/Marlin/src/HAL/HAL_AVR/persistent_store_eeprom.cpp
index 1593b1829c..c129226bb0 100644
--- a/Marlin/src/HAL/HAL_AVR/persistent_store_eeprom.cpp
+++ b/Marlin/src/HAL/HAL_AVR/persistent_store_eeprom.cpp
@@ -53,7 +53,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui
bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing/*=true*/) {
do {
- uint8_t c = eeprom_read_byte((unsigned char*)pos);
+ uint8_t c = eeprom_read_byte((uint8_t*)pos);
if (writing) *value = c;
crc16(crc, &c, 1);
pos++;
diff --git a/Marlin/src/HAL/HAL_DUE/HAL.h b/Marlin/src/HAL/HAL_DUE/HAL.h
index 8e7b4490d3..6c872026dc 100644
--- a/Marlin/src/HAL/HAL_DUE/HAL.h
+++ b/Marlin/src/HAL/HAL_DUE/HAL.h
@@ -124,8 +124,8 @@ uint8_t spiRec(uint32_t chan);
//
// EEPROM
//
-void eeprom_write_byte(unsigned char *pos, unsigned char value);
-unsigned char eeprom_read_byte(unsigned char *pos);
+void eeprom_write_byte(uint8_t *pos, unsigned char value);
+uint8_t eeprom_read_byte(uint8_t *pos);
void eeprom_read_block (void *__dst, const void *__src, size_t __n);
void eeprom_update_block (const void *__src, void *__dst, size_t __n);
diff --git a/Marlin/src/HAL/HAL_DUE/persistent_store_eeprom.cpp b/Marlin/src/HAL/HAL_DUE/persistent_store_eeprom.cpp
index fa611111d0..e7ff4f9c81 100644
--- a/Marlin/src/HAL/HAL_DUE/persistent_store_eeprom.cpp
+++ b/Marlin/src/HAL/HAL_DUE/persistent_store_eeprom.cpp
@@ -67,7 +67,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui
bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing/*=true*/) {
do {
- uint8_t c = eeprom_read_byte((unsigned char*)pos);
+ uint8_t c = eeprom_read_byte((uint8_t*)pos);
if (writing) *value = c;
crc16(crc, &c, 1);
pos++;
diff --git a/Marlin/src/HAL/HAL_DUE/spi_pins.h b/Marlin/src/HAL/HAL_DUE/spi_pins.h
index d0eb711df2..ee80cb3883 100644
--- a/Marlin/src/HAL/HAL_DUE/spi_pins.h
+++ b/Marlin/src/HAL/HAL_DUE/spi_pins.h
@@ -48,9 +48,15 @@
#else
// defaults
#define DUE_SOFTWARE_SPI
- #define SCK_PIN 52
- #define MISO_PIN 50
- #define MOSI_PIN 51
+ #ifndef SCK_PIN
+ #define SCK_PIN 52
+ #endif
+ #ifndef MISO_PIN
+ #define MISO_PIN 50
+ #endif
+ #ifndef MOSI_PIN
+ #define MOSI_PIN 51
+ #endif
#endif
/* A.28, A.29, B.21, C.26, C.29 */
diff --git a/Marlin/src/HAL/HAL_ESP32/HAL.h b/Marlin/src/HAL/HAL_ESP32/HAL.h
index 106299295a..7921f9bf5f 100644
--- a/Marlin/src/HAL/HAL_ESP32/HAL.h
+++ b/Marlin/src/HAL/HAL_ESP32/HAL.h
@@ -98,8 +98,8 @@ int freeMemory(void);
void analogWrite(int pin, int value);
// EEPROM
-void eeprom_write_byte(unsigned char *pos, unsigned char value);
-unsigned char eeprom_read_byte(unsigned char *pos);
+void eeprom_write_byte(uint8_t *pos, unsigned char value);
+uint8_t eeprom_read_byte(uint8_t *pos);
void eeprom_read_block (void *__dst, const void *__src, size_t __n);
void eeprom_update_block (const void *__src, void *__dst, size_t __n);
diff --git a/Marlin/src/HAL/HAL_LPC1768/arduino.cpp b/Marlin/src/HAL/HAL_LPC1768/arduino.cpp
index 92efd3495a..e7a3d5e8f4 100644
--- a/Marlin/src/HAL/HAL_LPC1768/arduino.cpp
+++ b/Marlin/src/HAL/HAL_LPC1768/arduino.cpp
@@ -143,11 +143,11 @@ uint16_t analogRead(pin_t adc_pin) {
// Persistent Config Storage
// **************************
-void eeprom_write_byte(unsigned char *pos, unsigned char value) {
+void eeprom_write_byte(uint8_t *pos, unsigned char value) {
}
-unsigned char eeprom_read_byte(uint8_t * pos) { return '\0'; }
+uint8_t eeprom_read_byte(uint8_t * pos) { return '\0'; }
void eeprom_read_block(void *__dst, const void *__src, size_t __n) { }
diff --git a/Marlin/src/HAL/HAL_LPC1768/include/Arduino.h b/Marlin/src/HAL/HAL_LPC1768/include/Arduino.h
index aebc76a6ea..63502ad710 100644
--- a/Marlin/src/HAL/HAL_LPC1768/include/Arduino.h
+++ b/Marlin/src/HAL/HAL_LPC1768/include/Arduino.h
@@ -109,8 +109,8 @@ void analogWrite(pin_t, int);
uint16_t analogRead(pin_t);
// EEPROM
-void eeprom_write_byte(unsigned char *pos, unsigned char value);
-unsigned char eeprom_read_byte(unsigned char *pos);
+void eeprom_write_byte(uint8_t *pos, unsigned char value);
+uint8_t eeprom_read_byte(uint8_t *pos);
void eeprom_read_block (void *__dst, const void *__src, size_t __n);
void eeprom_update_block (const void *__src, void *__dst, size_t __n);
diff --git a/Marlin/src/HAL/HAL_STM32/HAL.h b/Marlin/src/HAL/HAL_STM32/HAL.h
index 29a0947fdb..7d789d7418 100644
--- a/Marlin/src/HAL/HAL_STM32/HAL.h
+++ b/Marlin/src/HAL/HAL_STM32/HAL.h
@@ -196,8 +196,8 @@ uint8_t spiRec(uint32_t chan);
/**
* Wire library should work for i2c eeproms.
*/
-void eeprom_write_byte(unsigned char *pos, unsigned char value);
-unsigned char eeprom_read_byte(unsigned char *pos);
+void eeprom_write_byte(uint8_t *pos, unsigned char value);
+uint8_t eeprom_read_byte(uint8_t *pos);
void eeprom_read_block (void *__dst, const void *__src, size_t __n);
void eeprom_update_block (const void *__src, void *__dst, size_t __n);
diff --git a/Marlin/src/HAL/HAL_STM32/persistent_store_impl.cpp b/Marlin/src/HAL/HAL_STM32/persistent_store_impl.cpp
index 313edf2735..b89e29ae99 100644
--- a/Marlin/src/HAL/HAL_STM32/persistent_store_impl.cpp
+++ b/Marlin/src/HAL/HAL_STM32/persistent_store_impl.cpp
@@ -79,7 +79,7 @@ bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t
#if DISABLED(EEPROM_EMULATED_WITH_SRAM)
eeprom_buffered_read_byte(pos)
#else
- (*(__IO uint8_t *)(BKPSRAM_BASE + ((unsigned char*)pos)))
+ (*(__IO uint8_t *)(BKPSRAM_BASE + ((uint8_t*)pos)))
#endif
);
diff --git a/Marlin/src/HAL/HAL_STM32F1/HAL.h b/Marlin/src/HAL/HAL_STM32F1/HAL.h
index 81d08d5278..9faf200fbc 100644
--- a/Marlin/src/HAL/HAL_STM32F1/HAL.h
+++ b/Marlin/src/HAL/HAL_STM32F1/HAL.h
@@ -212,8 +212,8 @@ uint8_t spiRec(uint32_t chan);
* TODO: Write all this eeprom stuff. Can emulate eeprom in flash as last resort.
* Wire library should work for i2c eeproms.
*/
-void eeprom_write_byte(unsigned char *pos, unsigned char value);
-unsigned char eeprom_read_byte(unsigned char *pos);
+void eeprom_write_byte(uint8_t *pos, unsigned char value);
+uint8_t eeprom_read_byte(uint8_t *pos);
void eeprom_read_block (void *__dst, const void *__src, size_t __n);
void eeprom_update_block (const void *__src, void *__dst, size_t __n);
diff --git a/Marlin/src/HAL/HAL_STM32F4/EmulatedEeprom.cpp b/Marlin/src/HAL/HAL_STM32F4/EmulatedEeprom.cpp
index 19853171fe..4820bd6abd 100644
--- a/Marlin/src/HAL/HAL_STM32F4/EmulatedEeprom.cpp
+++ b/Marlin/src/HAL/HAL_STM32F4/EmulatedEeprom.cpp
@@ -96,7 +96,7 @@ void eeprom_init() {
}
}
-void eeprom_write_byte(unsigned char *pos, unsigned char value) {
+void eeprom_write_byte(uint8_t *pos, unsigned char value) {
uint16_t eeprom_address = (unsigned) pos;
eeprom_init();
@@ -110,7 +110,7 @@ void eeprom_write_byte(unsigned char *pos, unsigned char value) {
HAL_FLASH_Lock();
}
-unsigned char eeprom_read_byte(unsigned char *pos) {
+uint8_t eeprom_read_byte(uint8_t *pos) {
uint16_t data = 0xFF;
uint16_t eeprom_address = (unsigned)pos;
diff --git a/Marlin/src/HAL/HAL_STM32F4/HAL.h b/Marlin/src/HAL/HAL_STM32F4/HAL.h
index b0abf81995..dc6bda473c 100644
--- a/Marlin/src/HAL/HAL_STM32F4/HAL.h
+++ b/Marlin/src/HAL/HAL_STM32F4/HAL.h
@@ -212,8 +212,8 @@ uint8_t spiRec(uint32_t chan);
* TODO: Write all this eeprom stuff. Can emulate eeprom in flash as last resort.
* Wire library should work for i2c eeproms.
*/
-void eeprom_write_byte(unsigned char *pos, unsigned char value);
-unsigned char eeprom_read_byte(unsigned char *pos);
+void eeprom_write_byte(uint8_t *pos, unsigned char value);
+uint8_t eeprom_read_byte(uint8_t *pos);
void eeprom_read_block (void *__dst, const void *__src, size_t __n);
void eeprom_update_block (const void *__src, void *__dst, size_t __n);
diff --git a/Marlin/src/HAL/HAL_STM32F4/persistent_store_eeprom.cpp b/Marlin/src/HAL/HAL_STM32F4/persistent_store_eeprom.cpp
index 194cd21bc6..576ecc6dea 100644
--- a/Marlin/src/HAL/HAL_STM32F4/persistent_store_eeprom.cpp
+++ b/Marlin/src/HAL/HAL_STM32F4/persistent_store_eeprom.cpp
@@ -55,7 +55,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui
bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing) {
do {
- uint8_t c = eeprom_read_byte((unsigned char*)pos);
+ uint8_t c = eeprom_read_byte((uint8_t*)pos);
if (writing) *value = c;
crc16(crc, &c, 1);
pos++;
diff --git a/Marlin/src/HAL/HAL_STM32F7/EmulatedEeprom.cpp b/Marlin/src/HAL/HAL_STM32F7/EmulatedEeprom.cpp
index 0a7f5193f0..a0a00dd4dc 100644
--- a/Marlin/src/HAL/HAL_STM32F7/EmulatedEeprom.cpp
+++ b/Marlin/src/HAL/HAL_STM32F7/EmulatedEeprom.cpp
@@ -94,7 +94,7 @@ void eeprom_init() {
}
}
-void eeprom_write_byte(unsigned char *pos, unsigned char value) {
+void eeprom_write_byte(uint8_t *pos, unsigned char value) {
uint16_t eeprom_address = (unsigned) pos;
eeprom_init();
@@ -108,7 +108,7 @@ void eeprom_write_byte(unsigned char *pos, unsigned char value) {
HAL_FLASH_Lock();
}
-unsigned char eeprom_read_byte(unsigned char *pos) {
+uint8_t eeprom_read_byte(uint8_t *pos) {
uint16_t data = 0xFF;
uint16_t eeprom_address = (unsigned)pos;
diff --git a/Marlin/src/HAL/HAL_STM32F7/HAL.h b/Marlin/src/HAL/HAL_STM32F7/HAL.h
index 2eb8f89b79..c911ff07f7 100644
--- a/Marlin/src/HAL/HAL_STM32F7/HAL.h
+++ b/Marlin/src/HAL/HAL_STM32F7/HAL.h
@@ -200,8 +200,8 @@ uint8_t spiRec(uint32_t chan);
* TODO: Write all this eeprom stuff. Can emulate eeprom in flash as last resort.
* Wire library should work for i2c eeproms.
*/
-void eeprom_write_byte(unsigned char *pos, unsigned char value);
-unsigned char eeprom_read_byte(unsigned char *pos);
+void eeprom_write_byte(uint8_t *pos, unsigned char value);
+uint8_t eeprom_read_byte(uint8_t *pos);
void eeprom_read_block (void *__dst, const void *__src, size_t __n);
void eeprom_update_block (const void *__src, void *__dst, size_t __n);
diff --git a/Marlin/src/HAL/HAL_STM32F7/persistent_store_eeprom.cpp b/Marlin/src/HAL/HAL_STM32F7/persistent_store_eeprom.cpp
index bd08ad7f0b..50bf09a9a3 100644
--- a/Marlin/src/HAL/HAL_STM32F7/persistent_store_eeprom.cpp
+++ b/Marlin/src/HAL/HAL_STM32F7/persistent_store_eeprom.cpp
@@ -55,7 +55,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui
bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc) {
do {
- uint8_t c = eeprom_read_byte((unsigned char*)pos);
+ uint8_t c = eeprom_read_byte((uint8_t*)pos);
*value = c;
crc16(crc, &c, 1);
pos++;
diff --git a/Marlin/src/HAL/HAL_TEENSY31_32/persistent_store_impl.cpp b/Marlin/src/HAL/HAL_TEENSY31_32/persistent_store_impl.cpp
index ac59212300..71908bc1cd 100644
--- a/Marlin/src/HAL/HAL_TEENSY31_32/persistent_store_impl.cpp
+++ b/Marlin/src/HAL/HAL_TEENSY31_32/persistent_store_impl.cpp
@@ -35,7 +35,7 @@ bool write_data(int &pos, const uint8_t *value, uint16_t size, uint16_t *crc) {
bool read_data(int &pos, uint8_t* value, uint16_t size, uint16_t *crc, const bool writing/*=true*/) {
do {
- uint8_t c = eeprom_read_byte((unsigned char*)pos);
+ uint8_t c = eeprom_read_byte((uint8_t*)pos);
if (writing) *value = c;
crc16(crc, &c, 1);
pos++;
diff --git a/Marlin/src/HAL/HAL_TEENSY35_36/persistent_store_eeprom.cpp b/Marlin/src/HAL/HAL_TEENSY35_36/persistent_store_eeprom.cpp
index 46e88e04a5..7a1fa0e44c 100644
--- a/Marlin/src/HAL/HAL_TEENSY35_36/persistent_store_eeprom.cpp
+++ b/Marlin/src/HAL/HAL_TEENSY35_36/persistent_store_eeprom.cpp
@@ -56,7 +56,7 @@ bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, ui
bool PersistentStore::read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing/*=true*/) {
do {
- uint8_t c = eeprom_read_byte((unsigned char*)pos);
+ uint8_t c = eeprom_read_byte((uint8_t*)pos);
if (writing) *value = c;
crc16(crc, &c, 1);
pos++;
diff --git a/Marlin/src/HAL/HAL_TEENSY35_36/persistent_store_impl.cpp b/Marlin/src/HAL/HAL_TEENSY35_36/persistent_store_impl.cpp
index 009cdaa504..c0c9dc2684 100644
--- a/Marlin/src/HAL/HAL_TEENSY35_36/persistent_store_impl.cpp
+++ b/Marlin/src/HAL/HAL_TEENSY35_36/persistent_store_impl.cpp
@@ -35,7 +35,7 @@ bool write_data(int &pos, const uint8_t *value, uint16_t size, uint16_t *crc) {
bool read_data(int &pos, uint8_t* value, uint16_t size, uint16_t *crc, const bool writing/*=true*/) {
do {
- uint8_t c = eeprom_read_byte((unsigned char*)pos);
+ uint8_t c = eeprom_read_byte((uint8_t*)pos);
if (writing) *value = c;
crc16(crc, &c, 1);
pos++;
diff --git a/Marlin/src/HAL/shared/I2cEeprom.cpp b/Marlin/src/HAL/shared/I2cEeprom.cpp
index a73cefa2d3..91b9d4626f 100644
--- a/Marlin/src/HAL/shared/I2cEeprom.cpp
+++ b/Marlin/src/HAL/shared/I2cEeprom.cpp
@@ -82,7 +82,7 @@ static void eeprom_init(void) {
}
}
-void eeprom_write_byte(unsigned char *pos, unsigned char value) {
+void eeprom_write_byte(uint8_t *pos, unsigned char value) {
unsigned eeprom_address = (unsigned) pos;
eeprom_init();
@@ -128,7 +128,7 @@ void eeprom_update_block(const void *pos, void* eeprom_address, size_t n) {
}
-unsigned char eeprom_read_byte(unsigned char *pos) {
+uint8_t eeprom_read_byte(uint8_t *pos) {
byte data = 0xFF;
unsigned eeprom_address = (unsigned)pos;
diff --git a/Marlin/src/Marlin.cpp b/Marlin/src/Marlin.cpp
index dbeb4e2939..a78cdf2a6e 100644
--- a/Marlin/src/Marlin.cpp
+++ b/Marlin/src/Marlin.cpp
@@ -152,6 +152,10 @@
#include "feature/controllerfan.h"
#endif
+#if ENABLED(EXTENSIBLE_UI)
+ #include "lcd/extensible_ui/ui_api.h"
+#endif
+
bool Running = true;
/**
@@ -255,6 +259,9 @@ void setup_powerhold() {
/**
* Sensitive pin test for M42, M226
*/
+
+#include "pins/sensitive_pins.h"
+
bool pin_is_protected(const pin_t pin) {
static const pin_t sensitive_pins[] PROGMEM = SENSITIVE_PINS;
for (uint8_t i = 0; i < COUNT(sensitive_pins); i++) {
@@ -609,7 +616,9 @@ void kill(PGM_P lcd_msg) {
thermalManager.disable_all_heaters();
disable_all_steppers();
- #if ENABLED(ULTRA_LCD)
+ #if ENABLED(EXTENSIBLE_UI)
+ UI::onPrinterKilled(lcd_msg);
+ #elif ENABLED(ULTRA_LCD)
kill_screen(lcd_msg);
#else
UNUSED(lcd_msg);
@@ -958,7 +967,7 @@ void loop() {
card.checkautostart();
#endif
- #if ENABLED(SDSUPPORT) && ENABLED(ULTIPANEL)
+ #if ENABLED(SDSUPPORT) && (ENABLED(ULTIPANEL) || ENABLED(EXTENSIBLE_UI))
if (abort_sd_printing) {
abort_sd_printing = false;
card.stopSDPrint(
@@ -978,7 +987,7 @@ void loop() {
card.removeJobRecoveryFile();
#endif
}
- #endif // SDSUPPORT && ULTIPANEL
+ #endif // SDSUPPORT && (ENABLED(ULTIPANEL) || ENABLED(EXTENSIBLE_UI))
if (commands_in_queue < BUFSIZE) get_available_commands();
advance_command_queue();
diff --git a/Marlin/src/config/default/Configuration.h b/Marlin/src/config/default/Configuration.h
index 4028c70c0f..3b92bd7452 100644
--- a/Marlin/src/config/default/Configuration.h
+++ b/Marlin/src/config/default/Configuration.h
@@ -156,13 +156,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -1838,6 +1839,15 @@
//
//#define SILVER_GATE_GLCD_CONTROLLER
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/default/Configuration_adv.h b/Marlin/src/config/default/Configuration_adv.h
index dbabe09ee7..8ac532d317 100644
--- a/Marlin/src/config/default/Configuration_adv.h
+++ b/Marlin/src/config/default/Configuration_adv.h
@@ -701,6 +701,22 @@
#define USB_INTR_PIN SD_DETECT_PIN
#endif
+ /**
+ * When using a bootloader that supports SD-Firmware-Flashing,
+ * add a menu item to activate SD-FW-Update on the next reboot.
+ *
+ * Requires ATMEGA2560 (Arduino Mega)
+ *
+ * Tested with this bootloader:
+ * https://github.com/FleetProbe/MicroBridge-Arduino-ATMega2560
+ */
+ //#define SD_FIRMWARE_UPDATE
+ #if ENABLED(SD_FIRMWARE_UPDATE)
+ #define SD_FIRMWARE_UPDATE_EEPROM_ADDR 0x1FF
+ #define SD_FIRMWARE_UPDATE_ACTIVE_VALUE 0xF0
+ #define SD_FIRMWARE_UPDATE_INACTIVE_VALUE 0xFF
+ #endif
+
#endif // SDSUPPORT
/**
diff --git a/Marlin/src/config/examples/AlephObjects/TAZ4/Configuration.h b/Marlin/src/config/examples/AlephObjects/TAZ4/Configuration.h
index c167a48ae2..0e2ec0d1cc 100644
--- a/Marlin/src/config/examples/AlephObjects/TAZ4/Configuration.h
+++ b/Marlin/src/config/examples/AlephObjects/TAZ4/Configuration.h
@@ -156,13 +156,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -1858,6 +1859,15 @@
//
//#define SILVER_GATE_GLCD_CONTROLLER
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/examples/AlephObjects/TAZ4/Configuration_adv.h b/Marlin/src/config/examples/AlephObjects/TAZ4/Configuration_adv.h
index b5e1162f59..5029d6bd50 100644
--- a/Marlin/src/config/examples/AlephObjects/TAZ4/Configuration_adv.h
+++ b/Marlin/src/config/examples/AlephObjects/TAZ4/Configuration_adv.h
@@ -701,6 +701,22 @@
#define USB_INTR_PIN SD_DETECT_PIN
#endif
+ /**
+ * When using a bootloader that supports SD-Firmware-Flashing,
+ * add a menu item to activate SD-FW-Update on the next reboot.
+ *
+ * Requires ATMEGA2560 (Arduino Mega)
+ *
+ * Tested with this bootloader:
+ * https://github.com/FleetProbe/MicroBridge-Arduino-ATMega2560
+ */
+ //#define SD_FIRMWARE_UPDATE
+ #if ENABLED(SD_FIRMWARE_UPDATE)
+ #define SD_FIRMWARE_UPDATE_EEPROM_ADDR 0x1FF
+ #define SD_FIRMWARE_UPDATE_ACTIVE_VALUE 0xF0
+ #define SD_FIRMWARE_UPDATE_INACTIVE_VALUE 0xFF
+ #endif
+
#endif // SDSUPPORT
/**
diff --git a/Marlin/src/config/examples/AliExpress/CL-260/Configuration.h b/Marlin/src/config/examples/AliExpress/CL-260/Configuration.h
index 85d54f5408..1f79147ed9 100644
--- a/Marlin/src/config/examples/AliExpress/CL-260/Configuration.h
+++ b/Marlin/src/config/examples/AliExpress/CL-260/Configuration.h
@@ -156,13 +156,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -1838,6 +1839,15 @@
//
//#define SILVER_GATE_GLCD_CONTROLLER
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/examples/Anet/A2/Configuration.h b/Marlin/src/config/examples/Anet/A2/Configuration.h
index 01ae5a7ba6..97faf5b2c5 100644
--- a/Marlin/src/config/examples/Anet/A2/Configuration.h
+++ b/Marlin/src/config/examples/Anet/A2/Configuration.h
@@ -156,13 +156,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -1840,6 +1841,15 @@
//
//#define SILVER_GATE_GLCD_CONTROLLER
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/examples/Anet/A2/Configuration_adv.h b/Marlin/src/config/examples/Anet/A2/Configuration_adv.h
index f8cf0324d5..2b4a860970 100644
--- a/Marlin/src/config/examples/Anet/A2/Configuration_adv.h
+++ b/Marlin/src/config/examples/Anet/A2/Configuration_adv.h
@@ -701,6 +701,22 @@
#define USB_INTR_PIN SD_DETECT_PIN
#endif
+ /**
+ * When using a bootloader that supports SD-Firmware-Flashing,
+ * add a menu item to activate SD-FW-Update on the next reboot.
+ *
+ * Requires ATMEGA2560 (Arduino Mega)
+ *
+ * Tested with this bootloader:
+ * https://github.com/FleetProbe/MicroBridge-Arduino-ATMega2560
+ */
+ //#define SD_FIRMWARE_UPDATE
+ #if ENABLED(SD_FIRMWARE_UPDATE)
+ #define SD_FIRMWARE_UPDATE_EEPROM_ADDR 0x1FF
+ #define SD_FIRMWARE_UPDATE_ACTIVE_VALUE 0xF0
+ #define SD_FIRMWARE_UPDATE_INACTIVE_VALUE 0xFF
+ #endif
+
#endif // SDSUPPORT
/**
diff --git a/Marlin/src/config/examples/Anet/A2plus/Configuration.h b/Marlin/src/config/examples/Anet/A2plus/Configuration.h
index 16c867f970..65d9243cf8 100644
--- a/Marlin/src/config/examples/Anet/A2plus/Configuration.h
+++ b/Marlin/src/config/examples/Anet/A2plus/Configuration.h
@@ -156,13 +156,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -1840,6 +1841,15 @@
//
//#define SILVER_GATE_GLCD_CONTROLLER
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/examples/Anet/A2plus/Configuration_adv.h b/Marlin/src/config/examples/Anet/A2plus/Configuration_adv.h
index f8cf0324d5..2b4a860970 100644
--- a/Marlin/src/config/examples/Anet/A2plus/Configuration_adv.h
+++ b/Marlin/src/config/examples/Anet/A2plus/Configuration_adv.h
@@ -701,6 +701,22 @@
#define USB_INTR_PIN SD_DETECT_PIN
#endif
+ /**
+ * When using a bootloader that supports SD-Firmware-Flashing,
+ * add a menu item to activate SD-FW-Update on the next reboot.
+ *
+ * Requires ATMEGA2560 (Arduino Mega)
+ *
+ * Tested with this bootloader:
+ * https://github.com/FleetProbe/MicroBridge-Arduino-ATMega2560
+ */
+ //#define SD_FIRMWARE_UPDATE
+ #if ENABLED(SD_FIRMWARE_UPDATE)
+ #define SD_FIRMWARE_UPDATE_EEPROM_ADDR 0x1FF
+ #define SD_FIRMWARE_UPDATE_ACTIVE_VALUE 0xF0
+ #define SD_FIRMWARE_UPDATE_INACTIVE_VALUE 0xFF
+ #endif
+
#endif // SDSUPPORT
/**
diff --git a/Marlin/src/config/examples/Anet/A6/Configuration.h b/Marlin/src/config/examples/Anet/A6/Configuration.h
index 78180eb2cc..a83da6e7a1 100644
--- a/Marlin/src/config/examples/Anet/A6/Configuration.h
+++ b/Marlin/src/config/examples/Anet/A6/Configuration.h
@@ -156,13 +156,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -1993,6 +1994,15 @@
//
//#define SILVER_GATE_GLCD_CONTROLLER
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/examples/Anet/A6/Configuration_adv.h b/Marlin/src/config/examples/Anet/A6/Configuration_adv.h
index 58d55c5540..8dcad0400e 100644
--- a/Marlin/src/config/examples/Anet/A6/Configuration_adv.h
+++ b/Marlin/src/config/examples/Anet/A6/Configuration_adv.h
@@ -701,6 +701,22 @@
#define USB_INTR_PIN SD_DETECT_PIN
#endif
+ /**
+ * When using a bootloader that supports SD-Firmware-Flashing,
+ * add a menu item to activate SD-FW-Update on the next reboot.
+ *
+ * Requires ATMEGA2560 (Arduino Mega)
+ *
+ * Tested with this bootloader:
+ * https://github.com/FleetProbe/MicroBridge-Arduino-ATMega2560
+ */
+ //#define SD_FIRMWARE_UPDATE
+ #if ENABLED(SD_FIRMWARE_UPDATE)
+ #define SD_FIRMWARE_UPDATE_EEPROM_ADDR 0x1FF
+ #define SD_FIRMWARE_UPDATE_ACTIVE_VALUE 0xF0
+ #define SD_FIRMWARE_UPDATE_INACTIVE_VALUE 0xFF
+ #endif
+
#endif // SDSUPPORT
/**
diff --git a/Marlin/src/config/examples/Anet/A8/Configuration.h b/Marlin/src/config/examples/Anet/A8/Configuration.h
index f7fcc05e5f..21bb36f949 100644
--- a/Marlin/src/config/examples/Anet/A8/Configuration.h
+++ b/Marlin/src/config/examples/Anet/A8/Configuration.h
@@ -157,13 +157,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -1847,6 +1848,15 @@
//
//#define SILVER_GATE_GLCD_CONTROLLER
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/examples/Anet/A8/Configuration_adv.h b/Marlin/src/config/examples/Anet/A8/Configuration_adv.h
index 3dec217773..e422387d5c 100644
--- a/Marlin/src/config/examples/Anet/A8/Configuration_adv.h
+++ b/Marlin/src/config/examples/Anet/A8/Configuration_adv.h
@@ -701,6 +701,22 @@
#define USB_INTR_PIN SD_DETECT_PIN
#endif
+ /**
+ * When using a bootloader that supports SD-Firmware-Flashing,
+ * add a menu item to activate SD-FW-Update on the next reboot.
+ *
+ * Requires ATMEGA2560 (Arduino Mega)
+ *
+ * Tested with this bootloader:
+ * https://github.com/FleetProbe/MicroBridge-Arduino-ATMega2560
+ */
+ //#define SD_FIRMWARE_UPDATE
+ #if ENABLED(SD_FIRMWARE_UPDATE)
+ #define SD_FIRMWARE_UPDATE_EEPROM_ADDR 0x1FF
+ #define SD_FIRMWARE_UPDATE_ACTIVE_VALUE 0xF0
+ #define SD_FIRMWARE_UPDATE_INACTIVE_VALUE 0xFF
+ #endif
+
#endif // SDSUPPORT
/**
diff --git a/Marlin/src/config/examples/Azteeg/X5GT/Configuration.h b/Marlin/src/config/examples/Azteeg/X5GT/Configuration.h
index 1429222f94..86d2c9d045 100644
--- a/Marlin/src/config/examples/Azteeg/X5GT/Configuration.h
+++ b/Marlin/src/config/examples/Azteeg/X5GT/Configuration.h
@@ -156,13 +156,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -1838,6 +1839,15 @@
//
//#define SILVER_GATE_GLCD_CONTROLLER
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/examples/BIBO/TouchX/cyclops/Configuration.h b/Marlin/src/config/examples/BIBO/TouchX/cyclops/Configuration.h
index 88b0693c31..0961057549 100644
--- a/Marlin/src/config/examples/BIBO/TouchX/cyclops/Configuration.h
+++ b/Marlin/src/config/examples/BIBO/TouchX/cyclops/Configuration.h
@@ -156,13 +156,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -1838,6 +1839,15 @@
//
//#define SILVER_GATE_GLCD_CONTROLLER
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/examples/BIBO/TouchX/cyclops/Configuration_adv.h b/Marlin/src/config/examples/BIBO/TouchX/cyclops/Configuration_adv.h
index c015c8bcff..41c7058aaf 100644
--- a/Marlin/src/config/examples/BIBO/TouchX/cyclops/Configuration_adv.h
+++ b/Marlin/src/config/examples/BIBO/TouchX/cyclops/Configuration_adv.h
@@ -701,6 +701,22 @@
#define USB_INTR_PIN SD_DETECT_PIN
#endif
+ /**
+ * When using a bootloader that supports SD-Firmware-Flashing,
+ * add a menu item to activate SD-FW-Update on the next reboot.
+ *
+ * Requires ATMEGA2560 (Arduino Mega)
+ *
+ * Tested with this bootloader:
+ * https://github.com/FleetProbe/MicroBridge-Arduino-ATMega2560
+ */
+ //#define SD_FIRMWARE_UPDATE
+ #if ENABLED(SD_FIRMWARE_UPDATE)
+ #define SD_FIRMWARE_UPDATE_EEPROM_ADDR 0x1FF
+ #define SD_FIRMWARE_UPDATE_ACTIVE_VALUE 0xF0
+ #define SD_FIRMWARE_UPDATE_INACTIVE_VALUE 0xFF
+ #endif
+
#endif // SDSUPPORT
/**
diff --git a/Marlin/src/config/examples/BIBO/TouchX/default/Configuration.h b/Marlin/src/config/examples/BIBO/TouchX/default/Configuration.h
index 8e704dc859..2c5cc0b77d 100644
--- a/Marlin/src/config/examples/BIBO/TouchX/default/Configuration.h
+++ b/Marlin/src/config/examples/BIBO/TouchX/default/Configuration.h
@@ -156,13 +156,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -1838,6 +1839,15 @@
//
//#define SILVER_GATE_GLCD_CONTROLLER
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/examples/BIBO/TouchX/default/Configuration_adv.h b/Marlin/src/config/examples/BIBO/TouchX/default/Configuration_adv.h
index 66e7fb097e..974039419e 100644
--- a/Marlin/src/config/examples/BIBO/TouchX/default/Configuration_adv.h
+++ b/Marlin/src/config/examples/BIBO/TouchX/default/Configuration_adv.h
@@ -701,6 +701,22 @@
#define USB_INTR_PIN SD_DETECT_PIN
#endif
+ /**
+ * When using a bootloader that supports SD-Firmware-Flashing,
+ * add a menu item to activate SD-FW-Update on the next reboot.
+ *
+ * Requires ATMEGA2560 (Arduino Mega)
+ *
+ * Tested with this bootloader:
+ * https://github.com/FleetProbe/MicroBridge-Arduino-ATMega2560
+ */
+ //#define SD_FIRMWARE_UPDATE
+ #if ENABLED(SD_FIRMWARE_UPDATE)
+ #define SD_FIRMWARE_UPDATE_EEPROM_ADDR 0x1FF
+ #define SD_FIRMWARE_UPDATE_ACTIVE_VALUE 0xF0
+ #define SD_FIRMWARE_UPDATE_INACTIVE_VALUE 0xFF
+ #endif
+
#endif // SDSUPPORT
/**
diff --git a/Marlin/src/config/examples/BQ/Hephestos/Configuration.h b/Marlin/src/config/examples/BQ/Hephestos/Configuration.h
index fcfe674fb9..f109f715e7 100644
--- a/Marlin/src/config/examples/BQ/Hephestos/Configuration.h
+++ b/Marlin/src/config/examples/BQ/Hephestos/Configuration.h
@@ -156,13 +156,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -1826,6 +1827,15 @@
//
//#define SILVER_GATE_GLCD_CONTROLLER
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/examples/BQ/Hephestos/Configuration_adv.h b/Marlin/src/config/examples/BQ/Hephestos/Configuration_adv.h
index b15b1bad95..2d3b24252a 100644
--- a/Marlin/src/config/examples/BQ/Hephestos/Configuration_adv.h
+++ b/Marlin/src/config/examples/BQ/Hephestos/Configuration_adv.h
@@ -701,6 +701,22 @@
#define USB_INTR_PIN SD_DETECT_PIN
#endif
+ /**
+ * When using a bootloader that supports SD-Firmware-Flashing,
+ * add a menu item to activate SD-FW-Update on the next reboot.
+ *
+ * Requires ATMEGA2560 (Arduino Mega)
+ *
+ * Tested with this bootloader:
+ * https://github.com/FleetProbe/MicroBridge-Arduino-ATMega2560
+ */
+ //#define SD_FIRMWARE_UPDATE
+ #if ENABLED(SD_FIRMWARE_UPDATE)
+ #define SD_FIRMWARE_UPDATE_EEPROM_ADDR 0x1FF
+ #define SD_FIRMWARE_UPDATE_ACTIVE_VALUE 0xF0
+ #define SD_FIRMWARE_UPDATE_INACTIVE_VALUE 0xFF
+ #endif
+
#endif // SDSUPPORT
/**
diff --git a/Marlin/src/config/examples/BQ/Hephestos_2/Configuration.h b/Marlin/src/config/examples/BQ/Hephestos_2/Configuration.h
index 6991954764..f68c7c06e2 100644
--- a/Marlin/src/config/examples/BQ/Hephestos_2/Configuration.h
+++ b/Marlin/src/config/examples/BQ/Hephestos_2/Configuration.h
@@ -164,13 +164,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -1838,6 +1839,15 @@
//
//#define SILVER_GATE_GLCD_CONTROLLER
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/examples/BQ/Hephestos_2/Configuration_adv.h b/Marlin/src/config/examples/BQ/Hephestos_2/Configuration_adv.h
index 4fe6a69f2a..0a4b650376 100644
--- a/Marlin/src/config/examples/BQ/Hephestos_2/Configuration_adv.h
+++ b/Marlin/src/config/examples/BQ/Hephestos_2/Configuration_adv.h
@@ -709,6 +709,22 @@
#define USB_INTR_PIN SD_DETECT_PIN
#endif
+ /**
+ * When using a bootloader that supports SD-Firmware-Flashing,
+ * add a menu item to activate SD-FW-Update on the next reboot.
+ *
+ * Requires ATMEGA2560 (Arduino Mega)
+ *
+ * Tested with this bootloader:
+ * https://github.com/FleetProbe/MicroBridge-Arduino-ATMega2560
+ */
+ //#define SD_FIRMWARE_UPDATE
+ #if ENABLED(SD_FIRMWARE_UPDATE)
+ #define SD_FIRMWARE_UPDATE_EEPROM_ADDR 0x1FF
+ #define SD_FIRMWARE_UPDATE_ACTIVE_VALUE 0xF0
+ #define SD_FIRMWARE_UPDATE_INACTIVE_VALUE 0xFF
+ #endif
+
#endif // SDSUPPORT
/**
diff --git a/Marlin/src/config/examples/BQ/WITBOX/Configuration.h b/Marlin/src/config/examples/BQ/WITBOX/Configuration.h
index 8ff04094e1..12c11b00ce 100644
--- a/Marlin/src/config/examples/BQ/WITBOX/Configuration.h
+++ b/Marlin/src/config/examples/BQ/WITBOX/Configuration.h
@@ -156,13 +156,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -1826,6 +1827,15 @@
//
//#define SILVER_GATE_GLCD_CONTROLLER
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/examples/BQ/WITBOX/Configuration_adv.h b/Marlin/src/config/examples/BQ/WITBOX/Configuration_adv.h
index b15b1bad95..2d3b24252a 100644
--- a/Marlin/src/config/examples/BQ/WITBOX/Configuration_adv.h
+++ b/Marlin/src/config/examples/BQ/WITBOX/Configuration_adv.h
@@ -701,6 +701,22 @@
#define USB_INTR_PIN SD_DETECT_PIN
#endif
+ /**
+ * When using a bootloader that supports SD-Firmware-Flashing,
+ * add a menu item to activate SD-FW-Update on the next reboot.
+ *
+ * Requires ATMEGA2560 (Arduino Mega)
+ *
+ * Tested with this bootloader:
+ * https://github.com/FleetProbe/MicroBridge-Arduino-ATMega2560
+ */
+ //#define SD_FIRMWARE_UPDATE
+ #if ENABLED(SD_FIRMWARE_UPDATE)
+ #define SD_FIRMWARE_UPDATE_EEPROM_ADDR 0x1FF
+ #define SD_FIRMWARE_UPDATE_ACTIVE_VALUE 0xF0
+ #define SD_FIRMWARE_UPDATE_INACTIVE_VALUE 0xFF
+ #endif
+
#endif // SDSUPPORT
/**
diff --git a/Marlin/src/config/examples/Cartesio/Configuration.h b/Marlin/src/config/examples/Cartesio/Configuration.h
index d76591b9a0..b8ca6b5c9e 100644
--- a/Marlin/src/config/examples/Cartesio/Configuration.h
+++ b/Marlin/src/config/examples/Cartesio/Configuration.h
@@ -157,13 +157,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -1837,6 +1838,15 @@
//
//#define SILVER_GATE_GLCD_CONTROLLER
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/examples/Cartesio/Configuration_adv.h b/Marlin/src/config/examples/Cartesio/Configuration_adv.h
index 65ae3fe81f..9ca51d6fdd 100644
--- a/Marlin/src/config/examples/Cartesio/Configuration_adv.h
+++ b/Marlin/src/config/examples/Cartesio/Configuration_adv.h
@@ -701,6 +701,22 @@
#define USB_INTR_PIN SD_DETECT_PIN
#endif
+ /**
+ * When using a bootloader that supports SD-Firmware-Flashing,
+ * add a menu item to activate SD-FW-Update on the next reboot.
+ *
+ * Requires ATMEGA2560 (Arduino Mega)
+ *
+ * Tested with this bootloader:
+ * https://github.com/FleetProbe/MicroBridge-Arduino-ATMega2560
+ */
+ //#define SD_FIRMWARE_UPDATE
+ #if ENABLED(SD_FIRMWARE_UPDATE)
+ #define SD_FIRMWARE_UPDATE_EEPROM_ADDR 0x1FF
+ #define SD_FIRMWARE_UPDATE_ACTIVE_VALUE 0xF0
+ #define SD_FIRMWARE_UPDATE_INACTIVE_VALUE 0xFF
+ #endif
+
#endif // SDSUPPORT
/**
diff --git a/Marlin/src/config/examples/Creality/CR-10/Configuration.h b/Marlin/src/config/examples/Creality/CR-10/Configuration.h
index 1e9296f187..e4fea3531d 100644
--- a/Marlin/src/config/examples/Creality/CR-10/Configuration.h
+++ b/Marlin/src/config/examples/Creality/CR-10/Configuration.h
@@ -156,13 +156,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -1848,6 +1849,15 @@
//
//#define SILVER_GATE_GLCD_CONTROLLER
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/examples/Creality/CR-10/Configuration_adv.h b/Marlin/src/config/examples/Creality/CR-10/Configuration_adv.h
index b74e9b867d..0211927b73 100644
--- a/Marlin/src/config/examples/Creality/CR-10/Configuration_adv.h
+++ b/Marlin/src/config/examples/Creality/CR-10/Configuration_adv.h
@@ -701,6 +701,22 @@
#define USB_INTR_PIN SD_DETECT_PIN
#endif
+ /**
+ * When using a bootloader that supports SD-Firmware-Flashing,
+ * add a menu item to activate SD-FW-Update on the next reboot.
+ *
+ * Requires ATMEGA2560 (Arduino Mega)
+ *
+ * Tested with this bootloader:
+ * https://github.com/FleetProbe/MicroBridge-Arduino-ATMega2560
+ */
+ //#define SD_FIRMWARE_UPDATE
+ #if ENABLED(SD_FIRMWARE_UPDATE)
+ #define SD_FIRMWARE_UPDATE_EEPROM_ADDR 0x1FF
+ #define SD_FIRMWARE_UPDATE_ACTIVE_VALUE 0xF0
+ #define SD_FIRMWARE_UPDATE_INACTIVE_VALUE 0xFF
+ #endif
+
#endif // SDSUPPORT
/**
diff --git a/Marlin/src/config/examples/Creality/CR-10S/Configuration.h b/Marlin/src/config/examples/Creality/CR-10S/Configuration.h
index 3eca6a2e62..d3a0e38083 100644
--- a/Marlin/src/config/examples/Creality/CR-10S/Configuration.h
+++ b/Marlin/src/config/examples/Creality/CR-10S/Configuration.h
@@ -160,13 +160,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -1843,6 +1844,15 @@
//
//#define SILVER_GATE_GLCD_CONTROLLER
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/examples/Creality/CR-10S/Configuration_adv.h b/Marlin/src/config/examples/Creality/CR-10S/Configuration_adv.h
index 0c052f18cf..cfcc0df375 100644
--- a/Marlin/src/config/examples/Creality/CR-10S/Configuration_adv.h
+++ b/Marlin/src/config/examples/Creality/CR-10S/Configuration_adv.h
@@ -701,6 +701,22 @@
#define USB_INTR_PIN SD_DETECT_PIN
#endif
+ /**
+ * When using a bootloader that supports SD-Firmware-Flashing,
+ * add a menu item to activate SD-FW-Update on the next reboot.
+ *
+ * Requires ATMEGA2560 (Arduino Mega)
+ *
+ * Tested with this bootloader:
+ * https://github.com/FleetProbe/MicroBridge-Arduino-ATMega2560
+ */
+ //#define SD_FIRMWARE_UPDATE
+ #if ENABLED(SD_FIRMWARE_UPDATE)
+ #define SD_FIRMWARE_UPDATE_EEPROM_ADDR 0x1FF
+ #define SD_FIRMWARE_UPDATE_ACTIVE_VALUE 0xF0
+ #define SD_FIRMWARE_UPDATE_INACTIVE_VALUE 0xFF
+ #endif
+
#endif // SDSUPPORT
/**
diff --git a/Marlin/src/config/examples/Creality/CR-10mini/Configuration.h b/Marlin/src/config/examples/Creality/CR-10mini/Configuration.h
index a5d70bd14b..1bd40c6b49 100644
--- a/Marlin/src/config/examples/Creality/CR-10mini/Configuration.h
+++ b/Marlin/src/config/examples/Creality/CR-10mini/Configuration.h
@@ -165,13 +165,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -1857,6 +1858,15 @@
//
//#define SILVER_GATE_GLCD_CONTROLLER
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/examples/Creality/CR-10mini/Configuration_adv.h b/Marlin/src/config/examples/Creality/CR-10mini/Configuration_adv.h
index 109038da43..40e037c9a6 100644
--- a/Marlin/src/config/examples/Creality/CR-10mini/Configuration_adv.h
+++ b/Marlin/src/config/examples/Creality/CR-10mini/Configuration_adv.h
@@ -701,6 +701,22 @@
#define USB_INTR_PIN SD_DETECT_PIN
#endif
+ /**
+ * When using a bootloader that supports SD-Firmware-Flashing,
+ * add a menu item to activate SD-FW-Update on the next reboot.
+ *
+ * Requires ATMEGA2560 (Arduino Mega)
+ *
+ * Tested with this bootloader:
+ * https://github.com/FleetProbe/MicroBridge-Arduino-ATMega2560
+ */
+ //#define SD_FIRMWARE_UPDATE
+ #if ENABLED(SD_FIRMWARE_UPDATE)
+ #define SD_FIRMWARE_UPDATE_EEPROM_ADDR 0x1FF
+ #define SD_FIRMWARE_UPDATE_ACTIVE_VALUE 0xF0
+ #define SD_FIRMWARE_UPDATE_INACTIVE_VALUE 0xFF
+ #endif
+
#endif // SDSUPPORT
/**
diff --git a/Marlin/src/config/examples/Creality/CR-8/Configuration.h b/Marlin/src/config/examples/Creality/CR-8/Configuration.h
index 1a39033120..a229beaaf4 100644
--- a/Marlin/src/config/examples/Creality/CR-8/Configuration.h
+++ b/Marlin/src/config/examples/Creality/CR-8/Configuration.h
@@ -156,13 +156,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -1848,6 +1849,15 @@
//
//#define SILVER_GATE_GLCD_CONTROLLER
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/examples/Creality/CR-8/Configuration_adv.h b/Marlin/src/config/examples/Creality/CR-8/Configuration_adv.h
index 89db71cbd0..225e43e483 100644
--- a/Marlin/src/config/examples/Creality/CR-8/Configuration_adv.h
+++ b/Marlin/src/config/examples/Creality/CR-8/Configuration_adv.h
@@ -701,6 +701,22 @@
#define USB_INTR_PIN SD_DETECT_PIN
#endif
+ /**
+ * When using a bootloader that supports SD-Firmware-Flashing,
+ * add a menu item to activate SD-FW-Update on the next reboot.
+ *
+ * Requires ATMEGA2560 (Arduino Mega)
+ *
+ * Tested with this bootloader:
+ * https://github.com/FleetProbe/MicroBridge-Arduino-ATMega2560
+ */
+ //#define SD_FIRMWARE_UPDATE
+ #if ENABLED(SD_FIRMWARE_UPDATE)
+ #define SD_FIRMWARE_UPDATE_EEPROM_ADDR 0x1FF
+ #define SD_FIRMWARE_UPDATE_ACTIVE_VALUE 0xF0
+ #define SD_FIRMWARE_UPDATE_INACTIVE_VALUE 0xFF
+ #endif
+
#endif // SDSUPPORT
/**
diff --git a/Marlin/src/config/examples/Creality/Ender-2/Configuration.h b/Marlin/src/config/examples/Creality/Ender-2/Configuration.h
index 7114be4aaa..4b4c26ac36 100644
--- a/Marlin/src/config/examples/Creality/Ender-2/Configuration.h
+++ b/Marlin/src/config/examples/Creality/Ender-2/Configuration.h
@@ -156,13 +156,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -389,7 +390,7 @@
#define HEATER_3_MAXTEMP 275
#define HEATER_4_MAXTEMP 275
#define HEATER_5_MAXTEMP 275
-#define BED_MAXTEMP 125
+#define BED_MAXTEMP 75
//===========================================================================
//============================= PID Settings ================================
@@ -1842,6 +1843,15 @@
//
//#define SILVER_GATE_GLCD_CONTROLLER
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/examples/Creality/Ender-2/Configuration_adv.h b/Marlin/src/config/examples/Creality/Ender-2/Configuration_adv.h
index b9604758bd..c8fe6aefc0 100644
--- a/Marlin/src/config/examples/Creality/Ender-2/Configuration_adv.h
+++ b/Marlin/src/config/examples/Creality/Ender-2/Configuration_adv.h
@@ -701,6 +701,22 @@
#define USB_INTR_PIN SD_DETECT_PIN
#endif
+ /**
+ * When using a bootloader that supports SD-Firmware-Flashing,
+ * add a menu item to activate SD-FW-Update on the next reboot.
+ *
+ * Requires ATMEGA2560 (Arduino Mega)
+ *
+ * Tested with this bootloader:
+ * https://github.com/FleetProbe/MicroBridge-Arduino-ATMega2560
+ */
+ //#define SD_FIRMWARE_UPDATE
+ #if ENABLED(SD_FIRMWARE_UPDATE)
+ #define SD_FIRMWARE_UPDATE_EEPROM_ADDR 0x1FF
+ #define SD_FIRMWARE_UPDATE_ACTIVE_VALUE 0xF0
+ #define SD_FIRMWARE_UPDATE_INACTIVE_VALUE 0xFF
+ #endif
+
#endif // SDSUPPORT
/**
diff --git a/Marlin/src/config/examples/Creality/Ender-2/README.md b/Marlin/src/config/examples/Creality/Ender-2/README.md
index e64f3ec3d2..b45eb94690 100644
--- a/Marlin/src/config/examples/Creality/Ender-2/README.md
+++ b/Marlin/src/config/examples/Creality/Ender-2/README.md
@@ -16,3 +16,18 @@ For U8Glib, at least version 1.14 and at most 1.17 is used, because
## Bitmaps
The bootscreen and custom status screens come from Creality's firmware.
+
+## Creality Ender-2 firmware status
+
+The firmware source code has been published on 2018/07/10.
+It is based on Marlin 1.1. The source code and .hex binaries for all printers (including Ender-2) can be obtained from:
+https://www.creality3d.cn/download/firmware_c0001
+
+And repositories for CR-10S and Ender-3 can be found here:
+https://github.com/Creality3DPrinting
+
+The configuration files have been verified to match the original configuration, but further investigation is needed to ensure there aren't any extra changes in the source code.
+
+## Ender-2 specific changelog:
+
+* 2018/10/08 - Updated BED_MAXTEMP to 75 to match the original Creality Ender-2 Firmware (which is now open source)
diff --git a/Marlin/src/config/examples/Creality/Ender-3/Configuration.h b/Marlin/src/config/examples/Creality/Ender-3/Configuration.h
index e9c300431c..a87f2ecf2f 100644
--- a/Marlin/src/config/examples/Creality/Ender-3/Configuration.h
+++ b/Marlin/src/config/examples/Creality/Ender-3/Configuration.h
@@ -156,13 +156,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -1842,6 +1843,15 @@
//
//#define SILVER_GATE_GLCD_CONTROLLER
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/examples/Creality/Ender-3/Configuration_adv.h b/Marlin/src/config/examples/Creality/Ender-3/Configuration_adv.h
index 464f4d3da6..f1cd39c313 100644
--- a/Marlin/src/config/examples/Creality/Ender-3/Configuration_adv.h
+++ b/Marlin/src/config/examples/Creality/Ender-3/Configuration_adv.h
@@ -701,6 +701,22 @@
#define USB_INTR_PIN SD_DETECT_PIN
#endif
+ /**
+ * When using a bootloader that supports SD-Firmware-Flashing,
+ * add a menu item to activate SD-FW-Update on the next reboot.
+ *
+ * Requires ATMEGA2560 (Arduino Mega)
+ *
+ * Tested with this bootloader:
+ * https://github.com/FleetProbe/MicroBridge-Arduino-ATMega2560
+ */
+ //#define SD_FIRMWARE_UPDATE
+ #if ENABLED(SD_FIRMWARE_UPDATE)
+ #define SD_FIRMWARE_UPDATE_EEPROM_ADDR 0x1FF
+ #define SD_FIRMWARE_UPDATE_ACTIVE_VALUE 0xF0
+ #define SD_FIRMWARE_UPDATE_INACTIVE_VALUE 0xFF
+ #endif
+
#endif // SDSUPPORT
/**
diff --git a/Marlin/src/config/examples/Creality/Ender-4/Configuration.h b/Marlin/src/config/examples/Creality/Ender-4/Configuration.h
index afc7a482f4..ca2fb58c52 100644
--- a/Marlin/src/config/examples/Creality/Ender-4/Configuration.h
+++ b/Marlin/src/config/examples/Creality/Ender-4/Configuration.h
@@ -74,7 +74,7 @@
// User-specified version info of this build to display in [Pronterface, etc] terminal window during
// startup. Implementation of an idea by Prof Braino to inform user that any changes made to this
// build by the user have been successfully uploaded into firmware.
-#define STRING_CONFIG_H_AUTHOR "Skorpi, Creality Ender-4)" // Who made the changes.
+#define STRING_CONFIG_H_AUTHOR "(Skorpi, Creality Ender-4, brandstaetter)" // Who made the changes.
#define SHOW_BOOTSCREEN
#define STRING_SPLASH_LINE1 SHORT_BUILD_VERSION // will be shown during bootup in line 1
#define STRING_SPLASH_LINE2 WEBSITE_URL // will be shown during bootup in line 2
@@ -156,13 +156,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -1848,6 +1849,15 @@
//
//#define SILVER_GATE_GLCD_CONTROLLER
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/examples/Creality/Ender-4/Configuration_adv.h b/Marlin/src/config/examples/Creality/Ender-4/Configuration_adv.h
index 89db71cbd0..4a5119296d 100644
--- a/Marlin/src/config/examples/Creality/Ender-4/Configuration_adv.h
+++ b/Marlin/src/config/examples/Creality/Ender-4/Configuration_adv.h
@@ -261,13 +261,13 @@
/**
* M355 Case Light on-off / brightness
*/
-//#define CASE_LIGHT_ENABLE
+#define CASE_LIGHT_ENABLE
#if ENABLED(CASE_LIGHT_ENABLE)
- //#define CASE_LIGHT_PIN 4 // Override the default pin if needed
+ #define CASE_LIGHT_PIN ENDER4_FAN_PIN // Override the default pin if needed
#define INVERT_CASE_LIGHT false // Set true if Case Light is ON when pin is LOW
- #define CASE_LIGHT_DEFAULT_ON true // Set default power-up state on
+ #define CASE_LIGHT_DEFAULT_ON false // Set default power-up state on
#define CASE_LIGHT_DEFAULT_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin)
- //#define MENU_ITEM_CASE_LIGHT // Add a Case Light option to the LCD main menu
+ #define MENU_ITEM_CASE_LIGHT // Add a Case Light option to the LCD main menu
//#define CASE_LIGHT_USE_NEOPIXEL // Use Neopixel LED as case light, requires NEOPIXEL_LED.
#if ENABLED(CASE_LIGHT_USE_NEOPIXEL)
#define CASE_LIGHT_NEOPIXEL_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White }
@@ -701,6 +701,22 @@
#define USB_INTR_PIN SD_DETECT_PIN
#endif
+ /**
+ * When using a bootloader that supports SD-Firmware-Flashing,
+ * add a menu item to activate SD-FW-Update on the next reboot.
+ *
+ * Requires ATMEGA2560 (Arduino Mega)
+ *
+ * Tested with this bootloader:
+ * https://github.com/FleetProbe/MicroBridge-Arduino-ATMega2560
+ */
+ //#define SD_FIRMWARE_UPDATE
+ #if ENABLED(SD_FIRMWARE_UPDATE)
+ #define SD_FIRMWARE_UPDATE_EEPROM_ADDR 0x1FF
+ #define SD_FIRMWARE_UPDATE_ACTIVE_VALUE 0xF0
+ #define SD_FIRMWARE_UPDATE_INACTIVE_VALUE 0xFF
+ #endif
+
#endif // SDSUPPORT
/**
diff --git a/Marlin/src/config/examples/Einstart-S/Configuration.h b/Marlin/src/config/examples/Einstart-S/Configuration.h
index 3e3131f33f..f66fcd33c7 100644
--- a/Marlin/src/config/examples/Einstart-S/Configuration.h
+++ b/Marlin/src/config/examples/Einstart-S/Configuration.h
@@ -156,13 +156,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
diff --git a/Marlin/src/config/examples/Einstart-S/Configuration_adv.h b/Marlin/src/config/examples/Einstart-S/Configuration_adv.h
index 7b17a419fd..0769a7aa6b 100644
--- a/Marlin/src/config/examples/Einstart-S/Configuration_adv.h
+++ b/Marlin/src/config/examples/Einstart-S/Configuration_adv.h
@@ -701,6 +701,22 @@
#define USB_INTR_PIN SD_DETECT_PIN
#endif
+ /**
+ * When using a bootloader that supports SD-Firmware-Flashing,
+ * add a menu item to activate SD-FW-Update on the next reboot.
+ *
+ * Requires ATMEGA2560 (Arduino Mega)
+ *
+ * Tested with this bootloader:
+ * https://github.com/FleetProbe/MicroBridge-Arduino-ATMega2560
+ */
+ //#define SD_FIRMWARE_UPDATE
+ #if ENABLED(SD_FIRMWARE_UPDATE)
+ #define SD_FIRMWARE_UPDATE_EEPROM_ADDR 0x1FF
+ #define SD_FIRMWARE_UPDATE_ACTIVE_VALUE 0xF0
+ #define SD_FIRMWARE_UPDATE_INACTIVE_VALUE 0xFF
+ #endif
+
#endif // SDSUPPORT
/**
diff --git a/Marlin/src/config/examples/Felix/Configuration.h b/Marlin/src/config/examples/Felix/Configuration.h
index 8f7074ea2b..1b7f26ee1d 100644
--- a/Marlin/src/config/examples/Felix/Configuration.h
+++ b/Marlin/src/config/examples/Felix/Configuration.h
@@ -156,13 +156,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -1820,6 +1821,15 @@
//
//#define SILVER_GATE_GLCD_CONTROLLER
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/examples/Felix/Configuration_adv.h b/Marlin/src/config/examples/Felix/Configuration_adv.h
index 315fa249c6..8f2210a1ef 100644
--- a/Marlin/src/config/examples/Felix/Configuration_adv.h
+++ b/Marlin/src/config/examples/Felix/Configuration_adv.h
@@ -701,6 +701,22 @@
#define USB_INTR_PIN SD_DETECT_PIN
#endif
+ /**
+ * When using a bootloader that supports SD-Firmware-Flashing,
+ * add a menu item to activate SD-FW-Update on the next reboot.
+ *
+ * Requires ATMEGA2560 (Arduino Mega)
+ *
+ * Tested with this bootloader:
+ * https://github.com/FleetProbe/MicroBridge-Arduino-ATMega2560
+ */
+ //#define SD_FIRMWARE_UPDATE
+ #if ENABLED(SD_FIRMWARE_UPDATE)
+ #define SD_FIRMWARE_UPDATE_EEPROM_ADDR 0x1FF
+ #define SD_FIRMWARE_UPDATE_ACTIVE_VALUE 0xF0
+ #define SD_FIRMWARE_UPDATE_INACTIVE_VALUE 0xFF
+ #endif
+
#endif // SDSUPPORT
/**
diff --git a/Marlin/src/config/examples/Felix/DUAL/Configuration.h b/Marlin/src/config/examples/Felix/DUAL/Configuration.h
index 9dbf7b9332..46b46d51e5 100644
--- a/Marlin/src/config/examples/Felix/DUAL/Configuration.h
+++ b/Marlin/src/config/examples/Felix/DUAL/Configuration.h
@@ -156,13 +156,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -1820,6 +1821,15 @@
//
//#define SILVER_GATE_GLCD_CONTROLLER
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/examples/FolgerTech/i3-2020/Configuration.h b/Marlin/src/config/examples/FolgerTech/i3-2020/Configuration.h
index 4d69f86a00..c875ee7895 100644
--- a/Marlin/src/config/examples/FolgerTech/i3-2020/Configuration.h
+++ b/Marlin/src/config/examples/FolgerTech/i3-2020/Configuration.h
@@ -156,13 +156,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -1844,6 +1845,15 @@
//
//#define SILVER_GATE_GLCD_CONTROLLER
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/examples/FolgerTech/i3-2020/Configuration_adv.h b/Marlin/src/config/examples/FolgerTech/i3-2020/Configuration_adv.h
index a768a71966..52827b25cd 100644
--- a/Marlin/src/config/examples/FolgerTech/i3-2020/Configuration_adv.h
+++ b/Marlin/src/config/examples/FolgerTech/i3-2020/Configuration_adv.h
@@ -701,6 +701,22 @@
#define USB_INTR_PIN SD_DETECT_PIN
#endif
+ /**
+ * When using a bootloader that supports SD-Firmware-Flashing,
+ * add a menu item to activate SD-FW-Update on the next reboot.
+ *
+ * Requires ATMEGA2560 (Arduino Mega)
+ *
+ * Tested with this bootloader:
+ * https://github.com/FleetProbe/MicroBridge-Arduino-ATMega2560
+ */
+ //#define SD_FIRMWARE_UPDATE
+ #if ENABLED(SD_FIRMWARE_UPDATE)
+ #define SD_FIRMWARE_UPDATE_EEPROM_ADDR 0x1FF
+ #define SD_FIRMWARE_UPDATE_ACTIVE_VALUE 0xF0
+ #define SD_FIRMWARE_UPDATE_INACTIVE_VALUE 0xFF
+ #endif
+
#endif // SDSUPPORT
/**
diff --git a/Marlin/src/config/examples/Formbot/Raptor/Configuration.h b/Marlin/src/config/examples/Formbot/Raptor/Configuration.h
index 667d751b28..fce1932cfb 100644
--- a/Marlin/src/config/examples/Formbot/Raptor/Configuration.h
+++ b/Marlin/src/config/examples/Formbot/Raptor/Configuration.h
@@ -197,13 +197,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -1944,6 +1945,15 @@
//
//#define SILVER_GATE_GLCD_CONTROLLER
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/examples/Formbot/Raptor/Configuration_adv.h b/Marlin/src/config/examples/Formbot/Raptor/Configuration_adv.h
index 4c8358aad2..0a0c934164 100644
--- a/Marlin/src/config/examples/Formbot/Raptor/Configuration_adv.h
+++ b/Marlin/src/config/examples/Formbot/Raptor/Configuration_adv.h
@@ -701,6 +701,22 @@
#define USB_INTR_PIN SD_DETECT_PIN
#endif
+ /**
+ * When using a bootloader that supports SD-Firmware-Flashing,
+ * add a menu item to activate SD-FW-Update on the next reboot.
+ *
+ * Requires ATMEGA2560 (Arduino Mega)
+ *
+ * Tested with this bootloader:
+ * https://github.com/FleetProbe/MicroBridge-Arduino-ATMega2560
+ */
+ //#define SD_FIRMWARE_UPDATE
+ #if ENABLED(SD_FIRMWARE_UPDATE)
+ #define SD_FIRMWARE_UPDATE_EEPROM_ADDR 0x1FF
+ #define SD_FIRMWARE_UPDATE_ACTIVE_VALUE 0xF0
+ #define SD_FIRMWARE_UPDATE_INACTIVE_VALUE 0xFF
+ #endif
+
#endif // SDSUPPORT
/**
diff --git a/Marlin/src/config/examples/Formbot/T_Rex_2+/Configuration.h b/Marlin/src/config/examples/Formbot/T_Rex_2+/Configuration.h
index 023542d464..b7374171dc 100644
--- a/Marlin/src/config/examples/Formbot/T_Rex_2+/Configuration.h
+++ b/Marlin/src/config/examples/Formbot/T_Rex_2+/Configuration.h
@@ -159,13 +159,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -1885,6 +1886,15 @@
//
//#define SILVER_GATE_GLCD_CONTROLLER
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/examples/Formbot/T_Rex_2+/Configuration_adv.h b/Marlin/src/config/examples/Formbot/T_Rex_2+/Configuration_adv.h
index 4242c485f3..b596907785 100644
--- a/Marlin/src/config/examples/Formbot/T_Rex_2+/Configuration_adv.h
+++ b/Marlin/src/config/examples/Formbot/T_Rex_2+/Configuration_adv.h
@@ -705,6 +705,22 @@
#define USB_INTR_PIN SD_DETECT_PIN
#endif
+ /**
+ * When using a bootloader that supports SD-Firmware-Flashing,
+ * add a menu item to activate SD-FW-Update on the next reboot.
+ *
+ * Requires ATMEGA2560 (Arduino Mega)
+ *
+ * Tested with this bootloader:
+ * https://github.com/FleetProbe/MicroBridge-Arduino-ATMega2560
+ */
+ //#define SD_FIRMWARE_UPDATE
+ #if ENABLED(SD_FIRMWARE_UPDATE)
+ #define SD_FIRMWARE_UPDATE_EEPROM_ADDR 0x1FF
+ #define SD_FIRMWARE_UPDATE_ACTIVE_VALUE 0xF0
+ #define SD_FIRMWARE_UPDATE_INACTIVE_VALUE 0xFF
+ #endif
+
#endif // SDSUPPORT
/**
diff --git a/Marlin/src/config/examples/Formbot/T_Rex_3/Configuration.h b/Marlin/src/config/examples/Formbot/T_Rex_3/Configuration.h
index a7490236a1..f083fd1b95 100644
--- a/Marlin/src/config/examples/Formbot/T_Rex_3/Configuration.h
+++ b/Marlin/src/config/examples/Formbot/T_Rex_3/Configuration.h
@@ -160,13 +160,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -1871,6 +1872,15 @@
//
//#define SILVER_GATE_GLCD_CONTROLLER
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/examples/Formbot/T_Rex_3/Configuration_adv.h b/Marlin/src/config/examples/Formbot/T_Rex_3/Configuration_adv.h
index 0e56872258..6c82a2476f 100644
--- a/Marlin/src/config/examples/Formbot/T_Rex_3/Configuration_adv.h
+++ b/Marlin/src/config/examples/Formbot/T_Rex_3/Configuration_adv.h
@@ -706,6 +706,22 @@
#define USB_INTR_PIN SD_DETECT_PIN
#endif
+ /**
+ * When using a bootloader that supports SD-Firmware-Flashing,
+ * add a menu item to activate SD-FW-Update on the next reboot.
+ *
+ * Requires ATMEGA2560 (Arduino Mega)
+ *
+ * Tested with this bootloader:
+ * https://github.com/FleetProbe/MicroBridge-Arduino-ATMega2560
+ */
+ //#define SD_FIRMWARE_UPDATE
+ #if ENABLED(SD_FIRMWARE_UPDATE)
+ #define SD_FIRMWARE_UPDATE_EEPROM_ADDR 0x1FF
+ #define SD_FIRMWARE_UPDATE_ACTIVE_VALUE 0xF0
+ #define SD_FIRMWARE_UPDATE_INACTIVE_VALUE 0xFF
+ #endif
+
#endif // SDSUPPORT
/**
diff --git a/Marlin/src/config/examples/Geeetech/GT2560/Configuration.h b/Marlin/src/config/examples/Geeetech/GT2560/Configuration.h
index 2ed7e0956f..62d68c3f41 100644
--- a/Marlin/src/config/examples/Geeetech/GT2560/Configuration.h
+++ b/Marlin/src/config/examples/Geeetech/GT2560/Configuration.h
@@ -156,13 +156,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -1853,6 +1854,15 @@
//
//#define SILVER_GATE_GLCD_CONTROLLER
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/examples/Geeetech/I3_Pro_X-GT2560/Configuration.h b/Marlin/src/config/examples/Geeetech/I3_Pro_X-GT2560/Configuration.h
index eabc7d2145..4c63045943 100644
--- a/Marlin/src/config/examples/Geeetech/I3_Pro_X-GT2560/Configuration.h
+++ b/Marlin/src/config/examples/Geeetech/I3_Pro_X-GT2560/Configuration.h
@@ -156,13 +156,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -1838,6 +1839,15 @@
//
//#define SILVER_GATE_GLCD_CONTROLLER
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/examples/Geeetech/MeCreator2/Configuration.h b/Marlin/src/config/examples/Geeetech/MeCreator2/Configuration.h
index 598bc7b4c8..8d35bf5892 100644
--- a/Marlin/src/config/examples/Geeetech/MeCreator2/Configuration.h
+++ b/Marlin/src/config/examples/Geeetech/MeCreator2/Configuration.h
@@ -156,13 +156,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -416,7 +417,7 @@
// MeCreator2
#define DEFAULT_Kp 11.93
#define DEFAULT_Ki 0.59
-#define DEFAULT_Kd 59.89
+#define DEFAULT_Kd 59.89
// Ultimaker
// #define DEFAULT_Kp 22.2
// #define DEFAULT_Ki 1.08
@@ -467,9 +468,9 @@
//#define PID_BED_DEBUG // Sends debug data to the serial port.
//MeCreator2 generated by Autotune
- #define DEFAULT_bedKp 182.46 // 175.68 189.95
+ #define DEFAULT_bedKp 182.46 // 175.68 189.95
#define DEFAULT_bedKi 35.92 // 34.59 37.40
- #define DEFAULT_bedKd 231.70 // 223.07 241.19
+ #define DEFAULT_bedKd 231.70 // 223.07 241.19
//120V 250W silicone heater into 4mm borosilicate (MendelMax 1.5+)
//from FOPDT model - kp=.39 Tp=405 Tdead=66, Tc set to 79.2, aggressive factor of .15 (vs .1, 1, 10)
//#define DEFAULT_bedKp 10.00
@@ -1845,6 +1846,15 @@
//
//#define SILVER_GATE_GLCD_CONTROLLER
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/examples/Geeetech/MeCreator2/Configuration_adv.h b/Marlin/src/config/examples/Geeetech/MeCreator2/Configuration_adv.h
index efd013267e..d94a6871ac 100644
--- a/Marlin/src/config/examples/Geeetech/MeCreator2/Configuration_adv.h
+++ b/Marlin/src/config/examples/Geeetech/MeCreator2/Configuration_adv.h
@@ -701,6 +701,22 @@
#define USB_INTR_PIN SD_DETECT_PIN
#endif
+ /**
+ * When using a bootloader that supports SD-Firmware-Flashing,
+ * add a menu item to activate SD-FW-Update on the next reboot.
+ *
+ * Requires ATMEGA2560 (Arduino Mega)
+ *
+ * Tested with this bootloader:
+ * https://github.com/FleetProbe/MicroBridge-Arduino-ATMega2560
+ */
+ //#define SD_FIRMWARE_UPDATE
+ #if ENABLED(SD_FIRMWARE_UPDATE)
+ #define SD_FIRMWARE_UPDATE_EEPROM_ADDR 0x1FF
+ #define SD_FIRMWARE_UPDATE_ACTIVE_VALUE 0xF0
+ #define SD_FIRMWARE_UPDATE_INACTIVE_VALUE 0xFF
+ #endif
+
#endif // SDSUPPORT
/**
diff --git a/Marlin/src/config/examples/Geeetech/Prusa i3 Pro B/bltouch/Configuration.h b/Marlin/src/config/examples/Geeetech/Prusa i3 Pro B/bltouch/Configuration.h
index 197f3874a8..5eac4fbd48 100644
--- a/Marlin/src/config/examples/Geeetech/Prusa i3 Pro B/bltouch/Configuration.h
+++ b/Marlin/src/config/examples/Geeetech/Prusa i3 Pro B/bltouch/Configuration.h
@@ -156,13 +156,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -1854,6 +1855,15 @@
//
//#define SILVER_GATE_GLCD_CONTROLLER
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/examples/Geeetech/Prusa i3 Pro B/noprobe/Configuration.h b/Marlin/src/config/examples/Geeetech/Prusa i3 Pro B/noprobe/Configuration.h
index e397aa1736..dd06dee917 100644
--- a/Marlin/src/config/examples/Geeetech/Prusa i3 Pro B/noprobe/Configuration.h
+++ b/Marlin/src/config/examples/Geeetech/Prusa i3 Pro B/noprobe/Configuration.h
@@ -156,13 +156,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -1853,6 +1854,15 @@
//
//#define SILVER_GATE_GLCD_CONTROLLER
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/examples/Geeetech/Prusa i3 Pro C/Configuration.h b/Marlin/src/config/examples/Geeetech/Prusa i3 Pro C/Configuration.h
index c543fb069f..57f3596503 100644
--- a/Marlin/src/config/examples/Geeetech/Prusa i3 Pro C/Configuration.h
+++ b/Marlin/src/config/examples/Geeetech/Prusa i3 Pro C/Configuration.h
@@ -156,13 +156,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -1838,6 +1839,15 @@
//
//#define SILVER_GATE_GLCD_CONTROLLER
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/examples/Geeetech/Prusa i3 Pro C/Configuration_adv.h b/Marlin/src/config/examples/Geeetech/Prusa i3 Pro C/Configuration_adv.h
index 6d3b231015..dd0617d7bf 100644
--- a/Marlin/src/config/examples/Geeetech/Prusa i3 Pro C/Configuration_adv.h
+++ b/Marlin/src/config/examples/Geeetech/Prusa i3 Pro C/Configuration_adv.h
@@ -701,6 +701,22 @@
#define USB_INTR_PIN SD_DETECT_PIN
#endif
+ /**
+ * When using a bootloader that supports SD-Firmware-Flashing,
+ * add a menu item to activate SD-FW-Update on the next reboot.
+ *
+ * Requires ATMEGA2560 (Arduino Mega)
+ *
+ * Tested with this bootloader:
+ * https://github.com/FleetProbe/MicroBridge-Arduino-ATMega2560
+ */
+ //#define SD_FIRMWARE_UPDATE
+ #if ENABLED(SD_FIRMWARE_UPDATE)
+ #define SD_FIRMWARE_UPDATE_EEPROM_ADDR 0x1FF
+ #define SD_FIRMWARE_UPDATE_ACTIVE_VALUE 0xF0
+ #define SD_FIRMWARE_UPDATE_INACTIVE_VALUE 0xFF
+ #endif
+
#endif // SDSUPPORT
/**
diff --git a/Marlin/src/config/examples/Geeetech/Prusa i3 Pro W/Configuration.h b/Marlin/src/config/examples/Geeetech/Prusa i3 Pro W/Configuration.h
index 87f51423a7..c472fbd6ff 100644
--- a/Marlin/src/config/examples/Geeetech/Prusa i3 Pro W/Configuration.h
+++ b/Marlin/src/config/examples/Geeetech/Prusa i3 Pro W/Configuration.h
@@ -156,13 +156,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -1838,6 +1839,15 @@
//
//#define SILVER_GATE_GLCD_CONTROLLER
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/examples/Geeetech/Prusa i3 Pro W/Configuration_adv.h b/Marlin/src/config/examples/Geeetech/Prusa i3 Pro W/Configuration_adv.h
index 6d3b231015..dd0617d7bf 100644
--- a/Marlin/src/config/examples/Geeetech/Prusa i3 Pro W/Configuration_adv.h
+++ b/Marlin/src/config/examples/Geeetech/Prusa i3 Pro W/Configuration_adv.h
@@ -701,6 +701,22 @@
#define USB_INTR_PIN SD_DETECT_PIN
#endif
+ /**
+ * When using a bootloader that supports SD-Firmware-Flashing,
+ * add a menu item to activate SD-FW-Update on the next reboot.
+ *
+ * Requires ATMEGA2560 (Arduino Mega)
+ *
+ * Tested with this bootloader:
+ * https://github.com/FleetProbe/MicroBridge-Arduino-ATMega2560
+ */
+ //#define SD_FIRMWARE_UPDATE
+ #if ENABLED(SD_FIRMWARE_UPDATE)
+ #define SD_FIRMWARE_UPDATE_EEPROM_ADDR 0x1FF
+ #define SD_FIRMWARE_UPDATE_ACTIVE_VALUE 0xF0
+ #define SD_FIRMWARE_UPDATE_INACTIVE_VALUE 0xFF
+ #endif
+
#endif // SDSUPPORT
/**
diff --git a/Marlin/src/config/examples/Infitary/i3-M508/Configuration.h b/Marlin/src/config/examples/Infitary/i3-M508/Configuration.h
index 1d9c8c8965..72a0db10b5 100644
--- a/Marlin/src/config/examples/Infitary/i3-M508/Configuration.h
+++ b/Marlin/src/config/examples/Infitary/i3-M508/Configuration.h
@@ -156,13 +156,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -1842,6 +1843,15 @@
//
//#define SILVER_GATE_GLCD_CONTROLLER
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/examples/Infitary/i3-M508/Configuration_adv.h b/Marlin/src/config/examples/Infitary/i3-M508/Configuration_adv.h
index f57f99aac3..76c0e02b5c 100644
--- a/Marlin/src/config/examples/Infitary/i3-M508/Configuration_adv.h
+++ b/Marlin/src/config/examples/Infitary/i3-M508/Configuration_adv.h
@@ -701,6 +701,22 @@
#define USB_INTR_PIN SD_DETECT_PIN
#endif
+ /**
+ * When using a bootloader that supports SD-Firmware-Flashing,
+ * add a menu item to activate SD-FW-Update on the next reboot.
+ *
+ * Requires ATMEGA2560 (Arduino Mega)
+ *
+ * Tested with this bootloader:
+ * https://github.com/FleetProbe/MicroBridge-Arduino-ATMega2560
+ */
+ //#define SD_FIRMWARE_UPDATE
+ #if ENABLED(SD_FIRMWARE_UPDATE)
+ #define SD_FIRMWARE_UPDATE_EEPROM_ADDR 0x1FF
+ #define SD_FIRMWARE_UPDATE_ACTIVE_VALUE 0xF0
+ #define SD_FIRMWARE_UPDATE_INACTIVE_VALUE 0xFF
+ #endif
+
#endif // SDSUPPORT
/**
diff --git a/Marlin/src/config/examples/JGAurora/A5/Configuration.h b/Marlin/src/config/examples/JGAurora/A5/Configuration.h
index e01f8b3918..44434e23ff 100644
--- a/Marlin/src/config/examples/JGAurora/A5/Configuration.h
+++ b/Marlin/src/config/examples/JGAurora/A5/Configuration.h
@@ -161,13 +161,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -1849,6 +1850,15 @@
//
//#define SILVER_GATE_GLCD_CONTROLLER
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/examples/JGAurora/A5/Configuration_adv.h b/Marlin/src/config/examples/JGAurora/A5/Configuration_adv.h
index fd4d5abb3d..41d2e2f736 100644
--- a/Marlin/src/config/examples/JGAurora/A5/Configuration_adv.h
+++ b/Marlin/src/config/examples/JGAurora/A5/Configuration_adv.h
@@ -701,6 +701,22 @@
#define USB_INTR_PIN SD_DETECT_PIN
#endif
+ /**
+ * When using a bootloader that supports SD-Firmware-Flashing,
+ * add a menu item to activate SD-FW-Update on the next reboot.
+ *
+ * Requires ATMEGA2560 (Arduino Mega)
+ *
+ * Tested with this bootloader:
+ * https://github.com/FleetProbe/MicroBridge-Arduino-ATMega2560
+ */
+ //#define SD_FIRMWARE_UPDATE
+ #if ENABLED(SD_FIRMWARE_UPDATE)
+ #define SD_FIRMWARE_UPDATE_EEPROM_ADDR 0x1FF
+ #define SD_FIRMWARE_UPDATE_ACTIVE_VALUE 0xF0
+ #define SD_FIRMWARE_UPDATE_INACTIVE_VALUE 0xFF
+ #endif
+
#endif // SDSUPPORT
/**
diff --git a/Marlin/src/config/examples/MakerParts/Configuration.h b/Marlin/src/config/examples/MakerParts/Configuration.h
index 47843b7d35..97bd910996 100644
--- a/Marlin/src/config/examples/MakerParts/Configuration.h
+++ b/Marlin/src/config/examples/MakerParts/Configuration.h
@@ -176,13 +176,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -1858,6 +1859,15 @@
//
//#define SILVER_GATE_GLCD_CONTROLLER
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/examples/MakerParts/Configuration_adv.h b/Marlin/src/config/examples/MakerParts/Configuration_adv.h
index 21e6a6237c..664a4c114e 100644
--- a/Marlin/src/config/examples/MakerParts/Configuration_adv.h
+++ b/Marlin/src/config/examples/MakerParts/Configuration_adv.h
@@ -701,6 +701,22 @@
#define USB_INTR_PIN SD_DETECT_PIN
#endif
+ /**
+ * When using a bootloader that supports SD-Firmware-Flashing,
+ * add a menu item to activate SD-FW-Update on the next reboot.
+ *
+ * Requires ATMEGA2560 (Arduino Mega)
+ *
+ * Tested with this bootloader:
+ * https://github.com/FleetProbe/MicroBridge-Arduino-ATMega2560
+ */
+ //#define SD_FIRMWARE_UPDATE
+ #if ENABLED(SD_FIRMWARE_UPDATE)
+ #define SD_FIRMWARE_UPDATE_EEPROM_ADDR 0x1FF
+ #define SD_FIRMWARE_UPDATE_ACTIVE_VALUE 0xF0
+ #define SD_FIRMWARE_UPDATE_INACTIVE_VALUE 0xFF
+ #endif
+
#endif // SDSUPPORT
/**
diff --git a/Marlin/src/config/examples/Malyan/M150/Configuration.h b/Marlin/src/config/examples/Malyan/M150/Configuration.h
index 812b022c4d..b65d723ab4 100644
--- a/Marlin/src/config/examples/Malyan/M150/Configuration.h
+++ b/Marlin/src/config/examples/Malyan/M150/Configuration.h
@@ -161,13 +161,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -1866,6 +1867,15 @@
//
//#define SILVER_GATE_GLCD_CONTROLLER
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/examples/Malyan/M150/Configuration_adv.h b/Marlin/src/config/examples/Malyan/M150/Configuration_adv.h
index dc96f6408b..67e5f56d9e 100644
--- a/Marlin/src/config/examples/Malyan/M150/Configuration_adv.h
+++ b/Marlin/src/config/examples/Malyan/M150/Configuration_adv.h
@@ -701,6 +701,22 @@
#define USB_INTR_PIN SD_DETECT_PIN
#endif
+ /**
+ * When using a bootloader that supports SD-Firmware-Flashing,
+ * add a menu item to activate SD-FW-Update on the next reboot.
+ *
+ * Requires ATMEGA2560 (Arduino Mega)
+ *
+ * Tested with this bootloader:
+ * https://github.com/FleetProbe/MicroBridge-Arduino-ATMega2560
+ */
+ //#define SD_FIRMWARE_UPDATE
+ #if ENABLED(SD_FIRMWARE_UPDATE)
+ #define SD_FIRMWARE_UPDATE_EEPROM_ADDR 0x1FF
+ #define SD_FIRMWARE_UPDATE_ACTIVE_VALUE 0xF0
+ #define SD_FIRMWARE_UPDATE_INACTIVE_VALUE 0xFF
+ #endif
+
#endif // SDSUPPORT
/**
diff --git a/Marlin/src/config/examples/Malyan/M200/Configuration.h b/Marlin/src/config/examples/Malyan/M200/Configuration.h
index 0dd1615d3d..c3887c6b68 100644
--- a/Marlin/src/config/examples/Malyan/M200/Configuration.h
+++ b/Marlin/src/config/examples/Malyan/M200/Configuration.h
@@ -156,13 +156,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -1837,6 +1838,15 @@
//
//#define SILVER_GATE_GLCD_CONTROLLER
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/examples/Malyan/M200/Configuration_adv.h b/Marlin/src/config/examples/Malyan/M200/Configuration_adv.h
index 4268be7a5e..b06a06ca3c 100644
--- a/Marlin/src/config/examples/Malyan/M200/Configuration_adv.h
+++ b/Marlin/src/config/examples/Malyan/M200/Configuration_adv.h
@@ -701,6 +701,22 @@
#define USB_INTR_PIN SD_DETECT_PIN
#endif
+ /**
+ * When using a bootloader that supports SD-Firmware-Flashing,
+ * add a menu item to activate SD-FW-Update on the next reboot.
+ *
+ * Requires ATMEGA2560 (Arduino Mega)
+ *
+ * Tested with this bootloader:
+ * https://github.com/FleetProbe/MicroBridge-Arduino-ATMega2560
+ */
+ //#define SD_FIRMWARE_UPDATE
+ #if ENABLED(SD_FIRMWARE_UPDATE)
+ #define SD_FIRMWARE_UPDATE_EEPROM_ADDR 0x1FF
+ #define SD_FIRMWARE_UPDATE_ACTIVE_VALUE 0xF0
+ #define SD_FIRMWARE_UPDATE_INACTIVE_VALUE 0xFF
+ #endif
+
#endif // SDSUPPORT
/**
diff --git a/Marlin/src/config/examples/Micromake/C1/basic/Configuration.h b/Marlin/src/config/examples/Micromake/C1/basic/Configuration.h
index 7adeb4dcf4..d9bde36378 100644
--- a/Marlin/src/config/examples/Micromake/C1/basic/Configuration.h
+++ b/Marlin/src/config/examples/Micromake/C1/basic/Configuration.h
@@ -156,13 +156,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -1842,6 +1843,15 @@
//
//#define SILVER_GATE_GLCD_CONTROLLER
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/examples/Micromake/C1/enhanced/Configuration.h b/Marlin/src/config/examples/Micromake/C1/enhanced/Configuration.h
index a06c1fb872..50e44abf14 100644
--- a/Marlin/src/config/examples/Micromake/C1/enhanced/Configuration.h
+++ b/Marlin/src/config/examples/Micromake/C1/enhanced/Configuration.h
@@ -156,13 +156,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -1842,6 +1843,15 @@
//
//#define SILVER_GATE_GLCD_CONTROLLER
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/examples/Micromake/C1/enhanced/Configuration_adv.h b/Marlin/src/config/examples/Micromake/C1/enhanced/Configuration_adv.h
index 1edfb461dc..1de3daa1c2 100644
--- a/Marlin/src/config/examples/Micromake/C1/enhanced/Configuration_adv.h
+++ b/Marlin/src/config/examples/Micromake/C1/enhanced/Configuration_adv.h
@@ -701,6 +701,22 @@
#define USB_INTR_PIN SD_DETECT_PIN
#endif
+ /**
+ * When using a bootloader that supports SD-Firmware-Flashing,
+ * add a menu item to activate SD-FW-Update on the next reboot.
+ *
+ * Requires ATMEGA2560 (Arduino Mega)
+ *
+ * Tested with this bootloader:
+ * https://github.com/FleetProbe/MicroBridge-Arduino-ATMega2560
+ */
+ //#define SD_FIRMWARE_UPDATE
+ #if ENABLED(SD_FIRMWARE_UPDATE)
+ #define SD_FIRMWARE_UPDATE_EEPROM_ADDR 0x1FF
+ #define SD_FIRMWARE_UPDATE_ACTIVE_VALUE 0xF0
+ #define SD_FIRMWARE_UPDATE_INACTIVE_VALUE 0xFF
+ #endif
+
#endif // SDSUPPORT
/**
diff --git a/Marlin/src/config/examples/Mks/Sbase/Configuration.h b/Marlin/src/config/examples/Mks/Sbase/Configuration.h
index 89d7b24644..f9b59a4379 100644
--- a/Marlin/src/config/examples/Mks/Sbase/Configuration.h
+++ b/Marlin/src/config/examples/Mks/Sbase/Configuration.h
@@ -156,13 +156,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -1838,6 +1839,15 @@
//
//#define SILVER_GATE_GLCD_CONTROLLER
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/examples/Mks/Sbase/Configuration_adv.h b/Marlin/src/config/examples/Mks/Sbase/Configuration_adv.h
index 5c6f2f4f84..a2aead390a 100644
--- a/Marlin/src/config/examples/Mks/Sbase/Configuration_adv.h
+++ b/Marlin/src/config/examples/Mks/Sbase/Configuration_adv.h
@@ -702,6 +702,22 @@
#define USB_INTR_PIN SD_DETECT_PIN
#endif
+ /**
+ * When using a bootloader that supports SD-Firmware-Flashing,
+ * add a menu item to activate SD-FW-Update on the next reboot.
+ *
+ * Requires ATMEGA2560 (Arduino Mega)
+ *
+ * Tested with this bootloader:
+ * https://github.com/FleetProbe/MicroBridge-Arduino-ATMega2560
+ */
+ //#define SD_FIRMWARE_UPDATE
+ #if ENABLED(SD_FIRMWARE_UPDATE)
+ #define SD_FIRMWARE_UPDATE_EEPROM_ADDR 0x1FF
+ #define SD_FIRMWARE_UPDATE_ACTIVE_VALUE 0xF0
+ #define SD_FIRMWARE_UPDATE_INACTIVE_VALUE 0xFF
+ #endif
+
#endif // SDSUPPORT
/**
diff --git a/Marlin/src/config/examples/RepRapPro/Huxley/Configuration.h b/Marlin/src/config/examples/RepRapPro/Huxley/Configuration.h
index 55f452d495..ecfc4169ba 100644
--- a/Marlin/src/config/examples/RepRapPro/Huxley/Configuration.h
+++ b/Marlin/src/config/examples/RepRapPro/Huxley/Configuration.h
@@ -156,13 +156,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -1887,6 +1888,15 @@ Black rubber belt(MXL), 18 - tooth aluminium pulley : 87.489 step per mm (Huxley
//
//#define SILVER_GATE_GLCD_CONTROLLER
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/examples/RepRapWorld/Megatronics/Configuration.h b/Marlin/src/config/examples/RepRapWorld/Megatronics/Configuration.h
index da7f1f205a..bd03d85ba4 100644
--- a/Marlin/src/config/examples/RepRapWorld/Megatronics/Configuration.h
+++ b/Marlin/src/config/examples/RepRapWorld/Megatronics/Configuration.h
@@ -156,13 +156,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -1838,6 +1839,15 @@
//
//#define SILVER_GATE_GLCD_CONTROLLER
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/examples/RigidBot/Configuration.h b/Marlin/src/config/examples/RigidBot/Configuration.h
index ce9ebb6ce8..1f424210c3 100644
--- a/Marlin/src/config/examples/RigidBot/Configuration.h
+++ b/Marlin/src/config/examples/RigidBot/Configuration.h
@@ -159,13 +159,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -1838,6 +1839,15 @@
//
//#define SILVER_GATE_GLCD_CONTROLLER
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/examples/RigidBot/Configuration_adv.h b/Marlin/src/config/examples/RigidBot/Configuration_adv.h
index dd35eff906..fe5bea5431 100644
--- a/Marlin/src/config/examples/RigidBot/Configuration_adv.h
+++ b/Marlin/src/config/examples/RigidBot/Configuration_adv.h
@@ -701,6 +701,22 @@
#define USB_INTR_PIN SD_DETECT_PIN
#endif
+ /**
+ * When using a bootloader that supports SD-Firmware-Flashing,
+ * add a menu item to activate SD-FW-Update on the next reboot.
+ *
+ * Requires ATMEGA2560 (Arduino Mega)
+ *
+ * Tested with this bootloader:
+ * https://github.com/FleetProbe/MicroBridge-Arduino-ATMega2560
+ */
+ //#define SD_FIRMWARE_UPDATE
+ #if ENABLED(SD_FIRMWARE_UPDATE)
+ #define SD_FIRMWARE_UPDATE_EEPROM_ADDR 0x1FF
+ #define SD_FIRMWARE_UPDATE_ACTIVE_VALUE 0xF0
+ #define SD_FIRMWARE_UPDATE_INACTIVE_VALUE 0xFF
+ #endif
+
#endif // SDSUPPORT
/**
diff --git a/Marlin/src/config/examples/SCARA/Configuration.h b/Marlin/src/config/examples/SCARA/Configuration.h
index e50a7bdd45..9636ce618b 100644
--- a/Marlin/src/config/examples/SCARA/Configuration.h
+++ b/Marlin/src/config/examples/SCARA/Configuration.h
@@ -187,13 +187,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -1851,6 +1852,15 @@
//
//#define SILVER_GATE_GLCD_CONTROLLER
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/examples/SCARA/Configuration_adv.h b/Marlin/src/config/examples/SCARA/Configuration_adv.h
index 10f4bb1d71..79b1eac2b4 100644
--- a/Marlin/src/config/examples/SCARA/Configuration_adv.h
+++ b/Marlin/src/config/examples/SCARA/Configuration_adv.h
@@ -701,6 +701,22 @@
#define USB_INTR_PIN SD_DETECT_PIN
#endif
+ /**
+ * When using a bootloader that supports SD-Firmware-Flashing,
+ * add a menu item to activate SD-FW-Update on the next reboot.
+ *
+ * Requires ATMEGA2560 (Arduino Mega)
+ *
+ * Tested with this bootloader:
+ * https://github.com/FleetProbe/MicroBridge-Arduino-ATMega2560
+ */
+ //#define SD_FIRMWARE_UPDATE
+ #if ENABLED(SD_FIRMWARE_UPDATE)
+ #define SD_FIRMWARE_UPDATE_EEPROM_ADDR 0x1FF
+ #define SD_FIRMWARE_UPDATE_ACTIVE_VALUE 0xF0
+ #define SD_FIRMWARE_UPDATE_INACTIVE_VALUE 0xFF
+ #endif
+
#endif // SDSUPPORT
/**
diff --git a/Marlin/src/config/examples/STM32F10/Configuration.h b/Marlin/src/config/examples/STM32F10/Configuration.h
index d442de78bc..ebf9692437 100644
--- a/Marlin/src/config/examples/STM32F10/Configuration.h
+++ b/Marlin/src/config/examples/STM32F10/Configuration.h
@@ -156,13 +156,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -1840,6 +1841,15 @@
//
//#define SILVER_GATE_GLCD_CONTROLLER
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/examples/STM32F4/Configuration.h b/Marlin/src/config/examples/STM32F4/Configuration.h
index 9b18f33bdd..bc854532d6 100644
--- a/Marlin/src/config/examples/STM32F4/Configuration.h
+++ b/Marlin/src/config/examples/STM32F4/Configuration.h
@@ -156,13 +156,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -1838,6 +1839,15 @@
//
//#define SILVER_GATE_GLCD_CONTROLLER
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/examples/Sanguinololu/Configuration.h b/Marlin/src/config/examples/Sanguinololu/Configuration.h
index a6be78e95c..65a7fd9c15 100644
--- a/Marlin/src/config/examples/Sanguinololu/Configuration.h
+++ b/Marlin/src/config/examples/Sanguinololu/Configuration.h
@@ -156,13 +156,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -1869,6 +1870,15 @@
//
//#define SILVER_GATE_GLCD_CONTROLLER
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/examples/Sanguinololu/Configuration_adv.h b/Marlin/src/config/examples/Sanguinololu/Configuration_adv.h
index 29c49923d7..5c1cf8531c 100644
--- a/Marlin/src/config/examples/Sanguinololu/Configuration_adv.h
+++ b/Marlin/src/config/examples/Sanguinololu/Configuration_adv.h
@@ -701,6 +701,22 @@
#define USB_INTR_PIN SD_DETECT_PIN
#endif
+ /**
+ * When using a bootloader that supports SD-Firmware-Flashing,
+ * add a menu item to activate SD-FW-Update on the next reboot.
+ *
+ * Requires ATMEGA2560 (Arduino Mega)
+ *
+ * Tested with this bootloader:
+ * https://github.com/FleetProbe/MicroBridge-Arduino-ATMega2560
+ */
+ //#define SD_FIRMWARE_UPDATE
+ #if ENABLED(SD_FIRMWARE_UPDATE)
+ #define SD_FIRMWARE_UPDATE_EEPROM_ADDR 0x1FF
+ #define SD_FIRMWARE_UPDATE_ACTIVE_VALUE 0xF0
+ #define SD_FIRMWARE_UPDATE_INACTIVE_VALUE 0xFF
+ #endif
+
#endif // SDSUPPORT
/**
diff --git a/Marlin/src/config/examples/TheBorg/Configuration.h b/Marlin/src/config/examples/TheBorg/Configuration.h
index 371d374231..8bcb9b8f9f 100644
--- a/Marlin/src/config/examples/TheBorg/Configuration.h
+++ b/Marlin/src/config/examples/TheBorg/Configuration.h
@@ -156,13 +156,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -1838,6 +1839,15 @@
//
//#define SILVER_GATE_GLCD_CONTROLLER
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/examples/TheBorg/Configuration_adv.h b/Marlin/src/config/examples/TheBorg/Configuration_adv.h
index 1bdd1fa64a..53632ab191 100644
--- a/Marlin/src/config/examples/TheBorg/Configuration_adv.h
+++ b/Marlin/src/config/examples/TheBorg/Configuration_adv.h
@@ -701,6 +701,22 @@
#define USB_INTR_PIN SD_DETECT_PIN
#endif
+ /**
+ * When using a bootloader that supports SD-Firmware-Flashing,
+ * add a menu item to activate SD-FW-Update on the next reboot.
+ *
+ * Requires ATMEGA2560 (Arduino Mega)
+ *
+ * Tested with this bootloader:
+ * https://github.com/FleetProbe/MicroBridge-Arduino-ATMega2560
+ */
+ //#define SD_FIRMWARE_UPDATE
+ #if ENABLED(SD_FIRMWARE_UPDATE)
+ #define SD_FIRMWARE_UPDATE_EEPROM_ADDR 0x1FF
+ #define SD_FIRMWARE_UPDATE_ACTIVE_VALUE 0xF0
+ #define SD_FIRMWARE_UPDATE_INACTIVE_VALUE 0xFF
+ #endif
+
#endif // SDSUPPORT
/**
diff --git a/Marlin/src/config/examples/TinyBoy2/Configuration.h b/Marlin/src/config/examples/TinyBoy2/Configuration.h
index 0cd5706c14..9176de6f4f 100644
--- a/Marlin/src/config/examples/TinyBoy2/Configuration.h
+++ b/Marlin/src/config/examples/TinyBoy2/Configuration.h
@@ -178,13 +178,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -1894,6 +1895,15 @@
//
//#define SILVER_GATE_GLCD_CONTROLLER
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/examples/TinyBoy2/Configuration_adv.h b/Marlin/src/config/examples/TinyBoy2/Configuration_adv.h
index 007464732a..97e8d2a709 100644
--- a/Marlin/src/config/examples/TinyBoy2/Configuration_adv.h
+++ b/Marlin/src/config/examples/TinyBoy2/Configuration_adv.h
@@ -701,6 +701,22 @@
#define USB_INTR_PIN SD_DETECT_PIN
#endif
+ /**
+ * When using a bootloader that supports SD-Firmware-Flashing,
+ * add a menu item to activate SD-FW-Update on the next reboot.
+ *
+ * Requires ATMEGA2560 (Arduino Mega)
+ *
+ * Tested with this bootloader:
+ * https://github.com/FleetProbe/MicroBridge-Arduino-ATMega2560
+ */
+ //#define SD_FIRMWARE_UPDATE
+ #if ENABLED(SD_FIRMWARE_UPDATE)
+ #define SD_FIRMWARE_UPDATE_EEPROM_ADDR 0x1FF
+ #define SD_FIRMWARE_UPDATE_ACTIVE_VALUE 0xF0
+ #define SD_FIRMWARE_UPDATE_INACTIVE_VALUE 0xFF
+ #endif
+
#endif // SDSUPPORT
/**
diff --git a/Marlin/src/config/examples/Tronxy/X1/Configuration.h b/Marlin/src/config/examples/Tronxy/X1/Configuration.h
index a68f13dde5..554bb2d8d1 100644
--- a/Marlin/src/config/examples/Tronxy/X1/Configuration.h
+++ b/Marlin/src/config/examples/Tronxy/X1/Configuration.h
@@ -156,13 +156,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -1838,6 +1839,15 @@
//
//#define SILVER_GATE_GLCD_CONTROLLER
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/examples/Tronxy/X3A/Configuration.h b/Marlin/src/config/examples/Tronxy/X3A/Configuration.h
index 8edec5528d..e1895fe2d8 100644
--- a/Marlin/src/config/examples/Tronxy/X3A/Configuration.h
+++ b/Marlin/src/config/examples/Tronxy/X3A/Configuration.h
@@ -156,13 +156,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -1842,6 +1843,15 @@
//
//#define SILVER_GATE_GLCD_CONTROLLER
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/examples/Tronxy/X3A/Configuration_adv.h b/Marlin/src/config/examples/Tronxy/X3A/Configuration_adv.h
index ac5d6ee778..5a5e6b11f8 100644
--- a/Marlin/src/config/examples/Tronxy/X3A/Configuration_adv.h
+++ b/Marlin/src/config/examples/Tronxy/X3A/Configuration_adv.h
@@ -701,6 +701,22 @@
#define USB_INTR_PIN SD_DETECT_PIN
#endif
+ /**
+ * When using a bootloader that supports SD-Firmware-Flashing,
+ * add a menu item to activate SD-FW-Update on the next reboot.
+ *
+ * Requires ATMEGA2560 (Arduino Mega)
+ *
+ * Tested with this bootloader:
+ * https://github.com/FleetProbe/MicroBridge-Arduino-ATMega2560
+ */
+ //#define SD_FIRMWARE_UPDATE
+ #if ENABLED(SD_FIRMWARE_UPDATE)
+ #define SD_FIRMWARE_UPDATE_EEPROM_ADDR 0x1FF
+ #define SD_FIRMWARE_UPDATE_ACTIVE_VALUE 0xF0
+ #define SD_FIRMWARE_UPDATE_INACTIVE_VALUE 0xFF
+ #endif
+
#endif // SDSUPPORT
/**
diff --git a/Marlin/src/config/examples/Tronxy/X5S/Configuration.h b/Marlin/src/config/examples/Tronxy/X5S/Configuration.h
index c47557263d..3064d10f3e 100644
--- a/Marlin/src/config/examples/Tronxy/X5S/Configuration.h
+++ b/Marlin/src/config/examples/Tronxy/X5S/Configuration.h
@@ -156,13 +156,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -1838,6 +1839,15 @@
//
//#define SILVER_GATE_GLCD_CONTROLLER
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/examples/Tronxy/XY100/Configuration.h b/Marlin/src/config/examples/Tronxy/XY100/Configuration.h
index af65ff2631..b5b18ccdd3 100644
--- a/Marlin/src/config/examples/Tronxy/XY100/Configuration.h
+++ b/Marlin/src/config/examples/Tronxy/XY100/Configuration.h
@@ -156,13 +156,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -1849,6 +1850,15 @@
//
//#define SILVER_GATE_GLCD_CONTROLLER
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/examples/UltiMachine/Archim2/Configuration.h b/Marlin/src/config/examples/UltiMachine/Archim2/Configuration.h
index 06a498819c..fe2cac4b7d 100644
--- a/Marlin/src/config/examples/UltiMachine/Archim2/Configuration.h
+++ b/Marlin/src/config/examples/UltiMachine/Archim2/Configuration.h
@@ -156,13 +156,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -1838,6 +1839,15 @@
//
//#define SILVER_GATE_GLCD_CONTROLLER
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/examples/UltiMachine/Archim2/Configuration_adv.h b/Marlin/src/config/examples/UltiMachine/Archim2/Configuration_adv.h
index 743f206063..af755263ad 100644
--- a/Marlin/src/config/examples/UltiMachine/Archim2/Configuration_adv.h
+++ b/Marlin/src/config/examples/UltiMachine/Archim2/Configuration_adv.h
@@ -701,6 +701,22 @@
#define USB_INTR_PIN SD_DETECT_PIN
#endif
+ /**
+ * When using a bootloader that supports SD-Firmware-Flashing,
+ * add a menu item to activate SD-FW-Update on the next reboot.
+ *
+ * Requires ATMEGA2560 (Arduino Mega)
+ *
+ * Tested with this bootloader:
+ * https://github.com/FleetProbe/MicroBridge-Arduino-ATMega2560
+ */
+ //#define SD_FIRMWARE_UPDATE
+ #if ENABLED(SD_FIRMWARE_UPDATE)
+ #define SD_FIRMWARE_UPDATE_EEPROM_ADDR 0x1FF
+ #define SD_FIRMWARE_UPDATE_ACTIVE_VALUE 0xF0
+ #define SD_FIRMWARE_UPDATE_INACTIVE_VALUE 0xFF
+ #endif
+
#endif // SDSUPPORT
/**
diff --git a/Marlin/src/config/examples/Velleman/K8200/Configuration.h b/Marlin/src/config/examples/Velleman/K8200/Configuration.h
index 66b72697ca..519b346a1c 100644
--- a/Marlin/src/config/examples/Velleman/K8200/Configuration.h
+++ b/Marlin/src/config/examples/Velleman/K8200/Configuration.h
@@ -176,13 +176,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -1873,6 +1874,15 @@
#endif // K8200_VM8201
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/examples/Velleman/K8200/Configuration_adv.h b/Marlin/src/config/examples/Velleman/K8200/Configuration_adv.h
index fd18d8cb40..fa03df008e 100644
--- a/Marlin/src/config/examples/Velleman/K8200/Configuration_adv.h
+++ b/Marlin/src/config/examples/Velleman/K8200/Configuration_adv.h
@@ -714,6 +714,22 @@
#define USB_INTR_PIN SD_DETECT_PIN
#endif
+ /**
+ * When using a bootloader that supports SD-Firmware-Flashing,
+ * add a menu item to activate SD-FW-Update on the next reboot.
+ *
+ * Requires ATMEGA2560 (Arduino Mega)
+ *
+ * Tested with this bootloader:
+ * https://github.com/FleetProbe/MicroBridge-Arduino-ATMega2560
+ */
+ //#define SD_FIRMWARE_UPDATE
+ #if ENABLED(SD_FIRMWARE_UPDATE)
+ #define SD_FIRMWARE_UPDATE_EEPROM_ADDR 0x1FF
+ #define SD_FIRMWARE_UPDATE_ACTIVE_VALUE 0xF0
+ #define SD_FIRMWARE_UPDATE_INACTIVE_VALUE 0xFF
+ #endif
+
#endif // SDSUPPORT
/**
diff --git a/Marlin/src/config/examples/Velleman/K8400/Configuration.h b/Marlin/src/config/examples/Velleman/K8400/Configuration.h
index 8a14f3aa29..cc56b0eb16 100644
--- a/Marlin/src/config/examples/Velleman/K8400/Configuration.h
+++ b/Marlin/src/config/examples/Velleman/K8400/Configuration.h
@@ -156,13 +156,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -1838,6 +1839,15 @@
//
//#define SILVER_GATE_GLCD_CONTROLLER
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/examples/Velleman/K8400/Configuration_adv.h b/Marlin/src/config/examples/Velleman/K8400/Configuration_adv.h
index 63fbd5654f..234f0a7725 100644
--- a/Marlin/src/config/examples/Velleman/K8400/Configuration_adv.h
+++ b/Marlin/src/config/examples/Velleman/K8400/Configuration_adv.h
@@ -701,6 +701,22 @@
#define USB_INTR_PIN SD_DETECT_PIN
#endif
+ /**
+ * When using a bootloader that supports SD-Firmware-Flashing,
+ * add a menu item to activate SD-FW-Update on the next reboot.
+ *
+ * Requires ATMEGA2560 (Arduino Mega)
+ *
+ * Tested with this bootloader:
+ * https://github.com/FleetProbe/MicroBridge-Arduino-ATMega2560
+ */
+ //#define SD_FIRMWARE_UPDATE
+ #if ENABLED(SD_FIRMWARE_UPDATE)
+ #define SD_FIRMWARE_UPDATE_EEPROM_ADDR 0x1FF
+ #define SD_FIRMWARE_UPDATE_ACTIVE_VALUE 0xF0
+ #define SD_FIRMWARE_UPDATE_INACTIVE_VALUE 0xFF
+ #endif
+
#endif // SDSUPPORT
/**
diff --git a/Marlin/src/config/examples/Velleman/K8400/Dual-head/Configuration.h b/Marlin/src/config/examples/Velleman/K8400/Dual-head/Configuration.h
index 9c7a1ecb71..2b86351e53 100644
--- a/Marlin/src/config/examples/Velleman/K8400/Dual-head/Configuration.h
+++ b/Marlin/src/config/examples/Velleman/K8400/Dual-head/Configuration.h
@@ -156,13 +156,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -1838,6 +1839,15 @@
//
//#define SILVER_GATE_GLCD_CONTROLLER
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/examples/Wanhao/Duplicator 6/Configuration.h b/Marlin/src/config/examples/Wanhao/Duplicator 6/Configuration.h
index c7f228712a..5e42fc387e 100644
--- a/Marlin/src/config/examples/Wanhao/Duplicator 6/Configuration.h
+++ b/Marlin/src/config/examples/Wanhao/Duplicator 6/Configuration.h
@@ -156,13 +156,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -1851,6 +1852,15 @@
//
//#define SILVER_GATE_GLCD_CONTROLLER
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/examples/Wanhao/Duplicator 6/Configuration_adv.h b/Marlin/src/config/examples/Wanhao/Duplicator 6/Configuration_adv.h
index 1a4a06eb6c..cb6a534cf9 100644
--- a/Marlin/src/config/examples/Wanhao/Duplicator 6/Configuration_adv.h
+++ b/Marlin/src/config/examples/Wanhao/Duplicator 6/Configuration_adv.h
@@ -703,6 +703,22 @@
#define USB_INTR_PIN SD_DETECT_PIN
#endif
+ /**
+ * When using a bootloader that supports SD-Firmware-Flashing,
+ * add a menu item to activate SD-FW-Update on the next reboot.
+ *
+ * Requires ATMEGA2560 (Arduino Mega)
+ *
+ * Tested with this bootloader:
+ * https://github.com/FleetProbe/MicroBridge-Arduino-ATMega2560
+ */
+ //#define SD_FIRMWARE_UPDATE
+ #if ENABLED(SD_FIRMWARE_UPDATE)
+ #define SD_FIRMWARE_UPDATE_EEPROM_ADDR 0x1FF
+ #define SD_FIRMWARE_UPDATE_ACTIVE_VALUE 0xF0
+ #define SD_FIRMWARE_UPDATE_INACTIVE_VALUE 0xFF
+ #endif
+
#endif // SDSUPPORT
/**
diff --git a/Marlin/src/config/examples/adafruit/ST7565/Configuration.h b/Marlin/src/config/examples/adafruit/ST7565/Configuration.h
index 22aa1cc0e0..b9bc8afa40 100644
--- a/Marlin/src/config/examples/adafruit/ST7565/Configuration.h
+++ b/Marlin/src/config/examples/adafruit/ST7565/Configuration.h
@@ -156,13 +156,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -1838,6 +1839,15 @@
//
//#define SILVER_GATE_GLCD_CONTROLLER
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/examples/delta/Anycubic/Kossel/Configuration.h b/Marlin/src/config/examples/delta/Anycubic/Kossel/Configuration.h
index 901e92e904..01ef6667db 100644
--- a/Marlin/src/config/examples/delta/Anycubic/Kossel/Configuration.h
+++ b/Marlin/src/config/examples/delta/Anycubic/Kossel/Configuration.h
@@ -169,13 +169,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -2029,6 +2030,15 @@
//
//#define SILVER_GATE_GLCD_CONTROLLER
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/examples/delta/Anycubic/Kossel/Configuration_adv.h b/Marlin/src/config/examples/delta/Anycubic/Kossel/Configuration_adv.h
index 694627bcba..d338155c5c 100644
--- a/Marlin/src/config/examples/delta/Anycubic/Kossel/Configuration_adv.h
+++ b/Marlin/src/config/examples/delta/Anycubic/Kossel/Configuration_adv.h
@@ -703,6 +703,22 @@
#define USB_INTR_PIN SD_DETECT_PIN
#endif
+ /**
+ * When using a bootloader that supports SD-Firmware-Flashing,
+ * add a menu item to activate SD-FW-Update on the next reboot.
+ *
+ * Requires ATMEGA2560 (Arduino Mega)
+ *
+ * Tested with this bootloader:
+ * https://github.com/FleetProbe/MicroBridge-Arduino-ATMega2560
+ */
+ //#define SD_FIRMWARE_UPDATE
+ #if ENABLED(SD_FIRMWARE_UPDATE)
+ #define SD_FIRMWARE_UPDATE_EEPROM_ADDR 0x1FF
+ #define SD_FIRMWARE_UPDATE_ACTIVE_VALUE 0xF0
+ #define SD_FIRMWARE_UPDATE_INACTIVE_VALUE 0xFF
+ #endif
+
#endif // SDSUPPORT
/**
diff --git a/Marlin/src/config/examples/delta/FLSUN/auto_calibrate/Configuration.h b/Marlin/src/config/examples/delta/FLSUN/auto_calibrate/Configuration.h
index c9b2dd4ece..4ca4c430e6 100644
--- a/Marlin/src/config/examples/delta/FLSUN/auto_calibrate/Configuration.h
+++ b/Marlin/src/config/examples/delta/FLSUN/auto_calibrate/Configuration.h
@@ -156,13 +156,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -1966,6 +1967,15 @@
//
//#define SILVER_GATE_GLCD_CONTROLLER
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/examples/delta/FLSUN/auto_calibrate/Configuration_adv.h b/Marlin/src/config/examples/delta/FLSUN/auto_calibrate/Configuration_adv.h
index 7ae031880e..b0c792eeb7 100644
--- a/Marlin/src/config/examples/delta/FLSUN/auto_calibrate/Configuration_adv.h
+++ b/Marlin/src/config/examples/delta/FLSUN/auto_calibrate/Configuration_adv.h
@@ -703,6 +703,22 @@
#define USB_INTR_PIN SD_DETECT_PIN
#endif
+ /**
+ * When using a bootloader that supports SD-Firmware-Flashing,
+ * add a menu item to activate SD-FW-Update on the next reboot.
+ *
+ * Requires ATMEGA2560 (Arduino Mega)
+ *
+ * Tested with this bootloader:
+ * https://github.com/FleetProbe/MicroBridge-Arduino-ATMega2560
+ */
+ //#define SD_FIRMWARE_UPDATE
+ #if ENABLED(SD_FIRMWARE_UPDATE)
+ #define SD_FIRMWARE_UPDATE_EEPROM_ADDR 0x1FF
+ #define SD_FIRMWARE_UPDATE_ACTIVE_VALUE 0xF0
+ #define SD_FIRMWARE_UPDATE_INACTIVE_VALUE 0xFF
+ #endif
+
#endif // SDSUPPORT
/**
diff --git a/Marlin/src/config/examples/delta/FLSUN/kossel/Configuration.h b/Marlin/src/config/examples/delta/FLSUN/kossel/Configuration.h
index 20f60f6908..3c68ba523c 100644
--- a/Marlin/src/config/examples/delta/FLSUN/kossel/Configuration.h
+++ b/Marlin/src/config/examples/delta/FLSUN/kossel/Configuration.h
@@ -156,13 +156,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -1965,6 +1966,15 @@
//
//#define SILVER_GATE_GLCD_CONTROLLER
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/examples/delta/FLSUN/kossel/Configuration_adv.h b/Marlin/src/config/examples/delta/FLSUN/kossel/Configuration_adv.h
index 7ae031880e..b0c792eeb7 100644
--- a/Marlin/src/config/examples/delta/FLSUN/kossel/Configuration_adv.h
+++ b/Marlin/src/config/examples/delta/FLSUN/kossel/Configuration_adv.h
@@ -703,6 +703,22 @@
#define USB_INTR_PIN SD_DETECT_PIN
#endif
+ /**
+ * When using a bootloader that supports SD-Firmware-Flashing,
+ * add a menu item to activate SD-FW-Update on the next reboot.
+ *
+ * Requires ATMEGA2560 (Arduino Mega)
+ *
+ * Tested with this bootloader:
+ * https://github.com/FleetProbe/MicroBridge-Arduino-ATMega2560
+ */
+ //#define SD_FIRMWARE_UPDATE
+ #if ENABLED(SD_FIRMWARE_UPDATE)
+ #define SD_FIRMWARE_UPDATE_EEPROM_ADDR 0x1FF
+ #define SD_FIRMWARE_UPDATE_ACTIVE_VALUE 0xF0
+ #define SD_FIRMWARE_UPDATE_INACTIVE_VALUE 0xFF
+ #endif
+
#endif // SDSUPPORT
/**
diff --git a/Marlin/src/config/examples/delta/FLSUN/kossel_mini/Configuration.h b/Marlin/src/config/examples/delta/FLSUN/kossel_mini/Configuration.h
index 467277358f..32a85329d3 100644
--- a/Marlin/src/config/examples/delta/FLSUN/kossel_mini/Configuration.h
+++ b/Marlin/src/config/examples/delta/FLSUN/kossel_mini/Configuration.h
@@ -156,13 +156,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -1965,6 +1966,15 @@
//
//#define SILVER_GATE_GLCD_CONTROLLER
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/examples/delta/FLSUN/kossel_mini/Configuration_adv.h b/Marlin/src/config/examples/delta/FLSUN/kossel_mini/Configuration_adv.h
index e9924066d7..de8490e3c7 100644
--- a/Marlin/src/config/examples/delta/FLSUN/kossel_mini/Configuration_adv.h
+++ b/Marlin/src/config/examples/delta/FLSUN/kossel_mini/Configuration_adv.h
@@ -703,6 +703,22 @@
#define USB_INTR_PIN SD_DETECT_PIN
#endif
+ /**
+ * When using a bootloader that supports SD-Firmware-Flashing,
+ * add a menu item to activate SD-FW-Update on the next reboot.
+ *
+ * Requires ATMEGA2560 (Arduino Mega)
+ *
+ * Tested with this bootloader:
+ * https://github.com/FleetProbe/MicroBridge-Arduino-ATMega2560
+ */
+ //#define SD_FIRMWARE_UPDATE
+ #if ENABLED(SD_FIRMWARE_UPDATE)
+ #define SD_FIRMWARE_UPDATE_EEPROM_ADDR 0x1FF
+ #define SD_FIRMWARE_UPDATE_ACTIVE_VALUE 0xF0
+ #define SD_FIRMWARE_UPDATE_INACTIVE_VALUE 0xFF
+ #endif
+
#endif // SDSUPPORT
/**
diff --git a/Marlin/src/config/examples/delta/Hatchbox_Alpha/Configuration.h b/Marlin/src/config/examples/delta/Hatchbox_Alpha/Configuration.h
index bfcf8752d2..b66318b25d 100644
--- a/Marlin/src/config/examples/delta/Hatchbox_Alpha/Configuration.h
+++ b/Marlin/src/config/examples/delta/Hatchbox_Alpha/Configuration.h
@@ -161,13 +161,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -1968,6 +1969,15 @@
//
//#define SILVER_GATE_GLCD_CONTROLLER
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/examples/delta/generic/Configuration.h b/Marlin/src/config/examples/delta/generic/Configuration.h
index 55bbb258e4..4a48398b1d 100644
--- a/Marlin/src/config/examples/delta/generic/Configuration.h
+++ b/Marlin/src/config/examples/delta/generic/Configuration.h
@@ -156,13 +156,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -1953,6 +1954,15 @@
//
//#define SILVER_GATE_GLCD_CONTROLLER
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/examples/delta/generic/Configuration_adv.h b/Marlin/src/config/examples/delta/generic/Configuration_adv.h
index e9924066d7..de8490e3c7 100644
--- a/Marlin/src/config/examples/delta/generic/Configuration_adv.h
+++ b/Marlin/src/config/examples/delta/generic/Configuration_adv.h
@@ -703,6 +703,22 @@
#define USB_INTR_PIN SD_DETECT_PIN
#endif
+ /**
+ * When using a bootloader that supports SD-Firmware-Flashing,
+ * add a menu item to activate SD-FW-Update on the next reboot.
+ *
+ * Requires ATMEGA2560 (Arduino Mega)
+ *
+ * Tested with this bootloader:
+ * https://github.com/FleetProbe/MicroBridge-Arduino-ATMega2560
+ */
+ //#define SD_FIRMWARE_UPDATE
+ #if ENABLED(SD_FIRMWARE_UPDATE)
+ #define SD_FIRMWARE_UPDATE_EEPROM_ADDR 0x1FF
+ #define SD_FIRMWARE_UPDATE_ACTIVE_VALUE 0xF0
+ #define SD_FIRMWARE_UPDATE_INACTIVE_VALUE 0xFF
+ #endif
+
#endif // SDSUPPORT
/**
diff --git a/Marlin/src/config/examples/delta/kossel_mini/Configuration.h b/Marlin/src/config/examples/delta/kossel_mini/Configuration.h
index 61d50c9358..8a41a79e5b 100644
--- a/Marlin/src/config/examples/delta/kossel_mini/Configuration.h
+++ b/Marlin/src/config/examples/delta/kossel_mini/Configuration.h
@@ -156,13 +156,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -1955,6 +1956,15 @@
//
//#define SILVER_GATE_GLCD_CONTROLLER
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/examples/delta/kossel_mini/Configuration_adv.h b/Marlin/src/config/examples/delta/kossel_mini/Configuration_adv.h
index e9924066d7..de8490e3c7 100644
--- a/Marlin/src/config/examples/delta/kossel_mini/Configuration_adv.h
+++ b/Marlin/src/config/examples/delta/kossel_mini/Configuration_adv.h
@@ -703,6 +703,22 @@
#define USB_INTR_PIN SD_DETECT_PIN
#endif
+ /**
+ * When using a bootloader that supports SD-Firmware-Flashing,
+ * add a menu item to activate SD-FW-Update on the next reboot.
+ *
+ * Requires ATMEGA2560 (Arduino Mega)
+ *
+ * Tested with this bootloader:
+ * https://github.com/FleetProbe/MicroBridge-Arduino-ATMega2560
+ */
+ //#define SD_FIRMWARE_UPDATE
+ #if ENABLED(SD_FIRMWARE_UPDATE)
+ #define SD_FIRMWARE_UPDATE_EEPROM_ADDR 0x1FF
+ #define SD_FIRMWARE_UPDATE_ACTIVE_VALUE 0xF0
+ #define SD_FIRMWARE_UPDATE_INACTIVE_VALUE 0xFF
+ #endif
+
#endif // SDSUPPORT
/**
diff --git a/Marlin/src/config/examples/delta/kossel_pro/Configuration.h b/Marlin/src/config/examples/delta/kossel_pro/Configuration.h
index 43a0760ab3..22aec04913 100644
--- a/Marlin/src/config/examples/delta/kossel_pro/Configuration.h
+++ b/Marlin/src/config/examples/delta/kossel_pro/Configuration.h
@@ -160,13 +160,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -1956,6 +1957,15 @@
//
//#define SILVER_GATE_GLCD_CONTROLLER
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/examples/delta/kossel_xl/Configuration.h b/Marlin/src/config/examples/delta/kossel_xl/Configuration.h
index 0619d062b6..1f45169d37 100644
--- a/Marlin/src/config/examples/delta/kossel_xl/Configuration.h
+++ b/Marlin/src/config/examples/delta/kossel_xl/Configuration.h
@@ -156,13 +156,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -1956,6 +1957,15 @@
//
//#define SILVER_GATE_GLCD_CONTROLLER
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/examples/delta/kossel_xl/Configuration_adv.h b/Marlin/src/config/examples/delta/kossel_xl/Configuration_adv.h
index 3ceef6883b..af6ed44c36 100644
--- a/Marlin/src/config/examples/delta/kossel_xl/Configuration_adv.h
+++ b/Marlin/src/config/examples/delta/kossel_xl/Configuration_adv.h
@@ -703,6 +703,22 @@
#define USB_INTR_PIN SD_DETECT_PIN
#endif
+ /**
+ * When using a bootloader that supports SD-Firmware-Flashing,
+ * add a menu item to activate SD-FW-Update on the next reboot.
+ *
+ * Requires ATMEGA2560 (Arduino Mega)
+ *
+ * Tested with this bootloader:
+ * https://github.com/FleetProbe/MicroBridge-Arduino-ATMega2560
+ */
+ //#define SD_FIRMWARE_UPDATE
+ #if ENABLED(SD_FIRMWARE_UPDATE)
+ #define SD_FIRMWARE_UPDATE_EEPROM_ADDR 0x1FF
+ #define SD_FIRMWARE_UPDATE_ACTIVE_VALUE 0xF0
+ #define SD_FIRMWARE_UPDATE_INACTIVE_VALUE 0xFF
+ #endif
+
#endif // SDSUPPORT
/**
diff --git a/Marlin/src/config/examples/gCreate/gMax1.5+/Configuration.h b/Marlin/src/config/examples/gCreate/gMax1.5+/Configuration.h
index f8675be71f..6faf4d2544 100644
--- a/Marlin/src/config/examples/gCreate/gMax1.5+/Configuration.h
+++ b/Marlin/src/config/examples/gCreate/gMax1.5+/Configuration.h
@@ -161,13 +161,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -1852,6 +1853,15 @@
//
//#define SILVER_GATE_GLCD_CONTROLLER
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/examples/gCreate/gMax1.5+/Configuration_adv.h b/Marlin/src/config/examples/gCreate/gMax1.5+/Configuration_adv.h
index d5fe3afdec..1da5c9a4e6 100644
--- a/Marlin/src/config/examples/gCreate/gMax1.5+/Configuration_adv.h
+++ b/Marlin/src/config/examples/gCreate/gMax1.5+/Configuration_adv.h
@@ -701,6 +701,22 @@
#define USB_INTR_PIN SD_DETECT_PIN
#endif
+ /**
+ * When using a bootloader that supports SD-Firmware-Flashing,
+ * add a menu item to activate SD-FW-Update on the next reboot.
+ *
+ * Requires ATMEGA2560 (Arduino Mega)
+ *
+ * Tested with this bootloader:
+ * https://github.com/FleetProbe/MicroBridge-Arduino-ATMega2560
+ */
+ //#define SD_FIRMWARE_UPDATE
+ #if ENABLED(SD_FIRMWARE_UPDATE)
+ #define SD_FIRMWARE_UPDATE_EEPROM_ADDR 0x1FF
+ #define SD_FIRMWARE_UPDATE_ACTIVE_VALUE 0xF0
+ #define SD_FIRMWARE_UPDATE_INACTIVE_VALUE 0xFF
+ #endif
+
#endif // SDSUPPORT
/**
diff --git a/Marlin/src/config/examples/makibox/Configuration.h b/Marlin/src/config/examples/makibox/Configuration.h
index 4e6c1eedb2..e18b1dcea0 100644
--- a/Marlin/src/config/examples/makibox/Configuration.h
+++ b/Marlin/src/config/examples/makibox/Configuration.h
@@ -156,13 +156,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -1841,6 +1842,15 @@
//
//#define SILVER_GATE_GLCD_CONTROLLER
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/examples/makibox/Configuration_adv.h b/Marlin/src/config/examples/makibox/Configuration_adv.h
index 0a6475e84f..c9c66bcd3f 100644
--- a/Marlin/src/config/examples/makibox/Configuration_adv.h
+++ b/Marlin/src/config/examples/makibox/Configuration_adv.h
@@ -701,6 +701,22 @@
#define USB_INTR_PIN SD_DETECT_PIN
#endif
+ /**
+ * When using a bootloader that supports SD-Firmware-Flashing,
+ * add a menu item to activate SD-FW-Update on the next reboot.
+ *
+ * Requires ATMEGA2560 (Arduino Mega)
+ *
+ * Tested with this bootloader:
+ * https://github.com/FleetProbe/MicroBridge-Arduino-ATMega2560
+ */
+ //#define SD_FIRMWARE_UPDATE
+ #if ENABLED(SD_FIRMWARE_UPDATE)
+ #define SD_FIRMWARE_UPDATE_EEPROM_ADDR 0x1FF
+ #define SD_FIRMWARE_UPDATE_ACTIVE_VALUE 0xF0
+ #define SD_FIRMWARE_UPDATE_INACTIVE_VALUE 0xFF
+ #endif
+
#endif // SDSUPPORT
/**
diff --git a/Marlin/src/config/examples/stm32f103ret6/Configuration.h b/Marlin/src/config/examples/stm32f103ret6/Configuration.h
index 3f3894d105..2c9a83495a 100644
--- a/Marlin/src/config/examples/stm32f103ret6/Configuration.h
+++ b/Marlin/src/config/examples/stm32f103ret6/Configuration.h
@@ -156,13 +156,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -1840,6 +1841,15 @@
//
//#define SILVER_GATE_GLCD_CONTROLLER
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/examples/tvrrug/Round2/Configuration.h b/Marlin/src/config/examples/tvrrug/Round2/Configuration.h
index 240c15112d..764177ccc7 100644
--- a/Marlin/src/config/examples/tvrrug/Round2/Configuration.h
+++ b/Marlin/src/config/examples/tvrrug/Round2/Configuration.h
@@ -156,13 +156,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -1833,6 +1834,15 @@
//
//#define SILVER_GATE_GLCD_CONTROLLER
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/examples/tvrrug/Round2/Configuration_adv.h b/Marlin/src/config/examples/tvrrug/Round2/Configuration_adv.h
index 7ec90348d7..de725f09c1 100644
--- a/Marlin/src/config/examples/tvrrug/Round2/Configuration_adv.h
+++ b/Marlin/src/config/examples/tvrrug/Round2/Configuration_adv.h
@@ -701,6 +701,22 @@
#define USB_INTR_PIN SD_DETECT_PIN
#endif
+ /**
+ * When using a bootloader that supports SD-Firmware-Flashing,
+ * add a menu item to activate SD-FW-Update on the next reboot.
+ *
+ * Requires ATMEGA2560 (Arduino Mega)
+ *
+ * Tested with this bootloader:
+ * https://github.com/FleetProbe/MicroBridge-Arduino-ATMega2560
+ */
+ //#define SD_FIRMWARE_UPDATE
+ #if ENABLED(SD_FIRMWARE_UPDATE)
+ #define SD_FIRMWARE_UPDATE_EEPROM_ADDR 0x1FF
+ #define SD_FIRMWARE_UPDATE_ACTIVE_VALUE 0xF0
+ #define SD_FIRMWARE_UPDATE_INACTIVE_VALUE 0xFF
+ #endif
+
#endif // SDSUPPORT
/**
diff --git a/Marlin/src/config/examples/wt150/Configuration.h b/Marlin/src/config/examples/wt150/Configuration.h
index 621eb9bccd..e3f7c8b0c5 100644
--- a/Marlin/src/config/examples/wt150/Configuration.h
+++ b/Marlin/src/config/examples/wt150/Configuration.h
@@ -156,13 +156,14 @@
// For Cyclops or any "multi-extruder" that shares a single nozzle.
//#define SINGLENOZZLE
#if ENABLED(SINGLENOZZLE)
- // Length of filament to retract and prime on toolchange
- //#define SINGLENOZZLE_SWAP_LENGTH 12.0
- //#define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
- //#define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
+ // Parameters for filament retract / prime on toolchange
+ #define SINGLENOZZLE_SWAP_LENGTH 12 // (mm)
+ #define SINGLENOZZLE_SWAP_RETRACT_SPEED 3600 // (mm/m)
+ #define SINGLENOZZLE_SWAP_PRIME_SPEED 3600 // (mm/m)
//#define SINGLENOZZLE_SWAP_PARK
#if ENABLED(SINGLENOZZLE_SWAP_PARK)
#define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
+ #define SINGLENOZZLE_PARK_XY_FEEDRATE 6000 // (mm/m)
#else
#define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
#endif
@@ -1843,6 +1844,15 @@
//
//#define SILVER_GATE_GLCD_CONTROLLER
+//
+// Extensible UI
+//
+// Enable third-party or vendor customized user interfaces that aren't
+// packaged with Marlin. Source code for the user interface will need to
+// be placed in "src/lcd/extensible_ui/lib"
+//
+//#define EXTENSIBLE_UI
+
//=============================================================================
//============================ Other Controllers ============================
//=============================================================================
diff --git a/Marlin/src/config/examples/wt150/Configuration_adv.h b/Marlin/src/config/examples/wt150/Configuration_adv.h
index d6908d0a91..ea83c84315 100644
--- a/Marlin/src/config/examples/wt150/Configuration_adv.h
+++ b/Marlin/src/config/examples/wt150/Configuration_adv.h
@@ -702,6 +702,22 @@
#define USB_INTR_PIN SD_DETECT_PIN
#endif
+ /**
+ * When using a bootloader that supports SD-Firmware-Flashing,
+ * add a menu item to activate SD-FW-Update on the next reboot.
+ *
+ * Requires ATMEGA2560 (Arduino Mega)
+ *
+ * Tested with this bootloader:
+ * https://github.com/FleetProbe/MicroBridge-Arduino-ATMega2560
+ */
+ //#define SD_FIRMWARE_UPDATE
+ #if ENABLED(SD_FIRMWARE_UPDATE)
+ #define SD_FIRMWARE_UPDATE_EEPROM_ADDR 0x1FF
+ #define SD_FIRMWARE_UPDATE_ACTIVE_VALUE 0xF0
+ #define SD_FIRMWARE_UPDATE_INACTIVE_VALUE 0xFF
+ #endif
+
#endif // SDSUPPORT
/**
diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h
index afeed9672b..dc00f2f26a 100644
--- a/Marlin/src/core/boards.h
+++ b/Marlin/src/core/boards.h
@@ -110,7 +110,7 @@
#define BOARD_GT2560_REV_A 74 // Geeetech GT2560 Rev. A
#define BOARD_GT2560_REV_A_PLUS 75 // Geeetech GT2560 Rev. A+ (with auto level probe)
#define BOARD_GT2560_V3 76 // Geeetech GT2560 Rev B for A10(M/D)
-#define BOARD_GT2560_V3_MC2 73 // Geeetech GT2560 Rev B for Mecreator2
+#define BOARD_GT2560_V3_MC2 73 // Geeetech GT2560 Rev B for Mecreator2
#define BOARD_EINSTART_S 666 // Einstart retrofit
//
diff --git a/Marlin/src/core/serial.h b/Marlin/src/core/serial.h
index ff0868ceb0..9320167bd3 100644
--- a/Marlin/src/core/serial.h
+++ b/Marlin/src/core/serial.h
@@ -164,7 +164,7 @@ extern uint8_t marlin_debug_flags;
#define SERIAL_ECHOPAIR_P(p,pre,value) SERIAL_ECHOPAIR(pre, value)
#define SERIAL_ECHOLNPAIR_P(p,pre, value) SERIAL_ECHOLNPAIR(pre, value)
#define SERIAL_ECHO_F_P(p,x,y) SERIAL_ECHO_F(x,y)
-
+
#define SERIAL_ERROR_START_P(p) SERIAL_ERROR_START()
#define SERIAL_ERROR_P(p,x) SERIAL_ERROR(x)
#define SERIAL_ERRORPGM_P(p,x) SERIAL_ERRORPGM(x)
diff --git a/Marlin/src/core/types.h b/Marlin/src/core/types.h
index db6587a08c..25bfb555de 100644
--- a/Marlin/src/core/types.h
+++ b/Marlin/src/core/types.h
@@ -19,13 +19,28 @@
* along with this program. If not, see .
*
*/
-
-#ifndef __TYPES_H__
-#define __TYPES_H__
+#pragma once
#include
#include
typedef uint32_t millis_t;
-#endif
+#pragma pack(push, 1) // No padding between fields
+
+typedef struct {
+ float unload_length, load_length;
+} fil_change_settings_t;
+
+typedef struct {
+ float retract_length, // M207 S - G10 Retract length
+ retract_feedrate_mm_s, // M207 F - G10 Retract feedrate
+ retract_zlift, // M207 Z - G10 Retract hop size
+ retract_recover_length, // M208 S - G11 Recover length
+ retract_recover_feedrate_mm_s, // M208 F - G11 Recover feedrate
+ swap_retract_length, // M207 W - G10 Swap Retract length
+ swap_retract_recover_length, // M208 W - G11 Swap Recover length
+ swap_retract_recover_feedrate_mm_s; // M208 R - G11 Swap Recover feedrate
+} fwretract_settings_t;
+
+#pragma pack(pop)
diff --git a/Marlin/src/feature/I2CPositionEncoder.cpp b/Marlin/src/feature/I2CPositionEncoder.cpp
index 55c607ca4f..4887b69399 100644
--- a/Marlin/src/feature/I2CPositionEncoder.cpp
+++ b/Marlin/src/feature/I2CPositionEncoder.cpp
@@ -163,7 +163,7 @@ void I2CPositionEncoder::update() {
//SERIAL_ECHOLN(error);
#ifdef I2CPE_ERR_THRESH_ABORT
- if (ABS(error) > I2CPE_ERR_THRESH_ABORT * planner.axis_steps_per_mm[encoderAxis]) {
+ if (ABS(error) > I2CPE_ERR_THRESH_ABORT * planner.settings.axis_steps_per_mm[encoderAxis]) {
//kill("Significant Error");
SERIAL_ECHOPGM("Axis error greater than set threshold, aborting!");
SERIAL_ECHOLN(error);
@@ -175,7 +175,7 @@ void I2CPositionEncoder::update() {
if (errIdx == 0) {
// In order to correct for "error" but avoid correcting for noise and non-skips
// it must be > threshold and have a difference average of < 10 and be < 2000 steps
- if (ABS(error) > threshold * planner.axis_steps_per_mm[encoderAxis] &&
+ if (ABS(error) > threshold * planner.settings.axis_steps_per_mm[encoderAxis] &&
diffSum < 10 * (I2CPE_ERR_ARRAY_SIZE - 1) && ABS(error) < 2000) { // Check for persistent error (skip)
errPrst[errPrstIdx++] = error; // Error must persist for I2CPE_ERR_PRST_ARRAY_SIZE error cycles. This also serves to improve the average accuracy
if (errPrstIdx >= I2CPE_ERR_PRST_ARRAY_SIZE) {
@@ -193,14 +193,14 @@ void I2CPositionEncoder::update() {
errPrstIdx = 0;
}
#else
- if (ABS(error) > threshold * planner.axis_steps_per_mm[encoderAxis]) {
+ if (ABS(error) > threshold * planner.settings.axis_steps_per_mm[encoderAxis]) {
//SERIAL_ECHOLN(error);
//SERIAL_ECHOLN(position);
thermalManager.babystepsTodo[encoderAxis] = -LROUND(error / 2);
}
#endif
- if (ABS(error) > I2CPE_ERR_CNT_THRESH * planner.axis_steps_per_mm[encoderAxis]) {
+ if (ABS(error) > I2CPE_ERR_CNT_THRESH * planner.settings.axis_steps_per_mm[encoderAxis]) {
const millis_t ms = millis();
if (ELAPSED(ms, nextErrorCountTime)) {
SERIAL_ECHOPAIR("Large error on ", axis_codes[encoderAxis]);
@@ -284,7 +284,7 @@ int32_t I2CPositionEncoder::get_axis_error_steps(const bool report) {
//int32_t stepperTicks = stepper.position(encoderAxis);
// With a rotary encoder we're concerned with ticks/rev; whereas with a linear we're concerned with ticks/mm
- stepperTicksPerUnit = (type == I2CPE_ENC_TYPE_ROTARY) ? stepperTicks : planner.axis_steps_per_mm[encoderAxis];
+ stepperTicksPerUnit = (type == I2CPE_ENC_TYPE_ROTARY) ? stepperTicks : planner.settings.axis_steps_per_mm[encoderAxis];
//convert both 'ticks' into same units / base
encoderCountInStepperTicksScaled = LROUND((stepperTicksPerUnit * encoderTicks) / encoderTicksPerUnit);
@@ -444,14 +444,14 @@ void I2CPositionEncoder::calibrate_steps_mm(const uint8_t iter) {
SERIAL_ECHOLNPGM("mm.");
//Calculate new axis steps per unit
- old_steps_mm = planner.axis_steps_per_mm[encoderAxis];
+ old_steps_mm = planner.settings.axis_steps_per_mm[encoderAxis];
new_steps_mm = (old_steps_mm * travelDistance) / travelledDistance;
SERIAL_ECHOLNPAIR("Old steps per mm: ", old_steps_mm);
SERIAL_ECHOLNPAIR("New steps per mm: ", new_steps_mm);
//Save new value
- planner.axis_steps_per_mm[encoderAxis] = new_steps_mm;
+ planner.settings.axis_steps_per_mm[encoderAxis] = new_steps_mm;
if (iter > 1) {
total += new_steps_mm;
diff --git a/Marlin/src/feature/I2CPositionEncoder.h b/Marlin/src/feature/I2CPositionEncoder.h
index f5fe8bced8..53266b2780 100644
--- a/Marlin/src/feature/I2CPositionEncoder.h
+++ b/Marlin/src/feature/I2CPositionEncoder.h
@@ -155,7 +155,7 @@ class I2CPositionEncoder {
case I2CPE_ENC_TYPE_LINEAR:
return count / encoderTicksPerUnit;
case I2CPE_ENC_TYPE_ROTARY:
- return (count * stepperTicks) / (encoderTicksPerUnit * planner.axis_steps_per_mm[encoderAxis]);
+ return (count * stepperTicks) / (encoderTicksPerUnit * planner.settings.axis_steps_per_mm[encoderAxis]);
}
}
@@ -199,7 +199,7 @@ class I2CPositionEncoder {
case I2CPE_ENC_TYPE_LINEAR:
return encoderTicksPerUnit;
case I2CPE_ENC_TYPE_ROTARY:
- return (int)((encoderTicksPerUnit / stepperTicks) * planner.axis_steps_per_mm[encoderAxis]);
+ return (int)((encoderTicksPerUnit / stepperTicks) * planner.settings.axis_steps_per_mm[encoderAxis]);
}
}
diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp
index 671ed79947..99b91bf5a7 100644
--- a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp
+++ b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp
@@ -803,7 +803,7 @@
save_ubl_active_state_and_disable(); // Disable bed level correction for probing
do_blocking_move_to(0.5f * (MESH_MAX_X - (MESH_MIN_X)), 0.5f * (MESH_MAX_Y - (MESH_MIN_Y)), in_height);
- //, MIN(planner.max_feedrate_mm_s[X_AXIS], planner.max_feedrate_mm_s[Y_AXIS]) * 0.5f);
+ //, MIN(planner.settings.max_feedrate_mm_s[X_AXIS], planner.settings.max_feedrate_mm_s[Y_AXIS]) * 0.5f);
planner.synchronize();
SERIAL_PROTOCOLPGM("Place shim under nozzle");
@@ -1027,12 +1027,12 @@
static uint8_t ubl_state_at_invocation = 0;
- #ifdef UBL_DEVEL_DEBUGGING
+ #if ENABLED(UBL_DEVEL_DEBUGGING)
static uint8_t ubl_state_recursion_chk = 0;
#endif
void unified_bed_leveling::save_ubl_active_state_and_disable() {
- #ifdef UBL_DEVEL_DEBUGGING
+ #if ENABLED(UBL_DEVEL_DEBUGGING)
ubl_state_recursion_chk++;
if (ubl_state_recursion_chk != 1) {
SERIAL_ECHOLNPGM("save_ubl_active_state_and_disabled() called multiple times in a row.");
@@ -1048,7 +1048,7 @@
}
void unified_bed_leveling::restore_ubl_active_state_and_leave() {
- #ifdef UBL_DEVEL_DEBUGGING
+ #if ENABLED(UBL_DEVEL_DEBUGGING)
if (--ubl_state_recursion_chk) {
SERIAL_ECHOLNPGM("restore_ubl_active_state_and_leave() called too many times.");
#if ENABLED(NEWPANEL)
@@ -1132,7 +1132,7 @@
SERIAL_EOL();
safe_delay(50);
- #ifdef UBL_DEVEL_DEBUGGING
+ #if ENABLED(UBL_DEVEL_DEBUGGING)
SERIAL_PROTOCOLLNPAIR("ubl_state_at_invocation :", ubl_state_at_invocation);
SERIAL_EOL();
SERIAL_PROTOCOLLNPAIR("ubl_state_recursion_chk :", ubl_state_recursion_chk);
diff --git a/Marlin/src/feature/fwretract.cpp b/Marlin/src/feature/fwretract.cpp
index b0e4d3b9bc..7cb29a970b 100644
--- a/Marlin/src/feature/fwretract.cpp
+++ b/Marlin/src/feature/fwretract.cpp
@@ -43,34 +43,34 @@ FWRetract fwretract; // Single instance - this calls the constructor
// private:
#if EXTRUDERS > 1
- bool FWRetract::retracted_swap[EXTRUDERS]; // Which extruders are swap-retracted
+ bool FWRetract::retracted_swap[EXTRUDERS]; // Which extruders are swap-retracted
#endif
// public:
-bool FWRetract::autoretract_enabled, // M209 S - Autoretract switch
- FWRetract::retracted[EXTRUDERS]; // Which extruders are currently retracted
-float FWRetract::retract_length, // M207 S - G10 Retract length
- FWRetract::retract_feedrate_mm_s, // M207 F - G10 Retract feedrate
- FWRetract::retract_zlift, // M207 Z - G10 Retract hop size
- FWRetract::retract_recover_length, // M208 S - G11 Recover length
- FWRetract::retract_recover_feedrate_mm_s, // M208 F - G11 Recover feedrate
- FWRetract::swap_retract_length, // M207 W - G10 Swap Retract length
- FWRetract::swap_retract_recover_length, // M208 W - G11 Swap Recover length
- FWRetract::swap_retract_recover_feedrate_mm_s, // M208 R - G11 Swap Recover feedrate
- FWRetract::current_retract[EXTRUDERS], // Retract value used by planner
+fwretract_settings_t FWRetract::settings; // M207 S F Z W, M208 S F W R
+
+#if ENABLED(FWRETRACT_AUTORETRACT)
+ bool FWRetract::autoretract_enabled; // M209 S - Autoretract switch
+#endif
+
+bool FWRetract::retracted[EXTRUDERS]; // Which extruders are currently retracted
+
+float FWRetract::current_retract[EXTRUDERS], // Retract value used by planner
FWRetract::current_hop;
void FWRetract::reset() {
- autoretract_enabled = false;
- retract_length = RETRACT_LENGTH;
- retract_feedrate_mm_s = RETRACT_FEEDRATE;
- retract_zlift = RETRACT_ZLIFT;
- retract_recover_length = RETRACT_RECOVER_LENGTH;
- retract_recover_feedrate_mm_s = RETRACT_RECOVER_FEEDRATE;
- swap_retract_length = RETRACT_LENGTH_SWAP;
- swap_retract_recover_length = RETRACT_RECOVER_LENGTH_SWAP;
- swap_retract_recover_feedrate_mm_s = RETRACT_RECOVER_FEEDRATE_SWAP;
+ #if ENABLED(FWRETRACT_AUTORETRACT)
+ autoretract_enabled = false;
+ #endif
+ settings.retract_length = RETRACT_LENGTH;
+ settings.retract_feedrate_mm_s = RETRACT_FEEDRATE;
+ settings.retract_zlift = RETRACT_ZLIFT;
+ settings.retract_recover_length = RETRACT_RECOVER_LENGTH;
+ settings.retract_recover_feedrate_mm_s = RETRACT_RECOVER_FEEDRATE;
+ settings.swap_retract_length = RETRACT_LENGTH_SWAP;
+ settings.swap_retract_recover_length = RETRACT_RECOVER_LENGTH_SWAP;
+ settings.swap_retract_recover_feedrate_mm_s = RETRACT_RECOVER_FEEDRATE_SWAP;
current_hop = 0.0;
for (uint8_t i = 0; i < EXTRUDERS; ++i) {
@@ -132,7 +132,7 @@ void FWRetract::retract(const bool retracting
unscale_e = RECIPROCAL(planner.e_factor[active_extruder]),
unscale_fr = 100.0 / feedrate_percentage, // Disable feedrate scaling for retract moves
base_retract = (
- (swapping ? swap_retract_length : retract_length)
+ (swapping ? settings.swap_retract_length : settings.retract_length)
#if ENABLED(RETRACT_SYNC_MIXING)
* (MIXING_STEPPERS)
#endif
@@ -152,7 +152,7 @@ void FWRetract::retract(const bool retracting
if (retracting) {
// Retract by moving from a faux E position back to the current E position
feedrate_mm_s = (
- retract_feedrate_mm_s * unscale_fr
+ settings.retract_feedrate_mm_s * unscale_fr
#if ENABLED(RETRACT_SYNC_MIXING)
* (MIXING_STEPPERS)
#endif
@@ -162,9 +162,9 @@ void FWRetract::retract(const bool retracting
planner.synchronize(); // Wait for move to complete
// Is a Z hop set, and has the hop not yet been done?
- if (retract_zlift > 0.01 && !current_hop) { // Apply hop only once
- current_hop += retract_zlift; // Add to the hop total (again, only once)
- feedrate_mm_s = planner.max_feedrate_mm_s[Z_AXIS] * unscale_fr; // Maximum Z feedrate
+ if (settings.retract_zlift > 0.01 && !current_hop) { // Apply hop only once
+ current_hop += settings.retract_zlift; // Add to the hop total (again, only once)
+ feedrate_mm_s = planner.settings.max_feedrate_mm_s[Z_AXIS] * unscale_fr; // Maximum Z feedrate
prepare_move_to_destination(); // Raise up, set_current_to_destination
planner.synchronize(); // Wait for move to complete
}
@@ -173,12 +173,12 @@ void FWRetract::retract(const bool retracting
// If a hop was done and Z hasn't changed, undo the Z hop
if (current_hop) {
current_hop = 0.0;
- feedrate_mm_s = planner.max_feedrate_mm_s[Z_AXIS] * unscale_fr; // Z feedrate to max
+ feedrate_mm_s = planner.settings.max_feedrate_mm_s[Z_AXIS] * unscale_fr; // Z feedrate to max
prepare_move_to_destination(); // Lower Z, set_current_to_destination
planner.synchronize(); // Wait for move to complete
}
- const float extra_recover = swapping ? swap_retract_recover_length : retract_recover_length;
+ const float extra_recover = swapping ? settings.swap_retract_recover_length : settings.retract_recover_length;
if (extra_recover != 0.0) {
current_position[E_AXIS] -= extra_recover; // Adjust the current E position by the extra amount to recover
sync_plan_position_e(); // Sync the planner position so the extra amount is recovered
@@ -186,7 +186,7 @@ void FWRetract::retract(const bool retracting
current_retract[active_extruder] = 0.0;
feedrate_mm_s = (
- (swapping ? swap_retract_recover_feedrate_mm_s : retract_recover_feedrate_mm_s) * unscale_fr
+ (swapping ? settings.swap_retract_recover_feedrate_mm_s : settings.retract_recover_feedrate_mm_s) * unscale_fr
#if ENABLED(RETRACT_SYNC_MIXING)
* (MIXING_STEPPERS)
#endif
diff --git a/Marlin/src/feature/fwretract.h b/Marlin/src/feature/fwretract.h
index e1cd94dc94..bcc44cf83f 100644
--- a/Marlin/src/feature/fwretract.h
+++ b/Marlin/src/feature/fwretract.h
@@ -19,15 +19,13 @@
* along with this program. If not, see .
*
*/
+#pragma once
/**
* fwretract.h - Define firmware-based retraction interface
*/
-#ifndef FWRETRACT_H
-#define FWRETRACT_H
-
-#include "../inc/MarlinConfig.h"
+#include "../inc/MarlinConfigPre.h"
class FWRetract {
private:
@@ -36,17 +34,16 @@ private:
#endif
public:
- static bool autoretract_enabled, // M209 S - Autoretract switch
- retracted[EXTRUDERS]; // Which extruders are currently retracted
- static float retract_length, // M207 S - G10 Retract length
- retract_feedrate_mm_s, // M207 F - G10 Retract feedrate
- retract_zlift, // M207 Z - G10 Retract hop size
- retract_recover_length, // M208 S - G11 Recover length
- retract_recover_feedrate_mm_s, // M208 F - G11 Recover feedrate
- swap_retract_length, // M207 W - G10 Swap Retract length
- swap_retract_recover_length, // M208 W - G11 Swap Recover length
- swap_retract_recover_feedrate_mm_s, // M208 R - G11 Swap Recover feedrate
- current_retract[EXTRUDERS], // Retract value used by planner
+ static fwretract_settings_t settings;
+
+ #if ENABLED(FWRETRACT_AUTORETRACT)
+ static bool autoretract_enabled; // M209 S - Autoretract switch
+ #else
+ constexpr static bool autoretract_enabled = false;
+ #endif
+
+ static bool retracted[EXTRUDERS]; // Which extruders are currently retracted
+ static float current_retract[EXTRUDERS], // Retract value used by planner
current_hop; // Hop value used by planner
FWRetract() { reset(); }
@@ -54,7 +51,7 @@ public:
static void reset();
static void refresh_autoretract() {
- for (uint8_t i = 0; i < EXTRUDERS; i++) retracted[i] = false;
+ LOOP_L_N(i, EXTRUDERS) retracted[i] = false;
}
static void enable_autoretract(const bool enable) {
@@ -72,5 +69,3 @@ public:
};
extern FWRetract fwretract;
-
-#endif // FWRETRACT_H
diff --git a/Marlin/src/feature/leds/leds.h b/Marlin/src/feature/leds/leds.h
index fe00cd3c48..220de6d15d 100644
--- a/Marlin/src/feature/leds/leds.h
+++ b/Marlin/src/feature/leds/leds.h
@@ -19,15 +19,13 @@
* along with this program. If not, see .
*
*/
+#pragma once
/**
* leds.h - Marlin general RGB LED support
*/
-#ifndef __LEDS_H__
-#define __LEDS_H__
-
-#include "../../inc/MarlinConfig.h"
+#include "../../inc/MarlinConfigPre.h"
#if ENABLED(NEOPIXEL_LED)
#include "neopixel.h"
@@ -180,5 +178,3 @@ public:
};
extern LEDLights leds;
-
-#endif // __LEDS_H__
diff --git a/Marlin/src/feature/leds/printer_event_leds.cpp b/Marlin/src/feature/leds/printer_event_leds.cpp
new file mode 100644
index 0000000000..3d974e7b3e
--- /dev/null
+++ b/Marlin/src/feature/leds/printer_event_leds.cpp
@@ -0,0 +1,81 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+
+/**
+ * printer_event_leds.cpp - LED color changing based on printer status
+ */
+
+#include "../../inc/MarlinConfigPre.h"
+
+#if ENABLED(PRINTER_EVENT_LEDS)
+
+#include "printer_event_leds.h"
+
+PrinterEventLEDs printerEventLEDs;
+
+#if HAS_LEDS_OFF_FLAG
+ bool PrinterEventLEDs::leds_off_after_print; // = false
+#endif
+
+#if HAS_TEMP_HOTEND || HAS_HEATED_BED
+
+ uint8_t PrinterEventLEDs::old_intensity = 0;
+
+ inline uint8_t pel_intensity(const float &start, const float ¤t, const float &target) {
+ return (uint8_t)map(constrain(current, start, target), start, target, 0.f, 255.f);
+ }
+
+ inline void pel_set_rgb(const uint8_t r, const uint8_t g, const uint8_t b) {
+ leds.set_color(
+ MakeLEDColor(r, g, b, 0, pixels.getBrightness())
+ #if ENABLED(NEOPIXEL_IS_SEQUENTIAL)
+ , true
+ #endif
+ );
+ }
+
+#endif
+
+#if HAS_TEMP_HOTEND
+
+ void PrinterEventLEDs::onHotendHeating(const float &start, const float ¤t, const float &target) {
+ const uint8_t blue = pel_intensity(start, current, target);
+ if (blue != old_intensity) {
+ old_intensity = blue;
+ pel_set_rgb(255, 0, 255 - blue);
+ }
+ }
+
+#endif
+
+#if HAS_HEATED_BED
+
+ void PrinterEventLEDs::onBedHeating(const float &start, const float ¤t, const float &target) {
+ const uint8_t red = pel_intensity(start, current, target);
+ if (red != old_intensity) {
+ old_intensity = red;
+ pel_set_rgb(red, 0, 255);
+ }
+ }
+#endif
+
+#endif // PRINTER_EVENT_LEDS
diff --git a/Marlin/src/feature/leds/printer_event_leds.h b/Marlin/src/feature/leds/printer_event_leds.h
new file mode 100644
index 0000000000..679eddfbc9
--- /dev/null
+++ b/Marlin/src/feature/leds/printer_event_leds.h
@@ -0,0 +1,79 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+#pragma once
+
+/**
+ * printer_event_leds.h - LED color changing based on printer status
+ */
+
+#include "leds.h"
+#include "../../inc/MarlinConfig.h"
+
+class PrinterEventLEDs {
+private:
+ static uint8_t old_intensity;
+
+ #if HAS_LEDS_OFF_FLAG
+ static bool leds_off_after_print;
+ #endif
+
+public:
+ #if HAS_TEMP_HOTEND
+ FORCE_INLINE static void onHotendHeatingStart() { old_intensity = 0; }
+ static void onHotendHeating(const float &start, const float ¤t, const float &target);
+ #endif
+
+ #if HAS_HEATED_BED
+ FORCE_INLINE static void onBedHeatingStart() { old_intensity = 127; }
+ static void onBedHeating(const float &start, const float ¤t, const float &target);
+ #endif
+
+ #if HAS_TEMP_HOTEND || HAS_HEATED_BED
+ FORCE_INLINE static void onHeated() { leds.set_white(); }
+ FORCE_INLINE static void onHeatersOff() { leds.set_off(); }
+ #endif
+
+ #if ENABLED(SDSUPPORT)
+
+ FORCE_INLINE static void onPrintCompleted() {
+ leds.set_green();
+ #if HAS_LEDS_OFF_FLAG
+ leds_off_after_print = true;
+ #else
+ safe_delay(2000);
+ leds.set_off();
+ #endif
+ }
+
+ FORCE_INLINE static void onResumeAfterWait() {
+ #if HAS_LEDS_OFF_FLAG
+ if (leds_off_after_print) {
+ leds.set_off();
+ leds_off_after_print = false;
+ }
+ #endif
+ }
+
+ #endif // SDSUPPORT
+};
+
+extern PrinterEventLEDs printerEventLEDs;
diff --git a/Marlin/src/feature/leds/tempstat.cpp b/Marlin/src/feature/leds/tempstat.cpp
index a7aa6a4d43..8a5a4a0b70 100644
--- a/Marlin/src/feature/leds/tempstat.cpp
+++ b/Marlin/src/feature/leds/tempstat.cpp
@@ -32,7 +32,7 @@
#include "../../module/temperature.h"
void handle_status_leds(void) {
- static bool red_led = false;
+ static uint8_t red_led = LOW;
static millis_t next_status_led_update_ms = 0;
if (ELAPSED(millis(), next_status_led_update_ms)) {
next_status_led_update_ms += 500; // Update every 0.5s
@@ -42,16 +42,16 @@ void handle_status_leds(void) {
#endif
HOTEND_LOOP()
max_temp = MAX(max_temp, thermalManager.degHotend(e), thermalManager.degTargetHotend(e));
- const bool new_led = (max_temp > 55.0) ? true : (max_temp < 54.0) ? false : red_led;
+ const uint8_t new_led = (max_temp > 55.0) ? HIGH : (max_temp < 54.0) ? LOW : red_led;
if (new_led != red_led) {
red_led = new_led;
#if PIN_EXISTS(STAT_LED_RED)
- WRITE(STAT_LED_RED_PIN, new_led ? HIGH : LOW);
+ WRITE(STAT_LED_RED_PIN, new_led);
#if PIN_EXISTS(STAT_LED_BLUE)
- WRITE(STAT_LED_BLUE_PIN, new_led ? LOW : HIGH);
+ WRITE(STAT_LED_BLUE_PIN, !new_led);
#endif
#else
- WRITE(STAT_LED_BLUE_PIN, new_led ? HIGH : LOW);
+ WRITE(STAT_LED_BLUE_PIN, new_led);
#endif
}
}
diff --git a/Marlin/src/feature/pause.cpp b/Marlin/src/feature/pause.cpp
index bda88ec6e3..d7fe9c7e05 100644
--- a/Marlin/src/feature/pause.cpp
+++ b/Marlin/src/feature/pause.cpp
@@ -25,7 +25,7 @@
* This may be combined with related G-codes if features are consolidated.
*/
-#include "../inc/MarlinConfig.h"
+#include "../inc/MarlinConfigPre.h"
#if ENABLED(ADVANCED_PAUSE_FEATURE)
@@ -59,8 +59,7 @@ static float resume_position[XYZE];
AdvancedPauseMenuResponse advanced_pause_menu_response;
-float filament_change_unload_length[EXTRUDERS],
- filament_change_load_length[EXTRUDERS];
+fil_change_settings_t fc_settings[EXTRUDERS];
#if ENABLED(SDSUPPORT)
#include "../sd/cardreader.h"
@@ -191,14 +190,14 @@ bool load_filament(const float &slow_load_length/*=0*/, const float &fast_load_l
// Fast Load Filament
if (fast_load_length) {
#if FILAMENT_CHANGE_FAST_LOAD_ACCEL > 0
- const float saved_acceleration = planner.retract_acceleration;
- planner.retract_acceleration = FILAMENT_CHANGE_FAST_LOAD_ACCEL;
+ const float saved_acceleration = planner.settings.retract_acceleration;
+ planner.settings.retract_acceleration = FILAMENT_CHANGE_FAST_LOAD_ACCEL;
#endif
do_pause_e_move(fast_load_length, FILAMENT_CHANGE_FAST_LOAD_FEEDRATE);
#if FILAMENT_CHANGE_FAST_LOAD_ACCEL > 0
- planner.retract_acceleration = saved_acceleration;
+ planner.settings.retract_acceleration = saved_acceleration;
#endif
}
@@ -295,18 +294,18 @@ bool unload_filament(const float &unload_length, const bool show_lcd/*=false*/,
safe_delay(FILAMENT_UNLOAD_DELAY);
// Quickly purge
- do_pause_e_move(FILAMENT_UNLOAD_RETRACT_LENGTH + FILAMENT_UNLOAD_PURGE_LENGTH, planner.max_feedrate_mm_s[E_AXIS]);
+ do_pause_e_move(FILAMENT_UNLOAD_RETRACT_LENGTH + FILAMENT_UNLOAD_PURGE_LENGTH, planner.settings.max_feedrate_mm_s[E_AXIS]);
// Unload filament
#if FILAMENT_CHANGE_UNLOAD_ACCEL > 0
- const float saved_acceleration = planner.retract_acceleration;
- planner.retract_acceleration = FILAMENT_CHANGE_UNLOAD_ACCEL;
+ const float saved_acceleration = planner.settings.retract_acceleration;
+ planner.settings.retract_acceleration = FILAMENT_CHANGE_UNLOAD_ACCEL;
#endif
do_pause_e_move(unload_length, FILAMENT_CHANGE_UNLOAD_FEEDRATE);
#if FILAMENT_CHANGE_FAST_LOAD_ACCEL > 0
- planner.retract_acceleration = saved_acceleration;
+ planner.settings.retract_acceleration = saved_acceleration;
#endif
// Disable extruders steppers for manual filament changing (only on boards that have separate ENABLE_PINS)
@@ -559,7 +558,7 @@ void resume_print(const float &slow_load_length/*=0*/, const float &fast_load_le
#if ENABLED(FWRETRACT)
// If retracted before goto pause
if (fwretract.retracted[active_extruder])
- do_pause_e_move(-fwretract.retract_length, fwretract.retract_feedrate_mm_s);
+ do_pause_e_move(-fwretract.settings.retract_length, fwretract.settings.retract_feedrate_mm_s);
#endif
// If resume_position is negative
diff --git a/Marlin/src/feature/pause.h b/Marlin/src/feature/pause.h
index 2f607989fc..7c60bdecbb 100644
--- a/Marlin/src/feature/pause.h
+++ b/Marlin/src/feature/pause.h
@@ -19,15 +19,13 @@
* along with this program. If not, see .
*
*/
+#pragma once
/**
* feature/pause.h - Pause feature support functions
* This may be combined with related G-codes if features are consolidated.
*/
-#ifndef _PAUSE_H_
-#define _PAUSE_H_
-
#include "../libs/nozzle.h"
#include "../inc/MarlinConfigPre.h"
@@ -62,8 +60,7 @@ enum AdvancedPauseMenuResponse : char {
extern AdvancedPauseMenuResponse advanced_pause_menu_response;
-extern float filament_change_unload_length[EXTRUDERS],
- filament_change_load_length[EXTRUDERS];
+extern fil_change_settings_t fc_settings[EXTRUDERS];
extern uint8_t did_pause_print;
@@ -89,5 +86,3 @@ bool load_filament(const float &slow_load_length=0, const float &fast_load_lengt
const bool pause_for_user=false, const AdvancedPauseMode mode=ADVANCED_PAUSE_MODE_PAUSE_PRINT DXC_PARAMS);
bool unload_filament(const float &unload_length, const bool show_lcd=false, const AdvancedPauseMode mode=ADVANCED_PAUSE_MODE_PAUSE_PRINT);
-
-#endif // _PAUSE_H_
diff --git a/Marlin/src/feature/runout.h b/Marlin/src/feature/runout.h
index 13233d3d6e..500013c9c7 100644
--- a/Marlin/src/feature/runout.h
+++ b/Marlin/src/feature/runout.h
@@ -34,6 +34,10 @@
#include "../inc/MarlinConfig.h"
+#if ENABLED(EXTENSIBLE_UI)
+ #include "../lcd/extensible_ui/ui_api.h"
+#endif
+
#define FIL_RUNOUT_THRESHOLD 5
class FilamentRunoutSensor {
@@ -49,6 +53,9 @@ class FilamentRunoutSensor {
FORCE_INLINE static void run() {
if ((IS_SD_PRINTING || print_job_timer.isRunning()) && check() && !filament_ran_out) {
filament_ran_out = true;
+ #if ENABLED(EXTENSIBLE_UI)
+ UI::onFilamentRunout();
+ #endif
enqueue_and_echo_commands_P(PSTR(FILAMENT_RUNOUT_SCRIPT));
planner.synchronize();
}
diff --git a/Marlin/src/feature/tmc_util.cpp b/Marlin/src/feature/tmc_util.cpp
index 2db0dd2d57..41bbd049bc 100644
--- a/Marlin/src/feature/tmc_util.cpp
+++ b/Marlin/src/feature/tmc_util.cpp
@@ -456,62 +456,62 @@
static void tmc_debug_loop(const TMC_debug_enum i) {
#if AXIS_IS_TMC(X)
- tmc_status(stepperX, i, planner.axis_steps_per_mm[X_AXIS]);
+ tmc_status(stepperX, i, planner.settings.axis_steps_per_mm[X_AXIS]);
#endif
#if AXIS_IS_TMC(X2)
- tmc_status(stepperX2, i, planner.axis_steps_per_mm[X_AXIS]);
+ tmc_status(stepperX2, i, planner.settings.axis_steps_per_mm[X_AXIS]);
#endif
#if AXIS_IS_TMC(Y)
- tmc_status(stepperY, i, planner.axis_steps_per_mm[Y_AXIS]);
+ tmc_status(stepperY, i, planner.settings.axis_steps_per_mm[Y_AXIS]);
#endif
#if AXIS_IS_TMC(Y2)
- tmc_status(stepperY2, i, planner.axis_steps_per_mm[Y_AXIS]);
+ tmc_status(stepperY2, i, planner.settings.axis_steps_per_mm[Y_AXIS]);
#endif
#if AXIS_IS_TMC(Z)
- tmc_status(stepperZ, i, planner.axis_steps_per_mm[Z_AXIS]);
+ tmc_status(stepperZ, i, planner.settings.axis_steps_per_mm[Z_AXIS]);
#endif
#if AXIS_IS_TMC(Z2)
- tmc_status(stepperZ2, i, planner.axis_steps_per_mm[Z_AXIS]);
+ tmc_status(stepperZ2, i, planner.settings.axis_steps_per_mm[Z_AXIS]);
#endif
#if AXIS_IS_TMC(Z3)
- tmc_status(stepperZ3, i, planner.axis_steps_per_mm[Z_AXIS]);
+ tmc_status(stepperZ3, i, planner.settings.axis_steps_per_mm[Z_AXIS]);
#endif
#if AXIS_IS_TMC(E0)
- tmc_status(stepperE0, i, planner.axis_steps_per_mm[E_AXIS]);
+ tmc_status(stepperE0, i, planner.settings.axis_steps_per_mm[E_AXIS]);
#endif
#if AXIS_IS_TMC(E1)
- tmc_status(stepperE1, i, planner.axis_steps_per_mm[E_AXIS
+ tmc_status(stepperE1, i, planner.settings.axis_steps_per_mm[E_AXIS
#if ENABLED(DISTINCT_E_FACTORS)
+ 1
#endif
]);
#endif
#if AXIS_IS_TMC(E2)
- tmc_status(stepperE2, i, planner.axis_steps_per_mm[E_AXIS
+ tmc_status(stepperE2, i, planner.settings.axis_steps_per_mm[E_AXIS
#if ENABLED(DISTINCT_E_FACTORS)
+ 2
#endif
]);
#endif
#if AXIS_IS_TMC(E3)
- tmc_status(stepperE3, i, planner.axis_steps_per_mm[E_AXIS
+ tmc_status(stepperE3, i, planner.settings.axis_steps_per_mm[E_AXIS
#if ENABLED(DISTINCT_E_FACTORS)
+ 3
#endif
]);
#endif
#if AXIS_IS_TMC(E4)
- tmc_status(stepperE4, i, planner.axis_steps_per_mm[E_AXIS
+ tmc_status(stepperE4, i, planner.settings.axis_steps_per_mm[E_AXIS
#if ENABLED(DISTINCT_E_FACTORS)
+ 4
#endif
]);
#endif
#if AXIS_IS_TMC(E5)
- tmc_status(stepperE5, i, planner.axis_steps_per_mm[E_AXIS
+ tmc_status(stepperE5, i, planner.settings.axis_steps_per_mm[E_AXIS
#if ENABLED(DISTINCT_E_FACTORS)
+ 5
#endif
diff --git a/Marlin/src/gcode/bedlevel/G26.cpp b/Marlin/src/gcode/bedlevel/G26.cpp
index e94fdcda71..5b666c96b9 100644
--- a/Marlin/src/gcode/bedlevel/G26.cpp
+++ b/Marlin/src/gcode/bedlevel/G26.cpp
@@ -232,7 +232,7 @@ void move_to(const float &rx, const float &ry, const float &z, const float &e_de
if (z != last_z) {
last_z = z;
- feed_value = planner.max_feedrate_mm_s[Z_AXIS]/(3.0); // Base the feed rate off of the configured Z_AXIS feed rate
+ feed_value = planner.settings.max_feedrate_mm_s[Z_AXIS]/(3.0); // Base the feed rate off of the configured Z_AXIS feed rate
destination[X_AXIS] = current_position[X_AXIS];
destination[Y_AXIS] = current_position[Y_AXIS];
@@ -245,7 +245,7 @@ void move_to(const float &rx, const float &ry, const float &z, const float &e_de
// Check if X or Y is involved in the movement.
// Yes: a 'normal' movement. No: a retract() or recover()
- feed_value = has_xy_component ? PLANNER_XY_FEEDRATE() / 10.0 : planner.max_feedrate_mm_s[E_AXIS] / 1.5;
+ feed_value = has_xy_component ? PLANNER_XY_FEEDRATE() / 10.0 : planner.settings.max_feedrate_mm_s[E_AXIS] / 1.5;
if (g26_debug_flag) SERIAL_ECHOLNPAIR("in move_to() feed_value for XY:", feed_value);
@@ -475,7 +475,9 @@ inline bool turn_on_heaters() {
inline bool prime_nozzle() {
#if ENABLED(ULTIPANEL)
- float Total_Prime = 0.0;
+ #if ENABLED(PREVENT_LENGTHY_EXTRUDE)
+ float Total_Prime = 0.0;
+ #endif
if (g26_prime_flag == -1) { // The user wants to control how much filament gets purged
@@ -490,11 +492,11 @@ inline bool prime_nozzle() {
while (!is_lcd_clicked()) {
lcd_chirp();
destination[E_AXIS] += 0.25;
- #ifdef PREVENT_LENGTHY_EXTRUDE
+ #if ENABLED(PREVENT_LENGTHY_EXTRUDE)
Total_Prime += 0.25;
if (Total_Prime >= EXTRUDE_MAXLENGTH) return G26_ERR;
#endif
- G26_line_to_destination(planner.max_feedrate_mm_s[E_AXIS] / 15.0);
+ G26_line_to_destination(planner.settings.max_feedrate_mm_s[E_AXIS] / 15.0);
set_destination_from_current();
planner.synchronize(); // Without this synchronize, the purge is more consistent,
// but because the planner has a buffer, we won't be able
@@ -517,7 +519,7 @@ inline bool prime_nozzle() {
#endif
set_destination_from_current();
destination[E_AXIS] += g26_prime_length;
- G26_line_to_destination(planner.max_feedrate_mm_s[E_AXIS] / 15.0);
+ G26_line_to_destination(planner.settings.max_feedrate_mm_s[E_AXIS] / 15.0);
set_destination_from_current();
retract_filament(destination);
}
diff --git a/Marlin/src/gcode/calibrate/M48.cpp b/Marlin/src/gcode/calibrate/M48.cpp
index dd646961f7..098d626f5e 100644
--- a/Marlin/src/gcode/calibrate/M48.cpp
+++ b/Marlin/src/gcode/calibrate/M48.cpp
@@ -28,10 +28,8 @@
#include "../../module/motion.h"
#include "../../module/probe.h"
-
#include "../../feature/bedlevel/bedlevel.h"
-
#if HAS_LEVELING
#include "../../module/planner.h"
#endif
diff --git a/Marlin/src/gcode/calibrate/M852.cpp b/Marlin/src/gcode/calibrate/M852.cpp
index 927c0838e4..71805a5b1a 100644
--- a/Marlin/src/gcode/calibrate/M852.cpp
+++ b/Marlin/src/gcode/calibrate/M852.cpp
@@ -42,8 +42,8 @@ void GcodeSuite::M852() {
++ijk;
const float value = parser.value_linear_units();
if (WITHIN(value, SKEW_FACTOR_MIN, SKEW_FACTOR_MAX)) {
- if (planner.xy_skew_factor != value) {
- planner.xy_skew_factor = value;
+ if (planner.skew_factor.xy != value) {
+ planner.skew_factor.xy = value;
++setval;
}
}
@@ -57,8 +57,8 @@ void GcodeSuite::M852() {
++ijk;
const float value = parser.value_linear_units();
if (WITHIN(value, SKEW_FACTOR_MIN, SKEW_FACTOR_MAX)) {
- if (planner.xz_skew_factor != value) {
- planner.xz_skew_factor = value;
+ if (planner.skew_factor.xz != value) {
+ planner.skew_factor.xz = value;
++setval;
}
}
@@ -70,8 +70,8 @@ void GcodeSuite::M852() {
++ijk;
const float value = parser.value_linear_units();
if (WITHIN(value, SKEW_FACTOR_MIN, SKEW_FACTOR_MAX)) {
- if (planner.yz_skew_factor != value) {
- planner.yz_skew_factor = value;
+ if (planner.skew_factor.yz != value) {
+ planner.skew_factor.yz = value;
++setval;
}
}
@@ -94,11 +94,11 @@ void GcodeSuite::M852() {
if (!ijk) {
SERIAL_ECHO_START();
SERIAL_ECHOPGM(MSG_SKEW_FACTOR " XY: ");
- SERIAL_ECHO_F(planner.xy_skew_factor, 6);
+ SERIAL_ECHO_F(planner.skew_factor.xy, 6);
SERIAL_EOL();
#if ENABLED(SKEW_CORRECTION_FOR_Z)
- SERIAL_ECHOPAIR(" XZ: ", planner.xz_skew_factor);
- SERIAL_ECHOLNPAIR(" YZ: ", planner.yz_skew_factor);
+ SERIAL_ECHOPAIR(" XZ: ", planner.skew_factor.xz);
+ SERIAL_ECHOLNPAIR(" YZ: ", planner.skew_factor.yz);
#else
SERIAL_EOL();
#endif
diff --git a/Marlin/src/gcode/config/M200-M205.cpp b/Marlin/src/gcode/config/M200-M205.cpp
index 132cfc9ae1..ebd76cd798 100644
--- a/Marlin/src/gcode/config/M200-M205.cpp
+++ b/Marlin/src/gcode/config/M200-M205.cpp
@@ -60,7 +60,7 @@ void GcodeSuite::M201() {
LOOP_XYZE(i) {
if (parser.seen(axis_codes[i])) {
const uint8_t a = i + (i == E_AXIS ? TARGET_EXTRUDER : 0);
- planner.max_acceleration_mm_per_s2[a] = parser.value_axis_units((AxisEnum)a);
+ planner.settings.max_acceleration_mm_per_s2[a] = parser.value_axis_units((AxisEnum)a);
}
}
// steps per sq second need to be updated to agree with the units per sq second (as they are what is used in the planner)
@@ -79,7 +79,7 @@ void GcodeSuite::M203() {
LOOP_XYZE(i)
if (parser.seen(axis_codes[i])) {
const uint8_t a = i + (i == E_AXIS ? TARGET_EXTRUDER : 0);
- planner.max_feedrate_mm_s[a] = parser.value_axis_units((AxisEnum)a);
+ planner.settings.max_feedrate_mm_s[a] = parser.value_axis_units((AxisEnum)a);
}
}
@@ -93,25 +93,25 @@ void GcodeSuite::M203() {
void GcodeSuite::M204() {
bool report = true;
if (parser.seenval('S')) { // Kept for legacy compatibility. Should NOT BE USED for new developments.
- planner.travel_acceleration = planner.acceleration = parser.value_linear_units();
+ planner.settings.travel_acceleration = planner.settings.acceleration = parser.value_linear_units();
report = false;
}
if (parser.seenval('P')) {
- planner.acceleration = parser.value_linear_units();
+ planner.settings.acceleration = parser.value_linear_units();
report = false;
}
if (parser.seenval('R')) {
- planner.retract_acceleration = parser.value_linear_units();
+ planner.settings.retract_acceleration = parser.value_linear_units();
report = false;
}
if (parser.seenval('T')) {
- planner.travel_acceleration = parser.value_linear_units();
+ planner.settings.travel_acceleration = parser.value_linear_units();
report = false;
}
if (report) {
- SERIAL_ECHOPAIR("Acceleration: P", planner.acceleration);
- SERIAL_ECHOPAIR(" R", planner.retract_acceleration);
- SERIAL_ECHOLNPAIR(" T", planner.travel_acceleration);
+ SERIAL_ECHOPAIR("Acceleration: P", planner.settings.acceleration);
+ SERIAL_ECHOPAIR(" R", planner.settings.retract_acceleration);
+ SERIAL_ECHOLNPAIR(" T", planner.settings.travel_acceleration);
}
}
@@ -128,9 +128,9 @@ void GcodeSuite::M204() {
* J = Junction Deviation (mm) (Requires JUNCTION_DEVIATION)
*/
void GcodeSuite::M205() {
- if (parser.seen('B')) planner.min_segment_time_us = parser.value_ulong();
- if (parser.seen('S')) planner.min_feedrate_mm_s = parser.value_linear_units();
- if (parser.seen('T')) planner.min_travel_feedrate_mm_s = parser.value_linear_units();
+ if (parser.seen('B')) planner.settings.min_segment_time_us = parser.value_ulong();
+ if (parser.seen('S')) planner.settings.min_feedrate_mm_s = parser.value_linear_units();
+ if (parser.seen('T')) planner.settings.min_travel_feedrate_mm_s = parser.value_linear_units();
#if ENABLED(JUNCTION_DEVIATION)
if (parser.seen('J')) {
const float junc_dev = parser.value_linear_units();
diff --git a/Marlin/src/gcode/config/M217.cpp b/Marlin/src/gcode/config/M217.cpp
index 630c826d4b..e0abbc4240 100644
--- a/Marlin/src/gcode/config/M217.cpp
+++ b/Marlin/src/gcode/config/M217.cpp
@@ -36,25 +36,25 @@ void M217_report(const bool eeprom=false) {
const int16_t port = command_queue_port[cmd_queue_index_r];
#endif
serialprintPGM_P(port, eeprom ? PSTR(" M217") : PSTR("Singlenozzle:"));
- SERIAL_ECHOPAIR_P(port, " S", singlenozzle_swap_length);
- SERIAL_ECHOPAIR_P(port, " P", singlenozzle_prime_speed);
- SERIAL_ECHOLNPAIR_P(port, " R", singlenozzle_retract_speed);
+ SERIAL_ECHOPAIR_P(port, " S", sn_settings.swap_length);
+ SERIAL_ECHOPAIR_P(port, " P", sn_settings.prime_speed);
+ SERIAL_ECHOLNPAIR_P(port, " R", sn_settings.retract_speed);
}
/**
* M217 - Set SINGLENOZZLE toolchange parameters
*
* S[mm] Swap length
- * P[mm/s] Prime speed
- * R[mm/s] Retract speed
+ * P[mm/m] Prime speed
+ * R[mm/m] Retract speed
*/
void GcodeSuite::M217() {
bool report = true;
- if (parser.seenval('S')) { report = false; const float v = parser.value_float(); singlenozzle_swap_length = constrain(v, 0, 500); }
- if (parser.seenval('P')) { report = false; const int16_t v = parser.value_int(); singlenozzle_prime_speed = constrain(v, 10, 5400); }
- if (parser.seenval('R')) { report = false; const int16_t v = parser.value_int(); singlenozzle_retract_speed = constrain(v, 10, 5400); }
+ if (parser.seenval('S')) { report = false; const float v = parser.value_float(); sn_settings.swap_length = constrain(v, 0, 500); }
+ if (parser.seenval('P')) { report = false; const int16_t v = parser.value_int(); sn_settings.prime_speed = constrain(v, 10, 5400); }
+ if (parser.seenval('R')) { report = false; const int16_t v = parser.value_int(); sn_settings.retract_speed = constrain(v, 10, 5400); }
if (report) M217_report();
diff --git a/Marlin/src/gcode/config/M218.cpp b/Marlin/src/gcode/config/M218.cpp
index 6093c19c81..784ffc222d 100644
--- a/Marlin/src/gcode/config/M218.cpp
+++ b/Marlin/src/gcode/config/M218.cpp
@@ -72,7 +72,7 @@ void GcodeSuite::M218() {
#if ENABLED(DELTA)
if (target_extruder == active_extruder)
- do_blocking_move_to_xy(current_position[X_AXIS], current_position[Y_AXIS], planner.max_feedrate_mm_s[X_AXIS]);
+ do_blocking_move_to_xy(current_position[X_AXIS], current_position[Y_AXIS], planner.settings.max_feedrate_mm_s[X_AXIS]);
#endif
}
diff --git a/Marlin/src/gcode/config/M304.cpp b/Marlin/src/gcode/config/M304.cpp
index 3bc645903f..a4251482ae 100644
--- a/Marlin/src/gcode/config/M304.cpp
+++ b/Marlin/src/gcode/config/M304.cpp
@@ -28,14 +28,14 @@
#include "../../module/temperature.h"
void GcodeSuite::M304() {
- if (parser.seen('P')) thermalManager.bedKp = parser.value_float();
- if (parser.seen('I')) thermalManager.bedKi = scalePID_i(parser.value_float());
- if (parser.seen('D')) thermalManager.bedKd = scalePID_d(parser.value_float());
+ if (parser.seen('P')) thermalManager.bed_pid.Kp = parser.value_float();
+ if (parser.seen('I')) thermalManager.bed_pid.Ki = scalePID_i(parser.value_float());
+ if (parser.seen('D')) thermalManager.bed_pid.Kd = scalePID_d(parser.value_float());
SERIAL_ECHO_START();
- SERIAL_ECHOPAIR(" p:", thermalManager.bedKp);
- SERIAL_ECHOPAIR(" i:", unscalePID_i(thermalManager.bedKi));
- SERIAL_ECHOLNPAIR(" d:", unscalePID_d(thermalManager.bedKd));
+ SERIAL_ECHOPAIR(" p:", thermalManager.bed_pid.Kp);
+ SERIAL_ECHOPAIR(" i:", unscalePID_i(thermalManager.bed_pid.Ki));
+ SERIAL_ECHOLNPAIR(" d:", unscalePID_d(thermalManager.bed_pid.Kd));
}
#endif // PIDTEMPBED
diff --git a/Marlin/src/gcode/config/M92.cpp b/Marlin/src/gcode/config/M92.cpp
index 2ac913e701..e3423a2a60 100644
--- a/Marlin/src/gcode/config/M92.cpp
+++ b/Marlin/src/gcode/config/M92.cpp
@@ -38,17 +38,17 @@ void GcodeSuite::M92() {
if (i == E_AXIS) {
const float value = parser.value_per_axis_unit((AxisEnum)(E_AXIS + TARGET_EXTRUDER));
if (value < 20) {
- float factor = planner.axis_steps_per_mm[E_AXIS + TARGET_EXTRUDER] / value; // increase e constants if M92 E14 is given for netfab.
+ float factor = planner.settings.axis_steps_per_mm[E_AXIS + TARGET_EXTRUDER] / value; // increase e constants if M92 E14 is given for netfab.
#if HAS_CLASSIC_JERK && (DISABLED(JUNCTION_DEVIATION) || DISABLED(LIN_ADVANCE))
planner.max_jerk[E_AXIS] *= factor;
#endif
- planner.max_feedrate_mm_s[E_AXIS + TARGET_EXTRUDER] *= factor;
+ planner.settings.max_feedrate_mm_s[E_AXIS + TARGET_EXTRUDER] *= factor;
planner.max_acceleration_steps_per_s2[E_AXIS + TARGET_EXTRUDER] *= factor;
}
- planner.axis_steps_per_mm[E_AXIS + TARGET_EXTRUDER] = value;
+ planner.settings.axis_steps_per_mm[E_AXIS + TARGET_EXTRUDER] = value;
}
else {
- planner.axis_steps_per_mm[i] = parser.value_per_axis_unit((AxisEnum)i);
+ planner.settings.axis_steps_per_mm[i] = parser.value_per_axis_unit((AxisEnum)i);
}
}
}
diff --git a/Marlin/src/gcode/control/M350_M351.cpp b/Marlin/src/gcode/control/M350_M351.cpp
index cd75e7b2b1..a83823f315 100644
--- a/Marlin/src/gcode/control/M350_M351.cpp
+++ b/Marlin/src/gcode/control/M350_M351.cpp
@@ -41,17 +41,21 @@ void GcodeSuite::M350() {
/**
* M351: Toggle MS1 MS2 pins directly with axis codes X Y Z E B
- * S# determines MS1 or MS2, X# sets the pin high/low.
+ * S# determines MS1, MS2 or MS3, X# sets the pin high/low.
*/
void GcodeSuite::M351() {
if (parser.seenval('S')) switch (parser.value_byte()) {
case 1:
- LOOP_XYZE(i) if (parser.seenval(axis_codes[i])) stepper.microstep_ms(i, parser.value_byte(), -1);
- if (parser.seenval('B')) stepper.microstep_ms(4, parser.value_byte(), -1);
+ LOOP_XYZE(i) if (parser.seenval(axis_codes[i])) stepper.microstep_ms(i, parser.value_byte(), -1, -1);
+ if (parser.seenval('B')) stepper.microstep_ms(4, parser.value_byte(), -1, -1);
break;
case 2:
- LOOP_XYZE(i) if (parser.seenval(axis_codes[i])) stepper.microstep_ms(i, -1, parser.value_byte());
- if (parser.seenval('B')) stepper.microstep_ms(4, -1, parser.value_byte());
+ LOOP_XYZE(i) if (parser.seenval(axis_codes[i])) stepper.microstep_ms(i, -1, parser.value_byte(), -1);
+ if (parser.seenval('B')) stepper.microstep_ms(4, -1, parser.value_byte(), -1);
+ break;
+ case 3:
+ LOOP_XYZE(i) if (parser.seenval(axis_codes[i])) stepper.microstep_ms(i, -1, -1, parser.value_byte());
+ if (parser.seenval('B')) stepper.microstep_ms(4, -1, -1, parser.value_byte());
break;
}
stepper.microstep_readings();
diff --git a/Marlin/src/gcode/eeprom/M500-M504.cpp b/Marlin/src/gcode/eeprom/M500-M504.cpp
index 8c5e3af9df..07099c3149 100644
--- a/Marlin/src/gcode/eeprom/M500-M504.cpp
+++ b/Marlin/src/gcode/eeprom/M500-M504.cpp
@@ -25,6 +25,10 @@
#include "../../core/serial.h"
#include "../../inc/MarlinConfig.h"
+#if ENABLED(EXTENSIBLE_UI)
+ #include "../../lcd/extensible_ui/ui_api.h"
+#endif
+
#if NUM_SERIAL > 1
#include "../../gcode/queue.h"
#endif
@@ -40,6 +44,9 @@
*/
void GcodeSuite::M500() {
(void)settings.save(CHAT_PORT);
+ #if ENABLED(EXTENSIBLE_UI)
+ UI::onStoreSettings();
+ #endif
}
/**
@@ -58,6 +65,9 @@ void GcodeSuite::M501() {
*/
void GcodeSuite::M502() {
(void)settings.reset(CHAT_PORT);
+ #if ENABLED(EXTENSIBLE_UI)
+ UI::onFactoryReset();
+ #endif
}
#if DISABLED(DISABLE_M503)
diff --git a/Marlin/src/gcode/feature/fwretract/M207-M209.cpp b/Marlin/src/gcode/feature/fwretract/M207-M209.cpp
index fb214ed737..81c5ca5977 100644
--- a/Marlin/src/gcode/feature/fwretract/M207-M209.cpp
+++ b/Marlin/src/gcode/feature/fwretract/M207-M209.cpp
@@ -36,10 +36,10 @@
* Z[units] retract_zlift
*/
void GcodeSuite::M207() {
- if (parser.seen('S')) fwretract.retract_length = parser.value_axis_units(E_AXIS);
- if (parser.seen('F')) fwretract.retract_feedrate_mm_s = MMM_TO_MMS(parser.value_axis_units(E_AXIS));
- if (parser.seen('Z')) fwretract.retract_zlift = parser.value_linear_units();
- if (parser.seen('W')) fwretract.swap_retract_length = parser.value_axis_units(E_AXIS);
+ if (parser.seen('S')) fwretract.settings.retract_length = parser.value_axis_units(E_AXIS);
+ if (parser.seen('F')) fwretract.settings.retract_feedrate_mm_s = MMM_TO_MMS(parser.value_axis_units(E_AXIS));
+ if (parser.seen('Z')) fwretract.settings.retract_zlift = parser.value_linear_units();
+ if (parser.seen('W')) fwretract.settings.swap_retract_length = parser.value_axis_units(E_AXIS);
}
/**
@@ -51,10 +51,10 @@ void GcodeSuite::M207() {
* R[units/min] swap_retract_recover_feedrate_mm_s
*/
void GcodeSuite::M208() {
- if (parser.seen('S')) fwretract.retract_recover_length = parser.value_axis_units(E_AXIS);
- if (parser.seen('F')) fwretract.retract_recover_feedrate_mm_s = MMM_TO_MMS(parser.value_axis_units(E_AXIS));
- if (parser.seen('R')) fwretract.swap_retract_recover_feedrate_mm_s = MMM_TO_MMS(parser.value_axis_units(E_AXIS));
- if (parser.seen('W')) fwretract.swap_retract_recover_length = parser.value_axis_units(E_AXIS);
+ if (parser.seen('S')) fwretract.settings.retract_recover_length = parser.value_axis_units(E_AXIS);
+ if (parser.seen('F')) fwretract.settings.retract_recover_feedrate_mm_s = MMM_TO_MMS(parser.value_axis_units(E_AXIS));
+ if (parser.seen('R')) fwretract.settings.swap_retract_recover_feedrate_mm_s = MMM_TO_MMS(parser.value_axis_units(E_AXIS));
+ if (parser.seen('W')) fwretract.settings.swap_retract_recover_length = parser.value_axis_units(E_AXIS);
}
#if ENABLED(FWRETRACT_AUTORETRACT)
diff --git a/Marlin/src/gcode/feature/pause/M600.cpp b/Marlin/src/gcode/feature/pause/M600.cpp
index c471e03c6d..64661e6e5e 100644
--- a/Marlin/src/gcode/feature/pause/M600.cpp
+++ b/Marlin/src/gcode/feature/pause/M600.cpp
@@ -111,14 +111,14 @@ void GcodeSuite::M600() {
// Unload filament
const float unload_length = -ABS(parser.seen('U') ? parser.value_axis_units(E_AXIS)
- : filament_change_unload_length[active_extruder]);
+ : fc_settings[active_extruder].unload_length);
// Slow load filament
constexpr float slow_load_length = FILAMENT_CHANGE_SLOW_LOAD_LENGTH;
// Fast load filament
const float fast_load_length = ABS(parser.seen('L') ? parser.value_axis_units(E_AXIS)
- : filament_change_load_length[active_extruder]);
+ : fc_settings[active_extruder].load_length);
const int beep_count = parser.intval('B',
#ifdef FILAMENT_CHANGE_ALERT_BEEPS
diff --git a/Marlin/src/gcode/feature/pause/M603.cpp b/Marlin/src/gcode/feature/pause/M603.cpp
index a6231c3169..08236187dd 100644
--- a/Marlin/src/gcode/feature/pause/M603.cpp
+++ b/Marlin/src/gcode/feature/pause/M603.cpp
@@ -47,17 +47,17 @@ void GcodeSuite::M603() {
// Unload length
if (parser.seen('U')) {
- filament_change_unload_length[target_extruder] = ABS(parser.value_axis_units(E_AXIS));
+ fc_settings[target_extruder].unload_length = ABS(parser.value_axis_units(E_AXIS));
#if ENABLED(PREVENT_LENGTHY_EXTRUDE)
- NOMORE(filament_change_unload_length[target_extruder], EXTRUDE_MAXLENGTH);
+ NOMORE(fc_settings[target_extruder].unload_length, EXTRUDE_MAXLENGTH);
#endif
}
// Load length
if (parser.seen('L')) {
- filament_change_load_length[target_extruder] = ABS(parser.value_axis_units(E_AXIS));
+ fc_settings[target_extruder].load_length = ABS(parser.value_axis_units(E_AXIS));
#if ENABLED(PREVENT_LENGTHY_EXTRUDE)
- NOMORE(filament_change_load_length[target_extruder], EXTRUDE_MAXLENGTH);
+ NOMORE(fc_settings[target_extruder].load_length, EXTRUDE_MAXLENGTH);
#endif
}
}
diff --git a/Marlin/src/gcode/feature/pause/M701_M702.cpp b/Marlin/src/gcode/feature/pause/M701_M702.cpp
index ed074a4123..5e438fc1ce 100644
--- a/Marlin/src/gcode/feature/pause/M701_M702.cpp
+++ b/Marlin/src/gcode/feature/pause/M701_M702.cpp
@@ -79,7 +79,7 @@ void GcodeSuite::M701() {
// Load filament
constexpr float slow_load_length = FILAMENT_CHANGE_SLOW_LOAD_LENGTH;
const float fast_load_length = ABS(parser.seen('L') ? parser.value_axis_units(E_AXIS)
- : filament_change_load_length[active_extruder]);
+ : fc_settings[active_extruder].load_length);
load_filament(slow_load_length, fast_load_length, ADVANCED_PAUSE_PURGE_LENGTH, FILAMENT_CHANGE_ALERT_BEEPS,
true, thermalManager.still_heating(target_extruder), ADVANCED_PAUSE_MODE_LOAD_FILAMENT
#if ENABLED(DUAL_X_CARRIAGE)
@@ -147,7 +147,7 @@ void GcodeSuite::M702() {
if (!parser.seenval('T')) {
HOTEND_LOOP() {
if (e != active_extruder) tool_change(e, 0, true);
- unload_filament(-filament_change_unload_length[e], true, ADVANCED_PAUSE_MODE_UNLOAD_FILAMENT);
+ unload_filament(-fc_settings[e].unload_length, true, ADVANCED_PAUSE_MODE_UNLOAD_FILAMENT);
}
}
else
@@ -155,7 +155,7 @@ void GcodeSuite::M702() {
{
// Unload length
const float unload_length = -ABS(parser.seen('U') ? parser.value_axis_units(E_AXIS) :
- filament_change_unload_length[target_extruder]);
+ fc_settings[target_extruder].unload_length);
unload_filament(unload_length, true, ADVANCED_PAUSE_MODE_UNLOAD_FILAMENT);
}
diff --git a/Marlin/src/gcode/feature/trinamic/M911-M915.cpp b/Marlin/src/gcode/feature/trinamic/M911-M915.cpp
index 0d6ecc39d4..f741d935e8 100644
--- a/Marlin/src/gcode/feature/trinamic/M911-M915.cpp
+++ b/Marlin/src/gcode/feature/trinamic/M911-M915.cpp
@@ -161,10 +161,10 @@
*/
#if ENABLED(HYBRID_THRESHOLD)
void GcodeSuite::M913() {
- #define TMC_SAY_PWMTHRS(A,Q) tmc_get_pwmthrs(stepper##Q, planner.axis_steps_per_mm[_AXIS(A)])
- #define TMC_SET_PWMTHRS(A,Q) tmc_set_pwmthrs(stepper##Q, value, planner.axis_steps_per_mm[_AXIS(A)])
- #define TMC_SAY_PWMTHRS_E(E) tmc_get_pwmthrs(stepperE##E, planner.axis_steps_per_mm[E_AXIS_N(E)])
- #define TMC_SET_PWMTHRS_E(E) tmc_set_pwmthrs(stepperE##E, value, planner.axis_steps_per_mm[E_AXIS_N(E)])
+ #define TMC_SAY_PWMTHRS(A,Q) tmc_get_pwmthrs(stepper##Q, planner.settings.axis_steps_per_mm[_AXIS(A)])
+ #define TMC_SET_PWMTHRS(A,Q) tmc_set_pwmthrs(stepper##Q, value, planner.settings.axis_steps_per_mm[_AXIS(A)])
+ #define TMC_SAY_PWMTHRS_E(E) tmc_get_pwmthrs(stepperE##E, planner.settings.axis_steps_per_mm[E_AXIS_N(E)])
+ #define TMC_SET_PWMTHRS_E(E) tmc_set_pwmthrs(stepperE##E, value, planner.settings.axis_steps_per_mm[E_AXIS_N(E)])
bool report = true;
const uint8_t index = parser.byteval('I');
diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h
index aaa3b261b8..5af9e7cb22 100644
--- a/Marlin/src/gcode/gcode.h
+++ b/Marlin/src/gcode/gcode.h
@@ -113,7 +113,7 @@
* M84 - Disable steppers until next move, or use S to specify an idle
* duration after which steppers should turn off. S0 disables the timeout.
* M85 - Set inactivity shutdown timer with parameter S. To disable set zero (default)
- * M92 - Set planner.axis_steps_per_mm for one or more axes.
+ * M92 - Set planner.settings.axis_steps_per_mm for one or more axes.
* M100 - Watch Free Memory (for debugging) (Requires M100_FREE_MEMORY_WATCHER)
* M104 - Set extruder target temp.
* M105 - Report current temperatures.
@@ -336,10 +336,6 @@ public:
#define KEEPALIVE_STATE(n) NOOP
#endif
- #if ENABLED(PRINTER_EVENT_LEDS) && ENABLED(SDSUPPORT) && HAS_RESUME_CONTINUE
- static bool lights_off_after_print;
- #endif
-
static void dwell(millis_t time);
private:
diff --git a/Marlin/src/gcode/lcd/M0_M1.cpp b/Marlin/src/gcode/lcd/M0_M1.cpp
index 7563f85ff6..b2b4ccd135 100644
--- a/Marlin/src/gcode/lcd/M0_M1.cpp
+++ b/Marlin/src/gcode/lcd/M0_M1.cpp
@@ -33,9 +33,8 @@
#include "../../sd/cardreader.h"
-#if ENABLED(PRINTER_EVENT_LEDS) && ENABLED(SDSUPPORT)
- bool GcodeSuite::lights_off_after_print;
- #include "../../feature/leds/leds.h"
+#if HAS_LEDS_OFF_FLAG
+ #include "../../feature/leds/printer_event_leds.h"
#endif
/**
@@ -90,11 +89,8 @@ void GcodeSuite::M0_M1() {
else
while (wait_for_user) idle();
- #if ENABLED(PRINTER_EVENT_LEDS) && ENABLED(SDSUPPORT)
- if (lights_off_after_print) {
- leds.set_off();
- lights_off_after_print = false;
- }
+ #if HAS_LEDS_OFF_FLAG
+ printerEventLEDs.onResumeAfterWait();
#endif
#if ENABLED(ULTIPANEL)
diff --git a/Marlin/src/gcode/motion/G80.cpp b/Marlin/src/gcode/motion/G80.cpp
index 983a46392d..e51bf1e8cb 100644
--- a/Marlin/src/gcode/motion/G80.cpp
+++ b/Marlin/src/gcode/motion/G80.cpp
@@ -24,6 +24,8 @@
#if ENABLED(GCODE_MOTION_MODES)
+#include "../gcode.h"
+
/**
* G80: Cancel current motion mode
*/
diff --git a/Marlin/src/gcode/motion/M290.cpp b/Marlin/src/gcode/motion/M290.cpp
index a15b177b5c..1647e00710 100644
--- a/Marlin/src/gcode/motion/M290.cpp
+++ b/Marlin/src/gcode/motion/M290.cpp
@@ -64,7 +64,7 @@ void GcodeSuite::M290() {
for (uint8_t a = X_AXIS; a <= Z_AXIS; a++)
if (parser.seenval(axis_codes[a]) || (a == Z_AXIS && parser.seenval('S'))) {
const float offs = constrain(parser.value_axis_units((AxisEnum)a), -2, 2);
- thermalManager.babystep_axis((AxisEnum)a, offs * planner.axis_steps_per_mm[a]);
+ thermalManager.babystep_axis((AxisEnum)a, offs * planner.settings.axis_steps_per_mm[a]);
#if ENABLED(BABYSTEP_ZPROBE_OFFSET)
if (a == Z_AXIS && (!parser.seen('P') || parser.value_bool())) mod_zprobe_zoffset(offs);
#endif
@@ -72,7 +72,7 @@ void GcodeSuite::M290() {
#else
if (parser.seenval('Z') || parser.seenval('S')) {
const float offs = constrain(parser.value_axis_units(Z_AXIS), -2, 2);
- thermalManager.babystep_axis(Z_AXIS, offs * planner.axis_steps_per_mm[Z_AXIS]);
+ thermalManager.babystep_axis(Z_AXIS, offs * planner.settings.axis_steps_per_mm[Z_AXIS]);
#if ENABLED(BABYSTEP_ZPROBE_OFFSET)
if (!parser.seen('P') || parser.value_bool()) mod_zprobe_zoffset(offs);
#endif
diff --git a/Marlin/src/gcode/queue.cpp b/Marlin/src/gcode/queue.cpp
index 61d7c1d158..0c1b406f32 100644
--- a/Marlin/src/gcode/queue.cpp
+++ b/Marlin/src/gcode/queue.cpp
@@ -33,8 +33,8 @@
#include "../module/temperature.h"
#include "../Marlin.h"
-#if HAS_COLOR_LEDS
- #include "../feature/leds/leds.h"
+#if ENABLED(PRINTER_EVENT_LEDS)
+ #include "../feature/leds/printer_event_leds.h"
#endif
#if ENABLED(POWER_LOSS_RECOVERY)
@@ -484,10 +484,8 @@ inline void get_serial_commands() {
else {
SERIAL_PROTOCOLLNPGM(MSG_FILE_PRINTED);
#if ENABLED(PRINTER_EVENT_LEDS)
- LCD_MESSAGEPGM(MSG_INFO_COMPLETED_PRINTS);
- leds.set_green();
+ printerEventLEDs.onPrintCompleted();
#if HAS_RESUME_CONTINUE
- gcode.lights_off_after_print = true;
enqueue_and_echo_commands_P(PSTR("M0 S"
#if ENABLED(NEWPANEL)
"1800"
@@ -495,9 +493,6 @@ inline void get_serial_commands() {
"60"
#endif
));
- #else
- safe_delay(2000);
- leds.set_off();
#endif
#endif // PRINTER_EVENT_LEDS
}
diff --git a/Marlin/src/gcode/stats/M75-M78.cpp b/Marlin/src/gcode/stats/M75-M78.cpp
index 351efd10c7..742bd3f2eb 100644
--- a/Marlin/src/gcode/stats/M75-M78.cpp
+++ b/Marlin/src/gcode/stats/M75-M78.cpp
@@ -23,20 +23,39 @@
#include "../gcode.h"
#include "../../module/printcounter.h"
+#if ENABLED(EXTENSIBLE_UI)
+ #include "../../lcd/extensible_ui/ui_api.h"
+#endif
+
/**
* M75: Start print timer
*/
-void GcodeSuite::M75() { print_job_timer.start(); }
+void GcodeSuite::M75() {
+ print_job_timer.start();
+ #if ENABLED(EXTENSIBLE_UI)
+ UI::onPrintTimerStarted();
+ #endif
+}
/**
* M76: Pause print timer
*/
-void GcodeSuite::M76() { print_job_timer.pause(); }
+void GcodeSuite::M76() {
+ print_job_timer.pause();
+ #if ENABLED(EXTENSIBLE_UI)
+ UI::onPrintTimerPaused();
+ #endif
+}
/**
* M77: Stop print timer
*/
-void GcodeSuite::M77() { print_job_timer.stop(); }
+void GcodeSuite::M77() {
+ print_job_timer.stop();
+ #if ENABLED(EXTENSIBLE_UI)
+ UI::onPrintTimerStopped();
+ #endif
+}
#if ENABLED(PRINTCOUNTER)
diff --git a/Marlin/src/gcode/temperature/M104_M109.cpp b/Marlin/src/gcode/temperature/M104_M109.cpp
index 7ce80d9ae7..4868f2b4d3 100644
--- a/Marlin/src/gcode/temperature/M104_M109.cpp
+++ b/Marlin/src/gcode/temperature/M104_M109.cpp
@@ -31,10 +31,6 @@
#include "../../module/printcounter.h"
#endif
-#if ENABLED(PRINTER_EVENT_LEDS)
- #include "../../feature/leds/leds.h"
-#endif
-
#if ENABLED(SINGLENOZZLE)
#include "../../module/tool_change.h"
#endif
diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h
index 5b97809020..f5c086fed9 100644
--- a/Marlin/src/inc/Conditionals_LCD.h
+++ b/Marlin/src/inc/Conditionals_LCD.h
@@ -543,8 +543,9 @@
#define HOMING_Z_WITH_PROBE (HAS_BED_PROBE && Z_HOME_DIR < 0 && ENABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN))
#define HAS_SOFTWARE_ENDSTOPS (ENABLED(MIN_SOFTWARE_ENDSTOPS) || ENABLED(MAX_SOFTWARE_ENDSTOPS))
-#define HAS_RESUME_CONTINUE (ENABLED(NEWPANEL) || ENABLED(EMERGENCY_PARSER))
+#define HAS_RESUME_CONTINUE (ENABLED(EXTENSIBLE_UI) || ENABLED(NEWPANEL) || ENABLED(EMERGENCY_PARSER))
#define HAS_COLOR_LEDS (ENABLED(BLINKM) || ENABLED(RGB_LED) || ENABLED(RGBW_LED) || ENABLED(PCA9632) || ENABLED(NEOPIXEL_LED))
+#define HAS_LEDS_OFF_FLAG (ENABLED(PRINTER_EVENT_LEDS) && ENABLED(SDSUPPORT) && HAS_RESUME_CONTINUE)
#define Z_MULTI_STEPPER_DRIVERS (ENABLED(Z_DUAL_STEPPER_DRIVERS) || ENABLED(Z_TRIPLE_STEPPER_DRIVERS))
#define Z_MULTI_ENDSTOPS (ENABLED(Z_DUAL_ENDSTOPS) || ENABLED(Z_TRIPLE_ENDSTOPS))
diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h
index 5189529850..969a7021c0 100644
--- a/Marlin/src/inc/Conditionals_post.h
+++ b/Marlin/src/inc/Conditionals_post.h
@@ -236,26 +236,37 @@
#define MAX_AUTORETRACT 99
#endif
-// MS1 MS2 Stepper Driver Microstepping mode table
-#define MICROSTEP1 LOW,LOW
-#if ENABLED(HEROIC_STEPPER_DRIVERS)
- #define MICROSTEP128 LOW,HIGH
-#else
- #define MICROSTEP2 HIGH,LOW
- #define MICROSTEP4 LOW,HIGH
-#endif
-#define MICROSTEP8 HIGH,HIGH
-#ifdef __SAM3X8E__
- #if MB(ALLIGATOR)
- #define MICROSTEP16 LOW,LOW
- #define MICROSTEP32 HIGH,HIGH
+// MS1 MS2 MS3 Stepper Driver Microstepping mode table
+#if DISABLED(MICROSTEP_CUSTOM)
+ #define MICROSTEP1 LOW,LOW,LOW
+ #if ENABLED(HEROIC_STEPPER_DRIVERS)
+ #define MICROSTEP128 LOW,HIGH,LOW
#else
- #define MICROSTEP16 HIGH,HIGH
+ #define MICROSTEP2 HIGH,LOW,LOW
+ #define MICROSTEP4 LOW,HIGH,LOW
+ #endif
+ #define MICROSTEP8 HIGH,HIGH,LOW
+ #ifdef __SAM3X8E__
+ #if MB(ALLIGATOR)
+ #define MICROSTEP16 LOW,LOW,LOW
+ #define MICROSTEP32 HIGH,HIGH,LOW
+ #else
+ #define MICROSTEP16 HIGH,HIGH,LOW
+ #endif
+ #else
+ #define MICROSTEP16 HIGH,HIGH,LOW
#endif
-#else
- #define MICROSTEP16 HIGH,HIGH
#endif
+#define HAS_MICROSTEP1 defined(MICROSTEP1)
+#define HAS_MICROSTEP2 defined(MICROSTEP2)
+#define HAS_MICROSTEP4 defined(MICROSTEP4)
+#define HAS_MICROSTEP8 defined(MICROSTEP8)
+#define HAS_MICROSTEP16 defined(MICROSTEP16)
+#define HAS_MICROSTEP32 defined(MICROSTEP32)
+#define HAS_MICROSTEP64 defined(MICROSTEP64)
+#define HAS_MICROSTEP128 defined(MICROSTEP128)
+
/**
* Override here because this is set in Configuration_adv.h
*/
@@ -828,6 +839,7 @@
#define HAS_Z3_ENABLE (PIN_EXISTS(Z3_ENABLE))
#define HAS_Z3_DIR (PIN_EXISTS(Z3_DIR))
#define HAS_Z3_STEP (PIN_EXISTS(Z3_STEP))
+#define HAS_Z3_MICROSTEPS (PIN_EXISTS(Z3_MS1))
// Extruder steppers and solenoids
#define HAS_E0_ENABLE (PIN_EXISTS(E0_ENABLE))
@@ -1003,7 +1015,7 @@
#define HAS_CASE_LIGHT (PIN_EXISTS(CASE_LIGHT) && ENABLED(CASE_LIGHT_ENABLE))
// Digital control
-#define HAS_MICROSTEPS (HAS_X_MICROSTEPS || HAS_Y_MICROSTEPS || HAS_Z_MICROSTEPS || HAS_E0_MICROSTEPS || HAS_E1_MICROSTEPS || HAS_E2_MICROSTEPS || HAS_E3_MICROSTEPS || HAS_E4_MICROSTEPS || HAS_E5_MICROSTEPS)
+#define HAS_MICROSTEPS (HAS_X_MICROSTEPS || HAS_X2_MICROSTEPS || HAS_Y_MICROSTEPS || HAS_Y2_MICROSTEPS || HAS_Z_MICROSTEPS || HAS_Z2_MICROSTEPS || HAS_Z3_MICROSTEPS || HAS_E0_MICROSTEPS || HAS_E1_MICROSTEPS || HAS_E2_MICROSTEPS || HAS_E3_MICROSTEPS || HAS_E4_MICROSTEPS || HAS_E5_MICROSTEPS)
#define HAS_STEPPER_RESET (PIN_EXISTS(STEPPER_RESET))
#define HAS_DIGIPOTSS (PIN_EXISTS(DIGIPOTSS))
#define HAS_MOTOR_CURRENT_PWM (PIN_EXISTS(MOTOR_CURRENT_PWM_XY) || PIN_EXISTS(MOTOR_CURRENT_PWM_Z) || PIN_EXISTS(MOTOR_CURRENT_PWM_E))
@@ -1513,28 +1525,6 @@
// Add commands that need sub-codes to this list
#define USE_GCODE_SUBCODES ENABLED(G38_PROBE_TARGET) || ENABLED(CNC_COORDINATE_SYSTEMS) || ENABLED(POWER_LOSS_RECOVERY)
-// Single Nozzle swap on toolchange defaults
-#if ENABLED(SINGLENOZZLE)
- #ifndef SINGLENOZZLE_SWAP_LENGTH
- #define SINGLENOZZLE_SWAP_LENGTH 0
- #endif
- #ifndef SINGLENOZZLE_SWAP_RETRACT_SPEED
- #define SINGLENOZZLE_SWAP_RETRACT_SPEED 60.0
- #endif
- #ifndef SINGLENOZZLE_SWAP_PRIME_SPEED
- #define SINGLENOZZLE_SWAP_PRIME_SPEED 60.0
- #endif
- #if ENABLED(SINGLENOZZLE_SWAP_PARK)
- #ifndef SINGLENOZZLE_TOOLCHANGE_POSITION
- #define SINGLENOZZLE_TOOLCHANGE_POSITION { (X_MIN_POS + 10), (Y_MIN_POS + 10), 5 }
- #endif
- #else
- #ifndef SINGLENOZZLE_TOOLCHANGE_ZRAISE
- #define SINGLENOZZLE_TOOLCHANGE_ZRAISE 2.0
- #endif
- #endif
-#endif
-
// Parking Extruder
#if ENABLED(PARKING_EXTRUDER)
#ifndef PARKING_EXTRUDER_GRAB_DISTANCE
diff --git a/Marlin/src/inc/MarlinConfig.h b/Marlin/src/inc/MarlinConfig.h
index e5489886dc..226af65a2d 100644
--- a/Marlin/src/inc/MarlinConfig.h
+++ b/Marlin/src/inc/MarlinConfig.h
@@ -31,6 +31,8 @@
#include "../pins/pins.h"
+#include HAL_PATH(../HAL, spi_pins.h)
+
#if defined(__AVR__) && !defined(USBCON)
#define HardwareSerial_h // trick to disable the standard HWserial
#endif
diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h
index 6c75b028dc..ff0159c0d5 100644
--- a/Marlin/src/inc/SanityCheck.h
+++ b/Marlin/src/inc/SanityCheck.h
@@ -602,8 +602,25 @@ static_assert(X_MAX_LENGTH >= X_BED_SIZE && Y_MAX_LENGTH >= Y_BED_SIZE,
#error "EXTRUDERS must be 1 with HEATERS_PARALLEL."
#endif
- #if ENABLED(SINGLENOZZLE) && !defined(SINGLENOZZLE_SWAP_LENGTH)
- #define SINGLENOZZLE_SWAP_LENGTH 0
+ #if ENABLED(SINGLENOZZLE)
+ #ifndef SINGLENOZZLE_SWAP_LENGTH
+ #error "SINGLENOZZLE requires SINGLENOZZLE_SWAP_LENGTH. Please update your Configuration."
+ #elif !defined(SINGLENOZZLE_SWAP_RETRACT_SPEED)
+ #error "SINGLENOZZLE requires SINGLENOZZLE_SWAP_RETRACT_SPEED. Please update your Configuration."
+ #elif !defined(SINGLENOZZLE_SWAP_PRIME_SPEED)
+ #error "SINGLENOZZLE requires SINGLENOZZLE_SWAP_PRIME_SPEED. Please update your Configuration."
+ #endif
+ #if ENABLED(SINGLENOZZLE_SWAP_PARK)
+ #ifndef SINGLENOZZLE_TOOLCHANGE_POSITION
+ #error "SINGLENOZZLE_SWAP_PARK requires SINGLENOZZLE_TOOLCHANGE_POSITION. Please update your Configuration."
+ #elif !defined(SINGLENOZZLE_PARK_XY_FEEDRATE)
+ #error "SINGLENOZZLE_SWAP_PARK requires SINGLENOZZLE_PARK_XY_FEEDRATE. Please update your Configuration."
+ #endif
+ #else
+ #ifndef SINGLENOZZLE_TOOLCHANGE_ZRAISE
+ #error "SINGLENOZZLE requires SINGLENOZZLE_TOOLCHANGE_ZRAISE. Please update your Configuration."
+ #endif
+ #endif
#endif
#elif ENABLED(MK2_MULTIPLEXER)
@@ -1554,7 +1571,9 @@ static_assert(X_MAX_LENGTH >= X_BED_SIZE && Y_MAX_LENGTH >= Y_BED_SIZE,
* RGB_LED Requirements
*/
#define _RGB_TEST (PIN_EXISTS(RGB_LED_R) && PIN_EXISTS(RGB_LED_G) && PIN_EXISTS(RGB_LED_B))
-#if ENABLED(RGB_LED)
+#if ENABLED(PRINTER_EVENT_LEDS) && !HAS_COLOR_LEDS
+ #error "PRINTER_EVENT_LEDS requires BLINKM, PCA9632, RGB_LED, RGBW_LED or NEOPIXEL_LED."
+#elif ENABLED(RGB_LED)
#if !_RGB_TEST
#error "RGB_LED requires RGB_LED_R_PIN, RGB_LED_G_PIN, and RGB_LED_B_PIN."
#elif ENABLED(RGBW_LED)
@@ -1568,8 +1587,6 @@ static_assert(X_MAX_LENGTH >= X_BED_SIZE && Y_MAX_LENGTH >= Y_BED_SIZE,
#if !(PIN_EXISTS(NEOPIXEL) && NEOPIXEL_PIXELS > 0)
#error "NEOPIXEL_LED requires NEOPIXEL_PIN and NEOPIXEL_PIXELS."
#endif
-#elif ENABLED(PRINTER_EVENT_LEDS) && DISABLED(BLINKM) && DISABLED(PCA9632) && DISABLED(NEOPIXEL_LED)
- #error "PRINTER_EVENT_LEDS requires BLINKM, PCA9632, RGB_LED, RGBW_LED or NEOPIXEL_LED."
#endif
/**
@@ -1838,4 +1855,8 @@ static_assert(COUNT(sanity_arr_3) <= XYZE_N, "DEFAULT_MAX_ACCELERATION has too m
#error "USB_CS_PIN and USB_INTR_PIN are required for USB_FLASH_DRIVE_SUPPORT."
#endif
+#if ENABLED(SD_FIRMWARE_UPDATE) && !defined(__AVR_ATmega2560__)
+ #error "SD_FIRMWARE_UPDATE requires an ATmega2560-based (Arduino Mega) board."
+#endif
+
#endif // _SANITYCHECK_H_
diff --git a/Marlin/src/lcd/dogm/dogm_bitmaps.h b/Marlin/src/lcd/dogm/dogm_bitmaps.h
index d138aa75a5..c610ce4a36 100644
--- a/Marlin/src/lcd/dogm/dogm_bitmaps.h
+++ b/Marlin/src/lcd/dogm/dogm_bitmaps.h
@@ -144,7 +144,7 @@
#define FAN_ANIM_FRAMES 2
#endif
- #if HAS_HEATED_BED
+ #if HAS_HEATED_BED && HOTENDS <= 3
#define STATUS_SCREEN_X ( 8 + (HOTENDS ? 0 : 64))
#define STATUS_SCREENWIDTH (120 - (HOTENDS ? 0 : 64))
@@ -595,7 +595,7 @@
#endif // HOTENDS
- #else // !HAS_HEATED_BED
+ #else // !HAS_HEATED_BED || HOTENDS > 3
#define STATUS_SCREEN_X ( 8 + (HOTENDS ? 0 : 96))
#define STATUS_SCREENWIDTH (120 - (HOTENDS ? 0 : 96))
@@ -933,7 +933,7 @@
};
#endif
- #else // HOTENDS > 2
+ #elif HOTENDS == 3
#if FAN_ANIM_FRAMES == 3
const unsigned char status_screen0_bmp[] PROGMEM = {
@@ -1044,9 +1044,120 @@
};
#endif
+ #elif HOTENDS > 3
+
+ #if FAN_ANIM_FRAMES == 3
+ const unsigned char status_screen0_bmp[] PROGMEM = {
+ B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11111000,
+ B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111110,B00000000,B11111000,
+ B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111001,B00000001,B00111000,
+ B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110111,B10000011,B11011000,
+ B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110111,B10000011,B11011000,
+ B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B11000111,B11101000,
+ B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100111,B11000111,B11001000,
+ B00111111,B11000000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00100001,B11111111,B00001000,
+ B01111101,B11100000,B00000000,B00111100,B11110000,B00000000,B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00100000,B01111100,B00001000,
+ B01111001,B11100000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,B00000000,B00100000,B01111100,B00001000,
+ B01110101,B11100000,B00000000,B00111111,B01110000,B00000000,B00111111,B01110000,B00000000,B00111011,B01110000,B00000000,B00100000,B01111100,B00001000,
+ B00111101,B11000000,B00000000,B00011110,B11100000,B00000000,B00011100,B11100000,B00000000,B00011011,B01100000,B00000000,B00100001,B11111111,B00001000,
+ B00111101,B11000000,B00000000,B00011101,B11100000,B00000000,B00011111,B01100000,B00000000,B00011000,B00100000,B00000000,B00100111,B11000111,B11001000,
+ B01111101,B11100000,B00000000,B00111011,B11110000,B00000000,B00111011,B01110000,B00000000,B00111111,B01110000,B00000000,B00101111,B11000111,B11101000,
+ B01111101,B11100000,B00000000,B00111000,B01110000,B00000000,B00111100,B11110000,B00000000,B00111111,B01110000,B00000000,B00110111,B10000011,B11011000,
+ B01111111,B11100000,B00000000,B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00110111,B10000011,B11011000,
+ B00011111,B10000000,B00000000,B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00111001,B00000001,B00111000,
+ B00001111,B00000000,B00000000,B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00111110,B00000000,B11111000,
+ B00000110,B00000000,B00000000,B00000011,B00000000,B00000000,B00000011,B00000000,B00000000,B00000011,B00000000,B00000000,B00111111,B11111111,B11111000
+ };
+ const unsigned char status_screen1_bmp[] PROGMEM = {
+ B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11111000,
+ B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111110,B00110000,B11111000,
+ B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111001,B11110000,B00111000,
+ B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110001,B11110000,B00011000,
+ B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110000,B11110000,B00011000,
+ B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B11110000,B01101000,
+ B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B00110001,B11101000,
+ B00111111,B11000000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00100000,B00111001,B11101000,
+ B01111101,B11100000,B00000000,B00111100,B11110000,B00000000,B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00100000,B01111111,B11111000,
+ B01111001,B11100000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,B00000000,B00111111,B11111111,B11111000,
+ B01110101,B11100000,B00000000,B00111111,B01110000,B00000000,B00111111,B01110000,B00000000,B00111011,B01110000,B00000000,B00111111,B11111100,B00001000,
+ B00111101,B11000000,B00000000,B00011110,B11100000,B00000000,B00011100,B11100000,B00000000,B00011011,B01100000,B00000000,B00101111,B00111000,B00001000,
+ B00111101,B11000000,B00000000,B00011101,B11100000,B00000000,B00011111,B01100000,B00000000,B00011000,B00100000,B00000000,B00101110,B00011000,B00001000,
+ B01111101,B11100000,B00000000,B00111011,B11110000,B00000000,B00111011,B01110000,B00000000,B00111111,B01110000,B00000000,B00101100,B00011110,B00001000,
+ B01111101,B11100000,B00000000,B00111000,B01110000,B00000000,B00111100,B11110000,B00000000,B00111111,B01110000,B00000000,B00110000,B00011110,B00011000,
+ B01111111,B11100000,B00000000,B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00110000,B00011111,B00011000,
+ B00011111,B10000000,B00000000,B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00111000,B00011111,B00111000,
+ B00001111,B00000000,B00000000,B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00111110,B00011000,B11111000,
+ B00000110,B00000000,B00000000,B00000011,B00000000,B00000000,B00000011,B00000000,B00000000,B00000011,B00000000,B00000000,B00111111,B11111111,B11111000
+ };
+ const unsigned char status_screen2_bmp[] PROGMEM = {
+ B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11111000,
+ B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111110,B00011000,B11111000,
+ B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00011111,B00111000,
+ B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110000,B00011111,B10011000,
+ B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110100,B00011111,B00011000,
+ B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101110,B00011110,B00001000,
+ B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B00011100,B00001000,
+ B00111111,B11000000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00101111,B10111000,B00001000,
+ B01111101,B11100000,B00000000,B00111100,B11110000,B00000000,B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00111111,B11111100,B00001000,
+ B01111001,B11100000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,B00000000,B00111111,B11111111,B11111000,
+ B01110101,B11100000,B00000000,B00111111,B01110000,B00000000,B00111111,B01110000,B00000000,B00111011,B01110000,B00000000,B00100000,B01111111,B11111000,
+ B00111101,B11000000,B00000000,B00011110,B11100000,B00000000,B00011100,B11100000,B00000000,B00011011,B01100000,B00000000,B00100000,B00111011,B11101000,
+ B00111101,B11000000,B00000000,B00011101,B11100000,B00000000,B00011111,B01100000,B00000000,B00011000,B00100000,B00000000,B00100000,B01110001,B11101000,
+ B01111101,B11100000,B00000000,B00111011,B11110000,B00000000,B00111011,B01110000,B00000000,B00111111,B01110000,B00000000,B00100000,B11110000,B11101000,
+ B01111101,B11100000,B00000000,B00111000,B01110000,B00000000,B00111100,B11110000,B00000000,B00111111,B01110000,B00000000,B00110001,B11110000,B01011000,
+ B01111111,B11100000,B00000000,B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00110011,B11110000,B00011000,
+ B00011111,B10000000,B00000000,B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00111001,B11110000,B00111000,
+ B00001111,B00000000,B00000000,B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00111110,B00110000,B11111000,
+ B00000110,B00000000,B00000000,B00000011,B00000000,B00000000,B00000011,B00000000,B00000000,B00000011,B00000000,B00000000,B00111111,B11111111,B11111000
+ };
+ #else
+ const unsigned char status_screen0_bmp[] PROGMEM = {
+ B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11110000,
+ B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00000000,B01110000,
+ B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110000,B11111100,B00110000,
+ B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B11111100,B00010000,
+ B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B01111000,B00010000,
+ B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100000,B00110000,B00010000,
+ B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101100,B00000000,B11010000,
+ B00111111,B11000000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00101110,B00110001,B11010000,
+ B01111101,B11100000,B00000000,B00111100,B11110000,B00000000,B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00101111,B01111011,B11010000,
+ B01111001,B11100000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,B00000000,B00101111,B01111011,B11010000,
+ B01110101,B11100000,B00000000,B00111111,B01110000,B00000000,B00111111,B01110000,B00000000,B00111011,B01110000,B00000000,B00101110,B00110001,B11010000,
+ B00111101,B11000000,B00000000,B00011110,B11100000,B00000000,B00011100,B11100000,B00000000,B00011011,B01100000,B00000000,B00101100,B00000000,B11010000,
+ B00111101,B11000000,B00000000,B00011101,B11100000,B00000000,B00011111,B01100000,B00000000,B00011000,B00100000,B00000000,B00100000,B00110000,B00010000,
+ B01111101,B11100000,B00000000,B00111011,B11110000,B00000000,B00111011,B01110000,B00000000,B00111111,B01110000,B00000000,B00100000,B01111000,B00010000,
+ B01111101,B11100000,B00000000,B00111000,B01110000,B00000000,B00111100,B11110000,B00000000,B00111111,B01110000,B00000000,B00100000,B11111100,B00010000,
+ B01111111,B11100000,B00000000,B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00110000,B11111100,B00110000,
+ B00011111,B10000000,B00000000,B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00111000,B00000000,B01110000,
+ B00001111,B00000000,B00000000,B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00111111,B11111111,B11110000,
+ B00000110,B00000000,B00000000,B00000011,B00000000,B00000000,B00000011,B00000000,B00000000,B00000011,B00000000,B00000000,B00000000,B00000000,B00000000
+ };
+ const unsigned char status_screen1_bmp[] PROGMEM = {
+ B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111111,B11111111,B11110000,
+ B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00111000,B00000000,B01110000,
+ B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00110001,B10000110,B00110000,
+ B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100011,B10000111,B00010000,
+ B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00100111,B10000111,B10010000,
+ B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B10000111,B11010000,
+ B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00000000,B00101111,B00000011,B11010000,
+ B00111111,B11000000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00011111,B11100000,B00000000,B00100000,B00110000,B00010000,
+ B01111101,B11100000,B00000000,B00111100,B11110000,B00000000,B00111100,B11110000,B00000000,B00111011,B01110000,B00000000,B00100000,B01111000,B00010000,
+ B01111001,B11100000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,B00000000,B00111011,B01110000,B00000000,B00100000,B01111000,B00010000,
+ B01110101,B11100000,B00000000,B00111111,B01110000,B00000000,B00111111,B01110000,B00000000,B00111011,B01110000,B00000000,B00100000,B00110000,B00010000,
+ B00111101,B11000000,B00000000,B00011110,B11100000,B00000000,B00011100,B11100000,B00000000,B00011011,B01100000,B00000000,B00101111,B00000011,B11010000,
+ B00111101,B11000000,B00000000,B00011101,B11100000,B00000000,B00011111,B01100000,B00000000,B00011000,B00100000,B00000000,B00101111,B10000111,B11010000,
+ B01111101,B11100000,B00000000,B00111011,B11110000,B00000000,B00111011,B01110000,B00000000,B00111111,B01110000,B00000000,B00100111,B10000111,B10010000,
+ B01111101,B11100000,B00000000,B00111000,B01110000,B00000000,B00111100,B11110000,B00000000,B00111111,B01110000,B00000000,B00100011,B10000111,B00010000,
+ B01111111,B11100000,B00000000,B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00111111,B11110000,B00000000,B00110001,B10000110,B00110000,
+ B00011111,B10000000,B00000000,B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00001111,B11000000,B00000000,B00111000,B00000000,B01110000,
+ B00001111,B00000000,B00000000,B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00000111,B10000000,B00000000,B00111111,B11111111,B11110000,
+ B00000110,B00000000,B00000000,B00000011,B00000000,B00000000,B00000011,B00000000,B00000000,B00000011,B00000000,B00000000,B00000000,B00000000,B00000000
+ };
+ #endif
+
#endif // HOTENDS
- #endif // !HAS_HEATED_BED
+ #endif // !HAS_HEATED_BED || HOTENDS > 3
#endif // !CUSTOM_STATUS_SCREEN_IMAGE
diff --git a/Marlin/src/lcd/dogm/status_screen_lite_ST7920.h b/Marlin/src/lcd/dogm/status_screen_lite_ST7920.h
index 6b9baca3a5..08133d2786 100644
--- a/Marlin/src/lcd/dogm/status_screen_lite_ST7920.h
+++ b/Marlin/src/lcd/dogm/status_screen_lite_ST7920.h
@@ -94,6 +94,7 @@ void ST7920_Lite_Status_Screen::write_number(const int16_t value, const uint8_t
case 3: fmt = PSTR("%3d"); break;
case 2: fmt = PSTR("%2d"); break;
case 1: fmt = PSTR("%1d"); break;
+ default: return;
}
sprintf_P(str, fmt, value);
write_str(str);
diff --git a/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.cpp b/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.cpp
index a6d8730062..b7e5a23810 100644
--- a/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.cpp
+++ b/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.cpp
@@ -60,7 +60,7 @@
#define CPU_ST7920_DELAY_1 DELAY_NS(0)
#define CPU_ST7920_DELAY_2 DELAY_NS(188)
#define CPU_ST7920_DELAY_3 DELAY_NS(0)
-#elif MB(MINIRAMBO) || MB(EINSY_RAMBO)
+#elif MB(MINIRAMBO) || MB(EINSY_RAMBO) || MB(EINSY_RETRO)
#define CPU_ST7920_DELAY_1 DELAY_NS(0)
#define CPU_ST7920_DELAY_2 DELAY_NS(250)
#define CPU_ST7920_DELAY_3 DELAY_NS(0)
diff --git a/Marlin/src/lcd/extensible_ui/lib/dummy.cpp b/Marlin/src/lcd/extensible_ui/lib/dummy.cpp
new file mode 100644
index 0000000000..9a71290791
--- /dev/null
+++ b/Marlin/src/lcd/extensible_ui/lib/dummy.cpp
@@ -0,0 +1,50 @@
+/*************
+ * dummy.cpp *
+ *************/
+
+/****************************************************************************
+ * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. *
+ * *
+ * This program is free software: you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation, either version 3 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * To view a copy of the GNU General Public License, go to the following *
+ * location: . *
+ ****************************************************************************/
+
+#include "../../../inc/MarlinConfigPre.h"
+
+#if ENABLED(EXTENSIBLE_UI)
+
+#include "../ui_api.h"
+
+// To implement a new UI, complete the functions below and
+// read or update Marlin's state using the methods in the
+// UI methods in "../ui_api.h"
+
+namespace UI {
+ void onStartup() {}
+ void onUpdate() {}
+ void onPrinterKilled(const char* lcd_msg) {}
+ void onMediaInserted();
+ void onMediaError();
+ void onMediaRemoved();
+ void onPlayTone(const uint16_t frequency, const uint16_t duration) {}
+ void onPrintTimerStarted() {}
+ void onPrintTimerPaused() {}
+ void onPrintTimerStopped() {}
+ void onFilamentRunout() {}
+ void onStatusChanged(const char* lcd_msg) {}
+ void onStatusChanged(progmem_str lcd_msg) {}
+ void onFactoryReset() {}
+ void onStoreSettings() {}
+}
+
+#endif // EXTENSIBLE_UI
diff --git a/Marlin/src/lcd/extensible_ui/ui_api.cpp b/Marlin/src/lcd/extensible_ui/ui_api.cpp
new file mode 100644
index 0000000000..61eff88480
--- /dev/null
+++ b/Marlin/src/lcd/extensible_ui/ui_api.cpp
@@ -0,0 +1,590 @@
+/**************
+ * ui_api.cpp *
+ **************/
+
+/****************************************************************************
+ * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. *
+ * *
+ * This program is free software: you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation, either version 3 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * To view a copy of the GNU General Public License, go to the following *
+ * location: . *
+ ****************************************************************************/
+
+#include "../../Marlin.h"
+
+#if ENABLED(EXTENSIBLE_UI)
+
+#include "../../gcode/queue.h"
+#include "../../module/motion.h"
+#include "../../module/planner.h"
+#include "../../module/probe.h"
+#include "../../module/printcounter.h"
+#include "../../module/temperature.h"
+#include "../../sd/cardreader.h"
+#include "../../libs/duration_t.h"
+
+#if DO_SWITCH_EXTRUDER || ENABLED(SWITCHING_NOZZLE) || ENABLED(PARKING_EXTRUDER)
+ #include "../../module/tool_change.h"
+#endif
+
+#if ENABLED(SDSUPPORT)
+ #include "../../feature/emergency_parser.h"
+
+ bool abort_sd_printing; // =false
+#else
+ constexpr bool abort_sd_printing = false;
+#endif
+
+#include "ui_api.h"
+
+#if ENABLED(BACKLASH_GCODE)
+ extern float backlash_distance_mm[XYZ], backlash_correction;
+ #ifdef BACKLASH_SMOOTHING_MM
+ extern float backlash_smoothing_mm;
+ #endif
+#endif
+
+inline float clamp(const float value, const float minimum, const float maximum) {
+ return MAX(MIN(value, maximum), minimum);
+}
+
+namespace UI {
+
+ void delay_ms(unsigned long ms) {
+ safe_delay(ms);
+ }
+
+ void yield() {
+ thermalManager.manage_heater();
+ }
+
+ float getActualTemp_celsius(const uint8_t extruder) {
+ return extruder ?
+ thermalManager.degHotend(extruder - 1) :
+ #if HAS_HEATED_BED
+ thermalManager.degBed()
+ #else
+ 0
+ #endif
+ ;
+ }
+
+ float getTargetTemp_celsius(const uint8_t extruder) {
+ return extruder ?
+ thermalManager.degTargetHotend(extruder - 1) :
+ #if HAS_HEATED_BED
+ thermalManager.degTargetBed()
+ #else
+ 0
+ #endif
+ ;
+ }
+
+ float getFan_percent(const uint8_t fan) { return ((float(fan_speed[fan]) + 1) * 100) / 256; }
+
+ float getAxisPosition_mm(const axis_t axis) {
+ switch (axis) {
+ case X: case Y: case Z:
+ return current_position[axis];
+ case E0: case E1: case E2: case E3: case E4: case E5:
+ return current_position[E_AXIS];
+ default: return 0;
+ }
+ }
+
+ void setAxisPosition_mm(const axis_t axis, float position, float _feedrate_mm_s) {
+ #if EXTRUDERS > 1
+ const int8_t old_extruder = active_extruder;
+ #endif
+ switch (axis) {
+ case X: case Y: case Z: break;
+ case E0: case E1: case E2: case E3: case E4: case E5:
+ active_extruder = axis - E0;
+ break;
+ default: return;
+ }
+ set_destination_from_current();
+ switch (axis) {
+ case X: case Y: case Z:
+ destination[axis] = position;
+ break;
+ case E0: case E1: case E2: case E3: case E4: case E5:
+ destination[E_AXIS] = position;
+ break;
+ }
+
+ const float old_feedrate = feedrate_mm_s;
+ feedrate_mm_s = _feedrate_mm_s;
+ prepare_move_to_destination();
+ feedrate_mm_s = old_feedrate;
+ #if EXTRUDERS > 1
+ active_extruder = old_extruder;
+ #endif
+ }
+
+ void setActiveTool(uint8_t extruder, bool no_move) {
+ extruder--; // Make zero based
+ #if DO_SWITCH_EXTRUDER || ENABLED(SWITCHING_NOZZLE) || ENABLED(PARKING_EXTRUDER)
+ if (extruder != active_extruder)
+ tool_change(extruder, 0, no_move);
+ #endif
+ active_extruder = extruder;
+ }
+
+ uint8_t getActiveTool() { return active_extruder + 1; }
+
+ bool isMoving() { return planner.has_blocks_queued(); }
+
+ float getAxisSteps_per_mm(const axis_t axis) {
+ switch (axis) {
+ case X: case Y: case Z:
+ return planner.settings.axis_steps_per_mm[axis];
+ case E0: case E1: case E2: case E3: case E4: case E5:
+ return planner.settings.axis_steps_per_mm[E_AXIS_N(axis - E0)];
+ default: return 0;
+ }
+ }
+
+ void setAxisSteps_per_mm(const axis_t axis, const float steps_per_mm) {
+ switch (axis) {
+ case X: case Y: case Z:
+ planner.settings.axis_steps_per_mm[axis] = steps_per_mm;
+ break;
+ case E0: case E1: case E2: case E3: case E4: case E5:
+ planner.settings.axis_steps_per_mm[E_AXIS_N(axis - E0)] = steps_per_mm;
+ break;
+ }
+ }
+
+ float getAxisMaxFeedrate_mm_s(const axis_t axis) {
+ switch (axis) {
+ case X: case Y: case Z:
+ return planner.settings.max_feedrate_mm_s[axis];
+ case E0: case E1: case E2: case E3: case E4: case E5:
+ return planner.settings.max_feedrate_mm_s[E_AXIS_N(axis - E0)];
+ default: return 0;
+ }
+ }
+
+ void setAxisMaxFeedrate_mm_s(const axis_t axis, const float max_feedrate_mm_s) {
+ switch (axis) {
+ case X: case Y: case Z:
+ planner.settings.max_feedrate_mm_s[axis] = max_feedrate_mm_s;
+ break;
+ case E0: case E1: case E2: case E3: case E4: case E5:
+ planner.settings.max_feedrate_mm_s[E_AXIS_N(axis - E0)] = max_feedrate_mm_s;
+ break;
+ default: return;
+ }
+ }
+
+ float getAxisMaxAcceleration_mm_s2(const axis_t axis) {
+ switch (axis) {
+ case X: case Y: case Z:
+ return planner.settings.max_acceleration_mm_per_s2[axis];
+ case E0: case E1: case E2: case E3: case E4: case E5:
+ return planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(axis - E0)];
+ default: return 0;
+ }
+ }
+
+ void setAxisMaxAcceleration_mm_s2(const axis_t axis, const float max_acceleration_mm_per_s2) {
+ switch (axis) {
+ case X: case Y: case Z:
+ planner.settings.max_acceleration_mm_per_s2[axis] = max_acceleration_mm_per_s2;
+ break;
+ case E0: case E1: case E2: case E3: case E4: case E5:
+ planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(axis - E0)] = max_acceleration_mm_per_s2;
+ break;
+ default: return;
+ }
+ }
+
+ #if ENABLED(LIN_ADVANCE)
+ float getLinearAdvance_mm_mm_s(const uint8_t extruder) {
+ return (extruder < EXTRUDERS) ? planner.extruder_advance_K[extruder] : 0;
+ }
+
+ void setLinearAdvance_mm_mm_s(const uint8_t extruder, const float k) {
+ if (extruder < EXTRUDERS)
+ planner.extruder_advance_K[extruder] = clamp(k, 0, 999);
+ }
+ #endif
+
+ #if ENABLED(JUNCTION_DEVIATION)
+ float getJunctionDeviation_mm() {
+ return planner.junction_deviation_mm;
+ }
+
+ void setJunctionDeviation_mm(const float junc_dev) {
+ planner.junction_deviation_mm = clamp(junc_dev, 0.01, 0.3);
+ planner.recalculate_max_e_jerk();
+ }
+ #else
+ float getAxisMaxJerk_mm_s(const axis_t axis) {
+ switch (axis) {
+ case X: case Y: case Z:
+ return planner.max_jerk[axis];
+ case E0: case E1: case E2: case E3: case E4: case E5:
+ return planner.max_jerk[E_AXIS];
+ default: return 0;
+ }
+ }
+
+ void setAxisMaxJerk_mm_s(const axis_t axis, const float max_jerk) {
+ switch (axis) {
+ case X: case Y: case Z:
+ planner.max_jerk[axis] = max_jerk;
+ break;
+ case E0: case E1: case E2: case E3: case E4: case E5:
+ planner.max_jerk[E_AXIS] = max_jerk;
+ break;
+ default: return;
+ }
+ }
+ #endif
+
+ float getMinFeedrate_mm_s() { return planner.settings.min_feedrate_mm_s; }
+ float getMinTravelFeedrate_mm_s() { return planner.settings.min_travel_feedrate_mm_s; }
+ float getPrintingAcceleration_mm_s2() { return planner.settings.acceleration; }
+ float getRetractAcceleration_mm_s2() { return planner.settings.retract_acceleration; }
+ float getTravelAcceleration_mm_s2() { return planner.settings.travel_acceleration; }
+ void setMinFeedrate_mm_s(const float fr) { planner.settings.min_feedrate_mm_s = fr; }
+ void setMinTravelFeedrate_mm_s(const float fr) { planner.settings.min_travel_feedrate_mm_s = fr; }
+ void setPrintingAcceleration_mm_per_s2(const float acc) { planner.settings.acceleration = acc; }
+ void setRetractAcceleration_mm_s2(const float acc) { planner.settings.retract_acceleration = acc; }
+ void setTravelAcceleration_mm_s2(const float acc) { planner.settings.travel_acceleration = acc; }
+
+ #if ENABLED(BABYSTEP_ZPROBE_OFFSET)
+ float getZOffset_mm() {
+ #if ENABLED(BABYSTEP_HOTEND_Z_OFFSET)
+ if (active_extruder != 0)
+ return hotend_offset[Z_AXIS][active_extruder];
+ else
+ #endif
+ return zprobe_zoffset;
+ }
+
+ void setZOffset_mm(const float zoffset_mm) {
+ const float diff = (zoffset_mm - getZOffset_mm()) / planner.steps_to_mm[Z_AXIS];
+ incrementZOffset_steps(diff > 0 ? ceil(diff) : floor(diff));
+ }
+
+ void incrementZOffset_steps(int16_t babystep_increment) {
+ #if ENABLED(BABYSTEP_HOTEND_Z_OFFSET)
+ const bool do_probe = (active_extruder == 0);
+ #else
+ constexpr bool do_probe = true;
+ #endif
+ const float diff = planner.steps_to_mm[Z_AXIS] * babystep_increment,
+ new_probe_offset = zprobe_zoffset + diff,
+ new_offs =
+ #if ENABLED(BABYSTEP_HOTEND_Z_OFFSET)
+ do_probe ? new_probe_offset : hotend_offset[Z_AXIS][active_extruder] - diff
+ #else
+ new_probe_offset
+ #endif
+ ;
+ if (WITHIN(new_offs, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX)) {
+
+ thermalManager.babystep_axis(Z_AXIS, babystep_increment);
+
+ if (do_probe) zprobe_zoffset = new_offs;
+ #if ENABLED(BABYSTEP_HOTEND_Z_OFFSET)
+ else hotend_offset[Z_AXIS][active_extruder] = new_offs;
+ #endif
+ }
+ }
+ #endif // ENABLED(BABYSTEP_ZPROBE_OFFSET)
+
+ #if HOTENDS > 1
+ float getNozzleOffset_mm(const axis_t axis, uint8_t extruder) {
+ if (extruder >= HOTENDS) return 0;
+ return hotend_offset[axis][extruder];
+ }
+
+ void setNozzleOffset_mm(const axis_t axis, uint8_t extruder, float offset) {
+ if (extruder >= HOTENDS) return;
+ hotend_offset[axis][extruder] = offset;
+ }
+ #endif
+
+ #if ENABLED(BACKLASH_GCODE)
+ float getAxisBacklash_mm(const axis_t axis) {return backlash_distance_mm[axis];}
+ void setAxisBacklash_mm(const axis_t axis, float distance)
+ {backlash_distance_mm[axis] = clamp(distance,0,5);}
+
+ float getBacklashCorrection_percent() {return backlash_correction*100;}
+ void setBacklashCorrection_percent(float percent) {backlash_correction = clamp(percent, 0, 100)/100;}
+
+ #ifdef BACKLASH_SMOOTHING_MM
+ float getBacklashSmoothing_mm() {return backlash_smoothing_mm;}
+ void setBacklashSmoothing_mm(float distance) {backlash_smoothing_mm = clamp(distance,0,999);}
+ #endif
+ #endif
+
+ uint8_t getProgress_percent() {
+ #if ENABLED(SDSUPPORT)
+ return card.percentDone();
+ #else
+ return 0;
+ #endif
+ }
+
+ uint32_t getProgress_seconds_elapsed() {
+ const duration_t elapsed = print_job_timer.duration();
+ return elapsed.value;
+ }
+
+ float getFeedRate_percent() {
+ return feedrate_percentage;
+ }
+
+ void enqueueCommands(progmem_str gcode) {
+ enqueue_and_echo_commands_P((PGM_P)gcode);
+ }
+
+ bool isAxisPositionKnown(const axis_t axis) {
+ switch (axis) {
+ case X: case Y: case Z:
+ return TEST(axis_known_position, axis);
+ default: return true;
+ }
+ }
+
+ progmem_str getFirmwareName() {
+ return F("Marlin " SHORT_BUILD_VERSION);
+ }
+
+ void setTargetTemp_celsius(const uint8_t extruder, float temp) {
+ if (extruder)
+ thermalManager.setTargetHotend(clamp(temp,0,500), extruder-1);
+ #if HAS_HEATED_BED
+ else
+ thermalManager.setTargetBed(clamp(temp,0,200));
+ #endif
+ }
+
+ void setFan_percent(const uint8_t fan, float percent) {
+ if (fan < FAN_COUNT)
+ fan_speed[fan] = clamp(round(percent * 255 / 100), 0, 255);
+ }
+
+ void setFeedrate_percent(const float percent) {
+ feedrate_percentage = clamp(percent, 10, 500);
+ }
+
+ void printFile(const char *filename) {
+ #if ENABLED(SDSUPPORT)
+ card.openAndPrintFile(filename);
+ #endif
+ }
+
+ bool isPrintingFromMedia() {
+ #if ENABLED(SDSUPPORT)
+ return card.cardOK && card.isFileOpen() && card.sdprinting;
+ #else
+ return false;
+ #endif
+ }
+
+ bool isPrinting() {
+ return (planner.movesplanned() || IS_SD_PRINTING ||
+ #if ENABLED(SDSUPPORT)
+ (card.cardOK && card.isFileOpen())
+ #else
+ false
+ #endif
+ );
+ }
+
+ bool isMediaInserted() {
+ #if ENABLED(SDSUPPORT)
+ return IS_SD_INSERTED && card.cardOK;
+ #else
+ return false;
+ #endif
+ }
+
+ void pausePrint() {
+ #if ENABLED(SDSUPPORT)
+ card.pauseSDPrint();
+ print_job_timer.pause();
+ #if ENABLED(PARK_HEAD_ON_PAUSE)
+ enqueue_and_echo_commands_P(PSTR("M125"));
+ #endif
+ UI::onStatusChanged(PSTR(MSG_PRINT_PAUSED));
+ #endif
+ }
+
+ void resumePrint() {
+ #if ENABLED(SDSUPPORT)
+ #if ENABLED(PARK_HEAD_ON_PAUSE)
+ enqueue_and_echo_commands_P(PSTR("M24"));
+ #else
+ card.startFileprint();
+ print_job_timer.start();
+ #endif
+ UI::onStatusChanged(PSTR(MSG_PRINTING));
+ #endif
+ }
+
+ void stopPrint() {
+ #if ENABLED(SDSUPPORT)
+ wait_for_heatup = wait_for_user = false;
+ abort_sd_printing = true;
+ UI::onStatusChanged(PSTR(MSG_PRINT_ABORTED));
+ #endif
+ }
+
+ FileList::FileList() {
+ refresh();
+ }
+
+ void FileList::refresh() {
+ num_files = 0xFFFF;
+ }
+
+ bool FileList::seek(uint16_t pos, bool skip_range_check) {
+ #if ENABLED(SDSUPPORT)
+ if (!skip_range_check && pos > (count() - 1)) return false;
+ const uint16_t nr =
+ #if ENABLED(SDCARD_RATHERRECENTFIRST) && DISABLED(SDCARD_SORT_ALPHA)
+ count() - 1 -
+ #endif
+ pos;
+
+ #if ENABLED(SDCARD_SORT_ALPHA)
+ card.getfilename_sorted(nr);
+ #else
+ card.getfilename(nr);
+ #endif
+ return card.filename && card.filename[0] != '\0';
+ #endif
+ }
+
+ const char* FileList::filename() {
+ #if ENABLED(SDSUPPORT)
+ return (card.longFilename && card.longFilename[0]) ? card.longFilename : card.filename;
+ #else
+ return "";
+ #endif
+ }
+
+ const char* FileList::shortFilename() {
+ #if ENABLED(SDSUPPORT)
+ return card.filename;
+ #else
+ return "";
+ #endif
+ }
+
+ const char* FileList::longFilename() {
+ #if ENABLED(SDSUPPORT)
+ return card.longFilename;
+ #else
+ return "";
+ #endif
+ }
+
+ bool FileList::isDir() {
+ #if ENABLED(SDSUPPORT)
+ return card.filenameIsDir;
+ #else
+ return false;
+ #endif
+ }
+
+ uint16_t FileList::count() {
+ #if ENABLED(SDSUPPORT)
+ if (num_files == 0xFFFF) num_files = card.get_num_Files();
+ return num_files;
+ #endif
+ }
+
+ bool FileList::isAtRootDir() {
+ #if ENABLED(SDSUPPORT)
+ card.getWorkDirName();
+ return card.filename[0] == '/';
+ #else
+ return true;
+ #endif
+ }
+
+ void FileList::upDir() {
+ #if ENABLED(SDSUPPORT)
+ card.updir();
+ num_files = 0xFFFF;
+ #endif
+ }
+
+ void FileList::changeDir(const char *dirname) {
+ #if ENABLED(SDSUPPORT)
+ card.chdir(dirname);
+ num_files = 0xFFFF;
+ #endif
+ }
+
+} // namespace UI
+
+// At the moment, we piggy-back off the ultralcd calls, but this could be cleaned up in the future
+
+void lcd_init() {
+ #if ENABLED(SDSUPPORT) && PIN_EXISTS(SD_DETECT)
+ SET_INPUT_PULLUP(SD_DETECT_PIN);
+ #endif
+ UI::onStartup();
+}
+
+void lcd_update() {
+ #if ENABLED(SDSUPPORT)
+ static bool last_sd_status;
+ const bool sd_status = IS_SD_INSERTED;
+ if (sd_status != last_sd_status) {
+ last_sd_status = sd_status;
+ if (sd_status) {
+ card.initsd();
+ if (card.cardOK)
+ UI::onMediaInserted();
+ else
+ UI::onMediaError();
+ }
+ else {
+ const bool ok = card.cardOK;
+ card.release();
+ if (ok)
+ UI::onMediaRemoved();
+ }
+ }
+ #endif // SDSUPPORT
+ UI::onUpdate();
+}
+
+bool lcd_hasstatus() { return true; }
+bool lcd_detected() { return true; }
+void lcd_reset_alert_level() {}
+void lcd_refresh() {}
+void lcd_setstatus(const char * const message, const bool persist /* = false */) { UI::onStatusChanged(message); }
+void lcd_setstatusPGM(const char * const message, int8_t level /* = 0 */) { UI::onStatusChanged((progmem_str)message); }
+void lcd_reset_status() {}
+void lcd_setalertstatusPGM(const char * const message) { lcd_setstatusPGM(message, 0); }
+void lcd_status_printf_P(const uint8_t level, const char * const fmt, ...) {
+ char buff[64];
+ va_list args;
+ va_start(args, fmt);
+ vsnprintf_P(buff, sizeof(buff), fmt, args);
+ va_end(args);
+ buff[63] = '\0';
+ UI::onStatusChanged(buff);
+}
+
+#endif // EXTENSIBLE_UI
diff --git a/Marlin/src/lcd/extensible_ui/ui_api.h b/Marlin/src/lcd/extensible_ui/ui_api.h
new file mode 100644
index 0000000000..482c6df1e0
--- /dev/null
+++ b/Marlin/src/lcd/extensible_ui/ui_api.h
@@ -0,0 +1,164 @@
+/************
+ * ui_api.h *
+ ************/
+
+/****************************************************************************
+ * Written By Marcio Teixeira 2018 - Aleph Objects, Inc. *
+ * *
+ * This program is free software: you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation, either version 3 of the License, or *
+ * (at your option) any later version. *
+ * *
+ * This program is distributed in the hope that it will be useful, *
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+ * GNU General Public License for more details. *
+ * *
+ * To view a copy of the GNU General Public License, go to the following *
+ * location: . *
+ ****************************************************************************/
+
+#pragma once
+
+#include "../../inc/MarlinConfig.h"
+
+typedef const __FlashStringHelper *progmem_str;
+
+namespace UI {
+
+ enum axis_t : uint8_t { X, Y, Z, E0, E1, E2, E3, E4, E5 };
+
+ constexpr uint8_t extruderCount = EXTRUDERS;
+ constexpr uint8_t fanCount = FAN_COUNT;
+
+ // The following methods should be used by the extension module to
+ // query or change Marlin's state.
+
+ progmem_str getFirmwareName();
+
+ bool isAxisPositionKnown(const axis_t axis);
+ bool isMoving();
+
+ float getActualTemp_celsius(const uint8_t extruder);
+ float getTargetTemp_celsius(const uint8_t extruder);
+ float getFan_percent(const uint8_t fan);
+ float getAxisPosition_mm(const axis_t axis);
+ float getAxisSteps_per_mm(const axis_t axis);
+ float getAxisMaxFeedrate_mm_s(const axis_t axis);
+ float getAxisMaxAcceleration_mm_s2(const axis_t axis);
+ float getMinFeedrate_mm_s();
+ float getMinTravelFeedrate_mm_s();
+ float getPrintingAcceleration_mm_per_s2();
+ float getRetractAcceleration_mm_per_s2();
+ float getTravelAcceleration_mm_per_s2();
+ float getFeedRate_percent();
+ uint8_t getProgress_percent();
+ uint32_t getProgress_seconds_elapsed();
+
+ void setTargetTemp_celsius(const uint8_t extruder, float temp);
+ void setFan_percent(const uint8_t fan, const float percent);
+ void setAxisPosition_mm(const axis_t axis, float position, float _feedrate_mm_s);
+ void setAxisSteps_per_mm(const axis_t axis, const float steps_per_mm);
+ void setAxisMaxFeedrate_mm_s(const axis_t axis, const float max_feedrate_mm_s);
+ void setAxisMaxAcceleration_mm_s2(const axis_t axis, const float max_acceleration_mm_per_s2);
+ void setMinFeedrate_mm_s(const float min_feedrate_mm_s);
+ void setMinTravelFeedrate_mm_s(const float min_travel_feedrate_mm_s);
+ void setPrintingAcceleration_mm_s2(const float acceleration);
+ void setRetractAcceleration_mm_s2(const float retract_acceleration);
+ void setTravelAcceleration_mm_s2(const float travel_acceleration);
+ void setFeedrate_percent(const float percent);
+
+ #if ENABLED(LIN_ADVANCE)
+ float getLinearAdvance_mm_mm_s(const uint8_t extruder);
+ void setLinearAdvance_mm_mm_s(const uint8_t extruder, const float k);
+ #endif
+
+ #if ENABLED(JUNCTION_DEVIATION)
+ float getJunctionDeviation_mm();
+ void setJunctionDeviation_mm(const float junc_dev);
+ #else
+ float getAxisMaxJerk_mm_s(const axis_t axis);
+ void setAxisMaxJerk_mm_s(const axis_t axis, const float max_jerk);
+ #endif
+
+ void setActiveTool(uint8_t extruder, bool no_move);
+ uint8_t getActiveTool();
+
+ #if HOTENDS > 1
+ float getNozzleOffset_mm(const axis_t axis, uint8_t extruder);
+ void setNozzleOffset_mm(const axis_t axis, uint8_t extruder, float offset);
+ #endif
+
+ #if ENABLED(BABYSTEP_ZPROBE_OFFSET)
+ float getZOffset_mm();
+ void setZOffset_mm(const float zoffset_mm);
+ void incrementZOffset_steps(const int16_t babystep_increment);
+ #endif
+
+ #if ENABLED(BACKLASH_GCODE)
+ float getAxisBacklash_mm(const axis_t axis);
+ void setAxisBacklash_mm(const axis_t axis, float distance);
+
+ float getBacklashCorrection_percent();
+ void setBacklashCorrection_percent(float percent);
+
+ #ifdef BACKLASH_SMOOTHING_MM
+ float getBacklashSmoothing_mm();
+ void setBacklashSmoothing_mm(float distance);
+ #endif
+ #endif
+
+ void delay_ms(unsigned long ms);
+ void yield(); // Within lengthy loop, call this periodically
+
+ void enqueueCommands(progmem_str gcode);
+
+ void printFile(const char *filename);
+ bool isPrintingFromMedia();
+ bool isPrinting();
+ void stopPrint();
+ void pausePrint();
+ void resumePrint();
+
+ bool isMediaInserted();
+
+ class FileList {
+ private:
+ uint16_t num_files;
+
+ public:
+ FileList();
+ void refresh();
+ bool seek(uint16_t, bool skip_range_check = false);
+
+ const char *longFilename();
+ const char *shortFilename();
+ const char *filename();
+ bool isDir();
+
+ void changeDir(const char *dirname);
+ void upDir();
+ bool isAtRootDir();
+ uint16_t count();
+ };
+
+ // The following event handlers are to be declared by the extension
+ // module and will be called by Marlin.
+
+ void onStartup();
+ void onUpdate();
+ void onMediaInserted();
+ void onMediaError();
+ void onMediaRemoved();
+ void onPlayTone(const uint16_t frequency, const uint16_t duration);
+ void onPrinterKilled(const char* msg);
+ void onPrintTimerStarted();
+ void onPrintTimerPaused();
+ void onPrintTimerStopped();
+ void onFilamentRunout();
+ void onStatusChanged(const char* msg);
+ void onStatusChanged(progmem_str msg);
+ void onFactoryReset();
+ void onStoreSettings();
+};
diff --git a/Marlin/src/lcd/language/language_de.h b/Marlin/src/lcd/language/language_de.h
index 3f8ad05fc8..ce0bf408ff 100644
--- a/Marlin/src/lcd/language/language_de.h
+++ b/Marlin/src/lcd/language/language_de.h
@@ -160,6 +160,8 @@
#define MSG_LOAD_EEPROM _UxGT("Konfig. laden")
#define MSG_RESTORE_FAILSAFE _UxGT("Standardwerte laden")
#define MSG_INIT_EEPROM _UxGT("Werkseinstellungen")
+#define MSG_SD_UPDATE _UxGT("SD Update")
+#define MSG_RESET_PRINTER _UxGT("Drucker neustarten")
#define MSG_REFRESH _UxGT("Aktualisieren")
#define MSG_WATCH _UxGT("Info")
#define MSG_PREPARE _UxGT("Vorbereitung")
diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h
index b65e13cf10..9c416188b6 100644
--- a/Marlin/src/lcd/language/language_en.h
+++ b/Marlin/src/lcd/language/language_en.h
@@ -693,6 +693,12 @@
#ifndef MSG_INIT_EEPROM
#define MSG_INIT_EEPROM _UxGT("Initialize EEPROM")
#endif
+#ifndef MSG_SD_UPDATE
+ #define MSG_SD_UPDATE _UxGT("SD Update")
+#endif
+#ifndef MSG_RESET_PRINTER
+ #define MSG_RESET_PRINTER _UxGT("Reset Printer")
+#endif
#ifndef MSG_REFRESH
#define MSG_REFRESH _UxGT("Refresh")
#endif
diff --git a/Marlin/src/lcd/language/language_it.h b/Marlin/src/lcd/language/language_it.h
index e4ac84df8a..b9a42bca32 100644
--- a/Marlin/src/lcd/language/language_it.h
+++ b/Marlin/src/lcd/language/language_it.h
@@ -78,7 +78,7 @@
#define MSG_RETRACT _UxGT("Ritrai")
#define MSG_MOVE_AXIS _UxGT("Muovi Asse")
#define MSG_BED_LEVELING _UxGT("Livella piano")
-#define MSG_LEVEL_BED _UxGT("Livella piano")
+#define MSG_LEVEL_BED MSG_BED_LEVELING
#define MSG_LEVEL_CORNERS _UxGT("Livella spigoli")
#define MSG_NEXT_CORNER _UxGT("Prossimo spigolo")
#define MSG_EDITING_STOPPED _UxGT("Modif. Mesh Fermata")
@@ -280,6 +280,10 @@
#define MSG_CONTROL_RETRACT_RECOVERF _UxGT("UnRet V")
#define MSG_CONTROL_RETRACT_RECOVER_SWAPF _UxGT("S UnRet V")
#define MSG_AUTORETRACT _UxGT("AutoRitrai")
+#define MSG_FILAMENT_SWAP_LENGTH _UxGT("Dist. ritrazione")
+#define MSG_SINGLENOZZLE_TOOL_CHANGE _UxGT("Cambio utensile")
+#define MSG_SINGLENOZZLE_PRIME_SPD _UxGT("Velocità innesco")
+#define MSG_SINGLENOZZLE_RETRACT_SPD _UxGT("Velocità retrazione")
#define MSG_FILAMENTCHANGE _UxGT("Cambia filamento")
#define MSG_FILAMENTLOAD _UxGT("Carica filamento")
#define MSG_FILAMENTUNLOAD _UxGT("Rimuovi filamento")
diff --git a/Marlin/src/lcd/ultralcd.cpp b/Marlin/src/lcd/ultralcd.cpp
index da324e3b0d..479eb3c6e7 100644
--- a/Marlin/src/lcd/ultralcd.cpp
+++ b/Marlin/src/lcd/ultralcd.cpp
@@ -376,14 +376,14 @@ millis_t next_lcd_update_ms;
#endif // !ENCODER_RATE_MULTIPLIER
#define MENU_ITEM_DUMMY() do { _thisItemNr++; }while(0)
- #define MENU_ITEM_EDIT(TYPE, LABEL, ...) MENU_ITEM(setting_edit_ ## TYPE, LABEL, PSTR(LABEL), ## __VA_ARGS__)
- #define MENU_ITEM_EDIT_CALLBACK(TYPE, LABEL, ...) MENU_ITEM(setting_edit_callback_ ## TYPE, LABEL, PSTR(LABEL), ## __VA_ARGS__)
+ #define MENU_ITEM_EDIT(TYPE, LABEL, ...) MENU_ITEM(_CAT(setting_edit_,TYPE), LABEL, PSTR(LABEL), ## __VA_ARGS__)
+ #define MENU_ITEM_EDIT_CALLBACK(TYPE, LABEL, ...) MENU_ITEM(_CAT(setting_edit_callback_,TYPE), LABEL, PSTR(LABEL), ## __VA_ARGS__)
#if ENABLED(ENCODER_RATE_MULTIPLIER)
- #define MENU_MULTIPLIER_ITEM_EDIT(TYPE, LABEL, ...) MENU_MULTIPLIER_ITEM(setting_edit_ ## TYPE, LABEL, PSTR(LABEL), ## __VA_ARGS__)
- #define MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(TYPE, LABEL, ...) MENU_MULTIPLIER_ITEM(setting_edit_callback_ ## TYPE, LABEL, PSTR(LABEL), ## __VA_ARGS__)
+ #define MENU_MULTIPLIER_ITEM_EDIT(TYPE, LABEL, ...) MENU_MULTIPLIER_ITEM(_CAT(setting_edit_,TYPE), LABEL, PSTR(LABEL), ## __VA_ARGS__)
+ #define MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(TYPE, LABEL, ...) MENU_MULTIPLIER_ITEM(_CAT(setting_edit_callback_,TYPE), LABEL, PSTR(LABEL), ## __VA_ARGS__)
#else // !ENCODER_RATE_MULTIPLIER
- #define MENU_MULTIPLIER_ITEM_EDIT(TYPE, LABEL, ...) MENU_ITEM(setting_edit_ ## TYPE, LABEL, PSTR(LABEL), ## __VA_ARGS__)
- #define MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(TYPE, LABEL, ...) MENU_ITEM(setting_edit_callback_ ## TYPE, LABEL, PSTR(LABEL), ## __VA_ARGS__)
+ #define MENU_MULTIPLIER_ITEM_EDIT(TYPE, LABEL, ...) MENU_ITEM(_CAT(setting_edit_,TYPE), LABEL, PSTR(LABEL), ## __VA_ARGS__)
+ #define MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(TYPE, LABEL, ...) MENU_ITEM(_CAT(setting_edit_callback_,TYPE), LABEL, PSTR(LABEL), ## __VA_ARGS__)
#endif // !ENCODER_RATE_MULTIPLIER
#define SCREEN_OR_MENU_LOOP() \
@@ -980,9 +980,9 @@ void lcd_quick_feedback(const bool clear_buttons) {
void singlenozzle_swap_menu() {
START_MENU();
MENU_BACK(MSG_MAIN);
- MENU_ITEM_EDIT(float3, MSG_FILAMENT_SWAP_LENGTH, &singlenozzle_swap_length, 0, 200);
- MENU_MULTIPLIER_ITEM_EDIT(int4, MSG_SINGLENOZZLE_RETRACT_SPD, &singlenozzle_retract_speed, 10, 5400);
- MENU_MULTIPLIER_ITEM_EDIT(int4, MSG_SINGLENOZZLE_PRIME_SPD, &singlenozzle_prime_speed, 10, 5400);
+ MENU_ITEM_EDIT(float3, MSG_FILAMENT_SWAP_LENGTH, &sn_settings.swap_length, 0, 200);
+ MENU_MULTIPLIER_ITEM_EDIT(int4, MSG_SINGLENOZZLE_RETRACT_SPD, &sn_settings.retract_speed, 10, 5400);
+ MENU_MULTIPLIER_ITEM_EDIT(int4, MSG_SINGLENOZZLE_PRIME_SPD, &sn_settings.prime_speed, 10, 5400);
END_MENU();
}
#endif
@@ -1515,13 +1515,6 @@ void lcd_quick_feedback(const bool clear_buttons) {
MENU_ITEM_EDIT(float43, MSG_BED_Z, &mbl.z_offset, -1, 1);
#endif
- //
- // Leveling Fade Height
- //
- #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) && DISABLED(SLIM_LCD_MENUS)
- MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float3, MSG_Z_FADE_HEIGHT, &new_z_fade_height, 0, 100, _lcd_set_z_fade_height);
- #endif
-
//
// Nozzle:
// Nozzle [1-4]:
@@ -3654,7 +3647,7 @@ void lcd_quick_feedback(const bool clear_buttons) {
MENU_ITEM(gcode, MSG_LASER_ON, PSTR(" M3 "));
MENU_ITEM(gcode, MSG_LASER_OFF, PSTR(" M5 "));
#endif
-
+
#if HAS_TEMP_HOTEND
//
@@ -3834,7 +3827,7 @@ void lcd_quick_feedback(const bool clear_buttons) {
if (e == active_extruder)
_planner_refresh_positioning();
else
- planner.steps_to_mm[E_AXIS + e] = 1.0f / planner.axis_steps_per_mm[E_AXIS + e];
+ planner.steps_to_mm[E_AXIS + e] = 1.0f / planner.settings.axis_steps_per_mm[E_AXIS + e];
}
void _planner_refresh_e0_positioning() { _planner_refresh_e_positioning(0); }
void _planner_refresh_e1_positioning() { _planner_refresh_e_positioning(1); }
@@ -3858,35 +3851,35 @@ void lcd_quick_feedback(const bool clear_buttons) {
MENU_BACK(MSG_ADVANCED_SETTINGS);
// M203 Max Feedrate
- MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VMAX MSG_A, &planner.max_feedrate_mm_s[A_AXIS], 1, 999);
- MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VMAX MSG_B, &planner.max_feedrate_mm_s[B_AXIS], 1, 999);
- MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VMAX MSG_C, &planner.max_feedrate_mm_s[C_AXIS], 1, 999);
+ MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VMAX MSG_A, &planner.settings.max_feedrate_mm_s[A_AXIS], 1, 999);
+ MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VMAX MSG_B, &planner.settings.max_feedrate_mm_s[B_AXIS], 1, 999);
+ MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VMAX MSG_C, &planner.settings.max_feedrate_mm_s[C_AXIS], 1, 999);
#if ENABLED(DISTINCT_E_FACTORS)
- MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VMAX MSG_E, &planner.max_feedrate_mm_s[E_AXIS + active_extruder], 1, 999);
- MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VMAX MSG_E1, &planner.max_feedrate_mm_s[E_AXIS], 1, 999);
- MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VMAX MSG_E2, &planner.max_feedrate_mm_s[E_AXIS + 1], 1, 999);
+ MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VMAX MSG_E, &planner.settings.max_feedrate_mm_s[E_AXIS + active_extruder], 1, 999);
+ MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VMAX MSG_E1, &planner.settings.max_feedrate_mm_s[E_AXIS], 1, 999);
+ MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VMAX MSG_E2, &planner.settings.max_feedrate_mm_s[E_AXIS + 1], 1, 999);
#if E_STEPPERS > 2
- MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VMAX MSG_E3, &planner.max_feedrate_mm_s[E_AXIS + 2], 1, 999);
+ MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VMAX MSG_E3, &planner.settings.max_feedrate_mm_s[E_AXIS + 2], 1, 999);
#if E_STEPPERS > 3
- MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VMAX MSG_E4, &planner.max_feedrate_mm_s[E_AXIS + 3], 1, 999);
+ MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VMAX MSG_E4, &planner.settings.max_feedrate_mm_s[E_AXIS + 3], 1, 999);
#if E_STEPPERS > 4
- MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VMAX MSG_E5, &planner.max_feedrate_mm_s[E_AXIS + 4], 1, 999);
+ MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VMAX MSG_E5, &planner.settings.max_feedrate_mm_s[E_AXIS + 4], 1, 999);
#if E_STEPPERS > 5
- MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VMAX MSG_E6, &planner.max_feedrate_mm_s[E_AXIS + 5], 1, 999);
+ MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VMAX MSG_E6, &planner.settings.max_feedrate_mm_s[E_AXIS + 5], 1, 999);
#endif // E_STEPPERS > 5
#endif // E_STEPPERS > 4
#endif // E_STEPPERS > 3
#endif // E_STEPPERS > 2
#else
- MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VMAX MSG_E, &planner.max_feedrate_mm_s[E_AXIS], 1, 999);
+ MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VMAX MSG_E, &planner.settings.max_feedrate_mm_s[E_AXIS], 1, 999);
#endif
// M205 S Min Feedrate
- MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VMIN, &planner.min_feedrate_mm_s, 0, 999);
+ MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VMIN, &planner.settings.min_feedrate_mm_s, 0, 999);
// M205 T Min Travel Feedrate
- MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VTRAV_MIN, &planner.min_travel_feedrate_mm_s, 0, 999);
+ MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_VTRAV_MIN, &planner.settings.min_travel_feedrate_mm_s, 0, 999);
END_MENU();
}
@@ -3897,37 +3890,37 @@ void lcd_quick_feedback(const bool clear_buttons) {
MENU_BACK(MSG_ADVANCED_SETTINGS);
// M204 P Acceleration
- MENU_MULTIPLIER_ITEM_EDIT(float5, MSG_ACC, &planner.acceleration, 10, 99000);
+ MENU_MULTIPLIER_ITEM_EDIT(float5, MSG_ACC, &planner.settings.acceleration, 10, 99000);
// M204 R Retract Acceleration
- MENU_MULTIPLIER_ITEM_EDIT(float5, MSG_A_RETRACT, &planner.retract_acceleration, 100, 99000);
+ MENU_MULTIPLIER_ITEM_EDIT(float5, MSG_A_RETRACT, &planner.settings.retract_acceleration, 100, 99000);
// M204 T Travel Acceleration
- MENU_MULTIPLIER_ITEM_EDIT(float5, MSG_A_TRAVEL, &planner.travel_acceleration, 100, 99000);
+ MENU_MULTIPLIER_ITEM_EDIT(float5, MSG_A_TRAVEL, &planner.settings.travel_acceleration, 100, 99000);
// M201 settings
- MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_A, &planner.max_acceleration_mm_per_s2[A_AXIS], 100, 99000, _reset_acceleration_rates);
- MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_B, &planner.max_acceleration_mm_per_s2[B_AXIS], 100, 99000, _reset_acceleration_rates);
- MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_C, &planner.max_acceleration_mm_per_s2[C_AXIS], 10, 99000, _reset_acceleration_rates);
+ MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_A, &planner.settings.max_acceleration_mm_per_s2[A_AXIS], 100, 99000, _reset_acceleration_rates);
+ MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_B, &planner.settings.max_acceleration_mm_per_s2[B_AXIS], 100, 99000, _reset_acceleration_rates);
+ MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_C, &planner.settings.max_acceleration_mm_per_s2[C_AXIS], 10, 99000, _reset_acceleration_rates);
#if ENABLED(DISTINCT_E_FACTORS)
- MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_E, &planner.max_acceleration_mm_per_s2[E_AXIS + active_extruder], 100, 99000, _reset_acceleration_rates);
- MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_E1, &planner.max_acceleration_mm_per_s2[E_AXIS], 100, 99000, _reset_e0_acceleration_rate);
- MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_E2, &planner.max_acceleration_mm_per_s2[E_AXIS + 1], 100, 99000, _reset_e1_acceleration_rate);
+ MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_E, &planner.settings.max_acceleration_mm_per_s2[E_AXIS + active_extruder], 100, 99000, _reset_acceleration_rates);
+ MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_E1, &planner.settings.max_acceleration_mm_per_s2[E_AXIS], 100, 99000, _reset_e0_acceleration_rate);
+ MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_E2, &planner.settings.max_acceleration_mm_per_s2[E_AXIS + 1], 100, 99000, _reset_e1_acceleration_rate);
#if E_STEPPERS > 2
- MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_E3, &planner.max_acceleration_mm_per_s2[E_AXIS + 2], 100, 99000, _reset_e2_acceleration_rate);
+ MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_E3, &planner.settings.max_acceleration_mm_per_s2[E_AXIS + 2], 100, 99000, _reset_e2_acceleration_rate);
#if E_STEPPERS > 3
- MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_E4, &planner.max_acceleration_mm_per_s2[E_AXIS + 3], 100, 99000, _reset_e3_acceleration_rate);
+ MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_E4, &planner.settings.max_acceleration_mm_per_s2[E_AXIS + 3], 100, 99000, _reset_e3_acceleration_rate);
#if E_STEPPERS > 4
- MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_E5, &planner.max_acceleration_mm_per_s2[E_AXIS + 4], 100, 99000, _reset_e4_acceleration_rate);
+ MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_E5, &planner.settings.max_acceleration_mm_per_s2[E_AXIS + 4], 100, 99000, _reset_e4_acceleration_rate);
#if E_STEPPERS > 5
- MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_E6, &planner.max_acceleration_mm_per_s2[E_AXIS + 5], 100, 99000, _reset_e5_acceleration_rate);
+ MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_E6, &planner.settings.max_acceleration_mm_per_s2[E_AXIS + 5], 100, 99000, _reset_e5_acceleration_rate);
#endif // E_STEPPERS > 5
#endif // E_STEPPERS > 4
#endif // E_STEPPERS > 3
#endif // E_STEPPERS > 2
#else
- MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_E, &planner.max_acceleration_mm_per_s2[E_AXIS], 100, 99000, _reset_acceleration_rates);
+ MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(long5, MSG_AMAX MSG_E, &planner.settings.max_acceleration_mm_per_s2[E_AXIS], 100, 99000, _reset_acceleration_rates);
#endif
END_MENU();
@@ -3966,28 +3959,28 @@ void lcd_quick_feedback(const bool clear_buttons) {
START_MENU();
MENU_BACK(MSG_ADVANCED_SETTINGS);
- MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float62, MSG_ASTEPS, &planner.axis_steps_per_mm[A_AXIS], 5, 9999, _planner_refresh_positioning);
- MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float62, MSG_BSTEPS, &planner.axis_steps_per_mm[B_AXIS], 5, 9999, _planner_refresh_positioning);
- MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float62, MSG_CSTEPS, &planner.axis_steps_per_mm[C_AXIS], 5, 9999, _planner_refresh_positioning);
+ MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float62, MSG_ASTEPS, &planner.settings.axis_steps_per_mm[A_AXIS], 5, 9999, _planner_refresh_positioning);
+ MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float62, MSG_BSTEPS, &planner.settings.axis_steps_per_mm[B_AXIS], 5, 9999, _planner_refresh_positioning);
+ MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float62, MSG_CSTEPS, &planner.settings.axis_steps_per_mm[C_AXIS], 5, 9999, _planner_refresh_positioning);
#if ENABLED(DISTINCT_E_FACTORS)
- MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float62, MSG_ESTEPS, &planner.axis_steps_per_mm[E_AXIS + active_extruder], 5, 9999, _planner_refresh_positioning);
- MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float62, MSG_E1STEPS, &planner.axis_steps_per_mm[E_AXIS], 5, 9999, _planner_refresh_e0_positioning);
- MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float62, MSG_E2STEPS, &planner.axis_steps_per_mm[E_AXIS + 1], 5, 9999, _planner_refresh_e1_positioning);
+ MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float62, MSG_ESTEPS, &planner.settings.axis_steps_per_mm[E_AXIS + active_extruder], 5, 9999, _planner_refresh_positioning);
+ MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float62, MSG_E1STEPS, &planner.settings.axis_steps_per_mm[E_AXIS], 5, 9999, _planner_refresh_e0_positioning);
+ MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float62, MSG_E2STEPS, &planner.settings.axis_steps_per_mm[E_AXIS + 1], 5, 9999, _planner_refresh_e1_positioning);
#if E_STEPPERS > 2
- MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float62, MSG_E3STEPS, &planner.axis_steps_per_mm[E_AXIS + 2], 5, 9999, _planner_refresh_e2_positioning);
+ MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float62, MSG_E3STEPS, &planner.settings.axis_steps_per_mm[E_AXIS + 2], 5, 9999, _planner_refresh_e2_positioning);
#if E_STEPPERS > 3
- MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float62, MSG_E4STEPS, &planner.axis_steps_per_mm[E_AXIS + 3], 5, 9999, _planner_refresh_e3_positioning);
+ MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float62, MSG_E4STEPS, &planner.settings.axis_steps_per_mm[E_AXIS + 3], 5, 9999, _planner_refresh_e3_positioning);
#if E_STEPPERS > 4
- MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float62, MSG_E5STEPS, &planner.axis_steps_per_mm[E_AXIS + 4], 5, 9999, _planner_refresh_e4_positioning);
+ MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float62, MSG_E5STEPS, &planner.settings.axis_steps_per_mm[E_AXIS + 4], 5, 9999, _planner_refresh_e4_positioning);
#if E_STEPPERS > 5
- MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float62, MSG_E6STEPS, &planner.axis_steps_per_mm[E_AXIS + 5], 5, 9999, _planner_refresh_e5_positioning);
+ MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float62, MSG_E6STEPS, &planner.settings.axis_steps_per_mm[E_AXIS + 5], 5, 9999, _planner_refresh_e5_positioning);
#endif // E_STEPPERS > 5
#endif // E_STEPPERS > 4
#endif // E_STEPPERS > 3
#endif // E_STEPPERS > 2
#else
- MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float62, MSG_ESTEPS, &planner.axis_steps_per_mm[E_AXIS], 5, 9999, _planner_refresh_positioning);
+ MENU_MULTIPLIER_ITEM_EDIT_CALLBACK(float62, MSG_ESTEPS, &planner.settings.axis_steps_per_mm[E_AXIS], 5, 9999, _planner_refresh_positioning);
#endif
END_MENU();
@@ -4012,6 +4005,18 @@ void lcd_quick_feedback(const bool clear_buttons) {
}
#endif
+ #if ENABLED(SD_FIRMWARE_UPDATE)
+ /**
+ * Toggle the SD Firmware Update state in EEPROM
+ */
+ static void _lcd_toggle_sd_update() {
+ const bool new_state = !settings.sd_update_status();
+ lcd_completion_feedback(settings.set_sd_update_status(new_state));
+ lcd_return_to_status();
+ if (new_state) LCD_MESSAGEPGM(MSG_RESET_PRINTER); else lcd_reset_status();
+ }
+ #endif
+
void lcd_advanced_settings_menu() {
START_MENU();
MENU_BACK(MSG_CONFIGURATION);
@@ -4040,8 +4045,10 @@ void lcd_quick_feedback(const bool clear_buttons) {
// M205 - Max Jerk
MENU_ITEM(submenu, MSG_JERK, lcd_advanced_jerk_menu);
- // M92 - Steps Per mm
- MENU_ITEM(submenu, MSG_STEPS_PER_MM, lcd_advanced_steps_per_mm_menu);
+ if (!printer_busy) {
+ // M92 - Steps Per mm
+ MENU_ITEM(submenu, MSG_STEPS_PER_MM, lcd_advanced_steps_per_mm_menu);
+ }
#endif // !SLIM_LCD_MENUS
@@ -4084,6 +4091,11 @@ void lcd_quick_feedback(const bool clear_buttons) {
MENU_ITEM(gcode, MSG_BLTOUCH_RESET, PSTR("M280 P" STRINGIFY(Z_PROBE_SERVO_NR) " S" STRINGIFY(BLTOUCH_RESET)));
#endif
+ #if ENABLED(SD_FIRMWARE_UPDATE)
+ bool sd_update_state = settings.sd_update_status();
+ MENU_ITEM_EDIT_CALLBACK(bool, MSG_SD_UPDATE, &sd_update_state, _lcd_toggle_sd_update);
+ #endif
+
#if ENABLED(EEPROM_SETTINGS) && DISABLED(SLIM_LCD_MENUS)
MENU_ITEM(submenu, MSG_INIT_EEPROM, lcd_init_eeprom_confirm);
#endif
@@ -4158,19 +4170,19 @@ void lcd_quick_feedback(const bool clear_buttons) {
;
#if EXTRUDERS == 1
- MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_UNLOAD, &filament_change_unload_length[0], 0, extrude_maxlength);
+ MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_UNLOAD, &fc_settings[0].unload_length, 0, extrude_maxlength);
#else // EXTRUDERS > 1
- MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_UNLOAD, &filament_change_unload_length[active_extruder], 0, extrude_maxlength);
- MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_UNLOAD MSG_DIAM_E1, &filament_change_unload_length[0], 0, extrude_maxlength);
- MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_UNLOAD MSG_DIAM_E2, &filament_change_unload_length[1], 0, extrude_maxlength);
+ MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_UNLOAD, &fc_settings[active_extruder].unload_length, 0, extrude_maxlength);
+ MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_UNLOAD MSG_DIAM_E1, &fc_settings[0].unload_length, 0, extrude_maxlength);
+ MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_UNLOAD MSG_DIAM_E2, &fc_settings[1].unload_length, 0, extrude_maxlength);
#if EXTRUDERS > 2
- MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_UNLOAD MSG_DIAM_E3, &filament_change_unload_length[2], 0, extrude_maxlength);
+ MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_UNLOAD MSG_DIAM_E3, &fc_settings[2].unload_length, 0, extrude_maxlength);
#if EXTRUDERS > 3
- MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_UNLOAD MSG_DIAM_E4, &filament_change_unload_length[3], 0, extrude_maxlength);
+ MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_UNLOAD MSG_DIAM_E4, &fc_settings[3].unload_length, 0, extrude_maxlength);
#if EXTRUDERS > 4
- MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_UNLOAD MSG_DIAM_E5, &filament_change_unload_length[4], 0, extrude_maxlength);
+ MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_UNLOAD MSG_DIAM_E5, &fc_settings[4].unload_length, 0, extrude_maxlength);
#if EXTRUDERS > 5
- MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_UNLOAD MSG_DIAM_E6, &filament_change_unload_length[5], 0, extrude_maxlength);
+ MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_UNLOAD MSG_DIAM_E6, &fc_settings[5].unload_length, 0, extrude_maxlength);
#endif // EXTRUDERS > 5
#endif // EXTRUDERS > 4
#endif // EXTRUDERS > 3
@@ -4178,19 +4190,19 @@ void lcd_quick_feedback(const bool clear_buttons) {
#endif // EXTRUDERS > 1
#if EXTRUDERS == 1
- MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_LOAD, &filament_change_load_length[0], 0, extrude_maxlength);
+ MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_LOAD, &fc_settings[0].load_length, 0, extrude_maxlength);
#else // EXTRUDERS > 1
- MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_LOAD, &filament_change_load_length[active_extruder], 0, extrude_maxlength);
- MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_LOAD MSG_DIAM_E1, &filament_change_load_length[0], 0, extrude_maxlength);
- MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_LOAD MSG_DIAM_E2, &filament_change_load_length[1], 0, extrude_maxlength);
+ MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_LOAD, &fc_settings[active_extruder].load_length, 0, extrude_maxlength);
+ MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_LOAD MSG_DIAM_E1, &fc_settings[0].load_length, 0, extrude_maxlength);
+ MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_LOAD MSG_DIAM_E2, &fc_settings[1].load_length, 0, extrude_maxlength);
#if EXTRUDERS > 2
- MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_LOAD MSG_DIAM_E3, &filament_change_load_length[2], 0, extrude_maxlength);
+ MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_LOAD MSG_DIAM_E3, &fc_settings[2].load_length, 0, extrude_maxlength);
#if EXTRUDERS > 3
- MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_LOAD MSG_DIAM_E4, &filament_change_load_length[3], 0, extrude_maxlength);
+ MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_LOAD MSG_DIAM_E4, &fc_settings[3].load_length, 0, extrude_maxlength);
#if EXTRUDERS > 4
- MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_LOAD MSG_DIAM_E5, &filament_change_load_length[4], 0, extrude_maxlength);
+ MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_LOAD MSG_DIAM_E5, &fc_settings[4].load_length, 0, extrude_maxlength);
#if EXTRUDERS > 5
- MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_LOAD MSG_DIAM_E6, &filament_change_load_length[5], 0, extrude_maxlength);
+ MENU_MULTIPLIER_ITEM_EDIT(float3, MSG_FILAMENT_LOAD MSG_DIAM_E6, &fc_settings[5].load_length, 0, extrude_maxlength);
#endif // EXTRUDERS > 5
#endif // EXTRUDERS > 4
#endif // EXTRUDERS > 3
@@ -4215,19 +4227,19 @@ void lcd_quick_feedback(const bool clear_buttons) {
#if ENABLED(FWRETRACT_AUTORETRACT)
MENU_ITEM_EDIT_CALLBACK(bool, MSG_AUTORETRACT, &fwretract.autoretract_enabled, fwretract.refresh_autoretract);
#endif
- MENU_ITEM_EDIT(float52sign, MSG_CONTROL_RETRACT, &fwretract.retract_length, 0, 100);
+ MENU_ITEM_EDIT(float52sign, MSG_CONTROL_RETRACT, &fwretract.settings.retract_length, 0, 100);
#if EXTRUDERS > 1
- MENU_ITEM_EDIT(float52sign, MSG_CONTROL_RETRACT_SWAP, &fwretract.swap_retract_length, 0, 100);
+ MENU_ITEM_EDIT(float52sign, MSG_CONTROL_RETRACT_SWAP, &fwretract.settings.swap_retract_length, 0, 100);
#endif
- MENU_ITEM_EDIT(float3, MSG_CONTROL_RETRACTF, &fwretract.retract_feedrate_mm_s, 1, 999);
- MENU_ITEM_EDIT(float52sign, MSG_CONTROL_RETRACT_ZLIFT, &fwretract.retract_zlift, 0, 999);
- MENU_ITEM_EDIT(float52sign, MSG_CONTROL_RETRACT_RECOVER, &fwretract.retract_recover_length, -100, 100);
+ MENU_ITEM_EDIT(float3, MSG_CONTROL_RETRACTF, &fwretract.settings.retract_feedrate_mm_s, 1, 999);
+ MENU_ITEM_EDIT(float52sign, MSG_CONTROL_RETRACT_ZLIFT, &fwretract.settings.retract_zlift, 0, 999);
+ MENU_ITEM_EDIT(float52sign, MSG_CONTROL_RETRACT_RECOVER, &fwretract.settings.retract_recover_length, -100, 100);
#if EXTRUDERS > 1
- MENU_ITEM_EDIT(float52sign, MSG_CONTROL_RETRACT_RECOVER_SWAP, &fwretract.swap_retract_recover_length, -100, 100);
+ MENU_ITEM_EDIT(float52sign, MSG_CONTROL_RETRACT_RECOVER_SWAP, &fwretract.settings.swap_retract_recover_length, -100, 100);
#endif
- MENU_ITEM_EDIT(float3, MSG_CONTROL_RETRACT_RECOVERF, &fwretract.retract_recover_feedrate_mm_s, 1, 999);
+ MENU_ITEM_EDIT(float3, MSG_CONTROL_RETRACT_RECOVERF, &fwretract.settings.retract_recover_feedrate_mm_s, 1, 999);
#if EXTRUDERS > 1
- MENU_ITEM_EDIT(float3, MSG_CONTROL_RETRACT_RECOVER_SWAPF, &fwretract.swap_retract_recover_feedrate_mm_s, 1, 999);
+ MENU_ITEM_EDIT(float3, MSG_CONTROL_RETRACT_RECOVER_SWAPF, &fwretract.settings.swap_retract_recover_feedrate_mm_s, 1, 999);
#endif
END_MENU();
}
diff --git a/Marlin/src/lcd/ultralcd.h b/Marlin/src/lcd/ultralcd.h
index 58863a4d3d..2b262f6af1 100644
--- a/Marlin/src/lcd/ultralcd.h
+++ b/Marlin/src/lcd/ultralcd.h
@@ -25,7 +25,7 @@
#include "../inc/MarlinConfig.h"
-#if ENABLED(ULTRA_LCD) || ENABLED(MALYAN_LCD)
+#if ENABLED(ULTRA_LCD) || ENABLED(MALYAN_LCD) || ENABLED(EXTENSIBLE_UI)
void lcd_init();
bool lcd_detected();
void lcd_update();
@@ -208,6 +208,15 @@
void wait_for_release();
#endif
+#elif ENABLED(EXTENSIBLE_UI)
+ // These functions are defined elsewhere
+ void lcd_setstatus(const char* const message, const bool persist=false);
+ void lcd_setstatusPGM(const char* const message, const int8_t level=0);
+ void lcd_status_printf_P(const uint8_t level, const char * const fmt, ...);
+ void lcd_reset_status();
+ void lcd_refresh();
+ void lcd_reset_alert_level();
+ bool lcd_hasstatus();
#else // MALYAN_LCD or no LCD
constexpr bool lcd_wait_for_move = false;
@@ -279,7 +288,7 @@
void lcd_reselect_last_file();
#endif
-#if ENABLED(ULTIPANEL) && ENABLED(SDSUPPORT)
+#if (ENABLED(EXTENSIBLE_UI) || ENABLED(ULTIPANEL)) && ENABLED(SDSUPPORT)
extern bool abort_sd_printing;
#else
constexpr bool abort_sd_printing = false;
diff --git a/Marlin/src/libs/buzzer.cpp b/Marlin/src/libs/buzzer.cpp
index 117104001e..6fb4d51a03 100644
--- a/Marlin/src/libs/buzzer.cpp
+++ b/Marlin/src/libs/buzzer.cpp
@@ -27,6 +27,10 @@
#include "buzzer.h"
#include "../module/temperature.h"
+#if ENABLED(EXTENSIBLE_UI)
+ #include "../lcd/extensible_ui/ui_api.h"
+#endif
+
Buzzer::state_t Buzzer::state;
CircularQueue Buzzer::buffer;
Buzzer buzzer;
@@ -58,7 +62,11 @@ void Buzzer::tick() {
state.endtime = now + state.tone.duration;
if (state.tone.frequency > 0) {
- #if ENABLED(SPEAKER)
+ #if ENABLED(EXTENSIBLE_UI)
+ CRITICAL_SECTION_START;
+ UI::onPlayTone(state.tone.frequency, state.tone.duration);
+ CRITICAL_SECTION_END;
+ #elif ENABLED(SPEAKER)
CRITICAL_SECTION_START;
::tone(BEEPER_PIN, state.tone.frequency, state.tone.duration);
CRITICAL_SECTION_END;
diff --git a/Marlin/src/libs/buzzer.h b/Marlin/src/libs/buzzer.h
index 2da9b8dee7..6661c10455 100644
--- a/Marlin/src/libs/buzzer.h
+++ b/Marlin/src/libs/buzzer.h
@@ -28,7 +28,7 @@
// Make a buzzer and macro
#if ENABLED(LCD_USE_I2C_BUZZER)
// BUZZ() will be defined in ultralcd.h
-#elif PIN_EXISTS(BEEPER)
+#elif PIN_EXISTS(BEEPER) || ENABLED(EXTENSIBLE_UI)
#include "circularqueue.h"
diff --git a/Marlin/src/module/configuration_store.cpp b/Marlin/src/module/configuration_store.cpp
index 993ea39644..150f562802 100644
--- a/Marlin/src/module/configuration_store.cpp
+++ b/Marlin/src/module/configuration_store.cpp
@@ -37,8 +37,8 @@
*/
// Change EEPROM version if the structure changes
-#define EEPROM_VERSION "V60"
-#define EEPROM_OFFSET 0
+#define EEPROM_VERSION "V61"
+#define EEPROM_OFFSET 100
// Check the integrity of data offsets.
// Can be disabled for production build.
@@ -81,15 +81,6 @@
#include "../module/probe.h"
#endif
-#if HAS_TRINAMIC
- #include "stepper_indirection.h"
- #include "../feature/tmc_util.h"
- #define TMC_GET_PWMTHRS(A,Q) _tmc_thrs(stepper##Q.microsteps(), stepper##Q.TPWMTHRS(), planner.axis_steps_per_mm[_AXIS(A)])
-#endif
-typedef struct { uint16_t X, Y, Z, X2, Y2, Z2, Z3, E0, E1, E2, E3, E4, E5; } tmc_stepper_current_t;
-typedef struct { uint32_t X, Y, Z, X2, Y2, Z2, Z3, E0, E1, E2, E3, E4, E5; } tmc_hybrid_threshold_t;
-typedef struct { int16_t X, Y, Z; } tmc_sgt_t;
-
#if ENABLED(FWRETRACT)
#include "../feature/fwretract.h"
#endif
@@ -103,14 +94,20 @@ typedef struct { int16_t X, Y, Z; } tmc
void M217_report(const bool eeprom);
#endif
-#if ENABLED(PID_EXTRUSION_SCALING)
- #define LPQ_LEN thermalManager.lpq_len
+#if HAS_TRINAMIC
+ #include "stepper_indirection.h"
+ #include "../feature/tmc_util.h"
+ #define TMC_GET_PWMTHRS(A,Q) _tmc_thrs(stepper##Q.microsteps(), stepper##Q.TPWMTHRS(), planner.settings.axis_steps_per_mm[_AXIS(A)])
#endif
#pragma pack(push, 1) // No padding between variables
-typedef struct PID { float Kp, Ki, Kd; } PID;
-typedef struct PIDC { float Kp, Ki, Kd, Kc; } PIDC;
+typedef struct { uint16_t X, Y, Z, X2, Y2, Z2, Z3, E0, E1, E2, E3, E4, E5; } tmc_stepper_current_t;
+typedef struct { uint32_t X, Y, Z, X2, Y2, Z2, Z3, E0, E1, E2, E3, E4, E5; } tmc_hybrid_threshold_t;
+typedef struct { int16_t X, Y, Z; } tmc_sgt_t;
+
+// Limit an index to an array size
+#define ALIM(I,ARR) MIN(I, COUNT(ARR) - 1)
/**
* Current EEPROM Layout
@@ -127,17 +124,10 @@ typedef struct SettingsDataStruct {
//
uint8_t esteppers; // XYZE_N - XYZ
- uint32_t planner_max_acceleration_mm_per_s2[XYZE_N], // M201 XYZE planner.max_acceleration_mm_per_s2[XYZE_N]
- planner_min_segment_time_us; // M205 B planner.min_segment_time_us
- float planner_axis_steps_per_mm[XYZE_N], // M92 XYZE planner.axis_steps_per_mm[XYZE_N]
- planner_max_feedrate_mm_s[XYZE_N], // M203 XYZE planner.max_feedrate_mm_s[XYZE_N]
- planner_acceleration, // M204 P planner.acceleration
- planner_retract_acceleration, // M204 R planner.retract_acceleration
- planner_travel_acceleration, // M204 T planner.travel_acceleration
- planner_min_feedrate_mm_s, // M205 S planner.min_feedrate_mm_s
- planner_min_travel_feedrate_mm_s, // M205 T planner.min_travel_feedrate_mm_s
- planner_max_jerk[XYZE], // M205 XYZE planner.max_jerk[XYZE]
- planner_junction_deviation_mm; // M205 J planner.junction_deviation_mm
+ planner_settings_t planner_settings;
+
+ float planner_max_jerk[XYZE], // M205 XYZE planner.max_jerk[XYZE]
+ planner_junction_deviation_mm; // M205 J planner.junction_deviation_mm
float home_offset[XYZ]; // M206 XYZ
@@ -207,9 +197,9 @@ typedef struct SettingsDataStruct {
delta_calibration_radius, // M665 B
delta_tower_angle_trim[ABC]; // M665 XYZ
#elif ENABLED(X_DUAL_ENDSTOPS) || ENABLED(Y_DUAL_ENDSTOPS) || Z_MULTI_ENDSTOPS
- float x2_endstop_adj, // M666 X
- y2_endstop_adj, // M666 Y
- z2_endstop_adj; // M666 Z
+ float x2_endstop_adj, // M666 X
+ y2_endstop_adj, // M666 Y
+ z2_endstop_adj; // M666 Z
#if ENABLED(Z_TRIPLE_ENDSTOPS)
float z3_endstop_adj; // M666 Z
#endif
@@ -225,32 +215,24 @@ typedef struct SettingsDataStruct {
//
// PIDTEMP
//
- PIDC hotendPID[HOTENDS]; // M301 En PIDC / M303 En U
-
+ PIDC_t hotendPID[HOTENDS]; // M301 En PIDC / M303 En U
int16_t lpq_len; // M301 L
//
// PIDTEMPBED
//
- PID bedPID; // M304 PID / M303 E-1 U
+ PID_t bedPID; // M304 PID / M303 E-1 U
//
// HAS_LCD_CONTRAST
//
- int16_t lcd_contrast; // M250 C
+ int16_t lcd_contrast; // M250 C
//
// FWRETRACT
//
+ fwretract_settings_t fwretract_settings; // M207 S F Z W, M208 S F W R
bool autoretract_enabled; // M209 S
- float retract_length, // M207 S
- retract_feedrate_mm_s, // M207 F
- retract_zlift, // M207 Z
- retract_recover_length, // M208 S
- retract_recover_feedrate_mm_s, // M208 F
- swap_retract_length, // M207 W
- swap_retract_recover_length, // M208 W
- swap_retract_recover_feedrate_mm_s; // M208 R
//
// !NO_VOLUMETRIC
@@ -261,7 +243,6 @@ typedef struct SettingsDataStruct {
//
// HAS_TRINAMIC
//
- #define TMC_AXES (MAX_EXTRUDERS + 7)
tmc_stepper_current_t tmc_stepper_current; // M906 X Y Z X2 Y2 Z2 Z3 E0 E1 E2 E3 E4 E5
tmc_hybrid_threshold_t tmc_hybrid_threshold; // M913 X Y Z X2 Y2 Z2 Z3 E0 E1 E2 E3 E4 E5
tmc_sgt_t tmc_sgt; // M914 X Y Z
@@ -274,7 +255,7 @@ typedef struct SettingsDataStruct {
//
// HAS_MOTOR_CURRENT_PWM
//
- uint32_t motor_current_setting[XYZ]; // M907 X Z E
+ uint32_t motor_current_setting[3]; // M907 X Z E
//
// CNC_COORDINATE_SYSTEMS
@@ -284,29 +265,22 @@ typedef struct SettingsDataStruct {
//
// SKEW_CORRECTION
//
- float planner_xy_skew_factor, // M852 I planner.xy_skew_factor
- planner_xz_skew_factor, // M852 J planner.xz_skew_factor
- planner_yz_skew_factor; // M852 K planner.yz_skew_factor
+ skew_factor_t planner_skew_factor; // M852 I J K planner.skew_factor
//
// ADVANCED_PAUSE_FEATURE
//
- float filament_change_unload_length[EXTRUDERS], // M603 T U
- filament_change_load_length[EXTRUDERS]; // M603 T L
+ fil_change_settings_t fc_settings[EXTRUDERS]; // M603 T U L
//
// SINGLENOZZLE toolchange values
//
#if ENABLED(SINGLENOZZLE)
- float singlenozzle_swap_length; // M217 S
- int16_t singlenozzle_prime_speed, // M217 P
- singlenozzle_retract_speed; // M217 R
+ singlenozzle_settings_t sn_settings; // M217 S P R
#endif
} SettingsData;
-#pragma pack(pop)
-
MarlinSettings settings;
uint16_t MarlinSettings::datasize() { return sizeof(SettingsData); }
@@ -376,17 +350,42 @@ void MarlinSettings::postprocess() {
report_current_position();
}
+#if ENABLED(SD_FIRMWARE_UPDATE)
+
+ #if ENABLED(EEPROM_SETTINGS)
+ static_assert(
+ !WITHIN(SD_FIRMWARE_UPDATE_EEPROM_ADDR, EEPROM_OFFSET, EEPROM_OFFSET + sizeof(SettingsData)),
+ "SD_FIRMWARE_UPDATE_EEPROM_ADDR collides with EEPROM settings storage."
+ );
+ #endif
+
+ bool MarlinSettings::sd_update_status() {
+ uint8_t val;
+ persistentStore.read_data(SD_FIRMWARE_UPDATE_EEPROM_ADDR, &val);
+ return (val == SD_FIRMWARE_UPDATE_ACTIVE_VALUE);
+ }
+
+ bool MarlinSettings::set_sd_update_status(const bool enable) {
+ if (enable != sd_update_status())
+ persistentStore.write_data(
+ SD_FIRMWARE_UPDATE_EEPROM_ADDR,
+ enable ? SD_FIRMWARE_UPDATE_ACTIVE_VALUE : SD_FIRMWARE_UPDATE_INACTIVE_VALUE
+ );
+ return true;
+ }
+
+#endif // SD_FIRMWARE_UPDATE
+
#if ENABLED(EEPROM_SETTINGS)
#include "../HAL/shared/persistent_store_api.h"
- #define DUMMY_PID_VALUE 3000.0f
#define EEPROM_START() int eeprom_index = EEPROM_OFFSET; persistentStore.access_start()
#define EEPROM_FINISH() persistentStore.access_finish()
#define EEPROM_SKIP(VAR) eeprom_index += sizeof(VAR)
#define EEPROM_WRITE(VAR) persistentStore.write_data(eeprom_index, (uint8_t*)&VAR, sizeof(VAR), &working_crc)
#define EEPROM_READ(VAR) persistentStore.read_data(eeprom_index, (uint8_t*)&VAR, sizeof(VAR), &working_crc, !validating)
#define EEPROM_READ_ALWAYS(VAR) persistentStore.read_data(eeprom_index, (uint8_t*)&VAR, sizeof(VAR), &working_crc)
- #define EEPROM_ASSERT(TST,ERR) if (!(TST)) do{ SERIAL_ERROR_START_P(port); SERIAL_ERRORLNPGM_P(port, ERR); eeprom_error = true; }while(0)
+ #define EEPROM_ASSERT(TST,ERR) do{ if (!(TST)) { SERIAL_ERROR_START_P(port); SERIAL_ERRORLNPGM_P(port, ERR); eeprom_error = true; } }while(0)
#if ENABLED(DEBUG_EEPROM_READWRITE)
#define _FIELD_TEST(FIELD) \
@@ -436,18 +435,10 @@ void MarlinSettings::postprocess() {
_FIELD_TEST(esteppers);
- const uint8_t esteppers = COUNT(planner.axis_steps_per_mm) - XYZ;
+ const uint8_t esteppers = COUNT(planner.settings.axis_steps_per_mm) - XYZ;
EEPROM_WRITE(esteppers);
- EEPROM_WRITE(planner.max_acceleration_mm_per_s2);
- EEPROM_WRITE(planner.min_segment_time_us);
- EEPROM_WRITE(planner.axis_steps_per_mm);
- EEPROM_WRITE(planner.max_feedrate_mm_s);
- EEPROM_WRITE(planner.acceleration);
- EEPROM_WRITE(planner.retract_acceleration);
- EEPROM_WRITE(planner.travel_acceleration);
- EEPROM_WRITE(planner.min_feedrate_mm_s);
- EEPROM_WRITE(planner.min_travel_feedrate_mm_s);
+ EEPROM_WRITE(planner.settings);
#if HAS_CLASSIC_JERK
EEPROM_WRITE(planner.max_jerk);
@@ -652,40 +643,43 @@ void MarlinSettings::postprocess() {
EEPROM_WRITE(lcd_preheat_bed_temp);
EEPROM_WRITE(lcd_preheat_fan_speed);
- for (uint8_t e = 0; e < HOTENDS; e++) {
- #if ENABLED(PIDTEMP)
- EEPROM_WRITE(PID_PARAM(Kp, e));
- EEPROM_WRITE(PID_PARAM(Ki, e));
- EEPROM_WRITE(PID_PARAM(Kd, e));
- #if ENABLED(PID_EXTRUSION_SCALING)
- EEPROM_WRITE(PID_PARAM(Kc, e));
- #else
- dummy = 1.0f; // 1.0 = default kc
- EEPROM_WRITE(dummy);
- #endif
+ //
+ // PIDTEMP
+ //
+ {
+ _FIELD_TEST(hotendPID);
+ HOTEND_LOOP() {
+ PIDC_t pidc = {
+ PID_PARAM(Kp, e), PID_PARAM(Ki, e), PID_PARAM(Kd, e), PID_PARAM(Kc, e)
+ };
+ EEPROM_WRITE(pidc);
+ }
+
+ _FIELD_TEST(lpq_len);
+ #if ENABLED(PID_EXTRUSION_SCALING)
+ EEPROM_WRITE(thermalManager.lpq_len);
#else
- dummy = DUMMY_PID_VALUE; // When read, will not change the existing value
- EEPROM_WRITE(dummy); // Kp
- dummy = 0;
- for (uint8_t q = 3; q--;) EEPROM_WRITE(dummy); // Ki, Kd, Kc
+ const int16_t lpq_len = 20;
+ EEPROM_WRITE(lpq_len);
#endif
- } // Hotends Loop
+ }
- _FIELD_TEST(lpq_len);
+ //
+ // PIDTEMPBED
+ //
+ {
+ _FIELD_TEST(bedPID);
+ #if DISABLED(PIDTEMPBED)
+ const PID_t bed_pid = { DUMMY_PID_VALUE, DUMMY_PID_VALUE, DUMMY_PID_VALUE };
+ EEPROM_WRITE(bed_pid);
+ #else
+ EEPROM_WRITE(thermalManager.bed_pid);
+ #endif
+ }
- #if DISABLED(PID_EXTRUSION_SCALING)
- const int16_t LPQ_LEN = 20;
- #endif
- EEPROM_WRITE(LPQ_LEN);
-
- #if DISABLED(PIDTEMPBED)
- dummy = DUMMY_PID_VALUE;
- for (uint8_t q = 3; q--;) EEPROM_WRITE(dummy);
- #else
- EEPROM_WRITE(thermalManager.bedKp);
- EEPROM_WRITE(thermalManager.bedKi);
- EEPROM_WRITE(thermalManager.bedKd);
- #endif
+ //
+ // LCD Contrast
+ //
_FIELD_TEST(lcd_contrast);
@@ -694,228 +688,227 @@ void MarlinSettings::postprocess() {
#endif
EEPROM_WRITE(lcd_contrast);
- const bool autoretract_enabled =
- #if DISABLED(FWRETRACT_AUTORETRACT)
- false
- #else
- fwretract.autoretract_enabled
- #endif
- ;
- EEPROM_WRITE(autoretract_enabled);
+ //
+ // Firmware Retraction
+ //
+ {
+ _FIELD_TEST(fwretract_settings);
- #if DISABLED(FWRETRACT)
- const float autoretract_defaults[] = { 3, 45, 0, 0, 0, 13, 0, 8 };
- EEPROM_WRITE(autoretract_defaults);
- #else
- EEPROM_WRITE(fwretract.retract_length);
- EEPROM_WRITE(fwretract.retract_feedrate_mm_s);
- EEPROM_WRITE(fwretract.retract_zlift);
- EEPROM_WRITE(fwretract.retract_recover_length);
- EEPROM_WRITE(fwretract.retract_recover_feedrate_mm_s);
- EEPROM_WRITE(fwretract.swap_retract_length);
- EEPROM_WRITE(fwretract.swap_retract_recover_length);
- EEPROM_WRITE(fwretract.swap_retract_recover_feedrate_mm_s);
- #endif
+ #if ENABLED(FWRETRACT)
+ EEPROM_WRITE(fwretract.settings);
+ #else
+ const fwretract_settings_t autoretract_defaults = { 3, 45, 0, 0, 0, 13, 0, 8 };
+ EEPROM_WRITE(autoretract_defaults);
+ #endif
+ #if ENABLED(FWRETRACT) && ENABLED(FWRETRACT_AUTORETRACT)
+ EEPROM_WRITE(fwretract.autoretract_enabled);
+ #else
+ const bool autoretract_enabled = false;
+ EEPROM_WRITE(autoretract_enabled);
+ #endif
+ }
//
// Volumetric & Filament Size
//
+ {
+ _FIELD_TEST(parser_volumetric_enabled);
- _FIELD_TEST(parser_volumetric_enabled);
+ #if DISABLED(NO_VOLUMETRICS)
- #if DISABLED(NO_VOLUMETRICS)
+ EEPROM_WRITE(parser.volumetric_enabled);
+ EEPROM_WRITE(planner.filament_size);
- EEPROM_WRITE(parser.volumetric_enabled);
+ #else
- // Save filament sizes
- for (uint8_t q = 0; q < COUNT(planner.filament_size); q++)
- EEPROM_WRITE(planner.filament_size[q]);
+ const bool volumetric_enabled = false;
+ dummy = DEFAULT_NOMINAL_FILAMENT_DIA;
+ EEPROM_WRITE(volumetric_enabled);
+ for (uint8_t q = EXTRUDERS; q--;) EEPROM_WRITE(dummy);
- #else
-
- const bool volumetric_enabled = false;
- dummy = DEFAULT_NOMINAL_FILAMENT_DIA;
- EEPROM_WRITE(volumetric_enabled);
- for (uint8_t q = EXTRUDERS; q--;) EEPROM_WRITE(dummy);
-
- #endif
+ #endif
+ }
//
- // Save TMC Configuration, and placeholder values
+ // TMC Configuration
//
+ {
+ _FIELD_TEST(tmc_stepper_current);
- _FIELD_TEST(tmc_stepper_current);
+ tmc_stepper_current_t tmc_stepper_current = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
- tmc_stepper_current_t tmc_stepper_current = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
-
- #if HAS_TRINAMIC
- #if AXIS_IS_TMC(X)
- tmc_stepper_current.X = stepperX.getMilliamps();
- #endif
- #if AXIS_IS_TMC(Y)
- tmc_stepper_current.Y = stepperY.getMilliamps();
- #endif
- #if AXIS_IS_TMC(Z)
- tmc_stepper_current.Z = stepperZ.getMilliamps();
- #endif
- #if AXIS_IS_TMC(X2)
- tmc_stepper_current.X2 = stepperX2.getMilliamps();
- #endif
- #if AXIS_IS_TMC(Y2)
- tmc_stepper_current.Y2 = stepperY2.getMilliamps();
- #endif
- #if AXIS_IS_TMC(Z2)
- tmc_stepper_current.Z2 = stepperZ2.getMilliamps();
- #endif
- #if AXIS_IS_TMC(Z3)
- tmc_stepper_current.Z3 = stepperZ3.getMilliamps();
- #endif
- #if MAX_EXTRUDERS
- #if AXIS_IS_TMC(E0)
- tmc_stepper_current.E0 = stepperE0.getMilliamps();
+ #if HAS_TRINAMIC
+ #if AXIS_IS_TMC(X)
+ tmc_stepper_current.X = stepperX.getMilliamps();
#endif
- #if MAX_EXTRUDERS > 1
- #if AXIS_IS_TMC(E1)
- tmc_stepper_current.E1 = stepperE1.getMilliamps();
- #endif
- #if MAX_EXTRUDERS > 2
- #if AXIS_IS_TMC(E2)
- tmc_stepper_current.E2 = stepperE2.getMilliamps();
- #endif
- #if MAX_EXTRUDERS > 3
- #if AXIS_IS_TMC(E3)
- tmc_stepper_current.E3 = stepperE3.getMilliamps();
- #endif
- #if MAX_EXTRUDERS > 4
- #if AXIS_IS_TMC(E4)
- tmc_stepper_current.E4 = stepperE4.getMilliamps();
- #endif
- #if MAX_EXTRUDERS > 5
- #if AXIS_IS_TMC(E5)
- tmc_stepper_current.E5 = stepperE5.getMilliamps();
- #endif
- #endif // MAX_EXTRUDERS > 5
- #endif // MAX_EXTRUDERS > 4
- #endif // MAX_EXTRUDERS > 3
- #endif // MAX_EXTRUDERS > 2
- #endif // MAX_EXTRUDERS > 1
- #endif // MAX_EXTRUDERS
- #endif
- EEPROM_WRITE(tmc_stepper_current);
-
- //
- // Save TMC Hybrid Threshold, and placeholder values
- //
-
- _FIELD_TEST(tmc_hybrid_threshold);
-
- #if ENABLED(HYBRID_THRESHOLD)
- tmc_hybrid_threshold_t tmc_hybrid_threshold = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
- #if AXIS_HAS_STEALTHCHOP(X)
- tmc_hybrid_threshold.X = TMC_GET_PWMTHRS(X, X);
- #endif
- #if AXIS_HAS_STEALTHCHOP(Y)
- tmc_hybrid_threshold.Y = TMC_GET_PWMTHRS(Y, Y);
- #endif
- #if AXIS_HAS_STEALTHCHOP(Z)
- tmc_hybrid_threshold.Z = TMC_GET_PWMTHRS(Z, Z);
- #endif
- #if AXIS_HAS_STEALTHCHOP(X2)
- tmc_hybrid_threshold.X2 = TMC_GET_PWMTHRS(X, X2);
- #endif
- #if AXIS_HAS_STEALTHCHOP(Y2)
- tmc_hybrid_threshold.Y2 = TMC_GET_PWMTHRS(Y, Y2);
- #endif
- #if AXIS_HAS_STEALTHCHOP(Z2)
- tmc_hybrid_threshold.Z2 = TMC_GET_PWMTHRS(Z, Z2);
- #endif
- #if AXIS_HAS_STEALTHCHOP(Z3)
- tmc_hybrid_threshold.Z3 = TMC_GET_PWMTHRS(Z, Z3);
- #endif
- #if MAX_EXTRUDERS
- #if AXIS_HAS_STEALTHCHOP(E0)
- tmc_hybrid_threshold.E0 = TMC_GET_PWMTHRS(E, E0);
+ #if AXIS_IS_TMC(Y)
+ tmc_stepper_current.Y = stepperY.getMilliamps();
#endif
- #if MAX_EXTRUDERS > 1
- #if AXIS_HAS_STEALTHCHOP(E1)
- tmc_hybrid_threshold.E1 = TMC_GET_PWMTHRS(E, E1);
+ #if AXIS_IS_TMC(Z)
+ tmc_stepper_current.Z = stepperZ.getMilliamps();
+ #endif
+ #if AXIS_IS_TMC(X2)
+ tmc_stepper_current.X2 = stepperX2.getMilliamps();
+ #endif
+ #if AXIS_IS_TMC(Y2)
+ tmc_stepper_current.Y2 = stepperY2.getMilliamps();
+ #endif
+ #if AXIS_IS_TMC(Z2)
+ tmc_stepper_current.Z2 = stepperZ2.getMilliamps();
+ #endif
+ #if AXIS_IS_TMC(Z3)
+ tmc_stepper_current.Z3 = stepperZ3.getMilliamps();
+ #endif
+ #if MAX_EXTRUDERS
+ #if AXIS_IS_TMC(E0)
+ tmc_stepper_current.E0 = stepperE0.getMilliamps();
#endif
- #if MAX_EXTRUDERS > 2
- #if AXIS_HAS_STEALTHCHOP(E2)
- tmc_hybrid_threshold.E2 = TMC_GET_PWMTHRS(E, E2);
+ #if MAX_EXTRUDERS > 1
+ #if AXIS_IS_TMC(E1)
+ tmc_stepper_current.E1 = stepperE1.getMilliamps();
#endif
- #if MAX_EXTRUDERS > 3
- #if AXIS_HAS_STEALTHCHOP(E3)
- tmc_hybrid_threshold.E3 = TMC_GET_PWMTHRS(E, E3);
+ #if MAX_EXTRUDERS > 2
+ #if AXIS_IS_TMC(E2)
+ tmc_stepper_current.E2 = stepperE2.getMilliamps();
#endif
- #if MAX_EXTRUDERS > 4
- #if AXIS_HAS_STEALTHCHOP(E4)
- tmc_hybrid_threshold.E4 = TMC_GET_PWMTHRS(E, E4);
+ #if MAX_EXTRUDERS > 3
+ #if AXIS_IS_TMC(E3)
+ tmc_stepper_current.E3 = stepperE3.getMilliamps();
#endif
- #if MAX_EXTRUDERS > 5
- #if AXIS_HAS_STEALTHCHOP(E5)
- tmc_hybrid_threshold.E5 = TMC_GET_PWMTHRS(E, E5);
+ #if MAX_EXTRUDERS > 4
+ #if AXIS_IS_TMC(E4)
+ tmc_stepper_current.E4 = stepperE4.getMilliamps();
#endif
- #endif // MAX_EXTRUDERS > 5
- #endif // MAX_EXTRUDERS > 4
- #endif // MAX_EXTRUDERS > 3
- #endif // MAX_EXTRUDERS > 2
- #endif // MAX_EXTRUDERS > 1
- #endif // MAX_EXTRUDERS
- #else
- const tmc_hybrid_threshold_t tmc_hybrid_threshold = {
- .X = 100, .Y = 100, .Z = 3,
- .X2 = 100, .Y2 = 100, .Z2 = 3, .Z3 = 3,
- .E0 = 30, .E1 = 30, .E2 = 30,
- .E3 = 30, .E4 = 30, .E5 = 30
- };
- #endif
- EEPROM_WRITE(tmc_hybrid_threshold);
+ #if MAX_EXTRUDERS > 5
+ #if AXIS_IS_TMC(E5)
+ tmc_stepper_current.E5 = stepperE5.getMilliamps();
+ #endif
+ #endif // MAX_EXTRUDERS > 5
+ #endif // MAX_EXTRUDERS > 4
+ #endif // MAX_EXTRUDERS > 3
+ #endif // MAX_EXTRUDERS > 2
+ #endif // MAX_EXTRUDERS > 1
+ #endif // MAX_EXTRUDERS
+ #endif
+ EEPROM_WRITE(tmc_stepper_current);
+ }
+
+ //
+ // TMC Hybrid Threshold, and placeholder values
+ //
+ {
+ _FIELD_TEST(tmc_hybrid_threshold);
+
+ #if ENABLED(HYBRID_THRESHOLD)
+ tmc_hybrid_threshold_t tmc_hybrid_threshold = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+ #if AXIS_HAS_STEALTHCHOP(X)
+ tmc_hybrid_threshold.X = TMC_GET_PWMTHRS(X, X);
+ #endif
+ #if AXIS_HAS_STEALTHCHOP(Y)
+ tmc_hybrid_threshold.Y = TMC_GET_PWMTHRS(Y, Y);
+ #endif
+ #if AXIS_HAS_STEALTHCHOP(Z)
+ tmc_hybrid_threshold.Z = TMC_GET_PWMTHRS(Z, Z);
+ #endif
+ #if AXIS_HAS_STEALTHCHOP(X2)
+ tmc_hybrid_threshold.X2 = TMC_GET_PWMTHRS(X, X2);
+ #endif
+ #if AXIS_HAS_STEALTHCHOP(Y2)
+ tmc_hybrid_threshold.Y2 = TMC_GET_PWMTHRS(Y, Y2);
+ #endif
+ #if AXIS_HAS_STEALTHCHOP(Z2)
+ tmc_hybrid_threshold.Z2 = TMC_GET_PWMTHRS(Z, Z2);
+ #endif
+ #if AXIS_HAS_STEALTHCHOP(Z3)
+ tmc_hybrid_threshold.Z3 = TMC_GET_PWMTHRS(Z, Z3);
+ #endif
+ #if MAX_EXTRUDERS
+ #if AXIS_HAS_STEALTHCHOP(E0)
+ tmc_hybrid_threshold.E0 = TMC_GET_PWMTHRS(E, E0);
+ #endif
+ #if MAX_EXTRUDERS > 1
+ #if AXIS_HAS_STEALTHCHOP(E1)
+ tmc_hybrid_threshold.E1 = TMC_GET_PWMTHRS(E, E1);
+ #endif
+ #if MAX_EXTRUDERS > 2
+ #if AXIS_HAS_STEALTHCHOP(E2)
+ tmc_hybrid_threshold.E2 = TMC_GET_PWMTHRS(E, E2);
+ #endif
+ #if MAX_EXTRUDERS > 3
+ #if AXIS_HAS_STEALTHCHOP(E3)
+ tmc_hybrid_threshold.E3 = TMC_GET_PWMTHRS(E, E3);
+ #endif
+ #if MAX_EXTRUDERS > 4
+ #if AXIS_HAS_STEALTHCHOP(E4)
+ tmc_hybrid_threshold.E4 = TMC_GET_PWMTHRS(E, E4);
+ #endif
+ #if MAX_EXTRUDERS > 5
+ #if AXIS_HAS_STEALTHCHOP(E5)
+ tmc_hybrid_threshold.E5 = TMC_GET_PWMTHRS(E, E5);
+ #endif
+ #endif // MAX_EXTRUDERS > 5
+ #endif // MAX_EXTRUDERS > 4
+ #endif // MAX_EXTRUDERS > 3
+ #endif // MAX_EXTRUDERS > 2
+ #endif // MAX_EXTRUDERS > 1
+ #endif // MAX_EXTRUDERS
+ #else
+ const tmc_hybrid_threshold_t tmc_hybrid_threshold = {
+ .X = 100, .Y = 100, .Z = 3,
+ .X2 = 100, .Y2 = 100, .Z2 = 3, .Z3 = 3,
+ .E0 = 30, .E1 = 30, .E2 = 30,
+ .E3 = 30, .E4 = 30, .E5 = 30
+ };
+ #endif
+ EEPROM_WRITE(tmc_hybrid_threshold);
+ }
//
// TMC StallGuard threshold
//
-
- tmc_sgt_t tmc_sgt = { 0, 0, 0 };
-
- #if USE_SENSORLESS
- #if X_SENSORLESS
- tmc_sgt.X = stepperX.sgt();
+ {
+ tmc_sgt_t tmc_sgt = { 0, 0, 0 };
+ #if USE_SENSORLESS
+ #if X_SENSORLESS
+ tmc_sgt.X = stepperX.sgt();
+ #endif
+ #if Y_SENSORLESS
+ tmc_sgt.Y = stepperY.sgt();
+ #endif
+ #if Z_SENSORLESS
+ tmc_sgt.Z = stepperZ.sgt();
+ #endif
#endif
- #if Y_SENSORLESS
- tmc_sgt.Y = stepperY.sgt();
- #endif
- #if Z_SENSORLESS
- tmc_sgt.Z = stepperZ.sgt();
- #endif
- #endif
- EEPROM_WRITE(tmc_sgt);
+ EEPROM_WRITE(tmc_sgt);
+ }
//
// Linear Advance
//
+ {
+ _FIELD_TEST(planner_extruder_advance_K);
- _FIELD_TEST(planner_extruder_advance_K);
-
- #if ENABLED(LIN_ADVANCE)
- LOOP_L_N(i, EXTRUDERS) EEPROM_WRITE(planner.extruder_advance_K[i]);
- #else
- dummy = 0;
- LOOP_L_N(i, EXTRUDERS) EEPROM_WRITE(dummy);
- #endif
-
- _FIELD_TEST(motor_current_setting);
+ #if ENABLED(LIN_ADVANCE)
+ EEPROM_WRITE(planner.extruder_advance_K);
+ #else
+ dummy = 0;
+ for (uint8_t q = EXTRUDERS; q--;) EEPROM_WRITE(dummy);
+ #endif
+ }
//
// Motor Current PWM
//
+ {
+ _FIELD_TEST(motor_current_setting);
- #if HAS_MOTOR_CURRENT_PWM
- for (uint8_t q = XYZ; q--;) EEPROM_WRITE(stepper.motor_current_setting[q]);
- #else
- const uint32_t dummyui32[XYZ] = { 0 };
- EEPROM_WRITE(dummyui32);
- #endif
+ #if HAS_MOTOR_CURRENT_PWM
+ EEPROM_WRITE(stepper.motor_current_setting);
+ #else
+ const uint32_t dummyui32[XYZ] = { 0 };
+ EEPROM_WRITE(dummyui32);
+ #endif
+ }
//
// CNC Coordinate Systems
@@ -924,52 +917,36 @@ void MarlinSettings::postprocess() {
_FIELD_TEST(coordinate_system);
#if ENABLED(CNC_COORDINATE_SYSTEMS)
- EEPROM_WRITE(gcode.coordinate_system); // 27 floats
+ EEPROM_WRITE(gcode.coordinate_system);
#else
- dummy = 0;
- for (uint8_t q = MAX_COORDINATE_SYSTEMS * XYZ; q--;) EEPROM_WRITE(dummy);
+ const float coordinate_system[MAX_COORDINATE_SYSTEMS][XYZ] = { { 0 } };
+ EEPROM_WRITE(coordinate_system);
#endif
//
// Skew correction factors
//
-
- _FIELD_TEST(planner_xy_skew_factor);
-
- #if ENABLED(SKEW_CORRECTION)
- EEPROM_WRITE(planner.xy_skew_factor);
- EEPROM_WRITE(planner.xz_skew_factor);
- EEPROM_WRITE(planner.yz_skew_factor);
- #else
- dummy = 0;
- for (uint8_t q = 3; q--;) EEPROM_WRITE(dummy);
- #endif
+ _FIELD_TEST(planner_skew_factor);
+ EEPROM_WRITE(planner.skew_factor);
//
// Advanced Pause filament load & unload lengths
//
-
- _FIELD_TEST(filament_change_unload_length);
-
- #if ENABLED(ADVANCED_PAUSE_FEATURE)
- for (uint8_t q = 0; q < COUNT(filament_change_unload_length); q++) {
- EEPROM_WRITE(filament_change_unload_length[q]);
- EEPROM_WRITE(filament_change_load_length[q]);
- }
- #else
- dummy = 0;
- for (uint8_t q = EXTRUDERS * 2; q--;) EEPROM_WRITE(dummy);
- #endif
+ {
+ #if DISABLED(ADVANCED_PAUSE_FEATURE)
+ const fil_change_settings_t fc_settings[EXTRUDERS] = { { 0 } };
+ #endif
+ _FIELD_TEST(fc_settings);
+ EEPROM_WRITE(fc_settings);
+ }
//
// SINGLENOZZLE
//
#if ENABLED(SINGLENOZZLE)
- _FIELD_TEST(singlenozzle_swap_length);
- EEPROM_WRITE(singlenozzle_swap_length);
- EEPROM_WRITE(singlenozzle_prime_speed);
- EEPROM_WRITE(singlenozzle_retract_speed);
+ _FIELD_TEST(sn_settings);
+ EEPROM_WRITE(sn_settings);
#endif
//
@@ -1061,22 +1038,23 @@ void MarlinSettings::postprocess() {
uint32_t tmp1[XYZ + esteppers];
EEPROM_READ(tmp1); // max_acceleration_mm_per_s2
- EEPROM_READ(planner.min_segment_time_us);
+ EEPROM_READ(planner.settings.min_segment_time_us);
float tmp2[XYZ + esteppers], tmp3[XYZ + esteppers];
EEPROM_READ(tmp2); // axis_steps_per_mm
EEPROM_READ(tmp3); // max_feedrate_mm_s
if (!validating) LOOP_XYZE_N(i) {
- planner.max_acceleration_mm_per_s2[i] = i < XYZ + esteppers ? tmp1[i] : def1[i < COUNT(def1) ? i : COUNT(def1) - 1];
- planner.axis_steps_per_mm[i] = i < XYZ + esteppers ? tmp2[i] : def2[i < COUNT(def2) ? i : COUNT(def2) - 1];
- planner.max_feedrate_mm_s[i] = i < XYZ + esteppers ? tmp3[i] : def3[i < COUNT(def3) ? i : COUNT(def3) - 1];
+ const bool in = (i < esteppers + XYZ);
+ planner.settings.max_acceleration_mm_per_s2[i] = in ? tmp1[i] : def1[ALIM(i, def1)];
+ planner.settings.axis_steps_per_mm[i] = in ? tmp2[i] : def2[ALIM(i, def2)];
+ planner.settings.max_feedrate_mm_s[i] = in ? tmp3[i] : def3[ALIM(i, def3)];
}
- EEPROM_READ(planner.acceleration);
- EEPROM_READ(planner.retract_acceleration);
- EEPROM_READ(planner.travel_acceleration);
- EEPROM_READ(planner.min_feedrate_mm_s);
- EEPROM_READ(planner.min_travel_feedrate_mm_s);
+ EEPROM_READ(planner.settings.acceleration);
+ EEPROM_READ(planner.settings.retract_acceleration);
+ EEPROM_READ(planner.settings.travel_acceleration);
+ EEPROM_READ(planner.settings.min_feedrate_mm_s);
+ EEPROM_READ(planner.settings.min_travel_feedrate_mm_s);
#if HAS_CLASSIC_JERK
EEPROM_READ(planner.max_jerk);
@@ -1273,349 +1251,327 @@ void MarlinSettings::postprocess() {
//
// Hotend PID
//
-
- #if ENABLED(PIDTEMP)
- for (uint8_t e = 0; e < HOTENDS; e++) {
- EEPROM_READ(dummy); // Kp
- if (dummy != DUMMY_PID_VALUE) {
- // do not need to scale PID values as the values in EEPROM are already scaled
- if (!validating) PID_PARAM(Kp, e) = dummy;
- EEPROM_READ(PID_PARAM(Ki, e));
- EEPROM_READ(PID_PARAM(Kd, e));
- #if ENABLED(PID_EXTRUSION_SCALING)
- EEPROM_READ(PID_PARAM(Kc, e));
- #else
- EEPROM_READ(dummy);
- #endif
- }
- else
- for (uint8_t q=3; q--;) EEPROM_READ(dummy); // Ki, Kd, Kc
+ {
+ HOTEND_LOOP() {
+ PIDC_t pidc;
+ EEPROM_READ(pidc);
+ #if ENABLED(PIDTEMP)
+ if (!validating && pidc.Kp != DUMMY_PID_VALUE) {
+ // No need to scale PID values since EEPROM values are scaled
+ PID_PARAM(Kp, e) = pidc.Kp;
+ PID_PARAM(Ki, e) = pidc.Ki;
+ PID_PARAM(Kd, e) = pidc.Kd;
+ #if ENABLED(PID_EXTRUSION_SCALING)
+ PID_PARAM(Kc, e) = pidc.Kc;
+ #endif
+ }
+ #endif
}
- #else // !PIDTEMP
- // 4 x 4 = 16 slots for PID parameters
- for (uint8_t q = HOTENDS * 4; q--;) EEPROM_READ(dummy); // Kp, Ki, Kd, Kc
- #endif // !PIDTEMP
+ }
//
// PID Extrusion Scaling
//
-
- _FIELD_TEST(lpq_len);
-
- #if DISABLED(PID_EXTRUSION_SCALING)
- int16_t LPQ_LEN;
- #endif
- EEPROM_READ(LPQ_LEN);
+ {
+ _FIELD_TEST(lpq_len);
+ #if ENABLED(PID_EXTRUSION_SCALING)
+ EEPROM_READ(thermalManager.lpq_len);
+ #else
+ int16_t lpq_len;
+ EEPROM_READ(lpq_len);
+ #endif
+ }
//
// Heated Bed PID
//
-
- #if ENABLED(PIDTEMPBED)
- EEPROM_READ(dummy); // bedKp
- if (dummy != DUMMY_PID_VALUE) {
- if (!validating) thermalManager.bedKp = dummy;
- EEPROM_READ(thermalManager.bedKi);
- EEPROM_READ(thermalManager.bedKd);
- }
- #else
- for (uint8_t q=3; q--;) EEPROM_READ(dummy); // bedKp, bedKi, bedKd
- #endif
+ {
+ PID_t pid;
+ EEPROM_READ(pid);
+ #if ENABLED(PIDTEMPBED)
+ if (!validating && pid.Kp != DUMMY_PID_VALUE)
+ memcpy(&thermalManager.bed_pid, &pid, sizeof(pid));
+ #endif
+ }
//
// LCD Contrast
//
-
- _FIELD_TEST(lcd_contrast);
-
- #if !HAS_LCD_CONTRAST
- int16_t lcd_contrast;
- #endif
- EEPROM_READ(lcd_contrast);
+ {
+ _FIELD_TEST(lcd_contrast);
+ #if !HAS_LCD_CONTRAST
+ int16_t lcd_contrast;
+ #endif
+ EEPROM_READ(lcd_contrast);
+ }
//
// Firmware Retraction
//
+ {
+ _FIELD_TEST(fwretract_settings);
- #if ENABLED(FWRETRACT)
- #if DISABLED(FWRETRACT_AUTORETRACT)
- EEPROM_READ(dummyb);
- #else
- EEPROM_READ(fwretract.autoretract_enabled);
+ #if ENABLED(FWRETRACT)
+ EEPROM_READ(fwretract.settings);
#endif
- EEPROM_READ(fwretract.retract_length);
- EEPROM_READ(fwretract.retract_feedrate_mm_s);
- EEPROM_READ(fwretract.retract_zlift);
- EEPROM_READ(fwretract.retract_recover_length);
- EEPROM_READ(fwretract.retract_recover_feedrate_mm_s);
- EEPROM_READ(fwretract.swap_retract_length);
- EEPROM_READ(fwretract.swap_retract_recover_length);
- EEPROM_READ(fwretract.swap_retract_recover_feedrate_mm_s);
- #else
- EEPROM_READ(dummyb);
- for (uint8_t q=8; q--;) EEPROM_READ(dummy);
- #endif
+ #if ENABLED(FWRETRACT) && ENABLED(FWRETRACT_AUTORETRACT)
+ EEPROM_READ(fwretract.autoretract_enabled);
+ #else
+ bool autoretract_enabled;
+ EEPROM_READ(autoretract_enabled);
+ #endif
+ }
//
// Volumetric & Filament Size
//
+ {
+ struct {
+ bool volumetric_enabled;
+ float filament_size[EXTRUDERS];
+ } storage;
- _FIELD_TEST(parser_volumetric_enabled);
+ _FIELD_TEST(parser_volumetric_enabled);
+ EEPROM_READ(storage);
- #if DISABLED(NO_VOLUMETRICS)
-
- EEPROM_READ(parser.volumetric_enabled);
-
- for (uint8_t q = 0; q < COUNT(planner.filament_size); q++) {
- EEPROM_READ(dummy);
- if (!validating) planner.filament_size[q] = dummy;
- }
-
- #else
-
- EEPROM_READ(dummyb);
- for (uint8_t q=EXTRUDERS; q--;) EEPROM_READ(dummy);
-
- #endif
-
- if (!validating) reset_stepper_drivers();
+ #if DISABLED(NO_VOLUMETRICS)
+ if (!validating) {
+ parser.volumetric_enabled = storage.volumetric_enabled;
+ COPY(planner.filament_size, storage.filament_size);
+ }
+ #endif
+ }
//
// TMC Stepper Settings
//
- _FIELD_TEST(tmc_stepper_current);
+ if (!validating) reset_stepper_drivers();
- #if HAS_TRINAMIC
+ // TMC Stepper Current
+ {
+ _FIELD_TEST(tmc_stepper_current);
- #define SET_CURR(Q) stepper##Q.rms_current(currents.Q ? currents.Q : Q##_CURRENT)
tmc_stepper_current_t currents;
EEPROM_READ(currents);
- if (!validating) {
- #if AXIS_IS_TMC(X)
- SET_CURR(X);
- #endif
- #if AXIS_IS_TMC(Y)
- SET_CURR(Y);
- #endif
- #if AXIS_IS_TMC(Z)
- SET_CURR(Z);
- #endif
- #if AXIS_IS_TMC(X2)
- SET_CURR(X2);
- #endif
- #if AXIS_IS_TMC(Y2)
- SET_CURR(Y2);
- #endif
- #if AXIS_IS_TMC(Z2)
- SET_CURR(Z2);
- #endif
- #if AXIS_IS_TMC(Z3)
- SET_CURR(Z3);
- #endif
- #if AXIS_IS_TMC(E0)
- SET_CURR(E0);
- #endif
- #if AXIS_IS_TMC(E1)
- SET_CURR(E1);
- #endif
- #if AXIS_IS_TMC(E2)
- SET_CURR(E2);
- #endif
- #if AXIS_IS_TMC(E3)
- SET_CURR(E3);
- #endif
- #if AXIS_IS_TMC(E4)
- SET_CURR(E4);
- #endif
- #if AXIS_IS_TMC(E5)
- SET_CURR(E5);
- #endif
- }
- #else
- uint16_t val;
- for (uint8_t q=TMC_AXES; q--;) EEPROM_READ(val);
- #endif
- _FIELD_TEST(tmc_hybrid_threshold);
+ #if HAS_TRINAMIC
- #if ENABLED(HYBRID_THRESHOLD)
- #define TMC_SET_PWMTHRS(A,Q) tmc_set_pwmthrs(stepper##Q, tmc_hybrid_threshold.Q, planner.axis_steps_per_mm[_AXIS(A)])
+ #define SET_CURR(Q) stepper##Q.rms_current(currents.Q ? currents.Q : Q##_CURRENT)
+ if (!validating) {
+ #if AXIS_IS_TMC(X)
+ SET_CURR(X);
+ #endif
+ #if AXIS_IS_TMC(Y)
+ SET_CURR(Y);
+ #endif
+ #if AXIS_IS_TMC(Z)
+ SET_CURR(Z);
+ #endif
+ #if AXIS_IS_TMC(X2)
+ SET_CURR(X2);
+ #endif
+ #if AXIS_IS_TMC(Y2)
+ SET_CURR(Y2);
+ #endif
+ #if AXIS_IS_TMC(Z2)
+ SET_CURR(Z2);
+ #endif
+ #if AXIS_IS_TMC(Z3)
+ SET_CURR(Z3);
+ #endif
+ #if AXIS_IS_TMC(E0)
+ SET_CURR(E0);
+ #endif
+ #if AXIS_IS_TMC(E1)
+ SET_CURR(E1);
+ #endif
+ #if AXIS_IS_TMC(E2)
+ SET_CURR(E2);
+ #endif
+ #if AXIS_IS_TMC(E3)
+ SET_CURR(E3);
+ #endif
+ #if AXIS_IS_TMC(E4)
+ SET_CURR(E4);
+ #endif
+ #if AXIS_IS_TMC(E5)
+ SET_CURR(E5);
+ #endif
+ }
+ #endif
+ }
+
+ // TMC Hybrid Threshold
+ {
tmc_hybrid_threshold_t tmc_hybrid_threshold;
+ _FIELD_TEST(tmc_hybrid_threshold);
EEPROM_READ(tmc_hybrid_threshold);
- if (!validating) {
- #if AXIS_HAS_STEALTHCHOP(X)
- TMC_SET_PWMTHRS(X, X);
- #endif
- #if AXIS_HAS_STEALTHCHOP(Y)
- TMC_SET_PWMTHRS(Y, Y);
- #endif
- #if AXIS_HAS_STEALTHCHOP(Z)
- TMC_SET_PWMTHRS(Z, Z);
- #endif
- #if AXIS_HAS_STEALTHCHOP(X2)
- TMC_SET_PWMTHRS(X, X2);
- #endif
- #if AXIS_HAS_STEALTHCHOP(Y2)
- TMC_SET_PWMTHRS(Y, Y2);
- #endif
- #if AXIS_HAS_STEALTHCHOP(Z2)
- TMC_SET_PWMTHRS(Z, Z2);
- #endif
- #if AXIS_HAS_STEALTHCHOP(Z3)
- TMC_SET_PWMTHRS(Z, Z3);
- #endif
- #if AXIS_HAS_STEALTHCHOP(E0)
- TMC_SET_PWMTHRS(E, E0);
- #endif
- #if AXIS_HAS_STEALTHCHOP(E1)
- TMC_SET_PWMTHRS(E, E1);
- #endif
- #if AXIS_HAS_STEALTHCHOP(E2)
- TMC_SET_PWMTHRS(E, E2);
- #endif
- #if AXIS_HAS_STEALTHCHOP(E3)
- TMC_SET_PWMTHRS(E, E3);
- #endif
- #if AXIS_HAS_STEALTHCHOP(E4)
- TMC_SET_PWMTHRS(E, E4);
- #endif
- #if AXIS_HAS_STEALTHCHOP(E5)
- TMC_SET_PWMTHRS(E, E5);
- #endif
- }
- #else
- uint32_t thrs_val;
- for (uint8_t q=TMC_AXES; q--;) EEPROM_READ(thrs_val);
- #endif
- /**
- * TMC StallGuard threshold.
- * X and X2 use the same value
- * Y and Y2 use the same value
- * Z, Z2 and Z3 use the same value
- */
+ #if ENABLED(HYBRID_THRESHOLD)
+ #define TMC_SET_PWMTHRS(A,Q) tmc_set_pwmthrs(stepper##Q, tmc_hybrid_threshold.Q, planner.settings.axis_steps_per_mm[_AXIS(A)])
+ if (!validating) {
+ #if AXIS_HAS_STEALTHCHOP(X)
+ TMC_SET_PWMTHRS(X, X);
+ #endif
+ #if AXIS_HAS_STEALTHCHOP(Y)
+ TMC_SET_PWMTHRS(Y, Y);
+ #endif
+ #if AXIS_HAS_STEALTHCHOP(Z)
+ TMC_SET_PWMTHRS(Z, Z);
+ #endif
+ #if AXIS_HAS_STEALTHCHOP(X2)
+ TMC_SET_PWMTHRS(X, X2);
+ #endif
+ #if AXIS_HAS_STEALTHCHOP(Y2)
+ TMC_SET_PWMTHRS(Y, Y2);
+ #endif
+ #if AXIS_HAS_STEALTHCHOP(Z2)
+ TMC_SET_PWMTHRS(Z, Z2);
+ #endif
+ #if AXIS_HAS_STEALTHCHOP(Z3)
+ TMC_SET_PWMTHRS(Z, Z3);
+ #endif
+ #if AXIS_HAS_STEALTHCHOP(E0)
+ TMC_SET_PWMTHRS(E, E0);
+ #endif
+ #if AXIS_HAS_STEALTHCHOP(E1)
+ TMC_SET_PWMTHRS(E, E1);
+ #endif
+ #if AXIS_HAS_STEALTHCHOP(E2)
+ TMC_SET_PWMTHRS(E, E2);
+ #endif
+ #if AXIS_HAS_STEALTHCHOP(E3)
+ TMC_SET_PWMTHRS(E, E3);
+ #endif
+ #if AXIS_HAS_STEALTHCHOP(E4)
+ TMC_SET_PWMTHRS(E, E4);
+ #endif
+ #if AXIS_HAS_STEALTHCHOP(E5)
+ TMC_SET_PWMTHRS(E, E5);
+ #endif
+ }
+ #endif
+ }
- _FIELD_TEST(tmc_sgt);
-
- tmc_sgt_t tmc_sgt;
- EEPROM_READ(tmc_sgt);
- #if USE_SENSORLESS
- if (!validating) {
- #ifdef X_STALL_SENSITIVITY
- #if AXIS_HAS_STALLGUARD(X)
- stepperX.sgt(tmc_sgt.X);
+ //
+ // TMC StallGuard threshold.
+ // X and X2 use the same value
+ // Y and Y2 use the same value
+ // Z, Z2 and Z3 use the same value
+ //
+ {
+ tmc_sgt_t tmc_sgt;
+ _FIELD_TEST(tmc_sgt);
+ EEPROM_READ(tmc_sgt);
+ #if USE_SENSORLESS
+ if (!validating) {
+ #ifdef X_STALL_SENSITIVITY
+ #if AXIS_HAS_STALLGUARD(X)
+ stepperX.sgt(tmc_sgt.X);
+ #endif
+ #if AXIS_HAS_STALLGUARD(X2)
+ stepperX2.sgt(tmc_sgt.X);
+ #endif
#endif
- #if AXIS_HAS_STALLGUARD(X2)
- stepperX2.sgt(tmc_sgt.X);
+ #ifdef Y_STALL_SENSITIVITY
+ #if AXIS_HAS_STALLGUARD(Y)
+ stepperY.sgt(tmc_sgt.Y);
+ #endif
+ #if AXIS_HAS_STALLGUARD(Y2)
+ stepperY2.sgt(tmc_sgt.Y);
+ #endif
#endif
- #endif
- #ifdef Y_STALL_SENSITIVITY
- #if AXIS_HAS_STALLGUARD(Y)
- stepperY.sgt(tmc_sgt.Y);
+ #ifdef Z_STALL_SENSITIVITY
+ #if AXIS_HAS_STALLGUARD(Z)
+ stepperZ.sgt(tmc_sgt.Z);
+ #endif
+ #if AXIS_HAS_STALLGUARD(Z2)
+ stepperZ2.sgt(tmc_sgt.Z);
+ #endif
+ #if AXIS_HAS_STALLGUARD(Z3)
+ stepperZ3.sgt(tmc_sgt.Z);
+ #endif
#endif
- #if AXIS_HAS_STALLGUARD(Y2)
- stepperY2.sgt(tmc_sgt.Y);
- #endif
- #endif
- #ifdef Z_STALL_SENSITIVITY
- #if AXIS_HAS_STALLGUARD(Z)
- stepperZ.sgt(tmc_sgt.Z);
- #endif
- #if AXIS_HAS_STALLGUARD(Z2)
- stepperZ2.sgt(tmc_sgt.Z);
- #endif
- #if AXIS_HAS_STALLGUARD(Z3)
- stepperZ3.sgt(tmc_sgt.Z);
- #endif
- #endif
- }
- #endif
+ }
+ #endif
+ }
//
// Linear Advance
//
- _FIELD_TEST(planner_extruder_advance_K);
-
- LOOP_L_N(i, EXTRUDERS) {
+ {
+ float extruder_advance_K[EXTRUDERS];
+ _FIELD_TEST(planner_extruder_advance_K);
+ EEPROM_READ(extruder_advance_K);
#if ENABLED(LIN_ADVANCE)
- EEPROM_READ(planner.extruder_advance_K[i]);
- #else
- EEPROM_READ(dummy);
+ if (!validating)
+ COPY(planner.extruder_advance_K, extruder_advance_K);
#endif
}
//
// Motor Current PWM
//
-
- _FIELD_TEST(motor_current_setting);
-
- #if HAS_MOTOR_CURRENT_PWM
- for (uint8_t q = XYZ; q--;) EEPROM_READ(stepper.motor_current_setting[q]);
- #else
- uint32_t dummyui32[XYZ];
- EEPROM_READ(dummyui32);
- #endif
+ {
+ uint32_t motor_current_setting[3];
+ _FIELD_TEST(motor_current_setting);
+ EEPROM_READ(motor_current_setting);
+ #if HAS_MOTOR_CURRENT_PWM
+ if (!validating)
+ COPY(stepper.motor_current_setting, motor_current_setting);
+ #endif
+ }
//
// CNC Coordinate System
//
-
- _FIELD_TEST(coordinate_system);
-
- #if ENABLED(CNC_COORDINATE_SYSTEMS)
- if (!validating) (void)gcode.select_coordinate_system(-1); // Go back to machine space
- EEPROM_READ(gcode.coordinate_system); // 27 floats
- #else
- for (uint8_t q = MAX_COORDINATE_SYSTEMS * XYZ; q--;) EEPROM_READ(dummy);
- #endif
+ {
+ _FIELD_TEST(coordinate_system);
+ #if ENABLED(CNC_COORDINATE_SYSTEMS)
+ if (!validating) (void)gcode.select_coordinate_system(-1); // Go back to machine space
+ EEPROM_READ(gcode.coordinate_system);
+ #else
+ float coordinate_system[MAX_COORDINATE_SYSTEMS][XYZ];
+ EEPROM_READ(coordinate_system);
+ #endif
+ }
//
// Skew correction factors
//
-
- _FIELD_TEST(planner_xy_skew_factor);
-
- #if ENABLED(SKEW_CORRECTION_GCODE)
- EEPROM_READ(planner.xy_skew_factor);
- #if ENABLED(SKEW_CORRECTION_FOR_Z)
- EEPROM_READ(planner.xz_skew_factor);
- EEPROM_READ(planner.yz_skew_factor);
- #else
- EEPROM_READ(dummy);
- EEPROM_READ(dummy);
+ {
+ skew_factor_t skew_factor;
+ _FIELD_TEST(planner_skew_factor);
+ EEPROM_READ(skew_factor);
+ #if ENABLED(SKEW_CORRECTION_GCODE)
+ if (!validating) {
+ planner.skew_factor.xy = skew_factor.xy;
+ #if ENABLED(SKEW_CORRECTION_FOR_Z)
+ planner.skew_factor.xz = skew_factor.xz;
+ planner.skew_factor.yz = skew_factor.yz;
+ #endif
+ }
#endif
- #else
- for (uint8_t q = 3; q--;) EEPROM_READ(dummy);
- #endif
+ }
//
// Advanced Pause filament load & unload lengths
//
-
- _FIELD_TEST(filament_change_unload_length);
-
- #if ENABLED(ADVANCED_PAUSE_FEATURE)
- for (uint8_t q = 0; q < COUNT(filament_change_unload_length); q++) {
- EEPROM_READ(dummy);
- if (!validating && q < COUNT(filament_change_unload_length)) filament_change_unload_length[q] = dummy;
- EEPROM_READ(dummy);
- if (!validating && q < COUNT(filament_change_load_length)) filament_change_load_length[q] = dummy;
- }
- #else
- for (uint8_t q = EXTRUDERS * 2; q--;) EEPROM_READ(dummy);
- #endif
+ {
+ #if DISABLED(ADVANCED_PAUSE_FEATURE)
+ fil_change_settings_t fc_settings[EXTRUDERS];
+ #endif
+ _FIELD_TEST(fc_settings);
+ EEPROM_READ(fc_settings);
+ }
//
// SINGLENOZZLE toolchange values
//
-
#if ENABLED(SINGLENOZZLE)
- _FIELD_TEST(singlenozzle_swap_length);
- EEPROM_READ(singlenozzle_swap_length);
- EEPROM_READ(singlenozzle_prime_speed);
- EEPROM_READ(singlenozzle_retract_speed);
+ _FIELD_TEST(sn_settings);
+ EEPROM_READ(sn_settings);
#endif
eeprom_error = size_error(eeprom_index - (EEPROM_OFFSET));
@@ -1835,21 +1791,17 @@ void MarlinSettings::reset(PORTARG_SOLO) {
static const float tmp1[] PROGMEM = DEFAULT_AXIS_STEPS_PER_UNIT, tmp2[] PROGMEM = DEFAULT_MAX_FEEDRATE;
static const uint32_t tmp3[] PROGMEM = DEFAULT_MAX_ACCELERATION;
LOOP_XYZE_N(i) {
- planner.axis_steps_per_mm[i] = pgm_read_float(&tmp1[i < COUNT(tmp1) ? i : COUNT(tmp1) - 1]);
- planner.max_feedrate_mm_s[i] = pgm_read_float(&tmp2[i < COUNT(tmp2) ? i : COUNT(tmp2) - 1]);
- planner.max_acceleration_mm_per_s2[i] = pgm_read_dword_near(&tmp3[i < COUNT(tmp3) ? i : COUNT(tmp3) - 1]);
+ planner.settings.axis_steps_per_mm[i] = pgm_read_float(&tmp1[ALIM(i, tmp1)]);
+ planner.settings.max_feedrate_mm_s[i] = pgm_read_float(&tmp2[ALIM(i, tmp2)]);
+ planner.settings.max_acceleration_mm_per_s2[i] = pgm_read_dword_near(&tmp3[ALIM(i, tmp3)]);
}
- planner.min_segment_time_us = DEFAULT_MINSEGMENTTIME;
- planner.acceleration = DEFAULT_ACCELERATION;
- planner.retract_acceleration = DEFAULT_RETRACT_ACCELERATION;
- planner.travel_acceleration = DEFAULT_TRAVEL_ACCELERATION;
- planner.min_feedrate_mm_s = DEFAULT_MINIMUMFEEDRATE;
- planner.min_travel_feedrate_mm_s = DEFAULT_MINTRAVELFEEDRATE;
-
- #if ENABLED(JUNCTION_DEVIATION)
- planner.junction_deviation_mm = float(JUNCTION_DEVIATION_MM);
- #endif
+ planner.settings.min_segment_time_us = DEFAULT_MINSEGMENTTIME;
+ planner.settings.acceleration = DEFAULT_ACCELERATION;
+ planner.settings.retract_acceleration = DEFAULT_RETRACT_ACCELERATION;
+ planner.settings.travel_acceleration = DEFAULT_TRAVEL_ACCELERATION;
+ planner.settings.min_feedrate_mm_s = DEFAULT_MINIMUMFEEDRATE;
+ planner.settings.min_travel_feedrate_mm_s = DEFAULT_MINTRAVELFEEDRATE;
#if HAS_CLASSIC_JERK
planner.max_jerk[X_AXIS] = DEFAULT_XJERK;
@@ -1860,6 +1812,10 @@ void MarlinSettings::reset(PORTARG_SOLO) {
#endif
#endif
+ #if ENABLED(JUNCTION_DEVIATION)
+ planner.junction_deviation_mm = float(JUNCTION_DEVIATION_MM);
+ #endif
+
#if HAS_HOME_OFFSET
ZERO(home_offset);
#endif
@@ -1877,9 +1833,9 @@ void MarlinSettings::reset(PORTARG_SOLO) {
#endif
#if ENABLED(SINGLENOZZLE)
- singlenozzle_swap_length = SINGLENOZZLE_SWAP_LENGTH;
- singlenozzle_prime_speed = SINGLENOZZLE_SWAP_PRIME_SPEED;
- singlenozzle_retract_speed = SINGLENOZZLE_SWAP_RETRACT_SPEED;
+ sn_settings.swap_length = SINGLENOZZLE_SWAP_LENGTH;
+ sn_settings.prime_speed = SINGLENOZZLE_SWAP_PRIME_SPEED;
+ sn_settings.retract_speed = SINGLENOZZLE_SWAP_RETRACT_SPEED;
#endif
//
@@ -2003,10 +1959,7 @@ void MarlinSettings::reset(PORTARG_SOLO) {
#endif
#if ENABLED(PIDTEMP)
- #if ENABLED(PID_PARAMS_PER_HOTEND) && HOTENDS > 1
- HOTEND_LOOP()
- #endif
- {
+ HOTEND_LOOP() {
PID_PARAM(Kp, e) = float(DEFAULT_Kp);
PID_PARAM(Ki, e) = scalePID_i(DEFAULT_Ki);
PID_PARAM(Kd, e) = scalePID_d(DEFAULT_Kd);
@@ -2020,9 +1973,9 @@ void MarlinSettings::reset(PORTARG_SOLO) {
#endif // PIDTEMP
#if ENABLED(PIDTEMPBED)
- thermalManager.bedKp = DEFAULT_bedKp;
- thermalManager.bedKi = scalePID_i(DEFAULT_bedKi);
- thermalManager.bedKd = scalePID_d(DEFAULT_bedKd);
+ thermalManager.bed_pid.Kp = DEFAULT_bedKp;
+ thermalManager.bed_pid.Ki = scalePID_i(DEFAULT_bedKi);
+ thermalManager.bed_pid.Kd = scalePID_d(DEFAULT_bedKd);
#endif
#if HAS_LCD_CONTRAST
@@ -2062,23 +2015,23 @@ void MarlinSettings::reset(PORTARG_SOLO) {
#endif
#if HAS_MOTOR_CURRENT_PWM
- uint32_t tmp_motor_current_setting[XYZ] = PWM_MOTOR_CURRENT;
- for (uint8_t q = XYZ; q--;)
+ uint32_t tmp_motor_current_setting[3] = PWM_MOTOR_CURRENT;
+ for (uint8_t q = 3; q--;)
stepper.digipot_current(q, (stepper.motor_current_setting[q] = tmp_motor_current_setting[q]));
#endif
#if ENABLED(SKEW_CORRECTION_GCODE)
- planner.xy_skew_factor = XY_SKEW_FACTOR;
+ planner.skew_factor.xy = XY_SKEW_FACTOR;
#if ENABLED(SKEW_CORRECTION_FOR_Z)
- planner.xz_skew_factor = XZ_SKEW_FACTOR;
- planner.yz_skew_factor = YZ_SKEW_FACTOR;
+ planner.skew_factor.xz = XZ_SKEW_FACTOR;
+ planner.skew_factor.yz = YZ_SKEW_FACTOR;
#endif
#endif
#if ENABLED(ADVANCED_PAUSE_FEATURE)
for (uint8_t e = 0; e < EXTRUDERS; e++) {
- filament_change_unload_length[e] = FILAMENT_CHANGE_UNLOAD_LENGTH;
- filament_change_load_length[e] = FILAMENT_CHANGE_FAST_LOAD_LENGTH;
+ fc_settings[e].unload_length = FILAMENT_CHANGE_UNLOAD_LENGTH;
+ fc_settings[e].load_length = FILAMENT_CHANGE_FAST_LOAD_LENGTH;
}
#endif
@@ -2232,18 +2185,18 @@ void MarlinSettings::reset(PORTARG_SOLO) {
SERIAL_ECHOLNPGM_P(port, "Steps per unit:");
}
CONFIG_ECHO_START;
- SERIAL_ECHOPAIR_P(port, " M92 X", LINEAR_UNIT(planner.axis_steps_per_mm[X_AXIS]));
- SERIAL_ECHOPAIR_P(port, " Y", LINEAR_UNIT(planner.axis_steps_per_mm[Y_AXIS]));
- SERIAL_ECHOPAIR_P(port, " Z", LINEAR_UNIT(planner.axis_steps_per_mm[Z_AXIS]));
+ SERIAL_ECHOPAIR_P(port, " M92 X", LINEAR_UNIT(planner.settings.axis_steps_per_mm[X_AXIS]));
+ SERIAL_ECHOPAIR_P(port, " Y", LINEAR_UNIT(planner.settings.axis_steps_per_mm[Y_AXIS]));
+ SERIAL_ECHOPAIR_P(port, " Z", LINEAR_UNIT(planner.settings.axis_steps_per_mm[Z_AXIS]));
#if DISABLED(DISTINCT_E_FACTORS)
- SERIAL_ECHOPAIR_P(port, " E", VOLUMETRIC_UNIT(planner.axis_steps_per_mm[E_AXIS]));
+ SERIAL_ECHOPAIR_P(port, " E", VOLUMETRIC_UNIT(planner.settings.axis_steps_per_mm[E_AXIS]));
#endif
SERIAL_EOL_P(port);
#if ENABLED(DISTINCT_E_FACTORS)
CONFIG_ECHO_START;
for (uint8_t i = 0; i < E_STEPPERS; i++) {
SERIAL_ECHOPAIR_P(port, " M92 T", (int)i);
- SERIAL_ECHOLNPAIR_P(port, " E", VOLUMETRIC_UNIT(planner.axis_steps_per_mm[E_AXIS + i]));
+ SERIAL_ECHOLNPAIR_P(port, " E", VOLUMETRIC_UNIT(planner.settings.axis_steps_per_mm[E_AXIS + i]));
}
#endif
@@ -2252,18 +2205,18 @@ void MarlinSettings::reset(PORTARG_SOLO) {
SERIAL_ECHOLNPGM_P(port, "Maximum feedrates (units/s):");
}
CONFIG_ECHO_START;
- SERIAL_ECHOPAIR_P(port, " M203 X", LINEAR_UNIT(planner.max_feedrate_mm_s[X_AXIS]));
- SERIAL_ECHOPAIR_P(port, " Y", LINEAR_UNIT(planner.max_feedrate_mm_s[Y_AXIS]));
- SERIAL_ECHOPAIR_P(port, " Z", LINEAR_UNIT(planner.max_feedrate_mm_s[Z_AXIS]));
+ SERIAL_ECHOPAIR_P(port, " M203 X", LINEAR_UNIT(planner.settings.max_feedrate_mm_s[X_AXIS]));
+ SERIAL_ECHOPAIR_P(port, " Y", LINEAR_UNIT(planner.settings.max_feedrate_mm_s[Y_AXIS]));
+ SERIAL_ECHOPAIR_P(port, " Z", LINEAR_UNIT(planner.settings.max_feedrate_mm_s[Z_AXIS]));
#if DISABLED(DISTINCT_E_FACTORS)
- SERIAL_ECHOPAIR_P(port, " E", VOLUMETRIC_UNIT(planner.max_feedrate_mm_s[E_AXIS]));
+ SERIAL_ECHOPAIR_P(port, " E", VOLUMETRIC_UNIT(planner.settings.max_feedrate_mm_s[E_AXIS]));
#endif
SERIAL_EOL_P(port);
#if ENABLED(DISTINCT_E_FACTORS)
CONFIG_ECHO_START;
for (uint8_t i = 0; i < E_STEPPERS; i++) {
SERIAL_ECHOPAIR_P(port, " M203 T", (int)i);
- SERIAL_ECHOLNPAIR_P(port, " E", VOLUMETRIC_UNIT(planner.max_feedrate_mm_s[E_AXIS + i]));
+ SERIAL_ECHOLNPAIR_P(port, " E", VOLUMETRIC_UNIT(planner.settings.max_feedrate_mm_s[E_AXIS + i]));
}
#endif
@@ -2272,18 +2225,18 @@ void MarlinSettings::reset(PORTARG_SOLO) {
SERIAL_ECHOLNPGM_P(port, "Maximum Acceleration (units/s2):");
}
CONFIG_ECHO_START;
- SERIAL_ECHOPAIR_P(port, " M201 X", LINEAR_UNIT(planner.max_acceleration_mm_per_s2[X_AXIS]));
- SERIAL_ECHOPAIR_P(port, " Y", LINEAR_UNIT(planner.max_acceleration_mm_per_s2[Y_AXIS]));
- SERIAL_ECHOPAIR_P(port, " Z", LINEAR_UNIT(planner.max_acceleration_mm_per_s2[Z_AXIS]));
+ SERIAL_ECHOPAIR_P(port, " M201 X", LINEAR_UNIT(planner.settings.max_acceleration_mm_per_s2[X_AXIS]));
+ SERIAL_ECHOPAIR_P(port, " Y", LINEAR_UNIT(planner.settings.max_acceleration_mm_per_s2[Y_AXIS]));
+ SERIAL_ECHOPAIR_P(port, " Z", LINEAR_UNIT(planner.settings.max_acceleration_mm_per_s2[Z_AXIS]));
#if DISABLED(DISTINCT_E_FACTORS)
- SERIAL_ECHOPAIR_P(port, " E", VOLUMETRIC_UNIT(planner.max_acceleration_mm_per_s2[E_AXIS]));
+ SERIAL_ECHOPAIR_P(port, " E", VOLUMETRIC_UNIT(planner.settings.max_acceleration_mm_per_s2[E_AXIS]));
#endif
SERIAL_EOL_P(port);
#if ENABLED(DISTINCT_E_FACTORS)
CONFIG_ECHO_START;
for (uint8_t i = 0; i < E_STEPPERS; i++) {
SERIAL_ECHOPAIR_P(port, " M201 T", (int)i);
- SERIAL_ECHOLNPAIR_P(port, " E", VOLUMETRIC_UNIT(planner.max_acceleration_mm_per_s2[E_AXIS + i]));
+ SERIAL_ECHOLNPAIR_P(port, " E", VOLUMETRIC_UNIT(planner.settings.max_acceleration_mm_per_s2[E_AXIS + i]));
}
#endif
@@ -2292,9 +2245,9 @@ void MarlinSettings::reset(PORTARG_SOLO) {
SERIAL_ECHOLNPGM_P(port, "Acceleration (units/s2): P R T");
}
CONFIG_ECHO_START;
- SERIAL_ECHOPAIR_P(port, " M204 P", LINEAR_UNIT(planner.acceleration));
- SERIAL_ECHOPAIR_P(port, " R", LINEAR_UNIT(planner.retract_acceleration));
- SERIAL_ECHOLNPAIR_P(port, " T", LINEAR_UNIT(planner.travel_acceleration));
+ SERIAL_ECHOPAIR_P(port, " M204 P", LINEAR_UNIT(planner.settings.acceleration));
+ SERIAL_ECHOPAIR_P(port, " R", LINEAR_UNIT(planner.settings.retract_acceleration));
+ SERIAL_ECHOLNPAIR_P(port, " T", LINEAR_UNIT(planner.settings.travel_acceleration));
if (!forReplay) {
CONFIG_ECHO_START;
@@ -2311,9 +2264,9 @@ void MarlinSettings::reset(PORTARG_SOLO) {
SERIAL_EOL_P(port);
}
CONFIG_ECHO_START;
- SERIAL_ECHOPAIR_P(port, " M205 B", LINEAR_UNIT(planner.min_segment_time_us));
- SERIAL_ECHOPAIR_P(port, " S", LINEAR_UNIT(planner.min_feedrate_mm_s));
- SERIAL_ECHOPAIR_P(port, " T", LINEAR_UNIT(planner.min_travel_feedrate_mm_s));
+ SERIAL_ECHOPAIR_P(port, " M205 B", LINEAR_UNIT(planner.settings.min_segment_time_us));
+ SERIAL_ECHOPAIR_P(port, " S", LINEAR_UNIT(planner.settings.min_feedrate_mm_s));
+ SERIAL_ECHOPAIR_P(port, " T", LINEAR_UNIT(planner.settings.min_travel_feedrate_mm_s));
#if ENABLED(JUNCTION_DEVIATION)
SERIAL_ECHOPAIR_P(port, " J", LINEAR_UNIT(planner.junction_deviation_mm));
@@ -2571,9 +2524,9 @@ void MarlinSettings::reset(PORTARG_SOLO) {
#if ENABLED(PIDTEMPBED)
CONFIG_ECHO_START;
- SERIAL_ECHOPAIR_P(port, " M304 P", thermalManager.bedKp);
- SERIAL_ECHOPAIR_P(port, " I", unscalePID_i(thermalManager.bedKi));
- SERIAL_ECHOPAIR_P(port, " D", unscalePID_d(thermalManager.bedKd));
+ SERIAL_ECHOPAIR_P(port, " M304 P", thermalManager.bed_pid.Kp);
+ SERIAL_ECHOPAIR_P(port, " I", unscalePID_i(thermalManager.bed_pid.Ki));
+ SERIAL_ECHOPAIR_P(port, " D", unscalePID_d(thermalManager.bed_pid.Kd));
SERIAL_EOL_P(port);
#endif
@@ -2595,19 +2548,19 @@ void MarlinSettings::reset(PORTARG_SOLO) {
SERIAL_ECHOLNPGM_P(port, "Retract: S F Z");
}
CONFIG_ECHO_START;
- SERIAL_ECHOPAIR_P(port, " M207 S", LINEAR_UNIT(fwretract.retract_length));
- SERIAL_ECHOPAIR_P(port, " W", LINEAR_UNIT(fwretract.swap_retract_length));
- SERIAL_ECHOPAIR_P(port, " F", MMS_TO_MMM(LINEAR_UNIT(fwretract.retract_feedrate_mm_s)));
- SERIAL_ECHOLNPAIR_P(port, " Z", LINEAR_UNIT(fwretract.retract_zlift));
+ SERIAL_ECHOPAIR_P(port, " M207 S", LINEAR_UNIT(fwretract.settings.retract_length));
+ SERIAL_ECHOPAIR_P(port, " W", LINEAR_UNIT(fwretract.settings.swap_retract_length));
+ SERIAL_ECHOPAIR_P(port, " F", MMS_TO_MMM(LINEAR_UNIT(fwretract.settings.retract_feedrate_mm_s)));
+ SERIAL_ECHOLNPAIR_P(port, " Z", LINEAR_UNIT(fwretract.settings.retract_zlift));
if (!forReplay) {
CONFIG_ECHO_START;
SERIAL_ECHOLNPGM_P(port, "Recover: S F");
}
CONFIG_ECHO_START;
- SERIAL_ECHOPAIR_P(port, " M208 S", LINEAR_UNIT(fwretract.retract_recover_length));
- SERIAL_ECHOPAIR_P(port, " W", LINEAR_UNIT(fwretract.swap_retract_recover_length));
- SERIAL_ECHOLNPAIR_P(port, " F", MMS_TO_MMM(LINEAR_UNIT(fwretract.retract_recover_feedrate_mm_s)));
+ SERIAL_ECHOPAIR_P(port, " M208 S", LINEAR_UNIT(fwretract.settings.retract_recover_length));
+ SERIAL_ECHOPAIR_P(port, " W", LINEAR_UNIT(fwretract.settings.swap_retract_recover_length));
+ SERIAL_ECHOLNPAIR_P(port, " F", MMS_TO_MMM(LINEAR_UNIT(fwretract.settings.retract_recover_feedrate_mm_s)));
#if ENABLED(FWRETRACT_AUTORETRACT)
@@ -2646,15 +2599,15 @@ void MarlinSettings::reset(PORTARG_SOLO) {
CONFIG_ECHO_START;
#if ENABLED(SKEW_CORRECTION_FOR_Z)
SERIAL_ECHOPGM_P(port, " M852 I");
- SERIAL_ECHO_F_P(port, LINEAR_UNIT(planner.xy_skew_factor), 6);
+ SERIAL_ECHO_F_P(port, LINEAR_UNIT(planner.skew_factor.xy), 6);
SERIAL_ECHOPGM_P(port, " J");
- SERIAL_ECHO_F_P(port, LINEAR_UNIT(planner.xz_skew_factor), 6);
+ SERIAL_ECHO_F_P(port, LINEAR_UNIT(planner.skew_factor.xz), 6);
SERIAL_ECHOPGM_P(port, " K");
- SERIAL_ECHO_F_P(port, LINEAR_UNIT(planner.yz_skew_factor), 6);
+ SERIAL_ECHO_F_P(port, LINEAR_UNIT(planner.skew_factor.yz), 6);
SERIAL_EOL_P(port);
#else
SERIAL_ECHOPGM_P(port, " M852 S");
- SERIAL_ECHO_F_P(port, LINEAR_UNIT(planner.xy_skew_factor), 6);
+ SERIAL_ECHO_F_P(port, LINEAR_UNIT(planner.skew_factor.xy), 6);
SERIAL_EOL_P(port);
#endif
#endif
@@ -2903,36 +2856,36 @@ void MarlinSettings::reset(PORTARG_SOLO) {
CONFIG_ECHO_START;
#if EXTRUDERS == 1
say_M603(PORTVAR_SOLO);
- SERIAL_ECHOPAIR_P(port, "L", LINEAR_UNIT(filament_change_load_length[0]));
- SERIAL_ECHOLNPAIR_P(port, " U", LINEAR_UNIT(filament_change_unload_length[0]));
+ SERIAL_ECHOPAIR_P(port, "L", LINEAR_UNIT(fc_settings[0].load_length));
+ SERIAL_ECHOLNPAIR_P(port, " U", LINEAR_UNIT(fc_settings[0].unload_length));
#else
say_M603(PORTVAR_SOLO);
- SERIAL_ECHOPAIR_P(port, "T0 L", LINEAR_UNIT(filament_change_load_length[0]));
- SERIAL_ECHOLNPAIR_P(port, " U", LINEAR_UNIT(filament_change_unload_length[0]));
+ SERIAL_ECHOPAIR_P(port, "T0 L", LINEAR_UNIT(fc_settings[0].load_length));
+ SERIAL_ECHOLNPAIR_P(port, " U", LINEAR_UNIT(fc_settings[0].unload_length));
CONFIG_ECHO_START;
say_M603(PORTVAR_SOLO);
- SERIAL_ECHOPAIR_P(port, "T1 L", LINEAR_UNIT(filament_change_load_length[1]));
- SERIAL_ECHOLNPAIR_P(port, " U", LINEAR_UNIT(filament_change_unload_length[1]));
+ SERIAL_ECHOPAIR_P(port, "T1 L", LINEAR_UNIT(fc_settings[1].load_length));
+ SERIAL_ECHOLNPAIR_P(port, " U", LINEAR_UNIT(fc_settings[1].unload_length));
#if EXTRUDERS > 2
CONFIG_ECHO_START;
say_M603(PORTVAR_SOLO);
- SERIAL_ECHOPAIR_P(port, "T2 L", LINEAR_UNIT(filament_change_load_length[2]));
- SERIAL_ECHOLNPAIR_P(port, " U", LINEAR_UNIT(filament_change_unload_length[2]));
+ SERIAL_ECHOPAIR_P(port, "T2 L", LINEAR_UNIT(fc_settings[2].load_length));
+ SERIAL_ECHOLNPAIR_P(port, " U", LINEAR_UNIT(fc_settings[2].unload_length));
#if EXTRUDERS > 3
CONFIG_ECHO_START;
say_M603(PORTVAR_SOLO);
- SERIAL_ECHOPAIR_P(port, "T3 L", LINEAR_UNIT(filament_change_load_length[3]));
- SERIAL_ECHOLNPAIR_P(port, " U", LINEAR_UNIT(filament_change_unload_length[3]));
+ SERIAL_ECHOPAIR_P(port, "T3 L", LINEAR_UNIT(fc_settings[3].load_length));
+ SERIAL_ECHOLNPAIR_P(port, " U", LINEAR_UNIT(fc_settings[3].unload_length));
#if EXTRUDERS > 4
CONFIG_ECHO_START;
say_M603(PORTVAR_SOLO);
- SERIAL_ECHOPAIR_P(port, "T4 L", LINEAR_UNIT(filament_change_load_length[4]));
- SERIAL_ECHOLNPAIR_P(port, " U", LINEAR_UNIT(filament_change_unload_length[4]));
+ SERIAL_ECHOPAIR_P(port, "T4 L", LINEAR_UNIT(fc_settings[4].load_length));
+ SERIAL_ECHOLNPAIR_P(port, " U", LINEAR_UNIT(fc_settings[4].unload_length));
#if EXTRUDERS > 5
CONFIG_ECHO_START;
say_M603(PORTVAR_SOLO);
- SERIAL_ECHOPAIR_P(port, "T5 L", LINEAR_UNIT(filament_change_load_length[5]));
- SERIAL_ECHOLNPAIR_P(port, " U", LINEAR_UNIT(filament_change_unload_length[5]));
+ SERIAL_ECHOPAIR_P(port, "T5 L", LINEAR_UNIT(fc_settings[5].load_length));
+ SERIAL_ECHOLNPAIR_P(port, " U", LINEAR_UNIT(fc_settings[5].unload_length));
#endif // EXTRUDERS > 5
#endif // EXTRUDERS > 4
#endif // EXTRUDERS > 3
@@ -2951,3 +2904,5 @@ void MarlinSettings::reset(PORTARG_SOLO) {
}
#endif // !DISABLE_M503
+
+#pragma pack(pop)
diff --git a/Marlin/src/module/configuration_store.h b/Marlin/src/module/configuration_store.h
index 84e90527b3..1d4862c353 100644
--- a/Marlin/src/module/configuration_store.h
+++ b/Marlin/src/module/configuration_store.h
@@ -61,6 +61,11 @@ class MarlinSettings {
#endif
}
+ #if ENABLED(SD_FIRMWARE_UPDATE)
+ static bool sd_update_status(); // True if the SD-Firmware-Update EEPROM flag is set
+ static bool set_sd_update_status(const bool enable); // Return 'true' after EEPROM is set (-> always true)
+ #endif
+
#if ENABLED(EEPROM_SETTINGS)
static bool load(PORTINIT_SOLO); // Return 'true' if data was loaded ok
static bool validate(PORTINIT_SOLO); // Return 'true' if EEPROM data is ok
diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp
index dbf85e4548..bc28c778c3 100644
--- a/Marlin/src/module/motion.cpp
+++ b/Marlin/src/module/motion.cpp
@@ -817,9 +817,9 @@ float soft_endstop_min[XYZ] = { X_MIN_BED, Y_MIN_BED, Z_MIN_POS },
#define RAISED_Y raised_parked_position[Y_AXIS]
#define RAISED_Z raised_parked_position[Z_AXIS]
- if ( planner.buffer_line(RAISED_X, RAISED_Y, RAISED_Z, CUR_E, planner.max_feedrate_mm_s[Z_AXIS], active_extruder))
+ if ( planner.buffer_line(RAISED_X, RAISED_Y, RAISED_Z, CUR_E, planner.settings.max_feedrate_mm_s[Z_AXIS], active_extruder))
if (planner.buffer_line( CUR_X, CUR_Y, RAISED_Z, CUR_E, PLANNER_XY_FEEDRATE(), active_extruder))
- planner.buffer_line( CUR_X, CUR_Y, CUR_Z, CUR_E, planner.max_feedrate_mm_s[Z_AXIS], active_extruder);
+ planner.buffer_line( CUR_X, CUR_Y, CUR_Z, CUR_E, planner.settings.max_feedrate_mm_s[Z_AXIS], active_extruder);
delayed_move_time = 0;
active_extruder_parked = false;
#if ENABLED(DEBUG_LEVELING_FEATURE)
@@ -841,7 +841,7 @@ float soft_endstop_min[XYZ] = { X_MIN_BED, Y_MIN_BED, Z_MIN_POS },
if (!planner.buffer_line(
dual_x_carriage_mode == DXC_DUPLICATION_MODE ? duplicate_extruder_x_offset + current_position[X_AXIS] : inactive_extruder_x_pos,
current_position[Y_AXIS], current_position[Z_AXIS], current_position[E_AXIS],
- planner.max_feedrate_mm_s[X_AXIS], 1
+ planner.settings.max_feedrate_mm_s[X_AXIS], 1
)
) break;
planner.synchronize();
diff --git a/Marlin/src/module/planner.cpp b/Marlin/src/module/planner.cpp
index 3395e759e2..7d1f30f5d8 100644
--- a/Marlin/src/module/planner.cpp
+++ b/Marlin/src/module/planner.cpp
@@ -111,18 +111,11 @@ volatile uint8_t Planner::block_buffer_head, // Index of the next block to be
uint16_t Planner::cleaning_buffer_counter; // A counter to disable queuing of blocks
uint8_t Planner::delay_before_delivering; // This counter delays delivery of blocks when queue becomes empty to allow the opportunity of merging blocks
-uint32_t Planner::max_acceleration_mm_per_s2[XYZE_N], // (mm/s^2) M201 XYZE
- Planner::max_acceleration_steps_per_s2[XYZE_N], // (steps/s^2) Derived from mm_per_s2
- Planner::min_segment_time_us; // (µs) M205 B
+planner_settings_t Planner::settings; // Initialized by settings.load()
-float Planner::max_feedrate_mm_s[XYZE_N], // (mm/s) M203 XYZE - Max speeds
- Planner::axis_steps_per_mm[XYZE_N], // (steps) M92 XYZE - Steps per millimeter
- Planner::steps_to_mm[XYZE_N], // (mm) Millimeters per step
- Planner::min_feedrate_mm_s, // (mm/s) M205 S - Minimum linear feedrate
- Planner::acceleration, // (mm/s^2) M204 S - Normal acceleration. DEFAULT ACCELERATION for all printing moves.
- Planner::retract_acceleration, // (mm/s^2) M204 R - Retract acceleration. Filament pull-back and push-forward while standing still in the other axes
- Planner::travel_acceleration, // (mm/s^2) M204 T - Travel acceleration. DEFAULT ACCELERATION for all NON printing moves.
- Planner::min_travel_feedrate_mm_s; // (mm/s) M205 T - Minimum travel feedrate
+uint32_t Planner::max_acceleration_steps_per_s2[XYZE_N]; // (steps/s^2) Derived from mm_per_s2
+
+float Planner::steps_to_mm[XYZE_N]; // (mm) Millimeters per step
#if ENABLED(JUNCTION_DEVIATION)
float Planner::junction_deviation_mm; // (mm) M205 J
@@ -177,18 +170,7 @@ float Planner::e_factor[EXTRUDERS] = ARRAY_BY_EXTRUDERS1(1.0f); // The flow perc
constexpr bool Planner::leveling_active;
#endif
-#if ENABLED(SKEW_CORRECTION)
- #if ENABLED(SKEW_CORRECTION_GCODE)
- float Planner::xy_skew_factor;
- #else
- constexpr float Planner::xy_skew_factor;
- #endif
- #if ENABLED(SKEW_CORRECTION_FOR_Z) && ENABLED(SKEW_CORRECTION_GCODE)
- float Planner::xz_skew_factor, Planner::yz_skew_factor;
- #else
- constexpr float Planner::xz_skew_factor, Planner::yz_skew_factor;
- #endif
-#endif
+skew_factor_t Planner::skew_factor; // Initialized by settings.load()
#if ENABLED(AUTOTEMP)
float Planner::autotemp_max = 250,
@@ -1094,7 +1076,7 @@ void Planner::recalculate_trapezoids() {
calculate_trapezoid_for_block(current, current_entry_speed * nomr, next_entry_speed * nomr);
#if ENABLED(LIN_ADVANCE)
if (current->use_advance_lead) {
- const float comp = current->e_D_ratio * extruder_advance_K[active_extruder] * axis_steps_per_mm[E_AXIS];
+ const float comp = current->e_D_ratio * extruder_advance_K[active_extruder] * settings.axis_steps_per_mm[E_AXIS];
current->max_adv_steps = current_nominal_speed * comp;
current->final_adv_steps = next_entry_speed * comp;
}
@@ -1133,7 +1115,7 @@ void Planner::recalculate_trapezoids() {
calculate_trapezoid_for_block(next, next_entry_speed * nomr, float(MINIMUM_PLANNER_SPEED) * nomr);
#if ENABLED(LIN_ADVANCE)
if (next->use_advance_lead) {
- const float comp = next->e_D_ratio * extruder_advance_K[active_extruder] * axis_steps_per_mm[E_AXIS];
+ const float comp = next->e_D_ratio * extruder_advance_K[active_extruder] * settings.axis_steps_per_mm[E_AXIS];
next->max_adv_steps = next_nominal_speed * comp;
next->final_adv_steps = (MINIMUM_PLANNER_SPEED) * comp;
}
@@ -1687,7 +1669,7 @@ bool Planner::_populate_block(block_t * const block, bool split_move,
}
#endif // PREVENT_COLD_EXTRUSION
#if ENABLED(PREVENT_LENGTHY_EXTRUDE)
- if (ABS(de * e_factor[extruder]) > (int32_t)axis_steps_per_mm[E_AXIS_N(extruder)] * (EXTRUDE_MAXLENGTH)) { // It's not important to get max. extrusion length in a precision < 1mm, so save some cycles and cast to int
+ if (ABS(de * e_factor[extruder]) > (int32_t)settings.axis_steps_per_mm[E_AXIS_N(extruder)] * (EXTRUDE_MAXLENGTH)) { // It's not important to get max. extrusion length in a precision < 1mm, so save some cycles and cast to int
position[E_AXIS] = target[E_AXIS]; // Behave as if the move really took place, but ignore E part
#if HAS_POSITION_FLOAT
position_float[E_AXIS] = target_float[E_AXIS];
@@ -1946,9 +1928,9 @@ bool Planner::_populate_block(block_t * const block, bool split_move,
}
if (esteps)
- NOLESS(fr_mm_s, min_feedrate_mm_s);
+ NOLESS(fr_mm_s, settings.min_feedrate_mm_s);
else
- NOLESS(fr_mm_s, min_travel_feedrate_mm_s);
+ NOLESS(fr_mm_s, settings.min_travel_feedrate_mm_s);
/**
* This part of the code calculates the total length of the movement.
@@ -2023,9 +2005,9 @@ bool Planner::_populate_block(block_t * const block, bool split_move,
#if ENABLED(SLOWDOWN)
if (WITHIN(moves_queued, 2, (BLOCK_BUFFER_SIZE) / 2 - 1)) {
- if (segment_time_us < min_segment_time_us) {
+ if (segment_time_us < settings.min_segment_time_us) {
// buffer is draining, add extra time. The amount of time added increases if the buffer is still emptied more.
- const uint32_t nst = segment_time_us + LROUND(2 * (min_segment_time_us - segment_time_us) / moves_queued);
+ const uint32_t nst = segment_time_us + LROUND(2 * (settings.min_segment_time_us - segment_time_us) / moves_queued);
inverse_secs = 1000000.0f / nst;
#if defined(XY_FREQUENCY_LIMIT) || ENABLED(ULTRA_LCD)
segment_time_us = nst;
@@ -2100,7 +2082,7 @@ bool Planner::_populate_block(block_t * const block, bool split_move,
#if ENABLED(DISTINCT_E_FACTORS)
if (i == E_AXIS) i += extruder;
#endif
- if (cs > max_feedrate_mm_s[i]) NOMORE(speed_factor, max_feedrate_mm_s[i] / cs);
+ if (cs > settings.max_feedrate_mm_s[i]) NOMORE(speed_factor, settings.max_feedrate_mm_s[i] / cs);
}
// Max segment time in µs.
@@ -2153,7 +2135,7 @@ bool Planner::_populate_block(block_t * const block, bool split_move,
uint32_t accel;
if (!block->steps[A_AXIS] && !block->steps[B_AXIS] && !block->steps[C_AXIS]) {
// convert to: acceleration steps/sec^2
- accel = CEIL(retract_acceleration * steps_per_mm);
+ accel = CEIL(settings.retract_acceleration * steps_per_mm);
#if ENABLED(LIN_ADVANCE)
block->use_advance_lead = false;
#endif
@@ -2174,7 +2156,7 @@ bool Planner::_populate_block(block_t * const block, bool split_move,
}while(0)
// Start with print or travel acceleration
- accel = CEIL((esteps ? acceleration : travel_acceleration) * steps_per_mm);
+ accel = CEIL((esteps ? settings.acceleration : settings.travel_acceleration) * steps_per_mm);
#if ENABLED(LIN_ADVANCE)
@@ -2254,7 +2236,7 @@ bool Planner::_populate_block(block_t * const block, bool split_move,
#endif
#if ENABLED(LIN_ADVANCE)
if (block->use_advance_lead) {
- block->advance_speed = (STEPPER_TIMER_RATE) / (extruder_advance_K[active_extruder] * block->e_D_ratio * block->acceleration * axis_steps_per_mm[E_AXIS_N(extruder)]);
+ block->advance_speed = (STEPPER_TIMER_RATE) / (extruder_advance_K[active_extruder] * block->e_D_ratio * block->acceleration * settings.axis_steps_per_mm[E_AXIS_N(extruder)]);
#if ENABLED(LA_DEBUG)
if (extruder_advance_K[active_extruder] * block->e_D_ratio * block->acceleration * 2 < SQRT(block->nominal_speed_sqr) * block->e_D_ratio)
SERIAL_ECHOLNPGM("More than 2 steps per eISR loop executed.");
@@ -2566,8 +2548,8 @@ bool Planner::buffer_segment(const float &a, const float &b, const float &c, con
// When changing extruders recalculate steps corresponding to the E position
#if ENABLED(DISTINCT_E_FACTORS)
- if (last_extruder != extruder && axis_steps_per_mm[E_AXIS_N(extruder)] != axis_steps_per_mm[E_AXIS + last_extruder]) {
- position[E_AXIS] = LROUND(position[E_AXIS] * axis_steps_per_mm[E_AXIS_N(extruder)] * steps_to_mm[E_AXIS + last_extruder]);
+ if (last_extruder != extruder && settings.axis_steps_per_mm[E_AXIS_N(extruder)] != settings.axis_steps_per_mm[E_AXIS + last_extruder]) {
+ position[E_AXIS] = LROUND(position[E_AXIS] * settings.axis_steps_per_mm[E_AXIS_N(extruder)] * steps_to_mm[E_AXIS + last_extruder]);
last_extruder = extruder;
}
#endif
@@ -2575,10 +2557,10 @@ bool Planner::buffer_segment(const float &a, const float &b, const float &c, con
// The target position of the tool in absolute steps
// Calculate target position in absolute steps
const int32_t target[ABCE] = {
- LROUND(a * axis_steps_per_mm[A_AXIS]),
- LROUND(b * axis_steps_per_mm[B_AXIS]),
- LROUND(c * axis_steps_per_mm[C_AXIS]),
- LROUND(e * axis_steps_per_mm[E_AXIS_N(extruder)])
+ LROUND(a * settings.axis_steps_per_mm[A_AXIS]),
+ LROUND(b * settings.axis_steps_per_mm[B_AXIS]),
+ LROUND(c * settings.axis_steps_per_mm[C_AXIS]),
+ LROUND(e * settings.axis_steps_per_mm[E_AXIS_N(extruder)])
};
#if HAS_POSITION_FLOAT
@@ -2714,10 +2696,10 @@ void Planner::set_machine_position_mm(const float &a, const float &b, const floa
#if ENABLED(DISTINCT_E_FACTORS)
last_extruder = active_extruder;
#endif
- position[A_AXIS] = LROUND(a * axis_steps_per_mm[A_AXIS]);
- position[B_AXIS] = LROUND(b * axis_steps_per_mm[B_AXIS]);
- position[C_AXIS] = LROUND(c * axis_steps_per_mm[C_AXIS]);
- position[E_AXIS] = LROUND(e * axis_steps_per_mm[_EINDEX]);
+ position[A_AXIS] = LROUND(a * settings.axis_steps_per_mm[A_AXIS]);
+ position[B_AXIS] = LROUND(b * settings.axis_steps_per_mm[B_AXIS]);
+ position[C_AXIS] = LROUND(c * settings.axis_steps_per_mm[C_AXIS]);
+ position[E_AXIS] = LROUND(e * settings.axis_steps_per_mm[_EINDEX]);
#if HAS_POSITION_FLOAT
position_float[A_AXIS] = a;
position_float[B_AXIS] = b;
@@ -2770,7 +2752,7 @@ void Planner::set_e_position_mm(const float &e) {
#else
const float e_new = e;
#endif
- position[E_AXIS] = LROUND(axis_steps_per_mm[axis_index] * e_new);
+ position[E_AXIS] = LROUND(settings.axis_steps_per_mm[axis_index] * e_new);
#if HAS_POSITION_FLOAT
position_float[E_AXIS] = e_new;
#endif
@@ -2792,7 +2774,7 @@ void Planner::reset_acceleration_rates() {
#endif
uint32_t highest_rate = 1;
LOOP_XYZE_N(i) {
- max_acceleration_steps_per_s2[i] = max_acceleration_mm_per_s2[i] * axis_steps_per_mm[i];
+ max_acceleration_steps_per_s2[i] = settings.max_acceleration_mm_per_s2[i] * settings.axis_steps_per_mm[i];
if (AXIS_CONDITION) NOLESS(highest_rate, max_acceleration_steps_per_s2[i]);
}
cutoff_long = 4294967295UL / highest_rate; // 0xFFFFFFFFUL
@@ -2801,9 +2783,9 @@ void Planner::reset_acceleration_rates() {
#endif
}
-// Recalculate position, steps_to_mm if axis_steps_per_mm changes!
+// Recalculate position, steps_to_mm if settings.axis_steps_per_mm changes!
void Planner::refresh_positioning() {
- LOOP_XYZE_N(i) steps_to_mm[i] = 1.0f / axis_steps_per_mm[i];
+ LOOP_XYZE_N(i) steps_to_mm[i] = 1.0f / settings.axis_steps_per_mm[i];
set_position_mm(current_position);
reset_acceleration_rates();
}
diff --git a/Marlin/src/module/planner.h b/Marlin/src/module/planner.h
index 1e5caa994f..d3a0b1ee96 100644
--- a/Marlin/src/module/planner.h
+++ b/Marlin/src/module/planner.h
@@ -19,6 +19,7 @@
* along with this program. If not, see .
*
*/
+#pragma once
/**
* planner.h
@@ -29,9 +30,6 @@
* Copyright (c) 2009-2011 Simen Svale Skogsrud
*/
-#ifndef PLANNER_H
-#define PLANNER_H
-
#include "../Marlin.h"
#include "motion.h"
@@ -159,6 +157,42 @@ typedef struct {
#define BLOCK_MOD(n) ((n)&(BLOCK_BUFFER_SIZE-1))
+typedef struct {
+ uint32_t max_acceleration_mm_per_s2[XYZE_N], // (mm/s^2) M201 XYZE
+ min_segment_time_us; // (µs) M205 B
+ float axis_steps_per_mm[XYZE_N], // (steps) M92 XYZE - Steps per millimeter
+ max_feedrate_mm_s[XYZE_N], // (mm/s) M203 XYZE - Max speeds
+ 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.
+ 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;
+
+#ifndef XY_SKEW_FACTOR
+ #define XY_SKEW_FACTOR 0
+#endif
+#ifndef XZ_SKEW_FACTOR
+ #define XZ_SKEW_FACTOR 0
+#endif
+#ifndef YZ_SKEW_FACTOR
+ #define YZ_SKEW_FACTOR 0
+#endif
+
+typedef struct {
+ #if ENABLED(SKEW_CORRECTION_GCODE)
+ float xy;
+ #if ENABLED(SKEW_CORRECTION_FOR_Z)
+ float xz, yz;
+ #else
+ const float xz = XZ_SKEW_FACTOR, yz = YZ_SKEW_FACTOR;
+ #endif
+ #else
+ const float xy = XY_SKEW_FACTOR,
+ xz = XZ_SKEW_FACTOR, yz = YZ_SKEW_FACTOR;
+ #endif
+} skew_factor_t;
+
class Planner {
public:
@@ -199,17 +233,10 @@ class Planner {
// May be auto-adjusted by a filament width sensor
#endif
- static uint32_t max_acceleration_mm_per_s2[XYZE_N], // (mm/s^2) M201 XYZE
- max_acceleration_steps_per_s2[XYZE_N], // (steps/s^2) Derived from mm_per_s2
- min_segment_time_us; // (µs) M205 B
- static float max_feedrate_mm_s[XYZE_N], // (mm/s) M203 XYZE - Max speeds
- axis_steps_per_mm[XYZE_N], // (steps) M92 XYZE - Steps per millimeter
- steps_to_mm[XYZE_N], // (mm) Millimeters per step
- min_feedrate_mm_s, // (mm/s) M205 S - Minimum linear feedrate
- 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.
- min_travel_feedrate_mm_s; // (mm/s) M205 T - Minimum travel feedrate
+ static planner_settings_t settings;
+
+ static uint32_t max_acceleration_steps_per_s2[XYZE_N]; // (steps/s^2) Derived from mm_per_s2
+ static float steps_to_mm[XYZE_N]; // Millimeters per step
#if ENABLED(JUNCTION_DEVIATION)
static float junction_deviation_mm; // (mm) M205 J
@@ -256,22 +283,7 @@ class Planner {
static float position_cart[XYZE];
#endif
- #if ENABLED(SKEW_CORRECTION)
- #if ENABLED(SKEW_CORRECTION_GCODE)
- static float xy_skew_factor;
- #else
- static constexpr float xy_skew_factor = XY_SKEW_FACTOR;
- #endif
- #if ENABLED(SKEW_CORRECTION_FOR_Z)
- #if ENABLED(SKEW_CORRECTION_GCODE)
- static float xz_skew_factor, yz_skew_factor;
- #else
- static constexpr float xz_skew_factor = XZ_SKEW_FACTOR, yz_skew_factor = YZ_SKEW_FACTOR;
- #endif
- #else
- static constexpr float xz_skew_factor = 0, yz_skew_factor = 0;
- #endif
- #endif
+ static skew_factor_t skew_factor;
#if ENABLED(ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED)
static bool abort_on_endstop_hit;
@@ -419,8 +431,8 @@ class Planner {
FORCE_INLINE static void skew(float &cx, float &cy, const float &cz) {
if (WITHIN(cx, X_MIN_POS + 1, X_MAX_POS) && WITHIN(cy, Y_MIN_POS + 1, Y_MAX_POS)) {
- const float sx = cx - cy * xy_skew_factor - cz * (xz_skew_factor - (xy_skew_factor * yz_skew_factor)),
- sy = cy - cz * yz_skew_factor;
+ const float sx = cx - cy * skew_factor.xy - cz * (skew_factor.xz - (skew_factor.xy * skew_factor.yz)),
+ sy = cy - cz * skew_factor.yz;
if (WITHIN(sx, X_MIN_POS, X_MAX_POS) && WITHIN(sy, Y_MIN_POS, Y_MAX_POS)) {
cx = sx; cy = sy;
}
@@ -431,8 +443,8 @@ class Planner {
FORCE_INLINE static void unskew(float &cx, float &cy, const float &cz) {
if (WITHIN(cx, X_MIN_POS, X_MAX_POS) && WITHIN(cy, Y_MIN_POS, Y_MAX_POS)) {
- const float sx = cx + cy * xy_skew_factor + cz * xz_skew_factor,
- sy = cy + cz * yz_skew_factor;
+ const float sx = cx + cy * skew_factor.xy + cz * skew_factor.xz,
+ sy = cy + cz * skew_factor.yz;
if (WITHIN(sx, X_MIN_POS, X_MAX_POS) && WITHIN(sy, Y_MIN_POS, Y_MAX_POS)) {
cx = sx; cy = sy;
}
@@ -848,9 +860,9 @@ class Planner {
#define GET_MAX_E_JERK(N) SQRT(SQRT(0.5) * junction_deviation_mm * (N) * RECIPROCAL(1.0 - SQRT(0.5)))
#if ENABLED(DISTINCT_E_FACTORS)
for (uint8_t i = 0; i < EXTRUDERS; i++)
- max_e_jerk[i] = GET_MAX_E_JERK(max_acceleration_mm_per_s2[E_AXIS + i]);
+ max_e_jerk[i] = GET_MAX_E_JERK(settings.max_acceleration_mm_per_s2[E_AXIS + i]);
#else
- max_e_jerk = GET_MAX_E_JERK(max_acceleration_mm_per_s2[E_AXIS]);
+ max_e_jerk = GET_MAX_E_JERK(settings.max_acceleration_mm_per_s2[E_AXIS]);
#endif
}
#endif
@@ -927,15 +939,13 @@ class Planner {
FORCE_INLINE static float limit_value_by_axis_maximum(const float &max_value, float (&unit_vec)[XYZE]) {
float limit_value = max_value;
LOOP_XYZE(idx) if (unit_vec[idx]) // Avoid divide by zero
- NOMORE(limit_value, ABS(max_acceleration_mm_per_s2[idx] / unit_vec[idx]));
+ NOMORE(limit_value, ABS(settings.max_acceleration_mm_per_s2[idx] / unit_vec[idx]));
return limit_value;
}
#endif // JUNCTION_DEVIATION
};
-#define PLANNER_XY_FEEDRATE() (MIN(planner.max_feedrate_mm_s[X_AXIS], planner.max_feedrate_mm_s[Y_AXIS]))
+#define PLANNER_XY_FEEDRATE() (MIN(planner.settings.max_feedrate_mm_s[X_AXIS], planner.settings.max_feedrate_mm_s[Y_AXIS]))
extern Planner planner;
-
-#endif // PLANNER_H
diff --git a/Marlin/src/module/stepper.cpp b/Marlin/src/module/stepper.cpp
index 76c068977f..e080bfb347 100644
--- a/Marlin/src/module/stepper.cpp
+++ b/Marlin/src/module/stepper.cpp
@@ -2413,7 +2413,7 @@ void Stepper::report_positions() {
#if HAS_MOTOR_CURRENT_PWM
void Stepper::refresh_motor_power() {
- for (uint8_t i = 0; i < COUNT(motor_current_setting); ++i) {
+ LOOP_L_N(i, COUNT(motor_current_setting)) {
switch (i) {
#if PIN_EXISTS(MOTOR_CURRENT_PWM_XY)
case 0:
@@ -2443,7 +2443,7 @@ void Stepper::report_positions() {
#elif HAS_MOTOR_CURRENT_PWM
- if (WITHIN(driver, 0, 2))
+ if (WITHIN(driver, 0, COUNT(motor_current_setting) - 1))
motor_current_setting[driver] = current; // update motor_current_setting
#define _WRITE_CURRENT_PWM(P) analogWrite(MOTOR_CURRENT_PWM_## P ##_PIN, 255L * current / (MOTOR_CURRENT_PWM_RANGE))
@@ -2504,53 +2504,136 @@ void Stepper::report_positions() {
*/
void Stepper::microstep_init() {
- SET_OUTPUT(X_MS1_PIN);
- SET_OUTPUT(X_MS2_PIN);
+ #if HAS_X_MICROSTEPS
+ SET_OUTPUT(X_MS1_PIN);
+ SET_OUTPUT(X_MS2_PIN);
+ #if PIN_EXISTS(X_MS3)
+ SET_OUTPUT(X_MS3_PIN);
+ #endif
+ #endif
+ #if HAS_X2_MICROSTEPS
+ SET_OUTPUT(X2_MS1_PIN);
+ SET_OUTPUT(X2_MS2_PIN);
+ #if PIN_EXISTS(X2_MS3)
+ SET_OUTPUT(X2_MS3_PIN);
+ #endif
+ #endif
#if HAS_Y_MICROSTEPS
SET_OUTPUT(Y_MS1_PIN);
SET_OUTPUT(Y_MS2_PIN);
+ #if PIN_EXISTS(Y_MS3)
+ SET_OUTPUT(Y_MS3_PIN);
+ #endif
+ #endif
+ #if HAS_Y2_MICROSTEPS
+ SET_OUTPUT(Y2_MS1_PIN);
+ SET_OUTPUT(Y2_MS2_PIN);
+ #if PIN_EXISTS(Y2_MS3)
+ SET_OUTPUT(Y2_MS3_PIN);
+ #endif
#endif
#if HAS_Z_MICROSTEPS
SET_OUTPUT(Z_MS1_PIN);
SET_OUTPUT(Z_MS2_PIN);
+ #if PIN_EXISTS(Z_MS3)
+ SET_OUTPUT(Z_MS3_PIN);
+ #endif
+ #endif
+ #if HAS_Z2_MICROSTEPS
+ SET_OUTPUT(Z2_MS1_PIN);
+ SET_OUTPUT(Z2_MS2_PIN);
+ #if PIN_EXISTS(Z2_MS3)
+ SET_OUTPUT(Z2_MS3_PIN);
+ #endif
+ #endif
+ #if HAS_Z3_MICROSTEPS
+ SET_OUTPUT(Z3_MS1_PIN);
+ SET_OUTPUT(Z3_MS2_PIN);
+ #if PIN_EXISTS(Z3_MS3)
+ SET_OUTPUT(Z3_MS3_PIN);
+ #endif
#endif
#if HAS_E0_MICROSTEPS
SET_OUTPUT(E0_MS1_PIN);
SET_OUTPUT(E0_MS2_PIN);
+ #if PIN_EXISTS(E0_MS3)
+ SET_OUTPUT(E0_MS3_PIN);
+ #endif
#endif
#if HAS_E1_MICROSTEPS
SET_OUTPUT(E1_MS1_PIN);
SET_OUTPUT(E1_MS2_PIN);
+ #if PIN_EXISTS(E1_MS3)
+ SET_OUTPUT(E1_MS3_PIN);
+ #endif
#endif
#if HAS_E2_MICROSTEPS
SET_OUTPUT(E2_MS1_PIN);
SET_OUTPUT(E2_MS2_PIN);
+ #if PIN_EXISTS(E2_MS3)
+ SET_OUTPUT(E2_MS3_PIN);
+ #endif
#endif
#if HAS_E3_MICROSTEPS
SET_OUTPUT(E3_MS1_PIN);
SET_OUTPUT(E3_MS2_PIN);
+ #if PIN_EXISTS(E3_MS3)
+ SET_OUTPUT(E3_MS3_PIN);
+ #endif
#endif
#if HAS_E4_MICROSTEPS
SET_OUTPUT(E4_MS1_PIN);
SET_OUTPUT(E4_MS2_PIN);
+ #if PIN_EXISTS(E4_MS3)
+ SET_OUTPUT(E4_MS3_PIN);
+ #endif
#endif
#if HAS_E5_MICROSTEPS
SET_OUTPUT(E5_MS1_PIN);
SET_OUTPUT(E5_MS2_PIN);
+ #if PIN_EXISTS(E5_MS3)
+ SET_OUTPUT(E5_MS3_PIN);
+ #endif
#endif
static const uint8_t microstep_modes[] = MICROSTEP_MODES;
for (uint16_t i = 0; i < COUNT(microstep_modes); i++)
microstep_mode(i, microstep_modes[i]);
}
- void Stepper::microstep_ms(const uint8_t driver, const int8_t ms1, const int8_t ms2) {
+ void Stepper::microstep_ms(const uint8_t driver, const int8_t ms1, const int8_t ms2, const int8_t ms3) {
if (ms1 >= 0) switch (driver) {
- case 0: WRITE(X_MS1_PIN, ms1); break;
- #if HAS_Y_MICROSTEPS
- case 1: WRITE(Y_MS1_PIN, ms1); break;
+ #if HAS_X_MICROSTEPS || HAS_X2_MICROSTEPS
+ case 0:
+ #if HAS_X_MICROSTEPS
+ WRITE(X_MS1_PIN, ms1);
+ #endif
+ #if HAS_X2_MICROSTEPS
+ WRITE(X2_MS1_PIN, ms1);
+ #endif
+ break;
#endif
- #if HAS_Z_MICROSTEPS
- case 2: WRITE(Z_MS1_PIN, ms1); break;
+ #if HAS_Y_MICROSTEPS || HAS_Y2_MICROSTEPS
+ case 1:
+ #if HAS_Y_MICROSTEPS
+ WRITE(Y_MS1_PIN, ms1);
+ #endif
+ #if HAS_Y2_MICROSTEPS
+ WRITE(Y2_MS1_PIN, ms1);
+ #endif
+ break;
+ #endif
+ #if HAS_Z_MICROSTEPS || HAS_Z2_MICROSTEPS || HAS_Z3_MICROSTEPS
+ case 2:
+ #if HAS_Z_MICROSTEPS
+ WRITE(Z_MS1_PIN, ms1);
+ #endif
+ #if HAS_Z2_MICROSTEPS
+ WRITE(Z2_MS1_PIN, ms1);
+ #endif
+ #if HAS_Z3_MICROSTEPS
+ WRITE(Z3_MS1_PIN, ms1);
+ #endif
+ break;
#endif
#if HAS_E0_MICROSTEPS
case 3: WRITE(E0_MS1_PIN, ms1); break;
@@ -2572,12 +2655,38 @@ void Stepper::report_positions() {
#endif
}
if (ms2 >= 0) switch (driver) {
- case 0: WRITE(X_MS2_PIN, ms2); break;
- #if HAS_Y_MICROSTEPS
- case 1: WRITE(Y_MS2_PIN, ms2); break;
+ #if HAS_X_MICROSTEPS || HAS_X2_MICROSTEPS
+ case 0:
+ #if HAS_X_MICROSTEPS
+ WRITE(X_MS2_PIN, ms2);
+ #endif
+ #if HAS_X2_MICROSTEPS
+ WRITE(X2_MS2_PIN, ms2);
+ #endif
+ break;
#endif
- #if HAS_Z_MICROSTEPS
- case 2: WRITE(Z_MS2_PIN, ms2); break;
+ #if HAS_Y_MICROSTEPS || HAS_Y2_MICROSTEPS
+ case 1:
+ #if HAS_Y_MICROSTEPS
+ WRITE(Y_MS2_PIN, ms2);
+ #endif
+ #if HAS_Y2_MICROSTEPS
+ WRITE(Y2_MS2_PIN, ms2);
+ #endif
+ break;
+ #endif
+ #if HAS_Z_MICROSTEPS || HAS_Z2_MICROSTEPS || HAS_Z3_MICROSTEPS
+ case 2:
+ #if HAS_Z_MICROSTEPS
+ WRITE(Z_MS2_PIN, ms2);
+ #endif
+ #if HAS_Z2_MICROSTEPS
+ WRITE(Z2_MS2_PIN, ms2);
+ #endif
+ #if HAS_Z3_MICROSTEPS
+ WRITE(Z3_MS2_PIN, ms2);
+ #endif
+ break;
#endif
#if HAS_E0_MICROSTEPS
case 3: WRITE(E0_MS2_PIN, ms2); break;
@@ -2598,70 +2707,165 @@ void Stepper::report_positions() {
case 8: WRITE(E5_MS2_PIN, ms2); break;
#endif
}
+ if (ms3 >= 0) switch (driver) {
+ #if HAS_X_MICROSTEPS || HAS_X2_MICROSTEPS
+ case 0:
+ #if HAS_X_MICROSTEPS && PIN_EXISTS(X_MS3)
+ WRITE(X_MS3_PIN, ms3);
+ #endif
+ #if HAS_X2_MICROSTEPS && PIN_EXISTS(X2_MS3)
+ WRITE(X2_MS3_PIN, ms3);
+ #endif
+ break;
+ #endif
+ #if HAS_Y_MICROSTEPS || HAS_Y2_MICROSTEPS
+ case 1:
+ #if HAS_Y_MICROSTEPS && PIN_EXISTS(Y_MS3)
+ WRITE(Y_MS3_PIN, ms3);
+ #endif
+ #if HAS_Y2_MICROSTEPS && PIN_EXISTS(Y2_MS3)
+ WRITE(Y2_MS3_PIN, ms3);
+ #endif
+ break;
+ #endif
+ #if HAS_Z_MICROSTEPS || HAS_Z2_MICROSTEPS || HAS_Z3_MICROSTEPS
+ case 2:
+ #if HAS_Z_MICROSTEPS && PIN_EXISTS(Z_MS3)
+ WRITE(Z_MS3_PIN, ms3);
+ #endif
+ #if HAS_Z2_MICROSTEPS && PIN_EXISTS(Z2_MS3)
+ WRITE(Z2_MS3_PIN, ms3);
+ #endif
+ #if HAS_Z3_MICROSTEPS && PIN_EXISTS(Z3_MS3)
+ WRITE(Z3_MS3_PIN, ms3);
+ #endif
+ break;
+ #endif
+ #if HAS_E0_MICROSTEPS && PIN_EXISTS(E0_MS3)
+ case 3: WRITE(E0_MS3_PIN, ms3); break;
+ #endif
+ #if HAS_E1_MICROSTEPS && PIN_EXISTS(E1_MS3)
+ case 4: WRITE(E1_MS3_PIN, ms3); break;
+ #endif
+ #if HAS_E2_MICROSTEPS && PIN_EXISTS(E2_MS3)
+ case 5: WRITE(E2_MS3_PIN, ms3); break;
+ #endif
+ #if HAS_E3_MICROSTEPS && PIN_EXISTS(E3_MS3)
+ case 6: WRITE(E3_MS3_PIN, ms3); break;
+ #endif
+ #if HAS_E4_MICROSTEPS && PIN_EXISTS(E4_MS3)
+ case 7: WRITE(E4_MS3_PIN, ms3); break;
+ #endif
+ #if HAS_E5_MICROSTEPS && PIN_EXISTS(E5_MS3)
+ case 8: WRITE(E5_MS3_PIN, ms3); break;
+ #endif
+ }
}
void Stepper::microstep_mode(const uint8_t driver, const uint8_t stepping_mode) {
switch (stepping_mode) {
- case 1: microstep_ms(driver, MICROSTEP1); break;
- #if ENABLED(HEROIC_STEPPER_DRIVERS)
- case 128: microstep_ms(driver, MICROSTEP128); break;
- #else
+ #if HAS_MICROSTEP1
+ case 1: microstep_ms(driver, MICROSTEP1); break;
+ #endif
+ #if HAS_MICROSTEP2
case 2: microstep_ms(driver, MICROSTEP2); break;
+ #endif
+ #if HAS_MICROSTEP4
case 4: microstep_ms(driver, MICROSTEP4); break;
#endif
- case 8: microstep_ms(driver, MICROSTEP8); break;
- case 16: microstep_ms(driver, MICROSTEP16); break;
- #if MB(ALLIGATOR)
+ #if HAS_MICROSTEP8
+ case 8: microstep_ms(driver, MICROSTEP8); break;
+ #endif
+ #if HAS_MICROSTEP16
+ case 16: microstep_ms(driver, MICROSTEP16); break;
+ #endif
+ #if HAS_MICROSTEP32
case 32: microstep_ms(driver, MICROSTEP32); break;
#endif
+ #if HAS_MICROSTEP64
+ case 64: microstep_ms(driver, MICROSTEP64); break;
+ #endif
+ #if HAS_MICROSTEP128
+ case 128: microstep_ms(driver, MICROSTEP128); break;
+ #endif
+
default: SERIAL_ERROR_START(); SERIAL_ERRORLNPGM("Microsteps unavailable"); break;
}
}
void Stepper::microstep_readings() {
- SERIAL_PROTOCOLLNPGM("MS1,MS2 Pins");
+ SERIAL_PROTOCOLLNPGM("MS1,MS2,MS3 Pins");
SERIAL_PROTOCOLPGM("X: ");
- SERIAL_PROTOCOL(READ(X_MS1_PIN));
- SERIAL_PROTOCOLLN(READ(X_MS2_PIN));
+ #if HAS_X_MICROSTEPS
+ SERIAL_PROTOCOL(READ(X_MS1_PIN));
+ SERIAL_PROTOCOL(READ(X_MS2_PIN));
+ #if PIN_EXISTS(X_MS3)
+ SERIAL_PROTOCOLLN(READ(X_MS3_PIN));
+ #endif
+ #endif
#if HAS_Y_MICROSTEPS
SERIAL_PROTOCOLPGM("Y: ");
SERIAL_PROTOCOL(READ(Y_MS1_PIN));
- SERIAL_PROTOCOLLN(READ(Y_MS2_PIN));
+ SERIAL_PROTOCOL(READ(Y_MS2_PIN));
+ #if PIN_EXISTS(Y_MS3)
+ SERIAL_PROTOCOLLN(READ(Y_MS3_PIN));
+ #endif
#endif
#if HAS_Z_MICROSTEPS
SERIAL_PROTOCOLPGM("Z: ");
SERIAL_PROTOCOL(READ(Z_MS1_PIN));
- SERIAL_PROTOCOLLN(READ(Z_MS2_PIN));
+ SERIAL_PROTOCOL(READ(Z_MS2_PIN));
+ #if PIN_EXISTS(Z_MS3)
+ SERIAL_PROTOCOLLN(READ(Z_MS3_PIN));
+ #endif
#endif
#if HAS_E0_MICROSTEPS
SERIAL_PROTOCOLPGM("E0: ");
SERIAL_PROTOCOL(READ(E0_MS1_PIN));
- SERIAL_PROTOCOLLN(READ(E0_MS2_PIN));
+ SERIAL_PROTOCOL(READ(E0_MS2_PIN));
+ #if PIN_EXISTS(E0_MS3)
+ SERIAL_PROTOCOLLN(READ(E0_MS3_PIN));
+ #endif
#endif
#if HAS_E1_MICROSTEPS
SERIAL_PROTOCOLPGM("E1: ");
SERIAL_PROTOCOL(READ(E1_MS1_PIN));
- SERIAL_PROTOCOLLN(READ(E1_MS2_PIN));
+ SERIAL_PROTOCOL(READ(E1_MS2_PIN));
+ #if PIN_EXISTS(E1_MS3)
+ SERIAL_PROTOCOLLN(READ(E1_MS3_PIN));
+ #endif
#endif
#if HAS_E2_MICROSTEPS
SERIAL_PROTOCOLPGM("E2: ");
SERIAL_PROTOCOL(READ(E2_MS1_PIN));
- SERIAL_PROTOCOLLN(READ(E2_MS2_PIN));
+ SERIAL_PROTOCOL(READ(E2_MS2_PIN));
+ #if PIN_EXISTS(E2_MS3)
+ SERIAL_PROTOCOLLN(READ(E2_MS3_PIN));
+ #endif
#endif
#if HAS_E3_MICROSTEPS
SERIAL_PROTOCOLPGM("E3: ");
SERIAL_PROTOCOL(READ(E3_MS1_PIN));
- SERIAL_PROTOCOLLN(READ(E3_MS2_PIN));
+ SERIAL_PROTOCOL(READ(E3_MS2_PIN));
+ #if PIN_EXISTS(E3_MS3)
+ SERIAL_PROTOCOLLN(READ(E3_MS3_PIN));
+ #endif
#endif
#if HAS_E4_MICROSTEPS
SERIAL_PROTOCOLPGM("E4: ");
SERIAL_PROTOCOL(READ(E4_MS1_PIN));
- SERIAL_PROTOCOLLN(READ(E4_MS2_PIN));
+ SERIAL_PROTOCOL(READ(E4_MS2_PIN));
+ #if PIN_EXISTS(E4_MS3)
+ SERIAL_PROTOCOLLN(READ(E4_MS3_PIN));
+ #endif
#endif
#if HAS_E5_MICROSTEPS
SERIAL_PROTOCOLPGM("E5: ");
SERIAL_PROTOCOL(READ(E5_MS1_PIN));
SERIAL_PROTOCOLLN(READ(E5_MS2_PIN));
+ #if PIN_EXISTS(E5_MS3)
+ SERIAL_PROTOCOLLN(READ(E5_MS3_PIN));
+ #endif
#endif
}
diff --git a/Marlin/src/module/stepper.h b/Marlin/src/module/stepper.h
index 0ebe1d6e20..95f28dc914 100644
--- a/Marlin/src/module/stepper.h
+++ b/Marlin/src/module/stepper.h
@@ -413,7 +413,7 @@ class Stepper {
#endif
#if HAS_MICROSTEPS
- static void microstep_ms(const uint8_t driver, const int8_t ms1, const int8_t ms2);
+ static void microstep_ms(const uint8_t driver, const int8_t ms1, const int8_t ms2, const int8_t ms3);
static void microstep_mode(const uint8_t driver, const uint8_t stepping);
static void microstep_readings();
#endif
diff --git a/Marlin/src/module/stepper_indirection.cpp b/Marlin/src/module/stepper_indirection.cpp
index d0e829624a..bf0cb7f681 100644
--- a/Marlin/src/module/stepper_indirection.cpp
+++ b/Marlin/src/module/stepper_indirection.cpp
@@ -606,43 +606,43 @@ void reset_stepper_drivers() {
#endif
#if AXIS_IS_TMC(X)
- _TMC_INIT(X, planner.axis_steps_per_mm[X_AXIS]);
+ _TMC_INIT(X, planner.settings.axis_steps_per_mm[X_AXIS]);
#endif
#if AXIS_IS_TMC(X2)
- _TMC_INIT(X2, planner.axis_steps_per_mm[X_AXIS]);
+ _TMC_INIT(X2, planner.settings.axis_steps_per_mm[X_AXIS]);
#endif
#if AXIS_IS_TMC(Y)
- _TMC_INIT(Y, planner.axis_steps_per_mm[Y_AXIS]);
+ _TMC_INIT(Y, planner.settings.axis_steps_per_mm[Y_AXIS]);
#endif
#if AXIS_IS_TMC(Y2)
- _TMC_INIT(Y2, planner.axis_steps_per_mm[Y_AXIS]);
+ _TMC_INIT(Y2, planner.settings.axis_steps_per_mm[Y_AXIS]);
#endif
#if AXIS_IS_TMC(Z)
- _TMC_INIT(Z, planner.axis_steps_per_mm[Z_AXIS]);
+ _TMC_INIT(Z, planner.settings.axis_steps_per_mm[Z_AXIS]);
#endif
#if AXIS_IS_TMC(Z2)
- _TMC_INIT(Z2, planner.axis_steps_per_mm[Z_AXIS]);
+ _TMC_INIT(Z2, planner.settings.axis_steps_per_mm[Z_AXIS]);
#endif
#if AXIS_IS_TMC(Z3)
- _TMC_INIT(Z3, planner.axis_steps_per_mm[Z_AXIS]);
+ _TMC_INIT(Z3, planner.settings.axis_steps_per_mm[Z_AXIS]);
#endif
#if AXIS_IS_TMC(E0)
- _TMC_INIT(E0, planner.axis_steps_per_mm[E_AXIS_N(0)]);
+ _TMC_INIT(E0, planner.settings.axis_steps_per_mm[E_AXIS_N(0)]);
#endif
#if AXIS_IS_TMC(E1)
- _TMC_INIT(E1, planner.axis_steps_per_mm[E_AXIS_N(1)]);
+ _TMC_INIT(E1, planner.settings.axis_steps_per_mm[E_AXIS_N(1)]);
#endif
#if AXIS_IS_TMC(E2)
- _TMC_INIT(E2, planner.axis_steps_per_mm[E_AXIS_N(2)]);
+ _TMC_INIT(E2, planner.settings.axis_steps_per_mm[E_AXIS_N(2)]);
#endif
#if AXIS_IS_TMC(E3)
- _TMC_INIT(E3, planner.axis_steps_per_mm[E_AXIS_N(3)]);
+ _TMC_INIT(E3, planner.settings.axis_steps_per_mm[E_AXIS_N(3)]);
#endif
#if AXIS_IS_TMC(E4)
- _TMC_INIT(E4, planner.axis_steps_per_mm[E_AXIS_N(4)]);
+ _TMC_INIT(E4, planner.settings.axis_steps_per_mm[E_AXIS_N(4)]);
#endif
#if AXIS_IS_TMC(E5)
- _TMC_INIT(E5, planner.axis_steps_per_mm[E_AXIS_N(5)]);
+ _TMC_INIT(E5, planner.settings.axis_steps_per_mm[E_AXIS_N(5)]);
#endif
#if USE_SENSORLESS
diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp
index a64db1f013..322ba1c978 100644
--- a/Marlin/src/module/temperature.cpp
+++ b/Marlin/src/module/temperature.cpp
@@ -52,7 +52,7 @@
#endif
#if ENABLED(PRINTER_EVENT_LEDS)
- #include "../feature/leds/leds.h"
+ #include "../feature/leds/printer_event_leds.h"
#endif
#if HOTEND_USES_THERMISTOR
@@ -116,13 +116,7 @@ int16_t Temperature::current_temperature_raw[HOTENDS] = { 0 },
millis_t Temperature::watch_bed_next_ms = 0;
#endif
#if ENABLED(PIDTEMPBED)
- float Temperature::bedKp, Temperature::bedKi, Temperature::bedKd, // Initialized by settings.load()
- Temperature::temp_iState_bed = { 0 },
- Temperature::temp_dState_bed = { 0 },
- Temperature::pTerm_bed,
- Temperature::iTerm_bed,
- Temperature::dTerm_bed,
- Temperature::pid_error_bed;
+ PID_t Temperature::bed_pid; // Initialized by settings.load()
#else
millis_t Temperature::next_bed_check_ms;
#endif
@@ -141,17 +135,7 @@ int16_t Temperature::current_temperature_raw[HOTENDS] = { 0 },
// Initialized by settings.load()
#if ENABLED(PIDTEMP)
- #if ENABLED(PID_PARAMS_PER_HOTEND) && HOTENDS > 1
- float Temperature::Kp[HOTENDS], Temperature::Ki[HOTENDS], Temperature::Kd[HOTENDS];
- #if ENABLED(PID_EXTRUSION_SCALING)
- float Temperature::Kc[HOTENDS];
- #endif
- #else
- float Temperature::Kp, Temperature::Ki, Temperature::Kd;
- #if ENABLED(PID_EXTRUSION_SCALING)
- float Temperature::Kc;
- #endif
- #endif
+ hotend_pid_t Temperature::pid[HOTENDS];
#endif
#if ENABLED(BABYSTEPPING)
@@ -182,21 +166,11 @@ int16_t Temperature::current_temperature_raw[HOTENDS] = { 0 },
volatile bool Temperature::temp_meas_ready = false;
#if ENABLED(PIDTEMP)
- float Temperature::temp_iState[HOTENDS] = { 0 },
- Temperature::temp_dState[HOTENDS] = { 0 },
- Temperature::pTerm[HOTENDS],
- Temperature::iTerm[HOTENDS],
- Temperature::dTerm[HOTENDS];
-
#if ENABLED(PID_EXTRUSION_SCALING)
- float Temperature::cTerm[HOTENDS];
long Temperature::last_e_position;
long Temperature::lpq[LPQ_MAX_LEN];
int Temperature::lpq_ptr = 0;
#endif
-
- float Temperature::pid_error[HOTENDS];
- bool Temperature::pid_reset[HOTENDS];
#endif
uint16_t Temperature::raw_temp_value[MAX_EXTRUDERS] = { 0 };
@@ -254,6 +228,8 @@ uint8_t Temperature::soft_pwm_amount[HOTENDS];
#if HAS_PID_HEATING
+ inline void say_default_() { SERIAL_PROTOCOLPGM("#define DEFAULT_"); }
+
/**
* PID Autotuning (M303)
*
@@ -269,19 +245,24 @@ uint8_t Temperature::soft_pwm_amount[HOTENDS];
long t_high = 0, t_low = 0;
long bias, d;
- float Ku, Tu,
- workKp = 0, workKi = 0, workKd = 0,
- max = 0, min = 10000;
+ PID_t tune_pid = { 0, 0, 0 };
+ float max = 0, min = 10000;
#if HAS_PID_FOR_BOTH
#define GHV(B,H) (hotend < 0 ? (B) : (H))
- #define SHV(S,B,H) if (hotend < 0) S##_bed = B; else S [hotend] = H;
+ #define SHV(S,B,H) do{ if (hotend < 0) S##_bed = B; else S [hotend] = H; }while(0)
+ #define ONHEATINGSTART() do{ if (hotend < 0) printerEventLEDs.onBedHeatingStart(); else printerEventLEDs.onHotendHeatingStart(); }while(0)
+ #define ONHEATING(S,C,T) do{ if (hotend < 0) printerEventLEDs.onBedHeating(S,C,T); else printerEventLEDs.onHotendHeating(S,C,T); }while(0)
#elif ENABLED(PIDTEMPBED)
#define GHV(B,H) B
#define SHV(S,B,H) (S##_bed = B)
+ #define ONHEATINGSTART() printerEventLEDs.onBedHeatingStart()
+ #define ONHEATING(S,C,T) printerEventLEDs.onBedHeating(S,C,T)
#else
#define GHV(B,H) H
#define SHV(S,B,H) (S [hotend] = H)
+ #define ONHEATINGSTART() printerEventLEDs.onHotendHeatingStart()
+ #define ONHEATING(S,C,T) printerEventLEDs.onHotendHeating(S,C,T)
#endif
#if WATCH_THE_BED || WATCH_HOTENDS
@@ -328,6 +309,10 @@ uint8_t Temperature::soft_pwm_amount[HOTENDS];
SHV(soft_pwm_amount, bias = d = (MAX_BED_POWER) >> 1, bias = d = (PID_MAX) >> 1);
wait_for_heatup = true; // Can be interrupted with M108
+ #if ENABLED(PRINTER_EVENT_LEDS)
+ const float start_temp = GHV(current_temperature_bed, current_temperature[hotend]);
+ ONHEATINGSTART();
+ #endif
// PID Tuning loop
while (wait_for_heatup) {
@@ -342,6 +327,10 @@ uint8_t Temperature::soft_pwm_amount[HOTENDS];
NOLESS(max, current);
NOMORE(min, current);
+ #if ENABLED(PRINTER_EVENT_LEDS)
+ ONHEATING(start_temp, current, target);
+ #endif
+
#if HAS_AUTO_FAN
if (ELAPSED(ms, next_auto_fan_check_ms)) {
checkExtruderAutoFans();
@@ -375,32 +364,32 @@ uint8_t Temperature::soft_pwm_amount[HOTENDS];
SERIAL_PROTOCOLPAIR(MSG_T_MIN, min);
SERIAL_PROTOCOLPAIR(MSG_T_MAX, max);
if (cycles > 2) {
- Ku = (4.0f * d) / (float(M_PI) * (max - min) * 0.5f);
- Tu = ((float)(t_low + t_high) * 0.001f);
+ float Ku = (4.0f * d) / (float(M_PI) * (max - min) * 0.5f),
+ Tu = ((float)(t_low + t_high) * 0.001f);
SERIAL_PROTOCOLPAIR(MSG_KU, Ku);
SERIAL_PROTOCOLPAIR(MSG_TU, Tu);
- workKp = 0.6f * Ku;
- workKi = 2 * workKp / Tu;
- workKd = workKp * Tu * 0.125f;
+ tune_pid.Kp = 0.6f * Ku;
+ tune_pid.Ki = 2 * tune_pid.Kp / Tu;
+ tune_pid.Kd = tune_pid.Kp * Tu * 0.125f;
SERIAL_PROTOCOLLNPGM("\n" MSG_CLASSIC_PID);
- SERIAL_PROTOCOLPAIR(MSG_KP, workKp);
- SERIAL_PROTOCOLPAIR(MSG_KI, workKi);
- SERIAL_PROTOCOLLNPAIR(MSG_KD, workKd);
+ SERIAL_PROTOCOLPAIR(MSG_KP, tune_pid.Kp);
+ SERIAL_PROTOCOLPAIR(MSG_KI, tune_pid.Ki);
+ SERIAL_PROTOCOLLNPAIR(MSG_KD, tune_pid.Kd);
/**
- workKp = 0.33*Ku;
- workKi = workKp/Tu;
- workKd = workKp*Tu/3;
+ tune_pid.Kp = 0.33*Ku;
+ tune_pid.Ki = tune_pid.Kp/Tu;
+ tune_pid.Kd = tune_pid.Kp*Tu/3;
SERIAL_PROTOCOLLNPGM(" Some overshoot");
- SERIAL_PROTOCOLPAIR(" Kp: ", workKp);
- SERIAL_PROTOCOLPAIR(" Ki: ", workKi);
- SERIAL_PROTOCOLPAIR(" Kd: ", workKd);
- workKp = 0.2*Ku;
- workKi = 2*workKp/Tu;
- workKd = workKp*Tu/3;
+ SERIAL_PROTOCOLPAIR(" Kp: ", tune_pid.Kp);
+ SERIAL_PROTOCOLPAIR(" Ki: ", tune_pid.Ki);
+ SERIAL_PROTOCOLPAIR(" Kd: ", tune_pid.Kd);
+ tune_pid.Kp = 0.2*Ku;
+ tune_pid.Ki = 2*tune_pid.Kp/Tu;
+ tune_pid.Kd = tune_pid.Kp*Tu/3;
SERIAL_PROTOCOLLNPGM(" No overshoot");
- SERIAL_PROTOCOLPAIR(" Kp: ", workKp);
- SERIAL_PROTOCOLPAIR(" Ki: ", workKi);
- SERIAL_PROTOCOLPAIR(" Kd: ", workKd);
+ SERIAL_PROTOCOLPAIR(" Kp: ", tune_pid.Kp);
+ SERIAL_PROTOCOLPAIR(" Ki: ", tune_pid.Ki);
+ SERIAL_PROTOCOLPAIR(" Kd: ", tune_pid.Kd);
*/
}
}
@@ -467,39 +456,36 @@ uint8_t Temperature::soft_pwm_amount[HOTENDS];
SERIAL_PROTOCOLLNPGM(MSG_PID_AUTOTUNE_FINISHED);
#if HAS_PID_FOR_BOTH
- const char* estring = GHV("bed", "");
- SERIAL_PROTOCOLPAIR("#define DEFAULT_", estring); SERIAL_PROTOCOLPAIR("Kp ", workKp); SERIAL_EOL();
- SERIAL_PROTOCOLPAIR("#define DEFAULT_", estring); SERIAL_PROTOCOLPAIR("Ki ", workKi); SERIAL_EOL();
- SERIAL_PROTOCOLPAIR("#define DEFAULT_", estring); SERIAL_PROTOCOLPAIR("Kd ", workKd); SERIAL_EOL();
+ const char * const estring = GHV(PSTR("bed"), PSTR(""));
+ say_default_(); serialprintPGM(estring); SERIAL_PROTOCOLLNPAIR("Kp ", tune_pid.Kp);
+ say_default_(); serialprintPGM(estring); SERIAL_PROTOCOLLNPAIR("Ki ", tune_pid.Ki);
+ say_default_(); serialprintPGM(estring); SERIAL_PROTOCOLLNPAIR("Kd ", tune_pid.Kd);
#elif ENABLED(PIDTEMP)
- SERIAL_PROTOCOLPAIR("#define DEFAULT_Kp ", workKp); SERIAL_EOL();
- SERIAL_PROTOCOLPAIR("#define DEFAULT_Ki ", workKi); SERIAL_EOL();
- SERIAL_PROTOCOLPAIR("#define DEFAULT_Kd ", workKd); SERIAL_EOL();
+ say_default_(); SERIAL_PROTOCOLLNPAIR("Kp ", tune_pid.Kp);
+ say_default_(); SERIAL_PROTOCOLLNPAIR("Ki ", tune_pid.Ki);
+ say_default_(); SERIAL_PROTOCOLLNPAIR("Kd ", tune_pid.Kd);
#else
- SERIAL_PROTOCOLPAIR("#define DEFAULT_bedKp ", workKp); SERIAL_EOL();
- SERIAL_PROTOCOLPAIR("#define DEFAULT_bedKi ", workKi); SERIAL_EOL();
- SERIAL_PROTOCOLPAIR("#define DEFAULT_bedKd ", workKd); SERIAL_EOL();
+ say_default_(); SERIAL_PROTOCOLLNPAIR("bedKp ", tune_pid.Kp);
+ say_default_(); SERIAL_PROTOCOLLNPAIR("bedKi ", tune_pid.Ki);
+ say_default_(); SERIAL_PROTOCOLLNPAIR("bedKd ", tune_pid.Kd);
#endif
#define _SET_BED_PID() do { \
- bedKp = workKp; \
- bedKi = scalePID_i(workKi); \
- bedKd = scalePID_d(workKd); \
+ bed_pid.Kp = tune_pid.Kp; \
+ bed_pid.Ki = scalePID_i(tune_pid.Ki); \
+ bed_pid.Kd = scalePID_d(tune_pid.Kd); \
}while(0)
#define _SET_EXTRUDER_PID() do { \
- PID_PARAM(Kp, hotend) = workKp; \
- PID_PARAM(Ki, hotend) = scalePID_i(workKi); \
- PID_PARAM(Kd, hotend) = scalePID_d(workKd); \
+ PID_PARAM(Kp, hotend) = tune_pid.Kp; \
+ PID_PARAM(Ki, hotend) = scalePID_i(tune_pid.Ki); \
+ PID_PARAM(Kd, hotend) = scalePID_d(tune_pid.Kd); \
updatePID(); }while(0)
// Use the result? (As with "M303 U1")
if (set_result) {
#if HAS_PID_FOR_BOTH
- if (hotend < 0)
- _SET_BED_PID();
- else
- _SET_EXTRUDER_PID();
+ if (hotend < 0) _SET_BED_PID(); else _SET_EXTRUDER_PID();
#elif ENABLED(PIDTEMP)
_SET_EXTRUDER_PID();
#else
@@ -511,6 +497,9 @@ uint8_t Temperature::soft_pwm_amount[HOTENDS];
lcd_update();
}
disable_all_heaters();
+ #if ENABLED(PRINTER_EVENT_LEDS)
+ printerEventLEDs.onHeatersOff();
+ #endif
}
#endif // HAS_PID_HEATING
@@ -612,15 +601,19 @@ void Temperature::min_temp_error(const int8_t e) {
float Temperature::get_pid_output(const int8_t e) {
#if HOTENDS == 1
UNUSED(e);
- #define _HOTEND_TEST true
+ #define _HOTEND_TEST true
#else
- #define _HOTEND_TEST e == active_extruder
+ #define _HOTEND_TEST (e == active_extruder)
#endif
- float pid_output;
#if ENABLED(PIDTEMP)
#if DISABLED(PID_OPENLOOP)
- pid_error[HOTEND_INDEX] = target_temperature[HOTEND_INDEX] - current_temperature[HOTEND_INDEX];
- dTerm[HOTEND_INDEX] = PID_K2 * PID_PARAM(Kd, HOTEND_INDEX) * (current_temperature[HOTEND_INDEX] - temp_dState[HOTEND_INDEX]) + float(PID_K1) * dTerm[HOTEND_INDEX];
+ static hotend_pid_t work_pid[HOTENDS];
+ static float temp_iState[HOTENDS] = { 0 },
+ temp_dState[HOTENDS] = { 0 };
+ static bool pid_reset[HOTENDS] = { false };
+ float pid_output,
+ pid_error = target_temperature[HOTEND_INDEX] - current_temperature[HOTEND_INDEX];
+ work_pid[HOTEND_INDEX].Kd = PID_K2 * PID_PARAM(Kd, HOTEND_INDEX) * (current_temperature[HOTEND_INDEX] - temp_dState[HOTEND_INDEX]) + float(PID_K1) * work_pid[HOTEND_INDEX].Kd;
temp_dState[HOTEND_INDEX] = current_temperature[HOTEND_INDEX];
#if HEATER_IDLE_HANDLER
if (heater_idle_timeout_exceeded[HOTEND_INDEX]) {
@@ -629,57 +622,60 @@ float Temperature::get_pid_output(const int8_t e) {
}
else
#endif
- if (pid_error[HOTEND_INDEX] > PID_FUNCTIONAL_RANGE) {
- pid_output = BANG_MAX;
- pid_reset[HOTEND_INDEX] = true;
- }
- else if (pid_error[HOTEND_INDEX] < -(PID_FUNCTIONAL_RANGE) || target_temperature[HOTEND_INDEX] == 0
- #if HEATER_IDLE_HANDLER
- || heater_idle_timeout_exceeded[HOTEND_INDEX]
- #endif
- ) {
- pid_output = 0;
- pid_reset[HOTEND_INDEX] = true;
- }
- else {
- if (pid_reset[HOTEND_INDEX]) {
- temp_iState[HOTEND_INDEX] = 0.0;
- pid_reset[HOTEND_INDEX] = false;
- }
- pTerm[HOTEND_INDEX] = PID_PARAM(Kp, HOTEND_INDEX) * pid_error[HOTEND_INDEX];
- temp_iState[HOTEND_INDEX] += pid_error[HOTEND_INDEX];
- iTerm[HOTEND_INDEX] = PID_PARAM(Ki, HOTEND_INDEX) * temp_iState[HOTEND_INDEX];
-
- pid_output = pTerm[HOTEND_INDEX] + iTerm[HOTEND_INDEX] - dTerm[HOTEND_INDEX];
-
- #if ENABLED(PID_EXTRUSION_SCALING)
- cTerm[HOTEND_INDEX] = 0;
- if (_HOTEND_TEST) {
- const long e_position = stepper.position(E_AXIS);
- if (e_position > last_e_position) {
- lpq[lpq_ptr] = e_position - last_e_position;
- last_e_position = e_position;
- }
- else
- lpq[lpq_ptr] = 0;
-
- if (++lpq_ptr >= lpq_len) lpq_ptr = 0;
- cTerm[HOTEND_INDEX] = (lpq[lpq_ptr] * planner.steps_to_mm[E_AXIS]) * PID_PARAM(Kc, HOTEND_INDEX);
- pid_output += cTerm[HOTEND_INDEX];
+ if (pid_error > PID_FUNCTIONAL_RANGE) {
+ pid_output = BANG_MAX;
+ pid_reset[HOTEND_INDEX] = true;
}
- #endif // PID_EXTRUSION_SCALING
+ else if (pid_error < -(PID_FUNCTIONAL_RANGE) || target_temperature[HOTEND_INDEX] == 0
+ #if HEATER_IDLE_HANDLER
+ || heater_idle_timeout_exceeded[HOTEND_INDEX]
+ #endif
+ ) {
+ pid_output = 0;
+ pid_reset[HOTEND_INDEX] = true;
+ }
+ else {
+ if (pid_reset[HOTEND_INDEX]) {
+ temp_iState[HOTEND_INDEX] = 0.0;
+ pid_reset[HOTEND_INDEX] = false;
+ }
+ temp_iState[HOTEND_INDEX] += pid_error;
+ work_pid[HOTEND_INDEX].Kp = PID_PARAM(Kp, HOTEND_INDEX) * pid_error;
+ work_pid[HOTEND_INDEX].Ki = PID_PARAM(Ki, HOTEND_INDEX) * temp_iState[HOTEND_INDEX];
+
+ pid_output = work_pid[HOTEND_INDEX].Kp + work_pid[HOTEND_INDEX].Ki - work_pid[HOTEND_INDEX].Kd;
+
+ #if ENABLED(PID_EXTRUSION_SCALING)
+ work_pid[HOTEND_INDEX].Kc = 0;
+ if (_HOTEND_TEST) {
+ const long e_position = stepper.position(E_AXIS);
+ if (e_position > last_e_position) {
+ lpq[lpq_ptr] = e_position - last_e_position;
+ last_e_position = e_position;
+ }
+ else
+ lpq[lpq_ptr] = 0;
+
+ if (++lpq_ptr >= lpq_len) lpq_ptr = 0;
+ work_pid[HOTEND_INDEX].Kc = (lpq[lpq_ptr] * planner.steps_to_mm[E_AXIS]) * PID_PARAM(Kc, HOTEND_INDEX);
+ pid_output += work_pid[HOTEND_INDEX].Kc;
+ }
+ #endif // PID_EXTRUSION_SCALING
+
+ if (pid_output > PID_MAX) {
+ if (pid_error > 0) temp_iState[HOTEND_INDEX] -= pid_error; // conditional un-integration
+ pid_output = PID_MAX;
+ }
+ else if (pid_output < 0) {
+ if (pid_error < 0) temp_iState[HOTEND_INDEX] -= pid_error; // conditional un-integration
+ pid_output = 0;
+ }
+ }
+
+ #else // PID_OPENLOOP
+
+ const float pid_output = constrain(target_temperature[HOTEND_INDEX], 0, PID_MAX);
- if (pid_output > PID_MAX) {
- if (pid_error[HOTEND_INDEX] > 0) temp_iState[HOTEND_INDEX] -= pid_error[HOTEND_INDEX]; // conditional un-integration
- pid_output = PID_MAX;
- }
- else if (pid_output < 0) {
- if (pid_error[HOTEND_INDEX] < 0) temp_iState[HOTEND_INDEX] -= pid_error[HOTEND_INDEX]; // conditional un-integration
- pid_output = 0;
- }
- }
- #else
- pid_output = constrain(target_temperature[HOTEND_INDEX], 0, PID_MAX);
#endif // PID_OPENLOOP
#if ENABLED(PID_DEBUG)
@@ -687,11 +683,13 @@ float Temperature::get_pid_output(const int8_t e) {
SERIAL_ECHOPAIR(MSG_PID_DEBUG, HOTEND_INDEX);
SERIAL_ECHOPAIR(MSG_PID_DEBUG_INPUT, current_temperature[HOTEND_INDEX]);
SERIAL_ECHOPAIR(MSG_PID_DEBUG_OUTPUT, pid_output);
- SERIAL_ECHOPAIR(MSG_PID_DEBUG_PTERM, pTerm[HOTEND_INDEX]);
- SERIAL_ECHOPAIR(MSG_PID_DEBUG_ITERM, iTerm[HOTEND_INDEX]);
- SERIAL_ECHOPAIR(MSG_PID_DEBUG_DTERM, dTerm[HOTEND_INDEX]);
- #if ENABLED(PID_EXTRUSION_SCALING)
- SERIAL_ECHOPAIR(MSG_PID_DEBUG_CTERM, cTerm[HOTEND_INDEX]);
+ #if DISABLED(PID_OPENLOOP)
+ SERIAL_ECHOPAIR(MSG_PID_DEBUG_PTERM, work_pid[HOTEND_INDEX].Kp);
+ SERIAL_ECHOPAIR(MSG_PID_DEBUG_ITERM, work_pid[HOTEND_INDEX].Ki);
+ SERIAL_ECHOPAIR(MSG_PID_DEBUG_DTERM, work_pid[HOTEND_INDEX].Kd);
+ #if ENABLED(PID_EXTRUSION_SCALING)
+ SERIAL_ECHOPAIR(MSG_PID_DEBUG_CTERM, work_pid[HOTEND_INDEX].Kc);
+ #endif
#endif
SERIAL_EOL();
#endif // PID_DEBUG
@@ -709,47 +707,52 @@ float Temperature::get_pid_output(const int8_t e) {
}
#if ENABLED(PIDTEMPBED)
+
float Temperature::get_pid_output_bed() {
- float pid_output;
+
#if DISABLED(PID_OPENLOOP)
- pid_error_bed = target_temperature_bed - current_temperature_bed;
- pTerm_bed = bedKp * pid_error_bed;
- temp_iState_bed += pid_error_bed;
- iTerm_bed = bedKi * temp_iState_bed;
- dTerm_bed = PID_K2 * bedKd * (current_temperature_bed - temp_dState_bed) + PID_K1 * dTerm_bed;
- temp_dState_bed = current_temperature_bed;
+ static PID_t work_pid = { 0 };
+ static float temp_iState = 0, temp_dState = 0;
- pid_output = pTerm_bed + iTerm_bed - dTerm_bed;
+ float pid_error = target_temperature_bed - current_temperature_bed;
+ temp_iState += pid_error;
+ work_pid.Kp = bed_pid.Kp * pid_error;
+ work_pid.Ki = bed_pid.Ki * temp_iState;
+ work_pid.Kd = PID_K2 * bed_pid.Kd * (current_temperature_bed - temp_dState) + PID_K1 * work_pid.Kd;
+
+ temp_dState = current_temperature_bed;
+
+ float pid_output = work_pid.Kp + work_pid.Ki - work_pid.Kd;
if (pid_output > MAX_BED_POWER) {
- if (pid_error_bed > 0) temp_iState_bed -= pid_error_bed; // conditional un-integration
+ if (pid_error > 0) temp_iState -= pid_error; // conditional un-integration
pid_output = MAX_BED_POWER;
}
else if (pid_output < 0) {
- if (pid_error_bed < 0) temp_iState_bed -= pid_error_bed; // conditional un-integration
+ if (pid_error < 0) temp_iState -= pid_error; // conditional un-integration
pid_output = 0;
}
- #else
- pid_output = constrain(target_temperature_bed, 0, MAX_BED_POWER);
+
+ #else // PID_OPENLOOP
+
+ const float pid_output = constrain(target_temperature_bed, 0, MAX_BED_POWER);
+
#endif // PID_OPENLOOP
#if ENABLED(PID_BED_DEBUG)
SERIAL_ECHO_START();
- SERIAL_ECHOPGM(" PID_BED_DEBUG ");
- SERIAL_ECHOPGM(": Input ");
- SERIAL_ECHO(current_temperature_bed);
- SERIAL_ECHOPGM(" Output ");
- SERIAL_ECHO(pid_output);
- SERIAL_ECHOPGM(" pTerm ");
- SERIAL_ECHO(pTerm_bed);
- SERIAL_ECHOPGM(" iTerm ");
- SERIAL_ECHO(iTerm_bed);
- SERIAL_ECHOPGM(" dTerm ");
- SERIAL_ECHOLN(dTerm_bed);
- #endif // PID_BED_DEBUG
+ SERIAL_ECHOPAIR(" PID_BED_DEBUG : Input ", current_temperature_bed);
+ SERIAL_ECHOPAIR(" Output ", pid_output);
+ #if DISABLED(PID_OPENLOOP)
+ SERIAL_ECHOPAIR(MSG_PID_DEBUG_PTERM, work_pid.Kp);
+ SERIAL_ECHOPAIR(MSG_PID_DEBUG_ITERM, work_pid.Ki);
+ SERIAL_ECHOLNPAIR(MSG_PID_DEBUG_DTERM, work_pid.Kd);
+ #endif
+ #endif
return pid_output;
}
+
#endif // PIDTEMPBED
/**
@@ -2453,7 +2456,7 @@ void Temperature::isr() {
#if ENABLED(PRINTER_EVENT_LEDS)
const float start_temp = degHotend(target_extruder);
- uint8_t old_blue = 0;
+ printerEventLEDs.onHotendHeatingStart();
#endif
float target_temp = -1.0, old_temp = 9999.0;
@@ -2491,18 +2494,7 @@ void Temperature::isr() {
#if ENABLED(PRINTER_EVENT_LEDS)
// Gradually change LED strip from violet to red as nozzle heats up
- if (!wants_to_cool) {
- const uint8_t blue = map(constrain(temp, start_temp, target_temp), start_temp, target_temp, 255, 0);
- if (blue != old_blue) {
- old_blue = blue;
- leds.set_color(
- MakeLEDColor(255, 0, blue, 0, pixels.getBrightness())
- #if ENABLED(NEOPIXEL_IS_SEQUENTIAL)
- , true
- #endif
- );
- }
- }
+ if (!wants_to_cool) printerEventLEDs.onHotendHeating(start_temp, temp, target_temp);
#endif
#if TEMP_RESIDENCY_TIME > 0
@@ -2536,7 +2528,7 @@ void Temperature::isr() {
if (wait_for_heatup) {
lcd_reset_status();
#if ENABLED(PRINTER_EVENT_LEDS)
- leds.set_white();
+ printerEventLEDs.onHeated();
#endif
}
@@ -2582,7 +2574,7 @@ void Temperature::isr() {
#if ENABLED(PRINTER_EVENT_LEDS)
const float start_temp = degBed();
- uint8_t old_red = 127;
+ printerEventLEDs.onBedHeatingStart();
#endif
do {
@@ -2616,18 +2608,7 @@ void Temperature::isr() {
#if ENABLED(PRINTER_EVENT_LEDS)
// Gradually change LED strip from blue to violet as bed heats up
- if (!wants_to_cool) {
- const uint8_t red = map(constrain(temp, start_temp, target_temp), start_temp, target_temp, 0, 255);
- if (red != old_red) {
- old_red = red;
- leds.set_color(
- MakeLEDColor(red, 0, 255, 0, pixels.getBrightness())
- #if ENABLED(NEOPIXEL_IS_SEQUENTIAL)
- , true
- #endif
- );
- }
- }
+ if (!wants_to_cool) printerEventLEDs.onBedHeating(start_temp, temp, target_temp);
#endif
#if TEMP_BED_RESIDENCY_TIME > 0
diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h
index 870345a342..6baeacf24c 100644
--- a/Marlin/src/module/temperature.h
+++ b/Marlin/src/module/temperature.h
@@ -48,6 +48,35 @@
#define HOTEND_INDEX e
#endif
+// PID storage
+typedef struct { float Kp, Ki, Kd; } PID_t;
+typedef struct { float Kp, Ki, Kd, Kc; } PIDC_t;
+#if ENABLED(PID_EXTRUSION_SCALING)
+ typedef PIDC_t hotend_pid_t;
+#else
+ typedef PID_t hotend_pid_t;
+#endif
+
+#define DUMMY_PID_VALUE 3000.0f
+
+#if ENABLED(PIDTEMP)
+ #define _PID_Kp(H) Temperature::pid[H].Kp
+ #define _PID_Ki(H) Temperature::pid[H].Ki
+ #define _PID_Kd(H) Temperature::pid[H].Kd
+ #if ENABLED(PID_EXTRUSION_SCALING)
+ #define _PID_Kc(H) Temperature::pid[H].Kc
+ #else
+ #define _PID_Kc(H) 1
+ #endif
+#else
+ #define _PID_Kp(H) DUMMY_PID_VALUE
+ #define _PID_Ki(H) DUMMY_PID_VALUE
+ #define _PID_Kd(H) DUMMY_PID_VALUE
+ #define _PID_Kc(H) 1
+#endif
+
+#define PID_PARAM(F,H) _PID_##F(H)
+
/**
* States for ADC reading in the ISR
*/
@@ -132,25 +161,7 @@ class Temperature {
#endif
#if ENABLED(PIDTEMP)
-
- #if ENABLED(PID_PARAMS_PER_HOTEND) && HOTENDS > 1
-
- static float Kp[HOTENDS], Ki[HOTENDS], Kd[HOTENDS];
- #if ENABLED(PID_EXTRUSION_SCALING)
- static float Kc[HOTENDS];
- #endif
- #define PID_PARAM(param, h) Temperature::param[h]
-
- #else
-
- static float Kp, Ki, Kd;
- #if ENABLED(PID_EXTRUSION_SCALING)
- static float Kc;
- #endif
- #define PID_PARAM(param, h) Temperature::param
-
- #endif // PID_PARAMS_PER_HOTEND
-
+ static hotend_pid_t pid[HOTENDS];
#endif
#if HAS_HEATED_BED
@@ -158,7 +169,7 @@ class Temperature {
static int16_t current_temperature_bed_raw, target_temperature_bed;
static uint8_t soft_pwm_amount_bed;
#if ENABLED(PIDTEMPBED)
- static float bedKp, bedKi, bedKd;
+ static PID_t bed_pid;
#endif
#endif
@@ -210,21 +221,11 @@ class Temperature {
#endif
#if ENABLED(PIDTEMP)
- static float temp_iState[HOTENDS],
- temp_dState[HOTENDS],
- pTerm[HOTENDS],
- iTerm[HOTENDS],
- dTerm[HOTENDS];
-
#if ENABLED(PID_EXTRUSION_SCALING)
- static float cTerm[HOTENDS];
static long last_e_position;
static long lpq[LPQ_MAX_LEN];
static int lpq_ptr;
#endif
-
- static float pid_error[HOTENDS];
- static bool pid_reset[HOTENDS];
#endif
// Init min and max temp with extreme values to prevent false errors during startup
@@ -239,14 +240,7 @@ class Temperature {
static uint16_t watch_target_bed_temp;
static millis_t watch_bed_next_ms;
#endif
- #if ENABLED(PIDTEMPBED)
- static float temp_iState_bed,
- temp_dState_bed,
- pTerm_bed,
- iTerm_bed,
- dTerm_bed,
- pid_error_bed;
- #else
+ #if DISABLED(PIDTEMPBED)
static millis_t next_bed_check_ms;
#endif
#if HEATER_IDLE_HANDLER
diff --git a/Marlin/src/module/tool_change.cpp b/Marlin/src/module/tool_change.cpp
index 98431fe4eb..fcb6762c3d 100644
--- a/Marlin/src/module/tool_change.cpp
+++ b/Marlin/src/module/tool_change.cpp
@@ -30,9 +30,7 @@
#include "../Marlin.h"
#if ENABLED(SINGLENOZZLE)
- float singlenozzle_swap_length = SINGLENOZZLE_SWAP_LENGTH;
- int16_t singlenozzle_prime_speed = SINGLENOZZLE_SWAP_PRIME_SPEED,
- singlenozzle_retract_speed = SINGLENOZZLE_SWAP_RETRACT_SPEED;
+ singlenozzle_settings_t sn_settings; // Initialized by settings.load()
uint16_t singlenozzle_temp[EXTRUDERS];
#if FAN_COUNT > 0
uint8_t singlenozzle_fan_speed[EXTRUDERS];
@@ -152,7 +150,7 @@
#if ENABLED(DEBUG_LEVELING_FEATURE)
if (DEBUGGING(LEVELING)) DEBUG_POS("(1) Raise Z-Axis", current_position);
#endif
- planner.buffer_line(current_position, planner.max_feedrate_mm_s[Z_AXIS], active_extruder);
+ planner.buffer_line(current_position, planner.settings.max_feedrate_mm_s[Z_AXIS], active_extruder);
planner.synchronize();
// STEP 2
@@ -163,7 +161,7 @@
DEBUG_POS("Moving ParkPos", current_position);
}
#endif
- planner.buffer_line(current_position, planner.max_feedrate_mm_s[X_AXIS], active_extruder);
+ planner.buffer_line(current_position, planner.settings.max_feedrate_mm_s[X_AXIS], active_extruder);
planner.synchronize();
// STEP 3
@@ -181,7 +179,7 @@
#if ENABLED(DEBUG_LEVELING_FEATURE)
if (DEBUGGING(LEVELING)) DEBUG_POS("Move away from parked extruder", current_position);
#endif
- planner.buffer_line(current_position, planner.max_feedrate_mm_s[X_AXIS], active_extruder);
+ planner.buffer_line(current_position, planner.settings.max_feedrate_mm_s[X_AXIS], active_extruder);
planner.synchronize();
// STEP 5
@@ -196,12 +194,12 @@
// STEP 6
current_position[X_AXIS] = grabpos + (tmp_extruder ? -10 : 10);
- planner.buffer_line(current_position, planner.max_feedrate_mm_s[X_AXIS], active_extruder);
+ planner.buffer_line(current_position, planner.settings.max_feedrate_mm_s[X_AXIS], active_extruder);
current_position[X_AXIS] = grabpos;
#if ENABLED(DEBUG_LEVELING_FEATURE)
if (DEBUGGING(LEVELING)) DEBUG_POS("(6) Unpark extruder", current_position);
#endif
- planner.buffer_line(current_position, planner.max_feedrate_mm_s[X_AXIS]/2, active_extruder);
+ planner.buffer_line(current_position, planner.settings.max_feedrate_mm_s[X_AXIS]/2, active_extruder);
planner.synchronize();
// Step 7
@@ -209,7 +207,7 @@
#if ENABLED(DEBUG_LEVELING_FEATURE)
if (DEBUGGING(LEVELING)) DEBUG_POS("(7) Move midway between hotends", current_position);
#endif
- planner.buffer_line(current_position, planner.max_feedrate_mm_s[X_AXIS], active_extruder);
+ planner.buffer_line(current_position, planner.settings.max_feedrate_mm_s[X_AXIS], active_extruder);
planner.synchronize();
#if ENABLED(DEBUG_LEVELING_FEATURE)
SERIAL_ECHOLNPGM("Autopark done.");
@@ -259,7 +257,7 @@
#if ENABLED(DEBUG_LEVELING_FEATURE)
if (DEBUGGING(LEVELING)) DEBUG_POS("(1) Raise Z-Axis", current_position);
#endif
- planner.buffer_line(current_position, planner.max_feedrate_mm_s[Z_AXIS], active_extruder);
+ planner.buffer_line(current_position, planner.settings.max_feedrate_mm_s[Z_AXIS], active_extruder);
planner.synchronize();
// STEP 2
@@ -270,14 +268,14 @@
DEBUG_POS("Move X SwitchPos", current_position);
}
#endif
- planner.buffer_line(current_position, planner.max_feedrate_mm_s[X_AXIS], active_extruder);
+ planner.buffer_line(current_position, planner.settings.max_feedrate_mm_s[X_AXIS], active_extruder);
planner.synchronize();
current_position[Y_AXIS] = SWITCHING_TOOLHEAD_Y_POS - SWITCHING_TOOLHEAD_Y_SECURITY;
#if ENABLED(DEBUG_LEVELING_FEATURE)
if (DEBUGGING(LEVELING)) DEBUG_POS("Move Y SwitchPos + Security", current_position);
#endif
- planner.buffer_line(current_position, planner.max_feedrate_mm_s[Y_AXIS], active_extruder);
+ planner.buffer_line(current_position, planner.settings.max_feedrate_mm_s[Y_AXIS], active_extruder);
planner.synchronize();
// STEP 3
@@ -291,14 +289,14 @@
#if ENABLED(DEBUG_LEVELING_FEATURE)
if (DEBUGGING(LEVELING)) DEBUG_POS("Move Y SwitchPos", current_position);
#endif
- planner.buffer_line(current_position,(planner.max_feedrate_mm_s[Y_AXIS] * 0.5), active_extruder);
+ planner.buffer_line(current_position,(planner.settings.max_feedrate_mm_s[Y_AXIS] * 0.5), active_extruder);
planner.synchronize();
safe_delay(200);
current_position[Y_AXIS] -= SWITCHING_TOOLHEAD_Y_CLEAR;
#if ENABLED(DEBUG_LEVELING_FEATURE)
if (DEBUGGING(LEVELING)) DEBUG_POS("Move back Y clear", current_position);
#endif
- planner.buffer_line(current_position, planner.max_feedrate_mm_s[Y_AXIS], active_extruder); // move away from docked toolhead
+ planner.buffer_line(current_position, planner.settings.max_feedrate_mm_s[Y_AXIS], active_extruder); // move away from docked toolhead
planner.synchronize();
// STEP 4
@@ -309,13 +307,13 @@
#if ENABLED(DEBUG_LEVELING_FEATURE)
if (DEBUGGING(LEVELING)) DEBUG_POS("Move to new toolhead X", current_position);
#endif
- planner.buffer_line(current_position, planner.max_feedrate_mm_s[X_AXIS], active_extruder);
+ planner.buffer_line(current_position, planner.settings.max_feedrate_mm_s[X_AXIS], active_extruder);
planner.synchronize();
current_position[Y_AXIS] = SWITCHING_TOOLHEAD_Y_POS - SWITCHING_TOOLHEAD_Y_SECURITY;
#if ENABLED(DEBUG_LEVELING_FEATURE)
if (DEBUGGING(LEVELING)) DEBUG_POS("Move Y SwitchPos + Security", current_position);
#endif
- planner.buffer_line(current_position, planner.max_feedrate_mm_s[Y_AXIS], active_extruder);
+ planner.buffer_line(current_position, planner.settings.max_feedrate_mm_s[Y_AXIS], active_extruder);
planner.synchronize();
// STEP 5
@@ -326,7 +324,7 @@
#if ENABLED(DEBUG_LEVELING_FEATURE)
if (DEBUGGING(LEVELING)) DEBUG_POS("Move Y SwitchPos", current_position);
#endif
- planner.buffer_line(current_position, planner.max_feedrate_mm_s[Y_AXIS] * 0.5, active_extruder);
+ planner.buffer_line(current_position, planner.settings.max_feedrate_mm_s[Y_AXIS] * 0.5, active_extruder);
planner.synchronize();
safe_delay(200);
@@ -337,7 +335,7 @@
#if ENABLED(DEBUG_LEVELING_FEATURE)
if (DEBUGGING(LEVELING)) DEBUG_POS("Move back Y clear", current_position);
#endif
- planner.buffer_line(current_position, planner.max_feedrate_mm_s[Y_AXIS], active_extruder); // move away from docked toolhead
+ planner.buffer_line(current_position, planner.settings.max_feedrate_mm_s[Y_AXIS], active_extruder); // move away from docked toolhead
planner.synchronize();
// STEP 6
@@ -413,8 +411,8 @@ inline void invalid_extruder_error(const uint8_t e) {
#define CUR_Z current_position[Z_AXIS]
#define CUR_E current_position[E_AXIS]
- planner.buffer_line(CUR_X, CUR_Y, raised_z, CUR_E, planner.max_feedrate_mm_s[Z_AXIS], active_extruder);
- planner.buffer_line(xhome, CUR_Y, raised_z, CUR_E, planner.max_feedrate_mm_s[X_AXIS], active_extruder);
+ planner.buffer_line(CUR_X, CUR_Y, raised_z, CUR_E, planner.settings.max_feedrate_mm_s[Z_AXIS], active_extruder);
+ planner.buffer_line(xhome, CUR_Y, raised_z, CUR_E, planner.settings.max_feedrate_mm_s[X_AXIS], active_extruder);
planner.synchronize();
}
@@ -488,6 +486,13 @@ void tool_change(const uint8_t tmp_extruder, const float fr_mm_s/*=0.0*/, bool n
if (tmp_extruder >= EXTRUDERS)
return invalid_extruder_error(tmp_extruder);
+ if (!no_move && !all_axes_homed()) {
+ no_move = true;
+ #if ENABLED(DEBUG_LEVELING_FEATURE)
+ if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("No move on toolchange");
+ #endif
+ }
+
#if HOTENDS > 1
const float old_feedrate_mm_s = fr_mm_s > 0.0 ? fr_mm_s : feedrate_mm_s;
@@ -495,12 +500,6 @@ void tool_change(const uint8_t tmp_extruder, const float fr_mm_s/*=0.0*/, bool n
feedrate_mm_s = fr_mm_s > 0.0 ? fr_mm_s : XY_PROBE_FEEDRATE_MM_S;
if (tmp_extruder != active_extruder) {
- if (!no_move && axis_unhomed_error()) {
- no_move = true;
- #if ENABLED(DEBUG_LEVELING_FEATURE)
- if (DEBUGGING(LEVELING)) SERIAL_ECHOLNPGM("No move on toolchange");
- #endif
- }
#if ENABLED(DUAL_X_CARRIAGE)
@@ -549,7 +548,7 @@ void tool_change(const uint8_t tmp_extruder, const float fr_mm_s/*=0.0*/, bool n
#if ENABLED(SWITCHING_NOZZLE)
// Always raise by at least 1 to avoid workpiece
current_position[Z_AXIS] += MAX(-zdiff, 0.0) + 1;
- planner.buffer_line(current_position, planner.max_feedrate_mm_s[Z_AXIS], active_extruder);
+ planner.buffer_line(current_position, planner.settings.max_feedrate_mm_s[Z_AXIS], active_extruder);
move_nozzle_servo(tmp_extruder);
#endif
#endif
@@ -585,10 +584,10 @@ void tool_change(const uint8_t tmp_extruder, const float fr_mm_s/*=0.0*/, bool n
// Raise, move, and lower again
if (safe_to_move && !no_move && IsRunning()) {
- #if DISABLED(SWITCHING_NOZZLE) && DISABLED(DUAL_X_CARRIAGE)
+ #if DISABLED(SWITCHING_NOZZLE) && DISABLED(DUAL_X_CARRIAGE)
// Do a small lift to avoid the workpiece in the move back (below)
current_position[Z_AXIS] += 1.0;
- planner.buffer_line(current_position, planner.max_feedrate_mm_s[Z_AXIS], active_extruder);
+ planner.buffer_line(current_position, planner.settings.max_feedrate_mm_s[Z_AXIS], active_extruder);
#endif
#if ENABLED(DEBUG_LEVELING_FEATURE)
if (DEBUGGING(LEVELING)) DEBUG_POS("Move back", destination);
@@ -609,7 +608,7 @@ void tool_change(const uint8_t tmp_extruder, const float fr_mm_s/*=0.0*/, bool n
#if ENABLED(SWITCHING_NOZZLE)
else {
// Move back down. (Including when the new tool is higher.)
- do_blocking_move_to_z(destination[Z_AXIS], planner.max_feedrate_mm_s[Z_AXIS]);
+ do_blocking_move_to_z(destination[Z_AXIS], planner.settings.max_feedrate_mm_s[Z_AXIS]);
}
#endif
} // (tmp_extruder != active_extruder)
@@ -642,9 +641,10 @@ void tool_change(const uint8_t tmp_extruder, const float fr_mm_s/*=0.0*/, bool n
#if ENABLED(SINGLENOZZLE)
#if ENABLED(PREVENT_COLD_EXTRUSION)
- if (!DEBUGGING(DRYRUN) && thermalManager.targetTooColdToExtrude(active_extruder)) {
+ if ((!DEBUGGING(DRYRUN) && thermalManager.targetTooColdToExtrude(active_extruder)) || sn_settings.swap_length == 0) {
SERIAL_ERROR_START();
SERIAL_ERRORLNPGM(MSG_HOTEND_TOO_COLD);
+ active_extruder = tmp_extruder;
return;
}
#endif
@@ -654,30 +654,32 @@ void tool_change(const uint8_t tmp_extruder, const float fr_mm_s/*=0.0*/, bool n
fan_speed[0] = singlenozzle_fan_speed[tmp_extruder];
#endif
- set_destination_from_current();
+ if (!no_move) set_destination_from_current();
- current_position[Z_AXIS] += (
- #if ENABLED(SINGLENOZZLE_SWAP_PARK)
- singlenozzle_change_point.z
- #else
- SINGLENOZZLE_TOOLCHANGE_ZRAISE
- #endif
- );
-
- planner.buffer_line(current_position, planner.max_feedrate_mm_s[Z_AXIS], active_extruder);
-
- #if ENABLED(SINGLENOZZLE_SWAP_PARK)
- current_position[X_AXIS] = singlenozzle_change_point.x;
- current_position[Y_AXIS] = singlenozzle_change_point.y;
- planner.buffer_line(current_position, planner.max_feedrate_mm_s[Y_AXIS], active_extruder);
- #endif
-
- if (singlenozzle_swap_length) {
+ if (sn_settings.swap_length) {
#if ENABLED(ADVANCED_PAUSE_FEATURE)
- do_pause_e_move(-singlenozzle_swap_length, MMM_TO_MMS(singlenozzle_retract_speed));
+ do_pause_e_move(-sn_settings.swap_length, MMM_TO_MMS(sn_settings.retract_speed));
#else
- current_position[E_AXIS] -= singlenozzle_swap_length / planner.e_factor[active_extruder];
- planner.buffer_line(current_position, MMM_TO_MMS(singlenozzle_retract_speed), active_extruder);
+ current_position[E_AXIS] -= sn_settings.swap_length / planner.e_factor[active_extruder];
+ planner.buffer_line(current_position, MMM_TO_MMS(sn_settings.retract_speed), active_extruder);
+ #endif
+ }
+
+ if (!no_move) {
+ current_position[Z_AXIS] += (
+ #if ENABLED(SINGLENOZZLE_SWAP_PARK)
+ singlenozzle_change_point.z
+ #else
+ SINGLENOZZLE_TOOLCHANGE_ZRAISE
+ #endif
+ );
+
+ planner.buffer_line(current_position, planner.settings.max_feedrate_mm_s[Z_AXIS], active_extruder);
+
+ #if ENABLED(SINGLENOZZLE_SWAP_PARK)
+ current_position[X_AXIS] = singlenozzle_change_point.x;
+ current_position[Y_AXIS] = singlenozzle_change_point.y;
+ planner.buffer_line(current_position, MMM_TO_MMS(SINGLENOZZLE_PARK_XY_FEEDRATE), active_extruder);
#endif
}
@@ -692,23 +694,24 @@ void tool_change(const uint8_t tmp_extruder, const float fr_mm_s/*=0.0*/, bool n
active_extruder = tmp_extruder;
- if (singlenozzle_swap_length) {
+ if (sn_settings.swap_length) {
#if ENABLED(ADVANCED_PAUSE_FEATURE)
- do_pause_e_move(singlenozzle_swap_length, singlenozzle_prime_speed);
+ do_pause_e_move(sn_settings.swap_length, sn_settings.prime_speed);
#else
- current_position[E_AXIS] += singlenozzle_swap_length / planner.e_factor[tmp_extruder];
- planner.buffer_line(current_position, singlenozzle_prime_speed, tmp_extruder);
+ current_position[E_AXIS] += sn_settings.swap_length / planner.e_factor[tmp_extruder];
+ planner.buffer_line(current_position, sn_settings.prime_speed, tmp_extruder);
#endif
}
- #if ENABLED(SINGLENOZZLE_SWAP_PARK)
- current_position[X_AXIS] = destination[X_AXIS];
- current_position[Y_AXIS] = destination[Y_AXIS];
- planner.buffer_line(current_position, planner.max_feedrate_mm_s[Y_AXIS], active_extruder);
- #endif
-
- do_blocking_move_to(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS]);
+ if (!no_move) {
+ #if ENABLED(SINGLENOZZLE_SWAP_PARK)
+ current_position[X_AXIS] = destination[X_AXIS];
+ current_position[Y_AXIS] = destination[Y_AXIS];
+ planner.buffer_line(current_position, MMM_TO_MMS(SINGLENOZZLE_PARK_XY_FEEDRATE), active_extruder);
+ #endif
+ do_blocking_move_to(destination[X_AXIS], destination[Y_AXIS], destination[Z_AXIS]);
+ }
#else // !SINGLENOZZLE
active_extruder = tmp_extruder;
diff --git a/Marlin/src/module/tool_change.h b/Marlin/src/module/tool_change.h
index 2edcf95c94..39b8b0b683 100644
--- a/Marlin/src/module/tool_change.h
+++ b/Marlin/src/module/tool_change.h
@@ -19,11 +19,9 @@
* along with this program. If not, see .
*
*/
+#pragma once
-#ifndef TOOL_CHANGE_H
-#define TOOL_CHANGE_H
-
-#include "../inc/MarlinConfig.h"
+#include "../inc/MarlinConfigPre.h"
#if DO_SWITCH_EXTRUDER
void move_extruder_servo(const uint8_t e);
@@ -51,9 +49,11 @@
#endif // PARKING_EXTRUDER
#if ENABLED(SINGLENOZZLE)
- extern float singlenozzle_swap_length;
- extern int16_t singlenozzle_prime_speed,
- singlenozzle_retract_speed;
+ typedef struct {
+ float swap_length;
+ int16_t prime_speed, retract_speed;
+ } singlenozzle_settings_t;
+ extern singlenozzle_settings_t sn_settings;
extern uint16_t singlenozzle_temp[EXTRUDERS];
#if FAN_COUNT > 0
extern uint8_t singlenozzle_fan_speed[EXTRUDERS];
@@ -65,5 +65,3 @@
* previous tool out of the way and the new tool into place.
*/
void tool_change(const uint8_t tmp_extruder, const float fr_mm_s=0.0, bool no_move=false);
-
-#endif // TOOL_CHANGE_H
diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h
index 81eacf5df2..e8d9f4a7c8 100644
--- a/Marlin/src/pins/pins.h
+++ b/Marlin/src/pins/pins.h
@@ -19,6 +19,7 @@
* along with this program. If not, see .
*
*/
+#pragma once
/**
* Include pins definitions
@@ -32,9 +33,6 @@
* These numbers are the same in any pin mapping.
*/
-#ifndef __PINS_H__
-#define __PINS_H__
-
#define MAX_EXTRUDERS 6
#if MB(RAMPS_13_EFB) || MB(RAMPS_14_EFB) || MB(RAMPS_PLUS_EFB) || MB(RAMPS_14_RE_ARM_EFB) || MB(RAMPS_SMART_EFB) || MB(RAMPS_DUO_EFB) || MB(RAMPS4DUE_EFB)
@@ -427,12 +425,18 @@
#ifndef X_MS2_PIN
#define X_MS2_PIN -1
#endif
+#ifndef X_MS3_PIN
+ #define X_MS3_PIN -1
+#endif
#ifndef Y_MS1_PIN
#define Y_MS1_PIN -1
#endif
#ifndef Y_MS2_PIN
#define Y_MS2_PIN -1
#endif
+#ifndef Y_MS3_PIN
+ #define Y_MS3_PIN -1
+#endif
#ifndef Z_MS1_PIN
#define Z_MS1_PIN -1
#endif
@@ -448,18 +452,27 @@
#ifndef E0_MS2_PIN
#define E0_MS2_PIN -1
#endif
+#ifndef E0_MS3_PIN
+ #define E0_MS3_PIN -1
+#endif
#ifndef E1_MS1_PIN
#define E1_MS1_PIN -1
#endif
#ifndef E1_MS2_PIN
#define E1_MS2_PIN -1
#endif
+#ifndef E1_MS3_PIN
+ #define E1_MS3_PIN -1
+#endif
#ifndef E2_MS1_PIN
#define E2_MS1_PIN -1
#endif
#ifndef E2_MS2_PIN
#define E2_MS2_PIN -1
#endif
+#ifndef E2_MS3_PIN
+ #define E2_MS3_PIN -1
+#endif
#ifndef E3_MS1_PIN
#define E3_MS1_PIN -1
#endif
@@ -650,7 +663,8 @@
#ifndef LED_PIN
#define LED_PIN -1
#endif
-#ifndef PS_ON_PIN
+#if POWER_SUPPLY == 0 || !defined(PS_ON_PIN)
+ #undef PS_ON_PIN
#define PS_ON_PIN -1
#endif
#ifndef KILL_PIN
@@ -717,94 +731,6 @@
#endif
#endif
-// List of pins which to ignore when asked to change by gcode, 0 and 1 are RX and TX, do not mess with those!
-#define _E0_PINS E0_STEP_PIN, E0_DIR_PIN, E0_ENABLE_PIN, E0_MS1_PIN, E0_MS2_PIN, E0_CS_PIN,
-#define _E1_PINS
-#define _E2_PINS
-#define _E3_PINS
-#define _E4_PINS
-#define _E5_PINS
-
-#if ENABLED(SWITCHING_EXTRUDER)
- // Tools 0 and 1 use E0
- #if EXTRUDERS > 2 // Tools 2 and 3 use E1
- #undef _E1_PINS
- #define _E1_PINS E1_STEP_PIN, E1_DIR_PIN, E1_ENABLE_PIN, E1_MS1_PIN, E1_MS2_PIN, E1_CS_PIN,
- #if EXTRUDERS > 4 // Tools 4 and 5 use E2
- #undef _E2_PINS
- #define _E2_PINS E2_STEP_PIN, E2_DIR_PIN, E2_ENABLE_PIN, E2_MS1_PIN, E2_MS2_PIN, E2_CS_PIN,
- #endif
- #endif
-#elif EXTRUDERS > 1
- #undef _E1_PINS
- #define _E1_PINS E1_STEP_PIN, E1_DIR_PIN, E1_ENABLE_PIN, E1_MS1_PIN, E1_MS2_PIN, E1_CS_PIN,
- #if EXTRUDERS > 2
- #undef _E2_PINS
- #define _E2_PINS E2_STEP_PIN, E2_DIR_PIN, E2_ENABLE_PIN, E2_MS1_PIN, E2_MS2_PIN, E2_CS_PIN,
- #if EXTRUDERS > 3
- #undef _E3_PINS
- #define _E3_PINS E3_STEP_PIN, E3_DIR_PIN, E3_ENABLE_PIN, E3_MS1_PIN, E3_MS2_PIN, E3_MS3_PIN, E3_CS_PIN,
- #if EXTRUDERS > 4
- #undef _E4_PINS
- #define _E4_PINS E4_STEP_PIN, E4_DIR_PIN, E4_ENABLE_PIN, E4_MS1_PIN, E4_MS2_PIN, E4_MS3_PIN, E4_CS_PIN,
- #if EXTRUDERS > 5
- #undef _E5_PINS
- #define _E5_PINS E5_STEP_PIN, E5_DIR_PIN, E5_ENABLE_PIN, E5_MS1_PIN, E5_MS2_PIN, E5_MS3_PIN, E5_CS_PIN,
- #endif // EXTRUDERS > 5
- #endif // EXTRUDERS > 4
- #endif // EXTRUDERS > 3
- #endif // EXTRUDERS > 2
-#endif // EXTRUDERS > 1
-
-#define _H0_PINS HEATER_0_PIN, E0_AUTO_FAN_PIN, analogInputToDigitalPin(TEMP_0_PIN),
-#define _H1_PINS
-#define _H2_PINS
-#define _H3_PINS
-#define _H4_PINS
-#define _H5_PINS
-
-#if HOTENDS > 1
- #undef _H1_PINS
- #define _H1_PINS HEATER_1_PIN, E1_AUTO_FAN_PIN, analogInputToDigitalPin(TEMP_1_PIN),
- #if HOTENDS > 2
- #undef _H2_PINS
- #define _H2_PINS HEATER_2_PIN, E2_AUTO_FAN_PIN, analogInputToDigitalPin(TEMP_2_PIN),
- #if HOTENDS > 3
- #undef _H3_PINS
- #define _H3_PINS HEATER_3_PIN, E3_AUTO_FAN_PIN, analogInputToDigitalPin(TEMP_3_PIN),
- #if HOTENDS > 4
- #undef _H4_PINS
- #define _H4_PINS HEATER_4_PIN, E4_AUTO_FAN_PIN, analogInputToDigitalPin(TEMP_4_PIN),
- #if HOTENDS > 5
- #undef _H5_PINS
- #define _H5_PINS HEATER_5_PIN, E5_AUTO_FAN_PIN, analogInputToDigitalPin(TEMP_5_PIN),
- #endif // HOTENDS > 5
- #endif // HOTENDS > 4
- #endif // HOTENDS > 3
- #endif // HOTENDS > 2
-#elif ENABLED(MIXING_EXTRUDER)
- #undef _E1_PINS
- #define _E1_PINS E1_STEP_PIN, E1_DIR_PIN, E1_ENABLE_PIN, E1_MS1_PIN, E1_MS2_PIN, E1_CS_PIN,
- #if MIXING_STEPPERS > 2
- #undef _E2_PINS
- #define _E2_PINS E2_STEP_PIN, E2_DIR_PIN, E2_ENABLE_PIN, E2_MS1_PIN, E2_MS2_PIN, E2_CS_PIN,
- #if MIXING_STEPPERS > 3
- #undef _E3_PINS
- #define _E3_PINS E3_STEP_PIN, E3_DIR_PIN, E3_ENABLE_PIN, E3_MS1_PIN, E3_MS2_PIN, E3_CS_PIN,
- #if MIXING_STEPPERS > 4
- #undef _E4_PINS
- #define _E4_PINS E4_STEP_PIN, E4_DIR_PIN, E4_ENABLE_PIN, E4_MS1_PIN, E4_MS2_PIN, E4_CS_PIN,
- #if MIXING_STEPPERS > 5
- #undef _E5_PINS
- #define _E5_PINS E5_STEP_PIN, E5_DIR_PIN, E5_ENABLE_PIN, E5_MS1_PIN, E5_MS2_PIN, E5_CS_PIN,
- #endif // MIXING_STEPPERS > 5
- #endif // MIXING_STEPPERS > 4
- #endif // MIXING_STEPPERS > 3
- #endif // MIXING_STEPPERS > 2
-#endif // MIXING_STEPPERS > 1
-
-#define BED_PINS HEATER_BED_PIN, analogInputToDigitalPin(TEMP_BED_PIN),
-
//
// Assign endstop pins for boards with only 3 connectors
//
@@ -841,7 +767,7 @@
//
// Disable unused endstop / probe pins
//
-#if DISABLED(Z_MIN_PROBE_ENDSTOP)
+#if !HAS_BED_PROBE || DISABLED(Z_MIN_PROBE_ENDSTOP)
#undef Z_MIN_PROBE_PIN
#define Z_MIN_PROBE_PIN -1
#endif
@@ -889,14 +815,13 @@
#define LCD_PINS_D7 -1
#endif
-//
-// Dual X-carriage, Dual Y, Dual Z support
-//
-
-#define _X2_PINS
-#define _Y2_PINS
-#define _Z2_PINS
-#define _Z3_PINS
+/**
+ * Auto-Assignment for Dual X, Dual Y, Multi-Z Steppers
+ *
+ * By default X2 is assigned to the next open E plug
+ * on the board, then in order, Y2, Z2, Z3. These can be
+ * overridden in Configuration.h or Configuration_adv.h.
+ */
#define __EPIN(p,q) E##p##_##q##_PIN
#define _EPIN(p,q) __EPIN(p,q)
@@ -907,19 +832,21 @@
#define X2_STEP_PIN _EPIN(E_STEPPERS, STEP)
#define X2_DIR_PIN _EPIN(E_STEPPERS, DIR)
#define X2_ENABLE_PIN _EPIN(E_STEPPERS, ENABLE)
- #ifndef X2_CS_PIN
- #define X2_CS_PIN _EPIN(E_STEPPERS, CS)
- #endif
- #if E_STEPPERS > MAX_EXTRUDERS || !PIN_EXISTS(X2_ENABLE)
+ #if E_STEPPERS >= MAX_EXTRUDERS || !PIN_EXISTS(X2_STEP)
#error "No E stepper plug left for X2!"
#endif
#endif
- #undef _X2_PINS
- #define __X2_PINS X2_STEP_PIN, X2_DIR_PIN, X2_ENABLE_PIN,
- #ifdef X2_CS_PIN
- #define _X2_PINS __X2_PINS X2_CS_PIN,
- #else
- #define _X2_PINS __X2_PINS
+ #ifndef X2_CS_PIN
+ #define X2_CS_PIN _EPIN(E_STEPPERS, CS)
+ #endif
+ #ifndef X2_MS1_PIN
+ #define X2_MS1_PIN _EPIN(E_STEPPERS, MS1)
+ #endif
+ #ifndef X2_MS2_PIN
+ #define X2_MS2_PIN _EPIN(E_STEPPERS, MS2)
+ #endif
+ #ifndef X2_MS3_PIN
+ #define X2_MS3_PIN _EPIN(E_STEPPERS, MS3)
#endif
#define Y2_E_INDEX INCREMENT(E_STEPPERS)
#else
@@ -932,19 +859,21 @@
#define Y2_STEP_PIN _EPIN(Y2_E_INDEX, STEP)
#define Y2_DIR_PIN _EPIN(Y2_E_INDEX, DIR)
#define Y2_ENABLE_PIN _EPIN(Y2_E_INDEX, ENABLE)
- #ifndef Y2_CS_PIN
- #define Y2_CS_PIN _EPIN(Y2_E_INDEX, CS)
- #endif
- #if Y2_E_INDEX > MAX_EXTRUDERS || !PIN_EXISTS(Y2_ENABLE)
+ #if Y2_E_INDEX >= MAX_EXTRUDERS || !PIN_EXISTS(Y2_STEP)
#error "No E stepper plug left for Y2!"
#endif
#endif
- #undef _Y2_PINS
- #define __Y2_PINS Y2_STEP_PIN, Y2_DIR_PIN, Y2_ENABLE_PIN,
- #ifdef Y2_CS_PIN
- #define _Y2_PINS __Y2_PINS Y2_CS_PIN,
- #else
- #define _Y2_PINS __Y2_PINS
+ #ifndef Y2_CS_PIN
+ #define Y2_CS_PIN _EPIN(Y2_E_INDEX, CS)
+ #endif
+ #ifndef Y2_MS1_PIN
+ #define Y2_MS1_PIN _EPIN(Y2_E_INDEX, MS1)
+ #endif
+ #ifndef Y2_MS2_PIN
+ #define Y2_MS2_PIN _EPIN(Y2_E_INDEX, MS2)
+ #endif
+ #ifndef Y2_MS3_PIN
+ #define Y2_MS3_PIN _EPIN(Y2_E_INDEX, MS3)
#endif
#define Z2_E_INDEX INCREMENT(Y2_E_INDEX)
#else
@@ -957,19 +886,21 @@
#define Z2_STEP_PIN _EPIN(Z2_E_INDEX, STEP)
#define Z2_DIR_PIN _EPIN(Z2_E_INDEX, DIR)
#define Z2_ENABLE_PIN _EPIN(Z2_E_INDEX, ENABLE)
- #ifndef Z2_CS_PIN
- #define Z2_CS_PIN _EPIN(Z2_E_INDEX, CS)
- #endif
- #if Z2_E_INDEX > MAX_EXTRUDERS || !PIN_EXISTS(Z2_ENABLE)
+ #if Z2_E_INDEX >= MAX_EXTRUDERS || !PIN_EXISTS(Z2_STEP)
#error "No E stepper plug left for Z2!"
#endif
#endif
- #undef _Z2_PINS
- #define __Z2_PINS Z2_STEP_PIN, Z2_DIR_PIN, Z2_ENABLE_PIN,
- #ifdef Z2_CS_PIN
- #define _Z2_PINS __Z2_PINS Z2_CS_PIN,
- #else
- #define _Z2_PINS __Z2_PINS
+ #ifndef Z2_CS_PIN
+ #define Z2_CS_PIN _EPIN(Z2_E_INDEX, CS)
+ #endif
+ #ifndef Z2_MS1_PIN
+ #define Z2_MS1_PIN _EPIN(Z2_E_INDEX, MS1)
+ #endif
+ #ifndef Z2_MS2_PIN
+ #define Z2_MS2_PIN _EPIN(Z2_E_INDEX, MS2)
+ #endif
+ #ifndef Z2_MS3_PIN
+ #define Z2_MS3_PIN _EPIN(Z2_E_INDEX, MS3)
#endif
#define Z3_E_INDEX INCREMENT(Z2_E_INDEX)
#else
@@ -981,41 +912,20 @@
#define Z3_STEP_PIN _EPIN(Z3_E_INDEX, STEP)
#define Z3_DIR_PIN _EPIN(Z3_E_INDEX, DIR)
#define Z3_ENABLE_PIN _EPIN(Z3_E_INDEX, ENABLE)
- #ifndef Z3_CS_PIN
- #define Z3_CS_PIN _EPIN(Z3_E_INDEX, CS)
- #endif
- #if Z3_E_INDEX > 4 || !PIN_EXISTS(Z3_ENABLE)
+ #if Z3_E_INDEX >= MAX_EXTRUDERS || !PIN_EXISTS(Z3_STEP)
#error "No E stepper plug left for Z3!"
#endif
#endif
- #undef _Z3_PINS
- #define __Z3_PINS Z3_STEP_PIN, Z3_DIR_PIN, Z3_ENABLE_PIN,
- #ifdef Z3_CS_PIN
- #define _Z3_PINS __Z3_PINS Z3_CS_PIN,
- #else
- #define _Z3_PINS __Z3_PINS
+ #ifndef Z3_CS_PIN
+ #define Z3_CS_PIN _EPIN(Z3_E_INDEX, CS)
+ #endif
+ #ifndef Z3_MS1_PIN
+ #define Z3_MS1_PIN _EPIN(Z3_E_INDEX, MS1)
+ #endif
+ #ifndef Z3_MS2_PIN
+ #define Z3_MS2_PIN _EPIN(Z3_E_INDEX, MS2)
+ #endif
+ #ifndef Z3_MS3_PIN
+ #define Z3_MS3_PIN _EPIN(Z3_E_INDEX, MS3)
#endif
#endif
-
-#ifndef HAL_SENSITIVE_PINS
- #define HAL_SENSITIVE_PINS
-#endif
-
-#define SENSITIVE_PINS { \
- X_STEP_PIN, X_DIR_PIN, X_ENABLE_PIN, X_MIN_PIN, X_MAX_PIN, X_MS1_PIN, X_MS2_PIN, X_CS_PIN, \
- Y_STEP_PIN, Y_DIR_PIN, Y_ENABLE_PIN, Y_MIN_PIN, Y_MAX_PIN, Y_MS1_PIN, Y_MS2_PIN, Y_CS_PIN, \
- Z_STEP_PIN, Z_DIR_PIN, Z_ENABLE_PIN, Z_MIN_PIN, Z_MAX_PIN, Z_MS1_PIN, Z_MS2_PIN, Z_MS3_PIN, Z_CS_PIN, Z_MIN_PROBE_PIN, \
- PS_ON_PIN, HEATER_BED_PIN, FAN_PIN, FAN1_PIN, FAN2_PIN, CONTROLLER_FAN_PIN, \
- _E0_PINS _E1_PINS _E2_PINS _E3_PINS _E4_PINS _E5_PINS BED_PINS \
- _H0_PINS _H1_PINS _H2_PINS _H3_PINS _H4_PINS _H5_PINS \
- _X2_PINS _Y2_PINS _Z2_PINS _Z3_PINS \
- HAL_SENSITIVE_PINS \
- }
-
-#define HAS_DIGIPOTSS (PIN_EXISTS(DIGIPOTSS))
-
-// Note: default SPI pins are defined in the HAL
-
-#include HAL_PATH(../HAL, spi_pins.h)
-
-#endif // __PINS_H__
diff --git a/Marlin/src/pins/pinsDebug_list.h b/Marlin/src/pins/pinsDebug_list.h
index e6ac174c17..df4e163298 100644
--- a/Marlin/src/pins/pinsDebug_list.h
+++ b/Marlin/src/pins/pinsDebug_list.h
@@ -268,6 +268,9 @@
#if PIN_EXISTS(E0_MS2)
REPORT_NAME_DIGITAL(__LINE__, E0_MS2_PIN)
#endif
+#if PIN_EXISTS(E0_MS3)
+ REPORT_NAME_DIGITAL(__LINE__, E0_MS3_PIN)
+#endif
#if PIN_EXISTS(E0_STEP)
REPORT_NAME_DIGITAL(__LINE__, E0_STEP_PIN)
#endif
@@ -289,6 +292,9 @@
#if PIN_EXISTS(E1_MS2)
REPORT_NAME_DIGITAL(__LINE__, E1_MS2_PIN)
#endif
+#if PIN_EXISTS(E1_MS3)
+ REPORT_NAME_DIGITAL(__LINE__, E1_MS3_PIN)
+#endif
#if PIN_EXISTS(E1_STEP)
REPORT_NAME_DIGITAL(__LINE__, E1_STEP_PIN)
#endif
@@ -310,6 +316,9 @@
#if PIN_EXISTS(E2_MS2)
REPORT_NAME_DIGITAL(__LINE__, E2_MS2_PIN)
#endif
+#if PIN_EXISTS(E2_MS3)
+ REPORT_NAME_DIGITAL(__LINE__, E2_MS3_PIN)
+#endif
#if PIN_EXISTS(E2_STEP)
REPORT_NAME_DIGITAL(__LINE__, E2_STEP_PIN)
#endif
@@ -881,6 +890,9 @@
#if PIN_EXISTS(X_MS2)
REPORT_NAME_DIGITAL(__LINE__, X_MS2_PIN)
#endif
+#if PIN_EXISTS(X_MS3)
+ REPORT_NAME_DIGITAL(__LINE__, X_MS3_PIN)
+#endif
#if PIN_EXISTS(X_STEP)
REPORT_NAME_DIGITAL(__LINE__, X_STEP_PIN)
#endif
@@ -893,6 +905,15 @@
#if PIN_EXISTS(X2_ENABLE)
REPORT_NAME_DIGITAL(__LINE__, X2_ENABLE_PIN)
#endif
+#if PIN_EXISTS(X2_MS1)
+ REPORT_NAME_DIGITAL(__LINE__, X2_MS1_PIN)
+#endif
+#if PIN_EXISTS(X2_MS2)
+ REPORT_NAME_DIGITAL(__LINE__, X2_MS2_PIN)
+#endif
+#if PIN_EXISTS(X2_MS3)
+ REPORT_NAME_DIGITAL(__LINE__, X2_MS3_PIN)
+#endif
#if PIN_EXISTS(X2_STEP)
REPORT_NAME_DIGITAL(__LINE__, X2_STEP_PIN)
#endif
@@ -920,6 +941,9 @@
#if PIN_EXISTS(Y_MS2)
REPORT_NAME_DIGITAL(__LINE__, Y_MS2_PIN)
#endif
+#if PIN_EXISTS(Y_MS3)
+ REPORT_NAME_DIGITAL(__LINE__, Y_MS3_PIN)
+#endif
#if PIN_EXISTS(Y_STEP)
REPORT_NAME_DIGITAL(__LINE__, Y_STEP_PIN)
#endif
@@ -932,6 +956,15 @@
#if PIN_EXISTS(Y2_ENABLE)
REPORT_NAME_DIGITAL(__LINE__, Y2_ENABLE_PIN)
#endif
+#if PIN_EXISTS(Y2_MS1)
+ REPORT_NAME_DIGITAL(__LINE__, Y2_MS1_PIN)
+#endif
+#if PIN_EXISTS(Y2_MS2)
+ REPORT_NAME_DIGITAL(__LINE__, Y2_MS2_PIN)
+#endif
+#if PIN_EXISTS(Y2_MS3)
+ REPORT_NAME_DIGITAL(__LINE__, Y2_MS3_PIN)
+#endif
#if PIN_EXISTS(Y2_STEP)
REPORT_NAME_DIGITAL(__LINE__, Y2_STEP_PIN)
#endif
@@ -962,6 +995,9 @@
#if PIN_EXISTS(Z_MS2)
REPORT_NAME_DIGITAL(__LINE__, Z_MS2_PIN)
#endif
+#if PIN_EXISTS(Z_MS3)
+ REPORT_NAME_DIGITAL(__LINE__, Z_MS3_PIN)
+#endif
#if PIN_EXISTS(Z_STEP)
REPORT_NAME_DIGITAL(__LINE__, Z_STEP_PIN)
#endif
diff --git a/Marlin/src/pins/pins_ARCHIM2.h b/Marlin/src/pins/pins_ARCHIM2.h
index ea9348cef0..1e260d3c3c 100644
--- a/Marlin/src/pins/pins_ARCHIM2.h
+++ b/Marlin/src/pins/pins_ARCHIM2.h
@@ -50,6 +50,12 @@
#define E0_DIAG_PIN 78 // PB23 E1_DIAG
#define E1_DIAG_PIN 25 // PD0 E2_DIAG
+//
+// Servos
+//
+#define SERVO0_PIN 20 // D20 PB12 (Header J20 20)
+#define SERVO1_PIN 21 // D21 PB13 (Header J20 19)
+
//
// Limit Switches
//
@@ -161,27 +167,46 @@
//
// Misc. Functions
//
-#define SDSS 87 // D87 PA29 CS
-//////////////////////////
-// LCDs and Controllers //
-//////////////////////////
+// Internal MicroSD card reader on the PCB
+#define INT_SCK_PIN 42 // D42 PA19/MCCK
+#define INT_MISO_PIN 43 // D43 PA20/MCCDA
+#define INT_MOSI_PIN 73 // D73 PA21/MCDA0
+#define INT_SDSS 55 // D55 PA24/MCDA3
+
+// The external SD card reader on SC2, as well as 2 Mbyte SPI Flash
+#define SCK_PIN 76 // D76 PA27
+#define MISO_PIN 74 // D74 PA25
+#define MOSI_PIN 75 // D75 PA26
+#define SDSS 87 // D87 PA29
+#define SPI_FLASH_SS 52 // D52 PB21
+
+// Filament runout sensor pins (or GPIO)
+#ifndef FIL_RUNOUT_PIN
+ #define FIL_RUNOUT_PIN 66 // D66 PB15 (Header J20 15)
+#endif
+#ifndef FIL_RUNOUT2_PIN
+ #define FIL_RUNOUT2_PIN 67 // D67 PB16 (Header J20 16)
+#endif
+
+//
+// LCD / Controller
+//
+#if ENABLED(ULTRA_LCD) || ENABLED(EXTENSIBLE_UI)
+ #define BEEPER_PIN 23 // D24 PA15_CTS1
+ #define LCD_PINS_RS 17 // D17 PA12_RXD1
+ #define LCD_PINS_ENABLE 24 // D23 PA14_RTS1
+ #define LCD_PINS_D4 69 // D69 PA0_CANTX0
+ #define LCD_PINS_D5 54 // D54 PA16_SCK1
+ #define LCD_PINS_D6 68 // D68 PA1_CANRX0
+ #define LCD_PINS_D7 34 // D34 PC2_PWML0
+
+ #define SD_DETECT_PIN 2 // D2 PB25_TIOA0
-#if ENABLED(ULTRA_LCD)
#if ENABLED(NEWPANEL)
- #define BEEPER_PIN 23 // D24 PA15_CTS1
- #define LCD_PINS_RS 17 // D17 PA12_RXD1
- #define LCD_PINS_ENABLE 24 // D23 PA14_RTS1
- #define LCD_PINS_D4 69 // D69 PA0_CANTX0
- #define LCD_PINS_D5 54 // D54 PA16_SCK1
- #define LCD_PINS_D6 68 // D68 PA1_CANRX0
- #define LCD_PINS_D7 34 // D34 PC2_PWML0
-
- #define SD_DETECT_PIN 2 // D2 PB25_TIOA0
-
// Buttons on AUX-2
#define BTN_EN1 60 // D60 PA3_TIOB1
#define BTN_EN2 13 // D13 PB27_TIOB0
#define BTN_ENC 16 // D16 PA13_TXD1 // the click
- #endif // NEWPANEL
-#endif // ULTRA_LCD
+ #endif // NEWPANEL
+#endif // ULTRA_LCD || EXTENSIBLE_UI
diff --git a/Marlin/src/pins/pins_RAMPS_ENDER_4.h b/Marlin/src/pins/pins_RAMPS_ENDER_4.h
index a14ace25ba..96e5dab2bc 100644
--- a/Marlin/src/pins/pins_RAMPS_ENDER_4.h
+++ b/Marlin/src/pins/pins_RAMPS_ENDER_4.h
@@ -27,3 +27,9 @@
#define BOARD_NAME "Ender-4"
#include "pins_RAMPS.h"
+
+// The board only has one controllable fan connector, the others are just plain 12V connectors
+// in the default configuration, this is used to control the brightness of the LED band
+// hotend and controller fan are therefore always-on
+#define ENDER4_FAN_PIN RAMPS_D9_PIN
+#undef FAN_PIN
diff --git a/Marlin/src/pins/pins_RURAMPS4D_11.h b/Marlin/src/pins/pins_RURAMPS4D_11.h
index d05b74b04c..7b78ffc7b7 100644
--- a/Marlin/src/pins/pins_RURAMPS4D_11.h
+++ b/Marlin/src/pins/pins_RURAMPS4D_11.h
@@ -119,9 +119,6 @@
//#define E3_MS1_PIN ?
//#define E3_MS2_PIN ?
//#define E3_MS3_PIN ?
-//#define Z2_MS1_PIN ? // shared with E3_MS1_PIN
-//#define Z2_MS2_PIN ? // shared with E3_MS2_PIN
-//#define Z2_MS3_PIN ? // shared with E3_MS3_PIN
#if DISABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN)
#define Z_MIN_PROBE_PIN 49
diff --git a/Marlin/src/pins/sensitive_pins.h b/Marlin/src/pins/sensitive_pins.h
new file mode 100644
index 0000000000..8b885bb0b6
--- /dev/null
+++ b/Marlin/src/pins/sensitive_pins.h
@@ -0,0 +1,516 @@
+/**
+ * Marlin 3D Printer Firmware
+ * Copyright (C) 2016 MarlinFirmware [https://github.com/MarlinFirmware/Marlin]
+ *
+ * Based on Sprinter and grbl.
+ * Copyright (C) 2011 Camiel Gubbels / Erik van der Zalm
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ *
+ */
+#pragma once
+
+//
+// Prepare a list of protected pins for M42/M43
+//
+
+#if PIN_EXISTS(X_MIN)
+ #define _X_MIN X_MIN_PIN,
+#else
+ #define _X_MIN
+#endif
+#if PIN_EXISTS(X_MAX)
+ #define _X_MAX X_MAX_PIN,
+#else
+ #define _X_MAX
+#endif
+#if PIN_EXISTS(X_CS)
+ #define _X_CS X_CS_PIN,
+#else
+ #define _X_CS
+#endif
+#if PIN_EXISTS(X_MS1)
+ #define _X_MS1 X_MS1_PIN,
+#else
+ #define _X_MS1
+#endif
+#if PIN_EXISTS(X_MS2)
+ #define _X_MS2 X_MS2_PIN,
+#else
+ #define _X_MS2
+#endif
+#if PIN_EXISTS(X_MS3)
+ #define _X_MS3 X_MS3_PIN,
+#else
+ #define _X_MS3
+#endif
+
+#define _X_PINS X_STEP_PIN, X_DIR_PIN, X_ENABLE_PIN, _X_MIN _X_MAX _X_MS1 _X_MS2 _X_MS3 _X_CS
+
+#if PIN_EXISTS(Y_MIN)
+ #define _Y_MIN Y_MIN_PIN,
+#else
+ #define _Y_MIN
+#endif
+#if PIN_EXISTS(Y_MAX)
+ #define _Y_MAX Y_MAX_PIN,
+#else
+ #define _Y_MAX
+#endif
+#if PIN_EXISTS(Y_CS)
+ #define _Y_CS Y_CS_PIN,
+#else
+ #define _Y_CS
+#endif
+#if PIN_EXISTS(Y_MS1)
+ #define _Y_MS1 Y_MS1_PIN,
+#else
+ #define _Y_MS1
+#endif
+#if PIN_EXISTS(Y_MS2)
+ #define _Y_MS2 Y_MS2_PIN,
+#else
+ #define _Y_MS2
+#endif
+#if PIN_EXISTS(Y_MS3)
+ #define _Y_MS3 Y_MS3_PIN,
+#else
+ #define _Y_MS3
+#endif
+
+#define _Y_PINS Y_STEP_PIN, Y_DIR_PIN, Y_ENABLE_PIN, _Y_MIN _Y_MAX _Y_MS1 _Y_MS2 _Y_MS3 _Y_CS
+
+#if PIN_EXISTS(Z_MIN)
+ #define _Z_MIN Z_MIN_PIN,
+#else
+ #define _Z_MIN
+#endif
+#if PIN_EXISTS(Z_MAX)
+ #define _Z_MAX Z_MAX_PIN,
+#else
+ #define _Z_MAX
+#endif
+#if PIN_EXISTS(Z_CS)
+ #define _Z_CS Z_CS_PIN,
+#else
+ #define _Z_CS
+#endif
+#if PIN_EXISTS(Z_MS1)
+ #define _Z_MS1 Z_MS1_PIN,
+#else
+ #define _Z_MS1
+#endif
+#if PIN_EXISTS(Z_MS2)
+ #define _Z_MS2 Z_MS2_PIN,
+#else
+ #define _Z_MS2
+#endif
+#if PIN_EXISTS(Z_MS3)
+ #define _Z_MS3 Z_MS3_PIN,
+#else
+ #define _Z_MS3
+#endif
+
+#define _Z_PINS Z_STEP_PIN, Z_DIR_PIN, Z_ENABLE_PIN, _Z_MIN _Z_MAX _Z_MS1 _Z_MS2 _Z_MS3 _Z_CS
+
+//
+// Extruder Chip Select, Digital Micro-steps
+//
+
+// Mixing stepper, Switching stepper, or regular stepper
+#define E_NEEDED(N) (ENABLED(MIXING_EXTRUDER) && MIXING_STEPPERS > N) \
+ || (ENABLED(SWITCHING_EXTRUDER) && E_STEPPERS > N) \
+ || (DISABLED(SWITCHING_EXTRUDER) && DISABLED(MIXING_EXTRUDER) && EXTRUDERS > N)
+
+#if PIN_EXISTS(E0_CS)
+ #define _E0_CS E0_CS_PIN,
+#else
+ #define _E0_CS
+#endif
+#if PIN_EXISTS(E0_MS1)
+ #define _E0_MS1 E0_MS1_PIN,
+#else
+ #define _E0_MS1
+#endif
+#if PIN_EXISTS(E0_MS2)
+ #define _E0_MS2 E0_MS2_PIN,
+#else
+ #define _E0_MS2
+#endif
+#if PIN_EXISTS(E0_MS3)
+ #define _E0_MS3 E0_MS3_PIN,
+#else
+ #define _E0_MS3
+#endif
+
+#define _E1_CS
+#define _E1_MS1
+#define _E1_MS2
+#define _E1_MS3
+
+#if E_NEEDED(1)
+ #if PIN_EXISTS(E1_CS)
+ #undef _E1_CS
+ #define _E1_CS E1_CS_PIN,
+ #endif
+ #if PIN_EXISTS(E1_MS1)
+ #undef _E1_MS1
+ #define _E1_MS1 E1_MS1_PIN,
+ #endif
+ #if PIN_EXISTS(E1_MS2)
+ #undef _E1_MS2
+ #define _E1_MS2 E1_MS2_PIN,
+ #endif
+ #if PIN_EXISTS(E1_MS3)
+ #undef _E1_MS3
+ #define _E1_MS3 E1_MS3_PIN,
+ #endif
+#endif
+
+#define _E2_CS
+#define _E2_MS1
+#define _E2_MS2
+#define _E2_MS3
+
+#if E_NEEDED(2)
+ #if PIN_EXISTS(E2_CS)
+ #undef _E2_CS
+ #define _E2_CS E2_CS_PIN,
+ #endif
+ #if PIN_EXISTS(E2_MS1)
+ #undef _E2_MS1
+ #define _E2_MS1 E2_MS1_PIN,
+ #endif
+ #if PIN_EXISTS(E2_MS2)
+ #undef _E2_MS2
+ #define _E2_MS2 E2_MS2_PIN,
+ #endif
+ #if PIN_EXISTS(E2_MS3)
+ #undef _E2_MS3
+ #define _E2_MS3 E2_MS3_PIN,
+ #endif
+#endif
+
+#define _E3_CS
+#define _E3_MS1
+#define _E3_MS2
+#define _E3_MS3
+
+#if E_NEEDED(3)
+ #if PIN_EXISTS(E3_CS)
+ #undef _E3_CS
+ #define _E3_CS E3_CS_PIN,
+ #endif
+ #if PIN_EXISTS(E3_MS1)
+ #undef _E3_MS1
+ #define _E3_MS1 E3_MS1_PIN,
+ #endif
+ #if PIN_EXISTS(E3_MS2)
+ #undef _E3_MS2
+ #define _E3_MS2 E3_MS2_PIN,
+ #endif
+ #if PIN_EXISTS(E3_MS3)
+ #undef _E3_MS3
+ #define _E3_MS3 E3_MS3_PIN,
+ #endif
+#endif
+
+#define _E4_CS
+#define _E4_MS1
+#define _E4_MS2
+#define _E4_MS3
+
+#if E_NEEDED(4)
+ #if PIN_EXISTS(E4_CS)
+ #undef _E4_CS
+ #define _E4_CS E4_CS_PIN,
+ #endif
+ #if PIN_EXISTS(E4_MS1)
+ #undef _E4_MS1
+ #define _E4_MS1 E4_MS1_PIN,
+ #endif
+ #if PIN_EXISTS(E4_MS2)
+ #undef _E4_MS2
+ #define _E4_MS2 E4_MS2_PIN,
+ #endif
+ #if PIN_EXISTS(E4_MS3)
+ #undef _E4_MS3
+ #define _E4_MS3 E4_MS3_PIN,
+ #endif
+#endif
+
+#define _E5_CS
+#define _E5_MS1
+#define _E5_MS2
+#define _E5_MS3
+
+#if E_NEEDED(5)
+ #if PIN_EXISTS(E5_CS)
+ #undef _E5_CS
+ #define _E5_CS E5_CS_PIN,
+ #endif
+ #if PIN_EXISTS(E5_MS1)
+ #undef _E5_MS1
+ #define _E5_MS1 E5_MS1_PIN,
+ #endif
+ #if PIN_EXISTS(E5_MS2)
+ #undef _E5_MS2
+ #define _E5_MS2 E5_MS2_PIN,
+ #endif
+ #if PIN_EXISTS(E5_MS3)
+ #undef _E5_MS3
+ #define _E5_MS3 E5_MS3_PIN,
+ #endif
+#endif
+
+//
+// E Steppers
+//
+
+#define _E0_PINS E0_STEP_PIN, E0_DIR_PIN, E0_ENABLE_PIN, _E0_CS _E0_MS1 _E0_MS2 _E0_MS3
+#define _E1_PINS
+#define _E2_PINS
+#define _E3_PINS
+#define _E4_PINS
+#define _E5_PINS
+
+#if ENABLED(SWITCHING_EXTRUDER)
+ // Tools 0 and 1 use E0
+ #if EXTRUDERS > 2 // Tools 2 and 3 use E1
+ #undef _E1_PINS
+ #define _E1_PINS E1_STEP_PIN, E1_DIR_PIN, E1_ENABLE_PIN, _E1_CS _E1_MS1 _E1_MS2 _E1_MS3
+ #if EXTRUDERS > 4 // Tools 4 and 5 use E2
+ #undef _E2_PINS
+ #define _E2_PINS E2_STEP_PIN, E2_DIR_PIN, E2_ENABLE_PIN, _E2_CS _E2_MS1 _E2_MS2 _E2_MS3
+ #endif
+ #endif
+#elif EXTRUDERS > 1 || ENABLED(MIXING_EXTRUDER)
+ #undef _E1_PINS
+ #define _E1_PINS E1_STEP_PIN, E1_DIR_PIN, E1_ENABLE_PIN, _E1_CS _E1_MS1 _E1_MS2 _E1_MS3
+ #if EXTRUDERS > 2 || (ENABLED(MIXING_EXTRUDER) && MIXING_STEPPERS > 2)
+ #undef _E2_PINS
+ #define _E2_PINS E2_STEP_PIN, E2_DIR_PIN, E2_ENABLE_PIN, _E2_CS _E2_MS1 _E2_MS2 _E2_MS3
+ #if EXTRUDERS > 3 || (ENABLED(MIXING_EXTRUDER) && MIXING_STEPPERS > 3)
+ #undef _E3_PINS
+ #define _E3_PINS E3_STEP_PIN, E3_DIR_PIN, E3_ENABLE_PIN, _E3_CS _E3_MS1 _E3_MS2 _E3_MS3
+ #if EXTRUDERS > 4 || (ENABLED(MIXING_EXTRUDER) && MIXING_STEPPERS > 4)
+ #undef _E4_PINS
+ #define _E4_PINS E4_STEP_PIN, E4_DIR_PIN, E4_ENABLE_PIN, _E4_CS _E4_MS1 _E4_MS2 _E4_MS3
+ #if EXTRUDERS > 5 || (ENABLED(MIXING_EXTRUDER) && MIXING_STEPPERS > 5)
+ #undef _E5_PINS
+ #define _E5_PINS E5_STEP_PIN, E5_DIR_PIN, E5_ENABLE_PIN, _E5_CS _E5_MS1 _E5_MS2 _E5_MS3
+ #endif // EXTRUDERS > 5 || MIXING_EXTRUDER > 5
+ #endif // EXTRUDERS > 4 || MIXING_EXTRUDER > 4
+ #endif // EXTRUDERS > 3 || MIXING_EXTRUDER > 3
+ #endif // EXTRUDERS > 2 || MIXING_EXTRUDER > 2
+#endif // EXTRUDERS > 1 || MIXING_EXTRUDER
+
+//
+// Heaters, Fans, Temp Sensors
+//
+
+#define _H0_PINS HEATER_0_PIN, E0_AUTO_FAN_PIN, analogInputToDigitalPin(TEMP_0_PIN),
+#define _H1_PINS
+#define _H2_PINS
+#define _H3_PINS
+#define _H4_PINS
+#define _H5_PINS
+
+#if HOTENDS > 1
+ #undef _H1_PINS
+ #define _H1_PINS HEATER_1_PIN, E1_AUTO_FAN_PIN, analogInputToDigitalPin(TEMP_1_PIN),
+ #if HOTENDS > 2
+ #undef _H2_PINS
+ #define _H2_PINS HEATER_2_PIN, E2_AUTO_FAN_PIN, analogInputToDigitalPin(TEMP_2_PIN),
+ #if HOTENDS > 3
+ #undef _H3_PINS
+ #define _H3_PINS HEATER_3_PIN, E3_AUTO_FAN_PIN, analogInputToDigitalPin(TEMP_3_PIN),
+ #if HOTENDS > 4
+ #undef _H4_PINS
+ #define _H4_PINS HEATER_4_PIN, E4_AUTO_FAN_PIN, analogInputToDigitalPin(TEMP_4_PIN),
+ #if HOTENDS > 5
+ #undef _H5_PINS
+ #define _H5_PINS HEATER_5_PIN, E5_AUTO_FAN_PIN, analogInputToDigitalPin(TEMP_5_PIN),
+ #endif // HOTENDS > 5
+ #endif // HOTENDS > 4
+ #endif // HOTENDS > 3
+ #endif // HOTENDS > 2
+#endif // HOTENDS > 1
+
+#define _BED_PINS HEATER_BED_PIN, analogInputToDigitalPin(TEMP_BED_PIN),
+
+//
+// Dual X, Dual Y, Multi-Z
+// Chip Select and Digital Micro-stepping
+//
+
+#if ENABLED(DUAL_X_CARRIAGE) || ENABLED(X_DUAL_STEPPER_DRIVERS)
+ #if PIN_EXISTS(X2_CS)
+ #define _X2_CS X2_CS_PIN,
+ #else
+ #define _X2_CS
+ #endif
+ #if PIN_EXISTS(X2_MS1)
+ #define _X2_MS1 X2_MS1_PIN,
+ #else
+ #define _X2_MS1
+ #endif
+ #if PIN_EXISTS(X2_MS2)
+ #define _X2_MS2 X2_MS2_PIN,
+ #else
+ #define _X2_MS2
+ #endif
+ #if PIN_EXISTS(X2_MS3)
+ #define _X2_MS3 X2_MS3_PIN,
+ #else
+ #define _X2_MS3
+ #endif
+ #define _X2_PINS X2_STEP_PIN, X2_DIR_PIN, X2_ENABLE_PIN, _X2_CS _X2_MS1 _X2_MS2 _X2_MS3
+#else
+ #define _X2_PINS
+#endif
+
+#if ENABLED(Y_DUAL_STEPPER_DRIVERS)
+ #if PIN_EXISTS(Y2_CS)
+ #define _Y2_CS Y2_CS_PIN,
+ #else
+ #define _Y2_CS
+ #endif
+ #if PIN_EXISTS(Y2_MS1)
+ #define _Y2_MS1 Y2_MS1_PIN,
+ #else
+ #define _Y2_MS1
+ #endif
+ #if PIN_EXISTS(Y2_MS2)
+ #define _Y2_MS2 Y2_MS2_PIN,
+ #else
+ #define _Y2_MS2
+ #endif
+ #if PIN_EXISTS(Y2_MS3)
+ #define _Y2_MS3 Y2_MS3_PIN,
+ #else
+ #define _Y2_MS3
+ #endif
+ #define _Y2_PINS Y2_STEP_PIN, Y2_DIR_PIN, Y2_ENABLE_PIN, _Y2_CS _Y2_MS1 _Y2_MS2 _Y2_MS3
+#else
+ #define _Y2_PINS
+#endif
+
+#if Z_MULTI_STEPPER_DRIVERS
+ #if PIN_EXISTS(Z2_CS)
+ #define _Z2_CS Z2_CS_PIN,
+ #else
+ #define _Z2_CS
+ #endif
+ #if PIN_EXISTS(Z2_MS1)
+ #define _Z2_MS1 Z2_MS1_PIN,
+ #else
+ #define _Z2_MS1
+ #endif
+ #if PIN_EXISTS(Z2_MS2)
+ #define _Z2_MS2 Z2_MS2_PIN,
+ #else
+ #define _Z2_MS2
+ #endif
+ #if PIN_EXISTS(Z2_MS3)
+ #define _Z2_MS3 Z2_MS3_PIN,
+ #else
+ #define _Z2_MS3
+ #endif
+ #define _Z2_PINS Z2_STEP_PIN, Z2_DIR_PIN, Z2_ENABLE_PIN, _Z2_CS _Z2_MS1 _Z2_MS2 _Z2_MS3
+#else
+ #define _Z2_PINS
+#endif
+
+#if ENABLED(Z_TRIPLE_STEPPER_DRIVERS)
+ #if PIN_EXISTS(Z3_CS)
+ #define _Z3_CS Z3_CS_PIN,
+ #else
+ #define _Z3_CS
+ #endif
+ #if PIN_EXISTS(Z3_MS1)
+ #define _Z3_MS1 Z3_MS1_PIN,
+ #else
+ #define _Z3_MS1
+ #endif
+ #if PIN_EXISTS(Z3_MS2)
+ #define _Z3_MS2 Z3_MS2_PIN,
+ #else
+ #define _Z3_MS2
+ #endif
+ #if PIN_EXISTS(Z3_MS3)
+ #define _Z3_MS3 Z3_MS3_PIN,
+ #else
+ #define _Z3_MS3
+ #endif
+ #define _Z3_PINS Z3_STEP_PIN, Z3_DIR_PIN, Z3_ENABLE_PIN, _Z3_CS _Z3_MS1 _Z3_MS2 _Z3_MS3
+#else
+ #define _Z3_PINS
+#endif
+
+//
+// Generate the final Sensitive Pins array,
+// keeping the array as small as possible.
+//
+
+#if PIN_EXISTS(PS_ON)
+ #define _PS_ON PS_ON_PIN,
+#else
+ #define _PS_ON
+#endif
+
+#if HAS_BED_PROBE && PIN_EXISTS(Z_MIN_PROBE)
+ #define _Z_PROBE Z_MIN_PROBE_PIN,
+#else
+ #define _Z_PROBE
+#endif
+
+#if TEMP_SENSOR_BED && PIN_EXISTS(HEATER_BED)
+ #define _HEATER_BED HEATER_BED_PIN,
+#else
+ #define _HEATER_BED
+#endif
+
+#if PIN_EXISTS(FAN)
+ #define _FAN0 FAN_PIN,
+#else
+ #define _FAN0
+#endif
+#if PIN_EXISTS(FAN1)
+ #define _FAN1 FAN1_PIN,
+#else
+ #define _FAN1
+#endif
+#if PIN_EXISTS(FAN2)
+ #define _FAN2 FAN2_PIN,
+#else
+ #define _FAN2
+#endif
+#if PIN_EXISTS(CONTROLLER_FAN)
+ #define _FANC CONTROLLER_FAN_PIN,
+#else
+ #define _FANC
+#endif
+
+#ifndef HAL_SENSITIVE_PINS
+ #define HAL_SENSITIVE_PINS
+#endif
+
+#define SENSITIVE_PINS { \
+ _X_PINS _Y_PINS _Z_PINS _X2_PINS _Y2_PINS _Z2_PINS _Z3_PINS _Z_PROBE \
+ _E0_PINS _E1_PINS _E2_PINS _E3_PINS _E4_PINS _E5_PINS _BED_PINS \
+ _H0_PINS _H1_PINS _H2_PINS _H3_PINS _H4_PINS _H5_PINS \
+ _PS_ON _HEATER_BED _FAN0 _FAN1 _FAN2 _FANC \
+ HAL_SENSITIVE_PINS \
+}