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 \ +}