From 95e0ed2826e0c9d2f121acb145eb97927fc6190a Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Sat, 20 Feb 2021 00:12:21 +0000 Subject: [PATCH 001/253] [cron] Bump distribution date (2021-02-20) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index d73a620fb7..3be07441a7 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2021-02-19" + #define STRING_DISTRIBUTION_DATE "2021-02-20" #endif /** From b8d7925d0d69e9b2d41a2e72e47668830d9a5351 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Sun, 21 Feb 2021 00:13:04 +0000 Subject: [PATCH 002/253] [cron] Bump distribution date (2021-02-21) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 3be07441a7..fdef70665c 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2021-02-20" + #define STRING_DISTRIBUTION_DATE "2021-02-21" #endif /** From b3ecede429d90e1a493b02e31b2c1d67411ce5da Mon Sep 17 00:00:00 2001 From: ellensp Date: Sun, 21 Feb 2021 15:14:47 +1300 Subject: [PATCH 003/253] Fix G29 missing defines (#21145) Co-authored-by: ellensp --- Marlin/src/module/probe.cpp | 8 -------- Marlin/src/module/probe.h | 9 +++++++++ 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/Marlin/src/module/probe.cpp b/Marlin/src/module/probe.cpp index 8cda039db6..6df115225e 100644 --- a/Marlin/src/module/probe.cpp +++ b/Marlin/src/module/probe.cpp @@ -335,14 +335,6 @@ FORCE_INLINE void probe_specific_action(const bool deploy) { #define PROBING_BED_TEMP 0 #endif #endif - #if ENABLED(PREHEAT_BEFORE_LEVELING) - #ifndef LEVELING_NOZZLE_TEMP - #define LEVELING_NOZZLE_TEMP 0 - #endif - #ifndef LEVELING_BED_TEMP - #define LEVELING_BED_TEMP 0 - #endif - #endif /** * Do preheating as required before leveling or probing. diff --git a/Marlin/src/module/probe.h b/Marlin/src/module/probe.h index d28cdff53a..c8b214370c 100644 --- a/Marlin/src/module/probe.h +++ b/Marlin/src/module/probe.h @@ -44,6 +44,15 @@ #define PROBE_TRIGGERED() (READ(Z_MIN_PIN) != Z_MIN_ENDSTOP_INVERTING) #endif +#if ENABLED(PREHEAT_BEFORE_LEVELING) + #ifndef LEVELING_NOZZLE_TEMP + #define LEVELING_NOZZLE_TEMP 0 + #endif + #ifndef LEVELING_BED_TEMP + #define LEVELING_BED_TEMP 0 + #endif +#endif + class Probe { public: From fb8b421aac943fe3bf8f25789c52dcd97580c818 Mon Sep 17 00:00:00 2001 From: kpishere Date: Sat, 20 Feb 2021 21:20:55 -0500 Subject: [PATCH 004/253] Fix SPI on SMART RAMPS with mega2560 (#21128) --- Marlin/src/lcd/dogm/marlinui_DOGM.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Marlin/src/lcd/dogm/marlinui_DOGM.h b/Marlin/src/lcd/dogm/marlinui_DOGM.h index e5229cd088..e5862d670f 100644 --- a/Marlin/src/lcd/dogm/marlinui_DOGM.h +++ b/Marlin/src/lcd/dogm/marlinui_DOGM.h @@ -88,7 +88,8 @@ #define SMART_RAMPS MB(RAMPS_SMART_EFB, RAMPS_SMART_EEB, RAMPS_SMART_EFF, RAMPS_SMART_EEF, RAMPS_SMART_SF) #define U8G_CLASS U8GLIB_64128N_2X_HAL // 4 stripes (HW-SPI) - #if SMART_RAMPS || DOGLCD_SCK != SD_SCK_PIN || DOGLCD_MOSI != SD_MOSI_PIN + + #if (SMART_RAMPS && defined(__SAM3X8E__)) || DOGLCD_SCK != SD_SCK_PIN || DOGLCD_MOSI != SD_MOSI_PIN #define FORCE_SOFT_SPI // SW-SPI #endif From 8d2885377435e423eaa187b52f33ce5d12fb03be Mon Sep 17 00:00:00 2001 From: X-Ryl669 Date: Sun, 21 Feb 2021 03:22:20 +0100 Subject: [PATCH 005/253] Postmortem Debugging to serial port (#20492) --- Marlin/Configuration_adv.h | 7 + Marlin/src/HAL/AVR/inc/SanityCheck.h | 7 + Marlin/src/HAL/DUE/DebugMonitor.cpp | 342 ---------------- Marlin/src/HAL/DUE/HAL.cpp | 3 + Marlin/src/HAL/DUE/HAL_MinSerial.cpp | 91 +++++ Marlin/src/HAL/DUE/inc/SanityCheck.h | 2 +- Marlin/src/HAL/ESP32/inc/SanityCheck.h | 6 +- Marlin/src/HAL/LINUX/inc/SanityCheck.h | 6 +- Marlin/src/HAL/LPC1768/DebugMonitor.cpp | 322 --------------- Marlin/src/HAL/LPC1768/HAL_MinSerial.cpp | 50 +++ Marlin/src/HAL/LPC1768/inc/SanityCheck.h | 4 +- Marlin/src/HAL/LPC1768/main.cpp | 8 +- Marlin/src/HAL/STM32/HAL.cpp | 4 + Marlin/src/HAL/STM32/HAL_MinSerial.cpp | 152 +++++++ Marlin/src/HAL/STM32/inc/SanityCheck.h | 4 +- Marlin/src/HAL/STM32F1/HAL.cpp | 3 + Marlin/src/HAL/STM32F1/HAL_MinSerial.cpp | 118 ++++++ Marlin/src/HAL/STM32F1/inc/SanityCheck.h | 4 +- Marlin/src/HAL/TEENSY31_32/inc/SanityCheck.h | 6 +- Marlin/src/HAL/TEENSY35_36/inc/SanityCheck.h | 6 +- Marlin/src/HAL/TEENSY40_41/inc/SanityCheck.h | 6 +- Marlin/src/HAL/shared/HAL_MinSerial.cpp | 33 ++ Marlin/src/HAL/shared/HAL_MinSerial.h | 79 ++++ Marlin/src/HAL/shared/backtrace/backtrace.cpp | 28 +- Marlin/src/HAL/shared/backtrace/backtrace.h | 3 + .../src/HAL/shared/backtrace/unwmemaccess.cpp | 72 ++-- .../shared/cpu_exception/exception_arm.cpp | 379 ++++++++++++++++++ .../shared/cpu_exception/exception_hook.cpp | 28 ++ .../HAL/shared/cpu_exception/exception_hook.h | 54 +++ Marlin/src/MarlinCore.cpp | 3 + Marlin/src/gcode/gcode_d.cpp | 21 +- buildroot/share/PlatformIO/scripts/exc.S | 104 +++++ .../scripts/fix_framework_weakness.py | 29 ++ platformio.ini | 42 +- 34 files changed, 1286 insertions(+), 740 deletions(-) delete mode 100644 Marlin/src/HAL/DUE/DebugMonitor.cpp create mode 100644 Marlin/src/HAL/DUE/HAL_MinSerial.cpp delete mode 100644 Marlin/src/HAL/LPC1768/DebugMonitor.cpp create mode 100644 Marlin/src/HAL/LPC1768/HAL_MinSerial.cpp create mode 100644 Marlin/src/HAL/STM32/HAL_MinSerial.cpp create mode 100644 Marlin/src/HAL/STM32F1/HAL_MinSerial.cpp create mode 100644 Marlin/src/HAL/shared/HAL_MinSerial.cpp create mode 100644 Marlin/src/HAL/shared/HAL_MinSerial.h create mode 100644 Marlin/src/HAL/shared/cpu_exception/exception_arm.cpp create mode 100644 Marlin/src/HAL/shared/cpu_exception/exception_hook.cpp create mode 100644 Marlin/src/HAL/shared/cpu_exception/exception_hook.h create mode 100644 buildroot/share/PlatformIO/scripts/exc.S create mode 100644 buildroot/share/PlatformIO/scripts/fix_framework_weakness.py diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index f615a54671..987ac293b2 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -3732,3 +3732,10 @@ // Enable Marlin dev mode which adds some special commands //#define MARLIN_DEV_MODE + +/** + * Postmortem Debugging captures misbehavior and outputs the CPU status and backtrace to serial. + * When running in the debugger it will break for debugging. This is useful to help understand + * a crash from a remote location. Requires ~400 bytes of SRAM and 5Kb of flash. + */ +//#define POSTMORTEM_DEBUGGING diff --git a/Marlin/src/HAL/AVR/inc/SanityCheck.h b/Marlin/src/HAL/AVR/inc/SanityCheck.h index 731cf92865..51ba247953 100644 --- a/Marlin/src/HAL/AVR/inc/SanityCheck.h +++ b/Marlin/src/HAL/AVR/inc/SanityCheck.h @@ -56,3 +56,10 @@ #if BOTH(HAS_TMC_SW_SERIAL, MONITOR_DRIVER_STATUS) #error "MONITOR_DRIVER_STATUS causes performance issues when used with SoftwareSerial-connected drivers. Disable MONITOR_DRIVER_STATUS or use hardware serial to continue." #endif + +/** + * Postmortem debugging + */ +#if ENABLED(POSTMORTEM_DEBUGGING) + #error "POSTMORTEM_DEBUGGING is not supported on AVR boards." +#endif diff --git a/Marlin/src/HAL/DUE/DebugMonitor.cpp b/Marlin/src/HAL/DUE/DebugMonitor.cpp deleted file mode 100644 index 79759151d8..0000000000 --- a/Marlin/src/HAL/DUE/DebugMonitor.cpp +++ /dev/null @@ -1,342 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 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 . - * - */ -#ifdef ARDUINO_ARCH_SAM - -#include "../../core/macros.h" -#include "../../core/serial.h" - -#include "../shared/backtrace/unwinder.h" -#include "../shared/backtrace/unwmemaccess.h" - -#include - -// Debug monitor that dumps to the Programming port all status when -// an exception or WDT timeout happens - And then resets the board - -// All the Monitor routines must run with interrupts disabled and -// under an ISR execution context. That is why we cannot reuse the -// Serial interrupt routines or any C runtime, as we don't know the -// state we are when running them - -// A SW memory barrier, to ensure GCC does not overoptimize loops -#define sw_barrier() __asm__ volatile("": : :"memory"); - -// (re)initialize UART0 as a monitor output to 250000,n,8,1 -static void TXBegin() { - - // Disable UART interrupt in NVIC - NVIC_DisableIRQ( UART_IRQn ); - - // We NEED memory barriers to ensure Interrupts are actually disabled! - // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the ) - __DSB(); - __ISB(); - - // Disable clock - pmc_disable_periph_clk( ID_UART ); - - // Configure PMC - pmc_enable_periph_clk( ID_UART ); - - // Disable PDC channel - UART->UART_PTCR = UART_PTCR_RXTDIS | UART_PTCR_TXTDIS; - - // Reset and disable receiver and transmitter - UART->UART_CR = UART_CR_RSTRX | UART_CR_RSTTX | UART_CR_RXDIS | UART_CR_TXDIS; - - // Configure mode: 8bit, No parity, 1 bit stop - UART->UART_MR = UART_MR_CHMODE_NORMAL | US_MR_CHRL_8_BIT | US_MR_NBSTOP_1_BIT | UART_MR_PAR_NO; - - // Configure baudrate (asynchronous, no oversampling) to BAUDRATE bauds - UART->UART_BRGR = (SystemCoreClock / (BAUDRATE << 4)); - - // Enable receiver and transmitter - UART->UART_CR = UART_CR_RXEN | UART_CR_TXEN; -} - -// Send character through UART with no interrupts -static void TX(char c) { - while (!(UART->UART_SR & UART_SR_TXRDY)) { WDT_Restart(WDT); sw_barrier(); }; - UART->UART_THR = c; -} - -// Send String through UART -static void TX(const char* s) { - while (*s) TX(*s++); -} - -static void TXDigit(uint32_t d) { - if (d < 10) TX((char)(d+'0')); - else if (d < 16) TX((char)(d+'A'-10)); - else TX('?'); -} - -// Send Hex number thru UART -static void TXHex(uint32_t v) { - TX("0x"); - for (uint8_t i = 0; i < 8; i++, v <<= 4) - TXDigit((v >> 28) & 0xF); -} - -// Send Decimal number thru UART -static void TXDec(uint32_t v) { - if (!v) { - TX('0'); - return; - } - - char nbrs[14]; - char *p = &nbrs[0]; - while (v != 0) { - *p++ = '0' + (v % 10); - v /= 10; - } - do { - p--; - TX(*p); - } while (p != &nbrs[0]); -} - -// Dump a backtrace entry -static bool UnwReportOut(void* ctx, const UnwReport* bte) { - int* p = (int*)ctx; - - (*p)++; - TX('#'); TXDec(*p); TX(" : "); - TX(bte->name?bte->name:"unknown"); TX('@'); TXHex(bte->function); - TX('+'); TXDec(bte->address - bte->function); - TX(" PC:");TXHex(bte->address); TX('\n'); - return true; -} - -#ifdef UNW_DEBUG - void UnwPrintf(const char* format, ...) { - char dest[256]; - va_list argptr; - va_start(argptr, format); - vsprintf(dest, format, argptr); - va_end(argptr); - TX(&dest[0]); - } -#endif - -/* Table of function pointers for passing to the unwinder */ -static const UnwindCallbacks UnwCallbacks = { - UnwReportOut, - UnwReadW, - UnwReadH, - UnwReadB - #ifdef UNW_DEBUG - , UnwPrintf - #endif -}; - -/** - * HardFaultHandler_C: - * This is called from the HardFault_HandlerAsm with a pointer the Fault stack - * as the parameter. We can then read the values from the stack and place them - * into local variables for ease of reading. - * We then read the various Fault Status and Address Registers to help decode - * cause of the fault. - * The function ends with a BKPT instruction to force control back into the debugger - */ -extern "C" -void HardFault_HandlerC(unsigned long *sp, unsigned long lr, unsigned long cause) { - - static const char* causestr[] = { - "NMI","Hard","Mem","Bus","Usage","Debug","WDT","RSTC" - }; - - UnwindFrame btf; - - // Dump report to the Programming port (interrupts are DISABLED) - TXBegin(); - TX("\n\n## Software Fault detected ##\n"); - TX("Cause: "); TX(causestr[cause]); TX('\n'); - - TX("R0 : "); TXHex(((unsigned long)sp[0])); TX('\n'); - TX("R1 : "); TXHex(((unsigned long)sp[1])); TX('\n'); - TX("R2 : "); TXHex(((unsigned long)sp[2])); TX('\n'); - TX("R3 : "); TXHex(((unsigned long)sp[3])); TX('\n'); - TX("R12 : "); TXHex(((unsigned long)sp[4])); TX('\n'); - TX("LR : "); TXHex(((unsigned long)sp[5])); TX('\n'); - TX("PC : "); TXHex(((unsigned long)sp[6])); TX('\n'); - TX("PSR : "); TXHex(((unsigned long)sp[7])); TX('\n'); - - // Configurable Fault Status Register - // Consists of MMSR, BFSR and UFSR - TX("CFSR : "); TXHex((*((volatile unsigned long *)(0xE000ED28)))); TX('\n'); - - // Hard Fault Status Register - TX("HFSR : "); TXHex((*((volatile unsigned long *)(0xE000ED2C)))); TX('\n'); - - // Debug Fault Status Register - TX("DFSR : "); TXHex((*((volatile unsigned long *)(0xE000ED30)))); TX('\n'); - - // Auxiliary Fault Status Register - TX("AFSR : "); TXHex((*((volatile unsigned long *)(0xE000ED3C)))); TX('\n'); - - // Read the Fault Address Registers. These may not contain valid values. - // Check BFARVALID/MMARVALID to see if they are valid values - // MemManage Fault Address Register - TX("MMAR : "); TXHex((*((volatile unsigned long *)(0xE000ED34)))); TX('\n'); - - // Bus Fault Address Register - TX("BFAR : "); TXHex((*((volatile unsigned long *)(0xE000ED38)))); TX('\n'); - - TX("ExcLR: "); TXHex(lr); TX('\n'); - TX("ExcSP: "); TXHex((unsigned long)sp); TX('\n'); - - btf.sp = ((unsigned long)sp) + 8*4; // The original stack pointer - btf.fp = btf.sp; - btf.lr = ((unsigned long)sp[5]); - btf.pc = ((unsigned long)sp[6]) | 1; // Force Thumb, as CORTEX only support it - - // Perform a backtrace - TX("\nBacktrace:\n\n"); - int ctr = 0; - UnwindStart(&btf, &UnwCallbacks, &ctr); - - // Disable all NVIC interrupts - NVIC->ICER[0] = 0xFFFFFFFF; - NVIC->ICER[1] = 0xFFFFFFFF; - - // Relocate VTOR table to default position - SCB->VTOR = 0; - - // Disable USB - otg_disable(); - - // Restart watchdog - WDT_Restart(WDT); - - // Reset controller - NVIC_SystemReset(); - for (;;) WDT_Restart(WDT); -} - -__attribute__((naked)) void NMI_Handler() { - __asm__ __volatile__ ( - ".syntax unified" "\n\t" - A("tst lr, #4") - A("ite eq") - A("mrseq r0, msp") - A("mrsne r0, psp") - A("mov r1,lr") - A("mov r2,#0") - A("b HardFault_HandlerC") - ); -} - -__attribute__((naked)) void HardFault_Handler() { - __asm__ __volatile__ ( - ".syntax unified" "\n\t" - A("tst lr, #4") - A("ite eq") - A("mrseq r0, msp") - A("mrsne r0, psp") - A("mov r1,lr") - A("mov r2,#1") - A("b HardFault_HandlerC") - ); -} - -__attribute__((naked)) void MemManage_Handler() { - __asm__ __volatile__ ( - ".syntax unified" "\n\t" - A("tst lr, #4") - A("ite eq") - A("mrseq r0, msp") - A("mrsne r0, psp") - A("mov r1,lr") - A("mov r2,#2") - A("b HardFault_HandlerC") - ); -} - -__attribute__((naked)) void BusFault_Handler() { - __asm__ __volatile__ ( - ".syntax unified" "\n\t" - A("tst lr, #4") - A("ite eq") - A("mrseq r0, msp") - A("mrsne r0, psp") - A("mov r1,lr") - A("mov r2,#3") - A("b HardFault_HandlerC") - ); -} - -__attribute__((naked)) void UsageFault_Handler() { - __asm__ __volatile__ ( - ".syntax unified" "\n\t" - A("tst lr, #4") - A("ite eq") - A("mrseq r0, msp") - A("mrsne r0, psp") - A("mov r1,lr") - A("mov r2,#4") - A("b HardFault_HandlerC") - ); -} - -__attribute__((naked)) void DebugMon_Handler() { - __asm__ __volatile__ ( - ".syntax unified" "\n\t" - A("tst lr, #4") - A("ite eq") - A("mrseq r0, msp") - A("mrsne r0, psp") - A("mov r1,lr") - A("mov r2,#5") - A("b HardFault_HandlerC") - ); -} - -/* This is NOT an exception, it is an interrupt handler - Nevertheless, the framing is the same */ -__attribute__((naked)) void WDT_Handler() { - __asm__ __volatile__ ( - ".syntax unified" "\n\t" - A("tst lr, #4") - A("ite eq") - A("mrseq r0, msp") - A("mrsne r0, psp") - A("mov r1,lr") - A("mov r2,#6") - A("b HardFault_HandlerC") - ); -} - -__attribute__((naked)) void RSTC_Handler() { - __asm__ __volatile__ ( - ".syntax unified" "\n\t" - A("tst lr, #4") - A("ite eq") - A("mrseq r0, msp") - A("mrsne r0, psp") - A("mov r1,lr") - A("mov r2,#7") - A("b HardFault_HandlerC") - ); -} - -#endif // ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/DUE/HAL.cpp b/Marlin/src/HAL/DUE/HAL.cpp index c15adee0c7..034b86ccb0 100644 --- a/Marlin/src/HAL/DUE/HAL.cpp +++ b/Marlin/src/HAL/DUE/HAL.cpp @@ -40,6 +40,8 @@ uint16_t HAL_adc_result; // Public functions // ------------------------ +TERN_(POSTMORTEM_DEBUGGING, extern void install_min_serial()); + // HAL initialization task void HAL_init() { // Initialize the USB stack @@ -47,6 +49,7 @@ void HAL_init() { OUT_WRITE(SDSS, HIGH); // Try to set SDSS inactive before any other SPI users start up #endif usb_task_init(); + TERN_(POSTMORTEM_DEBUGGING, install_min_serial()); // Install the min serial handler } // HAL idle task diff --git a/Marlin/src/HAL/DUE/HAL_MinSerial.cpp b/Marlin/src/HAL/DUE/HAL_MinSerial.cpp new file mode 100644 index 0000000000..93c4ed67d6 --- /dev/null +++ b/Marlin/src/HAL/DUE/HAL_MinSerial.cpp @@ -0,0 +1,91 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 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 . + * + */ +#ifdef ARDUINO_ARCH_SAM + +#include "../../inc/MarlinConfigPre.h" + +#if ENABLED(POSTMORTEM_DEBUGGING) + +#include "../shared/HAL_MinSerial.h" + +#include + +static void TXBegin() { + // Disable UART interrupt in NVIC + NVIC_DisableIRQ( UART_IRQn ); + + // We NEED memory barriers to ensure Interrupts are actually disabled! + // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the ) + __DSB(); + __ISB(); + + // Disable clock + pmc_disable_periph_clk( ID_UART ); + + // Configure PMC + pmc_enable_periph_clk( ID_UART ); + + // Disable PDC channel + UART->UART_PTCR = UART_PTCR_RXTDIS | UART_PTCR_TXTDIS; + + // Reset and disable receiver and transmitter + UART->UART_CR = UART_CR_RSTRX | UART_CR_RSTTX | UART_CR_RXDIS | UART_CR_TXDIS; + + // Configure mode: 8bit, No parity, 1 bit stop + UART->UART_MR = UART_MR_CHMODE_NORMAL | US_MR_CHRL_8_BIT | US_MR_NBSTOP_1_BIT | UART_MR_PAR_NO; + + // Configure baudrate (asynchronous, no oversampling) to BAUDRATE bauds + UART->UART_BRGR = (SystemCoreClock / (BAUDRATE << 4)); + + // Enable receiver and transmitter + UART->UART_CR = UART_CR_RXEN | UART_CR_TXEN; +} + +// A SW memory barrier, to ensure GCC does not overoptimize loops +#define sw_barrier() __asm__ volatile("": : :"memory"); +static void TX(char c) { + while (!(UART->UART_SR & UART_SR_TXRDY)) { WDT_Restart(WDT); sw_barrier(); }; + UART->UART_THR = c; +} + +void install_min_serial() { + HAL_min_serial_init = &TXBegin; + HAL_min_serial_out = &TX; +} + +#if DISABLED(DYNAMIC_VECTORTABLE) +extern "C" { + __attribute__((naked)) void JumpHandler_ASM() { + __asm__ __volatile__ ( + "b CommonHandler_ASM\n" + ); + } + void __attribute__((naked, alias("JumpHandler_ASM"))) HardFault_Handler(); + void __attribute__((naked, alias("JumpHandler_ASM"))) BusFault_Handler(); + void __attribute__((naked, alias("JumpHandler_ASM"))) UsageFault_Handler(); + void __attribute__((naked, alias("JumpHandler_ASM"))) MemManage_Handler(); + void __attribute__((naked, alias("JumpHandler_ASM"))) NMI_Handler(); +} +#endif + +#endif // POSTMORTEM_DEBUGGING +#endif // ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/DUE/inc/SanityCheck.h b/Marlin/src/HAL/DUE/inc/SanityCheck.h index 26fb44f398..87b09cf292 100644 --- a/Marlin/src/HAL/DUE/inc/SanityCheck.h +++ b/Marlin/src/HAL/DUE/inc/SanityCheck.h @@ -57,5 +57,5 @@ #endif #if HAS_TMC_SW_SERIAL - #error "TMC220x Software Serial is not supported on this platform." + #error "TMC220x Software Serial is not supported on the DUE platform." #endif diff --git a/Marlin/src/HAL/ESP32/inc/SanityCheck.h b/Marlin/src/HAL/ESP32/inc/SanityCheck.h index f57a6c5910..8bbc68d871 100644 --- a/Marlin/src/HAL/ESP32/inc/SanityCheck.h +++ b/Marlin/src/HAL/ESP32/inc/SanityCheck.h @@ -30,9 +30,13 @@ #endif #if HAS_TMC_SW_SERIAL - #error "TMC220x Software Serial is not supported on this platform." + #error "TMC220x Software Serial is not supported on ESP32." #endif #if BOTH(WIFISUPPORT, ESP3D_WIFISUPPORT) #error "Only enable one WiFi option, either WIFISUPPORT or ESP3D_WIFISUPPORT." #endif + +#if ENABLED(POSTMORTEM_DEBUGGING) + #error "POSTMORTEM_DEBUGGING is not yet supported on ESP32." +#endif diff --git a/Marlin/src/HAL/LINUX/inc/SanityCheck.h b/Marlin/src/HAL/LINUX/inc/SanityCheck.h index 84167c97a1..45bb2662ac 100644 --- a/Marlin/src/HAL/LINUX/inc/SanityCheck.h +++ b/Marlin/src/HAL/LINUX/inc/SanityCheck.h @@ -35,5 +35,9 @@ #endif #if HAS_TMC_SW_SERIAL - #error "TMC220x Software Serial is not supported on this platform." + #error "TMC220x Software Serial is not supported on LINUX." +#endif + +#if ENABLED(POSTMORTEM_DEBUGGING) + #error "POSTMORTEM_DEBUGGING is not yet supported on LINUX." #endif diff --git a/Marlin/src/HAL/LPC1768/DebugMonitor.cpp b/Marlin/src/HAL/LPC1768/DebugMonitor.cpp deleted file mode 100644 index 783b10cfac..0000000000 --- a/Marlin/src/HAL/LPC1768/DebugMonitor.cpp +++ /dev/null @@ -1,322 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 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 . - * - */ -#ifdef TARGET_LPC1768 - -#include "../../core/macros.h" -#include "../../core/serial.h" -#include - -#include "../shared/backtrace/unwinder.h" -#include "../shared/backtrace/unwmemaccess.h" -#include "watchdog.h" -#include - - -// Debug monitor that dumps to the Programming port all status when -// an exception or WDT timeout happens - And then resets the board - -// All the Monitor routines must run with interrupts disabled and -// under an ISR execution context. That is why we cannot reuse the -// Serial interrupt routines or any C runtime, as we don't know the -// state we are when running them - -// A SW memory barrier, to ensure GCC does not overoptimize loops -#define sw_barrier() __asm__ volatile("": : :"memory"); - -// (re)initialize UART0 as a monitor output to 250000,n,8,1 -static void TXBegin() { -} - -// Send character through UART with no interrupts -static void TX(char c) { - _DBC(c); -} - -// Send String through UART -static void TX(const char* s) { - while (*s) TX(*s++); -} - -static void TXDigit(uint32_t d) { - if (d < 10) TX((char)(d+'0')); - else if (d < 16) TX((char)(d+'A'-10)); - else TX('?'); -} - -// Send Hex number thru UART -static void TXHex(uint32_t v) { - TX("0x"); - for (uint8_t i = 0; i < 8; i++, v <<= 4) - TXDigit((v >> 28) & 0xF); -} - -// Send Decimal number thru UART -static void TXDec(uint32_t v) { - if (!v) { - TX('0'); - return; - } - - char nbrs[14]; - char *p = &nbrs[0]; - while (v != 0) { - *p++ = '0' + (v % 10); - v /= 10; - } - do { - p--; - TX(*p); - } while (p != &nbrs[0]); -} - -// Dump a backtrace entry -static bool UnwReportOut(void* ctx, const UnwReport* bte) { - int* p = (int*)ctx; - - (*p)++; - TX('#'); TXDec(*p); TX(" : "); - TX(bte->name?bte->name:"unknown"); TX('@'); TXHex(bte->function); - TX('+'); TXDec(bte->address - bte->function); - TX(" PC:");TXHex(bte->address); TX('\n'); - return true; -} - -#ifdef UNW_DEBUG - void UnwPrintf(const char* format, ...) { - char dest[256]; - va_list argptr; - va_start(argptr, format); - vsprintf(dest, format, argptr); - va_end(argptr); - TX(&dest[0]); - } -#endif - -/* Table of function pointers for passing to the unwinder */ -static const UnwindCallbacks UnwCallbacks = { - UnwReportOut, - UnwReadW, - UnwReadH, - UnwReadB - #ifdef UNW_DEBUG - ,UnwPrintf - #endif -}; - - -/** - * HardFaultHandler_C: - * This is called from the HardFault_HandlerAsm with a pointer the Fault stack - * as the parameter. We can then read the values from the stack and place them - * into local variables for ease of reading. - * We then read the various Fault Status and Address Registers to help decode - * cause of the fault. - * The function ends with a BKPT instruction to force control back into the debugger - */ -extern "C" -void HardFault_HandlerC(unsigned long *sp, unsigned long lr, unsigned long cause) { - - static const char* causestr[] = { - "NMI","Hard","Mem","Bus","Usage","Debug","WDT","RSTC" - }; - - UnwindFrame btf; - - // Dump report to the Programming port (interrupts are DISABLED) - TXBegin(); - TX("\n\n## Software Fault detected ##\n"); - TX("Cause: "); TX(causestr[cause]); TX('\n'); - - TX("R0 : "); TXHex(((unsigned long)sp[0])); TX('\n'); - TX("R1 : "); TXHex(((unsigned long)sp[1])); TX('\n'); - TX("R2 : "); TXHex(((unsigned long)sp[2])); TX('\n'); - TX("R3 : "); TXHex(((unsigned long)sp[3])); TX('\n'); - TX("R12 : "); TXHex(((unsigned long)sp[4])); TX('\n'); - TX("LR : "); TXHex(((unsigned long)sp[5])); TX('\n'); - TX("PC : "); TXHex(((unsigned long)sp[6])); TX('\n'); - TX("PSR : "); TXHex(((unsigned long)sp[7])); TX('\n'); - - // Configurable Fault Status Register - // Consists of MMSR, BFSR and UFSR - TX("CFSR : "); TXHex((*((volatile unsigned long *)(0xE000ED28)))); TX('\n'); - - // Hard Fault Status Register - TX("HFSR : "); TXHex((*((volatile unsigned long *)(0xE000ED2C)))); TX('\n'); - - // Debug Fault Status Register - TX("DFSR : "); TXHex((*((volatile unsigned long *)(0xE000ED30)))); TX('\n'); - - // Auxiliary Fault Status Register - TX("AFSR : "); TXHex((*((volatile unsigned long *)(0xE000ED3C)))); TX('\n'); - - // Read the Fault Address Registers. These may not contain valid values. - // Check BFARVALID/MMARVALID to see if they are valid values - // MemManage Fault Address Register - TX("MMAR : "); TXHex((*((volatile unsigned long *)(0xE000ED34)))); TX('\n'); - - // Bus Fault Address Register - TX("BFAR : "); TXHex((*((volatile unsigned long *)(0xE000ED38)))); TX('\n'); - - TX("ExcLR: "); TXHex(lr); TX('\n'); - TX("ExcSP: "); TXHex((unsigned long)sp); TX('\n'); - - btf.sp = ((unsigned long)sp) + 8*4; // The original stack pointer - btf.fp = btf.sp; - btf.lr = ((unsigned long)sp[5]); - btf.pc = ((unsigned long)sp[6]) | 1; // Force Thumb, as CORTEX only support it - - // Perform a backtrace - TX("\nBacktrace:\n\n"); - int ctr = 0; - UnwindStart(&btf, &UnwCallbacks, &ctr); - - // Disable all NVIC interrupts - NVIC->ICER[0] = 0xFFFFFFFF; - NVIC->ICER[1] = 0xFFFFFFFF; - - // Relocate VTOR table to default position - SCB->VTOR = 0; - - // Clear cause of reset to prevent entering smoothie bootstrap - HAL_clear_reset_source(); - - // Restart watchdog - #if ENABLED(USE_WATCHDOG) - //WDT_Restart(WDT); - watchdog_init(); - #endif - - // Reset controller - NVIC_SystemReset(); - - // Nothing below here is compiled because NVIC_SystemReset loops forever - - for (;;) { TERN_(USE_WATCHDOG, watchdog_init()); } -} - -extern "C" { -__attribute__((naked)) void NMI_Handler() { - __asm__ __volatile__ ( - ".syntax unified" "\n\t" - A("tst lr, #4") - A("ite eq") - A("mrseq r0, msp") - A("mrsne r0, psp") - A("mov r1,lr") - A("mov r2,#0") - A("b HardFault_HandlerC") - ); -} - -__attribute__((naked)) void HardFault_Handler() { - __asm__ __volatile__ ( - ".syntax unified" "\n\t" - A("tst lr, #4") - A("ite eq") - A("mrseq r0, msp") - A("mrsne r0, psp") - A("mov r1,lr") - A("mov r2,#1") - A("b HardFault_HandlerC") - ); -} - -__attribute__((naked)) void MemManage_Handler() { - __asm__ __volatile__ ( - ".syntax unified" "\n\t" - A("tst lr, #4") - A("ite eq") - A("mrseq r0, msp") - A("mrsne r0, psp") - A("mov r1,lr") - A("mov r2,#2") - A("b HardFault_HandlerC") - ); -} - -__attribute__((naked)) void BusFault_Handler() { - __asm__ __volatile__ ( - ".syntax unified" "\n\t" - A("tst lr, #4") - A("ite eq") - A("mrseq r0, msp") - A("mrsne r0, psp") - A("mov r1,lr") - A("mov r2,#3") - A("b HardFault_HandlerC") - ); -} - -__attribute__((naked)) void UsageFault_Handler() { - __asm__ __volatile__ ( - ".syntax unified" "\n\t" - A("tst lr, #4") - A("ite eq") - A("mrseq r0, msp") - A("mrsne r0, psp") - A("mov r1,lr") - A("mov r2,#4") - A("b HardFault_HandlerC") - ); -} - -__attribute__((naked)) void DebugMon_Handler() { - __asm__ __volatile__ ( - ".syntax unified" "\n\t" - A("tst lr, #4") - A("ite eq") - A("mrseq r0, msp") - A("mrsne r0, psp") - A("mov r1,lr") - A("mov r2,#5") - A("b HardFault_HandlerC") - ); -} - -/* This is NOT an exception, it is an interrupt handler - Nevertheless, the framing is the same */ -__attribute__((naked)) void WDT_IRQHandler() { - __asm__ __volatile__ ( - ".syntax unified" "\n\t" - A("tst lr, #4") - A("ite eq") - A("mrseq r0, msp") - A("mrsne r0, psp") - A("mov r1,lr") - A("mov r2,#6") - A("b HardFault_HandlerC") - ); -} - -__attribute__((naked)) void RSTC_Handler() { - __asm__ __volatile__ ( - ".syntax unified" "\n\t" - A("tst lr, #4") - A("ite eq") - A("mrseq r0, msp") - A("mrsne r0, psp") - A("mov r1,lr") - A("mov r2,#7") - A("b HardFault_HandlerC") - ); -} -} -#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/LPC1768/HAL_MinSerial.cpp b/Marlin/src/HAL/LPC1768/HAL_MinSerial.cpp new file mode 100644 index 0000000000..ab9af1fe00 --- /dev/null +++ b/Marlin/src/HAL/LPC1768/HAL_MinSerial.cpp @@ -0,0 +1,50 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 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 . + * + */ +#ifdef TARGET_LPC1768 + +#include "HAL.h" + +#if ENABLED(POSTMORTEM_DEBUGGING) + +#include "../shared/HAL_MinSerial.h" +#include + +static void TX(char c) { _DBC(c); } +void install_min_serial() { HAL_min_serial_out = &TX; } + +#if DISABLED(DYNAMIC_VECTORTABLE) +extern "C" { + __attribute__((naked)) void JumpHandler_ASM() { + __asm__ __volatile__ ( + "b CommonHandler_ASM\n" + ); + } + void __attribute__((naked, alias("JumpHandler_ASM"))) HardFault_Handler(); + void __attribute__((naked, alias("JumpHandler_ASM"))) BusFault_Handler(); + void __attribute__((naked, alias("JumpHandler_ASM"))) UsageFault_Handler(); + void __attribute__((naked, alias("JumpHandler_ASM"))) MemManage_Handler(); + void __attribute__((naked, alias("JumpHandler_ASM"))) NMI_Handler(); +} +#endif + +#endif // POSTMORTEM_DEBUGGING +#endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/LPC1768/inc/SanityCheck.h b/Marlin/src/HAL/LPC1768/inc/SanityCheck.h index 10d6737714..dda1c640fa 100644 --- a/Marlin/src/HAL/LPC1768/inc/SanityCheck.h +++ b/Marlin/src/HAL/LPC1768/inc/SanityCheck.h @@ -270,7 +270,7 @@ static_assert(DISABLED(BAUD_RATE_GCODE), "BAUD_RATE_GCODE is not yet supported o #endif #if ENABLED(SERIAL_STATS_MAX_RX_QUEUED) - #error "SERIAL_STATS_MAX_RX_QUEUED is not supported on this platform." + #error "SERIAL_STATS_MAX_RX_QUEUED is not supported on LPC176x." #elif ENABLED(SERIAL_STATS_DROPPED_RX) - #error "SERIAL_STATS_DROPPED_RX is not supported on this platform." + #error "SERIAL_STATS_DROPPED_RX is not supported on LPX176x." #endif diff --git a/Marlin/src/HAL/LPC1768/main.cpp b/Marlin/src/HAL/LPC1768/main.cpp index 1fbeddd9ea..08fb1a1ed5 100644 --- a/Marlin/src/HAL/LPC1768/main.cpp +++ b/Marlin/src/HAL/LPC1768/main.cpp @@ -46,6 +46,8 @@ extern "C" { void SysTick_Callback() { disk_timerproc(); } +TERN_(POSTMORTEM_DEBUGGING, extern void install_min_serial()); + void HAL_init() { // Init LEDs @@ -123,9 +125,7 @@ void HAL_init() { delay(1000); // Give OS time to notice USB_Connect(true); - #if HAS_SD_HOST_DRIVE - MSC_SD_Init(0); // Enable USB SD card access - #endif + TERN_(HAS_SD_HOST_DRIVE, MSC_SD_Init(0)); // Enable USB SD card access const millis_t usb_timeout = millis() + 2000; while (!USB_Configuration && PENDING(millis(), usb_timeout)) { @@ -137,6 +137,8 @@ void HAL_init() { } HAL_timer_init(); + + TERN_(POSTMORTEM_DEBUGGING, install_min_serial()); // Install the min serial handler } // HAL idle task diff --git a/Marlin/src/HAL/STM32/HAL.cpp b/Marlin/src/HAL/STM32/HAL.cpp index e694a16a82..5c7bc3a00b 100644 --- a/Marlin/src/HAL/STM32/HAL.cpp +++ b/Marlin/src/HAL/STM32/HAL.cpp @@ -57,6 +57,8 @@ uint16_t HAL_adc_result; // Public functions // ------------------------ +TERN_(POSTMORTEM_DEBUGGING, extern void install_min_serial()); + // HAL initialization task void HAL_init() { FastIO_init(); @@ -83,6 +85,8 @@ void HAL_init() { USB_Hook_init(); #endif + TERN_(POSTMORTEM_DEBUGGING, install_min_serial()); // Install the min serial handler + #if HAS_SD_HOST_DRIVE MSC_SD_init(); // Enable USB SD card access #endif diff --git a/Marlin/src/HAL/STM32/HAL_MinSerial.cpp b/Marlin/src/HAL/STM32/HAL_MinSerial.cpp new file mode 100644 index 0000000000..823bb6e8f5 --- /dev/null +++ b/Marlin/src/HAL/STM32/HAL_MinSerial.cpp @@ -0,0 +1,152 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (c) 2017 Victor Perez + * + * 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 . + * + */ +#if defined(ARDUINO_ARCH_STM32) && !defined(STM32GENERIC) + +#include "../../inc/MarlinConfigPre.h" + +#if ENABLED(POSTMORTEM_DEBUGGING) + +#include "../shared/HAL_MinSerial.h" +#include "watchdog.h" + +/* Instruction Synchronization Barrier */ +#define isb() __asm__ __volatile__ ("isb" : : : "memory") + +/* Data Synchronization Barrier */ +#define dsb() __asm__ __volatile__ ("dsb" : : : "memory") + +// Dumb mapping over the registers of a USART device on STM32 +struct USARTMin { + volatile uint32_t SR; + volatile uint32_t DR; + volatile uint32_t BRR; + volatile uint32_t CR1; + volatile uint32_t CR2; +}; + +#if WITHIN(SERIAL_PORT, 1, 6) + // Depending on the CPU, the serial port is different for USART1 + static const uintptr_t regsAddr[] = { + TERN(STM32F1xx, 0x40013800, 0x40011000), // USART1 + 0x40004400, // USART2 + 0x40004800, // USART3 + 0x40004C00, // UART4_BASE + 0x40005000, // UART5_BASE + 0x40011400 // USART6 + }; + static USARTMin * regs = (USARTMin*)regsAddr[SERIAL_PORT - 1]; +#endif + +static void TXBegin() { + #if !WITHIN(SERIAL_PORT, 1, 6) + #warning "Using POSTMORTEM_DEBUGGING requires a physical U(S)ART hardware in case of severe error." + #warning "Disabling the severe error reporting feature currently because the used serial port is not a HW port." + #else + // This is common between STM32F1/STM32F2 and STM32F4 + const int nvicUART[] = { /* NVIC_USART1 */ 37, /* NVIC_USART2 */ 38, /* NVIC_USART3 */ 39, /* NVIC_UART4 */ 52, /* NVIC_UART5 */ 53, /* NVIC_USART6 */ 71 }; + int nvicIndex = nvicUART[SERIAL_PORT - 1]; + + struct NVICMin { + volatile uint32_t ISER[32]; + volatile uint32_t ICER[32]; + }; + + NVICMin * nvicBase = (NVICMin*)0xE000E100; + nvicBase->ICER[nvicIndex / 32] |= _BV32(nvicIndex % 32); + + // We NEED memory barriers to ensure Interrupts are actually disabled! + // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the ) + dsb(); + isb(); + + // Example for USART1 disable: (RCC->APB2ENR &= ~(RCC_APB2ENR_USART1EN)) + // Too difficult to reimplement here, let's query the STM32duino macro here + #if SERIAL_PORT == 1 + __HAL_RCC_USART1_CLK_DISABLE(); + __HAL_RCC_USART1_CLK_ENABLE(); + #elif SERIAL_PORT == 2 + __HAL_RCC_USART2_CLK_DISABLE(); + __HAL_RCC_USART2_CLK_ENABLE(); + #elif SERIAL_PORT == 3 + __HAL_RCC_USART3_CLK_DISABLE(); + __HAL_RCC_USART3_CLK_ENABLE(); + #elif SERIAL_PORT == 4 + __HAL_RCC_UART4_CLK_DISABLE(); // BEWARE: UART4 and not USART4 here + __HAL_RCC_UART4_CLK_ENABLE(); + #elif SERIAL_PORT == 5 + __HAL_RCC_UART5_CLK_DISABLE(); // BEWARE: UART5 and not USART5 here + __HAL_RCC_UART5_CLK_ENABLE(); + #elif SERIAL_PORT == 6 + __HAL_RCC_USART6_CLK_DISABLE(); + __HAL_RCC_USART6_CLK_ENABLE(); + #endif + + uint32_t brr = regs->BRR; + regs->CR1 = 0; // Reset the USART + regs->CR2 = 0; // 1 stop bit + + // If we don't touch the BRR (baudrate register), we don't need to recompute. + regs->BRR = brr; + + regs->CR1 = _BV(3) | _BV(13); // 8 bits, no parity, 1 stop bit (TE | UE) + #endif +} + +// A SW memory barrier, to ensure GCC does not overoptimize loops +#define sw_barrier() __asm__ volatile("": : :"memory"); +static void TX(char c) { + #if WITHIN(SERIAL_PORT, 1, 6) + constexpr uint32_t usart_sr_txe = _BV(7); + while (!(regs->SR & usart_sr_txe)) { + TERN_(USE_WATCHDOG, HAL_watchdog_refresh()); + sw_barrier(); + } + regs->DR = c; + #else + // Let's hope a mystical guru will fix this, one day by writting interrupt-free USB CDC ACM code (or, at least, by polling the registers since interrupt will be queued but will never trigger) + // For now, it's completely lost to oblivion. + #endif +} + +void install_min_serial() { + HAL_min_serial_init = &TXBegin; + HAL_min_serial_out = &TX; +} + +#if DISABLED(DYNAMIC_VECTORTABLE) && DISABLED(STM32F0xx) // Cortex M0 can't jump to a symbol that's too far from the current function, so we work around this in exception_arm.cpp +extern "C" { + __attribute__((naked)) void JumpHandler_ASM() { + __asm__ __volatile__ ( + "b CommonHandler_ASM\n" + ); + } + void __attribute__((naked, alias("JumpHandler_ASM"), nothrow)) HardFault_Handler(); + void __attribute__((naked, alias("JumpHandler_ASM"), nothrow)) BusFault_Handler(); + void __attribute__((naked, alias("JumpHandler_ASM"), nothrow)) UsageFault_Handler(); + void __attribute__((naked, alias("JumpHandler_ASM"), nothrow)) MemManage_Handler(); + void __attribute__((naked, alias("JumpHandler_ASM"), nothrow)) NMI_Handler(); +} +#endif + +#endif // POSTMORTEM_DEBUGGING +#endif // ARDUINO_ARCH_STM32 diff --git a/Marlin/src/HAL/STM32/inc/SanityCheck.h b/Marlin/src/HAL/STM32/inc/SanityCheck.h index 4df75a0505..7ee606af7f 100644 --- a/Marlin/src/HAL/STM32/inc/SanityCheck.h +++ b/Marlin/src/HAL/STM32/inc/SanityCheck.h @@ -47,9 +47,9 @@ #endif #if ENABLED(SERIAL_STATS_MAX_RX_QUEUED) - #error "SERIAL_STATS_MAX_RX_QUEUED is not supported on this platform." + #error "SERIAL_STATS_MAX_RX_QUEUED is not supported on STM32." #elif ENABLED(SERIAL_STATS_DROPPED_RX) - #error "SERIAL_STATS_DROPPED_RX is not supported on this platform." + #error "SERIAL_STATS_DROPPED_RX is not supported on STM32." #endif #if ANY(TFT_COLOR_UI, TFT_LVGL_UI, TFT_CLASSIC_UI) && NOT_TARGET(STM32F4xx, STM32F1xx) diff --git a/Marlin/src/HAL/STM32F1/HAL.cpp b/Marlin/src/HAL/STM32F1/HAL.cpp index 2f29b9b0e3..020c623b77 100644 --- a/Marlin/src/HAL/STM32F1/HAL.cpp +++ b/Marlin/src/HAL/STM32F1/HAL.cpp @@ -272,6 +272,8 @@ static void NVIC_SetPriorityGrouping(uint32_t PriorityGroup) { } } #endif +TERN_(POSTMORTEM_DEBUGGING, extern void install_min_serial()); + void HAL_init() { NVIC_SetPriorityGrouping(0x3); #if PIN_EXISTS(LED) @@ -287,6 +289,7 @@ void HAL_init() { delay(1000); // Give OS time to notice OUT_WRITE(USB_CONNECT_PIN, USB_CONNECT_INVERTING); #endif + TERN_(POSTMORTEM_DEBUGGING, install_min_serial()); // Install the minimal serial handler } // HAL idle task diff --git a/Marlin/src/HAL/STM32F1/HAL_MinSerial.cpp b/Marlin/src/HAL/STM32F1/HAL_MinSerial.cpp new file mode 100644 index 0000000000..e6b89f1105 --- /dev/null +++ b/Marlin/src/HAL/STM32F1/HAL_MinSerial.cpp @@ -0,0 +1,118 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (c) 2017 Victor Perez + * + * 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 . + * + */ +#ifdef __STM32F1__ + +#include "../../inc/MarlinConfigPre.h" + +#if ENABLED(POSTMORTEM_DEBUGGING) + +#include "../shared/HAL_MinSerial.h" +#include "watchdog.h" + +#include +#include +#include + +/* Instruction Synchronization Barrier */ +#define isb() __asm__ __volatile__ ("isb" : : : "memory") + +/* Data Synchronization Barrier */ +#define dsb() __asm__ __volatile__ ("dsb" : : : "memory") + +static void TXBegin() { + #if !WITHIN(SERIAL_PORT, 1, 6) + #warning "Using POSTMORTEM_DEBUGGING requires a physical U(S)ART hardware in case of severe error." + #warning "Disabling the severe error reporting feature currently because the used serial port is not a HW port." + #else + // We use MYSERIAL0 here, so we need to figure out how to get the linked register + struct usart_dev* dev = MYSERIAL0.c_dev(); + + // Or use this if removing libmaple + // int irq = dev->irq_num; + // int nvicUART[] = { NVIC_USART1 /* = 37 */, NVIC_USART2 /* = 38 */, NVIC_USART3 /* = 39 */, NVIC_UART4 /* = 52 */, NVIC_UART5 /* = 53 */ }; + // Disabling irq means setting the bit in the NVIC ICER register located at + // Disable UART interrupt in NVIC + nvic_irq_disable(dev->irq_num); + + // Use this if removing libmaple + //NVIC_BASE->ICER[1] |= _BV(irq - 32); + + // We NEED memory barriers to ensure Interrupts are actually disabled! + // ( https://dzone.com/articles/nvic-disabling-interrupts-on-arm-cortex-m-and-the ) + dsb(); + isb(); + + rcc_clk_disable(dev->clk_id); + rcc_clk_enable(dev->clk_id); + + usart_reg_map *regs = dev->regs; + regs->CR1 = 0; // Reset the USART + regs->CR2 = 0; // 1 stop bit + + // If we don't touch the BRR (baudrate register), we don't need to recompute. Else we would need to call + usart_set_baud_rate(dev, 0, BAUDRATE); + + regs->CR1 = (USART_CR1_TE | USART_CR1_UE); // 8 bits, no parity, 1 stop bit + #endif +} + +// A SW memory barrier, to ensure GCC does not overoptimize loops +#define sw_barrier() __asm__ volatile("": : :"memory"); +static void TX(char c) { + #if WITHIN(SERIAL_PORT, 1, 6) + struct usart_dev* dev = MYSERIAL0.c_dev(); + while (!(dev->regs->SR & USART_SR_TXE)) { + TERN_(USE_WATCHDOG, HAL_watchdog_refresh()); + sw_barrier(); + } + dev->regs->DR = c; + #endif +} + +void install_min_serial() { + HAL_min_serial_init = &TXBegin; + HAL_min_serial_out = &TX; +} + +#if DISABLED(DYNAMIC_VECTORTABLE) && DISABLED(STM32F0xx) // Cortex M0 can't branch to a symbol that's too far, so we have a specific hack for them +extern "C" { + __attribute__((naked)) void JumpHandler_ASM() { + __asm__ __volatile__ ( + "b CommonHandler_ASM\n" + ); + } + void __attribute__((naked, alias("JumpHandler_ASM"), nothrow)) __exc_hardfault(); + void __attribute__((naked, alias("JumpHandler_ASM"), nothrow)) __exc_busfault(); + void __attribute__((naked, alias("JumpHandler_ASM"), nothrow)) __exc_usagefault(); + void __attribute__((naked, alias("JumpHandler_ASM"), nothrow)) __exc_memmanage(); + void __attribute__((naked, alias("JumpHandler_ASM"), nothrow)) __exc_nmi(); + void __attribute__((naked, alias("JumpHandler_ASM"), nothrow)) __stm32reservedexception7(); + void __attribute__((naked, alias("JumpHandler_ASM"), nothrow)) __stm32reservedexception8(); + void __attribute__((naked, alias("JumpHandler_ASM"), nothrow)) __stm32reservedexception9(); + void __attribute__((naked, alias("JumpHandler_ASM"), nothrow)) __stm32reservedexception10(); + void __attribute__((naked, alias("JumpHandler_ASM"), nothrow)) __stm32reservedexception13(); +} +#endif + +#endif // POSTMORTEM_DEBUGGING +#endif // __STM32F1__ diff --git a/Marlin/src/HAL/STM32F1/inc/SanityCheck.h b/Marlin/src/HAL/STM32F1/inc/SanityCheck.h index 8d4c54ec0f..89ee66d646 100644 --- a/Marlin/src/HAL/STM32F1/inc/SanityCheck.h +++ b/Marlin/src/HAL/STM32F1/inc/SanityCheck.h @@ -34,9 +34,9 @@ #endif #if ENABLED(SERIAL_STATS_MAX_RX_QUEUED) - #error "SERIAL_STATS_MAX_RX_QUEUED is not supported on this platform." + #error "SERIAL_STATS_MAX_RX_QUEUED is not supported on the STM32F1 platform." #elif ENABLED(SERIAL_STATS_DROPPED_RX) - #error "SERIAL_STATS_DROPPED_RX is not supported on this platform." + #error "SERIAL_STATS_DROPPED_RX is not supported on the STM32F1 platform." #endif #if ENABLED(NEOPIXEL_LED) diff --git a/Marlin/src/HAL/TEENSY31_32/inc/SanityCheck.h b/Marlin/src/HAL/TEENSY31_32/inc/SanityCheck.h index 3932ee6a76..1efa76b1e9 100644 --- a/Marlin/src/HAL/TEENSY31_32/inc/SanityCheck.h +++ b/Marlin/src/HAL/TEENSY31_32/inc/SanityCheck.h @@ -34,5 +34,9 @@ #endif #if HAS_TMC_SW_SERIAL - #error "TMC220x Software Serial is not supported on this platform." + #error "TMC220x Software Serial is not supported on Teensy 3.1/3.2." +#endif + +#if ENABLED(POSTMORTEM_DEBUGGING) + #error "POSTMORTEM_DEBUGGING is not yet supported on Teensy 3.1/3.2." #endif diff --git a/Marlin/src/HAL/TEENSY35_36/inc/SanityCheck.h b/Marlin/src/HAL/TEENSY35_36/inc/SanityCheck.h index ee80e42696..eef2850550 100644 --- a/Marlin/src/HAL/TEENSY35_36/inc/SanityCheck.h +++ b/Marlin/src/HAL/TEENSY35_36/inc/SanityCheck.h @@ -34,5 +34,9 @@ #endif #if HAS_TMC_SW_SERIAL - #error "TMC220x Software Serial is not supported on this platform." + #error "TMC220x Software Serial is not supported on Teensy 3.5/3.6." +#endif + +#if ENABLED(POSTMORTEM_DEBUGGING) + #error "POSTMORTEM_DEBUGGING is not yet supported on Teensy 3.5/3.6." #endif diff --git a/Marlin/src/HAL/TEENSY40_41/inc/SanityCheck.h b/Marlin/src/HAL/TEENSY40_41/inc/SanityCheck.h index fbfe7b0fc3..3d2668d749 100644 --- a/Marlin/src/HAL/TEENSY40_41/inc/SanityCheck.h +++ b/Marlin/src/HAL/TEENSY40_41/inc/SanityCheck.h @@ -34,5 +34,9 @@ #endif #if HAS_TMC_SW_SERIAL - #error "TMC220x Software Serial is not supported on this platform." + #error "TMC220x Software Serial is not supported on Teensy 4.0/4.1." +#endif + +#if ENABLED(POSTMORTEM_DEBUGGING) + #error "POSTMORTEM_DEBUGGING is not yet supported on Teensy 4.0/4.1." #endif diff --git a/Marlin/src/HAL/shared/HAL_MinSerial.cpp b/Marlin/src/HAL/shared/HAL_MinSerial.cpp new file mode 100644 index 0000000000..9dda5fdf8c --- /dev/null +++ b/Marlin/src/HAL/shared/HAL_MinSerial.cpp @@ -0,0 +1,33 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 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 . + * + */ +#include "HAL_MinSerial.h" + +#if ENABLED(POSTMORTEM_DEBUGGING) + +void HAL_min_serial_init_default() {} +void HAL_min_serial_out_default(char ch) { SERIAL_CHAR(ch); } +void (*HAL_min_serial_init)() = &HAL_min_serial_init_default; +void (*HAL_min_serial_out)(char) = &HAL_min_serial_out_default; + +bool MinSerial::force_using_default_output = false; + +#endif diff --git a/Marlin/src/HAL/shared/HAL_MinSerial.h b/Marlin/src/HAL/shared/HAL_MinSerial.h new file mode 100644 index 0000000000..04643c1ab3 --- /dev/null +++ b/Marlin/src/HAL/shared/HAL_MinSerial.h @@ -0,0 +1,79 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 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 + +#include "../../core/serial.h" +#include + +// Serial stuff here +// Inside an exception handler, the CPU state is not safe, we can't expect the handler to resume +// and the software to continue. UART communication can't rely on later callback/interrupt as it might never happen. +// So, you need to provide some method to send one byte to the usual UART with the interrupts disabled +// By default, the method uses SERIAL_CHAR but it's 100% guaranteed to break (couldn't be worse than nothing...)7 +extern void (*HAL_min_serial_init)(); +extern void (*HAL_min_serial_out)(char ch); + +struct MinSerial { + static bool force_using_default_output; + // Serial output + static void TX(char ch) { + if (force_using_default_output) + SERIAL_CHAR(ch); + else + HAL_min_serial_out(ch); + } + // Send String through UART + static void TX(const char* s) { while (*s) TX(*s++); } + // Send a digit through UART + static void TXDigit(uint32_t d) { + if (d < 10) TX((char)(d+'0')); + else if (d < 16) TX((char)(d+'A'-10)); + else TX('?'); + } + + // Send Hex number through UART + static void TXHex(uint32_t v) { + TX("0x"); + for (uint8_t i = 0; i < 8; i++, v <<= 4) + TXDigit((v >> 28) & 0xF); + } + + // Send Decimal number through UART + static void TXDec(uint32_t v) { + if (!v) { + TX('0'); + return; + } + + char nbrs[14]; + char *p = &nbrs[0]; + while (v != 0) { + *p++ = '0' + (v % 10); + v /= 10; + } + do { + p--; + TX(*p); + } while (p != &nbrs[0]); + } + static void init() { if (!force_using_default_output) HAL_min_serial_init(); } +}; diff --git a/Marlin/src/HAL/shared/backtrace/backtrace.cpp b/Marlin/src/HAL/shared/backtrace/backtrace.cpp index 4a8990c00b..8320f47509 100644 --- a/Marlin/src/HAL/shared/backtrace/backtrace.cpp +++ b/Marlin/src/HAL/shared/backtrace/backtrace.cpp @@ -25,7 +25,7 @@ #include "unwinder.h" #include "unwmemaccess.h" -#include "../../../core/serial.h" +#include "../HAL_MinSerial.h" #include // Dump a backtrace entry @@ -34,10 +34,12 @@ static bool UnwReportOut(void* ctx, const UnwReport* bte) { (*p)++; - SERIAL_CHAR('#'); SERIAL_ECHO(*p); SERIAL_ECHOPGM(" : "); - SERIAL_ECHOPGM(bte->name ? bte->name : "unknown"); SERIAL_ECHOPGM("@0x"); SERIAL_PRINT(bte->function, PrintBase::Hex); - SERIAL_CHAR('+'); SERIAL_ECHO(bte->address - bte->function); - SERIAL_ECHOPGM(" PC:"); SERIAL_PRINT(bte->address, PrintBase::Hex); SERIAL_CHAR('\n'); + const uint32_t a = bte->address, f = bte->function; + MinSerial::TX('#'); MinSerial::TXDec(*p); MinSerial::TX(" : "); + MinSerial::TX(bte->name?:"unknown"); MinSerial::TX('@'); MinSerial::TXHex(f); + MinSerial::TX('+'); MinSerial::TXDec(a - f); + MinSerial::TX(" PC:"); MinSerial::TXHex(a); + MinSerial::TX('\n'); return true; } @@ -48,7 +50,7 @@ static bool UnwReportOut(void* ctx, const UnwReport* bte) { va_start(argptr, format); vsprintf(dest, format, argptr); va_end(argptr); - TX(&dest[0]); + MinSerial::TX(&dest[0]); } #endif @@ -63,10 +65,10 @@ static const UnwindCallbacks UnwCallbacks = { #endif }; +// Perform a backtrace to the serial port void backtrace() { - UnwindFrame btf; - uint32_t sp = 0, lr = 0, pc = 0; + unsigned long sp = 0, lr = 0, pc = 0; // Capture the values of the registers to perform the traceback __asm__ __volatile__ ( @@ -79,6 +81,12 @@ void backtrace() { :: ); + backtrace_ex(sp, lr, pc); +} + +void backtrace_ex(unsigned long sp, unsigned long lr, unsigned long pc) { + UnwindFrame btf; + // Fill the traceback structure btf.sp = sp; btf.fp = btf.sp; @@ -86,7 +94,7 @@ void backtrace() { btf.pc = pc | 1; // Force Thumb, as CORTEX only support it // Perform a backtrace - SERIAL_ERROR_MSG("Backtrace:"); + MinSerial::TX("Backtrace:"); int ctr = 0; UnwindStart(&btf, &UnwCallbacks, &ctr); } @@ -95,4 +103,4 @@ void backtrace() { void backtrace() {} -#endif +#endif // __arm__ || __thumb__ diff --git a/Marlin/src/HAL/shared/backtrace/backtrace.h b/Marlin/src/HAL/shared/backtrace/backtrace.h index fccadedaa5..5d2ba601a0 100644 --- a/Marlin/src/HAL/shared/backtrace/backtrace.h +++ b/Marlin/src/HAL/shared/backtrace/backtrace.h @@ -23,3 +23,6 @@ // Perform a backtrace to the serial port void backtrace(); + +// Perform a backtrace to the serial port +void backtrace_ex(unsigned long sp, unsigned long lr, unsigned long pc); diff --git a/Marlin/src/HAL/shared/backtrace/unwmemaccess.cpp b/Marlin/src/HAL/shared/backtrace/unwmemaccess.cpp index 5ca46f9886..2bde1e208d 100644 --- a/Marlin/src/HAL/shared/backtrace/unwmemaccess.cpp +++ b/Marlin/src/HAL/shared/backtrace/unwmemaccess.cpp @@ -41,27 +41,16 @@ #define START_FLASH_ADDR 0x00000000 #define END_FLASH_ADDR 0x00080000 -#elif 0 - - // For STM32F103CBT6 - // SRAM (0x20000000 - 0x20005000) (20kb) - // FLASH (0x00000000 - 0x00020000) (128kb) - // - #define START_SRAM_ADDR 0x20000000 - #define END_SRAM_ADDR 0x20005000 - #define START_FLASH_ADDR 0x00000000 - #define END_FLASH_ADDR 0x00020000 - #elif defined(__STM32F1__) || defined(STM32F1xx) || defined(STM32F0xx) // For STM32F103ZET6/STM32F103VET6/STM32F0xx // SRAM (0x20000000 - 0x20010000) (64kb) - // FLASH (0x00000000 - 0x00080000) (512kb) + // FLASH (0x08000000 - 0x08080000) (512kb) // #define START_SRAM_ADDR 0x20000000 #define END_SRAM_ADDR 0x20010000 - #define START_FLASH_ADDR 0x00000000 - #define END_FLASH_ADDR 0x00080000 + #define START_FLASH_ADDR 0x08000000 + #define END_FLASH_ADDR 0x08080000 #elif defined(STM32F4) || defined(STM32F4xx) @@ -142,20 +131,57 @@ #define START_FLASH_ADDR 0x00000000 #define END_FLASH_ADDR 0x00100000 +#else + // Generic ARM code, that's testing if an access to the given address would cause a fault or not + // It can't guarantee an address is in RAM or Flash only, but we usually don't care + + #define NVIC_FAULT_STAT 0xE000ED28 // Configurable Fault Status Reg. + #define NVIC_CFG_CTRL 0xE000ED14 // Configuration Control Register + #define NVIC_FAULT_STAT_BFARV 0x00008000 // BFAR is valid + #define NVIC_CFG_CTRL_BFHFNMIGN 0x00000100 // Ignore bus fault in NMI/fault + #define HW_REG(X) (*((volatile unsigned long *)(X))) + + static bool validate_addr(uint32_t read_address) { + bool works = true; + uint32_t intDisabled = 0; + // Read current interrupt state + __asm__ __volatile__ ("MRS %[result], PRIMASK\n\t" : [result]"=r"(intDisabled) :: ); // 0 is int enabled, 1 for disabled + + // Clear bus fault indicator first (write 1 to clear) + HW_REG(NVIC_FAULT_STAT) |= NVIC_FAULT_STAT_BFARV; + // Ignore bus fault interrupt + HW_REG(NVIC_CFG_CTRL) |= NVIC_CFG_CTRL_BFHFNMIGN; + // Disable interrupts if not disabled previously + if (!intDisabled) __asm__ __volatile__ ("CPSID f"); + // Probe address + *(volatile uint32_t*)read_address; + // Check if a fault happened + if ((HW_REG(NVIC_FAULT_STAT) & NVIC_FAULT_STAT_BFARV) != 0) + works = false; + // Enable interrupts again if previously disabled + if (!intDisabled) __asm__ __volatile__ ("CPSIE f"); + // Enable fault interrupt flag + HW_REG(NVIC_CFG_CTRL) &= ~NVIC_CFG_CTRL_BFHFNMIGN; + + return works; + } + #endif -static bool validate_addr(uint32_t addr) { +#ifdef START_SRAM_ADDR + static bool validate_addr(uint32_t addr) { - // Address must be in SRAM range - if (addr >= START_SRAM_ADDR && addr < END_SRAM_ADDR) - return true; + // Address must be in SRAM range + if (addr >= START_SRAM_ADDR && addr < END_SRAM_ADDR) + return true; - // Or in FLASH range - if (addr >= START_FLASH_ADDR && addr < END_FLASH_ADDR) - return true; + // Or in FLASH range + if (addr >= START_FLASH_ADDR && addr < END_FLASH_ADDR) + return true; - return false; -} + return false; + } +#endif bool UnwReadW(const uint32_t a, uint32_t *v) { if (!validate_addr(a)) diff --git a/Marlin/src/HAL/shared/cpu_exception/exception_arm.cpp b/Marlin/src/HAL/shared/cpu_exception/exception_arm.cpp new file mode 100644 index 0000000000..090148683f --- /dev/null +++ b/Marlin/src/HAL/shared/cpu_exception/exception_arm.cpp @@ -0,0 +1,379 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Based on Sprinter and grbl. + * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm + * Copyright (c) 2020 Cyril Russo + * + * 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 . + * + */ + +/*************************************************************************** + * ARM CPU Exception handler + ***************************************************************************/ + +#if defined(__arm__) || defined(__thumb__) + + +/* + On ARM CPUs exception handling is quite powerful. + + By default, upon a crash, the CPU enters the handlers that have a higher priority than any other interrupts, + so, in effect, no (real) interrupt can "interrupt" the handler (it's acting like if interrupts were disabled). + + If the handler is not called as re-entrant (that is, if the crash is not happening inside an interrupt or an handler), + then it'll patch the return address to a dumping function (resume_from_fault) and save the crash state. + The CPU will exit the handler and, as such, re-allow the other interrupts, and jump to the dumping function. + In this function, the usual serial port (USB / HW) will be used to dump the crash (no special configuration required). + + The only case where it requires hardware UART is when it's crashing in an interrupt or a crash handler. + In that case, instead of returning to the resume_from_fault function (and thus, re-enabling interrupts), + it jumps to this function directly (so with interrupts disabled), after changing the behavior of the serial output + wrapper to use the HW uart (and in effect, calling MinSerial::init which triggers a warning if you are using + a USB serial port). + + In the case you have a USB serial port, this part will be disabled, and only that part (so that's the reason for + the warning). + This means that you can't have a crash report if the crash happens in an interrupt or an handler if you are using + a USB serial port since it's physically impossible. + You will get a crash report in all other cases. +*/ + +#include "exception_hook.h" +#include "../backtrace/backtrace.h" +#include "../HAL_MinSerial.h" + +#define HW_REG(X) (*((volatile unsigned long *)(X))) + +// Default function use the CPU VTOR register to get the vector table. +// Accessing the CPU VTOR register is done in assembly since it's the only way that's common to all current tool +unsigned long get_vtor() { return HW_REG(0xE000ED08); } // Even if it looks like an error, it is not an error +void * hook_get_hardfault_vector_address(unsigned vtor) { return (void*)(vtor + 0x03); } +void * hook_get_memfault_vector_address(unsigned vtor) { return (void*)(vtor + 0x04); } +void * hook_get_busfault_vector_address(unsigned vtor) { return (void*)(vtor + 0x05); } +void * hook_get_usagefault_vector_address(unsigned vtor) { return (void*)(vtor + 0x06); } +void * hook_get_reserved_vector_address(unsigned vtor) { return (void*)(vtor + 0x07); } + +// Common exception frame for ARM, should work for all ARM CPU +// Described here (modified for convenience): https://interrupt.memfault.com/blog/cortex-m-fault-debug +struct __attribute__((packed)) ContextStateFrame { + uint32_t r0; + uint32_t r1; + uint32_t r2; + uint32_t r3; + uint32_t r12; + uint32_t lr; + uint32_t pc; + uint32_t xpsr; +}; + +struct __attribute__((packed)) ContextSavedFrame { + uint32_t R0; + uint32_t R1; + uint32_t R2; + uint32_t R3; + uint32_t R12; + uint32_t LR; + uint32_t PC; + uint32_t XPSR; + + uint32_t CFSR; + uint32_t HFSR; + uint32_t DFSR; + uint32_t AFSR; + uint32_t MMAR; + uint32_t BFAR; + + uint32_t ESP; + uint32_t ELR; +}; + +#if DISABLED(STM32F0xx) + extern "C" + __attribute__((naked)) void CommonHandler_ASM() { + __asm__ __volatile__ ( + // Bit 2 of LR tells which stack pointer to use (either main or process, only main should be used anyway) + "tst lr, #4\n" + "ite eq\n" + "mrseq r0, msp\n" + "mrsne r0, psp\n" + // Save the LR in use when being interrupted + "mov r1, lr\n" + // Get the exception number from the ICSR register + "ldr r2, =0xE000ED00\n" + "ldr r2, [r2, #4]\n" + "b CommonHandler_C\n" + ); + } +#else // Cortex M0 does not support conditional mov and testing with a constant, so let's have a specific handler for it + extern "C" + __attribute__((naked)) void CommonHandler_ASM() { + __asm__ __volatile__ ( + ".syntax unified\n" + // Save the LR in use when being interrupted + "mov r1, lr\n" + // Get the exception number from the ICSR register + "ldr r2, =0xE000ED00\n" + "ldr r2, [r2, #4]\n" + "movs r0, #4\n" + "tst r1, r0\n" + "beq _MSP\n" + "mrs r0, psp\n" + "b CommonHandler_C\n" + "_MSP:\n" + "mrs r0, msp\n" + "b CommonHandler_C\n" + ); + } + + #if DISABLED(DYNAMIC_VECTORTABLE) // Cortex M0 requires the handler's address to be within 32kB to the actual function to be able to branch to it + extern "C" { + void __attribute__((naked, alias("CommonHandler_ASM"), nothrow)) __exc_hardfault(); + void __attribute__((naked, alias("CommonHandler_ASM"), nothrow)) __exc_busfault(); + void __attribute__((naked, alias("CommonHandler_ASM"), nothrow)) __exc_usagefault(); + void __attribute__((naked, alias("CommonHandler_ASM"), nothrow)) __exc_memmanage(); + void __attribute__((naked, alias("CommonHandler_ASM"), nothrow)) __exc_nmi(); + void __attribute__((naked, alias("CommonHandler_ASM"), nothrow)) __stm32reservedexception7(); + void __attribute__((naked, alias("CommonHandler_ASM"), nothrow)) __stm32reservedexception8(); + void __attribute__((naked, alias("CommonHandler_ASM"), nothrow)) __stm32reservedexception9(); + void __attribute__((naked, alias("CommonHandler_ASM"), nothrow)) __stm32reservedexception10(); + void __attribute__((naked, alias("CommonHandler_ASM"), nothrow)) __stm32reservedexception13(); + } + //TODO When going off from libmaple, you'll need to replace those by the one from STM32/HAL_MinSerial.cpp + #endif +#endif + +// Must be a macro to avoid creating a function frame +#define HALT_IF_DEBUGGING() \ + do { \ + if (HW_REG(0xE000EDF0) & _BV(0)) { \ + __asm("bkpt 1"); \ + } \ +} while (0) + +// Resume from a fault (if possible) so we can still use interrupt based code for serial output +// In that case, we will not jump back to the faulty code, but instead to a dumping code and then a +// basic loop with watchdog calling or manual resetting +static ContextSavedFrame savedFrame; +static uint8_t lastCause; +bool resume_from_fault() { + static const char* causestr[] = { "Thread", "Rsvd", "NMI", "Hard", "Mem", "Bus", "Usage", "7", "8", "9", "10", "SVC", "Dbg", "13", "PendSV", "SysTk", "IRQ" }; + // Reinit the serial link (might only work if implemented in each of your boards) + MinSerial::init(); + + MinSerial::TX("\n\n## Software Fault detected ##\n"); + MinSerial::TX("Cause: "); MinSerial::TX(causestr[min(lastCause, (uint8_t)16)]); MinSerial::TX('\n'); + + MinSerial::TX("R0 : "); MinSerial::TXHex(savedFrame.R0); MinSerial::TX('\n'); + MinSerial::TX("R1 : "); MinSerial::TXHex(savedFrame.R1); MinSerial::TX('\n'); + MinSerial::TX("R2 : "); MinSerial::TXHex(savedFrame.R2); MinSerial::TX('\n'); + MinSerial::TX("R3 : "); MinSerial::TXHex(savedFrame.R3); MinSerial::TX('\n'); + MinSerial::TX("R12 : "); MinSerial::TXHex(savedFrame.R12); MinSerial::TX('\n'); + MinSerial::TX("LR : "); MinSerial::TXHex(savedFrame.LR); MinSerial::TX('\n'); + MinSerial::TX("PC : "); MinSerial::TXHex(savedFrame.PC); MinSerial::TX('\n'); + MinSerial::TX("PSR : "); MinSerial::TXHex(savedFrame.XPSR); MinSerial::TX('\n'); + + // Configurable Fault Status Register + // Consists of MMSR, BFSR and UFSR + MinSerial::TX("CFSR : "); MinSerial::TXHex(savedFrame.CFSR); MinSerial::TX('\n'); + + // Hard Fault Status Register + MinSerial::TX("HFSR : "); MinSerial::TXHex(savedFrame.HFSR); MinSerial::TX('\n'); + + // Debug Fault Status Register + MinSerial::TX("DFSR : "); MinSerial::TXHex(savedFrame.DFSR); MinSerial::TX('\n'); + + // Auxiliary Fault Status Register + MinSerial::TX("AFSR : "); MinSerial::TXHex(savedFrame.AFSR); MinSerial::TX('\n'); + + // Read the Fault Address Registers. These may not contain valid values. + // Check BFARVALID/MMARVALID to see if they are valid values + // MemManage Fault Address Register + MinSerial::TX("MMAR : "); MinSerial::TXHex(savedFrame.MMAR); MinSerial::TX('\n'); + + // Bus Fault Address Register + MinSerial::TX("BFAR : "); MinSerial::TXHex(savedFrame.BFAR); MinSerial::TX('\n'); + + MinSerial::TX("ExcLR: "); MinSerial::TXHex(savedFrame.ELR); MinSerial::TX('\n'); + MinSerial::TX("ExcSP: "); MinSerial::TXHex(savedFrame.ESP); MinSerial::TX('\n'); + + // The stack pointer is pushed by 8 words upon entering an exception, so we need to revert this + backtrace_ex(savedFrame.ESP + 8*4, savedFrame.LR, savedFrame.PC); + + // Call the last resort function here + hook_last_resort_func(); + + const uint32_t start = millis(), end = start + 100; // 100ms should be enough + // We need to wait for the serial buffers to be output but we don't know for how long + // So we'll just need to refresh the watchdog for a while and then stop for the system to reboot + uint32_t last = start; + while (PENDING(last, end)) { + watchdog_refresh(); + while (millis() == last) { /* nada */ } + last = millis(); + MinSerial::TX('.'); + } + + // Reset now by reinstantiating the bootloader's vector table + HW_REG(0xE000ED08) = 0; + // Restart watchdog + #if DISABLED(USE_WATCHDOG) + // No watchdog, let's perform ARMv7 reset instead by writing to AIRCR register with VECTKEY set to SYSRESETREQ + HW_REG(0xE000ED0C) = (HW_REG(0xE000ED0C) & 0x0000FFFF) | 0x05FA0004; + #endif + + while(1) {} // Bad luck, nothing worked +} + +// Make sure the compiler does not optimize the frame argument away +extern "C" +__attribute__((optimize("O0"))) +void CommonHandler_C(ContextStateFrame * frame, unsigned long lr, unsigned long cause) { + + // If you are using it'll stop here + HALT_IF_DEBUGGING(); + + // Save the state to backtrace later on (don't call memcpy here since the stack can be corrupted) + savedFrame.R0 = frame->r0; + savedFrame.R1 = frame->r1; + savedFrame.R2 = frame->r2; + savedFrame.R3 = frame->r3; + savedFrame.R12 = frame->r12; + savedFrame.LR = frame->lr; + savedFrame.PC = frame->pc; + savedFrame.XPSR= frame->xpsr; + lastCause = cause & 0x1FF; + + volatile uint32_t &CFSR = HW_REG(0xE000ED28); + savedFrame.CFSR = CFSR; + savedFrame.HFSR = HW_REG(0xE000ED2C); + savedFrame.DFSR = HW_REG(0xE000ED30); + savedFrame.AFSR = HW_REG(0xE000ED3C); + savedFrame.MMAR = HW_REG(0xE000ED34); + savedFrame.BFAR = HW_REG(0xE000ED38); + savedFrame.ESP = (unsigned long)frame; // Even on return, this should not be overwritten by the CPU + savedFrame.ELR = lr; + + // First check if we can resume from this exception to our own handler safely + // If we can, then we don't need to disable interrupts and the usual serial code + // can be used + + //const uint32_t non_usage_fault_mask = 0x0000FFFF; + //const bool non_usage_fault_occurred = (CFSR & non_usage_fault_mask) != 0; + // the bottom 8 bits of the xpsr hold the exception number of the + // executing exception or 0 if the processor is in Thread mode + const bool faulted_from_exception = ((frame->xpsr & 0xFF) != 0); + if (!faulted_from_exception) { // Not sure about the non_usage_fault, we want to try anyway, don't we ? && !non_usage_fault_occurred) + // Try to resume to our handler here + CFSR |= CFSR; // The ARM programmer manual says you must write to 1 all fault bits to clear them so this instruction is correct + // The frame will not be valid when returning anymore, let's clean it + savedFrame.CFSR = 0; + + frame->pc = (uint32_t)resume_from_fault; // Patch where to return to + frame->lr = 0xdeadbeef; // If our handler returns (it shouldn't), let's make it trigger an exception immediately + frame->xpsr = _BV(24); // Need to clean the PSR register to thumb II only + MinSerial::force_using_default_output = true; + return; // The CPU will resume in our handler hopefully, and we'll try to use default serial output + } + + // Sorry, we need to emergency code here since the fault is too dangerous to recover from + MinSerial::force_using_default_output = false; + resume_from_fault(); +} + +void hook_cpu_exceptions() { + #if ENABLED(DYNAMIC_VECTORTABLE) + // On ARM 32bits CPU, the vector table is like this: + // 0x0C => Hardfault + // 0x10 => MemFault + // 0x14 => BusFault + // 0x18 => UsageFault + + // Unfortunately, it's usually run from flash, and we can't write to flash here directly to hook our instruction + // We could set an hardware breakpoint, and hook on the fly when it's being called, but this + // is hard to get right and would probably break debugger when attached + + // So instead, we'll allocate a new vector table filled with the previous value except + // for the fault we are interested in. + // Now, comes the issue to figure out what is the current vector table size + // There is nothing telling us what is the vector table as it's per-cpu vendor specific. + // BUT: we are being called at the end of the setup, so we assume the setup is done + // Thus, we can read the current vector table until we find an address that's not in flash, and it would mark the + // end of the vector table (skipping the fist entry obviously) + // The position of the program in flash is expected to be at 0x08xxx xxxx on all known platform for ARM and the + // flash size is available via register 0x1FFFF7E0 on STM32 family, but it's not the case for all ARM boards + // (accessing this register might trigger a fault if it's not implemented). + + // So we'll simply mask the top 8 bits of the first handler as an hint of being in the flash or not -that's poor and will + // probably break if the flash happens to be more than 128MB, but in this case, we are not magician, we need help from outside. + + unsigned long * vecAddr = (unsigned long*)get_vtor(); + SERIAL_ECHO("Vector table addr: "); + SERIAL_PRINTLN(get_vtor(), HEX); + + #ifdef VECTOR_TABLE_SIZE + uint32_t vec_size = VECTOR_TABLE_SIZE; + alignas(128) static unsigned long vectable[VECTOR_TABLE_SIZE] ; + #else + #ifndef IS_IN_FLASH + #define IS_IN_FLASH(X) (((unsigned long)X & 0xFF000000) == 0x08000000) + #endif + + // When searching for the end of the vector table, this acts as a limit not to overcome + #ifndef VECTOR_TABLE_SENTINEL + #define VECTOR_TABLE_SENTINEL 80 + #endif + + // Find the vector table size + uint32_t vec_size = 1; + while (IS_IN_FLASH(vecAddr[vec_size]) && vec_size < VECTOR_TABLE_SENTINEL) + vec_size++; + + // We failed to find a valid vector table size, let's abort hooking up + if (vec_size == VECTOR_TABLE_SENTINEL) return; + // Poor method that's wasting RAM here, but allocating with malloc and alignment would be worst + // 128 bytes alignement is required for writing the VTOR register + alignas(128) static unsigned long vectable[VECTOR_TABLE_SENTINEL]; + + SERIAL_ECHO("Detected vector table size: "); + SERIAL_PRINTLN(vec_size, HEX); + #endif + + uint32_t defaultFaultHandler = vecAddr[(unsigned)7]; + // Copy the current vector table into the new table + for (uint32_t i = 0; i < vec_size; i++) { + vectable[i] = vecAddr[i]; + // Replace all default handler by our own handler + if (vectable[i] == defaultFaultHandler) + vectable[i] = (unsigned long)&CommonHandler_ASM; + } + + // Let's hook now with our functions + vectable[(unsigned long)hook_get_hardfault_vector_address(0)] = (unsigned long)&CommonHandler_ASM; + vectable[(unsigned long)hook_get_memfault_vector_address(0)] = (unsigned long)&CommonHandler_ASM; + vectable[(unsigned long)hook_get_busfault_vector_address(0)] = (unsigned long)&CommonHandler_ASM; + vectable[(unsigned long)hook_get_usagefault_vector_address(0)] = (unsigned long)&CommonHandler_ASM; + + // Finally swap with our own vector table + // This is supposed to be atomic, but let's do that with interrupt disabled + + HW_REG(0xE000ED08) = (unsigned long)vectable | _BV32(29); // 29th bit is for telling the CPU the table is now in SRAM (should be present already) + + SERIAL_ECHOLN("Installed fault handlers"); + #endif +} + +#endif // __arm__ || __thumb__ diff --git a/Marlin/src/HAL/shared/cpu_exception/exception_hook.cpp b/Marlin/src/HAL/shared/cpu_exception/exception_hook.cpp new file mode 100644 index 0000000000..93e80f3e85 --- /dev/null +++ b/Marlin/src/HAL/shared/cpu_exception/exception_hook.cpp @@ -0,0 +1,28 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 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 . + * + */ +#include "exception_hook.h" + +void * __attribute__((weak)) hook_get_hardfault_vector_address(unsigned) { return 0; } +void * __attribute__((weak)) hook_get_memfault_vector_address(unsigned) { return 0; } +void * __attribute__((weak)) hook_get_busfault_vector_address(unsigned) { return 0; } +void * __attribute__((weak)) hook_get_usagefault_vector_address(unsigned) { return 0; } +void __attribute__((weak)) hook_last_resort_func() {} diff --git a/Marlin/src/HAL/shared/cpu_exception/exception_hook.h b/Marlin/src/HAL/shared/cpu_exception/exception_hook.h new file mode 100644 index 0000000000..70d9434704 --- /dev/null +++ b/Marlin/src/HAL/shared/cpu_exception/exception_hook.h @@ -0,0 +1,54 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 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 + +/* Here is the expected behavior of a system producing a CPU exception with this hook installed: + 1. Before the system is crashed + 1.1 Upon validation (not done yet in this code, but we could be using DEBUG flags here to allow/disallow hooking) + 1.2 Install the hook by overwriting the vector table exception handler with the hooked function + 2. Upon system crash (for example, by a dereference of a NULL pointer or anything else) + 2.1 The CPU triggers its exception and jump into the vector table for the exception type + 2.2 Instead of finding the default handler, it finds the updated pointer to our hook + 2.3 The CPU jumps into our hook function (likely a naked function to keep all information about crash point intact) + 2.4 The hook (naked) function saves the important registers (stack pointer, program counter, current mode) and jumps to a common exception handler (in C) + 2.5 The common exception handler dumps the registers on the serial link and perform a backtrace around the crashing point + 2.6 Once the backtrace is performed the last resort function is called (platform specific). + On some platform with a LCD screen, this might display the crash information as a QR code or as text for the + user to capture by taking a picture + 2.7 The CPU is reset and/or halted by triggering a debug breakpoint if a debugger is attached */ + +// Hook into CPU exception interrupt table to call the backtracing code upon an exception +// Most platform will simply do nothing here, but those who can will install/overwrite the default exception handler +// with a more performant exception handler +void hook_cpu_exceptions(); + +// Some platform might deal without a hard fault handler, in that case, return 0 in your platform here or skip implementing it +void * __attribute__((weak)) hook_get_hardfault_vector_address(unsigned base_address); +// Some platform might deal without a memory management fault handler, in that case, return 0 in your platform here or skip implementing it +void * __attribute__((weak)) hook_get_memfault_vector_address(unsigned base_address); +// Some platform might deal without a bus fault handler, in that case, return 0 in your platform here or skip implementing it +void * __attribute__((weak)) hook_get_busfault_vector_address(unsigned base_address); +// Some platform might deal without a usage fault handler, in that case, return 0 in your platform here or skip implementing it +void * __attribute__((weak)) hook_get_usagefault_vector_address(unsigned base_address); + +// Last resort function that can be called after the exception handler was called. +void __attribute__((weak)) hook_last_resort_func(); diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index b085e6145a..8aa6cdd6c8 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -36,6 +36,7 @@ #include "HAL/shared/Delay.h" #include "HAL/shared/esp_wifi.h" +#include "HAL/shared/cpu_exception/exception_hook.h" #ifdef ARDUINO #include @@ -935,6 +936,8 @@ void setup() { while (/*!WIFISERIAL && */PENDING(millis(), serial_connect_timeout)) { /*nada*/ } #endif + TERN_(DYNAMIC_VECTORTABLE, hook_cpu_exceptions()); // If supported, install Marlin exception handlers at runtime + SETUP_RUN(HAL_init()); // Init and disable SPI thermocouples; this is still needed diff --git a/Marlin/src/gcode/gcode_d.cpp b/Marlin/src/gcode/gcode_d.cpp index 653ae6a553..805dcd52ce 100644 --- a/Marlin/src/gcode/gcode_d.cpp +++ b/Marlin/src/gcode/gcode_d.cpp @@ -152,8 +152,7 @@ NOMORE(len, FLASH_SIZE - addr); if (parser.seenval('X')) { // TODO: Write the hex bytes after the X - //while (len--) { - //} + //while (len--) {} } else { // while (len--) { @@ -180,7 +179,25 @@ for (int i = 10000; i--;) DELAY_US(1000UL); ENABLE_ISRS(); SERIAL_ECHOLNPGM("FAILURE: Watchdog did not trigger board reset."); + } break; + + #if ENABLED(POSTMORTEM_DEBUGGING) + case 451: { // Trigger all kind of faults to test exception catcher + SERIAL_ECHOLNPGM("Disabling heaters"); + thermalManager.disable_all_heaters(); + delay(1000); // Allow time to print + volatile uint8_t type[5] = { parser.byteval('T', 1) }; + + // The code below is obviously wrong and it's full of quirks to fool the compiler from optimizing away the code + switch (type[0]) { + case 1: default: *(int*)0 = 451; break; // Write at bad address + case 2: { volatile int a = 0; volatile int b = 452 / a; *(int*)&a = b; } break; // Divide by zero (some CPUs accept this, like ARM) + case 3: { *(uint32_t*)&type[1] = 453; volatile int a = *(int*)&type[1]; type[0] = a / 255; } break; // Unaligned access (some CPUs accept this) + case 4: { volatile void (*func)() = (volatile void (*)()) 0xE0000000; func(); } break; // Invalid instruction + } + break; } + #endif } } diff --git a/buildroot/share/PlatformIO/scripts/exc.S b/buildroot/share/PlatformIO/scripts/exc.S new file mode 100644 index 0000000000..1db462bb23 --- /dev/null +++ b/buildroot/share/PlatformIO/scripts/exc.S @@ -0,0 +1,104 @@ +/* ***************************************************************************** + * The MIT License + * + * Copyright (c) 2010 Perry Hung. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * ****************************************************************************/ + +# On an exception, push a fake stack thread mode stack frame and redirect +# thread execution to a thread mode error handler + +# From RM008: +# The SP is decremented by eight words by the completion of the stack push. +# Figure 5-1 shows the contents of the stack after an exception pre-empts the +# current program flow. +# +# Old SP--> +# xPSR +# PC +# LR +# r12 +# r3 +# r2 +# r1 +# SP--> r0 + +.text +.globl __exc_nmi +.weak __exc_nmi +.globl __exc_hardfault +.weak __exc_hardfault +.globl __exc_memmanage +.weak __exc_memmanage +.globl __exc_busfault +.weak __exc_busfault +.globl __exc_usagefault +.weak __exc_usagefault + +.code 16 +.thumb_func +__exc_nmi: + mov r0, #1 + b __default_exc + +.thumb_func +__exc_hardfault: + mov r0, #2 + b __default_exc + +.thumb_func +__exc_memmanage: + mov r0, #3 + b __default_exc + +.thumb_func +__exc_busfault: + mov r0, #4 + b __default_exc + +.thumb_func +__exc_usagefault: + mov r0, #5 + b __default_exc + +.thumb_func +__default_exc: + ldr r2, NVIC_CCR @ Enable returning to thread mode even if there are + mov r1 ,#1 @ pending exceptions. See flag NONEBASETHRDENA. + str r1, [r2] + cpsid i @ Disable global interrupts + ldr r2, SYSTICK_CSR @ Disable systick handler + mov r1, #0 + str r1, [r2] + ldr r1, CPSR_MASK @ Set default CPSR + push {r1} + ldr r1, TARGET_PC @ Set target pc + push {r1} + sub sp, sp, #24 @ Don't care + ldr r1, EXC_RETURN @ Return to thread mode + mov lr, r1 + bx lr @ Exception exit + +.align 4 +CPSR_MASK: .word 0x61000000 +EXC_RETURN: .word 0xFFFFFFF9 +TARGET_PC: .word __error +NVIC_CCR: .word 0xE000ED14 @ NVIC configuration control register +SYSTICK_CSR: .word 0xE000E010 @ Systick control register diff --git a/buildroot/share/PlatformIO/scripts/fix_framework_weakness.py b/buildroot/share/PlatformIO/scripts/fix_framework_weakness.py new file mode 100644 index 0000000000..94076cfbab --- /dev/null +++ b/buildroot/share/PlatformIO/scripts/fix_framework_weakness.py @@ -0,0 +1,29 @@ +from os.path import join, isfile +import shutil +from pprint import pprint + +Import("env") + +if env.MarlinFeatureIsEnabled("POSTMORTEM_DEBUGGING"): + FRAMEWORK_DIR = env.PioPlatform().get_package_dir("framework-arduinoststm32-maple") + patchflag_path = join(FRAMEWORK_DIR, ".exc-patching-done") + + # patch file only if we didn't do it before + if not isfile(patchflag_path): + print("Patching libmaple exception handlers") + original_file = join(FRAMEWORK_DIR, "STM32F1", "cores", "maple", "libmaple", "exc.S") + backup_file = join(FRAMEWORK_DIR, "STM32F1", "cores", "maple", "libmaple", "exc.S.bak") + src_file = join("buildroot", "share", "PlatformIO", "scripts", "exc.S") + + assert isfile(original_file) and isfile(src_file) + shutil.copyfile(original_file, backup_file) + shutil.copyfile(src_file, original_file); + + def _touch(path): + with open(path, "w") as fp: + fp.write("") + + env.Execute(lambda *args, **kwargs: _touch(patchflag_path)) + print("Done patching exception handler") + + print("Libmaple modified and ready for post mortem debugging") diff --git a/platformio.ini b/platformio.ini index 15fbf220d4..dd8a396849 100644 --- a/platformio.ini +++ b/platformio.ini @@ -64,6 +64,7 @@ default_src_filter = + - - + - - - - - - - - - + - - - - @@ -223,6 +224,8 @@ YHCB2004 = red-scorp/LiquidCrystal_AIP31068@^1.0.4, red-scorp/Sof HAS_TFT_LVGL_UI = lvgl=https://github.com/makerbase-mks/LVGL-6.1.1-MKS/archive/master.zip src_filter=+ extra_scripts=download_mks_assets.py +POSTMORTEM_DEBUGGING = src_filter=+ + + build_flags=-funwind-tables MKS_WIFI_MODULE = QRCode=https://github.com/makerbase-mks/QRCode/archive/master.zip HAS_TRINAMIC_CONFIG = TMCStepper@~0.7.1 src_filter=+ + + + + @@ -637,14 +640,6 @@ platform = atmelsam extends = env:DUE board = dueUSB -[env:DUE_debug] -# Used when WATCHDOG_RESET_MANUAL is enabled -platform = atmelsam -extends = env:DUE -build_flags = ${common.build_flags} - -funwind-tables - -mpoke-function-name - # # Archim SAM # @@ -662,12 +657,6 @@ extra_scripts = ${common.extra_scripts} platform = ${common_DUE_archim.platform} extends = common_DUE_archim -# Used when WATCHDOG_RESET_MANUAL is enabled -[env:DUE_archim_debug] -platform = ${common_DUE_archim.platform} -extends = common_DUE_archim -build_flags = ${common_DUE_archim.build_flags} -funwind-tables -mpoke-function-name - ################################# # # # SAMD51 Architecture # @@ -763,6 +752,8 @@ lib_ignore = SPI, FreeRTOS701, FreeRTOS821 lib_deps = ${common.lib_deps} SoftwareSerialM platform_packages = tool-stm32duino +extra_scripts = ${common.extra_scripts} + buildroot/share/PlatformIO/scripts/fix_framework_weakness.py # # STM32F103RC @@ -788,7 +779,7 @@ build_flags = ${common_stm32f1.build_flags} -DUSE_USB_COMPOSITE -DVECT_TAB_OFFSET=0x2000 -DGENERIC_BOOTLOADER -extra_scripts = ${common.extra_scripts} +extra_scripts = ${common_stm32f1.extra_scripts} pre:buildroot/share/PlatformIO/scripts/STM32F1_create_variant.py buildroot/share/PlatformIO/scripts/STM32F103RC_MEEB_3DP.py lib_deps = ${common.lib_deps} @@ -934,7 +925,7 @@ upload_protocol = serial platform = ${common_stm32f1.platform} extends = common_stm32f1 board = genericSTM32F103VE -extra_scripts = ${common.extra_scripts} +extra_scripts = ${common_stm32f1.extra_scripts} buildroot/share/PlatformIO/scripts/STM32F103VE_longer.py build_flags = ${common_stm32f1.build_flags} -DMCU_STM32F103VE -DSTM32F1xx -USERIAL_USB -DU20 -DTS_V12 @@ -948,7 +939,7 @@ build_unflags = ${common_stm32f1.build_unflags} platform = ${common_stm32f1.platform} extends = common_stm32f1 board = genericSTM32F103VE -extra_scripts = ${common.extra_scripts} +extra_scripts = ${common_stm32f1.extra_scripts} buildroot/share/PlatformIO/scripts/mks_robin_mini.py build_flags = ${common_stm32f1.build_flags} -DMCU_STM32F103VE @@ -974,7 +965,7 @@ upload_protocol = jlink platform = ${common_stm32f1.platform} extends = common_stm32f1 board = genericSTM32F103ZE -extra_scripts = ${common.extra_scripts} +extra_scripts = ${common_stm32f1.extra_scripts} buildroot/share/PlatformIO/scripts/mks_robin.py build_flags = ${common_stm32f1.build_flags} -DSS_TIMER=4 -DSTM32_XL_DENSITY @@ -1008,7 +999,7 @@ lib_deps = [env:mks_robin_pro] platform = ${common_stm32f1.platform} extends = env:mks_robin -extra_scripts = ${common.extra_scripts} +extra_scripts = ${common_stm32f1.extra_scripts} buildroot/share/PlatformIO/scripts/mks_robin_pro.py # @@ -1017,7 +1008,7 @@ extra_scripts = ${common.extra_scripts} [env:trigorilla_pro] platform = ${common_stm32f1.platform} extends = env:mks_robin -extra_scripts = ${common.extra_scripts} +extra_scripts = ${common_stm32f1.extra_scripts} # # MKS Robin E3D (STM32F103RCT6) and @@ -1041,7 +1032,7 @@ build_flags = ${common_stm32f1.build_flags} platform = ${common_stm32f1.platform} extends = common_stm32f1 board = genericSTM32F103VE -extra_scripts = ${common.extra_scripts} +extra_scripts = ${common_stm32f1.extra_scripts} buildroot/share/PlatformIO/scripts/mks_robin_e3p.py build_flags = ${common_stm32f1.build_flags} -DMCU_STM32F103VE -DSS_TIMER=4 @@ -1055,7 +1046,7 @@ upload_protocol = jlink platform = ${common_stm32f1.platform} extends = common_stm32f1 board = genericSTM32F103RC -extra_scripts = ${common.extra_scripts} +extra_scripts = ${common_stm32f1.extra_scripts} buildroot/share/PlatformIO/scripts/mks_robin_lite.py # @@ -1065,7 +1056,7 @@ extra_scripts = ${common.extra_scripts} platform = ${common_stm32f1.platform} extends = common_stm32f1 board = genericSTM32F103RC -extra_scripts = ${common.extra_scripts} +extra_scripts = ${common_stm32f1.extra_scripts} buildroot/share/PlatformIO/scripts/mks_robin_lite3.py # @@ -1075,7 +1066,7 @@ extra_scripts = ${common.extra_scripts} platform = ${common_stm32f1.platform} extends = common_stm32f1 board = genericSTM32F103ZE -extra_scripts = ${common.extra_scripts} +extra_scripts = ${common_stm32f1.extra_scripts} buildroot/share/PlatformIO/scripts/jgaurora_a5s_a1_with_bootloader.py build_flags = ${common_stm32f1.build_flags} -DSTM32F1xx -DSTM32_XL_DENSITY @@ -1230,7 +1221,7 @@ extra_scripts = ${common.extra_scripts} platform = ${common_stm32f1.platform} extends = common_stm32f1 board = genericSTM32F103RC -extra_scripts = ${common.extra_scripts} +extra_scripts = ${common_stm32f1.extra_scripts} buildroot/share/PlatformIO/scripts/fly_mini.py build_flags = ${common_stm32f1.build_flags} -DDEBUG_LEVEL=0 -DSS_TIMER=4 @@ -1557,7 +1548,6 @@ build_flags = ${common_stm32.build_flags} -DENABLE_HWSERIAL3 -DTIMER_SE build_unflags = ${common_stm32.build_unflags} -DUSBCON -DUSBD_USE_CDC extra_scripts = ${common.extra_scripts} pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py buildroot/share/PlatformIO/scripts/stm32_bootloader.py - ################################# # # # Other Architectures # From ece06c26a92cd545a3cc1b15aea7b5a222f7faf9 Mon Sep 17 00:00:00 2001 From: Marcio T Date: Sun, 21 Feb 2021 03:05:59 -0700 Subject: [PATCH 006/253] Enhance and fix FTDI Touch UI (#21148) --- .../ftdi_eve_touch_ui/language/language_en.h | 8 +- .../screens/bed_mesh_screen.cpp | 4 +- .../screens/cocoa_press_load_chocolate.cpp | 190 ++++++++++++++---- .../screens/cocoa_press_load_chocolate.h | 13 ++ .../screens/cocoa_press_main_menu.cpp | 51 +++-- .../screens/cocoa_press_move_e_screen.cpp | 12 +- .../screens/cocoa_press_preheat_menu.cpp | 16 +- .../screens/cocoa_press_preheat_screen.cpp | 24 +-- .../screens/cocoa_press_status_screen.cpp | 24 +-- .../screens/cocoa_press_ui.h | 13 +- .../confirm_user_request_alert_box.cpp | 6 + .../screens/move_axis_screen.cpp | 4 +- .../ftdi_eve_touch_ui/screens/screen_data.h | 1 + .../lib/ftdi_eve_touch_ui/screens/screens.cpp | 2 + .../lib/ftdi_eve_touch_ui/screens/screens.h | 5 +- .../lib/ftdi_eve_touch_ui/theme/colors.h | 6 + 16 files changed, 272 insertions(+), 107 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h index c898e7b737..e57858aa3f 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h @@ -157,13 +157,13 @@ namespace Language_en { #ifdef TOUCH_UI_COCOA_PRESS PROGMEM Language_Str MSG_BODY = u8"Body"; - PROGMEM Language_Str MSG_INTERNAL = u8"Internal"; + PROGMEM Language_Str MSG_SELECT_CHOCOLATE_TYPE = u8"Select Chocolate Type"; PROGMEM Language_Str MSG_EXTERNAL = u8"External"; PROGMEM Language_Str MSG_CHOCOLATE = u8"Chocolate"; PROGMEM Language_Str MSG_UNLOAD_CARTRIDGE = u8"Unload Cartridge"; - PROGMEM Language_Str MSG_LOAD_CHOCOLATE = u8"Load Chocolate"; - PROGMEM Language_Str MSG_CARTRIDGE_IN = u8"Cartridge In"; - PROGMEM Language_Str MSG_CARTRIDGE_OUT = u8"Cartridge Out"; + PROGMEM Language_Str MSG_LOAD_UNLOAD = u8"Load/Unload"; + PROGMEM Language_Str MSG_FULL_LOAD = u8"Full Load"; + PROGMEM Language_Str MSG_FULL_UNLOAD = u8"Full Unload"; PROGMEM Language_Str MSG_PREHEAT_CHOCOLATE = u8"Preheat Chocolate"; PROGMEM Language_Str MSG_PREHEAT_FINISHED = u8"Preheat finished"; PROGMEM Language_Str MSG_PREHEAT = u8"Preheat"; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp index b62a9bf01b..6de573da8c 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp @@ -271,7 +271,7 @@ void BedMeshScreen::onRedraw(draw_mode_t what) { .cmd(CLEAR(true,true,true)); // Draw the shadow and tags - cmd.cmd(COLOR_RGB(0x444444)); + cmd.cmd(COLOR_RGB(Theme::bed_mesh_shadow_rgb)); BedMeshScreen::drawMesh(INSET_POS(MESH_POS), nullptr, USE_POINTS | USE_TAGS); cmd.cmd(COLOR_RGB(bg_text_enabled)); } @@ -282,6 +282,8 @@ void BedMeshScreen::onRedraw(draw_mode_t what) { if (gotAllPoints) { drawHighlightedPointValue(); } + CommandProcessor cmd; + cmd.cmd(COLOR_RGB(Theme::bed_mesh_lines_rgb)); const float levelingProgress = sq(float(mydata.count) / GRID_MAX_POINTS); BedMeshScreen::drawMesh(INSET_POS(MESH_POS), ExtUI::getMeshArray(), USE_POINTS | USE_HIGHLIGHT | USE_AUTOSCALE | (gotAllPoints ? USE_COLORS : 0), diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_load_chocolate.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_load_chocolate.cpp index 23ad1b5da6..8b87c4ae41 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_load_chocolate.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_load_chocolate.cpp @@ -27,69 +27,179 @@ #ifdef FTDI_COCOA_LOAD_CHOCOLATE_SCREEN +#include "../ftdi_eve_lib/extras/poly_ui.h" + +#include "cocoa_press_ui.h" + +#define POLY(A) PolyUI::poly_reader_t(A, sizeof(A)/sizeof(A[0])) + +const uint8_t shadow_depth = 5; + using namespace ExtUI; using namespace FTDI; using namespace Theme; -#define GRID_COLS 2 -#define GRID_ROWS 6 +constexpr static LoadChocolateScreenData &mydata = screen_data.LoadChocolateScreen; -#define TITLE_POS BTN_POS(1,1), BTN_SIZE(2,1) -#define DESCRIPTION_POS BTN_POS(1,2), BTN_SIZE(2,3) -#define CARTRIDGE_OUT_BTN_POS BTN_POS(1,5), BTN_SIZE(1,1) -#define CARTRIDGE_IN_BTN_POS BTN_POS(2,5), BTN_SIZE(1,1) -#define BACK_BTN_POS BTN_POS(1,6), BTN_SIZE(2,1) +void LoadChocolateScreen::draw_syringe(draw_mode_t what) { + #if ENABLED(COCOA_PRESS_CHOCOLATE_LEVEL_SENSOR) + const float fill_level = get_chocolate_fill_level(); + #else + constexpr float fill_level = 1.0f; + #endif -void LoadChocolateScreen::onRedraw(draw_mode_t what) { CommandProcessor cmd; + PolyUI ui(cmd, what); if (what & BACKGROUND) { - cmd.cmd(CLEAR_COLOR_RGB(bg_color)) - .cmd(CLEAR(true,true,true)) - .cmd(COLOR_RGB(bg_text_enabled)) - .tag(0) - .font(font_large) - .text(TITLE_POS, GET_TEXT_F(MSG_LOAD_CHOCOLATE)); - draw_text_box(cmd, DESCRIPTION_POS, F( - "Drop your chocolate refill into the cartridge. " - "Press and hold the Cartridge Out button until " - "the plunger adapter is visible at the bottom of " - "the extruder. Securely attach a red plunger to " - "the plunger adapter and load the cartridge onto " - "the plunger. Press and hold Cartridge In button " - "until cartridge is fully loaded into the extruder, " - "and use the buttons to help follow the locking path " - "to lock"), - OPT_CENTERY, font_medium); + // Paint the shadow for the syringe + ui.color(shadow_rgb); + ui.shadow(POLY(syringe_outline), shadow_depth); } if (what & FOREGROUND) { - cmd.font(font_medium) - .colors(normal_btn) - .tag(2).button(CARTRIDGE_OUT_BTN_POS, GET_TEXT_F(MSG_CARTRIDGE_OUT)) - .tag(3).button(CARTRIDGE_IN_BTN_POS, GET_TEXT_F(MSG_CARTRIDGE_IN)) - .colors(action_btn) - .tag(1).button(BACK_BTN_POS, GET_TEXT_F(MSG_BACK)); + int16_t x, y, h, v; + + // Paint the syringe icon + ui.color(syringe_rgb); + ui.fill(POLY(syringe_outline)); + + ui.color(fluid_rgb); + ui.bounds(POLY(syringe_fluid), x, y, h, v); + cmd.cmd(SAVE_CONTEXT()); + cmd.cmd(SCISSOR_XY(x,y + v * (1.0 - fill_level))); + cmd.cmd(SCISSOR_SIZE(h, v * fill_level)); + ui.fill(POLY(syringe_fluid), false); + cmd.cmd(RESTORE_CONTEXT()); + + ui.color(stroke_rgb); + ui.fill(POLY(syringe)); } } +void LoadChocolateScreen::draw_buttons(draw_mode_t what) { + int16_t x, y, h, v; + + CommandProcessor cmd; + PolyUI ui(cmd, what); + + cmd.font(font_medium).colors(normal_btn); + + ui.bounds(POLY(load_screen_unload_btn), x, y, h, v); + cmd.tag(2).button(x, y, h, v, GET_TEXT_F(MSG_FULL_UNLOAD)); + + ui.bounds(POLY(load_screen_load_btn), x, y, h, v); + cmd.tag(3).button(x, y, h, v, GET_TEXT_F(MSG_FULL_LOAD)); + + ui.bounds(POLY(load_screen_back_btn), x, y, h, v); + cmd.tag(1).colors(action_btn).button(x, y, h, v, GET_TEXT_F(MSG_BACK)); +} + +void LoadChocolateScreen::draw_text(draw_mode_t what) { + if (what & BACKGROUND) { + int16_t x, y, h, v; + + CommandProcessor cmd; + PolyUI ui(cmd, what); + + cmd.font(font_medium).cmd(COLOR_RGB(bg_text_enabled)); + + ui.bounds(POLY(load_sreen_title), x, y, h, v); + cmd.tag(2).text(x, y, h, v, GET_TEXT_F(MSG_LOAD_UNLOAD)); + + ui.bounds(POLY(load_screen_increment), x, y, h, v); + cmd.tag(3).text(x, y, h, v, GET_TEXT_F(MSG_INCREMENT)); + } +} + +void LoadChocolateScreen::draw_arrows(draw_mode_t what) { + CommandProcessor cmd; + PolyUI ui(cmd, what); + + ui.button_fill (fill_rgb); + ui.button_stroke(stroke_rgb, 28); + ui.button_shadow(shadow_rgb, shadow_depth); + + constexpr uint8_t style = PolyUI::REGULAR; + + ui.button(4, POLY(load_screen_extrude), style); + ui.button(5, POLY(load_screen_retract), style); +} + +void LoadChocolateScreen::onEntry() { + mydata.repeat_tag = 0; +} + +void LoadChocolateScreen::onRedraw(draw_mode_t what) { + if (what & BACKGROUND) { + CommandProcessor cmd; + cmd.cmd(CLEAR_COLOR_RGB(bg_color)) + .cmd(CLEAR(true,true,true)) + .tag(0); + } + + draw_syringe(what); + draw_arrows(what); + draw_buttons(what); + draw_text(what); +} + +bool LoadChocolateScreen::onTouchStart(uint8_t) { + mydata.repeat_tag = 0; + return true; +} + bool LoadChocolateScreen::onTouchEnd(uint8_t tag) { using namespace ExtUI; switch (tag) { + case 2: + mydata.repeat_tag = (mydata.repeat_tag == 2) ? 0 : 2; + break; + case 3: + mydata.repeat_tag = (mydata.repeat_tag == 3) ? 0 : 3; + break; case 1: GOTO_PREVIOUS(); break; } return true; } +void LoadChocolateScreen::setManualFeedrateAndIncrement(float feedrate_mm_s, float &increment_mm) { + // Compute increment so feedrate so that the tool lags the adjuster when it is + // being held down, this allows enough margin for the planner to + // connect segments and even out the motion. + ExtUI::setFeedrate_mm_s(feedrate_mm_s); + increment_mm = feedrate_mm_s / ((TOUCH_REPEATS_PER_SECOND) * 0.80f); +} + bool LoadChocolateScreen::onTouchHeld(uint8_t tag) { if (ExtUI::isMoving()) return false; // Don't allow moves to accumulate - constexpr float increment = 0.25; - MoveAxisScreen::setManualFeedrate(E0, increment); + float increment; + setManualFeedrateAndIncrement(20, increment); #define UI_INCREMENT_AXIS(axis) UI_INCREMENT(AxisPosition_mm, axis); #define UI_DECREMENT_AXIS(axis) UI_DECREMENT(AxisPosition_mm, axis); switch (tag) { - case 2: UI_DECREMENT_AXIS(E0); break; - case 3: UI_INCREMENT_AXIS(E0); break; + case 2: { + if (get_chocolate_fill_level() < 0.1) { + mydata.repeat_tag = 0; + return false; + } + UI_INCREMENT_AXIS(E0); + break; + } + case 3: { + if (get_chocolate_fill_level() > 0.9) { + mydata.repeat_tag = 0; + return false; + } + UI_DECREMENT_AXIS(E0); + break; + } + case 4: + UI_INCREMENT_AXIS(E0); + break; + case 5: + UI_DECREMENT_AXIS(E0); + break; default: return false; } #undef UI_DECREMENT_AXIS @@ -97,4 +207,14 @@ bool LoadChocolateScreen::onTouchHeld(uint8_t tag) { return false; } +void LoadChocolateScreen::onIdle() { + reset_menu_timeout(); + if (mydata.repeat_tag) onTouchHeld(mydata.repeat_tag); + if (refresh_timer.elapsed(STATUS_UPDATE_INTERVAL)) { + if (!EventLoop::is_touch_held()) + onRefresh(); + refresh_timer.start(); + } + BaseScreen::onIdle(); +} #endif // FTDI_COCOA_LOAD_CHOCOLATE_SCREEN diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_load_chocolate.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_load_chocolate.h index 262a6c9802..582a62fe05 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_load_chocolate.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_load_chocolate.h @@ -26,9 +26,22 @@ #define FTDI_COCOA_LOAD_CHOCOLATE_SCREEN #define FTDI_COCOA_LOAD_CHOCOLATE_SCREEN_CLASS LoadChocolateScreen +struct LoadChocolateScreenData { + uint8_t repeat_tag; +}; + class LoadChocolateScreen : public BaseScreen, public CachedScreen { + private: + static void setManualFeedrateAndIncrement(float feedrate_mm_s, float &increment); + static void draw_syringe(draw_mode_t what); + static void draw_arrows(draw_mode_t what); + static void draw_buttons(draw_mode_t what); + static void draw_text(draw_mode_t what); public: + static void onEntry(); + static void onIdle(); static void onRedraw(draw_mode_t); + static bool onTouchStart(uint8_t tag); static bool onTouchEnd(uint8_t tag); static bool onTouchHeld(uint8_t tag); }; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_main_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_main_menu.cpp index 56981e3084..f35b3296d8 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_main_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_main_menu.cpp @@ -29,17 +29,19 @@ using namespace FTDI; using namespace Theme; -#define GRID_ROWS 4 +#define GRID_ROWS 5 #define GRID_COLS 2 -#define MOVE_XYZ_POS BTN_POS(1,1), BTN_SIZE(1,1) +#define ZPROBE_ZOFFSET_POS BTN_POS(1,1), BTN_SIZE(1,1) +#define MOVE_XYZ_POS BTN_POS(1,2), BTN_SIZE(1,1) #define TEMPERATURE_POS BTN_POS(2,1), BTN_SIZE(1,1) -#define ZPROBE_ZOFFSET_POS BTN_POS(1,2), BTN_SIZE(1,1) #define MOVE_E_POS BTN_POS(2,2), BTN_SIZE(1,1) #define SPEED_POS BTN_POS(1,3), BTN_SIZE(1,1) #define ADVANCED_SETTINGS_POS BTN_POS(2,3), BTN_SIZE(1,1) -#define ABOUT_PRINTER_POS BTN_POS(1,4), BTN_SIZE(1,1) -#define BACK_POS BTN_POS(2,4), BTN_SIZE(1,1) +#define DISABLE_STEPPERS_POS BTN_POS(1,4), BTN_SIZE(1,1) +#define LEVELING_POS BTN_POS(2,4), BTN_SIZE(1,1) +#define ABOUT_PRINTER_POS BTN_POS(1,5), BTN_SIZE(1,1) +#define BACK_POS BTN_POS(2,5), BTN_SIZE(1,1) void MainMenu::onRedraw(draw_mode_t what) { if (what & BACKGROUND) { @@ -52,16 +54,19 @@ void MainMenu::onRedraw(draw_mode_t what) { CommandProcessor cmd; cmd.colors(normal_btn) .font(Theme::font_medium) - .tag(2).button(MOVE_XYZ_POS, GET_TEXT_F(MSG_XYZ_MOVE)) - .tag(3).button(TEMPERATURE_POS, GET_TEXT_F(MSG_TEMPERATURE)) + .tag( 2).button(MOVE_XYZ_POS, GET_TEXT_F(MSG_XYZ_MOVE)) + .tag( 3).button(TEMPERATURE_POS, GET_TEXT_F(MSG_TEMPERATURE)) .enabled(BOTH(HAS_LEVELING, HAS_BED_PROBE)) - .tag(4).button(ZPROBE_ZOFFSET_POS, GET_TEXT_F(MSG_ZPROBE_ZOFFSET)) - .tag(5).button(MOVE_E_POS, GET_TEXT_F(MSG_E_MOVE)) - .tag(6).button(SPEED_POS, GET_TEXT_F(MSG_PRINT_SPEED)) - .tag(7).button(ADVANCED_SETTINGS_POS, GET_TEXT_F(MSG_ADVANCED_SETTINGS)) - .tag(8).button(ABOUT_PRINTER_POS, GET_TEXT_F(MSG_INFO_MENU)) + .tag( 4).button(ZPROBE_ZOFFSET_POS, GET_TEXT_F(MSG_ZPROBE_ZOFFSET)) + .tag( 5).button(MOVE_E_POS, GET_TEXT_F(MSG_E_MOVE)) + .tag( 6).button(SPEED_POS, GET_TEXT_F(MSG_PRINT_SPEED)) + .tag( 7).button(ADVANCED_SETTINGS_POS, GET_TEXT_F(MSG_ADVANCED_SETTINGS)) + .tag( 8).button(DISABLE_STEPPERS_POS, GET_TEXT_F(MSG_DISABLE_STEPPERS)) + .enabled(HAS_LEVELING) + .tag( 9).button(LEVELING_POS, GET_TEXT_F(MSG_LEVELING)) + .tag(10).button(ABOUT_PRINTER_POS, GET_TEXT_F(MSG_INFO_MENU)) .colors(action_btn) - .tag(1).button(BACK_POS, GET_TEXT_F(MSG_BACK)); + .tag(1).button(BACK_POS, GET_TEXT_F(MSG_BACK)); } } @@ -69,16 +74,20 @@ bool MainMenu::onTouchEnd(uint8_t tag) { using namespace ExtUI; switch (tag) { - case 1: SaveSettingsDialogBox::promptToSaveSettings(); break; - case 2: GOTO_SCREEN(MoveXYZScreen); break; - case 3: GOTO_SCREEN(TemperatureScreen); break; + case 1: SaveSettingsDialogBox::promptToSaveSettings(); break; + case 2: GOTO_SCREEN(MoveXYZScreen); break; + case 3: GOTO_SCREEN(TemperatureScreen); break; #if BOTH(HAS_LEVELING, HAS_BED_PROBE) - case 4: GOTO_SCREEN(ZOffsetScreen); break; + case 4: GOTO_SCREEN(ZOffsetScreen); break; #endif - case 5: GOTO_SCREEN(MoveEScreen); break; - case 6: GOTO_SCREEN(FeedratePercentScreen); break; - case 7: GOTO_SCREEN(AdvancedSettingsMenu); break; - case 8: GOTO_SCREEN(AboutScreen); break; + case 5: GOTO_SCREEN(MoveEScreen); break; + case 6: GOTO_SCREEN(FeedratePercentScreen); break; + case 7: GOTO_SCREEN(AdvancedSettingsMenu); break; + case 8: injectCommands_P(PSTR("M84")); break; + #if HAS_LEVELING + case 9: GOTO_SCREEN(LevelingMenu); break; + #endif + case 10: GOTO_SCREEN(AboutScreen); break; default: return false; } diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_move_e_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_move_e_screen.cpp index 10660736fa..d199b492e4 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_move_e_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_move_e_screen.cpp @@ -30,6 +30,8 @@ using namespace FTDI; using namespace ExtUI; +constexpr static MoveAxisScreenData &mydata = screen_data.MoveAxisScreen; + void MoveEScreen::onRedraw(draw_mode_t what) { widgets_t w(what); w.precision(1); @@ -37,15 +39,15 @@ void MoveEScreen::onRedraw(draw_mode_t what) { w.heading( GET_TEXT_F(MSG_E_MOVE)); w.color(Theme::e_axis); #if EXTRUDERS == 1 - w.adjuster( 8, GET_TEXT_F(MSG_AXIS_E), screen_data.MoveAxis.e_rel[0], canMove(E0)); + w.adjuster( 8, GET_TEXT_F(MSG_AXIS_E), mydata.e_rel[0], canMove(E0)); #elif HAS_MULTI_EXTRUDER - w.adjuster( 8, GET_TEXT_F(MSG_AXIS_E1), screen_data.MoveAxis.e_rel[0], canMove(E0)); - w.adjuster( 10, GET_TEXT_F(MSG_AXIS_E2), screen_data.MoveAxis.e_rel[1], canMove(E1)); + w.adjuster( 8, GET_TEXT_F(MSG_AXIS_E1), mydata.e_rel[0], canMove(E0)); + w.adjuster( 10, GET_TEXT_F(MSG_AXIS_E2), mydata.e_rel[1], canMove(E1)); #if EXTRUDERS > 2 - w.adjuster( 12, GET_TEXT_F(MSG_AXIS_E3), screen_data.MoveAxis.e_rel[2], canMove(E2)); + w.adjuster( 12, GET_TEXT_F(MSG_AXIS_E3), mydata.e_rel[2], canMove(E2)); #endif #if EXTRUDERS > 3 - w.adjuster( 14, GET_TEXT_F(MSG_AXIS_E4), screen_data.MoveAxis.e_rel[3], canMove(E3)); + w.adjuster( 14, GET_TEXT_F(MSG_AXIS_E4), mydata.e_rel[3], canMove(E3)); #endif #endif w.increments(); diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_preheat_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_preheat_menu.cpp index d515b2a27b..92d1522360 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_preheat_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_preheat_menu.cpp @@ -32,7 +32,7 @@ using namespace Theme; #define GRID_COLS 2 void PreheatMenu::onRedraw(draw_mode_t what) { - const int16_t w = has_extra_heater() ? BTN_W(1) : BTN_W(2); + const int16_t w = TERN0(COCOA_PRESS_EXTRA_HEATER, has_extra_heater() ? BTN_W(1) : BTN_W(2)); const int16_t h = BTN_H(1); if (what & BACKGROUND) { @@ -42,10 +42,12 @@ void PreheatMenu::onRedraw(draw_mode_t what) { .tag(0) .cmd(COLOR_RGB(bg_text_enabled)) .font(Theme::font_medium) - .text ( BTN_POS(1,1), w, h, GET_TEXT_F(MSG_INTERNAL)); - if (has_extra_heater()) { + .text( BTN_POS(1,1), w, h, GET_TEXT_F(MSG_SELECT_CHOCOLATE_TYPE)); + #if ENABLED(COCOA_PRESS_EXTRA_HEATER) + if (has_extra_heater()) { cmd.text( BTN_POS(2,1), w, h, GET_TEXT_F(MSG_EXTERNAL)); - } + } + #endif } if (what & FOREGROUND) { @@ -55,11 +57,13 @@ void PreheatMenu::onRedraw(draw_mode_t what) { .tag(2).button(BTN_POS(1,2), w, h, F("Dark Chocolate")) .tag(3).button(BTN_POS(1,3), w, h, F("Milk Chocolate")) .tag(4).button(BTN_POS(1,4), w, h, F("White Chocolate")); - if (has_extra_heater()) { + #if ENABLED(COCOA_PRESS_EXTRA_HEATER) + if (has_extra_heater()) { cmd.tag(5).button(BTN_POS(2,2), w, h, F("Dark Chocolate")) .tag(6).button(BTN_POS(2,3), w, h, F("Milk Chocolate")) .tag(7).button(BTN_POS(2,4), w, h, F("White Chocolate")); - } + } + #endif cmd.colors(action_btn) .tag(1) .button(BTN_POS(1,5), BTN_SIZE(2,1), GET_TEXT_F(MSG_BACK)); } diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_preheat_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_preheat_screen.cpp index abea9dcdfe..66256ab46f 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_preheat_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_preheat_screen.cpp @@ -101,7 +101,7 @@ void PreheatTimerScreen::draw_adjuster(draw_mode_t what, uint8_t tag, progmem_st cmd.tag(0) .font(font_small); if (what & BACKGROUND) { - cmd.text( SUB_POS(1,1), SUB_SIZE(9,1), label) + cmd.text( SUB_POS(1,1), SUB_SIZE(9,1), label) .button(SUB_POS(1,2), SUB_SIZE(5,1), F(""), OPT_FLAT); } @@ -126,20 +126,20 @@ void PreheatTimerScreen::onRedraw(draw_mode_t what) { draw_message(what); draw_time_remaining(what); draw_interaction_buttons(what); - draw_adjuster(what, 1, GET_TEXT_F(MSG_NOZZLE), getTargetTemp_celsius(E0), NOZZLE_ADJ_POS); - draw_adjuster(what, 3, GET_TEXT_F(MSG_BODY), getTargetTemp_celsius(E1), BODY_ADJ_POS); - draw_adjuster(what, 5, GET_TEXT_F(MSG_CHAMBER), getTargetTemp_celsius(CHAMBER), CHAMBER_ADJ_POS); + draw_adjuster(what, 2, GET_TEXT_F(MSG_NOZZLE), getTargetTemp_celsius(E0), NOZZLE_ADJ_POS); + draw_adjuster(what, 4, GET_TEXT_F(MSG_BODY), getTargetTemp_celsius(E1), BODY_ADJ_POS); + draw_adjuster(what, 6, GET_TEXT_F(MSG_CHAMBER), getTargetTemp_celsius(CHAMBER), CHAMBER_ADJ_POS); } bool PreheatTimerScreen::onTouchHeld(uint8_t tag) { - const float increment = (tag == 5 || tag == 6) ? 1 : 0.1; + const float increment = (tag == 6 || tag == 7) ? 1 : 0.1; switch (tag) { - case 1: UI_DECREMENT(TargetTemp_celsius, E0); break; - case 2: UI_INCREMENT(TargetTemp_celsius, E0); break; - case 3: UI_DECREMENT(TargetTemp_celsius, E1); break; - case 4: UI_INCREMENT(TargetTemp_celsius, E1); break; - case 5: UI_DECREMENT(TargetTemp_celsius, CHAMBER); break; - case 6: UI_INCREMENT(TargetTemp_celsius, CHAMBER); break; + case 2: UI_DECREMENT(TargetTemp_celsius, E0); break; + case 3: UI_INCREMENT(TargetTemp_celsius, E0); break; + case 4: UI_DECREMENT(TargetTemp_celsius, E1); break; + case 5: UI_INCREMENT(TargetTemp_celsius, E1); break; + case 6: UI_DECREMENT(TargetTemp_celsius, CHAMBER); break; + case 7: UI_INCREMENT(TargetTemp_celsius, CHAMBER); break; default: return false; } @@ -149,7 +149,7 @@ bool PreheatTimerScreen::onTouchHeld(uint8_t tag) { bool PreheatTimerScreen::onTouchEnd(uint8_t tag) { switch (tag) { case 1: GOTO_PREVIOUS(); return true; - default: break; + default: return current_screen.onTouchHeld(tag); } return false; } diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_status_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_status_screen.cpp index f7d44e2936..7caa9c7944 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_status_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_status_screen.cpp @@ -86,10 +86,8 @@ void StatusScreen::draw_temperature(draw_mode_t what) { int16_t x, y, h, v; if (what & BACKGROUND) { - cmd.cmd(COLOR_RGB(bg_color)); - cmd.cmd(COLOR_RGB(fluid_rgb)); - cmd.font(font_medium); + cmd.font(font_medium).tag(10); ui.bounds(POLY(chocolate_label), x, y, h, v); cmd.text(x, y, h, v, GET_TEXT_F(MSG_CHOCOLATE)); @@ -119,7 +117,7 @@ void StatusScreen::draw_temperature(draw_mode_t what) { char str[15]; cmd.cmd(COLOR_RGB(fluid_rgb)); - cmd.font(font_large); + cmd.font(font_large).tag(10); format_temp(str, getActualTemp_celsius(E0)); ui.bounds(POLY(h0_temp), x, y, h, v); @@ -144,11 +142,8 @@ void StatusScreen::draw_temperature(draw_mode_t what) { } void StatusScreen::draw_syringe(draw_mode_t what) { - #if NUM_SERVOS < 2 - // Note, this requires a new pin 108 to be added to to access ADC9 - // "ArduinoAddons/arduino-1.8.5/packages/ultimachine/hardware/sam/1.6.9-b/variants/archim/variant.cpp" - const int val = analogRead(108); - const float fill_level = float(val) / 1024; + #if ENABLED(COCOA_PRESS_CHOCOLATE_LEVEL_SENSOR) + const float fill_level = get_chocolate_fill_level(); #else constexpr float fill_level = 1.0f; #endif @@ -192,15 +187,13 @@ void StatusScreen::draw_buttons(draw_mode_t what) { CommandProcessor cmd; PolyUI ui(cmd, what); - ui.bounds(POLY(unload_cartridge_btn), x, y, h, v); - cmd.font(font_medium).colors(normal_btn); - ui.bounds(POLY(unload_cartridge_btn), x, y, h, v); - cmd.tag(1).button(x, y, h, v, GET_TEXT_F(MSG_UNLOAD_CARTRIDGE)); + ui.bounds(POLY(park_btn), x, y, h, v); + cmd.tag(1).button(x, y, h, v, GET_TEXT_F(MSG_FILAMENT_PARK_ENABLED)); ui.bounds(POLY(load_chocolate_btn), x, y, h, v); - cmd.tag(2).button(x, y, h, v, GET_TEXT_F(MSG_LOAD_CHOCOLATE)); + cmd.tag(2).button(x, y, h, v, GET_TEXT_F(MSG_LOAD_UNLOAD)); ui.bounds(POLY(preheat_chocolate_btn), x, y, h, v); cmd.tag(3).button(x, y, h, v, GET_TEXT_F(MSG_PREHEAT_CHOCOLATE)); @@ -242,7 +235,7 @@ bool StatusScreen::onTouchStart(uint8_t) { bool StatusScreen::onTouchEnd(uint8_t tag) { switch (tag) { - case 1: GOTO_SCREEN(UnloadCartridgeScreen); break; + case 1: SpinnerDialogBox::enqueueAndWait_P(F("G0 X0 Y0")); break; case 2: GOTO_SCREEN(LoadChocolateScreen); break; case 3: GOTO_SCREEN(PreheatMenu); break; case 4: GOTO_SCREEN(MainMenu); break; @@ -270,6 +263,7 @@ bool StatusScreen::onTouchEnd(uint8_t tag) { PUSH_SCREEN(StatusScreen); break; case 9: GOTO_SCREEN(FilesScreen); break; + case 10: GOTO_SCREEN(TemperatureScreen); break; default: return false; } // If a passcode is enabled, the LockScreen will prevent the diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_ui.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_ui.h index 5cbaced7f6..f67961830f 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_ui.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_ui.h @@ -11,7 +11,7 @@ * GNU General Public License for more details. * * * * To view a copy of the GNU General Public License, go to the following * - * location: . * + * location: . * ****************************************************************************/ /** @@ -32,7 +32,7 @@ constexpr float y_max = 272.000000; const PROGMEM uint16_t syringe_outline[] = {0xED96, 0x14F0, 0xE65D, 0x10E9, 0xDED2, 0x0F9C, 0xD74B, 0x110E, 0xD01B, 0x1543, 0xCE80, 0x1836, 0xCE0A, 0x1C3A, 0xCE0F, 0x27AD, 0xCF0A, 0x2BD3, 0xD127, 0x2E5B, 0xD2A1, 0x2FF0, 0xD2A2, 0x9FC9, 0xD407, 0xA97A, 0xD7B9, 0xB10C, 0xD7BF, 0xBB58, 0xD978, 0xC2BE, 0xDD55, 0xC6EB, 0xDD58, 0xD159, 0xDE3B, 0xD3A8, 0xDFCF, 0xD3AF, 0xE0B8, 0xD04C, 0xE0B8, 0xC6EB, 0xE4A7, 0xC299, 0xE652, 0xBAF6, 0xE652, 0xB10C, 0xEA2E, 0xA8EA, 0xEB6C, 0x9E86, 0xEB6C, 0x2F58, 0xEF3C, 0x2B4E, 0xF003, 0x2583, 0xEFFD, 0x1AC2, 0xED96, 0x14F0, 0xED96, 0x14F0}; const PROGMEM uint16_t syringe_fluid[] = {0xDE73, 0x2512, 0xDA0C, 0x261D, 0xD5B8, 0x29A0, 0xD4AE, 0x2D87, 0xD4AE, 0x9F60, 0xD585, 0xA63B, 0xDE44, 0xA9DE, 0xE32A, 0xA942, 0xE7E3, 0xA6A5, 0xE930, 0xA342, 0xE95D, 0x9C1D, 0xE95B, 0x31B8, 0xE955, 0x2B63, 0xE867, 0x2A67, 0xE790, 0x28DE, 0xE342, 0x25CB, 0xDE73, 0x2512}; const PROGMEM uint16_t syringe[] = {0xED91, 0x1502, 0xE658, 0x10FB, 0xDECE, 0x0FAE, 0xD746, 0x1120, 0xD016, 0x1555, 0xCE7B, 0x1848, 0xCE05, 0x1C4D, 0xCE0A, 0x27BF, 0xCF05, 0x2BE5, 0xD122, 0x2E6E, 0xD29C, 0x3002, 0xD29D, 0x9FDB, 0xD402, 0xA98C, 0xD7B4, 0xB11F, 0xD7BA, 0xBB6A, 0xD973, 0xC2D1, 0xDD50, 0xC6FD, 0xDD53, 0xD16C, 0xDE36, 0xD3BA, 0xDFCA, 0xD3C2, 0xE0B3, 0xD05E, 0xE0B3, 0xC6FD, 0xE4A2, 0xC2AB, 0xE64D, 0xBB09, 0xE64D, 0xB11F, 0xEA29, 0xA8FC, 0xEB67, 0x9E98, 0xEB67, 0x2F6B, 0xEF37, 0x2B60, 0xEFFE, 0x2595, 0xEFF8, 0x1AD5, 0xED91, 0x1502, 0xED91, 0x1502, 0xFFFF, 0xD1CF, 0x1A7E, 0xD84F, 0x16DB, 0xDF19, 0x15A9, 0xE5E0, 0x16EA, 0xEC5B, 0x1AA4, 0xEC9D, 0x1D34, 0xEC9D, 0x20CC, 0xE5F1, 0x1D41, 0xDF02, 0x1C12, 0xD812, 0x1D41, 0xD166, 0x20CC, 0xD16C, 0x1B45, 0xD1CF, 0x1A7E, 0xFFFF, 0xE3BD, 0xACFD, 0xDE8E, 0xAF4F, 0xD988, 0xAC0F, 0xD7CC, 0xA8CD, 0xDD1C, 0xAAA9, 0xE287, 0xAA5B, 0xE655, 0xA8BE, 0xE3BD, 0xACFD, 0xFFFF, 0xE802, 0x2DC5, 0xE809, 0x343C, 0xE808, 0x9FC8, 0xE7E3, 0xA296, 0xE70D, 0xA4B1, 0xE2C9, 0xA70E, 0xDE4E, 0xA790, 0xD6A1, 0xA457, 0xD5FF, 0x9F2B, 0xD5FF, 0x2DFD, 0xD6B2, 0x2B72, 0xDA78, 0x2861, 0xDE9D, 0x276F, 0xE300, 0x2824, 0xE70D, 0x2B13, 0xE7FF, 0x2DB6, 0xE800, 0x2DC5, 0xE802, 0x2DC5, 0xFFFF, 0xE2ED, 0xBA8B, 0xE1CC, 0xBF52, 0xDF1C, 0xC165, 0xDC64, 0xBF99, 0xDB1B, 0xBAFF, 0xDB19, 0xB433, 0xDF04, 0xB552, 0xE2EF, 0xB438, 0xE2ED, 0xBA8B, 0xFFFF, 0xEC09, 0x2893, 0xE925, 0x2A08, 0xE57D, 0x261D, 0xE149, 0x246F, 0xDBDE, 0x24A0, 0xD6BC, 0x2795, 0xD484, 0x2A46, 0xD1C0, 0x2853, 0xD166, 0x251E, 0xD80D, 0x2151, 0xDF02, 0x200C, 0xE5F6, 0x2151, 0xEC9D, 0x251E, 0xEC09, 0x2893}; -const PROGMEM uint16_t unload_cartridge_btn[] = {0x0AAA, 0x0E1E, 0x57FF, 0x0E1E, 0x57FF, 0x33C3, 0x0AAA, 0x33C3, 0x0AAA, 0x0E1E}; +const PROGMEM uint16_t park_btn[] = {0x0AAA, 0x0E1E, 0x57FF, 0x0E1E, 0x57FF, 0x33C3, 0x0AAA, 0x33C3, 0x0AAA, 0x0E1E}; const PROGMEM uint16_t pause_btn[] = {0x47FF, 0xCA58, 0x7FFF, 0xCA58, 0x7FFF, 0xEFFE, 0x47FF, 0xEFFE, 0x47FF, 0xCA58}; const PROGMEM uint16_t load_chocolate_btn[] = {0x0AAA, 0x3D2C, 0x57FF, 0x3D2C, 0x57FF, 0x62D2, 0x0AAA, 0x62D2, 0x0AAA, 0x3D2C}; const PROGMEM uint16_t preheat_chocolate_btn[] = {0x0AAA, 0x6C3B, 0x57FF, 0x6C3B, 0x57FF, 0x91E0, 0x0AAA, 0x91E0, 0x0AAA, 0x6C3B}; @@ -49,6 +49,13 @@ const PROGMEM uint16_t h0_label[] = {0x62A9, 0x2A5A, 0x8FFE, 0x2A5A, 0x8FFE, 0x4 const PROGMEM uint16_t h0_temp[] = {0x62A9, 0x41E1, 0x8FFE, 0x41E1, 0x8FFE, 0x5968, 0x62A9, 0x5968, 0x62A9, 0x41E1}; const PROGMEM uint16_t h1_label[] = {0x8FFE, 0x2A5A, 0xBD53, 0x2A5A, 0xBD53, 0x41E1, 0x8FFE, 0x41E1, 0x8FFE, 0x2A5A}; const PROGMEM uint16_t h1_temp[] = {0x8FFE, 0x41E1, 0xBD53, 0x41E1, 0xBD53, 0x5968, 0x8FFE, 0x5968, 0x8FFE, 0x41E1}; -const PROGMEM uint16_t extrude_btn[] = {0xC859, 0xDD2B, 0xF5AE, 0xDD2B, 0xF5AE, 0xEFFE, 0xC859, 0xEFFE, 0xC859, 0xDD2B}; const PROGMEM uint16_t h2_label[] = {0x8FFE, 0x5E1D, 0xBD53, 0x5E1D, 0xBD53, 0x75A4, 0x8FFE, 0x75A4, 0x8FFE, 0x5E1D}; const PROGMEM uint16_t h2_temp[] = {0x8FFE, 0x75A4, 0xBD53, 0x75A4, 0xBD53, 0x8D2C, 0x8FFE, 0x8D2C, 0x8FFE, 0x75A4}; +const PROGMEM uint16_t extrude_btn[] = {0xC859, 0xDD2B, 0xF5AE, 0xDD2B, 0xF5AE, 0xEFFE, 0xC859, 0xEFFE, 0xC859, 0xDD2B}; +const PROGMEM uint16_t load_screen_extrude[] = {0x25FB, 0x89AE, 0x2F58, 0x89AE, 0x2F58, 0xAAF6, 0x3406, 0xAAF6, 0x2AAA, 0xBB9A, 0x214D, 0xAAF6, 0x25FB, 0xAAF6, 0x25FB, 0x89AE}; +const PROGMEM uint16_t load_screen_retract[] = {0x25FC, 0x790A, 0x2F58, 0x790A, 0x2F58, 0x57C2, 0x3406, 0x57C2, 0x2AAA, 0x471D, 0x214D, 0x57C2, 0x25FC, 0x57C2, 0x25FC, 0x790A}; +const PROGMEM uint16_t load_screen_back_btn[] = {0x1555, 0xCA58, 0xC553, 0xCA58, 0xC553, 0xEFFE, 0x1555, 0xEFFE, 0x1555, 0xCA58}; +const PROGMEM uint16_t load_screen_unload_btn[] = {0x4AAA, 0x8EBD, 0xC553, 0x8EBD, 0xC553, 0xB463, 0x4AAA, 0xB463, 0x4AAA, 0x8EBD}; +const PROGMEM uint16_t load_screen_load_btn[] = {0x4AAA, 0x5322, 0xC553, 0x5322, 0xC553, 0x78C7, 0x4AAA, 0x78C7, 0x4AAA, 0x5322}; +const PROGMEM uint16_t load_sreen_title[] = {0x4AAA, 0x1787, 0xC553, 0x1787, 0xC553, 0x3D2C, 0x4AAA, 0x3D2C, 0x4AAA, 0x1787}; +const PROGMEM uint16_t load_screen_increment[] = {0x1555, 0x2E1D, 0x3FFF, 0x2E1D, 0x3FFF, 0x3D2C, 0x1555, 0x3D2C, 0x1555, 0x2E1D}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_user_request_alert_box.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_user_request_alert_box.cpp index 957c95f047..e3892217a5 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_user_request_alert_box.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_user_request_alert_box.cpp @@ -50,6 +50,12 @@ bool ConfirmUserRequestAlertBox::onTouchEnd(uint8_t tag) { } } +void ConfirmUserRequestAlertBox::onIdle() { + if (!ExtUI::awaitingUserConfirm()) { + hide(); + } +} + void ConfirmUserRequestAlertBox::show(const char* msg) { drawMessage(msg); storeBackground(); diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/move_axis_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/move_axis_screen.cpp index 5f5971458a..7edf8e1640 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/move_axis_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/move_axis_screen.cpp @@ -70,8 +70,8 @@ void MoveAxisScreen::onRedraw(draw_mode_t what) { } bool BaseMoveAxisScreen::onTouchHeld(uint8_t tag) { - #define UI_INCREMENT_AXIS(axis) UI_INCREMENT(AxisPosition_mm, axis); - #define UI_DECREMENT_AXIS(axis) UI_DECREMENT(AxisPosition_mm, axis); + #define UI_INCREMENT_AXIS(axis) setManualFeedrate(axis, increment); UI_INCREMENT(AxisPosition_mm, axis); + #define UI_DECREMENT_AXIS(axis) setManualFeedrate(axis, increment); UI_DECREMENT(AxisPosition_mm, axis); const float increment = getIncrement(); switch (tag) { case 2: UI_DECREMENT_AXIS(X); break; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screen_data.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screen_data.h index e725a23797..06368f0ce7 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screen_data.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screen_data.h @@ -58,6 +58,7 @@ union screen_data_t { DECL_DATA_IF_INCLUDED(FTDI_BED_MESH_SCREEN) DECL_DATA_IF_INCLUDED(FTDI_STRESS_TEST_SCREEN) DECL_DATA_IF_INCLUDED(FTDI_COCOA_PREHEAT_SCREEN) + DECL_DATA_IF_INCLUDED(FTDI_COCOA_LOAD_CHOCOLATE_SCREEN) DECL_DATA_IF_INCLUDED(FTDI_NUDGE_NOZZLE_SCREEN) DECL_DATA_IF_INCLUDED(FTDI_BASE_NUMERIC_ADJ_SCREEN) DECL_DATA_IF_INCLUDED(FTDI_ALERT_DIALOG_BOX) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.cpp index ab3c3d7114..2c9d881173 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.cpp @@ -98,6 +98,8 @@ SCREEN_TABLE { DECL_SCREEN_IF_INCLUDED(FTDI_BIO_PRINTING_DIALOG_BOX) DECL_SCREEN_IF_INCLUDED(FTDI_BIO_CONFIRMOME_XYZ) DECL_SCREEN_IF_INCLUDED(FTDI_BIO_CONFIRMOME_E) + DECL_SCREEN_IF_INCLUDED(FTDI_COCOA_STATUS_SCREEN) + DECL_SCREEN_IF_INCLUDED(FTDI_COCOA_MAIN_MENU) DECL_SCREEN_IF_INCLUDED(FTDI_COCOA_PREHEAT_MENU) DECL_SCREEN_IF_INCLUDED(FTDI_COCOA_PREHEAT_SCREEN) DECL_SCREEN_IF_INCLUDED(FTDI_COCOA_UNLOAD_CARTRIDGE_SCREEN) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h index a82d8988da..1574576fa1 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h @@ -100,7 +100,6 @@ enum { #if ENABLED(TOUCH_UI_COCOA_PRESS) PREHEAT_MENU_CACHE, PREHEAT_TIMER_SCREEN_CACHE, - UNLOAD_CARTRIDGE_SCREEN_CACHE, LOAD_CHOCOLATE_SCREEN_CACHE, MOVE_XYZ_SCREEN_CACHE, MOVE_E_SCREEN_CACHE, @@ -145,11 +144,11 @@ enum { #elif ENABLED(TOUCH_UI_COCOA_PRESS) #include "cocoa_press_status_screen.h" #include "cocoa_press_main_menu.h" - #include "cocoa_press_advanced_settings.h" + #include "cocoa_press_advanced_settings_menu.h" #include "cocoa_press_preheat_menu.h" #include "cocoa_press_preheat_screen.h" - #include "cocoa_press_unload_cartridge.h" #include "cocoa_press_load_chocolate.h" + #include "move_axis_screen.h" #include "cocoa_press_move_xyz_screen.h" #include "cocoa_press_move_e_screen.h" #include "tune_menu.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/colors.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/colors.h index cdcf00a21b..0fe83bce46 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/colors.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/colors.h @@ -85,6 +85,9 @@ namespace Theme { constexpr uint32_t logo_bg_rgb = accent_color_1; constexpr uint32_t logo_fill_rgb = accent_color_0; constexpr uint32_t logo_stroke_rgb = accent_color_4; + + constexpr uint32_t bed_mesh_lines_rgb = 0xFFFFFF; + constexpr uint32_t bed_mesh_shadow_rgb = 0x444444; #elif ANY(TOUCH_UI_COCOA_THEME, TOUCH_UI_FROZEN_THEME) constexpr uint32_t theme_darkest = accent_color_1; constexpr uint32_t theme_dark = accent_color_4; @@ -102,6 +105,9 @@ namespace Theme { constexpr uint32_t logo_bg_rgb = accent_color_5; constexpr uint32_t logo_fill_rgb = accent_color_6; constexpr uint32_t logo_stroke_rgb = accent_color_2; + + constexpr uint32_t bed_mesh_lines_rgb = accent_color_6; + constexpr uint32_t bed_mesh_shadow_rgb = 0x444444; #else constexpr uint32_t theme_darkest = gray_color_1; constexpr uint32_t theme_dark = gray_color_2; From 7a027be25594ae79166b2612c17cf0db3aa29ddf Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Mon, 22 Feb 2021 00:12:47 +0000 Subject: [PATCH 007/253] [cron] Bump distribution date (2021-02-22) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index fdef70665c..8263b23284 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2021-02-21" + #define STRING_DISTRIBUTION_DATE "2021-02-22" #endif /** From 53d7ae4e9b652ca217b58bd0837dbf38cf2d572f Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Tue, 23 Feb 2021 00:12:43 +0000 Subject: [PATCH 008/253] [cron] Bump distribution date (2021-02-23) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 8263b23284..6a54df87a8 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2021-02-22" + #define STRING_DISTRIBUTION_DATE "2021-02-23" #endif /** From ba301fd800173ccdf9703e1e8bdb702720c6a872 Mon Sep 17 00:00:00 2001 From: Marcio T Date: Mon, 22 Feb 2021 21:38:54 -0700 Subject: [PATCH 009/253] FTDI Touch UI followup (#21167) --- Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h | 1 - Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/colors.h | 3 +++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h index 1574576fa1..61d702ebaf 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h @@ -175,7 +175,6 @@ enum { #include "change_filament_screen.h" #include "move_axis_screen.h" #include "steps_screen.h" -#include "stepper_current_screen.h" #include "feedrate_percent_screen.h" #include "max_velocity_screen.h" #include "max_acceleration_screen.h" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/colors.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/colors.h index 0fe83bce46..1649675122 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/colors.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/theme/colors.h @@ -125,6 +125,9 @@ namespace Theme { constexpr uint32_t logo_bg_rgb = accent_color_4; constexpr uint32_t logo_fill_rgb = accent_color_3; constexpr uint32_t logo_stroke_rgb = 0x000000; + + constexpr uint32_t bed_mesh_lines_rgb = 0xFFFFFF; + constexpr uint32_t bed_mesh_shadow_rgb = 0x444444; #endif constexpr uint32_t shadow_rgb = gray_color_6; From 27f9437d3141635e290b11109b5f6d0929962194 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 23 Feb 2021 16:08:00 -0600 Subject: [PATCH 010/253] G92, subcodes flag cleanup --- Marlin/src/gcode/geometry/G92.cpp | 79 +++++++++++++++++------------- Marlin/src/gcode/parser.cpp | 6 +-- Marlin/src/gcode/parser.h | 4 +- Marlin/src/inc/Conditionals_post.h | 2 +- 4 files changed, 52 insertions(+), 39 deletions(-) diff --git a/Marlin/src/gcode/geometry/G92.cpp b/Marlin/src/gcode/geometry/G92.cpp index 1a0382ed7c..30620be6f9 100644 --- a/Marlin/src/gcode/geometry/G92.cpp +++ b/Marlin/src/gcode/geometry/G92.cpp @@ -29,77 +29,90 @@ #endif /** - * G92: Set current position to given X Y Z E + * G92: Set the Current Position to the given X Y Z E values. + * + * Behind the scenes the G92 command may modify the Current Position + * or the Position Shift depending on settings and sub-commands. + * + * Since E has no Workspace Offset, it is always set directly. + * + * Without Workspace Offsets (e.g., with NO_WORKSPACE_OFFSETS): + * G92 : Set NATIVE Current Position to the given X Y Z E. + * + * Using Workspace Offsets (default Marlin behavior): + * G92 : Modify Workspace Offsets so the reported position shows the given X Y Z E. + * G92.1 : Zero XYZ Workspace Offsets (so the reported position = the native position). + * + * With POWER_LOSS_RECOVERY: + * G92.9 : Set NATIVE Current Position to the given X Y Z E. */ void GcodeSuite::G92() { - bool sync_E = false, sync_XYZ = false; + bool sync_E = false, sync_XYZE = false; - #if ENABLED(USE_GCODE_SUBCODES) + #if USE_GCODE_SUBCODES const uint8_t subcode_G92 = parser.subcode; #else constexpr uint8_t subcode_G92 = 0; #endif switch (subcode_G92) { - default: break; - #if ENABLED(CNC_COORDINATE_SYSTEMS) - case 1: { - // Zero the G92 values and restore current position - #if !IS_SCARA - LOOP_XYZ(i) if (position_shift[i]) { - position_shift[i] = 0; - update_workspace_offset((AxisEnum)i); - } - #endif // Not SCARA - } return; + default: return; // Ignore unknown G92.x + + #if ENABLED(CNC_COORDINATE_SYSTEMS) && !IS_SCARA + case 1: // G92.1 - Zero the Workspace Offset + LOOP_XYZ(i) if (position_shift[i]) { + position_shift[i] = 0; + update_workspace_offset((AxisEnum)i); + } + break; #endif + #if ENABLED(POWER_LOSS_RECOVERY) - case 9: { + case 9: // G92.9 - Set Current Position directly (like Marlin 1.0) LOOP_XYZE(i) { if (parser.seenval(axis_codes[i])) { + if (i == E_AXIS) sync_E = true; else sync_XYZE = true; current_position[i] = parser.value_axis_units((AxisEnum)i); - if (i == E_AXIS) sync_E = true; else sync_XYZ = true; } } - } break; + break; #endif - case 0: { + + case 0: LOOP_XYZE(i) { if (parser.seenval(axis_codes[i])) { - const float l = parser.value_axis_units((AxisEnum)i), - v = i == E_AXIS ? l : LOGICAL_TO_NATIVE(l, i), - d = v - current_position[i]; + const float l = parser.value_axis_units((AxisEnum)i), // Given axis coordinate value, converted to millimeters + v = i == E_AXIS ? l : LOGICAL_TO_NATIVE(l, i), // Axis position in NATIVE space (applying the existing offset) + d = v - current_position[i]; // How much is the current axis position altered by? if (!NEAR_ZERO(d)) { - #if IS_SCARA || !HAS_POSITION_SHIFT - if (i == E_AXIS) sync_E = true; else sync_XYZ = true; - current_position[i] = v; // Without workspaces revert to Marlin 1.0 behavior - #elif HAS_POSITION_SHIFT + #if HAS_POSITION_SHIFT && !IS_SCARA // When using workspaces... if (i == E_AXIS) { sync_E = true; - current_position.e = v; // When using coordinate spaces, only E is set directly + current_position.e = v; // ...E is still set directly } else { - position_shift[i] += d; // Other axes simply offset the coordinate space + position_shift[i] += d; // ...but other axes offset the workspace. update_workspace_offset((AxisEnum)i); } + #else // Without workspaces... + if (i == E_AXIS) sync_E = true; else sync_XYZE = true; + current_position[i] = v; // ...set Current Position directly (like Marlin 1.0) #endif } } } - } break; + break; } #if ENABLED(CNC_COORDINATE_SYSTEMS) - // Apply workspace offset to the active coordinate system + // Apply Workspace Offset to the active coordinate system if (WITHIN(active_coordinate_system, 0, MAX_COORDINATE_SYSTEMS - 1)) coordinate_system[active_coordinate_system] = position_shift; #endif - if (sync_XYZ) sync_plan_position(); + if (sync_XYZE) sync_plan_position(); else if (sync_E) sync_plan_position_e(); - #if DISABLED(DIRECT_STEPPING) - report_current_position(); - #endif + IF_DISABLED(DIRECT_STEPPING, report_current_position()); } diff --git a/Marlin/src/gcode/parser.cpp b/Marlin/src/gcode/parser.cpp index 6408b2ce2d..ebe9d3b2cd 100644 --- a/Marlin/src/gcode/parser.cpp +++ b/Marlin/src/gcode/parser.cpp @@ -47,13 +47,13 @@ char *GCodeParser::command_ptr, char GCodeParser::command_letter; uint16_t GCodeParser::codenum; -#if ENABLED(USE_GCODE_SUBCODES) +#if USE_GCODE_SUBCODES uint8_t GCodeParser::subcode; #endif #if ENABLED(GCODE_MOTION_MODES) int16_t GCodeParser::motion_mode_codenum = -1; - #if ENABLED(USE_GCODE_SUBCODES) + #if USE_GCODE_SUBCODES uint8_t GCodeParser::motion_mode_subcode; #endif #endif @@ -189,7 +189,7 @@ void GCodeParser::parse(char *p) { } // Allow for decimal point in command - #if ENABLED(USE_GCODE_SUBCODES) + #if USE_GCODE_SUBCODES if (*p == '.') { p++; while (NUMERIC(*p)) diff --git a/Marlin/src/gcode/parser.h b/Marlin/src/gcode/parser.h index d60b21a906..5a31a9943e 100644 --- a/Marlin/src/gcode/parser.h +++ b/Marlin/src/gcode/parser.h @@ -85,13 +85,13 @@ public: *string_arg, // string of command line command_letter; // G, M, or T static uint16_t codenum; // 123 - #if ENABLED(USE_GCODE_SUBCODES) + #if USE_GCODE_SUBCODES static uint8_t subcode; // .1 #endif #if ENABLED(GCODE_MOTION_MODES) static int16_t motion_mode_codenum; - #if ENABLED(USE_GCODE_SUBCODES) + #if USE_GCODE_SUBCODES static uint8_t motion_mode_subcode; #endif FORCE_INLINE static void cancel_motion_mode() { motion_mode_codenum = -1; } diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index 949885eab7..f8360767d9 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -2758,7 +2758,7 @@ // Add commands that need sub-codes to this list #if ANY(G38_PROBE_TARGET, CNC_COORDINATE_SYSTEMS, POWER_LOSS_RECOVERY) - #define USE_GCODE_SUBCODES + #define USE_GCODE_SUBCODES 1 #endif // Parking Extruder From bdb8c07bb22bed1ca78f4b7d14651a8e04828e82 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 23 Feb 2021 16:09:54 -0600 Subject: [PATCH 011/253] Outdent UBL code --- Marlin/src/feature/bedlevel/ubl/ubl.cpp | 408 +-- Marlin/src/feature/bedlevel/ubl/ubl.h | 460 +-- Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp | 3220 +++++++++---------- 3 files changed, 2044 insertions(+), 2044 deletions(-) diff --git a/Marlin/src/feature/bedlevel/ubl/ubl.cpp b/Marlin/src/feature/bedlevel/ubl/ubl.cpp index ef3289f732..601f0ebb54 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl.cpp @@ -24,234 +24,234 @@ #if ENABLED(AUTO_BED_LEVELING_UBL) - #include "../bedlevel.h" +#include "../bedlevel.h" - unified_bed_leveling ubl; +unified_bed_leveling ubl; - #include "../../../MarlinCore.h" - #include "../../../gcode/gcode.h" +#include "../../../MarlinCore.h" +#include "../../../gcode/gcode.h" - #include "../../../module/settings.h" - #include "../../../module/planner.h" - #include "../../../module/motion.h" - #include "../../../module/probe.h" +#include "../../../module/settings.h" +#include "../../../module/planner.h" +#include "../../../module/motion.h" +#include "../../../module/probe.h" +#if ENABLED(EXTENSIBLE_UI) + #include "../../../lcd/extui/ui_api.h" +#endif + +#include "math.h" + +void unified_bed_leveling::echo_name() { SERIAL_ECHOPGM("Unified Bed Leveling"); } + +void unified_bed_leveling::report_current_mesh() { + if (!leveling_is_valid()) return; + SERIAL_ECHO_MSG(" G29 I999"); + GRID_LOOP(x, y) + if (!isnan(z_values[x][y])) { + SERIAL_ECHO_START(); + SERIAL_ECHOPAIR(" M421 I", x, " J", y); + SERIAL_ECHOLNPAIR_F_P(SP_Z_STR, z_values[x][y], 4); + serial_delay(75); // Prevent Printrun from exploding + } +} + +void unified_bed_leveling::report_state() { + echo_name(); + SERIAL_ECHO_TERNARY(planner.leveling_active, " System v" UBL_VERSION " ", "", "in", "active\n"); + serial_delay(50); +} + +int8_t unified_bed_leveling::storage_slot; + +float unified_bed_leveling::z_values[GRID_MAX_POINTS_X][GRID_MAX_POINTS_Y]; + +#define _GRIDPOS(A,N) (MESH_MIN_##A + N * (MESH_##A##_DIST)) + +const float +unified_bed_leveling::_mesh_index_to_xpos[GRID_MAX_POINTS_X] PROGMEM = ARRAY_N(GRID_MAX_POINTS_X, + _GRIDPOS(X, 0), _GRIDPOS(X, 1), _GRIDPOS(X, 2), _GRIDPOS(X, 3), + _GRIDPOS(X, 4), _GRIDPOS(X, 5), _GRIDPOS(X, 6), _GRIDPOS(X, 7), + _GRIDPOS(X, 8), _GRIDPOS(X, 9), _GRIDPOS(X, 10), _GRIDPOS(X, 11), + _GRIDPOS(X, 12), _GRIDPOS(X, 13), _GRIDPOS(X, 14), _GRIDPOS(X, 15) +), +unified_bed_leveling::_mesh_index_to_ypos[GRID_MAX_POINTS_Y] PROGMEM = ARRAY_N(GRID_MAX_POINTS_Y, + _GRIDPOS(Y, 0), _GRIDPOS(Y, 1), _GRIDPOS(Y, 2), _GRIDPOS(Y, 3), + _GRIDPOS(Y, 4), _GRIDPOS(Y, 5), _GRIDPOS(Y, 6), _GRIDPOS(Y, 7), + _GRIDPOS(Y, 8), _GRIDPOS(Y, 9), _GRIDPOS(Y, 10), _GRIDPOS(Y, 11), + _GRIDPOS(Y, 12), _GRIDPOS(Y, 13), _GRIDPOS(Y, 14), _GRIDPOS(Y, 15) +); + +volatile int16_t unified_bed_leveling::encoder_diff; + +unified_bed_leveling::unified_bed_leveling() { reset(); } + +void unified_bed_leveling::reset() { + const bool was_enabled = planner.leveling_active; + set_bed_leveling_enabled(false); + storage_slot = -1; + ZERO(z_values); #if ENABLED(EXTENSIBLE_UI) - #include "../../../lcd/extui/ui_api.h" + GRID_LOOP(x, y) ExtUI::onMeshUpdate(x, y, 0); #endif + if (was_enabled) report_current_position(); +} - #include "math.h" +void unified_bed_leveling::invalidate() { + set_bed_leveling_enabled(false); + set_all_mesh_points_to_value(NAN); +} - void unified_bed_leveling::echo_name() { SERIAL_ECHOPGM("Unified Bed Leveling"); } +void unified_bed_leveling::set_all_mesh_points_to_value(const float value) { + GRID_LOOP(x, y) { + z_values[x][y] = value; + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(x, y, value)); + } +} - void unified_bed_leveling::report_current_mesh() { - if (!leveling_is_valid()) return; - SERIAL_ECHO_MSG(" G29 I999"); - GRID_LOOP(x, y) - if (!isnan(z_values[x][y])) { - SERIAL_ECHO_START(); - SERIAL_ECHOPAIR(" M421 I", x, " J", y); - SERIAL_ECHOLNPAIR_F_P(SP_Z_STR, z_values[x][y], 4); - serial_delay(75); // Prevent Printrun from exploding - } +#if ENABLED(OPTIMIZED_MESH_STORAGE) + + constexpr float mesh_store_scaling = 1000; + constexpr int16_t Z_STEPS_NAN = INT16_MAX; + + void unified_bed_leveling::set_store_from_mesh(const bed_mesh_t &in_values, mesh_store_t &stored_values) { + auto z_to_store = [](const float &z) { + if (isnan(z)) return Z_STEPS_NAN; + const int32_t z_scaled = TRUNC(z * mesh_store_scaling); + if (z_scaled == Z_STEPS_NAN || !WITHIN(z_scaled, INT16_MIN, INT16_MAX)) + return Z_STEPS_NAN; // If Z is out of range, return our custom 'NaN' + return int16_t(z_scaled); + }; + GRID_LOOP(x, y) stored_values[x][y] = z_to_store(in_values[x][y]); } - void unified_bed_leveling::report_state() { - echo_name(); - SERIAL_ECHO_TERNARY(planner.leveling_active, " System v" UBL_VERSION " ", "", "in", "active\n"); - serial_delay(50); + void unified_bed_leveling::set_mesh_from_store(const mesh_store_t &stored_values, bed_mesh_t &out_values) { + auto store_to_z = [](const int16_t z_scaled) { + return z_scaled == Z_STEPS_NAN ? NAN : z_scaled / mesh_store_scaling; + }; + GRID_LOOP(x, y) out_values[x][y] = store_to_z(stored_values[x][y]); } - int8_t unified_bed_leveling::storage_slot; +#endif // OPTIMIZED_MESH_STORAGE - float unified_bed_leveling::z_values[GRID_MAX_POINTS_X][GRID_MAX_POINTS_Y]; +static void serial_echo_xy(const uint8_t sp, const int16_t x, const int16_t y) { + SERIAL_ECHO_SP(sp); + SERIAL_CHAR('('); + if (x < 100) { SERIAL_CHAR(' '); if (x < 10) SERIAL_CHAR(' '); } + SERIAL_ECHO(x); + SERIAL_CHAR(','); + if (y < 100) { SERIAL_CHAR(' '); if (y < 10) SERIAL_CHAR(' '); } + SERIAL_ECHO(y); + SERIAL_CHAR(')'); + serial_delay(5); +} - #define _GRIDPOS(A,N) (MESH_MIN_##A + N * (MESH_##A##_DIST)) - - const float - unified_bed_leveling::_mesh_index_to_xpos[GRID_MAX_POINTS_X] PROGMEM = ARRAY_N(GRID_MAX_POINTS_X, - _GRIDPOS(X, 0), _GRIDPOS(X, 1), _GRIDPOS(X, 2), _GRIDPOS(X, 3), - _GRIDPOS(X, 4), _GRIDPOS(X, 5), _GRIDPOS(X, 6), _GRIDPOS(X, 7), - _GRIDPOS(X, 8), _GRIDPOS(X, 9), _GRIDPOS(X, 10), _GRIDPOS(X, 11), - _GRIDPOS(X, 12), _GRIDPOS(X, 13), _GRIDPOS(X, 14), _GRIDPOS(X, 15) - ), - unified_bed_leveling::_mesh_index_to_ypos[GRID_MAX_POINTS_Y] PROGMEM = ARRAY_N(GRID_MAX_POINTS_Y, - _GRIDPOS(Y, 0), _GRIDPOS(Y, 1), _GRIDPOS(Y, 2), _GRIDPOS(Y, 3), - _GRIDPOS(Y, 4), _GRIDPOS(Y, 5), _GRIDPOS(Y, 6), _GRIDPOS(Y, 7), - _GRIDPOS(Y, 8), _GRIDPOS(Y, 9), _GRIDPOS(Y, 10), _GRIDPOS(Y, 11), - _GRIDPOS(Y, 12), _GRIDPOS(Y, 13), _GRIDPOS(Y, 14), _GRIDPOS(Y, 15) - ); - - volatile int16_t unified_bed_leveling::encoder_diff; - - unified_bed_leveling::unified_bed_leveling() { reset(); } - - void unified_bed_leveling::reset() { - const bool was_enabled = planner.leveling_active; - set_bed_leveling_enabled(false); - storage_slot = -1; - ZERO(z_values); - #if ENABLED(EXTENSIBLE_UI) - GRID_LOOP(x, y) ExtUI::onMeshUpdate(x, y, 0); - #endif - if (was_enabled) report_current_position(); - } - - void unified_bed_leveling::invalidate() { - set_bed_leveling_enabled(false); - set_all_mesh_points_to_value(NAN); - } - - void unified_bed_leveling::set_all_mesh_points_to_value(const float value) { - GRID_LOOP(x, y) { - z_values[x][y] = value; - TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(x, y, value)); - } - } - - #if ENABLED(OPTIMIZED_MESH_STORAGE) - - constexpr float mesh_store_scaling = 1000; - constexpr int16_t Z_STEPS_NAN = INT16_MAX; - - void unified_bed_leveling::set_store_from_mesh(const bed_mesh_t &in_values, mesh_store_t &stored_values) { - auto z_to_store = [](const float &z) { - if (isnan(z)) return Z_STEPS_NAN; - const int32_t z_scaled = TRUNC(z * mesh_store_scaling); - if (z_scaled == Z_STEPS_NAN || !WITHIN(z_scaled, INT16_MIN, INT16_MAX)) - return Z_STEPS_NAN; // If Z is out of range, return our custom 'NaN' - return int16_t(z_scaled); - }; - GRID_LOOP(x, y) stored_values[x][y] = z_to_store(in_values[x][y]); - } - - void unified_bed_leveling::set_mesh_from_store(const mesh_store_t &stored_values, bed_mesh_t &out_values) { - auto store_to_z = [](const int16_t z_scaled) { - return z_scaled == Z_STEPS_NAN ? NAN : z_scaled / mesh_store_scaling; - }; - GRID_LOOP(x, y) out_values[x][y] = store_to_z(stored_values[x][y]); - } - - #endif // OPTIMIZED_MESH_STORAGE - - static void serial_echo_xy(const uint8_t sp, const int16_t x, const int16_t y) { +static void serial_echo_column_labels(const uint8_t sp) { + SERIAL_ECHO_SP(7); + LOOP_L_N(i, GRID_MAX_POINTS_X) { + if (i < 10) SERIAL_CHAR(' '); + SERIAL_ECHO(i); SERIAL_ECHO_SP(sp); - SERIAL_CHAR('('); - if (x < 100) { SERIAL_CHAR(' '); if (x < 10) SERIAL_CHAR(' '); } - SERIAL_ECHO(x); - SERIAL_CHAR(','); - if (y < 100) { SERIAL_CHAR(' '); if (y < 10) SERIAL_CHAR(' '); } - SERIAL_ECHO(y); - SERIAL_CHAR(')'); - serial_delay(5); + } + serial_delay(10); +} + +/** + * Produce one of these mesh maps: + * 0: Human-readable + * 1: CSV format for spreadsheet import + * 2: TODO: Display on Graphical LCD + * 4: Compact Human-Readable + */ +void unified_bed_leveling::display_map(const int map_type) { + const bool was = gcode.set_autoreport_paused(true); + + constexpr uint8_t eachsp = 1 + 6 + 1, // [-3.567] + twixt = eachsp * (GRID_MAX_POINTS_X) - 9 * 2; // Leading 4sp, Coordinates 9sp each + + const bool human = !(map_type & 0x3), csv = map_type == 1, lcd = map_type == 2, comp = map_type & 0x4; + + SERIAL_ECHOPGM("\nBed Topography Report"); + if (human) { + SERIAL_ECHOLNPGM(":\n"); + serial_echo_xy(4, MESH_MIN_X, MESH_MAX_Y); + serial_echo_xy(twixt, MESH_MAX_X, MESH_MAX_Y); + SERIAL_EOL(); + serial_echo_column_labels(eachsp - 2); + } + else { + SERIAL_ECHOPGM(" for "); + serialprintPGM(csv ? PSTR("CSV:\n") : PSTR("LCD:\n")); } - static void serial_echo_column_labels(const uint8_t sp) { - SERIAL_ECHO_SP(7); + // Add XY probe offset from extruder because probe.probe_at_point() subtracts them when + // moving to the XY position to be measured. This ensures better agreement between + // the current Z position after G28 and the mesh values. + const xy_int8_t curr = closest_indexes(xy_pos_t(current_position) + probe.offset_xy); + + if (!lcd) SERIAL_EOL(); + for (int8_t j = GRID_MAX_POINTS_Y - 1; j >= 0; j--) { + + // Row Label (J index) + if (human) { + if (j < 10) SERIAL_CHAR(' '); + SERIAL_ECHO(j); + SERIAL_ECHOPGM(" |"); + } + + // Row Values (I indexes) LOOP_L_N(i, GRID_MAX_POINTS_X) { - if (i < 10) SERIAL_CHAR(' '); - SERIAL_ECHO(i); - SERIAL_ECHO_SP(sp); + + // Opening Brace or Space + const bool is_current = i == curr.x && j == curr.y; + if (human) SERIAL_CHAR(is_current ? '[' : ' '); + + // Z Value at current I, J + const float f = z_values[i][j]; + if (lcd) { + // TODO: Display on Graphical LCD + } + else if (isnan(f)) + serialprintPGM(human ? PSTR(" . ") : PSTR("NAN")); + else if (human || csv) { + if (human && f >= 0.0) SERIAL_CHAR(f > 0 ? '+' : ' '); // Display sign also for positive numbers (' ' for 0) + SERIAL_ECHO_F(f, 3); // Positive: 5 digits, Negative: 6 digits + } + if (csv && i < GRID_MAX_POINTS_X - 1) SERIAL_CHAR('\t'); + + // Closing Brace or Space + if (human) SERIAL_CHAR(is_current ? ']' : ' '); + + SERIAL_FLUSHTX(); + idle_no_sleep(); } - serial_delay(10); - } - - /** - * Produce one of these mesh maps: - * 0: Human-readable - * 1: CSV format for spreadsheet import - * 2: TODO: Display on Graphical LCD - * 4: Compact Human-Readable - */ - void unified_bed_leveling::display_map(const int map_type) { - const bool was = gcode.set_autoreport_paused(true); - - constexpr uint8_t eachsp = 1 + 6 + 1, // [-3.567] - twixt = eachsp * (GRID_MAX_POINTS_X) - 9 * 2; // Leading 4sp, Coordinates 9sp each - - const bool human = !(map_type & 0x3), csv = map_type == 1, lcd = map_type == 2, comp = map_type & 0x4; - - SERIAL_ECHOPGM("\nBed Topography Report"); - if (human) { - SERIAL_ECHOLNPGM(":\n"); - serial_echo_xy(4, MESH_MIN_X, MESH_MAX_Y); - serial_echo_xy(twixt, MESH_MAX_X, MESH_MAX_Y); - SERIAL_EOL(); - serial_echo_column_labels(eachsp - 2); - } - else { - SERIAL_ECHOPGM(" for "); - serialprintPGM(csv ? PSTR("CSV:\n") : PSTR("LCD:\n")); - } - - // Add XY probe offset from extruder because probe.probe_at_point() subtracts them when - // moving to the XY position to be measured. This ensures better agreement between - // the current Z position after G28 and the mesh values. - const xy_int8_t curr = closest_indexes(xy_pos_t(current_position) + probe.offset_xy); - if (!lcd) SERIAL_EOL(); - for (int8_t j = GRID_MAX_POINTS_Y - 1; j >= 0; j--) { - // Row Label (J index) - if (human) { - if (j < 10) SERIAL_CHAR(' '); - SERIAL_ECHO(j); - SERIAL_ECHOPGM(" |"); - } - - // Row Values (I indexes) - LOOP_L_N(i, GRID_MAX_POINTS_X) { - - // Opening Brace or Space - const bool is_current = i == curr.x && j == curr.y; - if (human) SERIAL_CHAR(is_current ? '[' : ' '); - - // Z Value at current I, J - const float f = z_values[i][j]; - if (lcd) { - // TODO: Display on Graphical LCD - } - else if (isnan(f)) - serialprintPGM(human ? PSTR(" . ") : PSTR("NAN")); - else if (human || csv) { - if (human && f >= 0.0) SERIAL_CHAR(f > 0 ? '+' : ' '); // Display sign also for positive numbers (' ' for 0) - SERIAL_ECHO_F(f, 3); // Positive: 5 digits, Negative: 6 digits - } - if (csv && i < GRID_MAX_POINTS_X - 1) SERIAL_CHAR('\t'); - - // Closing Brace or Space - if (human) SERIAL_CHAR(is_current ? ']' : ' '); - - SERIAL_FLUSHTX(); - idle_no_sleep(); - } - if (!lcd) SERIAL_EOL(); - - // A blank line between rows (unless compact) - if (j && human && !comp) SERIAL_ECHOLNPGM(" |"); - } - - if (human) { - serial_echo_column_labels(eachsp - 2); - SERIAL_EOL(); - serial_echo_xy(4, MESH_MIN_X, MESH_MIN_Y); - serial_echo_xy(twixt, MESH_MAX_X, MESH_MIN_Y); - SERIAL_EOL(); - SERIAL_EOL(); - } - - gcode.set_autoreport_paused(was); + // A blank line between rows (unless compact) + if (j && human && !comp) SERIAL_ECHOLNPGM(" |"); } - bool unified_bed_leveling::sanity_check() { - uint8_t error_flag = 0; - - if (settings.calc_num_meshes() < 1) { - SERIAL_ECHOLNPGM("?Mesh too big for EEPROM."); - error_flag++; - } - - return !!error_flag; + if (human) { + serial_echo_column_labels(eachsp - 2); + SERIAL_EOL(); + serial_echo_xy(4, MESH_MIN_X, MESH_MIN_Y); + serial_echo_xy(twixt, MESH_MAX_X, MESH_MIN_Y); + SERIAL_EOL(); + SERIAL_EOL(); } + gcode.set_autoreport_paused(was); +} + +bool unified_bed_leveling::sanity_check() { + uint8_t error_flag = 0; + + if (settings.calc_num_meshes() < 1) { + SERIAL_ECHOLNPGM("?Mesh too big for EEPROM."); + error_flag++; + } + + return !!error_flag; +} + #endif // AUTO_BED_LEVELING_UBL diff --git a/Marlin/src/feature/bedlevel/ubl/ubl.h b/Marlin/src/feature/bedlevel/ubl/ubl.h index 876063c878..d5da43a6a2 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl.h +++ b/Marlin/src/feature/bedlevel/ubl/ubl.h @@ -46,275 +46,275 @@ struct mesh_index_pair; #endif class unified_bed_leveling { - private: +private: - static int g29_verbose_level, - g29_phase_value, - g29_repetition_cnt, - g29_storage_slot, - g29_map_type; - static bool g29_c_flag; - static float g29_card_thickness, - g29_constant; - static xy_pos_t g29_pos; - static xy_bool_t xy_seen; + static int g29_verbose_level, + g29_phase_value, + g29_repetition_cnt, + g29_storage_slot, + g29_map_type; + static bool g29_c_flag; + static float g29_card_thickness, + g29_constant; + static xy_pos_t g29_pos; + static xy_bool_t xy_seen; - #if HAS_BED_PROBE - static int g29_grid_size; - #endif + #if HAS_BED_PROBE + static int g29_grid_size; + #endif - #if IS_NEWPANEL - static void move_z_with_encoder(const float &multiplier); - static float measure_point_with_encoder(); - static float measure_business_card_thickness(); - static void manually_probe_remaining_mesh(const xy_pos_t&, const float&, const float&, const bool) _O0; - static void fine_tune_mesh(const xy_pos_t &pos, const bool do_ubl_mesh_map) _O0; - #endif + #if IS_NEWPANEL + static void move_z_with_encoder(const float &multiplier); + static float measure_point_with_encoder(); + static float measure_business_card_thickness(); + static void manually_probe_remaining_mesh(const xy_pos_t&, const float&, const float&, const bool) _O0; + static void fine_tune_mesh(const xy_pos_t &pos, const bool do_ubl_mesh_map) _O0; + #endif - static bool g29_parameter_parsing() _O0; - static void shift_mesh_height(); - static void probe_entire_mesh(const xy_pos_t &near, const bool do_ubl_mesh_map, const bool stow_probe, const bool do_furthest) _O0; - static void tilt_mesh_based_on_3pts(const float &z1, const float &z2, const float &z3); - static void tilt_mesh_based_on_probed_grid(const bool do_ubl_mesh_map); - static bool smart_fill_one(const uint8_t x, const uint8_t y, const int8_t xdir, const int8_t ydir); - static inline bool smart_fill_one(const xy_uint8_t &pos, const xy_uint8_t &dir) { - return smart_fill_one(pos.x, pos.y, dir.x, dir.y); - } - static void smart_fill_mesh(); + static bool g29_parameter_parsing() _O0; + static void shift_mesh_height(); + static void probe_entire_mesh(const xy_pos_t &near, const bool do_ubl_mesh_map, const bool stow_probe, const bool do_furthest) _O0; + static void tilt_mesh_based_on_3pts(const float &z1, const float &z2, const float &z3); + static void tilt_mesh_based_on_probed_grid(const bool do_ubl_mesh_map); + static bool smart_fill_one(const uint8_t x, const uint8_t y, const int8_t xdir, const int8_t ydir); + static inline bool smart_fill_one(const xy_uint8_t &pos, const xy_uint8_t &dir) { + return smart_fill_one(pos.x, pos.y, dir.x, dir.y); + } + static void smart_fill_mesh(); - #if ENABLED(UBL_DEVEL_DEBUGGING) - static void g29_what_command(); - static void g29_eeprom_dump(); - static void g29_compare_current_mesh_to_stored_mesh(); - #endif + #if ENABLED(UBL_DEVEL_DEBUGGING) + static void g29_what_command(); + static void g29_eeprom_dump(); + static void g29_compare_current_mesh_to_stored_mesh(); + #endif - public: +public: - static void echo_name(); - static void report_current_mesh(); - static void report_state(); - static void save_ubl_active_state_and_disable(); - static void restore_ubl_active_state_and_leave(); - static void display_map(const int) _O0; - static mesh_index_pair find_closest_mesh_point_of_type(const MeshPointType, const xy_pos_t&, const bool=false, MeshFlags *done_flags=nullptr) _O0; - static mesh_index_pair find_furthest_invalid_mesh_point() _O0; - static void reset(); - static void invalidate(); - static void set_all_mesh_points_to_value(const float value); - static void adjust_mesh_to_mean(const bool cflag, const float value); - static bool sanity_check(); + static void echo_name(); + static void report_current_mesh(); + static void report_state(); + static void save_ubl_active_state_and_disable(); + static void restore_ubl_active_state_and_leave(); + static void display_map(const int) _O0; + static mesh_index_pair find_closest_mesh_point_of_type(const MeshPointType, const xy_pos_t&, const bool=false, MeshFlags *done_flags=nullptr) _O0; + static mesh_index_pair find_furthest_invalid_mesh_point() _O0; + static void reset(); + static void invalidate(); + static void set_all_mesh_points_to_value(const float value); + static void adjust_mesh_to_mean(const bool cflag, const float value); + static bool sanity_check(); - static void G29() _O0; // O0 for no optimization - static void smart_fill_wlsf(const float &) _O2; // O2 gives smaller code than Os on A2560 + static void G29() _O0; // O0 for no optimization + static void smart_fill_wlsf(const float &) _O2; // O2 gives smaller code than Os on A2560 - static int8_t storage_slot; + static int8_t storage_slot; - static bed_mesh_t z_values; - #if ENABLED(OPTIMIZED_MESH_STORAGE) - static void set_store_from_mesh(const bed_mesh_t &in_values, mesh_store_t &stored_values); - static void set_mesh_from_store(const mesh_store_t &stored_values, bed_mesh_t &out_values); - #endif - static const float _mesh_index_to_xpos[GRID_MAX_POINTS_X], - _mesh_index_to_ypos[GRID_MAX_POINTS_Y]; + static bed_mesh_t z_values; + #if ENABLED(OPTIMIZED_MESH_STORAGE) + static void set_store_from_mesh(const bed_mesh_t &in_values, mesh_store_t &stored_values); + static void set_mesh_from_store(const mesh_store_t &stored_values, bed_mesh_t &out_values); + #endif + static const float _mesh_index_to_xpos[GRID_MAX_POINTS_X], + _mesh_index_to_ypos[GRID_MAX_POINTS_Y]; - #if HAS_LCD_MENU - static bool lcd_map_control; - static void steppers_were_disabled(); - #else - static inline void steppers_were_disabled() {} - #endif + #if HAS_LCD_MENU + static bool lcd_map_control; + static void steppers_were_disabled(); + #else + static inline void steppers_were_disabled() {} + #endif - static volatile int16_t encoder_diff; // Volatile because buttons may changed it at interrupt time + static volatile int16_t encoder_diff; // Volatile because buttons may changed it at interrupt time - unified_bed_leveling(); + unified_bed_leveling(); - FORCE_INLINE static void set_z(const int8_t px, const int8_t py, const float &z) { z_values[px][py] = z; } + FORCE_INLINE static void set_z(const int8_t px, const int8_t py, const float &z) { z_values[px][py] = z; } - static int8_t cell_index_x_raw(const float &x) { - return FLOOR((x - (MESH_MIN_X)) * RECIPROCAL(MESH_X_DIST)); + static int8_t cell_index_x_raw(const float &x) { + return FLOOR((x - (MESH_MIN_X)) * RECIPROCAL(MESH_X_DIST)); + } + + static int8_t cell_index_y_raw(const float &y) { + return FLOOR((y - (MESH_MIN_Y)) * RECIPROCAL(MESH_Y_DIST)); + } + + static int8_t cell_index_x_valid(const float &x) { + return WITHIN(cell_index_x_raw(x), 0, (GRID_MAX_POINTS_X - 2)); + } + + static int8_t cell_index_y_valid(const float &y) { + return WITHIN(cell_index_y_raw(y), 0, (GRID_MAX_POINTS_Y - 2)); + } + + static int8_t cell_index_x(const float &x) { + return constrain(cell_index_x_raw(x), 0, (GRID_MAX_POINTS_X) - 2); + } + + static int8_t cell_index_y(const float &y) { + return constrain(cell_index_y_raw(y), 0, (GRID_MAX_POINTS_Y) - 2); + } + + static inline xy_int8_t cell_indexes(const float &x, const float &y) { + return { cell_index_x(x), cell_index_y(y) }; + } + static inline xy_int8_t cell_indexes(const xy_pos_t &xy) { return cell_indexes(xy.x, xy.y); } + + static int8_t closest_x_index(const float &x) { + const int8_t px = (x - (MESH_MIN_X) + (MESH_X_DIST) * 0.5) * RECIPROCAL(MESH_X_DIST); + return WITHIN(px, 0, GRID_MAX_POINTS_X - 1) ? px : -1; + } + static int8_t closest_y_index(const float &y) { + const int8_t py = (y - (MESH_MIN_Y) + (MESH_Y_DIST) * 0.5) * RECIPROCAL(MESH_Y_DIST); + return WITHIN(py, 0, GRID_MAX_POINTS_Y - 1) ? py : -1; + } + static inline xy_int8_t closest_indexes(const xy_pos_t &xy) { + return { closest_x_index(xy.x), closest_y_index(xy.y) }; + } + + /** + * z2 --| + * z0 | | + * | | + (z2-z1) + * z1 | | | + * ---+-------------+--------+-- --| + * a1 a0 a2 + * |<---delta_a---------->| + * + * calc_z0 is the basis for all the Mesh Based correction. It is used to + * find the expected Z Height at a position between two known Z-Height locations. + * + * It is fairly expensive with its 4 floating point additions and 2 floating point + * multiplications. + */ + FORCE_INLINE static float calc_z0(const float &a0, const float &a1, const float &z1, const float &a2, const float &z2) { + return z1 + (z2 - z1) * (a0 - a1) / (a2 - a1); + } + + #ifdef UBL_Z_RAISE_WHEN_OFF_MESH + #define _UBL_OUTER_Z_RAISE UBL_Z_RAISE_WHEN_OFF_MESH + #else + #define _UBL_OUTER_Z_RAISE NAN + #endif + + /** + * z_correction_for_x_on_horizontal_mesh_line is an optimization for + * the case where the printer is making a vertical line that only crosses horizontal mesh lines. + */ + static inline float z_correction_for_x_on_horizontal_mesh_line(const float &rx0, const int x1_i, const int yi) { + if (!WITHIN(x1_i, 0, GRID_MAX_POINTS_X - 1) || !WITHIN(yi, 0, GRID_MAX_POINTS_Y - 1)) { + + if (DEBUGGING(LEVELING)) { + if (WITHIN(x1_i, 0, GRID_MAX_POINTS_X - 1)) DEBUG_ECHOPGM("yi"); else DEBUG_ECHOPGM("x1_i"); + DEBUG_ECHOLNPAIR(" out of bounds in z_correction_for_x_on_horizontal_mesh_line(rx0=", rx0, ",x1_i=", x1_i, ",yi=", yi, ")"); + } + + // The requested location is off the mesh. Return UBL_Z_RAISE_WHEN_OFF_MESH or NAN. + return _UBL_OUTER_Z_RAISE; } - static int8_t cell_index_y_raw(const float &y) { - return FLOOR((y - (MESH_MIN_Y)) * RECIPROCAL(MESH_Y_DIST)); + const float xratio = (rx0 - mesh_index_to_xpos(x1_i)) * RECIPROCAL(MESH_X_DIST), + z1 = z_values[x1_i][yi]; + + return z1 + xratio * (z_values[_MIN(x1_i, GRID_MAX_POINTS_X - 2) + 1][yi] - z1); // Don't allow x1_i+1 to be past the end of the array + // If it is, it is clamped to the last element of the + // z_values[][] array and no correction is applied. + } + + // + // See comments above for z_correction_for_x_on_horizontal_mesh_line + // + static inline float z_correction_for_y_on_vertical_mesh_line(const float &ry0, const int xi, const int y1_i) { + if (!WITHIN(xi, 0, GRID_MAX_POINTS_X - 1) || !WITHIN(y1_i, 0, GRID_MAX_POINTS_Y - 1)) { + + if (DEBUGGING(LEVELING)) { + if (WITHIN(xi, 0, GRID_MAX_POINTS_X - 1)) DEBUG_ECHOPGM("y1_i"); else DEBUG_ECHOPGM("xi"); + DEBUG_ECHOLNPAIR(" out of bounds in z_correction_for_y_on_vertical_mesh_line(ry0=", ry0, ", xi=", xi, ", y1_i=", y1_i, ")"); + } + + // The requested location is off the mesh. Return UBL_Z_RAISE_WHEN_OFF_MESH or NAN. + return _UBL_OUTER_Z_RAISE; } - static int8_t cell_index_x_valid(const float &x) { - return WITHIN(cell_index_x_raw(x), 0, (GRID_MAX_POINTS_X - 2)); - } + const float yratio = (ry0 - mesh_index_to_ypos(y1_i)) * RECIPROCAL(MESH_Y_DIST), + z1 = z_values[xi][y1_i]; - static int8_t cell_index_y_valid(const float &y) { - return WITHIN(cell_index_y_raw(y), 0, (GRID_MAX_POINTS_Y - 2)); - } + return z1 + yratio * (z_values[xi][_MIN(y1_i, GRID_MAX_POINTS_Y - 2) + 1] - z1); // Don't allow y1_i+1 to be past the end of the array + // If it is, it is clamped to the last element of the + // z_values[][] array and no correction is applied. + } - static int8_t cell_index_x(const float &x) { - return constrain(cell_index_x_raw(x), 0, (GRID_MAX_POINTS_X) - 2); - } - - static int8_t cell_index_y(const float &y) { - return constrain(cell_index_y_raw(y), 0, (GRID_MAX_POINTS_Y) - 2); - } - - static inline xy_int8_t cell_indexes(const float &x, const float &y) { - return { cell_index_x(x), cell_index_y(y) }; - } - static inline xy_int8_t cell_indexes(const xy_pos_t &xy) { return cell_indexes(xy.x, xy.y); } - - static int8_t closest_x_index(const float &x) { - const int8_t px = (x - (MESH_MIN_X) + (MESH_X_DIST) * 0.5) * RECIPROCAL(MESH_X_DIST); - return WITHIN(px, 0, GRID_MAX_POINTS_X - 1) ? px : -1; - } - static int8_t closest_y_index(const float &y) { - const int8_t py = (y - (MESH_MIN_Y) + (MESH_Y_DIST) * 0.5) * RECIPROCAL(MESH_Y_DIST); - return WITHIN(py, 0, GRID_MAX_POINTS_Y - 1) ? py : -1; - } - static inline xy_int8_t closest_indexes(const xy_pos_t &xy) { - return { closest_x_index(xy.x), closest_y_index(xy.y) }; - } + /** + * This is the generic Z-Correction. It works anywhere within a Mesh Cell. It first + * does a linear interpolation along both of the bounding X-Mesh-Lines to find the + * Z-Height at both ends. Then it does a linear interpolation of these heights based + * on the Y position within the cell. + */ + static float get_z_correction(const float &rx0, const float &ry0) { + const int8_t cx = cell_index_x(rx0), cy = cell_index_y(ry0); // return values are clamped /** - * z2 --| - * z0 | | - * | | + (z2-z1) - * z1 | | | - * ---+-------------+--------+-- --| - * a1 a0 a2 - * |<---delta_a---------->| - * - * calc_z0 is the basis for all the Mesh Based correction. It is used to - * find the expected Z Height at a position between two known Z-Height locations. - * - * It is fairly expensive with its 4 floating point additions and 2 floating point - * multiplications. + * Check if the requested location is off the mesh. If so, and + * UBL_Z_RAISE_WHEN_OFF_MESH is specified, that value is returned. */ - FORCE_INLINE static float calc_z0(const float &a0, const float &a1, const float &z1, const float &a2, const float &z2) { - return z1 + (z2 - z1) * (a0 - a1) / (a2 - a1); - } - #ifdef UBL_Z_RAISE_WHEN_OFF_MESH - #define _UBL_OUTER_Z_RAISE UBL_Z_RAISE_WHEN_OFF_MESH - #else - #define _UBL_OUTER_Z_RAISE NAN + if (!WITHIN(rx0, MESH_MIN_X, MESH_MAX_X) || !WITHIN(ry0, MESH_MIN_Y, MESH_MAX_Y)) + return UBL_Z_RAISE_WHEN_OFF_MESH; #endif - /** - * z_correction_for_x_on_horizontal_mesh_line is an optimization for - * the case where the printer is making a vertical line that only crosses horizontal mesh lines. - */ - static inline float z_correction_for_x_on_horizontal_mesh_line(const float &rx0, const int x1_i, const int yi) { - if (!WITHIN(x1_i, 0, GRID_MAX_POINTS_X - 1) || !WITHIN(yi, 0, GRID_MAX_POINTS_Y - 1)) { + const float z1 = calc_z0(rx0, + mesh_index_to_xpos(cx), z_values[cx][cy], + mesh_index_to_xpos(cx + 1), z_values[_MIN(cx, GRID_MAX_POINTS_X - 2) + 1][cy]); - if (DEBUGGING(LEVELING)) { - if (WITHIN(x1_i, 0, GRID_MAX_POINTS_X - 1)) DEBUG_ECHOPGM("yi"); else DEBUG_ECHOPGM("x1_i"); - DEBUG_ECHOLNPAIR(" out of bounds in z_correction_for_x_on_horizontal_mesh_line(rx0=", rx0, ",x1_i=", x1_i, ",yi=", yi, ")"); - } + const float z2 = calc_z0(rx0, + mesh_index_to_xpos(cx), z_values[cx][_MIN(cy, GRID_MAX_POINTS_Y - 2) + 1], + mesh_index_to_xpos(cx + 1), z_values[_MIN(cx, GRID_MAX_POINTS_X - 2) + 1][_MIN(cy, GRID_MAX_POINTS_Y - 2) + 1]); - // The requested location is off the mesh. Return UBL_Z_RAISE_WHEN_OFF_MESH or NAN. - return _UBL_OUTER_Z_RAISE; - } + float z0 = calc_z0(ry0, + mesh_index_to_ypos(cy), z1, + mesh_index_to_ypos(cy + 1), z2); - const float xratio = (rx0 - mesh_index_to_xpos(x1_i)) * RECIPROCAL(MESH_X_DIST), - z1 = z_values[x1_i][yi]; - - return z1 + xratio * (z_values[_MIN(x1_i, GRID_MAX_POINTS_X - 2) + 1][yi] - z1); // Don't allow x1_i+1 to be past the end of the array - // If it is, it is clamped to the last element of the - // z_values[][] array and no correction is applied. + if (DEBUGGING(MESH_ADJUST)) { + DEBUG_ECHOPAIR(" raw get_z_correction(", rx0); + DEBUG_CHAR(','); DEBUG_ECHO(ry0); + DEBUG_ECHOPAIR_F(") = ", z0, 6); + DEBUG_ECHOLNPAIR_F(" >>>---> ", z0, 6); } - // - // See comments above for z_correction_for_x_on_horizontal_mesh_line - // - static inline float z_correction_for_y_on_vertical_mesh_line(const float &ry0, const int xi, const int y1_i) { - if (!WITHIN(xi, 0, GRID_MAX_POINTS_X - 1) || !WITHIN(y1_i, 0, GRID_MAX_POINTS_Y - 1)) { - - if (DEBUGGING(LEVELING)) { - if (WITHIN(xi, 0, GRID_MAX_POINTS_X - 1)) DEBUG_ECHOPGM("y1_i"); else DEBUG_ECHOPGM("xi"); - DEBUG_ECHOLNPAIR(" out of bounds in z_correction_for_y_on_vertical_mesh_line(ry0=", ry0, ", xi=", xi, ", y1_i=", y1_i, ")"); - } - - // The requested location is off the mesh. Return UBL_Z_RAISE_WHEN_OFF_MESH or NAN. - return _UBL_OUTER_Z_RAISE; - } - - const float yratio = (ry0 - mesh_index_to_ypos(y1_i)) * RECIPROCAL(MESH_Y_DIST), - z1 = z_values[xi][y1_i]; - - return z1 + yratio * (z_values[xi][_MIN(y1_i, GRID_MAX_POINTS_Y - 2) + 1] - z1); // Don't allow y1_i+1 to be past the end of the array - // If it is, it is clamped to the last element of the - // z_values[][] array and no correction is applied. - } - - /** - * This is the generic Z-Correction. It works anywhere within a Mesh Cell. It first - * does a linear interpolation along both of the bounding X-Mesh-Lines to find the - * Z-Height at both ends. Then it does a linear interpolation of these heights based - * on the Y position within the cell. - */ - static float get_z_correction(const float &rx0, const float &ry0) { - const int8_t cx = cell_index_x(rx0), cy = cell_index_y(ry0); // return values are clamped - - /** - * Check if the requested location is off the mesh. If so, and - * UBL_Z_RAISE_WHEN_OFF_MESH is specified, that value is returned. - */ - #ifdef UBL_Z_RAISE_WHEN_OFF_MESH - if (!WITHIN(rx0, MESH_MIN_X, MESH_MAX_X) || !WITHIN(ry0, MESH_MIN_Y, MESH_MAX_Y)) - return UBL_Z_RAISE_WHEN_OFF_MESH; - #endif - - const float z1 = calc_z0(rx0, - mesh_index_to_xpos(cx), z_values[cx][cy], - mesh_index_to_xpos(cx + 1), z_values[_MIN(cx, GRID_MAX_POINTS_X - 2) + 1][cy]); - - const float z2 = calc_z0(rx0, - mesh_index_to_xpos(cx), z_values[cx][_MIN(cy, GRID_MAX_POINTS_Y - 2) + 1], - mesh_index_to_xpos(cx + 1), z_values[_MIN(cx, GRID_MAX_POINTS_X - 2) + 1][_MIN(cy, GRID_MAX_POINTS_Y - 2) + 1]); - - float z0 = calc_z0(ry0, - mesh_index_to_ypos(cy), z1, - mesh_index_to_ypos(cy + 1), z2); + if (isnan(z0)) { // if part of the Mesh is undefined, it will show up as NAN + z0 = 0.0; // in ubl.z_values[][] and propagate through the + // calculations. If our correction is NAN, we throw it out + // because part of the Mesh is undefined and we don't have the + // information we need to complete the height correction. if (DEBUGGING(MESH_ADJUST)) { - DEBUG_ECHOPAIR(" raw get_z_correction(", rx0); - DEBUG_CHAR(','); DEBUG_ECHO(ry0); - DEBUG_ECHOPAIR_F(") = ", z0, 6); - DEBUG_ECHOLNPAIR_F(" >>>---> ", z0, 6); + DEBUG_ECHOPAIR("??? Yikes! NAN in get_z_correction(", rx0); + DEBUG_CHAR(','); + DEBUG_ECHO(ry0); + DEBUG_CHAR(')'); + DEBUG_EOL(); } - - if (isnan(z0)) { // if part of the Mesh is undefined, it will show up as NAN - z0 = 0.0; // in ubl.z_values[][] and propagate through the - // calculations. If our correction is NAN, we throw it out - // because part of the Mesh is undefined and we don't have the - // information we need to complete the height correction. - - if (DEBUGGING(MESH_ADJUST)) { - DEBUG_ECHOPAIR("??? Yikes! NAN in get_z_correction(", rx0); - DEBUG_CHAR(','); - DEBUG_ECHO(ry0); - DEBUG_CHAR(')'); - DEBUG_EOL(); - } - } - return z0; } - static inline float get_z_correction(const xy_pos_t &pos) { return get_z_correction(pos.x, pos.y); } + return z0; + } + static inline float get_z_correction(const xy_pos_t &pos) { return get_z_correction(pos.x, pos.y); } - static inline float mesh_index_to_xpos(const uint8_t i) { - return i < GRID_MAX_POINTS_X ? pgm_read_float(&_mesh_index_to_xpos[i]) : MESH_MIN_X + i * (MESH_X_DIST); - } - static inline float mesh_index_to_ypos(const uint8_t i) { - return i < GRID_MAX_POINTS_Y ? pgm_read_float(&_mesh_index_to_ypos[i]) : MESH_MIN_Y + i * (MESH_Y_DIST); - } + static inline float mesh_index_to_xpos(const uint8_t i) { + return i < GRID_MAX_POINTS_X ? pgm_read_float(&_mesh_index_to_xpos[i]) : MESH_MIN_X + i * (MESH_X_DIST); + } + static inline float mesh_index_to_ypos(const uint8_t i) { + return i < GRID_MAX_POINTS_Y ? pgm_read_float(&_mesh_index_to_ypos[i]) : MESH_MIN_Y + i * (MESH_Y_DIST); + } - #if UBL_SEGMENTED - static bool line_to_destination_segmented(const feedRate_t &scaled_fr_mm_s); - #else - static void line_to_destination_cartesian(const feedRate_t &scaled_fr_mm_s, const uint8_t e); - #endif + #if UBL_SEGMENTED + static bool line_to_destination_segmented(const feedRate_t &scaled_fr_mm_s); + #else + static void line_to_destination_cartesian(const feedRate_t &scaled_fr_mm_s, const uint8_t e); + #endif - static inline bool mesh_is_valid() { - GRID_LOOP(x, y) if (isnan(z_values[x][y])) return false; - return true; - } + static inline bool mesh_is_valid() { + GRID_LOOP(x, y) if (isnan(z_values[x][y])) return false; + return true; + } }; // class unified_bed_leveling diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp index 36acc96d6e..9bd7f63a7e 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp @@ -24,1760 +24,1760 @@ #if ENABLED(AUTO_BED_LEVELING_UBL) - #include "../bedlevel.h" +#include "../bedlevel.h" - #include "../../../MarlinCore.h" - #include "../../../HAL/shared/eeprom_api.h" - #include "../../../libs/hex_print.h" - #include "../../../module/settings.h" - #include "../../../lcd/marlinui.h" - #include "../../../module/stepper.h" - #include "../../../module/planner.h" - #include "../../../module/motion.h" - #include "../../../module/probe.h" - #include "../../../gcode/gcode.h" - #include "../../../libs/least_squares_fit.h" +#include "../../../MarlinCore.h" +#include "../../../HAL/shared/eeprom_api.h" +#include "../../../libs/hex_print.h" +#include "../../../module/settings.h" +#include "../../../lcd/marlinui.h" +#include "../../../module/stepper.h" +#include "../../../module/planner.h" +#include "../../../module/motion.h" +#include "../../../module/probe.h" +#include "../../../gcode/gcode.h" +#include "../../../libs/least_squares_fit.h" - #if HAS_MULTI_HOTEND - #include "../../../module/tool_change.h" - #endif +#if HAS_MULTI_HOTEND + #include "../../../module/tool_change.h" +#endif - #define DEBUG_OUT ENABLED(DEBUG_LEVELING_FEATURE) - #include "../../../core/debug_out.h" +#define DEBUG_OUT ENABLED(DEBUG_LEVELING_FEATURE) +#include "../../../core/debug_out.h" - #if ENABLED(EXTENSIBLE_UI) - #include "../../../lcd/extui/ui_api.h" - #endif +#if ENABLED(EXTENSIBLE_UI) + #include "../../../lcd/extui/ui_api.h" +#endif - #include +#include - #define UBL_G29_P31 +#define UBL_G29_P31 - #if HAS_LCD_MENU +#if HAS_LCD_MENU - bool unified_bed_leveling::lcd_map_control = false; + bool unified_bed_leveling::lcd_map_control = false; - void unified_bed_leveling::steppers_were_disabled() { - if (lcd_map_control) { - lcd_map_control = false; - ui.defer_status_screen(false); - } + void unified_bed_leveling::steppers_were_disabled() { + if (lcd_map_control) { + lcd_map_control = false; + ui.defer_status_screen(false); } - - void ubl_map_screen(); - - #endif - - #define SIZE_OF_LITTLE_RAISE 1 - #define BIG_RAISE_NOT_NEEDED 0 - - int unified_bed_leveling::g29_verbose_level, - unified_bed_leveling::g29_phase_value, - unified_bed_leveling::g29_repetition_cnt, - unified_bed_leveling::g29_storage_slot = 0, - unified_bed_leveling::g29_map_type; - bool unified_bed_leveling::g29_c_flag; - float unified_bed_leveling::g29_card_thickness = 0, - unified_bed_leveling::g29_constant = 0; - xy_bool_t unified_bed_leveling::xy_seen; - xy_pos_t unified_bed_leveling::g29_pos; - - #if HAS_BED_PROBE - int unified_bed_leveling::g29_grid_size; - #endif - - /** - * G29: Unified Bed Leveling by Roxy - * - * Parameters understood by this leveling system: - * - * A Activate Activate the Unified Bed Leveling system. - * - * B # Business Use the 'Business Card' mode of the Manual Probe subsystem with P2. - * Note: A non-compressible Spark Gap feeler gauge is recommended over a business card. - * In this mode of G29 P2, a business or index card is used as a shim that the nozzle can - * grab onto as it is lowered. In principle, the nozzle-bed distance is the same when the - * same resistance is felt in the shim. You can omit the numerical value on first invocation - * of G29 P2 B to measure shim thickness. Subsequent use of 'B' will apply the previously- - * measured thickness by default. - * - * C Continue G29 P1 C continues the generation of a partially-constructed Mesh without invalidating - * previous measurements. - * - * C G29 P2 C tells the Manual Probe subsystem to not use the current nozzle - * location in its search for the closest unmeasured Mesh Point. Instead, attempt to - * start at one end of the uprobed points and Continue sequentially. - * - * G29 P3 C specifies the Constant for the fill. Otherwise, uses a "reasonable" value. - * - * C Current G29 Z C uses the Current location (instead of bed center or nearest edge). - * - * D Disable Disable the Unified Bed Leveling system. - * - * E Stow_probe Stow the probe after each sampled point. - * - * F # Fade Fade the amount of Mesh Based Compensation over a specified height. At the - * specified height, no correction is applied and natural printer kenimatics take over. If no - * number is specified for the command, 10mm is assumed to be reasonable. - * - * H # Height With P2, 'H' specifies the Height to raise the nozzle after each manual probe of the bed. - * If omitted, the nozzle will raise by Z_CLEARANCE_BETWEEN_PROBES. - * - * H # Offset With P4, 'H' specifies the Offset above the mesh height to place the nozzle. - * If omitted, Z_CLEARANCE_BETWEEN_PROBES will be used. - * - * I # Invalidate Invalidate the specified number of Mesh Points near the given 'X' 'Y'. If X or Y are omitted, - * the nozzle location is used. If no 'I' value is given, only the point nearest to the location - * is invalidated. Use 'T' to produce a map afterward. This command is useful to invalidate a - * portion of the Mesh so it can be adjusted using other UBL tools. When attempting to invalidate - * an isolated bad mesh point, the 'T' option shows the nozzle position in the Mesh with (#). You - * can move the nozzle around and use this feature to select the center of the area (or cell) to - * invalidate. - * - * J # Grid Perform a Grid Based Leveling of the current Mesh using a grid with n points on a side. - * Not specifying a grid size will invoke the 3-Point leveling function. - * - * L Load Load Mesh from the previously activated location in the EEPROM. - * - * L # Load Load Mesh from the specified location in the EEPROM. Set this location as activated - * for subsequent Load and Store operations. - * - * The P or Phase commands are used for the bulk of the work to setup a Mesh. In general, your Mesh will - * start off being initialized with a G29 P0 or a G29 P1. Further refinement of the Mesh happens with - * each additional Phase that processes it. - * - * P0 Phase 0 Zero Mesh Data and turn off the Mesh Compensation System. This reverts the - * 3D Printer to the same state it was in before the Unified Bed Leveling Compensation - * was turned on. Setting the entire Mesh to Zero is a special case that allows - * a subsequent G or T leveling operation for backward compatibility. - * - * P1 Phase 1 Invalidate entire Mesh and continue with automatic generation of the Mesh data using - * the Z-Probe. Usually the probe can't reach all areas that the nozzle can reach. For delta - * printers only the areas where the probe and nozzle can both reach will be automatically probed. - * - * Unreachable points will be handled in Phase 2 and Phase 3. - * - * Use 'C' to leave the previous mesh intact and automatically probe needed points. This allows you - * to invalidate parts of the Mesh but still use Automatic Probing. - * - * The 'X' and 'Y' parameters prioritize where to try and measure points. If omitted, the current - * probe position is used. - * - * Use 'T' (Topology) to generate a report of mesh generation. - * - * P1 will suspend Mesh generation if the controller button is held down. Note that you may need - * to press and hold the switch for several seconds if moves are underway. - * - * P2 Phase 2 Probe unreachable points. - * - * Use 'H' to set the height between Mesh points. If omitted, Z_CLEARANCE_BETWEEN_PROBES is used. - * Smaller values will be quicker. Move the nozzle down till it barely touches the bed. Make sure the - * nozzle is clean and unobstructed. Use caution and move slowly. This can damage your printer! - * (Uses SIZE_OF_LITTLE_RAISE mm if the nozzle is moving less than BIG_RAISE_NOT_NEEDED mm.) - * - * The 'H' value can be negative if the Mesh dips in a large area. Press and hold the - * controller button to terminate the current Phase 2 command. You can then re-issue "G29 P 2" - * with an 'H' parameter more suitable for the area you're manually probing. Note that the command - * tries to start in a corner of the bed where movement will be predictable. Override the distance - * calculation location with the X and Y parameters. You can print a Mesh Map (G29 T) to see where - * the mesh is invalidated and where the nozzle needs to move to complete the command. Use 'C' to - * indicate that the search should be based on the current position. - * - * The 'B' parameter for this command is described above. It places the manual probe subsystem into - * Business Card mode where the thickness of a business card is measured and then used to accurately - * set the nozzle height in all manual probing for the duration of the command. A Business card can - * be used, but you'll get better results with a flexible Shim that doesn't compress. This makes it - * easier to produce similar amounts of force and get more accurate measurements. Google if you're - * not sure how to use a shim. - * - * The 'T' (Map) parameter helps track Mesh building progress. - * - * NOTE: P2 requires an LCD controller! - * - * P3 Phase 3 Fill the unpopulated regions of the Mesh with a fixed value. There are two different paths to - * go down: - * - * - If a 'C' constant is specified, the closest invalid mesh points to the nozzle will be filled, - * and a repeat count can then also be specified with 'R'. - * - * - Leaving out 'C' invokes Smart Fill, which scans the mesh from the edges inward looking for - * invalid mesh points. Adjacent points are used to determine the bed slope. If the bed is sloped - * upward from the invalid point, it takes the value of the nearest point. If sloped downward, it's - * replaced by a value that puts all three points in a line. This version of G29 P3 is a quick, easy - * and (usually) safe way to populate unprobed mesh regions before continuing to G26 Mesh Validation - * Pattern. Note that this populates the mesh with unverified values. Pay attention and use caution. - * - * P4 Phase 4 Fine tune the Mesh. The Delta Mesh Compensation System assumes the existence of - * an LCD Panel. It is possible to fine tune the mesh without an LCD Panel using - * G42 and M421. See the UBL documentation for further details. - * - * Phase 4 is meant to be used with G26 Mesh Validation to fine tune the mesh by direct editing - * of Mesh Points. Raise and lower points to fine tune the mesh until it gives consistently reliable - * adhesion. - * - * P4 moves to the closest Mesh Point (and/or the given X Y), raises the nozzle above the mesh height - * by the given 'H' offset (or default 0), and waits while the controller is used to adjust the nozzle - * height. On click the displayed height is saved in the mesh. - * - * Start Phase 4 at a specific location with X and Y. Adjust a specific number of Mesh Points with - * the 'R' (Repeat) parameter. (If 'R' is left out, the whole matrix is assumed.) This command can be - * terminated early (e.g., after editing the area of interest) by pressing and holding the encoder button. - * - * The general form is G29 P4 [R points] [X position] [Y position] - * - * The H [offset] parameter is useful if a shim is used to fine-tune the mesh. For a 0.4mm shim the - * command would be G29 P4 H0.4. The nozzle is moved to the shim height, you adjust height to the shim, - * and on click the height minus the shim thickness will be saved in the mesh. - * - * !!Use with caution, as a very poor mesh could cause the nozzle to crash into the bed!! - * - * NOTE: P4 is not available unless you have LCD support enabled! - * - * P5 Phase 5 Find Mean Mesh Height and Standard Deviation. Typically, it is easier to use and - * work with the Mesh if it is Mean Adjusted. You can specify a C parameter to - * Correct the Mesh to a 0.00 Mean Height. Adding a C parameter will automatically - * execute a G29 P6 C . - * - * P6 Phase 6 Shift Mesh height. The entire Mesh's height is adjusted by the height specified - * with the C parameter. Being able to adjust the height of a Mesh is useful tool. It - * can be used to compensate for poorly calibrated Z-Probes and other errors. Ideally, - * you should have the Mesh adjusted for a Mean Height of 0.00 and the Z-Probe measuring - * 0.000 at the Z Home location. - * - * Q Test Load specified Test Pattern to assist in checking correct operation of system. This - * command is not anticipated to be of much value to the typical user. It is intended - * for developers to help them verify correct operation of the Unified Bed Leveling System. - * - * R # Repeat Repeat this command the specified number of times. If no number is specified the - * command will be repeated GRID_MAX_POINTS_X * GRID_MAX_POINTS_Y times. - * - * S Store Store the current Mesh in the Activated area of the EEPROM. It will also store the - * current state of the Unified Bed Leveling system in the EEPROM. - * - * S # Store Store the current Mesh at the specified location in EEPROM. Activate this location - * for subsequent Load and Store operations. Valid storage slot numbers begin at 0 and - * extend to a limit related to the available EEPROM storage. - * - * S -1 Store Print the current Mesh as G-code that can be used to restore the mesh anytime. - * - * T Topology Display the Mesh Map Topology. - * 'T' can be used alone (e.g., G29 T) or in combination with most of the other commands. - * This option works with all Phase commands (e.g., G29 P4 R 5 T X 50 Y100 C -.1 O) - * This parameter can also specify a Map Type. T0 (the default) is user-readable. T1 - * is suitable to paste into a spreadsheet for a 3D graph of the mesh. - * - * U Unlevel Perform a probe of the outer perimeter to assist in physically leveling unlevel beds. - * Only used for G29 P1 T U. This speeds up the probing of the edge of the bed. Useful - * when the entire bed doesn't need to be probed because it will be adjusted. - * - * V # Verbosity Set the verbosity level (0-4) for extra details. (Default 0) - * - * X # X Location for this command - * - * Y # Y Location for this command - * - * With UBL_DEVEL_DEBUGGING: - * - * K # Kompare Kompare current Mesh with stored Mesh #, replacing current Mesh with the result. - * This command literally performs a diff between two Meshes. - * - * Q-1 Dump EEPROM Dump the UBL contents stored in EEPROM as HEX format. Useful for developers to help - * verify correct operation of the UBL. - * - * W What? Display valuable UBL data. - * - * - * Release Notes: - * You MUST do M502, M500 to initialize the storage. Failure to do this will cause all - * kinds of problems. Enabling EEPROM Storage is required. - * - * When you do a G28 and G29 P1 to automatically build your first mesh, you are going to notice that - * UBL probes points increasingly further from the starting location. (The starting location defaults - * to the center of the bed.) In contrast, ABL and MBL follow a zigzag pattern. The spiral pattern is - * especially better for Delta printers, since it populates the center of the mesh first, allowing for - * a quicker test print to verify settings. You don't need to populate the entire mesh to use it. - * After all, you don't want to spend a lot of time generating a mesh only to realize the resolution - * or probe offsets are incorrect. Mesh-generation gathers points starting closest to the nozzle unless - * an (X,Y) coordinate pair is given. - * - * Unified Bed Leveling uses a lot of EEPROM storage to hold its data, and it takes some effort to get - * the mesh just right. To prevent this valuable data from being destroyed as the EEPROM structure - * evolves, UBL stores all mesh data at the end of EEPROM. - * - * UBL is founded on Edward Patel's Mesh Bed Leveling code. A big 'Thanks!' to him and the creators of - * 3-Point and Grid Based leveling. Combining their contributions we now have the functionality and - * features of all three systems combined. - */ - - void unified_bed_leveling::G29() { - - bool probe_deployed = false; - if (g29_parameter_parsing()) return; // Abort on parameter error - - const int8_t p_val = parser.intval('P', -1); - const bool may_move = p_val == 1 || p_val == 2 || p_val == 4 || parser.seen('J'); - TERN_(HAS_MULTI_HOTEND, const uint8_t old_tool_index = active_extruder); - - // Check for commands that require the printer to be homed - if (may_move) { - planner.synchronize(); - // Send 'N' to force homing before G29 (internal only) - if (axes_should_home() || parser.seen('N')) gcode.home_all_axes(); - TERN_(HAS_MULTI_HOTEND, if (active_extruder) tool_change(0)); - } - - // Invalidate Mesh Points. This command is a little bit asymmetrical because - // it directly specifies the repetition count and does not use the 'R' parameter. - if (parser.seen('I')) { - uint8_t cnt = 0; - g29_repetition_cnt = parser.has_value() ? parser.value_int() : 1; - if (g29_repetition_cnt >= GRID_MAX_POINTS) { - set_all_mesh_points_to_value(NAN); - } - else { - while (g29_repetition_cnt--) { - if (cnt > 20) { cnt = 0; idle(); } - const mesh_index_pair closest = find_closest_mesh_point_of_type(REAL, g29_pos); - const xy_int8_t &cpos = closest.pos; - if (cpos.x < 0) { - // No more REAL mesh points to invalidate, so we ASSUME the user - // meant to invalidate the ENTIRE mesh, which cannot be done with - // find_closest_mesh_point loop which only returns REAL points. - set_all_mesh_points_to_value(NAN); - SERIAL_ECHOLNPGM("Entire Mesh invalidated.\n"); - break; // No more invalid Mesh Points to populate - } - z_values[cpos.x][cpos.y] = NAN; - TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(cpos, 0.0f)); - cnt++; - } - } - SERIAL_ECHOLNPGM("Locations invalidated.\n"); - } - - if (parser.seen('Q')) { - const int test_pattern = parser.has_value() ? parser.value_int() : -99; - if (!WITHIN(test_pattern, -1, 2)) { - SERIAL_ECHOLNPGM("Invalid test_pattern value. (-1 to 2)\n"); - return; - } - SERIAL_ECHOLNPGM("Loading test_pattern values.\n"); - switch (test_pattern) { - - #if ENABLED(UBL_DEVEL_DEBUGGING) - case -1: - g29_eeprom_dump(); - break; - #endif - - case 0: - GRID_LOOP(x, y) { // Create a bowl shape similar to a poorly-calibrated Delta - const float p1 = 0.5f * (GRID_MAX_POINTS_X) - x, - p2 = 0.5f * (GRID_MAX_POINTS_Y) - y; - z_values[x][y] += 2.0f * HYPOT(p1, p2); - TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(x, y, z_values[x][y])); - } - break; - - case 1: - LOOP_L_N(x, GRID_MAX_POINTS_X) { // Create a diagonal line several Mesh cells thick that is raised - z_values[x][x] += 9.999f; - z_values[x][x + (x < (GRID_MAX_POINTS_Y) - 1) ? 1 : -1] += 9.999f; // We want the altered line several mesh points thick - #if ENABLED(EXTENSIBLE_UI) - ExtUI::onMeshUpdate(x, x, z_values[x][x]); - ExtUI::onMeshUpdate(x, (x + (x < (GRID_MAX_POINTS_Y) - 1) ? 1 : -1), z_values[x][x + (x < (GRID_MAX_POINTS_Y) - 1) ? 1 : -1]); - #endif - - } - break; - - case 2: - // Allow the user to specify the height because 10mm is a little extreme in some cases. - for (uint8_t x = (GRID_MAX_POINTS_X) / 3; x < 2 * (GRID_MAX_POINTS_X) / 3; x++) // Create a rectangular raised area in - for (uint8_t y = (GRID_MAX_POINTS_Y) / 3; y < 2 * (GRID_MAX_POINTS_Y) / 3; y++) { // the center of the bed - z_values[x][y] += parser.seen('C') ? g29_constant : 9.99f; - TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(x, y, z_values[x][y])); - } - break; - } - } - - #if HAS_BED_PROBE - - if (parser.seen('J')) { - save_ubl_active_state_and_disable(); - tilt_mesh_based_on_probed_grid(g29_grid_size == 0); // Zero size does 3-Point - restore_ubl_active_state_and_leave(); - #if ENABLED(UBL_G29_J_RECENTER) - do_blocking_move_to_xy(0.5f * ((MESH_MIN_X) + (MESH_MAX_X)), 0.5f * ((MESH_MIN_Y) + (MESH_MAX_Y))); - #endif - report_current_position(); - probe_deployed = true; - } - - #endif // HAS_BED_PROBE - - if (parser.seen('P')) { - if (WITHIN(g29_phase_value, 0, 1) && storage_slot == -1) { - storage_slot = 0; - SERIAL_ECHOLNPGM("Default storage slot 0 selected."); - } - - switch (g29_phase_value) { - case 0: - // - // Zero Mesh Data - // - reset(); - SERIAL_ECHOLNPGM("Mesh zeroed."); - break; - - #if HAS_BED_PROBE - - case 1: { - // - // Invalidate Entire Mesh and Automatically Probe Mesh in areas that can be reached by the probe - // - if (!parser.seen('C')) { - invalidate(); - SERIAL_ECHOLNPGM("Mesh invalidated. Probing mesh."); - } - if (g29_verbose_level > 1) { - SERIAL_ECHOPAIR("Probing around (", g29_pos.x); - SERIAL_CHAR(','); - SERIAL_DECIMAL(g29_pos.y); - SERIAL_ECHOLNPGM(").\n"); - } - const xy_pos_t near_probe_xy = g29_pos + probe.offset_xy; - probe_entire_mesh(near_probe_xy, parser.seen('T'), parser.seen('E'), parser.seen('U')); - - report_current_position(); - probe_deployed = true; - } break; - - #endif // HAS_BED_PROBE - - case 2: { - #if HAS_LCD_MENU - // - // Manually Probe Mesh in areas that can't be reached by the probe - // - SERIAL_ECHOLNPGM("Manually probing unreachable points."); - do_z_clearance(Z_CLEARANCE_BETWEEN_PROBES); - - if (parser.seen('C') && !xy_seen) { - - /** - * Use a good default location for the path. - * The flipped > and < operators in these comparisons is intentional. - * It should cause the probed points to follow a nice path on Cartesian printers. - * It may make sense to have Delta printers default to the center of the bed. - * Until that is decided, this can be forced with the X and Y parameters. - */ - g29_pos.set( - #if IS_KINEMATIC - X_HOME_POS, Y_HOME_POS - #else - probe.offset_xy.x > 0 ? X_BED_SIZE : 0, - probe.offset_xy.y < 0 ? Y_BED_SIZE : 0 - #endif - ); - } - - if (parser.seen('B')) { - g29_card_thickness = parser.has_value() ? parser.value_float() : measure_business_card_thickness(); - if (ABS(g29_card_thickness) > 1.5f) { - SERIAL_ECHOLNPGM("?Error in Business Card measurement."); - return; - } - probe_deployed = true; - } - - if (!position_is_reachable(g29_pos)) { - SERIAL_ECHOLNPGM("XY outside printable radius."); - return; - } - - const float height = parser.floatval('H', Z_CLEARANCE_BETWEEN_PROBES); - manually_probe_remaining_mesh(g29_pos, height, g29_card_thickness, parser.seen('T')); - - SERIAL_ECHOLNPGM("G29 P2 finished."); - - report_current_position(); - - #else - - SERIAL_ECHOLNPGM("?P2 is only available when an LCD is present."); - return; - - #endif - } break; - - case 3: { - /** - * Populate invalid mesh areas. Proceed with caution. - * Two choices are available: - * - Specify a constant with the 'C' parameter. - * - Allow 'G29 P3' to choose a 'reasonable' constant. - */ - - if (g29_c_flag) { - if (g29_repetition_cnt >= GRID_MAX_POINTS) { - set_all_mesh_points_to_value(g29_constant); - } - else { - while (g29_repetition_cnt--) { // this only populates reachable mesh points near - const mesh_index_pair closest = find_closest_mesh_point_of_type(INVALID, g29_pos); - const xy_int8_t &cpos = closest.pos; - if (cpos.x < 0) { - // No more REAL INVALID mesh points to populate, so we ASSUME - // user meant to populate ALL INVALID mesh points to value - GRID_LOOP(x, y) if (isnan(z_values[x][y])) z_values[x][y] = g29_constant; - break; // No more invalid Mesh Points to populate - } - else { - z_values[cpos.x][cpos.y] = g29_constant; - TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(cpos, g29_constant)); - } - } - } - } - else { - const float cvf = parser.value_float(); - switch ((int)TRUNC(cvf * 10.0f) - 30) { // 3.1 -> 1 - #if ENABLED(UBL_G29_P31) - case 1: { - - // P3.1 use least squares fit to fill missing mesh values - // P3.10 zero weighting for distance, all grid points equal, best fit tilted plane - // P3.11 10X weighting for nearest grid points versus farthest grid points - // P3.12 100X distance weighting - // P3.13 1000X distance weighting, approaches simple average of nearest points - - const float weight_power = (cvf - 3.10f) * 100.0f, // 3.12345 -> 2.345 - weight_factor = weight_power ? POW(10.0f, weight_power) : 0; - smart_fill_wlsf(weight_factor); - } - break; - #endif - case 0: // P3 or P3.0 - default: // and anything P3.x that's not P3.1 - smart_fill_mesh(); // Do a 'Smart' fill using nearby known values - break; - } - } - break; - } - - case 4: // Fine Tune (i.e., Edit) the Mesh - #if HAS_LCD_MENU - fine_tune_mesh(g29_pos, parser.seen('T')); - #else - SERIAL_ECHOLNPGM("?P4 is only available when an LCD is present."); - return; - #endif - break; - - case 5: adjust_mesh_to_mean(g29_c_flag, g29_constant); break; - - case 6: shift_mesh_height(); break; - } - } - - #if ENABLED(UBL_DEVEL_DEBUGGING) - - // - // Much of the 'What?' command can be eliminated. But until we are fully debugged, it is - // good to have the extra information. Soon... we prune this to just a few items - // - if (parser.seen('W')) g29_what_command(); - - // - // When we are fully debugged, this may go away. But there are some valid - // use cases for the users. So we can wait and see what to do with it. - // - - if (parser.seen('K')) // Kompare Current Mesh Data to Specified Stored Mesh - g29_compare_current_mesh_to_stored_mesh(); - - #endif // UBL_DEVEL_DEBUGGING - - - // - // Load a Mesh from the EEPROM - // - - if (parser.seen('L')) { // Load Current Mesh Data - g29_storage_slot = parser.has_value() ? parser.value_int() : storage_slot; - - int16_t a = settings.calc_num_meshes(); - - if (!a) { - SERIAL_ECHOLNPGM("?EEPROM storage not available."); - return; - } - - if (!WITHIN(g29_storage_slot, 0, a - 1)) { - SERIAL_ECHOLNPAIR("?Invalid storage slot.\n?Use 0 to ", a - 1); - return; - } - - settings.load_mesh(g29_storage_slot); - storage_slot = g29_storage_slot; - - SERIAL_ECHOLNPGM("Done."); - } - - // - // Store a Mesh in the EEPROM - // - - if (parser.seen('S')) { // Store (or Save) Current Mesh Data - g29_storage_slot = parser.has_value() ? parser.value_int() : storage_slot; - - if (g29_storage_slot == -1) // Special case, the user wants to 'Export' the mesh to the - return report_current_mesh(); // host program to be saved on the user's computer - - int16_t a = settings.calc_num_meshes(); - - if (!a) { - SERIAL_ECHOLNPGM("?EEPROM storage not available."); - goto LEAVE; - } - - if (!WITHIN(g29_storage_slot, 0, a - 1)) { - SERIAL_ECHOLNPAIR("?Invalid storage slot.\n?Use 0 to ", a - 1); - goto LEAVE; - } - - settings.store_mesh(g29_storage_slot); - storage_slot = g29_storage_slot; - - SERIAL_ECHOLNPGM("Done."); - } - - if (parser.seen('T')) - display_map(g29_map_type); - - LEAVE: - - #if HAS_LCD_MENU - ui.reset_alert_level(); - ui.quick_feedback(); - ui.reset_status(); - ui.release(); - #endif - - #ifdef Z_PROBE_END_SCRIPT - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Z Probe End Script: ", Z_PROBE_END_SCRIPT); - if (probe_deployed) { - planner.synchronize(); - gcode.process_subcommands_now_P(PSTR(Z_PROBE_END_SCRIPT)); - } - #else - UNUSED(probe_deployed); - #endif - - TERN_(HAS_MULTI_HOTEND, tool_change(old_tool_index)); - return; } - void unified_bed_leveling::adjust_mesh_to_mean(const bool cflag, const float value) { - float sum = 0; - int n = 0; - GRID_LOOP(x, y) - if (!isnan(z_values[x][y])) { - sum += z_values[x][y]; - n++; + void ubl_map_screen(); + +#endif + +#define SIZE_OF_LITTLE_RAISE 1 +#define BIG_RAISE_NOT_NEEDED 0 + +int unified_bed_leveling::g29_verbose_level, + unified_bed_leveling::g29_phase_value, + unified_bed_leveling::g29_repetition_cnt, + unified_bed_leveling::g29_storage_slot = 0, + unified_bed_leveling::g29_map_type; +bool unified_bed_leveling::g29_c_flag; +float unified_bed_leveling::g29_card_thickness = 0, + unified_bed_leveling::g29_constant = 0; +xy_bool_t unified_bed_leveling::xy_seen; +xy_pos_t unified_bed_leveling::g29_pos; + +#if HAS_BED_PROBE + int unified_bed_leveling::g29_grid_size; +#endif + +/** + * G29: Unified Bed Leveling by Roxy + * + * Parameters understood by this leveling system: + * + * A Activate Activate the Unified Bed Leveling system. + * + * B # Business Use the 'Business Card' mode of the Manual Probe subsystem with P2. + * Note: A non-compressible Spark Gap feeler gauge is recommended over a business card. + * In this mode of G29 P2, a business or index card is used as a shim that the nozzle can + * grab onto as it is lowered. In principle, the nozzle-bed distance is the same when the + * same resistance is felt in the shim. You can omit the numerical value on first invocation + * of G29 P2 B to measure shim thickness. Subsequent use of 'B' will apply the previously- + * measured thickness by default. + * + * C Continue G29 P1 C continues the generation of a partially-constructed Mesh without invalidating + * previous measurements. + * + * C G29 P2 C tells the Manual Probe subsystem to not use the current nozzle + * location in its search for the closest unmeasured Mesh Point. Instead, attempt to + * start at one end of the uprobed points and Continue sequentially. + * + * G29 P3 C specifies the Constant for the fill. Otherwise, uses a "reasonable" value. + * + * C Current G29 Z C uses the Current location (instead of bed center or nearest edge). + * + * D Disable Disable the Unified Bed Leveling system. + * + * E Stow_probe Stow the probe after each sampled point. + * + * F # Fade Fade the amount of Mesh Based Compensation over a specified height. At the + * specified height, no correction is applied and natural printer kenimatics take over. If no + * number is specified for the command, 10mm is assumed to be reasonable. + * + * H # Height With P2, 'H' specifies the Height to raise the nozzle after each manual probe of the bed. + * If omitted, the nozzle will raise by Z_CLEARANCE_BETWEEN_PROBES. + * + * H # Offset With P4, 'H' specifies the Offset above the mesh height to place the nozzle. + * If omitted, Z_CLEARANCE_BETWEEN_PROBES will be used. + * + * I # Invalidate Invalidate the specified number of Mesh Points near the given 'X' 'Y'. If X or Y are omitted, + * the nozzle location is used. If no 'I' value is given, only the point nearest to the location + * is invalidated. Use 'T' to produce a map afterward. This command is useful to invalidate a + * portion of the Mesh so it can be adjusted using other UBL tools. When attempting to invalidate + * an isolated bad mesh point, the 'T' option shows the nozzle position in the Mesh with (#). You + * can move the nozzle around and use this feature to select the center of the area (or cell) to + * invalidate. + * + * J # Grid Perform a Grid Based Leveling of the current Mesh using a grid with n points on a side. + * Not specifying a grid size will invoke the 3-Point leveling function. + * + * L Load Load Mesh from the previously activated location in the EEPROM. + * + * L # Load Load Mesh from the specified location in the EEPROM. Set this location as activated + * for subsequent Load and Store operations. + * + * The P or Phase commands are used for the bulk of the work to setup a Mesh. In general, your Mesh will + * start off being initialized with a G29 P0 or a G29 P1. Further refinement of the Mesh happens with + * each additional Phase that processes it. + * + * P0 Phase 0 Zero Mesh Data and turn off the Mesh Compensation System. This reverts the + * 3D Printer to the same state it was in before the Unified Bed Leveling Compensation + * was turned on. Setting the entire Mesh to Zero is a special case that allows + * a subsequent G or T leveling operation for backward compatibility. + * + * P1 Phase 1 Invalidate entire Mesh and continue with automatic generation of the Mesh data using + * the Z-Probe. Usually the probe can't reach all areas that the nozzle can reach. For delta + * printers only the areas where the probe and nozzle can both reach will be automatically probed. + * + * Unreachable points will be handled in Phase 2 and Phase 3. + * + * Use 'C' to leave the previous mesh intact and automatically probe needed points. This allows you + * to invalidate parts of the Mesh but still use Automatic Probing. + * + * The 'X' and 'Y' parameters prioritize where to try and measure points. If omitted, the current + * probe position is used. + * + * Use 'T' (Topology) to generate a report of mesh generation. + * + * P1 will suspend Mesh generation if the controller button is held down. Note that you may need + * to press and hold the switch for several seconds if moves are underway. + * + * P2 Phase 2 Probe unreachable points. + * + * Use 'H' to set the height between Mesh points. If omitted, Z_CLEARANCE_BETWEEN_PROBES is used. + * Smaller values will be quicker. Move the nozzle down till it barely touches the bed. Make sure the + * nozzle is clean and unobstructed. Use caution and move slowly. This can damage your printer! + * (Uses SIZE_OF_LITTLE_RAISE mm if the nozzle is moving less than BIG_RAISE_NOT_NEEDED mm.) + * + * The 'H' value can be negative if the Mesh dips in a large area. Press and hold the + * controller button to terminate the current Phase 2 command. You can then re-issue "G29 P 2" + * with an 'H' parameter more suitable for the area you're manually probing. Note that the command + * tries to start in a corner of the bed where movement will be predictable. Override the distance + * calculation location with the X and Y parameters. You can print a Mesh Map (G29 T) to see where + * the mesh is invalidated and where the nozzle needs to move to complete the command. Use 'C' to + * indicate that the search should be based on the current position. + * + * The 'B' parameter for this command is described above. It places the manual probe subsystem into + * Business Card mode where the thickness of a business card is measured and then used to accurately + * set the nozzle height in all manual probing for the duration of the command. A Business card can + * be used, but you'll get better results with a flexible Shim that doesn't compress. This makes it + * easier to produce similar amounts of force and get more accurate measurements. Google if you're + * not sure how to use a shim. + * + * The 'T' (Map) parameter helps track Mesh building progress. + * + * NOTE: P2 requires an LCD controller! + * + * P3 Phase 3 Fill the unpopulated regions of the Mesh with a fixed value. There are two different paths to + * go down: + * + * - If a 'C' constant is specified, the closest invalid mesh points to the nozzle will be filled, + * and a repeat count can then also be specified with 'R'. + * + * - Leaving out 'C' invokes Smart Fill, which scans the mesh from the edges inward looking for + * invalid mesh points. Adjacent points are used to determine the bed slope. If the bed is sloped + * upward from the invalid point, it takes the value of the nearest point. If sloped downward, it's + * replaced by a value that puts all three points in a line. This version of G29 P3 is a quick, easy + * and (usually) safe way to populate unprobed mesh regions before continuing to G26 Mesh Validation + * Pattern. Note that this populates the mesh with unverified values. Pay attention and use caution. + * + * P4 Phase 4 Fine tune the Mesh. The Delta Mesh Compensation System assumes the existence of + * an LCD Panel. It is possible to fine tune the mesh without an LCD Panel using + * G42 and M421. See the UBL documentation for further details. + * + * Phase 4 is meant to be used with G26 Mesh Validation to fine tune the mesh by direct editing + * of Mesh Points. Raise and lower points to fine tune the mesh until it gives consistently reliable + * adhesion. + * + * P4 moves to the closest Mesh Point (and/or the given X Y), raises the nozzle above the mesh height + * by the given 'H' offset (or default 0), and waits while the controller is used to adjust the nozzle + * height. On click the displayed height is saved in the mesh. + * + * Start Phase 4 at a specific location with X and Y. Adjust a specific number of Mesh Points with + * the 'R' (Repeat) parameter. (If 'R' is left out, the whole matrix is assumed.) This command can be + * terminated early (e.g., after editing the area of interest) by pressing and holding the encoder button. + * + * The general form is G29 P4 [R points] [X position] [Y position] + * + * The H [offset] parameter is useful if a shim is used to fine-tune the mesh. For a 0.4mm shim the + * command would be G29 P4 H0.4. The nozzle is moved to the shim height, you adjust height to the shim, + * and on click the height minus the shim thickness will be saved in the mesh. + * + * !!Use with caution, as a very poor mesh could cause the nozzle to crash into the bed!! + * + * NOTE: P4 is not available unless you have LCD support enabled! + * + * P5 Phase 5 Find Mean Mesh Height and Standard Deviation. Typically, it is easier to use and + * work with the Mesh if it is Mean Adjusted. You can specify a C parameter to + * Correct the Mesh to a 0.00 Mean Height. Adding a C parameter will automatically + * execute a G29 P6 C . + * + * P6 Phase 6 Shift Mesh height. The entire Mesh's height is adjusted by the height specified + * with the C parameter. Being able to adjust the height of a Mesh is useful tool. It + * can be used to compensate for poorly calibrated Z-Probes and other errors. Ideally, + * you should have the Mesh adjusted for a Mean Height of 0.00 and the Z-Probe measuring + * 0.000 at the Z Home location. + * + * Q Test Load specified Test Pattern to assist in checking correct operation of system. This + * command is not anticipated to be of much value to the typical user. It is intended + * for developers to help them verify correct operation of the Unified Bed Leveling System. + * + * R # Repeat Repeat this command the specified number of times. If no number is specified the + * command will be repeated GRID_MAX_POINTS_X * GRID_MAX_POINTS_Y times. + * + * S Store Store the current Mesh in the Activated area of the EEPROM. It will also store the + * current state of the Unified Bed Leveling system in the EEPROM. + * + * S # Store Store the current Mesh at the specified location in EEPROM. Activate this location + * for subsequent Load and Store operations. Valid storage slot numbers begin at 0 and + * extend to a limit related to the available EEPROM storage. + * + * S -1 Store Print the current Mesh as G-code that can be used to restore the mesh anytime. + * + * T Topology Display the Mesh Map Topology. + * 'T' can be used alone (e.g., G29 T) or in combination with most of the other commands. + * This option works with all Phase commands (e.g., G29 P4 R 5 T X 50 Y100 C -.1 O) + * This parameter can also specify a Map Type. T0 (the default) is user-readable. T1 + * is suitable to paste into a spreadsheet for a 3D graph of the mesh. + * + * U Unlevel Perform a probe of the outer perimeter to assist in physically leveling unlevel beds. + * Only used for G29 P1 T U. This speeds up the probing of the edge of the bed. Useful + * when the entire bed doesn't need to be probed because it will be adjusted. + * + * V # Verbosity Set the verbosity level (0-4) for extra details. (Default 0) + * + * X # X Location for this command + * + * Y # Y Location for this command + * + * With UBL_DEVEL_DEBUGGING: + * + * K # Kompare Kompare current Mesh with stored Mesh #, replacing current Mesh with the result. + * This command literally performs a diff between two Meshes. + * + * Q-1 Dump EEPROM Dump the UBL contents stored in EEPROM as HEX format. Useful for developers to help + * verify correct operation of the UBL. + * + * W What? Display valuable UBL data. + * + * + * Release Notes: + * You MUST do M502, M500 to initialize the storage. Failure to do this will cause all + * kinds of problems. Enabling EEPROM Storage is required. + * + * When you do a G28 and G29 P1 to automatically build your first mesh, you are going to notice that + * UBL probes points increasingly further from the starting location. (The starting location defaults + * to the center of the bed.) In contrast, ABL and MBL follow a zigzag pattern. The spiral pattern is + * especially better for Delta printers, since it populates the center of the mesh first, allowing for + * a quicker test print to verify settings. You don't need to populate the entire mesh to use it. + * After all, you don't want to spend a lot of time generating a mesh only to realize the resolution + * or probe offsets are incorrect. Mesh-generation gathers points starting closest to the nozzle unless + * an (X,Y) coordinate pair is given. + * + * Unified Bed Leveling uses a lot of EEPROM storage to hold its data, and it takes some effort to get + * the mesh just right. To prevent this valuable data from being destroyed as the EEPROM structure + * evolves, UBL stores all mesh data at the end of EEPROM. + * + * UBL is founded on Edward Patel's Mesh Bed Leveling code. A big 'Thanks!' to him and the creators of + * 3-Point and Grid Based leveling. Combining their contributions we now have the functionality and + * features of all three systems combined. + */ + +void unified_bed_leveling::G29() { + + bool probe_deployed = false; + if (g29_parameter_parsing()) return; // Abort on parameter error + + const int8_t p_val = parser.intval('P', -1); + const bool may_move = p_val == 1 || p_val == 2 || p_val == 4 || parser.seen('J'); + TERN_(HAS_MULTI_HOTEND, const uint8_t old_tool_index = active_extruder); + + // Check for commands that require the printer to be homed + if (may_move) { + planner.synchronize(); + // Send 'N' to force homing before G29 (internal only) + if (axes_should_home() || parser.seen('N')) gcode.home_all_axes(); + TERN_(HAS_MULTI_HOTEND, if (active_extruder) tool_change(0)); + } + + // Invalidate Mesh Points. This command is a little bit asymmetrical because + // it directly specifies the repetition count and does not use the 'R' parameter. + if (parser.seen('I')) { + uint8_t cnt = 0; + g29_repetition_cnt = parser.has_value() ? parser.value_int() : 1; + if (g29_repetition_cnt >= GRID_MAX_POINTS) { + set_all_mesh_points_to_value(NAN); + } + else { + while (g29_repetition_cnt--) { + if (cnt > 20) { cnt = 0; idle(); } + const mesh_index_pair closest = find_closest_mesh_point_of_type(REAL, g29_pos); + const xy_int8_t &cpos = closest.pos; + if (cpos.x < 0) { + // No more REAL mesh points to invalidate, so we ASSUME the user + // meant to invalidate the ENTIRE mesh, which cannot be done with + // find_closest_mesh_point loop which only returns REAL points. + set_all_mesh_points_to_value(NAN); + SERIAL_ECHOLNPGM("Entire Mesh invalidated.\n"); + break; // No more invalid Mesh Points to populate + } + z_values[cpos.x][cpos.y] = NAN; + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(cpos, 0.0f)); + cnt++; } + } + SERIAL_ECHOLNPGM("Locations invalidated.\n"); + } - const float mean = sum / n; + if (parser.seen('Q')) { + const int test_pattern = parser.has_value() ? parser.value_int() : -99; + if (!WITHIN(test_pattern, -1, 2)) { + SERIAL_ECHOLNPGM("Invalid test_pattern value. (-1 to 2)\n"); + return; + } + SERIAL_ECHOLNPGM("Loading test_pattern values.\n"); + switch (test_pattern) { - // - // Sum the squares of difference from mean - // - float sum_of_diff_squared = 0; - GRID_LOOP(x, y) - if (!isnan(z_values[x][y])) - sum_of_diff_squared += sq(z_values[x][y] - mean); + #if ENABLED(UBL_DEVEL_DEBUGGING) + case -1: + g29_eeprom_dump(); + break; + #endif - SERIAL_ECHOLNPAIR("# of samples: ", n); - SERIAL_ECHOLNPAIR_F("Mean Mesh Height: ", mean, 6); - - const float sigma = SQRT(sum_of_diff_squared / (n + 1)); - SERIAL_ECHOLNPAIR_F("Standard Deviation: ", sigma, 6); - - if (cflag) - GRID_LOOP(x, y) - if (!isnan(z_values[x][y])) { - z_values[x][y] -= mean + value; + case 0: + GRID_LOOP(x, y) { // Create a bowl shape similar to a poorly-calibrated Delta + const float p1 = 0.5f * (GRID_MAX_POINTS_X) - x, + p2 = 0.5f * (GRID_MAX_POINTS_Y) - y; + z_values[x][y] += 2.0f * HYPOT(p1, p2); TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(x, y, z_values[x][y])); } - } + break; - void unified_bed_leveling::shift_mesh_height() { - GRID_LOOP(x, y) - if (!isnan(z_values[x][y])) { - z_values[x][y] += g29_constant; - TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(x, y, z_values[x][y])); - } + case 1: + LOOP_L_N(x, GRID_MAX_POINTS_X) { // Create a diagonal line several Mesh cells thick that is raised + z_values[x][x] += 9.999f; + z_values[x][x + (x < (GRID_MAX_POINTS_Y) - 1) ? 1 : -1] += 9.999f; // We want the altered line several mesh points thick + #if ENABLED(EXTENSIBLE_UI) + ExtUI::onMeshUpdate(x, x, z_values[x][x]); + ExtUI::onMeshUpdate(x, (x + (x < (GRID_MAX_POINTS_Y) - 1) ? 1 : -1), z_values[x][x + (x < (GRID_MAX_POINTS_Y) - 1) ? 1 : -1]); + #endif + + } + break; + + case 2: + // Allow the user to specify the height because 10mm is a little extreme in some cases. + for (uint8_t x = (GRID_MAX_POINTS_X) / 3; x < 2 * (GRID_MAX_POINTS_X) / 3; x++) // Create a rectangular raised area in + for (uint8_t y = (GRID_MAX_POINTS_Y) / 3; y < 2 * (GRID_MAX_POINTS_Y) / 3; y++) { // the center of the bed + z_values[x][y] += parser.seen('C') ? g29_constant : 9.99f; + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(x, y, z_values[x][y])); + } + break; + } } #if HAS_BED_PROBE - /** - * Probe all invalidated locations of the mesh that can be reached by the probe. - * This attempts to fill in locations closest to the nozzle's start location first. - */ - void unified_bed_leveling::probe_entire_mesh(const xy_pos_t &nearby, const bool do_ubl_mesh_map, const bool stow_probe, const bool do_furthest) { - probe.deploy(); // Deploy before ui.capture() to allow for PAUSE_BEFORE_DEPLOY_STOW - - TERN_(HAS_LCD_MENU, ui.capture()); - - save_ubl_active_state_and_disable(); // No bed level correction so only raw data is obtained - uint8_t count = GRID_MAX_POINTS; - - mesh_index_pair best; - TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(best.pos, ExtUI::MESH_START)); - do { - if (do_ubl_mesh_map) display_map(g29_map_type); - - const int point_num = (GRID_MAX_POINTS) - count + 1; - SERIAL_ECHOLNPAIR("Probing mesh point ", point_num, "/", GRID_MAX_POINTS, "."); - TERN_(HAS_DISPLAY, ui.status_printf_P(0, PSTR(S_FMT " %i/%i"), GET_TEXT(MSG_PROBING_MESH), point_num, int(GRID_MAX_POINTS))); - - #if HAS_LCD_MENU - if (ui.button_pressed()) { - ui.quick_feedback(false); // Preserve button state for click-and-hold - SERIAL_ECHOLNPGM("\nMesh only partially populated.\n"); - ui.wait_for_release(); - ui.quick_feedback(); - ui.release(); - probe.stow(); // Release UI before stow to allow for PAUSE_BEFORE_DEPLOY_STOW - return restore_ubl_active_state_and_leave(); - } - #endif - - best = do_furthest - ? find_furthest_invalid_mesh_point() - : find_closest_mesh_point_of_type(INVALID, nearby, true); - - if (best.pos.x >= 0) { // mesh point found and is reachable by probe - TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(best.pos, ExtUI::PROBE_START)); - const float measured_z = probe.probe_at_point( - best.meshpos(), - stow_probe ? PROBE_PT_STOW : PROBE_PT_RAISE, g29_verbose_level - ); - z_values[best.pos.x][best.pos.y] = measured_z; - #if ENABLED(EXTENSIBLE_UI) - ExtUI::onMeshUpdate(best.pos, ExtUI::PROBE_FINISH); - ExtUI::onMeshUpdate(best.pos, measured_z); - #endif - } - SERIAL_FLUSH(); // Prevent host M105 buffer overrun. - - } while (best.pos.x >= 0 && --count); - - TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(best.pos, ExtUI::MESH_FINISH)); - - // Release UI during stow to allow for PAUSE_BEFORE_DEPLOY_STOW - TERN_(HAS_LCD_MENU, ui.release()); - probe.stow(); - TERN_(HAS_LCD_MENU, ui.capture()); - - probe.move_z_after_probing(); + if (parser.seen('J')) { + save_ubl_active_state_and_disable(); + tilt_mesh_based_on_probed_grid(g29_grid_size == 0); // Zero size does 3-Point restore_ubl_active_state_and_leave(); - - do_blocking_move_to_xy( - constrain(nearby.x - probe.offset_xy.x, MESH_MIN_X, MESH_MAX_X), - constrain(nearby.y - probe.offset_xy.y, MESH_MIN_Y, MESH_MAX_Y) - ); + #if ENABLED(UBL_G29_J_RECENTER) + do_blocking_move_to_xy(0.5f * ((MESH_MIN_X) + (MESH_MAX_X)), 0.5f * ((MESH_MIN_Y) + (MESH_MAX_Y))); + #endif + report_current_position(); + probe_deployed = true; } #endif // HAS_BED_PROBE - #if HAS_LCD_MENU - - typedef void (*clickFunc_t)(); - - bool click_and_hold(const clickFunc_t func=nullptr) { - if (ui.button_pressed()) { - ui.quick_feedback(false); // Preserve button state for click-and-hold - const millis_t nxt = millis() + 1500UL; - while (ui.button_pressed()) { // Loop while the encoder is pressed. Uses hardware flag! - idle(); // idle, of course - if (ELAPSED(millis(), nxt)) { // After 1.5 seconds - ui.quick_feedback(); - if (func) (*func)(); - ui.wait_for_release(); - return true; - } - } - } - serial_delay(15); - return false; + if (parser.seen('P')) { + if (WITHIN(g29_phase_value, 0, 1) && storage_slot == -1) { + storage_slot = 0; + SERIAL_ECHOLNPGM("Default storage slot 0 selected."); } - void unified_bed_leveling::move_z_with_encoder(const float &multiplier) { - ui.wait_for_release(); - while (!ui.button_pressed()) { - idle(); - gcode.reset_stepper_timeout(); // Keep steppers powered - if (encoder_diff) { - do_blocking_move_to_z(current_position.z + float(encoder_diff) * multiplier); - encoder_diff = 0; - } - } - } + switch (g29_phase_value) { + case 0: + // + // Zero Mesh Data + // + reset(); + SERIAL_ECHOLNPGM("Mesh zeroed."); + break; - float unified_bed_leveling::measure_point_with_encoder() { - KEEPALIVE_STATE(PAUSED_FOR_USER); - move_z_with_encoder(0.01f); - return current_position.z; - } - - static void echo_and_take_a_measurement() { SERIAL_ECHOLNPGM(" and take a measurement."); } - - float unified_bed_leveling::measure_business_card_thickness() { - ui.capture(); - 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)), MANUAL_PROBE_START_Z); - //, _MIN(planner.settings.max_feedrate_mm_s[X_AXIS], planner.settings.max_feedrate_mm_s[Y_AXIS]) * 0.5f); - planner.synchronize(); - - SERIAL_ECHOPGM("Place shim under nozzle"); - LCD_MESSAGEPGM(MSG_UBL_BC_INSERT); - ui.return_to_status(); - echo_and_take_a_measurement(); - - const float z1 = measure_point_with_encoder(); - do_blocking_move_to_z(current_position.z + SIZE_OF_LITTLE_RAISE); - planner.synchronize(); - - SERIAL_ECHOPGM("Remove shim"); - LCD_MESSAGEPGM(MSG_UBL_BC_REMOVE); - echo_and_take_a_measurement(); - - const float z2 = measure_point_with_encoder(); - do_blocking_move_to_z(current_position.z + Z_CLEARANCE_BETWEEN_PROBES); - - const float thickness = ABS(z1 - z2); - - if (g29_verbose_level > 1) { - SERIAL_ECHOPAIR_F("Business Card is ", thickness, 4); - SERIAL_ECHOLNPGM("mm thick."); - } - - restore_ubl_active_state_and_leave(); - - return thickness; - } - - void unified_bed_leveling::manually_probe_remaining_mesh(const xy_pos_t &pos, const float &z_clearance, const float &thick, const bool do_ubl_mesh_map) { - ui.capture(); - - save_ubl_active_state_and_disable(); // No bed level correction so only raw data is obtained - do_blocking_move_to_xy_z(current_position, z_clearance); - - ui.return_to_status(); - - mesh_index_pair location; - const xy_int8_t &lpos = location.pos; - do { - location = find_closest_mesh_point_of_type(INVALID, pos); - // It doesn't matter if the probe can't reach the NAN location. This is a manual probe. - if (!location.valid()) continue; - - const xyz_pos_t ppos = { - mesh_index_to_xpos(lpos.x), - mesh_index_to_ypos(lpos.y), - Z_CLEARANCE_BETWEEN_PROBES - }; - - if (!position_is_reachable(ppos)) break; // SHOULD NOT OCCUR (find_closest_mesh_point only returns reachable points) - - LCD_MESSAGEPGM(MSG_UBL_MOVING_TO_NEXT); - - do_blocking_move_to(ppos); - do_z_clearance(z_clearance); - - KEEPALIVE_STATE(PAUSED_FOR_USER); - ui.capture(); - - if (do_ubl_mesh_map) display_map(g29_map_type); // show user where we're probing - - serialprintPGM(parser.seen('B') ? GET_TEXT(MSG_UBL_BC_INSERT) : GET_TEXT(MSG_UBL_BC_INSERT2)); - - const float z_step = 0.01f; // existing behavior: 0.01mm per click, occasionally step - //const float z_step = planner.steps_to_mm[Z_AXIS]; // approx one step each click - - move_z_with_encoder(z_step); - - if (click_and_hold()) { - SERIAL_ECHOLNPGM("\nMesh only partially populated."); - do_z_clearance(Z_CLEARANCE_DEPLOY_PROBE); - return restore_ubl_active_state_and_leave(); - } - - z_values[lpos.x][lpos.y] = current_position.z - thick; - TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(location, z_values[lpos.x][lpos.y])); - - if (g29_verbose_level > 2) - SERIAL_ECHOLNPAIR_F("Mesh Point Measured at: ", z_values[lpos.x][lpos.y], 6); - SERIAL_FLUSH(); // Prevent host M105 buffer overrun. - } while (location.valid()); - - if (do_ubl_mesh_map) display_map(g29_map_type); // show user where we're probing - - restore_ubl_active_state_and_leave(); - do_blocking_move_to_xy_z(pos, Z_CLEARANCE_DEPLOY_PROBE); - } - - inline void set_message_with_feedback(PGM_P const msg_P) { - ui.set_status_P(msg_P); - ui.quick_feedback(); - } - - void abort_fine_tune() { - ui.return_to_status(); - do_z_clearance(Z_CLEARANCE_BETWEEN_PROBES); - set_message_with_feedback(GET_TEXT(MSG_EDITING_STOPPED)); - } - - void unified_bed_leveling::fine_tune_mesh(const xy_pos_t &pos, const bool do_ubl_mesh_map) { - if (!parser.seen('R')) // fine_tune_mesh() is special. If no repetition count flag is specified - g29_repetition_cnt = 1; // do exactly one mesh location. Otherwise use what the parser decided. - - #if ENABLED(UBL_MESH_EDIT_MOVES_Z) - const float h_offset = parser.seenval('H') ? parser.value_linear_units() : MANUAL_PROBE_START_Z; - if (!WITHIN(h_offset, 0, 10)) { - SERIAL_ECHOLNPGM("Offset out of bounds. (0 to 10mm)\n"); - return; - } - #endif - - mesh_index_pair location; - - if (!position_is_reachable(pos)) { - SERIAL_ECHOLNPGM("(X,Y) outside printable radius."); - return; - } - - save_ubl_active_state_and_disable(); - - LCD_MESSAGEPGM(MSG_UBL_FINE_TUNE_MESH); - ui.capture(); // Take over control of the LCD encoder - - do_blocking_move_to_xy_z(pos, Z_CLEARANCE_BETWEEN_PROBES); // Move to the given XY with probe clearance - - MeshFlags done_flags{0}; - const xy_int8_t &lpos = location.pos; - - #if IS_TFTGLCD_PANEL - lcd_mesh_edit_setup(0); // Change current screen before calling ui.ubl_plot - safe_delay(50); - #endif - - do { - location = find_closest_mesh_point_of_type(SET_IN_BITMAP, pos, false, &done_flags); - - if (lpos.x < 0) break; // Stop when there are no more reachable points - - done_flags.mark(lpos); // Mark this location as 'adjusted' so a new - // location is used on the next loop - const xyz_pos_t raw = { - mesh_index_to_xpos(lpos.x), - mesh_index_to_ypos(lpos.y), - Z_CLEARANCE_BETWEEN_PROBES - }; - - if (!position_is_reachable(raw)) break; // SHOULD NOT OCCUR (find_closest_mesh_point_of_type only returns reachable) - - do_blocking_move_to(raw); // Move the nozzle to the edit point with probe clearance - - TERN_(UBL_MESH_EDIT_MOVES_Z, do_blocking_move_to_z(h_offset)); // Move Z to the given 'H' offset before editing - - KEEPALIVE_STATE(PAUSED_FOR_USER); - - if (do_ubl_mesh_map) display_map(g29_map_type); // Display the current point - - #if IS_TFTGLCD_PANEL - ui.ubl_plot(lpos.x, lpos.y); // update plot screen - #endif - - ui.refresh(); - - float new_z = z_values[lpos.x][lpos.y]; - if (isnan(new_z)) new_z = 0; // Invalid points begin at 0 - new_z = FLOOR(new_z * 1000) * 0.001f; // Chop off digits after the 1000ths place - - lcd_mesh_edit_setup(new_z); - - SET_SOFT_ENDSTOP_LOOSE(true); - - do { - idle(); - new_z = lcd_mesh_edit(); - TERN_(UBL_MESH_EDIT_MOVES_Z, do_blocking_move_to_z(h_offset + new_z)); // Move the nozzle as the point is edited - SERIAL_FLUSH(); // Prevent host M105 buffer overrun. - } while (!ui.button_pressed()); - - SET_SOFT_ENDSTOP_LOOSE(false); - - if (!lcd_map_control) ui.return_to_status(); // Just editing a single point? Return to status - - if (click_and_hold(abort_fine_tune)) break; // Button held down? Abort editing - - z_values[lpos.x][lpos.y] = new_z; // Save the updated Z value - TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(location, new_z)); - - serial_delay(20); // No switch noise - ui.refresh(); - - } while (lpos.x >= 0 && --g29_repetition_cnt > 0); - - if (do_ubl_mesh_map) display_map(g29_map_type); - restore_ubl_active_state_and_leave(); - - do_blocking_move_to_xy_z(pos, Z_CLEARANCE_BETWEEN_PROBES); - - LCD_MESSAGEPGM(MSG_UBL_DONE_EDITING_MESH); - SERIAL_ECHOLNPGM("Done Editing Mesh"); - - if (lcd_map_control) - ui.goto_screen(ubl_map_screen); - else - ui.return_to_status(); - } - - #endif // HAS_LCD_MENU - - bool unified_bed_leveling::g29_parameter_parsing() { - bool err_flag = false; - - TERN_(HAS_LCD_MENU, set_message_with_feedback(GET_TEXT(MSG_UBL_DOING_G29))); - - g29_constant = 0; - g29_repetition_cnt = 0; - - if (parser.seen('R')) { - g29_repetition_cnt = parser.has_value() ? parser.value_int() : GRID_MAX_POINTS; - NOMORE(g29_repetition_cnt, GRID_MAX_POINTS); - if (g29_repetition_cnt < 1) { - SERIAL_ECHOLNPGM("?(R)epetition count invalid (1+).\n"); - return UBL_ERR; - } - } - - g29_verbose_level = parser.seen('V') ? parser.value_int() : 0; - if (!WITHIN(g29_verbose_level, 0, 4)) { - SERIAL_ECHOLNPGM("?(V)erbose level implausible (0-4).\n"); - err_flag = true; - } - - if (parser.seen('P')) { - const int pv = parser.value_int(); - #if !HAS_BED_PROBE - if (pv == 1) { - SERIAL_ECHOLNPGM("G29 P1 requires a probe.\n"); - err_flag = true; - } - else - #endif - { - g29_phase_value = pv; - if (!WITHIN(g29_phase_value, 0, 6)) { - SERIAL_ECHOLNPGM("?(P)hase value invalid (0-6).\n"); - err_flag = true; - } - } - } - - if (parser.seen('J')) { #if HAS_BED_PROBE - g29_grid_size = parser.has_value() ? parser.value_int() : 0; - if (g29_grid_size && !WITHIN(g29_grid_size, 2, 9)) { - SERIAL_ECHOLNPGM("?Invalid grid size (J) specified (2-9).\n"); - err_flag = true; + + case 1: { + // + // Invalidate Entire Mesh and Automatically Probe Mesh in areas that can be reached by the probe + // + if (!parser.seen('C')) { + invalidate(); + SERIAL_ECHOLNPGM("Mesh invalidated. Probing mesh."); + } + if (g29_verbose_level > 1) { + SERIAL_ECHOPAIR("Probing around (", g29_pos.x); + SERIAL_CHAR(','); + SERIAL_DECIMAL(g29_pos.y); + SERIAL_ECHOLNPGM(").\n"); + } + const xy_pos_t near_probe_xy = g29_pos + probe.offset_xy; + probe_entire_mesh(near_probe_xy, parser.seen('T'), parser.seen('E'), parser.seen('U')); + + report_current_position(); + probe_deployed = true; + } break; + + #endif // HAS_BED_PROBE + + case 2: { + #if HAS_LCD_MENU + // + // Manually Probe Mesh in areas that can't be reached by the probe + // + SERIAL_ECHOLNPGM("Manually probing unreachable points."); + do_z_clearance(Z_CLEARANCE_BETWEEN_PROBES); + + if (parser.seen('C') && !xy_seen) { + + /** + * Use a good default location for the path. + * The flipped > and < operators in these comparisons is intentional. + * It should cause the probed points to follow a nice path on Cartesian printers. + * It may make sense to have Delta printers default to the center of the bed. + * Until that is decided, this can be forced with the X and Y parameters. + */ + g29_pos.set( + #if IS_KINEMATIC + X_HOME_POS, Y_HOME_POS + #else + probe.offset_xy.x > 0 ? X_BED_SIZE : 0, + probe.offset_xy.y < 0 ? Y_BED_SIZE : 0 + #endif + ); + } + + if (parser.seen('B')) { + g29_card_thickness = parser.has_value() ? parser.value_float() : measure_business_card_thickness(); + if (ABS(g29_card_thickness) > 1.5f) { + SERIAL_ECHOLNPGM("?Error in Business Card measurement."); + return; + } + probe_deployed = true; + } + + if (!position_is_reachable(g29_pos)) { + SERIAL_ECHOLNPGM("XY outside printable radius."); + return; + } + + const float height = parser.floatval('H', Z_CLEARANCE_BETWEEN_PROBES); + manually_probe_remaining_mesh(g29_pos, height, g29_card_thickness, parser.seen('T')); + + SERIAL_ECHOLNPGM("G29 P2 finished."); + + report_current_position(); + + #else + + SERIAL_ECHOLNPGM("?P2 is only available when an LCD is present."); + return; + + #endif + } break; + + case 3: { + /** + * Populate invalid mesh areas. Proceed with caution. + * Two choices are available: + * - Specify a constant with the 'C' parameter. + * - Allow 'G29 P3' to choose a 'reasonable' constant. + */ + + if (g29_c_flag) { + if (g29_repetition_cnt >= GRID_MAX_POINTS) { + set_all_mesh_points_to_value(g29_constant); + } + else { + while (g29_repetition_cnt--) { // this only populates reachable mesh points near + const mesh_index_pair closest = find_closest_mesh_point_of_type(INVALID, g29_pos); + const xy_int8_t &cpos = closest.pos; + if (cpos.x < 0) { + // No more REAL INVALID mesh points to populate, so we ASSUME + // user meant to populate ALL INVALID mesh points to value + GRID_LOOP(x, y) if (isnan(z_values[x][y])) z_values[x][y] = g29_constant; + break; // No more invalid Mesh Points to populate + } + else { + z_values[cpos.x][cpos.y] = g29_constant; + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(cpos, g29_constant)); + } + } + } } - #else - SERIAL_ECHOLNPGM("G29 J action requires a probe.\n"); - err_flag = true; - #endif - } + else { + const float cvf = parser.value_float(); + switch ((int)TRUNC(cvf * 10.0f) - 30) { // 3.1 -> 1 + #if ENABLED(UBL_G29_P31) + case 1: { - xy_seen.x = parser.seenval('X'); - float sx = xy_seen.x ? parser.value_float() : current_position.x; - xy_seen.y = parser.seenval('Y'); - float sy = xy_seen.y ? parser.value_float() : current_position.y; + // P3.1 use least squares fit to fill missing mesh values + // P3.10 zero weighting for distance, all grid points equal, best fit tilted plane + // P3.11 10X weighting for nearest grid points versus farthest grid points + // P3.12 100X distance weighting + // P3.13 1000X distance weighting, approaches simple average of nearest points - if (xy_seen.x != xy_seen.y) { - SERIAL_ECHOLNPGM("Both X & Y locations must be specified.\n"); - err_flag = true; - } - - // If X or Y are not valid, use center of the bed values - if (!WITHIN(sx, X_MIN_BED, X_MAX_BED)) sx = X_CENTER; - if (!WITHIN(sy, Y_MIN_BED, Y_MAX_BED)) sy = Y_CENTER; - - if (err_flag) return UBL_ERR; - - g29_pos.set(sx, sy); - - /** - * Activate or deactivate UBL - * Note: UBL's G29 restores the state set here when done. - * Leveling is being enabled here with old data, possibly - * none. Error handling should disable for safety... - */ - if (parser.seen('A')) { - if (parser.seen('D')) { - SERIAL_ECHOLNPGM("?Can't activate and deactivate at the same time.\n"); - return UBL_ERR; - } - set_bed_leveling_enabled(true); - report_state(); - } - else if (parser.seen('D')) { - set_bed_leveling_enabled(false); - report_state(); - } - - // Set global 'C' flag and its value - if ((g29_c_flag = parser.seen('C'))) - g29_constant = parser.value_float(); - - #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) - if (parser.seenval('F')) { - const float fh = parser.value_float(); - if (!WITHIN(fh, 0, 100)) { - SERIAL_ECHOLNPGM("?(F)ade height for Bed Level Correction not plausible.\n"); - return UBL_ERR; + const float weight_power = (cvf - 3.10f) * 100.0f, // 3.12345 -> 2.345 + weight_factor = weight_power ? POW(10.0f, weight_power) : 0; + smart_fill_wlsf(weight_factor); + } + break; + #endif + case 0: // P3 or P3.0 + default: // and anything P3.x that's not P3.1 + smart_fill_mesh(); // Do a 'Smart' fill using nearby known values + break; + } } - set_z_fade_height(fh); + break; } - #endif - g29_map_type = parser.intval('T'); - if (!WITHIN(g29_map_type, 0, 2)) { - SERIAL_ECHOLNPGM("Invalid map type.\n"); - return UBL_ERR; + case 4: // Fine Tune (i.e., Edit) the Mesh + #if HAS_LCD_MENU + fine_tune_mesh(g29_pos, parser.seen('T')); + #else + SERIAL_ECHOLNPGM("?P4 is only available when an LCD is present."); + return; + #endif + break; + + case 5: adjust_mesh_to_mean(g29_c_flag, g29_constant); break; + + case 6: shift_mesh_height(); break; } - return UBL_OK; } - static uint8_t ubl_state_at_invocation = 0; - #if ENABLED(UBL_DEVEL_DEBUGGING) - static uint8_t ubl_state_recursion_chk = 0; + + // + // Much of the 'What?' command can be eliminated. But until we are fully debugged, it is + // good to have the extra information. Soon... we prune this to just a few items + // + if (parser.seen('W')) g29_what_command(); + + // + // When we are fully debugged, this may go away. But there are some valid + // use cases for the users. So we can wait and see what to do with it. + // + + if (parser.seen('K')) // Kompare Current Mesh Data to Specified Stored Mesh + g29_compare_current_mesh_to_stored_mesh(); + + #endif // UBL_DEVEL_DEBUGGING + + + // + // Load a Mesh from the EEPROM + // + + if (parser.seen('L')) { // Load Current Mesh Data + g29_storage_slot = parser.has_value() ? parser.value_int() : storage_slot; + + int16_t a = settings.calc_num_meshes(); + + if (!a) { + SERIAL_ECHOLNPGM("?EEPROM storage not available."); + return; + } + + if (!WITHIN(g29_storage_slot, 0, a - 1)) { + SERIAL_ECHOLNPAIR("?Invalid storage slot.\n?Use 0 to ", a - 1); + return; + } + + settings.load_mesh(g29_storage_slot); + storage_slot = g29_storage_slot; + + SERIAL_ECHOLNPGM("Done."); + } + + // + // Store a Mesh in the EEPROM + // + + if (parser.seen('S')) { // Store (or Save) Current Mesh Data + g29_storage_slot = parser.has_value() ? parser.value_int() : storage_slot; + + if (g29_storage_slot == -1) // Special case, the user wants to 'Export' the mesh to the + return report_current_mesh(); // host program to be saved on the user's computer + + int16_t a = settings.calc_num_meshes(); + + if (!a) { + SERIAL_ECHOLNPGM("?EEPROM storage not available."); + goto LEAVE; + } + + if (!WITHIN(g29_storage_slot, 0, a - 1)) { + SERIAL_ECHOLNPAIR("?Invalid storage slot.\n?Use 0 to ", a - 1); + goto LEAVE; + } + + settings.store_mesh(g29_storage_slot); + storage_slot = g29_storage_slot; + + SERIAL_ECHOLNPGM("Done."); + } + + if (parser.seen('T')) + display_map(g29_map_type); + + LEAVE: + + #if HAS_LCD_MENU + ui.reset_alert_level(); + ui.quick_feedback(); + ui.reset_status(); + ui.release(); #endif - void unified_bed_leveling::save_ubl_active_state_and_disable() { - #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."); - TERN_(HAS_LCD_MENU, set_message_with_feedback(GET_TEXT(MSG_UBL_SAVE_ERROR))); - return; - } - #endif - ubl_state_at_invocation = planner.leveling_active; - set_bed_leveling_enabled(false); - } - - void unified_bed_leveling::restore_ubl_active_state_and_leave() { - TERN_(HAS_LCD_MENU, ui.release()); - #if ENABLED(UBL_DEVEL_DEBUGGING) - if (--ubl_state_recursion_chk) { - SERIAL_ECHOLNPGM("restore_ubl_active_state_and_leave() called too many times."); - TERN_(HAS_LCD_MENU, set_message_with_feedback(GET_TEXT(MSG_UBL_RESTORE_ERROR))); - return; - } - #endif - set_bed_leveling_enabled(ubl_state_at_invocation); - } - - mesh_index_pair unified_bed_leveling::find_furthest_invalid_mesh_point() { - - bool found_a_NAN = false, found_a_real = false; - - mesh_index_pair farthest { -1, -1, -99999.99 }; - - GRID_LOOP(i, j) { - if (!isnan(z_values[i][j])) continue; // Skip valid mesh points - - // Skip unreachable points - if (!probe.can_reach(mesh_index_to_xpos(i), mesh_index_to_ypos(j))) - continue; - - found_a_NAN = true; - - xy_int8_t nearby { -1, -1 }; - float d1, d2 = 99999.9f; - GRID_LOOP(k, l) { - if (isnan(z_values[k][l])) continue; - - found_a_real = true; - - // Add in a random weighting factor that scrambles the probing of the - // last half of the mesh (when every unprobed mesh point is one index - // from a probed location). - - d1 = HYPOT(i - k, j - l) + (1.0f / ((millis() % 47) + 13)); - - if (d1 < d2) { // Invalid mesh point (i,j) is closer to the defined point (k,l) - d2 = d1; - nearby.set(i, j); - } - } - - // - // At this point d2 should have the near defined mesh point to invalid mesh point (i,j) - // - - if (found_a_real && nearby.x >= 0 && d2 > farthest.distance) { - farthest.pos = nearby; // Found an invalid location farther from the defined mesh point - farthest.distance = d2; - } - } // GRID_LOOP - - if (!found_a_real && found_a_NAN) { // if the mesh is totally unpopulated, start the probing - farthest.pos.set((GRID_MAX_POINTS_X) / 2, (GRID_MAX_POINTS_Y) / 2); - farthest.distance = 1; + #ifdef Z_PROBE_END_SCRIPT + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Z Probe End Script: ", Z_PROBE_END_SCRIPT); + if (probe_deployed) { + planner.synchronize(); + gcode.process_subcommands_now_P(PSTR(Z_PROBE_END_SCRIPT)); } - return farthest; - } + #else + UNUSED(probe_deployed); + #endif - mesh_index_pair unified_bed_leveling::find_closest_mesh_point_of_type(const MeshPointType type, const xy_pos_t &pos, const bool probe_relative/*=false*/, MeshFlags *done_flags/*=nullptr*/) { - mesh_index_pair closest; - closest.invalidate(); - closest.distance = -99999.9f; + TERN_(HAS_MULTI_HOTEND, tool_change(old_tool_index)); + return; +} - // Get the reference position, either nozzle or probe - const xy_pos_t ref = probe_relative ? pos + probe.offset_xy : pos; +void unified_bed_leveling::adjust_mesh_to_mean(const bool cflag, const float value) { + float sum = 0; + int n = 0; + GRID_LOOP(x, y) + if (!isnan(z_values[x][y])) { + sum += z_values[x][y]; + n++; + } - float best_so_far = 99999.99f; + const float mean = sum / n; - GRID_LOOP(i, j) { - if ( (type == (isnan(z_values[i][j]) ? INVALID : REAL)) - || (type == SET_IN_BITMAP && !done_flags->marked(i, j)) - ) { - // Found a Mesh Point of the specified type! - const xy_pos_t mpos = { mesh_index_to_xpos(i), mesh_index_to_ypos(j) }; + // + // Sum the squares of difference from mean + // + float sum_of_diff_squared = 0; + GRID_LOOP(x, y) + if (!isnan(z_values[x][y])) + sum_of_diff_squared += sq(z_values[x][y] - mean); - // If using the probe as the reference there are some unreachable locations. - // Also for round beds, there are grid points outside the bed the nozzle can't reach. - // Prune them from the list and ignore them till the next Phase (manual nozzle probing). + SERIAL_ECHOLNPAIR("# of samples: ", n); + SERIAL_ECHOLNPAIR_F("Mean Mesh Height: ", mean, 6); - if (!(probe_relative ? probe.can_reach(mpos) : position_is_reachable(mpos))) - continue; + const float sigma = SQRT(sum_of_diff_squared / (n + 1)); + SERIAL_ECHOLNPAIR_F("Standard Deviation: ", sigma, 6); - // Reachable. Check if it's the best_so_far location to the nozzle. - - const xy_pos_t diff = current_position - mpos; - const float distance = (ref - mpos).magnitude() + diff.magnitude() * 0.1f; - - // factor in the distance from the current location for the normal case - // so the nozzle isn't running all over the bed. - if (distance < best_so_far) { - best_so_far = distance; // Found a closer location with the desired value type. - closest.pos.set(i, j); - closest.distance = best_so_far; - } + if (cflag) + GRID_LOOP(x, y) + if (!isnan(z_values[x][y])) { + z_values[x][y] -= mean + value; + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(x, y, z_values[x][y])); } - } // GRID_LOOP +} - return closest; +void unified_bed_leveling::shift_mesh_height() { + GRID_LOOP(x, y) + if (!isnan(z_values[x][y])) { + z_values[x][y] += g29_constant; + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(x, y, z_values[x][y])); + } +} + +#if HAS_BED_PROBE + /** + * Probe all invalidated locations of the mesh that can be reached by the probe. + * This attempts to fill in locations closest to the nozzle's start location first. + */ + void unified_bed_leveling::probe_entire_mesh(const xy_pos_t &nearby, const bool do_ubl_mesh_map, const bool stow_probe, const bool do_furthest) { + probe.deploy(); // Deploy before ui.capture() to allow for PAUSE_BEFORE_DEPLOY_STOW + + TERN_(HAS_LCD_MENU, ui.capture()); + + save_ubl_active_state_and_disable(); // No bed level correction so only raw data is obtained + uint8_t count = GRID_MAX_POINTS; + + mesh_index_pair best; + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(best.pos, ExtUI::MESH_START)); + do { + if (do_ubl_mesh_map) display_map(g29_map_type); + + const int point_num = (GRID_MAX_POINTS) - count + 1; + SERIAL_ECHOLNPAIR("Probing mesh point ", point_num, "/", GRID_MAX_POINTS, "."); + TERN_(HAS_DISPLAY, ui.status_printf_P(0, PSTR(S_FMT " %i/%i"), GET_TEXT(MSG_PROBING_MESH), point_num, int(GRID_MAX_POINTS))); + + #if HAS_LCD_MENU + if (ui.button_pressed()) { + ui.quick_feedback(false); // Preserve button state for click-and-hold + SERIAL_ECHOLNPGM("\nMesh only partially populated.\n"); + ui.wait_for_release(); + ui.quick_feedback(); + ui.release(); + probe.stow(); // Release UI before stow to allow for PAUSE_BEFORE_DEPLOY_STOW + return restore_ubl_active_state_and_leave(); + } + #endif + + best = do_furthest + ? find_furthest_invalid_mesh_point() + : find_closest_mesh_point_of_type(INVALID, nearby, true); + + if (best.pos.x >= 0) { // mesh point found and is reachable by probe + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(best.pos, ExtUI::PROBE_START)); + const float measured_z = probe.probe_at_point( + best.meshpos(), + stow_probe ? PROBE_PT_STOW : PROBE_PT_RAISE, g29_verbose_level + ); + z_values[best.pos.x][best.pos.y] = measured_z; + #if ENABLED(EXTENSIBLE_UI) + ExtUI::onMeshUpdate(best.pos, ExtUI::PROBE_FINISH); + ExtUI::onMeshUpdate(best.pos, measured_z); + #endif + } + SERIAL_FLUSH(); // Prevent host M105 buffer overrun. + + } while (best.pos.x >= 0 && --count); + + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(best.pos, ExtUI::MESH_FINISH)); + + // Release UI during stow to allow for PAUSE_BEFORE_DEPLOY_STOW + TERN_(HAS_LCD_MENU, ui.release()); + probe.stow(); + TERN_(HAS_LCD_MENU, ui.capture()); + + probe.move_z_after_probing(); + + restore_ubl_active_state_and_leave(); + + do_blocking_move_to_xy( + constrain(nearby.x - probe.offset_xy.x, MESH_MIN_X, MESH_MAX_X), + constrain(nearby.y - probe.offset_xy.y, MESH_MIN_Y, MESH_MAX_Y) + ); } - /** - * 'Smart Fill': Scan from the outward edges of the mesh towards the center. - * If an invalid location is found, use the next two points (if valid) to - * calculate a 'reasonable' value for the unprobed mesh point. - */ +#endif // HAS_BED_PROBE - bool unified_bed_leveling::smart_fill_one(const uint8_t x, const uint8_t y, const int8_t xdir, const int8_t ydir) { - const float v = z_values[x][y]; - if (isnan(v)) { // A NAN... - const int8_t dx = x + xdir, dy = y + ydir; - const float v1 = z_values[dx][dy]; - if (!isnan(v1)) { // ...next to a pair of real values? - const float v2 = z_values[dx + xdir][dy + ydir]; - if (!isnan(v2)) { - z_values[x][y] = v1 < v2 ? v1 : v1 + v1 - v2; - TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(x, y, z_values[x][y])); +#if HAS_LCD_MENU + + typedef void (*clickFunc_t)(); + + bool click_and_hold(const clickFunc_t func=nullptr) { + if (ui.button_pressed()) { + ui.quick_feedback(false); // Preserve button state for click-and-hold + const millis_t nxt = millis() + 1500UL; + while (ui.button_pressed()) { // Loop while the encoder is pressed. Uses hardware flag! + idle(); // idle, of course + if (ELAPSED(millis(), nxt)) { // After 1.5 seconds + ui.quick_feedback(); + if (func) (*func)(); + ui.wait_for_release(); return true; } } } + serial_delay(15); return false; } - typedef struct { uint8_t sx, ex, sy, ey; bool yfirst; } smart_fill_info; - - void unified_bed_leveling::smart_fill_mesh() { - static const smart_fill_info - info0 PROGMEM = { 0, GRID_MAX_POINTS_X, 0, GRID_MAX_POINTS_Y - 2, false }, // Bottom of the mesh looking up - info1 PROGMEM = { 0, GRID_MAX_POINTS_X, GRID_MAX_POINTS_Y - 1, 0, false }, // Top of the mesh looking down - info2 PROGMEM = { 0, GRID_MAX_POINTS_X - 2, 0, GRID_MAX_POINTS_Y, true }, // Left side of the mesh looking right - info3 PROGMEM = { GRID_MAX_POINTS_X - 1, 0, 0, GRID_MAX_POINTS_Y, true }; // Right side of the mesh looking left - static const smart_fill_info * const info[] PROGMEM = { &info0, &info1, &info2, &info3 }; - - LOOP_L_N(i, COUNT(info)) { - const smart_fill_info *f = (smart_fill_info*)pgm_read_ptr(&info[i]); - const int8_t sx = pgm_read_byte(&f->sx), sy = pgm_read_byte(&f->sy), - ex = pgm_read_byte(&f->ex), ey = pgm_read_byte(&f->ey); - if (pgm_read_byte(&f->yfirst)) { - const int8_t dir = ex > sx ? 1 : -1; - for (uint8_t y = sy; y != ey; ++y) - for (uint8_t x = sx; x != ex; x += dir) - if (smart_fill_one(x, y, dir, 0)) break; - } - else { - const int8_t dir = ey > sy ? 1 : -1; - for (uint8_t x = sx; x != ex; ++x) - for (uint8_t y = sy; y != ey; y += dir) - if (smart_fill_one(x, y, 0, dir)) break; + void unified_bed_leveling::move_z_with_encoder(const float &multiplier) { + ui.wait_for_release(); + while (!ui.button_pressed()) { + idle(); + gcode.reset_stepper_timeout(); // Keep steppers powered + if (encoder_diff) { + do_blocking_move_to_z(current_position.z + float(encoder_diff) * multiplier); + encoder_diff = 0; } } } - #if HAS_BED_PROBE + float unified_bed_leveling::measure_point_with_encoder() { + KEEPALIVE_STATE(PAUSED_FOR_USER); + move_z_with_encoder(0.01f); + return current_position.z; + } - //#define VALIDATE_MESH_TILT + static void echo_and_take_a_measurement() { SERIAL_ECHOLNPGM(" and take a measurement."); } - #include "../../../libs/vector_3.h" + float unified_bed_leveling::measure_business_card_thickness() { + ui.capture(); + save_ubl_active_state_and_disable(); // Disable bed level correction for probing - void unified_bed_leveling::tilt_mesh_based_on_probed_grid(const bool do_3_pt_leveling) { - const float x_min = probe.min_x(), x_max = probe.max_x(), - y_min = probe.min_y(), y_max = probe.max_y(), - dx = (x_max - x_min) / (g29_grid_size - 1), - dy = (y_max - y_min) / (g29_grid_size - 1); + do_blocking_move_to(0.5f * (MESH_MAX_X - (MESH_MIN_X)), 0.5f * (MESH_MAX_Y - (MESH_MIN_Y)), MANUAL_PROBE_START_Z); + //, _MIN(planner.settings.max_feedrate_mm_s[X_AXIS], planner.settings.max_feedrate_mm_s[Y_AXIS]) * 0.5f); + planner.synchronize(); - xy_float_t points[3]; - probe.get_three_points(points); + SERIAL_ECHOPGM("Place shim under nozzle"); + LCD_MESSAGEPGM(MSG_UBL_BC_INSERT); + ui.return_to_status(); + echo_and_take_a_measurement(); - float measured_z; - bool abort_flag = false; + const float z1 = measure_point_with_encoder(); + do_blocking_move_to_z(current_position.z + SIZE_OF_LITTLE_RAISE); + planner.synchronize(); - #ifdef VALIDATE_MESH_TILT - float z1, z2, z3; // Needed for algorithm validation below + SERIAL_ECHOPGM("Remove shim"); + LCD_MESSAGEPGM(MSG_UBL_BC_REMOVE); + echo_and_take_a_measurement(); + + const float z2 = measure_point_with_encoder(); + do_blocking_move_to_z(current_position.z + Z_CLEARANCE_BETWEEN_PROBES); + + const float thickness = ABS(z1 - z2); + + if (g29_verbose_level > 1) { + SERIAL_ECHOPAIR_F("Business Card is ", thickness, 4); + SERIAL_ECHOLNPGM("mm thick."); + } + + restore_ubl_active_state_and_leave(); + + return thickness; + } + + void unified_bed_leveling::manually_probe_remaining_mesh(const xy_pos_t &pos, const float &z_clearance, const float &thick, const bool do_ubl_mesh_map) { + ui.capture(); + + save_ubl_active_state_and_disable(); // No bed level correction so only raw data is obtained + do_blocking_move_to_xy_z(current_position, z_clearance); + + ui.return_to_status(); + + mesh_index_pair location; + const xy_int8_t &lpos = location.pos; + do { + location = find_closest_mesh_point_of_type(INVALID, pos); + // It doesn't matter if the probe can't reach the NAN location. This is a manual probe. + if (!location.valid()) continue; + + const xyz_pos_t ppos = { + mesh_index_to_xpos(lpos.x), + mesh_index_to_ypos(lpos.y), + Z_CLEARANCE_BETWEEN_PROBES + }; + + if (!position_is_reachable(ppos)) break; // SHOULD NOT OCCUR (find_closest_mesh_point only returns reachable points) + + LCD_MESSAGEPGM(MSG_UBL_MOVING_TO_NEXT); + + do_blocking_move_to(ppos); + do_z_clearance(z_clearance); + + KEEPALIVE_STATE(PAUSED_FOR_USER); + ui.capture(); + + if (do_ubl_mesh_map) display_map(g29_map_type); // show user where we're probing + + serialprintPGM(parser.seen('B') ? GET_TEXT(MSG_UBL_BC_INSERT) : GET_TEXT(MSG_UBL_BC_INSERT2)); + + const float z_step = 0.01f; // existing behavior: 0.01mm per click, occasionally step + //const float z_step = planner.steps_to_mm[Z_AXIS]; // approx one step each click + + move_z_with_encoder(z_step); + + if (click_and_hold()) { + SERIAL_ECHOLNPGM("\nMesh only partially populated."); + do_z_clearance(Z_CLEARANCE_DEPLOY_PROBE); + return restore_ubl_active_state_and_leave(); + } + + z_values[lpos.x][lpos.y] = current_position.z - thick; + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(location, z_values[lpos.x][lpos.y])); + + if (g29_verbose_level > 2) + SERIAL_ECHOLNPAIR_F("Mesh Point Measured at: ", z_values[lpos.x][lpos.y], 6); + SERIAL_FLUSH(); // Prevent host M105 buffer overrun. + } while (location.valid()); + + if (do_ubl_mesh_map) display_map(g29_map_type); // show user where we're probing + + restore_ubl_active_state_and_leave(); + do_blocking_move_to_xy_z(pos, Z_CLEARANCE_DEPLOY_PROBE); + } + + inline void set_message_with_feedback(PGM_P const msg_P) { + ui.set_status_P(msg_P); + ui.quick_feedback(); + } + + void abort_fine_tune() { + ui.return_to_status(); + do_z_clearance(Z_CLEARANCE_BETWEEN_PROBES); + set_message_with_feedback(GET_TEXT(MSG_EDITING_STOPPED)); + } + + void unified_bed_leveling::fine_tune_mesh(const xy_pos_t &pos, const bool do_ubl_mesh_map) { + if (!parser.seen('R')) // fine_tune_mesh() is special. If no repetition count flag is specified + g29_repetition_cnt = 1; // do exactly one mesh location. Otherwise use what the parser decided. + + #if ENABLED(UBL_MESH_EDIT_MOVES_Z) + const float h_offset = parser.seenval('H') ? parser.value_linear_units() : MANUAL_PROBE_START_Z; + if (!WITHIN(h_offset, 0, 10)) { + SERIAL_ECHOLNPGM("Offset out of bounds. (0 to 10mm)\n"); + return; + } + #endif + + mesh_index_pair location; + + if (!position_is_reachable(pos)) { + SERIAL_ECHOLNPGM("(X,Y) outside printable radius."); + return; + } + + save_ubl_active_state_and_disable(); + + LCD_MESSAGEPGM(MSG_UBL_FINE_TUNE_MESH); + ui.capture(); // Take over control of the LCD encoder + + do_blocking_move_to_xy_z(pos, Z_CLEARANCE_BETWEEN_PROBES); // Move to the given XY with probe clearance + + MeshFlags done_flags{0}; + const xy_int8_t &lpos = location.pos; + + #if IS_TFTGLCD_PANEL + lcd_mesh_edit_setup(0); // Change current screen before calling ui.ubl_plot + safe_delay(50); + #endif + + do { + location = find_closest_mesh_point_of_type(SET_IN_BITMAP, pos, false, &done_flags); + + if (lpos.x < 0) break; // Stop when there are no more reachable points + + done_flags.mark(lpos); // Mark this location as 'adjusted' so a new + // location is used on the next loop + const xyz_pos_t raw = { + mesh_index_to_xpos(lpos.x), + mesh_index_to_ypos(lpos.y), + Z_CLEARANCE_BETWEEN_PROBES + }; + + if (!position_is_reachable(raw)) break; // SHOULD NOT OCCUR (find_closest_mesh_point_of_type only returns reachable) + + do_blocking_move_to(raw); // Move the nozzle to the edit point with probe clearance + + TERN_(UBL_MESH_EDIT_MOVES_Z, do_blocking_move_to_z(h_offset)); // Move Z to the given 'H' offset before editing + + KEEPALIVE_STATE(PAUSED_FOR_USER); + + if (do_ubl_mesh_map) display_map(g29_map_type); // Display the current point + + #if IS_TFTGLCD_PANEL + ui.ubl_plot(lpos.x, lpos.y); // update plot screen #endif - struct linear_fit_data lsf_results; - incremental_LSF_reset(&lsf_results); + ui.refresh(); - if (do_3_pt_leveling) { - SERIAL_ECHOLNPGM("Tilting mesh (1/3)"); - TERN_(HAS_DISPLAY, ui.status_printf_P(0, PSTR(S_FMT " 1/3"), GET_TEXT(MSG_LCD_TILTING_MESH))); + float new_z = z_values[lpos.x][lpos.y]; + if (isnan(new_z)) new_z = 0; // Invalid points begin at 0 + new_z = FLOOR(new_z * 1000) * 0.001f; // Chop off digits after the 1000ths place - measured_z = probe.probe_at_point(points[0], PROBE_PT_RAISE, g29_verbose_level); + lcd_mesh_edit_setup(new_z); + + SET_SOFT_ENDSTOP_LOOSE(true); + + do { + idle(); + new_z = lcd_mesh_edit(); + TERN_(UBL_MESH_EDIT_MOVES_Z, do_blocking_move_to_z(h_offset + new_z)); // Move the nozzle as the point is edited + SERIAL_FLUSH(); // Prevent host M105 buffer overrun. + } while (!ui.button_pressed()); + + SET_SOFT_ENDSTOP_LOOSE(false); + + if (!lcd_map_control) ui.return_to_status(); // Just editing a single point? Return to status + + if (click_and_hold(abort_fine_tune)) break; // Button held down? Abort editing + + z_values[lpos.x][lpos.y] = new_z; // Save the updated Z value + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(location, new_z)); + + serial_delay(20); // No switch noise + ui.refresh(); + + } while (lpos.x >= 0 && --g29_repetition_cnt > 0); + + if (do_ubl_mesh_map) display_map(g29_map_type); + restore_ubl_active_state_and_leave(); + + do_blocking_move_to_xy_z(pos, Z_CLEARANCE_BETWEEN_PROBES); + + LCD_MESSAGEPGM(MSG_UBL_DONE_EDITING_MESH); + SERIAL_ECHOLNPGM("Done Editing Mesh"); + + if (lcd_map_control) + ui.goto_screen(ubl_map_screen); + else + ui.return_to_status(); + } + +#endif // HAS_LCD_MENU + +bool unified_bed_leveling::g29_parameter_parsing() { + bool err_flag = false; + + TERN_(HAS_LCD_MENU, set_message_with_feedback(GET_TEXT(MSG_UBL_DOING_G29))); + + g29_constant = 0; + g29_repetition_cnt = 0; + + if (parser.seen('R')) { + g29_repetition_cnt = parser.has_value() ? parser.value_int() : GRID_MAX_POINTS; + NOMORE(g29_repetition_cnt, GRID_MAX_POINTS); + if (g29_repetition_cnt < 1) { + SERIAL_ECHOLNPGM("?(R)epetition count invalid (1+).\n"); + return UBL_ERR; + } + } + + g29_verbose_level = parser.seen('V') ? parser.value_int() : 0; + if (!WITHIN(g29_verbose_level, 0, 4)) { + SERIAL_ECHOLNPGM("?(V)erbose level implausible (0-4).\n"); + err_flag = true; + } + + if (parser.seen('P')) { + const int pv = parser.value_int(); + #if !HAS_BED_PROBE + if (pv == 1) { + SERIAL_ECHOLNPGM("G29 P1 requires a probe.\n"); + err_flag = true; + } + else + #endif + { + g29_phase_value = pv; + if (!WITHIN(g29_phase_value, 0, 6)) { + SERIAL_ECHOLNPGM("?(P)hase value invalid (0-6).\n"); + err_flag = true; + } + } + } + + if (parser.seen('J')) { + #if HAS_BED_PROBE + g29_grid_size = parser.has_value() ? parser.value_int() : 0; + if (g29_grid_size && !WITHIN(g29_grid_size, 2, 9)) { + SERIAL_ECHOLNPGM("?Invalid grid size (J) specified (2-9).\n"); + err_flag = true; + } + #else + SERIAL_ECHOLNPGM("G29 J action requires a probe.\n"); + err_flag = true; + #endif + } + + xy_seen.x = parser.seenval('X'); + float sx = xy_seen.x ? parser.value_float() : current_position.x; + xy_seen.y = parser.seenval('Y'); + float sy = xy_seen.y ? parser.value_float() : current_position.y; + + if (xy_seen.x != xy_seen.y) { + SERIAL_ECHOLNPGM("Both X & Y locations must be specified.\n"); + err_flag = true; + } + + // If X or Y are not valid, use center of the bed values + if (!WITHIN(sx, X_MIN_BED, X_MAX_BED)) sx = X_CENTER; + if (!WITHIN(sy, Y_MIN_BED, Y_MAX_BED)) sy = Y_CENTER; + + if (err_flag) return UBL_ERR; + + g29_pos.set(sx, sy); + + /** + * Activate or deactivate UBL + * Note: UBL's G29 restores the state set here when done. + * Leveling is being enabled here with old data, possibly + * none. Error handling should disable for safety... + */ + if (parser.seen('A')) { + if (parser.seen('D')) { + SERIAL_ECHOLNPGM("?Can't activate and deactivate at the same time.\n"); + return UBL_ERR; + } + set_bed_leveling_enabled(true); + report_state(); + } + else if (parser.seen('D')) { + set_bed_leveling_enabled(false); + report_state(); + } + + // Set global 'C' flag and its value + if ((g29_c_flag = parser.seen('C'))) + g29_constant = parser.value_float(); + + #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) + if (parser.seenval('F')) { + const float fh = parser.value_float(); + if (!WITHIN(fh, 0, 100)) { + SERIAL_ECHOLNPGM("?(F)ade height for Bed Level Correction not plausible.\n"); + return UBL_ERR; + } + set_z_fade_height(fh); + } + #endif + + g29_map_type = parser.intval('T'); + if (!WITHIN(g29_map_type, 0, 2)) { + SERIAL_ECHOLNPGM("Invalid map type.\n"); + return UBL_ERR; + } + return UBL_OK; +} + +static uint8_t ubl_state_at_invocation = 0; + +#if ENABLED(UBL_DEVEL_DEBUGGING) + static uint8_t ubl_state_recursion_chk = 0; +#endif + +void unified_bed_leveling::save_ubl_active_state_and_disable() { + #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."); + TERN_(HAS_LCD_MENU, set_message_with_feedback(GET_TEXT(MSG_UBL_SAVE_ERROR))); + return; + } + #endif + ubl_state_at_invocation = planner.leveling_active; + set_bed_leveling_enabled(false); +} + +void unified_bed_leveling::restore_ubl_active_state_and_leave() { + TERN_(HAS_LCD_MENU, ui.release()); + #if ENABLED(UBL_DEVEL_DEBUGGING) + if (--ubl_state_recursion_chk) { + SERIAL_ECHOLNPGM("restore_ubl_active_state_and_leave() called too many times."); + TERN_(HAS_LCD_MENU, set_message_with_feedback(GET_TEXT(MSG_UBL_RESTORE_ERROR))); + return; + } + #endif + set_bed_leveling_enabled(ubl_state_at_invocation); +} + +mesh_index_pair unified_bed_leveling::find_furthest_invalid_mesh_point() { + + bool found_a_NAN = false, found_a_real = false; + + mesh_index_pair farthest { -1, -1, -99999.99 }; + + GRID_LOOP(i, j) { + if (!isnan(z_values[i][j])) continue; // Skip valid mesh points + + // Skip unreachable points + if (!probe.can_reach(mesh_index_to_xpos(i), mesh_index_to_ypos(j))) + continue; + + found_a_NAN = true; + + xy_int8_t nearby { -1, -1 }; + float d1, d2 = 99999.9f; + GRID_LOOP(k, l) { + if (isnan(z_values[k][l])) continue; + + found_a_real = true; + + // Add in a random weighting factor that scrambles the probing of the + // last half of the mesh (when every unprobed mesh point is one index + // from a probed location). + + d1 = HYPOT(i - k, j - l) + (1.0f / ((millis() % 47) + 13)); + + if (d1 < d2) { // Invalid mesh point (i,j) is closer to the defined point (k,l) + d2 = d1; + nearby.set(i, j); + } + } + + // + // At this point d2 should have the near defined mesh point to invalid mesh point (i,j) + // + + if (found_a_real && nearby.x >= 0 && d2 > farthest.distance) { + farthest.pos = nearby; // Found an invalid location farther from the defined mesh point + farthest.distance = d2; + } + } // GRID_LOOP + + if (!found_a_real && found_a_NAN) { // if the mesh is totally unpopulated, start the probing + farthest.pos.set((GRID_MAX_POINTS_X) / 2, (GRID_MAX_POINTS_Y) / 2); + farthest.distance = 1; + } + return farthest; +} + +mesh_index_pair unified_bed_leveling::find_closest_mesh_point_of_type(const MeshPointType type, const xy_pos_t &pos, const bool probe_relative/*=false*/, MeshFlags *done_flags/*=nullptr*/) { + mesh_index_pair closest; + closest.invalidate(); + closest.distance = -99999.9f; + + // Get the reference position, either nozzle or probe + const xy_pos_t ref = probe_relative ? pos + probe.offset_xy : pos; + + float best_so_far = 99999.99f; + + GRID_LOOP(i, j) { + if ( (type == (isnan(z_values[i][j]) ? INVALID : REAL)) + || (type == SET_IN_BITMAP && !done_flags->marked(i, j)) + ) { + // Found a Mesh Point of the specified type! + const xy_pos_t mpos = { mesh_index_to_xpos(i), mesh_index_to_ypos(j) }; + + // If using the probe as the reference there are some unreachable locations. + // Also for round beds, there are grid points outside the bed the nozzle can't reach. + // Prune them from the list and ignore them till the next Phase (manual nozzle probing). + + if (!(probe_relative ? probe.can_reach(mpos) : position_is_reachable(mpos))) + continue; + + // Reachable. Check if it's the best_so_far location to the nozzle. + + const xy_pos_t diff = current_position - mpos; + const float distance = (ref - mpos).magnitude() + diff.magnitude() * 0.1f; + + // factor in the distance from the current location for the normal case + // so the nozzle isn't running all over the bed. + if (distance < best_so_far) { + best_so_far = distance; // Found a closer location with the desired value type. + closest.pos.set(i, j); + closest.distance = best_so_far; + } + } + } // GRID_LOOP + + return closest; +} + +/** + * 'Smart Fill': Scan from the outward edges of the mesh towards the center. + * If an invalid location is found, use the next two points (if valid) to + * calculate a 'reasonable' value for the unprobed mesh point. + */ + +bool unified_bed_leveling::smart_fill_one(const uint8_t x, const uint8_t y, const int8_t xdir, const int8_t ydir) { + const float v = z_values[x][y]; + if (isnan(v)) { // A NAN... + const int8_t dx = x + xdir, dy = y + ydir; + const float v1 = z_values[dx][dy]; + if (!isnan(v1)) { // ...next to a pair of real values? + const float v2 = z_values[dx + xdir][dy + ydir]; + if (!isnan(v2)) { + z_values[x][y] = v1 < v2 ? v1 : v1 + v1 - v2; + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(x, y, z_values[x][y])); + return true; + } + } + } + return false; +} + +typedef struct { uint8_t sx, ex, sy, ey; bool yfirst; } smart_fill_info; + +void unified_bed_leveling::smart_fill_mesh() { + static const smart_fill_info + info0 PROGMEM = { 0, GRID_MAX_POINTS_X, 0, GRID_MAX_POINTS_Y - 2, false }, // Bottom of the mesh looking up + info1 PROGMEM = { 0, GRID_MAX_POINTS_X, GRID_MAX_POINTS_Y - 1, 0, false }, // Top of the mesh looking down + info2 PROGMEM = { 0, GRID_MAX_POINTS_X - 2, 0, GRID_MAX_POINTS_Y, true }, // Left side of the mesh looking right + info3 PROGMEM = { GRID_MAX_POINTS_X - 1, 0, 0, GRID_MAX_POINTS_Y, true }; // Right side of the mesh looking left + static const smart_fill_info * const info[] PROGMEM = { &info0, &info1, &info2, &info3 }; + + LOOP_L_N(i, COUNT(info)) { + const smart_fill_info *f = (smart_fill_info*)pgm_read_ptr(&info[i]); + const int8_t sx = pgm_read_byte(&f->sx), sy = pgm_read_byte(&f->sy), + ex = pgm_read_byte(&f->ex), ey = pgm_read_byte(&f->ey); + if (pgm_read_byte(&f->yfirst)) { + const int8_t dir = ex > sx ? 1 : -1; + for (uint8_t y = sy; y != ey; ++y) + for (uint8_t x = sx; x != ex; x += dir) + if (smart_fill_one(x, y, dir, 0)) break; + } + else { + const int8_t dir = ey > sy ? 1 : -1; + for (uint8_t x = sx; x != ex; ++x) + for (uint8_t y = sy; y != ey; y += dir) + if (smart_fill_one(x, y, 0, dir)) break; + } + } +} + +#if HAS_BED_PROBE + + //#define VALIDATE_MESH_TILT + + #include "../../../libs/vector_3.h" + + void unified_bed_leveling::tilt_mesh_based_on_probed_grid(const bool do_3_pt_leveling) { + const float x_min = probe.min_x(), x_max = probe.max_x(), + y_min = probe.min_y(), y_max = probe.max_y(), + dx = (x_max - x_min) / (g29_grid_size - 1), + dy = (y_max - y_min) / (g29_grid_size - 1); + + xy_float_t points[3]; + probe.get_three_points(points); + + float measured_z; + bool abort_flag = false; + + #ifdef VALIDATE_MESH_TILT + float z1, z2, z3; // Needed for algorithm validation below + #endif + + struct linear_fit_data lsf_results; + incremental_LSF_reset(&lsf_results); + + if (do_3_pt_leveling) { + SERIAL_ECHOLNPGM("Tilting mesh (1/3)"); + TERN_(HAS_DISPLAY, ui.status_printf_P(0, PSTR(S_FMT " 1/3"), GET_TEXT(MSG_LCD_TILTING_MESH))); + + measured_z = probe.probe_at_point(points[0], PROBE_PT_RAISE, g29_verbose_level); + if (isnan(measured_z)) + abort_flag = true; + else { + measured_z -= get_z_correction(points[0]); + #ifdef VALIDATE_MESH_TILT + z1 = measured_z; + #endif + if (g29_verbose_level > 3) { + serial_spaces(16); + SERIAL_ECHOLNPAIR("Corrected_Z=", measured_z); + } + incremental_LSF(&lsf_results, points[0], measured_z); + } + + if (!abort_flag) { + SERIAL_ECHOLNPGM("Tilting mesh (2/3)"); + TERN_(HAS_DISPLAY, ui.status_printf_P(0, PSTR(S_FMT " 2/3"), GET_TEXT(MSG_LCD_TILTING_MESH))); + + measured_z = probe.probe_at_point(points[1], PROBE_PT_RAISE, g29_verbose_level); + #ifdef VALIDATE_MESH_TILT + z2 = measured_z; + #endif if (isnan(measured_z)) abort_flag = true; else { - measured_z -= get_z_correction(points[0]); - #ifdef VALIDATE_MESH_TILT - z1 = measured_z; - #endif + measured_z -= get_z_correction(points[1]); if (g29_verbose_level > 3) { serial_spaces(16); SERIAL_ECHOLNPAIR("Corrected_Z=", measured_z); } - incremental_LSF(&lsf_results, points[0], measured_z); - } - - if (!abort_flag) { - SERIAL_ECHOLNPGM("Tilting mesh (2/3)"); - TERN_(HAS_DISPLAY, ui.status_printf_P(0, PSTR(S_FMT " 2/3"), GET_TEXT(MSG_LCD_TILTING_MESH))); - - measured_z = probe.probe_at_point(points[1], PROBE_PT_RAISE, g29_verbose_level); - #ifdef VALIDATE_MESH_TILT - z2 = measured_z; - #endif - if (isnan(measured_z)) - abort_flag = true; - else { - measured_z -= get_z_correction(points[1]); - if (g29_verbose_level > 3) { - serial_spaces(16); - SERIAL_ECHOLNPAIR("Corrected_Z=", measured_z); - } - incremental_LSF(&lsf_results, points[1], measured_z); - } - } - - if (!abort_flag) { - SERIAL_ECHOLNPGM("Tilting mesh (3/3)"); - TERN_(HAS_DISPLAY, ui.status_printf_P(0, PSTR(S_FMT " 3/3"), GET_TEXT(MSG_LCD_TILTING_MESH))); - - measured_z = probe.probe_at_point(points[2], PROBE_PT_STOW, g29_verbose_level); - #ifdef VALIDATE_MESH_TILT - z3 = measured_z; - #endif - if (isnan(measured_z)) - abort_flag = true; - else { - measured_z -= get_z_correction(points[2]); - if (g29_verbose_level > 3) { - serial_spaces(16); - SERIAL_ECHOLNPAIR("Corrected_Z=", measured_z); - } - incremental_LSF(&lsf_results, points[2], measured_z); - } - } - - probe.stow(); - probe.move_z_after_probing(); - - if (abort_flag) { - SERIAL_ECHOLNPGM("?Error probing point. Aborting operation."); - return; + incremental_LSF(&lsf_results, points[1], measured_z); } } - else { // !do_3_pt_leveling - bool zig_zag = false; + if (!abort_flag) { + SERIAL_ECHOLNPGM("Tilting mesh (3/3)"); + TERN_(HAS_DISPLAY, ui.status_printf_P(0, PSTR(S_FMT " 3/3"), GET_TEXT(MSG_LCD_TILTING_MESH))); - const uint16_t total_points = sq(g29_grid_size); - uint16_t point_num = 1; - - xy_pos_t rpos; - LOOP_L_N(ix, g29_grid_size) { - rpos.x = x_min + ix * dx; - LOOP_L_N(iy, g29_grid_size) { - rpos.y = y_min + dy * (zig_zag ? g29_grid_size - 1 - iy : iy); - - if (!abort_flag) { - SERIAL_ECHOLNPAIR("Tilting mesh point ", point_num, "/", total_points, "\n"); - TERN_(HAS_DISPLAY, ui.status_printf_P(0, PSTR(S_FMT " %i/%i"), GET_TEXT(MSG_LCD_TILTING_MESH), point_num, total_points)); - - measured_z = probe.probe_at_point(rpos, parser.seen('E') ? PROBE_PT_STOW : PROBE_PT_RAISE, g29_verbose_level); // TODO: Needs error handling - - abort_flag = isnan(measured_z); - - #if ENABLED(DEBUG_LEVELING_FEATURE) - if (DEBUGGING(LEVELING)) { - const xy_pos_t lpos = rpos.asLogical(); - DEBUG_CHAR('('); - DEBUG_ECHO_F(rpos.x, 7); - DEBUG_CHAR(','); - DEBUG_ECHO_F(rpos.y, 7); - DEBUG_ECHOPAIR_F(") logical: (", lpos.x, 7); - DEBUG_CHAR(','); - DEBUG_ECHO_F(lpos.y, 7); - DEBUG_ECHOPAIR_F(") measured: ", measured_z, 7); - DEBUG_ECHOPAIR_F(" correction: ", get_z_correction(rpos), 7); - } - #endif - - measured_z -= get_z_correction(rpos) /* + probe.offset.z */ ; - - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR_F(" final >>>---> ", measured_z, 7); - - if (g29_verbose_level > 3) { - serial_spaces(16); - SERIAL_ECHOLNPAIR("Corrected_Z=", measured_z); - } - incremental_LSF(&lsf_results, rpos, measured_z); - } - - point_num++; + measured_z = probe.probe_at_point(points[2], PROBE_PT_STOW, g29_verbose_level); + #ifdef VALIDATE_MESH_TILT + z3 = measured_z; + #endif + if (isnan(measured_z)) + abort_flag = true; + else { + measured_z -= get_z_correction(points[2]); + if (g29_verbose_level > 3) { + serial_spaces(16); + SERIAL_ECHOLNPAIR("Corrected_Z=", measured_z); } - - zig_zag ^= true; + incremental_LSF(&lsf_results, points[2], measured_z); } } + probe.stow(); probe.move_z_after_probing(); - if (abort_flag || finish_incremental_LSF(&lsf_results)) { - SERIAL_ECHOPGM("Could not complete LSF!"); + if (abort_flag) { + SERIAL_ECHOLNPGM("?Error probing point. Aborting operation."); return; } + } + else { // !do_3_pt_leveling - vector_3 normal = vector_3(lsf_results.A, lsf_results.B, 1).get_normal(); + bool zig_zag = false; - if (g29_verbose_level > 2) { - SERIAL_ECHOPAIR_F("bed plane normal = [", normal.x, 7); - SERIAL_CHAR(','); - SERIAL_ECHO_F(normal.y, 7); - SERIAL_CHAR(','); - SERIAL_ECHO_F(normal.z, 7); - SERIAL_ECHOLNPGM("]"); - } + const uint16_t total_points = sq(g29_grid_size); + uint16_t point_num = 1; - matrix_3x3 rotation = matrix_3x3::create_look_at(vector_3(lsf_results.A, lsf_results.B, 1)); + xy_pos_t rpos; + LOOP_L_N(ix, g29_grid_size) { + rpos.x = x_min + ix * dx; + LOOP_L_N(iy, g29_grid_size) { + rpos.y = y_min + dy * (zig_zag ? g29_grid_size - 1 - iy : iy); - GRID_LOOP(i, j) { - float mx = mesh_index_to_xpos(i), - my = mesh_index_to_ypos(j), - mz = z_values[i][j]; + if (!abort_flag) { + SERIAL_ECHOLNPAIR("Tilting mesh point ", point_num, "/", total_points, "\n"); + TERN_(HAS_DISPLAY, ui.status_printf_P(0, PSTR(S_FMT " %i/%i"), GET_TEXT(MSG_LCD_TILTING_MESH), point_num, total_points)); - if (DEBUGGING(LEVELING)) { - DEBUG_ECHOPAIR_F("before rotation = [", mx, 7); - DEBUG_CHAR(','); - DEBUG_ECHO_F(my, 7); - DEBUG_CHAR(','); - DEBUG_ECHO_F(mz, 7); - DEBUG_ECHOPGM("] ---> "); - DEBUG_DELAY(20); + measured_z = probe.probe_at_point(rpos, parser.seen('E') ? PROBE_PT_STOW : PROBE_PT_RAISE, g29_verbose_level); // TODO: Needs error handling + + abort_flag = isnan(measured_z); + + #if ENABLED(DEBUG_LEVELING_FEATURE) + if (DEBUGGING(LEVELING)) { + const xy_pos_t lpos = rpos.asLogical(); + DEBUG_CHAR('('); + DEBUG_ECHO_F(rpos.x, 7); + DEBUG_CHAR(','); + DEBUG_ECHO_F(rpos.y, 7); + DEBUG_ECHOPAIR_F(") logical: (", lpos.x, 7); + DEBUG_CHAR(','); + DEBUG_ECHO_F(lpos.y, 7); + DEBUG_ECHOPAIR_F(") measured: ", measured_z, 7); + DEBUG_ECHOPAIR_F(" correction: ", get_z_correction(rpos), 7); + } + #endif + + measured_z -= get_z_correction(rpos) /* + probe.offset.z */ ; + + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR_F(" final >>>---> ", measured_z, 7); + + if (g29_verbose_level > 3) { + serial_spaces(16); + SERIAL_ECHOLNPAIR("Corrected_Z=", measured_z); + } + incremental_LSF(&lsf_results, rpos, measured_z); + } + + point_num++; } - apply_rotation_xyz(rotation, mx, my, mz); - - if (DEBUGGING(LEVELING)) { - DEBUG_ECHOPAIR_F("after rotation = [", mx, 7); - DEBUG_CHAR(','); - DEBUG_ECHO_F(my, 7); - DEBUG_CHAR(','); - DEBUG_ECHO_F(mz, 7); - DEBUG_ECHOLNPGM("]"); - DEBUG_DELAY(20); - } - - z_values[i][j] = mz - lsf_results.D; - TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(i, j, z_values[i][j])); + zig_zag ^= true; } + } + probe.stow(); + probe.move_z_after_probing(); + + if (abort_flag || finish_incremental_LSF(&lsf_results)) { + SERIAL_ECHOPGM("Could not complete LSF!"); + return; + } + + vector_3 normal = vector_3(lsf_results.A, lsf_results.B, 1).get_normal(); + + if (g29_verbose_level > 2) { + SERIAL_ECHOPAIR_F("bed plane normal = [", normal.x, 7); + SERIAL_CHAR(','); + SERIAL_ECHO_F(normal.y, 7); + SERIAL_CHAR(','); + SERIAL_ECHO_F(normal.z, 7); + SERIAL_ECHOLNPGM("]"); + } + + matrix_3x3 rotation = matrix_3x3::create_look_at(vector_3(lsf_results.A, lsf_results.B, 1)); + + GRID_LOOP(i, j) { + float mx = mesh_index_to_xpos(i), + my = mesh_index_to_ypos(j), + mz = z_values[i][j]; if (DEBUGGING(LEVELING)) { - rotation.debug(PSTR("rotation matrix:\n")); - DEBUG_ECHOPAIR_F("LSF Results A=", lsf_results.A, 7); - DEBUG_ECHOPAIR_F(" B=", lsf_results.B, 7); - DEBUG_ECHOLNPAIR_F(" D=", lsf_results.D, 7); - DEBUG_DELAY(55); + DEBUG_ECHOPAIR_F("before rotation = [", mx, 7); + DEBUG_CHAR(','); + DEBUG_ECHO_F(my, 7); + DEBUG_CHAR(','); + DEBUG_ECHO_F(mz, 7); + DEBUG_ECHOPGM("] ---> "); + DEBUG_DELAY(20); + } - DEBUG_ECHOPAIR_F("bed plane normal = [", normal.x, 7); + apply_rotation_xyz(rotation, mx, my, mz); + + if (DEBUGGING(LEVELING)) { + DEBUG_ECHOPAIR_F("after rotation = [", mx, 7); DEBUG_CHAR(','); - DEBUG_ECHO_F(normal.y, 7); + DEBUG_ECHO_F(my, 7); DEBUG_CHAR(','); - DEBUG_ECHO_F(normal.z, 7); + DEBUG_ECHO_F(mz, 7); DEBUG_ECHOLNPGM("]"); - DEBUG_EOL(); - - /** - * Use the code below to check the validity of the mesh tilting algorithm. - * 3-Point Mesh Tilt uses the same algorithm as grid-based tilting, but only - * three points are used in the calculation. This guarantees that each probed point - * has an exact match when get_z_correction() for that location is calculated. - * The Z error between the probed point locations and the get_z_correction() - * numbers for those locations should be 0. - */ - #ifdef VALIDATE_MESH_TILT - auto d_from = []{ DEBUG_ECHOPGM("D from "); }; - auto normed = [&](const xy_pos_t &pos, const float &zadd) { - return normal.x * pos.x + normal.y * pos.y + zadd; - }; - auto debug_pt = [](PGM_P const pre, const xy_pos_t &pos, const float &zadd) { - d_from(); serialprintPGM(pre); - DEBUG_ECHO_F(normed(pos, zadd), 6); - DEBUG_ECHOLNPAIR_F(" Z error = ", zadd - get_z_correction(pos), 6); - }; - debug_pt(PSTR("1st point: "), probe_pt[0], normal.z * z1); - debug_pt(PSTR("2nd point: "), probe_pt[1], normal.z * z2); - debug_pt(PSTR("3rd point: "), probe_pt[2], normal.z * z3); - d_from(); DEBUG_ECHOPGM("safe home with Z="); - DEBUG_ECHOLNPAIR_F("0 : ", normed(safe_homing_xy, 0), 6); - d_from(); DEBUG_ECHOPGM("safe home with Z="); - DEBUG_ECHOLNPAIR_F("mesh value ", normed(safe_homing_xy, get_z_correction(safe_homing_xy)), 6); - DEBUG_ECHOPAIR(" Z error = (", Z_SAFE_HOMING_X_POINT, ",", Z_SAFE_HOMING_Y_POINT); - DEBUG_ECHOLNPAIR_F(") = ", get_z_correction(safe_homing_xy), 6); - #endif - } // DEBUGGING(LEVELING) + DEBUG_DELAY(20); + } + z_values[i][j] = mz - lsf_results.D; + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(i, j, z_values[i][j])); } - #endif // HAS_BED_PROBE + if (DEBUGGING(LEVELING)) { + rotation.debug(PSTR("rotation matrix:\n")); + DEBUG_ECHOPAIR_F("LSF Results A=", lsf_results.A, 7); + DEBUG_ECHOPAIR_F(" B=", lsf_results.B, 7); + DEBUG_ECHOLNPAIR_F(" D=", lsf_results.D, 7); + DEBUG_DELAY(55); - #if ENABLED(UBL_G29_P31) - void unified_bed_leveling::smart_fill_wlsf(const float &weight_factor) { + DEBUG_ECHOPAIR_F("bed plane normal = [", normal.x, 7); + DEBUG_CHAR(','); + DEBUG_ECHO_F(normal.y, 7); + DEBUG_CHAR(','); + DEBUG_ECHO_F(normal.z, 7); + DEBUG_ECHOLNPGM("]"); + DEBUG_EOL(); - // For each undefined mesh point, compute a distance-weighted least squares fit - // from all the originally populated mesh points, weighted toward the point - // being extrapolated so that nearby points will have greater influence on - // the point being extrapolated. Then extrapolate the mesh point from WLSF. + /** + * Use the code below to check the validity of the mesh tilting algorithm. + * 3-Point Mesh Tilt uses the same algorithm as grid-based tilting, but only + * three points are used in the calculation. This guarantees that each probed point + * has an exact match when get_z_correction() for that location is calculated. + * The Z error between the probed point locations and the get_z_correction() + * numbers for those locations should be 0. + */ + #ifdef VALIDATE_MESH_TILT + auto d_from = []{ DEBUG_ECHOPGM("D from "); }; + auto normed = [&](const xy_pos_t &pos, const float &zadd) { + return normal.x * pos.x + normal.y * pos.y + zadd; + }; + auto debug_pt = [](PGM_P const pre, const xy_pos_t &pos, const float &zadd) { + d_from(); serialprintPGM(pre); + DEBUG_ECHO_F(normed(pos, zadd), 6); + DEBUG_ECHOLNPAIR_F(" Z error = ", zadd - get_z_correction(pos), 6); + }; + debug_pt(PSTR("1st point: "), probe_pt[0], normal.z * z1); + debug_pt(PSTR("2nd point: "), probe_pt[1], normal.z * z2); + debug_pt(PSTR("3rd point: "), probe_pt[2], normal.z * z3); + d_from(); DEBUG_ECHOPGM("safe home with Z="); + DEBUG_ECHOLNPAIR_F("0 : ", normed(safe_homing_xy, 0), 6); + d_from(); DEBUG_ECHOPGM("safe home with Z="); + DEBUG_ECHOLNPAIR_F("mesh value ", normed(safe_homing_xy, get_z_correction(safe_homing_xy)), 6); + DEBUG_ECHOPAIR(" Z error = (", Z_SAFE_HOMING_X_POINT, ",", Z_SAFE_HOMING_Y_POINT); + DEBUG_ECHOLNPAIR_F(") = ", get_z_correction(safe_homing_xy), 6); + #endif + } // DEBUGGING(LEVELING) - static_assert((GRID_MAX_POINTS_Y) <= 16, "GRID_MAX_POINTS_Y too big"); - uint16_t bitmap[GRID_MAX_POINTS_X] = { 0 }; - struct linear_fit_data lsf_results; + } - SERIAL_ECHOPGM("Extrapolating mesh..."); +#endif // HAS_BED_PROBE - const float weight_scaled = weight_factor * _MAX(MESH_X_DIST, MESH_Y_DIST); +#if ENABLED(UBL_G29_P31) + void unified_bed_leveling::smart_fill_wlsf(const float &weight_factor) { - GRID_LOOP(jx, jy) if (!isnan(z_values[jx][jy])) SBI(bitmap[jx], jy); + // For each undefined mesh point, compute a distance-weighted least squares fit + // from all the originally populated mesh points, weighted toward the point + // being extrapolated so that nearby points will have greater influence on + // the point being extrapolated. Then extrapolate the mesh point from WLSF. - xy_pos_t ppos; - LOOP_L_N(ix, GRID_MAX_POINTS_X) { - ppos.x = mesh_index_to_xpos(ix); - LOOP_L_N(iy, GRID_MAX_POINTS_Y) { - ppos.y = mesh_index_to_ypos(iy); - if (isnan(z_values[ix][iy])) { - // undefined mesh point at (ppos.x,ppos.y), compute weighted LSF from original valid mesh points. - incremental_LSF_reset(&lsf_results); - xy_pos_t rpos; - LOOP_L_N(jx, GRID_MAX_POINTS_X) { - rpos.x = mesh_index_to_xpos(jx); - LOOP_L_N(jy, GRID_MAX_POINTS_Y) { - if (TEST(bitmap[jx], jy)) { - rpos.y = mesh_index_to_ypos(jy); - const float rz = z_values[jx][jy], - w = 1.0f + weight_scaled / (rpos - ppos).magnitude(); - incremental_WLSF(&lsf_results, rpos, rz, w); - } + static_assert((GRID_MAX_POINTS_Y) <= 16, "GRID_MAX_POINTS_Y too big"); + uint16_t bitmap[GRID_MAX_POINTS_X] = { 0 }; + struct linear_fit_data lsf_results; + + SERIAL_ECHOPGM("Extrapolating mesh..."); + + const float weight_scaled = weight_factor * _MAX(MESH_X_DIST, MESH_Y_DIST); + + GRID_LOOP(jx, jy) if (!isnan(z_values[jx][jy])) SBI(bitmap[jx], jy); + + xy_pos_t ppos; + LOOP_L_N(ix, GRID_MAX_POINTS_X) { + ppos.x = mesh_index_to_xpos(ix); + LOOP_L_N(iy, GRID_MAX_POINTS_Y) { + ppos.y = mesh_index_to_ypos(iy); + if (isnan(z_values[ix][iy])) { + // undefined mesh point at (ppos.x,ppos.y), compute weighted LSF from original valid mesh points. + incremental_LSF_reset(&lsf_results); + xy_pos_t rpos; + LOOP_L_N(jx, GRID_MAX_POINTS_X) { + rpos.x = mesh_index_to_xpos(jx); + LOOP_L_N(jy, GRID_MAX_POINTS_Y) { + if (TEST(bitmap[jx], jy)) { + rpos.y = mesh_index_to_ypos(jy); + const float rz = z_values[jx][jy], + w = 1.0f + weight_scaled / (rpos - ppos).magnitude(); + incremental_WLSF(&lsf_results, rpos, rz, w); } } - if (finish_incremental_LSF(&lsf_results)) { - SERIAL_ECHOLNPGM("Insufficient data"); - return; - } - const float ez = -lsf_results.D - lsf_results.A * ppos.x - lsf_results.B * ppos.y; - z_values[ix][iy] = ez; - TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(ix, iy, z_values[ix][iy])); - idle(); // housekeeping } + if (finish_incremental_LSF(&lsf_results)) { + SERIAL_ECHOLNPGM("Insufficient data"); + return; + } + const float ez = -lsf_results.D - lsf_results.A * ppos.x - lsf_results.B * ppos.y; + z_values[ix][iy] = ez; + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(ix, iy, z_values[ix][iy])); + idle(); // housekeeping } } - - SERIAL_ECHOLNPGM("done"); } - #endif // UBL_G29_P31 - #if ENABLED(UBL_DEVEL_DEBUGGING) - /** - * Much of the 'What?' command can be eliminated. But until we are fully debugged, it is - * good to have the extra information. Soon... we prune this to just a few items - */ - void unified_bed_leveling::g29_what_command() { - report_state(); + SERIAL_ECHOLNPGM("done"); + } +#endif // UBL_G29_P31 - if (storage_slot == -1) - SERIAL_ECHOPGM("No Mesh Loaded."); - else - SERIAL_ECHOPAIR("Mesh ", storage_slot, " Loaded."); - SERIAL_EOL(); +#if ENABLED(UBL_DEVEL_DEBUGGING) + /** + * Much of the 'What?' command can be eliminated. But until we are fully debugged, it is + * good to have the extra information. Soon... we prune this to just a few items + */ + void unified_bed_leveling::g29_what_command() { + report_state(); + + if (storage_slot == -1) + SERIAL_ECHOPGM("No Mesh Loaded."); + else + SERIAL_ECHOPAIR("Mesh ", storage_slot, " Loaded."); + SERIAL_EOL(); + serial_delay(50); + + #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) + SERIAL_ECHOLNPAIR_F("Fade Height M420 Z", planner.z_fade_height, 4); + #endif + + adjust_mesh_to_mean(g29_c_flag, g29_constant); + + #if HAS_BED_PROBE + SERIAL_ECHOLNPAIR_F("Probe Offset M851 Z", probe.offset.z, 7); + #endif + + SERIAL_ECHOLNPAIR("MESH_MIN_X " STRINGIFY(MESH_MIN_X) "=", MESH_MIN_X); serial_delay(50); + SERIAL_ECHOLNPAIR("MESH_MIN_Y " STRINGIFY(MESH_MIN_Y) "=", MESH_MIN_Y); serial_delay(50); + SERIAL_ECHOLNPAIR("MESH_MAX_X " STRINGIFY(MESH_MAX_X) "=", MESH_MAX_X); serial_delay(50); + SERIAL_ECHOLNPAIR("MESH_MAX_Y " STRINGIFY(MESH_MAX_Y) "=", MESH_MAX_Y); serial_delay(50); + SERIAL_ECHOLNPAIR("GRID_MAX_POINTS_X ", GRID_MAX_POINTS_X); serial_delay(50); + SERIAL_ECHOLNPAIR("GRID_MAX_POINTS_Y ", GRID_MAX_POINTS_Y); serial_delay(50); + SERIAL_ECHOLNPAIR("MESH_X_DIST ", MESH_X_DIST); + SERIAL_ECHOLNPAIR("MESH_Y_DIST ", MESH_Y_DIST); serial_delay(50); + + SERIAL_ECHOPGM("X-Axis Mesh Points at: "); + LOOP_L_N(i, GRID_MAX_POINTS_X) { + SERIAL_ECHO_F(LOGICAL_X_POSITION(mesh_index_to_xpos(i)), 3); + SERIAL_ECHOPGM(" "); + serial_delay(25); + } + SERIAL_EOL(); + + SERIAL_ECHOPGM("Y-Axis Mesh Points at: "); + LOOP_L_N(i, GRID_MAX_POINTS_Y) { + SERIAL_ECHO_F(LOGICAL_Y_POSITION(mesh_index_to_ypos(i)), 3); + SERIAL_ECHOPGM(" "); + serial_delay(25); + } + SERIAL_EOL(); + + #if HAS_KILL + SERIAL_ECHOLNPAIR("Kill pin on :", KILL_PIN, " state:", kill_state()); + #endif + + SERIAL_EOL(); + serial_delay(50); + + #if ENABLED(UBL_DEVEL_DEBUGGING) + SERIAL_ECHOLNPAIR("ubl_state_at_invocation :", ubl_state_at_invocation, "\nubl_state_recursion_chk :", ubl_state_recursion_chk); serial_delay(50); - #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) - SERIAL_ECHOLNPAIR_F("Fade Height M420 Z", planner.z_fade_height, 4); - #endif - - adjust_mesh_to_mean(g29_c_flag, g29_constant); - - #if HAS_BED_PROBE - SERIAL_ECHOLNPAIR_F("Probe Offset M851 Z", probe.offset.z, 7); - #endif - - SERIAL_ECHOLNPAIR("MESH_MIN_X " STRINGIFY(MESH_MIN_X) "=", MESH_MIN_X); serial_delay(50); - SERIAL_ECHOLNPAIR("MESH_MIN_Y " STRINGIFY(MESH_MIN_Y) "=", MESH_MIN_Y); serial_delay(50); - SERIAL_ECHOLNPAIR("MESH_MAX_X " STRINGIFY(MESH_MAX_X) "=", MESH_MAX_X); serial_delay(50); - SERIAL_ECHOLNPAIR("MESH_MAX_Y " STRINGIFY(MESH_MAX_Y) "=", MESH_MAX_Y); serial_delay(50); - SERIAL_ECHOLNPAIR("GRID_MAX_POINTS_X ", GRID_MAX_POINTS_X); serial_delay(50); - SERIAL_ECHOLNPAIR("GRID_MAX_POINTS_Y ", GRID_MAX_POINTS_Y); serial_delay(50); - SERIAL_ECHOLNPAIR("MESH_X_DIST ", MESH_X_DIST); - SERIAL_ECHOLNPAIR("MESH_Y_DIST ", MESH_Y_DIST); serial_delay(50); - - SERIAL_ECHOPGM("X-Axis Mesh Points at: "); - LOOP_L_N(i, GRID_MAX_POINTS_X) { - SERIAL_ECHO_F(LOGICAL_X_POSITION(mesh_index_to_xpos(i)), 3); - SERIAL_ECHOPGM(" "); - serial_delay(25); - } - SERIAL_EOL(); - - SERIAL_ECHOPGM("Y-Axis Mesh Points at: "); - LOOP_L_N(i, GRID_MAX_POINTS_Y) { - SERIAL_ECHO_F(LOGICAL_Y_POSITION(mesh_index_to_ypos(i)), 3); - SERIAL_ECHOPGM(" "); - serial_delay(25); - } - SERIAL_EOL(); - - #if HAS_KILL - SERIAL_ECHOLNPAIR("Kill pin on :", KILL_PIN, " state:", kill_state()); - #endif - - SERIAL_EOL(); + SERIAL_ECHOLNPAIR("Meshes go from ", hex_address((void*)settings.meshes_start_index()), " to ", hex_address((void*)settings.meshes_end_index())); serial_delay(50); - #if ENABLED(UBL_DEVEL_DEBUGGING) - SERIAL_ECHOLNPAIR("ubl_state_at_invocation :", ubl_state_at_invocation, "\nubl_state_recursion_chk :", ubl_state_recursion_chk); - serial_delay(50); + SERIAL_ECHOLNPAIR("sizeof(ubl) : ", sizeof(ubl)); SERIAL_EOL(); + SERIAL_ECHOLNPAIR("z_value[][] size: ", sizeof(z_values)); SERIAL_EOL(); + serial_delay(25); - SERIAL_ECHOLNPAIR("Meshes go from ", hex_address((void*)settings.meshes_start_index()), " to ", hex_address((void*)settings.meshes_end_index())); - serial_delay(50); + SERIAL_ECHOLNPAIR("EEPROM free for UBL: ", hex_address((void*)(settings.meshes_end_index() - settings.meshes_start_index()))); + serial_delay(50); - SERIAL_ECHOLNPAIR("sizeof(ubl) : ", sizeof(ubl)); SERIAL_EOL(); - SERIAL_ECHOLNPAIR("z_value[][] size: ", sizeof(z_values)); SERIAL_EOL(); - serial_delay(25); + SERIAL_ECHOLNPAIR("EEPROM can hold ", settings.calc_num_meshes(), " meshes.\n"); + serial_delay(25); + #endif // UBL_DEVEL_DEBUGGING - SERIAL_ECHOLNPAIR("EEPROM free for UBL: ", hex_address((void*)(settings.meshes_end_index() - settings.meshes_start_index()))); - serial_delay(50); - - SERIAL_ECHOLNPAIR("EEPROM can hold ", settings.calc_num_meshes(), " meshes.\n"); - serial_delay(25); - #endif // UBL_DEVEL_DEBUGGING - - if (!sanity_check()) { - echo_name(); - SERIAL_ECHOLNPGM(" sanity checks passed."); - } + if (!sanity_check()) { + echo_name(); + SERIAL_ECHOLNPGM(" sanity checks passed."); } + } - /** - * When we are fully debugged, the EEPROM dump command will get deleted also. But - * right now, it is good to have the extra information. Soon... we prune this. - */ - void unified_bed_leveling::g29_eeprom_dump() { - uint8_t cccc; + /** + * When we are fully debugged, the EEPROM dump command will get deleted also. But + * right now, it is good to have the extra information. Soon... we prune this. + */ + void unified_bed_leveling::g29_eeprom_dump() { + uint8_t cccc; - SERIAL_ECHO_MSG("EEPROM Dump:"); - persistentStore.access_start(); - for (uint16_t i = 0; i < persistentStore.capacity(); i += 16) { - if (!(i & 0x3)) idle(); - print_hex_word(i); - SERIAL_ECHOPGM(": "); - for (uint16_t j = 0; j < 16; j++) { - persistentStore.read_data(i + j, &cccc, sizeof(uint8_t)); - print_hex_byte(cccc); - SERIAL_CHAR(' '); - } - SERIAL_EOL(); + SERIAL_ECHO_MSG("EEPROM Dump:"); + persistentStore.access_start(); + for (uint16_t i = 0; i < persistentStore.capacity(); i += 16) { + if (!(i & 0x3)) idle(); + print_hex_word(i); + SERIAL_ECHOPGM(": "); + for (uint16_t j = 0; j < 16; j++) { + persistentStore.read_data(i + j, &cccc, sizeof(uint8_t)); + print_hex_byte(cccc); + SERIAL_CHAR(' '); } SERIAL_EOL(); - persistentStore.access_finish(); + } + SERIAL_EOL(); + persistentStore.access_finish(); + } + + /** + * When we are fully debugged, this may go away. But there are some valid + * use cases for the users. So we can wait and see what to do with it. + */ + void unified_bed_leveling::g29_compare_current_mesh_to_stored_mesh() { + const int16_t a = settings.calc_num_meshes(); + + if (!a) { + SERIAL_ECHOLNPGM("?EEPROM storage not available."); + return; } - /** - * When we are fully debugged, this may go away. But there are some valid - * use cases for the users. So we can wait and see what to do with it. - */ - void unified_bed_leveling::g29_compare_current_mesh_to_stored_mesh() { - const int16_t a = settings.calc_num_meshes(); - - if (!a) { - SERIAL_ECHOLNPGM("?EEPROM storage not available."); - return; - } - - if (!parser.has_value() || !WITHIN(g29_storage_slot, 0, a - 1)) { - SERIAL_ECHOLNPAIR("?Invalid storage slot.\n?Use 0 to ", a - 1); - return; - } - - g29_storage_slot = parser.value_int(); - - float tmp_z_values[GRID_MAX_POINTS_X][GRID_MAX_POINTS_Y]; - settings.load_mesh(g29_storage_slot, &tmp_z_values); - - SERIAL_ECHOLNPAIR("Subtracting mesh in slot ", g29_storage_slot, " from current mesh."); - - GRID_LOOP(x, y) { - z_values[x][y] -= tmp_z_values[x][y]; - TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(x, y, z_values[x][y])); - } + if (!parser.has_value() || !WITHIN(g29_storage_slot, 0, a - 1)) { + SERIAL_ECHOLNPAIR("?Invalid storage slot.\n?Use 0 to ", a - 1); + return; } - #endif // UBL_DEVEL_DEBUGGING + g29_storage_slot = parser.value_int(); + + float tmp_z_values[GRID_MAX_POINTS_X][GRID_MAX_POINTS_Y]; + settings.load_mesh(g29_storage_slot, &tmp_z_values); + + SERIAL_ECHOLNPAIR("Subtracting mesh in slot ", g29_storage_slot, " from current mesh."); + + GRID_LOOP(x, y) { + z_values[x][y] -= tmp_z_values[x][y]; + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(x, y, z_values[x][y])); + } + } + +#endif // UBL_DEVEL_DEBUGGING #endif // AUTO_BED_LEVELING_UBL From 37e2250992a2b65ef41b314403b5dc9d8a5fbbd7 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Wed, 24 Feb 2021 00:12:40 +0000 Subject: [PATCH 012/253] [cron] Bump distribution date (2021-02-24) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 6a54df87a8..ca3f0c1867 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2021-02-23" + #define STRING_DISTRIBUTION_DATE "2021-02-24" #endif /** From b276a7fd172638ea3b8fe0a601a41d76f1e8cb8d Mon Sep 17 00:00:00 2001 From: Nick Date: Wed, 24 Feb 2021 02:13:24 +0000 Subject: [PATCH 013/253] Fix Chiron TFT serial comms (#21152) --- Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp | 6 +++--- .../sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_host_INLINE.h | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp index 61057b5b10..c50de1c0a1 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp @@ -292,7 +292,7 @@ namespace Anycubic { #if ACDEBUG(AC_SOME) serialprintPGM(str); #endif - while (const char c = pgm_read_byte(str++)) TFTSer.print(c); + while (const char c = pgm_read_byte(str++)) TFTSer.write(c); } void ChironTFT::SendtoTFTLN(PGM_P str = nullptr) { @@ -305,7 +305,7 @@ namespace Anycubic { SERIAL_EOL(); #endif } - TFTSer.println(""); + TFTSer.println(); } bool ChironTFT::ReadTFTCommand() { @@ -840,7 +840,7 @@ namespace Anycubic { // Ignore request if printing //if (isPrinting()) break; //injectCommands_P(PSTR("M500\nM420 S1\nG1 Z10 F240\nG1 X0 Y0 F6000")); - //TFTSer.println(""); + //TFTSer.println(); } break; // A33 firmware info request seet PanelInfo() diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_host_INLINE.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_host_INLINE.h index 9c7b5001c0..4ab1a6b8f9 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_host_INLINE.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_host_INLINE.h @@ -984,7 +984,7 @@ uint8_t UHS_USB_HOST_BASE::ctrlReq(uint8_t addr, uint64_t Request, uint16_t nbyt //bool direction = bmReqType & 0x80; //request direction, IN or OUT uint8_t rcode = 0; - // Serial.println(""); + //Serial.println(); UHS_EpInfo *pep = ctrlReqOpen(addr, Request, dataptr); if(!pep) { HOST_DEBUG("ctrlReq1: ERROR_NULL_EPINFO addr: %d\r\n", addr); From 03160719eb3d9ed31115956946826cb3b08babbc Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Thu, 25 Feb 2021 00:12:36 +0000 Subject: [PATCH 014/253] [cron] Bump distribution date (2021-02-25) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index ca3f0c1867..52a2c8790c 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2021-02-24" + #define STRING_DISTRIBUTION_DATE "2021-02-25" #endif /** From a3a10b62f21cfbedfd001746faa46ac55d248b36 Mon Sep 17 00:00:00 2001 From: Ken Sanislo Date: Wed, 24 Feb 2021 16:26:51 -0800 Subject: [PATCH 015/253] Chamber Heater PID (#21156) Co-authored-by: Scott Lahteine --- Marlin/Configuration.h | 55 ++- Marlin/Configuration_adv.h | 17 +- Marlin/src/core/language.h | 2 +- .../src/feature/leds/printer_event_leds.cpp | 13 + Marlin/src/feature/leds/printer_event_leds.h | 7 +- Marlin/src/gcode/config/M309.cpp | 48 +++ Marlin/src/gcode/gcode.cpp | 4 + Marlin/src/gcode/gcode.h | 3 + Marlin/src/gcode/temp/M303.cpp | 37 +- Marlin/src/inc/Conditionals_post.h | 21 +- Marlin/src/inc/SanityCheck.h | 7 + Marlin/src/lcd/menu/menu_advanced.cpp | 79 ++-- Marlin/src/module/settings.cpp | 61 ++- Marlin/src/module/temperature.cpp | 380 ++++++++++-------- Marlin/src/module/temperature.h | 21 +- 15 files changed, 519 insertions(+), 236 deletions(-) create mode 100644 Marlin/src/gcode/config/M309.cpp diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 3234a73eda..1c98168236 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -447,6 +447,10 @@ #define TEMP_BED_WINDOW 1 // (°C) Temperature proximity for the "temperature reached" timer #define TEMP_BED_HYSTERESIS 3 // (°C) Temperature proximity considered "close enough" to the target +#define TEMP_CHAMBER_RESIDENCY_TIME 10 // (seconds) Time to wait for chamber to "settle" in M191 +#define TEMP_CHAMBER_WINDOW 1 // (°C) Temperature proximity for the "temperature reached" timer +#define TEMP_CHAMBER_HYSTERESIS 3 // (°C) Temperature proximity considered "close enough" to the target + // Below this temperature the heater will be switched off // because it probably indicates a broken thermistor wire. #define HEATER_0_MINTEMP 5 @@ -458,6 +462,7 @@ #define HEATER_6_MINTEMP 5 #define HEATER_7_MINTEMP 5 #define BED_MINTEMP 5 +#define CHAMBER_MINTEMP 5 // Above this temperature the heater will be switched off. // This can protect components from overheating, but NOT from shorts and failures. @@ -471,6 +476,7 @@ #define HEATER_6_MAXTEMP 275 #define HEATER_7_MAXTEMP 275 #define BED_MAXTEMP 150 +#define CHAMBER_MAXTEMP 60 //=========================================================================== //============================= PID Settings ================================ @@ -544,7 +550,52 @@ // FIND YOUR OWN: "M303 E-1 C8 S90" to run autotune on the bed at 90 degreesC for 8 cycles. #endif // PIDTEMPBED -#if EITHER(PIDTEMP, PIDTEMPBED) +//=========================================================================== +//==================== PID > Chamber Temperature Control ==================== +//=========================================================================== + +/** + * PID Chamber Heating + * + * If this option is enabled set PID constants below. + * If this option is disabled, bang-bang will be used and CHAMBER_LIMIT_SWITCHING will enable + * hysteresis. + * + * The PID frequency will be the same as the extruder PWM. + * If PID_dT is the default, and correct for the hardware/configuration, that means 7.689Hz, + * which is fine for driving a square wave into a resistive load and does not significantly + * impact FET heating. This also works fine on a Fotek SSR-10DA Solid State Relay into a 200W + * heater. If your configuration is significantly different than this and you don't understand + * the issues involved, don't use chamber PID until someone else verifies that your hardware works. + */ +//#define PIDTEMPCHAMBER + +//#define CHAMBER_LIMIT_SWITCHING + +/** + * Max Chamber Power + * Applies to all forms of chamber control (PID, bang-bang, and bang-bang with hysteresis). + * When set to any value below 255, enables a form of PWM to the chamber heater that acts like a divider + * so don't use it unless you are OK with PWM on your heater. (See the comment on enabling PIDTEMPCHAMBER) + */ +#define MAX_CHAMBER_POWER 255 // limits duty cycle to chamber heater; 255=full current + +#if ENABLED(PIDTEMPCHAMBER) + #define MIN_CHAMBER_POWER 0 + //#define PID_CHAMBER_DEBUG // Sends debug data to the serial port. + + // Lasko "MyHeat Personal Heater" (200w) modified with a Fotek SSR-10DA to control only the heating element + // and placed inside the small Creality printer enclosure tent. + // + #define DEFAULT_chamberKp 37.04 + #define DEFAULT_chamberKi 1.40 + #define DEFAULT_chamberKd 655.17 + // M309 P37.04 I1.04 D655.17 + + // FIND YOUR OWN: "M303 E-2 C8 S50" to run autotune on the chamber at 50 degreesC for 8 cycles. +#endif // PIDTEMPCHAMBER + +#if ANY(PIDTEMP, PIDTEMPBED, PIDTEMPCHAMBER) //#define PID_DEBUG // Sends debug data to the serial port. Use 'M303 D' to toggle activation. //#define PID_OPENLOOP // Puts PID in open loop. M104/M140 sets the output power from 0 to PID_MAX //#define SLOW_PWM_HEATERS // PWM with very low frequency (roughly 0.125Hz=8s) and minimum state time of approximately 1s useful for heaters driven by a relay @@ -1624,11 +1675,13 @@ #define PREHEAT_1_LABEL "PLA" #define PREHEAT_1_TEMP_HOTEND 180 #define PREHEAT_1_TEMP_BED 70 +#define PREHEAT_1_TEMP_CHAMBER 35 #define PREHEAT_1_FAN_SPEED 0 // Value from 0 to 255 #define PREHEAT_2_LABEL "ABS" #define PREHEAT_2_TEMP_HOTEND 240 #define PREHEAT_2_TEMP_BED 110 +#define PREHEAT_2_TEMP_CHAMBER 35 #define PREHEAT_2_FAN_SPEED 0 // Value from 0 to 255 /** diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 987ac293b2..50f17d1b9e 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -143,12 +143,19 @@ // // Heated Chamber options // +#if DISABLED(PIDTEMPCHAMBER) + #define CHAMBER_CHECK_INTERVAL 5000 // (ms) Interval between checks in bang-bang control + #if ENABLED(CHAMBER_LIMIT_SWITCHING) + #define CHAMBER_HYSTERESIS 2 // (°C) Only set the relevant heater state when ABS(T-target) > CHAMBER_HYSTERESIS + #endif +#endif + #if TEMP_SENSOR_CHAMBER - #define CHAMBER_MINTEMP 5 - #define CHAMBER_MAXTEMP 60 - #define TEMP_CHAMBER_HYSTERESIS 1 // (°C) Temperature proximity considered "close enough" to the target - //#define CHAMBER_LIMIT_SWITCHING - //#define HEATER_CHAMBER_PIN 44 // Chamber heater on/off pin + // Make sure you define where your heater is connected, the following works on a BTT SKR 1.4 Turbo + // using the secondary tool heater output. (FAN1 by default). + //#define FAN1_PIN -1 // Remove the fan signal on pin P2_04 (SKR 1.4 Turbo specific) + //#define HEATER_CHAMBER_PIN P2_04 // Chamber heater on/off pin (HE1 connector on SKR 1.4 Turbo) + //#define HEATER_CHAMBER_INVERTING false //#define CHAMBER_FAN // Enable a fan on the chamber diff --git a/Marlin/src/core/language.h b/Marlin/src/core/language.h index 923ad903cb..6024e9be3e 100644 --- a/Marlin/src/core/language.h +++ b/Marlin/src/core/language.h @@ -221,7 +221,7 @@ // temperature.cpp strings #define STR_PID_AUTOTUNE_START "PID Autotune start" -#define STR_PID_BAD_EXTRUDER_NUM "PID Autotune failed! Bad extruder number" +#define STR_PID_BAD_HEATER_ID "PID Autotune failed! Bad heater id" #define STR_PID_TEMP_TOO_HIGH "PID Autotune failed! Temperature too high" #define STR_PID_TIMEOUT "PID Autotune failed! timeout" #define STR_BIAS " bias: " diff --git a/Marlin/src/feature/leds/printer_event_leds.cpp b/Marlin/src/feature/leds/printer_event_leds.cpp index 3a6b91a258..32c6862704 100644 --- a/Marlin/src/feature/leds/printer_event_leds.cpp +++ b/Marlin/src/feature/leds/printer_event_leds.cpp @@ -77,6 +77,19 @@ PrinterEventLEDs printerEventLEDs; pel_set_rgb(red, 0, 255); } } + +#endif + +#if HAS_HEATED_CHAMBER + + void PrinterEventLEDs::onChamberHeating(const float &start, const float ¤t, const float &target) { + const uint8_t green = pel_intensity(start, current, target); + if (green != old_intensity) { + old_intensity = green; + pel_set_rgb(255, green, 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 index 86ec292aa3..668c9c969b 100644 --- a/Marlin/src/feature/leds/printer_event_leds.h +++ b/Marlin/src/feature/leds/printer_event_leds.h @@ -55,7 +55,12 @@ public: static void onBedHeating(const float &start, const float ¤t, const float &target); #endif - #if HAS_TEMP_HOTEND || HAS_HEATED_BED + #if HAS_HEATED_CHAMBER + static inline LEDColor onChamberHeatingStart() { old_intensity = 127; return leds.get_color(); } + static void onChamberHeating(const float &start, const float ¤t, const float &target); + #endif + + #if HAS_TEMP_HOTEND || HAS_HEATED_BED || HAS_HEATED_CHAMBER static inline void onHeatingDone() { leds.set_white(); } static inline void onPidTuningDone(LEDColor c) { leds.set_color(c); } #endif diff --git a/Marlin/src/gcode/config/M309.cpp b/Marlin/src/gcode/config/M309.cpp new file mode 100644 index 0000000000..2247481b25 --- /dev/null +++ b/Marlin/src/gcode/config/M309.cpp @@ -0,0 +1,48 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 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 . + * + */ + +#include "../../inc/MarlinConfig.h" + +#if ENABLED(PIDTEMPCHAMBER) + +#include "../gcode.h" +#include "../../module/temperature.h" + +/** + * M309 - Set and/or Report the current Chamber PID values + * + * P - Set the P value + * I - Set the I value + * D - Set the D value + */ +void GcodeSuite::M309() { + if (parser.seen('P')) thermalManager.temp_chamber.pid.Kp = parser.value_float(); + if (parser.seen('I')) thermalManager.temp_chamber.pid.Ki = scalePID_i(parser.value_float()); + if (parser.seen('D')) thermalManager.temp_chamber.pid.Kd = scalePID_d(parser.value_float()); + + SERIAL_ECHO_START(); + SERIAL_ECHOLNPAIR(" p:", thermalManager.temp_chamber.pid.Kp, + " i:", unscalePID_i(thermalManager.temp_chamber.pid.Ki), + " d:", unscalePID_d(thermalManager.temp_chamber.pid.Kd)); +} + +#endif // PIDTEMPCHAMBER diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index 77ac1fbff8..a410ad90a4 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -682,6 +682,10 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { case 304: M304(); break; // M304: Set bed PID parameters #endif + #if ENABLED(PIDTEMPCHAMBER) + case 309: M309(); break; // M309: Set chamber PID parameters + #endif + #if ENABLED(PHOTO_GCODE) case 240: M240(); break; // M240: Trigger a camera #endif diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h index 7fd8d6904a..123b648f90 100644 --- a/Marlin/src/gcode/gcode.h +++ b/Marlin/src/gcode/gcode.h @@ -197,6 +197,7 @@ * M303 - PID relay autotune S sets the target temperature. Default 150C. (Requires PIDTEMP) * M304 - Set bed PID parameters P I and D. (Requires PIDTEMPBED) * M305 - Set user thermistor parameters R T and P. (Requires TEMP_SENSOR_x 1000) + * M309 - Set chamber PID parameters P I and D. (Requires PIDTEMPCHAMBER) * M350 - Set microstepping mode. (Requires digital microstepping pins.) * M351 - Toggle MS1 MS2 pins directly. (Requires digital microstepping pins.) * M355 - Set Case Light on/off and set brightness. (Requires CASE_LIGHT_PIN) @@ -711,6 +712,8 @@ private: TERN_(HAS_USER_THERMISTORS, static void M305()); + TERN_(PIDTEMPCHAMBER, static void M309()); + #if HAS_MICROSTEPS static void M350(); static void M351(); diff --git a/Marlin/src/gcode/temp/M303.cpp b/Marlin/src/gcode/temp/M303.cpp index a066ddc88d..159a52bf26 100644 --- a/Marlin/src/gcode/temp/M303.cpp +++ b/Marlin/src/gcode/temp/M303.cpp @@ -40,19 +40,15 @@ * C Number of times to repeat the procedure. (Minimum: 3, Default: 5) * U Flag to apply the result to the current PID values * - * With PID_DEBUG: + * With PID_DEBUG, PID_BED_DEBUG, or PID_CHAMBER_DEBUG: * D Toggle PID debugging and EXIT without further action. */ -#if ENABLED(PID_DEBUG) - bool pid_debug_flag = 0; -#endif - void GcodeSuite::M303() { - #if ENABLED(PID_DEBUG) + #if ANY(PID_DEBUG, PID_BED_DEBUG, PID_CHAMBER_DEBUG) if (parser.seen('D')) { - pid_debug_flag = !pid_debug_flag; + thermalManager.pid_debug_flag ^= true; SERIAL_ECHO_START(); SERIAL_ECHOPGM("PID Debug "); serialprintln_onoff(pid_debug_flag); @@ -60,25 +56,34 @@ void GcodeSuite::M303() { } #endif - #define SI TERN(PIDTEMPBED, H_BED, H_E0) - #define EI TERN(PIDTEMP, HOTENDS - 1, H_BED) - const heater_id_t e = (heater_id_t)parser.intval('E'); - if (!WITHIN(e, SI, EI)) { - SERIAL_ECHOLNPGM(STR_PID_BAD_EXTRUDER_NUM); - TERN_(EXTENSIBLE_UI, ExtUI::onPidTuning(ExtUI::result_t::PID_BAD_EXTRUDER_NUM)); - return; + const heater_id_t hid = (heater_id_t)parser.intval('E'); + int16_t default_temp; + switch (hid) { + #if ENABLED(PIDTEMP) + case 0 ... HOTENDS - 1: default_temp = PREHEAT_1_TEMP_HOTEND; break; + #endif + #if ENABLED(PIDTEMPBED) + case H_BED: default_temp = PREHEAT_1_TEMP_BED; break; + #endif + #if ENABLED(PIDTEMPCHAMBER) + case H_CHAMBER: default_temp = PREHEAT_1_TEMP_CHAMBER; break; + #endif + default: + SERIAL_ECHOLNPGM(STR_PID_BAD_HEATER_ID); + TERN_(EXTENSIBLE_UI, ExtUI::onPidTuning(ExtUI::result_t::PID_BAD_EXTRUDER_NUM)); + return; } + const int16_t temp = parser.celsiusval('S', default_temp); const int c = parser.intval('C', 5); const bool u = parser.boolval('U'); - const int16_t temp = parser.celsiusval('S', e < 0 ? PREHEAT_1_TEMP_BED : PREHEAT_1_TEMP_HOTEND); #if DISABLED(BUSY_WHILE_HEATING) KEEPALIVE_STATE(NOT_BUSY); #endif LCD_MESSAGEPGM(MSG_PID_AUTOTUNE); - thermalManager.PID_autotune(temp, e, c, u); + thermalManager.PID_autotune(temp, hid, c, u); ui.reset_status(); } diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index f8360767d9..585d48de8c 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -1992,27 +1992,31 @@ #define BED_OVERSHOOT 10 #endif #define BED_MAX_TARGET (BED_MAXTEMP - (BED_OVERSHOOT)) +#else + #undef PIDTEMPBED #endif + #if HAS_HEATED_BED || HAS_TEMP_CHAMBER #define BED_OR_CHAMBER 1 #endif #if HAS_TEMP_HOTEND || BED_OR_CHAMBER || HAS_TEMP_PROBE #define HAS_TEMP_SENSOR 1 #endif + #if HAS_TEMP_CHAMBER && PIN_EXISTS(HEATER_CHAMBER) #define HAS_HEATED_CHAMBER 1 + #ifndef CHAMBER_OVERSHOOT + #define CHAMBER_OVERSHOOT 10 + #endif + #define CHAMBER_MAX_TARGET (CHAMBER_MAXTEMP - (CHAMBER_OVERSHOOT)) +#else + #undef PIDTEMPCHAMBER #endif // PID heating -#if !HAS_HEATED_BED - #undef PIDTEMPBED -#endif -#if EITHER(PIDTEMP, PIDTEMPBED) +#if ANY(PIDTEMP, PIDTEMPBED, PIDTEMPCHAMBER) #define HAS_PID_HEATING 1 #endif -#if BOTH(PIDTEMP, PIDTEMPBED) - #define HAS_PID_FOR_BOTH 1 -#endif // Thermal protection #if BOTH(HAS_HEATED_BED, THERMAL_PROTECTION_BED) @@ -2346,6 +2350,9 @@ * Heated chamber requires settings */ #if HAS_HEATED_CHAMBER + #ifndef MIN_CHAMBER_POWER + #define MIN_CHAMBER_POWER 0 + #endif #ifndef MAX_CHAMBER_POWER #define MAX_CHAMBER_POWER 255 #endif diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index c1b0290ac1..ba69b4792e 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -1203,6 +1203,13 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #error "To use BED_LIMIT_SWITCHING you must disable PIDTEMPBED." #endif +/** + * Chamber Heating Options - PID vs Limit Switching + */ +#if BOTH(PIDTEMPCHAMBER, CHAMBER_LIMIT_SWITCHING) + #error "To use CHAMBER_LIMIT_SWITCHING you must disable PIDTEMPCHAMBER." +#endif + /** * Kinematics */ diff --git a/Marlin/src/lcd/menu/menu_advanced.cpp b/Marlin/src/lcd/menu/menu_advanced.cpp index cb7827168b..aab93c3bdd 100644 --- a/Marlin/src/lcd/menu/menu_advanced.cpp +++ b/Marlin/src/lcd/menu/menu_advanced.cpp @@ -177,18 +177,25 @@ void menu_backlash(); #if ENABLED(PIDTEMPBED) int16_t autotune_temp_bed = PREHEAT_1_TEMP_BED; #endif + #if ENABLED(PIDTEMPCHAMBER) + int16_t autotune_temp_chamber = PREHEAT_1_TEMP_CHAMBER; + #endif #include "../../gcode/queue.h" - void _lcd_autotune(const int16_t e) { + void _lcd_autotune(const heater_id_t hid) { char cmd[30]; - sprintf_P(cmd, PSTR("M303 U1 E%i S%i"), e, - #if HAS_PID_FOR_BOTH - e < 0 ? autotune_temp_bed : autotune_temp[e] - #else - TERN(PIDTEMPBED, autotune_temp_bed, autotune_temp[e]) + int16_t tune_temp; + switch (hid) { + #if ENABLED(PIDTEMPBED) + case H_BED: tune_temp = autotune_temp_bed; break; #endif - ); + #if ENABLED(PIDTEMPCHAMBER) + case H_CHAMBER: tune_temp = autotune_temp_chamber; break; + #endif + default: tune_temp = autotune_temp[hid]; break; + } + sprintf_P(cmd, PSTR("M303 U1 E%i S%i"), hid, tune_temp); queue.inject(cmd); ui.return_to_status(); } @@ -225,7 +232,7 @@ void menu_backlash(); #if ENABLED(PID_AUTOTUNE_MENU) #define DEFINE_PIDTEMP_FUNCS(N) \ _DEFINE_PIDTEMP_BASE_FUNCS(N); \ - void lcd_autotune_callback_E##N() { _lcd_autotune(N); } + void lcd_autotune_callback_E##N() { _lcd_autotune(heater_id_t(N)); } #else #define DEFINE_PIDTEMP_FUNCS(N) _DEFINE_PIDTEMP_BASE_FUNCS(N); #endif @@ -269,56 +276,70 @@ void menu_backlash(); // #if ENABLED(PID_EDIT_MENU) - #define __PID_BASE_MENU_ITEMS(N) \ - raw_Ki = unscalePID_i(TERN(PID_BED_MENU_SECTION, thermalManager.temp_bed.pid.Ki, PID_PARAM(Ki, N))); \ - raw_Kd = unscalePID_d(TERN(PID_BED_MENU_SECTION, thermalManager.temp_bed.pid.Kd, PID_PARAM(Kd, N))); \ - EDIT_ITEM_FAST_N(float41sign, N, MSG_PID_P_E, &TERN(PID_BED_MENU_SECTION, thermalManager.temp_bed.pid.Kp, PID_PARAM(Kp, N)), 1, 9990); \ + #define _PID_EDIT_ITEMS_TMPL(N,T) \ + raw_Ki = unscalePID_i(T.pid.Ki); \ + raw_Kd = unscalePID_d(T.pid.Kd); \ + EDIT_ITEM_FAST_N(float41sign, N, MSG_PID_P_E, &T.pid.Kp, 1, 9990); \ + EDIT_ITEM_FAST_N(float52sign, N, MSG_PID_I_E, &raw_Ki, 0.01f, 9990, []{ copy_and_scalePID_i(N); }); \ + EDIT_ITEM_FAST_N(float41sign, N, MSG_PID_D_E, &raw_Kd, 1, 9990, []{ copy_and_scalePID_d(N); }) + + #define __PID_HOTEND_MENU_ITEMS(N) \ + raw_Ki = unscalePID_i(PID_PARAM(Ki, N)); \ + raw_Kd = unscalePID_d(PID_PARAM(Kd, N)); \ + EDIT_ITEM_FAST_N(float41sign, N, MSG_PID_P_E, &PID_PARAM(Kp, N), 1, 9990); \ EDIT_ITEM_FAST_N(float52sign, N, MSG_PID_I_E, &raw_Ki, 0.01f, 9990, []{ copy_and_scalePID_i(N); }); \ EDIT_ITEM_FAST_N(float41sign, N, MSG_PID_D_E, &raw_Kd, 1, 9990, []{ copy_and_scalePID_d(N); }) #if ENABLED(PID_EXTRUSION_SCALING) - #define _PID_BASE_MENU_ITEMS(N) \ - __PID_BASE_MENU_ITEMS(N); \ + #define _PID_HOTEND_MENU_ITEMS(N) \ + __PID_HOTEND_MENU_ITEMS(N); \ EDIT_ITEM_N(float4, N, MSG_PID_C_E, &PID_PARAM(Kc, N), 1, 9990) #else - #define _PID_BASE_MENU_ITEMS(N) __PID_BASE_MENU_ITEMS(N) + #define _PID_HOTEND_MENU_ITEMS(N) __PID_HOTEND_MENU_ITEMS(N) #endif #if ENABLED(PID_FAN_SCALING) - #define _PID_EDIT_MENU_ITEMS(N) \ - _PID_BASE_MENU_ITEMS(N); \ + #define _HOTEND_PID_EDIT_MENU_ITEMS(N) \ + _PID_HOTEND_MENU_ITEMS(N); \ EDIT_ITEM_N(float4, N, MSG_PID_F_E, &PID_PARAM(Kf, N), 1, 9990) #else - #define _PID_EDIT_MENU_ITEMS(N) _PID_BASE_MENU_ITEMS(N) + #define _HOTEND_PID_EDIT_MENU_ITEMS(N) _PID_HOTEND_MENU_ITEMS(N) #endif #else - #define _PID_EDIT_MENU_ITEMS(N) NOOP + #define _HOTEND_PID_EDIT_MENU_ITEMS(N) NOOP #endif #if ENABLED(PID_AUTOTUNE_MENU) - #define PID_EDIT_MENU_ITEMS(N) \ - _PID_EDIT_MENU_ITEMS(N); \ - EDIT_ITEM_FAST_N(int3, N, MSG_PID_AUTOTUNE_E, &autotune_temp[N], 150, thermalManager.heater_maxtemp[N] - HOTEND_OVERSHOOT, []{ _lcd_autotune(MenuItemBase::itemIndex); }); + #define HOTEND_PID_EDIT_MENU_ITEMS(N) \ + _HOTEND_PID_EDIT_MENU_ITEMS(N); \ + EDIT_ITEM_FAST_N(int3, N, MSG_PID_AUTOTUNE_E, &autotune_temp[N], 150, thermalManager.heater_maxtemp[N] - HOTEND_OVERSHOOT, []{ _lcd_autotune(heater_id_t(MenuItemBase::itemIndex)); }); #else - #define PID_EDIT_MENU_ITEMS(N) _PID_EDIT_MENU_ITEMS(N); + #define HOTEND_PID_EDIT_MENU_ITEMS(N) _HOTEND_PID_EDIT_MENU_ITEMS(N); #endif - PID_EDIT_MENU_ITEMS(0); + HOTEND_PID_EDIT_MENU_ITEMS(0); #if ENABLED(PID_PARAMS_PER_HOTEND) - REPEAT_S(1, HOTENDS, PID_EDIT_MENU_ITEMS) + REPEAT_S(1, HOTENDS, HOTEND_PID_EDIT_MENU_ITEMS) #endif #if ENABLED(PIDTEMPBED) #if ENABLED(PID_EDIT_MENU) - #define PID_BED_MENU_SECTION - __PID_BASE_MENU_ITEMS(-1); - #undef PID_BED_MENU_SECTION + _PID_EDIT_ITEMS_TMPL(H_BED, thermalManager.temp_bed); #endif #if ENABLED(PID_AUTOTUNE_MENU) - EDIT_ITEM_FAST_N(int3, -1, MSG_PID_AUTOTUNE_E, &autotune_temp_bed, PREHEAT_1_TEMP_BED, BED_MAX_TARGET, []{ _lcd_autotune(-1); }); + EDIT_ITEM_FAST_N(int3, H_BED, MSG_PID_AUTOTUNE_E, &autotune_temp_bed, PREHEAT_1_TEMP_BED, BED_MAX_TARGET, []{ _lcd_autotune(H_BED); }); + #endif + #endif + + #if ENABLED(PIDTEMPCHAMBER) + #if ENABLED(PID_EDIT_MENU) + _PID_EDIT_ITEMS_TMPL(H_CHAMBER, thermalManager.temp_chamber); + #endif + #if ENABLED(PID_AUTOTUNE_MENU) + EDIT_ITEM_FAST_N(int3, H_CHAMBER, MSG_PID_AUTOTUNE_E, &autotune_temp_chamber, PREHEAT_1_TEMP_CHAMBER, CHAMBER_MAX_TARGET, []{ _lcd_autotune(H_CHAMBER); }); #endif #endif diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index 7fb378191e..f4b4bf0b8b 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -318,6 +318,11 @@ typedef struct SettingsDataStruct { // PID_t bedPID; // M304 PID / M303 E-1 U + // + // PIDTEMPCHAMBER + // + PID_t chamberPID; // M309 PID / M303 E-2 U + // // User-defined Thermistors // @@ -926,6 +931,25 @@ void MarlinSettings::postprocess() { EEPROM_WRITE(bed_pid); } + // + // PIDTEMPCHAMBER + // + { + _FIELD_TEST(chamberPID); + + const PID_t chamber_pid = { + #if DISABLED(PIDTEMPCHAMBER) + NAN, NAN, NAN + #else + // Store the unscaled PID values + thermalManager.temp_chamber.pid.Kp, + unscalePID_i(thermalManager.temp_chamber.pid.Ki), + unscalePID_d(thermalManager.temp_chamber.pid.Kd) + #endif + }; + EEPROM_WRITE(chamber_pid); + } + // // User-defined Thermistors // @@ -1787,6 +1811,22 @@ void MarlinSettings::postprocess() { #endif } + // + // Heated Chamber PID + // + { + PID_t pid; + EEPROM_READ(pid); + #if ENABLED(PIDTEMPCHAMBER) + if (!validating && !isnan(pid.Kp)) { + // Scale PID values since EEPROM values are unscaled + thermalManager.temp_chamber.pid.Kp = pid.Kp; + thermalManager.temp_chamber.pid.Ki = scalePID_i(pid.Ki); + thermalManager.temp_chamber.pid.Kd = scalePID_d(pid.Kd); + } + #endif + } + // // User-defined Thermistors // @@ -2811,6 +2851,16 @@ void MarlinSettings::reset() { thermalManager.temp_bed.pid.Kd = scalePID_d(DEFAULT_bedKd); #endif + // + // Heated Chamber PID + // + + #if ENABLED(PIDTEMPCHAMBER) + thermalManager.temp_chamber.pid.Kp = DEFAULT_chamberKp; + thermalManager.temp_chamber.pid.Ki = scalePID_i(DEFAULT_chamberKi); + thermalManager.temp_chamber.pid.Kd = scalePID_d(DEFAULT_chamberKd); + #endif + // // User-Defined Thermistors // @@ -3386,7 +3436,16 @@ void MarlinSettings::reset() { ); #endif - #endif // PIDTEMP || PIDTEMPBED + #if ENABLED(PIDTEMPCHAMBER) + CONFIG_ECHO_START(); + SERIAL_ECHOLNPAIR( + " M309 P", thermalManager.temp_chamber.pid.Kp + , " I", unscalePID_i(thermalManager.temp_chamber.pid.Ki) + , " D", unscalePID_d(thermalManager.temp_chamber.pid.Kd) + ); + #endif + + #endif // PIDTEMP || PIDTEMPBED || PIDTEMPCHAMBER #if HAS_USER_THERMISTORS CONFIG_ECHO_HEADING("User thermistors:"); diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index edd76df3b7..58b0a965c9 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -371,10 +371,8 @@ const char str_t_thermal_runaway[] PROGMEM = STR_T_THERMAL_RUNAWAY, #ifdef CHAMBER_MAXTEMP int16_t Temperature::maxtemp_raw_CHAMBER = TEMP_SENSOR_CHAMBER_RAW_HI_TEMP; #endif - #if WATCH_CHAMBER - chamber_watch_t Temperature::watch_chamber{0}; - #endif - millis_t Temperature::next_chamber_check_ms; + TERN_(WATCH_CHAMBER, chamber_watch_t Temperature::watch_chamber{0}); + IF_DISABLED(PIDTEMPCHAMBER, millis_t Temperature::next_chamber_check_ms); #endif // HAS_HEATED_CHAMBER #endif // HAS_TEMP_CHAMBER @@ -382,11 +380,6 @@ const char str_t_thermal_runaway[] PROGMEM = STR_T_THERMAL_RUNAWAY, probe_info_t Temperature::temp_probe; // = { 0 } #endif -// Initialized by settings.load() -#if ENABLED(PIDTEMP) - //hotend_pid_t Temperature::pid[HOTENDS]; -#endif - #if ENABLED(PREVENT_COLD_EXTRUSION) bool Temperature::allow_cold_extrude = false; int16_t Temperature::extrude_min_temp = EXTRUDE_MINTEMP; @@ -485,41 +478,44 @@ volatile bool Temperature::raw_temps_ready = false; millis_t next_temp_ms = millis(), t1 = next_temp_ms, t2 = next_temp_ms; long t_high = 0, t_low = 0; - long bias, d; PID_t tune_pid = { 0, 0, 0 }; float maxT = 0, minT = 10000; const bool isbed = (heater_id == H_BED); + const bool ischamber = (heater_id == H_CHAMBER); - #if HAS_PID_FOR_BOTH - #define GHV(B,H) (isbed ? (B) : (H)) - #define SHV(B,H) do{ if (isbed) temp_bed.soft_pwm_amount = B; else temp_hotend[heater_id].soft_pwm_amount = H; }while(0) - #define ONHEATINGSTART() (isbed ? printerEventLEDs.onBedHeatingStart() : printerEventLEDs.onHotendHeatingStart()) - #define ONHEATING(S,C,T) (isbed ? printerEventLEDs.onBedHeating(S,C,T) : printerEventLEDs.onHotendHeating(S,C,T)) - #elif ENABLED(PIDTEMPBED) - #define GHV(B,H) B - #define SHV(B,H) (temp_bed.soft_pwm_amount = B) - #define ONHEATINGSTART() printerEventLEDs.onBedHeatingStart() - #define ONHEATING(S,C,T) printerEventLEDs.onBedHeating(S,C,T) + #if ENABLED(PIDTEMPCHAMBER) + #define C_TERN(T,A,B) ((T) ? (A) : (B)) #else - #define GHV(B,H) H - #define SHV(B,H) (temp_hotend[heater_id].soft_pwm_amount = H) - #define ONHEATINGSTART() printerEventLEDs.onHotendHeatingStart() - #define ONHEATING(S,C,T) printerEventLEDs.onHotendHeating(S,C,T) + #define C_TERN(T,A,B) (B) #endif - #define WATCH_PID BOTH(WATCH_BED, PIDTEMPBED) || BOTH(WATCH_HOTENDS, PIDTEMP) + #if ENABLED(PIDTEMPBED) + #define B_TERN(T,A,B) ((T) ? (A) : (B)) + #else + #define B_TERN(T,A,B) (B) + #endif + #define GHV(C,B,H) C_TERN(ischamber, C, B_TERN(isbed, B, H)) + #define SHV(V) C_TERN(ischamber, temp_chamber.soft_pwm_amount = V, B_TERN(isbed, temp_bed.soft_pwm_amount = V, temp_hotend[heater_id].soft_pwm_amount = V)) + #define ONHEATINGSTART() C_TERN(ischamber, printerEventLEDs.onChamberHeatingStart(), B_TERN(isbed, printerEventLEDs.onBedHeatingStart(), printerEventLEDs.onHotendHeatingStart())) + #define ONHEATING(S,C,T) C_TERN(ischamber, printerEventLEDs.onChamberHeating(S,C,T), B_TERN(isbed, printerEventLEDs.onBedHeating(S,C,T), printerEventLEDs.onHotendHeating(S,C,T))) + + #define WATCH_PID BOTH(WATCH_CHAMBER, PIDTEMPCHAMBER) || BOTH(WATCH_BED, PIDTEMPBED) || BOTH(WATCH_HOTENDS, PIDTEMP) #if WATCH_PID - #if ALL(THERMAL_PROTECTION_HOTENDS, PIDTEMP, THERMAL_PROTECTION_BED, PIDTEMPBED) - #define GTV(B,H) (isbed ? (B) : (H)) - #elif BOTH(THERMAL_PROTECTION_HOTENDS, PIDTEMP) - #define GTV(B,H) (H) + #if BOTH(THERMAL_PROTECTION_CHAMBER, PIDTEMPCHAMBER) + #define C_GTV(T,A,B) ((T) ? (A) : (B)) #else - #define GTV(B,H) (B) + #define C_GTV(T,A,B) (B) #endif - const uint16_t watch_temp_period = GTV(WATCH_BED_TEMP_PERIOD, WATCH_TEMP_PERIOD); - const uint8_t watch_temp_increase = GTV(WATCH_BED_TEMP_INCREASE, WATCH_TEMP_INCREASE); - const float watch_temp_target = target - float(watch_temp_increase + GTV(TEMP_BED_HYSTERESIS, TEMP_HYSTERESIS) + 1); + #if BOTH(THERMAL_PROTECTION_BED, PIDTEMPBED) + #define B_GTV(T,A,B) ((T) ? (A) : (B)) + #else + #define B_GTV(T,A,B) (B) + #endif + #define GTV(C,B,H) C_GTV(ischamber, C, B_GTV(isbed, B, H)) + const uint16_t watch_temp_period = GTV(WATCH_CHAMBER_TEMP_PERIOD, WATCH_BED_TEMP_PERIOD, WATCH_TEMP_PERIOD); + const uint8_t watch_temp_increase = GTV(WATCH_CHAMBER_TEMP_INCREASE, WATCH_BED_TEMP_INCREASE, WATCH_TEMP_INCREASE); + const float watch_temp_target = target - float(watch_temp_increase + GTV(TEMP_CHAMBER_HYSTERESIS, TEMP_BED_HYSTERESIS, TEMP_HYSTERESIS) + 1); millis_t temp_change_ms = next_temp_ms + SEC_TO_MS(watch_temp_period); float next_watch_temp = 0.0; bool heated = false; @@ -527,7 +523,7 @@ volatile bool Temperature::raw_temps_ready = false; TERN_(HAS_AUTO_FAN, next_auto_fan_check_ms = next_temp_ms + 2500UL); - if (target > GHV(BED_MAX_TARGET, temp_range[heater_id].maxtemp - HOTEND_OVERSHOOT)) { + if (target > GHV(CHAMBER_MAX_TARGET, BED_MAX_TARGET, temp_range[heater_id].maxtemp - HOTEND_OVERSHOOT)) { SERIAL_ECHOLNPGM(STR_PID_TEMP_TOO_HIGH); TERN_(EXTENSIBLE_UI, ExtUI::onPidTuning(ExtUI::result_t::PID_TEMP_TOO_HIGH)); return; @@ -538,10 +534,11 @@ volatile bool Temperature::raw_temps_ready = false; disable_all_heaters(); TERN_(AUTO_POWER_CONTROL, powerManager.power_on()); - SHV(bias = d = (MAX_BED_POWER) >> 1, bias = d = (PID_MAX) >> 1); + long bias = GHV(MAX_CHAMBER_POWER, MAX_BED_POWER, PID_MAX) >> 1, d = bias; + SHV(bias); #if ENABLED(PRINTER_EVENT_LEDS) - const float start_temp = GHV(temp_bed.celsius, temp_hotend[heater_id].celsius); + const float start_temp = GHV(temp_chamber.celsius, temp_bed.celsius, temp_hotend[heater_id].celsius); LEDColor color = ONHEATINGSTART(); #endif @@ -557,7 +554,7 @@ volatile bool Temperature::raw_temps_ready = false; updateTemperaturesFromRawValues(); // Get the current temperature and constrain it - current_temp = GHV(temp_bed.celsius, temp_hotend[heater_id].celsius); + current_temp = GHV(temp_chamber.celsius, temp_bed.celsius, temp_hotend[heater_id].celsius); NOLESS(maxT, current_temp); NOMORE(minT, current_temp); @@ -572,67 +569,46 @@ volatile bool Temperature::raw_temps_ready = false; } #endif - if (heating && current_temp > target) { - if (ELAPSED(ms, t2 + 5000UL)) { - heating = false; - SHV((bias - d) >> 1, (bias - d) >> 1); - t1 = ms; - t_high = t1 - t2; - maxT = target; - } + if (heating && current_temp > target && ELAPSED(ms, t2 + 5000UL)) { + heating = false; + SHV((bias - d) >> 1); + t1 = ms; + t_high = t1 - t2; + maxT = target; } - if (!heating && current_temp < target) { - if (ELAPSED(ms, t1 + 5000UL)) { - heating = true; - t2 = ms; - t_low = t2 - t1; - if (cycles > 0) { - const long max_pow = GHV(MAX_BED_POWER, PID_MAX); - bias += (d * (t_high - t_low)) / (t_low + t_high); - LIMIT(bias, 20, max_pow - 20); - d = (bias > max_pow >> 1) ? max_pow - 1 - bias : bias; + if (!heating && current_temp < target && ELAPSED(ms, t1 + 5000UL)) { + heating = true; + t2 = ms; + t_low = t2 - t1; + if (cycles > 0) { + const long max_pow = GHV(MAX_CHAMBER_POWER, MAX_BED_POWER, PID_MAX); + bias += (d * (t_high - t_low)) / (t_low + t_high); + LIMIT(bias, 20, max_pow - 20); + d = (bias > max_pow >> 1) ? max_pow - 1 - bias : bias; - SERIAL_ECHOPAIR(STR_BIAS, bias, STR_D_COLON, d, STR_T_MIN, minT, STR_T_MAX, maxT); - if (cycles > 2) { - const float Ku = (4.0f * d) / (float(M_PI) * (maxT - minT) * 0.5f), - Tu = float(t_low + t_high) * 0.001f, - pf = isbed ? 0.2f : 0.6f, - df = isbed ? 1.0f / 3.0f : 1.0f / 8.0f; + SERIAL_ECHOPAIR(STR_BIAS, bias, STR_D_COLON, d, STR_T_MIN, minT, STR_T_MAX, maxT); + if (cycles > 2) { + const float Ku = (4.0f * d) / (float(M_PI) * (maxT - minT) * 0.5f), + Tu = float(t_low + t_high) * 0.001f, + pf = ischamber ? 0.2f : (isbed ? 0.2f : 0.6f), + df = ischamber ? 1.0f / 3.0f : (isbed ? 1.0f / 3.0f : 1.0f / 8.0f); - SERIAL_ECHOPAIR(STR_KU, Ku, STR_TU, Tu); - if (isbed) { // Do not remove this otherwise PID autotune won't work right for the bed! - tune_pid.Kp = Ku * 0.2f; - tune_pid.Ki = 2 * tune_pid.Kp / Tu; - tune_pid.Kd = tune_pid.Kp * Tu / 3; - SERIAL_ECHOLNPGM("\n" " No overshoot"); // Works far better for the bed. Classic and some have bad ringing. - SERIAL_ECHOLNPAIR(STR_KP, tune_pid.Kp, STR_KI, tune_pid.Ki, STR_KD, tune_pid.Kd); - } - else { - tune_pid.Kp = Ku * pf; - tune_pid.Kd = tune_pid.Kp * Tu * df; - tune_pid.Ki = 2 * tune_pid.Kp / Tu; - SERIAL_ECHOLNPGM("\n" STR_CLASSIC_PID); - SERIAL_ECHOLNPAIR(STR_KP, tune_pid.Kp, STR_KI, tune_pid.Ki, STR_KD, tune_pid.Kd); - } + tune_pid.Kp = Ku * pf; + tune_pid.Ki = tune_pid.Kp * 2.0f / Tu; + tune_pid.Kd = tune_pid.Kp * Tu * df; - /** - tune_pid.Kp = 0.33 * Ku; - tune_pid.Ki = tune_pid.Kp / Tu; - tune_pid.Kd = tune_pid.Kp * Tu / 3; - SERIAL_ECHOLNPGM(" Some overshoot"); - SERIAL_ECHOLNPAIR(" Kp: ", tune_pid.Kp, " Ki: ", tune_pid.Ki, " Kd: ", tune_pid.Kd, " No overshoot"); - tune_pid.Kp = 0.2 * Ku; - tune_pid.Ki = 2 * tune_pid.Kp / Tu; - tune_pid.Kd = tune_pid.Kp * Tu / 3; - SERIAL_ECHOPAIR(" Kp: ", tune_pid.Kp, " Ki: ", tune_pid.Ki, " Kd: ", tune_pid.Kd); - */ - } + SERIAL_ECHOLNPAIR(STR_KU, Ku, STR_TU, Tu); + if (ischamber || isbed) + SERIAL_ECHOLNPGM(" No overshoot"); + else + SERIAL_ECHOLNPGM(STR_CLASSIC_PID); + SERIAL_ECHOLNPAIR(STR_KP, tune_pid.Kp, STR_KI, tune_pid.Ki, STR_KD, tune_pid.Kd); } - SHV((bias + d) >> 1, (bias + d) >> 1); - cycles++; - minT = target; } + SHV((bias + d) >> 1); + cycles++; + minT = target; } } @@ -649,14 +625,14 @@ volatile bool Temperature::raw_temps_ready = false; // Report heater states every 2 seconds if (ELAPSED(ms, next_temp_ms)) { #if HAS_TEMP_SENSOR - print_heater_states(isbed ? active_extruder : heater_id); + print_heater_states(ischamber ? active_extruder : (isbed ? active_extruder : heater_id)); SERIAL_EOL(); #endif next_temp_ms = ms + 2000UL; // Make sure heating is actually working #if WATCH_PID - if (BOTH(WATCH_BED, WATCH_HOTENDS) || isbed == DISABLED(WATCH_HOTENDS)) { + if (BOTH(WATCH_BED, WATCH_HOTENDS) || isbed == DISABLED(WATCH_HOTENDS) || ischamber == DISABLED(WATCH_HOTENDS)) { if (!heated) { // If not yet reached target... if (current_temp > next_watch_temp) { // Over the watch temp? next_watch_temp = current_temp + watch_temp_increase; // - set the next temp to watch for @@ -686,43 +662,47 @@ volatile bool Temperature::raw_temps_ready = false; if (cycles > ncycles && cycles > 2) { SERIAL_ECHOLNPGM(STR_PID_AUTOTUNE_FINISHED); - #if HAS_PID_FOR_BOTH - const char * const estring = GHV(PSTR("bed"), NUL_STR); + #if EITHER(PIDTEMPBED, PIDTEMPCHAMBER) + PGM_P const estring = GHV(PSTR("chamber"), PSTR("bed"), NUL_STR); say_default_(); serialprintPGM(estring); SERIAL_ECHOLNPAIR("Kp ", tune_pid.Kp); say_default_(); serialprintPGM(estring); SERIAL_ECHOLNPAIR("Ki ", tune_pid.Ki); say_default_(); serialprintPGM(estring); SERIAL_ECHOLNPAIR("Kd ", tune_pid.Kd); - #elif ENABLED(PIDTEMP) + #else say_default_(); SERIAL_ECHOLNPAIR("Kp ", tune_pid.Kp); say_default_(); SERIAL_ECHOLNPAIR("Ki ", tune_pid.Ki); say_default_(); SERIAL_ECHOLNPAIR("Kd ", tune_pid.Kd); - #else - say_default_(); SERIAL_ECHOLNPAIR("bedKp ", tune_pid.Kp); - say_default_(); SERIAL_ECHOLNPAIR("bedKi ", tune_pid.Ki); - say_default_(); SERIAL_ECHOLNPAIR("bedKd ", tune_pid.Kd); #endif - #define _SET_BED_PID() do { \ - temp_bed.pid.Kp = tune_pid.Kp; \ - temp_bed.pid.Ki = scalePID_i(tune_pid.Ki); \ - temp_bed.pid.Kd = scalePID_d(tune_pid.Kd); \ - }while(0) + auto _set_hotend_pid = [](const uint8_t e, const PID_t &in_pid) { + #if ENABLED(PIDTEMP) + PID_PARAM(Kp, e) = in_pid.Kp; + PID_PARAM(Ki, e) = scalePID_i(in_pid.Ki); + PID_PARAM(Kd, e) = scalePID_d(in_pid.Kd); + updatePID(); + #else + UNUSED(e); UNUSED(in_pid); + #endif + }; - #define _SET_EXTRUDER_PID() do { \ - PID_PARAM(Kp, heater_id) = tune_pid.Kp; \ - PID_PARAM(Ki, heater_id) = scalePID_i(tune_pid.Ki); \ - PID_PARAM(Kd, heater_id) = scalePID_d(tune_pid.Kd); \ - updatePID(); }while(0) + #if ENABLED(PIDTEMPBED) + auto _set_bed_pid = [](const PID_t &in_pid) { + temp_bed.pid.Kp = in_pid.Kp; + temp_bed.pid.Ki = scalePID_i(in_pid.Ki); + temp_bed.pid.Kd = scalePID_d(in_pid.Kd); + }; + #endif + + #if ENABLED(PIDTEMPCHAMBER) + auto _set_chamber_pid = [](const PID_t &in_pid) { + temp_chamber.pid.Kp = in_pid.Kp; + temp_chamber.pid.Ki = scalePID_i(in_pid.Ki); + temp_chamber.pid.Kd = scalePID_d(in_pid.Kd); + }; + #endif // Use the result? (As with "M303 U1") - if (set_result) { - #if HAS_PID_FOR_BOTH - if (isbed) _SET_BED_PID(); else _SET_EXTRUDER_PID(); - #elif ENABLED(PIDTEMP) - _SET_EXTRUDER_PID(); - #else - _SET_BED_PID(); - #endif - } + if (set_result) + GHV(_set_chamber_pid(tune_pid), _set_bed_pid(tune_pid), _set_hotend_pid(heater_id, tune_pid)); TERN_(PRINTER_EVENT_LEDS, printerEventLEDs.onPidTuningDone(color)); @@ -939,10 +919,11 @@ void Temperature::min_temp_error(const heater_id_t heater_id) { _temp_error(heater_id, PSTR(STR_T_MINTEMP), GET_TEXT(MSG_ERR_MINTEMP)); } +#if ANY(PID_DEBUG, PID_BED_DEBUG, PID_CHAMBER_DEBUG) + bool Temperature::pid_debug_flag; // = 0 +#endif + #if HAS_HOTEND - #if ENABLED(PID_DEBUG) - extern bool pid_debug_flag; - #endif float Temperature::get_pid_output_hotend(const uint8_t E_NAME) { const uint8_t ee = HOTEND_INDEX; @@ -1023,23 +1004,18 @@ void Temperature::min_temp_error(const heater_id_t heater_id) { #if ENABLED(PID_DEBUG) if (ee == active_extruder && pid_debug_flag) { - SERIAL_ECHO_START(); - SERIAL_ECHOPAIR(STR_PID_DEBUG, ee, STR_PID_DEBUG_INPUT, temp_hotend[ee].celsius, STR_PID_DEBUG_OUTPUT, pid_output); - #if DISABLED(PID_OPENLOOP) - { - SERIAL_ECHOPAIR( - STR_PID_DEBUG_PTERM, work_pid[ee].Kp, - STR_PID_DEBUG_ITERM, work_pid[ee].Ki, - STR_PID_DEBUG_DTERM, work_pid[ee].Kd + SERIAL_ECHO_MSG(STR_PID_DEBUG, ee, STR_PID_DEBUG_INPUT, temp_hotend[ee].celsius, STR_PID_DEBUG_OUTPUT, pid_output + #if DISABLED(PID_OPENLOOP) + , STR_PID_DEBUG_PTERM, work_pid[ee].Kp + , STR_PID_DEBUG_ITERM, work_pid[ee].Ki + , STR_PID_DEBUG_DTERM, work_pid[ee].Kd #if ENABLED(PID_EXTRUSION_SCALING) , STR_PID_DEBUG_CTERM, work_pid[ee].Kc #endif - ); - } - #endif - SERIAL_EOL(); + #endif + ); } - #endif // PID_DEBUG + #endif #else // No PID enabled @@ -1099,13 +1075,76 @@ void Temperature::min_temp_error(const heater_id_t heater_id) { #endif // PID_OPENLOOP #if ENABLED(PID_BED_DEBUG) + if (pid_debug_flag) { + SERIAL_ECHO_MSG( + " PID_BED_DEBUG : Input ", temp_bed.celsius, " Output ", pid_output + #if DISABLED(PID_OPENLOOP) + , STR_PID_DEBUG_PTERM, work_pid.Kp + , STR_PID_DEBUG_ITERM, work_pid.Ki + , STR_PID_DEBUG_DTERM, work_pid.Kd + #endif + ); + } + #endif + + return pid_output; + } + +#endif // PIDTEMPBED + +#if ENABLED(PIDTEMPCHAMBER) + + float Temperature::get_pid_output_chamber() { + + #if DISABLED(PID_OPENLOOP) + + static PID_t work_pid{0}; + static float temp_iState = 0, temp_dState = 0; + static bool pid_reset = true; + float pid_output = 0; + const float max_power_over_i_gain = float(MAX_CHAMBER_POWER) / temp_chamber.pid.Ki - float(MIN_CHAMBER_POWER), + pid_error = temp_chamber.target - temp_chamber.celsius; + + if (!temp_chamber.target || pid_error < -(PID_FUNCTIONAL_RANGE)) { + pid_output = 0; + pid_reset = true; + } + else if (pid_error > PID_FUNCTIONAL_RANGE) { + pid_output = MAX_CHAMBER_POWER; + pid_reset = true; + } + else { + if (pid_reset) { + temp_iState = 0.0; + work_pid.Kd = 0.0; + pid_reset = false; + } + + temp_iState = constrain(temp_iState + pid_error, 0, max_power_over_i_gain); + + work_pid.Kp = temp_chamber.pid.Kp * pid_error; + work_pid.Ki = temp_chamber.pid.Ki * temp_iState; + work_pid.Kd = work_pid.Kd + PID_K2 * (temp_chamber.pid.Kd * (temp_dState - temp_chamber.celsius) - work_pid.Kd); + + temp_dState = temp_chamber.celsius; + + pid_output = constrain(work_pid.Kp + work_pid.Ki + work_pid.Kd + float(MIN_CHAMBER_POWER), 0, MAX_CHAMBER_POWER); + } + + #else // PID_OPENLOOP + + const float pid_output = constrain(temp_chamber.target, 0, MAX_CHAMBER_POWER); + + #endif // PID_OPENLOOP + + #if ENABLED(PID_CHAMBER_DEBUG) { SERIAL_ECHO_MSG( - " PID_BED_DEBUG : Input ", temp_bed.celsius, " Output ", pid_output, + " PID_CHAMBER_DEBUG : Input ", temp_chamber.celsius, " Output ", pid_output #if DISABLED(PID_OPENLOOP) - STR_PID_DEBUG_PTERM, work_pid.Kp, - STR_PID_DEBUG_ITERM, work_pid.Ki, - STR_PID_DEBUG_DTERM, work_pid.Kd, + , STR_PID_DEBUG_PTERM, work_pid.Kp + , STR_PID_DEBUG_ITERM, work_pid.Ki + , STR_PID_DEBUG_DTERM, work_pid.Kd #endif ); } @@ -1114,7 +1153,7 @@ void Temperature::min_temp_error(const heater_id_t heater_id) { return pid_output; } -#endif // PIDTEMPBED +#endif // PIDTEMPCHAMBER /** * Manage heating activities for extruder hot-ends and a heated bed @@ -1363,42 +1402,47 @@ void Temperature::manage_heater() { } #endif + + + + #if ENABLED(PIDTEMPCHAMBER) + // PIDTEMPCHAMBER doens't support a CHAMBER_VENT yet. + temp_chamber.soft_pwm_amount = WITHIN(temp_chamber.celsius, CHAMBER_MINTEMP, CHAMBER_MAXTEMP) ? (int)get_pid_output_chamber() >> 1 : 0; + #else if (ELAPSED(ms, next_chamber_check_ms)) { next_chamber_check_ms = ms + CHAMBER_CHECK_INTERVAL; if (WITHIN(temp_chamber.celsius, CHAMBER_MINTEMP, CHAMBER_MAXTEMP)) { - if (flag_chamber_excess_heat) { - temp_chamber.soft_pwm_amount = 0; - #if ENABLED(CHAMBER_VENT) - if (!flag_chamber_off) MOVE_SERVO(CHAMBER_VENT_SERVO_NR, temp_chamber.celsius <= temp_chamber.target ? 0 : 90); - #endif + if (flag_chamber_excess_heat) { + temp_chamber.soft_pwm_amount = 0; + #if ENABLED(CHAMBER_VENT) + if (!flag_chamber_off) MOVE_SERVO(CHAMBER_VENT_SERVO_NR, temp_chamber.celsius <= temp_chamber.target ? 0 : 90); + #endif + } + else { + #if ENABLED(CHAMBER_LIMIT_SWITCHING) + if (temp_chamber.celsius >= temp_chamber.target + TEMP_CHAMBER_HYSTERESIS) + temp_chamber.soft_pwm_amount = 0; + else if (temp_chamber.celsius <= temp_chamber.target - (TEMP_CHAMBER_HYSTERESIS)) + temp_chamber.soft_pwm_amount = (MAX_CHAMBER_POWER) >> 1; + #else + temp_chamber.soft_pwm_amount = temp_chamber.celsius < temp_chamber.target ? (MAX_CHAMBER_POWER) >> 1 : 0; + #endif + #if ENABLED(CHAMBER_VENT) + if (!flag_chamber_off) MOVE_SERVO(CHAMBER_VENT_SERVO_NR, 0); + #endif + } } else { - #if ENABLED(CHAMBER_LIMIT_SWITCHING) - if (temp_chamber.celsius >= temp_chamber.target + TEMP_CHAMBER_HYSTERESIS) - temp_chamber.soft_pwm_amount = 0; - else if (temp_chamber.celsius <= temp_chamber.target - (TEMP_CHAMBER_HYSTERESIS)) - temp_chamber.soft_pwm_amount = (MAX_CHAMBER_POWER) >> 1; - #else - temp_chamber.soft_pwm_amount = temp_chamber.celsius < temp_chamber.target ? (MAX_CHAMBER_POWER) >> 1 : 0; - #endif - #if ENABLED(CHAMBER_VENT) - if (!flag_chamber_off) MOVE_SERVO(CHAMBER_VENT_SERVO_NR, 0); - #endif + temp_chamber.soft_pwm_amount = 0; + WRITE_HEATER_CHAMBER(LOW); } - } - else { - temp_chamber.soft_pwm_amount = 0; - WRITE_HEATER_CHAMBER(LOW); - } - #if ENABLED(THERMAL_PROTECTION_CHAMBER) - tr_state_machine[RUNAWAY_IND_CHAMBER].run(temp_chamber.celsius, temp_chamber.target, H_CHAMBER, THERMAL_PROTECTION_CHAMBER_PERIOD, THERMAL_PROTECTION_CHAMBER_HYSTERESIS); - #endif - } - - // TODO: Implement true PID pwm - //temp_bed.soft_pwm_amount = WITHIN(temp_chamber.celsius, CHAMBER_MINTEMP, CHAMBER_MAXTEMP) ? (int)get_pid_output_chamber() >> 1 : 0; + } + #if ENABLED(THERMAL_PROTECTION_CHAMBER) + tr_state_machine[RUNAWAY_IND_CHAMBER].run(temp_chamber.celsius, temp_chamber.target, H_CHAMBER, THERMAL_PROTECTION_CHAMBER_PERIOD, THERMAL_PROTECTION_CHAMBER_HYSTERESIS); + #endif + #endif #endif // HAS_HEATED_CHAMBER diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index 75da232874..1019c10fad 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -210,7 +210,11 @@ struct PIDHeaterInfo : public HeaterInfo { typedef temp_info_t probe_info_t; #endif #if HAS_HEATED_CHAMBER - typedef heater_info_t chamber_info_t; + #if ENABLED(PIDTEMPCHAMBER) + typedef struct PIDHeaterInfo chamber_info_t; + #else + typedef heater_info_t chamber_info_t; + #endif #elif HAS_TEMP_CHAMBER typedef temp_info_t chamber_info_t; #endif @@ -415,7 +419,7 @@ class Temperature { #if HAS_HEATED_CHAMBER TERN_(WATCH_CHAMBER, static chamber_watch_t watch_chamber); - static millis_t next_chamber_check_ms; + TERN(PIDTEMPCHAMBER,,static millis_t next_chamber_check_ms); #ifdef CHAMBER_MINTEMP static int16_t mintemp_raw_CHAMBER; #endif @@ -751,6 +755,11 @@ class Temperature { * Perform auto-tuning for hotend or bed in response to M303 */ #if HAS_PID_HEATING + + #if ANY(PID_DEBUG, PID_BED_DEBUG, PID_CHAMBER_DEBUG) + static bool pid_debug_flag; + #endif + static void PID_autotune(const float &target, const heater_id_t heater_id, const int8_t ncycles, const bool set_result=false); #if ENABLED(NO_FAN_SLOWING_IN_PID_TUNING) @@ -826,11 +835,9 @@ class Temperature { static void checkExtruderAutoFans(); - static float get_pid_output_hotend(const uint8_t e); - - TERN_(PIDTEMPBED, static float get_pid_output_bed()); - - TERN_(HAS_HEATED_CHAMBER, static float get_pid_output_chamber()); + TERN_(HAS_HOTEND, static float get_pid_output_hotend(const uint8_t e)); + TERN_(PIDTEMPBED, static float get_pid_output_bed()); + TERN_(PIDTEMPCHAMBER, static float get_pid_output_chamber()); static void _temp_error(const heater_id_t e, PGM_P const serial_msg, PGM_P const lcd_msg); static void min_temp_error(const heater_id_t e); From d5b06624fb2b14b57a9621d7b86caf9f1c5dbfb9 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Wed, 24 Feb 2021 21:36:55 -0300 Subject: [PATCH 016/253] Fix MKS Robin Nano V3 I2C pins (#21174) --- .../share/PlatformIO/variants/MARLIN_F4x7Vx/variant.h | 8 ++++++-- platformio.ini | 4 +++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F4x7Vx/variant.h b/buildroot/share/PlatformIO/variants/MARLIN_F4x7Vx/variant.h index b53ad32d0f..94fa79c065 100644 --- a/buildroot/share/PlatformIO/variants/MARLIN_F4x7Vx/variant.h +++ b/buildroot/share/PlatformIO/variants/MARLIN_F4x7Vx/variant.h @@ -143,8 +143,12 @@ extern "C" { #define PIN_SPI_SCK PA5 // I2C definitions -#define PIN_WIRE_SDA PB9 -#define PIN_WIRE_SCL PB8 +#ifndef PIN_WIRE_SDA + #define PIN_WIRE_SDA PB9 +#endif +#ifndef PIN_WIRE_SCL + #define PIN_WIRE_SCL PB8 +#endif // Timer Definitions // Use TIM6/TIM7 when possible as servo and tone don't need GPIO output pin diff --git a/platformio.ini b/platformio.ini index dd8a396849..d2ed8a4a5a 100644 --- a/platformio.ini +++ b/platformio.ini @@ -1486,7 +1486,7 @@ extra_scripts = ${common.extra_scripts} [env:mks_robin_nano_v3] platform = ${common_stm32.platform} extends = common_stm32 -build_flags = ${common_stm32.build_flags} -DHAL_PCD_MODULE_ENABLED -DUSBCON -DUSBD_USE_CDC +build_flags = ${common_stm32.build_flags} -DHAL_PCD_MODULE_ENABLED -DUSBCON -DUSBD_USE_CDC -DPIN_WIRE_SCL=PB6 -DPIN_WIRE_SDA=PB7 board = genericSTM32F407VGT6 board_build.core = stm32 board_build.variant = MARLIN_F4x7Vx @@ -1509,6 +1509,7 @@ extra_scripts = ${common.extra_scripts} extends = env:mks_robin_nano_v3 platform_packages = ${stm32_flash_drive.platform_packages} build_flags = ${stm32_flash_drive.build_flags} + -DPIN_WIRE_SCL=PB6 -DPIN_WIRE_SDA=PB7 -DUSBCON -DUSE_USBHOST_HS -DUSBD_IRQ_PRIO=5 @@ -1525,6 +1526,7 @@ extends = env:mks_robin_nano_v3 platform_packages = framework-arduinoststm32@https://github.com/rhapsodyv/Arduino_Core_STM32/archive/usb-host-msc-cdc-msc.zip build_unflags = ${common_stm32.build_unflags} -DUSBD_USE_CDC build_flags = ${stm32_flash_drive.build_flags} + -DPIN_WIRE_SCL=PB6 -DPIN_WIRE_SDA=PB7 -DUSBCON -DUSE_USBHOST_HS -DUSBD_IRQ_PRIO=5 From 13c4eef63752387b1a90b0b0c3834bcf276a5ac8 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 25 Feb 2021 00:56:15 -0600 Subject: [PATCH 017/253] Expose more env builds in PlatformIO extension --- Marlin/src/pins/pins.h | 2 +- platformio.ini | 21 ++++++++++++++++----- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 62545037da..f5b80fd4d0 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -603,7 +603,7 @@ #elif MB(MKS_ROBIN_PRO_V2) #include "stm32f4/pins_MKS_ROBIN_PRO_V2.h" // STM32F4 env:mks_robin_pro2 #elif MB(MKS_ROBIN_NANO_V3) - #include "stm32f4/pins_MKS_ROBIN_NANO_V3.h" // STM32F4 env:mks_robin_nano_v3 env:mks_robin_nano_v3_usb_flash_drive + #include "stm32f4/pins_MKS_ROBIN_NANO_V3.h" // STM32F4 env:mks_robin_nano_v3 env:mks_robin_nano_v3_usb_flash_drive env:mks_robin_nano_v3_usb_flash_drive_msc #elif MB(ANET_ET4) #include "stm32f4/pins_ANET_ET4.h" // STM32F4 env:Anet_ET4_OpenBLT #elif MB(ANET_ET4P) diff --git a/platformio.ini b/platformio.ini index d2ed8a4a5a..5b2e5cd3bd 100644 --- a/platformio.ini +++ b/platformio.ini @@ -1376,6 +1376,7 @@ build_unflags = ${common_stm32.build_unflags} -DUSBCON -DUSBD_USE_CDC -DUS # Lerdge X # [env:LERDGEX] +platform = ${lerdge_common.platform} extends = lerdge_common board_build.firmware = Lerdge_X_firmware_force.bin @@ -1383,6 +1384,7 @@ board_build.firmware = Lerdge_X_firmware_force.bin # Lerdge X with USB Flash Drive Support # [env:LERDGEX_usb_flash_drive] +platform = ${LERDGEX.platform} extends = LERDGEX platform_packages = ${stm32_flash_drive.platform_packages} build_flags = ${stm32_flash_drive.build_flags} @@ -1391,6 +1393,7 @@ build_flags = ${stm32_flash_drive.build_flags} # Lerdge S # [env:LERDGES] +platform = ${lerdge_common.platform} extends = lerdge_common board_build.firmware = Lerdge_firmware_force.bin @@ -1398,6 +1401,7 @@ board_build.firmware = Lerdge_firmware_force.bin # Lerdge S with USB Flash Drive Support # [env:LERDGES_usb_flash_drive] +platform = ${LERDGES.platform} extends = LERDGES platform_packages = ${stm32_flash_drive.platform_packages} build_flags = ${stm32_flash_drive.build_flags} @@ -1406,6 +1410,7 @@ build_flags = ${stm32_flash_drive.build_flags} # Lerdge K # [env:LERDGEK] +platform = ${lerdge_common.platform} extends = lerdge_common board_build.firmware = Lerdge_K_firmware_force.bin build_flags = ${lerdge_common.build_flags} @@ -1415,6 +1420,7 @@ build_flags = ${lerdge_common.build_flags} # Lerdge K with USB Flash Drive Support # [env:LERDGEK_usb_flash_drive] +platform = ${LERDGEK.platform} extends = LERDGEK platform_packages = ${stm32_flash_drive.platform_packages} build_flags = ${stm32_flash_drive.build_flags} @@ -1480,13 +1486,19 @@ extra_scripts = ${common.extra_scripts} pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py buildroot/share/PlatformIO/scripts/stm32_bootloader.py +# +# This SPI is used by Robin Nano V3 +# +[stm32f4_I2C1] +build_flags = -DPIN_WIRE_SCL=PB6 -DPIN_WIRE_SDA=PB7 + # # MKS Robin Nano V3 # [env:mks_robin_nano_v3] platform = ${common_stm32.platform} extends = common_stm32 -build_flags = ${common_stm32.build_flags} -DHAL_PCD_MODULE_ENABLED -DUSBCON -DUSBD_USE_CDC -DPIN_WIRE_SCL=PB6 -DPIN_WIRE_SDA=PB7 +build_flags = ${common_stm32.build_flags} ${stm32f4_I2C1.build_flags} -DHAL_PCD_MODULE_ENABLED -DUSBCON -DUSBD_USE_CDC board = genericSTM32F407VGT6 board_build.core = stm32 board_build.variant = MARLIN_F4x7Vx @@ -1508,8 +1520,7 @@ extra_scripts = ${common.extra_scripts} [env:mks_robin_nano_v3_usb_flash_drive] extends = env:mks_robin_nano_v3 platform_packages = ${stm32_flash_drive.platform_packages} -build_flags = ${stm32_flash_drive.build_flags} - -DPIN_WIRE_SCL=PB6 -DPIN_WIRE_SDA=PB7 +build_flags = ${stm32_flash_drive.build_flags} ${stm32f4_I2C1.build_flags} -DUSBCON -DUSE_USBHOST_HS -DUSBD_IRQ_PRIO=5 @@ -1522,11 +1533,11 @@ build_flags = ${stm32_flash_drive.build_flags} # Currently, using a STM32duino fork, until USB Host and USB Device MSC get merged # [env:mks_robin_nano_v3_usb_flash_drive_msc] +platform = ${common_stm32.platform} extends = env:mks_robin_nano_v3 platform_packages = framework-arduinoststm32@https://github.com/rhapsodyv/Arduino_Core_STM32/archive/usb-host-msc-cdc-msc.zip build_unflags = ${common_stm32.build_unflags} -DUSBD_USE_CDC -build_flags = ${stm32_flash_drive.build_flags} - -DPIN_WIRE_SCL=PB6 -DPIN_WIRE_SDA=PB7 +build_flags = ${stm32_flash_drive.build_flags} ${stm32f4_I2C1.build_flags} -DUSBCON -DUSE_USBHOST_HS -DUSBD_IRQ_PRIO=5 From f003e52009ba649f95463a115253d6dadcf361e6 Mon Sep 17 00:00:00 2001 From: X-Ryl669 Date: Thu, 25 Feb 2021 08:23:29 +0100 Subject: [PATCH 018/253] Combined LPC / Serial fixes (#21178) Co-authored-by: Scott Lahteine --- Marlin/src/HAL/DUE/MarlinSerialUSB.cpp | 11 ++-- Marlin/src/HAL/DUE/MarlinSerialUSB.h | 2 +- Marlin/src/HAL/LPC1768/MarlinSerial.cpp | 42 ++++++++++--- Marlin/src/HAL/LPC1768/MarlinSerial.h | 16 +++-- Marlin/src/HAL/LPC1768/usb_serial.cpp | 4 +- Marlin/src/HAL/shared/Delay.cpp | 4 +- Marlin/src/core/serial.h | 1 - Marlin/src/core/serial_base.h | 2 +- Marlin/src/core/serial_hook.h | 80 +++++++++++++------------ Marlin/src/gcode/queue.cpp | 40 ++++++------- docs/Serial.md | 17 +++++- 11 files changed, 132 insertions(+), 87 deletions(-) diff --git a/Marlin/src/HAL/DUE/MarlinSerialUSB.cpp b/Marlin/src/HAL/DUE/MarlinSerialUSB.cpp index a04993ca35..fca677c798 100644 --- a/Marlin/src/HAL/DUE/MarlinSerialUSB.cpp +++ b/Marlin/src/HAL/DUE/MarlinSerialUSB.cpp @@ -92,12 +92,11 @@ int MarlinSerialUSB::read() { return c; } -bool MarlinSerialUSB::available() { - /* If Pending chars */ - return pending_char >= 0 || - /* or USB CDC enumerated and configured on the PC side and some - bytes where sent to us */ - (usb_task_cdc_isenabled() && udi_cdc_is_rx_ready()); +int MarlinSerialUSB::available() { + if (pending_char > 0) return pending_char; + return pending_char == 0 || + // or USB CDC enumerated and configured on the PC side and some bytes where sent to us */ + (usb_task_cdc_isenabled() && udi_cdc_is_rx_ready()); } void MarlinSerialUSB::flush() { } diff --git a/Marlin/src/HAL/DUE/MarlinSerialUSB.h b/Marlin/src/HAL/DUE/MarlinSerialUSB.h index 5281a006b1..f9cea29869 100644 --- a/Marlin/src/HAL/DUE/MarlinSerialUSB.h +++ b/Marlin/src/HAL/DUE/MarlinSerialUSB.h @@ -39,7 +39,7 @@ struct MarlinSerialUSB { int peek(); int read(); void flush(); - bool available(); + int available(); size_t write(const uint8_t c); #if ENABLED(SERIAL_STATS_DROPPED_RX) diff --git a/Marlin/src/HAL/LPC1768/MarlinSerial.cpp b/Marlin/src/HAL/LPC1768/MarlinSerial.cpp index c636a40a12..b0dfc0ae90 100644 --- a/Marlin/src/HAL/LPC1768/MarlinSerial.cpp +++ b/Marlin/src/HAL/LPC1768/MarlinSerial.cpp @@ -25,20 +25,46 @@ #include "MarlinSerial.h" #if ANY_SERIAL_IS(0) - MSerialT MSerial(true, LPC_UART0); - extern "C" void UART0_IRQHandler() { MSerial.IRQHandler(); } + MarlinSerial _MSerial(LPC_UART0); + MSerialT MSerial(true, _MSerial); + extern "C" void UART0_IRQHandler() { _MSerial.IRQHandler(); } #endif #if ANY_SERIAL_IS(1) - MSerialT MSerial1(true, (LPC_UART_TypeDef *) LPC_UART1); - extern "C" void UART1_IRQHandler() { MSerial1.IRQHandler(); } + MarlinSerial _MSerial1((LPC_UART_TypeDef *) LPC_UART1); + MSerialT MSerial1(true, _MSerial1); + extern "C" void UART1_IRQHandler() { _MSerial1.IRQHandler(); } #endif #if ANY_SERIAL_IS(2) - MSerialT MSerial2(true, LPC_UART2); - extern "C" void UART2_IRQHandler() { MSerial2.IRQHandler(); } + MarlinSerial _MSerial2(LPC_UART2); + MSerialT MSerial2(true, _MSerial2); + extern "C" void UART2_IRQHandler() { _MSerial2.IRQHandler(); } #endif #if ANY_SERIAL_IS(3) - MSerialT MSerial3(true, LPC_UART3); - extern "C" void UART3_IRQHandler() { MSerial3.IRQHandler(); } + MarlinSerial _MSerial3(LPC_UART3); + MSerialT MSerial3(true, _MSerial3); + extern "C" void UART3_IRQHandler() { _MSerial3.IRQHandler(); } +#endif + +#if ENABLED(EMERGENCY_PARSER) + + bool MarlinSerial::recv_callback(const char c) { + // Need to figure out which serial port we are and react in consequence (Marlin does not have CONTAINER_OF macro) + if (false) {} + #if ANY_SERIAL_IS(0) + else if (this == &_MSerial) emergency_parser.update(MSerial.emergency_state, c); + #endif + #if ANY_SERIAL_IS(1) + else if (this == &_MSerial1) emergency_parser.update(MSerial1.emergency_state, c); + #endif + #if ANY_SERIAL_IS(2) + else if (this == &_MSerial2) emergency_parser.update(MSerial2.emergency_state, c); + #endif + #if ANY_SERIAL_IS(3) + else if (this == &_MSerial3) emergency_parser.update(MSerial3.emergency_state, c); + #endif + return true; + } + #endif #endif // TARGET_LPC1768 diff --git a/Marlin/src/HAL/LPC1768/MarlinSerial.h b/Marlin/src/HAL/LPC1768/MarlinSerial.h index de0f62f006..35c9362b9f 100644 --- a/Marlin/src/HAL/LPC1768/MarlinSerial.h +++ b/Marlin/src/HAL/LPC1768/MarlinSerial.h @@ -47,15 +47,21 @@ public: void end() {} #if ENABLED(EMERGENCY_PARSER) - bool recv_callback(const char c) override { - emergency_parser.update(static_cast *>(this)->emergency_state, c); - return true; // do not discard character - } + bool recv_callback(const char c) override; #endif }; -typedef Serial0Type MSerialT; +// On LPC176x framework, HardwareSerial does not implement the same interface as Arduino's Serial, so overloads +// of 'available' and 'read' method are not used in this multiple inheritance scenario. +// Instead, use a ForwardSerial here that adapts the interface. +typedef ForwardSerial0Type MSerialT; extern MSerialT MSerial; extern MSerialT MSerial1; extern MSerialT MSerial2; extern MSerialT MSerial3; + +// Consequently, we can't use a RuntimeSerial either. The workaround would be to use a RuntimeSerial> type here +// Right now, let's ignore this until it's actually required. +#if ENABLED(SERIAL_RUNTIME_HOOK) + #error "SERIAL_RUNTIME_HOOK is not yet supported for LPC176x." +#endif diff --git a/Marlin/src/HAL/LPC1768/usb_serial.cpp b/Marlin/src/HAL/LPC1768/usb_serial.cpp index d225ce4188..3c1fce54f9 100644 --- a/Marlin/src/HAL/LPC1768/usb_serial.cpp +++ b/Marlin/src/HAL/LPC1768/usb_serial.cpp @@ -29,8 +29,8 @@ EmergencyParser::State emergency_state; -bool CDC_RecvCallback(const char buffer) { - emergency_parser.update(emergency_state, buffer); +bool CDC_RecvCallback(const char c) { + emergency_parser.update(emergency_state, c); return true; } diff --git a/Marlin/src/HAL/shared/Delay.cpp b/Marlin/src/HAL/shared/Delay.cpp index 8ff5a88c63..8a021a2155 100644 --- a/Marlin/src/HAL/shared/Delay.cpp +++ b/Marlin/src/HAL/shared/Delay.cpp @@ -51,7 +51,7 @@ // Use hardware cycle counter instead, it's much safer void delay_dwt(uint32_t count) { // Reuse the ASM_CYCLES_PER_ITERATION variable to avoid wasting another useless variable - register uint32_t start = HW_REG(_DWT_CYCCNT) - ASM_CYCLES_PER_ITERATION, elapsed; + uint32_t start = HW_REG(_DWT_CYCCNT) - ASM_CYCLES_PER_ITERATION, elapsed; do { elapsed = HW_REG(_DWT_CYCCNT) - start; } while (elapsed < count); @@ -114,7 +114,7 @@ serialprintPGM(unit); SERIAL_ECHOLNPAIR(" took: ", total); serialprintPGM(unit); - if (do_flush) SERIAL_FLUSH(); + if (do_flush) SERIAL_FLUSHTX(); }; uint32_t s, e; diff --git a/Marlin/src/core/serial.h b/Marlin/src/core/serial.h index 0fe8435789..f5c02f50b6 100644 --- a/Marlin/src/core/serial.h +++ b/Marlin/src/core/serial.h @@ -58,7 +58,6 @@ extern uint8_t marlin_debug_flags; // // Serial redirection // -typedef int8_t serial_index_t; #define SERIAL_ALL 0x7F #if HAS_MULTI_SERIAL #define _PORT_REDIRECT(n,p) REMEMBER(n,multiSerial.portMask,p) diff --git a/Marlin/src/core/serial_base.h b/Marlin/src/core/serial_base.h index 83b03cc7b6..418bb557e7 100644 --- a/Marlin/src/core/serial_base.h +++ b/Marlin/src/core/serial_base.h @@ -79,7 +79,7 @@ struct SerialBase { void end() { static_cast(this)->end(); } /** Check for available data from the port @param index The port index, usually 0 */ - bool available(uint8_t index = 0) { return static_cast(this)->available(index); } + int available(uint8_t index = 0) { return static_cast(this)->available(index); } /** Read a value from the port @param index The port index, usually 0 */ int read(uint8_t index = 0) { return static_cast(this)->read(index); } diff --git a/Marlin/src/core/serial_hook.h b/Marlin/src/core/serial_hook.h index ad8ec12b6e..afd43892c7 100644 --- a/Marlin/src/core/serial_hook.h +++ b/Marlin/src/core/serial_hook.h @@ -24,6 +24,9 @@ #include "macros.h" #include "serial_base.h" +// Used in multiple places +typedef int8_t serial_index_t; + // The most basic serial class: it dispatch to the base serial class with no hook whatsoever. This will compile to nothing but the base serial class template struct BaseSerial : public SerialBase< BaseSerial >, public SerialT { @@ -35,10 +38,11 @@ struct BaseSerial : public SerialBase< BaseSerial >, public SerialT { void msgDone() {} - bool available(uint8_t index) { return index == 0 && SerialT::available(); } - int read(uint8_t index) { return index == 0 ? SerialT::read() : -1; } - bool connected() { return CALL_IF_EXISTS(bool, static_cast(this), connected);; } - void flushTX() { CALL_IF_EXISTS(void, static_cast(this), flushTX); } + // We don't care about indices here, since if one can call us, it's the right index anyway + int available(uint8_t) { return (int)SerialT::available(); } + int read(uint8_t) { return (int)SerialT::read(); } + bool connected() { return CALL_IF_EXISTS(bool, static_cast(this), connected);; } + void flushTX() { CALL_IF_EXISTS(void, static_cast(this), flushTX); } // We have 2 implementation of the same method in both base class, let's say which one we want using SerialT::available; @@ -65,18 +69,19 @@ struct ConditionalSerial : public SerialBase< ConditionalSerial > { bool & condition; SerialT & out; NO_INLINE size_t write(uint8_t c) { if (condition) return out.write(c); return 0; } - void flush() { if (condition) out.flush(); } - void begin(long br) { out.begin(br); } - void end() { out.end(); } + void flush() { if (condition) out.flush(); } + void begin(long br) { out.begin(br); } + void end() { out.end(); } void msgDone() {} - bool connected() { return CALL_IF_EXISTS(bool, &out, connected); } - void flushTX() { CALL_IF_EXISTS(void, &out, flushTX); } + bool connected() { return CALL_IF_EXISTS(bool, &out, connected); } + void flushTX() { CALL_IF_EXISTS(void, &out, flushTX); } + + int available(uint8_t ) { return (int)out.available(); } + int read(uint8_t ) { return (int)out.read(); } + int available() { return (int)out.available(); } + int read() { return (int)out.read(); } - bool available(uint8_t index) { return index == 0 && out.available(); } - int read(uint8_t index) { return index == 0 ? out.read() : -1; } - using BaseClassT::available; - using BaseClassT::read; ConditionalSerial(bool & conditionVariable, SerialT & out, const bool e) : BaseClassT(e), condition(conditionVariable), out(out) {} }; @@ -97,10 +102,10 @@ struct ForwardSerial : public SerialBase< ForwardSerial > { bool connected() { return Private::HasMember_connected::value ? CALL_IF_EXISTS(bool, &out, connected) : (bool)out; } void flushTX() { CALL_IF_EXISTS(void, &out, flushTX); } - bool available(uint8_t index) { return index == 0 && out.available(); } - int read(uint8_t index) { return index == 0 ? out.read() : -1; } - bool available() { return out.available(); } - int read() { return out.read(); } + int available(uint8_t) { return (int)out.available(); } + int read(uint8_t) { return (int)out.read(); } + int available() { return (int)out.available(); } + int read() { return (int)out.read(); } ForwardSerial(const bool e, SerialT & out) : BaseClassT(e), out(out) {} }; @@ -125,8 +130,8 @@ struct RuntimeSerial : public SerialBase< RuntimeSerial >, public Seria if (eofHook) eofHook(userPointer); } - bool available(uint8_t index) { return index == 0 && SerialT::available(); } - int read(uint8_t index) { return index == 0 ? SerialT::read() : -1; } + int available(uint8_t) { return (int)SerialT::available(); } + int read(uint8_t) { return (int)SerialT::read(); } using SerialT::available; using SerialT::read; using SerialT::flush; @@ -157,21 +162,22 @@ struct RuntimeSerial : public SerialBase< RuntimeSerial >, public Seria // Forward constructor template - RuntimeSerial(const bool e, Args... args) : BaseClassT(e), SerialT(args...) {} + RuntimeSerial(const bool e, Args... args) : BaseClassT(e), SerialT(args...), writeHook(0), eofHook(0), userPointer(0) {} }; // A class that's duplicating its output conditionally to 2 serial interface -template -struct MultiSerial : public SerialBase< MultiSerial > { - typedef SerialBase< MultiSerial > BaseClassT; +template +struct MultiSerial : public SerialBase< MultiSerial > { + typedef SerialBase< MultiSerial > BaseClassT; uint8_t portMask; Serial0T & serial0; Serial1T & serial1; enum Masks { - FirstOutputMask = (1 << offset), - SecondOutputMask = (1 << (offset + 1)), + UsageMask = ((1 << step) - 1), // A bit mask containing as many bits as step + FirstOutputMask = (UsageMask << offset), + SecondOutputMask = (UsageMask << (offset + step)), AllMask = FirstOutputMask | SecondOutputMask, }; @@ -185,19 +191,19 @@ struct MultiSerial : public SerialBase< MultiSerial if (portMask & FirstOutputMask) serial0.msgDone(); if (portMask & SecondOutputMask) serial1.msgDone(); } - bool available(uint8_t index) { - switch(index) { - case 0 + offset: return serial0.available(); - case 1 + offset: return serial1.available(); - default: return false; - } + int available(uint8_t index) { + if (index >= 0 + offset && index < step + offset) + return serial0.available(index); + else if (index >= step + offset && index < 2 * step + offset) + return serial1.available(index); + return false; } - NO_INLINE int read(uint8_t index) { - switch(index) { - case 0 + offset: return serial0.read(); - case 1 + offset: return serial1.read(); - default: return -1; - } + int read(uint8_t index) { + if (index >= 0 + offset && index < step + offset) + return serial0.read(index); + else if (index >= step + offset && index < 2 * step + offset) + return serial1.read(index); + return -1; } void begin(const long br) { if (portMask & FirstOutputMask) serial0.begin(br); diff --git a/Marlin/src/gcode/queue.cpp b/Marlin/src/gcode/queue.cpp index c49247912c..8c9e9afdc1 100644 --- a/Marlin/src/gcode/queue.cpp +++ b/Marlin/src/gcode/queue.cpp @@ -63,6 +63,10 @@ GCodeQueue queue; // Frequently used G-code strings PGMSTR(G28_STR, "G28"); +#if NO_TIMEOUTS > 0 + static millis_t last_command_time = 0; +#endif + /** * GCode line number handling. Hosts may opt to include line numbers when * sending commands to Marlin, and lines will be checked for sequentiality. @@ -288,6 +292,10 @@ void GCodeQueue::enqueue_now_P(PGM_P const pgcode) { * B Block queue space remaining */ void GCodeQueue::ok_to_send() { + #if NO_TIMEOUTS > 0 + // Start counting from the last command's execution + last_command_time = millis(); + #endif #if HAS_MULTI_SERIAL const serial_index_t serial_ind = command_port(); if (serial_ind < 0) return; @@ -324,28 +332,19 @@ void GCodeQueue::flush_and_request_resend() { ok_to_send(); } -inline bool serial_data_available() { - byte data_available = 0; - if (MYSERIAL0.available()) data_available++; - #ifdef SERIAL_PORT_2 - const bool port2_open = TERN1(HAS_ETHERNET, ethernet.have_telnet_client); - if (port2_open && MYSERIAL1.available()) data_available++; - #endif - return data_available > 0; + +// Multiserial already handle the dispatch to/from multiple port by itself +inline bool serial_data_available(uint8_t index = SERIAL_ALL) { + if (index == SERIAL_ALL) { + for (index = 0; index < NUM_SERIAL; index++) { + if (SERIAL_IMPL.available(index) > 0) return true; + } + return false; + } + return SERIAL_IMPL.available(index) > 0; } -inline int read_serial(const uint8_t index) { - switch (index) { - case 0: return MYSERIAL0.read(); - case 1: { - #if HAS_MULTI_SERIAL - const bool port2_open = TERN1(HAS_ETHERNET, ethernet.have_telnet_client); - if (port2_open) return MYSERIAL1.read(); - #endif - } - default: return -1; - } -} +inline int read_serial(const uint8_t index) { return SERIAL_IMPL.read(index); } void GCodeQueue::gcode_line_error(PGM_P const err, const serial_index_t serial_ind) { PORT_REDIRECT(SERIAL_PORTMASK(serial_ind)); // Reply to the serial port that sent the command @@ -460,7 +459,6 @@ void GCodeQueue::get_serial_commands() { // If the command buffer is empty for too long, // send "wait" to indicate Marlin is still waiting. #if NO_TIMEOUTS > 0 - static millis_t last_command_time = 0; const millis_t ms = millis(); if (length == 0 && !serial_data_available() && ELAPSED(ms, last_command_time + NO_TIMEOUTS)) { SERIAL_ECHOLNPGM(STR_WAIT); diff --git a/docs/Serial.md b/docs/Serial.md index 0db8175b3d..b4079d765f 100644 --- a/docs/Serial.md +++ b/docs/Serial.md @@ -30,14 +30,25 @@ In the `Marlin/src/core/serial_hook.h` file, the different serial feature are de Since all the types above are using CRTP, it's possible to combine them to get the appropriate functionality. This is easily done via type definition of the feature. -For example, to present a serial interface that's outputting to 2 serial port, the first one being hooked at runtime and the second one connected to a runtime switchable telnet client, you'll declare the type to use as: +For example, to create a single serial interface with 2 serial outputs (one enabled at runtime and the other switchable): ```cpp typedef MultiSerial< RuntimeSerial, ConditionalSerial > Serial0Type; ``` +To send the same output to 4 serial ports you could nest `MultiSerial` like this: +```cpp +typedef MultiSerial< MultiSerial< BaseSerial, BaseSerial >, MultiSerial< BaseSerial, BaseSerial, 2, 1>, 0, 2> Serial0Type; +``` +The magical numbers here are the step and offset for computing the serial port. Simplifying the above monster a bit: +```cpp +MS< A = MS, B=MS, offset=0, step=2> +``` +This means that the underlying multiserial A (with output to `a,b`) is available from offset = 0 to offset + step = 1 (default value). +The multiserial B (with output to `c,d`) is available from offset = 2 (the next step from the root multiserial) to offset + step = 3. +In practice, the root multiserial will redirect any index/mask `offset` to `offset + step - 1` to its first leaf, and any index/mask `offset + step` to `offset + 2*step - 1` to its second leaf. + ## Emergency parser -By default, the serial base interface provide an emergency parser that's only enable for serial classes that support it. -Because of this condition, all underlying type takes a first `bool emergencyParserEnabled` argument to their constructor. You must take into account this parameter when defining the actual type used. +By default, the serial base interface provide an emergency parser that's only enable for serial classes that support it. Because of this condition, all underlying types take a first `bool emergencyParserEnabled` argument to their constructor. You must take into account this parameter when defining the actual type used. ## SERIAL macros The following macros are defined (in `serial.h`) to output data to the serial ports: From 0cc03f912cf0a7f0923bdcf8ee6981e03da15fde Mon Sep 17 00:00:00 2001 From: X-Ryl669 Date: Thu, 25 Feb 2021 08:26:56 +0100 Subject: [PATCH 019/253] Let libmaple accept RX/TX_BUFFER_SIZE (#21177) --- .../PlatformIO/scripts/fix_framework_weakness.py | 12 ++++++++++++ platformio.ini | 12 ++++++------ 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/buildroot/share/PlatformIO/scripts/fix_framework_weakness.py b/buildroot/share/PlatformIO/scripts/fix_framework_weakness.py index 94076cfbab..4944c0003b 100644 --- a/buildroot/share/PlatformIO/scripts/fix_framework_weakness.py +++ b/buildroot/share/PlatformIO/scripts/fix_framework_weakness.py @@ -27,3 +27,15 @@ if env.MarlinFeatureIsEnabled("POSTMORTEM_DEBUGGING"): print("Done patching exception handler") print("Libmaple modified and ready for post mortem debugging") + +rxBuf = env["MARLIN_FEATURES"]["RX_BUFFER_SIZE"] if "RX_BUFFER_SIZE" in env["MARLIN_FEATURES"] else "0" +txBuf = env["MARLIN_FEATURES"]["TX_BUFFER_SIZE"] if "TX_BUFFER_SIZE" in env["MARLIN_FEATURES"] else "0" +if int(rxBuf) < 64: + rxBuf = "64" + +if int(txBuf) < 64: + txBuf = "64" + +build_flags = env.get('BUILD_FLAGS') +build_flags.append("-DUSART_RX_BUF_SIZE=" + rxBuf + " -DUSART_TX_BUF_SIZE=" + txBuf) +env.Replace(BUILD_FLAGS=build_flags) diff --git a/platformio.ini b/platformio.ini index 5b2e5cd3bd..fab20018d9 100644 --- a/platformio.ini +++ b/platformio.ini @@ -753,7 +753,7 @@ lib_deps = ${common.lib_deps} SoftwareSerialM platform_packages = tool-stm32duino extra_scripts = ${common.extra_scripts} - buildroot/share/PlatformIO/scripts/fix_framework_weakness.py + pre:buildroot/share/PlatformIO/scripts/fix_framework_weakness.py # # STM32F103RC @@ -795,7 +795,7 @@ upload_protocol = dfu [env:STM32F103RC_fysetc] platform = ${common_stm32f1.platform} extends = env:STM32F103RC -extra_scripts = ${common.extra_scripts} +extra_scripts = ${common_stm32f1.extra_scripts} buildroot/share/PlatformIO/scripts/STM32F103RC_fysetc.py build_flags = ${common_stm32f1.build_flags} -DDEBUG_LEVEL=0 lib_ldf_mode = chain @@ -819,7 +819,7 @@ upload_protocol = serial [env:STM32F103RC_btt] platform = ${common_stm32f1.platform} extends = env:STM32F103RC -extra_scripts = ${common.extra_scripts} +extra_scripts = ${common_stm32f1.extra_scripts} buildroot/share/PlatformIO/scripts/STM32F103RC_SKR_MINI.py build_flags = ${common_stm32f1.build_flags} -DDEBUG_LEVEL=0 -DSS_TIMER=4 @@ -861,7 +861,7 @@ monitor_speed = 115200 [env:STM32F103RE_btt] platform = ${common_stm32f1.platform} extends = env:STM32F103RE -extra_scripts = ${common.extra_scripts} +extra_scripts = ${common_stm32f1.extra_scripts} buildroot/share/PlatformIO/scripts/STM32F103RE_SKR_E3_DIP.py build_flags = ${common_stm32f1.build_flags} -DDEBUG_LEVEL=0 -DSS_TIMER=4 debug_tool = stlink @@ -951,7 +951,7 @@ build_flags = ${common_stm32f1.build_flags} platform = ${common_stm32f1.platform} extends = common_stm32f1 board = genericSTM32F103VE -extra_scripts = ${common.extra_scripts} +extra_scripts = ${common_stm32f1.extra_scripts} buildroot/share/PlatformIO/scripts/mks_robin_nano35.py build_flags = ${common_stm32f1.build_flags} -DMCU_STM32F103VE -DSS_TIMER=4 @@ -1019,7 +1019,7 @@ platform = ${common_stm32f1.platform} extends = common_stm32f1 board = genericSTM32F103RC platform_packages = tool-stm32duino -extra_scripts = ${common.extra_scripts} +extra_scripts = ${common_stm32f1.extra_scripts} buildroot/share/PlatformIO/scripts/mks_robin_e3.py build_flags = ${common_stm32f1.build_flags} -DDEBUG_LEVEL=0 -DSS_TIMER=4 From 73e354b7a02d1a88bd1a97a484be2744353a7e83 Mon Sep 17 00:00:00 2001 From: Nick Date: Thu, 25 Feb 2021 07:38:01 +0000 Subject: [PATCH 020/253] Fix Anycubic Chiron TFT SD menu (#21183) --- Marlin/src/lcd/extui/lib/anycubic_chiron/FileNavigator.cpp | 2 +- Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/FileNavigator.cpp b/Marlin/src/lcd/extui/lib/anycubic_chiron/FileNavigator.cpp index 19f8ec81bc..7d813a6ab0 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_chiron/FileNavigator.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic_chiron/FileNavigator.cpp @@ -114,7 +114,7 @@ namespace Anycubic { } else { // Logical Name - TFTSer.print("/"); + TFTSer.write('/'); if (folderdepth > 0) TFTSer.print(currentfoldername); TFTSer.println(filelist.shortFilename()); diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp index c50de1c0a1..37f3c4e320 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp @@ -578,8 +578,8 @@ namespace Anycubic { case 15: // A15 Resuming from outage if (printer_state == AC_printer_resuming_from_power_outage) { // Need to home here to restore the Z position - injectCommands(AC_cmnd_power_loss_recovery); - injectCommands("M1000"); // home and start recovery + injectCommands_P(AC_cmnd_power_loss_recovery); + injectCommands_P(PSTR("M1000")); // home and start recovery } break; From 3061a31c92fd5c24172279d411c97587633adb64 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 25 Feb 2021 01:56:11 -0600 Subject: [PATCH 021/253] Update BLTOUCH_HS_MODE comment --- Marlin/Configuration_adv.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 50f17d1b9e..7ec81c6675 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -743,8 +743,8 @@ /** * Use "HIGH SPEED" mode for probing. * Danger: Disable if your probe sometimes fails. Only suitable for stable well-adjusted systems. - * This feature was designed for Delta's with very fast Z moves however higher speed cartesians may function - * If the machine cannot raise the probe fast enough after a trigger, it may enter a fault state. + * This feature was designed for Deltabots with very fast Z moves; however, higher speed Cartesians + * might be able to use it. If the machine can't raise Z fast enough the BLTouch may go into ALARM. */ //#define BLTOUCH_HS_MODE From d167af4c388df18601380a7edcd5bd6d221458c0 Mon Sep 17 00:00:00 2001 From: Tanguy Pruvot Date: Thu, 25 Feb 2021 11:35:18 +0100 Subject: [PATCH 022/253] Add BOARD_PREINIT (for Longer3D open drain pins) (#21159) --- Marlin/src/MarlinCore.cpp | 3 +++ Marlin/src/module/temperature.cpp | 6 +++--- Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h | 13 +++++++++++-- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 8aa6cdd6c8..d523882d41 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -870,6 +870,9 @@ inline void tmc_standby_setup() { * • Max7219 */ void setup() { + #ifdef BOARD_PREINIT + BOARD_PREINIT(); // Low-level init (before serial init) + #endif tmc_standby_setup(); // TMC Low Power Standby pins must be set early or they're not usable diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 58b0a965c9..a220386b9e 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -1793,7 +1793,7 @@ void Temperature::updateTemperaturesFromRawValues() { #endif // Init fans according to whether they're native PWM or Software PWM -#ifdef ALFAWISE_UX0 +#ifdef BOARD_OPENDRAIN_MOSFETS #define _INIT_SOFT_FAN(P) OUT_WRITE_OD(P, FAN_INVERTING ? LOW : HIGH) #else #define _INIT_SOFT_FAN(P) OUT_WRITE(P, FAN_INVERTING ? LOW : HIGH) @@ -1886,7 +1886,7 @@ void Temperature::init() { #endif #if HAS_HEATER_0 - #ifdef ALFAWISE_UX0 + #ifdef BOARD_OPENDRAIN_MOSFETS OUT_WRITE_OD(HEATER_0_PIN, HEATER_0_INVERTING); #else OUT_WRITE(HEATER_0_PIN, HEATER_0_INVERTING); @@ -1916,7 +1916,7 @@ void Temperature::init() { #endif #if HAS_HEATED_BED - #ifdef ALFAWISE_UX0 + #ifdef BOARD_OPENDRAIN_MOSFETS OUT_WRITE_OD(HEATER_BED_PIN, HEATER_BED_INVERTING); #else OUT_WRITE(HEATER_BED_PIN, HEATER_BED_INVERTING); diff --git a/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h b/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h index 33f995dcae..fa708b248e 100644 --- a/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h +++ b/Marlin/src/pins/stm32f1/pins_LONGER3D_LK.h @@ -29,7 +29,6 @@ #endif #define BOARD_INFO_NAME "Longer3D" -#define ALFAWISE_UX0 // Common to all Longer3D STM32F1 boards (used for Open drain mosfets) #define BOARD_NO_NATIVE_USB @@ -92,10 +91,20 @@ #define FAN_MAX_PWM 255 //#define BEEPER_PIN PD13 // pin 60 (Servo PWM output 5V/GND on Board V0G+) made for BL-Touch sensor - // Can drive a PC Buzzer, if connected between PWM and 5V pins + // Can drive a PC Buzzer, if connected between PWM and 5V pins #define LED_PIN PC2 // pin 17 +// Longer3D board mosfets are passing by default +// Avoid nozzle heat and fan start before serial init +#define BOARD_OPENDRAIN_MOSFETS + +#define BOARD_PREINIT() { \ + OUT_WRITE_OD(HEATER_0_PIN, 0); \ + OUT_WRITE_OD(HEATER_BED_PIN, 0); \ + OUT_WRITE_OD(FAN_PIN, 0); \ +} + // // PWM for a servo probe // Other servo devices are not supported on this board! From 468e437390afdb1de7059e7f9049d0b30c312024 Mon Sep 17 00:00:00 2001 From: deirdreobyrne Date: Thu, 25 Feb 2021 10:49:34 +0000 Subject: [PATCH 023/253] Allow Zero Endstops (e.g., for CNC) (#21120) Co-authored-by: Scott Lahteine --- Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp | 4 +- Marlin/src/gcode/bedlevel/G26.cpp | 22 +- Marlin/src/gcode/calibrate/M48.cpp | 2 +- Marlin/src/inc/Conditionals_LCD.h | 7 + Marlin/src/inc/SanityCheck.h | 64 +- Marlin/src/libs/L64XX/L64XX_Marlin.cpp | 12 +- Marlin/src/module/motion.cpp | 1313 +++++++++---------- Marlin/src/module/motion.h | 69 +- Marlin/src/module/planner.h | 8 +- Marlin/src/module/probe.h | 8 +- buildroot/tests/teensy31-tests | 8 + 11 files changed, 778 insertions(+), 739 deletions(-) diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp index 9bd7f63a7e..6ceb571ee2 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp @@ -1118,8 +1118,8 @@ bool unified_bed_leveling::g29_parameter_parsing() { } // If X or Y are not valid, use center of the bed values - if (!WITHIN(sx, X_MIN_BED, X_MAX_BED)) sx = X_CENTER; - if (!WITHIN(sy, Y_MIN_BED, Y_MAX_BED)) sy = Y_CENTER; + if (!COORDINATE_OKAY(sx, X_MIN_BED, X_MAX_BED)) sx = X_CENTER; + if (!COORDINATE_OKAY(sy, Y_MIN_BED, Y_MAX_BED)) sy = Y_CENTER; if (err_flag) return UBL_ERR; diff --git a/Marlin/src/gcode/bedlevel/G26.cpp b/Marlin/src/gcode/bedlevel/G26.cpp index 9e3cad34f2..ed29959055 100644 --- a/Marlin/src/gcode/bedlevel/G26.cpp +++ b/Marlin/src/gcode/bedlevel/G26.cpp @@ -319,9 +319,13 @@ inline bool look_for_lines_to_connect() { s.x = _GET_MESH_X( i ) + (INTERSECTION_CIRCLE_RADIUS - (CROSSHAIRS_SIZE)); // right edge e.x = _GET_MESH_X(i + 1) - (INTERSECTION_CIRCLE_RADIUS - (CROSSHAIRS_SIZE)); // left edge - LIMIT(s.x, X_MIN_POS + 1, X_MAX_POS - 1); - s.y = e.y = constrain(_GET_MESH_Y(j), Y_MIN_POS + 1, Y_MAX_POS - 1); - LIMIT(e.x, X_MIN_POS + 1, X_MAX_POS - 1); + #if HAS_ENDSTOPS + LIMIT(s.x, X_MIN_POS + 1, X_MAX_POS - 1); + s.y = e.y = constrain(_GET_MESH_Y(j), Y_MIN_POS + 1, Y_MAX_POS - 1); + LIMIT(e.x, X_MIN_POS + 1, X_MAX_POS - 1); + #else + s.y = e.y = _GET_MESH_Y(j); + #endif if (position_is_reachable(s.x, s.y) && position_is_reachable(e.x, e.y)) print_line_from_here_to_there(s, e); @@ -339,9 +343,13 @@ inline bool look_for_lines_to_connect() { s.y = _GET_MESH_Y( j ) + (INTERSECTION_CIRCLE_RADIUS - (CROSSHAIRS_SIZE)); // top edge e.y = _GET_MESH_Y(j + 1) - (INTERSECTION_CIRCLE_RADIUS - (CROSSHAIRS_SIZE)); // bottom edge - s.x = e.x = constrain(_GET_MESH_X(i), X_MIN_POS + 1, X_MAX_POS - 1); - LIMIT(s.y, Y_MIN_POS + 1, Y_MAX_POS - 1); - LIMIT(e.y, Y_MIN_POS + 1, Y_MAX_POS - 1); + #if HAS_ENDSTOPS + s.x = e.x = constrain(_GET_MESH_X(i), X_MIN_POS + 1, X_MAX_POS - 1); + LIMIT(s.y, Y_MIN_POS + 1, Y_MAX_POS - 1); + LIMIT(e.y, Y_MIN_POS + 1, Y_MAX_POS - 1); + #else + s.x = e.x = _GET_MESH_X(i); + #endif if (position_is_reachable(s.x, s.y) && position_is_reachable(e.x, e.y)) print_line_from_here_to_there(s, e); @@ -826,7 +834,7 @@ void GcodeSuite::G26() { #if IS_KINEMATIC // Check to make sure this segment is entirely on the bed, skip if not. if (!position_is_reachable(p) || !position_is_reachable(q)) continue; - #else + #elif HAS_ENDSTOPS LIMIT(p.x, X_MIN_POS + 1, X_MAX_POS - 1); // Prevent hitting the endstops LIMIT(p.y, Y_MIN_POS + 1, Y_MAX_POS - 1); LIMIT(q.x, X_MIN_POS + 1, X_MAX_POS - 1); diff --git a/Marlin/src/gcode/calibrate/M48.cpp b/Marlin/src/gcode/calibrate/M48.cpp index 63d2370697..0c6176173c 100644 --- a/Marlin/src/gcode/calibrate/M48.cpp +++ b/Marlin/src/gcode/calibrate/M48.cpp @@ -202,7 +202,7 @@ void GcodeSuite::M48() { if (verbose_level > 3) SERIAL_ECHOLNPAIR_P(PSTR("Moving inward: X"), next_pos.x, SP_Y_STR, next_pos.y); } - #else + #elif HAS_ENDSTOPS // For a rectangular bed just keep the probe in bounds LIMIT(next_pos.x, X_MIN_POS, X_MAX_POS); LIMIT(next_pos.y, Y_MIN_POS, Y_MAX_POS); diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index 7ac4fe4c31..cff1424eb3 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -1195,3 +1195,10 @@ #define TOUCH_ORIENTATION TOUCH_LANDSCAPE #endif #endif + +#if ANY(USE_XMIN_PLUG, USE_YMIN_PLUG, USE_ZMIN_PLUG, USE_XMAX_PLUG, USE_YMAX_PLUG, USE_ZMAX_PLUG) + #define HAS_ENDSTOPS 1 + #define COORDINATE_OKAY(N,L,H) WITHIN(N,L,H) +#else + #define COORDINATE_OKAY(N,L,H) true +#endif diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index ba69b4792e..d6d2a600a0 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -2016,39 +2016,41 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal && !(ENABLED(A##_MULTI_ENDSTOPS) && WITHIN(A##2_USE_ENDSTOP, _##P##MAX_, _##P##MIN_)) ) #define _AXIS_PLUG_UNUSED_TEST(A) (_PLUG_UNUSED_TEST(A,X) && _PLUG_UNUSED_TEST(A,Y) && _PLUG_UNUSED_TEST(A,Z)) -// At least 3 endstop plugs must be used -#if _AXIS_PLUG_UNUSED_TEST(X) - #error "You must enable USE_XMIN_PLUG or USE_XMAX_PLUG." -#endif -#if _AXIS_PLUG_UNUSED_TEST(Y) - #error "You must enable USE_YMIN_PLUG or USE_YMAX_PLUG." -#endif -#if _AXIS_PLUG_UNUSED_TEST(Z) - #error "You must enable USE_ZMIN_PLUG or USE_ZMAX_PLUG." -#endif - -// Delta and Cartesian use 3 homing endstops -#if NONE(IS_SCARA, SPI_ENDSTOPS) - #if X_HOME_DIR < 0 && DISABLED(USE_XMIN_PLUG) - #error "Enable USE_XMIN_PLUG when homing X to MIN." - #elif X_HOME_DIR > 0 && DISABLED(USE_XMAX_PLUG) - #error "Enable USE_XMAX_PLUG when homing X to MAX." - #elif Y_HOME_DIR < 0 && DISABLED(USE_YMIN_PLUG) - #error "Enable USE_YMIN_PLUG when homing Y to MIN." - #elif Y_HOME_DIR > 0 && DISABLED(USE_YMAX_PLUG) - #error "Enable USE_YMAX_PLUG when homing Y to MAX." +// A machine with endstops must have a minimum of 3 +#if HAS_ENDSTOPS + #if _AXIS_PLUG_UNUSED_TEST(X) + #error "You must enable USE_XMIN_PLUG or USE_XMAX_PLUG." + #endif + #if _AXIS_PLUG_UNUSED_TEST(Y) + #error "You must enable USE_YMIN_PLUG or USE_YMAX_PLUG." + #endif + #if _AXIS_PLUG_UNUSED_TEST(Z) + #error "You must enable USE_ZMIN_PLUG or USE_ZMAX_PLUG." #endif -#endif -// Z homing direction and plug usage flags -#if Z_HOME_DIR < 0 && NONE(USE_ZMIN_PLUG, HOMING_Z_WITH_PROBE) - #error "Enable USE_ZMIN_PLUG when homing Z to MIN." -#elif Z_HOME_DIR > 0 && ENABLED(USE_PROBE_FOR_Z_HOMING) - #error "Z_HOME_DIR must be -1 when homing Z with the probe." -#elif BOTH(HOMING_Z_WITH_PROBE, Z_MULTI_ENDSTOPS) - #error "Z_MULTI_ENDSTOPS is incompatible with USE_PROBE_FOR_Z_HOMING." -#elif Z_HOME_DIR > 0 && DISABLED(USE_ZMAX_PLUG) - #error "Enable USE_ZMAX_PLUG when homing Z to MAX." + // Delta and Cartesian use 3 homing endstops + #if NONE(IS_SCARA, SPI_ENDSTOPS) + #if X_HOME_DIR < 0 && DISABLED(USE_XMIN_PLUG) + #error "Enable USE_XMIN_PLUG when homing X to MIN." + #elif X_HOME_DIR > 0 && DISABLED(USE_XMAX_PLUG) + #error "Enable USE_XMAX_PLUG when homing X to MAX." + #elif Y_HOME_DIR < 0 && DISABLED(USE_YMIN_PLUG) + #error "Enable USE_YMIN_PLUG when homing Y to MIN." + #elif Y_HOME_DIR > 0 && DISABLED(USE_YMAX_PLUG) + #error "Enable USE_YMAX_PLUG when homing Y to MAX." + #endif + #endif + + // Z homing direction and plug usage flags + #if Z_HOME_DIR < 0 && NONE(USE_ZMIN_PLUG, HOMING_Z_WITH_PROBE) + #error "Enable USE_ZMIN_PLUG when homing Z to MIN." + #elif Z_HOME_DIR > 0 && ENABLED(USE_PROBE_FOR_Z_HOMING) + #error "Z_HOME_DIR must be -1 when homing Z with the probe." + #elif BOTH(HOMING_Z_WITH_PROBE, Z_MULTI_ENDSTOPS) + #error "Z_MULTI_ENDSTOPS is incompatible with USE_PROBE_FOR_Z_HOMING." + #elif Z_HOME_DIR > 0 && DISABLED(USE_ZMAX_PLUG) + #error "Enable USE_ZMAX_PLUG when homing Z to MAX." + #endif #endif #if BOTH(HOME_Z_FIRST, USE_PROBE_FOR_Z_HOMING) diff --git a/Marlin/src/libs/L64XX/L64XX_Marlin.cpp b/Marlin/src/libs/L64XX/L64XX_Marlin.cpp index 7d36a02d67..0358f3f59a 100644 --- a/Marlin/src/libs/L64XX/L64XX_Marlin.cpp +++ b/Marlin/src/libs/L64XX/L64XX_Marlin.cpp @@ -446,10 +446,8 @@ uint8_t L64XX_Marlin::get_user_input(uint8_t &driver_count, L64XX_axis_t axis_in position_max = X_center + displacement; echo_min_max('X', position_min, position_max); if (false - #ifdef X_MIN_POS + #if HAS_ENDSTOPS || position_min < (X_MIN_POS) - #endif - #ifdef X_MAX_POS || position_max > (X_MAX_POS) #endif ) { @@ -463,10 +461,8 @@ uint8_t L64XX_Marlin::get_user_input(uint8_t &driver_count, L64XX_axis_t axis_in position_max = Y_center + displacement; echo_min_max('Y', position_min, position_max); if (false - #ifdef Y_MIN_POS + #if HAS_ENDSTOPS || position_min < (Y_MIN_POS) - #endif - #ifdef Y_MAX_POS || position_max > (Y_MAX_POS) #endif ) { @@ -480,10 +476,8 @@ uint8_t L64XX_Marlin::get_user_input(uint8_t &driver_count, L64XX_axis_t axis_in position_max = Z_center + displacement; echo_min_max('Z', position_min, position_max); if (false - #ifdef Z_MIN_POS + #if HAS_ENDSTOPS || position_min < (Z_MIN_POS) - #endif - #ifdef Z_MAX_POS || position_max > (Z_MAX_POS) #endif ) { diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index 8dc84c33d6..10d3585a73 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -74,17 +74,6 @@ #define DEBUG_OUT ENABLED(DEBUG_LEVELING_FEATURE) #include "../core/debug_out.h" -/** - * axis_homed - * Flags that each linear axis was homed. - * XYZ on cartesian, ABC on delta, ABZ on SCARA. - * - * axis_trusted - * Flags that the position is trusted in each linear axis. Set when homed. - * Cleared whenever a stepper powers off, potentially losing its position. - */ -uint8_t axis_homed, axis_trusted; // = 0 - // Relative Mode. Enable with G91, disable with G90. bool relative_mode; // = false; @@ -1122,262 +1111,692 @@ void prepare_line_to_destination() { current_position = destination; } -uint8_t axes_should_home(uint8_t axis_bits/*=0x07*/) { - #define SHOULD_HOME(A) TERN(HOME_AFTER_DEACTIVATE, axis_is_trusted, axis_was_homed)(A) - // Clear test bits that are trusted - if (TEST(axis_bits, X_AXIS) && SHOULD_HOME(X_AXIS)) CBI(axis_bits, X_AXIS); - if (TEST(axis_bits, Y_AXIS) && SHOULD_HOME(Y_AXIS)) CBI(axis_bits, Y_AXIS); - if (TEST(axis_bits, Z_AXIS) && SHOULD_HOME(Z_AXIS)) CBI(axis_bits, Z_AXIS); - return axis_bits; -} +#if HAS_ENDSTOPS -bool homing_needed_error(uint8_t axis_bits/*=0x07*/) { - if ((axis_bits = axes_should_home(axis_bits))) { - PGM_P home_first = GET_TEXT(MSG_HOME_FIRST); - char msg[strlen_P(home_first)+1]; - sprintf_P(msg, home_first, - TEST(axis_bits, X_AXIS) ? "X" : "", - TEST(axis_bits, Y_AXIS) ? "Y" : "", - TEST(axis_bits, Z_AXIS) ? "Z" : "" - ); - SERIAL_ECHO_START(); - SERIAL_ECHOLN(msg); - TERN_(HAS_DISPLAY, ui.set_status(msg)); - return true; + uint8_t axis_homed, axis_trusted; // = 0 + + uint8_t axes_should_home(uint8_t axis_bits/*=0x07*/) { + #define SHOULD_HOME(A) TERN(HOME_AFTER_DEACTIVATE, axis_is_trusted, axis_was_homed)(A) + // Clear test bits that are trusted + if (TEST(axis_bits, X_AXIS) && SHOULD_HOME(X_AXIS)) CBI(axis_bits, X_AXIS); + if (TEST(axis_bits, Y_AXIS) && SHOULD_HOME(Y_AXIS)) CBI(axis_bits, Y_AXIS); + if (TEST(axis_bits, Z_AXIS) && SHOULD_HOME(Z_AXIS)) CBI(axis_bits, Z_AXIS); + return axis_bits; } - return false; -} -/** - * Homing bump feedrate (mm/s) - */ -feedRate_t get_homing_bump_feedrate(const AxisEnum axis) { - #if HOMING_Z_WITH_PROBE - if (axis == Z_AXIS) return MMM_TO_MMS(Z_PROBE_SPEED_SLOW); - #endif - static const uint8_t homing_bump_divisor[] PROGMEM = HOMING_BUMP_DIVISOR; - uint8_t hbd = pgm_read_byte(&homing_bump_divisor[axis]); - if (hbd < 1) { - hbd = 10; - SERIAL_ECHO_MSG("Warning: Homing Bump Divisor < 1"); + bool homing_needed_error(uint8_t axis_bits/*=0x07*/) { + if ((axis_bits = axes_should_home(axis_bits))) { + PGM_P home_first = GET_TEXT(MSG_HOME_FIRST); + char msg[strlen_P(home_first)+1]; + sprintf_P(msg, home_first, + TEST(axis_bits, X_AXIS) ? "X" : "", + TEST(axis_bits, Y_AXIS) ? "Y" : "", + TEST(axis_bits, Z_AXIS) ? "Z" : "" + ); + SERIAL_ECHO_START(); + SERIAL_ECHOLN(msg); + TERN_(HAS_DISPLAY, ui.set_status(msg)); + return true; + } + return false; } - return homing_feedrate(axis) / float(hbd); -} -#if ENABLED(SENSORLESS_HOMING) /** - * Set sensorless homing if the axis has it, accounting for Core Kinematics. + * Homing bump feedrate (mm/s) */ - sensorless_t start_sensorless_homing_per_axis(const AxisEnum axis) { - sensorless_t stealth_states { false }; - - switch (axis) { - default: break; - #if X_SENSORLESS - case X_AXIS: - stealth_states.x = tmc_enable_stallguard(stepperX); - #if AXIS_HAS_STALLGUARD(X2) - stealth_states.x2 = tmc_enable_stallguard(stepperX2); - #endif - #if EITHER(CORE_IS_XY, MARKFORGED_XY) && Y_SENSORLESS - stealth_states.y = tmc_enable_stallguard(stepperY); - #elif CORE_IS_XZ && Z_SENSORLESS - stealth_states.z = tmc_enable_stallguard(stepperZ); - #endif - break; - #endif - #if Y_SENSORLESS - case Y_AXIS: - stealth_states.y = tmc_enable_stallguard(stepperY); - #if AXIS_HAS_STALLGUARD(Y2) - stealth_states.y2 = tmc_enable_stallguard(stepperY2); - #endif - #if EITHER(CORE_IS_XY, MARKFORGED_XY) && X_SENSORLESS - stealth_states.x = tmc_enable_stallguard(stepperX); - #elif CORE_IS_YZ && Z_SENSORLESS - stealth_states.z = tmc_enable_stallguard(stepperZ); - #endif - break; - #endif - #if Z_SENSORLESS - case Z_AXIS: - stealth_states.z = tmc_enable_stallguard(stepperZ); - #if AXIS_HAS_STALLGUARD(Z2) - stealth_states.z2 = tmc_enable_stallguard(stepperZ2); - #endif - #if AXIS_HAS_STALLGUARD(Z3) - stealth_states.z3 = tmc_enable_stallguard(stepperZ3); - #endif - #if AXIS_HAS_STALLGUARD(Z4) - stealth_states.z4 = tmc_enable_stallguard(stepperZ4); - #endif - #if CORE_IS_XZ && X_SENSORLESS - stealth_states.x = tmc_enable_stallguard(stepperX); - #elif CORE_IS_YZ && Y_SENSORLESS - stealth_states.y = tmc_enable_stallguard(stepperY); - #endif - break; - #endif - } - - #if ENABLED(SPI_ENDSTOPS) - switch (axis) { - case X_AXIS: if (ENABLED(X_SPI_SENSORLESS)) endstops.tmc_spi_homing.x = true; break; - case Y_AXIS: if (ENABLED(Y_SPI_SENSORLESS)) endstops.tmc_spi_homing.y = true; break; - case Z_AXIS: if (ENABLED(Z_SPI_SENSORLESS)) endstops.tmc_spi_homing.z = true; break; - default: break; - } + feedRate_t get_homing_bump_feedrate(const AxisEnum axis) { + #if HOMING_Z_WITH_PROBE + if (axis == Z_AXIS) return MMM_TO_MMS(Z_PROBE_SPEED_SLOW); #endif - - TERN_(IMPROVE_HOMING_RELIABILITY, sg_guard_period = millis() + default_sg_guard_duration); - - return stealth_states; - } - - void end_sensorless_homing_per_axis(const AxisEnum axis, sensorless_t enable_stealth) { - switch (axis) { - default: break; - #if X_SENSORLESS - case X_AXIS: - tmc_disable_stallguard(stepperX, enable_stealth.x); - #if AXIS_HAS_STALLGUARD(X2) - tmc_disable_stallguard(stepperX2, enable_stealth.x2); - #endif - #if EITHER(CORE_IS_XY, MARKFORGED_XY) && Y_SENSORLESS - tmc_disable_stallguard(stepperY, enable_stealth.y); - #elif CORE_IS_XZ && Z_SENSORLESS - tmc_disable_stallguard(stepperZ, enable_stealth.z); - #endif - break; - #endif - #if Y_SENSORLESS - case Y_AXIS: - tmc_disable_stallguard(stepperY, enable_stealth.y); - #if AXIS_HAS_STALLGUARD(Y2) - tmc_disable_stallguard(stepperY2, enable_stealth.y2); - #endif - #if EITHER(CORE_IS_XY, MARKFORGED_XY) && X_SENSORLESS - tmc_disable_stallguard(stepperX, enable_stealth.x); - #elif CORE_IS_YZ && Z_SENSORLESS - tmc_disable_stallguard(stepperZ, enable_stealth.z); - #endif - break; - #endif - #if Z_SENSORLESS - case Z_AXIS: - tmc_disable_stallguard(stepperZ, enable_stealth.z); - #if AXIS_HAS_STALLGUARD(Z2) - tmc_disable_stallguard(stepperZ2, enable_stealth.z2); - #endif - #if AXIS_HAS_STALLGUARD(Z3) - tmc_disable_stallguard(stepperZ3, enable_stealth.z3); - #endif - #if AXIS_HAS_STALLGUARD(Z4) - tmc_disable_stallguard(stepperZ4, enable_stealth.z4); - #endif - #if CORE_IS_XZ && X_SENSORLESS - tmc_disable_stallguard(stepperX, enable_stealth.x); - #elif CORE_IS_YZ && Y_SENSORLESS - tmc_disable_stallguard(stepperY, enable_stealth.y); - #endif - break; - #endif + static const uint8_t homing_bump_divisor[] PROGMEM = HOMING_BUMP_DIVISOR; + uint8_t hbd = pgm_read_byte(&homing_bump_divisor[axis]); + if (hbd < 1) { + hbd = 10; + SERIAL_ECHO_MSG("Warning: Homing Bump Divisor < 1"); } - - #if ENABLED(SPI_ENDSTOPS) - switch (axis) { - case X_AXIS: if (ENABLED(X_SPI_SENSORLESS)) endstops.tmc_spi_homing.x = false; break; - case Y_AXIS: if (ENABLED(Y_SPI_SENSORLESS)) endstops.tmc_spi_homing.y = false; break; - case Z_AXIS: if (ENABLED(Z_SPI_SENSORLESS)) endstops.tmc_spi_homing.z = false; break; - default: break; - } - #endif + return homing_feedrate(axis) / float(hbd); } -#endif // SENSORLESS_HOMING - -/** - * Home an individual linear axis - */ -void do_homing_move(const AxisEnum axis, const float distance, const feedRate_t fr_mm_s=0.0, const bool final_approach=true) { - DEBUG_SECTION(log_move, "do_homing_move", DEBUGGING(LEVELING)); - - const feedRate_t home_fr_mm_s = fr_mm_s ?: homing_feedrate(axis); - - if (DEBUGGING(LEVELING)) { - DEBUG_ECHOPAIR("...(", AS_CHAR(axis_codes[axis]), ", ", distance, ", "); - if (fr_mm_s) - DEBUG_ECHO(fr_mm_s); - else - DEBUG_ECHOPAIR("[", home_fr_mm_s, "]"); - DEBUG_ECHOLNPGM(")"); - } - - // Only do some things when moving towards an endstop - const int8_t axis_home_dir = TERN0(DUAL_X_CARRIAGE, axis == X_AXIS) - ? x_home_dir(active_extruder) : home_dir(axis); - const bool is_home_dir = (axis_home_dir > 0) == (distance > 0); - #if ENABLED(SENSORLESS_HOMING) - sensorless_t stealth_states; - #endif + /** + * Set sensorless homing if the axis has it, accounting for Core Kinematics. + */ + sensorless_t start_sensorless_homing_per_axis(const AxisEnum axis) { + sensorless_t stealth_states { false }; - if (is_home_dir) { + switch (axis) { + default: break; + #if X_SENSORLESS + case X_AXIS: + stealth_states.x = tmc_enable_stallguard(stepperX); + #if AXIS_HAS_STALLGUARD(X2) + stealth_states.x2 = tmc_enable_stallguard(stepperX2); + #endif + #if EITHER(CORE_IS_XY, MARKFORGED_XY) && Y_SENSORLESS + stealth_states.y = tmc_enable_stallguard(stepperY); + #elif CORE_IS_XZ && Z_SENSORLESS + stealth_states.z = tmc_enable_stallguard(stepperZ); + #endif + break; + #endif + #if Y_SENSORLESS + case Y_AXIS: + stealth_states.y = tmc_enable_stallguard(stepperY); + #if AXIS_HAS_STALLGUARD(Y2) + stealth_states.y2 = tmc_enable_stallguard(stepperY2); + #endif + #if EITHER(CORE_IS_XY, MARKFORGED_XY) && X_SENSORLESS + stealth_states.x = tmc_enable_stallguard(stepperX); + #elif CORE_IS_YZ && Z_SENSORLESS + stealth_states.z = tmc_enable_stallguard(stepperZ); + #endif + break; + #endif + #if Z_SENSORLESS + case Z_AXIS: + stealth_states.z = tmc_enable_stallguard(stepperZ); + #if AXIS_HAS_STALLGUARD(Z2) + stealth_states.z2 = tmc_enable_stallguard(stepperZ2); + #endif + #if AXIS_HAS_STALLGUARD(Z3) + stealth_states.z3 = tmc_enable_stallguard(stepperZ3); + #endif + #if AXIS_HAS_STALLGUARD(Z4) + stealth_states.z4 = tmc_enable_stallguard(stepperZ4); + #endif + #if CORE_IS_XZ && X_SENSORLESS + stealth_states.x = tmc_enable_stallguard(stepperX); + #elif CORE_IS_YZ && Y_SENSORLESS + stealth_states.y = tmc_enable_stallguard(stepperY); + #endif + break; + #endif + } - if (TERN0(HOMING_Z_WITH_PROBE, axis == Z_AXIS)) { - #if ALL(HAS_HEATED_BED, WAIT_FOR_BED_HEATER) - // Wait for bed to heat back up between probing points - thermalManager.wait_for_bed_heating(); + #if ENABLED(SPI_ENDSTOPS) + switch (axis) { + case X_AXIS: if (ENABLED(X_SPI_SENSORLESS)) endstops.tmc_spi_homing.x = true; break; + case Y_AXIS: if (ENABLED(Y_SPI_SENSORLESS)) endstops.tmc_spi_homing.y = true; break; + case Z_AXIS: if (ENABLED(Z_SPI_SENSORLESS)) endstops.tmc_spi_homing.z = true; break; + default: break; + } #endif - TERN_(HAS_QUIET_PROBING, if (final_approach) probe.set_probing_paused(true)); + TERN_(IMPROVE_HOMING_RELIABILITY, sg_guard_period = millis() + default_sg_guard_duration); + + return stealth_states; } - // Disable stealthChop if used. Enable diag1 pin on driver. - TERN_(SENSORLESS_HOMING, stealth_states = start_sensorless_homing_per_axis(axis)); - } + void end_sensorless_homing_per_axis(const AxisEnum axis, sensorless_t enable_stealth) { + switch (axis) { + default: break; + #if X_SENSORLESS + case X_AXIS: + tmc_disable_stallguard(stepperX, enable_stealth.x); + #if AXIS_HAS_STALLGUARD(X2) + tmc_disable_stallguard(stepperX2, enable_stealth.x2); + #endif + #if EITHER(CORE_IS_XY, MARKFORGED_XY) && Y_SENSORLESS + tmc_disable_stallguard(stepperY, enable_stealth.y); + #elif CORE_IS_XZ && Z_SENSORLESS + tmc_disable_stallguard(stepperZ, enable_stealth.z); + #endif + break; + #endif + #if Y_SENSORLESS + case Y_AXIS: + tmc_disable_stallguard(stepperY, enable_stealth.y); + #if AXIS_HAS_STALLGUARD(Y2) + tmc_disable_stallguard(stepperY2, enable_stealth.y2); + #endif + #if EITHER(CORE_IS_XY, MARKFORGED_XY) && X_SENSORLESS + tmc_disable_stallguard(stepperX, enable_stealth.x); + #elif CORE_IS_YZ && Z_SENSORLESS + tmc_disable_stallguard(stepperZ, enable_stealth.z); + #endif + break; + #endif + #if Z_SENSORLESS + case Z_AXIS: + tmc_disable_stallguard(stepperZ, enable_stealth.z); + #if AXIS_HAS_STALLGUARD(Z2) + tmc_disable_stallguard(stepperZ2, enable_stealth.z2); + #endif + #if AXIS_HAS_STALLGUARD(Z3) + tmc_disable_stallguard(stepperZ3, enable_stealth.z3); + #endif + #if AXIS_HAS_STALLGUARD(Z4) + tmc_disable_stallguard(stepperZ4, enable_stealth.z4); + #endif + #if CORE_IS_XZ && X_SENSORLESS + tmc_disable_stallguard(stepperX, enable_stealth.x); + #elif CORE_IS_YZ && Y_SENSORLESS + tmc_disable_stallguard(stepperY, enable_stealth.y); + #endif + break; + #endif + } - #if IS_SCARA - // Tell the planner the axis is at 0 - current_position[axis] = 0; - sync_plan_position(); - current_position[axis] = distance; - line_to_current_position(home_fr_mm_s); - #else - // Get the ABC or XYZ positions in mm - abce_pos_t target = planner.get_axis_positions_mm(); + #if ENABLED(SPI_ENDSTOPS) + switch (axis) { + case X_AXIS: if (ENABLED(X_SPI_SENSORLESS)) endstops.tmc_spi_homing.x = false; break; + case Y_AXIS: if (ENABLED(Y_SPI_SENSORLESS)) endstops.tmc_spi_homing.y = false; break; + case Z_AXIS: if (ENABLED(Z_SPI_SENSORLESS)) endstops.tmc_spi_homing.z = false; break; + default: break; + } + #endif + } - target[axis] = 0; // Set the single homing axis to 0 - planner.set_machine_position_mm(target); // Update the machine position + #endif // SENSORLESS_HOMING - #if HAS_DIST_MM_ARG - const xyze_float_t cart_dist_mm{0}; + /** + * Home an individual linear axis + */ + void do_homing_move(const AxisEnum axis, const float distance, const feedRate_t fr_mm_s=0.0, const bool final_approach=true) { + DEBUG_SECTION(log_move, "do_homing_move", DEBUGGING(LEVELING)); + + const feedRate_t home_fr_mm_s = fr_mm_s ?: homing_feedrate(axis); + + if (DEBUGGING(LEVELING)) { + DEBUG_ECHOPAIR("...(", AS_CHAR(axis_codes[axis]), ", ", distance, ", "); + if (fr_mm_s) + DEBUG_ECHO(fr_mm_s); + else + DEBUG_ECHOPAIR("[", home_fr_mm_s, "]"); + DEBUG_ECHOLNPGM(")"); + } + + // Only do some things when moving towards an endstop + const int8_t axis_home_dir = TERN0(DUAL_X_CARRIAGE, axis == X_AXIS) + ? x_home_dir(active_extruder) : home_dir(axis); + const bool is_home_dir = (axis_home_dir > 0) == (distance > 0); + + #if ENABLED(SENSORLESS_HOMING) + sensorless_t stealth_states; #endif - // Set delta/cartesian axes directly - target[axis] = distance; // The move will be towards the endstop - planner.buffer_segment(target + if (is_home_dir) { + + if (TERN0(HOMING_Z_WITH_PROBE, axis == Z_AXIS)) { + #if ALL(HAS_HEATED_BED, WAIT_FOR_BED_HEATER) + // Wait for bed to heat back up between probing points + thermalManager.wait_for_bed_heating(); + #endif + + TERN_(HAS_QUIET_PROBING, if (final_approach) probe.set_probing_paused(true)); + } + + // Disable stealthChop if used. Enable diag1 pin on driver. + TERN_(SENSORLESS_HOMING, stealth_states = start_sensorless_homing_per_axis(axis)); + } + + #if IS_SCARA + // Tell the planner the axis is at 0 + current_position[axis] = 0; + sync_plan_position(); + current_position[axis] = distance; + line_to_current_position(home_fr_mm_s); + #else + // Get the ABC or XYZ positions in mm + abce_pos_t target = planner.get_axis_positions_mm(); + + target[axis] = 0; // Set the single homing axis to 0 + planner.set_machine_position_mm(target); // Update the machine position + #if HAS_DIST_MM_ARG - , cart_dist_mm + const xyze_float_t cart_dist_mm{0}; #endif - , home_fr_mm_s, active_extruder - ); + + // Set delta/cartesian axes directly + target[axis] = distance; // The move will be towards the endstop + planner.buffer_segment(target + #if HAS_DIST_MM_ARG + , cart_dist_mm + #endif + , home_fr_mm_s, active_extruder + ); + #endif + + planner.synchronize(); + + if (is_home_dir) { + + #if HOMING_Z_WITH_PROBE && HAS_QUIET_PROBING + if (axis == Z_AXIS && final_approach) probe.set_probing_paused(false); + #endif + + endstops.validate_homing_move(); + + // Re-enable stealthChop if used. Disable diag1 pin on driver. + TERN_(SENSORLESS_HOMING, end_sensorless_homing_per_axis(axis, stealth_states)); + } + } + + /** + * Set an axis to be unhomed. (Unless we are on a machine - e.g. a cheap Chinese CNC machine - + * that has no endstops. Such machines should always be considered to be in a "known" and + * "trusted" position). + */ + void set_axis_never_homed(const AxisEnum axis) { + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR(">>> set_axis_never_homed(", axis_codes[axis], ")"); + + set_axis_untrusted(axis); + set_axis_unhomed(axis); + + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("<<< set_axis_never_homed(", axis_codes[axis], ")"); + + TERN_(I2C_POSITION_ENCODERS, I2CPEM.unhomed(axis)); + } + + #if ENABLED(TMC_HOME_PHASE) + /** + * Move the axis back to its home_phase if set and driver is capable (TMC) + * + * Improves homing repeatability by homing to stepper coil's nearest absolute + * phase position. Trinamic drivers use a stepper phase table with 1024 values + * spanning 4 full steps with 256 positions each (ergo, 1024 positions). + */ + void backout_to_tmc_homing_phase(const AxisEnum axis) { + const xyz_long_t home_phase = TMC_HOME_PHASE; + + // check if home phase is disabled for this axis. + if (home_phase[axis] < 0) return; + + int16_t phasePerUStep, // TMC µsteps(phase) per Marlin µsteps + phaseCurrent, // The TMC µsteps(phase) count of the current position + effectorBackoutDir, // Direction in which the effector mm coordinates move away from endstop. + stepperBackoutDir; // Direction in which the TMC µstep count(phase) move away from endstop. + + #define PHASE_PER_MICROSTEP(N) (256 / _MAX(1, N##_MICROSTEPS)) + + switch (axis) { + #ifdef X_MICROSTEPS + case X_AXIS: + phasePerUStep = PHASE_PER_MICROSTEP(X); + phaseCurrent = stepperX.get_microstep_counter(); + effectorBackoutDir = -X_HOME_DIR; + stepperBackoutDir = INVERT_X_DIR ? effectorBackoutDir : -effectorBackoutDir; + break; + #endif + #ifdef Y_MICROSTEPS + case Y_AXIS: + phasePerUStep = PHASE_PER_MICROSTEP(Y); + phaseCurrent = stepperY.get_microstep_counter(); + effectorBackoutDir = -Y_HOME_DIR; + stepperBackoutDir = INVERT_Y_DIR ? effectorBackoutDir : -effectorBackoutDir; + break; + #endif + #ifdef Z_MICROSTEPS + case Z_AXIS: + phasePerUStep = PHASE_PER_MICROSTEP(Z); + phaseCurrent = stepperZ.get_microstep_counter(); + effectorBackoutDir = -Z_HOME_DIR; + stepperBackoutDir = INVERT_Z_DIR ? effectorBackoutDir : -effectorBackoutDir; + break; + #endif + default: return; + } + + // Phase distance to nearest home phase position when moving in the backout direction from endstop(may be negative). + int16_t phaseDelta = (home_phase[axis] - phaseCurrent) * stepperBackoutDir; + + // Check if home distance within endstop assumed repeatability noise of .05mm and warn. + if (ABS(phaseDelta) * planner.steps_to_mm[axis] / phasePerUStep < 0.05f) + SERIAL_ECHOLNPAIR("Selected home phase ", home_phase[axis], + " too close to endstop trigger phase ", phaseCurrent, + ". Pick a different phase for ", axis_codes[axis]); + + // Skip to next if target position is behind current. So it only moves away from endstop. + if (phaseDelta < 0) phaseDelta += 1024; + + // Convert TMC µsteps(phase) to whole Marlin µsteps to effector backout direction to mm + const float mmDelta = int16_t(phaseDelta / phasePerUStep) * effectorBackoutDir * planner.steps_to_mm[axis]; + + // Optional debug messages + if (DEBUGGING(LEVELING)) { + DEBUG_ECHOLNPAIR( + "Endstop ", axis_codes[axis], " hit at Phase:", phaseCurrent, + " Delta:", phaseDelta, " Distance:", mmDelta + ); + } + + if (mmDelta != 0) { + // Retrace by the amount computed in mmDelta. + do_homing_move(axis, mmDelta, get_homing_bump_feedrate(axis)); + } + } #endif - planner.synchronize(); + /** + * Home an individual "raw axis" to its endstop. + * This applies to XYZ on Cartesian and Core robots, and + * to the individual ABC steppers on DELTA and SCARA. + * + * At the end of the procedure the axis is marked as + * homed and the current position of that axis is updated. + * Kinematic robots should wait till all axes are homed + * before updating the current position. + */ - if (is_home_dir) { + void homeaxis(const AxisEnum axis) { - #if HOMING_Z_WITH_PROBE && HAS_QUIET_PROBING - if (axis == Z_AXIS && final_approach) probe.set_probing_paused(false); + #if IS_SCARA + // Only Z homing (with probe) is permitted + if (axis != Z_AXIS) { BUZZ(100, 880); return; } + #else + #define _CAN_HOME(A) (axis == _AXIS(A) && ( \ + ENABLED(A##_SPI_SENSORLESS) \ + || (_AXIS(A) == Z_AXIS && ENABLED(HOMING_Z_WITH_PROBE)) \ + || (A##_MIN_PIN > -1 && A##_HOME_DIR < 0) \ + || (A##_MAX_PIN > -1 && A##_HOME_DIR > 0) \ + )) + if (!_CAN_HOME(X) && !_CAN_HOME(Y) && !_CAN_HOME(Z)) return; #endif - endstops.validate_homing_move(); + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR(">>> homeaxis(", axis_codes[axis], ")"); - // Re-enable stealthChop if used. Disable diag1 pin on driver. - TERN_(SENSORLESS_HOMING, end_sensorless_homing_per_axis(axis, stealth_states)); - } -} + const int axis_home_dir = TERN0(DUAL_X_CARRIAGE, axis == X_AXIS) + ? x_home_dir(active_extruder) : home_dir(axis); + + // + // Homing Z with a probe? Raise Z (maybe) and deploy the Z probe. + // + if (TERN0(HOMING_Z_WITH_PROBE, axis == Z_AXIS && probe.deploy())) + return; + + // Set flags for X, Y, Z motor locking + #if HAS_EXTRA_ENDSTOPS + switch (axis) { + TERN_(X_DUAL_ENDSTOPS, case X_AXIS:) + TERN_(Y_DUAL_ENDSTOPS, case Y_AXIS:) + TERN_(Z_MULTI_ENDSTOPS, case Z_AXIS:) + stepper.set_separate_multi_axis(true); + default: break; + } + #endif + + // + // Deploy BLTouch or tare the probe just before probing + // + #if HOMING_Z_WITH_PROBE + if (axis == Z_AXIS) { + if (TERN0(BLTOUCH, bltouch.deploy())) return; // BLTouch was deployed above, but get the alarm state. + if (TERN0(PROBE_TARE, probe.tare())) return; + } + #endif + + // + // Back away to prevent an early X/Y sensorless trigger + // + #if DISABLED(DELTA) && defined(SENSORLESS_BACKOFF_MM) + const xy_float_t backoff = SENSORLESS_BACKOFF_MM; + if ((TERN0(X_SENSORLESS, axis == X_AXIS) || TERN0(Y_SENSORLESS, axis == Y_AXIS)) && backoff[axis]) { + const float backoff_length = -ABS(backoff[axis]) * axis_home_dir; + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Sensorless backoff: ", backoff_length, "mm"); + do_homing_move(axis, backoff_length, homing_feedrate(axis)); + } + #endif + + // Determine if a homing bump will be done and the bumps distance + // When homing Z with probe respect probe clearance + const bool use_probe_bump = TERN0(HOMING_Z_WITH_PROBE, axis == Z_AXIS && home_bump_mm(Z_AXIS)); + const float bump = axis_home_dir * ( + use_probe_bump ? _MAX(TERN0(HOMING_Z_WITH_PROBE, Z_CLEARANCE_BETWEEN_PROBES), home_bump_mm(Z_AXIS)) : home_bump_mm(axis) + ); + + // + // Fast move towards endstop until triggered + // + const float move_length = 1.5f * max_length(TERN(DELTA, Z_AXIS, axis)) * axis_home_dir; + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Home Fast: ", move_length, "mm"); + do_homing_move(axis, move_length, 0.0, !use_probe_bump); + + #if BOTH(HOMING_Z_WITH_PROBE, BLTOUCH_SLOW_MODE) + if (axis == Z_AXIS) bltouch.stow(); // Intermediate STOW (in LOW SPEED MODE) + #endif + + // If a second homing move is configured... + if (bump) { + // Move away from the endstop by the axis HOMING_BUMP_MM + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Move Away: ", -bump, "mm"); + do_homing_move(axis, -bump, TERN0(HOMING_Z_WITH_PROBE, axis == Z_AXIS) ? MMM_TO_MMS(Z_PROBE_SPEED_FAST) : 0, false); + + #if ENABLED(DETECT_BROKEN_ENDSTOP) + // Check for a broken endstop + EndstopEnum es; + switch (axis) { + default: + case X_AXIS: es = X_ENDSTOP; break; + case Y_AXIS: es = Y_ENDSTOP; break; + case Z_AXIS: es = Z_ENDSTOP; break; + } + if (TEST(endstops.state(), es)) { + SERIAL_ECHO_MSG("Bad ", axis_codes[axis], " Endstop?"); + kill(GET_TEXT(MSG_KILL_HOMING_FAILED)); + } + #endif + + #if BOTH(HOMING_Z_WITH_PROBE, BLTOUCH_SLOW_MODE) + if (axis == Z_AXIS && bltouch.deploy()) return; // Intermediate DEPLOY (in LOW SPEED MODE) + #endif + + // Slow move towards endstop until triggered + const float rebump = bump * 2; + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Re-bump: ", rebump, "mm"); + do_homing_move(axis, rebump, get_homing_bump_feedrate(axis), true); + + #if BOTH(HOMING_Z_WITH_PROBE, BLTOUCH) + if (axis == Z_AXIS) bltouch.stow(); // The final STOW + #endif + } + + #if HAS_EXTRA_ENDSTOPS + const bool pos_dir = axis_home_dir > 0; + #if ENABLED(X_DUAL_ENDSTOPS) + if (axis == X_AXIS) { + const float adj = ABS(endstops.x2_endstop_adj); + if (adj) { + if (pos_dir ? (endstops.x2_endstop_adj > 0) : (endstops.x2_endstop_adj < 0)) stepper.set_x_lock(true); else stepper.set_x2_lock(true); + do_homing_move(axis, pos_dir ? -adj : adj); + stepper.set_x_lock(false); + stepper.set_x2_lock(false); + } + } + #endif + #if ENABLED(Y_DUAL_ENDSTOPS) + if (axis == Y_AXIS) { + const float adj = ABS(endstops.y2_endstop_adj); + if (adj) { + if (pos_dir ? (endstops.y2_endstop_adj > 0) : (endstops.y2_endstop_adj < 0)) stepper.set_y_lock(true); else stepper.set_y2_lock(true); + do_homing_move(axis, pos_dir ? -adj : adj); + stepper.set_y_lock(false); + stepper.set_y2_lock(false); + } + } + #endif + + #if ENABLED(Z_MULTI_ENDSTOPS) + if (axis == Z_AXIS) { + + #if NUM_Z_STEPPER_DRIVERS == 2 + + const float adj = ABS(endstops.z2_endstop_adj); + if (adj) { + if (pos_dir ? (endstops.z2_endstop_adj > 0) : (endstops.z2_endstop_adj < 0)) stepper.set_z1_lock(true); else stepper.set_z2_lock(true); + do_homing_move(axis, pos_dir ? -adj : adj); + stepper.set_z1_lock(false); + stepper.set_z2_lock(false); + } + + #else + + // Handy arrays of stepper lock function pointers + + typedef void (*adjustFunc_t)(const bool); + + adjustFunc_t lock[] = { + stepper.set_z1_lock, stepper.set_z2_lock, stepper.set_z3_lock + #if NUM_Z_STEPPER_DRIVERS >= 4 + , stepper.set_z4_lock + #endif + }; + float adj[] = { + 0, endstops.z2_endstop_adj, endstops.z3_endstop_adj + #if NUM_Z_STEPPER_DRIVERS >= 4 + , endstops.z4_endstop_adj + #endif + }; + + adjustFunc_t tempLock; + float tempAdj; + + // Manual bubble sort by adjust value + if (adj[1] < adj[0]) { + tempLock = lock[0], tempAdj = adj[0]; + lock[0] = lock[1], adj[0] = adj[1]; + lock[1] = tempLock, adj[1] = tempAdj; + } + if (adj[2] < adj[1]) { + tempLock = lock[1], tempAdj = adj[1]; + lock[1] = lock[2], adj[1] = adj[2]; + lock[2] = tempLock, adj[2] = tempAdj; + } + #if NUM_Z_STEPPER_DRIVERS >= 4 + if (adj[3] < adj[2]) { + tempLock = lock[2], tempAdj = adj[2]; + lock[2] = lock[3], adj[2] = adj[3]; + lock[3] = tempLock, adj[3] = tempAdj; + } + if (adj[2] < adj[1]) { + tempLock = lock[1], tempAdj = adj[1]; + lock[1] = lock[2], adj[1] = adj[2]; + lock[2] = tempLock, adj[2] = tempAdj; + } + #endif + if (adj[1] < adj[0]) { + tempLock = lock[0], tempAdj = adj[0]; + lock[0] = lock[1], adj[0] = adj[1]; + lock[1] = tempLock, adj[1] = tempAdj; + } + + if (pos_dir) { + // normalize adj to smallest value and do the first move + (*lock[0])(true); + do_homing_move(axis, adj[1] - adj[0]); + // lock the second stepper for the final correction + (*lock[1])(true); + do_homing_move(axis, adj[2] - adj[1]); + #if NUM_Z_STEPPER_DRIVERS >= 4 + // lock the third stepper for the final correction + (*lock[2])(true); + do_homing_move(axis, adj[3] - adj[2]); + #endif + } + else { + #if NUM_Z_STEPPER_DRIVERS >= 4 + (*lock[3])(true); + do_homing_move(axis, adj[2] - adj[3]); + #endif + (*lock[2])(true); + do_homing_move(axis, adj[1] - adj[2]); + (*lock[1])(true); + do_homing_move(axis, adj[0] - adj[1]); + } + + stepper.set_z1_lock(false); + stepper.set_z2_lock(false); + stepper.set_z3_lock(false); + #if NUM_Z_STEPPER_DRIVERS >= 4 + stepper.set_z4_lock(false); + #endif + + #endif + } + #endif + + // Reset flags for X, Y, Z motor locking + switch (axis) { + default: break; + TERN_(X_DUAL_ENDSTOPS, case X_AXIS:) + TERN_(Y_DUAL_ENDSTOPS, case Y_AXIS:) + TERN_(Z_MULTI_ENDSTOPS, case Z_AXIS:) + stepper.set_separate_multi_axis(false); + } + #endif + + #ifdef TMC_HOME_PHASE + // move back to homing phase if configured and capable + backout_to_tmc_homing_phase(axis); + #endif + + #if IS_SCARA + + set_axis_is_at_home(axis); + sync_plan_position(); + + #elif ENABLED(DELTA) + + // Delta has already moved all three towers up in G28 + // so here it re-homes each tower in turn. + // Delta homing treats the axes as normal linear axes. + + const float adjDistance = delta_endstop_adj[axis], + minDistance = (MIN_STEPS_PER_SEGMENT) * planner.steps_to_mm[axis]; + + // Retrace by the amount specified in delta_endstop_adj if more than min steps. + if (adjDistance * (Z_HOME_DIR) < 0 && ABS(adjDistance) > minDistance) { // away from endstop, more than min distance + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("adjDistance:", adjDistance); + do_homing_move(axis, adjDistance, get_homing_bump_feedrate(axis)); + } + + #else // CARTESIAN / CORE / MARKFORGED_XY + + set_axis_is_at_home(axis); + sync_plan_position(); + + destination[axis] = current_position[axis]; + + if (DEBUGGING(LEVELING)) DEBUG_POS("> AFTER set_axis_is_at_home", current_position); + + #endif + + // Put away the Z probe + #if HOMING_Z_WITH_PROBE + if (axis == Z_AXIS && probe.stow()) return; + #endif + + #if DISABLED(DELTA) && defined(HOMING_BACKOFF_POST_MM) + const xyz_float_t endstop_backoff = HOMING_BACKOFF_POST_MM; + if (endstop_backoff[axis]) { + current_position[axis] -= ABS(endstop_backoff[axis]) * axis_home_dir; + line_to_current_position( + #if HOMING_Z_WITH_PROBE + (axis == Z_AXIS) ? z_probe_fast_mm_s : + #endif + homing_feedrate(axis) + ); + + #if ENABLED(SENSORLESS_HOMING) + planner.synchronize(); + if (false + #if EITHER(IS_CORE, MARKFORGED_XY) + || axis != NORMAL_AXIS + #endif + ) safe_delay(200); // Short delay to allow belts to spring back + #endif + } + #endif + + // Clear retracted status if homing the Z axis + #if ENABLED(FWRETRACT) + if (axis == Z_AXIS) fwretract.current_hop = 0.0; + #endif + + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("<<< homeaxis(", axis_codes[axis], ")"); + + } // homeaxis() + +#endif // HAS_ENDSTOPS /** * Set an axis' current position to its home position (after homing). @@ -1455,428 +1874,6 @@ void set_axis_is_at_home(const AxisEnum axis) { } } -/** - * Set an axis to be unhomed. - */ -void set_axis_never_homed(const AxisEnum axis) { - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR(">>> set_axis_never_homed(", axis_codes[axis], ")"); - - set_axis_untrusted(axis); - set_axis_unhomed(axis); - - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("<<< set_axis_never_homed(", axis_codes[axis], ")"); - - TERN_(I2C_POSITION_ENCODERS, I2CPEM.unhomed(axis)); -} - -#ifdef TMC_HOME_PHASE - /** - * Move the axis back to its home_phase if set and driver is capable (TMC) - * - * Improves homing repeatability by homing to stepper coil's nearest absolute - * phase position. Trinamic drivers use a stepper phase table with 1024 values - * spanning 4 full steps with 256 positions each (ergo, 1024 positions). - */ - void backout_to_tmc_homing_phase(const AxisEnum axis) { - const xyz_long_t home_phase = TMC_HOME_PHASE; - - // check if home phase is disabled for this axis. - if (home_phase[axis] < 0) return; - - int16_t phasePerUStep, // TMC µsteps(phase) per Marlin µsteps - phaseCurrent, // The TMC µsteps(phase) count of the current position - effectorBackoutDir, // Direction in which the effector mm coordinates move away from endstop. - stepperBackoutDir; // Direction in which the TMC µstep count(phase) move away from endstop. - - #define PHASE_PER_MICROSTEP(N) (256 / _MAX(1, N##_MICROSTEPS)) - - switch (axis) { - #ifdef X_MICROSTEPS - case X_AXIS: - phasePerUStep = PHASE_PER_MICROSTEP(X); - phaseCurrent = stepperX.get_microstep_counter(); - effectorBackoutDir = -X_HOME_DIR; - stepperBackoutDir = INVERT_X_DIR ? effectorBackoutDir : -effectorBackoutDir; - break; - #endif - #ifdef Y_MICROSTEPS - case Y_AXIS: - phasePerUStep = PHASE_PER_MICROSTEP(Y); - phaseCurrent = stepperY.get_microstep_counter(); - effectorBackoutDir = -Y_HOME_DIR; - stepperBackoutDir = INVERT_Y_DIR ? effectorBackoutDir : -effectorBackoutDir; - break; - #endif - #ifdef Z_MICROSTEPS - case Z_AXIS: - phasePerUStep = PHASE_PER_MICROSTEP(Z); - phaseCurrent = stepperZ.get_microstep_counter(); - effectorBackoutDir = -Z_HOME_DIR; - stepperBackoutDir = INVERT_Z_DIR ? effectorBackoutDir : -effectorBackoutDir; - break; - #endif - default: return; - } - - // Phase distance to nearest home phase position when moving in the backout direction from endstop(may be negative). - int16_t phaseDelta = (home_phase[axis] - phaseCurrent) * stepperBackoutDir; - - // Check if home distance within endstop assumed repeatability noise of .05mm and warn. - if (ABS(phaseDelta) * planner.steps_to_mm[axis] / phasePerUStep < 0.05f) - SERIAL_ECHOLNPAIR("Selected home phase ", home_phase[axis], - " too close to endstop trigger phase ", phaseCurrent, - ". Pick a different phase for ", axis_codes[axis]); - - // Skip to next if target position is behind current. So it only moves away from endstop. - if (phaseDelta < 0) phaseDelta += 1024; - - // Convert TMC µsteps(phase) to whole Marlin µsteps to effector backout direction to mm - const float mmDelta = int16_t(phaseDelta / phasePerUStep) * effectorBackoutDir * planner.steps_to_mm[axis]; - - // Optional debug messages - if (DEBUGGING(LEVELING)) { - DEBUG_ECHOLNPAIR( - "Endstop ", axis_codes[axis], " hit at Phase:", phaseCurrent, - " Delta:", phaseDelta, " Distance:", mmDelta - ); - } - - if (mmDelta != 0) { - // Retrace by the amount computed in mmDelta. - do_homing_move(axis, mmDelta, get_homing_bump_feedrate(axis)); - } - } -#endif - -/** - * Home an individual "raw axis" to its endstop. - * This applies to XYZ on Cartesian and Core robots, and - * to the individual ABC steppers on DELTA and SCARA. - * - * At the end of the procedure the axis is marked as - * homed and the current position of that axis is updated. - * Kinematic robots should wait till all axes are homed - * before updating the current position. - */ - -void homeaxis(const AxisEnum axis) { - - #if IS_SCARA - // Only Z homing (with probe) is permitted - if (axis != Z_AXIS) { BUZZ(100, 880); return; } - #else - #define _CAN_HOME(A) (axis == _AXIS(A) && ( \ - ENABLED(A##_SPI_SENSORLESS) \ - || (_AXIS(A) == Z_AXIS && ENABLED(HOMING_Z_WITH_PROBE)) \ - || (A##_MIN_PIN > -1 && A##_HOME_DIR < 0) \ - || (A##_MAX_PIN > -1 && A##_HOME_DIR > 0) \ - )) - if (!_CAN_HOME(X) && !_CAN_HOME(Y) && !_CAN_HOME(Z)) return; - #endif - - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR(">>> homeaxis(", axis_codes[axis], ")"); - - const int axis_home_dir = TERN0(DUAL_X_CARRIAGE, axis == X_AXIS) - ? x_home_dir(active_extruder) : home_dir(axis); - - // - // Homing Z with a probe? Raise Z (maybe) and deploy the Z probe. - // - if (TERN0(HOMING_Z_WITH_PROBE, axis == Z_AXIS && probe.deploy())) - return; - - // Set flags for X, Y, Z motor locking - #if HAS_EXTRA_ENDSTOPS - switch (axis) { - TERN_(X_DUAL_ENDSTOPS, case X_AXIS:) - TERN_(Y_DUAL_ENDSTOPS, case Y_AXIS:) - TERN_(Z_MULTI_ENDSTOPS, case Z_AXIS:) - stepper.set_separate_multi_axis(true); - default: break; - } - #endif - - // - // Deploy BLTouch or tare the probe just before probing - // - #if HOMING_Z_WITH_PROBE - if (axis == Z_AXIS) { - if (TERN0(BLTOUCH, bltouch.deploy())) return; // BLTouch was deployed above, but get the alarm state. - if (TERN0(PROBE_TARE, probe.tare())) return; - } - #endif - - // - // Back away to prevent an early X/Y sensorless trigger - // - #if DISABLED(DELTA) && defined(SENSORLESS_BACKOFF_MM) - const xy_float_t backoff = SENSORLESS_BACKOFF_MM; - if ((TERN0(X_SENSORLESS, axis == X_AXIS) || TERN0(Y_SENSORLESS, axis == Y_AXIS)) && backoff[axis]) { - const float backoff_length = -ABS(backoff[axis]) * axis_home_dir; - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Sensorless backoff: ", backoff_length, "mm"); - do_homing_move(axis, backoff_length, homing_feedrate(axis)); - } - #endif - - // Determine if a homing bump will be done and the bumps distance - // When homing Z with probe respect probe clearance - const bool use_probe_bump = TERN0(HOMING_Z_WITH_PROBE, axis == Z_AXIS && home_bump_mm(Z_AXIS)); - const float bump = axis_home_dir * ( - use_probe_bump ? _MAX(TERN0(HOMING_Z_WITH_PROBE, Z_CLEARANCE_BETWEEN_PROBES), home_bump_mm(Z_AXIS)) : home_bump_mm(axis) - ); - - // - // Fast move towards endstop until triggered - // - const float move_length = 1.5f * max_length(TERN(DELTA, Z_AXIS, axis)) * axis_home_dir; - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Home Fast: ", move_length, "mm"); - do_homing_move(axis, move_length, 0.0, !use_probe_bump); - - #if BOTH(HOMING_Z_WITH_PROBE, BLTOUCH_SLOW_MODE) - if (axis == Z_AXIS) bltouch.stow(); // Intermediate STOW (in LOW SPEED MODE) - #endif - - // If a second homing move is configured... - if (bump) { - // Move away from the endstop by the axis HOMING_BUMP_MM - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Move Away: ", -bump, "mm"); - do_homing_move(axis, -bump, TERN0(HOMING_Z_WITH_PROBE, axis == Z_AXIS) ? MMM_TO_MMS(Z_PROBE_SPEED_FAST) : 0, false); - - #if ENABLED(DETECT_BROKEN_ENDSTOP) - // Check for a broken endstop - EndstopEnum es; - switch (axis) { - default: - case X_AXIS: es = X_ENDSTOP; break; - case Y_AXIS: es = Y_ENDSTOP; break; - case Z_AXIS: es = Z_ENDSTOP; break; - } - if (TEST(endstops.state(), es)) { - SERIAL_ECHO_MSG("Bad ", axis_codes[axis], " Endstop?"); - kill(GET_TEXT(MSG_KILL_HOMING_FAILED)); - } - #endif - - #if BOTH(HOMING_Z_WITH_PROBE, BLTOUCH_SLOW_MODE) - if (axis == Z_AXIS && bltouch.deploy()) return; // Intermediate DEPLOY (in LOW SPEED MODE) - #endif - - // Slow move towards endstop until triggered - const float rebump = bump * 2; - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Re-bump: ", rebump, "mm"); - do_homing_move(axis, rebump, get_homing_bump_feedrate(axis), true); - - #if BOTH(HOMING_Z_WITH_PROBE, BLTOUCH) - if (axis == Z_AXIS) bltouch.stow(); // The final STOW - #endif - } - - #if HAS_EXTRA_ENDSTOPS - const bool pos_dir = axis_home_dir > 0; - #if ENABLED(X_DUAL_ENDSTOPS) - if (axis == X_AXIS) { - const float adj = ABS(endstops.x2_endstop_adj); - if (adj) { - if (pos_dir ? (endstops.x2_endstop_adj > 0) : (endstops.x2_endstop_adj < 0)) stepper.set_x_lock(true); else stepper.set_x2_lock(true); - do_homing_move(axis, pos_dir ? -adj : adj); - stepper.set_x_lock(false); - stepper.set_x2_lock(false); - } - } - #endif - #if ENABLED(Y_DUAL_ENDSTOPS) - if (axis == Y_AXIS) { - const float adj = ABS(endstops.y2_endstop_adj); - if (adj) { - if (pos_dir ? (endstops.y2_endstop_adj > 0) : (endstops.y2_endstop_adj < 0)) stepper.set_y_lock(true); else stepper.set_y2_lock(true); - do_homing_move(axis, pos_dir ? -adj : adj); - stepper.set_y_lock(false); - stepper.set_y2_lock(false); - } - } - #endif - - #if ENABLED(Z_MULTI_ENDSTOPS) - if (axis == Z_AXIS) { - - #if NUM_Z_STEPPER_DRIVERS == 2 - - const float adj = ABS(endstops.z2_endstop_adj); - if (adj) { - if (pos_dir ? (endstops.z2_endstop_adj > 0) : (endstops.z2_endstop_adj < 0)) stepper.set_z1_lock(true); else stepper.set_z2_lock(true); - do_homing_move(axis, pos_dir ? -adj : adj); - stepper.set_z1_lock(false); - stepper.set_z2_lock(false); - } - - #else - - // Handy arrays of stepper lock function pointers - - typedef void (*adjustFunc_t)(const bool); - - adjustFunc_t lock[] = { - stepper.set_z1_lock, stepper.set_z2_lock, stepper.set_z3_lock - #if NUM_Z_STEPPER_DRIVERS >= 4 - , stepper.set_z4_lock - #endif - }; - float adj[] = { - 0, endstops.z2_endstop_adj, endstops.z3_endstop_adj - #if NUM_Z_STEPPER_DRIVERS >= 4 - , endstops.z4_endstop_adj - #endif - }; - - adjustFunc_t tempLock; - float tempAdj; - - // Manual bubble sort by adjust value - if (adj[1] < adj[0]) { - tempLock = lock[0], tempAdj = adj[0]; - lock[0] = lock[1], adj[0] = adj[1]; - lock[1] = tempLock, adj[1] = tempAdj; - } - if (adj[2] < adj[1]) { - tempLock = lock[1], tempAdj = adj[1]; - lock[1] = lock[2], adj[1] = adj[2]; - lock[2] = tempLock, adj[2] = tempAdj; - } - #if NUM_Z_STEPPER_DRIVERS >= 4 - if (adj[3] < adj[2]) { - tempLock = lock[2], tempAdj = adj[2]; - lock[2] = lock[3], adj[2] = adj[3]; - lock[3] = tempLock, adj[3] = tempAdj; - } - if (adj[2] < adj[1]) { - tempLock = lock[1], tempAdj = adj[1]; - lock[1] = lock[2], adj[1] = adj[2]; - lock[2] = tempLock, adj[2] = tempAdj; - } - #endif - if (adj[1] < adj[0]) { - tempLock = lock[0], tempAdj = adj[0]; - lock[0] = lock[1], adj[0] = adj[1]; - lock[1] = tempLock, adj[1] = tempAdj; - } - - if (pos_dir) { - // normalize adj to smallest value and do the first move - (*lock[0])(true); - do_homing_move(axis, adj[1] - adj[0]); - // lock the second stepper for the final correction - (*lock[1])(true); - do_homing_move(axis, adj[2] - adj[1]); - #if NUM_Z_STEPPER_DRIVERS >= 4 - // lock the third stepper for the final correction - (*lock[2])(true); - do_homing_move(axis, adj[3] - adj[2]); - #endif - } - else { - #if NUM_Z_STEPPER_DRIVERS >= 4 - (*lock[3])(true); - do_homing_move(axis, adj[2] - adj[3]); - #endif - (*lock[2])(true); - do_homing_move(axis, adj[1] - adj[2]); - (*lock[1])(true); - do_homing_move(axis, adj[0] - adj[1]); - } - - stepper.set_z1_lock(false); - stepper.set_z2_lock(false); - stepper.set_z3_lock(false); - #if NUM_Z_STEPPER_DRIVERS >= 4 - stepper.set_z4_lock(false); - #endif - - #endif - } - #endif - - // Reset flags for X, Y, Z motor locking - switch (axis) { - default: break; - TERN_(X_DUAL_ENDSTOPS, case X_AXIS:) - TERN_(Y_DUAL_ENDSTOPS, case Y_AXIS:) - TERN_(Z_MULTI_ENDSTOPS, case Z_AXIS:) - stepper.set_separate_multi_axis(false); - } - #endif - - #ifdef TMC_HOME_PHASE - // move back to homing phase if configured and capable - backout_to_tmc_homing_phase(axis); - #endif - - #if IS_SCARA - - set_axis_is_at_home(axis); - sync_plan_position(); - - #elif ENABLED(DELTA) - - // Delta has already moved all three towers up in G28 - // so here it re-homes each tower in turn. - // Delta homing treats the axes as normal linear axes. - - const float adjDistance = delta_endstop_adj[axis], - minDistance = (MIN_STEPS_PER_SEGMENT) * planner.steps_to_mm[axis]; - - // Retrace by the amount specified in delta_endstop_adj if more than min steps. - if (adjDistance * (Z_HOME_DIR) < 0 && ABS(adjDistance) > minDistance) { // away from endstop, more than min distance - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("adjDistance:", adjDistance); - do_homing_move(axis, adjDistance, get_homing_bump_feedrate(axis)); - } - - #else // CARTESIAN / CORE / MARKFORGED_XY - - set_axis_is_at_home(axis); - sync_plan_position(); - - destination[axis] = current_position[axis]; - - if (DEBUGGING(LEVELING)) DEBUG_POS("> AFTER set_axis_is_at_home", current_position); - - #endif - - // Put away the Z probe - #if HOMING_Z_WITH_PROBE - if (axis == Z_AXIS && probe.stow()) return; - #endif - - #if DISABLED(DELTA) && defined(HOMING_BACKOFF_POST_MM) - const xyz_float_t endstop_backoff = HOMING_BACKOFF_POST_MM; - if (endstop_backoff[axis]) { - current_position[axis] -= ABS(endstop_backoff[axis]) * axis_home_dir; - line_to_current_position( - #if HOMING_Z_WITH_PROBE - (axis == Z_AXIS) ? z_probe_fast_mm_s : - #endif - homing_feedrate(axis) - ); - - #if ENABLED(SENSORLESS_HOMING) - planner.synchronize(); - if (false - #if EITHER(IS_CORE, MARKFORGED_XY) - || axis != NORMAL_AXIS - #endif - ) safe_delay(200); // Short delay to allow belts to spring back - #endif - } - #endif - - // Clear retracted status if homing the Z axis - #if ENABLED(FWRETRACT) - if (axis == Z_AXIS) fwretract.current_hop = 0.0; - #endif - - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("<<< homeaxis(", axis_codes[axis], ")"); - -} // homeaxis() - #if HAS_WORKSPACE_OFFSET void update_workspace_offset(const AxisEnum axis) { workspace_offset[axis] = home_offset[axis] + position_shift[axis]; @@ -1893,4 +1890,4 @@ void homeaxis(const AxisEnum axis) { home_offset[axis] = v; update_workspace_offset(axis); } -#endif // HAS_M206_COMMAND +#endif diff --git a/Marlin/src/module/motion.h b/Marlin/src/module/motion.h index 328bfe018d..2a23636d71 100644 --- a/Marlin/src/module/motion.h +++ b/Marlin/src/module/motion.h @@ -284,27 +284,51 @@ void do_z_clearance(const float &zclear, const bool z_trusted=true, const bool r * Homing and Trusted Axes */ constexpr uint8_t xyz_bits = _BV(X_AXIS) | _BV(Y_AXIS) | _BV(Z_AXIS); -extern uint8_t axis_homed, axis_trusted; -void homeaxis(const AxisEnum axis); void set_axis_is_at_home(const AxisEnum axis); -void set_axis_never_homed(const AxisEnum axis); -uint8_t axes_should_home(uint8_t axis_bits=0x07); -bool homing_needed_error(uint8_t axis_bits=0x07); -FORCE_INLINE bool axis_was_homed(const AxisEnum axis) { return TEST(axis_homed, axis); } -FORCE_INLINE bool axis_is_trusted(const AxisEnum axis) { return TEST(axis_trusted, axis); } -FORCE_INLINE bool axis_should_home(const AxisEnum axis) { return (axes_should_home() & _BV(axis)) != 0; } -FORCE_INLINE bool no_axes_homed() { return !axis_homed; } -FORCE_INLINE bool all_axes_homed() { return xyz_bits == (axis_homed & xyz_bits); } -FORCE_INLINE bool homing_needed() { return !all_axes_homed(); } -FORCE_INLINE bool all_axes_trusted() { return xyz_bits == (axis_trusted & xyz_bits); } -FORCE_INLINE void set_axis_homed(const AxisEnum axis) { SBI(axis_homed, axis); } -FORCE_INLINE void set_axis_unhomed(const AxisEnum axis) { CBI(axis_homed, axis); } -FORCE_INLINE void set_axis_trusted(const AxisEnum axis) { SBI(axis_trusted, axis); } -FORCE_INLINE void set_axis_untrusted(const AxisEnum axis) { CBI(axis_trusted, axis); } -FORCE_INLINE void set_all_homed() { axis_homed = axis_trusted = xyz_bits; } -FORCE_INLINE void set_all_unhomed() { axis_homed = axis_trusted = 0; } +#if HAS_ENDSTOPS + /** + * axis_homed + * Flags that each linear axis was homed. + * XYZ on cartesian, ABC on delta, ABZ on SCARA. + * + * axis_trusted + * Flags that the position is trusted in each linear axis. Set when homed. + * Cleared whenever a stepper powers off, potentially losing its position. + */ + extern uint8_t axis_homed, axis_trusted; + void homeaxis(const AxisEnum axis); + void set_axis_never_homed(const AxisEnum axis); + uint8_t axes_should_home(uint8_t axis_bits=0x07); + bool homing_needed_error(uint8_t axis_bits=0x07); + FORCE_INLINE void set_axis_unhomed(const AxisEnum axis) { CBI(axis_homed, axis); } + FORCE_INLINE void set_axis_untrusted(const AxisEnum axis) { CBI(axis_trusted, axis); } + FORCE_INLINE void set_all_unhomed() { axis_homed = axis_trusted = 0; } + FORCE_INLINE void set_axis_homed(const AxisEnum axis) { SBI(axis_homed, axis); } + FORCE_INLINE void set_axis_trusted(const AxisEnum axis) { SBI(axis_trusted, axis); } + FORCE_INLINE void set_all_homed() { axis_homed = axis_trusted = xyz_bits; } +#else + constexpr uint8_t axis_homed = xyz_bits, axis_trusted = xyz_bits; // Zero-endstop machines are always homed and trusted + FORCE_INLINE void homeaxis(const AxisEnum axis) {} + FORCE_INLINE void set_axis_never_homed(const AxisEnum) {} + FORCE_INLINE uint8_t axes_should_home(uint8_t=0x07) { return false; } + FORCE_INLINE bool homing_needed_error(uint8_t=0x07) { return false; } + FORCE_INLINE void set_axis_unhomed(const AxisEnum axis) {} + FORCE_INLINE void set_axis_untrusted(const AxisEnum axis) {} + FORCE_INLINE void set_all_unhomed() {} + FORCE_INLINE void set_axis_homed(const AxisEnum axis) {} + FORCE_INLINE void set_axis_trusted(const AxisEnum axis) {} + FORCE_INLINE void set_all_homed() {} +#endif + +FORCE_INLINE bool axis_was_homed(const AxisEnum axis) { return TEST(axis_homed, axis); } +FORCE_INLINE bool axis_is_trusted(const AxisEnum axis) { return TEST(axis_trusted, axis); } +FORCE_INLINE bool axis_should_home(const AxisEnum axis) { return (axes_should_home() & _BV(axis)) != 0; } +FORCE_INLINE bool no_axes_homed() { return !axis_homed; } +FORCE_INLINE bool all_axes_homed() { return xyz_bits == (axis_homed & xyz_bits); } +FORCE_INLINE bool homing_needed() { return !all_axes_homed(); } +FORCE_INLINE bool all_axes_trusted() { return xyz_bits == (axis_trusted & xyz_bits); } #if ENABLED(NO_MOTION_BEFORE_HOMING) #define MOTION_CONDITIONS (IsRunning() && !homing_needed_error()) @@ -360,7 +384,6 @@ FORCE_INLINE void set_all_unhomed() { axis_homed = axis_tr /** * position_is_reachable family of functions */ - #if IS_KINEMATIC // (DELTA or SCARA) #if HAS_SCARA_OFFSET @@ -390,14 +413,14 @@ FORCE_INLINE void set_all_unhomed() { axis_homed = axis_tr // Return true if the given position is within the machine bounds. inline bool position_is_reachable(const float &rx, const float &ry) { - if (!WITHIN(ry, Y_MIN_POS - fslop, Y_MAX_POS + fslop)) return false; + if (!COORDINATE_OKAY(ry, Y_MIN_POS - fslop, Y_MAX_POS + fslop)) return false; #if ENABLED(DUAL_X_CARRIAGE) if (active_extruder) - return WITHIN(rx, X2_MIN_POS - fslop, X2_MAX_POS + fslop); + return COORDINATE_OKAY(rx, X2_MIN_POS - fslop, X2_MAX_POS + fslop); else - return WITHIN(rx, X1_MIN_POS - fslop, X1_MAX_POS + fslop); + return COORDINATE_OKAY(rx, X1_MIN_POS - fslop, X1_MAX_POS + fslop); #else - return WITHIN(rx, X_MIN_POS - fslop, X_MAX_POS + fslop); + return COORDINATE_OKAY(rx, X_MIN_POS - fslop, X_MAX_POS + fslop); #endif } inline bool position_is_reachable(const xy_pos_t &pos) { return position_is_reachable(pos.x, pos.y); } diff --git a/Marlin/src/module/planner.h b/Marlin/src/module/planner.h index cd906c5d13..b7ff0ee932 100644 --- a/Marlin/src/module/planner.h +++ b/Marlin/src/module/planner.h @@ -564,10 +564,10 @@ class Planner { #if ENABLED(SKEW_CORRECTION) 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)) { + if (COORDINATE_OKAY(cx, X_MIN_POS + 1, X_MAX_POS) && COORDINATE_OKAY(cy, Y_MIN_POS + 1, Y_MAX_POS)) { 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)) { + if (COORDINATE_OKAY(sx, X_MIN_POS, X_MAX_POS) && COORDINATE_OKAY(sy, Y_MIN_POS, Y_MAX_POS)) { cx = sx; cy = sy; } } @@ -575,10 +575,10 @@ class Planner { FORCE_INLINE static void skew(xyz_pos_t &raw) { skew(raw.x, raw.y, raw.z); } 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)) { + if (COORDINATE_OKAY(cx, X_MIN_POS, X_MAX_POS) && COORDINATE_OKAY(cy, Y_MIN_POS, Y_MAX_POS)) { 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)) { + if (COORDINATE_OKAY(sx, X_MIN_POS, X_MAX_POS) && COORDINATE_OKAY(sy, Y_MIN_POS, Y_MAX_POS)) { cx = sx; cy = sy; } } diff --git a/Marlin/src/module/probe.h b/Marlin/src/module/probe.h index c8b214370c..6b3d990859 100644 --- a/Marlin/src/module/probe.h +++ b/Marlin/src/module/probe.h @@ -92,8 +92,8 @@ public: */ static bool can_reach(const float &rx, const float &ry) { return position_is_reachable(rx - offset_xy.x, ry - offset_xy.y) - && WITHIN(rx, min_x() - fslop, max_x() + fslop) - && WITHIN(ry, min_y() - fslop, max_y() + fslop); + && COORDINATE_OKAY(rx, min_x() - fslop, max_x() + fslop) + && COORDINATE_OKAY(ry, min_y() - fslop, max_y() + fslop); } #endif @@ -206,8 +206,8 @@ public: #if IS_KINEMATIC return HYPOT2(x, y) <= sq(probe_radius(default_probe_xy_offset)); #else - return WITHIN(x, _min_x(default_probe_xy_offset) - fslop, _max_x(default_probe_xy_offset) + fslop) - && WITHIN(y, _min_y(default_probe_xy_offset) - fslop, _max_y(default_probe_xy_offset) + fslop); + return COORDINATE_OKAY(x, _min_x(default_probe_xy_offset) - fslop, _max_x(default_probe_xy_offset) + fslop) + && COORDINATE_OKAY(y, _min_y(default_probe_xy_offset) - fslop, _max_y(default_probe_xy_offset) + fslop); #endif } diff --git a/buildroot/tests/teensy31-tests b/buildroot/tests/teensy31-tests index 448a8860c7..cf01d27461 100755 --- a/buildroot/tests/teensy31-tests +++ b/buildroot/tests/teensy31-tests @@ -10,6 +10,14 @@ restore_configs opt_set MOTHERBOARD BOARD_TEENSY31_32 exec_test $1 $2 "Teensy3.1 with default config" "$3" +# +# Zero endstops, as with a CNC +# +restore_configs +opt_set MOTHERBOARD BOARD_TEENSY31_32 +opt_disable USE_XMIN_PLUG USE_YMIN_PLUG USE_ZMIN_PLUG +exec_test $1 $2 "Teensy3.1 with Zero Endstops" "$3" + # # Test many features together # From 12468f5e9f22588660e17572292157bd2a86ef19 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 25 Feb 2021 05:15:49 -0600 Subject: [PATCH 024/253] Tweak case light comment --- Marlin/Configuration_adv.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 7ec81c6675..758639cfc0 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -522,7 +522,7 @@ #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_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) - //#define CASE_LIGHT_MAX_PWM 128 // Limit pwm + //#define CASE_LIGHT_MAX_PWM 128 // Limit PWM duty cycle (0-255) //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_USE_NEOPIXEL // Use NeoPixel LED as case light, requires NEOPIXEL_LED. From a21d4c06aeb38b2b93bcfa21bd5773105d8df9be Mon Sep 17 00:00:00 2001 From: Katelyn Schiesser Date: Thu, 25 Feb 2021 06:14:24 -0800 Subject: [PATCH 025/253] Use 'H' value for UBL G29 z-clearance (#21114) --- Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp index 6ceb571ee2..044f6b610c 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp @@ -892,7 +892,7 @@ void unified_bed_leveling::shift_mesh_height() { const xyz_pos_t ppos = { mesh_index_to_xpos(lpos.x), mesh_index_to_ypos(lpos.y), - Z_CLEARANCE_BETWEEN_PROBES + z_clearance }; if (!position_is_reachable(ppos)) break; // SHOULD NOT OCCUR (find_closest_mesh_point only returns reachable points) @@ -907,7 +907,14 @@ void unified_bed_leveling::shift_mesh_height() { if (do_ubl_mesh_map) display_map(g29_map_type); // show user where we're probing - serialprintPGM(parser.seen('B') ? GET_TEXT(MSG_UBL_BC_INSERT) : GET_TEXT(MSG_UBL_BC_INSERT2)); + if (parser.seen('B')) { + serialprintPGM(GET_TEXT(MSG_UBL_BC_INSERT)); + LCD_MESSAGEPGM(MSG_UBL_BC_INSERT); + } + else { + serialprintPGM(GET_TEXT(MSG_UBL_BC_INSERT2)); + LCD_MESSAGEPGM(MSG_UBL_BC_INSERT2); + } const float z_step = 0.01f; // existing behavior: 0.01mm per click, occasionally step //const float z_step = planner.steps_to_mm[Z_AXIS]; // approx one step each click From bb1039d4c91b7bfd282cd5b2b86e1466db80ba28 Mon Sep 17 00:00:00 2001 From: ellensp Date: Fri, 26 Feb 2021 03:15:55 +1300 Subject: [PATCH 026/253] Preflight checks for PlatformIO builds (#21068) Co-authored-by: Alexander D. Kanevskiy --- Marlin/src/pins/pins.h | 6 +- Marlin/src/pins/ramps/pins_ZRIB_V52.h | 1 + .../PlatformIO/scripts/common-dependencies.py | 11 ---- .../PlatformIO/scripts/preflight-checks.py | 62 +++++++++++++++++++ buildroot/tests/mega1280-tests | 4 +- platformio.ini | 1 + 6 files changed, 69 insertions(+), 16 deletions(-) create mode 100644 buildroot/share/PlatformIO/scripts/preflight-checks.py diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index f5b80fd4d0..8f0215d4c8 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -481,9 +481,9 @@ #elif MB(MKS_ROBIN_MINI) #include "stm32f1/pins_MKS_ROBIN_MINI.h" // STM32F1 env:mks_robin_mini #elif MB(MKS_ROBIN_NANO) - #include "stm32f1/pins_MKS_ROBIN_NANO.h" // STM32F1 env:mks_robin_nano35 + #include "stm32f1/pins_MKS_ROBIN_NANO.h" // STM32F1 env:mks_robin_nano35 env:mks_robin_nano35_stm32 #elif MB(MKS_ROBIN_NANO_V2) - #include "stm32f1/pins_MKS_ROBIN_NANO_V2.h" // STM32F1 env:mks_robin_nano35 + #include "stm32f1/pins_MKS_ROBIN_NANO_V2.h" // STM32F1 env:mks_robin_nano35 env:mks_robin_nano35_stm32 #elif MB(MKS_ROBIN_LITE) #include "stm32f1/pins_MKS_ROBIN_LITE.h" // STM32F1 env:mks_robin_lite #elif MB(MKS_ROBIN_LITE3) @@ -513,7 +513,7 @@ #elif MB(BTT_SKR_E3_DIP) #include "stm32f1/pins_BTT_SKR_E3_DIP.h" // STM32F1 env:STM32F103RE_btt env:STM32F103RE_btt_USB env:STM32F103RC_btt env:STM32F103RC_btt_512K env:STM32F103RC_btt_USB env:STM32F103RC_btt_512K_USB #elif MB(BTT_SKR_CR6) - #include "stm32f1/pins_BTT_SKR_CR6.h" // STM32F1 env:STM32F103RC_btt_512K_USB + #include "stm32f1/pins_BTT_SKR_CR6.h" // STM32F1 env:STM32F103RE_btt env:STM32F103RE_btt_USB #elif MB(JGAURORA_A5S_A1) #include "stm32f1/pins_JGAURORA_A5S_A1.h" // STM32F1 env:jgaurora_a5s_a1 #elif MB(FYSETC_AIO_II) diff --git a/Marlin/src/pins/ramps/pins_ZRIB_V52.h b/Marlin/src/pins/ramps/pins_ZRIB_V52.h index 983c840bbc..f4db07ef8d 100644 --- a/Marlin/src/pins/ramps/pins_ZRIB_V52.h +++ b/Marlin/src/pins/ramps/pins_ZRIB_V52.h @@ -46,6 +46,7 @@ #define E2_STEP_PIN 4 #define E2_DIR_PIN 5 #define E2_ENABLE_PIN 22 +#define HEATER_1_PIN 7 #include "pins_MKS_BASE_common.h" diff --git a/buildroot/share/PlatformIO/scripts/common-dependencies.py b/buildroot/share/PlatformIO/scripts/common-dependencies.py index 4500f529a6..30e168d83f 100644 --- a/buildroot/share/PlatformIO/scripts/common-dependencies.py +++ b/buildroot/share/PlatformIO/scripts/common-dependencies.py @@ -312,16 +312,6 @@ def MarlinFeatureIsEnabled(env, feature): return some_on -# -# Check for Configfiles in two common incorrect places -# -def check_configfile_locations(): - for p in [ env['PROJECT_DIR'], os.path.join(env['PROJECT_DIR'], "config") ]: - for f in [ "Configuration.h", "Configuration_adv.h" ]: - if os.path.isfile(os.path.join(p, f)): - err = 'ERROR: Config files found in directory ' + str(p) + '. Please move them into the Marlin subdirectory.' - raise SystemExit(err) - # # Add a method for other PIO scripts to query enabled features # @@ -330,6 +320,5 @@ env.AddMethod(MarlinFeatureIsEnabled) # # Add dependencies for enabled Marlin features # -check_configfile_locations() apply_features_config() force_ignore_unused_libs() diff --git a/buildroot/share/PlatformIO/scripts/preflight-checks.py b/buildroot/share/PlatformIO/scripts/preflight-checks.py new file mode 100644 index 0000000000..14807d954a --- /dev/null +++ b/buildroot/share/PlatformIO/scripts/preflight-checks.py @@ -0,0 +1,62 @@ +# +# preflight-checks.py +# Script to check for common issues prior to compiling +# +import os +import re +Import("env") + +def get_envs_for_board(board): + if board.startswith("BOARD_"): + board = board[6:] + with open(os.path.join("Marlin", "src", "pins", "pins.h"),"r") as f: + board_found = "" + r=re.compile(r"if\s+MB\((.+)\)") + for line in f.readlines(): + mbs = r.findall(line) + if mbs: + board_found = board if board in re.split(r",\s*", mbs[0]) else "" + if board_found and "#include " in line and "env:" in line: + return re.findall(r"env:\w+", line) + return [] + +def check_envs(build_env, base_envs, config): + if build_env in base_envs: + return True + ext = config.get(build_env, 'extends', default=None) + if ext: + for ext_env in ext: + if check_envs(ext_env, base_envs, config): + return True + return False + +# Sanity checks: +if 'PIOENV' not in env: + raise SystemExit("Error: PIOENV is not defined. This script is intended to be used with PlatformIO") + +if 'MARLIN_FEATURES' not in env: + raise SystemExit("Error: this script should be used after common Marlin scripts") + +if 'MOTHERBOARD' not in env['MARLIN_FEATURES']: + raise SystemExit("Error: MOTHERBOARD is not defined in Configuration.h") + +build_env = env['PIOENV'] +motherboard = env['MARLIN_FEATURES']['MOTHERBOARD'] +base_envs = get_envs_for_board(motherboard) +config = env.GetProjectConfig() +result = check_envs("env:"+build_env, base_envs, config) + +if not result: + err = "Error: your selected build environment '%s' is not compatible with MOTHERBOARD=%s in Configuration.h. " \ + "Please use one of compatible build environments for this board: %s" % \ + (build_env, motherboard, ",".join([e[4:] for e in base_envs if e.startswith("env:")])) + raise SystemExit(err) + +# +# Check for Config files in two common incorrect places +# +for p in [ env['PROJECT_DIR'], os.path.join(env['PROJECT_DIR'], "config") ]: + for f in [ "Configuration.h", "Configuration_adv.h" ]: + if os.path.isfile(os.path.join(p, f)): + err = "ERROR: Config files found in directory %s. Please move them into the Marlin subfolder." % p + raise SystemExit(err) diff --git a/buildroot/tests/mega1280-tests b/buildroot/tests/mega1280-tests index ac1b5f692d..9110e9feb6 100755 --- a/buildroot/tests/mega1280-tests +++ b/buildroot/tests/mega1280-tests @@ -33,13 +33,13 @@ exec_test $1 $2 "Spindle, MESH_BED_LEVELING, closed loop, Power Monitor, and LCD # Test DUAL_X_CARRIAGE # restore_configs -opt_set MOTHERBOARD BOARD_TT_OSCAR +opt_set MOTHERBOARD BOARD_ZRIB_V52 opt_set LCD_LANGUAGE pt opt_set EXTRUDERS 2 opt_set TEMP_SENSOR_1 1 opt_enable USE_XMAX_PLUG DUAL_X_CARRIAGE REPRAPWORLD_KEYPAD opt_set REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 -exec_test $1 $2 "TT Oscar | DUAL_X_CARRIAGE" "$3" +exec_test $1 $2 "ZRIB_V52 | DUAL_X_CARRIAGE" "$3" # # Delta Config (generic) + Probeless diff --git a/platformio.ini b/platformio.ini index fab20018d9..c03b224533 100644 --- a/platformio.ini +++ b/platformio.ini @@ -212,6 +212,7 @@ default_src_filter = + - - + extra_scripts = pre:buildroot/share/PlatformIO/scripts/common-dependencies.py pre:buildroot/share/PlatformIO/scripts/common-cxxflags.py + pre:buildroot/share/PlatformIO/scripts/preflight-checks.py post:buildroot/share/PlatformIO/scripts/common-dependencies-post.py build_flags = -fmax-errors=5 -g3 -D__MARLIN_FIRMWARE__ -fmerge-constants lib_deps = From 735c1b6183739152eeddade4c06c17e3b0de38bc Mon Sep 17 00:00:00 2001 From: Katelyn Schiesser Date: Thu, 25 Feb 2021 06:28:27 -0800 Subject: [PATCH 027/253] PROBING_HEATERS_OFF sub-option WAIT_FOR_HOTEND (#20835) --- Marlin/Configuration.h | 1 + Marlin/src/module/motion.cpp | 7 ++++++- Marlin/src/module/probe.cpp | 4 ++++ Marlin/src/module/temperature.cpp | 11 +++++++++++ Marlin/src/module/temperature.h | 4 ++++ 5 files changed, 26 insertions(+), 1 deletion(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 1c98168236..ea3385356a 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -1139,6 +1139,7 @@ //#define PROBING_HEATERS_OFF // Turn heaters off when probing #if ENABLED(PROBING_HEATERS_OFF) //#define WAIT_FOR_BED_HEATER // Wait for bed to heat back up between probes (to improve accuracy) + //#define WAIT_FOR_HOTEND // Wait for hotend to heat back up between probes (to improve accuracy & prevent cold extrude) #endif //#define PROBING_FANS_OFF // Turn fans off when probing //#define PROBING_STEPPERS_OFF // Turn steppers off (unless needed to hold position) when probing diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index 10d3585a73..55973185ee 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -1318,11 +1318,16 @@ void prepare_line_to_destination() { if (is_home_dir) { if (TERN0(HOMING_Z_WITH_PROBE, axis == Z_AXIS)) { - #if ALL(HAS_HEATED_BED, WAIT_FOR_BED_HEATER) + #if BOTH(HAS_HEATED_BED, WAIT_FOR_BED_HEATER) // Wait for bed to heat back up between probing points thermalManager.wait_for_bed_heating(); #endif + #if BOTH(HAS_HOTEND, WAIT_FOR_HOTEND) + // Wait for the hotend to heat back up between probing points + thermalManager.wait_for_hotend_heating(active_extruder); + #endif + TERN_(HAS_QUIET_PROBING, if (final_approach) probe.set_probing_paused(true)); } diff --git a/Marlin/src/module/probe.cpp b/Marlin/src/module/probe.cpp index 6df115225e..e59e514a06 100644 --- a/Marlin/src/module/probe.cpp +++ b/Marlin/src/module/probe.cpp @@ -478,6 +478,10 @@ bool Probe::probe_down_to_z(const float z, const feedRate_t fr_mm_s) { thermalManager.wait_for_bed_heating(); #endif + #if BOTH(HAS_TEMP_HOTEND, WAIT_FOR_HOTEND) + thermalManager.wait_for_hotend_heating(active_extruder); + #endif + if (TERN0(BLTOUCH_SLOW_MODE, bltouch.deploy())) return true; // Deploy in LOW SPEED MODE on every probe action // Disable stealthChop if used. Enable diag1 pin on driver. diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index a220386b9e..e85e48c2d4 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -3447,6 +3447,17 @@ void Temperature::tick() { return false; } + #if ENABLED(WAIT_FOR_HOTEND) + void Temperature::wait_for_hotend_heating(const uint8_t target_extruder) { + if (isHeatingHotend(target_extruder)) { + SERIAL_ECHOLNPGM("Wait for hotend heating..."); + LCD_MESSAGEPGM(MSG_HEATING); + wait_for_hotend(target_extruder); + ui.reset_status(); + } + } + #endif + #endif // HAS_TEMP_HOTEND #if HAS_HEATED_BED diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index 1019c10fad..5f5a076911 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -630,6 +630,10 @@ class Temperature { , const bool click_to_cancel=false #endif ); + + #if ENABLED(WAIT_FOR_HOTEND) + static void wait_for_hotend_heating(const uint8_t target_extruder); + #endif #endif FORCE_INLINE static bool still_heating(const uint8_t e) { From 08d54b3d78824111dbe3fca894c4d50aec53586c Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 25 Feb 2021 09:14:24 -0600 Subject: [PATCH 028/253] Eryone Thinker V2 (#21190) Co-Authored-By: Bryan Joshua Pedini --- Marlin/Makefile | 2 + Marlin/src/core/boards.h | 1 + Marlin/src/pins/pins.h | 2 + Marlin/src/pins/rambo/pins_RAMBO.h | 32 ++++++++--- Marlin/src/pins/rambo/pins_RAMBO_THINKERV2.h | 60 ++++++++++++++++++++ 5 files changed, 89 insertions(+), 8 deletions(-) create mode 100755 Marlin/src/pins/rambo/pins_RAMBO_THINKERV2.h diff --git a/Marlin/Makefile b/Marlin/Makefile index 49cb960b92..19c2d0b329 100644 --- a/Marlin/Makefile +++ b/Marlin/Makefile @@ -323,6 +323,8 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1203) else ifeq ($(HARDWARE_MOTHERBOARD),1204) # abee Scoovo X9H else ifeq ($(HARDWARE_MOTHERBOARD),1205) +# Rambo ThinkerV2 +else ifeq ($(HARDWARE_MOTHERBOARD),1206) # # Other ATmega1280, ATmega2560 diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index 5a1df8bfa4..cfde52ddb9 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -126,6 +126,7 @@ #define BOARD_EINSY_RAMBO 1203 // Einsy Rambo #define BOARD_EINSY_RETRO 1204 // Einsy Retro #define BOARD_SCOOVO_X9H 1205 // abee Scoovo X9H +#define BOARD_RAMBO_THINKERV2 1206 // ThinkerV2 // // Other ATmega1280, ATmega2560 diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 8f0215d4c8..11b42b1c32 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -207,6 +207,8 @@ #include "rambo/pins_EINSY_RETRO.h" // ATmega2560 env:rambo #elif MB(SCOOVO_X9H) #include "rambo/pins_SCOOVO_X9H.h" // ATmega2560 env:rambo +#elif MB(RAMBO_THINKERV2) + #include "rambo/pins_RAMBO_THINKERV2.h" // ATmega2560 env:rambo // // Other ATmega1280, ATmega2560 diff --git a/Marlin/src/pins/rambo/pins_RAMBO.h b/Marlin/src/pins/rambo/pins_RAMBO.h index be2317b146..65fc4b5af8 100644 --- a/Marlin/src/pins/rambo/pins_RAMBO.h +++ b/Marlin/src/pins/rambo/pins_RAMBO.h @@ -45,14 +45,20 @@ #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" #endif -#define BOARD_INFO_NAME "Rambo" +#ifndef BOARD_INFO_NAME + #define BOARD_INFO_NAME "Rambo" +#endif // // Servos // -#define SERVO0_PIN 22 // Motor header MX1 +#ifndef SERVO0_PIN + #define SERVO0_PIN 22 // Motor header MX1 +#endif #define SERVO1_PIN 23 // Motor header MX2 -#define SERVO2_PIN 24 // Motor header MX3 +#ifndef SERVO2_PIN + #define SERVO2_PIN 24 // Motor header MX3 +#endif #define SERVO3_PIN 5 // PWM header pin 5 // @@ -62,7 +68,9 @@ #define X_MAX_PIN 24 #define Y_MIN_PIN 11 #define Y_MAX_PIN 23 -#define Z_MIN_PIN 10 +#ifndef Z_MIN_PIN + #define Z_MIN_PIN 10 +#endif #define Z_MAX_PIN 30 // @@ -135,8 +143,12 @@ #ifndef FAN_PIN #define FAN_PIN 8 #endif -#define FAN1_PIN 6 -#define FAN2_PIN 2 +#ifndef FAN1_PIN + #define FAN1_PIN 6 +#endif +#ifndef FAN2_PIN + #define FAN2_PIN 2 +#endif // // Misc. Functions @@ -220,8 +232,12 @@ #define BEEPER_PIN 79 // AUX-4 // AUX-2 - #define BTN_EN1 76 - #define BTN_EN2 77 + #ifndef BTN_EN1 + #define BTN_EN1 76 + #endif + #ifndef BTN_EN2 + #define BTN_EN2 77 + #endif #define BTN_ENC 78 #define SD_DETECT_PIN 81 diff --git a/Marlin/src/pins/rambo/pins_RAMBO_THINKERV2.h b/Marlin/src/pins/rambo/pins_RAMBO_THINKERV2.h new file mode 100755 index 0000000000..278a5bf0b4 --- /dev/null +++ b/Marlin/src/pins/rambo/pins_RAMBO_THINKERV2.h @@ -0,0 +1,60 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 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 + +/** + * Rambo ThinkerV2 pin assignments + */ + +#define BOARD_INFO_NAME "Rambo ThinkerV2" + +#define SERVO0_PIN 4 // Motor header MX1 +#define SERVO2_PIN -1 // Motor header MX3 + +#ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN 10 +#endif + +// Support BLTouch and fixed probes +#if ENABLED(BLTOUCH) + #if ENABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) + #define Z_MIN_PIN 22 + #elif !defined(Z_MIN_PROBE_PIN) + #define Z_MIN_PROBE_PIN 22 + #endif +#elif ENABLED(FIX_MOUNTED_PROBE) + #if ENABLED(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) + #define Z_MIN_PIN 4 + #elif !defined(Z_MIN_PROBE_PIN) + #define Z_MIN_PROBE_PIN 4 + #endif +#endif + +// Eryone has the fan pins reversed +#define FAN1_PIN 2 +#define FAN2_PIN 6 + +// Encoder +#define BTN_EN1 64 +#define BTN_EN2 63 + +#include "pins_RAMBO.h" From 45fff07a4cfd2442b8bcbb6a081eaeb1fd5810f8 Mon Sep 17 00:00:00 2001 From: qwewer0 <57561110+qwewer0@users.noreply.github.com> Date: Thu, 25 Feb 2021 16:21:17 +0100 Subject: [PATCH 029/253] Fix LEVEL_CORNERS_USE_PROBE with BLTOUCH_HS_MODE (#21161) --- Marlin/src/lcd/menu/menu_bed_corners.cpp | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Marlin/src/lcd/menu/menu_bed_corners.cpp b/Marlin/src/lcd/menu/menu_bed_corners.cpp index 751be18600..505b31876a 100644 --- a/Marlin/src/lcd/menu/menu_bed_corners.cpp +++ b/Marlin/src/lcd/menu/menu_bed_corners.cpp @@ -269,12 +269,13 @@ static inline void _lcd_level_bed_corners_get_next_position() { do { ui.refresh(LCDVIEW_REDRAW_NOW); _lcd_draw_probing(); // update screen with # of good points - do_blocking_move_to_z(current_position.z + LEVEL_CORNERS_Z_HOP); // clearance + do_blocking_move_to_z(current_position.z + LEVEL_CORNERS_Z_HOP + TERN0(BLTOUCH_HS_MODE, 7)); // clearance _lcd_level_bed_corners_get_next_position(); // Select next corner coordinates current_position -= probe.offset_xy; // Account for probe offsets do_blocking_move_to_xy(current_position); // Goto corner + TERN_(BLTOUCH_HS_MODE, bltouch.deploy()); // Deploy in HIGH SPEED MODE if (!_lcd_level_bed_corners_probe()) { // Probe down to tolerance if (_lcd_level_bed_corners_raise()) { // Prompt user to raise bed if needed #if ENABLED(LEVEL_CORNERS_VERIFY_RAISED) // Verify @@ -295,6 +296,9 @@ static inline void _lcd_level_bed_corners_get_next_position() { } while (good_points < nr_edge_points); // loop until all points within tolerance + TERN_(BLTOUCH_HS_MODE, do_blocking_move_to_z(current_position.z + LEVEL_CORNERS_Z_HOP)); // Do clearance in HIGH SPEED MODE at the very end + TERN_(BLTOUCH_HS_MODE, bltouch.stow()); // Stow in HIGH SPEED MODE at the very end + ui.goto_screen(_lcd_draw_level_prompt); // prompt for bed leveling ui.set_selection(true); } From 7fc75fc48263690cd8dd64686213d6a42d0795e6 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Thu, 25 Feb 2021 12:23:30 -0300 Subject: [PATCH 030/253] Zero Endstops followup (#21188) --- Marlin/src/module/motion.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index 55973185ee..e2613b0185 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -1393,7 +1393,7 @@ void prepare_line_to_destination() { TERN_(I2C_POSITION_ENCODERS, I2CPEM.unhomed(axis)); } - #if ENABLED(TMC_HOME_PHASE) + #ifdef TMC_HOME_PHASE /** * Move the axis back to its home_phase if set and driver is capable (TMC) * From bcda46e3f3435a1f87d224be2f81778c1855deb7 Mon Sep 17 00:00:00 2001 From: swissnorp <67485708+swissnorp@users.noreply.github.com> Date: Thu, 25 Feb 2021 17:09:00 +0100 Subject: [PATCH 031/253] Combine Z_AFTER_DEACTIVATE with UNKNOWN_Z_NO_RAISE (#20444) Co-authored-by: Scott Lahteine --- Marlin/Configuration.h | 9 +++++++-- Marlin/Configuration_adv.h | 3 --- Marlin/src/gcode/calibrate/G28.cpp | 6 ++---- Marlin/src/inc/SanityCheck.h | 4 ++++ Marlin/src/module/motion.cpp | 13 +++++++++---- Marlin/src/module/motion.h | 2 +- Marlin/src/module/probe.cpp | 9 +-------- Marlin/src/module/probe.h | 4 ++-- Marlin/src/module/stepper/indirection.h | 4 ++-- buildroot/tests/STM32F103RC_btt-tests | 2 +- 10 files changed, 29 insertions(+), 27 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index ea3385356a..b50c884b7e 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -569,7 +569,6 @@ * the issues involved, don't use chamber PID until someone else verifies that your hardware works. */ //#define PIDTEMPCHAMBER - //#define CHAMBER_LIMIT_SWITCHING /** @@ -1196,7 +1195,13 @@ //#define NO_MOTION_BEFORE_HOMING // Inhibit movement until all axes have been homed. Also enable HOME_AFTER_DEACTIVATE for extra safety. //#define HOME_AFTER_DEACTIVATE // Require rehoming after steppers are deactivated. Also enable NO_MOTION_BEFORE_HOMING for extra safety. -//#define UNKNOWN_Z_NO_RAISE // Don't raise Z (lower the bed) if Z is "unknown." For beds that fall when Z is powered off. + +/** + * Set Z_IDLE_HEIGHT if the Z-Axis moves on its own when steppers are disabled. + * - Use a low value (i.e., Z_MIN_POS) if the nozzle falls down to the bed. + * - Use a large value (i.e., Z_MAX_POS) if the bed falls down, away from the nozzle. + */ +//#define Z_IDLE_HEIGHT Z_HOME_POS //#define Z_HOMING_HEIGHT 4 // (mm) Minimal Z height before homing (G28) for Z clearance above the bed, clamps, ... // Be sure to have this much clearance over your Z_MAX_POS to prevent grinding. diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 758639cfc0..d545869988 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -869,9 +869,6 @@ #define DISABLE_INACTIVE_Z true // Set 'false' if the nozzle could fall onto your printed part! #define DISABLE_INACTIVE_E true -// If the Nozzle or Bed falls when the Z stepper is disabled, set its resting position here. -//#define Z_AFTER_DEACTIVATE Z_HOME_POS - // Default Minimum Feedrates for printing and travel moves #define DEFAULT_MINIMUMFEEDRATE 0.0 // (mm/s) Minimum feedrate. Set with M205 S. #define DEFAULT_MINTRAVELFEEDRATE 0.0 // (mm/s) Minimum travel feedrate. Set with M205 T. diff --git a/Marlin/src/gcode/calibrate/G28.cpp b/Marlin/src/gcode/calibrate/G28.cpp index 12f85f7054..c26340f1ab 100644 --- a/Marlin/src/gcode/calibrate/G28.cpp +++ b/Marlin/src/gcode/calibrate/G28.cpp @@ -326,14 +326,12 @@ void GcodeSuite::G28() { #endif - const float z_homing_height = TERN1(UNKNOWN_Z_NO_RAISE, axis_is_trusted(Z_AXIS)) - ? (parser.seenval('R') ? parser.value_linear_units() : Z_HOMING_HEIGHT) - : 0; + const float z_homing_height = parser.seenval('R') ? parser.value_linear_units() : Z_HOMING_HEIGHT; if (z_homing_height && (doX || doY || TERN0(Z_SAFE_HOMING, doZ))) { // Raise Z before homing any other axes and z is not already high enough (never lower z) if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Raise Z (before homing) by ", z_homing_height); - do_z_clearance(z_homing_height, axis_is_trusted(Z_AXIS), DISABLED(UNKNOWN_Z_NO_RAISE)); + do_z_clearance(z_homing_height); } #if ENABLED(QUICK_HOME) diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index d6d2a600a0..210848d80b 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -539,6 +539,10 @@ #endif #elif defined(ASSISTED_TRAMMING_MENU_ITEM) #error "ASSISTED_TRAMMING_MENU_ITEM is deprecated and should be removed." +#elif defined(UNKNOWN_Z_NO_RAISE) + #error "UNKNOWN_Z_NO_RAISE is replaced by setting Z_IDLE_HEIGHT to Z_MAX_POS." +#elif defined(Z_AFTER_DEACTIVATE) + #error "Z_AFTER_DEACTIVATE is replaced by Z_IDLE_HEIGHT." #endif /** diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index e2613b0185..3e79e7dabf 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -83,7 +83,13 @@ bool relative_mode; // = false; * Used by 'line_to_current_position' to do a move after changing it. * Used by 'sync_plan_position' to update 'planner.position'. */ -xyze_pos_t current_position = { X_HOME_POS, Y_HOME_POS, Z_HOME_POS }; +xyze_pos_t current_position = { X_HOME_POS, Y_HOME_POS, + #ifdef Z_IDLE_HEIGHT + Z_IDLE_HEIGHT + #else + Z_HOME_POS + #endif +}; /** * Cartesian Destination @@ -494,9 +500,8 @@ void do_blocking_move_to_xy_z(const xy_pos_t &raw, const float &z, const feedRat do_blocking_move_to(raw.x, raw.y, z, fr_mm_s); } -void do_z_clearance(const float &zclear, const bool z_trusted/*=true*/, const bool raise_on_untrusted/*=true*/, const bool lower_allowed/*=false*/) { - const bool rel = raise_on_untrusted && !z_trusted; - float zdest = zclear + (rel ? current_position.z : 0.0f); +void do_z_clearance(const float &zclear, const bool lower_allowed/*=false*/) { + float zdest = zclear; if (!lower_allowed) NOLESS(zdest, current_position.z); do_blocking_move_to_z(_MIN(zdest, Z_MAX_POS), TERN(HAS_BED_PROBE, z_probe_fast_mm_s, homing_feedrate(Z_AXIS))); } diff --git a/Marlin/src/module/motion.h b/Marlin/src/module/motion.h index 2a23636d71..c8fb2c639b 100644 --- a/Marlin/src/module/motion.h +++ b/Marlin/src/module/motion.h @@ -278,7 +278,7 @@ void remember_feedrate_and_scaling(); void remember_feedrate_scaling_off(); void restore_feedrate_and_scaling(); -void do_z_clearance(const float &zclear, const bool z_trusted=true, const bool raise_on_untrusted=true, const bool lower_allowed=false); +void do_z_clearance(const float &zclear, const bool lower_allowed=false); /** * Homing and Trusted Axes diff --git a/Marlin/src/module/probe.cpp b/Marlin/src/module/probe.cpp index e59e514a06..d29123bf4d 100644 --- a/Marlin/src/module/probe.cpp +++ b/Marlin/src/module/probe.cpp @@ -401,14 +401,7 @@ bool Probe::set_deployed(const bool deploy) { constexpr bool z_raise_wanted = true; #endif - // For beds that fall when Z is powered off only raise for trusted Z - #if ENABLED(UNKNOWN_Z_NO_RAISE) - const bool z_is_trusted = axis_is_trusted(Z_AXIS); - #else - constexpr float z_is_trusted = true; - #endif - - if (z_is_trusted && z_raise_wanted) + if (z_raise_wanted) do_z_raise(_MAX(Z_CLEARANCE_BETWEEN_PROBES, Z_CLEARANCE_DEPLOY_PROBE)); #if EITHER(Z_PROBE_SLED, Z_PROBE_ALLEN_KEY) diff --git a/Marlin/src/module/probe.h b/Marlin/src/module/probe.h index 6b3d990859..df7bdd23a1 100644 --- a/Marlin/src/module/probe.h +++ b/Marlin/src/module/probe.h @@ -100,7 +100,7 @@ public: static void move_z_after_probing() { #ifdef Z_AFTER_PROBING - do_z_clearance(Z_AFTER_PROBING, true, true, true); // Move down still permitted + do_z_clearance(Z_AFTER_PROBING, true); // Move down still permitted #endif } static float probe_at_point(const float &rx, const float &ry, const ProbePtRaise raise_after=PROBE_PT_NONE, const uint8_t verbose_level=0, const bool probe_relative=true, const bool sanity_check=true); @@ -120,7 +120,7 @@ public: static void move_z_after_homing() { #ifdef Z_AFTER_HOMING - do_z_clearance(Z_AFTER_HOMING, true, true, true); + do_z_clearance(Z_AFTER_HOMING, true); #elif BOTH(Z_AFTER_PROBING, HAS_BED_PROBE) move_z_after_probing(); #endif diff --git a/Marlin/src/module/stepper/indirection.h b/Marlin/src/module/stepper/indirection.h index 4346e9d6cc..e72d793ca6 100644 --- a/Marlin/src/module/stepper/indirection.h +++ b/Marlin/src/module/stepper/indirection.h @@ -862,8 +862,8 @@ void reset_stepper_drivers(); // Called by settings.load / settings.reset #define ENABLE_AXIS_Z() if (SHOULD_ENABLE(z)) { ENABLE_STEPPER_Z(); ENABLE_STEPPER_Z2(); ENABLE_STEPPER_Z3(); ENABLE_STEPPER_Z4(); AFTER_CHANGE(z, true); } #define DISABLE_AXIS_Z() if (SHOULD_DISABLE(z)) { DISABLE_STEPPER_Z(); DISABLE_STEPPER_Z2(); DISABLE_STEPPER_Z3(); DISABLE_STEPPER_Z4(); AFTER_CHANGE(z, false); set_axis_untrusted(Z_AXIS); Z_RESET(); } -#ifdef Z_AFTER_DEACTIVATE - #define Z_RESET() do{ current_position.z = Z_AFTER_DEACTIVATE; sync_plan_position(); }while(0) +#ifdef Z_IDLE_HEIGHT + #define Z_RESET() do{ current_position.z = Z_IDLE_HEIGHT; sync_plan_position(); }while(0) #else #define Z_RESET() #endif diff --git a/buildroot/tests/STM32F103RC_btt-tests b/buildroot/tests/STM32F103RC_btt-tests index 0084f59a0c..f500b76315 100755 --- a/buildroot/tests/STM32F103RC_btt-tests +++ b/buildroot/tests/STM32F103RC_btt-tests @@ -17,7 +17,7 @@ opt_set X_DRIVER_TYPE TMC2209 opt_set Y_DRIVER_TYPE TMC2209 opt_set Z_DRIVER_TYPE TMC2209 opt_set E0_DRIVER_TYPE TMC2209 -opt_enable PINS_DEBUGGING +opt_enable PINS_DEBUGGING Z_IDLE_HEIGHT exec_test $1 $2 "BigTreeTech SKR Mini E3 1.0 - Basic Config with TMC2209 HW Serial" "$3" From f7d9305786927a1d95903464af3480fd64049034 Mon Sep 17 00:00:00 2001 From: Vi B-P Date: Thu, 25 Feb 2021 11:23:17 -0500 Subject: [PATCH 032/253] Preheat Menu shortcut option (#20350) --- Marlin/Configuration_adv.h | 3 +++ Marlin/src/inc/Conditionals_post.h | 4 ++++ Marlin/src/lcd/menu/menu_main.cpp | 8 ++++++++ Marlin/src/lcd/menu/menu_temperature.cpp | 22 +++++++++++++++++++++- 4 files changed, 36 insertions(+), 1 deletion(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index d545869988..0431b002f3 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1147,6 +1147,9 @@ #endif #endif + // Insert a menu for preheating at the top level to allow for quick access + //#define PREHEAT_SHORTCUT_MENU_ITEM + #endif // HAS_LCD_MENU #if HAS_DISPLAY diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index 585d48de8c..6de98e2a0e 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -2380,6 +2380,10 @@ #endif #endif +#if !PREHEAT_COUNT + #undef PREHEAT_SHORTCUT_MENU_ITEM +#endif + /** * Up to 3 PWM fans */ diff --git a/Marlin/src/lcd/menu/menu_main.cpp b/Marlin/src/lcd/menu/menu_main.cpp index 878ac83a5a..1e864e35be 100644 --- a/Marlin/src/lcd/menu/menu_main.cpp +++ b/Marlin/src/lcd/menu/menu_main.cpp @@ -97,6 +97,10 @@ void menu_configuration(); void menu_spindle_laser(); #endif +#if ENABLED(PREHEAT_SHORTCUT_MENU_ITEM) + void menu_preheat_only(); +#endif + #if HAS_MULTI_LANGUAGE void menu_language(); #endif @@ -177,6 +181,10 @@ void menu_main() { ACTION_ITEM(MSG_HOST_START_PRINT, host_action_start); #endif + #if ENABLED(PREHEAT_SHORTCUT_MENU_ITEM) + SUBMENU(MSG_PREHEAT_CUSTOM, menu_preheat_only); + #endif + SUBMENU(MSG_MOTION, menu_motion); } diff --git a/Marlin/src/lcd/menu/menu_temperature.cpp b/Marlin/src/lcd/menu/menu_temperature.cpp index 01c1f8f547..f347efe6db 100644 --- a/Marlin/src/lcd/menu/menu_temperature.cpp +++ b/Marlin/src/lcd/menu/menu_temperature.cpp @@ -226,7 +226,7 @@ void menu_temperature() { #if PREHEAT_COUNT // - // Preheat for Materials 1 to 5 + // Preheat for all Materials // LOOP_L_N(m, PREHEAT_COUNT) { editable.int8 = m; @@ -249,4 +249,24 @@ void menu_temperature() { END_MENU(); } +#if ENABLED(PREHEAT_SHORTCUT_MENU_ITEM) + + void menu_preheat_only() { + START_MENU(); + BACK_ITEM(MSG_MAIN); + + LOOP_L_N(m, PREHEAT_COUNT) { + editable.int8 = m; + #if HOTENDS > 1 || HAS_HEATED_BED + SUBMENU_S(ui.get_preheat_label(m), MSG_PREHEAT_M, menu_preheat_m); + #else + ACTION_ITEM_S(ui.get_preheat_label(m), MSG_PREHEAT_M, do_preheat_end_m); + #endif + } + + END_MENU(); + } + +#endif + #endif // HAS_LCD_MENU && HAS_TEMPERATURE From fd77251fdd3aed6d44f8fb0e3424d5237bc8e2d9 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 25 Feb 2021 10:24:58 -0600 Subject: [PATCH 033/253] Chamber followup --- Marlin/Configuration_adv.h | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 0431b002f3..2846f9a675 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -151,12 +151,9 @@ #endif #if TEMP_SENSOR_CHAMBER - // Make sure you define where your heater is connected, the following works on a BTT SKR 1.4 Turbo - // using the secondary tool heater output. (FAN1 by default). - //#define FAN1_PIN -1 // Remove the fan signal on pin P2_04 (SKR 1.4 Turbo specific) - //#define HEATER_CHAMBER_PIN P2_04 // Chamber heater on/off pin (HE1 connector on SKR 1.4 Turbo) - + //#define HEATER_CHAMBER_PIN P2_04 // Required heater on/off pin (example: SKR 1.4 Turbo HE1 plug) //#define HEATER_CHAMBER_INVERTING false + //#define FAN1_PIN -1 // Remove the fan signal on pin P2_04 (example: SKR 1.4 Turbo HE1 plug) //#define CHAMBER_FAN // Enable a fan on the chamber #if ENABLED(CHAMBER_FAN) From ccf990a0d79869d7d0fef9bc667f04b691771b7e Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Fri, 26 Feb 2021 00:12:56 +0000 Subject: [PATCH 034/253] [cron] Bump distribution date (2021-02-26) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 52a2c8790c..d6ceaf2e03 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2021-02-25" + #define STRING_DISTRIBUTION_DATE "2021-02-26" #endif /** From ec42be346d5c0d072feb8a1b63ef2fdbd6dc1e98 Mon Sep 17 00:00:00 2001 From: X-Ryl669 Date: Fri, 26 Feb 2021 23:54:46 +0100 Subject: [PATCH 035/253] Fix and improve G-code queue (#21122) Co-authored-by: Scott Lahteine --- Marlin/Configuration_adv.h | 6 + Marlin/src/MarlinCore.cpp | 2 +- Marlin/src/core/bug_on.h | 37 ++ Marlin/src/core/language.h | 1 + Marlin/src/core/macros.h | 25 ++ Marlin/src/core/serial.cpp | 4 + Marlin/src/core/serial.h | 17 +- Marlin/src/feature/meatpack.cpp | 10 +- Marlin/src/feature/meatpack.h | 59 ++- Marlin/src/gcode/calibrate/M100.cpp | 78 ++-- Marlin/src/gcode/gcode.cpp | 27 +- Marlin/src/gcode/host/M110.cpp | 2 +- Marlin/src/gcode/host/M118.cpp | 4 +- Marlin/src/gcode/queue.cpp | 366 ++++++++---------- Marlin/src/gcode/queue.h | 99 +++-- .../lcd/extui/lib/mks_ui/draw_keyboard.cpp | 2 +- .../lcd/extui/lib/mks_ui/draw_manuaLevel.cpp | 2 +- .../lcd/extui/lib/mks_ui/draw_move_motor.cpp | 2 +- .../src/lcd/extui/lib/mks_ui/wifi_module.cpp | 4 +- docs/Queue.md | 59 +++ 20 files changed, 498 insertions(+), 308 deletions(-) create mode 100644 Marlin/src/core/bug_on.h create mode 100644 docs/Queue.md diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 2846f9a675..0cb78731eb 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -2016,6 +2016,12 @@ //#define SERIAL_STATS_DROPPED_RX #endif +// Monitor RX buffer usage +// Dump an error to the serial port if the serial receive buffer overflows. +// If you see these errors, increase the RX_BUFFER_SIZE value. +// Not supported on all platforms. +//#define RX_BUFFER_MONITOR + /** * Emergency Command Parser * diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index d523882d41..ad99a06eff 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -407,7 +407,7 @@ void startOrResumeJob() { */ inline void manage_inactivity(const bool ignore_stepper_queue=false) { - if (queue.length < BUFSIZE) queue.get_available_commands(); + queue.get_available_commands(); const millis_t ms = millis(); diff --git a/Marlin/src/core/bug_on.h b/Marlin/src/core/bug_on.h new file mode 100644 index 0000000000..8869be8d28 --- /dev/null +++ b/Marlin/src/core/bug_on.h @@ -0,0 +1,37 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * + * Copyright (c) 2021 X-Ryl669 [https://blog.cyril.by] + * + * 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 + +// We need SERIAL_ECHOPAIR and macros.h +#include "serial.h" + +#if ENABLED(POSTMORTEM_DEBUGGING) + // Useful macro for stopping the CPU on an unexpected condition + // This is used like SERIAL_ECHOPAIR, that is: a key-value call of the local variables you want + // to dump to the serial port before stopping the CPU. + #define BUG_ON(V...) do { SERIAL_ECHOPAIR(ONLY_FILENAME, __LINE__, ": "); SERIAL_ECHOLNPAIR(V); SERIAL_FLUSHTX(); *(char*)0 = 42; } while(0) +#elif ENABLED(MARLIN_DEV_MODE) + // Don't stop the CPU here, but at least dump the bug on the serial port + #define BUG_ON(V...) do { SERIAL_ECHOPAIR(ONLY_FILENAME, __LINE__, ": BUG!\n"); SERIAL_ECHOLNPAIR(V); SERIAL_FLUSHTX(); } while(0) +#else + // Release mode, let's ignore the bug + #define BUG_ON(V...) NOOP +#endif diff --git a/Marlin/src/core/language.h b/Marlin/src/core/language.h index 6024e9be3e..c9c3fd0153 100644 --- a/Marlin/src/core/language.h +++ b/Marlin/src/core/language.h @@ -131,6 +131,7 @@ #define STR_WATCHDOG_FIRED "Watchdog timeout. Reset required." #define STR_ERR_KILLED "Printer halted. kill() called!" #define STR_ERR_STOPPED "Printer stopped due to errors. Fix the error and use M999 to restart. (Temperature is reset. Set it after restarting)" +#define STR_ERR_SERIAL_MISMATCH "Serial status mismatch" #define STR_BUSY_PROCESSING "busy: processing" #define STR_BUSY_PAUSED_FOR_USER "busy: paused for user" #define STR_BUSY_PAUSED_FOR_INPUT "busy: paused for input" diff --git a/Marlin/src/core/macros.h b/Marlin/src/core/macros.h index 16e18ac902..9b07af3618 100644 --- a/Marlin/src/core/macros.h +++ b/Marlin/src/core/macros.h @@ -349,6 +349,31 @@ #define CALL_IF_EXISTS(Return, That, Method, ...) \ static_cast(Private::Call_ ## Method(That, ##__VA_ARGS__)) + // Compile-time string manipulation + namespace CompileTimeString { + // Simple compile-time parser to find the position of the end of a string + constexpr const char* findStringEnd(const char *str) { + return *str ? findStringEnd(str + 1) : str; + } + + // Check whether a string contains a slash + constexpr bool containsSlash(const char *str) { + return *str == '/' ? true : (*str ? containsSlash(str + 1) : false); + } + // Find the last position of the slash + constexpr const char* findLastSlashPos(const char* str) { + return *str == '/' ? (str + 1) : findLastSlashPos(str - 1); + } + // Compile-time evaluation of the last part of a file path + // Typically used to shorten the path to file in compiled strings + // CompileTimeString::baseName(__FILE__) returns "macros.h" and not /path/to/Marlin/src/core/macros.h + constexpr const char* baseName(const char* str) { + return containsSlash(str) ? findLastSlashPos(findStringEnd(str)) : str; + } + } + + #define ONLY_FILENAME CompileTimeString::baseName(__FILE__) + #else #define MIN_2(a,b) ((a)<(b)?(a):(b)) diff --git a/Marlin/src/core/serial.cpp b/Marlin/src/core/serial.cpp index 31f6d67e32..01f850ba56 100644 --- a/Marlin/src/core/serial.cpp +++ b/Marlin/src/core/serial.cpp @@ -52,6 +52,10 @@ PGMSTR(SP_X_LBL, " X:"); PGMSTR(SP_Y_LBL, " Y:"); PGMSTR(SP_Z_LBL, " Z:"); PGMST #endif #endif +#if ENABLED(MEATPACK) + MeatpackSerial mpSerial(false, _SERIAL_IMPL); +#endif + void serialprintPGM(PGM_P str) { while (const char c = pgm_read_byte(str++)) SERIAL_CHAR(c); } diff --git a/Marlin/src/core/serial.h b/Marlin/src/core/serial.h index f5c02f50b6..ec955a8dea 100644 --- a/Marlin/src/core/serial.h +++ b/Marlin/src/core/serial.h @@ -24,6 +24,10 @@ #include "../inc/MarlinConfig.h" #include "serial_hook.h" +#if ENABLED(MEATPACK) + #include "../feature/meatpack.h" +#endif + // Commonly-used strings in serial output extern const char NUL_STR[], SP_P_STR[], SP_T_STR[], X_STR[], Y_STR[], Z_STR[], E_STR[], @@ -69,12 +73,19 @@ extern uint8_t marlin_debug_flags; typedef MultiSerial, decltype(MYSERIAL1)), 0> SerialOutputT; #endif extern SerialOutputT multiSerial; - #define SERIAL_IMPL multiSerial + #define _SERIAL_IMPL multiSerial #else #define _PORT_REDIRECT(n,p) NOOP #define _PORT_RESTORE(n) NOOP #define SERIAL_ASSERT(P) NOOP - #define SERIAL_IMPL MYSERIAL0 + #define _SERIAL_IMPL MYSERIAL0 +#endif + +#if ENABLED(MEATPACK) + extern MeatpackSerial mpSerial; + #define SERIAL_IMPL mpSerial +#else + #define SERIAL_IMPL _SERIAL_IMPL #endif #define SERIAL_OUT(WHAT, V...) (void)SERIAL_IMPL.WHAT(V) @@ -294,7 +305,7 @@ void serialprintPGM(PGM_P str); #endif #define SERIAL_ECHOPGM_P(P) (serialprintPGM(P)) -#define SERIAL_ECHOLNPGM_P(P) (serialprintPGM(P "\n")) +#define SERIAL_ECHOLNPGM_P(P) do{ serialprintPGM(P); SERIAL_EOL(); }while(0) #define SERIAL_ECHOPGM(S) (serialprintPGM(PSTR(S))) #define SERIAL_ECHOLNPGM(S) (serialprintPGM(PSTR(S "\n"))) diff --git a/Marlin/src/feature/meatpack.cpp b/Marlin/src/feature/meatpack.cpp index cd6d8ce6b9..cb3979ea0a 100644 --- a/Marlin/src/feature/meatpack.cpp +++ b/Marlin/src/feature/meatpack.cpp @@ -110,7 +110,7 @@ void MeatPack::handle_rx_char_inner(const uint8_t c) { if (TEST(state, MPConfig_Bit_Active)) { // Is MeatPack active? if (!full_char_count) { // No literal characters to fetch? uint8_t buf[2] = { 0, 0 }; - register const uint8_t res = unpack_chars(c, buf); // Decode the byte into one or two characters. + const uint8_t res = unpack_chars(c, buf); // Decode the byte into one or two characters. if (res & kFirstCharIsLiteral) { // The 1st character couldn't be packed. ++full_char_count; // So the next stream byte is a full character. if (res & kSecondCharIsLiteral) ++full_char_count; // The 2nd character couldn't be packed. Another stream byte is a full character. @@ -147,9 +147,7 @@ void MeatPack::handle_output_char(const uint8_t c) { #if ENABLED(MP_DEBUG) if (chars_decoded < 1024) { ++chars_decoded; - DEBUG_ECHOPGM("RB: "); - MYSERIAL.print((char)c); - DEBUG_EOL(); + DEBUG_ECHOLNPAIR("RB: ", AS_CHAR(c)); } #endif } @@ -200,7 +198,7 @@ void MeatPack::handle_rx_char(const uint8_t c, const serial_index_t serial_ind) } if (cmd_is_next) { // Were two command bytes received? - PORT_REDIRECT(serial_ind); + PORT_REDIRECT(SERIAL_PORTMASK(serial_ind)); handle_command((MeatPack_Command)c); // Then the byte is a MeatPack command cmd_is_next = false; return; @@ -219,7 +217,7 @@ uint8_t MeatPack::get_result_char(char* const __restrict out) { if (char_out_count) { res = char_out_count; char_out_count = 0; - for (register uint8_t i = 0; i < res; ++i) + for (uint8_t i = 0; i < res; ++i) out[i] = (char)char_out_buf[i]; } return res; diff --git a/Marlin/src/feature/meatpack.h b/Marlin/src/feature/meatpack.h index 2641130bd8..e30a5ac979 100644 --- a/Marlin/src/feature/meatpack.h +++ b/Marlin/src/feature/meatpack.h @@ -49,6 +49,7 @@ #pragma once #include +#include "../core/serial_hook.h" /** * Commands sent to MeatPack to control its behavior. @@ -78,8 +79,6 @@ enum MeatPack_ConfigStateBits : uint8_t { }; class MeatPack { -private: - friend class GCodeQueue; // Utility definitions static const uint8_t kCommandByte = 0b11111111, @@ -99,6 +98,7 @@ private: char_out_count; // Stores number of characters to be read out. static uint8_t char_out_buf[2]; // Output buffer for caching up to 2 characters +public: // Pass in a character rx'd by SD card or serial. Automatically parses command/ctrl sequences, // and will control state internally. static void handle_rx_char(const uint8_t c, const serial_index_t serial_ind); @@ -113,7 +113,6 @@ private: static void reset_state(); static void report_state(); - static uint8_t unpacked_char(register const uint8_t in); static uint8_t unpack_chars(const uint8_t pk, uint8_t* __restrict const chars_out); static void handle_command(const MeatPack_Command c); static void handle_output_char(const uint8_t c); @@ -121,3 +120,57 @@ private: }; extern MeatPack meatpack; + +// Implement the MeatPack serial class so it's transparent to rest of the code +template +struct MeatpackSerial : public SerialBase > { + typedef SerialBase< MeatpackSerial > BaseClassT; + + SerialT & out; + + char serialBuffer[2]; + uint8_t charCount; + uint8_t readIndex; + + NO_INLINE size_t write(uint8_t c) { return out.write(c); } + void flush() { out.flush(); } + void begin(long br) { out.begin(br); readIndex = 0; } + void end() { out.end(); } + + void msgDone() { out.msgDone(); } + // Existing instances implement Arduino's operator bool, so use that if it's available + bool connected() { return Private::HasMember_connected::value ? CALL_IF_EXISTS(bool, &out, connected) : (bool)out; } + void flushTX() { CALL_IF_EXISTS(void, &out, flushTX); } + + int available(uint8_t index) { + // There is a potential issue here with multiserial, since it'll return its decoded buffer whatever the serial index here. + // So, instead of doing MeatpackSerial> we should do MultiSerial, MeatpackSerial<...>> + // TODO, let's fix this later on + + if (charCount) return charCount; // The buffer still has data + if (out.available(index) <= 0) return 0; // No data to read + + // Don't read in read method, instead do it here, so we can make progress in the read method + const int r = out.read(index); + if (r == -1) return 0; // This is an error from the underlying serial code + meatpack.handle_rx_char((uint8_t)r, index); + charCount = meatpack.get_result_char(serialBuffer); + readIndex = 0; + + return charCount; + } + + int readImpl(const uint8_t index) { + // Not enough char to make progress? + if (charCount == 0 && available(index) == 0) return -1; + + charCount--; + return serialBuffer[readIndex++]; + } + + int read(uint8_t index) { return readImpl(index); } + int available() { return available(0); } + int read() { return readImpl(0); } + + MeatpackSerial(const bool e, SerialT & out) : BaseClassT(e), out(out) {} +}; diff --git a/Marlin/src/gcode/calibrate/M100.cpp b/Marlin/src/gcode/calibrate/M100.cpp index 9ac2380e79..ee572e033d 100644 --- a/Marlin/src/gcode/calibrate/M100.cpp +++ b/Marlin/src/gcode/calibrate/M100.cpp @@ -51,7 +51,7 @@ * Also, there are two support functions that can be called from a developer's C code. * * uint16_t check_for_free_memory_corruption(PGM_P const free_memory_start); - * void M100_dump_routine(PGM_P const title, const char * const start, const char * const end); + * void M100_dump_routine(PGM_P const title, const char * const start, const uintptr_t size); * * Initial version by Roxy-3D */ @@ -151,7 +151,7 @@ inline int32_t count_test_bytes(const char * const start_free_memory) { * the block. If so, it may indicate memory corruption due to a bad pointer. * Unexpected bytes are flagged in the right column. */ - inline void dump_free_memory(char *start_free_memory, char *end_free_memory) { + void dump_free_memory(char *start_free_memory, char *end_free_memory) { // // Start and end the dump on a nice 16 byte boundary // (even though the values are not 16-byte aligned). @@ -182,12 +182,12 @@ inline int32_t count_test_bytes(const char * const start_free_memory) { } } - void M100_dump_routine(PGM_P const title, const char * const start, const char * const end) { - serialprintPGM(title); - SERIAL_EOL(); + void M100_dump_routine(PGM_P const title, const char * const start, const uintptr_t size) { + SERIAL_ECHOLNPGM_P(title); // // Round the start and end locations to produce full lines of output // + const char * const end = start + size - 1; dump_free_memory( (char*)(uintptr_t(uint32_t(start) & ~0xFUL)), // Align to 16-byte boundary (char*)(uintptr_t(uint32_t(end) | 0xFUL)) // Align end_free_memory to the 15th byte (at or above end_free_memory) @@ -197,27 +197,27 @@ inline int32_t count_test_bytes(const char * const start_free_memory) { #endif // M100_FREE_MEMORY_DUMPER inline int check_for_free_memory_corruption(PGM_P const title) { - serialprintPGM(title); + SERIAL_ECHOPGM_P(title); char *start_free_memory = free_memory_start, *end_free_memory = free_memory_end; int n = end_free_memory - start_free_memory; - SERIAL_ECHOPAIR("\nfmc() n=", n); - SERIAL_ECHOPAIR("\nfree_memory_start=", hex_address(free_memory_start)); - SERIAL_ECHOLNPAIR(" end_free_memory=", hex_address(end_free_memory)); + SERIAL_ECHOLNPAIR("\nfmc() n=", n, + "\nfree_memory_start=", hex_address(free_memory_start), + " end=", hex_address(end_free_memory)); if (end_free_memory < start_free_memory) { SERIAL_ECHOPGM(" end_free_memory < Heap "); - // SET_INPUT_PULLUP(63); // if the developer has a switch wired up to their controller board - // safe_delay(5); // this code can be enabled to pause the display as soon as the - // while ( READ(63)) // malfunction is detected. It is currently defaulting to a switch - // idle(); // being on pin-63 which is unassigend and available on most controller - // safe_delay(20); // boards. - // while ( !READ(63)) - // idle(); + //SET_INPUT_PULLUP(63); // if the developer has a switch wired up to their controller board + //safe_delay(5); // this code can be enabled to pause the display as soon as the + //while ( READ(63)) // malfunction is detected. It is currently defaulting to a switch + // idle(); // being on pin-63 which is unassigend and available on most controller + //safe_delay(20); // boards. + //while ( !READ(63)) + // idle(); serial_delay(20); #if ENABLED(M100_FREE_MEMORY_DUMPER) - M100_dump_routine(PSTR(" Memory corruption detected with end_free_memory 8) { - // SERIAL_ECHOPAIR("Found ", j); - // SERIAL_ECHOLNPAIR(" bytes free at ", hex_address(start_free_memory + i)); + //SERIAL_ECHOPAIR("Found ", j); + //SERIAL_ECHOLNPAIR(" bytes free at ", hex_address(start_free_memory + i)); i += j; block_cnt++; - SERIAL_ECHOPAIR(" (", block_cnt); - SERIAL_ECHOPAIR(") found=", j); - SERIAL_ECHOLNPGM(" "); + SERIAL_ECHOLNPAIR(" (", block_cnt, ") found=", j); } } } @@ -269,8 +267,7 @@ inline void free_memory_pool_report(char * const start_free_memory, const int32_ if (*addr == TEST_BYTE) { const int32_t j = count_test_bytes(addr); if (j > 8) { - SERIAL_ECHOPAIR("Found ", j); - SERIAL_ECHOLNPAIR(" bytes free at ", hex_address(addr)); + SERIAL_ECHOLNPAIR("Found ", j, " bytes free at ", hex_address(addr)); if (j > max_cnt) { max_cnt = j; max_addr = addr; @@ -280,11 +277,10 @@ inline void free_memory_pool_report(char * const start_free_memory, const int32_ } } } - if (block_cnt > 1) { - SERIAL_ECHOLNPGM("\nMemory Corruption detected in free memory area."); - SERIAL_ECHOPAIR("\nLargest free block is ", max_cnt); - SERIAL_ECHOLNPAIR(" bytes at ", hex_address(max_addr)); - } + if (block_cnt > 1) SERIAL_ECHOLNPAIR( + "\nMemory Corruption detected in free memory area." + "\nLargest free block is ", max_cnt, " bytes at ", hex_address(max_addr) + ); SERIAL_ECHOLNPAIR("check_for_free_memory_corruption() = ", check_for_free_memory_corruption(PSTR("M100 F "))); } @@ -294,12 +290,12 @@ inline void free_memory_pool_report(char * const start_free_memory, const int32_ * Corrupt locations in the free memory pool and report the corrupt addresses. * This is useful to check the correctness of the M100 D and the M100 F commands. */ - inline void corrupt_free_memory(char *start_free_memory, const uint32_t size) { + inline void corrupt_free_memory(char *start_free_memory, const uintptr_t size) { start_free_memory += 8; const uint32_t near_top = top_of_stack() - start_free_memory - 250, // -250 to avoid interrupt activity that's altered the stack. j = near_top / (size + 1); - SERIAL_ECHOLNPGM("Corrupting free memory block.\n"); + SERIAL_ECHOLNPGM("Corrupting free memory block."); for (uint32_t i = 1; i <= size; i++) { char * const addr = start_free_memory + i * j; *addr = i; @@ -322,8 +318,8 @@ inline void init_free_memory(char *start_free_memory, int32_t size) { return; } - start_free_memory += 8; // move a few bytes away from the heap just because we don't want - // to be altering memory that close to it. + start_free_memory += 8; // move a few bytes away from the heap just because we + // don't want to be altering memory that close to it. memset(start_free_memory, TEST_BYTE, size); SERIAL_ECHO(size); @@ -342,16 +338,16 @@ inline void init_free_memory(char *start_free_memory, int32_t size) { * M100: Free Memory Check */ void GcodeSuite::M100() { - char *sp = top_of_stack(); if (!free_memory_end) free_memory_end = sp - MEMORY_END_CORRECTION; - SERIAL_ECHOPAIR("\nbss_end : ", hex_address(end_bss)); - if (heaplimit) SERIAL_ECHOPAIR("\n__heaplimit : ", hex_address(heaplimit)); - SERIAL_ECHOPAIR("\nfree_memory_start : ", hex_address(free_memory_start)); + SERIAL_ECHOPAIR("\nbss_end : ", hex_address(end_bss)); + if (heaplimit) SERIAL_ECHOPAIR("\n__heaplimit : ", hex_address(heaplimit)); + SERIAL_ECHOPAIR("\nfree_memory_start : ", hex_address(free_memory_start)); if (stacklimit) SERIAL_ECHOPAIR("\n__stacklimit : ", hex_address(stacklimit)); - SERIAL_ECHOPAIR("\nfree_memory_end : ", hex_address(free_memory_end)); - if (MEMORY_END_CORRECTION) SERIAL_ECHOPAIR("\nMEMORY_END_CORRECTION: ", MEMORY_END_CORRECTION); - SERIAL_ECHOLNPAIR("\nStack Pointer : ", hex_address(sp)); + SERIAL_ECHOPAIR("\nfree_memory_end : ", hex_address(free_memory_end)); + if (MEMORY_END_CORRECTION) + SERIAL_ECHOPAIR("\nMEMORY_END_CORRECTION : ", MEMORY_END_CORRECTION); + SERIAL_ECHOLNPAIR("\nStack Pointer : ", hex_address(sp)); // Always init on the first invocation of M100 static bool m100_not_initialized = true; @@ -369,10 +365,8 @@ void GcodeSuite::M100() { return free_memory_pool_report(free_memory_start, free_memory_end - free_memory_start); #if ENABLED(M100_FREE_MEMORY_CORRUPTOR) - if (parser.seen('C')) return corrupt_free_memory(free_memory_start, parser.value_int()); - #endif } diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index a410ad90a4..d7535dd4ff 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -260,13 +260,6 @@ void GcodeSuite::dwell(millis_t time) { #endif // HAS_LEVELING && G29_RETRY_AND_RECOVER -// -// Placeholders for non-migrated codes -// -#if ENABLED(M100_FREE_MEMORY_WATCHER) - extern void M100_dump_routine(PGM_P const title, const char * const start, const char * const end); -#endif - /** * Process the parsed command and dispatch it to its handler */ @@ -994,30 +987,32 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { SERIAL_OUT(msgDone); // Call the msgDone serial hook to signal command processing done } +#if ENABLED(M100_FREE_MEMORY_DUMPER) + void M100_dump_routine(PGM_P const title, const char * const start, const uintptr_t size); +#endif + /** * Process a single command and dispatch it to its handler * This is called from the main loop() */ void GcodeSuite::process_next_command() { - char * const current_command = queue.command_buffer[queue.index_r]; + GCodeQueue::CommandLine &command = queue.ring_buffer.peek_next_command(); - PORT_REDIRECT(SERIAL_PORTMASK(queue.port[queue.index_r])); + PORT_REDIRECT(SERIAL_PORTMASK(command.port)); - #if ENABLED(POWER_LOSS_RECOVERY) - recovery.queue_index_r = queue.index_r; - #endif + TERN_(POWER_LOSS_RECOVERY, recovery.queue_index_r = queue.ring_buffer.index_r); if (DEBUGGING(ECHO)) { SERIAL_ECHO_START(); - SERIAL_ECHOLN(current_command); + SERIAL_ECHOLN(command.buffer); #if ENABLED(M100_FREE_MEMORY_DUMPER) - SERIAL_ECHOPAIR("slot:", queue.index_r); - M100_dump_routine(PSTR(" Command Queue:"), &queue.command_buffer[0][0], &queue.command_buffer[BUFSIZE - 1][MAX_CMD_SIZE - 1]); + SERIAL_ECHOPAIR("slot:", queue.ring_buffer.index_r); + M100_dump_routine(PSTR(" Command Queue:"), (const char*)&queue.ring_buffer, sizeof(queue.ring_buffer)); #endif } // Parse the next command in the queue - parser.parse(current_command); + parser.parse(command.buffer); process_parsed_command(); } diff --git a/Marlin/src/gcode/host/M110.cpp b/Marlin/src/gcode/host/M110.cpp index b12b38ea0f..2634b19897 100644 --- a/Marlin/src/gcode/host/M110.cpp +++ b/Marlin/src/gcode/host/M110.cpp @@ -29,6 +29,6 @@ void GcodeSuite::M110() { if (parser.seenval('N')) - queue.last_N[queue.command_port()] = parser.value_long(); + queue.set_current_line_number(parser.value_long()); } diff --git a/Marlin/src/gcode/host/M118.cpp b/Marlin/src/gcode/host/M118.cpp index ef3c293742..9982492f93 100644 --- a/Marlin/src/gcode/host/M118.cpp +++ b/Marlin/src/gcode/host/M118.cpp @@ -52,9 +52,7 @@ void GcodeSuite::M118() { while (*p == ' ') ++p; } - #if HAS_MULTI_SERIAL - PORT_REDIRECT(WITHIN(port, 0, NUM_SERIAL) ? (port ? _BV(port - 1) : SERIAL_ALL) : multiSerial.portMask); - #endif + PORT_REDIRECT(WITHIN(port, 0, NUM_SERIAL) ? (port ? SERIAL_PORTMASK(port - 1) : SERIAL_ALL) : multiSerial.portMask); if (hasE) SERIAL_ECHO_START(); if (hasA) SERIAL_ECHOPGM("//"); diff --git a/Marlin/src/gcode/queue.cpp b/Marlin/src/gcode/queue.cpp index 8c9e9afdc1..f28c0586d9 100644 --- a/Marlin/src/gcode/queue.cpp +++ b/Marlin/src/gcode/queue.cpp @@ -35,6 +35,7 @@ GCodeQueue queue; #include "../module/planner.h" #include "../module/temperature.h" #include "../MarlinCore.h" +#include "../core/bug_on.h" #if ENABLED(PRINTER_EVENT_LEDS) #include "../feature/leds/printer_event_leds.h" @@ -48,10 +49,6 @@ GCodeQueue queue; #include "../feature/binary_stream.h" #endif -#if ENABLED(MEATPACK) - #include "../feature/meatpack.h" -#endif - #if ENABLED(POWER_LOSS_RECOVERY) #include "../feature/powerloss.h" #endif @@ -67,44 +64,17 @@ PGMSTR(G28_STR, "G28"); static millis_t last_command_time = 0; #endif -/** - * GCode line number handling. Hosts may opt to include line numbers when - * sending commands to Marlin, and lines will be checked for sequentiality. - * M110 N sets the current line number. - */ -long GCodeQueue::last_N[NUM_SERIAL]; +GCodeQueue::SerialState GCodeQueue::serial_state[NUM_SERIAL] = { 0 }; +GCodeQueue::RingBuffer GCodeQueue::ring_buffer = { 0 }; -/** - * GCode Command Queue - * A simple ring buffer of BUFSIZE command strings. - * - * Commands are copied into this buffer by the command injectors - * (immediate, serial, sd card) and they are processed sequentially by - * the main loop. The gcode.process_next_command method parses the next - * command and hands off execution to individual handler functions. - */ -uint8_t GCodeQueue::length = 0, // Count of commands in the queue - GCodeQueue::index_r = 0, // Ring buffer read position - GCodeQueue::index_w = 0; // Ring buffer write position - -char GCodeQueue::command_buffer[BUFSIZE][MAX_CMD_SIZE]; - -/* - * The port that the command was received on - */ -#if HAS_MULTI_SERIAL - serial_index_t GCodeQueue::port[BUFSIZE]; +#if NO_TIMEOUTS > 0 + static millis_t last_command_time = 0; #endif /** * Serial command injection */ -// Number of characters read in the current line of serial input -static int serial_count[NUM_SERIAL] = { 0 }; - -bool send_ok[BUFSIZE]; - /** * Next Injected PROGMEM Command pointer. (nullptr == empty) * Internal commands are enqueued ahead of serial / SD commands. @@ -116,38 +86,16 @@ PGM_P GCodeQueue::injected_commands_P; // = nullptr */ char GCodeQueue::injected_commands[64]; // = { 0 } -GCodeQueue::GCodeQueue() { - // Send "ok" after commands by default - LOOP_L_N(i, COUNT(send_ok)) send_ok[i] = true; -} -/** - * Check whether there are any commands yet to be executed - */ -bool GCodeQueue::has_commands_queued() { - return queue.length || injected_commands_P || injected_commands[0]; -} - -/** - * Clear the Marlin command queue - */ -void GCodeQueue::clear() { - index_r = index_w = length = 0; -} - -/** - * Once a new command is in the ring buffer, call this to commit it - */ -void GCodeQueue::_commit_command(bool say_ok +void GCodeQueue::RingBuffer::commit_command(bool skip_ok #if HAS_MULTI_SERIAL , serial_index_t serial_ind/*=-1*/ #endif ) { - send_ok[index_w] = say_ok; - TERN_(HAS_MULTI_SERIAL, port[index_w] = serial_ind); + commands[index_w].skip_ok = skip_ok; + TERN_(HAS_MULTI_SERIAL, commands[index_w].port = serial_ind); TERN_(POWER_LOSS_RECOVERY, recovery.commit_sdpos(index_w)); - if (++index_w >= BUFSIZE) index_w = 0; - length++; + advance_pos(index_w, 1); } /** @@ -155,14 +103,14 @@ void GCodeQueue::_commit_command(bool say_ok * Return true if the command was successfully added. * Return false for a full buffer, or if the 'command' is a comment. */ -bool GCodeQueue::_enqueue(const char* cmd, bool say_ok/*=false*/ +bool GCodeQueue::RingBuffer::enqueue(const char* cmd, bool skip_ok/*=true*/ #if HAS_MULTI_SERIAL , serial_index_t serial_ind/*=-1*/ #endif ) { if (*cmd == ';' || length >= BUFSIZE) return false; - strcpy(command_buffer[index_w], cmd); - _commit_command(say_ok + strcpy(commands[index_w].buffer, cmd); + commit_command(skip_ok #if HAS_MULTI_SERIAL , serial_ind #endif @@ -175,14 +123,11 @@ bool GCodeQueue::_enqueue(const char* cmd, bool say_ok/*=false*/ * Return true if the command was consumed */ bool GCodeQueue::enqueue_one(const char* cmd) { - - //SERIAL_ECHOPGM("enqueue_one(\""); - //SERIAL_ECHO(cmd); - //SERIAL_ECHOPGM("\") \n"); + //SERIAL_ECHOLNPAIR("enqueue_one(\"", cmd, "\")"); if (*cmd == 0 || ISEOL(*cmd)) return true; - if (_enqueue(cmd)) { + if (ring_buffer.enqueue(cmd)) { SERIAL_ECHO_MSG(STR_ENQUEUEING, cmd, "\""); return true; } @@ -260,7 +205,7 @@ bool GCodeQueue::enqueue_one_P(PGM_P const pgcode) { char cmd[i + 1]; memcpy_P(cmd, p, i); cmd[i] = '\0'; - return _enqueue(cmd); + return ring_buffer.enqueue(cmd); } /** @@ -291,20 +236,21 @@ void GCodeQueue::enqueue_now_P(PGM_P const pgcode) { * P Planner space remaining * B Block queue space remaining */ -void GCodeQueue::ok_to_send() { +void GCodeQueue::RingBuffer::ok_to_send() { #if NO_TIMEOUTS > 0 // Start counting from the last command's execution last_command_time = millis(); #endif + CommandLine &command = commands[index_r]; #if HAS_MULTI_SERIAL - const serial_index_t serial_ind = command_port(); + const serial_index_t serial_ind = command.port; if (serial_ind < 0) return; PORT_REDIRECT(SERIAL_PORTMASK(serial_ind)); // Reply to the serial port that sent the command #endif - if (!send_ok[index_r]) return; + if (command.skip_ok) return; SERIAL_ECHOPGM(STR_OK); #if ENABLED(ADVANCED_OK) - char* p = command_buffer[index_r]; + char* p = command.buffer; if (*p == 'N') { SERIAL_CHAR(' ', *p++); while (NUMERIC_SIGNED(*p)) @@ -321,27 +267,40 @@ void GCodeQueue::ok_to_send() { * indicate that a command needs to be re-sent. */ void GCodeQueue::flush_and_request_resend() { - const serial_index_t serial_ind = command_port(); + const serial_index_t serial_ind = ring_buffer.command_port(); #if HAS_MULTI_SERIAL if (serial_ind < 0) return; // Never mind. Command came from SD or Flash Drive PORT_REDIRECT(SERIAL_PORTMASK(serial_ind)); // Reply to the serial port that sent the command #endif SERIAL_FLUSH(); SERIAL_ECHOPGM(STR_RESEND); - SERIAL_ECHOLN(last_N[serial_ind] + 1); - ok_to_send(); + SERIAL_ECHOLN(serial_state[serial_ind].last_N + 1); } - // Multiserial already handle the dispatch to/from multiple port by itself inline bool serial_data_available(uint8_t index = SERIAL_ALL) { if (index == SERIAL_ALL) { for (index = 0; index < NUM_SERIAL; index++) { - if (SERIAL_IMPL.available(index) > 0) return true; + const int a = SERIAL_IMPL.available(index); + #if BOTH(RX_BUFFER_MONITOR, RX_BUFFER_SIZE) + if (a > RX_BUFFER_SIZE - 2) { + PORT_REDIRECT(SERIAL_PORTMASK(index)); + SERIAL_ERROR_MSG("RX BUF overflow, increase RX_BUFFER_SIZE: ", a); + } + #endif + if (a > 0) return true; } return false; } - return SERIAL_IMPL.available(index) > 0; + const int a = SERIAL_IMPL.available(index); + #if BOTH(RX_BUFFER_MONITOR, RX_BUFFER_SIZE) + if (a > RX_BUFFER_SIZE - 2) { + PORT_REDIRECT(SERIAL_PORTMASK(index)); + SERIAL_ERROR_MSG("RX BUF overflow, increase RX_BUFFER_SIZE: ", a); + } + #endif + + return a > 0; } inline int read_serial(const uint8_t index) { return SERIAL_IMPL.read(index); } @@ -349,11 +308,11 @@ inline int read_serial(const uint8_t index) { return SERIAL_IMPL.read(index); } void GCodeQueue::gcode_line_error(PGM_P const err, const serial_index_t serial_ind) { PORT_REDIRECT(SERIAL_PORTMASK(serial_ind)); // Reply to the serial port that sent the command SERIAL_ERROR_START(); - serialprintPGM(err); - SERIAL_ECHOLN(last_N[serial_ind]); - while (read_serial(serial_ind) != -1); // Clear out the RX buffer + SERIAL_ECHOPGM_P(err); + SERIAL_ECHOLN(serial_state[serial_ind].last_N); + while (read_serial(serial_ind) != -1) { /* nada */ } // Clear out the RX buffer. Why don't use flush here ? flush_and_request_resend(); - serial_count[serial_ind] = 0; + serial_state[serial_ind].count = 0; } FORCE_INLINE bool is_M29(const char * const cmd) { // matches "M29" & "M29 ", but not "M290", etc @@ -440,10 +399,6 @@ inline bool process_line_done(uint8_t &sis, char (&buff)[MAX_CMD_SIZE], int &ind * left on the serial port. */ void GCodeQueue::get_serial_commands() { - static char serial_line_buffer[NUM_SERIAL][MAX_CMD_SIZE]; - - static uint8_t serial_input_state[NUM_SERIAL] = { PS_NORMAL }; - #if ENABLED(BINARY_FILE_TRANSFER) if (card.flag.binary_mode) { /** @@ -451,7 +406,7 @@ void GCodeQueue::get_serial_commands() { * receive buffer (which limits the packet size to MAX_CMD_SIZE). * The receive buffer also limits the packet size for reliable transmission. */ - binaryStream[card.transfer_port_index].receive(serial_line_buffer[card.transfer_port_index]); + binaryStream[card.transfer_port_index].receive(serial_state[card.transfer_port_index].line_buffer); return; } #endif @@ -460,122 +415,140 @@ void GCodeQueue::get_serial_commands() { // send "wait" to indicate Marlin is still waiting. #if NO_TIMEOUTS > 0 const millis_t ms = millis(); - if (length == 0 && !serial_data_available() && ELAPSED(ms, last_command_time + NO_TIMEOUTS)) { + if (ring_buffer.empty() && !serial_data_available() && ELAPSED(ms, last_command_time + NO_TIMEOUTS)) { SERIAL_ECHOLNPGM(STR_WAIT); last_command_time = ms; } #endif - /** - * Loop while serial characters are incoming and the queue is not full - */ - while (length < BUFSIZE && serial_data_available()) { + // Loop while serial characters are incoming and the queue is not full + for (bool hadData = true; hadData;) { + // Unless a serial port has data, this will exit on next iteration + hadData = false; + LOOP_L_N(p, NUM_SERIAL) { + // Check if the queue is full and exit if it is. + if (ring_buffer.full()) return; + + // No data for this port ? Skip it + if (!serial_data_available(p)) continue; + + // Ok, we have some data to process, let's make progress here + hadData = true; const int c = read_serial(p); - if (c < 0) continue; + if (c < 0) { + // This should never happen, let's log it + PORT_REDIRECT(SERIAL_PORTMASK(p)); // Reply to the serial port that sent the command + // Crash here to get more information why it failed + BUG_ON("SP available but read -1"); + SERIAL_ERROR_MSG(STR_ERR_SERIAL_MISMATCH); + SERIAL_FLUSH(); + continue; + } - #if ENABLED(MEATPACK) - meatpack.handle_rx_char(uint8_t(c), p); - char c_res[2] = { 0, 0 }; - const uint8_t char_count = meatpack.get_result_char(c_res); - #else - constexpr uint8_t char_count = 1; - #endif + const char serial_char = (char)c; + SerialState &serial = serial_state[p]; - LOOP_L_N(char_index, char_count) { - const char serial_char = TERN(MEATPACK, c_res[char_index], c); + if (ISEOL(serial_char)) { - if (ISEOL(serial_char)) { + // Reset our state, continue if the line was empty + if (process_line_done(serial.input_state, serial.line_buffer, serial.count)) + continue; - // Reset our state, continue if the line was empty - if (process_line_done(serial_input_state[p], serial_line_buffer[p], serial_count[p])) - continue; + char* command = serial.line_buffer; - char* command = serial_line_buffer[p]; + while (*command == ' ') command++; // Skip leading spaces + char *npos = (*command == 'N') ? command : nullptr; // Require the N parameter to start the line - while (*command == ' ') command++; // Skip leading spaces - char *npos = (*command == 'N') ? command : nullptr; // Require the N parameter to start the line + if (npos) { - if (npos) { + const bool M110 = !!strstr_P(command, PSTR("M110")); - const bool M110 = !!strstr_P(command, PSTR("M110")); - - if (M110) { - char* n2pos = strchr(command + 4, 'N'); - if (n2pos) npos = n2pos; - } - - const long gcode_N = strtol(npos + 1, nullptr, 10); - - if (gcode_N != last_N[p] + 1 && !M110) - return gcode_line_error(PSTR(STR_ERR_LINE_NO), p); - - char *apos = strrchr(command, '*'); - if (apos) { - uint8_t checksum = 0, count = uint8_t(apos - command); - while (count) checksum ^= command[--count]; - if (strtol(apos + 1, nullptr, 10) != checksum) - return gcode_line_error(PSTR(STR_ERR_CHECKSUM_MISMATCH), p); - } - else - return gcode_line_error(PSTR(STR_ERR_NO_CHECKSUM), p); - - last_N[p] = gcode_N; - } - #if ENABLED(SDSUPPORT) - // Pronterface "M29" and "M29 " has no line number - else if (card.flag.saving && !is_M29(command)) - return gcode_line_error(PSTR(STR_ERR_NO_CHECKSUM), p); - #endif - - // - // Movement commands give an alert when the machine is stopped - // - - if (IsStopped()) { - char* gpos = strchr(command, 'G'); - if (gpos) { - switch (strtol(gpos + 1, nullptr, 10)) { - case 0: case 1: - #if ENABLED(ARC_SUPPORT) - case 2: case 3: - #endif - #if ENABLED(BEZIER_CURVE_SUPPORT) - case 5: - #endif - PORT_REDIRECT(SERIAL_PORTMASK(p)); // Reply to the serial port that sent the command - SERIAL_ECHOLNPGM(STR_ERR_STOPPED); - LCD_MESSAGEPGM(MSG_STOPPED); - break; - } - } + if (M110) { + char* n2pos = strchr(command + 4, 'N'); + if (n2pos) npos = n2pos; } - #if DISABLED(EMERGENCY_PARSER) - // Process critical commands early - if (command[0] == 'M') switch (command[3]) { - case '8': if (command[2] == '0' && command[1] == '1') { wait_for_heatup = false; TERN_(HAS_LCD_MENU, wait_for_user = false); } break; - case '2': if (command[2] == '1' && command[1] == '1') kill(M112_KILL_STR, nullptr, true); break; - case '0': if (command[1] == '4' && command[2] == '1') quickstop_stepper(); break; + const long gcode_N = strtol(npos + 1, nullptr, 10); + + if (gcode_N != serial.last_N + 1 && !M110) { + // In case of error on a serial port, don't prevent other serial port from making progress + gcode_line_error(PSTR(STR_ERR_LINE_NO), p); + break; + } + + char *apos = strrchr(command, '*'); + if (apos) { + uint8_t checksum = 0, count = uint8_t(apos - command); + while (count) checksum ^= command[--count]; + if (strtol(apos + 1, nullptr, 10) != checksum) { + // In case of error on a serial port, don't prevent other serial port from making progress + gcode_line_error(PSTR(STR_ERR_CHECKSUM_MISMATCH), p); + break; } - #endif + } + else { + // In case of error on a serial port, don't prevent other serial port from making progress + gcode_line_error(PSTR(STR_ERR_NO_CHECKSUM), p); + break; + } - #if defined(NO_TIMEOUTS) && NO_TIMEOUTS > 0 - last_command_time = ms; - #endif - - // Add the command to the queue - _enqueue(serial_line_buffer[p], true - #if HAS_MULTI_SERIAL - , p - #endif - ); + serial.last_N = gcode_N; } - else - process_stream_char(serial_char, serial_input_state[p], serial_line_buffer[p], serial_count[p]); + #if ENABLED(SDSUPPORT) + // Pronterface "M29" and "M29 " has no line number + else if (card.flag.saving && !is_M29(command)) { + gcode_line_error(PSTR(STR_ERR_NO_CHECKSUM), p); + break; + } + #endif - } // char_count loop + // + // Movement commands give an alert when the machine is stopped + // + + if (IsStopped()) { + char* gpos = strchr(command, 'G'); + if (gpos) { + switch (strtol(gpos + 1, nullptr, 10)) { + case 0: case 1: + #if ENABLED(ARC_SUPPORT) + case 2: case 3: + #endif + #if ENABLED(BEZIER_CURVE_SUPPORT) + case 5: + #endif + PORT_REDIRECT(SERIAL_PORTMASK(p)); // Reply to the serial port that sent the command + SERIAL_ECHOLNPGM(STR_ERR_STOPPED); + LCD_MESSAGEPGM(MSG_STOPPED); + break; + } + } + } + + #if DISABLED(EMERGENCY_PARSER) + // Process critical commands early + if (command[0] == 'M') switch (command[3]) { + case '8': if (command[2] == '0' && command[1] == '1') { wait_for_heatup = false; TERN_(HAS_LCD_MENU, wait_for_user = false); } break; + case '2': if (command[2] == '1' && command[1] == '1') kill(M112_KILL_STR, nullptr, true); break; + case '0': if (command[1] == '4' && command[2] == '1') quickstop_stepper(); break; + } + #endif + + #if NO_TIMEOUTS > 0 + last_command_time = ms; + #endif + + // Add the command to the queue + ring_buffer.enqueue(serial.line_buffer, false + #if HAS_MULTI_SERIAL + , p + #endif + ); + } + else + process_stream_char(serial_char, serial.input_state, serial.line_buffer, serial.count); } // NUM_SERIAL loop } // queue has space, serial has data @@ -595,33 +568,35 @@ void GCodeQueue::get_serial_commands() { if (!IS_SD_PRINTING()) return; int sd_count = 0; - while (length < BUFSIZE && !card.eof()) { + while (!ring_buffer.full() && !card.eof()) { const int16_t n = card.get(); const bool card_eof = card.eof(); if (n < 0 && !card_eof) { SERIAL_ERROR_MSG(STR_SD_ERR_READ); continue; } + CommandLine &command = ring_buffer.commands[ring_buffer.index_w]; const char sd_char = (char)n; const bool is_eol = ISEOL(sd_char); if (is_eol || card_eof) { + // Reset stream state, terminate the buffer, and commit a non-empty command if (!is_eol && sd_count) ++sd_count; // End of file with no newline - if (!process_line_done(sd_input_state, command_buffer[index_w], sd_count)) { + if (!process_line_done(sd_input_state, command.buffer, sd_count)) { // M808 L saves the sdpos of the next line. M808 loops to a new sdpos. - TERN_(GCODE_REPEAT_MARKERS, repeat.early_parse_M808(command_buffer[index_w])); + TERN_(GCODE_REPEAT_MARKERS, repeat.early_parse_M808(command.buffer)); // Put the new command into the buffer (no "ok" sent) - _commit_command(false); + ring_buffer.commit_command(true); - // Prime Power-Loss Recovery for the NEXT _commit_command + // Prime Power-Loss Recovery for the NEXT commit_command TERN_(POWER_LOSS_RECOVERY, recovery.cmd_sdpos = card.getIndex()); } if (card.eof()) card.fileHasFinished(); // Handle end of file reached } else - process_stream_char(sd_char, sd_input_state, command_buffer[index_w], sd_count); + process_stream_char(sd_char, sd_input_state, command.buffer, sd_count); } } @@ -634,6 +609,7 @@ void GCodeQueue::get_serial_commands() { * - The SD card file being actively printed */ void GCodeQueue::get_available_commands() { + if (ring_buffer.full()) return; get_serial_commands(); @@ -649,13 +625,13 @@ void GCodeQueue::advance() { if (process_injected_command_P() || process_injected_command()) return; // Return if the G-code buffer is empty - if (!length) return; + if (ring_buffer.empty()) return; #if ENABLED(SDSUPPORT) if (card.flag.saving) { - char* command = command_buffer[index_r]; - if (is_M29(command)) { + char * const cmd = ring_buffer.peek_next_command_string(); + if (is_M29(cmd)) { // M29 closes the file card.closefile(); SERIAL_ECHOLNPGM(STR_FILE_SAVED); @@ -673,7 +649,7 @@ void GCodeQueue::advance() { } else { // Write the string from the read buffer to SD - card.write_command(command); + card.write_command(cmd); if (card.flag.logging) gcode.process_next_command(); // The card is saving because it's logging else @@ -690,7 +666,5 @@ void GCodeQueue::advance() { #endif // SDSUPPORT // The queue may be reset by a command handler or by code invoked by idle() within a handler - --length; - if (++index_r >= BUFSIZE) index_r = 0; - + ring_buffer.advance_pos(ring_buffer.index_r, -1); } diff --git a/Marlin/src/gcode/queue.h b/Marlin/src/gcode/queue.h index d677146a7d..778f9a7f67 100644 --- a/Marlin/src/gcode/queue.h +++ b/Marlin/src/gcode/queue.h @@ -31,41 +31,84 @@ class GCodeQueue { public: /** - * GCode line number handling. Hosts may include line numbers when sending - * commands to Marlin, and lines will be checked for sequentiality. - * M110 N sets the current line number. + * The buffers per serial port. */ + struct SerialState { + /** + * GCode line number handling. Hosts may include line numbers when sending + * commands to Marlin, and lines will be checked for sequentiality. + * M110 N sets the current line number. + */ + long last_N; + int count; //!< Number of characters read in the current line of serial input + char line_buffer[MAX_CMD_SIZE]; //!< The current line accumulator + uint8_t input_state; //!< The input state + }; - static long last_N[NUM_SERIAL]; + static SerialState serial_state[NUM_SERIAL]; //!< Serial states for each serial port /** * GCode Command Queue - * A simple ring buffer of BUFSIZE command strings. + * A simple (circular) ring buffer of BUFSIZE command strings. * * Commands are copied into this buffer by the command injectors * (immediate, serial, sd card) and they are processed sequentially by * the main loop. The gcode.process_next_command method parses the next * command and hands off execution to individual handler functions. */ - static uint8_t length, // Count of commands in the queue - index_r; // Ring buffer read position - - static char command_buffer[BUFSIZE][MAX_CMD_SIZE]; + struct CommandLine { + char buffer[MAX_CMD_SIZE]; //!< The command buffer + bool skip_ok; //!< Skip sending ok when command is processed? + TERN_(HAS_MULTI_SERIAL, serial_index_t port); //!< Serial port the command was received on + }; /** - * The port that the command was received on + * A handy ring buffer type */ - #if HAS_MULTI_SERIAL - static serial_index_t port[BUFSIZE]; - #endif - static inline serial_index_t command_port() { return TERN0(HAS_MULTI_SERIAL, port[index_r]); } + struct RingBuffer { + uint8_t length, //!< Number of commands in the queue + index_r, //!< Ring buffer's read position + index_w; //!< Ring buffer's write position + CommandLine commands[BUFSIZE]; //!< The ring buffer of commands - GCodeQueue(); + inline serial_index_t command_port() const { return TERN0(HAS_MULTI_SERIAL, commands[index_r].port); } + + inline void clear() { length = index_r = index_w = 0; } + + void advance_pos(uint8_t &p, const int inc) { if (++p >= BUFSIZE) p = 0; length += inc; } + + void commit_command(bool skip_ok + #if HAS_MULTI_SERIAL + , serial_index_t serial_ind=-1 + #endif + ); + + bool enqueue(const char* cmd, bool skip_ok = true + #if HAS_MULTI_SERIAL + , serial_index_t serial_ind=-1 + #endif + ); + + void ok_to_send(); + + inline bool full(uint8_t cmdCount=1) const { return length > (BUFSIZE - cmdCount); } + + inline bool empty() const { return length == 0; } + + inline CommandLine& peek_next_command() { return commands[index_r]; } + + inline char* peek_next_command_string() { return peek_next_command().buffer; } + }; + + /** + * The ring buffer of commands + */ + static RingBuffer ring_buffer; /** * Clear the Marlin command queue */ - static void clear(); + static void clear() { ring_buffer.clear(); } /** * Next Injected Command (PROGMEM) pointer. (nullptr == empty) @@ -112,7 +155,7 @@ public: /** * Check whether there are any commands yet to be executed */ - static bool has_commands_queued(); + static bool has_commands_queued() { return ring_buffer.length || injected_commands_P || injected_commands[0]; } /** * Get the next command in the queue, optionally log it to SD, then dispatch it @@ -136,7 +179,7 @@ public: * P Planner space remaining * B Block queue space remaining */ - static void ok_to_send(); + static inline void ok_to_send() { ring_buffer.ok_to_send(); } /** * Clear the serial line and request a resend of @@ -144,9 +187,12 @@ public: */ static void flush_and_request_resend(); -private: + /** + * (Re)Set the current line number for the last received command + */ + static inline void set_current_line_number(long n) { serial_state[ring_buffer.command_port()].last_N = n; } - static uint8_t index_w; // Ring buffer write position +private: static void get_serial_commands(); @@ -154,18 +200,6 @@ private: static void get_sdcard_commands(); #endif - static void _commit_command(bool say_ok - #if HAS_MULTI_SERIAL - , serial_index_t serial_ind=-1 - #endif - ); - - static bool _enqueue(const char* cmd, bool say_ok=false - #if HAS_MULTI_SERIAL - , serial_index_t serial_ind=-1 - #endif - ); - // Process the next "immediate" command (PROGMEM) static bool process_injected_command_P(); @@ -180,6 +214,7 @@ private: static void gcode_line_error(PGM_P const err, const serial_index_t serial_ind); + friend class GcodeSuite; }; extern GCodeQueue queue; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.cpp index 2cf6f05a99..6e0d7814d0 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.cpp @@ -162,7 +162,7 @@ static void lv_kb_event_cb(lv_obj_t *kb, lv_event_t event) { draw_return_ui(); break; case GCodeCommand: - if (queue.length <= (BUFSIZE - 3)) { + if (!queue.ring_buffer.full(3)) { // Hook anything that goes to the serial port MYSERIAL0.setHook(lv_serial_capt_hook, lv_eom_hook, 0); queue.enqueue_one_now(ret_ta_txt); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp index 495acda06b..dbeb3796e0 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp @@ -46,7 +46,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { switch (obj->mks_obj_id) { case ID_M_POINT1 ... ID_M_POINT5: - if (queue.length == 0) { + if (queue.ring_buffer.empty()) { if (uiCfg.leveling_first_time) { uiCfg.leveling_first_time = false; queue.inject_P(G28_STR); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp index 1c07583d53..2dec548af0 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp @@ -54,7 +54,7 @@ enum { static void event_handler(lv_obj_t *obj, lv_event_t event) { char str_1[16]; if (event != LV_EVENT_RELEASED) return; - if (queue.length <= (BUFSIZE - 3)) { + if (!queue.ring_buffer.full(3)) { bool do_inject = true; float dist = uiCfg.move_dist; switch (obj->mks_obj_id) { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp index 71cdb0f7d4..5622956579 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp @@ -1613,7 +1613,7 @@ void wifi_rcv_handle() { if (wifiTransError.flag != 0x1) WIFI_IO1_RESET(); getDataF = 1; } - if (need_ok_later && (queue.length < BUFSIZE)) { + if (need_ok_later && !queue.ring_buffer.full()) { need_ok_later = false; send_to_wifi((uint8_t *)"ok\r\n", strlen("ok\r\n")); } @@ -1772,7 +1772,7 @@ void get_wifi_commands() { static int wifi_read_count = 0; if (espGcodeFifo.wait_tick > 5) { - while ((queue.length < BUFSIZE) && (espGcodeFifo.r != espGcodeFifo.w)) { + while (!queue.ring_buffer.full() && (espGcodeFifo.r != espGcodeFifo.w)) { espGcodeFifo.wait_tick = 0; diff --git a/docs/Queue.md b/docs/Queue.md new file mode 100644 index 0000000000..bce68b0551 --- /dev/null +++ b/docs/Queue.md @@ -0,0 +1,59 @@ +# Marlin's command queue concept + +Marlin Firmware processes G-code commands as they arrive from multiple sources, including the SD card and one or more serial ports such as USB-connected hosts, WiFi, Bluetooth, and so on. + +Marlin is also continuously processing the commands at the front of the queue, converting them into signals for many physical actuators such as motors, heaters, lasers, and RGB LEDs. + +The firmware needs to maintain continuity and timing so the command senders remain unblocked, while still performing physical movements and other actions in real-time, respecting the physical limits of stepper motors and other peripherals. + +To keep things flowing Marlin feeds a single queue of G-code commands from all inputs, inserting them in the order received. Movement commands immediately go into the Planner Buffer, if there is room. The buffering of a move is considered the completion of the command, so if a non-movement command has to occur after a move is done, and not just after a move is buffered, then there has to be an `M400` to wait for the Planner Buffer to finish. + +Whenever the command queue gets full the sender needs to wait for space to open up, and the host may need to re-send the last command again. Marlin does some handshaking to keep the host informed during a print job, described below. + +An opposite problem called "planner starvation" occurs when Marlin receives many short and fast moves in a row so the Planner Buffer gets completed very quickly. In this case the host can't send commands fast enough to prevent the Planner Buffer from emptying out. Planner starvation causes obvious stuttering and is commonly seen on overloaded deltabots during small curves. Marlin has strategies to mitigate this issue, but sometimes a model has to be re-sliced (or the G-code has to be post-processed with Arc Welder) just to stay within the machine's inherent limits. + +Here's a basic flowchart of Marlin command processing: +``` ++------+ Marlin's GCodeQueue +| | +--------------------------------------+ +-----------+ +| Host | | SerialState RingBuffer | | | +| | Marlin | NUM_SERIAL BUF_SIZE | | Marlin | ++--+---+ R/TX_BUFFER_SIZE | +---+ +------------------+ | | | + | +------------+ | | | | | | | GCode | + | | | | | | | MAX_CMD_SIZE +-+-----> processor | + | | Platform | | | | On EOL | +--------------+ | r_pos | | + +-------------> serial's +-----------> +--------> | G-code | | | +-----------+ + | buffer | | | | w_pos | | command | | | + | | | | | | | line | | | + +------------+ | +---+ | +--------------+ | | + | Line buffer | x BUF_SIZE | | + | | | | + | | | | + | | | | + | | | | + | +------------------+ | + | | + | | + | | + +--------------------------------------+ +``` + +Marlin is a single-threaded application with a main `loop()` that manages the command queue and an `idle()` routine that manages the hardware. The command queue is handled in two stages: +1. The `idle()` routine reads all inputs and attempts to enqueue any completed command lines. +2. The main `loop()` gets the command at the front the G-code queue (if any) and runs it. Each G-code command blocks the main loop, preventing the queue from advancing until it returns. To keep essential tasks and the UI running, any commands that run a long process need to call `idle()` frequently. + +## Synchronization + +To maintain synchronization Marlin replies "`ok`" to the host as soon as the command has been enqueued. This lets the host know that it can send another command, and well-behaved hosts will wait for this message. With `ADVANCED_OK` enabled the `ok` message includes extra information (such as the number of slots left in the queue). + +If no data is available on the serial buffer, Marlin can be configured to periodically send a "`wait`" message to the host. This was the only method of "host keepalive" provided in Marlin 1.0, but today the better options are `HOST_KEEPALIVE` and `ADVANCED_OK`. + +## Limitation of the design + +Some limitations to the design are evident: +1. Whenever the G-code processor is busy processing a command, the G-code queue cannot advance. +2. A long command like `G29` causes commands to pile up and to fill the queue, making the host wait. +3. Each serial input requires a buffer large enough for a complete G-code line. This is set by `MAX_CMD_SIZE` with a default value of 96. +4. Since serial buffer sizes are likely used as ring buffers themselves, as an optimization their sizes must be a power of 2 (64 or 128 bytes recommended). +5. If a host sends too much G-code at once it can saturate the `GCodeQueue`. This doesn't do anything to improve the processing rate of Marlin since only one command can be dispatched per loop iteration. +6. With the previous point in mind, it's clear that the longstanding wisdom that you don't need a large `BUF_SIZE` is not just apocryphal. The default value of 4 is typically just fine for a single serial port. (And, if you decide to send a `G25` to pause the machine, the wait will be much shorter!) From 7a1ec7856361790ec5a76d70698ace798dfa43b5 Mon Sep 17 00:00:00 2001 From: ldursw <37294448+ldursw@users.noreply.github.com> Date: Fri, 26 Feb 2021 20:01:11 -0300 Subject: [PATCH 036/253] Init (stow) BLTouch before X/Y homing (#21192) --- Marlin/src/gcode/calibrate/G28.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/gcode/calibrate/G28.cpp b/Marlin/src/gcode/calibrate/G28.cpp index c26340f1ab..a2de1dfe38 100644 --- a/Marlin/src/gcode/calibrate/G28.cpp +++ b/Marlin/src/gcode/calibrate/G28.cpp @@ -332,6 +332,7 @@ void GcodeSuite::G28() { // Raise Z before homing any other axes and z is not already high enough (never lower z) if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Raise Z (before homing) by ", z_homing_height); do_z_clearance(z_homing_height); + TERN_(BLTOUCH, bltouch.init()); } #if ENABLED(QUICK_HOME) @@ -384,7 +385,6 @@ void GcodeSuite::G28() { stepper.set_separate_multi_axis(false); #endif - TERN_(BLTOUCH, bltouch.init()); TERN(Z_SAFE_HOMING, home_z_safely(), homeaxis(Z_AXIS)); probe.move_z_after_homing(); } From e27fba0c0629f9c5c3b90ba0f597de246ca28de7 Mon Sep 17 00:00:00 2001 From: Fabio Viappiani Date: Sat, 27 Feb 2021 00:10:50 +0100 Subject: [PATCH 037/253] Fix M355 with NEOPIXEL (#21200) --- Marlin/src/gcode/feature/caselight/M355.cpp | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/Marlin/src/gcode/feature/caselight/M355.cpp b/Marlin/src/gcode/feature/caselight/M355.cpp index 12ae5cff1d..6634a90f46 100644 --- a/Marlin/src/gcode/feature/caselight/M355.cpp +++ b/Marlin/src/gcode/feature/caselight/M355.cpp @@ -60,12 +60,10 @@ void GcodeSuite::M355() { if (!caselight.on) SERIAL_ECHOLNPGM(STR_OFF); else { - #if CASELIGHT_USES_BRIGHTNESS - if (PWM_PIN(CASE_LIGHT_PIN)) { - SERIAL_ECHOLN(int(caselight.brightness)); - return; - } - #endif + if (TERN0(CASELIGHT_USES_BRIGHTNESS, TERN(CASE_LIGHT_USE_NEOPIXEL, true, PWM_PIN(CASE_LIGHT_PIN)))) { + SERIAL_ECHOLN(int(caselight.brightness)); + return; + } SERIAL_ECHOLNPGM(STR_ON); } } From 427b5d61f46ce0e751e09c841ae62ddeec3df1ac Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Fri, 26 Feb 2021 20:33:34 -0300 Subject: [PATCH 038/253] More LERDGE envs followup (#21205) --- platformio.ini | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/platformio.ini b/platformio.ini index c03b224533..1d2ef0e03b 100644 --- a/platformio.ini +++ b/platformio.ini @@ -1385,7 +1385,7 @@ board_build.firmware = Lerdge_X_firmware_force.bin # Lerdge X with USB Flash Drive Support # [env:LERDGEX_usb_flash_drive] -platform = ${LERDGEX.platform} +platform = ${env:LERDGEX.platform} extends = LERDGEX platform_packages = ${stm32_flash_drive.platform_packages} build_flags = ${stm32_flash_drive.build_flags} @@ -1402,7 +1402,7 @@ board_build.firmware = Lerdge_firmware_force.bin # Lerdge S with USB Flash Drive Support # [env:LERDGES_usb_flash_drive] -platform = ${LERDGES.platform} +platform = ${env:LERDGES.platform} extends = LERDGES platform_packages = ${stm32_flash_drive.platform_packages} build_flags = ${stm32_flash_drive.build_flags} @@ -1421,7 +1421,7 @@ build_flags = ${lerdge_common.build_flags} # Lerdge K with USB Flash Drive Support # [env:LERDGEK_usb_flash_drive] -platform = ${LERDGEK.platform} +platform = ${env:LERDGEK.platform} extends = LERDGEK platform_packages = ${stm32_flash_drive.platform_packages} build_flags = ${stm32_flash_drive.build_flags} From f384f81253fbd70d3d0cee799ab8fc5de80b63b3 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Fri, 26 Feb 2021 20:36:22 -0300 Subject: [PATCH 039/253] Fix GTR / SKR PRO + USB Flash Drive build (#21197) --- .../BIGTREE_GTR_V1_0_usb_flash_drive-tests | 47 +++++++++++++++++++ platformio.ini | 6 ++- 2 files changed, 52 insertions(+), 1 deletion(-) create mode 100755 buildroot/tests/BIGTREE_GTR_V1_0_usb_flash_drive-tests diff --git a/buildroot/tests/BIGTREE_GTR_V1_0_usb_flash_drive-tests b/buildroot/tests/BIGTREE_GTR_V1_0_usb_flash_drive-tests new file mode 100755 index 0000000000..0504fc1da9 --- /dev/null +++ b/buildroot/tests/BIGTREE_GTR_V1_0_usb_flash_drive-tests @@ -0,0 +1,47 @@ +#!/usr/bin/env bash +# +# Build tests for BigTreeTech GTR 1.0 +# + +# exit on first failure +set -e + +restore_configs +opt_set MOTHERBOARD BOARD_BTT_GTR_V1_0 +opt_set SERIAL_PORT 3 +opt_set EXTRUDERS 8 +opt_set TEMP_SENSOR_1 1 +opt_set TEMP_SENSOR_2 1 +opt_set TEMP_SENSOR_3 1 +opt_set TEMP_SENSOR_4 1 +opt_set TEMP_SENSOR_5 1 +opt_set TEMP_SENSOR_6 1 +opt_set TEMP_SENSOR_7 1 +opt_set SDSUPPORT +opt_set USB_FLASH_DRIVE_SUPPORT +opt_set USE_OTG_USB_HOST +# Not necessary to enable auto-fan for all extruders to hit problematic code paths +opt_set E0_AUTO_FAN_PIN PC10 +opt_set E1_AUTO_FAN_PIN PC11 +opt_set E2_AUTO_FAN_PIN PC12 +opt_set X_DRIVER_TYPE TMC2208 +opt_set Y_DRIVER_TYPE TMC2130 +opt_set NEOPIXEL_PIN PF13 +opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER BLTOUCH NEOPIXEL_LED Z_SAFE_HOMING +opt_enable FILAMENT_RUNOUT_SENSOR NOZZLE_PARK_FEATURE ADVANCED_PAUSE_FEATURE +opt_set FIL_RUNOUT_PIN 3 +opt_set FIL_RUNOUT2_PIN 4 +opt_set FIL_RUNOUT3_PIN 5 +opt_set FIL_RUNOUT4_PIN 6 +opt_set FIL_RUNOUT5_PIN 7 +opt_set FIL_RUNOUT6_PIN 8 +opt_set FIL_RUNOUT7_PIN 9 +opt_set FIL_RUNOUT8_PIN 10 +opt_set FIL_RUNOUT4_STATE HIGH +opt_enable FIL_RUNOUT4_PULLUP +opt_set FIL_RUNOUT8_STATE HIGH +opt_enable FIL_RUNOUT8_PULLUP +exec_test $1 $2 "BigTreeTech GTR + OTG USB Flash Drive + Extruders with Auto-Fan, Mixed TMC Drivers, and Runout Sensors with distinct states" "$3" + +# clean up +restore_configs diff --git a/platformio.ini b/platformio.ini index 1d2ef0e03b..b35cd878d0 100644 --- a/platformio.ini +++ b/platformio.ini @@ -1316,7 +1316,9 @@ build_flags = ${common_stm32.build_flags} [env:BIGTREE_SKR_PRO_usb_flash_drive] extends = env:BIGTREE_SKR_PRO platform_packages = ${stm32_flash_drive.platform_packages} +build_unflags = -DUSBCON -DUSBD_USE_CDC build_flags = ${stm32_flash_drive.build_flags} + -DSTM32F407_5ZX -DVECT_TAB_OFFSET=0x8000 # # Bigtreetech GTR V1.0 (STM32F407IGT6 ARM Cortex-M4) @@ -1336,7 +1338,9 @@ build_flags = ${common_stm32.build_flags} [env:BIGTREE_GTR_V1_0_usb_flash_drive] extends = env:BIGTREE_GTR_V1_0 platform_packages = ${stm32_flash_drive.platform_packages} -build_flags = ${stm32_flash_drive.build_flags} +build_unflags = -DUSBCON -DUSBD_USE_CDC +build_flags = ${stm32_flash_drive.build_flags} + -DSTM32F407IX -DVECT_TAB_OFFSET=0x8000 # # BigTreeTech BTT002 V1.0 (STM32F407VGT6 ARM Cortex-M4) From 56462cf082e8bf2bae6cb288c5daa4b77289cfb0 Mon Sep 17 00:00:00 2001 From: X-Ryl669 Date: Sat, 27 Feb 2021 00:59:28 +0100 Subject: [PATCH 040/253] Make F_CPU a compile-time constant (#21051) --- Marlin/src/HAL/STM32/HAL.cpp | 6 ++++++ Marlin/src/HAL/STM32/inc/Conditionals_adv.h | 6 ++++++ .../share/PlatformIO/scripts/common-cxxflags.py | 13 +++++++++++++ 3 files changed, 25 insertions(+) diff --git a/Marlin/src/HAL/STM32/HAL.cpp b/Marlin/src/HAL/STM32/HAL.cpp index 5c7bc3a00b..4b530cc738 100644 --- a/Marlin/src/HAL/STM32/HAL.cpp +++ b/Marlin/src/HAL/STM32/HAL.cpp @@ -63,6 +63,12 @@ TERN_(POSTMORTEM_DEBUGGING, extern void install_min_serial()); void HAL_init() { FastIO_init(); + // Ensure F_CPU is a constant expression. + // If the compiler breaks here, it means that delay code that should compute at compile time will not work. + // So better safe than sorry here. + constexpr int cpuFreq = F_CPU; + UNUSED(cpuFreq); + #if ENABLED(SDSUPPORT) && DISABLED(SDIO_SUPPORT) && (defined(SDSS) && SDSS != -1) OUT_WRITE(SDSS, HIGH); // Try to set SDSS inactive before any other SPI users start up #endif diff --git a/Marlin/src/HAL/STM32/inc/Conditionals_adv.h b/Marlin/src/HAL/STM32/inc/Conditionals_adv.h index 672d405d6b..9c9a7014c7 100644 --- a/Marlin/src/HAL/STM32/inc/Conditionals_adv.h +++ b/Marlin/src/HAL/STM32/inc/Conditionals_adv.h @@ -24,3 +24,9 @@ #if defined(USBD_USE_CDC_MSC) && DISABLED(NO_SD_HOST_DRIVE) #define HAS_SD_HOST_DRIVE 1 #endif + +// Fix F_CPU not being a compile-time constant in STSTM32 framework +#ifdef BOARD_F_CPU + #undef F_CPU + #define F_CPU BOARD_F_CPU +#endif diff --git a/buildroot/share/PlatformIO/scripts/common-cxxflags.py b/buildroot/share/PlatformIO/scripts/common-cxxflags.py index a0a3b45043..ed863a917a 100644 --- a/buildroot/share/PlatformIO/scripts/common-cxxflags.py +++ b/buildroot/share/PlatformIO/scripts/common-cxxflags.py @@ -11,6 +11,13 @@ env.Append(CXXFLAGS=[ #"-Wno-sign-compare" ]) +# +# Add CPU frequency as a compile time constant instead of a runtime variable +# +def add_cpu_freq(): + if 'BOARD_F_CPU' in env: + env['BUILD_FLAGS'].append('-DBOARD_F_CPU=' + env['BOARD_F_CPU']) + # Useful for JTAG debugging # # It will separe release and debug build folders. @@ -20,3 +27,9 @@ env.Append(CXXFLAGS=[ # if env.GetBuildType() == "debug": env['BUILD_DIR'] = '$PROJECT_BUILD_DIR/$PIOENV/debug' + +# On some platform, F_CPU is a runtime variable. Since it's used to convert from ns +# to CPU cycles, this adds overhead preventing small delay (in the order of less than +# 30 cycles) to be generated correctly. By using a compile time constant instead +# the compiler will perform the computation and this overhead will be avoided +add_cpu_freq() From 24623d398c9a3489af88100e5158ec4a590ab577 Mon Sep 17 00:00:00 2001 From: "Alexander D. Kanevskiy" Date: Sat, 27 Feb 2021 02:03:11 +0200 Subject: [PATCH 041/253] Fix preflight complex extend handling (#21191) --- .../PlatformIO/scripts/preflight-checks.py | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/buildroot/share/PlatformIO/scripts/preflight-checks.py b/buildroot/share/PlatformIO/scripts/preflight-checks.py index 14807d954a..c20e5cb7a8 100644 --- a/buildroot/share/PlatformIO/scripts/preflight-checks.py +++ b/buildroot/share/PlatformIO/scripts/preflight-checks.py @@ -1,6 +1,6 @@ # # preflight-checks.py -# Script to check for common issues prior to compiling +# Check for common issues prior to compiling # import os import re @@ -25,9 +25,12 @@ def check_envs(build_env, base_envs, config): return True ext = config.get(build_env, 'extends', default=None) if ext: - for ext_env in ext: - if check_envs(ext_env, base_envs, config): - return True + if isinstance(ext, str): + return check_envs(ext, base_envs, config) + elif isinstance(ext, list): + for ext_env in ext: + if check_envs(ext_env, base_envs, config): + return True return False # Sanity checks: @@ -56,7 +59,7 @@ if not result: # Check for Config files in two common incorrect places # for p in [ env['PROJECT_DIR'], os.path.join(env['PROJECT_DIR'], "config") ]: - for f in [ "Configuration.h", "Configuration_adv.h" ]: - if os.path.isfile(os.path.join(p, f)): - err = "ERROR: Config files found in directory %s. Please move them into the Marlin subfolder." % p - raise SystemExit(err) + for f in [ "Configuration.h", "Configuration_adv.h" ]: + if os.path.isfile(os.path.join(p, f)): + err = "ERROR: Config files found in directory %s. Please move them into the Marlin subfolder." % p + raise SystemExit(err) From 526924559f3922101b11213bd9deba36d1472ae5 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Sat, 27 Feb 2021 00:12:45 +0000 Subject: [PATCH 042/253] [cron] Bump distribution date (2021-02-27) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index d6ceaf2e03..46146c53c7 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2021-02-26" + #define STRING_DISTRIBUTION_DATE "2021-02-27" #endif /** From e65a84f6eae04824873cbaf39f005c6251d8ccdd Mon Sep 17 00:00:00 2001 From: X-Ryl669 Date: Sat, 27 Feb 2021 20:13:04 +0100 Subject: [PATCH 043/253] G-code Queue followup (#21214) --- Marlin/src/gcode/sd/M28_M29.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/gcode/sd/M28_M29.cpp b/Marlin/src/gcode/sd/M28_M29.cpp index 6f3f2450a1..f34edb6f7c 100644 --- a/Marlin/src/gcode/sd/M28_M29.cpp +++ b/Marlin/src/gcode/sd/M28_M29.cpp @@ -49,7 +49,7 @@ void GcodeSuite::M28() { // Binary transfer mode if ((card.flag.binary_mode = binary_mode)) { SERIAL_ECHO_MSG("Switching to Binary Protocol"); - TERN_(HAS_MULTI_SERIAL, card.transfer_port_index = queue.port[queue.index_r]); + TERN_(HAS_MULTI_SERIAL, card.transfer_port_index = queue.ring_buffer.command_port()); } else card.openFileWrite(p); From db5967472b13cca8ea1fd778e46607032f7953e5 Mon Sep 17 00:00:00 2001 From: X-Ryl669 Date: Sat, 27 Feb 2021 20:16:33 +0100 Subject: [PATCH 044/253] Fix G-code Queue merge (#21213) --- Marlin/src/gcode/queue.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Marlin/src/gcode/queue.cpp b/Marlin/src/gcode/queue.cpp index f28c0586d9..7ce8211484 100644 --- a/Marlin/src/gcode/queue.cpp +++ b/Marlin/src/gcode/queue.cpp @@ -60,10 +60,6 @@ GCodeQueue queue; // Frequently used G-code strings PGMSTR(G28_STR, "G28"); -#if NO_TIMEOUTS > 0 - static millis_t last_command_time = 0; -#endif - GCodeQueue::SerialState GCodeQueue::serial_state[NUM_SERIAL] = { 0 }; GCodeQueue::RingBuffer GCodeQueue::ring_buffer = { 0 }; From 4f840c211c02f4ccf4cb50ebe7a0371a9fcdc55b Mon Sep 17 00:00:00 2001 From: Giuliano Zaro <3684609+GMagician@users.noreply.github.com> Date: Sat, 27 Feb 2021 20:23:00 +0100 Subject: [PATCH 045/253] [SMUFF] Use EXTRUDERS for extended commands (#21212) --- Marlin/src/feature/mmu/mmu2.cpp | 32 +++++--------------- Marlin/src/gcode/feature/prusa_MMU2/M403.cpp | 2 +- Marlin/src/inc/Conditionals_LCD.h | 2 +- 3 files changed, 10 insertions(+), 26 deletions(-) diff --git a/Marlin/src/feature/mmu/mmu2.cpp b/Marlin/src/feature/mmu/mmu2.cpp index 7c3ab05851..a1bec36e45 100644 --- a/Marlin/src/feature/mmu/mmu2.cpp +++ b/Marlin/src/feature/mmu/mmu2.cpp @@ -62,29 +62,13 @@ MMU2 mmu2; #endif #define MMU_CMD_NONE 0 -#define MMU_CMD_T0 0x10 -#define MMU_CMD_T1 0x11 -#define MMU_CMD_T2 0x12 -#define MMU_CMD_T3 0x13 -#define MMU_CMD_T4 0x14 -#define MMU_CMD_L0 0x20 -#define MMU_CMD_L1 0x21 -#define MMU_CMD_L2 0x22 -#define MMU_CMD_L3 0x23 -#define MMU_CMD_L4 0x24 +#define MMU_CMD_T0 0x10 // up to supported filaments +#define MMU_CMD_L0 0x20 // up to supported filaments #define MMU_CMD_C0 0x30 #define MMU_CMD_U0 0x40 -#define MMU_CMD_E0 0x50 -#define MMU_CMD_E1 0x51 -#define MMU_CMD_E2 0x52 -#define MMU_CMD_E3 0x53 -#define MMU_CMD_E4 0x54 +#define MMU_CMD_E0 0x50 // up to supported filaments #define MMU_CMD_R0 0x60 -#define MMU_CMD_F0 0x70 -#define MMU_CMD_F1 0x71 -#define MMU_CMD_F2 0x72 -#define MMU_CMD_F3 0x73 -#define MMU_CMD_F4 0x74 +#define MMU_CMD_F0 0x70 // up to supported filaments #define MMU_REQUIRED_FW_BUILDNR TERN(MMU2_MODE_12V, 132, 126) @@ -243,7 +227,7 @@ void MMU2::mmu_loop() { case 1: if (cmd) { - if (WITHIN(cmd, MMU_CMD_T0, MMU_CMD_T4)) { + if (WITHIN(cmd, MMU_CMD_T0, MMU_CMD_T0 + EXTRUDERS - 1)) { // tool change int filament = cmd - MMU_CMD_T0; DEBUG_ECHOLNPAIR("MMU <= T", filament); @@ -251,7 +235,7 @@ void MMU2::mmu_loop() { TERN_(MMU_EXTRUDER_SENSOR, mmu_idl_sens = 1); // enable idler sensor, if any state = 3; // wait for response } - else if (WITHIN(cmd, MMU_CMD_L0, MMU_CMD_L4)) { + else if (WITHIN(cmd, MMU_CMD_L0, MMU_CMD_L0 + EXTRUDERS - 1)) { // load int filament = cmd - MMU_CMD_L0; DEBUG_ECHOLNPAIR("MMU <= L", filament); @@ -271,7 +255,7 @@ void MMU2::mmu_loop() { MMU2_COMMAND("U0"); state = 3; // wait for response } - else if (WITHIN(cmd, MMU_CMD_E0, MMU_CMD_E4)) { + else if (WITHIN(cmd, MMU_CMD_E0, MMU_CMD_E0 + EXTRUDERS - 1)) { // eject filament int filament = cmd - MMU_CMD_E0; DEBUG_ECHOLNPAIR("MMU <= E", filament); @@ -284,7 +268,7 @@ void MMU2::mmu_loop() { MMU2_COMMAND("R0"); state = 3; // wait for response } - else if (WITHIN(cmd, MMU_CMD_F0, MMU_CMD_F4)) { + else if (WITHIN(cmd, MMU_CMD_F0, MMU_CMD_F0 + EXTRUDERS - 1)) { // filament type int filament = cmd - MMU_CMD_F0; DEBUG_ECHOLNPAIR("MMU <= F", filament, " ", cmd_arg); diff --git a/Marlin/src/gcode/feature/prusa_MMU2/M403.cpp b/Marlin/src/gcode/feature/prusa_MMU2/M403.cpp index 31d076337a..bca2013e88 100644 --- a/Marlin/src/gcode/feature/prusa_MMU2/M403.cpp +++ b/Marlin/src/gcode/feature/prusa_MMU2/M403.cpp @@ -40,7 +40,7 @@ void GcodeSuite::M403() { int8_t index = parser.intval('E', -1), type = parser.intval('F', -1); - if (WITHIN(index, 0, 4) && WITHIN(type, 0, 2)) + if (WITHIN(index, 0, EXTRUDERS - 1) && WITHIN(type, 0, 2)) mmu2.set_filament_type(index, type); else SERIAL_ECHO_MSG("M403 - bad arguments."); diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index cff1424eb3..3e20bb90c0 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -513,7 +513,7 @@ #define HAS_PRUSA_MMU2 1 #define HAS_PRUSA_MMU2S 1 #endif - #if MMU_MODEL >= SMUFF_EMU_MMU2 + #if MMU_MODEL == SMUFF_EMU_MMU2 || MMU_MODEL == SMUFF_EMU_MMU2S #define HAS_SMUFF 1 #endif #endif From 6136959a6a0a5cb2b5fb303822ac0fc4867433a7 Mon Sep 17 00:00:00 2001 From: Giuliano Zaro <3684609+GMagician@users.noreply.github.com> Date: Sat, 27 Feb 2021 20:24:36 +0100 Subject: [PATCH 046/253] [SAMD51] Postmortem Debugging not implemented (#21211) --- Marlin/src/HAL/SAMD51/inc/SanityCheck.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Marlin/src/HAL/SAMD51/inc/SanityCheck.h b/Marlin/src/HAL/SAMD51/inc/SanityCheck.h index 5d610acac8..2a4bde98e6 100644 --- a/Marlin/src/HAL/SAMD51/inc/SanityCheck.h +++ b/Marlin/src/HAL/SAMD51/inc/SanityCheck.h @@ -50,3 +50,7 @@ #if ENABLED(FAST_PWM_FAN) || SPINDLE_LASER_FREQUENCY #error "Features requiring Hardware PWM (FAST_PWM_FAN, SPINDLE_LASER_FREQUENCY) are not yet supported on SAMD51." #endif + +#if ENABLED(POSTMORTEM_DEBUGGING) + #error "POSTMORTEM_DEBUGGING is not yet supported on AGCM4." +#endif From 83a156ef47be2f8e43e346bacbbcff809e4127bb Mon Sep 17 00:00:00 2001 From: Arjan Mels <43108771+arjanmels@users.noreply.github.com> Date: Sat, 27 Feb 2021 20:32:57 +0100 Subject: [PATCH 047/253] Fix M876 when called from EP (#21210) --- Marlin/src/feature/host_actions.cpp | 14 -------------- Marlin/src/feature/pause.cpp | 2 +- 2 files changed, 1 insertion(+), 15 deletions(-) diff --git a/Marlin/src/feature/host_actions.cpp b/Marlin/src/feature/host_actions.cpp index c194fb7a5b..77e4f3b9da 100644 --- a/Marlin/src/feature/host_actions.cpp +++ b/Marlin/src/feature/host_actions.cpp @@ -143,24 +143,16 @@ void host_action(PGM_P const pstr, const bool eol) { // - Dismissal of info // void host_response_handler(const uint8_t response) { - #ifdef DEBUG_HOST_ACTIONS - static PGMSTR(m876_prefix, "M876 Handle Re"); - serialprintPGM(m876_prefix); SERIAL_ECHOLNPAIR("ason: ", host_prompt_reason); - serialprintPGM(m876_prefix); SERIAL_ECHOLNPAIR("sponse: ", response); - #endif - PGM_P msg = PSTR("UNKNOWN STATE"); const PromptReason hpr = host_prompt_reason; host_prompt_reason = PROMPT_NOT_DEFINED; // Reset now ahead of logic switch (hpr) { case PROMPT_FILAMENT_RUNOUT: - msg = PSTR("FILAMENT_RUNOUT"); switch (response) { case 0: // "Purge More" button #if BOTH(HAS_LCD_MENU, ADVANCED_PAUSE_FEATURE) pause_menu_response = PAUSE_RESPONSE_EXTRUDE_MORE; // Simulate menu selection (menu exits, doesn't extrude more) #endif - filament_load_host_prompt(); // Initiate another host prompt. (NOTE: The loop in load_filament may also do this!) break; case 1: // "Continue" / "Disable Runout" button @@ -178,23 +170,17 @@ void host_action(PGM_P const pstr, const bool eol) { break; case PROMPT_USER_CONTINUE: TERN_(HAS_RESUME_CONTINUE, wait_for_user = false); - msg = PSTR("FILAMENT_RUNOUT_CONTINUE"); break; case PROMPT_PAUSE_RESUME: - msg = PSTR("LCD_PAUSE_RESUME"); #if BOTH(ADVANCED_PAUSE_FEATURE, SDSUPPORT) extern const char M24_STR[]; queue.inject_P(M24_STR); #endif break; case PROMPT_INFO: - msg = PSTR("GCODE_INFO"); break; default: break; } - SERIAL_ECHOPGM("M876 Responding PROMPT_"); - serialprintPGM(msg); - SERIAL_EOL(); } #endif // HOST_PROMPT_SUPPORT diff --git a/Marlin/src/feature/pause.cpp b/Marlin/src/feature/pause.cpp index 012e6c6e50..e0b4f88f9b 100644 --- a/Marlin/src/feature/pause.cpp +++ b/Marlin/src/feature/pause.cpp @@ -259,7 +259,7 @@ bool load_filament(const float &slow_load_length/*=0*/, const float &fast_load_l unscaled_e_move(purge_length, ADVANCED_PAUSE_PURGE_FEEDRATE); } - TERN_(HOST_PROMPT_SUPPORT, filament_load_host_prompt()); // Initiate another host prompt. (NOTE: host_response_handler may also do this!) + TERN_(HOST_PROMPT_SUPPORT, filament_load_host_prompt()); // Initiate another host prompt. #if HAS_LCD_MENU if (show_lcd) { From 969268166eafa09e2ddc8f0eece35178a89fc46b Mon Sep 17 00:00:00 2001 From: Kachidoki Date: Sat, 27 Feb 2021 20:45:12 +0100 Subject: [PATCH 048/253] Duplicate fan speed in M106/7 IDEX Duplication Mode (#21208) --- Marlin/src/gcode/temp/M106_M107.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/Marlin/src/gcode/temp/M106_M107.cpp b/Marlin/src/gcode/temp/M106_M107.cpp index 9c70f1ebc7..b7d64c99ea 100644 --- a/Marlin/src/gcode/temp/M106_M107.cpp +++ b/Marlin/src/gcode/temp/M106_M107.cpp @@ -81,6 +81,9 @@ void GcodeSuite::M106() { // Set speed, with constraint thermalManager.set_fan_speed(pfan, speed); + + if (TERN0(DUAL_X_CARRIAGE, idex_is_duplicating())) // pfan == 0 when duplicating + thermalManager.set_fan_speed(1 - pfan, speed); } } @@ -88,8 +91,13 @@ void GcodeSuite::M106() { * M107: Fan Off */ void GcodeSuite::M107() { - const uint8_t p = parser.byteval('P', _ALT_P); - thermalManager.set_fan_speed(p, 0); + const uint8_t pfan = parser.byteval('P', _ALT_P); + if (pfan < _CNT_P) { + thermalManager.set_fan_speed(pfan, 0); + + if (TERN0(DUAL_X_CARRIAGE, idex_is_duplicating())) // pfan == 0 when duplicating + thermalManager.set_fan_speed(1 - pfan, 0); + } } #endif // HAS_FAN From 6e1c133e33861b710f6b85e9e50447d08642b287 Mon Sep 17 00:00:00 2001 From: Evgeny Z Date: Sat, 27 Feb 2021 22:50:44 +0300 Subject: [PATCH 049/253] Apply AUTO_POWER_CONTROL later in setup() (#21193) Co-authored-by: Scott Lahteine --- Marlin/src/MarlinCore.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index ad99a06eff..aa92c99940 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -915,12 +915,6 @@ void setup() { OUT_WRITE(SUICIDE_PIN, !SUICIDE_PIN_INVERTING); #endif - #if ENABLED(PSU_CONTROL) - SETUP_LOG("PSU_CONTROL"); - powersupply_on = ENABLED(PSU_DEFAULT_OFF); - if (ENABLED(PSU_DEFAULT_OFF)) PSU_OFF(); else PSU_ON(); - #endif - #if EITHER(DISABLE_DEBUG, DISABLE_JTAG) // Disable any hardware debug to free up pins for IO #if ENABLED(DISABLE_DEBUG) && defined(JTAGSWD_DISABLE) @@ -951,10 +945,6 @@ void setup() { OUT_WRITE(MAX6675_SS2_PIN, HIGH); // Disable #endif - #if HAS_L64XX - SETUP_RUN(L64xxManager.init()); // Set up SPI, init drivers - #endif - #if ENABLED(DUET_SMART_EFFECTOR) && PIN_EXISTS(SMART_EFFECTOR_MOD) OUT_WRITE(SMART_EFFECTOR_MOD_PIN, LOW); // Put Smart Effector into NORMAL mode #endif @@ -963,10 +953,20 @@ void setup() { SETUP_RUN(runout.setup()); #endif + #if ENABLED(PSU_CONTROL) + SETUP_LOG("PSU_CONTROL"); + powersupply_on = ENABLED(PSU_DEFAULT_OFF); + if (ENABLED(PSU_DEFAULT_OFF)) PSU_OFF(); else PSU_ON(); + #endif + #if ENABLED(POWER_LOSS_RECOVERY) SETUP_RUN(recovery.setup()); #endif + #if HAS_L64XX + SETUP_RUN(L64xxManager.init()); // Set up SPI, init drivers + #endif + #if HAS_TMC220x SETUP_RUN(tmc_serial_begin()); #endif From ee7701c15bc91f7a05f973e03624fb14815f5027 Mon Sep 17 00:00:00 2001 From: jbuck2005 <59450931+jbuck2005@users.noreply.github.com> Date: Sat, 27 Feb 2021 16:54:43 -0500 Subject: [PATCH 050/253] SPEED => FEEDRATE (#21217) --- Marlin/Configuration.h | 6 +++--- Marlin/Configuration_adv.h | 2 +- Marlin/src/gcode/bedlevel/abl/G29.cpp | 2 +- Marlin/src/inc/Conditionals_post.h | 4 ++-- Marlin/src/inc/SanityCheck.h | 8 +++++++- Marlin/src/lcd/menu/menu_bed_corners.cpp | 2 +- Marlin/src/lcd/menu/menu_probe_offset.cpp | 2 +- Marlin/src/module/motion.cpp | 6 +++--- Marlin/src/module/motion.h | 6 +++--- Marlin/src/module/probe.cpp | 4 ++-- 10 files changed, 24 insertions(+), 18 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index b50c884b7e..34f47bf485 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -1047,13 +1047,13 @@ #define PROBING_MARGIN 10 // X and Y axis travel speed (mm/min) between probes -#define XY_PROBE_SPEED (133*60) +#define XY_PROBE_FEEDRATE (133*60) // Feedrate (mm/min) for the first approach when double-probing (MULTIPLE_PROBING == 2) -#define Z_PROBE_SPEED_FAST (4*60) +#define Z_PROBE_FEEDRATE_FAST (4*60) // Feedrate (mm/min) for the "accurate" probe of each point -#define Z_PROBE_SPEED_SLOW (Z_PROBE_SPEED_FAST / 2) +#define Z_PROBE_FEEDRATE_SLOW (Z_PROBE_FEEDRATE_FAST / 2) /** * Probe Activation Switch diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 0cb78731eb..2fbcf259f6 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -924,7 +924,7 @@ // increments while checking for the contact to be broken. #define BACKLASH_MEASUREMENT_LIMIT 0.5 // (mm) #define BACKLASH_MEASUREMENT_RESOLUTION 0.005 // (mm) - #define BACKLASH_MEASUREMENT_FEEDRATE Z_PROBE_SPEED_SLOW // (mm/min) + #define BACKLASH_MEASUREMENT_FEEDRATE Z_PROBE_FEEDRATE_SLOW // (mm/min) #endif #endif #endif diff --git a/Marlin/src/gcode/bedlevel/abl/G29.cpp b/Marlin/src/gcode/bedlevel/abl/G29.cpp index b1e9fcedaa..233e7f7415 100644 --- a/Marlin/src/gcode/bedlevel/abl/G29.cpp +++ b/Marlin/src/gcode/bedlevel/abl/G29.cpp @@ -359,7 +359,7 @@ G29_TYPE GcodeSuite::G29() { #if ABL_GRID - xy_probe_feedrate_mm_s = MMM_TO_MMS(parser.linearval('S', XY_PROBE_SPEED)); + xy_probe_feedrate_mm_s = MMM_TO_MMS(parser.linearval('S', XY_PROBE_FEEDRATE)); const float x_min = probe.min_x(), x_max = probe.max_x(), y_min = probe.min_y(), y_max = probe.max_y(); diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index 6de98e2a0e..c800a52fb8 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -2479,8 +2479,8 @@ #ifndef Z_PROBE_OFFSET_RANGE_MAX #define Z_PROBE_OFFSET_RANGE_MAX 20 #endif - #ifndef XY_PROBE_SPEED - #define XY_PROBE_SPEED ((homing_feedrate_mm_m.x + homing_feedrate_mm_m.y) / 2) + #ifndef XY_PROBE_FEEDRATE + #define XY_PROBE_FEEDRATE ((homing_feedrate_mm_m.x + homing_feedrate_mm_m.y) / 2) #endif #ifndef NOZZLE_TO_PROBE_OFFSET #define NOZZLE_TO_PROBE_OFFSET { 0, 0, 0 } diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 210848d80b..f606ea5d9a 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -131,7 +131,13 @@ #elif defined(DEFAULT_XYJERK) #error "DEFAULT_XYJERK is deprecated. Use DEFAULT_XJERK and DEFAULT_YJERK instead." #elif defined(XY_TRAVEL_SPEED) - #error "XY_TRAVEL_SPEED is deprecated. Use XY_PROBE_SPEED instead." + #error "XY_TRAVEL_SPEED is now XY_PROBE_FEEDRATE." +#elif defined(XY_PROBE_SPEED) + #error "XY_PROBE_SPEED is now XY_PROBE_FEEDRATE." +#elif defined(Z_PROBE_SPEED_FAST) + #error "Z_PROBE_SPEED_FAST is now Z_PROBE_FEEDRATE_FAST." +#elif defined(Z_PROBE_SPEED_SLOW) + #error "Z_PROBE_SPEED_SLOW is now Z_PROBE_FEEDRATE_SLOW." #elif defined(PROBE_SERVO_DEACTIVATION_DELAY) #error "PROBE_SERVO_DEACTIVATION_DELAY is deprecated. Use DEACTIVATE_SERVOS_AFTER_MOVE instead." #elif defined(SERVO_DEACTIVATION_DELAY) diff --git a/Marlin/src/lcd/menu/menu_bed_corners.cpp b/Marlin/src/lcd/menu/menu_bed_corners.cpp index 505b31876a..0dae8dbf41 100644 --- a/Marlin/src/lcd/menu/menu_bed_corners.cpp +++ b/Marlin/src/lcd/menu/menu_bed_corners.cpp @@ -224,7 +224,7 @@ static inline void _lcd_level_bed_corners_get_next_position() { bool _lcd_level_bed_corners_probe(bool verify=false) { if (verify) do_blocking_move_to_z(current_position.z + LEVEL_CORNERS_Z_HOP); // do clearance if needed TERN_(BLTOUCH_SLOW_MODE, bltouch.deploy()); // Deploy in LOW SPEED MODE on every probe action - do_blocking_move_to_z(last_z - LEVEL_CORNERS_PROBE_TOLERANCE, MMM_TO_MMS(Z_PROBE_SPEED_SLOW)); // Move down to lower tolerance + do_blocking_move_to_z(last_z - LEVEL_CORNERS_PROBE_TOLERANCE, MMM_TO_MMS(Z_PROBE_FEEDRATE_SLOW)); // Move down to lower tolerance if (TEST(endstops.trigger_state(), TERN(Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN, Z_MIN, Z_MIN_PROBE))) { // check if probe triggered endstops.hit_on_purpose(); set_current_from_steppers_for_axis(Z_AXIS); diff --git a/Marlin/src/lcd/menu/menu_probe_offset.cpp b/Marlin/src/lcd/menu/menu_probe_offset.cpp index 2f0c37b433..3b3fa0fd2a 100644 --- a/Marlin/src/lcd/menu/menu_probe_offset.cpp +++ b/Marlin/src/lcd/menu/menu_probe_offset.cpp @@ -145,7 +145,7 @@ void prepare_for_probe_offset_wizard() { // Move Nozzle to Probing/Homing Position ui.wait_for_move = true; current_position += probe.offset_xy; - line_to_current_position(MMM_TO_MMS(XY_PROBE_SPEED)); + line_to_current_position(MMM_TO_MMS(XY_PROBE_FEEDRATE)); ui.synchronize(GET_TEXT(MSG_PROBE_WIZARD_MOVING)); ui.wait_for_move = false; diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index 3e79e7dabf..580700bfe2 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -180,7 +180,7 @@ xyz_pos_t cartes; #endif #if HAS_ABL_NOT_UBL - feedRate_t xy_probe_feedrate_mm_s = MMM_TO_MMS(XY_PROBE_SPEED); + feedRate_t xy_probe_feedrate_mm_s = MMM_TO_MMS(XY_PROBE_FEEDRATE); #endif /** @@ -1151,7 +1151,7 @@ void prepare_line_to_destination() { */ feedRate_t get_homing_bump_feedrate(const AxisEnum axis) { #if HOMING_Z_WITH_PROBE - if (axis == Z_AXIS) return MMM_TO_MMS(Z_PROBE_SPEED_SLOW); + if (axis == Z_AXIS) return MMM_TO_MMS(Z_PROBE_FEEDRATE_SLOW); #endif static const uint8_t homing_bump_divisor[] PROGMEM = HOMING_BUMP_DIVISOR; uint8_t hbd = pgm_read_byte(&homing_bump_divisor[axis]); @@ -1569,7 +1569,7 @@ void prepare_line_to_destination() { if (bump) { // Move away from the endstop by the axis HOMING_BUMP_MM if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Move Away: ", -bump, "mm"); - do_homing_move(axis, -bump, TERN0(HOMING_Z_WITH_PROBE, axis == Z_AXIS) ? MMM_TO_MMS(Z_PROBE_SPEED_FAST) : 0, false); + do_homing_move(axis, -bump, TERN0(HOMING_Z_WITH_PROBE, axis == Z_AXIS) ? MMM_TO_MMS(Z_PROBE_FEEDRATE_FAST) : 0, false); #if ENABLED(DETECT_BROKEN_ENDSTOP) // Check for a broken endstop diff --git a/Marlin/src/module/motion.h b/Marlin/src/module/motion.h index c8fb2c639b..2595084b4a 100644 --- a/Marlin/src/module/motion.h +++ b/Marlin/src/module/motion.h @@ -59,13 +59,13 @@ extern xyz_pos_t cartes; #if HAS_ABL_NOT_UBL extern feedRate_t xy_probe_feedrate_mm_s; #define XY_PROBE_FEEDRATE_MM_S xy_probe_feedrate_mm_s -#elif defined(XY_PROBE_SPEED) - #define XY_PROBE_FEEDRATE_MM_S MMM_TO_MMS(XY_PROBE_SPEED) +#elif defined(XY_PROBE_FEEDRATE) + #define XY_PROBE_FEEDRATE_MM_S MMM_TO_MMS(XY_PROBE_FEEDRATE) #else #define XY_PROBE_FEEDRATE_MM_S PLANNER_XY_FEEDRATE() #endif -constexpr feedRate_t z_probe_fast_mm_s = MMM_TO_MMS(Z_PROBE_SPEED_FAST); +constexpr feedRate_t z_probe_fast_mm_s = MMM_TO_MMS(Z_PROBE_FEEDRATE_FAST); /** * Feed rates are often configured with mm/m diff --git a/Marlin/src/module/probe.cpp b/Marlin/src/module/probe.cpp index d29123bf4d..d7fafc8932 100644 --- a/Marlin/src/module/probe.cpp +++ b/Marlin/src/module/probe.cpp @@ -619,7 +619,7 @@ float Probe::run_z_probe(const bool sanity_check/*=true*/) { // Raise to give the probe clearance do_blocking_move_to_z(current_position.z + Z_CLEARANCE_MULTI_PROBE, z_probe_fast_mm_s); - #elif Z_PROBE_SPEED_FAST != Z_PROBE_SPEED_SLOW + #elif Z_PROBE_FEEDRATE_FAST != Z_PROBE_FEEDRATE_SLOW // If the nozzle is well over the travel height then // move down quickly before doing the slow probe @@ -650,7 +650,7 @@ float Probe::run_z_probe(const bool sanity_check/*=true*/) { if (TERN0(PROBE_TARE, tare())) return true; // Probe downward slowly to find the bed - if (try_to_probe(PSTR("SLOW"), z_probe_low_point, MMM_TO_MMS(Z_PROBE_SPEED_SLOW), + if (try_to_probe(PSTR("SLOW"), z_probe_low_point, MMM_TO_MMS(Z_PROBE_FEEDRATE_SLOW), sanity_check, Z_CLEARANCE_MULTI_PROBE) ) return NAN; TERN_(MEASURE_BACKLASH_WHEN_PROBING, backlash.measure_with_probe()); From e0aa9ce372710d2bd1147ab0779072e6a02b61c9 Mon Sep 17 00:00:00 2001 From: LinFor Date: Sun, 28 Feb 2021 01:06:48 +0300 Subject: [PATCH 051/253] RGB Caselight (#20341) --- Marlin/Configuration.h | 1 + Marlin/Configuration_adv.h | 13 +++++++++---- Marlin/src/MarlinCore.cpp | 5 +---- Marlin/src/feature/caselight.cpp | 22 +++++++++++++++------- Marlin/src/feature/caselight.h | 26 ++++++++++++++++---------- Marlin/src/feature/leds/leds.cpp | 22 +++++++++++++++------- Marlin/src/feature/leds/leds.h | 2 ++ Marlin/src/feature/leds/neopixel.cpp | 2 +- Marlin/src/gcode/host/M115.cpp | 2 +- Marlin/src/inc/Conditionals_adv.h | 9 +++++++++ Marlin/src/inc/SanityCheck.h | 6 ++++-- Marlin/src/lcd/menu/menu_led.cpp | 11 +++++++---- Marlin/src/pins/pins_postprocess.h | 4 ++++ buildroot/tests/DUE-tests | 2 +- 14 files changed, 86 insertions(+), 41 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 34f47bf485..c813093554 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -2650,6 +2650,7 @@ // Use a single NeoPixel LED for static (background) lighting //#define NEOPIXEL_BKGD_LED_INDEX 0 // Index of the LED to use //#define NEOPIXEL_BKGD_COLOR { 255, 255, 255, 0 } // R, G, B, W + //#define NEOPIXEL_BKGD_ALWAYS_ON // Keep the backlight on when other NeoPixels are off #endif /** diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 2fbcf259f6..76a6a0bb58 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -519,12 +519,17 @@ #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_BRIGHTNESS 105 // Set default power-up brightness (0-255, requires PWM pin) + //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. //#define CASE_LIGHT_MAX_PWM 128 // Limit PWM duty cycle (0-255) //#define CASE_LIGHT_MENU // Add Case Light options to the LCD menu - //#define CASE_LIGHT_NO_BRIGHTNESS // Disable brightness control. Enable for non-PWM lighting. - //#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 } + #if ENABLED(NEOPIXEL_LED) + //#define CASE_LIGHT_USE_NEOPIXEL // Use NeoPixel LED as case light + #endif + #if EITHER(RGB_LED, RGBW_LED) + //#define CASE_LIGHT_USE_RGB_LED // Use RGB / RGBW LED as case light + #endif + #if EITHER(CASE_LIGHT_USE_NEOPIXEL, CASE_LIGHT_USE_RGB_LED) + #define CASE_LIGHT_DEFAULT_COLOR { 255, 255, 255, 255 } // { Red, Green, Blue, White } #endif #endif diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index aa92c99940..723276da24 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -1136,10 +1136,7 @@ void setup() { #endif #if ENABLED(CASE_LIGHT_ENABLE) - #if DISABLED(CASE_LIGHT_USE_NEOPIXEL) - if (PWM_PIN(CASE_LIGHT_PIN)) SET_PWM(CASE_LIGHT_PIN); else SET_OUTPUT(CASE_LIGHT_PIN); - #endif - SETUP_RUN(caselight.update_brightness()); + SETUP_RUN(caselight.init()); #endif #if HAS_PRUSA_MMU1 diff --git a/Marlin/src/feature/caselight.cpp b/Marlin/src/feature/caselight.cpp index 0eba102a04..d4cc6b1504 100644 --- a/Marlin/src/feature/caselight.cpp +++ b/Marlin/src/feature/caselight.cpp @@ -28,6 +28,10 @@ CaseLight caselight; +#if CASE_LIGHT_IS_COLOR_LED + #include "leds/leds.h" +#endif + #if CASELIGHT_USES_BRIGHTNESS && !defined(CASE_LIGHT_DEFAULT_BRIGHTNESS) #define CASE_LIGHT_DEFAULT_BRIGHTNESS 0 // For use on PWM pin as non-PWM just sets a default #endif @@ -38,10 +42,10 @@ CaseLight caselight; bool CaseLight::on = CASE_LIGHT_DEFAULT_ON; -#if ENABLED(CASE_LIGHT_USE_NEOPIXEL) +#if CASE_LIGHT_IS_COLOR_LED LEDColor CaseLight::color = - #ifdef CASE_LIGHT_NEOPIXEL_COLOR - CASE_LIGHT_NEOPIXEL_COLOR + #ifdef CASE_LIGHT_DEFAULT_COLOR + CASE_LIGHT_DEFAULT_COLOR #else { 255, 255, 255, 255 } #endif @@ -71,17 +75,17 @@ void CaseLight::update(const bool sflag) { const uint8_t i = on ? brightness : 0, n10ct = INVERT_CASE_LIGHT ? 255 - i : i; #endif - #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) + #if CASE_LIGHT_IS_COLOR_LED leds.set_color( MakeLEDColor(color.r, color.g, color.b, color.w, n10ct), false ); - #else // !CASE_LIGHT_USE_NEOPIXEL + #else // !CASE_LIGHT_IS_COLOR_LED #if CASELIGHT_USES_BRIGHTNESS - if (PWM_PIN(CASE_LIGHT_PIN)) + if (pin_is_pwm()) analogWrite(pin_t(CASE_LIGHT_PIN), ( #if CASE_LIGHT_MAX_PWM == 255 n10ct @@ -96,7 +100,11 @@ void CaseLight::update(const bool sflag) { WRITE(CASE_LIGHT_PIN, s ? HIGH : LOW); } - #endif // !CASE_LIGHT_USE_NEOPIXEL + #endif // !CASE_LIGHT_IS_COLOR_LED + + #if ENABLED(CASE_LIGHT_USE_RGB_LED) + if (leds.lights_on) leds.update(); else leds.set_off(); + #endif } #endif // CASE_LIGHT_ENABLE diff --git a/Marlin/src/feature/caselight.h b/Marlin/src/feature/caselight.h index 2198c85f2a..25bcb486fa 100644 --- a/Marlin/src/feature/caselight.h +++ b/Marlin/src/feature/caselight.h @@ -21,10 +21,10 @@ */ #pragma once -#include "../inc/MarlinConfigPre.h" +#include "../inc/MarlinConfig.h" -#if ENABLED(CASE_LIGHT_USE_NEOPIXEL) - #include "leds/leds.h" +#if CASE_LIGHT_IS_COLOR_LED + #include "leds/leds.h" // for LEDColor #endif #if DISABLED(CASE_LIGHT_NO_BRIGHTNESS) || ENABLED(CASE_LIGHT_USE_NEOPIXEL) @@ -33,19 +33,25 @@ class CaseLight { public: - #if CASELIGHT_USES_BRIGHTNESS - static uint8_t brightness; - #endif static bool on; + TERN_(CASELIGHT_USES_BRIGHTNESS, static uint8_t brightness); + + static bool pin_is_pwm() { return TERN0(NEED_CASE_LIGHT_PIN, PWM_PIN(CASE_LIGHT_PIN)); } + static bool has_brightness() { return TERN0(CASELIGHT_USES_BRIGHTNESS, TERN(CASE_LIGHT_USE_NEOPIXEL, true, pin_is_pwm())); } + + static void init() { + #if NEED_CASE_LIGHT_PIN + if (pin_is_pwm()) SET_PWM(CASE_LIGHT_PIN); else SET_OUTPUT(CASE_LIGHT_PIN); + #endif + update_brightness(); + } static void update(const bool sflag); static inline void update_brightness() { update(false); } - static inline void update_enabled() { update(true); } + static inline void update_enabled() { update(true); } private: - #if ENABLED(CASE_LIGHT_USE_NEOPIXEL) - static LEDColor color; - #endif + TERN_(CASE_LIGHT_IS_COLOR_LED, static LEDColor color); }; extern CaseLight caselight; diff --git a/Marlin/src/feature/leds/leds.cpp b/Marlin/src/feature/leds/leds.cpp index c8cbdec33b..ef0561a435 100644 --- a/Marlin/src/feature/leds/leds.cpp +++ b/Marlin/src/feature/leds/leds.cpp @@ -42,6 +42,10 @@ #include "pca9533.h" #endif +#if ENABLED(CASE_LIGHT_USE_RGB_LED) + #include "../../feature/caselight.h" +#endif + #if ENABLED(LED_COLOR_PRESETS) const LEDColor LEDLights::defaultLEDColor = MakeLEDColor( LED_USER_PRESET_RED, LED_USER_PRESET_GREEN, LED_USER_PRESET_BLUE, @@ -85,8 +89,11 @@ void LEDLights::set_color(const LEDColor &incol #ifdef NEOPIXEL_BKGD_LED_INDEX if (NEOPIXEL_BKGD_LED_INDEX == nextLed) { - if (++nextLed >= neo.pixels()) nextLed = 0; - return; + neo.set_color_background(); + if (++nextLed >= neo.pixels()) { + nextLed = 0; + return; + } } #endif @@ -114,12 +121,13 @@ void LEDLights::set_color(const LEDColor &incol // This variant uses 3-4 separate pins for the RGB(W) components. // If the pins can do PWM then their intensity will be set. - #define UPDATE_RGBW(C,c) do { \ - if (PWM_PIN(RGB_LED_##C##_PIN)) \ - analogWrite(pin_t(RGB_LED_##C##_PIN), incol.c); \ - else \ - WRITE(RGB_LED_##C##_PIN, incol.c ? HIGH : LOW); \ + #define _UPDATE_RGBW(C,c) do { \ + if (PWM_PIN(RGB_LED_##C##_PIN)) \ + analogWrite(pin_t(RGB_LED_##C##_PIN), c); \ + else \ + WRITE(RGB_LED_##C##_PIN, c ? HIGH : LOW); \ }while(0) + #define UPDATE_RGBW(C,c) _UPDATE_RGBW(C, TERN1(CASE_LIGHT_USE_RGB_LED, caselight.on) ? incol.c : 0) UPDATE_RGBW(R,r); UPDATE_RGBW(G,g); UPDATE_RGBW(B,b); #if ENABLED(RGBW_LED) UPDATE_RGBW(W,w); diff --git a/Marlin/src/feature/leds/leds.h b/Marlin/src/feature/leds/leds.h index d41c61144a..c34eb57f44 100644 --- a/Marlin/src/feature/leds/leds.h +++ b/Marlin/src/feature/leds/leds.h @@ -194,6 +194,8 @@ public: #if ENABLED(LED_CONTROL_MENU) static void toggle(); // swap "off" with color + #endif + #if EITHER(LED_CONTROL_MENU, CASE_LIGHT_USE_RGB_LED) static inline void update() { set_color(color); } #endif diff --git a/Marlin/src/feature/leds/neopixel.cpp b/Marlin/src/feature/leds/neopixel.cpp index 27bbeb348c..6f5ea0540a 100644 --- a/Marlin/src/feature/leds/neopixel.cpp +++ b/Marlin/src/feature/leds/neopixel.cpp @@ -60,7 +60,7 @@ void Marlin_NeoPixel::set_color(const uint32_t color) { else { for (uint16_t i = 0; i < pixels(); ++i) { #ifdef NEOPIXEL_BKGD_LED_INDEX - if (i == NEOPIXEL_BKGD_LED_INDEX && color != 0x000000) { + if (i == NEOPIXEL_BKGD_LED_INDEX && TERN(ENABLED(NEOPIXEL_BKGD_ALWAYS_ON), true, color != 0x000000)) { set_color_background(); continue; } diff --git a/Marlin/src/gcode/host/M115.cpp b/Marlin/src/gcode/host/M115.cpp index 0501f3f60b..40fdbd6d3a 100644 --- a/Marlin/src/gcode/host/M115.cpp +++ b/Marlin/src/gcode/host/M115.cpp @@ -106,7 +106,7 @@ void GcodeSuite::M115() { // TOGGLE_LIGHTS (M355) cap_line(PSTR("TOGGLE_LIGHTS"), ENABLED(CASE_LIGHT_ENABLE)); - cap_line(PSTR("CASE_LIGHT_BRIGHTNESS"), TERN0(CASE_LIGHT_ENABLE, TERN0(CASELIGHT_USES_BRIGHTNESS, TERN(CASE_LIGHT_USE_NEOPIXEL, true, PWM_PIN(CASE_LIGHT_PIN))))); + cap_line(PSTR("CASE_LIGHT_BRIGHTNESS"), TERN0(CASE_LIGHT_ENABLE, caselight.has_brightness())); // EMERGENCY_PARSER (M108, M112, M410, M876) cap_line(PSTR("EMERGENCY_PARSER"), ENABLED(EMERGENCY_PARSER)); diff --git a/Marlin/src/inc/Conditionals_adv.h b/Marlin/src/inc/Conditionals_adv.h index c2ba04f0bc..b8464df3dd 100644 --- a/Marlin/src/inc/Conditionals_adv.h +++ b/Marlin/src/inc/Conditionals_adv.h @@ -506,6 +506,15 @@ #define NEED_HEX_PRINT 1 #endif +// Flags for Case Light having a color property or a single pin +#if ENABLED(CASE_LIGHT_ENABLE) + #if EITHER(CASE_LIGHT_USE_NEOPIXEL, CASE_LIGHT_USE_RGB_LED) + #define CASE_LIGHT_IS_COLOR_LED 1 + #else + #define NEED_CASE_LIGHT_PIN 1 + #endif +#endif + // Flag whether least_squares_fit.cpp is used #if ANY(AUTO_BED_LEVELING_UBL, AUTO_BED_LEVELING_LINEAR, Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS) #define NEED_LSF 1 diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index f606ea5d9a..9dc64e6bf5 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -437,6 +437,8 @@ #error "DUAL_NOZZLE_DUPLICATION_MODE is now MULTI_NOZZLE_DUPLICATION." #elif defined(MENU_ITEM_CASE_LIGHT) #error "MENU_ITEM_CASE_LIGHT is now CASE_LIGHT_MENU." +#elif defined(CASE_LIGHT_NEOPIXEL_COLOR) + #error "CASE_LIGHT_NEOPIXEL_COLOR is now CASE_LIGHT_DEFAULT_COLOR." #elif defined(ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED) #error "ABORT_ON_ENDSTOP_HIT_FEATURE_ENABLED is now SD_ABORT_ON_ENDSTOP_HIT." #elif defined(LPC_SD_LCD) || defined(LPC_SD_ONBOARD) || defined(LPC_SD_CUSTOM_CABLE) @@ -1704,9 +1706,9 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal /** * Case Light requirements */ -#if ENABLED(CASE_LIGHT_ENABLE) +#if NEED_CASE_LIGHT_PIN #if !PIN_EXISTS(CASE_LIGHT) - #error "CASE_LIGHT_ENABLE requires CASE_LIGHT_PIN to be defined." + #error "CASE_LIGHT_ENABLE requires CASE_LIGHT_PIN, CASE_LIGHT_USE_NEOPIXEL, or CASE_LIGHT_USE_RGB_LED." #elif CASE_LIGHT_PIN == FAN_PIN #error "CASE_LIGHT_PIN conflicts with FAN_PIN. Resolve before continuing." #endif diff --git a/Marlin/src/lcd/menu/menu_led.cpp b/Marlin/src/lcd/menu/menu_led.cpp index de57502788..5ab5e8a9d8 100644 --- a/Marlin/src/lcd/menu/menu_led.cpp +++ b/Marlin/src/lcd/menu/menu_led.cpp @@ -105,12 +105,14 @@ #if ENABLED(CASE_LIGHT_MENU) #include "../../feature/caselight.h" + #define CASELIGHT_TOGGLE_ITEM() EDIT_ITEM(bool, MSG_CASE_LIGHT, (bool*)&caselight.on, caselight.update_enabled) + #if CASELIGHT_USES_BRIGHTNESS void menu_case_light() { START_MENU(); BACK_ITEM(MSG_CONFIGURATION); EDIT_ITEM(percent, MSG_CASE_LIGHT_BRIGHTNESS, &caselight.brightness, 0, 255, caselight.update_brightness, true); - EDIT_ITEM(bool, MSG_CASE_LIGHT, (bool*)&caselight.on, caselight.update_enabled); + CASELIGHT_TOGGLE_ITEM(); END_MENU(); } #endif @@ -155,13 +157,14 @@ void menu_led() { // Set Case light on/off/brightness // #if ENABLED(CASE_LIGHT_MENU) - #if DISABLED(CASE_LIGHT_NO_BRIGHTNESS) - if (TERN1(CASE_LIGHT_USE_NEOPIXEL, PWM_PIN(CASE_LIGHT_PIN))) + #if CASELIGHT_USES_BRIGHTNESS + if (caselight.has_brightness()) SUBMENU(MSG_CASE_LIGHT, menu_case_light); else #endif - EDIT_ITEM(bool, MSG_CASE_LIGHT, (bool*)&caselight.on, caselight.update_enabled); + CASELIGHT_TOGGLE_ITEM(); #endif + END_MENU(); } diff --git a/Marlin/src/pins/pins_postprocess.h b/Marlin/src/pins/pins_postprocess.h index de70248d4d..d37dd4352a 100644 --- a/Marlin/src/pins/pins_postprocess.h +++ b/Marlin/src/pins/pins_postprocess.h @@ -876,5 +876,9 @@ #undef BOARD_ST7920_DELAY_3 #endif +#if !NEED_CASE_LIGHT_PIN + #undef CASE_LIGHT_PIN +#endif + #undef HAS_FREE_AUX2_PINS #undef DIAG_REMAPPED diff --git a/buildroot/tests/DUE-tests b/buildroot/tests/DUE-tests index d4c49a3185..1e22ba3370 100755 --- a/buildroot/tests/DUE-tests +++ b/buildroot/tests/DUE-tests @@ -18,7 +18,7 @@ opt_enable S_CURVE_ACCELERATION EEPROM_SETTINGS GCODE_MACROS \ ASSISTED_TRAMMING ASSISTED_TRAMMING_WIZARD REPORT_TRAMMING_MM ASSISTED_TRAMMING_WAIT_POSITION \ EEPROM_SETTINGS SDSUPPORT BINARY_FILE_TRANSFER \ BLINKM PCA9533 PCA9632 RGB_LED RGB_LED_R_PIN RGB_LED_G_PIN RGB_LED_B_PIN LED_CONTROL_MENU \ - NEOPIXEL_LED CASE_LIGHT_ENABLE CASE_LIGHT_USE_NEOPIXEL CASE_LIGHT_MENU \ + NEOPIXEL_LED CASE_LIGHT_ENABLE CASE_LIGHT_USE_NEOPIXEL CASE_LIGHT_USE_RGB_LED CASE_LIGHT_MENU \ NOZZLE_PARK_FEATURE ADVANCED_PAUSE_FEATURE FILAMENT_RUNOUT_DISTANCE_MM FILAMENT_RUNOUT_SENSOR \ AUTO_BED_LEVELING_BILINEAR Z_MIN_PROBE_REPEATABILITY_TEST DEBUG_LEVELING_FEATURE \ SKEW_CORRECTION SKEW_CORRECTION_FOR_Z SKEW_CORRECTION_GCODE CALIBRATION_GCODE \ From c76008bd6a7bc0f88fec7fa58f11cfec88ab366f Mon Sep 17 00:00:00 2001 From: Sola <42537573+solawc@users.noreply.github.com> Date: Sun, 28 Feb 2021 07:35:32 +0800 Subject: [PATCH 052/253] MKS H43 controller (#20609) --- Marlin/Configuration.h | 1 + Marlin/Configuration_adv.h | 6 +- Marlin/src/HAL/STM32/eeprom_flash.cpp | 2 +- .../shared/cpu_exception/exception_arm.cpp | 2 +- Marlin/src/HAL/shared/eeprom_if_i2c.cpp | 8 +- Marlin/src/MarlinCore.cpp | 5 + Marlin/src/gcode/sd/M24_M25.cpp | 15 +- Marlin/src/inc/Conditionals_LCD.h | 2 +- Marlin/src/inc/SanityCheck.h | 2 +- Marlin/src/lcd/extui/dgus_lcd.cpp | 7 +- Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp | 38 +- Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.h | 7 +- .../src/lcd/extui/lib/dgus/DGUSDisplayDef.h | 11 +- .../lcd/extui/lib/dgus/DGUSScreenHandler.cpp | 560 +---- .../lcd/extui/lib/dgus/DGUSScreenHandler.h | 224 +- .../lib/dgus/fysetc/DGUSScreenHandler.cpp | 418 ++++ .../extui/lib/dgus/fysetc/DGUSScreenHandler.h | 240 ++ .../lib/dgus/hiprecy/DGUSScreenHandler.cpp | 418 ++++ .../lib/dgus/hiprecy/DGUSScreenHandler.h | 240 ++ .../lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp | 795 +++++++ .../lcd/extui/lib/dgus/mks/DGUSDisplayDef.h | 908 +++++++ .../extui/lib/dgus/mks/DGUSScreenHandler.cpp | 2109 +++++++++++++++++ .../extui/lib/dgus/mks/DGUSScreenHandler.h | 307 +++ .../extui/lib/dgus/origin/DGUSDisplayDef.cpp | 6 +- .../lib/dgus/origin/DGUSScreenHandler.cpp | 418 ++++ .../extui/lib/dgus/origin/DGUSScreenHandler.h | 240 ++ .../lcd/extui/lib/mks_ui/draw_manuaLevel.cpp | 2 + .../lcd/extui/lib/mks_ui/draw_move_motor.cpp | 14 +- .../lcd/extui/lib/mks_ui/draw_ready_print.cpp | 12 +- Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h | 2 +- .../src/lcd/extui/lib/mks_ui/wifi_module.cpp | 8 +- .../src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h | 2 + platformio.ini | 5 + 33 files changed, 6314 insertions(+), 720 deletions(-) create mode 100644 Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSScreenHandler.cpp create mode 100644 Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSScreenHandler.h create mode 100644 Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSScreenHandler.cpp create mode 100644 Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSScreenHandler.h create mode 100644 Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp create mode 100644 Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.h create mode 100644 Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp create mode 100644 Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.h create mode 100644 Marlin/src/lcd/extui/lib/dgus/origin/DGUSScreenHandler.cpp create mode 100644 Marlin/src/lcd/extui/lib/dgus/origin/DGUSScreenHandler.h diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index c813093554..79b7f9dffa 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -2349,6 +2349,7 @@ //#define DGUS_LCD_UI_ORIGIN //#define DGUS_LCD_UI_FYSETC //#define DGUS_LCD_UI_HIPRECY +//#define DGUS_LCD_UI_MKS // // Touch-screen LCD for Malyan M200/M300 printers diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 76a6a0bb58..0e1cbd9a35 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1517,12 +1517,12 @@ #define DGUS_UPDATE_INTERVAL_MS 500 // (ms) Interval between automatic screen updates - #if EITHER(DGUS_LCD_UI_FYSETC, DGUS_LCD_UI_HIPRECY) + #if ANY(DGUS_LCD_UI_FYSETC, DGUS_LCD_UI_MKS, DGUS_LCD_UI_HIPRECY) #define DGUS_PRINT_FILENAME // Display the filename during printing #define DGUS_PREHEAT_UI // Display a preheat screen during heatup - #if ENABLED(DGUS_LCD_UI_FYSETC) - //#define DGUS_UI_MOVE_DIS_OPTION // Disabled by default for UI_FYSETC + #if EITHER(DGUS_LCD_UI_FYSETC, DGUS_LCD_UI_MKS) + //#define DGUS_UI_MOVE_DIS_OPTION // Disabled by default for FYSETC and MKS #else #define DGUS_UI_MOVE_DIS_OPTION // Enabled by default for UI_HIPRECY #endif diff --git a/Marlin/src/HAL/STM32/eeprom_flash.cpp b/Marlin/src/HAL/STM32/eeprom_flash.cpp index 633a286dc8..5862090f1b 100644 --- a/Marlin/src/HAL/STM32/eeprom_flash.cpp +++ b/Marlin/src/HAL/STM32/eeprom_flash.cpp @@ -48,7 +48,7 @@ #include "stm32_def.h" #define DEBUG_OUT ENABLED(EEPROM_CHITCHAT) - #include "src/core/debug_out.h" + #include "../../core/debug_out.h" #ifndef MARLIN_EEPROM_SIZE #define MARLIN_EEPROM_SIZE 0x1000 // 4KB diff --git a/Marlin/src/HAL/shared/cpu_exception/exception_arm.cpp b/Marlin/src/HAL/shared/cpu_exception/exception_arm.cpp index 090148683f..ae9600038a 100644 --- a/Marlin/src/HAL/shared/cpu_exception/exception_arm.cpp +++ b/Marlin/src/HAL/shared/cpu_exception/exception_arm.cpp @@ -283,7 +283,7 @@ void CommonHandler_C(ContextStateFrame * frame, unsigned long lr, unsigned long savedFrame.CFSR = 0; frame->pc = (uint32_t)resume_from_fault; // Patch where to return to - frame->lr = 0xdeadbeef; // If our handler returns (it shouldn't), let's make it trigger an exception immediately + frame->lr = 0xDEADBEEF; // If our handler returns (it shouldn't), let's make it trigger an exception immediately frame->xpsr = _BV(24); // Need to clean the PSR register to thumb II only MinSerial::force_using_default_output = true; return; // The CPU will resume in our handler hopefully, and we'll try to use default serial output diff --git a/Marlin/src/HAL/shared/eeprom_if_i2c.cpp b/Marlin/src/HAL/shared/eeprom_if_i2c.cpp index cc22bf7d98..da70af2772 100644 --- a/Marlin/src/HAL/shared/eeprom_if_i2c.cpp +++ b/Marlin/src/HAL/shared/eeprom_if_i2c.cpp @@ -32,7 +32,13 @@ #include "eeprom_if.h" #include -void eeprom_init() { Wire.begin(); } +void eeprom_init() { + Wire.begin( + #if PINS_EXIST(I2C_SCL, I2C_SDA) + uint8_t(I2C_SDA_PIN), uint8_t(I2C_SCL_PIN) + #endif + ); +} #if ENABLED(USE_SHARED_EEPROM) diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 723276da24..4643328401 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -231,6 +231,10 @@ #include "feature/password/password.h" #endif +#if ENABLED(DGUS_LCD_UI_MKS) + #include "lcd/extui/lib/dgus/DGUSScreenHandler.h" +#endif + PGMSTR(M112_KILL_STR, "M112 Shutdown"); MarlinState marlin_state = MF_INITIALIZING; @@ -388,6 +392,7 @@ void startOrResumeJob() { if (queue.enqueue_one_P(PSTR("M1001"))) { marlin_state = MF_RUNNING; TERN_(PASSWORD_AFTER_SD_PRINT_END, password.lock_machine()); + TERN_(DGUS_LCD_UI_MKS, ScreenHandler.SDPrintingFinished()); } } diff --git a/Marlin/src/gcode/sd/M24_M25.cpp b/Marlin/src/gcode/sd/M24_M25.cpp index 611ba17c55..8fb529dcaa 100644 --- a/Marlin/src/gcode/sd/M24_M25.cpp +++ b/Marlin/src/gcode/sd/M24_M25.cpp @@ -41,6 +41,10 @@ #include "../../feature/powerloss.h" #endif +#if ENABLED(DGUS_LCD_UI_MKS) + #include "../../lcd/extui/lib/dgus/DGUSDisplayDef.h" +#endif + #include "../../MarlinCore.h" // for startOrResumeJob /** @@ -48,6 +52,11 @@ */ void GcodeSuite::M24() { + #if ENABLED(DGUS_LCD_UI_MKS) + if ((print_job_timer.isPaused() || print_job_timer.isRunning()) && !parser.seen("ST")) + MKS_resume_print_move(); + #endif + #if ENABLED(POWER_LOSS_RECOVERY) if (parser.seenval('S')) card.setIndex(parser.value_long()); if (parser.seenval('T')) print_job_timer.resume(parser.value_long()); @@ -98,9 +107,9 @@ void GcodeSuite::M25() { print_job_timer.pause(); - #if DISABLED(DWIN_CREALITY_LCD) - ui.reset_status(); - #endif + TERN_(DGUS_LCD_UI_MKS, MKS_pause_print_move()); + + IF_DISABLED(DWIN_CREALITY_LCD, ui.reset_status()); #if ENABLED(HOST_ACTION_COMMANDS) TERN_(HOST_PROMPT_SUPPORT, host_prompt_open(PROMPT_PAUSE_RESUME, PSTR("Pause SD"), PSTR("Resume"))); diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index 3e20bb90c0..c8b683ecf9 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -451,7 +451,7 @@ #endif // Aliases for LCD features -#if ANY(DGUS_LCD_UI_ORIGIN, DGUS_LCD_UI_FYSETC, DGUS_LCD_UI_HIPRECY) +#if ANY(DGUS_LCD_UI_ORIGIN, DGUS_LCD_UI_FYSETC, DGUS_LCD_UI_HIPRECY,DGUS_LCD_UI_MKS) #define HAS_DGUS_LCD 1 #endif diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 9dc64e6bf5..b6678a4bcb 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -2324,7 +2324,7 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal + (DISABLED(IS_LEGACY_TFT) && ENABLED(TFT_GENERIC)) \ + (ENABLED(IS_LEGACY_TFT) && COUNT_ENABLED(TFT_320x240, TFT_320x240_SPI, TFT_480x320, TFT_480x320_SPI)) \ + COUNT_ENABLED(ANYCUBIC_LCD_I3MEGA, ANYCUBIC_LCD_CHIRON, ANYCUBIC_TFT35) \ - + COUNT_ENABLED(DGUS_LCD_UI_ORIGIN, DGUS_LCD_UI_FYSETC, DGUS_LCD_UI_HIPRECY) \ + + COUNT_ENABLED(DGUS_LCD_UI_ORIGIN, DGUS_LCD_UI_FYSETC, DGUS_LCD_UI_HIPRECY,DGUS_LCD_UI_MKS) \ + COUNT_ENABLED(ENDER2_STOCKDISPLAY, CR10_STOCKDISPLAY, DWIN_CREALITY_LCD) \ + COUNT_ENABLED(FYSETC_MINI_12864_X_X, FYSETC_MINI_12864_1_2, FYSETC_MINI_12864_2_0, FYSETC_MINI_12864_2_1, FYSETC_GENERIC_12864_1_1) \ + COUNT_ENABLED(LCD_SAINSMART_I2C_1602, LCD_SAINSMART_I2C_2004) \ diff --git a/Marlin/src/lcd/extui/dgus_lcd.cpp b/Marlin/src/lcd/extui/dgus_lcd.cpp index 9fcb6c8d13..9e6ca1b64c 100644 --- a/Marlin/src/lcd/extui/dgus_lcd.cpp +++ b/Marlin/src/lcd/extui/dgus_lcd.cpp @@ -21,9 +21,7 @@ */ /** - * dgus_lcd.cpp - * - * DGUS implementation for Marlin by coldtobi, Feb-May 2019 + * lcd/extui/dgus_lcd.cpp */ #include "../../inc/MarlinConfigPre.h" @@ -125,11 +123,10 @@ namespace ExtUI { #if ENABLED(POWER_LOSS_RECOVERY) void onPowerLossResume() { // Called on resume from power-loss - ScreenHandler.GotoScreen(DGUSLCD_SCREEN_POWER_LOSS); + IF_DISABLED(DGUS_LCD_UI_MKS, ScreenHandler.GotoScreen(DGUSLCD_SCREEN_POWER_LOSS)); } #endif - #if HAS_PID_HEATING void onPidTuning(const result_t rst) { // Called for temperature PID tuning result diff --git a/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp b/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp index c7cd76733f..702c5cc47e 100644 --- a/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp @@ -20,14 +20,12 @@ * */ -/* DGUS implementation written by coldtobi in 2019 for Marlin */ - #include "../../../../inc/MarlinConfigPre.h" #if HAS_DGUS_LCD #if HOTENDS > 2 - #error "More than 2 hotends not implemented on the Display UI design." + #warning "More than 2 hotends not implemented on DGUS Display UI." #endif #include "../../ui_api.h" @@ -46,6 +44,8 @@ #include "DGUSVPVariable.h" #include "DGUSDisplayDef.h" +DGUSDisplay dgusdisplay; + // Preamble... 2 Bytes, usually 0x5A 0xA5, but configurable constexpr uint8_t DGUS_HEADER1 = 0x5A; constexpr uint8_t DGUS_HEADER2 = 0xA5; @@ -62,8 +62,10 @@ void DGUSDisplay::InitDisplay() { #define LCD_BAUDRATE 115200 #endif LCD_SERIAL.begin(LCD_BAUDRATE); - if (TERN1(POWER_LOSS_RECOVERY, !recovery.valid())) - RequestScreen(TERN(SHOW_BOOTSCREEN, DGUSLCD_SCREEN_BOOT, DGUSLCD_SCREEN_MAIN)); + #if BOTH(DGUS_LCD_UI_MKS, POWER_LOSS_RECOVERY) + if (!recovery.valid()) delay(LOGO_TIME_DELAY); + #endif + RequestScreen(TERN(SHOW_BOOTSCREEN, DGUSLCD_SCREEN_BOOT, DGUSLCD_SCREEN_MAIN)); } void DGUSDisplay::WriteVariable(uint16_t adr, const void* values, uint8_t valueslen, bool isstr) { @@ -82,12 +84,12 @@ void DGUSDisplay::WriteVariable(uint16_t adr, const void* values, uint8_t values } void DGUSDisplay::WriteVariable(uint16_t adr, uint16_t value) { - value = (value & 0xffU) << 8U | (value >> 8U); + value = (value & 0xFFU) << 8U | (value >> 8U); WriteVariable(adr, static_cast(&value), sizeof(uint16_t)); } void DGUSDisplay::WriteVariable(uint16_t adr, int16_t value) { - value = (value & 0xffU) << 8U | (value >> 8U); + value = (value & 0xFFU) << 8U | (value >> 8U); WriteVariable(adr, static_cast(&value), sizeof(uint16_t)); } @@ -99,15 +101,21 @@ void DGUSDisplay::WriteVariable(uint16_t adr, int8_t value) { WriteVariable(adr, static_cast(&value), sizeof(int8_t)); } +#if ENABLED(DGUS_LCD_UI_MKS) + void DGUSDisplay::MKS_WriteVariable(uint16_t adr, uint8_t value) { + WriteVariable(adr, static_cast(&value), sizeof(uint8_t)); + } +#endif + void DGUSDisplay::WriteVariable(uint16_t adr, long value) { - union { long l; char lb[4]; } endian; - char tmp[4]; - endian.l = value; - tmp[0] = endian.lb[3]; - tmp[1] = endian.lb[2]; - tmp[2] = endian.lb[1]; - tmp[3] = endian.lb[0]; - WriteVariable(adr, static_cast(&tmp), sizeof(long)); + union { long l; char lb[4]; } endian; + char tmp[4]; + endian.l = value; + tmp[0] = endian.lb[3]; + tmp[1] = endian.lb[2]; + tmp[2] = endian.lb[1]; + tmp[3] = endian.lb[0]; + WriteVariable(adr, static_cast(&tmp), sizeof(long)); } void DGUSDisplay::WriteVariablePGM(uint16_t adr, const void* values, uint8_t valueslen, bool isstr) { diff --git a/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.h b/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.h index 88c119566c..6e0ee3053f 100644 --- a/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.h +++ b/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.h @@ -21,7 +21,9 @@ */ #pragma once -/* DGUS implementation written by coldtobi in 2019 for Marlin */ +/** + * lcd/extui/lib/dgus/DGUSDisplay.h + */ #include "../../../../inc/MarlinConfigPre.h" @@ -34,6 +36,7 @@ enum DGUSLCD_Screens : uint8_t; +//#define DEBUG_DGUSLCD #define DEBUG_OUT ENABLED(DEBUG_DGUSLCD) #include "../../../../core/debug_out.h" @@ -60,6 +63,8 @@ public: static void WriteVariable(uint16_t adr, uint8_t value); static void WriteVariable(uint16_t adr, int8_t value); static void WriteVariable(uint16_t adr, long value); + static void MKS_WriteVariable(uint16_t adr, uint8_t value); + // Utility functions for bridging ui_api and dbus template diff --git a/Marlin/src/lcd/extui/lib/dgus/DGUSDisplayDef.h b/Marlin/src/lcd/extui/lib/dgus/DGUSDisplayDef.h index b34a04875d..0b68943593 100644 --- a/Marlin/src/lcd/extui/lib/dgus/DGUSDisplayDef.h +++ b/Marlin/src/lcd/extui/lib/dgus/DGUSDisplayDef.h @@ -21,15 +21,16 @@ */ #pragma once -/* DGUS implementation written by coldtobi in 2019 for Marlin */ +/** + * lcd/extui/lib/dgus/DGUSDisplayDef.h + * Defines the interaction between Marlin and the display firmware + */ #include "DGUSVPVariable.h" #include -// This file defines the interaction between Marlin and the display firmware. - -// information on which screen which VP is displayed +// Information on which screen which VP is displayed. // As this is a sparse table, two arrays are needed: // one to list the VPs of one screen and one to map screens to the lists. // (Strictly this would not be necessary, but allows to only send data the display needs and reducing load on Marlin) @@ -47,6 +48,8 @@ extern const struct DGUS_VP_Variable ListOfVP[]; #if ENABLED(DGUS_LCD_UI_ORIGIN) #include "origin/DGUSDisplayDef.h" +#elif ENABLED(DGUS_LCD_UI_MKS) + #include "mks/DGUSDisplayDef.h" #elif ENABLED(DGUS_LCD_UI_FYSETC) #include "fysetc/DGUSDisplayDef.h" #elif ENABLED(DGUS_LCD_UI_HIPRECY) diff --git a/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp index 77feacf4a9..9b0c329de2 100644 --- a/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp @@ -25,46 +25,42 @@ #if HAS_DGUS_LCD #include "DGUSScreenHandler.h" -#include "DGUSDisplay.h" -#include "DGUSVPVariable.h" -#include "DGUSDisplayDef.h" -#include "../../ui_api.h" #include "../../../../MarlinCore.h" +#include "../../../../gcode/queue.h" +#include "../../../../libs/duration_t.h" +#include "../../../../module/settings.h" #include "../../../../module/temperature.h" #include "../../../../module/motion.h" -#include "../../../../gcode/queue.h" #include "../../../../module/planner.h" -#include "../../../../sd/cardreader.h" -#include "../../../../libs/duration_t.h" #include "../../../../module/printcounter.h" +#include "../../../../sd/cardreader.h" #if ENABLED(POWER_LOSS_RECOVERY) #include "../../../../feature/powerloss.h" #endif +DGUSScreenHandler ScreenHandler; + uint16_t DGUSScreenHandler::ConfirmVP; -#if ENABLED(SDSUPPORT) - int16_t DGUSScreenHandler::top_file = 0; - int16_t DGUSScreenHandler::file_to_print = 0; - static ExtUI::FileList filelist; -#endif - -void (*DGUSScreenHandler::confirm_action_cb)() = nullptr; - -//DGUSScreenHandler ScreenHandler; - DGUSLCD_Screens DGUSScreenHandler::current_screen; DGUSLCD_Screens DGUSScreenHandler::past_screens[NUM_PAST_SCREENS]; uint8_t DGUSScreenHandler::update_ptr; uint16_t DGUSScreenHandler::skipVP; bool DGUSScreenHandler::ScreenComplete; -//DGUSDisplay dgusdisplay; +void (*DGUSScreenHandler::confirm_action_cb)() = nullptr; -// endianness swap -uint16_t swap16(const uint16_t value) { return (value & 0xffU) << 8U | (value >> 8U); } +#if ENABLED(SDSUPPORT) + int16_t DGUSScreenHandler::top_file = 0, + DGUSScreenHandler::file_to_print = 0; + static ExtUI::FileList filelist; +#endif + +#if ENABLED(DGUS_FILAMENT_LOADUNLOAD) + filament_data_t filament_data; +#endif void DGUSScreenHandler::sendinfoscreen(const char* line1, const char* line2, const char* line3, const char* line4, bool l1inflash, bool l2inflash, bool l3inflash, bool l4inflash) { DGUS_VP_Variable ramcopy; @@ -87,14 +83,12 @@ void DGUSScreenHandler::sendinfoscreen(const char* line1, const char* line2, con } void DGUSScreenHandler::HandleUserConfirmationPopUp(uint16_t VP, const char* line1, const char* line2, const char* line3, const char* line4, bool l1, bool l2, bool l3, bool l4) { - if (current_screen == DGUSLCD_SCREEN_CONFIRM) { - // Already showing a pop up, so we need to cancel that first. + if (current_screen == DGUSLCD_SCREEN_CONFIRM) // Already showing a pop up, so we need to cancel that first. PopToOldScreen(); - } ConfirmVP = VP; sendinfoscreen(line1, line2, line3, line4, l1, l2, l3, l4); - ScreenHandler.GotoScreen(DGUSLCD_SCREEN_CONFIRM); + GotoScreen(DGUSLCD_SCREEN_CONFIRM); } void DGUSScreenHandler::setstatusmessage(const char *msg) { @@ -130,7 +124,7 @@ void DGUSScreenHandler::DGUSLCD_SendPercentageToDisplay(DGUS_VP_Variable &var) { if (var.memadr) { //DEBUG_ECHOPAIR(" DGUS_LCD_SendWordValueToDisplay ", var.VP); //DEBUG_ECHOLNPAIR(" data ", *(uint16_t *)var.memadr); - uint16_t tmp = *(uint8_t *) var.memadr +1 ; // +1 -> avoid rounding issues for the display. + uint16_t tmp = *(uint8_t *) var.memadr + 1; // +1 -> avoid rounding issues for the display. tmp = map(tmp, 0, 255, 0, 100); dgusdisplay.WriteVariable(var.VP, tmp); } @@ -157,7 +151,9 @@ void DGUSScreenHandler::DGUSLCD_SendPrintTimeToDisplay(DGUS_VP_Variable &var) { void DGUSScreenHandler::DGUSLCD_PercentageToUint8(DGUS_VP_Variable &var, void *val_ptr) { if (var.memadr) { uint16_t value = swap16(*(uint16_t*)val_ptr); + DEBUG_ECHOLNPAIR("FAN value get:", value); *(uint8_t*)var.memadr = map(constrain(value, 0, 100), 0, 100, 0, 255); + DEBUG_ECHOLNPAIR("FAN value change:", *(uint8_t*)var.memadr); } } @@ -234,6 +230,7 @@ void DGUSScreenHandler::DGUSLCD_SendStringToDisplayPGM(DGUS_VP_Variable &var) { // Send fan status value to the display. #if HAS_FAN + void DGUSScreenHandler::DGUSLCD_SendFanStatusToDisplay(DGUS_VP_Variable &var) { if (var.memadr) { DEBUG_ECHOPAIR(" DGUSLCD_SendFanStatusToDisplay ", var.VP); @@ -243,6 +240,7 @@ void DGUSScreenHandler::DGUSLCD_SendStringToDisplayPGM(DGUS_VP_Variable &var) { dgusdisplay.WriteVariable(var.VP, data_to_send); } } + #endif // Send heater status value to the display. @@ -257,6 +255,7 @@ void DGUSScreenHandler::DGUSLCD_SendHeaterStatusToDisplay(DGUS_VP_Variable &var) } #if ENABLED(DGUS_UI_WAITING) + void DGUSScreenHandler::DGUSLCD_SendWaitingStatusToDisplay(DGUS_VP_Variable &var) { // In FYSETC UI design there are 10 statuses to loop static uint16_t period = 0; @@ -270,6 +269,7 @@ void DGUSScreenHandler::DGUSLCD_SendHeaterStatusToDisplay(DGUS_VP_Variable &var) period = 0; } } + #endif #if ENABLED(SDSUPPORT) @@ -319,7 +319,7 @@ void DGUSScreenHandler::DGUSLCD_SendHeaterStatusToDisplay(DGUS_VP_Variable &var) DEBUG_ECHOPAIR("new topfile adjusted:", top_file); } else if (!filelist.isAtRootDir()) { - filelist.upDir(); + IF_DISABLED(DGUS_LCD_UI_MKS, filelist.upDir()); top_file = 0; ForceCompleteUpdate(); } @@ -327,54 +327,6 @@ void DGUSScreenHandler::DGUSLCD_SendHeaterStatusToDisplay(DGUS_VP_Variable &var) if (old_top != top_file) ForceCompleteUpdate(); } - void DGUSScreenHandler::DGUSLCD_SD_FileSelected(DGUS_VP_Variable &var, void *val_ptr) { - uint16_t touched_nr = (int16_t)swap16(*(uint16_t*)val_ptr) + top_file; - if (touched_nr > filelist.count()) return; - if (!filelist.seek(touched_nr)) return; - if (filelist.isDir()) { - filelist.changeDir(filelist.filename()); - top_file = 0; - ForceCompleteUpdate(); - return; - } - - #if ENABLED(DGUS_PRINT_FILENAME) - // Send print filename - dgusdisplay.WriteVariable(VP_SD_Print_Filename, filelist.filename(), VP_SD_FileName_LEN, true); - #endif - - // Setup Confirmation screen - file_to_print = touched_nr; - HandleUserConfirmationPopUp(VP_SD_FileSelectConfirm, nullptr, PSTR("Print file"), filelist.filename(), PSTR("from SD Card?"), true, true, false, true); - } - - void DGUSScreenHandler::DGUSLCD_SD_StartPrint(DGUS_VP_Variable &var, void *val_ptr) { - if (!filelist.seek(file_to_print)) return; - ExtUI::printFile(filelist.shortFilename()); - ScreenHandler.GotoScreen( - #if ENABLED(DGUS_LCD_UI_ORIGIN) - DGUSLCD_SCREEN_STATUS - #else - DGUSLCD_SCREEN_SDPRINTMANIPULATION - #endif - ); - } - - void DGUSScreenHandler::DGUSLCD_SD_ResumePauseAbort(DGUS_VP_Variable &var, void *val_ptr) { - if (!ExtUI::isPrintingFromMedia()) return; // avoid race condition when user stays in this menu and printer finishes. - switch (swap16(*(uint16_t*)val_ptr)) { - case 0: // Resume - if (ExtUI::isPrintingFromMediaPaused()) ExtUI::resumePrint(); - break; - case 1: // Pause - if (!ExtUI::isPrintingFromMediaPaused()) ExtUI::pausePrint(); - break; - case 2: // Abort - ScreenHandler.HandleUserConfirmationPopUp(VP_SD_AbortPrintConfirmed, nullptr, PSTR("Abort printing"), filelist.filename(), PSTR("?"), true, true, false, true); - break; - } - } - void DGUSScreenHandler::DGUSLCD_SD_ReallyAbort(DGUS_VP_Variable &var, void *val_ptr) { ExtUI::stopPrint(); GotoScreen(DGUSLCD_SCREEN_MAIN); @@ -385,36 +337,11 @@ void DGUSScreenHandler::DGUSLCD_SendHeaterStatusToDisplay(DGUS_VP_Variable &var) GotoScreen(DGUSLCD_SCREEN_SDPRINTTUNE); } - void DGUSScreenHandler::DGUSLCD_SD_SendFilename(DGUS_VP_Variable& var) { - uint16_t target_line = (var.VP - VP_SD_FileName0) / VP_SD_FileName_LEN; - if (target_line > DGUS_SD_FILESPERSCREEN) return; - char tmpfilename[VP_SD_FileName_LEN + 1] = ""; - var.memadr = (void*)tmpfilename; - if (filelist.seek(top_file + target_line)) - snprintf_P(tmpfilename, VP_SD_FileName_LEN, PSTR("%s%c"), filelist.filename(), filelist.isDir() ? '/' : 0); - DGUSLCD_SendStringToDisplay(var); - } - - void DGUSScreenHandler::SDCardInserted() { - top_file = 0; - filelist.refresh(); - auto cs = ScreenHandler.getCurrentScreen(); - if (cs == DGUSLCD_SCREEN_MAIN || cs == DGUSLCD_SCREEN_STATUS) - ScreenHandler.GotoScreen(DGUSLCD_SCREEN_SDFILELIST); - } - - void DGUSScreenHandler::SDCardRemoved() { - if (current_screen == DGUSLCD_SCREEN_SDFILELIST - || (current_screen == DGUSLCD_SCREEN_CONFIRM && (ConfirmVP == VP_SD_AbortPrintConfirmed || ConfirmVP == VP_SD_FileSelectConfirm)) - || current_screen == DGUSLCD_SCREEN_SDPRINTMANIPULATION - ) ScreenHandler.GotoScreen(DGUSLCD_SCREEN_MAIN); - } - void DGUSScreenHandler::SDCardError() { DGUSScreenHandler::SDCardRemoved(); - ScreenHandler.sendinfoscreen(PSTR("NOTICE"), nullptr, PSTR("SD card error"), nullptr, true, true, true, true); - ScreenHandler.SetupConfirmAction(nullptr); - ScreenHandler.GotoScreen(DGUSLCD_SCREEN_POPUP); + sendinfoscreen(PSTR("NOTICE"), nullptr, PSTR("SD card error"), nullptr, true, true, true, true); + SetupConfirmAction(nullptr); + GotoScreen(DGUSLCD_SCREEN_POPUP); } #endif // SDSUPPORT @@ -428,7 +355,7 @@ void DGUSScreenHandler::ScreenConfirmedOK(DGUS_VP_Variable &var, void *val_ptr) const uint16_t* DGUSLCD_FindScreenVPMapList(uint8_t screen) { const uint16_t *ret; const struct VPMapping *map = VPMap; - while (ret = (uint16_t*) pgm_read_ptr(&(map->VPList))) { + while ((ret = (uint16_t*) pgm_read_ptr(&(map->VPList)))) { if (pgm_read_byte(&(map->screen)) == screen) return ret; map++; } @@ -455,31 +382,9 @@ void DGUSScreenHandler::ScreenChangeHookIfIdle(DGUS_VP_Variable &var, void *val_ } } -void DGUSScreenHandler::ScreenChangeHook(DGUS_VP_Variable &var, void *val_ptr) { - uint8_t *tmp = (uint8_t*)val_ptr; - - // The keycode in target is coded as , so 0x0100A means - // from screen 1 (main) to 10 (temperature). DGUSLCD_SCREEN_POPUP is special, - // meaning "return to previous screen" - DGUSLCD_Screens target = (DGUSLCD_Screens)tmp[1]; - - if (target == DGUSLCD_SCREEN_POPUP) { - // special handling for popup is to return to previous menu - if (current_screen == DGUSLCD_SCREEN_POPUP && confirm_action_cb) confirm_action_cb(); - PopToOldScreen(); - return; - } - - UpdateNewScreen(target); - - #ifdef DEBUG_DGUSLCD - if (!DGUSLCD_FindScreenVPMapList(target)) DEBUG_ECHOLNPAIR("WARNING: No screen Mapping found for ", target); - #endif -} - void DGUSScreenHandler::HandleAllHeatersOff(DGUS_VP_Variable &var, void *val_ptr) { thermalManager.disable_all_heaters(); - ScreenHandler.ForceCompleteUpdate(); // hint to send all data. + ForceCompleteUpdate(); // hint to send all data. } void DGUSScreenHandler::HandleTemperatureChanged(DGUS_VP_Variable &var, void *val_ptr) { @@ -498,7 +403,7 @@ void DGUSScreenHandler::HandleTemperatureChanged(DGUS_VP_Variable &var, void *va case VP_T_E1_Set: thermalManager.setTargetHotend(newvalue, 1); acceptedvalue = thermalManager.temp_hotend[1].target; - break; + break; #endif #if HAS_HEATED_BED case VP_T_Bed_Set: @@ -510,7 +415,7 @@ void DGUSScreenHandler::HandleTemperatureChanged(DGUS_VP_Variable &var, void *va // reply to display the new value to update the view if the new value was rejected by the Thermal Manager. if (newvalue != acceptedvalue && var.send_to_display_handler) var.send_to_display_handler(var); - ScreenHandler.skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel + skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel } void DGUSScreenHandler::HandleFlowRateChanged(DGUS_VP_Variable &var, void *val_ptr) { @@ -528,7 +433,7 @@ void DGUSScreenHandler::HandleFlowRateChanged(DGUS_VP_Variable &var, void *val_p } planner.set_flow(target_extruder, newvalue); - ScreenHandler.skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel + skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel #else UNUSED(var); UNUSED(val_ptr); #endif @@ -563,97 +468,6 @@ void DGUSScreenHandler::HandleManualExtrude(DGUS_VP_Variable &var, void *val_ptr } #endif -void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { - DEBUG_ECHOLNPGM("HandleManualMove"); - - int16_t movevalue = swap16(*(uint16_t*)val_ptr); - #if ENABLED(DGUS_UI_MOVE_DIS_OPTION) - if (movevalue) { - const uint16_t choice = *(uint16_t*)var.memadr; - movevalue = movevalue < 0 ? -choice : choice; - } - #endif - char axiscode; - unsigned int speed = 1500; //FIXME: get default feedrate for manual moves, dont hardcode. - - switch (var.VP) { - default: return; - - case VP_MOVE_X: - axiscode = 'X'; - if (!ExtUI::canMove(ExtUI::axis_t::X)) goto cannotmove; - break; - - case VP_MOVE_Y: - axiscode = 'Y'; - if (!ExtUI::canMove(ExtUI::axis_t::Y)) goto cannotmove; - break; - - case VP_MOVE_Z: - axiscode = 'Z'; - speed = 300; // default to 5mm/s - if (!ExtUI::canMove(ExtUI::axis_t::Z)) goto cannotmove; - break; - - case VP_HOME_ALL: // only used for homing - axiscode = '\0'; - movevalue = 0; // ignore value sent from display, this VP is _ONLY_ for homing. - break; - } - - if (!movevalue) { - // homing - DEBUG_ECHOPAIR(" homing ", axiscode); - char buf[6] = "G28 X"; - buf[4] = axiscode; - //DEBUG_ECHOPAIR(" ", buf); - queue.enqueue_one_now(buf); - //DEBUG_ECHOLNPGM(" ✓"); - ScreenHandler.ForceCompleteUpdate(); - return; - } - else { - //movement - DEBUG_ECHOPAIR(" move ", axiscode); - bool old_relative_mode = relative_mode; - if (!relative_mode) { - //DEBUG_ECHOPGM(" G91"); - queue.enqueue_now_P(PSTR("G91")); - //DEBUG_ECHOPGM(" ✓ "); - } - char buf[32]; // G1 X9999.99 F12345 - unsigned int backup_speed = MMS_TO_MMM(feedrate_mm_s); - char sign[]="\0"; - int16_t value = movevalue / 100; - if (movevalue < 0) { value = -value; sign[0] = '-'; } - int16_t fraction = ABS(movevalue) % 100; - snprintf_P(buf, 32, PSTR("G0 %c%s%d.%02d F%d"), axiscode, sign, value, fraction, speed); - //DEBUG_ECHOPAIR(" ", buf); - queue.enqueue_one_now(buf); - //DEBUG_ECHOLNPGM(" ✓ "); - if (backup_speed != speed) { - snprintf_P(buf, 32, PSTR("G0 F%d"), backup_speed); - queue.enqueue_one_now(buf); - //DEBUG_ECHOPAIR(" ", buf); - } - //while (!enqueue_and_echo_command(buf)) idle(); - //DEBUG_ECHOLNPGM(" ✓ "); - if (!old_relative_mode) { - //DEBUG_ECHOPGM("G90"); - queue.enqueue_now_P(PSTR("G90")); - //DEBUG_ECHOPGM(" ✓ "); - } - } - - ScreenHandler.ForceCompleteUpdate(); - DEBUG_ECHOLNPGM("manmv done."); - return; - - cannotmove: - DEBUG_ECHOLNPAIR(" cannot move ", axiscode); - return; -} - void DGUSScreenHandler::HandleMotorLockUnlock(DGUS_VP_Variable &var, void *val_ptr) { DEBUG_ECHOLNPGM("HandleMotorLockUnlock"); @@ -665,22 +479,6 @@ void DGUSScreenHandler::HandleMotorLockUnlock(DGUS_VP_Variable &var, void *val_p queue.enqueue_one_now(buf); } -#if ENABLED(POWER_LOSS_RECOVERY) - - void DGUSScreenHandler::HandlePowerLossRecovery(DGUS_VP_Variable &var, void *val_ptr) { - uint16_t value = swap16(*(uint16_t*)val_ptr); - if (value) { - queue.inject_P(PSTR("M1000")); - ScreenHandler.GotoScreen(DGUSLCD_SCREEN_SDPRINTMANIPULATION); - } - else { - recovery.cancel(); - ScreenHandler.GotoScreen(DGUSLCD_SCREEN_STATUS); - } - } - -#endif - void DGUSScreenHandler::HandleSettings(DGUS_VP_Variable &var, void *val_ptr) { DEBUG_ECHOLNPGM("HandleSettings"); uint16_t value = swap16(*(uint16_t*)val_ptr); @@ -688,10 +486,11 @@ void DGUSScreenHandler::HandleSettings(DGUS_VP_Variable &var, void *val_ptr) { default: break; case 1: TERN_(PRINTCOUNTER, print_job_timer.initStats()); - queue.inject_P(PSTR("M502\nM500")); + settings.reset(); + settings.save(); break; - case 2: queue.inject_P(PSTR("M501")); break; - case 3: queue.inject_P(PSTR("M500")); break; + case 2: settings.load(); break; + case 3: settings.save(); break; } } @@ -700,7 +499,7 @@ void DGUSScreenHandler::HandleStepPerMMChanged(DGUS_VP_Variable &var, void *val_ uint16_t value_raw = swap16(*(uint16_t*)val_ptr); DEBUG_ECHOLNPAIR("value_raw:", value_raw); - float value = (float)value_raw/10; + float value = (float)value_raw / 10; ExtUI::axis_t axis; switch (var.VP) { case VP_X_STEP_PER_MM: axis = ExtUI::axis_t::X; break; @@ -711,7 +510,7 @@ void DGUSScreenHandler::HandleStepPerMMChanged(DGUS_VP_Variable &var, void *val_ DEBUG_ECHOLNPAIR_F("value:", value); ExtUI::setAxisSteps_per_mm(value, axis); DEBUG_ECHOLNPAIR_F("value_set:", ExtUI::getAxisSteps_per_mm(axis)); - ScreenHandler.skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel + skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel return; } @@ -720,56 +519,24 @@ void DGUSScreenHandler::HandleStepPerMMExtruderChanged(DGUS_VP_Variable &var, vo uint16_t value_raw = swap16(*(uint16_t*)val_ptr); DEBUG_ECHOLNPAIR("value_raw:", value_raw); - float value = (float)value_raw/10; + float value = (float)value_raw / 10; ExtUI::extruder_t extruder; switch (var.VP) { default: return; - #if HOTENDS >= 1 - case VP_E0_STEP_PER_MM: extruder = ExtUI::extruder_t::E0; break; - #endif - #if HOTENDS >= 2 - case VP_E1_STEP_PER_MM: extruder = ExtUI::extruder_t::E1; break; - #endif + #if HOTENDS >= 1 + case VP_E0_STEP_PER_MM: extruder = ExtUI::extruder_t::E0; break; + #endif + #if HOTENDS >= 2 + case VP_E1_STEP_PER_MM: extruder = ExtUI::extruder_t::E1; break; + #endif } DEBUG_ECHOLNPAIR_F("value:", value); - ExtUI::setAxisSteps_per_mm(value,extruder); + ExtUI::setAxisSteps_per_mm(value, extruder); DEBUG_ECHOLNPAIR_F("value_set:", ExtUI::getAxisSteps_per_mm(extruder)); - ScreenHandler.skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel - return; + skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel } #if HAS_PID_HEATING - void DGUSScreenHandler::HandleTemperaturePIDChanged(DGUS_VP_Variable &var, void *val_ptr) { - uint16_t rawvalue = swap16(*(uint16_t*)val_ptr); - DEBUG_ECHOLNPAIR("V1:", rawvalue); - float value = (float)rawvalue / 10; - DEBUG_ECHOLNPAIR("V2:", value); - float newvalue = 0; - - switch (var.VP) { - default: return; - #if HOTENDS >= 1 - case VP_E0_PID_P: newvalue = value; break; - case VP_E0_PID_I: newvalue = scalePID_i(value); break; - case VP_E0_PID_D: newvalue = scalePID_d(value); break; - #endif - #if HOTENDS >= 2 - case VP_E1_PID_P: newvalue = value; break; - case VP_E1_PID_I: newvalue = scalePID_i(value); break; - case VP_E1_PID_D: newvalue = scalePID_d(value); break; - #endif - #if HAS_HEATED_BED - case VP_BED_PID_P: newvalue = value; break; - case VP_BED_PID_I: newvalue = scalePID_i(value); break; - case VP_BED_PID_D: newvalue = scalePID_d(value); break; - #endif - } - - DEBUG_ECHOLNPAIR_F("V3:", newvalue); - *(float *)var.memadr = newvalue; - ScreenHandler.skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel - } - void DGUSScreenHandler::HandlePIDAutotune(DGUS_VP_Variable &var, void *val_ptr) { DEBUG_ECHOLNPGM("HandlePIDAutotune"); @@ -777,23 +544,23 @@ void DGUSScreenHandler::HandleStepPerMMExtruderChanged(DGUS_VP_Variable &var, vo switch (var.VP) { default: break; - #if ENABLED(PIDTEMP) - #if HOTENDS >= 1 - case VP_PID_AUTOTUNE_E0: // Autotune Extruder 0 - sprintf(buf, "M303 E%d C5 S210 U1", ExtUI::extruder_t::E0); + #if ENABLED(PIDTEMP) + #if HOTENDS >= 1 + case VP_PID_AUTOTUNE_E0: // Autotune Extruder 0 + sprintf_P(buf, PSTR("M303 E%d C5 S210 U1"), ExtUI::extruder_t::E0); + break; + #endif + #if HOTENDS >= 2 + case VP_PID_AUTOTUNE_E1: + sprintf_P(buf, PSTR("M303 E%d C5 S210 U1"), ExtUI::extruder_t::E1); + break; + #endif + #endif + #if ENABLED(PIDTEMPBED) + case VP_PID_AUTOTUNE_BED: + sprintf_P(buf, PSTR("M303 E-1 C5 S70 U1")); break; #endif - #if HOTENDS >= 2 - case VP_PID_AUTOTUNE_E1: - sprintf(buf, "M303 E%d C5 S210 U1", ExtUI::extruder_t::E1); - break; - #endif - #endif - #if ENABLED(PIDTEMPBED) - case VP_PID_AUTOTUNE_BED: - sprintf(buf, "M303 E-1 C5 S70 U1"); - break; - #endif } if (buf[0]) queue.enqueue_one_now(buf); @@ -803,7 +570,7 @@ void DGUSScreenHandler::HandleStepPerMMExtruderChanged(DGUS_VP_Variable &var, vo GotoScreen(DGUSLCD_SCREEN_WAITING); #endif } -#endif +#endif // HAS_PID_HEATING #if HAS_BED_PROBE void DGUSScreenHandler::HandleProbeOffsetZChanged(DGUS_VP_Variable &var, void *val_ptr) { @@ -811,19 +578,7 @@ void DGUSScreenHandler::HandleStepPerMMExtruderChanged(DGUS_VP_Variable &var, vo const float offset = float(int16_t(swap16(*(uint16_t*)val_ptr))) / 100.0f; ExtUI::setZOffset_mm(offset); - ScreenHandler.skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel - return; - } -#endif - -#if ENABLED(BABYSTEPPING) - void DGUSScreenHandler::HandleLiveAdjustZ(DGUS_VP_Variable &var, void *val_ptr) { - DEBUG_ECHOLNPGM("HandleLiveAdjustZ"); - - int16_t flag = swap16(*(uint16_t*)val_ptr); - int16_t steps = flag ? -20 : 20; - ExtUI::smartAdjustAxis_steps(steps, ExtUI::axis_t::Z, true); - ScreenHandler.ForceCompleteUpdate(); + skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel return; } #endif @@ -849,8 +604,8 @@ void DGUSScreenHandler::HandleHeaterControl(DGUS_VP_Variable &var, void *val_ptr #if HOTENDS >= 3 case VP_E2_CONTROL: #endif - preheat_temp = PREHEAT_1_TEMP_HOTEND; - break; + preheat_temp = PREHEAT_1_TEMP_HOTEND; + break; case VP_BED_CONTROL: preheat_temp = PREHEAT_1_TEMP_BED; @@ -900,149 +655,49 @@ void DGUSScreenHandler::HandleHeaterControl(DGUS_VP_Variable &var, void *val_ptr switch (var.VP) { default: return; - #if HOTENDS >= 1 - case VP_E0_BED_PREHEAT: - thermalManager.setTargetHotend(e_temp, 0); - TERN_(HAS_HEATED_BED, thermalManager.setTargetBed(bed_temp)); - break; - #endif - #if HOTENDS >= 2 - case VP_E1_BED_PREHEAT: - thermalManager.setTargetHotend(e_temp, 1); - TERN_(HAS_HEATED_BED, thermalManager.setTargetBed(bed_temp)); - break; - #endif + #if HOTENDS >= 1 + case VP_E0_BED_PREHEAT: + thermalManager.setTargetHotend(e_temp, 0); + TERN_(HAS_HEATED_BED, thermalManager.setTargetBed(bed_temp)); + break; + #endif + #if HOTENDS >= 2 + case VP_E1_BED_PREHEAT: + thermalManager.setTargetHotend(e_temp, 1); + TERN_(HAS_HEATED_BED, thermalManager.setTargetBed(bed_temp)); + break; + #endif } // Go to the preheat screen to show the heating progress GotoScreen(DGUSLCD_SCREEN_PREHEAT); } -#endif +#endif // DGUS_PREHEAT_UI -#if ENABLED(DGUS_FILAMENT_LOADUNLOAD) +#if ENABLED(POWER_LOSS_RECOVERY) - typedef struct { - ExtUI::extruder_t extruder; // which extruder to operate - uint8_t action; // load or unload - bool heated; // heating done ? - float purge_length; // the length to extrude before unload, prevent filament jam - } filament_data_t; - - static filament_data_t filament_data; - - void DGUSScreenHandler::HandleFilamentOption(DGUS_VP_Variable &var, void *val_ptr) { - DEBUG_ECHOLNPGM("HandleFilamentOption"); - - uint8_t e_temp = 0; - filament_data.heated = false; - uint16_t preheat_option = swap16(*(uint16_t*)val_ptr); - if (preheat_option <= 8) // Load filament type - filament_data.action = 1; - else if (preheat_option >= 10) { // Unload filament type - preheat_option -= 10; - filament_data.action = 2; - filament_data.purge_length = DGUS_FILAMENT_PURGE_LENGTH; + void DGUSScreenHandler::HandlePowerLossRecovery(DGUS_VP_Variable &var, void *val_ptr) { + uint16_t value = swap16(*(uint16_t*)val_ptr); + if (value) { + queue.inject_P(PSTR("M1000")); + dgusdisplay.WriteVariable(VP_SD_Print_Filename, filelist.filename(), 32, true); + GotoScreen(PLR_SCREEN_RECOVER); } - else // Cancel filament operation - filament_data.action = 0; - - switch (preheat_option) { - case 0: // Load PLA - #ifdef PREHEAT_1_TEMP_HOTEND - e_temp = PREHEAT_1_TEMP_HOTEND; - #endif - break; - case 1: // Load ABS - TERN_(PREHEAT_2_TEMP_HOTEND, e_temp = PREHEAT_2_TEMP_HOTEND); - break; - case 2: // Load PET - #ifdef PREHEAT_3_TEMP_HOTEND - e_temp = PREHEAT_3_TEMP_HOTEND; - #endif - break; - case 3: // Load FLEX - #ifdef PREHEAT_4_TEMP_HOTEND - e_temp = PREHEAT_4_TEMP_HOTEND; - #endif - break; - case 9: // Cool down - default: - e_temp = 0; - break; - } - - if (filament_data.action == 0) { // Go back to utility screen - #if HOTENDS >= 1 - thermalManager.setTargetHotend(e_temp, ExtUI::extruder_t::E0); - #endif - #if HOTENDS >= 2 - thermalManager.setTargetHotend(e_temp, ExtUI::extruder_t::E1); - #endif - GotoScreen(DGUSLCD_SCREEN_UTILITY); - } - else { // Go to the preheat screen to show the heating progress - switch (var.VP) { - default: return; - #if HOTENDS >= 1 - case VP_E0_FILAMENT_LOAD_UNLOAD: - filament_data.extruder = ExtUI::extruder_t::E0; - thermalManager.setTargetHotend(e_temp, filament_data.extruder); - break; - #endif - #if HOTENDS >= 2 - case VP_E1_FILAMENT_LOAD_UNLOAD: - filament_data.extruder = ExtUI::extruder_t::E1; - thermalManager.setTargetHotend(e_temp, filament_data.extruder); - break; - #endif - } - GotoScreen(DGUSLCD_SCREEN_FILAMENT_HEATING); + else { + recovery.cancel(); + GotoScreen(PLR_SCREEN_CANCEL); } } - void DGUSScreenHandler::HandleFilamentLoadUnload(DGUS_VP_Variable &var) { - DEBUG_ECHOLNPGM("HandleFilamentLoadUnload"); - if (filament_data.action <= 0) return; - - // If we close to the target temperature, we can start load or unload the filament - if (thermalManager.hotEnoughToExtrude(filament_data.extruder) && \ - thermalManager.targetHotEnoughToExtrude(filament_data.extruder)) { - float movevalue = DGUS_FILAMENT_LOAD_LENGTH_PER_TIME; - - if (filament_data.action == 1) { // load filament - if (!filament_data.heated) { - GotoScreen(DGUSLCD_SCREEN_FILAMENT_LOADING); - filament_data.heated = true; - } - movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder)+movevalue; - } - else { // unload filament - if (!filament_data.heated) { - GotoScreen(DGUSLCD_SCREEN_FILAMENT_UNLOADING); - filament_data.heated = true; - } - // Before unloading extrude to prevent jamming - if (filament_data.purge_length >= 0) { - movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder) + movevalue; - filament_data.purge_length -= movevalue; - } - else - movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder) - movevalue; - } - ExtUI::setAxisPosition_mm(movevalue, filament_data.extruder); - } - } #endif void DGUSScreenHandler::UpdateNewScreen(DGUSLCD_Screens newscreen, bool popup) { DEBUG_ECHOLNPAIR("SetNewScreen: ", newscreen); - if (!popup) { memmove(&past_screens[1], &past_screens[0], sizeof(past_screens) - 1); past_screens[0] = current_screen; } - current_screen = newscreen; skipVP = 0; ForceCompleteUpdate(); @@ -1062,7 +717,7 @@ void DGUSScreenHandler::UpdateScreenVPData() { if (!VPList) { DEBUG_ECHOLNPAIR(" NO SCREEN FOR: ", current_screen); ScreenComplete = true; - return; // nothing to do, likely a bug or boring screen. + return; // nothing to do, likely a bug or boring screen. } // Round-robin updating of all VPs. @@ -1076,14 +731,14 @@ void DGUSScreenHandler::UpdateScreenVPData() { update_ptr = 0; DEBUG_ECHOLNPGM(" UpdateScreenVPData done"); ScreenComplete = true; - return; // Screen completed. + return; // Screen completed. } if (VP == skipVP) { skipVP = 0; continue; } DGUS_VP_Variable rcpy; if (populate_VPVar(VP, &rcpy)) { - uint8_t expected_tx = 6 + rcpy.size; // expected overhead is 6 bytes + payload. + uint8_t expected_tx = 6 + rcpy.size; // expected overhead is 6 bytes + payload. // Send the VP to the display, but try to avoid overrunning the Tx Buffer. // But send at least one VP, to avoid getting stalled. if (rcpy.send_to_display_handler && (!sent_one || expected_tx <= dgusdisplay.GetFreeTxBuffer())) { @@ -1092,11 +747,11 @@ void DGUSScreenHandler::UpdateScreenVPData() { rcpy.send_to_display_handler(rcpy); } else { - //auto x=dgusdisplay.GetFreeTxBuffer(); + // auto x=dgusdisplay.GetFreeTxBuffer(); //DEBUG_ECHOLNPAIR(" tx almost full: ", x); //DEBUG_ECHOPAIR(" update_ptr ", update_ptr); ScreenComplete = false; - return; // please call again! + return; // please call again! } } @@ -1108,29 +763,6 @@ void DGUSScreenHandler::GotoScreen(DGUSLCD_Screens screen, bool ispopup) { UpdateNewScreen(screen, ispopup); } -bool DGUSScreenHandler::loop() { - dgusdisplay.loop(); - - const millis_t ms = millis(); - static millis_t next_event_ms = 0; - - if (!IsScreenComplete() || ELAPSED(ms, next_event_ms)) { - next_event_ms = ms + DGUS_UPDATE_INTERVAL_MS; - UpdateScreenVPData(); - } - - #if ENABLED(SHOW_BOOTSCREEN) - static bool booted = false; - if (!booted && TERN0(POWER_LOSS_RECOVERY, recovery.valid())) - booted = true; - if (!booted && ELAPSED(ms, BOOTSCREEN_TIMEOUT)) { - booted = true; - GotoScreen(DGUSLCD_SCREEN_MAIN); - } - #endif - return IsScreenComplete(); -} - void DGUSDisplay::RequestScreen(DGUSLCD_Screens screen) { DEBUG_ECHOLNPAIR("GotoScreen ", screen); const unsigned char gotoscreen[] = { 0x5A, 0x01, (unsigned char) (screen >> 8U), (unsigned char) (screen & 0xFFU) }; diff --git a/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.h b/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.h index df738dbfd1..21e25b3b88 100644 --- a/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.h +++ b/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.h @@ -21,212 +21,38 @@ */ #pragma once -#include "DGUSDisplay.h" -#include "DGUSVPVariable.h" +/** + * lcd/extui/lib/dgus/DGUSScreenHandler.h + */ -#include "../../../../inc/MarlinConfig.h" +#include "../../../../inc/MarlinConfigPre.h" -enum DGUSLCD_Screens : uint8_t; +#include "../../ui_api.h" -class DGUSScreenHandler { -public: - DGUSScreenHandler() = default; +#if ENABLED(DGUS_FILAMENT_LOADUNLOAD) - static bool loop(); + typedef struct { + ExtUI::extruder_t extruder; // which extruder to operate + uint8_t action; // load or unload + bool heated; // heating done ? + float purge_length; // the length to extrude before unload, prevent filament jam + } filament_data_t; - /// Send all 4 strings that are displayed on the infoscreen, confirmation screen and kill screen - /// The bools specifing whether the strings are in RAM or FLASH. - static void sendinfoscreen(const char* line1, const char* line2, const char* line3, const char* line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash); + extern filament_data_t filament_data; - static void HandleUserConfirmationPopUp(uint16_t ConfirmVP, const char* line1, const char* line2, const char* line3, const char* line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash); +#endif - /// "M117" Message -- msg is a RAM ptr. - static void setstatusmessage(const char* msg); - /// The same for messages from Flash - static void setstatusmessagePGM(PGM_P const msg); - // Callback for VP "Display wants to change screen on idle printer" - static void ScreenChangeHookIfIdle(DGUS_VP_Variable &var, void *val_ptr); - // Callback for VP "Screen has been changed" - static void ScreenChangeHook(DGUS_VP_Variable &var, void *val_ptr); - // Callback for VP "All Heaters Off" - static void HandleAllHeatersOff(DGUS_VP_Variable &var, void *val_ptr); - // Hook for "Change this temperature" - static void HandleTemperatureChanged(DGUS_VP_Variable &var, void *val_ptr); - // Hook for "Change Flowrate" - static void HandleFlowRateChanged(DGUS_VP_Variable &var, void *val_ptr); - #if ENABLED(DGUS_UI_MOVE_DIS_OPTION) - // Hook for manual move option - static void HandleManualMoveOption(DGUS_VP_Variable &var, void *val_ptr); - #endif - // Hook for manual move. - static void HandleManualMove(DGUS_VP_Variable &var, void *val_ptr); - // Hook for manual extrude. - static void HandleManualExtrude(DGUS_VP_Variable &var, void *val_ptr); - // Hook for motor lock and unlook - static void HandleMotorLockUnlock(DGUS_VP_Variable &var, void *val_ptr); - #if ENABLED(POWER_LOSS_RECOVERY) - // Hook for power loss recovery. - static void HandlePowerLossRecovery(DGUS_VP_Variable &var, void *val_ptr); - #endif - // Hook for settings - static void HandleSettings(DGUS_VP_Variable &var, void *val_ptr); - static void HandleStepPerMMChanged(DGUS_VP_Variable &var, void *val_ptr); - static void HandleStepPerMMExtruderChanged(DGUS_VP_Variable &var, void *val_ptr); - #if HAS_PID_HEATING - // Hook for "Change this temperature PID para" - static void HandleTemperaturePIDChanged(DGUS_VP_Variable &var, void *val_ptr); - // Hook for PID autotune - static void HandlePIDAutotune(DGUS_VP_Variable &var, void *val_ptr); - #endif - #if HAS_BED_PROBE - // Hook for "Change probe offset z" - static void HandleProbeOffsetZChanged(DGUS_VP_Variable &var, void *val_ptr); - #endif - #if ENABLED(BABYSTEPPING) - // Hook for live z adjust action - static void HandleLiveAdjustZ(DGUS_VP_Variable &var, void *val_ptr); - #endif - #if HAS_FAN - // Hook for fan control - static void HandleFanControl(DGUS_VP_Variable &var, void *val_ptr); - #endif - // Hook for heater control - static void HandleHeaterControl(DGUS_VP_Variable &var, void *val_ptr); - #if ENABLED(DGUS_PREHEAT_UI) - // Hook for preheat - static void HandlePreheat(DGUS_VP_Variable &var, void *val_ptr); - #endif - #if ENABLED(DGUS_FILAMENT_LOADUNLOAD) - // Hook for filament load and unload filament option - static void HandleFilamentOption(DGUS_VP_Variable &var, void *val_ptr); - // Hook for filament load and unload - static void HandleFilamentLoadUnload(DGUS_VP_Variable &var); - #endif +// endianness swap +inline uint16_t swap16(const uint16_t value) { return (value & 0xFFU) << 8U | (value >> 8U); } - #if ENABLED(SDSUPPORT) - // Callback for VP "Display wants to change screen when there is a SD card" - static void ScreenChangeHookIfSD(DGUS_VP_Variable &var, void *val_ptr); - /// Scroll buttons on the file listing screen. - static void DGUSLCD_SD_ScrollFilelist(DGUS_VP_Variable &var, void *val_ptr); - /// File touched. - static void DGUSLCD_SD_FileSelected(DGUS_VP_Variable &var, void *val_ptr); - /// start print after confirmation received. - static void DGUSLCD_SD_StartPrint(DGUS_VP_Variable &var, void *val_ptr); - /// User hit the pause, resume or abort button. - static void DGUSLCD_SD_ResumePauseAbort(DGUS_VP_Variable &var, void *val_ptr); - /// User confirmed the abort action - static void DGUSLCD_SD_ReallyAbort(DGUS_VP_Variable &var, void *val_ptr); - /// User hit the tune button - static void DGUSLCD_SD_PrintTune(DGUS_VP_Variable &var, void *val_ptr); - /// Send a single filename to the display. - static void DGUSLCD_SD_SendFilename(DGUS_VP_Variable &var); - /// Marlin informed us that a new SD has been inserted. - static void SDCardInserted(); - /// Marlin informed us that the SD Card has been removed(). - static void SDCardRemoved(); - /// Marlin informed us about a bad SD Card. - static void SDCardError(); - #endif - - // OK Button the Confirm screen. - static void ScreenConfirmedOK(DGUS_VP_Variable &var, void *val_ptr); - - // Update data after went to new screen (by display or by GotoScreen) - // remember: store the last-displayed screen, so it can get returned to. - // (e.g for pop up messages) - static void UpdateNewScreen(DGUSLCD_Screens newscreen, bool popup=false); - - // Recall the remembered screen. - static void PopToOldScreen(); - - // Make the display show the screen and update all VPs in it. - static void GotoScreen(DGUSLCD_Screens screen, bool ispopup = false); - - static void UpdateScreenVPData(); - - // Helpers to convert and transfer data to the display. - static void DGUSLCD_SendWordValueToDisplay(DGUS_VP_Variable &var); - static void DGUSLCD_SendStringToDisplay(DGUS_VP_Variable &var); - static void DGUSLCD_SendStringToDisplayPGM(DGUS_VP_Variable &var); - static void DGUSLCD_SendTemperaturePID(DGUS_VP_Variable &var); - static void DGUSLCD_SendPercentageToDisplay(DGUS_VP_Variable &var); - static void DGUSLCD_SendPrintProgressToDisplay(DGUS_VP_Variable &var); - static void DGUSLCD_SendPrintTimeToDisplay(DGUS_VP_Variable &var); - #if ENABLED(PRINTCOUNTER) - static void DGUSLCD_SendPrintAccTimeToDisplay(DGUS_VP_Variable &var); - static void DGUSLCD_SendPrintsTotalToDisplay(DGUS_VP_Variable &var); - #endif - #if HAS_FAN - static void DGUSLCD_SendFanStatusToDisplay(DGUS_VP_Variable &var); - #endif - static void DGUSLCD_SendHeaterStatusToDisplay(DGUS_VP_Variable &var); - #if ENABLED(DGUS_UI_WAITING) - static void DGUSLCD_SendWaitingStatusToDisplay(DGUS_VP_Variable &var); - #endif - - /// Send a value from 0..100 to a variable with a range from 0..255 - static void DGUSLCD_PercentageToUint8(DGUS_VP_Variable &var, void *val_ptr); - - template - static void DGUSLCD_SetValueDirectly(DGUS_VP_Variable &var, void *val_ptr) { - if (!var.memadr) return; - union { unsigned char tmp[sizeof(T)]; T t; } x; - unsigned char *ptr = (unsigned char*)val_ptr; - LOOP_L_N(i, sizeof(T)) x.tmp[i] = ptr[sizeof(T) - i - 1]; - *(T*)var.memadr = x.t; - } - - /// Send a float value to the display. - /// Display will get a 4-byte integer scaled to the number of digits: - /// Tell the display the number of digits and it cheats by displaying a dot between... - template - static void DGUSLCD_SendFloatAsLongValueToDisplay(DGUS_VP_Variable &var) { - if (var.memadr) { - float f = *(float *)var.memadr; - f *= cpow(10, decimals); - dgusdisplay.WriteVariable(var.VP, (long)f); - } - } - - /// Send a float value to the display. - /// Display will get a 2-byte integer scaled to the number of digits: - /// Tell the display the number of digits and it cheats by displaying a dot between... - template - static void DGUSLCD_SendFloatAsIntValueToDisplay(DGUS_VP_Variable &var) { - if (var.memadr) { - float f = *(float *)var.memadr; - DEBUG_ECHOLNPAIR_F(" >> ", f, 6); - f *= cpow(10, decimals); - dgusdisplay.WriteVariable(var.VP, (int16_t)f); - } - } - - /// Force an update of all VP on the current screen. - static inline void ForceCompleteUpdate() { update_ptr = 0; ScreenComplete = false; } - /// Has all VPs sent to the screen - static inline bool IsScreenComplete() { return ScreenComplete; } - - static inline DGUSLCD_Screens getCurrentScreen() { return current_screen; } - - static inline void SetupConfirmAction( void (*f)()) { confirm_action_cb = f; } - -private: - static DGUSLCD_Screens current_screen; ///< currently on screen - static constexpr uint8_t NUM_PAST_SCREENS = 4; - static DGUSLCD_Screens past_screens[NUM_PAST_SCREENS]; ///< LIFO with past screens for the "back" button. - - static uint8_t update_ptr; ///< Last sent entry in the VPList for the actual screen. - static uint16_t skipVP; ///< When updating the screen data, skip this one, because the user is interacting with it. - static bool ScreenComplete; ///< All VPs sent to screen? - - static uint16_t ConfirmVP; ///< context for confirm screen (VP that will be emulated-sent on "OK"). - - #if ENABLED(SDSUPPORT) - static int16_t top_file; ///< file on top of file chooser - static int16_t file_to_print; ///< touched file to be confirmed - #endif - - static void (*confirm_action_cb)(); -}; +#if ENABLED(DGUS_LCD_UI_ORIGIN) + #include "origin/DGUSScreenHandler.h" +#elif ENABLED(DGUS_LCD_UI_MKS) + #include "mks/DGUSScreenHandler.h" +#elif ENABLED(DGUS_LCD_UI_FYSETC) + #include "fysetc/DGUSScreenHandler.h" +#elif ENABLED(DGUS_LCD_UI_HIPRECY) + #include "hiprecy/DGUSScreenHandler.h" +#endif extern DGUSScreenHandler ScreenHandler; diff --git a/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSScreenHandler.cpp new file mode 100644 index 0000000000..c43243b39d --- /dev/null +++ b/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSScreenHandler.cpp @@ -0,0 +1,418 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 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 . + * + */ + +#include "../../../../../inc/MarlinConfigPre.h" + +#if ENABLED(DGUS_LCD_UI_FYSETC) + +#include "../DGUSScreenHandler.h" + +#include "../../../../../MarlinCore.h" +#include "../../../../../gcode/queue.h" +#include "../../../../../libs/duration_t.h" +#include "../../../../../module/settings.h" +#include "../../../../../module/temperature.h" +#include "../../../../../module/motion.h" +#include "../../../../../module/planner.h" +#include "../../../../../module/printcounter.h" +#include "../../../../../sd/cardreader.h" + +#if ENABLED(POWER_LOSS_RECOVERY) + #include "../../../../feature/powerloss.h" +#endif + +#if ENABLED(SDSUPPORT) + + void DGUSScreenHandler::DGUSLCD_SD_FileSelected(DGUS_VP_Variable &var, void *val_ptr) { + uint16_t touched_nr = (int16_t)swap16(*(uint16_t*)val_ptr) + top_file; + if (touched_nr > filelist.count()) return; + if (!filelist.seek(touched_nr)) return; + + if (filelist.isDir()) { + filelist.changeDir(filelist.filename()); + top_file = 0; + ForceCompleteUpdate(); + return; + } + + #if ENABLED(DGUS_PRINT_FILENAME) + // Send print filename + dgusdisplay.WriteVariable(VP_SD_Print_Filename, filelist.filename(), VP_SD_FileName_LEN, true); + #endif + + // Setup Confirmation screen + file_to_print = touched_nr; + + HandleUserConfirmationPopUp(VP_SD_FileSelectConfirm, nullptr, PSTR("Print file"), filelist.filename(), PSTR("from SD Card?"), true, true, false, true); + } + + void DGUSScreenHandler::DGUSLCD_SD_StartPrint(DGUS_VP_Variable &var, void *val_ptr) { + if (!filelist.seek(file_to_print)) return; + ExtUI::printFile(filelist.shortFilename()); + GotoScreen(DGUSLCD_SCREEN_SDPRINTMANIPULATION); + } + + void DGUSScreenHandler::DGUSLCD_SD_ResumePauseAbort(DGUS_VP_Variable &var, void *val_ptr) { + + if (!ExtUI::isPrintingFromMedia()) return; // avoid race condition when user stays in this menu and printer finishes. + switch (swap16(*(uint16_t*)val_ptr)) { + case 0: { // Resume + if (ExtUI::isPrintingFromMediaPaused()) { + ExtUI::resumePrint(); + } + } break; + + case 1: // Pause + + GotoScreen(MKSLCD_SCREEN_PAUSE); + if (!ExtUI::isPrintingFromMediaPaused()) { + ExtUI::pausePrint(); + //ExtUI::mks_pausePrint(); + } + break; + case 2: // Abort + HandleUserConfirmationPopUp(VP_SD_AbortPrintConfirmed, nullptr, PSTR("Abort printing"), filelist.filename(), PSTR("?"), true, true, false, true); + break; + } + } + + void DGUSScreenHandler::DGUSLCD_SD_SendFilename(DGUS_VP_Variable& var) { + uint16_t target_line = (var.VP - VP_SD_FileName0) / VP_SD_FileName_LEN; + if (target_line > DGUS_SD_FILESPERSCREEN) return; + char tmpfilename[VP_SD_FileName_LEN + 1] = ""; + var.memadr = (void*)tmpfilename; + + if (filelist.seek(top_file + target_line)) { + snprintf_P(tmpfilename, VP_SD_FileName_LEN, PSTR("%s%c"), filelist.filename(), filelist.isDir() ? '/' : 0); // snprintf_P(tmpfilename, VP_SD_FileName_LEN, PSTR("%s"), filelist.filename()); + } + DGUSLCD_SendStringToDisplay(var); + } + + void DGUSScreenHandler::SDCardInserted() { + top_file = 0; + filelist.refresh(); + auto cs = getCurrentScreen(); + if (cs == DGUSLCD_SCREEN_MAIN || cs == DGUSLCD_SCREEN_STATUS) + GotoScreen(DGUSLCD_SCREEN_SDFILELIST); + } + + void DGUSScreenHandler::SDCardRemoved() { + if (current_screen == DGUSLCD_SCREEN_SDFILELIST + || (current_screen == DGUSLCD_SCREEN_CONFIRM && (ConfirmVP == VP_SD_AbortPrintConfirmed || ConfirmVP == VP_SD_FileSelectConfirm)) + || current_screen == DGUSLCD_SCREEN_SDPRINTMANIPULATION + ) GotoScreen(DGUSLCD_SCREEN_MAIN); + } + +#endif // SDSUPPORT + +void DGUSScreenHandler::ScreenChangeHook(DGUS_VP_Variable &var, void *val_ptr) { + uint8_t *tmp = (uint8_t*)val_ptr; + + // The keycode in target is coded as , so 0x0100A means + // from screen 1 (main) to 10 (temperature). DGUSLCD_SCREEN_POPUP is special, + // meaning "return to previous screen" + DGUSLCD_Screens target = (DGUSLCD_Screens)tmp[1]; + + DEBUG_ECHOLNPAIR("\n DEBUG target", target); + + if (target == DGUSLCD_SCREEN_POPUP) { + // Special handling for popup is to return to previous menu + if (current_screen == DGUSLCD_SCREEN_POPUP && confirm_action_cb) confirm_action_cb(); + PopToOldScreen(); + return; + } + + UpdateNewScreen(target); + + #ifdef DEBUG_DGUSLCD + if (!DGUSLCD_FindScreenVPMapList(target)) DEBUG_ECHOLNPAIR("WARNING: No screen Mapping found for ", target); + #endif +} + +void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { + DEBUG_ECHOLNPGM("HandleManualMove"); + + int16_t movevalue = swap16(*(uint16_t*)val_ptr); + #if ENABLED(DGUS_UI_MOVE_DIS_OPTION) + if (movevalue) { + const uint16_t choice = *(uint16_t*)var.memadr; + movevalue = movevalue < 0 ? -choice : choice; + } + #endif + char axiscode; + unsigned int speed = 1500; // FIXME: get default feedrate for manual moves, dont hardcode. + + switch (var.VP) { + default: return; + + case VP_MOVE_X: + axiscode = 'X'; + if (!ExtUI::canMove(ExtUI::axis_t::X)) goto cannotmove; + break; + + case VP_MOVE_Y: + axiscode = 'Y'; + if (!ExtUI::canMove(ExtUI::axis_t::Y)) goto cannotmove; + break; + + case VP_MOVE_Z: + axiscode = 'Z'; + speed = 300; // default to 5mm/s + if (!ExtUI::canMove(ExtUI::axis_t::Z)) goto cannotmove; + break; + + case VP_HOME_ALL: // only used for homing + axiscode = '\0'; + movevalue = 0; // ignore value sent from display, this VP is _ONLY_ for homing. + break; + } + + if (!movevalue) { + // homing + DEBUG_ECHOPAIR(" homing ", axiscode); + char buf[6] = "G28 X"; + buf[4] = axiscode; + //DEBUG_ECHOPAIR(" ", buf); + queue.enqueue_one_now(buf); + //DEBUG_ECHOLNPGM(" ✓"); + ForceCompleteUpdate(); + return; + } + else { + // movement + DEBUG_ECHOPAIR(" move ", axiscode); + bool old_relative_mode = relative_mode; + if (!relative_mode) { + //DEBUG_ECHOPGM(" G91"); + queue.enqueue_now_P(PSTR("G91")); + //DEBUG_ECHOPGM(" ✓ "); + } + char buf[32]; // G1 X9999.99 F12345 + unsigned int backup_speed = MMS_TO_MMM(feedrate_mm_s); + char sign[] = "\0"; + int16_t value = movevalue / 100; + if (movevalue < 0) { value = -value; sign[0] = '-'; } + int16_t fraction = ABS(movevalue) % 100; + snprintf_P(buf, 32, PSTR("G0 %c%s%d.%02d F%d"), axiscode, sign, value, fraction, speed); + //DEBUG_ECHOPAIR(" ", buf); + queue.enqueue_one_now(buf); + //DEBUG_ECHOLNPGM(" ✓ "); + if (backup_speed != speed) { + snprintf_P(buf, 32, PSTR("G0 F%d"), backup_speed); + queue.enqueue_one_now(buf); + //DEBUG_ECHOPAIR(" ", buf); + } + // while (!enqueue_and_echo_command(buf)) idle(); + //DEBUG_ECHOLNPGM(" ✓ "); + if (!old_relative_mode) { + //DEBUG_ECHOPGM("G90"); + queue.enqueue_now_P(PSTR("G90")); + //DEBUG_ECHOPGM(" ✓ "); + } + } + + ForceCompleteUpdate(); + DEBUG_ECHOLNPGM("manmv done."); + return; + + cannotmove: + DEBUG_ECHOLNPAIR(" cannot move ", axiscode); + return; +} + +#if HAS_PID_HEATING + void DGUSScreenHandler::HandleTemperaturePIDChanged(DGUS_VP_Variable &var, void *val_ptr) { + uint16_t rawvalue = swap16(*(uint16_t*)val_ptr); + DEBUG_ECHOLNPAIR("V1:", rawvalue); + float value = (float)rawvalue / 10; + DEBUG_ECHOLNPAIR("V2:", value); + float newvalue = 0; + + switch (var.VP) { + default: return; + #if HOTENDS >= 1 + case VP_E0_PID_P: newvalue = value; break; + case VP_E0_PID_I: newvalue = scalePID_i(value); break; + case VP_E0_PID_D: newvalue = scalePID_d(value); break; + #endif + #if HOTENDS >= 2 + case VP_E1_PID_P: newvalue = value; break; + case VP_E1_PID_I: newvalue = scalePID_i(value); break; + case VP_E1_PID_D: newvalue = scalePID_d(value); break; + #endif + #if HAS_HEATED_BED + case VP_BED_PID_P: newvalue = value; break; + case VP_BED_PID_I: newvalue = scalePID_i(value); break; + case VP_BED_PID_D: newvalue = scalePID_d(value); break; + #endif + } + + DEBUG_ECHOLNPAIR_F("V3:", newvalue); + *(float *)var.memadr = newvalue; + + skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel + } +#endif // HAS_PID_HEATING + +#if ENABLED(BABYSTEPPING) + void DGUSScreenHandler::HandleLiveAdjustZ(DGUS_VP_Variable &var, void *val_ptr) { + DEBUG_ECHOLNPGM("HandleLiveAdjustZ"); + int16_t flag = swap16(*(uint16_t*)val_ptr), + steps = flag ? -20 : 20; + ExtUI::smartAdjustAxis_steps(steps, ExtUI::axis_t::Z, true); + ForceCompleteUpdate(); + } +#endif + +#if ENABLED(DGUS_FILAMENT_LOADUNLOAD) + + void DGUSScreenHandler::HandleFilamentOption(DGUS_VP_Variable &var, void *val_ptr) { + DEBUG_ECHOLNPGM("HandleFilamentOption"); + + uint8_t e_temp = 0; + filament_data.heated = false; + uint16_t preheat_option = swap16(*(uint16_t*)val_ptr); + if (preheat_option <= 8) { // Load filament type + filament_data.action = 1; + } + else if (preheat_option >= 10) { // Unload filament type + preheat_option -= 10; + filament_data.action = 2; + filament_data.purge_length = DGUS_FILAMENT_PURGE_LENGTH; + } + else { // Cancel filament operation + filament_data.action = 0; + } + + switch (preheat_option) { + case 0: // Load PLA + #ifdef PREHEAT_1_TEMP_HOTEND + e_temp = PREHEAT_1_TEMP_HOTEND; + #endif + break; + case 1: // Load ABS + TERN_(PREHEAT_2_TEMP_HOTEND, e_temp = PREHEAT_2_TEMP_HOTEND); + break; + case 2: // Load PET + #ifdef PREHEAT_3_TEMP_HOTEND + e_temp = PREHEAT_3_TEMP_HOTEND; + #endif + break; + case 3: // Load FLEX + #ifdef PREHEAT_4_TEMP_HOTEND + e_temp = PREHEAT_4_TEMP_HOTEND; + #endif + break; + case 9: // Cool down + default: + e_temp = 0; + break; + } + + if (filament_data.action == 0) { // Go back to utility screen + #if HOTENDS >= 1 + thermalManager.setTargetHotend(e_temp, ExtUI::extruder_t::E0); + #endif + #if HOTENDS >= 2 + thermalManager.setTargetHotend(e_temp, ExtUI::extruder_t::E1); + #endif + GotoScreen(DGUSLCD_SCREEN_UTILITY); + } + else { // Go to the preheat screen to show the heating progress + switch (var.VP) { + default: return; + #if HOTENDS >= 1 + case VP_E0_FILAMENT_LOAD_UNLOAD: + filament_data.extruder = ExtUI::extruder_t::E0; + thermalManager.setTargetHotend(e_temp, filament_data.extruder); + break; + #endif + #if HOTENDS >= 2 + case VP_E1_FILAMENT_LOAD_UNLOAD: + filament_data.extruder = ExtUI::extruder_t::E1; + thermalManager.setTargetHotend(e_temp, filament_data.extruder); + break; + #endif + } + GotoScreen(DGUSLCD_SCREEN_FILAMENT_HEATING); + } + } + + void DGUSScreenHandler::HandleFilamentLoadUnload(DGUS_VP_Variable &var) { + DEBUG_ECHOLNPGM("HandleFilamentLoadUnload"); + if (filament_data.action <= 0) return; + + // If we close to the target temperature, we can start load or unload the filament + if (thermalManager.hotEnoughToExtrude(filament_data.extruder) && \ + thermalManager.targetHotEnoughToExtrude(filament_data.extruder)) { + float movevalue = DGUS_FILAMENT_LOAD_LENGTH_PER_TIME; + + if (filament_data.action == 1) { // load filament + if (!filament_data.heated) { + //GotoScreen(DGUSLCD_SCREEN_FILAMENT_LOADING); + filament_data.heated = true; + } + movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder) + movevalue; + } + else { // unload filament + if (!filament_data.heated) { + GotoScreen(DGUSLCD_SCREEN_FILAMENT_UNLOADING); + filament_data.heated = true; + } + // Before unloading extrude to prevent jamming + if (filament_data.purge_length >= 0) { + movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder) + movevalue; + filament_data.purge_length -= movevalue; + } + else { + movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder) - movevalue; + } + } + ExtUI::setAxisPosition_mm(movevalue, filament_data.extruder); + } + } +#endif // DGUS_FILAMENT_LOADUNLOAD + +bool DGUSScreenHandler::loop() { + dgusdisplay.loop(); + + const millis_t ms = millis(); + static millis_t next_event_ms = 0; + + if (!IsScreenComplete() || ELAPSED(ms, next_event_ms)) { + next_event_ms = ms + DGUS_UPDATE_INTERVAL_MS; + UpdateScreenVPData(); + } + + #if ENABLED(SHOW_BOOTSCREEN) + static bool booted = false; + + if (!booted && TERN0(POWER_LOSS_RECOVERY, recovery.valid())) + booted = true; + + if (!booted && ELAPSED(ms, TERN(USE_MKS_GREEN_UI, 1000, BOOTSCREEN_TIMEOUT))) + booted = true; + #endif + return IsScreenComplete(); +} + +#endif // DGUS_LCD_UI_FYSETC diff --git a/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSScreenHandler.h b/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSScreenHandler.h new file mode 100644 index 0000000000..28ab952e53 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSScreenHandler.h @@ -0,0 +1,240 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 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 + +#include "../DGUSDisplay.h" +#include "../DGUSVPVariable.h" +#include "../DGUSDisplayDef.h" + +#include "../../../../../inc/MarlinConfig.h" + +enum DGUSLCD_Screens : uint8_t; + +class DGUSScreenHandler { +public: + DGUSScreenHandler() = default; + + static bool loop(); + + // Send all 4 strings that are displayed on the infoscreen, confirmation screen and kill screen + // The bools specifing whether the strings are in RAM or FLASH. + static void sendinfoscreen(const char* line1, const char* line2, const char* line3, const char* line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash); + + static void HandleUserConfirmationPopUp(uint16_t ConfirmVP, const char* line1, const char* line2, const char* line3, const char* line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash); + + // "M117" Message -- msg is a RAM ptr. + static void setstatusmessage(const char* msg); + // The same for messages from Flash + static void setstatusmessagePGM(PGM_P const msg); + // Callback for VP "Display wants to change screen on idle printer" + static void ScreenChangeHookIfIdle(DGUS_VP_Variable &var, void *val_ptr); + // Callback for VP "Screen has been changed" + static void ScreenChangeHook(DGUS_VP_Variable &var, void *val_ptr); + + // Callback for VP "All Heaters Off" + static void HandleAllHeatersOff(DGUS_VP_Variable &var, void *val_ptr); + // Hook for "Change this temperature" + static void HandleTemperatureChanged(DGUS_VP_Variable &var, void *val_ptr); + // Hook for "Change Flowrate" + static void HandleFlowRateChanged(DGUS_VP_Variable &var, void *val_ptr); + #if ENABLED(DGUS_UI_MOVE_DIS_OPTION) + // Hook for manual move option + static void HandleManualMoveOption(DGUS_VP_Variable &var, void *val_ptr); + #endif + + // Hook for manual move. + static void HandleManualMove(DGUS_VP_Variable &var, void *val_ptr); + // Hook for manual extrude. + static void HandleManualExtrude(DGUS_VP_Variable &var, void *val_ptr); + // Hook for motor lock and unlook + static void HandleMotorLockUnlock(DGUS_VP_Variable &var, void *val_ptr); + #if ENABLED(POWER_LOSS_RECOVERY) + // Hook for power loss recovery. + static void HandlePowerLossRecovery(DGUS_VP_Variable &var, void *val_ptr); + #endif + // Hook for settings + static void HandleSettings(DGUS_VP_Variable &var, void *val_ptr); + static void HandleStepPerMMChanged(DGUS_VP_Variable &var, void *val_ptr); + static void HandleStepPerMMExtruderChanged(DGUS_VP_Variable &var, void *val_ptr); + + #if HAS_PID_HEATING + // Hook for "Change this temperature PID para" + static void HandleTemperaturePIDChanged(DGUS_VP_Variable &var, void *val_ptr); + // Hook for PID autotune + static void HandlePIDAutotune(DGUS_VP_Variable &var, void *val_ptr); + #endif + #if HAS_BED_PROBE + // Hook for "Change probe offset z" + static void HandleProbeOffsetZChanged(DGUS_VP_Variable &var, void *val_ptr); + #endif + #if ENABLED(BABYSTEPPING) + // Hook for live z adjust action + static void HandleLiveAdjustZ(DGUS_VP_Variable &var, void *val_ptr); + #endif + #if HAS_FAN + // Hook for fan control + static void HandleFanControl(DGUS_VP_Variable &var, void *val_ptr); + #endif + // Hook for heater control + static void HandleHeaterControl(DGUS_VP_Variable &var, void *val_ptr); + #if ENABLED(DGUS_PREHEAT_UI) + // Hook for preheat + static void HandlePreheat(DGUS_VP_Variable &var, void *val_ptr); + #endif + #if ENABLED(DGUS_FILAMENT_LOADUNLOAD) + // Hook for filament load and unload filament option + static void HandleFilamentOption(DGUS_VP_Variable &var, void *val_ptr); + // Hook for filament load and unload + static void HandleFilamentLoadUnload(DGUS_VP_Variable &var); + #endif + + #if ENABLED(SDSUPPORT) + // Callback for VP "Display wants to change screen when there is a SD card" + static void ScreenChangeHookIfSD(DGUS_VP_Variable &var, void *val_ptr); + // Scroll buttons on the file listing screen. + static void DGUSLCD_SD_ScrollFilelist(DGUS_VP_Variable &var, void *val_ptr); + // File touched. + static void DGUSLCD_SD_FileSelected(DGUS_VP_Variable &var, void *val_ptr); + // start print after confirmation received. + static void DGUSLCD_SD_StartPrint(DGUS_VP_Variable &var, void *val_ptr); + // User hit the pause, resume or abort button. + static void DGUSLCD_SD_ResumePauseAbort(DGUS_VP_Variable &var, void *val_ptr); + // User confirmed the abort action + static void DGUSLCD_SD_ReallyAbort(DGUS_VP_Variable &var, void *val_ptr); + // User hit the tune button + static void DGUSLCD_SD_PrintTune(DGUS_VP_Variable &var, void *val_ptr); + // Send a single filename to the display. + static void DGUSLCD_SD_SendFilename(DGUS_VP_Variable &var); + // Marlin informed us that a new SD has been inserted. + static void SDCardInserted(); + // Marlin informed us that the SD Card has been removed(). + static void SDCardRemoved(); + // Marlin informed us about a bad SD Card. + static void SDCardError(); + #endif + + // OK Button the Confirm screen. + static void ScreenConfirmedOK(DGUS_VP_Variable &var, void *val_ptr); + + // Update data after went to new screen (by display or by GotoScreen) + // remember: store the last-displayed screen, so it can get returned to. + // (e.g for pop up messages) + static void UpdateNewScreen(DGUSLCD_Screens newscreen, bool popup=false); + + // Recall the remembered screen. + static void PopToOldScreen(); + + // Make the display show the screen and update all VPs in it. + static void GotoScreen(DGUSLCD_Screens screen, bool ispopup = false); + + static void UpdateScreenVPData(); + + // Helpers to convert and transfer data to the display. + static void DGUSLCD_SendWordValueToDisplay(DGUS_VP_Variable &var); + static void DGUSLCD_SendStringToDisplay(DGUS_VP_Variable &var); + static void DGUSLCD_SendStringToDisplayPGM(DGUS_VP_Variable &var); + static void DGUSLCD_SendTemperaturePID(DGUS_VP_Variable &var); + static void DGUSLCD_SendPercentageToDisplay(DGUS_VP_Variable &var); + static void DGUSLCD_SendPrintProgressToDisplay(DGUS_VP_Variable &var); + static void DGUSLCD_SendPrintTimeToDisplay(DGUS_VP_Variable &var); + + #if ENABLED(PRINTCOUNTER) + static void DGUSLCD_SendPrintAccTimeToDisplay(DGUS_VP_Variable &var); + static void DGUSLCD_SendPrintsTotalToDisplay(DGUS_VP_Variable &var); + #endif + #if HAS_FAN + static void DGUSLCD_SendFanStatusToDisplay(DGUS_VP_Variable &var); + #endif + static void DGUSLCD_SendHeaterStatusToDisplay(DGUS_VP_Variable &var); + #if ENABLED(DGUS_UI_WAITING) + static void DGUSLCD_SendWaitingStatusToDisplay(DGUS_VP_Variable &var); + #endif + + // Send a value from 0..100 to a variable with a range from 0..255 + static void DGUSLCD_PercentageToUint8(DGUS_VP_Variable &var, void *val_ptr); + + template + static void DGUSLCD_SetValueDirectly(DGUS_VP_Variable &var, void *val_ptr) { + if (!var.memadr) return; + union { unsigned char tmp[sizeof(T)]; T t; } x; + unsigned char *ptr = (unsigned char*)val_ptr; + LOOP_L_N(i, sizeof(T)) x.tmp[i] = ptr[sizeof(T) - i - 1]; + *(T*)var.memadr = x.t; + } + + // Send a float value to the display. + // Display will get a 4-byte integer scaled to the number of digits: + // Tell the display the number of digits and it cheats by displaying a dot between... + template + static void DGUSLCD_SendFloatAsLongValueToDisplay(DGUS_VP_Variable &var) { + if (var.memadr) { + float f = *(float *)var.memadr; + f *= cpow(10, decimals); + dgusdisplay.WriteVariable(var.VP, (long)f); + } + } + + // Send a float value to the display. + // Display will get a 2-byte integer scaled to the number of digits: + // Tell the display the number of digits and it cheats by displaying a dot between... + template + static void DGUSLCD_SendFloatAsIntValueToDisplay(DGUS_VP_Variable &var) { + if (var.memadr) { + float f = *(float *)var.memadr; + DEBUG_ECHOLNPAIR_F(" >> ", f, 6); + f *= cpow(10, decimals); + dgusdisplay.WriteVariable(var.VP, (int16_t)f); + } + } + + // Force an update of all VP on the current screen. + static inline void ForceCompleteUpdate() { update_ptr = 0; ScreenComplete = false; } + // Has all VPs sent to the screen + static inline bool IsScreenComplete() { return ScreenComplete; } + + static inline DGUSLCD_Screens getCurrentScreen() { return current_screen; } + + static inline void SetupConfirmAction( void (*f)()) { confirm_action_cb = f; } + +private: + static DGUSLCD_Screens current_screen; //< currently on screen + static constexpr uint8_t NUM_PAST_SCREENS = 4; + static DGUSLCD_Screens past_screens[NUM_PAST_SCREENS]; //< LIFO with past screens for the "back" button. + + static uint8_t update_ptr; //< Last sent entry in the VPList for the actual screen. + static uint16_t skipVP; //< When updating the screen data, skip this one, because the user is interacting with it. + static bool ScreenComplete; //< All VPs sent to screen? + + static uint16_t ConfirmVP; //< context for confirm screen (VP that will be emulated-sent on "OK"). + + #if ENABLED(SDSUPPORT) + static int16_t top_file; //< file on top of file chooser + static int16_t file_to_print; //< touched file to be confirmed + #endif + + static void (*confirm_action_cb)(); +}; + +#if ENABLED(POWER_LOSS_RECOVERY) + #define PLR_SCREEN_RECOVER DGUSLCD_SCREEN_SDPRINTMANIPULATION + #define PLR_SCREEN_CANCEL DGUSLCD_SCREEN_STATUS +#endif diff --git a/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSScreenHandler.cpp new file mode 100644 index 0000000000..90cfae7f09 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSScreenHandler.cpp @@ -0,0 +1,418 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 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 . + * + */ + +#include "../../../../../inc/MarlinConfigPre.h" + +#if ENABLED(DGUS_LCD_UI_HYPRECY) + +#include "../DGUSScreenHandler.h" + +#include "../../../../../MarlinCore.h" +#include "../../../../../gcode/queue.h" +#include "../../../../../libs/duration_t.h" +#include "../../../../../module/settings.h" +#include "../../../../../module/temperature.h" +#include "../../../../../module/motion.h" +#include "../../../../../module/planner.h" +#include "../../../../../module/printcounter.h" +#include "../../../../../sd/cardreader.h" + +#if ENABLED(POWER_LOSS_RECOVERY) + #include "../../../../feature/powerloss.h" +#endif + +#if ENABLED(SDSUPPORT) + + void DGUSScreenHandler::DGUSLCD_SD_FileSelected(DGUS_VP_Variable &var, void *val_ptr) { + uint16_t touched_nr = (int16_t)swap16(*(uint16_t*)val_ptr) + top_file; + if (touched_nr > filelist.count()) return; + if (!filelist.seek(touched_nr)) return; + + if (filelist.isDir()) { + filelist.changeDir(filelist.filename()); + top_file = 0; + ForceCompleteUpdate(); + return; + } + + #if ENABLED(DGUS_PRINT_FILENAME) + // Send print filename + dgusdisplay.WriteVariable(VP_SD_Print_Filename, filelist.filename(), VP_SD_FileName_LEN, true); + #endif + + // Setup Confirmation screen + file_to_print = touched_nr; + + HandleUserConfirmationPopUp(VP_SD_FileSelectConfirm, nullptr, PSTR("Print file"), filelist.filename(), PSTR("from SD Card?"), true, true, false, true); + } + + void DGUSScreenHandler::DGUSLCD_SD_StartPrint(DGUS_VP_Variable &var, void *val_ptr) { + if (!filelist.seek(file_to_print)) return; + ExtUI::printFile(filelist.shortFilename()); + GotoScreen(DGUSLCD_SCREEN_SDPRINTMANIPULATION); + } + + void DGUSScreenHandler::DGUSLCD_SD_ResumePauseAbort(DGUS_VP_Variable &var, void *val_ptr) { + + if (!ExtUI::isPrintingFromMedia()) return; // avoid race condition when user stays in this menu and printer finishes. + switch (swap16(*(uint16_t*)val_ptr)) { + case 0: { // Resume + if (ExtUI::isPrintingFromMediaPaused()) { + ExtUI::resumePrint(); + } + } break; + + case 1: // Pause + + GotoScreen(MKSLCD_SCREEN_PAUSE); + if (!ExtUI::isPrintingFromMediaPaused()) { + ExtUI::pausePrint(); + //ExtUI::mks_pausePrint(); + } + break; + case 2: // Abort + HandleUserConfirmationPopUp(VP_SD_AbortPrintConfirmed, nullptr, PSTR("Abort printing"), filelist.filename(), PSTR("?"), true, true, false, true); + break; + } + } + + void DGUSScreenHandler::DGUSLCD_SD_SendFilename(DGUS_VP_Variable& var) { + uint16_t target_line = (var.VP - VP_SD_FileName0) / VP_SD_FileName_LEN; + if (target_line > DGUS_SD_FILESPERSCREEN) return; + char tmpfilename[VP_SD_FileName_LEN + 1] = ""; + var.memadr = (void*)tmpfilename; + + if (filelist.seek(top_file + target_line)) { + snprintf_P(tmpfilename, VP_SD_FileName_LEN, PSTR("%s%c"), filelist.filename(), filelist.isDir() ? '/' : 0); // snprintf_P(tmpfilename, VP_SD_FileName_LEN, PSTR("%s"), filelist.filename()); + } + DGUSLCD_SendStringToDisplay(var); + } + + void DGUSScreenHandler::SDCardInserted() { + top_file = 0; + filelist.refresh(); + auto cs = getCurrentScreen(); + if (cs == DGUSLCD_SCREEN_MAIN || cs == DGUSLCD_SCREEN_STATUS) + GotoScreen(DGUSLCD_SCREEN_SDFILELIST); + } + + void DGUSScreenHandler::SDCardRemoved() { + if (current_screen == DGUSLCD_SCREEN_SDFILELIST + || (current_screen == DGUSLCD_SCREEN_CONFIRM && (ConfirmVP == VP_SD_AbortPrintConfirmed || ConfirmVP == VP_SD_FileSelectConfirm)) + || current_screen == DGUSLCD_SCREEN_SDPRINTMANIPULATION + ) GotoScreen(DGUSLCD_SCREEN_MAIN); + } + +#endif // SDSUPPORT + +void DGUSScreenHandler::ScreenChangeHook(DGUS_VP_Variable &var, void *val_ptr) { + uint8_t *tmp = (uint8_t*)val_ptr; + + // The keycode in target is coded as , so 0x0100A means + // from screen 1 (main) to 10 (temperature). DGUSLCD_SCREEN_POPUP is special, + // meaning "return to previous screen" + DGUSLCD_Screens target = (DGUSLCD_Screens)tmp[1]; + + DEBUG_ECHOLNPAIR("\n DEBUG target", target); + + if (target == DGUSLCD_SCREEN_POPUP) { + // Special handling for popup is to return to previous menu + if (current_screen == DGUSLCD_SCREEN_POPUP && confirm_action_cb) confirm_action_cb(); + PopToOldScreen(); + return; + } + + UpdateNewScreen(target); + + #ifdef DEBUG_DGUSLCD + if (!DGUSLCD_FindScreenVPMapList(target)) DEBUG_ECHOLNPAIR("WARNING: No screen Mapping found for ", target); + #endif +} + +void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { + DEBUG_ECHOLNPGM("HandleManualMove"); + + int16_t movevalue = swap16(*(uint16_t*)val_ptr); + #if ENABLED(DGUS_UI_MOVE_DIS_OPTION) + if (movevalue) { + const uint16_t choice = *(uint16_t*)var.memadr; + movevalue = movevalue < 0 ? -choice : choice; + } + #endif + char axiscode; + unsigned int speed = 1500; // FIXME: get default feedrate for manual moves, dont hardcode. + + switch (var.VP) { + default: return; + + case VP_MOVE_X: + axiscode = 'X'; + if (!ExtUI::canMove(ExtUI::axis_t::X)) goto cannotmove; + break; + + case VP_MOVE_Y: + axiscode = 'Y'; + if (!ExtUI::canMove(ExtUI::axis_t::Y)) goto cannotmove; + break; + + case VP_MOVE_Z: + axiscode = 'Z'; + speed = 300; // default to 5mm/s + if (!ExtUI::canMove(ExtUI::axis_t::Z)) goto cannotmove; + break; + + case VP_HOME_ALL: // only used for homing + axiscode = '\0'; + movevalue = 0; // ignore value sent from display, this VP is _ONLY_ for homing. + break; + } + + if (!movevalue) { + // homing + DEBUG_ECHOPAIR(" homing ", axiscode); + char buf[6] = "G28 X"; + buf[4] = axiscode; + //DEBUG_ECHOPAIR(" ", buf); + queue.enqueue_one_now(buf); + //DEBUG_ECHOLNPGM(" ✓"); + ForceCompleteUpdate(); + return; + } + else { + // movement + DEBUG_ECHOPAIR(" move ", axiscode); + bool old_relative_mode = relative_mode; + if (!relative_mode) { + //DEBUG_ECHOPGM(" G91"); + queue.enqueue_now_P(PSTR("G91")); + //DEBUG_ECHOPGM(" ✓ "); + } + char buf[32]; // G1 X9999.99 F12345 + unsigned int backup_speed = MMS_TO_MMM(feedrate_mm_s); + char sign[] = "\0"; + int16_t value = movevalue / 100; + if (movevalue < 0) { value = -value; sign[0] = '-'; } + int16_t fraction = ABS(movevalue) % 100; + snprintf_P(buf, 32, PSTR("G0 %c%s%d.%02d F%d"), axiscode, sign, value, fraction, speed); + //DEBUG_ECHOPAIR(" ", buf); + queue.enqueue_one_now(buf); + //DEBUG_ECHOLNPGM(" ✓ "); + if (backup_speed != speed) { + snprintf_P(buf, 32, PSTR("G0 F%d"), backup_speed); + queue.enqueue_one_now(buf); + //DEBUG_ECHOPAIR(" ", buf); + } + // while (!enqueue_and_echo_command(buf)) idle(); + //DEBUG_ECHOLNPGM(" ✓ "); + if (!old_relative_mode) { + //DEBUG_ECHOPGM("G90"); + queue.enqueue_now_P(PSTR("G90")); + //DEBUG_ECHOPGM(" ✓ "); + } + } + + ForceCompleteUpdate(); + DEBUG_ECHOLNPGM("manmv done."); + return; + + cannotmove: + DEBUG_ECHOLNPAIR(" cannot move ", axiscode); + return; +} + +#if HAS_PID_HEATING + void DGUSScreenHandler::HandleTemperaturePIDChanged(DGUS_VP_Variable &var, void *val_ptr) { + uint16_t rawvalue = swap16(*(uint16_t*)val_ptr); + DEBUG_ECHOLNPAIR("V1:", rawvalue); + float value = (float)rawvalue / 10; + DEBUG_ECHOLNPAIR("V2:", value); + float newvalue = 0; + + switch (var.VP) { + default: return; + #if HOTENDS >= 1 + case VP_E0_PID_P: newvalue = value; break; + case VP_E0_PID_I: newvalue = scalePID_i(value); break; + case VP_E0_PID_D: newvalue = scalePID_d(value); break; + #endif + #if HOTENDS >= 2 + case VP_E1_PID_P: newvalue = value; break; + case VP_E1_PID_I: newvalue = scalePID_i(value); break; + case VP_E1_PID_D: newvalue = scalePID_d(value); break; + #endif + #if HAS_HEATED_BED + case VP_BED_PID_P: newvalue = value; break; + case VP_BED_PID_I: newvalue = scalePID_i(value); break; + case VP_BED_PID_D: newvalue = scalePID_d(value); break; + #endif + } + + DEBUG_ECHOLNPAIR_F("V3:", newvalue); + *(float *)var.memadr = newvalue; + + skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel + } +#endif // HAS_PID_HEATING + +#if ENABLED(BABYSTEPPING) + void DGUSScreenHandler::HandleLiveAdjustZ(DGUS_VP_Variable &var, void *val_ptr) { + DEBUG_ECHOLNPGM("HandleLiveAdjustZ"); + int16_t flag = swap16(*(uint16_t*)val_ptr), + steps = flag ? -20 : 20; + ExtUI::smartAdjustAxis_steps(steps, ExtUI::axis_t::Z, true); + ForceCompleteUpdate(); + } +#endif + +#if ENABLED(DGUS_FILAMENT_LOADUNLOAD) + + void DGUSScreenHandler::HandleFilamentOption(DGUS_VP_Variable &var, void *val_ptr) { + DEBUG_ECHOLNPGM("HandleFilamentOption"); + + uint8_t e_temp = 0; + filament_data.heated = false; + uint16_t preheat_option = swap16(*(uint16_t*)val_ptr); + if (preheat_option <= 8) { // Load filament type + filament_data.action = 1; + } + else if (preheat_option >= 10) { // Unload filament type + preheat_option -= 10; + filament_data.action = 2; + filament_data.purge_length = DGUS_FILAMENT_PURGE_LENGTH; + } + else { // Cancel filament operation + filament_data.action = 0; + } + + switch (preheat_option) { + case 0: // Load PLA + #ifdef PREHEAT_1_TEMP_HOTEND + e_temp = PREHEAT_1_TEMP_HOTEND; + #endif + break; + case 1: // Load ABS + TERN_(PREHEAT_2_TEMP_HOTEND, e_temp = PREHEAT_2_TEMP_HOTEND); + break; + case 2: // Load PET + #ifdef PREHEAT_3_TEMP_HOTEND + e_temp = PREHEAT_3_TEMP_HOTEND; + #endif + break; + case 3: // Load FLEX + #ifdef PREHEAT_4_TEMP_HOTEND + e_temp = PREHEAT_4_TEMP_HOTEND; + #endif + break; + case 9: // Cool down + default: + e_temp = 0; + break; + } + + if (filament_data.action == 0) { // Go back to utility screen + #if HOTENDS >= 1 + thermalManager.setTargetHotend(e_temp, ExtUI::extruder_t::E0); + #endif + #if HOTENDS >= 2 + thermalManager.setTargetHotend(e_temp, ExtUI::extruder_t::E1); + #endif + GotoScreen(DGUSLCD_SCREEN_UTILITY); + } + else { // Go to the preheat screen to show the heating progress + switch (var.VP) { + default: return; + #if HOTENDS >= 1 + case VP_E0_FILAMENT_LOAD_UNLOAD: + filament_data.extruder = ExtUI::extruder_t::E0; + thermalManager.setTargetHotend(e_temp, filament_data.extruder); + break; + #endif + #if HOTENDS >= 2 + case VP_E1_FILAMENT_LOAD_UNLOAD: + filament_data.extruder = ExtUI::extruder_t::E1; + thermalManager.setTargetHotend(e_temp, filament_data.extruder); + break; + #endif + } + GotoScreen(DGUSLCD_SCREEN_FILAMENT_HEATING); + } + } + + void DGUSScreenHandler::HandleFilamentLoadUnload(DGUS_VP_Variable &var) { + DEBUG_ECHOLNPGM("HandleFilamentLoadUnload"); + if (filament_data.action <= 0) return; + + // If we close to the target temperature, we can start load or unload the filament + if (thermalManager.hotEnoughToExtrude(filament_data.extruder) && \ + thermalManager.targetHotEnoughToExtrude(filament_data.extruder)) { + float movevalue = DGUS_FILAMENT_LOAD_LENGTH_PER_TIME; + + if (filament_data.action == 1) { // load filament + if (!filament_data.heated) { + //GotoScreen(DGUSLCD_SCREEN_FILAMENT_LOADING); + filament_data.heated = true; + } + movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder) + movevalue; + } + else { // unload filament + if (!filament_data.heated) { + GotoScreen(DGUSLCD_SCREEN_FILAMENT_UNLOADING); + filament_data.heated = true; + } + // Before unloading extrude to prevent jamming + if (filament_data.purge_length >= 0) { + movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder) + movevalue; + filament_data.purge_length -= movevalue; + } + else { + movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder) - movevalue; + } + } + ExtUI::setAxisPosition_mm(movevalue, filament_data.extruder); + } + } +#endif // DGUS_FILAMENT_LOADUNLOAD + +bool DGUSScreenHandler::loop() { + dgusdisplay.loop(); + + const millis_t ms = millis(); + static millis_t next_event_ms = 0; + + if (!IsScreenComplete() || ELAPSED(ms, next_event_ms)) { + next_event_ms = ms + DGUS_UPDATE_INTERVAL_MS; + UpdateScreenVPData(); + } + + #if ENABLED(SHOW_BOOTSCREEN) + static bool booted = false; + + if (!booted && TERN0(POWER_LOSS_RECOVERY, recovery.valid())) + booted = true; + + if (!booted && ELAPSED(ms, TERN(USE_MKS_GREEN_UI, 1000, BOOTSCREEN_TIMEOUT))) + booted = true; + #endif + return IsScreenComplete(); +} + +#endif // DGUS_LCD_UI_HYPRECY diff --git a/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSScreenHandler.h b/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSScreenHandler.h new file mode 100644 index 0000000000..28ab952e53 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSScreenHandler.h @@ -0,0 +1,240 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 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 + +#include "../DGUSDisplay.h" +#include "../DGUSVPVariable.h" +#include "../DGUSDisplayDef.h" + +#include "../../../../../inc/MarlinConfig.h" + +enum DGUSLCD_Screens : uint8_t; + +class DGUSScreenHandler { +public: + DGUSScreenHandler() = default; + + static bool loop(); + + // Send all 4 strings that are displayed on the infoscreen, confirmation screen and kill screen + // The bools specifing whether the strings are in RAM or FLASH. + static void sendinfoscreen(const char* line1, const char* line2, const char* line3, const char* line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash); + + static void HandleUserConfirmationPopUp(uint16_t ConfirmVP, const char* line1, const char* line2, const char* line3, const char* line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash); + + // "M117" Message -- msg is a RAM ptr. + static void setstatusmessage(const char* msg); + // The same for messages from Flash + static void setstatusmessagePGM(PGM_P const msg); + // Callback for VP "Display wants to change screen on idle printer" + static void ScreenChangeHookIfIdle(DGUS_VP_Variable &var, void *val_ptr); + // Callback for VP "Screen has been changed" + static void ScreenChangeHook(DGUS_VP_Variable &var, void *val_ptr); + + // Callback for VP "All Heaters Off" + static void HandleAllHeatersOff(DGUS_VP_Variable &var, void *val_ptr); + // Hook for "Change this temperature" + static void HandleTemperatureChanged(DGUS_VP_Variable &var, void *val_ptr); + // Hook for "Change Flowrate" + static void HandleFlowRateChanged(DGUS_VP_Variable &var, void *val_ptr); + #if ENABLED(DGUS_UI_MOVE_DIS_OPTION) + // Hook for manual move option + static void HandleManualMoveOption(DGUS_VP_Variable &var, void *val_ptr); + #endif + + // Hook for manual move. + static void HandleManualMove(DGUS_VP_Variable &var, void *val_ptr); + // Hook for manual extrude. + static void HandleManualExtrude(DGUS_VP_Variable &var, void *val_ptr); + // Hook for motor lock and unlook + static void HandleMotorLockUnlock(DGUS_VP_Variable &var, void *val_ptr); + #if ENABLED(POWER_LOSS_RECOVERY) + // Hook for power loss recovery. + static void HandlePowerLossRecovery(DGUS_VP_Variable &var, void *val_ptr); + #endif + // Hook for settings + static void HandleSettings(DGUS_VP_Variable &var, void *val_ptr); + static void HandleStepPerMMChanged(DGUS_VP_Variable &var, void *val_ptr); + static void HandleStepPerMMExtruderChanged(DGUS_VP_Variable &var, void *val_ptr); + + #if HAS_PID_HEATING + // Hook for "Change this temperature PID para" + static void HandleTemperaturePIDChanged(DGUS_VP_Variable &var, void *val_ptr); + // Hook for PID autotune + static void HandlePIDAutotune(DGUS_VP_Variable &var, void *val_ptr); + #endif + #if HAS_BED_PROBE + // Hook for "Change probe offset z" + static void HandleProbeOffsetZChanged(DGUS_VP_Variable &var, void *val_ptr); + #endif + #if ENABLED(BABYSTEPPING) + // Hook for live z adjust action + static void HandleLiveAdjustZ(DGUS_VP_Variable &var, void *val_ptr); + #endif + #if HAS_FAN + // Hook for fan control + static void HandleFanControl(DGUS_VP_Variable &var, void *val_ptr); + #endif + // Hook for heater control + static void HandleHeaterControl(DGUS_VP_Variable &var, void *val_ptr); + #if ENABLED(DGUS_PREHEAT_UI) + // Hook for preheat + static void HandlePreheat(DGUS_VP_Variable &var, void *val_ptr); + #endif + #if ENABLED(DGUS_FILAMENT_LOADUNLOAD) + // Hook for filament load and unload filament option + static void HandleFilamentOption(DGUS_VP_Variable &var, void *val_ptr); + // Hook for filament load and unload + static void HandleFilamentLoadUnload(DGUS_VP_Variable &var); + #endif + + #if ENABLED(SDSUPPORT) + // Callback for VP "Display wants to change screen when there is a SD card" + static void ScreenChangeHookIfSD(DGUS_VP_Variable &var, void *val_ptr); + // Scroll buttons on the file listing screen. + static void DGUSLCD_SD_ScrollFilelist(DGUS_VP_Variable &var, void *val_ptr); + // File touched. + static void DGUSLCD_SD_FileSelected(DGUS_VP_Variable &var, void *val_ptr); + // start print after confirmation received. + static void DGUSLCD_SD_StartPrint(DGUS_VP_Variable &var, void *val_ptr); + // User hit the pause, resume or abort button. + static void DGUSLCD_SD_ResumePauseAbort(DGUS_VP_Variable &var, void *val_ptr); + // User confirmed the abort action + static void DGUSLCD_SD_ReallyAbort(DGUS_VP_Variable &var, void *val_ptr); + // User hit the tune button + static void DGUSLCD_SD_PrintTune(DGUS_VP_Variable &var, void *val_ptr); + // Send a single filename to the display. + static void DGUSLCD_SD_SendFilename(DGUS_VP_Variable &var); + // Marlin informed us that a new SD has been inserted. + static void SDCardInserted(); + // Marlin informed us that the SD Card has been removed(). + static void SDCardRemoved(); + // Marlin informed us about a bad SD Card. + static void SDCardError(); + #endif + + // OK Button the Confirm screen. + static void ScreenConfirmedOK(DGUS_VP_Variable &var, void *val_ptr); + + // Update data after went to new screen (by display or by GotoScreen) + // remember: store the last-displayed screen, so it can get returned to. + // (e.g for pop up messages) + static void UpdateNewScreen(DGUSLCD_Screens newscreen, bool popup=false); + + // Recall the remembered screen. + static void PopToOldScreen(); + + // Make the display show the screen and update all VPs in it. + static void GotoScreen(DGUSLCD_Screens screen, bool ispopup = false); + + static void UpdateScreenVPData(); + + // Helpers to convert and transfer data to the display. + static void DGUSLCD_SendWordValueToDisplay(DGUS_VP_Variable &var); + static void DGUSLCD_SendStringToDisplay(DGUS_VP_Variable &var); + static void DGUSLCD_SendStringToDisplayPGM(DGUS_VP_Variable &var); + static void DGUSLCD_SendTemperaturePID(DGUS_VP_Variable &var); + static void DGUSLCD_SendPercentageToDisplay(DGUS_VP_Variable &var); + static void DGUSLCD_SendPrintProgressToDisplay(DGUS_VP_Variable &var); + static void DGUSLCD_SendPrintTimeToDisplay(DGUS_VP_Variable &var); + + #if ENABLED(PRINTCOUNTER) + static void DGUSLCD_SendPrintAccTimeToDisplay(DGUS_VP_Variable &var); + static void DGUSLCD_SendPrintsTotalToDisplay(DGUS_VP_Variable &var); + #endif + #if HAS_FAN + static void DGUSLCD_SendFanStatusToDisplay(DGUS_VP_Variable &var); + #endif + static void DGUSLCD_SendHeaterStatusToDisplay(DGUS_VP_Variable &var); + #if ENABLED(DGUS_UI_WAITING) + static void DGUSLCD_SendWaitingStatusToDisplay(DGUS_VP_Variable &var); + #endif + + // Send a value from 0..100 to a variable with a range from 0..255 + static void DGUSLCD_PercentageToUint8(DGUS_VP_Variable &var, void *val_ptr); + + template + static void DGUSLCD_SetValueDirectly(DGUS_VP_Variable &var, void *val_ptr) { + if (!var.memadr) return; + union { unsigned char tmp[sizeof(T)]; T t; } x; + unsigned char *ptr = (unsigned char*)val_ptr; + LOOP_L_N(i, sizeof(T)) x.tmp[i] = ptr[sizeof(T) - i - 1]; + *(T*)var.memadr = x.t; + } + + // Send a float value to the display. + // Display will get a 4-byte integer scaled to the number of digits: + // Tell the display the number of digits and it cheats by displaying a dot between... + template + static void DGUSLCD_SendFloatAsLongValueToDisplay(DGUS_VP_Variable &var) { + if (var.memadr) { + float f = *(float *)var.memadr; + f *= cpow(10, decimals); + dgusdisplay.WriteVariable(var.VP, (long)f); + } + } + + // Send a float value to the display. + // Display will get a 2-byte integer scaled to the number of digits: + // Tell the display the number of digits and it cheats by displaying a dot between... + template + static void DGUSLCD_SendFloatAsIntValueToDisplay(DGUS_VP_Variable &var) { + if (var.memadr) { + float f = *(float *)var.memadr; + DEBUG_ECHOLNPAIR_F(" >> ", f, 6); + f *= cpow(10, decimals); + dgusdisplay.WriteVariable(var.VP, (int16_t)f); + } + } + + // Force an update of all VP on the current screen. + static inline void ForceCompleteUpdate() { update_ptr = 0; ScreenComplete = false; } + // Has all VPs sent to the screen + static inline bool IsScreenComplete() { return ScreenComplete; } + + static inline DGUSLCD_Screens getCurrentScreen() { return current_screen; } + + static inline void SetupConfirmAction( void (*f)()) { confirm_action_cb = f; } + +private: + static DGUSLCD_Screens current_screen; //< currently on screen + static constexpr uint8_t NUM_PAST_SCREENS = 4; + static DGUSLCD_Screens past_screens[NUM_PAST_SCREENS]; //< LIFO with past screens for the "back" button. + + static uint8_t update_ptr; //< Last sent entry in the VPList for the actual screen. + static uint16_t skipVP; //< When updating the screen data, skip this one, because the user is interacting with it. + static bool ScreenComplete; //< All VPs sent to screen? + + static uint16_t ConfirmVP; //< context for confirm screen (VP that will be emulated-sent on "OK"). + + #if ENABLED(SDSUPPORT) + static int16_t top_file; //< file on top of file chooser + static int16_t file_to_print; //< touched file to be confirmed + #endif + + static void (*confirm_action_cb)(); +}; + +#if ENABLED(POWER_LOSS_RECOVERY) + #define PLR_SCREEN_RECOVER DGUSLCD_SCREEN_SDPRINTMANIPULATION + #define PLR_SCREEN_CANCEL DGUSLCD_SCREEN_STATUS +#endif diff --git a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp new file mode 100644 index 0000000000..14b7394aaa --- /dev/null +++ b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp @@ -0,0 +1,795 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 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 . + * + */ + +#include "../../../../../inc/MarlinConfigPre.h" + +#if ENABLED(DGUS_LCD_UI_MKS) + +#include "DGUSDisplayDef.h" +#include "../DGUSDisplay.h" +#include "../DGUSScreenHandler.h" + +#include "../../../../../module/temperature.h" +#include "../../../../../module/motion.h" +#include "../../../../../module/planner.h" + +#include "../../../ui_api.h" +#include "../../../../marlinui.h" + +#if ENABLED(HAS_STEALTHCHOP) + #include "../../../../module/stepper/trinamic.h" +#endif + +#if ENABLED(DGUS_UI_MOVE_DIS_OPTION) + uint16_t distanceToMove = 10; +#endif + +uint16_t distanceMove = 1; +float distanceFilament = 10; +uint16_t FilamentSpeed = 25; +float ZOffset_distance = 0.1; +float mesh_adj_distance = 0.1; +float Z_distance = 0.1; + +int16_t level_1_x_point = 20; +int16_t level_1_y_point = 20; + +int16_t level_2_x_point = 20; +int16_t level_2_y_point = 20; + +int16_t level_3_x_point = 20; +int16_t level_3_y_point = 20; + +int16_t level_4_x_point = 20; +int16_t level_4_y_point = 20; +int16_t level_5_x_point = X_MAX_POS / 2; +int16_t level_5_y_point = Y_MAX_POS / 2; + +uint16_t tim_h; +uint16_t tim_m; +uint16_t tim_s; + +uint16_t x_park_pos = 20; +uint16_t y_park_pos = 20; +uint16_t z_park_pos = 10; + +xyz_pos_t position_before_pause; + +void MKS_pause_print_move() { + planner.synchronize(); + position_before_pause = current_position; + do_blocking_move_to(X_MIN_POS + x_park_pos, Y_MIN_POS + y_park_pos, current_position.z + z_park_pos); +} + +void MKS_resume_print_move() { do_blocking_move_to(position_before_pause); } + +uint16_t min_ex_temp = 0; + +float z_offset_add = 0; + +#if ENABLED(SENSORLESS_HOMING) + uint16_t tmc_x_step = 0; + uint16_t tmc_y_step = 0; + uint16_t tmc_z_step = 0; +#else + uint16_t tmc_x_step = 0; + uint16_t tmc_y_step = 0; + uint16_t tmc_z_step = 0; +#endif + +uint16_t lcd_default_light = 50; + +EX_FILAMENT_DEF ex_filament; +RUNOUT_MKS_DEF runout_mks; +NOZZLE_PARK_DEF nozzle_park_mks; + +const uint16_t VPList_Boot[] PROGMEM = { + VP_MARLIN_VERSION, + 0x0000 +}; + +#define MKSLIST_E_ITEM(N) VP_T_E##N##_Is, VP_T_E##N##_Set, + +const uint16_t VPList_Main[] PROGMEM = { + // VP_M117, for completeness, but it cannot be auto-uploaded. + #if HOTENDS >= 1 + MKSLIST_E_ITEM(0) VP_E0_STATUS, + #endif + #if HOTENDS >= 2 + MKSLIST_E_ITEM(1) + #endif + #if HAS_HEATED_BED + VP_T_Bed_Is, VP_T_Bed_Set, VP_BED_STATUS, + #endif + #if HAS_FAN + VP_Fan0_Percentage, VP_FAN0_STATUS, + #endif + VP_XPos, VP_YPos, VP_ZPos, + VP_Fan0_Percentage, + VP_Feedrate_Percentage, + #if ENABLED(LCD_SET_PROGRESS_MANUALLY) + VP_PrintProgress_Percentage, + #endif + 0x0000 +}; + +const uint16_t MKSList_Home[] PROGMEM = { + // E Temp + REPEAT(EXTRUDERS, MKSLIST_E_ITEM) + // HB Temp + VP_T_Bed_Is, VP_T_Bed_Set, + // FAN + VP_Fan0_Percentage, + // Language + // VP_HOME_Dis, + + 0x0000 +}; + +const uint16_t MKSList_Setting[] PROGMEM = { + // E Temp + REPEAT(EXTRUDERS, MKSLIST_E_ITEM) + // HB Temp + VP_T_Bed_Is, VP_T_Bed_Set, + // FAN + VP_Fan0_Percentage, + // Language + VP_Setting_Dis, + 0x0000 +}; + +const uint16_t MKSList_Tool[] PROGMEM = { + // E Temp + REPEAT(EXTRUDERS, MKSLIST_E_ITEM) + // HB Temp + VP_T_Bed_Is, VP_T_Bed_Set, + // FAN + VP_Fan0_Percentage, + // Language + VP_Tool_Dis, + // LCD BLK + VP_LCD_BLK, + 0x0000 +}; + +const uint16_t MKSList_EXTRUE[] PROGMEM = { + // E Temp + REPEAT(EXTRUDERS, MKSLIST_E_ITEM) + // HB Temp + VP_T_Bed_Is, VP_T_Bed_Set, + // FAN + VP_Fan0_Percentage, + + VP_Filament_distance, + VP_Filament_speed, + + 0x0000 +}; + +const uint16_t MKSList_LEVEL[] PROGMEM = { + // E Temp + REPEAT(EXTRUDERS, MKSLIST_E_ITEM) + // HB Temp + VP_T_Bed_Is, VP_T_Bed_Set, + // FAN + VP_Fan0_Percentage, + + 0x0000 +}; + +const uint16_t MKSList_MOVE[] PROGMEM = { + // E Temp + REPEAT(EXTRUDERS, MKSLIST_E_ITEM) + // HB Temp + VP_T_Bed_Is, VP_T_Bed_Set, + // FAN + VP_Fan0_Percentage, + + 0x0000 +}; + +const uint16_t MKSList_Print[] PROGMEM = { + // E Temp + REPEAT(EXTRUDERS, MKSLIST_E_ITEM) + // HB Temp + VP_T_Bed_Is, VP_T_Bed_Set, + // FAN + VP_Fan0_Percentage, + // Print Percent + VP_PrintProgress_Percentage, + + VP_PrintTime, + + VP_Flowrate_E0, + VP_Flowrate_E1, + VP_Feedrate_Percentage, + + VP_PrintTime_H, + VP_PrintTime_M, + VP_PrintTime_S, + + VP_XPos, + VP_YPos, + VP_ZPos, + + 0x0000 +}; + +const uint16_t MKSList_SD_File[] PROGMEM = { + VP_SD_FileName0, VP_SD_FileName1, + VP_SD_FileName2, VP_SD_FileName3, + VP_SD_FileName4, VP_SD_FileName5, + VP_SD_FileName6, VP_SD_FileName7, + VP_SD_FileName8, VP_SD_FileName9, + + 0x0000 +}; + +const uint16_t MKSList_TempOnly[] PROGMEM = { + // E Temp + REPEAT(EXTRUDERS, MKSLIST_E_ITEM) + // HB Temp + VP_T_Bed_Is, VP_T_Bed_Set, + // FAN + VP_Fan0_Percentage, + // LCD BLK + VP_LCD_BLK, + 0x0000 +}; + +const uint16_t MKSList_Pluse[] PROGMEM = { + // E Temp + REPEAT(EXTRUDERS, MKSLIST_E_ITEM) + // HB Temp + VP_T_Bed_Is, VP_T_Bed_Set, + // FAN + VP_Fan0_Percentage, + + // Pluse + VP_X_STEP_PER_MM, + VP_Y_STEP_PER_MM, + VP_Z_STEP_PER_MM, + VP_E0_STEP_PER_MM, + VP_E1_STEP_PER_MM, + + 0x0000 +}; + +const uint16_t MKSList_MaxSpeed[] PROGMEM = { + // E Temp + REPEAT(EXTRUDERS, MKSLIST_E_ITEM) + // HB Temp + VP_T_Bed_Is, VP_T_Bed_Set, + // FAN + VP_Fan0_Percentage, + + // Pluse + VP_X_MAX_SPEED, + VP_Y_MAX_SPEED, + VP_Z_MAX_SPEED, + VP_E0_MAX_SPEED, + VP_E1_MAX_SPEED, + + 0x0000 +}; + +const uint16_t MKSList_MaxAcc[] PROGMEM = { + // E Temp + REPEAT(EXTRUDERS, MKSLIST_E_ITEM) + // HB Temp + VP_T_Bed_Is, VP_T_Bed_Set, + // FAN + VP_Fan0_Percentage, + + // ACC + VP_ACC_SPEED, + VP_X_ACC_MAX_SPEED, + VP_Y_ACC_MAX_SPEED, + VP_Z_ACC_MAX_SPEED, + VP_E0_ACC_MAX_SPEED, + VP_E1_ACC_MAX_SPEED, + + 0x0000 +}; + +const uint16_t MKSList_PID[] PROGMEM = { + // E Temp + REPEAT(EXTRUDERS, MKSLIST_E_ITEM) + // HB Temp + VP_T_Bed_Is, VP_T_Bed_Set, + // FAN + VP_Fan0_Percentage, + + // PID + VP_E0_PID_P, + VP_E0_PID_I, + VP_E0_PID_D, + + 0x0000 +}; + +const uint16_t MKSList_Level_Point[] PROGMEM = { + // E Temp + REPEAT(EXTRUDERS, MKSLIST_E_ITEM) + // HB Temp + VP_T_Bed_Is, VP_T_Bed_Set, + // FAN + VP_Fan0_Percentage, + + // Level Point + VP_Level_Point_One_X, + VP_Level_Point_One_Y, + VP_Level_Point_Two_X, + VP_Level_Point_Two_Y, + VP_Level_Point_Three_X, + VP_Level_Point_Three_Y, + VP_Level_Point_Four_X, + VP_Level_Point_Four_Y, + VP_Level_Point_Five_X, + VP_Level_Point_Five_Y, + + 0x0000 +}; + +const uint16_t MKSList_Level_PrintConfig[] PROGMEM = { + VP_T_E0_Set, + VP_T_E1_Set, + VP_T_Bed_Set, + VP_Flowrate_E0, + VP_Flowrate_E1, + VP_Fan0_Percentage, + VP_Feedrate_Percentage, + + 0x0000 +}; + +const uint16_t MKSList_PrintPauseConfig[] PROGMEM = { + // E Temp + REPEAT(EXTRUDERS, MKSLIST_E_ITEM) + // HB Temp + VP_T_Bed_Is, VP_T_Bed_Set, + + VP_X_PARK_POS, + VP_Y_PARK_POS, + VP_Z_PARK_POS, + + 0x0000 +}; + +const uint16_t MKSList_MotoConfig[] PROGMEM = { + // E Temp + REPEAT(EXTRUDERS, MKSLIST_E_ITEM) + // HB Temp + VP_T_Bed_Is, VP_T_Bed_Set, + + VP_TRAVEL_SPEED, + VP_FEEDRATE_MIN_SPEED, + VP_T_F_SPEED, + + 0x0000 +}; + +const uint16_t MKSList_EX_Config[] PROGMEM = { + // E Temp + REPEAT(EXTRUDERS, MKSLIST_E_ITEM) + // HB Temp + VP_T_Bed_Is, VP_T_Bed_Set, + VP_MIN_EX_T,VP_Min_EX_T_E, + 0x0000 +}; + +const uint16_t MKSTMC_Config[] PROGMEM = { + // E Temp + REPEAT(EXTRUDERS, MKSLIST_E_ITEM) + // HB Temp + VP_T_Bed_Is, VP_T_Bed_Set, + VP_MIN_EX_T, + + VP_TMC_X_STEP, + VP_TMC_Y_STEP, + VP_TMC_Z_STEP, + VP_TMC_X1_Current, + VP_TMC_Y1_Current, + VP_TMC_X_Current, + VP_TMC_Y_Current, + VP_TMC_Z_Current, + VP_TMC_E0_Current, + VP_TMC_E1_Current, + VP_TMC_Z1_Current, + + 0x0000 +}; + +const uint16_t MKSAuto_Level[] PROGMEM = { + VP_MESH_LEVEL_POINT_DIS, + VP_ZPos, + 0x0000 +}; + +const uint16_t MKSOffset_Config[] PROGMEM = { + // E Temp + REPEAT(EXTRUDERS, MKSLIST_E_ITEM) + VP_OFFSET_X, + VP_OFFSET_Y, + VP_OFFSET_Z, + 0x0000 +}; + +const uint16_t MKSBabyStep[] PROGMEM = { + VP_ZOffset_DE_DIS, + 0x0000 +}; + +const uint16_t MKSList_About[] PROGMEM = { + // Marlin version + VP_MARLIN_VERSION, + // H43 Version + VP_MKS_H43_VERSION, + VP_MKS_H43_UpdataVERSION, + 0x0000 +}; + +// Page data updata +const struct VPMapping VPMap[] PROGMEM = { + { MKSLCD_SCREEN_BOOT, VPList_Boot }, // Boot Page to show logo 0 + { MKSLCD_SCREEN_HOME, MKSList_Home }, // Home, Page 1 + { MKSLCD_SCREEN_SETTING, MKSList_Setting }, // Setting, Page 2 + { MKSLCD_SCREEM_TOOL, MKSList_Tool }, // Page 3 + { MKSLCD_SCREEN_EXTRUDE_P1, MKSList_EXTRUE }, // Page 4 + { MKSLCD_SCREEN_EXTRUDE_P2, MKSList_EXTRUE }, // Page 11 + { MKSLCD_PAUSE_SETTING_EX, MKSList_EXTRUE }, // Page 57 + { MKSLCD_PAUSE_SETTING_EX2, MKSList_EXTRUE }, // Page 61 + { MKSLCD_SCREEN_LEVEL, MKSList_LEVEL }, // Page 5 + { MKSLCD_SCREEN_MOVE, MKSList_MOVE }, // Page 6 + { MKSLCD_SCREEN_PRINT, MKSList_Print }, // Page 7 + { MKSLCD_SCREEN_PAUSE, MKSList_Print }, // Page 26 + { MKSLCD_SCREEN_CHOOSE_FILE, MKSList_SD_File }, // Page 15 + { MKSLCD_SCREEN_MOTOR_PLUSE, MKSList_Pluse }, // Page 51 + { MKSLCD_SCREEN_MOTOR_SPEED, MKSList_MaxSpeed }, // Page 55 + { MKSLCD_SCREEN_MOTOR_ACC_MAX, MKSList_MaxAcc }, // Page 53 + { MKSLCD_SCREEN_LEVEL_DATA, MKSList_Level_Point }, // Page 48 + { MKSLCD_PrintPause_SET, MKSList_PrintPauseConfig }, // Page 49 + { MKSLCD_FILAMENT_DATA, MKSList_SD_File }, // Page 50 + { MKSLCD_SCREEN_Config, MKSList_TempOnly }, // Page 46 + { MKSLCD_SCREEN_Config_MOTOR, MKSList_MotoConfig }, // Page 47 + { MKSLCD_PID, MKSList_PID }, // Page 56 + { MKSLCD_ABOUT, MKSList_About }, // Page 36 + { MKSLCD_SCREEN_PRINT_CONFIG, MKSList_Level_PrintConfig }, // Page 60 + { MKSLCD_SCREEN_EX_CONFIG, MKSList_EX_Config }, // Page 65 + { MKSLCD_SCREEN_TMC_Config, MKSTMC_Config }, // Page 70 + { MKSLCD_AUTO_LEVEL, MKSAuto_Level }, // Page 73 + { MKSLCD_Screen_Offset_Config, MKSOffset_Config }, // Page 30 + { MKSLCD_Screen_PMove, MKSList_MOVE }, // Page 64 + { MKSLCD_Screen_Baby, MKSBabyStep }, // Page 71 + //{ MKSLCD_SCREEN_LEVEL_DATA, MKSList_SD_File}, + //{ MKSLCD_SCREEN_HOME, VPList_Boot }, + { 0, nullptr } // List is terminated with an nullptr as table entry. +}; + +const char MarlinVersion[] PROGMEM = SHORT_BUILD_VERSION; +const char H43Version[] PROGMEM = "MKS H43_V1.30"; +const char Updata_Time[] PROGMEM = STRING_DISTRIBUTION_DATE; + +// Helper to define a DGUS_VP_Variable for common use cases. +#define VPHELPER(VPADR, VPADRVAR, RXFPTR, TXFPTR) \ + { \ + .VP = VPADR, .memadr = VPADRVAR, .size = sizeof(VPADRVAR), \ + .set_by_display_handler = RXFPTR, .send_to_display_handler = TXFPTR \ + } + +// Helper to define a DGUS_VP_Variable when the sizeo of the var cannot be determined automaticalyl (eg. a string) +#define VPHELPER_STR(VPADR, VPADRVAR, STRLEN, RXFPTR, TXFPTR) \ + { \ + .VP = VPADR, .memadr = VPADRVAR, .size = STRLEN, \ + .set_by_display_handler = RXFPTR, .send_to_display_handler = TXFPTR \ + } + +const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { + // Helper to detect touch events + VPHELPER(VP_SCREENCHANGE, nullptr, ScreenHandler.ScreenChangeHook, nullptr), + VPHELPER(VP_SCREENCHANGE_ASK, nullptr, ScreenHandler.ScreenChangeHookIfIdle, nullptr), + #if ENABLED(SDSUPPORT) + VPHELPER(VP_SCREENCHANGE_WHENSD, nullptr, ScreenHandler.ScreenChangeHookIfSD, nullptr), + #endif + VPHELPER(VP_CONFIRMED, nullptr, ScreenHandler.ScreenConfirmedOK, nullptr), + + // Back Button + VPHELPER(VP_BACK_PAGE, nullptr, &ScreenHandler.ScreenBackChange, nullptr), + VPHELPER(VP_TEMP_ALL_OFF, nullptr, &ScreenHandler.HandleAllHeatersOff, nullptr), + + VPHELPER(VP_MOVE_X, nullptr, &ScreenHandler.HandleManualMove, nullptr), + VPHELPER(VP_MOVE_Y, nullptr, &ScreenHandler.HandleManualMove, nullptr), + VPHELPER(VP_MOVE_Z, nullptr, &ScreenHandler.HandleManualMove, nullptr), + VPHELPER(VP_HOME_ALL, nullptr, &ScreenHandler.HandleManualMove, nullptr), + + VPHELPER(VP_X_HOME, nullptr, &ScreenHandler.HandleManualMove, nullptr), + VPHELPER(VP_Y_HOME, nullptr, &ScreenHandler.HandleManualMove, nullptr), + VPHELPER(VP_Z_HOME, nullptr, &ScreenHandler.HandleManualMove, nullptr), + + VPHELPER(VP_MOVE_DISTANCE, &distanceMove, &ScreenHandler.GetManualMovestep, nullptr), + + VPHELPER(VP_MOTOR_LOCK_UNLOK, nullptr, &ScreenHandler.HandleManualMove, nullptr), + VPHELPER(VP_LEVEL_POINT, nullptr, &ScreenHandler.ManualAssistLeveling, nullptr), + + #if ENABLED(POWER_LOSS_RECOVERY) + VPHELPER(VP_POWER_LOSS_RECOVERY, nullptr, &ScreenHandler.HandlePowerLossRecovery, nullptr), + #endif + VPHELPER(VP_SETTINGS, nullptr, &ScreenHandler.HandleSettings, nullptr), + #if ENABLED(SINGLE_Z_CALIBRATION) + VPHELPER(VP_Z_CALIBRATE, nullptr, &ScreenHandler.HandleZCalibration, nullptr), + #endif + #if ENABLED(FIRST_LAYER_CAL) + VPHELPER(VP_Z_FIRST_LAYER_CAL, nullptr, &ScreenHandler.HandleFirstLayerCal, nullptr), + #endif + {.VP = VP_MARLIN_VERSION, .memadr = (void *)MarlinVersion, .size = VP_MARLIN_VERSION_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = &ScreenHandler.DGUSLCD_SendStringToDisplayPGM}, + // M117 LCD String (We don't need the string in memory but "just" push it to the display on demand, hence the nullptr + {.VP = VP_M117, .memadr = nullptr, .size = VP_M117_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = &ScreenHandler.DGUSLCD_SendStringToDisplay}, + {.VP = VP_MKS_H43_VERSION, .memadr = (void *)H43Version, .size = VP_MKS_H43_VERSION_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = &ScreenHandler.DGUSLCD_SendStringToDisplayPGM}, + {.VP = VP_MKS_H43_UpdataVERSION, .memadr = (void *)Updata_Time, .size = VP_MKS_H43_VERSION_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = &ScreenHandler.DGUSLCD_SendStringToDisplayPGM}, + + // Temperature Data + #if HOTENDS >= 1 + VPHELPER(VP_T_E0_Is, &thermalManager.temp_hotend[0].celsius, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<0>), + VPHELPER(VP_T_E0_Set, &thermalManager.temp_hotend[0].target, ScreenHandler.HandleTemperatureChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_Flowrate_E0, &planner.flow_percentage[ExtUI::extruder_t::E0], ScreenHandler.HandleFlowRateChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_EPos, &destination.e, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<2>), + VPHELPER(VP_MOVE_E0, nullptr, &ScreenHandler.HandleManualExtrude, nullptr), + VPHELPER(VP_E0_CONTROL, &thermalManager.temp_hotend[0].target, &ScreenHandler.HandleHeaterControl, nullptr), + VPHELPER(VP_E0_STATUS, &thermalManager.temp_hotend[0].target, nullptr, &ScreenHandler.DGUSLCD_SendHeaterStatusToDisplay), + #if ENABLED(DGUS_PREHEAT_UI) + VPHELPER(VP_E0_BED_PREHEAT, nullptr, &ScreenHandler.HandlePreheat, nullptr), + #endif + #if ENABLED(PIDTEMP) + VPHELPER(VP_E0_PID_P, &thermalManager.temp_hotend[0].pid.Kp, ScreenHandler.HandleTemperaturePIDChanged, ScreenHandler.DGUSLCD_SendTemperaturePID), + VPHELPER(VP_E0_PID_I, &thermalManager.temp_hotend[0].pid.Ki, ScreenHandler.HandleTemperaturePIDChanged, ScreenHandler.DGUSLCD_SendTemperaturePID), + VPHELPER(VP_E0_PID_D, &thermalManager.temp_hotend[0].pid.Kd, ScreenHandler.HandleTemperaturePIDChanged, ScreenHandler.DGUSLCD_SendTemperaturePID), + VPHELPER(VP_PID_AUTOTUNE_E0, nullptr, &ScreenHandler.HandlePIDAutotune, nullptr), + #endif + #if ENABLED(DGUS_FILAMENT_LOADUNLOAD) + VPHELPER(VP_LOAD_Filament, nullptr, &ScreenHandler.MKS_FilamentLoad, nullptr), + VPHELPER(VP_UNLOAD_Filament, nullptr, &ScreenHandler.MKS_FilamentUnLoad, nullptr), + VPHELPER(VP_Filament_distance, &distanceFilament, &ScreenHandler.GetManualFilament, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<0>), + VPHELPER(VP_Filament_speed, &FilamentSpeed, &ScreenHandler.GetManualFilamentSpeed, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + #endif + #endif + + #if HOTENDS >= 2 + VPHELPER(VP_T_E1_Is, &thermalManager.temp_hotend[1].celsius, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<0>), + VPHELPER(VP_T_E1_Set, &thermalManager.temp_hotend[1].target, ScreenHandler.HandleTemperatureChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_Flowrate_E1, &planner.flow_percentage[ExtUI::extruder_t::E1], ScreenHandler.HandleFlowRateChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_MOVE_E1, nullptr, &ScreenHandler.HandleManualExtrude, nullptr), + VPHELPER(VP_E1_CONTROL, &thermalManager.temp_hotend[1].target, &ScreenHandler.HandleHeaterControl, nullptr), + VPHELPER(VP_E1_STATUS, &thermalManager.temp_hotend[1].target, nullptr, &ScreenHandler.DGUSLCD_SendHeaterStatusToDisplay), + + #if ENABLED(DGUS_FILAMENT_LOADUNLOAD) + VPHELPER(VP_Filament_distance, &distanceFilament, &ScreenHandler.GetManualFilament, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<0>), + VPHELPER(VP_Filament_speed, &FilamentSpeed, &ScreenHandler.GetManualFilamentSpeed, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + #endif + + #if ENABLED(PIDTEMP) + VPHELPER(VP_PID_AUTOTUNE_E1, nullptr, &ScreenHandler.HandlePIDAutotune, nullptr), + #endif + + VPHELPER(VP_E1_FILAMENT_LOAD_UNLOAD, nullptr, &ScreenHandler.HandleFilamentOption, &ScreenHandler.HandleFilamentLoadUnload), + #endif + + #if HAS_HEATED_BED + VPHELPER(VP_T_Bed_Is, &thermalManager.temp_bed.celsius, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<0>), + VPHELPER(VP_T_Bed_Set, &thermalManager.temp_bed.target, ScreenHandler.HandleTemperatureChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_BED_CONTROL, &thermalManager.temp_bed.target, &ScreenHandler.HandleHeaterControl, nullptr), + VPHELPER(VP_BED_STATUS, &thermalManager.temp_bed.target, nullptr, &ScreenHandler.DGUSLCD_SendHeaterStatusToDisplay), + #if ENABLED(PIDTEMPBED) + VPHELPER(VP_BED_PID_P, &thermalManager.temp_bed.pid.Kp, ScreenHandler.HandleTemperaturePIDChanged, ScreenHandler.DGUSLCD_SendTemperaturePID), + VPHELPER(VP_BED_PID_I, &thermalManager.temp_bed.pid.Ki, ScreenHandler.HandleTemperaturePIDChanged, ScreenHandler.DGUSLCD_SendTemperaturePID), + VPHELPER(VP_BED_PID_D, &thermalManager.temp_bed.pid.Kd, ScreenHandler.HandleTemperaturePIDChanged, ScreenHandler.DGUSLCD_SendTemperaturePID), + VPHELPER(VP_PID_AUTOTUNE_BED, nullptr, &ScreenHandler.HandlePIDAutotune, nullptr), + #endif + #endif + + // Fan Data + #if HAS_FAN + #define FAN_VPHELPER(N) \ + VPHELPER(VP_Fan##N##_Percentage, &thermalManager.fan_speed[N], ScreenHandler.DGUSLCD_SetUint8, &ScreenHandler.DGUSLCD_SendFanToDisplay), \ + VPHELPER(VP_FAN##N##_CONTROL, &thermalManager.fan_speed[N], &ScreenHandler.HandleFanControl, nullptr), \ + VPHELPER(VP_FAN##N##_STATUS, &thermalManager.fan_speed[N], nullptr, &ScreenHandler.DGUSLCD_SendFanStatusToDisplay), + REPEAT(FAN_COUNT, FAN_VPHELPER) + #endif + + // Feedrate + VPHELPER(VP_Feedrate_Percentage, &feedrate_percentage, ScreenHandler.DGUSLCD_SetValueDirectly, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), + + // Position Data + VPHELPER(VP_XPos, ¤t_position.x, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<2>), + VPHELPER(VP_YPos, ¤t_position.y, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<2>), + VPHELPER(VP_ZPos, ¤t_position.z, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<2>), + + // Level Point Set + VPHELPER(VP_Level_Point_One_X, &level_1_x_point, ScreenHandler.HandleChangeLevelPoint_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_Level_Point_One_Y, &level_1_y_point, ScreenHandler.HandleChangeLevelPoint_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_Level_Point_Two_X, &level_2_x_point, ScreenHandler.HandleChangeLevelPoint_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_Level_Point_Two_Y, &level_2_y_point, ScreenHandler.HandleChangeLevelPoint_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_Level_Point_Three_X, &level_3_x_point, ScreenHandler.HandleChangeLevelPoint_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_Level_Point_Three_Y, &level_3_y_point, ScreenHandler.HandleChangeLevelPoint_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_Level_Point_Four_X, &level_4_x_point, ScreenHandler.HandleChangeLevelPoint_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_Level_Point_Four_Y, &level_4_y_point, ScreenHandler.HandleChangeLevelPoint_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_Level_Point_Five_X, &level_5_x_point, ScreenHandler.HandleChangeLevelPoint_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_Level_Point_Five_Y, &level_5_y_point, ScreenHandler.HandleChangeLevelPoint_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + + // Print Progress + VPHELPER(VP_PrintProgress_Percentage, nullptr, nullptr, ScreenHandler.DGUSLCD_SendPrintProgressToDisplay), + + //LCD Control + VPHELPER(VP_LCD_BLK, &lcd_default_light, &ScreenHandler.LCD_BLK_Adjust, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + + // Print Time + VPHELPER_STR(VP_PrintTime, nullptr, VP_PrintTime_LEN, nullptr, ScreenHandler.DGUSLCD_SendPrintTimeToDisplay_MKS), + + #if ENABLED(PRINTCOUNTER) + VPHELPER_STR(VP_PrintAccTime, nullptr, VP_PrintAccTime_LEN, nullptr, ScreenHandler.DGUSLCD_SendPrintAccTimeToDisplay), + VPHELPER_STR(VP_PrintsTotal, nullptr, VP_PrintsTotal_LEN, nullptr, ScreenHandler.DGUSLCD_SendPrintsTotalToDisplay), + #endif + + VPHELPER(VP_X_STEP_PER_MM, &planner.settings.axis_steps_per_mm[X_AXIS], ScreenHandler.HandleStepPerMMChanged_MKS, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<0>), + VPHELPER(VP_Y_STEP_PER_MM, &planner.settings.axis_steps_per_mm[Y_AXIS], ScreenHandler.HandleStepPerMMChanged_MKS, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<0>), + VPHELPER(VP_Z_STEP_PER_MM, &planner.settings.axis_steps_per_mm[Z_AXIS], ScreenHandler.HandleStepPerMMChanged_MKS, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<0>), + + VPHELPER(VP_X_MAX_SPEED, &planner.settings.max_feedrate_mm_s[X_AXIS], ScreenHandler.HandleMaxSpeedChange_MKS, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<0>), + VPHELPER(VP_Y_MAX_SPEED, &planner.settings.max_feedrate_mm_s[Y_AXIS], ScreenHandler.HandleMaxSpeedChange_MKS, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<0>), + VPHELPER(VP_Z_MAX_SPEED, &planner.settings.max_feedrate_mm_s[Z_AXIS], ScreenHandler.HandleMaxSpeedChange_MKS, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<0>), + + #if HOTENDS >= 1 + VPHELPER(VP_E0_MAX_SPEED, &planner.settings.max_feedrate_mm_s[E0_AXIS], ScreenHandler.HandleExtruderMaxSpeedChange_MKS, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<0>), + #endif + #if HOTENDS >= 2 + VPHELPER(VP_E1_MAX_SPEED, &planner.settings.max_feedrate_mm_s[E1_AXIS], ScreenHandler.HandleExtruderMaxSpeedChange_MKS, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<0>), + #endif + + VPHELPER(VP_X_ACC_MAX_SPEED, (uint16_t *)&planner.settings.max_acceleration_mm_per_s2[X_AXIS], ScreenHandler.HandleMaxAccChange_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_Y_ACC_MAX_SPEED, (uint16_t *)&planner.settings.max_acceleration_mm_per_s2[Y_AXIS], ScreenHandler.HandleMaxAccChange_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_Z_ACC_MAX_SPEED, (uint16_t *)&planner.settings.max_acceleration_mm_per_s2[Z_AXIS], ScreenHandler.HandleMaxAccChange_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + + #if HOTENDS >= 1 + VPHELPER(VP_E0_ACC_MAX_SPEED, (uint16_t *)&planner.settings.max_acceleration_mm_per_s2[E0_AXIS], ScreenHandler.HandleExtruderAccChange_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + #endif + #if HOTENDS >= 2 + VPHELPER(VP_E1_ACC_MAX_SPEED, (uint16_t *)&planner.settings.max_acceleration_mm_per_s2[E1_AXIS], ScreenHandler.HandleExtruderAccChange_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + #endif + + VPHELPER(VP_TRAVEL_SPEED, (uint16_t *)&planner.settings.travel_acceleration, ScreenHandler.HandleTravelAccChange_MKS, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<0>), + VPHELPER(VP_FEEDRATE_MIN_SPEED, (uint16_t *)&planner.settings.min_feedrate_mm_s, ScreenHandler.HandleFeedRateMinChange_MKS, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<0>), + VPHELPER(VP_T_F_SPEED, (uint16_t *)&planner.settings.min_travel_feedrate_mm_s, ScreenHandler.HandleMin_T_F_MKS, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<0>), + VPHELPER(VP_ACC_SPEED, (uint16_t *)&planner.settings.acceleration, ScreenHandler.HandleAccChange_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + + VPHELPER(VP_X_PARK_POS, &x_park_pos, ScreenHandler.GetParkPos_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_Y_PARK_POS, &y_park_pos, ScreenHandler.GetParkPos_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_Z_PARK_POS, &z_park_pos, ScreenHandler.GetParkPos_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_MIN_EX_T, &thermalManager.extrude_min_temp, ScreenHandler.HandleGetExMinTemp_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + + #if ENABLED(SENSORLESS_HOMING) // TMC SENSORLESS Setting + #if AXIS_HAS_STEALTHCHOP(X) + VPHELPER(VP_TMC_X_STEP, &tmc_x_step, ScreenHandler.TMC_ChangeConfig, ScreenHandler.DGUSLCD_SendTMCStepValue), + #endif + #if AXIS_HAS_STEALTHCHOP(Y) + VPHELPER(VP_TMC_Y_STEP, &tmc_y_step, ScreenHandler.TMC_ChangeConfig, ScreenHandler.DGUSLCD_SendTMCStepValue), + #endif + #if AXIS_HAS_STEALTHCHOP(Z) + VPHELPER(VP_TMC_Z_STEP, &tmc_z_step, ScreenHandler.TMC_ChangeConfig, ScreenHandler.DGUSLCD_SendTMCStepValue), + #endif + #endif + + #if HAS_TRINAMIC_CONFIG // TMC Current Setting + #if AXIS_IS_TMC(X) + VPHELPER(VP_TMC_X_Current, &stepperX.val_mA, ScreenHandler.TMC_ChangeConfig, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + #endif + #if AXIS_IS_TMC(Y) + VPHELPER(VP_TMC_Y_Current, &stepperY.val_mA, ScreenHandler.TMC_ChangeConfig, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + #endif + #if AXIS_IS_TMC(Z) + VPHELPER(VP_TMC_Z_Current, &stepperZ.val_mA, ScreenHandler.TMC_ChangeConfig, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + #endif + #if AXIS_IS_TMC(E0) + VPHELPER(VP_TMC_E0_Current, &stepperE0.val_mA, ScreenHandler.TMC_ChangeConfig, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + #endif + #if AXIS_IS_TMC(E1) + VPHELPER(VP_TMC_E1_Current, &stepperE1.val_mA, ScreenHandler.TMC_ChangeConfig, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + #endif + #if AXIS_IS_TMC(X2) + VPHELPER(VP_TMC_X1_Current, &stepperX2.val_mA, ScreenHandler.TMC_ChangeConfig, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + #endif + #if AXIS_IS_TMC(Y2) + VPHELPER(VP_TMC_Y1_Current, &stepperY2.val_mA, ScreenHandler.TMC_ChangeConfig, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + #endif + #if AXIS_IS_TMC(Z2) + VPHELPER(VP_TMC_Z1_Current, &stepperZ2.val_mA, ScreenHandler.TMC_ChangeConfig, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + #endif + #endif + + VPHELPER(VP_EEPROM_CTRL, nullptr, ScreenHandler.EEPROM_CTRL, nullptr), + VPHELPER(VP_LEVEL_BUTTON, nullptr, ScreenHandler.Level_Ctrl_MKS, nullptr), + VPHELPER(VP_LANGUAGE_CHANGE, nullptr, ScreenHandler.LanguageChange_MKS, nullptr), + + //VPHELPER(VP_SD_Print_LiveAdjustZ, nullptr, ScreenHandler.HandleLiveAdjustZ, nullptr), + + VPHELPER(VP_SD_Print_LiveAdjustZ_Confirm, nullptr, ScreenHandler.ZoffsetConfirm, nullptr), + + VPHELPER(VP_ZOffset_Distance,nullptr ,ScreenHandler.GetZoffsetDistance, nullptr), + VPHELPER(VP_MESH_LEVEL_ADJUST, nullptr, ScreenHandler.MeshLevelDistanceConfig, nullptr), + VPHELPER(VP_MESH_LEVEL_POINT,nullptr, ScreenHandler.MeshLevel,nullptr), + VPHELPER(VP_Min_EX_T_E, &thermalManager.extrude_min_temp, &ScreenHandler.GetMinExtrudeTemp, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_AutoTurnOffSw, nullptr, &ScreenHandler.GetTurnOffCtrl, nullptr), + + #if HOTENDS >= 1 + VPHELPER(VP_E0_STEP_PER_MM, &planner.settings.axis_steps_per_mm[E_AXIS_N(0)], ScreenHandler.HandleStepPerMMExtruderChanged_MKS, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<0>), + #endif + #if HOTENDS >= 2 + VPHELPER(VP_E1_STEP_PER_MM, &planner.settings.axis_steps_per_mm[E_AXIS_N(1)], ScreenHandler.HandleStepPerMMExtruderChanged_MKS, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<0>), + #endif + + + // SDCard File listing + #if ENABLED(SDSUPPORT) + VPHELPER(VP_SD_ScrollEvent, nullptr, ScreenHandler.DGUSLCD_SD_ScrollFilelist, nullptr), + VPHELPER(VP_SD_FileSelected, nullptr, ScreenHandler.DGUSLCD_SD_FileSelected, nullptr), + VPHELPER(VP_SD_FileSelectConfirm, nullptr, ScreenHandler.DGUSLCD_SD_StartPrint, nullptr), + VPHELPER_STR(VP_SD_FileName0, nullptr, VP_SD_FileName_LEN, nullptr, ScreenHandler.DGUSLCD_SD_SendFilename), + VPHELPER_STR(VP_SD_FileName1, nullptr, VP_SD_FileName_LEN, nullptr, ScreenHandler.DGUSLCD_SD_SendFilename), + VPHELPER_STR(VP_SD_FileName2, nullptr, VP_SD_FileName_LEN, nullptr, ScreenHandler.DGUSLCD_SD_SendFilename), + VPHELPER_STR(VP_SD_FileName3, nullptr, VP_SD_FileName_LEN, nullptr, ScreenHandler.DGUSLCD_SD_SendFilename), + VPHELPER_STR(VP_SD_FileName4, nullptr, VP_SD_FileName_LEN, nullptr, ScreenHandler.DGUSLCD_SD_SendFilename), + VPHELPER_STR(VP_SD_FileName5, nullptr, VP_SD_FileName_LEN, nullptr, ScreenHandler.DGUSLCD_SD_SendFilename), + VPHELPER_STR(VP_SD_FileName6, nullptr, VP_SD_FileName_LEN, nullptr, ScreenHandler.DGUSLCD_SD_SendFilename), + VPHELPER_STR(VP_SD_FileName7, nullptr, VP_SD_FileName_LEN, nullptr, ScreenHandler.DGUSLCD_SD_SendFilename), + VPHELPER_STR(VP_SD_FileName8, nullptr, VP_SD_FileName_LEN, nullptr, ScreenHandler.DGUSLCD_SD_SendFilename), + VPHELPER_STR(VP_SD_FileName9, nullptr, VP_SD_FileName_LEN, nullptr, ScreenHandler.DGUSLCD_SD_SendFilename), + VPHELPER(VP_SD_ResumePauseAbort, nullptr, ScreenHandler.DGUSLCD_SD_ResumePauseAbort, nullptr), + VPHELPER(VP_SD_AbortPrintConfirmed, nullptr, ScreenHandler.DGUSLCD_SD_ReallyAbort, nullptr), + VPHELPER(VP_SD_Print_Setting, nullptr, ScreenHandler.DGUSLCD_SD_PrintTune, nullptr), + #if ENABLED(BABYSTEPPING) + VPHELPER(VP_SD_Print_LiveAdjustZ,nullptr, ScreenHandler.HandleLiveAdjustZ, &ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<2>), + VPHELPER(VP_ZOffset_DE_DIS,&z_offset_add,nullptr, &ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<2>), + #endif + #if HAS_BED_PROBE + VPHELPER(VP_OFFSET_X, &probe.offset.x, ScreenHandler.GetOffsetValue,ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<2>), + VPHELPER(VP_OFFSET_Y, &probe.offset.y, ScreenHandler.GetOffsetValue,ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<2>), + VPHELPER(VP_OFFSET_Z, &probe.offset.z, ScreenHandler.GetOffsetValue,ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<2>), + #endif + #endif + + #if ENABLED(DGUS_UI_WAITING) + VPHELPER(VP_WAITING_STATUS, nullptr, nullptr, ScreenHandler.DGUSLCD_SendWaitingStatusToDisplay), + #endif + + // Messages for the User, shared by the popup and the kill screen. They cant be autouploaded as we do not buffer content. + //{.VP = VP_MSGSTR1, .memadr = nullptr, .size = VP_MSGSTR1_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = &ScreenHandler.DGUSLCD_SendStringToDisplayPGM}, + //{.VP = VP_MSGSTR2, .memadr = nullptr, .size = VP_MSGSTR2_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = &ScreenHandler.DGUSLCD_SendStringToDisplayPGM}, + //{.VP = VP_MSGSTR3, .memadr = nullptr, .size = VP_MSGSTR3_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = &ScreenHandler.DGUSLCD_SendStringToDisplayPGM}, + //{.VP = VP_MSGSTR4, .memadr = nullptr, .size = VP_MSGSTR4_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = &ScreenHandler.DGUSLCD_SendStringToDisplayPGM}, + + {.VP = VP_MSGSTR1, .memadr = nullptr, .size = VP_MSGSTR1_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = &ScreenHandler.DGUSLCD_SendStringToDisplay_Language_MKS}, + {.VP = VP_MSGSTR2, .memadr = nullptr, .size = VP_MSGSTR2_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = &ScreenHandler.DGUSLCD_SendStringToDisplay_Language_MKS}, + {.VP = VP_MSGSTR3, .memadr = nullptr, .size = VP_MSGSTR3_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = &ScreenHandler.DGUSLCD_SendStringToDisplay_Language_MKS}, + {.VP = VP_MSGSTR4, .memadr = nullptr, .size = VP_MSGSTR4_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = &ScreenHandler.DGUSLCD_SendStringToDisplay_Language_MKS}, + + VPHELPER(0, 0, 0, 0) // must be last entry. +}; + +#endif // DGUS_LCD_UI_MKS diff --git a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.h b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.h new file mode 100644 index 0000000000..47695edf0f --- /dev/null +++ b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.h @@ -0,0 +1,908 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 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 + +#include "../DGUSDisplayDef.h" + +//#define USE_MKS_GREEN_UI +//#define DGUS_MKS_RUNOUT_SENSOR + +#define LOGO_TIME_DELAY TERN(USE_MKS_GREEN_UI, 5000, 1500) + +#if ENABLED(DGUS_MKS_RUNOUT_SENSOR) + #define MT_DET_1_PIN 1 + #define MT_DET_2_PIN 2 + #define MT_DET_PIN_INVERTING false +#endif + +#define MKS_FINSH + +extern uint16_t distanceMove; +extern float distanceFilament; +extern uint16_t FilamentSpeed; +extern float ZOffset_distance; +extern float mesh_adj_distance; +extern float Z_distance; + +extern int16_t level_1_x_point; +extern int16_t level_1_y_point; +extern int16_t level_2_x_point; +extern int16_t level_2_y_point; +extern int16_t level_3_x_point; +extern int16_t level_3_y_point; +extern int16_t level_4_x_point; +extern int16_t level_4_y_point; +extern int16_t level_5_x_point; +extern int16_t level_5_y_point; + +extern uint16_t tim_h; +extern uint16_t tim_m; +extern uint16_t tim_s; + +extern uint16_t x_park_pos; +extern uint16_t y_park_pos; +extern uint16_t z_park_pos; + +extern xyz_pos_t position_before_pause; +void MKS_pause_print_move(); +void MKS_resume_print_move(); + +extern uint16_t min_ex_temp; + +extern float z_offset_add; + +extern uint16_t tmc_x_step; +extern uint16_t tmc_y_step; +extern uint16_t tmc_z_step; + +extern uint16_t lcd_default_light; + +#if AXIS_HAS_STEALTHCHOP(X) + extern uint16_t tmc_x_current; +#endif +#if AXIS_HAS_STEALTHCHOP(Y) + extern uint16_t tmc_y_current; +#endif +#if AXIS_HAS_STEALTHCHOP(Z) + extern uint16_t tmc_z_current; +#endif +#if AXIS_HAS_STEALTHCHOP(E0) + extern uint16_t tmc_e0_current; +#endif +#if AXIS_HAS_STEALTHCHOP(E1) + extern uint16_t tmc_e1_current; +#endif + +typedef enum { + EX_HEATING, + EX_HEAT_STARUS, + EX_CHANGING, + EX_CHANGE_STATUS, + EX_NONE, +} EX_STATUS_DEF; + +typedef struct { + //uint8_t ex_change_flag:1; + //uint8_t ex_heat_flag:1; + uint8_t ex_load_unload_flag:1; //0:unload 1:load + EX_STATUS_DEF ex_status; + uint32_t ex_tick_start; + uint32_t ex_tick_end; + uint32_t ex_speed; + uint32_t ex_length; + uint32_t ex_need_time; +} EX_FILAMENT_DEF; + +extern EX_FILAMENT_DEF ex_filament; + +typedef enum { + UNRUNOUT_STATUS, + RUNOUT_STATUS, + RUNOUT_WAITTING_STATUS, + RUNOUT_BEGIN_STATUS, +} RUNOUT_MKS_STATUS_DEF; + +typedef struct { + RUNOUT_MKS_STATUS_DEF runout_status; + uint8_t pin_status; + uint8_t de_count; + uint8_t de_times; +} RUNOUT_MKS_DEF; + +extern RUNOUT_MKS_DEF runout_mks; + +typedef struct { + uint8_t print_pause_start_flag:1; + uint8_t runout_flag:1; + bool blstatus; + uint16_t x_pos; + uint16_t y_pos; + uint16_t z_pos; +} NOZZLE_PARK_DEF; + +extern NOZZLE_PARK_DEF nozzle_park_mks; + +enum DGUSLCD_Screens : uint8_t { + #if ENABLED(USE_MKS_GREEN_UI) + + DGUSLCD_SCREEN_BOOT = 33, + DGUSLCD_SCREEN_MAIN = 60, + DGUSLCD_SCREEN_STATUS = 60, + DGUSLCD_SCREEN_STATUS2 = 60, + DGUSLCD_SCREEN_PREHEAT = 18, + DGUSLCD_SCREEN_POWER_LOSS = 100, + DGUSLCD_SCREEN_MANUALMOVE = 192, + DGUSLCD_SCREEN_UTILITY = 120, + DGUSLCD_SCREEN_FILAMENT_UNLOADING = 158, + DGUSLCD_SCREEN_SDFILELIST = 15, + DGUSLCD_SCREEN_SDPRINTMANIPULATION = 15, + DGUSLCD_SCREEN_SDPRINTTUNE = 17, + + MKSLCD_SCREEN_BOOT = 33, + MKSLCD_SCREEN_HOME = 60, // MKS main page + MKSLCD_SCREEN_SETTING = 62, // MKS Setting page / no wifi whit + MKSLCD_SCREEM_TOOL = 64, // MKS Tool page + MKSLCD_SCREEN_EXTRUDE_P1 = 75, + MKSLCD_SCREEN_EXTRUDE_P2 = 77, + MKSLCD_SCREEN_LEVEL = 73, + MKSLCD_AUTO_LEVEL = 81, + MKSLCD_SCREEN_MOVE = 66, + MKSLCD_SCREEN_PRINT = 68, + MKSLCD_SCREEN_PAUSE = 70, + MKSLCD_SCREEN_CHOOSE_FILE = 87, + MKSLCD_SCREEN_NO_CHOOSE_FILE = 88, + MKSLCD_SCREEN_Config = 101, + MKSLCD_SCREEN_Config_MOTOR = 103, + MKSLCD_SCREEN_MOTOR_PLUSE = 104, + MKSLCD_SCREEN_MOTOR_SPEED = 102, + MKSLCD_SCREEN_MOTOR_ACC_MAX = 105, + MKSLCD_SCREEN_PRINT_CONFIG = 72, + MKSLCD_SCREEN_LEVEL_DATA = 106, + MKSLCD_PrintPause_SET = 107, + //MKSLCD_FILAMENT_DATA = 50, + MKSLCD_ABOUT = 83, + MKSLCD_PID = 108, + MKSLCD_PAUSE_SETTING_MOVE = 98, + MKSLCD_PAUSE_SETTING_EX = 96, + MKSLCD_PAUSE_SETTING_EX2 = 97, + MKSLCD_SCREEN_PRINT_CONFIRM = 94, + MKSLCD_SCREEN_EX_CONFIG = 112, + MKSLCD_SCREEN_EEP_Config = 89, + MKSLCD_SCREEN_PrintDone = 92, + MKSLCD_SCREEN_TMC_Config = 111, + MKSLCD_Screen_Offset_Config = 109, + MKSLCD_Screen_PMove = 98, + MKSLCD_Screen_Baby = 79, + + #else + + DGUSLCD_SCREEN_BOOT = 120, + DGUSLCD_SCREEN_MAIN = 1, + + DGUSLCD_SCREEN_STATUS = 1, + DGUSLCD_SCREEN_STATUS2 = 1, + DGUSLCD_SCREEN_PREHEAT = 18, + DGUSLCD_SCREEN_POWER_LOSS = 100, + DGUSLCD_SCREEN_MANUALMOVE = 192, + DGUSLCD_SCREEN_UTILITY = 120, + DGUSLCD_SCREEN_FILAMENT_UNLOADING = 158, + DGUSLCD_SCREEN_SDFILELIST = 15, + DGUSLCD_SCREEN_SDPRINTMANIPULATION = 15, + DGUSLCD_SCREEN_SDPRINTTUNE = 17, + + MKSLCD_SCREEN_BOOT = 0, + MKSLCD_SCREEN_HOME = 1, // MKS main page + MKSLCD_SCREEN_SETTING = 2, // MKS Setting page / no wifi whit + MKSLCD_SCREEM_TOOL = 3, // MKS Tool page + MKSLCD_SCREEN_EXTRUDE_P1 = 4, + MKSLCD_SCREEN_EXTRUDE_P2 = 11, + MKSLCD_SCREEN_LEVEL = 5, + MKSLCD_AUTO_LEVEL = 73, + MKSLCD_SCREEN_LEVEL_PRESS = 9, + MKSLCD_SCREEN_MOVE = 6, + MKSLCD_SCREEN_PRINT = 7, + MKSLCD_SCREEN_PRINT_PRESS = 13, + MKSLCD_SCREEN_PAUSE = 26, + MKSLCD_SCREEN_PAUSE_PRESS = 26, + MKSLCD_SCREEN_CHOOSE_FILE = 15, + MKSLCD_SCREEN_NO_CHOOSE_FILE = 17, + MKSLCD_SCREEN_Config = 46, + MKSLCD_SCREEN_Config_MOTOR = 47, + MKSLCD_SCREEN_MOTOR_PLUSE = 51, + MKSLCD_SCREEN_MOTOR_SPEED = 55, + MKSLCD_SCREEN_MOTOR_ACC_MAX = 53, + MKSLCD_SCREEN_PRINT_CONFIG = 60, + MKSLCD_SCREEN_LEVEL_DATA = 48, + MKSLCD_PrintPause_SET = 49, + MKSLCD_FILAMENT_DATA = 50, + MKSLCD_ABOUT = 36, + MKSLCD_PID = 56, + MKSLCD_PAUSE_SETTING_MOVE = 58, + MKSLCD_PAUSE_SETTING_EX = 57, + MKSLCD_PAUSE_SETTING_EX2 = 61, + MKSLCD_SCREEN_NO_FILE = 42, + MKSLCD_SCREEN_PRINT_CONFIRM = 43, + MKSLCD_SCREEN_EX_CONFIG = 65, + MKSLCD_SCREEN_EEP_Config = 20, + MKSLCD_SCREEN_PrintDone = 25, + MKSLCD_SCREEN_TMC_Config = 70, + MKSLCD_Screen_Offset_Config = 30, + MKSLCD_Screen_PMove = 64, + MKSLCD_Screen_Baby = 71, + + #endif + + DGUSLCD_SCREEN_CONFIRM = 240, + DGUSLCD_SCREEN_KILL = 250, ///< Kill Screen. Must always be 250 (to be able to display "Error wrong LCD Version") + DGUSLCD_SCREEN_WAITING = 251, + DGUSLCD_SCREEN_POPUP = 252, ///< special target, popup screen will also return this code to say "return to previous screen" + DGUSLDC_SCREEN_UNUSED = 255 +}; + +// Display Memory layout used (T5UID) +// Except system variables this is arbitrary, just to organize stuff.... + +// 0x0000 .. 0x0FFF -- System variables and reserved by the display +// 0x1000 .. 0x1FFF -- Variables to never change location, regardless of UI Version +// 0x2000 .. 0x2FFF -- Controls (VPs that will trigger some action) +// 0x3000 .. 0x4FFF -- Marlin Data to be displayed +// 0x5000 .. -- SPs (if we want to modify display elements, e.g change color or like) -- currently unused + +// As there is plenty of space (at least most displays have >8k RAM), we do not pack them too tight, +// so that we can keep variables nicely together in the address space. + +// UI Version always on 0x1000...0x1002 so that the firmware can check this and bail out. + +// constexpr uint16_t VP_UI_VERSION_MAJOR = 0x1000; // Major -- incremented when incompatible +// constexpr uint16_t VP_UI_VERSION_MINOR = 0x1001; // Minor -- incremented on new features, but compatible +// constexpr uint16_t VP_UI_VERSION_PATCH = 0x1002; // Patch -- fixed which do not change functionality. +// constexpr uint16_t VP_UI_FLAVOUR = 0x1010; // lets reserve 16 bytes here to determine if UI is suitable for this Marlin. tbd. + +// Storage space for the Killscreen messages. 0x1100 - 0x1200 . Reused for the popup. +// constexpr uint16_t VP_MSGSTR1 = 0x1100; +// constexpr uint8_t VP_MSGSTR1_LEN = 0x20; // might be more place for it... +// constexpr uint16_t VP_MSGSTR2 = 0x1140; +// constexpr uint8_t VP_MSGSTR2_LEN = 0x20; +// constexpr uint16_t VP_MSGSTR3 = 0x1180; +// constexpr uint8_t VP_MSGSTR3_LEN = 0x20; +// constexpr uint16_t VP_MSGSTR4 = 0x11C0; +// constexpr uint8_t VP_MSGSTR4_LEN = 0x20; + +// Screenchange request for screens that only make sense when printer is idle. +// e.g movement is only allowed if printer is not printing. +// Marlin must confirm by setting the screen manually. +// constexpr uint16_t VP_SCREENCHANGE_ASK = 0x2000; +// constexpr uint16_t VP_SCREENCHANGE = 0x2001; // Key-Return button to new menu pressed. Data contains target screen in low byte and info in high byte. +// constexpr uint16_t VP_TEMP_ALL_OFF = 0x2002; // Turn all heaters off. Value arbitrary ;)= +// constexpr uint16_t VP_SCREENCHANGE_WHENSD = 0x2003; // "Print" Button touched -- go only there if there is an SD Card. +// constexpr uint16_t VP_CONFIRMED = 0x2010; // OK on confirm screen. + +// // Buttons on the SD-Card File listing. +// constexpr uint16_t VP_SD_ScrollEvent = 0x2020; // Data: 0 for "up a directory", numbers are the amount to scroll, e.g -1 one up, 1 one down +// constexpr uint16_t VP_SD_FileSelected = 0x2022; // Number of file field selected. +// constexpr uint16_t VP_SD_FileSelectConfirm = 0x2024; // (This is a virtual VP and emulated by the Confirm Screen when a file has been confirmed) + +// constexpr uint16_t VP_SD_ResumePauseAbort = 0x2026; // Resume(Data=0), Pause(Data=1), Abort(Data=2) SD Card prints +// constexpr uint16_t VP_SD_AbortPrintConfirmed = 0x2028; // Abort print confirmation (virtual, will be injected by the confirm dialog) +// constexpr uint16_t VP_SD_Print_Setting = 0x2040; +// constexpr uint16_t VP_SD_Print_LiveAdjustZ = 0x2050; // Data: 0 down, 1 up + +// Controls for movement (we can't use the incremental / decremental feature of the display at this feature works only with 16 bit values +// (which would limit us to 655.35mm, which is likely not a problem for common setups, but i don't want to rule out hangprinters support) +// A word about the coding: The VP will be per axis and the return code will be an signed 16 bit value in 0.01 mm resolution, telling us +// the relative travel amount t he user wants to do. So eg. if the display sends us VP=2100 with value 100, the user wants us to move X by +1 mm. +// constexpr uint16_t VP_MOVE_X = 0x2100; +// constexpr uint16_t VP_MOVE_Y = 0x2102; +// constexpr uint16_t VP_MOVE_Z = 0x2104; +// constexpr uint16_t VP_MOVE_E0 = 0x2110; +// constexpr uint16_t VP_MOVE_E1 = 0x2112; +// //constexpr uint16_t VP_MOVE_E2 = 0x2114; +// //constexpr uint16_t VP_MOVE_E3 = 0x2116; +// //constexpr uint16_t VP_MOVE_E4 = 0x2118; +// //constexpr uint16_t VP_MOVE_E5 = 0x211A; +// constexpr uint16_t VP_HOME_ALL = 0x2120; +// constexpr uint16_t VP_MOTOR_LOCK_UNLOK = 0x2130; +// constexpr uint16_t VP_XYZ_HOME = 0x2132; + +// Power loss recovery +// constexpr uint16_t VP_POWER_LOSS_RECOVERY = 0x2180; + +// // Fan Control Buttons , switch between "off" and "on" +// constexpr uint16_t VP_FAN0_CONTROL = 0x2200; +// constexpr uint16_t VP_FAN1_CONTROL = 0x2202; +// constexpr uint16_t VP_FAN2_CONTROL = 0x2204; +// constexpr uint16_t VP_FAN3_CONTROL = 0x2206; + +// // Heater Control Buttons , triged between "cool down" and "heat PLA" state +// constexpr uint16_t VP_E0_CONTROL = 0x2210; +// constexpr uint16_t VP_E1_CONTROL = 0x2212; +// //constexpr uint16_t VP_E2_CONTROL = 0x2214; +// //constexpr uint16_t VP_E3_CONTROL = 0x2216; +// //constexpr uint16_t VP_E4_CONTROL = 0x2218; +// //constexpr uint16_t VP_E5_CONTROL = 0x221A; +// constexpr uint16_t VP_BED_CONTROL = 0x221C; + +// // Preheat +// constexpr uint16_t VP_E0_BED_PREHEAT = 0x2220; +// constexpr uint16_t VP_E1_BED_PREHEAT = 0x2222; +// //constexpr uint16_t VP_E2_BED_PREHEAT = 0x2224; +// //constexpr uint16_t VP_E3_BED_PREHEAT = 0x2226; +// //constexpr uint16_t VP_E4_BED_PREHEAT = 0x2228; +// //constexpr uint16_t VP_E5_BED_PREHEAT = 0x222A; + +// // Filament load and unload +// // constexpr uint16_t VP_E0_FILAMENT_LOAD_UNLOAD = 0x2300; +// // constexpr uint16_t VP_E1_FILAMENT_LOAD_UNLOAD = 0x2302; + +// // Settings store , reset + +// // PID autotune +// constexpr uint16_t VP_PID_AUTOTUNE_E0 = 0x2410; +// constexpr uint16_t VP_PID_AUTOTUNE_E1 = 0x2412; +// //constexpr uint16_t VP_PID_AUTOTUNE_E2 = 0x2414; +// //constexpr uint16_t VP_PID_AUTOTUNE_E3 = 0x2416; +// //constexpr uint16_t VP_PID_AUTOTUNE_E4 = 0x2418; +// //constexpr uint16_t VP_PID_AUTOTUNE_E5 = 0x241A; +// constexpr uint16_t VP_PID_AUTOTUNE_BED = 0x2420; +// // Calibrate Z +// constexpr uint16_t VP_Z_CALIBRATE = 0x2430; + +// First layer cal +// constexpr uint16_t VP_Z_FIRST_LAYER_CAL = 0x2500; // Data: 0 - Cancel first layer cal progress, >0 filament type have loaded + +// Firmware version on the boot screen. +// constexpr uint16_t VP_MARLIN_VERSION = 0x3000; +// constexpr uint8_t VP_MARLIN_VERSION_LEN = 16; // there is more space on the display, if needed. + +// Place for status messages. +constexpr uint16_t VP_M117 = 0x7020; +constexpr uint8_t VP_M117_LEN = 0x20; + +// // Temperatures. +// constexpr uint16_t VP_T_E0_Is = 0x3060; // 4 Byte Integer +// constexpr uint16_t VP_T_E0_Set = 0x3062; // 2 Byte Integer +// constexpr uint16_t VP_T_E1_Is = 0x3064; // 4 Byte Integer +// // reserved to support up to 6 Extruders: +// constexpr uint16_t VP_T_E1_Set = 0x3066; // 2 Byte Integer +// constexpr uint16_t VP_T_E2_Is = 0x3068; // 4 Byte Integer +// constexpr uint16_t VP_T_E2_Set = 0x306A; // 2 Byte Integer +// constexpr uint16_t VP_T_E3_Is = 0x306C; // 4 Byte Integer +// constexpr uint16_t VP_T_E3_Set = 0x306E; // 2 Byte Integer +// constexpr uint16_t VP_T_E4_Is = 0x3070; // 4 Byte Integer +// constexpr uint16_t VP_T_E4_Set = 0x3072; // 2 Byte Integer +// constexpr uint16_t VP_T_E5_Is = 0x3074; // 4 Byte Integer +// constexpr uint16_t VP_T_E5_Set = 0x3076; // 2 Byte Integer +// constexpr uint16_t VP_T_E6_Is = 0x3078; // 4 Byte Integer +// constexpr uint16_t VP_T_E6_Set = 0x307A; // 2 Byte Integer +// constexpr uint16_t VP_T_E7_Is = 0x3078; // 4 Byte Integer +// constexpr uint16_t VP_T_E7_Set = 0x307A; // 2 Byte Integer + + +// constexpr uint16_t VP_T_Bed_Is = 0x3080; // 4 Byte Integer +// constexpr uint16_t VP_T_Bed_Set = 0x3082; // 2 Byte Integer + +// constexpr uint16_t VP_Flowrate_E0 = 0x3090; // 2 Byte Integer +// constexpr uint16_t VP_Flowrate_E1 = 0x3092; // 2 Byte Integer +// // reserved for up to 6 Extruders: +// constexpr uint16_t VP_Flowrate_E2 = 0x3094; +// constexpr uint16_t VP_Flowrate_E3 = 0x3096; +// constexpr uint16_t VP_Flowrate_E4 = 0x3098; +// constexpr uint16_t VP_Flowrate_E5 = 0x309A; + +// constexpr uint16_t VP_Fan0_Percentage = 0x3100; // 2 Byte Integer (0..100) +// constexpr uint16_t VP_Fan1_Percentage = 0x3102; // 2 Byte Integer (0..100) +// constexpr uint16_t VP_Fan2_Percentage = 0x3104; // 2 Byte Integer (0..100) +// constexpr uint16_t VP_Fan3_Percentage = 0x3106; // 2 Byte Integer (0..100) +// constexpr uint16_t VP_Feedrate_Percentage = 0x3108; // 2 Byte Integer (0..100) + +// Actual Position +// constexpr uint16_t VP_XPos = 0x3110; // 4 Byte Fixed point number; format xxx.yy +// constexpr uint16_t VP_YPos = 0x3112; // 4 Byte Fixed point number; format xxx.yy +// constexpr uint16_t VP_ZPos = 0x3114; // 4 Byte Fixed point number; format xxx.yy +// constexpr uint16_t VP_EPos = 0x3120; // 4 Byte Fixed point number; format xxx.yy + +// constexpr uint16_t VP_PrintProgress_Percentage = 0x3130; // 2 Byte Integer (0..100) + +// constexpr uint16_t VP_PrintTime = 0x3140; +// constexpr uint16_t VP_PrintTime_LEN = 32; + +// constexpr uint16_t VP_PrintAccTime = 0x3160; +// constexpr uint16_t VP_PrintAccTime_LEN = 32; + +// constexpr uint16_t VP_PrintsTotal = 0x3180; +// constexpr uint16_t VP_PrintsTotal_LEN = 16; + +// // SDCard File Listing +// constexpr uint16_t VP_SD_FileName_LEN = 32; // LEN is shared for all entries. +// constexpr uint16_t DGUS_SD_FILESPERSCREEN = 8; // FIXME move that info to the display and read it from there. +// constexpr uint16_t VP_SD_FileName0 = 0x3200; +// constexpr uint16_t VP_SD_FileName1 = 0x3220; +// constexpr uint16_t VP_SD_FileName2 = 0x3240; +// constexpr uint16_t VP_SD_FileName3 = 0x3260; +// constexpr uint16_t VP_SD_FileName4 = 0x3280; +// constexpr uint16_t VP_SD_FileName5 = 0x32A0; +// constexpr uint16_t VP_SD_FileName6 = 0x32C0; +// constexpr uint16_t VP_SD_FileName7 = 0x32E0; + +// Heater status +constexpr uint16_t VP_E0_STATUS = 0x3410; +constexpr uint16_t VP_E1_STATUS = 0x3412; +//constexpr uint16_t VP_E2_STATUS = 0x3414; +//constexpr uint16_t VP_E3_STATUS = 0x3416; +//constexpr uint16_t VP_E4_STATUS = 0x3418; +//constexpr uint16_t VP_E5_STATUS = 0x341A; +constexpr uint16_t VP_MOVE_OPTION = 0x3500; + +// // PIDs +// constexpr uint16_t VP_E0_PID_P = 0x3700; // at the moment , 2 byte unsigned int , 0~1638.4 +// constexpr uint16_t VP_E0_PID_I = 0x3702; +// constexpr uint16_t VP_E0_PID_D = 0x3704; +// constexpr uint16_t VP_E1_PID_P = 0x3706; // at the moment , 2 byte unsigned int , 0~1638.4 +// constexpr uint16_t VP_E1_PID_I = 0x3708; +// constexpr uint16_t VP_E1_PID_D = 0x370A; +// constexpr uint16_t VP_BED_PID_P = 0x3710; +// constexpr uint16_t VP_BED_PID_I = 0x3712; +// constexpr uint16_t VP_BED_PID_D = 0x3714; + +// Wating screen status +constexpr uint16_t VP_WAITING_STATUS = 0x3800; + +// SPs for certain variables... +// located at 0x5000 and up +// Not used yet! +// This can be used e.g to make controls / data display invisible +constexpr uint16_t SP_T_E0_Is = 0x5000; +constexpr uint16_t SP_T_E0_Set = 0x5010; +constexpr uint16_t SP_T_E1_Is = 0x5020; +constexpr uint16_t SP_T_Bed_Is = 0x5030; +constexpr uint16_t SP_T_Bed_Set = 0x5040; + +/************************************************************************************************************************* + ************************************************************************************************************************* + * DGUS for MKS Mem layout + ************************************************************************************************************************ + ************************************************************************************************************************/ + +#if ENABLED(MKS_FINSH) + /* -------------------------------0x1000-0x1FFF------------------------------- */ + constexpr uint16_t VP_MSGSTR1 = 0x1100; + constexpr uint8_t VP_MSGSTR1_LEN = 0x20; // might be more place for it... + constexpr uint16_t VP_MSGSTR2 = 0x1140; + constexpr uint8_t VP_MSGSTR2_LEN = 0x20; + constexpr uint16_t VP_MSGSTR3 = 0x1180; + constexpr uint8_t VP_MSGSTR3_LEN = 0x20; + constexpr uint16_t VP_MSGSTR4 = 0x11C0; + constexpr uint8_t VP_MSGSTR4_LEN = 0x20; + + constexpr uint16_t VP_MARLIN_VERSION = 0x1A00; + constexpr uint8_t VP_MARLIN_VERSION_LEN = 16; // there is more space on the display, if needed. + + + constexpr uint16_t VP_SCREENCHANGE_ASK = 0x1500; + constexpr uint16_t VP_SCREENCHANGE = 0x1501; // Key-Return button to new menu pressed. Data contains target screen in low byte and info in high byte. + constexpr uint16_t VP_TEMP_ALL_OFF = 0x1502; // Turn all heaters off. Value arbitrary ;)= + constexpr uint16_t VP_SCREENCHANGE_WHENSD = 0x1503; // "Print" Button touched -- go only there if there is an SD Card. + constexpr uint16_t VP_CONFIRMED = 0x1510; // OK on confirm screen. + + constexpr uint16_t VP_BACK_PAGE = 0x1600; + constexpr uint16_t VP_SETTINGS = 0x1620; + // Power loss recovery + constexpr uint16_t VP_POWER_LOSS_RECOVERY = 0x1680; + /* -------------------------------0x2000-0x2FFF------------------------------- */ + // Temperatures. + constexpr uint16_t VP_T_E0_Is = 0x2000; // 4 Byte Integer + constexpr uint16_t VP_T_E0_Set = 0x2004; // 2 Byte Integer + constexpr uint16_t VP_T_E1_Is = 0x2008; // 4 Byte Integer + constexpr uint16_t VP_T_E1_Set = 0x200B; // 2 Byte Integer + constexpr uint16_t VP_T_E2_Is = 0x2010; // 4 Byte Integer + constexpr uint16_t VP_T_E2_Set = 0x2014; // 2 Byte Integer + constexpr uint16_t VP_T_E3_Is = 0x2018; // 4 Byte Integer + constexpr uint16_t VP_T_E3_Set = 0x201B; // 2 Byte Integer + constexpr uint16_t VP_T_E4_Is = 0x2020; // 4 Byte Integer + constexpr uint16_t VP_T_E4_Set = 0x2024; // 2 Byte Integer + constexpr uint16_t VP_T_E5_Is = 0x2028; // 4 Byte Integer + constexpr uint16_t VP_T_E5_Set = 0x202B; // 2 Byte Integer + constexpr uint16_t VP_T_E6_Is = 0x2030; // 4 Byte Integer + constexpr uint16_t VP_T_E6_Set = 0x2034; // 2 Byte Integer + constexpr uint16_t VP_T_E7_Is = 0x2038; // 4 Byte Integer + constexpr uint16_t VP_T_E7_Set = 0x203B; // 2 Byte Integer + + constexpr uint16_t VP_T_Bed_Is = 0x2040; // 4 Byte Integer + constexpr uint16_t VP_T_Bed_Set = 0x2044; // 2 Byte Integer + + constexpr uint16_t VP_Min_EX_T_E = 0x2100; + + constexpr uint16_t VP_Flowrate_E0 = 0x2200; // 2 Byte Integer + constexpr uint16_t VP_Flowrate_E1 = 0x2202; // 2 Byte Integer + constexpr uint16_t VP_Flowrate_E2 = 0x2204; + constexpr uint16_t VP_Flowrate_E3 = 0x2206; + constexpr uint16_t VP_Flowrate_E4 = 0x2208; + constexpr uint16_t VP_Flowrate_E5 = 0x220A; + constexpr uint16_t VP_Flowrate_E6 = 0x220C; + constexpr uint16_t VP_Flowrate_E7 = 0x220E; + + // Move + constexpr uint16_t VP_MOVE_X = 0x2300; + constexpr uint16_t VP_MOVE_Y = 0x2302; + constexpr uint16_t VP_MOVE_Z = 0x2304; + constexpr uint16_t VP_MOVE_E0 = 0x2310; + constexpr uint16_t VP_MOVE_E1 = 0x2312; + constexpr uint16_t VP_MOVE_E2 = 0x2314; + constexpr uint16_t VP_MOVE_E3 = 0x2316; + constexpr uint16_t VP_MOVE_E4 = 0x2318; + constexpr uint16_t VP_MOVE_E5 = 0x231A; + constexpr uint16_t VP_MOVE_E6 = 0x231C; + constexpr uint16_t VP_MOVE_E7 = 0x231E; + constexpr uint16_t VP_HOME_ALL = 0x2320; + constexpr uint16_t VP_MOTOR_LOCK_UNLOK = 0x2330; + constexpr uint16_t VP_MOVE_DISTANCE = 0x2334; + constexpr uint16_t VP_X_HOME = 0x2336; + constexpr uint16_t VP_Y_HOME = 0x2338; + constexpr uint16_t VP_Z_HOME = 0x233A; + + // Fan Control Buttons , switch between "off" and "on" + constexpr uint16_t VP_FAN0_CONTROL = 0x2350; + constexpr uint16_t VP_FAN1_CONTROL = 0x2352; + constexpr uint16_t VP_FAN2_CONTROL = 0x2354; + constexpr uint16_t VP_FAN3_CONTROL = 0x2356; + constexpr uint16_t VP_FAN4_CONTROL = 0x2358; + constexpr uint16_t VP_FAN5_CONTROL = 0x235A; + + constexpr uint16_t VP_LANGUAGE_CHANGE = 0x2380; + constexpr uint16_t VP_LANGUAGE_CHANGE1 = 0x2382; + constexpr uint16_t VP_LANGUAGE_CHANGE2 = 0x2384; + constexpr uint16_t VP_LANGUAGE_CHANGE3 = 0x2386; + constexpr uint16_t VP_LANGUAGE_CHANGE4 = 0x2388; + constexpr uint16_t VP_LANGUAGE_CHANGE5 = 0x238A; + + // LEVEL + constexpr uint16_t VP_LEVEL_POINT = 0x2400; + constexpr uint16_t VP_MESH_LEVEL_POINT = 0x2410; + constexpr uint16_t VP_MESH_LEVEL_ADJUST = 0x2412; + constexpr uint16_t VP_MESH_LEVEL_DIP = 0x2414; + constexpr uint16_t VP_MESH_LEVEL_POINT_X = 0x2416; + constexpr uint16_t VP_MESH_LEVEL_POINT_Y = 0x2418; + constexpr uint16_t VP_LEVEL_BUTTON = 0x2420; + constexpr uint16_t VP_MESH_LEVEL_POINT_DIS = 0x2422; + constexpr uint16_t VP_MESH_LEVEL_BACK = 0x2424; + + constexpr uint16_t VP_E0_FILAMENT_LOAD_UNLOAD = 0x2500; + constexpr uint16_t VP_E1_FILAMENT_LOAD_UNLOAD = 0x2504; + constexpr uint16_t VP_LOAD_Filament = 0x2508; + // constexpr uint16_t VP_LOAD_UNLOAD_Cancle = 0x250A; + constexpr uint16_t VP_UNLOAD_Filament = 0x250B; + constexpr uint16_t VP_Filament_distance = 0x2600; + constexpr uint16_t VP_Filament_speed = 0x2604; + constexpr uint16_t VP_MIN_EX_T = 0x2606; + + constexpr uint16_t VP_E1_Filament_distance = 0x2614; + constexpr uint16_t VP_E1_Filament_speed = 0x2616; + constexpr uint16_t VP_E1_MIN_EX_T = 0x2618; + + constexpr uint16_t VP_Fan0_Percentage = 0x2700; // 2 Byte Integer (0..100) + constexpr uint16_t VP_Fan1_Percentage = 0x2702; // 2 Byte Integer (0..100) + constexpr uint16_t VP_Fan2_Percentage = 0x2704; // 2 Byte Integer (0..100) + constexpr uint16_t VP_Fan3_Percentage = 0x2706; // 2 Byte Integer (0..100) + constexpr uint16_t VP_Feedrate_Percentage = 0x2708; // 2 Byte Integer (0..100) + + // Fan status + constexpr uint16_t VP_FAN0_STATUS = 0x2710; + constexpr uint16_t VP_FAN1_STATUS = 0x2712; + constexpr uint16_t VP_FAN2_STATUS = 0x2714; + constexpr uint16_t VP_FAN3_STATUS = 0x2716; + + // Step per mm + constexpr uint16_t VP_X_STEP_PER_MM = 0x2900; // at the moment , 2 byte unsigned int , 0~1638.4 + constexpr uint16_t VP_Y_STEP_PER_MM = 0x2904; + constexpr uint16_t VP_Z_STEP_PER_MM = 0x2908; + constexpr uint16_t VP_E0_STEP_PER_MM = 0x2910; + constexpr uint16_t VP_E1_STEP_PER_MM = 0x2912; + constexpr uint16_t VP_E2_STEP_PER_MM = 0x2914; + constexpr uint16_t VP_E3_STEP_PER_MM = 0x2916; + constexpr uint16_t VP_E4_STEP_PER_MM = 0x2918; + constexpr uint16_t VP_E5_STEP_PER_MM = 0x291A; + constexpr uint16_t VP_E6_STEP_PER_MM = 0x291C; + constexpr uint16_t VP_E7_STEP_PER_MM = 0x291E; + + constexpr uint16_t VP_X_MAX_SPEED = 0x2A00; + constexpr uint16_t VP_Y_MAX_SPEED = 0x2A04; + constexpr uint16_t VP_Z_MAX_SPEED = 0x2A08; + constexpr uint16_t VP_E0_MAX_SPEED = 0x2A0C; + constexpr uint16_t VP_E1_MAX_SPEED = 0x2A10; + + constexpr uint16_t VP_X_ACC_MAX_SPEED = 0x2A28; + constexpr uint16_t VP_Y_ACC_MAX_SPEED = 0x2A2C; + constexpr uint16_t VP_Z_ACC_MAX_SPEED = 0x2A30; + constexpr uint16_t VP_E0_ACC_MAX_SPEED = 0x2A34; + constexpr uint16_t VP_E1_ACC_MAX_SPEED = 0x2A38; + + constexpr uint16_t VP_TRAVEL_SPEED = 0x2A3C; + constexpr uint16_t VP_FEEDRATE_MIN_SPEED = 0x2A40; + constexpr uint16_t VP_T_F_SPEED = 0x2A44; + constexpr uint16_t VP_ACC_SPEED = 0x2A48; + + /* -------------------------------0x3000-0x3FFF------------------------------- */ + // Buttons on the SD-Card File listing. + constexpr uint16_t VP_SD_ScrollEvent = 0x3020; // Data: 0 for "up a directory", numbers are the amount to scroll, e.g -1 one up, 1 one down + constexpr uint16_t VP_SD_FileSelected = 0x3022; // Number of file field selected. + constexpr uint16_t VP_SD_FileSelectConfirm = 0x3024; // (This is a virtual VP and emulated by the Confirm Screen when a file has been confirmed) + constexpr uint16_t VP_SD_ResumePauseAbort = 0x3026; // Resume(Data=0), Pause(Data=1), Abort(Data=2) SD Card prints + constexpr uint16_t VP_SD_AbortPrintConfirmed = 0x3028; // Abort print confirmation (virtual, will be injected by the confirm dialog) + constexpr uint16_t VP_SD_Print_Setting = 0x3040; + constexpr uint16_t VP_SD_Print_LiveAdjustZ = 0x3050; // Data: 0 down, 1 up + constexpr uint16_t VP_SD_Print_LiveAdjustZ_Confirm = 0x3060; + constexpr uint16_t VP_ZOffset_Distance = 0x3070; + constexpr uint16_t VP_ZOffset_DE_DIS = 0x3080; + // SDCard File Listing + constexpr uint16_t VP_SD_FileName_LEN = 32; // LEN is shared for all entries. + constexpr uint16_t DGUS_SD_FILESPERSCREEN = 10; // FIXME move that info to the display and read it from there. + constexpr uint16_t VP_SD_FileName0 = 0x3100; + constexpr uint16_t VP_SD_FileName1 = 0x3120; + constexpr uint16_t VP_SD_FileName2 = 0x3140; + constexpr uint16_t VP_SD_FileName3 = 0x3160; + constexpr uint16_t VP_SD_FileName4 = 0x3180; + constexpr uint16_t VP_SD_FileName5 = 0x31A0; + constexpr uint16_t VP_SD_FileName6 = 0x31C0; + constexpr uint16_t VP_SD_FileName7 = 0x31E0; + constexpr uint16_t VP_SD_FileName8 = 0x3200; + constexpr uint16_t VP_SD_FileName9 = 0x3220; + + constexpr uint16_t VP_SD_Print_ProbeOffsetZ = 0x32A0; + constexpr uint16_t VP_SD_Print_Baby = 0x32B0; + constexpr uint16_t VP_SD_Print_Filename = 0x32C0; + + // X Y Z Point + constexpr uint16_t VP_XPos = 0x3300; // 4 Byte Fixed point number; format xxx.yy + constexpr uint16_t VP_YPos = 0x3302; // 4 Byte Fixed point number; format xxx.yy + constexpr uint16_t VP_ZPos = 0x3304; // 4 Byte Fixed point number; format xxx.yy + constexpr uint16_t VP_EPos = 0x3306; // 4 Byte Fixed point number; format xxx.yy + + // Print + constexpr uint16_t VP_PrintProgress_Percentage = 0x3330; // 2 Byte Integer (0..100) + constexpr uint16_t VP_PrintTime = 0x3340; + constexpr uint16_t VP_PrintTime_LEN = 32; + constexpr uint16_t VP_PrintAccTime = 0x3360; + constexpr uint16_t VP_PrintAccTime_LEN = 32; + constexpr uint16_t VP_PrintsTotal = 0x3380; + constexpr uint16_t VP_PrintsTotal_LEN = 16; + + constexpr uint16_t VP_File_Pictutr0 = 0x3400; + constexpr uint16_t VP_File_Pictutr1 = 0x3402; + constexpr uint16_t VP_File_Pictutr2 = 0x3404; + constexpr uint16_t VP_File_Pictutr3 = 0x3406; + constexpr uint16_t VP_File_Pictutr4 = 0x3408; + constexpr uint16_t VP_File_Pictutr5 = 0x340A; + constexpr uint16_t VP_File_Pictutr6 = 0x340C; + constexpr uint16_t VP_File_Pictutr7 = 0x340E; + constexpr uint16_t VP_File_Pictutr8 = 0x3410; + constexpr uint16_t VP_File_Pictutr9 = 0x3412; + + constexpr uint16_t VP_BED_STATUS = 0x341C; + + constexpr uint16_t VP_TMC_X_STEP = 0x3430; + constexpr uint16_t VP_TMC_Y_STEP = 0x3432; + constexpr uint16_t VP_TMC_Z_STEP = 0x3434; + + constexpr uint16_t VP_TMC_X1_Current = 0x3436; + constexpr uint16_t VP_TMC_Y1_Current = 0x3438; + constexpr uint16_t VP_TMC_X_Current = 0x343A; + constexpr uint16_t VP_TMC_Y_Current = 0x343C; + constexpr uint16_t VP_TMC_Z_Current = 0x343E; + constexpr uint16_t VP_TMC_E0_Current = 0x3440; + constexpr uint16_t VP_TMC_E1_Current = 0x3442; + constexpr uint16_t VP_TMC_Z1_Current = 0x3444; + + + constexpr uint16_t VP_PrintTime_H = 0x3500; + constexpr uint16_t VP_PrintTime_M = 0x3502; + constexpr uint16_t VP_PrintTime_S = 0x3504; + + // PIDs + constexpr uint16_t VP_E0_PID_P = 0x3700; // at the moment , 2 byte unsigned int , 0~1638.4 + constexpr uint16_t VP_E0_PID_I = 0x3702; + constexpr uint16_t VP_E0_PID_D = 0x3704; + constexpr uint16_t VP_E1_PID_P = 0x3706; // at the moment , 2 byte unsigned int , 0~1638.4 + constexpr uint16_t VP_E1_PID_I = 0x3708; + constexpr uint16_t VP_E1_PID_D = 0x370A; + constexpr uint16_t VP_BED_PID_P = 0x3710; + constexpr uint16_t VP_BED_PID_I = 0x3712; + constexpr uint16_t VP_BED_PID_D = 0x3714; + + constexpr uint16_t VP_EEPROM_CTRL = 0x3720; + + constexpr uint16_t VP_OFFSET_X = 0x3724; + constexpr uint16_t VP_OFFSET_Y = 0x3728; + constexpr uint16_t VP_OFFSET_Z = 0x372B; + + // PID autotune + constexpr uint16_t VP_PID_AUTOTUNE_E0 = 0x3800; + constexpr uint16_t VP_PID_AUTOTUNE_E1 = 0x3802; + constexpr uint16_t VP_PID_AUTOTUNE_E2 = 0x3804; + constexpr uint16_t VP_PID_AUTOTUNE_E3 = 0x3806; + constexpr uint16_t VP_PID_AUTOTUNE_E4 = 0x3808; + constexpr uint16_t VP_PID_AUTOTUNE_E5 = 0x380A; + constexpr uint16_t VP_PID_AUTOTUNE_BED = 0x380C; + // Calibrate Z + constexpr uint16_t VP_Z_CALIBRATE = 0x3810; + + constexpr uint16_t VP_AutoTurnOffSw = 0x3812; + constexpr uint16_t VP_LCD_BLK = 0x3814; + + constexpr uint16_t VP_X_PARK_POS = 0x3900; + constexpr uint16_t VP_Y_PARK_POS = 0x3902; + constexpr uint16_t VP_Z_PARK_POS = 0x3904; + + /* -------------------------------0x4000-0x4FFF------------------------------- */ + // Heater Control Buttons , triged between "cool down" and "heat PLA" state + constexpr uint16_t VP_E0_CONTROL = 0x4010; + constexpr uint16_t VP_E1_CONTROL = 0x4012; + //constexpr uint16_t VP_E2_CONTROL = 0x2214; + //constexpr uint16_t VP_E3_CONTROL = 0x2216; + //constexpr uint16_t VP_E4_CONTROL = 0x2218; + //constexpr uint16_t VP_E5_CONTROL = 0x221A; + constexpr uint16_t VP_BED_CONTROL = 0x401C; + + // Preheat + constexpr uint16_t VP_E0_BED_PREHEAT = 0x4020; + constexpr uint16_t VP_E1_BED_PREHEAT = 0x4022; + //constexpr uint16_t VP_E2_BED_PREHEAT = 0x4024; + //constexpr uint16_t VP_E3_BED_PREHEAT = 0x4026; + //constexpr uint16_t VP_E4_BED_PREHEAT = 0x4028; + //constexpr uint16_t VP_E5_BED_PREHEAT = 0x402A; + + // Filament load and unload + // constexpr uint16_t VP_E0_FILAMENT_LOAD_UNLOAD = 0x4030; + // constexpr uint16_t VP_E1_FILAMENT_LOAD_UNLOAD = 0x4032; + + // Settings store , reset + + // Level data + constexpr uint16_t VP_Level_Point_One_X = 0x4100; + constexpr uint16_t VP_Level_Point_One_Y = 0x4102; + constexpr uint16_t VP_Level_Point_Two_X = 0x4104; + constexpr uint16_t VP_Level_Point_Two_Y = 0x4106; + constexpr uint16_t VP_Level_Point_Three_X = 0x4108; + constexpr uint16_t VP_Level_Point_Three_Y = 0x410A; + constexpr uint16_t VP_Level_Point_Four_X = 0x410C; + constexpr uint16_t VP_Level_Point_Four_Y = 0x410E; + constexpr uint16_t VP_Level_Point_Five_X = 0x4110; + constexpr uint16_t VP_Level_Point_Five_Y = 0x4112; + + + /* H43 Version */ + constexpr uint16_t VP_MKS_H43_VERSION = 0x4A00; // MKS H43 V1.0.0 + constexpr uint16_t VP_MKS_H43_VERSION_LEN = 16; + constexpr uint16_t VP_MKS_H43_UpdataVERSION = 0x4A10; // MKS H43 V1.0.0 + constexpr uint16_t VP_MKS_H43_UpdataVERSION_LEN = 16; + + /* -------------------------------0x5000-0xFFFF------------------------------- */ + constexpr uint16_t VP_HOME_Dis = 0x5000; + constexpr uint16_t VP_Setting_Dis = 0x5010; + constexpr uint16_t VP_Tool_Dis = 0x5020; + constexpr uint16_t VP_Printing_Dis = 0x5030; + + constexpr uint16_t VP_Language_Dis = 0x5080; + constexpr uint16_t VP_LossPoint_Dis = 0x5090; + + constexpr uint16_t VP_PrintPauseConfig_Dis = 0x5120; + constexpr uint16_t VP_MotorPluse_Dis = 0x5140; + constexpr uint16_t VP_MotorMaxSpeed_Dis = 0x5150; + constexpr uint16_t VP_MotorMaxAcc_Dis = 0x5160; + + constexpr uint16_t VP_X_Pluse_Dis = 0x5170; + constexpr uint16_t VP_Y_Pluse_Dis = 0x5180; + constexpr uint16_t VP_Z_Pluse_Dis = 0x5190; + constexpr uint16_t VP_E0_Pluse_Dis = 0x51A0; + constexpr uint16_t VP_E1_Pluse_Dis = 0x51B0; + + constexpr uint16_t VP_X_Max_Speed_Dis = 0x5280; + constexpr uint16_t VP_Y_Max_Speed_Dis = 0x5290; + constexpr uint16_t VP_Z_Max_Speed_Dis = 0x52A0; + constexpr uint16_t VP_E0_Max_Speed_Dis = 0x52B0; + constexpr uint16_t VP_E1_Max_Speed_Dis = 0x52C0; + + constexpr uint16_t VP_X_Max_Acc_Speed_Dis = 0x51E0; + constexpr uint16_t VP_Y_Max_Acc_Speed_Dis = 0x51F0; + constexpr uint16_t VP_Z_Max_Acc_Speed_Dis = 0x5200; + constexpr uint16_t VP_E0_Max_Acc_Speed_Dis = 0x5210; + constexpr uint16_t VP_E1_Max_Acc_Speed_Dis = 0x5220; + + + constexpr uint16_t VP_PrintTime_Dis = 0x5470; + constexpr uint16_t VP_E0_Temp_Dis = 0x5310; + constexpr uint16_t VP_E1_Temp_Dis = 0x5320; + constexpr uint16_t VP_HB_Temp_Dis = 0x5330; + constexpr uint16_t VP_Feedrate_Dis = 0x5350; + constexpr uint16_t VP_PrintAcc_Dis = 0x5340; + constexpr uint16_t VP_Fan_Speed_Dis = 0x5360; + + constexpr uint16_t VP_Min_Ex_Temp_Dis = 0x5380; + + + constexpr uint16_t VP_X_PARK_POS_Dis = 0x53E0; + constexpr uint16_t VP_Y_PARK_POS_Dis = 0x53F0; + constexpr uint16_t VP_Z_PARK_POS_Dis = 0x5400; + + + constexpr uint16_t VP_TravelAcc_Dis = 0x5440; + constexpr uint16_t VP_FeedRateMin_Dis = 0x5450; + constexpr uint16_t VP_TravelFeeRateMin_Dis = 0x5460; + constexpr uint16_t VP_ACC_Dis = 0x5480; + + constexpr uint16_t VP_Extrusion_Dis = 0x5230; + constexpr uint16_t VP_HeatBed_Dis = 0x5240; + + constexpr uint16_t VP_Printting_Dis = 0x5430; + constexpr uint16_t VP_FactoryDefaults_Dis = 0x54C0; + constexpr uint16_t VP_StoreSetting_Dis = 0x54B0; + constexpr uint16_t VP_Info_EEPROM_2_Dis = 0x54D0; + constexpr uint16_t VP_Info_EEPROM_1_Dis = 0x54E0; + + constexpr uint16_t VP_AutoLevel_1_Dis = 0x55F0; + + constexpr uint16_t VP_TMC_X_Step_Dis = 0x5530; + constexpr uint16_t VP_TMC_Y_Step_Dis = 0x5540; + constexpr uint16_t VP_TMC_Z_Step_Dis = 0x5550; + constexpr uint16_t VP_TMC_X1_Current_Dis = 0x5560; + constexpr uint16_t VP_TMC_Y1_Current_Dis = 0x5570; + constexpr uint16_t VP_TMC_X_Current_Dis = 0x5580; + constexpr uint16_t VP_TMC_Y_Current_Dis = 0x5590; + constexpr uint16_t VP_TMC_Z_Current_Dis = 0x55A0; + constexpr uint16_t VP_TMC_E0_Current_Dis = 0x55B0; + constexpr uint16_t VP_TMC_E1_Current_Dis = 0x55C0; + constexpr uint16_t VP_TMC_Z1_Current_Dis = 0x55E0; + + constexpr uint16_t VP_AutoLEVEL_INFO1 = 0x5600; + constexpr uint16_t VP_EX_TEMP_INFO1_Dis = 0x5610; + constexpr uint16_t VP_EX_TEMP_INFO2_Dis = 0x5620; + constexpr uint16_t VP_EX_TEMP_INFO3_Dis = 0x5630; + constexpr uint16_t VP_LCD_BLK_Dis = 0x56A0; + constexpr uint16_t VP_Info_PrinfFinsh_1_Dis = 0x5C00; + constexpr uint16_t VP_Info_PrinfFinsh_2_Dis = 0x5C10; + + constexpr uint16_t VP_Length_Dis = 0x5B00; + + constexpr uint16_t VP_PrintConfrim_Info_Dis = 0x5B90; + constexpr uint16_t VP_StopPrintConfrim_Info_Dis = 0x5B80; + + constexpr uint16_t VP_Point_One_Dis = 0x5BA0; + constexpr uint16_t VP_Point_Two_Dis = 0x5BB0; + constexpr uint16_t VP_Point_Three_Dis = 0x5BC0; + constexpr uint16_t VP_Point_Four_Dis = 0x5BD0; + constexpr uint16_t VP_Point_Five_Dis = 0x5BE0; + + constexpr uint16_t VP_Print_Dis = 0x5250; + + constexpr uint16_t VP_About_Dis = 0x5A00; + constexpr uint16_t VP_Config_Dis = 0x5A10; + constexpr uint16_t VP_Filament_Dis = 0x5A20; + constexpr uint16_t VP_Move_Dis = 0x5A30; + constexpr uint16_t VP_Level_Dis = 0x5A50; + constexpr uint16_t VP_Speed_Dis = 0x5A70; + constexpr uint16_t VP_InOut_Dis = 0x5A80; + + constexpr uint16_t VP_MotorConfig_Dis = 0x5100; + constexpr uint16_t VP_LevelConfig_Dis = 0x5110; + constexpr uint16_t VP_Advance_Dis = 0x5130; + constexpr uint16_t VP_TemperatureConfig_Dis = 0x5390; + +#endif // MKS_FINSH diff --git a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp new file mode 100644 index 0000000000..0fef87b64c --- /dev/null +++ b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp @@ -0,0 +1,2109 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 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 . + * + */ + +#include "../../../../inc/MarlinConfigPre.h" + +#if ENABLED(DGUS_LCD_UI_MKS) + +#include "../DGUSScreenHandler.h" + +#include "../../../../../MarlinCore.h" +#include "../../../../../gcode/queue.h" +#include "../../../../../libs/duration_t.h" +#include "../../../../../module/settings.h" +#include "../../../../../module/temperature.h" +#include "../../../../../module/motion.h" +#include "../../../../../module/planner.h" +#include "../../../../../module/printcounter.h" +#include "../../../../../sd/cardreader.h" + +#include "../../../../../gcode/gcode.h" +#include "../../../../../pins/pins.h" +#include "../../../../../libs/nozzle.h" +#if ENABLED(HAS_STEALTHCHOP) + #include "../../../../../module/stepper/trinamic.h" + #include "../../../../../module/stepper/indirection.h" +#endif +#include "../../../../../module/probe.h" + +#if ENABLED(POWER_LOSS_RECOVERY) + #include "../../../../../feature/powerloss.h" +#endif + +bool DGUSAutoTurnOff = false; +uint8_t DGUSLanguageSwitch = 0; // Switch language for MKS DGUS + +// endianness swap +uint32_t swap32(const uint32_t value) { return (value & 0x000000FFU) << 24U | (value & 0x0000FF00U) << 8U | (value & 0x00FF0000U) >> 8U | (value & 0xFF000000U) >> 24U; } + +void DGUSScreenHandler::sendinfoscreen_ch_mks(const uint16_t* line1, const uint16_t* line2, const uint16_t* line3, const uint16_t* line4) { + dgusdisplay.WriteVariable(VP_MSGSTR1, line1, 32, true); + dgusdisplay.WriteVariable(VP_MSGSTR2, line2, 32, true); + dgusdisplay.WriteVariable(VP_MSGSTR3, line3, 32, true); + dgusdisplay.WriteVariable(VP_MSGSTR4, line4, 32, true); +} + +void DGUSScreenHandler::sendinfoscreen_en_mks(const char* line1, const char* line2, const char* line3, const char* line4) { + dgusdisplay.WriteVariable(VP_MSGSTR1, line1, 32, true); + dgusdisplay.WriteVariable(VP_MSGSTR2, line2, 32, true); + dgusdisplay.WriteVariable(VP_MSGSTR3, line3, 32, true); + dgusdisplay.WriteVariable(VP_MSGSTR4, line4, 32, true); +} + +void DGUSScreenHandler::sendinfoscreen_mks(const void* line1, const void* line2, const void* line3, const void* line4, uint16_t language) { + if (language == MKS_English) + DGUSScreenHandler::sendinfoscreen_en_mks((char *)line1, (char *)line2, (char *)line3, (char *)line4); + else if (language == MKS_SimpleChinese) + DGUSScreenHandler::sendinfoscreen_ch_mks((uint16_t *)line1, (uint16_t *)line2, (uint16_t *)line3, (uint16_t *)line4); +} + +void DGUSScreenHandler::DGUSLCD_SendFanToDisplay(DGUS_VP_Variable &var) { + if (var.memadr) { + //DEBUG_ECHOPAIR(" DGUS_LCD_SendWordValueToDisplay ", var.VP); + //DEBUG_ECHOLNPAIR(" data ", *(uint16_t *)var.memadr); + uint16_t tmp = *(uint8_t *) var.memadr; // +1 -> avoid rounding issues for the display. + // tmp = map(tmp, 0, 255, 0, 100); + dgusdisplay.WriteVariable(var.VP, tmp); + } +} + +void DGUSScreenHandler::DGUSLCD_SendBabyStepToDisplay_MKS(DGUS_VP_Variable &var) { + float value = current_position.z; + DEBUG_ECHOLNPAIR_F(" >> ", value, 6); + value *= cpow(10, 2); + dgusdisplay.WriteVariable(VP_SD_Print_Baby, (uint16_t)value); +} + +void DGUSScreenHandler::DGUSLCD_SendPrintTimeToDisplay_MKS(DGUS_VP_Variable &var) { + duration_t elapsed = print_job_timer.duration(); + uint32_t time = elapsed.value; + dgusdisplay.WriteVariable(VP_PrintTime_H, uint16_t(time / 3600)); + dgusdisplay.WriteVariable(VP_PrintTime_M, uint16_t(time % 3600 / 60)); + dgusdisplay.WriteVariable(VP_PrintTime_S, uint16_t((time % 3600) % 60)); +} + +void DGUSScreenHandler::DGUSLCD_SetUint8(DGUS_VP_Variable &var, void *val_ptr) { + if (var.memadr) { + uint16_t value = swap16(*(uint16_t*)val_ptr); + DEBUG_ECHOLNPAIR("FAN value get:", value); + *(uint8_t*)var.memadr = map(constrain(value, 0, 255), 0, 255, 0, 255); + DEBUG_ECHOLNPAIR("FAN value change:", *(uint8_t*)var.memadr); + } +} + +void DGUSScreenHandler::DGUSLCD_SendGbkToDisplay(DGUS_VP_Variable &var) { + DEBUG_ECHOLNPAIR(" data ", *(uint16_t *)var.memadr); + uint16_t *tmp = (uint16_t*) var.memadr; + dgusdisplay.WriteVariable(var.VP, tmp, var.size, true); +} + +void DGUSScreenHandler::DGUSLCD_SendStringToDisplay_Language_MKS(DGUS_VP_Variable &var) { + if (DGUSLanguageSwitch == MKS_English) { + char *tmp = (char*) var.memadr; + dgusdisplay.WriteVariable(var.VP, tmp, var.size, true); + } + else if (DGUSLanguageSwitch == MKS_SimpleChinese) { + uint16_t *tmp = (uint16_t *)var.memadr; + dgusdisplay.WriteVariable(var.VP, tmp, var.size, true); + } +} + +void DGUSScreenHandler::DGUSLCD_SendTMCStepValue(DGUS_VP_Variable &var) { + #if ENABLED(SENSORLESS_HOMING) + #if AXIS_HAS_STEALTHCHOP(X) + tmc_x_step = stepperX.homing_threshold(); + dgusdisplay.WriteVariable(var.VP, *(int16_t*)var.memadr); + #endif + #if AXIS_HAS_STEALTHCHOP(Y) + tmc_y_step = stepperY.homing_threshold(); + dgusdisplay.WriteVariable(var.VP, *(int16_t*)var.memadr); + #endif + #if AXIS_HAS_STEALTHCHOP(Z) + tmc_z_step = stepperZ.homing_threshold(); + dgusdisplay.WriteVariable(var.VP, *(int16_t*)var.memadr); + #endif + #endif +} + +#if ENABLED(SDSUPPORT) + + void DGUSScreenHandler::DGUSLCD_SD_FileSelected(DGUS_VP_Variable &var, void *val_ptr) { + uint16_t touched_nr = (int16_t)swap16(*(uint16_t*)val_ptr) + top_file; + if (touched_nr != 0x0F && touched_nr > filelist.count()) return; + if (!filelist.seek(touched_nr) && touched_nr != 0x0F) return; + + if (touched_nr == 0x0F) { + if (filelist.isAtRootDir()) + GotoScreen(DGUSLCD_SCREEN_MAIN); + else + filelist.upDir(); + return; + } + + if (filelist.isDir()) { + filelist.changeDir(filelist.filename()); + top_file = 0; + ForceCompleteUpdate(); + return; + } + + #if ENABLED(DGUS_PRINT_FILENAME) + // Send print filename + dgusdisplay.WriteVariable(VP_SD_Print_Filename, filelist.filename(), VP_SD_FileName_LEN, true); + #endif + + // Setup Confirmation screen + file_to_print = touched_nr; + GotoScreen(MKSLCD_SCREEN_PRINT_CONFIRM); + } + + void DGUSScreenHandler::DGUSLCD_SD_StartPrint(DGUS_VP_Variable &var, void *val_ptr) { + if (!filelist.seek(file_to_print)) return; + ExtUI::printFile(filelist.shortFilename()); + GotoScreen(MKSLCD_SCREEN_PRINT); + z_offset_add = 0; + } + + void DGUSScreenHandler::DGUSLCD_SD_ResumePauseAbort(DGUS_VP_Variable &var, void *val_ptr) { + + if (!ExtUI::isPrintingFromMedia()) return; // avoid race condition when user stays in this menu and printer finishes. + switch (swap16(*(uint16_t*)val_ptr)) { + case 0: { // Resume + + auto cs = getCurrentScreen(); + if (runout_mks.runout_status != RUNOUT_WAITTING_STATUS && runout_mks.runout_status != UNRUNOUT_STATUS) { + if (cs == MKSLCD_SCREEN_PRINT || cs == MKSLCD_SCREEN_PAUSE) + GotoScreen(MKSLCD_SCREEN_PAUSE); + return; + } + else + runout_mks.runout_status = UNRUNOUT_STATUS; + + GotoScreen(MKSLCD_SCREEN_PRINT); + + if (ExtUI::isPrintingFromMediaPaused()) { + nozzle_park_mks.print_pause_start_flag = 0; + nozzle_park_mks.blstatus = true; + ExtUI::resumePrint(); + } + } break; + + case 1: // Pause + + GotoScreen(MKSLCD_SCREEN_PAUSE); + if (!ExtUI::isPrintingFromMediaPaused()) { + nozzle_park_mks.print_pause_start_flag = 1; + nozzle_park_mks.blstatus = true; + ExtUI::pausePrint(); + //ExtUI::mks_pausePrint(); + } + break; + case 2: // Abort + HandleUserConfirmationPopUp(VP_SD_AbortPrintConfirmed, nullptr, PSTR("Abort printing"), filelist.filename(), PSTR("?"), true, true, false, true); + break; + } + } + + void DGUSScreenHandler::DGUSLCD_SD_SendFilename(DGUS_VP_Variable& var) { + uint16_t target_line = (var.VP - VP_SD_FileName0) / VP_SD_FileName_LEN; + if (target_line > DGUS_SD_FILESPERSCREEN) return; + char tmpfilename[VP_SD_FileName_LEN + 1] = ""; + var.memadr = (void*)tmpfilename; + + uint16_t dir_icon_val = 25; + if (filelist.seek(top_file + target_line)) { + snprintf_P(tmpfilename, VP_SD_FileName_LEN, PSTR("%s%c"), filelist.filename(), filelist.isDir() ? '/' : 0); // snprintf_P(tmpfilename, VP_SD_FileName_LEN, PSTR("%s"), filelist.filename()); + dir_icon_val = filelist.isDir() ? 0 : 1; + } + DGUSLCD_SendStringToDisplay(var); + + dgusdisplay.WriteVariable(VP_File_Pictutr0 + target_line * 2, dir_icon_val); + } + + void DGUSScreenHandler::SDCardInserted() { + top_file = 0; + filelist.refresh(); + auto cs = getCurrentScreen(); + if (cs == DGUSLCD_SCREEN_MAIN || cs == DGUSLCD_SCREEN_STATUS) + GotoScreen(MKSLCD_SCREEN_CHOOSE_FILE); + } + + void DGUSScreenHandler::SDCardRemoved() { + if (current_screen == DGUSLCD_SCREEN_SDFILELIST + || (current_screen == DGUSLCD_SCREEN_CONFIRM && (ConfirmVP == VP_SD_AbortPrintConfirmed || ConfirmVP == VP_SD_FileSelectConfirm)) + || current_screen == DGUSLCD_SCREEN_SDPRINTMANIPULATION + ) filelist.refresh(); + } + + void DGUSScreenHandler::SDPrintingFinished() { + if (DGUSAutoTurnOff) { + while (queue.length) queue.advance(); + gcode.process_subcommands_now_P(PSTR("M81")); + } + GotoScreen(MKSLCD_SCREEN_PrintDone); + } + +#endif // SDSUPPORT + +void DGUSScreenHandler::ScreenChangeHook(DGUS_VP_Variable &var, void *val_ptr) { + uint8_t *tmp = (uint8_t*)val_ptr; + + // The keycode in target is coded as , so 0x0100A means + // from screen 1 (main) to 10 (temperature). DGUSLCD_SCREEN_POPUP is special, + // meaning "return to previous screen" + DGUSLCD_Screens target = (DGUSLCD_Screens)tmp[1]; + + DEBUG_ECHOLNPAIR("\n DEBUG target", target); + + // when the dgus had reboot, it will enter the DGUSLCD_SCREEN_MAIN page, + // so user can change any page to use this function, an it will check + // if robin nano is printing. when it is, dgus will enter the printing + // page to continue print; + // + //if (print_job_timer.isRunning() || print_job_timer.isPaused()) { + // if (target == MKSLCD_PAUSE_SETTING_MOVE || target == MKSLCD_PAUSE_SETTING_EX + // || target == MKSLCD_SCREEN_PRINT || target == MKSLCD_SCREEN_PAUSE + // ) { + // } + // else + // GotoScreen(MKSLCD_SCREEN_PRINT); + // return; + //} + + if (target == DGUSLCD_SCREEN_POPUP) { + SetupConfirmAction(ExtUI::setUserConfirmed); + + // Special handling for popup is to return to previous menu + if (current_screen == DGUSLCD_SCREEN_POPUP && confirm_action_cb) confirm_action_cb(); + PopToOldScreen(); + return; + } + + UpdateNewScreen(target); + + #ifdef DEBUG_DGUSLCD + if (!DGUSLCD_FindScreenVPMapList(target)) DEBUG_ECHOLNPAIR("WARNING: No screen Mapping found for ", target); + #endif +} + +void DGUSScreenHandler::ScreenBackChange(DGUS_VP_Variable &var, void *val_ptr) { + uint16_t target = swap16(*(uint16_t *)val_ptr); + DEBUG_ECHOLNPAIR(" back = 0x%x", target); + switch (target) { + } +} + +void DGUSScreenHandler::ZoffsetConfirm(DGUS_VP_Variable &var, void *val_ptr) { + settings.save(); + if (print_job_timer.isRunning()) + GotoScreen(MKSLCD_SCREEN_PRINT); + else if (print_job_timer.isPaused) + GotoScreen(MKSLCD_SCREEN_PAUSE); +} + +void DGUSScreenHandler::GetTurnOffCtrl(DGUS_VP_Variable &var, void *val_ptr) { + DEBUG_ECHOLNPGM("ctrl turn off\n"); + uint16_t value = swap16(*(uint16_t *)val_ptr); + switch (value) { + case 0 ... 1: DGUSAutoTurnOff = (bool)value; break; + default: break; + } +} + +void DGUSScreenHandler::GetMinExtrudeTemp(DGUS_VP_Variable &var, void *val_ptr) { + DEBUG_ECHOLNPGM("MinExtrudeTempChange DistanceChange"); + uint16_t value = swap16(*(uint16_t *)val_ptr); + thermalManager.extrude_min_temp = value; + min_ex_temp = value; + settings.save(); +} + +void DGUSScreenHandler::GetZoffsetDistance(DGUS_VP_Variable &var, void *val_ptr) { + DEBUG_ECHOLNPGM("Zoffset DistanceChange"); + uint16_t value = swap16(*(uint16_t *)val_ptr); + float val_distance = 0; + switch (value) { + case 0: val_distance = 0.01; break; + case 1: val_distance = 0.1; break; + case 2: val_distance = 0.5; break; + case 3: val_distance = 1; break; + default: val_distance = 0.01; break; + } + ZOffset_distance = val_distance; +} + +void DGUSScreenHandler::GetManualMovestep(DGUS_VP_Variable &var, void *val_ptr) { + DEBUG_ECHOLNPGM("\nMove DistanceChange"); + *(uint16_t *)var.memadr = swap16(*(uint16_t *)val_ptr); +} + +void DGUSScreenHandler::EEPROM_CTRL(DGUS_VP_Variable &var, void *val_ptr) { + uint16_t eep_flag = swap16(*(uint16_t *)val_ptr); + switch (eep_flag) { + case 0: + settings.save(); + settings.load(); // load eeprom data to check the data is right + GotoScreen(MKSLCD_SCREEN_EEP_Config); + break; + + case 1: + settings.reset(); + GotoScreen(MKSLCD_SCREEN_EEP_Config); + break; + + default: break; + } +} + +void DGUSScreenHandler::Z_offset_select(DGUS_VP_Variable &var, void *val_ptr) { + uint16_t z_value = swap16(*(uint16_t *)val_ptr); + switch (z_value) { + case 0: Z_distance = 0.01; break; + case 1: Z_distance = 0.1; break; + case 2: Z_distance = 0.5; break; + default: Z_distance = 1; break; + } +} + +void DGUSScreenHandler::GetOffsetValue(DGUS_VP_Variable &var, void *val_ptr) { + + #if ENABLED(HAS_BED_PROBE) + int32_t value = swap32(*(int32_t *)val_ptr); + float Offset = value / 100.0f; + DEBUG_ECHOLNPAIR_F("\nget int6 offset >> ", value, 6); + #endif + + switch (var.VP) { + case VP_OFFSET_X: TERN_(HAS_BED_PROBE, probe.offset.x = Offset); break; + case VP_OFFSET_Y: TERN_(HAS_BED_PROBE, probe.offset.y = Offset); break; + case VP_OFFSET_Z: TERN_(HAS_BED_PROBE, probe.offset.z = Offset); break; + default: break; + } + settings.save(); +} + +void DGUSScreenHandler::LanguageChange_MKS(DGUS_VP_Variable &var, void *val_ptr) { + uint16_t lag_flag = swap16(*(uint16_t *)val_ptr); + switch (lag_flag) { + case MKS_SimpleChinese: + DGUS_LanguageDisplay(MKS_SimpleChinese); + DGUSLanguageSwitch = MKS_SimpleChinese; + dgusdisplay.MKS_WriteVariable(VP_LANGUAGE_CHANGE1, MKS_Language_Choose); + dgusdisplay.MKS_WriteVariable(VP_LANGUAGE_CHANGE2, MKS_Language_NoChoose); + settings.save(); + break; + case MKS_English: + DGUS_LanguageDisplay(MKS_English); + DGUSLanguageSwitch = MKS_English; + dgusdisplay.MKS_WriteVariable(VP_LANGUAGE_CHANGE1, MKS_Language_NoChoose); + dgusdisplay.MKS_WriteVariable(VP_LANGUAGE_CHANGE2, MKS_Language_Choose); + settings.save(); + break; + default: break; + } +} + +#if ENABLED(MESH_BED_LEVELING) + uint8_t mesh_point_count = GRID_MAX_POINTS; +#endif + +void DGUSScreenHandler::Level_Ctrl_MKS(DGUS_VP_Variable &var, void *val_ptr) { + uint16_t lev_but = swap16(*(uint16_t *)val_ptr); + #if ENABLED(MESH_BED_LEVELING) + auto cs = getCurrentScreen(); + #endif + switch (lev_but) { + case 0: + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + + static uint8_t a_first_level = 1; + if (a_first_level == 1) { + a_first_level = 0; + queue.enqueue_now_P(G28_STR); + } + queue.enqueue_now_P(PSTR("G29")); + + #elif ENABLED(MESH_BED_LEVELING) + + mesh_point_count = GRID_MAX_POINTS; + + if (DGUSLanguageSwitch == MKS_English) { + const char level_buf_en[] = "Start Level"; + dgusdisplay.WriteVariable(VP_AutoLevel_1_Dis, level_buf_en, 32, true); + } + else if (DGUSLanguageSwitch == MKS_SimpleChinese) { + const uint16_t level_buf_ch[] = {0xAABF, 0xBCCA, 0xF7B5, 0xBDC6, 0x2000}; + dgusdisplay.WriteVariable(VP_AutoLevel_1_Dis, level_buf_ch, 32, true); + } + + cs = getCurrentScreen(); + if (cs != MKSLCD_AUTO_LEVEL) GotoScreen(MKSLCD_AUTO_LEVEL); + + #else + + GotoScreen(MKSLCD_SCREEN_LEVEL); + + #endif + break; + + case 1: + soft_endstop._enabled = true; + GotoScreen(MKSLCD_SCREEM_TOOL); + break; + + default: break; + } +} + +void DGUSScreenHandler::MeshLevelDistanceConfig(DGUS_VP_Variable &var, void *val_ptr) { + uint16_t mesh_dist = swap16(*(uint16_t *)val_ptr); + switch (mesh_dist) { + case 0: mesh_adj_distance = 0.01; break; + case 1: mesh_adj_distance = 0.1; break; + case 2: mesh_adj_distance = 1; break; + default: mesh_adj_distance = 0.1; break; + } +} + +void DGUSScreenHandler::MeshLevel(DGUS_VP_Variable &var, void *val_ptr) { + #if ENABLED(MESH_BED_LEVELING) + uint16_t mesh_value = swap16(*(uint16_t *)val_ptr); + // static uint8_t a_first_level = 1; + char cmd_buf[30]; + float offset = mesh_adj_distance; + int16_t integer, Deci, Deci2; + // float f3 = current_position.z; + // float f4 = current_position.z; + switch (mesh_value) { + case 0: + offset = mesh_adj_distance; + integer = offset; // get int + Deci = (offset * 100); + Deci = Deci % 100; + Deci2 = offset * 100; + Deci2 = Deci2 % 10; + soft_endstop._enabled = false; + queue.enqueue_now_P(PSTR("G91")); + snprintf_P(cmd_buf, 30, PSTR("G1 Z%d.%d%d"), integer, Deci, Deci2); + queue.enqueue_one_now(cmd_buf); + queue.enqueue_now_P(PSTR("G90")); + //soft_endstop._enabled = true; + break; + + case 1: + offset = mesh_adj_distance; + integer = offset; // get int + Deci = (offset * 100); + Deci = Deci % 100; + Deci2 = offset * 100; + Deci2 = Deci2 % 10; + soft_endstop._enabled = false; + queue.enqueue_now_P(PSTR("G91")); + snprintf_P(cmd_buf, 30, PSTR("G1 Z-%d.%d%d"), integer, Deci, Deci2); + queue.enqueue_one_now(cmd_buf); + queue.enqueue_now_P(PSTR("G90")); + break; + + case 2: + if (mesh_point_count == GRID_MAX_POINTS) { // 第1个点 + queue.enqueue_now_P(PSTR("G29S1")); + mesh_point_count--; + + if (DGUSLanguageSwitch == MKS_English) { + const char level_buf_en1[] = "Next Point"; + dgusdisplay.WriteVariable(VP_AutoLevel_1_Dis, level_buf_en1, 32, true); + } + else if (DGUSLanguageSwitch == MKS_SimpleChinese) { + const uint16_t level_buf_ch1[] = {0xC2CF, 0xBBD2, 0xE3B5, 0x2000}; + dgusdisplay.WriteVariable(VP_AutoLevel_1_Dis, level_buf_ch1, 32, true); + } + } + else if (mesh_point_count > 1) { // 倒数第二个点 + queue.enqueue_now_P(PSTR("G29S2")); + mesh_point_count--; + if (DGUSLanguageSwitch == MKS_English) { + const char level_buf_en2[] = "Next Point"; + dgusdisplay.WriteVariable(VP_AutoLevel_1_Dis, level_buf_en2, 32, true); + } + else if (DGUSLanguageSwitch == MKS_SimpleChinese) { + const uint16_t level_buf_ch2[] = {0xC2CF, 0xBBD2, 0xE3B5, 0x2000}; + dgusdisplay.WriteVariable(VP_AutoLevel_1_Dis, level_buf_ch2, 32, true); + } + } + else if (mesh_point_count == 1) { + queue.enqueue_now_P(PSTR("G29S2")); + mesh_point_count--; + if (DGUSLanguageSwitch == MKS_English) { + const char level_buf_en2[] = "Level Finsh"; + dgusdisplay.WriteVariable(VP_AutoLevel_1_Dis, level_buf_en2, 32, true); + } + else if (DGUSLanguageSwitch == MKS_SimpleChinese) { + const uint16_t level_buf_ch2[] = {0xF7B5, 0xBDC6, 0xEACD, 0xC9B3, 0x2000}; + dgusdisplay.WriteVariable(VP_AutoLevel_1_Dis, level_buf_ch2, 32, true); + } + settings.save(); + } + else if (mesh_point_count == 0) { + + mesh_point_count = GRID_MAX_POINTS; + soft_endstop._enabled = true; + settings.save(); + GotoScreen(MKSLCD_SCREEM_TOOL); + } + break; + + default: + break; + } + #endif // MESH_BED_LEVELING +} + +void DGUSScreenHandler::LCD_BLK_Adjust(DGUS_VP_Variable &var, void *val_ptr) { + + uint16_t lcd_value = swap16(*(uint16_t *)val_ptr); + + if(lcd_value > 100) lcd_value = 100; + else if(lcd_value < 10) lcd_value = 10; + + lcd_default_light = lcd_value; + + const uint16_t lcd_data[2] = {lcd_default_light, lcd_default_light}; + dgusdisplay.WriteVariable(0x0082, &lcd_data, 5, true); +} + +void DGUSScreenHandler::ManualAssistLeveling(DGUS_VP_Variable &var, void *val_ptr) { + int16_t point_value = swap16(*(uint16_t *)val_ptr); + + int16_t level_x_pos, level_y_pos; + char buf_level[32] = {0}; + unsigned int level_speed = 1500; + static bool first_level_flag = false; + + if (!first_level_flag) + queue.enqueue_now_P(G28_STR); + + switch (point_value) { + case 0x0001: + if (first_level_flag) + queue.enqueue_now_P(G28_STR); + queue.enqueue_now_P(PSTR("G1 Z10")); + //level_x_pos = X_MIN_POS + 20; + //level_y_pos = Y_MIN_POS + 20; + level_x_pos = X_MIN_POS + abs(level_1_x_point); + level_y_pos = Y_MIN_POS + abs(level_1_y_point); + + memset(buf_level, 0, sizeof(buf_level)); + sprintf_P(buf_level, "G0 X%d Y%d F%d", level_x_pos, level_y_pos, level_speed); + queue.enqueue_one_now(buf_level); + queue.enqueue_now_P(PSTR("G28 Z")); + break; + case 0x0002: + queue.enqueue_now_P(PSTR("G1 Z10")); + + //level_x_pos = X_MAX_POS - 20; + //level_y_pos = Y_MIN_POS + 20; + + level_x_pos = X_MAX_POS - abs(level_2_x_point); + level_y_pos = Y_MIN_POS + abs(level_2_y_point); + + sprintf_P(buf_level, "G0 X%d Y%d F%d", level_x_pos, level_y_pos, level_speed); + queue.enqueue_one_now(buf_level); + //queue.enqueue_now_P(PSTR("G28Z")); + queue.enqueue_now_P(PSTR("G1 Z-10")); + break; + case 0x0003: + queue.enqueue_now_P(PSTR("G1 Z10")); + + //level_x_pos = X_MAX_POS - 20; + //level_y_pos = Y_MAX_POS - 20; + + level_x_pos = X_MAX_POS - abs(level_3_x_point); + level_y_pos = Y_MAX_POS - abs(level_3_y_point); + + sprintf_P(buf_level, "G0 X%d Y%d F%d", level_x_pos, level_y_pos, level_speed); + queue.enqueue_one_now(buf_level); + //sprintf_P(buf_level, PSTR("G28 Z")); + queue.enqueue_now_P(PSTR("G1 Z-10")); + break; + case 0x0004: + queue.enqueue_now_P(PSTR("G1 Z10")); + + //level_x_pos = X_MIN_POS + 20; + //level_y_pos = Y_MAX_POS - 20; + level_x_pos = X_MIN_POS + abs(level_4_x_point); + level_y_pos = Y_MAX_POS - abs(level_4_y_point); + + sprintf_P(buf_level, "G0 X%d Y%d F%d", level_x_pos, level_y_pos, level_speed); + queue.enqueue_one_now(buf_level); + //sprintf_P(buf_level, PSTR("G28 Z")); + queue.enqueue_now_P(PSTR("G1 Z-10")); + break; + case 0x0005: + queue.enqueue_now_P(PSTR("G1 Z10")); + //level_x_pos = (uint16_t)(X_MAX_POS / 2); + //level_y_pos = (uint16_t)(Y_MAX_POS / 2); + level_x_pos = abs(level_5_x_point); + level_y_pos = abs(level_5_y_point); + + sprintf_P(buf_level, "G0 X%d Y%d F%d", level_x_pos, level_y_pos, level_speed); + queue.enqueue_one_now(buf_level); + queue.enqueue_now_P(PSTR("G1 Z-10")); + break; + } + + // Only once + first_level_flag = true; +} + +#define mks_min(a, b) ((a) < (b)) ? (a) : (b) +#define mks_max(a, b) ((a) > (b)) ? (a) : (b) +void DGUSScreenHandler::TMC_ChangeConfig(DGUS_VP_Variable &var, void *val_ptr) { + #if EITHER(HAS_TRINAMIC_CONFIG, HAS_STEALTHCHOP) + uint16_t tmc_value = swap16(*(uint16_t*)val_ptr); + #endif + + switch (var.VP) { + case VP_TMC_X_STEP: + #if USE_SENSORLESS + #if AXIS_HAS_STEALTHCHOP(X) + stepperX.homing_threshold(mks_min(tmc_value, 255)); + settings.save(); + //tmc_x_step = stepperX.homing_threshold(); + #endif + #endif + break; + case VP_TMC_Y_STEP: + #if USE_SENSORLESS + #if AXIS_HAS_STEALTHCHOP(Y) + stepperY.homing_threshold(mks_min(tmc_value, 255)); + settings.save(); + //tmc_y_step = stepperY.homing_threshold(); + #endif + #endif + break; + case VP_TMC_Z_STEP: + #if USE_SENSORLESS + #if AXIS_HAS_STEALTHCHOP(Z) + stepperZ.homing_threshold(mks_min(tmc_value, 255)); + settings.save(); + //tmc_z_step = stepperZ.homing_threshold(); + #endif + #endif + break; + case VP_TMC_X_Current: + #if AXIS_IS_TMC(X) + stepperX.rms_current(tmc_value); + settings.save(); + #endif + break; + case VP_TMC_X1_Current: + #if AXIS_IS_TMC(X2) + stepperX2.rms_current(tmc_value); + settings.save(); + #endif + break; + case VP_TMC_Y_Current: + #if AXIS_IS_TMC(Y) + stepperY.rms_current(tmc_value); + settings.save(); + #endif + break; + case VP_TMC_Y1_Current: + #if AXIS_IS_TMC(X2) + stepperY2.rms_current(tmc_value); + settings.save(); + #endif + break; + case VP_TMC_Z_Current: + #if AXIS_IS_TMC(Z) + stepperZ.rms_current(tmc_value); + settings.save(); + #endif + break; + case VP_TMC_Z1_Current: + #if AXIS_IS_TMC(Z2) + stepperZ2.rms_current(tmc_value); + settings.save(); + #endif + break; + case VP_TMC_E0_Current: + #if AXIS_IS_TMC(E0) + stepperE0.rms_current(tmc_value); + settings.save(); + #endif + break; + case VP_TMC_E1_Current: + #if AXIS_IS_TMC(E1) + stepperE1.rms_current(tmc_value); + settings.save(); + #endif + break; + + default: + break; + } + #if USE_SENSORLESS + #if AXIS_HAS_STEALTHCHOP(X) + tmc_x_step = stepperX.homing_threshold(); + #endif + #if AXIS_HAS_STEALTHCHOP(Y) + tmc_y_step = stepperY.homing_threshold(); + #endif + #if AXIS_HAS_STEALTHCHOP(Z) + tmc_z_step = stepperZ.homing_threshold(); + #endif + #endif +} + +void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { + DEBUG_ECHOLNPGM("HandleManualMove"); + + int16_t movevalue = swap16(*(uint16_t*)val_ptr); + + // Choose Move distance + if (distanceMove == 0x01) distanceMove = 10; + else if (distanceMove == 0x02) distanceMove = 100; + else if (distanceMove == 0x03) distanceMove = 1000; + + DEBUG_ECHOLNPAIR("QUEUE LEN:", queue.length); + + if (!print_job_timer.isPaused() && queue.length >= BUFSIZE) + return; + + char axiscode; + unsigned int speed = 1500; // FIXME: get default feedrate for manual moves, dont hardcode. + + switch (var.VP) { // switch X Y Z or Home + default: return; + case VP_MOVE_X: + DEBUG_ECHOLNPGM("X Move"); + axiscode = 'X'; + if (!ExtUI::canMove(ExtUI::axis_t::X)) goto cannotmove; + break; + + case VP_MOVE_Y: + DEBUG_ECHOLNPGM("Y Move"); + axiscode = 'Y'; + if (!ExtUI::canMove(ExtUI::axis_t::Y)) goto cannotmove; + break; + + case VP_MOVE_Z: + DEBUG_ECHOLNPGM("Z Move"); + axiscode = 'Z'; + speed = 300; // default to 5mm/s + if (!ExtUI::canMove(ExtUI::axis_t::Z)) goto cannotmove; + break; + + case VP_MOTOR_LOCK_UNLOK: + DEBUG_ECHOLNPGM("Motor Unlock"); + movevalue = 5; + axiscode = '\0'; + // return ; + break; + + case VP_HOME_ALL: // only used for homing + DEBUG_ECHOLNPGM("Home all"); + axiscode = '\0'; + movevalue = 0; // ignore value sent from display, this VP is _ONLY_ for homing. + //return; + break; + + case VP_X_HOME: + DEBUG_ECHOLNPGM("X Home"); + axiscode = 'X'; + movevalue = 0; + break; + + case VP_Y_HOME: + DEBUG_ECHOLNPGM("Y Home"); + axiscode = 'Y'; + movevalue = 0; + break; + + case VP_Z_HOME: + DEBUG_ECHOLNPGM("Z Home"); + axiscode = 'Z'; + movevalue = 0; + break; + } + + DEBUG_ECHOPAIR("movevalue = ", movevalue); + if (movevalue != 0 && movevalue != 5) { // get move distance + switch (movevalue) { + case 0x0001: movevalue = distanceMove; break; + case 0x0002: movevalue = -distanceMove; break; + default: movevalue = 0; break; + } + } + + if (!movevalue) { + // homing + DEBUG_ECHOPAIR(" homing ", axiscode); + // char buf[6] = "G28 X"; + // buf[4] = axiscode; + + char buf[6]; + sprintf(buf,"G28 %c",axiscode); + //DEBUG_ECHOPAIR(" ", buf); + queue.enqueue_one_now(buf); + //DEBUG_ECHOLNPGM(" ✓"); + ForceCompleteUpdate(); + return; + } + else if (movevalue == 5) { + DEBUG_ECHOPAIR("send M84"); + char buf[6]; + snprintf_P(buf,6,PSTR("M84 %c"),axiscode); + queue.enqueue_one_now(buf); + ForceCompleteUpdate(); + return; + } + else { + // movement + DEBUG_ECHOPAIR(" move ", axiscode); + bool old_relative_mode = relative_mode; + + if (!relative_mode) { + //DEBUG_ECHOPGM(" G91"); + queue.enqueue_now_P(PSTR("G91")); + //DEBUG_ECHOPGM(" ✓ "); + } + char buf[32]; // G1 X9999.99 F12345 + // unsigned int backup_speed = MMS_TO_MMM(feedrate_mm_s); + char sign[] = "\0"; + int16_t value = movevalue / 100; + if (movevalue < 0) { value = -value; sign[0] = '-'; } + int16_t fraction = ABS(movevalue) % 100; + snprintf_P(buf, 32, PSTR("G0 %c%s%d.%02d F%d"), axiscode, sign, value, fraction, speed); + queue.enqueue_one_now(buf); + + //if (backup_speed != speed) { + // snprintf_P(buf, 32, PSTR("G0 F%d"), backup_speed); + // queue.enqueue_one_now(buf); + // //DEBUG_ECHOPAIR(" ", buf); + //} + + //while (!enqueue_and_echo_command(buf)) idle(); + //DEBUG_ECHOLNPGM(" ✓ "); + if (!old_relative_mode) { + //DEBUG_ECHOPGM("G90"); + //queue.enqueue_now_P(PSTR("G90")); + queue.enqueue_now_P(PSTR("G90")); + //DEBUG_ECHOPGM(" ✓ "); + } + } + + ForceCompleteUpdate(); + DEBUG_ECHOLNPGM("manmv done."); + return; + + cannotmove: + DEBUG_ECHOLNPAIR(" cannot move ", axiscode); + return; +} + +void DGUSScreenHandler::GetParkPos_MKS(DGUS_VP_Variable &var, void *val_ptr) { + int16_t value_pos = swap16(*(int16_t*)val_ptr); + + switch (var.VP) { + case VP_X_PARK_POS: x_park_pos = value_pos; break; + case VP_Y_PARK_POS: y_park_pos = value_pos; break; + case VP_Z_PARK_POS: z_park_pos = value_pos; break; + default: break; + } + skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel + return; +} + +void DGUSScreenHandler::HandleChangeLevelPoint_MKS(DGUS_VP_Variable &var, void *val_ptr) { + DEBUG_ECHOLNPGM("HandleStepPerMMChanged"); + + int16_t value_raw = swap16(*(int16_t*)val_ptr); + + DEBUG_ECHOLNPAIR_F("value:", value_raw); + + *(int16_t*)var.memadr = value_raw; + + settings.save(); + skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel + return; +} + +void DGUSScreenHandler::HandleStepPerMMChanged_MKS(DGUS_VP_Variable &var, void *val_ptr) { + DEBUG_ECHOLNPGM("HandleStepPerMMChanged"); + + uint16_t value_raw = swap16(*(uint16_t*)val_ptr); + + DEBUG_ECHOLNPAIR("value_raw:", value_raw); + float value = (float)value_raw; + ExtUI::axis_t axis; + switch (var.VP) { + case VP_X_STEP_PER_MM: axis = ExtUI::axis_t::X; break; + case VP_Y_STEP_PER_MM: axis = ExtUI::axis_t::Y; break; + case VP_Z_STEP_PER_MM: axis = ExtUI::axis_t::Z; break; + default: return; + } + DEBUG_ECHOLNPAIR_F("value:", value); + ExtUI::setAxisSteps_per_mm(value, axis); + DEBUG_ECHOLNPAIR_F("value_set:", ExtUI::getAxisSteps_per_mm(axis)); + settings.save(); + skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel + return; +} + +void DGUSScreenHandler::HandleStepPerMMExtruderChanged_MKS(DGUS_VP_Variable &var, void *val_ptr) { + DEBUG_ECHOLNPGM("HandleStepPerMMExtruderChanged"); + + uint16_t value_raw = swap16(*(uint16_t*)val_ptr); + DEBUG_ECHOLNPAIR("value_raw:", value_raw); + float value = (float)value_raw; + ExtUI::extruder_t extruder; + switch (var.VP) { + default: return; + #if HOTENDS >= 1 + case VP_E0_STEP_PER_MM: extruder = ExtUI::extruder_t::E0; break; + #endif + #if HOTENDS >= 2 + #endif + case VP_E1_STEP_PER_MM: extruder = ExtUI::extruder_t::E1; break; + } + DEBUG_ECHOLNPAIR_F("value:", value); + ExtUI::setAxisSteps_per_mm(value, extruder); + DEBUG_ECHOLNPAIR_F("value_set:", ExtUI::getAxisSteps_per_mm(extruder)); + settings.save(); + skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel + return; +} + +void DGUSScreenHandler::HandleMaxSpeedChange_MKS(DGUS_VP_Variable &var, void *val_ptr) { + DEBUG_ECHOLNPGM("HandleMaxSpeedChange_MKS"); + + uint16_t value_raw = swap16(*(uint16_t*)val_ptr); + DEBUG_ECHOLNPAIR("value_raw:", value_raw); + float value = (float)value_raw; + ExtUI::axis_t axis; + switch (var.VP) { + case VP_X_MAX_SPEED: axis = ExtUI::axis_t::X; break; + case VP_Y_MAX_SPEED: axis = ExtUI::axis_t::Y; break; + case VP_Z_MAX_SPEED: axis = ExtUI::axis_t::Z; break; + default: return; + } + DEBUG_ECHOLNPAIR_F("value:", value); + // ExtUI::setAxisSteps_per_mm(value,extruder); + ExtUI::setAxisMaxFeedrate_mm_s(value, axis); + DEBUG_ECHOLNPAIR_F("value_set:", ExtUI::getAxisMaxFeedrate_mm_s(axis)); + settings.save(); + skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel + return; +} + +void DGUSScreenHandler::HandleExtruderMaxSpeedChange_MKS(DGUS_VP_Variable &var, void *val_ptr) { + DEBUG_ECHOLNPGM("HandleMaxSpeedChange_MKS"); + + uint16_t value_raw = swap16(*(uint16_t*)val_ptr); + DEBUG_ECHOLNPAIR("value_raw:", value_raw); + float value = (float)value_raw; + ExtUI::extruder_t extruder; + switch (var.VP) { + default: return; + #if HOTENDS >= 1 + case VP_E0_MAX_SPEED: extruder = ExtUI::extruder_t::E0; break; + #endif + #if HOTENDS >= 2 + #endif + case VP_E1_MAX_SPEED: extruder = ExtUI::extruder_t::E1; break; + } + DEBUG_ECHOLNPAIR_F("value:", value); + // ExtUI::setAxisSteps_per_mm(value,extruder); + ExtUI::setAxisMaxFeedrate_mm_s(value, extruder); + DEBUG_ECHOLNPAIR_F("value_set:", ExtUI::getAxisMaxFeedrate_mm_s(extruder)); + settings.save(); + skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel + return; +} + +void DGUSScreenHandler::HandleMaxAccChange_MKS(DGUS_VP_Variable &var, void *val_ptr) { + DEBUG_ECHOLNPGM("HandleMaxSpeedChange_MKS"); + + uint16_t value_raw = swap16(*(uint16_t*)val_ptr); + DEBUG_ECHOLNPAIR("value_raw:", value_raw); + float value = (float)value_raw; + ExtUI::axis_t axis; + switch (var.VP) { + case VP_X_ACC_MAX_SPEED: axis = ExtUI::axis_t::X; break; + case VP_Y_ACC_MAX_SPEED: axis = ExtUI::axis_t::Y; break; + case VP_Z_ACC_MAX_SPEED: axis = ExtUI::axis_t::Z; break; + default: return; + } + DEBUG_ECHOLNPAIR_F("value:", value); + ExtUI::setAxisMaxAcceleration_mm_s2(value, axis); + DEBUG_ECHOLNPAIR_F("value_set:", ExtUI::getAxisMaxAcceleration_mm_s2(axis)); + settings.save(); + skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel + return; +} + +void DGUSScreenHandler::HandleExtruderAccChange_MKS(DGUS_VP_Variable &var, void *val_ptr) { + DEBUG_ECHOLNPGM("HandleMaxSpeedChange_MKS"); + + uint16_t value_raw = swap16(*(uint16_t*)val_ptr); + DEBUG_ECHOLNPAIR("value_raw:", value_raw); + float value = (float)value_raw; + ExtUI::extruder_t extruder; + switch (var.VP) { + default: return; + #if HOTENDS >= 1 + case VP_E0_ACC_MAX_SPEED: extruder = ExtUI::extruder_t::E0; settings.load(); break; + #endif + #if HOTENDS >= 2 + #endif + case VP_E1_ACC_MAX_SPEED: extruder = ExtUI::extruder_t::E1; settings.load(); break; + } + DEBUG_ECHOLNPAIR_F("value:", value); + // ExtUI::setAxisSteps_per_mm(value,extruder); + ExtUI::setAxisMaxAcceleration_mm_s2(value, extruder); + DEBUG_ECHOLNPAIR_F("value_set:", ExtUI::getAxisMaxAcceleration_mm_s2(extruder)); + settings.save(); + skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel + return; +} + +void DGUSScreenHandler::HandleTravelAccChange_MKS(DGUS_VP_Variable &var, void *val_ptr) { + uint16_t value_travel = swap16(*(uint16_t*)val_ptr); + float value = (float)value_travel; + planner.settings.travel_acceleration = value; + skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel + return; +} + +void DGUSScreenHandler::HandleFeedRateMinChange_MKS(DGUS_VP_Variable &var, void *val_ptr) { + uint16_t value_t = swap16(*(uint16_t*)val_ptr); + float value = (float)value_t; + planner.settings.min_feedrate_mm_s = value; + skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel + return; +} + +void DGUSScreenHandler::HandleMin_T_F_MKS(DGUS_VP_Variable &var, void *val_ptr) { + uint16_t value_t_f = swap16(*(uint16_t*)val_ptr); + float value = (float)value_t_f; + planner.settings.min_travel_feedrate_mm_s = value; + skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel + return; +} + +void DGUSScreenHandler::HandleAccChange_MKS(DGUS_VP_Variable &var, void *val_ptr) { + uint16_t value_acc = swap16(*(uint16_t*)val_ptr); + float value = (float)value_acc; + planner.settings.acceleration = value; + skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel + return; +} + +void DGUSScreenHandler::HandleGetExMinTemp_MKS(DGUS_VP_Variable &var, void *val_ptr) { + uint16_t value_ex_min_temp = swap16(*(uint16_t*)val_ptr); + thermalManager.extrude_min_temp = value_ex_min_temp; + skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel +} + +#if HAS_PID_HEATING + void DGUSScreenHandler::HandleTemperaturePIDChanged(DGUS_VP_Variable &var, void *val_ptr) { + uint16_t rawvalue = swap16(*(uint16_t*)val_ptr); + DEBUG_ECHOLNPAIR("V1:", rawvalue); + float value = (float)rawvalue / 10; + DEBUG_ECHOLNPAIR("V2:", value); + float newvalue = 0; + + switch (var.VP) { + default: return; + #if HOTENDS >= 1 + case VP_E0_PID_P: newvalue = value; break; + case VP_E0_PID_I: newvalue = scalePID_i(value); break; + case VP_E0_PID_D: newvalue = scalePID_d(value); break; + #endif + #if HOTENDS >= 2 + case VP_E1_PID_P: newvalue = value; break; + case VP_E1_PID_I: newvalue = scalePID_i(value); break; + case VP_E1_PID_D: newvalue = scalePID_d(value); break; + #endif + #if HAS_HEATED_BED + case VP_BED_PID_P: newvalue = value; break; + case VP_BED_PID_I: newvalue = scalePID_i(value); break; + case VP_BED_PID_D: newvalue = scalePID_d(value); break; + #endif + } + + DEBUG_ECHOLNPAIR_F("V3:", newvalue); + *(float *)var.memadr = newvalue; + + settings.save(); + skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel + } +#endif // HAS_PID_HEATING + +#if ENABLED(BABYSTEPPING) + void DGUSScreenHandler::HandleLiveAdjustZ(DGUS_VP_Variable &var, void *val_ptr) { + DEBUG_ECHOLNPGM("HandleLiveAdjustZ"); + char babystep_buf[30]; + float step = ZOffset_distance; + + uint16_t flag = swap16(*(uint16_t*)val_ptr); + switch (flag) { + case 0: + if (step == 0.01) + queue.inject_P(PSTR("M290 Z-0.01")); + else if (step == 0.1) + queue.inject_P(PSTR("M290 Z-0.1")); + else if (step == 0.5) + queue.inject_P(PSTR("M290 Z-0.5")); + else if (step == 1) + queue.inject_P(PSTR("M290 Z-1")); + else + queue.inject_P(PSTR("M290 Z-0.01")); + + z_offset_add = z_offset_add - ZOffset_distance; + break; + + case 1: + if (step == 0.01) + queue.inject_P(PSTR("M290 Z0.01")); + else if (step == 0.1) + queue.inject_P(PSTR("M290 Z0.1")); + else if (step == 0.5) + queue.inject_P(PSTR("M290 Z0.5")); + else if (step == 1) + queue.inject_P(PSTR("M290 Z1")); + else + queue.inject_P(PSTR("M290 Z-0.01")); + + z_offset_add = z_offset_add + ZOffset_distance; + break; + + default: + break; + } + ForceCompleteUpdate(); + } +#endif // BABYSTEPPING + +void DGUSScreenHandler::GetManualFilament(DGUS_VP_Variable &var, void *val_ptr) { + DEBUG_ECHOLNPGM("HandleGetFilament"); + + uint16_t value_len = swap16(*(uint16_t*)val_ptr); + + float value = (float)value_len; + + DEBUG_ECHOLNPAIR_F("Get Filament len value:", value); + distanceFilament = value; + + skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel + return; +} + +void DGUSScreenHandler::GetManualFilamentSpeed(DGUS_VP_Variable &var, void *val_ptr) { + DEBUG_ECHOLNPGM("HandleGetFilamentSpeed"); + + uint16_t value_len = swap16(*(uint16_t*)val_ptr); + + DEBUG_ECHOLNPAIR_F("FilamentSpeed value:", value_len); + + FilamentSpeed = value_len; + + skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel + return; +} + +void DGUSScreenHandler::MKS_FilamentLoad(DGUS_VP_Variable &var, void *val_ptr) { + DEBUG_ECHOLNPGM("Load Filament"); + char buf[40]; + + uint16_t val_t = swap16(*(uint16_t*)val_ptr); + + switch (val_t) { + case 0: + #if HOTENDS >= 1 + if (thermalManager.temp_hotend[0].celsius < thermalManager.extrude_min_temp) { + if (thermalManager.temp_hotend[0].target < thermalManager.extrude_min_temp) + thermalManager.setTargetHotend(thermalManager.extrude_min_temp, 0); + sendinfoscreen(PSTR("NOTICE"), nullptr, PSTR("Please wait."), PSTR("Nozzle heating!"), true, true, true, true); + SetupConfirmAction(nullptr); + GotoScreen(DGUSLCD_SCREEN_POPUP); + } + else { + queue.enqueue_now_P(PSTR("T0")); + queue.enqueue_now_P(PSTR("G91")); + snprintf_P(buf,40,PSTR("G1 E%d F%d"),(int)distanceFilament,FilamentSpeed * 60); + queue.enqueue_one_now(buf); + queue.enqueue_now_P(PSTR("G90")); + } + #endif + break; + + case 1: + #if HOTENDS >= 2 + if (thermalManager.temp_hotend[1].celsius < thermalManager.extrude_min_temp) { + if (thermalManager.temp_hotend[1].target < thermalManager.extrude_min_temp) + thermalManager.setTargetHotend(thermalManager.extrude_min_temp, 1); + sendinfoscreen(PSTR("NOTICE"), nullptr, PSTR("Please wait."), PSTR("Nozzle heating!"), true, true, true, true); + SetupConfirmAction(nullptr); + GotoScreen(DGUSLCD_SCREEN_POPUP); + } + else { + queue.enqueue_now_P(PSTR("T1")); + queue.enqueue_now_P(PSTR("G91")); + snprintf_P(buf,40,PSTR("G1 E%d F%d"),(int)distanceFilament,FilamentSpeed * 60); + queue.enqueue_one_now(buf); + queue.enqueue_now_P(PSTR("G90")); + } + #endif + #if ENABLED(SINGLENOZZLE) + if (thermalManager.temp_hotend[0].celsius < thermalManager.extrude_min_temp) { + if (thermalManager.temp_hotend[0].target < thermalManager.extrude_min_temp) + thermalManager.setTargetHotend(thermalManager.extrude_min_temp, 0); + sendinfoscreen(PSTR("NOTICE"), nullptr, PSTR("Please wait."), PSTR("Nozzle heating!"), true, true, true, true); + SetupConfirmAction(nullptr); + GotoScreen(DGUSLCD_SCREEN_POPUP); + } + else { + queue.enqueue_now_P(PSTR("T1")); + queue.enqueue_now_P(PSTR("G91")); + snprintf_P(buf,40,PSTR("G1 E%d F%d"),(int)distanceFilament,FilamentSpeed * 60); + queue.enqueue_one_now(buf); + queue.enqueue_now_P(PSTR("G90")); + } + #endif + break; + + default: + break; + } +} + +void DGUSScreenHandler::MKS_FilamentUnLoad(DGUS_VP_Variable &var, void *val_ptr) { + DEBUG_ECHOLNPGM("UnLoad Filament"); + char buf[40]; + uint16_t val_t = swap16(*(uint16_t*)val_ptr); + switch (val_t) { + case 0: + #if HOTENDS >= 1 + if (thermalManager.temp_hotend[0].celsius < thermalManager.extrude_min_temp) { + if (thermalManager.temp_hotend[0].target < thermalManager.extrude_min_temp) + thermalManager.setTargetHotend(thermalManager.extrude_min_temp, 0); + sendinfoscreen(PSTR("NOTICE"), nullptr, PSTR("Please wait."), PSTR("Nozzle heating!"), true, true, true, true); + SetupConfirmAction(nullptr); + GotoScreen(DGUSLCD_SCREEN_POPUP); + } + else { + queue.enqueue_now_P(PSTR("T0")); + queue.enqueue_now_P(PSTR("G91")); + snprintf_P(buf,40,PSTR("G1 E-%d F%d"),(int)distanceFilament,FilamentSpeed * 60); + queue.enqueue_one_now(buf); + queue.enqueue_now_P(PSTR("G90")); + } + #endif + break; + case 1: + #if HOTENDS >= 2 + if (thermalManager.temp_hotend[1].celsius < thermalManager.extrude_min_temp) { + if (thermalManager.temp_hotend[1].target < thermalManager.extrude_min_temp) + thermalManager.setTargetHotend(thermalManager.extrude_min_temp, 1); + sendinfoscreen(PSTR("NOTICE"), nullptr, PSTR("Please wait."), PSTR("Nozzle heating!"), true, true, true, true); + SetupConfirmAction(nullptr); + GotoScreen(DGUSLCD_SCREEN_POPUP); + } + else { + queue.enqueue_now_P(PSTR("T1")); + queue.enqueue_now_P(PSTR("G91")); + snprintf_P(buf,40,PSTR("G1 E-%d F%d"),(int)distanceFilament,FilamentSpeed * 60); + queue.enqueue_one_now(buf); + queue.enqueue_now_P(PSTR("G90")); + } + #endif + + #if ENABLED(SINGLENOZZLE) + if (thermalManager.temp_hotend[0].celsius < thermalManager.extrude_min_temp) { + if (thermalManager.temp_hotend[0].target < thermalManager.extrude_min_temp) + thermalManager.setTargetHotend(thermalManager.extrude_min_temp, 0); + sendinfoscreen(PSTR("NOTICE"), nullptr, PSTR("Please wait."), PSTR("Nozzle heating!"), true, true, true, true); + SetupConfirmAction(nullptr); + GotoScreen(DGUSLCD_SCREEN_POPUP); + } + else { + queue.enqueue_now_P(PSTR("T1")); + queue.enqueue_now_P(PSTR("G91")); + snprintf_P(buf,40,PSTR("G1 E-%d F%d"),(int)distanceFilament,FilamentSpeed * 60); + queue.enqueue_one_now(buf); + queue.enqueue_now_P(PSTR("G90")); + } + #endif + break; + } +} + +#if ENABLED(DGUS_FILAMENT_LOADUNLOAD) + + void DGUSScreenHandler::HandleFilamentOption(DGUS_VP_Variable &var, void *val_ptr) { + DEBUG_ECHOLNPGM("HandleFilamentOption"); + + uint8_t e_temp = 0; + filament_data.heated = false; + uint16_t preheat_option = swap16(*(uint16_t*)val_ptr); + if (preheat_option <= 8) { // Load filament type + filament_data.action = 1; + } + else if (preheat_option >= 10) { // Unload filament type + preheat_option -= 10; + filament_data.action = 2; + filament_data.purge_length = DGUS_FILAMENT_PURGE_LENGTH; + } + else { // Cancel filament operation + filament_data.action = 0; + } + + switch (preheat_option) { + case 0: // Load PLA + #ifdef PREHEAT_1_TEMP_HOTEND + e_temp = PREHEAT_1_TEMP_HOTEND; + #endif + break; + case 1: // Load ABS + TERN_(PREHEAT_2_TEMP_HOTEND, e_temp = PREHEAT_2_TEMP_HOTEND); + break; + case 2: // Load PET + #ifdef PREHEAT_3_TEMP_HOTEND + e_temp = PREHEAT_3_TEMP_HOTEND; + #endif + break; + case 3: // Load FLEX + #ifdef PREHEAT_4_TEMP_HOTEND + e_temp = PREHEAT_4_TEMP_HOTEND; + #endif + break; + case 9: // Cool down + default: + e_temp = 0; + break; + } + + if (filament_data.action == 0) { // Go back to utility screen + #if HOTENDS >= 1 + thermalManager.setTargetHotend(e_temp, ExtUI::extruder_t::E0); + #endif + #if HOTENDS >= 2 + thermalManager.setTargetHotend(e_temp, ExtUI::extruder_t::E1); + #endif + GotoScreen(DGUSLCD_SCREEN_UTILITY); + } + else { // Go to the preheat screen to show the heating progress + switch (var.VP) { + default: return; + #if HOTENDS >= 1 + case VP_E0_FILAMENT_LOAD_UNLOAD: + filament_data.extruder = ExtUI::extruder_t::E0; + thermalManager.setTargetHotend(e_temp, filament_data.extruder); + break; + #endif + #if HOTENDS >= 2 + case VP_E1_FILAMENT_LOAD_UNLOAD: + filament_data.extruder = ExtUI::extruder_t::E1; + thermalManager.setTargetHotend(e_temp, filament_data.extruder); + break; + #endif + } + } + } + + void DGUSScreenHandler::HandleFilamentLoadUnload(DGUS_VP_Variable &var) { + DEBUG_ECHOLNPGM("HandleFilamentLoadUnload"); + if (filament_data.action <= 0) return; + + // If we close to the target temperature, we can start load or unload the filament + if (thermalManager.hotEnoughToExtrude(filament_data.extruder) && \ + thermalManager.targetHotEnoughToExtrude(filament_data.extruder)) { + float movevalue = DGUS_FILAMENT_LOAD_LENGTH_PER_TIME; + + if (filament_data.action == 1) { // load filament + if (!filament_data.heated) { + filament_data.heated = true; + } + movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder) + movevalue; + } + else { // unload filament + if (!filament_data.heated) { + GotoScreen(DGUSLCD_SCREEN_FILAMENT_UNLOADING); + filament_data.heated = true; + } + // Before unloading extrude to prevent jamming + if (filament_data.purge_length >= 0) { + movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder) + movevalue; + filament_data.purge_length -= movevalue; + } + else { + movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder) - movevalue; + } + } + ExtUI::setAxisPosition_mm(movevalue, filament_data.extruder); + } + } +#endif // DGUS_FILAMENT_LOADUNLOAD + +bool DGUSScreenHandler::loop() { + dgusdisplay.loop(); + + const millis_t ms = millis(); + static millis_t next_event_ms = 0; + + static uint8_t language_times = 2; + + if (!IsScreenComplete() || ELAPSED(ms, next_event_ms)) { + next_event_ms = ms + DGUS_UPDATE_INTERVAL_MS; + UpdateScreenVPData(); + } + + if (language_times != 0) { + LanguagePInit(); + DGUS_LanguageDisplay(DGUSLanguageSwitch); + language_times--; + } + + #if ENABLED(SHOW_BOOTSCREEN) + static bool booted = false; + if (!booted && ELAPSED(ms, TERN(USE_MKS_GREEN_UI, 1000, BOOTSCREEN_TIMEOUT))) { + booted = true; + #if ANY_AXIS_HAS(STEALTHCHOP) + #if AXIS_HAS_STEALTHCHOP(X) + tmc_x_step = stepperX.homing_threshold(); + #endif + #if AXIS_HAS_STEALTHCHOP(Y) + tmc_y_step = stepperY.homing_threshold(); + #endif + #if AXIS_HAS_STEALTHCHOP(Z) + tmc_z_step = stepperZ.homing_threshold(); + #endif + #endif + + if (min_ex_temp != 0) + thermalManager.extrude_min_temp = min_ex_temp; + + DGUS_ExtrudeLoadInit(); + + TERN_(DGUS_MKS_RUNOUT_SENSOR, DGUS_RunoutInit()); + + if (TERN0(POWER_LOSS_RECOVERY, recovery.valid())) + GotoScreen(DGUSLCD_SCREEN_POWER_LOSS); + else + GotoScreen(DGUSLCD_SCREEN_MAIN); + } + + #if ENABLED(DGUS_MKS_RUNOUT_SENSOR) + if (booted && (IS_SD_PRINTING() || IS_SD_PAUSED())) + DGUS_Runout_Idle(); + #endif + #endif // SHOW_BOOTSCREEN + + return IsScreenComplete(); +} + +void DGUSScreenHandler::LanguagePInit() { + switch (DGUSLanguageSwitch) { + case MKS_SimpleChinese: + dgusdisplay.MKS_WriteVariable(VP_LANGUAGE_CHANGE1, MKS_Language_Choose); + dgusdisplay.MKS_WriteVariable(VP_LANGUAGE_CHANGE2, MKS_Language_NoChoose); + break; + case MKS_English: + dgusdisplay.MKS_WriteVariable(VP_LANGUAGE_CHANGE1, MKS_Language_NoChoose); + dgusdisplay.MKS_WriteVariable(VP_LANGUAGE_CHANGE2, MKS_Language_Choose); + break; + default: + break; + } +} + +void DGUSScreenHandler::DGUS_ExtrudeLoadInit(void) { + ex_filament.ex_length = distanceFilament; + ex_filament.ex_load_unload_flag = 0; + ex_filament.ex_need_time = FilamentSpeed; + ex_filament.ex_speed = 0; + ex_filament.ex_status = EX_NONE; + ex_filament.ex_tick_end = 0; + ex_filament.ex_tick_start = 0; +} + +void DGUSScreenHandler::DGUS_RunoutInit(void) { + #if PIN_EXISTS(MT_DET_1) + pinMode(MT_DET_1_PIN, INPUT_PULLUP); + #endif + runout_mks.de_count = 0; + runout_mks.de_times = 10; + runout_mks.pin_status = 1; + runout_mks.runout_status = UNRUNOUT_STATUS; +} + +void DGUSScreenHandler::DGUS_Runout_Idle(void) { + #if ENABLED(DGUS_MKS_RUNOUT_SENSOR) + // scanf runout pin + switch (runout_mks.runout_status) { + + case RUNOUT_STATUS: + runout_mks.runout_status = RUNOUT_BEGIN_STATUS; + queue.inject_P(PSTR("M25")); + GotoScreen(MKSLCD_SCREEN_PAUSE); + + sendinfoscreen(PSTR("NOTICE"), nullptr, PSTR("Please change filament!"), nullptr, true, true, true, true); + // SetupConfirmAction(nullptr); + GotoScreen(DGUSLCD_SCREEN_POPUP); + break; + + case UNRUNOUT_STATUS: + if (READ(MT_DET_1_PIN) == LOW) + runout_mks.runout_status = RUNOUT_STATUS; + break; + + case RUNOUT_BEGIN_STATUS: + if (READ(MT_DET_1_PIN) == HIGH) + runout_mks.runout_status = RUNOUT_WAITTING_STATUS; + break; + + case RUNOUT_WAITTING_STATUS: + if (READ(MT_DET_1_PIN) == LOW) + runout_mks.runout_status = RUNOUT_BEGIN_STATUS; + break; + + default: break; + } + #endif +} + +void DGUSScreenHandler::DGUS_LanguageDisplay(uint8_t var) { + if (var == MKS_English) { + const char home_buf_en[] = "Home"; + dgusdisplay.WriteVariable(VP_HOME_Dis, home_buf_en, 32, true); + + const char setting_buf_en[] = "Setting"; + dgusdisplay.WriteVariable(VP_Setting_Dis, setting_buf_en, 32, true); + + const char Tool_buf_en[] = "Tool"; + dgusdisplay.WriteVariable(VP_Tool_Dis, Tool_buf_en, 32, true); + + const char Print_buf_en[] = "Print"; + dgusdisplay.WriteVariable(VP_Print_Dis, Print_buf_en, 32, true); + + const char Language_buf_en[] = "Language"; + dgusdisplay.WriteVariable(VP_Language_Dis, Language_buf_en, 32, true); + + const char About_buf_en[] = "About"; + dgusdisplay.WriteVariable(VP_About_Dis, About_buf_en, 32, true); + + const char Config_buf_en[] = "Config"; + dgusdisplay.WriteVariable(VP_Config_Dis, Config_buf_en, 32, true); + + const char MotorConfig_buf_en[] = "MotorConfig"; + dgusdisplay.WriteVariable(VP_MotorConfig_Dis, MotorConfig_buf_en, 32, true); + + const char LevelConfig_buf_en[] = "LevelConfig"; + dgusdisplay.WriteVariable(VP_LevelConfig_Dis, LevelConfig_buf_en, 32, true); + + const char TemperatureConfig_buf_en[] = "Temperature"; + dgusdisplay.WriteVariable(VP_TemperatureConfig_Dis, TemperatureConfig_buf_en, 32, true); + + const char Advance_buf_en[] = "Advance"; + dgusdisplay.WriteVariable(VP_Advance_Dis, Advance_buf_en, 32, true); + + const char Filament_buf_en[] = "Extrude"; + dgusdisplay.WriteVariable(VP_Filament_Dis, Filament_buf_en, 32, true); + + const char Move_buf_en[] = "Move"; + dgusdisplay.WriteVariable(VP_Move_Dis, Move_buf_en, 32, true); + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + const char Level_buf_en[] = "AutoLevel"; + dgusdisplay.WriteVariable(VP_Level_Dis, Level_buf_en, 32, true); + #elif ENABLED(MESH_BED_LEVELING) + const char Level_buf_en[] = "MeshLevel"; + dgusdisplay.WriteVariable(VP_Level_Dis, Level_buf_en, 32, true); + #else + const char Level_buf_en[] = "Level"; + dgusdisplay.WriteVariable(VP_Level_Dis, Level_buf_en, 32, true); + #endif + + const char MotorPluse_buf_en[] = "MotorPluse"; + dgusdisplay.WriteVariable(VP_MotorPluse_Dis, MotorPluse_buf_en, 32, true); + + const char MotorMaxSpeed_buf_en[] = "MotorMaxSpeed"; + dgusdisplay.WriteVariable(VP_MotorMaxSpeed_Dis, MotorMaxSpeed_buf_en, 32, true); + + const char MotorMaxAcc_buf_en[] = "MotorAcc"; + dgusdisplay.WriteVariable(VP_MotorMaxAcc_Dis, MotorMaxAcc_buf_en, 32, true); + + const char TravelAcc_buf_en[] = "TravelAcc"; + dgusdisplay.WriteVariable(VP_TravelAcc_Dis, TravelAcc_buf_en, 32, true); + + const char FeedRateMin_buf_en[] = "FeedRateMin"; + dgusdisplay.WriteVariable(VP_FeedRateMin_Dis, FeedRateMin_buf_en, 32, true); + + const char TravelFeeRateMin_buf_en[] = "TravelFeedRateMin"; + dgusdisplay.WriteVariable(VP_TravelFeeRateMin_Dis, TravelFeeRateMin_buf_en, 32, true); + + const char Acc_buf_en[] = "Acc"; + dgusdisplay.WriteVariable(VP_ACC_Dis, Acc_buf_en, 32, true); + + const char Point_One_buf_en[] = "Point_First"; + dgusdisplay.WriteVariable(VP_Point_One_Dis, Point_One_buf_en, 32, true); + + const char Point_Two_buf_en[] = "Point_Second"; + dgusdisplay.WriteVariable(VP_Point_Two_Dis, Point_Two_buf_en, 32, true); + + const char Point_Three_buf_en[] = "Point_Third"; + dgusdisplay.WriteVariable(VP_Point_Three_Dis, Point_Three_buf_en, 32, true); + + const char Point_Four_buf_en[] = "Point_Fourth"; + dgusdisplay.WriteVariable(VP_Point_Four_Dis, Point_Four_buf_en, 32, true); + + const char Point_Five_buf_en[] = "Point_Fifth"; + dgusdisplay.WriteVariable(VP_Point_Five_Dis, Point_Five_buf_en, 32, true); + + const char Extrusion_buf_en[] = "Extrusion"; + dgusdisplay.WriteVariable(VP_Extrusion_Dis, Extrusion_buf_en, 32, true); + + const char HeatBed_buf_en[] = "HeatBed"; + dgusdisplay.WriteVariable(VP_HeatBed_Dis, HeatBed_buf_en, 32, true); + + const char FactoryDefaults_buf_en[] = "FactoryDefaults"; + dgusdisplay.WriteVariable(VP_FactoryDefaults_Dis, FactoryDefaults_buf_en, 32, true); + + const char StoreSetting_buf_en[] = "StoreSetting"; + dgusdisplay.WriteVariable(VP_StoreSetting_Dis, StoreSetting_buf_en, 32, true); + + const char PrintPauseConfig_buf_en[] = "PrintPauseConfig"; + dgusdisplay.WriteVariable(VP_PrintPauseConfig_Dis, PrintPauseConfig_buf_en, 32, true); + + const char X_Pluse_buf_en[] = "X_Pluse"; + dgusdisplay.WriteVariable(VP_X_Pluse_Dis, X_Pluse_buf_en, 32, true); + + const char Y_Pluse_buf_en[] = "Y_Pluse"; + dgusdisplay.WriteVariable(VP_Y_Pluse_Dis, Y_Pluse_buf_en, 32, true); + + const char Z_Pluse_buf_en[] = "Z_Pluse"; + dgusdisplay.WriteVariable(VP_Z_Pluse_Dis, Z_Pluse_buf_en, 32, true); + + const char E0_Pluse_buf_en[] = "E0_Pluse"; + dgusdisplay.WriteVariable(VP_E0_Pluse_Dis, E0_Pluse_buf_en, 32, true); + + const char E1_Pluse_buf_en[] = "E1_Pluse"; + dgusdisplay.WriteVariable(VP_E1_Pluse_Dis, E1_Pluse_buf_en, 32, true); + + const char X_Max_Speed_buf_en[] = "X_Max_Speed"; + dgusdisplay.WriteVariable(VP_X_Max_Speed_Dis, X_Max_Speed_buf_en, 32, true); + + const char Y_Max_Speed_buf_en[] = "Y_Max_Speed"; + dgusdisplay.WriteVariable(VP_Y_Max_Speed_Dis, Y_Max_Speed_buf_en, 32, true); + + const char Z_Max_Speed_buf_en[] = "Z_Max_Speed"; + dgusdisplay.WriteVariable(VP_Z_Max_Speed_Dis, Z_Max_Speed_buf_en, 32, true); + + const char E0_Max_Speed_buf_en[] = "E0_Max_Speed"; + dgusdisplay.WriteVariable(VP_E0_Max_Speed_Dis, E0_Max_Speed_buf_en, 32, true); + + const char E1_Max_Speed_buf_en[] = "E1_Max_Speed"; + dgusdisplay.WriteVariable(VP_E1_Max_Speed_Dis, E1_Max_Speed_buf_en, 32, true); + + const char X_Max_Acc_Speed_buf_en[] = "X_Max_Acc_Speed"; + dgusdisplay.WriteVariable(VP_X_Max_Acc_Speed_Dis, X_Max_Acc_Speed_buf_en, 32, true); + + const char Y_Max_Acc_Speed_buf_en[] = "Y_Max_Acc_Speed"; + dgusdisplay.WriteVariable(VP_Y_Max_Acc_Speed_Dis, Y_Max_Acc_Speed_buf_en, 32, true); + + const char Z_Max_Acc_Speed_buf_en[] = "Z_Max_Acc_Speed"; + dgusdisplay.WriteVariable(VP_Z_Max_Acc_Speed_Dis, Z_Max_Acc_Speed_buf_en, 32, true); + + const char E0_Max_Acc_Speed_buf_en[] = "E0_Max_Acc_Speed"; + dgusdisplay.WriteVariable(VP_E0_Max_Acc_Speed_Dis, E0_Max_Acc_Speed_buf_en, 32, true); + + const char E1_Max_Acc_Speed_buf_en[] = "E1_Max_Acc_Speed"; + dgusdisplay.WriteVariable(VP_E1_Max_Acc_Speed_Dis, E1_Max_Acc_Speed_buf_en, 32, true); + + const char X_PARK_POS_buf_en[] = "X_PARK_POS"; + dgusdisplay.WriteVariable(VP_X_PARK_POS_Dis, X_PARK_POS_buf_en, 32, true); + + const char Y_PARK_POS_buf_en[] = "Y_PARK_POS"; + dgusdisplay.WriteVariable(VP_Y_PARK_POS_Dis, Y_PARK_POS_buf_en, 32, true); + + const char Z_PARK_POS_buf_en[] = "Z_PARK_POS"; + dgusdisplay.WriteVariable(VP_Z_PARK_POS_Dis, Z_PARK_POS_buf_en, 32, true); + + const char Length_buf_en[] = "Length"; + dgusdisplay.WriteVariable(VP_Length_Dis, Length_buf_en, 32, true); + + const char Speed_buf_en[] = "Speed"; + dgusdisplay.WriteVariable(VP_Speed_Dis, Speed_buf_en, 32, true); + + const char InOut_buf_en[] = "InOut"; + dgusdisplay.WriteVariable(VP_InOut_Dis, InOut_buf_en, 32, true); + + const char PrintTimet_buf_en[] = "PrintTime"; + dgusdisplay.WriteVariable(VP_PrintTime_Dis, PrintTimet_buf_en, 32, true); + + const char E0_Temp_buf_en[] = "E0_Temp"; + dgusdisplay.WriteVariable(VP_E0_Temp_Dis, E0_Temp_buf_en, 32, true); + + const char E1_Temp_buf_en[] = "E1_Temp"; + dgusdisplay.WriteVariable(VP_E1_Temp_Dis, E1_Temp_buf_en, 32, true); + + const char HB_Temp_buf_en[] = "HB_Temp"; + dgusdisplay.WriteVariable(VP_HB_Temp_Dis, HB_Temp_buf_en, 32, true); + + const char Feedrate_buf_en[] = "Feedrate"; + dgusdisplay.WriteVariable(VP_Feedrate_Dis, Feedrate_buf_en, 32, true); + + const char PrintAcc_buf_en[] = "PrintSpeed"; + dgusdisplay.WriteVariable(VP_PrintAcc_Dis, PrintAcc_buf_en, 32, true); + + const char FAN_Speed_buf_en[] = "FAN_Speed"; + dgusdisplay.WriteVariable(VP_FAN_Speed_Dis, FAN_Speed_buf_en, 32, true); + + const char Printing_buf_en[] = "Printing"; + dgusdisplay.WriteVariable(VP_Printing_Dis, Printing_buf_en, 32, true); + + const char Info_EEPROM_1_buf_en[] = "Store setting?"; + dgusdisplay.WriteVariable(VP_Info_EEPROM_1_Dis, Info_EEPROM_1_buf_en, 32, true); + + const char Info_EEPROM_2_buf_en[] = "Revert setting?"; + dgusdisplay.WriteVariable(VP_Info_EEPROM_2_Dis, Info_EEPROM_2_buf_en, 32, true); + + const char Info_PrinfFinsh_1_buf_en[] = "Print Done"; + dgusdisplay.WriteVariable(VP_Info_PrinfFinsh_1_Dis, Info_PrinfFinsh_1_buf_en, 32, true); + + const char TMC_X_Step_buf_en[] = "X_SenSitivity"; + dgusdisplay.WriteVariable(VP_TMC_X_Step_Dis, TMC_X_Step_buf_en, 32, true); + + const char TMC_Y_Step_buf_en[] = "Y_SenSitivity"; + dgusdisplay.WriteVariable(VP_TMC_Y_Step_Dis, TMC_Y_Step_buf_en, 32, true); + + const char TMC_Z_Step_buf_en[] = "Z_SenSitivity"; + dgusdisplay.WriteVariable(VP_TMC_Z_Step_Dis, TMC_Z_Step_buf_en, 32, true); + + const char TMC_X_Current_buf_en[] = "X_Current"; + dgusdisplay.WriteVariable(VP_TMC_X_Current_Dis, TMC_X_Current_buf_en, 32, true); + + const char TMC_Y_Current_buf_en[] = "Y_Current"; + dgusdisplay.WriteVariable(VP_TMC_Y_Current_Dis, TMC_Y_Current_buf_en, 32, true); + + const char TMC_Z_Current_buf_en[] = "Z_Current"; + dgusdisplay.WriteVariable(VP_TMC_Z_Current_Dis, TMC_Z_Current_buf_en, 32, true); + + const char TMC_E0_Current_buf_en[] = "E0_Current"; + dgusdisplay.WriteVariable(VP_TMC_E0_Current_Dis, TMC_E0_Current_buf_en, 32, true); + + const char TMC_X1_Current_buf_en[] = "X1_Current"; + dgusdisplay.WriteVariable(VP_TMC_X1_Current_Dis, TMC_X1_Current_buf_en, 32, true); + + const char TMC_Y1_Current_buf_en[] = "Y1_Current"; + dgusdisplay.WriteVariable(VP_TMC_Y1_Current_Dis, TMC_Y1_Current_buf_en, 32, true); + + const char TMC_Z1_Current_buf_en[] = "Z1_Current"; + dgusdisplay.WriteVariable(VP_TMC_Z1_Current_Dis, TMC_Z1_Current_buf_en, 32, true); + + const char TMC_E1_Current_buf_en[] = "E1_Current"; + dgusdisplay.WriteVariable(VP_TMC_E1_Current_Dis, TMC_E1_Current_buf_en, 32, true); + + const char Min_Ex_Temp_buf_en[] = "Min_Ex_Temp"; + dgusdisplay.WriteVariable(VP_Min_Ex_Temp_Dis, Min_Ex_Temp_buf_en, 32, true); + + const char AutoLEVEL_INFO1_buf_en[] = "Please Press Button!"; + dgusdisplay.WriteVariable(VP_AutoLEVEL_INFO1, AutoLEVEL_INFO1_buf_en, 32, true); + + const char EX_TEMP_INFO2_buf_en[] = "Please wait a monent"; + dgusdisplay.WriteVariable(VP_EX_TEMP_INFO2_Dis, EX_TEMP_INFO2_buf_en, 32, true); + + const char EX_TEMP_INFO3_buf_en[] = "Cancle"; + dgusdisplay.WriteVariable(VP_EX_TEMP_INFO3_Dis, EX_TEMP_INFO3_buf_en, 32, true); + + const char PrintConfrim_Info_buf_en[] = "Start Print?"; + dgusdisplay.WriteVariable(VP_PrintConfrim_Info_Dis, PrintConfrim_Info_buf_en, 32, true); + + const char StopPrintConfrim_Info_buf_en[] = "Stop Print?"; + dgusdisplay.WriteVariable(VP_StopPrintConfrim_Info_Dis, StopPrintConfrim_Info_buf_en, 32, true); + + const char Printting_buf_en[] = "Printing"; + dgusdisplay.WriteVariable(VP_Printting_Dis, Printting_buf_en, 32, true); + + const char LCD_BLK_buf_en[] = "Backlight"; + dgusdisplay.WriteVariable(VP_LCD_BLK_Dis, LCD_BLK_buf_en, 32, true); + } + else if (var == MKS_SimpleChinese) { + uint16_t home_buf_ch[] = { 0xF7D6, 0xB3D2 }; + dgusdisplay.WriteVariable(VP_HOME_Dis, home_buf_ch, 4, true); + + const uint16_t Setting_Dis[] = { 0xE8C9, 0xC3D6, 0x2000, 0x2000, 0x2000 }; + dgusdisplay.WriteVariable(VP_Setting_Dis, Setting_Dis, 7, true); + + const uint16_t Tool_Dis[] = { 0xA4B9, 0xDFBE }; + dgusdisplay.WriteVariable(VP_Tool_Dis, Tool_Dis, 4, true); + + const uint16_t Print_buf_ch[] = { 0xF2B4, 0xA1D3, 0x2000 }; + dgusdisplay.WriteVariable(VP_Print_Dis, Print_buf_ch, 6, true); + + const uint16_t Language_buf_ch[] = { 0xEFD3, 0xD4D1, 0x2000, 0x2000 }; + dgusdisplay.WriteVariable(VP_Language_Dis, Language_buf_ch, 8, true); + + const uint16_t About_buf_ch[] = { 0xD8B9, 0xDAD3, 0x2000 }; + dgusdisplay.WriteVariable(VP_About_Dis, About_buf_ch, 6, true); + + const uint16_t Config_buf_ch[] = { 0xE4C5, 0xC3D6, 0x2000 }; + dgusdisplay.WriteVariable(VP_Config_Dis, Config_buf_ch, 6, true); + + const uint16_t MotorConfig_buf_ch[] = { 0xE7B5, 0xFABB, 0xE4C5, 0xC3D6, 0x2000 }; + dgusdisplay.WriteVariable(VP_MotorConfig_Dis, MotorConfig_buf_ch, 12, true); + + const uint16_t LevelConfig_buf_ch[] = { 0xD6CA, 0xAFB6, 0xF7B5, 0xBDC6, 0xE8C9, 0xC3D6, 0x2000 }; + dgusdisplay.WriteVariable(VP_LevelConfig_Dis, LevelConfig_buf_ch, 32, true); + + const uint16_t TemperatureConfig_buf_ch[] = { 0xC2CE, 0xC8B6, 0x2000 }; + dgusdisplay.WriteVariable(VP_TemperatureConfig_Dis, TemperatureConfig_buf_ch, 11, true); + + const uint16_t Advance_buf_ch[] = { 0xDFB8, 0xB6BC, 0xE8C9, 0xC3D6, 0x2000 }; + dgusdisplay.WriteVariable(VP_Advance_Dis, Advance_buf_ch, 16, true); + + const uint16_t Filament_buf_ch[] = { 0xB7BC, 0xF6B3, 0x2000 }; + dgusdisplay.WriteVariable(VP_Filament_Dis, Filament_buf_ch, 8, true); + + const uint16_t Move_buf_ch[] = { 0xC6D2, 0xAFB6, 0x2000 }; + dgusdisplay.WriteVariable(VP_Move_Dis, Move_buf_ch, 4, true); + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + const uint16_t Level_buf_ch[] = { 0xD4D7, 0xAFB6, 0xF7B5, 0xBDC6, 0x2000 }; + dgusdisplay.WriteVariable(VP_Level_Dis, Level_buf_ch, 32, true); + #elif ENABLED(MESH_BED_LEVELING) + const uint16_t Level_buf_ch[] = { 0xF8CD, 0xF1B8, 0xF7B5, 0xBDC6, 0x2000 }; + dgusdisplay.WriteVariable(VP_Level_Dis, Level_buf_ch, 32, true); + #else + const uint16_t Level_buf_ch[] = { 0xD6CA, 0xAFB6, 0xF7B5, 0xBDC6, 0x2000 }; + dgusdisplay.WriteVariable(VP_Level_Dis, Level_buf_ch, 32, true); + #endif + + const uint16_t MotorPluse_buf_ch[] = { 0xF6C2, 0xE5B3, 0x2000 }; + dgusdisplay.WriteVariable(VP_MotorPluse_Dis, MotorPluse_buf_ch, 16, true); + + const uint16_t MotorMaxSpeed_buf_ch[] = { 0xEED7, 0xF3B4, 0xD9CB, 0xC8B6, 0x2000 }; + dgusdisplay.WriteVariable(VP_MotorMaxSpeed_Dis, MotorMaxSpeed_buf_ch, 16, true); + + const uint16_t MotorMaxAcc_buf_ch[] = { 0xEED7, 0xF3B4, 0xD3BC, 0xD9CB, 0xC8B6, 0x2000 }; + dgusdisplay.WriteVariable(VP_MotorMaxAcc_Dis, MotorMaxAcc_buf_ch, 16, true); + + const uint16_t TravelAcc_buf_ch[] = { 0xD5BF, 0xD0D0, 0xD3BC, 0xD9CB, 0xC8B6, 0x2000 }; + dgusdisplay.WriteVariable(VP_TravelAcc_Dis, TravelAcc_buf_ch, 16, true); + + const uint16_t FeedRateMin_buf_ch[] = { 0xEED7, 0xA1D0, 0xD9CB, 0xC8B6, 0x2000 }; + dgusdisplay.WriteVariable(VP_FeedRateMin_Dis, FeedRateMin_buf_ch, 12, true); + + const uint16_t TravelFeeRateMin_buf_ch[] = { 0xD5BF, 0xD0D0, 0xEED7, 0xA1D0, 0xD9CB, 0xC8B6, 0x2000 }; + dgusdisplay.WriteVariable(VP_TravelFeeRateMin_Dis, TravelFeeRateMin_buf_ch, 24, true); + + const uint16_t Acc_buf_ch[] = { 0xD3BC, 0xD9CB, 0xC8B6, 0x2000 }; + dgusdisplay.WriteVariable(VP_ACC_Dis, Acc_buf_ch, 16, true); + + const uint16_t Point_One_buf_ch[] = { 0xDAB5, 0xBBD2, 0xE3B5, 0x2000 }; + dgusdisplay.WriteVariable(VP_Point_One_Dis, Point_One_buf_ch, 12, true); + + const uint16_t Point_Two_buf_ch[] = { 0xDAB5, 0xFEB6, 0xE3B5, 0x2000 }; + dgusdisplay.WriteVariable(VP_Point_Two_Dis, Point_Two_buf_ch, 12, true); + + const uint16_t Point_Three_buf_ch[] = { 0xDAB5, 0xFDC8, 0xE3B5, 0x2000 }; + dgusdisplay.WriteVariable(VP_Point_Three_Dis, Point_Three_buf_ch, 12, true); + + const uint16_t Point_Four_buf_ch[] = { 0xDAB5, 0xC4CB, 0xE3B5, 0x2000 }; + dgusdisplay.WriteVariable(VP_Point_Four_Dis, Point_Four_buf_ch, 12, true); + + const uint16_t Point_Five_buf_ch[] = { 0xDAB5, 0xE5CE, 0xE3B5, 0x2000 }; + dgusdisplay.WriteVariable(VP_Point_Five_Dis, Point_Five_buf_ch, 12, true); + + const uint16_t Extrusion_buf_ch[] = { 0xB7BC, 0xF6B3, 0xB7CD, 0x2000 }; + dgusdisplay.WriteVariable(VP_Extrusion_Dis, Extrusion_buf_ch, 12, true); + + const uint16_t HeatBed_buf_ch[] = { 0xC8C8, 0xB2B4, 0x2000 }; + dgusdisplay.WriteVariable(VP_HeatBed_Dis, HeatBed_buf_ch, 12, true); + + const uint16_t FactoryDefaults_buf_ch[] = { 0xD6BB, 0xB4B8, 0xF6B3, 0xA7B3, 0xE8C9, 0xC3D6, 0x2000 }; + dgusdisplay.WriteVariable(VP_FactoryDefaults_Dis, FactoryDefaults_buf_ch, 16, true); + + const uint16_t StoreSetting_buf_ch[] = { 0xA3B1, 0xE6B4, 0xE8C9, 0xC3D6, 0x2000 }; + dgusdisplay.WriteVariable(VP_StoreSetting_Dis, StoreSetting_buf_ch, 16, true); + + const uint16_t PrintPauseConfig_buf_ch[] = { 0xDDD4, 0xA3CD, 0xBBCE, 0xC3D6, 0x2000 }; + dgusdisplay.WriteVariable(VP_PrintPauseConfig_Dis, PrintPauseConfig_buf_ch, 32, true); + + const uint16_t X_Pluse_buf_ch[] = { 0x2058, 0xE1D6, 0xF6C2, 0xE5B3, 0x2000 }; + dgusdisplay.WriteVariable(VP_X_Pluse_Dis, X_Pluse_buf_ch, 16, true); + + const uint16_t Y_Pluse_buf_ch[] = { 0x2059, 0xE1D6, 0xF6C2, 0xE5B3, 0x2000 }; + dgusdisplay.WriteVariable(VP_Y_Pluse_Dis, Y_Pluse_buf_ch, 16, true); + + const uint16_t Z_Pluse_buf_ch[] = { 0x205A, 0xE1D6, 0xF6C2, 0xE5B3, 0x2000 }; + dgusdisplay.WriteVariable(VP_Z_Pluse_Dis, Z_Pluse_buf_ch, 16, true); + + const uint16_t E0_Pluse_buf_ch[] = { 0x3045, 0xE1D6, 0xF6C2, 0xE5B3, 0x2000 }; + dgusdisplay.WriteVariable(VP_E0_Pluse_Dis, E0_Pluse_buf_ch, 16, true); + + const uint16_t E1_Pluse_buf_ch[] = { 0x3145, 0xE1D6, 0xF6C2, 0xE5B3, 0x2000 }; + dgusdisplay.WriteVariable(VP_E1_Pluse_Dis, E1_Pluse_buf_ch, 16, true); + + const uint16_t X_Max_Speed_buf_ch[] = { 0x2058, 0xEED7, 0xF3B4, 0xD9CB, 0xC8B6, 0x2000 }; + dgusdisplay.WriteVariable(VP_X_Max_Speed_Dis, X_Max_Speed_buf_ch, 16, true); + + const uint16_t Y_Max_Speed_buf_ch[] = { 0x2059, 0xEED7, 0xF3B4, 0xD9CB, 0xC8B6, 0x2000 }; + dgusdisplay.WriteVariable(VP_Y_Max_Speed_Dis, Y_Max_Speed_buf_ch, 16, true); + + const uint16_t Z_Max_Speed_buf_ch[] = { 0x205A, 0xEED7, 0xF3B4, 0xD9CB, 0xC8B6, 0x2000 }; + dgusdisplay.WriteVariable(VP_Z_Max_Speed_Dis, Z_Max_Speed_buf_ch, 16, true); + + const uint16_t E0_Max_Speed_buf_ch[] = { 0x3045, 0xEED7, 0xF3B4, 0xD9CB, 0xC8B6, 0x2000 }; + dgusdisplay.WriteVariable(VP_E0_Max_Speed_Dis, E0_Max_Speed_buf_ch, 16, true); + + const uint16_t E1_Max_Speed_buf_ch[] = { 0x3145, 0xEED7, 0xF3B4, 0xD9CB, 0xC8B6, 0x2000 }; + dgusdisplay.WriteVariable(VP_E1_Max_Speed_Dis, E1_Max_Speed_buf_ch, 16, true); + + const uint16_t X_Max_Acc_Speed_buf_ch[] = { 0x2058, 0xEED7, 0xF3B4, 0xD3BC, 0xD9CB, 0xC8B6, 0x2000 }; + dgusdisplay.WriteVariable(VP_X_Max_Acc_Speed_Dis, X_Max_Acc_Speed_buf_ch, 16, true); + + const uint16_t Y_Max_Acc_Speed_buf_ch[] = { 0x2059, 0xEED7, 0xF3B4, 0xD3BC, 0xD9CB, 0xC8B6, 0x2000 }; + dgusdisplay.WriteVariable(VP_Y_Max_Acc_Speed_Dis, Y_Max_Acc_Speed_buf_ch, 16, true); + + const uint16_t Z_Max_Acc_Speed_buf_ch[] = { 0x205A, 0xEED7, 0xF3B4, 0xD3BC, 0xD9CB, 0xC8B6, 0x2000 }; + dgusdisplay.WriteVariable(VP_Z_Max_Acc_Speed_Dis, Z_Max_Acc_Speed_buf_ch, 16, true); + + const uint16_t E0_Max_Acc_Speed_buf_ch[] = { 0x3045, 0xEED7, 0xF3B4, 0xD3BC, 0xD9CB, 0xC8B6, 0x2000 }; + dgusdisplay.WriteVariable(VP_E0_Max_Acc_Speed_Dis, E0_Max_Acc_Speed_buf_ch, 16, true); + + const uint16_t E1_Max_Acc_Speed_buf_ch[] = { 0x3145, 0xEED7, 0xF3B4, 0xD3BC, 0xD9CB, 0xC8B6, 0x2000 }; + dgusdisplay.WriteVariable(VP_E1_Max_Acc_Speed_Dis, E1_Max_Acc_Speed_buf_ch, 16, true); + + const uint16_t X_PARK_POS_buf_ch[] = { 0x2058, 0xDDD4, 0xA3CD, 0xBBCE, 0xC3D6, 0x2000 }; + dgusdisplay.WriteVariable(VP_X_PARK_POS_Dis, X_PARK_POS_buf_ch, 16, true); + + const uint16_t Y_PARK_POS_buf_ch[] = { 0x2059, 0xDDD4, 0xA3CD, 0xBBCE, 0xC3D6, 0x2000 }; + dgusdisplay.WriteVariable(VP_Y_PARK_POS_Dis, Y_PARK_POS_buf_ch, 16, true); + + const uint16_t Z_PARK_POS_buf_ch[] = { 0x205A, 0xDDD4, 0xA3CD, 0xBBCE, 0xC3D6, 0x2000 }; + dgusdisplay.WriteVariable(VP_Z_PARK_POS_Dis, Z_PARK_POS_buf_ch, 16, true); + + const uint16_t Length_buf_ch[] = { 0xBDB2, 0xA4B3, 0x2000 }; + dgusdisplay.WriteVariable(VP_Length_Dis, Length_buf_ch, 8, true); + + const uint16_t Speed_buf_ch[] = { 0xD9CB, 0xC8B6, 0x2000 }; + dgusdisplay.WriteVariable(VP_Speed_Dis, Speed_buf_ch, 8, true); + + const uint16_t InOut_buf_ch[] = { 0xF8BD, 0xF6B3, 0x2000 }; + dgusdisplay.WriteVariable(VP_InOut_Dis, InOut_buf_ch, 8, true); + + const uint16_t PrintTimet_buf_en[] = { 0xF2B4, 0xA1D3, 0xB1CA, 0xE4BC, 0x2000 }; + dgusdisplay.WriteVariable(VP_PrintTime_Dis, PrintTimet_buf_en, 16, true); + + const uint16_t E0_Temp_buf_ch[] = { 0x3045, 0xC2CE, 0xC8B6, 0x2000 }; + dgusdisplay.WriteVariable(VP_E0_Temp_Dis, E0_Temp_buf_ch, 16, true); + + const uint16_t E1_Temp_buf_ch[] = { 0x3145, 0xC2CE, 0xC8B6, 0x2000 }; + dgusdisplay.WriteVariable(VP_E1_Temp_Dis, E1_Temp_buf_ch, 16, true); + + const uint16_t HB_Temp_buf_ch[] = { 0xC8C8, 0xB2B4, 0xC2CE, 0xC8B6, 0x2000 }; + dgusdisplay.WriteVariable(VP_HB_Temp_Dis, HB_Temp_buf_ch, 16, true); + + const uint16_t Feedrate_buf_ch[] = { 0xB7BC, 0xF6B3, 0xD9CB, 0xC8B6, 0x2000 }; + dgusdisplay.WriteVariable(VP_Feedrate_Dis, Feedrate_buf_ch, 16, true); + + const uint16_t PrintAcc_buf_ch[] = { 0xF2B4, 0xA1D3, 0xD9CB, 0xC8B6, 0x2000 }; + dgusdisplay.WriteVariable(VP_PrintAcc_Dis, PrintAcc_buf_ch, 16, true); + + const uint16_t FAN_Speed_buf_ch[] = { 0xE7B7, 0xC8C9, 0xD9CB, 0xC8B6, 0x2000 }; + dgusdisplay.WriteVariable(VP_FAN_Speed_Dis, FAN_Speed_buf_ch, 16, true); + + const uint16_t Printing_buf_ch[] = { 0xF2B4, 0xA1D3, 0xD0D6, 0x2000 }; + dgusdisplay.WriteVariable(VP_Printing_Dis, Printing_buf_ch, 16, true); + + const uint16_t Info_EEPROM_1_buf_ch[] = { 0xC7CA, 0xF1B7, 0xA3B1, 0xE6B4, 0xE8C9, 0xC3D6, 0xBFA3, 0x2000 }; + dgusdisplay.WriteVariable(VP_Info_EEPROM_1_Dis, Info_EEPROM_1_buf_ch, 32, true); + + const uint16_t Info_EEPROM_2_buf_ch[] = { 0xC7CA, 0xF1B7, 0xD6BB, 0xB4B8, 0xF6B3, 0xA7B3, 0xE8C9, 0xC3D6, 0x2000 }; + dgusdisplay.WriteVariable(VP_Info_EEPROM_2_Dis, Info_EEPROM_2_buf_ch, 32, true); + + const uint16_t TMC_X_Step_buf_ch[] = { 0x2058, 0xE9C1, 0xF4C3, 0xC8B6, 0x2000 }; + dgusdisplay.WriteVariable(VP_TMC_X_Step_Dis, TMC_X_Step_buf_ch, 16, true); + + const uint16_t TMC_Y_Step_buf_ch[] = { 0x2059, 0xE9C1, 0xF4C3, 0xC8B6, 0x2000 }; + dgusdisplay.WriteVariable(VP_TMC_Y_Step_Dis, TMC_Y_Step_buf_ch, 16, true); + + const uint16_t TMC_Z_Step_buf_ch[] = { 0x205A, 0xE9C1, 0xF4C3, 0xC8B6, 0x2000 }; + dgusdisplay.WriteVariable(VP_TMC_Z_Step_Dis, TMC_Z_Step_buf_ch, 16, true); + + const uint16_t Info_PrinfFinsh_1_buf_ch[] = { 0xF2B4, 0xA1D3, 0xEACD, 0xC9B3, 0x2000 }; + dgusdisplay.WriteVariable(VP_Info_PrinfFinsh_1_Dis, Info_PrinfFinsh_1_buf_ch, 32, true); + + const uint16_t TMC_X_Current_buf_ch[] = { 0x2058, 0xE1D6, 0xE7B5, 0xF7C1, 0x2000 }; + dgusdisplay.WriteVariable(VP_TMC_X_Current_Dis, TMC_X_Current_buf_ch, 16, true); + + const uint16_t TMC_Y_Current_buf_ch[] = { 0x2059, 0xE1D6, 0xE7B5, 0xF7C1, 0x2000 }; + dgusdisplay.WriteVariable(VP_TMC_Y_Current_Dis, TMC_Y_Current_buf_ch, 16, true); + + const uint16_t TMC_Z_Current_buf_ch[] = { 0x205A, 0xE1D6, 0xE7B5, 0xF7C1, 0x2000 }; + dgusdisplay.WriteVariable(VP_TMC_Z_Current_Dis, TMC_Z_Current_buf_ch, 16, true); + + const uint16_t TMC_E0_Current_buf_ch[] = { 0x3045, 0xE1D6, 0xE7B5, 0xF7C1, 0x2000 }; + dgusdisplay.WriteVariable(VP_TMC_E0_Current_Dis, TMC_E0_Current_buf_ch, 16, true); + + const uint16_t TMC_X1_Current_buf_ch[] = { 0x3158, 0xE1D6, 0xE7B5, 0xF7C1, 0x2000 }; + dgusdisplay.WriteVariable(VP_TMC_X1_Current_Dis, TMC_X1_Current_buf_ch, 16, true); + + const uint16_t TMC_Y1_Current_buf_ch[] = { 0x3159, 0xE1D6, 0xE7B5, 0xF7C1, 0x2000 }; + dgusdisplay.WriteVariable(VP_TMC_Y1_Current_Dis, TMC_Y1_Current_buf_ch, 16, true); + + const uint16_t TMC_Z1_Current_buf_ch[] = { 0x315A, 0xE1D6, 0xE7B5, 0xF7C1, 0x2000 }; + dgusdisplay.WriteVariable(VP_TMC_Z1_Current_Dis, TMC_Z1_Current_buf_ch, 16, true); + + const uint16_t TMC_E1_Current_buf_ch[] = { 0x3145, 0xE1D6, 0xE7B5, 0xF7C1, 0x2000 }; + dgusdisplay.WriteVariable(VP_TMC_E1_Current_Dis, TMC_E1_Current_buf_ch, 16, true); + + const uint16_t Min_Ex_Temp_buf_ch[] = { 0xEED7, 0xA1D0, 0xB7BC, 0xF6B3, 0xC2CE, 0xC8B6, 0x2000 }; + dgusdisplay.WriteVariable(VP_Min_Ex_Temp_Dis, Min_Ex_Temp_buf_ch, 32, true); + + const uint16_t AutoLEVEL_INFO1_buf_ch[] = { 0xEBC7, 0xB4B0, 0xC2CF, 0xB4B0, 0xA5C5, 0x2000 }; + dgusdisplay.WriteVariable(VP_AutoLEVEL_INFO1, AutoLEVEL_INFO1_buf_ch, 32, true); + + const uint16_t EX_TEMP_INFO2_buf_ch[] = { 0xEBC7, 0xD4C9, 0xC8B5, 0x2000 }; + dgusdisplay.WriteVariable(VP_EX_TEMP_INFO2_Dis, EX_TEMP_INFO2_buf_ch, 32, true); + + const uint16_t EX_TEMP_INFO3_buf_ch[] = { 0xA1C8, 0xFBCF, 0xD3BC, 0xC8C8, 0x2000 }; + dgusdisplay.WriteVariable(VP_EX_TEMP_INFO3_Dis, EX_TEMP_INFO3_buf_ch, 32, true); + + const uint16_t PrintConfrim_Info_buf_ch[] = { 0xC7CA, 0xF1B7, 0xAABF, 0xBCCA, 0xF2B4, 0xA1D3, 0x2000 }; + dgusdisplay.WriteVariable(VP_PrintConfrim_Info_Dis, PrintConfrim_Info_buf_ch, 32, true); + + const uint16_t StopPrintConfrim_Info_buf_ch[] = { 0xC7CA, 0xF1B7, 0xA3CD, 0xB9D6, 0xF2B4, 0xA1D3, 0x2000 }; + dgusdisplay.WriteVariable(VP_StopPrintConfrim_Info_Dis, StopPrintConfrim_Info_buf_ch, 32, true); + + const uint16_t Printting_buf_ch[] = { 0xF2B4, 0xA1D3, 0xD0D6, 0x2000 }; + dgusdisplay.WriteVariable(VP_Printting_Dis, Printting_buf_ch, 32, true); + + const uint16_t LCD_BLK_buf_ch[] = { 0xB3B1, 0xE2B9, 0xE8C9, 0xC3D6, 0x2000 }; + dgusdisplay.WriteVariable(VP_LCD_BLK_Dis, LCD_BLK_buf_ch, 32, true); + } +} + +#endif // DGUS_LCD_UI_MKS diff --git a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.h b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.h new file mode 100644 index 0000000000..4d6e985d84 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.h @@ -0,0 +1,307 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 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 + +#include "../DGUSDisplay.h" +#include "../DGUSVPVariable.h" +#include "../DGUSDisplayDef.h" + +#include "../../../../../inc/MarlinConfig.h" + +enum DGUSLCD_Screens : uint8_t; + +class DGUSScreenHandler { +public: + DGUSScreenHandler() = default; + + static bool loop(); + + // Send all 4 strings that are displayed on the infoscreen, confirmation screen and kill screen + // The bools specifing whether the strings are in RAM or FLASH. + static void sendinfoscreen(const char* line1, const char* line2, const char* line3, const char* line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash); + + static void HandleUserConfirmationPopUp(uint16_t ConfirmVP, const char* line1, const char* line2, const char* line3, const char* line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash); + + static void sendinfoscreen_ch_mks(const uint16_t* line1, const uint16_t* line2, const uint16_t* line3, const uint16_t* line4); + static void sendinfoscreen_en_mks(const char* line1, const char* line2, const char* line3, const char* line4) ; + static void sendinfoscreen_mks(const void* line1, const void* line2, const void* line3, const void* line4,uint16_t language); + + // "M117" Message -- msg is a RAM ptr. + static void setstatusmessage(const char* msg); + // The same for messages from Flash + static void setstatusmessagePGM(PGM_P const msg); + // Callback for VP "Display wants to change screen on idle printer" + static void ScreenChangeHookIfIdle(DGUS_VP_Variable &var, void *val_ptr); + // Callback for VP "Screen has been changed" + static void ScreenChangeHook(DGUS_VP_Variable &var, void *val_ptr); + + static void ScreenBackChange(DGUS_VP_Variable &var, void *val_ptr); + + // Callback for VP "All Heaters Off" + static void HandleAllHeatersOff(DGUS_VP_Variable &var, void *val_ptr); + // Hook for "Change this temperature" + static void HandleTemperatureChanged(DGUS_VP_Variable &var, void *val_ptr); + // Hook for "Change Flowrate" + static void HandleFlowRateChanged(DGUS_VP_Variable &var, void *val_ptr); + #if ENABLED(DGUS_UI_MOVE_DIS_OPTION) + // Hook for manual move option + static void HandleManualMoveOption(DGUS_VP_Variable &var, void *val_ptr); + #endif + + static void EEPROM_CTRL(DGUS_VP_Variable &var, void *val_ptr); + static void LanguageChange_MKS(DGUS_VP_Variable &var, void *val_ptr); + static void GetOffsetValue(DGUS_VP_Variable &var, void *val_ptr); + static void Level_Ctrl_MKS(DGUS_VP_Variable &var, void *val_ptr); + static void MeshLevel(DGUS_VP_Variable &var, void *val_ptr); + static void MeshLevelDistanceConfig(DGUS_VP_Variable &var, void *val_ptr); + static void ManualAssistLeveling(DGUS_VP_Variable &var, void *val_ptr); + static void ZoffsetConfirm(DGUS_VP_Variable &var, void *val_ptr); + static void Z_offset_select(DGUS_VP_Variable &var, void *val_ptr); + static void GetManualMovestep(DGUS_VP_Variable &var, void *val_ptr); + static void GetZoffsetDistance(DGUS_VP_Variable &var, void *val_ptr); + static void GetMinExtrudeTemp(DGUS_VP_Variable &var, void *val_ptr); + static void GetParkPos_MKS(DGUS_VP_Variable &var, void *val_ptr); + static void HandleGetExMinTemp_MKS(DGUS_VP_Variable &var, void *val_ptr); + static void DGUS_LanguageDisplay(uint8_t var); + static void TMC_ChangeConfig(DGUS_VP_Variable &var, void *val_ptr); + static void GetTurnOffCtrl(DGUS_VP_Variable &var, void *val_ptr); + static void LanguagePInit(void); + static void DGUS_Runout_Idle(void); + static void DGUS_RunoutInit(void); + static void DGUS_ExtrudeLoadInit(void); + static void LCD_BLK_Adjust(DGUS_VP_Variable &var, void *val_ptr); + + // Hook for manual move. + static void HandleManualMove(DGUS_VP_Variable &var, void *val_ptr); + // Hook for manual extrude. + static void HandleManualExtrude(DGUS_VP_Variable &var, void *val_ptr); + // Hook for motor lock and unlook + static void HandleMotorLockUnlock(DGUS_VP_Variable &var, void *val_ptr); + #if ENABLED(POWER_LOSS_RECOVERY) + // Hook for power loss recovery. + static void HandlePowerLossRecovery(DGUS_VP_Variable &var, void *val_ptr); + #endif + // Hook for settings + static void HandleSettings(DGUS_VP_Variable &var, void *val_ptr); + static void HandleStepPerMMChanged(DGUS_VP_Variable &var, void *val_ptr); + static void HandleStepPerMMExtruderChanged(DGUS_VP_Variable &var, void *val_ptr); + + static void HandleStepPerMMChanged_MKS(DGUS_VP_Variable &var, void *val_ptr); + static void HandleStepPerMMExtruderChanged_MKS(DGUS_VP_Variable &var, void *val_ptr); + static void HandleMaxSpeedChange_MKS(DGUS_VP_Variable &var, void *val_ptr); + static void HandleExtruderMaxSpeedChange_MKS(DGUS_VP_Variable &var, void *val_ptr); + static void HandleAccChange_MKS(DGUS_VP_Variable &var, void *val_ptr); + static void HandleMaxAccChange_MKS(DGUS_VP_Variable &var, void *val_ptr); + static void HandleExtruderAccChange_MKS(DGUS_VP_Variable &var, void *val_ptr); + static void HandleChangeLevelPoint_MKS(DGUS_VP_Variable &var, void *val_ptr); + static void HandleTravelAccChange_MKS(DGUS_VP_Variable &var, void *val_ptr); + static void HandleFeedRateMinChange_MKS(DGUS_VP_Variable &var, void *val_ptr); + static void HandleMin_T_F_MKS(DGUS_VP_Variable &var, void *val_ptr); + + #if HAS_PID_HEATING + // Hook for "Change this temperature PID para" + static void HandleTemperaturePIDChanged(DGUS_VP_Variable &var, void *val_ptr); + // Hook for PID autotune + static void HandlePIDAutotune(DGUS_VP_Variable &var, void *val_ptr); + #endif + #if HAS_BED_PROBE + // Hook for "Change probe offset z" + static void HandleProbeOffsetZChanged(DGUS_VP_Variable &var, void *val_ptr); + #endif + #if ENABLED(BABYSTEPPING) + // Hook for live z adjust action + static void HandleLiveAdjustZ(DGUS_VP_Variable &var, void *val_ptr); + #endif + #if HAS_FAN + // Hook for fan control + static void HandleFanControl(DGUS_VP_Variable &var, void *val_ptr); + #endif + // Hook for heater control + static void HandleHeaterControl(DGUS_VP_Variable &var, void *val_ptr); + #if ENABLED(DGUS_PREHEAT_UI) + // Hook for preheat + static void HandlePreheat(DGUS_VP_Variable &var, void *val_ptr); + #endif + #if ENABLED(DGUS_FILAMENT_LOADUNLOAD) + // Hook for filament load and unload filament option + static void HandleFilamentOption(DGUS_VP_Variable &var, void *val_ptr); + // Hook for filament load and unload + static void HandleFilamentLoadUnload(DGUS_VP_Variable &var); + + static void MKS_FilamentLoad(DGUS_VP_Variable &var, void *val_ptr); + static void MKS_FilamentUnLoad(DGUS_VP_Variable &var, void *val_ptr); + static void MKS_LOAD_UNLOAD_IDLE(); + static void MKS_LOAD_Cancle(DGUS_VP_Variable &var, void *val_ptr); + static void GetManualFilament(DGUS_VP_Variable &var, void *val_ptr); + static void GetManualFilamentSpeed(DGUS_VP_Variable &var, void *val_ptr); + #endif + + #if ENABLED(SDSUPPORT) + // Callback for VP "Display wants to change screen when there is a SD card" + static void ScreenChangeHookIfSD(DGUS_VP_Variable &var, void *val_ptr); + // Scroll buttons on the file listing screen. + static void DGUSLCD_SD_ScrollFilelist(DGUS_VP_Variable &var, void *val_ptr); + // File touched. + static void DGUSLCD_SD_FileSelected(DGUS_VP_Variable &var, void *val_ptr); + // start print after confirmation received. + static void DGUSLCD_SD_StartPrint(DGUS_VP_Variable &var, void *val_ptr); + // User hit the pause, resume or abort button. + static void DGUSLCD_SD_ResumePauseAbort(DGUS_VP_Variable &var, void *val_ptr); + // User confirmed the abort action + static void DGUSLCD_SD_ReallyAbort(DGUS_VP_Variable &var, void *val_ptr); + // User hit the tune button + static void DGUSLCD_SD_PrintTune(DGUS_VP_Variable &var, void *val_ptr); + // Send a single filename to the display. + static void DGUSLCD_SD_SendFilename(DGUS_VP_Variable &var); + // Marlin informed us that a new SD has been inserted. + static void SDCardInserted(); + // Marlin informed us that the SD Card has been removed(). + static void SDCardRemoved(); + // Marlin informed us about a bad SD Card. + static void SDCardError(); + // Marlin informed us about SD print completion. + static void SDPrintingFinished(); + #endif + + // OK Button the Confirm screen. + static void ScreenConfirmedOK(DGUS_VP_Variable &var, void *val_ptr); + + // Update data after went to new screen (by display or by GotoScreen) + // remember: store the last-displayed screen, so it can get returned to. + // (e.g for pop up messages) + static void UpdateNewScreen(DGUSLCD_Screens newscreen, bool popup=false); + + // Recall the remembered screen. + static void PopToOldScreen(); + + // Make the display show the screen and update all VPs in it. + static void GotoScreen(DGUSLCD_Screens screen, bool ispopup = false); + + static void UpdateScreenVPData(); + + // Helpers to convert and transfer data to the display. + static void DGUSLCD_SendWordValueToDisplay(DGUS_VP_Variable &var); + static void DGUSLCD_SendStringToDisplay(DGUS_VP_Variable &var); + static void DGUSLCD_SendStringToDisplayPGM(DGUS_VP_Variable &var); + static void DGUSLCD_SendTemperaturePID(DGUS_VP_Variable &var); + static void DGUSLCD_SendPercentageToDisplay(DGUS_VP_Variable &var); + static void DGUSLCD_SendPrintProgressToDisplay(DGUS_VP_Variable &var); + static void DGUSLCD_SendPrintTimeToDisplay(DGUS_VP_Variable &var); + + static void DGUSLCD_SendPrintTimeToDisplay_MKS(DGUS_VP_Variable &var); + static void DGUSLCD_SendBabyStepToDisplay_MKS(DGUS_VP_Variable &var); + static void DGUSLCD_SendFanToDisplay(DGUS_VP_Variable &var); + static void DGUSLCD_SendGbkToDisplay(DGUS_VP_Variable &var); + static void DGUSLCD_SendStringToDisplay_Language_MKS(DGUS_VP_Variable &var); + static void DGUSLCD_SendTMCStepValue(DGUS_VP_Variable &var); + + #if ENABLED(PRINTCOUNTER) + static void DGUSLCD_SendPrintAccTimeToDisplay(DGUS_VP_Variable &var); + static void DGUSLCD_SendPrintsTotalToDisplay(DGUS_VP_Variable &var); + #endif + #if HAS_FAN + static void DGUSLCD_SendFanStatusToDisplay(DGUS_VP_Variable &var); + #endif + static void DGUSLCD_SendHeaterStatusToDisplay(DGUS_VP_Variable &var); + #if ENABLED(DGUS_UI_WAITING) + static void DGUSLCD_SendWaitingStatusToDisplay(DGUS_VP_Variable &var); + #endif + + // Send a value from 0..100 to a variable with a range from 0..255 + static void DGUSLCD_PercentageToUint8(DGUS_VP_Variable &var, void *val_ptr); + + static void DGUSLCD_SetUint8(DGUS_VP_Variable &var, void *val_ptr); + + template + static void DGUSLCD_SetValueDirectly(DGUS_VP_Variable &var, void *val_ptr) { + if (!var.memadr) return; + union { unsigned char tmp[sizeof(T)]; T t; } x; + unsigned char *ptr = (unsigned char*)val_ptr; + LOOP_L_N(i, sizeof(T)) x.tmp[i] = ptr[sizeof(T) - i - 1]; + *(T*)var.memadr = x.t; + } + + // Send a float value to the display. + // Display will get a 4-byte integer scaled to the number of digits: + // Tell the display the number of digits and it cheats by displaying a dot between... + template + static void DGUSLCD_SendFloatAsLongValueToDisplay(DGUS_VP_Variable &var) { + if (var.memadr) { + float f = *(float *)var.memadr; + f *= cpow(10, decimals); + dgusdisplay.WriteVariable(var.VP, (long)f); + } + } + + // Send a float value to the display. + // Display will get a 2-byte integer scaled to the number of digits: + // Tell the display the number of digits and it cheats by displaying a dot between... + template + static void DGUSLCD_SendFloatAsIntValueToDisplay(DGUS_VP_Variable &var) { + if (var.memadr) { + float f = *(float *)var.memadr; + DEBUG_ECHOLNPAIR_F(" >> ", f, 6); + f *= cpow(10, decimals); + dgusdisplay.WriteVariable(var.VP, (int16_t)f); + } + } + + // Force an update of all VP on the current screen. + static inline void ForceCompleteUpdate() { update_ptr = 0; ScreenComplete = false; } + // Has all VPs sent to the screen + static inline bool IsScreenComplete() { return ScreenComplete; } + + static inline DGUSLCD_Screens getCurrentScreen() { return current_screen; } + + static inline void SetupConfirmAction( void (*f)()) { confirm_action_cb = f; } + +private: + static DGUSLCD_Screens current_screen; //< currently on screen + static constexpr uint8_t NUM_PAST_SCREENS = 4; + static DGUSLCD_Screens past_screens[NUM_PAST_SCREENS]; //< LIFO with past screens for the "back" button. + + static uint8_t update_ptr; //< Last sent entry in the VPList for the actual screen. + static uint16_t skipVP; //< When updating the screen data, skip this one, because the user is interacting with it. + static bool ScreenComplete; //< All VPs sent to screen? + + static uint16_t ConfirmVP; //< context for confirm screen (VP that will be emulated-sent on "OK"). + + #if ENABLED(SDSUPPORT) + static int16_t top_file; //< file on top of file chooser + static int16_t file_to_print; //< touched file to be confirmed + #endif + + static void (*confirm_action_cb)(); +}; + +#define MKS_Language_Choose 0x00 +#define MKS_Language_NoChoose 0x01 + +#define MKS_SimpleChinese 0 +#define MKS_English 1 +extern uint8_t DGUSLanguageSwitch; +extern bool DGUSAutoTurnOff; + +#if ENABLED(POWER_LOSS_RECOVERY) + #define PLR_SCREEN_RECOVER MKSLCD_SCREEN_PRINT + #define PLR_SCREEN_CANCEL MKSLCD_SCREEN_HOME +#endif diff --git a/Marlin/src/lcd/extui/lib/dgus/origin/DGUSDisplayDef.cpp b/Marlin/src/lcd/extui/lib/dgus/origin/DGUSDisplayDef.cpp index 28e66e5d7c..8d89de3e33 100644 --- a/Marlin/src/lcd/extui/lib/dgus/origin/DGUSDisplayDef.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/origin/DGUSDisplayDef.cpp @@ -20,7 +20,9 @@ * */ -/* DGUS implementation written by coldtobi in 2019 for Marlin */ +/** + * lcd/extui/lib/dgus/origin/DGUSDisplayDef.cpp + */ #include "../../../../../inc/MarlinConfigPre.h" @@ -87,7 +89,7 @@ const uint16_t VPList_Status[] PROGMEM = { }; const uint16_t VPList_Status2[] PROGMEM = { - /* VP_M117, for completeness, but it cannot be auto-uploaded */ + // VP_M117, for completeness, but it cannot be auto-uploaded #if HOTENDS >= 1 VP_Flowrate_E0, #endif diff --git a/Marlin/src/lcd/extui/lib/dgus/origin/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/lib/dgus/origin/DGUSScreenHandler.cpp new file mode 100644 index 0000000000..f1d91371c2 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/dgus/origin/DGUSScreenHandler.cpp @@ -0,0 +1,418 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 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 . + * + */ + +#include "../../../../../inc/MarlinConfigPre.h" + +#if ENABLED(DGUS_LCD_UI_ORIGIN) + +#include "../DGUSScreenHandler.h" + +#include "../../../../../MarlinCore.h" +#include "../../../../../gcode/queue.h" +#include "../../../../../libs/duration_t.h" +#include "../../../../../module/settings.h" +#include "../../../../../module/temperature.h" +#include "../../../../../module/motion.h" +#include "../../../../../module/planner.h" +#include "../../../../../module/printcounter.h" +#include "../../../../../sd/cardreader.h" + +#if ENABLED(POWER_LOSS_RECOVERY) + #include "../../../../feature/powerloss.h" +#endif + +#if ENABLED(SDSUPPORT) + + void DGUSScreenHandler::DGUSLCD_SD_FileSelected(DGUS_VP_Variable &var, void *val_ptr) { + uint16_t touched_nr = (int16_t)swap16(*(uint16_t*)val_ptr) + top_file; + if (touched_nr > filelist.count()) return; + if (!filelist.seek(touched_nr)) return; + + if (filelist.isDir()) { + filelist.changeDir(filelist.filename()); + top_file = 0; + ForceCompleteUpdate(); + return; + } + + #if ENABLED(DGUS_PRINT_FILENAME) + // Send print filename + dgusdisplay.WriteVariable(VP_SD_Print_Filename, filelist.filename(), VP_SD_FileName_LEN, true); + #endif + + // Setup Confirmation screen + file_to_print = touched_nr; + + HandleUserConfirmationPopUp(VP_SD_FileSelectConfirm, nullptr, PSTR("Print file"), filelist.filename(), PSTR("from SD Card?"), true, true, false, true); + } + + void DGUSScreenHandler::DGUSLCD_SD_StartPrint(DGUS_VP_Variable &var, void *val_ptr) { + if (!filelist.seek(file_to_print)) return; + ExtUI::printFile(filelist.shortFilename()); + GotoScreen(DGUSLCD_SCREEN_STATUS); + } + + void DGUSScreenHandler::DGUSLCD_SD_ResumePauseAbort(DGUS_VP_Variable &var, void *val_ptr) { + + if (!ExtUI::isPrintingFromMedia()) return; // avoid race condition when user stays in this menu and printer finishes. + switch (swap16(*(uint16_t*)val_ptr)) { + case 0: { // Resume + if (ExtUI::isPrintingFromMediaPaused()) { + ExtUI::resumePrint(); + } + } break; + + case 1: // Pause + + GotoScreen(MKSLCD_SCREEN_PAUSE); + if (!ExtUI::isPrintingFromMediaPaused()) { + ExtUI::pausePrint(); + //ExtUI::mks_pausePrint(); + } + break; + case 2: // Abort + HandleUserConfirmationPopUp(VP_SD_AbortPrintConfirmed, nullptr, PSTR("Abort printing"), filelist.filename(), PSTR("?"), true, true, false, true); + break; + } + } + + void DGUSScreenHandler::DGUSLCD_SD_SendFilename(DGUS_VP_Variable& var) { + uint16_t target_line = (var.VP - VP_SD_FileName0) / VP_SD_FileName_LEN; + if (target_line > DGUS_SD_FILESPERSCREEN) return; + char tmpfilename[VP_SD_FileName_LEN + 1] = ""; + var.memadr = (void*)tmpfilename; + + if (filelist.seek(top_file + target_line)) { + snprintf_P(tmpfilename, VP_SD_FileName_LEN, PSTR("%s%c"), filelist.filename(), filelist.isDir() ? '/' : 0); // snprintf_P(tmpfilename, VP_SD_FileName_LEN, PSTR("%s"), filelist.filename()); + } + DGUSLCD_SendStringToDisplay(var); + } + + void DGUSScreenHandler::SDCardInserted() { + top_file = 0; + filelist.refresh(); + auto cs = getCurrentScreen(); + if (cs == DGUSLCD_SCREEN_MAIN || cs == DGUSLCD_SCREEN_STATUS) + GotoScreen(DGUSLCD_SCREEN_SDFILELIST); + } + + void DGUSScreenHandler::SDCardRemoved() { + if (current_screen == DGUSLCD_SCREEN_SDFILELIST + || (current_screen == DGUSLCD_SCREEN_CONFIRM && (ConfirmVP == VP_SD_AbortPrintConfirmed || ConfirmVP == VP_SD_FileSelectConfirm)) + || current_screen == DGUSLCD_SCREEN_SDPRINTMANIPULATION + ) GotoScreen(DGUSLCD_SCREEN_MAIN); + } + +#endif // SDSUPPORT + +void DGUSScreenHandler::ScreenChangeHook(DGUS_VP_Variable &var, void *val_ptr) { + uint8_t *tmp = (uint8_t*)val_ptr; + + // The keycode in target is coded as , so 0x0100A means + // from screen 1 (main) to 10 (temperature). DGUSLCD_SCREEN_POPUP is special, + // meaning "return to previous screen" + DGUSLCD_Screens target = (DGUSLCD_Screens)tmp[1]; + + DEBUG_ECHOLNPAIR("\n DEBUG target", target); + + if (target == DGUSLCD_SCREEN_POPUP) { + // Special handling for popup is to return to previous menu + if (current_screen == DGUSLCD_SCREEN_POPUP && confirm_action_cb) confirm_action_cb(); + PopToOldScreen(); + return; + } + + UpdateNewScreen(target); + + #ifdef DEBUG_DGUSLCD + if (!DGUSLCD_FindScreenVPMapList(target)) DEBUG_ECHOLNPAIR("WARNING: No screen Mapping found for ", target); + #endif +} + +void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { + DEBUG_ECHOLNPGM("HandleManualMove"); + + int16_t movevalue = swap16(*(uint16_t*)val_ptr); + #if ENABLED(DGUS_UI_MOVE_DIS_OPTION) + if (movevalue) { + const uint16_t choice = *(uint16_t*)var.memadr; + movevalue = movevalue < 0 ? -choice : choice; + } + #endif + char axiscode; + unsigned int speed = 1500; // FIXME: get default feedrate for manual moves, dont hardcode. + + switch (var.VP) { + default: return; + + case VP_MOVE_X: + axiscode = 'X'; + if (!ExtUI::canMove(ExtUI::axis_t::X)) goto cannotmove; + break; + + case VP_MOVE_Y: + axiscode = 'Y'; + if (!ExtUI::canMove(ExtUI::axis_t::Y)) goto cannotmove; + break; + + case VP_MOVE_Z: + axiscode = 'Z'; + speed = 300; // default to 5mm/s + if (!ExtUI::canMove(ExtUI::axis_t::Z)) goto cannotmove; + break; + + case VP_HOME_ALL: // only used for homing + axiscode = '\0'; + movevalue = 0; // ignore value sent from display, this VP is _ONLY_ for homing. + break; + } + + if (!movevalue) { + // homing + DEBUG_ECHOPAIR(" homing ", axiscode); + char buf[6] = "G28 X"; + buf[4] = axiscode; + //DEBUG_ECHOPAIR(" ", buf); + queue.enqueue_one_now(buf); + //DEBUG_ECHOLNPGM(" ✓"); + ForceCompleteUpdate(); + return; + } + else { + // movement + DEBUG_ECHOPAIR(" move ", axiscode); + bool old_relative_mode = relative_mode; + if (!relative_mode) { + //DEBUG_ECHOPGM(" G91"); + queue.enqueue_now_P(PSTR("G91")); + //DEBUG_ECHOPGM(" ✓ "); + } + char buf[32]; // G1 X9999.99 F12345 + unsigned int backup_speed = MMS_TO_MMM(feedrate_mm_s); + char sign[] = "\0"; + int16_t value = movevalue / 100; + if (movevalue < 0) { value = -value; sign[0] = '-'; } + int16_t fraction = ABS(movevalue) % 100; + snprintf_P(buf, 32, PSTR("G0 %c%s%d.%02d F%d"), axiscode, sign, value, fraction, speed); + //DEBUG_ECHOPAIR(" ", buf); + queue.enqueue_one_now(buf); + //DEBUG_ECHOLNPGM(" ✓ "); + if (backup_speed != speed) { + snprintf_P(buf, 32, PSTR("G0 F%d"), backup_speed); + queue.enqueue_one_now(buf); + //DEBUG_ECHOPAIR(" ", buf); + } + // while (!enqueue_and_echo_command(buf)) idle(); + //DEBUG_ECHOLNPGM(" ✓ "); + if (!old_relative_mode) { + //DEBUG_ECHOPGM("G90"); + queue.enqueue_now_P(PSTR("G90")); + //DEBUG_ECHOPGM(" ✓ "); + } + } + + ForceCompleteUpdate(); + DEBUG_ECHOLNPGM("manmv done."); + return; + + cannotmove: + DEBUG_ECHOLNPAIR(" cannot move ", axiscode); + return; +} + +#if HAS_PID_HEATING + void DGUSScreenHandler::HandleTemperaturePIDChanged(DGUS_VP_Variable &var, void *val_ptr) { + uint16_t rawvalue = swap16(*(uint16_t*)val_ptr); + DEBUG_ECHOLNPAIR("V1:", rawvalue); + float value = (float)rawvalue / 10; + DEBUG_ECHOLNPAIR("V2:", value); + float newvalue = 0; + + switch (var.VP) { + default: return; + #if HOTENDS >= 1 + case VP_E0_PID_P: newvalue = value; break; + case VP_E0_PID_I: newvalue = scalePID_i(value); break; + case VP_E0_PID_D: newvalue = scalePID_d(value); break; + #endif + #if HOTENDS >= 2 + case VP_E1_PID_P: newvalue = value; break; + case VP_E1_PID_I: newvalue = scalePID_i(value); break; + case VP_E1_PID_D: newvalue = scalePID_d(value); break; + #endif + #if HAS_HEATED_BED + case VP_BED_PID_P: newvalue = value; break; + case VP_BED_PID_I: newvalue = scalePID_i(value); break; + case VP_BED_PID_D: newvalue = scalePID_d(value); break; + #endif + } + + DEBUG_ECHOLNPAIR_F("V3:", newvalue); + *(float *)var.memadr = newvalue; + + skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel + } +#endif // HAS_PID_HEATING + +#if ENABLED(BABYSTEPPING) + void DGUSScreenHandler::HandleLiveAdjustZ(DGUS_VP_Variable &var, void *val_ptr) { + DEBUG_ECHOLNPGM("HandleLiveAdjustZ"); + int16_t flag = swap16(*(uint16_t*)val_ptr), + steps = flag ? -20 : 20; + ExtUI::smartAdjustAxis_steps(steps, ExtUI::axis_t::Z, true); + ForceCompleteUpdate(); + } +#endif + +#if ENABLED(DGUS_FILAMENT_LOADUNLOAD) + + void DGUSScreenHandler::HandleFilamentOption(DGUS_VP_Variable &var, void *val_ptr) { + DEBUG_ECHOLNPGM("HandleFilamentOption"); + + uint8_t e_temp = 0; + filament_data.heated = false; + uint16_t preheat_option = swap16(*(uint16_t*)val_ptr); + if (preheat_option <= 8) { // Load filament type + filament_data.action = 1; + } + else if (preheat_option >= 10) { // Unload filament type + preheat_option -= 10; + filament_data.action = 2; + filament_data.purge_length = DGUS_FILAMENT_PURGE_LENGTH; + } + else { // Cancel filament operation + filament_data.action = 0; + } + + switch (preheat_option) { + case 0: // Load PLA + #ifdef PREHEAT_1_TEMP_HOTEND + e_temp = PREHEAT_1_TEMP_HOTEND; + #endif + break; + case 1: // Load ABS + TERN_(PREHEAT_2_TEMP_HOTEND, e_temp = PREHEAT_2_TEMP_HOTEND); + break; + case 2: // Load PET + #ifdef PREHEAT_3_TEMP_HOTEND + e_temp = PREHEAT_3_TEMP_HOTEND; + #endif + break; + case 3: // Load FLEX + #ifdef PREHEAT_4_TEMP_HOTEND + e_temp = PREHEAT_4_TEMP_HOTEND; + #endif + break; + case 9: // Cool down + default: + e_temp = 0; + break; + } + + if (filament_data.action == 0) { // Go back to utility screen + #if HOTENDS >= 1 + thermalManager.setTargetHotend(e_temp, ExtUI::extruder_t::E0); + #endif + #if HOTENDS >= 2 + thermalManager.setTargetHotend(e_temp, ExtUI::extruder_t::E1); + #endif + GotoScreen(DGUSLCD_SCREEN_UTILITY); + } + else { // Go to the preheat screen to show the heating progress + switch (var.VP) { + default: return; + #if HOTENDS >= 1 + case VP_E0_FILAMENT_LOAD_UNLOAD: + filament_data.extruder = ExtUI::extruder_t::E0; + thermalManager.setTargetHotend(e_temp, filament_data.extruder); + break; + #endif + #if HOTENDS >= 2 + case VP_E1_FILAMENT_LOAD_UNLOAD: + filament_data.extruder = ExtUI::extruder_t::E1; + thermalManager.setTargetHotend(e_temp, filament_data.extruder); + break; + #endif + } + GotoScreen(DGUSLCD_SCREEN_FILAMENT_HEATING); + } + } + + void DGUSScreenHandler::HandleFilamentLoadUnload(DGUS_VP_Variable &var) { + DEBUG_ECHOLNPGM("HandleFilamentLoadUnload"); + if (filament_data.action <= 0) return; + + // If we close to the target temperature, we can start load or unload the filament + if (thermalManager.hotEnoughToExtrude(filament_data.extruder) && \ + thermalManager.targetHotEnoughToExtrude(filament_data.extruder)) { + float movevalue = DGUS_FILAMENT_LOAD_LENGTH_PER_TIME; + + if (filament_data.action == 1) { // load filament + if (!filament_data.heated) { + //GotoScreen(DGUSLCD_SCREEN_FILAMENT_LOADING); + filament_data.heated = true; + } + movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder) + movevalue; + } + else { // unload filament + if (!filament_data.heated) { + GotoScreen(DGUSLCD_SCREEN_FILAMENT_UNLOADING); + filament_data.heated = true; + } + // Before unloading extrude to prevent jamming + if (filament_data.purge_length >= 0) { + movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder) + movevalue; + filament_data.purge_length -= movevalue; + } + else { + movevalue = ExtUI::getAxisPosition_mm(filament_data.extruder) - movevalue; + } + } + ExtUI::setAxisPosition_mm(movevalue, filament_data.extruder); + } + } +#endif // DGUS_FILAMENT_LOADUNLOAD + +bool DGUSScreenHandler::loop() { + dgusdisplay.loop(); + + const millis_t ms = millis(); + static millis_t next_event_ms = 0; + + if (!IsScreenComplete() || ELAPSED(ms, next_event_ms)) { + next_event_ms = ms + DGUS_UPDATE_INTERVAL_MS; + UpdateScreenVPData(); + } + + #if ENABLED(SHOW_BOOTSCREEN) + static bool booted = false; + + if (!booted && TERN0(POWER_LOSS_RECOVERY, recovery.valid())) + booted = true; + + if (!booted && ELAPSED(ms, TERN(USE_MKS_GREEN_UI, 1000, BOOTSCREEN_TIMEOUT))) + booted = true; + #endif + return IsScreenComplete(); +} + +#endif // DGUS_LCD_UI_ORIGIN diff --git a/Marlin/src/lcd/extui/lib/dgus/origin/DGUSScreenHandler.h b/Marlin/src/lcd/extui/lib/dgus/origin/DGUSScreenHandler.h new file mode 100644 index 0000000000..28ab952e53 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/dgus/origin/DGUSScreenHandler.h @@ -0,0 +1,240 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 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 + +#include "../DGUSDisplay.h" +#include "../DGUSVPVariable.h" +#include "../DGUSDisplayDef.h" + +#include "../../../../../inc/MarlinConfig.h" + +enum DGUSLCD_Screens : uint8_t; + +class DGUSScreenHandler { +public: + DGUSScreenHandler() = default; + + static bool loop(); + + // Send all 4 strings that are displayed on the infoscreen, confirmation screen and kill screen + // The bools specifing whether the strings are in RAM or FLASH. + static void sendinfoscreen(const char* line1, const char* line2, const char* line3, const char* line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash); + + static void HandleUserConfirmationPopUp(uint16_t ConfirmVP, const char* line1, const char* line2, const char* line3, const char* line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash); + + // "M117" Message -- msg is a RAM ptr. + static void setstatusmessage(const char* msg); + // The same for messages from Flash + static void setstatusmessagePGM(PGM_P const msg); + // Callback for VP "Display wants to change screen on idle printer" + static void ScreenChangeHookIfIdle(DGUS_VP_Variable &var, void *val_ptr); + // Callback for VP "Screen has been changed" + static void ScreenChangeHook(DGUS_VP_Variable &var, void *val_ptr); + + // Callback for VP "All Heaters Off" + static void HandleAllHeatersOff(DGUS_VP_Variable &var, void *val_ptr); + // Hook for "Change this temperature" + static void HandleTemperatureChanged(DGUS_VP_Variable &var, void *val_ptr); + // Hook for "Change Flowrate" + static void HandleFlowRateChanged(DGUS_VP_Variable &var, void *val_ptr); + #if ENABLED(DGUS_UI_MOVE_DIS_OPTION) + // Hook for manual move option + static void HandleManualMoveOption(DGUS_VP_Variable &var, void *val_ptr); + #endif + + // Hook for manual move. + static void HandleManualMove(DGUS_VP_Variable &var, void *val_ptr); + // Hook for manual extrude. + static void HandleManualExtrude(DGUS_VP_Variable &var, void *val_ptr); + // Hook for motor lock and unlook + static void HandleMotorLockUnlock(DGUS_VP_Variable &var, void *val_ptr); + #if ENABLED(POWER_LOSS_RECOVERY) + // Hook for power loss recovery. + static void HandlePowerLossRecovery(DGUS_VP_Variable &var, void *val_ptr); + #endif + // Hook for settings + static void HandleSettings(DGUS_VP_Variable &var, void *val_ptr); + static void HandleStepPerMMChanged(DGUS_VP_Variable &var, void *val_ptr); + static void HandleStepPerMMExtruderChanged(DGUS_VP_Variable &var, void *val_ptr); + + #if HAS_PID_HEATING + // Hook for "Change this temperature PID para" + static void HandleTemperaturePIDChanged(DGUS_VP_Variable &var, void *val_ptr); + // Hook for PID autotune + static void HandlePIDAutotune(DGUS_VP_Variable &var, void *val_ptr); + #endif + #if HAS_BED_PROBE + // Hook for "Change probe offset z" + static void HandleProbeOffsetZChanged(DGUS_VP_Variable &var, void *val_ptr); + #endif + #if ENABLED(BABYSTEPPING) + // Hook for live z adjust action + static void HandleLiveAdjustZ(DGUS_VP_Variable &var, void *val_ptr); + #endif + #if HAS_FAN + // Hook for fan control + static void HandleFanControl(DGUS_VP_Variable &var, void *val_ptr); + #endif + // Hook for heater control + static void HandleHeaterControl(DGUS_VP_Variable &var, void *val_ptr); + #if ENABLED(DGUS_PREHEAT_UI) + // Hook for preheat + static void HandlePreheat(DGUS_VP_Variable &var, void *val_ptr); + #endif + #if ENABLED(DGUS_FILAMENT_LOADUNLOAD) + // Hook for filament load and unload filament option + static void HandleFilamentOption(DGUS_VP_Variable &var, void *val_ptr); + // Hook for filament load and unload + static void HandleFilamentLoadUnload(DGUS_VP_Variable &var); + #endif + + #if ENABLED(SDSUPPORT) + // Callback for VP "Display wants to change screen when there is a SD card" + static void ScreenChangeHookIfSD(DGUS_VP_Variable &var, void *val_ptr); + // Scroll buttons on the file listing screen. + static void DGUSLCD_SD_ScrollFilelist(DGUS_VP_Variable &var, void *val_ptr); + // File touched. + static void DGUSLCD_SD_FileSelected(DGUS_VP_Variable &var, void *val_ptr); + // start print after confirmation received. + static void DGUSLCD_SD_StartPrint(DGUS_VP_Variable &var, void *val_ptr); + // User hit the pause, resume or abort button. + static void DGUSLCD_SD_ResumePauseAbort(DGUS_VP_Variable &var, void *val_ptr); + // User confirmed the abort action + static void DGUSLCD_SD_ReallyAbort(DGUS_VP_Variable &var, void *val_ptr); + // User hit the tune button + static void DGUSLCD_SD_PrintTune(DGUS_VP_Variable &var, void *val_ptr); + // Send a single filename to the display. + static void DGUSLCD_SD_SendFilename(DGUS_VP_Variable &var); + // Marlin informed us that a new SD has been inserted. + static void SDCardInserted(); + // Marlin informed us that the SD Card has been removed(). + static void SDCardRemoved(); + // Marlin informed us about a bad SD Card. + static void SDCardError(); + #endif + + // OK Button the Confirm screen. + static void ScreenConfirmedOK(DGUS_VP_Variable &var, void *val_ptr); + + // Update data after went to new screen (by display or by GotoScreen) + // remember: store the last-displayed screen, so it can get returned to. + // (e.g for pop up messages) + static void UpdateNewScreen(DGUSLCD_Screens newscreen, bool popup=false); + + // Recall the remembered screen. + static void PopToOldScreen(); + + // Make the display show the screen and update all VPs in it. + static void GotoScreen(DGUSLCD_Screens screen, bool ispopup = false); + + static void UpdateScreenVPData(); + + // Helpers to convert and transfer data to the display. + static void DGUSLCD_SendWordValueToDisplay(DGUS_VP_Variable &var); + static void DGUSLCD_SendStringToDisplay(DGUS_VP_Variable &var); + static void DGUSLCD_SendStringToDisplayPGM(DGUS_VP_Variable &var); + static void DGUSLCD_SendTemperaturePID(DGUS_VP_Variable &var); + static void DGUSLCD_SendPercentageToDisplay(DGUS_VP_Variable &var); + static void DGUSLCD_SendPrintProgressToDisplay(DGUS_VP_Variable &var); + static void DGUSLCD_SendPrintTimeToDisplay(DGUS_VP_Variable &var); + + #if ENABLED(PRINTCOUNTER) + static void DGUSLCD_SendPrintAccTimeToDisplay(DGUS_VP_Variable &var); + static void DGUSLCD_SendPrintsTotalToDisplay(DGUS_VP_Variable &var); + #endif + #if HAS_FAN + static void DGUSLCD_SendFanStatusToDisplay(DGUS_VP_Variable &var); + #endif + static void DGUSLCD_SendHeaterStatusToDisplay(DGUS_VP_Variable &var); + #if ENABLED(DGUS_UI_WAITING) + static void DGUSLCD_SendWaitingStatusToDisplay(DGUS_VP_Variable &var); + #endif + + // Send a value from 0..100 to a variable with a range from 0..255 + static void DGUSLCD_PercentageToUint8(DGUS_VP_Variable &var, void *val_ptr); + + template + static void DGUSLCD_SetValueDirectly(DGUS_VP_Variable &var, void *val_ptr) { + if (!var.memadr) return; + union { unsigned char tmp[sizeof(T)]; T t; } x; + unsigned char *ptr = (unsigned char*)val_ptr; + LOOP_L_N(i, sizeof(T)) x.tmp[i] = ptr[sizeof(T) - i - 1]; + *(T*)var.memadr = x.t; + } + + // Send a float value to the display. + // Display will get a 4-byte integer scaled to the number of digits: + // Tell the display the number of digits and it cheats by displaying a dot between... + template + static void DGUSLCD_SendFloatAsLongValueToDisplay(DGUS_VP_Variable &var) { + if (var.memadr) { + float f = *(float *)var.memadr; + f *= cpow(10, decimals); + dgusdisplay.WriteVariable(var.VP, (long)f); + } + } + + // Send a float value to the display. + // Display will get a 2-byte integer scaled to the number of digits: + // Tell the display the number of digits and it cheats by displaying a dot between... + template + static void DGUSLCD_SendFloatAsIntValueToDisplay(DGUS_VP_Variable &var) { + if (var.memadr) { + float f = *(float *)var.memadr; + DEBUG_ECHOLNPAIR_F(" >> ", f, 6); + f *= cpow(10, decimals); + dgusdisplay.WriteVariable(var.VP, (int16_t)f); + } + } + + // Force an update of all VP on the current screen. + static inline void ForceCompleteUpdate() { update_ptr = 0; ScreenComplete = false; } + // Has all VPs sent to the screen + static inline bool IsScreenComplete() { return ScreenComplete; } + + static inline DGUSLCD_Screens getCurrentScreen() { return current_screen; } + + static inline void SetupConfirmAction( void (*f)()) { confirm_action_cb = f; } + +private: + static DGUSLCD_Screens current_screen; //< currently on screen + static constexpr uint8_t NUM_PAST_SCREENS = 4; + static DGUSLCD_Screens past_screens[NUM_PAST_SCREENS]; //< LIFO with past screens for the "back" button. + + static uint8_t update_ptr; //< Last sent entry in the VPList for the actual screen. + static uint16_t skipVP; //< When updating the screen data, skip this one, because the user is interacting with it. + static bool ScreenComplete; //< All VPs sent to screen? + + static uint16_t ConfirmVP; //< context for confirm screen (VP that will be emulated-sent on "OK"). + + #if ENABLED(SDSUPPORT) + static int16_t top_file; //< file on top of file chooser + static int16_t file_to_print; //< touched file to be confirmed + #endif + + static void (*confirm_action_cb)(); +}; + +#if ENABLED(POWER_LOSS_RECOVERY) + #define PLR_SCREEN_RECOVER DGUSLCD_SCREEN_SDPRINTMANIPULATION + #define PLR_SCREEN_CANCEL DGUSLCD_SCREEN_STATUS +#endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp index dbeb3796e0..039591b03e 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp @@ -29,6 +29,8 @@ #include "../../../../gcode/queue.h" #include "../../../../inc/MarlinConfig.h" +extern const char G28_STR[]; + extern lv_group_t *g; static lv_obj_t *scr; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp index 2dec548af0..34c7161300 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.cpp @@ -38,8 +38,6 @@ static lv_task_t *updatePosTask; static char cur_label = 'Z'; static float cur_pos = 0; -void disp_cur_pos(); - enum { ID_M_X_P = 1, ID_M_X_N, @@ -51,6 +49,12 @@ enum { ID_M_RETURN }; +void disp_cur_pos() { + char str_1[16]; + sprintf_P(public_buf_l, PSTR("%c:%s mm"), cur_label, dtostrf(cur_pos, 1, 1, str_1)); + if (labelP) lv_label_set_text(labelP, public_buf_l); +} + static void event_handler(lv_obj_t *obj, lv_event_t event) { char str_1[16]; if (event != LV_EVENT_RELEASED) return; @@ -125,12 +129,6 @@ void lv_draw_move_motor() { disp_cur_pos(); } -void disp_cur_pos() { - char str_1[16]; - sprintf_P(public_buf_l, PSTR("%c:%s mm"), cur_label, dtostrf(cur_pos, 1, 1, str_1)); - if (labelP) lv_label_set_text(labelP, public_buf_l); -} - void disp_move_dist() { if ((int)(10 * uiCfg.move_dist) == 1) lv_imgbtn_set_src_both(buttonV, "F:/bmp_step_move0_1.bin"); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp index 97200efb08..047a6cdb70 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp @@ -152,9 +152,9 @@ void lv_draw_ready_print() { limit_info = lv_label_create_empty(scr); lv_style_copy(&limit_style, &lv_style_scr); - limit_style.body.main_color.full = 0X0000; - limit_style.body.grad_color.full = 0X0000; - limit_style.text.color.full = 0Xffff; + limit_style.body.main_color.full = 0x0000; + limit_style.body.grad_color.full = 0x0000; + limit_style.text.color.full = 0xffff; lv_obj_set_style(limit_info, &limit_style); lv_obj_set_pos(limit_info, 20, 120); @@ -163,9 +163,9 @@ void lv_draw_ready_print() { det_info = lv_label_create_empty(scr); lv_style_copy(&det_style, &lv_style_scr); - det_style.body.main_color.full = 0X0000; - det_style.body.grad_color.full = 0X0000; - det_style.text.color.full = 0Xffff; + det_style.body.main_color.full = 0x0000; + det_style.body.grad_color.full = 0x0000; + det_style.text.color.full = 0xffff; lv_obj_set_style(det_info, &det_style); lv_obj_set_pos(det_info, 20, 145); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h index 0abfd7834a..19c93468e4 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h @@ -116,7 +116,7 @@ #endif // Flash flag -#define REFLSHE_FLGA_ADD (0X800000-32) +#define REFLSHE_FLGA_ADD (0x800000-32) // SD card information first addr #define VAR_INF_ADDR 0x000000 diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp index 5622956579..02ca16e007 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp @@ -1231,13 +1231,13 @@ void utf8_2_unicode(uint8_t *source, uint8_t Len) { while (1) { char_byte_num = source[i] & 0xF0; - if (source[i] < 0X80) { + if (source[i] < 0x80) { //ASCII --1byte FileName_unicode[char_i] = source[i]; i += 1; char_i += 1; } - else if (char_byte_num == 0XC0 || char_byte_num == 0XD0) { + else if (char_byte_num == 0xC0 || char_byte_num == 0xD0) { //--2byte u16_h = (((uint16_t)source[i] << 8) & 0x1F00) >> 2; u16_l = ((uint16_t)source[i + 1] & 0x003F); @@ -1247,7 +1247,7 @@ void utf8_2_unicode(uint8_t *source, uint8_t Len) { i += 2; char_i += 2; } - else if (char_byte_num == 0XE0) { + else if (char_byte_num == 0xE0) { //--3byte u16_h = (((uint16_t)source[i] << 8) & 0x0F00) << 4; u16_m = (((uint16_t)source[i + 1] << 8) & 0x3F00) >> 2; @@ -1258,7 +1258,7 @@ void utf8_2_unicode(uint8_t *source, uint8_t Len) { i += 3; char_i += 2; } - else if (char_byte_num == 0XF0) { + else if (char_byte_num == 0xF0) { //--4byte i += 4; //char_i += 3; diff --git a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h index 49ee420aae..a01081a7df 100644 --- a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h +++ b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h @@ -42,6 +42,8 @@ //#define FLASH_EEPROM_EMULATION // Use Flash-based EEPROM emulation #define I2C_EEPROM #define MARLIN_EEPROM_SIZE 0x1000 // 4KB +#define I2C_SCL_PIN PB6 +#define I2C_SDA_PIN PB7 // // Release PB4 (Z_DIR_PIN) from JTAG NRST role diff --git a/platformio.ini b/platformio.ini index b35cd878d0..a63ee9f96a 100644 --- a/platformio.ini +++ b/platformio.ini @@ -53,6 +53,7 @@ default_src_filter = + - - + - - - - + - - - - - - - @@ -287,6 +288,10 @@ HAS_MENU_UBL = src_filter=+ ANYCUBIC_LCD_CHIRON = src_filter=+ + ANYCUBIC_LCD_I3MEGA = src_filter=+ + HAS_DGUS_LCD = src_filter=+ + +DGUS_LCD_UI_FYSETC = src_filter=+ +DGUS_LCD_UI_HIPRECY = src_filter=+ +DGUS_LCD_UI_MKS = src_filter=+ +DGUS_LCD_UI_ORIGIN = src_filter=+ TOUCH_UI_FTDI_EVE = src_filter=+ EXTUI_EXAMPLE = src_filter=+ MALYAN_LCD = src_filter=+ From 123658569357e6a287a0cf97b7a11f9b819063c7 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Sun, 28 Feb 2021 00:13:36 +0000 Subject: [PATCH 053/253] [cron] Bump distribution date (2021-02-28) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 46146c53c7..df2dd278d9 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2021-02-27" + #define STRING_DISTRIBUTION_DATE "2021-02-28" #endif /** From 04b83d50a29b96b746a0a1d0889960bad32aee54 Mon Sep 17 00:00:00 2001 From: RudolphRiedel <31180093+RudolphRiedel@users.noreply.github.com> Date: Sun, 28 Feb 2021 02:39:32 +0100 Subject: [PATCH 054/253] Two additional EVE displays (#18839) --- Marlin/Configuration_adv.h | 2 + .../ftdi_eve_lib/basic/boards.h | 99 ++++++++++++++++++- .../ftdi_eve_lib/basic/commands.cpp | 43 +++++--- .../ftdi_eve_lib/basic/resolutions.h | 57 +++++++---- 4 files changed, 163 insertions(+), 38 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 0e1cbd9a35..f23ca2980d 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1565,6 +1565,8 @@ //#define LCD_HAOYU_FT810CB // Haoyu with 5" (800x480) //#define LCD_ALEPHOBJECTS_CLCD_UI // Aleph Objects Color LCD UI //#define LCD_FYSETC_TFT81050 // FYSETC with 5" (800x480) + //#define LCD_EVE3_50G // Matrix Orbital 5.0", 800x480, BT815 + //#define LCD_EVE2_50G // Matrix Orbital 5.0", 800x480, FT813 // Correct the resolution if not using the stock TFT panel. //#define TOUCH_UI_320x240 diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/boards.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/boards.h index 6bb920885a..19f926d8e0 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/boards.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/boards.h @@ -112,7 +112,7 @@ } /** - * Settings for the 4D Systems, 4.3" Embedded SPI Display 480x272, SPI, FT800 (4DLCD-FT843) + * Settings for the 4D Systems, 4.3" Embedded SPI Display 480x272, SPI, FT800 (4DLCD-FT843) * https://4dsystems.com.au/4dlcd-ft843 * Datasheet: * https://4dsystems.com.au/mwdownloads/download/link/id/52/ @@ -177,8 +177,105 @@ constexpr uint8_t CSpread = 0; constexpr uint16_t touch_threshold = 2000; /* touch-sensitivity */ } + +/** + * Settings for EVE3-50G - Matrix Orbital 5.0" 800x480, BT815 + * https://www.matrixorbital.com/ftdi-eve/eve-bt815-bt816/eve3-50g + * use for example with: https://github.com/RudolphRiedel/EVE_display-adapter + */ +#elif defined(LCD_EVE3_50G) + #if !HAS_RESOLUTION + #define TOUCH_UI_800x480 + #define TOUCH_UI_800x480_GENERIC // use more common timing parameters as the original set + #endif + #ifndef FTDI_API_LEVEL + #define FTDI_API_LEVEL 810 + #endif + namespace FTDI { + IS_FT810 + constexpr bool Use_Crystal = true; // 0 = use internal oscillator, 1 = module has a crystal populated + constexpr bool GPIO_0_Audio_Enable = false; + constexpr bool GPIO_1_Audio_Shutdown = false; + #define USE_GT911 // this display uses an alternative touch-controller and we need to tell the init function to switch + constexpr uint8_t Swizzle = 0; + constexpr uint8_t CSpread = 1; + constexpr uint8_t Pclkpol = 1; + constexpr uint16_t touch_threshold = 1200; /* touch-sensitivity */ + + constexpr uint32_t default_transform_a = 0x000109E4; + constexpr uint32_t default_transform_b = 0x000007A6; + constexpr uint32_t default_transform_c = 0xFFEC1EBA; + constexpr uint32_t default_transform_d = 0x0000072C; + constexpr uint32_t default_transform_e = 0x0001096A; + constexpr uint32_t default_transform_f = 0xFFF469CF; + } + +/** + * Settings for EVE2-50G - Matrix Orbital 5.0" 800x480, FT813 + * https://www.matrixorbital.com/ftdi-eve/eve-bt815-bt816/eve3-50g + * use for example with: https://github.com/RudolphRiedel/EVE_display-adapter + */ +#elif defined(LCD_EVE2_50G) + #if !HAS_RESOLUTION + #define TOUCH_UI_800x480 + #define TOUCH_UI_800x480_GENERIC // use more common timing parameters as the original set + #endif + #ifndef FTDI_API_LEVEL + #define FTDI_API_LEVEL 810 + #endif + namespace FTDI { + IS_FT810 + constexpr bool Use_Crystal = false; // 0 = use internal oscillator, 1 = module has a crystal populated + constexpr bool GPIO_0_Audio_Enable = false; + constexpr bool GPIO_1_Audio_Shutdown = false; + #define PATCH_GT911 // this display uses an alternative touch-controller and we need to tell the init function to patch the FT813 for it + constexpr uint8_t Pclkpol = 1; + constexpr uint8_t Swizzle = 0; + constexpr uint8_t CSpread = 1; + constexpr uint16_t touch_threshold = 1200; /* touch-sensitivity */ + + constexpr uint32_t default_transform_a = 0x000109E4; + constexpr uint32_t default_transform_b = 0x000007A6; + constexpr uint32_t default_transform_c = 0xFFEC1EBA; + constexpr uint32_t default_transform_d = 0x0000072C; + constexpr uint32_t default_transform_e = 0x0001096A; + constexpr uint32_t default_transform_f = 0xFFF469CF; + } + #else #error "Unknown or no TOUCH_UI_FTDI_EVE board specified. To add a new board, modify this file." #endif + + +/* this data is used to patch FT813 displays that use a GT911 as a touch-controller */ +#ifdef PATCH_GT911 + constexpr PROGMEM unsigned char GT911_data[] = { + 26,255,255,255,32,32,48,0,4,0,0,0,2,0,0,0, + 34,255,255,255,0,176,48,0,120,218,237,84,221,111,84,69,20,63,51,179,93,160,148,101,111,76,5,44,141,123,111,161,11,219,154,16,9,16,17,229,156,75,26,11,13,21,227,3,16,252,184,179, + 45,219,143,45,41,125,144,72,67,100,150,71,189,113,18,36,17,165,100,165,198,16,32,17,149,196,240,128,161,16,164,38,54,240,0,209,72,130,15,38,125,48,66,82,30,76,19,31,172,103,46, + 139,24,255,4,227,157,204,156,51,115,102,206,231,239,220,5,170,94,129,137,75,194,216,98,94,103,117,115,121,76,131,177,125,89,125,82,123,60,243,58,142,242,204,185,243,188,118,156, + 227,155,203,238,238,195,251,205,229,71,92,28,169,190,184,84,143,113,137,53,244,103,181,237,87,253,113,137,233,48,12,198,165,181,104,139,25,84,253,155,114,74,191,0,54,138,163, + 12,62,131,207,129,23,217,34,91,31,128,65,246,163,175,213,8,147,213,107,35,203,94,108,3,111,40,171,83,24,15,165,177,222,116,97,23,188,140,206,150,42,102,181,87,78,86,182,170,134, + 215,241,121,26,243,252,2,76,115,217,139,222,206,173,136,132,81,61,35,185,39,113,23,46,199,76,178,54,151,183,224,0,40,189,28,149,182,58,131,79,152,30,76,34,98,234,162,216,133,141, + 102,39,170,40,192,101,53,201,146,191,37,77,44,177,209,74,211,5,206,187,5,6,216,47,53,96,123,22,50,103,251,192,84,17,74,227,185,56,106,51,91,161,96,182,163,48,171,141,139,65,152, + 66,66,11,102,43,158,75,36,80,147,184,147,139,112,17,235,216,103,111,239,245,92,10,175,194,40,44,58,125,5,59,112,50,103,245,4,78,192,5,156,194,51,60,191,134,75,110,173,237,46,192, + 121,156,192,115,184,218,120,67,63,115,46,11,102,10,97,232,50,235,114,182,148,118,178,41,188,12,135,77,202,124,12,96,238,35,161,234,189,129,23,249,212,139,230,25,53,48,205,52,93, + 163,117,53,154,170,81,85,163,178,70,69,66,167,241,14,46,241,1,226,136,152,179,197,59,184,148,254,49,132,48,15,176,137,192,76,131,196,105,104,162,86,81,160,165,255,26,173,162,137, + 86,145,210,183,192,55,175,194,211,60,91,120,230,184,174,27,41,131,155,40,224,29,87,179,232,16,55,55,7,165,147,81,23,165,49,101,54,224,75,180,81,108,18,29,226,69,225,110,175,224, + 42,212,25,47,130,193,110,234,192,215,252,56,74,162,24,46,251,174,54,106,68,245,14,9,155,160,22,120,207,104,240,29,90,178,140,28,24,220,47,166,112,61,251,208,192,111,56,239,238, + 93,255,251,62,99,32,193,75,61,190,235,123,229,110,218,194,85,79,225,59,98,20,238,227,235,220,11,221,149,25,180,116,194,159,111,96,192,24,213,59,139,179,156,215,69,230,19,24,35, + 135,117,206,171,206,162,67,129,234,61,235,11,104,103,84,64,223,167,254,40,163,101,92,84,43,150,46,249,219,205,7,116,11,91,104,61,57,75,223,8,48,25,28,119,252,222,113,49,86,249, + 74,180,211,156,181,61,215,168,157,7,251,199,150,242,250,91,58,132,94,121,7,53,151,139,98,6,165,153,69,214,32,110,211,100,101,31,89,45,81,98,23,205,205,197,209,109,186,198,35, + 141,191,249,25,60,132,223,153,251,98,20,239,146,139,20,217,250,41,250,137,58,177,90,57,79,51,108,233,20,253,194,187,49,222,205,114,141,96,48,175,219,107,54,111,138,22,154,103, + 108,79,58,252,179,178,79,164,195,2,153,36,39,170,199,201,167,197,85,106,8,59,177,81,46,56,2,230,75,114,17,55,112,188,65,208,137,77,114,10,115,55,58,208,197,173,122,87,6,140, + 110,42,208,124,163,70,108,241,104,18,245,98,214,187,134,53,42,221,22,182,133,211,116,148,177,194,209,192,85,90,199,58,55,203,2,229,19,137,187,161,228,154,112,203,145,125,244, + 188,220,118,228,41,201,181,41,195,144,215,183,51,80,250,21,217,16,217,200,235,109,227,188,122,218,142,60,170,224,112,240,184,130,229,224,113,5,223,148,163,80,165,183,130,187, + 132,116,64,238,161,85,220,115,139,205,98,227,244,29,102,125,7,37,243,123,223,11,26,92,63,243,116,61,191,138,123,244,160,84,186,74,31,5,174,247,119,135,199,248,253,135,242,97, + 102,145,190,144,14,85,238,221,231,193,158,48,205,25,120,248,15,220,29,158,9,70,185,30,103,229,33,254,23,237,160,172,62,193,90,222,224,232,14,200,56,90,104,142,227,120,110,6, + 21,211,203,65,150,99,151,220,247,87,164,50,159,49,239,234,58,142,0,109,108,123,18,79,227,36,100,248,222,205,96,127,120,26,171,228,69,63,36,17,252,200,17,116,242,187,227,88,143, + 247,2,75,191,6,130,59,188,11,55,240,31,243,122,152,226,183,207,154,73,188,39,219,43,105,222,87,41,143,141,140,175,73,112,184,252,61,184,16,90,250,35,168,82,119,176,57,116,94, + 200,150,22,190,179,44,104,12,235,84,149,102,252,89,154,193,99,228,106,242,125,248,64,194,255,223,127,242,83,11,255,2,70,214,226,128,0,0 + }; +#endif // PATCH_GT911 diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.cpp index 77d870fd4c..736809323b 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/commands.cpp @@ -1073,37 +1073,48 @@ void CLCD::init() { for (counter = 0; counter < 250; counter++) { uint8_t device_id = mem_read_8(REG::ID); // Read Device ID, Should Be 0x7C; if (device_id == 0x7C) { - #if ENABLED(TOUCH_UI_DEBUG) - SERIAL_ECHO_MSG("FTDI chip initialized"); - #endif + if (ENABLED(TOUCH_UI_DEBUG)) SERIAL_ECHO_MSG("FTDI chip initialized "); break; } else delay(1); - if (counter == 249) { - #if ENABLED(TOUCH_UI_DEBUG) - SERIAL_ECHO_MSG("Timeout waiting for device ID, should be 124, got ", device_id); - #endif - } + if (TERN0(TOUCH_UI_DEBUG, counter > 248)) + SERIAL_ECHO_MSG("Timeout waiting for device ID, should be 124, got ", device_id); } - /* make sure that all units are in working conditions, usually the touch-controller needs a little more time */ + /* Ensure all units are in working condition, usually the touch-controller needs a little more time */ for (counter = 0; counter < 100; counter++) { uint8_t reset_status = mem_read_8(REG::CPURESET) & 0x03; if (reset_status == 0x00) { - #if ENABLED(TOUCH_UI_DEBUG) - SERIAL_ECHO_MSG("FTDI chip all units running "); - #endif + if (ENABLED(TOUCH_UI_DEBUG)) SERIAL_ECHO_MSG("FTDI chip all units running "); break; } else delay(1); - if (ENABLED(TOUCH_UI_DEBUG) && counter == 99) + if (TERN0(TOUCH_UI_DEBUG, counter > 98)) SERIAL_ECHO_MSG("Timeout waiting for reset status. Should be 0x00, got ", reset_status); } + #if ENABLED(USE_GT911) /* switch BT815 to use Goodix GT911 touch controller */ + mem_write_32(REG::TOUCH_CONFIG, 0x000005D1); + #endif + + #if ENABLED(PATCH_GT911) /* patch FT813 use Goodix GT911 touch controller */ + mem_write_pgm(REG::CMDB_WRITE, GT911_data, sizeof(GT911_data)); /* write binary blob to command-fifo */ + delay(10); + mem_write_8(REG::TOUCH_OVERSAMPLE, 0x0F); /* setup oversample to 0x0f as "hidden" in binary-blob for AN_336 */ + mem_write_16(REG::TOUCH_CONFIG, 0x05d0); /* write magic cookie as requested by AN_336 */ + + /* specific to the EVE2 modules from Matrix-Orbital we have to use GPIO3 to reset GT911 */ + mem_write_16(REG::GPIOX_DIR,0x8008); /* Reset-Value is 0x8000, adding 0x08 sets GPIO3 to output, default-value for REG_GPIOX is 0x8000 -> Low output on GPIO3 */ + delay(1); /* wait more than 100µs */ + mem_write_8(REG::CPURESET, 0x00); /* clear all resets */ + delay(56); /* wait more than 55ms */ + mem_write_16(REG::GPIOX_DIR,0x8000); /* setting GPIO3 back to input */ + #endif + mem_write_8(REG::PWM_DUTY, 0); // turn off Backlight, Frequency already is set to 250Hz default /* Configure the FT8xx Registers */ @@ -1140,13 +1151,13 @@ void CLCD::init() { if (GPIO_1_Audio_Shutdown) { mem_write_8(REG::GPIO_DIR, GPIO_DISP | GPIO_GP1); mem_write_8(REG::GPIO, GPIO_DISP | GPIO_GP1); - } else if (GPIO_0_Audio_Enable) { + } + else if (GPIO_0_Audio_Enable) { mem_write_8(REG::GPIO_DIR, GPIO_DISP | GPIO_GP0); mem_write_8(REG::GPIO, GPIO_DISP | GPIO_GP0); } - else { + else mem_write_8(REG::GPIO, GPIO_DISP); /* REG::GPIO_DIR is set to output for GPIO_DISP by default */ - } mem_write_8(REG::PCLK, Pclk); // Turns on Clock by setting PCLK Register to the value necessary for the module diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/resolutions.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/resolutions.h index 5b29816429..0c600fa0a5 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/resolutions.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/resolutions.h @@ -43,7 +43,7 @@ constexpr uint16_t Vsync0 = tvfp - 1; \ constexpr uint16_t Vsync1 = tvfp + tvpw - 1; \ static_assert(thfp + thb + Hsize == th, "Mismatch in display th"); \ - static_assert(tvfp + tvb + Vsize == tv, "Mismatch in display tv"); + static_assert(tvfp + tvb + Vsize == tv, "Mismatch in display tv") #if ENABLED(TOUCH_UI_320x240) namespace FTDI { @@ -85,7 +85,7 @@ constexpr uint16_t tvb = 2; // VS Back porch (blanking) constexpr uint16_t tvpw = 10; // VS pulse width - COMPUTE_REGS_FROM_DATASHEET + COMPUTE_REGS_FROM_DATASHEET; constexpr uint32_t default_transform_a = 0x00008100; constexpr uint32_t default_transform_b = 0x00000000; @@ -97,29 +97,44 @@ #elif defined(TOUCH_UI_800x480) namespace FTDI { - constexpr uint8_t Pclk = 3; - constexpr uint8_t Pclkpol = 1; - constexpr uint16_t Hsize = 800; - constexpr uint16_t Vsize = 480; + #if defined(TOUCH_UI_800x480_GENERIC) + constexpr uint8_t Pclk = 2; + constexpr uint16_t Hsize = 800; + constexpr uint16_t Vsize = 480; - constexpr uint16_t th = 1056; // One horizontal line - constexpr uint16_t thfp = 210; // HS Front porch - constexpr uint16_t thb = 46; // HS Back porch (blanking) - constexpr uint16_t thpw = 23; // HS pulse width + constexpr uint16_t Vsync0 = 0; + constexpr uint16_t Vsync1 = 3; + constexpr uint16_t Voffset = 32; + constexpr uint16_t Vcycle = 525; + constexpr uint16_t Hsync0 = 0; + constexpr uint16_t Hsync1 = 48; + constexpr uint16_t Hoffset = 88; + constexpr uint16_t Hcycle = 928; + #else + constexpr uint8_t Pclk = 3; + constexpr uint8_t Pclkpol = 1; + constexpr uint16_t Hsize = 800; + constexpr uint16_t Vsize = 480; - constexpr uint16_t tv = 525; // Vertical period time - constexpr uint16_t tvfp = 22; // VS Front porch - constexpr uint16_t tvb = 23; // VS Back porch (blanking) - constexpr uint16_t tvpw = 10; // VS pulse width + constexpr uint16_t th = 1056; // One horizontal line + constexpr uint16_t thfp = 210; // HS Front porch + constexpr uint16_t thb = 46; // HS Back porch (blanking) + constexpr uint16_t thpw = 23; // HS pulse width - COMPUTE_REGS_FROM_DATASHEET + constexpr uint16_t tv = 525; // Vertical period time + constexpr uint16_t tvfp = 22; // VS Front porch + constexpr uint16_t tvb = 23; // VS Back porch (blanking) + constexpr uint16_t tvpw = 10; // VS pulse width - constexpr uint32_t default_transform_a = 0x0000D8B9; - constexpr uint32_t default_transform_b = 0x00000124; - constexpr uint32_t default_transform_c = 0xFFE23926; - constexpr uint32_t default_transform_d = 0xFFFFFF51; - constexpr uint32_t default_transform_e = 0xFFFF7E4F; - constexpr uint32_t default_transform_f = 0x01F0AF70; + COMPUTE_REGS_FROM_DATASHEET; + + constexpr uint32_t default_transform_a = 0x0000D8B9; + constexpr uint32_t default_transform_b = 0x00000124; + constexpr uint32_t default_transform_c = 0xFFE23926; + constexpr uint32_t default_transform_d = 0xFFFFFF51; + constexpr uint32_t default_transform_e = 0xFFFF7E4F; + constexpr uint32_t default_transform_f = 0x01F0AF70; + #endif } #else From dfacd260bb9ba1257d64bb1377627286c43675e1 Mon Sep 17 00:00:00 2001 From: ldursw <37294448+ldursw@users.noreply.github.com> Date: Sun, 28 Feb 2021 01:32:34 -0300 Subject: [PATCH 055/253] ST STM32 platform version 12 (#21219) --- platformio.ini | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/platformio.ini b/platformio.ini index a63ee9f96a..12f709bc70 100644 --- a/platformio.ini +++ b/platformio.ini @@ -734,7 +734,7 @@ board = nxp_lpc1769 # HAL/STM32 Base Environment values # [common_stm32] -platform = ststm32@~11.0 +platform = ststm32@~12.0 build_flags = ${common.build_flags} -std=gnu++14 -DUSBCON -DUSBD_USE_CDC @@ -747,7 +747,7 @@ src_filter = ${common.default_src_filter} + + Date: Sat, 27 Feb 2021 16:26:49 -0600 Subject: [PATCH 056/253] whitespace --- Marlin/src/HAL/STM32/HAL.cpp | 2 +- buildroot/share/PlatformIO/scripts/common-cxxflags.py | 4 ++-- platformio.ini | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Marlin/src/HAL/STM32/HAL.cpp b/Marlin/src/HAL/STM32/HAL.cpp index 4b530cc738..d13be1a21a 100644 --- a/Marlin/src/HAL/STM32/HAL.cpp +++ b/Marlin/src/HAL/STM32/HAL.cpp @@ -63,7 +63,7 @@ TERN_(POSTMORTEM_DEBUGGING, extern void install_min_serial()); void HAL_init() { FastIO_init(); - // Ensure F_CPU is a constant expression. + // Ensure F_CPU is a constant expression. // If the compiler breaks here, it means that delay code that should compute at compile time will not work. // So better safe than sorry here. constexpr int cpuFreq = F_CPU; diff --git a/buildroot/share/PlatformIO/scripts/common-cxxflags.py b/buildroot/share/PlatformIO/scripts/common-cxxflags.py index ed863a917a..5c2bde7700 100644 --- a/buildroot/share/PlatformIO/scripts/common-cxxflags.py +++ b/buildroot/share/PlatformIO/scripts/common-cxxflags.py @@ -28,8 +28,8 @@ def add_cpu_freq(): if env.GetBuildType() == "debug": env['BUILD_DIR'] = '$PROJECT_BUILD_DIR/$PIOENV/debug' -# On some platform, F_CPU is a runtime variable. Since it's used to convert from ns -# to CPU cycles, this adds overhead preventing small delay (in the order of less than +# On some platform, F_CPU is a runtime variable. Since it's used to convert from ns +# to CPU cycles, this adds overhead preventing small delay (in the order of less than # 30 cycles) to be generated correctly. By using a compile time constant instead # the compiler will perform the computation and this overhead will be avoided add_cpu_freq() diff --git a/platformio.ini b/platformio.ini index 12f709bc70..2c011a9e87 100644 --- a/platformio.ini +++ b/platformio.ini @@ -1344,7 +1344,7 @@ build_flags = ${common_stm32.build_flags} extends = env:BIGTREE_GTR_V1_0 platform_packages = ${stm32_flash_drive.platform_packages} build_unflags = -DUSBCON -DUSBD_USE_CDC -build_flags = ${stm32_flash_drive.build_flags} +build_flags = ${stm32_flash_drive.build_flags} -DSTM32F407IX -DVECT_TAB_OFFSET=0x8000 # From 903d0b91fc28b1198e7b90131f94f02a7c3f1530 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 27 Feb 2021 22:38:57 -0600 Subject: [PATCH 057/253] Tweaks to build scripts --- Marlin/src/HAL/LPC1768/upload_extra_script.py | 7 ++----- .../lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/svg2cpp.py | 2 +- .../share/PlatformIO/scripts/STM32F103RC_MEEB_3DP.py | 3 +++ .../share/PlatformIO/scripts/STM32F103RC_SKR_MINI.py | 3 +++ buildroot/share/PlatformIO/scripts/STM32F103RC_fysetc.py | 3 +++ .../scripts/{creality.py => STM32F103RET6_creality.py} | 3 +++ .../share/PlatformIO/scripts/STM32F103RE_SKR_E3_DIP.py | 3 +++ buildroot/share/PlatformIO/scripts/STM32F103VE_longer.py | 4 ++++ .../share/PlatformIO/scripts/STM32F1_create_variant.py | 3 +++ .../scripts/{STEVAL__F401XX.py => STM32F401VE_STEVAL.py} | 4 ++++ buildroot/share/PlatformIO/scripts/add_nanolib.py | 3 +++ buildroot/share/PlatformIO/scripts/chitu_crypt.py | 9 +++++---- buildroot/share/PlatformIO/scripts/common-cxxflags.py | 4 ++-- .../share/PlatformIO/scripts/common-dependencies.py | 4 +--- .../scripts/copy_marlin_variant_to_framework.py | 3 +++ .../share/PlatformIO/scripts/download_mks_assets.py | 9 ++++----- .../share/PlatformIO/scripts/fix_framework_weakness.py | 3 +++ buildroot/share/PlatformIO/scripts/fly_mini.py | 4 ++++ buildroot/share/PlatformIO/scripts/lerdge.py | 4 ++++ buildroot/share/PlatformIO/scripts/preflight-checks.py | 3 +-- buildroot/share/PlatformIO/scripts/random-bin.py | 4 ++++ buildroot/share/PlatformIO/scripts/stm32_bootloader.py | 3 +++ buildroot/share/scripts/config-labels.py | 3 +-- buildroot/share/scripts/createTemperatureLookupMarlin.py | 3 +-- buildroot/share/vscode/auto_build.py | 3 +-- .../share/vscode/create_custom_upload_command_CDC.py | 6 ++---- .../share/vscode/create_custom_upload_command_DFU.py | 3 +-- platformio.ini | 8 +++++--- 28 files changed, 77 insertions(+), 37 deletions(-) rename buildroot/share/PlatformIO/scripts/{creality.py => STM32F103RET6_creality.py} (94%) rename buildroot/share/PlatformIO/scripts/{STEVAL__F401XX.py => STM32F401VE_STEVAL.py} (81%) diff --git a/Marlin/src/HAL/LPC1768/upload_extra_script.py b/Marlin/src/HAL/LPC1768/upload_extra_script.py index 1daaa883ed..5967a9970f 100755 --- a/Marlin/src/HAL/LPC1768/upload_extra_script.py +++ b/Marlin/src/HAL/LPC1768/upload_extra_script.py @@ -8,9 +8,7 @@ from __future__ import print_function target_filename = "FIRMWARE.CUR" target_drive = "REARM" -import os -import getpass -import platform +import os,getpass,platform current_OS = platform.system() Import("env") @@ -33,9 +31,8 @@ try: # # platformio.ini will accept this for a Windows upload port designation: 'upload_port = L:' # Windows - doesn't care about the disk's name, only cares about the drive letter - import subprocess + import subprocess,string from ctypes import windll - import string # getting list of drives # https://stackoverflow.com/questions/827371/is-there-a-way-to-list-all-the-available-drive-letters-in-python diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/svg2cpp.py b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/svg2cpp.py index c6eba3946c..aa702ca4b4 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/svg2cpp.py +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/svg2cpp.py @@ -16,7 +16,7 @@ # location: . from __future__ import print_function -import argparse, re, sys +import argparse,re,sys usage = ''' This program extracts line segments from a SVG file and writes diff --git a/buildroot/share/PlatformIO/scripts/STM32F103RC_MEEB_3DP.py b/buildroot/share/PlatformIO/scripts/STM32F103RC_MEEB_3DP.py index 547d80ace5..6d7f21942e 100644 --- a/buildroot/share/PlatformIO/scripts/STM32F103RC_MEEB_3DP.py +++ b/buildroot/share/PlatformIO/scripts/STM32F103RC_MEEB_3DP.py @@ -1,3 +1,6 @@ +# +# STM32F103RC_MEEB_3DP.py +# try: import configparser except ImportError: diff --git a/buildroot/share/PlatformIO/scripts/STM32F103RC_SKR_MINI.py b/buildroot/share/PlatformIO/scripts/STM32F103RC_SKR_MINI.py index 497a035fdf..7e9dc676b6 100644 --- a/buildroot/share/PlatformIO/scripts/STM32F103RC_SKR_MINI.py +++ b/buildroot/share/PlatformIO/scripts/STM32F103RC_SKR_MINI.py @@ -1,3 +1,6 @@ +# +# STM32F103RC_SKR_MINI.py +# import os Import("env") diff --git a/buildroot/share/PlatformIO/scripts/STM32F103RC_fysetc.py b/buildroot/share/PlatformIO/scripts/STM32F103RC_fysetc.py index b69f62578b..1a7cc34edb 100644 --- a/buildroot/share/PlatformIO/scripts/STM32F103RC_fysetc.py +++ b/buildroot/share/PlatformIO/scripts/STM32F103RC_fysetc.py @@ -1,3 +1,6 @@ +# +# STM32F103RC_fysetc.py +# import os from os.path import join from os.path import expandvars diff --git a/buildroot/share/PlatformIO/scripts/creality.py b/buildroot/share/PlatformIO/scripts/STM32F103RET6_creality.py similarity index 94% rename from buildroot/share/PlatformIO/scripts/creality.py rename to buildroot/share/PlatformIO/scripts/STM32F103RET6_creality.py index b9d7d7039b..e3ef98b03f 100644 --- a/buildroot/share/PlatformIO/scripts/creality.py +++ b/buildroot/share/PlatformIO/scripts/STM32F103RET6_creality.py @@ -1,3 +1,6 @@ +# +# STM32F103RET6_creality.py +# import os Import("env") diff --git a/buildroot/share/PlatformIO/scripts/STM32F103RE_SKR_E3_DIP.py b/buildroot/share/PlatformIO/scripts/STM32F103RE_SKR_E3_DIP.py index ecdd57f594..06e586f7f8 100644 --- a/buildroot/share/PlatformIO/scripts/STM32F103RE_SKR_E3_DIP.py +++ b/buildroot/share/PlatformIO/scripts/STM32F103RE_SKR_E3_DIP.py @@ -1,3 +1,6 @@ +# +# STM32F103RE_SKR_E3_DIP.py +# import os Import("env") diff --git a/buildroot/share/PlatformIO/scripts/STM32F103VE_longer.py b/buildroot/share/PlatformIO/scripts/STM32F103VE_longer.py index ece47ed096..bbdfcd93b7 100644 --- a/buildroot/share/PlatformIO/scripts/STM32F103VE_longer.py +++ b/buildroot/share/PlatformIO/scripts/STM32F103VE_longer.py @@ -1,3 +1,7 @@ +# +# STM32F103VE_longer.py +# Customizations for env:STM32F103VE_longer +# import os Import("env") diff --git a/buildroot/share/PlatformIO/scripts/STM32F1_create_variant.py b/buildroot/share/PlatformIO/scripts/STM32F1_create_variant.py index 4849f59ceb..0ba5d71f26 100644 --- a/buildroot/share/PlatformIO/scripts/STM32F1_create_variant.py +++ b/buildroot/share/PlatformIO/scripts/STM32F1_create_variant.py @@ -1,3 +1,6 @@ +# +# STM32F1_create_variant.py +# import os,shutil from SCons.Script import DefaultEnvironment from platformio import util diff --git a/buildroot/share/PlatformIO/scripts/STEVAL__F401XX.py b/buildroot/share/PlatformIO/scripts/STM32F401VE_STEVAL.py similarity index 81% rename from buildroot/share/PlatformIO/scripts/STEVAL__F401XX.py rename to buildroot/share/PlatformIO/scripts/STM32F401VE_STEVAL.py index 580529c9c1..ffd5bcd42d 100644 --- a/buildroot/share/PlatformIO/scripts/STEVAL__F401XX.py +++ b/buildroot/share/PlatformIO/scripts/STM32F401VE_STEVAL.py @@ -1,3 +1,7 @@ +# +# STM32F401VE_STEVAL.py +# Customizations for env:STM32F401VE_STEVAL +# import os Import("env") diff --git a/buildroot/share/PlatformIO/scripts/add_nanolib.py b/buildroot/share/PlatformIO/scripts/add_nanolib.py index 102b4b9bb0..3b74b0d271 100644 --- a/buildroot/share/PlatformIO/scripts/add_nanolib.py +++ b/buildroot/share/PlatformIO/scripts/add_nanolib.py @@ -1,2 +1,5 @@ +# +# add_nanolib.py +# Import("env") env.Append(LINKFLAGS=["--specs=nano.specs"]) diff --git a/buildroot/share/PlatformIO/scripts/chitu_crypt.py b/buildroot/share/PlatformIO/scripts/chitu_crypt.py index aa675878e7..3d4854b51f 100644 --- a/buildroot/share/PlatformIO/scripts/chitu_crypt.py +++ b/buildroot/share/PlatformIO/scripts/chitu_crypt.py @@ -1,8 +1,9 @@ +# +# chitu_crypt.py +# Customizations for Chitu boards +# Import("env") -import os -import random -import struct -import uuid +import os,random,struct,uuid # Relocate firmware from 0x08000000 to 0x08008800 env['CPPDEFINES'].remove(("VECT_TAB_ADDR", "0x8000000")) diff --git a/buildroot/share/PlatformIO/scripts/common-cxxflags.py b/buildroot/share/PlatformIO/scripts/common-cxxflags.py index 5c2bde7700..ed863a917a 100644 --- a/buildroot/share/PlatformIO/scripts/common-cxxflags.py +++ b/buildroot/share/PlatformIO/scripts/common-cxxflags.py @@ -28,8 +28,8 @@ def add_cpu_freq(): if env.GetBuildType() == "debug": env['BUILD_DIR'] = '$PROJECT_BUILD_DIR/$PIOENV/debug' -# On some platform, F_CPU is a runtime variable. Since it's used to convert from ns -# to CPU cycles, this adds overhead preventing small delay (in the order of less than +# On some platform, F_CPU is a runtime variable. Since it's used to convert from ns +# to CPU cycles, this adds overhead preventing small delay (in the order of less than # 30 cycles) to be generated correctly. By using a compile time constant instead # the compiler will perform the computation and this overhead will be avoided add_cpu_freq() diff --git a/buildroot/share/PlatformIO/scripts/common-dependencies.py b/buildroot/share/PlatformIO/scripts/common-dependencies.py index 30e168d83f..3844d8298a 100644 --- a/buildroot/share/PlatformIO/scripts/common-dependencies.py +++ b/buildroot/share/PlatformIO/scripts/common-dependencies.py @@ -2,9 +2,7 @@ # common-dependencies.py # Convenience script to check dependencies and add libs and sources for Marlin Enabled Features # -import subprocess -import os -import re +import subprocess,os,re try: import configparser except ImportError: diff --git a/buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py b/buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py index f7d3f0d03a..7ea7ac57f3 100644 --- a/buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py +++ b/buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py @@ -1,3 +1,6 @@ +# +# copy_marlin_variant_to_framework.py +# import os,shutil from SCons.Script import DefaultEnvironment from platformio import util diff --git a/buildroot/share/PlatformIO/scripts/download_mks_assets.py b/buildroot/share/PlatformIO/scripts/download_mks_assets.py index ae2ce467e8..33acab9e12 100644 --- a/buildroot/share/PlatformIO/scripts/download_mks_assets.py +++ b/buildroot/share/PlatformIO/scripts/download_mks_assets.py @@ -1,9 +1,8 @@ +# +# download_mks_assets.py +# Import("env") -import os -import requests -import zipfile -import tempfile -import shutil +import os,requests,zipfile,tempfile,shutil url = "https://github.com/makerbase-mks/Mks-Robin-Nano-Marlin2.0-Firmware/archive/master.zip" zip_path = os.path.join(env.Dictionary("PROJECT_LIBDEPS_DIR"), "mks-assets.zip") diff --git a/buildroot/share/PlatformIO/scripts/fix_framework_weakness.py b/buildroot/share/PlatformIO/scripts/fix_framework_weakness.py index 4944c0003b..c7bc45aba9 100644 --- a/buildroot/share/PlatformIO/scripts/fix_framework_weakness.py +++ b/buildroot/share/PlatformIO/scripts/fix_framework_weakness.py @@ -1,3 +1,6 @@ +# +# fix_framework_weakness.py +# from os.path import join, isfile import shutil from pprint import pprint diff --git a/buildroot/share/PlatformIO/scripts/fly_mini.py b/buildroot/share/PlatformIO/scripts/fly_mini.py index 34d132958d..9c5df359ad 100644 --- a/buildroot/share/PlatformIO/scripts/fly_mini.py +++ b/buildroot/share/PlatformIO/scripts/fly_mini.py @@ -1,3 +1,7 @@ +# +# fly_mini.py +# Customizations for env:FLY_MINI +# import os Import("env") diff --git a/buildroot/share/PlatformIO/scripts/lerdge.py b/buildroot/share/PlatformIO/scripts/lerdge.py index fd934a1278..ff4f5e446b 100644 --- a/buildroot/share/PlatformIO/scripts/lerdge.py +++ b/buildroot/share/PlatformIO/scripts/lerdge.py @@ -1,3 +1,7 @@ +# +# lerdge.py +# Customizations for Lerdge build environments +# import os,sys Import("env") diff --git a/buildroot/share/PlatformIO/scripts/preflight-checks.py b/buildroot/share/PlatformIO/scripts/preflight-checks.py index c20e5cb7a8..c9bbb42ab9 100644 --- a/buildroot/share/PlatformIO/scripts/preflight-checks.py +++ b/buildroot/share/PlatformIO/scripts/preflight-checks.py @@ -2,8 +2,7 @@ # preflight-checks.py # Check for common issues prior to compiling # -import os -import re +import os,re Import("env") def get_envs_for_board(board): diff --git a/buildroot/share/PlatformIO/scripts/random-bin.py b/buildroot/share/PlatformIO/scripts/random-bin.py index 4d7ca5dc09..c03b863448 100644 --- a/buildroot/share/PlatformIO/scripts/random-bin.py +++ b/buildroot/share/PlatformIO/scripts/random-bin.py @@ -1,3 +1,7 @@ +# +# random-bin.py +# Set a unique firmware name based on current date and time +# Import("env") from datetime import datetime diff --git a/buildroot/share/PlatformIO/scripts/stm32_bootloader.py b/buildroot/share/PlatformIO/scripts/stm32_bootloader.py index 7f49ea0e66..bbec61750c 100644 --- a/buildroot/share/PlatformIO/scripts/stm32_bootloader.py +++ b/buildroot/share/PlatformIO/scripts/stm32_bootloader.py @@ -1,3 +1,6 @@ +# +# stm32_bootloader.py +# import os,sys,shutil Import("env") diff --git a/buildroot/share/scripts/config-labels.py b/buildroot/share/scripts/config-labels.py index 267aa2d273..700604e452 100755 --- a/buildroot/share/scripts/config-labels.py +++ b/buildroot/share/scripts/config-labels.py @@ -22,8 +22,7 @@ # 2020-06-05 SRL style tweaks #----------------------------------- # -import sys -import os +import sys,os from pathlib import Path from distutils.dir_util import copy_tree # for copy_tree, because shutil.copytree can't handle existing files, dirs diff --git a/buildroot/share/scripts/createTemperatureLookupMarlin.py b/buildroot/share/scripts/createTemperatureLookupMarlin.py index b2d8964f55..b3343de1a0 100755 --- a/buildroot/share/scripts/createTemperatureLookupMarlin.py +++ b/buildroot/share/scripts/createTemperatureLookupMarlin.py @@ -22,8 +22,7 @@ from __future__ import print_function from __future__ import division from math import * -import sys -import getopt +import sys,getopt "Constants" ZERO = 273.15 # zero point of Kelvin scale diff --git a/buildroot/share/vscode/auto_build.py b/buildroot/share/vscode/auto_build.py index 61cacca4d7..ac8432729f 100644 --- a/buildroot/share/vscode/auto_build.py +++ b/buildroot/share/vscode/auto_build.py @@ -72,8 +72,7 @@ from __future__ import print_function from __future__ import division -import sys -import os +import sys,os pwd = os.getcwd() # make sure we're executing from the correct directory level pwd = pwd.replace('\\', '/') diff --git a/buildroot/share/vscode/create_custom_upload_command_CDC.py b/buildroot/share/vscode/create_custom_upload_command_CDC.py index 65edbd15b8..4662dd26cb 100644 --- a/buildroot/share/vscode/create_custom_upload_command_CDC.py +++ b/buildroot/share/vscode/create_custom_upload_command_CDC.py @@ -13,11 +13,9 @@ from __future__ import print_function from __future__ import division -import subprocess -import os -import sys +import subprocess,os,sys,platform from SCons.Script import DefaultEnvironment -import platform + current_OS = platform.system() env = DefaultEnvironment() diff --git a/buildroot/share/vscode/create_custom_upload_command_DFU.py b/buildroot/share/vscode/create_custom_upload_command_DFU.py index 9082699bf4..562e284e63 100644 --- a/buildroot/share/vscode/create_custom_upload_command_DFU.py +++ b/buildroot/share/vscode/create_custom_upload_command_DFU.py @@ -9,8 +9,7 @@ # Will continue on if a COM port isn't found so that the compilation can be done. # -import os -import sys +import os,sys from SCons.Script import DefaultEnvironment import platform current_OS = platform.system() diff --git a/platformio.ini b/platformio.ini index 2c011a9e87..7ddd832f8e 100644 --- a/platformio.ini +++ b/platformio.ini @@ -1155,7 +1155,7 @@ extends = env:STM32F103RE build_flags = ${env:STM32F103RE.build_flags} -DTEMP_TIMER_CHAN=4 extra_scripts = ${env:STM32F103RE.extra_scripts} pre:buildroot/share/PlatformIO/scripts/random-bin.py - buildroot/share/PlatformIO/scripts/creality.py + buildroot/share/PlatformIO/scripts/STM32F103RET6_creality.py debug_tool = jlink upload_protocol = jlink @@ -1194,7 +1194,7 @@ build_flags = ${common_stm32.build_flags} -DDISABLE_GENERIC_SERIALUSB -DUSBD_USE_CDC_COMPOSITE -DUSE_USB_FS extra_scripts = ${common.extra_scripts} pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py - buildroot/share/PlatformIO/scripts/STEVAL__F401XX.py + buildroot/share/PlatformIO/scripts/STM32F401VE_STEVAL.py # # STM32F401RC @@ -1569,7 +1569,9 @@ board_build.ldscript = ldscript.ld board_build.offset = 0x10000 build_flags = ${common_stm32.build_flags} -DENABLE_HWSERIAL3 -DTIMER_SERIAL=TIM5 build_unflags = ${common_stm32.build_unflags} -DUSBCON -DUSBD_USE_CDC -extra_scripts = ${common.extra_scripts} pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py buildroot/share/PlatformIO/scripts/stm32_bootloader.py +extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py + buildroot/share/PlatformIO/scripts/stm32_bootloader.py ################################# # # From 254b25296b37cdb170e32a5530348907e7b8c9fc Mon Sep 17 00:00:00 2001 From: Giuliano Zaro <3684609+GMagician@users.noreply.github.com> Date: Sun, 28 Feb 2021 05:41:16 +0100 Subject: [PATCH 058/253] [SAMD51] Respect serial buffer size (#21194) --- .../scripts/SAMD51_grandcentral_m4.py | 18 ++++++++++++++++++ platformio.ini | 2 ++ 2 files changed, 20 insertions(+) create mode 100644 buildroot/share/PlatformIO/scripts/SAMD51_grandcentral_m4.py diff --git a/buildroot/share/PlatformIO/scripts/SAMD51_grandcentral_m4.py b/buildroot/share/PlatformIO/scripts/SAMD51_grandcentral_m4.py new file mode 100644 index 0000000000..05dc444bda --- /dev/null +++ b/buildroot/share/PlatformIO/scripts/SAMD51_grandcentral_m4.py @@ -0,0 +1,18 @@ +# +# SAMD51_grandcentral_m4.py +# Customizations for env:SAMD51_grandcentral_m4 +# +from os.path import join, isfile +import shutil +from pprint import pprint + +Import("env") + +rxBuf = env["MARLIN_FEATURES"]["RX_BUFFER_SIZE"] if "RX_BUFFER_SIZE" in env["MARLIN_FEATURES"] else "0" +txBuf = env["MARLIN_FEATURES"]["TX_BUFFER_SIZE"] if "TX_BUFFER_SIZE" in env["MARLIN_FEATURES"] else "0" + +serialBuf = str(max(int(rxBuf), int(txBuf), 350)) + +build_flags = env.get('BUILD_FLAGS') +build_flags.append("-DSERIAL_BUFFER_SIZE=" + serialBuf) +env.Replace(BUILD_FLAGS=build_flags) diff --git a/platformio.ini b/platformio.ini index 7ddd832f8e..157b3d6201 100644 --- a/platformio.ini +++ b/platformio.ini @@ -681,6 +681,8 @@ src_filter = ${common.default_src_filter} + lib_deps = ${common.lib_deps} SoftwareSerialM Adafruit SPIFlash +extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/SAMD51_grandcentral_m4.py custom_marlin.SDSUPPORT = SdFat - Adafruit Fork debug_tool = jlink From 680172a084caba61ebb0524e407f2c476eaa6e63 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 27 Feb 2021 23:51:56 -0600 Subject: [PATCH 059/253] Tweaks to build scripts --- .../share/PlatformIO/scripts/SAMD51_grandcentral_m4.py | 5 +++-- buildroot/share/PlatformIO/scripts/common-cxxflags.py | 4 ++-- .../share/PlatformIO/scripts/fix_framework_weakness.py | 6 +++--- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/buildroot/share/PlatformIO/scripts/SAMD51_grandcentral_m4.py b/buildroot/share/PlatformIO/scripts/SAMD51_grandcentral_m4.py index 05dc444bda..9e37024d11 100644 --- a/buildroot/share/PlatformIO/scripts/SAMD51_grandcentral_m4.py +++ b/buildroot/share/PlatformIO/scripts/SAMD51_grandcentral_m4.py @@ -8,8 +8,9 @@ from pprint import pprint Import("env") -rxBuf = env["MARLIN_FEATURES"]["RX_BUFFER_SIZE"] if "RX_BUFFER_SIZE" in env["MARLIN_FEATURES"] else "0" -txBuf = env["MARLIN_FEATURES"]["TX_BUFFER_SIZE"] if "TX_BUFFER_SIZE" in env["MARLIN_FEATURES"] else "0" +mf = env["MARLIN_FEATURES"] +rxBuf = mf["RX_BUFFER_SIZE"] if "RX_BUFFER_SIZE" in mf else "0" +txBuf = mf["TX_BUFFER_SIZE"] if "TX_BUFFER_SIZE" in mf else "0" serialBuf = str(max(int(rxBuf), int(txBuf), 350)) diff --git a/buildroot/share/PlatformIO/scripts/common-cxxflags.py b/buildroot/share/PlatformIO/scripts/common-cxxflags.py index ed863a917a..5c2bde7700 100644 --- a/buildroot/share/PlatformIO/scripts/common-cxxflags.py +++ b/buildroot/share/PlatformIO/scripts/common-cxxflags.py @@ -28,8 +28,8 @@ def add_cpu_freq(): if env.GetBuildType() == "debug": env['BUILD_DIR'] = '$PROJECT_BUILD_DIR/$PIOENV/debug' -# On some platform, F_CPU is a runtime variable. Since it's used to convert from ns -# to CPU cycles, this adds overhead preventing small delay (in the order of less than +# On some platform, F_CPU is a runtime variable. Since it's used to convert from ns +# to CPU cycles, this adds overhead preventing small delay (in the order of less than # 30 cycles) to be generated correctly. By using a compile time constant instead # the compiler will perform the computation and this overhead will be avoided add_cpu_freq() diff --git a/buildroot/share/PlatformIO/scripts/fix_framework_weakness.py b/buildroot/share/PlatformIO/scripts/fix_framework_weakness.py index c7bc45aba9..29705de442 100644 --- a/buildroot/share/PlatformIO/scripts/fix_framework_weakness.py +++ b/buildroot/share/PlatformIO/scripts/fix_framework_weakness.py @@ -31,11 +31,11 @@ if env.MarlinFeatureIsEnabled("POSTMORTEM_DEBUGGING"): print("Libmaple modified and ready for post mortem debugging") -rxBuf = env["MARLIN_FEATURES"]["RX_BUFFER_SIZE"] if "RX_BUFFER_SIZE" in env["MARLIN_FEATURES"] else "0" -txBuf = env["MARLIN_FEATURES"]["TX_BUFFER_SIZE"] if "TX_BUFFER_SIZE" in env["MARLIN_FEATURES"] else "0" +mf = env["MARLIN_FEATURES"] +rxBuf = mf["RX_BUFFER_SIZE"] if "RX_BUFFER_SIZE" in mf else "0" +txBuf = mf["TX_BUFFER_SIZE"] if "TX_BUFFER_SIZE" in mf else "0" if int(rxBuf) < 64: rxBuf = "64" - if int(txBuf) < 64: txBuf = "64" From 2328f8b9b888844a7e12812155743c8098e5c339 Mon Sep 17 00:00:00 2001 From: Fabio Viappiani Date: Sun, 28 Feb 2021 23:09:15 +0100 Subject: [PATCH 060/253] Fix TERN typo (#21229) --- Marlin/src/feature/leds/neopixel.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/feature/leds/neopixel.cpp b/Marlin/src/feature/leds/neopixel.cpp index 6f5ea0540a..bdd22837ad 100644 --- a/Marlin/src/feature/leds/neopixel.cpp +++ b/Marlin/src/feature/leds/neopixel.cpp @@ -60,7 +60,7 @@ void Marlin_NeoPixel::set_color(const uint32_t color) { else { for (uint16_t i = 0; i < pixels(); ++i) { #ifdef NEOPIXEL_BKGD_LED_INDEX - if (i == NEOPIXEL_BKGD_LED_INDEX && TERN(ENABLED(NEOPIXEL_BKGD_ALWAYS_ON), true, color != 0x000000)) { + if (i == NEOPIXEL_BKGD_LED_INDEX && TERN(NEOPIXEL_BKGD_ALWAYS_ON, true, color != 0x000000)) { set_color_background(); continue; } From e8ca077f30d3bb3dfc81971ec1051cce8bf335ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roman=20Morav=C4=8D=C3=ADk?= Date: Sun, 28 Feb 2021 23:12:27 +0100 Subject: [PATCH 061/253] Update Slovak language (#21224) --- Marlin/src/lcd/language/language_sk.h | 29 +++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/Marlin/src/lcd/language/language_sk.h b/Marlin/src/lcd/language/language_sk.h index 1900f53719..a9df28382e 100644 --- a/Marlin/src/lcd/language/language_sk.h +++ b/Marlin/src/lcd/language/language_sk.h @@ -30,6 +30,13 @@ * * Translated by Michal Holeš, Farma MaM * https://www.facebook.com/farmamam + * + * Substitutions are applied for the following characters when used + * in menu items that call lcd_put_u8str_ind_P with an index: + * + * = displays '0'....'10' for indexes 0 - 10 + * ~ displays '1'....'11' for indexes 0 - 10 + * * displays 'E1'...'E11' for indexes 0 - 10 (By default. Uses LCD_FIRST_TOOL) */ #define DISPLAY_CHARSET_ISO10646_SK @@ -37,7 +44,7 @@ namespace Language_sk { using namespace Language_en; // Inherit undefined strings from English constexpr uint8_t CHARSIZE = 2; - PROGMEM Language_Str LANGUAGE = _UxGT("Slovak"); + PROGMEM Language_Str LANGUAGE = _UxGT("Slovenčina"); PROGMEM Language_Str WELCOME_MSG = MACHINE_NAME _UxGT(" pripravená."); PROGMEM Language_Str MSG_YES = _UxGT("ÁNO"); @@ -100,12 +107,19 @@ namespace Language_sk { #endif PROGMEM Language_Str MSG_PREHEAT_CUSTOM = _UxGT("Vlastná teplota"); PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Schladiť"); + PROGMEM Language_Str MSG_CUTTER_FREQUENCY = _UxGT("Frekvencia"); PROGMEM Language_Str MSG_LASER_MENU = _UxGT("Nastavenie lasera"); - PROGMEM Language_Str MSG_LASER_POWER = _UxGT("Výkon lasera"); PROGMEM Language_Str MSG_SPINDLE_MENU = _UxGT("Nastavenie vretena"); + PROGMEM Language_Str MSG_LASER_POWER = _UxGT("Výkon lasera"); PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("Výkon vretena"); + PROGMEM Language_Str MSG_LASER_TOGGLE = _UxGT("Prepnúť laser"); + PROGMEM Language_Str MSG_LASER_PULSE_MS = _UxGT("Test. impulz ms"); + PROGMEM Language_Str MSG_LASER_FIRE_PULSE = _UxGT("Vystreliť impulz"); + PROGMEM Language_Str MSG_SPINDLE_TOGGLE = _UxGT("Prepnúť vreteno"); + PROGMEM Language_Str MSG_SPINDLE_FORWARD = _UxGT("Dopredný chod"); PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("Spätný chod"); + PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Zapnúť napájanie"); PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Vypnúť napájanie"); PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Vytlačiť (extr.)"); @@ -114,6 +128,10 @@ namespace Language_sk { PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Vyrovnanie podložky"); PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Vyrovnať podložku"); PROGMEM Language_Str MSG_LEVEL_CORNERS = _UxGT("Vyrovnať rohy"); + PROGMEM Language_Str MSG_LEVEL_CORNERS_RAISE = _UxGT("Zdvyhnite podl., kým sa nezopne sonda"); + PROGMEM Language_Str MSG_LEVEL_CORNERS_IN_RANGE = _UxGT("Rohy sú vrámci odchyl. Vyrovnajte podl."); + PROGMEM Language_Str MSG_LEVEL_CORNERS_GOOD_POINTS = _UxGT("Dobré body: "); + PROGMEM Language_Str MSG_LEVEL_CORNERS_LAST_Z = _UxGT("Posl. Z: "); PROGMEM Language_Str MSG_NEXT_CORNER = _UxGT("Ďalší roh"); PROGMEM Language_Str MSG_MESH_EDITOR = _UxGT("Editor sieťe bodov"); PROGMEM Language_Str MSG_EDIT_MESH = _UxGT("Upraviť sieť bodov"); @@ -247,6 +265,9 @@ namespace Language_sk { PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Posunúť o 0,1mm"); PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Posunúť o 1mm"); PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Posunúť o 10mm"); + PROGMEM Language_Str MSG_MOVE_0001IN = _UxGT("Posunúť o 0,001in"); + PROGMEM Language_Str MSG_MOVE_001IN = _UxGT("Posunúť o 0,01in"); + PROGMEM Language_Str MSG_MOVE_01IN = _UxGT("Posunúť o 0,1in"); PROGMEM Language_Str MSG_SPEED = _UxGT("Rýchlosť"); PROGMEM Language_Str MSG_BED_Z = _UxGT("Výška podl."); PROGMEM Language_Str MSG_NOZZLE = _UxGT("Tryska"); @@ -355,11 +376,13 @@ namespace Language_sk { PROGMEM Language_Str MSG_BUTTON_DONE = _UxGT("Hotovo"); PROGMEM Language_Str MSG_BUTTON_BACK = _UxGT("Naspäť"); PROGMEM Language_Str MSG_BUTTON_PROCEED = _UxGT("Pokračovať"); + PROGMEM Language_Str MSG_BUTTON_SKIP = _UxGT("Preskočiť"); PROGMEM Language_Str MSG_PAUSING = _UxGT("Pozastavujem..."); PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Pozastaviť tlač"); PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Obnoviť tlač"); PROGMEM Language_Str MSG_HOST_START_PRINT = _UxGT("Spustiť z hosta"); PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Zastaviť tlač"); + PROGMEM Language_Str MSG_END_LOOPS = _UxGT("Koniec opak. sluč."); PROGMEM Language_Str MSG_PRINTING_OBJECT = _UxGT("Tlačím objekt"); PROGMEM Language_Str MSG_CANCEL_OBJECT = _UxGT("Zrušiť objekt"); PROGMEM Language_Str MSG_CANCEL_OBJECT_N = _UxGT("Zrušiť objekt ="); @@ -649,6 +672,8 @@ namespace Language_sk { PROGMEM Language_Str MSG_REHEATING = _UxGT("Zohrievanie..."); PROGMEM Language_Str MSG_PROBE_WIZARD = _UxGT("Sprievodca sondy Z"); + PROGMEM Language_Str MSG_PROBE_WIZARD_PROBING = _UxGT("Referencia Z"); + PROGMEM Language_Str MSG_PROBE_WIZARD_MOVING = _UxGT("Presúvam na pozíciu"); PROGMEM Language_Str MSG_SOUND = _UxGT("Zvuk"); From f0b662ff58a68511dbd704550bb7f358c5cbb4a4 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Mon, 1 Mar 2021 00:13:41 +0000 Subject: [PATCH 062/253] [cron] Bump distribution date (2021-03-01) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index df2dd278d9..193468838a 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2021-02-28" + #define STRING_DISTRIBUTION_DATE "2021-03-01" #endif /** From dd42831cba7334c5d106ba435bdb41b6135971bb Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 28 Feb 2021 19:43:46 -0600 Subject: [PATCH 063/253] Serial macros cleanup --- Marlin/src/HAL/LPC1768/eeprom_sdcard.cpp | 7 +++---- Marlin/src/HAL/shared/Delay.cpp | 11 ++++------- Marlin/src/MarlinCore.cpp | 5 ++--- Marlin/src/core/debug_out.h | 4 ++-- Marlin/src/core/debug_section.h | 4 ++-- Marlin/src/core/utility.cpp | 6 +++--- Marlin/src/feature/bedlevel/ubl/ubl.cpp | 4 ++-- Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp | 6 +++--- Marlin/src/feature/host_actions.cpp | 9 ++++----- Marlin/src/feature/max7219.cpp | 2 +- Marlin/src/feature/meatpack.cpp | 2 +- Marlin/src/feature/pause.cpp | 2 +- Marlin/src/feature/powerloss.cpp | 2 +- Marlin/src/feature/probe_temp_comp.cpp | 2 +- Marlin/src/feature/runout.h | 8 +++----- Marlin/src/feature/tmc_util.cpp | 6 +++--- Marlin/src/feature/twibus.cpp | 4 ++-- Marlin/src/gcode/bedlevel/G35.cpp | 2 +- Marlin/src/gcode/bedlevel/abl/G29.cpp | 2 +- Marlin/src/gcode/calibrate/G28.cpp | 2 +- Marlin/src/gcode/calibrate/G33.cpp | 6 +++--- Marlin/src/gcode/calibrate/M852.cpp | 2 +- Marlin/src/gcode/config/M217.cpp | 2 +- Marlin/src/gcode/config/M302.cpp | 2 +- Marlin/src/gcode/config/M43.cpp | 2 +- Marlin/src/gcode/control/M111.cpp | 2 +- Marlin/src/gcode/control/M80_M81.cpp | 2 +- Marlin/src/gcode/feature/L6470/M122.cpp | 12 ++++++------ Marlin/src/gcode/feature/L6470/M906.cpp | 2 +- Marlin/src/gcode/feature/powerloss/M1000.cpp | 2 +- Marlin/src/gcode/feature/powerloss/M413.cpp | 4 ++-- Marlin/src/gcode/feature/trinamic/M569.cpp | 3 +-- Marlin/src/gcode/geometry/G17-G19.cpp | 2 +- Marlin/src/gcode/host/M115.cpp | 4 ++-- Marlin/src/gcode/host/M360.cpp | 5 ++--- Marlin/src/gcode/queue.cpp | 3 +-- .../src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp | 2 +- Marlin/src/libs/L64XX/L64XX_Marlin.cpp | 8 ++++---- Marlin/src/libs/stopwatch.cpp | 2 +- Marlin/src/libs/vector_3.cpp | 7 ++----- Marlin/src/module/endstops.cpp | 5 ++--- Marlin/src/module/planner.cpp | 2 +- Marlin/src/module/printcounter.cpp | 6 +++--- Marlin/src/module/probe.cpp | 5 ++--- Marlin/src/module/settings.cpp | 12 ++++++------ Marlin/src/module/temperature.cpp | 10 +++++----- Marlin/src/pins/pinsDebug.h | 10 +++++----- Marlin/src/sd/cardreader.cpp | 4 ++-- 48 files changed, 101 insertions(+), 117 deletions(-) diff --git a/Marlin/src/HAL/LPC1768/eeprom_sdcard.cpp b/Marlin/src/HAL/LPC1768/eeprom_sdcard.cpp index b97b161dc9..70395251df 100644 --- a/Marlin/src/HAL/LPC1768/eeprom_sdcard.cpp +++ b/Marlin/src/HAL/LPC1768/eeprom_sdcard.cpp @@ -83,14 +83,13 @@ bool PersistentStore::access_finish() { static void debug_rw(const bool write, int &pos, const uint8_t *value, const size_t size, const FRESULT s, const size_t total=0) { PGM_P const rw_str = write ? PSTR("write") : PSTR("read"); SERIAL_CHAR(' '); - serialprintPGM(rw_str); + SERIAL_ECHOPGM_P(rw_str); SERIAL_ECHOLNPAIR("_data(", pos, ",", value, ",", size, ", ...)"); if (total) { SERIAL_ECHOPGM(" f_"); - serialprintPGM(rw_str); + SERIAL_ECHOPGM_P(rw_str); SERIAL_ECHOPAIR("()=", s, "\n size=", size, "\n bytes_"); - serialprintPGM(write ? PSTR("written=") : PSTR("read=")); - SERIAL_ECHOLN(total); + SERIAL_ECHOLNPAIR_P(write ? PSTR("written=") : PSTR("read="), total); } else SERIAL_ECHOLNPAIR(" f_lseek()=", s); diff --git a/Marlin/src/HAL/shared/Delay.cpp b/Marlin/src/HAL/shared/Delay.cpp index 8a021a2155..129698fd30 100644 --- a/Marlin/src/HAL/shared/Delay.cpp +++ b/Marlin/src/HAL/shared/Delay.cpp @@ -109,11 +109,11 @@ void dump_delay_accuracy_check() { auto report_call_time = [](PGM_P const name, PGM_P const unit, const uint32_t cycles, const uint32_t total, const bool do_flush=true) { SERIAL_ECHOPGM("Calling "); - serialprintPGM(name); + SERIAL_ECHOPGM_P(name); SERIAL_ECHOLNPAIR(" for ", cycles); - serialprintPGM(unit); + SERIAL_ECHOPGM_P(unit); SERIAL_ECHOLNPAIR(" took: ", total); - serialprintPGM(unit); + SERIAL_ECHOPGM_P(unit); if (do_flush) SERIAL_FLUSHTX(); }; @@ -169,10 +169,7 @@ void calibrate_delay_loop() {} #if ENABLED(MARLIN_DEV_MODE) - void dump_delay_accuracy_check() { - static PGMSTR(none, "N/A on this platform"); - serialprintPGM(none); - } + void dump_delay_accuracy_check() { SERIAL_ECHOPGM_P(PSTR("N/A on this platform")); } #endif #endif diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 4643328401..751d098606 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -885,8 +885,7 @@ void setup() { auto log_current_ms = [&](PGM_P const msg) { SERIAL_ECHO_START(); SERIAL_CHAR('['); SERIAL_ECHO(millis()); SERIAL_ECHOPGM("] "); - serialprintPGM(msg); - SERIAL_EOL(); + SERIAL_ECHOLNPGM_P(msg); }; #define SETUP_LOG(M) log_current_ms(PSTR(M)) #else @@ -1003,7 +1002,7 @@ void setup() { if (mcu & RST_SOFTWARE) SERIAL_ECHOLNPGM(STR_SOFTWARE_RESET); HAL_clear_reset_source(); - serialprintPGM(GET_TEXT(MSG_MARLIN)); + SERIAL_ECHOPGM_P(GET_TEXT(MSG_MARLIN)); SERIAL_CHAR(' '); SERIAL_ECHOLNPGM(SHORT_BUILD_VERSION); SERIAL_EOL(); diff --git a/Marlin/src/core/debug_out.h b/Marlin/src/core/debug_out.h index 6ae1b9d8bb..d93decf7ac 100644 --- a/Marlin/src/core/debug_out.h +++ b/Marlin/src/core/debug_out.h @@ -59,7 +59,7 @@ #include "debug_section.h" #define DEBUG_SECTION(N,S,D) SectionLog N(PSTR(S),D) - #define DEBUG_PRINT_P(P) serialprintPGM(P) + #define DEBUG_ECHOPGM_P(P) SERIAL_ECHOPGM_P(P) #define DEBUG_ECHO_START SERIAL_ECHO_START #define DEBUG_ERROR_START SERIAL_ERROR_START #define DEBUG_CHAR SERIAL_CHAR @@ -89,7 +89,7 @@ #else #define DEBUG_SECTION(...) NOOP - #define DEBUG_PRINT_P(P) NOOP + #define DEBUG_ECHOPGM_P(P) NOOP #define DEBUG_ECHO_START() NOOP #define DEBUG_ERROR_START() NOOP #define DEBUG_CHAR(...) NOOP diff --git a/Marlin/src/core/debug_section.h b/Marlin/src/core/debug_section.h index 7f39bc7424..2862d35af1 100644 --- a/Marlin/src/core/debug_section.h +++ b/Marlin/src/core/debug_section.h @@ -38,10 +38,10 @@ private: bool debug; void echo_msg(PGM_P const pre) { - serialprintPGM(pre); + SERIAL_ECHOPGM_P(pre); if (the_msg) { SERIAL_CHAR(' '); - serialprintPGM(the_msg); + SERIAL_ECHOPGM_P(the_msg); } SERIAL_CHAR(' '); print_xyz(current_position); diff --git a/Marlin/src/core/utility.cpp b/Marlin/src/core/utility.cpp index f999568167..3d7897f95a 100644 --- a/Marlin/src/core/utility.cpp +++ b/Marlin/src/core/utility.cpp @@ -92,9 +92,9 @@ void safe_delay(millis_t ms) { SERIAL_ECHOPGM(" (Aligned With"); if (probe.offset_xy.y > 0) - serialprintPGM(ENABLED(IS_SCARA) ? PSTR("-Distal") : PSTR("-Back")); + SERIAL_ECHOPGM_P(ENABLED(IS_SCARA) ? PSTR("-Distal") : PSTR("-Back")); else if (probe.offset_xy.y < 0) - serialprintPGM(ENABLED(IS_SCARA) ? PSTR("-Proximal") : PSTR("-Front")); + SERIAL_ECHOPGM_P(ENABLED(IS_SCARA) ? PSTR("-Proximal") : PSTR("-Front")); else if (probe.offset_xy.x != 0) SERIAL_ECHOPGM("-Center"); @@ -102,7 +102,7 @@ void safe_delay(millis_t ms) { #endif - serialprintPGM(probe.offset.z < 0 ? PSTR("Below") : probe.offset.z > 0 ? PSTR("Above") : PSTR("Same Z as")); + SERIAL_ECHOPGM_P(probe.offset.z < 0 ? PSTR("Below") : probe.offset.z > 0 ? PSTR("Above") : PSTR("Same Z as")); SERIAL_ECHOLNPGM(" Nozzle)"); #endif diff --git a/Marlin/src/feature/bedlevel/ubl/ubl.cpp b/Marlin/src/feature/bedlevel/ubl/ubl.cpp index 601f0ebb54..05b96daefa 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl.cpp @@ -181,7 +181,7 @@ void unified_bed_leveling::display_map(const int map_type) { } else { SERIAL_ECHOPGM(" for "); - serialprintPGM(csv ? PSTR("CSV:\n") : PSTR("LCD:\n")); + SERIAL_ECHOPGM_P(csv ? PSTR("CSV:\n") : PSTR("LCD:\n")); } // Add XY probe offset from extruder because probe.probe_at_point() subtracts them when @@ -212,7 +212,7 @@ void unified_bed_leveling::display_map(const int map_type) { // TODO: Display on Graphical LCD } else if (isnan(f)) - serialprintPGM(human ? PSTR(" . ") : PSTR("NAN")); + SERIAL_ECHOPGM_P(human ? PSTR(" . ") : PSTR("NAN")); else if (human || csv) { if (human && f >= 0.0) SERIAL_CHAR(f > 0 ? '+' : ' '); // Display sign also for positive numbers (' ' for 0) SERIAL_ECHO_F(f, 3); // Positive: 5 digits, Negative: 6 digits diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp index 044f6b610c..8c70feb661 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp @@ -908,11 +908,11 @@ void unified_bed_leveling::shift_mesh_height() { if (do_ubl_mesh_map) display_map(g29_map_type); // show user where we're probing if (parser.seen('B')) { - serialprintPGM(GET_TEXT(MSG_UBL_BC_INSERT)); + SERIAL_ECHOPGM_P(GET_TEXT(MSG_UBL_BC_INSERT)); LCD_MESSAGEPGM(MSG_UBL_BC_INSERT); } else { - serialprintPGM(GET_TEXT(MSG_UBL_BC_INSERT2)); + SERIAL_ECHOPGM_P(GET_TEXT(MSG_UBL_BC_INSERT2)); LCD_MESSAGEPGM(MSG_UBL_BC_INSERT2); } @@ -1576,7 +1576,7 @@ void unified_bed_leveling::smart_fill_mesh() { return normal.x * pos.x + normal.y * pos.y + zadd; }; auto debug_pt = [](PGM_P const pre, const xy_pos_t &pos, const float &zadd) { - d_from(); serialprintPGM(pre); + d_from(); SERIAL_ECHOPGM_P(pre); DEBUG_ECHO_F(normed(pos, zadd), 6); DEBUG_ECHOLNPAIR_F(" Z error = ", zadd - get_z_correction(pos), 6); }; diff --git a/Marlin/src/feature/host_actions.cpp b/Marlin/src/feature/host_actions.cpp index 77e4f3b9da..2a0b3dc3d5 100644 --- a/Marlin/src/feature/host_actions.cpp +++ b/Marlin/src/feature/host_actions.cpp @@ -40,7 +40,7 @@ void host_action(PGM_P const pstr, const bool eol) { PORT_REDIRECT(SERIAL_ALL); SERIAL_ECHOPGM("//action:"); - serialprintPGM(pstr); + SERIAL_ECHOPGM_P(pstr); if (eol) SERIAL_EOL(); } @@ -86,14 +86,13 @@ void host_action(PGM_P const pstr, const bool eol) { void host_action_notify_P(PGM_P const message) { PORT_REDIRECT(SERIAL_ALL); host_action(PSTR("notification "), false); - serialprintPGM(message); - SERIAL_EOL(); + SERIAL_ECHOLNPGM_P(message); } void host_action_prompt(PGM_P const ptype, const bool eol=true) { PORT_REDIRECT(SERIAL_ALL); host_action(PSTR("prompt_"), false); - serialprintPGM(ptype); + SERIAL_ECHOPGM_P(ptype); if (eol) SERIAL_EOL(); } @@ -101,7 +100,7 @@ void host_action(PGM_P const pstr, const bool eol) { host_action_prompt(ptype, false); PORT_REDIRECT(SERIAL_ALL); SERIAL_CHAR(' '); - serialprintPGM(pstr); + SERIAL_ECHOPGM_P(pstr); if (extra_char != '\0') SERIAL_CHAR(extra_char); SERIAL_EOL(); } diff --git a/Marlin/src/feature/max7219.cpp b/Marlin/src/feature/max7219.cpp index ebcb56490d..d7433cb7d9 100644 --- a/Marlin/src/feature/max7219.cpp +++ b/Marlin/src/feature/max7219.cpp @@ -127,7 +127,7 @@ uint8_t Max7219::suspended; // = 0; void Max7219::error(const char * const func, const int32_t v1, const int32_t v2/*=-1*/) { #if ENABLED(MAX7219_ERRORS) SERIAL_ECHOPGM("??? Max7219::"); - serialprintPGM(func); + SERIAL_ECHOPGM_P(func); SERIAL_CHAR('('); SERIAL_ECHO(v1); if (v2 > 0) SERIAL_ECHOPAIR(", ", v2); diff --git a/Marlin/src/feature/meatpack.cpp b/Marlin/src/feature/meatpack.cpp index cb3979ea0a..7e81dbed79 100644 --- a/Marlin/src/feature/meatpack.cpp +++ b/Marlin/src/feature/meatpack.cpp @@ -179,7 +179,7 @@ void MeatPack::report_state() { SERIAL_ECHOPGM("[MP] "); SERIAL_ECHOPGM(MeatPack_ProtocolVersion " "); serialprint_onoff(TEST(state, MPConfig_Bit_Active)); - serialprintPGM(TEST(state, MPConfig_Bit_NoSpaces) ? PSTR(" NSP\n") : PSTR(" ESP\n")); + SERIAL_ECHOPGM_P(TEST(state, MPConfig_Bit_NoSpaces) ? PSTR(" NSP\n") : PSTR(" ESP\n")); } /** diff --git a/Marlin/src/feature/pause.cpp b/Marlin/src/feature/pause.cpp index e0b4f88f9b..c1f951e764 100644 --- a/Marlin/src/feature/pause.cpp +++ b/Marlin/src/feature/pause.cpp @@ -460,7 +460,7 @@ void show_continue_prompt(const bool is_reload) { ui.pause_show_message(is_reload ? PAUSE_MESSAGE_INSERT : PAUSE_MESSAGE_WAITING); SERIAL_ECHO_START(); - serialprintPGM(is_reload ? PSTR(_PMSG(STR_FILAMENT_CHANGE_INSERT) "\n") : PSTR(_PMSG(STR_FILAMENT_CHANGE_WAIT) "\n")); + SERIAL_ECHOPGM_P(is_reload ? PSTR(_PMSG(STR_FILAMENT_CHANGE_INSERT) "\n") : PSTR(_PMSG(STR_FILAMENT_CHANGE_WAIT) "\n")); } void wait_for_confirmation(const bool is_reload/*=false*/, const int8_t max_beep_count/*=0*/ DXC_ARGS) { diff --git a/Marlin/src/feature/powerloss.cpp b/Marlin/src/feature/powerloss.cpp index 46b94dbc11..1b1f2bd681 100644 --- a/Marlin/src/feature/powerloss.cpp +++ b/Marlin/src/feature/powerloss.cpp @@ -531,7 +531,7 @@ void PrintJobRecovery::resume() { #if ENABLED(DEBUG_POWER_LOSS_RECOVERY) void PrintJobRecovery::debug(PGM_P const prefix) { - DEBUG_PRINT_P(prefix); + DEBUG_ECHOPGM_P(prefix); DEBUG_ECHOLNPAIR(" Job Recovery Info...\nvalid_head:", info.valid_head, " valid_foot:", info.valid_foot); if (info.valid_head) { if (info.valid_head == info.valid_foot) { diff --git a/Marlin/src/feature/probe_temp_comp.cpp b/Marlin/src/feature/probe_temp_comp.cpp index af8039d8b1..8fdf160d0f 100644 --- a/Marlin/src/feature/probe_temp_comp.cpp +++ b/Marlin/src/feature/probe_temp_comp.cpp @@ -73,7 +73,7 @@ void ProbeTempComp::print_offsets() { LOOP_L_N(s, TSI_COUNT) { float temp = cali_info[s].start_temp; for (int16_t i = -1; i < cali_info[s].measurements; ++i) { - serialprintPGM(s == TSI_BED ? PSTR("Bed") : + SERIAL_ECHOPGM_P(s == TSI_BED ? PSTR("Bed") : #if ENABLED(USE_TEMP_EXT_COMPENSATION) s == TSI_EXT ? PSTR("Extruder") : #endif diff --git a/Marlin/src/feature/runout.h b/Marlin/src/feature/runout.h index 60154c5e43..ecf47b22c2 100644 --- a/Marlin/src/feature/runout.h +++ b/Marlin/src/feature/runout.h @@ -287,7 +287,7 @@ class FilamentSensorBase { if (out != was_out) { was_out = out; SERIAL_ECHOPGM("Filament "); - serialprintPGM(out ? PSTR("OUT\n") : PSTR("IN\n")); + SERIAL_ECHOPGM_P(out ? PSTR("OUT\n") : PSTR("IN\n")); } #endif } @@ -320,10 +320,8 @@ class FilamentSensorBase { const millis_t ms = millis(); if (ELAPSED(ms, t)) { t = millis() + 1000UL; - LOOP_L_N(i, EXTRUDERS) { - serialprintPGM(i ? PSTR(", ") : PSTR("Remaining mm: ")); - SERIAL_ECHO(runout_mm_countdown[i]); - } + LOOP_L_N(i, EXTRUDERS) + SERIAL_ECHOPAIR_P(i ? PSTR(", ") : PSTR("Remaining mm: "), runout_mm_countdown[i]); SERIAL_EOL(); } #endif diff --git a/Marlin/src/feature/tmc_util.cpp b/Marlin/src/feature/tmc_util.cpp index a16af31e55..a4f71414a6 100644 --- a/Marlin/src/feature/tmc_util.cpp +++ b/Marlin/src/feature/tmc_util.cpp @@ -546,7 +546,7 @@ }; template - static void print_vsense(TMC &st) { serialprintPGM(st.vsense() ? PSTR("1=.18") : PSTR("0=.325")); } + static void print_vsense(TMC &st) { SERIAL_ECHOPGM_P(st.vsense() ? PSTR("1=.18") : PSTR("0=.325")); } #if HAS_DRIVER(TMC2130) || HAS_DRIVER(TMC5130) static void _tmc_status(TMC2130Stepper &st, const TMC_debug_enum i) { @@ -717,7 +717,7 @@ SERIAL_ECHO(st.cs()); SERIAL_ECHOPGM("/31"); break; - case TMC_VSENSE: serialprintPGM(st.vsense() ? PSTR("1=.165") : PSTR("0=.310")); break; + case TMC_VSENSE: SERIAL_ECHOPGM_P(st.vsense() ? PSTR("1=.165") : PSTR("0=.310")); break; case TMC_MICROSTEPS: SERIAL_ECHO(st.microsteps()); break; //case TMC_OTPW: serialprint_truefalse(st.otpw()); break; //case TMC_OTPW_TRIGGERED: serialprint_truefalse(st.getOTPW()); break; @@ -1208,7 +1208,7 @@ static bool test_connection(TMC &st) { case 1: stat = PSTR("HIGH"); break; case 2: stat = PSTR("LOW"); break; } - serialprintPGM(stat); + SERIAL_ECHOPGM_P(stat); SERIAL_EOL(); return test_result; diff --git a/Marlin/src/feature/twibus.cpp b/Marlin/src/feature/twibus.cpp index 855a3188d1..755224544c 100644 --- a/Marlin/src/feature/twibus.cpp +++ b/Marlin/src/feature/twibus.cpp @@ -83,7 +83,7 @@ void TWIBus::send() { // static void TWIBus::echoprefix(uint8_t bytes, const char pref[], uint8_t adr) { SERIAL_ECHO_START(); - serialprintPGM(pref); + SERIAL_ECHOPGM_P(pref); SERIAL_ECHOPAIR(": from:", adr, " bytes:", bytes, " data:"); } @@ -172,7 +172,7 @@ void TWIBus::flush() { // static void TWIBus::prefix(const char func[]) { SERIAL_ECHOPGM("TWIBus::"); - serialprintPGM(func); + SERIAL_ECHOPGM_P(func); SERIAL_ECHOPGM(": "); } void TWIBus::debug(const char func[], uint32_t adr) { diff --git a/Marlin/src/gcode/bedlevel/G35.cpp b/Marlin/src/gcode/bedlevel/G35.cpp index 5195ff87c0..88f02e6de2 100644 --- a/Marlin/src/gcode/bedlevel/G35.cpp +++ b/Marlin/src/gcode/bedlevel/G35.cpp @@ -114,7 +114,7 @@ void GcodeSuite::G35() { if (DEBUGGING(LEVELING)) { DEBUG_ECHOPAIR("Probing point ", i, " ("); - DEBUG_PRINT_P((char *)pgm_read_ptr(&tramming_point_name[i])); + DEBUG_ECHOPGM_P((char *)pgm_read_ptr(&tramming_point_name[i])); DEBUG_CHAR(')'); DEBUG_ECHOLNPAIR_P(SP_X_STR, screws_tilt_adjust_pos[i].x, SP_Y_STR, screws_tilt_adjust_pos[i].y, SP_Z_STR, z_probed_height); } diff --git a/Marlin/src/gcode/bedlevel/abl/G29.cpp b/Marlin/src/gcode/bedlevel/abl/G29.cpp index 233e7f7415..e642c1ccf2 100644 --- a/Marlin/src/gcode/bedlevel/abl/G29.cpp +++ b/Marlin/src/gcode/bedlevel/abl/G29.cpp @@ -786,7 +786,7 @@ G29_TYPE GcodeSuite::G29() { float min_diff = 999; auto print_topo_map = [&](PGM_P const title, const bool get_min) { - serialprintPGM(title); + SERIAL_ECHOPGM_P(title); for (int8_t yy = abl_grid_points.y - 1; yy >= 0; yy--) { LOOP_L_N(xx, abl_grid_points.x) { const int ind = indexIntoAB[xx][yy]; diff --git a/Marlin/src/gcode/calibrate/G28.cpp b/Marlin/src/gcode/calibrate/G28.cpp index a2de1dfe38..430daf6ba2 100644 --- a/Marlin/src/gcode/calibrate/G28.cpp +++ b/Marlin/src/gcode/calibrate/G28.cpp @@ -259,7 +259,7 @@ void GcodeSuite::G28() { #if HAS_HOMING_CURRENT auto debug_current = [](PGM_P const s, const int16_t a, const int16_t b){ - serialprintPGM(s); DEBUG_ECHOLNPAIR(" current: ", a, " -> ", b); + DEBUG_ECHOPGM_P(s); DEBUG_ECHOLNPAIR(" current: ", a, " -> ", b); }; #if HAS_CURRENT_HOME(X) const int16_t tmc_save_current_X = stepperX.getMilliamps(); diff --git a/Marlin/src/gcode/calibrate/G33.cpp b/Marlin/src/gcode/calibrate/G33.cpp index 77cc45771c..5530bc7089 100644 --- a/Marlin/src/gcode/calibrate/G33.cpp +++ b/Marlin/src/gcode/calibrate/G33.cpp @@ -93,7 +93,7 @@ void ac_cleanup(TERN_(HAS_MULTI_HOTEND, const uint8_t old_tool_index)) { void print_signed_float(PGM_P const prefix, const float &f) { SERIAL_ECHOPGM(" "); - serialprintPGM(prefix); + SERIAL_ECHOPGM_P(prefix); SERIAL_CHAR(':'); if (f >= 0) SERIAL_CHAR('+'); SERIAL_ECHO_F(f, 2); @@ -449,7 +449,7 @@ void GcodeSuite::G33() { // Report settings PGM_P const checkingac = PSTR("Checking... AC"); - serialprintPGM(checkingac); + SERIAL_ECHOPGM_P(checkingac); if (verbose_level == 0) SERIAL_ECHOPGM(" (DRY-RUN)"); SERIAL_EOL(); ui.set_status_P(checkingac); @@ -625,7 +625,7 @@ void GcodeSuite::G33() { } else { // dry run PGM_P const enddryrun = PSTR("End DRY-RUN"); - serialprintPGM(enddryrun); + SERIAL_ECHOPGM_P(enddryrun); SERIAL_ECHO_SP(35); SERIAL_ECHOLNPAIR_F("std dev:", zero_std_dev, 3); diff --git a/Marlin/src/gcode/calibrate/M852.cpp b/Marlin/src/gcode/calibrate/M852.cpp index b60f41748f..e52f03b86c 100644 --- a/Marlin/src/gcode/calibrate/M852.cpp +++ b/Marlin/src/gcode/calibrate/M852.cpp @@ -93,7 +93,7 @@ void GcodeSuite::M852() { if (!ijk) { SERIAL_ECHO_START(); - serialprintPGM(GET_TEXT(MSG_SKEW_FACTOR)); + SERIAL_ECHOPGM_P(GET_TEXT(MSG_SKEW_FACTOR)); SERIAL_ECHOPAIR_F(" XY: ", planner.skew_factor.xy, 6); #if ENABLED(SKEW_CORRECTION_FOR_Z) SERIAL_ECHOPAIR_F(" XZ: ", planner.skew_factor.xz, 6); diff --git a/Marlin/src/gcode/config/M217.cpp b/Marlin/src/gcode/config/M217.cpp index ebe1dbc03c..2035ae55ab 100644 --- a/Marlin/src/gcode/config/M217.cpp +++ b/Marlin/src/gcode/config/M217.cpp @@ -36,7 +36,7 @@ void M217_report(const bool eeprom=false) { #if ENABLED(TOOLCHANGE_FILAMENT_SWAP) - serialprintPGM(eeprom ? PSTR(" M217") : PSTR("Toolchange:")); + SERIAL_ECHOPGM_P(eeprom ? PSTR(" M217") : PSTR("Toolchange:")); SERIAL_ECHOPAIR(" S", LINEAR_UNIT(toolchange_settings.swap_length)); SERIAL_ECHOPAIR_P(SP_B_STR, LINEAR_UNIT(toolchange_settings.extra_resume), SP_E_STR, LINEAR_UNIT(toolchange_settings.extra_prime), diff --git a/Marlin/src/gcode/config/M302.cpp b/Marlin/src/gcode/config/M302.cpp index afdc6c9e85..e3ce5a10ef 100644 --- a/Marlin/src/gcode/config/M302.cpp +++ b/Marlin/src/gcode/config/M302.cpp @@ -55,7 +55,7 @@ void GcodeSuite::M302() { // Report current state SERIAL_ECHO_START(); SERIAL_ECHOPGM("Cold extrudes are "); - serialprintPGM(thermalManager.allow_cold_extrude ? PSTR("en") : PSTR("dis")); + SERIAL_ECHOPGM_P(thermalManager.allow_cold_extrude ? PSTR("en") : PSTR("dis")); SERIAL_ECHOLNPAIR("abled (min temp ", thermalManager.extrude_min_temp, "C)"); } } diff --git a/Marlin/src/gcode/config/M43.cpp b/Marlin/src/gcode/config/M43.cpp index 42a74fb54f..4009721a57 100644 --- a/Marlin/src/gcode/config/M43.cpp +++ b/Marlin/src/gcode/config/M43.cpp @@ -303,7 +303,7 @@ void GcodeSuite::M43() { if (parser.seen('E')) { endstops.monitor_flag = parser.value_bool(); SERIAL_ECHOPGM("endstop monitor "); - serialprintPGM(endstops.monitor_flag ? PSTR("en") : PSTR("dis")); + SERIAL_ECHOPGM_P(endstops.monitor_flag ? PSTR("en") : PSTR("dis")); SERIAL_ECHOLNPGM("abled"); return; } diff --git a/Marlin/src/gcode/control/M111.cpp b/Marlin/src/gcode/control/M111.cpp index 38cb065322..8e677080e0 100644 --- a/Marlin/src/gcode/control/M111.cpp +++ b/Marlin/src/gcode/control/M111.cpp @@ -49,7 +49,7 @@ void GcodeSuite::M111() { LOOP_L_N(i, COUNT(debug_strings)) { if (TEST(marlin_debug_flags, i)) { if (comma++) SERIAL_CHAR(','); - serialprintPGM((char*)pgm_read_ptr(&debug_strings[i])); + SERIAL_ECHOPGM_P((char*)pgm_read_ptr(&debug_strings[i])); } } } diff --git a/Marlin/src/gcode/control/M80_M81.cpp b/Marlin/src/gcode/control/M80_M81.cpp index 394b06d8ac..1b5ea2f7ef 100644 --- a/Marlin/src/gcode/control/M80_M81.cpp +++ b/Marlin/src/gcode/control/M80_M81.cpp @@ -56,7 +56,7 @@ // S: Report the current power supply state and exit if (parser.seen('S')) { - serialprintPGM(powersupply_on ? PSTR("PS:1\n") : PSTR("PS:0\n")); + SERIAL_ECHOPGM_P(powersupply_on ? PSTR("PS:1\n") : PSTR("PS:0\n")); return; } diff --git a/Marlin/src/gcode/feature/L6470/M122.cpp b/Marlin/src/gcode/feature/L6470/M122.cpp index d2b7f73997..cfac427642 100644 --- a/Marlin/src/gcode/feature/L6470/M122.cpp +++ b/Marlin/src/gcode/feature/L6470/M122.cpp @@ -41,16 +41,16 @@ inline void L6470_say_status(const L64XX_axis_t axis) { SERIAL_ECHO(temp_buf); print_bin(sh.STATUS_AXIS_RAW); switch (sh.STATUS_AXIS_LAYOUT) { - case L6470_STATUS_LAYOUT: serialprintPGM(PSTR(" L6470")); break; - case L6474_STATUS_LAYOUT: serialprintPGM(PSTR(" L6474")); break; - case L6480_STATUS_LAYOUT: serialprintPGM(PSTR(" L6480/powerSTEP01")); break; + case L6470_STATUS_LAYOUT: SERIAL_ECHOPGM(" L6470"); break; + case L6474_STATUS_LAYOUT: SERIAL_ECHOPGM(" L6474"); break; + case L6480_STATUS_LAYOUT: SERIAL_ECHOPGM(" L6480/powerSTEP01"); break; } #endif SERIAL_ECHOPGM("\n...OUTPUT: "); - serialprintPGM(sh.STATUS_AXIS & STATUS_HIZ ? PSTR("OFF") : PSTR("ON ")); + SERIAL_ECHOPGM_P(sh.STATUS_AXIS & STATUS_HIZ ? PSTR("OFF") : PSTR("ON ")); SERIAL_ECHOPGM(" BUSY: "); echo_yes_no((sh.STATUS_AXIS & STATUS_BUSY) == 0); SERIAL_ECHOPGM(" DIR: "); - serialprintPGM((((sh.STATUS_AXIS & STATUS_DIR) >> 4) ^ L64xxManager.index_to_dir[axis]) ? PSTR("FORWARD") : PSTR("REVERSE")); + SERIAL_ECHOPGM_P((((sh.STATUS_AXIS & STATUS_DIR) >> 4) ^ L64xxManager.index_to_dir[axis]) ? PSTR("FORWARD") : PSTR("REVERSE")); if (sh.STATUS_AXIS_LAYOUT == L6480_STATUS_LAYOUT) { SERIAL_ECHOPGM(" Last Command: "); if (sh.STATUS_AXIS & sh.STATUS_AXIS_WRONG_CMD) SERIAL_ECHOPGM("VALID"); @@ -67,7 +67,7 @@ inline void L6470_say_status(const L64XX_axis_t axis) { SERIAL_ECHOPGM(" Last Command: "); if (!(sh.STATUS_AXIS & sh.STATUS_AXIS_WRONG_CMD)) SERIAL_ECHOPGM("IN"); SERIAL_ECHOPGM("VALID "); - serialprintPGM(sh.STATUS_AXIS & sh.STATUS_AXIS_NOTPERF_CMD ? PSTR("COMPLETED ") : PSTR("Not PERFORMED")); + SERIAL_ECHOPGM_P(sh.STATUS_AXIS & sh.STATUS_AXIS_NOTPERF_CMD ? PSTR("COMPLETED ") : PSTR("Not PERFORMED")); SERIAL_ECHOPAIR("\n...THERMAL: ", !(sh.STATUS_AXIS & sh.STATUS_AXIS_TH_SD) ? "SHUTDOWN " : !(sh.STATUS_AXIS & sh.STATUS_AXIS_TH_WRN) ? "WARNING " : "OK "); } SERIAL_ECHOPGM(" OVERCURRENT:"); echo_yes_no((sh.STATUS_AXIS & sh.STATUS_AXIS_OCD) == 0); diff --git a/Marlin/src/gcode/feature/L6470/M906.cpp b/Marlin/src/gcode/feature/L6470/M906.cpp index 7bd446a1ab..3638fae45b 100644 --- a/Marlin/src/gcode/feature/L6470/M906.cpp +++ b/Marlin/src/gcode/feature/L6470/M906.cpp @@ -132,7 +132,7 @@ void L64XX_report_current(L64XX &motor, const L64XX_axis_t axis) { SERIAL_ECHOPAIR("...MicroSteps: ", MicroSteps, " ADC_OUT: ", L6470_ADC_out); SERIAL_ECHOPGM(" Vs_compensation: "); - serialprintPGM((motor.GetParam(sh.L6470_AXIS_CONFIG) & CONFIG_EN_VSCOMP) ? PSTR("ENABLED ") : PSTR("DISABLED")); + SERIAL_ECHOPGM_P((motor.GetParam(sh.L6470_AXIS_CONFIG) & CONFIG_EN_VSCOMP) ? PSTR("ENABLED ") : PSTR("DISABLED")); SERIAL_ECHOLNPAIR(" Compensation coefficient: ~", comp_coef * 0.01f); SERIAL_ECHOPAIR("...KVAL_HOLD: ", motor.GetParam(L6470_KVAL_HOLD), diff --git a/Marlin/src/gcode/feature/powerloss/M1000.cpp b/Marlin/src/gcode/feature/powerloss/M1000.cpp index 14c92531fa..a31b7732f4 100644 --- a/Marlin/src/gcode/feature/powerloss/M1000.cpp +++ b/Marlin/src/gcode/feature/powerloss/M1000.cpp @@ -40,7 +40,7 @@ void menu_job_recovery(); inline void plr_error(PGM_P const prefix) { #if ENABLED(DEBUG_POWER_LOSS_RECOVERY) DEBUG_ECHO_START(); - serialprintPGM(prefix); + DEBUG_ECHOPGM_P(prefix); DEBUG_ECHOLNPGM(" Job Recovery Data"); #else UNUSED(prefix); diff --git a/Marlin/src/gcode/feature/powerloss/M413.cpp b/Marlin/src/gcode/feature/powerloss/M413.cpp index 64573e5dff..e6e3ac3b3c 100644 --- a/Marlin/src/gcode/feature/powerloss/M413.cpp +++ b/Marlin/src/gcode/feature/powerloss/M413.cpp @@ -54,8 +54,8 @@ void GcodeSuite::M413() { #if PIN_EXISTS(POWER_LOSS) if (parser.seen('O')) recovery._outage(); #endif - if (parser.seen('E')) serialprintPGM(recovery.exists() ? PSTR("PLR Exists\n") : PSTR("No PLR\n")); - if (parser.seen('V')) serialprintPGM(recovery.valid() ? PSTR("Valid\n") : PSTR("Invalid\n")); + if (parser.seen('E')) SERIAL_ECHOPGM_P(recovery.exists() ? PSTR("PLR Exists\n") : PSTR("No PLR\n")); + if (parser.seen('V')) SERIAL_ECHOPGM_P(recovery.valid() ? PSTR("Valid\n") : PSTR("Invalid\n")); #endif } diff --git a/Marlin/src/gcode/feature/trinamic/M569.cpp b/Marlin/src/gcode/feature/trinamic/M569.cpp index 6b379f1190..a92812004f 100644 --- a/Marlin/src/gcode/feature/trinamic/M569.cpp +++ b/Marlin/src/gcode/feature/trinamic/M569.cpp @@ -32,8 +32,7 @@ template void tmc_say_stealth_status(TMC &st) { st.printLabel(); SERIAL_ECHOPGM(" driver mode:\t"); - serialprintPGM(st.get_stealthChop() ? PSTR("stealthChop") : PSTR("spreadCycle")); - SERIAL_EOL(); + SERIAL_ECHOLNPGM_P(st.get_stealthChop() ? PSTR("stealthChop") : PSTR("spreadCycle")); } template void tmc_set_stealthChop(TMC &st, const bool enable) { diff --git a/Marlin/src/gcode/geometry/G17-G19.cpp b/Marlin/src/gcode/geometry/G17-G19.cpp index 7510eaba8c..0154598ccb 100644 --- a/Marlin/src/gcode/geometry/G17-G19.cpp +++ b/Marlin/src/gcode/geometry/G17-G19.cpp @@ -29,7 +29,7 @@ inline void report_workspace_plane() { SERIAL_ECHO_START(); SERIAL_ECHOPGM("Workspace Plane "); - serialprintPGM( + SERIAL_ECHOPGM_P( gcode.workspace_plane == GcodeSuite::PLANE_YZ ? PSTR("YZ\n") : gcode.workspace_plane == GcodeSuite::PLANE_ZX ? PSTR("ZX\n") : PSTR("XY\n") diff --git a/Marlin/src/gcode/host/M115.cpp b/Marlin/src/gcode/host/M115.cpp index 40fdbd6d3a..ac712aea07 100644 --- a/Marlin/src/gcode/host/M115.cpp +++ b/Marlin/src/gcode/host/M115.cpp @@ -34,8 +34,8 @@ #if ENABLED(EXTENDED_CAPABILITIES_REPORT) static void cap_line(PGM_P const name, bool ena=false) { SERIAL_ECHOPGM("Cap:"); - serialprintPGM(name); - SERIAL_CHAR(':', ena ? '1' : '0'); + SERIAL_ECHOPGM_P(name); + SERIAL_CHAR(':', '0' + ena); SERIAL_EOL(); } #endif diff --git a/Marlin/src/gcode/host/M360.cpp b/Marlin/src/gcode/host/M360.cpp index b0bd4a3b8e..50a4e45426 100644 --- a/Marlin/src/gcode/host/M360.cpp +++ b/Marlin/src/gcode/host/M360.cpp @@ -34,10 +34,9 @@ static void config_prefix(PGM_P const name, PGM_P const pref=nullptr, const int8_t ind=-1) { SERIAL_ECHOPGM("Config:"); - if (pref) serialprintPGM(pref); + if (pref) SERIAL_ECHOPGM_P(pref); if (ind >= 0) { SERIAL_ECHO(ind); SERIAL_CHAR(':'); } - serialprintPGM(name); - SERIAL_CHAR(':'); + SERIAL_ECHOPAIR_P(name, AS_CHAR(':')); } static void config_line(PGM_P const name, const float val, PGM_P const pref=nullptr, const int8_t ind=-1) { config_prefix(name, pref, ind); diff --git a/Marlin/src/gcode/queue.cpp b/Marlin/src/gcode/queue.cpp index 7ce8211484..ebf95f86c6 100644 --- a/Marlin/src/gcode/queue.cpp +++ b/Marlin/src/gcode/queue.cpp @@ -304,8 +304,7 @@ inline int read_serial(const uint8_t index) { return SERIAL_IMPL.read(index); } void GCodeQueue::gcode_line_error(PGM_P const err, const serial_index_t serial_ind) { PORT_REDIRECT(SERIAL_PORTMASK(serial_ind)); // Reply to the serial port that sent the command SERIAL_ERROR_START(); - SERIAL_ECHOPGM_P(err); - SERIAL_ECHOLN(serial_state[serial_ind].last_N); + SERIAL_ECHOLNPAIR_P(err, serial_state[serial_ind].last_N); while (read_serial(serial_ind) != -1) { /* nada */ } // Clear out the RX buffer. Why don't use flush here ? flush_and_request_resend(); serial_state[serial_ind].count = 0; diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp index 37f3c4e320..fd91138a4f 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp @@ -290,7 +290,7 @@ namespace Anycubic { void ChironTFT::SendtoTFT(PGM_P str) { // A helper to print PROGMEN string to the panel #if ACDEBUG(AC_SOME) - serialprintPGM(str); + SERIAL_ECHOPGM_P(str); #endif while (const char c = pgm_read_byte(str++)) TFTSer.write(c); } diff --git a/Marlin/src/libs/L64XX/L64XX_Marlin.cpp b/Marlin/src/libs/L64XX/L64XX_Marlin.cpp index 0358f3f59a..d079e0b4b3 100644 --- a/Marlin/src/libs/L64XX/L64XX_Marlin.cpp +++ b/Marlin/src/libs/L64XX/L64XX_Marlin.cpp @@ -37,8 +37,6 @@ L64XX_Marlin L64xxManager; #include "../../module/planner.h" #include "../../HAL/shared/Delay.h" -void echo_yes_no(const bool yes) { serialprintPGM(yes ? PSTR(" YES") : PSTR(" NO ")); } - static const char str_X[] PROGMEM = "X ", str_Y[] PROGMEM = "Y ", str_Z[] PROGMEM = "Z ", str_X2[] PROGMEM = "X2", str_Y2[] PROGMEM = "Y2", str_Z2[] PROGMEM = "Z2", str_Z3[] PROGMEM = "Z3", str_Z4[] PROGMEM = "Z4", @@ -56,6 +54,8 @@ PGM_P const L64XX_Marlin::index_to_axis[] PROGMEM = { #define DEBUG_OUT ENABLED(L6470_CHITCHAT) #include "../../core/debug_out.h" +void echo_yes_no(const bool yes) { DEBUG_ECHOPGM_P(yes ? PSTR(" YES") : PSTR(" NO ")); UNUSED(yes); } + uint8_t L64XX_Marlin::dir_commands[MAX_L64XX]; // array to hold direction command for each driver const uint8_t L64XX_Marlin::index_to_dir[MAX_L64XX] = { @@ -375,7 +375,7 @@ inline void echo_min_max(const char a, const float &min, const float &max) { } inline void echo_oct_used(const float &oct, const uint8_t stall) { DEBUG_ECHOPAIR("over_current_threshold used : ", oct); - serialprintPGM(stall ? PSTR(" (Stall") : PSTR(" (OCD")); + DEBUG_ECHOPGM_P(stall ? PSTR(" (Stall") : PSTR(" (OCD")); DEBUG_ECHOLNPGM(" threshold)"); } inline void err_out_of_bounds() { DEBUG_ECHOLNPGM("Test aborted - motion out of bounds"); } @@ -652,7 +652,7 @@ void L64XX_Marlin::say_axis(const L64XX_axis_t axis, const uint8_t label/*=true* ) { say_axis(axis); DEBUG_ECHOPGM(" THERMAL: "); - serialprintPGM((status & _status_axis_th_sd) ? PSTR("SHUTDOWN") : (status & _status_axis_th_wrn) ? PSTR("WARNING ") : PSTR("OK ")); + DEBUG_ECHOPGM_P((status & _status_axis_th_sd) ? PSTR("SHUTDOWN") : (status & _status_axis_th_wrn) ? PSTR("WARNING ") : PSTR("OK ")); DEBUG_ECHOPGM(" OVERCURRENT: "); echo_yes_no((status & _status_axis_ocd) != 0); if (!(_status_axis_layout == L6474_STATUS_LAYOUT)) { // L6474 doesn't have these bits diff --git a/Marlin/src/libs/stopwatch.cpp b/Marlin/src/libs/stopwatch.cpp index 601efe5517..adfaa3b043 100644 --- a/Marlin/src/libs/stopwatch.cpp +++ b/Marlin/src/libs/stopwatch.cpp @@ -98,7 +98,7 @@ millis_t Stopwatch::duration() { void Stopwatch::debug(const char func[]) { if (DEBUGGING(INFO)) { SERIAL_ECHOPGM("Stopwatch::"); - serialprintPGM(func); + SERIAL_ECHOPGM_P(func); SERIAL_ECHOLNPGM("()"); } } diff --git a/Marlin/src/libs/vector_3.cpp b/Marlin/src/libs/vector_3.cpp index 6f87a523e0..0ef29f33bd 100644 --- a/Marlin/src/libs/vector_3.cpp +++ b/Marlin/src/libs/vector_3.cpp @@ -77,7 +77,7 @@ void vector_3::apply_rotation(const matrix_3x3 &matrix) { } void vector_3::debug(PGM_P const title) { - serialprintPGM(title); + SERIAL_ECHOPGM_P(title); SERIAL_ECHOPAIR_F_P(SP_X_STR, x, 6); SERIAL_ECHOPAIR_F_P(SP_Y_STR, y, 6); SERIAL_ECHOLNPAIR_F_P(SP_Z_STR, z, 6); @@ -139,10 +139,7 @@ matrix_3x3 matrix_3x3::transpose(const matrix_3x3 &original) { } void matrix_3x3::debug(PGM_P const title) { - if (title) { - serialprintPGM(title); - SERIAL_EOL(); - } + if (title) SERIAL_ECHOLNPGM_P(title); LOOP_L_N(i, 3) { LOOP_L_N(j, 3) { if (vectors[i][j] >= 0.0) SERIAL_CHAR('+'); diff --git a/Marlin/src/module/endstops.cpp b/Marlin/src/module/endstops.cpp index b9d2c1cdf5..9550799a2d 100644 --- a/Marlin/src/module/endstops.cpp +++ b/Marlin/src/module/endstops.cpp @@ -405,10 +405,9 @@ void Endstops::event_handler() { } static void print_es_state(const bool is_hit, PGM_P const label=nullptr) { - if (label) serialprintPGM(label); + if (label) SERIAL_ECHOPGM_P(label); SERIAL_ECHOPGM(": "); - serialprintPGM(is_hit ? PSTR(STR_ENDSTOP_HIT) : PSTR(STR_ENDSTOP_OPEN)); - SERIAL_EOL(); + SERIAL_ECHOLNPGM_P(is_hit ? PSTR(STR_ENDSTOP_HIT) : PSTR(STR_ENDSTOP_OPEN)); } void _O2 Endstops::report_states() { diff --git a/Marlin/src/module/planner.cpp b/Marlin/src/module/planner.cpp index 7fcf37e044..dd87a0d24d 100644 --- a/Marlin/src/module/planner.cpp +++ b/Marlin/src/module/planner.cpp @@ -2973,7 +2973,7 @@ inline void limit_and_warn(float &val, const uint8_t axis, PGM_P const setting_n if (before != val) { SERIAL_CHAR(axis_codes[lim_axis]); SERIAL_ECHOPGM(" Max "); - serialprintPGM(setting_name); + SERIAL_ECHOPGM_P(setting_name); SERIAL_ECHOLNPAIR(" limited to ", val); } } diff --git a/Marlin/src/module/printcounter.cpp b/Marlin/src/module/printcounter.cpp index 45072c8f01..1caaee352a 100644 --- a/Marlin/src/module/printcounter.cpp +++ b/Marlin/src/module/printcounter.cpp @@ -118,7 +118,7 @@ void PrintCounter::initStats() { inline bool _service_warn(const char * const msg) { _print_divider(); SERIAL_ECHO_START(); - serialprintPGM(msg); + SERIAL_ECHOPGM_P(msg); SERIAL_ECHOLNPGM("!"); _print_divider(); return true; @@ -177,7 +177,7 @@ void PrintCounter::saveStats() { #if HAS_SERVICE_INTERVALS inline void _service_when(char buffer[], const char * const msg, const uint32_t when) { SERIAL_ECHOPGM(STR_STATS); - serialprintPGM(msg); + SERIAL_ECHOPGM_P(msg); SERIAL_ECHOLNPAIR(" in ", duration_t(when).toString(buffer)); } #endif @@ -339,7 +339,7 @@ void PrintCounter::reset() { void PrintCounter::debug(const char func[]) { if (DEBUGGING(INFO)) { SERIAL_ECHOPGM("PrintCounter::"); - serialprintPGM(func); + SERIAL_ECHOPGM_P(func); SERIAL_ECHOLNPGM("()"); } } diff --git a/Marlin/src/module/probe.cpp b/Marlin/src/module/probe.cpp index d7fafc8932..7dcf1dff31 100644 --- a/Marlin/src/module/probe.cpp +++ b/Marlin/src/module/probe.cpp @@ -279,8 +279,7 @@ FORCE_INLINE void probe_specific_action(const bool deploy) { PGM_P const ds_str = deploy ? GET_TEXT(MSG_MANUAL_DEPLOY) : GET_TEXT(MSG_MANUAL_STOW); ui.return_to_status(); // To display the new status message ui.set_status_P(ds_str, 99); - serialprintPGM(ds_str); - SERIAL_EOL(); + SERIAL_ECHOLNPGM_P(ds_str); TERN_(HOST_PROMPT_SUPPORT, host_prompt_do(PROMPT_USER_CONTINUE, PSTR("Stow Probe"), CONTINUE_STR)); TERN_(EXTENSIBLE_UI, ExtUI::onUserConfirmRequired_P(PSTR("Stow Probe"))); @@ -586,7 +585,7 @@ float Probe::run_z_probe(const bool sanity_check/*=true*/) { early_fail = (scheck && current_position.z > -offset.z + clearance); // Probe triggered too high? #if ENABLED(DEBUG_LEVELING_FEATURE) if (DEBUGGING(LEVELING) && (probe_fail || early_fail)) { - DEBUG_PRINT_P(plbl); + DEBUG_ECHOPGM_P(plbl); DEBUG_ECHOPGM(" Probe fail! -"); if (probe_fail) DEBUG_ECHOPGM(" No trigger."); if (early_fail) DEBUG_ECHOPGM(" Triggered early."); diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index f4b4bf0b8b..d78d97e688 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -2990,7 +2990,7 @@ void MarlinSettings::reset() { if (!repl) { SERIAL_ECHO_START(); SERIAL_ECHOPGM("; "); - serialprintPGM(pstr); + SERIAL_ECHOPGM_P(pstr); if (eol) SERIAL_EOL(); } } @@ -3007,7 +3007,7 @@ void MarlinSettings::reset() { SERIAL_ECHOPGM(" M569 S1"); if (etc) { SERIAL_CHAR(' '); - serialprintPGM(etc); + SERIAL_ECHOPGM_P(etc); } if (newLine) SERIAL_EOL(); } @@ -3025,7 +3025,7 @@ void MarlinSettings::reset() { #endif inline void say_units(const bool colon) { - serialprintPGM( + SERIAL_ECHOPGM_P( #if ENABLED(INCH_MODE_SUPPORT) parser.linear_unit_factor != 1.0 ? PSTR(" (in)") : #endif @@ -3066,7 +3066,7 @@ void MarlinSettings::reset() { SERIAL_ECHOPGM(" M149 "); SERIAL_CHAR(parser.temp_units_code()); SERIAL_ECHOPGM(" ; Units in "); - serialprintPGM(parser.temp_units_name()); + SERIAL_ECHOPGM_P(parser.temp_units_name()); #else SERIAL_ECHOLNPGM(" M149 C ; Units in Celsius"); #endif @@ -3254,12 +3254,12 @@ void MarlinSettings::reset() { LOOP_L_N(py, GRID_MAX_POINTS_Y) { LOOP_L_N(px, GRID_MAX_POINTS_X) { CONFIG_ECHO_START(); - SERIAL_ECHOPAIR_P(PSTR(" G29 S3 I"), px, PSTR(" J"), py); + SERIAL_ECHOPAIR(" G29 S3 I", px, " J", py); SERIAL_ECHOLNPAIR_F_P(SP_Z_STR, LINEAR_UNIT(mbl.z_values[px][py]), 5); } } CONFIG_ECHO_START(); - SERIAL_ECHOLNPAIR_F_P(PSTR(" G29 S4 Z"), LINEAR_UNIT(mbl.z_offset), 5); + SERIAL_ECHOLNPAIR_F(" G29 S4 Z", LINEAR_UNIT(mbl.z_offset), 5); } #elif ENABLED(AUTO_BED_LEVELING_UBL) diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index e85e48c2d4..be98972b77 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -664,9 +664,9 @@ volatile bool Temperature::raw_temps_ready = false; #if EITHER(PIDTEMPBED, PIDTEMPCHAMBER) PGM_P const estring = GHV(PSTR("chamber"), PSTR("bed"), NUL_STR); - say_default_(); serialprintPGM(estring); SERIAL_ECHOLNPAIR("Kp ", tune_pid.Kp); - say_default_(); serialprintPGM(estring); SERIAL_ECHOLNPAIR("Ki ", tune_pid.Ki); - say_default_(); serialprintPGM(estring); SERIAL_ECHOLNPAIR("Kd ", tune_pid.Kd); + say_default_(); SERIAL_ECHOPGM_P(estring); SERIAL_ECHOLNPAIR("Kp ", tune_pid.Kp); + say_default_(); SERIAL_ECHOPGM_P(estring); SERIAL_ECHOLNPAIR("Ki ", tune_pid.Ki); + say_default_(); SERIAL_ECHOPGM_P(estring); SERIAL_ECHOLNPAIR("Kd ", tune_pid.Kd); #else say_default_(); SERIAL_ECHOLNPAIR("Kp ", tune_pid.Kp); say_default_(); SERIAL_ECHOLNPAIR("Ki ", tune_pid.Ki); @@ -868,7 +868,7 @@ void Temperature::_temp_error(const heater_id_t heater_id, PGM_P const serial_ms if (IsRunning() && TERN1(BOGUS_TEMPERATURE_GRACE_PERIOD, killed == 2)) { SERIAL_ERROR_START(); - serialprintPGM(serial_msg); + SERIAL_ECHOPGM_P(serial_msg); SERIAL_ECHOPGM(STR_STOPPED_HEATER); if (heater_id >= 0) SERIAL_ECHO(heater_id); @@ -1532,7 +1532,7 @@ void Temperature::manage_heater() { SERIAL_ECHOPAIR_F_P(SP_B_STR, t.beta, 1); SERIAL_ECHOPAIR_F_P(SP_C_STR, t.sh_c_coeff, 9); SERIAL_ECHOPGM(" ; "); - serialprintPGM( + SERIAL_ECHOPGM_P( TERN_(TEMP_SENSOR_0_IS_CUSTOM, t_index == CTI_HOTEND_0 ? PSTR("HOTEND 0") :) TERN_(TEMP_SENSOR_1_IS_CUSTOM, t_index == CTI_HOTEND_1 ? PSTR("HOTEND 1") :) TERN_(TEMP_SENSOR_2_IS_CUSTOM, t_index == CTI_HOTEND_2 ? PSTR("HOTEND 2") :) diff --git a/Marlin/src/pins/pinsDebug.h b/Marlin/src/pins/pinsDebug.h index 5f153cfa2b..e2e56081b7 100644 --- a/Marlin/src/pins/pinsDebug.h +++ b/Marlin/src/pins/pinsDebug.h @@ -238,7 +238,7 @@ const PinInfo pin_array[] PROGMEM = { #endif static void print_input_or_output(const bool isout) { - serialprintPGM(isout ? PSTR("Output = ") : PSTR("Input = ")); + SERIAL_ECHOPGM_P(isout ? PSTR("Output = ") : PSTR("Input = ")); } // pretty report with PWM info @@ -266,8 +266,8 @@ inline void report_pin_state_extended(pin_t pin, const bool ignore, const bool e LOOP_L_N(x, COUNT(pin_array)) { // scan entire array and report all instances of this pin if (GET_ARRAY_PIN(x) == pin) { if (!found) { // report digital and analog pin number only on the first time through - if (start_string) serialprintPGM(start_string); - serialprintPGM(PSTR("PIN: ")); + if (start_string) SERIAL_ECHOPGM_P(start_string); + SERIAL_ECHOPGM("PIN: "); PRINT_PIN(pin); PRINT_PORT(pin); if (int8_t(DIGITAL_PIN_TO_ANALOG_PIN(pin)) >= 0) { @@ -317,8 +317,8 @@ inline void report_pin_state_extended(pin_t pin, const bool ignore, const bool e } // end of for loop if (!found) { - if (start_string) serialprintPGM(start_string); - serialprintPGM(PSTR("PIN: ")); + if (start_string) SERIAL_ECHOPGM_P(start_string); + SERIAL_ECHOPGM("PIN: "); PRINT_PIN(pin); PRINT_PORT(pin); if (int8_t(DIGITAL_PIN_TO_ANALOG_PIN(pin)) >= 0) { diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp index fd26bdd671..c973ba5945 100644 --- a/Marlin/src/sd/cardreader.cpp +++ b/Marlin/src/sd/cardreader.cpp @@ -552,7 +552,7 @@ void announceOpen(const uint8_t doing, const char * const path) { PORT_REDIRECT(SERIAL_ALL); SERIAL_ECHO_START(); SERIAL_ECHOPGM("Now "); - serialprintPGM(doing == 1 ? PSTR("doing") : PSTR("fresh")); + SERIAL_ECHOPGM_P(doing == 1 ? PSTR("doing") : PSTR("fresh")); SERIAL_ECHOLNPAIR(" file: ", path); } } @@ -1251,7 +1251,7 @@ void CardReader::fileHasFinished() { removeFile(recovery.filename); #if ENABLED(DEBUG_POWER_LOSS_RECOVERY) SERIAL_ECHOPGM("Power-loss file delete"); - serialprintPGM(jobRecoverFileExists() ? PSTR(" failed.\n") : PSTR("d.\n")); + SERIAL_ECHOPGM_P(jobRecoverFileExists() ? PSTR(" failed.\n") : PSTR("d.\n")); #endif } } From 1aa421efe54eef40a5ba2ba7706908a4ca384586 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 28 Feb 2021 19:50:17 -0600 Subject: [PATCH 064/253] Filament sensor cleanup --- Marlin/src/feature/pause.cpp | 6 +----- Marlin/src/feature/runout.cpp | 6 +----- Marlin/src/feature/runout.h | 12 ++++++------ Marlin/src/gcode/feature/pause/M600.cpp | 2 +- Marlin/src/inc/Conditionals_adv.h | 3 +++ Marlin/src/lcd/extui/ui_api.cpp | 8 ++++++-- Marlin/src/lcd/extui/ui_api.h | 1 + Marlin/src/pins/ramps/pins_RAMPS_CREALITY.h | 2 +- 8 files changed, 20 insertions(+), 20 deletions(-) diff --git a/Marlin/src/feature/pause.cpp b/Marlin/src/feature/pause.cpp index c1f951e764..a6a28925ed 100644 --- a/Marlin/src/feature/pause.cpp +++ b/Marlin/src/feature/pause.cpp @@ -192,11 +192,7 @@ bool load_filament(const float &slow_load_length/*=0*/, const float &fast_load_l KEEPALIVE_STATE(PAUSED_FOR_USER); wait_for_user = true; // LCD click or M108 will clear this #if ENABLED(HOST_PROMPT_SUPPORT) - const char tool = '0' - #if NUM_RUNOUT_SENSORS > 1 - + active_extruder - #endif - ; + const char tool = '0' + TERN0(MULTI_FILAMENT_SENSOR, active_extruder); host_prompt_do(PROMPT_USER_CONTINUE, PSTR("Load Filament T"), tool, CONTINUE_STR); #endif diff --git a/Marlin/src/feature/runout.cpp b/Marlin/src/feature/runout.cpp index be769d2dc8..17d2c74003 100644 --- a/Marlin/src/feature/runout.cpp +++ b/Marlin/src/feature/runout.cpp @@ -88,11 +88,7 @@ void event_filament_runout() { TERN_(EXTENSIBLE_UI, ExtUI::onFilamentRunout(ExtUI::getActiveTool())); #if EITHER(HOST_PROMPT_SUPPORT, HOST_ACTION_COMMANDS) - const char tool = '0' - #if NUM_RUNOUT_SENSORS > 1 - + active_extruder - #endif - ; + const char tool = '0' + TERN0(MULTI_FILAMENT_SENSOR, active_extruder); #endif //action:out_of_filament diff --git a/Marlin/src/feature/runout.h b/Marlin/src/feature/runout.h index ecf47b22c2..d253071ef4 100644 --- a/Marlin/src/feature/runout.h +++ b/Marlin/src/feature/runout.h @@ -230,7 +230,7 @@ class FilamentSensorBase { change = old_state ^ new_state; old_state = new_state; - #ifdef FILAMENT_RUNOUT_SENSOR_DEBUG + #if ENABLED(FILAMENT_RUNOUT_SENSOR_DEBUG) if (change) { SERIAL_ECHOPGM("Motion detected:"); LOOP_L_N(e, NUM_RUNOUT_SENSORS) @@ -266,12 +266,12 @@ class FilamentSensorBase { private: static inline bool poll_runout_state(const uint8_t extruder) { const uint8_t runout_states = poll_runout_states(); - #if NUM_RUNOUT_SENSORS == 1 - UNUSED(extruder); - #else + #if MULTI_FILAMENT_SENSOR if ( !TERN0(DUAL_X_CARRIAGE, idex_is_duplicating()) && !TERN0(MULTI_NOZZLE_DUPLICATION, extruder_duplication_enabled) ) return TEST(runout_states, extruder); // A specific extruder ran out + #else + UNUSED(extruder); #endif return !!runout_states; // Any extruder ran out } @@ -282,7 +282,7 @@ class FilamentSensorBase { static inline void run() { const bool out = poll_runout_state(active_extruder); if (!out) filament_present(active_extruder); - #ifdef FILAMENT_RUNOUT_SENSOR_DEBUG + #if ENABLED(FILAMENT_RUNOUT_SENSOR_DEBUG) static bool was_out = false; if (out != was_out) { was_out = out; @@ -315,7 +315,7 @@ class FilamentSensorBase { } static inline void run() { - #ifdef FILAMENT_RUNOUT_SENSOR_DEBUG + #if ENABLED(FILAMENT_RUNOUT_SENSOR_DEBUG) static millis_t t = 0; const millis_t ms = millis(); if (ELAPSED(ms, t)) { diff --git a/Marlin/src/gcode/feature/pause/M600.cpp b/Marlin/src/gcode/feature/pause/M600.cpp index 1c282f2052..1033025fe3 100644 --- a/Marlin/src/gcode/feature/pause/M600.cpp +++ b/Marlin/src/gcode/feature/pause/M600.cpp @@ -83,7 +83,7 @@ void GcodeSuite::M600() { int8_t DXC_ext = target_extruder; if (!parser.seen('T')) { // If no tool index is specified, M600 was (probably) sent in response to filament runout. // In this case, for duplicating modes set DXC_ext to the extruder that ran out. - #if HAS_FILAMENT_SENSOR && NUM_RUNOUT_SENSORS > 1 + #if MULTI_FILAMENT_SENSOR if (idex_is_duplicating()) DXC_ext = (READ(FIL_RUNOUT2_PIN) == FIL_RUNOUT2_STATE) ? 1 : 0; #else diff --git a/Marlin/src/inc/Conditionals_adv.h b/Marlin/src/inc/Conditionals_adv.h index b8464df3dd..4738cda20a 100644 --- a/Marlin/src/inc/Conditionals_adv.h +++ b/Marlin/src/inc/Conditionals_adv.h @@ -128,6 +128,9 @@ #if ENABLED(FILAMENT_RUNOUT_SENSOR) #define HAS_FILAMENT_SENSOR 1 + #if NUM_RUNOUT_SENSORS > 1 + #define MULTI_FILAMENT_SENSOR 1 + #endif #ifdef FILAMENT_RUNOUT_DISTANCE_MM #define HAS_FILAMENT_RUNOUT_DISTANCE 1 #endif diff --git a/Marlin/src/lcd/extui/ui_api.cpp b/Marlin/src/lcd/extui/ui_api.cpp index d1ffb4c437..7c178a0339 100644 --- a/Marlin/src/lcd/extui/ui_api.cpp +++ b/Marlin/src/lcd/extui/ui_api.cpp @@ -340,8 +340,10 @@ namespace ExtUI { #endif } - extruder_t getActiveTool() { - switch (active_extruder) { + extruder_t getTool(const uint8_t extruder) { + switch (extruder) { + case 7: return E7; + case 6: return E6; case 5: return E5; case 4: return E4; case 3: return E3; @@ -351,6 +353,8 @@ namespace ExtUI { } } + extruder_t getActiveTool() { return getTool(active_extruder); } + bool isMoving() { return planner.has_blocks_queued(); } bool canMove(const axis_t axis) { diff --git a/Marlin/src/lcd/extui/ui_api.h b/Marlin/src/lcd/extui/ui_api.h index bfd658b0d9..4214ba5821 100644 --- a/Marlin/src/lcd/extui/ui_api.h +++ b/Marlin/src/lcd/extui/ui_api.h @@ -215,6 +215,7 @@ namespace ExtUI { void setAxisMaxJerk_mm_s(const float, const extruder_t); #endif + extruder_t getTool(const uint8_t extruder); extruder_t getActiveTool(); void setActiveTool(const extruder_t, bool no_move); diff --git a/Marlin/src/pins/ramps/pins_RAMPS_CREALITY.h b/Marlin/src/pins/ramps/pins_RAMPS_CREALITY.h index 1dc898e6ca..05de208ca1 100644 --- a/Marlin/src/pins/ramps/pins_RAMPS_CREALITY.h +++ b/Marlin/src/pins/ramps/pins_RAMPS_CREALITY.h @@ -35,7 +35,7 @@ #define MOSFET_D_PIN 7 #define FIL_RUNOUT_PIN 2 -#if NUM_RUNOUT_SENSORS > 1 +#if NUM_RUNOUT_SENSORS >= 2 #define FIL_RUNOUT2_PIN 15 // Creality CR-X can use dual runout sensors #endif From 713de872ce055bd10bd59b4f811136b0ec0cfbae Mon Sep 17 00:00:00 2001 From: Stephan Date: Mon, 1 Mar 2021 03:16:22 +0100 Subject: [PATCH 065/253] Filament Runout handling for Mixing Extruder (#20327) Co-authored-by: Scott Lahteine --- Marlin/Configuration.h | 7 ++- Marlin/src/feature/runout.cpp | 30 +++++++--- Marlin/src/feature/runout.h | 96 +++++++++++++++++++++++-------- Marlin/src/inc/Conditionals_adv.h | 3 + Marlin/src/inc/SanityCheck.h | 32 +++++------ Marlin/src/module/endstops.cpp | 32 +++++------ buildroot/tests/mega2560-tests | 8 ++- 7 files changed, 139 insertions(+), 69 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 79b7f9dffa..46b70eb72d 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -1278,6 +1278,8 @@ #define FIL_RUNOUT_STATE LOW // Pin state indicating that filament is NOT present. #define FIL_RUNOUT_PULLUP // Use internal pullup for filament runout pins. //#define FIL_RUNOUT_PULLDOWN // Use internal pulldown for filament runout pins. + //#define WATCH_ALL_RUNOUT_SENSORS // Execute runout script on any triggering sensor, not only for the active extruder. + // This is automatically enabled for MIXING_EXTRUDERs. // Override individually if the runout sensors vary //#define FIL_RUNOUT1_STATE LOW @@ -1312,8 +1314,9 @@ //#define FIL_RUNOUT8_PULLUP //#define FIL_RUNOUT8_PULLDOWN - // Set one or more commands to execute on filament runout. - // (After 'M412 H' Marlin will ask the host to handle the process.) + // Commands to execute on filament runout. + // With multiple runout sensors use the %c placeholder for the current tool in commands (e.g., "M600 T%c") + // NOTE: After 'M412 H1' the host handles filament runout and this script does not apply. #define FILAMENT_RUNOUT_SCRIPT "M600" // After a runout is detected, continue printing this length of filament diff --git a/Marlin/src/feature/runout.cpp b/Marlin/src/feature/runout.cpp index 17d2c74003..531ca1081f 100644 --- a/Marlin/src/feature/runout.cpp +++ b/Marlin/src/feature/runout.cpp @@ -47,12 +47,12 @@ bool FilamentMonitorBase::enabled = true, #if HAS_FILAMENT_RUNOUT_DISTANCE float RunoutResponseDelayed::runout_distance_mm = FILAMENT_RUNOUT_DISTANCE_MM; - volatile float RunoutResponseDelayed::runout_mm_countdown[EXTRUDERS]; + volatile float RunoutResponseDelayed::runout_mm_countdown[NUM_RUNOUT_SENSORS]; #if ENABLED(FILAMENT_MOTION_SENSOR) uint8_t FilamentSensorEncoder::motion_detected; #endif #else - int8_t RunoutResponseDebounced::runout_count; // = 0 + int8_t RunoutResponseDebounced::runout_count[NUM_RUNOUT_SENSORS]; // = 0 #endif // @@ -70,7 +70,7 @@ bool FilamentMonitorBase::enabled = true, #include "../lcd/extui/ui_api.h" #endif -void event_filament_runout() { +void event_filament_runout(const uint8_t extruder) { if (did_pause_print) return; // Action already in progress. Purge triggered repeated runout. @@ -85,10 +85,10 @@ void event_filament_runout() { } #endif - TERN_(EXTENSIBLE_UI, ExtUI::onFilamentRunout(ExtUI::getActiveTool())); + TERN_(EXTENSIBLE_UI, ExtUI::onFilamentRunout(ExtUI::getTool(extruder))); - #if EITHER(HOST_PROMPT_SUPPORT, HOST_ACTION_COMMANDS) - const char tool = '0' + TERN0(MULTI_FILAMENT_SENSOR, active_extruder); + #if ANY(HOST_PROMPT_SUPPORT, HOST_ACTION_COMMANDS, MULTI_FILAMENT_SENSOR) + const char tool = '0' + TERN0(MULTI_FILAMENT_SENSOR, extruder); #endif //action:out_of_filament @@ -124,8 +124,22 @@ void event_filament_runout() { SERIAL_EOL(); #endif // HOST_ACTION_COMMANDS - if (run_runout_script) - queue.inject_P(PSTR(FILAMENT_RUNOUT_SCRIPT)); + if (run_runout_script) { + #if MULTI_FILAMENT_SENSOR + char script[strlen(FILAMENT_RUNOUT_SCRIPT) + 1]; + sprintf_P(script, PSTR(FILAMENT_RUNOUT_SCRIPT), tool); + #if ENABLED(FILAMENT_RUNOUT_SENSOR_DEBUG) + SERIAL_ECHOLNPAIR("Runout Command: ", script); + #endif + queue.inject(script); + #else + #if ENABLED(FILAMENT_RUNOUT_SENSOR_DEBUG) + SERIAL_ECHOPGM("Runout Command: "); + SERIAL_ECHOLNPGM(FILAMENT_RUNOUT_SCRIPT); + #endif + queue.inject_P(PSTR(FILAMENT_RUNOUT_SCRIPT)); + #endif + } } #endif // HAS_FILAMENT_SENSOR diff --git a/Marlin/src/feature/runout.h b/Marlin/src/feature/runout.h index d253071ef4..34ae67899b 100644 --- a/Marlin/src/feature/runout.h +++ b/Marlin/src/feature/runout.h @@ -43,7 +43,7 @@ #define FILAMENT_RUNOUT_THRESHOLD 5 #endif -void event_filament_runout(); +void event_filament_runout(const uint8_t extruder); template class TFilamentMonitor; @@ -119,11 +119,41 @@ class TFilamentMonitor : public FilamentMonitorBase { TERN_(HAS_FILAMENT_RUNOUT_DISTANCE, cli()); // Prevent RunoutResponseDelayed::block_completed from accumulating here response.run(); sensor.run(); - const bool ran_out = response.has_run_out(); + const uint8_t runout_flags = response.has_run_out(); TERN_(HAS_FILAMENT_RUNOUT_DISTANCE, sei()); + #if MULTI_FILAMENT_SENSOR + #if ENABLED(WATCH_ALL_RUNOUT_SENSORS) + const bool ran_out = !!runout_flags; // any sensor triggers + uint8_t extruder = 0; + if (ran_out) { + uint8_t bitmask = runout_flags; + while (!(bitmask & 1)) { + bitmask >>= 1; + extruder++; + } + } + #else + const bool ran_out = TEST(runout_flags, active_extruder); // suppress non active extruders + uint8_t extruder = active_extruder; + #endif + #else + const bool ran_out = !!runout_flags; + uint8_t extruder = active_extruder; + #endif + + #if ENABLED(FILAMENT_RUNOUT_SENSOR_DEBUG) + if (runout_flags) { + SERIAL_ECHOPGM("Runout Sensors: "); + LOOP_L_N(i, 8) SERIAL_ECHO('0' + TEST(runout_flags, i)); + SERIAL_ECHOPAIR(" -> ", extruder); + if (ran_out) SERIAL_ECHOPGM(" RUN OUT"); + SERIAL_EOL(); + } + #endif + if (ran_out) { filament_ran_out = true; - event_filament_runout(); + event_filament_runout(extruder); planner.synchronize(); } } @@ -280,16 +310,17 @@ class FilamentSensorBase { static inline void block_completed(const block_t* const) {} static inline void run() { - const bool out = poll_runout_state(active_extruder); - if (!out) filament_present(active_extruder); - #if ENABLED(FILAMENT_RUNOUT_SENSOR_DEBUG) - static bool was_out = false; - if (out != was_out) { - was_out = out; - SERIAL_ECHOPGM("Filament "); - SERIAL_ECHOPGM_P(out ? PSTR("OUT\n") : PSTR("IN\n")); - } - #endif + LOOP_L_N(s, NUM_RUNOUT_SENSORS) { + const bool out = poll_runout_state(s); + if (!out) filament_present(s); + #if ENABLED(FILAMENT_RUNOUT_SENSOR_DEBUG) + static uint8_t was_out; // = 0 + if (out != TEST(was_out, s)) { + TBI(was_out, s); + SERIAL_ECHOLNPAIR_P(PSTR("Filament Sensor "), '0' + s, out ? PSTR(" OUT") : PSTR(" IN")); + } + #endif + } } }; @@ -305,13 +336,13 @@ class FilamentSensorBase { // during a runout condition. class RunoutResponseDelayed { private: - static volatile float runout_mm_countdown[EXTRUDERS]; + static volatile float runout_mm_countdown[NUM_RUNOUT_SENSORS]; public: static float runout_distance_mm; static inline void reset() { - LOOP_L_N(i, EXTRUDERS) filament_present(i); + LOOP_L_N(i, NUM_RUNOUT_SENSORS) filament_present(i); } static inline void run() { @@ -320,15 +351,17 @@ class FilamentSensorBase { const millis_t ms = millis(); if (ELAPSED(ms, t)) { t = millis() + 1000UL; - LOOP_L_N(i, EXTRUDERS) + LOOP_L_N(i, NUM_RUNOUT_SENSORS) SERIAL_ECHOPAIR_P(i ? PSTR(", ") : PSTR("Remaining mm: "), runout_mm_countdown[i]); SERIAL_EOL(); } #endif } - static inline bool has_run_out() { - return runout_mm_countdown[active_extruder] < 0; + static inline uint8_t has_run_out() { + uint8_t runout_flags = 0; + LOOP_L_N(i, NUM_RUNOUT_SENSORS) if (runout_mm_countdown[i] < 0) SBI(runout_flags, i); + return runout_flags; } static inline void filament_present(const uint8_t extruder) { @@ -353,13 +386,28 @@ class FilamentSensorBase { class RunoutResponseDebounced { private: static constexpr int8_t runout_threshold = FILAMENT_RUNOUT_THRESHOLD; - static int8_t runout_count; + static int8_t runout_count[NUM_RUNOUT_SENSORS]; + public: - static inline void reset() { runout_count = runout_threshold; } - static inline void run() { if (runout_count >= 0) runout_count--; } - static inline bool has_run_out() { return runout_count < 0; } - static inline void block_completed(const block_t* const) { } - static inline void filament_present(const uint8_t) { runout_count = runout_threshold; } + static inline void reset() { + LOOP_L_N(i, NUM_RUNOUT_SENSORS) filament_present(i); + } + + static inline void run() { + LOOP_L_N(i, NUM_RUNOUT_SENSORS) if (runout_count[i] >= 0) runout_count[i]--; + } + + static inline uint8_t has_run_out() { + uint8_t runout_flags = 0; + LOOP_L_N(i, NUM_RUNOUT_SENSORS) if (runout_count[i] < 0) SBI(runout_flags, i); + return runout_flags; + } + + static inline void block_completed(const block_t* const) { } + + static inline void filament_present(const uint8_t extruder) { + runout_count[extruder] = runout_threshold; + } }; #endif // !HAS_FILAMENT_RUNOUT_DISTANCE diff --git a/Marlin/src/inc/Conditionals_adv.h b/Marlin/src/inc/Conditionals_adv.h index 4738cda20a..43f20b6dfd 100644 --- a/Marlin/src/inc/Conditionals_adv.h +++ b/Marlin/src/inc/Conditionals_adv.h @@ -134,6 +134,9 @@ #ifdef FILAMENT_RUNOUT_DISTANCE_MM #define HAS_FILAMENT_RUNOUT_DISTANCE 1 #endif + #if ENABLED(MIXING_EXTRUDER) + #define WATCH_ALL_RUNOUT_SENSORS + #endif #endif // Let SD_FINISHED_RELEASECOMMAND stand in for SD_FINISHED_STEPPERRELEASE diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index b6678a4bcb..6581f629b0 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -823,26 +823,24 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #if HAS_FILAMENT_SENSOR #if !PIN_EXISTS(FIL_RUNOUT) #error "FILAMENT_RUNOUT_SENSOR requires FIL_RUNOUT_PIN." - #elif NUM_RUNOUT_SENSORS > E_STEPPERS - #if HAS_PRUSA_MMU2 + #elif HAS_PRUSA_MMU2 && NUM_RUNOUT_SENSORS != 1 #error "NUM_RUNOUT_SENSORS must be 1 with MMU2 / MMU2S." - #else - #error "NUM_RUNOUT_SENSORS cannot exceed the number of E steppers." - #endif - #elif NUM_RUNOUT_SENSORS >= 2 && !PIN_EXISTS(FIL_RUNOUT2) - #error "FIL_RUNOUT2_PIN is required with NUM_RUNOUT_SENSORS >= 2." - #elif NUM_RUNOUT_SENSORS >= 3 && !PIN_EXISTS(FIL_RUNOUT3) - #error "FIL_RUNOUT3_PIN is required with NUM_RUNOUT_SENSORS >= 3." - #elif NUM_RUNOUT_SENSORS >= 4 && !PIN_EXISTS(FIL_RUNOUT4) - #error "FIL_RUNOUT4_PIN is required with NUM_RUNOUT_SENSORS >= 4." - #elif NUM_RUNOUT_SENSORS >= 5 && !PIN_EXISTS(FIL_RUNOUT5) - #error "FIL_RUNOUT5_PIN is required with NUM_RUNOUT_SENSORS >= 5." - #elif NUM_RUNOUT_SENSORS >= 6 && !PIN_EXISTS(FIL_RUNOUT6) - #error "FIL_RUNOUT6_PIN is required with NUM_RUNOUT_SENSORS >= 6." - #elif NUM_RUNOUT_SENSORS >= 7 && !PIN_EXISTS(FIL_RUNOUT7) - #error "FIL_RUNOUT7_PIN is required with NUM_RUNOUT_SENSORS >= 7." + #elif NUM_RUNOUT_SENSORS != 1 && NUM_RUNOUT_SENSORS != E_STEPPERS + #error "NUM_RUNOUT_SENSORS must be either 1 or number of E steppers." #elif NUM_RUNOUT_SENSORS >= 8 && !PIN_EXISTS(FIL_RUNOUT8) #error "FIL_RUNOUT8_PIN is required with NUM_RUNOUT_SENSORS >= 8." + #elif NUM_RUNOUT_SENSORS >= 7 && !PIN_EXISTS(FIL_RUNOUT7) + #error "FIL_RUNOUT7_PIN is required with NUM_RUNOUT_SENSORS >= 7." + #elif NUM_RUNOUT_SENSORS >= 6 && !PIN_EXISTS(FIL_RUNOUT6) + #error "FIL_RUNOUT6_PIN is required with NUM_RUNOUT_SENSORS >= 6." + #elif NUM_RUNOUT_SENSORS >= 5 && !PIN_EXISTS(FIL_RUNOUT5) + #error "FIL_RUNOUT5_PIN is required with NUM_RUNOUT_SENSORS >= 5." + #elif NUM_RUNOUT_SENSORS >= 4 && !PIN_EXISTS(FIL_RUNOUT4) + #error "FIL_RUNOUT4_PIN is required with NUM_RUNOUT_SENSORS >= 4." + #elif NUM_RUNOUT_SENSORS >= 3 && !PIN_EXISTS(FIL_RUNOUT3) + #error "FIL_RUNOUT3_PIN is required with NUM_RUNOUT_SENSORS >= 3." + #elif NUM_RUNOUT_SENSORS >= 2 && !PIN_EXISTS(FIL_RUNOUT2) + #error "FIL_RUNOUT2_PIN is required with NUM_RUNOUT_SENSORS >= 2." #elif BOTH(FIL_RUNOUT1_PULLUP, FIL_RUNOUT1_PULLDOWN) #error "You can't enable FIL_RUNOUT1_PULLUP and FIL_RUNOUT1_PULLDOWN at the same time." #elif BOTH(FIL_RUNOUT2_PULLUP, FIL_RUNOUT2_PULLDOWN) diff --git a/Marlin/src/module/endstops.cpp b/Marlin/src/module/endstops.cpp index 9550799a2d..4192b444bb 100644 --- a/Marlin/src/module/endstops.cpp +++ b/Marlin/src/module/endstops.cpp @@ -468,24 +468,22 @@ void _O2 Endstops::report_states() { #if HAS_CUSTOM_PROBE_PIN print_es_state(PROBE_TRIGGERED(), PSTR(STR_Z_PROBE)); #endif - #if HAS_FILAMENT_SENSOR - #if NUM_RUNOUT_SENSORS == 1 - print_es_state(READ(FIL_RUNOUT1_PIN) != FIL_RUNOUT1_STATE, PSTR(STR_FILAMENT_RUNOUT_SENSOR)); - #else - #define _CASE_RUNOUT(N) case N: pin = FIL_RUNOUT##N##_PIN; state = FIL_RUNOUT##N##_STATE; break; - LOOP_S_LE_N(i, 1, NUM_RUNOUT_SENSORS) { - pin_t pin; - uint8_t state; - switch (i) { - default: continue; - REPEAT_S(1, INCREMENT(NUM_RUNOUT_SENSORS), _CASE_RUNOUT) - } - SERIAL_ECHOPGM(STR_FILAMENT_RUNOUT_SENSOR); - if (i > 1) SERIAL_CHAR(' ', '0' + i); - print_es_state(extDigitalRead(pin) != state); + #if MULTI_FILAMENT_SENSOR + #define _CASE_RUNOUT(N) case N: pin = FIL_RUNOUT##N##_PIN; state = FIL_RUNOUT##N##_STATE; break; + LOOP_S_LE_N(i, 1, NUM_RUNOUT_SENSORS) { + pin_t pin; + uint8_t state; + switch (i) { + default: continue; + REPEAT_S(1, INCREMENT(NUM_RUNOUT_SENSORS), _CASE_RUNOUT) } - #undef _CASE_RUNOUT - #endif + SERIAL_ECHOPGM(STR_FILAMENT_RUNOUT_SENSOR); + if (i > 1) SERIAL_CHAR(' ', '0' + i); + print_es_state(extDigitalRead(pin) != state); + } + #undef _CASE_RUNOUT + #elif HAS_FILAMENT_SENSOR + print_es_state(READ(FIL_RUNOUT1_PIN) != FIL_RUNOUT1_STATE, PSTR(STR_FILAMENT_RUNOUT_SENSOR)); #endif TERN_(BLTOUCH, bltouch._reset_SW_mode()); diff --git a/buildroot/tests/mega2560-tests b/buildroot/tests/mega2560-tests index aef2b8756a..d74aa30f88 100755 --- a/buildroot/tests/mega2560-tests +++ b/buildroot/tests/mega2560-tests @@ -94,8 +94,14 @@ restore_configs opt_set MOTHERBOARD BOARD_AZTEEG_X3_PRO opt_set LCD_LANGUAGE el_gr opt_enable MIXING_EXTRUDER GRADIENT_MIX GRADIENT_VTOOL CR10_STOCKDISPLAY \ - USE_CONTROLLER_FAN CONTROLLER_FAN_EDITABLE CONTROLLER_FAN_IGNORE_Z + USE_CONTROLLER_FAN CONTROLLER_FAN_EDITABLE CONTROLLER_FAN_IGNORE_Z \ + FILAMENT_RUNOUT_SENSOR ADVANCED_PAUSE_FEATURE NOZZLE_PARK_FEATURE opt_set MIXING_STEPPERS 5 +opt_set NUM_RUNOUT_SENSORS E_STEPPERS +opt_set FIL_RUNOUT2_PIN 16 +opt_set FIL_RUNOUT3_PIN 17 +opt_set FIL_RUNOUT4_PIN 4 +opt_set FIL_RUNOUT5_PIN 5 opt_set LCD_LANGUAGE ru exec_test $1 $2 "Azteeg X3 | Mixing Extruder (x5) | Gradient Mix | Greek" "$3" From f52cba6aff5e8e3675070a965e8b74adc810d728 Mon Sep 17 00:00:00 2001 From: Marcio T Date: Sun, 28 Feb 2021 19:52:59 -0700 Subject: [PATCH 066/253] Minor FTDI EVE Touch UI fixes (#21232) --- Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp | 2 +- .../ftdi_eve_touch_ui/screens/cocoa_press_load_chocolate.cpp | 2 +- .../ftdi_eve_touch_ui/screens/cocoa_press_load_chocolate.h | 2 +- .../ftdi_eve_touch_ui/screens/cocoa_press_move_e_screen.cpp | 2 +- .../ftdi_eve_touch_ui/screens/cocoa_press_status_screen.cpp | 5 ++--- .../src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.cpp | 1 + 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp index 0fef87b64c..6cbc534110 100644 --- a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp @@ -20,7 +20,7 @@ * */ -#include "../../../../inc/MarlinConfigPre.h" +#include "../../../../../inc/MarlinConfigPre.h" #if ENABLED(DGUS_LCD_UI_MKS) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_load_chocolate.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_load_chocolate.cpp index 8b87c4ae41..d9c01366b9 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_load_chocolate.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_load_chocolate.cpp @@ -187,7 +187,7 @@ bool LoadChocolateScreen::onTouchHeld(uint8_t tag) { break; } case 3: { - if (get_chocolate_fill_level() > 0.9) { + if (get_chocolate_fill_level() > 0.75) { mydata.repeat_tag = 0; return false; } diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_load_chocolate.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_load_chocolate.h index 582a62fe05..819464495b 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_load_chocolate.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_load_chocolate.h @@ -32,12 +32,12 @@ struct LoadChocolateScreenData { class LoadChocolateScreen : public BaseScreen, public CachedScreen { private: - static void setManualFeedrateAndIncrement(float feedrate_mm_s, float &increment); static void draw_syringe(draw_mode_t what); static void draw_arrows(draw_mode_t what); static void draw_buttons(draw_mode_t what); static void draw_text(draw_mode_t what); public: + static void setManualFeedrateAndIncrement(float feedrate_mm_s, float &increment); static void onEntry(); static void onIdle(); static void onRedraw(draw_mode_t); diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_move_e_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_move_e_screen.cpp index d199b492e4..2621ef64fe 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_move_e_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_move_e_screen.cpp @@ -34,7 +34,7 @@ constexpr static MoveAxisScreenData &mydata = screen_data.MoveAxisScreen; void MoveEScreen::onRedraw(draw_mode_t what) { widgets_t w(what); - w.precision(1); + w.precision(1, DEFAULT_MIDRANGE); w.units(GET_TEXT_F(MSG_UNITS_MM)); w.heading( GET_TEXT_F(MSG_E_MOVE)); w.color(Theme::e_axis); diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_status_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_status_screen.cpp index 7caa9c7944..5a0fe485f8 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_status_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_status_screen.cpp @@ -235,7 +235,7 @@ bool StatusScreen::onTouchStart(uint8_t) { bool StatusScreen::onTouchEnd(uint8_t tag) { switch (tag) { - case 1: SpinnerDialogBox::enqueueAndWait_P(F("G0 X0 Y0")); break; + case 1: SpinnerDialogBox::enqueueAndWait_P(F("G28 O\nG27")); break; case 2: GOTO_SCREEN(LoadChocolateScreen); break; case 3: GOTO_SCREEN(PreheatMenu); break; case 4: GOTO_SCREEN(MainMenu); break; @@ -274,8 +274,7 @@ bool StatusScreen::onTouchEnd(uint8_t tag) { bool StatusScreen::onTouchHeld(uint8_t tag) { if (tag == 8 && !ExtUI::isMoving()) { - increment = 0.05; - MoveAxisScreen::setManualFeedrate(E0, increment); + LoadChocolateScreen::setManualFeedrateAndIncrement(1, increment); UI_INCREMENT(AxisPosition_mm, E0); current_screen.onRefresh(); } diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.cpp index 2c9d881173..889ed734cc 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.cpp @@ -100,6 +100,7 @@ SCREEN_TABLE { DECL_SCREEN_IF_INCLUDED(FTDI_BIO_CONFIRMOME_E) DECL_SCREEN_IF_INCLUDED(FTDI_COCOA_STATUS_SCREEN) DECL_SCREEN_IF_INCLUDED(FTDI_COCOA_MAIN_MENU) + DECL_SCREEN_IF_INCLUDED(FTDI_COCOA_ADVANCED_SETTINGS_MENU) DECL_SCREEN_IF_INCLUDED(FTDI_COCOA_PREHEAT_MENU) DECL_SCREEN_IF_INCLUDED(FTDI_COCOA_PREHEAT_SCREEN) DECL_SCREEN_IF_INCLUDED(FTDI_COCOA_UNLOAD_CARTRIDGE_SCREEN) From 2b9842e094c3a99f73f28cd21ceced4c3a523956 Mon Sep 17 00:00:00 2001 From: Ilya Date: Sun, 28 Feb 2021 23:33:07 -0800 Subject: [PATCH 067/253] Default microsteps to axis first stepper (#21230) --- Marlin/Configuration_adv.h | 228 ++++++++++++++++++------------------- 1 file changed, 114 insertions(+), 114 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index f23ca2980d..b1d8be1069 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -2244,7 +2244,7 @@ #if AXIS_DRIVER_TYPE_X2(TMC26X) #define X2_MAX_CURRENT 1000 #define X2_SENSE_RESISTOR 91 - #define X2_MICROSTEPS 16 + #define X2_MICROSTEPS X_MICROSTEPS #endif #if AXIS_DRIVER_TYPE_Y(TMC26X) @@ -2256,7 +2256,7 @@ #if AXIS_DRIVER_TYPE_Y2(TMC26X) #define Y2_MAX_CURRENT 1000 #define Y2_SENSE_RESISTOR 91 - #define Y2_MICROSTEPS 16 + #define Y2_MICROSTEPS Y_MICROSTEPS #endif #if AXIS_DRIVER_TYPE_Z(TMC26X) @@ -2268,19 +2268,19 @@ #if AXIS_DRIVER_TYPE_Z2(TMC26X) #define Z2_MAX_CURRENT 1000 #define Z2_SENSE_RESISTOR 91 - #define Z2_MICROSTEPS 16 + #define Z2_MICROSTEPS Z_MICROSTEPS #endif #if AXIS_DRIVER_TYPE_Z3(TMC26X) #define Z3_MAX_CURRENT 1000 #define Z3_SENSE_RESISTOR 91 - #define Z3_MICROSTEPS 16 + #define Z3_MICROSTEPS Z_MICROSTEPS #endif #if AXIS_DRIVER_TYPE_Z4(TMC26X) #define Z4_MAX_CURRENT 1000 #define Z4_SENSE_RESISTOR 91 - #define Z4_MICROSTEPS 16 + #define Z4_MICROSTEPS Z_MICROSTEPS #endif #if AXIS_DRIVER_TYPE_E0(TMC26X) @@ -2292,43 +2292,43 @@ #if AXIS_DRIVER_TYPE_E1(TMC26X) #define E1_MAX_CURRENT 1000 #define E1_SENSE_RESISTOR 91 - #define E1_MICROSTEPS 16 + #define E1_MICROSTEPS E0_MICROSTEPS #endif #if AXIS_DRIVER_TYPE_E2(TMC26X) #define E2_MAX_CURRENT 1000 #define E2_SENSE_RESISTOR 91 - #define E2_MICROSTEPS 16 + #define E2_MICROSTEPS E0_MICROSTEPS #endif #if AXIS_DRIVER_TYPE_E3(TMC26X) #define E3_MAX_CURRENT 1000 #define E3_SENSE_RESISTOR 91 - #define E3_MICROSTEPS 16 + #define E3_MICROSTEPS E0_MICROSTEPS #endif #if AXIS_DRIVER_TYPE_E4(TMC26X) #define E4_MAX_CURRENT 1000 #define E4_SENSE_RESISTOR 91 - #define E4_MICROSTEPS 16 + #define E4_MICROSTEPS E0_MICROSTEPS #endif #if AXIS_DRIVER_TYPE_E5(TMC26X) #define E5_MAX_CURRENT 1000 #define E5_SENSE_RESISTOR 91 - #define E5_MICROSTEPS 16 + #define E5_MICROSTEPS E0_MICROSTEPS #endif #if AXIS_DRIVER_TYPE_E6(TMC26X) #define E6_MAX_CURRENT 1000 #define E6_SENSE_RESISTOR 91 - #define E6_MICROSTEPS 16 + #define E6_MICROSTEPS E0_MICROSTEPS #endif #if AXIS_DRIVER_TYPE_E7(TMC26X) #define E7_MAX_CURRENT 1000 #define E7_SENSE_RESISTOR 91 - #define E7_MICROSTEPS 16 + #define E7_MICROSTEPS E0_MICROSTEPS #endif #endif // TMC26X @@ -2373,7 +2373,7 @@ #if AXIS_IS_TMC(X2) #define X2_CURRENT 800 #define X2_CURRENT_HOME X2_CURRENT - #define X2_MICROSTEPS 16 + #define X2_MICROSTEPS X_MICROSTEPS #define X2_RSENSE 0.11 #define X2_CHAIN_POS -1 //#define X2_INTERPOLATE true @@ -2391,7 +2391,7 @@ #if AXIS_IS_TMC(Y2) #define Y2_CURRENT 800 #define Y2_CURRENT_HOME Y2_CURRENT - #define Y2_MICROSTEPS 16 + #define Y2_MICROSTEPS Y_MICROSTEPS #define Y2_RSENSE 0.11 #define Y2_CHAIN_POS -1 //#define Y2_INTERPOLATE true @@ -2409,7 +2409,7 @@ #if AXIS_IS_TMC(Z2) #define Z2_CURRENT 800 #define Z2_CURRENT_HOME Z2_CURRENT - #define Z2_MICROSTEPS 16 + #define Z2_MICROSTEPS Z_MICROSTEPS #define Z2_RSENSE 0.11 #define Z2_CHAIN_POS -1 //#define Z2_INTERPOLATE true @@ -2418,7 +2418,7 @@ #if AXIS_IS_TMC(Z3) #define Z3_CURRENT 800 #define Z3_CURRENT_HOME Z3_CURRENT - #define Z3_MICROSTEPS 16 + #define Z3_MICROSTEPS Z_MICROSTEPS #define Z3_RSENSE 0.11 #define Z3_CHAIN_POS -1 //#define Z3_INTERPOLATE true @@ -2427,7 +2427,7 @@ #if AXIS_IS_TMC(Z4) #define Z4_CURRENT 800 #define Z4_CURRENT_HOME Z4_CURRENT - #define Z4_MICROSTEPS 16 + #define Z4_MICROSTEPS Z_MICROSTEPS #define Z4_RSENSE 0.11 #define Z4_CHAIN_POS -1 //#define Z4_INTERPOLATE true @@ -2443,7 +2443,7 @@ #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 - #define E1_MICROSTEPS 16 + #define E1_MICROSTEPS E0_MICROSTEPS #define E1_RSENSE 0.11 #define E1_CHAIN_POS -1 //#define E1_INTERPOLATE true @@ -2451,7 +2451,7 @@ #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 - #define E2_MICROSTEPS 16 + #define E2_MICROSTEPS E0_MICROSTEPS #define E2_RSENSE 0.11 #define E2_CHAIN_POS -1 //#define E2_INTERPOLATE true @@ -2459,7 +2459,7 @@ #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 - #define E3_MICROSTEPS 16 + #define E3_MICROSTEPS E0_MICROSTEPS #define E3_RSENSE 0.11 #define E3_CHAIN_POS -1 //#define E3_INTERPOLATE true @@ -2467,7 +2467,7 @@ #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 - #define E4_MICROSTEPS 16 + #define E4_MICROSTEPS E0_MICROSTEPS #define E4_RSENSE 0.11 #define E4_CHAIN_POS -1 //#define E4_INTERPOLATE true @@ -2475,7 +2475,7 @@ #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 - #define E5_MICROSTEPS 16 + #define E5_MICROSTEPS E0_MICROSTEPS #define E5_RSENSE 0.11 #define E5_CHAIN_POS -1 //#define E5_INTERPOLATE true @@ -2483,7 +2483,7 @@ #if AXIS_IS_TMC(E6) #define E6_CURRENT 800 - #define E6_MICROSTEPS 16 + #define E6_MICROSTEPS E0_MICROSTEPS #define E6_RSENSE 0.11 #define E6_CHAIN_POS -1 //#define E6_INTERPOLATE true @@ -2491,7 +2491,7 @@ #if AXIS_IS_TMC(E7) #define E7_CURRENT 800 - #define E7_MICROSTEPS 16 + #define E7_MICROSTEPS E0_MICROSTEPS #define E7_RSENSE 0.11 #define E7_CHAIN_POS -1 //#define E7_INTERPOLATE true @@ -2766,138 +2766,138 @@ #endif #if AXIS_IS_L64XX(X2) - #define X2_MICROSTEPS 128 - #define X2_OVERCURRENT 2000 - #define X2_STALLCURRENT 1500 - #define X2_MAX_VOLTAGE 127 - #define X2_CHAIN_POS -1 - #define X2_SLEW_RATE 1 + #define X2_MICROSTEPS X_MICROSTEPS + #define X2_OVERCURRENT 2000 + #define X2_STALLCURRENT 1500 + #define X2_MAX_VOLTAGE 127 + #define X2_CHAIN_POS -1 + #define X2_SLEW_RATE 1 #endif #if AXIS_IS_L64XX(Y) - #define Y_MICROSTEPS 128 - #define Y_OVERCURRENT 2000 - #define Y_STALLCURRENT 1500 - #define Y_MAX_VOLTAGE 127 - #define Y_CHAIN_POS -1 - #define Y_SLEW_RATE 1 + #define Y_MICROSTEPS 128 + #define Y_OVERCURRENT 2000 + #define Y_STALLCURRENT 1500 + #define Y_MAX_VOLTAGE 127 + #define Y_CHAIN_POS -1 + #define Y_SLEW_RATE 1 #endif #if AXIS_IS_L64XX(Y2) - #define Y2_MICROSTEPS 128 - #define Y2_OVERCURRENT 2000 - #define Y2_STALLCURRENT 1500 - #define Y2_MAX_VOLTAGE 127 - #define Y2_CHAIN_POS -1 - #define Y2_SLEW_RATE 1 + #define Y2_MICROSTEPS Y_MICROSTEPS + #define Y2_OVERCURRENT 2000 + #define Y2_STALLCURRENT 1500 + #define Y2_MAX_VOLTAGE 127 + #define Y2_CHAIN_POS -1 + #define Y2_SLEW_RATE 1 #endif #if AXIS_IS_L64XX(Z) - #define Z_MICROSTEPS 128 - #define Z_OVERCURRENT 2000 - #define Z_STALLCURRENT 1500 - #define Z_MAX_VOLTAGE 127 - #define Z_CHAIN_POS -1 - #define Z_SLEW_RATE 1 + #define Z_MICROSTEPS 128 + #define Z_OVERCURRENT 2000 + #define Z_STALLCURRENT 1500 + #define Z_MAX_VOLTAGE 127 + #define Z_CHAIN_POS -1 + #define Z_SLEW_RATE 1 #endif #if AXIS_IS_L64XX(Z2) - #define Z2_MICROSTEPS 128 - #define Z2_OVERCURRENT 2000 - #define Z2_STALLCURRENT 1500 - #define Z2_MAX_VOLTAGE 127 - #define Z2_CHAIN_POS -1 - #define Z2_SLEW_RATE 1 + #define Z2_MICROSTEPS Z_MICROSTEPS + #define Z2_OVERCURRENT 2000 + #define Z2_STALLCURRENT 1500 + #define Z2_MAX_VOLTAGE 127 + #define Z2_CHAIN_POS -1 + #define Z2_SLEW_RATE 1 #endif #if AXIS_IS_L64XX(Z3) - #define Z3_MICROSTEPS 128 - #define Z3_OVERCURRENT 2000 - #define Z3_STALLCURRENT 1500 - #define Z3_MAX_VOLTAGE 127 - #define Z3_CHAIN_POS -1 - #define Z3_SLEW_RATE 1 + #define Z3_MICROSTEPS Z_MICROSTEPS + #define Z3_OVERCURRENT 2000 + #define Z3_STALLCURRENT 1500 + #define Z3_MAX_VOLTAGE 127 + #define Z3_CHAIN_POS -1 + #define Z3_SLEW_RATE 1 #endif #if AXIS_IS_L64XX(Z4) - #define Z4_MICROSTEPS 128 - #define Z4_OVERCURRENT 2000 - #define Z4_STALLCURRENT 1500 - #define Z4_MAX_VOLTAGE 127 - #define Z4_CHAIN_POS -1 - #define Z4_SLEW_RATE 1 + #define Z4_MICROSTEPS Z_MICROSTEPS + #define Z4_OVERCURRENT 2000 + #define Z4_STALLCURRENT 1500 + #define Z4_MAX_VOLTAGE 127 + #define Z4_CHAIN_POS -1 + #define Z4_SLEW_RATE 1 #endif #if AXIS_IS_L64XX(E0) - #define E0_MICROSTEPS 128 - #define E0_OVERCURRENT 2000 - #define E0_STALLCURRENT 1500 - #define E0_MAX_VOLTAGE 127 - #define E0_CHAIN_POS -1 - #define E0_SLEW_RATE 1 + #define E0_MICROSTEPS 128 + #define E0_OVERCURRENT 2000 + #define E0_STALLCURRENT 1500 + #define E0_MAX_VOLTAGE 127 + #define E0_CHAIN_POS -1 + #define E0_SLEW_RATE 1 #endif #if AXIS_IS_L64XX(E1) - #define E1_MICROSTEPS 128 - #define E1_OVERCURRENT 2000 - #define E1_STALLCURRENT 1500 - #define E1_MAX_VOLTAGE 127 - #define E1_CHAIN_POS -1 - #define E1_SLEW_RATE 1 + #define E1_MICROSTEPS E0_MICROSTEPS + #define E1_OVERCURRENT 2000 + #define E1_STALLCURRENT 1500 + #define E1_MAX_VOLTAGE 127 + #define E1_CHAIN_POS -1 + #define E1_SLEW_RATE 1 #endif #if AXIS_IS_L64XX(E2) - #define E2_MICROSTEPS 128 - #define E2_OVERCURRENT 2000 - #define E2_STALLCURRENT 1500 - #define E2_MAX_VOLTAGE 127 - #define E2_CHAIN_POS -1 - #define E2_SLEW_RATE 1 + #define E2_MICROSTEPS E0_MICROSTEPS + #define E2_OVERCURRENT 2000 + #define E2_STALLCURRENT 1500 + #define E2_MAX_VOLTAGE 127 + #define E2_CHAIN_POS -1 + #define E2_SLEW_RATE 1 #endif #if AXIS_IS_L64XX(E3) - #define E3_MICROSTEPS 128 - #define E3_OVERCURRENT 2000 - #define E3_STALLCURRENT 1500 - #define E3_MAX_VOLTAGE 127 - #define E3_CHAIN_POS -1 - #define E3_SLEW_RATE 1 + #define E3_MICROSTEPS E0_MICROSTEPS + #define E3_OVERCURRENT 2000 + #define E3_STALLCURRENT 1500 + #define E3_MAX_VOLTAGE 127 + #define E3_CHAIN_POS -1 + #define E3_SLEW_RATE 1 #endif #if AXIS_IS_L64XX(E4) - #define E4_MICROSTEPS 128 - #define E4_OVERCURRENT 2000 - #define E4_STALLCURRENT 1500 - #define E4_MAX_VOLTAGE 127 - #define E4_CHAIN_POS -1 - #define E4_SLEW_RATE 1 + #define E4_MICROSTEPS E0_MICROSTEPS + #define E4_OVERCURRENT 2000 + #define E4_STALLCURRENT 1500 + #define E4_MAX_VOLTAGE 127 + #define E4_CHAIN_POS -1 + #define E4_SLEW_RATE 1 #endif #if AXIS_IS_L64XX(E5) - #define E5_MICROSTEPS 128 - #define E5_OVERCURRENT 2000 - #define E5_STALLCURRENT 1500 - #define E5_MAX_VOLTAGE 127 - #define E5_CHAIN_POS -1 - #define E5_SLEW_RATE 1 + #define E5_MICROSTEPS E0_MICROSTEPS + #define E5_OVERCURRENT 2000 + #define E5_STALLCURRENT 1500 + #define E5_MAX_VOLTAGE 127 + #define E5_CHAIN_POS -1 + #define E5_SLEW_RATE 1 #endif #if AXIS_IS_L64XX(E6) - #define E6_MICROSTEPS 128 - #define E6_OVERCURRENT 2000 - #define E6_STALLCURRENT 1500 - #define E6_MAX_VOLTAGE 127 - #define E6_CHAIN_POS -1 - #define E6_SLEW_RATE 1 + #define E6_MICROSTEPS E0_MICROSTEPS + #define E6_OVERCURRENT 2000 + #define E6_STALLCURRENT 1500 + #define E6_MAX_VOLTAGE 127 + #define E6_CHAIN_POS -1 + #define E6_SLEW_RATE 1 #endif #if AXIS_IS_L64XX(E7) - #define E7_MICROSTEPS 128 - #define E7_OVERCURRENT 2000 - #define E7_STALLCURRENT 1500 - #define E7_MAX_VOLTAGE 127 - #define E7_CHAIN_POS -1 - #define E7_SLEW_RATE 1 + #define E7_MICROSTEPS E0_MICROSTEPS + #define E7_OVERCURRENT 2000 + #define E7_STALLCURRENT 1500 + #define E7_MAX_VOLTAGE 127 + #define E7_CHAIN_POS -1 + #define E7_SLEW_RATE 1 #endif /** From e66e51fa6d92cce79ade66893639a333ca53e88a Mon Sep 17 00:00:00 2001 From: Nick Date: Mon, 1 Mar 2021 10:23:10 +0000 Subject: [PATCH 068/253] Safe Z homing for Power Loss Recovery (#16909) --- Marlin/Configuration_adv.h | 7 ++++++- Marlin/src/feature/powerloss.cpp | 17 ++++++++++++----- Marlin/src/inc/SanityCheck.h | 18 +++++++++++------- Marlin/src/module/probe.cpp | 8 ++++---- Marlin/src/module/probe.h | 2 +- buildroot/tests/rambo-tests | 8 +++++--- 6 files changed, 39 insertions(+), 21 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index b1d8be1069..9032f4d2d8 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -1256,7 +1256,6 @@ #if ENABLED(POWER_LOSS_RECOVERY) #define PLR_ENABLED_DEFAULT false // Power Loss Recovery enabled by default. (Set with 'M413 Sn' & M500) //#define BACKUP_POWER_SUPPLY // Backup power / UPS to move the steppers on power loss - //#define POWER_LOSS_RECOVER_ZHOME // Z homing is needed for proper recovery. 99.9% of the time this should be disabled! //#define POWER_LOSS_ZRAISE 2 // (mm) Z axis raise on resume (on power loss with UPS) //#define POWER_LOSS_PIN 44 // Pin to detect power loss. Set to -1 to disable default pin on boards without module. //#define POWER_LOSS_STATE HIGH // State of pin indicating power loss @@ -1268,6 +1267,12 @@ // Without a POWER_LOSS_PIN the following option helps reduce wear on the SD card, // especially with "vase mode" printing. Set too high and vases cannot be continued. #define POWER_LOSS_MIN_Z_CHANGE 0.05 // (mm) Minimum Z change before saving power-loss data + + // Enable if Z homing is needed for proper recovery. 99.9% of the time this should be disabled! + //#define POWER_LOSS_RECOVER_ZHOME + #if ENABLED(POWER_LOSS_RECOVER_ZHOME) + //#define POWER_LOSS_ZHOME_POS { 0, 0 } // Safe XY position to home Z while avoiding objects on the bed + #endif #endif /** diff --git a/Marlin/src/feature/powerloss.cpp b/Marlin/src/feature/powerloss.cpp index 1b1f2bd681..7413b5bd56 100644 --- a/Marlin/src/feature/powerloss.cpp +++ b/Marlin/src/feature/powerloss.cpp @@ -384,18 +384,25 @@ void PrintJobRecovery::resume() { // Home safely with no Z raise gcode.process_subcommands_now_P(PSTR( "G28R0" // No raise during G28 - #if IS_CARTESIAN && DISABLED(POWER_LOSS_RECOVER_ZHOME) + #if IS_CARTESIAN && (DISABLED(POWER_LOSS_RECOVER_ZHOME) || defined(POWER_LOSS_ZHOME_POS)) "XY" // Don't home Z on Cartesian unless overridden #endif )); #endif - // Pretend that all axes are homed + #ifdef POWER_LOSS_ZHOME_POS + // If defined move to a safe Z homing position that avoids the print + constexpr xy_pos_t homepos = POWER_LOSS_ZHOME_POS; + sprintf_P(cmd, PSTR("G1 X%s Y%s F1000\nG28Z", dtostrf(homepos.x, 1, 3, str_1), dtostrf(homepos.y, 1, 3, str_2))); + gcode.process_subcommands_now(cmd); + #endif + + // Ensure that all axes are marked as homed set_all_homed(); #if ENABLED(POWER_LOSS_RECOVER_ZHOME) - // Z has been homed so restore Z to ZsavedPos + POWER_LOSS_ZRAISE + // Now move to ZsavedPos + POWER_LOSS_ZRAISE sprintf_P(cmd, PSTR("G1 F500 Z%s"), dtostrf(info.current_position.z + POWER_LOSS_ZRAISE, 1, 3, str_1)); gcode.process_subcommands_now(cmd); #endif @@ -467,7 +474,7 @@ void PrintJobRecovery::resume() { // Additional purge if configured #if POWER_LOSS_PURGE_LEN - sprintf_P(cmd, PSTR("G1 E%d F200"), (POWER_LOSS_PURGE_LEN) + (POWER_LOSS_RETRACT_LEN)); + sprintf_P(cmd, PSTR("G1 E%d F3000"), (POWER_LOSS_PURGE_LEN) + (POWER_LOSS_RETRACT_LEN)); gcode.process_subcommands_now(cmd); #endif @@ -485,7 +492,7 @@ void PrintJobRecovery::resume() { // Move back to the saved Z dtostrf(info.current_position.z, 1, 3, str_1); #if Z_HOME_DIR > 0 || ENABLED(POWER_LOSS_RECOVER_ZHOME) - sprintf_P(cmd, PSTR("G1 Z%s F200"), str_1); + sprintf_P(cmd, PSTR("G1 Z%s F500"), str_1); #else gcode.process_subcommands_now_P(PSTR("G1 Z0 F200")); sprintf_P(cmd, PSTR("G92.9 Z%s"), str_1); diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 6581f629b0..3f7931e0b6 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -1641,7 +1641,7 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal * Allen Key * Deploying the Allen Key probe uses big moves in z direction. Too dangerous for an unhomed z-axis. */ -#if BOTH(Z_PROBE_ALLEN_KEY, Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) && (Z_HOME_DIR < 0) +#if BOTH(Z_PROBE_ALLEN_KEY, Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN) && Z_HOME_DIR < 0 #error "You can't home to a Z min endstop with a Z_PROBE_ALLEN_KEY." #endif @@ -2913,12 +2913,16 @@ static_assert( _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2) #endif #endif -#if ENABLED(BACKUP_POWER_SUPPLY) && !PIN_EXISTS(POWER_LOSS) - #error "BACKUP_POWER_SUPPLY requires a POWER_LOSS_PIN." -#endif - -#if BOTH(POWER_LOSS_PULLUP, POWER_LOSS_PULLDOWN) - #error "You can't enable POWER_LOSS_PULLUP and POWER_LOSS_PULLDOWN at the same time." +#if ENABLED(POWER_LOSS_RECOVERY) + #if ENABLED(BACKUP_POWER_SUPPLY) && !PIN_EXISTS(POWER_LOSS) + #error "BACKUP_POWER_SUPPLY requires a POWER_LOSS_PIN." + #elif BOTH(POWER_LOSS_RECOVER_ZHOME, Z_SAFE_HOMING) + #error "POWER_LOSS_RECOVER_ZHOME cannot be used with Z_SAFE_HOMING." + #elif BOTH(POWER_LOSS_PULLUP, POWER_LOSS_PULLDOWN) + #error "You can't enable POWER_LOSS_PULLUP and POWER_LOSS_PULLDOWN at the same time." + #elif BOTH(IS_CARTESIAN, POWER_LOSS_RECOVER_ZHOME) && Z_HOME_DIR < 0 && !defined(POWER_LOSS_ZHOME_POS) + #error "POWER_LOSS_RECOVER_ZHOME requires POWER_LOSS_ZHOME_POS for a Cartesian that homes to ZMIN." + #endif #endif #if ENABLED(Z_STEPPER_AUTO_ALIGN) diff --git a/Marlin/src/module/probe.cpp b/Marlin/src/module/probe.cpp index 7dcf1dff31..7333aaa748 100644 --- a/Marlin/src/module/probe.cpp +++ b/Marlin/src/module/probe.cpp @@ -340,7 +340,7 @@ FORCE_INLINE void probe_specific_action(const bool deploy) { * - If a preheat input is higher than the current target, raise the target temperature. * - If a preheat input is higher than the current temperature, wait for stabilization. */ - void Probe::preheat_for_probing(const uint16_t hotend_temp, const uint16_t bed_temp) { + void Probe::preheat_for_probing(const int16_t hotend_temp, const int16_t bed_temp) { #if HAS_HOTEND && (PROBING_NOZZLE_TEMP || LEVELING_NOZZLE_TEMP) #define WAIT_FOR_NOZZLE_HEAT #endif @@ -351,17 +351,17 @@ FORCE_INLINE void probe_specific_action(const bool deploy) { DEBUG_ECHOPGM("Preheating "); #if ENABLED(WAIT_FOR_NOZZLE_HEAT) - const uint16_t hotendPreheat = hotend_temp > thermalManager.degTargetHotend(0) ? hotend_temp : 0; + const int16_t hotendPreheat = hotend_temp > thermalManager.degTargetHotend(0) ? hotend_temp : 0; if (hotendPreheat) { DEBUG_ECHOPAIR("hotend (", hotendPreheat, ")"); thermalManager.setTargetHotend(hotendPreheat, 0); } #elif ENABLED(WAIT_FOR_BED_HEAT) - constexpr uint16_t hotendPreheat = 0; + constexpr int16_t hotendPreheat = 0; #endif #if ENABLED(WAIT_FOR_BED_HEAT) - const uint16_t bedPreheat = bed_temp > thermalManager.degTargetBed() ? bed_temp : 0; + const int16_t bedPreheat = bed_temp > thermalManager.degTargetBed() ? bed_temp : 0; if (bedPreheat) { if (hotendPreheat) DEBUG_ECHOPGM(" and "); DEBUG_ECHOPAIR("bed (", bedPreheat, ")"); diff --git a/Marlin/src/module/probe.h b/Marlin/src/module/probe.h index df7bdd23a1..b54bf00f00 100644 --- a/Marlin/src/module/probe.h +++ b/Marlin/src/module/probe.h @@ -61,7 +61,7 @@ public: static xyz_pos_t offset; #if EITHER(PREHEAT_BEFORE_PROBING, PREHEAT_BEFORE_LEVELING) - static void preheat_for_probing(const uint16_t hotend_temp, const uint16_t bed_temp); + static void preheat_for_probing(const int16_t hotend_temp, const int16_t bed_temp); #endif static bool set_deployed(const bool deploy); diff --git a/buildroot/tests/rambo-tests b/buildroot/tests/rambo-tests index d471f4201c..02ecf5d3fc 100755 --- a/buildroot/tests/rambo-tests +++ b/buildroot/tests/rambo-tests @@ -22,9 +22,11 @@ opt_add TEMP_CHAMBER_PIN 3 opt_add HEATER_CHAMBER_PIN 45 opt_set GRID_MAX_POINTS_X 16 opt_set FANMUX0_PIN 53 -opt_disable USE_WATCHDOG +opt_set Z_HOME_DIR 1 +opt_enable USE_ZMAX_PLUG +opt_disable USE_ZMIN_PLUG Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN USE_WATCHDOG opt_enable REPRAP_DISCOUNT_SMART_CONTROLLER LCD_PROGRESS_BAR LCD_PROGRESS_BAR_TEST \ - FIX_MOUNTED_PROBE Z_SAFE_HOMING CODEPENDENT_XY_HOMING PIDTEMPBED PROBE_TEMP_COMPENSATION \ + FIX_MOUNTED_PROBE CODEPENDENT_XY_HOMING PIDTEMPBED PROBE_TEMP_COMPENSATION \ PREHEAT_BEFORE_PROBING PROBING_HEATERS_OFF PROBING_FANS_OFF PROBING_STEPPERS_OFF WAIT_FOR_BED_HEATER \ EEPROM_SETTINGS SDSUPPORT SD_REPRINT_LAST_SELECTED_FILE BINARY_FILE_TRANSFER \ BLINKM PCA9533 PCA9632 RGB_LED RGB_LED_R_PIN RGB_LED_G_PIN RGB_LED_B_PIN LED_CONTROL_MENU \ @@ -38,7 +40,7 @@ opt_enable REPRAP_DISCOUNT_SMART_CONTROLLER LCD_PROGRESS_BAR LCD_PROGRESS_BAR_TE SKEW_CORRECTION SKEW_CORRECTION_FOR_Z SKEW_CORRECTION_GCODE \ BACKLASH_COMPENSATION BACKLASH_GCODE BAUD_RATE_GCODE BEZIER_CURVE_SUPPORT \ FWRETRACT ARC_P_CIRCLES CNC_WORKSPACE_PLANES CNC_COORDINATE_SYSTEMS \ - PSU_CONTROL AUTO_POWER_CONTROL POWER_LOSS_RECOVERY POWER_LOSS_PIN POWER_LOSS_STATE \ + PSU_CONTROL AUTO_POWER_CONTROL POWER_LOSS_RECOVERY POWER_LOSS_PIN POWER_LOSS_STATE POWER_LOSS_RECOVER_ZHOME \ SLOW_PWM_HEATERS THERMAL_PROTECTION_CHAMBER LIN_ADVANCE EXTRA_LIN_ADVANCE_K \ HOST_ACTION_COMMANDS HOST_PROMPT_SUPPORT PINS_DEBUGGING MAX7219_DEBUG M114_DETAIL opt_add DEBUG_POWER_LOSS_RECOVERY From 28404f9e87aea01489c32372ed6a6835ee1bf252 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 1 Mar 2021 06:03:36 -0600 Subject: [PATCH 069/253] POWER_LOSS_ZHOME_POS followup --- Marlin/src/feature/powerloss.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/src/feature/powerloss.cpp b/Marlin/src/feature/powerloss.cpp index 7413b5bd56..1bb3a7e915 100644 --- a/Marlin/src/feature/powerloss.cpp +++ b/Marlin/src/feature/powerloss.cpp @@ -393,8 +393,8 @@ void PrintJobRecovery::resume() { #ifdef POWER_LOSS_ZHOME_POS // If defined move to a safe Z homing position that avoids the print - constexpr xy_pos_t homepos = POWER_LOSS_ZHOME_POS; - sprintf_P(cmd, PSTR("G1 X%s Y%s F1000\nG28Z", dtostrf(homepos.x, 1, 3, str_1), dtostrf(homepos.y, 1, 3, str_2))); + constexpr xy_pos_t p = POWER_LOSS_ZHOME_POS; + sprintf_P(cmd, PSTR("G1 X%s Y%s F1000\nG28Z"), dtostrf(p.x, 1, 3, str_1), dtostrf(p.y, 1, 3, str_2)); gcode.process_subcommands_now(cmd); #endif From 8c9a59c29e5cf8158e09123730d45e7a7ac29ecd Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 1 Mar 2021 06:15:06 -0600 Subject: [PATCH 070/253] Fewer warnings --- Marlin/src/HAL/LPC1768/inc/Conditionals_post.h | 1 - Marlin/src/module/printcounter.cpp | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/HAL/LPC1768/inc/Conditionals_post.h b/Marlin/src/HAL/LPC1768/inc/Conditionals_post.h index 94e4ce1341..be574a96e4 100644 --- a/Marlin/src/HAL/LPC1768/inc/Conditionals_post.h +++ b/Marlin/src/HAL/LPC1768/inc/Conditionals_post.h @@ -30,6 +30,5 @@ // LPC1768 boards seem to lose steps when saving to EEPROM during print (issue #20785) // TODO: Which other boards are incompatible? #if defined(MCU_LPC1768) && PRINTCOUNTER_SAVE_INTERVAL > 0 - #warning "To prevent step loss, motion will pause for PRINTCOUNTER auto-save." #define PRINTCOUNTER_SYNC 1 #endif diff --git a/Marlin/src/module/printcounter.cpp b/Marlin/src/module/printcounter.cpp index 1caaee352a..2728b8d5a9 100644 --- a/Marlin/src/module/printcounter.cpp +++ b/Marlin/src/module/printcounter.cpp @@ -43,6 +43,7 @@ Stopwatch print_job_timer; // Global Print Job Timer instance #if PRINTCOUNTER_SYNC #include "../module/planner.h" + #warning "To prevent step loss, motion will pause for PRINTCOUNTER auto-save." #endif // Service intervals From 7ee9aefed73cabd7cb649b2b119110e8f9d27a14 Mon Sep 17 00:00:00 2001 From: MoellerDi Date: Mon, 1 Mar 2021 15:03:41 +0100 Subject: [PATCH 071/253] G-code Digital Buttons (#18389) Co-Authored-By: android444 <24375898+android444@users.noreply.github.com> Co-authored-by: Scott Lahteine --- Marlin/Configuration_adv.h | 31 ++++++ Marlin/src/MarlinCore.cpp | 179 ++++++++++++++++++++++++++++++- Marlin/src/pins/pinsDebug_list.h | 75 +++++++++++++ 3 files changed, 284 insertions(+), 1 deletion(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 9032f4d2d8..8bbc50bee4 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -3369,6 +3369,37 @@ #define GCODE_MACROS_SLOT_SIZE 50 // Maximum length of a single macro #endif +/** + * User-defined buttons to run custom G-code. + * Up to 25 may be defined. + */ +//#define CUSTOM_USER_BUTTONS +#if ENABLED(CUSTOM_USER_BUTTONS) + //#define BUTTON1_PIN -1 + #if PIN_EXISTS(BUTTON1_PIN) + #define BUTTON1_HIT_STATE LOW // State of the triggered button. NC=LOW. NO=HIGH. + #define BUTTON1_WHEN_PRINTING false // Button allowed to trigger during printing? + #define BUTTON1_GCODE "G28" + #define BUTTON1_DESC "Homing" // Optional string to set the LCD status + #endif + + //#define BUTTON2_PIN -1 + #if PIN_EXISTS(BUTTON2_PIN) + #define BUTTON2_HIT_STATE LOW + #define BUTTON2_WHEN_PRINTING false + #define BUTTON2_GCODE "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + #define BUTTON2_DESC "Preheat for " PREHEAT_1_LABEL + #endif + + //#define BUTTON3_PIN -1 + #if PIN_EXISTS(BUTTON3_PIN) + #define BUTTON3_HIT_STATE LOW + #define BUTTON3_WHEN_PRINTING false + #define BUTTON3_GCODE "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + #define BUTTON3_DESC "Preheat for " PREHEAT_2_LABEL + #endif +#endif + /** * User-defined menu items to run custom G-code. * Up to 25 may be defined, but the actual number is LCD-dependent. diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 751d098606..689650c6ab 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -406,6 +406,7 @@ void startOrResumeJob() { * - Check if CHDK_PIN needs to go LOW * - Check for KILL button held down * - Check for HOME button held down + * - Check for CUSTOM USER button held down * - Check if cooling fan needs to be switched on * - Check if an idle but hot extruder needs filament extruded (EXTRUDER_RUNOUT_PREVENT) * - Pulse FET_SAFETY_PIN if it exists @@ -498,6 +499,102 @@ inline void manage_inactivity(const bool ignore_stepper_queue=false) { } #endif + #if ENABLED(CUSTOM_USER_BUTTONS) + // Handle a custom user button if defined + const bool printer_not_busy = !printingIsActive(); + #define HAS_CUSTOM_USER_BUTTON(N) (PIN_EXISTS(BUTTON##N) && defined(BUTTON##N##_HIT_STATE) && defined(BUTTON##N##_GCODE) && defined(BUTTON##N##_DESC)) + #define CHECK_CUSTOM_USER_BUTTON(N) do{ \ + constexpr millis_t CUB_DEBOUNCE_DELAY_##N = 250UL; \ + static millis_t next_cub_ms_##N; \ + if (BUTTON##N##_HIT_STATE == READ(BUTTON##N##_PIN) \ + && (ENABLED(BUTTON##N##_WHEN_PRINTING) || printer_not_busy)) { \ + const millis_t ms = millis(); \ + if (ELAPSED(ms, next_cub_ms_##N)) { \ + next_cub_ms_##N = ms + CUB_DEBOUNCE_DELAY_##N; \ + if (strlen(BUTTON##N##_DESC)) \ + LCD_MESSAGEPGM_P(PSTR(BUTTON##N##_DESC)); \ + queue.inject_P(PSTR(BUTTON##N##_GCODE)); \ + } \ + } \ + }while(0) + + #if HAS_CUSTOM_USER_BUTTON(1) + CHECK_CUSTOM_USER_BUTTON(1); + #endif + #if HAS_CUSTOM_USER_BUTTON(2) + CHECK_CUSTOM_USER_BUTTON(2); + #endif + #if HAS_CUSTOM_USER_BUTTON(3) + CHECK_CUSTOM_USER_BUTTON(3); + #endif + #if HAS_CUSTOM_USER_BUTTON(4) + CHECK_CUSTOM_USER_BUTTON(4); + #endif + #if HAS_CUSTOM_USER_BUTTON(5) + CHECK_CUSTOM_USER_BUTTON(5); + #endif + #if HAS_CUSTOM_USER_BUTTON(6) + CHECK_CUSTOM_USER_BUTTON(6); + #endif + #if HAS_CUSTOM_USER_BUTTON(7) + CHECK_CUSTOM_USER_BUTTON(7); + #endif + #if HAS_CUSTOM_USER_BUTTON(8) + CHECK_CUSTOM_USER_BUTTON(8); + #endif + #if HAS_CUSTOM_USER_BUTTON(9) + CHECK_CUSTOM_USER_BUTTON(9); + #endif + #if HAS_CUSTOM_USER_BUTTON(10) + CHECK_CUSTOM_USER_BUTTON(10); + #endif + #if HAS_CUSTOM_USER_BUTTON(11) + CHECK_CUSTOM_USER_BUTTON(11); + #endif + #if HAS_CUSTOM_USER_BUTTON(12) + CHECK_CUSTOM_USER_BUTTON(12); + #endif + #if HAS_CUSTOM_USER_BUTTON(13) + CHECK_CUSTOM_USER_BUTTON(13); + #endif + #if HAS_CUSTOM_USER_BUTTON(14) + CHECK_CUSTOM_USER_BUTTON(14); + #endif + #if HAS_CUSTOM_USER_BUTTON(15) + CHECK_CUSTOM_USER_BUTTON(15); + #endif + #if HAS_CUSTOM_USER_BUTTON(16) + CHECK_CUSTOM_USER_BUTTON(16); + #endif + #if HAS_CUSTOM_USER_BUTTON(17) + CHECK_CUSTOM_USER_BUTTON(17); + #endif + #if HAS_CUSTOM_USER_BUTTON(18) + CHECK_CUSTOM_USER_BUTTON(18); + #endif + #if HAS_CUSTOM_USER_BUTTON(19) + CHECK_CUSTOM_USER_BUTTON(19); + #endif + #if HAS_CUSTOM_USER_BUTTON(20) + CHECK_CUSTOM_USER_BUTTON(20); + #endif + #if HAS_CUSTOM_USER_BUTTON(21) + CHECK_CUSTOM_USER_BUTTON(21); + #endif + #if HAS_CUSTOM_USER_BUTTON(22) + CHECK_CUSTOM_USER_BUTTON(22); + #endif + #if HAS_CUSTOM_USER_BUTTON(23) + CHECK_CUSTOM_USER_BUTTON(23); + #endif + #if HAS_CUSTOM_USER_BUTTON(24) + CHECK_CUSTOM_USER_BUTTON(24); + #endif + #if HAS_CUSTOM_USER_BUTTON(25) + CHECK_CUSTOM_USER_BUTTON(25); + #endif + #endif + TERN_(USE_CONTROLLER_FAN, controllerFan.update()); // Check if fan should be turned on to cool stepper drivers down TERN_(AUTO_POWER_CONTROL, powerManager.check()); @@ -857,7 +954,7 @@ inline void tmc_standby_setup() { /** * Marlin entry-point: Set up before the program loop - * - Set up the kill pin, filament runout, power hold + * - Set up the kill pin, filament runout, power hold, custom user buttons * - Start the serial port * - Print startup messages and diagnostics * - Get EEPROM or default settings @@ -1131,6 +1228,86 @@ void setup() { SET_INPUT_PULLUP(HOME_PIN); #endif + #if ENABLED(CUSTOM_USER_BUTTONS) + #define INIT_CUSTOM_USER_BUTTON_PIN(N) do{ SET_INPUT(BUTTON##N##_PIN); WRITE(BUTTON##N##_PIN, !BUTTON##N##_HIT_STATE); }while(0) + + #if HAS_CUSTOM_USER_BUTTON(1) + INIT_CUSTOM_USER_BUTTON_PIN(1); + #endif + #if HAS_CUSTOM_USER_BUTTON(2) + INIT_CUSTOM_USER_BUTTON_PIN(2); + #endif + #if HAS_CUSTOM_USER_BUTTON(3) + INIT_CUSTOM_USER_BUTTON_PIN(3); + #endif + #if HAS_CUSTOM_USER_BUTTON(4) + INIT_CUSTOM_USER_BUTTON_PIN(4); + #endif + #if HAS_CUSTOM_USER_BUTTON(5) + INIT_CUSTOM_USER_BUTTON_PIN(5); + #endif + #if HAS_CUSTOM_USER_BUTTON(6) + INIT_CUSTOM_USER_BUTTON_PIN(6); + #endif + #if HAS_CUSTOM_USER_BUTTON(7) + INIT_CUSTOM_USER_BUTTON_PIN(7); + #endif + #if HAS_CUSTOM_USER_BUTTON(8) + INIT_CUSTOM_USER_BUTTON_PIN(8); + #endif + #if HAS_CUSTOM_USER_BUTTON(9) + INIT_CUSTOM_USER_BUTTON_PIN(9); + #endif + #if HAS_CUSTOM_USER_BUTTON(10) + INIT_CUSTOM_USER_BUTTON_PIN(10); + #endif + #if HAS_CUSTOM_USER_BUTTON(11) + INIT_CUSTOM_USER_BUTTON_PIN(11); + #endif + #if HAS_CUSTOM_USER_BUTTON(12) + INIT_CUSTOM_USER_BUTTON_PIN(12); + #endif + #if HAS_CUSTOM_USER_BUTTON(13) + INIT_CUSTOM_USER_BUTTON_PIN(13); + #endif + #if HAS_CUSTOM_USER_BUTTON(14) + INIT_CUSTOM_USER_BUTTON_PIN(14); + #endif + #if HAS_CUSTOM_USER_BUTTON(15) + INIT_CUSTOM_USER_BUTTON_PIN(15); + #endif + #if HAS_CUSTOM_USER_BUTTON(16) + INIT_CUSTOM_USER_BUTTON_PIN(16); + #endif + #if HAS_CUSTOM_USER_BUTTON(17) + INIT_CUSTOM_USER_BUTTON_PIN(17); + #endif + #if HAS_CUSTOM_USER_BUTTON(18) + INIT_CUSTOM_USER_BUTTON_PIN(18); + #endif + #if HAS_CUSTOM_USER_BUTTON(19) + INIT_CUSTOM_USER_BUTTON_PIN(19); + #endif + #if HAS_CUSTOM_USER_BUTTON(20) + INIT_CUSTOM_USER_BUTTON_PIN(20); + #endif + #if HAS_CUSTOM_USER_BUTTON(21) + INIT_CUSTOM_USER_BUTTON_PIN(21); + #endif + #if HAS_CUSTOM_USER_BUTTON(22) + INIT_CUSTOM_USER_BUTTON_PIN(22); + #endif + #if HAS_CUSTOM_USER_BUTTON(23) + INIT_CUSTOM_USER_BUTTON_PIN(23); + #endif + #if HAS_CUSTOM_USER_BUTTON(24) + INIT_CUSTOM_USER_BUTTON_PIN(24); + #endif + #if HAS_CUSTOM_USER_BUTTON(25) + INIT_CUSTOM_USER_BUTTON_PIN(25); + #endif + #endif + #if PIN_EXISTS(STAT_LED_RED) OUT_WRITE(STAT_LED_RED_PIN, LOW); // OFF #endif diff --git a/Marlin/src/pins/pinsDebug_list.h b/Marlin/src/pins/pinsDebug_list.h index 79a67c34f8..42095fa926 100644 --- a/Marlin/src/pins/pinsDebug_list.h +++ b/Marlin/src/pins/pinsDebug_list.h @@ -183,6 +183,81 @@ #if PIN_EXISTS(JOY_EN) REPORT_NAME_DIGITAL(__LINE__, JOY_EN_PIN) #endif +#if PIN_EXISTS(BUTTON1) + REPORT_NAME_DIGITAL(__LINE__, BUTTON1_PIN) +#endif +#if PIN_EXISTS(BUTTON2) + REPORT_NAME_DIGITAL(__LINE__, BUTTON2_PIN) +#endif +#if PIN_EXISTS(BUTTON3) + REPORT_NAME_DIGITAL(__LINE__, BUTTON3_PIN) +#endif +#if PIN_EXISTS(BUTTON4) + REPORT_NAME_DIGITAL(__LINE__, BUTTON4_PIN) +#endif +#if PIN_EXISTS(BUTTON5) + REPORT_NAME_DIGITAL(__LINE__, BUTTON5_PIN) +#endif +#if PIN_EXISTS(BUTTON6) + REPORT_NAME_DIGITAL(__LINE__, BUTTON6_PIN) +#endif +#if PIN_EXISTS(BUTTON7) + REPORT_NAME_DIGITAL(__LINE__, BUTTON7_PIN) +#endif +#if PIN_EXISTS(BUTTON8) + REPORT_NAME_DIGITAL(__LINE__, BUTTON8_PIN) +#endif +#if PIN_EXISTS(BUTTON9) + REPORT_NAME_DIGITAL(__LINE__, BUTTON9_PIN) +#endif +#if PIN_EXISTS(BUTTON10) + REPORT_NAME_DIGITAL(__LINE__, BUTTON10_PIN) +#endif +#if PIN_EXISTS(BUTTON11) + REPORT_NAME_DIGITAL(__LINE__, BUTTON11_PIN) +#endif +#if PIN_EXISTS(BUTTON12) + REPORT_NAME_DIGITAL(__LINE__, BUTTON12_PIN) +#endif +#if PIN_EXISTS(BUTTON13) + REPORT_NAME_DIGITAL(__LINE__, BUTTON13_PIN) +#endif +#if PIN_EXISTS(BUTTON14) + REPORT_NAME_DIGITAL(__LINE__, BUTTON14_PIN) +#endif +#if PIN_EXISTS(BUTTON15) + REPORT_NAME_DIGITAL(__LINE__, BUTTON15_PIN) +#endif +#if PIN_EXISTS(BUTTON16) + REPORT_NAME_DIGITAL(__LINE__, BUTTON16_PIN) +#endif +#if PIN_EXISTS(BUTTON17) + REPORT_NAME_DIGITAL(__LINE__, BUTTON17_PIN) +#endif +#if PIN_EXISTS(BUTTON18) + REPORT_NAME_DIGITAL(__LINE__, BUTTON18_PIN) +#endif +#if PIN_EXISTS(BUTTON19) + REPORT_NAME_DIGITAL(__LINE__, BUTTON19_PIN) +#endif +#if PIN_EXISTS(BUTTON20) + REPORT_NAME_DIGITAL(__LINE__, BUTTON20_PIN) +#endif +#if PIN_EXISTS(BUTTON21) + REPORT_NAME_DIGITAL(__LINE__, BUTTON21_PIN) +#endif +#if PIN_EXISTS(BUTTON22) + REPORT_NAME_DIGITAL(__LINE__, BUTTON22_PIN) +#endif +#if PIN_EXISTS(BUTTON23) + REPORT_NAME_DIGITAL(__LINE__, BUTTON23_PIN) +#endif +#if PIN_EXISTS(BUTTON24) + REPORT_NAME_DIGITAL(__LINE__, BUTTON24_PIN) +#endif +#if PIN_EXISTS(BUTTON25) + REPORT_NAME_DIGITAL(__LINE__, BUTTON25_PIN) +#endif #if PIN_EXISTS(CASE_LIGHT) REPORT_NAME_DIGITAL(__LINE__, CASE_LIGHT_PIN) #endif From 21372c3d4e0593a9c1652c24b81d5339e750a440 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 1 Mar 2021 05:48:39 -0600 Subject: [PATCH 072/253] Better mftest order --- Marlin/src/pins/pins.h | 96 +++++++++++++++++++++--------------------- 1 file changed, 48 insertions(+), 48 deletions(-) diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 11b42b1c32..78aeaf0660 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -70,32 +70,32 @@ // #if MB(RAMPS_OLD) - #include "ramps/pins_RAMPS_OLD.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "ramps/pins_RAMPS_OLD.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 #elif MB(RAMPS_13_EFB, RAMPS_13_EEB, RAMPS_13_EFF, RAMPS_13_EEF, RAMPS_13_SF) - #include "ramps/pins_RAMPS_13.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "ramps/pins_RAMPS_13.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 #elif MB(RAMPS_14_EFB, RAMPS_14_EEB, RAMPS_14_EFF, RAMPS_14_EEF, RAMPS_14_SF) - #include "ramps/pins_RAMPS.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "ramps/pins_RAMPS.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 #elif MB(RAMPS_PLUS_EFB, RAMPS_PLUS_EEB, RAMPS_PLUS_EFF, RAMPS_PLUS_EEF, RAMPS_PLUS_SF) - #include "ramps/pins_RAMPS_PLUS.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "ramps/pins_RAMPS_PLUS.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 // // RAMPS Derivatives - ATmega1280, ATmega2560 // #elif MB(3DRAG) - #include "ramps/pins_3DRAG.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "ramps/pins_3DRAG.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 #elif MB(K8200) - #include "ramps/pins_K8200.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "ramps/pins_K8200.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 #elif MB(K8400) - #include "ramps/pins_K8400.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "ramps/pins_K8400.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 #elif MB(K8600) - #include "ramps/pins_K8600.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "ramps/pins_K8600.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 #elif MB(K8800) - #include "ramps/pins_K8800.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "ramps/pins_K8800.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 #elif MB(BAM_DICE) - #include "ramps/pins_RAMPS.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "ramps/pins_RAMPS.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 #elif MB(BAM_DICE_DUE) - #include "ramps/pins_BAM_DICE_DUE.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "ramps/pins_BAM_DICE_DUE.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 #elif MB(MKS_BASE) #include "ramps/pins_MKS_BASE_10.h" // ATmega2560 env:mega2560 #elif MB(MKS_BASE_14) @@ -107,27 +107,27 @@ #elif MB(MKS_BASE_HEROIC) #include "ramps/pins_MKS_BASE_HEROIC.h" // ATmega2560 env:mega2560 #elif MB(MKS_GEN_13) - #include "ramps/pins_MKS_GEN_13.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "ramps/pins_MKS_GEN_13.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 #elif MB(MKS_GEN_L) - #include "ramps/pins_MKS_GEN_L.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "ramps/pins_MKS_GEN_L.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 #elif MB(KFB_2) #include "ramps/pins_BIQU_KFB_2.h" // ATmega2560 env:mega2560 #elif MB(ZRIB_V20) - #include "ramps/pins_ZRIB_V20.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "ramps/pins_ZRIB_V20.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 #elif MB(ZRIB_V52) - #include "ramps/pins_ZRIB_V52.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "ramps/pins_ZRIB_V52.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 #elif MB(FELIX2) - #include "ramps/pins_FELIX2.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "ramps/pins_FELIX2.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 #elif MB(RIGIDBOARD) - #include "ramps/pins_RIGIDBOARD.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "ramps/pins_RIGIDBOARD.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 #elif MB(RIGIDBOARD_V2) - #include "ramps/pins_RIGIDBOARD_V2.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "ramps/pins_RIGIDBOARD_V2.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 #elif MB(SAINSMART_2IN1) - #include "ramps/pins_SAINSMART_2IN1.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "ramps/pins_SAINSMART_2IN1.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 #elif MB(ULTIMAKER) - #include "ramps/pins_ULTIMAKER.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "ramps/pins_ULTIMAKER.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 #elif MB(ULTIMAKER_OLD) - #include "ramps/pins_ULTIMAKER_OLD.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "ramps/pins_ULTIMAKER_OLD.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 #elif MB(AZTEEG_X3) #include "ramps/pins_AZTEEG_X3.h" // ATmega2560 env:mega2560 #elif MB(AZTEEG_X3_PRO) @@ -215,13 +215,13 @@ // #elif MB(CNCONTROLS_11) - #include "mega/pins_CNCONTROLS_11.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "mega/pins_CNCONTROLS_11.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 #elif MB(CNCONTROLS_12) - #include "mega/pins_CNCONTROLS_12.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "mega/pins_CNCONTROLS_12.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 #elif MB(CNCONTROLS_15) - #include "mega/pins_CNCONTROLS_15.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "mega/pins_CNCONTROLS_15.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 #elif MB(MIGHTYBOARD_REVE) - #include "mega/pins_MIGHTYBOARD_REVE.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560ext + #include "mega/pins_MIGHTYBOARD_REVE.h" // ATmega2560, ATmega1280 env:mega2560ext env:mega1280 #elif MB(CHEAPTRONIC) #include "mega/pins_CHEAPTRONIC.h" // ATmega2560 env:mega2560 #elif MB(CHEAPTRONIC_V2) @@ -235,13 +235,13 @@ #elif MB(ELEFU_3) #include "mega/pins_ELEFU_3.h" // ATmega2560 env:mega2560 #elif MB(LEAPFROG) - #include "mega/pins_LEAPFROG.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "mega/pins_LEAPFROG.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 #elif MB(MEGACONTROLLER) #include "mega/pins_MEGACONTROLLER.h" // ATmega2560 env:mega2560 #elif MB(GT2560_REV_A) - #include "mega/pins_GT2560_REV_A.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "mega/pins_GT2560_REV_A.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 #elif MB(GT2560_REV_A_PLUS) - #include "mega/pins_GT2560_REV_A_PLUS.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560 + #include "mega/pins_GT2560_REV_A_PLUS.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 #elif MB(GT2560_V3) #include "mega/pins_GT2560_V3.h" // ATmega2560 env:mega2560 #elif MB(GT2560_V3_MC2) @@ -249,7 +249,7 @@ #elif MB(GT2560_V3_A20) #include "mega/pins_GT2560_V3_A20.h" // ATmega2560 env:mega2560 #elif MB(EINSTART_S) - #include "mega/pins_EINSTART-S.h" // ATmega1280, ATmega2560 env:mega1280 env:mega2560ext + #include "mega/pins_EINSTART-S.h" // ATmega2560, ATmega1280 env:mega2560ext env:mega1280 #elif MB(WANHAO_ONEPLUS) #include "mega/pins_WANHAO_ONEPLUS.h" // ATmega2560 env:mega2560 #elif MB(OVERLORD) @@ -281,27 +281,27 @@ // #elif MB(SANGUINOLOLU_11) - #include "sanguino/pins_SANGUINOLOLU_11.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p env:sanguino1284p_optimized + #include "sanguino/pins_SANGUINOLOLU_11.h" // ATmega644P, ATmega1284P env:sanguino1284p_optimized env:sanguino1284p env:sanguino644p #elif MB(SANGUINOLOLU_12) - #include "sanguino/pins_SANGUINOLOLU_12.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p env:sanguino1284p_optimized + #include "sanguino/pins_SANGUINOLOLU_12.h" // ATmega644P, ATmega1284P env:sanguino1284p_optimized env:sanguino1284p env:sanguino644p #elif MB(MELZI) - #include "sanguino/pins_MELZI.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p env:sanguino1284p_optimized + #include "sanguino/pins_MELZI.h" // ATmega644P, ATmega1284P env:sanguino1284p_optimized env:sanguino1284p env:sanguino644p #elif MB(MELZI_V2) - #include "sanguino/pins_MELZI_V2.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p env:sanguino1284p_optimized + #include "sanguino/pins_MELZI_V2.h" // ATmega644P, ATmega1284P env:sanguino1284p_optimized env:sanguino1284p env:sanguino644p #elif MB(MELZI_MAKR3D) - #include "sanguino/pins_MELZI_MAKR3D.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p env:sanguino1284p_optimized + #include "sanguino/pins_MELZI_MAKR3D.h" // ATmega644P, ATmega1284P env:sanguino1284p_optimized env:sanguino1284p env:sanguino644p #elif MB(MELZI_CREALITY) - #include "sanguino/pins_MELZI_CREALITY.h" // ATmega1284P env:melzi env:melzi_optimized env:melzi_optiboot env:melzi_optiboot_optimized + #include "sanguino/pins_MELZI_CREALITY.h" // ATmega1284P env:melzi_optiboot_optimized env:melzi_optiboot env:melzi_optimized env:melzi #elif MB(MELZI_MALYAN) - #include "sanguino/pins_MELZI_MALYAN.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p env:sanguino1284p_optimized + #include "sanguino/pins_MELZI_MALYAN.h" // ATmega644P, ATmega1284P env:sanguino1284p_optimized env:sanguino1284p env:sanguino644p #elif MB(MELZI_TRONXY) - #include "sanguino/pins_MELZI_TRONXY.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p env:sanguino1284p_optimized + #include "sanguino/pins_MELZI_TRONXY.h" // ATmega644P, ATmega1284P env:sanguino1284p_optimized env:sanguino1284p env:sanguino644p #elif MB(STB_11) - #include "sanguino/pins_STB_11.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p env:sanguino1284p_optimized + #include "sanguino/pins_STB_11.h" // ATmega644P, ATmega1284P env:sanguino1284p_optimized env:sanguino1284p env:sanguino644p #elif MB(AZTEEG_X1) - #include "sanguino/pins_AZTEEG_X1.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p env:sanguino1284p_optimized + #include "sanguino/pins_AZTEEG_X1.h" // ATmega644P, ATmega1284P env:sanguino1284p_optimized env:sanguino1284p env:sanguino644p #elif MB(ZMIB_V2) - #include "sanguino/pins_ZMIB_V2.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p env:sanguino1284p_optimized + #include "sanguino/pins_ZMIB_V2.h" // ATmega644P, ATmega1284P env:sanguino1284p_optimized env:sanguino1284p env:sanguino644p // // Other ATmega644P, ATmega644, ATmega1284P @@ -310,19 +310,19 @@ #elif MB(GEN3_MONOLITHIC) #include "sanguino/pins_GEN3_MONOLITHIC.h" // ATmega644P env:sanguino644p #elif MB(GEN3_PLUS) - #include "sanguino/pins_GEN3_PLUS.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p env:sanguino1284p_optimized + #include "sanguino/pins_GEN3_PLUS.h" // ATmega644P, ATmega1284P env:sanguino1284p_optimized env:sanguino1284p env:sanguino644p #elif MB(GEN6) - #include "sanguino/pins_GEN6.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p env:sanguino1284p_optimized + #include "sanguino/pins_GEN6.h" // ATmega644P, ATmega1284P env:sanguino1284p_optimized env:sanguino1284p env:sanguino644p #elif MB(GEN6_DELUXE) - #include "sanguino/pins_GEN6_DELUXE.h" // ATmega644P, ATmega1284P env:sanguino644p env:sanguino1284p env:sanguino1284p_optimized + #include "sanguino/pins_GEN6_DELUXE.h" // ATmega644P, ATmega1284P env:sanguino1284p_optimized env:sanguino1284p env:sanguino644p #elif MB(GEN7_CUSTOM) - #include "sanguino/pins_GEN7_CUSTOM.h" // ATmega644P, ATmega644, ATmega1284P env:sanguino644p env:sanguino1284p env:sanguino1284p_optimized + #include "sanguino/pins_GEN7_CUSTOM.h" // ATmega644P, ATmega644, ATmega1284P env:sanguino1284p_optimized env:sanguino1284p env:sanguino644p #elif MB(GEN7_12) - #include "sanguino/pins_GEN7_12.h" // ATmega644P, ATmega644, ATmega1284P env:sanguino644p env:sanguino1284p env:sanguino1284p_optimized + #include "sanguino/pins_GEN7_12.h" // ATmega644P, ATmega644, ATmega1284P env:sanguino1284p_optimized env:sanguino1284p env:sanguino644p #elif MB(GEN7_13) - #include "sanguino/pins_GEN7_13.h" // ATmega644P, ATmega644, ATmega1284P env:sanguino644p env:sanguino1284p env:sanguino1284p_optimized + #include "sanguino/pins_GEN7_13.h" // ATmega644P, ATmega644, ATmega1284P env:sanguino1284p_optimized env:sanguino1284p env:sanguino644p #elif MB(GEN7_14) - #include "sanguino/pins_GEN7_14.h" // ATmega644P, ATmega644, ATmega1284P env:sanguino644p env:sanguino1284p env:sanguino1284p_optimized + #include "sanguino/pins_GEN7_14.h" // ATmega644P, ATmega644, ATmega1284P env:sanguino1284p_optimized env:sanguino1284p env:sanguino644p #elif MB(OMCA_A) #include "sanguino/pins_OMCA_A.h" // ATmega644 env:sanguino644p #elif MB(OMCA) @@ -330,7 +330,7 @@ #elif MB(ANET_10) #include "sanguino/pins_ANET_10.h" // ATmega1284P env:sanguino1284p env:sanguino1284p_optimized #elif MB(SETHI) - #include "sanguino/pins_SETHI.h" // ATmega644P, ATmega644, ATmega1284P env:sanguino644p env:sanguino1284p env:sanguino1284p_optimized + #include "sanguino/pins_SETHI.h" // ATmega644P, ATmega644, ATmega1284P env:sanguino1284p_optimized env:sanguino1284p env:sanguino644p // // Teensyduino - AT90USB1286, AT90USB1286P From b2bc85f6f657ddfeedb8fc5c608fc039c064b2aa Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 1 Mar 2021 05:39:31 -0600 Subject: [PATCH 073/253] build_all_examples -c -s, silent mftest --- buildroot/bin/build_all_examples | 36 +++++++++++++++++++++++++------- buildroot/bin/build_example | 2 +- buildroot/bin/mftest | 6 +++--- 3 files changed, 32 insertions(+), 12 deletions(-) diff --git a/buildroot/bin/build_all_examples b/buildroot/bin/build_all_examples index 91870ab156..bce95dce88 100755 --- a/buildroot/bin/build_all_examples +++ b/buildroot/bin/build_all_examples @@ -30,24 +30,37 @@ echo "This script downloads all Configurations and builds Marlin with each one." echo "On failure the last-built configs will be left in your working copy." echo "Restore your configs with 'git checkout -f' or 'git reset --hard HEAD'." +unset BRANCH +unset FIRST_CONF +if [[ -f "$STAT_FILE" ]]; then + IFS='*' read BRANCH FIRST_CONF <"$STAT_FILE" +fi + # If -c is given start from the last attempted build if [[ $1 == '-c' ]]; then - if [[ -f "$STAT_FILE" ]]; then - read BRANCH FIRST_CONF <"$STAT_FILE" - else + if [[ -z $BRANCH || -z $FIRST_CONF ]]; then echo "Nothing to continue" exit fi +elif [[ $1 == '-s' ]]; then + if [[ -n $BRANCH && -n $FIRST_CONF ]]; then + SKIP_CONF=1 + else + echo "Nothing to skip" + exit + fi else BRANCH=${1:-"import-2.0.x"} FIRST_CONF=$2 fi # Check if the current repository has unmerged changes -if [[ -z "$FIRST_CONF" ]]; then - git diff --quiet || { echo "The working copy is modified. Commit or stash changes before proceeding."; exit ; } -else +if [[ $SKIP_CONF ]]; then + echo "Skipping $FIRST_CONF" +elif [[ $FIRST_CONF ]]; then echo "Resuming from $FIRST_CONF" +else + git diff --quiet || { echo "The working copy is modified. Commit or stash changes before proceeding."; exit ; } fi # Create a temporary folder inside .pio @@ -67,12 +80,19 @@ shopt -s nullglob IFS=' ' CONF_TREE=$( ls -d "$TMP"/config/examples/*/ "$TMP"/config/examples/*/*/ "$TMP"/config/examples/*/*/*/ "$TMP"/config/examples/*/*/*/*/ | grep -vE ".+\.(\w+)$" ) +DOSKIP=0 for CONF in $CONF_TREE ; do + # Get a config's directory name DIR=$( echo $CONF | sed "s|$TMP/config/examples/||" ) - [[ ! -z $FIRST_CONF ]] && [[ $FIRST_CONF != $DIR && "$FIRST_CONF/" != $DIR ]] && continue + # If looking for a config, skip others + [[ $FIRST_CONF ]] && [[ $FIRST_CONF != $DIR && "$FIRST_CONF/" != $DIR ]] && continue + # Once found, stop looking unset FIRST_CONF + # If skipping, don't build the found one + [[ $SKIP_CONF ]] && { unset SKIP_CONF ; continue ; } + # ...if skipping, don't build this one compgen -G "${CONF}Con*.h" > /dev/null || continue - echo -e "$BRANCH\n$DIR" >"$STAT_FILE" + echo "${BRANCH}*${DIR}" >"$STAT_FILE" "$HERE/build_example" "internal" "$TMP" "$DIR" || { echo "Failed to build $DIR"; exit ; } done diff --git a/buildroot/bin/build_example b/buildroot/bin/build_example index 3c19b7b626..8ebb58f972 100755 --- a/buildroot/bin/build_example +++ b/buildroot/bin/build_example @@ -24,6 +24,6 @@ cp "$SUB"/_Statusscreen.h Marlin/ 2>/dev/null echo "Building the firmware now..." HERE=`dirname "$0"` -$HERE/mftest -a || { echo "Failed"; exit 1; } +$HERE/mftest -a -n1 || { echo "Failed"; exit 1; } echo "Success" diff --git a/buildroot/bin/mftest b/buildroot/bin/mftest index 4626352f7a..00f7a2e7e0 100755 --- a/buildroot/bin/mftest +++ b/buildroot/bin/mftest @@ -105,7 +105,7 @@ if ((REBUILD)); then # Build with the last-built env [[ -f "$STATE_FILE" ]] || { errout "No previous (-r) build state found." ; exit 1 ; } read TESTENV <"$STATE_FILE" - pio run -d . -e $TESTENV + pio run -s -d . -e $TESTENV exit fi @@ -192,7 +192,7 @@ if ((AUTO_BUILD)); then pio run -t upload -e $TARGET else echo "Building environment $TARGET for board $MB ($BNUM)..." ; echo - pio run -e $TARGET + pio run -s -e $TARGET fi exit fi @@ -307,6 +307,6 @@ fi [[ $BUILD_YES == 'Y' || $BUILD_YES == 'Yes' ]] && { ((USE_MAKE)) && make tests-single-local TEST_TARGET=$TESTENV ONLY_TEST=$CHOICE - ((USE_MAKE)) || pio run -d . -e $TESTENV + ((USE_MAKE)) || pio run -s -d . -e $TESTENV echo "$TESTENV" >"$STATE_FILE" } From dfa33082bbe7cdf2888349a301cfd6636430cd0a Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 1 Mar 2021 07:10:00 -0600 Subject: [PATCH 074/253] Fix some config builds --- Marlin/src/gcode/feature/caselight/M355.cpp | 10 ++++++---- Marlin/src/module/motion.cpp | 2 +- Marlin/src/module/motion.h | 4 +++- Marlin/src/pins/pins.h | 2 +- .../share/PlatformIO/scripts/STM32F103VE_longer.py | 1 - 5 files changed, 11 insertions(+), 8 deletions(-) diff --git a/Marlin/src/gcode/feature/caselight/M355.cpp b/Marlin/src/gcode/feature/caselight/M355.cpp index 6634a90f46..b0d94e7cd8 100644 --- a/Marlin/src/gcode/feature/caselight/M355.cpp +++ b/Marlin/src/gcode/feature/caselight/M355.cpp @@ -60,10 +60,12 @@ void GcodeSuite::M355() { if (!caselight.on) SERIAL_ECHOLNPGM(STR_OFF); else { - if (TERN0(CASELIGHT_USES_BRIGHTNESS, TERN(CASE_LIGHT_USE_NEOPIXEL, true, PWM_PIN(CASE_LIGHT_PIN)))) { - SERIAL_ECHOLN(int(caselight.brightness)); - return; - } + #if CASELIGHT_USES_BRIGHTNESS + if (TERN(CASE_LIGHT_USE_NEOPIXEL, true, PWM_PIN(CASE_LIGHT_PIN))) { + SERIAL_ECHOLN(int(caselight.brightness)); + return; + } + #endif SERIAL_ECHOLNPGM(STR_ON); } } diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index 580700bfe2..6fff80ff74 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -1569,7 +1569,7 @@ void prepare_line_to_destination() { if (bump) { // Move away from the endstop by the axis HOMING_BUMP_MM if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Move Away: ", -bump, "mm"); - do_homing_move(axis, -bump, TERN0(HOMING_Z_WITH_PROBE, axis == Z_AXIS) ? MMM_TO_MMS(Z_PROBE_FEEDRATE_FAST) : 0, false); + do_homing_move(axis, -bump, TERN(HOMING_Z_WITH_PROBE, (axis == Z_AXIS ? z_probe_fast_mm_s : 0), 0), false); #if ENABLED(DETECT_BROKEN_ENDSTOP) // Check for a broken endstop diff --git a/Marlin/src/module/motion.h b/Marlin/src/module/motion.h index 2595084b4a..f784c7bf80 100644 --- a/Marlin/src/module/motion.h +++ b/Marlin/src/module/motion.h @@ -65,7 +65,9 @@ extern xyz_pos_t cartes; #define XY_PROBE_FEEDRATE_MM_S PLANNER_XY_FEEDRATE() #endif -constexpr feedRate_t z_probe_fast_mm_s = MMM_TO_MMS(Z_PROBE_FEEDRATE_FAST); +#if HAS_BED_PROBE + constexpr feedRate_t z_probe_fast_mm_s = MMM_TO_MMS(Z_PROBE_FEEDRATE_FAST); +#endif /** * Feed rates are often configured with mm/m diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 78aeaf0660..b8cf695fb5 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -255,7 +255,7 @@ #elif MB(OVERLORD) #include "mega/pins_OVERLORD.h" // ATmega2560 env:mega2560 #elif MB(HJC2560C_REV1) - #include "mega/pins_HJC2560C_REV1.h" // ATmega2560 env:mega2560 + #include "mega/pins_HJC2560C_REV2.h" // ATmega2560 env:mega2560 #elif MB(HJC2560C_REV2) #include "mega/pins_HJC2560C_REV2.h" // ATmega2560 env:mega2560 #elif MB(LEAPFROG_XEED2015) diff --git a/buildroot/share/PlatformIO/scripts/STM32F103VE_longer.py b/buildroot/share/PlatformIO/scripts/STM32F103VE_longer.py index bbdfcd93b7..321dd01b8d 100644 --- a/buildroot/share/PlatformIO/scripts/STM32F103VE_longer.py +++ b/buildroot/share/PlatformIO/scripts/STM32F103VE_longer.py @@ -18,7 +18,6 @@ for i, flag in enumerate(env["LINKFLAGS"]): elif flag == "-T": env["LINKFLAGS"][i + 1] = custom_ld_script - # Rename ${PROGNAME}.bin and save it as 'project.bin' (No encryption on the Longer3D) def encrypt(source, target, env): firmware = open(target[0].path, "rb") From 137f70b1221ceb3218d7ed0a61939f650568302b Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Tue, 2 Mar 2021 00:11:00 +0000 Subject: [PATCH 075/253] [cron] Bump distribution date (2021-03-02) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 193468838a..460f29834d 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2021-03-01" + #define STRING_DISTRIBUTION_DATE "2021-03-02" #endif /** From 35791c6371dad924f9a3f0fb3aebacfd298ecc35 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 1 Mar 2021 19:39:43 -0600 Subject: [PATCH 076/253] Trust XY after Quiet Probing short sleep (#21237) --- Marlin/src/module/probe.cpp | 36 ++++++++++++++++++++++++------------ 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/Marlin/src/module/probe.cpp b/Marlin/src/module/probe.cpp index 7333aaa748..28c89e7a00 100644 --- a/Marlin/src/module/probe.cpp +++ b/Marlin/src/module/probe.cpp @@ -238,20 +238,32 @@ xyz_pos_t Probe::offset; // Initialized by settings.load() #if HAS_QUIET_PROBING - void Probe::set_probing_paused(const bool p) { - TERN_(PROBING_HEATERS_OFF, thermalManager.pause(p)); - TERN_(PROBING_FANS_OFF, thermalManager.set_fans_paused(p)); + #ifndef DELAY_BEFORE_PROBING + #define DELAY_BEFORE_PROBING 25 + #endif + + void Probe::set_probing_paused(const bool dopause) { + TERN_(PROBING_HEATERS_OFF, thermalManager.pause(dopause)); + TERN_(PROBING_FANS_OFF, thermalManager.set_fans_paused(dopause)); #if ENABLED(PROBING_STEPPERS_OFF) - disable_e_steppers(); - #if NONE(DELTA, HOME_AFTER_DEACTIVATE) - DISABLE_AXIS_X(); DISABLE_AXIS_Y(); - #endif + IF_DISABLED(DELTA, static uint8_t old_trusted); + if (dopause) { + #if DISABLED(DELTA) + old_trusted = axis_trusted; + DISABLE_AXIS_X(); + DISABLE_AXIS_Y(); + #endif + disable_e_steppers(); + } + else { + #if DISABLED(DELTA) + if (TEST(old_trusted, X_AXIS)) ENABLE_AXIS_X(); + if (TEST(old_trusted, Y_AXIS)) ENABLE_AXIS_Y(); + #endif + axis_trusted = old_trusted; + } #endif - if (p) safe_delay(25 - #if DELAY_BEFORE_PROBING > 25 - - 25 + DELAY_BEFORE_PROBING - #endif - ); + if (dopause) safe_delay(_MAX(DELAY_BEFORE_PROBING, 25)); } #endif // HAS_QUIET_PROBING From 872f0314055596990b873426da8695526e394e1a Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Wed, 3 Mar 2021 00:15:08 +0000 Subject: [PATCH 077/253] [cron] Bump distribution date (2021-03-03) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 460f29834d..7e72f0fee8 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2021-03-02" + #define STRING_DISTRIBUTION_DATE "2021-03-03" #endif /** From 0afa4cc9573565b4fdb8a24f85bd0ab41c3d1721 Mon Sep 17 00:00:00 2001 From: Sola <42537573+solawc@users.noreply.github.com> Date: Wed, 3 Mar 2021 10:58:42 +0800 Subject: [PATCH 078/253] Fix MKS H43 compile (#21240) --- .../lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp | 16 ++++++++++++---- .../lcd/extui/lib/dgus/mks/DGUSScreenHandler.h | 2 ++ 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp index 6cbc534110..bdd702b1d7 100644 --- a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp @@ -49,12 +49,18 @@ #include "../../../../../feature/powerloss.h" #endif +#if ENABLED(SDSUPPORT) + static ExtUI::FileList filelist; +#endif + bool DGUSAutoTurnOff = false; uint8_t DGUSLanguageSwitch = 0; // Switch language for MKS DGUS // endianness swap uint32_t swap32(const uint32_t value) { return (value & 0x000000FFU) << 24U | (value & 0x0000FF00U) << 8U | (value & 0x00FF0000U) >> 8U | (value & 0xFF000000U) >> 24U; } +#if 0 + void DGUSScreenHandler::sendinfoscreen_ch_mks(const uint16_t* line1, const uint16_t* line2, const uint16_t* line3, const uint16_t* line4) { dgusdisplay.WriteVariable(VP_MSGSTR1, line1, 32, true); dgusdisplay.WriteVariable(VP_MSGSTR2, line2, 32, true); @@ -76,6 +82,8 @@ void DGUSScreenHandler::sendinfoscreen_mks(const void* line1, const void* line2, DGUSScreenHandler::sendinfoscreen_ch_mks((uint16_t *)line1, (uint16_t *)line2, (uint16_t *)line3, (uint16_t *)line4); } +#endif + void DGUSScreenHandler::DGUSLCD_SendFanToDisplay(DGUS_VP_Variable &var) { if (var.memadr) { //DEBUG_ECHOPAIR(" DGUS_LCD_SendWordValueToDisplay ", var.VP); @@ -256,7 +264,7 @@ void DGUSScreenHandler::DGUSLCD_SendTMCStepValue(DGUS_VP_Variable &var) { void DGUSScreenHandler::SDPrintingFinished() { if (DGUSAutoTurnOff) { - while (queue.length) queue.advance(); + while(!queue.ring_buffer.empty()) queue.advance(); gcode.process_subcommands_now_P(PSTR("M81")); } GotoScreen(MKSLCD_SCREEN_PrintDone); @@ -786,7 +794,7 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { DEBUG_ECHOLNPAIR("QUEUE LEN:", queue.length); - if (!print_job_timer.isPaused() && queue.length >= BUFSIZE) + if (!print_job_timer.isPaused() && queue.ring_buffer.full(1)) return; char axiscode; @@ -1778,7 +1786,7 @@ void DGUSScreenHandler::DGUS_LanguageDisplay(uint8_t var) { dgusdisplay.WriteVariable(VP_PrintAcc_Dis, PrintAcc_buf_en, 32, true); const char FAN_Speed_buf_en[] = "FAN_Speed"; - dgusdisplay.WriteVariable(VP_FAN_Speed_Dis, FAN_Speed_buf_en, 32, true); + dgusdisplay.WriteVariable(VP_Fan_Speed_Dis, FAN_Speed_buf_en, 32, true); const char Printing_buf_en[] = "Printing"; dgusdisplay.WriteVariable(VP_Printing_Dis, Printing_buf_en, 32, true); @@ -2033,7 +2041,7 @@ void DGUSScreenHandler::DGUS_LanguageDisplay(uint8_t var) { dgusdisplay.WriteVariable(VP_PrintAcc_Dis, PrintAcc_buf_ch, 16, true); const uint16_t FAN_Speed_buf_ch[] = { 0xE7B7, 0xC8C9, 0xD9CB, 0xC8B6, 0x2000 }; - dgusdisplay.WriteVariable(VP_FAN_Speed_Dis, FAN_Speed_buf_ch, 16, true); + dgusdisplay.WriteVariable(VP_Fan_Speed_Dis, FAN_Speed_buf_ch, 16, true); const uint16_t Printing_buf_ch[] = { 0xF2B4, 0xA1D3, 0xD0D6, 0x2000 }; dgusdisplay.WriteVariable(VP_Printing_Dis, Printing_buf_ch, 16, true); diff --git a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.h b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.h index 4d6e985d84..15e232e413 100644 --- a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.h +++ b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.h @@ -41,9 +41,11 @@ public: static void HandleUserConfirmationPopUp(uint16_t ConfirmVP, const char* line1, const char* line2, const char* line3, const char* line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash); + #if 0 static void sendinfoscreen_ch_mks(const uint16_t* line1, const uint16_t* line2, const uint16_t* line3, const uint16_t* line4); static void sendinfoscreen_en_mks(const char* line1, const char* line2, const char* line3, const char* line4) ; static void sendinfoscreen_mks(const void* line1, const void* line2, const void* line3, const void* line4,uint16_t language); + #endif // "M117" Message -- msg is a RAM ptr. static void setstatusmessage(const char* msg); From 369ffe518d0b90bd9caa457a710014710b5046db Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 3 Mar 2021 00:15:56 -0600 Subject: [PATCH 079/253] Improve opt_set (etc.) used for tests --- buildroot/bin/opt_enable | 4 +- buildroot/bin/opt_set | 14 ++-- buildroot/bin/pins_set | 2 +- buildroot/tests/ARMED-tests | 3 +- buildroot/tests/BIGTREE_BTT002-tests | 8 +- buildroot/tests/BIGTREE_GTR_V1_0-tests | 58 ++++---------- .../BIGTREE_GTR_V1_0_usb_flash_drive-tests | 45 +++-------- buildroot/tests/BIGTREE_SKR_PRO-tests | 25 ++---- buildroot/tests/DUE-tests | 27 +++---- buildroot/tests/FLYF407ZG-tests | 5 +- buildroot/tests/FYSETC_F6-tests | 41 ++++------ buildroot/tests/FYSETC_S6-tests | 3 +- buildroot/tests/LERDGEX-tests | 3 +- buildroot/tests/LPC1768-tests | 23 +++--- buildroot/tests/LPC1769-tests | 18 ++--- buildroot/tests/NUCLEO_F767ZI-tests | 5 +- buildroot/tests/SAMD51_grandcentral_m4-tests | 22 ++---- buildroot/tests/STM32F070CB_malyan-tests | 3 +- buildroot/tests/STM32F103RC_btt-tests | 9 +-- buildroot/tests/STM32F103RC_btt_USB-tests | 4 +- buildroot/tests/STM32F103RC_meeb-tests | 9 +-- buildroot/tests/STM32F103RE-tests | 4 +- buildroot/tests/STM32F103RET6_creality-tests | 7 +- buildroot/tests/STM32F103RE_btt-tests | 10 +-- buildroot/tests/STM32F103RE_btt_USB-tests | 9 +-- buildroot/tests/STM32F401VE_STEVAL-tests | 3 +- buildroot/tests/esp32-tests | 23 ++---- buildroot/tests/linux_native-tests | 3 +- buildroot/tests/mega1280-tests | 16 ++-- buildroot/tests/mega2560-tests | 77 +++++-------------- buildroot/tests/mks_robin_lite-tests | 6 +- buildroot/tests/mks_robin_mini-tests | 4 +- buildroot/tests/mks_robin_nano35-tests | 4 +- buildroot/tests/mks_robin_nano35_stm32-tests | 4 +- buildroot/tests/mks_robin_pro-tests | 12 ++- buildroot/tests/rambo-tests | 71 +++++++---------- buildroot/tests/rumba32-tests | 18 ++--- buildroot/tests/sanguino1284p-tests | 6 +- buildroot/tests/teensy31-tests | 9 +-- buildroot/tests/teensy35-tests | 45 ++++------- buildroot/tests/teensy41-tests | 42 ++++------ 41 files changed, 229 insertions(+), 475 deletions(-) diff --git a/buildroot/bin/opt_enable b/buildroot/bin/opt_enable index 96686d6c68..fdcb5dae2d 100755 --- a/buildroot/bin/opt_enable +++ b/buildroot/bin/opt_enable @@ -7,7 +7,7 @@ SED=$(which gsed || which sed) for opt in "$@" ; do # Logic for returning nonzero based on answer here: https://stackoverflow.com/a/15966279/104648 - eval "${SED} -i '/\(\/\/\)*[[:blank:]]*\(#define \b${opt}\b\)/{s//\2/;h};\${x;/./{x;q0};x;q9}' Marlin/Configuration.h" || - eval "${SED} -i '/\(\/\/\)*[[:blank:]]*\(#define \b${opt}\b\)/{s//\2/;h};\${x;/./{x;q0};x;q9}' Marlin/Configuration_adv.h" || + eval "${SED} -i '/^[[:blank:]]*\(\/\/\)*[[:blank:]]*\(#define \b${opt}\b\)/{s//\2/;h};\${x;/./{x;q0};x;q9}' Marlin/Configuration.h" || + eval "${SED} -i '/^[[:blank:]]*\(\/\/\)*[[:blank:]]*\(#define \b${opt}\b\)/{s//\2/;h};\${x;/./{x;q0};x;q9}' Marlin/Configuration_adv.h" || (echo "ERROR: opt_enable Can't find ${opt}" >&2 && exit 9) done diff --git a/buildroot/bin/opt_set b/buildroot/bin/opt_set index a646e09ae7..2a7a676cdc 100755 --- a/buildroot/bin/opt_set +++ b/buildroot/bin/opt_set @@ -5,8 +5,12 @@ set -e SED=$(which gsed || which sed) -# Logic for returning nonzero based on answer here: https://stackoverflow.com/a/15966279/104648 -eval "${SED} -i '/\(\/\/\)*\([[:blank:]]*\)\(#define\s\+\b${1}\b\).*$/{s//\2\3 ${2}/;h};\${x;/./{x;q0};x;q9}' Marlin/Configuration.h" || -eval "${SED} -i '/\(\/\/\)*\([[:blank:]]*\)\(#define\s\+\b${1}\b\).*$/{s//\2\3 ${2}/;h};\${x;/./{x;q0};x;q9}' Marlin/Configuration_adv.h" || -eval "echo '#define ${@}' >>Marlin/Configuration_adv.h" || -(echo "ERROR: opt_set Can't set or add ${1}" >&2 && exit 9) +ARGC=$# +while [[ $# > 1 ]]; do + # Logic for returning nonzero based on answer here: https://stackoverflow.com/a/15966279/104648 + eval "${SED} -i '/^[[:blank:]]*\(\/\/\)*\([[:blank:]]*\)\(#define\s\+\b${1}\b\).*$/{s//\2\3 ${2}/;h};\${x;/./{x;q0};x;q9}' Marlin/Configuration.h" || + eval "${SED} -i '/^[[:blank:]]*\(\/\/\)*\([[:blank:]]*\)\(#define\s\+\b${1}\b\).*$/{s//\2\3 ${2}/;h};\${x;/./{x;q0};x;q9}' Marlin/Configuration_adv.h" || + eval "echo '#define ${1} ${2}' >>Marlin/Configuration.h" || + (echo "ERROR: opt_set Can't set or add ${1}" >&2 && exit 9) + shift 2 +done diff --git a/buildroot/bin/pins_set b/buildroot/bin/pins_set index 87a8692aa2..860c64940f 100755 --- a/buildroot/bin/pins_set +++ b/buildroot/bin/pins_set @@ -7,5 +7,5 @@ PIN=$2 VAL=$3 SED=$(which gsed || which sed) -eval "${SED} -i '/\(\/\/\)*\(#define \+${PIN}\b\).*$/{s//\2 ${VAL}/;h};\${x;/./{x;q0};x;q9}' Marlin/src/pins/$DIR/pins_${NAM}.h" || +eval "${SED} -i '/^[[:blank:]]*\(\/\/\)*[[:blank:]]*\(#define \+${PIN}\b\).*$/{s//\2 ${VAL}/;h};\${x;/./{x;q0};x;q9}' Marlin/src/pins/$DIR/pins_${NAM}.h" || (echo "ERROR: pins_set Can't find ${PIN}" >&2 && exit 9) diff --git a/buildroot/tests/ARMED-tests b/buildroot/tests/ARMED-tests index 6aa1308ca4..8764d47e84 100755 --- a/buildroot/tests/ARMED-tests +++ b/buildroot/tests/ARMED-tests @@ -11,8 +11,7 @@ set -e # restore_configs use_example_configs ArmEd -opt_set X_DRIVER_TYPE TMC2130 -opt_set Y_DRIVER_TYPE TMC2208 +opt_set X_DRIVER_TYPE TMC2130 Y_DRIVER_TYPE TMC2208 exec_test $1 $2 "ArmEd Example Configuration with mixed TMC Drivers" "$3" # clean up diff --git a/buildroot/tests/BIGTREE_BTT002-tests b/buildroot/tests/BIGTREE_BTT002-tests index 90e033e969..ba13e3eafd 100755 --- a/buildroot/tests/BIGTREE_BTT002-tests +++ b/buildroot/tests/BIGTREE_BTT002-tests @@ -10,10 +10,10 @@ set -e # Build with the default configurations # restore_configs -opt_set MOTHERBOARD BOARD_BTT_BTT002_V1_0 -opt_set SERIAL_PORT 1 -opt_set X_DRIVER_TYPE TMC2209 -opt_set Y_DRIVER_TYPE TMC2130 +opt_set MOTHERBOARD BOARD_BTT_BTT002_V1_0 \ + SERIAL_PORT 1 \ + X_DRIVER_TYPE TMC2209 \ + Y_DRIVER_TYPE TMC2130 exec_test $1 $2 "BigTreeTech BTT002 Default Configuration plus TMC steppers" "$3" # clean up diff --git a/buildroot/tests/BIGTREE_GTR_V1_0-tests b/buildroot/tests/BIGTREE_GTR_V1_0-tests index adc850db03..95a1e0acac 100755 --- a/buildroot/tests/BIGTREE_GTR_V1_0-tests +++ b/buildroot/tests/BIGTREE_GTR_V1_0-tests @@ -7,54 +7,24 @@ set -e restore_configs -opt_set MOTHERBOARD BOARD_BTT_GTR_V1_0 -opt_set SERIAL_PORT -1 -opt_set EXTRUDERS 8 -opt_set TEMP_SENSOR_1 1 -opt_set TEMP_SENSOR_2 1 -opt_set TEMP_SENSOR_3 1 -opt_set TEMP_SENSOR_4 1 -opt_set TEMP_SENSOR_5 1 -opt_set TEMP_SENSOR_6 1 -opt_set TEMP_SENSOR_7 1 +opt_set MOTHERBOARD BOARD_BTT_GTR_V1_0 SERIAL_PORT -1 \ + EXTRUDERS 8 TEMP_SENSOR_1 1 TEMP_SENSOR_2 1 TEMP_SENSOR_3 1 TEMP_SENSOR_4 1 TEMP_SENSOR_5 1 TEMP_SENSOR_6 1 TEMP_SENSOR_7 1 # Not necessary to enable auto-fan for all extruders to hit problematic code paths -opt_set E0_AUTO_FAN_PIN PC10 -opt_set E1_AUTO_FAN_PIN PC11 -opt_set E2_AUTO_FAN_PIN PC12 -opt_set X_DRIVER_TYPE TMC2208 -opt_set Y_DRIVER_TYPE TMC2130 -opt_set NEOPIXEL_PIN PF13 -opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER BLTOUCH NEOPIXEL_LED Z_SAFE_HOMING -opt_enable FILAMENT_RUNOUT_SENSOR NOZZLE_PARK_FEATURE ADVANCED_PAUSE_FEATURE -opt_set FIL_RUNOUT_PIN 3 -opt_set FIL_RUNOUT2_PIN 4 -opt_set FIL_RUNOUT3_PIN 5 -opt_set FIL_RUNOUT4_PIN 6 -opt_set FIL_RUNOUT5_PIN 7 -opt_set FIL_RUNOUT6_PIN 8 -opt_set FIL_RUNOUT7_PIN 9 -opt_set FIL_RUNOUT8_PIN 10 -opt_set FIL_RUNOUT4_STATE HIGH -opt_enable FIL_RUNOUT4_PULLUP -opt_set FIL_RUNOUT8_STATE HIGH -opt_enable FIL_RUNOUT8_PULLUP -exec_test $1 $2 "BigTreeTech GTR 8 Extruders with Auto-Fan, Mixed TMC Drivers, and Runout Sensors with distinct states" "$3" +opt_set E0_AUTO_FAN_PIN PC10 E1_AUTO_FAN_PIN PC11 E2_AUTO_FAN_PIN PC12 NEOPIXEL_PIN PF13 \ + X_DRIVER_TYPE TMC2208 Y_DRIVER_TYPE TMC2130 \ + FIL_RUNOUT_PIN 3 FIL_RUNOUT2_PIN 4 FIL_RUNOUT3_PIN 5 FIL_RUNOUT4_PIN 6 FIL_RUNOUT5_PIN 7 FIL_RUNOUT6_PIN 8 FIL_RUNOUT7_PIN 9 FIL_RUNOUT8_PIN 10 \ + FIL_RUNOUT4_STATE HIGH FIL_RUNOUT8_STATE HIGH +opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER BLTOUCH NEOPIXEL_LED Z_SAFE_HOMING NOZZLE_PARK_FEATURE ADVANCED_PAUSE_FEATURE \ + FILAMENT_RUNOUT_SENSOR FIL_RUNOUT4_PULLUP FIL_RUNOUT8_PULLUP +exec_test $1 $2 "BigTreeTech GTR | 8 Extruders | Auto-Fan | Mixed TMC Drivers | Runout Sensors w/ distinct states" "$3" restore_configs -opt_set MOTHERBOARD BOARD_BTT_GTR_V1_0 -opt_set SERIAL_PORT -1 -opt_set EXTRUDERS 6 -opt_set TEMP_SENSOR_1 1 -opt_set TEMP_SENSOR_2 1 -opt_set TEMP_SENSOR_3 1 -opt_set TEMP_SENSOR_4 1 -opt_set TEMP_SENSOR_5 1 -opt_set NUM_Z_STEPPER_DRIVERS 3 -opt_set DEFAULT_Kp_LIST "{ 22.2, 20.0, 21.0, 19.0, 18.0, 17.0 }" -opt_set DEFAULT_Ki_LIST "{ 1.08 }" -opt_set DEFAULT_Kd_LIST "{ 114.0, 112.0, 110.0, 108.0 }" +opt_set MOTHERBOARD BOARD_BTT_GTR_V1_0 SERIAL_PORT -1 \ + EXTRUDERS 6 TEMP_SENSOR_1 1 TEMP_SENSOR_2 1 TEMP_SENSOR_3 1 TEMP_SENSOR_4 1 TEMP_SENSOR_5 1 \ + NUM_Z_STEPPER_DRIVERS 3 \ + DEFAULT_Kp_LIST '{ 22.2, 20.0, 21.0, 19.0, 18.0, 17.0 }' DEFAULT_Ki_LIST '{ 1.08 }' DEFAULT_Kd_LIST '{ 114.0, 112.0, 110.0, 108.0 }' opt_enable TOOLCHANGE_FILAMENT_SWAP TOOLCHANGE_MIGRATION_FEATURE TOOLCHANGE_FS_INIT_BEFORE_SWAP TOOLCHANGE_FS_PRIME_FIRST_USED PID_PARAMS_PER_HOTEND -exec_test $1 $2 "BigTreeTech GTR 6 Extruders Triple Z" "$3" +exec_test $1 $2 "BigTreeTech GTR | 6 Extruders | Triple Z" "$3" # clean up restore_configs diff --git a/buildroot/tests/BIGTREE_GTR_V1_0_usb_flash_drive-tests b/buildroot/tests/BIGTREE_GTR_V1_0_usb_flash_drive-tests index 0504fc1da9..197ece5dfd 100755 --- a/buildroot/tests/BIGTREE_GTR_V1_0_usb_flash_drive-tests +++ b/buildroot/tests/BIGTREE_GTR_V1_0_usb_flash_drive-tests @@ -7,41 +7,18 @@ set -e restore_configs -opt_set MOTHERBOARD BOARD_BTT_GTR_V1_0 -opt_set SERIAL_PORT 3 -opt_set EXTRUDERS 8 -opt_set TEMP_SENSOR_1 1 -opt_set TEMP_SENSOR_2 1 -opt_set TEMP_SENSOR_3 1 -opt_set TEMP_SENSOR_4 1 -opt_set TEMP_SENSOR_5 1 -opt_set TEMP_SENSOR_6 1 -opt_set TEMP_SENSOR_7 1 -opt_set SDSUPPORT -opt_set USB_FLASH_DRIVE_SUPPORT -opt_set USE_OTG_USB_HOST +opt_set MOTHERBOARD BOARD_BTT_GTR_V1_0 SERIAL_PORT 3 \ + EXTRUDERS 8 TEMP_SENSOR_1 1 TEMP_SENSOR_2 1 TEMP_SENSOR_3 1 TEMP_SENSOR_4 1 TEMP_SENSOR_5 1 TEMP_SENSOR_6 1 TEMP_SENSOR_7 1 +opt_enable SDSUPPORT USB_FLASH_DRIVE_SUPPORT USE_OTG_USB_HOST \ + REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER BLTOUCH NEOPIXEL_LED Z_SAFE_HOMING \ + FILAMENT_RUNOUT_SENSOR NOZZLE_PARK_FEATURE ADVANCED_PAUSE_FEATURE # Not necessary to enable auto-fan for all extruders to hit problematic code paths -opt_set E0_AUTO_FAN_PIN PC10 -opt_set E1_AUTO_FAN_PIN PC11 -opt_set E2_AUTO_FAN_PIN PC12 -opt_set X_DRIVER_TYPE TMC2208 -opt_set Y_DRIVER_TYPE TMC2130 -opt_set NEOPIXEL_PIN PF13 -opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER BLTOUCH NEOPIXEL_LED Z_SAFE_HOMING -opt_enable FILAMENT_RUNOUT_SENSOR NOZZLE_PARK_FEATURE ADVANCED_PAUSE_FEATURE -opt_set FIL_RUNOUT_PIN 3 -opt_set FIL_RUNOUT2_PIN 4 -opt_set FIL_RUNOUT3_PIN 5 -opt_set FIL_RUNOUT4_PIN 6 -opt_set FIL_RUNOUT5_PIN 7 -opt_set FIL_RUNOUT6_PIN 8 -opt_set FIL_RUNOUT7_PIN 9 -opt_set FIL_RUNOUT8_PIN 10 -opt_set FIL_RUNOUT4_STATE HIGH -opt_enable FIL_RUNOUT4_PULLUP -opt_set FIL_RUNOUT8_STATE HIGH -opt_enable FIL_RUNOUT8_PULLUP -exec_test $1 $2 "BigTreeTech GTR + OTG USB Flash Drive + Extruders with Auto-Fan, Mixed TMC Drivers, and Runout Sensors with distinct states" "$3" +opt_set E0_AUTO_FAN_PIN PC10 E1_AUTO_FAN_PIN PC11 E2_AUTO_FAN_PIN PC12 NEOPIXEL_PIN PF13 \ + X_DRIVER_TYPE TMC2208 Y_DRIVER_TYPE TMC2130 \ + FIL_RUNOUT_PIN 3 FIL_RUNOUT2_PIN 4 FIL_RUNOUT3_PIN 5 FIL_RUNOUT4_PIN 6 FIL_RUNOUT5_PIN 7 FIL_RUNOUT6_PIN 8 FIL_RUNOUT7_PIN 9 FIL_RUNOUT8_PIN 10 \ + FIL_RUNOUT4_STATE HIGH FIL_RUNOUT8_STATE HIGH +opt_enable FIL_RUNOUT4_PULLUP FIL_RUNOUT8_PULLUP +exec_test $1 $2 "GTT GTR | OTG USB Flash Drive | 8 Extruders | Auto-Fan | Mixed TMC Drivers | Runout Sensors (distinct)" "$3" # clean up restore_configs diff --git a/buildroot/tests/BIGTREE_SKR_PRO-tests b/buildroot/tests/BIGTREE_SKR_PRO-tests index 8dc433deb2..74020c1b27 100755 --- a/buildroot/tests/BIGTREE_SKR_PRO-tests +++ b/buildroot/tests/BIGTREE_SKR_PRO-tests @@ -10,31 +10,22 @@ set -e # Build with the default configurations # restore_configs -opt_set MOTHERBOARD BOARD_BTT_SKR_PRO_V1_1 -opt_set SERIAL_PORT 1 +opt_set MOTHERBOARD BOARD_BTT_SKR_PRO_V1_1 SERIAL_PORT 1 exec_test $1 $2 "BigTreeTech SKR Pro Default Configuration" "$3" restore_configs -opt_set MOTHERBOARD BOARD_BTT_SKR_PRO_V1_1 -opt_set SERIAL_PORT -1 -opt_set EXTRUDERS 3 -opt_set TEMP_SENSOR_1 1 -opt_set TEMP_SENSOR_2 1 -opt_set E0_AUTO_FAN_PIN PC10 -opt_set E1_AUTO_FAN_PIN PC11 -opt_set E2_AUTO_FAN_PIN PC12 -opt_set X_DRIVER_TYPE TMC2209 -opt_set Y_DRIVER_TYPE TMC2130 +opt_set MOTHERBOARD BOARD_BTT_SKR_PRO_V1_1 SERIAL_PORT -1 \ + EXTRUDERS 3 TEMP_SENSOR_1 1 TEMP_SENSOR_2 1 \ + E0_AUTO_FAN_PIN PC10 E1_AUTO_FAN_PIN PC11 E2_AUTO_FAN_PIN PC12 \ + X_DRIVER_TYPE TMC2209 Y_DRIVER_TYPE TMC2130 opt_enable BLTOUCH EEPROM_SETTINGS AUTO_BED_LEVELING_3POINT Z_SAFE_HOMING PINS_DEBUGGING exec_test $1 $2 "BigTreeTech SKR Pro 3 Extruders, Auto-Fan, BLTOUCH, mixed TMC drivers" "$3" restore_configs -opt_set MOTHERBOARD BOARD_BTT_SKR_PRO_V1_1 -opt_set SERIAL_PORT -1 +opt_set MOTHERBOARD BOARD_BTT_SKR_PRO_V1_1 SERIAL_PORT -1 \ + CUTTER_POWER_UNIT PERCENT \ + SPINDLE_LASER_PWM_PIN HEATER_1_PIN SPINDLE_LASER_ENA_PIN HEATER_2_PIN opt_enable LASER_FEATURE REPRAP_DISCOUNT_SMART_CONTROLLER -opt_set CUTTER_POWER_UNIT PERCENT -opt_add SPINDLE_LASER_PWM_PIN HEATER_1_PIN -opt_add SPINDLE_LASER_ENA_PIN HEATER_2_PIN exec_test $1 $2 "Laser, LCD, PERCENT power unit" "$3" # clean up diff --git a/buildroot/tests/DUE-tests b/buildroot/tests/DUE-tests index 1e22ba3370..d1601edf5a 100755 --- a/buildroot/tests/DUE-tests +++ b/buildroot/tests/DUE-tests @@ -7,12 +7,12 @@ set -e restore_configs -opt_set LCD_LANGUAGE bg -opt_set MOTHERBOARD BOARD_RAMPS4DUE_EFB -opt_set TEMP_SENSOR_0 -2 -opt_set TEMP_SENSOR_BED 2 -opt_set GRID_MAX_POINTS_X 16 -opt_set FANMUX0_PIN 53 +opt_set MOTHERBOARD BOARD_RAMPS4DUE_EFB \ + LCD_LANGUAGE bg \ + TEMP_SENSOR_0 -2 TEMP_SENSOR_BED 2 \ + GRID_MAX_POINTS_X 16 \ + E0_AUTO_FAN_PIN 8 FANMUX0_PIN 53 EXTRUDER_AUTO_FAN_SPEED 100 \ + TEMP_SENSOR_CHAMBER 3 TEMP_CHAMBER_PIN 6 HEATER_CHAMBER_PIN 45 opt_enable S_CURVE_ACCELERATION EEPROM_SETTINGS GCODE_MACROS \ FIX_MOUNTED_PROBE Z_SAFE_HOMING CODEPENDENT_XY_HOMING \ ASSISTED_TRAMMING ASSISTED_TRAMMING_WIZARD REPORT_TRAMMING_MM ASSISTED_TRAMMING_WAIT_POSITION \ @@ -28,23 +28,17 @@ opt_enable S_CURVE_ACCELERATION EEPROM_SETTINGS GCODE_MACROS \ PIDTEMPBED SLOW_PWM_HEATERS THERMAL_PROTECTION_CHAMBER \ PINS_DEBUGGING MAX7219_DEBUG M114_DETAIL \ EXTENSIBLE_UI -opt_add EXTUI_EXAMPLE -opt_set E0_AUTO_FAN_PIN 8 -opt_set EXTRUDER_AUTO_FAN_SPEED 100 -opt_set TEMP_SENSOR_CHAMBER 3 -opt_add TEMP_CHAMBER_PIN 6 -opt_set HEATER_CHAMBER_PIN 45 +opt_add EXTUI_EXAMPLE exec_test $1 $2 "RAMPS4DUE_EFB with ABL (Bilinear), ExtUI, S-Curve, many options." "$3" # # RADDS with BLTouch, ABL(B), 3 x Z auto-align # restore_configs -opt_set MOTHERBOARD BOARD_RADDS +opt_set MOTHERBOARD BOARD_RADDS NUM_Z_STEPPER_DRIVERS 3 opt_enable USE_XMAX_PLUG USE_YMAX_PLUG ENDSTOPPULLUPS BLTOUCH AUTO_BED_LEVELING_BILINEAR \ Z_STEPPER_AUTO_ALIGN Z_STEPPER_ALIGN_KNOWN_STEPPER_POSITIONS Z_SAFE_HOMING #TOUCH_UI_FTDI_EVE LCD_ALEPHOBJECTS_CLCD_UI OTHER_PIN_LAYOUT -opt_set NUM_Z_STEPPER_DRIVERS 3 pins_set ramps/RAMPS X_MAX_PIN -1 pins_set ramps/RAMPS Y_MAX_PIN -1 exec_test $1 $2 "RADDS with ABL (Bilinear), Triple Z Axis, Z_STEPPER_AUTO_ALIGN" "$3" @@ -53,9 +47,6 @@ exec_test $1 $2 "RADDS with ABL (Bilinear), Triple Z Axis, Z_STEPPER_AUTO_ALIGN" # Test SWITCHING_EXTRUDER # restore_configs -opt_set LCD_LANGUAGE fi -opt_set MOTHERBOARD BOARD_RAMPS4DUE_EEF -opt_set EXTRUDERS 2 -opt_set NUM_SERVOS 1 +opt_set MOTHERBOARD BOARD_RAMPS4DUE_EEF LCD_LANGUAGE fi EXTRUDERS 2 NUM_SERVOS 1 opt_enable SWITCHING_EXTRUDER ULTIMAKERCONTROLLER BEEP_ON_FEEDRATE_CHANGE POWER_LOSS_RECOVERY exec_test $1 $2 "RAMPS4DUE_EEF with SWITCHING_EXTRUDER, POWER_LOSS_RECOVERY" "$3" diff --git a/buildroot/tests/FLYF407ZG-tests b/buildroot/tests/FLYF407ZG-tests index 2c915eb48b..22dd3488c8 100755 --- a/buildroot/tests/FLYF407ZG-tests +++ b/buildroot/tests/FLYF407ZG-tests @@ -8,10 +8,7 @@ set -e # Build examples restore_configs -opt_set MOTHERBOARD BOARD_FLYF407ZG -opt_set SERIAL_PORT -1 -opt_set X_DRIVER_TYPE TMC2208 -opt_set Y_DRIVER_TYPE TMC2130 +opt_set MOTHERBOARD BOARD_FLYF407ZG SERIAL_PORT -1 X_DRIVER_TYPE TMC2208 Y_DRIVER_TYPE TMC2130 exec_test $1 $2 "FLYF407ZG Default Config with mixed TMC Drivers" "$3" # cleanup diff --git a/buildroot/tests/FYSETC_F6-tests b/buildroot/tests/FYSETC_F6-tests index e1eb6684a5..3fe59d59a1 100755 --- a/buildroot/tests/FYSETC_F6-tests +++ b/buildroot/tests/FYSETC_F6-tests @@ -18,34 +18,24 @@ exec_test $1 $2 "FYSETC F6 1.3 with DGUS" "$3" # Delta Config (generic) + UBL + ALLEN_KEY + EEPROM_SETTINGS + OLED_PANEL_TINYBOY2 # use_example_configs delta/generic -opt_set MOTHERBOARD BOARD_FYSETC_F6_13 +opt_set MOTHERBOARD BOARD_FYSETC_F6_13 \ + LCD_LANGUAGE ko_KR \ + X_DRIVER_TYPE L6470 Y_DRIVER_TYPE L6470 Z_DRIVER_TYPE L6470 \ + L6470_CHAIN_SCK_PIN 53 L6470_CHAIN_MISO_PIN 49 L6470_CHAIN_MOSI_PIN 40 L6470_CHAIN_SS_PIN 42 \ + 'ENABLE_RESET_L64XX_CHIPS(V)' NOOP opt_enable RESTORE_LEVELING_AFTER_G28 EEPROM_SETTINGS EEPROM_CHITCHAT \ Z_PROBE_ALLEN_KEY AUTO_BED_LEVELING_UBL \ OLED_PANEL_TINYBOY2 MESH_EDIT_GFX_OVERLAY DELTA_CALIBRATION_MENU -opt_set LCD_LANGUAGE ko_KR -opt_set X_DRIVER_TYPE L6470 -opt_set Y_DRIVER_TYPE L6470 -opt_set Z_DRIVER_TYPE L6470 -opt_add L6470_CHAIN_SCK_PIN 53 -opt_add L6470_CHAIN_MISO_PIN 49 -opt_add L6470_CHAIN_MOSI_PIN 40 -opt_add L6470_CHAIN_SS_PIN 42 -opt_add "ENABLE_RESET_L64XX_CHIPS(V) NOOP" exec_test $1 $2 "DELTA, RAMPS, L6470, UBL, Allen Key, EEPROM, OLED_PANEL_TINYBOY2..." "$3" # # Test mixed TMC config # restore_configs -opt_set MOTHERBOARD BOARD_FYSETC_F6_13 -opt_set LCD_LANGUAGE vi -opt_set LCD_LANGUAGE_2 fr -opt_set X_DRIVER_TYPE TMC2160 -opt_set Y_DRIVER_TYPE TMC5160 -opt_set Z_DRIVER_TYPE TMC2208_STANDALONE -opt_set E0_DRIVER_TYPE TMC2130 -opt_set X_MIN_ENDSTOP_INVERTING true -opt_set Y_MIN_ENDSTOP_INVERTING true +opt_set MOTHERBOARD BOARD_FYSETC_F6_13 \ + LCD_LANGUAGE vi LCD_LANGUAGE_2 fr \ + X_DRIVER_TYPE TMC2160 Y_DRIVER_TYPE TMC5160 Z_DRIVER_TYPE TMC2208_STANDALONE E0_DRIVER_TYPE TMC2130 \ + X_MIN_ENDSTOP_INVERTING true Y_MIN_ENDSTOP_INVERTING true opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER \ MARLIN_BRICKOUT MARLIN_INVADERS MARLIN_SNAKE \ MONITOR_DRIVER_STATUS STEALTHCHOP_XY STEALTHCHOP_Z STEALTHCHOP_E HYBRID_THRESHOLD \ @@ -63,17 +53,14 @@ exec_test $1 $2 "RAMPS 1.3 | DELTA | FLSUN AC Config" "$3" # SCARA with Mixed TMC # use_example_configs SCARA/Morgan -opt_set MOTHERBOARD BOARD_FYSETC_F6_13 -opt_set LCD_LANGUAGE es +opt_set MOTHERBOARD BOARD_FYSETC_F6_13 \ + LCD_LANGUAGE es \ + X_MAX_ENDSTOP_INVERTING false \ + X_DRIVER_TYPE TMC2209 Y_DRIVER_TYPE TMC2130 Z_DRIVER_TYPE TMC2130_STANDALONE E0_DRIVER_TYPE TMC2660 \ + X_HARDWARE_SERIAL Serial2 opt_enable USE_ZMIN_PLUG FIX_MOUNTED_PROBE AUTO_BED_LEVELING_BILINEAR PAUSE_BEFORE_DEPLOY_STOW \ FYSETC_242_OLED_12864 EEPROM_SETTINGS EEPROM_CHITCHAT M114_DETAIL Z_SAFE_HOMING \ STEALTHCHOP_XY STEALTHCHOP_Z STEALTHCHOP_E HYBRID_THRESHOLD SENSORLESS_HOMING SQUARE_WAVE_STEPPING -opt_set X_MAX_ENDSTOP_INVERTING false -opt_set X_DRIVER_TYPE TMC2209 -opt_set Y_DRIVER_TYPE TMC2130 -opt_set Z_DRIVER_TYPE TMC2130_STANDALONE -opt_set E0_DRIVER_TYPE TMC2660 -opt_add X_HARDWARE_SERIAL Serial2 exec_test $1 $2 "FYSETC_F6 | SCARA | Mixed TMC | EEPROM" "$3" # clean up diff --git a/buildroot/tests/FYSETC_S6-tests b/buildroot/tests/FYSETC_S6-tests index c7f7a16bbd..ce5442c376 100755 --- a/buildroot/tests/FYSETC_S6-tests +++ b/buildroot/tests/FYSETC_S6-tests @@ -10,8 +10,7 @@ set -e restore_configs use_example_configs FYSETC/S6 opt_enable MEATPACK -opt_set Y_DRIVER_TYPE TMC2209 -opt_set Z_DRIVER_TYPE TMC2130 +opt_set Y_DRIVER_TYPE TMC2209 Z_DRIVER_TYPE TMC2130 exec_test $1 $2 "FYSETC S6 Example" "$3" # cleanup diff --git a/buildroot/tests/LERDGEX-tests b/buildroot/tests/LERDGEX-tests index 7fcdb2684f..cf7dfebfea 100755 --- a/buildroot/tests/LERDGEX-tests +++ b/buildroot/tests/LERDGEX-tests @@ -10,8 +10,7 @@ set -e # Build with the default configurations # restore_configs -opt_set MOTHERBOARD BOARD_LERDGE_X -opt_set SERIAL_PORT 1 +opt_set MOTHERBOARD BOARD_LERDGE_X SERIAL_PORT 1 exec_test $1 $2 "LERDGE X with Default Configuration" "$3" # clean up diff --git a/buildroot/tests/LPC1768-tests b/buildroot/tests/LPC1768-tests index 27d2fbf3ff..a6829e85ea 100755 --- a/buildroot/tests/LPC1768-tests +++ b/buildroot/tests/LPC1768-tests @@ -14,9 +14,8 @@ set -e #exec_test $1 $2 "Default Configuration" "$3" restore_configs -opt_set MOTHERBOARD BOARD_RAMPS_14_RE_ARM_EFB +opt_set MOTHERBOARD BOARD_RAMPS_14_RE_ARM_EFB NEOPIXEL_PIN P1_16 opt_enable VIKI2 SDSUPPORT SDCARD_READONLY SERIAL_PORT_2 NEOPIXEL_LED -opt_set NEOPIXEL_PIN P1_16 exec_test $1 $2 "ReARM EFB VIKI2, SDSUPPORT, 2 Serial ports (USB CDC + UART0), NeoPixel" "$3" #restore_configs @@ -24,19 +23,18 @@ exec_test $1 $2 "ReARM EFB VIKI2, SDSUPPORT, 2 Serial ports (USB CDC + UART0), N #exec_test $1 $2 "MKS SBASE Example Config" "$3" restore_configs -opt_set MOTHERBOARD BOARD_MKS_SBASE -opt_set EXTRUDERS 2 -opt_set TEMP_SENSOR_1 1 -opt_set NUM_SERVOS 2 -opt_set SERVO_DELAY "{ 300, 300 }" +opt_set MOTHERBOARD BOARD_MKS_SBASE \ + EXTRUDERS 2 TEMP_SENSOR_1 1 \ + NUM_SERVOS 2 SERVO_DELAY '{ 300, 300 }' opt_enable SWITCHING_NOZZLE SWITCHING_NOZZLE_E1_SERVO_NR ULTIMAKERCONTROLLER exec_test $1 $2 "MKS SBASE with SWITCHING_NOZZLE" "$3" restore_configs -opt_set MOTHERBOARD BOARD_RAMPS_14_RE_ARM_EEB -opt_set EXTRUDERS 2 -opt_set TEMP_SENSOR_1 -1 -opt_set TEMP_SENSOR_BED 5 +opt_set MOTHERBOARD BOARD_RAMPS_14_RE_ARM_EEB \ + EXTRUDERS 2 TEMP_SENSOR_1 -1 TEMP_SENSOR_BED 5 \ + GRID_MAX_POINTS_X 16 \ + NOZZLE_TO_PROBE_OFFSET '{ 0, 0, 0 }' \ + NOZZLE_CLEAN_MIN_TEMP 170 opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER ADAPTIVE_FAN_SLOWING NO_FAN_SLOWING_IN_PID_TUNING \ FILAMENT_WIDTH_SENSOR FILAMENT_LCD_DISPLAY PID_EXTRUSION_SCALING SOUND_MENU_ITEM \ NOZZLE_AS_PROBE AUTO_BED_LEVELING_BILINEAR PREHEAT_BEFORE_LEVELING G29_RETRY_AND_RECOVER Z_MIN_PROBE_REPEATABILITY_TEST DEBUG_LEVELING_FEATURE \ @@ -46,9 +44,6 @@ opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER ADAPTIVE_FAN_SLOWING NO HOST_KEEPALIVE_FEATURE HOST_ACTION_COMMANDS HOST_PROMPT_SUPPORT \ LCD_INFO_MENU ARC_SUPPORT BEZIER_CURVE_SUPPORT EXTENDED_CAPABILITIES_REPORT AUTO_REPORT_TEMPERATURES \ SDSUPPORT SDCARD_SORT_ALPHA AUTO_REPORT_SD_STATUS EMERGENCY_PARSER -opt_set GRID_MAX_POINTS_X 16 -opt_set NOZZLE_TO_PROBE_OFFSET "{ 0, 0, 0 }" -opt_set NOZZLE_CLEAN_MIN_TEMP 170 exec_test $1 $2 "Re-ARM with NOZZLE_AS_PROBE and many features." "$3" # clean up diff --git a/buildroot/tests/LPC1769-tests b/buildroot/tests/LPC1769-tests index 0a61d42800..5ca7114543 100755 --- a/buildroot/tests/LPC1769-tests +++ b/buildroot/tests/LPC1769-tests @@ -13,17 +13,15 @@ use_example_configs Azteeg/X5GT exec_test $1 $2 "Azteeg X5GT Example Configuration" "$3" restore_configs -opt_set MOTHERBOARD BOARD_SMOOTHIEBOARD -opt_set EXTRUDERS 2 -opt_set TEMP_SENSOR_1 -1 -opt_set TEMP_SENSOR_BED 5 +opt_set MOTHERBOARD BOARD_SMOOTHIEBOARD \ + EXTRUDERS 2 TEMP_SENSOR_1 -1 TEMP_SENSOR_BED 5 \ + GRID_MAX_POINTS_X 16 opt_enable TFTGLCD_PANEL_SPI SDSUPPORT ADAPTIVE_FAN_SLOWING NO_FAN_SLOWING_IN_PID_TUNING \ FIX_MOUNTED_PROBE AUTO_BED_LEVELING_BILINEAR G29_RETRY_AND_RECOVER Z_MIN_PROBE_REPEATABILITY_TEST DEBUG_LEVELING_FEATURE \ BABYSTEPPING BABYSTEP_XY BABYSTEP_ZPROBE_OFFSET LEVEL_CORNERS_USE_PROBE LEVEL_CORNERS_VERIFY_RAISED \ PRINTCOUNTER NOZZLE_PARK_FEATURE NOZZLE_CLEAN_FEATURE SLOW_PWM_HEATERS PIDTEMPBED EEPROM_SETTINGS INCH_MODE_SUPPORT TEMPERATURE_UNITS_SUPPORT \ Z_SAFE_HOMING ADVANCED_PAUSE_FEATURE PARK_HEAD_ON_PAUSE \ LCD_INFO_MENU ARC_SUPPORT BEZIER_CURVE_SUPPORT EXTENDED_CAPABILITIES_REPORT AUTO_REPORT_TEMPERATURES SDCARD_SORT_ALPHA EMERGENCY_PARSER -opt_set GRID_MAX_POINTS_X 16 exec_test $1 $2 "Smoothieboard with TFTGLCD_PANEL_SPI and many features" "$3" #restore_configs @@ -36,17 +34,13 @@ exec_test $1 $2 "Smoothieboard with TFTGLCD_PANEL_SPI and many features" "$3" # SD_ABORT_ON_ENDSTOP_HIT ADVANCED_OK GCODE_MACROS \ # VOLUMETRIC_DEFAULT_ON NO_WORKSPACE_OFFSETS \ # EXTRA_FAN_SPEED FWRETRACT MENU_ADDAUTOSTART SDCARD_SORT_ALPHA -#opt_set FAN_MIN_PWM 50 -#opt_set FAN_KICKSTART_TIME 100 -#opt_set XY_FREQUENCY_LIMIT 15 +#opt_set FAN_MIN_PWM 50 FAN_KICKSTART_TIME 100 XY_FREQUENCY_LIMIT 15 #exec_test $1 $2 "Azteeg X5 MINI WIFI Many less common options" "$3" restore_configs use_example_configs delta/generic -opt_set MOTHERBOARD BOARD_COHESION3D_REMIX -opt_set X_DRIVER_TYPE TMC2130 -opt_set Y_DRIVER_TYPE TMC2130 -opt_set Z_DRIVER_TYPE TMC2130 +opt_set MOTHERBOARD BOARD_COHESION3D_REMIX \ + X_DRIVER_TYPE TMC2130 Y_DRIVER_TYPE TMC2130 Z_DRIVER_TYPE TMC2130 opt_enable AUTO_BED_LEVELING_BILINEAR EEPROM_SETTINGS EEPROM_CHITCHAT MECHANICAL_GANTRY_CALIBRATION \ TMC_USE_SW_SPI MONITOR_DRIVER_STATUS STEALTHCHOP_XY STEALTHCHOP_Z HYBRID_THRESHOLD \ SENSORLESS_PROBING Z_SAFE_HOMING X_STALL_SENSITIVITY Y_STALL_SENSITIVITY Z_STALL_SENSITIVITY TMC_DEBUG \ diff --git a/buildroot/tests/NUCLEO_F767ZI-tests b/buildroot/tests/NUCLEO_F767ZI-tests index bd5ca86970..9e23246606 100755 --- a/buildroot/tests/NUCLEO_F767ZI-tests +++ b/buildroot/tests/NUCLEO_F767ZI-tests @@ -10,11 +10,8 @@ set -e # Build with the default configurations # restore_configs -opt_set MOTHERBOARD BOARD_NUCLEO_F767ZI -opt_set SERIAL_PORT -1 +opt_set MOTHERBOARD BOARD_NUCLEO_F767ZI SERIAL_PORT -1 X_DRIVER_TYPE TMC2209 Y_DRIVER_TYPE TMC2208 opt_enable BLTOUCH Z_SAFE_HOMING SPEAKER SOFTWARE_DRIVER_ENABLE -opt_set X_DRIVER_TYPE TMC2209 -opt_set Y_DRIVER_TYPE TMC2208 exec_test $1 $2 "Mixed timer usage" "$3" # clean up diff --git a/buildroot/tests/SAMD51_grandcentral_m4-tests b/buildroot/tests/SAMD51_grandcentral_m4-tests index a98929520e..92a62c9d37 100755 --- a/buildroot/tests/SAMD51_grandcentral_m4-tests +++ b/buildroot/tests/SAMD51_grandcentral_m4-tests @@ -10,20 +10,14 @@ set -e # Build with the default configurations # restore_configs -opt_set SERIAL_PORT -1 -opt_set MOTHERBOARD BOARD_AGCM4_RAMPS_144 -opt_set TEMP_SENSOR_0 11 -opt_set TEMP_SENSOR_BED 11 -opt_set X_DRIVER_TYPE TMC2209 -opt_set Y_DRIVER_TYPE TMC2209 -opt_set Z_DRIVER_TYPE TMC2209 -opt_set Z2_DRIVER_TYPE TMC2209 -opt_set E0_DRIVER_TYPE TMC2209 -opt_set RESTORE_LEVELING_AFTER_G28 false -opt_set LCD_LANGUAGE it -opt_set NUM_Z_STEPPER_DRIVERS 2 -opt_set HOMING_BUMP_MM "{ 0, 0, 0 }" -opt_set SDCARD_CONNECTION LCD +opt_set MOTHERBOARD BOARD_AGCM4_RAMPS_144 SERIAL_PORT -1 \ + TEMP_SENSOR_0 11 TEMP_SENSOR_BED 11 \ + X_DRIVER_TYPE TMC2209 Y_DRIVER_TYPE TMC2209 Z_DRIVER_TYPE TMC2209 Z2_DRIVER_TYPE TMC2209 E0_DRIVER_TYPE TMC2209 \ + RESTORE_LEVELING_AFTER_G28 false \ + LCD_LANGUAGE it \ + SDCARD_CONNECTION LCD \ + NUM_Z_STEPPER_DRIVERS 2 \ + HOMING_BUMP_MM '{ 0, 0, 0 }' opt_enable ENDSTOP_INTERRUPTS_FEATURE S_CURVE_ACCELERATION BLTOUCH Z_MIN_PROBE_REPEATABILITY_TEST \ FILAMENT_RUNOUT_SENSOR G26_MESH_VALIDATION MESH_EDIT_GFX_OVERLAY Z_SAFE_HOMING \ EEPROM_SETTINGS NOZZLE_PARK_FEATURE SDSUPPORT SD_CHECK_AND_RETRY \ diff --git a/buildroot/tests/STM32F070CB_malyan-tests b/buildroot/tests/STM32F070CB_malyan-tests index eeec7e9b1f..060d707b04 100755 --- a/buildroot/tests/STM32F070CB_malyan-tests +++ b/buildroot/tests/STM32F070CB_malyan-tests @@ -7,8 +7,7 @@ set -e restore_configs -opt_set MOTHERBOARD BOARD_MALYAN_M200_V2 -opt_set SERIAL_PORT -1 +opt_set MOTHERBOARD BOARD_MALYAN_M200_V2 SERIAL_PORT -1 exec_test $1 $2 "Malyan M200 v2 Default Config" "$3" # cleanup diff --git a/buildroot/tests/STM32F103RC_btt-tests b/buildroot/tests/STM32F103RC_btt-tests index f500b76315..e76060aee8 100755 --- a/buildroot/tests/STM32F103RC_btt-tests +++ b/buildroot/tests/STM32F103RC_btt-tests @@ -10,13 +10,8 @@ set -e # Build with the default configurations # restore_configs -opt_set MOTHERBOARD BOARD_BTT_SKR_MINI_E3_V1_0 -opt_set SERIAL_PORT 1 -opt_set SERIAL_PORT_2 -1 -opt_set X_DRIVER_TYPE TMC2209 -opt_set Y_DRIVER_TYPE TMC2209 -opt_set Z_DRIVER_TYPE TMC2209 -opt_set E0_DRIVER_TYPE TMC2209 +opt_set MOTHERBOARD BOARD_BTT_SKR_MINI_E3_V1_0 SERIAL_PORT 1 SERIAL_PORT_2 -1 \ + X_DRIVER_TYPE TMC2209 Y_DRIVER_TYPE TMC2209 Z_DRIVER_TYPE TMC2209 E0_DRIVER_TYPE TMC2209 opt_enable PINS_DEBUGGING Z_IDLE_HEIGHT exec_test $1 $2 "BigTreeTech SKR Mini E3 1.0 - Basic Config with TMC2209 HW Serial" "$3" diff --git a/buildroot/tests/STM32F103RC_btt_USB-tests b/buildroot/tests/STM32F103RC_btt_USB-tests index d752c87d18..8381de0ea6 100755 --- a/buildroot/tests/STM32F103RC_btt_USB-tests +++ b/buildroot/tests/STM32F103RC_btt_USB-tests @@ -10,9 +10,7 @@ set -e # Build with the default configurations # restore_configs -opt_set MOTHERBOARD BOARD_BTT_SKR_MINI_V1_1 -opt_set SERIAL_PORT 1 -opt_set SERIAL_PORT_2 -1 +opt_set MOTHERBOARD BOARD_BTT_SKR_MINI_V1_1 SERIAL_PORT 1 SERIAL_PORT_2 -1 exec_test $1 $2 "BigTreeTech SKR Mini v1.1 - Basic Configuration" "$3" # clean up diff --git a/buildroot/tests/STM32F103RC_meeb-tests b/buildroot/tests/STM32F103RC_meeb-tests index 4fcb6e8118..3a191b4e7e 100755 --- a/buildroot/tests/STM32F103RC_meeb-tests +++ b/buildroot/tests/STM32F103RC_meeb-tests @@ -10,13 +10,8 @@ set -e # Build with the default configurations # restore_configs -opt_set MOTHERBOARD BOARD_CCROBOT_MEEB_3DP -opt_set SERIAL_PORT 1 -opt_set SERIAL_PORT_2 -1 -opt_set X_DRIVER_TYPE TMC2208 -opt_set Y_DRIVER_TYPE TMC2208 -opt_set Z_DRIVER_TYPE TMC2208 -opt_set E0_DRIVER_TYPE TMC2208 +opt_set MOTHERBOARD BOARD_CCROBOT_MEEB_3DP SERIAL_PORT 1 SERIAL_PORT_2 -1 \ + X_DRIVER_TYPE TMC2208 Y_DRIVER_TYPE TMC2208 Z_DRIVER_TYPE TMC2208 E0_DRIVER_TYPE TMC2208 exec_test $1 $2 "MEEB_3DP - Basic Config with TMC2208 SW Serial" "$3" # clean up diff --git a/buildroot/tests/STM32F103RE-tests b/buildroot/tests/STM32F103RE-tests index 909c362d06..426f87d21b 100755 --- a/buildroot/tests/STM32F103RE-tests +++ b/buildroot/tests/STM32F103RE-tests @@ -10,9 +10,7 @@ set -e # Build with the default configurations # restore_configs -opt_set MOTHERBOARD BOARD_STM32F103RE -opt_set EXTRUDERS 2 -opt_set SERIAL_PORT -1 +opt_set MOTHERBOARD BOARD_STM32F103RE SERIAL_PORT -1 EXTRUDERS 2 opt_enable EEPROM_SETTINGS EEPROM_CHITCHAT REPRAP_DISCOUNT_SMART_CONTROLLER SDSUPPORT \ PAREN_COMMENTS GCODE_MOTION_MODES SINGLENOZZLE TOOLCHANGE_FILAMENT_SWAP TOOLCHANGE_PARK \ BAUD_RATE_GCODE GCODE_MACROS NOZZLE_PARK_FEATURE NOZZLE_CLEAN_FEATURE diff --git a/buildroot/tests/STM32F103RET6_creality-tests b/buildroot/tests/STM32F103RET6_creality-tests index 199bd6a9c2..ef020a33f1 100755 --- a/buildroot/tests/STM32F103RET6_creality-tests +++ b/buildroot/tests/STM32F103RET6_creality-tests @@ -19,11 +19,10 @@ opt_add SDCARD_EEPROM_EMULATION exec_test $1 $2 "Ender 3 v2, SD EEPROM, w/o CLASSIC_JERK" "$3" restore_configs -opt_set SERIAL_PORT 1 -opt_set MOTHERBOARD BOARD_CREALITY_V452 +opt_set MOTHERBOARD BOARD_CREALITY_V452 SERIAL_PORT 1 opt_disable NOZZLE_TO_PROBE_OFFSET -opt_enable NOZZLE_AS_PROBE Z_SAFE_HOMING Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN -opt_enable PROBE_ACTIVATION_SWITCH PROBE_TARE PROBE_TARE_ONLY_WHILE_INACTIVE +opt_enable NOZZLE_AS_PROBE Z_SAFE_HOMING Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN \ + PROBE_ACTIVATION_SWITCH PROBE_TARE PROBE_TARE_ONLY_WHILE_INACTIVE exec_test $1 $2 "Creality V4.5.2 PROBE_ACTIVATION_SWITCH, Probe Tare" "$3" # clean up diff --git a/buildroot/tests/STM32F103RE_btt-tests b/buildroot/tests/STM32F103RE_btt-tests index ab8681c7f5..97d7ffec4b 100755 --- a/buildroot/tests/STM32F103RE_btt-tests +++ b/buildroot/tests/STM32F103RE_btt-tests @@ -10,12 +10,10 @@ set -e # Build with the default configurations # restore_configs -opt_set MOTHERBOARD BOARD_BTT_SKR_E3_DIP -opt_set SERIAL_PORT 1 -opt_set SERIAL_PORT_2 -1 -opt_set X_DRIVER_TYPE TMC2209 -opt_set Y_DRIVER_TYPE TMC2130 -exec_test $1 $2 "BigTreeTech SKR E3 DIP v1.0 - Basic Config with mixed TMC Drivers" "$3" +opt_set MOTHERBOARD BOARD_BTT_SKR_E3_DIP \ + SERIAL_PORT 1 SERIAL_PORT_2 -1 \ + X_DRIVER_TYPE TMC2209 Y_DRIVER_TYPE TMC2130 +exec_test $1 $2 "BTT SKR E3 DIP 1.0 | Mixed TMC Drivers" "$3" # clean up restore_configs diff --git a/buildroot/tests/STM32F103RE_btt_USB-tests b/buildroot/tests/STM32F103RE_btt_USB-tests index 43162b68a4..c63a90e436 100755 --- a/buildroot/tests/STM32F103RE_btt_USB-tests +++ b/buildroot/tests/STM32F103RE_btt_USB-tests @@ -10,16 +10,11 @@ set -e # Build with the default configurations # restore_configs -opt_set MOTHERBOARD BOARD_BTT_SKR_E3_DIP -opt_set SERIAL_PORT 1 -opt_set SERIAL_PORT_2 -1 +opt_set MOTHERBOARD BOARD_BTT_SKR_E3_DIP SERIAL_PORT 1 SERIAL_PORT_2 -1 exec_test $1 $2 "BigTreeTech SKR E3 DIP v1.0 - Basic Configuration" "$3" restore_configs -opt_set MOTHERBOARD BOARD_BTT_SKR_CR6 -opt_set SERIAL_PORT -1 -opt_set SERIAL_PORT_2 2 -opt_set TEMP_SENSOR_BED 1 +opt_set MOTHERBOARD BOARD_BTT_SKR_CR6 SERIAL_PORT -1 SERIAL_PORT_2 2 TEMP_SENSOR_BED 1 opt_enable CR10_STOCKDISPLAY \ NOZZLE_AS_PROBE Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN Z_SAFE_HOMING \ PROBE_ACTIVATION_SWITCH PROBE_TARE PROBE_TARE_ONLY_WHILE_INACTIVE \ diff --git a/buildroot/tests/STM32F401VE_STEVAL-tests b/buildroot/tests/STM32F401VE_STEVAL-tests index d7c90e7907..1704f3d2f0 100755 --- a/buildroot/tests/STM32F401VE_STEVAL-tests +++ b/buildroot/tests/STM32F401VE_STEVAL-tests @@ -8,8 +8,7 @@ set -e # Build examples restore_configs -opt_set MOTHERBOARD BOARD_STEVAL_3DP001V1 -opt_set SERIAL_PORT -1 +opt_set MOTHERBOARD BOARD_STEVAL_3DP001V1 SERIAL_PORT -1 exec_test $1 $2 "STM32F401VE_STEVAL Default Config" "$3" # cleanup diff --git a/buildroot/tests/esp32-tests b/buildroot/tests/esp32-tests index 310eea298e..a0f79107cf 100755 --- a/buildroot/tests/esp32-tests +++ b/buildroot/tests/esp32-tests @@ -10,30 +10,19 @@ set -e # Build with the default configurations # restore_configs -opt_set MOTHERBOARD BOARD_ESPRESSIF_ESP32 +opt_set MOTHERBOARD BOARD_ESPRESSIF_ESP32 TX_BUFFER_SIZE 64 \ + WIFI_SSID '"ssid"' WIFI_PWD '"password"' opt_enable WIFISUPPORT WEBSUPPORT GCODE_MACROS BAUD_RATE_GCODE M115_GEOMETRY_REPORT REPETIER_GCODE_M360 -opt_add WIFI_SSID "\"ssid\"" -opt_add WIFI_PWD "\"password\"" -opt_set TX_BUFFER_SIZE 64 exec_test $1 $2 "ESP32 with WIFISUPPORT and WEBSUPPORT" "$3" # # Build with TMC drivers using hardware serial # restore_configs -opt_set MOTHERBOARD BOARD_ESPRESSIF_ESP32 -opt_set X_DRIVER_TYPE TMC2209 -opt_set Y_DRIVER_TYPE TMC2208 -opt_set Z_DRIVER_TYPE TMC2209 -opt_set E0_DRIVER_TYPE TMC2209 -opt_set X_HARDWARE_SERIAL Serial1 -opt_set Y_HARDWARE_SERIAL Serial1 -opt_set Z_HARDWARE_SERIAL Serial1 -opt_set E0_HARDWARE_SERIAL Serial1 -opt_set X_SLAVE_ADDRESS 0 -opt_set Y_SLAVE_ADDRESS 1 -opt_set Z_SLAVE_ADDRESS 2 -opt_set E0_SLAVE_ADDRESS 3 +opt_set MOTHERBOARD BOARD_ESPRESSIF_ESP32 \ + X_DRIVER_TYPE TMC2209 Y_DRIVER_TYPE TMC2208 Z_DRIVER_TYPE TMC2209 E0_DRIVER_TYPE TMC2209 \ + X_HARDWARE_SERIAL Serial1 Y_HARDWARE_SERIAL Serial1 Z_HARDWARE_SERIAL Serial1 E0_HARDWARE_SERIAL Serial1 \ + X_SLAVE_ADDRESS 0 Y_SLAVE_ADDRESS 1 Z_SLAVE_ADDRESS 2 E0_SLAVE_ADDRESS 3 opt_enable HOTEND_IDLE_TIMEOUT SOFTWARE_DRIVER_ENABLE exec_test $1 $2 "ESP32, TMC HW Serial, Hotend Idle" "$3" diff --git a/buildroot/tests/linux_native-tests b/buildroot/tests/linux_native-tests index 711691fb9d..0153687eac 100755 --- a/buildroot/tests/linux_native-tests +++ b/buildroot/tests/linux_native-tests @@ -10,8 +10,7 @@ set -e # Build with the default configurations # restore_configs -opt_set MOTHERBOARD BOARD_LINUX_RAMPS -opt_set TEMP_SENSOR_BED 1 +opt_set MOTHERBOARD BOARD_LINUX_RAMPS TEMP_SENSOR_BED 1 opt_enable PIDTEMPBED EEPROM_SETTINGS BAUD_RATE_GCODE exec_test $1 $2 "Linux with EEPROM" "$3" diff --git a/buildroot/tests/mega1280-tests b/buildroot/tests/mega1280-tests index 9110e9feb6..8b16b1dbc8 100755 --- a/buildroot/tests/mega1280-tests +++ b/buildroot/tests/mega1280-tests @@ -16,29 +16,25 @@ set -e # Test MESH_BED_LEVELING feature, with LCD # restore_configs -opt_set LCD_LANGUAGE an +opt_set LCD_LANGUAGE an \ + POWER_MONITOR_CURRENT_PIN 14 POWER_MONITOR_VOLTAGE_PIN 15 \ + CLOSED_LOOP_ENABLE_PIN 44 CLOSED_LOOP_MOVE_COMPLETE_PIN 45 opt_enable SPINDLE_FEATURE ULTIMAKERCONTROLLER LCD_BED_LEVELING \ EEPROM_SETTINGS EEPROM_BOOT_SILENT EEPROM_AUTO_INIT \ SENSORLESS_BACKOFF_MM HOMING_BACKOFF_POST_MM HOME_Y_BEFORE_X CODEPENDENT_XY_HOMING \ MESH_BED_LEVELING ENABLE_LEVELING_FADE_HEIGHT MESH_G28_REST_ORIGIN \ G26_MESH_VALIDATION MESH_EDIT_MENU GCODE_QUOTED_STRINGS \ EXTERNAL_CLOSED_LOOP_CONTROLLER POWER_MONITOR_CURRENT POWER_MONITOR_VOLTAGE -opt_set POWER_MONITOR_CURRENT_PIN 14 -opt_set POWER_MONITOR_VOLTAGE_PIN 15 -opt_set CLOSED_LOOP_ENABLE_PIN 44 -opt_set CLOSED_LOOP_MOVE_COMPLETE_PIN 45 exec_test $1 $2 "Spindle, MESH_BED_LEVELING, closed loop, Power Monitor, and LCD" "$3" # # Test DUAL_X_CARRIAGE # restore_configs -opt_set MOTHERBOARD BOARD_ZRIB_V52 -opt_set LCD_LANGUAGE pt -opt_set EXTRUDERS 2 -opt_set TEMP_SENSOR_1 1 +opt_set MOTHERBOARD BOARD_ZRIB_V52 \ + LCD_LANGUAGE pt REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 \ + EXTRUDERS 2 TEMP_SENSOR_1 1 opt_enable USE_XMAX_PLUG DUAL_X_CARRIAGE REPRAPWORLD_KEYPAD -opt_set REPRAPWORLD_KEYPAD_MOVE_STEP 10.0 exec_test $1 $2 "ZRIB_V52 | DUAL_X_CARRIAGE" "$3" # diff --git a/buildroot/tests/mega2560-tests b/buildroot/tests/mega2560-tests index d74aa30f88..d961ab4eff 100755 --- a/buildroot/tests/mega2560-tests +++ b/buildroot/tests/mega2560-tests @@ -16,17 +16,10 @@ set -e # Test a probeless build of AUTO_BED_LEVELING_UBL, with lots of extruders # use_example_configs AnimationExample -opt_set SHOW_CUSTOM_BOOTSCREEN -opt_set MOTHERBOARD BOARD_AZTEEG_X3_PRO -opt_set LCD_LANGUAGE fr -opt_set EXTRUDERS 5 -opt_set TEMP_SENSOR_1 1 -opt_set TEMP_SENSOR_2 5 -opt_set TEMP_SENSOR_3 20 -opt_set TEMP_SENSOR_4 1000 -opt_set TEMP_SENSOR_BED 1 +opt_set MOTHERBOARD BOARD_AZTEEG_X3_PRO LCD_LANGUAGE fr \ + EXTRUDERS 5 TEMP_SENSOR_1 1 TEMP_SENSOR_2 5 TEMP_SENSOR_3 20 TEMP_SENSOR_4 1000 TEMP_SENSOR_BED 1 opt_enable AUTO_BED_LEVELING_UBL RESTORE_LEVELING_AFTER_G28 DEBUG_LEVELING_FEATURE G26_MESH_VALIDATION ENABLE_LEVELING_FADE_HEIGHT SKEW_CORRECTION \ - REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER LIGHTWEIGHT_UI STATUS_MESSAGE_SCROLLING BOOT_MARLIN_LOGO_SMALL \ + REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER LIGHTWEIGHT_UI STATUS_MESSAGE_SCROLLING SHOW_CUSTOM_BOOTSCREEN BOOT_MARLIN_LOGO_SMALL \ SDSUPPORT SDCARD_SORT_ALPHA USB_FLASH_DRIVE_SUPPORT AUTO_REPORT_SD_STATUS SCROLL_LONG_FILENAMES CANCEL_OBJECTS SOUND_MENU_ITEM \ EEPROM_SETTINGS EEPROM_CHITCHAT GCODE_MACROS CUSTOM_USER_MENUS \ MULTI_NOZZLE_DUPLICATION CLASSIC_JERK LIN_ADVANCE EXTRA_LIN_ADVANCE_K QUICK_HOME \ @@ -38,26 +31,18 @@ exec_test $1 $2 "Azteeg X3 Pro | EXTRUDERS 5 | RRDFGSC | UBL | LIN_ADVANCE ..." # Add a Sled Z Probe, use UBL Cartesian moves, use Japanese language # use_example_configs AnimationExample -opt_set SHOW_CUSTOM_BOOTSCREEN -opt_set MOTHERBOARD BOARD_AZTEEG_X3_PRO -opt_set LCD_LANGUAGE fr -opt_set EXTRUDERS 5 -opt_set TEMP_SENSOR_1 1 -opt_set TEMP_SENSOR_2 5 -opt_set TEMP_SENSOR_3 20 -opt_set TEMP_SENSOR_4 1000 -opt_set TEMP_SENSOR_BED 1 -opt_enable AUTO_BED_LEVELING_UBL RESTORE_LEVELING_AFTER_G28 DEBUG_LEVELING_FEATURE G26_MESH_VALIDATION ENABLE_LEVELING_FADE_HEIGHT SKEW_CORRECTION \ - REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER LIGHTWEIGHT_UI STATUS_MESSAGE_SCROLLING BOOT_MARLIN_LOGO_SMALL \ - SDSUPPORT SDCARD_SORT_ALPHA USB_FLASH_DRIVE_SUPPORT SCROLL_LONG_FILENAMES CANCEL_OBJECTS NO_SD_AUTOSTART \ +opt_set MOTHERBOARD BOARD_AZTEEG_X3_PRO LCD_LANGUAGE jp_kana \ + EXTRUDERS 5 TEMP_SENSOR_1 1 TEMP_SENSOR_2 5 TEMP_SENSOR_3 20 TEMP_SENSOR_4 1000 TEMP_SENSOR_BED 1 +opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER LIGHTWEIGHT_UI SHOW_CUSTOM_BOOTSCREEN BOOT_MARLIN_LOGO_SMALL \ + LCD_SET_PROGRESS_MANUALLY PRINT_PROGRESS_SHOW_DECIMALS SHOW_REMAINING_TIME STATUS_MESSAGE_SCROLLING SCROLL_LONG_FILENAMES \ + SDSUPPORT SDCARD_SORT_ALPHA NO_SD_AUTOSTART USB_FLASH_DRIVE_SUPPORT CANCEL_OBJECTS \ + Z_PROBE_SLED AUTO_BED_LEVELING_UBL RESTORE_LEVELING_AFTER_G28 DEBUG_LEVELING_FEATURE G26_MESH_VALIDATION ENABLE_LEVELING_FADE_HEIGHT \ EEPROM_SETTINGS EEPROM_CHITCHAT GCODE_MACROS CUSTOM_USER_MENUS \ MULTI_NOZZLE_DUPLICATION CLASSIC_JERK LIN_ADVANCE QUICK_HOME \ - LCD_SET_PROGRESS_MANUALLY PRINT_PROGRESS_SHOW_DECIMALS SHOW_REMAINING_TIME \ - BABYSTEPPING BABYSTEP_XY NANODLP_Z_SYNC I2C_POSITION_ENCODERS M114_DETAIL \ - Z_PROBE_SLED SKEW_CORRECTION SKEW_CORRECTION_FOR_Z SKEW_CORRECTION_GCODE -opt_set LCD_LANGUAGE jp_kana + NANODLP_Z_SYNC I2C_POSITION_ENCODERS M114_DETAIL \ + SKEW_CORRECTION SKEW_CORRECTION_FOR_Z SKEW_CORRECTION_GCODE \ + BABYSTEPPING BABYSTEP_XY BABYSTEP_ZPROBE_OFFSET DOUBLECLICK_FOR_Z_BABYSTEPPING BABYSTEP_HOTEND_Z_OFFSET BABYSTEP_DISPLAY_TOTAL opt_disable SEGMENT_LEVELED_MOVES -opt_enable BABYSTEPPING BABYSTEP_XY BABYSTEP_ZPROBE_OFFSET DOUBLECLICK_FOR_Z_BABYSTEPPING BABYSTEP_HOTEND_Z_OFFSET BABYSTEP_DISPLAY_TOTAL M114_DETAIL exec_test $1 $2 "Azteeg X3 Pro | EXTRUDERS 5 | RRDFGSC | UBL | LIN_ADVANCE | Sled Probe | Skew | JP-Kana | Babystep offsets ..." "$3" @@ -65,25 +50,16 @@ exec_test $1 $2 "Azteeg X3 Pro | EXTRUDERS 5 | RRDFGSC | UBL | LIN_ADVANCE | Sle # 5 runout sensors with distinct states # restore_configs -opt_set MOTHERBOARD BOARD_AZTEEG_X3_PRO -opt_set EXTRUDERS 5 -opt_set NUM_SERVOS 1 -opt_set TEMP_SENSOR_1 1 -opt_set TEMP_SENSOR_2 1 -opt_set TEMP_SENSOR_3 1 -opt_set TEMP_SENSOR_4 1 +opt_set MOTHERBOARD BOARD_AZTEEG_X3_PRO NUM_SERVOS 1 \ + EXTRUDERS 5 TEMP_SENSOR_1 1 TEMP_SENSOR_2 1 TEMP_SENSOR_3 1 TEMP_SENSOR_4 1 \ + NUM_RUNOUT_SENSORS 5 FIL_RUNOUT2_PIN 44 FIL_RUNOUT3_PIN 45 FIL_RUNOUT4_PIN 46 FIL_RUNOUT5_PIN 47 \ + FIL_RUNOUT3_STATE HIGH opt_enable VIKI2 BOOT_MARLIN_LOGO_ANIMATED SDSUPPORT AUTO_REPORT_SD_STATUS \ Z_PROBE_SERVO_NR Z_SERVO_ANGLES DEACTIVATE_SERVOS_AFTER_MOVE AUTO_BED_LEVELING_3POINT DEBUG_LEVELING_FEATURE \ EEPROM_SETTINGS EEPROM_CHITCHAT M114_DETAIL \ NO_VOLUMETRICS EXTENDED_CAPABILITIES_REPORT AUTO_REPORT_TEMPERATURES AUTOTEMP G38_PROBE_TARGET JOYSTICK \ DIRECT_STEPPING DETECT_BROKEN_ENDSTOP \ FILAMENT_RUNOUT_SENSOR NOZZLE_PARK_FEATURE ADVANCED_PAUSE_FEATURE Z_SAFE_HOMING FIL_RUNOUT3_PULLUP -opt_set NUM_RUNOUT_SENSORS 5 -opt_set FIL_RUNOUT2_PIN 44 -opt_set FIL_RUNOUT3_PIN 45 -opt_set FIL_RUNOUT3_STATE HIGH -opt_set FIL_RUNOUT4_PIN 46 -opt_set FIL_RUNOUT5_PIN 47 exec_test $1 $2 "Multiple runout sensors (x5) | Distinct runout states" "$3" @@ -91,27 +67,19 @@ exec_test $1 $2 "Multiple runout sensors (x5) | Distinct runout states" "$3" # Mixing Extruder with 5 steppers, Greek # restore_configs -opt_set MOTHERBOARD BOARD_AZTEEG_X3_PRO -opt_set LCD_LANGUAGE el_gr +opt_set MOTHERBOARD BOARD_AZTEEG_X3_PRO MIXING_STEPPERS 5 LCD_LANGUAGE ru \ + NUM_RUNOUT_SENSORS E_STEPPERS FIL_RUNOUT2_PIN 16 FIL_RUNOUT3_PIN 17 FIL_RUNOUT4_PIN 4 FIL_RUNOUT5_PIN 5 opt_enable MIXING_EXTRUDER GRADIENT_MIX GRADIENT_VTOOL CR10_STOCKDISPLAY \ USE_CONTROLLER_FAN CONTROLLER_FAN_EDITABLE CONTROLLER_FAN_IGNORE_Z \ FILAMENT_RUNOUT_SENSOR ADVANCED_PAUSE_FEATURE NOZZLE_PARK_FEATURE -opt_set MIXING_STEPPERS 5 -opt_set NUM_RUNOUT_SENSORS E_STEPPERS -opt_set FIL_RUNOUT2_PIN 16 -opt_set FIL_RUNOUT3_PIN 17 -opt_set FIL_RUNOUT4_PIN 4 -opt_set FIL_RUNOUT5_PIN 5 -opt_set LCD_LANGUAGE ru exec_test $1 $2 "Azteeg X3 | Mixing Extruder (x5) | Gradient Mix | Greek" "$3" # # Test SPEAKER with BOARD_BQ_ZUM_MEGA_3D and BQ_LCD_SMART_CONTROLLER # #restore_configs -#opt_set MOTHERBOARD BOARD_BQ_ZUM_MEGA_3D -#opt_set LCD_FEEDBACK_FREQUENCY_DURATION_MS 10 -#opt_set LCD_FEEDBACK_FREQUENCY_HZ 100 +#opt_set MOTHERBOARD BOARD_BQ_ZUM_MEGA_3D \ +# LCD_FEEDBACK_FREQUENCY_DURATION_MS 10 LCD_FEEDBACK_FREQUENCY_HZ 100 #opt_enable BQ_LCD_SMART_CONTROLLER SPEAKER # @@ -153,10 +121,7 @@ exec_test $1 $2 "Azteeg X3 | Mixing Extruder (x5) | Gradient Mix | Greek" "$3" # #restore_configs #opt_enable G3D_PANEL SDSUPPORT SDCARD_SORT_ALPHA STATUS_MESSAGE_SCROLLING SCROLL_LONG_FILENAMES -#opt_set SDSORT_GCODE true -#opt_set SDSORT_USES_RAM true -#opt_set SDSORT_USES_STACK true -#opt_set SDSORT_CACHE_NAMES true +#opt_set SDSORT_GCODE true SDSORT_USES_RAM true SDSORT_USES_STACK true SDSORT_CACHE_NAMES true #exec_test $1 $2 "Stuff" "$3" # # REPRAPWORLD_KEYPAD diff --git a/buildroot/tests/mks_robin_lite-tests b/buildroot/tests/mks_robin_lite-tests index c4be4f206d..49ef004871 100755 --- a/buildroot/tests/mks_robin_lite-tests +++ b/buildroot/tests/mks_robin_lite-tests @@ -7,10 +7,8 @@ set -e restore_configs -opt_set MOTHERBOARD BOARD_MKS_ROBIN_LITE -opt_set SERIAL_PORT 1 -opt_enable EEPROM_SETTINGS -opt_enable SDSUPPORT +opt_set MOTHERBOARD BOARD_MKS_ROBIN_LITE SERIAL_PORT 1 +opt_enable EEPROM_SETTINGS SDSUPPORT exec_test $1 $2 "Default Configuration with Fallback SD EEPROM" "$3" # cleanup diff --git a/buildroot/tests/mks_robin_mini-tests b/buildroot/tests/mks_robin_mini-tests index 6675634f30..29baee8818 100755 --- a/buildroot/tests/mks_robin_mini-tests +++ b/buildroot/tests/mks_robin_mini-tests @@ -8,9 +8,7 @@ set -e use_example_configs Mks/Robin -opt_set MOTHERBOARD BOARD_MKS_ROBIN_MINI -opt_set EXTRUDERS 1 -opt_set TEMP_SENSOR_1 0 +opt_set MOTHERBOARD BOARD_MKS_ROBIN_MINI EXTRUDERS 1 TEMP_SENSOR_1 0 exec_test $1 $2 "MKS Robin mini" "$3" # cleanup diff --git a/buildroot/tests/mks_robin_nano35-tests b/buildroot/tests/mks_robin_nano35-tests index 6e2f9f1b0c..7ab592aaa3 100755 --- a/buildroot/tests/mks_robin_nano35-tests +++ b/buildroot/tests/mks_robin_nano35-tests @@ -49,11 +49,9 @@ exec_test $1 $2 "MKS Robin v2 nano New Color UI 480x320 SPI" "$3" # (Robin v2 nano has no FSMC interface) # use_example_configs Mks/Robin -opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO_V2 +opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO_V2 X_DRIVER_TYPE TMC2209 Y_DRIVER_TYPE TMC2209 opt_disable TFT_INTERFACE_FSMC TFT_COLOR_UI TOUCH_SCREEN TFT_RES_320x240 opt_enable TFT_INTERFACE_SPI TFT_LVGL_UI TFT_RES_480x320 -opt_set X_DRIVER_TYPE TMC2209 -opt_set Y_DRIVER_TYPE TMC2209 exec_test $1 $2 "MKS Robin v2 nano LVGL SPI + TMC" "$3" # diff --git a/buildroot/tests/mks_robin_nano35_stm32-tests b/buildroot/tests/mks_robin_nano35_stm32-tests index 696fb94069..0891744692 100755 --- a/buildroot/tests/mks_robin_nano35_stm32-tests +++ b/buildroot/tests/mks_robin_nano35_stm32-tests @@ -58,11 +58,9 @@ exec_test $1 $2 "MKS Robin v2 nano New Color UI 480x320 SPI" "$3" # (Robin v2 nano has no FSMC interface) # # use_example_configs Mks/Robin -# opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO_V2 +# opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO_V2 X_DRIVER_TYPE TMC2209 Y_DRIVER_TYPE TMC2209 # opt_disable TFT_INTERFACE_FSMC TFT_COLOR_UI TOUCH_SCREEN TFT_RES_320x240 # opt_enable TFT_INTERFACE_SPI TFT_LVGL_UI TFT_RES_480x320 -# opt_set X_DRIVER_TYPE TMC2209 -# opt_set Y_DRIVER_TYPE TMC2209 # exec_test $1 $2 "MKS Robin v2 nano LVGL SPI + TMC" "$3" # cleanup diff --git a/buildroot/tests/mks_robin_pro-tests b/buildroot/tests/mks_robin_pro-tests index 3503d0ce1f..4b38ab97b6 100755 --- a/buildroot/tests/mks_robin_pro-tests +++ b/buildroot/tests/mks_robin_pro-tests @@ -8,13 +8,11 @@ set -e use_example_configs Mks/Robin_Pro opt_enable EMERGENCY_PARSER -opt_set SERIAL_PORT 3 -opt_disable SERIAL_PORT_2 -opt_set SDCARD_CONNECTION LCD -opt_set X_DRIVER_TYPE TMC2209 -opt_set Y_DRIVER_TYPE TMC2130 -opt_set TEMP_SENSOR_BED 1 -opt_disable THERMAL_PROTECTION_HOTENDS +opt_set SERIAL_PORT 3 \ + SDCARD_CONNECTION LCD \ + X_DRIVER_TYPE TMC2209 Y_DRIVER_TYPE TMC2130 \ + TEMP_SENSOR_BED 1 +opt_disable SERIAL_PORT_2 THERMAL_PROTECTION_HOTENDS exec_test $1 $2 "MKS Robin Pro, TMC Drivers, no thermal protection" "$3" # cleanup diff --git a/buildroot/tests/rambo-tests b/buildroot/tests/rambo-tests index 02ecf5d3fc..5da4eed9b4 100755 --- a/buildroot/tests/rambo-tests +++ b/buildroot/tests/rambo-tests @@ -10,22 +10,14 @@ set -e # Lots of options - Formerly the first Mega2560 test # restore_configs -opt_set MOTHERBOARD BOARD_RAMBO -opt_set EXTRUDERS 2 -opt_set TEMP_SENSOR_0 -2 -opt_set TEMP_SENSOR_1 1 -opt_set TEMP_SENSOR_BED 2 -opt_set TEMP_SENSOR_PROBE 1 -opt_add TEMP_PROBE_PIN 12 -opt_set TEMP_SENSOR_CHAMBER 3 -opt_add TEMP_CHAMBER_PIN 3 -opt_add HEATER_CHAMBER_PIN 45 -opt_set GRID_MAX_POINTS_X 16 -opt_set FANMUX0_PIN 53 -opt_set Z_HOME_DIR 1 -opt_enable USE_ZMAX_PLUG +opt_set MOTHERBOARD BOARD_RAMBO \ + EXTRUDERS 2 TEMP_SENSOR_0 -2 TEMP_SENSOR_1 1 TEMP_SENSOR_BED 2 \ + TEMP_SENSOR_PROBE 1 TEMP_PROBE_PIN 12 \ + TEMP_SENSOR_CHAMBER 3 TEMP_CHAMBER_PIN 3 HEATER_CHAMBER_PIN 45 \ + Z_HOME_DIR 1 GRID_MAX_POINTS_X 16 \ + FANMUX0_PIN 53 opt_disable USE_ZMIN_PLUG Z_MIN_PROBE_USES_Z_MIN_ENDSTOP_PIN USE_WATCHDOG -opt_enable REPRAP_DISCOUNT_SMART_CONTROLLER LCD_PROGRESS_BAR LCD_PROGRESS_BAR_TEST \ +opt_enable USE_ZMAX_PLUG REPRAP_DISCOUNT_SMART_CONTROLLER LCD_PROGRESS_BAR LCD_PROGRESS_BAR_TEST \ FIX_MOUNTED_PROBE CODEPENDENT_XY_HOMING PIDTEMPBED PROBE_TEMP_COMPENSATION \ PREHEAT_BEFORE_PROBING PROBING_HEATERS_OFF PROBING_FANS_OFF PROBING_STEPPERS_OFF WAIT_FOR_BED_HEATER \ EEPROM_SETTINGS SDSUPPORT SD_REPRINT_LAST_SELECTED_FILE BINARY_FILE_TRANSFER \ @@ -50,12 +42,10 @@ exec_test $1 $2 "RAMBO | EXTRUDERS 2 | CHAR LCD + SD | FIX Probe | ABL-Linear | # Full size Rambo Dual Endstop CNC # restore_configs -opt_set MOTHERBOARD BOARD_RAMBO -opt_set EXTRUDERS 0 -opt_set TEMP_SENSOR_0 999 -opt_set DUMMY_THERMISTOR_999_VALUE 170 -opt_set DIGIPOT_MOTOR_CURRENT '{ 120, 120, 120, 120, 120 }' -opt_set LEVEL_CORNERS_LEVELING_ORDER '{ LF, RF }' +opt_set MOTHERBOARD BOARD_RAMBO \ + EXTRUDERS 0 TEMP_SENSOR_0 999 DUMMY_THERMISTOR_999_VALUE 170 \ + DIGIPOT_MOTOR_CURRENT '{ 120, 120, 120, 120, 120 }' \ + LEVEL_CORNERS_LEVELING_ORDER '{ LF, RF }' opt_enable USE_XMAX_PLUG USE_YMAX_PLUG USE_ZMAX_PLUG \ REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER REVERSE_ENCODER_DIRECTION SDSUPPORT EEPROM_SETTINGS \ S_CURVE_ACCELERATION X_DUAL_STEPPER_DRIVERS X_DUAL_ENDSTOPS Y_DUAL_STEPPER_DRIVERS Y_DUAL_ENDSTOPS \ @@ -68,9 +58,7 @@ exec_test $1 $2 "Rambo CNC Configuration" "$3" # Rambo heated bed only # restore_configs -opt_set MOTHERBOARD BOARD_RAMBO -opt_set EXTRUDERS 0 -opt_set TEMP_SENSOR_BED 1 +opt_set MOTHERBOARD BOARD_RAMBO EXTRUDERS 0 TEMP_SENSOR_BED 1 opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER exec_test $1 $2 "Rambo heated bed only" "$3" @@ -78,18 +66,18 @@ exec_test $1 $2 "Rambo heated bed only" "$3" # Build with the default configurations # restore_configs -opt_set MOTHERBOARD BOARD_EINSY_RAMBO -opt_set X_DRIVER_TYPE TMC2130 -opt_set Y_DRIVER_TYPE TMC2130 -opt_set Z_DRIVER_TYPE TMC2130 -opt_set E0_DRIVER_TYPE TMC2130 +opt_set MOTHERBOARD BOARD_EINSY_RAMBO \ + X_DRIVER_TYPE TMC2130 Y_DRIVER_TYPE TMC2130 Z_DRIVER_TYPE TMC2130 E0_DRIVER_TYPE TMC2130 exec_test $1 $2 "Einsy RAMBo with TMC2130" "$3" # # Test MINIRAMBO with PWM_MOTOR_CURRENT and many features # restore_configs -opt_set MOTHERBOARD BOARD_MINIRAMBO +opt_set MOTHERBOARD BOARD_MINIRAMBO \ + CONTROLLERFAN_SPEED_IDLE 128 \ + PWM_MOTOR_CURRENT '{ 1300, 1300, 1250 }' \ + I2C_SLAVE_ADDRESS 63 opt_enable EEPROM_SETTINGS EEPROM_CHITCHAT REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER \ SDSUPPORT PCA9632 SOUND_MENU_ITEM GCODE_REPEAT_MARKERS \ AUTO_BED_LEVELING_BILINEAR PROBE_MANUALLY LCD_BED_LEVELING G26_MESH_VALIDATION MESH_EDIT_MENU \ @@ -98,23 +86,23 @@ opt_enable EEPROM_SETTINGS EEPROM_CHITCHAT REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CO NOZZLE_PARK_FEATURE NOZZLE_CLEAN_FEATURE \ ADVANCED_PAUSE_FEATURE PARK_HEAD_ON_PAUSE ADVANCED_PAUSE_CONTINUOUS_PURGE FILAMENT_LOAD_UNLOAD_GCODES \ PRINTCOUNTER SERVICE_NAME_1 SERVICE_INTERVAL_1 M114_DETAIL -opt_set CONTROLLERFAN_SPEED_IDLE 128 opt_add M100_FREE_MEMORY_DUMPER opt_add M100_FREE_MEMORY_CORRUPTOR -opt_set PWM_MOTOR_CURRENT "{ 1300, 1300, 1250 }" -opt_set I2C_SLAVE_ADDRESS 63 exec_test $1 $2 "MINIRAMBO | RRDGFSC | M100 | PWM_MOTOR_CURRENT | PRINTCOUNTER | Advanced Pause ..." "$3" # # Test many less common options # restore_configs -opt_set MOTHERBOARD BOARD_RAMBO -opt_set TEMP_SENSOR_0 -2 -opt_set DIGIPOT_I2C_NUM_CHANNELS 5 -opt_set LCD_LANGUAGE it -opt_set MIXING_STEPPERS 2 -opt_set SERVO_DELAY "{ 300, 300, 300 }" +opt_set MOTHERBOARD BOARD_RAMBO \ + TEMP_SENSOR_0 -2 \ + DIGIPOT_I2C_NUM_CHANNELS 5 \ + LCD_LANGUAGE it \ + MIXING_STEPPERS 2 \ + SERVO_DELAY '{ 300, 300, 300 }' \ + CONTROLLER_FAN_PIN X_MAX_PIN FILWIDTH_PIN 5 \ + FAN_MIN_PWM 50 FAN_KICKSTART_TIME 100 \ + XY_FREQUENCY_LIMIT 15 opt_enable COREYX USE_XMAX_PLUG MIXING_EXTRUDER GRADIENT_MIX \ BABYSTEPPING BABYSTEP_DISPLAY_TOTAL FILAMENT_LCD_DISPLAY \ REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER MENU_ADDAUTOSTART SDSUPPORT SDCARD_SORT_ALPHA \ @@ -124,11 +112,6 @@ opt_enable COREYX USE_XMAX_PLUG MIXING_EXTRUDER GRADIENT_MIX \ SD_ABORT_ON_ENDSTOP_HIT HOST_ACTION_COMMANDS HOST_PROMPT_SUPPORT ADVANCED_OK M114_DETAIL \ VOLUMETRIC_DEFAULT_ON NO_WORKSPACE_OFFSETS EXTRA_FAN_SPEED FWRETRACT \ USE_CONTROLLER_FAN CONTROLLER_FAN_EDITABLE CONTROLLER_FAN_USE_Z_ONLY -opt_set CONTROLLER_FAN_PIN X_MAX_PIN -opt_set FAN_MIN_PWM 50 -opt_set FAN_KICKSTART_TIME 100 -opt_set XY_FREQUENCY_LIMIT 15 -opt_add FILWIDTH_PIN 5 exec_test $1 $2 "Rambo | CoreXY, Gradient Mix | Endstop Int. | Home Y > X | FW Retract ..." "$3" # clean up diff --git a/buildroot/tests/rumba32-tests b/buildroot/tests/rumba32-tests index 20a640efed..f26af33610 100755 --- a/buildroot/tests/rumba32-tests +++ b/buildroot/tests/rumba32-tests @@ -8,31 +8,23 @@ set -e # Build examples restore_configs -opt_set MOTHERBOARD BOARD_RUMBA32_V1_0 -opt_set SERIAL_PORT -1 +opt_set MOTHERBOARD BOARD_RUMBA32_V1_0 SERIAL_PORT -1 \ + TEMP_SENSOR_BED 1 X_DRIVER_TYPE TMC2130 opt_disable PIDTEMP opt_enable PIDTEMPBED -opt_set TEMP_SENSOR_BED 1 opt_disable THERMAL_PROTECTION_BED -opt_set X_DRIVER_TYPE TMC2130 exec_test $1 $2 "RUMBA32 V1.0 with TMC2130, PID Bed, and bed thermal protection disabled" "$3" # Build examples restore_configs -opt_set MOTHERBOARD BOARD_RUMBA32_V1_1 -opt_set SERIAL_PORT -1 +opt_set MOTHERBOARD BOARD_RUMBA32_V1_1 SERIAL_PORT -1 \ + TEMP_SENSOR_BED 1 X_DRIVER_TYPE TMC2130 Y_DRIVER_TYPE TMC2208 opt_enable PIDTEMPBED EEPROM_SETTINGS EEPROM_CHITCHAT REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER -opt_set TEMP_SENSOR_BED 1 -opt_set X_DRIVER_TYPE TMC2130 -opt_set Y_DRIVER_TYPE TMC2208 exec_test $1 $2 "RUMBA32 V1.1 with TMC2130, TMC2208, PID Bed, EEPROM settings, and graphic LCD controller" "$3" # Build examples restore_configs -opt_set MOTHERBOARD BOARD_RUMBA32_MKS -opt_set SERIAL_PORT -1 -opt_set X_DRIVER_TYPE TMC2130 -opt_set Y_DRIVER_TYPE TMC2208 +opt_set MOTHERBOARD BOARD_RUMBA32_MKS SERIAL_PORT -1 X_DRIVER_TYPE TMC2130 Y_DRIVER_TYPE TMC2208 exec_test $1 $2 "RUMBA32 MKS Default Config with Mixed TMC Drivers" "$3" # cleanup diff --git a/buildroot/tests/sanguino1284p-tests b/buildroot/tests/sanguino1284p-tests index 55cdf418da..7c2aa61f69 100755 --- a/buildroot/tests/sanguino1284p-tests +++ b/buildroot/tests/sanguino1284p-tests @@ -10,10 +10,10 @@ set -e # Start with default configurations... # restore_configs -opt_set MOTHERBOARD BOARD_SANGUINOLOLU_12 -opt_set LCD_LANGUAGE de +opt_set MOTHERBOARD BOARD_SANGUINOLOLU_12 \ + LCD_LANGUAGE de \ + CONTROLLER_FAN_PIN 27 opt_enable MINIPANEL USE_CONTROLLER_FAN CONTROLLER_FAN_EDITABLE -opt_set CONTROLLER_FAN_PIN 27 exec_test $1 $2 "Default Configuration | MINIPANAL | CONTROLLER_FAN" "$3" # diff --git a/buildroot/tests/teensy31-tests b/buildroot/tests/teensy31-tests index cf01d27461..10dde2be99 100755 --- a/buildroot/tests/teensy31-tests +++ b/buildroot/tests/teensy31-tests @@ -22,9 +22,10 @@ exec_test $1 $2 "Teensy3.1 with Zero Endstops" "$3" # Test many features together # restore_configs -opt_set MOTHERBOARD BOARD_TEENSY31_32 -opt_set TEMP_SENSOR_0 1 -opt_set TEMP_SENSOR_BED 1 +opt_set MOTHERBOARD BOARD_TEENSY31_32 \ + TEMP_SENSOR_0 1 TEMP_SENSOR_BED 1 \ + I2C_SLAVE_ADDRESS 63 \ + GRID_MAX_POINTS_X 16 opt_enable EEPROM_SETTINGS FILAMENT_WIDTH_SENSOR CALIBRATION_GCODE BAUD_RATE_GCODE \ FIX_MOUNTED_PROBE Z_SAFE_HOMING AUTO_BED_LEVELING_BILINEAR DEBUG_LEVELING_FEATURE Z_MIN_PROBE_REPEATABILITY_TEST \ BABYSTEPPING BABYSTEP_XY BABYSTEP_ZPROBE_OFFSET PRINTCOUNTER SLOW_PWM_HEATERS PIDTEMPBED \ @@ -33,6 +34,4 @@ opt_enable EEPROM_SETTINGS FILAMENT_WIDTH_SENSOR CALIBRATION_GCODE BAUD_RATE_GCO ARC_SUPPORT BEZIER_CURVE_SUPPORT EXPERIMENTAL_I2CBUS EXTENDED_CAPABILITIES_REPORT AUTO_REPORT_TEMPERATURES \ PHOTO_GCODE PHOTO_POSITION PHOTO_SWITCH_POSITION PHOTO_SWITCH_MS PHOTO_DELAY_MS PHOTO_RETRACT_MM \ HOST_ACTION_COMMANDS HOST_PROMPT_SUPPORT -opt_set I2C_SLAVE_ADDRESS 63 -opt_set GRID_MAX_POINTS_X 16 exec_test $1 $2 "Teensy3.1 with many features" "$3" diff --git a/buildroot/tests/teensy35-tests b/buildroot/tests/teensy35-tests index 79998a26d3..c4d007cd62 100755 --- a/buildroot/tests/teensy35-tests +++ b/buildroot/tests/teensy35-tests @@ -14,11 +14,10 @@ exec_test $1 $2 "Teensy3.5 with default config" "$3" # Test as many features together as possible # restore_configs -opt_set MOTHERBOARD BOARD_TEENSY35_36 -opt_set EXTRUDERS 2 -opt_set TEMP_SENSOR_0 1 -opt_set TEMP_SENSOR_1 5 -opt_set TEMP_SENSOR_BED 1 +opt_set MOTHERBOARD BOARD_TEENSY35_36 \ + EXTRUDERS 2 TEMP_SENSOR_0 1 TEMP_SENSOR_1 5 TEMP_SENSOR_BED 1 \ + I2C_SLAVE_ADDRESS 63 \ + GRID_MAX_POINTS_X 16 opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER LCD_INFO_MENU SDSUPPORT SDCARD_SORT_ALPHA \ FILAMENT_WIDTH_SENSOR FILAMENT_LCD_DISPLAY CALIBRATION_GCODE BAUD_RATE_GCODE SOUND_MENU_ITEM \ FIX_MOUNTED_PROBE Z_SAFE_HOMING AUTO_BED_LEVELING_BILINEAR Z_MIN_PROBE_REPEATABILITY_TEST DEBUG_LEVELING_FEATURE \ @@ -27,8 +26,6 @@ opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER LCD_INFO_MENU SDSUPPORT ADVANCED_PAUSE_FEATURE ARC_SUPPORT BEZIER_CURVE_SUPPORT EXPERIMENTAL_I2CBUS EXTENDED_CAPABILITIES_REPORT AUTO_REPORT_TEMPERATURES PARK_HEAD_ON_PAUSE \ PHOTO_GCODE PHOTO_POSITION PHOTO_SWITCH_POSITION PHOTO_SWITCH_MS PHOTO_DELAY_MS PHOTO_RETRACT_MM \ HOST_ACTION_COMMANDS HOST_PROMPT_SUPPORT -opt_set I2C_SLAVE_ADDRESS 63 -opt_set GRID_MAX_POINTS_X 16 exec_test $1 $2 "Teensy3.5 with many features" "$3" # @@ -43,10 +40,9 @@ exec_test $1 $2 "Sled Z Probe with Linear leveling" "$3" # Test a Servo Probe # # restore_configs -# opt_set MOTHERBOARD BOARD_TEENSY35_36 +# opt_set MOTHERBOARD BOARD_TEENSY35_36 NUM_SERVOS 1 # opt_enable Z_PROBE_SERVO_NR Z_SERVO_ANGLES DEACTIVATE_SERVOS_AFTER_MOVE \ # AUTO_BED_LEVELING_3POINT DEBUG_LEVELING_FEATURE EEPROM_SETTINGS -# opt_set NUM_SERVOS 1 # exec_test $1 $2 "Servo Probe" # # ...with AUTO_BED_LEVELING_3POINT, DEBUG_LEVELING_FEATURE, EEPROM_SETTINGS, EEPROM_CHITCHAT, EXTENDED_CAPABILITIES_REPORT, and AUTO_REPORT_TEMPERATURES @@ -59,28 +55,23 @@ exec_test $1 $2 "Sled Z Probe with Linear leveling" "$3" # Test MAGNETIC_PARKING_EXTRUDER with LCD # restore_configs -opt_set MOTHERBOARD BOARD_TEENSY35_36 -opt_set EXTRUDERS 2 -opt_set TEMP_SENSOR_1 1 -opt_enable MAGNETIC_PARKING_EXTRUDER ULTIMAKERCONTROLLER +opt_set MOTHERBOARD BOARD_TEENSY35_36 EXTRUDERS 2 TEMP_SENSOR_1 1 SOL0_PIN 29 +opt_enable PARKING_EXTRUDER ULTIMAKERCONTROLLER exec_test $1 $2 "MAGNETIC_PARKING_EXTRUDER with LCD" "$3" # # Mixing Extruder # restore_configs -opt_set MOTHERBOARD BOARD_TEENSY35_36 +opt_set MOTHERBOARD BOARD_TEENSY35_36 MIXING_STEPPERS 2 opt_enable MIXING_EXTRUDER DIRECT_MIXING_IN_G1 GRADIENT_MIX GRADIENT_VTOOL REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER -opt_set MIXING_STEPPERS 2 exec_test $1 $2 "Mixing Extruder" "$3" # # Test SWITCHING_EXTRUDER # # restore_configs -# opt_set MOTHERBOARD BOARD_TEENSY35_36 -# opt_set EXTRUDERS 2 -# opt_set NUM_SERVOS 1 +# opt_set MOTHERBOARD BOARD_TEENSY35_36 EXTRUDERS 2 NUM_SERVOS 1 # opt_enable SWITCHING_EXTRUDER ULTIMAKERCONTROLLER # exec_test $1 $2 "SWITCHING_EXTRUDER" @@ -88,15 +79,11 @@ exec_test $1 $2 "Mixing Extruder" "$3" # Enable COREXY # restore_configs -opt_set MOTHERBOARD BOARD_TEENSY35_36 -opt_enable COREXY -opt_set X_DRIVER_TYPE TMC5160 -opt_set Y_DRIVER_TYPE TMC5160 -opt_set X_MIN_ENDSTOP_INVERTING true -opt_set Y_MIN_ENDSTOP_INVERTING true -opt_add X_CS_PIN 46 -opt_add Y_CS_PIN 47 -opt_enable USE_ZMIN_PLUG MONITOR_DRIVER_STATUS SENSORLESS_HOMING +opt_set MOTHERBOARD BOARD_TEENSY35_36 \ + X_DRIVER_TYPE TMC5160 Y_DRIVER_TYPE TMC5160 \ + X_MIN_ENDSTOP_INVERTING true Y_MIN_ENDSTOP_INVERTING true \ + X_CS_PIN 46 Y_CS_PIN 47 +opt_enable COREXY USE_ZMIN_PLUG MONITOR_DRIVER_STATUS SENSORLESS_HOMING exec_test $1 $2 "Teensy 3.5/3.6 COREXY" "$3" # @@ -111,11 +98,9 @@ exec_test $1 $2 "Teensy 3.5/3.6 COREXZ" "$3" # Enable Dual Z with Dual Z endstops # restore_configs -opt_set MOTHERBOARD BOARD_TEENSY35_36 -opt_set NUM_Z_STEPPER_DRIVERS 2 +opt_set MOTHERBOARD BOARD_TEENSY35_36 NUM_Z_STEPPER_DRIVERS 2 Z2_MAX_PIN 2 opt_enable Z_MULTI_ENDSTOPS USE_XMAX_PLUG pins_set ramps/RAMPS X_MAX_PIN -1 -opt_add Z2_MAX_PIN 2 exec_test $1 $2 "Dual Z with Dual Z endstops" "$3" # Clean up diff --git a/buildroot/tests/teensy41-tests b/buildroot/tests/teensy41-tests index 6829045496..6074b5dc5f 100755 --- a/buildroot/tests/teensy41-tests +++ b/buildroot/tests/teensy41-tests @@ -14,11 +14,10 @@ exec_test $1 $2 "Teensy4.1 with default config" "$3" # Test as many features together as possible # restore_configs -opt_set MOTHERBOARD BOARD_TEENSY41 -opt_set EXTRUDERS 2 -opt_set TEMP_SENSOR_0 1 -opt_set TEMP_SENSOR_1 5 -opt_set TEMP_SENSOR_BED 1 +opt_set MOTHERBOARD BOARD_TEENSY41 \ + EXTRUDERS 2 TEMP_SENSOR_0 1 TEMP_SENSOR_1 5 TEMP_SENSOR_BED 1 \ + I2C_SLAVE_ADDRESS 63 \ + GRID_MAX_POINTS_X 16 opt_enable EXTENSIBLE_UI LCD_INFO_MENU SDSUPPORT SDCARD_SORT_ALPHA \ FILAMENT_LCD_DISPLAY CALIBRATION_GCODE BAUD_RATE_GCODE \ FIX_MOUNTED_PROBE Z_SAFE_HOMING AUTO_BED_LEVELING_BILINEAR Z_MIN_PROBE_REPEATABILITY_TEST DEBUG_LEVELING_FEATURE \ @@ -28,8 +27,6 @@ opt_enable EXTENSIBLE_UI LCD_INFO_MENU SDSUPPORT SDCARD_SORT_ALPHA \ PHOTO_GCODE PHOTO_POSITION PHOTO_SWITCH_POSITION PHOTO_SWITCH_MS PHOTO_DELAY_MS PHOTO_RETRACT_MM \ HOST_ACTION_COMMANDS HOST_PROMPT_SUPPORT opt_add EXTUI_EXAMPLE -opt_set I2C_SLAVE_ADDRESS 63 -opt_set GRID_MAX_POINTS_X 16 exec_test $1 $2 "Teensy4.1 with many features" "$3" # @@ -60,10 +57,8 @@ exec_test $1 $2 "Sled Z Probe with Linear leveling" "$3" # Test MAGNETIC_PARKING_EXTRUDER with no LCD # restore_configs -opt_set MOTHERBOARD BOARD_TEENSY41 -opt_set EXTRUDERS 2 -opt_set TEMP_SENSOR_1 1 -opt_set SERIAL_PORT_2 -2 +opt_set MOTHERBOARD BOARD_TEENSY41 SERIAL_PORT_2 -2 \ + EXTRUDERS 2 TEMP_SENSOR_1 1 opt_enable EEPROM_SETTINGS MAGNETIC_PARKING_EXTRUDER exec_test $1 $2 "Ethernet, EEPROM, Magnetic Parking Extruder, No LCD" "$3" @@ -71,18 +66,15 @@ exec_test $1 $2 "Ethernet, EEPROM, Magnetic Parking Extruder, No LCD" "$3" # Mixing Extruder # restore_configs -opt_set MOTHERBOARD BOARD_TEENSY41 +opt_set MOTHERBOARD BOARD_TEENSY41 MIXING_STEPPERS 2 opt_enable MIXING_EXTRUDER DIRECT_MIXING_IN_G1 GRADIENT_MIX GRADIENT_VTOOL -opt_set MIXING_STEPPERS 2 exec_test $1 $2 "Mixing Extruder" "$3" # # Test SWITCHING_EXTRUDER # # restore_configs -# opt_set MOTHERBOARD BOARD_TEENSY41 -# opt_set EXTRUDERS 2 -# opt_set NUM_SERVOS 1 +# opt_set MOTHERBOARD BOARD_TEENSY41 EXTRUDERS 2 NUM_SERVOS 1 # opt_enable SWITCHING_EXTRUDER ULTIMAKERCONTROLLER # exec_test $1 $2 "SWITCHING_EXTRUDER" "$3" @@ -90,15 +82,11 @@ exec_test $1 $2 "Mixing Extruder" "$3" # Enable COREXY # restore_configs -opt_set MOTHERBOARD BOARD_TEENSY41 -opt_enable COREXY -opt_set X_DRIVER_TYPE TMC5160 -opt_set Y_DRIVER_TYPE TMC5160 -opt_set X_MIN_ENDSTOP_INVERTING true -opt_set Y_MIN_ENDSTOP_INVERTING true -opt_add X_CS_PIN 46 -opt_add Y_CS_PIN 47 -opt_enable USE_ZMIN_PLUG MONITOR_DRIVER_STATUS SENSORLESS_HOMING +opt_set MOTHERBOARD BOARD_TEENSY41 \ + X_DRIVER_TYPE TMC5160 Y_DRIVER_TYPE TMC5160 \ + X_MIN_ENDSTOP_INVERTING true Y_MIN_ENDSTOP_INVERTING true \ + X_CS_PIN 46 Y_CS_PIN 47 +opt_enable COREXY USE_ZMIN_PLUG MONITOR_DRIVER_STATUS SENSORLESS_HOMING exec_test $1 $2 "Teensy 4.0/4.1 COREXY" "$3" # @@ -113,11 +101,9 @@ exec_test $1 $2 "Teensy 4.0/4.1 COREXZ" "$3" # Enable Dual Z with Dual Z endstops # restore_configs -opt_set MOTHERBOARD BOARD_TEENSY41 +opt_set MOTHERBOARD BOARD_TEENSY41 NUM_Z_STEPPER_DRIVERS 2 Z2_MAX_PIN 2 opt_enable Z_MULTI_ENDSTOPS USE_XMAX_PLUG -opt_set NUM_Z_STEPPER_DRIVERS 2 pins_set ramps/RAMPS X_MAX_PIN -1 -opt_add Z2_MAX_PIN 2 exec_test $1 $2 "Dual Z with Dual Z endstops" "$3" # Clean up From fd270ddc6c5b4d78437d590ae8066326850555d7 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 3 Mar 2021 00:11:50 -0600 Subject: [PATCH 080/253] misc. cleanup --- Marlin/src/HAL/STM32/tft/tft_spi.cpp | 6 +++--- Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp | 4 ++-- Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp | 2 +- Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp | 6 ++++-- Marlin/src/lcd/menu/menu_ubl.cpp | 2 +- 5 files changed, 11 insertions(+), 9 deletions(-) diff --git a/Marlin/src/HAL/STM32/tft/tft_spi.cpp b/Marlin/src/HAL/STM32/tft/tft_spi.cpp index 3cb797d5f2..32af67d158 100644 --- a/Marlin/src/HAL/STM32/tft/tft_spi.cpp +++ b/Marlin/src/HAL/STM32/tft/tft_spi.cpp @@ -207,12 +207,12 @@ void TFT_SPI::Transmit(uint16_t Data) { while ((SPIx.Instance->SR & SPI_FLAG_BSY) == SPI_FLAG_BSY) {} if (TFT_MISO_PIN != TFT_MOSI_PIN) - __HAL_SPI_CLEAR_OVRFLAG(&SPIx); /* Clear overrun flag in 2 Lines communication mode because received is not read */ + __HAL_SPI_CLEAR_OVRFLAG(&SPIx); // Clear overrun flag in 2 Lines communication mode because received is not read } void TFT_SPI::TransmitDMA(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Count) { // Wait last dma finish, to start another - while(isBusy()) { } + while (isBusy()) { /* nada */ } DMAtx.Init.MemInc = MemoryIncrease; HAL_DMA_Init(&DMAtx); @@ -225,7 +225,7 @@ void TFT_SPI::TransmitDMA(uint32_t MemoryIncrease, uint16_t *Data, uint16_t Coun HAL_DMA_Start(&DMAtx, (uint32_t)Data, (uint32_t)&(SPIx.Instance->DR), Count); __HAL_SPI_ENABLE(&SPIx); - SET_BIT(SPIx.Instance->CR2, SPI_CR2_TXDMAEN); /* Enable Tx DMA Request */ + SET_BIT(SPIx.Instance->CR2, SPI_CR2_TXDMAEN); // Enable Tx DMA Request HAL_DMA_PollForTransfer(&DMAtx, HAL_DMA_FULL_TRANSFER, HAL_MAX_DELAY); Abort(); diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp index fd91138a4f..97149a407e 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp @@ -310,7 +310,7 @@ namespace Anycubic { bool ChironTFT::ReadTFTCommand() { bool command_ready = false; - while(TFTSer.available() > 0 && command_len < MAX_CMND_LEN) { + while (TFTSer.available() > 0 && command_len < MAX_CMND_LEN) { panel_command[command_len] = TFTSer.read(); if (panel_command[command_len] == '\n') { command_ready = true; @@ -338,7 +338,7 @@ namespace Anycubic { int8_t ChironTFT::Findcmndpos(const char * buff, char q) { int8_t pos = 0; - do { if (buff[pos] == q) return pos; } while(++pos < MAX_CMND_LEN); + do { if (buff[pos] == q) return pos; } while (++pos < MAX_CMND_LEN); return -1; } diff --git a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp index bdd702b1d7..9fc56acf10 100644 --- a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp @@ -264,7 +264,7 @@ void DGUSScreenHandler::DGUSLCD_SendTMCStepValue(DGUS_VP_Variable &var) { void DGUSScreenHandler::SDPrintingFinished() { if (DGUSAutoTurnOff) { - while(!queue.ring_buffer.empty()) queue.advance(); + while (!queue.ring_buffer.empty()) queue.advance(); gcode.process_subcommands_now_P(PSTR("M81")); } GotoScreen(MKSLCD_SCREEN_PrintDone); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp index 0a8f81ea86..d32851f761 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.cpp @@ -66,8 +66,10 @@ uint8_t sel_id = 0; //root2.rewind(); //SERIAL_ECHOLN(list_file.curDirPath); - if (curDirLever != 0) card.cd(list_file.curDirPath); - else card.cdroot(); // while(card.cdup()); + if (curDirLever != 0) + card.cd(list_file.curDirPath); + else + card.cdroot(); const uint16_t fileCnt = card.get_num_Files(); diff --git a/Marlin/src/lcd/menu/menu_ubl.cpp b/Marlin/src/lcd/menu/menu_ubl.cpp index 95e64a0d82..79bedb9ea5 100644 --- a/Marlin/src/lcd/menu/menu_ubl.cpp +++ b/Marlin/src/lcd/menu/menu_ubl.cpp @@ -476,7 +476,7 @@ void ubl_map_screen() { if (position_is_reachable(xy)) break; // Found a valid point ui.encoderPosition += step_dir; // Test the next point #endif - } while(ENABLED(IS_KINEMATIC)); + } while (ENABLED(IS_KINEMATIC)); // Determine number of points to edit #if IS_KINEMATIC From a46e0257252bcd50f4c7acb04215f3ad2a92047c Mon Sep 17 00:00:00 2001 From: Axel Date: Wed, 3 Mar 2021 20:46:32 -0300 Subject: [PATCH 081/253] TPARA - 3DOF robot arm IK (#21005) Co-authored-by: Scott Lahteine --- Marlin/Configuration.h | 13 +- Marlin/src/core/macros.h | 1 + Marlin/src/gcode/calibrate/G28.cpp | 10 +- Marlin/src/gcode/calibrate/M665.cpp | 26 +-- Marlin/src/inc/Conditionals_LCD.h | 2 +- Marlin/src/inc/Conditionals_post.h | 4 +- Marlin/src/inc/SanityCheck.h | 4 +- Marlin/src/module/delta.cpp | 12 +- Marlin/src/module/motion.cpp | 19 +- Marlin/src/module/motion.h | 14 ++ Marlin/src/module/scara.cpp | 272 +++++++++++++++++++++------- Marlin/src/module/scara.h | 25 ++- 12 files changed, 285 insertions(+), 117 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 46b70eb72d..018c171665 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -58,18 +58,13 @@ */ //=========================================================================== -//============================= DELTA Printer =============================== +//========================== DELTA / SCARA / TPARA ========================== //=========================================================================== -// For a Delta printer, start with one of the configuration files in the config/examples/delta directory -// from https://github.com/MarlinFirmware/Configurations/branches/all and customize for your machine. // - -//=========================================================================== -//============================= SCARA Printer =============================== -//=========================================================================== -// For a SCARA printer, start with one of the configuration files in the config/examples/SCARA directory -// from https://github.com/MarlinFirmware/Configurations/branches/all and customize for your machine. +// Download configurations from the link above and customize for your machine. +// Examples are located in config/examples/delta, .../SCARA, and .../TPARA. // +//=========================================================================== // @section info diff --git a/Marlin/src/core/macros.h b/Marlin/src/core/macros.h index 9b07af3618..d7043ba523 100644 --- a/Marlin/src/core/macros.h +++ b/Marlin/src/core/macros.h @@ -104,6 +104,7 @@ #define RADIANS(d) ((d)*float(M_PI)/180.0f) #define DEGREES(r) ((r)*180.0f/float(M_PI)) #define HYPOT2(x,y) (sq(x)+sq(y)) +#define NORMSQ(x,y,z) (sq(x)+sq(y)+sq(z)) #define CIRCLE_AREA(R) (float(M_PI) * sq(float(R))) #define CIRCLE_CIRC(R) (2 * float(M_PI) * float(R)) diff --git a/Marlin/src/gcode/calibrate/G28.cpp b/Marlin/src/gcode/calibrate/G28.cpp index 430daf6ba2..9470678872 100644 --- a/Marlin/src/gcode/calibrate/G28.cpp +++ b/Marlin/src/gcode/calibrate/G28.cpp @@ -311,7 +311,13 @@ void GcodeSuite::G28() { TERN_(IMPROVE_HOMING_RELIABILITY, end_slow_homing(slow_homing)); - #else // NOT DELTA + #elif ENABLED(AXEL_TPARA) + + constexpr bool doZ = true; // for NANODLP_Z_SYNC if your DLP is on a TPARA + + home_TPARA(); + + #else const bool homeZ = parser.seen('Z'), needX = homeZ && TERN0(Z_SAFE_HOMING, axes_should_home(_BV(X_AXIS))), @@ -392,7 +398,7 @@ void GcodeSuite::G28() { sync_plan_position(); - #endif // !DELTA (G28) + #endif /** * Preserve DXC mode across a G28 for IDEX printers in DXC_DUPLICATION_MODE. diff --git a/Marlin/src/gcode/calibrate/M665.cpp b/Marlin/src/gcode/calibrate/M665.cpp index 557204cc11..3eac54f266 100644 --- a/Marlin/src/gcode/calibrate/M665.cpp +++ b/Marlin/src/gcode/calibrate/M665.cpp @@ -40,21 +40,21 @@ * X = Alpha (Tower 1) angle trim * Y = Beta (Tower 2) angle trim * Z = Gamma (Tower 3) angle trim - * A = Alpha (Tower 1) digonal rod trim - * B = Beta (Tower 2) digonal rod trim - * C = Gamma (Tower 3) digonal rod trim + * A = Alpha (Tower 1) diagonal rod trim + * B = Beta (Tower 2) diagonal rod trim + * C = Gamma (Tower 3) diagonal rod trim */ void GcodeSuite::M665() { - if (parser.seen('H')) delta_height = parser.value_linear_units(); - if (parser.seen('L')) delta_diagonal_rod = parser.value_linear_units(); - if (parser.seen('R')) delta_radius = parser.value_linear_units(); - if (parser.seen('S')) delta_segments_per_second = parser.value_float(); - if (parser.seen('X')) delta_tower_angle_trim.a = parser.value_float(); - if (parser.seen('Y')) delta_tower_angle_trim.b = parser.value_float(); - if (parser.seen('Z')) delta_tower_angle_trim.c = parser.value_float(); - if (parser.seen('A')) delta_diagonal_rod_trim.a = parser.value_float(); - if (parser.seen('B')) delta_diagonal_rod_trim.b = parser.value_float(); - if (parser.seen('C')) delta_diagonal_rod_trim.c = parser.value_float(); + if (parser.seenval('H')) delta_height = parser.value_linear_units(); + if (parser.seenval('L')) delta_diagonal_rod = parser.value_linear_units(); + if (parser.seenval('R')) delta_radius = parser.value_linear_units(); + if (parser.seenval('S')) delta_segments_per_second = parser.value_float(); + if (parser.seenval('X')) delta_tower_angle_trim.a = parser.value_float(); + if (parser.seenval('Y')) delta_tower_angle_trim.b = parser.value_float(); + if (parser.seenval('Z')) delta_tower_angle_trim.c = parser.value_float(); + if (parser.seenval('A')) delta_diagonal_rod_trim.a = parser.value_float(); + if (parser.seenval('B')) delta_diagonal_rod_trim.b = parser.value_float(); + if (parser.seenval('C')) delta_diagonal_rod_trim.c = parser.value_float(); recalc_delta_settings(); } diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index c8b683ecf9..4931c767b8 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -924,7 +924,7 @@ #define NORMAL_AXIS Z_AXIS #endif -#if ENABLED(MORGAN_SCARA) +#if EITHER(MORGAN_SCARA, AXEL_TPARA) #define IS_SCARA 1 #define IS_KINEMATIC 1 #elif ENABLED(DELTA) diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index c800a52fb8..be04341200 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -143,7 +143,9 @@ */ #if IS_SCARA #undef SLOWDOWN - #define QUICK_HOME + #if DISABLED(AXEL_TPARA) + #define QUICK_HOME + #endif #define SCARA_PRINTABLE_RADIUS (SCARA_LINKAGE_1 + SCARA_LINKAGE_2) #endif diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 3f7931e0b6..ca09fad054 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -1227,8 +1227,8 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS /** * Allow only one kinematic type to be defined */ -#if MANY(DELTA, MORGAN_SCARA, COREXY, COREXZ, COREYZ, COREYX, COREZX, COREZY, MARKFORGED_XY) - #error "Please enable only one of DELTA, MORGAN_SCARA, COREXY, COREYX, COREXZ, COREZX, COREYZ, COREZY, or MARKFORGED_XY." +#if MANY(DELTA, MORGAN_SCARA, AXEL_TPARA, COREXY, COREXZ, COREYZ, COREYX, COREZX, COREZY, MARKFORGED_XY) + #error "Please enable only one of DELTA, MORGAN_SCARA, AXEL_TPARA, COREXY, COREYX, COREXZ, COREZX, COREYZ, COREZY, or MARKFORGED_XY." #endif /** diff --git a/Marlin/src/module/delta.cpp b/Marlin/src/module/delta.cpp index 93238a69e3..565c676823 100644 --- a/Marlin/src/module/delta.cpp +++ b/Marlin/src/module/delta.cpp @@ -242,9 +242,9 @@ void home_delta() { // Disable stealthChop if used. Enable diag1 pin on driver. #if ENABLED(SENSORLESS_HOMING) - TERN_(X_SENSORLESS, sensorless_t stealth_states_x = start_sensorless_homing_per_axis(X_AXIS)); - TERN_(Y_SENSORLESS, sensorless_t stealth_states_y = start_sensorless_homing_per_axis(Y_AXIS)); - TERN_(Z_SENSORLESS, sensorless_t stealth_states_z = start_sensorless_homing_per_axis(Z_AXIS)); + TERN_(X_SENSORLESS, sensorless_t stealth_states_x = start_sensorless_homing_per_axis(X_AXIS)); + TERN_(Y_SENSORLESS, sensorless_t stealth_states_y = start_sensorless_homing_per_axis(Y_AXIS)); + TERN_(Z_SENSORLESS, sensorless_t stealth_states_z = start_sensorless_homing_per_axis(Z_AXIS)); #endif // Move all carriages together linearly until an endstop is hit. @@ -254,9 +254,9 @@ void home_delta() { // Re-enable stealthChop if used. Disable diag1 pin on driver. #if ENABLED(SENSORLESS_HOMING) - TERN_(X_SENSORLESS, end_sensorless_homing_per_axis(X_AXIS, stealth_states_x)); - TERN_(Y_SENSORLESS, end_sensorless_homing_per_axis(Y_AXIS, stealth_states_y)); - TERN_(Z_SENSORLESS, end_sensorless_homing_per_axis(Z_AXIS, stealth_states_z)); + TERN_(X_SENSORLESS, end_sensorless_homing_per_axis(X_AXIS, stealth_states_x)); + TERN_(Y_SENSORLESS, end_sensorless_homing_per_axis(Y_AXIS, stealth_states_y)); + TERN_(Z_SENSORLESS, end_sensorless_homing_per_axis(Z_AXIS, stealth_states_z)); #endif endstops.validate_homing_move(); diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index 6fff80ff74..7b4d1e36b3 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -267,11 +267,15 @@ void get_cartesian_from_steppers() { #else #if IS_SCARA forward_kinematics_SCARA( - planner.get_axis_position_degrees(A_AXIS), - planner.get_axis_position_degrees(B_AXIS) + planner.get_axis_position_degrees(A_AXIS) + , planner.get_axis_position_degrees(B_AXIS) + #if ENABLED(AXEL_TPARA) + , planner.get_axis_position_degrees(C_AXIS) + #endif ); #else - cartes.set(planner.get_axis_position_mm(X_AXIS), planner.get_axis_position_mm(Y_AXIS)); + cartes.x = planner.get_axis_position_mm(X_AXIS); + cartes.y = planner.get_axis_position_mm(Y_AXIS); #endif cartes.z = planner.get_axis_position_mm(Z_AXIS); #endif @@ -1340,7 +1344,7 @@ void prepare_line_to_destination() { TERN_(SENSORLESS_HOMING, stealth_states = start_sensorless_homing_per_axis(axis)); } - #if IS_SCARA + #if EITHER(MORGAN_SCARA, MP_SCARA) // Tell the planner the axis is at 0 current_position[axis] = 0; sync_plan_position(); @@ -1490,7 +1494,7 @@ void prepare_line_to_destination() { void homeaxis(const AxisEnum axis) { - #if IS_SCARA + #if EITHER(MORGAN_SCARA, MP_SCARA) // Only Z homing (with probe) is permitted if (axis != Z_AXIS) { BUZZ(100, 880); return; } #else @@ -1732,7 +1736,8 @@ void prepare_line_to_destination() { TERN_(Z_MULTI_ENDSTOPS, case Z_AXIS:) stepper.set_separate_multi_axis(false); } - #endif + + #endif // HAS_EXTRA_ENDSTOPS #ifdef TMC_HOME_PHASE // move back to homing phase if configured and capable @@ -1839,7 +1844,7 @@ void set_axis_is_at_home(const AxisEnum axis) { } #endif - #if ENABLED(MORGAN_SCARA) + #if EITHER(MORGAN_SCARA, AXEL_TPARA) scara_set_axis_is_at_home(axis); #elif ENABLED(DELTA) current_position[axis] = (axis == Z_AXIS) ? delta_height - TERN0(HAS_BED_PROBE, probe.offset.z) : base_home_pos(axis); diff --git a/Marlin/src/module/motion.h b/Marlin/src/module/motion.h index f784c7bf80..0328d015a4 100644 --- a/Marlin/src/module/motion.h +++ b/Marlin/src/module/motion.h @@ -395,8 +395,21 @@ FORCE_INLINE bool all_axes_trusted() { return xyz_bits == // Return true if the given point is within the printable area inline bool position_is_reachable(const float &rx, const float &ry, const float inset=0) { #if ENABLED(DELTA) + return HYPOT2(rx, ry) <= sq(DELTA_PRINTABLE_RADIUS - inset + fslop); + + #elif ENABLED(AXEL_TPARA) + + const float R2 = HYPOT2(rx - TPARA_OFFSET_X, ry - TPARA_OFFSET_Y); + return ( + R2 <= sq(L1 + L2) - inset + #if MIDDLE_DEAD_ZONE_R > 0 + && R2 >= sq(float(MIDDLE_DEAD_ZONE_R)) + #endif + ); + #elif IS_SCARA + const float R2 = HYPOT2(rx - SCARA_OFFSET_X, ry - SCARA_OFFSET_Y); return ( R2 <= sq(L1 + L2) - inset @@ -404,6 +417,7 @@ FORCE_INLINE bool all_axes_trusted() { return xyz_bits == && R2 >= sq(float(MIDDLE_DEAD_ZONE_R)) #endif ); + #endif } diff --git a/Marlin/src/module/scara.cpp b/Marlin/src/module/scara.cpp index 565a502d5b..a8a3acf0f8 100644 --- a/Marlin/src/module/scara.cpp +++ b/Marlin/src/module/scara.cpp @@ -32,26 +32,29 @@ #include "motion.h" #include "planner.h" -float delta_segments_per_second = SCARA_SEGMENTS_PER_SECOND; +#if ENABLED(AXEL_TPARA) + // For homing, as in delta + #include "planner.h" + #include "endstops.h" + #include "../lcd/marlinui.h" + #include "../MarlinCore.h" +#endif + +float delta_segments_per_second = TERN(AXEL_TPARA, TPARA_SEGMENTS_PER_SECOND, SCARA_SEGMENTS_PER_SECOND); void scara_set_axis_is_at_home(const AxisEnum axis) { if (axis == Z_AXIS) current_position.z = Z_HOME_POS; else { - - /** - * SCARA homes XY at the same time - */ xyz_pos_t homeposition; LOOP_XYZ(i) homeposition[i] = base_home_pos((AxisEnum)i); - #if ENABLED(MORGAN_SCARA) // MORGAN_SCARA uses arm angles for AB home position //DEBUG_ECHOLNPAIR("homeposition A:", homeposition.a, " B:", homeposition.b); inverse_kinematics(homeposition); forward_kinematics_SCARA(delta.a, delta.b); current_position[axis] = cartes[axis]; - #else + #elif ENABLED(MP_SCARA) // MP_SCARA uses a Cartesian XY home position //DEBUG_ECHOPGM("homeposition"); //DEBUG_ECHOLNPAIR_P(SP_X_LBL, homeposition.x, SP_Y_LBL, homeposition.y); @@ -59,6 +62,12 @@ void scara_set_axis_is_at_home(const AxisEnum axis) { delta.b = SCARA_OFFSET_THETA2; forward_kinematics_SCARA(delta.a, delta.b); current_position[axis] = cartes[axis]; + #elif ENABLED(AXEL_TPARA) + //DEBUG_ECHOPGM("homeposition"); + //DEBUG_ECHOLNPAIR_P(SP_X_LBL, homeposition.x, SP_Y_LBL, homeposition.y, SP_Z_LBL, homeposition.z); + inverse_kinematics(homeposition); + forward_kinematics_TPARA(delta.a, delta.b, delta.c); + current_position[axis] = cartes[axis]; #endif //DEBUG_ECHOPGM("Cartesian"); @@ -67,85 +76,210 @@ void scara_set_axis_is_at_home(const AxisEnum axis) { } } -static constexpr xy_pos_t scara_offset = { SCARA_OFFSET_X, SCARA_OFFSET_Y }; +#if EITHER(MORGAN_SCARA, MP_SCARA) -/** - * Morgan SCARA Forward Kinematics. Results in 'cartes'. - * Maths and first version by QHARLEY. - * Integrated into Marlin and slightly restructured by Joachim Cerny. - */ -void forward_kinematics_SCARA(const float &a, const float &b) { + static constexpr xy_pos_t scara_offset = { SCARA_OFFSET_X, SCARA_OFFSET_Y }; - const float a_sin = sin(RADIANS(a)) * L1, - a_cos = cos(RADIANS(a)) * L1, - b_sin = sin(RADIANS(b + TERN0(MP_SCARA, a))) * L2, - b_cos = cos(RADIANS(b + TERN0(MP_SCARA, a))) * L2; + /** + * Morgan SCARA Forward Kinematics. Results in 'cartes'. + * Maths and first version by QHARLEY. + * Integrated into Marlin and slightly restructured by Joachim Cerny. + */ + void forward_kinematics_SCARA(const float &a, const float &b) { + const float a_sin = sin(RADIANS(a)) * L1, + a_cos = cos(RADIANS(a)) * L1, + b_sin = sin(RADIANS(b + TERN0(MP_SCARA, a))) * L2, + b_cos = cos(RADIANS(b + TERN0(MP_SCARA, a))) * L2; - cartes.set(a_cos + b_cos + scara_offset.x, // theta - a_sin + b_sin + scara_offset.y); // phi + cartes.x = a_cos + b_cos + scara_offset.x; // theta + cartes.y = a_sin + b_sin + scara_offset.y; // phi - /* - DEBUG_ECHOLNPAIR( - "SCARA FK Angle a=", a, - " b=", b, - " a_sin=", a_sin, - " a_cos=", a_cos, - " b_sin=", b_sin, - " b_cos=", b_cos - ); - DEBUG_ECHOLNPAIR(" cartes (X,Y) = "(cartes.x, ", ", cartes.y, ")"); - //*/ -} + /* + DEBUG_ECHOLNPAIR( + "SCARA FK Angle a=", a, + " b=", b, + " a_sin=", a_sin, + " a_cos=", a_cos, + " b_sin=", b_sin, + " b_cos=", b_cos + ); + DEBUG_ECHOLNPAIR(" cartes (X,Y) = "(cartes.x, ", ", cartes.y, ")"); + //*/ + } -/** - * SCARA Inverse Kinematics. Results in 'delta'. - * - * See https://reprap.org/forum/read.php?185,283327 - * - * Maths and first version by QHARLEY. - * Integrated into Marlin and slightly restructured by Joachim Cerny. - */ -void inverse_kinematics(const xyz_pos_t &raw) { - float C2, S2, SK1, SK2, THETA, PSI; + /** + * Morgan SCARA Inverse Kinematics. Results are stored in 'delta'. + * + * See https://reprap.org/forum/read.php?185,283327 + * + * Maths and first version by QHARLEY. + * Integrated into Marlin and slightly restructured by Joachim Cerny. + */ + void inverse_kinematics(const xyz_pos_t &raw) { + float C2, S2, SK1, SK2, THETA, PSI; - // Translate SCARA to standard XY with scaling factor - const xy_pos_t spos = raw - scara_offset; + // Translate SCARA to standard XY with scaling factor + const xy_pos_t spos = raw - scara_offset; - const float H2 = HYPOT2(spos.x, spos.y); - if (L1 == L2) - C2 = H2 / L1_2_2 - 1; - else - C2 = (H2 - (L1_2 + L2_2)) / (2.0f * L1 * L2); + const float H2 = HYPOT2(spos.x, spos.y); + if (L1 == L2) + C2 = H2 / L1_2_2 - 1; + else + C2 = (H2 - (L1_2 + L2_2)) / (2.0f * L1 * L2); - LIMIT(C2, -1, 1); + LIMIT(C2, -1, 1); - S2 = SQRT(1.0f - sq(C2)); + S2 = SQRT(1.0f - sq(C2)); - // Unrotated Arm1 plus rotated Arm2 gives the distance from Center to End - SK1 = L1 + L2 * C2; + // Unrotated Arm1 plus rotated Arm2 gives the distance from Center to End + SK1 = L1 + L2 * C2; - // Rotated Arm2 gives the distance from Arm1 to Arm2 - SK2 = L2 * S2; + // Rotated Arm2 gives the distance from Arm1 to Arm2 + SK2 = L2 * S2; - // Angle of Arm1 is the difference between Center-to-End angle and the Center-to-Elbow - THETA = ATAN2(SK1, SK2) - ATAN2(spos.x, spos.y); + // Angle of Arm1 is the difference between Center-to-End angle and the Center-to-Elbow + THETA = ATAN2(SK1, SK2) - ATAN2(spos.x, spos.y); - // Angle of Arm2 - PSI = ATAN2(S2, C2); + // Angle of Arm2 + PSI = ATAN2(S2, C2); - delta.set(DEGREES(THETA), DEGREES(PSI + TERN0(MORGAN_SCARA, THETA)), raw.z); + delta.set(DEGREES(THETA), DEGREES(PSI + TERN0(MORGAN_SCARA, THETA)), raw.z); - /* - DEBUG_POS("SCARA IK", raw); - DEBUG_POS("SCARA IK", delta); - DEBUG_ECHOLNPAIR(" SCARA (x,y) ", sx, ",", sy, " C2=", C2, " S2=", S2, " Theta=", THETA, " Psi=", PSI); - //*/ -} + /* + DEBUG_POS("SCARA IK", raw); + DEBUG_POS("SCARA IK", delta); + DEBUG_ECHOLNPAIR(" SCARA (x,y) ", sx, ",", sy, " C2=", C2, " S2=", S2, " Theta=", THETA, " Psi=", PSI); + //*/ + } + +#elif ENABLED(MP_SCARA) + + void inverse_kinematics(const xyz_pos_t &raw) { + const float x = raw.x, y = raw.y, c = HYPOT(x, y), + THETA3 = ATAN2(y, x), + THETA1 = THETA3 + ACOS((sq(c) + sq(L1) - sq(L2)) / (2.0f * c * L1)), + THETA2 = THETA3 - ACOS((sq(c) + sq(L2) - sq(L1)) / (2.0f * c * L2)); + + delta.set(DEGREES(THETA1), DEGREES(THETA2), raw.z); + + /* + DEBUG_POS("SCARA IK", raw); + DEBUG_POS("SCARA IK", delta); + SERIAL_ECHOLNPAIR(" SCARA (x,y) ", x, ",", y," Theta1=", THETA1, " Theta2=", THETA2); + //*/ + } + +#elif ENABLED(AXEL_TPARA) + + static constexpr xyz_pos_t robot_offset = { TPARA_OFFSET_X, TPARA_OFFSET_Y, TPARA_OFFSET_Z }; + + // Convert ABC inputs in degrees to XYZ outputs in mm + void forward_kinematics_TPARA(const float &a, const float &b, const float &c) { + const float w = c - b, + r = L1 * cos(RADIANS(b)) + L2 * sin(RADIANS(w - (90 - b))), + x = r * cos(RADIANS(a)), + y = r * sin(RADIANS(a)), + rho2 = L1_2 + L2_2 - 2.0f * L1 * L2 * cos(RADIANS(w)); + + cartes = robot_offset + xyz_pos_t({ x, y, SQRT(rho2 - x * x - y * y) }); + } + + // Home YZ together, then X (or all at once). Based on quick_home_xy & home_delta + void home_TPARA() { + // Init the current position of all carriages to 0,0,0 + current_position.reset(); + destination.reset(); + sync_plan_position(); + + // Disable stealthChop if used. Enable diag1 pin on driver. + #if ENABLED(SENSORLESS_HOMING) + TERN_(X_SENSORLESS, sensorless_t stealth_states_x = start_sensorless_homing_per_axis(X_AXIS)); + TERN_(Y_SENSORLESS, sensorless_t stealth_states_y = start_sensorless_homing_per_axis(Y_AXIS)); + TERN_(Z_SENSORLESS, sensorless_t stealth_states_z = start_sensorless_homing_per_axis(Z_AXIS)); + #endif + + // const int x_axis_home_dir = x_home_dir(active_extruder); + + // const xy_pos_t pos { max_length(X_AXIS) , max_length(Y_AXIS) }; + // const float mlz = max_length(X_AXIS), + + // Move all carriages together linearly until an endstop is hit. + //do_blocking_move_to_xy_z(pos, mlz, homing_feedrate(Z_AXIS)); + + current_position.x = 0 ; + current_position.y = 0 ; + current_position.z = max_length(Z_AXIS) ; + line_to_current_position(homing_feedrate(Z_AXIS)); + planner.synchronize(); + + // Re-enable stealthChop if used. Disable diag1 pin on driver. + #if ENABLED(SENSORLESS_HOMING) + TERN_(X_SENSORLESS, end_sensorless_homing_per_axis(X_AXIS, stealth_states_x)); + TERN_(Y_SENSORLESS, end_sensorless_homing_per_axis(Y_AXIS, stealth_states_y)); + TERN_(Z_SENSORLESS, end_sensorless_homing_per_axis(Z_AXIS, stealth_states_z)); + #endif + + endstops.validate_homing_move(); + + // At least one motor has reached its endstop. + // Now re-home each motor separately. + homeaxis(A_AXIS); + homeaxis(C_AXIS); + homeaxis(B_AXIS); + + + // Set all carriages to their home positions + // Do this here all at once for Delta, because + // XYZ isn't ABC. Applying this per-tower would + // give the impression that they are the same. + LOOP_XYZ(i) set_axis_is_at_home((AxisEnum)i); + + sync_plan_position(); + } + + void inverse_kinematics(const xyz_pos_t &raw) { + const xyz_pos_t spos = raw - robot_offset; + + const float RXY = SQRT(HYPOT2(spos.x, spos.y)), + RHO2 = NORMSQ(spos.x, spos.y, spos.z), + //RHO = SQRT(RHO2), + LSS = L1_2 + L2_2, + LM = 2.0f * L1 * L2, + + CG = (LSS - RHO2) / LM, + SG = SQRT(1 - POW(CG, 2)), // Method 2 + K1 = L1 - L2 * CG, + K2 = L2 * SG, + + // Angle of Body Joint + THETA = ATAN2(spos.y, spos.x), + + // Angle of Elbow Joint + //GAMMA = ACOS(CG), + GAMMA = ATAN2(SG, CG), // Method 2 + + // Angle of Shoulder Joint, elevation angle measured from horizontal (r+) + //PHI = asin(spos.z/RHO) + asin(L2 * sin(GAMMA) / RHO), + PHI = ATAN2(spos.z, RXY) + ATAN2(K2, K1), // Method 2 + + // Elbow motor angle measured from horizontal, same frame as shoulder (r+) + PSI = PHI + GAMMA; + + delta.set(DEGREES(THETA), DEGREES(PHI), DEGREES(PSI)); + + //SERIAL_ECHOLNPAIR(" SCARA (x,y,z) ", spos.x , ",", spos.y, ",", spos.z, " Rho=", RHO, " Rho2=", RHO2, " Theta=", THETA, " Phi=", PHI, " Psi=", PSI, " Gamma=", GAMMA); + } + +#endif void scara_report_positions() { - SERIAL_ECHOLNPAIR( - "SCARA Theta:", planner.get_axis_position_degrees(A_AXIS), - " Psi" TERN_(MORGAN_SCARA, "+Theta") ":", planner.get_axis_position_degrees(B_AXIS) + SERIAL_ECHOLNPAIR("SCARA Theta:", planner.get_axis_position_degrees(A_AXIS) + #if ENABLED(AXEL_TPARA) + , " Phi:", planner.get_axis_position_degrees(B_AXIS) + , " Psi:", planner.get_axis_position_degrees(C_AXIS) + #else + , " Psi" TERN_(MORGAN_SCARA, "+Theta") ":", planner.get_axis_position_degrees(B_AXIS) + #endif ); SERIAL_EOL(); } diff --git a/Marlin/src/module/scara.h b/Marlin/src/module/scara.h index e2acaf3082..d462842b57 100644 --- a/Marlin/src/module/scara.h +++ b/Marlin/src/module/scara.h @@ -29,14 +29,25 @@ extern float delta_segments_per_second; -// Float constants for SCARA calculations -float constexpr L1 = SCARA_LINKAGE_1, L2 = SCARA_LINKAGE_2, - L1_2 = sq(float(L1)), L1_2_2 = 2.0 * L1_2, - L2_2 = sq(float(L2)); +#if ENABLED(AXEL_TPARA) -void scara_set_axis_is_at_home(const AxisEnum axis); + float constexpr L1 = TPARA_LINKAGE_1, L2 = TPARA_LINKAGE_2, // Float constants for Robot arm calculations + L1_2 = sq(float(L1)), L1_2_2 = 2.0 * L1_2, + L2_2 = sq(float(L2)); + + void forward_kinematics_TPARA(const float &a, const float &b, const float &c); + void home_TPARA(); + +#else + + float constexpr L1 = SCARA_LINKAGE_1, L2 = SCARA_LINKAGE_2, // Float constants for SCARA calculations + L1_2 = sq(float(L1)), L1_2_2 = 2.0 * L1_2, + L2_2 = sq(float(L2)); + + void forward_kinematics_SCARA(const float &a, const float &b); + +#endif void inverse_kinematics(const xyz_pos_t &raw); -void forward_kinematics_SCARA(const float &a, const float &b); - +void scara_set_axis_is_at_home(const AxisEnum axis); void scara_report_positions(); From dd388aedfda25796c86b532605b26b1e598ce410 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 3 Mar 2021 17:57:24 -0600 Subject: [PATCH 082/253] TPARA followup --- Marlin/src/gcode/scara/M360-M364.cpp | 2 +- Marlin/src/module/delta.cpp | 2 +- Marlin/src/module/delta.h | 6 ++--- Marlin/src/module/motion.cpp | 6 ++--- Marlin/src/module/scara.cpp | 37 ++++++++++++++-------------- Marlin/src/module/scara.h | 4 +-- 6 files changed, 29 insertions(+), 28 deletions(-) diff --git a/Marlin/src/gcode/scara/M360-M364.cpp b/Marlin/src/gcode/scara/M360-M364.cpp index 562beee4f9..f32fa09de0 100644 --- a/Marlin/src/gcode/scara/M360-M364.cpp +++ b/Marlin/src/gcode/scara/M360-M364.cpp @@ -31,7 +31,7 @@ inline bool SCARA_move_to_cal(const uint8_t delta_a, const uint8_t delta_b) { if (IsRunning()) { - forward_kinematics_SCARA(delta_a, delta_b); + forward_kinematics(delta_a, delta_b); do_blocking_move_to_xy(cartes); return true; } diff --git a/Marlin/src/module/delta.cpp b/Marlin/src/module/delta.cpp index 565c676823..9857b89bf3 100644 --- a/Marlin/src/module/delta.cpp +++ b/Marlin/src/module/delta.cpp @@ -177,7 +177,7 @@ float delta_safe_distance_from_top() { * * The result is stored in the cartes[] array. */ -void forward_kinematics_DELTA(const float &z1, const float &z2, const float &z3) { +void forward_kinematics(const float &z1, const float &z2, const float &z3) { // Create a vector in old coordinates along x axis of new coordinate const float p12[3] = { delta_tower[B_AXIS].x - delta_tower[A_AXIS].x, delta_tower[B_AXIS].y - delta_tower[A_AXIS].y, z2 - z1 }, diff --git a/Marlin/src/module/delta.h b/Marlin/src/module/delta.h index 5e9a78bd86..a974da97c8 100644 --- a/Marlin/src/module/delta.h +++ b/Marlin/src/module/delta.h @@ -120,10 +120,10 @@ float delta_safe_distance_from_top(); * * The result is stored in the cartes[] array. */ -void forward_kinematics_DELTA(const float &z1, const float &z2, const float &z3); +void forward_kinematics(const float &z1, const float &z2, const float &z3); -FORCE_INLINE void forward_kinematics_DELTA(const abc_float_t &point) { - forward_kinematics_DELTA(point.a, point.b, point.c); +FORCE_INLINE void forward_kinematics(const abc_float_t &point) { + forward_kinematics(point.a, point.b, point.c); } void home_delta(); diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index 7b4d1e36b3..024f28dc9f 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -263,10 +263,10 @@ void sync_plan_position_e() { planner.set_e_position_mm(current_position.e); } */ void get_cartesian_from_steppers() { #if ENABLED(DELTA) - forward_kinematics_DELTA(planner.get_axis_positions_mm()); + forward_kinematics(planner.get_axis_positions_mm()); #else #if IS_SCARA - forward_kinematics_SCARA( + forward_kinematics( planner.get_axis_position_degrees(A_AXIS) , planner.get_axis_position_degrees(B_AXIS) #if ENABLED(AXEL_TPARA) @@ -949,7 +949,7 @@ FORCE_INLINE void segment_idle(millis_t &next_idle_ms) { float x_home_pos(const uint8_t extruder) { if (extruder == 0) - return base_home_pos(X_AXIS); + return X_HOME_POS; else /** * In dual carriage mode the extruder offset provides an override of the diff --git a/Marlin/src/module/scara.cpp b/Marlin/src/module/scara.cpp index a8a3acf0f8..7586b8136f 100644 --- a/Marlin/src/module/scara.cpp +++ b/Marlin/src/module/scara.cpp @@ -33,10 +33,7 @@ #include "planner.h" #if ENABLED(AXEL_TPARA) - // For homing, as in delta - #include "planner.h" #include "endstops.h" - #include "../lcd/marlinui.h" #include "../MarlinCore.h" #endif @@ -46,30 +43,35 @@ void scara_set_axis_is_at_home(const AxisEnum axis) { if (axis == Z_AXIS) current_position.z = Z_HOME_POS; else { - xyz_pos_t homeposition; - LOOP_XYZ(i) homeposition[i] = base_home_pos((AxisEnum)i); #if ENABLED(MORGAN_SCARA) // MORGAN_SCARA uses arm angles for AB home position + ab_float_t homeposition = { SCARA_OFFSET_THETA1, SCARA_OFFSET_THETA2 }; //DEBUG_ECHOLNPAIR("homeposition A:", homeposition.a, " B:", homeposition.b); - inverse_kinematics(homeposition); - forward_kinematics_SCARA(delta.a, delta.b); - current_position[axis] = cartes[axis]; #elif ENABLED(MP_SCARA) // MP_SCARA uses a Cartesian XY home position + xyz_pos_t homeposition = { X_HOME_POS, Y_HOME_POS, Z_HOME_POS }; //DEBUG_ECHOPGM("homeposition"); //DEBUG_ECHOLNPAIR_P(SP_X_LBL, homeposition.x, SP_Y_LBL, homeposition.y); - delta.a = SCARA_OFFSET_THETA1; - delta.b = SCARA_OFFSET_THETA2; - forward_kinematics_SCARA(delta.a, delta.b); - current_position[axis] = cartes[axis]; #elif ENABLED(AXEL_TPARA) + xyz_pos_t homeposition = { X_HOME_POS, Y_HOME_POS, Z_HOME_POS }; //DEBUG_ECHOPGM("homeposition"); //DEBUG_ECHOLNPAIR_P(SP_X_LBL, homeposition.x, SP_Y_LBL, homeposition.y, SP_Z_LBL, homeposition.z); - inverse_kinematics(homeposition); - forward_kinematics_TPARA(delta.a, delta.b, delta.c); - current_position[axis] = cartes[axis]; #endif + #if ENABLED(MORGAN_SCARA) + delta = homeposition; + #else + inverse_kinematics(homeposition); + #endif + + #if EITHER(MORGAN_SCARA, MP_SCARA) + forward_kinematics(delta.a, delta.b); + #elif ENABLED(AXEL_TPARA) + forward_kinematics(delta.a, delta.b, delta.c); + #endif + + current_position[axis] = cartes[axis]; + //DEBUG_ECHOPGM("Cartesian"); //DEBUG_ECHOLNPAIR_P(SP_X_LBL, current_position.x, SP_Y_LBL, current_position.y); update_software_endstops(axis); @@ -85,7 +87,7 @@ void scara_set_axis_is_at_home(const AxisEnum axis) { * Maths and first version by QHARLEY. * Integrated into Marlin and slightly restructured by Joachim Cerny. */ - void forward_kinematics_SCARA(const float &a, const float &b) { + void forward_kinematics(const float &a, const float &b) { const float a_sin = sin(RADIANS(a)) * L1, a_cos = cos(RADIANS(a)) * L1, b_sin = sin(RADIANS(b + TERN0(MP_SCARA, a))) * L2, @@ -174,7 +176,7 @@ void scara_set_axis_is_at_home(const AxisEnum axis) { static constexpr xyz_pos_t robot_offset = { TPARA_OFFSET_X, TPARA_OFFSET_Y, TPARA_OFFSET_Z }; // Convert ABC inputs in degrees to XYZ outputs in mm - void forward_kinematics_TPARA(const float &a, const float &b, const float &c) { + void forward_kinematics(const float &a, const float &b, const float &c) { const float w = c - b, r = L1 * cos(RADIANS(b)) + L2 * sin(RADIANS(w - (90 - b))), x = r * cos(RADIANS(a)), @@ -227,7 +229,6 @@ void scara_set_axis_is_at_home(const AxisEnum axis) { homeaxis(C_AXIS); homeaxis(B_AXIS); - // Set all carriages to their home positions // Do this here all at once for Delta, because // XYZ isn't ABC. Applying this per-tower would diff --git a/Marlin/src/module/scara.h b/Marlin/src/module/scara.h index d462842b57..5549e506b0 100644 --- a/Marlin/src/module/scara.h +++ b/Marlin/src/module/scara.h @@ -35,7 +35,7 @@ extern float delta_segments_per_second; L1_2 = sq(float(L1)), L1_2_2 = 2.0 * L1_2, L2_2 = sq(float(L2)); - void forward_kinematics_TPARA(const float &a, const float &b, const float &c); + void forward_kinematics(const float &a, const float &b, const float &c); void home_TPARA(); #else @@ -44,7 +44,7 @@ extern float delta_segments_per_second; L1_2 = sq(float(L1)), L1_2_2 = 2.0 * L1_2, L2_2 = sq(float(L2)); - void forward_kinematics_SCARA(const float &a, const float &b); + void forward_kinematics(const float &a, const float &b); #endif From 81c29ecc7e819ac806899136916f27129f4ca42a Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Thu, 4 Mar 2021 00:17:17 +0000 Subject: [PATCH 083/253] [cron] Bump distribution date (2021-03-04) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 7e72f0fee8..5c7043acbb 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2021-03-03" + #define STRING_DISTRIBUTION_DATE "2021-03-04" #endif /** From 9372aa99af062933332a24131e7648c0afba64af Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 3 Mar 2021 20:41:58 -0600 Subject: [PATCH 084/253] Fix teensy35 tests --- buildroot/tests/teensy35-tests | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/buildroot/tests/teensy35-tests b/buildroot/tests/teensy35-tests index c4d007cd62..c9731665c5 100755 --- a/buildroot/tests/teensy35-tests +++ b/buildroot/tests/teensy35-tests @@ -55,9 +55,9 @@ exec_test $1 $2 "Sled Z Probe with Linear leveling" "$3" # Test MAGNETIC_PARKING_EXTRUDER with LCD # restore_configs -opt_set MOTHERBOARD BOARD_TEENSY35_36 EXTRUDERS 2 TEMP_SENSOR_1 1 SOL0_PIN 29 +opt_set MOTHERBOARD BOARD_TEENSY35_36 EXTRUDERS 2 TEMP_SENSOR_1 1 SOL0_PIN 29 EXTRUDERS 2 opt_enable PARKING_EXTRUDER ULTIMAKERCONTROLLER -exec_test $1 $2 "MAGNETIC_PARKING_EXTRUDER with LCD" "$3" +exec_test $1 $2 "PARKING_EXTRUDER with LCD" "$3" # # Mixing Extruder From 431f6bf3a53f8e20ef6b74e6714d14bb23f70cc7 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 3 Mar 2021 20:48:05 -0600 Subject: [PATCH 085/253] Parking Extruder solenoid fix/cleanup --- Marlin/src/module/tool_change.h | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/Marlin/src/module/tool_change.h b/Marlin/src/module/tool_change.h index 4f88ca7432..5361451c82 100644 --- a/Marlin/src/module/tool_change.h +++ b/Marlin/src/module/tool_change.h @@ -21,8 +21,7 @@ */ #pragma once -#include "../inc/MarlinConfigPre.h" -#include "../core/types.h" +#include "../inc/MarlinConfig.h" //#define DEBUG_TOOLCHANGE_MIGRATION_FEATURE @@ -80,11 +79,7 @@ #if ENABLED(PARKING_EXTRUDER) - #if ENABLED(PARKING_EXTRUDER_SOLENOIDS_INVERT) - #define PE_MAGNET_ON_STATE !PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE - #else - #define PE_MAGNET_ON_STATE PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE - #endif + #define PE_MAGNET_ON_STATE TERN_(PARKING_EXTRUDER_SOLENOIDS_INVERT, !)PARKING_EXTRUDER_SOLENOIDS_PINS_ACTIVE void pe_solenoid_set_pin_state(const uint8_t extruder_num, const uint8_t state); From 0b7e8576147bb3a1b5b6cf6a9c4afcd8ea8958a2 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 3 Mar 2021 20:48:58 -0600 Subject: [PATCH 086/253] Update some py scripts --- .../PlatformIO/scripts/fysetc_cheetah_v20.py | 4 ++ .../PlatformIO/scripts/preflight-checks.py | 68 +++++++++---------- 2 files changed, 38 insertions(+), 34 deletions(-) diff --git a/buildroot/share/PlatformIO/scripts/fysetc_cheetah_v20.py b/buildroot/share/PlatformIO/scripts/fysetc_cheetah_v20.py index 10471d3753..f36d51f972 100644 --- a/buildroot/share/PlatformIO/scripts/fysetc_cheetah_v20.py +++ b/buildroot/share/PlatformIO/scripts/fysetc_cheetah_v20.py @@ -1,3 +1,7 @@ +# +# STM32F401VE_STEVAL.py +# Customizations for env:STM32F401VE_STEVAL +# import os Import("env") diff --git a/buildroot/share/PlatformIO/scripts/preflight-checks.py b/buildroot/share/PlatformIO/scripts/preflight-checks.py index c9bbb42ab9..4c8a00e74c 100644 --- a/buildroot/share/PlatformIO/scripts/preflight-checks.py +++ b/buildroot/share/PlatformIO/scripts/preflight-checks.py @@ -6,41 +6,41 @@ import os,re Import("env") def get_envs_for_board(board): - if board.startswith("BOARD_"): - board = board[6:] - with open(os.path.join("Marlin", "src", "pins", "pins.h"),"r") as f: - board_found = "" - r=re.compile(r"if\s+MB\((.+)\)") - for line in f.readlines(): - mbs = r.findall(line) - if mbs: - board_found = board if board in re.split(r",\s*", mbs[0]) else "" - if board_found and "#include " in line and "env:" in line: - return re.findall(r"env:\w+", line) - return [] + if board.startswith("BOARD_"): + board = board[6:] + with open(os.path.join("Marlin", "src", "pins", "pins.h"),"r") as f: + board_found = "" + r=re.compile(r"if\s+MB\((.+)\)") + for line in f.readlines(): + mbs = r.findall(line) + if mbs: + board_found = board if board in re.split(r",\s*", mbs[0]) else "" + if board_found and "#include " in line and "env:" in line: + return re.findall(r"env:\w+", line) + return [] def check_envs(build_env, base_envs, config): - if build_env in base_envs: - return True - ext = config.get(build_env, 'extends', default=None) - if ext: - if isinstance(ext, str): - return check_envs(ext, base_envs, config) - elif isinstance(ext, list): - for ext_env in ext: - if check_envs(ext_env, base_envs, config): - return True - return False + if build_env in base_envs: + return True + ext = config.get(build_env, 'extends', default=None) + if ext: + if isinstance(ext, str): + return check_envs(ext, base_envs, config) + elif isinstance(ext, list): + for ext_env in ext: + if check_envs(ext_env, base_envs, config): + return True + return False # Sanity checks: if 'PIOENV' not in env: - raise SystemExit("Error: PIOENV is not defined. This script is intended to be used with PlatformIO") + raise SystemExit("Error: PIOENV is not defined. This script is intended to be used with PlatformIO") if 'MARLIN_FEATURES' not in env: - raise SystemExit("Error: this script should be used after common Marlin scripts") + raise SystemExit("Error: this script should be used after common Marlin scripts") if 'MOTHERBOARD' not in env['MARLIN_FEATURES']: - raise SystemExit("Error: MOTHERBOARD is not defined in Configuration.h") + raise SystemExit("Error: MOTHERBOARD is not defined in Configuration.h") build_env = env['PIOENV'] motherboard = env['MARLIN_FEATURES']['MOTHERBOARD'] @@ -49,16 +49,16 @@ config = env.GetProjectConfig() result = check_envs("env:"+build_env, base_envs, config) if not result: - err = "Error: your selected build environment '%s' is not compatible with MOTHERBOARD=%s in Configuration.h. " \ - "Please use one of compatible build environments for this board: %s" % \ - (build_env, motherboard, ",".join([e[4:] for e in base_envs if e.startswith("env:")])) - raise SystemExit(err) + err = "Error: your selected build environment '%s' is not compatible with MOTHERBOARD=%s in Configuration.h. " \ + "Please use one of compatible build environments for this board: %s" % \ + (build_env, motherboard, ",".join([e[4:] for e in base_envs if e.startswith("env:")])) + raise SystemExit(err) # # Check for Config files in two common incorrect places # for p in [ env['PROJECT_DIR'], os.path.join(env['PROJECT_DIR'], "config") ]: - for f in [ "Configuration.h", "Configuration_adv.h" ]: - if os.path.isfile(os.path.join(p, f)): - err = "ERROR: Config files found in directory %s. Please move them into the Marlin subfolder." % p - raise SystemExit(err) + for f in [ "Configuration.h", "Configuration_adv.h" ]: + if os.path.isfile(os.path.join(p, f)): + err = "ERROR: Config files found in directory %s. Please move them into the Marlin subfolder." % p + raise SystemExit(err) From dad486c01b34d78ab3a62b8815a3f9f48406d775 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 4 Mar 2021 03:21:15 -0600 Subject: [PATCH 087/253] MK2_MULTIPLEXER dependency --- platformio.ini | 2 ++ 1 file changed, 2 insertions(+) diff --git a/platformio.ini b/platformio.ini index 157b3d6201..aad59362cc 100644 --- a/platformio.ini +++ b/platformio.ini @@ -111,6 +111,7 @@ default_src_filter = + - - + - - - - + - - - - - - - @@ -342,6 +343,7 @@ POWER_LOSS_RECOVERY = src_filter=+ + + HAS_FILAMENT_SENSOR = src_filter=+ + (EXT|MANUAL)_SOLENOID.* = src_filter=+ + +MK2_MULTIPLEXER = src_filter=+ HAS_CUTTER = src_filter=+ + EXPERIMENTAL_I2CBUS = src_filter=+ + MECHANICAL_GANTRY_CAL.+ = src_filter=+ From 6225870aa917e81c35a910653f0f482998a6e5c7 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 4 Mar 2021 03:15:32 -0600 Subject: [PATCH 088/253] Implement G42, after all --- Marlin/src/gcode/gcode.cpp | 4 ++++ Marlin/src/gcode/gcode_d.cpp | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index d7535dd4ff..428caa5a15 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -364,6 +364,10 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { break; #endif + #if HAS_MESH + case 42: G42(); break; // G42: Coordinated move to a mesh point + #endif + #if ENABLED(CNC_COORDINATE_SYSTEMS) case 53: G53(); break; // G53: (prefix) Apply native workspace case 54: G54(); break; // G54: Switch to Workspace 1 diff --git a/Marlin/src/gcode/gcode_d.cpp b/Marlin/src/gcode/gcode_d.cpp index 805dcd52ce..a683a330f1 100644 --- a/Marlin/src/gcode/gcode_d.cpp +++ b/Marlin/src/gcode/gcode_d.cpp @@ -165,7 +165,7 @@ case 6: // D6 Check delay loop accuracy dump_delay_accuracy_check(); - break; + break; case 100: { // D100 Disable heaters and attempt a hard hang (Watchdog Test) SERIAL_ECHOLNPGM("Disabling heaters and attempting to trigger Watchdog"); From 9299f4e98a95066c232d4657ff6d7c6acbb72fe0 Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Thu, 4 Mar 2021 01:32:02 -0800 Subject: [PATCH 089/253] SMUFF => SMuFF (#21243) --- Marlin/Configuration.h | 4 ++-- Marlin/src/inc/Conditionals_LCD.h | 2 +- Marlin/src/inc/SanityCheck.h | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 018c171665..90ab4d58af 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -163,8 +163,8 @@ * PRUSA_MMU1 : Průša MMU1 (The "multiplexer" version) * PRUSA_MMU2 : Průša MMU2 * PRUSA_MMU2S : Průša MMU2S (Requires MK3S extruder with motion sensor, EXTRUDERS = 5) - * SMUFF_EMU_MMU2 : Technik Gegg SMUFF (Průša MMU2 emulation mode) - * SMUFF_EMU_MMU2S : Technik Gegg SMUFF (Průša MMU2S emulation mode) + * SMUFF_EMU_MMU2 : Technik Gegg SMuFF (Průša MMU2 emulation mode) + * SMUFF_EMU_MMU2S : Technik Gegg SMuFF (Průša MMU2S emulation mode) * * Requires NOZZLE_PARK_FEATURE to park print head in case MMU unit fails. * See additional options in Configuration_adv.h. diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index 4931c767b8..e5f7441e77 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -575,7 +575,7 @@ #undef DISABLE_INACTIVE_EXTRUDER #endif -// Průša MMU1, MMU 2.0, MMUS 2.0 and SMUFF force SINGLENOZZLE +// Průša MMU1, MMU 2.0, MMUS 2.0 and SMuFF force SINGLENOZZLE #if HAS_MMU #define SINGLENOZZLE #endif diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index ca09fad054..4da25d0916 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -919,7 +919,7 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #endif /** - * Multi-Material-Unit 2 / SMUFF requirements + * Multi-Material-Unit 2 / SMuFF requirements */ #if HAS_PRUSA_MMU2 #if EXTRUDERS != 5 From 8dee12ff05fedf183d690e53fa936d4e6987a5f6 Mon Sep 17 00:00:00 2001 From: Oleksii Zelivianskyi <50808386+alexeyzel@users.noreply.github.com> Date: Thu, 4 Mar 2021 11:33:02 +0200 Subject: [PATCH 090/253] Correct fan pins for MKS Robin Nano v3 (#21238) --- Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h index a01081a7df..8308f3998f 100644 --- a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h +++ b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h @@ -165,8 +165,8 @@ #define HEATER_1_PIN PB0 // HEATER2 #define HEATER_BED_PIN PA0 // HOT BED -#define FAN_PIN PB1 // FAN -#define FAN1_PIN PC14 // FAN1 +#define FAN_PIN PC14 // FAN +#define FAN1_PIN PB1 // FAN1 // // Thermocouples From 6903a2ffc50c01d05c761d0b3384bad076e537c1 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 4 Mar 2021 16:36:44 -0600 Subject: [PATCH 091/253] Remove extra G42 --- Marlin/src/gcode/gcode.cpp | 4 ---- 1 file changed, 4 deletions(-) diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index 428caa5a15..e9a6d4aa2a 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -396,10 +396,6 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { case 92: G92(); break; // G92: Set current axis position(s) - #if HAS_MESH - case 42: G42(); break; // G42: Coordinated move to a mesh point - #endif - #if ENABLED(CALIBRATION_GCODE) case 425: G425(); break; // G425: Perform calibration with calibration cube #endif From a0d312396adb089d31b1d4c1379d86dcd5b734ee Mon Sep 17 00:00:00 2001 From: Tanguy Pruvot Date: Fri, 5 Mar 2021 00:34:38 +0100 Subject: [PATCH 092/253] Followup to MP_SCARA/TPARA patches (#21248) --- .../src/feature/bedlevel/ubl/ubl_motion.cpp | 2 +- Marlin/src/gcode/calibrate/M665.cpp | 4 +- Marlin/src/module/delta.cpp | 2 +- Marlin/src/module/delta.h | 2 +- Marlin/src/module/motion.cpp | 2 +- Marlin/src/module/scara.cpp | 101 +++++++++++------- Marlin/src/module/scara.h | 2 +- Marlin/src/module/settings.cpp | 12 +-- 8 files changed, 74 insertions(+), 53 deletions(-) diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp index 8b7cd15a3c..33b4f03ac2 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp @@ -335,7 +335,7 @@ #if IS_KINEMATIC const float seconds = cart_xy_mm / scaled_fr_mm_s; // Duration of XY move at requested rate - uint16_t segments = LROUND(delta_segments_per_second * seconds), // Preferred number of segments for distance @ feedrate + uint16_t segments = LROUND(segments_per_second * seconds), // Preferred number of segments for distance @ feedrate seglimit = LROUND(cart_xy_mm * RECIPROCAL(DELTA_SEGMENT_MIN_LENGTH)); // Number of segments at minimum segment length NOMORE(segments, seglimit); // Limit to minimum segment length (fewer segments) #else diff --git a/Marlin/src/gcode/calibrate/M665.cpp b/Marlin/src/gcode/calibrate/M665.cpp index 3eac54f266..0d0c4146d9 100644 --- a/Marlin/src/gcode/calibrate/M665.cpp +++ b/Marlin/src/gcode/calibrate/M665.cpp @@ -48,7 +48,7 @@ if (parser.seenval('H')) delta_height = parser.value_linear_units(); if (parser.seenval('L')) delta_diagonal_rod = parser.value_linear_units(); if (parser.seenval('R')) delta_radius = parser.value_linear_units(); - if (parser.seenval('S')) delta_segments_per_second = parser.value_float(); + if (parser.seenval('S')) segments_per_second = parser.value_float(); if (parser.seenval('X')) delta_tower_angle_trim.a = parser.value_float(); if (parser.seenval('Y')) delta_tower_angle_trim.b = parser.value_float(); if (parser.seenval('Z')) delta_tower_angle_trim.c = parser.value_float(); @@ -76,7 +76,7 @@ * B, T, and Y are all aliases for the elbow angle */ void GcodeSuite::M665() { - if (parser.seenval('S')) delta_segments_per_second = parser.value_float(); + if (parser.seenval('S')) segments_per_second = parser.value_float(); #if HAS_SCARA_OFFSET diff --git a/Marlin/src/module/delta.cpp b/Marlin/src/module/delta.cpp index 9857b89bf3..a1676b3ba3 100644 --- a/Marlin/src/module/delta.cpp +++ b/Marlin/src/module/delta.cpp @@ -54,7 +54,7 @@ float delta_height; abc_float_t delta_endstop_adj{0}; float delta_radius, delta_diagonal_rod, - delta_segments_per_second; + segments_per_second; abc_float_t delta_tower_angle_trim; xy_float_t delta_tower[ABC]; abc_float_t delta_diagonal_rod_2_tower; diff --git a/Marlin/src/module/delta.h b/Marlin/src/module/delta.h index a974da97c8..9caec53028 100644 --- a/Marlin/src/module/delta.h +++ b/Marlin/src/module/delta.h @@ -32,7 +32,7 @@ extern float delta_height; extern abc_float_t delta_endstop_adj; extern float delta_radius, delta_diagonal_rod, - delta_segments_per_second; + segments_per_second; extern abc_float_t delta_tower_angle_trim; extern xy_float_t delta_tower[ABC]; extern abc_float_t delta_diagonal_rod_2_tower; diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index 024f28dc9f..2f4f5e283a 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -763,7 +763,7 @@ FORCE_INLINE void segment_idle(millis_t &next_idle_ms) { // The number of segments-per-second times the duration // gives the number of segments - uint16_t segments = delta_segments_per_second * seconds; + uint16_t segments = segments_per_second * seconds; // For SCARA enforce a minimum segment size #if IS_SCARA diff --git a/Marlin/src/module/scara.cpp b/Marlin/src/module/scara.cpp index 7586b8136f..1767e230c1 100644 --- a/Marlin/src/module/scara.cpp +++ b/Marlin/src/module/scara.cpp @@ -37,46 +37,7 @@ #include "../MarlinCore.h" #endif -float delta_segments_per_second = TERN(AXEL_TPARA, TPARA_SEGMENTS_PER_SECOND, SCARA_SEGMENTS_PER_SECOND); - -void scara_set_axis_is_at_home(const AxisEnum axis) { - if (axis == Z_AXIS) - current_position.z = Z_HOME_POS; - else { - #if ENABLED(MORGAN_SCARA) - // MORGAN_SCARA uses arm angles for AB home position - ab_float_t homeposition = { SCARA_OFFSET_THETA1, SCARA_OFFSET_THETA2 }; - //DEBUG_ECHOLNPAIR("homeposition A:", homeposition.a, " B:", homeposition.b); - #elif ENABLED(MP_SCARA) - // MP_SCARA uses a Cartesian XY home position - xyz_pos_t homeposition = { X_HOME_POS, Y_HOME_POS, Z_HOME_POS }; - //DEBUG_ECHOPGM("homeposition"); - //DEBUG_ECHOLNPAIR_P(SP_X_LBL, homeposition.x, SP_Y_LBL, homeposition.y); - #elif ENABLED(AXEL_TPARA) - xyz_pos_t homeposition = { X_HOME_POS, Y_HOME_POS, Z_HOME_POS }; - //DEBUG_ECHOPGM("homeposition"); - //DEBUG_ECHOLNPAIR_P(SP_X_LBL, homeposition.x, SP_Y_LBL, homeposition.y, SP_Z_LBL, homeposition.z); - #endif - - #if ENABLED(MORGAN_SCARA) - delta = homeposition; - #else - inverse_kinematics(homeposition); - #endif - - #if EITHER(MORGAN_SCARA, MP_SCARA) - forward_kinematics(delta.a, delta.b); - #elif ENABLED(AXEL_TPARA) - forward_kinematics(delta.a, delta.b, delta.c); - #endif - - current_position[axis] = cartes[axis]; - - //DEBUG_ECHOPGM("Cartesian"); - //DEBUG_ECHOLNPAIR_P(SP_X_LBL, current_position.x, SP_Y_LBL, current_position.y); - update_software_endstops(axis); - } -} +float segments_per_second = TERN(AXEL_TPARA, TPARA_SEGMENTS_PER_SECOND, SCARA_SEGMENTS_PER_SECOND); #if EITHER(MORGAN_SCARA, MP_SCARA) @@ -109,6 +70,27 @@ void scara_set_axis_is_at_home(const AxisEnum axis) { //*/ } +#endif + +#if ENABLED(MORGAN_SCARA) + + void scara_set_axis_is_at_home(const AxisEnum axis) { + if (axis == Z_AXIS) + current_position.z = Z_HOME_POS; + else { + // MORGAN_SCARA uses a Cartesian XY home position + xyz_pos_t homeposition = { X_HOME_POS, Y_HOME_POS, Z_HOME_POS }; + //DEBUG_ECHOLNPAIR_P(PSTR("homeposition X"), homeposition.x, SP_Y_LBL, homeposition.y); + + delta = homeposition; + forward_kinematics(delta.a, delta.b); + current_position[axis] = cartes[axis]; + + //DEBUG_ECHOLNPAIR_P(PSTR("Cartesian X"), current_position.x, SP_Y_LBL, current_position.y); + update_software_endstops(axis); + } + } + /** * Morgan SCARA Inverse Kinematics. Results are stored in 'delta'. * @@ -156,6 +138,29 @@ void scara_set_axis_is_at_home(const AxisEnum axis) { #elif ENABLED(MP_SCARA) + void scara_set_axis_is_at_home(const AxisEnum axis) { + if (axis == Z_AXIS) + current_position.z = Z_HOME_POS; + else { + // MP_SCARA uses arm angles for AB home position + #ifndef SCARA_OFFSET_THETA1 + #define SCARA_OFFSET_THETA1 12 // degrees + #endif + #ifndef SCARA_OFFSET_THETA2 + #define SCARA_OFFSET_THETA2 131 // degrees + #endif + ab_float_t homeposition = { SCARA_OFFSET_THETA1, SCARA_OFFSET_THETA2 }; + //DEBUG_ECHOLNPAIR("homeposition A:", homeposition.a, " B:", homeposition.b); + + inverse_kinematics(homeposition); + forward_kinematics(delta.a, delta.b); + current_position[axis] = cartes[axis]; + + //DEBUG_ECHOLNPAIR_P(PSTR("Cartesian X"), current_position.x, SP_Y_LBL, current_position.y); + update_software_endstops(axis); + } + } + void inverse_kinematics(const xyz_pos_t &raw) { const float x = raw.x, y = raw.y, c = HYPOT(x, y), THETA3 = ATAN2(y, x), @@ -175,6 +180,22 @@ void scara_set_axis_is_at_home(const AxisEnum axis) { static constexpr xyz_pos_t robot_offset = { TPARA_OFFSET_X, TPARA_OFFSET_Y, TPARA_OFFSET_Z }; + void scara_set_axis_is_at_home(const AxisEnum axis) { + if (axis == Z_AXIS) + current_position.z = Z_HOME_POS; + else { + xyz_pos_t homeposition = { X_HOME_POS, Y_HOME_POS, Z_HOME_POS }; + //DEBUG_ECHOLNPAIR_P(PSTR("homeposition X"), homeposition.x, SP_Y_LBL, homeposition.y, SP_Z_LBL, homeposition.z); + + inverse_kinematics(homeposition); + forward_kinematics(delta.a, delta.b, delta.c); + current_position[axis] = cartes[axis]; + + //DEBUG_ECHOLNPAIR_P(PSTR("Cartesian X"), current_position.x, SP_Y_LBL, current_position.y); + update_software_endstops(axis); + } + } + // Convert ABC inputs in degrees to XYZ outputs in mm void forward_kinematics(const float &a, const float &b, const float &c) { const float w = c - b, diff --git a/Marlin/src/module/scara.h b/Marlin/src/module/scara.h index 5549e506b0..d24a4110fd 100644 --- a/Marlin/src/module/scara.h +++ b/Marlin/src/module/scara.h @@ -27,7 +27,7 @@ #include "../core/macros.h" -extern float delta_segments_per_second; +extern float segments_per_second; #if ENABLED(AXEL_TPARA) diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index d78d97e688..c82ed0eb8f 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -279,7 +279,7 @@ typedef struct SettingsDataStruct { abc_float_t delta_endstop_adj; // M666 X Y Z float delta_radius, // M665 R delta_diagonal_rod, // M665 L - delta_segments_per_second; // M665 S + segments_per_second; // M665 S abc_float_t delta_tower_angle_trim, // M665 X Y Z delta_diagonal_rod_trim; // M665 A B C #elif HAS_EXTRA_ENDSTOPS @@ -840,7 +840,7 @@ void MarlinSettings::postprocess() { EEPROM_WRITE(delta_endstop_adj); // 3 floats EEPROM_WRITE(delta_radius); // 1 float EEPROM_WRITE(delta_diagonal_rod); // 1 float - EEPROM_WRITE(delta_segments_per_second); // 1 float + EEPROM_WRITE(segments_per_second); // 1 float EEPROM_WRITE(delta_tower_angle_trim); // 3 floats EEPROM_WRITE(delta_diagonal_rod_trim); // 3 floats @@ -1721,7 +1721,7 @@ void MarlinSettings::postprocess() { EEPROM_READ(delta_endstop_adj); // 3 floats EEPROM_READ(delta_radius); // 1 float EEPROM_READ(delta_diagonal_rod); // 1 float - EEPROM_READ(delta_segments_per_second); // 1 float + EEPROM_READ(segments_per_second); // 1 float EEPROM_READ(delta_tower_angle_trim); // 3 floats EEPROM_READ(delta_diagonal_rod_trim); // 3 floats @@ -2711,7 +2711,7 @@ void MarlinSettings::reset() { delta_endstop_adj = adj; delta_radius = DELTA_RADIUS; delta_diagonal_rod = DELTA_DIAGONAL_ROD; - delta_segments_per_second = DELTA_SEGMENTS_PER_SECOND; + segments_per_second = DELTA_SEGMENTS_PER_SECOND; delta_tower_angle_trim = dta; delta_diagonal_rod_trim = ddr; #endif @@ -3320,7 +3320,7 @@ void MarlinSettings::reset() { CONFIG_ECHO_HEADING("SCARA settings: S P T"); CONFIG_ECHO_START(); SERIAL_ECHOLNPAIR_P( - PSTR(" M665 S"), delta_segments_per_second + PSTR(" M665 S"), segments_per_second , SP_P_STR, scara_home_offset.a , SP_T_STR, scara_home_offset.b , SP_Z_STR, LINEAR_UNIT(scara_home_offset.z) @@ -3342,7 +3342,7 @@ void MarlinSettings::reset() { PSTR(" M665 L"), LINEAR_UNIT(delta_diagonal_rod) , PSTR(" R"), LINEAR_UNIT(delta_radius) , PSTR(" H"), LINEAR_UNIT(delta_height) - , PSTR(" S"), delta_segments_per_second + , PSTR(" S"), segments_per_second , SP_X_STR, LINEAR_UNIT(delta_tower_angle_trim.a) , SP_Y_STR, LINEAR_UNIT(delta_tower_angle_trim.b) , SP_Z_STR, LINEAR_UNIT(delta_tower_angle_trim.c) From 101f09aabde0a903051eab12653b1f7dc042bed4 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Thu, 4 Mar 2021 20:39:08 -0300 Subject: [PATCH 093/253] Fix multi-serial CRC error crash (#21249) --- Marlin/src/gcode/control/M999.cpp | 2 +- Marlin/src/gcode/queue.cpp | 5 ++--- Marlin/src/gcode/queue.h | 2 +- 3 files changed, 4 insertions(+), 5 deletions(-) diff --git a/Marlin/src/gcode/control/M999.cpp b/Marlin/src/gcode/control/M999.cpp index 7487b4cf6e..b7219673a3 100644 --- a/Marlin/src/gcode/control/M999.cpp +++ b/Marlin/src/gcode/control/M999.cpp @@ -41,5 +41,5 @@ void GcodeSuite::M999() { if (parser.boolval('S')) return; - queue.flush_and_request_resend(); + queue.flush_and_request_resend(queue.ring_buffer.command_port()); } diff --git a/Marlin/src/gcode/queue.cpp b/Marlin/src/gcode/queue.cpp index ebf95f86c6..93deac0566 100644 --- a/Marlin/src/gcode/queue.cpp +++ b/Marlin/src/gcode/queue.cpp @@ -262,8 +262,7 @@ void GCodeQueue::RingBuffer::ok_to_send() { * Send a "Resend: nnn" message to the host to * indicate that a command needs to be re-sent. */ -void GCodeQueue::flush_and_request_resend() { - const serial_index_t serial_ind = ring_buffer.command_port(); +void GCodeQueue::flush_and_request_resend(const serial_index_t serial_ind) { #if HAS_MULTI_SERIAL if (serial_ind < 0) return; // Never mind. Command came from SD or Flash Drive PORT_REDIRECT(SERIAL_PORTMASK(serial_ind)); // Reply to the serial port that sent the command @@ -306,7 +305,7 @@ void GCodeQueue::gcode_line_error(PGM_P const err, const serial_index_t serial_i SERIAL_ERROR_START(); SERIAL_ECHOLNPAIR_P(err, serial_state[serial_ind].last_N); while (read_serial(serial_ind) != -1) { /* nada */ } // Clear out the RX buffer. Why don't use flush here ? - flush_and_request_resend(); + flush_and_request_resend(serial_ind); serial_state[serial_ind].count = 0; } diff --git a/Marlin/src/gcode/queue.h b/Marlin/src/gcode/queue.h index 778f9a7f67..7bc3bfdbe5 100644 --- a/Marlin/src/gcode/queue.h +++ b/Marlin/src/gcode/queue.h @@ -185,7 +185,7 @@ public: * Clear the serial line and request a resend of * the next expected line number. */ - static void flush_and_request_resend(); + static void flush_and_request_resend(const serial_index_t serial_ind); /** * (Re)Set the current line number for the last received command From f56929d0df85a7a05b28c06aaf0a45aec286a71f Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Fri, 5 Mar 2021 00:17:19 +0000 Subject: [PATCH 094/253] [cron] Bump distribution date (2021-03-05) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 5c7043acbb..e57a3485d9 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2021-03-04" + #define STRING_DISTRIBUTION_DATE "2021-03-05" #endif /** From 3ea56ba4c72fb1e9c4bb4a896b8cf87361a48f4b Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 5 Mar 2021 04:30:52 -0600 Subject: [PATCH 095/253] Tweak tests, consolidate pins target validation (#21254) --- Marlin/src/pins/esp32/env_validate.h | 26 ++++++++++++ Marlin/src/pins/esp32/pins_E4D.h | 6 +-- Marlin/src/pins/esp32/pins_ESP32.h | 4 +- Marlin/src/pins/esp32/pins_FYSETC_E4.h | 6 +-- Marlin/src/pins/esp32/pins_MRR_ESPA.h | 6 +-- Marlin/src/pins/esp32/pins_MRR_ESPE.h | 6 +-- Marlin/src/pins/lpc1768/env_validate.h | 30 +++++++++++++ Marlin/src/pins/lpc1768/pins_AZSMZ_MINI.h | 4 +- Marlin/src/pins/lpc1768/pins_BIQU_B300_V1.0.h | 4 +- Marlin/src/pins/lpc1768/pins_BIQU_BQ111_A4.h | 4 +- Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h | 6 +-- Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h | 8 +--- Marlin/src/pins/lpc1768/pins_GMARSH_X6_REV1.h | 4 +- Marlin/src/pins/lpc1768/pins_MKS_SBASE.h | 6 +-- Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h | 4 +- Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h | 4 +- Marlin/src/pins/lpc1768/pins_SELENA_COMPACT.h | 4 +- Marlin/src/pins/lpc1769/env_validate.h | 26 ++++++++++++ Marlin/src/pins/lpc1769/pins_AZTEEG_X5_GT.h | 4 +- Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h | 5 +-- .../pins/lpc1769/pins_AZTEEG_X5_MINI_WIFI.h | 6 +-- .../src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h | 2 + .../pins/lpc1769/pins_BTT_SKR_V1_4_TURBO.h | 2 +- .../src/pins/lpc1769/pins_COHESION3D_MINI.h | 4 +- .../src/pins/lpc1769/pins_COHESION3D_REMIX.h | 4 +- Marlin/src/pins/lpc1769/pins_FLY_CDY.h | 4 +- Marlin/src/pins/lpc1769/pins_MKS_SGEN.h | 6 +-- Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h | 4 +- Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h | 4 +- Marlin/src/pins/lpc1769/pins_TH3D_EZBOARD.h | 4 +- Marlin/src/pins/mega/env_validate.h | 30 +++++++++++++ Marlin/src/pins/mega/pins_CHEAPTRONIC.h | 4 +- Marlin/src/pins/mega/pins_CHEAPTRONICv2.h | 4 +- Marlin/src/pins/mega/pins_CNCONTROLS_11.h | 5 +-- Marlin/src/pins/mega/pins_CNCONTROLS_12.h | 5 +-- Marlin/src/pins/mega/pins_CNCONTROLS_15.h | 5 +-- Marlin/src/pins/mega/pins_EINSTART-S.h | 5 +-- Marlin/src/pins/mega/pins_ELEFU_3.h | 4 +- Marlin/src/pins/mega/pins_GT2560_REV_A.h | 5 +-- Marlin/src/pins/mega/pins_GT2560_V3.h | 5 +-- Marlin/src/pins/mega/pins_HJC2560C_REV2.h | 4 +- Marlin/src/pins/mega/pins_INTAMSYS40.h | 4 +- Marlin/src/pins/mega/pins_LEAPFROG.h | 5 +-- Marlin/src/pins/mega/pins_LEAPFROG_XEED2015.h | 4 +- Marlin/src/pins/mega/pins_MEGACONTROLLER.h | 6 +-- Marlin/src/pins/mega/pins_MEGATRONICS.h | 4 +- Marlin/src/pins/mega/pins_MEGATRONICS_2.h | 4 +- Marlin/src/pins/mega/pins_MEGATRONICS_3.h | 4 +- Marlin/src/pins/mega/pins_MIGHTYBOARD_REVE.h | 5 +-- Marlin/src/pins/mega/pins_OVERLORD.h | 6 +-- Marlin/src/pins/mega/pins_PICA.h | 6 +-- Marlin/src/pins/mega/pins_WANHAO_ONEPLUS.h | 4 +- Marlin/src/pins/pins.h | 2 +- Marlin/src/pins/pinsDebug.h | 4 +- Marlin/src/pins/rambo/env_validate.h | 26 ++++++++++++ Marlin/src/pins/rambo/pins_EINSY_RAMBO.h | 4 +- Marlin/src/pins/rambo/pins_EINSY_RETRO.h | 4 +- Marlin/src/pins/rambo/pins_MINIRAMBO.h | 4 +- Marlin/src/pins/rambo/pins_RAMBO.h | 4 +- Marlin/src/pins/rambo/pins_SCOOVO_X9H.h | 4 +- Marlin/src/pins/ramps/env_validate.h | 35 ++++++++++++++++ Marlin/src/pins/ramps/pins_AZTEEG_X3.h | 7 ++-- Marlin/src/pins/ramps/pins_AZTEEG_X3_PRO.h | 7 ++-- Marlin/src/pins/ramps/pins_BQ_ZUM_MEGA_3D.h | 5 +-- .../src/pins/ramps/pins_DUPLICATOR_I3_PLUS.h | 5 +-- Marlin/src/pins/ramps/pins_FORMBOT_RAPTOR.h | 7 ++-- .../src/pins/ramps/pins_FORMBOT_TREX2PLUS.h | 7 ++-- Marlin/src/pins/ramps/pins_FORMBOT_TREX3.h | 7 ++-- Marlin/src/pins/ramps/pins_K8800.h | 4 +- Marlin/src/pins/ramps/pins_LONGER3D_LKx_PRO.h | 10 ++--- Marlin/src/pins/ramps/pins_RAMPS.h | 13 +----- Marlin/src/pins/ramps/pins_RAMPS_OLD.h | 4 +- Marlin/src/pins/ramps/pins_RAMPS_PLUS.h | 4 +- Marlin/src/pins/ramps/pins_RAMPS_S_12.h | 7 +--- Marlin/src/pins/ramps/pins_RUMBA.h | 7 ++-- Marlin/src/pins/ramps/pins_TENLOG_D3_HERO.h | 7 ++-- Marlin/src/pins/ramps/pins_TRONXY_V3_1_0.h | 7 ++-- Marlin/src/pins/ramps/pins_TT_OSCAR.h | 4 +- Marlin/src/pins/ramps/pins_ULTIMAIN_2.h | 5 +-- Marlin/src/pins/ramps/pins_ULTIMAKER.h | 4 +- Marlin/src/pins/ramps/pins_ULTIMAKER_OLD.h | 4 +- Marlin/src/pins/ramps/pins_Z_BOLT_X_SERIES.h | 7 ++-- Marlin/src/pins/sam/env_validate.h | 33 +++++++++++++++ Marlin/src/pins/sam/pins_ADSK.h | 6 +-- Marlin/src/pins/sam/pins_ALLIGATOR_R2.h | 4 +- Marlin/src/pins/sam/pins_CNCONTROLS_15D.h | 4 +- Marlin/src/pins/sam/pins_DUE3DOM.h | 4 +- Marlin/src/pins/sam/pins_DUE3DOM_MINI.h | 4 +- Marlin/src/pins/sam/pins_PRINTRBOARD_G2.h | 4 +- Marlin/src/pins/sam/pins_RADDS.h | 4 +- Marlin/src/pins/sam/pins_RAMPS4DUE.h | 7 +--- Marlin/src/pins/sam/pins_RAMPS_DUO.h | 7 +--- Marlin/src/pins/sam/pins_RAMPS_FD_V1.h | 4 +- Marlin/src/pins/sam/pins_RAMPS_SMART.h | 6 +-- Marlin/src/pins/sam/pins_RURAMPS4D_11.h | 4 +- Marlin/src/pins/sam/pins_RURAMPS4D_13.h | 4 +- Marlin/src/pins/sam/pins_ULTRATRONICS_PRO.h | 4 +- Marlin/src/pins/sanguino/env_validate.h | 42 +++++++++++++++++++ .../src/pins/sanguino/pins_GEN3_MONOLITHIC.h | 5 +-- Marlin/src/pins/sanguino/pins_GEN3_PLUS.h | 5 +-- Marlin/src/pins/sanguino/pins_GEN6.h | 5 +-- Marlin/src/pins/sanguino/pins_GEN7_12.h | 5 +-- Marlin/src/pins/sanguino/pins_GEN7_14.h | 5 +-- Marlin/src/pins/sanguino/pins_GEN7_CUSTOM.h | 5 +-- Marlin/src/pins/sanguino/pins_OMCA_A.h | 2 +- .../src/pins/sanguino/pins_SANGUINOLOLU_11.h | 5 +-- Marlin/src/pins/sanguino/pins_SETHI.h | 5 +-- Marlin/src/pins/sanguino/pins_ZMIB_V2.h | 5 +-- Marlin/src/pins/stm32f1/env_validate.h | 26 ++++++++++++ Marlin/src/pins/stm32f1/pins_BEAST.h | 4 +- Marlin/src/pins/stm32f1/pins_BTT_SKR_CR6.h | 4 +- Marlin/src/pins/stm32f1/pins_CHITU3D.h | 4 +- Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h | 4 +- Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h | 4 +- Marlin/src/pins/stm32f1/pins_CREALITY_V4.h | 6 +-- Marlin/src/pins/stm32f1/pins_CREALITY_V4210.h | 6 +-- Marlin/src/pins/stm32f1/pins_CREALITY_V45x.h | 4 +- Marlin/src/pins/stm32f1/pins_FLY_MINI.h | 4 +- Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h | 4 +- Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h | 4 +- .../pins/stm32f1/pins_FYSETC_CHEETAH_V12.h | 4 +- Marlin/src/pins/stm32f1/pins_GTM32_MINI.h | 4 +- Marlin/src/pins/stm32f1/pins_GTM32_MINI_A30.h | 4 +- Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h | 4 +- Marlin/src/pins/stm32f1/pins_GTM32_REV_B.h | 4 +- .../src/pins/stm32f1/pins_JGAURORA_A5S_A1.h | 6 +-- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h | 6 +-- .../pins/stm32f1/pins_MKS_ROBIN_E3_common.h | 4 +- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h | 6 +-- .../src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h | 6 +-- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h | 6 +-- Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h | 6 +-- Marlin/src/pins/stm32f1/pins_STM32F1R.h | 4 +- Marlin/src/pins/stm32f1/pins_STM3R_MINI.h | 4 +- Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h | 6 +-- Marlin/src/pins/stm32f4/env_validate.h | 28 +++++++++++++ Marlin/src/pins/stm32f4/pins_ANET_ET4.h | 8 ++-- Marlin/src/pins/stm32f4/pins_ARMED.h | 6 +-- .../src/pins/stm32f4/pins_BLACK_STM32F407VE.h | 7 ++-- .../src/pins/stm32f4/pins_BTT_BTT002_V1_0.h | 6 +-- Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h | 6 +-- .../pins/stm32f4/pins_BTT_SKR_PRO_common.h | 4 +- Marlin/src/pins/stm32f4/pins_FLYF407ZG.h | 7 ++-- .../pins/stm32f4/pins_FYSETC_CHEETAH_V20.h | 4 +- Marlin/src/pins/stm32f4/pins_FYSETC_S6.h | 6 +-- Marlin/src/pins/stm32f4/pins_LERDGE_K.h | 7 ++-- Marlin/src/pins/stm32f4/pins_LERDGE_S.h | 7 ++-- Marlin/src/pins/stm32f4/pins_LERDGE_X.h | 7 ++-- Marlin/src/pins/stm32f4/pins_MKS_ROBIN2.h | 6 +-- .../src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h | 7 ++-- .../src/pins/stm32f4/pins_MKS_ROBIN_PRO_V2.h | 7 ++-- Marlin/src/pins/stm32f4/pins_RUMBA32_common.h | 6 +-- .../src/pins/stm32f4/pins_STEVAL_3DP001V1.h | 4 +- Marlin/src/pins/stm32f4/pins_VAKE403D.h | 7 ++-- Marlin/src/pins/teensy2/env_validate.h | 28 +++++++++++++ Marlin/src/pins/teensy2/pins_5DPRINT.h | 4 +- Marlin/src/pins/teensy2/pins_BRAINWAVE.h | 2 +- Marlin/src/pins/teensy2/pins_BRAINWAVE_PRO.h | 4 +- Marlin/src/pins/teensy2/pins_PRINTRBOARD.h | 4 +- .../src/pins/teensy2/pins_PRINTRBOARD_REVF.h | 4 +- Marlin/src/pins/teensy2/pins_SAV_MKI.h | 4 +- Marlin/src/pins/teensy2/pins_TEENSY2.h | 4 +- Marlin/src/pins/teensy2/pins_TEENSYLU.h | 3 ++ buildroot/bin/mftest | 11 +++-- buildroot/{tests => bin}/run_tests | 16 +++---- .../scripts/common-dependencies-post.py | 16 ------- .../PlatformIO/scripts/preflight-checks.py | 3 +- buildroot/tests/{ARMED-tests => ARMED} | 0 .../{BIGTREE_BTT002-tests => BIGTREE_BTT002} | 0 ...IGTREE_GTR_V1_0-tests => BIGTREE_GTR_V1_0} | 0 ...tests => BIGTREE_GTR_V1_0_usb_flash_drive} | 0 ...{BIGTREE_SKR_PRO-tests => BIGTREE_SKR_PRO} | 0 buildroot/tests/{DUE-tests => DUE} | 0 .../tests/{DUE_archim-tests => DUE_archim} | 0 .../tests/{FLYF407ZG-tests => FLYF407ZG} | 0 .../tests/{FYSETC_F6-tests => FYSETC_F6} | 0 .../tests/{FYSETC_S6-tests => FYSETC_S6} | 0 buildroot/tests/{LERDGEX-tests => LERDGEX} | 0 buildroot/tests/{LPC1768-tests => LPC1768} | 0 buildroot/tests/{LPC1769-tests => LPC1769} | 0 .../{NUCLEO_F767ZI-tests => NUCLEO_F767ZI} | 0 .../tests/{REMRAM_V1-tests => REMRAM_V1} | 0 ...entral_m4-tests => SAMD51_grandcentral_m4} | 0 ...F070CB_malyan-tests => STM32F070CB_malyan} | 0 ...F070RB_malyan-tests => STM32F070RB_malyan} | 0 ...F103CB_malyan-tests => STM32F103CB_malyan} | 0 ...{STM32F103RC_btt-tests => STM32F103RC_btt} | 0 ...03RC_btt_USB-tests => STM32F103RC_btt_USB} | 0 ...F103RC_fysetc-tests => STM32F103RC_fysetc} | 0 ...TM32F103RC_meeb-tests => STM32F103RC_meeb} | 0 .../tests/{STM32F103RE-tests => STM32F103RE} | 0 ..._creality-tests => STM32F103RET6_creality} | 0 ...{STM32F103RE_btt-tests => STM32F103RE_btt} | 0 ...03RE_btt_USB-tests => STM32F103RE_btt_USB} | 0 ...F103VE_longer-tests => STM32F103VE_longer} | 0 ...F401VE_STEVAL-tests => STM32F401VE_STEVAL} | 0 ...32F407VE_black-tests => STM32F407VE_black} | 0 ...{at90usb1286_cdc-tests => at90usb1286_cdc} | 0 ...{at90usb1286_dfu-tests => at90usb1286_dfu} | 0 buildroot/tests/{esp32-tests => esp32} | 0 ...{jgaurora_a5s_a1-tests => jgaurora_a5s_a1} | 0 .../{linux_native-tests => linux_native} | 0 .../tests/{malyan_M300-tests => malyan_M300} | 0 buildroot/tests/{mega1280-tests => mega1280} | 0 buildroot/tests/{mega2560-tests => mega2560} | 0 .../tests/{mks_robin-tests => mks_robin} | 0 .../{mks_robin_lite-tests => mks_robin_lite} | 0 .../{mks_robin_mini-tests => mks_robin_mini} | 0 ...ks_robin_nano35-tests => mks_robin_nano35} | 0 ...o35_stm32-tests => mks_robin_nano35_stm32} | 0 .../{mks_robin_pro-tests => mks_robin_pro} | 0 ...{mks_robin_stm32-tests => mks_robin_stm32} | 0 buildroot/tests/{rambo-tests => rambo} | 0 buildroot/tests/{rumba32-tests => rumba32} | 0 .../{sanguino1284p-tests => sanguino1284p} | 0 .../{sanguino644p-tests => sanguino644p} | 0 buildroot/tests/{teensy31-tests => teensy31} | 0 buildroot/tests/{teensy35-tests => teensy35} | 0 buildroot/tests/{teensy41-tests => teensy41} | 0 platformio.ini | 7 +++- 220 files changed, 631 insertions(+), 509 deletions(-) create mode 100644 Marlin/src/pins/esp32/env_validate.h create mode 100644 Marlin/src/pins/lpc1768/env_validate.h create mode 100644 Marlin/src/pins/lpc1769/env_validate.h create mode 100644 Marlin/src/pins/mega/env_validate.h create mode 100644 Marlin/src/pins/rambo/env_validate.h create mode 100644 Marlin/src/pins/ramps/env_validate.h create mode 100644 Marlin/src/pins/sam/env_validate.h create mode 100644 Marlin/src/pins/sanguino/env_validate.h create mode 100644 Marlin/src/pins/stm32f1/env_validate.h create mode 100644 Marlin/src/pins/stm32f4/env_validate.h create mode 100644 Marlin/src/pins/teensy2/env_validate.h rename buildroot/{tests => bin}/run_tests (79%) delete mode 100644 buildroot/share/PlatformIO/scripts/common-dependencies-post.py rename buildroot/tests/{ARMED-tests => ARMED} (100%) rename buildroot/tests/{BIGTREE_BTT002-tests => BIGTREE_BTT002} (100%) rename buildroot/tests/{BIGTREE_GTR_V1_0-tests => BIGTREE_GTR_V1_0} (100%) rename buildroot/tests/{BIGTREE_GTR_V1_0_usb_flash_drive-tests => BIGTREE_GTR_V1_0_usb_flash_drive} (100%) rename buildroot/tests/{BIGTREE_SKR_PRO-tests => BIGTREE_SKR_PRO} (100%) rename buildroot/tests/{DUE-tests => DUE} (100%) rename buildroot/tests/{DUE_archim-tests => DUE_archim} (100%) rename buildroot/tests/{FLYF407ZG-tests => FLYF407ZG} (100%) rename buildroot/tests/{FYSETC_F6-tests => FYSETC_F6} (100%) rename buildroot/tests/{FYSETC_S6-tests => FYSETC_S6} (100%) rename buildroot/tests/{LERDGEX-tests => LERDGEX} (100%) rename buildroot/tests/{LPC1768-tests => LPC1768} (100%) rename buildroot/tests/{LPC1769-tests => LPC1769} (100%) rename buildroot/tests/{NUCLEO_F767ZI-tests => NUCLEO_F767ZI} (100%) rename buildroot/tests/{REMRAM_V1-tests => REMRAM_V1} (100%) rename buildroot/tests/{SAMD51_grandcentral_m4-tests => SAMD51_grandcentral_m4} (100%) rename buildroot/tests/{STM32F070CB_malyan-tests => STM32F070CB_malyan} (100%) rename buildroot/tests/{STM32F070RB_malyan-tests => STM32F070RB_malyan} (100%) rename buildroot/tests/{STM32F103CB_malyan-tests => STM32F103CB_malyan} (100%) rename buildroot/tests/{STM32F103RC_btt-tests => STM32F103RC_btt} (100%) rename buildroot/tests/{STM32F103RC_btt_USB-tests => STM32F103RC_btt_USB} (100%) rename buildroot/tests/{STM32F103RC_fysetc-tests => STM32F103RC_fysetc} (100%) rename buildroot/tests/{STM32F103RC_meeb-tests => STM32F103RC_meeb} (100%) rename buildroot/tests/{STM32F103RE-tests => STM32F103RE} (100%) rename buildroot/tests/{STM32F103RET6_creality-tests => STM32F103RET6_creality} (100%) rename buildroot/tests/{STM32F103RE_btt-tests => STM32F103RE_btt} (100%) rename buildroot/tests/{STM32F103RE_btt_USB-tests => STM32F103RE_btt_USB} (100%) rename buildroot/tests/{STM32F103VE_longer-tests => STM32F103VE_longer} (100%) rename buildroot/tests/{STM32F401VE_STEVAL-tests => STM32F401VE_STEVAL} (100%) rename buildroot/tests/{STM32F407VE_black-tests => STM32F407VE_black} (100%) rename buildroot/tests/{at90usb1286_cdc-tests => at90usb1286_cdc} (100%) rename buildroot/tests/{at90usb1286_dfu-tests => at90usb1286_dfu} (100%) rename buildroot/tests/{esp32-tests => esp32} (100%) rename buildroot/tests/{jgaurora_a5s_a1-tests => jgaurora_a5s_a1} (100%) rename buildroot/tests/{linux_native-tests => linux_native} (100%) rename buildroot/tests/{malyan_M300-tests => malyan_M300} (100%) rename buildroot/tests/{mega1280-tests => mega1280} (100%) rename buildroot/tests/{mega2560-tests => mega2560} (100%) rename buildroot/tests/{mks_robin-tests => mks_robin} (100%) rename buildroot/tests/{mks_robin_lite-tests => mks_robin_lite} (100%) rename buildroot/tests/{mks_robin_mini-tests => mks_robin_mini} (100%) rename buildroot/tests/{mks_robin_nano35-tests => mks_robin_nano35} (100%) rename buildroot/tests/{mks_robin_nano35_stm32-tests => mks_robin_nano35_stm32} (100%) rename buildroot/tests/{mks_robin_pro-tests => mks_robin_pro} (100%) rename buildroot/tests/{mks_robin_stm32-tests => mks_robin_stm32} (100%) rename buildroot/tests/{rambo-tests => rambo} (100%) rename buildroot/tests/{rumba32-tests => rumba32} (100%) rename buildroot/tests/{sanguino1284p-tests => sanguino1284p} (100%) rename buildroot/tests/{sanguino644p-tests => sanguino644p} (100%) rename buildroot/tests/{teensy31-tests => teensy31} (100%) rename buildroot/tests/{teensy35-tests => teensy35} (100%) rename buildroot/tests/{teensy41-tests => teensy41} (100%) diff --git a/Marlin/src/pins/esp32/env_validate.h b/Marlin/src/pins/esp32/env_validate.h new file mode 100644 index 0000000000..ce14c33414 --- /dev/null +++ b/Marlin/src/pins/esp32/env_validate.h @@ -0,0 +1,26 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 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 + +#if NOT_TARGET(ARDUINO_ARCH_ESP32) + #error "Oops! Select an ESP32 board in 'Tools > Board.'" +#endif diff --git a/Marlin/src/pins/esp32/pins_E4D.h b/Marlin/src/pins/esp32/pins_E4D.h index 4a5a2bf9b0..9e28af2190 100644 --- a/Marlin/src/pins/esp32/pins_E4D.h +++ b/Marlin/src/pins/esp32/pins_E4D.h @@ -27,9 +27,9 @@ * for more info check https://atbox.tech/ and join to Facebook page E4d@box. */ -#if NOT_TARGET(ARDUINO_ARCH_ESP32) - #error "Oops! Select an ESP32 board in 'Tools > Board.'" -#elif EXTRUDERS > 1 || E_STEPPERS > 1 +#include "env_validate.h" + +#if EXTRUDERS > 1 || E_STEPPERS > 1 #error "E4d@box only supports one E Stepper. Comment out this line to continue." #elif HOTENDS > 1 #error "E4d@box only supports one hotend / E-stepper. Comment out this line to continue." diff --git a/Marlin/src/pins/esp32/pins_ESP32.h b/Marlin/src/pins/esp32/pins_ESP32.h index d54a92b9c4..6578770ba0 100644 --- a/Marlin/src/pins/esp32/pins_ESP32.h +++ b/Marlin/src/pins/esp32/pins_ESP32.h @@ -25,9 +25,7 @@ * Espressif ESP32 (Tensilica Xtensa LX6) pin assignments */ -#if NOT_TARGET(ARDUINO_ARCH_ESP32) - "Oops! Select an ESP32 board in 'Tools > Board.'" -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "Espressif ESP32" diff --git a/Marlin/src/pins/esp32/pins_FYSETC_E4.h b/Marlin/src/pins/esp32/pins_FYSETC_E4.h index 50a8587b1e..7dd7f94ae5 100644 --- a/Marlin/src/pins/esp32/pins_FYSETC_E4.h +++ b/Marlin/src/pins/esp32/pins_FYSETC_E4.h @@ -27,9 +27,9 @@ * Supports 4 stepper drivers, heated bed, single hotend. */ -#ifndef ARDUINO_ARCH_ESP32 - #error "Oops! Select an ESP32 board in 'Tools > Board.'" -#elif EXTRUDERS > 1 || E_STEPPERS > 1 +#include "env_validate.h" + +#if EXTRUDERS > 1 || E_STEPPERS > 1 #error "FYSETC E4 only supports one E Stepper. Comment out this line to continue." #elif HOTENDS > 1 #error "FYSETC E4 only supports one hotend / E-stepper. Comment out this line to continue." diff --git a/Marlin/src/pins/esp32/pins_MRR_ESPA.h b/Marlin/src/pins/esp32/pins_MRR_ESPA.h index fe67f75372..38f43b53d3 100644 --- a/Marlin/src/pins/esp32/pins_MRR_ESPA.h +++ b/Marlin/src/pins/esp32/pins_MRR_ESPA.h @@ -27,9 +27,9 @@ * Supports 4 stepper drivers, heated bed, single hotend. */ -#if NOT_TARGET(ARDUINO_ARCH_ESP32) - #error "Oops! Select an ESP32 board in 'Tools > Board.'" -#elif EXTRUDERS > 1 || E_STEPPERS > 1 +#include "env_validate.h" + +#if EXTRUDERS > 1 || E_STEPPERS > 1 #error "MRR ESPA only supports one E Stepper. Comment out this line to continue." #elif HOTENDS > 1 #error "MRR ESPA only supports one hotend / E-stepper. Comment out this line to continue." diff --git a/Marlin/src/pins/esp32/pins_MRR_ESPE.h b/Marlin/src/pins/esp32/pins_MRR_ESPE.h index 3f9a6a0af3..f156efd2e8 100644 --- a/Marlin/src/pins/esp32/pins_MRR_ESPE.h +++ b/Marlin/src/pins/esp32/pins_MRR_ESPE.h @@ -28,9 +28,9 @@ * single hotend, and LCD controller. */ -#if NOT_TARGET(ARDUINO_ARCH_ESP32) - #error "Oops! Select an ESP32 board in 'Tools > Board.'" -#elif EXTRUDERS > 2 || E_STEPPERS > 2 +#include "env_validate.h" + +#if EXTRUDERS > 2 || E_STEPPERS > 2 #error "MRR ESPE only supports two E Steppers. Comment out this line to continue." #elif HOTENDS > 1 #error "MRR ESPE only supports one hotend / E-stepper. Comment out this line to continue." diff --git a/Marlin/src/pins/lpc1768/env_validate.h b/Marlin/src/pins/lpc1768/env_validate.h new file mode 100644 index 0000000000..adb3ea938d --- /dev/null +++ b/Marlin/src/pins/lpc1768/env_validate.h @@ -0,0 +1,30 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 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 + +#if ENABLED(REQUIRE_LPC1769) && NOT_TARGET(MCU_LPC1769) + #error "Oops! Make sure you have the LPC1769 environment selected in your IDE." +#elif DISABLED(REQUIRE_LPC1769) && NOT_TARGET(MCU_LPC1768) + #error "Oops! Make sure you have the LPC1768 environment selected in your IDE." +#endif + +#undef REQUIRE_LPC1769 diff --git a/Marlin/src/pins/lpc1768/pins_AZSMZ_MINI.h b/Marlin/src/pins/lpc1768/pins_AZSMZ_MINI.h index 70682ad151..0760eee0ab 100644 --- a/Marlin/src/pins/lpc1768/pins_AZSMZ_MINI.h +++ b/Marlin/src/pins/lpc1768/pins_AZSMZ_MINI.h @@ -25,9 +25,7 @@ * AZSMZ MINI pin assignments */ -#if NOT_TARGET(MCU_LPC1768) - #error "Oops! Make sure you have the LPC1768 environment selected in your IDE." -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "AZSMZ MINI" diff --git a/Marlin/src/pins/lpc1768/pins_BIQU_B300_V1.0.h b/Marlin/src/pins/lpc1768/pins_BIQU_B300_V1.0.h index 5ac119f398..10a610ff95 100644 --- a/Marlin/src/pins/lpc1768/pins_BIQU_B300_V1.0.h +++ b/Marlin/src/pins/lpc1768/pins_BIQU_B300_V1.0.h @@ -29,9 +29,7 @@ * BOARD_BIQU_BQ111_A4 (Hotend, Fan, Bed) */ -#if NOT_TARGET(MCU_LPC1768) - #error "Oops! Make sure you have the LPC1768 environment selected in your IDE." -#endif +#include "env_validate.h" #ifndef BOARD_INFO_NAME #define BOARD_INFO_NAME "BIQU Thunder B300 V1.0" diff --git a/Marlin/src/pins/lpc1768/pins_BIQU_BQ111_A4.h b/Marlin/src/pins/lpc1768/pins_BIQU_BQ111_A4.h index 3b2137b400..f94381e13a 100644 --- a/Marlin/src/pins/lpc1768/pins_BIQU_BQ111_A4.h +++ b/Marlin/src/pins/lpc1768/pins_BIQU_BQ111_A4.h @@ -29,9 +29,7 @@ * BOARD_BIQU_BQ111_A4 (Hotend, Fan, Bed) */ -#if NOT_TARGET(MCU_LPC1768) - #error "Oops! Make sure you have the LPC1768 environment selected in your IDE." -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "BIQU BQ111-A4" diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h index c7555a779d..c555ef7863 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h @@ -21,14 +21,12 @@ */ #pragma once +#include "env_validate.h" + #ifndef BOARD_INFO_NAME #define BOARD_INFO_NAME "BTT SKR V1.4" #endif -#ifndef BOARD_CUSTOM_BUILD_FLAGS - #define BOARD_CUSTOM_BUILD_FLAGS -DLPC_PINCFG_UART3_P4_28 -#endif - // // SD Connection // diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h index 82799c1cd0..98e4f8ee26 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_common.h @@ -21,13 +21,7 @@ */ #pragma once -#if ENABLED(SKR_HAS_LPC1769) - #if NOT_TARGET(MCU_LPC1769) - #error "Oops! Make sure you have the LPC1769 environment selected in your IDE." - #endif -#elif NOT_TARGET(MCU_LPC1768) - #error "Oops! Make sure you have the LPC1768 environment selected in your IDE." -#endif +#include "env_validate.h" // If you have the Big tree tech driver expansion module, enable HAS_BTT_EXP_MOT // https://github.com/bigtreetech/BTT-Expansion-module/tree/master/BTT%20EXP-MOT diff --git a/Marlin/src/pins/lpc1768/pins_GMARSH_X6_REV1.h b/Marlin/src/pins/lpc1768/pins_GMARSH_X6_REV1.h index 1970c0c479..0df8b10292 100644 --- a/Marlin/src/pins/lpc1768/pins_GMARSH_X6_REV1.h +++ b/Marlin/src/pins/lpc1768/pins_GMARSH_X6_REV1.h @@ -21,9 +21,7 @@ */ #pragma once -#if NOT_TARGET(MCU_LPC1768) - #error "Oops! Make sure you have the LPC1768 environment selected in your IDE." -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "GMARSH X6 REV1" diff --git a/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h b/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h index fbddc66e7c..71d7ad3037 100644 --- a/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h +++ b/Marlin/src/pins/lpc1768/pins_MKS_SBASE.h @@ -25,11 +25,7 @@ * MKS SBASE pin assignments */ -#if defined(MKS_HAS_LPC1769) && NOT_TARGET(MCU_LPC1769) - #error "Oops! Make sure you have the LPC1769 environment selected in your IDE." -#elif !defined(MKS_HAS_LPC1769) && NOT_TARGET(MCU_LPC1768) - #error "Oops! Make sure you have the LPC1768 environment selected in your IDE." -#endif +#include "env_validate.h" #ifndef BOARD_INFO_NAME #define BOARD_INFO_NAME "MKS SBASE" diff --git a/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h b/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h index b919ecad85..40fac4e7fa 100644 --- a/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h +++ b/Marlin/src/pins/lpc1768/pins_MKS_SGEN_L.h @@ -25,9 +25,7 @@ * MKS SGEN-L pin assignments */ -#if NOT_TARGET(MCU_LPC1768) - #error "Oops! Make sure you have the LPC1768 environment selected in your IDE." -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "MKS SGen-L" #define BOARD_WEBSITE_URL "github.com/makerbase-mks/MKS-SGEN_L" diff --git a/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h b/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h index 65840308ca..83fcf36e4e 100644 --- a/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h +++ b/Marlin/src/pins/lpc1768/pins_RAMPS_RE_ARM.h @@ -35,9 +35,7 @@ // Numbers in parentheses () are the corresponding mega2560 pin numbers -#if NOT_TARGET(MCU_LPC1768) - #error "Oops! Make sure you have the LPC1768 environment selected in your IDE." -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "Re-ARM RAMPS 1.4" diff --git a/Marlin/src/pins/lpc1768/pins_SELENA_COMPACT.h b/Marlin/src/pins/lpc1768/pins_SELENA_COMPACT.h index 700e79de9c..29fe3b528c 100644 --- a/Marlin/src/pins/lpc1768/pins_SELENA_COMPACT.h +++ b/Marlin/src/pins/lpc1768/pins_SELENA_COMPACT.h @@ -25,9 +25,7 @@ * Selena Compact pin assignments */ -#if NOT_TARGET(MCU_LPC1768) - #error "Oops! Make sure you have the LPC1768 environment selected in your IDE." -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "Selena Compact" #define BOARD_WEBSITE_URL "github.com/Ales2-k/Selena" diff --git a/Marlin/src/pins/lpc1769/env_validate.h b/Marlin/src/pins/lpc1769/env_validate.h new file mode 100644 index 0000000000..2e2b63d520 --- /dev/null +++ b/Marlin/src/pins/lpc1769/env_validate.h @@ -0,0 +1,26 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 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 + +#if NOT_TARGET(MCU_LPC1769) + #error "Oops! Make sure you have the LPC1769 environment selected in your IDE." +#endif diff --git a/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_GT.h b/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_GT.h index adf9085262..7ce78ad283 100644 --- a/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_GT.h +++ b/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_GT.h @@ -25,9 +25,7 @@ * Azteeg X5 GT pin assignments */ -#if NOT_TARGET(MCU_LPC1769) - #error "Oops! Make sure you have the LPC1769 environment selected in your IDE." -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "Azteeg X5 GT" #define BOARD_WEBSITE_URL "tinyurl.com/yx8tdqa3" diff --git a/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h b/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h index fdd64878fb..80a91d2cbc 100644 --- a/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h +++ b/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI.h @@ -24,10 +24,7 @@ /** * Azteeg X5 MINI pin assignments */ - -#if NOT_TARGET(MCU_LPC1769) - #error "Oops! Make sure you have the LPC1769 environment selected in your IDE." -#endif +#include "env_validate.h" #ifndef BOARD_INFO_NAME #define BOARD_INFO_NAME "Azteeg X5 MINI" diff --git a/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI_WIFI.h b/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI_WIFI.h index 99ff0fd25a..086bacbac0 100644 --- a/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI_WIFI.h +++ b/Marlin/src/pins/lpc1769/pins_AZTEEG_X5_MINI_WIFI.h @@ -22,12 +22,10 @@ #pragma once /** - * Azteeg X5 MINI pin assignments + * Azteeg X5 MINI WIFI pin assignments */ -#if NOT_TARGET(MCU_LPC1769) - #error "Oops! Make sure you have the LPC1769 environment selected in your IDE." -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "Azteeg X5 MINI WIFI" diff --git a/Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h b/Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h index 7c63ba20be..2e1e02f991 100644 --- a/Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h +++ b/Marlin/src/pins/lpc1769/pins_BTT_SKR_E3_TURBO.h @@ -21,6 +21,8 @@ */ #pragma once +#include "env_validate.h" + #ifndef BOARD_INFO_NAME #define BOARD_INFO_NAME "BTT SKR E3 Turbo" #endif diff --git a/Marlin/src/pins/lpc1769/pins_BTT_SKR_V1_4_TURBO.h b/Marlin/src/pins/lpc1769/pins_BTT_SKR_V1_4_TURBO.h index a751286e3a..5af1dfec3f 100644 --- a/Marlin/src/pins/lpc1769/pins_BTT_SKR_V1_4_TURBO.h +++ b/Marlin/src/pins/lpc1769/pins_BTT_SKR_V1_4_TURBO.h @@ -22,9 +22,9 @@ #pragma once #define BOARD_INFO_NAME "BTT SKR V1.4 TURBO" -#define SKR_HAS_LPC1769 // // Include SKR 1.4 pins // +#define REQUIRE_LPC1769 #include "../lpc1768/pins_BTT_SKR_V1_4.h" diff --git a/Marlin/src/pins/lpc1769/pins_COHESION3D_MINI.h b/Marlin/src/pins/lpc1769/pins_COHESION3D_MINI.h index d66ffbe4e5..237dfaec36 100644 --- a/Marlin/src/pins/lpc1769/pins_COHESION3D_MINI.h +++ b/Marlin/src/pins/lpc1769/pins_COHESION3D_MINI.h @@ -25,9 +25,7 @@ * Cohesion3D Mini pin assignments */ -#if NOT_TARGET(MCU_LPC1769) - #error "Oops! Make sure you have the LPC1769 environment selected in your IDE." -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "Cohesion3D Mini" diff --git a/Marlin/src/pins/lpc1769/pins_COHESION3D_REMIX.h b/Marlin/src/pins/lpc1769/pins_COHESION3D_REMIX.h index edf13cee29..57b4521453 100644 --- a/Marlin/src/pins/lpc1769/pins_COHESION3D_REMIX.h +++ b/Marlin/src/pins/lpc1769/pins_COHESION3D_REMIX.h @@ -25,9 +25,7 @@ * Cohesion3D ReMix pin assignments */ -#if NOT_TARGET(MCU_LPC1769) - #error "Oops! Make sure you have the LPC1769 environment selected in your IDE." -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "Cohesion3D ReMix" diff --git a/Marlin/src/pins/lpc1769/pins_FLY_CDY.h b/Marlin/src/pins/lpc1769/pins_FLY_CDY.h index 3982d76a01..b90443403c 100644 --- a/Marlin/src/pins/lpc1769/pins_FLY_CDY.h +++ b/Marlin/src/pins/lpc1769/pins_FLY_CDY.h @@ -21,9 +21,7 @@ */ #pragma once -#if NOT_TARGET(MCU_LPC1769) - #error "Oops! Make sure you have the LPC1769 environment selected in your IDE." -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "FLY-CDY" #define BOARD_WEBSITE_URL "github.com/FLYmaker/FLY-CDY" diff --git a/Marlin/src/pins/lpc1769/pins_MKS_SGEN.h b/Marlin/src/pins/lpc1769/pins_MKS_SGEN.h index d67549997b..ddfee63cd0 100644 --- a/Marlin/src/pins/lpc1769/pins_MKS_SGEN.h +++ b/Marlin/src/pins/lpc1769/pins_MKS_SGEN.h @@ -28,14 +28,10 @@ * https://github.com/makerbase-mks/MKS-SGen/blob/master/Hardware/MKS%20SGEN%20V1.0_001/MKS%20SGEN%20V1.0_001%20PIN.pdf */ -#if NOT_TARGET(MCU_LPC1769) - #error "Oops! Make sure you have the LPC1769 environment selected in your IDE." -#endif - #define BOARD_INFO_NAME "MKS SGen" #define BOARD_WEBSITE_URL "github.com/makerbase-mks/MKS-SGEN" -#define MKS_HAS_LPC1769 +#define REQUIRE_LPC1769 #include "../lpc1768/pins_MKS_SBASE.h" #if HAS_TMC_UART diff --git a/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h b/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h index abf5be3c89..a616079403 100644 --- a/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h +++ b/Marlin/src/pins/lpc1769/pins_MKS_SGEN_L_V2.h @@ -25,9 +25,7 @@ * MKS SGen pin assignments */ -#if NOT_TARGET(MCU_LPC1769) - #error "Oops! Make sure you have the LPC1769 environment selected in your IDE." -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "MKS SGEN_L V2" #define BOARD_WEBSITE_URL "github.com/makerbase-mks" diff --git a/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h b/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h index c5ce3f8795..f7bc9602d7 100644 --- a/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h +++ b/Marlin/src/pins/lpc1769/pins_SMOOTHIEBOARD.h @@ -25,9 +25,7 @@ * Smoothieboard pin assignments */ -#if NOT_TARGET(MCU_LPC1769) - #error "Oops! Make sure you have the LPC1769 environment selected in your IDE." -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "Smoothieboard" #define BOARD_WEBSITE_URL "smoothieware.org/smoothieboard" diff --git a/Marlin/src/pins/lpc1769/pins_TH3D_EZBOARD.h b/Marlin/src/pins/lpc1769/pins_TH3D_EZBOARD.h index d4f3e5bc21..4d725bc7d1 100644 --- a/Marlin/src/pins/lpc1769/pins_TH3D_EZBOARD.h +++ b/Marlin/src/pins/lpc1769/pins_TH3D_EZBOARD.h @@ -25,9 +25,7 @@ * TH3D EZBoard pin assignments */ -#if NOT_TARGET(MCU_LPC1769) - #error "Oops! Make sure you have the LPC1769 environment selected in your IDE." -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "TH3D EZBoard" #define BOARD_WEBSITE_URL "th3dstudio.com" diff --git a/Marlin/src/pins/mega/env_validate.h b/Marlin/src/pins/mega/env_validate.h new file mode 100644 index 0000000000..fe4a39a612 --- /dev/null +++ b/Marlin/src/pins/mega/env_validate.h @@ -0,0 +1,30 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 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 + +#if ENABLED(ALLOW_MEGA1280) && NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) + #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560 or 1280' in 'Tools > Board.'" +#elif NOT_TARGET(__AVR_ATmega2560__) + #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" +#endif + +#undef ALLOW_MEGA1280 diff --git a/Marlin/src/pins/mega/pins_CHEAPTRONIC.h b/Marlin/src/pins/mega/pins_CHEAPTRONIC.h index 98427d9e59..8bcb263bc1 100644 --- a/Marlin/src/pins/mega/pins_CHEAPTRONIC.h +++ b/Marlin/src/pins/mega/pins_CHEAPTRONIC.h @@ -25,9 +25,7 @@ * Cheaptronic v1.0 pin assignments */ -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "Cheaptronic v1.0" // diff --git a/Marlin/src/pins/mega/pins_CHEAPTRONICv2.h b/Marlin/src/pins/mega/pins_CHEAPTRONICv2.h index 3f18bc8bbe..01438975b9 100644 --- a/Marlin/src/pins/mega/pins_CHEAPTRONICv2.h +++ b/Marlin/src/pins/mega/pins_CHEAPTRONICv2.h @@ -27,9 +27,7 @@ * www.reprapobchod.cz */ -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "Cheaptronic v2.0" diff --git a/Marlin/src/pins/mega/pins_CNCONTROLS_11.h b/Marlin/src/pins/mega/pins_CNCONTROLS_11.h index f80e6144ce..6f9e5e8e6c 100644 --- a/Marlin/src/pins/mega/pins_CNCONTROLS_11.h +++ b/Marlin/src/pins/mega/pins_CNCONTROLS_11.h @@ -25,9 +25,8 @@ * CartesioV11 pin assignments */ -#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif +#define ALLOW_MEGA1280 +#include "env_validate.h" #define BOARD_INFO_NAME "CN Controls V11" diff --git a/Marlin/src/pins/mega/pins_CNCONTROLS_12.h b/Marlin/src/pins/mega/pins_CNCONTROLS_12.h index 540f5c29f5..f1200e0901 100644 --- a/Marlin/src/pins/mega/pins_CNCONTROLS_12.h +++ b/Marlin/src/pins/mega/pins_CNCONTROLS_12.h @@ -25,9 +25,8 @@ * CartesioV12 pin assignments */ -#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif +#define ALLOW_MEGA1280 +#include "env_validate.h" #define BOARD_INFO_NAME "CN Controls V12" diff --git a/Marlin/src/pins/mega/pins_CNCONTROLS_15.h b/Marlin/src/pins/mega/pins_CNCONTROLS_15.h index 8bafbdf000..6de3b7172e 100644 --- a/Marlin/src/pins/mega/pins_CNCONTROLS_15.h +++ b/Marlin/src/pins/mega/pins_CNCONTROLS_15.h @@ -25,9 +25,8 @@ * CNControls V15 for HMS434 pin assignments */ -#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif +#define ALLOW_MEGA1280 +#include "env_validate.h" #define BOARD_INFO_NAME "CN Controls V15" diff --git a/Marlin/src/pins/mega/pins_EINSTART-S.h b/Marlin/src/pins/mega/pins_EINSTART-S.h index 40d65c353e..d42efe7361 100644 --- a/Marlin/src/pins/mega/pins_EINSTART-S.h +++ b/Marlin/src/pins/mega/pins_EINSTART-S.h @@ -26,9 +26,8 @@ * PCB Silkscreen: 3DPrinterCon_v3.5 */ -#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif +#define ALLOW_MEGA1280 +#include "env_validate.h" #define BOARD_INFO_NAME "Einstart-S" diff --git a/Marlin/src/pins/mega/pins_ELEFU_3.h b/Marlin/src/pins/mega/pins_ELEFU_3.h index af93c408a2..f5e146cff9 100644 --- a/Marlin/src/pins/mega/pins_ELEFU_3.h +++ b/Marlin/src/pins/mega/pins_ELEFU_3.h @@ -25,9 +25,7 @@ * Elefu RA Board Pin Assignments */ -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "Elefu Ra v3" diff --git a/Marlin/src/pins/mega/pins_GT2560_REV_A.h b/Marlin/src/pins/mega/pins_GT2560_REV_A.h index dcd829f7a7..2fb43a299f 100644 --- a/Marlin/src/pins/mega/pins_GT2560_REV_A.h +++ b/Marlin/src/pins/mega/pins_GT2560_REV_A.h @@ -27,9 +27,8 @@ * Richard Smith */ -#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif +#define ALLOW_MEGA1280 +#include "env_validate.h" #ifndef BOARD_INFO_NAME #define BOARD_INFO_NAME "GT2560 Rev.A" diff --git a/Marlin/src/pins/mega/pins_GT2560_V3.h b/Marlin/src/pins/mega/pins_GT2560_V3.h index 66b2804ff6..65642464d9 100644 --- a/Marlin/src/pins/mega/pins_GT2560_V3.h +++ b/Marlin/src/pins/mega/pins_GT2560_V3.h @@ -25,9 +25,8 @@ * Geeetech GT2560 RevB + GT2560 3.0/3.1 + GT2560 4.0/4.1 pin assignments */ -#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif +#define ALLOW_MEGA1280 +#include "env_validate.h" #ifndef BOARD_INFO_NAME #define BOARD_INFO_NAME "GT2560 RevB/3.x/4.x" diff --git a/Marlin/src/pins/mega/pins_HJC2560C_REV2.h b/Marlin/src/pins/mega/pins_HJC2560C_REV2.h index dc4b78d9c1..27ec998891 100644 --- a/Marlin/src/pins/mega/pins_HJC2560C_REV2.h +++ b/Marlin/src/pins/mega/pins_HJC2560C_REV2.h @@ -25,9 +25,7 @@ * Geeetech HJC2560-C Rev 2.x board pin assignments */ -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif +#include "env_validate.h" #define DEFAULT_MACHINE_NAME "ADIMLab Gantry v2" #define BOARD_INFO_NAME "HJC2560-C" diff --git a/Marlin/src/pins/mega/pins_INTAMSYS40.h b/Marlin/src/pins/mega/pins_INTAMSYS40.h index be5f461dda..2e2a9b85db 100644 --- a/Marlin/src/pins/mega/pins_INTAMSYS40.h +++ b/Marlin/src/pins/mega/pins_INTAMSYS40.h @@ -27,9 +27,7 @@ * 2208 version exists and may or may not work */ -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "Intamsys 4.0" diff --git a/Marlin/src/pins/mega/pins_LEAPFROG.h b/Marlin/src/pins/mega/pins_LEAPFROG.h index 9e6802b24b..4700fd6729 100644 --- a/Marlin/src/pins/mega/pins_LEAPFROG.h +++ b/Marlin/src/pins/mega/pins_LEAPFROG.h @@ -25,9 +25,8 @@ * Leapfrog Driver board pin assignments */ -#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) - #error "Oops! Select 'Mega 1280' or 'Mega 2560' in 'Tools > Board.'" -#endif +#define ALLOW_MEGA1280 +#include "env_validate.h" #define BOARD_INFO_NAME "Leapfrog" diff --git a/Marlin/src/pins/mega/pins_LEAPFROG_XEED2015.h b/Marlin/src/pins/mega/pins_LEAPFROG_XEED2015.h index 9c316aa759..af5cfd6a2e 100644 --- a/Marlin/src/pins/mega/pins_LEAPFROG_XEED2015.h +++ b/Marlin/src/pins/mega/pins_LEAPFROG_XEED2015.h @@ -29,9 +29,7 @@ * printer models. As such this file is currently specific to the Xeed. */ -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Mega 2560' in 'Tools > Board.'" -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "Leapfrog Xeed 2015" diff --git a/Marlin/src/pins/mega/pins_MEGACONTROLLER.h b/Marlin/src/pins/mega/pins_MEGACONTROLLER.h index 938ad82eff..69c60b29ec 100644 --- a/Marlin/src/pins/mega/pins_MEGACONTROLLER.h +++ b/Marlin/src/pins/mega/pins_MEGACONTROLLER.h @@ -25,12 +25,12 @@ * Mega controller pin assignments */ -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#elif HOTENDS > 2 || E_STEPPERS > 2 +#if HOTENDS > 2 || E_STEPPERS > 2 #error "Mega Controller supports up to 2 hotends / E-steppers. Comment out this line to continue." #endif +#include "env_validate.h" + #define BOARD_INFO_NAME "Mega Controller" // diff --git a/Marlin/src/pins/mega/pins_MEGATRONICS.h b/Marlin/src/pins/mega/pins_MEGATRONICS.h index f813366a14..0308175b2a 100644 --- a/Marlin/src/pins/mega/pins_MEGATRONICS.h +++ b/Marlin/src/pins/mega/pins_MEGATRONICS.h @@ -25,9 +25,7 @@ * MegaTronics pin assignments */ -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "Megatronics" // diff --git a/Marlin/src/pins/mega/pins_MEGATRONICS_2.h b/Marlin/src/pins/mega/pins_MEGATRONICS_2.h index ef4605edd4..e527035910 100644 --- a/Marlin/src/pins/mega/pins_MEGATRONICS_2.h +++ b/Marlin/src/pins/mega/pins_MEGATRONICS_2.h @@ -25,9 +25,7 @@ * MegaTronics v2.0 pin assignments */ -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "Megatronics v2.0" // diff --git a/Marlin/src/pins/mega/pins_MEGATRONICS_3.h b/Marlin/src/pins/mega/pins_MEGATRONICS_3.h index 9f85d46a54..5dea438d70 100644 --- a/Marlin/src/pins/mega/pins_MEGATRONICS_3.h +++ b/Marlin/src/pins/mega/pins_MEGATRONICS_3.h @@ -25,9 +25,7 @@ * MegaTronics v3.0 / v3.1 / v3.2 pin assignments */ -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif +#include "env_validate.h" #if MB(MEGATRONICS_32) #define BOARD_INFO_NAME "Megatronics v3.2" diff --git a/Marlin/src/pins/mega/pins_MIGHTYBOARD_REVE.h b/Marlin/src/pins/mega/pins_MIGHTYBOARD_REVE.h index b260a27867..2531f10a7a 100644 --- a/Marlin/src/pins/mega/pins_MIGHTYBOARD_REVE.h +++ b/Marlin/src/pins/mega/pins_MIGHTYBOARD_REVE.h @@ -37,9 +37,8 @@ * number (B5) agrees with the schematic but B5 is assigned to logical pin 11. */ -#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) - #error "Oops! Select 'Mega 1280' or 'Mega 2560' in 'Tools > Board.'" -#endif +#define ALLOW_MEGA1280 +#include "env_validate.h" #define BOARD_INFO_NAME "Mightyboard" #define DEFAULT_MACHINE_NAME "MB Replicator" diff --git a/Marlin/src/pins/mega/pins_OVERLORD.h b/Marlin/src/pins/mega/pins_OVERLORD.h index 18bb1f27bf..161820b67a 100644 --- a/Marlin/src/pins/mega/pins_OVERLORD.h +++ b/Marlin/src/pins/mega/pins_OVERLORD.h @@ -25,12 +25,12 @@ * Dreammaker Overlord v1.1 pin assignments */ -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#elif HOTENDS > 2 || E_STEPPERS > 2 +#if HOTENDS > 2 || E_STEPPERS > 2 #error "Overlord Controller supports up to 2 hotends / E-steppers. Comment out this line to continue." #endif +#include "env_validate.h" + #define BOARD_INFO_NAME "OVERLORD" #define DEFAULT_MACHINE_NAME BOARD_INFO_NAME diff --git a/Marlin/src/pins/mega/pins_PICA.h b/Marlin/src/pins/mega/pins_PICA.h index ff4d3e834d..81f6319377 100644 --- a/Marlin/src/pins/mega/pins_PICA.h +++ b/Marlin/src/pins/mega/pins_PICA.h @@ -29,6 +29,8 @@ * Applies to PICA, PICA_REVB */ +#include "env_validate.h" + #ifndef BOARD_INFO_NAME #define BOARD_INFO_NAME "PICA" #endif @@ -42,10 +44,6 @@ AD12 = 66; AD13 = 67; AD14 = 68; AD15 = 69; */ -#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) - #error "Oops! Make sure you have 'Arduino Mega' selected from the 'Tools -> Boards' menu." -#endif - // // Servos // diff --git a/Marlin/src/pins/mega/pins_WANHAO_ONEPLUS.h b/Marlin/src/pins/mega/pins_WANHAO_ONEPLUS.h index 715e823393..503dd9ec81 100644 --- a/Marlin/src/pins/mega/pins_WANHAO_ONEPLUS.h +++ b/Marlin/src/pins/mega/pins_WANHAO_ONEPLUS.h @@ -25,9 +25,7 @@ * Wanhao 0ne+ pin assignments */ -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "Wanhao i3 Mini 0ne+" #define DEFAULT_MACHINE_NAME "i3 Mini" diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index b8cf695fb5..55240021fa 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -378,7 +378,7 @@ #elif MB(BTT_SKR_V1_3) #include "lpc1768/pins_BTT_SKR_V1_3.h" // LPC1768 env:LPC1768 #elif MB(BTT_SKR_V1_4) - #include "lpc1768/pins_BTT_SKR_V1_4.h" // LPC1768 env:LPC1768 + #include "lpc1768/pins_BTT_SKR_V1_4.h" // LPC1768 env:LPC1768_btt_skr_v1_4 // // LPC1769 ARM Cortex M3 diff --git a/Marlin/src/pins/pinsDebug.h b/Marlin/src/pins/pinsDebug.h index e2e56081b7..72e31b7b25 100644 --- a/Marlin/src/pins/pinsDebug.h +++ b/Marlin/src/pins/pinsDebug.h @@ -41,7 +41,7 @@ #define REPORT_NAME_ANALOG(COUNTER, NAME) _ADD_PIN(#NAME, COUNTER) #include "pinsDebug_list.h" -#line 46 +#line 45 // manually add pins that have names that are macros which don't play well with these macros #if ANY(AVR_ATmega2560_FAMILY, AVR_ATmega1284_FAMILY, ARDUINO_ARCH_SAM, TARGET_LPC1768) @@ -227,7 +227,7 @@ const PinInfo pin_array[] PROGMEM = { #endif #include "pinsDebug_list.h" - #line 172 + #line 231 }; diff --git a/Marlin/src/pins/rambo/env_validate.h b/Marlin/src/pins/rambo/env_validate.h new file mode 100644 index 0000000000..84cf8392cd --- /dev/null +++ b/Marlin/src/pins/rambo/env_validate.h @@ -0,0 +1,26 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 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 + +#if NOT_TARGET(__AVR_ATmega2560__) + #error "Oops! Select 'Arduino Mega 2560 or Rambo' in 'Tools > Board.'" +#endif diff --git a/Marlin/src/pins/rambo/pins_EINSY_RAMBO.h b/Marlin/src/pins/rambo/pins_EINSY_RAMBO.h index 2ca2cc9c8d..7b05d454af 100644 --- a/Marlin/src/pins/rambo/pins_EINSY_RAMBO.h +++ b/Marlin/src/pins/rambo/pins_EINSY_RAMBO.h @@ -25,9 +25,7 @@ * Einsy-Rambo pin assignments */ -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino Mega 2560 or Rambo' in 'Tools > Board.'" -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "Einsy Rambo" diff --git a/Marlin/src/pins/rambo/pins_EINSY_RETRO.h b/Marlin/src/pins/rambo/pins_EINSY_RETRO.h index a6a4b65e05..ee537495ea 100644 --- a/Marlin/src/pins/rambo/pins_EINSY_RETRO.h +++ b/Marlin/src/pins/rambo/pins_EINSY_RETRO.h @@ -25,9 +25,7 @@ * Einsy-Retro pin assignments */ -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino Mega 2560 or Rambo' in 'Tools > Board.'" -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "Einsy Retro" diff --git a/Marlin/src/pins/rambo/pins_MINIRAMBO.h b/Marlin/src/pins/rambo/pins_MINIRAMBO.h index 4dcf35827c..ec44cc3b36 100644 --- a/Marlin/src/pins/rambo/pins_MINIRAMBO.h +++ b/Marlin/src/pins/rambo/pins_MINIRAMBO.h @@ -25,9 +25,7 @@ * Mini-RAMBo pin assignments */ -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'RAMBo' in 'Tools > Board' or the Mega2560 environment in PlatformIO." -#endif +#include "env_validate.h" #if MB(MINIRAMBO_10A) #define BOARD_INFO_NAME "Mini RAMBo 1.0a" diff --git a/Marlin/src/pins/rambo/pins_RAMBO.h b/Marlin/src/pins/rambo/pins_RAMBO.h index 65fc4b5af8..5d6f9c1fd0 100644 --- a/Marlin/src/pins/rambo/pins_RAMBO.h +++ b/Marlin/src/pins/rambo/pins_RAMBO.h @@ -41,9 +41,7 @@ * Rambo pin assignments */ -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif +#include "env_validate.h" #ifndef BOARD_INFO_NAME #define BOARD_INFO_NAME "Rambo" diff --git a/Marlin/src/pins/rambo/pins_SCOOVO_X9H.h b/Marlin/src/pins/rambo/pins_SCOOVO_X9H.h index 5680b00df6..c2a691a3b7 100644 --- a/Marlin/src/pins/rambo/pins_SCOOVO_X9H.h +++ b/Marlin/src/pins/rambo/pins_SCOOVO_X9H.h @@ -25,9 +25,7 @@ * Rambo pin assignments MODIFIED FOR Scoovo X9H ************************************************/ -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif +#include "env_target.h" #define BOARD_INFO_NAME "Scoovo X9H" diff --git a/Marlin/src/pins/ramps/env_validate.h b/Marlin/src/pins/ramps/env_validate.h new file mode 100644 index 0000000000..6006a78f01 --- /dev/null +++ b/Marlin/src/pins/ramps/env_validate.h @@ -0,0 +1,35 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 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 + +#if ENABLED(ALLOW_SAM3X8E) + #if NOT_TARGET(__SAM3X8E__, __AVR_ATmega2560__) + #error "Oops! Select 'Arduino Due' or 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" + #endif +#elif ENABLED(REQUIRE_MEGA2560) && NOT_TARGET(__AVR_ATmega2560__) + #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" +#elif DISABLED(REQUIRE_MEGA2560) && NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) + #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560 or 1280' in 'Tools > Board.'" +#endif + +#undef ALLOW_SAM3X8E +#undef REQUIRE_MEGA2560 diff --git a/Marlin/src/pins/ramps/pins_AZTEEG_X3.h b/Marlin/src/pins/ramps/pins_AZTEEG_X3.h index 6ddd2a5165..07af61e693 100644 --- a/Marlin/src/pins/ramps/pins_AZTEEG_X3.h +++ b/Marlin/src/pins/ramps/pins_AZTEEG_X3.h @@ -25,9 +25,10 @@ * AZTEEG_X3 Arduino Mega with RAMPS v1.4 pin assignments */ -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#elif HOTENDS > 2 || E_STEPPERS > 2 +#define REQUIRE_MEGA2560 +#include "env_validate.h" + +#if HOTENDS > 2 || E_STEPPERS > 2 #error "Azteeg X3 supports up to 2 hotends / E-steppers. Comment out this line to continue." #endif diff --git a/Marlin/src/pins/ramps/pins_AZTEEG_X3_PRO.h b/Marlin/src/pins/ramps/pins_AZTEEG_X3_PRO.h index 9ba6a0c1ac..c2896146e6 100644 --- a/Marlin/src/pins/ramps/pins_AZTEEG_X3_PRO.h +++ b/Marlin/src/pins/ramps/pins_AZTEEG_X3_PRO.h @@ -25,9 +25,10 @@ * AZTEEG_X3_PRO (Arduino Mega) pin assignments */ -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#elif HOTENDS > 5 || E_STEPPERS > 5 +#define REQUIRE_MEGA2560 +#include "env_validate.h" + +#if HOTENDS > 5 || E_STEPPERS > 5 #error "Azteeg X3 Pro supports up to 5 hotends / E-steppers. Comment out this line to continue." #endif diff --git a/Marlin/src/pins/ramps/pins_BQ_ZUM_MEGA_3D.h b/Marlin/src/pins/ramps/pins_BQ_ZUM_MEGA_3D.h index f120e9c44f..99cf484de7 100644 --- a/Marlin/src/pins/ramps/pins_BQ_ZUM_MEGA_3D.h +++ b/Marlin/src/pins/ramps/pins_BQ_ZUM_MEGA_3D.h @@ -25,9 +25,8 @@ * bq ZUM Mega 3D board definition */ -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif +#define REQUIRE_MEGA2560 +#include "env_validate.h" #define BOARD_INFO_NAME "ZUM Mega 3D" diff --git a/Marlin/src/pins/ramps/pins_DUPLICATOR_I3_PLUS.h b/Marlin/src/pins/ramps/pins_DUPLICATOR_I3_PLUS.h index 93ec3d6070..1a4b83f02d 100644 --- a/Marlin/src/pins/ramps/pins_DUPLICATOR_I3_PLUS.h +++ b/Marlin/src/pins/ramps/pins_DUPLICATOR_I3_PLUS.h @@ -25,9 +25,8 @@ * Wanhao Duplicator i3 Plus pin assignments */ -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif +#define REQUIRE_MEGA2560 +#include "env_validate.h" #define BOARD_INFO_NAME "Duplicator i3 Plus" diff --git a/Marlin/src/pins/ramps/pins_FORMBOT_RAPTOR.h b/Marlin/src/pins/ramps/pins_FORMBOT_RAPTOR.h index 5b724787e9..383501caaa 100644 --- a/Marlin/src/pins/ramps/pins_FORMBOT_RAPTOR.h +++ b/Marlin/src/pins/ramps/pins_FORMBOT_RAPTOR.h @@ -25,9 +25,10 @@ * Formbot Raptor pin assignments */ -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#elif HOTENDS > 3 || E_STEPPERS > 3 +#define REQUIRE_MEGA2560 +#include "env_validate.h" + +#if HOTENDS > 3 || E_STEPPERS > 3 #error "Formbot supports up to 3 hotends / E-steppers. Comment out this line to continue." #endif diff --git a/Marlin/src/pins/ramps/pins_FORMBOT_TREX2PLUS.h b/Marlin/src/pins/ramps/pins_FORMBOT_TREX2PLUS.h index 81b6ea16d7..ac0b7428f4 100644 --- a/Marlin/src/pins/ramps/pins_FORMBOT_TREX2PLUS.h +++ b/Marlin/src/pins/ramps/pins_FORMBOT_TREX2PLUS.h @@ -25,9 +25,10 @@ * Formbot pin assignments */ -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#elif HOTENDS > 2 || E_STEPPERS > 2 +#define REQUIRE_MEGA2560 +#include "env_validate.h" + +#if HOTENDS > 2 || E_STEPPERS > 2 #error "Formbot supports up to 2 hotends / E-steppers. Comment out this line to continue." #endif diff --git a/Marlin/src/pins/ramps/pins_FORMBOT_TREX3.h b/Marlin/src/pins/ramps/pins_FORMBOT_TREX3.h index a97b0d2d12..76a9fbe628 100644 --- a/Marlin/src/pins/ramps/pins_FORMBOT_TREX3.h +++ b/Marlin/src/pins/ramps/pins_FORMBOT_TREX3.h @@ -25,9 +25,10 @@ * Formbot pin assignments */ -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#elif HOTENDS > 2 || E_STEPPERS > 2 +#define REQUIRE_MEGA2560 +#include "env_validate.h" + +#if HOTENDS > 2 || E_STEPPERS > 2 #error "Formbot supports up to 2 hotends / E-steppers. Comment out this line to continue." #endif diff --git a/Marlin/src/pins/ramps/pins_K8800.h b/Marlin/src/pins/ramps/pins_K8800.h index 5388c9621d..9bc74943b4 100644 --- a/Marlin/src/pins/ramps/pins_K8800.h +++ b/Marlin/src/pins/ramps/pins_K8800.h @@ -25,9 +25,7 @@ * Velleman K8800 (Vertex) */ -#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "K8800" #define DEFAULT_MACHINE_NAME "Vertex Delta" diff --git a/Marlin/src/pins/ramps/pins_LONGER3D_LKx_PRO.h b/Marlin/src/pins/ramps/pins_LONGER3D_LKx_PRO.h index 6fcb7b94e0..2fd599e619 100644 --- a/Marlin/src/pins/ramps/pins_LONGER3D_LKx_PRO.h +++ b/Marlin/src/pins/ramps/pins_LONGER3D_LKx_PRO.h @@ -25,9 +25,10 @@ * Longer3D LK1/LK4/LK5 Pro board pin assignments */ -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#elif HOTENDS > 1 || E_STEPPERS > 1 +#define REQUIRE_MEGA2560 +#include "env_validate.h" + +#if HOTENDS > 1 || E_STEPPERS > 1 #error "Longer3D LGT KIT V1.0 board only supports one hotend / E-stepper. Comment out this line to continue." #endif @@ -42,9 +43,6 @@ #warning "Serial 3 is originally reserved to Y limit switches. Hardware changes are required to use it." #endif -// Custom flags and defines for the build -//#define BOARD_CUSTOM_BUILD_FLAGS -D__FOO__ - #define BOARD_INFO_NAME "LGT KIT V1.0" // diff --git a/Marlin/src/pins/ramps/pins_RAMPS.h b/Marlin/src/pins/ramps/pins_RAMPS.h index fe416dfb68..f56a9ec38e 100644 --- a/Marlin/src/pins/ramps/pins_RAMPS.h +++ b/Marlin/src/pins/ramps/pins_RAMPS.h @@ -45,18 +45,7 @@ * 7 | 11 */ -#ifdef TARGET_LPC1768 - #error "Oops! Set MOTHERBOARD to an LPC1768-based board when building for LPC1768." -#elif defined(__STM32F1__) - #error "Oops! Set MOTHERBOARD to an STM32F1-based board when building for STM32F1." -#endif - -#if NOT_TARGET(IS_RAMPS_SMART, IS_RAMPS_DUO, IS_RAMPS4DUE, TARGET_LPC1768, __AVR_ATmega1280__, __AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' (or other appropriate target) in 'Tools > Board.'" -#endif - -// Custom flags and defines for the build -//#define BOARD_CUSTOM_BUILD_FLAGS -D__FOO__ +#include "env_validate.h" #ifndef BOARD_INFO_NAME #define BOARD_INFO_NAME "RAMPS 1.4" diff --git a/Marlin/src/pins/ramps/pins_RAMPS_OLD.h b/Marlin/src/pins/ramps/pins_RAMPS_OLD.h index 6d2dad2314..a43ee3c6ca 100644 --- a/Marlin/src/pins/ramps/pins_RAMPS_OLD.h +++ b/Marlin/src/pins/ramps/pins_RAMPS_OLD.h @@ -25,9 +25,7 @@ * Arduino Mega with RAMPS v1.0, v1.1, v1.2 pin assignments */ -#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "RAMPS <1.2" diff --git a/Marlin/src/pins/ramps/pins_RAMPS_PLUS.h b/Marlin/src/pins/ramps/pins_RAMPS_PLUS.h index 23b1dfa346..43a769b34d 100644 --- a/Marlin/src/pins/ramps/pins_RAMPS_PLUS.h +++ b/Marlin/src/pins/ramps/pins_RAMPS_PLUS.h @@ -37,9 +37,7 @@ * RAMPS_PLUS_SF (Spindle, Controller Fan) */ -#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "RAMPS 1.4 Plus" diff --git a/Marlin/src/pins/ramps/pins_RAMPS_S_12.h b/Marlin/src/pins/ramps/pins_RAMPS_S_12.h index 1bcf310bc1..62b6e3ff94 100644 --- a/Marlin/src/pins/ramps/pins_RAMPS_S_12.h +++ b/Marlin/src/pins/ramps/pins_RAMPS_S_12.h @@ -34,12 +34,7 @@ * Other pins_MYBOARD.h files may override these defaults */ -#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif - -// Custom flags and defines for the build -//#define BOARD_CUSTOM_BUILD_FLAGS -D__FOO__ +#include "env_validate.h" #ifndef BOARD_INFO_NAME #define BOARD_INFO_NAME "RAMPS S 1.2" diff --git a/Marlin/src/pins/ramps/pins_RUMBA.h b/Marlin/src/pins/ramps/pins_RUMBA.h index 4af49d9164..942afafd7a 100644 --- a/Marlin/src/pins/ramps/pins_RUMBA.h +++ b/Marlin/src/pins/ramps/pins_RUMBA.h @@ -25,9 +25,10 @@ * RUMBA pin assignments */ -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#elif HOTENDS > 3 || E_STEPPERS > 3 +#define REQUIRE_MEGA2560 +#include "env_validate.h" + +#if HOTENDS > 3 || E_STEPPERS > 3 #error "RUMBA supports up to 3 hotends / E-steppers. Comment out this line to continue." #endif diff --git a/Marlin/src/pins/ramps/pins_TENLOG_D3_HERO.h b/Marlin/src/pins/ramps/pins_TENLOG_D3_HERO.h index 84e7e31126..53e419af00 100644 --- a/Marlin/src/pins/ramps/pins_TENLOG_D3_HERO.h +++ b/Marlin/src/pins/ramps/pins_TENLOG_D3_HERO.h @@ -25,9 +25,10 @@ * Tenlog pin assignments */ -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#elif HOTENDS > 2 || E_STEPPERS > 2 +#define REQUIRE_MEGA2560 +#include "env_validate.h" + +#if HOTENDS > 2 || E_STEPPERS > 2 #error "Tenlog supports up to 2 hotends / E-steppers. Comment out this line to continue." #endif diff --git a/Marlin/src/pins/ramps/pins_TRONXY_V3_1_0.h b/Marlin/src/pins/ramps/pins_TRONXY_V3_1_0.h index f342eff8aa..ffe6d56eb8 100644 --- a/Marlin/src/pins/ramps/pins_TRONXY_V3_1_0.h +++ b/Marlin/src/pins/ramps/pins_TRONXY_V3_1_0.h @@ -25,9 +25,10 @@ * Arduino Mega for Tronxy X5S-2E, etc. */ -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#elif HOTENDS > 2 || E_STEPPERS > 2 +#define REQUIRE_MEGA2560 +#include "env_validate.h" + +#if HOTENDS > 2 || E_STEPPERS > 2 #error "TRONXY-V3-1.0 supports only 2 hotends/E-steppers. Comment out this line to continue." #endif diff --git a/Marlin/src/pins/ramps/pins_TT_OSCAR.h b/Marlin/src/pins/ramps/pins_TT_OSCAR.h index ca402553e1..18d0f1770e 100644 --- a/Marlin/src/pins/ramps/pins_TT_OSCAR.h +++ b/Marlin/src/pins/ramps/pins_TT_OSCAR.h @@ -20,9 +20,7 @@ * */ -#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif +#include "env_validate.h" #if HOTENDS > 5 || E_STEPPERS > 5 #error "TTOSCAR supports up to 5 hotends / E-steppers. Comment out this line to continue." diff --git a/Marlin/src/pins/ramps/pins_ULTIMAIN_2.h b/Marlin/src/pins/ramps/pins_ULTIMAIN_2.h index 211caddba0..128f1974e0 100644 --- a/Marlin/src/pins/ramps/pins_ULTIMAIN_2.h +++ b/Marlin/src/pins/ramps/pins_ULTIMAIN_2.h @@ -33,9 +33,8 @@ * case light */ -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif +#define REQUIRE_MEGA2560 +#include "env_validate.h" #define BOARD_INFO_NAME "Ultimaker 2.x" #define DEFAULT_MACHINE_NAME "Ultimaker" diff --git a/Marlin/src/pins/ramps/pins_ULTIMAKER.h b/Marlin/src/pins/ramps/pins_ULTIMAKER.h index 22c7fd95b4..0bc04d962a 100644 --- a/Marlin/src/pins/ramps/pins_ULTIMAKER.h +++ b/Marlin/src/pins/ramps/pins_ULTIMAKER.h @@ -33,9 +33,7 @@ * case light */ -#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "Ultimaker" #define DEFAULT_MACHINE_NAME BOARD_INFO_NAME diff --git a/Marlin/src/pins/ramps/pins_ULTIMAKER_OLD.h b/Marlin/src/pins/ramps/pins_ULTIMAKER_OLD.h index 37c28ece4c..091356a11f 100644 --- a/Marlin/src/pins/ramps/pins_ULTIMAKER_OLD.h +++ b/Marlin/src/pins/ramps/pins_ULTIMAKER_OLD.h @@ -60,9 +60,7 @@ //#define BOARD_REV_1_0 //#define BOARD_REV_1_5 -#if NOT_TARGET(__AVR_ATmega1280__, __AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif +#include "env_validate.h" #ifdef BOARD_REV_1_1_TO_1_3 #define BOARD_INFO_NAME "Ultimaker 1.1-1.3" diff --git a/Marlin/src/pins/ramps/pins_Z_BOLT_X_SERIES.h b/Marlin/src/pins/ramps/pins_Z_BOLT_X_SERIES.h index 096d970871..26ad5fd658 100644 --- a/Marlin/src/pins/ramps/pins_Z_BOLT_X_SERIES.h +++ b/Marlin/src/pins/ramps/pins_Z_BOLT_X_SERIES.h @@ -25,9 +25,10 @@ * Z-Bolt X Series board – based on Arduino Mega2560 */ -#if NOT_TARGET(__AVR_ATmega2560__) - #error "Oops! Select 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#elif HOTENDS > 4 || E_STEPPERS > 4 +#define REQUIRE_MEGA2560 +#include "env_validate.h" + +#if HOTENDS > 4 || E_STEPPERS > 4 #error "Z-Bolt X Series board supports up to 4 hotends / E-steppers." #endif diff --git a/Marlin/src/pins/sam/env_validate.h b/Marlin/src/pins/sam/env_validate.h new file mode 100644 index 0000000000..09bcd13649 --- /dev/null +++ b/Marlin/src/pins/sam/env_validate.h @@ -0,0 +1,33 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 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 + +#if BOTH(ALLOW_MEGA1280, ALLOW_MEGA2560) && NOT_TARGET(__SAM3X8E__, __AVR_ATmega1280__, __AVR_ATmega2560__) + #error "Oops! Select 'Arduino Due or Mega' in 'Tools > Board.'" +#elif ENABLED(ALLOW_MEGA2560) && NOT_TARGET(__SAM3X8E__, __AVR_ATmega2560__) + #error "Oops! Select 'Arduino Due or Mega' in 'Tools > Board.'" +#elif ENABLED(ALLOW_MEGA1280) && NOT_TARGET(__SAM3X8E__, __AVR_ATmega1280__) + #error "Oops! Select 'Arduino Due' in 'Tools > Board.'" +#endif + +#undef ALLOW_MEGA1280 +#undef ALLOW_MEGA2560 diff --git a/Marlin/src/pins/sam/pins_ADSK.h b/Marlin/src/pins/sam/pins_ADSK.h index b0e171cf17..9026ca7771 100644 --- a/Marlin/src/pins/sam/pins_ADSK.h +++ b/Marlin/src/pins/sam/pins_ADSK.h @@ -27,9 +27,9 @@ #define BOARD_INFO_NAME "ADSK" -#if NOT_TARGET(__SAM3X8E__, __AVR_ATmega1280__, __AVR_ATmega2560__) - #error "Oops! Select 'Arduino Due or Mega' in 'Tools > Board.'" -#endif +#define ALLOW_MEGA1280 +#define ALLOW_MEGA2560 +#include "env_validate.h" /* CNC shield modifications: FROM THE BOTTOM CUT THE 5V PIN THAT GOES TO ARDUINO!!! diff --git a/Marlin/src/pins/sam/pins_ALLIGATOR_R2.h b/Marlin/src/pins/sam/pins_ALLIGATOR_R2.h index b01d1aafdf..c273edfc6b 100644 --- a/Marlin/src/pins/sam/pins_ALLIGATOR_R2.h +++ b/Marlin/src/pins/sam/pins_ALLIGATOR_R2.h @@ -26,9 +26,7 @@ * https://reprap.org/wiki/Alligator_Board */ -#if NOT_TARGET(__SAM3X8E__) - #error "Oops! Select 'Arduino Due' in 'Tools > Board.'" -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "Alligator Board R2" diff --git a/Marlin/src/pins/sam/pins_CNCONTROLS_15D.h b/Marlin/src/pins/sam/pins_CNCONTROLS_15D.h index 5bf31450b7..a63c337880 100644 --- a/Marlin/src/pins/sam/pins_CNCONTROLS_15D.h +++ b/Marlin/src/pins/sam/pins_CNCONTROLS_15D.h @@ -24,9 +24,7 @@ * CNControls V15 for HMS434 with DUE pin assignments */ -#if NOT_TARGET(__SAM3X8E__) - #error "Oops! Select 'Arduino Due' in 'Tools > Board.'" -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "CN Controls V15D" diff --git a/Marlin/src/pins/sam/pins_DUE3DOM.h b/Marlin/src/pins/sam/pins_DUE3DOM.h index 90d6bdc340..4ebece58e4 100644 --- a/Marlin/src/pins/sam/pins_DUE3DOM.h +++ b/Marlin/src/pins/sam/pins_DUE3DOM.h @@ -25,9 +25,7 @@ * DUE3DOM pin assignments */ -#if NOT_TARGET(__SAM3X8E__) - #error "Oops! Select 'Arduino Due' in 'Tools > Board.'" -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "DUE3DOM" diff --git a/Marlin/src/pins/sam/pins_DUE3DOM_MINI.h b/Marlin/src/pins/sam/pins_DUE3DOM_MINI.h index 5a205423ed..dd8f263676 100644 --- a/Marlin/src/pins/sam/pins_DUE3DOM_MINI.h +++ b/Marlin/src/pins/sam/pins_DUE3DOM_MINI.h @@ -25,9 +25,7 @@ * DUE3DOM MINI pin assignments */ -#if NOT_TARGET(__SAM3X8E__) - #error "Oops! Select 'Arduino Due' in 'Tools > Board.'" -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "DUE3DOM MINI" diff --git a/Marlin/src/pins/sam/pins_PRINTRBOARD_G2.h b/Marlin/src/pins/sam/pins_PRINTRBOARD_G2.h index 424d858a85..874950f34b 100644 --- a/Marlin/src/pins/sam/pins_PRINTRBOARD_G2.h +++ b/Marlin/src/pins/sam/pins_PRINTRBOARD_G2.h @@ -25,9 +25,7 @@ * PRINTRBOARD_G2 */ -#if NOT_TARGET(__SAM3X8E__) - #error "Oops! Select 'Arduino Due' in 'Tools > Board.'" -#endif +#include "env_validate.h" #ifndef BOARD_INFO_NAME #define BOARD_INFO_NAME "Printrboard G2" diff --git a/Marlin/src/pins/sam/pins_RADDS.h b/Marlin/src/pins/sam/pins_RADDS.h index 7b9c7f1b28..7b0ec5ab68 100644 --- a/Marlin/src/pins/sam/pins_RADDS.h +++ b/Marlin/src/pins/sam/pins_RADDS.h @@ -25,9 +25,7 @@ * RADDS */ -#if NOT_TARGET(__SAM3X8E__) - #error "Oops! Select 'Arduino Due' in 'Tools > Board.'" -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "RADDS" diff --git a/Marlin/src/pins/sam/pins_RAMPS4DUE.h b/Marlin/src/pins/sam/pins_RAMPS4DUE.h index 54548333b5..6d9d06a175 100644 --- a/Marlin/src/pins/sam/pins_RAMPS4DUE.h +++ b/Marlin/src/pins/sam/pins_RAMPS4DUE.h @@ -39,14 +39,9 @@ * A15 | NC */ -#if NOT_TARGET(__SAM3X8E__, __AVR_ATmega2560__) - #error "Oops! Select 'Arduino Due' or 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif - +#define ALLOW_SAM3X8E #define BOARD_INFO_NAME "RAMPS4DUE" -#define IS_RAMPS4DUE - // // Temperature Sensors // diff --git a/Marlin/src/pins/sam/pins_RAMPS_DUO.h b/Marlin/src/pins/sam/pins_RAMPS_DUO.h index d2ab5c96b2..b1a6680c50 100644 --- a/Marlin/src/pins/sam/pins_RAMPS_DUO.h +++ b/Marlin/src/pins/sam/pins_RAMPS_DUO.h @@ -43,14 +43,9 @@ * A15 | A11 */ -#if NOT_TARGET(__SAM3X8E__, __AVR_ATmega2560__) - #error "Oops! Select 'Arduino Due' or 'Arduino/Genuino Mega or Mega 2560' in 'Tools > Board.'" -#endif - #define BOARD_INFO_NAME "RAMPS Duo" -#define IS_RAMPS_DUO - +#define ALLOW_SAM3X8E #include "../ramps/pins_RAMPS.h" // diff --git a/Marlin/src/pins/sam/pins_RAMPS_FD_V1.h b/Marlin/src/pins/sam/pins_RAMPS_FD_V1.h index 80e8f0dc7e..e4c53530f7 100644 --- a/Marlin/src/pins/sam/pins_RAMPS_FD_V1.h +++ b/Marlin/src/pins/sam/pins_RAMPS_FD_V1.h @@ -28,9 +28,7 @@ * Use 4k7 thermistor tables */ -#if NOT_TARGET(__SAM3X8E__) - #error "Oops! Select 'Arduino Due' in 'Tools > Board.'" -#endif +#include "env_validate.h" #ifndef BOARD_INFO_NAME #define BOARD_INFO_NAME "RAMPS-FD v1" diff --git a/Marlin/src/pins/sam/pins_RAMPS_SMART.h b/Marlin/src/pins/sam/pins_RAMPS_SMART.h index 17dd32399a..3882dfb944 100644 --- a/Marlin/src/pins/sam/pins_RAMPS_SMART.h +++ b/Marlin/src/pins/sam/pins_RAMPS_SMART.h @@ -60,12 +60,8 @@ * (Search the web for "Arduino DUE Board Pinout" to see the correct header.) */ -#if NOT_TARGET(__SAM3X8E__, __AVR_ATmega2560__) - #error "Oops! Select 'Arduino Due' or 'Mega 2560' in 'Tools > Board.'" -#endif - #define BOARD_INFO_NAME "RAMPS-SMART" -#define IS_RAMPS_SMART +#define ALLOW_SAM3X8E #include "../ramps/pins_RAMPS.h" // I2C EEPROM with 4K of space diff --git a/Marlin/src/pins/sam/pins_RURAMPS4D_11.h b/Marlin/src/pins/sam/pins_RURAMPS4D_11.h index 6a283401f4..908bbc6b22 100644 --- a/Marlin/src/pins/sam/pins_RURAMPS4D_11.h +++ b/Marlin/src/pins/sam/pins_RURAMPS4D_11.h @@ -32,9 +32,7 @@ * | */ -#if NOT_TARGET(__SAM3X8E__) - #error "Oops! Select 'Arduino Due' in 'Tools > Board.'" -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "RuRAMPS4Due v1.1" diff --git a/Marlin/src/pins/sam/pins_RURAMPS4D_13.h b/Marlin/src/pins/sam/pins_RURAMPS4D_13.h index 6ec10f64af..3e73c33acb 100644 --- a/Marlin/src/pins/sam/pins_RURAMPS4D_13.h +++ b/Marlin/src/pins/sam/pins_RURAMPS4D_13.h @@ -32,9 +32,7 @@ * | */ -#if NOT_TARGET(__SAM3X8E__) - #error "Oops! Select 'Arduino Due' in 'Tools > Board.'" -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "RuRAMPS4Due v1.3" diff --git a/Marlin/src/pins/sam/pins_ULTRATRONICS_PRO.h b/Marlin/src/pins/sam/pins_ULTRATRONICS_PRO.h index ea096187f7..e567b0f5e1 100644 --- a/Marlin/src/pins/sam/pins_ULTRATRONICS_PRO.h +++ b/Marlin/src/pins/sam/pins_ULTRATRONICS_PRO.h @@ -26,9 +26,7 @@ * https://reprapworld.com/documentation/datasheet_ultratronics10_05.pdf */ -#if NOT_TARGET(ARDUINO_ARCH_SAM) - #error "Oops! Select 'Arduino Due' in 'Tools > Board.'" -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "Ultratronics v1.0" diff --git a/Marlin/src/pins/sanguino/env_validate.h b/Marlin/src/pins/sanguino/env_validate.h new file mode 100644 index 0000000000..d229b6f102 --- /dev/null +++ b/Marlin/src/pins/sanguino/env_validate.h @@ -0,0 +1,42 @@ + /** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 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 + +#if ENABLED(ALLOW_MEGA644) + #if NOT_TARGET(__AVR_ATmega644__, __AVR_ATmega644P__, __AVR_ATmega1284P__) + #error "Oops! Select 'Sanguino' in 'Tools > Boards' and 'ATmega644', 'ATmega644P', or 'ATmega1284P' in 'Tools > Processor.'" + #endif +#elif ENABLED(ALLOW_MEGA644P) + #if NOT_TARGET(__AVR_ATmega644P__, __AVR_ATmega1284P__) + #error "Oops! Select 'Sanguino' in 'Tools > Boards' and 'ATmega644P' or 'ATmega1284P' in 'Tools > Processor.'" + #endif +#elif ENABLED(REQUIRE_MEGA644P) + #if NOT_TARGET(__AVR_ATmega644P__) + #error "Oops! Select 'Sanguino' in 'Tools > Board' and 'ATmega644P' in 'Tools > Processor.'" + #endif +#elif NOT_TARGET(__AVR_ATmega1284P__) + #error "Oops! Select 'Sanguino' in 'Tools > Board' and 'ATmega1284P' in 'Tools > Processor.' (For PlatformIO, use 'melzi' or 'melzi_optiboot.')" +#endif + +#undef ALLOW_MEGA644 +#undef ALLOW_MEGA644P +#undef REQUIRE_MEGA644P diff --git a/Marlin/src/pins/sanguino/pins_GEN3_MONOLITHIC.h b/Marlin/src/pins/sanguino/pins_GEN3_MONOLITHIC.h index 29905c1089..1343739a11 100644 --- a/Marlin/src/pins/sanguino/pins_GEN3_MONOLITHIC.h +++ b/Marlin/src/pins/sanguino/pins_GEN3_MONOLITHIC.h @@ -48,9 +48,8 @@ * Once installed select the Sanguino board and then select the CPU. */ -#if NOT_TARGET(__AVR_ATmega644P__) - #error "Oops! Select 'Sanguino' in 'Tools > Board.'" -#endif +#define REQUIRE_MEGA644P +#include "env_validate.h" #define BOARD_INFO_NAME "Gen3 Monolithic" #define DEBUG_PIN 0 diff --git a/Marlin/src/pins/sanguino/pins_GEN3_PLUS.h b/Marlin/src/pins/sanguino/pins_GEN3_PLUS.h index 33fc233f7a..7cab1bd762 100644 --- a/Marlin/src/pins/sanguino/pins_GEN3_PLUS.h +++ b/Marlin/src/pins/sanguino/pins_GEN3_PLUS.h @@ -48,9 +48,8 @@ * Once installed select the SANGUINO board and then select the CPU. */ -#if NOT_TARGET(__AVR_ATmega644P__, __AVR_ATmega1284P__) - #error "Oops! Select 'Sanguino' in 'Tools > Boards' and 'ATmega644P' or 'ATmega1284P' in 'Tools > Processor.'" -#endif +#define ALLOW_MEGA644P +#include "env_validate.h" #define BOARD_INFO_NAME "Gen3+" diff --git a/Marlin/src/pins/sanguino/pins_GEN6.h b/Marlin/src/pins/sanguino/pins_GEN6.h index bfca8e90d9..51e8200b95 100644 --- a/Marlin/src/pins/sanguino/pins_GEN6.h +++ b/Marlin/src/pins/sanguino/pins_GEN6.h @@ -50,9 +50,8 @@ * Once installed select the Sanguino board and then select the CPU. */ -#if NOT_TARGET(__AVR_ATmega644P__, __AVR_ATmega1284P__) - #error "Oops! Select 'Sanguino' in 'Tools > Boards' and 'ATmega644P' or 'ATmega1284P' in 'Tools > Processor.'" -#endif +#define ALLOW_MEGA644P +#include "env_validate.h" #ifndef BOARD_INFO_NAME #define BOARD_INFO_NAME "Gen6" diff --git a/Marlin/src/pins/sanguino/pins_GEN7_12.h b/Marlin/src/pins/sanguino/pins_GEN7_12.h index 9db7d7214a..0834da78c4 100644 --- a/Marlin/src/pins/sanguino/pins_GEN7_12.h +++ b/Marlin/src/pins/sanguino/pins_GEN7_12.h @@ -50,9 +50,8 @@ * Once installed select the Sanguino board and then select the CPU. */ -#if NOT_TARGET(__AVR_ATmega644P__, __AVR_ATmega644__, __AVR_ATmega1284P__) - #error "Oops! Select 'Sanguino' in 'Tools > Boards' and 'ATmega644', 'ATmega644P', or 'ATmega1284P' in 'Tools > Processor.'" -#endif +#define ALLOW_MEGA644 +#include "env_validate.h" #ifndef BOARD_INFO_NAME #define BOARD_INFO_NAME "Gen7 v1.1 / 1.2" diff --git a/Marlin/src/pins/sanguino/pins_GEN7_14.h b/Marlin/src/pins/sanguino/pins_GEN7_14.h index 66dba533e9..97bfdd28a7 100644 --- a/Marlin/src/pins/sanguino/pins_GEN7_14.h +++ b/Marlin/src/pins/sanguino/pins_GEN7_14.h @@ -50,9 +50,8 @@ * Once installed select the Sanguino board and then select the CPU. */ -#if NOT_TARGET(__AVR_ATmega644P__, __AVR_ATmega644__, __AVR_ATmega1284P__) - #error "Oops! Select 'Sanguino' in 'Tools > Boards' and 'ATmega644', 'ATmega644P', or 'ATmega1284P' in 'Tools > Processor.'" -#endif +#define ALLOW_MEGA644 +#include "env_validate.h" #define BOARD_INFO_NAME "Gen7 v1.4" diff --git a/Marlin/src/pins/sanguino/pins_GEN7_CUSTOM.h b/Marlin/src/pins/sanguino/pins_GEN7_CUSTOM.h index 0c4871fb27..6d7678e6e3 100644 --- a/Marlin/src/pins/sanguino/pins_GEN7_CUSTOM.h +++ b/Marlin/src/pins/sanguino/pins_GEN7_CUSTOM.h @@ -53,9 +53,8 @@ * Once installed select the Sanguino board and then select the CPU. */ -#if NOT_TARGET(__AVR_ATmega644P__, __AVR_ATmega644__, __AVR_ATmega1284P__) - #error "Oops! Select 'Sanguino' in 'Tools > Boards' and 'ATmega644', 'ATmega644P', or 'ATmega1284P' in 'Tools > Processor.'" -#endif +#define ALLOW_MEGA644 +#include "env_validate.h" #define BOARD_INFO_NAME "Gen7 Custom" diff --git a/Marlin/src/pins/sanguino/pins_OMCA_A.h b/Marlin/src/pins/sanguino/pins_OMCA_A.h index 7707320519..a3ceb76a0d 100644 --- a/Marlin/src/pins/sanguino/pins_OMCA_A.h +++ b/Marlin/src/pins/sanguino/pins_OMCA_A.h @@ -74,7 +74,7 @@ */ #if NOT_TARGET(__AVR_ATmega644__) - #error "Oops! Select 'Sanguino' in 'Tools > Board' and ATmega644 in 'Tools > Processor.'" + #error "Oops! Select 'Sanguino' in 'Tools > Board' and 'ATmega644' in 'Tools > Processor.'" #endif #define BOARD_INFO_NAME "Alpha OMCA" diff --git a/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_11.h b/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_11.h index af27159936..d79ad7a3dd 100644 --- a/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_11.h +++ b/Marlin/src/pins/sanguino/pins_SANGUINOLOLU_11.h @@ -50,9 +50,8 @@ * Once installed select the Sanguino board and then select the CPU. */ -#if NOT_TARGET(__AVR_ATmega644P__, __AVR_ATmega1284P__) - #error "Oops! Select 'Sanguino' in 'Tools > Boards' and 'ATmega644P' or 'ATmega1284P' in 'Tools > Processor.'" -#endif +#define ALLOW_MEGA644P +#include "env_validate.h" #ifndef BOARD_INFO_NAME #define BOARD_INFO_NAME "Sanguinololu <1.2" diff --git a/Marlin/src/pins/sanguino/pins_SETHI.h b/Marlin/src/pins/sanguino/pins_SETHI.h index dc2133e441..a2240b385b 100644 --- a/Marlin/src/pins/sanguino/pins_SETHI.h +++ b/Marlin/src/pins/sanguino/pins_SETHI.h @@ -49,9 +49,8 @@ * Once installed select the Sanguino board and then select the CPU. */ -#if NOT_TARGET(__AVR_ATmega644P__, __AVR_ATmega644__, __AVR_ATmega1284P__) - #error "Oops! Select 'Sanguino' in 'Tools > Boards' and 'ATmega644', 'ATmega644P', or 'ATmega1284P' in 'Tools > Processor.'" -#endif +#define ALLOW_MEGA644 +#include "env_validate.h" #define BOARD_INFO_NAME "Sethi 3D_1" diff --git a/Marlin/src/pins/sanguino/pins_ZMIB_V2.h b/Marlin/src/pins/sanguino/pins_ZMIB_V2.h index d064d80132..0265ae0a64 100644 --- a/Marlin/src/pins/sanguino/pins_ZMIB_V2.h +++ b/Marlin/src/pins/sanguino/pins_ZMIB_V2.h @@ -21,9 +21,8 @@ */ #pragma once -#if NOT_TARGET(__AVR_ATmega644P__, __AVR_ATmega1284P__) - #error "Oops! Select 'Sanguino' in 'Tools > Boards' and 'ATmega644P' or 'ATmega1284P' in 'Tools > Processor.'" -#endif +#define ALLOW_MEGA644P +#include "env_validate.h" #define BOARD_INFO_NAME "Zonestar ZMIB_V2" #define BOARD_WEBSITE_URL "www.aliexpress.com/item/32957490744.html" diff --git a/Marlin/src/pins/stm32f1/env_validate.h b/Marlin/src/pins/stm32f1/env_validate.h new file mode 100644 index 0000000000..62ccf7edcc --- /dev/null +++ b/Marlin/src/pins/stm32f1/env_validate.h @@ -0,0 +1,26 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 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 + +#if NOT_TARGET(__STM32F1__) + #error "Oops! Select an STM32F1 board in 'Tools > Board.'" +#endif diff --git a/Marlin/src/pins/stm32f1/pins_BEAST.h b/Marlin/src/pins/stm32f1/pins_BEAST.h index bf2cf6463a..05f77f1029 100644 --- a/Marlin/src/pins/stm32f1/pins_BEAST.h +++ b/Marlin/src/pins/stm32f1/pins_BEAST.h @@ -21,9 +21,7 @@ */ #pragma once -#if NOT_TARGET(__STM32F1__) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#endif +#include "env_validate.h" /** * 21017 Victor Perez Marlin for stm32f1 test diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_CR6.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_CR6.h index 73a18faf05..e76c77e706 100644 --- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_CR6.h +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_CR6.h @@ -28,9 +28,7 @@ #define DEFAULT_MACHINE_NAME "Creality3D" #define BOARD_INFO_NAME "BTT SKR CR-6" -#if NOT_TARGET(__STM32F1__) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#endif +#include "env_validate.h" // // Release PB4 (Z_STEP_PIN) from JTAG NRST role diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D.h b/Marlin/src/pins/stm32f1/pins_CHITU3D.h index bb6f571924..dd6edf9024 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D.h @@ -21,9 +21,7 @@ */ #pragma once -#if NOT_TARGET(__STM32F1__) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#endif +#include "env_validate.h" /** * 2017 Victor Perez Marlin for stm32f1 test diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h index c90ae84acb..d25a1f34f9 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V5.h @@ -21,9 +21,7 @@ */ #pragma once -#if NOT_TARGET(__STM32F1__) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#endif +#include "env_validate.h" /** * 2017 Victor Perez Marlin for stm32f1 test diff --git a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h index 96cf36629a..5afa653117 100644 --- a/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h +++ b/Marlin/src/pins/stm32f1/pins_CHITU3D_V6.h @@ -21,9 +21,7 @@ */ #pragma once -#if NOT_TARGET(__STM32F1__) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#endif +#include "env_validate.h" /** * 2017 Victor Perez Marlin for stm32f1 test diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h index 88806bdb18..733e24cfac 100644 --- a/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h +++ b/Marlin/src/pins/stm32f1/pins_CREALITY_V4.h @@ -24,9 +24,9 @@ * Creality 4.2.x (STM32F103RET6) board pin assignments */ -#if NOT_TARGET(__STM32F1__) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#elif HOTENDS > 1 || E_STEPPERS > 1 +#include "env_validate.h" + +#if HOTENDS > 1 || E_STEPPERS > 1 #error "Creality V4 only supports one hotend / E-stepper. Comment out this line to continue." #endif diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V4210.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V4210.h index 025e68d4da..6585d40d45 100644 --- a/Marlin/src/pins/stm32f1/pins_CREALITY_V4210.h +++ b/Marlin/src/pins/stm32f1/pins_CREALITY_V4210.h @@ -24,9 +24,9 @@ * CREALITY 4.2.10 (STM32F103) board pin assignments */ -#if NOT_TARGET(__STM32F1__) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#elif HOTENDS > 1 || E_STEPPERS > 1 +#include "env_validate.h" + +#if HOTENDS > 1 || E_STEPPERS > 1 #error "CREALITY supports up to 1 hotends / E-steppers. Comment out this line to continue." #endif diff --git a/Marlin/src/pins/stm32f1/pins_CREALITY_V45x.h b/Marlin/src/pins/stm32f1/pins_CREALITY_V45x.h index f2be289530..c73c92080e 100644 --- a/Marlin/src/pins/stm32f1/pins_CREALITY_V45x.h +++ b/Marlin/src/pins/stm32f1/pins_CREALITY_V45x.h @@ -24,9 +24,7 @@ * Creality v4.5.2 and v4.5.3 (STM32F103RET6) board pin assignments */ -#if NOT_TARGET(__STM32F1__) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#endif +#include "env_validate.h" #define DEFAULT_MACHINE_NAME "Creality3D" diff --git a/Marlin/src/pins/stm32f1/pins_FLY_MINI.h b/Marlin/src/pins/stm32f1/pins_FLY_MINI.h index 2278d55870..b94ec0c7f3 100644 --- a/Marlin/src/pins/stm32f1/pins_FLY_MINI.h +++ b/Marlin/src/pins/stm32f1/pins_FLY_MINI.h @@ -21,9 +21,7 @@ */ #pragma once -#if NOT_TARGET(__STM32F1__) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "FLY_MINI" #define BOARD_WEBSITE_URL "github.com/FLYmaker" diff --git a/Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h b/Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h index 3919723f37..7ffe67c4f8 100644 --- a/Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h +++ b/Marlin/src/pins/stm32f1/pins_FYSETC_AIO_II.h @@ -21,9 +21,7 @@ */ #pragma once -#if NOT_TARGET(__STM32F1__) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "FYSETC AIO II" #define BOARD_WEBSITE_URL "fysetc.com" diff --git a/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h b/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h index c978092ab2..552ad9ac57 100644 --- a/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h +++ b/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH.h @@ -21,9 +21,7 @@ */ #pragma once -#if NOT_TARGET(__STM32F1__) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#endif +#include "env_validate.h" #define DEFAULT_MACHINE_NAME "3D Printer" diff --git a/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH_V12.h b/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH_V12.h index 65b16755ca..ba35265d10 100644 --- a/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH_V12.h +++ b/Marlin/src/pins/stm32f1/pins_FYSETC_CHEETAH_V12.h @@ -21,9 +21,7 @@ */ #pragma once -#if NOT_TARGET(__STM32F1__) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#endif +#include "env_validate.h" #include "pins_FYSETC_CHEETAH.h" diff --git a/Marlin/src/pins/stm32f1/pins_GTM32_MINI.h b/Marlin/src/pins/stm32f1/pins_GTM32_MINI.h index f67dc85b40..4edd67a14d 100644 --- a/Marlin/src/pins/stm32f1/pins_GTM32_MINI.h +++ b/Marlin/src/pins/stm32f1/pins_GTM32_MINI.h @@ -25,9 +25,7 @@ * Geeetech GTM32 Mini board pin assignments */ -#if NOT_TARGET(__STM32F1__) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "GTM32 Pro VB" #define DEFAULT_MACHINE_NAME "STM32F103VET6" diff --git a/Marlin/src/pins/stm32f1/pins_GTM32_MINI_A30.h b/Marlin/src/pins/stm32f1/pins_GTM32_MINI_A30.h index 27b0362758..f346c3a9fd 100644 --- a/Marlin/src/pins/stm32f1/pins_GTM32_MINI_A30.h +++ b/Marlin/src/pins/stm32f1/pins_GTM32_MINI_A30.h @@ -25,9 +25,7 @@ * Geeetech GTM32 Mini A30 board pin assignments */ -#if NOT_TARGET(__STM32F1__) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "GTM32 Pro VB" #define DEFAULT_MACHINE_NAME "STM32F103VET6" diff --git a/Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h b/Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h index d4ab2ff3e5..18156fc0ff 100644 --- a/Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h +++ b/Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h @@ -26,9 +26,7 @@ * http://www.geeetech.com/wiki/index.php/File:Hardware_GTM32_PRO_VB.pdf */ -#if NOT_TARGET(__STM32F1__) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "GTM32 Pro VB/VD" #define DEFAULT_MACHINE_NAME "STM32F103VET6" diff --git a/Marlin/src/pins/stm32f1/pins_GTM32_REV_B.h b/Marlin/src/pins/stm32f1/pins_GTM32_REV_B.h index 8e96327816..865de809e2 100644 --- a/Marlin/src/pins/stm32f1/pins_GTM32_REV_B.h +++ b/Marlin/src/pins/stm32f1/pins_GTM32_REV_B.h @@ -25,9 +25,7 @@ * Geeetech GTM32 Rev. B board pin assignments */ -#if NOT_TARGET(__STM32F1__) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "GTM32 Rev B" #define DEFAULT_MACHINE_NAME "M201" diff --git a/Marlin/src/pins/stm32f1/pins_JGAURORA_A5S_A1.h b/Marlin/src/pins/stm32f1/pins_JGAURORA_A5S_A1.h index 4f02b0e23c..9f08f18bf7 100644 --- a/Marlin/src/pins/stm32f1/pins_JGAURORA_A5S_A1.h +++ b/Marlin/src/pins/stm32f1/pins_JGAURORA_A5S_A1.h @@ -28,9 +28,9 @@ * Pin assignments for 32-bit JGAurora A5S & A1 */ -#if NOT_TARGET(__STM32F1__) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#elif HOTENDS > 1 || E_STEPPERS > 1 +#include "env_validate.h" + +#if HOTENDS > 1 || E_STEPPERS > 1 #error "JGAurora A5S A1 only supports one hotend / E-stepper. Comment out this line to continue." #endif diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h index 3118a521bb..14664bda39 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3P.h @@ -25,9 +25,9 @@ * MKS Robin nano (STM32F130VET6) board pin assignments */ -#if NOT_TARGET(__STM32F1__) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#elif HOTENDS > 1 || E_STEPPERS > 1 +#include "env_validate.h" + +#if HOTENDS > 1 || E_STEPPERS > 1 #error "MKS Robin E3P only supports one hotend / E-stepper. Comment out this line to continue." #elif HAS_FSMC_TFT #error "MKS Robin E3P doesn't support FSMC-based TFT displays." diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h index c4a7e9f408..da7bdc79e5 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_E3_common.h @@ -25,9 +25,7 @@ * MKS Robin E3 & E3D (STM32F103RCT6) common board pin assignments */ -#if NOT_TARGET(__STM32F1__) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#endif +#include "env_validate.h" #define BOARD_NO_NATIVE_USB diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h index 13c2d41d57..fad36e8384 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE.h @@ -21,9 +21,9 @@ */ #pragma once -#if NOT_TARGET(__STM32F1__) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#elif HOTENDS > 1 || E_STEPPERS > 1 +#include "env_validate.h" + +#if HOTENDS > 1 || E_STEPPERS > 1 #error "MKS Robin Lite only supports one hotend / E-stepper. Comment out this line to continue." #endif diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h index f814052fa8..73fefddf8f 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_LITE3.h @@ -25,9 +25,9 @@ * MKS Robin Lite 3 (STM32F103RCT6) board pin assignments */ -#if NOT_TARGET(__STM32F1__) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#elif HOTENDS > 2 || E_STEPPERS > 2 +#include "env_validate.h" + +#if HOTENDS > 2 || E_STEPPERS > 2 #error "MKS Robin Lite3 supports up to 2 hotends / E-steppers. Comment out this line to continue." #endif diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h index b3cfe5b6ba..be23394af7 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_MINI.h @@ -25,9 +25,9 @@ * MKS Robin mini (STM32F130VET6) board pin assignments */ -#if NOT_TARGET(__STM32F1__) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#elif HOTENDS > 1 || E_STEPPERS > 1 +#include "env_validate.h" + +#if HOTENDS > 1 || E_STEPPERS > 1 #error "MKS Robin mini only supports one hotend / E-stepper. Comment out this line to continue." #endif diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h index 39676bf9d7..10e1633124 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN_PRO.h @@ -25,9 +25,9 @@ * MKS Robin pro (STM32F103ZET6) board pin assignments */ -#if NOT_TARGET(__STM32F1__) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#elif HOTENDS > 3 || E_STEPPERS > 3 +#include "env_validate.h" + +#if HOTENDS > 3 || E_STEPPERS > 3 #error "MKS Robin pro supports up to 3 hotends / E-steppers. Comment out this line to continue." #endif diff --git a/Marlin/src/pins/stm32f1/pins_STM32F1R.h b/Marlin/src/pins/stm32f1/pins_STM32F1R.h index d666755c6f..c08b707d7e 100644 --- a/Marlin/src/pins/stm32f1/pins_STM32F1R.h +++ b/Marlin/src/pins/stm32f1/pins_STM32F1R.h @@ -21,9 +21,7 @@ */ #pragma once -#if NOT_TARGET(__STM32F1__) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#endif +#include "env_validate.h" /** * 21017 Victor Perez Marlin for stm32f1 test diff --git a/Marlin/src/pins/stm32f1/pins_STM3R_MINI.h b/Marlin/src/pins/stm32f1/pins_STM3R_MINI.h index 4f8183caf4..d25ca1bd2e 100644 --- a/Marlin/src/pins/stm32f1/pins_STM3R_MINI.h +++ b/Marlin/src/pins/stm32f1/pins_STM3R_MINI.h @@ -21,9 +21,7 @@ */ #pragma once -#if NOT_TARGET(__STM32F1__) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#endif +#include "env_validate.h" /** * 21017 Victor Perez Marlin for stm32f1 test diff --git a/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h b/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h index ed70d8d28f..dc603cda54 100644 --- a/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h +++ b/Marlin/src/pins/stm32f1/pins_TRIGORILLA_PRO.h @@ -28,9 +28,9 @@ * https://github.com/MarlinFirmware/Marlin/files/3401484/x5sa-main_board-2.pdf */ -#if NOT_TARGET(__STM32F1__) - #error "Oops! Select an STM32F1 board in 'Tools > Board.'" -#elif HOTENDS > 2 || E_STEPPERS > 2 +#include "env_validate.h" + +#if HOTENDS > 2 || E_STEPPERS > 2 #error "Trigorilla Pro supports up to 2 hotends / E-steppers. Comment out this line to continue." #endif diff --git a/Marlin/src/pins/stm32f4/env_validate.h b/Marlin/src/pins/stm32f4/env_validate.h new file mode 100644 index 0000000000..c01401f06c --- /dev/null +++ b/Marlin/src/pins/stm32f4/env_validate.h @@ -0,0 +1,28 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 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 + +#if NOT_TARGET(STM32F4) && (DISABLED(ALLOW_STM32DUINO) || NOT_TARGET(STM32F4xx)) + #error "Oops! Select an STM32F4 board in 'Tools > Board.'" +#endif + +#undef ALLOW_STM32DUINO diff --git a/Marlin/src/pins/stm32f4/pins_ANET_ET4.h b/Marlin/src/pins/stm32f4/pins_ANET_ET4.h index 487080f46b..1e1f5251c1 100644 --- a/Marlin/src/pins/stm32f4/pins_ANET_ET4.h +++ b/Marlin/src/pins/stm32f4/pins_ANET_ET4.h @@ -22,9 +22,11 @@ #pragma once -#if NOT_TARGET(STM32F4) - #error "Oops! Select an STM32F4 board in 'Tools > Board.'" -#elif HOTENDS > 1 || E_STEPPERS > 1 +#include "env_validate.h" + +#include "env_validate.h" + +#if HOTENDS > 1 || E_STEPPERS > 1 #error "Anet ET4 only supports one hotend / E-stepper. Comment out this line to continue." #endif diff --git a/Marlin/src/pins/stm32f4/pins_ARMED.h b/Marlin/src/pins/stm32f4/pins_ARMED.h index db57db14d5..a67af089f2 100644 --- a/Marlin/src/pins/stm32f4/pins_ARMED.h +++ b/Marlin/src/pins/stm32f4/pins_ARMED.h @@ -24,9 +24,9 @@ #pragma once -#if NOT_TARGET(STM32F4) - #error "Oops! Select an STM32F4 board in 'Tools > Board.'" -#elif HOTENDS > 2 || E_STEPPERS > 2 +#include "env_validate.h" + +#if HOTENDS > 2 || E_STEPPERS > 2 #error "Arm'ed supports up to 2 hotends / E-steppers." #endif diff --git a/Marlin/src/pins/stm32f4/pins_BLACK_STM32F407VE.h b/Marlin/src/pins/stm32f4/pins_BLACK_STM32F407VE.h index c2ad907e04..d8a83bef3a 100644 --- a/Marlin/src/pins/stm32f4/pins_BLACK_STM32F407VE.h +++ b/Marlin/src/pins/stm32f4/pins_BLACK_STM32F407VE.h @@ -27,9 +27,10 @@ * Shield - https://github.com/jmz52/Hardware */ -#if NOT_TARGET(STM32F4, STM32F4xx) - #error "Oops! Select an STM32F4 board in 'Tools > Board.'" -#elif HOTENDS > 2 || E_STEPPERS > 2 +#define ALLOW_STM32DUINO +#include "env_validate.h" + +#if HOTENDS > 2 || E_STEPPERS > 2 #error "Black STM32F4VET6 supports up to 2 hotends / E-steppers." #endif diff --git a/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h b/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h index bc69e1fd21..6029031a63 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_BTT002_V1_0.h @@ -21,9 +21,9 @@ */ #pragma once -#if NOT_TARGET(STM32F4) - #error "Oops! Select an STM32F4 board in 'Tools > Board.'" -#elif HOTENDS > 1 || E_STEPPERS > 1 +#include "env_validate.h" + +#if HOTENDS > 1 || E_STEPPERS > 1 #error "BIGTREE BTT002 V1.0 only supports one hotend / E-stepper. Comment out this line to continue." #endif diff --git a/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h b/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h index cd9d60d2f0..6c59f27c5e 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_GTR_V1_0.h @@ -21,9 +21,9 @@ */ #pragma once -#if NOT_TARGET(STM32F4) - #error "Oops! Select an STM32F4 board in 'Tools > Board.'" -#elif HOTENDS > 8 || E_STEPPERS > 8 +#include "env_validate.h" + +#if HOTENDS > 8 || E_STEPPERS > 8 #error "BIGTREE GTR V1.0 supports up to 8 hotends / E-steppers." #elif HOTENDS > MAX_E_STEPPERS || E_STEPPERS > MAX_E_STEPPERS #error "Marlin extruder/hotends limit! Increase MAX_E_STEPPERS to continue." diff --git a/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h b/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h index ab7f5126ff..863429f2a2 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h @@ -21,9 +21,7 @@ */ #pragma once -#if NOT_TARGET(STM32F4) - #error "Oops! Select an STM32F4 board in 'Tools > Board.'" -#endif +#include "env_validate.h" // BigTreeTech driver expansion module https://bit.ly/3ptRRoj //#define BTT_MOTOR_EXPANSION diff --git a/Marlin/src/pins/stm32f4/pins_FLYF407ZG.h b/Marlin/src/pins/stm32f4/pins_FLYF407ZG.h index 7965d262c3..34124a9b02 100644 --- a/Marlin/src/pins/stm32f4/pins_FLYF407ZG.h +++ b/Marlin/src/pins/stm32f4/pins_FLYF407ZG.h @@ -21,9 +21,10 @@ */ #pragma once -#if NOT_TARGET(STM32F4, STM32F4xx) - #error "Oops! Select an STM32F4 board in 'Tools > Board.'" -#elif HOTENDS > 6 || E_STEPPERS > 6 +#define ALLOW_STM32DUINO +#include "env_validate.h" + +#if HOTENDS > 6 || E_STEPPERS > 6 #error "FLYF407ZG supports up to 6 hotends / E-steppers." #endif diff --git a/Marlin/src/pins/stm32f4/pins_FYSETC_CHEETAH_V20.h b/Marlin/src/pins/stm32f4/pins_FYSETC_CHEETAH_V20.h index ad43765135..ef1c14aae0 100644 --- a/Marlin/src/pins/stm32f4/pins_FYSETC_CHEETAH_V20.h +++ b/Marlin/src/pins/stm32f4/pins_FYSETC_CHEETAH_V20.h @@ -21,9 +21,7 @@ */ #pragma once -#if NOT_TARGET(STM32F4) - #error "Oops! Select an STM32F4 board in 'Tools > Board.'" -#endif +#include "env_validate.h" #define DEFAULT_MACHINE_NAME "3D Printer" diff --git a/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h b/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h index a280775646..d617087e9d 100644 --- a/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h +++ b/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h @@ -21,9 +21,9 @@ */ #pragma once -#if NOT_TARGET(STM32F4) - #error "Oops! Select an STM32F4 board in 'Tools > Board.'" -#elif HOTENDS > 3 || E_STEPPERS > 3 +#include "env_validate.h" + +#if HOTENDS > 3 || E_STEPPERS > 3 #error "RUMBA32 supports up to 3 hotends / E-steppers." #endif diff --git a/Marlin/src/pins/stm32f4/pins_LERDGE_K.h b/Marlin/src/pins/stm32f4/pins_LERDGE_K.h index bf6df03562..fad8d2059e 100644 --- a/Marlin/src/pins/stm32f4/pins_LERDGE_K.h +++ b/Marlin/src/pins/stm32f4/pins_LERDGE_K.h @@ -18,9 +18,10 @@ */ #pragma once -#if NOT_TARGET(STM32F4, STM32F4xx) - #error "Oops! Select an STM32F4 board in 'Tools > Board.'" -#elif HOTENDS > 2 || E_STEPPERS > 2 +#define ALLOW_STM32DUINO +#include "env_validate.h" + +#if HOTENDS > 2 || E_STEPPERS > 2 #error "LERDGE K supports up to 2 hotends / E-steppers." #endif diff --git a/Marlin/src/pins/stm32f4/pins_LERDGE_S.h b/Marlin/src/pins/stm32f4/pins_LERDGE_S.h index c6cfa98831..105d0d6f60 100644 --- a/Marlin/src/pins/stm32f4/pins_LERDGE_S.h +++ b/Marlin/src/pins/stm32f4/pins_LERDGE_S.h @@ -18,9 +18,10 @@ */ #pragma once -#if NOT_TARGET(STM32F4, STM32F4xx) - #error "Oops! Select an STM32F4 board in 'Tools > Board.'" -#elif HOTENDS > 2 || E_STEPPERS > 2 +#define ALLOW_STM32DUINO +#include "env_validate.h" + +#if HOTENDS > 2 || E_STEPPERS > 2 #error "LERDGE S supports up to 2 hotends / E-steppers." #endif diff --git a/Marlin/src/pins/stm32f4/pins_LERDGE_X.h b/Marlin/src/pins/stm32f4/pins_LERDGE_X.h index 606d932c57..974392373f 100644 --- a/Marlin/src/pins/stm32f4/pins_LERDGE_X.h +++ b/Marlin/src/pins/stm32f4/pins_LERDGE_X.h @@ -18,9 +18,10 @@ */ #pragma once -#if NOT_TARGET(STM32F4, STM32F4xx) - #error "Oops! Select an STM32F4 board in 'Tools > Board.'" -#elif HOTENDS > 1 || E_STEPPERS > 1 +#define ALLOW_STM32DUINO +#include "env_validate.h" + +#if HOTENDS > 1 || E_STEPPERS > 1 #error "LERDGE X only supports one hotend / E-stepper. Comment out this line to continue." #endif diff --git a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN2.h b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN2.h index c2f5f324ba..589300f341 100644 --- a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN2.h +++ b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN2.h @@ -21,9 +21,9 @@ */ #pragma once -#if NOT_TARGET(STM32F4) - #error "Oops! Select an STM32F4 board in 'Tools > Board.'" -#elif HOTENDS > 2 || E_STEPPERS > 2 +#include "env_validate.h" + +#if HOTENDS > 2 || E_STEPPERS > 2 #error "MKS_ROBIN2 supports up to 2 hotends / E-steppers." #endif diff --git a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h index 8308f3998f..f9e85c4919 100644 --- a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h +++ b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h @@ -21,9 +21,10 @@ */ #pragma once -#if NOT_TARGET(STM32F4, STM32F4xx) - #error "Oops! Select an STM32F4 board in 'Tools > Board.'" -#elif HOTENDS > 2 || E_STEPPERS > 2 +#define ALLOW_STM32DUINO +#include "env_validate.h" + +#if HOTENDS > 2 || E_STEPPERS > 2 #error "MKS Robin Nano V3 supports up to 2 hotends / E-steppers." #elif HAS_FSMC_TFT #error "MKS Robin Nano V3 doesn't support FSMC-based TFT displays." diff --git a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_PRO_V2.h b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_PRO_V2.h index 5533e35f07..f2ddfc2b52 100644 --- a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_PRO_V2.h +++ b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_PRO_V2.h @@ -21,9 +21,10 @@ */ #pragma once -#if NOT_TARGET(STM32F4, STM32F4xx) - #error "Oops! Select an STM32F4 board in 'Tools > Board.'" -#elif HOTENDS > 2 || E_STEPPERS > 2 +#define ALLOW_STM32DUINO +#include "env_validate.h" + +#if HOTENDS > 2 || E_STEPPERS > 2 #error "MKS Robin Nano V3 supports up to 1 hotends / E-steppers." #endif diff --git a/Marlin/src/pins/stm32f4/pins_RUMBA32_common.h b/Marlin/src/pins/stm32f4/pins_RUMBA32_common.h index 2a0cfa897c..be6e4f8a34 100644 --- a/Marlin/src/pins/stm32f4/pins_RUMBA32_common.h +++ b/Marlin/src/pins/stm32f4/pins_RUMBA32_common.h @@ -25,9 +25,9 @@ * Common pin assignments for all RUMBA32 boards */ -#if NOT_TARGET(STM32F4) - #error "Oops! Select an STM32F4 board in 'Tools > Board.'" -#elif HOTENDS > 3 || E_STEPPERS > 3 +#include "env_validate.h" + +#if HOTENDS > 3 || E_STEPPERS > 3 #error "RUMBA32 boards support up to 3 hotends / E-steppers." #endif diff --git a/Marlin/src/pins/stm32f4/pins_STEVAL_3DP001V1.h b/Marlin/src/pins/stm32f4/pins_STEVAL_3DP001V1.h index 25679517c2..dc02fd02ea 100644 --- a/Marlin/src/pins/stm32f4/pins_STEVAL_3DP001V1.h +++ b/Marlin/src/pins/stm32f4/pins_STEVAL_3DP001V1.h @@ -40,9 +40,7 @@ #pragma once -#if NOT_TARGET(STM32F4) - #error "Oops! Select an STM32F4 board in 'Tools > Board.'" -#endif +#include "env_validate.h" #ifndef MACHINE_NAME #define MACHINE_NAME "STEVAL-3DP001V1" diff --git a/Marlin/src/pins/stm32f4/pins_VAKE403D.h b/Marlin/src/pins/stm32f4/pins_VAKE403D.h index 1135af847f..9d122c2642 100644 --- a/Marlin/src/pins/stm32f4/pins_VAKE403D.h +++ b/Marlin/src/pins/stm32f4/pins_VAKE403D.h @@ -21,9 +21,10 @@ */ #pragma once -#if NOT_TARGET(STM32F4, STM32F4xx) - #error "Oops! Select an STM32F4 board in 'Tools > Board.'" -#elif HOTENDS > 2 || E_STEPPERS > 2 +#define ALLOW_STM32DUINO +#include "env_validate.h" + +#if HOTENDS > 2 || E_STEPPERS > 2 #error "STM32F4 supports up to 2 hotends / E-steppers." #endif diff --git a/Marlin/src/pins/teensy2/env_validate.h b/Marlin/src/pins/teensy2/env_validate.h new file mode 100644 index 0000000000..5f0ea4f3b6 --- /dev/null +++ b/Marlin/src/pins/teensy2/env_validate.h @@ -0,0 +1,28 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 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 + +#if NOT_TARGET(__AVR_AT90USB1286__) && (DISABLED(ALLOW_AT90USB1286P) || NOT_TARGET(__AVR_AT90USB1286P__)) + #error "Oops! Select 'Teensy++ 2.0' or 'Printrboard' in 'Tools > Board.'" +#endif + +#undef ALLOW_AT90USB1286P diff --git a/Marlin/src/pins/teensy2/pins_5DPRINT.h b/Marlin/src/pins/teensy2/pins_5DPRINT.h index 908e12e0ba..6e1f9c0217 100644 --- a/Marlin/src/pins/teensy2/pins_5DPRINT.h +++ b/Marlin/src/pins/teensy2/pins_5DPRINT.h @@ -68,9 +68,7 @@ * https://bitbucket.org/makible/5dprint-d8-controller-board */ -#if NOT_TARGET(__AVR_AT90USB1286__) - #error "Oops! Select 'Teensy++ 2.0' or 'Printrboard' in 'Tools > Board.'" -#endif +#include "env_validate.h" #define DEFAULT_MACHINE_NAME "Makibox" #define BOARD_INFO_NAME "5DPrint D8" diff --git a/Marlin/src/pins/teensy2/pins_BRAINWAVE.h b/Marlin/src/pins/teensy2/pins_BRAINWAVE.h index 97d210a0f8..cdcc249c00 100644 --- a/Marlin/src/pins/teensy2/pins_BRAINWAVE.h +++ b/Marlin/src/pins/teensy2/pins_BRAINWAVE.h @@ -69,7 +69,7 @@ */ #if NOT_TARGET(__AVR_AT90USB646__) - #error "Oops! Select 'AT90USB646_TEENSYPP' in 'Tools > Board.'" + #error "Oops! Select 'Brainwave' in 'Tools > Board.'" #endif #define BOARD_INFO_NAME "Brainwave" diff --git a/Marlin/src/pins/teensy2/pins_BRAINWAVE_PRO.h b/Marlin/src/pins/teensy2/pins_BRAINWAVE_PRO.h index e41fcaab94..319130ef96 100644 --- a/Marlin/src/pins/teensy2/pins_BRAINWAVE_PRO.h +++ b/Marlin/src/pins/teensy2/pins_BRAINWAVE_PRO.h @@ -75,9 +75,7 @@ * 4. The programmer is no longer needed. Remove it. */ -#if NOT_TARGET(__AVR_AT90USB1286__) - #error "Oops! Select 'Teensy++ 2.0' or 'Printrboard' in 'Tools > Board.'" -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "Brainwave Pro" diff --git a/Marlin/src/pins/teensy2/pins_PRINTRBOARD.h b/Marlin/src/pins/teensy2/pins_PRINTRBOARD.h index 2401c976f1..7b3685d08e 100644 --- a/Marlin/src/pins/teensy2/pins_PRINTRBOARD.h +++ b/Marlin/src/pins/teensy2/pins_PRINTRBOARD.h @@ -62,9 +62,7 @@ * 4. The programmer is no longer needed. Remove it. */ -#if NOT_TARGET(__AVR_AT90USB1286__) - #error "Oops! Select 'Teensy++ 2.0' or 'Printrboard' in 'Tools > Board.'" -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "Printrboard" diff --git a/Marlin/src/pins/teensy2/pins_PRINTRBOARD_REVF.h b/Marlin/src/pins/teensy2/pins_PRINTRBOARD_REVF.h index d4f9fc7641..0e6842125e 100644 --- a/Marlin/src/pins/teensy2/pins_PRINTRBOARD_REVF.h +++ b/Marlin/src/pins/teensy2/pins_PRINTRBOARD_REVF.h @@ -63,9 +63,7 @@ * 4. The programmer is no longer needed. Remove it. */ -#if NOT_TARGET(__AVR_AT90USB1286__) - #error "Oops! Select 'Teensy++ 2.0' or 'Printrboard' in 'Tools > Board.'" -#endif +#include "env_validate.h" #if !defined(__MARLIN_DEPS__) && !defined(USBCON) #error "USBCON should be defined by the platform for this board." diff --git a/Marlin/src/pins/teensy2/pins_SAV_MKI.h b/Marlin/src/pins/teensy2/pins_SAV_MKI.h index bcc456c16e..cdba535090 100644 --- a/Marlin/src/pins/teensy2/pins_SAV_MKI.h +++ b/Marlin/src/pins/teensy2/pins_SAV_MKI.h @@ -62,9 +62,7 @@ * 4. The programmer is no longer needed. Remove it. */ -#if NOT_TARGET(__AVR_AT90USB1286__) - #error "Oops! Select 'Teensy++ 2.0' or 'Printrboard' in 'Tools > Board.'" -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "SAV MkI" #define DEFAULT_MACHINE_NAME BOARD_INFO_NAME diff --git a/Marlin/src/pins/teensy2/pins_TEENSY2.h b/Marlin/src/pins/teensy2/pins_TEENSY2.h index d43e39b09a..efb409bf32 100644 --- a/Marlin/src/pins/teensy2/pins_TEENSY2.h +++ b/Marlin/src/pins/teensy2/pins_TEENSY2.h @@ -107,9 +107,7 @@ * E DIR 35 a7 a3 31 Y DIR */ -#if NOT_TARGET(__AVR_AT90USB1286__) - #error "Oops! Select 'Teensy++ 2.0' or 'Printrboard' in 'Tools > Board.'" -#endif +#include "env_validate.h" #define BOARD_INFO_NAME "Teensy++2.0" diff --git a/Marlin/src/pins/teensy2/pins_TEENSYLU.h b/Marlin/src/pins/teensy2/pins_TEENSYLU.h index 54cee137ad..f551d802cf 100644 --- a/Marlin/src/pins/teensy2/pins_TEENSYLU.h +++ b/Marlin/src/pins/teensy2/pins_TEENSYLU.h @@ -72,6 +72,9 @@ * The pin assignments in this file match the silkscreen. */ +#define ALLOW_AT90USB1286P +#include "env_validate.h" + #if NOT_TARGET(__AVR_AT90USB1286__, __AVR_AT90USB1286P__) #error "Oops! Select 'Teensy++ 2.0' or 'Printrboard' in 'Tools > Board.'" #endif diff --git a/buildroot/bin/mftest b/buildroot/bin/mftest index 00f7a2e7e0..d769ff8cb8 100755 --- a/buildroot/bin/mftest +++ b/buildroot/bin/mftest @@ -21,7 +21,7 @@ Usage: mftest [-t|--env=] [-n|--num=] [-m|--make] [-y|--build=] OPTIONS -t --env The environment of the test to apply / run. (As named in platformio.ini.) - -n --num The index of the test to run. (In *-tests file order.) + -n --num The index of the test to run. (In file order.) -m --make Use the make / Docker method for the build. -y --build Skip 'Do you want to build this test?' and assume YES. -h --help Print this help. @@ -204,11 +204,10 @@ fi if [[ $TESTENV == '-' ]]; then IND=0 NAMES=() - for FILE in $( ls -1 $TESTPATH/*-tests ) + for FILE in $( ls -1 $TESTPATH/* ) do let IND++ - TNAME=${FILE/-tests/} - TNAME=${TNAME/$TESTPATH\//} + TNAME=${FILE/$TESTPATH\//} NAMES+=($TNAME) (( IND < 10 )) && echo -n " " echo " $IND) $TNAME" @@ -231,7 +230,7 @@ if [[ $TESTENV == '-' ]]; then fi # Get the contents of the test file -OUT=$( cat $TESTPATH/$TESTENV-tests 2>/dev/null ) || { errout "Can't find test '$TESTENV'." ; exit 1 ; } +OUT=$( cat $TESTPATH/$TESTENV 2>/dev/null ) || { errout "Can't find test '$TESTENV'." ; exit 1 ; } # Count up the number of tests TESTCOUNT=$( awk "/$ISEXEC/{a++}END{print a}" <<<"$OUT" ) @@ -297,7 +296,7 @@ echo "$OUT" | { echo -ne "\033[0m" # Make clear it's a TEST -opt_set CUSTOM_MACHINE_NAME "\"$TESTENV-tests ($CHOICE)\"" +opt_set CUSTOM_MACHINE_NAME "\"Test $TESTENV ($CHOICE)\"" # Build the test too? if [[ -z "$BUILD_YES" ]]; then diff --git a/buildroot/tests/run_tests b/buildroot/bin/run_tests similarity index 79% rename from buildroot/tests/run_tests rename to buildroot/bin/run_tests index c4286f4695..26284fa693 100755 --- a/buildroot/tests/run_tests +++ b/buildroot/bin/run_tests @@ -2,8 +2,9 @@ # # run_tests # -export PATH="$PATH:$( cd "$(dirname "${BASH_SOURCE[0]}")" ; pwd -P )" -export PATH="$PATH:./buildroot/bin" +HERE="$( cd "$(dirname "${BASH_SOURCE[0]}")" ; pwd -P )" +TESTS="$HERE/../tests" +export PATH="$HERE:$TESTS:$PATH" # exit on first failure set -e @@ -40,10 +41,9 @@ export -f exec_test printf "Running \033[0;32m$2\033[0m Tests\n" if [[ $2 = "ALL" ]]; then - dir_list=("$(dirname "${BASH_SOURCE[0]}")"/*) - declare -a tests=(${dir_list[@]/*run_tests/}) + tests=("$TESTS"/*) for f in "${tests[@]}"; do - testenv=$(basename $f | cut -d"-" -f1) + testenv=$(basename $f) printf "Running \033[0;32m$f\033[0m Tests\n" exec_test $1 "$testenv --target clean" "Setup Build Environment" if [[ $GIT_RESET_HARD == "true" ]]; then @@ -58,16 +58,16 @@ else # If the test name is 1 or 2 digits, treat it as an index if [[ "$test_name" =~ ^[0-9][0-9]?$ ]] ; then # Find the test name that corresponds to that index - test_name="$(cat buildroot/tests/$2-tests | grep -e '^exec_test' | sed -n "$3p" | sed "s/.*\$1 \$2 \"\([^\"]*\).*/\1/g")" + test_name="$(cat $TESTS/$2 | grep -e '^exec_test' | sed -n "$3p" | sed "s/.*\$1 \$2 \"\([^\"]*\).*/\1/g")" if [[ -z "$test_name" ]] ; then # Fail if none matches - printf "\033[0;31mCould not find test \033[0m#$3\033[0;31m in \033[0mbuildroot/tests/$2-tests\n" + printf "\033[0;31mCould not find test \033[0m#$3\033[0;31m in \033[0mbuildroot/tests/$2\n" exit 1 else printf "\033[0;32mMatching test \033[0m#$3\033[0;32m: '\033[0m$test_name\033[0;32m'\n" fi fi - $2-tests $1 $2 "$test_name" + $TESTS/$2 $1 $2 "$test_name" if [[ $GIT_RESET_HARD == "true" ]]; then git reset --hard HEAD else diff --git a/buildroot/share/PlatformIO/scripts/common-dependencies-post.py b/buildroot/share/PlatformIO/scripts/common-dependencies-post.py deleted file mode 100644 index 2b1b948119..0000000000 --- a/buildroot/share/PlatformIO/scripts/common-dependencies-post.py +++ /dev/null @@ -1,16 +0,0 @@ -# -# common-dependencies-post.py -# Convenience script to add build flags for Marlin Enabled Features -# - -Import("env") -Import("projenv") - -def apply_board_build_flags(): - if not 'BOARD_CUSTOM_BUILD_FLAGS' in env['MARLIN_FEATURES']: - return - projenv.Append(CCFLAGS=env['MARLIN_FEATURES']['BOARD_CUSTOM_BUILD_FLAGS'].split()) - -# We need to add the board build flags in a post script -# so the platform build script doesn't overwrite the custom CCFLAGS -apply_board_build_flags() diff --git a/buildroot/share/PlatformIO/scripts/preflight-checks.py b/buildroot/share/PlatformIO/scripts/preflight-checks.py index 4c8a00e74c..969a82aad2 100644 --- a/buildroot/share/PlatformIO/scripts/preflight-checks.py +++ b/buildroot/share/PlatformIO/scripts/preflight-checks.py @@ -49,8 +49,7 @@ config = env.GetProjectConfig() result = check_envs("env:"+build_env, base_envs, config) if not result: - err = "Error: your selected build environment '%s' is not compatible with MOTHERBOARD=%s in Configuration.h. " \ - "Please use one of compatible build environments for this board: %s" % \ + err = "Error: Build environment '%s' is incompatible with %s. Use one of these: %s" % \ (build_env, motherboard, ",".join([e[4:] for e in base_envs if e.startswith("env:")])) raise SystemExit(err) diff --git a/buildroot/tests/ARMED-tests b/buildroot/tests/ARMED similarity index 100% rename from buildroot/tests/ARMED-tests rename to buildroot/tests/ARMED diff --git a/buildroot/tests/BIGTREE_BTT002-tests b/buildroot/tests/BIGTREE_BTT002 similarity index 100% rename from buildroot/tests/BIGTREE_BTT002-tests rename to buildroot/tests/BIGTREE_BTT002 diff --git a/buildroot/tests/BIGTREE_GTR_V1_0-tests b/buildroot/tests/BIGTREE_GTR_V1_0 similarity index 100% rename from buildroot/tests/BIGTREE_GTR_V1_0-tests rename to buildroot/tests/BIGTREE_GTR_V1_0 diff --git a/buildroot/tests/BIGTREE_GTR_V1_0_usb_flash_drive-tests b/buildroot/tests/BIGTREE_GTR_V1_0_usb_flash_drive similarity index 100% rename from buildroot/tests/BIGTREE_GTR_V1_0_usb_flash_drive-tests rename to buildroot/tests/BIGTREE_GTR_V1_0_usb_flash_drive diff --git a/buildroot/tests/BIGTREE_SKR_PRO-tests b/buildroot/tests/BIGTREE_SKR_PRO similarity index 100% rename from buildroot/tests/BIGTREE_SKR_PRO-tests rename to buildroot/tests/BIGTREE_SKR_PRO diff --git a/buildroot/tests/DUE-tests b/buildroot/tests/DUE similarity index 100% rename from buildroot/tests/DUE-tests rename to buildroot/tests/DUE diff --git a/buildroot/tests/DUE_archim-tests b/buildroot/tests/DUE_archim similarity index 100% rename from buildroot/tests/DUE_archim-tests rename to buildroot/tests/DUE_archim diff --git a/buildroot/tests/FLYF407ZG-tests b/buildroot/tests/FLYF407ZG similarity index 100% rename from buildroot/tests/FLYF407ZG-tests rename to buildroot/tests/FLYF407ZG diff --git a/buildroot/tests/FYSETC_F6-tests b/buildroot/tests/FYSETC_F6 similarity index 100% rename from buildroot/tests/FYSETC_F6-tests rename to buildroot/tests/FYSETC_F6 diff --git a/buildroot/tests/FYSETC_S6-tests b/buildroot/tests/FYSETC_S6 similarity index 100% rename from buildroot/tests/FYSETC_S6-tests rename to buildroot/tests/FYSETC_S6 diff --git a/buildroot/tests/LERDGEX-tests b/buildroot/tests/LERDGEX similarity index 100% rename from buildroot/tests/LERDGEX-tests rename to buildroot/tests/LERDGEX diff --git a/buildroot/tests/LPC1768-tests b/buildroot/tests/LPC1768 similarity index 100% rename from buildroot/tests/LPC1768-tests rename to buildroot/tests/LPC1768 diff --git a/buildroot/tests/LPC1769-tests b/buildroot/tests/LPC1769 similarity index 100% rename from buildroot/tests/LPC1769-tests rename to buildroot/tests/LPC1769 diff --git a/buildroot/tests/NUCLEO_F767ZI-tests b/buildroot/tests/NUCLEO_F767ZI similarity index 100% rename from buildroot/tests/NUCLEO_F767ZI-tests rename to buildroot/tests/NUCLEO_F767ZI diff --git a/buildroot/tests/REMRAM_V1-tests b/buildroot/tests/REMRAM_V1 similarity index 100% rename from buildroot/tests/REMRAM_V1-tests rename to buildroot/tests/REMRAM_V1 diff --git a/buildroot/tests/SAMD51_grandcentral_m4-tests b/buildroot/tests/SAMD51_grandcentral_m4 similarity index 100% rename from buildroot/tests/SAMD51_grandcentral_m4-tests rename to buildroot/tests/SAMD51_grandcentral_m4 diff --git a/buildroot/tests/STM32F070CB_malyan-tests b/buildroot/tests/STM32F070CB_malyan similarity index 100% rename from buildroot/tests/STM32F070CB_malyan-tests rename to buildroot/tests/STM32F070CB_malyan diff --git a/buildroot/tests/STM32F070RB_malyan-tests b/buildroot/tests/STM32F070RB_malyan similarity index 100% rename from buildroot/tests/STM32F070RB_malyan-tests rename to buildroot/tests/STM32F070RB_malyan diff --git a/buildroot/tests/STM32F103CB_malyan-tests b/buildroot/tests/STM32F103CB_malyan similarity index 100% rename from buildroot/tests/STM32F103CB_malyan-tests rename to buildroot/tests/STM32F103CB_malyan diff --git a/buildroot/tests/STM32F103RC_btt-tests b/buildroot/tests/STM32F103RC_btt similarity index 100% rename from buildroot/tests/STM32F103RC_btt-tests rename to buildroot/tests/STM32F103RC_btt diff --git a/buildroot/tests/STM32F103RC_btt_USB-tests b/buildroot/tests/STM32F103RC_btt_USB similarity index 100% rename from buildroot/tests/STM32F103RC_btt_USB-tests rename to buildroot/tests/STM32F103RC_btt_USB diff --git a/buildroot/tests/STM32F103RC_fysetc-tests b/buildroot/tests/STM32F103RC_fysetc similarity index 100% rename from buildroot/tests/STM32F103RC_fysetc-tests rename to buildroot/tests/STM32F103RC_fysetc diff --git a/buildroot/tests/STM32F103RC_meeb-tests b/buildroot/tests/STM32F103RC_meeb similarity index 100% rename from buildroot/tests/STM32F103RC_meeb-tests rename to buildroot/tests/STM32F103RC_meeb diff --git a/buildroot/tests/STM32F103RE-tests b/buildroot/tests/STM32F103RE similarity index 100% rename from buildroot/tests/STM32F103RE-tests rename to buildroot/tests/STM32F103RE diff --git a/buildroot/tests/STM32F103RET6_creality-tests b/buildroot/tests/STM32F103RET6_creality similarity index 100% rename from buildroot/tests/STM32F103RET6_creality-tests rename to buildroot/tests/STM32F103RET6_creality diff --git a/buildroot/tests/STM32F103RE_btt-tests b/buildroot/tests/STM32F103RE_btt similarity index 100% rename from buildroot/tests/STM32F103RE_btt-tests rename to buildroot/tests/STM32F103RE_btt diff --git a/buildroot/tests/STM32F103RE_btt_USB-tests b/buildroot/tests/STM32F103RE_btt_USB similarity index 100% rename from buildroot/tests/STM32F103RE_btt_USB-tests rename to buildroot/tests/STM32F103RE_btt_USB diff --git a/buildroot/tests/STM32F103VE_longer-tests b/buildroot/tests/STM32F103VE_longer similarity index 100% rename from buildroot/tests/STM32F103VE_longer-tests rename to buildroot/tests/STM32F103VE_longer diff --git a/buildroot/tests/STM32F401VE_STEVAL-tests b/buildroot/tests/STM32F401VE_STEVAL similarity index 100% rename from buildroot/tests/STM32F401VE_STEVAL-tests rename to buildroot/tests/STM32F401VE_STEVAL diff --git a/buildroot/tests/STM32F407VE_black-tests b/buildroot/tests/STM32F407VE_black similarity index 100% rename from buildroot/tests/STM32F407VE_black-tests rename to buildroot/tests/STM32F407VE_black diff --git a/buildroot/tests/at90usb1286_cdc-tests b/buildroot/tests/at90usb1286_cdc similarity index 100% rename from buildroot/tests/at90usb1286_cdc-tests rename to buildroot/tests/at90usb1286_cdc diff --git a/buildroot/tests/at90usb1286_dfu-tests b/buildroot/tests/at90usb1286_dfu similarity index 100% rename from buildroot/tests/at90usb1286_dfu-tests rename to buildroot/tests/at90usb1286_dfu diff --git a/buildroot/tests/esp32-tests b/buildroot/tests/esp32 similarity index 100% rename from buildroot/tests/esp32-tests rename to buildroot/tests/esp32 diff --git a/buildroot/tests/jgaurora_a5s_a1-tests b/buildroot/tests/jgaurora_a5s_a1 similarity index 100% rename from buildroot/tests/jgaurora_a5s_a1-tests rename to buildroot/tests/jgaurora_a5s_a1 diff --git a/buildroot/tests/linux_native-tests b/buildroot/tests/linux_native similarity index 100% rename from buildroot/tests/linux_native-tests rename to buildroot/tests/linux_native diff --git a/buildroot/tests/malyan_M300-tests b/buildroot/tests/malyan_M300 similarity index 100% rename from buildroot/tests/malyan_M300-tests rename to buildroot/tests/malyan_M300 diff --git a/buildroot/tests/mega1280-tests b/buildroot/tests/mega1280 similarity index 100% rename from buildroot/tests/mega1280-tests rename to buildroot/tests/mega1280 diff --git a/buildroot/tests/mega2560-tests b/buildroot/tests/mega2560 similarity index 100% rename from buildroot/tests/mega2560-tests rename to buildroot/tests/mega2560 diff --git a/buildroot/tests/mks_robin-tests b/buildroot/tests/mks_robin similarity index 100% rename from buildroot/tests/mks_robin-tests rename to buildroot/tests/mks_robin diff --git a/buildroot/tests/mks_robin_lite-tests b/buildroot/tests/mks_robin_lite similarity index 100% rename from buildroot/tests/mks_robin_lite-tests rename to buildroot/tests/mks_robin_lite diff --git a/buildroot/tests/mks_robin_mini-tests b/buildroot/tests/mks_robin_mini similarity index 100% rename from buildroot/tests/mks_robin_mini-tests rename to buildroot/tests/mks_robin_mini diff --git a/buildroot/tests/mks_robin_nano35-tests b/buildroot/tests/mks_robin_nano35 similarity index 100% rename from buildroot/tests/mks_robin_nano35-tests rename to buildroot/tests/mks_robin_nano35 diff --git a/buildroot/tests/mks_robin_nano35_stm32-tests b/buildroot/tests/mks_robin_nano35_stm32 similarity index 100% rename from buildroot/tests/mks_robin_nano35_stm32-tests rename to buildroot/tests/mks_robin_nano35_stm32 diff --git a/buildroot/tests/mks_robin_pro-tests b/buildroot/tests/mks_robin_pro similarity index 100% rename from buildroot/tests/mks_robin_pro-tests rename to buildroot/tests/mks_robin_pro diff --git a/buildroot/tests/mks_robin_stm32-tests b/buildroot/tests/mks_robin_stm32 similarity index 100% rename from buildroot/tests/mks_robin_stm32-tests rename to buildroot/tests/mks_robin_stm32 diff --git a/buildroot/tests/rambo-tests b/buildroot/tests/rambo similarity index 100% rename from buildroot/tests/rambo-tests rename to buildroot/tests/rambo diff --git a/buildroot/tests/rumba32-tests b/buildroot/tests/rumba32 similarity index 100% rename from buildroot/tests/rumba32-tests rename to buildroot/tests/rumba32 diff --git a/buildroot/tests/sanguino1284p-tests b/buildroot/tests/sanguino1284p similarity index 100% rename from buildroot/tests/sanguino1284p-tests rename to buildroot/tests/sanguino1284p diff --git a/buildroot/tests/sanguino644p-tests b/buildroot/tests/sanguino644p similarity index 100% rename from buildroot/tests/sanguino644p-tests rename to buildroot/tests/sanguino644p diff --git a/buildroot/tests/teensy31-tests b/buildroot/tests/teensy31 similarity index 100% rename from buildroot/tests/teensy31-tests rename to buildroot/tests/teensy31 diff --git a/buildroot/tests/teensy35-tests b/buildroot/tests/teensy35 similarity index 100% rename from buildroot/tests/teensy35-tests rename to buildroot/tests/teensy35 diff --git a/buildroot/tests/teensy41-tests b/buildroot/tests/teensy41 similarity index 100% rename from buildroot/tests/teensy41-tests rename to buildroot/tests/teensy41 diff --git a/platformio.ini b/platformio.ini index aad59362cc..74452754ad 100644 --- a/platformio.ini +++ b/platformio.ini @@ -215,7 +215,6 @@ extra_scripts = pre:buildroot/share/PlatformIO/scripts/common-dependencies.py pre:buildroot/share/PlatformIO/scripts/common-cxxflags.py pre:buildroot/share/PlatformIO/scripts/preflight-checks.py - post:buildroot/share/PlatformIO/scripts/common-dependencies-post.py build_flags = -fmax-errors=5 -g3 -D__MARLIN_FIRMWARE__ -fmerge-constants lib_deps = @@ -728,6 +727,12 @@ platform = ${common_LPC.platform} extends = common_LPC board = nxp_lpc1769 +# BTT SKR 1.4 needs a UART3 tweak +[env:LPC1768_btt_skr_v1_4] +platform = ${LPC1768.platform} +extends = env:LPC1768 +build_flags = ${env:LPC1768.build_flags} -DLPC_PINCFG_UART3_P4_28 + ################################# # # # STM32 Architecture # From d05bf563a21e023f91d0637e3e9012df7c0d1d01 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Sat, 6 Mar 2021 00:12:57 +0000 Subject: [PATCH 096/253] [cron] Bump distribution date (2021-03-06) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index e57a3485d9..be2dd72ec4 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2021-03-05" + #define STRING_DISTRIBUTION_DATE "2021-03-06" #endif /** From 3eb8e26174efd20797addced921069050d1a344f Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Fri, 5 Mar 2021 23:53:44 -0800 Subject: [PATCH 097/253] Tweak/Consolidate followup (#21261) --- platformio.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/platformio.ini b/platformio.ini index 74452754ad..0ed883ba0d 100644 --- a/platformio.ini +++ b/platformio.ini @@ -729,7 +729,7 @@ board = nxp_lpc1769 # BTT SKR 1.4 needs a UART3 tweak [env:LPC1768_btt_skr_v1_4] -platform = ${LPC1768.platform} +platform = ${env:LPC1768.platform} extends = env:LPC1768 build_flags = ${env:LPC1768.build_flags} -DLPC_PINCFG_UART3_P4_28 From a1796ecace74680434237507548d40cef15564ad Mon Sep 17 00:00:00 2001 From: qwewer0 <57561110+qwewer0@users.noreply.github.com> Date: Sat, 6 Mar 2021 08:56:43 +0100 Subject: [PATCH 098/253] Link to bugfix tree (#21263) --- config/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/config/README.md b/config/README.md index b5013627ea..4bd6ab851e 100644 --- a/config/README.md +++ b/config/README.md @@ -2,7 +2,7 @@ Marlin configurations for specific machines are now maintained in their own repository at: -## https://github.com/MarlinFirmware/Configurations +## https://github.com/MarlinFirmware/Configurations/tree/bugfix-2.0.x Configuration files for use with the nightly `bugfix-2.0.x` branch can be downloaded from: From 4182cf3e9e935ff90701a497ee34ca8ebef263c4 Mon Sep 17 00:00:00 2001 From: "Zs.Antal" <45710979+AntoszHUN@users.noreply.github.com> Date: Sat, 6 Mar 2021 09:00:10 +0100 Subject: [PATCH 099/253] Update Hungarian language (#21266) --- Marlin/src/lcd/language/language_hu.h | 403 ++++++++++++++------------ 1 file changed, 214 insertions(+), 189 deletions(-) diff --git a/Marlin/src/lcd/language/language_hu.h b/Marlin/src/lcd/language/language_hu.h index c5cd845c27..e29b75fb35 100644 --- a/Marlin/src/lcd/language/language_hu.h +++ b/Marlin/src/lcd/language/language_hu.h @@ -27,14 +27,12 @@ * LCD Menü Üzenetek. Lásd még https://marlinfw.org/docs/development/lcd_language.html * Marlin 2.0.x bugfix Magyar fordítása. A fordítást folyamatosan javítom és frissítem. * A Magyar fordítást készítette: AntoszHUN - * - * + * A Fordítás utolsó frissítése: 2021.03.06. - 08:00 */ namespace Language_hu { using namespace Language_en; // A fordítás az örökölt Amerikai Angol (English) karakterláncokat használja. - constexpr uint8_t CHARSIZE = 2; PROGMEM Language_Str LANGUAGE = _UxGT("Magyar"); @@ -44,8 +42,8 @@ namespace Language_hu { PROGMEM Language_Str MSG_NO = _UxGT("NEM"); PROGMEM Language_Str MSG_BACK = _UxGT("Vissza"); PROGMEM Language_Str MSG_MEDIA_ABORTING = _UxGT("Megszakítás..."); - PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Tároló Behelyezve"); - PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Tároló Eltávolítva"); + PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Tároló behelyezve"); + PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Tároló eltávolítva"); PROGMEM Language_Str MSG_MEDIA_WAITING = _UxGT("Várakozás a tárolóra"); PROGMEM Language_Str MSG_SD_INIT_FAIL = _UxGT("SD-Kártya hiba"); PROGMEM Language_Str MSG_MEDIA_READ_ERROR = _UxGT("Tároló olvasási hiba"); @@ -53,31 +51,34 @@ namespace Language_hu { PROGMEM Language_Str MSG_MEDIA_USB_FAILED = _UxGT("USB eszköz hiba"); PROGMEM Language_Str MSG_KILL_SUBCALL_OVERFLOW = _UxGT("Túlfolyás"); PROGMEM Language_Str MSG_LCD_ENDSTOPS = _UxGT("Végállás"); // Maximum 8 karakter - PROGMEM Language_Str MSG_LCD_SOFT_ENDSTOPS = _UxGT("Szoft. Végállás"); + PROGMEM Language_Str MSG_LCD_SOFT_ENDSTOPS = _UxGT("Szoft. végállás"); PROGMEM Language_Str MSG_MAIN = _UxGT(""); - PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("További Beállítások"); + PROGMEM Language_Str MSG_ADVANCED_SETTINGS = _UxGT("További beállítások"); PROGMEM Language_Str MSG_CONFIGURATION = _UxGT("Konfiguráció"); - PROGMEM Language_Str MSG_AUTOSTART = _UxGT("Autoinditás"); + PROGMEM Language_Str MSG_RUN_AUTO_FILES = _UxGT("Fájl auto. futtatás"); PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Motorok kikapcsolása"); PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Hiba Menü"); PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Haladás sáv teszt"); - PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("XYZ Auto kezdöpont"); + PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("X-Y-Z Auto kezdöpont"); PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("X Kezdöpont"); PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Y Kezdöpont"); PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Z Kezdöpont"); PROGMEM Language_Str MSG_AUTO_Z_ALIGN = _UxGT("Auto Z-Igazítás"); - PROGMEM Language_Str MSG_ASSISTED_TRAMMING = _UxGT("Elektromos segéd"); PROGMEM Language_Str MSG_ITERATION = _UxGT("G34 Ismétlés: %i"); PROGMEM Language_Str MSG_DECREASING_ACCURACY = _UxGT("Pontosság csökken!"); PROGMEM Language_Str MSG_ACCURACY_ACHIEVED = _UxGT("Pontosság elérve"); - PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("XYZ Kezdöpont"); + PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("X-Y-Z Kezdöpont"); PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Kattints a kezdéshez."); - PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Következö Pont"); - PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Szintezés Kész!"); - PROGMEM Language_Str MSG_Z_FADE_HEIGHT = _UxGT("Szint Csökkentés"); + PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Következö pont"); + PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Szintezés kész!"); + PROGMEM Language_Str MSG_Z_FADE_HEIGHT = _UxGT("Szint csökkentés"); PROGMEM Language_Str MSG_SET_HOME_OFFSETS = _UxGT("Kezdöpont eltolás"); PROGMEM Language_Str MSG_HOME_OFFSETS_APPLIED = _UxGT("Eltolás beállítva."); PROGMEM Language_Str MSG_SET_ORIGIN = _UxGT("Eredeti Be"); + PROGMEM Language_Str MSG_ASSISTED_TRAMMING = _UxGT("Elektromos segéd"); + PROGMEM Language_Str MSG_TRAMMING_WIZARD = _UxGT("Elektromos varázsló"); + PROGMEM Language_Str MSG_SELECT_ORIGIN = _UxGT("Eredeti választása"); + PROGMEM Language_Str MSG_LAST_VALUE_SP = _UxGT("Utolsó érték "); #if PREHEAT_COUNT PROGMEM Language_Str MSG_PREHEAT_1 = _UxGT("Fütés ") PREHEAT_1_LABEL; PROGMEM Language_Str MSG_PREHEAT_1_H = _UxGT("Fütés ") PREHEAT_1_LABEL " ~"; @@ -95,36 +96,43 @@ namespace Language_hu { PROGMEM Language_Str MSG_PREHEAT_M_BEDONLY = _UxGT("Fütés $ Ágy"); PROGMEM Language_Str MSG_PREHEAT_M_SETTINGS = _UxGT("Fütés $ Beáll"); #endif - PROGMEM Language_Str MSG_PREHEAT_CUSTOM = _UxGT("Egyedi Elömelegítés"); + PROGMEM Language_Str MSG_PREHEAT_CUSTOM = _UxGT("Egyedi elömelegítés"); PROGMEM Language_Str MSG_COOLDOWN = _UxGT("Visszahütés"); + PROGMEM Language_Str MSG_CUTTER_FREQUENCY = _UxGT("Frekvencia"); - PROGMEM Language_Str MSG_LASER_MENU = _UxGT("Lézer Vezérlés"); - PROGMEM Language_Str MSG_LASER_OFF = _UxGT("Lézer Ki"); - PROGMEM Language_Str MSG_LASER_ON = _UxGT("Lézer Be"); - PROGMEM Language_Str MSG_LASER_POWER = _UxGT("Lézer Teljesítmény"); - PROGMEM Language_Str MSG_SPINDLE_MENU = _UxGT("Orsó Vezérlés"); - PROGMEM Language_Str MSG_SPINDLE_OFF = _UxGT("Orsó Ki"); - PROGMEM Language_Str MSG_SPINDLE_ON = _UxGT("Orsó Be"); - PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("Orsó Teljesítmény"); - PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("Orsó Hátra"); + PROGMEM Language_Str MSG_LASER_MENU = _UxGT("Lézer vezérlés"); + PROGMEM Language_Str MSG_SPINDLE_MENU = _UxGT("Orsó vezérlés"); + PROGMEM Language_Str MSG_LASER_POWER = _UxGT("Lézer telj."); + PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("Orsó telj."); + PROGMEM Language_Str MSG_LASER_TOGGLE = _UxGT("Lézer váltás"); + PROGMEM Language_Str MSG_LASER_PULSE_MS = _UxGT("Impulzus teszt ms"); + PROGMEM Language_Str MSG_LASER_FIRE_PULSE = _UxGT("Tűz impulzus"); + PROGMEM Language_Str MSG_SPINDLE_TOGGLE = _UxGT("Orsóváltás"); + PROGMEM Language_Str MSG_SPINDLE_FORWARD = _UxGT("Orsó előre"); + PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("Orsó hátra"); + PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Bekapcsolás"); PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Kikapcsolás"); - PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Extrudál"); + PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Adagol"); PROGMEM Language_Str MSG_RETRACT = _UxGT("Visszahúz"); - PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Tengelyek Mozgatása"); - PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Ágy Szintezés"); + PROGMEM Language_Str MSG_MOVE_AXIS = _UxGT("Tengelyek mozgatása"); + PROGMEM Language_Str MSG_BED_LEVELING = _UxGT("Ágy szintezés"); PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Ágy szintezése"); PROGMEM Language_Str MSG_LEVEL_CORNERS = _UxGT("Sarok szint"); + PROGMEM Language_Str MSG_LEVEL_CORNERS_RAISE = _UxGT("Ágy emelése a szonda váltásig"); + PROGMEM Language_Str MSG_LEVEL_CORNERS_IN_RANGE = _UxGT("Minden sarok tolerancián belül. Szint jó"); + PROGMEM Language_Str MSG_LEVEL_CORNERS_GOOD_POINTS = _UxGT("Jó pontok: "); + PROGMEM Language_Str MSG_LEVEL_CORNERS_LAST_Z = _UxGT("Utolsó Z: "); PROGMEM Language_Str MSG_NEXT_CORNER = _UxGT("Következö sarok"); - PROGMEM Language_Str MSG_MESH_EDITOR = _UxGT("Háló Szerkesztö"); - PROGMEM Language_Str MSG_EDIT_MESH = _UxGT("Háló Szerkesztése"); - PROGMEM Language_Str MSG_EDITING_STOPPED = _UxGT("Háló Szerk. Állj"); + PROGMEM Language_Str MSG_MESH_EDITOR = _UxGT("Háló szerkesztö"); + PROGMEM Language_Str MSG_EDIT_MESH = _UxGT("Háló szerkesztése"); + PROGMEM Language_Str MSG_EDITING_STOPPED = _UxGT("Háló szerk. állj"); PROGMEM Language_Str MSG_PROBING_MESH = _UxGT("Próbapont"); PROGMEM Language_Str MSG_MESH_X = _UxGT("Index X"); PROGMEM Language_Str MSG_MESH_Y = _UxGT("Index Y"); PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Z Érték"); PROGMEM Language_Str MSG_USER_MENU = _UxGT("Egyéni parancs"); - PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 Probe Teszt"); + PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 Probe teszt"); PROGMEM Language_Str MSG_M48_POINT = _UxGT("M48 Pont"); PROGMEM Language_Str MSG_M48_OUT_OF_BOUNDS = _UxGT("Szonda határon kívül"); PROGMEM Language_Str MSG_M48_DEVIATION = _UxGT("Eltérés"); @@ -134,6 +142,7 @@ namespace Language_hu { PROGMEM Language_Str MSG_IDEX_MODE_DUPLICATE = _UxGT("Duplikálás"); PROGMEM Language_Str MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("Tükrözött másolás"); PROGMEM Language_Str MSG_IDEX_MODE_FULL_CTRL = _UxGT("Teljes felügyelet"); + PROGMEM Language_Str MSG_IDEX_DUPE_GAP = _UxGT("X-Hézag másolása"); PROGMEM Language_Str MSG_HOTEND_OFFSET_X = _UxGT("2. fúvóka X"); PROGMEM Language_Str MSG_HOTEND_OFFSET_Y = _UxGT("2. fúvóka Y"); PROGMEM Language_Str MSG_HOTEND_OFFSET_Z = _UxGT("2. fúvóka Z"); @@ -146,75 +155,75 @@ namespace Language_hu { PROGMEM Language_Str MSG_UBL_BC_INSERT2 = _UxGT("Mérés"); PROGMEM Language_Str MSG_UBL_BC_REMOVE = _UxGT("Üres ágyat mérj"); PROGMEM Language_Str MSG_UBL_MOVING_TO_NEXT = _UxGT("Továbblépés"); - PROGMEM Language_Str MSG_UBL_ACTIVATE_MESH = _UxGT("UBL Aktivál"); - PROGMEM Language_Str MSG_UBL_DEACTIVATE_MESH = _UxGT("UBL Deaktivál"); - PROGMEM Language_Str MSG_UBL_SET_TEMP_BED = _UxGT("Ágy Höfok"); - PROGMEM Language_Str MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Ágy Höfok"); - PROGMEM Language_Str MSG_UBL_SET_TEMP_HOTEND = _UxGT("Fúvóka Höfok"); - PROGMEM Language_Str MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Fúvóka Höfok"); - PROGMEM Language_Str MSG_UBL_MESH_EDIT = _UxGT("Háló Szerkesztés"); - PROGMEM Language_Str MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Egyéni Háló Szerkesztés"); - PROGMEM Language_Str MSG_UBL_FINE_TUNE_MESH = _UxGT("Finomított Háló"); - PROGMEM Language_Str MSG_UBL_DONE_EDITING_MESH = _UxGT("Háló Kész"); - PROGMEM Language_Str MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Egyéni Háló Építés"); - PROGMEM Language_Str MSG_UBL_BUILD_MESH_MENU = _UxGT("Háló Építés"); - PROGMEM Language_Str MSG_UBL_BUILD_MESH_M = _UxGT("Háló Építés ($)"); + PROGMEM Language_Str MSG_UBL_ACTIVATE_MESH = _UxGT("UBL Aktívál"); + PROGMEM Language_Str MSG_UBL_DEACTIVATE_MESH = _UxGT("UBL Deaktívál"); + PROGMEM Language_Str MSG_UBL_SET_TEMP_BED = _UxGT("Ágy höfok"); + PROGMEM Language_Str MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Ágy höfok"); + PROGMEM Language_Str MSG_UBL_SET_TEMP_HOTEND = _UxGT("Fúvóka höfok"); + PROGMEM Language_Str MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Fúvóka höfok"); + PROGMEM Language_Str MSG_UBL_MESH_EDIT = _UxGT("Háló szerkesztés"); + PROGMEM Language_Str MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Egyéni háló szerkesztés"); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_MESH = _UxGT("Finomított háló"); + PROGMEM Language_Str MSG_UBL_DONE_EDITING_MESH = _UxGT("Háló kész"); + PROGMEM Language_Str MSG_UBL_BUILD_CUSTOM_MESH = _UxGT("Egyéni háló építés"); + PROGMEM Language_Str MSG_UBL_BUILD_MESH_MENU = _UxGT("Háló építés"); + PROGMEM Language_Str MSG_UBL_BUILD_MESH_M = _UxGT("Háló építés ($)"); PROGMEM Language_Str MSG_UBL_BUILD_COLD_MESH = _UxGT("Hideg háló építés"); PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_ADJUST = _UxGT("Háló magasság állítás"); PROGMEM Language_Str MSG_UBL_MESH_HEIGHT_AMOUNT = _UxGT("Magasság összege"); - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Háló Elfogadás"); - PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M = _UxGT("Háló Elfogadás ($)"); - PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Valódi Háló Elfogadása"); - PROGMEM Language_Str MSG_G26_HEATING_BED = _UxGT("G26 Ágy Fűtés"); - PROGMEM Language_Str MSG_G26_HEATING_NOZZLE = _UxGT("G26 Fúvóka Fűtés"); + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Háló elfogadás"); + PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M = _UxGT("Háló elfogadás ($)"); + PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Valódi háló elfogadása"); + PROGMEM Language_Str MSG_G26_HEATING_BED = _UxGT("G26 Ágy fűtés"); + PROGMEM Language_Str MSG_G26_HEATING_NOZZLE = _UxGT("G26 Fúvóka fűtés"); PROGMEM Language_Str MSG_G26_MANUAL_PRIME = _UxGT("Kézi alapozás..."); PROGMEM Language_Str MSG_G26_FIXED_LENGTH = _UxGT("Fix hosszúságú alap"); - PROGMEM Language_Str MSG_G26_PRIME_DONE = _UxGT("Alapozás Kész"); + PROGMEM Language_Str MSG_G26_PRIME_DONE = _UxGT("Alapozás kész"); PROGMEM Language_Str MSG_G26_CANCELED = _UxGT("G26 Törölve"); PROGMEM Language_Str MSG_G26_LEAVING = _UxGT("Kilépö G26"); - PROGMEM Language_Str MSG_UBL_CONTINUE_MESH = _UxGT("Ágy Háló Folyt."); - PROGMEM Language_Str MSG_UBL_MESH_LEVELING = _UxGT("Háló Szintezés"); - PROGMEM Language_Str MSG_UBL_3POINT_MESH_LEVELING = _UxGT("3-Pontos Szintezés"); - PROGMEM Language_Str MSG_UBL_GRID_MESH_LEVELING = _UxGT("Rács Szintezés"); - PROGMEM Language_Str MSG_UBL_MESH_LEVEL = _UxGT("Háló Szint"); + PROGMEM Language_Str MSG_UBL_CONTINUE_MESH = _UxGT("Ágy háló folyt."); + PROGMEM Language_Str MSG_UBL_MESH_LEVELING = _UxGT("Háló szintezés"); + PROGMEM Language_Str MSG_UBL_3POINT_MESH_LEVELING = _UxGT("3-Pontos szintezés"); + PROGMEM Language_Str MSG_UBL_GRID_MESH_LEVELING = _UxGT("Rács szintezés"); + PROGMEM Language_Str MSG_UBL_MESH_LEVEL = _UxGT("Háló szint"); PROGMEM Language_Str MSG_UBL_SIDE_POINTS = _UxGT("Oldal pontok"); - PROGMEM Language_Str MSG_UBL_MAP_TYPE = _UxGT("Térkép Típus"); - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP = _UxGT("Háló Térkép Kimenet"); - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_HOST = _UxGT("Host Kimenet"); - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_CSV = _UxGT("CSV Kimenet"); - PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Nyomtató Backup Ki"); - PROGMEM Language_Str MSG_UBL_INFO_UBL = _UxGT("UBL Infó Kimenet"); - PROGMEM Language_Str MSG_UBL_FILLIN_AMOUNT = _UxGT("Kitöltési Költség"); - PROGMEM Language_Str MSG_UBL_MANUAL_FILLIN = _UxGT("Kézi Kitöltés"); - PROGMEM Language_Str MSG_UBL_SMART_FILLIN = _UxGT("Okos Kitöltés"); - PROGMEM Language_Str MSG_UBL_FILLIN_MESH = _UxGT("Háló Kitöltés"); - PROGMEM Language_Str MSG_UBL_INVALIDATE_ALL = _UxGT("Minden Érvénytelen"); - PROGMEM Language_Str MSG_UBL_INVALIDATE_CLOSEST = _UxGT("Közelebbi Érvénytelen"); - PROGMEM Language_Str MSG_UBL_FINE_TUNE_ALL = _UxGT("Mindet Finomhangolja"); - PROGMEM Language_Str MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("Közelebbi Finomhangolása"); - PROGMEM Language_Str MSG_UBL_STORAGE_MESH_MENU = _UxGT("Háló Tárolás"); - PROGMEM Language_Str MSG_UBL_STORAGE_SLOT = _UxGT("Memória Foglalat"); - PROGMEM Language_Str MSG_UBL_LOAD_MESH = _UxGT("Ágy háló Betöltés"); - PROGMEM Language_Str MSG_UBL_SAVE_MESH = _UxGT("Ágy háló Mentés"); - PROGMEM Language_Str MSG_MESH_LOADED = _UxGT("M117 Háló %i Betöltve"); - PROGMEM Language_Str MSG_MESH_SAVED = _UxGT("M117 Háló %i Mentve"); + PROGMEM Language_Str MSG_UBL_MAP_TYPE = _UxGT("Térkép típus"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP = _UxGT("Háló térkép kimenet"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_HOST = _UxGT("Host kimenet"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_CSV = _UxGT("CSV kimenet"); + PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Nyomtató bizt.mentés"); + PROGMEM Language_Str MSG_UBL_INFO_UBL = _UxGT("UBL Infó kimenet"); + PROGMEM Language_Str MSG_UBL_FILLIN_AMOUNT = _UxGT("Kitöltési költség"); + PROGMEM Language_Str MSG_UBL_MANUAL_FILLIN = _UxGT("Kézi kitöltés"); + PROGMEM Language_Str MSG_UBL_SMART_FILLIN = _UxGT("Okos kitöltés"); + PROGMEM Language_Str MSG_UBL_FILLIN_MESH = _UxGT("Háló kitöltés"); + PROGMEM Language_Str MSG_UBL_INVALIDATE_ALL = _UxGT("Minden érvénytelen"); + PROGMEM Language_Str MSG_UBL_INVALIDATE_CLOSEST = _UxGT("Közelebbi érvénytelen"); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_ALL = _UxGT("Mindet finomhangolja"); + PROGMEM Language_Str MSG_UBL_FINE_TUNE_CLOSEST = _UxGT("Közelebbi finomhangolása"); + PROGMEM Language_Str MSG_UBL_STORAGE_MESH_MENU = _UxGT("Háló tárolás"); + PROGMEM Language_Str MSG_UBL_STORAGE_SLOT = _UxGT("Memória foglalat"); + PROGMEM Language_Str MSG_UBL_LOAD_MESH = _UxGT("Ágy háló betöltés"); + PROGMEM Language_Str MSG_UBL_SAVE_MESH = _UxGT("Ágy háló mentés"); + PROGMEM Language_Str MSG_MESH_LOADED = _UxGT("M117 Háló %i betöltve"); + PROGMEM Language_Str MSG_MESH_SAVED = _UxGT("M117 Háló %i mentve"); PROGMEM Language_Str MSG_UBL_NO_STORAGE = _UxGT("Nincs tároló"); PROGMEM Language_Str MSG_UBL_SAVE_ERROR = _UxGT("Hiba: UBL Mentés"); PROGMEM Language_Str MSG_UBL_RESTORE_ERROR = _UxGT("Hiba: UBL Visszaáll"); PROGMEM Language_Str MSG_UBL_Z_OFFSET = _UxGT("Z-Eltolás: "); - PROGMEM Language_Str MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Z-Eltolás Leállítva"); - PROGMEM Language_Str MSG_UBL_STEP_BY_STEP_MENU = _UxGT("Lépésröl Lépésre UBL"); - PROGMEM Language_Str MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1. Hideg Háló Készítés"); - PROGMEM Language_Str MSG_UBL_2_SMART_FILLIN = _UxGT("2. Inteligens Kitöltés"); - PROGMEM Language_Str MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3. Háló Érvényesítés"); - PROGMEM Language_Str MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4. Minden Finomítása"); - PROGMEM Language_Str MSG_UBL_5_VALIDATE_MESH_MENU = _UxGT("5. Háló Érvényesítés"); - PROGMEM Language_Str MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6. Minden Finomítása"); - PROGMEM Language_Str MSG_UBL_7_SAVE_MESH = _UxGT("7. Ágy Háló Mentése"); + PROGMEM Language_Str MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Z-Eltolás leállítva"); + PROGMEM Language_Str MSG_UBL_STEP_BY_STEP_MENU = _UxGT("Lépésröl lépésre UBL"); + PROGMEM Language_Str MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1. Hideg háló készítés"); + PROGMEM Language_Str MSG_UBL_2_SMART_FILLIN = _UxGT("2. Inteligens kitöltés"); + PROGMEM Language_Str MSG_UBL_3_VALIDATE_MESH_MENU = _UxGT("3. Háló érvényesítés"); + PROGMEM Language_Str MSG_UBL_4_FINE_TUNE_ALL = _UxGT("4. Minden finomítása"); + PROGMEM Language_Str MSG_UBL_5_VALIDATE_MESH_MENU = _UxGT("5. Háló érvényesítés"); + PROGMEM Language_Str MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6. Minden finomítása"); + PROGMEM Language_Str MSG_UBL_7_SAVE_MESH = _UxGT("7. Ágy háló mentése"); PROGMEM Language_Str MSG_LED_CONTROL = _UxGT("LED Vezérlés"); PROGMEM Language_Str MSG_LEDS = _UxGT("Világítás"); - PROGMEM Language_Str MSG_LED_PRESETS = _UxGT("Beállított Színek"); + PROGMEM Language_Str MSG_LED_PRESETS = _UxGT("Beállított színek"); PROGMEM Language_Str MSG_SET_LEDS_RED = _UxGT("Piros"); PROGMEM Language_Str MSG_SET_LEDS_ORANGE = _UxGT("Narancs"); PROGMEM Language_Str MSG_SET_LEDS_YELLOW = _UxGT("Sárga"); @@ -225,14 +234,14 @@ namespace Language_hu { PROGMEM Language_Str MSG_SET_LEDS_WHITE = _UxGT("Fehér"); PROGMEM Language_Str MSG_SET_LEDS_DEFAULT = _UxGT("Alapérték"); PROGMEM Language_Str MSG_LED_CHANNEL_N = _UxGT("Csatorna ="); - PROGMEM Language_Str MSG_LEDS2 = _UxGT("LEDek #2"); + PROGMEM Language_Str MSG_LEDS2 = _UxGT("LED-ek #2"); PROGMEM Language_Str MSG_NEO2_PRESETS = _UxGT("Fény #2 Megadott"); PROGMEM Language_Str MSG_NEO2_BRIGHTNESS = _UxGT("Fényerő"); - PROGMEM Language_Str MSG_CUSTOM_LEDS = _UxGT("Egyéni Szín"); - PROGMEM Language_Str MSG_INTENSITY_R = _UxGT("Piros Intenzitás"); - PROGMEM Language_Str MSG_INTENSITY_G = _UxGT("Zöld Intenzitás"); - PROGMEM Language_Str MSG_INTENSITY_B = _UxGT("Kék Intenzitás"); - PROGMEM Language_Str MSG_INTENSITY_W = _UxGT("Fehér Intenzitás"); + PROGMEM Language_Str MSG_CUSTOM_LEDS = _UxGT("Egyéni szín"); + PROGMEM Language_Str MSG_INTENSITY_R = _UxGT("Piros intenzitás"); + PROGMEM Language_Str MSG_INTENSITY_G = _UxGT("Zöld intenzitás"); + PROGMEM Language_Str MSG_INTENSITY_B = _UxGT("Kék intenzitás"); + PROGMEM Language_Str MSG_INTENSITY_W = _UxGT("Fehér intenzitás"); PROGMEM Language_Str MSG_LED_BRIGHTNESS = _UxGT("Fényerö"); PROGMEM Language_Str MSG_MOVING = _UxGT("Mozgás..."); @@ -243,27 +252,30 @@ namespace Language_hu { PROGMEM Language_Str MSG_MOVE_E = _UxGT("Adagoló"); PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Adagoló *"); PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("A fúvóka túl hideg"); - PROGMEM Language_Str MSG_MOVE_Z_DIST = _UxGT("Mozgás %smm"); + PROGMEM Language_Str MSG_MOVE_N_MM = _UxGT("Mozgás %smm"); PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Mozgás 0.1mm"); PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Mozgás 1mm"); PROGMEM Language_Str MSG_MOVE_10MM = _UxGT("Mozgás 10mm"); + PROGMEM Language_Str MSG_MOVE_0001IN = _UxGT("Mozgás 0.001mm"); + PROGMEM Language_Str MSG_MOVE_001IN = _UxGT("Mozgás 0.01mm"); + PROGMEM Language_Str MSG_MOVE_01IN = _UxGT("Mozgás 0.1mm"); PROGMEM Language_Str MSG_SPEED = _UxGT("Sebesség"); PROGMEM Language_Str MSG_BED_Z = _UxGT("Z ágy"); PROGMEM Language_Str MSG_NOZZLE = _UxGT("Fúvóka"); PROGMEM Language_Str MSG_NOZZLE_N = _UxGT("Fúvóka ~"); - PROGMEM Language_Str MSG_NOZZLE_PARKED = _UxGT("Fej Parkolva"); - PROGMEM Language_Str MSG_NOZZLE_STANDBY = _UxGT("Fej Készenlétbe"); + PROGMEM Language_Str MSG_NOZZLE_PARKED = _UxGT("Fej parkolva"); + PROGMEM Language_Str MSG_NOZZLE_STANDBY = _UxGT("Fej készenlétbe"); PROGMEM Language_Str MSG_BED = _UxGT("Ágy"); PROGMEM Language_Str MSG_CHAMBER = _UxGT("Burkolat"); PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Hütés sebesség"); PROGMEM Language_Str MSG_FAN_SPEED_N = _UxGT("Hütés sebesség ="); - PROGMEM Language_Str MSG_STORED_FAN_N = _UxGT("Tárolt Hütés ="); + PROGMEM Language_Str MSG_STORED_FAN_N = _UxGT("Tárolt hütés ="); PROGMEM Language_Str MSG_EXTRA_FAN_SPEED = _UxGT("Extra hütés sebesség"); PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_N = _UxGT("Extra hütés sebesség ="); PROGMEM Language_Str MSG_CONTROLLER_FAN = _UxGT("Hűtésvezérlés"); PROGMEM Language_Str MSG_CONTROLLER_FAN_IDLE_SPEED = _UxGT("Alapjárat"); - PROGMEM Language_Str MSG_CONTROLLER_FAN_AUTO_ON = _UxGT("Automatikus Mód"); - PROGMEM Language_Str MSG_CONTROLLER_FAN_SPEED = _UxGT("Aktív Sebesség"); + PROGMEM Language_Str MSG_CONTROLLER_FAN_AUTO_ON = _UxGT("Automatikus mód"); + PROGMEM Language_Str MSG_CONTROLLER_FAN_SPEED = _UxGT("Aktív sebesség"); PROGMEM Language_Str MSG_CONTROLLER_FAN_DURATION = _UxGT("Készenlét"); PROGMEM Language_Str MSG_FLOW = _UxGT("Folyás"); PROGMEM Language_Str MSG_FLOW_N = _UxGT("Folyás ~"); @@ -271,13 +283,13 @@ namespace Language_hu { PROGMEM Language_Str MSG_MIN = " " LCD_STR_THERMOMETER _UxGT(" Minimum"); PROGMEM Language_Str MSG_MAX = " " LCD_STR_THERMOMETER _UxGT(" Maximum"); PROGMEM Language_Str MSG_FACTOR = " " LCD_STR_THERMOMETER _UxGT(" Tényezö"); - PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("Automata Höfok"); + PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("Automata höfok"); PROGMEM Language_Str MSG_LCD_ON = _UxGT("Be"); PROGMEM Language_Str MSG_LCD_OFF = _UxGT("Ki"); PROGMEM Language_Str MSG_PID_AUTOTUNE = _UxGT("PID Hangolás"); PROGMEM Language_Str MSG_PID_AUTOTUNE_E = _UxGT("PID Hangolás *"); - PROGMEM Language_Str MSG_PID_AUTOTUNE_DONE = _UxGT("PID hangolás kész"); - PROGMEM Language_Str MSG_PID_BAD_EXTRUDER_NUM = _UxGT("Hangolási hiba. Rossz Adagoló."); + PROGMEM Language_Str MSG_PID_AUTOTUNE_DONE = _UxGT("PID Hangolás kész"); + PROGMEM Language_Str MSG_PID_BAD_EXTRUDER_NUM = _UxGT("Hangolási hiba. Rossz adagoló."); PROGMEM Language_Str MSG_PID_TEMP_TOO_HIGH = _UxGT("Hangolási hiba. Magas hömérséklet."); PROGMEM Language_Str MSG_PID_TIMEOUT = _UxGT("Hangolási hiba! Idötúllépés."); PROGMEM Language_Str MSG_SELECT = _UxGT("Kiválaszt"); @@ -288,25 +300,25 @@ namespace Language_hu { PROGMEM Language_Str MSG_VB_JERK = LCD_STR_B _UxGT(" Ránt. Seb."); PROGMEM Language_Str MSG_VC_JERK = LCD_STR_C _UxGT(" Ránt. Seb."); PROGMEM Language_Str MSG_VE_JERK = _UxGT("E Ránt. Seb."); - PROGMEM Language_Str MSG_JUNCTION_DEVIATION = _UxGT("Csomopont Eltérés"); + PROGMEM Language_Str MSG_JUNCTION_DEVIATION = _UxGT("Csomopont eltérés"); PROGMEM Language_Str MSG_VELOCITY = _UxGT("Sebesség"); - PROGMEM Language_Str MSG_VMAX_A = _UxGT("Max Sebesség ") LCD_STR_A; - PROGMEM Language_Str MSG_VMAX_B = _UxGT("Max Sebesség ") LCD_STR_B; - PROGMEM Language_Str MSG_VMAX_C = _UxGT("Max Sebesség ") LCD_STR_C; - PROGMEM Language_Str MSG_VMAX_E = _UxGT("Max Sebesség ") LCD_STR_E; - PROGMEM Language_Str MSG_VMAX_EN = _UxGT("Max Sebesség *"); - PROGMEM Language_Str MSG_VMIN = _UxGT("Min Sebesség"); - PROGMEM Language_Str MSG_VTRAV_MIN = _UxGT("Min Utazó.seb."); + PROGMEM Language_Str MSG_VMAX_A = _UxGT("Max sebesség ") LCD_STR_A; + PROGMEM Language_Str MSG_VMAX_B = _UxGT("Max sebesség ") LCD_STR_B; + PROGMEM Language_Str MSG_VMAX_C = _UxGT("Max sebesség ") LCD_STR_C; + PROGMEM Language_Str MSG_VMAX_E = _UxGT("Max sebesség ") LCD_STR_E; + PROGMEM Language_Str MSG_VMAX_EN = _UxGT("Max sebesség *"); + PROGMEM Language_Str MSG_VMIN = _UxGT("Min sebesség"); + PROGMEM Language_Str MSG_VTRAV_MIN = _UxGT("Min utazó.seb."); PROGMEM Language_Str MSG_ACCELERATION = _UxGT("Gyorsulás"); - PROGMEM Language_Str MSG_AMAX_A = _UxGT("Max Gyors. ") LCD_STR_A; - PROGMEM Language_Str MSG_AMAX_B = _UxGT("Max Gyors. ") LCD_STR_B; - PROGMEM Language_Str MSG_AMAX_C = _UxGT("Max Gyors. ") LCD_STR_C; - PROGMEM Language_Str MSG_AMAX_E = _UxGT("Max Gyors. ") LCD_STR_E; - PROGMEM Language_Str MSG_AMAX_EN = _UxGT("Max Gyorsulás *"); + PROGMEM Language_Str MSG_AMAX_A = _UxGT("Max gyors. ") LCD_STR_A; + PROGMEM Language_Str MSG_AMAX_B = _UxGT("Max gyors. ") LCD_STR_B; + PROGMEM Language_Str MSG_AMAX_C = _UxGT("Max gyors. ") LCD_STR_C; + PROGMEM Language_Str MSG_AMAX_E = _UxGT("Max gyors. ") LCD_STR_E; + PROGMEM Language_Str MSG_AMAX_EN = _UxGT("Max gyorsulás *"); PROGMEM Language_Str MSG_A_RETRACT = _UxGT("Visszahúzás"); PROGMEM Language_Str MSG_A_TRAVEL = _UxGT("Utazás"); - PROGMEM Language_Str MSG_XY_FREQUENCY_LIMIT = _UxGT("Max Frekvencia"); - PROGMEM Language_Str MSG_XY_FREQUENCY_FEEDRATE = _UxGT("Min Elötolás"); + PROGMEM Language_Str MSG_XY_FREQUENCY_LIMIT = _UxGT("Max frekvencia"); + PROGMEM Language_Str MSG_XY_FREQUENCY_FEEDRATE = _UxGT("Min elötolás"); PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("Lépés/mm"); PROGMEM Language_Str MSG_A_STEPS = LCD_STR_A _UxGT(" lépés/mm"); PROGMEM Language_Str MSG_B_STEPS = LCD_STR_B _UxGT(" lépés/mm"); @@ -325,7 +337,7 @@ namespace Language_hu { PROGMEM Language_Str MSG_FILAMENT_LOAD = _UxGT("Betöltés mm"); PROGMEM Language_Str MSG_ADVANCE_K = _UxGT("Haladó K"); PROGMEM Language_Str MSG_ADVANCE_K_E = _UxGT("Haladó K *"); - PROGMEM Language_Str MSG_CONTRAST = _UxGT("LCD kontraszt"); + PROGMEM Language_Str MSG_CONTRAST = _UxGT("LCD Kontraszt"); PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Mentés EEPROM"); PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Betöltés EEPROM"); PROGMEM Language_Str MSG_RESTORE_DEFAULTS = _UxGT("Alapértelmezett"); @@ -333,9 +345,9 @@ namespace Language_hu { PROGMEM Language_Str MSG_ERR_EEPROM_CRC = _UxGT("Hiba: EEPROM CRC"); PROGMEM Language_Str MSG_ERR_EEPROM_INDEX = _UxGT("Hiba: EEPROM Index"); PROGMEM Language_Str MSG_ERR_EEPROM_VERSION = _UxGT("Hiba: EEPROM Verzió"); - PROGMEM Language_Str MSG_SETTINGS_STORED = _UxGT("Beállítások Mentve"); - PROGMEM Language_Str MSG_MEDIA_UPDATE = _UxGT("Tároló Frissítés"); - PROGMEM Language_Str MSG_RESET_PRINTER = _UxGT("Nyomtató Újraindítása"); + PROGMEM Language_Str MSG_SETTINGS_STORED = _UxGT("Beállítások mentve"); + PROGMEM Language_Str MSG_MEDIA_UPDATE = _UxGT("Tároló frissítés"); + PROGMEM Language_Str MSG_RESET_PRINTER = _UxGT("Nyomtató újraindítása"); PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Frissítés"); PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT(""); PROGMEM Language_Str MSG_PREPARE = _UxGT("Vezérlés"); @@ -344,7 +356,7 @@ namespace Language_hu { PROGMEM Language_Str MSG_CURRENT = _UxGT("Jelenlegi"); PROGMEM Language_Str MSG_VOLTAGE = _UxGT("Feszültség"); PROGMEM Language_Str MSG_POWER = _UxGT("Energia"); - PROGMEM Language_Str MSG_START_PRINT = _UxGT("Nyomtatás Indítása"); + PROGMEM Language_Str MSG_START_PRINT = _UxGT("Nyomtatás indítása"); PROGMEM Language_Str MSG_BUTTON_NEXT = _UxGT("Tovább"); PROGMEM Language_Str MSG_BUTTON_INIT = _UxGT("Kezdet"); PROGMEM Language_Str MSG_BUTTON_STOP = _UxGT("Állj"); @@ -355,23 +367,25 @@ namespace Language_hu { PROGMEM Language_Str MSG_BUTTON_DONE = _UxGT("Kész"); PROGMEM Language_Str MSG_BUTTON_BACK = _UxGT("Vissza"); PROGMEM Language_Str MSG_BUTTON_PROCEED = _UxGT("Folytatás"); + PROGMEM Language_Str MSG_BUTTON_SKIP = _UxGT("Kihagy"); PROGMEM Language_Str MSG_PAUSING = _UxGT("Szüneteltetve..."); - PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Nyomtatás Szünetelés"); + PROGMEM Language_Str MSG_PAUSE_PRINT = _UxGT("Nyomtatás szünetelés"); PROGMEM Language_Str MSG_RESUME_PRINT = _UxGT("Nyomtatás folytatása"); PROGMEM Language_Str MSG_HOST_START_PRINT = _UxGT("Hoszt indítás"); PROGMEM Language_Str MSG_STOP_PRINT = _UxGT("Nyomtatás leállítása"); - PROGMEM Language_Str MSG_PRINTING_OBJECT = _UxGT("Objektum Nyomtatása"); - PROGMEM Language_Str MSG_CANCEL_OBJECT = _UxGT("Objektum Törlése"); - PROGMEM Language_Str MSG_CANCEL_OBJECT_N = _UxGT("Objektum Törlése ="); - PROGMEM Language_Str MSG_OUTAGE_RECOVERY = _UxGT("Kiesés Helyreáll."); - PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("Nyomtatás Tárolóról"); - PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("Nincs Tároló"); + PROGMEM Language_Str MSG_END_LOOPS = _UxGT("Hurok ismétlés vége"); + PROGMEM Language_Str MSG_PRINTING_OBJECT = _UxGT("Objektum nyomtatása"); + PROGMEM Language_Str MSG_CANCEL_OBJECT = _UxGT("Objektum törlése"); + PROGMEM Language_Str MSG_CANCEL_OBJECT_N = _UxGT("Objektum törlése ="); + PROGMEM Language_Str MSG_OUTAGE_RECOVERY = _UxGT("Kiesés helyreáll."); + PROGMEM Language_Str MSG_MEDIA_MENU = _UxGT("Nyomtatás tárolóról"); + PROGMEM Language_Str MSG_NO_MEDIA = _UxGT("Nincs tároló"); PROGMEM Language_Str MSG_DWELL = _UxGT("Alvás..."); PROGMEM Language_Str MSG_USERWAIT = _UxGT("Katt a folytatáshoz..."); PROGMEM Language_Str MSG_PRINT_PAUSED = _UxGT("Nyomtatás szünetelve"); PROGMEM Language_Str MSG_PRINTING = _UxGT("Nyomtatás..."); PROGMEM Language_Str MSG_PRINT_ABORTED = _UxGT("Nyomtatás leállítva"); - PROGMEM Language_Str MSG_PRINT_DONE = _UxGT("Nyomtatás Kész"); + PROGMEM Language_Str MSG_PRINT_DONE = _UxGT("Nyomtatás kész"); PROGMEM Language_Str MSG_NO_MOVE = _UxGT("Nincs mozgás."); PROGMEM Language_Str MSG_KILLED = _UxGT("HALOTT! "); PROGMEM Language_Str MSG_STOPPED = _UxGT("MEGÁLLT! "); @@ -381,25 +395,25 @@ namespace Language_hu { PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Ugrás mm"); PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Visszah.helyre mm"); PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Csere.Visszah.helyre mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Unretract V"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S UnRet V"); - PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("AutoVisszah."); - PROGMEM Language_Str MSG_FILAMENT_SWAP_LENGTH = _UxGT("Visszahúzás Távolság"); - PROGMEM Language_Str MSG_FILAMENT_SWAP_EXTRA = _UxGT("Extra Csere"); - PROGMEM Language_Str MSG_FILAMENT_PURGE_LENGTH = _UxGT("Tisztítási Távolság"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Visszahúzás V"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S Vissza.h V"); + PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("Auto Visszah."); + PROGMEM Language_Str MSG_FILAMENT_SWAP_LENGTH = _UxGT("Visszahúzás távolság"); + PROGMEM Language_Str MSG_FILAMENT_SWAP_EXTRA = _UxGT("Extra csere"); + PROGMEM Language_Str MSG_FILAMENT_PURGE_LENGTH = _UxGT("Tisztítási távolság"); PROGMEM Language_Str MSG_TOOL_CHANGE = _UxGT("Szerszámcsere"); PROGMEM Language_Str MSG_TOOL_CHANGE_ZLIFT = _UxGT("Z Emelés"); PROGMEM Language_Str MSG_SINGLENOZZLE_PRIME_SPEED = _UxGT("Fösebesség"); PROGMEM Language_Str MSG_SINGLENOZZLE_RETRACT_SPEED = _UxGT("Visszah. Sebesség"); - PROGMEM Language_Str MSG_FILAMENT_PARK_ENABLED = _UxGT("Fej Parkolás"); - PROGMEM Language_Str MSG_SINGLENOZZLE_UNRETRACT_SPEED = _UxGT("Visszahúzás Sebesség"); + PROGMEM Language_Str MSG_FILAMENT_PARK_ENABLED = _UxGT("Fej parkolás"); + PROGMEM Language_Str MSG_SINGLENOZZLE_UNRETRACT_SPEED = _UxGT("Visszav.visszah. sebesség"); PROGMEM Language_Str MSG_SINGLENOZZLE_FAN_SPEED = _UxGT("FAN Sebesség"); PROGMEM Language_Str MSG_SINGLENOZZLE_FAN_TIME = _UxGT("FAN idö"); PROGMEM Language_Str MSG_TOOL_MIGRATION_ON = _UxGT("Auto BE"); PROGMEM Language_Str MSG_TOOL_MIGRATION_OFF = _UxGT("Auto KI"); PROGMEM Language_Str MSG_TOOL_MIGRATION = _UxGT("Szerszámcsere"); - PROGMEM Language_Str MSG_TOOL_MIGRATION_AUTO = _UxGT("Automata Csere"); - PROGMEM Language_Str MSG_TOOL_MIGRATION_END = _UxGT("Utolsó Adagoló"); + PROGMEM Language_Str MSG_TOOL_MIGRATION_AUTO = _UxGT("Automata csere"); + PROGMEM Language_Str MSG_TOOL_MIGRATION_END = _UxGT("Utolsó adagoló"); PROGMEM Language_Str MSG_TOOL_MIGRATION_SWAP = _UxGT("Csere *"); PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Szál csere"); PROGMEM Language_Str MSG_FILAMENTCHANGE_E = _UxGT("Szál csere *"); @@ -407,12 +421,12 @@ namespace Language_hu { PROGMEM Language_Str MSG_FILAMENTLOAD_E = _UxGT("Szál betöltés *"); PROGMEM Language_Str MSG_FILAMENTUNLOAD = _UxGT("Szál eltávolítás"); PROGMEM Language_Str MSG_FILAMENTUNLOAD_E = _UxGT("Szál eltávolítás *"); - PROGMEM Language_Str MSG_FILAMENTUNLOAD_ALL = _UxGT("Mindet Eltávolít"); + PROGMEM Language_Str MSG_FILAMENTUNLOAD_ALL = _UxGT("Mindet eltávolít"); PROGMEM Language_Str MSG_ATTACH_MEDIA = _UxGT("Tároló"); PROGMEM Language_Str MSG_CHANGE_MEDIA = _UxGT("Tároló csere"); PROGMEM Language_Str MSG_RELEASE_MEDIA = _UxGT("Tároló Kiadása"); PROGMEM Language_Str MSG_ZPROBE_OUT = _UxGT("Z szonda tálcán kivül"); - PROGMEM Language_Str MSG_SKEW_FACTOR = _UxGT("Ferdeség Faktor"); + PROGMEM Language_Str MSG_SKEW_FACTOR = _UxGT("Ferdeség faktor"); PROGMEM Language_Str MSG_BLTOUCH = _UxGT("BLTouch"); PROGMEM Language_Str MSG_BLTOUCH_SELFTEST = _UxGT("Önteszt"); PROGMEM Language_Str MSG_BLTOUCH_RESET = _UxGT("Visszaállítás"); @@ -428,16 +442,16 @@ namespace Language_hu { PROGMEM Language_Str MSG_BLTOUCH_MODE_CHANGE = _UxGT("VESZÉLY: A rossz beállítások kárt okozhatnak! Biztos továbblép?"); PROGMEM Language_Str MSG_TOUCHMI_PROBE = _UxGT("TouchMI"); PROGMEM Language_Str MSG_TOUCHMI_INIT = _UxGT("Kezd TouchMI"); - PROGMEM Language_Str MSG_TOUCHMI_ZTEST = _UxGT("Z Offset Teszt"); + PROGMEM Language_Str MSG_TOUCHMI_ZTEST = _UxGT("Z Eltolás teszt"); PROGMEM Language_Str MSG_TOUCHMI_SAVE = _UxGT("Mentés"); - PROGMEM Language_Str MSG_MANUAL_DEPLOY_TOUCHMI = _UxGT("TouchMI Használ"); - PROGMEM Language_Str MSG_MANUAL_DEPLOY = _UxGT("Z-Probe Használ"); - PROGMEM Language_Str MSG_MANUAL_STOW = _UxGT("Z-Probe Elhelyezés"); - PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("Elsö %s%s%s Kell"); - PROGMEM Language_Str MSG_ZPROBE_OFFSETS = _UxGT("Szonda Eltolások"); - PROGMEM Language_Str MSG_ZPROBE_XOFFSET = _UxGT("Szonda X Eltolás"); - PROGMEM Language_Str MSG_ZPROBE_YOFFSET = _UxGT("Szonda Y Eltolás"); - PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Szonda Z Eltolás"); + PROGMEM Language_Str MSG_MANUAL_DEPLOY_TOUCHMI = _UxGT("TouchMI használ"); + PROGMEM Language_Str MSG_MANUAL_DEPLOY = _UxGT("Z-Probe használ"); + PROGMEM Language_Str MSG_MANUAL_STOW = _UxGT("Z-Probe elhelyezés"); + PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("Elsö %s%s%s kell"); + PROGMEM Language_Str MSG_ZPROBE_OFFSETS = _UxGT("Szonda eltolások"); + PROGMEM Language_Str MSG_ZPROBE_XOFFSET = _UxGT("X Szonda eltolás"); + PROGMEM Language_Str MSG_ZPROBE_YOFFSET = _UxGT("Y Szonda eltolás"); + PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Z Szonda eltolás"); PROGMEM Language_Str MSG_MOVE_NOZZLE_TO_BED = _UxGT("Fúvóka az ágyhoz"); PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Mikrolépés X"); PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Mikrolépés Y"); @@ -464,31 +478,31 @@ namespace Language_hu { PROGMEM Language_Str MSG_PROBE_COOLING = _UxGT("Szonda hütése..."); PROGMEM Language_Str MSG_CHAMBER_HEATING = _UxGT("Kamra fütés..."); PROGMEM Language_Str MSG_CHAMBER_COOLING = _UxGT("Kamra hütés..."); - PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Delta Kalibráció"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Delta kalibráció"); PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("X Kalibrálás"); PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Y Kalibrálás"); PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Z Kalibrálás"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Központ Kalibrálás"); - PROGMEM Language_Str MSG_DELTA_SETTINGS = _UxGT("Delta Beállítások"); - PROGMEM Language_Str MSG_DELTA_AUTO_CALIBRATE = _UxGT("Auto Kalibráció"); - PROGMEM Language_Str MSG_DELTA_HEIGHT_CALIBRATE = _UxGT("Delta Magasság Kalib."); - PROGMEM Language_Str MSG_DELTA_Z_OFFSET_CALIBRATE = _UxGT("Z Szonda Eltolás"); - PROGMEM Language_Str MSG_DELTA_DIAG_ROD = _UxGT("Diag Rúd"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Központ kalibrálás"); + PROGMEM Language_Str MSG_DELTA_SETTINGS = _UxGT("Delta beállítások"); + PROGMEM Language_Str MSG_DELTA_AUTO_CALIBRATE = _UxGT("Auto kalibráció"); + PROGMEM Language_Str MSG_DELTA_HEIGHT_CALIBRATE = _UxGT("Delta magasság kalib."); + PROGMEM Language_Str MSG_DELTA_Z_OFFSET_CALIBRATE = _UxGT("Z Eltolás"); + PROGMEM Language_Str MSG_DELTA_DIAG_ROD = _UxGT("Diag rúd"); PROGMEM Language_Str MSG_DELTA_HEIGHT = _UxGT("Magasság"); PROGMEM Language_Str MSG_DELTA_RADIUS = _UxGT("Sugár"); PROGMEM Language_Str MSG_INFO_MENU = _UxGT("A Nyomtatóról"); - PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("Nyomtató Infó"); - PROGMEM Language_Str MSG_3POINT_LEVELING = _UxGT("3-Pontos Szintezés"); - PROGMEM Language_Str MSG_LINEAR_LEVELING = _UxGT("Lineáris Szintezés"); - PROGMEM Language_Str MSG_BILINEAR_LEVELING = _UxGT("Bilineáris Szintezés"); - PROGMEM Language_Str MSG_UBL_LEVELING = _UxGT("Egységes Ágy Szintezés"); - PROGMEM Language_Str MSG_MESH_LEVELING = _UxGT("Háló Szintezés"); + PROGMEM Language_Str MSG_INFO_PRINTER_MENU = _UxGT("Nyomtató infó"); + PROGMEM Language_Str MSG_3POINT_LEVELING = _UxGT("3-Pontos szintezés"); + PROGMEM Language_Str MSG_LINEAR_LEVELING = _UxGT("Lineáris szintezés"); + PROGMEM Language_Str MSG_BILINEAR_LEVELING = _UxGT("Bilineáris szintezés"); + PROGMEM Language_Str MSG_UBL_LEVELING = _UxGT("Egységes ágy szintezés"); + PROGMEM Language_Str MSG_MESH_LEVELING = _UxGT("Háló szintezés"); PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("Statisztikák"); - PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("Alaplap Infó"); + PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("Alaplap infó"); PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("Termisztorok"); PROGMEM Language_Str MSG_INFO_EXTRUDERS = _UxGT("Adagolók"); PROGMEM Language_Str MSG_INFO_BAUDRATE = _UxGT("Átviteli sebesség"); - PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("Protokoll"); + PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("Protokol"); PROGMEM Language_Str MSG_INFO_RUNAWAY_OFF = _UxGT("Futáselemzés: KI"); PROGMEM Language_Str MSG_INFO_RUNAWAY_ON = _UxGT("Futáselemzés: BE"); PROGMEM Language_Str MSG_HOTEND_IDLE_TIMEOUT = _UxGT("Hotend üresjárati idök."); @@ -498,7 +512,7 @@ namespace Language_hu { PROGMEM Language_Str MSG_KILL_EXPECTED_PRINTER = _UxGT("HELYTELEN NYOMTATÓ"); #if LCD_WIDTH >= 20 - PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Nyomtatás Számláló"); + PROGMEM Language_Str MSG_INFO_PRINT_COUNT = _UxGT("Nyomtatás számláló"); PROGMEM Language_Str MSG_INFO_COMPLETED_PRINTS = _UxGT("Befejezett"); PROGMEM Language_Str MSG_INFO_PRINT_TIME = _UxGT("Összes nyomtatási idö"); PROGMEM Language_Str MSG_INFO_PRINT_LONGEST = _UxGT("Leghosszabb munkaidö"); @@ -511,16 +525,16 @@ namespace Language_hu { PROGMEM Language_Str MSG_INFO_PRINT_FILAMENT = _UxGT("Kiadott"); #endif - PROGMEM Language_Str MSG_INFO_MIN_TEMP = _UxGT("Min Höfok"); - PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("Max Höfok"); + PROGMEM Language_Str MSG_INFO_MIN_TEMP = _UxGT("Min höfok"); + PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("Max höfok"); PROGMEM Language_Str MSG_INFO_PSU = _UxGT("PSU"); - PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("Meghajtási Erö"); + PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("Meghajtási erö"); PROGMEM Language_Str MSG_DAC_PERCENT_X = _UxGT("X Meghajtó %"); PROGMEM Language_Str MSG_DAC_PERCENT_Y = _UxGT("Y Meghajtó %"); PROGMEM Language_Str MSG_DAC_PERCENT_Z = _UxGT("Z Meghajtó %"); PROGMEM Language_Str MSG_DAC_PERCENT_E = _UxGT("E Meghajtó %"); PROGMEM Language_Str MSG_ERROR_TMC = _UxGT("TMC CSATLAKOZÁSI HIBA"); - PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("DAC EEPROM Írása"); + PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("DAC EEPROM írása"); PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER = _UxGT("NYOMTATÓSZÁL CSERE"); PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_PAUSE = _UxGT("NYOMTATÁS SZÜNETEL"); PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER_LOAD = _UxGT("SZÁL BETÖLTÉS"); @@ -529,22 +543,22 @@ namespace Language_hu { PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("Tisztítsd meg"); PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Folytatás"); PROGMEM Language_Str MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Fúvóka: "); - PROGMEM Language_Str MSG_RUNOUT_SENSOR = _UxGT("Túlfutás Szenzor"); - PROGMEM Language_Str MSG_RUNOUT_DISTANCE_MM = _UxGT("Túlfutás Táv. mm"); + PROGMEM Language_Str MSG_RUNOUT_SENSOR = _UxGT("Túlfutás szenzor"); + PROGMEM Language_Str MSG_RUNOUT_DISTANCE_MM = _UxGT("Túlfutás táv. mm"); PROGMEM Language_Str MSG_KILL_HOMING_FAILED = _UxGT("Tájolási hiba"); PROGMEM Language_Str MSG_LCD_PROBING_FAILED = _UxGT("Szondázás hiba"); PROGMEM Language_Str MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("SZÁLVÁLASZTÁS"); PROGMEM Language_Str MSG_MMU2_MENU = _UxGT("MMU"); - PROGMEM Language_Str MSG_KILL_MMU2_FIRMWARE = _UxGT("MMU Szoftver Feltöltése!"); + PROGMEM Language_Str MSG_KILL_MMU2_FIRMWARE = _UxGT("MMU Szoftver feltöltése!"); PROGMEM Language_Str MSG_MMU2_NOT_RESPONDING = _UxGT("MMU Figyelmeztetés."); - PROGMEM Language_Str MSG_MMU2_RESUME = _UxGT("Nyomtatás Folytatása"); + PROGMEM Language_Str MSG_MMU2_RESUME = _UxGT("Nyomtatás folytatása"); PROGMEM Language_Str MSG_MMU2_RESUMING = _UxGT("Folytatás..."); - PROGMEM Language_Str MSG_MMU2_LOAD_FILAMENT = _UxGT("Szál Betöltése"); - PROGMEM Language_Str MSG_MMU2_LOAD_ALL = _UxGT("Összes Betöltése"); - PROGMEM Language_Str MSG_MMU2_LOAD_TO_NOZZLE = _UxGT("Fúvóka Betöltése"); - PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT = _UxGT("Szál Kiadása"); - PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT_N = _UxGT("Szál Kiadása ~"); + PROGMEM Language_Str MSG_MMU2_LOAD_FILAMENT = _UxGT("Szál betöltése"); + PROGMEM Language_Str MSG_MMU2_LOAD_ALL = _UxGT("Összes betöltése"); + PROGMEM Language_Str MSG_MMU2_LOAD_TO_NOZZLE = _UxGT("Fúvóka betöltése"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT = _UxGT("Szál kiadása"); + PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT_N = _UxGT("Szál kiadása ~"); PROGMEM Language_Str MSG_MMU2_UNLOAD_FILAMENT = _UxGT("Kiadja a szálat"); PROGMEM Language_Str MSG_MMU2_LOADING_FILAMENT = _UxGT("Szál betölt. %i..."); PROGMEM Language_Str MSG_MMU2_EJECTING_FILAMENT = _UxGT("Szál kiadás...."); @@ -559,11 +573,11 @@ namespace Language_hu { PROGMEM Language_Str MSG_MIX_COMPONENT_N = _UxGT("Összetevö ="); PROGMEM Language_Str MSG_MIXER = _UxGT("Keverö"); PROGMEM Language_Str MSG_GRADIENT = _UxGT("Színátm."); - PROGMEM Language_Str MSG_FULL_GRADIENT = _UxGT("Teljes Színátm."); - PROGMEM Language_Str MSG_TOGGLE_MIX = _UxGT("Váltás Keverésre"); - PROGMEM Language_Str MSG_CYCLE_MIX = _UxGT("Ciklikus Keverés"); - PROGMEM Language_Str MSG_GRADIENT_MIX = _UxGT("Színátm. Keverés"); - PROGMEM Language_Str MSG_REVERSE_GRADIENT = _UxGT("Fordított Színátm."); + PROGMEM Language_Str MSG_FULL_GRADIENT = _UxGT("Teljes színátm."); + PROGMEM Language_Str MSG_TOGGLE_MIX = _UxGT("Váltás keverésre"); + PROGMEM Language_Str MSG_CYCLE_MIX = _UxGT("Ciklikus keverés"); + PROGMEM Language_Str MSG_GRADIENT_MIX = _UxGT("Színátm. keverés"); + PROGMEM Language_Str MSG_REVERSE_GRADIENT = _UxGT("Fordított színátm."); PROGMEM Language_Str MSG_ACTIVE_VTOOL = _UxGT("Aktív V-szerszám"); PROGMEM Language_Str MSG_START_VTOOL = _UxGT("Kezdés V-szerszám"); PROGMEM Language_Str MSG_END_VTOOL = _UxGT(" Vége V-szerszám"); @@ -591,7 +605,7 @@ namespace Language_hu { PROGMEM Language_Str MSG_REMOVE_PASSWORD = _UxGT("Jelszó törlése"); PROGMEM Language_Str MSG_PASSWORD_SET = _UxGT("A jelszó "); PROGMEM Language_Str MSG_START_OVER = _UxGT("Újrakezdés"); - PROGMEM Language_Str MSG_REMINDER_SAVE_SETTINGS = _UxGT("Mentse el!"); + PROGMEM Language_Str MSG_REMINDER_SAVE_SETTINGS = _UxGT("Mentsd el!"); PROGMEM Language_Str MSG_PASSWORD_REMOVED = _UxGT("Jelszó törölve"); // @@ -613,7 +627,7 @@ namespace Language_hu { #else PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_1_LINE("Katt a folytatáshoz")); PROGMEM Language_Str MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Parkolás...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Kérlek Várj...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Kérlek várj...")); PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Behelyez majd katt")); PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_1_LINE("Katt a fűtéshez")); PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Fűtés...")); @@ -625,10 +639,10 @@ namespace Language_hu { #endif PROGMEM Language_Str MSG_TMC_DRIVERS = _UxGT("TMC Meghajtók"); PROGMEM Language_Str MSG_TMC_CURRENT = _UxGT("Meghajtó áram"); - PROGMEM Language_Str MSG_TMC_HYBRID_THRS = _UxGT("Hibrid Küszöbérték"); - PROGMEM Language_Str MSG_TMC_HOMING_THRS = _UxGT("Motoros Kezdöpont"); - PROGMEM Language_Str MSG_TMC_STEPPING_MODE = _UxGT("Léptetö Mód"); - PROGMEM Language_Str MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop Mód"); + PROGMEM Language_Str MSG_TMC_HYBRID_THRS = _UxGT("Hibrid küszöbérték"); + PROGMEM Language_Str MSG_TMC_HOMING_THRS = _UxGT("Motoros kezdöpont"); + PROGMEM Language_Str MSG_TMC_STEPPING_MODE = _UxGT("Léptetö mód"); + PROGMEM Language_Str MSG_TMC_STEALTH_ENABLED = _UxGT("StealthChop mód"); PROGMEM Language_Str MSG_SERVICE_RESET = _UxGT("Újraindítás"); PROGMEM Language_Str MSG_SERVICE_IN = _UxGT(" be:"); PROGMEM Language_Str MSG_BACKLASH = _UxGT("Holtjáték"); @@ -649,6 +663,17 @@ namespace Language_hu { PROGMEM Language_Str MSG_REHEATING = _UxGT("Újrafűtés..."); PROGMEM Language_Str MSG_PROBE_WIZARD = _UxGT("Z Szonda varázsló"); + PROGMEM Language_Str MSG_PROBE_WIZARD_PROBING = _UxGT("Z Referencia mérés"); + PROGMEM Language_Str MSG_PROBE_WIZARD_MOVING = _UxGT("Menjen a próba pontra"); + + PROGMEM Language_Str MSG_SOUND = _UxGT("Hang"); + + PROGMEM Language_Str MSG_TOP_LEFT = _UxGT("Bal felsö"); + PROGMEM Language_Str MSG_BOTTOM_LEFT = _UxGT("Bal alsó"); + PROGMEM Language_Str MSG_TOP_RIGHT = _UxGT("Jobb felsö"); + PROGMEM Language_Str MSG_BOTTOM_RIGHT = _UxGT("Jobb alsó"); + PROGMEM Language_Str MSG_CALIBRATION_COMPLETED = _UxGT("Kalibrálás befejezve"); + PROGMEM Language_Str MSG_CALIBRATION_FAILED = _UxGT("Kalibrálási hiba"); } #if FAN_COUNT == 1 From 2c5967925f5a09db2522d1611efd225dbd3990dd Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Sat, 6 Mar 2021 01:50:26 -0800 Subject: [PATCH 100/253] Pins/tests followup (#21268) Missing commit from #21254 Co-authored-by: Scott Lahteine --- Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h | 4 ++++ Marlin/src/pins/ramps/pins_LONGER3D_LKx_PRO.h | 3 +++ Marlin/src/pins/ramps/pins_RAMPS.h | 3 +++ Marlin/src/pins/ramps/pins_RAMPS_S_12.h | 3 +++ .../scripts/common-dependencies-post.py | 16 ++++++++++++++++ platformio.ini | 7 +------ 6 files changed, 30 insertions(+), 6 deletions(-) create mode 100644 buildroot/share/PlatformIO/scripts/common-dependencies-post.py diff --git a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h index c555ef7863..94165d3948 100644 --- a/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h +++ b/Marlin/src/pins/lpc1768/pins_BTT_SKR_V1_4.h @@ -27,6 +27,10 @@ #define BOARD_INFO_NAME "BTT SKR V1.4" #endif +#ifndef BOARD_CUSTOM_BUILD_FLAGS + #define BOARD_CUSTOM_BUILD_FLAGS -DLPC_PINCFG_UART3_P4_28 +#endif + // // SD Connection // diff --git a/Marlin/src/pins/ramps/pins_LONGER3D_LKx_PRO.h b/Marlin/src/pins/ramps/pins_LONGER3D_LKx_PRO.h index 2fd599e619..5ff3b366be 100644 --- a/Marlin/src/pins/ramps/pins_LONGER3D_LKx_PRO.h +++ b/Marlin/src/pins/ramps/pins_LONGER3D_LKx_PRO.h @@ -43,6 +43,9 @@ #warning "Serial 3 is originally reserved to Y limit switches. Hardware changes are required to use it." #endif +// Custom flags and defines for the build +//#define BOARD_CUSTOM_BUILD_FLAGS -D__FOO__ + #define BOARD_INFO_NAME "LGT KIT V1.0" // diff --git a/Marlin/src/pins/ramps/pins_RAMPS.h b/Marlin/src/pins/ramps/pins_RAMPS.h index f56a9ec38e..805c92d71a 100644 --- a/Marlin/src/pins/ramps/pins_RAMPS.h +++ b/Marlin/src/pins/ramps/pins_RAMPS.h @@ -47,6 +47,9 @@ #include "env_validate.h" +// Custom flags and defines for the build +//#define BOARD_CUSTOM_BUILD_FLAGS -D__FOO__ + #ifndef BOARD_INFO_NAME #define BOARD_INFO_NAME "RAMPS 1.4" #endif diff --git a/Marlin/src/pins/ramps/pins_RAMPS_S_12.h b/Marlin/src/pins/ramps/pins_RAMPS_S_12.h index 62b6e3ff94..e1ba91cde8 100644 --- a/Marlin/src/pins/ramps/pins_RAMPS_S_12.h +++ b/Marlin/src/pins/ramps/pins_RAMPS_S_12.h @@ -36,6 +36,9 @@ #include "env_validate.h" +// Custom flags and defines for the build +//#define BOARD_CUSTOM_BUILD_FLAGS -D__FOO__ + #ifndef BOARD_INFO_NAME #define BOARD_INFO_NAME "RAMPS S 1.2" #endif diff --git a/buildroot/share/PlatformIO/scripts/common-dependencies-post.py b/buildroot/share/PlatformIO/scripts/common-dependencies-post.py new file mode 100644 index 0000000000..2b1b948119 --- /dev/null +++ b/buildroot/share/PlatformIO/scripts/common-dependencies-post.py @@ -0,0 +1,16 @@ +# +# common-dependencies-post.py +# Convenience script to add build flags for Marlin Enabled Features +# + +Import("env") +Import("projenv") + +def apply_board_build_flags(): + if not 'BOARD_CUSTOM_BUILD_FLAGS' in env['MARLIN_FEATURES']: + return + projenv.Append(CCFLAGS=env['MARLIN_FEATURES']['BOARD_CUSTOM_BUILD_FLAGS'].split()) + +# We need to add the board build flags in a post script +# so the platform build script doesn't overwrite the custom CCFLAGS +apply_board_build_flags() diff --git a/platformio.ini b/platformio.ini index 0ed883ba0d..aad59362cc 100644 --- a/platformio.ini +++ b/platformio.ini @@ -215,6 +215,7 @@ extra_scripts = pre:buildroot/share/PlatformIO/scripts/common-dependencies.py pre:buildroot/share/PlatformIO/scripts/common-cxxflags.py pre:buildroot/share/PlatformIO/scripts/preflight-checks.py + post:buildroot/share/PlatformIO/scripts/common-dependencies-post.py build_flags = -fmax-errors=5 -g3 -D__MARLIN_FIRMWARE__ -fmerge-constants lib_deps = @@ -727,12 +728,6 @@ platform = ${common_LPC.platform} extends = common_LPC board = nxp_lpc1769 -# BTT SKR 1.4 needs a UART3 tweak -[env:LPC1768_btt_skr_v1_4] -platform = ${env:LPC1768.platform} -extends = env:LPC1768 -build_flags = ${env:LPC1768.build_flags} -DLPC_PINCFG_UART3_P4_28 - ################################# # # # STM32 Architecture # From 43b712d42b14014eeb820e6f38285a64e7b872db Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 6 Mar 2021 06:57:51 -0600 Subject: [PATCH 101/253] Pins/tests followup --- Marlin/src/pins/pins.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 55240021fa..b8cf695fb5 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -378,7 +378,7 @@ #elif MB(BTT_SKR_V1_3) #include "lpc1768/pins_BTT_SKR_V1_3.h" // LPC1768 env:LPC1768 #elif MB(BTT_SKR_V1_4) - #include "lpc1768/pins_BTT_SKR_V1_4.h" // LPC1768 env:LPC1768_btt_skr_v1_4 + #include "lpc1768/pins_BTT_SKR_V1_4.h" // LPC1768 env:LPC1768 // // LPC1769 ARM Cortex M3 From a94fa7b4768d3e7a5ab6c580de96160f697753db Mon Sep 17 00:00:00 2001 From: ellensp Date: Sun, 7 Mar 2021 02:19:15 +1300 Subject: [PATCH 102/253] Fix Creality DWIN - Broken (bool)Serial ? (#21272) Co-authored-by: ellensp --- Marlin/src/lcd/dwin/dwin_lcd.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/lcd/dwin/dwin_lcd.cpp b/Marlin/src/lcd/dwin/dwin_lcd.cpp index 1978c6a4f8..59bc46925a 100644 --- a/Marlin/src/lcd/dwin/dwin_lcd.cpp +++ b/Marlin/src/lcd/dwin/dwin_lcd.cpp @@ -95,7 +95,7 @@ bool DWIN_Handshake(void) { #endif LCD_SERIAL.begin(LCD_BAUDRATE); const millis_t serial_connect_timeout = millis() + 1000UL; - while (!LCD_SERIAL && PENDING(millis(), serial_connect_timeout)) { /*nada*/ } + while (!LCD_SERIAL.connected() && PENDING(millis(), serial_connect_timeout)) { /*nada*/ } size_t i = 0; DWIN_Byte(i, 0x00); From 72cc5a49e6fdcf7246b6bded66a4b4fc043054a3 Mon Sep 17 00:00:00 2001 From: Sola <42537573+solawc@users.noreply.github.com> Date: Sat, 6 Mar 2021 23:04:05 +0800 Subject: [PATCH 103/253] MKS H43 fixup (#21267) Co-authored-by: makerbase <4164049@qq.com> Co-authored-by: MKS-Sean <56996910+MKS-Sean@users.noreply.github.com> Co-authored-by: Scott Lahteine --- Marlin/src/gcode/queue.cpp | 8 +++ Marlin/src/gcode/queue.h | 9 ++- .../lcd/extui/lib/dgus/DGUSScreenHandler.cpp | 9 ++- .../lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp | 2 +- .../lcd/extui/lib/dgus/mks/DGUSDisplayDef.h | 6 +- .../extui/lib/dgus/mks/DGUSScreenHandler.cpp | 48 +++++++------- .../src/lcd/extui/lib/mks_ui/draw_dialog.cpp | 22 +++---- .../lcd/extui/lib/mks_ui/draw_extrusion.cpp | 18 ++--- .../extui/lib/mks_ui/draw_filament_change.cpp | 34 +++++----- .../lcd/extui/lib/mks_ui/draw_operation.cpp | 4 +- .../src/lcd/extui/lib/mks_ui/draw_preHeat.cpp | 65 +++++++++---------- .../lcd/extui/lib/mks_ui/draw_printing.cpp | 4 +- .../lcd/extui/lib/mks_ui/draw_ready_print.cpp | 8 +-- Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp | 2 +- Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp | 2 +- Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h | 6 +- .../src/lcd/extui/lib/mks_ui/wifi_module.cpp | 14 ++-- 17 files changed, 139 insertions(+), 122 deletions(-) diff --git a/Marlin/src/gcode/queue.cpp b/Marlin/src/gcode/queue.cpp index 93deac0566..136293fd34 100644 --- a/Marlin/src/gcode/queue.cpp +++ b/Marlin/src/gcode/queue.cpp @@ -610,6 +610,14 @@ void GCodeQueue::get_available_commands() { TERN_(SDSUPPORT, get_sdcard_commands()); } +/** + * Run the entire queue in-place. Blocks SD completion/abort until complete. + */ +void GCodeQueue::exhaust() { + while (ring_buffer.occupied()) advance(); + planner.synchronize(); +} + /** * Get the next command in the queue, optionally log it to SD, then dispatch it */ diff --git a/Marlin/src/gcode/queue.h b/Marlin/src/gcode/queue.h index 7bc3bfdbe5..4757b8c37e 100644 --- a/Marlin/src/gcode/queue.h +++ b/Marlin/src/gcode/queue.h @@ -93,7 +93,9 @@ public: inline bool full(uint8_t cmdCount=1) const { return length > (BUFSIZE - cmdCount); } - inline bool empty() const { return length == 0; } + inline bool occupied() const { return length != 0; } + + inline bool empty() const { return !occupied(); } inline CommandLine& peek_next_command() { return commands[index_r]; } @@ -162,6 +164,11 @@ public: */ static void advance(); + /** + * Run the entire queue in-place + */ + static void exhaust(); + /** * Add to the circular command queue the next command from: * - The command-injection queue (injected_commands_P) diff --git a/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp index 9b0c329de2..180c895809 100644 --- a/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp @@ -395,20 +395,23 @@ void DGUSScreenHandler::HandleTemperatureChanged(DGUS_VP_Variable &var, void *va default: return; #if HOTENDS >= 1 case VP_T_E0_Set: + NOMORE(newvalue, HEATER_0_MAXTEMP); thermalManager.setTargetHotend(newvalue, 0); - acceptedvalue = thermalManager.temp_hotend[0].target; + acceptedvalue = thermalManager.degTargetHotend(0); break; #endif #if HOTENDS >= 2 case VP_T_E1_Set: + NOMORE(newvalue, HEATER_1_MAXTEMP); thermalManager.setTargetHotend(newvalue, 1); - acceptedvalue = thermalManager.temp_hotend[1].target; + acceptedvalue = thermalManager.degTargetHotend(1); break; #endif #if HAS_HEATED_BED case VP_T_Bed_Set: + NOMORE(newvalue, BED_MAXTEMP); thermalManager.setTargetBed(newvalue); - acceptedvalue = thermalManager.temp_bed.target; + acceptedvalue = thermalManager.degTargetBed(); break; #endif } diff --git a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp index 14b7394aaa..bfa518446d 100644 --- a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp @@ -75,7 +75,7 @@ uint16_t z_park_pos = 10; xyz_pos_t position_before_pause; void MKS_pause_print_move() { - planner.synchronize(); + queue.exhaust(); position_before_pause = current_position; do_blocking_move_to(X_MIN_POS + x_park_pos, Y_MIN_POS + y_park_pos, current_position.z + z_park_pos); } diff --git a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.h b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.h index 47695edf0f..c8915a3d25 100644 --- a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.h +++ b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.h @@ -23,10 +23,10 @@ #include "../DGUSDisplayDef.h" -//#define USE_MKS_GREEN_UI +#define USE_MKS_GREEN_UI //#define DGUS_MKS_RUNOUT_SENSOR -#define LOGO_TIME_DELAY TERN(USE_MKS_GREEN_UI, 5000, 1500) +#define LOGO_TIME_DELAY TERN(USE_MKS_GREEN_UI, 8000, 1500) #if ENABLED(DGUS_MKS_RUNOUT_SENSOR) #define MT_DET_1_PIN 1 @@ -178,7 +178,7 @@ enum DGUSLCD_Screens : uint8_t { MKSLCD_SCREEN_PRINT_CONFIG = 72, MKSLCD_SCREEN_LEVEL_DATA = 106, MKSLCD_PrintPause_SET = 107, - //MKSLCD_FILAMENT_DATA = 50, + MKSLCD_FILAMENT_DATA = 50, MKSLCD_ABOUT = 83, MKSLCD_PID = 108, MKSLCD_PAUSE_SETTING_MOVE = 98, diff --git a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp index 9fc56acf10..577171a135 100644 --- a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp @@ -39,6 +39,7 @@ #include "../../../../../gcode/gcode.h" #include "../../../../../pins/pins.h" #include "../../../../../libs/nozzle.h" + #if ENABLED(HAS_STEALTHCHOP) #include "../../../../../module/stepper/trinamic.h" #include "../../../../../module/stepper/indirection.h" @@ -60,7 +61,6 @@ uint8_t DGUSLanguageSwitch = 0; // Switch language for MKS DGUS uint32_t swap32(const uint32_t value) { return (value & 0x000000FFU) << 24U | (value & 0x0000FF00U) << 8U | (value & 0x00FF0000U) >> 8U | (value & 0xFF000000U) >> 24U; } #if 0 - void DGUSScreenHandler::sendinfoscreen_ch_mks(const uint16_t* line1, const uint16_t* line2, const uint16_t* line3, const uint16_t* line4) { dgusdisplay.WriteVariable(VP_MSGSTR1, line1, 32, true); dgusdisplay.WriteVariable(VP_MSGSTR2, line2, 32, true); @@ -264,7 +264,7 @@ void DGUSScreenHandler::DGUSLCD_SendTMCStepValue(DGUS_VP_Variable &var) { void DGUSScreenHandler::SDPrintingFinished() { if (DGUSAutoTurnOff) { - while (!queue.ring_buffer.empty()) queue.advance(); + queue.exhaust(); gcode.process_subcommands_now_P(PSTR("M81")); } GotoScreen(MKSLCD_SCREEN_PrintDone); @@ -465,7 +465,6 @@ void DGUSScreenHandler::Level_Ctrl_MKS(DGUS_VP_Variable &var, void *val_ptr) { cs = getCurrentScreen(); if (cs != MKSLCD_AUTO_LEVEL) GotoScreen(MKSLCD_AUTO_LEVEL); - #else GotoScreen(MKSLCD_SCREEN_LEVEL); @@ -499,14 +498,15 @@ void DGUSScreenHandler::MeshLevel(DGUS_VP_Variable &var, void *val_ptr) { char cmd_buf[30]; float offset = mesh_adj_distance; int16_t integer, Deci, Deci2; - // float f3 = current_position.z; - // float f4 = current_position.z; + + if (!queue.ring_buffer.empty()) return; + switch (mesh_value) { case 0: offset = mesh_adj_distance; integer = offset; // get int - Deci = (offset * 100); - Deci = Deci % 100; + Deci = (offset * 10); + Deci = Deci % 10; Deci2 = offset * 100; Deci2 = Deci2 % 10; soft_endstop._enabled = false; @@ -520,8 +520,8 @@ void DGUSScreenHandler::MeshLevel(DGUS_VP_Variable &var, void *val_ptr) { case 1: offset = mesh_adj_distance; integer = offset; // get int - Deci = (offset * 100); - Deci = Deci % 100; + Deci = (offset * 10); + Deci = Deci % 10; Deci2 = offset * 100; Deci2 = Deci2 % 10; soft_endstop._enabled = false; @@ -589,8 +589,8 @@ void DGUSScreenHandler::LCD_BLK_Adjust(DGUS_VP_Variable &var, void *val_ptr) { uint16_t lcd_value = swap16(*(uint16_t *)val_ptr); - if(lcd_value > 100) lcd_value = 100; - else if(lcd_value < 10) lcd_value = 10; + if (lcd_value > 100) lcd_value = 100; + else if (lcd_value < 10) lcd_value = 10; lcd_default_light = lcd_value; @@ -794,7 +794,7 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { DEBUG_ECHOLNPAIR("QUEUE LEN:", queue.length); - if (!print_job_timer.isPaused() && queue.ring_buffer.full(1)) + if (!print_job_timer.isPaused() && !queue.ring_buffer.empty()) return; char axiscode; @@ -1249,8 +1249,8 @@ void DGUSScreenHandler::MKS_FilamentLoad(DGUS_VP_Variable &var, void *val_ptr) { switch (val_t) { case 0: #if HOTENDS >= 1 - if (thermalManager.temp_hotend[0].celsius < thermalManager.extrude_min_temp) { - if (thermalManager.temp_hotend[0].target < thermalManager.extrude_min_temp) + if (thermalManager.degHotend(0) < thermalManager.extrude_min_temp) { + if (thermalManager.degTargetHotend(0) < thermalManager.extrude_min_temp) thermalManager.setTargetHotend(thermalManager.extrude_min_temp, 0); sendinfoscreen(PSTR("NOTICE"), nullptr, PSTR("Please wait."), PSTR("Nozzle heating!"), true, true, true, true); SetupConfirmAction(nullptr); @@ -1268,8 +1268,8 @@ void DGUSScreenHandler::MKS_FilamentLoad(DGUS_VP_Variable &var, void *val_ptr) { case 1: #if HOTENDS >= 2 - if (thermalManager.temp_hotend[1].celsius < thermalManager.extrude_min_temp) { - if (thermalManager.temp_hotend[1].target < thermalManager.extrude_min_temp) + if (thermalManager.degHotend(1) < thermalManager.extrude_min_temp) { + if (thermalManager.degTargetHotend(1) < thermalManager.extrude_min_temp) thermalManager.setTargetHotend(thermalManager.extrude_min_temp, 1); sendinfoscreen(PSTR("NOTICE"), nullptr, PSTR("Please wait."), PSTR("Nozzle heating!"), true, true, true, true); SetupConfirmAction(nullptr); @@ -1284,8 +1284,8 @@ void DGUSScreenHandler::MKS_FilamentLoad(DGUS_VP_Variable &var, void *val_ptr) { } #endif #if ENABLED(SINGLENOZZLE) - if (thermalManager.temp_hotend[0].celsius < thermalManager.extrude_min_temp) { - if (thermalManager.temp_hotend[0].target < thermalManager.extrude_min_temp) + if (thermalManager.degHotend(0) < thermalManager.extrude_min_temp) { + if (thermalManager.degTargetHotend(0) < thermalManager.extrude_min_temp) thermalManager.setTargetHotend(thermalManager.extrude_min_temp, 0); sendinfoscreen(PSTR("NOTICE"), nullptr, PSTR("Please wait."), PSTR("Nozzle heating!"), true, true, true, true); SetupConfirmAction(nullptr); @@ -1313,8 +1313,8 @@ void DGUSScreenHandler::MKS_FilamentUnLoad(DGUS_VP_Variable &var, void *val_ptr) switch (val_t) { case 0: #if HOTENDS >= 1 - if (thermalManager.temp_hotend[0].celsius < thermalManager.extrude_min_temp) { - if (thermalManager.temp_hotend[0].target < thermalManager.extrude_min_temp) + if (thermalManager.degHotend(0) < thermalManager.extrude_min_temp) { + if (thermalManager.degTargetHotend(0) < thermalManager.extrude_min_temp) thermalManager.setTargetHotend(thermalManager.extrude_min_temp, 0); sendinfoscreen(PSTR("NOTICE"), nullptr, PSTR("Please wait."), PSTR("Nozzle heating!"), true, true, true, true); SetupConfirmAction(nullptr); @@ -1331,8 +1331,8 @@ void DGUSScreenHandler::MKS_FilamentUnLoad(DGUS_VP_Variable &var, void *val_ptr) break; case 1: #if HOTENDS >= 2 - if (thermalManager.temp_hotend[1].celsius < thermalManager.extrude_min_temp) { - if (thermalManager.temp_hotend[1].target < thermalManager.extrude_min_temp) + if (thermalManager.degHotend(1) < thermalManager.extrude_min_temp) { + if (thermalManager.degTargetHotend(1) < thermalManager.extrude_min_temp) thermalManager.setTargetHotend(thermalManager.extrude_min_temp, 1); sendinfoscreen(PSTR("NOTICE"), nullptr, PSTR("Please wait."), PSTR("Nozzle heating!"), true, true, true, true); SetupConfirmAction(nullptr); @@ -1348,8 +1348,8 @@ void DGUSScreenHandler::MKS_FilamentUnLoad(DGUS_VP_Variable &var, void *val_ptr) #endif #if ENABLED(SINGLENOZZLE) - if (thermalManager.temp_hotend[0].celsius < thermalManager.extrude_min_temp) { - if (thermalManager.temp_hotend[0].target < thermalManager.extrude_min_temp) + if (thermalManager.degHotend(0) < thermalManager.extrude_min_temp) { + if (thermalManager.degTargetHotend(0) < thermalManager.extrude_min_temp) thermalManager.setTargetHotend(thermalManager.extrude_min_temp, 0); sendinfoscreen(PSTR("NOTICE"), nullptr, PSTR("Please wait."), PSTR("Nozzle heating!"), true, true, true, true); SetupConfirmAction(nullptr); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp index 6130e92224..5d02f79fd1 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp @@ -191,7 +191,7 @@ static void btn_cancel_event_cb(lv_obj_t *btn, lv_event_t event) { TERN_(ADVANCED_PAUSE_FEATURE, pause_menu_response = PAUSE_RESPONSE_RESUME_PRINT); } else if (DIALOG_IS(TYPE_FILAMENT_LOAD_HEAT, TYPE_FILAMENT_UNLOAD_HEAT, TYPE_FILAMENT_HEAT_LOAD_COMPLETED, TYPE_FILAMENT_HEAT_UNLOAD_COMPLETED)) { - thermalManager.temp_hotend[uiCfg.curSprayerChoose].target= uiCfg.desireSprayerTempBak; + thermalManager.setTargetHotend(uiCfg.hotendTargetTempBak, uiCfg.extruderIndex); clear_cur_ui(); draw_return_ui(); } @@ -204,7 +204,7 @@ static void btn_cancel_event_cb(lv_obj_t *btn, lv_event_t event) { uiCfg.filament_loading_time_cnt = 0; uiCfg.filament_unloading_time_flg = false; uiCfg.filament_unloading_time_cnt = 0; - thermalManager.temp_hotend[uiCfg.curSprayerChoose].target = uiCfg.desireSprayerTempBak; + thermalManager.setTargetHotend(uiCfg.hotendTargetTempBak, uiCfg.extruderIndex); clear_cur_ui(); draw_return_ui(); } @@ -479,9 +479,9 @@ void lv_draw_dialog(uint8_t type) { void filament_sprayer_temp() { char buf[20] = {0}; - sprintf(buf, preheat_menu.value_state, (int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius, (int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].target); + sprintf(buf, preheat_menu.value_state, (int)thermalManager.degHotend(uiCfg.extruderIndex), (int)thermalManager.degTargetHotend(uiCfg.extruderIndex)); - strcpy(public_buf_l, uiCfg.curSprayerChoose < 1 ? extrude_menu.ext1 : extrude_menu.ext2); + strcpy(public_buf_l, uiCfg.extruderIndex < 1 ? extrude_menu.ext1 : extrude_menu.ext2); strcat_P(public_buf_l, PSTR(": ")); strcat(public_buf_l, buf); lv_label_set_text(tempText1, public_buf_l); @@ -500,7 +500,7 @@ void filament_dialog_handle() { planner.synchronize(); uiCfg.filament_loading_time_flg = true; uiCfg.filament_loading_time_cnt = 0; - sprintf_P(public_buf_m, PSTR("T%d\nG91\nG1 E%d F%d\nG90"), uiCfg.curSprayerChoose, gCfgItems.filamentchange_load_length, gCfgItems.filamentchange_load_speed); + sprintf_P(public_buf_m, PSTR("T%d\nG91\nG1 E%d F%d\nG90"), uiCfg.extruderIndex, gCfgItems.filamentchange_load_length, gCfgItems.filamentchange_load_speed); queue.inject(public_buf_m); } if (uiCfg.filament_heat_completed_unload) { @@ -510,13 +510,13 @@ void filament_dialog_handle() { planner.synchronize(); uiCfg.filament_unloading_time_flg = true; uiCfg.filament_unloading_time_cnt = 0; - sprintf_P(public_buf_m, PSTR("T%d\nG91\nG1 E-%d F%d\nG90"), uiCfg.curSprayerChoose, gCfgItems.filamentchange_unload_length, gCfgItems.filamentchange_unload_speed); + sprintf_P(public_buf_m, PSTR("T%d\nG91\nG1 E-%d F%d\nG90"), uiCfg.extruderIndex, gCfgItems.filamentchange_unload_length, gCfgItems.filamentchange_unload_speed); queue.inject(public_buf_m); } - if (((abs((int)((int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius - gCfgItems.filament_limit_temper)) <= 1) - || ((int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius > gCfgItems.filament_limit_temper)) - && (uiCfg.filament_load_heat_flg) + if ( ((abs((int)((int)thermalManager.degHotend(uiCfg.extruderIndex) - gCfgItems.filament_limit_temper)) <= 1) + || ((int)thermalManager.degHotend(uiCfg.extruderIndex) > gCfgItems.filament_limit_temper)) + && uiCfg.filament_load_heat_flg ) { uiCfg.filament_load_heat_flg = false; lv_clear_dialog(); @@ -529,8 +529,8 @@ void filament_dialog_handle() { lv_clear_dialog(); lv_draw_dialog(DIALOG_TYPE_FILAMENT_LOAD_COMPLETED); } - if (((abs((int)((int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius - gCfgItems.filament_limit_temper)) <= 1) - || ((int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius > gCfgItems.filament_limit_temper)) + if (((abs((int)((int)thermalManager.degHotend(uiCfg.extruderIndex) - gCfgItems.filament_limit_temper)) <= 1) + || ((int)thermalManager.degHotend(uiCfg.extruderIndex) > gCfgItems.filament_limit_temper)) && uiCfg.filament_unload_heat_flg ) { uiCfg.filament_unload_heat_flg = false; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp index b9af6d33a8..43ed214199 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp @@ -54,7 +54,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { if (event != LV_EVENT_RELEASED) return; switch (obj->mks_obj_id) { case ID_E_ADD: - if (thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius >= EXTRUDE_MINTEMP) { + if (thermalManager.degHotend(uiCfg.extruderIndex) >= EXTRUDE_MINTEMP) { sprintf_P((char *)public_buf_l, PSTR("G91\nG1 E%d F%d\nG90"), uiCfg.extruStep, 60 * uiCfg.extruSpeed); queue.inject(public_buf_l); extrudeAmount += uiCfg.extruStep; @@ -62,7 +62,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } break; case ID_E_DEC: - if (thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius >= EXTRUDE_MINTEMP) { + if (thermalManager.degHotend(uiCfg.extruderIndex) >= EXTRUDE_MINTEMP) { sprintf_P((char *)public_buf_l, PSTR("G91\nG1 E%d F%d\nG90"), 0 - uiCfg.extruStep, 60 * uiCfg.extruSpeed); queue.enqueue_one_now(public_buf_l); extrudeAmount -= uiCfg.extruStep; @@ -71,17 +71,17 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { break; case ID_E_TYPE: if (ENABLED(HAS_MULTI_EXTRUDER)) { - if (uiCfg.curSprayerChoose == 0) { - uiCfg.curSprayerChoose = 1; + if (uiCfg.extruderIndex == 0) { + uiCfg.extruderIndex = 1; queue.inject_P(PSTR("T1")); } else { - uiCfg.curSprayerChoose = 0; + uiCfg.extruderIndex = 0; queue.inject_P(PSTR("T0")); } } else - uiCfg.curSprayerChoose = 0; + uiCfg.extruderIndex = 0; extrudeAmount = 0; disp_hotend_temp(); @@ -153,7 +153,7 @@ void lv_draw_extrusion() { } void disp_ext_type() { - if (uiCfg.curSprayerChoose == 1) { + if (uiCfg.extruderIndex == 1) { lv_imgbtn_set_src_both(buttonType, "F:/bmp_extru2.bin"); if (gCfgItems.multiple_language) { lv_label_set_text(labelType, extrude_menu.ext2); @@ -195,7 +195,7 @@ void disp_ext_speed() { void disp_hotend_temp() { char buf[20] = {0}; - sprintf(buf, extrude_menu.temp_value, (int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius, (int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].target); + sprintf(buf, extrude_menu.temp_value, (int)thermalManager.degHotend(uiCfg.extruderIndex), (int)thermalManager.degTargetHotend(uiCfg.extruderIndex)); strcpy(public_buf_l, extrude_menu.temper_text); strcat(public_buf_l, buf); lv_label_set_text(tempText, public_buf_l); @@ -213,7 +213,7 @@ void disp_extru_amount() { sprintf(buf1, extrude_menu.count_value_cm, extrudeAmount / 10); else sprintf(buf1, extrude_menu.count_value_m, extrudeAmount / 1000); - strcat(public_buf_l, uiCfg.curSprayerChoose < 1 ? extrude_menu.ext1 : extrude_menu.ext2); + strcat(public_buf_l, uiCfg.extruderIndex == 0 ? extrude_menu.ext1 : extrude_menu.ext2); strcat(public_buf_l, buf1); lv_label_set_text(ExtruText, public_buf_l); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.cpp index cff99119e8..e12a4b82cf 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.cpp @@ -50,25 +50,25 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { switch (obj->mks_obj_id) { case ID_FILAMNT_IN: uiCfg.filament_load_heat_flg = true; - if ((abs(thermalManager.temp_hotend[uiCfg.curSprayerChoose].target - thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius) <= 1) - || (gCfgItems.filament_limit_temper <= thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius)) { + if ((abs(thermalManager.degTargetHotend(uiCfg.extruderIndex) - thermalManager.degHotend(uiCfg.extruderIndex)) <= 1) + || (gCfgItems.filament_limit_temper <= thermalManager.degHotend(uiCfg.extruderIndex))) { lv_clear_filament_change(); lv_draw_dialog(DIALOG_TYPE_FILAMENT_HEAT_LOAD_COMPLETED); } else { lv_clear_filament_change(); lv_draw_dialog(DIALOG_TYPE_FILAMENT_LOAD_HEAT); - if (thermalManager.temp_hotend[uiCfg.curSprayerChoose].target < gCfgItems.filament_limit_temper) { - thermalManager.temp_hotend[uiCfg.curSprayerChoose].target = gCfgItems.filament_limit_temper; - thermalManager.start_watching_hotend(uiCfg.curSprayerChoose); + if (thermalManager.degTargetHotend(uiCfg.extruderIndex) < gCfgItems.filament_limit_temper) { + thermalManager.setTargetHotend(gCfgItems.filament_limit_temper, uiCfg.extruderIndex); + thermalManager.start_watching_hotend(uiCfg.extruderIndex); } } break; case ID_FILAMNT_OUT: uiCfg.filament_unload_heat_flg = true; - if ((thermalManager.temp_hotend[uiCfg.curSprayerChoose].target > 0) - && ((abs((int)((int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].target - thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius)) <= 1) - || ((int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius >= gCfgItems.filament_limit_temper)) + if (thermalManager.degTargetHotend(uiCfg.extruderIndex) + && ((abs((int)((int)thermalManager.degTargetHotend(uiCfg.extruderIndex) - thermalManager.degHotend(uiCfg.extruderIndex))) <= 1) + || ((int)thermalManager.degHotend(uiCfg.extruderIndex) >= gCfgItems.filament_limit_temper)) ) { lv_clear_filament_change(); lv_draw_dialog(DIALOG_TYPE_FILAMENT_HEAT_UNLOAD_COMPLETED); @@ -76,28 +76,28 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { else { lv_clear_filament_change(); lv_draw_dialog(DIALOG_TYPE_FILAMENT_UNLOAD_HEAT); - if (thermalManager.temp_hotend[uiCfg.curSprayerChoose].target < gCfgItems.filament_limit_temper) { - thermalManager.temp_hotend[uiCfg.curSprayerChoose].target = gCfgItems.filament_limit_temper; - thermalManager.start_watching_hotend(uiCfg.curSprayerChoose); + if (thermalManager.degTargetHotend(uiCfg.extruderIndex) < gCfgItems.filament_limit_temper) { + thermalManager.setTargetHotend(gCfgItems.filament_limit_temper, uiCfg.extruderIndex); + thermalManager.start_watching_hotend(uiCfg.extruderIndex); } filament_sprayer_temp(); } break; case ID_FILAMNT_TYPE: #if HAS_MULTI_EXTRUDER - uiCfg.curSprayerChoose = !uiCfg.curSprayerChoose; + uiCfg.extruderIndex = !uiCfg.extruderIndex; #endif disp_filament_type(); break; case ID_FILAMNT_RETURN: #if HAS_MULTI_EXTRUDER if (uiCfg.print_state != IDLE && uiCfg.print_state != REPRINTED) - gcode.process_subcommands_now_P(uiCfg.curSprayerChoose_bak == 1 ? PSTR("T1") : PSTR("T0")); + gcode.process_subcommands_now_P(uiCfg.extruderIndexBak == 1 ? PSTR("T1") : PSTR("T0")); #endif feedrate_mm_s = (float)uiCfg.moveSpeed_bak; if (uiCfg.print_state == PAUSED) planner.set_e_position_mm((destination.e = current_position.e = uiCfg.current_e_position_bak)); - thermalManager.temp_hotend[uiCfg.curSprayerChoose].target = uiCfg.desireSprayerTempBak; + thermalManager.setTargetHotend(uiCfg.hotendTargetTempBak, uiCfg.extruderIndex); clear_cur_ui(); draw_return_ui(); @@ -132,7 +132,7 @@ void lv_draw_filament_change() { } void disp_filament_type() { - if (uiCfg.curSprayerChoose == 1) { + if (uiCfg.extruderIndex == 1) { lv_imgbtn_set_src_both(buttonType, "F:/bmp_extru2.bin"); if (gCfgItems.multiple_language) { lv_label_set_text(labelType, preheat_menu.ext2); @@ -153,8 +153,8 @@ void disp_filament_temp() { public_buf_l[0] = '\0'; - strcat(public_buf_l, uiCfg.curSprayerChoose < 1 ? preheat_menu.ext1 : preheat_menu.ext2); - sprintf(buf, preheat_menu.value_state, (int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius, (int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].target); + strcat(public_buf_l, uiCfg.extruderIndex < 1 ? preheat_menu.ext1 : preheat_menu.ext2); + sprintf(buf, preheat_menu.value_state, (int)thermalManager.degHotend(uiCfg.extruderIndex), (int)thermalManager.degTargetHotend(uiCfg.extruderIndex)); strcat_P(public_buf_l, PSTR(": ")); strcat(public_buf_l, buf); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.cpp index eb4b370838..cd77db8ae1 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.cpp @@ -66,7 +66,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { break; case ID_O_FILAMENT: #if HAS_MULTI_EXTRUDER - uiCfg.curSprayerChoose_bak = active_extruder; + uiCfg.extruderIndexBak = active_extruder; #endif if (uiCfg.print_state == WORKING) { #if ENABLED(SDSUPPORT) @@ -76,7 +76,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { #endif } uiCfg.moveSpeed_bak = (uint16_t)feedrate_mm_s; - uiCfg.desireSprayerTempBak = thermalManager.temp_hotend[active_extruder].target; + uiCfg.hotendTargetTempBak = thermalManager.degTargetHotend(active_extruder); lv_clear_operation(); lv_draw_filament_change(); break; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp index f2fda3a286..73a0808e9c 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp @@ -48,47 +48,46 @@ enum { static void event_handler(lv_obj_t *obj, lv_event_t event) { if (event != LV_EVENT_RELEASED) return; switch (obj->mks_obj_id) { - case ID_P_ADD: + case ID_P_ADD: { if (uiCfg.curTempType == 0) { - thermalManager.temp_hotend[uiCfg.curSprayerChoose].target += uiCfg.stepHeat; - if (uiCfg.curSprayerChoose == 0) { - if ((int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].target > (HEATER_0_MAXTEMP - (WATCH_TEMP_INCREASE + TEMP_HYSTERESIS + 1))) { - thermalManager.temp_hotend[uiCfg.curSprayerChoose].target = (float)HEATER_0_MAXTEMP - (WATCH_TEMP_INCREASE + TEMP_HYSTERESIS + 1); - } - } + int16_t max_target; + thermalManager.temp_hotend[uiCfg.extruderIndex].target += uiCfg.stepHeat; + if (uiCfg.extruderIndex == 0) + max_target = HEATER_0_MAXTEMP - (WATCH_TEMP_INCREASE + TEMP_HYSTERESIS + 1); #if HAS_MULTI_HOTEND - else if ((int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].target > (HEATER_1_MAXTEMP - (WATCH_TEMP_INCREASE + TEMP_HYSTERESIS + 1))) { - thermalManager.temp_hotend[uiCfg.curSprayerChoose].target = (float)HEATER_1_MAXTEMP - (WATCH_TEMP_INCREASE + TEMP_HYSTERESIS + 1); - } + else + max_target = HEATER_1_MAXTEMP - (WATCH_TEMP_INCREASE + TEMP_HYSTERESIS + 1); #endif - thermalManager.start_watching_hotend(uiCfg.curSprayerChoose); + if (thermalManager.degTargetHotend(uiCfg.extruderIndex) > max_target) + thermalManager.setTargetHotend(max_target, uiCfg.extruderIndex); + thermalManager.start_watching_hotend(uiCfg.extruderIndex); } #if HAS_HEATED_BED else { + constexpr int16_t max_target = BED_MAXTEMP - (WATCH_BED_TEMP_INCREASE + TEMP_BED_HYSTERESIS + 1); thermalManager.temp_bed.target += uiCfg.stepHeat; - if ((int)thermalManager.temp_bed.target > BED_MAXTEMP - (WATCH_BED_TEMP_INCREASE + TEMP_BED_HYSTERESIS + 1)) { - thermalManager.temp_bed.target = (float)BED_MAXTEMP - (WATCH_BED_TEMP_INCREASE + TEMP_BED_HYSTERESIS + 1); - } + if (thermalManager.degTargetBed() > max_target) + thermalManager.setTargetBed(max_target); thermalManager.start_watching_bed(); } #endif disp_desire_temp(); - break; + } break; + case ID_P_DEC: if (uiCfg.curTempType == 0) { - if ((int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].target > uiCfg.stepHeat) - thermalManager.temp_hotend[uiCfg.curSprayerChoose].target -= uiCfg.stepHeat; + if ((int)thermalManager.degTargetHotend(uiCfg.extruderIndex) > uiCfg.stepHeat) + thermalManager.temp_hotend[uiCfg.extruderIndex].target -= uiCfg.stepHeat; else - thermalManager.temp_hotend[uiCfg.curSprayerChoose].target = 0; - - thermalManager.start_watching_hotend(uiCfg.curSprayerChoose); + thermalManager.setTargetHotend(0, uiCfg.extruderIndex); + thermalManager.start_watching_hotend(uiCfg.extruderIndex); } #if HAS_HEATED_BED else { if ((int)thermalManager.temp_bed.target > uiCfg.stepHeat) thermalManager.temp_bed.target -= uiCfg.stepHeat; else - thermalManager.temp_bed.target = 0; + thermalManager.setTargetBed(0); thermalManager.start_watching_bed(); } @@ -98,20 +97,20 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { case ID_P_TYPE: if (uiCfg.curTempType == 0) { if (ENABLED(HAS_MULTI_EXTRUDER)) { - if (uiCfg.curSprayerChoose == 0) { - uiCfg.curSprayerChoose = 1; + if (uiCfg.extruderIndex == 0) { + uiCfg.extruderIndex = 1; } - else if (uiCfg.curSprayerChoose == 1) { + else if (uiCfg.extruderIndex == 1) { if (TEMP_SENSOR_BED != 0) { uiCfg.curTempType = 1; } else { uiCfg.curTempType = 0; - uiCfg.curSprayerChoose = 0; + uiCfg.extruderIndex = 0; } } } - else if (uiCfg.curSprayerChoose == 0) { + else if (uiCfg.extruderIndex == 0) { if (TEMP_SENSOR_BED != 0) uiCfg.curTempType = 1; else @@ -119,7 +118,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } } else if (uiCfg.curTempType == 1) { - uiCfg.curSprayerChoose = 0; + uiCfg.extruderIndex = 0; uiCfg.curTempType = 0; } disp_temp_type(); @@ -135,8 +134,8 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { break; case ID_P_OFF: if (uiCfg.curTempType == 0) { - thermalManager.temp_hotend[uiCfg.curSprayerChoose].target = 0; - thermalManager.start_watching_hotend(uiCfg.curSprayerChoose); + thermalManager.setTargetHotend(0, uiCfg.extruderIndex); + thermalManager.start_watching_hotend(uiCfg.extruderIndex); } #if HAS_HEATED_BED else { @@ -186,7 +185,7 @@ void lv_draw_preHeat() { void disp_temp_type() { if (uiCfg.curTempType == 0) { - if (uiCfg.curSprayerChoose == 1) { + if (uiCfg.extruderIndex == 1) { lv_imgbtn_set_src_both(buttonType, "F:/bmp_extru2.bin"); if (gCfgItems.multiple_language) { lv_label_set_text(labelType, preheat_menu.ext2); @@ -217,13 +216,13 @@ void disp_desire_temp() { public_buf_l[0] = '\0'; if (uiCfg.curTempType == 0) { - strcat(public_buf_l, uiCfg.curSprayerChoose < 1 ? preheat_menu.ext1 : preheat_menu.ext2); - sprintf(buf, preheat_menu.value_state, (int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].celsius, (int)thermalManager.temp_hotend[uiCfg.curSprayerChoose].target); + strcat(public_buf_l, uiCfg.extruderIndex < 1 ? preheat_menu.ext1 : preheat_menu.ext2); + sprintf(buf, preheat_menu.value_state, (int)thermalManager.degHotend(uiCfg.extruderIndex), (int)thermalManager.degTargetHotend(uiCfg.extruderIndex)); } #if HAS_HEATED_BED else { strcat(public_buf_l, preheat_menu.hotbed); - sprintf(buf, preheat_menu.value_state, (int)thermalManager.temp_bed.celsius, (int)thermalManager.temp_bed.target); + sprintf(buf, preheat_menu.value_state, (int)thermalManager.temp_bed.celsius, (int)thermalManager.temp_bed.target); } #endif strcat_P(public_buf_l, PSTR(": ")); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp index 782ce21992..2cc6d19cc5 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp @@ -203,11 +203,11 @@ void lv_draw_printing() { } void disp_ext_temp() { - sprintf(public_buf_l, printing_menu.temp1, (int)thermalManager.temp_hotend[0].celsius, (int)thermalManager.temp_hotend[0].target); + sprintf(public_buf_l, printing_menu.temp1, (int)thermalManager.degHotend(0), (int)thermalManager.degTargetHotend(0)); lv_label_set_text(labelExt1, public_buf_l); #if HAS_MULTI_EXTRUDER - sprintf(public_buf_l, printing_menu.temp1, (int)thermalManager.temp_hotend[1].celsius, (int)thermalManager.temp_hotend[1].target); + sprintf(public_buf_l, printing_menu.temp1, (int)thermalManager.degHotend(1), (int)thermalManager.degTargetHotend(1)); lv_label_set_text(labelExt2, public_buf_l); #endif } diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp index 047a6cdb70..7554f746ca 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp @@ -98,10 +98,10 @@ void disp_det_error() { lv_obj_t *e1, *e2, *e3, *bed; void mks_disp_test() { char buf[30] = {0}; - sprintf_P(buf, PSTR("e1:%d"), (int)thermalManager.temp_hotend[0].celsius); + sprintf_P(buf, PSTR("e1:%d"), (int)thermalManager.degHotend(0)); lv_label_set_text(e1, buf); #if HAS_MULTI_HOTEND - sprintf_P(buf, PSTR("e2:%d"), (int)thermalManager.temp_hotend[1].celsius); + sprintf_P(buf, PSTR("e2:%d"), (int)thermalManager.degHotend(1)); lv_label_set_text(e2, buf); #endif #if HAS_HEATED_BED @@ -133,12 +133,12 @@ void lv_draw_ready_print() { #if 1 e1 = lv_label_create_empty(scr); lv_obj_set_pos(e1, 20, 20); - sprintf_P(buf, PSTR("e1: %d"), (int)thermalManager.temp_hotend[0].celsius); + sprintf_P(buf, PSTR("e1: %d"), (int)thermalManager.degHotend(0)); lv_label_set_text(e1, buf); #if HAS_MULTI_HOTEND e2 = lv_label_create_empty(scr); lv_obj_set_pos(e2, 20, 45); - sprintf_P(buf, PSTR("e1: %d"), (int)thermalManager.temp_hotend[1].celsius); + sprintf_P(buf, PSTR("e1: %d"), (int)thermalManager.degHotend(1)); lv_label_set_text(e2, buf); #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp index aa6d3869a6..8e9e5d59fa 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.cpp @@ -68,7 +68,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { #endif break; case ID_T_FILAMENT: - uiCfg.desireSprayerTempBak = thermalManager.temp_hotend[uiCfg.curSprayerChoose].target; + uiCfg.hotendTargetTempBak = thermalManager.degTargetHotend(uiCfg.extruderIndex); lv_draw_filament_change(); break; case ID_T_MORE: diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp index 9d13ca3120..9b7fea0a45 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp @@ -179,7 +179,7 @@ void gCfgItems_init() { void ui_cfg_init() { uiCfg.curTempType = 0; - uiCfg.curSprayerChoose = 0; + uiCfg.extruderIndex = 0; uiCfg.stepHeat = 10; uiCfg.leveling_first_time = false; uiCfg.para_ui_page = false; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h index 34c6b1f254..4b0ce2b4d8 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h @@ -211,9 +211,9 @@ typedef struct { typedef struct { uint8_t curTempType:1, - curSprayerChoose:3, + extruderIndex:3, stepHeat:4, - curSprayerChoose_bak:4; + extruderIndexBak:4; bool leveling_first_time:1, para_ui_page:1, configWifi:1, @@ -246,7 +246,7 @@ typedef struct { filament_loading_time_cnt, filament_unloading_time_cnt; float move_dist; - float desireSprayerTempBak; + float hotendTargetTempBak; float current_x_position_bak, current_y_position_bak, current_z_position_bak, diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp index 02ca16e007..ddf7173297 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp @@ -885,9 +885,9 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { char *outBuf = (char *)tempBuf; char str_1[16], tbuf[34]; - dtostrf(thermalManager.temp_hotend[0].celsius, 1, 1, tbuf); + dtostrf(thermalManager.degHotend(0), 1, 1, tbuf); strcat_P(tbuf, PSTR(" /")); - strcat(tbuf, dtostrf(thermalManager.temp_hotend[0].target, 1, 1, str_1)); + strcat(tbuf, dtostrf(thermalManager.degTargetHotend(0), 1, 1, str_1)); const int tlen = strlen(tbuf); @@ -912,9 +912,9 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { strcat_P(outBuf, PSTR(" T1:")); outBuf += 4; #if HAS_MULTI_HOTEND - strcat(outBuf, dtostrf(thermalManager.temp_hotend[1].celsius, 1, 1, str_1)); + strcat(outBuf, dtostrf(thermalManager.degHotend(1), 1, 1, str_1)); strcat_P(outBuf, PSTR(" /")); - strcat(outBuf, dtostrf(thermalManager.temp_hotend[1].target, 1, 1, str_1)); + strcat(outBuf, dtostrf(thermalManager.degTargetHotend(1), 1, 1, str_1)); #else strcat_P(outBuf, PSTR("0 /0")); #endif @@ -924,15 +924,15 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { } else { sprintf_P((char *)tempBuf, PSTR("T:%d /%d B:%d /%d T0:%d /%d T1:%d /%d @:0 B@:0\r\n"), - (int)thermalManager.temp_hotend[0].celsius, (int)thermalManager.temp_hotend[0].target, + (int)thermalManager.degHotend(0), (int)thermalManager.degTargetHotend(0), #if HAS_HEATED_BED (int)thermalManager.temp_bed.celsius, (int)thermalManager.temp_bed.target, #else 0, 0, #endif - (int)thermalManager.temp_hotend[0].celsius, (int)thermalManager.temp_hotend[0].target, + (int)thermalManager.degHotend(0), (int)thermalManager.degTargetHotend(0), #if HAS_MULTI_HOTEND - (int)thermalManager.temp_hotend[1].celsius, (int)thermalManager.temp_hotend[1].target + (int)thermalManager.degHotend(1), (int)thermalManager.degTargetHotend(1) #else 0, 0 #endif From 87bef13a4c9c1c7f3a670f906c106bc868ab12f2 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 6 Mar 2021 10:16:18 -0600 Subject: [PATCH 104/253] Fix DGUS include paths Followup to #20609 --- Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSScreenHandler.cpp | 2 +- Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSScreenHandler.cpp | 2 +- Marlin/src/lcd/extui/lib/dgus/origin/DGUSScreenHandler.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSScreenHandler.cpp index c43243b39d..5497dd53cc 100644 --- a/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSScreenHandler.cpp @@ -37,7 +37,7 @@ #include "../../../../../sd/cardreader.h" #if ENABLED(POWER_LOSS_RECOVERY) - #include "../../../../feature/powerloss.h" + #include "../../../../../feature/powerloss.h" #endif #if ENABLED(SDSUPPORT) diff --git a/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSScreenHandler.cpp index 90cfae7f09..c170c288aa 100644 --- a/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSScreenHandler.cpp @@ -37,7 +37,7 @@ #include "../../../../../sd/cardreader.h" #if ENABLED(POWER_LOSS_RECOVERY) - #include "../../../../feature/powerloss.h" + #include "../../../../../feature/powerloss.h" #endif #if ENABLED(SDSUPPORT) diff --git a/Marlin/src/lcd/extui/lib/dgus/origin/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/lib/dgus/origin/DGUSScreenHandler.cpp index f1d91371c2..ff924f4061 100644 --- a/Marlin/src/lcd/extui/lib/dgus/origin/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/origin/DGUSScreenHandler.cpp @@ -37,7 +37,7 @@ #include "../../../../../sd/cardreader.h" #if ENABLED(POWER_LOSS_RECOVERY) - #include "../../../../feature/powerloss.h" + #include "../../../../../feature/powerloss.h" #endif #if ENABLED(SDSUPPORT) From b95e548ddbcbc1c088eabc17992d0a06f82ac167 Mon Sep 17 00:00:00 2001 From: Mike La Spina Date: Sat, 6 Mar 2021 14:13:28 -0600 Subject: [PATCH 105/253] Cooler (for Laser) - M143, M193 (#21255) --- Marlin/Configuration.h | 4 + Marlin/Configuration_adv.h | 44 +++ Marlin/src/HAL/AVR/fastio.h | 2 +- Marlin/src/HAL/ESP32/HAL.cpp | 1 + Marlin/src/HAL/SAMD51/HAL.cpp | 14 + Marlin/src/HAL/STM32F1/HAL.cpp | 9 + Marlin/src/HAL/STM32F1/msc_sd.cpp | 35 +- Marlin/src/core/language.h | 2 + Marlin/src/feature/cooler.cpp | 37 ++ Marlin/src/feature/cooler.h | 50 +++ Marlin/src/feature/power.cpp | 7 + Marlin/src/gcode/calibrate/G76_M192_M871.cpp | 11 - Marlin/src/gcode/gcode.cpp | 5 + Marlin/src/gcode/gcode.h | 7 + Marlin/src/gcode/host/M115.cpp | 3 + Marlin/src/gcode/temp/M140_M190.cpp | 11 - Marlin/src/gcode/temp/M141_M191.cpp | 12 - Marlin/src/gcode/temp/M143_M193.cpp | 67 ++++ Marlin/src/inc/Conditionals_adv.h | 4 + Marlin/src/inc/Conditionals_post.h | 60 ++- Marlin/src/inc/SanityCheck.h | 4 + Marlin/src/lcd/dogm/dogm_Statusscreen.h | 58 +++ Marlin/src/lcd/dogm/status/cooler.h | 70 ++++ Marlin/src/lcd/dogm/status_screen_DOGM.cpp | 35 +- Marlin/src/lcd/extui/ui_api.cpp | 26 +- Marlin/src/lcd/extui/ui_api.h | 2 +- Marlin/src/lcd/language/language_en.h | 6 + Marlin/src/lcd/menu/menu_info.cpp | 10 + Marlin/src/lcd/menu/menu_temperature.cpp | 23 +- Marlin/src/lcd/tft/tft_color.h | 3 + Marlin/src/lcd/tft/touch.cpp | 6 + Marlin/src/lcd/tft/ui_320x240.cpp | 13 + Marlin/src/lcd/tft/ui_480x320.cpp | 6 + Marlin/src/lcd/tft/ui_common.h | 4 + Marlin/src/module/temperature.cpp | 380 +++++++++++++++++-- Marlin/src/module/temperature.h | 75 +++- Marlin/src/module/thermistor/thermistors.h | 21 +- Marlin/src/pins/pinsDebug_list.h | 6 + Marlin/src/pins/sensitive_pins.h | 20 +- buildroot/tests/BIGTREE_SKR_PRO | 11 +- platformio.ini | 2 + 41 files changed, 1041 insertions(+), 125 deletions(-) create mode 100644 Marlin/src/feature/cooler.cpp create mode 100644 Marlin/src/feature/cooler.h create mode 100644 Marlin/src/gcode/temp/M143_M193.cpp create mode 100644 Marlin/src/lcd/dogm/status/cooler.h diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 90ab4d58af..7b0023a564 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -329,8 +329,10 @@ #define AUTO_POWER_E_FANS #define AUTO_POWER_CONTROLLERFAN #define AUTO_POWER_CHAMBER_FAN + #define AUTO_POWER_COOLER_FAN //#define AUTO_POWER_E_TEMP 50 // (°C) Turn on PSU if any extruder is over this temperature //#define AUTO_POWER_CHAMBER_TEMP 30 // (°C) Turn on PSU if the chamber is over this temperature + //#define AUTO_POWER_COOLER_TEMP 26 // (°C) Turn on PSU if the cooler is over this temperature #define POWER_TIMEOUT 30 // (s) Turn off power if the machine is idle for this duration //#define POWER_OFF_DELAY 60 // (s) Delay of poweroff after M81 command. Useful to let fans run for extra time. #endif @@ -418,6 +420,7 @@ #define TEMP_SENSOR_BED 0 #define TEMP_SENSOR_PROBE 0 #define TEMP_SENSOR_CHAMBER 0 +#define TEMP_SENSOR_COOLER 0 // Dummy thermistor constant temperature readings, for use with 998 and 999 #define DUMMY_THERMISTOR_998_VALUE 25 @@ -636,6 +639,7 @@ #define THERMAL_PROTECTION_HOTENDS // Enable thermal protection for all extruders #define THERMAL_PROTECTION_BED // Enable thermal protection for the heated bed #define THERMAL_PROTECTION_CHAMBER // Enable thermal protection for the heated chamber +#define THERMAL_PROTECTION_COOLER // Enable thermal protection for the laser cooling //=========================================================================== //============================= Mechanical Settings ========================= diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 8bbc50bee4..3168e9a001 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -113,6 +113,12 @@ #define CHAMBER_BETA 3950 // Beta value #endif +#if TEMP_SENSOR_COOLER == 1000 + #define COOLER_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor + #define COOLER_RESISTANCE_25C_OHMS 100000 // Resistance at 25C + #define COOLER_BETA 3950 // Beta value +#endif + #if TEMP_SENSOR_PROBE == 1000 #define PROBE_PULLUP_RESISTOR_OHMS 4700 // Pullup resistor #define PROBE_RESISTANCE_25C_OHMS 100000 // Resistance at 25C @@ -179,6 +185,25 @@ #endif #endif +// +// Laser Cooler options +// +#if TEMP_SENSOR_COOLER + #define COOLER_MINTEMP 8 // (°C) + #define COOLER_MAXTEMP 26 // (°C) + #define COOLER_DEFAULT_TEMP 16 // (°C) + #define TEMP_COOLER_HYSTERESIS 1 // (°C) Temperature proximity considered "close enough" to the target + #define COOLER_PIN 8 // Laser cooler on/off pin used to control power to the cooling element e.g. TEC, External chiller via relay + #define COOLER_INVERTING false + #define TEMP_COOLER_PIN 15 // Laser/Cooler temperature sensor pin. ADC is required. + #define COOLER_FAN // Enable a fan on the cooler, Fan# 0,1,2,3 etc. + #define COOLER_FAN_INDEX 0 // FAN number 0, 1, 2 etc. e.g. + #if ENABLED(COOLER_FAN) + #define COOLER_FAN_BASE 100 // Base Cooler fan PWM (0-255); turns on when Cooler temperature is above the target + #define COOLER_FAN_FACTOR 25 // PWM increase per °C above target + #endif +#endif + /** * Thermal Protection provides additional protection to your printer from damage * and fire. Marlin always includes safe min and max temperature ranges which @@ -248,6 +273,20 @@ #define WATCH_CHAMBER_TEMP_INCREASE 2 // Degrees Celsius #endif +/** + * Thermal Protection parameters for the laser cooler. + */ +#if ENABLED(THERMAL_PROTECTION_COOLER) + #define THERMAL_PROTECTION_COOLER_PERIOD 10 // Seconds + #define THERMAL_PROTECTION_COOLER_HYSTERESIS 3 // Degrees Celsius + + /** + * Laser cooling watch settings (M143/M193). + */ + #define WATCH_COOLER_TEMP_PERIOD 60 // Seconds + #define WATCH_COOLER_TEMP_INCREASE 3 // Degrees Celsius +#endif + #if ENABLED(PIDTEMP) // Add an experimental additional term to the heater power, proportional to the extrusion speed. // A well-chosen Kc value should add just enough power to melt the increased material volume. @@ -493,11 +532,15 @@ #define E6_AUTO_FAN_PIN -1 #define E7_AUTO_FAN_PIN -1 #define CHAMBER_AUTO_FAN_PIN -1 +#define COOLER_AUTO_FAN_PIN -1 +#define COOLER_FAN_PIN -1 #define EXTRUDER_AUTO_FAN_TEMPERATURE 50 #define EXTRUDER_AUTO_FAN_SPEED 255 // 255 == full speed #define CHAMBER_AUTO_FAN_TEMPERATURE 30 #define CHAMBER_AUTO_FAN_SPEED 255 +#define COOLER_AUTO_FAN_TEMPERATURE 18 +#define COOLER_AUTO_FAN_SPEED 255 /** * Part-Cooling Fan Multiplexer @@ -1495,6 +1538,7 @@ #define STATUS_BED_ANIM // Use a second bitmap to indicate bed heating #define STATUS_CHAMBER_ANIM // Use a second bitmap to indicate chamber heating //#define STATUS_CUTTER_ANIM // Use a second bitmap to indicate spindle / laser active + //#define STATUS_COOLER_ANIM // Use a second bitmap to indicate laser cooling //#define STATUS_ALT_BED_BITMAP // Use the alternative bed bitmap //#define STATUS_ALT_FAN_BITMAP // Use the alternative fan bitmap //#define STATUS_FAN_FRAMES 3 // :[0,1,2,3,4] Number of fan animation frames diff --git a/Marlin/src/HAL/AVR/fastio.h b/Marlin/src/HAL/AVR/fastio.h index dd01634661..cf704179c8 100644 --- a/Marlin/src/HAL/AVR/fastio.h +++ b/Marlin/src/HAL/AVR/fastio.h @@ -285,7 +285,7 @@ enum ClockSource2 : char { */ // Determine which harware PWMs are already in use -#define _PWM_CHK_FAN_B(P) (P == E0_AUTO_FAN_PIN || P == E1_AUTO_FAN_PIN || P == E2_AUTO_FAN_PIN || P == E3_AUTO_FAN_PIN || P == E4_AUTO_FAN_PIN || P == E5_AUTO_FAN_PIN || P == E6_AUTO_FAN_PIN || P == E7_AUTO_FAN_PIN || P == CHAMBER_AUTO_FAN_PIN) +#define _PWM_CHK_FAN_B(P) (P == E0_AUTO_FAN_PIN || P == E1_AUTO_FAN_PIN || P == E2_AUTO_FAN_PIN || P == E3_AUTO_FAN_PIN || P == E4_AUTO_FAN_PIN || P == E5_AUTO_FAN_PIN || P == E6_AUTO_FAN_PIN || P == E7_AUTO_FAN_PIN || P == CHAMBER_AUTO_FAN_PIN || P == COOLER_AUTO_FAN_PIN) #if PIN_EXISTS(CONTROLLER_FAN) #define PWM_CHK_FAN_B(P) (_PWM_CHK_FAN_B(P) || P == CONTROLLER_FAN_PIN) #else diff --git a/Marlin/src/HAL/ESP32/HAL.cpp b/Marlin/src/HAL/ESP32/HAL.cpp index fb5f531b22..ab28595071 100644 --- a/Marlin/src/HAL/ESP32/HAL.cpp +++ b/Marlin/src/HAL/ESP32/HAL.cpp @@ -185,6 +185,7 @@ void HAL_adc_init() { TERN_(HAS_TEMP_ADC_7, adc3_set_attenuation(get_channel(TEMP_7_PIN), ADC_ATTEN_11db)); TERN_(HAS_HEATED_BED, adc1_set_attenuation(get_channel(TEMP_BED_PIN), ADC_ATTEN_11db)); TERN_(HAS_TEMP_CHAMBER, adc1_set_attenuation(get_channel(TEMP_CHAMBER_PIN), ADC_ATTEN_11db)); + TERN_(HAS_TEMP_COOLER, adc1_set_attenuation(get_channel(TEMP_COOLER_PIN), ADC_ATTEN_11db)); TERN_(FILAMENT_WIDTH_SENSOR, adc1_set_attenuation(get_channel(FILWIDTH_PIN), ADC_ATTEN_11db)); // Note that adc2 is shared with the WiFi module, which has higher priority, so the conversion may fail. diff --git a/Marlin/src/HAL/SAMD51/HAL.cpp b/Marlin/src/HAL/SAMD51/HAL.cpp index 17e89c723f..4a6100b96b 100644 --- a/Marlin/src/HAL/SAMD51/HAL.cpp +++ b/Marlin/src/HAL/SAMD51/HAL.cpp @@ -57,6 +57,7 @@ #define GET_PROBE_ADC() TERN(HAS_TEMP_PROBE, PIN_TO_ADC(TEMP_PROBE_PIN), -1) #define GET_BED_ADC() TERN(HAS_TEMP_ADC_BED, PIN_TO_ADC(TEMP_BED_PIN), -1) #define GET_CHAMBER_ADC() TERN(HAS_TEMP_ADC_CHAMBER, PIN_TO_ADC(TEMP_CHAMBER_PIN), -1) +#define GET_COOLER_ADC() TERN(HAS_TEMP_ADC_COOLER, PIN_TO_ADC(TEMP_COOLER_PIN), -1) #define GET_FILAMENT_WIDTH_ADC() TERN(FILAMENT_WIDTH_SENSOR, PIN_TO_ADC(FILWIDTH_PIN), -1) #define GET_BUTTONS_ADC() TERN(HAS_ADC_BUTTONS, PIN_TO_ADC(ADC_KEYPAD_PIN), -1) @@ -66,6 +67,7 @@ || GET_PROBE_ADC() == n \ || GET_BED_ADC() == n \ || GET_CHAMBER_ADC() == n \ + || GET_COOLER_ADC() == n \ || GET_FILAMENT_WIDTH_ADC() == n \ || GET_BUTTONS_ADC() == n \ ) @@ -144,6 +146,9 @@ uint16_t HAL_adc_result; #if GET_CHAMBER_ADC() == 0 TEMP_CHAMBER_PIN, #endif + #if GET_COOLER_ADC() == 0 + TEMP_COOLER_PIN, + #endif #if GET_FILAMENT_WIDTH_ADC() == 0 FILWIDTH_PIN, #endif @@ -184,6 +189,9 @@ uint16_t HAL_adc_result; #if GET_CHAMBER_ADC() == 1 TEMP_CHAMBER_PIN, #endif + #if GET_COOLER_ADC() == 1 + TEMP_COOLER_PIN, + #endif #if GET_FILAMENT_WIDTH_ADC() == 1 FILWIDTH_PIN, #endif @@ -232,6 +240,9 @@ uint16_t HAL_adc_result; #if GET_CHAMBER_ADC() == 0 { PIN_TO_INPUTCTRL(TEMP_CHAMBER_PIN) }, #endif + #if GET_COOLER_ADC() == 0 + { PIN_TO_INPUTCTRL(TEMP_COOLER_PIN) }, + #endif #if GET_FILAMENT_WIDTH_ADC() == 0 { PIN_TO_INPUTCTRL(FILWIDTH_PIN) }, #endif @@ -281,6 +292,9 @@ uint16_t HAL_adc_result; #if GET_CHAMBER_ADC() == 1 { PIN_TO_INPUTCTRL(TEMP_CHAMBER_PIN) }, #endif + #if GET_COOLER_ADC() == 1 + { PIN_TO_INPUTCTRL(TEMP_COOLER_PIN) }, + #endif #if GET_FILAMENT_WIDTH_ADC() == 1 { PIN_TO_INPUTCTRL(FILWIDTH_PIN) }, #endif diff --git a/Marlin/src/HAL/STM32F1/HAL.cpp b/Marlin/src/HAL/STM32F1/HAL.cpp index 020c623b77..182d9401c1 100644 --- a/Marlin/src/HAL/STM32F1/HAL.cpp +++ b/Marlin/src/HAL/STM32F1/HAL.cpp @@ -132,6 +132,9 @@ const uint8_t adc_pins[] = { #if HAS_TEMP_CHAMBER TEMP_CHAMBER_PIN, #endif + #if HAS_TEMP_COOLER + TEMP_COOLER_PIN, + #endif #if HAS_TEMP_ADC_1 TEMP_1_PIN, #endif @@ -189,6 +192,9 @@ enum TempPinIndex : char { #if HAS_TEMP_CHAMBER TEMP_CHAMBER, #endif + #if HAS_TEMP_COOLER + TEMP_COOLER_PIN, + #endif #if HAS_TEMP_ADC_1 TEMP_1, #endif @@ -385,6 +391,9 @@ void HAL_adc_start_conversion(const uint8_t adc_pin) { #if HAS_TEMP_CHAMBER case TEMP_CHAMBER_PIN: pin_index = TEMP_CHAMBER; break; #endif + #if HAS_TEMP_COOLER + case TEMP_COOLER_PIN: pin_index = TEMP_COOLER; break; + #endif #if HAS_TEMP_ADC_1 case TEMP_1_PIN: pin_index = TEMP_1; break; #endif diff --git a/Marlin/src/HAL/STM32F1/msc_sd.cpp b/Marlin/src/HAL/STM32F1/msc_sd.cpp index a916184999..1e2fe88174 100644 --- a/Marlin/src/HAL/STM32F1/msc_sd.cpp +++ b/Marlin/src/HAL/STM32F1/msc_sd.cpp @@ -43,26 +43,27 @@ Serial0Type MarlinCompositeSerial(true); #if ENABLED(EMERGENCY_PARSER) -// The original callback is not called (no way to retrieve address). -// That callback detects a special STM32 reset sequence: this functionality is not essential -// as M997 achieves the same. -void my_rx_callback(unsigned int, void*) { - // max length of 16 is enough to contain all emergency commands - uint8 buf[16]; + // The original callback is not called (no way to retrieve address). + // That callback detects a special STM32 reset sequence: this functionality is not essential + // as M997 achieves the same. + void my_rx_callback(unsigned int, void*) { + // max length of 16 is enough to contain all emergency commands + uint8 buf[16]; - //rx is usbSerialPart.endpoints[2] - uint16 len = usb_get_ep_rx_count(usbSerialPart.endpoints[2].address); - uint32 total = composite_cdcacm_data_available(); + //rx is usbSerialPart.endpoints[2] + uint16 len = usb_get_ep_rx_count(usbSerialPart.endpoints[2].address); + uint32 total = composite_cdcacm_data_available(); - if (len == 0 || total == 0 || !WITHIN(total, len, COUNT(buf))) - return; + if (len == 0 || total == 0 || !WITHIN(total, len, COUNT(buf))) + return; - // cannot get character by character due to bug in composite_cdcacm_peek_ex - len = composite_cdcacm_peek(buf, total); + // cannot get character by character due to bug in composite_cdcacm_peek_ex + len = composite_cdcacm_peek(buf, total); + + for (uint32 i = 0; i < len; i++) + emergency_parser.update(MarlinCompositeSerial.emergency_state, buf[i+total-len]); + } - for (uint32 i = 0; i < len; i++) - emergency_parser.update(MarlinCompositeSerial.emergency_state, buf[i+total-len]); -} #endif void MSC_SD_init() { @@ -87,7 +88,7 @@ void MSC_SD_init() { MarlinCompositeSerial.registerComponent(); USBComposite.begin(); #if ENABLED(EMERGENCY_PARSER) - composite_cdcacm_set_hooks(USBHID_CDCACM_HOOK_RX, my_rx_callback); + composite_cdcacm_set_hooks(USBHID_CDCACM_HOOK_RX, my_rx_callback); #endif } diff --git a/Marlin/src/core/language.h b/Marlin/src/core/language.h index c9c3fd0153..71e8ea524c 100644 --- a/Marlin/src/core/language.h +++ b/Marlin/src/core/language.h @@ -247,6 +247,8 @@ #define STR_HEATER_BED "bed" #define STR_HEATER_CHAMBER "chamber" +#define STR_COOLER "cooler" +#define STR_LASER_TEMP "laser temperature" #define STR_STOPPED_HEATER ", system stopped! Heater_ID: " #define STR_REDUNDANCY "Heater switched off. Temperature difference between temp sensors is too high !" diff --git a/Marlin/src/feature/cooler.cpp b/Marlin/src/feature/cooler.cpp new file mode 100644 index 0000000000..03640df487 --- /dev/null +++ b/Marlin/src/feature/cooler.cpp @@ -0,0 +1,37 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 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 . + * + */ + +#include "../inc/MarlinConfig.h" + +#if HAS_COOLER + +#include "cooler.h" +Cooler cooler; + +uint16_t Cooler::flowrate; // Flow meter reading in liters, 0 will result in shutdown if equiped +uint8_t Cooler::mode = 0; // 0 = CO2 Liquid cooling, 1 = Laser Diode TEC Heatsink Cooling +uint16_t Cooler::capacity; // Cooling capacity in watts +uint16_t Cooler::load; // Cooling load in watts +bool Cooler::flowmeter = false; +bool Cooler::state = false; // on = true, off = false + +#endif diff --git a/Marlin/src/feature/cooler.h b/Marlin/src/feature/cooler.h new file mode 100644 index 0000000000..42a95ccb63 --- /dev/null +++ b/Marlin/src/feature/cooler.h @@ -0,0 +1,50 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 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 + +#include + +#define _MSG_COOLER(M) MSG_COOLER_##M +#define MSG_COOLER(M) _MSG_COOLER(M) + +// Cooling device + +class Cooler { +public: + static uint16_t flowrate; // Flow meter reading in liters, 0 will result in shutdown if equiped + static uint8_t mode; // 0 = CO2 Liquid cooling, 1 = Laser Diode TEC Heatsink Cooling + static uint16_t capacity; // Cooling capacity in watts + static uint16_t load; // Cooling load in watts + static bool flowmeter; + static bool state; // on = true, off = false + + static bool is_enabled() { return state; } + static void enable() { state = true; } + static void disable() { state = false; } + static void set_mode(const uint8_t m) { mode = m; } + static void set_flowmeter(const bool sflag) { flowmeter = sflag; } + static uint16_t get_flowrate() { return flowrate; } + static void update_flowrate(uint16_t flow) { flowrate = flow; } + //static void init() { set_state(false); } +}; + +extern Cooler cooler; diff --git a/Marlin/src/feature/power.cpp b/Marlin/src/feature/power.cpp index d22247b46d..8ab49de2bd 100644 --- a/Marlin/src/feature/power.cpp +++ b/Marlin/src/feature/power.cpp @@ -61,6 +61,9 @@ bool Power::is_power_needed() { if (TERN0(AUTO_POWER_CHAMBER_FAN, thermalManager.chamberfan_speed)) return true; + if (TERN0(AUTO_POWER_COOLER_FAN, thermalManager.coolerfan_speed)) + return true; + // If any of the drivers or the bed are enabled... if (X_ENABLE_READ() == X_ENABLE_ON || Y_ENABLE_READ() == Y_ENABLE_ON || Z_ENABLE_READ() == Z_ENABLE_ON #if HAS_X2_ENABLE @@ -89,6 +92,10 @@ bool Power::is_power_needed() { if (thermalManager.degChamber() >= AUTO_POWER_CHAMBER_TEMP) return true; #endif + #if HAS_COOLER && AUTO_POWER_COOLER_TEMP + if (thermalManager.degCooler() >= AUTO_POWER_COOLER_TEMP) return true; + #endif + return false; } diff --git a/Marlin/src/gcode/calibrate/G76_M192_M871.cpp b/Marlin/src/gcode/calibrate/G76_M192_M871.cpp index 5d0bb0dc1e..8cfe6fee7b 100644 --- a/Marlin/src/gcode/calibrate/G76_M192_M871.cpp +++ b/Marlin/src/gcode/calibrate/G76_M192_M871.cpp @@ -36,17 +36,7 @@ #include "../../module/temperature.h" #include "../../module/probe.h" #include "../../feature/probe_temp_comp.h" - #include "../../lcd/marlinui.h" -#include "../../MarlinCore.h" // for wait_for_heatup, idle() - -#if ENABLED(PRINTJOB_TIMER_AUTOSTART) - #include "../../module/printcounter.h" -#endif - -#if ENABLED(PRINTER_EVENTS_LEDS) - #include "../../feature/leds/leds.h" -#endif /** * G76: calibrate probe and/or bed temperature offsets @@ -173,7 +163,6 @@ void GcodeSuite::G76() { remember_feedrate_scaling_off(); - /****************************************** * Calibrate bed temperature offsets ******************************************/ diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index e9a6d4aa2a..34b8d767d1 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -539,6 +539,11 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { case 191: M191(); break; // M191: Wait for chamber temperature to reach target #endif + #if HAS_COOLER + case 143: M143(); break; // M143: Set cooler temperature + case 193: M193(); break; // M193: Wait for cooler temperature to reach target + #endif + #if BOTH(AUTO_REPORT_TEMPERATURES, HAS_TEMP_SENSOR) case 155: M155(); break; // M155: Set temperature auto-report interval #endif diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h index 123b648f90..52570ff83f 100644 --- a/Marlin/src/gcode/gcode.h +++ b/Marlin/src/gcode/gcode.h @@ -153,6 +153,7 @@ * M129 - EtoP Closed. (Requires BARICUDA) * M140 - Set bed target temp. S * M141 - Set heated chamber target temp. S (Requires a chamber heater) + * M143 - Set cooler target temp. S (Requires a laser cooling device) * M145 - Set heatup values for materials on the LCD. H B F for S (0=PLA, 1=ABS) * M149 - Set temperature units. (Requires TEMPERATURE_UNITS_SUPPORT) * M150 - Set Status LED Color as R U B W P. Values 0-255. (Requires BLINKM, RGB_LED, RGBW_LED, NEOPIXEL_LED, PCA9533, or PCA9632). @@ -163,6 +164,7 @@ * M166 - Set the Gradient Mix for the mixing extruder. (Requires GRADIENT_MIX) * M190 - S Wait for bed current temp to reach target temp. ** Wait only when heating! ** * R Wait for bed current temp to reach target temp. ** Wait for heating or cooling. ** + * M193 - R Wait for cooler temp to reach target temp. ** Wait for cooling. ** * M200 - Set filament diameter, D, setting E axis units to cubic. (Use S0 to revert to linear units.) * M201 - Set max acceleration in units/s^2 for print moves: "M201 X Y Z E" * M202 - Set max acceleration in units/s^2 for travel moves: "M202 X Y Z E" ** UNUSED IN MARLIN! ** @@ -632,6 +634,11 @@ private: static void M191(); #endif + #if HAS_COOLER + static void M143(); + static void M193(); + #endif + #if PREHEAT_COUNT static void M145(); #endif diff --git a/Marlin/src/gcode/host/M115.cpp b/Marlin/src/gcode/host/M115.cpp index ac712aea07..316abc3048 100644 --- a/Marlin/src/gcode/host/M115.cpp +++ b/Marlin/src/gcode/host/M115.cpp @@ -141,6 +141,9 @@ void GcodeSuite::M115() { // CHAMBER_TEMPERATURE (M141, M191) cap_line(PSTR("CHAMBER_TEMPERATURE"), ENABLED(HAS_HEATED_CHAMBER)); + // COOLER_TEMPERATURE (M143, M193) + cap_line(PSTR("COOLER_TEMPERATURE"), ENABLED(HAS_COOLER)); + // MEATPACK Compresson cap_line(PSTR("MEATPACK"), ENABLED(MEATPACK)); diff --git a/Marlin/src/gcode/temp/M140_M190.cpp b/Marlin/src/gcode/temp/M140_M190.cpp index d684127fe1..9a1a0287d9 100644 --- a/Marlin/src/gcode/temp/M140_M190.cpp +++ b/Marlin/src/gcode/temp/M140_M190.cpp @@ -32,19 +32,8 @@ #include "../gcode.h" #include "../../module/temperature.h" -#include "../../module/motion.h" #include "../../lcd/marlinui.h" -#if ENABLED(PRINTJOB_TIMER_AUTOSTART) - #include "../../module/printcounter.h" -#endif - -#if ENABLED(PRINTER_EVENT_LEDS) - #include "../../feature/leds/leds.h" -#endif - -#include "../../MarlinCore.h" // for wait_for_heatup, idle, startOrResumeJob - /** * M140: Set bed temperature * diff --git a/Marlin/src/gcode/temp/M141_M191.cpp b/Marlin/src/gcode/temp/M141_M191.cpp index 17eb71eada..ed7637c92a 100644 --- a/Marlin/src/gcode/temp/M141_M191.cpp +++ b/Marlin/src/gcode/temp/M141_M191.cpp @@ -32,20 +32,8 @@ #include "../gcode.h" #include "../../module/temperature.h" - -#include "../../module/motion.h" #include "../../lcd/marlinui.h" -#if ENABLED(PRINTJOB_TIMER_AUTOSTART) - #include "../../module/printcounter.h" -#endif - -#if ENABLED(PRINTER_EVENT_LEDS) - #include "../../feature/leds/leds.h" -#endif - -#include "../../MarlinCore.h" // for wait_for_heatup, idle, startOrResumeJob - /** * M141: Set chamber temperature */ diff --git a/Marlin/src/gcode/temp/M143_M193.cpp b/Marlin/src/gcode/temp/M143_M193.cpp new file mode 100644 index 0000000000..aef4350e60 --- /dev/null +++ b/Marlin/src/gcode/temp/M143_M193.cpp @@ -0,0 +1,67 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 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 . + * + */ + +/** + * gcode/temp/M143_M193.cpp + * + * Laser Cooler target temperature control + */ + +#include "../../inc/MarlinConfig.h" + +#if HAS_COOLER + +#include "../../feature/cooler.h" +extern Cooler cooler; + +#include "../gcode.h" +#include "../../module/temperature.h" +#include "../../lcd/marlinui.h" + +/** + * M143: Set cooler temperature + */ +void GcodeSuite::M143() { + if (DEBUGGING(DRYRUN)) return; + if (parser.seenval('S')) { + thermalManager.setTargetCooler(parser.value_celsius()); + parser.value_celsius() ? cooler.enable() : cooler.disable(); + } +} + +/** + * M193: Sxxx Wait for laser current temp to reach target temp. Waits only when cooling. + */ +void GcodeSuite::M193() { + if (DEBUGGING(DRYRUN)) return; + + if (parser.seenval('S')) { + cooler.enable(); + thermalManager.setTargetCooler(parser.value_celsius()); + if (thermalManager.isLaserCooling()) { + ui.set_status_P(GET_TEXT(MSG_LASER_COOLING)); + thermalManager.wait_for_cooler(true); + } + } +} + +#endif // HAS_COOLER diff --git a/Marlin/src/inc/Conditionals_adv.h b/Marlin/src/inc/Conditionals_adv.h index 43f20b6dfd..00b9b1faef 100644 --- a/Marlin/src/inc/Conditionals_adv.h +++ b/Marlin/src/inc/Conditionals_adv.h @@ -114,6 +114,10 @@ #undef THERMAL_PROTECTION_CHAMBER #endif +#if TEMP_SENSOR_COOLER == 0 + #undef THERMAL_PROTECTION_COOLER +#endif + #if ENABLED(MIXING_EXTRUDER) && (ENABLED(RETRACT_SYNC_MIXING) || BOTH(FILAMENT_LOAD_UNLOAD_GCODES, FILAMENT_UNLOAD_ALL_EXTRUDERS)) #define HAS_MIXER_SYNC_CHANNEL 1 #endif diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index be04341200..e8ed0d5a91 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -399,7 +399,7 @@ * Temp Sensor defines */ -#define ANY_TEMP_SENSOR_IS(n) (TEMP_SENSOR_0 == (n) || TEMP_SENSOR_1 == (n) || TEMP_SENSOR_2 == (n) || TEMP_SENSOR_3 == (n) || TEMP_SENSOR_4 == (n) || TEMP_SENSOR_5 == (n) || TEMP_SENSOR_6 == (n) || TEMP_SENSOR_7 == (n) || TEMP_SENSOR_BED == (n) || TEMP_SENSOR_PROBE == (n) || TEMP_SENSOR_CHAMBER == (n)) +#define ANY_TEMP_SENSOR_IS(n) (TEMP_SENSOR_0 == (n) || TEMP_SENSOR_1 == (n) || TEMP_SENSOR_2 == (n) || TEMP_SENSOR_3 == (n) || TEMP_SENSOR_4 == (n) || TEMP_SENSOR_5 == (n) || TEMP_SENSOR_6 == (n) || TEMP_SENSOR_7 == (n) || TEMP_SENSOR_BED == (n) || TEMP_SENSOR_PROBE == (n) || TEMP_SENSOR_CHAMBER == (n) || TEMP_SENSOR_COOLER == (n)) #if ANY_TEMP_SENSOR_IS(1000) #define HAS_USER_THERMISTORS 1 @@ -744,6 +744,27 @@ #undef CHAMBER_MAXTEMP #endif +#if TEMP_SENSOR_COOLER == -4 + #define COOLER_USES_AD8495 1 +#elif TEMP_SENSOR_COOLER == -3 + #error "MAX31855 Thermocouples (-3) not supported for TEMP_SENSOR_COOLER." +#elif TEMP_SENSOR_COOLER == -2 + #error "MAX6675 Thermocouples (-2) not supported for TEMP_SENSOR_COOLER." +#elif TEMP_SENSOR_COOLER == -1 + #define COOLER_USES_AD595 1 +#elif TEMP_SENSOR_COOLER > 0 + #define TEMP_SENSOR_COOLER_THERMISTOR_ID TEMP_SENSOR_COOLER + #define TEMP_SENSOR_COOLER_IS_THERMISTOR 1 + #if TEMP_SENSOR_COOLER == 1000 + #define COOLER_USER_THERMISTOR 1 + #elif TEMP_SENSOR_COOLER == 998 || TEMP_SENSOR_COOLER == 999 + #define COOLER_DUMMY_THERMISTOR 1 + #endif +#else + #undef COOLER_MINTEMP + #undef COOLER_MAXTEMP +#endif + #if TEMP_SENSOR_PROBE == -4 #define TEMP_SENSOR_PROBE_IS_AD8495 1 #elif TEMP_SENSOR_PROBE == -3 @@ -1928,6 +1949,9 @@ #if HAS_ADC_TEST(CHAMBER) #define HAS_TEMP_ADC_CHAMBER 1 #endif +#if HAS_ADC_TEST(COOLER) + #define HAS_TEMP_ADC_COOLER 1 +#endif #define HAS_TEMP(N) ANY(HAS_TEMP_ADC_##N, TEMP_SENSOR_##N##_IS_MAX_TC, TEMP_SENSOR_##N##_IS_DUMMY) #if HAS_HOTEND && HAS_TEMP(0) @@ -1942,6 +1966,9 @@ #if HAS_TEMP(CHAMBER) #define HAS_TEMP_CHAMBER 1 #endif +#if HAS_TEMP(COOLER) + #define HAS_TEMP_COOLER 1 +#endif #if ENABLED(JOYSTICK) #if PIN_EXISTS(JOY_X) @@ -2001,7 +2028,10 @@ #if HAS_HEATED_BED || HAS_TEMP_CHAMBER #define BED_OR_CHAMBER 1 #endif -#if HAS_TEMP_HOTEND || BED_OR_CHAMBER || HAS_TEMP_PROBE +#if HAS_TEMP_COOLER && PIN_EXISTS(COOLER) + #define HAS_COOLER 1 +#endif +#if HAS_TEMP_HOTEND || BED_OR_CHAMBER || HAS_TEMP_PROBE || HAS_TEMP_COOLER #define HAS_TEMP_SENSOR 1 #endif @@ -2033,9 +2063,13 @@ #if BOTH(HAS_HEATED_CHAMBER, THERMAL_PROTECTION_CHAMBER) && WATCH_CHAMBER_TEMP_PERIOD > 0 #define WATCH_CHAMBER 1 #endif +#if BOTH(HAS_COOLER, THERMAL_PROTECTION_COOLER) && WATCH_COOLER_TEMP_PERIOD > 0 + #define WATCH_COOLER 1 +#endif #if (ENABLED(THERMAL_PROTECTION_HOTENDS) || !EXTRUDERS) \ && (ENABLED(THERMAL_PROTECTION_BED) || !HAS_HEATED_BED) \ - && (ENABLED(THERMAL_PROTECTION_CHAMBER) || !HAS_HEATED_CHAMBER) + && (ENABLED(THERMAL_PROTECTION_CHAMBER) || !HAS_HEATED_CHAMBER) \ + && (ENABLED(THERMAL_PROTECTION_COOLER) || !HAS_COOLER) #define THERMALLY_SAFE 1 #endif @@ -2067,8 +2101,11 @@ #if HAS_TEMP_CHAMBER && PIN_EXISTS(CHAMBER_AUTO_FAN) #define HAS_AUTO_CHAMBER_FAN 1 #endif +#if HAS_TEMP_COOLER && PIN_EXISTS(COOLER_AUTO_FAN) + #define HAS_AUTO_COOLER_FAN 1 +#endif -#if ANY(HAS_AUTO_FAN_0, HAS_AUTO_FAN_1, HAS_AUTO_FAN_2, HAS_AUTO_FAN_3, HAS_AUTO_FAN_4, HAS_AUTO_FAN_5, HAS_AUTO_FAN_6, HAS_AUTO_FAN_7, HAS_AUTO_CHAMBER_FAN) +#if ANY(HAS_AUTO_FAN_0, HAS_AUTO_FAN_1, HAS_AUTO_FAN_2, HAS_AUTO_FAN_3, HAS_AUTO_FAN_4, HAS_AUTO_FAN_5, HAS_AUTO_FAN_6, HAS_AUTO_FAN_7, HAS_AUTO_CHAMBER_FAN, HAS_AUTO_COOLER_FAN) #define HAS_AUTO_FAN 1 #endif #define _FANOVERLAP(A,B) (A##_AUTO_FAN_PIN == E##B##_AUTO_FAN_PIN) @@ -2364,7 +2401,20 @@ #define WRITE_HEATER_CHAMBER(v) WRITE(HEATER_CHAMBER_PIN, (v) ^ HEATER_CHAMBER_INVERTING) #endif -#if HAS_HOTEND || HAS_HEATED_BED || HAS_HEATED_CHAMBER +/** + * Laser Cooling requires settings + */ +#if HAS_COOLER + #ifndef MAX_COOLER_POWER + #define MAX_COOLER_POWER 255 + #endif + #ifndef COOLER_INVERTING + #define COOLER_INVERTING true + #endif + #define WRITE_HEATER_COOLER(v) WRITE(COOLER_PIN, (v) ^ COOLER_INVERTING) +#endif + +#if HAS_HOTEND || HAS_HEATED_BED || HAS_HEATED_CHAMBER || HAS_COOLER #define HAS_TEMPERATURE 1 #endif diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 4da25d0916..cd9ca84385 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -1876,6 +1876,10 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #error "TEMP_SENSOR_CHAMBER requires TEMP_CHAMBER_PIN." #endif +#if TEMP_SENSOR_COOLER && !(PIN_EXISTS(TEMP_COOLER) && ENABLED(LASER_FEATURE)) + #error "TEMP_SENSOR_COOLER requires LASER_FEATURE and TEMP_COOLER_PIN." +#endif + #if ENABLED(CHAMBER_FAN) && !(defined(CHAMBER_FAN_MODE) && WITHIN(CHAMBER_FAN_MODE, 0, 2)) #error "CHAMBER_FAN_MODE must be between 0 and 2." #endif diff --git a/Marlin/src/lcd/dogm/dogm_Statusscreen.h b/Marlin/src/lcd/dogm/dogm_Statusscreen.h index 61fee3e048..d0dc288613 100644 --- a/Marlin/src/lcd/dogm/dogm_Statusscreen.h +++ b/Marlin/src/lcd/dogm/dogm_Statusscreen.h @@ -78,6 +78,16 @@ #define STATUS_CUTTER_WIDTH 0 #endif +// +// Laser Cooler +// +#if !STATUS_COOLER_WIDTH && HAS_COOLER + #include "status/cooler.h" +#endif +#ifndef STATUS_COOLER_WIDTH + #define STATUS_COOLER_WIDTH 0 +#endif + // // Bed // @@ -498,6 +508,47 @@ #endif +// +// Cooler Bitmap Properties +// +#ifndef STATUS_COOLER_BYTEWIDTH + #define STATUS_COOLER_BYTEWIDTH BW(STATUS_COOLER_WIDTH) +#endif +#if STATUS_COOLER_WIDTH + + #ifndef STATUS_COOLER_X + #define STATUS_COOLER_X (LCD_PIXEL_WIDTH - (STATUS_COOLER_BYTEWIDTH + STATUS_FAN_BYTEWIDTH + STATUS_CUTTER_BYTEWIDTH) * 8) + #endif + + #ifndef STATUS_COOLER_HEIGHT + #ifdef STATUS_COOLER_ANIM + #define STATUS_COOLER_HEIGHT(S) ((S) ? sizeof(status_cooler_on_bmp) / (STATUS_COOLER_BYTEWIDTH) : sizeof(status_cooler_bmp) / (STATUS_COOLER_BYTEWIDTH)) + #else + #define STATUS_COOLER_HEIGHT(S) (sizeof(status_cooler_bmp) / (STATUS_COOLER_BYTEWIDTH)) + #endif + #endif + + #ifndef STATUS_COOLER_Y + #define STATUS_COOLER_Y(S) (18 - STATUS_COOLER_HEIGHT(S)) + #endif + + #ifndef STATUS_COOLER_TEXT_X + #define STATUS_COOLER_TEXT_X (STATUS_COOLER_X + 8) + #endif + + static_assert( + sizeof(status_cooler_bmp) == (STATUS_COOLER_BYTEWIDTH) * (STATUS_COOLER_HEIGHT(0)), + "Status cooler bitmap (status_cooler_bmp) dimensions don't match data." + ); + #ifdef STATUS_COOLER_ANIM + static_assert( + sizeof(status_cooler_on_bmp) == (STATUS_COOLER_BYTEWIDTH) * (STATUS_COOLER_HEIGHT(1)), + "Status cooler bitmap (status_cooler_on_bmp) dimensions don't match data." + ); + #endif + +#endif + // // Bed Bitmap Properties // @@ -585,6 +636,10 @@ #if HAS_CUTTER && !DO_DRAW_BED #define DO_DRAW_CUTTER 1 #endif +#if HAS_COOLER + #define DO_DRAW_COOLER 1 +#endif + #if HAS_TEMP_CHAMBER && STATUS_CHAMBER_WIDTH && HOTENDS <= 4 #define DO_DRAW_CHAMBER 1 #endif @@ -603,6 +658,9 @@ #if BOTH(DO_DRAW_CUTTER, STATUS_CUTTER_ANIM) #define ANIM_CUTTER 1 #endif +#if BOTH(DO_DRAW_COOLER, STATUS_COOLER_ANIM) + #define ANIM_COOLER 1 +#endif #if ANIM_HOTEND || ANIM_BED || ANIM_CHAMBER || ANIM_CUTTER #define ANIM_HBCC 1 #endif diff --git a/Marlin/src/lcd/dogm/status/cooler.h b/Marlin/src/lcd/dogm/status/cooler.h new file mode 100644 index 0000000000..4e59e237a2 --- /dev/null +++ b/Marlin/src/lcd/dogm/status/cooler.h @@ -0,0 +1,70 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2020 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 + +// +// lcd/dogm/status/cooler.h - Status Screen Laser Cooler bitmaps +// + +#define STATUS_COOLER_WIDTH 16 + +#ifdef STATUS_COOLER_ANIM + + const unsigned char status_cooler_on_bmp[] PROGMEM = { + B00010000,B00001000, + B00010010,B01001001, + B01010100,B00101010, + B00111000,B00011100, + B11111110,B11111111, + B00111000,B00011100, + B01010100,B00101010, + B10010000,B10001001, + B00010000,B10000000, + B00000100,B10010000, + B00000010,B10100000, + B00000001,B11000000, + B00011111,B11111100, + B00000001,B11000000, + B00000010,B10100000, + B00000100,B10010000 + }; + +#endif + +const unsigned char status_cooler_bmp[] PROGMEM = { + B00010000,B00001000, + B00010010,B01001001, + B01010100,B00101010, + B00101000,B00010100, + B11000111,B01100011, + B00101000,B00010100, + B01010100,B00101010, + B10010000,B10001001, + B00010000,B10000000, + B00000100,B10010000, + B00000010,B10100000, + B00000001,B01000000, + B00011110,B00111100, + B00000001,B01000000, + B00000010,B10100000, + B00000100,B10010000 +}; diff --git a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp index 8ae6ab6627..892ab5218b 100644 --- a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp +++ b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp @@ -86,6 +86,7 @@ HEATBIT_HOTEND, HEATBIT_BED = HOTENDS, HEATBIT_CHAMBER, + HEATBIT_COOLER, HEATBIT_CUTTER }; IF<(HEATBIT_CUTTER > 7), uint16_t, uint8_t>::type heat_bits; @@ -111,6 +112,11 @@ #else #define CUTTER_ALT() false #endif +#if ANIM_COOLER + #define COOLER_ALT(N) TEST(heat_bits, HEATBIT_COOLER) +#else + #define COOLER_ALT() false +#endif #if DO_DRAW_HOTENDS #define MAX_HOTEND_DRAW _MIN(HOTENDS, ((LCD_PIXEL_WIDTH - (STATUS_LOGO_BYTEWIDTH + STATUS_FAN_BYTEWIDTH) * 8) / (STATUS_HEATERS_XSPACE))) @@ -361,18 +367,22 @@ FORCE_INLINE void _draw_centered_temp(const int16_t temp, const uint8_t tx, cons #endif // DO_DRAW_BED #if DO_DRAW_CHAMBER - FORCE_INLINE void _draw_chamber_status() { #if HAS_HEATED_CHAMBER if (PAGE_UNDER(7)) _draw_centered_temp(thermalManager.degTargetChamber() + 0.5f, STATUS_CHAMBER_TEXT_X, 7); #endif - if (PAGE_CONTAINS(28 - INFO_FONT_ASCENT, 28 - 1)) _draw_centered_temp(thermalManager.degChamber() + 0.5f, STATUS_CHAMBER_TEXT_X, 28); } +#endif -#endif // DO_DRAW_CHAMBER +#if DO_DRAW_COOLER + FORCE_INLINE void _draw_cooler_status() { + if (PAGE_CONTAINS(28 - INFO_FONT_ASCENT, 28 - 1)) + _draw_centered_temp(thermalManager.degCooler(), STATUS_COOLER_TEXT_X, 28); + } +#endif // // Before homing, blink '123' <-> '???'. @@ -447,6 +457,9 @@ void MarlinUI::draw_status_screen() { #if DO_DRAW_CHAMBER && HAS_HEATED_CHAMBER if (thermalManager.isHeatingChamber()) SBI(new_bits, HEATBIT_CHAMBER); #endif + #if DO_DRAW_COOLER && HAS_COOLER + if (thermalManager.isLaserCooling()) SBI(new_bits, HEATBIT_COOLER); + #endif if (TERN0(ANIM_CUTTER, cutter.enabled())) SBI(new_bits, HEATBIT_CUTTER); heat_bits = new_bits; #endif @@ -631,12 +644,28 @@ void MarlinUI::draw_status_screen() { } #endif + // Laser Cooler + #if DO_DRAW_COOLER + #if ANIM_COOLER + #define COOLER_BITMAP(S) ((S) ? status_cooler_bmp : status_cooler_on_bmp) + #else + #define COOLER_BITMAP(S) status_cooler_bmp + #endif + const uint8_t coolery = STATUS_COOLER_Y(COOLER_ALT()), + coolerh = STATUS_COOLER_HEIGHT(COOLER_ALT()); + if (PAGE_CONTAINS(coolery, coolery + coolerh - 1)) + u8g.drawBitmapP(STATUS_COOLER_X, coolery, STATUS_COOLER_BYTEWIDTH, coolerh, COOLER_BITMAP(COOLER_ALT())); + #endif + // Heated Bed TERN_(DO_DRAW_BED, _draw_bed_status(blink)); // Heated Chamber TERN_(DO_DRAW_CHAMBER, _draw_chamber_status()); + // Cooler + TERN_(DO_DRAW_COOLER, _draw_cooler_status()); + // Fan, if a bitmap was provided #if DO_DRAW_FAN if (PAGE_CONTAINS(STATUS_FAN_TEXT_Y - INFO_FONT_ASCENT, STATUS_FAN_TEXT_Y - 1)) { diff --git a/Marlin/src/lcd/extui/ui_api.cpp b/Marlin/src/lcd/extui/ui_api.cpp index 7c178a0339..c5c35321ca 100644 --- a/Marlin/src/lcd/extui/ui_api.cpp +++ b/Marlin/src/lcd/extui/ui_api.cpp @@ -176,6 +176,7 @@ namespace ExtUI { case BED: thermalManager.reset_bed_idle_timer(); return; #endif TERN_(HAS_HEATED_CHAMBER, case CHAMBER: return); // Chamber has no idle timer + TERN_(HAS_COOLER, case COOLER: return); // Cooler has no idle timer default: TERN_(HAS_HOTEND, thermalManager.reset_hotend_idle_timer(heater - H0)); break; @@ -904,22 +905,23 @@ namespace ExtUI { value *= TOUCH_UI_LCD_TEMP_SCALING; #endif enableHeater(heater); - #if HAS_HEATED_CHAMBER - if (heater == CHAMBER) - thermalManager.setTargetChamber(LROUND(constrain(value, 0, CHAMBER_MAXTEMP - 10))); - else - #endif - #if HAS_HEATED_BED - if (heater == BED) - thermalManager.setTargetBed(LROUND(constrain(value, 0, BED_MAX_TARGET))); - else - #endif - { + switch (heater) { + #if HAS_HEATED_CHAMBER + case CHAMBER: thermalManager.setTargetChamber(LROUND(constrain(value, 0, CHAMBER_MAXTEMP - 10))); break; + #endif + #if HAS_COOLER + case COOLER: thermalManager.setTargetCooler(LROUND(constrain(value, 0, COOLER_MAXTEMP))); break; + #endif + #if HAS_HEATED_BED + case BED: thermalManager.setTargetBed(LROUND(constrain(value, 0, BED_MAX_TARGET))); break; + #endif + default: { #if HAS_HOTEND const int16_t e = heater - H0; thermalManager.setTargetHotend(LROUND(constrain(value, 0, thermalManager.heater_maxtemp[e] - HOTEND_OVERSHOOT)), e); #endif - } + } break; + } } void setTargetTemp_celsius(float value, const extruder_t extruder) { diff --git a/Marlin/src/lcd/extui/ui_api.h b/Marlin/src/lcd/extui/ui_api.h index 4214ba5821..a6cfb82b88 100644 --- a/Marlin/src/lcd/extui/ui_api.h +++ b/Marlin/src/lcd/extui/ui_api.h @@ -55,7 +55,7 @@ namespace ExtUI { enum axis_t : uint8_t { X, Y, Z, X2, Y2, Z2, Z3, Z4 }; enum extruder_t : uint8_t { E0, E1, E2, E3, E4, E5, E6, E7 }; - enum heater_t : uint8_t { H0, H1, H2, H3, H4, H5, BED, CHAMBER }; + enum heater_t : uint8_t { H0, H1, H2, H3, H4, H5, BED, CHAMBER, COOLER }; enum fan_t : uint8_t { FAN0, FAN1, FAN2, FAN3, FAN4, FAN5, FAN6, FAN7 }; enum result_t : uint8_t { PID_BAD_EXTRUDER_NUM, PID_TEMP_TOO_HIGH, PID_TUNING_TIMEOUT, PID_DONE }; diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index b17e81d831..72f262c687 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -276,6 +276,9 @@ namespace Language_en { PROGMEM Language_Str MSG_NOZZLE_STANDBY = _UxGT("Nozzle Standby"); PROGMEM Language_Str MSG_BED = _UxGT("Bed"); PROGMEM Language_Str MSG_CHAMBER = _UxGT("Enclosure"); + PROGMEM Language_Str MSG_COOLER = _UxGT("Laser Coolant"); + PROGMEM Language_Str MSG_COOLER_TOGGLE = _UxGT("Toggle Cooler"); + PROGMEM Language_Str MSG_LASER = _UxGT("Laser"); PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Fan Speed"); PROGMEM Language_Str MSG_FAN_SPEED_N = _UxGT("Fan Speed ~"); PROGMEM Language_Str MSG_STORED_FAN_N = _UxGT("Stored Fan ~"); @@ -482,6 +485,8 @@ namespace Language_en { PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("THERMAL RUNAWAY"); PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("BED THERMAL RUNAWAY"); PROGMEM Language_Str MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("CHAMBER T. RUNAWAY"); + PROGMEM Language_Str MSG_THERMAL_RUNAWAY_COOLER = _UxGT("Cooler Runaway"); + PROGMEM Language_Str MSG_COOLING_FAILED = _UxGT("Cooling Failed"); PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Err: MAXTEMP"); PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Err: MINTEMP"); PROGMEM Language_Str MSG_HALTED = _UxGT("PRINTER HALTED"); @@ -497,6 +502,7 @@ namespace Language_en { PROGMEM Language_Str MSG_PROBE_COOLING = _UxGT("Probe Cooling..."); PROGMEM Language_Str MSG_CHAMBER_HEATING = _UxGT("Chamber Heating..."); PROGMEM Language_Str MSG_CHAMBER_COOLING = _UxGT("Chamber Cooling..."); + PROGMEM Language_Str MSG_LASER_COOLING = _UxGT("Laser Cooling..."); PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Delta Calibration"); PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("Calibrate X"); PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Calibrate Y"); diff --git a/Marlin/src/lcd/menu/menu_info.cpp b/Marlin/src/lcd/menu/menu_info.cpp index a4cbc31d8b..d00909c7b3 100644 --- a/Marlin/src/lcd/menu/menu_info.cpp +++ b/Marlin/src/lcd/menu/menu_info.cpp @@ -195,6 +195,16 @@ void menu_info_thermistors() { STATIC_ITEM(TERN(WATCH_CHAMBER, MSG_INFO_RUNAWAY_ON, MSG_INFO_RUNAWAY_OFF), SS_LEFT); #endif + #if HAS_COOLER + #undef THERMISTOR_ID + #define THERMISTOR_ID TEMP_SENSOR_COOLER + #include "../thermistornames.h" + STATIC_ITEM_P(PSTR("COOL: " THERMISTOR_NAME), SS_INVERT); + PSTRING_ITEM(MSG_INFO_MIN_TEMP, STRINGIFY(COOLER_MINTEMP), SS_LEFT); + PSTRING_ITEM(MSG_INFO_MAX_TEMP, STRINGIFY(COOLER_MAXTEMP), SS_LEFT); + STATIC_ITEM(TERN(WATCH_COOLER, MSG_INFO_RUNAWAY_ON, MSG_INFO_RUNAWAY_OFF), SS_LEFT); + #endif + END_SCREEN(); } diff --git a/Marlin/src/lcd/menu/menu_temperature.cpp b/Marlin/src/lcd/menu/menu_temperature.cpp index f347efe6db..3a9906ddeb 100644 --- a/Marlin/src/lcd/menu/menu_temperature.cpp +++ b/Marlin/src/lcd/menu/menu_temperature.cpp @@ -35,6 +35,10 @@ #include "../../module/motion.h" #endif +#if HAS_COOLER + #include "../../feature/cooler.h" +#endif + #if ENABLED(SINGLENOZZLE_STANDBY_TEMP) #include "../../module/tool_change.h" #endif @@ -68,6 +72,10 @@ void Temperature::lcd_preheat(const int16_t e, const int8_t indh, const int8_t i #if HAS_HEATED_BED inline void _preheat_bed(const uint8_t m) { thermalManager.lcd_preheat(-1, -1, m); } #endif + #if HAS_COOLER + inline void _precool_laser(const uint8_t m, const uint8_t e) { thermalManager.lcd_preheat(e, m, -1); } + void do_precool_laser_m() { _precool_laser(editable.int8, thermalManager.temp_cooler.target); } + #endif #if HAS_TEMP_HOTEND && HAS_HEATED_BED inline void _preheat_both(const uint8_t m, const uint8_t e) { thermalManager.lcd_preheat(e, m, m); } @@ -143,6 +151,10 @@ void menu_temperature() { #endif #endif + #if HAS_COOLER + if (thermalManager.temp_cooler.target == 0) thermalManager.temp_cooler.target = COOLER_DEFAULT_TEMP; + #endif + START_MENU(); BACK_ITEM(MSG_MAIN); @@ -176,6 +188,15 @@ void menu_temperature() { EDIT_ITEM_FAST(int3, MSG_CHAMBER, &thermalManager.temp_chamber.target, 0, CHAMBER_MAXTEMP - 10, thermalManager.start_watching_chamber); #endif + // + // Cooler: + // + #if HAS_COOLER + editable.state = cooler.is_enabled(); + EDIT_ITEM(bool, MSG_COOLER(TOGGLE), &cooler.state, []{ if (editable.state) cooler.disable(); else cooler.enable(); }); + EDIT_ITEM_FAST(int3, MSG_COOLER, &thermalManager.temp_cooler.target, COOLER_MINTEMP + 2, COOLER_MAXTEMP - 2, thermalManager.start_watching_cooler); + #endif + // // Fan Speed: // @@ -232,7 +253,7 @@ void menu_temperature() { editable.int8 = m; #if HOTENDS > 1 || HAS_HEATED_BED SUBMENU_S(ui.get_preheat_label(m), MSG_PREHEAT_M, menu_preheat_m); - #else + #elif HAS_HOTEND ACTION_ITEM_S(ui.get_preheat_label(m), MSG_PREHEAT_M, do_preheat_end_m); #endif } diff --git a/Marlin/src/lcd/tft/tft_color.h b/Marlin/src/lcd/tft/tft_color.h index a72a079f6e..d060d3209d 100644 --- a/Marlin/src/lcd/tft/tft_color.h +++ b/Marlin/src/lcd/tft/tft_color.h @@ -94,6 +94,9 @@ #ifndef COLOR_CHAMBER #define COLOR_CHAMBER COLOR_DARK_ORANGE #endif +#ifndef COLOR_COOLER + #define COLOR_COOLER COLOR_DARK_ORANGE +#endif #ifndef COLOR_FAN #define COLOR_FAN COLOR_AQUA #endif diff --git a/Marlin/src/lcd/tft/touch.cpp b/Marlin/src/lcd/tft/touch.cpp index 7a45851a5d..29dd088c99 100644 --- a/Marlin/src/lcd/tft/touch.cpp +++ b/Marlin/src/lcd/tft/touch.cpp @@ -202,6 +202,12 @@ void Touch::touch(touch_control_t *control) { MenuItem_int3::action((const char *)GET_TEXT_F(MSG_CHAMBER), &thermalManager.temp_chamber.target, 0, CHAMBER_MAXTEMP - 10, thermalManager.start_watching_chamber); } #endif + #if HAS_COOLER + else if (heater == H_COOLER) { + MenuItem_int3::action((const char *)GET_TEXT_F(MSG_COOLER), &thermalManager.temp_cooler.target, 0, COOLER_MAXTEMP - 8, thermalManager.start_watching_cooler); + } + #endif + break; case FAN: ui.clear_lcd(); diff --git a/Marlin/src/lcd/tft/ui_320x240.cpp b/Marlin/src/lcd/tft/ui_320x240.cpp index eadd09ef27..fb82188645 100644 --- a/Marlin/src/lcd/tft/ui_320x240.cpp +++ b/Marlin/src/lcd/tft/ui_320x240.cpp @@ -136,6 +136,12 @@ void draw_heater_status(uint16_t x, uint16_t y, const int8_t Heater) { #endif } #endif + #if HAS_TEMP_COOLER + else if (Heater == H_COOLER) { + currentTemperature = thermalManager.degCooler(); + targetTemperature = TERN(HAS_COOLER, thermalManager.degTargetCooler(), ABSOLUTE_ZERO); + } + #endif else return; TERN_(TOUCH_SCREEN, if (targetTemperature >= 0) touch.add_control(HEATER, x, y, 64, 100, Heater)); @@ -159,6 +165,13 @@ void draw_heater_status(uint16_t x, uint16_t y, const int8_t Heater) { image = targetTemperature > 0 ? imgChamberHeated : imgChamber; } #endif + #if HAS_TEMP_COOLER + else if (Heater == H_COOLER) { + if (currentTemperature <= 26) Color = COLOR_COLD; + if (currentTemperature > 26) Color = COLOR_RED; + image = targetTemperature > 26 ? imgCoolerHot : imgCooler; + } + #endif tft.add_image(0, 18, image, Color); diff --git a/Marlin/src/lcd/tft/ui_480x320.cpp b/Marlin/src/lcd/tft/ui_480x320.cpp index 5000aedc39..164785a229 100644 --- a/Marlin/src/lcd/tft/ui_480x320.cpp +++ b/Marlin/src/lcd/tft/ui_480x320.cpp @@ -136,6 +136,12 @@ void draw_heater_status(uint16_t x, uint16_t y, const int8_t Heater) { #endif } #endif + #if HAS_TEMP_COOLER + else if (Heater == H_COOLER) { + currentTemperature = thermalManager.degCooler(); + targetTemperature = TERN(HAS_COOLER, thermalManager.degTargetCooler(), ABSOLUTE_ZERO); + } + #endif else return; TERN_(TOUCH_SCREEN, if (targetTemperature >= 0) touch.add_control(HEATER, x, y, 80, 120, Heater)); diff --git a/Marlin/src/lcd/tft/ui_common.h b/Marlin/src/lcd/tft/ui_common.h index d40e471171..d43de1d43b 100644 --- a/Marlin/src/lcd/tft/ui_common.h +++ b/Marlin/src/lcd/tft/ui_common.h @@ -62,6 +62,10 @@ void menu_item(const uint8_t row, bool sel = false); #define ITEM_CHAMBER 2 #define ITEM_FAN 3 #define ITEMS_COUNT 4 +#elif HAS_TEMP_COOLER + #define ITEM_COOLER 0 + #define ITEM_FAN 1 + #define ITEMS_COUNT 2 #elif HOTENDS > 1 #define ITEM_E0 0 #define ITEM_E1 1 diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index be98972b77..a1d5745de4 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -35,6 +35,11 @@ #include "endstops.h" #include "planner.h" +#if HAS_COOLER + #include "../feature/cooler.h" + #include "../feature/spindle_laser.h" +#endif + #if ENABLED(EMERGENCY_PARSER) #include "motion.h" #endif @@ -232,8 +237,13 @@ const char str_t_thermal_runaway[] PROGMEM = STR_T_THERMAL_RUNAWAY, #else #define _CHAMBER_PSTR(h) #endif +#if HAS_COOLER + #define _COOLER_PSTR(h) (h) == H_COOLER ? GET_TEXT(MSG_COOLER) : +#else + #define _COOLER_PSTR(h) +#endif #define _E_PSTR(h,N) ((HOTENDS) > N && (h) == N) ? PSTR(LCD_STR_E##N) : -#define HEATER_PSTR(h) _BED_PSTR(h) _CHAMBER_PSTR(h) _E_PSTR(h,1) _E_PSTR(h,2) _E_PSTR(h,3) _E_PSTR(h,4) _E_PSTR(h,5) PSTR(LCD_STR_E0) +#define HEATER_PSTR(h) _BED_PSTR(h) _CHAMBER_PSTR(h) _COOLER_PSTR(h) _E_PSTR(h,1) _E_PSTR(h,2) _E_PSTR(h,3) _E_PSTR(h,4) _E_PSTR(h,5) PSTR(LCD_STR_E0) // public: @@ -254,6 +264,9 @@ const char str_t_thermal_runaway[] PROGMEM = STR_T_THERMAL_RUNAWAY, uint8_t Temperature::chamberfan_speed; // = 0 #endif +#if ENABLED(AUTO_POWER_COOLER_FAN) + uint8_t Temperature::coolerfan_speed; // = 0 +#endif #if HAS_FAN uint8_t Temperature::fan_speed[FAN_COUNT]; // = { 0 } @@ -355,14 +368,11 @@ const char str_t_thermal_runaway[] PROGMEM = STR_T_THERMAL_RUNAWAY, #endif TERN_(WATCH_BED, bed_watch_t Temperature::watch_bed); // = { 0 } IF_DISABLED(PIDTEMPBED, millis_t Temperature::next_bed_check_ms); -#endif // HAS_HEATED_BED +#endif #if HAS_TEMP_CHAMBER chamber_info_t Temperature::temp_chamber; // = { 0 } #if HAS_HEATED_CHAMBER - int16_t fan_chamber_pwm; - bool flag_chamber_off; - bool flag_chamber_excess_heat = false; millis_t next_cool_check_ms_2 = 0; float old_temp = 9999; #ifdef CHAMBER_MINTEMP @@ -373,8 +383,27 @@ const char str_t_thermal_runaway[] PROGMEM = STR_T_THERMAL_RUNAWAY, #endif TERN_(WATCH_CHAMBER, chamber_watch_t Temperature::watch_chamber{0}); IF_DISABLED(PIDTEMPCHAMBER, millis_t Temperature::next_chamber_check_ms); - #endif // HAS_HEATED_CHAMBER -#endif // HAS_TEMP_CHAMBER + #endif +#endif + +#if HAS_TEMP_COOLER + cooler_info_t Temperature::temp_cooler; // = { 0 } + #if HAS_COOLER + bool flag_cooler_state; + //bool flag_cooler_excess = false; + float previous_temp = 9999; + #ifdef COOLER_MINTEMP + int16_t Temperature::mintemp_raw_COOLER = TEMP_SENSOR_COOLER_RAW_LO_TEMP; + #endif + #ifdef COOLER_MAXTEMP + int16_t Temperature::maxtemp_raw_COOLER = TEMP_SENSOR_COOLER_RAW_HI_TEMP; + #endif + #if WATCH_COOLER + cooler_watch_t Temperature::watch_cooler{0}; + #endif + millis_t Temperature::next_cooler_check_ms, Temperature::cooler_fan_flush_ms; + #endif +#endif #if HAS_TEMP_PROBE probe_info_t Temperature::temp_probe; // = { 0 } @@ -744,6 +773,9 @@ int16_t Temperature::getHeaterPower(const heater_id_t heater_id) { #if HAS_HEATED_CHAMBER case H_CHAMBER: return temp_chamber.soft_pwm_amount; #endif + #if HAS_COOLER + case H_COOLER: return temp_cooler.soft_pwm_amount; + #endif default: return TERN0(HAS_HOTEND, temp_hotend[heater_id].soft_pwm_amount); } @@ -779,6 +811,11 @@ int16_t Temperature::getHeaterPower(const heater_id_t heater_id) { SBI(fanState, pgm_read_byte(&fanBit[CHAMBER_FAN_INDEX])); #endif + #if HAS_AUTO_COOLER_FAN + if (temp_cooler.celsius >= COOLER_AUTO_FAN_TEMPERATURE) + SBI(fanState, pgm_read_byte(&fanBit[COOLER_FAN_INDEX])); + #endif + #define _UPDATE_AUTO_FAN(P,D,A) do{ \ if (PWM_PIN(P##_AUTO_FAN_PIN) && A < 255) \ analogWrite(pin_t(P##_AUTO_FAN_PIN), D ? A : 0); \ @@ -874,6 +911,8 @@ void Temperature::_temp_error(const heater_id_t heater_id, PGM_P const serial_ms SERIAL_ECHO(heater_id); else if (TERN0(HAS_HEATED_CHAMBER, heater_id == H_CHAMBER)) SERIAL_ECHOPGM(STR_HEATER_CHAMBER); + else if (TERN0(HAS_COOLER, heater_id == H_COOLER)) + SERIAL_ECHOPGM(STR_COOLER); else SERIAL_ECHOPGM(STR_HEATER_BED); SERIAL_EOL(); @@ -1347,11 +1386,18 @@ void Temperature::manage_heater() { } #endif + #if EITHER(CHAMBER_FAN, CHAMBER_VENT) || DISABLED(PIDTEMPCHAMBER) + static bool flag_chamber_excess_heat; // = false; + #endif + #if EITHER(CHAMBER_FAN, CHAMBER_VENT) + static bool flag_chamber_off; // = false + if (temp_chamber.target > CHAMBER_MINTEMP) { flag_chamber_off = false; #if ENABLED(CHAMBER_FAN) + int16_t fan_chamber_pwm; #if CHAMBER_FAN_MODE == 0 fan_chamber_pwm = CHAMBER_FAN_BASE; #elif CHAMBER_FAN_MODE == 1 @@ -1376,7 +1422,8 @@ void Temperature::manage_heater() { // Open vent after MIN_COOLING_SLOPE_TIME_CHAMBER_VENT seconds if the // temperature didn't drop at least MIN_COOLING_SLOPE_DEG_CHAMBER_VENT if (next_cool_check_ms_2 == 0 || ELAPSED(ms, next_cool_check_ms_2)) { - if (old_temp - temp_chamber.celsius < float(MIN_COOLING_SLOPE_DEG_CHAMBER_VENT)) flag_chamber_excess_heat = true; //the bed is heating the chamber too much + if (temp_chamber.celsius - old_temp > MIN_COOLING_SLOPE_DEG_CHAMBER_VENT) + flag_chamber_excess_heat = true; // the bed is heating the chamber too much next_cool_check_ms_2 = ms + SEC_TO_MS(MIN_COOLING_SLOPE_TIME_CHAMBER_VENT); old_temp = temp_chamber.celsius; } @@ -1385,9 +1432,8 @@ void Temperature::manage_heater() { next_cool_check_ms_2 = 0; old_temp = 9999; } - if (flag_chamber_excess_heat && (temp_chamber.celsius - temp_chamber.target <= -LOW_EXCESS_HEAT_LIMIT) ) { + if (flag_chamber_excess_heat && (temp_chamber.target - temp_chamber.celsius >= LOW_EXCESS_HEAT_LIMIT)) flag_chamber_excess_heat = false; - } #endif } else if (!flag_chamber_off) { @@ -1402,17 +1448,14 @@ void Temperature::manage_heater() { } #endif - - - #if ENABLED(PIDTEMPCHAMBER) // PIDTEMPCHAMBER doens't support a CHAMBER_VENT yet. temp_chamber.soft_pwm_amount = WITHIN(temp_chamber.celsius, CHAMBER_MINTEMP, CHAMBER_MAXTEMP) ? (int)get_pid_output_chamber() >> 1 : 0; #else - if (ELAPSED(ms, next_chamber_check_ms)) { - next_chamber_check_ms = ms + CHAMBER_CHECK_INTERVAL; + if (ELAPSED(ms, next_chamber_check_ms)) { + next_chamber_check_ms = ms + CHAMBER_CHECK_INTERVAL; - if (WITHIN(temp_chamber.celsius, CHAMBER_MINTEMP, CHAMBER_MAXTEMP)) { + if (WITHIN(temp_chamber.celsius, CHAMBER_MINTEMP, CHAMBER_MAXTEMP)) { if (flag_chamber_excess_heat) { temp_chamber.soft_pwm_amount = 0; #if ENABLED(CHAMBER_VENT) @@ -1437,7 +1480,6 @@ void Temperature::manage_heater() { temp_chamber.soft_pwm_amount = 0; WRITE_HEATER_CHAMBER(LOW); } - } #if ENABLED(THERMAL_PROTECTION_CHAMBER) tr_state_machine[RUNAWAY_IND_CHAMBER].run(temp_chamber.celsius, temp_chamber.target, H_CHAMBER, THERMAL_PROTECTION_CHAMBER_PERIOD, THERMAL_PROTECTION_CHAMBER_HYSTERESIS); @@ -1446,6 +1488,66 @@ void Temperature::manage_heater() { #endif // HAS_HEATED_CHAMBER + #if HAS_COOLER + + #ifndef COOLER_CHECK_INTERVAL + #define COOLER_CHECK_INTERVAL 2000UL + #endif + + #if ENABLED(THERMAL_PROTECTION_COOLER) + if (degCooler() > COOLER_MAXTEMP) max_temp_error(H_COOLER); + #endif + + #if WATCH_COOLER + // Make sure temperature is decreasing + if (watch_cooler.elapsed(ms)) { // Time to check the cooler? + if (degCooler() > watch_cooler.target) // Failed to decrease enough? + _temp_error(H_COOLER, GET_TEXT(MSG_COOLING_FAILED), GET_TEXT(MSG_COOLING_FAILED)); + else + start_watching_cooler(); // Start again if the target is still far off + } + #endif + + static bool flag_cooler_state; // = false + + if (cooler.is_enabled()) { + flag_cooler_state = true; // used to allow M106 fan control when cooler is disabled + if (temp_cooler.target == 0) temp_cooler.target = COOLER_MINTEMP; + if (ELAPSED(ms, next_cooler_check_ms)) { + next_cooler_check_ms = ms + COOLER_CHECK_INTERVAL; + if (temp_cooler.celsius > temp_cooler.target) { + temp_cooler.soft_pwm_amount = temp_cooler.celsius > temp_cooler.target ? MAX_COOLER_POWER : 0; + flag_cooler_state = temp_cooler.soft_pwm_amount > 0 ? true : false; // used to allow M106 fan control when cooler is disabled + #if ENABLED(COOLER_FAN) + int16_t fan_cooler_pwm = (COOLER_FAN_BASE) + (COOLER_FAN_FACTOR) * ABS(temp_cooler.celsius - temp_cooler.target); + NOMORE(fan_cooler_pwm, 255); + set_fan_speed(COOLER_FAN_INDEX, fan_cooler_pwm); // Set cooler fan pwm + cooler_fan_flush_ms = ms + 5000; + #endif + } + else { + temp_cooler.soft_pwm_amount = 0; + #if ENABLED(COOLER_FAN) + set_fan_speed(COOLER_FAN_INDEX, temp_cooler.celsius > temp_cooler.target - 2 ? COOLER_FAN_BASE : 0); + #endif + WRITE_HEATER_COOLER(LOW); + } + } + } + else { + temp_cooler.soft_pwm_amount = 0; + if (flag_cooler_state) { + flag_cooler_state = false; + thermalManager.set_fan_speed(COOLER_FAN_INDEX, 0); + } + WRITE_HEATER_COOLER(LOW); + } + + #if ENABLED(THERMAL_PROTECTION_COOLER) + tr_state_machine[RUNAWAY_IND_COOLER].run(temp_cooler.celsius, temp_cooler.target, H_COOLER, THERMAL_PROTECTION_COOLER_PERIOD, THERMAL_PROTECTION_COOLER_HYSTERESIS); + #endif + #endif // HAS_COOLER + UNUSED(ms); } @@ -1510,6 +1612,9 @@ void Temperature::manage_heater() { #if TEMP_SENSOR_CHAMBER_IS_CUSTOM { true, 0, 0, CHAMBER_PULLUP_RESISTOR_OHMS, CHAMBER_RESISTANCE_25C_OHMS, 0, 0, CHAMBER_BETA, 0 } #endif + #if TEMP_SENSOR_COOLER_IS_CUSTOM + { true, 0, 0, COOLER_PULLUP_RESISTOR_OHMS, COOLER_RESISTANCE_25C_OHMS, 0, 0, COOLER_BETA, 0 } + #endif #if TEMP_SENSOR_PROBE_IS_CUSTOM { true, 0, 0, PROBE_PULLUP_RESISTOR_OHMS, PROBE_RESISTANCE_25C_OHMS, 0, 0, PROBE_BETA, 0 } #endif @@ -1543,6 +1648,7 @@ void Temperature::manage_heater() { TERN_(TEMP_SENSOR_7_IS_CUSTOM, t_index == CTI_HOTEND_7 ? PSTR("HOTEND 7") :) TERN_(TEMP_SENSOR_BED_IS_CUSTOM, t_index == CTI_BED ? PSTR("BED") :) TERN_(TEMP_SENSOR_CHAMBER_IS_CUSTOM, t_index == CTI_CHAMBER ? PSTR("CHAMBER") :) + TERN_(TEMP_SENSOR_COOLER_IS_CUSTOM, t_index == CTI_COOLER ? PSTR("COOLER") :) TERN_(TEMP_SENSOR_PROBE_IS_CUSTOM, t_index == CTI_PROBE ? PSTR("PROBE") :) nullptr ); @@ -1706,7 +1812,6 @@ void Temperature::manage_heater() { #endif // HAS_HOTEND #if HAS_HEATED_BED - // Derived from RepRap FiveD extruder::getTemperature() // For bed temperature measurement. float Temperature::analog_to_celsius_bed(const int raw) { #if TEMP_SENSOR_BED_IS_CUSTOM @@ -1725,7 +1830,6 @@ void Temperature::manage_heater() { #endif // HAS_HEATED_BED #if HAS_TEMP_CHAMBER - // Derived from RepRap FiveD extruder::getTemperature() // For chamber temperature measurement. float Temperature::analog_to_celsius_chamber(const int raw) { #if TEMP_SENSOR_CHAMBER_IS_CUSTOM @@ -1743,8 +1847,25 @@ void Temperature::manage_heater() { } #endif // HAS_TEMP_CHAMBER +#if HAS_TEMP_COOLER + // For cooler temperature measurement. + float Temperature::analog_to_celsius_cooler(const int raw) { + #if TEMP_SENSOR_COOLER_IS_CUSTOM + return user_thermistor_to_deg_c(CTI_COOLER, raw); + #elif TEMP_SENSOR_COOLER_IS_THERMISTOR + SCAN_THERMISTOR_TABLE(TEMPTABLE_COOLER, TEMPTABLE_COOLER_LEN); + #elif TEMP_SENSOR_COOLER_IS_AD595 + return TEMP_AD595(raw); + #elif TEMP_SENSOR_COOLER_IS_AD8495 + return TEMP_AD8495(raw); + #else + UNUSED(raw); + return 0; + #endif + } +#endif // HAS_TEMP_COOLER + #if HAS_TEMP_PROBE - // Derived from RepRap FiveD extruder::getTemperature() // For probe temperature measurement. float Temperature::analog_to_celsius_probe(const int raw) { #if TEMP_SENSOR_PROBE_IS_CUSTOM @@ -1776,6 +1897,7 @@ void Temperature::updateTemperaturesFromRawValues() { #endif TERN_(HAS_HEATED_BED, temp_bed.celsius = analog_to_celsius_bed(temp_bed.raw)); TERN_(HAS_TEMP_CHAMBER, temp_chamber.celsius = analog_to_celsius_chamber(temp_chamber.raw)); + TERN_(HAS_TEMP_COOLER, temp_cooler.celsius = analog_to_celsius_cooler(temp_cooler.raw)); TERN_(HAS_TEMP_PROBE, temp_probe.celsius = analog_to_celsius_probe(temp_probe.raw)); TERN_(TEMP_SENSOR_1_AS_REDUNDANT, redundant_temperature = analog_to_celsius_hotend(redundant_temperature_raw, 1)); TERN_(FILAMENT_WIDTH_SENSOR, filwidth.update_measured_mm()); @@ -1927,6 +2049,10 @@ void Temperature::init() { OUT_WRITE(HEATER_CHAMBER_PIN, HEATER_CHAMBER_INVERTING); #endif + #if HAS_COOLER + OUT_WRITE(COOLER_PIN, COOLER_INVERTING); + #endif + #if HAS_FAN0 INIT_FAN_PIN(FAN_PIN); #endif @@ -2001,6 +2127,9 @@ void Temperature::init() { #if HAS_TEMP_ADC_CHAMBER HAL_ANALOG_SELECT(TEMP_CHAMBER_PIN); #endif + #if HAS_TEMP_ADC_COOLER + HAL_ANALOG_SELECT(TEMP_COOLER_PIN); + #endif #if HAS_TEMP_ADC_PROBE HAL_ANALOG_SELECT(TEMP_PROBE_PIN); #endif @@ -2137,6 +2266,15 @@ void Temperature::init() { #endif #endif + #if HAS_COOLER + #ifdef COOLER_MINTEMP + while (analog_to_celsius_cooler(mintemp_raw_COOLER) > COOLER_MINTEMP) mintemp_raw_COOLER += TEMPDIR(COOLER) * (OVERSAMPLENR); + #endif + #ifdef COOLER_MAXTEMP + while (analog_to_celsius_cooler(maxtemp_raw_COOLER) < COOLER_MAXTEMP) maxtemp_raw_COOLER -= TEMPDIR(COOLER) * (OVERSAMPLENR); + #endif + #endif + TERN_(PROBING_HEATERS_OFF, paused = false); } @@ -2174,6 +2312,17 @@ void Temperature::init() { } #endif +#if WATCH_COOLER + /** + * Start Cooling Sanity Check for cooler that is above + * its target temperature by a configurable margin. + * This is called when the temperature is set. (M143, M193) + */ + void Temperature::start_watching_cooler() { + watch_cooler.restart(degCooler(), degTargetCooler()); + } +#endif + #if HAS_THERMAL_PROTECTION Temperature::tr_state_machine_t Temperature::tr_state_machine[NR_HEATER_RUNAWAY]; // = { { TRInactive, 0 } }; @@ -2301,10 +2450,18 @@ void Temperature::disable_all_heaters() { temp_chamber.soft_pwm_amount = 0; WRITE_HEATER_CHAMBER(LOW); #endif + + #if HAS_COOLER + setTargetCooler(0); + temp_cooler.soft_pwm_amount = 0; + WRITE_HEATER_COOLER(LOW); + #endif } #if ENABLED(PRINTJOB_TIMER_AUTOSTART) + #include "printcounter.h" + bool Temperature::auto_job_over_threshold() { #if HAS_HOTEND HOTEND_LOOP() if (degTargetHotend(e) > (EXTRUDE_MINTEMP) / 2) return true; @@ -2564,6 +2721,7 @@ void Temperature::update_raw_temperatures() { TERN_(HAS_TEMP_ADC_BED, temp_bed.update()); TERN_(HAS_TEMP_ADC_CHAMBER, temp_chamber.update()); TERN_(HAS_TEMP_ADC_PROBE, temp_probe.update()); + TERN_(HAS_TEMP_ADC_COOLER, temp_cooler.update()); TERN_(HAS_JOY_ADC_X, joystick.x.update()); TERN_(HAS_JOY_ADC_Y, joystick.y.update()); @@ -2588,6 +2746,7 @@ void Temperature::readings_ready() { TERN_(HAS_HEATED_BED, temp_bed.reset()); TERN_(HAS_TEMP_CHAMBER, temp_chamber.reset()); TERN_(HAS_TEMP_PROBE, temp_probe.reset()); + TERN_(HAS_TEMP_COOLER, temp_cooler.reset()); TERN_(HAS_JOY_ADC_X, joystick.x.reset()); TERN_(HAS_JOY_ADC_Y, joystick.y.reset()); @@ -2650,6 +2809,18 @@ void Temperature::readings_ready() { if (CHAMBERCMP(temp_chamber.raw, maxtemp_raw_CHAMBER)) max_temp_error(H_CHAMBER); if (chamber_on && CHAMBERCMP(mintemp_raw_CHAMBER, temp_chamber.raw)) min_temp_error(H_CHAMBER); #endif + + #if BOTH(HAS_COOLER, THERMAL_PROTECTION_COOLER) + #if TEMPDIR(COOLER) < 0 + #define COOLERCMP(A,B) ((A)<(B)) + #else + #define COOLERCMP(A,B) ((A)>(B)) + #endif + if (cutter.unitPower > 0) { + if (COOLERCMP(temp_cooler.raw, maxtemp_raw_COOLER)) max_temp_error(H_COOLER); + } + if (COOLERCMP(mintemp_raw_COOLER, temp_cooler.raw)) min_temp_error(H_COOLER); + #endif } /** @@ -2735,11 +2906,15 @@ void Temperature::tick() { static SoftPWM soft_pwm_chamber; #endif + #if HAS_COOLER + static SoftPWM soft_pwm_cooler; + #endif + #define WRITE_FAN(n, v) WRITE(FAN##n##_PIN, (v) ^ FAN_INVERTING) #if DISABLED(SLOW_PWM_HEATERS) - #if ANY(HAS_HOTEND, HAS_HEATED_BED, HAS_HEATED_CHAMBER, FAN_SOFT_PWM) + #if ANY(HAS_HOTEND, HAS_HEATED_BED, HAS_HEATED_CHAMBER, HAS_COOLER, FAN_SOFT_PWM) constexpr uint8_t pwm_mask = TERN0(SOFT_PWM_DITHER, _BV(SOFT_PWM_SCALE) - 1); #define _PWM_MOD(N,S,T) do{ \ const bool on = S.add(pwm_mask, T.soft_pwm_amount); \ @@ -2766,6 +2941,10 @@ void Temperature::tick() { _PWM_MOD(CHAMBER,soft_pwm_chamber,temp_chamber); #endif + #if HAS_COOLER + _PWM_MOD(COOLER,soft_pwm_cooler,temp_cooler); + #endif + #if ENABLED(FAN_SOFT_PWM) #define _FAN_PWM(N) do{ \ uint8_t &spcf = soft_pwm_count_fan[N]; \ @@ -2813,6 +2992,10 @@ void Temperature::tick() { _PWM_LOW(CHAMBER, soft_pwm_chamber); #endif + #if HAS_COOLER + _PWM_LOW(COOLER, soft_pwm_cooler); + #endif + #if ENABLED(FAN_SOFT_PWM) #if HAS_FAN0 if (soft_pwm_count_fan[0] <= pwm_count_tmp) WRITE_FAN(0, LOW); @@ -2879,6 +3062,10 @@ void Temperature::tick() { _SLOW_PWM(CHAMBER, soft_pwm_chamber, temp_chamber); #endif + #if HAS_COOLER + _SLOW_PWM(COOLER, soft_pwm_cooler, temp_cooler); + #endif + } // slow_pwm_count == 0 #if HAS_HOTEND @@ -2894,6 +3081,10 @@ void Temperature::tick() { _PWM_OFF(CHAMBER, soft_pwm_chamber); #endif + #if HAS_COOLER + _PWM_OFF(COOLER, soft_pwm_cooler, temp_cooler); + #endif + #if ENABLED(FAN_SOFT_PWM) if (pwm_count_tmp >= 127) { pwm_count_tmp = 0; @@ -2973,6 +3164,7 @@ void Temperature::tick() { #endif TERN_(HAS_HEATED_BED, soft_pwm_bed.dec()); TERN_(HAS_HEATED_CHAMBER, soft_pwm_chamber.dec()); + TERN_(HAS_COOLER, soft_pwm_cooler.dec()); } #endif // SLOW_PWM_HEATERS @@ -3040,6 +3232,11 @@ void Temperature::tick() { case MeasureTemp_CHAMBER: ACCUMULATE_ADC(temp_chamber); break; #endif + #if HAS_TEMP_ADC_COOLER + case PrepareTemp_COOLER: HAL_START_ADC(TEMP_COOLER_PIN); break; + case MeasureTemp_COOLER: ACCUMULATE_ADC(temp_cooler); break; + #endif + #if HAS_TEMP_ADC_PROBE case PrepareTemp_PROBE: HAL_START_ADC(TEMP_PROBE_PIN); break; case MeasureTemp_PROBE: ACCUMULATE_ADC(temp_probe); break; @@ -3183,22 +3380,24 @@ void Temperature::tick() { ) { char k; switch (e) { + default: + #if HAS_TEMP_HOTEND + k = 'T'; break; + #endif + #if HAS_TEMP_BED + case H_BED: k = 'B'; break; + #endif #if HAS_TEMP_CHAMBER case H_CHAMBER: k = 'C'; break; #endif #if HAS_TEMP_PROBE case H_PROBE: k = 'P'; break; #endif - #if HAS_TEMP_HOTEND - default: k = 'T'; break; - #if HAS_HEATED_BED - case H_BED: k = 'B'; break; - #endif - #if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT) - case H_REDUNDANT: k = 'R'; break; - #endif - #elif HAS_HEATED_BED - default: k = 'B'; break; + #if HAS_TEMP_COOLER + case H_COOLER: k = 'L'; break; + #endif + #if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT) + case H_REDUNDANT: k = 'R'; break; #endif } SERIAL_CHAR(' ', k); @@ -3251,18 +3450,21 @@ void Temperature::tick() { ); #endif #if HAS_TEMP_CHAMBER - print_heater_state(degChamber() - #if HAS_HEATED_CHAMBER - , degTargetChamber() - #else - , 0 - #endif + print_heater_state(degChamber(), TERN0(HAS_HEATED_CHAMBER, degTargetChamber()) #if ENABLED(SHOW_TEMP_ADC_VALUES) , rawChamberTemp() #endif , H_CHAMBER ); - #endif + #endif // HAS_TEMP_CHAMBER + #if HAS_TEMP_COOLER + print_heater_state(degCooler(), TERN0(HAS_COOLER, degTargetCooler()) + #if ENABLED(SHOW_TEMP_ADC_VALUES) + , rawCoolerTemp() + #endif + , H_COOLER + ); + #endif // HAS_TEMP_COOLER #if HAS_TEMP_PROBE print_heater_state(degProbe(), 0 #if ENABLED(SHOW_TEMP_ADC_VALUES) @@ -3286,6 +3488,9 @@ void Temperature::tick() { #if HAS_HEATED_CHAMBER SERIAL_ECHOPAIR(" C@:", getHeaterPower(H_CHAMBER)); #endif + #if HAS_COOLER + SERIAL_ECHOPAIR(" C@:", getHeaterPower(H_COOLER)); + #endif #if HAS_MULTI_HOTEND HOTEND_LOOP() { SERIAL_ECHOPAIR(" @", e); @@ -3759,4 +3964,103 @@ void Temperature::tick() { #endif // HAS_HEATED_CHAMBER + #if HAS_COOLER + + #ifndef MIN_COOLING_SLOPE_DEG_COOLER + #define MIN_COOLING_SLOPE_DEG_COOLER 1.50 + #endif + #ifndef MIN_COOLING_SLOPE_TIME_COOLER + #define MIN_COOLING_SLOPE_TIME_COOLER 120 + #endif + + bool Temperature::wait_for_cooler(const bool no_wait_for_cooling/*=true*/) { + + #if TEMP_COOLER_RESIDENCY_TIME > 0 + millis_t residency_start_ms = 0; + bool first_loop = true; + // Loop until the temperature has stabilized + #define TEMP_COOLER_CONDITIONS (!residency_start_ms || PENDING(now, residency_start_ms + SEC_TO_MS(TEMP_COOLER_RESIDENCY_TIME))) + #else + // Loop until the temperature is very close target + #define TEMP_COOLER_CONDITIONS (wants_to_cool ? isLaserHeating() : isLaserCooling()) + #endif + + #if DISABLED(BUSY_WHILE_HEATING) && ENABLED(HOST_KEEPALIVE_FEATURE) + KEEPALIVE_STATE(NOT_BUSY); + #endif + + bool wants_to_cool = false; + float target_temp = -1, previous_temp = 9999; + millis_t now, next_temp_ms = 0, next_cooling_check_ms = 0; + wait_for_heatup = true; + do { + // Target temperature might be changed during the loop + if (target_temp != degTargetCooler()) { + wants_to_cool = isLaserHeating(); + target_temp = degTargetCooler(); + + // Exit if S, continue if S, R, or R + if (no_wait_for_cooling && wants_to_cool) break; + } + + now = millis(); + if (ELAPSED(now, next_temp_ms)) { // Print Temp Reading every 1 second while heating up. + next_temp_ms = now + 1000UL; + print_heater_states(active_extruder); + #if TEMP_COOLER_RESIDENCY_TIME > 0 + SERIAL_ECHOPGM(" W:"); + if (residency_start_ms) + SERIAL_ECHO(long((SEC_TO_MS(TEMP_COOLER_RESIDENCY_TIME) - (now - residency_start_ms)) / 1000UL)); + else + SERIAL_CHAR('?'); + #endif + SERIAL_EOL(); + } + + idle(); + gcode.reset_stepper_timeout(); // Keep steppers powered + + const float current_temp = degCooler(); + + #if TEMP_COOLER_RESIDENCY_TIME > 0 + + const float temp_diff = ABS(target_temp - temp); + + if (!residency_start_ms) { + // Start the TEMP_COOLER_RESIDENCY_TIME timer when we reach target temp for the first time. + if (temp_diff < TEMP_COOLER_WINDOW) + residency_start_ms = now + (first_loop ? SEC_TO_MS(TEMP_COOLER_RESIDENCY_TIME) / 3 : 0); + } + else if (temp_diff > TEMP_COOLER_HYSTERESIS) { + // Restart the timer whenever the temperature falls outside the hysteresis. + residency_start_ms = now; + } + + first_loop = false; + #endif // TEMP_COOLER_RESIDENCY_TIME > 0 + + if (wants_to_cool) { + // Break after MIN_COOLING_SLOPE_TIME_CHAMBER seconds + // if the temperature did not drop at least MIN_COOLING_SLOPE_DEG_CHAMBER + if (!next_cooling_check_ms || ELAPSED(now, next_cooling_check_ms)) { + if (previous_temp - current_temp < float(MIN_COOLING_SLOPE_DEG_COOLER)) break; + next_cooling_check_ms = now + SEC_TO_MS(MIN_COOLING_SLOPE_TIME_COOLER); + previous_temp = current_temp; + } + } + + } while (wait_for_heatup && TEMP_COOLER_CONDITIONS); + + // Prevent a wait-forever situation if R is misused i.e. M191 R0 + if (wait_for_heatup) { + wait_for_heatup = false; + ui.reset_status(); + return true; + } + + return false; + } + + #endif // HAS_COOLER + #endif // HAS_TEMP_SENSOR diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index 5f5a076911..e69183f6f5 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -44,10 +44,10 @@ #define HOTEND_INDEX TERN(HAS_MULTI_HOTEND, e, 0) #define E_NAME TERN_(HAS_MULTI_HOTEND, e) -// Heater identifiers. Positive values are hotends. Negative values are other heaters. +// Element identifiers. Positive values are hotends. Negative values are other heaters or coolers. typedef enum : int8_t { - INDEX_NONE = -5, - H_PROBE, H_REDUNDANT, H_CHAMBER, H_BED, + INDEX_NONE = -6, + H_COOLER, H_PROBE, H_REDUNDANT, H_CHAMBER, H_BED, H_E0, H_E1, H_E2, H_E3, H_E4, H_E5, H_E6, H_E7 } heater_id_t; @@ -99,6 +99,9 @@ enum ADCSensorState : char { #if HAS_TEMP_ADC_CHAMBER PrepareTemp_CHAMBER, MeasureTemp_CHAMBER, #endif + #if HAS_TEMP_ADC_COOLER + PrepareTemp_COOLER, MeasureTemp_COOLER, + #endif #if HAS_TEMP_ADC_PROBE PrepareTemp_PROBE, MeasureTemp_PROBE, #endif @@ -218,6 +221,9 @@ struct PIDHeaterInfo : public HeaterInfo { #elif HAS_TEMP_CHAMBER typedef temp_info_t chamber_info_t; #endif +#if EITHER(HAS_COOLER, HAS_TEMP_COOLER) + typedef heater_info_t cooler_info_t; +#endif // Heater watch handling template @@ -249,6 +255,9 @@ struct HeaterWatch { #if WATCH_CHAMBER typedef struct HeaterWatch chamber_watch_t; #endif +#if WATCH_COOLER + typedef struct HeaterWatch cooler_watch_t; +#endif // Temperature sensor read value ranges typedef struct { int16_t raw_min, raw_max; } raw_range_t; @@ -288,6 +297,9 @@ typedef struct { int16_t raw_min, raw_max, mintemp, maxtemp; } temp_range_t; #if TEMP_SENSOR_CHAMBER_IS_CUSTOM CTI_CHAMBER, #endif + #if COOLER_USER_THERMISTOR + CTI_COOLER, + #endif USER_THERMISTORS }; @@ -316,9 +328,11 @@ class Temperature { TERN_(HAS_HEATED_BED, static bed_info_t temp_bed); TERN_(HAS_TEMP_PROBE, static probe_info_t temp_probe); TERN_(HAS_TEMP_CHAMBER, static chamber_info_t temp_chamber); + TERN_(HAS_TEMP_COOLER, static cooler_info_t temp_cooler); TERN_(AUTO_POWER_E_FANS, static uint8_t autofan_speed[HOTENDS]); TERN_(AUTO_POWER_CHAMBER_FAN, static uint8_t chamberfan_speed); + TERN_(AUTO_POWER_COOLER_FAN, static uint8_t coolerfan_speed); #if ENABLED(FAN_SOFT_PWM) static uint8_t soft_pwm_amount_fan[FAN_COUNT], @@ -428,6 +442,17 @@ class Temperature { #endif #endif + #if HAS_COOLER + TERN_(WATCH_COOLER, static cooler_watch_t watch_cooler); + static millis_t next_cooler_check_ms, cooler_fan_flush_ms; + #ifdef COOLER_MINTEMP + static int16_t mintemp_raw_COOLER; + #endif + #ifdef COOLER_MAXTEMP + static int16_t maxtemp_raw_COOLER; + #endif + #endif + #ifdef MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED static uint8_t consecutive_low_temperature_error[HOTENDS]; #endif @@ -492,7 +517,6 @@ class Temperature { #if HAS_HOTEND static float analog_to_celsius_hotend(const int raw, const uint8_t e); #endif - #if HAS_HEATED_BED static float analog_to_celsius_bed(const int raw); #endif @@ -502,6 +526,9 @@ class Temperature { #if HAS_TEMP_CHAMBER static float analog_to_celsius_chamber(const int raw); #endif + #if HAS_TEMP_COOLER + static float analog_to_celsius_cooler(const int raw); + #endif #if HAS_FAN @@ -737,6 +764,38 @@ class Temperature { } #endif + #if HAS_TEMP_COOLER + #if ENABLED(SHOW_TEMP_ADC_VALUES) + FORCE_INLINE static int16_t rawCoolerTemp() { return temp_cooler.raw; } + #endif + FORCE_INLINE static float degCooler() { return temp_cooler.celsius; } + #if HAS_COOLER + FORCE_INLINE static int16_t degTargetCooler() { return temp_cooler.target; } + FORCE_INLINE static bool isLaserHeating() { return temp_cooler.target > temp_cooler.celsius; } + FORCE_INLINE static bool isLaserCooling() { return temp_cooler.target < temp_cooler.celsius; } + static bool wait_for_cooler(const bool no_wait_for_cooling=true); + #endif + #endif + + #if WATCH_COOLER + static void start_watching_cooler(); + #else + static inline void start_watching_cooler() {} + #endif + + #if HAS_COOLER + static void setTargetCooler(const int16_t celsius) { + temp_cooler.target = + #ifdef COOLER_MAXTEMP + _MIN(celsius, COOLER_MAXTEMP - 10) + #else + celsius + #endif + ; + start_watching_cooler(); + } + #endif + /** * The software PWM power for a heater */ @@ -847,7 +906,7 @@ class Temperature { static void min_temp_error(const heater_id_t e); static void max_temp_error(const heater_id_t e); - #define HAS_THERMAL_PROTECTION ANY(THERMAL_PROTECTION_HOTENDS, THERMAL_PROTECTION_CHAMBER, HAS_THERMALLY_PROTECTED_BED) + #define HAS_THERMAL_PROTECTION ANY(THERMAL_PROTECTION_HOTENDS, THERMAL_PROTECTION_CHAMBER, HAS_THERMALLY_PROTECTED_BED, THERMAL_PROTECTION_COOLER) #if HAS_THERMAL_PROTECTION @@ -863,6 +922,9 @@ class Temperature { #if ENABLED(THERMAL_PROTECTION_CHAMBER) RUNAWAY_IND_CHAMBER, #endif + #if ENABLED(THERMAL_PROTECTION_COOLER) + RUNAWAY_IND_COOLER, + #endif NR_HEATER_RUNAWAY }; #undef _ENUM_FOR_E @@ -872,6 +934,9 @@ class Temperature { #if HAS_THERMALLY_PROTECTED_CHAMBER if (heater_id == H_CHAMBER) return RUNAWAY_IND_CHAMBER; #endif + #if HAS_THERMALLY_PROTECTED_CHAMBER + if (heater_id == H_COOLER) return RUNAWAY_IND_COOLER; + #endif #if HAS_THERMALLY_PROTECTED_BED if (heater_id == H_BED) return RUNAWAY_IND_BED; #endif diff --git a/Marlin/src/module/thermistor/thermistors.h b/Marlin/src/module/thermistor/thermistors.h index 77fc50c8d3..f0ec289dfe 100644 --- a/Marlin/src/module/thermistor/thermistors.h +++ b/Marlin/src/module/thermistor/thermistors.h @@ -42,7 +42,7 @@ #define OV_SCALE(N) (N) #define OV(N) int16_t(OV_SCALE(N) * (OVERSAMPLENR) * (THERMISTOR_TABLE_SCALE)) -#define ANY_THERMISTOR_IS(n) (TEMP_SENSOR_0_THERMISTOR_ID == n || TEMP_SENSOR_1_THERMISTOR_ID == n || TEMP_SENSOR_2_THERMISTOR_ID == n || TEMP_SENSOR_3_THERMISTOR_ID == n || TEMP_SENSOR_4_THERMISTOR_ID == n || TEMP_SENSOR_5_THERMISTOR_ID == n || TEMP_SENSOR_6_THERMISTOR_ID == n || TEMP_SENSOR_7_THERMISTOR_ID == n || TEMP_SENSOR_BED_THERMISTOR_ID == n || TEMP_SENSOR_CHAMBER_THERMISTOR_ID == n || TEMP_SENSOR_PROBE_THERMISTOR_ID == n) +#define ANY_THERMISTOR_IS(n) (TEMP_SENSOR_0_THERMISTOR_ID == n || TEMP_SENSOR_1_THERMISTOR_ID == n || TEMP_SENSOR_2_THERMISTOR_ID == n || TEMP_SENSOR_3_THERMISTOR_ID == n || TEMP_SENSOR_4_THERMISTOR_ID == n || TEMP_SENSOR_5_THERMISTOR_ID == n || TEMP_SENSOR_6_THERMISTOR_ID == n || TEMP_SENSOR_7_THERMISTOR_ID == n || TEMP_SENSOR_BED_THERMISTOR_ID == n || TEMP_SENSOR_CHAMBER_THERMISTOR_ID == n || TEMP_SENSOR_COOLER_THERMISTOR_ID == n || TEMP_SENSOR_PROBE_THERMISTOR_ID == n) typedef struct { int16_t value, celsius; } temp_entry_t; @@ -303,6 +303,14 @@ typedef struct { int16_t value, celsius; } temp_entry_t; #define TEMPTABLE_CHAMBER_LEN 0 #endif +#ifdef TEMP_SENSOR_COOLER_THERMISTOR_ID + #define TEMPTABLE_COOLER TT_NAME(TEMP_SENSOR_COOLER_THERMISTOR_ID) + #define TEMPTABLE_COOLER_LEN COUNT(TEMPTABLE_COOLER) +#elif TEMP_SENSOR_COOLER_IS_THERMISTOR + #error "No cooler thermistor table specified" +#else + #define TEMPTABLE_COOLER_LEN 0 +#endif #ifdef TEMP_SENSOR_PROBE_THERMISTOR_ID #define TEMPTABLE_PROBE TT_NAME(TEMP_SENSOR_PROBE_THERMISTOR_ID) #define TEMPTABLE_PROBE_LEN COUNT(TEMPTABLE_PROBE) @@ -319,7 +327,7 @@ static_assert( && TEMPTABLE_4_LEN < 256 && TEMPTABLE_5_LEN < 256 && TEMPTABLE_6_LEN < 256 && TEMPTABLE_7_LEN < 256 && TEMPTABLE_BED_LEN < 256 && TEMPTABLE_CHAMBER_LEN < 256 - && TEMPTABLE_PROBE_LEN < 256, + && TEMPTABLE_COOLER_LEN < 256 && TEMPTABLE_PROBE_LEN < 256, "Temperature conversion tables over 255 entries need special consideration." ); @@ -495,6 +503,15 @@ static_assert( #define TEMP_SENSOR_CHAMBER_RAW_LO_TEMP MAX_RAW_THERMISTOR_VALUE #endif #endif +#ifndef TEMP_SENSOR_COOLER_RAW_HI_TEMP + #if TT_REVRAW(COOLER) + #define TEMP_SENSOR_COOLER_RAW_HI_TEMP MAX_RAW_THERMISTOR_VALUE + #define TEMP_SENSOR_COOLER_RAW_LO_TEMP 0 + #else + #define TEMP_SENSOR_COOLER_RAW_HI_TEMP 0 + #define TEMP_SENSOR_COOLER_RAW_LO_TEMP MAX_RAW_THERMISTOR_VALUE + #endif +#endif #ifndef TEMP_SENSOR_PROBE_RAW_HI_TEMP #if TT_REVRAW(PROBE) #define TEMP_SENSOR_PROBE_RAW_HI_TEMP MAX_RAW_THERMISTOR_VALUE diff --git a/Marlin/src/pins/pinsDebug_list.h b/Marlin/src/pins/pinsDebug_list.h index 42095fa926..51a00630a4 100644 --- a/Marlin/src/pins/pinsDebug_list.h +++ b/Marlin/src/pins/pinsDebug_list.h @@ -91,6 +91,9 @@ #if PIN_EXISTS(TEMP_CHAMBER) && ANALOG_OK(TEMP_CHAMBER_PIN) REPORT_NAME_ANALOG(__LINE__, TEMP_CHAMBER_PIN) #endif +#if PIN_EXISTS(TEMP_COOLER) && ANALOG_OK(TEMP_COOLER_PIN) + REPORT_NAME_ANALOG(__LINE__, TEMP_COOLER_PIN) +#endif #if PIN_EXISTS(ADC_KEYPAD) && ANALOG_OK(ADC_KEYPAD_PIN) REPORT_NAME_ANALOG(__LINE__, ADC_KEYPAD_PIN) #endif @@ -706,6 +709,9 @@ #if PIN_EXISTS(HEATER_CHAMBER) REPORT_NAME_DIGITAL(__LINE__, HEATER_CHAMBER_PIN) #endif +#if PIN_EXISTS(COOLER) + REPORT_NAME_DIGITAL(__LINE__, COOLER_PIN) +#endif #if PIN_EXISTS(HOME) REPORT_NAME_DIGITAL(__LINE__, HOME_PIN) #endif diff --git a/Marlin/src/pins/sensitive_pins.h b/Marlin/src/pins/sensitive_pins.h index d7eb187245..b8be00bddd 100644 --- a/Marlin/src/pins/sensitive_pins.h +++ b/Marlin/src/pins/sensitive_pins.h @@ -676,6 +676,24 @@ #define _CHAMBER_FAN #endif +#if TEMP_SENSOR_COOLER && PIN_EXISTS(TEMP_COOLER) + #define _COOLER_TEMP analogInputToDigitalPin(TEMP_COOLER_PIN), +#else + #define _COOLER_TEMP +#endif + +#if TEMP_SENSOR_COOLER && PIN_EXISTS(COOLER) + #define _COOLER COOLER_PIN, +#else + #define _COOLER +#endif + +#if TEMP_SENSOR_COOLER && PINS_EXIST(TEMP_COOLER, COOLER_AUTO_FAN) + #define _COOLER_FAN COOLER_AUTO_FAN_PIN, +#else + #define _COOLER_FAN +#endif + #ifndef HAL_SENSITIVE_PINS #define HAL_SENSITIVE_PINS #endif @@ -685,5 +703,5 @@ _E0_PINS _E1_PINS _E2_PINS _E3_PINS _E4_PINS _E5_PINS _E6_PINS _E7_PINS \ _H0_PINS _H1_PINS _H2_PINS _H3_PINS _H4_PINS _H5_PINS _H6_PINS _H7_PINS \ _PS_ON _FAN0 _FAN1 _FAN2 _FAN3 _FAN4 _FAN5 _FAN6 _FAN7 _FANC \ - _BED_PINS _CHAMBER_TEMP _CHAMBER_HEATER _CHAMBER_FAN HAL_SENSITIVE_PINS \ + _BED_PINS _COOLER _CHAMBER_TEMP _CHAMBER_HEATER _CHAMBER_FAN HAL_SENSITIVE_PINS \ } diff --git a/buildroot/tests/BIGTREE_SKR_PRO b/buildroot/tests/BIGTREE_SKR_PRO index 74020c1b27..025d8cbce8 100755 --- a/buildroot/tests/BIGTREE_SKR_PRO +++ b/buildroot/tests/BIGTREE_SKR_PRO @@ -11,7 +11,7 @@ set -e # restore_configs opt_set MOTHERBOARD BOARD_BTT_SKR_PRO_V1_1 SERIAL_PORT 1 -exec_test $1 $2 "BigTreeTech SKR Pro Default Configuration" "$3" +exec_test $1 $2 "BigTreeTech SKR Pro | Default Configuration" "$3" restore_configs opt_set MOTHERBOARD BOARD_BTT_SKR_PRO_V1_1 SERIAL_PORT -1 \ @@ -19,14 +19,15 @@ opt_set MOTHERBOARD BOARD_BTT_SKR_PRO_V1_1 SERIAL_PORT -1 \ E0_AUTO_FAN_PIN PC10 E1_AUTO_FAN_PIN PC11 E2_AUTO_FAN_PIN PC12 \ X_DRIVER_TYPE TMC2209 Y_DRIVER_TYPE TMC2130 opt_enable BLTOUCH EEPROM_SETTINGS AUTO_BED_LEVELING_3POINT Z_SAFE_HOMING PINS_DEBUGGING -exec_test $1 $2 "BigTreeTech SKR Pro 3 Extruders, Auto-Fan, BLTOUCH, mixed TMC drivers" "$3" +exec_test $1 $2 "BigTreeTech SKR Pro | 3 Extruders | Auto-Fan | BLTOUCH | Mixed TMC" "$3" restore_configs opt_set MOTHERBOARD BOARD_BTT_SKR_PRO_V1_1 SERIAL_PORT -1 \ CUTTER_POWER_UNIT PERCENT \ - SPINDLE_LASER_PWM_PIN HEATER_1_PIN SPINDLE_LASER_ENA_PIN HEATER_2_PIN -opt_enable LASER_FEATURE REPRAP_DISCOUNT_SMART_CONTROLLER -exec_test $1 $2 "Laser, LCD, PERCENT power unit" "$3" + SPINDLE_LASER_PWM_PIN HEATER_1_PIN SPINDLE_LASER_ENA_PIN HEATER_2_PIN \ + TEMP_SENSOR_COOLER 1000 TEMP_COOLER_PIN PD13 +opt_enable LASER_FEATURE REPRAP_DISCOUNT_SMART_CONTROLLER +exec_test $1 $2 "BigTreeTech SKR Pro | Laser (Percent) | Cooling | LCD" "$3" # clean up restore_configs diff --git a/platformio.ini b/platformio.ini index aad59362cc..d26b2a37ea 100644 --- a/platformio.ini +++ b/platformio.ini @@ -196,6 +196,7 @@ default_src_filter = + - - + - - - + - - - - @@ -406,6 +407,7 @@ SDSUPPORT = src_filter=+ + GCODE_REPEAT_MARKERS = src_filter=+ + HAS_EXTRUDERS = src_filter=+ + +HAS_COOLER = src_filter=- AUTO_REPORT_TEMPERATURES = src_filter=+ INCH_MODE_SUPPORT = src_filter=+ TEMPERATURE_UNITS_SUPPORT = src_filter=+ From 9f14127fd6f839d706084bf1faa15d466aa47ede Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Sun, 7 Mar 2021 00:14:45 +0000 Subject: [PATCH 106/253] [cron] Bump distribution date (2021-03-07) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index be2dd72ec4..eaf3cf4f70 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2021-03-06" + #define STRING_DISTRIBUTION_DATE "2021-03-07" #endif /** From ced1bb9404ee44a9b7f2f870a4d66a559418c2a0 Mon Sep 17 00:00:00 2001 From: ellensp Date: Sun, 7 Mar 2021 16:43:43 +1300 Subject: [PATCH 107/253] Update obsolete debug define (#21276) --- Marlin/src/core/debug_out.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/core/debug_out.h b/Marlin/src/core/debug_out.h index d93decf7ac..a7dc32622d 100644 --- a/Marlin/src/core/debug_out.h +++ b/Marlin/src/core/debug_out.h @@ -27,7 +27,7 @@ // #undef DEBUG_SECTION -#undef DEBUG_PRINT_P +#undef DEBUG_ECHOPGM_P #undef DEBUG_ECHO_START #undef DEBUG_ERROR_START #undef DEBUG_CHAR From 5dc8f5cfabbfcc6803cad1edd3ea469b29b0834a Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Sat, 6 Mar 2021 20:55:37 -0800 Subject: [PATCH 108/253] Extend Heater Overshoot Options (#21273) Co-authored-by: Scott Lahteine --- Marlin/Configuration.h | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 7b0023a564..1098351d4e 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -476,6 +476,15 @@ #define BED_MAXTEMP 150 #define CHAMBER_MAXTEMP 60 +/** + * Thermal Overshoot + * During heatup (and printing) the temperature can often "overshoot" the target by many degrees + * (especially before PID tuning). Setting the target temperature too close to MAXTEMP guarantees + * a MAXTEMP shutdown! Use these values to forbid temperatures being set too close to MAXTEMP. + */ +#define HOTEND_OVERSHOOT 15 // (°C) Forbid temperatures over MAXTEMP - OVERSHOOT +#define BED_OVERSHOOT 10 // (°C) Forbid temperatures over MAXTEMP - OVERSHOOT + //=========================================================================== //============================= PID Settings ================================ //=========================================================================== From f2ff75f3a2f978061932c20e915aa1cddcc66167 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Mon, 8 Mar 2021 00:18:19 +0000 Subject: [PATCH 109/253] [cron] Bump distribution date (2021-03-08) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index eaf3cf4f70..ec24ed058c 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2021-03-07" + #define STRING_DISTRIBUTION_DATE "2021-03-08" #endif /** From aa054471f2eac02a75ac411181dd4ca71f9fab74 Mon Sep 17 00:00:00 2001 From: ellensp Date: Mon, 8 Mar 2021 17:06:33 +1300 Subject: [PATCH 110/253] M303 followup (#21282) Followup to f2ed18d150 --- Marlin/src/gcode/temp/M303.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/gcode/temp/M303.cpp b/Marlin/src/gcode/temp/M303.cpp index 159a52bf26..0934e04e75 100644 --- a/Marlin/src/gcode/temp/M303.cpp +++ b/Marlin/src/gcode/temp/M303.cpp @@ -51,7 +51,7 @@ void GcodeSuite::M303() { thermalManager.pid_debug_flag ^= true; SERIAL_ECHO_START(); SERIAL_ECHOPGM("PID Debug "); - serialprintln_onoff(pid_debug_flag); + serialprintln_onoff(thermalManager.pid_debug_flag); return; } #endif From 1b9ff68f8ce59a2b142bbabd0fad3d3b377b5997 Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Mon, 8 Mar 2021 04:11:37 -0300 Subject: [PATCH 111/253] Fix Host Keepalive serial target (#21283) Co-authored-by: Scott Lahteine --- .../src/HAL/ESP32/FlushableHardwareSerial.h | 6 ++--- Marlin/src/core/serial.h | 2 +- Marlin/src/core/serial_hook.h | 2 +- Marlin/src/gcode/gcode.cpp | 1 + Marlin/src/gcode/queue.cpp | 26 +++++++------------ platformio.ini | 6 ++--- 6 files changed, 17 insertions(+), 26 deletions(-) diff --git a/Marlin/src/HAL/ESP32/FlushableHardwareSerial.h b/Marlin/src/HAL/ESP32/FlushableHardwareSerial.h index 27df0be4b6..d2762c0efa 100644 --- a/Marlin/src/HAL/ESP32/FlushableHardwareSerial.h +++ b/Marlin/src/HAL/ESP32/FlushableHardwareSerial.h @@ -21,9 +21,9 @@ */ #pragma once -#ifdef ARDUINO_ARCH_ESP32 - #include + +#include "../shared/Marduino.h" #include "../../core/serial_hook.h" class FlushableHardwareSerial : public HardwareSerial { @@ -32,5 +32,3 @@ public: }; extern Serial0Type flushableSerial; - -#endif // ARDUINO_ARCH_ESP32 diff --git a/Marlin/src/core/serial.h b/Marlin/src/core/serial.h index ec955a8dea..f76f0e32f5 100644 --- a/Marlin/src/core/serial.h +++ b/Marlin/src/core/serial.h @@ -62,7 +62,7 @@ extern uint8_t marlin_debug_flags; // // Serial redirection // -#define SERIAL_ALL 0x7F +#define SERIAL_ALL 0xFF #if HAS_MULTI_SERIAL #define _PORT_REDIRECT(n,p) REMEMBER(n,multiSerial.portMask,p) #define _PORT_RESTORE(n,p) RESTORE(n) diff --git a/Marlin/src/core/serial_hook.h b/Marlin/src/core/serial_hook.h index afd43892c7..dc2da13501 100644 --- a/Marlin/src/core/serial_hook.h +++ b/Marlin/src/core/serial_hook.h @@ -165,7 +165,7 @@ struct RuntimeSerial : public SerialBase< RuntimeSerial >, public Seria RuntimeSerial(const bool e, Args... args) : BaseClassT(e), SerialT(args...), writeHook(0), eofHook(0), userPointer(0) {} }; -// A class that's duplicating its output conditionally to 2 serial interface +// A class that duplicates its output conditionally to 2 serial interfaces template struct MultiSerial : public SerialBase< MultiSerial > { typedef SerialBase< MultiSerial > BaseClassT; diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index 34b8d767d1..5f30064b11 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -1067,6 +1067,7 @@ void GcodeSuite::process_subcommands_now(char * gcode) { static millis_t next_busy_signal_ms = 0; if (!autoreport_paused && host_keepalive_interval && busy_state != NOT_BUSY) { if (PENDING(ms, next_busy_signal_ms)) return; + PORT_REDIRECT(SERIAL_ALL); switch (busy_state) { case IN_HANDLER: case IN_PROCESS: diff --git a/Marlin/src/gcode/queue.cpp b/Marlin/src/gcode/queue.cpp index 136293fd34..9b69f9f1fc 100644 --- a/Marlin/src/gcode/queue.cpp +++ b/Marlin/src/gcode/queue.cpp @@ -272,21 +272,7 @@ void GCodeQueue::flush_and_request_resend(const serial_index_t serial_ind) { SERIAL_ECHOLN(serial_state[serial_ind].last_N + 1); } -// Multiserial already handle the dispatch to/from multiple port by itself -inline bool serial_data_available(uint8_t index = SERIAL_ALL) { - if (index == SERIAL_ALL) { - for (index = 0; index < NUM_SERIAL; index++) { - const int a = SERIAL_IMPL.available(index); - #if BOTH(RX_BUFFER_MONITOR, RX_BUFFER_SIZE) - if (a > RX_BUFFER_SIZE - 2) { - PORT_REDIRECT(SERIAL_PORTMASK(index)); - SERIAL_ERROR_MSG("RX BUF overflow, increase RX_BUFFER_SIZE: ", a); - } - #endif - if (a > 0) return true; - } - return false; - } +inline bool serial_data_available(uint8_t index) { const int a = SERIAL_IMPL.available(index); #if BOTH(RX_BUFFER_MONITOR, RX_BUFFER_SIZE) if (a > RX_BUFFER_SIZE - 2) { @@ -294,10 +280,16 @@ inline bool serial_data_available(uint8_t index = SERIAL_ALL) { SERIAL_ERROR_MSG("RX BUF overflow, increase RX_BUFFER_SIZE: ", a); } #endif - return a > 0; } +// Multiserial already handles dispatch to/from multiple ports +inline bool any_serial_data_available() { + LOOP_L_N(p, NUM_SERIAL) + if (serial_data_available(p)) + return true; +} + inline int read_serial(const uint8_t index) { return SERIAL_IMPL.read(index); } void GCodeQueue::gcode_line_error(PGM_P const err, const serial_index_t serial_ind) { @@ -409,7 +401,7 @@ void GCodeQueue::get_serial_commands() { // send "wait" to indicate Marlin is still waiting. #if NO_TIMEOUTS > 0 const millis_t ms = millis(); - if (ring_buffer.empty() && !serial_data_available() && ELAPSED(ms, last_command_time + NO_TIMEOUTS)) { + if (ring_buffer.empty() && !any_serial_data_available() && ELAPSED(ms, last_command_time + NO_TIMEOUTS)) { SERIAL_ECHOLNPGM(STR_WAIT); last_command_time = ms; } diff --git a/platformio.ini b/platformio.ini index d26b2a37ea..b8235c84fd 100644 --- a/platformio.ini +++ b/platformio.ini @@ -424,9 +424,9 @@ HAS_SERVOS = src_filter=+ + HAS_MICROSTEPS = src_filter=+ (ESP3D_)?WIFISUPPORT = AsyncTCP, ESP Async WebServer - ESP3DLib=https://github.com/luc-github/ESP3DLib.git - arduinoWebSockets=https://github.com/Links2004/arduinoWebSockets.git - ESP32SSDP=https://github.com/luc-github/ESP32SSDP.git + ESP3DLib=https://github.com/luc-github/ESP3DLib/archive/master.zip + arduinoWebSockets=links2004/WebSockets@2.3.4 + luc-github/ESP32SSDP@^1.1.1 lib_ignore=ESPAsyncTCP # From aad0f517b45c03da54b75f8cac00a4a91e86f520 Mon Sep 17 00:00:00 2001 From: ellensp Date: Mon, 8 Mar 2021 23:14:18 +1300 Subject: [PATCH 112/253] CUSTOM_USER_BUTTONS followup (#21284) Followup to #18389 --- Marlin/Configuration_adv.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 3168e9a001..868b0c239a 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -3420,7 +3420,7 @@ //#define CUSTOM_USER_BUTTONS #if ENABLED(CUSTOM_USER_BUTTONS) //#define BUTTON1_PIN -1 - #if PIN_EXISTS(BUTTON1_PIN) + #if PIN_EXISTS(BUTTON1) #define BUTTON1_HIT_STATE LOW // State of the triggered button. NC=LOW. NO=HIGH. #define BUTTON1_WHEN_PRINTING false // Button allowed to trigger during printing? #define BUTTON1_GCODE "G28" @@ -3428,7 +3428,7 @@ #endif //#define BUTTON2_PIN -1 - #if PIN_EXISTS(BUTTON2_PIN) + #if PIN_EXISTS(BUTTON2) #define BUTTON2_HIT_STATE LOW #define BUTTON2_WHEN_PRINTING false #define BUTTON2_GCODE "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) @@ -3436,7 +3436,7 @@ #endif //#define BUTTON3_PIN -1 - #if PIN_EXISTS(BUTTON3_PIN) + #if PIN_EXISTS(BUTTON3) #define BUTTON3_HIT_STATE LOW #define BUTTON3_WHEN_PRINTING false #define BUTTON3_GCODE "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) From 18a10c0db1f63b263157fe584697b720b5339a0d Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Tue, 9 Mar 2021 00:13:12 +0000 Subject: [PATCH 113/253] [cron] Bump distribution date (2021-03-09) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index ec24ed058c..be64e830d4 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2021-03-08" + #define STRING_DISTRIBUTION_DATE "2021-03-09" #endif /** From 2f1fd4bbaab08e7fee2c405226dd7453de958b5b Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Mon, 8 Mar 2021 22:59:35 -0300 Subject: [PATCH 114/253] Host Keepalive followup (#21290) Followup to #21283 Co-authored-by: Scott Lahteine --- Marlin/src/HAL/ESP32/FlushableHardwareSerial.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Marlin/src/HAL/ESP32/FlushableHardwareSerial.cpp b/Marlin/src/HAL/ESP32/FlushableHardwareSerial.cpp index cc5a4fc476..9e2f4c1d96 100644 --- a/Marlin/src/HAL/ESP32/FlushableHardwareSerial.cpp +++ b/Marlin/src/HAL/ESP32/FlushableHardwareSerial.cpp @@ -20,11 +20,10 @@ * */ -#include "FlushableHardwareSerial.h" - #ifdef ARDUINO_ARCH_ESP32 +#include "FlushableHardwareSerial.h" Serial0Type flushableSerial(false, 0); -#endif // ARDUINO_ARCH_ESP32 +#endif From 55c31fbe9a70710c6a209d40b7d0165d081dcdd0 Mon Sep 17 00:00:00 2001 From: X-Ryl669 Date: Tue, 9 Mar 2021 10:20:37 +0100 Subject: [PATCH 115/253] Distinguish serial index from mask (#21287) --- Marlin/src/core/serial.h | 31 +++-- Marlin/src/core/serial_base.h | 23 +++- Marlin/src/core/serial_hook.h | 106 ++++++++++-------- Marlin/src/feature/host_actions.cpp | 10 +- Marlin/src/feature/meatpack.h | 24 ++-- Marlin/src/gcode/gcode.cpp | 2 +- Marlin/src/gcode/host/M118.cpp | 2 +- Marlin/src/gcode/queue.cpp | 14 +-- Marlin/src/gcode/queue.h | 6 +- Marlin/src/gcode/sd/M1001.cpp | 2 +- .../lcd/extui/lib/dgus/DGUSScreenHandler.cpp | 6 +- Marlin/src/libs/autoreport.h | 4 +- Marlin/src/module/temperature.cpp | 2 +- Marlin/src/sd/cardreader.cpp | 4 +- 14 files changed, 135 insertions(+), 101 deletions(-) diff --git a/Marlin/src/core/serial.h b/Marlin/src/core/serial.h index f76f0e32f5..57e9636be0 100644 --- a/Marlin/src/core/serial.h +++ b/Marlin/src/core/serial.h @@ -62,37 +62,36 @@ extern uint8_t marlin_debug_flags; // // Serial redirection // -#define SERIAL_ALL 0xFF #if HAS_MULTI_SERIAL - #define _PORT_REDIRECT(n,p) REMEMBER(n,multiSerial.portMask,p) - #define _PORT_RESTORE(n,p) RESTORE(n) - #define SERIAL_ASSERT(P) if(multiSerial.portMask!=(P)){ debugger(); } + #define _PORT_REDIRECT(n,p) REMEMBER(n,multiSerial.portMask,p) + #define _PORT_RESTORE(n,p) RESTORE(n) + #define SERIAL_ASSERT(P) if(multiSerial.portMask!=(P)){ debugger(); } #ifdef SERIAL_CATCHALL typedef MultiSerial SerialOutputT; #else - typedef MultiSerial, decltype(MYSERIAL1)), 0> SerialOutputT; + typedef MultiSerial, decltype(MYSERIAL1)), 0> SerialOutputT; #endif - extern SerialOutputT multiSerial; - #define _SERIAL_IMPL multiSerial + extern SerialOutputT multiSerial; + #define _SERIAL_IMPL multiSerial #else - #define _PORT_REDIRECT(n,p) NOOP - #define _PORT_RESTORE(n) NOOP - #define SERIAL_ASSERT(P) NOOP - #define _SERIAL_IMPL MYSERIAL0 + #define _PORT_REDIRECT(n,p) NOOP + #define _PORT_RESTORE(n) NOOP + #define SERIAL_ASSERT(P) NOOP + #define _SERIAL_IMPL MYSERIAL0 #endif #if ENABLED(MEATPACK) extern MeatpackSerial mpSerial; - #define SERIAL_IMPL mpSerial + #define SERIAL_IMPL mpSerial #else - #define SERIAL_IMPL _SERIAL_IMPL + #define SERIAL_IMPL _SERIAL_IMPL #endif #define SERIAL_OUT(WHAT, V...) (void)SERIAL_IMPL.WHAT(V) -#define PORT_REDIRECT(p) _PORT_REDIRECT(1,p) -#define PORT_RESTORE() _PORT_RESTORE(1) -#define SERIAL_PORTMASK(P) _BV(P) +#define PORT_REDIRECT(p) _PORT_REDIRECT(1,p) +#define PORT_RESTORE() _PORT_RESTORE(1) +#define SERIAL_PORTMASK(P) SerialMask::from(P) // // SERIAL_CHAR - Print one or more individual chars diff --git a/Marlin/src/core/serial_base.h b/Marlin/src/core/serial_base.h index 418bb557e7..f8fe3a181d 100644 --- a/Marlin/src/core/serial_base.h +++ b/Marlin/src/core/serial_base.h @@ -22,12 +22,29 @@ #pragma once #include "../inc/MarlinConfigPre.h" -#include "macros.h" #if ENABLED(EMERGENCY_PARSER) #include "../feature/e_parser.h" #endif +// Used in multiple places +// You can build it but not manipulate it. +// There are only few places where it's required to access the underlying member: GCodeQueue, SerialMask and MultiSerial +struct serial_index_t { + // A signed index, where -1 is a special case meaning no action (neither output or input) + int8_t index; + + // Check if the index is within the range [a ... b] + constexpr inline bool within(const int8_t a, const int8_t b) const { return WITHIN(index, a, b); } + constexpr inline bool valid() const { return WITHIN(index, 0, 7); } // At most, 8 bits + + // Construction is either from an index + constexpr serial_index_t(const int8_t index) : index(index) {} + + // Default to "no index" + constexpr serial_index_t() : index(-1) {} +}; + // flushTX is not implemented in all HAL, so use SFINAE to call the method where it is. CALL_IF_EXISTS_IMPL(void, flushTX); CALL_IF_EXISTS_IMPL(bool, connected, true); @@ -79,10 +96,10 @@ struct SerialBase { void end() { static_cast(this)->end(); } /** Check for available data from the port @param index The port index, usually 0 */ - int available(uint8_t index = 0) { return static_cast(this)->available(index); } + int available(serial_index_t index = 0) { return static_cast(this)->available(index); } /** Read a value from the port @param index The port index, usually 0 */ - int read(uint8_t index = 0) { return static_cast(this)->read(index); } + int read(serial_index_t index = 0) { return static_cast(this)->read(index); } // Check if the serial port is connected (usually bypassed) bool connected() { return static_cast(this)->connected(); } // Redirect flush diff --git a/Marlin/src/core/serial_hook.h b/Marlin/src/core/serial_hook.h index dc2da13501..5e81e9e0e4 100644 --- a/Marlin/src/core/serial_hook.h +++ b/Marlin/src/core/serial_hook.h @@ -21,11 +21,32 @@ */ #pragma once -#include "macros.h" #include "serial_base.h" -// Used in multiple places -typedef int8_t serial_index_t; +// A mask containing a bitmap of the serial port to act upon +// This is written to ensure a serial index is never used as a serial mask +class SerialMask { + uint8_t mask; + + // This constructor is private to ensure you can't convert an index to a mask + // The compiler will stop here if you are mixing index and mask in your code. + // If you need to, you'll have to use the explicit static "from" method here + SerialMask(const serial_index_t); + +public: + inline constexpr bool enabled(const SerialMask PortMask) const { return mask & PortMask.mask; } + inline constexpr SerialMask combine(const SerialMask other) const { return SerialMask(mask | other.mask); } + inline constexpr SerialMask operator<< (const int offset) const { return SerialMask(mask << offset); } + static inline SerialMask from(const serial_index_t index) { + if (index.valid()) return SerialMask(_BV(index.index)); + return SerialMask(0); // A invalid index mean no output + } + + constexpr SerialMask(const uint8_t mask) : mask(mask) {} + constexpr SerialMask(const SerialMask & other) : mask(other.mask) {} // Can't use = default here since not all framework support this + + static constexpr uint8_t All = 0xFF; +}; // The most basic serial class: it dispatch to the base serial class with no hook whatsoever. This will compile to nothing but the base serial class template @@ -39,10 +60,10 @@ struct BaseSerial : public SerialBase< BaseSerial >, public SerialT { void msgDone() {} // We don't care about indices here, since if one can call us, it's the right index anyway - int available(uint8_t) { return (int)SerialT::available(); } - int read(uint8_t) { return (int)SerialT::read(); } - bool connected() { return CALL_IF_EXISTS(bool, static_cast(this), connected);; } - void flushTX() { CALL_IF_EXISTS(void, static_cast(this), flushTX); } + int available(serial_index_t) { return (int)SerialT::available(); } + int read(serial_index_t) { return (int)SerialT::read(); } + bool connected() { return CALL_IF_EXISTS(bool, static_cast(this), connected);; } + void flushTX() { CALL_IF_EXISTS(void, static_cast(this), flushTX); } // We have 2 implementation of the same method in both base class, let's say which one we want using SerialT::available; @@ -77,11 +98,10 @@ struct ConditionalSerial : public SerialBase< ConditionalSerial > { bool connected() { return CALL_IF_EXISTS(bool, &out, connected); } void flushTX() { CALL_IF_EXISTS(void, &out, flushTX); } - int available(uint8_t ) { return (int)out.available(); } - int read(uint8_t ) { return (int)out.read(); } - int available() { return (int)out.available(); } - int read() { return (int)out.read(); } - + int available(serial_index_t ) { return (int)out.available(); } + int read(serial_index_t ) { return (int)out.read(); } + int available() { return (int)out.available(); } + int read() { return (int)out.read(); } ConditionalSerial(bool & conditionVariable, SerialT & out, const bool e) : BaseClassT(e), condition(conditionVariable), out(out) {} }; @@ -102,8 +122,8 @@ struct ForwardSerial : public SerialBase< ForwardSerial > { bool connected() { return Private::HasMember_connected::value ? CALL_IF_EXISTS(bool, &out, connected) : (bool)out; } void flushTX() { CALL_IF_EXISTS(void, &out, flushTX); } - int available(uint8_t) { return (int)out.available(); } - int read(uint8_t) { return (int)out.read(); } + int available(serial_index_t) { return (int)out.available(); } + int read(serial_index_t) { return (int)out.read(); } int available() { return (int)out.available(); } int read() { return (int)out.read(); } @@ -130,8 +150,8 @@ struct RuntimeSerial : public SerialBase< RuntimeSerial >, public Seria if (eofHook) eofHook(userPointer); } - int available(uint8_t) { return (int)SerialT::available(); } - int read(uint8_t) { return (int)SerialT::read(); } + int available(serial_index_t) { return (int)SerialT::available(); } + int read(serial_index_t) { return (int)SerialT::read(); } using SerialT::available; using SerialT::read; using SerialT::flush; @@ -170,53 +190,51 @@ template > { typedef SerialBase< MultiSerial > BaseClassT; - uint8_t portMask; + SerialMask portMask; Serial0T & serial0; Serial1T & serial1; - enum Masks { - UsageMask = ((1 << step) - 1), // A bit mask containing as many bits as step - FirstOutputMask = (UsageMask << offset), - SecondOutputMask = (UsageMask << (offset + step)), - AllMask = FirstOutputMask | SecondOutputMask, - }; + static constexpr uint8_t Usage = ((1 << step) - 1); // A bit mask containing as many bits as step + static constexpr uint8_t FirstOutput = (Usage << offset); + static constexpr uint8_t SecondOutput = (Usage << (offset + step)); + static constexpr uint8_t Both = FirstOutput | SecondOutput; NO_INLINE size_t write(uint8_t c) { size_t ret = 0; - if (portMask & FirstOutputMask) ret = serial0.write(c); - if (portMask & SecondOutputMask) ret = serial1.write(c) | ret; + if (portMask.enabled(FirstOutput)) ret = serial0.write(c); + if (portMask.enabled(SecondOutput)) ret = serial1.write(c) | ret; return ret; } NO_INLINE void msgDone() { - if (portMask & FirstOutputMask) serial0.msgDone(); - if (portMask & SecondOutputMask) serial1.msgDone(); + if (portMask.enabled(FirstOutput)) serial0.msgDone(); + if (portMask.enabled(SecondOutput)) serial1.msgDone(); } - int available(uint8_t index) { - if (index >= 0 + offset && index < step + offset) + int available(serial_index_t index) { + if (index.within(0 + offset, step + offset - 1)) return serial0.available(index); - else if (index >= step + offset && index < 2 * step + offset) + else if (index.within(step + offset, 2 * step + offset - 1)) return serial1.available(index); return false; } - int read(uint8_t index) { - if (index >= 0 + offset && index < step + offset) + int read(serial_index_t index) { + if (index.within(0 + offset, step + offset - 1)) return serial0.read(index); - else if (index >= step + offset && index < 2 * step + offset) + else if (index.within(step + offset, 2 * step + offset - 1)) return serial1.read(index); return -1; } void begin(const long br) { - if (portMask & FirstOutputMask) serial0.begin(br); - if (portMask & SecondOutputMask) serial1.begin(br); + if (portMask.enabled(FirstOutput)) serial0.begin(br); + if (portMask.enabled(SecondOutput)) serial1.begin(br); } void end() { - if (portMask & FirstOutputMask) serial0.end(); - if (portMask & SecondOutputMask) serial1.end(); + if (portMask.enabled(FirstOutput)) serial0.end(); + if (portMask.enabled(SecondOutput)) serial1.end(); } bool connected() { bool ret = true; - if (portMask & FirstOutputMask) ret = CALL_IF_EXISTS(bool, &serial0, connected); - if (portMask & SecondOutputMask) ret = ret && CALL_IF_EXISTS(bool, &serial1, connected); + if (portMask.enabled(FirstOutput)) ret = CALL_IF_EXISTS(bool, &serial0, connected); + if (portMask.enabled(SecondOutput)) ret = ret && CALL_IF_EXISTS(bool, &serial1, connected); return ret; } @@ -225,15 +243,15 @@ struct MultiSerial : public SerialBase< MultiSerial> { uint8_t charCount; uint8_t readIndex; - NO_INLINE size_t write(uint8_t c) { return out.write(c); } - void flush() { out.flush(); } - void begin(long br) { out.begin(br); readIndex = 0; } - void end() { out.end(); } + NO_INLINE size_t write(uint8_t c) { return out.write(c); } + void flush() { out.flush(); } + void begin(long br) { out.begin(br); readIndex = 0; } + void end() { out.end(); } - void msgDone() { out.msgDone(); } + void msgDone() { out.msgDone(); } // Existing instances implement Arduino's operator bool, so use that if it's available - bool connected() { return Private::HasMember_connected::value ? CALL_IF_EXISTS(bool, &out, connected) : (bool)out; } - void flushTX() { CALL_IF_EXISTS(void, &out, flushTX); } + bool connected() { return Private::HasMember_connected::value ? CALL_IF_EXISTS(bool, &out, connected) : (bool)out; } + void flushTX() { CALL_IF_EXISTS(void, &out, flushTX); } - int available(uint8_t index) { + int available(serial_index_t index) { // There is a potential issue here with multiserial, since it'll return its decoded buffer whatever the serial index here. // So, instead of doing MeatpackSerial> we should do MultiSerial, MeatpackSerial<...>> // TODO, let's fix this later on @@ -160,7 +160,7 @@ struct MeatpackSerial : public SerialBase > { return charCount; } - int readImpl(const uint8_t index) { + int readImpl(const serial_index_t index) { // Not enough char to make progress? if (charCount == 0 && available(index) == 0) return -1; @@ -168,9 +168,9 @@ struct MeatpackSerial : public SerialBase > { return serialBuffer[readIndex++]; } - int read(uint8_t index) { return readImpl(index); } - int available() { return available(0); } - int read() { return readImpl(0); } + int read(serial_index_t index) { return readImpl(index); } + int available() { return available(0); } + int read() { return readImpl(0); } MeatpackSerial(const bool e, SerialT & out) : BaseClassT(e), out(out) {} }; diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index 5f30064b11..4e324e7892 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -1067,7 +1067,7 @@ void GcodeSuite::process_subcommands_now(char * gcode) { static millis_t next_busy_signal_ms = 0; if (!autoreport_paused && host_keepalive_interval && busy_state != NOT_BUSY) { if (PENDING(ms, next_busy_signal_ms)) return; - PORT_REDIRECT(SERIAL_ALL); + PORT_REDIRECT(SerialMask::All); switch (busy_state) { case IN_HANDLER: case IN_PROCESS: diff --git a/Marlin/src/gcode/host/M118.cpp b/Marlin/src/gcode/host/M118.cpp index 9982492f93..d6e591add9 100644 --- a/Marlin/src/gcode/host/M118.cpp +++ b/Marlin/src/gcode/host/M118.cpp @@ -52,7 +52,7 @@ void GcodeSuite::M118() { while (*p == ' ') ++p; } - PORT_REDIRECT(WITHIN(port, 0, NUM_SERIAL) ? (port ? SERIAL_PORTMASK(port - 1) : SERIAL_ALL) : multiSerial.portMask); + PORT_REDIRECT(WITHIN(port, 0, NUM_SERIAL) ? (port ? SERIAL_PORTMASK(port - 1) : SerialMask::All) : multiSerial.portMask); if (hasE) SERIAL_ECHO_START(); if (hasA) SERIAL_ECHOPGM("//"); diff --git a/Marlin/src/gcode/queue.cpp b/Marlin/src/gcode/queue.cpp index 9b69f9f1fc..a764d80eca 100644 --- a/Marlin/src/gcode/queue.cpp +++ b/Marlin/src/gcode/queue.cpp @@ -240,7 +240,7 @@ void GCodeQueue::RingBuffer::ok_to_send() { CommandLine &command = commands[index_r]; #if HAS_MULTI_SERIAL const serial_index_t serial_ind = command.port; - if (serial_ind < 0) return; + if (!serial_ind.valid()) return; // Optimization here, skip processing if it's not going anywhere PORT_REDIRECT(SERIAL_PORTMASK(serial_ind)); // Reply to the serial port that sent the command #endif if (command.skip_ok) return; @@ -264,15 +264,15 @@ void GCodeQueue::RingBuffer::ok_to_send() { */ void GCodeQueue::flush_and_request_resend(const serial_index_t serial_ind) { #if HAS_MULTI_SERIAL - if (serial_ind < 0) return; // Never mind. Command came from SD or Flash Drive + if (!serial_ind.valid()) return; // Optimization here, skip if the command came from SD or Flash Drive PORT_REDIRECT(SERIAL_PORTMASK(serial_ind)); // Reply to the serial port that sent the command #endif SERIAL_FLUSH(); SERIAL_ECHOPGM(STR_RESEND); - SERIAL_ECHOLN(serial_state[serial_ind].last_N + 1); + SERIAL_ECHOLN(serial_state[serial_ind.index].last_N + 1); } -inline bool serial_data_available(uint8_t index) { +inline bool serial_data_available(serial_index_t index) { const int a = SERIAL_IMPL.available(index); #if BOTH(RX_BUFFER_MONITOR, RX_BUFFER_SIZE) if (a > RX_BUFFER_SIZE - 2) { @@ -290,15 +290,15 @@ inline bool any_serial_data_available() { return true; } -inline int read_serial(const uint8_t index) { return SERIAL_IMPL.read(index); } +inline int read_serial(const serial_index_t index) { return SERIAL_IMPL.read(index); } void GCodeQueue::gcode_line_error(PGM_P const err, const serial_index_t serial_ind) { PORT_REDIRECT(SERIAL_PORTMASK(serial_ind)); // Reply to the serial port that sent the command SERIAL_ERROR_START(); - SERIAL_ECHOLNPAIR_P(err, serial_state[serial_ind].last_N); + SERIAL_ECHOLNPAIR_P(err, serial_state[serial_ind.index].last_N); while (read_serial(serial_ind) != -1) { /* nada */ } // Clear out the RX buffer. Why don't use flush here ? flush_and_request_resend(serial_ind); - serial_state[serial_ind].count = 0; + serial_state[serial_ind.index].count = 0; } FORCE_INLINE bool is_M29(const char * const cmd) { // matches "M29" & "M29 ", but not "M290", etc diff --git a/Marlin/src/gcode/queue.h b/Marlin/src/gcode/queue.h index 4757b8c37e..8e87d114eb 100644 --- a/Marlin/src/gcode/queue.h +++ b/Marlin/src/gcode/queue.h @@ -79,13 +79,13 @@ public: void commit_command(bool skip_ok #if HAS_MULTI_SERIAL - , serial_index_t serial_ind=-1 + , serial_index_t serial_ind = serial_index_t() #endif ); bool enqueue(const char* cmd, bool skip_ok = true #if HAS_MULTI_SERIAL - , serial_index_t serial_ind=-1 + , serial_index_t serial_ind = serial_index_t() #endif ); @@ -197,7 +197,7 @@ public: /** * (Re)Set the current line number for the last received command */ - static inline void set_current_line_number(long n) { serial_state[ring_buffer.command_port()].last_N = n; } + static inline void set_current_line_number(long n) { serial_state[ring_buffer.command_port().index].last_N = n; } private: diff --git a/Marlin/src/gcode/sd/M1001.cpp b/Marlin/src/gcode/sd/M1001.cpp index 1cf700ae26..415fbb6fa7 100644 --- a/Marlin/src/gcode/sd/M1001.cpp +++ b/Marlin/src/gcode/sd/M1001.cpp @@ -82,7 +82,7 @@ void GcodeSuite::M1001() { // Announce SD file completion { - PORT_REDIRECT(SERIAL_ALL); + PORT_REDIRECT(SerialMask::All); SERIAL_ECHOLNPGM(STR_FILE_PRINTED); } diff --git a/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp index 180c895809..93a7de14a1 100644 --- a/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp @@ -395,21 +395,21 @@ void DGUSScreenHandler::HandleTemperatureChanged(DGUS_VP_Variable &var, void *va default: return; #if HOTENDS >= 1 case VP_T_E0_Set: - NOMORE(newvalue, HEATER_0_MAXTEMP); + NOMORE(newvalue, (uint16_t)HEATER_0_MAXTEMP); thermalManager.setTargetHotend(newvalue, 0); acceptedvalue = thermalManager.degTargetHotend(0); break; #endif #if HOTENDS >= 2 case VP_T_E1_Set: - NOMORE(newvalue, HEATER_1_MAXTEMP); + NOMORE(newvalue, (uint16_t)HEATER_1_MAXTEMP); thermalManager.setTargetHotend(newvalue, 1); acceptedvalue = thermalManager.degTargetHotend(1); break; #endif #if HAS_HEATED_BED case VP_T_Bed_Set: - NOMORE(newvalue, BED_MAXTEMP); + NOMORE(newvalue, (uint16_t)BED_MAXTEMP); thermalManager.setTargetBed(newvalue); acceptedvalue = thermalManager.degTargetBed(); break; diff --git a/Marlin/src/libs/autoreport.h b/Marlin/src/libs/autoreport.h index 232216578f..a6bc5adbf7 100644 --- a/Marlin/src/libs/autoreport.h +++ b/Marlin/src/libs/autoreport.h @@ -28,8 +28,8 @@ struct AutoReporter { millis_t next_report_ms; uint8_t report_interval; #if HAS_MULTI_SERIAL - serial_index_t report_port_mask; - AutoReporter() : report_port_mask(SERIAL_ALL) {} + SerialMask report_port_mask; + AutoReporter() : report_port_mask(SerialMask::All) {} #endif inline void set_interval(uint8_t seconds, const uint8_t limit=60) { diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index a1d5745de4..a000a31de7 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -329,7 +329,7 @@ const char str_t_thermal_runaway[] PROGMEM = STR_T_THERMAL_RUNAWAY, */ void Temperature::report_fan_speed(const uint8_t target) { if (target >= FAN_COUNT) return; - PORT_REDIRECT(SERIAL_ALL); + PORT_REDIRECT(SerialMask::All); SERIAL_ECHOLNPAIR("M106 P", target, " S", fan_speed[target]); } #endif diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp index c973ba5945..fac14e72a7 100644 --- a/Marlin/src/sd/cardreader.cpp +++ b/Marlin/src/sd/cardreader.cpp @@ -549,7 +549,7 @@ void openFailed(const char * const fname) { void announceOpen(const uint8_t doing, const char * const path) { if (doing) { - PORT_REDIRECT(SERIAL_ALL); + PORT_REDIRECT(SerialMask::All); SERIAL_ECHO_START(); SERIAL_ECHOPGM("Now "); SERIAL_ECHOPGM_P(doing == 1 ? PSTR("doing") : PSTR("fresh")); @@ -615,7 +615,7 @@ void CardReader::openFileRead(char * const path, const uint8_t subcall_type/*=0* sdpos = 0; { // Don't remove this block, as the PORT_REDIRECT is a RAII - PORT_REDIRECT(SERIAL_ALL); + PORT_REDIRECT(SerialMask::All); SERIAL_ECHOLNPAIR(STR_SD_FILE_OPENED, fname, STR_SD_SIZE, filesize); SERIAL_ECHOLNPGM(STR_SD_FILE_SELECTED); } From 10ec5c7f340cb10590fa4defe594726bc9473e91 Mon Sep 17 00:00:00 2001 From: Chris Date: Wed, 10 Mar 2021 00:06:00 +0100 Subject: [PATCH 116/253] Fix LPC + TMC boot loop (#21298) --- Marlin/src/MarlinCore.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 689650c6ab..bce091da5f 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -1053,6 +1053,10 @@ void setup() { #if HAS_FILAMENT_SENSOR SETUP_RUN(runout.setup()); #endif + + #if HAS_TMC220x + SETUP_RUN(tmc_serial_begin()); + #endif #if ENABLED(PSU_CONTROL) SETUP_LOG("PSU_CONTROL"); @@ -1068,10 +1072,6 @@ void setup() { SETUP_RUN(L64xxManager.init()); // Set up SPI, init drivers #endif - #if HAS_TMC220x - SETUP_RUN(tmc_serial_begin()); - #endif - #if HAS_STEPPER_RESET SETUP_RUN(disableStepperDrivers()); #endif From 28a136d7f432546b765efd450eb45960c1ad2c2a Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Wed, 10 Mar 2021 00:13:12 +0000 Subject: [PATCH 117/253] [cron] Bump distribution date (2021-03-10) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index be64e830d4..df29952479 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2021-03-09" + #define STRING_DISTRIBUTION_DATE "2021-03-10" #endif /** From bb6d718e19c7c0e6db743b0bc615b17f121f0073 Mon Sep 17 00:00:00 2001 From: Victor Mateus Oliveira Date: Tue, 9 Mar 2021 20:21:49 -0300 Subject: [PATCH 118/253] fix meat pack internal buffer for multi serial --- Marlin/src/gcode/queue.cpp | 1 + Marlin/src/gcode/sd/M28_M29.cpp | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/Marlin/src/gcode/queue.cpp b/Marlin/src/gcode/queue.cpp index a764d80eca..0f4169a2c4 100644 --- a/Marlin/src/gcode/queue.cpp +++ b/Marlin/src/gcode/queue.cpp @@ -288,6 +288,7 @@ inline bool any_serial_data_available() { LOOP_L_N(p, NUM_SERIAL) if (serial_data_available(p)) return true; + return false; } inline int read_serial(const serial_index_t index) { return SERIAL_IMPL.read(index); } diff --git a/Marlin/src/gcode/sd/M28_M29.cpp b/Marlin/src/gcode/sd/M28_M29.cpp index f34edb6f7c..373938d99b 100644 --- a/Marlin/src/gcode/sd/M28_M29.cpp +++ b/Marlin/src/gcode/sd/M28_M29.cpp @@ -49,7 +49,7 @@ void GcodeSuite::M28() { // Binary transfer mode if ((card.flag.binary_mode = binary_mode)) { SERIAL_ECHO_MSG("Switching to Binary Protocol"); - TERN_(HAS_MULTI_SERIAL, card.transfer_port_index = queue.ring_buffer.command_port()); + TERN_(HAS_MULTI_SERIAL, card.transfer_port_index = queue.ring_buffer.command_port().index); } else card.openFileWrite(p); From b75e682c502c572426cc6aa8110fe5869413e8d0 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 10 Mar 2021 11:31:32 -0600 Subject: [PATCH 119/253] Add binary file transfer test --- buildroot/tests/mks_robin_nano35 | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/buildroot/tests/mks_robin_nano35 b/buildroot/tests/mks_robin_nano35 index 7ab592aaa3..c54cd36655 100755 --- a/buildroot/tests/mks_robin_nano35 +++ b/buildroot/tests/mks_robin_nano35 @@ -42,7 +42,8 @@ use_example_configs Mks/Robin opt_set MOTHERBOARD BOARD_MKS_ROBIN_NANO_V2 opt_disable TFT_INTERFACE_FSMC TFT_RES_320x240 opt_enable TFT_INTERFACE_SPI TFT_RES_480x320 -exec_test $1 $2 "MKS Robin v2 nano New Color UI 480x320 SPI" "$3" +opt_enable BINARY_FILE_TRANSFER +exec_test $1 $2 "MKS Robin v2 nano New Color UI 480x320 SPI + BINARY_FILE_TRANSFER" "$3" # # MKS Robin v2 nano LVGL SPI + TMC From fe0b7700335470f03f5b5b8404b126efca8afbb6 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 10 Mar 2021 11:33:29 -0600 Subject: [PATCH 120/253] Fix serial index types --- Marlin/src/feature/binary_stream.h | 4 ++-- Marlin/src/gcode/queue.cpp | 2 +- Marlin/src/sd/cardreader.cpp | 2 +- Marlin/src/sd/cardreader.h | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Marlin/src/feature/binary_stream.h b/Marlin/src/feature/binary_stream.h index d092b7152f..80f26cc7ce 100644 --- a/Marlin/src/feature/binary_stream.h +++ b/Marlin/src/feature/binary_stream.h @@ -29,11 +29,11 @@ #include "../libs/heatshrink/heatshrink_decoder.h" #endif -inline bool bs_serial_data_available(const uint8_t index) { +inline bool bs_serial_data_available(const serial_index_t index) { return SERIAL_IMPL.available(index); } -inline int bs_read_serial(const uint8_t index) { +inline int bs_read_serial(const serial_index_t index) { return SERIAL_IMPL.read(index); } diff --git a/Marlin/src/gcode/queue.cpp b/Marlin/src/gcode/queue.cpp index 0f4169a2c4..4f676eaeb3 100644 --- a/Marlin/src/gcode/queue.cpp +++ b/Marlin/src/gcode/queue.cpp @@ -393,7 +393,7 @@ void GCodeQueue::get_serial_commands() { * receive buffer (which limits the packet size to MAX_CMD_SIZE). * The receive buffer also limits the packet size for reliable transmission. */ - binaryStream[card.transfer_port_index].receive(serial_state[card.transfer_port_index].line_buffer); + binaryStream[card.transfer_port_index.index].receive(serial_state[card.transfer_port_index.index].line_buffer); return; } #endif diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp index fac14e72a7..a3e0577031 100644 --- a/Marlin/src/sd/cardreader.cpp +++ b/Marlin/src/sd/cardreader.cpp @@ -70,7 +70,7 @@ char CardReader::filename[FILENAME_LENGTH], CardReader::longFilename[LONG_FILENA IF_DISABLED(NO_SD_AUTOSTART, uint8_t CardReader::autofile_index); // = 0 #if BOTH(HAS_MULTI_SERIAL, BINARY_FILE_TRANSFER) - int8_t CardReader::transfer_port_index; + serial_index_t CardReader::transfer_port_index; #endif // private: diff --git a/Marlin/src/sd/cardreader.h b/Marlin/src/sd/cardreader.h index 0a89bbba78..f823b79e7a 100644 --- a/Marlin/src/sd/cardreader.h +++ b/Marlin/src/sd/cardreader.h @@ -72,9 +72,9 @@ public: // Fast! binary file transfer #if ENABLED(BINARY_FILE_TRANSFER) #if HAS_MULTI_SERIAL - static int8_t transfer_port_index; + static serial_index_t transfer_port_index; #else - static constexpr int8_t transfer_port_index = 0; + static constexpr serial_index_t transfer_port_index = 0; #endif #endif From 2c62886c719c67c9ed9a3d0741020a004633a109 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 10 Mar 2021 11:35:19 -0600 Subject: [PATCH 121/253] Clean up spaces and words --- Marlin/src/MarlinCore.cpp | 10 +++++----- Marlin/src/gcode/host/M115.cpp | 2 +- Marlin/src/gcode/queue.cpp | 18 ++++++++++-------- Marlin/src/inc/SanityCheck.h | 3 +-- Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h | 18 +++++++++--------- 5 files changed, 26 insertions(+), 25 deletions(-) diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index bce091da5f..e1756af511 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -990,14 +990,14 @@ void setup() { #endif #define SETUP_RUN(C) do{ SETUP_LOG(STRINGIFY(C)); C; }while(0) - MYSERIAL0.begin(BAUDRATE); + MYSERIAL1.begin(BAUDRATE); millis_t serial_connect_timeout = millis() + 1000UL; - while (!MYSERIAL0.connected() && PENDING(millis(), serial_connect_timeout)) { /*nada*/ } + while (!MYSERIAL1.connected() && PENDING(millis(), serial_connect_timeout)) { /*nada*/ } #if HAS_MULTI_SERIAL && !HAS_ETHERNET - MYSERIAL1.begin(BAUDRATE); + MYSERIAL2.begin(BAUDRATE); serial_connect_timeout = millis() + 1000UL; - while (!MYSERIAL1.connected() && PENDING(millis(), serial_connect_timeout)) { /*nada*/ } + while (!MYSERIAL2.connected() && PENDING(millis(), serial_connect_timeout)) { /*nada*/ } #endif SERIAL_ECHOLNPGM("start"); @@ -1053,7 +1053,7 @@ void setup() { #if HAS_FILAMENT_SENSOR SETUP_RUN(runout.setup()); #endif - + #if HAS_TMC220x SETUP_RUN(tmc_serial_begin()); #endif diff --git a/Marlin/src/gcode/host/M115.cpp b/Marlin/src/gcode/host/M115.cpp index 316abc3048..4b7b268688 100644 --- a/Marlin/src/gcode/host/M115.cpp +++ b/Marlin/src/gcode/host/M115.cpp @@ -144,7 +144,7 @@ void GcodeSuite::M115() { // COOLER_TEMPERATURE (M143, M193) cap_line(PSTR("COOLER_TEMPERATURE"), ENABLED(HAS_COOLER)); - // MEATPACK Compresson + // MEATPACK Compression cap_line(PSTR("MEATPACK"), ENABLED(MEATPACK)); // Machine Geometry diff --git a/Marlin/src/gcode/queue.cpp b/Marlin/src/gcode/queue.cpp index 4f676eaeb3..6b48000248 100644 --- a/Marlin/src/gcode/queue.cpp +++ b/Marlin/src/gcode/queue.cpp @@ -272,7 +272,7 @@ void GCodeQueue::flush_and_request_resend(const serial_index_t serial_ind) { SERIAL_ECHOLN(serial_state[serial_ind.index].last_N + 1); } -inline bool serial_data_available(serial_index_t index) { +static bool serial_data_available(serial_index_t index) { const int a = SERIAL_IMPL.available(index); #if BOTH(RX_BUFFER_MONITOR, RX_BUFFER_SIZE) if (a > RX_BUFFER_SIZE - 2) { @@ -283,13 +283,15 @@ inline bool serial_data_available(serial_index_t index) { return a > 0; } -// Multiserial already handles dispatch to/from multiple ports -inline bool any_serial_data_available() { - LOOP_L_N(p, NUM_SERIAL) - if (serial_data_available(p)) - return true; - return false; -} +#if NO_TIMEOUTS > 0 + // Multiserial already handles dispatch to/from multiple ports + static bool any_serial_data_available() { + LOOP_L_N(p, NUM_SERIAL) + if (serial_data_available(p)) + return true; + return false; + } +#endif inline int read_serial(const serial_index_t index) { return SERIAL_IMPL.read(index); } diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index cd9ca84385..8c92cf2c63 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -3337,12 +3337,11 @@ static_assert( _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2) #endif #endif - /** * Sanity Check for MEATPACK and BINARY_FILE_TRANSFER Features */ #if BOTH(MEATPACK, BINARY_FILE_TRANSFER) - #error "Either enable MEATPACK or enable BINARY_FILE_TRANSFER." + #error "Either enable MEATPACK or BINARY_FILE_TRANSFER, not both." #endif /** diff --git a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h index 99e0f0be2a..b9f1074c7a 100644 --- a/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h +++ b/Marlin/src/pins/stm32f1/pins_MKS_ROBIN.h @@ -237,7 +237,7 @@ * This board does not have dedicated TMC UART pins. Custom wiring is needed. * You may uncomment one of the options below, or add it to your Configuration.h. * - * When using up to four TMC2209 drivers, hardware serial is recommented on + * When using up to four TMC2209 drivers, hardware serial is recommended on * MSerial0 or MSerial1. * * When using TMC2208 or more than four drivers, SoftwareSerial will be needed, @@ -246,14 +246,14 @@ //#define TMC_HARDWARE_SERIAL #if ENABLED(TMC_HARDWARE_SERIAL) - #define X_HARDWARE_SERIAL MSerial0 - #define X2_HARDWARE_SERIAL MSerial0 - #define Y_HARDWARE_SERIAL MSerial0 - #define Y2_HARDWARE_SERIAL MSerial0 - #define Z_HARDWARE_SERIAL MSerial0 - #define Z2_HARDWARE_SERIAL MSerial0 - #define E0_HARDWARE_SERIAL MSerial0 - #define E1_HARDWARE_SERIAL MSerial0 + #define X_HARDWARE_SERIAL MSerial0 + #define X2_HARDWARE_SERIAL MSerial0 + #define Y_HARDWARE_SERIAL MSerial0 + #define Y2_HARDWARE_SERIAL MSerial0 + #define Z_HARDWARE_SERIAL MSerial0 + #define Z2_HARDWARE_SERIAL MSerial0 + #define E0_HARDWARE_SERIAL MSerial0 + #define E1_HARDWARE_SERIAL MSerial0 #endif //#define TMC_SOFTWARE_SERIAL From dbd28eecc9cd4b5954a4fd1ed0c02bd9788c279b Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 10 Mar 2021 12:05:05 -0600 Subject: [PATCH 122/253] Number serial from 1 to match settings --- Marlin/src/HAL/AVR/HAL.cpp | 2 +- Marlin/src/HAL/AVR/HAL.h | 12 +++---- Marlin/src/HAL/AVR/MarlinSerial.h | 10 +++--- Marlin/src/HAL/DUE/HAL.cpp | 8 ++--- Marlin/src/HAL/DUE/HAL.h | 27 +++++++-------- Marlin/src/HAL/DUE/MarlinSerial.h | 4 +-- Marlin/src/HAL/DUE/MarlinSerialUSB.h | 2 +- .../src/HAL/ESP32/FlushableHardwareSerial.cpp | 2 +- .../src/HAL/ESP32/FlushableHardwareSerial.h | 2 +- Marlin/src/HAL/ESP32/HAL.cpp | 2 +- Marlin/src/HAL/ESP32/HAL.h | 10 +++--- Marlin/src/HAL/ESP32/WebSocketSerial.h | 2 +- Marlin/src/HAL/LINUX/HAL.h | 2 +- Marlin/src/HAL/LINUX/include/serial.h | 2 +- Marlin/src/HAL/LINUX/main.cpp | 4 +-- Marlin/src/HAL/LPC1768/HAL.cpp | 2 +- Marlin/src/HAL/LPC1768/HAL.h | 13 ++++--- Marlin/src/HAL/LPC1768/MarlinSerial.cpp | 4 +-- Marlin/src/HAL/LPC1768/MarlinSerial.h | 4 +-- Marlin/src/HAL/SAMD51/HAL.cpp | 10 +++--- Marlin/src/HAL/SAMD51/HAL.h | 34 +++++++++---------- Marlin/src/HAL/SAMD51/MarlinSerial_AGCM4.h | 2 +- Marlin/src/HAL/STM32/HAL.cpp | 2 +- Marlin/src/HAL/STM32/HAL.h | 16 ++++----- Marlin/src/HAL/STM32/MarlinSerial.h | 2 +- Marlin/src/HAL/STM32F1/HAL.cpp | 4 +-- Marlin/src/HAL/STM32F1/HAL.h | 14 ++++---- Marlin/src/HAL/STM32F1/HAL_MinSerial.cpp | 6 ++-- Marlin/src/HAL/STM32F1/MarlinSerial.cpp | 6 ++-- Marlin/src/HAL/STM32F1/MarlinSerial.h | 2 +- Marlin/src/HAL/STM32F1/msc_sd.cpp | 2 +- Marlin/src/HAL/STM32F1/msc_sd.h | 2 +- Marlin/src/HAL/TEENSY31_32/HAL.cpp | 2 +- Marlin/src/HAL/TEENSY31_32/HAL.h | 11 +++--- Marlin/src/HAL/TEENSY35_36/HAL.cpp | 2 +- Marlin/src/HAL/TEENSY35_36/HAL.h | 11 +++--- Marlin/src/HAL/TEENSY40_41/HAL.cpp | 2 +- Marlin/src/HAL/TEENSY40_41/HAL.h | 17 +++++----- Marlin/src/core/serial.cpp | 6 ++-- Marlin/src/core/serial.h | 8 ++--- Marlin/src/core/serial_hook.h | 6 ++-- Marlin/src/feature/ethernet.cpp | 2 +- Marlin/src/gcode/config/M575.cpp | 4 +-- Marlin/src/gcode/control/M111.cpp | 8 ++--- Marlin/src/gcode/queue.cpp | 4 +-- .../src/lcd/extui/lib/mks_ui/draw_gcode.cpp | 2 +- .../lcd/extui/lib/mks_ui/draw_keyboard.cpp | 2 +- Marlin/src/lcd/extui/malyan_lcd.cpp | 4 +-- .../sd/usb_flashdrive/Sd2Card_FlashDrive.cpp | 2 +- .../src/sd/usb_flashdrive/lib-uhs2/settings.h | 2 +- docs/Serial.md | 4 +-- 51 files changed, 155 insertions(+), 160 deletions(-) diff --git a/Marlin/src/HAL/AVR/HAL.cpp b/Marlin/src/HAL/AVR/HAL.cpp index 4c45a5d78e..cfa9e47f18 100644 --- a/Marlin/src/HAL/AVR/HAL.cpp +++ b/Marlin/src/HAL/AVR/HAL.cpp @@ -25,7 +25,7 @@ #include "HAL.h" #ifdef USBCON - DefaultSerial MSerial(false, Serial); + DefaultSerial1 MSerial0(false, Serial); #ifdef BLUETOOTH BTSerial btSerial(false, bluetoothSerial); #endif diff --git a/Marlin/src/HAL/AVR/HAL.h b/Marlin/src/HAL/AVR/HAL.h index 5e22ac0836..f6adf1bd31 100644 --- a/Marlin/src/HAL/AVR/HAL.h +++ b/Marlin/src/HAL/AVR/HAL.h @@ -83,25 +83,25 @@ typedef int8_t pin_t; // Serial ports #ifdef USBCON #include "../../core/serial_hook.h" - typedef ForwardSerial0Type< decltype(Serial) > DefaultSerial; - extern DefaultSerial MSerial; + typedef ForwardSerial1Class< decltype(Serial) > DefaultSerial1; + extern DefaultSerial1 MSerial0; #ifdef BLUETOOTH - typedef ForwardSerial0Type< decltype(bluetoothSerial) > BTSerial; + typedef ForwardSerial1Class< decltype(bluetoothSerial) > BTSerial; extern BTSerial btSerial; #endif - #define MYSERIAL0 TERN(BLUETOOTH, btSerial, MSerial) + #define MYSERIAL1 TERN(BLUETOOTH, btSerial, MSerial0) #else #if !WITHIN(SERIAL_PORT, -1, 3) #error "SERIAL_PORT must be from -1 to 3. Please update your configuration." #endif - #define MYSERIAL0 customizedSerial1 + #define MYSERIAL1 customizedSerial1 #ifdef SERIAL_PORT_2 #if !WITHIN(SERIAL_PORT_2, -1, 3) #error "SERIAL_PORT_2 must be from -1 to 3. Please update your configuration." #endif - #define MYSERIAL1 customizedSerial2 + #define MYSERIAL2 customizedSerial2 #endif #endif diff --git a/Marlin/src/HAL/AVR/MarlinSerial.h b/Marlin/src/HAL/AVR/MarlinSerial.h index 9abc3dbed0..ab49e9440a 100644 --- a/Marlin/src/HAL/AVR/MarlinSerial.h +++ b/Marlin/src/HAL/AVR/MarlinSerial.h @@ -238,11 +238,11 @@ static constexpr bool MAX_RX_QUEUED = ENABLED(SERIAL_STATS_MAX_RX_QUEUED); }; - typedef Serial0Type< MarlinSerial< MarlinSerialCfg > > MSerialT; + typedef Serial1Class< MarlinSerial< MarlinSerialCfg > > MSerialT; extern MSerialT customizedSerial1; #ifdef SERIAL_PORT_2 - typedef Serial0Type< MarlinSerial< MarlinSerialCfg > > MSerialT2; + typedef Serial1Class< MarlinSerial< MarlinSerialCfg > > MSerialT2; extern MSerialT2 customizedSerial2; #endif @@ -262,7 +262,7 @@ static constexpr bool RX_OVERRUNS = false; }; - typedef Serial0Type< MarlinSerial< MMU2SerialCfg > > MSerialT3; + typedef Serial1Class< MarlinSerial< MMU2SerialCfg > > MSerialT3; extern MSerialT3 mmuSerial; #endif @@ -292,12 +292,12 @@ }; - typedef Serial0Type< MarlinSerial< LCDSerialCfg > > MSerialT4; + typedef Serial1Class< MarlinSerial< LCDSerialCfg > > MSerialT4; extern MSerialT4 lcdSerial; #endif // Use the UART for Bluetooth in AT90USB configurations #if defined(USBCON) && ENABLED(BLUETOOTH) - typedef Serial0Type MSerialT5; + typedef Serial1Class MSerialT5; extern MSerialT5 bluetoothSerial; #endif diff --git a/Marlin/src/HAL/DUE/HAL.cpp b/Marlin/src/HAL/DUE/HAL.cpp index 034b86ccb0..0e4caa47ac 100644 --- a/Marlin/src/HAL/DUE/HAL.cpp +++ b/Marlin/src/HAL/DUE/HAL.cpp @@ -107,16 +107,16 @@ uint16_t HAL_adc_get_result() { // Forward the default serial ports #if ANY_SERIAL_IS(0) - DefaultSerial MSerial(false, Serial); + DefaultSerial1 MSerial0(false, Serial); #endif #if ANY_SERIAL_IS(1) - DefaultSerial1 MSerial1(false, Serial1); + DefaultSerial2 MSerial1(false, Serial1); #endif #if ANY_SERIAL_IS(2) - DefaultSerial2 MSerial2(false, Serial2); + DefaultSerial3 MSerial2(false, Serial2); #endif #if ANY_SERIAL_IS(3) - DefaultSerial3 MSerial3(false, Serial3); + DefaultSerial4 MSerial3(false, Serial3); #endif #endif // ARDUINO_ARCH_SAM diff --git a/Marlin/src/HAL/DUE/HAL.h b/Marlin/src/HAL/DUE/HAL.h index b1c6a38c0f..095538f6a6 100644 --- a/Marlin/src/HAL/DUE/HAL.h +++ b/Marlin/src/HAL/DUE/HAL.h @@ -38,33 +38,32 @@ #include "../../core/serial_hook.h" -typedef ForwardSerial0Type< decltype(Serial) > DefaultSerial; -typedef ForwardSerial0Type< decltype(Serial1) > DefaultSerial1; -typedef ForwardSerial0Type< decltype(Serial2) > DefaultSerial2; -typedef ForwardSerial0Type< decltype(Serial3) > DefaultSerial3; -extern DefaultSerial MSerial; -extern DefaultSerial1 MSerial1; -extern DefaultSerial2 MSerial2; -extern DefaultSerial3 MSerial3; +typedef ForwardSerial1Class< decltype(Serial) > DefaultSerial1; +typedef ForwardSerial1Class< decltype(Serial1) > DefaultSerial2; +typedef ForwardSerial1Class< decltype(Serial2) > DefaultSerial3; +typedef ForwardSerial1Class< decltype(Serial3) > DefaultSerial4; +extern DefaultSerial1 MSerial0; +extern DefaultSerial2 MSerial1; +extern DefaultSerial3 MSerial2; +extern DefaultSerial4 MSerial3; #define _MSERIAL(X) MSerial##X #define MSERIAL(X) _MSERIAL(X) -#define MSerial0 MSerial -// Define MYSERIAL0/1 before MarlinSerial includes! +// Define MYSERIAL1/2 before MarlinSerial includes! #if SERIAL_PORT == -1 || ENABLED(EMERGENCY_PARSER) - #define MYSERIAL0 customizedSerial1 + #define MYSERIAL1 customizedSerial1 #elif WITHIN(SERIAL_PORT, 0, 3) - #define MYSERIAL0 MSERIAL(SERIAL_PORT) + #define MYSERIAL1 MSERIAL(SERIAL_PORT) #else #error "The required SERIAL_PORT must be from -1 to 3. Please update your configuration." #endif #ifdef SERIAL_PORT_2 #if SERIAL_PORT_2 == -1 || ENABLED(EMERGENCY_PARSER) - #define MYSERIAL1 customizedSerial2 + #define MYSERIAL2 customizedSerial2 #elif WITHIN(SERIAL_PORT_2, 0, 3) - #define MYSERIAL1 MSERIAL(SERIAL_PORT_2) + #define MYSERIAL2 MSERIAL(SERIAL_PORT_2) #else #error "SERIAL_PORT_2 must be from -1 to 3. Please update your configuration." #endif diff --git a/Marlin/src/HAL/DUE/MarlinSerial.h b/Marlin/src/HAL/DUE/MarlinSerial.h index 7fc21264bb..e74d234b4a 100644 --- a/Marlin/src/HAL/DUE/MarlinSerial.h +++ b/Marlin/src/HAL/DUE/MarlinSerial.h @@ -141,11 +141,11 @@ struct MarlinSerialCfg { }; #if SERIAL_PORT >= 0 - typedef Serial0Type< MarlinSerial< MarlinSerialCfg > > MSerialT; + typedef Serial1Class< MarlinSerial< MarlinSerialCfg > > MSerialT; extern MSerialT customizedSerial1; #endif #if defined(SERIAL_PORT_2) && SERIAL_PORT_2 >= 0 - typedef Serial0Type< MarlinSerial< MarlinSerialCfg > > MSerialT2; + typedef Serial1Class< MarlinSerial< MarlinSerialCfg > > MSerialT2; extern MSerialT2 customizedSerial2; #endif diff --git a/Marlin/src/HAL/DUE/MarlinSerialUSB.h b/Marlin/src/HAL/DUE/MarlinSerialUSB.h index f9cea29869..4c299dced5 100644 --- a/Marlin/src/HAL/DUE/MarlinSerialUSB.h +++ b/Marlin/src/HAL/DUE/MarlinSerialUSB.h @@ -50,7 +50,7 @@ struct MarlinSerialUSB { FORCE_INLINE int rxMaxEnqueued() { return 0; } #endif }; -typedef Serial0Type MSerialT; +typedef Serial1Class MSerialT; #if SERIAL_PORT == -1 extern MSerialT customizedSerial1; diff --git a/Marlin/src/HAL/ESP32/FlushableHardwareSerial.cpp b/Marlin/src/HAL/ESP32/FlushableHardwareSerial.cpp index 9e2f4c1d96..145662215a 100644 --- a/Marlin/src/HAL/ESP32/FlushableHardwareSerial.cpp +++ b/Marlin/src/HAL/ESP32/FlushableHardwareSerial.cpp @@ -24,6 +24,6 @@ #include "FlushableHardwareSerial.h" -Serial0Type flushableSerial(false, 0); +Serial1Class flushableSerial(false, 0); #endif diff --git a/Marlin/src/HAL/ESP32/FlushableHardwareSerial.h b/Marlin/src/HAL/ESP32/FlushableHardwareSerial.h index d2762c0efa..012dda8626 100644 --- a/Marlin/src/HAL/ESP32/FlushableHardwareSerial.h +++ b/Marlin/src/HAL/ESP32/FlushableHardwareSerial.h @@ -31,4 +31,4 @@ public: FlushableHardwareSerial(int uart_nr) : HardwareSerial(uart_nr) {} }; -extern Serial0Type flushableSerial; +extern Serial1Class flushableSerial; diff --git a/Marlin/src/HAL/ESP32/HAL.cpp b/Marlin/src/HAL/ESP32/HAL.cpp index ab28595071..365706c3e2 100644 --- a/Marlin/src/HAL/ESP32/HAL.cpp +++ b/Marlin/src/HAL/ESP32/HAL.cpp @@ -41,7 +41,7 @@ #endif #if ENABLED(ESP3D_WIFISUPPORT) - DefaultSerial MSerial(false, Serial2Socket); + DefaultSerial1 MSerial0(false, Serial2Socket); #endif // ------------------------ diff --git a/Marlin/src/HAL/ESP32/HAL.h b/Marlin/src/HAL/ESP32/HAL.h index 4d1db571d0..9258f97702 100644 --- a/Marlin/src/HAL/ESP32/HAL.h +++ b/Marlin/src/HAL/ESP32/HAL.h @@ -51,15 +51,15 @@ extern portMUX_TYPE spinlock; -#define MYSERIAL0 flushableSerial +#define MYSERIAL1 flushableSerial #if EITHER(WIFISUPPORT, ESP3D_WIFISUPPORT) #if ENABLED(ESP3D_WIFISUPPORT) - typedef ForwardSerial0Type< decltype(Serial2Socket) > DefaultSerial; - extern DefaultSerial MSerial; - #define MYSERIAL1 MSerial + typedef ForwardSerial1Class< decltype(Serial2Socket) > DefaultSerial1; + extern DefaultSerial1 MSerial0; + #define MYSERIAL2 MSerial0 #else - #define MYSERIAL1 webSocketSerial + #define MYSERIAL2 webSocketSerial #endif #endif diff --git a/Marlin/src/HAL/ESP32/WebSocketSerial.h b/Marlin/src/HAL/ESP32/WebSocketSerial.h index c68792c8c1..924d36f15c 100644 --- a/Marlin/src/HAL/ESP32/WebSocketSerial.h +++ b/Marlin/src/HAL/ESP32/WebSocketSerial.h @@ -81,5 +81,5 @@ public: #endif }; -typedef Serial0Type MSerialT; +typedef Serial1Class MSerialT; extern MSerialT webSocketSerial; diff --git a/Marlin/src/HAL/LINUX/HAL.h b/Marlin/src/HAL/LINUX/HAL.h index e4f4dd3fc3..f21e3e2c65 100644 --- a/Marlin/src/HAL/LINUX/HAL.h +++ b/Marlin/src/HAL/LINUX/HAL.h @@ -61,7 +61,7 @@ uint8_t _getc(); #define SHARED_SERVOS HAS_SERVOS extern MSerialT usb_serial; -#define MYSERIAL0 usb_serial +#define MYSERIAL1 usb_serial #define ST7920_DELAY_1 DELAY_NS(600) #define ST7920_DELAY_2 DELAY_NS(750) diff --git a/Marlin/src/HAL/LINUX/include/serial.h b/Marlin/src/HAL/LINUX/include/serial.h index 2585be25bf..ebae066c3a 100644 --- a/Marlin/src/HAL/LINUX/include/serial.h +++ b/Marlin/src/HAL/LINUX/include/serial.h @@ -115,4 +115,4 @@ struct HalSerial { volatile bool host_connected; }; -typedef Serial0Type MSerialT; +typedef Serial1Class MSerialT; diff --git a/Marlin/src/HAL/LINUX/main.cpp b/Marlin/src/HAL/LINUX/main.cpp index c409a83e5d..31f6de98ee 100644 --- a/Marlin/src/HAL/LINUX/main.cpp +++ b/Marlin/src/HAL/LINUX/main.cpp @@ -105,8 +105,8 @@ int main() { std::thread write_serial (write_serial_thread); std::thread read_serial (read_serial_thread); - #ifdef MYSERIAL0 - MYSERIAL0.begin(BAUDRATE); + #ifdef MYSERIAL1 + MYSERIAL1.begin(BAUDRATE); SERIAL_ECHOLNPGM("x86_64 Initialized"); SERIAL_FLUSHTX(); #endif diff --git a/Marlin/src/HAL/LPC1768/HAL.cpp b/Marlin/src/HAL/LPC1768/HAL.cpp index 26a2c0e7db..442c41afe7 100644 --- a/Marlin/src/HAL/LPC1768/HAL.cpp +++ b/Marlin/src/HAL/LPC1768/HAL.cpp @@ -29,7 +29,7 @@ #include "watchdog.h" #endif -DefaultSerial USBSerial(false, UsbSerial); +DefaultSerial1 USBSerial(false, UsbSerial); uint32_t HAL_adc_reading = 0; diff --git a/Marlin/src/HAL/LPC1768/HAL.h b/Marlin/src/HAL/LPC1768/HAL.h index 1dc4fe6ff9..58f9cb71fb 100644 --- a/Marlin/src/HAL/LPC1768/HAL.h +++ b/Marlin/src/HAL/LPC1768/HAL.h @@ -60,26 +60,25 @@ extern "C" volatile uint32_t _millis; #define ST7920_DELAY_3 DELAY_NS(750) #endif -typedef ForwardSerial0Type< decltype(UsbSerial) > DefaultSerial; -extern DefaultSerial USBSerial; +typedef ForwardSerial1Class< decltype(UsbSerial) > DefaultSerial1; +extern DefaultSerial1 USBSerial; #define _MSERIAL(X) MSerial##X #define MSERIAL(X) _MSERIAL(X) -#define MSerial0 MSerial #if SERIAL_PORT == -1 - #define MYSERIAL0 USBSerial + #define MYSERIAL1 USBSerial #elif WITHIN(SERIAL_PORT, 0, 3) - #define MYSERIAL0 MSERIAL(SERIAL_PORT) + #define MYSERIAL1 MSERIAL(SERIAL_PORT) #else #error "SERIAL_PORT must be from -1 to 3. Please update your configuration." #endif #ifdef SERIAL_PORT_2 #if SERIAL_PORT_2 == -1 - #define MYSERIAL1 USBSerial + #define MYSERIAL2 USBSerial #elif WITHIN(SERIAL_PORT_2, 0, 3) - #define MYSERIAL1 MSERIAL(SERIAL_PORT_2) + #define MYSERIAL2 MSERIAL(SERIAL_PORT_2) #else #error "SERIAL_PORT_2 must be from -1 to 3. Please update your configuration." #endif diff --git a/Marlin/src/HAL/LPC1768/MarlinSerial.cpp b/Marlin/src/HAL/LPC1768/MarlinSerial.cpp index b0dfc0ae90..be42c7f960 100644 --- a/Marlin/src/HAL/LPC1768/MarlinSerial.cpp +++ b/Marlin/src/HAL/LPC1768/MarlinSerial.cpp @@ -26,7 +26,7 @@ #if ANY_SERIAL_IS(0) MarlinSerial _MSerial(LPC_UART0); - MSerialT MSerial(true, _MSerial); + MSerialT MSerial0(true, _MSerial); extern "C" void UART0_IRQHandler() { _MSerial.IRQHandler(); } #endif #if ANY_SERIAL_IS(1) @@ -51,7 +51,7 @@ // Need to figure out which serial port we are and react in consequence (Marlin does not have CONTAINER_OF macro) if (false) {} #if ANY_SERIAL_IS(0) - else if (this == &_MSerial) emergency_parser.update(MSerial.emergency_state, c); + else if (this == &_MSerial) emergency_parser.update(MSerial0.emergency_state, c); #endif #if ANY_SERIAL_IS(1) else if (this == &_MSerial1) emergency_parser.update(MSerial1.emergency_state, c); diff --git a/Marlin/src/HAL/LPC1768/MarlinSerial.h b/Marlin/src/HAL/LPC1768/MarlinSerial.h index 35c9362b9f..489bd8cc6c 100644 --- a/Marlin/src/HAL/LPC1768/MarlinSerial.h +++ b/Marlin/src/HAL/LPC1768/MarlinSerial.h @@ -54,8 +54,8 @@ public: // On LPC176x framework, HardwareSerial does not implement the same interface as Arduino's Serial, so overloads // of 'available' and 'read' method are not used in this multiple inheritance scenario. // Instead, use a ForwardSerial here that adapts the interface. -typedef ForwardSerial0Type MSerialT; -extern MSerialT MSerial; +typedef ForwardSerial1Class MSerialT; +extern MSerialT MSerial0; extern MSerialT MSerial1; extern MSerialT MSerial2; extern MSerialT MSerial3; diff --git a/Marlin/src/HAL/SAMD51/HAL.cpp b/Marlin/src/HAL/SAMD51/HAL.cpp index 4a6100b96b..8dd2fefd0a 100644 --- a/Marlin/src/HAL/SAMD51/HAL.cpp +++ b/Marlin/src/HAL/SAMD51/HAL.cpp @@ -26,19 +26,19 @@ #ifdef ADAFRUIT_GRAND_CENTRAL_M4 #if ANY_SERIAL_IS(-1) - DefaultSerial MSerial(false, Serial); + DefaultSerial1 MSerial0(false, Serial); #endif #if ANY_SERIAL_IS(0) - DefaultSerial1 MSerial1(false, Serial1); + DefaultSerial2 MSerial1(false, Serial1); #endif #if ANY_SERIAL_IS(1) - DefaultSerial2 MSerial2(false, Serial2); + DefaultSerial3 MSerial2(false, Serial2); #endif #if ANY_SERIAL_IS(2) - DefaultSerial3 MSerial3(false, Serial3); + DefaultSerial4 MSerial3(false, Serial3); #endif #if ANY_SERIAL_IS(3) - DefaultSerial4 MSerial4(false, Serial4); + DefaultSerial5 MSerial4(false, Serial4); #endif #endif diff --git a/Marlin/src/HAL/SAMD51/HAL.h b/Marlin/src/HAL/SAMD51/HAL.h index 7b272af842..de72c476e4 100644 --- a/Marlin/src/HAL/SAMD51/HAL.h +++ b/Marlin/src/HAL/SAMD51/HAL.h @@ -32,36 +32,36 @@ #include "MarlinSerial_AGCM4.h" // Serial ports - typedef ForwardSerial0Type< decltype(Serial) > DefaultSerial; - typedef ForwardSerial0Type< decltype(Serial1) > DefaultSerial1; - typedef ForwardSerial0Type< decltype(Serial2) > DefaultSerial2; - typedef ForwardSerial0Type< decltype(Serial3) > DefaultSerial3; - typedef ForwardSerial0Type< decltype(Serial4) > DefaultSerial4; - extern DefaultSerial MSerial; - extern DefaultSerial1 MSerial1; - extern DefaultSerial2 MSerial2; - extern DefaultSerial3 MSerial3; - extern DefaultSerial4 MSerial4; + typedef ForwardSerial1Class< decltype(Serial) > DefaultSerial1; + typedef ForwardSerial1Class< decltype(Serial1) > DefaultSerial2; + typedef ForwardSerial1Class< decltype(Serial2) > DefaultSerial3; + typedef ForwardSerial1Class< decltype(Serial3) > DefaultSerial4; + typedef ForwardSerial1Class< decltype(Serial4) > DefaultSerial5; + extern DefaultSerial1 MSerial0; + extern DefaultSerial2 MSerial1; + extern DefaultSerial3 MSerial2; + extern DefaultSerial4 MSerial3; + extern DefaultSerial5 MSerial4; - // MYSERIAL0 required before MarlinSerial includes! + // MYSERIAL1 required before MarlinSerial includes! #define __MSERIAL(X) MSerial##X #define _MSERIAL(X) __MSERIAL(X) #define MSERIAL(X) _MSERIAL(INCREMENT(X)) #if SERIAL_PORT == -1 - #define MYSERIAL0 MSerial + #define MYSERIAL1 MSerial0 #elif WITHIN(SERIAL_PORT, 0, 3) - #define MYSERIAL0 MSERIAL(SERIAL_PORT) + #define MYSERIAL1 MSERIAL(SERIAL_PORT) #else #error "SERIAL_PORT must be from -1 to 3. Please update your configuration." #endif #ifdef SERIAL_PORT_2 #if SERIAL_PORT_2 == -1 - #define MYSERIAL1 MSerial + #define MYSERIAL2 MSerial0 #elif WITHIN(SERIAL_PORT_2, 0, 3) - #define MYSERIAL1 MSERIAL(SERIAL_PORT_2) + #define MYSERIAL2 MSERIAL(SERIAL_PORT_2) #else #error "SERIAL_PORT_2 must be from -1 to 3. Please update your configuration." #endif @@ -69,7 +69,7 @@ #ifdef MMU2_SERIAL_PORT #if MMU2_SERIAL_PORT == -1 - #define MMU2_SERIAL MSerial + #define MMU2_SERIAL MSerial0 #elif WITHIN(MMU2_SERIAL_PORT, 0, 3) #define MMU2_SERIAL MSERIAL(MMU2_SERIAL_PORT) #else @@ -79,7 +79,7 @@ #ifdef LCD_SERIAL_PORT #if LCD_SERIAL_PORT == -1 - #define LCD_SERIAL MSerial + #define LCD_SERIAL MSerial0 #elif WITHIN(LCD_SERIAL_PORT, 0, 3) #define LCD_SERIAL MSERIAL(LCD_SERIAL_PORT) #else diff --git a/Marlin/src/HAL/SAMD51/MarlinSerial_AGCM4.h b/Marlin/src/HAL/SAMD51/MarlinSerial_AGCM4.h index b7293415d1..ac5a379398 100644 --- a/Marlin/src/HAL/SAMD51/MarlinSerial_AGCM4.h +++ b/Marlin/src/HAL/SAMD51/MarlinSerial_AGCM4.h @@ -22,7 +22,7 @@ #include "../../core/serial_hook.h" -typedef Serial0Type UartT; +typedef Serial1Class UartT; extern UartT Serial2; extern UartT Serial3; diff --git a/Marlin/src/HAL/STM32/HAL.cpp b/Marlin/src/HAL/STM32/HAL.cpp index d13be1a21a..c66f061d91 100644 --- a/Marlin/src/HAL/STM32/HAL.cpp +++ b/Marlin/src/HAL/STM32/HAL.cpp @@ -29,7 +29,7 @@ #include "../shared/Delay.h" #ifdef USBCON - DefaultSerial MSerial(false, SerialUSB); + DefaultSerial1 MSerial0(false, SerialUSB); #endif #if ENABLED(SRAM_EEPROM_EMULATION) diff --git a/Marlin/src/HAL/STM32/HAL.h b/Marlin/src/HAL/STM32/HAL.h index be0cc30962..ad3a9963d7 100644 --- a/Marlin/src/HAL/STM32/HAL.h +++ b/Marlin/src/HAL/STM32/HAL.h @@ -40,8 +40,8 @@ #ifdef USBCON #include #include "../../core/serial_hook.h" - typedef ForwardSerial0Type< decltype(SerialUSB) > DefaultSerial; - extern DefaultSerial MSerial; + typedef ForwardSerial1Class< decltype(SerialUSB) > DefaultSerial1; + extern DefaultSerial1 MSerial0; #endif // ------------------------ @@ -51,18 +51,18 @@ #define MSERIAL(X) _MSERIAL(X) #if SERIAL_PORT == -1 - #define MYSERIAL0 MSerial + #define MYSERIAL1 MSerial0 #elif WITHIN(SERIAL_PORT, 1, 6) - #define MYSERIAL0 MSERIAL(SERIAL_PORT) + #define MYSERIAL1 MSERIAL(SERIAL_PORT) #else #error "SERIAL_PORT must be -1 or from 1 to 6. Please update your configuration." #endif #ifdef SERIAL_PORT_2 #if SERIAL_PORT_2 == -1 - #define MYSERIAL1 MSerial + #define MYSERIAL2 MSerial0 #elif WITHIN(SERIAL_PORT_2, 1, 6) - #define MYSERIAL1 MSERIAL(SERIAL_PORT_2) + #define MYSERIAL2 MSERIAL(SERIAL_PORT_2) #else #error "SERIAL_PORT_2 must be -1 or from 1 to 6. Please update your configuration." #endif @@ -70,7 +70,7 @@ #ifdef MMU2_SERIAL_PORT #if MMU2_SERIAL_PORT == -1 - #define MMU2_SERIAL MSerial + #define MMU2_SERIAL MSerial0 #elif WITHIN(MMU2_SERIAL_PORT, 1, 6) #define MMU2_SERIAL MSERIAL(MMU2_SERIAL_PORT) #else @@ -80,7 +80,7 @@ #ifdef LCD_SERIAL_PORT #if LCD_SERIAL_PORT == -1 - #define LCD_SERIAL MSerial + #define LCD_SERIAL MSerial0 #elif WITHIN(LCD_SERIAL_PORT, 1, 6) #define LCD_SERIAL MSERIAL(LCD_SERIAL_PORT) #else diff --git a/Marlin/src/HAL/STM32/MarlinSerial.h b/Marlin/src/HAL/STM32/MarlinSerial.h index 8cc4f0dd4c..7b0529cfd2 100644 --- a/Marlin/src/HAL/STM32/MarlinSerial.h +++ b/Marlin/src/HAL/STM32/MarlinSerial.h @@ -42,7 +42,7 @@ protected: usart_rx_callback_t _rx_callback; }; -typedef Serial0Type MSerialT; +typedef Serial1Class MSerialT; extern MSerialT MSerial1; extern MSerialT MSerial2; extern MSerialT MSerial3; diff --git a/Marlin/src/HAL/STM32F1/HAL.cpp b/Marlin/src/HAL/STM32F1/HAL.cpp index 182d9401c1..40452b5d70 100644 --- a/Marlin/src/HAL/STM32F1/HAL.cpp +++ b/Marlin/src/HAL/STM32F1/HAL.cpp @@ -84,7 +84,7 @@ #if defined(SERIAL_USB) && !HAS_SD_HOST_DRIVE USBSerial SerialUSB; - DefaultSerial MSerial(true, SerialUSB); + DefaultSerial1 MSerial0(true, SerialUSB); #if ENABLED(EMERGENCY_PARSER) #include "../libmaple/usb/stm32f1/usb_reg_map.h" @@ -107,7 +107,7 @@ len = usb_cdcacm_peek(buf, total); for (uint32 i = 0; i < len; i++) - emergency_parser.update(MSerial.emergency_state, buf[i + total - len]); + emergency_parser.update(MSerial0.emergency_state, buf[i + total - len]); } #endif #endif diff --git a/Marlin/src/HAL/STM32F1/HAL.h b/Marlin/src/HAL/STM32F1/HAL.h index 30bf60b6e8..4656583590 100644 --- a/Marlin/src/HAL/STM32F1/HAL.h +++ b/Marlin/src/HAL/STM32F1/HAL.h @@ -61,11 +61,11 @@ #endif #ifdef SERIAL_USB - typedef ForwardSerial0Type< USBSerial > DefaultSerial; - extern DefaultSerial MSerial; + typedef ForwardSerial1Class< USBSerial > DefaultSerial1; + extern DefaultSerial1 MSerial0; #if !HAS_SD_HOST_DRIVE - #define UsbSerial MSerial + #define UsbSerial MSerial0 #else #define UsbSerial MarlinCompositeSerial #endif @@ -81,9 +81,9 @@ #endif #if SERIAL_PORT == -1 - #define MYSERIAL0 UsbSerial + #define MYSERIAL1 UsbSerial #elif WITHIN(SERIAL_PORT, 1, NUM_UARTS) - #define MYSERIAL0 MSERIAL(SERIAL_PORT) + #define MYSERIAL1 MSERIAL(SERIAL_PORT) #elif NUM_UARTS == 5 #error "SERIAL_PORT must be -1 or from 1 to 5. Please update your configuration." #else @@ -92,9 +92,9 @@ #ifdef SERIAL_PORT_2 #if SERIAL_PORT_2 == -1 - #define MYSERIAL1 UsbSerial + #define MYSERIAL2 UsbSerial #elif WITHIN(SERIAL_PORT_2, 1, NUM_UARTS) - #define MYSERIAL1 MSERIAL(SERIAL_PORT_2) + #define MYSERIAL2 MSERIAL(SERIAL_PORT_2) #elif NUM_UARTS == 5 #error "SERIAL_PORT_2 must be -1 or from 1 to 5. Please update your configuration." #else diff --git a/Marlin/src/HAL/STM32F1/HAL_MinSerial.cpp b/Marlin/src/HAL/STM32F1/HAL_MinSerial.cpp index e6b89f1105..2cb75bb1e9 100644 --- a/Marlin/src/HAL/STM32F1/HAL_MinSerial.cpp +++ b/Marlin/src/HAL/STM32F1/HAL_MinSerial.cpp @@ -44,8 +44,8 @@ static void TXBegin() { #warning "Using POSTMORTEM_DEBUGGING requires a physical U(S)ART hardware in case of severe error." #warning "Disabling the severe error reporting feature currently because the used serial port is not a HW port." #else - // We use MYSERIAL0 here, so we need to figure out how to get the linked register - struct usart_dev* dev = MYSERIAL0.c_dev(); + // We use MYSERIAL1 here, so we need to figure out how to get the linked register + struct usart_dev* dev = MYSERIAL1.c_dev(); // Or use this if removing libmaple // int irq = dev->irq_num; @@ -80,7 +80,7 @@ static void TXBegin() { #define sw_barrier() __asm__ volatile("": : :"memory"); static void TX(char c) { #if WITHIN(SERIAL_PORT, 1, 6) - struct usart_dev* dev = MYSERIAL0.c_dev(); + struct usart_dev* dev = MYSERIAL1.c_dev(); while (!(dev->regs->SR & USART_SR_TXE)) { TERN_(USE_WATCHDOG, HAL_watchdog_refresh()); sw_barrier(); diff --git a/Marlin/src/HAL/STM32F1/MarlinSerial.cpp b/Marlin/src/HAL/STM32F1/MarlinSerial.cpp index c404e81b35..a46e3ab3ab 100644 --- a/Marlin/src/HAL/STM32F1/MarlinSerial.cpp +++ b/Marlin/src/HAL/STM32F1/MarlinSerial.cpp @@ -134,12 +134,12 @@ constexpr bool IsSerialClassAllowed(const HardwareSerial&) { return false; } // If you encounter this error, replace SerialX with MSerialX, for example MSerial3. // Non-TMC ports were already validated in HAL.h, so do not require verbose error messages. -#ifdef MYSERIAL0 - CHECK_CFG_SERIAL(MYSERIAL0); -#endif #ifdef MYSERIAL1 CHECK_CFG_SERIAL(MYSERIAL1); #endif +#ifdef MYSERIAL2 + CHECK_CFG_SERIAL(MYSERIAL2); +#endif #ifdef LCD_SERIAL CHECK_CFG_SERIAL(LCD_SERIAL); #endif diff --git a/Marlin/src/HAL/STM32F1/MarlinSerial.h b/Marlin/src/HAL/STM32F1/MarlinSerial.h index 692e97e618..dda32fe7a2 100644 --- a/Marlin/src/HAL/STM32F1/MarlinSerial.h +++ b/Marlin/src/HAL/STM32F1/MarlinSerial.h @@ -47,7 +47,7 @@ struct MarlinSerial : public HardwareSerial { #endif }; -typedef Serial0Type MSerialT; +typedef Serial1Class MSerialT; extern MSerialT MSerial1; extern MSerialT MSerial2; diff --git a/Marlin/src/HAL/STM32F1/msc_sd.cpp b/Marlin/src/HAL/STM32F1/msc_sd.cpp index 1e2fe88174..7725b2c324 100644 --- a/Marlin/src/HAL/STM32F1/msc_sd.cpp +++ b/Marlin/src/HAL/STM32F1/msc_sd.cpp @@ -24,7 +24,7 @@ #define PRODUCT_ID 0x29 USBMassStorage MarlinMSC; -Serial0Type MarlinCompositeSerial(true); +Serial1Class MarlinCompositeSerial(true); #include "../../inc/MarlinConfig.h" diff --git a/Marlin/src/HAL/STM32F1/msc_sd.h b/Marlin/src/HAL/STM32F1/msc_sd.h index 151287f7a7..f4636bdff7 100644 --- a/Marlin/src/HAL/STM32F1/msc_sd.h +++ b/Marlin/src/HAL/STM32F1/msc_sd.h @@ -21,6 +21,6 @@ #include "../../core/serial_hook.h" extern USBMassStorage MarlinMSC; -extern Serial0Type MarlinCompositeSerial; +extern Serial1Class MarlinCompositeSerial; void MSC_SD_init(); diff --git a/Marlin/src/HAL/TEENSY31_32/HAL.cpp b/Marlin/src/HAL/TEENSY31_32/HAL.cpp index 51636d29bf..8a13f1d884 100644 --- a/Marlin/src/HAL/TEENSY31_32/HAL.cpp +++ b/Marlin/src/HAL/TEENSY31_32/HAL.cpp @@ -31,7 +31,7 @@ #include -DefaultSerial MSerial(false); +DefaultSerial1 MSerial0(false); USBSerialType USBSerial(false, SerialUSB); uint16_t HAL_adc_result; diff --git a/Marlin/src/HAL/TEENSY31_32/HAL.h b/Marlin/src/HAL/TEENSY31_32/HAL.h index 5273b38637..cd1c334899 100644 --- a/Marlin/src/HAL/TEENSY31_32/HAL.h +++ b/Marlin/src/HAL/TEENSY31_32/HAL.h @@ -51,19 +51,18 @@ #endif #include "../../core/serial_hook.h" -typedef Serial0Type DefaultSerial; -extern DefaultSerial MSerial; -typedef ForwardSerial0Type USBSerialType; +typedef Serial1Class DefaultSerial1; +extern DefaultSerial1 MSerial0; +typedef ForwardSerial1Class USBSerialType; extern USBSerialType USBSerial; #define _MSERIAL(X) MSerial##X #define MSERIAL(X) _MSERIAL(X) -#define MSerial0 MSerial #if SERIAL_PORT == -1 - #define MYSERIAL0 USBSerial + #define MYSERIAL1 USBSerial #elif WITHIN(SERIAL_PORT, 0, 3) - #define MYSERIAL0 MSERIAL(SERIAL_PORT) + #define MYSERIAL1 MSERIAL(SERIAL_PORT) #endif #define HAL_SERVO_LIB libServo diff --git a/Marlin/src/HAL/TEENSY35_36/HAL.cpp b/Marlin/src/HAL/TEENSY35_36/HAL.cpp index 547681de5f..fe2f79f415 100644 --- a/Marlin/src/HAL/TEENSY35_36/HAL.cpp +++ b/Marlin/src/HAL/TEENSY35_36/HAL.cpp @@ -31,7 +31,7 @@ #include -DefaultSerial MSerial(false); +DefaultSerial1 MSerial0(false); USBSerialType USBSerial(false, SerialUSB); uint16_t HAL_adc_result, HAL_adc_select; diff --git a/Marlin/src/HAL/TEENSY35_36/HAL.h b/Marlin/src/HAL/TEENSY35_36/HAL.h index 94c514bf62..48fee6b9a9 100644 --- a/Marlin/src/HAL/TEENSY35_36/HAL.h +++ b/Marlin/src/HAL/TEENSY35_36/HAL.h @@ -54,19 +54,18 @@ #endif #include "../../core/serial_hook.h" -typedef Serial0Type DefaultSerial; -extern DefaultSerial MSerial; -typedef ForwardSerial0Type USBSerialType; +typedef Serial1Class DefaultSerial1; +extern DefaultSerial1 MSerial0; +typedef ForwardSerial1Class USBSerialType; extern USBSerialType USBSerial; #define _MSERIAL(X) MSerial##X #define MSERIAL(X) _MSERIAL(X) -#define MSerial0 MSerial #if SERIAL_PORT == -1 - #define MYSERIAL0 USBSerial + #define MYSERIAL1 USBSerial #elif WITHIN(SERIAL_PORT, 0, 3) - #define MYSERIAL0 MSERIAL(SERIAL_PORT) + #define MYSERIAL1 MSERIAL(SERIAL_PORT) #endif #define HAL_SERVO_LIB libServo diff --git a/Marlin/src/HAL/TEENSY40_41/HAL.cpp b/Marlin/src/HAL/TEENSY40_41/HAL.cpp index 26449d7eb2..0fde9da537 100644 --- a/Marlin/src/HAL/TEENSY40_41/HAL.cpp +++ b/Marlin/src/HAL/TEENSY40_41/HAL.cpp @@ -32,7 +32,7 @@ #include -DefaultSerial MSerial(false); +DefaultSerial1 MSerial0(false); USBSerialType USBSerial(false, SerialUSB); uint16_t HAL_adc_result, HAL_adc_select; diff --git a/Marlin/src/HAL/TEENSY40_41/HAL.h b/Marlin/src/HAL/TEENSY40_41/HAL.h index 6aa1e521a4..03a12e1b92 100644 --- a/Marlin/src/HAL/TEENSY40_41/HAL.h +++ b/Marlin/src/HAL/TEENSY40_41/HAL.h @@ -56,30 +56,29 @@ #endif #include "../../core/serial_hook.h" -typedef Serial0Type DefaultSerial; -extern DefaultSerial MSerial; -typedef ForwardSerial0Type USBSerialType; +typedef Serial1Class DefaultSerial1; +extern DefaultSerial1 MSerial0; +typedef ForwardSerial1Class USBSerialType; extern USBSerialType USBSerial; #define _MSERIAL(X) MSerial##X #define MSERIAL(X) _MSERIAL(X) -#define MSerial0 MSerial #if SERIAL_PORT == -1 - #define MYSERIAL0 SerialUSB + #define MYSERIAL1 SerialUSB #elif WITHIN(SERIAL_PORT, 0, 8) - #define MYSERIAL0 MSERIAL(SERIAL_PORT) + #define MYSERIAL1 MSERIAL(SERIAL_PORT) #else #error "The required SERIAL_PORT must be from -1 to 8. Please update your configuration." #endif #ifdef SERIAL_PORT_2 #if SERIAL_PORT_2 == -1 - #define MYSERIAL1 usbSerial + #define MYSERIAL2 usbSerial #elif SERIAL_PORT_2 == -2 - #define MYSERIAL1 ethernet.telnetClient + #define MYSERIAL2 ethernet.telnetClient #elif WITHIN(SERIAL_PORT_2, 0, 8) - #define MYSERIAL1 MSERIAL(SERIAL_PORT_2) + #define MYSERIAL2 MSERIAL(SERIAL_PORT_2) #else #error "SERIAL_PORT_2 must be from -2 to 8. Please update your configuration." #endif diff --git a/Marlin/src/core/serial.cpp b/Marlin/src/core/serial.cpp index 01f850ba56..326baf0c54 100644 --- a/Marlin/src/core/serial.cpp +++ b/Marlin/src/core/serial.cpp @@ -43,12 +43,12 @@ PGMSTR(SP_X_LBL, " X:"); PGMSTR(SP_Y_LBL, " Y:"); PGMSTR(SP_Z_LBL, " Z:"); PGMST #else #if HAS_ETHERNET // Runtime checking of the condition variable - ConditionalSerial serialOut1(ethernet.have_telnet_client, MYSERIAL1, false); // Takes reference here + ConditionalSerial serialOut2(ethernet.have_telnet_client, MYSERIAL2, false); // Takes reference here #else // Don't pay for runtime checking a true variable, instead use the output directly - #define serialOut1 MYSERIAL1 + #define serialOut2 MYSERIAL2 #endif - SerialOutputT multiSerial(MYSERIAL0, serialOut1); + SerialOutputT multiSerial(MYSERIAL1, serialOut2); #endif #endif diff --git a/Marlin/src/core/serial.h b/Marlin/src/core/serial.h index 57e9636be0..87c2a390db 100644 --- a/Marlin/src/core/serial.h +++ b/Marlin/src/core/serial.h @@ -69,15 +69,15 @@ extern uint8_t marlin_debug_flags; #ifdef SERIAL_CATCHALL typedef MultiSerial SerialOutputT; #else - typedef MultiSerial, decltype(MYSERIAL1)), 0> SerialOutputT; + typedef MultiSerial, decltype(MYSERIAL2)), 0> SerialOutputT; #endif - extern SerialOutputT multiSerial; - #define _SERIAL_IMPL multiSerial + extern SerialOutputT multiSerial; + #define _SERIAL_IMPL multiSerial #else #define _PORT_REDIRECT(n,p) NOOP #define _PORT_RESTORE(n) NOOP #define SERIAL_ASSERT(P) NOOP - #define _SERIAL_IMPL MYSERIAL0 + #define _SERIAL_IMPL MYSERIAL1 #endif #if ENABLED(MEATPACK) diff --git a/Marlin/src/core/serial_hook.h b/Marlin/src/core/serial_hook.h index 5e81e9e0e4..c687891fb4 100644 --- a/Marlin/src/core/serial_hook.h +++ b/Marlin/src/core/serial_hook.h @@ -257,8 +257,8 @@ struct MultiSerial : public SerialBase< MultiSerial, ConditionalSerial > Serial0Type; +typedef MultiSerial< RuntimeSerial, ConditionalSerial > Serial1Class; ``` To send the same output to 4 serial ports you could nest `MultiSerial` like this: ```cpp -typedef MultiSerial< MultiSerial< BaseSerial, BaseSerial >, MultiSerial< BaseSerial, BaseSerial, 2, 1>, 0, 2> Serial0Type; +typedef MultiSerial< MultiSerial< BaseSerial, BaseSerial >, MultiSerial< BaseSerial, BaseSerial, 2, 1>, 0, 2> Serial1Class; ``` The magical numbers here are the step and offset for computing the serial port. Simplifying the above monster a bit: ```cpp From 9cba3c87ef4ed7155db1a6e0e1664405c92af1e2 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 10 Mar 2021 12:05:27 -0600 Subject: [PATCH 123/253] Update MEATPACK test --- buildroot/tests/FYSETC_S6 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildroot/tests/FYSETC_S6 b/buildroot/tests/FYSETC_S6 index ce5442c376..4794e11354 100755 --- a/buildroot/tests/FYSETC_S6 +++ b/buildroot/tests/FYSETC_S6 @@ -9,7 +9,7 @@ set -e # Build examples restore_configs use_example_configs FYSETC/S6 -opt_enable MEATPACK +opt_enable MEATPACK_ON_SERIAL_PORT_1 opt_set Y_DRIVER_TYPE TMC2209 Z_DRIVER_TYPE TMC2130 exec_test $1 $2 "FYSETC S6 Example" "$3" From 048f6b4731366c8e843edac0adff1872e9e6763b Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 10 Mar 2021 12:35:26 -0600 Subject: [PATCH 124/253] Tricked-out declaration --- Marlin/src/HAL/TEENSY35_36/HAL.cpp | 7 ++++++- Marlin/src/HAL/TEENSY35_36/HAL.h | 10 ++++++++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/Marlin/src/HAL/TEENSY35_36/HAL.cpp b/Marlin/src/HAL/TEENSY35_36/HAL.cpp index fe2f79f415..8640bdfe00 100644 --- a/Marlin/src/HAL/TEENSY35_36/HAL.cpp +++ b/Marlin/src/HAL/TEENSY35_36/HAL.cpp @@ -31,7 +31,12 @@ #include -DefaultSerial1 MSerial0(false); +#define _IMPLEMENT_SERIAL(X) DefaultSerial##X MSerial##X(false) +#define IMPLEMENT_SERIAL(X) _IMPLEMENT_SERIAL(X) +#if WITHIN(SERIAL_PORT, 0, 3) + IMPLEMENT_SERIAL(SERIAL_PORT); +#endif + USBSerialType USBSerial(false, SerialUSB); uint16_t HAL_adc_result, HAL_adc_select; diff --git a/Marlin/src/HAL/TEENSY35_36/HAL.h b/Marlin/src/HAL/TEENSY35_36/HAL.h index 48fee6b9a9..e769454b3f 100644 --- a/Marlin/src/HAL/TEENSY35_36/HAL.h +++ b/Marlin/src/HAL/TEENSY35_36/HAL.h @@ -54,8 +54,13 @@ #endif #include "../../core/serial_hook.h" -typedef Serial1Class DefaultSerial1; -extern DefaultSerial1 MSerial0; + +#define Serial0 Serial +#define _DECLARE_SERIAL(X) \ + typedef Serial1Class DefaultSerial##X; \ + extern DefaultSerial##X MSerial##X +#define DECLARE_SERIAL(X) _DECLARE_SERIAL(X) + typedef ForwardSerial1Class USBSerialType; extern USBSerialType USBSerial; @@ -66,6 +71,7 @@ extern USBSerialType USBSerial; #define MYSERIAL1 USBSerial #elif WITHIN(SERIAL_PORT, 0, 3) #define MYSERIAL1 MSERIAL(SERIAL_PORT) + DECLARE_SERIAL(SERIAL_PORT); #endif #define HAL_SERVO_LIB libServo From f147a8990a68503cd5eb2bb0fc7b26b7c00efe91 Mon Sep 17 00:00:00 2001 From: X-Ryl669 Date: Wed, 10 Mar 2021 21:22:20 +0100 Subject: [PATCH 125/253] Fix MeatPack with per-serial-port instances (#21306) --- Marlin/Configuration_adv.h | 4 ++- Marlin/src/core/serial.cpp | 29 ++++++++-------- Marlin/src/core/serial.h | 56 +++++++++++++++++++++++------- Marlin/src/feature/meatpack.cpp | 12 ++----- Marlin/src/feature/meatpack.h | 39 ++++++++++----------- Marlin/src/gcode/host/M115.cpp | 2 +- Marlin/src/inc/Conditionals_post.h | 4 +++ Marlin/src/inc/SanityCheck.h | 6 ++-- platformio.ini | 2 +- 9 files changed, 90 insertions(+), 64 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 868b0c239a..9ab3e2d044 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -3373,7 +3373,9 @@ //#define GCODE_QUOTED_STRINGS // Support for quoted string parameters #endif -//#define MEATPACK // Support for MeatPack G-code compression (https://github.com/scottmudge/OctoPrint-MeatPack) +// Support for MeatPack G-code compression (https://github.com/scottmudge/OctoPrint-MeatPack) +//#define MEATPACK_ON_SERIAL_PORT_1 +//#define MEATPACK_ON_SERIAL_PORT_2 //#define GCODE_CASE_INSENSITIVE // Accept G-code sent to the firmware in lowercase diff --git a/Marlin/src/core/serial.cpp b/Marlin/src/core/serial.cpp index 326baf0c54..dcbfd608bf 100644 --- a/Marlin/src/core/serial.cpp +++ b/Marlin/src/core/serial.cpp @@ -37,23 +37,22 @@ PGMSTR(SP_A_STR, " A"); PGMSTR(SP_B_STR, " B"); PGMSTR(SP_C_STR, " C"); PGMSTR(SP_X_STR, " X"); PGMSTR(SP_Y_STR, " Y"); PGMSTR(SP_Z_STR, " Z"); PGMSTR(SP_E_STR, " E"); PGMSTR(SP_X_LBL, " X:"); PGMSTR(SP_Y_LBL, " Y:"); PGMSTR(SP_Z_LBL, " Z:"); PGMSTR(SP_E_LBL, " E:"); -#if HAS_MULTI_SERIAL - #ifdef SERIAL_CATCHALL - SerialOutputT multiSerial(MYSERIAL, SERIAL_CATCHALL); - #else - #if HAS_ETHERNET - // Runtime checking of the condition variable - ConditionalSerial serialOut2(ethernet.have_telnet_client, MYSERIAL2, false); // Takes reference here - #else - // Don't pay for runtime checking a true variable, instead use the output directly - #define serialOut2 MYSERIAL2 - #endif - SerialOutputT multiSerial(MYSERIAL1, serialOut2); - #endif +// Hook Meatpack if it's enabled on the first leaf +#if ENABLED(MEATPACK_ON_SERIAL_PORT_1) + SerialLeafT1 mpSerial1(false, _SERIAL_LEAF_1); +#endif +#if ENABLED(MEATPACK_ON_SERIAL_PORT_2) + SerialLeafT2 mpSerial2(false, _SERIAL_LEAF_2); #endif -#if ENABLED(MEATPACK) - MeatpackSerial mpSerial(false, _SERIAL_IMPL); +// Step 2: For multiserial, handle the second serial port as well +#if HAS_MULTI_SERIAL + #if HAS_ETHERNET + // We need a definition here + SerialLeafT2 msSerial2(ethernet.have_telnet_client, MYSERIAL2, false); + #endif + + SerialOutputT multiSerial(SERIAL_LEAF_1, SERIAL_LEAF_2); #endif void serialprintPGM(PGM_P str) { diff --git a/Marlin/src/core/serial.h b/Marlin/src/core/serial.h index 87c2a390db..2f23e4e3c2 100644 --- a/Marlin/src/core/serial.h +++ b/Marlin/src/core/serial.h @@ -24,7 +24,7 @@ #include "../inc/MarlinConfig.h" #include "serial_hook.h" -#if ENABLED(MEATPACK) +#if HAS_MEATPACK #include "../feature/meatpack.h" #endif @@ -62,29 +62,59 @@ extern uint8_t marlin_debug_flags; // // Serial redirection // +// Step 1: Find what's the first serial leaf +#if BOTH(HAS_MULTI_SERIAL, SERIAL_CATCHALL) + #define _SERIAL_LEAF_1 MYSERIAL +#else + #define _SERIAL_LEAF_1 MYSERIAL1 +#endif + +// Hook Meatpack if it's enabled on the first leaf +#if ENABLED(MEATPACK_ON_SERIAL_PORT_1) + typedef MeatpackSerial SerialLeafT1; + extern SerialLeafT1 mpSerial1; + #define SERIAL_LEAF_1 mpSerial1 +#else + #define SERIAL_LEAF_1 _SERIAL_LEAF_1 +#endif + +// Step 2: For multiserial, handle the second serial port as well #if HAS_MULTI_SERIAL #define _PORT_REDIRECT(n,p) REMEMBER(n,multiSerial.portMask,p) #define _PORT_RESTORE(n,p) RESTORE(n) #define SERIAL_ASSERT(P) if(multiSerial.portMask!=(P)){ debugger(); } + // If we have a catchall, use that directly #ifdef SERIAL_CATCHALL - typedef MultiSerial SerialOutputT; + #define _SERIAL_LEAF_2 SERIAL_CATCHALL #else - typedef MultiSerial, decltype(MYSERIAL2)), 0> SerialOutputT; + #if HAS_ETHERNET + // We need to create an instance here + typedef ConditionalSerial SerialLeafT2; + extern SerialLeafT2 msSerial2; + #define _SERIAL_LEAF_2 msSerial2 + #else + // Don't create a useless instance here, directly use the existing instance + #define _SERIAL_LEAF_2 MYSERIAL2 + #endif #endif - extern SerialOutputT multiSerial; - #define _SERIAL_IMPL multiSerial + + // Hook Meatpack if it's enabled on the second leaf + #if ENABLED(MEATPACK_ON_SERIAL_PORT_2) + typedef MeatpackSerial SerialLeafT2; + extern SerialLeafT2 mpSerial2; + #define SERIAL_LEAF_2 mpSerial2 + #else + #define SERIAL_LEAF_2 _SERIAL_LEAF_2 + #endif + + typedef MultiSerial SerialOutputT; + extern SerialOutputT multiSerial; + #define SERIAL_IMPL multiSerial #else #define _PORT_REDIRECT(n,p) NOOP #define _PORT_RESTORE(n) NOOP #define SERIAL_ASSERT(P) NOOP - #define _SERIAL_IMPL MYSERIAL1 -#endif - -#if ENABLED(MEATPACK) - extern MeatpackSerial mpSerial; - #define SERIAL_IMPL mpSerial -#else - #define SERIAL_IMPL _SERIAL_IMPL + #define SERIAL_IMPL SERIAL_LEAF_1 #endif #define SERIAL_OUT(WHAT, V...) (void)SERIAL_IMPL.WHAT(V) diff --git a/Marlin/src/feature/meatpack.cpp b/Marlin/src/feature/meatpack.cpp index 7e81dbed79..178831c9bb 100644 --- a/Marlin/src/feature/meatpack.cpp +++ b/Marlin/src/feature/meatpack.cpp @@ -39,7 +39,7 @@ #include "../inc/MarlinConfig.h" -#if ENABLED(MEATPACK) +#if HAS_MEATPACK #include "meatpack.h" MeatPack meatpack; @@ -50,14 +50,6 @@ MeatPack meatpack; #define DEBUG_OUT ENABLED(MP_DEBUG) #include "../core/debug_out.h" -bool MeatPack::cmd_is_next = false; // A command is pending -uint8_t MeatPack::state = 0; // Configuration state OFF -uint8_t MeatPack::second_char = 0; // The unpacked 2nd character from an out-of-sequence packed pair -uint8_t MeatPack::cmd_count = 0, // Counts how many command bytes are received (need 2) - MeatPack::full_char_count = 0, // Counts how many full-width characters are to be received - MeatPack::char_out_count = 0; // Stores number of characters to be read out. -uint8_t MeatPack::char_out_buf[2]; // Output buffer for caching up to 2 characters - // The 15 most-common characters used in G-code, ~90-95% of all G-code uses these characters // Stored in SRAM for performance. uint8_t meatPackLookupTable[16] = { @@ -223,4 +215,4 @@ uint8_t MeatPack::get_result_char(char* const __restrict out) { return res; } -#endif // MEATPACK +#endif // HAS_MEATPACK diff --git a/Marlin/src/feature/meatpack.h b/Marlin/src/feature/meatpack.h index 96004cfeaf..80f4570e03 100644 --- a/Marlin/src/feature/meatpack.h +++ b/Marlin/src/feature/meatpack.h @@ -90,18 +90,18 @@ class MeatPack { static const uint8_t kSpaceCharIdx = 11; static const char kSpaceCharReplace = 'E'; - static bool cmd_is_next; // A command is pending - static uint8_t state; // Configuration state - static uint8_t second_char; // Buffers a character if dealing with out-of-sequence pairs - static uint8_t cmd_count, // Counter of command bytes received (need 2) - full_char_count, // Counter for full-width characters to be received - char_out_count; // Stores number of characters to be read out. - static uint8_t char_out_buf[2]; // Output buffer for caching up to 2 characters + bool cmd_is_next; // A command is pending + uint8_t state; // Configuration state + uint8_t second_char; // Buffers a character if dealing with out-of-sequence pairs + uint8_t cmd_count, // Counter of command bytes received (need 2) + full_char_count, // Counter for full-width characters to be received + char_out_count; // Stores number of characters to be read out. + uint8_t char_out_buf[2]; // Output buffer for caching up to 2 characters public: // Pass in a character rx'd by SD card or serial. Automatically parses command/ctrl sequences, // and will control state internally. - static void handle_rx_char(const uint8_t c, const serial_index_t serial_ind); + void handle_rx_char(const uint8_t c, const serial_index_t serial_ind); /** * After passing in rx'd char using above method, call this to get characters out. @@ -109,24 +109,25 @@ public: * @param out [in] Output pointer for unpacked/processed data. * @return Number of characters returned. Range from 0 to 2. */ - static uint8_t get_result_char(char* const __restrict out); + uint8_t get_result_char(char* const __restrict out); - static void reset_state(); - static void report_state(); - static uint8_t unpack_chars(const uint8_t pk, uint8_t* __restrict const chars_out); - static void handle_command(const MeatPack_Command c); - static void handle_output_char(const uint8_t c); - static void handle_rx_char_inner(const uint8_t c); + void reset_state(); + void report_state(); + uint8_t unpack_chars(const uint8_t pk, uint8_t* __restrict const chars_out); + void handle_command(const MeatPack_Command c); + void handle_output_char(const uint8_t c); + void handle_rx_char_inner(const uint8_t c); + + MeatPack() : cmd_is_next(false), state(0), second_char(0), cmd_count(0), full_char_count(0), char_out_count(0) {} }; -extern MeatPack meatpack; - // Implement the MeatPack serial class so it's transparent to rest of the code template struct MeatpackSerial : public SerialBase > { typedef SerialBase< MeatpackSerial > BaseClassT; SerialT & out; + MeatPack meatpack; char serialBuffer[2]; uint8_t charCount; @@ -143,10 +144,6 @@ struct MeatpackSerial : public SerialBase > { void flushTX() { CALL_IF_EXISTS(void, &out, flushTX); } int available(serial_index_t index) { - // There is a potential issue here with multiserial, since it'll return its decoded buffer whatever the serial index here. - // So, instead of doing MeatpackSerial> we should do MultiSerial, MeatpackSerial<...>> - // TODO, let's fix this later on - if (charCount) return charCount; // The buffer still has data if (out.available(index) <= 0) return 0; // No data to read diff --git a/Marlin/src/gcode/host/M115.cpp b/Marlin/src/gcode/host/M115.cpp index 4b7b268688..cd6fcbaf86 100644 --- a/Marlin/src/gcode/host/M115.cpp +++ b/Marlin/src/gcode/host/M115.cpp @@ -145,7 +145,7 @@ void GcodeSuite::M115() { cap_line(PSTR("COOLER_TEMPERATURE"), ENABLED(HAS_COOLER)); // MEATPACK Compression - cap_line(PSTR("MEATPACK"), ENABLED(MEATPACK)); + cap_line(PSTR("MEATPACK"), ENABLED(HAS_MEATPACK)); // Machine Geometry #if ENABLED(M115_GEOMETRY_REPORT) diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index e8ed0d5a91..7dc75db1c2 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -2912,3 +2912,7 @@ #elif NUM_SERIAL > 1 #define HAS_MULTI_SERIAL 1 #endif + +#if ENABLED(MEATPACK_ON_SERIAL_PORT_1) || BOTH(HAS_MULTI_SERIAL, MEATPACK_ON_SERIAL_PORT_2) + #define HAS_MEATPACK 1 +#endif diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 8c92cf2c63..6802bff1dd 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -551,6 +551,8 @@ #error "UNKNOWN_Z_NO_RAISE is replaced by setting Z_IDLE_HEIGHT to Z_MAX_POS." #elif defined(Z_AFTER_DEACTIVATE) #error "Z_AFTER_DEACTIVATE is replaced by Z_IDLE_HEIGHT." +#elif defined(MEATPACK) + #error "MEATPACK is now enabled with MEATPACK_ON_SERIAL_PORT_1, MEATPACK_ON_SERIAL_PORT_2, etc." #endif /** @@ -3340,8 +3342,8 @@ static_assert( _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2) /** * Sanity Check for MEATPACK and BINARY_FILE_TRANSFER Features */ -#if BOTH(MEATPACK, BINARY_FILE_TRANSFER) - #error "Either enable MEATPACK or BINARY_FILE_TRANSFER, not both." +#if BOTH(HAS_MEATPACK, BINARY_FILE_TRANSFER) + #error "Either enable MEATPACK_ON_SERIAL_PORT_* or BINARY_FILE_TRANSFER, not both." #endif /** diff --git a/platformio.ini b/platformio.ini index b8235c84fd..3b1604a296 100644 --- a/platformio.ini +++ b/platformio.ini @@ -332,7 +332,7 @@ PCA9632 = src_filter=+ PRINTER_EVENT_LEDS = src_filter=+ TEMP_STAT_LEDS = src_filter=+ MAX7219_DEBUG = src_filter=+ + -MEATPACK = src_filter=+ +HAS_MEATPACK = src_filter=+ MIXING_EXTRUDER = src_filter=+ + HAS_PRUSA_MMU1 = src_filter=+ HAS_PRUSA_MMU2 = src_filter=+ + From 8c512191b2f3c3c937ce12da25b8203b464dfc6d Mon Sep 17 00:00:00 2001 From: Cal1sto <47449942+Cal1sto@users.noreply.github.com> Date: Wed, 10 Mar 2021 21:37:22 +0100 Subject: [PATCH 126/253] Fix TouchMI stow in G34 (#21291) --- Marlin/src/gcode/calibrate/G34_M422.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Marlin/src/gcode/calibrate/G34_M422.cpp b/Marlin/src/gcode/calibrate/G34_M422.cpp index 50476e8e7c..bee6aaedeb 100644 --- a/Marlin/src/gcode/calibrate/G34_M422.cpp +++ b/Marlin/src/gcode/calibrate/G34_M422.cpp @@ -410,9 +410,9 @@ void GcodeSuite::G34() { SERIAL_ECHOLNPAIR_F("Accuracy: ", z_maxdiff); } - // Stow the probe, as the last call to probe.probe_at_point(...) left - // the probe deployed if it was successful. - probe.stow(); + // Stow the probe because the last call to probe.probe_at_point(...) + // leaves the probe deployed when it's successful. + IF_DISABLED(TOUCH_MI_PROBE, probe.stow()); #if ENABLED(HOME_AFTER_G34) // After this operation the z position needs correction From 4d6ebf95fced1393d13f1cf4b43fe789754e3141 Mon Sep 17 00:00:00 2001 From: Keith Bennett <13375512+thisiskeithb@users.noreply.github.com> Date: Wed, 10 Mar 2021 12:57:54 -0800 Subject: [PATCH 127/253] Fix LERDGE 'extends' env references (#21305) Co-authored-by: Scott Lahteine --- platformio.ini | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/platformio.ini b/platformio.ini index 3b1604a296..11dcecfc99 100644 --- a/platformio.ini +++ b/platformio.ini @@ -1401,7 +1401,7 @@ board_build.firmware = Lerdge_X_firmware_force.bin # [env:LERDGEX_usb_flash_drive] platform = ${env:LERDGEX.platform} -extends = LERDGEX +extends = env:LERDGEX platform_packages = ${stm32_flash_drive.platform_packages} build_flags = ${stm32_flash_drive.build_flags} @@ -1418,7 +1418,7 @@ board_build.firmware = Lerdge_firmware_force.bin # [env:LERDGES_usb_flash_drive] platform = ${env:LERDGES.platform} -extends = LERDGES +extends = env:LERDGES platform_packages = ${stm32_flash_drive.platform_packages} build_flags = ${stm32_flash_drive.build_flags} @@ -1437,7 +1437,7 @@ build_flags = ${lerdge_common.build_flags} # [env:LERDGEK_usb_flash_drive] platform = ${env:LERDGEK.platform} -extends = LERDGEK +extends = env:LERDGEK platform_packages = ${stm32_flash_drive.platform_packages} build_flags = ${stm32_flash_drive.build_flags} From f671e6d1382c0d275e96b3ad67e4fb326cc8807a Mon Sep 17 00:00:00 2001 From: Evgeny Z Date: Thu, 11 Mar 2021 00:02:29 +0300 Subject: [PATCH 128/253] Lerdge-K TMC 2208/9 UART pins (#21299) --- Marlin/src/pins/stm32f4/pins_LERDGE_K.h | 44 +++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/Marlin/src/pins/stm32f4/pins_LERDGE_K.h b/Marlin/src/pins/stm32f4/pins_LERDGE_K.h index fad8d2059e..1bc7bbc99e 100644 --- a/Marlin/src/pins/stm32f4/pins_LERDGE_K.h +++ b/Marlin/src/pins/stm32f4/pins_LERDGE_K.h @@ -96,6 +96,50 @@ // #define E1_CS_PIN PE4 //#endif +#if HAS_TMC_UART + /** + * TMC2208/TMC2209 stepper drivers + */ + #ifndef X_SERIAL_TX_PIN + #define X_SERIAL_TX_PIN PB2 + #endif + #ifndef X_SERIAL_RX_PIN + #define X_SERIAL_RX_PIN PB2 + #endif + #ifndef Y_SERIAL_TX_PIN + #define Y_SERIAL_TX_PIN PE2 + #endif + #ifndef Y_SERIAL_RX_PIN + #define Y_SERIAL_RX_PIN PE2 + #endif + #ifndef Z_SERIAL_TX_PIN + #define Z_SERIAL_TX_PIN PE3 + #endif + #ifndef Z_SERIAL_RX_PIN + #define Z_SERIAL_RX_PIN PE3 + #endif + #ifndef E0_SERIAL_TX_PIN + #define E0_SERIAL_TX_PIN PE4 + #endif + #ifndef E0_SERIAL_RX_PIN + #define E0_SERIAL_RX_PIN PE4 + #endif + #ifndef E1_SERIAL_TX_PIN + #define E1_SERIAL_TX_PIN PE1 + #endif + #ifndef E1_SERIAL_RX_PIN + #define E1_SERIAL_RX_PIN PE1 + #endif + #ifndef EX_SERIAL_TX_PIN + #define E2_SERIAL_TX_PIN PE0 + #endif + #ifndef EX_SERIAL_RX_PIN + #define E2_SERIAL_RX_PIN PE0 + #endif + // Reduce baud rate to improve software serial reliability + #define TMC_BAUD_RATE 19200 +#endif + // // Temperature Sensors // From 8857fc6c4b7dda4bd4a0907050c81183d989c0e9 Mon Sep 17 00:00:00 2001 From: ellensp Date: Thu, 11 Mar 2021 11:02:35 +1300 Subject: [PATCH 129/253] Fix password menu stickiness before first auth (#21295) --- Marlin/src/feature/password/password.cpp | 11 +++++++---- Marlin/src/feature/password/password.h | 4 ++-- Marlin/src/lcd/menu/menu_password.cpp | 13 +++++++++---- 3 files changed, 18 insertions(+), 10 deletions(-) diff --git a/Marlin/src/feature/password/password.cpp b/Marlin/src/feature/password/password.cpp index 90bb647118..4e841c243c 100644 --- a/Marlin/src/feature/password/password.cpp +++ b/Marlin/src/feature/password/password.cpp @@ -31,7 +31,7 @@ Password password; // public: -bool Password::is_set, Password::is_locked; +bool Password::is_set, Password::is_locked, Password::did_first_run; // = false uint32_t Password::value, Password::value_entry; // @@ -47,11 +47,14 @@ void Password::lock_machine() { // Authentication check // void Password::authentication_check() { - if (value_entry == value) + if (value_entry == value) { is_locked = false; - else + did_first_run = true; + } + else { + is_locked = true; SERIAL_ECHOLNPGM(STR_WRONG_PASSWORD); - + } TERN_(HAS_LCD_MENU, authentication_done()); } diff --git a/Marlin/src/feature/password/password.h b/Marlin/src/feature/password/password.h index 1382d6df40..829d222e20 100644 --- a/Marlin/src/feature/password/password.h +++ b/Marlin/src/feature/password/password.h @@ -25,10 +25,10 @@ class Password { public: - static bool is_set, is_locked; + static bool is_set, is_locked, did_first_run; static uint32_t value, value_entry; - Password() { is_locked = false; } + Password() {} static void lock_machine(); static void authentication_check(); diff --git a/Marlin/src/lcd/menu/menu_password.cpp b/Marlin/src/lcd/menu/menu_password.cpp index 80c5c3dc66..590ce48d59 100644 --- a/Marlin/src/lcd/menu/menu_password.cpp +++ b/Marlin/src/lcd/menu/menu_password.cpp @@ -44,12 +44,18 @@ static uint8_t digit_no; // Screen for both editing and setting the password // void Password::menu_password_entry() { + ui.defer_status_screen(!did_first_run); // No timeout to status before first auth + START_MENU(); // "Login" or "New Code" STATIC_ITEM_P(authenticating ? GET_TEXT(MSG_LOGIN_REQUIRED) : GET_TEXT(MSG_EDIT_PASSWORD), SS_CENTER|SS_INVERT); - STATIC_ITEM_P(NUL_STR, SS_CENTER|SS_INVERT, string); + STATIC_ITEM_P(NUL_STR, SS_CENTER, string); + + #if HAS_MARLINUI_U8GLIB + STATIC_ITEM_P(NUL_STR, SS_CENTER, ""); + #endif // Make the digit edit item look like a sub-menu PGM_P const label = GET_TEXT(MSG_ENTER_DIGIT); @@ -57,7 +63,7 @@ void Password::menu_password_entry() { MENU_ITEM_ADDON_START(utf8_strlen_P(label) + 1); lcd_put_wchar(' '); lcd_put_wchar('1' + digit_no); - SETCURSOR_X(LCD_WIDTH - 1); + SETCURSOR_X(LCD_WIDTH - 2); lcd_put_wchar('>'); MENU_ITEM_ADDON_END(); @@ -104,7 +110,7 @@ void Password::screen_password_entry() { value_entry = 0; digit_no = 0; editable.uint8 = 0; - memset(string, '-', PASSWORD_LENGTH); + memset(string, '_', PASSWORD_LENGTH); string[PASSWORD_LENGTH] = '\0'; menu_password_entry(); } @@ -120,7 +126,6 @@ void Password::authenticate_user(const screenFunc_t in_succ_scr, const screenFun if (is_set) { authenticating = true; ui.goto_screen(screen_password_entry); - ui.defer_status_screen(); ui.update(); } else { From a73cff8e4fa5c856859093d54b9427d889049734 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Thu, 11 Mar 2021 00:13:08 +0000 Subject: [PATCH 130/253] [cron] Bump distribution date (2021-03-11) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index df29952479..8f98dea437 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2021-03-10" + #define STRING_DISTRIBUTION_DATE "2021-03-11" #endif /** From 03a41021def9513d4a77caf3c82a0733b7686193 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Fri, 12 Mar 2021 00:13:16 +0000 Subject: [PATCH 131/253] [cron] Bump distribution date (2021-03-12) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 8f98dea437..c9760f3f69 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2021-03-11" + #define STRING_DISTRIBUTION_DATE "2021-03-12" #endif /** From 6e1024737d0f74cdc7aed99a9275e071283fe4b7 Mon Sep 17 00:00:00 2001 From: Evgeny Z Date: Fri, 12 Mar 2021 05:12:24 +0300 Subject: [PATCH 132/253] =?UTF-8?q?Lerdge-X=20I=C2=B2C=20EEPROM=20pins,=20?= =?UTF-8?q?size=20(#21322)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Marlin/src/pins/stm32f4/pins_LERDGE_X.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Marlin/src/pins/stm32f4/pins_LERDGE_X.h b/Marlin/src/pins/stm32f4/pins_LERDGE_X.h index 974392373f..3a9c286e00 100644 --- a/Marlin/src/pins/stm32f4/pins_LERDGE_X.h +++ b/Marlin/src/pins/stm32f4/pins_LERDGE_X.h @@ -32,6 +32,9 @@ #define TEMP_TIMER 2 #define I2C_EEPROM +#define I2C_SCL_PIN PB8 +#define I2C_SDA_PIN PB9 +#define MARLIN_EEPROM_SIZE 0x10000 // FM24CL64 F-RAM 64K (8Kx8) // USB Flash Drive support #define HAS_OTG_USB_HOST_SUPPORT From 9dc2712c47f9ce6e5eb0c388a3d50a3a28574c27 Mon Sep 17 00:00:00 2001 From: X-Ryl669 Date: Fri, 12 Mar 2021 12:25:30 +0100 Subject: [PATCH 133/253] Undef unused 2nd serial option(s) (#21331) Co-authored-by: Scott Lahteine --- Marlin/src/inc/Conditionals_post.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index 7dc75db1c2..a6567e9714 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -2913,6 +2913,9 @@ #define HAS_MULTI_SERIAL 1 #endif -#if ENABLED(MEATPACK_ON_SERIAL_PORT_1) || BOTH(HAS_MULTI_SERIAL, MEATPACK_ON_SERIAL_PORT_2) +#if !HAS_MULTI_SERIAL + #undef MEATPACK_ON_SERIAL_PORT_2 +#endif +#if EITHER(MEATPACK_ON_SERIAL_PORT_1, MEATPACK_ON_SERIAL_PORT_2) #define HAS_MEATPACK 1 #endif From 1affbe2100c32f79d469b059be3eddd364a80431 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 12 Mar 2021 06:54:42 -0600 Subject: [PATCH 134/253] Clean up, optimize ExtUI/TFT code (#21333) --- Marlin/src/feature/bedlevel/bedlevel.cpp | 2 +- Marlin/src/feature/bedlevel/bedlevel.h | 2 +- Marlin/src/lcd/extui/anycubic_chiron_lcd.cpp | 8 +- Marlin/src/lcd/extui/anycubic_i3mega_lcd.cpp | 6 +- Marlin/src/lcd/extui/dgus_lcd.cpp | 10 +- Marlin/src/lcd/extui/example.cpp | 8 +- .../lib/anycubic_chiron/FileNavigator.cpp | 2 +- .../extui/lib/anycubic_chiron/chiron_tft.cpp | 5 +- .../extui/lib/anycubic_chiron/chiron_tft.h | 67 ++--- .../lib/anycubic_chiron/chiron_tft_defs.h | 4 +- .../anycubic_i3mega/anycubic_i3mega_lcd.cpp | 232 +++++++++--------- .../lib/anycubic_i3mega/anycubic_i3mega_lcd.h | 78 +++--- .../lib/ftdi_eve_touch_ui/marlin_events.cpp | 2 +- .../screens/bed_mesh_screen.h | 2 +- .../screens/stress_test_screen.cpp | 4 +- .../screens/temperature_screen.cpp | 7 +- Marlin/src/lcd/extui/malyan_lcd.cpp | 2 +- Marlin/src/lcd/extui/ui_api.cpp | 135 +++++----- Marlin/src/lcd/extui/ui_api.h | 73 +++--- Marlin/src/sd/cardreader.h | 2 - 20 files changed, 319 insertions(+), 332 deletions(-) diff --git a/Marlin/src/feature/bedlevel/bedlevel.cpp b/Marlin/src/feature/bedlevel/bedlevel.cpp index 2ad4ffecaf..3680fbac05 100644 --- a/Marlin/src/feature/bedlevel/bedlevel.cpp +++ b/Marlin/src/feature/bedlevel/bedlevel.cpp @@ -98,7 +98,7 @@ TemporaryBedLevelingState::TemporaryBedLevelingState(const bool enable) : saved( #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) - void set_z_fade_height(const float zfh, const bool do_report/*=true*/) { + void set_z_fade_height(const float &zfh, const bool do_report/*=true*/) { if (planner.z_fade_height == zfh) return; diff --git a/Marlin/src/feature/bedlevel/bedlevel.h b/Marlin/src/feature/bedlevel/bedlevel.h index a33f08ad0e..3e89a08802 100644 --- a/Marlin/src/feature/bedlevel/bedlevel.h +++ b/Marlin/src/feature/bedlevel/bedlevel.h @@ -38,7 +38,7 @@ void set_bed_leveling_enabled(const bool enable=true); void reset_bed_level(); #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) - void set_z_fade_height(const float zfh, const bool do_report=true); + void set_z_fade_height(const float &zfh, const bool do_report=true); #endif #if EITHER(MESH_BED_LEVELING, PROBE_MANUALLY) diff --git a/Marlin/src/lcd/extui/anycubic_chiron_lcd.cpp b/Marlin/src/lcd/extui/anycubic_chiron_lcd.cpp index 06baa4c19d..a424327b08 100644 --- a/Marlin/src/lcd/extui/anycubic_chiron_lcd.cpp +++ b/Marlin/src/lcd/extui/anycubic_chiron_lcd.cpp @@ -74,7 +74,7 @@ namespace ExtUI { // into buff. // Example: - // static_assert(sizeof(myDataStruct) <= ExtUI::eeprom_data_size); + // static_assert(sizeof(myDataStruct) <= eeprom_data_size); // memcpy(buff, &myDataStruct, sizeof(myDataStruct)); } @@ -84,7 +84,7 @@ namespace ExtUI { // from buff // Example: - // static_assert(sizeof(myDataStruct) <= ExtUI::eeprom_data_size); + // static_assert(sizeof(myDataStruct) <= eeprom_data_size); // memcpy(&myDataStruct, buff, sizeof(myDataStruct)); } @@ -101,12 +101,12 @@ namespace ExtUI { #if HAS_MESH void onMeshLevelingStart() {} - void onMeshUpdate(const int8_t xpos, const int8_t ypos, const float zval) { + void onMeshUpdate(const int8_t xpos, const int8_t ypos, const float &zval) { // Called when any mesh points are updated //SERIAL_ECHOLNPAIR("onMeshUpdate() x:", xpos, " y:", ypos, " z:", zval); } - void onMeshUpdate(const int8_t xpos, const int8_t ypos, const ExtUI::probe_state_t state) { + void onMeshUpdate(const int8_t xpos, const int8_t ypos, const probe_state_t state) { // Called to indicate a special condition //SERIAL_ECHOLNPAIR("onMeshUpdate() x:", xpos, " y:", ypos, " state:", state); } diff --git a/Marlin/src/lcd/extui/anycubic_i3mega_lcd.cpp b/Marlin/src/lcd/extui/anycubic_i3mega_lcd.cpp index e2bd96068c..939199db93 100644 --- a/Marlin/src/lcd/extui/anycubic_i3mega_lcd.cpp +++ b/Marlin/src/lcd/extui/anycubic_i3mega_lcd.cpp @@ -65,7 +65,7 @@ namespace ExtUI { // into buff. // Example: - // static_assert(sizeof(myDataStruct) <= ExtUI::eeprom_data_size); + // static_assert(sizeof(myDataStruct) <= eeprom_data_size); // memcpy(buff, &myDataStruct, sizeof(myDataStruct)); } @@ -75,7 +75,7 @@ namespace ExtUI { // from buff // Example: - // static_assert(sizeof(myDataStruct) <= ExtUI::eeprom_data_size); + // static_assert(sizeof(myDataStruct) <= eeprom_data_size); // memcpy(&myDataStruct, buff, sizeof(myDataStruct)); } @@ -93,7 +93,7 @@ namespace ExtUI { void onMeshLevelingStart() {} - void onMeshUpdate(const int8_t xpos, const int8_t ypos, const float zval) { + void onMeshUpdate(const int8_t xpos, const int8_t ypos, const float &zval) { // Called when any mesh points are updated } #endif diff --git a/Marlin/src/lcd/extui/dgus_lcd.cpp b/Marlin/src/lcd/extui/dgus_lcd.cpp index 9e6ca1b64c..273a8d2d2a 100644 --- a/Marlin/src/lcd/extui/dgus_lcd.cpp +++ b/Marlin/src/lcd/extui/dgus_lcd.cpp @@ -61,7 +61,7 @@ namespace ExtUI { void onUserConfirmRequired(const char * const msg) { if (msg) { ScreenHandler.sendinfoscreen(PSTR("Please confirm."), nullptr, msg, nullptr, true, true, false, true); - ScreenHandler.SetupConfirmAction(ExtUI::setUserConfirmed); + ScreenHandler.SetupConfirmAction(setUserConfirmed); ScreenHandler.GotoScreen(DGUSLCD_SCREEN_POPUP); } else if (ScreenHandler.getCurrentScreen() == DGUSLCD_SCREEN_POPUP ) { @@ -84,7 +84,7 @@ namespace ExtUI { // into buff. // Example: - // static_assert(sizeof(myDataStruct) <= ExtUI::eeprom_data_size); + // static_assert(sizeof(myDataStruct) <= eeprom_data_size); // memcpy(buff, &myDataStruct, sizeof(myDataStruct)); } @@ -94,7 +94,7 @@ namespace ExtUI { // from buff // Example: - // static_assert(sizeof(myDataStruct) <= ExtUI::eeprom_data_size); + // static_assert(sizeof(myDataStruct) <= eeprom_data_size); // memcpy(&myDataStruct, buff, sizeof(myDataStruct)); } @@ -111,11 +111,11 @@ namespace ExtUI { #if HAS_MESH void onMeshLevelingStart() {} - void onMeshUpdate(const int8_t xpos, const int8_t ypos, const float zval) { + void onMeshUpdate(const int8_t xpos, const int8_t ypos, const float &zval) { // Called when any mesh points are updated } - void onMeshUpdate(const int8_t xpos, const int8_t ypos, const ExtUI::probe_state_t state) { + void onMeshUpdate(const int8_t xpos, const int8_t ypos, const probe_state_t state) { // Called to indicate a special condition } #endif diff --git a/Marlin/src/lcd/extui/example.cpp b/Marlin/src/lcd/extui/example.cpp index dd4b3312eb..415d381dd6 100644 --- a/Marlin/src/lcd/extui/example.cpp +++ b/Marlin/src/lcd/extui/example.cpp @@ -70,7 +70,7 @@ namespace ExtUI { // into buff. // Example: - // static_assert(sizeof(myDataStruct) <= ExtUI::eeprom_data_size); + // static_assert(sizeof(myDataStruct) <= eeprom_data_size); // memcpy(buff, &myDataStruct, sizeof(myDataStruct)); } @@ -80,7 +80,7 @@ namespace ExtUI { // from buff // Example: - // static_assert(sizeof(myDataStruct) <= ExtUI::eeprom_data_size); + // static_assert(sizeof(myDataStruct) <= eeprom_data_size); // memcpy(&myDataStruct, buff, sizeof(myDataStruct)); } @@ -97,11 +97,11 @@ namespace ExtUI { #if HAS_MESH void onMeshLevelingStart() {} - void onMeshUpdate(const int8_t xpos, const int8_t ypos, const float zval) { + void onMeshUpdate(const int8_t xpos, const int8_t ypos, const float &zval) { // Called when any mesh points are updated } - void onMeshUpdate(const int8_t xpos, const int8_t ypos, const ExtUI::probe_state_t state) { + void onMeshUpdate(const int8_t xpos, const int8_t ypos, const probe_state_t state) { // Called to indicate a special condition } #endif diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/FileNavigator.cpp b/Marlin/src/lcd/extui/lib/anycubic_chiron/FileNavigator.cpp index 7d813a6ab0..25847ae96c 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_chiron/FileNavigator.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic_chiron/FileNavigator.cpp @@ -73,7 +73,7 @@ namespace Anycubic { // Each time we change folder we reset the file index to 0 and keep track // of the current position as the TFT panel isnt aware of folders trees. if (index > 0) { - --currentindex; // go back a file to take account off the .. we added to the root. + --currentindex; // go back a file to take account of the .. added to the root. if (index > lastindex) currentindex += files; else diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp index 97149a407e..aa78fcb539 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.cpp @@ -288,7 +288,7 @@ namespace Anycubic { SERIAL_ECHOLNPGM("Select SD file then press resume"); } - void ChironTFT::SendtoTFT(PGM_P str) { // A helper to print PROGMEN string to the panel + void ChironTFT::SendtoTFT(PGM_P str) { // A helper to print PROGMEM string to the panel #if ACDEBUG(AC_SOME) SERIAL_ECHOPGM_P(str); #endif @@ -880,6 +880,7 @@ namespace Anycubic { } break; } } -} // namespace + +} // Anycubic #endif // ANYCUBIC_LCD_CHIRON diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.h b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.h index 267f2fe978..e7bbd3cbbf 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.h +++ b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft.h @@ -32,46 +32,49 @@ #include "chiron_tft_defs.h" #include "../../../../inc/MarlinConfigPre.h" #include "../../ui_api.h" + namespace Anycubic { class ChironTFT { - static printer_state_t printer_state; - static paused_state_t pause_state; - static heater_state_t hotend_state; - static heater_state_t hotbed_state; - static xy_uint8_t selectedmeshpoint; - static char panel_command[MAX_CMND_LEN]; - static uint8_t command_len; - static char selectedfile[MAX_PATH_LEN]; - static float live_Zoffset; - static file_menu_t file_menu; + private: + static printer_state_t printer_state; + static paused_state_t pause_state; + static heater_state_t hotend_state; + static heater_state_t hotbed_state; + static xy_uint8_t selectedmeshpoint; + static char panel_command[MAX_CMND_LEN]; + static uint8_t command_len; + static char selectedfile[MAX_PATH_LEN]; + static float live_Zoffset; + static file_menu_t file_menu; + public: ChironTFT(); - void Startup(); - void IdleLoop(); - void PrinterKilled(PGM_P,PGM_P); - void MediaEvent(media_event_t); - void TimerEvent(timer_event_t); - void FilamentRunout(); - void ConfirmationRequest(const char * const ); - void StatusChange(const char * const ); - void PowerLossRecovery(); + static void Startup(); + static void IdleLoop(); + static void PrinterKilled(PGM_P,PGM_P); + static void MediaEvent(media_event_t); + static void TimerEvent(timer_event_t); + static void FilamentRunout(); + static void ConfirmationRequest(const char * const ); + static void StatusChange(const char * const ); + static void PowerLossRecovery(); private: - void SendtoTFT(PGM_P); - void SendtoTFTLN(PGM_P); - bool ReadTFTCommand(); - int8_t Findcmndpos(const char *, char); - void CheckHeaters(); - void SendFileList(int8_t); - void SelectFile(); - void InjectCommandandWait(PGM_P); - void ProcessPanelRequest(); - void PanelInfo(uint8_t); - void PanelAction(uint8_t); - void PanelProcess(uint8_t); + static void SendtoTFT(PGM_P); + static void SendtoTFTLN(PGM_P); + static bool ReadTFTCommand(); + static int8_t Findcmndpos(const char *, char); + static void CheckHeaters(); + static void SendFileList(int8_t); + static void SelectFile(); + static void InjectCommandandWait(PGM_P); + static void ProcessPanelRequest(); + static void PanelInfo(uint8_t); + static void PanelAction(uint8_t); + static void PanelProcess(uint8_t); }; extern ChironTFT Chiron; -} +} // Anycubic diff --git a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft_defs.h b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft_defs.h index 7012e98d92..3087d83801 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft_defs.h +++ b/Marlin/src/lcd/extui/lib/anycubic_chiron/chiron_tft_defs.h @@ -109,6 +109,7 @@ #define AC_cmnd_power_loss_recovery PSTR("G28XYR5\nG28Z") // Lift, home X and Y then home Z when in 'safe' position namespace Anycubic { + enum heater_state_t : uint8_t { AC_heater_off, AC_heater_temp_set, @@ -148,4 +149,5 @@ namespace Anycubic { AC_menu_change_to_file, AC_menu_change_to_command }; -} + +} // Anycubic diff --git a/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp index a990c4c640..95b07f5c68 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp @@ -2,7 +2,7 @@ * anycubic_i3mega_lcd.cpp --- Support for Anycubic i3 Mega TFT * Created by Christian Hopp on 09.12.17. * Improved by David Ramiro - * Converted to ext_iu by John BouAntoun 21 June 2020 + * Converted to ExtUI by John BouAntoun 21 June 2020 * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -32,44 +32,46 @@ #include "../../../../inc/MarlinConfig.h" // command sending macro's with debugging capability -#define SEND_PGM(x) send_P(PSTR(x)) -#define SENDLINE_PGM(x) sendLine_P(PSTR(x)) -#define SEND_PGM_VAL(x,y) (send_P(PSTR(x)), sendLine(i16tostr3rj(y))) -#define SEND(x) send(x) -#define SENDLINE(x) sendLine(x) +#define SEND_PGM(x) send_P(PSTR(x)) +#define SENDLINE_PGM(x) sendLine_P(PSTR(x)) +#define SEND_PGM_VAL(x,y) (send_P(PSTR(x)), sendLine(i16tostr3rj(y))) +#define SEND(x) send(x) +#define SENDLINE(x) sendLine(x) #if ENABLED(ANYCUBIC_LCD_DEBUG) - #define SENDLINE_DBG_PGM(x,y) (sendLine_P(PSTR(x)), SERIAL_ECHOLNPGM(y)) - #define SENDLINE_DBG_PGM_VAL(x,y,z) (sendLine_P(PSTR(x)), SERIAL_ECHOPGM(y), SERIAL_ECHOLN(z)) + #define SENDLINE_DBG_PGM(x,y) (sendLine_P(PSTR(x)), SERIAL_ECHOLNPGM(y)) + #define SENDLINE_DBG_PGM_VAL(x,y,z) (sendLine_P(PSTR(x)), SERIAL_ECHOPGM(y), SERIAL_ECHOLN(z)) #else - #define SENDLINE_DBG_PGM(x,y) sendLine_P(PSTR(x)) - #define SENDLINE_DBG_PGM_VAL(x,y,z) sendLine_P(PSTR(x)) + #define SENDLINE_DBG_PGM(x,y) sendLine_P(PSTR(x)) + #define SENDLINE_DBG_PGM_VAL(x,y,z) sendLine_P(PSTR(x)) #endif AnycubicTFTClass AnycubicTFT; -static void sendNewLine(void) { - LCD_SERIAL.write('\r'); - LCD_SERIAL.write('\n'); -} +char AnycubicTFTClass::TFTcmdbuffer[TFTBUFSIZE][TFT_MAX_CMD_SIZE]; +int AnycubicTFTClass::TFTbuflen = 0, + AnycubicTFTClass::TFTbufindr = 0, + AnycubicTFTClass::TFTbufindw = 0; +char AnycubicTFTClass::serial3_char; +int AnycubicTFTClass::serial3_count = 0; +char* AnycubicTFTClass::TFTstrchr_pointer; +uint8_t AnycubicTFTClass::SpecialMenu = false; +AnycubicMediaPrintState AnycubicTFTClass::mediaPrintingState = AMPRINTSTATE_NOT_PRINTING; +AnycubicMediaPauseState AnycubicTFTClass::mediaPauseState = AMPAUSESTATE_NOT_PAUSED; -static void send(const char *str) { - LCD_SERIAL.print(str); -} - -static void sendLine(const char *str) { - send(str); - sendNewLine(); -} +char AnycubicTFTClass::SelectedDirectory[30]; +char AnycubicTFTClass::SelectedFile[FILENAME_LENGTH]; +// Serial helpers +static void sendNewLine(void) { LCD_SERIAL.write('\r'); LCD_SERIAL.write('\n'); } +static void send(const char *str) { LCD_SERIAL.print(str); } static void send_P(PGM_P str) { while (const char c = pgm_read_byte(str++)) LCD_SERIAL.write(c); } +static void sendLine(const char *str) { send(str); sendNewLine(); } +static void sendLine_P(PGM_P str) { send_P(str); sendNewLine(); } -static void sendLine_P(PGM_P str) { - send_P(str); - sendNewLine(); -} +using namespace ExtUI; AnycubicTFTClass::AnycubicTFTClass() {} @@ -80,7 +82,7 @@ void AnycubicTFTClass::OnSetup() { LCD_SERIAL.begin(LCD_BAUDRATE); SENDLINE_DBG_PGM("J17", "TFT Serial Debug: Main board reset... J17"); // J17 Main board reset - ExtUI::delay_ms(10); + delay_ms(10); // initialise the state of the key pins running on the tft #if ENABLED(SDSUPPORT) && PIN_EXISTS(SD_DETECT) @@ -95,13 +97,13 @@ void AnycubicTFTClass::OnSetup() { // DoSDCardStateCheck(); SENDLINE_DBG_PGM("J12", "TFT Serial Debug: Ready... J12"); // J12 Ready - ExtUI::delay_ms(10); + delay_ms(10); DoFilamentRunoutCheck(); SelectedFile[0] = 0; #if ENABLED(STARTUP_CHIME) - ExtUI::injectCommands_P(PSTR("M300 P250 S554\nM300 P250 S554\nM300 P250 S740\nM300 P250 S554\nM300 P250 S740\nM300 P250 S554\nM300 P500 S831")); + injectCommands_P(PSTR("M300 P250 S554\nM300 P250 S554\nM300 P250 S740\nM300 P250 S554\nM300 P250 S740\nM300 P250 S554\nM300 P500 S831")); #endif #if ENABLED(ANYCUBIC_LCD_DEBUG) SERIAL_ECHOLNPGM("TFT Serial Debug: Finished startup"); @@ -119,8 +121,8 @@ void AnycubicTFTClass::OnCommandScan() { #endif mediaPrintingState = AMPRINTSTATE_NOT_PRINTING; mediaPauseState = AMPAUSESTATE_NOT_PAUSED; - ExtUI::injectCommands_P(PSTR("M84\nM27")); // disable stepper motors and force report of SD status - ExtUI::delay_ms(200); + injectCommands_P(PSTR("M84\nM27")); // disable stepper motors and force report of SD status + delay_ms(200); // tell printer to release resources of print to indicate it is done SENDLINE_DBG_PGM("J14", "TFT Serial Debug: SD Print Stopped... J14"); } @@ -224,8 +226,8 @@ bool AnycubicTFTClass::CodeSeen(char code) { } bool AnycubicTFTClass::IsNozzleHomed() { - const float xPosition = ExtUI::getAxisPosition_mm((ExtUI::axis_t) ExtUI::X); - const float yPosition = ExtUI::getAxisPosition_mm((ExtUI::axis_t) ExtUI::Y); + const float xPosition = getAxisPosition_mm((axis_t) X); + const float yPosition = getAxisPosition_mm((axis_t) Y); return WITHIN(xPosition, X_MIN_POS - 0.1, X_MIN_POS + 0.1) && WITHIN(yPosition, Y_MIN_POS - 0.1, Y_MIN_POS + 0.1); } @@ -246,48 +248,48 @@ void AnycubicTFTClass::HandleSpecialMenu() { switch (SelectedDirectory[2]) { case '1': // "<01ZUp0.1>" SERIAL_ECHOLNPGM("Special Menu: Z Up 0.1"); - ExtUI::injectCommands_P(PSTR("G91\nG1 Z+0.1\nG90")); + injectCommands_P(PSTR("G91\nG1 Z+0.1\nG90")); break; case '2': // "<02ZUp0.02>" SERIAL_ECHOLNPGM("Special Menu: Z Up 0.02"); - ExtUI::injectCommands_P(PSTR("G91\nG1 Z+0.02\nG90")); + injectCommands_P(PSTR("G91\nG1 Z+0.02\nG90")); break; case '3': // "<03ZDn0.02>" SERIAL_ECHOLNPGM("Special Menu: Z Down 0.02"); - ExtUI::injectCommands_P(PSTR("G91\nG1 Z-0.02\nG90")); + injectCommands_P(PSTR("G91\nG1 Z-0.02\nG90")); break; case '4': // "<04ZDn0.1>" SERIAL_ECHOLNPGM("Special Menu: Z Down 0.1"); - ExtUI::injectCommands_P(PSTR("G91\nG1 Z-0.1\nG90")); + injectCommands_P(PSTR("G91\nG1 Z-0.1\nG90")); break; case '5': // "<05PrehtBed>" SERIAL_ECHOLNPGM("Special Menu: Preheat Bed"); - ExtUI::injectCommands_P(PSTR("M140 S65")); + injectCommands_P(PSTR("M140 S65")); break; case '6': // "<06SMeshLvl>" SERIAL_ECHOLNPGM("Special Menu: Start Mesh Leveling"); - ExtUI::injectCommands_P(PSTR("G29S1")); + injectCommands_P(PSTR("G29S1")); break; case '7': // "<07MeshNPnt>" SERIAL_ECHOLNPGM("Special Menu: Next Mesh Point"); - ExtUI::injectCommands_P(PSTR("G29S2")); + injectCommands_P(PSTR("G29S2")); break; case '8': // "<08HtEndPID>" SERIAL_ECHOLNPGM("Special Menu: Auto Tune Hotend PID"); // need to dwell for half a second to give the fan a chance to start before the pid tuning starts - ExtUI::injectCommands_P(PSTR("M106 S204\nG4 P500\nM303 E0 S215 C15 U1")); + injectCommands_P(PSTR("M106 S204\nG4 P500\nM303 E0 S215 C15 U1")); break; case '9': // "<09HtBedPID>" SERIAL_ECHOLNPGM("Special Menu: Auto Tune Hotbed Pid"); - ExtUI::injectCommands_P(PSTR("M303 E-1 S65 C6 U1")); + injectCommands_P(PSTR("M303 E-1 S65 C6 U1")); break; default: @@ -299,12 +301,12 @@ void AnycubicTFTClass::HandleSpecialMenu() { switch (SelectedDirectory[2]) { case '0': // "<10FWDeflts>" SERIAL_ECHOLNPGM("Special Menu: Load FW Defaults"); - ExtUI::injectCommands_P(PSTR("M502\nM300 P105 S1661\nM300 P210 S1108")); + injectCommands_P(PSTR("M502\nM300 P105 S1661\nM300 P210 S1108")); break; case '1': // "<11SvEEPROM>" SERIAL_ECHOLNPGM("Special Menu: Save EEPROM"); - ExtUI::injectCommands_P(PSTR("M500\nM300 P105 S1108\nM300 P210 S1661")); + injectCommands_P(PSTR("M500\nM300 P105 S1108\nM300 P210 S1661")); break; default: @@ -316,38 +318,38 @@ void AnycubicTFTClass::HandleSpecialMenu() { switch (SelectedDirectory[2]) { case '1': // "<01PrehtBed>" SERIAL_ECHOLNPGM("Special Menu: Preheat Bed"); - ExtUI::injectCommands_P(PSTR("M140 S65")); + injectCommands_P(PSTR("M140 S65")); break; case '2': // "<02ABL>" SERIAL_ECHOLNPGM("Special Menu: Auto Bed Leveling"); - ExtUI::injectCommands_P(PSTR("G29N")); + injectCommands_P(PSTR("G29N")); break; case '3': // "<03HtendPID>" SERIAL_ECHOLNPGM("Special Menu: Auto Tune Hotend PID"); // need to dwell for half a second to give the fan a chance to start before the pid tuning starts - ExtUI::injectCommands_P(PSTR("M106 S204\nG4 P500\nM303 E0 S215 C15 U1")); + injectCommands_P(PSTR("M106 S204\nG4 P500\nM303 E0 S215 C15 U1")); break; case '4': // "<04HtbedPID>" SERIAL_ECHOLNPGM("Special Menu: Auto Tune Hotbed Pid"); - ExtUI::injectCommands_P(PSTR("M303 E-1 S65 C6 U1")); + injectCommands_P(PSTR("M303 E-1 S65 C6 U1")); break; case '5': // "<05FWDeflts>" SERIAL_ECHOLNPGM("Special Menu: Load FW Defaults"); - ExtUI::injectCommands_P(PSTR("M502\nM300 P105 S1661\nM300 P210 S1108")); + injectCommands_P(PSTR("M502\nM300 P105 S1661\nM300 P210 S1108")); break; case '6': // "<06SvEEPROM>" SERIAL_ECHOLNPGM("Special Menu: Save EEPROM"); - ExtUI::injectCommands_P(PSTR("M500\nM300 P105 S1108\nM300 P210 S1661")); + injectCommands_P(PSTR("M500\nM300 P105 S1108\nM300 P210 S1661")); break; case '7': // <07SendM108> SERIAL_ECHOLNPGM("Special Menu: Send User Confirmation"); - ExtUI::injectCommands_P(PSTR("M108")); + injectCommands_P(PSTR("M108")); break; default: @@ -373,11 +375,11 @@ void AnycubicTFTClass::RenderCurrentFileList() { uint16_t selectedNumber = 0; SelectedDirectory[0] = 0; SelectedFile[0] = 0; - ExtUI::FileList currentFileList; + FileList currentFileList; SENDLINE_PGM("FN "); // Filelist start - if (!ExtUI::isMediaInserted() && !SpecialMenu) { + if (!isMediaInserted() && !SpecialMenu) { SENDLINE_DBG_PGM("J02", "TFT Serial Debug: No SD Card mounted to render Current File List... J02"); SENDLINE_PGM(""); @@ -462,7 +464,7 @@ void AnycubicTFTClass::RenderSpecialMenu(uint16_t selectedNumber) { } void AnycubicTFTClass::RenderCurrentFolder(uint16_t selectedNumber) { - ExtUI::FileList currentFileList; + FileList currentFileList; uint16_t cnt = selectedNumber; uint16_t max_files; uint16_t dir_files = currentFileList.count(); @@ -514,7 +516,7 @@ void AnycubicTFTClass::OnPrintTimerStarted() { void AnycubicTFTClass::OnPrintTimerPaused() { #if ENABLED(SDSUPPORT) - if (ExtUI::isPrintingFromMedia()) { + if (isPrintingFromMedia()) { mediaPrintingState = AMPRINTSTATE_PAUSED; mediaPauseState = AMPAUSESTATE_PARKING; } @@ -558,38 +560,38 @@ void AnycubicTFTClass::GetCommandFromTFT() { switch (a_command) { case 0: { // A0 GET HOTEND TEMP - float hotendActualTemp = ExtUI::getActualTemp_celsius((ExtUI::extruder_t) (ExtUI::extruder_t) ExtUI::E0); + float hotendActualTemp = getActualTemp_celsius((extruder_t) (extruder_t) E0); SEND_PGM_VAL("A0V ", int(hotendActualTemp + 0.5)); } break; case 1: { // A1 GET HOTEND TARGET TEMP - float hotendTargetTemp = ExtUI::getTargetTemp_celsius((ExtUI::extruder_t) (ExtUI::extruder_t) ExtUI::E0); + float hotendTargetTemp = getTargetTemp_celsius((extruder_t) (extruder_t) E0); SEND_PGM_VAL("A1V ", int(hotendTargetTemp + 0.5)); } break; case 2: { // A2 GET HOTBED TEMP - float heatedBedActualTemp = ExtUI::getActualTemp_celsius((ExtUI::heater_t) ExtUI::BED); + float heatedBedActualTemp = getActualTemp_celsius((heater_t) BED); SEND_PGM_VAL("A2V ", int(heatedBedActualTemp + 0.5)); } break; case 3: { // A3 GET HOTBED TARGET TEMP - float heatedBedTargetTemp = ExtUI::getTargetTemp_celsius((ExtUI::heater_t) ExtUI::BED); + float heatedBedTargetTemp = getTargetTemp_celsius((heater_t) BED); SEND_PGM_VAL("A3V ", int(heatedBedTargetTemp + 0.5)); } break; case 4: { // A4 GET FAN SPEED - float fanPercent = ExtUI::getActualFan_percent(ExtUI::FAN0); + float fanPercent = getActualFan_percent(FAN0); fanPercent = constrain(fanPercent, 0, 100); SEND_PGM_VAL("A4V ", int(fanPercent)); } break; case 5: { // A5 GET CURRENT COORDINATE - const float xPosition = ExtUI::getAxisPosition_mm(ExtUI::X), - yPosition = ExtUI::getAxisPosition_mm(ExtUI::Y), - zPosition = ExtUI::getAxisPosition_mm(ExtUI::Z); + const float xPosition = getAxisPosition_mm(X), + yPosition = getAxisPosition_mm(Y), + zPosition = getAxisPosition_mm(Z); SEND_PGM("A5V X: "); LCD_SERIAL.print(xPosition); SEND_PGM( " Y: "); LCD_SERIAL.print(yPosition); SEND_PGM( " Z: "); LCD_SERIAL.print(zPosition); @@ -598,10 +600,10 @@ void AnycubicTFTClass::GetCommandFromTFT() { case 6: // A6 GET SD CARD PRINTING STATUS #if ENABLED(SDSUPPORT) - if (ExtUI::isPrintingFromMedia()) { + if (isPrintingFromMedia()) { SEND_PGM("A6V "); - if (ExtUI::isMediaInserted()) - SENDLINE(ui8tostr3rj(ExtUI::getProgress_percent())); + if (isMediaInserted()) + SENDLINE(ui8tostr3rj(getProgress_percent())); else SENDLINE_DBG_PGM("J02", "TFT Serial Debug: No SD Card mounted to return printing status... J02"); } @@ -611,7 +613,7 @@ void AnycubicTFTClass::GetCommandFromTFT() { break; case 7: { // A7 GET PRINTING TIME - const uint32_t elapsedSeconds = ExtUI::getProgress_seconds_elapsed(); + const uint32_t elapsedSeconds = getProgress_seconds_elapsed(); SEND_PGM("A7V "); if (elapsedSeconds != 0) { // print time const uint32_t elapsedMinutes = elapsedSeconds / 60; @@ -634,14 +636,14 @@ void AnycubicTFTClass::GetCommandFromTFT() { case 9: // A9 pause sd print #if ENABLED(SDSUPPORT) - if (ExtUI::isPrintingFromMedia()) + if (isPrintingFromMedia()) PausePrint(); #endif break; case 10: // A10 resume sd print #if ENABLED(SDSUPPORT) - if (ExtUI::isPrintingFromMediaPaused()) + if (isPrintingFromMediaPaused()) ResumePrint(); #endif break; @@ -656,7 +658,7 @@ void AnycubicTFTClass::GetCommandFromTFT() { case 13: // A13 SELECTION FILE #if ENABLED(SDSUPPORT) - if (ExtUI::isMediaInserted()) { + if (isMediaInserted()) { starpos = (strchr(TFTstrchr_pointer + 4, '*')); if (TFTstrchr_pointer[4] == '/') { strcpy(SelectedDirectory, TFTstrchr_pointer + 5); @@ -685,7 +687,7 @@ void AnycubicTFTClass::GetCommandFromTFT() { case 14: // A14 START PRINTING #if ENABLED(SDSUPPORT) - if (!ExtUI::isPrinting() && strlen(SelectedFile) > 0) + if (!isPrinting() && strlen(SelectedFile) > 0) StartPrint(); #endif break; @@ -698,13 +700,13 @@ void AnycubicTFTClass::GetCommandFromTFT() { unsigned int tempvalue; if (CodeSeen('S')) { tempvalue = constrain(CodeValue(), 0, 275); - ExtUI::setTargetTemp_celsius(tempvalue, (ExtUI::extruder_t) ExtUI::E0); + setTargetTemp_celsius(tempvalue, (extruder_t) E0); } - else if (CodeSeen('C') && !ExtUI::isPrinting()) { - if (ExtUI::getAxisPosition_mm(ExtUI::Z) < 10) - ExtUI::injectCommands_P(PSTR("G1 Z10")); // RASE Z AXIS + else if (CodeSeen('C') && !isPrinting()) { + if (getAxisPosition_mm(Z) < 10) + injectCommands_P(PSTR("G1 Z10")); // RASE Z AXIS tempvalue = constrain(CodeValue(), 0, 275); - ExtUI::setTargetTemp_celsius(tempvalue, (ExtUI::extruder_t) ExtUI::E0); + setTargetTemp_celsius(tempvalue, (extruder_t) E0); } } break; @@ -713,7 +715,7 @@ void AnycubicTFTClass::GetCommandFromTFT() { unsigned int tempbed; if (CodeSeen('S')) { tempbed = constrain(CodeValue(), 0, 100); - ExtUI::setTargetTemp_celsius(tempbed, (ExtUI::heater_t)ExtUI::BED); + setTargetTemp_celsius(tempbed, (heater_t)BED); } } break; @@ -723,18 +725,18 @@ void AnycubicTFTClass::GetCommandFromTFT() { if (CodeSeen('S')) { fanPercent = CodeValue(); fanPercent = constrain(fanPercent, 0, 100); - ExtUI::setTargetFan_percent(fanPercent, ExtUI::FAN0); + setTargetFan_percent(fanPercent, FAN0); } else fanPercent = 100; - ExtUI::setTargetFan_percent(fanPercent, ExtUI::FAN0); + setTargetFan_percent(fanPercent, FAN0); SENDLINE_PGM(""); } break; case 19: // A19 stop stepper drivers - sent on stop extrude command and on turn motors off command - if (!ExtUI::isPrinting()) { + if (!isPrinting()) { quickstop_stepper(); disable_all_steppers(); } @@ -750,23 +752,23 @@ void AnycubicTFTClass::GetCommandFromTFT() { break; case 21: // A21 all home - if (!ExtUI::isPrinting() && !ExtUI::isPrintingFromMediaPaused()) { + if (!isPrinting() && !isPrintingFromMediaPaused()) { if (CodeSeen('X') || CodeSeen('Y') || CodeSeen('Z')) { if (CodeSeen('X')) - ExtUI::injectCommands_P(PSTR("G28X")); + injectCommands_P(PSTR("G28X")); if (CodeSeen('Y')) - ExtUI::injectCommands_P(PSTR("G28Y")); + injectCommands_P(PSTR("G28Y")); if (CodeSeen('Z')) - ExtUI::injectCommands_P(PSTR("G28Z")); + injectCommands_P(PSTR("G28Z")); } else if (CodeSeen('C')) { - ExtUI::injectCommands_P(G28_STR); + injectCommands_P(G28_STR); } } break; case 22: // A22 move X/Y/Z or extrude - if (!ExtUI::isPrinting()) { + if (!isPrinting()) { float coorvalue; unsigned int movespeed = 0; char commandStr[30]; @@ -819,38 +821,38 @@ void AnycubicTFTClass::GetCommandFromTFT() { SERIAL_ECHOPGM("TFT Serial Debug: A22 Move final request with gcode... "); SERIAL_ECHOLN(fullCommandStr); #endif - ExtUI::injectCommands(fullCommandStr); + injectCommands(fullCommandStr); } } SENDLINE_PGM(""); break; case 23: // A23 preheat pla - if (!ExtUI::isPrinting()) { - if (ExtUI::getAxisPosition_mm(ExtUI::Z) < 10) - ExtUI::injectCommands_P(PSTR("G1 Z10")); // RASE Z AXIS + if (!isPrinting()) { + if (getAxisPosition_mm(Z) < 10) + injectCommands_P(PSTR("G1 Z10")); // RASE Z AXIS - ExtUI::setTargetTemp_celsius(PREHEAT_1_TEMP_BED, (ExtUI::heater_t) ExtUI::BED); - ExtUI::setTargetTemp_celsius(PREHEAT_1_TEMP_HOTEND, (ExtUI::extruder_t) ExtUI::E0); + setTargetTemp_celsius(PREHEAT_1_TEMP_BED, (heater_t) BED); + setTargetTemp_celsius(PREHEAT_1_TEMP_HOTEND, (extruder_t) E0); SENDLINE_PGM("OK"); } break; case 24:// A24 preheat abs - if (!ExtUI::isPrinting()) { - if (ExtUI::getAxisPosition_mm(ExtUI::Z) < 10) - ExtUI::injectCommands_P(PSTR("G1 Z10")); // RASE Z AXIS + if (!isPrinting()) { + if (getAxisPosition_mm(Z) < 10) + injectCommands_P(PSTR("G1 Z10")); // RASE Z AXIS - ExtUI::setTargetTemp_celsius(PREHEAT_2_TEMP_BED, (ExtUI::heater_t) ExtUI::BED); - ExtUI::setTargetTemp_celsius(PREHEAT_2_TEMP_HOTEND, (ExtUI::extruder_t) ExtUI::E0); + setTargetTemp_celsius(PREHEAT_2_TEMP_BED, (heater_t) BED); + setTargetTemp_celsius(PREHEAT_2_TEMP_HOTEND, (extruder_t) E0); SENDLINE_PGM("OK"); } break; case 25: // A25 cool down - if (!ExtUI::isPrinting()) { - ExtUI::setTargetTemp_celsius(0, (ExtUI::heater_t) ExtUI::BED); - ExtUI::setTargetTemp_celsius(0, (ExtUI::extruder_t) ExtUI::E0); + if (!isPrinting()) { + setTargetTemp_celsius(0, (heater_t) BED); + setTargetTemp_celsius(0, (extruder_t) E0); SENDLINE_DBG_PGM("J12", "TFT Serial Debug: Cooling down... J12"); // J12 cool down } @@ -858,9 +860,9 @@ void AnycubicTFTClass::GetCommandFromTFT() { case 26: // A26 refresh SD #if ENABLED(SDSUPPORT) - if (ExtUI::isMediaInserted()) { + if (isMediaInserted()) { if (strlen(SelectedDirectory) > 0) { - ExtUI::FileList currentFileList; + FileList currentFileList; if ((SelectedDirectory[0] == '.') && (SelectedDirectory[1] == '.')) { currentFileList.upDir(); } @@ -914,7 +916,7 @@ void AnycubicTFTClass::GetCommandFromTFT() { void AnycubicTFTClass::DoSDCardStateCheck() { #if ENABLED(SDSUPPORT) && PIN_EXISTS(SD_DETECT) - bool isInserted = ExtUI::isMediaInserted(); + bool isInserted = isMediaInserted(); if (isInserted) SENDLINE_DBG_PGM("J00", "TFT Serial Debug: SD card state changed... isInserted"); else @@ -925,12 +927,12 @@ void AnycubicTFTClass::DoSDCardStateCheck() { void AnycubicTFTClass::DoFilamentRunoutCheck() { #if ENABLED(FILAMENT_RUNOUT_SENSOR) - // NOTE: ExtUI::getFilamentRunoutState() only returns the runout state if the job is printing + // NOTE: getFilamentRunoutState() only returns the runout state if the job is printing // we want to actually check the status of the pin here, regardless of printstate if (READ(FIL_RUNOUT1_PIN)) { if (mediaPrintingState == AMPRINTSTATE_PRINTING || mediaPrintingState == AMPRINTSTATE_PAUSED || mediaPrintingState == AMPRINTSTATE_PAUSE_REQUESTED) { // play tone to indicate filament is out - ExtUI::injectCommands_P(PSTR("\nM300 P200 S1567\nM300 P200 S1174\nM300 P200 S1567\nM300 P200 S1174\nM300 P2000 S1567")); + injectCommands_P(PSTR("\nM300 P200 S1567\nM300 P200 S1174\nM300 P200 S1567\nM300 P200 S1174\nM300 P2000 S1567")); // tell the user that the filament has run out and wait SENDLINE_DBG_PGM("J23", "TFT Serial Debug: Blocking filament prompt... J23"); @@ -944,30 +946,30 @@ void AnycubicTFTClass::DoFilamentRunoutCheck() { void AnycubicTFTClass::StartPrint() { #if ENABLED(SDSUPPORT) - if (!ExtUI::isPrinting() && strlen(SelectedFile) > 0) { + if (!isPrinting() && strlen(SelectedFile) > 0) { #if ENABLED(ANYCUBIC_LCD_DEBUG) SERIAL_ECHOPGM("TFT Serial Debug: About to print file ... "); - SERIAL_ECHO(ExtUI::isPrinting()); + SERIAL_ECHO(isPrinting()); SERIAL_ECHOPGM(" "); SERIAL_ECHOLN(SelectedFile); #endif mediaPrintingState = AMPRINTSTATE_PRINTING; mediaPauseState = AMPAUSESTATE_NOT_PAUSED; - ExtUI::printFile(SelectedFile); + printFile(SelectedFile); } #endif // SDUPPORT } void AnycubicTFTClass::PausePrint() { #if ENABLED(SDSUPPORT) - if (ExtUI::isPrintingFromMedia() && mediaPrintingState != AMPRINTSTATE_STOP_REQUESTED && mediaPauseState == AMPAUSESTATE_NOT_PAUSED) { + if (isPrintingFromMedia() && mediaPrintingState != AMPRINTSTATE_STOP_REQUESTED && mediaPauseState == AMPAUSESTATE_NOT_PAUSED) { mediaPrintingState = AMPRINTSTATE_PAUSE_REQUESTED; mediaPauseState = AMPAUSESTATE_NOT_PAUSED; // need the userconfirm method to update pause state SENDLINE_DBG_PGM("J05", "TFT Serial Debug: SD print pause started... J05"); // J05 printing pause // for some reason pausing the print doesn't retract the extruder so force a manual one here - ExtUI::injectCommands_P(PSTR("G91\nG1 E-2 F1800\nG90")); - ExtUI::pausePrint(); + injectCommands_P(PSTR("G91\nG1 E-2 F1800\nG90")); + pausePrint(); } #endif } @@ -996,14 +998,14 @@ void AnycubicTFTClass::ResumePrint() { // SENDLINE_DBG_PGM("J05", "TFT Serial Debug: Resume called with heater timeout... J05"); // J05 printing pause // reheat the nozzle - ExtUI::setUserConfirmed(); + setUserConfirmed(); } else { mediaPrintingState = AMPRINTSTATE_PRINTING; mediaPauseState = AMPAUSESTATE_NOT_PAUSED; SENDLINE_DBG_PGM("J04", "TFT Serial Debug: SD print resumed... J04"); // J04 printing form sd card now - ExtUI::resumePrint(); + resumePrint(); } #endif } @@ -1015,8 +1017,8 @@ void AnycubicTFTClass::StopPrint() { SENDLINE_DBG_PGM("J16", "TFT Serial Debug: SD print stop called... J16"); // for some reason stopping the print doesn't retract the extruder so force a manual one here - ExtUI::injectCommands_P(PSTR("G91\nG1 E-2 F1800\nG90")); - ExtUI::stopPrint(); + injectCommands_P(PSTR("G91\nG1 E-2 F1800\nG90")); + stopPrint(); #endif } diff --git a/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.h b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.h index 59050acccb..e34cb2fe69 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.h +++ b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.h @@ -2,7 +2,7 @@ * anycubic_i3mega_lcd.h --- Support for Anycubic i3 Mega TFT * Created by Christian Hopp on 09.12.17. * Improved by David Ramiro - * Converted to ext_iu by John BouAntoun 21 June 2020 + * Converted to ExtUI by John BouAntoun 21 June 2020 * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -48,49 +48,47 @@ enum AnycubicMediaPauseState { class AnycubicTFTClass { public: AnycubicTFTClass(); - void OnSetup(); - void OnCommandScan(); - void OnKillTFT(); - void OnSDCardStateChange(bool); - void OnSDCardError(); - void OnFilamentRunout(); - void OnUserConfirmRequired(const char *); - void OnPrintTimerStarted(); - void OnPrintTimerPaused(); - void OnPrintTimerStopped(); + static void OnSetup(); + static void OnCommandScan(); + static void OnKillTFT(); + static void OnSDCardStateChange(bool); + static void OnSDCardError(); + static void OnFilamentRunout(); + static void OnUserConfirmRequired(const char *); + static void OnPrintTimerStarted(); + static void OnPrintTimerPaused(); + static void OnPrintTimerStopped(); private: - char TFTcmdbuffer[TFTBUFSIZE][TFT_MAX_CMD_SIZE]; - int TFTbuflen=0; - int TFTbufindr = 0; - int TFTbufindw = 0; - char serial3_char; - int serial3_count = 0; - char *TFTstrchr_pointer; - uint8_t SpecialMenu = false; - AnycubicMediaPrintState mediaPrintingState = AMPRINTSTATE_NOT_PRINTING; - AnycubicMediaPauseState mediaPauseState = AMPAUSESTATE_NOT_PAUSED; + static char TFTcmdbuffer[TFTBUFSIZE][TFT_MAX_CMD_SIZE]; + static int TFTbuflen, TFTbufindr, TFTbufindw; + static char serial3_char; + static int serial3_count; + static char *TFTstrchr_pointer; + static uint8_t SpecialMenu; + static AnycubicMediaPrintState mediaPrintingState; + static AnycubicMediaPauseState mediaPauseState; - float CodeValue(); - bool CodeSeen(char); - bool IsNozzleHomed(); - void RenderCurrentFileList(); - void RenderSpecialMenu(uint16_t); - void RenderCurrentFolder(uint16_t); - void GetCommandFromTFT(); - void CheckSDCardChange(); - void CheckPauseState(); - void CheckPrintCompletion(); - void HandleSpecialMenu(); - void DoSDCardStateCheck(); - void DoFilamentRunoutCheck(); - void StartPrint(); - void PausePrint(); - void ResumePrint(); - void StopPrint(); + static float CodeValue(); + static bool CodeSeen(char); + static bool IsNozzleHomed(); + static void RenderCurrentFileList(); + static void RenderSpecialMenu(uint16_t); + static void RenderCurrentFolder(uint16_t); + static void GetCommandFromTFT(); + static void CheckSDCardChange(); + static void CheckPauseState(); + static void CheckPrintCompletion(); + static void HandleSpecialMenu(); + static void DoSDCardStateCheck(); + static void DoFilamentRunoutCheck(); + static void StartPrint(); + static void PausePrint(); + static void ResumePrint(); + static void StopPrint(); - char SelectedDirectory[30]; - char SelectedFile[FILENAME_LENGTH]; + static char SelectedDirectory[30]; + static char SelectedFile[FILENAME_LENGTH]; }; extern AnycubicTFTClass AnycubicTFT; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/marlin_events.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/marlin_events.cpp index fc9b5d0a70..902ede025c 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/marlin_events.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/marlin_events.cpp @@ -140,7 +140,7 @@ namespace ExtUI { #if HAS_LEVELING && HAS_MESH void onMeshLevelingStart() {} - void onMeshUpdate(const int8_t x, const int8_t y, const float val) { + void onMeshUpdate(const int8_t x, const int8_t y, const float &val) { BedMeshScreen::onMeshUpdate(x, y, val); } diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.h index 7aac484cb6..de72d863ae 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.h @@ -51,7 +51,7 @@ class BedMeshScreen : public BaseScreen, public CachedScreen 0 ? CEIL(steps) : FLOOR(steps); } - #endif + + #endif // BABYSTEPPING float getZOffset_mm() { return (0.0f @@ -754,7 +744,7 @@ namespace ExtUI { ); } - void setZOffset_mm(const float value) { + void setZOffset_mm(const float &value) { #if HAS_BED_PROBE if (WITHIN(value, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX)) probe.offset.z = value; @@ -772,7 +762,7 @@ namespace ExtUI { return hotend_offset[extruder - E0][axis]; } - void setNozzleOffset_mm(const float value, const axis_t axis, const extruder_t extruder) { + void setNozzleOffset_mm(const float &value, const axis_t axis, const extruder_t extruder) { if (extruder - E0 >= HOTENDS) return; hotend_offset[extruder - E0][axis] = value; } @@ -790,25 +780,21 @@ namespace ExtUI { #endif // HAS_HOTEND_OFFSET #if HAS_BED_PROBE - float getProbeOffset_mm(const axis_t axis) { - return probe.offset.pos[axis]; - } - void setProbeOffset_mm(const float val, const axis_t axis) { - probe.offset.pos[axis] = val; - } + float getProbeOffset_mm(const axis_t axis) { return probe.offset.pos[axis]; } + void setProbeOffset_mm(const float &val, const axis_t axis) { probe.offset.pos[axis] = val; } #endif #if ENABLED(BACKLASH_GCODE) float getAxisBacklash_mm(const axis_t axis) { return backlash.distance_mm[axis]; } - void setAxisBacklash_mm(const float value, const axis_t axis) + void setAxisBacklash_mm(const float &value, const axis_t axis) { backlash.distance_mm[axis] = constrain(value,0,5); } float getBacklashCorrection_percent() { return ui8_to_percent(backlash.correction); } - void setBacklashCorrection_percent(const float value) { backlash.correction = map(constrain(value, 0, 100), 0, 100, 0, 255); } + void setBacklashCorrection_percent(const float &value) { backlash.correction = map(constrain(value, 0, 100), 0, 100, 0, 255); } #ifdef BACKLASH_SMOOTHING_MM float getBacklashSmoothing_mm() { return backlash.smoothing_mm; } - void setBacklashSmoothing_mm(const float value) { backlash.smoothing_mm = constrain(value, 0, 999); } + void setBacklashSmoothing_mm(const float &value) { backlash.smoothing_mm = constrain(value, 0, 999); } #endif #endif @@ -824,7 +810,7 @@ namespace ExtUI { #if HAS_MESH bed_mesh_t& getMeshArray() { return Z_VALUES_ARR; } float getMeshPoint(const xy_uint8_t &pos) { return Z_VALUES(pos.x, pos.y); } - void setMeshPoint(const xy_uint8_t &pos, const float zoff) { + void setMeshPoint(const xy_uint8_t &pos, const float &zoff) { if (WITHIN(pos.x, 0, GRID_MAX_POINTS_X) && WITHIN(pos.y, 0, GRID_MAX_POINTS_Y)) { Z_VALUES(pos.x, pos.y) = zoff; TERN_(ABL_BILINEAR_SUBDIVISION, bed_level_virt_interpolate()); @@ -838,6 +824,7 @@ namespace ExtUI { #endif #if ENABLED(PRINTCOUNTER) + char* getFailedPrints_str(char buffer[21]) { strcpy(buffer,i16tostr3left(print_job_timer.getStats().totalPrints - print_job_timer.getStats().finishedPrints)); return buffer; } char* getTotalPrints_str(char buffer[21]) { strcpy(buffer,i16tostr3left(print_job_timer.getStats().totalPrints)); return buffer; } char* getFinishedPrints_str(char buffer[21]) { strcpy(buffer,i16tostr3left(print_job_timer.getStats().finishedPrints)); return buffer; } char* getTotalPrintTime_str(char buffer[21]) { return duration_t(print_job_timer.getStats().printTime).toString(buffer); } @@ -856,14 +843,14 @@ namespace ExtUI { float getPIDValues_Ki(const extruder_t tool) { return unscalePID_i(PID_PARAM(Ki, tool)); } float getPIDValues_Kd(const extruder_t tool) { return unscalePID_d(PID_PARAM(Kd, tool)); } - void setPIDValues(const float p, const float i, const float d, extruder_t tool) { + void setPIDValues(const float &p, const float &i, const float &d, extruder_t tool) { thermalManager.temp_hotend[tool].pid.Kp = p; thermalManager.temp_hotend[tool].pid.Ki = scalePID_i(i); thermalManager.temp_hotend[tool].pid.Kd = scalePID_d(d); thermalManager.updatePID(); } - void startPIDTune(const float temp, extruder_t tool) { + void startPIDTune(const float &temp, extruder_t tool) { thermalManager.PID_autotune(temp, (heater_id_t)tool, 8, true); } #endif @@ -873,14 +860,14 @@ namespace ExtUI { float getBedPIDValues_Ki() { return unscalePID_i(thermalManager.temp_bed.pid.Ki); } float getBedPIDValues_Kd() { return unscalePID_d(thermalManager.temp_bed.pid.Kd); } - void setBedPIDValues(const float p, const float i, const float d) { + void setBedPIDValues(const float &p, const float &i, const float &d) { thermalManager.temp_bed.pid.Kp = p; thermalManager.temp_bed.pid.Ki = scalePID_i(i); thermalManager.temp_bed.pid.Kd = scalePID_d(d); thermalManager.updatePID(); } - void startBedPIDTune(const float temp) { + void startBedPIDTune(const float &temp) { thermalManager.PID_autotune(temp, H_BED, 4, true); } #endif @@ -900,7 +887,8 @@ namespace ExtUI { return firmware_name; } - void setTargetTemp_celsius(float value, const heater_t heater) { + void setTargetTemp_celsius(const float &inval, const heater_t heater) { + float value = inval; #ifdef TOUCH_UI_LCD_TEMP_SCALING value *= TOUCH_UI_LCD_TEMP_SCALING; #endif @@ -924,7 +912,8 @@ namespace ExtUI { } } - void setTargetTemp_celsius(float value, const extruder_t extruder) { + void setTargetTemp_celsius(const float &inval, const extruder_t extruder) { + float value = inval; #ifdef TOUCH_UI_LCD_TEMP_SCALING value *= TOUCH_UI_LCD_TEMP_SCALING; #endif @@ -935,7 +924,7 @@ namespace ExtUI { #endif } - void setTargetFan_percent(const float value, const fan_t fan) { + void setTargetFan_percent(const float &value, const fan_t fan) { #if HAS_FAN if (fan < FAN_COUNT) thermalManager.set_fan_speed(fan - FAN0, map(constrain(value, 0, 100), 0, 100, 0, 255)); @@ -945,25 +934,27 @@ namespace ExtUI { #endif } - void setFeedrate_percent(const float value) { - feedrate_percentage = constrain(value, 10, 500); + void setFeedrate_percent(const float &value) { feedrate_percentage = constrain(value, 10, 500); } + + void coolDown() { + #if HAS_HOTEND + HOTEND_LOOP() thermalManager.setTargetHotend(0, e); + #endif + TERN_(HAS_HEATED_BED, thermalManager.setTargetBed(0)); + TERN_(HAS_FAN, thermalManager.zero_fan_speeds()); } - bool awaitingUserConfirm() { - return wait_for_user; - } + bool awaitingUserConfirm() { return wait_for_user; } - void setUserConfirmed() { - TERN_(HAS_RESUME_CONTINUE, wait_for_user = false); - } + void setUserConfirmed() { TERN_(HAS_RESUME_CONTINUE, wait_for_user = false); } void printFile(const char *filename) { UNUSED(filename); - IFSD(card.openAndPrintFile(filename), NOOP); + TERN_(SDSUPPORT, card.openAndPrintFile(filename)); } bool isPrintingFromMediaPaused() { - return IFSD(isPrintingFromMedia() && !IS_SD_PRINTING(), false); + return TERN0(SDSUPPORT, isPrintingFromMedia() && !IS_SD_PRINTING()); } bool isPrintingFromMedia() { @@ -978,16 +969,14 @@ namespace ExtUI { } bool isPrinting() { - return (commandsInQueue() || isPrintingFromMedia() || IFSD(IS_SD_PRINTING(), false)) || print_job_timer.isRunning() || print_job_timer.isPaused(); + return (commandsInQueue() || isPrintingFromMedia() || TERN0(SDSUPPORT, IS_SD_PRINTING())) || print_job_timer.isRunning() || print_job_timer.isPaused(); } bool isPrintingPaused() { return isPrinting() && (isPrintingFromMediaPaused() || print_job_timer.isPaused()); } - bool isMediaInserted() { - return IFSD(IS_SD_INSERTED() && card.isMounted(), false); - } + bool isMediaInserted() { return TERN0(SDSUPPORT, IS_SD_INSERTED() && card.isMounted()); } void pausePrint() { ui.pause_print(); } void resumePrint() { ui.resume_print(); } @@ -1022,27 +1011,27 @@ namespace ExtUI { } const char* FileList::filename() { - return IFSD(card.longest_filename(), ""); + return TERN(SDSUPPORT, card.longest_filename(), ""); } const char* FileList::shortFilename() { - return IFSD(card.filename, ""); + return TERN(SDSUPPORT, card.filename, ""); } const char* FileList::longFilename() { - return IFSD(card.longFilename, ""); + return TERN(SDSUPPORT, card.longFilename, ""); } bool FileList::isDir() { - return IFSD(card.flag.filenameIsDir, false); + return TERN0(SDSUPPORT, card.flag.filenameIsDir); } uint16_t FileList::count() { - return IFSD((num_files = (num_files == 0xFFFF ? card.get_num_Files() : num_files)), 0); + return TERN0(SDSUPPORT, (num_files = (num_files == 0xFFFF ? card.get_num_Files() : num_files))); } bool FileList::isAtRootDir() { - return IFSD(card.flag.workDirIsRoot, true); + return TERN1(SDSUPPORT, card.flag.workDirIsRoot); } void FileList::upDir() { diff --git a/Marlin/src/lcd/extui/ui_api.h b/Marlin/src/lcd/extui/ui_api.h index a6cfb82b88..701bf9eb54 100644 --- a/Marlin/src/lcd/extui/ui_api.h +++ b/Marlin/src/lcd/extui/ui_api.h @@ -102,11 +102,11 @@ namespace ExtUI { #if HAS_TRINAMIC_CONFIG float getAxisCurrent_mA(const axis_t); float getAxisCurrent_mA(const extruder_t); - void setAxisCurrent_mA(const float, const axis_t); - void setAxisCurrent_mA(const float, const extruder_t); + void setAxisCurrent_mA(const float&, const axis_t); + void setAxisCurrent_mA(const float&, const extruder_t); int getTMCBumpSensitivity(const axis_t); - void setTMCBumpSensitivity(const float, const axis_t); + void setTMCBumpSensitivity(const float&, const axis_t); #endif float getActualTemp_celsius(const heater_t); @@ -150,10 +150,10 @@ namespace ExtUI { #if HAS_MESH bed_mesh_t& getMeshArray(); float getMeshPoint(const xy_uint8_t &pos); - void setMeshPoint(const xy_uint8_t &pos, const float zval); + void setMeshPoint(const xy_uint8_t &pos, const float &zval); void onMeshLevelingStart(); - void onMeshUpdate(const int8_t xpos, const int8_t ypos, const float zval); - inline void onMeshUpdate(const xy_int8_t &pos, const float zval) { onMeshUpdate(pos.x, pos.y, zval); } + void onMeshUpdate(const int8_t xpos, const int8_t ypos, const float &zval); + inline void onMeshUpdate(const xy_int8_t &pos, const float &zval) { onMeshUpdate(pos.x, pos.y, zval); } typedef enum : uint8_t { MESH_START, // Prior to start of probe @@ -178,41 +178,42 @@ namespace ExtUI { char* getFilamentUsed_str(char buffer[21]); #endif - void setTargetTemp_celsius(const float, const heater_t); - void setTargetTemp_celsius(const float, const extruder_t); - void setTargetFan_percent(const float, const fan_t); - void setAxisPosition_mm(const float, const axis_t, const feedRate_t=0); - void setAxisPosition_mm(const float, const extruder_t, const feedRate_t=0); - void setAxisSteps_per_mm(const float, const axis_t); - void setAxisSteps_per_mm(const float, const extruder_t); + void setTargetTemp_celsius(const float&, const heater_t); + void setTargetTemp_celsius(const float&, const extruder_t); + void setTargetFan_percent(const float&, const fan_t); + void coolDown(); + void setAxisPosition_mm(const float&, const axis_t, const feedRate_t=0); + void setAxisPosition_mm(const float&, const extruder_t, const feedRate_t=0); + void setAxisSteps_per_mm(const float&, const axis_t); + void setAxisSteps_per_mm(const float&, const extruder_t); void setAxisMaxFeedrate_mm_s(const feedRate_t, const axis_t); void setAxisMaxFeedrate_mm_s(const feedRate_t, const extruder_t); - void setAxisMaxAcceleration_mm_s2(const float, const axis_t); - void setAxisMaxAcceleration_mm_s2(const float, const extruder_t); + void setAxisMaxAcceleration_mm_s2(const float&, const axis_t); + void setAxisMaxAcceleration_mm_s2(const float&, const extruder_t); void setFeedrate_mm_s(const feedRate_t); void setMinFeedrate_mm_s(const feedRate_t); void setMinTravelFeedrate_mm_s(const feedRate_t); - void setPrintingAcceleration_mm_s2(const float); - void setRetractAcceleration_mm_s2(const float); - void setTravelAcceleration_mm_s2(const float); - void setFeedrate_percent(const float); + void setPrintingAcceleration_mm_s2(const float&); + void setRetractAcceleration_mm_s2(const float&); + void setTravelAcceleration_mm_s2(const float&); + void setFeedrate_percent(const float&); void setFlow_percent(const int16_t, const extruder_t); bool awaitingUserConfirm(); void setUserConfirmed(); #if ENABLED(LIN_ADVANCE) float getLinearAdvance_mm_mm_s(const extruder_t); - void setLinearAdvance_mm_mm_s(const float, const extruder_t); + void setLinearAdvance_mm_mm_s(const float&, const extruder_t); #endif #if HAS_JUNCTION_DEVIATION float getJunctionDeviation_mm(); - void setJunctionDeviation_mm(const float); + void setJunctionDeviation_mm(const float&); #else float getAxisMaxJerk_mm_s(const axis_t); float getAxisMaxJerk_mm_s(const extruder_t); - void setAxisMaxJerk_mm_s(const float, const axis_t); - void setAxisMaxJerk_mm_s(const float, const extruder_t); + void setAxisMaxJerk_mm_s(const float&, const axis_t); + void setAxisMaxJerk_mm_s(const float&, const extruder_t); #endif extruder_t getTool(const uint8_t extruder); @@ -220,7 +221,7 @@ namespace ExtUI { void setActiveTool(const extruder_t, bool no_move); #if ENABLED(BABYSTEPPING) - int16_t mmToWholeSteps(const float mm, const axis_t axis); + int16_t mmToWholeSteps(const float& mm, const axis_t axis); bool babystepAxis_steps(const int16_t steps, const axis_t axis); void smartAdjustAxis_steps(const int16_t steps, const axis_t axis, bool linked_nozzles); @@ -228,28 +229,28 @@ namespace ExtUI { #if HAS_HOTEND_OFFSET float getNozzleOffset_mm(const axis_t, const extruder_t); - void setNozzleOffset_mm(const float, const axis_t, const extruder_t); + void setNozzleOffset_mm(const float&, const axis_t, const extruder_t); void normalizeNozzleOffset(const axis_t axis); #endif float getZOffset_mm(); - void setZOffset_mm(const float); + void setZOffset_mm(const float&); #if HAS_BED_PROBE float getProbeOffset_mm(const axis_t); - void setProbeOffset_mm(const float, const axis_t); + void setProbeOffset_mm(const float&, const axis_t); #endif #if ENABLED(BACKLASH_GCODE) float getAxisBacklash_mm(const axis_t); - void setAxisBacklash_mm(const float, const axis_t); + void setAxisBacklash_mm(const float&, const axis_t); float getBacklashCorrection_percent(); - void setBacklashCorrection_percent(const float); + void setBacklashCorrection_percent(const float&); #ifdef BACKLASH_SMOOTHING_MM float getBacklashSmoothing_mm(); - void setBacklashSmoothing_mm(const float); + void setBacklashSmoothing_mm(const float&); #endif #endif @@ -261,7 +262,7 @@ namespace ExtUI { #if HAS_FILAMENT_RUNOUT_DISTANCE float getFilamentRunoutDistance_mm(); - void setFilamentRunoutDistance_mm(const float); + void setFilamentRunoutDistance_mm(const float&); #endif #endif @@ -271,7 +272,7 @@ namespace ExtUI { #if DISABLED(CASE_LIGHT_NO_BRIGHTNESS) float getCaseLightBrightness_percent(); - void setCaseLightBrightness_percent(const float); + void setCaseLightBrightness_percent(const float&); #endif #endif @@ -279,16 +280,16 @@ namespace ExtUI { float getPIDValues_Kp(const extruder_t); float getPIDValues_Ki(const extruder_t); float getPIDValues_Kd(const extruder_t); - void setPIDValues(const float, const float, const float, extruder_t); - void startPIDTune(const float, extruder_t); + void setPIDValues(const float&, const float&, const float&, extruder_t); + void startPIDTune(const float&, extruder_t); #endif #if ENABLED(PIDTEMPBED) float getBedPIDValues_Kp(); float getBedPIDValues_Ki(); float getBedPIDValues_Kd(); - void setBedPIDValues(const float, const float, const float); - void startBedPIDTune(const float); + void setBedPIDValues(const float&, const float&, const float&); + void startBedPIDTune(const float&); #endif /** diff --git a/Marlin/src/sd/cardreader.h b/Marlin/src/sd/cardreader.h index f823b79e7a..4399d9a4b6 100644 --- a/Marlin/src/sd/cardreader.h +++ b/Marlin/src/sd/cardreader.h @@ -23,8 +23,6 @@ #include "../inc/MarlinConfig.h" -#define IFSD(A,B) TERN(SDSUPPORT,A,B) - #if ENABLED(SDSUPPORT) extern const char M23_STR[], M24_STR[]; From 8532c2b9b6a228f5884951b28612d28233734a07 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 12 Mar 2021 07:14:33 -0600 Subject: [PATCH 135/253] Fix MarlinSerial typo --- Marlin/src/HAL/AVR/MarlinSerial.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/HAL/AVR/MarlinSerial.h b/Marlin/src/HAL/AVR/MarlinSerial.h index ab49e9440a..d34408b165 100644 --- a/Marlin/src/HAL/AVR/MarlinSerial.h +++ b/Marlin/src/HAL/AVR/MarlinSerial.h @@ -287,7 +287,7 @@ #else static constexpr unsigned int RX_SIZE = 64; static constexpr unsigned int TX_SIZE = 128; - static constexpr bool RX_OVERRUNS = false + static constexpr bool RX_OVERRUNS = false; #endif }; From 71f261726381e07fa92f2aac07e8253779a4f487 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 12 Mar 2021 08:34:22 -0600 Subject: [PATCH 136/253] Pause SD queue early on M25 (#21317) --- Marlin/src/gcode/host/M115.cpp | 3 +++ Marlin/src/gcode/queue.cpp | 8 +++++++- Marlin/src/gcode/sd/M24_M25.cpp | 4 ++++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/Marlin/src/gcode/host/M115.cpp b/Marlin/src/gcode/host/M115.cpp index cd6fcbaf86..a518e68cf5 100644 --- a/Marlin/src/gcode/host/M115.cpp +++ b/Marlin/src/gcode/host/M115.cpp @@ -120,6 +120,9 @@ void GcodeSuite::M115() { // REPEAT (M808) cap_line(PSTR("REPEAT"), ENABLED(GCODE_REPEAT_MARKERS)); + // SD_WRITE (M928, M28, M29) + cap_line(PSTR("SD_WRITE"), ENABLED(SDSUPPORT) && DISABLED(SDCARD_READONLY)); + // AUTOREPORT_SD_STATUS (M27 extension) cap_line(PSTR("AUTOREPORT_SD_STATUS"), ENABLED(AUTO_REPORT_SD_STATUS)); diff --git a/Marlin/src/gcode/queue.cpp b/Marlin/src/gcode/queue.cpp index b093184c91..7845b01ad6 100644 --- a/Marlin/src/gcode/queue.cpp +++ b/Marlin/src/gcode/queue.cpp @@ -567,7 +567,6 @@ void GCodeQueue::get_serial_commands() { const bool is_eol = ISEOL(sd_char); if (is_eol || card_eof) { - // Reset stream state, terminate the buffer, and commit a non-empty command if (!is_eol && sd_count) ++sd_count; // End of file with no newline if (!process_line_done(sd_input_state, command.buffer, sd_count)) { @@ -575,6 +574,13 @@ void GCodeQueue::get_serial_commands() { // M808 L saves the sdpos of the next line. M808 loops to a new sdpos. TERN_(GCODE_REPEAT_MARKERS, repeat.early_parse_M808(command.buffer)); + #if DISABLED(PARK_HEAD_ON_PAUSE) + // When M25 is non-blocking it can still suspend SD commands + // Otherwise the M125 handler needs to know SD printing is active + if (command.buffer[0] == 'M' && command.buffer[1] == '2' && command.buffer[2] == '5' && !NUMERIC(command.buffer[3])) + card.pauseSDPrint(); + #endif + // Put the new command into the buffer (no "ok" sent) ring_buffer.commit_command(true); diff --git a/Marlin/src/gcode/sd/M24_M25.cpp b/Marlin/src/gcode/sd/M24_M25.cpp index 8fb529dcaa..1c98791bce 100644 --- a/Marlin/src/gcode/sd/M24_M25.cpp +++ b/Marlin/src/gcode/sd/M24_M25.cpp @@ -87,6 +87,10 @@ void GcodeSuite::M24() { /** * M25: Pause SD Print + * + * With PARK_HEAD_ON_PAUSE: + * Invoke M125 to store the current position and move to the park + * position. M24 will move the head back before resuming the print. */ void GcodeSuite::M25() { From 604c5dedf473cc962e3a0e52eb82bb18b75da1f2 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 6 Mar 2021 01:09:13 -0600 Subject: [PATCH 137/253] MarlinSerial cleanup --- Marlin/src/HAL/AVR/MarlinSerial.h | 33 +++++++++++-------------------- 1 file changed, 11 insertions(+), 22 deletions(-) diff --git a/Marlin/src/HAL/AVR/MarlinSerial.h b/Marlin/src/HAL/AVR/MarlinSerial.h index d34408b165..31bbaaa531 100644 --- a/Marlin/src/HAL/AVR/MarlinSerial.h +++ b/Marlin/src/HAL/AVR/MarlinSerial.h @@ -252,13 +252,13 @@ template struct MMU2SerialCfg { static constexpr int PORT = serial; + static constexpr unsigned int RX_SIZE = 32; + static constexpr unsigned int TX_SIZE = 32; static constexpr bool XONOFF = false; static constexpr bool EMERGENCYPARSER = false; static constexpr bool DROPPED_RX = false; static constexpr bool RX_FRAMING_ERRORS = false; static constexpr bool MAX_RX_QUEUED = false; - static constexpr unsigned int RX_SIZE = 32; - static constexpr unsigned int TX_SIZE = 32; static constexpr bool RX_OVERRUNS = false; }; @@ -270,28 +270,17 @@ template struct LCDSerialCfg { - static constexpr int PORT = serial; - static constexpr bool XONOFF = false; - static constexpr bool EMERGENCYPARSER = ENABLED(EMERGENCY_PARSER); - static constexpr bool DROPPED_RX = false; - static constexpr bool RX_FRAMING_ERRORS = false; - static constexpr bool MAX_RX_QUEUED = false; - #if HAS_DGUS_LCD - static constexpr unsigned int RX_SIZE = DGUS_RX_BUFFER_SIZE; - static constexpr unsigned int TX_SIZE = DGUS_TX_BUFFER_SIZE; - static constexpr bool RX_OVERRUNS = ENABLED(SERIAL_STATS_RX_BUFFER_OVERRUNS); - #elif EITHER(ANYCUBIC_LCD_I3MEGA, ANYCUBIC_LCD_CHIRON) - static constexpr unsigned int RX_SIZE = 64; - static constexpr unsigned int TX_SIZE = 128; - static constexpr bool RX_OVERRUNS = false; - #else - static constexpr unsigned int RX_SIZE = 64; - static constexpr unsigned int TX_SIZE = 128; - static constexpr bool RX_OVERRUNS = false; - #endif + static constexpr int PORT = serial; + static constexpr unsigned int RX_SIZE = TERN(HAS_DGUS_LCD, DGUS_RX_BUFFER_SIZE, 64); + static constexpr unsigned int TX_SIZE = TERN(HAS_DGUS_LCD, DGUS_TX_BUFFER_SIZE, 128); + static constexpr bool XONOFF = false; + static constexpr bool EMERGENCYPARSER = ENABLED(EMERGENCY_PARSER); + static constexpr bool DROPPED_RX = false; + static constexpr bool RX_FRAMING_ERRORS = false; + static constexpr bool MAX_RX_QUEUED = false; + static constexpr bool RX_OVERRUNS = BOTH(HAS_DGUS_LCD, SERIAL_STATS_RX_BUFFER_OVERRUNS); }; - typedef Serial1Class< MarlinSerial< LCDSerialCfg > > MSerialT4; extern MSerialT4 lcdSerial; #endif From 7f1fa0d1ff28cea68f5982eafab816b438c2ccdb Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 12 Mar 2021 09:25:41 -0600 Subject: [PATCH 138/253] Add M207/8/9 reporting (#21335) --- Marlin/src/feature/fwretract.cpp | 76 +++++++++++++++++++ Marlin/src/feature/fwretract.h | 9 +++ .../src/gcode/feature/fwretract/M207-M209.cpp | 36 ++------- Marlin/src/gcode/geometry/M206_M428.cpp | 4 +- Marlin/src/module/settings.cpp | 27 +------ 5 files changed, 98 insertions(+), 54 deletions(-) diff --git a/Marlin/src/feature/fwretract.cpp b/Marlin/src/feature/fwretract.cpp index 2a71af11d6..4e57ba0150 100644 --- a/Marlin/src/feature/fwretract.cpp +++ b/Marlin/src/feature/fwretract.cpp @@ -36,6 +36,8 @@ FWRetract fwretract; // Single instance - this calls the constructor #include "../module/planner.h" #include "../module/stepper.h" +#include "../gcode/parser.h" + #if ENABLED(RETRACT_SYNC_MIXING) #include "mixing.h" #endif @@ -198,4 +200,78 @@ void FWRetract::retract(const bool retracting //*/ } +//extern const char SP_Z_STR[]; + +/** + * M207: Set firmware retraction values + * + * S[+units] retract_length + * W[+units] swap_retract_length (multi-extruder) + * F[units/min] retract_feedrate_mm_s + * Z[units] retract_zraise + */ +void FWRetract::M207() { + if (!parser.seen("FSWZ")) return M207_report(); + if (parser.seen('S')) settings.retract_length = parser.value_axis_units(E_AXIS); + if (parser.seen('F')) settings.retract_feedrate_mm_s = MMM_TO_MMS(parser.value_axis_units(E_AXIS)); + if (parser.seen('Z')) settings.retract_zraise = parser.value_linear_units(); + if (parser.seen('W')) settings.swap_retract_length = parser.value_axis_units(E_AXIS); +} + +void FWRetract::M207_report(const bool forReplay/*=false*/) { + if (!forReplay) { SERIAL_ECHO_MSG("; Retract: S F Z"); SERIAL_ECHO_START(); } + SERIAL_ECHOLNPAIR_P( + PSTR(" M207 S"), LINEAR_UNIT(settings.retract_length) + , PSTR(" W"), LINEAR_UNIT(settings.swap_retract_length) + , PSTR(" F"), LINEAR_UNIT(MMS_TO_MMM(settings.retract_feedrate_mm_s)) + , SP_Z_STR, LINEAR_UNIT(settings.retract_zraise) + ); +} + +/** + * M208: Set firmware un-retraction values + * + * S[+units] retract_recover_extra (in addition to M207 S*) + * W[+units] swap_retract_recover_extra (multi-extruder) + * F[units/min] retract_recover_feedrate_mm_s + * R[units/min] swap_retract_recover_feedrate_mm_s + */ +void FWRetract::M208() { + if (!parser.seen("FSRW")) return M208_report(); + if (parser.seen('S')) settings.retract_recover_extra = parser.value_axis_units(E_AXIS); + if (parser.seen('F')) settings.retract_recover_feedrate_mm_s = MMM_TO_MMS(parser.value_axis_units(E_AXIS)); + if (parser.seen('R')) settings.swap_retract_recover_feedrate_mm_s = MMM_TO_MMS(parser.value_axis_units(E_AXIS)); + if (parser.seen('W')) settings.swap_retract_recover_extra = parser.value_axis_units(E_AXIS); +} + +void FWRetract::M208_report(const bool forReplay/*=false*/) { + if (!forReplay) { SERIAL_ECHO_MSG("; Recover: S F"); SERIAL_ECHO_START(); } + SERIAL_ECHOLNPAIR( + " M208 S", LINEAR_UNIT(settings.retract_recover_extra) + , " W", LINEAR_UNIT(settings.swap_retract_recover_extra) + , " F", LINEAR_UNIT(MMS_TO_MMM(settings.retract_recover_feedrate_mm_s)) + ); +} + +#if ENABLED(FWRETRACT_AUTORETRACT) + + /** + * M209: Enable automatic retract (M209 S1) + * For slicers that don't support G10/11, reversed extrude-only + * moves will be classified as retraction. + */ + void FWRetract::M209() { + if (!parser.seen('S')) return M209_report(); + if (MIN_AUTORETRACT <= MAX_AUTORETRACT) + enable_autoretract(parser.value_bool()); + } + + void FWRetract::M209_report(const bool forReplay/*=false*/) { + if (!forReplay) { SERIAL_ECHO_MSG("; Auto-Retract: S=0 to disable, 1 to interpret E-only moves as retract/recover"); SERIAL_ECHO_START(); } + SERIAL_ECHOLNPAIR(" M209 S", autoretract_enabled); + } + +#endif // FWRETRACT_AUTORETRACT + + #endif // FWRETRACT diff --git a/Marlin/src/feature/fwretract.h b/Marlin/src/feature/fwretract.h index 134851965d..4fa64ad83b 100644 --- a/Marlin/src/feature/fwretract.h +++ b/Marlin/src/feature/fwretract.h @@ -79,6 +79,15 @@ public: , bool swapping = false #endif ); + + static void M207(); + static void M207_report(const bool forReplay=false); + static void M208(); + static void M208_report(const bool forReplay=false); + #if ENABLED(FWRETRACT_AUTORETRACT) + static void M209(); + static void M209_report(const bool forReplay=false); + #endif }; extern FWRetract fwretract; diff --git a/Marlin/src/gcode/feature/fwretract/M207-M209.cpp b/Marlin/src/gcode/feature/fwretract/M207-M209.cpp index 538f16cde6..5793d73f94 100644 --- a/Marlin/src/gcode/feature/fwretract/M207-M209.cpp +++ b/Marlin/src/gcode/feature/fwretract/M207-M209.cpp @@ -29,46 +29,24 @@ /** * M207: Set firmware retraction values - * - * S[+units] retract_length - * W[+units] swap_retract_length (multi-extruder) - * F[units/min] retract_feedrate_mm_s - * Z[units] retract_zraise */ -void GcodeSuite::M207() { - 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_zraise = parser.value_linear_units(); - if (parser.seen('W')) fwretract.settings.swap_retract_length = parser.value_axis_units(E_AXIS); -} +void GcodeSuite::M207() { fwretract.M207(); } /** * M208: Set firmware un-retraction values - * - * S[+units] retract_recover_extra (in addition to M207 S*) - * W[+units] swap_retract_recover_extra (multi-extruder) - * F[units/min] retract_recover_feedrate_mm_s - * R[units/min] swap_retract_recover_feedrate_mm_s */ -void GcodeSuite::M208() { - if (parser.seen('S')) fwretract.settings.retract_recover_extra = 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_extra = parser.value_axis_units(E_AXIS); -} +void GcodeSuite::M208() { fwretract.M208(); } #if ENABLED(FWRETRACT_AUTORETRACT) /** * M209: Enable automatic retract (M209 S1) - * For slicers that don't support G10/11, reversed extrude-only - * moves will be classified as retraction. + * + * For slicers that don't support G10/11, reversed + * extruder-only moves can be classified as retraction. */ - void GcodeSuite::M209() { - if (MIN_AUTORETRACT <= MAX_AUTORETRACT && parser.seen('S')) - fwretract.enable_autoretract(parser.value_bool()); - } + void GcodeSuite::M209() { fwretract.M209(); } -#endif // FWRETRACT_AUTORETRACT +#endif #endif // FWRETRACT diff --git a/Marlin/src/gcode/geometry/M206_M428.cpp b/Marlin/src/gcode/geometry/M206_M428.cpp index 2a2cdb16ff..ac2420fcc3 100644 --- a/Marlin/src/gcode/geometry/M206_M428.cpp +++ b/Marlin/src/gcode/geometry/M206_M428.cpp @@ -30,7 +30,7 @@ #include "../../libs/buzzer.h" #include "../../MarlinCore.h" -void m206_report() { +void M206_report() { SERIAL_ECHOLNPAIR_P(PSTR("M206 X"), home_offset.x, SP_Y_STR, home_offset.y, SP_Z_STR, home_offset.z); } @@ -52,7 +52,7 @@ void GcodeSuite::M206() { #endif if (!parser.seen("XYZ")) - m206_report(); + M206_report(); else report_current_position(); } diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index c82ed0eb8f..d38ad51934 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -3466,29 +3466,10 @@ void MarlinSettings::reset() { #endif #if ENABLED(FWRETRACT) - - CONFIG_ECHO_HEADING("Retract: S F Z"); - CONFIG_ECHO_START(); - SERIAL_ECHOLNPAIR_P( - PSTR(" M207 S"), LINEAR_UNIT(fwretract.settings.retract_length) - , PSTR(" W"), LINEAR_UNIT(fwretract.settings.swap_retract_length) - , PSTR(" F"), LINEAR_UNIT(MMS_TO_MMM(fwretract.settings.retract_feedrate_mm_s)) - , SP_Z_STR, LINEAR_UNIT(fwretract.settings.retract_zraise) - ); - - CONFIG_ECHO_HEADING("Recover: S F"); - CONFIG_ECHO_MSG( - " M208 S", LINEAR_UNIT(fwretract.settings.retract_recover_extra) - , " W", LINEAR_UNIT(fwretract.settings.swap_retract_recover_extra) - , " F", LINEAR_UNIT(MMS_TO_MMM(fwretract.settings.retract_recover_feedrate_mm_s)) - ); - - #if ENABLED(FWRETRACT_AUTORETRACT) - CONFIG_ECHO_HEADING("Auto-Retract: S=0 to disable, 1 to interpret E-only moves as retract/recover"); - CONFIG_ECHO_MSG(" M209 S", fwretract.autoretract_enabled); - #endif - - #endif // FWRETRACT + fwretract.M207_report(forReplay); + fwretract.M208_report(forReplay); + TERN_(FWRETRACT_AUTORETRACT, fwretract.M209_report(forReplay)); + #endif /** * Probe Offset From 3107d8a0f4e71bc7853d78d026912582cf185adc Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 12 Mar 2021 07:34:44 -0600 Subject: [PATCH 139/253] Tweak opt_set, opt_enable --- buildroot/bin/opt_enable | 4 ++-- buildroot/bin/opt_set | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/buildroot/bin/opt_enable b/buildroot/bin/opt_enable index fdcb5dae2d..9161299b6e 100755 --- a/buildroot/bin/opt_enable +++ b/buildroot/bin/opt_enable @@ -7,7 +7,7 @@ SED=$(which gsed || which sed) for opt in "$@" ; do # Logic for returning nonzero based on answer here: https://stackoverflow.com/a/15966279/104648 - eval "${SED} -i '/^[[:blank:]]*\(\/\/\)*[[:blank:]]*\(#define \b${opt}\b\)/{s//\2/;h};\${x;/./{x;q0};x;q9}' Marlin/Configuration.h" || - eval "${SED} -i '/^[[:blank:]]*\(\/\/\)*[[:blank:]]*\(#define \b${opt}\b\)/{s//\2/;h};\${x;/./{x;q0};x;q9}' Marlin/Configuration_adv.h" || + eval "${SED} -i '/^\([[:blank:]]*\/\/\)*[[:blank:]]*\(#define \b${opt}\b\)/{s//\2/;h};\${x;/./{x;q0};x;q9}' Marlin/Configuration.h" || + eval "${SED} -i '/^\([[:blank:]]*\/\/\)*[[:blank:]]*\(#define \b${opt}\b\)/{s//\2/;h};\${x;/./{x;q0};x;q9}' Marlin/Configuration_adv.h" || (echo "ERROR: opt_enable Can't find ${opt}" >&2 && exit 9) done diff --git a/buildroot/bin/opt_set b/buildroot/bin/opt_set index 2a7a676cdc..2e63790c69 100755 --- a/buildroot/bin/opt_set +++ b/buildroot/bin/opt_set @@ -8,8 +8,8 @@ SED=$(which gsed || which sed) ARGC=$# while [[ $# > 1 ]]; do # Logic for returning nonzero based on answer here: https://stackoverflow.com/a/15966279/104648 - eval "${SED} -i '/^[[:blank:]]*\(\/\/\)*\([[:blank:]]*\)\(#define\s\+\b${1}\b\).*$/{s//\2\3 ${2}/;h};\${x;/./{x;q0};x;q9}' Marlin/Configuration.h" || - eval "${SED} -i '/^[[:blank:]]*\(\/\/\)*\([[:blank:]]*\)\(#define\s\+\b${1}\b\).*$/{s//\2\3 ${2}/;h};\${x;/./{x;q0};x;q9}' Marlin/Configuration_adv.h" || + eval "${SED} -i '/^\([[:blank:]]*\)\(\/\/\)*\([[:blank:]]*\)\(#define\s\+\b${1}\b\).*$/{s//\1\3\4 ${2}/;h};\${x;/./{x;q0};x;q9}' Marlin/Configuration.h" || + eval "${SED} -i '/^\([[:blank:]]*\)\(\/\/\)*\([[:blank:]]*\)\(#define\s\+\b${1}\b\).*$/{s//\1\3\4 ${2}/;h};\${x;/./{x;q0};x;q9}' Marlin/Configuration_adv.h" || eval "echo '#define ${1} ${2}' >>Marlin/Configuration.h" || (echo "ERROR: opt_set Can't set or add ${1}" >&2 && exit 9) shift 2 From 11343bb0ea8d41d5e4a26c30e2f6e30876b079f6 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Sat, 13 Mar 2021 00:16:55 +0000 Subject: [PATCH 140/253] [cron] Bump distribution date (2021-03-13) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index c9760f3f69..96aa83bc6f 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2021-03-12" + #define STRING_DISTRIBUTION_DATE "2021-03-13" #endif /** From da84b59ee4bfda6b878ec55b9684722a1946a14d Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Sat, 13 Mar 2021 08:01:02 -0300 Subject: [PATCH 141/253] No extra build folder for st/jlink upload (#21341) --- buildroot/share/PlatformIO/scripts/common-cxxflags.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/buildroot/share/PlatformIO/scripts/common-cxxflags.py b/buildroot/share/PlatformIO/scripts/common-cxxflags.py index 5c2bde7700..36704af283 100644 --- a/buildroot/share/PlatformIO/scripts/common-cxxflags.py +++ b/buildroot/share/PlatformIO/scripts/common-cxxflags.py @@ -22,10 +22,9 @@ def add_cpu_freq(): # # It will separe release and debug build folders. # It useful when we need keep two live versions: one debug, for debugging, -# other release, for flashing. +# other release, for flashing (when upload is not done automatically by jlink/stlink). # Without this, PIO will recompile everything twice for any small change. -# -if env.GetBuildType() == "debug": +if env.GetBuildType() == "debug" and env.get('UPLOAD_PROTOCOL') not in ['jlink', 'stlink']: env['BUILD_DIR'] = '$PROJECT_BUILD_DIR/$PIOENV/debug' # On some platform, F_CPU is a runtime variable. Since it's used to convert from ns From 911cd1a6d3883716986e7f3cf92fa4266de20d57 Mon Sep 17 00:00:00 2001 From: InsanityAutomation <38436470+InsanityAutomation@users.noreply.github.com> Date: Sat, 13 Mar 2021 08:37:49 -0500 Subject: [PATCH 142/253] Custom menu items confirm option (#21338) Co-authored-by: Scott Lahteine --- Marlin/Configuration_adv.h | 8 +++++++- Marlin/src/lcd/menu/menu_custom.cpp | 15 ++++++++++++++- Marlin/src/lcd/menu/menu_main.cpp | 12 +++++++----- 3 files changed, 28 insertions(+), 7 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 9ab3e2d044..fb1f79b230 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -3455,22 +3455,28 @@ //#define CUSTOM_USER_MENU_TITLE "Custom Commands" #define USER_SCRIPT_DONE "M117 User Script Done" #define USER_SCRIPT_AUDIBLE_FEEDBACK - //#define USER_SCRIPT_RETURN // Return to status screen after a script + //#define USER_SCRIPT_RETURN // Return to status screen after a script + #define CUSTOM_MENU_ONLY_IDLE // Only show custom menu when the machine is idle #define USER_DESC_1 "Home & UBL Info" #define USER_GCODE_1 "G28\nG29W" + //#define USER_CONFIRM_1 // Show a confirmation dialog before this action #define USER_DESC_2 "Preheat for " PREHEAT_1_LABEL #define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + //#define USER_CONFIRM_2 #define USER_DESC_3 "Preheat for " PREHEAT_2_LABEL #define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + //#define USER_CONFIRM_3 #define USER_DESC_4 "Heat Bed/Home/Level" #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" + //#define USER_CONFIRM_4 #define USER_DESC_5 "Home & Info" #define USER_GCODE_5 "G28\nM503" + //#define USER_CONFIRM_5 #endif /** diff --git a/Marlin/src/lcd/menu/menu_custom.cpp b/Marlin/src/lcd/menu/menu_custom.cpp index f3f946883f..cc1a8a6e80 100644 --- a/Marlin/src/lcd/menu/menu_custom.cpp +++ b/Marlin/src/lcd/menu/menu_custom.cpp @@ -46,7 +46,20 @@ void _lcd_user_gcode(PGM_P const cmd) { void menu_user() { START_MENU(); BACK_ITEM(MSG_MAIN); - #define USER_ITEM(N) ACTION_ITEM_P(PSTR(USER_DESC_##N), []{ _lcd_user_gcode(PSTR(USER_GCODE_##N _DONE_SCRIPT)); }); + + #define GCODE_LAMBDA(N) []{ _lcd_user_gcode(PSTR(USER_GCODE_##N _DONE_SCRIPT)); } + #define _USER_ITEM(N) ACTION_ITEM_P(PSTR(USER_DESC_##N), GCODE_LAMBDA(N)); + #define _USER_ITEM_CONFIRM(N) \ + SUBMENU_P(PSTR(USER_DESC_##N), []{ \ + MenuItem_confirm::confirm_screen( \ + GCODE_LAMBDA(N), \ + ui.goto_previous_screen, \ + PSTR(USER_DESC_##N "?") \ + ); \ + }) + + #define USER_ITEM(N) do{ if (ENABLED(USER_CONFIRM_##N)) _USER_ITEM_CONFIRM(N); else _USER_ITEM(N); }while(0) + #if HAS_USER_ITEM(1) USER_ITEM(1); #endif diff --git a/Marlin/src/lcd/menu/menu_main.cpp b/Marlin/src/lcd/menu/menu_main.cpp index 1e864e35be..d19e236a84 100644 --- a/Marlin/src/lcd/menu/menu_main.cpp +++ b/Marlin/src/lcd/menu/menu_main.cpp @@ -211,11 +211,13 @@ void menu_main() { SUBMENU(MSG_CONFIGURATION, menu_configuration); #if ENABLED(CUSTOM_USER_MENUS) - #ifdef CUSTOM_USER_MENU_TITLE - SUBMENU_P(PSTR(CUSTOM_USER_MENU_TITLE), menu_user); - #else - SUBMENU(MSG_USER_MENU, menu_user); - #endif + if (TERN1(CUSTOM_MENU_ONLY_IDLE, !busy)) { + #ifdef CUSTOM_USER_MENU_TITLE + SUBMENU_P(PSTR(CUSTOM_USER_MENU_TITLE), menu_user); + #else + SUBMENU(MSG_USER_MENU, menu_user); + #endif + } #endif #if ENABLED(ADVANCED_PAUSE_FEATURE) From 36d3b6aa95b454a7463651e12494b5b33a8b10bf Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Sun, 14 Mar 2021 00:13:50 +0000 Subject: [PATCH 143/253] [cron] Bump distribution date (2021-03-14) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 96aa83bc6f..0f327c561b 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2021-03-13" + #define STRING_DISTRIBUTION_DATE "2021-03-14" #endif /** From b9b9a3115a064acefae1386fcffd6c19a1aa6ead Mon Sep 17 00:00:00 2001 From: XDA-Bam <1209896+XDA-Bam@users.noreply.github.com> Date: Sun, 14 Mar 2021 17:42:25 +0100 Subject: [PATCH 144/253] Update display timing for SKR Pro (#21346) --- Marlin/src/pins/sanguino/pins_MELZI_V2.h | 2 +- Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Marlin/src/pins/sanguino/pins_MELZI_V2.h b/Marlin/src/pins/sanguino/pins_MELZI_V2.h index 275498d558..e0369923c7 100644 --- a/Marlin/src/pins/sanguino/pins_MELZI_V2.h +++ b/Marlin/src/pins/sanguino/pins_MELZI_V2.h @@ -29,7 +29,7 @@ #define BOARD_ST7920_DELAY_1 DELAY_NS(0) #endif #ifndef BOARD_ST7920_DELAY_2 - #define BOARD_ST7920_DELAY_2 DELAY_NS(188) + #define BOARD_ST7920_DELAY_2 DELAY_NS(400) #endif #ifndef BOARD_ST7920_DELAY_3 #define BOARD_ST7920_DELAY_3 DELAY_NS(0) diff --git a/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h b/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h index 863429f2a2..01ba3d72f6 100644 --- a/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h +++ b/Marlin/src/pins/stm32f4/pins_BTT_SKR_PRO_common.h @@ -441,10 +441,10 @@ // Alter timing for graphical display #if HAS_MARLINUI_U8GLIB #ifndef BOARD_ST7920_DELAY_1 - #define BOARD_ST7920_DELAY_1 DELAY_NS(96) + #define BOARD_ST7920_DELAY_1 DELAY_NS(125) #endif #ifndef BOARD_ST7920_DELAY_2 - #define BOARD_ST7920_DELAY_2 DELAY_NS(48) + #define BOARD_ST7920_DELAY_2 DELAY_NS(90) #endif #ifndef BOARD_ST7920_DELAY_3 #define BOARD_ST7920_DELAY_3 DELAY_NS(600) From cc3e878f90b38bcd9116c1b4e8ff31a4209299e9 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sun, 14 Mar 2021 11:43:20 -0500 Subject: [PATCH 145/253] Fix small wired EEPROM (#21337) Co-Authored-By: jafal99 <26922965+jafal99@users.noreply.github.com> --- Marlin/src/HAL/shared/eeprom_if_i2c.cpp | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/Marlin/src/HAL/shared/eeprom_if_i2c.cpp b/Marlin/src/HAL/shared/eeprom_if_i2c.cpp index da70af2772..299bc34c49 100644 --- a/Marlin/src/HAL/shared/eeprom_if_i2c.cpp +++ b/Marlin/src/HAL/shared/eeprom_if_i2c.cpp @@ -51,6 +51,18 @@ void eeprom_init() { static constexpr uint8_t eeprom_device_address = I2C_ADDRESS(EEPROM_DEVICE_ADDRESS); +void _beginTransmission(const uint16_t memoryAddress) { + if (MARLIN_EEPROM_SIZE > 0x4000) { // Use two-byte addressing for EEPROMs >16kb + Wire.beginTransmission(eeprom_device_address); + Wire.write(memoryAddress >> 8); // Address High Byte + } + else { + const uint8_t addr = eeprom_device_address | byte((memoryAddress >> 8) & 0x07); + Wire.beginTransmission(addr); + } + Wire.write(memoryAddress & 0xFF); // Address Low Byte (or only byte for chips <= 16Kb like 24C02/04/08/16) +} + // ------------------------ // Public functions // ------------------------ @@ -58,9 +70,7 @@ static constexpr uint8_t eeprom_device_address = I2C_ADDRESS(EEPROM_DEVICE_ADDRE void eeprom_write_byte(uint8_t *pos, unsigned char value) { const unsigned eeprom_address = (unsigned)pos; - Wire.beginTransmission(eeprom_device_address); - Wire.write(int(eeprom_address >> 8)); // MSB - Wire.write(int(eeprom_address & 0xFF)); // LSB + _beginTransmission(eeprom_address); Wire.write(value); Wire.endTransmission(); @@ -72,11 +82,12 @@ void eeprom_write_byte(uint8_t *pos, unsigned char value) { uint8_t eeprom_read_byte(uint8_t *pos) { const unsigned eeprom_address = (unsigned)pos; - Wire.beginTransmission(eeprom_device_address); - Wire.write(int(eeprom_address >> 8)); // MSB - Wire.write(int(eeprom_address & 0xFF)); // LSB + _beginTransmission(eeprom_address); Wire.endTransmission(); - Wire.requestFrom(eeprom_device_address, (byte)1); + + // For EEPROMs <=16Kb the lower address bits are used for 2Kb page address + const int addr = eeprom_device_address | (MARLIN_EEPROM_SIZE <= 0x4000 ? byte((eeprom_address >> 8) & 0x07) : byte(0)); + Wire.requestFrom(addr, byte(1)); return Wire.available() ? Wire.read() : 0xFF; } From d787cd307680c5c4f155ad4643c1137db56bb006 Mon Sep 17 00:00:00 2001 From: X-Ryl669 Date: Sun, 14 Mar 2021 18:11:11 +0100 Subject: [PATCH 146/253] Fix build with Meatpack only on 2nd port (#21336) Co-authored-by: Scott Lahteine --- Marlin/src/HAL/HAL.h | 6 ----- Marlin/src/feature/meatpack.cpp | 1 - Marlin/src/inc/Conditionals_LCD.h | 26 ++++++++++++++----- Marlin/src/inc/Conditionals_adv.h | 7 +++++ Marlin/src/inc/Conditionals_post.h | 13 ---------- .../PlatformIO/scripts/common-dependencies.h | 2 -- 6 files changed, 26 insertions(+), 29 deletions(-) diff --git a/Marlin/src/HAL/HAL.h b/Marlin/src/HAL/HAL.h index 9eefda8fb1..0cd836af2b 100644 --- a/Marlin/src/HAL/HAL.h +++ b/Marlin/src/HAL/HAL.h @@ -29,12 +29,6 @@ #include HAL_PATH(.,HAL.h) -#ifdef SERIAL_PORT_2 - #define NUM_SERIAL 2 -#else - #define NUM_SERIAL 1 -#endif - #define HAL_ADC_RANGE _BV(HAL_ADC_RESOLUTION) #ifndef I2C_ADDRESS diff --git a/Marlin/src/feature/meatpack.cpp b/Marlin/src/feature/meatpack.cpp index 178831c9bb..44567ac482 100644 --- a/Marlin/src/feature/meatpack.cpp +++ b/Marlin/src/feature/meatpack.cpp @@ -42,7 +42,6 @@ #if HAS_MEATPACK #include "meatpack.h" -MeatPack meatpack; #define MeatPack_ProtocolVersion "PV01" //#define MP_DEBUG diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index e5f7441e77..b9b86a7bf3 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -654,13 +654,6 @@ #define UNUSED_E(E) UNUSED(E) #endif -#if ENABLED(DWIN_CREALITY_LCD) - #define SERIAL_CATCHALL 0 - #ifndef LCD_SERIAL_PORT - #define LCD_SERIAL_PORT 3 // Creality 4.x board - #endif -#endif - /** * The BLTouch Probe emulates a servo probe * and uses "special" angles for its state. @@ -950,6 +943,18 @@ #define HAS_CLASSIC_E_JERK 1 #endif +// +// Serial Port Info +// +#ifdef SERIAL_PORT_2 + #define NUM_SERIAL 2 + #define HAS_MULTI_SERIAL 1 +#elif defined(SERIAL_PORT) + #define NUM_SERIAL 1 +#else + #define NUM_SERIAL 0 + #undef BAUD_RATE_GCODE +#endif #if SERIAL_PORT == -1 || SERIAL_PORT_2 == -1 #define HAS_USB_SERIAL 1 #endif @@ -957,6 +962,13 @@ #define HAS_ETHERNET 1 #endif +#if ENABLED(DWIN_CREALITY_LCD) + #define SERIAL_CATCHALL 0 + #ifndef LCD_SERIAL_PORT + #define LCD_SERIAL_PORT 3 // Creality 4.x board + #endif +#endif + // Fallback Stepper Driver types that don't depend on Configuration_adv.h #ifndef X_DRIVER_TYPE #define X_DRIVER_TYPE A4988 diff --git a/Marlin/src/inc/Conditionals_adv.h b/Marlin/src/inc/Conditionals_adv.h index 00b9b1faef..490766bd7a 100644 --- a/Marlin/src/inc/Conditionals_adv.h +++ b/Marlin/src/inc/Conditionals_adv.h @@ -542,3 +542,10 @@ #else #define HAS_USER_ITEM(N) 0 #endif + +#if !HAS_MULTI_SERIAL + #undef MEATPACK_ON_SERIAL_PORT_2 +#endif +#if EITHER(MEATPACK_ON_SERIAL_PORT_1, MEATPACK_ON_SERIAL_PORT_2) + #define HAS_MEATPACK 1 +#endif diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index a6567e9714..fb06a7a3f3 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -2906,16 +2906,3 @@ #if BUTTONS_EXIST(EN1, EN2, ENC) #define HAS_ROTARY_ENCODER 1 #endif - -#if !NUM_SERIAL - #undef BAUD_RATE_GCODE -#elif NUM_SERIAL > 1 - #define HAS_MULTI_SERIAL 1 -#endif - -#if !HAS_MULTI_SERIAL - #undef MEATPACK_ON_SERIAL_PORT_2 -#endif -#if EITHER(MEATPACK_ON_SERIAL_PORT_1, MEATPACK_ON_SERIAL_PORT_2) - #define HAS_MEATPACK 1 -#endif diff --git a/buildroot/share/PlatformIO/scripts/common-dependencies.h b/buildroot/share/PlatformIO/scripts/common-dependencies.h index ed2f46abae..03fae56fdb 100644 --- a/buildroot/share/PlatformIO/scripts/common-dependencies.h +++ b/buildroot/share/PlatformIO/scripts/common-dependencies.h @@ -26,8 +26,6 @@ * Used by common-dependencies.py */ -#define NUM_SERIAL 1 // Normally provided by HAL/HAL.h - #include "../../../../Marlin/src/inc/MarlinConfig.h" // From 4f6910c131cda52b187f2caa42c9cf2ce0885a5d Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Sun, 14 Mar 2021 14:14:09 -0300 Subject: [PATCH 147/253] Script to generate Marlin TFT Images (#21340) --- buildroot/share/scripts/gen-tft-image.py | 64 ++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 buildroot/share/scripts/gen-tft-image.py diff --git a/buildroot/share/scripts/gen-tft-image.py b/buildroot/share/scripts/gen-tft-image.py new file mode 100644 index 0000000000..d89245fea4 --- /dev/null +++ b/buildroot/share/scripts/gen-tft-image.py @@ -0,0 +1,64 @@ +#!/usr/bin/env python3 +# +# Marlin 3D Printer Firmware +# Copyright (c) 2021 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 . +# + +# Generate Marlin TFT Images from bitmaps/PNG/JPG + +import sys,re,struct +from PIL import Image,ImageDraw + +def image2bin(image, output_file): + if output_file.endswith(('.c', '.cpp')): + f = open(output_file, 'wt') + is_cpp = True + f.write("const uint16_t image[%d] = {\n" % (image.size[1] * image.size[0])) + else: + f = open(output_file, 'wb') + is_cpp = False + pixs = image.load() + for y in range(image.size[1]): + for x in range(image.size[0]): + R = pixs[x, y][0] >> 3 + G = pixs[x, y][1] >> 2 + B = pixs[x, y][2] >> 3 + rgb = (R << 11) | (G << 5) | B + if is_cpp: + strHex = '0x{0:04X}, '.format(rgb) + f.write(strHex) + else: + f.write(struct.pack("B", (rgb & 0xFF))) + f.write(struct.pack("B", (rgb >> 8) & 0xFF)) + if is_cpp: + f.write("\n") + if is_cpp: + f.write("};\n") + f.close() + +if len(sys.argv) <= 2: + print("Utility to export a image in Marlin TFT friendly format.") + print("It will dump a raw bin RGB565 image or create a CPP file with an array of 16 bit image pixels.") + print("Usage: gen-tft-image.py INPUT_IMAGE.(png|bmp|jpg) OUTPUT_FILE.(cpp|bin)") + print("Author: rhapsodyv") + exit(1) + +output_img = sys.argv[2] +img = Image.open(sys.argv[1]) +image2bin(img, output_img) From ae8be31247ef0731036935d25b4d571a7f1733a8 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Mon, 15 Mar 2021 00:13:36 +0000 Subject: [PATCH 148/253] [cron] Bump distribution date (2021-03-15) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 0f327c561b..fb6f756a84 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2021-03-14" + #define STRING_DISTRIBUTION_DATE "2021-03-15" #endif /** From c07f99d5e406ef82376ad3baeb246d3e78c9a7e3 Mon Sep 17 00:00:00 2001 From: X-Ryl669 Date: Mon, 15 Mar 2021 02:23:41 +0100 Subject: [PATCH 149/253] Teensy USB / serial followup (#21316) --- Marlin/src/HAL/TEENSY31_32/HAL.cpp | 6 +++++- Marlin/src/HAL/TEENSY31_32/HAL.h | 10 ++++++++-- Marlin/src/HAL/TEENSY35_36/HAL.cpp | 2 +- Marlin/src/HAL/TEENSY35_36/HAL.h | 2 +- Marlin/src/HAL/TEENSY40_41/HAL.cpp | 6 +++++- Marlin/src/HAL/TEENSY40_41/HAL.h | 9 +++++++-- 6 files changed, 27 insertions(+), 8 deletions(-) diff --git a/Marlin/src/HAL/TEENSY31_32/HAL.cpp b/Marlin/src/HAL/TEENSY31_32/HAL.cpp index 8a13f1d884..7b7202547a 100644 --- a/Marlin/src/HAL/TEENSY31_32/HAL.cpp +++ b/Marlin/src/HAL/TEENSY31_32/HAL.cpp @@ -31,7 +31,11 @@ #include -DefaultSerial1 MSerial0(false); +#define _IMPLEMENT_SERIAL(X) DefaultSerial##X MSerial##X(false, Serial##X) +#define IMPLEMENT_SERIAL(X) _IMPLEMENT_SERIAL(X) +#if WITHIN(SERIAL_PORT, 0, 3) + IMPLEMENT_SERIAL(SERIAL_PORT); +#endif USBSerialType USBSerial(false, SerialUSB); uint16_t HAL_adc_result; diff --git a/Marlin/src/HAL/TEENSY31_32/HAL.h b/Marlin/src/HAL/TEENSY31_32/HAL.h index cd1c334899..bbfc50a36f 100644 --- a/Marlin/src/HAL/TEENSY31_32/HAL.h +++ b/Marlin/src/HAL/TEENSY31_32/HAL.h @@ -51,8 +51,13 @@ #endif #include "../../core/serial_hook.h" -typedef Serial1Class DefaultSerial1; -extern DefaultSerial1 MSerial0; + +#define Serial0 Serial +#define _DECLARE_SERIAL(X) \ + typedef ForwardSerial1Class DefaultSerial##X; \ + extern DefaultSerial##X MSerial##X +#define DECLARE_SERIAL(X) _DECLARE_SERIAL(X) + typedef ForwardSerial1Class USBSerialType; extern USBSerialType USBSerial; @@ -62,6 +67,7 @@ extern USBSerialType USBSerial; #if SERIAL_PORT == -1 #define MYSERIAL1 USBSerial #elif WITHIN(SERIAL_PORT, 0, 3) + DECLARE_SERIAL(SERIAL_PORT); #define MYSERIAL1 MSERIAL(SERIAL_PORT) #endif diff --git a/Marlin/src/HAL/TEENSY35_36/HAL.cpp b/Marlin/src/HAL/TEENSY35_36/HAL.cpp index 8640bdfe00..5d808cd19b 100644 --- a/Marlin/src/HAL/TEENSY35_36/HAL.cpp +++ b/Marlin/src/HAL/TEENSY35_36/HAL.cpp @@ -31,7 +31,7 @@ #include -#define _IMPLEMENT_SERIAL(X) DefaultSerial##X MSerial##X(false) +#define _IMPLEMENT_SERIAL(X) DefaultSerial##X MSerial##X(false, Serial##X) #define IMPLEMENT_SERIAL(X) _IMPLEMENT_SERIAL(X) #if WITHIN(SERIAL_PORT, 0, 3) IMPLEMENT_SERIAL(SERIAL_PORT); diff --git a/Marlin/src/HAL/TEENSY35_36/HAL.h b/Marlin/src/HAL/TEENSY35_36/HAL.h index e769454b3f..5b120d852d 100644 --- a/Marlin/src/HAL/TEENSY35_36/HAL.h +++ b/Marlin/src/HAL/TEENSY35_36/HAL.h @@ -57,7 +57,7 @@ #define Serial0 Serial #define _DECLARE_SERIAL(X) \ - typedef Serial1Class DefaultSerial##X; \ + typedef ForwardSerial1Class DefaultSerial##X; \ extern DefaultSerial##X MSerial##X #define DECLARE_SERIAL(X) _DECLARE_SERIAL(X) diff --git a/Marlin/src/HAL/TEENSY40_41/HAL.cpp b/Marlin/src/HAL/TEENSY40_41/HAL.cpp index 0fde9da537..1eab3d837e 100644 --- a/Marlin/src/HAL/TEENSY40_41/HAL.cpp +++ b/Marlin/src/HAL/TEENSY40_41/HAL.cpp @@ -32,7 +32,11 @@ #include -DefaultSerial1 MSerial0(false); +#define _IMPLEMENT_SERIAL(X) DefaultSerial##X MSerial##X(false, Serial##X) +#define IMPLEMENT_SERIAL(X) _IMPLEMENT_SERIAL(X) +#if WITHIN(SERIAL_PORT, 0, 3) + IMPLEMENT_SERIAL(SERIAL_PORT); +#endif USBSerialType USBSerial(false, SerialUSB); uint16_t HAL_adc_result, HAL_adc_select; diff --git a/Marlin/src/HAL/TEENSY40_41/HAL.h b/Marlin/src/HAL/TEENSY40_41/HAL.h index 03a12e1b92..ce985dadb9 100644 --- a/Marlin/src/HAL/TEENSY40_41/HAL.h +++ b/Marlin/src/HAL/TEENSY40_41/HAL.h @@ -56,8 +56,12 @@ #endif #include "../../core/serial_hook.h" -typedef Serial1Class DefaultSerial1; -extern DefaultSerial1 MSerial0; +#define Serial0 Serial +#define _DECLARE_SERIAL(X) \ + typedef ForwardSerial1Class DefaultSerial##X; \ + extern DefaultSerial##X MSerial##X +#define DECLARE_SERIAL(X) _DECLARE_SERIAL(X) + typedef ForwardSerial1Class USBSerialType; extern USBSerialType USBSerial; @@ -67,6 +71,7 @@ extern USBSerialType USBSerial; #if SERIAL_PORT == -1 #define MYSERIAL1 SerialUSB #elif WITHIN(SERIAL_PORT, 0, 8) + DECLARE_SERIAL(SERIAL_PORT); #define MYSERIAL1 MSERIAL(SERIAL_PORT) #else #error "The required SERIAL_PORT must be from -1 to 8. Please update your configuration." From 1a23ffd7768483914485f9ea569c5813613eef92 Mon Sep 17 00:00:00 2001 From: "K.3D" <40525619+KA8888@users.noreply.github.com> Date: Mon, 15 Mar 2021 17:02:40 +0100 Subject: [PATCH 150/253] KRATOS32 / K.32 board and LCD controllers (#21334) --- Marlin/Configuration.h | 16 ++- Marlin/src/core/boards.h | 1 + Marlin/src/inc/Conditionals_LCD.h | 8 +- Marlin/src/inc/SanityCheck.h | 4 +- Marlin/src/lcd/dogm/marlinui_DOGM.cpp | 2 +- Marlin/src/lcd/dogm/marlinui_DOGM.h | 5 +- Marlin/src/pins/pins.h | 2 + Marlin/src/pins/sam/pins_KRATOS32.h | 179 ++++++++++++++++++++++++++ 8 files changed, 208 insertions(+), 9 deletions(-) create mode 100644 Marlin/src/pins/sam/pins_KRATOS32.h diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 1098351d4e..726ff1ec0b 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -2181,6 +2181,11 @@ // //#define REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER +// +// K.3D Full Graphic Smart Controller +// +//#define K3D_FULL_GRAPHIC_SMART_CONTROLLER + // // ReprapWorld Graphical LCD // https://reprapworld.com/?products_details&products_id/1218 @@ -2318,7 +2323,7 @@ //#define OLED_PANEL_TINYBOY2 // -// MKS OLED 1.3" 128×64 FULL GRAPHICS CONTROLLER +// MKS OLED 1.3" 128×64 Full Graphics Controller // https://reprap.org/wiki/MKS_12864OLED // // Tiny, but very sharp OLED display @@ -2327,7 +2332,7 @@ //#define MKS_12864OLED_SSD1306 // Uses the SSD1306 controller // -// Zonestar OLED 128×64 FULL GRAPHICS CONTROLLER +// Zonestar OLED 128×64 Full Graphics Controller // //#define ZONESTAR_12864LCD // Graphical (DOGM) with ST7920 controller //#define ZONESTAR_12864OLED // 1.3" OLED with SH1106 controller (default) @@ -2344,10 +2349,15 @@ //#define OVERLORD_OLED // -// FYSETC OLED 2.42" 128×64 FULL GRAPHICS CONTROLLER with WS2812 RGB +// FYSETC OLED 2.42" 128×64 Full Graphics Controller with WS2812 RGB // Where to find : https://www.aliexpress.com/item/4000345255731.html //#define FYSETC_242_OLED_12864 // Uses the SSD1309 controller +// +// K.3D SSD1309 OLED 2.42" 128×64 Full Graphics Controller +// +//#define K3D_242_OLED_CONTROLLER // Software SPI + //============================================================================= //========================== Extensible UI Displays =========================== //============================================================================= diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index cfde52ddb9..f0d967c763 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -279,6 +279,7 @@ #define BOARD_ARCHIM2 3024 // UltiMachine Archim2 (with TMC2130 drivers) #define BOARD_ALLIGATOR 3025 // Alligator Board R2 #define BOARD_CNCONTROLS_15D 3026 // Cartesio CN Controls V15 on DUE +#define BOARD_KRATOS32 3027 // K.3D Kratos32 (Arduino Due Shield) // // SAM3X8C ARM Cortex M3 diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index b9b86a7bf3..fc7eec84ee 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -229,14 +229,18 @@ #define BOARD_ST7920_DELAY_2 DELAY_NS(125) #define BOARD_ST7920_DELAY_3 DELAY_NS(125) -#elif ANY(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER, ANET_FULL_GRAPHICS_LCD, ANET_FULL_GRAPHICS_LCD_ALT_WIRING, BQ_LCD_SMART_CONTROLLER) +#elif ANY(REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER, ANET_FULL_GRAPHICS_LCD, ANET_FULL_GRAPHICS_LCD_ALT_WIRING, BQ_LCD_SMART_CONTROLLER, K3D_FULL_GRAPHIC_SMART_CONTROLLER) #define IS_RRD_FG_SC 1 #elif ENABLED(REPRAP_DISCOUNT_SMART_CONTROLLER) - // RepRapDiscount LCD or Graphical LCD with rotary click encoder + #define IS_RRD_SC 1 // RepRapDiscount LCD or Graphical LCD with rotary click encoder + +#elif ENABLED(K3D_242_OLED_CONTROLLER) + #define IS_RRD_SC 1 + #define U8GLIB_SSD1309 #endif diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 6802bff1dd..5302aac208 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -2372,7 +2372,9 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal + ENABLED(ULTIPANEL) \ + ENABLED(ULTRA_LCD) \ + ENABLED(YHCB2004) \ - + ENABLED(ZONESTAR_LCD) + + ENABLED(ZONESTAR_LCD) \ + + ENABLED(K3D_FULL_GRAPHIC_SMART_CONTROLLER) \ + + ENABLED(K3D_242_OLED_CONTROLLER) #error "Please select only one LCD controller option." #endif diff --git a/Marlin/src/lcd/dogm/marlinui_DOGM.cpp b/Marlin/src/lcd/dogm/marlinui_DOGM.cpp index d2b1ce7740..7334ba5f26 100644 --- a/Marlin/src/lcd/dogm/marlinui_DOGM.cpp +++ b/Marlin/src/lcd/dogm/marlinui_DOGM.cpp @@ -256,7 +256,7 @@ void MarlinUI::init_lcd() { OUT_WRITE(LCD_BACKLIGHT_PIN, DISABLED(DELAYED_BACKLIGHT_INIT)); // Illuminate after reset or right away #endif - #if ANY(MKS_12864OLED, MKS_12864OLED_SSD1306, FYSETC_242_OLED_12864, ZONESTAR_12864OLED) + #if ANY(MKS_12864OLED, MKS_12864OLED_SSD1306, FYSETC_242_OLED_12864, ZONESTAR_12864OLED, K3D_242_OLED_CONTROLLER) SET_OUTPUT(LCD_PINS_DC); #ifndef LCD_RESET_PIN #define LCD_RESET_PIN LCD_PINS_RS diff --git a/Marlin/src/lcd/dogm/marlinui_DOGM.h b/Marlin/src/lcd/dogm/marlinui_DOGM.h index e5862d670f..e3ceb63f96 100644 --- a/Marlin/src/lcd/dogm/marlinui_DOGM.h +++ b/Marlin/src/lcd/dogm/marlinui_DOGM.h @@ -123,9 +123,10 @@ #define U8G_CLASS U8GLIB_SSD1306_128X64 // 8 stripes #endif -#elif ENABLED(FYSETC_242_OLED_12864) +#elif EITHER(FYSETC_242_OLED_12864, K3D_242_OLED_CONTROLLER) - // FYSETC OLED 2.42" 128 × 64 FULL GRAPHICS CONTROLLER + // FYSETC OLED 2.42" 128 × 64 Full Graphics Controller + // or K3D OLED 2.42" 128 × 64 Full Graphics Controller #define FORCE_SOFT_SPI // SW-SPI diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index b8cf695fb5..58a87f2313 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -447,6 +447,8 @@ #include "sam/pins_PRINTRBOARD_G2.h" // SAM3X8C env:DUE_USB #elif MB(CNCONTROLS_15D) #include "sam/pins_CNCONTROLS_15D.h" // SAM3X8E env:DUE env:DUE_USB +#elif MB(KRATOS32) + #include "sam/pins_KRATOS32.h" // SAM3X8E env:DUE env:DUE_USB // // STM32 ARM Cortex-M0 diff --git a/Marlin/src/pins/sam/pins_KRATOS32.h b/Marlin/src/pins/sam/pins_KRATOS32.h new file mode 100644 index 0000000000..f429e56347 --- /dev/null +++ b/Marlin/src/pins/sam/pins_KRATOS32.h @@ -0,0 +1,179 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 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 + +/** + * KRATOS32 + */ + +#include "env_validate.h" + +#define BOARD_INFO_NAME "K.3D KRATOS32" + +// +// EEPROM +// +#if EITHER(NO_EEPROM_SELECTED, I2C_EEPROM) + #define I2C_EEPROM + #define MARLIN_EEPROM_SIZE 0x1F400 // 16KB +#endif + +// +// Servos +// +#define SERVO0_PIN 6 +#define SERVO1_PIN 5 +#define SERVO2_PIN 39 +#define SERVO3_PIN 40 // CAMERA_PIN (extended to the top of the LCD module) +#define SERVO4_PIN 45 // FIL_RUNOUT_PIN + +// +// Limit Switches +// +#define X_MIN_PIN 28 +#define X_MAX_PIN 34 +#define Y_MIN_PIN 30 +#define Y_MAX_PIN 36 +#define Z_MIN_PIN 32 +#define Z_MAX_PIN 38 + +// +// Steppers +// +#define X_STEP_PIN 24 +#define X_DIR_PIN 23 +#define X_ENABLE_PIN 26 +#ifndef X_CS_PIN + #define X_CS_PIN 25 +#endif + +#define Y_STEP_PIN 17 +#define Y_DIR_PIN 16 +#define Y_ENABLE_PIN 22 +#ifndef Y_CS_PIN + #define Y_CS_PIN 27 +#endif + +#define Z_STEP_PIN 2 +#define Z_DIR_PIN 3 +#define Z_ENABLE_PIN 15 +#ifndef Z_CS_PIN + #define Z_CS_PIN 29 +#endif + +#define E0_STEP_PIN 61 +#define E0_DIR_PIN 60 +#define E0_ENABLE_PIN 62 +#ifndef E0_CS_PIN + #define E0_CS_PIN 31 +#endif + +#define E1_STEP_PIN 64 +#define E1_DIR_PIN 63 +#define E1_ENABLE_PIN 65 +#ifndef E1_CS_PIN + #define E1_CS_PIN 37 +#endif + +#define E2_STEP_PIN 68 +#define E2_DIR_PIN 67 +#define E2_ENABLE_PIN 69 +#ifndef E2_CS_PIN + #define E2_CS_PIN 35 +#endif + +#define E3_STEP_PIN 51 +#define E3_DIR_PIN 53 +#define E3_ENABLE_PIN 49 +#ifndef E3_CS_PIN + #define E3_CS_PIN 33 +#endif + +// +// Temperature Sensors +// +#define TEMP_0_PIN 0 // Analog Input +#define TEMP_1_PIN 1 // Analog Input +#define TEMP_2_PIN 2 // Analog Input +#define TEMP_3_PIN 3 // Analog Input +#define TEMP_BED_PIN 4 // Analog Input + +// +// Heaters / Fans +// +#define HEATER_0_PIN 13 +#define HEATER_1_PIN 12 +#define HEATER_2_PIN 11 +#define HEATER_3_PIN 10 +#define HEATER_BED_PIN 7 // BED + +#ifndef FAN_PIN + #define FAN_PIN 9 +#endif +#define FAN1_PIN 8 + +// +// Misc. Functions +// +#ifndef FIL_RUNOUT_PIN + #define FIL_RUNOUT_PIN 45 // SERVO4_PIN +#endif + +#ifndef PS_ON_PIN + #define PS_ON_PIN 59 +#endif + +// +// LCD / Controller +// +#if HAS_WIRED_LCD + + #define BTN_EN1 48 + #define BTN_EN2 50 + #define BTN_ENC 46 + + #define SDSS 4 + #define SD_DETECT_PIN 14 + + #define BEEPER_PIN 41 + #define KILL_PIN 66 + + #if IS_RRD_FG_SC + + #define LCD_PINS_RS 42 + #define LCD_PINS_ENABLE 43 + #define LCD_PINS_D4 44 + + #define BTN_BACK 52 + + #elif ENABLED(K3D_242_OLED_CONTROLLER) + + #define LCD_PINS_DC 44 + #define LCD_PINS_RS 42 + #define DOGLCD_CS 52 + #define DOGLCD_MOSI 43 + #define DOGLCD_SCK 47 + #define DOGLCD_A0 LCD_PINS_DC + + #endif + +#endif // HAS_WIRED_LCD From 5ffa6f3331569c8fa0266c1395d7a6a8cf5515f9 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Tue, 16 Mar 2021 00:13:07 +0000 Subject: [PATCH 151/253] [cron] Bump distribution date (2021-03-16) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index fb6f756a84..8cc286f342 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2021-03-15" + #define STRING_DISTRIBUTION_DATE "2021-03-16" #endif /** From dc78e0a2500d17b770e6a3a71730f1047c8a0056 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 16 Mar 2021 17:33:10 -0500 Subject: [PATCH 152/253] Detect extra ENVS in preflight checks (#21361) --- .../PlatformIO/scripts/preflight-checks.py | 48 +++++++++++-------- 1 file changed, 29 insertions(+), 19 deletions(-) diff --git a/buildroot/share/PlatformIO/scripts/preflight-checks.py b/buildroot/share/PlatformIO/scripts/preflight-checks.py index 969a82aad2..4499c2bfdc 100644 --- a/buildroot/share/PlatformIO/scripts/preflight-checks.py +++ b/buildroot/share/PlatformIO/scripts/preflight-checks.py @@ -2,33 +2,34 @@ # preflight-checks.py # Check for common issues prior to compiling # -import os,re +import os,re,sys Import("env") -def get_envs_for_board(board): - if board.startswith("BOARD_"): - board = board[6:] - with open(os.path.join("Marlin", "src", "pins", "pins.h"),"r") as f: - board_found = "" - r=re.compile(r"if\s+MB\((.+)\)") - for line in f.readlines(): +def get_envs_for_board(board, envregex): + with open(os.path.join("Marlin", "src", "pins", "pins.h"), "r") as file: + r = re.compile(r"if\s+MB\((.+)\)") + if board.startswith("BOARD_"): + board = board[6:] + + for line in file: mbs = r.findall(line) - if mbs: - board_found = board if board in re.split(r",\s*", mbs[0]) else "" - if board_found and "#include " in line and "env:" in line: - return re.findall(r"env:\w+", line) + if mbs and board in re.split(r",\s*", mbs[0]): + line = file.readline() + found_envs = re.match(r"\s*#include .+" + envregex, line) + if found_envs: + return re.findall(envregex + r"(\w+)", line) return [] -def check_envs(build_env, base_envs, config): - if build_env in base_envs: +def check_envs(build_env, board_envs, config): + if build_env in board_envs: return True ext = config.get(build_env, 'extends', default=None) if ext: if isinstance(ext, str): - return check_envs(ext, base_envs, config) + return check_envs(ext, board_envs, config) elif isinstance(ext, list): for ext_env in ext: - if check_envs(ext_env, base_envs, config): + if check_envs(ext_env, board_envs, config): return True return False @@ -42,15 +43,24 @@ if 'MARLIN_FEATURES' not in env: if 'MOTHERBOARD' not in env['MARLIN_FEATURES']: raise SystemExit("Error: MOTHERBOARD is not defined in Configuration.h") +if sys.platform == 'win32': + osregex = r"(?:env|win):" +elif sys.platform == 'darwin': + osregex = r"(?:env|mac|uni):" +elif sys.platform == 'linux': + osregex = r"(?:env|lin|uni):" +else: + osregex = r"(?:env):" + build_env = env['PIOENV'] motherboard = env['MARLIN_FEATURES']['MOTHERBOARD'] -base_envs = get_envs_for_board(motherboard) +board_envs = get_envs_for_board(motherboard, osregex) config = env.GetProjectConfig() -result = check_envs("env:"+build_env, base_envs, config) +result = check_envs(build_env, board_envs, config) if not result: err = "Error: Build environment '%s' is incompatible with %s. Use one of these: %s" % \ - (build_env, motherboard, ",".join([e[4:] for e in base_envs if e.startswith("env:")])) + (build_env, motherboard, ",".join([e[4:] for e in board_envs if re.match(r"^" + osregex, e)])) raise SystemExit(err) # From 546e56ef3d28787035e53ec3f55d243c459edaca Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Wed, 17 Mar 2021 00:13:28 +0000 Subject: [PATCH 153/253] [cron] Bump distribution date (2021-03-17) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 8cc286f342..a3d28df6f3 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2021-03-16" + #define STRING_DISTRIBUTION_DATE "2021-03-17" #endif /** From 60607ed18d47ae5a7a51d92f468b044d76bd3187 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 17 Mar 2021 02:39:26 -0500 Subject: [PATCH 154/253] mftest: usage with error --- buildroot/bin/mftest | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/buildroot/bin/mftest b/buildroot/bin/mftest index d769ff8cb8..4cecf4f3a5 100755 --- a/buildroot/bin/mftest +++ b/buildroot/bin/mftest @@ -30,7 +30,6 @@ OPTIONS -v --verbose Extra output for debugging. env shortcuts: tree due esp lin lpc|lpc8 lpc9 m128 m256|mega stm|f1 f4 f7 s6 teensy|t31|t32 t35|t36 t40|t41 - " } @@ -58,47 +57,48 @@ while getopts 'abhmruvyn:t:-:' OFLAG; do h) EXIT_USAGE=1 ;; m) USE_MAKE=1 ; bugout "Using make with Docker..." ;; n) case "$OPTARG" in - *[!0-9]*) perror "option requires a number" $OFLAG ; EXIT_USAGE=1 ;; + *[!0-9]*) perror "option requires a number" $OFLAG ; EXIT_USAGE=2 ;; *) CHOICE="$OPTARG" ; bugout "Got a number: $CHOICE" ;; esac ;; - r) REBUILD=1 ; bugout "Rebuilding previous..." ;; + r) REBUILD=1 ; bugout "Rebuilding previous..." ;; t) TESTENV="$OPTARG" ; bugout "Got a target: $TESTENV" ;; - u) AUTO_BUILD=2 ; bugout "Auto-Upload target..." ;; + u) AUTO_BUILD=2 ; bugout "Auto-Upload target..." ;; v) DEBUG=1 ; bugout "Debug ON" ;; - y) BUILD_YES='Y' ; bugout "Build will initiate..." ;; + y) BUILD_YES='Y' ; bugout "Build will initiate..." ;; -) IFS="=" read -r ONAM OVAL <<< "$OPTARG" case "$ONAM" in help) [[ -z "$OVAL" ]] || perror "option can't take value $OVAL" $ONAM ; EXIT_USAGE=1 ;; autobuild) AUTO_BUILD=1 ; bugout "Auto-Build target..." ;; autoupload) AUTO_BUILD=2 ; bugout "Auto-Upload target..." ;; env) case "$OVAL" in - '') perror "option requires a value" $ONAM ; EXIT_USAGE=1 ;; + '') perror "option requires a value" $ONAM ; EXIT_USAGE=2 ;; *) TESTENV="$OVAL" ; bugout "Got a target: $TESTENV" ;; esac ;; num) case "$OVAL" in [0-9]+) CHOICE="$OVAL" ; bugout "Got a number: $CHOICE" ;; - *) perror "option requires a value" $ONAM ; EXIT_USAGE=1 ;; + *) perror "option requires a value" $ONAM ; EXIT_USAGE=2 ;; esac ;; - rebuild) REBUILD=1 ; bugout "Rebuilding previous..." ;; - make) USE_MAKE=1 ; bugout "Using make with Docker..." ;; -debug|verbose) DEBUG=1 ; bugout "Debug ON" ;; + rebuild) REBUILD=1 ; bugout "Rebuilding previous..." ;; + make) USE_MAKE=1 ; bugout "Using make with Docker..." ;; +debug|verbose) DEBUG=1 ; bugout "Debug ON" ;; build) case "$OVAL" in ''|y|yes) BUILD_YES='Y' ;; n|no) BUILD_YES='N' ;; - *) perror "option value must be y, n, yes, or no" $ONAM ; EXIT_USAGE=1 ;; + *) perror "option value must be y, n, yes, or no" $ONAM ; EXIT_USAGE=2 ;; esac bugout "Build will initiate? ($BUILD_YES)" ;; - *) perror "Unknown flag" "$OPTARG" ; EXIT_USAGE=1 ;; + *) perror "Unknown flag" "$OPTARG" ; EXIT_USAGE=2 ;; esac ;; + *) EXIT_USAGE=2 ;; esac done -((EXIT_USAGE)) && { usage ; exit 1 ; } +((EXIT_USAGE)) && { usage ; let EXIT_USAGE-- ; exit $EXIT_USAGE ; } if ((REBUILD)); then bugout "Rebuilding previous..." From 2fc854eda06446c919c46a8e1cd323d5d0e7ad87 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Thu, 18 Mar 2021 00:15:21 +0000 Subject: [PATCH 155/253] [cron] Bump distribution date (2021-03-18) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index a3d28df6f3..43094400ea 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2021-03-17" + #define STRING_DISTRIBUTION_DATE "2021-03-18" #endif /** From de73b9b9345f0d10291d56a801bfc0d8d61a9cf3 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 17 Mar 2021 19:24:07 -0500 Subject: [PATCH 156/253] Update setup() description --- Marlin/src/MarlinCore.cpp | 116 +++++++++++++++++++++++++++++--------- 1 file changed, 89 insertions(+), 27 deletions(-) diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index e1756af511..158f9e227a 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -953,23 +953,92 @@ inline void tmc_standby_setup() { } /** - * Marlin entry-point: Set up before the program loop - * - Set up the kill pin, filament runout, power hold, custom user buttons - * - Start the serial port + * Marlin Firmware entry-point. Abandon Hope All Ye Who Enter Here. + * Setup before the program loop: + * + * - Call any special pre-init set for the board + * - Put TMC drivers into Low Power Standby mode + * - Init the serial ports (so setup can be debugged) + * - Set up the kill and suicide pins + * - Prepare (disable) board JTAG and Debug ports + * - Init serial for a connected MKS TFT with WiFi + * - Install Marlin custom Exception Handlers, if set. + * - Init Marlin's HAL interfaces (for SPI, i2c, etc.) + * - Init some optional hardware and features: + * • MAX Thermocouple pins + * • Duet Smart Effector + * • Filament Runout Sensor + * • TMC220x Stepper Drivers (Serial) + * • PSU control + * • Power-loss Recovery + * • L64XX Stepper Drivers (SPI) + * • Stepper Driver Reset: DISABLE + * • TMC Stepper Drivers (SPI) + * • Run BOARD_INIT if defined + * • ESP WiFi + * - Get the Reset Reason and report it * - Print startup messages and diagnostics - * - Get EEPROM or default settings - * - Initialize managers for: - * • temperature - * • planner - * • watchdog - * • stepper - * • photo pin - * • servos - * • LCD controller - * • Digipot I2C - * • Z probe sled - * • status LEDs - * • Max7219 + * - Calibrate the HAL DELAY for precise timing + * - Init the buzzer, possibly a custom timer + * - Init more optional hardware: + * • Color LED illumination + * • Neopixel illumination + * • Controller Fan + * • Creality DWIN LCD (show boot image) + * • Tare the Probe if possible + * - Mount the (most likely external) SD Card + * - Load settings from EEPROM (or use defaults) + * - Init the Ethernet Port + * - Init Touch Buttons (for emulated DOGLCD) + * - Adjust the (certainly wrong) current position by the home offset + * - Init the Planner::position (steps) based on current (native) position + * - Initialize more managers and peripherals: + * • Temperatures + * • Print Job Timer + * • Endstops and Endstop Interrupts + * • Stepper ISR - Kind of Important! + * • Servos + * • Servo-based Probe + * • Photograph Pin + * • Laser/Spindle tool Power / PWM + * • Coolant Control + * • Bed Probe + * • Stepper Driver Reset: ENABLE + * • Digipot I2C - Stepper driver current control + * • Stepper DAC - Stepper driver current control + * • Solenoid (probe, or for other use) + * • Home Pin + * • Custom User Buttons + * • Red/Blue Status LEDs + * • Case Light + * • Prusa MMU filament changer + * • Fan Multiplexer + * • Mixing Extruder + * • BLTouch Probe + * • I2C Position Encoders + * • Custom I2C Bus handlers + * • Enhanced tools or extruders: + * • Switching Extruder + * • Switching Nozzle + * • Parking Extruder + * • Magnetic Parking Extruder + * • Switching Toolhead + * • Electromagnetic Switching Toolhead + * • Watchdog Timer - Also Kind of Important! + * • Closed Loop Controller + * - Run Startup Commands, if defined + * - Tell host to close Host Prompts + * - Test Trinamic driver connections + * - Init Prusa MMU2 filament changer + * - Init and test BL24Cxx EEPROM + * - Init Creality DWIN encoder, show faux progress bar + * - Reset Status Message / Show Service Messages + * - Init MAX7219 LED Matrix + * - Init Direct Stepping (Klipper-style motion control) + * - Init TFT LVGL UI (with 3D Graphics) + * - Apply Password Lock - Hold for Authentication + * - Open Touch Screen Calibration screen, if not calibrated + * - Set Marlin to RUNNING State */ void setup() { #ifdef BOARD_PREINIT @@ -1311,7 +1380,6 @@ void setup() { #if PIN_EXISTS(STAT_LED_RED) OUT_WRITE(STAT_LED_RED_PIN, LOW); // OFF #endif - #if PIN_EXISTS(STAT_LED_BLUE) OUT_WRITE(STAT_LED_BLUE_PIN, LOW); // OFF #endif @@ -1364,19 +1432,13 @@ void setup() { #endif #endif - #if ENABLED(MAGNETIC_PARKING_EXTRUDER) - SETUP_RUN(mpe_settings_init()); - #endif - #if ENABLED(PARKING_EXTRUDER) SETUP_RUN(pe_solenoid_init()); - #endif - - #if ENABLED(SWITCHING_TOOLHEAD) + #elif ENABLED(MAGNETIC_PARKING_EXTRUDER) + SETUP_RUN(mpe_settings_init()); + #elif ENABLED(SWITCHING_TOOLHEAD) SETUP_RUN(swt_init()); - #endif - - #if ENABLED(ELECTROMAGNETIC_SWITCHING_TOOLHEAD) + #elif ENABLED(ELECTROMAGNETIC_SWITCHING_TOOLHEAD) SETUP_RUN(est_init()); #endif From 15bda88d0494a12d41e523c9c57dbe1d6cf8eeb2 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 17 Mar 2021 19:23:36 -0500 Subject: [PATCH 157/253] Un-pause fans on STOP --- Marlin/src/MarlinCore.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 158f9e227a..26ca8305f4 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -889,8 +889,8 @@ void stop() { print_job_timer.stop(); - #if ENABLED(PROBING_FANS_OFF) - if (thermalManager.fans_paused) thermalManager.set_fans_paused(false); // put things back the way they were + #if EITHER(PROBING_FANS_OFF, ADVANCED_PAUSE_FANS_PAUSE) + thermalManager.set_fans_paused(false); // Un-pause fans for safety #endif if (IsRunning()) { From 9823a37362c86f8f722c01af2147075d70234ada Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 16 Mar 2021 15:12:28 -0500 Subject: [PATCH 158/253] E1+ Autotemp and Planner comments --- Marlin/src/lcd/extui/ui_api.cpp | 2 - Marlin/src/module/planner.cpp | 171 +++++++++++++++++++------------- Marlin/src/module/planner.h | 35 +++++-- 3 files changed, 131 insertions(+), 77 deletions(-) diff --git a/Marlin/src/lcd/extui/ui_api.cpp b/Marlin/src/lcd/extui/ui_api.cpp index d83b921648..97d4ec2b08 100644 --- a/Marlin/src/lcd/extui/ui_api.cpp +++ b/Marlin/src/lcd/extui/ui_api.cpp @@ -587,13 +587,11 @@ namespace ExtUI { void setAxisMaxAcceleration_mm_s2(const float &value, const axis_t axis) { planner.set_max_acceleration(axis, value); - planner.reset_acceleration_rates(); } void setAxisMaxAcceleration_mm_s2(const float &value, const extruder_t extruder) { UNUSED_E(extruder); planner.set_max_acceleration(E_AXIS_N(extruder - E0), value); - planner.reset_acceleration_rates(); } #if HAS_FILAMENT_SENSOR diff --git a/Marlin/src/module/planner.cpp b/Marlin/src/module/planner.cpp index dd87a0d24d..c60e9f6cd3 100644 --- a/Marlin/src/module/planner.cpp +++ b/Marlin/src/module/planner.cpp @@ -1248,32 +1248,6 @@ void Planner::recalculate() { recalculate_trapezoids(); } -#if ENABLED(AUTOTEMP) - - void Planner::getHighESpeed() { - static float oldt = 0; - - if (!autotemp_enabled) return; - if (thermalManager.degTargetHotend(0) + 2 < autotemp_min) return; // probably temperature set to zero. - - float high = 0.0; - for (uint8_t b = block_buffer_tail; b != block_buffer_head; b = next_block_index(b)) { - block_t* block = &block_buffer[b]; - if (block->steps.x || block->steps.y || block->steps.z) { - const float se = (float)block->steps.e / block->step_event_count * SQRT(block->nominal_speed_sqr); // mm/sec; - NOLESS(high, se); - } - } - - float t = autotemp_min + high * autotemp_factor; - LIMIT(t, autotemp_min, autotemp_max); - if (t < oldt) t = t * (1 - float(AUTOTEMP_OLDWEIGHT)) + oldt * float(AUTOTEMP_OLDWEIGHT); - oldt = t; - thermalManager.setTargetHotend(t, 0); - } - -#endif // AUTOTEMP - /** * Maintain fans, paste extruder pressure, */ @@ -1398,6 +1372,72 @@ void Planner::check_axes_activity() { #endif } +#if ENABLED(AUTOTEMP) + + #if ENABLED(AUTOTEMP_PROPORTIONAL) + void Planner::_autotemp_update_from_hotend() { + const int16_t target = thermalManager.degTargetHotend(active_extruder); + autotemp_min = target + AUTOTEMP_MIN_P; + autotemp_max = target + AUTOTEMP_MAX_P; + } + #endif + + /** + * Called after changing tools to: + * - Reset or re-apply the default proportional autotemp factor. + * - Enable autotemp if the factor is non-zero. + */ + void Planner::autotemp_update() { + _autotemp_update_from_hotend(); + autotemp_factor = TERN(AUTOTEMP_PROPORTIONAL, AUTOTEMP_FACTOR_P, 0); + autotemp_enabled = autotemp_factor != 0; + } + + /** + * Called by the M104/M109 commands after setting Hotend Temperature + * + */ + void Planner::autotemp_M104_M109() { + _autotemp_update_from_hotend(); + + if (parser.seenval('S')) autotemp_min = parser.value_celsius(); + if (parser.seenval('B')) autotemp_max = parser.value_celsius(); + + // When AUTOTEMP_PROPORTIONAL is enabled, F0 disables autotemp. + // Normally, leaving off F also disables autotemp. + autotemp_factor = parser.seen('F') ? parser.value_float() : TERN(AUTOTEMP_PROPORTIONAL, AUTOTEMP_FACTOR_P, 0); + autotemp_enabled = autotemp_factor != 0; + } + + /** + * Called every so often to adjust the hotend target temperature + * based on the extrusion speed, which is calculated from the blocks + * currently in the planner. + */ + void Planner::getHighESpeed() { + static float oldt = 0; + + if (!autotemp_enabled) return; + if (thermalManager.degTargetHotend(active_extruder) < autotemp_min - 2) return; // Below the min? + + float high = 0.0; + for (uint8_t b = block_buffer_tail; b != block_buffer_head; b = next_block_index(b)) { + block_t* block = &block_buffer[b]; + if (block->steps.x || block->steps.y || block->steps.z) { + const float se = (float)block->steps.e / block->step_event_count * SQRT(block->nominal_speed_sqr); // mm/sec; + NOLESS(high, se); + } + } + + float t = autotemp_min + high * autotemp_factor; + LIMIT(t, autotemp_min, autotemp_max); + if (t < oldt) t *= (1.0f - (AUTOTEMP_OLDWEIGHT)) + oldt * (AUTOTEMP_OLDWEIGHT); + oldt = t; + thermalManager.setTargetHotend(t, active_extruder); + } + +#endif + #if DISABLED(NO_VOLUMETRICS) /** @@ -2959,13 +2999,17 @@ void Planner::reset_acceleration_rates() { TERN_(HAS_LINEAR_E_JERK, recalculate_max_e_jerk()); } -// Recalculate position, steps_to_mm if settings.axis_steps_per_mm changes! +/** + * Recalculate 'position' and 'steps_to_mm'. + * Must be called whenever settings.axis_steps_per_mm changes! + */ void Planner::refresh_positioning() { LOOP_XYZE_N(i) steps_to_mm[i] = 1.0f / settings.axis_steps_per_mm[i]; set_position_mm(current_position); reset_acceleration_rates(); } +// Apply limits to a variable and give a warning if the value was out of range inline void limit_and_warn(float &val, const uint8_t axis, PGM_P const setting_name, const xyze_float_t &max_limit) { const uint8_t lim_axis = axis > E_AXIS ? E_AXIS : axis; const float before = val; @@ -2978,7 +3022,14 @@ inline void limit_and_warn(float &val, const uint8_t axis, PGM_P const setting_n } } -void Planner::set_max_acceleration(const uint8_t axis, float targetValue) { +/** + * For the specified 'axis' set the Maximum Acceleration to the given value (mm/s^2) + * The value may be limited with warning feedback, if configured. + * Calls reset_acceleration_rates to precalculate planner terms in steps. + * + * This hard limit is applied as a block is being added to the planner queue. + */ +void Planner::set_max_acceleration(const uint8_t axis, const float &inMaxAccelMMS2) { #if ENABLED(LIMITED_MAX_ACCEL_EDITING) #ifdef MAX_ACCEL_EDIT_VALUES constexpr xyze_float_t max_accel_edit = MAX_ACCEL_EDIT_VALUES; @@ -2987,15 +3038,21 @@ void Planner::set_max_acceleration(const uint8_t axis, float targetValue) { constexpr xyze_float_t max_accel_edit = DEFAULT_MAX_ACCELERATION; const xyze_float_t max_acc_edit_scaled = max_accel_edit * 2; #endif - limit_and_warn(targetValue, axis, PSTR("Acceleration"), max_acc_edit_scaled); + limit_and_warn(inMaxAccelMMS2, axis, PSTR("Acceleration"), max_acc_edit_scaled); #endif - settings.max_acceleration_mm_per_s2[axis] = targetValue; + settings.max_acceleration_mm_per_s2[axis] = inMaxAccelMMS2; // Update steps per s2 to agree with the units per s2 (since they are used in the planner) reset_acceleration_rates(); } -void Planner::set_max_feedrate(const uint8_t axis, float targetValue) { +/** + * For the specified 'axis' set the Maximum Feedrate to the given value (mm/s) + * The value may be limited with warning feedback, if configured. + * + * This hard limit is applied as a block is being added to the planner queue. + */ +void Planner::set_max_feedrate(const uint8_t axis, const float &inMaxFeedrateMMS) { #if ENABLED(LIMITED_MAX_FR_EDITING) #ifdef MAX_FEEDRATE_EDIT_VALUES constexpr xyze_float_t max_fr_edit = MAX_FEEDRATE_EDIT_VALUES; @@ -3004,13 +3061,20 @@ void Planner::set_max_feedrate(const uint8_t axis, float targetValue) { constexpr xyze_float_t max_fr_edit = DEFAULT_MAX_FEEDRATE; const xyze_float_t max_fr_edit_scaled = max_fr_edit * 2; #endif - limit_and_warn(targetValue, axis, PSTR("Feedrate"), max_fr_edit_scaled); + limit_and_warn(inMaxFeedrateMMS, axis, PSTR("Feedrate"), max_fr_edit_scaled); #endif - settings.max_feedrate_mm_s[axis] = targetValue; + settings.max_feedrate_mm_s[axis] = inMaxFeedrateMMS; } -void Planner::set_max_jerk(const AxisEnum axis, float targetValue) { - #if HAS_CLASSIC_JERK +#if HAS_CLASSIC_JERK + + /** + * For the specified 'axis' set the Maximum Jerk (instant change) to the given value (mm/s) + * The value may be limited with warning feedback, if configured. + * + * This hard limit is applied (to the block start speed) as the block is being added to the planner queue. + */ + void Planner::set_max_jerk(const AxisEnum axis, const float &targetValue) { #if ENABLED(LIMITED_JERK_EDITING) constexpr xyze_float_t max_jerk_edit = #ifdef MAX_JERK_EDIT_VALUES @@ -3023,10 +3087,9 @@ void Planner::set_max_jerk(const AxisEnum axis, float targetValue) { limit_and_warn(targetValue, axis, PSTR("Jerk"), max_jerk_edit); #endif max_jerk[axis] = targetValue; - #else - UNUSED(axis); UNUSED(targetValue); - #endif -} + } + +#endif #if HAS_WIRED_LCD @@ -3069,33 +3132,3 @@ void Planner::set_max_jerk(const AxisEnum axis, float targetValue) { } #endif - -#if ENABLED(AUTOTEMP) - -void Planner::autotemp_update() { - #if ENABLED(AUTOTEMP_PROPORTIONAL) - const int16_t target = thermalManager.degTargetHotend(active_extruder); - autotemp_min = target + AUTOTEMP_MIN_P; - autotemp_max = target + AUTOTEMP_MAX_P; - #endif - autotemp_factor = TERN(AUTOTEMP_PROPORTIONAL, AUTOTEMP_FACTOR_P, 0); - autotemp_enabled = autotemp_factor != 0; -} - - void Planner::autotemp_M104_M109() { - - #if ENABLED(AUTOTEMP_PROPORTIONAL) - const int16_t target = thermalManager.degTargetHotend(active_extruder); - autotemp_min = target + AUTOTEMP_MIN_P; - autotemp_max = target + AUTOTEMP_MAX_P; - #endif - - if (parser.seenval('S')) autotemp_min = parser.value_celsius(); - if (parser.seenval('B')) autotemp_max = parser.value_celsius(); - - // When AUTOTEMP_PROPORTIONAL is enabled, F0 disables autotemp. - // Normally, leaving off F also disables autotemp. - autotemp_factor = parser.seen('F') ? parser.value_float() : TERN(AUTOTEMP_PROPORTIONAL, AUTOTEMP_FACTOR_P, 0); - autotemp_enabled = autotemp_factor != 0; - } -#endif diff --git a/Marlin/src/module/planner.h b/Marlin/src/module/planner.h index b7ff0ee932..a7aabd9d65 100644 --- a/Marlin/src/module/planner.h +++ b/Marlin/src/module/planner.h @@ -460,12 +460,27 @@ class Planner { * Static (class) Methods */ + // Recalculate steps/s^2 accelerations based on mm/s^2 settings static void reset_acceleration_rates(); - static void refresh_positioning(); - static void set_max_acceleration(const uint8_t axis, float targetValue); - static void set_max_feedrate(const uint8_t axis, float targetValue); - static void set_max_jerk(const AxisEnum axis, float targetValue); + /** + * Recalculate 'position' and 'steps_to_mm'. + * Must be called whenever settings.axis_steps_per_mm changes! + */ + static void refresh_positioning(); + + // For an axis set the Maximum Acceleration in mm/s^2 + static void set_max_acceleration(const uint8_t axis, const float &inMaxAccelMMS2); + + // For an axis set the Maximum Feedrate in mm/s + static void set_max_feedrate(const uint8_t axis, const float &inMaxFeedrateMMS); + + // For an axis set the Maximum Jerk (instant change) in mm/s + #if HAS_CLASSIC_JERK + static void set_max_jerk(const AxisEnum axis, const float &inMaxJerkMMS); + #else + static inline void set_max_jerk(const AxisEnum, const float&) {} + #endif #if EXTRUDERS FORCE_INLINE static void refresh_e_factor(const uint8_t e) { @@ -883,9 +898,9 @@ class Planner { #if ENABLED(AUTOTEMP) static float autotemp_min, autotemp_max, autotemp_factor; static bool autotemp_enabled; - static void getHighESpeed(); - static void autotemp_M104_M109(); static void autotemp_update(); + static void autotemp_M104_M109(); + static void getHighESpeed(); #endif #if HAS_LINEAR_E_JERK @@ -898,6 +913,14 @@ class Planner { private: + #if ENABLED(AUTOTEMP) + #if ENABLED(AUTOTEMP_PROPORTIONAL) + static void _autotemp_update_from_hotend(); + #else + static inline void _autotemp_update_from_hotend() {} + #endif + #endif + /** * Get the index of the next / previous block in the ring buffer */ From deaefbf1dcb823f22a8f9edd3fbba069ef9257b9 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 17 Mar 2021 02:48:21 -0500 Subject: [PATCH 159/253] Minor E3 V2 dwin cleanup --- Marlin/src/lcd/dwin/e3v2/dwin.cpp | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.cpp b/Marlin/src/lcd/dwin/e3v2/dwin.cpp index e046bb90f5..97a9fbd4da 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.cpp +++ b/Marlin/src/lcd/dwin/e3v2/dwin.cpp @@ -1469,19 +1469,21 @@ void HMI_PrintSpeed() { } } +#define LAST_AXIS TERN(HAS_HOTEND, E_AXIS, Z_AXIS) + void HMI_MaxFeedspeedXYZE() { ENCODER_DiffState encoder_diffState = Encoder_ReceiveAnalyze(); if (encoder_diffState != ENCODER_DIFF_NO) { if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.Max_Feedspeed)) { checkkey = MaxSpeed; EncoderRate.enabled = false; - if (WITHIN(HMI_flag.feedspeed_axis, X_AXIS, E_AXIS)) + if (WITHIN(HMI_flag.feedspeed_axis, X_AXIS, LAST_AXIS)) planner.set_max_feedrate(HMI_flag.feedspeed_axis, HMI_ValueStruct.Max_Feedspeed); DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 4, 210, MBASE(select_speed.now), HMI_ValueStruct.Max_Feedspeed); return; } // MaxFeedspeed limit - if (WITHIN(HMI_flag.feedspeed_axis, X_AXIS, E_AXIS)) + if (WITHIN(HMI_flag.feedspeed_axis, X_AXIS, LAST_AXIS)) NOMORE(HMI_ValueStruct.Max_Feedspeed, default_max_feedrate[HMI_flag.feedspeed_axis] * 2); if (HMI_ValueStruct.Max_Feedspeed < MIN_MAXFEEDSPEED) HMI_ValueStruct.Max_Feedspeed = MIN_MAXFEEDSPEED; // MaxFeedspeed value @@ -1495,17 +1497,13 @@ void HMI_MaxAccelerationXYZE() { if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.Max_Acceleration)) { checkkey = MaxAcceleration; EncoderRate.enabled = false; - if (HMI_flag.acc_axis == X_AXIS) planner.set_max_acceleration(X_AXIS, HMI_ValueStruct.Max_Acceleration); - else if (HMI_flag.acc_axis == Y_AXIS) planner.set_max_acceleration(Y_AXIS, HMI_ValueStruct.Max_Acceleration); - else if (HMI_flag.acc_axis == Z_AXIS) planner.set_max_acceleration(Z_AXIS, HMI_ValueStruct.Max_Acceleration); - #if HAS_HOTEND - else if (HMI_flag.acc_axis == E_AXIS) planner.set_max_acceleration(E_AXIS, HMI_ValueStruct.Max_Acceleration); - #endif + if (WITHIN(HMI_flag.acc_axis, X_AXIS, LAST_AXIS)) + planner.set_max_acceleration(HMI_flag.acc_axis, HMI_ValueStruct.Max_Acceleration); DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 4, 210, MBASE(select_acc.now), HMI_ValueStruct.Max_Acceleration); return; } // MaxAcceleration limit - if (WITHIN(HMI_flag.acc_axis, X_AXIS, E_AXIS)) + if (WITHIN(HMI_flag.acc_axis, X_AXIS, LAST_AXIS)) NOMORE(HMI_ValueStruct.Max_Acceleration, default_max_acceleration[HMI_flag.acc_axis] * 2); if (HMI_ValueStruct.Max_Acceleration < MIN_MAXACCELERATION) HMI_ValueStruct.Max_Acceleration = MIN_MAXACCELERATION; // MaxAcceleration value @@ -1521,13 +1519,13 @@ void HMI_MaxAccelerationXYZE() { if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.Max_Jerk_scaled)) { checkkey = MaxJerk; EncoderRate.enabled = false; - if (WITHIN(HMI_flag.jerk_axis, X_AXIS, E_AXIS)) + if (WITHIN(HMI_flag.jerk_axis, X_AXIS, LAST_AXIS)) planner.set_max_jerk(HMI_flag.jerk_axis, HMI_ValueStruct.Max_Jerk_scaled / 10); DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 210, MBASE(select_jerk.now), HMI_ValueStruct.Max_Jerk_scaled); return; } // MaxJerk limit - if (WITHIN(HMI_flag.jerk_axis, X_AXIS, E_AXIS)) + if (WITHIN(HMI_flag.jerk_axis, X_AXIS, LAST_AXIS)) NOMORE(HMI_ValueStruct.Max_Jerk_scaled, default_max_jerk[HMI_flag.jerk_axis] * 2 * MINUNITMULT); NOLESS(HMI_ValueStruct.Max_Jerk_scaled, (MIN_MAXJERK) * MINUNITMULT); // MaxJerk value @@ -1543,13 +1541,13 @@ void HMI_StepXYZE() { if (Apply_Encoder(encoder_diffState, HMI_ValueStruct.Max_Step_scaled)) { checkkey = Step; EncoderRate.enabled = false; - if (WITHIN(HMI_flag.step_axis, X_AXIS, E_AXIS)) + if (WITHIN(HMI_flag.step_axis, X_AXIS, LAST_AXIS)) planner.settings.axis_steps_per_mm[HMI_flag.step_axis] = HMI_ValueStruct.Max_Step_scaled / 10; DWIN_Draw_FloatValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 1, 210, MBASE(select_step.now), HMI_ValueStruct.Max_Step_scaled); return; } // Step limit - if (WITHIN(HMI_flag.step_axis, X_AXIS, E_AXIS)) + if (WITHIN(HMI_flag.step_axis, X_AXIS, LAST_AXIS)) NOMORE(HMI_ValueStruct.Max_Step_scaled, 999.9 * MINUNITMULT); NOLESS(HMI_ValueStruct.Max_Step_scaled, MIN_STEP); // Step value From 560448afeddfdea568d74c5be4e48c8b7f5886c7 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 17 Mar 2021 21:36:10 -0500 Subject: [PATCH 160/253] Revert "Fix small wired EEPROM (#21337)" Reverting commit cc3e878f90 pending further investigation. --- Marlin/src/HAL/shared/eeprom_if_i2c.cpp | 25 +++++++------------------ 1 file changed, 7 insertions(+), 18 deletions(-) diff --git a/Marlin/src/HAL/shared/eeprom_if_i2c.cpp b/Marlin/src/HAL/shared/eeprom_if_i2c.cpp index 299bc34c49..da70af2772 100644 --- a/Marlin/src/HAL/shared/eeprom_if_i2c.cpp +++ b/Marlin/src/HAL/shared/eeprom_if_i2c.cpp @@ -51,18 +51,6 @@ void eeprom_init() { static constexpr uint8_t eeprom_device_address = I2C_ADDRESS(EEPROM_DEVICE_ADDRESS); -void _beginTransmission(const uint16_t memoryAddress) { - if (MARLIN_EEPROM_SIZE > 0x4000) { // Use two-byte addressing for EEPROMs >16kb - Wire.beginTransmission(eeprom_device_address); - Wire.write(memoryAddress >> 8); // Address High Byte - } - else { - const uint8_t addr = eeprom_device_address | byte((memoryAddress >> 8) & 0x07); - Wire.beginTransmission(addr); - } - Wire.write(memoryAddress & 0xFF); // Address Low Byte (or only byte for chips <= 16Kb like 24C02/04/08/16) -} - // ------------------------ // Public functions // ------------------------ @@ -70,7 +58,9 @@ void _beginTransmission(const uint16_t memoryAddress) { void eeprom_write_byte(uint8_t *pos, unsigned char value) { const unsigned eeprom_address = (unsigned)pos; - _beginTransmission(eeprom_address); + Wire.beginTransmission(eeprom_device_address); + Wire.write(int(eeprom_address >> 8)); // MSB + Wire.write(int(eeprom_address & 0xFF)); // LSB Wire.write(value); Wire.endTransmission(); @@ -82,12 +72,11 @@ void eeprom_write_byte(uint8_t *pos, unsigned char value) { uint8_t eeprom_read_byte(uint8_t *pos) { const unsigned eeprom_address = (unsigned)pos; - _beginTransmission(eeprom_address); + Wire.beginTransmission(eeprom_device_address); + Wire.write(int(eeprom_address >> 8)); // MSB + Wire.write(int(eeprom_address & 0xFF)); // LSB Wire.endTransmission(); - - // For EEPROMs <=16Kb the lower address bits are used for 2Kb page address - const int addr = eeprom_device_address | (MARLIN_EEPROM_SIZE <= 0x4000 ? byte((eeprom_address >> 8) & 0x07) : byte(0)); - Wire.requestFrom(addr, byte(1)); + Wire.requestFrom(eeprom_device_address, (byte)1); return Wire.available() ? Wire.read() : 0xFF; } From 6673359d89f5f4194e0de2451e195421bccefd1e Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 17 Mar 2021 21:26:25 -0500 Subject: [PATCH 161/253] Move web-ui out of Marlin root folder --- .../web-ui/data}/www/bootstrap.min.css | 0 .../web-ui/data}/www/bootstrap.min.js | 0 .../web-ui/data}/www/bootstrap4-toggle.min.js | 0 .../web-ui/data}/www/chart.lineargauge.js | 0 {data => buildroot/web-ui/data}/www/chart.min.js | 0 .../web-ui/data}/www/filesaver.min.js | 0 {data => buildroot/web-ui/data}/www/index-ie.html | 0 {data => buildroot/web-ui/data}/www/index.html | 0 .../web-ui/data}/www/jquery-3.5.1.slim.min.js | 0 .../web-ui/data}/www/jquery.browser.min.js | 0 .../web-ui/data}/www/marlin-logo-dark.png | Bin {data => buildroot/web-ui/data}/www/marlinui.eot | Bin {data => buildroot/web-ui/data}/www/marlinui.svg | 0 {data => buildroot/web-ui/data}/www/marlinui.ttf | Bin {data => buildroot/web-ui/data}/www/marlinui.woff | Bin {data => buildroot/web-ui/data}/www/moment.min.js | 0 .../web-ui/data}/www/webmarlin-class.js | 0 .../web-ui/data}/www/webmarlin-font.css | 0 {data => buildroot/web-ui/data}/www/webmarlin.css | 0 {data => buildroot/web-ui/data}/www/webmarlin.js | 0 20 files changed, 0 insertions(+), 0 deletions(-) rename {data => buildroot/web-ui/data}/www/bootstrap.min.css (100%) rename {data => buildroot/web-ui/data}/www/bootstrap.min.js (100%) rename {data => buildroot/web-ui/data}/www/bootstrap4-toggle.min.js (100%) rename {data => buildroot/web-ui/data}/www/chart.lineargauge.js (100%) rename {data => buildroot/web-ui/data}/www/chart.min.js (100%) rename {data => buildroot/web-ui/data}/www/filesaver.min.js (100%) rename {data => buildroot/web-ui/data}/www/index-ie.html (100%) rename {data => buildroot/web-ui/data}/www/index.html (100%) rename {data => buildroot/web-ui/data}/www/jquery-3.5.1.slim.min.js (100%) rename {data => buildroot/web-ui/data}/www/jquery.browser.min.js (100%) rename {data => buildroot/web-ui/data}/www/marlin-logo-dark.png (100%) rename {data => buildroot/web-ui/data}/www/marlinui.eot (100%) rename {data => buildroot/web-ui/data}/www/marlinui.svg (100%) rename {data => buildroot/web-ui/data}/www/marlinui.ttf (100%) rename {data => buildroot/web-ui/data}/www/marlinui.woff (100%) rename {data => buildroot/web-ui/data}/www/moment.min.js (100%) rename {data => buildroot/web-ui/data}/www/webmarlin-class.js (100%) rename {data => buildroot/web-ui/data}/www/webmarlin-font.css (100%) rename {data => buildroot/web-ui/data}/www/webmarlin.css (100%) rename {data => buildroot/web-ui/data}/www/webmarlin.js (100%) diff --git a/data/www/bootstrap.min.css b/buildroot/web-ui/data/www/bootstrap.min.css similarity index 100% rename from data/www/bootstrap.min.css rename to buildroot/web-ui/data/www/bootstrap.min.css diff --git a/data/www/bootstrap.min.js b/buildroot/web-ui/data/www/bootstrap.min.js similarity index 100% rename from data/www/bootstrap.min.js rename to buildroot/web-ui/data/www/bootstrap.min.js diff --git a/data/www/bootstrap4-toggle.min.js b/buildroot/web-ui/data/www/bootstrap4-toggle.min.js similarity index 100% rename from data/www/bootstrap4-toggle.min.js rename to buildroot/web-ui/data/www/bootstrap4-toggle.min.js diff --git a/data/www/chart.lineargauge.js b/buildroot/web-ui/data/www/chart.lineargauge.js similarity index 100% rename from data/www/chart.lineargauge.js rename to buildroot/web-ui/data/www/chart.lineargauge.js diff --git a/data/www/chart.min.js b/buildroot/web-ui/data/www/chart.min.js similarity index 100% rename from data/www/chart.min.js rename to buildroot/web-ui/data/www/chart.min.js diff --git a/data/www/filesaver.min.js b/buildroot/web-ui/data/www/filesaver.min.js similarity index 100% rename from data/www/filesaver.min.js rename to buildroot/web-ui/data/www/filesaver.min.js diff --git a/data/www/index-ie.html b/buildroot/web-ui/data/www/index-ie.html similarity index 100% rename from data/www/index-ie.html rename to buildroot/web-ui/data/www/index-ie.html diff --git a/data/www/index.html b/buildroot/web-ui/data/www/index.html similarity index 100% rename from data/www/index.html rename to buildroot/web-ui/data/www/index.html diff --git a/data/www/jquery-3.5.1.slim.min.js b/buildroot/web-ui/data/www/jquery-3.5.1.slim.min.js similarity index 100% rename from data/www/jquery-3.5.1.slim.min.js rename to buildroot/web-ui/data/www/jquery-3.5.1.slim.min.js diff --git a/data/www/jquery.browser.min.js b/buildroot/web-ui/data/www/jquery.browser.min.js similarity index 100% rename from data/www/jquery.browser.min.js rename to buildroot/web-ui/data/www/jquery.browser.min.js diff --git a/data/www/marlin-logo-dark.png b/buildroot/web-ui/data/www/marlin-logo-dark.png similarity index 100% rename from data/www/marlin-logo-dark.png rename to buildroot/web-ui/data/www/marlin-logo-dark.png diff --git a/data/www/marlinui.eot b/buildroot/web-ui/data/www/marlinui.eot similarity index 100% rename from data/www/marlinui.eot rename to buildroot/web-ui/data/www/marlinui.eot diff --git a/data/www/marlinui.svg b/buildroot/web-ui/data/www/marlinui.svg similarity index 100% rename from data/www/marlinui.svg rename to buildroot/web-ui/data/www/marlinui.svg diff --git a/data/www/marlinui.ttf b/buildroot/web-ui/data/www/marlinui.ttf similarity index 100% rename from data/www/marlinui.ttf rename to buildroot/web-ui/data/www/marlinui.ttf diff --git a/data/www/marlinui.woff b/buildroot/web-ui/data/www/marlinui.woff similarity index 100% rename from data/www/marlinui.woff rename to buildroot/web-ui/data/www/marlinui.woff diff --git a/data/www/moment.min.js b/buildroot/web-ui/data/www/moment.min.js similarity index 100% rename from data/www/moment.min.js rename to buildroot/web-ui/data/www/moment.min.js diff --git a/data/www/webmarlin-class.js b/buildroot/web-ui/data/www/webmarlin-class.js similarity index 100% rename from data/www/webmarlin-class.js rename to buildroot/web-ui/data/www/webmarlin-class.js diff --git a/data/www/webmarlin-font.css b/buildroot/web-ui/data/www/webmarlin-font.css similarity index 100% rename from data/www/webmarlin-font.css rename to buildroot/web-ui/data/www/webmarlin-font.css diff --git a/data/www/webmarlin.css b/buildroot/web-ui/data/www/webmarlin.css similarity index 100% rename from data/www/webmarlin.css rename to buildroot/web-ui/data/www/webmarlin.css diff --git a/data/www/webmarlin.js b/buildroot/web-ui/data/www/webmarlin.js similarity index 100% rename from data/www/webmarlin.js rename to buildroot/web-ui/data/www/webmarlin.js From ad907a51e245a908024ff2736f95455d89e9571d Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 18 Mar 2021 00:11:06 -0500 Subject: [PATCH 162/253] Followup to planner cleanup --- Marlin/src/module/planner.cpp | 10 +++++----- Marlin/src/module/planner.h | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Marlin/src/module/planner.cpp b/Marlin/src/module/planner.cpp index c60e9f6cd3..594671f87a 100644 --- a/Marlin/src/module/planner.cpp +++ b/Marlin/src/module/planner.cpp @@ -3029,7 +3029,7 @@ inline void limit_and_warn(float &val, const uint8_t axis, PGM_P const setting_n * * This hard limit is applied as a block is being added to the planner queue. */ -void Planner::set_max_acceleration(const uint8_t axis, const float &inMaxAccelMMS2) { +void Planner::set_max_acceleration(const uint8_t axis, float inMaxAccelMMS2) { #if ENABLED(LIMITED_MAX_ACCEL_EDITING) #ifdef MAX_ACCEL_EDIT_VALUES constexpr xyze_float_t max_accel_edit = MAX_ACCEL_EDIT_VALUES; @@ -3052,7 +3052,7 @@ void Planner::set_max_acceleration(const uint8_t axis, const float &inMaxAccelMM * * This hard limit is applied as a block is being added to the planner queue. */ -void Planner::set_max_feedrate(const uint8_t axis, const float &inMaxFeedrateMMS) { +void Planner::set_max_feedrate(const uint8_t axis, float inMaxFeedrateMMS) { #if ENABLED(LIMITED_MAX_FR_EDITING) #ifdef MAX_FEEDRATE_EDIT_VALUES constexpr xyze_float_t max_fr_edit = MAX_FEEDRATE_EDIT_VALUES; @@ -3074,7 +3074,7 @@ void Planner::set_max_feedrate(const uint8_t axis, const float &inMaxFeedrateMMS * * This hard limit is applied (to the block start speed) as the block is being added to the planner queue. */ - void Planner::set_max_jerk(const AxisEnum axis, const float &targetValue) { + void Planner::set_max_jerk(const AxisEnum axis, float inMaxJerkMMS) { #if ENABLED(LIMITED_JERK_EDITING) constexpr xyze_float_t max_jerk_edit = #ifdef MAX_JERK_EDIT_VALUES @@ -3084,9 +3084,9 @@ void Planner::set_max_feedrate(const uint8_t axis, const float &inMaxFeedrateMMS (DEFAULT_ZJERK) * 2, (DEFAULT_EJERK) * 2 } #endif ; - limit_and_warn(targetValue, axis, PSTR("Jerk"), max_jerk_edit); + limit_and_warn(inMaxJerkMMS, axis, PSTR("Jerk"), max_jerk_edit); #endif - max_jerk[axis] = targetValue; + max_jerk[axis] = inMaxJerkMMS; } #endif diff --git a/Marlin/src/module/planner.h b/Marlin/src/module/planner.h index a7aabd9d65..7ebba1e342 100644 --- a/Marlin/src/module/planner.h +++ b/Marlin/src/module/planner.h @@ -470,14 +470,14 @@ class Planner { static void refresh_positioning(); // For an axis set the Maximum Acceleration in mm/s^2 - static void set_max_acceleration(const uint8_t axis, const float &inMaxAccelMMS2); + static void set_max_acceleration(const uint8_t axis, float inMaxAccelMMS2); // For an axis set the Maximum Feedrate in mm/s - static void set_max_feedrate(const uint8_t axis, const float &inMaxFeedrateMMS); + static void set_max_feedrate(const uint8_t axis, float inMaxFeedrateMMS); // For an axis set the Maximum Jerk (instant change) in mm/s #if HAS_CLASSIC_JERK - static void set_max_jerk(const AxisEnum axis, const float &inMaxJerkMMS); + static void set_max_jerk(const AxisEnum axis, float inMaxJerkMMS); #else static inline void set_max_jerk(const AxisEnum, const float&) {} #endif From 1f52112d72a1b05ce673581f4d5e9b9ac06ff795 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Fri, 19 Mar 2021 00:13:41 +0000 Subject: [PATCH 163/253] [cron] Bump distribution date (2021-03-19) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 43094400ea..4839037c0e 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2021-03-18" + #define STRING_DISTRIBUTION_DATE "2021-03-19" #endif /** From b51aed8aa54f41cc5897485d3b34b019ce38343d Mon Sep 17 00:00:00 2001 From: Skorpi08 Date: Fri, 19 Mar 2021 02:51:19 +0100 Subject: [PATCH 164/253] Nextion TFT touch screen (#21324) Co-authored-by: Scott Lahteine --- Marlin/Configuration.h | 8 + Marlin/src/inc/Conditionals_LCD.h | 2 +- Marlin/src/inc/SanityCheck.h | 1 + .../lcd/extui/lib/nextion/FileNavigator.cpp | 174 +++++ .../src/lcd/extui/lib/nextion/FileNavigator.h | 53 ++ .../src/lcd/extui/lib/nextion/nextion_tft.cpp | 729 ++++++++++++++++++ .../src/lcd/extui/lib/nextion/nextion_tft.h | 62 ++ .../lcd/extui/lib/nextion/nextion_tft_defs.h | 63 ++ Marlin/src/lcd/extui/nextion_lcd.cpp | 117 +++ Marlin/src/lcd/extui/ui_api.cpp | 15 +- Marlin/src/lcd/extui/ui_api.h | 12 + platformio.ini | 2 + 12 files changed, 1235 insertions(+), 3 deletions(-) create mode 100644 Marlin/src/lcd/extui/lib/nextion/FileNavigator.cpp create mode 100644 Marlin/src/lcd/extui/lib/nextion/FileNavigator.h create mode 100644 Marlin/src/lcd/extui/lib/nextion/nextion_tft.cpp create mode 100644 Marlin/src/lcd/extui/lib/nextion/nextion_tft.h create mode 100644 Marlin/src/lcd/extui/lib/nextion/nextion_tft_defs.h create mode 100644 Marlin/src/lcd/extui/nextion_lcd.cpp diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 726ff1ec0b..ce847c0d65 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -2396,6 +2396,14 @@ //#define ANYCUBIC_LCD_DEBUG #endif +// +// 320x240 Nextion 2.8" serial TFT Resistive Touch Screen NX3224T028 +// +//#define NEXTION_TFT +#if ENABLED(NEXTION_TFT) + #define LCD_SERIAL_PORT 1 // Default is 1 for Nextion +#endif + // // Third-party or vendor-customized controller interfaces. // Sources should be installed in 'src/lcd/extui'. diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index fc7eec84ee..fc83a1ff87 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -460,7 +460,7 @@ #endif // Extensible UI serial touch screens. (See src/lcd/extui) -#if ANY(HAS_DGUS_LCD, MALYAN_LCD, TOUCH_UI_FTDI_EVE, ANYCUBIC_LCD_I3MEGA, ANYCUBIC_LCD_CHIRON) +#if ANY(HAS_DGUS_LCD, MALYAN_LCD, TOUCH_UI_FTDI_EVE, ANYCUBIC_LCD_I3MEGA, ANYCUBIC_LCD_CHIRON, NEXTION_TFT) #define IS_EXTUI 1 #define EXTENSIBLE_UI #endif diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 5302aac208..af30c6156d 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -2353,6 +2353,7 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal + ENABLED(MAKEBOARD_MINI_2_LINE_DISPLAY_1602) \ + ENABLED(MAKRPANEL) \ + ENABLED(MALYAN_LCD) \ + + ENABLED(NEXTION_TFT) \ + ENABLED(MKS_LCD12864) \ + ENABLED(OLED_PANEL_TINYBOY2) \ + ENABLED(OVERLORD_OLED) \ diff --git a/Marlin/src/lcd/extui/lib/nextion/FileNavigator.cpp b/Marlin/src/lcd/extui/lib/nextion/FileNavigator.cpp new file mode 100644 index 0000000000..f82ce1f091 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/nextion/FileNavigator.cpp @@ -0,0 +1,174 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 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 . + * + */ + +/* **************************************** + * lcd/extui/lib/nextion/FileNavigator.cpp + * **************************************** + * Extensible_UI implementation for Nextion + * https://github.com/Skorpi08 + * ***************************************/ + +#include "../../../../inc/MarlinConfigPre.h" + +#if ENABLED(NEXTION_TFT) + +#include "FileNavigator.h" +#include "nextion_tft.h" + +using namespace ExtUI; + +#define DEBUG_OUT NEXDEBUGLEVEL +#include "../../../../core/debug_out.h" + +FileList FileNavigator::filelist; // Instance of the Marlin file API +char FileNavigator::currentfoldername[MAX_PATH_LEN]; // Current folder path +uint16_t FileNavigator::lastindex; +uint8_t FileNavigator::folderdepth; +uint16_t FileNavigator::currentindex; // override the panel request + +FileNavigator filenavigator; + +FileNavigator::FileNavigator() { reset(); } + +void FileNavigator::reset() { + currentfoldername[0] = '\0'; + folderdepth = 0; + currentindex = 0; + lastindex = 0; + // Start at root folder + while (!filelist.isAtRootDir()) filelist.upDir(); + refresh(); +} + +void FileNavigator::refresh() { filelist.refresh(); } + +void FileNavigator::getFiles(uint16_t index) { + uint16_t files = 7, fseek = 0, fcnt = 0; + if (index == 0) + currentindex = 0; + else { + // Each time we change folder we reset the file index to 0 and keep track + // of the current position as the TFT panel isn't aware of folder trees. + --currentindex; // go back a file to take account of the .. added to the root. + if (index > lastindex) + currentindex += files + 1; + else if (currentindex >= files) + currentindex -= files - 1; + else + currentindex = 0; + } + lastindex = index; + + #if NEXDEBUG(AC_FILE) + DEBUG_ECHOLNPAIR("index=", index, " currentindex=", currentindex); + #endif + + if (currentindex == 0 && folderdepth > 0) { // Add a link to go up a folder + nextion.SendtoTFT(PSTR("vis p0,1")); + nextion.SendtoTFT(PSTR("\xFF\xFF\xFF")); + SEND_VAL("tmpUP", "0"); + files--; + } + else { + nextion.SendtoTFT(PSTR("vis p0,0")); + nextion.SendtoTFT(PSTR("\xFF\xFF\xFF")); + } + + for (uint16_t seek = currentindex; seek < currentindex + files; seek++) { + if (filelist.seek(seek)) { + nextion.SendtoTFT(PSTR("s")); + LCD_SERIAL.print(fcnt); + nextion.SendtoTFT(PSTR(".txt=\"")); + if (filelist.isDir()) { + LCD_SERIAL.print(filelist.shortFilename()); + nextion.SendtoTFT(PSTR("/\"")); + nextion.SendtoTFT(PSTR("\xFF\xFF\xFF")); + + nextion.SendtoTFT(PSTR("l")); + LCD_SERIAL.print(fcnt); + nextion.SendtoTFT(PSTR(".txt=\"")); + LCD_SERIAL.print(filelist.filename()); + nextion.SendtoTFT(PSTR("\"")); + nextion.SendtoTFT(PSTR("\xFF\xFF\xFF")); + SEND_PCO2("l", fcnt, "1055"); + } + else { + LCD_SERIAL.print(currentfoldername); + LCD_SERIAL.print(filelist.shortFilename()); + nextion.SendtoTFT(PSTR("\"")); + nextion.SendtoTFT(PSTR("\xFF\xFF\xFF")); + + nextion.SendtoTFT(PSTR("l")); + LCD_SERIAL.print(fcnt); + nextion.SendtoTFT(PSTR(".txt=\"")); + LCD_SERIAL.print(filelist.longFilename()); + nextion.SendtoTFT(PSTR("\"")); + nextion.SendtoTFT(PSTR("\xFF\xFF\xFF")); + } + fcnt++; + fseek = seek; + #if NEXDEBUG(AC_FILE) + DEBUG_ECHOLNPAIR("-", seek, " '", filelist.longFilename(), "' '", currentfoldername, "", filelist.shortFilename(), "'\n"); + #endif + } + } + SEND_VAL("n0", filelist.count()); + SEND_VAL("n1", fseek + 1); +} + +void FileNavigator::changeDIR(char *folder) { + #if NEXDEBUG(AC_FILE) + DEBUG_ECHOLNPAIR("currentfolder: ", currentfoldername, " New: ", folder); + #endif + if (folderdepth >= MAX_FOLDER_DEPTH) return; // limit the folder depth + strcat(currentfoldername, folder); + strcat(currentfoldername, "/"); + filelist.changeDir(folder); + refresh(); + folderdepth++; + currentindex = 0; +} + +void FileNavigator::upDIR() { + filelist.upDir(); + refresh(); + folderdepth--; + currentindex = 0; + // Remove the last child folder from the stored path + if (folderdepth == 0) { + currentfoldername[0] = '\0'; + reset(); + } + else { + char *pos = nullptr; + for (uint8_t f = 0; f < folderdepth; f++) + pos = strchr(currentfoldername, '/'); + pos[1] = '\0'; + } + #if NEXDEBUG(AC_FILE) + DEBUG_ECHOLNPAIR("depth: ", folderdepth, " currentfoldername: ", currentfoldername); + #endif +} + +char* FileNavigator::getCurrentFolderName() { return currentfoldername; } + +#endif // NEXTION_TFT diff --git a/Marlin/src/lcd/extui/lib/nextion/FileNavigator.h b/Marlin/src/lcd/extui/lib/nextion/FileNavigator.h new file mode 100644 index 0000000000..1cd29ec671 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/nextion/FileNavigator.h @@ -0,0 +1,53 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 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 + +/* **************************************** + * lcd/extui/lib/nextion/FileNavigator.cpp + * **************************************** + * Extensible_UI implementation for Nextion + * https://github.com/Skorpi08 + * ***************************************/ + +#include "nextion_tft_defs.h" // for MAX_PATH_LEN +#include "../../ui_api.h" + +using namespace ExtUI; + +class FileNavigator { + public: + FileNavigator(); + static void reset(); + static void getFiles(uint16_t); + static void upDIR(); + static void changeDIR(char *); + static void refresh(); + static char* getCurrentFolderName(); + private: + static FileList filelist; + static char currentfoldername[MAX_PATH_LEN]; + static uint16_t lastindex; + static uint8_t folderdepth; + static uint16_t currentindex; +}; + +extern FileNavigator filenavigator; diff --git a/Marlin/src/lcd/extui/lib/nextion/nextion_tft.cpp b/Marlin/src/lcd/extui/lib/nextion/nextion_tft.cpp new file mode 100644 index 0000000000..12a7bc7cc7 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/nextion/nextion_tft.cpp @@ -0,0 +1,729 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 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 . + * + */ + +/* **************************************** + * lcd/extui/lib/nextion/nextion_tft.h + * **************************************** + * Extensible_UI implementation for Nextion + * https://github.com/Skorpi08 + * ***************************************/ + +#include "../../../../inc/MarlinConfigPre.h" + +#if ENABLED(NEXTION_TFT) + +#include "../../../../MarlinCore.h" +#include "../../../../feature/pause.h" +#include "../../../../gcode/queue.h" +#include "../../../../libs/numtostr.h" +#include "../../../../sd/cardreader.h" +#include "FileNavigator.h" +#include "nextion_tft.h" + +#define DEBUG_OUT NEXDEBUGLEVEL +#include "../../../../core/debug_out.h" + +char NextionTFT::selectedfile[MAX_PATH_LEN]; +char NextionTFT::nextion_command[MAX_CMND_LEN]; +uint8_t NextionTFT::command_len; + +bool last_homed = 0, last_homedX = 0, last_homedY = 0, last_homedZ = 0; +float last_degBed = 999, last_degHotend0 = 999, last_degHotend1 = 999, last_degTargetBed = 999, last_degTargetHotend0 = 999, last_degTargetHotend1 = 999; +float last_get_axis_position_mmX = 999, last_get_axis_position_mmY = 999, last_get_axis_position_mmZ = 999; +float last_extruder_advance_K = 999; +uint8_t last_active_extruder = 99, last_fan_speed = 99, last_print_speed = 99, last_flow_speed = 99, last_progress = 99; +uint8_t last_printer_state = 99, last_IDEX_Mode = 99; +uint32_t layer = 0, last_layer = 99; + +NextionTFT nextion; + +NextionTFT::NextionTFT() {} + +void NextionTFT::Startup() { + selectedfile[0] = '\0'; + nextion_command[0] = '\0'; + command_len = 0; + LCD_SERIAL.begin(115200); + + SEND_VAL("tmppage.connected", 0); + delay_ms(100); + SEND_VAL("tmppage.connected", 1); + + SEND_VALasTXT("tmppage.marlin", SHORT_BUILD_VERSION); + SEND_VALasTXT("tmppage.compiled", __DATE__ " / " __TIME__); + SEND_VALasTXT("tmppage.extruder", EXTRUDERS); + SEND_VALasTXT("tmppage.printer", MACHINE_NAME); + SEND_VALasTXT("tmppage.author", STRING_CONFIG_H_AUTHOR); + SEND_VALasTXT("tmppage.released", STRING_DISTRIBUTION_DATE); + SEND_VALasTXT("tmppage.bedx", X_BED_SIZE); + SEND_VALasTXT("tmppage.bedy", Y_BED_SIZE); + SEND_VALasTXT("tmppage.bedz", Z_MAX_POS); + + DEBUG_ECHOLNPAIR("Nextion Debug Level ", NEXDEBUGLEVEL); +} + +void NextionTFT::IdleLoop() { + if (ReadTFTCommand()) { + ProcessPanelRequest(); + command_len = 0; + } + UpdateOnChange(); +} + +void NextionTFT::PrinterKilled(PGM_P error, PGM_P component) { + SEND_TXT_END("page error"); + SEND_TXT("t3", "Error"); + SEND_TXT_P("t4", component); + SEND_TXT_P("t5", error); + SEND_TXT("t6", "Need reset"); +} + +void NextionTFT::PrintFinished() { + SEND_TXT_END("page printfinished"); +} + +void NextionTFT::ConfirmationRequest(const char *const msg) { + SEND_VALasTXT("tmppage.M117", msg); + #if NEXDEBUG(N_MARLIN) + DEBUG_ECHOLNPAIR("ConfirmationRequest() ", msg, " printer_state:", printer_state); + #endif +} + +void NextionTFT::StatusChange(const char *const msg) { + #if NEXDEBUG(N_MARLIN) + DEBUG_ECHOLNPAIR("StatusChange() ", msg, "\nprinter_state:", printer_state); + #endif + SEND_VALasTXT("tmppage.M117", msg); +} + +void NextionTFT::SendtoTFT(PGM_P str) { // A helper to print PROGMEM string to the panel + #if NEXDEBUG(N_SOME) + DEBUG_ECHOPGM_P(str); + #endif + while (const char c = pgm_read_byte(str++)) + LCD_SERIAL.write(c); +} + +bool NextionTFT::ReadTFTCommand() { + bool command_ready = false; + while ((LCD_SERIAL.available() > 0) && (command_len < MAX_CMND_LEN)) { + nextion_command[command_len] = LCD_SERIAL.read(); + if (nextion_command[command_len] == 10) { + command_ready = true; + break; + } + command_len++; + } + + if (command_ready) { + nextion_command[command_len] = 0x00; + if (nextion_command[0] == 'G' || nextion_command[0] == 'M' || nextion_command[0] == 'T') + injectCommands(nextion_command); + #if NEXDEBUG(N_ALL) + DEBUG_ECHOLNPAIR("< ", nextion_command); + #endif + #if NEXDEBUG(N_SOME) + uint8_t req = atoi(&nextion_command[1]); + if (req > 7 && req != 20) + DEBUG_ECHOLNPAIR( "> ", nextion_command[0], + "\n> ", nextion_command[1], + "\n> ", nextion_command[2], + "\n> ", nextion_command[3], + "\nprinter_state:", printer_state); + #endif + } + return command_ready; +} + +void NextionTFT::SendFileList(int8_t startindex) { + // respond to panel request for 7 files starting at index + #if NEXDEBUG(N_INFO) + DEBUG_ECHOLNPAIR("## SendFileList ## ", startindex); + #endif + filenavigator.getFiles(startindex); +} + +void NextionTFT::SelectFile() { + strncpy(selectedfile, nextion_command + 4, command_len - 4); + selectedfile[command_len - 5] = '\0'; + #if NEXDEBUG(N_FILE) + DEBUG_ECHOLNPAIR_F(" Selected File: ", selectedfile); + #endif + switch (selectedfile[0]) { + case '/': // Valid file selected + //SEND_TXT("tmppage.M117", msg_sd_file_open_success); + break; + case '<': // .. (go up folder level) + filenavigator.upDIR(); + SendFileList(0); + break; + default: // enter sub folder + filenavigator.changeDIR(selectedfile); + SendFileList(0); + break; + } +} + +void NextionTFT::_format_time(char *outstr, uint32_t time) { + const uint8_t hrs = time / 3600, + min = (time / 60) % 60, + sec = time % 60; + if (hrs) + sprintf_P(outstr, PSTR("%02d:%02dm"), hrs, min); + else + sprintf_P(outstr, PSTR("%02d:%02ds"), min, sec); +} + +void NextionTFT::ProcessPanelRequest() { + // Break these up into logical blocks as its easier to navigate than one huge switch case! + if (nextion_command[0] == 'X') { + int8_t req = atoi(&nextion_command[1]); + + // Information requests + if (req <= 49) + PanelInfo(req); + + // Simple Actions + else if (req >= 50) + PanelAction(req); + } +} + +#define SEND_NA(A) SEND_TXT(A, "n/a") + +void NextionTFT::PanelInfo(uint8_t req) { + switch (req) { + case 0: break; + + case 1: // Get SD Card list + if (!isPrinting()) { + if (!isMediaInserted()) safe_delay(500); + if (!isMediaInserted()) { // Make sure the card is removed + //SEND_TXT("tmppage.M117", msg_no_sd_card); + } + else if (nextion_command[3] == 'S') + SendFileList(atoi(&nextion_command[4])); + } + break; + + case 2: // Printer Info + if (!isPrinting()) { + SEND_VAL("tmppage.connected", 1); + SEND_VALasTXT("tmppage.marlin", SHORT_BUILD_VERSION); + SEND_VALasTXT("tmppage.compiled", __DATE__ " / " __TIME__); + SEND_VALasTXT("tmppage.extruder", EXTRUDERS); + SEND_VALasTXT("tmppage.printer", MACHINE_NAME); + SEND_VALasTXT("tmppage.author", STRING_CONFIG_H_AUTHOR); + SEND_VALasTXT("tmppage.released", STRING_DISTRIBUTION_DATE); + SEND_VALasTXT("tmppage.bedx", X_BED_SIZE); + SEND_VALasTXT("tmppage.bedy", Y_BED_SIZE); + SEND_VALasTXT("tmppage.bedz", Z_MAX_POS); + SEND_TEMP("tmppage.t0", ui8tostr3rj(getActualTemp_celsius(E0)), " / ", ui8tostr3rj(getTargetTemp_celsius(E0))); + SEND_TEMP("tmppage.t1", ui8tostr3rj(getActualTemp_celsius(E1)), " / ", ui8tostr3rj(getTargetTemp_celsius(E1))); + SEND_TEMP("tmppage.t2", ui8tostr3rj(getActualTemp_celsius(BED)), " / ", ui8tostr3rj(getTargetTemp_celsius(BED))); + SEND_VALasTXT("tmppage.tool", getActiveTool()); + SEND_VALasTXT("tmppage.fan", ui8tostr3rj(getActualFan_percent(FAN0))); + SEND_VALasTXT("tmppage.speed", getFeedrate_percent()); + SEND_VALasTXT("tmppage.flow", getFlowPercentage(getActiveTool())); + SEND_VALasTXT("tmppage.progress", ui8tostr3rj(getProgress_percent())); + SEND_VALasTXT("tmppage.layer", layer); + SEND_VALasTXT("tmppage.x", getAxisPosition_mm(X)); + SEND_VALasTXT("tmppage.y", getAxisPosition_mm(Y)); + SEND_VALasTXT("tmppage.z", getAxisPosition_mm(Z)); + SEND_VAL("tmppage.homed", isPositionKnown()); + SEND_VAL("tmppage.homedx", isAxisPositionKnown(X)); + SEND_VAL("tmppage.homedy", isAxisPositionKnown(Y)); + SEND_VAL("tmppage.homedz", isAxisPositionKnown(Z)); + #if ENABLED(DUAL_X_CARRIAGE) + SEND_VAL("tmppage.idexmode", getIDEX_Mode()); + #endif + SEND_TXT("tmppage.M117", msg_welcome); + } + break; + + case 23: // Linear Advance + #if ENABLED(LIN_ADVANCE) + SEND_VALasTXT("linadvance", getLinearAdvance_mm_mm_s(getActiveTool())); + #else + SEND_NA("linadvance"); + #endif + break; + + case 24: // TMC Motor Current + #if HAS_TRINAMIC_CONFIG + #define SEND_TRINAMIC_CURR(A, B) SEND_VALasTXT(A, getAxisCurrent_mA(B)) + #else + #define SEND_TRINAMIC_CURR(A, B) SEND_NA(A) + #endif + SEND_TRINAMIC_CURR("x", X); + SEND_TRINAMIC_CURR("x2", X2); + SEND_TRINAMIC_CURR("y", Y); + SEND_TRINAMIC_CURR("y2", Y2); + SEND_TRINAMIC_CURR("z", Z); + SEND_TRINAMIC_CURR("z2", Z2); + SEND_TRINAMIC_CURR("e", E0); + SEND_TRINAMIC_CURR("e1", E1); + break; + + case 25: // TMC Bump Sensitivity + #if HAS_TRINAMIC_CONFIG + #define SEND_TRINAMIC_BUMP(A, B) SEND_VALasTXT(A, getTMCBumpSensitivity(B)) + #else + #define SEND_TRINAMIC_BUMP(A, B) SEND_NA(A) + #endif + SEND_TRINAMIC_BUMP("x", X); + SEND_TRINAMIC_BUMP("x2", X2); + SEND_TRINAMIC_BUMP("y", Y); + SEND_TRINAMIC_BUMP("y2", Y2); + SEND_TRINAMIC_BUMP("z", Z); + SEND_TRINAMIC_BUMP("z2", Z2); + break; + + case 26: // TMC Hybrid Threshold Speed + #if 0 && BOTH(HAS_TRINAMIC_CONFIG, HYBRID_THRESHOLD) + #define SEND_TRINAMIC_THRS(A, B) SEND_VALasTXT(A, getAxisPWMthrs(B)) + #else + #define SEND_TRINAMIC_THRS(A, B) SEND_NA(A) + #endif + SEND_TRINAMIC_THRS("x", X); + SEND_TRINAMIC_THRS("x2", X2); + SEND_TRINAMIC_THRS("y", Y); + SEND_TRINAMIC_THRS("y2", Y2); + SEND_TRINAMIC_THRS("z", Z); + SEND_TRINAMIC_THRS("z2", Z2); + SEND_TRINAMIC_THRS("e", E0); + SEND_TRINAMIC_THRS("e1", E1); + break; + + case 27: // Printcounter + #if ENABLED(PRINTCOUNTER) + char buffer[21]; + #define SEND_PRINT_INFO(A, B) SEND_VALasTXT(A, B(buffer)) + #else + #define SEND_PRINT_INFO(A, B) SEND_NA(A) + #endif + SEND_PRINT_INFO("t5", getTotalPrints_str); + SEND_PRINT_INFO("t3", getFinishedPrints_str); + SEND_PRINT_INFO("t4", getFailedPrints_str); + SEND_PRINT_INFO("t6", getTotalPrintTime_str); + SEND_PRINT_INFO("t7", getLongestPrint_str); + SEND_PRINT_INFO("t8", getFilamentUsed_str); + break; + + case 28: // Filament laod/unload + #if ENABLED(ADVANCED_PAUSE_FEATURE) + #define SEND_PAUSE_INFO(A, B) SEND_VALasTXT(A, fc_settings[getActiveTool()].B) + #else + #define SEND_PAUSE_INFO(A, B) SEND_NA(A) + #endif + SEND_PAUSE_INFO("filamentin", load_length); + SEND_PAUSE_INFO("filamentout", unload_length); + break; + + case 29: // Preheat + #if PREHEAT_COUNT + if (!isPrinting()) { + // Preheat PLA + if (nextion_command[4] == 'P') { + SEND_VALasTXT("pe", getMaterial_preset_E(0)); + #if HAS_HEATED_BED + SEND_VALasTXT("pb", getMaterial_preset_B(0)); + #endif + } + + // Preheat ABS + if (nextion_command[4] == 'A') { + SEND_VALasTXT("ae", getMaterial_preset_E(1)); + #if HAS_HEATED_BED + SEND_VALasTXT("ab", getMaterial_preset_B(1)); + #endif + } + + // Preheat PETG + if (nextion_command[4] == 'G') { + #ifdef PREHEAT_3_TEMP_HOTEND + SEND_VALasTXT("ge", getMaterial_preset_E(2)); + #if HAS_HEATED_BED + SEND_VALasTXT("gb", getMaterial_preset_B(2)); + #endif + #endif + } + } + #endif + break; + + case 30: // Velocity + SEND_VALasTXT("x", getAxisMaxFeedrate_mm_s(X)); + SEND_VALasTXT("y", getAxisMaxFeedrate_mm_s(Y)); + SEND_VALasTXT("z", getAxisMaxFeedrate_mm_s(Z)); + SEND_VALasTXT("e", getAxisMaxFeedrate_mm_s(getActiveTool())); + SEND_VALasTXT("min", getMinFeedrate_mm_s()); + SEND_VALasTXT("tmin", getMinTravelFeedrate_mm_s()); + break; + + case 31: // Jerk + #if ENABLED(CLASSIC_JERK) + #define SEND_JERK_INFO(A, B) SEND_VALasTXT(A, getAxisMaxJerk_mm_s(B)) + #else + #define SEND_JERK_INFO(A, B) SEND_NA(A) + //SEND_VALasTXT("x", getJunctionDeviation_mm()); + SEND_TXT("tmppage.M117", "classic Jerk not enabled"); + #endif + SEND_JERK_INFO("x", X); + SEND_JERK_INFO("y", Y); + SEND_JERK_INFO("z", Z); + SEND_JERK_INFO("e", getActiveTool()); + break; + + case 32: // Steps-per-mm + SEND_VALasTXT("x", getAxisSteps_per_mm(X)); + SEND_VALasTXT("y", getAxisSteps_per_mm(Y)); + SEND_VALasTXT("z", getAxisSteps_per_mm(Z)); + SEND_VALasTXT("e0", getAxisSteps_per_mm(E0)); + SEND_VALasTXT("e1", getAxisSteps_per_mm(E1)); + break; + + case 33: // Acceleration + SEND_VALasTXT("x", ui16tostr5rj(getAxisMaxAcceleration_mm_s2(X))); + SEND_VALasTXT("y", ui16tostr5rj(getAxisMaxAcceleration_mm_s2(Y))); + SEND_VALasTXT("z", ui16tostr5rj(getAxisMaxAcceleration_mm_s2(Z))); + SEND_VALasTXT("e", ui16tostr5rj(getAxisMaxAcceleration_mm_s2(getActiveTool()))); + SEND_VALasTXT("print", ui16tostr5rj(getPrintingAcceleration_mm_s2())); + SEND_VALasTXT("retract", ui16tostr5rj(getRetractAcceleration_mm_s2())); + SEND_VALasTXT("travel", ui16tostr5rj(getTravelAcceleration_mm_s2())); + break; + + case 34: // Dual X carriage offset + #if ENABLED(DUAL_X_CARRIAGE) + #define SEND_IDEX_INFO(A, B) SEND_VALasTXT(A, getNozzleOffset_mm(B, getActiveTool())) + #else + #define SEND_IDEX_INFO(A, B) SEND_NA(A) + #endif + SEND_IDEX_INFO("x", X); + SEND_IDEX_INFO("y", Y); + SEND_IDEX_INFO("z", Z); + break; + + case 35: // Probe offset + #if HAS_PROBE_XY_OFFSET + #define SEND_PROBE_INFO(A, B) SEND_VALasTXT(A, getProbeOffset_mm(B)) + #else + #define SEND_PROBE_INFO(A, B) SEND_NA(A) + #endif + SEND_PROBE_INFO("x", X); + SEND_PROBE_INFO("y", Y); + SEND_VALasTXT("z", getZOffset_mm()); + break; + + case 36: // Endstop Info + #if HAS_X_MIN + SEND_VALasTXT("x1", READ(X_MIN_PIN) != X_MIN_ENDSTOP_INVERTING ? "triggered" : "open"); + #endif + #if HAS_X_MAX + SEND_VALasTXT("x2", READ(X_MAX_PIN) != X_MAX_ENDSTOP_INVERTING ? "triggered" : "open"); + #endif + #if HAS_Y_MIN + SEND_VALasTXT("y1", READ(Y_MIN_PIN) != Y_MIN_ENDSTOP_INVERTING ? "triggered" : "open"); + #endif + #if HAS_Z_MIN + SEND_VALasTXT("z1", READ(Z_MIN_PIN) != Z_MIN_ENDSTOP_INVERTING ? "triggered" : "open"); + #endif + #if HAS_Z_MAX + SEND_VALasTXT("z2", READ(Z_MAX_PIN) != Z_MAX_ENDSTOP_INVERTING ? "triggered" : "open"); + #endif + #if HAS_Z2_MIN + SEND_VALasTXT("z2", READ(Z2_MIN_PIN) != Z2_MIN_ENDSTOP_INVERTING ? "triggered" : "open"); + #endif + #if HAS_Z2_MAX + SEND_VALasTXT("z2", READ(Z2_MAX_PIN) != Z2_MAX_ENDSTOP_INVERTING ? "triggered" : "open"); + #endif + #if HAS_BED_PROBE + //SEND_VALasTXT("bltouch", READ(Z_MIN_PROBE_PIN) != Z_MIN_PROBE_ENDSTOP_INVERTING ? "triggered" : "open"); + #else + SEND_NA("bltouch"); + #endif + break; + + case 37: // PID + #if ENABLED(PIDTEMP) + #define SEND_PID_INFO_0(A, B) SEND_VALasTXT(A, getPIDValues_K##B(E0)) + #else + #define SEND_PID_INFO_0(A, B) SEND_NA(A) + #endif + #if BOTH(PIDTEMP, HAS_MULTI_EXTRUDER) + #define SEND_PID_INFO_1(A, B) SEND_VALasTXT(A, getPIDValues_K##B(E1)) + #else + #define SEND_PID_INFO_1(A, B) SEND_NA(A) + #endif + #if ENABLED(PIDTEMPBED) + #define SEND_PID_INFO_BED(A, B) SEND_VALasTXT(A, getBedPIDValues_K##B()) + #else + #define SEND_PID_INFO_BED(A, B) SEND_NA(A) + #endif + SEND_PID_INFO_0("p0", p); + SEND_PID_INFO_0("i0", i); + SEND_PID_INFO_0("d0", d); + + SEND_PID_INFO_1("p1", p); + SEND_PID_INFO_1("i1", i); + SEND_PID_INFO_1("d1", d); + + SEND_PID_INFO_BED("hbp", p); + SEND_PID_INFO_BED("hbi", i); + SEND_PID_INFO_BED("hbd", d); + break; + } +} + +void NextionTFT::PanelAction(uint8_t req) { + switch (req) { + + case 50: // Pause SD print + //if (isPrintingFromMedia()) { + //SEND_TXT("tmppage.M117", "Paused"); + pausePrint(); + SEND_TXT_END("qpause.picc=29"); + //} + break; + + case 51: // Resume SD Print + resumePrint(); + SEND_TXT_END("qpause.picc=28"); + break; + + case 52: // Stop SD print + //if (isPrintingFromMedia()) { + stopPrint(); + SEND_TXT_END("page prepare"); + //} + break; + + case 54: // A13 Select file + SelectFile(); + break; + + case 65: // Cool Down + if (!isPrinting()) coolDown(); + break; + + case 66: // Refresh SD + if (!isPrinting()) { + injectCommands_P(PSTR("M21")); + filenavigator.reset(); + } + break; + + case 56: // Set Fan, Flow, Print Speed + switch (nextion_command[4]) { + case 'S': setTargetFan_percent(atof(&nextion_command[5]), FAN0); break; + case 'P': setFeedrate_percent(atoi(&nextion_command[5])); break; + case 'F': setFlow_percent(atoi(&nextion_command[5]), getActiveTool()); break; + } + break; + + case 57: // Disable Motors + if (!isPrinting()) { + disable_all_steppers(); // from marlincore.h + SEND_TXT("tmppage.M117", "Motors disabled"); + } + break; + + case 58: // Load/Unload Filament + #if ENABLED(FILAMENT_LOAD_UNLOAD_GCODES) + if (canMove(getActiveTool())) { + switch (nextion_command[4]) { + case 'L': injectCommands_P(PSTR("M701")); break; + case 'U': injectCommands_P(PSTR("M702")); break; + } + } + else { + SEND_TXT("tmppage.M117", "Preheat first"); + SEND_TXT_END("page preheat"); + } + #else + SEND_TXT("tmppage.M117", "Filament loading disabled"); + #endif + break; + + case 63: // Preheat // Temps defined in configuration.h + #if PREHEAT_COUNT + if (!isPrinting()) switch (nextion_command[4]) { + // Preheat PLA + case 'P': + #if HAS_HEATED_BED + setTargetTemp_celsius(getMaterial_preset_B(0), BED); + #endif + setTargetTemp_celsius(getMaterial_preset_E(0), getActiveTool()); + break; + + // Preheat ABS + case 'A': + #if HAS_HEATED_BED + setTargetTemp_celsius(getMaterial_preset_B(1), BED); + #endif + setTargetTemp_celsius(getMaterial_preset_E(1), getActiveTool()); + break; + + // Preheat PETG + case 'G': + #if HAS_HEATED_BED + setTargetTemp_celsius(getMaterial_preset_B(2), BED); + #endif + setTargetTemp_celsius(getMaterial_preset_E(2), getActiveTool()); + break; + } + #else + SEND_TXT("tmppage.M117", "Preheat disabled"); + #endif + break; + } +} + +void NextionTFT::UpdateOnChange() { + const millis_t ms = millis(); + static millis_t next_event_ms = 0; + // tmppage Temperature + if (!WITHIN(last_degHotend0 - getActualTemp_celsius(E0), -0.2, 0.2) || !WITHIN(last_degTargetHotend0 - getTargetTemp_celsius(E0), -0.5, 0.5)) { + SEND_TEMP("tmppage.t0", ui8tostr3rj(getActualTemp_celsius(E0)), " / ", ui8tostr3rj(getTargetTemp_celsius(E0))); + last_degHotend0 = getActualTemp_celsius(E0); + last_degTargetHotend0 = getTargetTemp_celsius(E0); + } + + if (!WITHIN(last_degHotend1 - getActualTemp_celsius(E1), -0.2, 0.2) || !WITHIN(last_degTargetHotend1 - getTargetTemp_celsius(E1), -0.5, 0.5)) { + SEND_TEMP("tmppage.t1", ui8tostr3rj(getActualTemp_celsius(E1)), " / ", ui8tostr3rj(getTargetTemp_celsius(E1))); + last_degHotend1 = getActualTemp_celsius(E1); + last_degTargetHotend1 = getTargetTemp_celsius(E1); + } + + if (!WITHIN(last_degBed - getActualTemp_celsius(BED), -0.2, 0.2) || !WITHIN(last_degTargetBed - getTargetTemp_celsius(BED), -0.5, 0.5)) { + SEND_TEMP("tmppage.t2", ui8tostr3rj(getActualTemp_celsius(BED)), " / ", ui8tostr3rj(getTargetTemp_celsius(BED))); + last_degBed = getActualTemp_celsius(BED); + last_degTargetBed = getTargetTemp_celsius(BED); + } + + // tmppage Tool + if (last_active_extruder != getActiveTool()) { + SEND_VALasTXT("tmppage.tool", getActiveTool()); + last_active_extruder = getActiveTool(); + } + + // tmppage Fan Speed + if (last_fan_speed != getActualFan_percent(FAN0)) { + SEND_VALasTXT("tmppage.fan", ui8tostr3rj(getActualFan_percent(FAN0))); + last_fan_speed = getActualFan_percent(FAN0); + } + + // tmppage Print Speed + if (last_print_speed != getFeedrate_percent()) { + SEND_VALasTXT("tmppage.speed", ui8tostr3rj(getFeedrate_percent())); + last_print_speed = getFeedrate_percent(); + } + + // tmppage Flow + if (last_flow_speed != getFlowPercentage(getActiveTool())) { + SEND_VALasTXT("tmppage.flow", getFlowPercentage(getActiveTool())); + last_flow_speed = getFlowPercentage(getActiveTool()); + } + + // tmppage Progress + Layer + Time + if (isPrinting()) { + + if (ELAPSED(ms, next_event_ms)) { + next_event_ms = ms + 1000; + #if ENABLED(SHOW_REMAINING_TIME) + const uint32_t remaining = getProgress_seconds_remaining(); + char remaining_str[10]; + _format_time(remaining_str, remaining); + SEND_VALasTXT("tmppage.remaining", remaining_str); + #endif + const uint32_t elapsed = getProgress_seconds_elapsed(); + char elapsed_str[10]; + _format_time(elapsed_str, elapsed); + SEND_VALasTXT("tmppage.elapsed", elapsed_str); + } + + if (last_progress != getProgress_percent()) { + SEND_VALasTXT("tmppage.progress", ui8tostr3rj(getProgress_percent())); + last_progress = getProgress_percent(); + } + + if (last_get_axis_position_mmZ < getAxisPosition_mm(Z)) { + layer++; + SEND_VALasTXT("tmppage.layer", layer); + } + + if (last_get_axis_position_mmZ > getAxisPosition_mm(Z)) { + layer--; + SEND_VALasTXT("tmppage.layer", layer); + } + } + + // tmppage Axis + if (!WITHIN(last_get_axis_position_mmX - getAxisPosition_mm(X), -0.1, 0.1)) { + if (ELAPSED(ms, next_event_ms)) { + next_event_ms = ms + 30; + SEND_VALasTXT("tmppage.x", getAxisPosition_mm(X)); + last_get_axis_position_mmX = getAxisPosition_mm(X); + } + } + + if (!WITHIN(last_get_axis_position_mmY - getAxisPosition_mm(Y), -0.1, 0.1)) { + if (ELAPSED(ms, next_event_ms)) { + next_event_ms = ms + 30; + SEND_VALasTXT("tmppage.y", getAxisPosition_mm(Y)); + last_get_axis_position_mmY = getAxisPosition_mm(Y); + } + } + + if (!WITHIN(last_get_axis_position_mmZ - getAxisPosition_mm(Z), -0.1, 0.1)) { + SEND_VALasTXT("tmppage.z", getAxisPosition_mm(Z)); + last_get_axis_position_mmZ = getAxisPosition_mm(Z); + } + + // tmppage homed + if (last_homed != isPositionKnown()) { + SEND_VAL("tmppage.homed", isPositionKnown()); + last_homed = isPositionKnown(); + } + if (last_homedX != isAxisPositionKnown(X)) { + SEND_VAL("tmppage.homedx", isAxisPositionKnown(X)); + last_homedX = isAxisPositionKnown(X); + } + if (last_homedY != isAxisPositionKnown(Y)) { + SEND_VAL("tmppage.homedy", isAxisPositionKnown(Y)); + last_homedY = isAxisPositionKnown(Y); + } + if (last_homedZ != isAxisPositionKnown(Z)) { + SEND_VAL("tmppage.homedz", isAxisPositionKnown(Z)); + last_homedZ = isAxisPositionKnown(Z); + } + + // tmppage IDEX Mode + #if ENABLED(DUAL_X_CARRIAGE) + if (last_IDEX_Mode != getIDEX_Mode()) { + SEND_VAL("tmppage.idexmode", getIDEX_Mode()); + last_IDEX_Mode = getIDEX_Mode(); + } + #endif +} + +#endif // NEXTION_TFT diff --git a/Marlin/src/lcd/extui/lib/nextion/nextion_tft.h b/Marlin/src/lcd/extui/lib/nextion/nextion_tft.h new file mode 100644 index 0000000000..9197fcc2c6 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/nextion/nextion_tft.h @@ -0,0 +1,62 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 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 + +/* **************************************** + * lcd/extui/lib/nextion/nextion_tft.h + * **************************************** + * Extensible_UI implementation for Nextion + * https://github.com/Skorpi08 + * ***************************************/ + +#include "nextion_tft_defs.h" +#include "../../../../inc/MarlinConfigPre.h" +#include "../../ui_api.h" + +class NextionTFT { + private: + static uint8_t command_len; + static char nextion_command[MAX_CMND_LEN]; + static char selectedfile[MAX_PATH_LEN]; + + public: + NextionTFT(); + static void Startup(); + static void IdleLoop(); + static void PrinterKilled(PGM_P, PGM_P); + static void ConfirmationRequest(const char * const ); + static void StatusChange(const char * const ); + static void SendtoTFT(PGM_P); + static void UpdateOnChange(); + static void PrintFinished(); + static void PanelInfo(uint8_t); + + private: + static bool ReadTFTCommand(); + static void SendFileList(int8_t); + static void SelectFile(); + static void ProcessPanelRequest(); + static void PanelAction(uint8_t); + static void _format_time(char *, uint32_t); +}; + +extern NextionTFT nextion; diff --git a/Marlin/src/lcd/extui/lib/nextion/nextion_tft_defs.h b/Marlin/src/lcd/extui/lib/nextion/nextion_tft_defs.h new file mode 100644 index 0000000000..75f70fc985 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/nextion/nextion_tft_defs.h @@ -0,0 +1,63 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 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 + +/* **************************************** + * lcd/extui/lib/nextion/nextion_tft_defs.h + * **************************************** + * Extensible_UI implementation for Nextion + * https://github.com/Skorpi08 + * ***************************************/ + +#include "../../../../inc/MarlinConfigPre.h" + +//#define NEXDEBUGLEVEL 255 +#if NEXDEBUGLEVEL + // Bit-masks for selective debug: + enum NexDebugMask : uint8_t { + N_INFO = _BV(0), + N_ACTION = _BV(1), + N_FILE = _BV(2), + N_PANEL = _BV(3), + N_MARLIN = _BV(4), + N_SOME = _BV(5), + N_ALL = _BV(6) + }; + #define NEXDEBUG(M) (((M) & NEXDEBUGLEVEL) == M) // Debug flag macro +#else + #define NEXDEBUG(M) false +#endif + +#define MAX_FOLDER_DEPTH 4 // Limit folder depth TFT has a limit for the file path +#define MAX_CMND_LEN 16 * MAX_FOLDER_DEPTH // Maximum Length for a Panel command +#define MAX_PATH_LEN 16 * MAX_FOLDER_DEPTH // Maximum number of characters in a SD file path + + // TFT panel commands +#define msg_welcome MACHINE_NAME " Ready." + +#define SEND_TEMP(x,y,t,z) (nextion.SendtoTFT(PSTR(x)), nextion.SendtoTFT(PSTR(".txt=\"")), LCD_SERIAL.print(y), nextion.SendtoTFT(PSTR(t)), LCD_SERIAL.print(z), nextion.SendtoTFT(PSTR("\"\xFF\xFF\xFF"))) +#define SEND_VAL(x,y) (nextion.SendtoTFT(PSTR(x)), nextion.SendtoTFT(PSTR(".val=")), LCD_SERIAL.print(y), nextion.SendtoTFT(PSTR("\xFF\xFF\xFF"))) +#define SEND_TXT(x,y) (nextion.SendtoTFT(PSTR(x)), nextion.SendtoTFT(PSTR(".txt=\"")), nextion.SendtoTFT(PSTR(y)), nextion.SendtoTFT(PSTR("\"\xFF\xFF\xFF"))) +#define SEND_TXT_P(x,y) (nextion.SendtoTFT(PSTR(x)), nextion.SendtoTFT(PSTR(".txt=\"")), nextion.SendtoTFT(y), nextion.SendtoTFT(PSTR("\"\xFF\xFF\xFF"))) +#define SEND_VALasTXT(x,y) (nextion.SendtoTFT(PSTR(x)), nextion.SendtoTFT(PSTR(".txt=\"")), LCD_SERIAL.print(y), nextion.SendtoTFT(PSTR("\"\xFF\xFF\xFF"))) +#define SEND_TXT_END(x) (nextion.SendtoTFT(PSTR(x)), nextion.SendtoTFT(PSTR("\xFF\xFF\xFF"))) +#define SEND_PCO2(x,y,z) (nextion.SendtoTFT(PSTR(x)), LCD_SERIAL.print(y), nextion.SendtoTFT(PSTR(".pco=")), nextion.SendtoTFT(PSTR(z)), nextion.SendtoTFT(PSTR("\xFF\xFF\xFF"))) diff --git a/Marlin/src/lcd/extui/nextion_lcd.cpp b/Marlin/src/lcd/extui/nextion_lcd.cpp new file mode 100644 index 0000000000..fa45f4ef51 --- /dev/null +++ b/Marlin/src/lcd/extui/nextion_lcd.cpp @@ -0,0 +1,117 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 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 . + * + */ + +/** + * lcd/extui/nextion_lcd.cpp + * + * Nextion TFT support for Marlin + */ + +#include "../../inc/MarlinConfigPre.h" + +#if ENABLED(NEXTION_TFT) + +#include "ui_api.h" +#include "lib/nextion/nextion_tft.h" + +namespace ExtUI { + + void onStartup() { nextion.Startup(); } + void onIdle() { nextion.IdleLoop(); } + void onPrinterKilled(PGM_P const error, PGM_P const component) { nextion.PrinterKilled(error,component); } + void onMediaInserted() {} + void onMediaError() {} + void onMediaRemoved() {} + void onPlayTone(const uint16_t frequency, const uint16_t duration) {} + void onPrintTimerStarted() {} + void onPrintTimerPaused() {} + void onPrintTimerStopped() {} + void onFilamentRunout(const extruder_t) {} + void onUserConfirmRequired(const char * const msg) { nextion.ConfirmationRequest(msg); } + void onStatusChanged(const char * const msg) { nextion.StatusChange(msg); } + + void onHomingStart() {} + void onHomingComplete() {} + void onPrintFinished() { nextion.PrintFinished(); } + + void onFactoryReset() {} + + void onStoreSettings(char *buff) { + // Called when saving to EEPROM (i.e. M500). If the ExtUI needs + // permanent data to be stored, it can write up to eeprom_data_size bytes + // into buff. + + // Example: + // static_assert(sizeof(myDataStruct) <= ExtUI::eeprom_data_size); + // memcpy(buff, &myDataStruct, sizeof(myDataStruct)); + } + + void onLoadSettings(const char *buff) { + // Called while loading settings from EEPROM. If the ExtUI + // needs to retrieve data, it should copy up to eeprom_data_size bytes + // from buff + + // Example: + // static_assert(sizeof(myDataStruct) <= ExtUI::eeprom_data_size); + // memcpy(&myDataStruct, buff, sizeof(myDataStruct)); + } + + void onConfigurationStoreWritten(bool success) { + // Called after the entire EEPROM has been written, + // whether successful or not. + } + + void onConfigurationStoreRead(bool success) { + // Called after the entire EEPROM has been read, + // whether successful or not. + } + + #if HAS_MESH + void onMeshLevelingStart() {} + + void onMeshUpdate(const int8_t xpos, const int8_t ypos, const float zval) { + // Called when any mesh points are updated + } + + void onMeshUpdate(const int8_t xpos, const int8_t ypos, const ExtUI::probe_state_t state) { + // Called to indicate a special condition + } + #endif + + #if ENABLED(POWER_LOSS_RECOVERY) + void onPowerLossResume() { + // Called on resume from power-loss + } + #endif + + #if HAS_PID_HEATING + void onPidTuning(const result_t rst) { + // Called for temperature PID tuning result + nextion.PanelInfo(37); + } + #endif + + void onSteppersDisabled() {} + void onSteppersEnabled() {} +} + +#endif // NEXTION_TFT diff --git a/Marlin/src/lcd/extui/ui_api.cpp b/Marlin/src/lcd/extui/ui_api.cpp index 97d4ec2b08..73e5bc092d 100644 --- a/Marlin/src/lcd/extui/ui_api.cpp +++ b/Marlin/src/lcd/extui/ui_api.cpp @@ -651,6 +651,17 @@ namespace ExtUI { void setAxisMaxJerk_mm_s(const float &value, const extruder_t) { planner.set_max_jerk(E_AXIS, value); } #endif + #if ENABLED(DUAL_X_CARRIAGE) + uint8_t getIDEX_Mode() { return dual_x_carriage_mode; } + #endif + + #if PREHEAT_COUNT + uint16_t getMaterial_preset_E(const uint16_t index) { return ui.material_preset[index].hotend_temp; } + #if HAS_HEATED_BED + uint16_t getMaterial_preset_B(const uint16_t index) { return ui.material_preset[index].bed_temp; } + #endif + #endif + feedRate_t getFeedrate_mm_s() { return feedrate_mm_s; } int16_t getFlowPercentage(const extruder_t extr) { return planner.flow_percentage[extr]; } feedRate_t getMinFeedrate_mm_s() { return planner.settings.min_feedrate_mm_s; } @@ -663,8 +674,8 @@ namespace ExtUI { void setMinFeedrate_mm_s(const feedRate_t fr) { planner.settings.min_feedrate_mm_s = fr; } void setMinTravelFeedrate_mm_s(const feedRate_t fr) { planner.settings.min_travel_feedrate_mm_s = fr; } void setPrintingAcceleration_mm_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; } + 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(BABYSTEPPING) diff --git a/Marlin/src/lcd/extui/ui_api.h b/Marlin/src/lcd/extui/ui_api.h index 701bf9eb54..380d311517 100644 --- a/Marlin/src/lcd/extui/ui_api.h +++ b/Marlin/src/lcd/extui/ui_api.h @@ -139,6 +139,17 @@ namespace ExtUI { uint32_t getProgress_seconds_elapsed(); + #if PREHEAT_COUNT + uint16_t getMaterial_preset_E(const uint16_t); + #if HAS_HEATED_BED + uint16_t getMaterial_preset_B(const uint16_t); + #endif + #endif + + #if ENABLED(DUAL_X_CARRIAGE) + uint8_t getIDEX_Mode(); + #endif + #if ENABLED(SHOW_REMAINING_TIME) inline uint32_t getProgress_seconds_remaining() { return ui.get_remaining_time(); } #endif @@ -171,6 +182,7 @@ namespace ExtUI { #endif #if ENABLED(PRINTCOUNTER) + char* getFailedPrints_str(char buffer[21]); char* getTotalPrints_str(char buffer[21]); char* getFinishedPrints_str(char buffer[21]); char* getTotalPrintTime_str(char buffer[21]); diff --git a/platformio.ini b/platformio.ini index 11dcecfc99..941426d732 100644 --- a/platformio.ini +++ b/platformio.ini @@ -59,6 +59,7 @@ default_src_filter = + - - + - - - - - + - - - - - - @@ -289,6 +290,7 @@ HAS_MENU_TRAMMING = src_filter=+ HAS_MENU_UBL = src_filter=+ ANYCUBIC_LCD_CHIRON = src_filter=+ + ANYCUBIC_LCD_I3MEGA = src_filter=+ + +NEXTION_TFT = src_filter=+ + HAS_DGUS_LCD = src_filter=+ + DGUS_LCD_UI_FYSETC = src_filter=+ DGUS_LCD_UI_HIPRECY = src_filter=+ From 790bba155639cff44ca950639f4d685c16998bf5 Mon Sep 17 00:00:00 2001 From: ellensp Date: Fri, 19 Mar 2021 18:05:30 +1300 Subject: [PATCH 165/253] Fix preflight motherboard target check (#21372) Co-authored-by: Scott Lahteine --- .../PlatformIO/scripts/preflight-checks.py | 30 ++++++++++--------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/buildroot/share/PlatformIO/scripts/preflight-checks.py b/buildroot/share/PlatformIO/scripts/preflight-checks.py index 4499c2bfdc..2ad1562a31 100644 --- a/buildroot/share/PlatformIO/scripts/preflight-checks.py +++ b/buildroot/share/PlatformIO/scripts/preflight-checks.py @@ -5,8 +5,18 @@ import os,re,sys Import("env") -def get_envs_for_board(board, envregex): +def get_envs_for_board(board): with open(os.path.join("Marlin", "src", "pins", "pins.h"), "r") as file: + + if sys.platform == 'win32': + envregex = r"(?:env|win):" + elif sys.platform == 'darwin': + envregex = r"(?:env|mac|uni):" + elif sys.platform == 'linux': + envregex = r"(?:env|lin|uni):" + else: + envregex = r"(?:env):" + r = re.compile(r"if\s+MB\((.+)\)") if board.startswith("BOARD_"): board = board[6:] @@ -17,7 +27,8 @@ def get_envs_for_board(board, envregex): line = file.readline() found_envs = re.match(r"\s*#include .+" + envregex, line) if found_envs: - return re.findall(envregex + r"(\w+)", line) + envlist = re.findall(envregex + r"(\w+)", line) + return [ "env:"+s for s in envlist ] return [] def check_envs(build_env, board_envs, config): @@ -43,24 +54,15 @@ if 'MARLIN_FEATURES' not in env: if 'MOTHERBOARD' not in env['MARLIN_FEATURES']: raise SystemExit("Error: MOTHERBOARD is not defined in Configuration.h") -if sys.platform == 'win32': - osregex = r"(?:env|win):" -elif sys.platform == 'darwin': - osregex = r"(?:env|mac|uni):" -elif sys.platform == 'linux': - osregex = r"(?:env|lin|uni):" -else: - osregex = r"(?:env):" - build_env = env['PIOENV'] motherboard = env['MARLIN_FEATURES']['MOTHERBOARD'] -board_envs = get_envs_for_board(motherboard, osregex) +board_envs = get_envs_for_board(motherboard) config = env.GetProjectConfig() -result = check_envs(build_env, board_envs, config) +result = check_envs("env:"+build_env, board_envs, config) if not result: err = "Error: Build environment '%s' is incompatible with %s. Use one of these: %s" % \ - (build_env, motherboard, ",".join([e[4:] for e in board_envs if re.match(r"^" + osregex, e)])) + ( build_env, motherboard, ", ".join([ e[4:] for e in board_envs if e.startswith("env:") ]) ) raise SystemExit(err) # From d4ab2024f50152f06223c3ab63a7a93b95b4b887 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 18 Mar 2021 15:59:48 -0500 Subject: [PATCH 166/253] Fix bool++ warning --- Marlin/src/feature/encoder_i2c.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Marlin/src/feature/encoder_i2c.cpp b/Marlin/src/feature/encoder_i2c.cpp index cf5ebfd012..abaa93f767 100644 --- a/Marlin/src/feature/encoder_i2c.cpp +++ b/Marlin/src/feature/encoder_i2c.cpp @@ -47,7 +47,7 @@ void I2CPositionEncoder::init(const uint8_t address, const AxisEnum axis) { encoderAxis = axis; i2cAddress = address; - initialized++; + initialized = true; SERIAL_ECHOLNPAIR("Setting up encoder on ", AS_CHAR(axis_codes[encoderAxis]), " axis, addr = ", address); @@ -209,8 +209,7 @@ void I2CPositionEncoder::set_homed() { delay(10); zeroOffset = get_raw_count(); - homed++; - trusted++; + homed = trusted = true; #ifdef I2CPE_DEBUG SERIAL_CHAR(axis_codes[encoderAxis]); From 38b44e3fc9cb96866f9c25058667888ae43cfc0c Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 17 Mar 2021 23:55:55 -0500 Subject: [PATCH 167/253] HAL eeprom cleanup --- Marlin/src/HAL/STM32F1/eeprom_if_iic.cpp | 2 +- Marlin/src/HAL/shared/eeprom_if.h | 2 +- Marlin/src/HAL/shared/eeprom_if_i2c.cpp | 17 ++++--- Marlin/src/HAL/shared/eeprom_if_spi.cpp | 57 +++++++++++------------- 4 files changed, 37 insertions(+), 41 deletions(-) diff --git a/Marlin/src/HAL/STM32F1/eeprom_if_iic.cpp b/Marlin/src/HAL/STM32F1/eeprom_if_iic.cpp index ccc3fc537f..78b7af0b04 100644 --- a/Marlin/src/HAL/STM32F1/eeprom_if_iic.cpp +++ b/Marlin/src/HAL/STM32F1/eeprom_if_iic.cpp @@ -40,7 +40,7 @@ void eeprom_init() { BL24CXX::init(); } // Public functions // ------------------------ -void eeprom_write_byte(uint8_t *pos, unsigned char value) { +void eeprom_write_byte(uint8_t *pos, uint8_t value) { const unsigned eeprom_address = (unsigned)pos; return BL24CXX::writeOneByte(eeprom_address, value); } diff --git a/Marlin/src/HAL/shared/eeprom_if.h b/Marlin/src/HAL/shared/eeprom_if.h index e44da801df..e496de2a03 100644 --- a/Marlin/src/HAL/shared/eeprom_if.h +++ b/Marlin/src/HAL/shared/eeprom_if.h @@ -25,5 +25,5 @@ // EEPROM // void eeprom_init(); -void eeprom_write_byte(uint8_t *pos, unsigned char value); +void eeprom_write_byte(uint8_t *pos, uint8_t value); uint8_t eeprom_read_byte(uint8_t *pos); diff --git a/Marlin/src/HAL/shared/eeprom_if_i2c.cpp b/Marlin/src/HAL/shared/eeprom_if_i2c.cpp index da70af2772..f6dd33b7c4 100644 --- a/Marlin/src/HAL/shared/eeprom_if_i2c.cpp +++ b/Marlin/src/HAL/shared/eeprom_if_i2c.cpp @@ -55,12 +55,15 @@ static constexpr uint8_t eeprom_device_address = I2C_ADDRESS(EEPROM_DEVICE_ADDRE // Public functions // ------------------------ -void eeprom_write_byte(uint8_t *pos, unsigned char value) { +static void _eeprom_begin(uint8_t * const pos) { const unsigned eeprom_address = (unsigned)pos; - Wire.beginTransmission(eeprom_device_address); - Wire.write(int(eeprom_address >> 8)); // MSB - Wire.write(int(eeprom_address & 0xFF)); // LSB + Wire.write(int(eeprom_address >> 8)); // Address High + Wire.write(int(eeprom_address & 0xFF)); // Address Low +} + +void eeprom_write_byte(uint8_t *pos, uint8_t value) { + _eeprom_begin(pos); Wire.write(value); Wire.endTransmission(); @@ -70,11 +73,7 @@ void eeprom_write_byte(uint8_t *pos, unsigned char value) { } uint8_t eeprom_read_byte(uint8_t *pos) { - const unsigned eeprom_address = (unsigned)pos; - - Wire.beginTransmission(eeprom_device_address); - Wire.write(int(eeprom_address >> 8)); // MSB - Wire.write(int(eeprom_address & 0xFF)); // LSB + _eeprom_begin(pos); Wire.endTransmission(); Wire.requestFrom(eeprom_device_address, (byte)1); return Wire.available() ? Wire.read() : 0xFF; diff --git a/Marlin/src/HAL/shared/eeprom_if_spi.cpp b/Marlin/src/HAL/shared/eeprom_if_spi.cpp index a341fef9de..e162f6fedc 100644 --- a/Marlin/src/HAL/shared/eeprom_if_spi.cpp +++ b/Marlin/src/HAL/shared/eeprom_if_spi.cpp @@ -43,44 +43,41 @@ void eeprom_init() {} #define EEPROM_WRITE_DELAY 7 #endif -uint8_t eeprom_read_byte(uint8_t* pos) { - uint8_t v; - uint8_t eeprom_temp[3]; - - // set read location - // begin transmission from device - eeprom_temp[0] = CMD_READ; - eeprom_temp[1] = ((unsigned)pos>>8) & 0xFF; // addr High - eeprom_temp[2] = (unsigned)pos& 0xFF; // addr Low - WRITE(SPI_EEPROM1_CS, HIGH); - WRITE(SPI_EEPROM1_CS, LOW); +static void _eeprom_begin(uint8_t * const pos, const uint8_t cmd) { + const uint8_t eeprom_temp[3] = { + cmd, + (unsigned(pos) >> 8) & 0xFF, // Address High + unsigned(pos) & 0xFF // Address Low + }; + WRITE(SPI_EEPROM1_CS, HIGH); // Usually free already + WRITE(SPI_EEPROM1_CS, LOW); // Activate the Bus spiSend(SPI_CHAN_EEPROM1, eeprom_temp, 3); + // Leave the Bus in-use +} + +uint8_t eeprom_read_byte(uint8_t* pos) { + _eeprom_begin(pos, CMD_READ); // Set read location and begin transmission + + const uint8_t v = spiRec(SPI_CHAN_EEPROM1); // After READ a value sits on the Bus + + WRITE(SPI_EEPROM1_CS, HIGH); // Done with device - v = spiRec(SPI_CHAN_EEPROM1); - WRITE(SPI_EEPROM1_CS, HIGH); return v; } -void eeprom_write_byte(uint8_t* pos, uint8_t value) { - uint8_t eeprom_temp[3]; - - /*write enable*/ - eeprom_temp[0] = CMD_WREN; +void eeprom_write_byte(uint8_t *pos, uint8_t value) { + const uint8_t eeprom_temp = CMD_WREN; WRITE(SPI_EEPROM1_CS, LOW); - spiSend(SPI_CHAN_EEPROM1, eeprom_temp, 1); - WRITE(SPI_EEPROM1_CS, HIGH); - delay(1); + spiSend(SPI_CHAN_EEPROM1, &eeprom_temp, 1); // Write Enable - /*write addr*/ - eeprom_temp[0] = CMD_WRITE; - eeprom_temp[1] = ((unsigned)pos>>8) & 0xFF; //addr High - eeprom_temp[2] = (unsigned)pos & 0xFF; //addr Low - WRITE(SPI_EEPROM1_CS, LOW); - spiSend(SPI_CHAN_EEPROM1, eeprom_temp, 3); + WRITE(SPI_EEPROM1_CS, HIGH); // Done with the Bus + delay(1); // For a small amount of time - spiSend(SPI_CHAN_EEPROM1, value); - WRITE(SPI_EEPROM1_CS, HIGH); - delay(EEPROM_WRITE_DELAY); // wait for page write to complete + _eeprom_begin(pos, CMD_WRITE); // Set write address and begin transmission + + spiSend(SPI_CHAN_EEPROM1, value); // Send the value to be written + WRITE(SPI_EEPROM1_CS, HIGH); // Done with the Bus + delay(EEPROM_WRITE_DELAY); // Give page write time to complete } #endif // USE_SHARED_EEPROM From 5573d98ecca3d721b9fe6259dcab96783416ce5a Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Sat, 20 Mar 2021 00:13:15 +0000 Subject: [PATCH 168/253] [cron] Bump distribution date (2021-03-20) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 4839037c0e..6d14c41121 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2021-03-19" + #define STRING_DISTRIBUTION_DATE "2021-03-20" #endif /** From d0ea2b286739379ff2524ecc1c8dcbb057e98c0b Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Sun, 21 Mar 2021 00:14:12 +0000 Subject: [PATCH 169/253] [cron] Bump distribution date (2021-03-21) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 6d14c41121..f23171ff77 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2021-03-20" + #define STRING_DISTRIBUTION_DATE "2021-03-21" #endif /** From fb9502e0fbb1e6114da1f1f9a18f69e457d95fab Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Mon, 22 Mar 2021 00:13:40 +0000 Subject: [PATCH 170/253] [cron] Bump distribution date (2021-03-22) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index f23171ff77..3f812d9143 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2021-03-21" + #define STRING_DISTRIBUTION_DATE "2021-03-22" #endif /** From 26db51fa9ddee1c99d62c36322b7cfb3aab68483 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Tue, 23 Mar 2021 00:13:33 +0000 Subject: [PATCH 171/253] [cron] Bump distribution date (2021-03-23) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 3f812d9143..2f91dfd927 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2021-03-22" + #define STRING_DISTRIBUTION_DATE "2021-03-23" #endif /** From 3e7d830f570ece878f18732072de1b34156cdd66 Mon Sep 17 00:00:00 2001 From: Marcio T Date: Mon, 22 Mar 2021 23:51:03 -0600 Subject: [PATCH 172/253] Mesh Editor for FTDI Eve Touch UI (#21381) --- .../ftdi_eve_lib/extended/grid_layout.h | 13 +++ .../ftdi_eve_lib/extras/adjuster_widget.cpp | 54 +++++++++ .../ftdi_eve_lib/extras/adjuster_widget.h | 32 ++++++ .../ftdi_eve_touch_ui/language/language_en.h | 1 - .../screens/bed_mesh_screen.cpp | 103 ++++++++++++------ .../screens/bed_mesh_screen.h | 15 ++- .../screens/leveling_menu.cpp | 8 +- Marlin/src/lcd/extui/ui_api.cpp | 20 ++++ Marlin/src/lcd/extui/ui_api.h | 1 + 9 files changed, 205 insertions(+), 42 deletions(-) create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/adjuster_widget.cpp create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/adjuster_widget.h diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/grid_layout.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/grid_layout.h index 82bb8abf7f..47aec24d83 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/grid_layout.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/grid_layout.h @@ -87,6 +87,19 @@ cmd.cmd(LINE_WIDTH(16)); \ } +// Routines for subdividing a grid within a box (x,y,w,h) + +#define SUB_GRID_W(W) ((W)*w/SUB_COLS) +#define SUB_GRID_H(H) ((H)*h/SUB_ROWS) +#define SUB_GRID_X(X) (SUB_GRID_W((X)-1) + x) +#define SUB_GRID_Y(Y) (SUB_GRID_H((Y)-1) + y) +#define SUB_X(X) (SUB_GRID_X(X) + MARGIN_L) +#define SUB_Y(Y) (SUB_GRID_Y(Y) + MARGIN_T) +#define SUB_W(W) (SUB_GRID_W(W) - MARGIN_L - MARGIN_R) +#define SUB_H(H) (SUB_GRID_H(H) - MARGIN_T - MARGIN_B) +#define SUB_POS(X,Y) SUB_X(X), SUB_Y(Y) +#define SUB_SIZE(W,H) SUB_W(W), SUB_H(H) + namespace FTDI { #if ENABLED(TOUCH_UI_PORTRAIT) constexpr uint16_t display_width = Vsize; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/adjuster_widget.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/adjuster_widget.cpp new file mode 100644 index 0000000000..084c9c014f --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/adjuster_widget.cpp @@ -0,0 +1,54 @@ +/*********************** + * adjuster_widget.cpp * + ***********************/ + +/**************************************************************************** + * Written By Marcio Teixeira 2021 - Cocoa Press * + * * + * 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 "../ftdi_eve_lib.h" +#include "../extended/grid_layout.h" + +#include "adjuster_widget.h" + +#define SUB_COLS 9 +#define SUB_ROWS 1 +#define VAL_POS SUB_POS(1,1), SUB_SIZE(5,1) +#define INC_POS SUB_POS(6,1), SUB_SIZE(2,1) +#define DEC_POS SUB_POS(8,1), SUB_SIZE(2,1) + +void draw_adjuster(CommandProcessor& cmd, int16_t x, int16_t y, int16_t w, int16_t h, uint8_t tag, float value, progmem_str units, int8_t width, uint8_t precision, draw_mode_t what) { + if (what & BACKGROUND) + cmd.tag(0).button(VAL_POS, F(""), FTDI::OPT_FLAT); + + if (what & FOREGROUND) { + char str[width + precision + 10 + (units ? strlen_P((const char*) units) : 0)]; + if (isnan(value)) + strcpy_P(str, PSTR("-")); + else + dtostrf(value, width, precision, str); + + if (units) { + strcat_P(str, PSTR(" ")); + strcat_P(str, (const char*) units); + } + + cmd.tag(0) + .text(VAL_POS, str) + .tag(tag ).button(INC_POS, F("-")) + .tag(tag+1).button(DEC_POS, F("+")); + } +} diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/adjuster_widget.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/adjuster_widget.h new file mode 100644 index 0000000000..c48e37f620 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/adjuster_widget.h @@ -0,0 +1,32 @@ +/********************* + * adjuster_widget.h * + *********************/ + +/**************************************************************************** + * Written By Marcio Teixeira 2021 - Cocoa Press * + * * + * 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 "../extended/screen_types.h" + +void draw_adjuster( + CommandProcessor& cmd, + int16_t x, int16_t y, int16_t w, int16_t h, + uint8_t tag, + float value, progmem_str units = nullptr, + int8_t width = 5, uint8_t precision = 1, + draw_mode_t what = BOTH +); diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h index e57858aa3f..f6603e514a 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h @@ -144,7 +144,6 @@ namespace Language_en { PROGMEM Language_Str MSG_BED_MAPPING_DONE = u8"Bed mapping finished"; PROGMEM Language_Str MSG_BED_MAPPING_INCOMPLETE = u8"Not all points probed"; PROGMEM Language_Str MSG_LEVELING = u8"Leveling"; - PROGMEM Language_Str MSG_SHOW_MESH = u8"Show Bed Mesh"; #if ENABLED(TOUCH_UI_LULZBOT_BIO) PROGMEM Language_Str MSG_MOVE_TO_HOME = u8"Move to Home"; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp index 6de573da8c..c87329ebe2 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp @@ -25,21 +25,24 @@ #ifdef FTDI_BED_MESH_SCREEN +#include "../ftdi_eve_lib/extras/adjuster_widget.h" + using namespace FTDI; using namespace Theme; using namespace ExtUI; constexpr static BedMeshScreenData &mydata = screen_data.BedMeshScreen; +constexpr static float gaugeThickness = 0.25; #if ENABLED(TOUCH_UI_PORTRAIT) - #define GRID_COLS 2 + #define GRID_COLS 3 #define GRID_ROWS 10 - #define MESH_POS BTN_POS(1, 2), BTN_SIZE(2,5) - #define MESSAGE_POS BTN_POS(1, 7), BTN_SIZE(2,1) + #define MESH_POS BTN_POS(1, 2), BTN_SIZE(3,5) + #define MESSAGE_POS BTN_POS(1, 7), BTN_SIZE(3,1) #define Z_LABEL_POS BTN_POS(1, 8), BTN_SIZE(1,1) - #define Z_VALUE_POS BTN_POS(2, 8), BTN_SIZE(1,1) - #define OKAY_POS BTN_POS(1,10), BTN_SIZE(2,1) + #define Z_VALUE_POS BTN_POS(2, 8), BTN_SIZE(2,1) + #define OKAY_POS BTN_POS(1,10), BTN_SIZE(3,1) #else #define GRID_COLS 5 #define GRID_ROWS 5 @@ -198,12 +201,12 @@ void BedMeshScreen::drawMesh(int16_t x, int16_t y, int16_t w, int16_t h, ExtUI:: if (opts & USE_HIGHLIGHT) { const uint8_t tag = mydata.highlightedTag; - uint8_t x, y; - if (tagToPoint(tag, x, y)) { + xy_uint8_t pt; + if (tagToPoint(tag, pt)) { cmd.cmd(COLOR_A(128)) .cmd(POINT_SIZE(basePointSize * 6)) .cmd(BEGIN(POINTS)) - .tag(tag).cmd(VERTEX2F(TRANSFORM(x, y, HEIGHT(x, y)))); + .tag(tag).cmd(VERTEX2F(TRANSFORM(pt.x, pt.y, HEIGHT(pt.x, pt.y)))); } } cmd.cmd(END()); @@ -214,43 +217,68 @@ uint8_t BedMeshScreen::pointToTag(uint8_t x, uint8_t y) { return y * (GRID_MAX_POINTS_X) + x + 10; } -bool BedMeshScreen::tagToPoint(uint8_t tag, uint8_t &x, uint8_t &y) { +bool BedMeshScreen::tagToPoint(uint8_t tag, xy_uint8_t &pt) { if (tag < 10) return false; - x = (tag - 10) % (GRID_MAX_POINTS_X); - y = (tag - 10) / (GRID_MAX_POINTS_X); + pt.x = (tag - 10) % (GRID_MAX_POINTS_X); + pt.y = (tag - 10) / (GRID_MAX_POINTS_X); return true; } void BedMeshScreen::onEntry() { mydata.highlightedTag = 0; + mydata.zAdjustment = 0; mydata.count = GRID_MAX_POINTS; mydata.message = mydata.MSG_NONE; BaseScreen::onEntry(); } -float BedMeshScreen::getHightlightedValue() { - if (mydata.highlightedTag) { - xy_uint8_t pt; - tagToPoint(mydata.highlightedTag, pt.x, pt.y); - return ExtUI::getMeshPoint(pt); +float BedMeshScreen::getHighlightedValue(bool nanAsZero) { + xy_uint8_t pt; + if (tagToPoint(mydata.highlightedTag, pt)) { + const float val = ExtUI::getMeshPoint(pt); + return (isnan(val) && nanAsZero) ? 0 : val; } return NAN; } -void BedMeshScreen::drawHighlightedPointValue() { - char str[16]; - const float val = getHightlightedValue(); - const bool isGood = !isnan(val); - if (isGood) - dtostrf(val, 5, 3, str); - else - strcpy_P(str, PSTR("-")); +void BedMeshScreen::setHighlightedValue(float value) { + xy_uint8_t pt; + if (tagToPoint(mydata.highlightedTag, pt)) + ExtUI::setMeshPoint(pt, value); +} +void BedMeshScreen::moveToHighlightedValue() { + xy_uint8_t pt; + if (tagToPoint(mydata.highlightedTag, pt)) + ExtUI::moveToMeshPoint(pt, gaugeThickness + mydata.zAdjustment); +} + +void BedMeshScreen::adjustHighlightedValue(float increment) { + mydata.zAdjustment += increment; + moveToHighlightedValue(); +} + +void BedMeshScreen::saveAdjustedHighlightedValue() { + if(mydata.zAdjustment) { + BedMeshScreen::setHighlightedValue(BedMeshScreen::getHighlightedValue(true) + mydata.zAdjustment); + mydata.zAdjustment = 0; + } +} + +void BedMeshScreen::changeHighlightedValue(uint8_t tag) { + saveAdjustedHighlightedValue(); + mydata.highlightedTag = tag; + moveToHighlightedValue(); +} + +void BedMeshScreen::drawHighlightedPointValue() { CommandProcessor cmd; cmd.font(Theme::font_medium) + .colors(normal_btn) .text(Z_LABEL_POS, GET_TEXT_F(MSG_MESH_EDIT_Z)) - .text(Z_VALUE_POS, str) - .colors(action_btn) + .font(font_small); + draw_adjuster(cmd, Z_VALUE_POS, 2, getHighlightedValue(true) + mydata.zAdjustment, GET_TEXT_F(MSG_UNITS_MM), 4, 3); + cmd.colors(action_btn) .tag(1).button(OKAY_POS, GET_TEXT_F(MSG_BUTTON_OKAY)) .tag(0); @@ -292,19 +320,23 @@ void BedMeshScreen::onRedraw(draw_mode_t what) { } } -bool BedMeshScreen::onTouchStart(uint8_t tag) { - mydata.highlightedTag = tag; - return true; -} - bool BedMeshScreen::onTouchEnd(uint8_t tag) { + constexpr float increment = 0.01; switch (tag) { case 1: + saveAdjustedHighlightedValue(); + injectCommands_P(PSTR("G29 S1")); GOTO_PREVIOUS(); return true; + case 2: adjustHighlightedValue(-increment); break; + case 3: adjustHighlightedValue( increment); break; default: - return false; + if (tag >= 10) + changeHighlightedValue(tag); + else + return false; } + return true; } void BedMeshScreen::onMeshUpdate(const int8_t, const int8_t, const float) { @@ -341,4 +373,11 @@ void BedMeshScreen::startMeshProbe() { injectCommands_P(PSTR(BED_LEVELING_COMMANDS)); } +void BedMeshScreen::showMeshEditor() { + SpinnerDialogBox::enqueueAndWait_P(ExtUI::isMachineHomed() ? F("M420 S1") : F("G28\nM420 S1")); + // After the spinner, go to this screen. + current_screen.forget(); + PUSH_SCREEN(BedMeshScreen); +} + #endif // FTDI_BED_MESH_SCREEN diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.h index de72d863ae..804bb57ad0 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.h @@ -32,6 +32,7 @@ struct BedMeshScreenData { } message; uint8_t count; uint8_t highlightedTag; + float zAdjustment; }; class BedMeshScreen : public BaseScreen, public CachedScreen { @@ -45,18 +46,22 @@ class BedMeshScreen : public BaseScreen, public CachedScreen Date: Tue, 23 Mar 2021 06:57:50 +0100 Subject: [PATCH 173/253] Update Hungarian language (#21407) --- Marlin/src/lcd/language/language_hu.h | 221 ++++++++++++++------------ 1 file changed, 115 insertions(+), 106 deletions(-) diff --git a/Marlin/src/lcd/language/language_hu.h b/Marlin/src/lcd/language/language_hu.h index e29b75fb35..b2c1d30f33 100644 --- a/Marlin/src/lcd/language/language_hu.h +++ b/Marlin/src/lcd/language/language_hu.h @@ -22,12 +22,15 @@ #pragma once /** - * Magyar + * Hungarian / Magyar + * + * LCD Menu Messages. See also https://marlinfw.org/docs/development/lcd_language.html + * Hungarian translation by AntoszHUN. I am constantly improving and updating the translation. + * Translation last updated: 21/03/2021 - 21:00 * * LCD Menü Üzenetek. Lásd még https://marlinfw.org/docs/development/lcd_language.html - * Marlin 2.0.x bugfix Magyar fordítása. A fordítást folyamatosan javítom és frissítem. - * A Magyar fordítást készítette: AntoszHUN - * A Fordítás utolsó frissítése: 2021.03.06. - 08:00 + * A Magyar fordítást készítette: AntoszHUN. A fordítást folyamatosan javítom és frissítem. + * A Fordítás utolsó frissítése: 2021.03.21. - 21:00 */ namespace Language_hu { @@ -45,7 +48,7 @@ namespace Language_hu { PROGMEM Language_Str MSG_MEDIA_INSERTED = _UxGT("Tároló behelyezve"); PROGMEM Language_Str MSG_MEDIA_REMOVED = _UxGT("Tároló eltávolítva"); PROGMEM Language_Str MSG_MEDIA_WAITING = _UxGT("Várakozás a tárolóra"); - PROGMEM Language_Str MSG_SD_INIT_FAIL = _UxGT("SD-Kártya hiba"); + PROGMEM Language_Str MSG_SD_INIT_FAIL = _UxGT("SD-kártya hiba"); PROGMEM Language_Str MSG_MEDIA_READ_ERROR = _UxGT("Tároló olvasási hiba"); PROGMEM Language_Str MSG_MEDIA_USB_REMOVED = _UxGT("USB eltávolítva"); PROGMEM Language_Str MSG_MEDIA_USB_FAILED = _UxGT("USB eszköz hiba"); @@ -59,15 +62,15 @@ namespace Language_hu { PROGMEM Language_Str MSG_DISABLE_STEPPERS = _UxGT("Motorok kikapcsolása"); PROGMEM Language_Str MSG_DEBUG_MENU = _UxGT("Hiba Menü"); PROGMEM Language_Str MSG_PROGRESS_BAR_TEST = _UxGT("Haladás sáv teszt"); - PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("X-Y-Z Auto kezdöpont"); - PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("X Kezdöpont"); - PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Y Kezdöpont"); - PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Z Kezdöpont"); - PROGMEM Language_Str MSG_AUTO_Z_ALIGN = _UxGT("Auto Z-Igazítás"); + PROGMEM Language_Str MSG_AUTO_HOME = _UxGT("X-Y-Z auto kezdöpont"); + PROGMEM Language_Str MSG_AUTO_HOME_X = _UxGT("X kezdöpont"); + PROGMEM Language_Str MSG_AUTO_HOME_Y = _UxGT("Y kezdöpont"); + PROGMEM Language_Str MSG_AUTO_HOME_Z = _UxGT("Z kezdöpont"); + PROGMEM Language_Str MSG_AUTO_Z_ALIGN = _UxGT("Auto Z-igazítás"); PROGMEM Language_Str MSG_ITERATION = _UxGT("G34 Ismétlés: %i"); PROGMEM Language_Str MSG_DECREASING_ACCURACY = _UxGT("Pontosság csökken!"); PROGMEM Language_Str MSG_ACCURACY_ACHIEVED = _UxGT("Pontosság elérve"); - PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("X-Y-Z Kezdöpont"); + PROGMEM Language_Str MSG_LEVEL_BED_HOMING = _UxGT("X-Y-Z kezdöpont"); PROGMEM Language_Str MSG_LEVEL_BED_WAITING = _UxGT("Kattints a kezdéshez."); PROGMEM Language_Str MSG_LEVEL_BED_NEXT_POINT = _UxGT("Következö pont"); PROGMEM Language_Str MSG_LEVEL_BED_DONE = _UxGT("Szintezés kész!"); @@ -106,7 +109,7 @@ namespace Language_hu { PROGMEM Language_Str MSG_SPINDLE_POWER = _UxGT("Orsó telj."); PROGMEM Language_Str MSG_LASER_TOGGLE = _UxGT("Lézer váltás"); PROGMEM Language_Str MSG_LASER_PULSE_MS = _UxGT("Impulzus teszt ms"); - PROGMEM Language_Str MSG_LASER_FIRE_PULSE = _UxGT("Tűz impulzus"); + PROGMEM Language_Str MSG_LASER_FIRE_PULSE = _UxGT("Tüz impulzus"); PROGMEM Language_Str MSG_SPINDLE_TOGGLE = _UxGT("Orsóváltás"); PROGMEM Language_Str MSG_SPINDLE_FORWARD = _UxGT("Orsó előre"); PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("Orsó hátra"); @@ -120,7 +123,7 @@ namespace Language_hu { PROGMEM Language_Str MSG_LEVEL_BED = _UxGT("Ágy szintezése"); PROGMEM Language_Str MSG_LEVEL_CORNERS = _UxGT("Sarok szint"); PROGMEM Language_Str MSG_LEVEL_CORNERS_RAISE = _UxGT("Ágy emelése a szonda váltásig"); - PROGMEM Language_Str MSG_LEVEL_CORNERS_IN_RANGE = _UxGT("Minden sarok tolerancián belül. Szint jó"); + PROGMEM Language_Str MSG_LEVEL_CORNERS_IN_RANGE = _UxGT("Minden sarok tolerancián belül. Szint jó."); PROGMEM Language_Str MSG_LEVEL_CORNERS_GOOD_POINTS = _UxGT("Jó pontok: "); PROGMEM Language_Str MSG_LEVEL_CORNERS_LAST_Z = _UxGT("Utolsó Z: "); PROGMEM Language_Str MSG_NEXT_CORNER = _UxGT("Következö sarok"); @@ -130,24 +133,24 @@ namespace Language_hu { PROGMEM Language_Str MSG_PROBING_MESH = _UxGT("Próbapont"); PROGMEM Language_Str MSG_MESH_X = _UxGT("Index X"); PROGMEM Language_Str MSG_MESH_Y = _UxGT("Index Y"); - PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Z Érték"); + PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Z érték"); PROGMEM Language_Str MSG_USER_MENU = _UxGT("Egyéni parancs"); - PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 Probe teszt"); + PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 Szonda teszt"); PROGMEM Language_Str MSG_M48_POINT = _UxGT("M48 Pont"); PROGMEM Language_Str MSG_M48_OUT_OF_BOUNDS = _UxGT("Szonda határon kívül"); PROGMEM Language_Str MSG_M48_DEVIATION = _UxGT("Eltérés"); - PROGMEM Language_Str MSG_IDEX_MENU = _UxGT("IDEX Mód"); + PROGMEM Language_Str MSG_IDEX_MENU = _UxGT("IDEX mód"); PROGMEM Language_Str MSG_OFFSETS_MENU = _UxGT("Eszköz eltolás"); - PROGMEM Language_Str MSG_IDEX_MODE_AUTOPARK = _UxGT("Auto-Parkolás"); + PROGMEM Language_Str MSG_IDEX_MODE_AUTOPARK = _UxGT("Automata parkolás"); PROGMEM Language_Str MSG_IDEX_MODE_DUPLICATE = _UxGT("Duplikálás"); PROGMEM Language_Str MSG_IDEX_MODE_MIRRORED_COPY = _UxGT("Tükrözött másolás"); PROGMEM Language_Str MSG_IDEX_MODE_FULL_CTRL = _UxGT("Teljes felügyelet"); - PROGMEM Language_Str MSG_IDEX_DUPE_GAP = _UxGT("X-Hézag másolása"); - PROGMEM Language_Str MSG_HOTEND_OFFSET_X = _UxGT("2. fúvóka X"); - PROGMEM Language_Str MSG_HOTEND_OFFSET_Y = _UxGT("2. fúvóka Y"); - PROGMEM Language_Str MSG_HOTEND_OFFSET_Z = _UxGT("2. fúvóka Z"); + PROGMEM Language_Str MSG_IDEX_DUPE_GAP = _UxGT("X-hézag másolása"); + PROGMEM Language_Str MSG_HOTEND_OFFSET_X = _UxGT("2. fej X"); + PROGMEM Language_Str MSG_HOTEND_OFFSET_Y = _UxGT("2. fej Y"); + PROGMEM Language_Str MSG_HOTEND_OFFSET_Z = _UxGT("2. fej Z"); PROGMEM Language_Str MSG_UBL_DOING_G29 = _UxGT("Szintezz! G29"); - PROGMEM Language_Str MSG_UBL_TOOLS = _UxGT("UBL Eszköz"); + PROGMEM Language_Str MSG_UBL_TOOLS = _UxGT("UBL eszköz"); PROGMEM Language_Str MSG_UBL_LEVEL_BED = _UxGT("Egységes ágy szint"); PROGMEM Language_Str MSG_LCD_TILTING_MESH = _UxGT("Döntési pont"); PROGMEM Language_Str MSG_UBL_MANUAL_MESH = _UxGT("Kézi háló építés"); @@ -155,12 +158,12 @@ namespace Language_hu { PROGMEM Language_Str MSG_UBL_BC_INSERT2 = _UxGT("Mérés"); PROGMEM Language_Str MSG_UBL_BC_REMOVE = _UxGT("Üres ágyat mérj"); PROGMEM Language_Str MSG_UBL_MOVING_TO_NEXT = _UxGT("Továbblépés"); - PROGMEM Language_Str MSG_UBL_ACTIVATE_MESH = _UxGT("UBL Aktívál"); - PROGMEM Language_Str MSG_UBL_DEACTIVATE_MESH = _UxGT("UBL Deaktívál"); + PROGMEM Language_Str MSG_UBL_ACTIVATE_MESH = _UxGT("UBL aktívál"); + PROGMEM Language_Str MSG_UBL_DEACTIVATE_MESH = _UxGT("UBL deaktívál"); PROGMEM Language_Str MSG_UBL_SET_TEMP_BED = _UxGT("Ágy höfok"); PROGMEM Language_Str MSG_UBL_BED_TEMP_CUSTOM = _UxGT("Ágy höfok"); - PROGMEM Language_Str MSG_UBL_SET_TEMP_HOTEND = _UxGT("Fúvóka höfok"); - PROGMEM Language_Str MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Fúvóka höfok"); + PROGMEM Language_Str MSG_UBL_SET_TEMP_HOTEND = _UxGT("Fej höfok"); + PROGMEM Language_Str MSG_UBL_HOTEND_TEMP_CUSTOM = _UxGT("Fej höfok"); PROGMEM Language_Str MSG_UBL_MESH_EDIT = _UxGT("Háló szerkesztés"); PROGMEM Language_Str MSG_UBL_EDIT_CUSTOM_MESH = _UxGT("Egyéni háló szerkesztés"); PROGMEM Language_Str MSG_UBL_FINE_TUNE_MESH = _UxGT("Finomított háló"); @@ -174,8 +177,8 @@ namespace Language_hu { PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_MENU = _UxGT("Háló elfogadás"); PROGMEM Language_Str MSG_UBL_VALIDATE_MESH_M = _UxGT("Háló elfogadás ($)"); PROGMEM Language_Str MSG_UBL_VALIDATE_CUSTOM_MESH = _UxGT("Valódi háló elfogadása"); - PROGMEM Language_Str MSG_G26_HEATING_BED = _UxGT("G26 Ágy fűtés"); - PROGMEM Language_Str MSG_G26_HEATING_NOZZLE = _UxGT("G26 Fúvóka fűtés"); + PROGMEM Language_Str MSG_G26_HEATING_BED = _UxGT("G26 Ágy fütés"); + PROGMEM Language_Str MSG_G26_HEATING_NOZZLE = _UxGT("G26 Fej fütés"); PROGMEM Language_Str MSG_G26_MANUAL_PRIME = _UxGT("Kézi alapozás..."); PROGMEM Language_Str MSG_G26_FIXED_LENGTH = _UxGT("Fix hosszúságú alap"); PROGMEM Language_Str MSG_G26_PRIME_DONE = _UxGT("Alapozás kész"); @@ -192,7 +195,7 @@ namespace Language_hu { PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_HOST = _UxGT("Host kimenet"); PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_CSV = _UxGT("CSV kimenet"); PROGMEM Language_Str MSG_UBL_OUTPUT_MAP_BACKUP = _UxGT("Nyomtató bizt.mentés"); - PROGMEM Language_Str MSG_UBL_INFO_UBL = _UxGT("UBL Infó kimenet"); + PROGMEM Language_Str MSG_UBL_INFO_UBL = _UxGT("UBL infó kimenet"); PROGMEM Language_Str MSG_UBL_FILLIN_AMOUNT = _UxGT("Kitöltési költség"); PROGMEM Language_Str MSG_UBL_MANUAL_FILLIN = _UxGT("Kézi kitöltés"); PROGMEM Language_Str MSG_UBL_SMART_FILLIN = _UxGT("Okos kitöltés"); @@ -208,10 +211,10 @@ namespace Language_hu { PROGMEM Language_Str MSG_MESH_LOADED = _UxGT("M117 Háló %i betöltve"); PROGMEM Language_Str MSG_MESH_SAVED = _UxGT("M117 Háló %i mentve"); PROGMEM Language_Str MSG_UBL_NO_STORAGE = _UxGT("Nincs tároló"); - PROGMEM Language_Str MSG_UBL_SAVE_ERROR = _UxGT("Hiba: UBL Mentés"); - PROGMEM Language_Str MSG_UBL_RESTORE_ERROR = _UxGT("Hiba: UBL Visszaáll"); - PROGMEM Language_Str MSG_UBL_Z_OFFSET = _UxGT("Z-Eltolás: "); - PROGMEM Language_Str MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Z-Eltolás leállítva"); + PROGMEM Language_Str MSG_UBL_SAVE_ERROR = _UxGT("Hiba: UBL mentés"); + PROGMEM Language_Str MSG_UBL_RESTORE_ERROR = _UxGT("Hiba: UBL visszaáll."); + PROGMEM Language_Str MSG_UBL_Z_OFFSET = _UxGT("Z-eltolás: "); + PROGMEM Language_Str MSG_UBL_Z_OFFSET_STOPPED = _UxGT("Z-eltolás leállítva"); PROGMEM Language_Str MSG_UBL_STEP_BY_STEP_MENU = _UxGT("Lépésröl lépésre UBL"); PROGMEM Language_Str MSG_UBL_1_BUILD_COLD_MESH = _UxGT("1. Hideg háló készítés"); PROGMEM Language_Str MSG_UBL_2_SMART_FILLIN = _UxGT("2. Inteligens kitöltés"); @@ -221,7 +224,7 @@ namespace Language_hu { PROGMEM Language_Str MSG_UBL_6_FINE_TUNE_ALL = _UxGT("6. Minden finomítása"); PROGMEM Language_Str MSG_UBL_7_SAVE_MESH = _UxGT("7. Ágy háló mentése"); - PROGMEM Language_Str MSG_LED_CONTROL = _UxGT("LED Vezérlés"); + PROGMEM Language_Str MSG_LED_CONTROL = _UxGT("LED vezérlés"); PROGMEM Language_Str MSG_LEDS = _UxGT("Világítás"); PROGMEM Language_Str MSG_LED_PRESETS = _UxGT("Beállított színek"); PROGMEM Language_Str MSG_SET_LEDS_RED = _UxGT("Piros"); @@ -235,7 +238,7 @@ namespace Language_hu { PROGMEM Language_Str MSG_SET_LEDS_DEFAULT = _UxGT("Alapérték"); PROGMEM Language_Str MSG_LED_CHANNEL_N = _UxGT("Csatorna ="); PROGMEM Language_Str MSG_LEDS2 = _UxGT("LED-ek #2"); - PROGMEM Language_Str MSG_NEO2_PRESETS = _UxGT("Fény #2 Megadott"); + PROGMEM Language_Str MSG_NEO2_PRESETS = _UxGT("Fény #2 megadott"); PROGMEM Language_Str MSG_NEO2_BRIGHTNESS = _UxGT("Fényerő"); PROGMEM Language_Str MSG_CUSTOM_LEDS = _UxGT("Egyéni szín"); PROGMEM Language_Str MSG_INTENSITY_R = _UxGT("Piros intenzitás"); @@ -245,13 +248,13 @@ namespace Language_hu { PROGMEM Language_Str MSG_LED_BRIGHTNESS = _UxGT("Fényerö"); PROGMEM Language_Str MSG_MOVING = _UxGT("Mozgás..."); - PROGMEM Language_Str MSG_FREE_XY = _UxGT("XY Szabad"); - PROGMEM Language_Str MSG_MOVE_X = _UxGT("X Mozgás"); - PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Y Mozgás"); - PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Z Mozgás"); + PROGMEM Language_Str MSG_FREE_XY = _UxGT("XY szabad"); + PROGMEM Language_Str MSG_MOVE_X = _UxGT("X mozgás"); + PROGMEM Language_Str MSG_MOVE_Y = _UxGT("Y mozgás"); + PROGMEM Language_Str MSG_MOVE_Z = _UxGT("Z mozgás"); PROGMEM Language_Str MSG_MOVE_E = _UxGT("Adagoló"); PROGMEM Language_Str MSG_MOVE_EN = _UxGT("Adagoló *"); - PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("A fúvóka túl hideg"); + PROGMEM Language_Str MSG_HOTEND_TOO_COLD = _UxGT("A fej túl hideg"); PROGMEM Language_Str MSG_MOVE_N_MM = _UxGT("Mozgás %smm"); PROGMEM Language_Str MSG_MOVE_01MM = _UxGT("Mozgás 0.1mm"); PROGMEM Language_Str MSG_MOVE_1MM = _UxGT("Mozgás 1mm"); @@ -261,18 +264,21 @@ namespace Language_hu { PROGMEM Language_Str MSG_MOVE_01IN = _UxGT("Mozgás 0.1mm"); PROGMEM Language_Str MSG_SPEED = _UxGT("Sebesség"); PROGMEM Language_Str MSG_BED_Z = _UxGT("Z ágy"); - PROGMEM Language_Str MSG_NOZZLE = _UxGT("Fúvóka"); - PROGMEM Language_Str MSG_NOZZLE_N = _UxGT("Fúvóka ~"); + PROGMEM Language_Str MSG_NOZZLE = _UxGT("Fej"); + PROGMEM Language_Str MSG_NOZZLE_N = _UxGT("Fej ~"); PROGMEM Language_Str MSG_NOZZLE_PARKED = _UxGT("Fej parkolva"); PROGMEM Language_Str MSG_NOZZLE_STANDBY = _UxGT("Fej készenlétbe"); PROGMEM Language_Str MSG_BED = _UxGT("Ágy"); PROGMEM Language_Str MSG_CHAMBER = _UxGT("Burkolat"); + PROGMEM Language_Str MSG_COOLER = _UxGT("Lézer hütövíz"); + PROGMEM Language_Str MSG_COOLER_TOGGLE = _UxGT("Hütö kapcsoló"); + PROGMEM Language_Str MSG_LASER = _UxGT("Lézer"); PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Hütés sebesség"); PROGMEM Language_Str MSG_FAN_SPEED_N = _UxGT("Hütés sebesség ="); PROGMEM Language_Str MSG_STORED_FAN_N = _UxGT("Tárolt hütés ="); PROGMEM Language_Str MSG_EXTRA_FAN_SPEED = _UxGT("Extra hütés sebesség"); PROGMEM Language_Str MSG_EXTRA_FAN_SPEED_N = _UxGT("Extra hütés sebesség ="); - PROGMEM Language_Str MSG_CONTROLLER_FAN = _UxGT("Hűtésvezérlés"); + PROGMEM Language_Str MSG_CONTROLLER_FAN = _UxGT("Hütésvezérlés"); PROGMEM Language_Str MSG_CONTROLLER_FAN_IDLE_SPEED = _UxGT("Alapjárat"); PROGMEM Language_Str MSG_CONTROLLER_FAN_AUTO_ON = _UxGT("Automatikus mód"); PROGMEM Language_Str MSG_CONTROLLER_FAN_SPEED = _UxGT("Aktív sebesség"); @@ -286,9 +292,9 @@ namespace Language_hu { PROGMEM Language_Str MSG_AUTOTEMP = _UxGT("Automata höfok"); PROGMEM Language_Str MSG_LCD_ON = _UxGT("Be"); PROGMEM Language_Str MSG_LCD_OFF = _UxGT("Ki"); - PROGMEM Language_Str MSG_PID_AUTOTUNE = _UxGT("PID Hangolás"); - PROGMEM Language_Str MSG_PID_AUTOTUNE_E = _UxGT("PID Hangolás *"); - PROGMEM Language_Str MSG_PID_AUTOTUNE_DONE = _UxGT("PID Hangolás kész"); + PROGMEM Language_Str MSG_PID_AUTOTUNE = _UxGT("PID hangolás"); + PROGMEM Language_Str MSG_PID_AUTOTUNE_E = _UxGT("PID hangolás *"); + PROGMEM Language_Str MSG_PID_AUTOTUNE_DONE = _UxGT("PID hangolás kész"); PROGMEM Language_Str MSG_PID_BAD_EXTRUDER_NUM = _UxGT("Hangolási hiba. Rossz adagoló."); PROGMEM Language_Str MSG_PID_TEMP_TOO_HIGH = _UxGT("Hangolási hiba. Magas hömérséklet."); PROGMEM Language_Str MSG_PID_TIMEOUT = _UxGT("Hangolási hiba! Idötúllépés."); @@ -296,10 +302,10 @@ namespace Language_hu { PROGMEM Language_Str MSG_SELECT_E = _UxGT("Kiválaszt *"); PROGMEM Language_Str MSG_ACC = _UxGT("Gyorsítás"); PROGMEM Language_Str MSG_JERK = _UxGT("Rántás"); - PROGMEM Language_Str MSG_VA_JERK = LCD_STR_A _UxGT(" Ránt. Seb."); - PROGMEM Language_Str MSG_VB_JERK = LCD_STR_B _UxGT(" Ránt. Seb."); - PROGMEM Language_Str MSG_VC_JERK = LCD_STR_C _UxGT(" Ránt. Seb."); - PROGMEM Language_Str MSG_VE_JERK = _UxGT("E Ránt. Seb."); + PROGMEM Language_Str MSG_VA_JERK = LCD_STR_A _UxGT(" Ránt. seb."); + PROGMEM Language_Str MSG_VB_JERK = LCD_STR_B _UxGT(" Ránt. seb."); + PROGMEM Language_Str MSG_VC_JERK = LCD_STR_C _UxGT(" Ránt. seb."); + PROGMEM Language_Str MSG_VE_JERK = _UxGT("E ránt. seb."); PROGMEM Language_Str MSG_JUNCTION_DEVIATION = _UxGT("Csomopont eltérés"); PROGMEM Language_Str MSG_VELOCITY = _UxGT("Sebesség"); PROGMEM Language_Str MSG_VMAX_A = _UxGT("Max sebesség ") LCD_STR_A; @@ -331,25 +337,25 @@ namespace Language_hu { PROGMEM Language_Str MSG_VOLUMETRIC_ENABLED = _UxGT("E mm³-ben"); PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT = _UxGT("E Limit mm³-ben"); PROGMEM Language_Str MSG_VOLUMETRIC_LIMIT_E = _UxGT("E Limit *"); - PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Szál. Átm."); - PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Szál. Átm. *"); + PROGMEM Language_Str MSG_FILAMENT_DIAM = _UxGT("Szál. átm."); + PROGMEM Language_Str MSG_FILAMENT_DIAM_E = _UxGT("Szál. átm. *"); PROGMEM Language_Str MSG_FILAMENT_UNLOAD = _UxGT("Kiadás mm"); PROGMEM Language_Str MSG_FILAMENT_LOAD = _UxGT("Betöltés mm"); PROGMEM Language_Str MSG_ADVANCE_K = _UxGT("Haladó K"); PROGMEM Language_Str MSG_ADVANCE_K_E = _UxGT("Haladó K *"); - PROGMEM Language_Str MSG_CONTRAST = _UxGT("LCD Kontraszt"); + PROGMEM Language_Str MSG_CONTRAST = _UxGT("LCD kontraszt"); PROGMEM Language_Str MSG_STORE_EEPROM = _UxGT("Mentés EEPROM"); PROGMEM Language_Str MSG_LOAD_EEPROM = _UxGT("Betöltés EEPROM"); PROGMEM Language_Str MSG_RESTORE_DEFAULTS = _UxGT("Alapértelmezett"); - PROGMEM Language_Str MSG_INIT_EEPROM = _UxGT("EEPROM Inicializálás"); + PROGMEM Language_Str MSG_INIT_EEPROM = _UxGT("EEPROM inicializálás"); PROGMEM Language_Str MSG_ERR_EEPROM_CRC = _UxGT("Hiba: EEPROM CRC"); - PROGMEM Language_Str MSG_ERR_EEPROM_INDEX = _UxGT("Hiba: EEPROM Index"); - PROGMEM Language_Str MSG_ERR_EEPROM_VERSION = _UxGT("Hiba: EEPROM Verzió"); + PROGMEM Language_Str MSG_ERR_EEPROM_INDEX = _UxGT("Hiba: EEPROM index"); + PROGMEM Language_Str MSG_ERR_EEPROM_VERSION = _UxGT("Hiba: EEPROM verzió"); PROGMEM Language_Str MSG_SETTINGS_STORED = _UxGT("Beállítások mentve"); PROGMEM Language_Str MSG_MEDIA_UPDATE = _UxGT("Tároló frissítés"); PROGMEM Language_Str MSG_RESET_PRINTER = _UxGT("Nyomtató újraindítása"); PROGMEM Language_Str MSG_REFRESH = LCD_STR_REFRESH _UxGT("Frissítés"); - PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT(""); + PROGMEM Language_Str MSG_INFO_SCREEN = _UxGT(""); PROGMEM Language_Str MSG_PREPARE = _UxGT("Vezérlés"); PROGMEM Language_Str MSG_TUNE = _UxGT("Hangolás"); PROGMEM Language_Str MSG_POWER_MONITOR = _UxGT("Teljesítménymonitor"); @@ -390,24 +396,24 @@ namespace Language_hu { PROGMEM Language_Str MSG_KILLED = _UxGT("HALOTT! "); PROGMEM Language_Str MSG_STOPPED = _UxGT("MEGÁLLT! "); PROGMEM Language_Str MSG_CONTROL_RETRACT = _UxGT("Visszahúzás mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Visszahúzás Cs. mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_SWAP = _UxGT("Visszahúzás cs. mm"); PROGMEM Language_Str MSG_CONTROL_RETRACTF = _UxGT("Viszahúzás"); PROGMEM Language_Str MSG_CONTROL_RETRACT_ZHOP = _UxGT("Ugrás mm"); PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER = _UxGT("Visszah.helyre mm"); - PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Csere.Visszah.helyre mm"); + PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAP = _UxGT("Csere.visszah.helyre mm"); PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVERF = _UxGT("Visszahúzás V"); PROGMEM Language_Str MSG_CONTROL_RETRACT_RECOVER_SWAPF = _UxGT("S Vissza.h V"); - PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("Auto Visszah."); + PROGMEM Language_Str MSG_AUTORETRACT = _UxGT("Auto visszah."); PROGMEM Language_Str MSG_FILAMENT_SWAP_LENGTH = _UxGT("Visszahúzás távolság"); PROGMEM Language_Str MSG_FILAMENT_SWAP_EXTRA = _UxGT("Extra csere"); PROGMEM Language_Str MSG_FILAMENT_PURGE_LENGTH = _UxGT("Tisztítási távolság"); PROGMEM Language_Str MSG_TOOL_CHANGE = _UxGT("Szerszámcsere"); - PROGMEM Language_Str MSG_TOOL_CHANGE_ZLIFT = _UxGT("Z Emelés"); + PROGMEM Language_Str MSG_TOOL_CHANGE_ZLIFT = _UxGT("Z emelés"); PROGMEM Language_Str MSG_SINGLENOZZLE_PRIME_SPEED = _UxGT("Fösebesség"); - PROGMEM Language_Str MSG_SINGLENOZZLE_RETRACT_SPEED = _UxGT("Visszah. Sebesség"); + PROGMEM Language_Str MSG_SINGLENOZZLE_RETRACT_SPEED = _UxGT("Visszah. sebesség"); PROGMEM Language_Str MSG_FILAMENT_PARK_ENABLED = _UxGT("Fej parkolás"); PROGMEM Language_Str MSG_SINGLENOZZLE_UNRETRACT_SPEED = _UxGT("Visszav.visszah. sebesség"); - PROGMEM Language_Str MSG_SINGLENOZZLE_FAN_SPEED = _UxGT("FAN Sebesség"); + PROGMEM Language_Str MSG_SINGLENOZZLE_FAN_SPEED = _UxGT("FAN sebesség"); PROGMEM Language_Str MSG_SINGLENOZZLE_FAN_TIME = _UxGT("FAN idö"); PROGMEM Language_Str MSG_TOOL_MIGRATION_ON = _UxGT("Auto BE"); PROGMEM Language_Str MSG_TOOL_MIGRATION_OFF = _UxGT("Auto KI"); @@ -415,8 +421,8 @@ namespace Language_hu { PROGMEM Language_Str MSG_TOOL_MIGRATION_AUTO = _UxGT("Automata csere"); PROGMEM Language_Str MSG_TOOL_MIGRATION_END = _UxGT("Utolsó adagoló"); PROGMEM Language_Str MSG_TOOL_MIGRATION_SWAP = _UxGT("Csere *"); - PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Szál csere"); - PROGMEM Language_Str MSG_FILAMENTCHANGE_E = _UxGT("Szál csere *"); + PROGMEM Language_Str MSG_FILAMENTCHANGE = _UxGT("Szálcsere"); + PROGMEM Language_Str MSG_FILAMENTCHANGE_E = _UxGT("Szálcsere *"); PROGMEM Language_Str MSG_FILAMENTLOAD = _UxGT("Szál betöltés"); PROGMEM Language_Str MSG_FILAMENTLOAD_E = _UxGT("Szál betöltés *"); PROGMEM Language_Str MSG_FILAMENTUNLOAD = _UxGT("Szál eltávolítás"); @@ -436,23 +442,23 @@ namespace Language_hu { PROGMEM Language_Str MSG_BLTOUCH_5V_MODE = _UxGT("5V-Mód"); PROGMEM Language_Str MSG_BLTOUCH_OD_MODE = _UxGT("OD-Mód"); PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE = _UxGT("Módok"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_5V = _UxGT("BLTouch 5V Mód"); - PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_OD = _UxGT("BLTouch OD Mód"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_5V = _UxGT("BLTouch 5V mód"); + PROGMEM Language_Str MSG_BLTOUCH_MODE_STORE_OD = _UxGT("BLTouch OD mód"); PROGMEM Language_Str MSG_BLTOUCH_MODE_ECHO = _UxGT("Jelentés"); PROGMEM Language_Str MSG_BLTOUCH_MODE_CHANGE = _UxGT("VESZÉLY: A rossz beállítások kárt okozhatnak! Biztos továbblép?"); PROGMEM Language_Str MSG_TOUCHMI_PROBE = _UxGT("TouchMI"); PROGMEM Language_Str MSG_TOUCHMI_INIT = _UxGT("Kezd TouchMI"); - PROGMEM Language_Str MSG_TOUCHMI_ZTEST = _UxGT("Z Eltolás teszt"); + PROGMEM Language_Str MSG_TOUCHMI_ZTEST = _UxGT("Z eltolás teszt"); PROGMEM Language_Str MSG_TOUCHMI_SAVE = _UxGT("Mentés"); PROGMEM Language_Str MSG_MANUAL_DEPLOY_TOUCHMI = _UxGT("TouchMI használ"); - PROGMEM Language_Str MSG_MANUAL_DEPLOY = _UxGT("Z-Probe használ"); - PROGMEM Language_Str MSG_MANUAL_STOW = _UxGT("Z-Probe elhelyezés"); + PROGMEM Language_Str MSG_MANUAL_DEPLOY = _UxGT("Z-Szonda telepítés"); + PROGMEM Language_Str MSG_MANUAL_STOW = _UxGT("Z-Szonda elhelyezés"); PROGMEM Language_Str MSG_HOME_FIRST = _UxGT("Elsö %s%s%s kell"); PROGMEM Language_Str MSG_ZPROBE_OFFSETS = _UxGT("Szonda eltolások"); - PROGMEM Language_Str MSG_ZPROBE_XOFFSET = _UxGT("X Szonda eltolás"); - PROGMEM Language_Str MSG_ZPROBE_YOFFSET = _UxGT("Y Szonda eltolás"); - PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Z Szonda eltolás"); - PROGMEM Language_Str MSG_MOVE_NOZZLE_TO_BED = _UxGT("Fúvóka az ágyhoz"); + PROGMEM Language_Str MSG_ZPROBE_XOFFSET = _UxGT("X szonda eltolás"); + PROGMEM Language_Str MSG_ZPROBE_YOFFSET = _UxGT("Y szonda eltolás"); + PROGMEM Language_Str MSG_ZPROBE_ZOFFSET = _UxGT("Z szonda eltolás"); + PROGMEM Language_Str MSG_MOVE_NOZZLE_TO_BED = _UxGT("Fej az ágyhoz"); PROGMEM Language_Str MSG_BABYSTEP_X = _UxGT("Mikrolépés X"); PROGMEM Language_Str MSG_BABYSTEP_Y = _UxGT("Mikrolépés Y"); PROGMEM Language_Str MSG_BABYSTEP_Z = _UxGT("Mikrolépés Z"); @@ -463,9 +469,11 @@ namespace Language_hu { PROGMEM Language_Str MSG_THERMAL_RUNAWAY = _UxGT("FÜTÉS KIMARADÁS"); PROGMEM Language_Str MSG_THERMAL_RUNAWAY_BED = _UxGT("ÁGY FÜTÉS KIMARADÁS"); PROGMEM Language_Str MSG_THERMAL_RUNAWAY_CHAMBER = _UxGT("KAMRA FÜTÉS KIMARADÁS"); - PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Hiba: MAX Höfok"); - PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Hiba: MIN Höfok"); - PROGMEM Language_Str MSG_HALTED = _UxGT("A NYOMTATÓ LEFAGYOTT"); + PROGMEM Language_Str MSG_THERMAL_RUNAWAY_COOLER = _UxGT("Hütés kimaradás"); + PROGMEM Language_Str MSG_COOLING_FAILED = _UxGT("Hütés sikertelen"); + PROGMEM Language_Str MSG_ERR_MAXTEMP = _UxGT("Hiba: MAX höfok"); + PROGMEM Language_Str MSG_ERR_MINTEMP = _UxGT("Hiba: MIN höfok"); + PROGMEM Language_Str MSG_HALTED = _UxGT("A NYOMTATÓ LEÁLLT"); PROGMEM Language_Str MSG_PLEASE_RESET = _UxGT("Indítsd újra!"); PROGMEM Language_Str MSG_SHORT_DAY = _UxGT("n"); // Csak egy karakter PROGMEM Language_Str MSG_SHORT_HOUR = _UxGT("ó"); // Csak egy karakter @@ -478,15 +486,16 @@ namespace Language_hu { PROGMEM Language_Str MSG_PROBE_COOLING = _UxGT("Szonda hütése..."); PROGMEM Language_Str MSG_CHAMBER_HEATING = _UxGT("Kamra fütés..."); PROGMEM Language_Str MSG_CHAMBER_COOLING = _UxGT("Kamra hütés..."); + PROGMEM Language_Str MSG_LASER_COOLING = _UxGT("Lézer hütés..."); PROGMEM Language_Str MSG_DELTA_CALIBRATE = _UxGT("Delta kalibráció"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("X Kalibrálás"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Y Kalibrálás"); - PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Z Kalibrálás"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_X = _UxGT("X kalibrálás"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Y = _UxGT("Y kalibrálás"); + PROGMEM Language_Str MSG_DELTA_CALIBRATE_Z = _UxGT("Z kalibrálás"); PROGMEM Language_Str MSG_DELTA_CALIBRATE_CENTER = _UxGT("Központ kalibrálás"); PROGMEM Language_Str MSG_DELTA_SETTINGS = _UxGT("Delta beállítások"); PROGMEM Language_Str MSG_DELTA_AUTO_CALIBRATE = _UxGT("Auto kalibráció"); PROGMEM Language_Str MSG_DELTA_HEIGHT_CALIBRATE = _UxGT("Delta magasság kalib."); - PROGMEM Language_Str MSG_DELTA_Z_OFFSET_CALIBRATE = _UxGT("Z Eltolás"); + PROGMEM Language_Str MSG_DELTA_Z_OFFSET_CALIBRATE = _UxGT("Z eltolás"); PROGMEM Language_Str MSG_DELTA_DIAG_ROD = _UxGT("Diag rúd"); PROGMEM Language_Str MSG_DELTA_HEIGHT = _UxGT("Magasság"); PROGMEM Language_Str MSG_DELTA_RADIUS = _UxGT("Sugár"); @@ -505,7 +514,7 @@ namespace Language_hu { PROGMEM Language_Str MSG_INFO_PROTOCOL = _UxGT("Protokol"); PROGMEM Language_Str MSG_INFO_RUNAWAY_OFF = _UxGT("Futáselemzés: KI"); PROGMEM Language_Str MSG_INFO_RUNAWAY_ON = _UxGT("Futáselemzés: BE"); - PROGMEM Language_Str MSG_HOTEND_IDLE_TIMEOUT = _UxGT("Hotend üresjárati idök."); + PROGMEM Language_Str MSG_HOTEND_IDLE_TIMEOUT = _UxGT("Fej üresjárati idök."); PROGMEM Language_Str MSG_CASE_LIGHT = _UxGT("Munkalámpa"); PROGMEM Language_Str MSG_CASE_LIGHT_BRIGHTNESS = _UxGT("Fényerösség"); @@ -529,10 +538,10 @@ namespace Language_hu { PROGMEM Language_Str MSG_INFO_MAX_TEMP = _UxGT("Max höfok"); PROGMEM Language_Str MSG_INFO_PSU = _UxGT("PSU"); PROGMEM Language_Str MSG_DRIVE_STRENGTH = _UxGT("Meghajtási erö"); - PROGMEM Language_Str MSG_DAC_PERCENT_X = _UxGT("X Meghajtó %"); - PROGMEM Language_Str MSG_DAC_PERCENT_Y = _UxGT("Y Meghajtó %"); - PROGMEM Language_Str MSG_DAC_PERCENT_Z = _UxGT("Z Meghajtó %"); - PROGMEM Language_Str MSG_DAC_PERCENT_E = _UxGT("E Meghajtó %"); + PROGMEM Language_Str MSG_DAC_PERCENT_X = _UxGT("X meghajtó %"); + PROGMEM Language_Str MSG_DAC_PERCENT_Y = _UxGT("Y meghajtó %"); + PROGMEM Language_Str MSG_DAC_PERCENT_Z = _UxGT("Z meghajtó %"); + PROGMEM Language_Str MSG_DAC_PERCENT_E = _UxGT("E meghajtó %"); PROGMEM Language_Str MSG_ERROR_TMC = _UxGT("TMC CSATLAKOZÁSI HIBA"); PROGMEM Language_Str MSG_DAC_EEPROM_WRITE = _UxGT("DAC EEPROM írása"); PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEADER = _UxGT("NYOMTATÓSZÁL CSERE"); @@ -542,7 +551,7 @@ namespace Language_hu { PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_HEADER = _UxGT("FOLYTATÁSI OPCIÓ:"); PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_PURGE = _UxGT("Tisztítsd meg"); PROGMEM Language_Str MSG_FILAMENT_CHANGE_OPTION_RESUME = _UxGT("Folytatás"); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Fúvóka: "); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_NOZZLE = _UxGT(" Fej: "); PROGMEM Language_Str MSG_RUNOUT_SENSOR = _UxGT("Túlfutás szenzor"); PROGMEM Language_Str MSG_RUNOUT_DISTANCE_MM = _UxGT("Túlfutás táv. mm"); PROGMEM Language_Str MSG_KILL_HOMING_FAILED = _UxGT("Tájolási hiba"); @@ -550,13 +559,13 @@ namespace Language_hu { PROGMEM Language_Str MSG_MMU2_CHOOSE_FILAMENT_HEADER = _UxGT("SZÁLVÁLASZTÁS"); PROGMEM Language_Str MSG_MMU2_MENU = _UxGT("MMU"); - PROGMEM Language_Str MSG_KILL_MMU2_FIRMWARE = _UxGT("MMU Szoftver feltöltése!"); - PROGMEM Language_Str MSG_MMU2_NOT_RESPONDING = _UxGT("MMU Figyelmeztetés."); + PROGMEM Language_Str MSG_KILL_MMU2_FIRMWARE = _UxGT("MMU szoftver feltöltése!"); + PROGMEM Language_Str MSG_MMU2_NOT_RESPONDING = _UxGT("MMU figyelmeztetés."); PROGMEM Language_Str MSG_MMU2_RESUME = _UxGT("Nyomtatás folytatása"); PROGMEM Language_Str MSG_MMU2_RESUMING = _UxGT("Folytatás..."); PROGMEM Language_Str MSG_MMU2_LOAD_FILAMENT = _UxGT("Szál betöltése"); PROGMEM Language_Str MSG_MMU2_LOAD_ALL = _UxGT("Összes betöltése"); - PROGMEM Language_Str MSG_MMU2_LOAD_TO_NOZZLE = _UxGT("Fúvóka betöltése"); + PROGMEM Language_Str MSG_MMU2_LOAD_TO_NOZZLE = _UxGT("Fej betöltése"); PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT = _UxGT("Szál kiadása"); PROGMEM Language_Str MSG_MMU2_EJECT_FILAMENT_N = _UxGT("Szál kiadása ~"); PROGMEM Language_Str MSG_MMU2_UNLOAD_FILAMENT = _UxGT("Kiadja a szálat"); @@ -565,8 +574,8 @@ namespace Language_hu { PROGMEM Language_Str MSG_MMU2_UNLOADING_FILAMENT = _UxGT("Szál kiadása...."); PROGMEM Language_Str MSG_MMU2_ALL = _UxGT("Mind"); PROGMEM Language_Str MSG_MMU2_FILAMENT_N = _UxGT("Nyomtatószál ~"); - PROGMEM Language_Str MSG_MMU2_RESET = _UxGT("MMU Újraindítás"); - PROGMEM Language_Str MSG_MMU2_RESETTING = _UxGT("MMU Újraindul..."); + PROGMEM Language_Str MSG_MMU2_RESET = _UxGT("MMU újraindítás"); + PROGMEM Language_Str MSG_MMU2_RESETTING = _UxGT("MMU újraindul..."); PROGMEM Language_Str MSG_MMU2_EJECT_RECOVER = _UxGT("Eltávolít, kattint"); PROGMEM Language_Str MSG_MIX = _UxGT("Kever"); @@ -615,10 +624,10 @@ namespace Language_hu { #if LCD_HEIGHT >= 4 PROGMEM Language_Str MSG_ADVANCED_PAUSE_WAITING = _UxGT(MSG_2_LINE("Nyomj gombot", "nyomtatás folytatáshoz")); PROGMEM Language_Str MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Parkolás...")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Várj míg", "szál csere", "indítás")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_3_LINE("Várj míg", "szálcsere", "indítás")); PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_3_LINE("Szál behelyezés", "majd nyomj gombot", "a folytatáshoz")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Nyomj gombot", "a fúvóka fűtéséhez")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Fúvóka fűtése", "Kérlek várj...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_2_LINE("Nyomj gombot", "a fej fütéséhez")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_2_LINE("Fej fütése", "Kérlek várj...")); PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_2_LINE("Várj a", "szál kiadására")); PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_2_LINE("Várj a", "szál betöltésére")); PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_2_LINE("Várj a", "szál tisztításra")); @@ -629,15 +638,15 @@ namespace Language_hu { PROGMEM Language_Str MSG_PAUSE_PRINT_PARKING = _UxGT(MSG_1_LINE("Parkolás...")); PROGMEM Language_Str MSG_FILAMENT_CHANGE_INIT = _UxGT(MSG_1_LINE("Kérlek várj...")); PROGMEM Language_Str MSG_FILAMENT_CHANGE_INSERT = _UxGT(MSG_1_LINE("Behelyez majd katt")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_1_LINE("Katt a fűtéshez")); - PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Fűtés...")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEAT = _UxGT(MSG_1_LINE("Katt a fütéshez")); + PROGMEM Language_Str MSG_FILAMENT_CHANGE_HEATING = _UxGT(MSG_1_LINE("Fütés...")); PROGMEM Language_Str MSG_FILAMENT_CHANGE_UNLOAD = _UxGT(MSG_1_LINE("Kiadás...")); PROGMEM Language_Str MSG_FILAMENT_CHANGE_LOAD = _UxGT(MSG_1_LINE("Betöltés...")); PROGMEM Language_Str MSG_FILAMENT_CHANGE_PURGE = _UxGT(MSG_1_LINE("Tisztítás...")); PROGMEM Language_Str MSG_FILAMENT_CHANGE_CONT_PURGE = _UxGT(MSG_1_LINE("Katt ha kész")); PROGMEM Language_Str MSG_FILAMENT_CHANGE_RESUME = _UxGT(MSG_1_LINE("Folytatás...")); #endif - PROGMEM Language_Str MSG_TMC_DRIVERS = _UxGT("TMC Meghajtók"); + PROGMEM Language_Str MSG_TMC_DRIVERS = _UxGT("TMC meghajtók"); PROGMEM Language_Str MSG_TMC_CURRENT = _UxGT("Meghajtó áram"); PROGMEM Language_Str MSG_TMC_HYBRID_THRS = _UxGT("Hibrid küszöbérték"); PROGMEM Language_Str MSG_TMC_HOMING_THRS = _UxGT("Motoros kezdöpont"); @@ -652,19 +661,19 @@ namespace Language_hu { PROGMEM Language_Str MSG_BACKLASH_CORRECTION = _UxGT("Korrekció"); PROGMEM Language_Str MSG_BACKLASH_SMOOTHING = _UxGT("Simítás"); - PROGMEM Language_Str MSG_LEVEL_X_AXIS = _UxGT("X Tengely szint"); + PROGMEM Language_Str MSG_LEVEL_X_AXIS = _UxGT("X tengely szint"); PROGMEM Language_Str MSG_AUTO_CALIBRATE = _UxGT("Önkalibrálás"); #if ENABLED(TOUCH_UI_FTDI_EVE) - PROGMEM Language_Str MSG_HEATER_TIMEOUT = _UxGT("Tétlenségi idökorlát, a hömérséklet csökkent. Nyomja meg az OK gombot az ismételt felfűtéshez, és újra a folytatáshoz."); + PROGMEM Language_Str MSG_HEATER_TIMEOUT = _UxGT("Tétlenségi idökorlát, a hömérséklet csökkent. Nyomd meg az OK gombot az ismételt felfütéshez, és újra a folytatáshoz."); #else - PROGMEM Language_Str MSG_HEATER_TIMEOUT = _UxGT("Fűtés idökorlátja"); + PROGMEM Language_Str MSG_HEATER_TIMEOUT = _UxGT("Fütés idökorlátja"); #endif - PROGMEM Language_Str MSG_REHEAT = _UxGT("Újrafűt"); - PROGMEM Language_Str MSG_REHEATING = _UxGT("Újrafűtés..."); + PROGMEM Language_Str MSG_REHEAT = _UxGT("Újrafüt"); + PROGMEM Language_Str MSG_REHEATING = _UxGT("Újrafütés..."); - PROGMEM Language_Str MSG_PROBE_WIZARD = _UxGT("Z Szonda varázsló"); - PROGMEM Language_Str MSG_PROBE_WIZARD_PROBING = _UxGT("Z Referencia mérés"); - PROGMEM Language_Str MSG_PROBE_WIZARD_MOVING = _UxGT("Menjen a próba pontra"); + PROGMEM Language_Str MSG_PROBE_WIZARD = _UxGT("Z szonda varázsló"); + PROGMEM Language_Str MSG_PROBE_WIZARD_PROBING = _UxGT("Z referencia mérés"); + PROGMEM Language_Str MSG_PROBE_WIZARD_MOVING = _UxGT("Menj a próba pontra"); PROGMEM Language_Str MSG_SOUND = _UxGT("Hang"); From 2b621eb45d1b904165c414ee1711ad121c0a1c53 Mon Sep 17 00:00:00 2001 From: Sola <42537573+solawc@users.noreply.github.com> Date: Tue, 23 Mar 2021 13:58:52 +0800 Subject: [PATCH 174/253] Fix MKS H43 sensorless homing (#21388) --- Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp | 4 ++-- Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp | 5 ++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp index bfa518446d..78865bbfd6 100644 --- a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp @@ -36,7 +36,7 @@ #include "../../../../marlinui.h" #if ENABLED(HAS_STEALTHCHOP) - #include "../../../../module/stepper/trinamic.h" + #include "../../../../../module/stepper/trinamic.h" #endif #if ENABLED(DGUS_UI_MOVE_DIS_OPTION) @@ -746,9 +746,9 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { // SDCard File listing + VPHELPER(VP_SD_FileSelected, nullptr, ScreenHandler.DGUSLCD_SD_FileSelected, nullptr), #if ENABLED(SDSUPPORT) VPHELPER(VP_SD_ScrollEvent, nullptr, ScreenHandler.DGUSLCD_SD_ScrollFilelist, nullptr), - VPHELPER(VP_SD_FileSelected, nullptr, ScreenHandler.DGUSLCD_SD_FileSelected, nullptr), VPHELPER(VP_SD_FileSelectConfirm, nullptr, ScreenHandler.DGUSLCD_SD_StartPrint, nullptr), VPHELPER_STR(VP_SD_FileName0, nullptr, VP_SD_FileName_LEN, nullptr, ScreenHandler.DGUSLCD_SD_SendFilename), VPHELPER_STR(VP_SD_FileName1, nullptr, VP_SD_FileName_LEN, nullptr, ScreenHandler.DGUSLCD_SD_SendFilename), diff --git a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp index 577171a135..bf2b05dcbf 100644 --- a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp @@ -1246,6 +1246,9 @@ void DGUSScreenHandler::MKS_FilamentLoad(DGUS_VP_Variable &var, void *val_ptr) { uint16_t val_t = swap16(*(uint16_t*)val_ptr); + if (!print_job_timer.isPaused() && !queue.ring_buffer.empty()) + return; + switch (val_t) { case 0: #if HOTENDS >= 1 @@ -1497,7 +1500,7 @@ bool DGUSScreenHandler::loop() { static bool booted = false; if (!booted && ELAPSED(ms, TERN(USE_MKS_GREEN_UI, 1000, BOOTSCREEN_TIMEOUT))) { booted = true; - #if ANY_AXIS_HAS(STEALTHCHOP) + #if USE_SENSORLESS #if AXIS_HAS_STEALTHCHOP(X) tmc_x_step = stepperX.homing_threshold(); #endif From 50a6ffa9528d7d7419855cce631f95a7e19d5d6a Mon Sep 17 00:00:00 2001 From: mihtjel Date: Tue, 23 Mar 2021 07:00:22 +0100 Subject: [PATCH 175/253] Fix macros that call macros crashing (#21383) When macros call macros, the null termination should remain in place until the macro is completed, and only then put back. Otherwise, the macro handler interprets this as setting the macro called to a new value. --- Marlin/src/gcode/gcode.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index 4e324e7892..6290d7a1d5 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -1048,8 +1048,8 @@ void GcodeSuite::process_subcommands_now(char * gcode) { char * const delim = strchr(gcode, '\n'); // Get address of next newline if (delim) *delim = '\0'; // Replace with nul parser.parse(gcode); // Parse the current command - if (delim) *delim = '\n'; // Put back the newline process_parsed_command(true); // Process it + if (delim) *delim = '\n'; // Put back the newline if (!delim) break; // Last command? gcode = delim + 1; // Get the next command } From 22fc59ab5973aa91cc2fed68792dce521cc70c93 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 23 Mar 2021 01:03:32 -0500 Subject: [PATCH 176/253] Minor process_subcommands_now followup --- Marlin/src/gcode/gcode.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index 6290d7a1d5..aa206bfeba 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -1049,8 +1049,8 @@ void GcodeSuite::process_subcommands_now(char * gcode) { if (delim) *delim = '\0'; // Replace with nul parser.parse(gcode); // Parse the current command process_parsed_command(true); // Process it - if (delim) *delim = '\n'; // Put back the newline if (!delim) break; // Last command? + *delim = '\n'; // Put back the newline gcode = delim + 1; // Get the next command } parser.parse(saved_cmd); // Restore the parser state From eee726ec7dfa774677e86d84573e04524eff64be Mon Sep 17 00:00:00 2001 From: Marcio T Date: Tue, 23 Mar 2021 00:45:51 -0600 Subject: [PATCH 177/253] UBL - Hilbert space-filling curve probing sequence (#21387) --- Marlin/Configuration.h | 2 + Marlin/src/feature/bedlevel/ubl/ubl.h | 5 ++ Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp | 58 +++++++++++++++++++-- buildroot/tests/mega2560 | 2 +- 4 files changed, 63 insertions(+), 4 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index ce847c0d65..339dae7702 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -1478,6 +1478,8 @@ #define GRID_MAX_POINTS_X 10 // Don't use more than 15 points per axis, implementation limited. #define GRID_MAX_POINTS_Y GRID_MAX_POINTS_X + //#define UBL_HILBERT_CURVE // Use Hilbert distribution for less travel when probing multiple points + #define UBL_MESH_EDIT_MOVES_Z // Sophisticated users prefer no movement of nozzle #define UBL_SAVE_ACTIVE_ON_M500 // Save the currently active mesh in the current slot on M500 diff --git a/Marlin/src/feature/bedlevel/ubl/ubl.h b/Marlin/src/feature/bedlevel/ubl/ubl.h index d5da43a6a2..0c4667eed8 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl.h +++ b/Marlin/src/feature/bedlevel/ubl/ubl.h @@ -98,6 +98,11 @@ public: static void display_map(const int) _O0; static mesh_index_pair find_closest_mesh_point_of_type(const MeshPointType, const xy_pos_t&, const bool=false, MeshFlags *done_flags=nullptr) _O0; static mesh_index_pair find_furthest_invalid_mesh_point() _O0; + #if ENABLED(UBL_HILBERT_CURVE) + static void check_if_missing(mesh_index_pair &pt, int x, int y); + static void hilbert(mesh_index_pair &pt, int8_t x, int8_t y, int8_t xi, int8_t xj, int8_t yi, int8_t yj, uint8_t n); + static mesh_index_pair find_next_mesh_point(); + #endif static void reset(); static void invalidate(); static void set_all_mesh_points_to_value(const float value); diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp index 8c70feb661..3ea777fd9a 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp @@ -757,9 +757,11 @@ void unified_bed_leveling::shift_mesh_height() { } #endif - best = do_furthest - ? find_furthest_invalid_mesh_point() - : find_closest_mesh_point_of_type(INVALID, nearby, true); + best = do_furthest ? find_furthest_invalid_mesh_point() + : TERN(UBL_HILBERT_CURVE, + next_point_in_grid(), + find_closest_mesh_point_of_type(INVALID, nearby, true) + ); if (best.pos.x >= 0) { // mesh point found and is reachable by probe TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(best.pos, ExtUI::PROBE_START)); @@ -1298,6 +1300,56 @@ mesh_index_pair unified_bed_leveling::find_closest_mesh_point_of_type(const Mesh return closest; } +#if ENABLED(UBL_HILBERT_CURVE) + + constexpr int8_t to_fix(int8_t v) { return v << 1; } + constexpr int8_t to_int(int8_t v) { return v >> 1; } + constexpr uint8_t log2(uint8_t n) { return (n > 1) ? 1 + log2(n >> 1) : 0; } + constexpr uint8_t order(uint8_t n) { return uint8_t(log2(n - 1)) + 1; } + + void unified_bed_leveling::hilbert(mesh_index_pair &pt, int8_t x, int8_t y, int8_t xi, int8_t xj, int8_t yi, int8_t yj, uint8_t n) { + /* Hilbert space filling curve implementation + * + * x and y are the coordinates of the bottom left corner + * xi & xj are the i & j components of the unit x vector of the frame + * similarly yi and yj + * + * From: http://www.fundza.com/algorithmic/space_filling/hilbert/basics/index.html + */ + if (n <= 0) + check_if_missing(pt, to_int(x+(xi+yi)/2),to_int(y+(xj+yj)/2)); + else { + hilbert(pt, x, y, yi/2, yj/2, xi/2, xj/2, n-1); + hilbert(pt, x+xi/2, y+xj/2, xi/2, xj/2, yi/2, yj/2, n-1); + hilbert(pt, x+xi/2+yi/2, y+xj/2+yj/2, xi/2, xj/2, yi/2, yj/2, n-1); + hilbert(pt, x+xi/2+yi, y+xj/2+yj, -yi/2, -yj/2, -xi/2, -xj/2, n-1); + } + } + + void unified_bed_leveling::check_if_missing(mesh_index_pair &pt, int x, int y) { + if ( pt.distance < 0 + && x < GRID_MAX_POINTS_X + && y < GRID_MAX_POINTS_Y + && isnan(z_values[x][y]) + && probe.can_reach(mesh_index_to_xpos(x), mesh_index_to_ypos(y)) + ) { + pt.pos.set(x, y); + pt.distance = 1; + } + } + + mesh_index_pair unified_bed_leveling::find_next_mesh_point() { + mesh_index_pair pt; + pt.invalidate(); + pt.distance = -99999.9f; + constexpr uint8_t ord = order(_MAX(GRID_MAX_POINTS_X, GRID_MAX_POINTS_Y)); + constexpr uint8_t dim = _BV(ord); + hilbert(pt, to_fix(0), to_fix(0), to_fix(dim), to_fix(0), to_fix(0), to_fix(dim), ord); + return pt; + } + +#endif // UBL_HILBERT_CURVE + /** * 'Smart Fill': Scan from the outward edges of the mesh towards the center. * If an invalid location is found, use the next two points (if valid) to diff --git a/buildroot/tests/mega2560 b/buildroot/tests/mega2560 index d961ab4eff..e3209899ce 100755 --- a/buildroot/tests/mega2560 +++ b/buildroot/tests/mega2560 @@ -36,7 +36,7 @@ opt_set MOTHERBOARD BOARD_AZTEEG_X3_PRO LCD_LANGUAGE jp_kana \ opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER LIGHTWEIGHT_UI SHOW_CUSTOM_BOOTSCREEN BOOT_MARLIN_LOGO_SMALL \ LCD_SET_PROGRESS_MANUALLY PRINT_PROGRESS_SHOW_DECIMALS SHOW_REMAINING_TIME STATUS_MESSAGE_SCROLLING SCROLL_LONG_FILENAMES \ SDSUPPORT SDCARD_SORT_ALPHA NO_SD_AUTOSTART USB_FLASH_DRIVE_SUPPORT CANCEL_OBJECTS \ - Z_PROBE_SLED AUTO_BED_LEVELING_UBL RESTORE_LEVELING_AFTER_G28 DEBUG_LEVELING_FEATURE G26_MESH_VALIDATION ENABLE_LEVELING_FADE_HEIGHT \ + Z_PROBE_SLED AUTO_BED_LEVELING_UBL UBL_HILBERT_CURVE RESTORE_LEVELING_AFTER_G28 DEBUG_LEVELING_FEATURE G26_MESH_VALIDATION ENABLE_LEVELING_FADE_HEIGHT \ EEPROM_SETTINGS EEPROM_CHITCHAT GCODE_MACROS CUSTOM_USER_MENUS \ MULTI_NOZZLE_DUPLICATION CLASSIC_JERK LIN_ADVANCE QUICK_HOME \ NANODLP_Z_SYNC I2C_POSITION_ENCODERS M114_DETAIL \ From 10c14bcc05a85d3f012d90f9963d97c72b1296d6 Mon Sep 17 00:00:00 2001 From: ellensp Date: Tue, 23 Mar 2021 19:47:07 +1300 Subject: [PATCH 178/253] Check NOZZLE_CLEAN_FEATURE settings (#21332) Co-authored-by: Scott Lahteine --- .github/workflows/test-builds.yml | 1 + Marlin/src/inc/SanityCheck.h | 15 +++++++++++++++ buildroot/tests/LPC1768 | 4 +++- buildroot/tests/LPC1769 | 4 +++- buildroot/tests/STM32F103RE | 4 +++- buildroot/tests/teensy35 | 4 +++- buildroot/tests/teensy41 | 4 +++- 7 files changed, 31 insertions(+), 5 deletions(-) diff --git a/.github/workflows/test-builds.yml b/.github/workflows/test-builds.yml index 7549e3defc..7b7052e0e1 100644 --- a/.github/workflows/test-builds.yml +++ b/.github/workflows/test-builds.yml @@ -98,6 +98,7 @@ jobs: # Non-working environment tests #- at90usb1286_cdc #- STM32F103CB_malyan + #- STM32F103RE #- mks_robin_mini steps: diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index af30c6156d..d8111c18da 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -3349,6 +3349,21 @@ static_assert( _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2) #error "Either enable MEATPACK_ON_SERIAL_PORT_* or BINARY_FILE_TRANSFER, not both." #endif +/** + * Sanity check for unique start and stop values in NOZZLE_CLEAN_FEATURE + */ +#if ENABLED(NOZZLE_CLEAN_FEATURE) + constexpr xyz_pos_t start_xyz[8] = NOZZLE_CLEAN_START_POINT, + end_xyz[8] = NOZZLE_CLEAN_END_POINT; + #define _CLEAN_ASSERT(N) static_assert(N >= HOTENDS || end_xyz[N].x != start_xyz[N].x || TERN(NOZZLE_CLEAN_NO_Y, false, end_xyz[N].y != start_xyz[N].y), \ + "NOZZLE_CLEAN Start and End must be made different on HOTEND " STRINGIFY(N)) + _CLEAN_ASSERT(0); _CLEAN_ASSERT(1); + _CLEAN_ASSERT(2); _CLEAN_ASSERT(3); + _CLEAN_ASSERT(4); _CLEAN_ASSERT(5); + _CLEAN_ASSERT(6); _CLEAN_ASSERT(7); + #undef _CLEAN_ASSERT +#endif + /** * Sanity check for valid stepper driver types */ diff --git a/buildroot/tests/LPC1768 b/buildroot/tests/LPC1768 index a6829e85ea..eef0857dac 100755 --- a/buildroot/tests/LPC1768 +++ b/buildroot/tests/LPC1768 @@ -34,7 +34,9 @@ opt_set MOTHERBOARD BOARD_RAMPS_14_RE_ARM_EEB \ EXTRUDERS 2 TEMP_SENSOR_1 -1 TEMP_SENSOR_BED 5 \ GRID_MAX_POINTS_X 16 \ NOZZLE_TO_PROBE_OFFSET '{ 0, 0, 0 }' \ - NOZZLE_CLEAN_MIN_TEMP 170 + NOZZLE_CLEAN_MIN_TEMP 170 \ + NOZZLE_CLEAN_START_POINT "{ { 10, 10, 3 }, { 10, 10, 3 } }" \ + NOZZLE_CLEAN_END_POINT "{ { 10, 20, 3 }, { 10, 20, 3 } }" opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER ADAPTIVE_FAN_SLOWING NO_FAN_SLOWING_IN_PID_TUNING \ FILAMENT_WIDTH_SENSOR FILAMENT_LCD_DISPLAY PID_EXTRUSION_SCALING SOUND_MENU_ITEM \ NOZZLE_AS_PROBE AUTO_BED_LEVELING_BILINEAR PREHEAT_BEFORE_LEVELING G29_RETRY_AND_RECOVER Z_MIN_PROBE_REPEATABILITY_TEST DEBUG_LEVELING_FEATURE \ diff --git a/buildroot/tests/LPC1769 b/buildroot/tests/LPC1769 index 5ca7114543..f0dab630e5 100755 --- a/buildroot/tests/LPC1769 +++ b/buildroot/tests/LPC1769 @@ -15,7 +15,9 @@ exec_test $1 $2 "Azteeg X5GT Example Configuration" "$3" restore_configs opt_set MOTHERBOARD BOARD_SMOOTHIEBOARD \ EXTRUDERS 2 TEMP_SENSOR_1 -1 TEMP_SENSOR_BED 5 \ - GRID_MAX_POINTS_X 16 + GRID_MAX_POINTS_X 16 \ + NOZZLE_CLEAN_START_POINT "{ { 10, 10, 3 }, { 10, 10, 3 } }" \ + NOZZLE_CLEAN_END_POINT "{ { 10, 20, 3 }, { 10, 20, 3 } }" opt_enable TFTGLCD_PANEL_SPI SDSUPPORT ADAPTIVE_FAN_SLOWING NO_FAN_SLOWING_IN_PID_TUNING \ FIX_MOUNTED_PROBE AUTO_BED_LEVELING_BILINEAR G29_RETRY_AND_RECOVER Z_MIN_PROBE_REPEATABILITY_TEST DEBUG_LEVELING_FEATURE \ BABYSTEPPING BABYSTEP_XY BABYSTEP_ZPROBE_OFFSET LEVEL_CORNERS_USE_PROBE LEVEL_CORNERS_VERIFY_RAISED \ diff --git a/buildroot/tests/STM32F103RE b/buildroot/tests/STM32F103RE index 426f87d21b..641f1fa56c 100755 --- a/buildroot/tests/STM32F103RE +++ b/buildroot/tests/STM32F103RE @@ -10,7 +10,9 @@ set -e # Build with the default configurations # restore_configs -opt_set MOTHERBOARD BOARD_STM32F103RE SERIAL_PORT -1 EXTRUDERS 2 +opt_set MOTHERBOARD BOARD_STM32F103RE SERIAL_PORT -1 EXTRUDERS 2 \ + NOZZLE_CLEAN_START_POINT "{ { 10, 10, 3 }, { 10, 10, 3 } }" \ + NOZZLE_CLEAN_END_POINT "{ { 10, 20, 3 }, { 10, 20, 3 } }" opt_enable EEPROM_SETTINGS EEPROM_CHITCHAT REPRAP_DISCOUNT_SMART_CONTROLLER SDSUPPORT \ PAREN_COMMENTS GCODE_MOTION_MODES SINGLENOZZLE TOOLCHANGE_FILAMENT_SWAP TOOLCHANGE_PARK \ BAUD_RATE_GCODE GCODE_MACROS NOZZLE_PARK_FEATURE NOZZLE_CLEAN_FEATURE diff --git a/buildroot/tests/teensy35 b/buildroot/tests/teensy35 index c9731665c5..36a261a6ae 100755 --- a/buildroot/tests/teensy35 +++ b/buildroot/tests/teensy35 @@ -17,7 +17,9 @@ restore_configs opt_set MOTHERBOARD BOARD_TEENSY35_36 \ EXTRUDERS 2 TEMP_SENSOR_0 1 TEMP_SENSOR_1 5 TEMP_SENSOR_BED 1 \ I2C_SLAVE_ADDRESS 63 \ - GRID_MAX_POINTS_X 16 + GRID_MAX_POINTS_X 16 \ + NOZZLE_CLEAN_START_POINT "{ { 10, 10, 3 }, { 10, 10, 3 } }" \ + NOZZLE_CLEAN_END_POINT "{ { 10, 20, 3 }, { 10, 20, 3 } }" opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER LCD_INFO_MENU SDSUPPORT SDCARD_SORT_ALPHA \ FILAMENT_WIDTH_SENSOR FILAMENT_LCD_DISPLAY CALIBRATION_GCODE BAUD_RATE_GCODE SOUND_MENU_ITEM \ FIX_MOUNTED_PROBE Z_SAFE_HOMING AUTO_BED_LEVELING_BILINEAR Z_MIN_PROBE_REPEATABILITY_TEST DEBUG_LEVELING_FEATURE \ diff --git a/buildroot/tests/teensy41 b/buildroot/tests/teensy41 index 6074b5dc5f..55e7e6eae2 100755 --- a/buildroot/tests/teensy41 +++ b/buildroot/tests/teensy41 @@ -17,7 +17,9 @@ restore_configs opt_set MOTHERBOARD BOARD_TEENSY41 \ EXTRUDERS 2 TEMP_SENSOR_0 1 TEMP_SENSOR_1 5 TEMP_SENSOR_BED 1 \ I2C_SLAVE_ADDRESS 63 \ - GRID_MAX_POINTS_X 16 + GRID_MAX_POINTS_X 16 \ + NOZZLE_CLEAN_START_POINT "{ { 10, 10, 3 }, { 10, 10, 3 } }" \ + NOZZLE_CLEAN_END_POINT "{ { 10, 20, 3 }, { 10, 20, 3 } }" opt_enable EXTENSIBLE_UI LCD_INFO_MENU SDSUPPORT SDCARD_SORT_ALPHA \ FILAMENT_LCD_DISPLAY CALIBRATION_GCODE BAUD_RATE_GCODE \ FIX_MOUNTED_PROBE Z_SAFE_HOMING AUTO_BED_LEVELING_BILINEAR Z_MIN_PROBE_REPEATABILITY_TEST DEBUG_LEVELING_FEATURE \ From dd92c8e927ba6146b06f486ef5356ea30cd87f6e Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 23 Mar 2021 05:54:41 -0500 Subject: [PATCH 179/253] Followup to UBL Hilbert --- Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp index 3ea777fd9a..bcda183366 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp @@ -759,7 +759,7 @@ void unified_bed_leveling::shift_mesh_height() { best = do_furthest ? find_furthest_invalid_mesh_point() : TERN(UBL_HILBERT_CURVE, - next_point_in_grid(), + find_next_mesh_point(), find_closest_mesh_point_of_type(INVALID, nearby, true) ); From df1ef496d1a88996cb1156fe933df59c6aaecbac Mon Sep 17 00:00:00 2001 From: borland1 Date: Tue, 23 Mar 2021 06:21:11 -0700 Subject: [PATCH 180/253] Main / Config Custom Submenus (#18177) Co-authored-by: Scott Lahteine --- Marlin/Configuration_adv.h | 98 +++++++---- Marlin/src/inc/Conditionals_adv.h | 2 +- Marlin/src/inc/SanityCheck.h | 105 +----------- .../screens/custom_user_menus.cpp | 4 +- .../ftdi_eve_touch_ui/screens/main_menu.cpp | 14 +- .../lib/ftdi_eve_touch_ui/screens/screens.h | 8 +- .../lcd/extui/lib/mks_ui/tft_Language_en.h | 12 +- .../lcd/extui/lib/mks_ui/tft_Language_fr.h | 12 +- .../lcd/extui/lib/mks_ui/tft_Language_it.h | 12 +- .../lcd/extui/lib/mks_ui/tft_Language_ru.h | 12 +- .../lcd/extui/lib/mks_ui/tft_Language_s_cn.h | 12 +- .../lcd/extui/lib/mks_ui/tft_Language_sp.h | 12 +- .../lcd/extui/lib/mks_ui/tft_Language_t_cn.h | 12 +- Marlin/src/lcd/language/language_cz.h | 2 +- Marlin/src/lcd/language/language_de.h | 2 +- Marlin/src/lcd/language/language_en.h | 2 +- Marlin/src/lcd/language/language_es.h | 2 +- Marlin/src/lcd/language/language_fr.h | 2 +- Marlin/src/lcd/language/language_gl.h | 2 +- Marlin/src/lcd/language/language_it.h | 2 +- Marlin/src/lcd/language/language_jp_kana.h | 2 +- Marlin/src/lcd/language/language_pl.h | 2 +- Marlin/src/lcd/language/language_pt_br.h | 2 +- Marlin/src/lcd/language/language_ro.h | 2 +- Marlin/src/lcd/language/language_ru.h | 2 +- Marlin/src/lcd/language/language_sk.h | 2 +- Marlin/src/lcd/language/language_tr.h | 2 +- Marlin/src/lcd/language/language_uk.h | 2 +- Marlin/src/lcd/language/language_vi.h | 2 +- Marlin/src/lcd/language/language_zh_CN.h | 2 +- Marlin/src/lcd/language/language_zh_TW.h | 2 +- Marlin/src/lcd/menu/menu_configuration.cpp | 152 +++++++++++++++++ Marlin/src/lcd/menu/menu_custom.cpp | 141 ---------------- Marlin/src/lcd/menu/menu_main.cpp | 156 +++++++++++++++++- .../PlatformIO/scripts/common-dependencies.h | 3 - buildroot/tests/mega2560 | 4 +- 36 files changed, 440 insertions(+), 367 deletions(-) delete mode 100644 Marlin/src/lcd/menu/menu_custom.cpp diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index fb1f79b230..328056cb84 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -3415,6 +3415,71 @@ #define GCODE_MACROS_SLOT_SIZE 50 // Maximum length of a single macro #endif +/** + * User-defined menu items to run custom G-code. + * Up to 25 may be defined, but the actual number is LCD-dependent. + */ + +// Custom Menu: Main Menu +//#define CUSTOM_MENU_MAIN +#if ENABLED(CUSTOM_MENU_MAIN) + //#define CUSTOM_MENU_MAIN_TITLE "Custom Commands" + #define CUSTOM_MENU_MAIN_SCRIPT_DONE "M117 User Script Done" + #define CUSTOM_MENU_MAIN_SCRIPT_AUDIBLE_FEEDBACK + //#define CUSTOM_MENU_MAIN_SCRIPT_RETURN // Return to status screen after a script + #define CUSTOM_MENU_MAIN_ONLY_IDLE // Only show custom menu when the machine is idle + + #define MAIN_MENU_ITEM_1_DESC "Home & UBL Info" + #define MAIN_MENU_ITEM_1_GCODE "G28\nG29 W" + //#define MAIN_MENU_ITEM_1_CONFIRM // Show a confirmation dialog before this action + + #define MAIN_MENU_ITEM_2_DESC "Preheat for " PREHEAT_1_LABEL + #define MAIN_MENU_ITEM_2_GCODE "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) + //#define MAIN_MENU_ITEM_2_CONFIRM + + //#define MAIN_MENU_ITEM_3_DESC "Preheat for " PREHEAT_2_LABEL + //#define MAIN_MENU_ITEM_3_GCODE "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) + //#define MAIN_MENU_ITEM_3_CONFIRM + + //#define MAIN_MENU_ITEM_4_DESC "Heat Bed/Home/Level" + //#define MAIN_MENU_ITEM_4_GCODE "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" + //#define MAIN_MENU_ITEM_4_CONFIRM + + //#define MAIN_MENU_ITEM_5_DESC "Home & Info" + //#define MAIN_MENU_ITEM_5_GCODE "G28\nM503" + //#define MAIN_MENU_ITEM_5_CONFIRM +#endif + +// Custom Menu: Configuration Menu +//#define CUSTOM_MENU_CONFIG +#if ENABLED(CUSTOM_MENU_CONFIG) + //#define CUSTOM_MENU_CONFIG_TITLE "Custom Commands" + #define CUSTOM_MENU_CONFIG_SCRIPT_DONE "M117 Wireless Script Done" + #define CUSTOM_MENU_CONFIG_SCRIPT_AUDIBLE_FEEDBACK + //#define CUSTOM_MENU_CONFIG_SCRIPT_RETURN // Return to status screen after a script + #define CUSTOM_MENU_CONFIG_ONLY_IDLE // Only show custom menu when the machine is idle + + #define CONFIG_MENU_ITEM_1_DESC "Wifi ON" + #define CONFIG_MENU_ITEM_1_GCODE "M118 [ESP110] WIFI-STA pwd=12345678" + //#define CONFIG_MENU_ITEM_1_CONFIRM // Show a confirmation dialog before this action + + #define CONFIG_MENU_ITEM_2_DESC "Bluetooth ON" + #define CONFIG_MENU_ITEM_2_GCODE "M118 [ESP110] BT pwd=12345678" + //#define CONFIG_MENU_ITEM_2_CONFIRM + + //#define CONFIG_MENU_ITEM_3_DESC "Radio OFF" + //#define CONFIG_MENU_ITEM_3_GCODE "M118 [ESP110] OFF pwd=12345678" + //#define CONFIG_MENU_ITEM_3_CONFIRM + + //#define CONFIG_MENU_ITEM_4_DESC "Wifi ????" + //#define CONFIG_MENU_ITEM_4_GCODE "M118 ????" + //#define CONFIG_MENU_ITEM_4_CONFIRM + + //#define CONFIG_MENU_ITEM_5_DESC "Wifi ????" + //#define CONFIG_MENU_ITEM_5_GCODE "M118 ????" + //#define CONFIG_MENU_ITEM_5_CONFIRM +#endif + /** * User-defined buttons to run custom G-code. * Up to 25 may be defined. @@ -3446,39 +3511,6 @@ #endif #endif -/** - * User-defined menu items to run custom G-code. - * Up to 25 may be defined, but the actual number is LCD-dependent. - */ -//#define CUSTOM_USER_MENUS -#if ENABLED(CUSTOM_USER_MENUS) - //#define CUSTOM_USER_MENU_TITLE "Custom Commands" - #define USER_SCRIPT_DONE "M117 User Script Done" - #define USER_SCRIPT_AUDIBLE_FEEDBACK - //#define USER_SCRIPT_RETURN // Return to status screen after a script - #define CUSTOM_MENU_ONLY_IDLE // Only show custom menu when the machine is idle - - #define USER_DESC_1 "Home & UBL Info" - #define USER_GCODE_1 "G28\nG29W" - //#define USER_CONFIRM_1 // Show a confirmation dialog before this action - - #define USER_DESC_2 "Preheat for " PREHEAT_1_LABEL - #define USER_GCODE_2 "M140 S" STRINGIFY(PREHEAT_1_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_1_TEMP_HOTEND) - //#define USER_CONFIRM_2 - - #define USER_DESC_3 "Preheat for " PREHEAT_2_LABEL - #define USER_GCODE_3 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nM104 S" STRINGIFY(PREHEAT_2_TEMP_HOTEND) - //#define USER_CONFIRM_3 - - #define USER_DESC_4 "Heat Bed/Home/Level" - #define USER_GCODE_4 "M140 S" STRINGIFY(PREHEAT_2_TEMP_BED) "\nG28\nG29" - //#define USER_CONFIRM_4 - - #define USER_DESC_5 "Home & Info" - #define USER_GCODE_5 "G28\nM503" - //#define USER_CONFIRM_5 -#endif - /** * Host Action Commands * diff --git a/Marlin/src/inc/Conditionals_adv.h b/Marlin/src/inc/Conditionals_adv.h index 490766bd7a..5ef0efa968 100644 --- a/Marlin/src/inc/Conditionals_adv.h +++ b/Marlin/src/inc/Conditionals_adv.h @@ -536,7 +536,7 @@ (defined(MMU2_SERIAL_PORT) && MMU2_SERIAL_PORT == (N)) || \ (defined(LCD_SERIAL_PORT) && LCD_SERIAL_PORT == (N)) -#if ENABLED(CUSTOM_USER_MENUS) +#if BOTH(HAS_TFT_LVGL_UI, CUSTOM_MENU_MAIN) #define _HAS_1(N) (defined(USER_DESC_##N) && defined(USER_GCODE_##N)) #define HAS_USER_ITEM(V...) DO(HAS,||,V) #else diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index d8111c18da..a7f726c4b2 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -553,6 +553,8 @@ #error "Z_AFTER_DEACTIVATE is replaced by Z_IDLE_HEIGHT." #elif defined(MEATPACK) #error "MEATPACK is now enabled with MEATPACK_ON_SERIAL_PORT_1, MEATPACK_ON_SERIAL_PORT_2, etc." +#elif defined(CUSTOM_USER_MENUS) + #error "CUSTOM_USER_MENUS has been replaced by CUSTOM_MENU_MAIN and CUSTOM_MENU_CONFIG." #endif /** @@ -2986,109 +2988,6 @@ static_assert( _ARR_TEST(3,0) && _ARR_TEST(3,1) && _ARR_TEST(3,2) #error "GCODE_MACROS_SLOTS must be a number from 1 to 10." #endif -#if ENABLED(CUSTOM_USER_MENUS) - #ifdef USER_GCODE_1 - constexpr char _chr1 = USER_GCODE_1[strlen(USER_GCODE_1) - 1]; - static_assert(_chr1 != '\n' && _chr1 != '\r', "USER_GCODE_1 cannot have a newline at the end. Please remove it."); - #endif - #ifdef USER_GCODE_2 - constexpr char _chr2 = USER_GCODE_2[strlen(USER_GCODE_2) - 1]; - static_assert(_chr2 != '\n' && _chr2 != '\r', "USER_GCODE_2 cannot have a newline at the end. Please remove it."); - #endif - #ifdef USER_GCODE_3 - constexpr char _chr3 = USER_GCODE_3[strlen(USER_GCODE_3) - 1]; - static_assert(_chr3 != '\n' && _chr3 != '\r', "USER_GCODE_3 cannot have a newline at the end. Please remove it."); - #endif - #ifdef USER_GCODE_4 - constexpr char _chr4 = USER_GCODE_4[strlen(USER_GCODE_4) - 1]; - static_assert(_chr4 != '\n' && _chr4 != '\r', "USER_GCODE_4 cannot have a newline at the end. Please remove it."); - #endif - #ifdef USER_GCODE_5 - constexpr char _chr5 = USER_GCODE_5[strlen(USER_GCODE_5) - 1]; - static_assert(_chr5 != '\n' && _chr5 != '\r', "USER_GCODE_5 cannot have a newline at the end. Please remove it."); - #endif - #ifdef USER_GCODE_6 - constexpr char _chr6 = USER_GCODE_6[strlen(USER_GCODE_6) - 1]; - static_assert(_chr6 != '\n' && _chr6 != '\r', "USER_GCODE_6 cannot have a newline at the end. Please remove it."); - #endif - #ifdef USER_GCODE_7 - constexpr char _chr7 = USER_GCODE_7[strlen(USER_GCODE_7) - 1]; - static_assert(_chr7 != '\n' && _chr7 != '\r', "USER_GCODE_7 cannot have a newline at the end. Please remove it."); - #endif - #ifdef USER_GCODE_8 - constexpr char _chr8 = USER_GCODE_8[strlen(USER_GCODE_8) - 1]; - static_assert(_chr8 != '\n' && _chr8 != '\r', "USER_GCODE_8 cannot have a newline at the end. Please remove it."); - #endif - #ifdef USER_GCODE_9 - constexpr char _chr9 = USER_GCODE_9[strlen(USER_GCODE_9) - 1]; - static_assert(_chr9 != '\n' && _chr9 != '\r', "USER_GCODE_9 cannot have a newline at the end. Please remove it."); - #endif - #ifdef USER_GCODE_10 - constexpr char _chr10 = USER_GCODE_10[strlen(USER_GCODE_10) - 1]; - static_assert(_chr10 != '\n' && _chr10 != '\r', "USER_GCODE_10 cannot have a newline at the end. Please remove it."); - #endif - #ifdef USER_GCODE_11 - constexpr char _chr11 = USER_GCODE_11[strlen(USER_GCODE_11) - 1]; - static_assert(_chr11 != '\n' && _chr11 != '\r', "USER_GCODE_11 cannot have a newline at the end. Please remove it."); - #endif - #ifdef USER_GCODE_12 - constexpr char _chr12 = USER_GCODE_12[strlen(USER_GCODE_12) - 1]; - static_assert(_chr12 != '\n' && _chr12 != '\r', "USER_GCODE_12 cannot have a newline at the end. Please remove it."); - #endif - #ifdef USER_GCODE_13 - constexpr char _chr13 = USER_GCODE_13[strlen(USER_GCODE_13) - 1]; - static_assert(_chr13 != '\n' && _chr13 != '\r', "USER_GCODE_13 cannot have a newline at the end. Please remove it."); - #endif - #ifdef USER_GCODE_14 - constexpr char _chr14 = USER_GCODE_14[strlen(USER_GCODE_14) - 1]; - static_assert(_chr14 != '\n' && _chr14 != '\r', "USER_GCODE_14 cannot have a newline at the end. Please remove it."); - #endif - #ifdef USER_GCODE_15 - constexpr char _chr15 = USER_GCODE_15[strlen(USER_GCODE_15) - 1]; - static_assert(_chr15 != '\n' && _chr15 != '\r', "USER_GCODE_15 cannot have a newline at the end. Please remove it."); - #endif - #ifdef USER_GCODE_16 - constexpr char _chr16 = USER_GCODE_16[strlen(USER_GCODE_16) - 1]; - static_assert(_chr16 != '\n' && _chr16 != '\r', "USER_GCODE_16 cannot have a newline at the end. Please remove it."); - #endif - #ifdef USER_GCODE_17 - constexpr char _chr17 = USER_GCODE_17[strlen(USER_GCODE_17) - 1]; - static_assert(_chr17 != '\n' && _chr17 != '\r', "USER_GCODE_17 cannot have a newline at the end. Please remove it."); - #endif - #ifdef USER_GCODE_18 - constexpr char _chr18 = USER_GCODE_18[strlen(USER_GCODE_18) - 1]; - static_assert(_chr18 != '\n' && _chr18 != '\r', "USER_GCODE_18 cannot have a newline at the end. Please remove it."); - #endif - #ifdef USER_GCODE_19 - constexpr char _chr19 = USER_GCODE_19[strlen(USER_GCODE_19) - 1]; - static_assert(_chr19 != '\n' && _chr19 != '\r', "USER_GCODE_19 cannot have a newline at the end. Please remove it."); - #endif - #ifdef USER_GCODE_20 - constexpr char _chr20 = USER_GCODE_20[strlen(USER_GCODE_20) - 1]; - static_assert(_chr20 != '\n' && _chr20 != '\r', "USER_GCODE_20 cannot have a newline at the end. Please remove it."); - #endif - #ifdef USER_GCODE_21 - constexpr char _chr21 = USER_GCODE_21[strlen(USER_GCODE_21) - 1]; - static_assert(_chr21 != '\n' && _chr21 != '\r', "USER_GCODE_21 cannot have a newline at the end. Please remove it."); - #endif - #ifdef USER_GCODE_22 - constexpr char _chr22 = USER_GCODE_22[strlen(USER_GCODE_22) - 1]; - static_assert(_chr22 != '\n' && _chr22 != '\r', "USER_GCODE_22 cannot have a newline at the end. Please remove it."); - #endif - #ifdef USER_GCODE_23 - constexpr char _chr23 = USER_GCODE_23[strlen(USER_GCODE_23) - 1]; - static_assert(_chr23 != '\n' && _chr23 != '\r', "USER_GCODE_23 cannot have a newline at the end. Please remove it."); - #endif - #ifdef USER_GCODE_24 - constexpr char _chr24 = USER_GCODE_24[strlen(USER_GCODE_24) - 1]; - static_assert(_chr24 != '\n' && _chr24 != '\r', "USER_GCODE_24 cannot have a newline at the end. Please remove it."); - #endif - #ifdef USER_GCODE_25 - constexpr char _chr25 = USER_GCODE_25[strlen(USER_GCODE_25) - 1]; - static_assert(_chr25 != '\n' && _chr25 != '\r', "USER_GCODE_25 cannot have a newline at the end. Please remove it."); - #endif -#endif - #if ENABLED(BACKLASH_COMPENSATION) #ifndef BACKLASH_DISTANCE_MM #error "BACKLASH_COMPENSATION requires BACKLASH_DISTANCE_MM." diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/custom_user_menus.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/custom_user_menus.cpp index ea175706f7..d5d1abdf9d 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/custom_user_menus.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/custom_user_menus.cpp @@ -30,8 +30,8 @@ using namespace ExtUI; using namespace Theme; #define _ITEM_TAG(N) (10+N) -#define _USER_DESC(N) USER_DESC_##N -#define _USER_GCODE(N) USER_GCODE_##N +#define _USER_DESC(N) MAIN_MENU_ITEM_##N##_DESC +#define _USER_GCODE(N) MAIN_MENU_ITEM_##N##_GCODE #define _USER_ITEM(N) .tag(_ITEM_TAG(N)).button(USER_ITEM_POS(N), _USER_DESC(N)) #define _USER_ACTION(N) case _ITEM_TAG(N): injectCommands_P(PSTR(_USER_GCODE(N))); TERN_(USER_SCRIPT_RETURN, GOTO_SCREEN(StatusScreen)); break; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/main_menu.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/main_menu.cpp index b7914d629b..53d6306175 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/main_menu.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/main_menu.cpp @@ -41,9 +41,9 @@ void MainMenu::onRedraw(draw_mode_t what) { #define GRID_COLS 2 #define ABOUT_PRINTER_POS BTN_POS(1,1), BTN_SIZE(2,1) #define ADVANCED_SETTINGS_POS BTN_POS(1,2), BTN_SIZE(2,1) - #if ENABLED(CUSTOM_USER_MENUS) + #if ENABLED(CUSTOM_MENU_MAIN) #define FILAMENTCHANGE_POS BTN_POS(1,3), BTN_SIZE(1,1) - #define CUSTOM_USER_MENUS_POS BTN_POS(2,3), BTN_SIZE(1,1) + #define CUSTOM_MENU_POS BTN_POS(2,3), BTN_SIZE(1,1) #else #define FILAMENTCHANGE_POS BTN_POS(1,3), BTN_SIZE(2,1) #endif @@ -63,10 +63,10 @@ void MainMenu::onRedraw(draw_mode_t what) { #define CLEAN_NOZZLE_POS BTN_POS(4,2), BTN_SIZE(3,1) #define MOVE_AXIS_POS BTN_POS(1,3), BTN_SIZE(3,1) #define DISABLE_STEPPERS_POS BTN_POS(4,3), BTN_SIZE(3,1) - #if ENABLED(CUSTOM_USER_MENUS) + #if ENABLED(CUSTOM_MENU_MAIN) #define TEMPERATURE_POS BTN_POS(1,4), BTN_SIZE(2,1) #define FILAMENTCHANGE_POS BTN_POS(3,4), BTN_SIZE(2,1) - #define CUSTOM_USER_MENUS_POS BTN_POS(5,4), BTN_SIZE(2,1) + #define CUSTOM_MENU_POS BTN_POS(5,4), BTN_SIZE(2,1) #else #define TEMPERATURE_POS BTN_POS(1,4), BTN_SIZE(3,1) #define FILAMENTCHANGE_POS BTN_POS(4,4), BTN_SIZE(3,1) @@ -91,8 +91,8 @@ void MainMenu::onRedraw(draw_mode_t what) { .enabled(TERN_(HAS_LEVELING, 1)) .tag( 9).button(LEVELING_POS, GET_TEXT_F(MSG_LEVELING)) .tag(10).button(ABOUT_PRINTER_POS, GET_TEXT_F(MSG_INFO_MENU)) - #if ENABLED(CUSTOM_USER_MENUS) - .tag(11).button(CUSTOM_USER_MENUS_POS, GET_TEXT_F(MSG_USER_MENU)) + #if ENABLED(CUSTOM_MENU_MAIN) + .tag(11).button(CUSTOM_MENU_POS, GET_TEXT_F(MSG_CUSTOM_COMMANDS)) #endif .colors(action_btn) .tag(1).button(BACK_POS, GET_TEXT_F(MSG_BACK)); @@ -117,7 +117,7 @@ bool MainMenu::onTouchEnd(uint8_t tag) { case 9: GOTO_SCREEN(LevelingMenu); break; #endif case 10: GOTO_SCREEN(AboutScreen); break; - #if ENABLED(CUSTOM_USER_MENUS) + #if ENABLED(CUSTOM_MENU_MAIN) case 11: GOTO_SCREEN(CustomUserMenus); break; #endif diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h index 61d702ebaf..3e69a3ad2f 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h @@ -22,8 +22,6 @@ #pragma once -#if ENABLED(TOUCH_UI_FTDI_EVE) - #include "../ftdi_eve_lib/ftdi_eve_lib.h" #include "../language/language.h" #include "../theme/theme.h" @@ -107,7 +105,7 @@ enum { #if ENABLED(SDSUPPORT) FILES_SCREEN_CACHE, #endif - #if ENABLED(CUSTOM_USER_MENUS) + #if ENABLED(CUSTOM_MENU_MAIN) CUSTOM_USER_MENUS_SCREEN_CACHE, #endif CHANGE_FILAMENT_SCREEN_CACHE, @@ -248,7 +246,7 @@ enum { #include "files_screen.h" #endif -#if ENABLED(CUSTOM_USER_MENUS) +#if ENABLED(CUSTOM_MENU_MAIN) #include "custom_user_menus.h" #endif @@ -262,5 +260,3 @@ enum { #if NUM_LANGUAGES > 1 #include "language_menu.h" #endif - -#endif // TOUCH_UI_FTDI_EVE diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h index fd5780e1d8..12a57bd548 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h @@ -728,9 +728,9 @@ #define EEPROM_READ_TIPS_EN "Read settings from EEPROM?" #define EEPROM_REVERT_TIPS_EN "Revert settings to factory defaults?" -#define MORE_CUSTOM1_TEXT_EN USER_DESC_1 -#define MORE_CUSTOM2_TEXT_EN USER_DESC_2 -#define MORE_CUSTOM3_TEXT_EN USER_DESC_3 -#define MORE_CUSTOM4_TEXT_EN USER_DESC_4 -#define MORE_CUSTOM5_TEXT_EN USER_DESC_5 -#define MORE_CUSTOM6_TEXT_EN USER_DESC_6 +#define MORE_CUSTOM1_TEXT_EN MAIN_MENU_ITEM_1_DESC +#define MORE_CUSTOM2_TEXT_EN MAIN_MENU_ITEM_2_DESC +#define MORE_CUSTOM3_TEXT_EN MAIN_MENU_ITEM_3_DESC +#define MORE_CUSTOM4_TEXT_EN MAIN_MENU_ITEM_4_DESC +#define MORE_CUSTOM5_TEXT_EN MAIN_MENU_ITEM_5_DESC +#define MORE_CUSTOM6_TEXT_EN MAIN_MENU_ITEM_6_DESC diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_fr.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_fr.h index 9440b8b0eb..f0b19d4e02 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_fr.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_fr.h @@ -260,9 +260,9 @@ #define EEPROM_READ_TIPS_FR "Lire les paramètres de l'EEPROM?" #define EEPROM_REVERT_TIPS_FR "Rétablir les paramètres par défaut d'usine?" -#define MORE_CUSTOM1_TEXT_FR USER_DESC_1 -#define MORE_CUSTOM2_TEXT_FR USER_DESC_2 -#define MORE_CUSTOM3_TEXT_FR USER_DESC_3 -#define MORE_CUSTOM4_TEXT_FR USER_DESC_4 -#define MORE_CUSTOM5_TEXT_FR USER_DESC_5 -#define MORE_CUSTOM6_TEXT_FR USER_DESC_6 +#define MORE_CUSTOM1_TEXT_FR MAIN_MENU_ITEM_1_DESC +#define MORE_CUSTOM2_TEXT_FR MAIN_MENU_ITEM_2_DESC +#define MORE_CUSTOM3_TEXT_FR MAIN_MENU_ITEM_3_DESC +#define MORE_CUSTOM4_TEXT_FR MAIN_MENU_ITEM_4_DESC +#define MORE_CUSTOM5_TEXT_FR MAIN_MENU_ITEM_5_DESC +#define MORE_CUSTOM6_TEXT_FR MAIN_MENU_ITEM_6_DESC diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_it.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_it.h index 9b88de3df4..b74842afef 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_it.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_it.h @@ -257,9 +257,9 @@ #define EEPROM_READ_TIPS_IT "Leggi le impostazioni dalla EEPROM?" #define EEPROM_REVERT_TIPS_IT "Ripristinare le impostazioni predefinite?" -#define MORE_CUSTOM1_TEXT_IT USER_DESC_1 -#define MORE_CUSTOM2_TEXT_IT USER_DESC_2 -#define MORE_CUSTOM3_TEXT_IT USER_DESC_3 -#define MORE_CUSTOM4_TEXT_IT USER_DESC_4 -#define MORE_CUSTOM5_TEXT_IT USER_DESC_5 -#define MORE_CUSTOM6_TEXT_IT USER_DESC_6 +#define MORE_CUSTOM1_TEXT_IT MAIN_MENU_ITEM_1_DESC +#define MORE_CUSTOM2_TEXT_IT MAIN_MENU_ITEM_2_DESC +#define MORE_CUSTOM3_TEXT_IT MAIN_MENU_ITEM_3_DESC +#define MORE_CUSTOM4_TEXT_IT MAIN_MENU_ITEM_4_DESC +#define MORE_CUSTOM5_TEXT_IT MAIN_MENU_ITEM_5_DESC +#define MORE_CUSTOM6_TEXT_IT MAIN_MENU_ITEM_6_DESC diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_ru.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_ru.h index 1989eaef1b..50e32ac05c 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_ru.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_ru.h @@ -255,12 +255,12 @@ #define EEPROM_SETTINGS_READ_RU "Чтение настроек из EEPROM" #define EEPROM_SETTINGS_REVERT_RU "Bосстановить заводские настройки по умолчанию" -#define MORE_CUSTOM1_TEXT_RU USER_DESC_1 -#define MORE_CUSTOM2_TEXT_RU USER_DESC_2 -#define MORE_CUSTOM3_TEXT_RU USER_DESC_3 -#define MORE_CUSTOM4_TEXT_RU USER_DESC_4 -#define MORE_CUSTOM5_TEXT_RU USER_DESC_5 -#define MORE_CUSTOM6_TEXT_RU USER_DESC_6 +#define MORE_CUSTOM1_TEXT_RU MAIN_MENU_ITEM_1_DESC +#define MORE_CUSTOM2_TEXT_RU MAIN_MENU_ITEM_2_DESC +#define MORE_CUSTOM3_TEXT_RU MAIN_MENU_ITEM_3_DESC +#define MORE_CUSTOM4_TEXT_RU MAIN_MENU_ITEM_4_DESC +#define MORE_CUSTOM5_TEXT_RU MAIN_MENU_ITEM_5_DESC +#define MORE_CUSTOM6_TEXT_RU MAIN_MENU_ITEM_6_DESC #define EEPROM_STORE_TIPS_RU "Cохранить настройки в EEPROM?" #define EEPROM_READ_TIPS_RU "читать настройки из EEPROM?" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_s_cn.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_s_cn.h index cc1a870339..f204933e25 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_s_cn.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_s_cn.h @@ -495,9 +495,9 @@ #define EEPROM_READ_TIPS_CN "是否使用EEPROM参数?" #define EEPROM_REVERT_TIPS_CN "是否恢复默认参数?" -#define MORE_CUSTOM1_TEXT_CN USER_DESC_1 -#define MORE_CUSTOM2_TEXT_CN USER_DESC_2 -#define MORE_CUSTOM3_TEXT_CN USER_DESC_3 -#define MORE_CUSTOM4_TEXT_CN USER_DESC_4 -#define MORE_CUSTOM5_TEXT_CN USER_DESC_5 -#define MORE_CUSTOM6_TEXT_CN USER_DESC_6 +#define MORE_CUSTOM1_TEXT_CN MAIN_MENU_ITEM_1_DESC +#define MORE_CUSTOM2_TEXT_CN MAIN_MENU_ITEM_2_DESC +#define MORE_CUSTOM3_TEXT_CN MAIN_MENU_ITEM_3_DESC +#define MORE_CUSTOM4_TEXT_CN MAIN_MENU_ITEM_4_DESC +#define MORE_CUSTOM5_TEXT_CN MAIN_MENU_ITEM_5_DESC +#define MORE_CUSTOM6_TEXT_CN MAIN_MENU_ITEM_6_DESC diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_sp.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_sp.h index 4654abddee..a75bc69ab7 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_sp.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_sp.h @@ -266,9 +266,9 @@ #define EEPROM_READ_TIPS_SP "Leer la configuración de EEPROM?" #define EEPROM_REVERT_TIPS_SP "Revert settings to factory defaults?" -#define MORE_CUSTOM1_TEXT_SP USER_DESC_1 -#define MORE_CUSTOM2_TEXT_SP USER_DESC_2 -#define MORE_CUSTOM3_TEXT_SP USER_DESC_3 -#define MORE_CUSTOM4_TEXT_SP USER_DESC_4 -#define MORE_CUSTOM5_TEXT_SP USER_DESC_5 -#define MORE_CUSTOM6_TEXT_SP USER_DESC_6 +#define MORE_CUSTOM1_TEXT_SP MAIN_MENU_ITEM_1_DESC +#define MORE_CUSTOM2_TEXT_SP MAIN_MENU_ITEM_2_DESC +#define MORE_CUSTOM3_TEXT_SP MAIN_MENU_ITEM_3_DESC +#define MORE_CUSTOM4_TEXT_SP MAIN_MENU_ITEM_4_DESC +#define MORE_CUSTOM5_TEXT_SP MAIN_MENU_ITEM_5_DESC +#define MORE_CUSTOM6_TEXT_SP MAIN_MENU_ITEM_6_DESC diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_t_cn.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_t_cn.h index 8057a3110e..76da2de907 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_t_cn.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_t_cn.h @@ -493,9 +493,9 @@ #define EEPROM_READ_TIPS_T_CN "是否使用EEPROM參數?" #define EEPROM_REVERT_TIPS_T_CN "是否恢復默認參數?" -#define MORE_CUSTOM1_TEXT_T_CN USER_DESC_1 -#define MORE_CUSTOM2_TEXT_T_CN USER_DESC_2 -#define MORE_CUSTOM3_TEXT_T_CN USER_DESC_3 -#define MORE_CUSTOM4_TEXT_T_CN USER_DESC_4 -#define MORE_CUSTOM5_TEXT_T_CN USER_DESC_5 -#define MORE_CUSTOM6_TEXT_T_CN USER_DESC_6 +#define MORE_CUSTOM1_TEXT_T_CN MAIN_MENU_ITEM_1_DESC +#define MORE_CUSTOM2_TEXT_T_CN MAIN_MENU_ITEM_2_DESC +#define MORE_CUSTOM3_TEXT_T_CN MAIN_MENU_ITEM_3_DESC +#define MORE_CUSTOM4_TEXT_T_CN MAIN_MENU_ITEM_4_DESC +#define MORE_CUSTOM5_TEXT_T_CN MAIN_MENU_ITEM_5_DESC +#define MORE_CUSTOM6_TEXT_T_CN MAIN_MENU_ITEM_6_DESC diff --git a/Marlin/src/lcd/language/language_cz.h b/Marlin/src/lcd/language/language_cz.h index adcbba7720..c434f5493b 100644 --- a/Marlin/src/lcd/language/language_cz.h +++ b/Marlin/src/lcd/language/language_cz.h @@ -119,7 +119,7 @@ namespace Language_cz { PROGMEM Language_Str MSG_MESH_Y = _UxGT("Index Y"); PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Hodnota Z"); - PROGMEM Language_Str MSG_USER_MENU = _UxGT("Vlastní příkazy"); + PROGMEM Language_Str MSG_CUSTOM_COMMANDS = _UxGT("Vlastní příkazy"); PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 test sondy"); PROGMEM Language_Str MSG_M48_POINT = _UxGT("M48 bod"); PROGMEM Language_Str MSG_M48_DEVIATION = _UxGT("Odchylka"); diff --git a/Marlin/src/lcd/language/language_de.h b/Marlin/src/lcd/language/language_de.h index 68791d9eaa..ebc2445b11 100644 --- a/Marlin/src/lcd/language/language_de.h +++ b/Marlin/src/lcd/language/language_de.h @@ -112,7 +112,7 @@ namespace Language_de { PROGMEM Language_Str MSG_MESH_X = _UxGT("Index X"); PROGMEM Language_Str MSG_MESH_Y = _UxGT("Index Y"); PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Z-Wert"); - PROGMEM Language_Str MSG_USER_MENU = _UxGT("Benutzer-Menü"); + PROGMEM Language_Str MSG_CUSTOM_COMMANDS = _UxGT("Benutzer-Menü"); PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 Sondentest"); PROGMEM Language_Str MSG_M48_POINT = _UxGT("M48 Punkt"); PROGMEM Language_Str MSG_M48_OUT_OF_BOUNDS = _UxGT("Zu weit draußen"); diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index 72f262c687..a37f5aa790 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -140,7 +140,7 @@ namespace Language_en { PROGMEM Language_Str MSG_MESH_X = _UxGT("Index X"); PROGMEM Language_Str MSG_MESH_Y = _UxGT("Index Y"); PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Z Value"); - PROGMEM Language_Str MSG_USER_MENU = _UxGT("Custom Commands"); + PROGMEM Language_Str MSG_CUSTOM_COMMANDS = _UxGT("Custom Commands"); PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 Probe Test"); PROGMEM Language_Str MSG_M48_POINT = _UxGT("M48 Point"); PROGMEM Language_Str MSG_M48_OUT_OF_BOUNDS = _UxGT("Probe out of bounds"); diff --git a/Marlin/src/lcd/language/language_es.h b/Marlin/src/lcd/language/language_es.h index 58559a4ff5..b2d83aa05b 100644 --- a/Marlin/src/lcd/language/language_es.h +++ b/Marlin/src/lcd/language/language_es.h @@ -115,7 +115,7 @@ namespace Language_es { PROGMEM Language_Str MSG_MESH_X = _UxGT("Índice X"); PROGMEM Language_Str MSG_MESH_Y = _UxGT("Índice Y"); PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Valor Z"); - PROGMEM Language_Str MSG_USER_MENU = _UxGT("Com. Personalizados"); + PROGMEM Language_Str MSG_CUSTOM_COMMANDS = _UxGT("Com. Personalizados"); PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 Probar Sonda"); PROGMEM Language_Str MSG_M48_POINT = _UxGT("M48 Punto"); PROGMEM Language_Str MSG_M48_DEVIATION = _UxGT("Desviación"); diff --git a/Marlin/src/lcd/language/language_fr.h b/Marlin/src/lcd/language/language_fr.h index 031db358bd..bdd91d3b29 100644 --- a/Marlin/src/lcd/language/language_fr.h +++ b/Marlin/src/lcd/language/language_fr.h @@ -113,7 +113,7 @@ namespace Language_fr { PROGMEM Language_Str MSG_MESH_X = _UxGT("Index X"); PROGMEM Language_Str MSG_MESH_Y = _UxGT("Index Y"); PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Valeur Z"); - PROGMEM Language_Str MSG_USER_MENU = _UxGT("Commandes perso"); + PROGMEM Language_Str MSG_CUSTOM_COMMANDS = _UxGT("Commandes perso"); PROGMEM Language_Str MSG_LCD_TILTING_MESH = _UxGT("Mesure point"); PROGMEM Language_Str MSG_M48_TEST = _UxGT("Ecart sonde Z M48"); diff --git a/Marlin/src/lcd/language/language_gl.h b/Marlin/src/lcd/language/language_gl.h index d0ec16b35f..5745ce1eb8 100644 --- a/Marlin/src/lcd/language/language_gl.h +++ b/Marlin/src/lcd/language/language_gl.h @@ -112,7 +112,7 @@ namespace Language_gl { PROGMEM Language_Str MSG_MESH_X = _UxGT("Índice X"); PROGMEM Language_Str MSG_MESH_Y = _UxGT("Índice Y"); PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Valor Z"); - PROGMEM Language_Str MSG_USER_MENU = _UxGT("Comandos Personaliz."); + PROGMEM Language_Str MSG_CUSTOM_COMMANDS = _UxGT("Comandos Personaliz."); PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 Probar Sonda"); PROGMEM Language_Str MSG_M48_POINT = _UxGT("M48 Punto"); PROGMEM Language_Str MSG_M48_DEVIATION = _UxGT("Desviación"); diff --git a/Marlin/src/lcd/language/language_it.h b/Marlin/src/lcd/language/language_it.h index 5bfb6aa9aa..be54d5035d 100644 --- a/Marlin/src/lcd/language/language_it.h +++ b/Marlin/src/lcd/language/language_it.h @@ -138,7 +138,7 @@ namespace Language_it { PROGMEM Language_Str MSG_MESH_X = _UxGT("Indice X"); PROGMEM Language_Str MSG_MESH_Y = _UxGT("Indice Y"); PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Valore di Z"); - PROGMEM Language_Str MSG_USER_MENU = _UxGT("Comandi personaliz."); + PROGMEM Language_Str MSG_CUSTOM_COMMANDS = _UxGT("Comandi personaliz."); PROGMEM Language_Str MSG_M48_TEST = _UxGT("Test sonda M48"); PROGMEM Language_Str MSG_M48_POINT = _UxGT("Punto M48"); PROGMEM Language_Str MSG_M48_OUT_OF_BOUNDS = _UxGT("Sonda oltre i limiti"); diff --git a/Marlin/src/lcd/language/language_jp_kana.h b/Marlin/src/lcd/language/language_jp_kana.h index 8431d86d1c..e0028e22a2 100644 --- a/Marlin/src/lcd/language/language_jp_kana.h +++ b/Marlin/src/lcd/language/language_jp_kana.h @@ -246,7 +246,7 @@ namespace Language_jp_kana { PROGMEM Language_Str MSG_BACK = _UxGT("モドリ"); PROGMEM Language_Str MSG_VELOCITY = _UxGT("ソクド"); PROGMEM Language_Str MSG_STEPS_PER_MM = _UxGT("ステップ/mm"); - PROGMEM Language_Str MSG_USER_MENU = _UxGT("ユーザーコマンド"); + PROGMEM Language_Str MSG_CUSTOM_COMMANDS = _UxGT("ユーザーコマンド"); PROGMEM Language_Str MSG_PRINT_PAUSED = _UxGT("プリントガイチジテイシサレマシタ"); PROGMEM Language_Str MSG_PRINTING = _UxGT("プリントチュウ..."); } diff --git a/Marlin/src/lcd/language/language_pl.h b/Marlin/src/lcd/language/language_pl.h index bf7d32e222..9004722cfc 100644 --- a/Marlin/src/lcd/language/language_pl.h +++ b/Marlin/src/lcd/language/language_pl.h @@ -109,7 +109,7 @@ namespace Language_pl { PROGMEM Language_Str MSG_MESH_X = _UxGT("Indeks X"); PROGMEM Language_Str MSG_MESH_Y = _UxGT("Indeks Y"); PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Wartość Z"); - PROGMEM Language_Str MSG_USER_MENU = _UxGT("Własne Polecenia"); + PROGMEM Language_Str MSG_CUSTOM_COMMANDS = _UxGT("Własne Polecenia"); PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 Test sondy"); PROGMEM Language_Str MSG_M48_POINT = _UxGT("M48 Punky"); PROGMEM Language_Str MSG_M48_DEVIATION = _UxGT("Odchylenie"); diff --git a/Marlin/src/lcd/language/language_pt_br.h b/Marlin/src/lcd/language/language_pt_br.h index 4ddf424b3d..642a7d9203 100644 --- a/Marlin/src/lcd/language/language_pt_br.h +++ b/Marlin/src/lcd/language/language_pt_br.h @@ -103,7 +103,7 @@ namespace Language_pt_br { PROGMEM Language_Str MSG_MESH_X = _UxGT("Índice X"); PROGMEM Language_Str MSG_MESH_Y = _UxGT("Índice Y"); PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Valor Z"); - PROGMEM Language_Str MSG_USER_MENU = _UxGT("Comando customizado"); + PROGMEM Language_Str MSG_CUSTOM_COMMANDS = _UxGT("Comando customizado"); PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 Teste de sonda"); PROGMEM Language_Str MSG_M48_POINT = _UxGT("M48 Ponto"); PROGMEM Language_Str MSG_IDEX_MENU = _UxGT("Modo IDEX"); diff --git a/Marlin/src/lcd/language/language_ro.h b/Marlin/src/lcd/language/language_ro.h index bd7e1b7a64..a34717acb5 100644 --- a/Marlin/src/lcd/language/language_ro.h +++ b/Marlin/src/lcd/language/language_ro.h @@ -111,7 +111,7 @@ namespace Language_ro { PROGMEM Language_Str MSG_MESH_X = _UxGT("Index X"); PROGMEM Language_Str MSG_MESH_Y = _UxGT("Index Y"); PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Valoare Z"); - PROGMEM Language_Str MSG_USER_MENU = _UxGT("Comenzi Personalizate"); + PROGMEM Language_Str MSG_CUSTOM_COMMANDS = _UxGT("Comenzi Personalizate"); PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 Probe Test"); PROGMEM Language_Str MSG_M48_POINT = _UxGT("M48 Point"); PROGMEM Language_Str MSG_M48_DEVIATION = _UxGT("Deviation"); diff --git a/Marlin/src/lcd/language/language_ru.h b/Marlin/src/lcd/language/language_ru.h index b3176c0a54..a10f47ef8e 100644 --- a/Marlin/src/lcd/language/language_ru.h +++ b/Marlin/src/lcd/language/language_ru.h @@ -139,7 +139,7 @@ namespace Language_ru { PROGMEM Language_Str MSG_MESH_X = _UxGT("Индекс X"); PROGMEM Language_Str MSG_MESH_Y = _UxGT("Индекс Y"); PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Значение Z"); - PROGMEM Language_Str MSG_USER_MENU = _UxGT("Свои команды"); + PROGMEM Language_Str MSG_CUSTOM_COMMANDS = _UxGT("Свои команды"); PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 тест Z-зонда"); PROGMEM Language_Str MSG_M48_DEVIATION = _UxGT("Отклонение"); diff --git a/Marlin/src/lcd/language/language_sk.h b/Marlin/src/lcd/language/language_sk.h index a9df28382e..2e851842e4 100644 --- a/Marlin/src/lcd/language/language_sk.h +++ b/Marlin/src/lcd/language/language_sk.h @@ -140,7 +140,7 @@ namespace Language_sk { PROGMEM Language_Str MSG_MESH_X = _UxGT("Index X"); PROGMEM Language_Str MSG_MESH_Y = _UxGT("Index Y"); PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Hodnota Z"); - PROGMEM Language_Str MSG_USER_MENU = _UxGT("Vlastné príkazy"); + PROGMEM Language_Str MSG_CUSTOM_COMMANDS = _UxGT("Vlastné príkazy"); PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 Test sondy"); PROGMEM Language_Str MSG_M48_POINT = _UxGT("M48 Bod"); PROGMEM Language_Str MSG_M48_OUT_OF_BOUNDS = _UxGT("Sonda mimo hraníc"); diff --git a/Marlin/src/lcd/language/language_tr.h b/Marlin/src/lcd/language/language_tr.h index a7a4056c0b..9d711ff376 100644 --- a/Marlin/src/lcd/language/language_tr.h +++ b/Marlin/src/lcd/language/language_tr.h @@ -114,7 +114,7 @@ namespace Language_tr { PROGMEM Language_Str MSG_MESH_X = _UxGT("İndeks X"); PROGMEM Language_Str MSG_MESH_Y = _UxGT("İndeks Y"); PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Z Değeri"); - PROGMEM Language_Str MSG_USER_MENU = _UxGT("Özel Komutlar"); + PROGMEM Language_Str MSG_CUSTOM_COMMANDS = _UxGT("Özel Komutlar"); PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 Prob Testi"); PROGMEM Language_Str MSG_M48_POINT = _UxGT("M48 Nokta"); PROGMEM Language_Str MSG_M48_DEVIATION = _UxGT("Sapma"); diff --git a/Marlin/src/lcd/language/language_uk.h b/Marlin/src/lcd/language/language_uk.h index 069ad7066d..be0e420a42 100644 --- a/Marlin/src/lcd/language/language_uk.h +++ b/Marlin/src/lcd/language/language_uk.h @@ -151,7 +151,7 @@ namespace Language_uk { PROGMEM Language_Str MSG_MESH_X = _UxGT("Індекс X"); PROGMEM Language_Str MSG_MESH_Y = _UxGT("Індекс Y"); PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Значення Z"); - PROGMEM Language_Str MSG_USER_MENU = _UxGT("Власні команди"); + PROGMEM Language_Str MSG_CUSTOM_COMMANDS = _UxGT("Власні команди"); PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 тест зонду"); PROGMEM Language_Str MSG_M48_POINT = _UxGT("M48 точка"); diff --git a/Marlin/src/lcd/language/language_vi.h b/Marlin/src/lcd/language/language_vi.h index fad32507ce..f0b7f732ed 100644 --- a/Marlin/src/lcd/language/language_vi.h +++ b/Marlin/src/lcd/language/language_vi.h @@ -96,7 +96,7 @@ namespace Language_vi { PROGMEM Language_Str MSG_MESH_X = _UxGT("Mục lục X"); // Index X PROGMEM Language_Str MSG_MESH_Y = _UxGT("Mục lục Y"); PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Giá trị Z"); // Z Value - PROGMEM Language_Str MSG_USER_MENU = _UxGT("Các lệnh tự chọn"); // Custom Commands + PROGMEM Language_Str MSG_CUSTOM_COMMANDS = _UxGT("Các lệnh tự chọn"); // Custom Commands PROGMEM Language_Str MSG_UBL_DOING_G29 = _UxGT("Đang chạy G29"); // Doing G29 PROGMEM Language_Str MSG_UBL_TOOLS = _UxGT("Công cụ UBL"); // UBL tools PROGMEM Language_Str MSG_UBL_LEVEL_BED = _UxGT("San Lấp Bàn Thống Nhất (UBL)"); // Unified Bed Leveling diff --git a/Marlin/src/lcd/language/language_zh_CN.h b/Marlin/src/lcd/language/language_zh_CN.h index 5e7c5e7cb5..98f7704efc 100644 --- a/Marlin/src/lcd/language/language_zh_CN.h +++ b/Marlin/src/lcd/language/language_zh_CN.h @@ -109,7 +109,7 @@ namespace Language_zh_CN { PROGMEM Language_Str MSG_MESH_X = _UxGT("索引X"); PROGMEM Language_Str MSG_MESH_Y = _UxGT("索引Y"); PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Z 值"); - PROGMEM Language_Str MSG_USER_MENU = _UxGT("定制命令"); // "Custom Commands" + PROGMEM Language_Str MSG_CUSTOM_COMMANDS = _UxGT("定制命令"); // "Custom Commands" PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48探测"); PROGMEM Language_Str MSG_M48_POINT = _UxGT("M48点"); PROGMEM Language_Str MSG_M48_DEVIATION = _UxGT("M48偏差"); diff --git a/Marlin/src/lcd/language/language_zh_TW.h b/Marlin/src/lcd/language/language_zh_TW.h index f86b15351f..0ada34a476 100644 --- a/Marlin/src/lcd/language/language_zh_TW.h +++ b/Marlin/src/lcd/language/language_zh_TW.h @@ -107,7 +107,7 @@ namespace Language_zh_TW { PROGMEM Language_Str MSG_MESH_X = _UxGT("索引 X"); //"Index X" PROGMEM Language_Str MSG_MESH_Y = _UxGT("索引 Y"); //"Index Y" PROGMEM Language_Str MSG_MESH_EDIT_Z = _UxGT("Z 值"); //"Z Value" - PROGMEM Language_Str MSG_USER_MENU = _UxGT("自定命令"); // "Custom Commands" + PROGMEM Language_Str MSG_CUSTOM_COMMANDS = _UxGT("自定命令"); // "Custom Commands" PROGMEM Language_Str MSG_M48_TEST = _UxGT("M48 探測測試"); //"M48 Probe Test" PROGMEM Language_Str MSG_M48_POINT = _UxGT("M48 探測點"); //"M48 Point" PROGMEM Language_Str MSG_M48_DEVIATION = _UxGT("偏差"); //"Deviation" diff --git a/Marlin/src/lcd/menu/menu_configuration.cpp b/Marlin/src/lcd/menu/menu_configuration.cpp index 179a2c2d55..71f09a5aee 100644 --- a/Marlin/src/lcd/menu/menu_configuration.cpp +++ b/Marlin/src/lcd/menu/menu_configuration.cpp @@ -338,6 +338,148 @@ void menu_advanced_settings(); #endif +#if ENABLED(CUSTOM_MENU_CONFIG) + + void _lcd_custom_menus_configuration_gcode(PGM_P const cmd) { + queue.inject_P(cmd); + TERN_(CUSTOM_MENU_CONFIG_SCRIPT_AUDIBLE_FEEDBACK, ui.completion_feedback()); + TERN_(CUSTOM_MENU_CONFIG_SCRIPT_RETURN, ui.return_to_status()); + } + + void custom_menus_configuration() { + START_MENU(); + BACK_ITEM(MSG_MAIN); + + #define HAS_CUSTOM_ITEM_CONF(N) (defined(CONFIG_MENU_ITEM_##N##_DESC) && defined(CONFIG_MENU_ITEM_##N##_GCODE)) + + #define CUSTOM_TEST_CONF(N) do{ \ + constexpr char c = CONFIG_MENU_ITEM_##N##_GCODE[strlen(CONFIG_MENU_ITEM_##N##_GCODE) - 1]; \ + static_assert(c != '\n' && c != '\r', "CONFIG_MENU_ITEM_" STRINGIFY(N) "_GCODE cannot have a newline at the end. Please remove it."); \ + }while(0) + + #ifdef CUSTOM_MENU_CONFIG_SCRIPT_DONE + #define _DONE_SCRIPT "\n" CUSTOM_MENU_CONFIG_SCRIPT_DONE + #else + #define _DONE_SCRIPT "" + #endif + #define GCODE_LAMBDA_CONF(N) []{ _lcd_custom_menus_configuration_gcode(PSTR(CONFIG_MENU_ITEM_##N##_GCODE _DONE_SCRIPT)); } + #define _CUSTOM_ITEM_CONF(N) ACTION_ITEM_P(PSTR(CONFIG_MENU_ITEM_##N##_DESC), GCODE_LAMBDA_CONF(N)); + #define _CUSTOM_ITEM_CONF_CONFIRM(N) \ + SUBMENU_P(PSTR(CONFIG_MENU_ITEM_##N##_DESC), []{ \ + MenuItem_confirm::confirm_screen( \ + GCODE_LAMBDA_CONF(N), \ + ui.goto_previous_screen, \ + PSTR(CONFIG_MENU_ITEM_##N##_DESC "?") \ + ); \ + }) + + #define CUSTOM_ITEM_CONF(N) do{ if (ENABLED(CONFIG_MENU_ITEM_##N##_CONFIRM)) _CUSTOM_ITEM_CONF_CONFIRM(N); else _CUSTOM_ITEM_CONF(N); }while(0) + + #if HAS_CUSTOM_ITEM_CONF(1) + CUSTOM_TEST_CONF(1); + CUSTOM_ITEM_CONF(1); + #endif + #if HAS_CUSTOM_ITEM_CONF(2) + CUSTOM_TEST_CONF(2); + CUSTOM_ITEM_CONF(2); + #endif + #if HAS_CUSTOM_ITEM_CONF(3) + CUSTOM_TEST_CONF(3); + CUSTOM_ITEM_CONF(3); + #endif + #if HAS_CUSTOM_ITEM_CONF(4) + CUSTOM_TEST_CONF(4); + CUSTOM_ITEM_CONF(4); + #endif + #if HAS_CUSTOM_ITEM_CONF(5) + CUSTOM_TEST_CONF(5); + CUSTOM_ITEM_CONF(5); + #endif + #if HAS_CUSTOM_ITEM_CONF(6) + CUSTOM_TEST_CONF(6); + CUSTOM_ITEM_CONF(6); + #endif + #if HAS_CUSTOM_ITEM_CONF(7) + CUSTOM_TEST_CONF(7); + CUSTOM_ITEM_CONF(7); + #endif + #if HAS_CUSTOM_ITEM_CONF(8) + CUSTOM_TEST_CONF(8); + CUSTOM_ITEM_CONF(8); + #endif + #if HAS_CUSTOM_ITEM_CONF(9) + CUSTOM_TEST_CONF(9); + CUSTOM_ITEM_CONF(9); + #endif + #if HAS_CUSTOM_ITEM_CONF(10) + CUSTOM_TEST_CONF(10); + CUSTOM_ITEM_CONF(10); + #endif + #if HAS_CUSTOM_ITEM_CONF(11) + CUSTOM_TEST_CONF(11); + CUSTOM_ITEM_CONF(11); + #endif + #if HAS_CUSTOM_ITEM_CONF(12) + CUSTOM_TEST_CONF(12); + CUSTOM_ITEM_CONF(12); + #endif + #if HAS_CUSTOM_ITEM_CONF(13) + CUSTOM_TEST_CONF(13); + CUSTOM_ITEM_CONF(13); + #endif + #if HAS_CUSTOM_ITEM_CONF(14) + CUSTOM_TEST_CONF(14); + CUSTOM_ITEM_CONF(14); + #endif + #if HAS_CUSTOM_ITEM_CONF(15) + CUSTOM_TEST_CONF(15); + CUSTOM_ITEM_CONF(15); + #endif + #if HAS_CUSTOM_ITEM_CONF(16) + CUSTOM_TEST_CONF(16); + CUSTOM_ITEM_CONF(16); + #endif + #if HAS_CUSTOM_ITEM_CONF(17) + CUSTOM_TEST_CONF(17); + CUSTOM_ITEM_CONF(17); + #endif + #if HAS_CUSTOM_ITEM_CONF(18) + CUSTOM_TEST_CONF(18); + CUSTOM_ITEM_CONF(18); + #endif + #if HAS_CUSTOM_ITEM_CONF(19) + CUSTOM_TEST_CONF(19); + CUSTOM_ITEM_CONF(19); + #endif + #if HAS_CUSTOM_ITEM_CONF(20) + CUSTOM_TEST_CONF(20); + CUSTOM_ITEM_CONF(20); + #endif + #if HAS_CUSTOM_ITEM_CONF(21) + CUSTOM_TEST_CONF(21); + CUSTOM_ITEM_CONF(21); + #endif + #if HAS_CUSTOM_ITEM_CONF(22) + CUSTOM_TEST_CONF(22); + CUSTOM_ITEM_CONF(22); + #endif + #if HAS_CUSTOM_ITEM_CONF(23) + CUSTOM_TEST_CONF(23); + CUSTOM_ITEM_CONF(23); + #endif + #if HAS_CUSTOM_ITEM_CONF(24) + CUSTOM_TEST_CONF(24); + CUSTOM_ITEM_CONF(24); + #endif + #if HAS_CUSTOM_ITEM_CONF(25) + CUSTOM_TEST_CONF(25); + CUSTOM_ITEM_CONF(25); + #endif + END_MENU(); + } + +#endif // CUSTOM_MENU_CONFIG + void menu_configuration() { const bool busy = printer_busy(); @@ -351,6 +493,16 @@ void menu_configuration() { SUBMENU(MSG_DEBUG_MENU, menu_debug); #endif + #if ENABLED(CUSTOM_MENU_CONFIG) + if (TERN1(CUSTOM_MENU_CONFIG_ONLY_IDLE, !busy)) { + #ifdef CUSTOM_MENU_CONFIG_TITLE + SUBMENU_P(PSTR(CUSTOM_MENU_CONFIG_TITLE), custom_menus_configuration); + #else + SUBMENU(MSG_CUSTOM_COMMANDS, custom_menus_configuration); + #endif + } + #endif + SUBMENU(MSG_ADVANCED_SETTINGS, menu_advanced_settings); #if ENABLED(BABYSTEP_ZPROBE_OFFSET) diff --git a/Marlin/src/lcd/menu/menu_custom.cpp b/Marlin/src/lcd/menu/menu_custom.cpp deleted file mode 100644 index cc1a8a6e80..0000000000 --- a/Marlin/src/lcd/menu/menu_custom.cpp +++ /dev/null @@ -1,141 +0,0 @@ -/** - * Marlin 3D Printer Firmware - * Copyright (c) 2020 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 . - * - */ - -// -// Custom User Menu -// - -#include "../../inc/MarlinConfigPre.h" - -#if BOTH(HAS_LCD_MENU, CUSTOM_USER_MENUS) - -#include "menu_item.h" -#include "../../gcode/queue.h" - -#ifdef USER_SCRIPT_DONE - #define _DONE_SCRIPT "\n" USER_SCRIPT_DONE -#else - #define _DONE_SCRIPT "" -#endif - -void _lcd_user_gcode(PGM_P const cmd) { - queue.inject_P(cmd); - TERN_(USER_SCRIPT_AUDIBLE_FEEDBACK, ui.completion_feedback()); - TERN_(USER_SCRIPT_RETURN, ui.return_to_status()); -} - -void menu_user() { - START_MENU(); - BACK_ITEM(MSG_MAIN); - - #define GCODE_LAMBDA(N) []{ _lcd_user_gcode(PSTR(USER_GCODE_##N _DONE_SCRIPT)); } - #define _USER_ITEM(N) ACTION_ITEM_P(PSTR(USER_DESC_##N), GCODE_LAMBDA(N)); - #define _USER_ITEM_CONFIRM(N) \ - SUBMENU_P(PSTR(USER_DESC_##N), []{ \ - MenuItem_confirm::confirm_screen( \ - GCODE_LAMBDA(N), \ - ui.goto_previous_screen, \ - PSTR(USER_DESC_##N "?") \ - ); \ - }) - - #define USER_ITEM(N) do{ if (ENABLED(USER_CONFIRM_##N)) _USER_ITEM_CONFIRM(N); else _USER_ITEM(N); }while(0) - - #if HAS_USER_ITEM(1) - USER_ITEM(1); - #endif - #if HAS_USER_ITEM(2) - USER_ITEM(2); - #endif - #if HAS_USER_ITEM(3) - USER_ITEM(3); - #endif - #if HAS_USER_ITEM(4) - USER_ITEM(4); - #endif - #if HAS_USER_ITEM(5) - USER_ITEM(5); - #endif - #if HAS_USER_ITEM(6) - USER_ITEM(6); - #endif - #if HAS_USER_ITEM(7) - USER_ITEM(7); - #endif - #if HAS_USER_ITEM(8) - USER_ITEM(8); - #endif - #if HAS_USER_ITEM(9) - USER_ITEM(9); - #endif - #if HAS_USER_ITEM(10) - USER_ITEM(10); - #endif - #if HAS_USER_ITEM(11) - USER_ITEM(11); - #endif - #if HAS_USER_ITEM(12) - USER_ITEM(12); - #endif - #if HAS_USER_ITEM(13) - USER_ITEM(13); - #endif - #if HAS_USER_ITEM(14) - USER_ITEM(14); - #endif - #if HAS_USER_ITEM(15) - USER_ITEM(15); - #endif - #if HAS_USER_ITEM(16) - USER_ITEM(16); - #endif - #if HAS_USER_ITEM(17) - USER_ITEM(17); - #endif - #if HAS_USER_ITEM(18) - USER_ITEM(18); - #endif - #if HAS_USER_ITEM(19) - USER_ITEM(19); - #endif - #if HAS_USER_ITEM(20) - USER_ITEM(20); - #endif - #if HAS_USER_ITEM(21) - USER_ITEM(21); - #endif - #if HAS_USER_ITEM(22) - USER_ITEM(22); - #endif - #if HAS_USER_ITEM(23) - USER_ITEM(23); - #endif - #if HAS_USER_ITEM(24) - USER_ITEM(24); - #endif - #if HAS_USER_ITEM(25) - USER_ITEM(25); - #endif - END_MENU(); -} - -#endif // HAS_LCD_MENU && CUSTOM_USER_MENUS diff --git a/Marlin/src/lcd/menu/menu_main.cpp b/Marlin/src/lcd/menu/menu_main.cpp index d19e236a84..525b8c8a70 100644 --- a/Marlin/src/lcd/menu/menu_main.cpp +++ b/Marlin/src/lcd/menu/menu_main.cpp @@ -68,10 +68,6 @@ void menu_motion(); void menu_temperature(); void menu_configuration(); -#if ENABLED(CUSTOM_USER_MENUS) - void menu_user(); -#endif - #if HAS_POWER_MONITOR void menu_power_monitor(); #endif @@ -105,6 +101,148 @@ void menu_configuration(); void menu_language(); #endif +#if ENABLED(CUSTOM_MENU_MAIN) + + void _lcd_custom_menu_main_gcode(PGM_P const cmd) { + queue.inject_P(cmd); + TERN_(MAIN_MENU_ITEM_SCRIPT_AUDIBLE_FEEDBACK, ui.completion_feedback()); + TERN_(MAIN_MENU_ITEM_SCRIPT_RETURN, ui.return_to_status()); + } + + void custom_menus_main() { + START_MENU(); + BACK_ITEM(MSG_MAIN); + + #define HAS_CUSTOM_ITEM_MAIN(N) (defined(MAIN_MENU_ITEM_##N##_DESC) && defined(MAIN_MENU_ITEM_##N##_GCODE)) + + #define CUSTOM_TEST_MAIN(N) do{ \ + constexpr char c = MAIN_MENU_ITEM_##N##_GCODE[strlen(MAIN_MENU_ITEM_##N##_GCODE) - 1]; \ + static_assert(c != '\n' && c != '\r', "MAIN_MENU_ITEM_" STRINGIFY(N) "_GCODE cannot have a newline at the end. Please remove it."); \ + }while(0) + + #ifdef MAIN_MENU_ITEM_SCRIPT_DONE + #define _DONE_SCRIPT "\n" MAIN_MENU_ITEM_SCRIPT_DONE + #else + #define _DONE_SCRIPT "" + #endif + #define GCODE_LAMBDA_MAIN(N) []{ _lcd_custom_menu_main_gcode(PSTR(MAIN_MENU_ITEM_##N##_GCODE _DONE_SCRIPT)); } + #define _CUSTOM_ITEM_MAIN(N) ACTION_ITEM_P(PSTR(MAIN_MENU_ITEM_##N##_DESC), GCODE_LAMBDA_MAIN(N)); + #define _CUSTOM_ITEM_MAIN_CONFIRM(N) \ + SUBMENU_P(PSTR(MAIN_MENU_ITEM_##N##_DESC), []{ \ + MenuItem_confirm::confirm_screen( \ + GCODE_LAMBDA_MAIN(N), \ + ui.goto_previous_screen, \ + PSTR(MAIN_MENU_ITEM_##N##_DESC "?") \ + ); \ + }) + + #define CUSTOM_ITEM_MAIN(N) do{ if (ENABLED(MAIN_MENU_ITEM_##N##_CONFIRM)) _CUSTOM_ITEM_MAIN_CONFIRM(N); else _CUSTOM_ITEM_MAIN(N); }while(0) + + #if HAS_CUSTOM_ITEM_MAIN(1) + CUSTOM_TEST_MAIN(1); + CUSTOM_ITEM_MAIN(1); + #endif + #if HAS_CUSTOM_ITEM_MAIN(2) + CUSTOM_TEST_MAIN(2); + CUSTOM_ITEM_MAIN(2); + #endif + #if HAS_CUSTOM_ITEM_MAIN(3) + CUSTOM_TEST_MAIN(3); + CUSTOM_ITEM_MAIN(3); + #endif + #if HAS_CUSTOM_ITEM_MAIN(4) + CUSTOM_TEST_MAIN(4); + CUSTOM_ITEM_MAIN(4); + #endif + #if HAS_CUSTOM_ITEM_MAIN(5) + CUSTOM_TEST_MAIN(5); + CUSTOM_ITEM_MAIN(5); + #endif + #if HAS_CUSTOM_ITEM_MAIN(6) + CUSTOM_TEST_MAIN(6); + CUSTOM_ITEM_MAIN(6); + #endif + #if HAS_CUSTOM_ITEM_MAIN(7) + CUSTOM_TEST_MAIN(7); + CUSTOM_ITEM_MAIN(7); + #endif + #if HAS_CUSTOM_ITEM_MAIN(8) + CUSTOM_TEST_MAIN(8); + CUSTOM_ITEM_MAIN(8); + #endif + #if HAS_CUSTOM_ITEM_MAIN(9) + CUSTOM_TEST_MAIN(9); + CUSTOM_ITEM_MAIN(9); + #endif + #if HAS_CUSTOM_ITEM_MAIN(10) + CUSTOM_TEST_MAIN(10); + CUSTOM_ITEM_MAIN(10); + #endif + #if HAS_CUSTOM_ITEM_MAIN(11) + CUSTOM_TEST_MAIN(11); + CUSTOM_ITEM_MAIN(11); + #endif + #if HAS_CUSTOM_ITEM_MAIN(12) + CUSTOM_TEST_MAIN(12); + CUSTOM_ITEM_MAIN(12); + #endif + #if HAS_CUSTOM_ITEM_MAIN(13) + CUSTOM_TEST_MAIN(13); + CUSTOM_ITEM_MAIN(13); + #endif + #if HAS_CUSTOM_ITEM_MAIN(14) + CUSTOM_TEST_MAIN(14); + CUSTOM_ITEM_MAIN(14); + #endif + #if HAS_CUSTOM_ITEM_MAIN(15) + CUSTOM_TEST_MAIN(15); + CUSTOM_ITEM_MAIN(15); + #endif + #if HAS_CUSTOM_ITEM_MAIN(16) + CUSTOM_TEST_MAIN(16); + CUSTOM_ITEM_MAIN(16); + #endif + #if HAS_CUSTOM_ITEM_MAIN(17) + CUSTOM_TEST_MAIN(17); + CUSTOM_ITEM_MAIN(17); + #endif + #if HAS_CUSTOM_ITEM_MAIN(18) + CUSTOM_TEST_MAIN(18); + CUSTOM_ITEM_MAIN(18); + #endif + #if HAS_CUSTOM_ITEM_MAIN(19) + CUSTOM_TEST_MAIN(19); + CUSTOM_ITEM_MAIN(19); + #endif + #if HAS_CUSTOM_ITEM_MAIN(20) + CUSTOM_TEST_MAIN(20); + CUSTOM_ITEM_MAIN(20); + #endif + #if HAS_CUSTOM_ITEM_MAIN(21) + CUSTOM_TEST_MAIN(21); + CUSTOM_ITEM_MAIN(21); + #endif + #if HAS_CUSTOM_ITEM_MAIN(22) + CUSTOM_TEST_MAIN(22); + CUSTOM_ITEM_MAIN(22); + #endif + #if HAS_CUSTOM_ITEM_MAIN(23) + CUSTOM_TEST_MAIN(23); + CUSTOM_ITEM_MAIN(23); + #endif + #if HAS_CUSTOM_ITEM_MAIN(24) + CUSTOM_TEST_MAIN(24); + CUSTOM_ITEM_MAIN(24); + #endif + #if HAS_CUSTOM_ITEM_MAIN(25) + CUSTOM_TEST_MAIN(25); + CUSTOM_ITEM_MAIN(25); + #endif + END_MENU(); + } + +#endif // CUSTOM_MENU_MAIN + void menu_main() { const bool busy = printingIsActive() #if ENABLED(SDSUPPORT) @@ -210,12 +348,12 @@ void menu_main() { SUBMENU(MSG_CONFIGURATION, menu_configuration); - #if ENABLED(CUSTOM_USER_MENUS) - if (TERN1(CUSTOM_MENU_ONLY_IDLE, !busy)) { - #ifdef CUSTOM_USER_MENU_TITLE - SUBMENU_P(PSTR(CUSTOM_USER_MENU_TITLE), menu_user); + #if ENABLED(CUSTOM_MENU_MAIN) + if (TERN1(CUSTOM_MENU_MAIN_ONLY_IDLE, !busy)) { + #ifdef CUSTOM_MENU_MAIN_TITLE + SUBMENU_P(PSTR(CUSTOM_MENU_MAIN_TITLE), custom_menus_main); #else - SUBMENU(MSG_USER_MENU, menu_user); + SUBMENU(MSG_CUSTOM_COMMANDS, custom_menus_main); #endif } #endif diff --git a/buildroot/share/PlatformIO/scripts/common-dependencies.h b/buildroot/share/PlatformIO/scripts/common-dependencies.h index 03fae56fdb..9ab437dd0b 100644 --- a/buildroot/share/PlatformIO/scripts/common-dependencies.h +++ b/buildroot/share/PlatformIO/scripts/common-dependencies.h @@ -67,9 +67,6 @@ #if ENABLED(CANCEL_OBJECTS) #define HAS_MENU_CANCELOBJECT #endif - #if ENABLED(CUSTOM_USER_MENUS) - #define HAS_MENU_CUSTOM - #endif #if EITHER(DELTA_CALIBRATION_MENU, DELTA_AUTO_CALIBRATION) #define HAS_MENU_DELTA_CALIBRATE #endif diff --git a/buildroot/tests/mega2560 b/buildroot/tests/mega2560 index e3209899ce..4498492ba5 100755 --- a/buildroot/tests/mega2560 +++ b/buildroot/tests/mega2560 @@ -21,7 +21,7 @@ opt_set MOTHERBOARD BOARD_AZTEEG_X3_PRO LCD_LANGUAGE fr \ opt_enable AUTO_BED_LEVELING_UBL RESTORE_LEVELING_AFTER_G28 DEBUG_LEVELING_FEATURE G26_MESH_VALIDATION ENABLE_LEVELING_FADE_HEIGHT SKEW_CORRECTION \ REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER LIGHTWEIGHT_UI STATUS_MESSAGE_SCROLLING SHOW_CUSTOM_BOOTSCREEN BOOT_MARLIN_LOGO_SMALL \ SDSUPPORT SDCARD_SORT_ALPHA USB_FLASH_DRIVE_SUPPORT AUTO_REPORT_SD_STATUS SCROLL_LONG_FILENAMES CANCEL_OBJECTS SOUND_MENU_ITEM \ - EEPROM_SETTINGS EEPROM_CHITCHAT GCODE_MACROS CUSTOM_USER_MENUS \ + EEPROM_SETTINGS EEPROM_CHITCHAT GCODE_MACROS CUSTOM_MENU_MAIN \ MULTI_NOZZLE_DUPLICATION CLASSIC_JERK LIN_ADVANCE EXTRA_LIN_ADVANCE_K QUICK_HOME \ LCD_SET_PROGRESS_MANUALLY PRINT_PROGRESS_SHOW_DECIMALS SHOW_REMAINING_TIME \ BABYSTEPPING BABYSTEP_XY NANODLP_Z_SYNC I2C_POSITION_ENCODERS M114_DETAIL @@ -37,7 +37,7 @@ opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER LIGHTWEIGHT_UI SHOW_CUS LCD_SET_PROGRESS_MANUALLY PRINT_PROGRESS_SHOW_DECIMALS SHOW_REMAINING_TIME STATUS_MESSAGE_SCROLLING SCROLL_LONG_FILENAMES \ SDSUPPORT SDCARD_SORT_ALPHA NO_SD_AUTOSTART USB_FLASH_DRIVE_SUPPORT CANCEL_OBJECTS \ Z_PROBE_SLED AUTO_BED_LEVELING_UBL UBL_HILBERT_CURVE RESTORE_LEVELING_AFTER_G28 DEBUG_LEVELING_FEATURE G26_MESH_VALIDATION ENABLE_LEVELING_FADE_HEIGHT \ - EEPROM_SETTINGS EEPROM_CHITCHAT GCODE_MACROS CUSTOM_USER_MENUS \ + EEPROM_SETTINGS EEPROM_CHITCHAT GCODE_MACROS CUSTOM_MENU_MAIN \ MULTI_NOZZLE_DUPLICATION CLASSIC_JERK LIN_ADVANCE QUICK_HOME \ NANODLP_Z_SYNC I2C_POSITION_ENCODERS M114_DETAIL \ SKEW_CORRECTION SKEW_CORRECTION_FOR_Z SKEW_CORRECTION_GCODE \ From cfa6c7d45ba72d1a0b26e6308191e008dcd0d9c9 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 19 Mar 2021 16:34:10 -0500 Subject: [PATCH 181/253] Improve max temp / target --- Marlin/Configuration.h | 1 + Marlin/src/gcode/host/M360.cpp | 2 +- Marlin/src/gcode/parser.h | 6 ++---- Marlin/src/inc/Conditionals_post.h | 12 +++++++++--- Marlin/src/lcd/dwin/e3v2/dwin.cpp | 8 +------- Marlin/src/lcd/extui/ui_api.cpp | 6 +++--- Marlin/src/lcd/menu/menu_advanced.cpp | 2 +- Marlin/src/lcd/menu/menu_filament.cpp | 2 +- Marlin/src/lcd/menu/menu_temperature.cpp | 16 ++++++++-------- Marlin/src/lcd/menu/menu_tune.cpp | 6 +++--- Marlin/src/lcd/menu/menu_ubl.cpp | 2 +- Marlin/src/lcd/tft/touch.cpp | 10 +++++----- Marlin/src/module/settings.cpp | 4 ++-- Marlin/src/module/temperature.cpp | 7 ++++--- Marlin/src/module/temperature.h | 15 +++++---------- 15 files changed, 47 insertions(+), 52 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 339dae7702..c9c83f9bb6 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -484,6 +484,7 @@ */ #define HOTEND_OVERSHOOT 15 // (°C) Forbid temperatures over MAXTEMP - OVERSHOOT #define BED_OVERSHOOT 10 // (°C) Forbid temperatures over MAXTEMP - OVERSHOOT +#define COOLER_OVERSHOOT 2 // (°C) Forbid temperatures closer than OVERSHOOT //=========================================================================== //============================= PID Settings ================================ diff --git a/Marlin/src/gcode/host/M360.cpp b/Marlin/src/gcode/host/M360.cpp index 50a4e45426..f3c242526d 100644 --- a/Marlin/src/gcode/host/M360.cpp +++ b/Marlin/src/gcode/host/M360.cpp @@ -177,7 +177,7 @@ void GcodeSuite::M360() { config_line_e(e, PSTR("MaxSpeed"), planner.settings.max_feedrate_mm_s[E_AXIS_N(e)]); config_line_e(e, PSTR("Acceleration"), planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(e)]); config_line_e(e, PSTR("Diameter"), TERN(NO_VOLUMETRICS, DEFAULT_NOMINAL_FILAMENT_DIA, planner.filament_size[e])); - config_line_e(e, PSTR("MaxTemp"), thermalManager.heater_maxtemp[e]); + config_line_e(e, PSTR("MaxTemp"), thermalManager.hotend_maxtemp[e]); } #endif } diff --git a/Marlin/src/gcode/parser.h b/Marlin/src/gcode/parser.h index 5a31a9943e..221500e076 100644 --- a/Marlin/src/gcode/parser.h +++ b/Marlin/src/gcode/parser.h @@ -390,15 +390,13 @@ public: } } - #define TEMP_UNIT(N) parser.to_temp_units(N) - #else // !TEMPERATURE_UNITS_SUPPORT + static inline float to_temp_units(int16_t c) { return (float)c; } + static inline float value_celsius() { return value_float(); } static inline float value_celsius_diff() { return value_float(); } - #define TEMP_UNIT(N) (N) - #endif // !TEMPERATURE_UNITS_SUPPORT static inline feedRate_t value_feedrate() { return MMM_TO_MMS(value_linear_units()); } diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index fb06a7a3f3..1cd7e5f0e9 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -2025,11 +2025,17 @@ #undef PIDTEMPBED #endif -#if HAS_HEATED_BED || HAS_TEMP_CHAMBER - #define BED_OR_CHAMBER 1 -#endif #if HAS_TEMP_COOLER && PIN_EXISTS(COOLER) #define HAS_COOLER 1 + #ifndef COOLER_OVERSHOOT + #define COOLER_OVERSHOOT 2 + #endif + #define COOLER_MIN_TARGET (COOLER_MINTEMP + (COOLER_OVERSHOOT)) + #define COOLER_MAX_TARGET (COOLER_MAXTEMP - (COOLER_OVERSHOOT)) +#endif + +#if HAS_HEATED_BED || HAS_TEMP_CHAMBER + #define BED_OR_CHAMBER 1 #endif #if HAS_TEMP_HOTEND || BED_OR_CHAMBER || HAS_TEMP_PROBE || HAS_TEMP_COOLER #define HAS_TEMP_SENSOR 1 diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.cpp b/Marlin/src/lcd/dwin/e3v2/dwin.cpp index 97a9fbd4da..c77e1ebd10 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.cpp +++ b/Marlin/src/lcd/dwin/e3v2/dwin.cpp @@ -112,12 +112,6 @@ #define MAX_PRINT_SPEED 999 #define MIN_PRINT_SPEED 10 -// Temp limits -#if HAS_HOTEND - #define MAX_E_TEMP (HEATER_0_MAXTEMP - (HOTEND_OVERSHOOT)) - #define MIN_E_TEMP HEATER_0_MINTEMP -#endif - #if HAS_HEATED_BED #define MIN_BED_TEMP BED_MINTEMP #endif @@ -1357,7 +1351,7 @@ void HMI_Move_Z() { return; } // E_Temp limit - LIMIT(HMI_ValueStruct.E_Temp, MIN_E_TEMP, MAX_E_TEMP); + LIMIT(HMI_ValueStruct.E_Temp, HEATER_0_MINTEMP, thermalManager.hotend_max_target(0)); // E_Temp value DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(temp_line), HMI_ValueStruct.E_Temp); } diff --git a/Marlin/src/lcd/extui/ui_api.cpp b/Marlin/src/lcd/extui/ui_api.cpp index 90f9e0b0bf..9e5e0b6a62 100644 --- a/Marlin/src/lcd/extui/ui_api.cpp +++ b/Marlin/src/lcd/extui/ui_api.cpp @@ -924,7 +924,7 @@ namespace ExtUI { enableHeater(heater); switch (heater) { #if HAS_HEATED_CHAMBER - case CHAMBER: thermalManager.setTargetChamber(LROUND(constrain(value, 0, CHAMBER_MAXTEMP - 10))); break; + case CHAMBER: thermalManager.setTargetChamber(LROUND(constrain(value, 0, CHAMBER_MAX_TARGET))); break; #endif #if HAS_COOLER case COOLER: thermalManager.setTargetCooler(LROUND(constrain(value, 0, COOLER_MAXTEMP))); break; @@ -935,7 +935,7 @@ namespace ExtUI { default: { #if HAS_HOTEND const int16_t e = heater - H0; - thermalManager.setTargetHotend(LROUND(constrain(value, 0, thermalManager.heater_maxtemp[e] - HOTEND_OVERSHOOT)), e); + thermalManager.setTargetHotend(LROUND(constrain(value, 0, thermalManager.hotend_max_target(e))), e); #endif } break; } @@ -949,7 +949,7 @@ namespace ExtUI { #if HAS_HOTEND const int16_t e = extruder - E0; enableHeater(extruder); - thermalManager.setTargetHotend(LROUND(constrain(value, 0, thermalManager.heater_maxtemp[e] - HOTEND_OVERSHOOT)), e); + thermalManager.setTargetHotend(LROUND(constrain(value, 0, thermalManager.hotend_max_target(e))), e); #endif } diff --git a/Marlin/src/lcd/menu/menu_advanced.cpp b/Marlin/src/lcd/menu/menu_advanced.cpp index aab93c3bdd..b6d55a5de6 100644 --- a/Marlin/src/lcd/menu/menu_advanced.cpp +++ b/Marlin/src/lcd/menu/menu_advanced.cpp @@ -315,7 +315,7 @@ void menu_backlash(); #if ENABLED(PID_AUTOTUNE_MENU) #define HOTEND_PID_EDIT_MENU_ITEMS(N) \ _HOTEND_PID_EDIT_MENU_ITEMS(N); \ - EDIT_ITEM_FAST_N(int3, N, MSG_PID_AUTOTUNE_E, &autotune_temp[N], 150, thermalManager.heater_maxtemp[N] - HOTEND_OVERSHOOT, []{ _lcd_autotune(heater_id_t(MenuItemBase::itemIndex)); }); + EDIT_ITEM_FAST_N(int3, N, MSG_PID_AUTOTUNE_E, &autotune_temp[N], 150, thermalManager.hotend_max_target(N), []{ _lcd_autotune(heater_id_t(MenuItemBase::itemIndex)); }); #else #define HOTEND_PID_EDIT_MENU_ITEMS(N) _HOTEND_PID_EDIT_MENU_ITEMS(N); #endif diff --git a/Marlin/src/lcd/menu/menu_filament.cpp b/Marlin/src/lcd/menu/menu_filament.cpp index 19601d678e..8df2af1dd0 100644 --- a/Marlin/src/lcd/menu/menu_filament.cpp +++ b/Marlin/src/lcd/menu/menu_filament.cpp @@ -95,7 +95,7 @@ void _menu_temp_filament_op(const PauseMode mode, const int8_t extruder) { ACTION_ITEM_N_S(m, ui.get_preheat_label(m), MSG_PREHEAT_M, _change_filament_with_preset); #endif EDIT_ITEM_FAST_N(int3, extruder, MSG_PREHEAT_CUSTOM, &thermalManager.temp_hotend[extruder].target, - EXTRUDE_MINTEMP, thermalManager.heater_maxtemp[extruder] - HOTEND_OVERSHOOT, + EXTRUDE_MINTEMP, thermalManager.hotend_max_target(extruder), _change_filament_with_custom ); END_MENU(); diff --git a/Marlin/src/lcd/menu/menu_temperature.cpp b/Marlin/src/lcd/menu/menu_temperature.cpp index 3a9906ddeb..8caf87d33b 100644 --- a/Marlin/src/lcd/menu/menu_temperature.cpp +++ b/Marlin/src/lcd/menu/menu_temperature.cpp @@ -47,11 +47,11 @@ // "Temperature" submenu items // -void Temperature::lcd_preheat(const int16_t e, const int8_t indh, const int8_t indb) { +void Temperature::lcd_preheat(const uint8_t e, const int8_t indh, const int8_t indb) { UNUSED(e); UNUSED(indh); UNUSED(indb); #if HAS_HOTEND if (indh >= 0 && ui.material_preset[indh].hotend_temp > 0) - setTargetHotend(_MIN(thermalManager.heater_maxtemp[e] - HOTEND_OVERSHOOT, ui.material_preset[indh].hotend_temp), e); + setTargetHotend(_MIN(thermalManager.hotend_max_target(e), ui.material_preset[indh].hotend_temp), e); #endif #if HAS_HEATED_BED if (indb >= 0 && ui.material_preset[indb].bed_temp > 0) setTargetBed(ui.material_preset[indb].bed_temp); @@ -70,7 +70,7 @@ void Temperature::lcd_preheat(const int16_t e, const int8_t indh, const int8_t i void do_preheat_end_m() { _preheat_end(editable.int8, 0); } #endif #if HAS_HEATED_BED - inline void _preheat_bed(const uint8_t m) { thermalManager.lcd_preheat(-1, -1, m); } + inline void _preheat_bed(const uint8_t m) { thermalManager.lcd_preheat(0, -1, m); } #endif #if HAS_COOLER inline void _precool_laser(const uint8_t m, const uint8_t e) { thermalManager.lcd_preheat(e, m, -1); } @@ -163,15 +163,15 @@ void menu_temperature() { // Nozzle [1-5]: // #if HOTENDS == 1 - EDIT_ITEM_FAST(int3, MSG_NOZZLE, &thermalManager.temp_hotend[0].target, 0, HEATER_0_MAXTEMP - (HOTEND_OVERSHOOT), []{ thermalManager.start_watching_hotend(0); }); + EDIT_ITEM_FAST(int3, MSG_NOZZLE, &thermalManager.temp_hotend[0].target, 0, thermalManager.hotend_max_target(0), []{ thermalManager.start_watching_hotend(0); }); #elif HAS_MULTI_HOTEND HOTEND_LOOP() - EDIT_ITEM_FAST_N(int3, e, MSG_NOZZLE_N, &thermalManager.temp_hotend[e].target, 0, thermalManager.heater_maxtemp[e] - (HOTEND_OVERSHOOT), []{ thermalManager.start_watching_hotend(MenuItemBase::itemIndex); }); + EDIT_ITEM_FAST_N(int3, e, MSG_NOZZLE_N, &thermalManager.temp_hotend[e].target, 0, thermalManager.hotend_max_target(e), []{ thermalManager.start_watching_hotend(MenuItemBase::itemIndex); }); #endif #if ENABLED(SINGLENOZZLE_STANDBY_TEMP) LOOP_S_L_N(e, 1, EXTRUDERS) - EDIT_ITEM_FAST_N(uint16_3, e, MSG_NOZZLE_STANDBY, &thermalManager.singlenozzle_temp[e], 0, thermalManager.heater_maxtemp[0] - (HOTEND_OVERSHOOT)); + EDIT_ITEM_FAST_N(uint16_3, e, MSG_NOZZLE_STANDBY, &thermalManager.singlenozzle_temp[e], 0, thermalManager.hotend_max_target(0)); #endif // @@ -185,7 +185,7 @@ void menu_temperature() { // Chamber: // #if HAS_HEATED_CHAMBER - EDIT_ITEM_FAST(int3, MSG_CHAMBER, &thermalManager.temp_chamber.target, 0, CHAMBER_MAXTEMP - 10, thermalManager.start_watching_chamber); + EDIT_ITEM_FAST(int3, MSG_CHAMBER, &thermalManager.temp_chamber.target, 0, CHAMBER_MAX_TARGET, thermalManager.start_watching_chamber); #endif // @@ -194,7 +194,7 @@ void menu_temperature() { #if HAS_COOLER editable.state = cooler.is_enabled(); EDIT_ITEM(bool, MSG_COOLER(TOGGLE), &cooler.state, []{ if (editable.state) cooler.disable(); else cooler.enable(); }); - EDIT_ITEM_FAST(int3, MSG_COOLER, &thermalManager.temp_cooler.target, COOLER_MINTEMP + 2, COOLER_MAXTEMP - 2, thermalManager.start_watching_cooler); + EDIT_ITEM_FAST(int3, MSG_COOLER, &thermalManager.temp_cooler.target, COOLER_MIN_TARGET, COOLER_MAX_TARGET, thermalManager.start_watching_cooler); #endif // diff --git a/Marlin/src/lcd/menu/menu_tune.cpp b/Marlin/src/lcd/menu/menu_tune.cpp index 0fbb57f2ac..feabae437d 100644 --- a/Marlin/src/lcd/menu/menu_tune.cpp +++ b/Marlin/src/lcd/menu/menu_tune.cpp @@ -126,15 +126,15 @@ void menu_tune() { // Nozzle [1-4]: // #if HOTENDS == 1 - EDIT_ITEM_FAST(int3, MSG_NOZZLE, &thermalManager.temp_hotend[0].target, 0, HEATER_0_MAXTEMP - HOTEND_OVERSHOOT, []{ thermalManager.start_watching_hotend(0); }); + EDIT_ITEM_FAST(int3, MSG_NOZZLE, &thermalManager.temp_hotend[0].target, 0, thermalManager.hotend_max_target(0), []{ thermalManager.start_watching_hotend(0); }); #elif HAS_MULTI_HOTEND HOTEND_LOOP() - EDIT_ITEM_FAST_N(int3, e, MSG_NOZZLE_N, &thermalManager.temp_hotend[e].target, 0, thermalManager.heater_maxtemp[e] - HOTEND_OVERSHOOT, []{ thermalManager.start_watching_hotend(MenuItemBase::itemIndex); }); + EDIT_ITEM_FAST_N(int3, e, MSG_NOZZLE_N, &thermalManager.temp_hotend[e].target, 0, thermalManager.hotend_max_target(e), []{ thermalManager.start_watching_hotend(MenuItemBase::itemIndex); }); #endif #if ENABLED(SINGLENOZZLE_STANDBY_TEMP) LOOP_S_L_N(e, 1, EXTRUDERS) - EDIT_ITEM_FAST_N(uint16_3, e, MSG_NOZZLE_STANDBY, &thermalManager.singlenozzle_temp[e], 0, thermalManager.heater_maxtemp[0] - HOTEND_OVERSHOOT); + EDIT_ITEM_FAST_N(uint16_3, e, MSG_NOZZLE_STANDBY, &thermalManager.singlenozzle_temp[e], 0, thermalManager.hotend_max_target(0)); #endif // diff --git a/Marlin/src/lcd/menu/menu_ubl.cpp b/Marlin/src/lcd/menu/menu_ubl.cpp index 79bedb9ea5..6c6076cf74 100644 --- a/Marlin/src/lcd/menu/menu_ubl.cpp +++ b/Marlin/src/lcd/menu/menu_ubl.cpp @@ -126,7 +126,7 @@ void _lcd_ubl_custom_mesh() { START_MENU(); BACK_ITEM(MSG_UBL_BUILD_MESH_MENU); #if HAS_HOTEND - EDIT_ITEM(int3, MSG_UBL_HOTEND_TEMP_CUSTOM, &custom_hotend_temp, EXTRUDE_MINTEMP, HEATER_0_MAXTEMP - HOTEND_OVERSHOOT); + EDIT_ITEM(int3, MSG_UBL_HOTEND_TEMP_CUSTOM, &custom_hotend_temp, EXTRUDE_MINTEMP, thermalManager.hotend_max_target(0)); #endif #if HAS_HEATED_BED EDIT_ITEM(int3, MSG_UBL_BED_TEMP_CUSTOM, &custom_bed_temp, BED_MINTEMP, BED_MAX_TARGET); diff --git a/Marlin/src/lcd/tft/touch.cpp b/Marlin/src/lcd/tft/touch.cpp index 29dd088c99..e8a01e889b 100644 --- a/Marlin/src/lcd/tft/touch.cpp +++ b/Marlin/src/lcd/tft/touch.cpp @@ -186,25 +186,25 @@ void Touch::touch(touch_control_t *control) { ui.clear_lcd(); if (heater >= 0) { // HotEnd #if HOTENDS == 1 - MenuItem_int3::action((const char *)GET_TEXT_F(MSG_NOZZLE), &thermalManager.temp_hotend[0].target, 0, thermalManager.heater_maxtemp[0] - 15, []{ thermalManager.start_watching_hotend(0); }); + MenuItem_int3::action((const char *)GET_TEXT_F(MSG_NOZZLE), &thermalManager.temp_hotend[0].target, 0, thermalManager.hotend_max_target(0), []{ thermalManager.start_watching_hotend(0); }); #else MenuItemBase::itemIndex = heater; - MenuItem_int3::action((const char *)GET_TEXT_F(MSG_NOZZLE_N), &thermalManager.temp_hotend[heater].target, 0, thermalManager.heater_maxtemp[heater] - 15, []{ thermalManager.start_watching_hotend(MenuItemBase::itemIndex); }); + MenuItem_int3::action((const char *)GET_TEXT_F(MSG_NOZZLE_N), &thermalManager.temp_hotend[heater].target, 0, thermalManager.hotend_max_target(heater), []{ thermalManager.start_watching_hotend(MenuItemBase::itemIndex); }); #endif } #if HAS_HEATED_BED else if (heater == H_BED) { - MenuItem_int3::action((const char *)GET_TEXT_F(MSG_BED), &thermalManager.temp_bed.target, 0, BED_MAXTEMP - 10, thermalManager.start_watching_bed); + MenuItem_int3::action((const char *)GET_TEXT_F(MSG_BED), &thermalManager.temp_bed.target, 0, BED_MAX_TARGET, thermalManager.start_watching_bed); } #endif #if HAS_HEATED_CHAMBER else if (heater == H_CHAMBER) { - MenuItem_int3::action((const char *)GET_TEXT_F(MSG_CHAMBER), &thermalManager.temp_chamber.target, 0, CHAMBER_MAXTEMP - 10, thermalManager.start_watching_chamber); + MenuItem_int3::action((const char *)GET_TEXT_F(MSG_CHAMBER), &thermalManager.temp_chamber.target, 0, CHAMBER_MAX_TARGET, thermalManager.start_watching_chamber); } #endif #if HAS_COOLER else if (heater == H_COOLER) { - MenuItem_int3::action((const char *)GET_TEXT_F(MSG_COOLER), &thermalManager.temp_cooler.target, 0, COOLER_MAXTEMP - 8, thermalManager.start_watching_cooler); + MenuItem_int3::action((const char *)GET_TEXT_F(MSG_COOLER), &thermalManager.temp_cooler.target, 0, COOLER_MAX_TARGET, thermalManager.start_watching_cooler); } #endif diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index d38ad51934..bf10902c60 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -3386,10 +3386,10 @@ void MarlinSettings::reset() { SERIAL_ECHOLNPAIR_P( PSTR(" M145 S"), i #if HAS_HOTEND - , PSTR(" H"), TEMP_UNIT(ui.material_preset[i].hotend_temp) + , PSTR(" H"), parser.to_temp_units(ui.material_preset[i].hotend_temp) #endif #if HAS_HEATED_BED - , SP_B_STR, TEMP_UNIT(ui.material_preset[i].bed_temp) + , SP_B_STR, parser.to_temp_units(ui.material_preset[i].bed_temp) #endif #if HAS_FAN , PSTR(" F"), ui.material_preset[i].fan_speed diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index a000a31de7..16553193ec 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -253,7 +253,7 @@ const char str_t_thermal_runaway[] PROGMEM = STR_T_THERMAL_RUNAWAY, #if HAS_HOTEND hotend_info_t Temperature::temp_hotend[HOTEND_TEMPS]; // = { 0 } - const uint16_t Temperature::heater_maxtemp[HOTENDS] = ARRAY_BY_HOTENDS(HEATER_0_MAXTEMP, HEATER_1_MAXTEMP, HEATER_2_MAXTEMP, HEATER_3_MAXTEMP, HEATER_4_MAXTEMP, HEATER_5_MAXTEMP, HEATER_6_MAXTEMP, HEATER_7_MAXTEMP); + const uint16_t Temperature::hotend_maxtemp[HOTENDS] = ARRAY_BY_HOTENDS(HEATER_0_MAXTEMP, HEATER_1_MAXTEMP, HEATER_2_MAXTEMP, HEATER_3_MAXTEMP, HEATER_4_MAXTEMP, HEATER_5_MAXTEMP, HEATER_6_MAXTEMP, HEATER_7_MAXTEMP); #endif #if ENABLED(AUTO_POWER_E_FANS) @@ -267,6 +267,7 @@ const char str_t_thermal_runaway[] PROGMEM = STR_T_THERMAL_RUNAWAY, #if ENABLED(AUTO_POWER_COOLER_FAN) uint8_t Temperature::coolerfan_speed; // = 0 #endif + #if HAS_FAN uint8_t Temperature::fan_speed[FAN_COUNT]; // = { 0 } @@ -552,7 +553,7 @@ volatile bool Temperature::raw_temps_ready = false; TERN_(HAS_AUTO_FAN, next_auto_fan_check_ms = next_temp_ms + 2500UL); - if (target > GHV(CHAMBER_MAX_TARGET, BED_MAX_TARGET, temp_range[heater_id].maxtemp - HOTEND_OVERSHOOT)) { + if (target > GHV(CHAMBER_MAX_TARGET, BED_MAX_TARGET, temp_range[heater_id].maxtemp - (HOTEND_OVERSHOOT))) { SERIAL_ECHOLNPGM(STR_PID_TEMP_TOO_HIGH); TERN_(EXTENSIBLE_UI, ExtUI::onPidTuning(ExtUI::result_t::PID_TEMP_TOO_HIGH)); return; @@ -1512,7 +1513,7 @@ void Temperature::manage_heater() { if (cooler.is_enabled()) { flag_cooler_state = true; // used to allow M106 fan control when cooler is disabled - if (temp_cooler.target == 0) temp_cooler.target = COOLER_MINTEMP; + if (temp_cooler.target == 0) temp_cooler.target = COOLER_MIN_TARGET; if (ELAPSED(ms, next_cooler_check_ms)) { next_cooler_check_ms = ms + COOLER_CHECK_INTERVAL; if (temp_cooler.celsius > temp_cooler.target) { diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index e69183f6f5..abd2eabac2 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -323,7 +323,8 @@ class Temperature { #if HAS_HOTEND #define HOTEND_TEMPS (HOTENDS + ENABLED(TEMP_SENSOR_1_AS_REDUNDANT)) static hotend_info_t temp_hotend[HOTEND_TEMPS]; - static const uint16_t heater_maxtemp[HOTENDS]; + static const uint16_t hotend_maxtemp[HOTENDS]; + FORCE_INLINE static uint16_t hotend_max_target(const uint8_t e) { return hotend_maxtemp[e] - (HOTEND_OVERSHOOT); } #endif TERN_(HAS_HEATED_BED, static bed_info_t temp_bed); TERN_(HAS_TEMP_PROBE, static probe_info_t temp_probe); @@ -639,7 +640,7 @@ class Temperature { start_preheat_time(ee); #endif TERN_(AUTO_POWER_CONTROL, if (celsius) powerManager.power_on()); - temp_hotend[ee].target = _MIN(celsius, temp_range[ee].maxtemp - HOTEND_OVERSHOOT); + temp_hotend[ee].target = _MIN(celsius, hotend_max_target(ee)); start_watching_hotend(ee); } @@ -785,13 +786,7 @@ class Temperature { #if HAS_COOLER static void setTargetCooler(const int16_t celsius) { - temp_cooler.target = - #ifdef COOLER_MAXTEMP - _MIN(celsius, COOLER_MAXTEMP - 10) - #else - celsius - #endif - ; + temp_cooler.target = constrain(celsius, COOLER_MIN_TARGET, COOLER_MAX_TARGET); start_watching_cooler(); } #endif @@ -878,7 +873,7 @@ class Temperature { TERN_(HAS_DISPLAY, static void set_heating_message(const uint8_t e)); #if HAS_LCD_MENU && HAS_TEMPERATURE - static void lcd_preheat(const int16_t e, const int8_t indh, const int8_t indb); + static void lcd_preheat(const uint8_t e, const int8_t indh, const int8_t indb); #endif private: From f7aaa2e1c758dae56fb0d3dbb743a1c5c04245d2 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 19 Mar 2021 16:39:05 -0500 Subject: [PATCH 182/253] Add typedef extra_fan_t --- Marlin/src/lcd/menu/menu_item.h | 2 +- Marlin/src/module/temperature.cpp | 21 ++++++++++++++------- Marlin/src/module/temperature.h | 5 +++-- 3 files changed, 18 insertions(+), 10 deletions(-) diff --git a/Marlin/src/lcd/menu/menu_item.h b/Marlin/src/lcd/menu/menu_item.h index 6873f209b4..945a892799 100644 --- a/Marlin/src/lcd/menu/menu_item.h +++ b/Marlin/src/lcd/menu/menu_item.h @@ -473,7 +473,7 @@ class MenuItem_bool : public MenuEditItemBase { #define _FAN_EDIT_ITEMS(F,L) do{ \ editable.uint8 = thermalManager.fan_speed[F]; \ EDIT_ITEM_FAST_N(percent, F, MSG_##L, &editable.uint8, 0, 255, on_fan_update); \ - EDIT_EXTRA_FAN_SPEED(percent, F, MSG_EXTRA_##L, &thermalManager.new_fan_speed[F], 3, 255); \ + EDIT_EXTRA_FAN_SPEED(percent, F, MSG_EXTRA_##L, &thermalManager.extra_fan_speed[F].speed, 3, 255); \ }while(0) #if FAN_COUNT > 1 diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 16553193ec..dd7a36a82a 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -273,19 +273,26 @@ const char str_t_thermal_runaway[] PROGMEM = STR_T_THERMAL_RUNAWAY, uint8_t Temperature::fan_speed[FAN_COUNT]; // = { 0 } #if ENABLED(EXTRA_FAN_SPEED) - uint8_t Temperature::old_fan_speed[FAN_COUNT], Temperature::new_fan_speed[FAN_COUNT]; - void Temperature::set_temp_fan_speed(const uint8_t fan, const uint16_t tmp_temp) { - switch (tmp_temp) { + Temperature::extra_fan_t Temperature::extra_fan_speed[FAN_COUNT]; + + /** + * Handle the M106 P T command: + * T1 = Restore fan speed saved on the last T2 + * T2 = Save the fan speed, then set to the last T<3-255> value + * T<3-255> = Set the "extra fan speed" + */ + void Temperature::set_temp_fan_speed(const uint8_t fan, const uint16_t command_or_speed) { + switch (command_or_speed) { case 1: - set_fan_speed(fan, old_fan_speed[fan]); + set_fan_speed(fan, extra_fan_speed[fan].saved); break; case 2: - old_fan_speed[fan] = fan_speed[fan]; - set_fan_speed(fan, new_fan_speed[fan]); + extra_fan_speed[fan].saved = fan_speed[fan]; + set_fan_speed(fan, extra_fan_speed[fan].speed); break; default: - new_fan_speed[fan] = _MIN(tmp_temp, 255U); + extra_fan_speed[fan].speed = _MIN(command_or_speed, 255U); break; } } diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index abd2eabac2..38270fc9c4 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -561,8 +561,9 @@ class Temperature { } #if ENABLED(EXTRA_FAN_SPEED) - static uint8_t old_fan_speed[FAN_COUNT], new_fan_speed[FAN_COUNT]; - static void set_temp_fan_speed(const uint8_t fan, const uint16_t tmp_temp); + typedef struct { uint8_t saved, speed; } extra_fan_t; + static extra_fan_t extra_fan_speed[FAN_COUNT]; + static void set_temp_fan_speed(const uint8_t fan, const uint16_t command_or_speed); #endif #if EITHER(PROBING_FANS_OFF, ADVANCED_PAUSE_FANS_PAUSE) From 58f0330d3f51115dbc8cda792105fe66d4c61241 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 19 Mar 2021 16:41:47 -0500 Subject: [PATCH 183/253] MKS / E3V2 LCD code cleanup --- Marlin/src/lcd/HD44780/marlinui_HD44780.cpp | 6 +- Marlin/src/lcd/dwin/e3v2/dwin.cpp | 72 ++-- .../anycubic_i3mega/anycubic_i3mega_lcd.cpp | 13 +- .../lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp | 4 +- .../extui/lib/dgus/mks/DGUSScreenHandler.cpp | 325 +++++++----------- .../extui/lib/dgus/mks/DGUSScreenHandler.h | 1 + .../src/lcd/extui/lib/mks_ui/draw_dialog.cpp | 29 +- .../extui/lib/mks_ui/draw_filament_change.cpp | 12 +- .../lib/mks_ui/draw_filament_settings.cpp | 2 +- .../lcd/extui/lib/mks_ui/draw_number_key.cpp | 4 +- Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp | 6 +- Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h | 44 ++- 12 files changed, 210 insertions(+), 308 deletions(-) diff --git a/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp b/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp index 15b3d8bfb3..653a384120 100644 --- a/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp +++ b/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp @@ -571,9 +571,9 @@ FORCE_INLINE void _draw_bed_status(const bool blink) { #if ENABLED(LCD_PROGRESS_BAR) void MarlinUI::draw_progress_bar(const uint8_t percent) { - const int16_t tix = (int16_t)(percent * (LCD_WIDTH) * 3) / 100, - cel = tix / 3, - rem = tix % 3; + const int16_t tix = int16_t(percent * (LCD_WIDTH) * 3) / 100, + cel = tix / 3, + rem = tix % 3; uint8_t i = LCD_WIDTH; char msg[LCD_WIDTH + 1], b = ' '; msg[LCD_WIDTH] = '\0'; diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.cpp b/Marlin/src/lcd/dwin/e3v2/dwin.cpp index c77e1ebd10..60a22f22f1 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.cpp +++ b/Marlin/src/lcd/dwin/e3v2/dwin.cpp @@ -102,19 +102,11 @@ #define DWIN_FONT_HEAD font10x20 #define MENU_CHAR_LIMIT 24 -#define STATUS_Y 360 - -// Fan speed limit -#define FANON 255 -#define FANOFF 0 +#define STATUS_Y 360 // Print speed limit -#define MAX_PRINT_SPEED 999 -#define MIN_PRINT_SPEED 10 - -#if HAS_HEATED_BED - #define MIN_BED_TEMP BED_MINTEMP -#endif +#define MIN_PRINT_SPEED 10 +#define MAX_PRINT_SPEED 999 // Feedspeed limit (max feedspeed = DEFAULT_MAX_FEEDRATE * 2) #define MIN_MAXFEEDSPEED 1 @@ -883,11 +875,11 @@ void Draw_Tune_Menu() { #if HAS_HOTEND Draw_Menu_Line(TUNE_CASE_TEMP, ICON_HotendTemp); - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(TUNE_CASE_TEMP), thermalManager.temp_hotend[0].target); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(TUNE_CASE_TEMP), thermalManager.degTargetHotend(0)); #endif #if HAS_HEATED_BED Draw_Menu_Line(TUNE_CASE_BED, ICON_BedTemp); - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(TUNE_CASE_BED), thermalManager.temp_bed.target); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(TUNE_CASE_BED), thermalManager.degTargetBed()); #endif #if HAS_FAN Draw_Menu_Line(TUNE_CASE_FAN, ICON_FanSpeed); @@ -1394,7 +1386,7 @@ void HMI_Move_Z() { return; } // Bed_Temp limit - LIMIT(HMI_ValueStruct.Bed_Temp, MIN_BED_TEMP, BED_MAX_TARGET); + LIMIT(HMI_ValueStruct.Bed_Temp, BED_MINTEMP, BED_MAX_TARGET); // Bed_Temp value DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(bed_line), HMI_ValueStruct.Bed_Temp); } @@ -1438,7 +1430,7 @@ void HMI_Move_Z() { return; } // Fan_speed limit - LIMIT(HMI_ValueStruct.Fan_speed, FANOFF, FANON); + LIMIT(HMI_ValueStruct.Fan_speed, 0, 255); // Fan_speed value DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(fan_line), HMI_ValueStruct.Fan_speed); } @@ -1882,9 +1874,9 @@ void Draw_Status_Area(const bool with_update) { #if HAS_HOTEND DWIN_ICON_Show(ICON, ICON_HotendTemp, 10, 383); - DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 28, 384, thermalManager.temp_hotend[0].celsius); + DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 28, 384, thermalManager.degHotend(0)); DWIN_Draw_String(false, false, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 25 + 3 * STAT_CHR_W + 5, 384, F("/")); - DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 25 + 4 * STAT_CHR_W + 6, 384, thermalManager.temp_hotend[0].target); + DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 25 + 4 * STAT_CHR_W + 6, 384, thermalManager.degTargetHotend(0)); DWIN_ICON_Show(ICON, ICON_StepE, 112, 417); DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 116 + 2 * STAT_CHR_W, 417, planner.flow_percentage[0]); @@ -1893,9 +1885,9 @@ void Draw_Status_Area(const bool with_update) { #if HAS_HEATED_BED DWIN_ICON_Show(ICON, ICON_BedTemp, 10, 416); - DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 28, 417, thermalManager.temp_bed.celsius); + DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 28, 417, thermalManager.degBed()); DWIN_Draw_String(false, false, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 25 + 3 * STAT_CHR_W + 5, 417, F("/")); - DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 25 + 4 * STAT_CHR_W + 6, 417, thermalManager.temp_bed.target); + DWIN_Draw_IntValue(true, true, 0, DWIN_FONT_STAT, Color_White, Color_Bg_Black, 3, 25 + 4 * STAT_CHR_W + 6, 417, thermalManager.degTargetBed()); #endif DWIN_ICON_Show(ICON, ICON_Speed, 113, 383); @@ -2157,8 +2149,8 @@ void HMI_SelectFile() { #if FAN_COUNT > 0 // All fans on for Ender 3 v2 ? // The slicer should manage this for us. - // for (uint8_t i = 0; i < FAN_COUNT; i++) - // thermalManager.fan_speed[i] = FANON; + //for (uint8_t i = 0; i < FAN_COUNT; i++) + // thermalManager.fan_speed[i] = 255; #endif Goto_PrintProcess(); @@ -2539,11 +2531,11 @@ void Draw_Temperature_Menu() { #define _TMENU_ICON(N) Draw_Menu_Line(++i, ICON_SetEndTemp + (N) - 1) #if HAS_HOTEND _TMENU_ICON(TEMP_CASE_TEMP); - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(i), thermalManager.temp_hotend[0].target); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(i), thermalManager.degTargetHotend(0)); #endif #if HAS_HEATED_BED _TMENU_ICON(TEMP_CASE_BED); - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(i), thermalManager.temp_bed.target); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Color_Bg_Black, 3, 216, MBASE(i), thermalManager.degTargetBed()); #endif #if HAS_FAN _TMENU_ICON(TEMP_CASE_FAN); @@ -2711,7 +2703,7 @@ void HMI_AxisMove() { case 4: // Extruder // window tips #ifdef PREVENT_COLD_EXTRUSION - if (thermalManager.temp_hotend[0].celsius < EXTRUDE_MINTEMP) { + if (thermalManager.degHotend(0) < EXTRUDE_MINTEMP) { HMI_flag.ETempTooLow_flag = true; Popup_Window_ETempTooLow(); DWIN_UpdateLCD(); @@ -2752,16 +2744,16 @@ void HMI_Temperature() { #if HAS_HOTEND case TEMP_CASE_TEMP: // Nozzle temperature checkkey = ETemp; - HMI_ValueStruct.E_Temp = thermalManager.temp_hotend[0].target; - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(1), thermalManager.temp_hotend[0].target); + HMI_ValueStruct.E_Temp = thermalManager.degTargetHotend(0); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(1), HMI_ValueStruct.E_Temp); EncoderRate.enabled = true; break; #endif #if HAS_HEATED_BED case TEMP_CASE_BED: // Bed temperature checkkey = BedTemp; - HMI_ValueStruct.Bed_Temp = thermalManager.temp_bed.target; - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(2), thermalManager.temp_bed.target); + HMI_ValueStruct.Bed_Temp = thermalManager.degTargetBed(); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(2), HMI_ValueStruct.Bed_Temp); EncoderRate.enabled = true; break; #endif @@ -2769,7 +2761,7 @@ void HMI_Temperature() { case TEMP_CASE_FAN: // Fan speed checkkey = FanSpeed; HMI_ValueStruct.Fan_speed = thermalManager.fan_speed[0]; - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(3), thermalManager.fan_speed[0]); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(3), HMI_ValueStruct.Fan_speed); EncoderRate.enabled = true; break; #endif @@ -2801,7 +2793,7 @@ void HMI_Temperature() { #ifdef USE_STRING_HEADINGS Draw_Title("PLA Settings"); // TODO: GET_TEXT_F #else - DWIN_Frame_TitleCopy(1, 56, 16, 141, 28); // "PLA Settings" + DWIN_Frame_TitleCopy(1, 56, 16, 141, 28); // "PLA Settings" #endif #ifdef USE_STRING_TITLES DWIN_Draw_Label(MBASE(PREHEAT_CASE_TEMP), F("Nozzle Temp")); @@ -2817,7 +2809,7 @@ void HMI_Temperature() { #else DWIN_Frame_AreaCopy(1, 157, 76, 181, 86, LBLX, MBASE(PREHEAT_CASE_TEMP)); DWIN_Frame_AreaCopy(1, 197, 104, 238, 114, LBLX + 27, MBASE(PREHEAT_CASE_TEMP)); - DWIN_Frame_AreaCopy(1, 1, 89, 83, 101, LBLX + 71, MBASE(PREHEAT_CASE_TEMP)); // PLA nozzle temp + DWIN_Frame_AreaCopy(1, 1, 89, 83, 101, LBLX + 71, MBASE(PREHEAT_CASE_TEMP)); // PLA nozzle temp #if HAS_HEATED_BED DWIN_Frame_AreaCopy(1, 157, 76, 181, 86, LBLX, MBASE(PREHEAT_CASE_BED) + 3); DWIN_Frame_AreaCopy(1, 240, 104, 264, 114, LBLX + 27, MBASE(PREHEAT_CASE_BED) + 3); @@ -2828,7 +2820,7 @@ void HMI_Temperature() { DWIN_Frame_AreaCopy(1, 0, 119, 64, 132, LBLX + 27, MBASE(PREHEAT_CASE_FAN)); // PLA fan speed #endif #if ENABLED(EEPROM_SETTINGS) - DWIN_Frame_AreaCopy(1, 97, 165, 229, 177, LBLX, MBASE(PREHEAT_CASE_SAVE)); // Save PLA configuration + DWIN_Frame_AreaCopy(1, 97, 165, 229, 177, LBLX, MBASE(PREHEAT_CASE_SAVE)); // Save PLA configuration #endif #endif } @@ -3285,22 +3277,22 @@ void HMI_Tune() { case TUNE_CASE_SPEED: // Print speed checkkey = PrintSpeed; HMI_ValueStruct.print_speed = feedrate_percentage; - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(TUNE_CASE_SPEED + MROWS - index_tune), feedrate_percentage); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(TUNE_CASE_SPEED + MROWS - index_tune), HMI_ValueStruct.print_speed); EncoderRate.enabled = true; break; #if HAS_HOTEND case TUNE_CASE_TEMP: // Nozzle temp checkkey = ETemp; - HMI_ValueStruct.E_Temp = thermalManager.temp_hotend[0].target; - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(TUNE_CASE_TEMP + MROWS - index_tune), thermalManager.temp_hotend[0].target); + HMI_ValueStruct.E_Temp = thermalManager.degTargetHotend(0); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(TUNE_CASE_TEMP + MROWS - index_tune), HMI_ValueStruct.E_Temp); EncoderRate.enabled = true; break; #endif #if HAS_HEATED_BED case TUNE_CASE_BED: // Bed temp checkkey = BedTemp; - HMI_ValueStruct.Bed_Temp = thermalManager.temp_bed.target; - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(TUNE_CASE_BED + MROWS - index_tune), thermalManager.temp_bed.target); + HMI_ValueStruct.Bed_Temp = thermalManager.degTargetBed(); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(TUNE_CASE_BED + MROWS - index_tune), HMI_ValueStruct.Bed_Temp); EncoderRate.enabled = true; break; #endif @@ -3308,7 +3300,7 @@ void HMI_Tune() { case TUNE_CASE_FAN: // Fan speed checkkey = FanSpeed; HMI_ValueStruct.Fan_speed = thermalManager.fan_speed[0]; - DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(TUNE_CASE_FAN + MROWS - index_tune), thermalManager.fan_speed[0]); + DWIN_Draw_IntValue(true, true, 0, font8x16, Color_White, Select_Color, 3, 216, MBASE(TUNE_CASE_FAN + MROWS - index_tune), HMI_ValueStruct.Fan_speed); EncoderRate.enabled = true; break; #endif @@ -3626,8 +3618,8 @@ void EachMomentUpdate() { if (HMI_flag.pause_action && printingIsPaused() && !planner.has_blocks_queued()) { HMI_flag.pause_action = false; #if ENABLED(PAUSE_HEAT) - TERN_(HAS_HOTEND, resume_hotend_temp = thermalManager.temp_hotend[0].target); - TERN_(HAS_HEATED_BED, resume_bed_temp = thermalManager.temp_bed.target); + TERN_(HAS_HOTEND, resume_hotend_temp = thermalManager.degTargetHotend(0)); + TERN_(HAS_HEATED_BED, resume_bed_temp = thermalManager.degTargetBed()); thermalManager.disable_all_heaters(); #endif queue.inject_P(PSTR("G1 F1200 X0 Y0")); diff --git a/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp index 95b07f5c68..aa08f683f7 100644 --- a/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp +++ b/Marlin/src/lcd/extui/lib/anycubic_i3mega/anycubic_i3mega_lcd.cpp @@ -560,32 +560,31 @@ void AnycubicTFTClass::GetCommandFromTFT() { switch (a_command) { case 0: { // A0 GET HOTEND TEMP - float hotendActualTemp = getActualTemp_celsius((extruder_t) (extruder_t) E0); + const float hotendActualTemp = getActualTemp_celsius(E0); SEND_PGM_VAL("A0V ", int(hotendActualTemp + 0.5)); } break; case 1: { // A1 GET HOTEND TARGET TEMP - float hotendTargetTemp = getTargetTemp_celsius((extruder_t) (extruder_t) E0); + const float hotendTargetTemp = getTargetTemp_celsius(E0); SEND_PGM_VAL("A1V ", int(hotendTargetTemp + 0.5)); } break; case 2: { // A2 GET HOTBED TEMP - float heatedBedActualTemp = getActualTemp_celsius((heater_t) BED); + const float heatedBedActualTemp = getActualTemp_celsius(BED); SEND_PGM_VAL("A2V ", int(heatedBedActualTemp + 0.5)); } break; case 3: { // A3 GET HOTBED TARGET TEMP - float heatedBedTargetTemp = getTargetTemp_celsius((heater_t) BED); + const float heatedBedTargetTemp = getTargetTemp_celsius(BED); SEND_PGM_VAL("A3V ", int(heatedBedTargetTemp + 0.5)); } break; case 4: { // A4 GET FAN SPEED - float fanPercent = getActualFan_percent(FAN0); - fanPercent = constrain(fanPercent, 0, 100); - SEND_PGM_VAL("A4V ", int(fanPercent)); + const float fanPercent = getActualFan_percent(FAN0); + SEND_PGM_VAL("A4V ", int(LIMIT(fanPercent, 0, 100))); } break; case 5: { // A5 GET CURRENT COORDINATE diff --git a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp index 78865bbfd6..9f436a356c 100644 --- a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp @@ -764,8 +764,8 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { VPHELPER(VP_SD_AbortPrintConfirmed, nullptr, ScreenHandler.DGUSLCD_SD_ReallyAbort, nullptr), VPHELPER(VP_SD_Print_Setting, nullptr, ScreenHandler.DGUSLCD_SD_PrintTune, nullptr), #if ENABLED(BABYSTEPPING) - VPHELPER(VP_SD_Print_LiveAdjustZ,nullptr, ScreenHandler.HandleLiveAdjustZ, &ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<2>), - VPHELPER(VP_ZOffset_DE_DIS,&z_offset_add,nullptr, &ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<2>), + VPHELPER(VP_SD_Print_LiveAdjustZ, nullptr, ScreenHandler.HandleLiveAdjustZ, &ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<2>), + VPHELPER(VP_ZOffset_DE_DIS, &z_offset_add, nullptr, &ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<2>), #endif #if HAS_BED_PROBE VPHELPER(VP_OFFSET_X, &probe.offset.x, ScreenHandler.GetOffsetValue,ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<2>), diff --git a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp index bf2b05dcbf..0efb70b686 100644 --- a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp @@ -111,7 +111,7 @@ void DGUSScreenHandler::DGUSLCD_SendPrintTimeToDisplay_MKS(DGUS_VP_Variable &var void DGUSScreenHandler::DGUSLCD_SetUint8(DGUS_VP_Variable &var, void *val_ptr) { if (var.memadr) { - uint16_t value = swap16(*(uint16_t*)val_ptr); + const uint16_t value = swap16(*(uint16_t*)val_ptr); DEBUG_ECHOLNPAIR("FAN value get:", value); *(uint8_t*)var.memadr = map(constrain(value, 0, 255), 0, 255, 0, 255); DEBUG_ECHOLNPAIR("FAN value change:", *(uint8_t*)var.memadr); @@ -314,7 +314,7 @@ void DGUSScreenHandler::ScreenChangeHook(DGUS_VP_Variable &var, void *val_ptr) { } void DGUSScreenHandler::ScreenBackChange(DGUS_VP_Variable &var, void *val_ptr) { - uint16_t target = swap16(*(uint16_t *)val_ptr); + const uint16_t target = swap16(*(uint16_t *)val_ptr); DEBUG_ECHOLNPAIR(" back = 0x%x", target); switch (target) { } @@ -330,7 +330,7 @@ void DGUSScreenHandler::ZoffsetConfirm(DGUS_VP_Variable &var, void *val_ptr) { void DGUSScreenHandler::GetTurnOffCtrl(DGUS_VP_Variable &var, void *val_ptr) { DEBUG_ECHOLNPGM("ctrl turn off\n"); - uint16_t value = swap16(*(uint16_t *)val_ptr); + const uint16_t value = swap16(*(uint16_t *)val_ptr); switch (value) { case 0 ... 1: DGUSAutoTurnOff = (bool)value; break; default: break; @@ -339,7 +339,7 @@ void DGUSScreenHandler::GetTurnOffCtrl(DGUS_VP_Variable &var, void *val_ptr) { void DGUSScreenHandler::GetMinExtrudeTemp(DGUS_VP_Variable &var, void *val_ptr) { DEBUG_ECHOLNPGM("MinExtrudeTempChange DistanceChange"); - uint16_t value = swap16(*(uint16_t *)val_ptr); + const uint16_t value = swap16(*(uint16_t *)val_ptr); thermalManager.extrude_min_temp = value; min_ex_temp = value; settings.save(); @@ -347,7 +347,7 @@ void DGUSScreenHandler::GetMinExtrudeTemp(DGUS_VP_Variable &var, void *val_ptr) void DGUSScreenHandler::GetZoffsetDistance(DGUS_VP_Variable &var, void *val_ptr) { DEBUG_ECHOLNPGM("Zoffset DistanceChange"); - uint16_t value = swap16(*(uint16_t *)val_ptr); + const uint16_t value = swap16(*(uint16_t *)val_ptr); float val_distance = 0; switch (value) { case 0: val_distance = 0.01; break; @@ -365,7 +365,7 @@ void DGUSScreenHandler::GetManualMovestep(DGUS_VP_Variable &var, void *val_ptr) } void DGUSScreenHandler::EEPROM_CTRL(DGUS_VP_Variable &var, void *val_ptr) { - uint16_t eep_flag = swap16(*(uint16_t *)val_ptr); + const uint16_t eep_flag = swap16(*(uint16_t *)val_ptr); switch (eep_flag) { case 0: settings.save(); @@ -383,7 +383,7 @@ void DGUSScreenHandler::EEPROM_CTRL(DGUS_VP_Variable &var, void *val_ptr) { } void DGUSScreenHandler::Z_offset_select(DGUS_VP_Variable &var, void *val_ptr) { - uint16_t z_value = swap16(*(uint16_t *)val_ptr); + const uint16_t z_value = swap16(*(uint16_t *)val_ptr); switch (z_value) { case 0: Z_distance = 0.01; break; case 1: Z_distance = 0.1; break; @@ -410,7 +410,7 @@ void DGUSScreenHandler::GetOffsetValue(DGUS_VP_Variable &var, void *val_ptr) { } void DGUSScreenHandler::LanguageChange_MKS(DGUS_VP_Variable &var, void *val_ptr) { - uint16_t lag_flag = swap16(*(uint16_t *)val_ptr); + const uint16_t lag_flag = swap16(*(uint16_t *)val_ptr); switch (lag_flag) { case MKS_SimpleChinese: DGUS_LanguageDisplay(MKS_SimpleChinese); @@ -435,7 +435,7 @@ void DGUSScreenHandler::LanguageChange_MKS(DGUS_VP_Variable &var, void *val_ptr) #endif void DGUSScreenHandler::Level_Ctrl_MKS(DGUS_VP_Variable &var, void *val_ptr) { - uint16_t lev_but = swap16(*(uint16_t *)val_ptr); + const uint16_t lev_but = swap16(*(uint16_t *)val_ptr); #if ENABLED(MESH_BED_LEVELING) auto cs = getCurrentScreen(); #endif @@ -482,7 +482,7 @@ void DGUSScreenHandler::Level_Ctrl_MKS(DGUS_VP_Variable &var, void *val_ptr) { } void DGUSScreenHandler::MeshLevelDistanceConfig(DGUS_VP_Variable &var, void *val_ptr) { - uint16_t mesh_dist = swap16(*(uint16_t *)val_ptr); + const uint16_t mesh_dist = swap16(*(uint16_t *)val_ptr); switch (mesh_dist) { case 0: mesh_adj_distance = 0.01; break; case 1: mesh_adj_distance = 0.1; break; @@ -493,7 +493,7 @@ void DGUSScreenHandler::MeshLevelDistanceConfig(DGUS_VP_Variable &var, void *val void DGUSScreenHandler::MeshLevel(DGUS_VP_Variable &var, void *val_ptr) { #if ENABLED(MESH_BED_LEVELING) - uint16_t mesh_value = swap16(*(uint16_t *)val_ptr); + const uint16_t mesh_value = swap16(*(uint16_t *)val_ptr); // static uint8_t a_first_level = 1; char cmd_buf[30]; float offset = mesh_adj_distance; @@ -586,20 +586,16 @@ void DGUSScreenHandler::MeshLevel(DGUS_VP_Variable &var, void *val_ptr) { } void DGUSScreenHandler::LCD_BLK_Adjust(DGUS_VP_Variable &var, void *val_ptr) { + const uint16_t lcd_value = swap16(*(uint16_t *)val_ptr); - uint16_t lcd_value = swap16(*(uint16_t *)val_ptr); + lcd_default_light = constrain(lcd_value, 10, 100); - if (lcd_value > 100) lcd_value = 100; - else if (lcd_value < 10) lcd_value = 10; - - lcd_default_light = lcd_value; - - const uint16_t lcd_data[2] = {lcd_default_light, lcd_default_light}; + const uint16_t lcd_data[2] = { lcd_default_light, lcd_default_light }; dgusdisplay.WriteVariable(0x0082, &lcd_data, 5, true); } void DGUSScreenHandler::ManualAssistLeveling(DGUS_VP_Variable &var, void *val_ptr) { - int16_t point_value = swap16(*(uint16_t *)val_ptr); + const int16_t point_value = swap16(*(uint16_t *)val_ptr); int16_t level_x_pos, level_y_pos; char buf_level[32] = {0}; @@ -686,7 +682,7 @@ void DGUSScreenHandler::ManualAssistLeveling(DGUS_VP_Variable &var, void *val_pt #define mks_max(a, b) ((a) > (b)) ? (a) : (b) void DGUSScreenHandler::TMC_ChangeConfig(DGUS_VP_Variable &var, void *val_ptr) { #if EITHER(HAS_TRINAMIC_CONFIG, HAS_STEALTHCHOP) - uint16_t tmc_value = swap16(*(uint16_t*)val_ptr); + const uint16_t tmc_value = swap16(*(uint16_t*)val_ptr); #endif switch (var.VP) { @@ -930,7 +926,7 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { } void DGUSScreenHandler::GetParkPos_MKS(DGUS_VP_Variable &var, void *val_ptr) { - int16_t value_pos = swap16(*(int16_t*)val_ptr); + const int16_t value_pos = swap16(*(int16_t*)val_ptr); switch (var.VP) { case VP_X_PARK_POS: x_park_pos = value_pos; break; @@ -939,75 +935,76 @@ void DGUSScreenHandler::GetParkPos_MKS(DGUS_VP_Variable &var, void *val_ptr) { default: break; } skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel - return; } void DGUSScreenHandler::HandleChangeLevelPoint_MKS(DGUS_VP_Variable &var, void *val_ptr) { DEBUG_ECHOLNPGM("HandleStepPerMMChanged"); - int16_t value_raw = swap16(*(int16_t*)val_ptr); - - DEBUG_ECHOLNPAIR_F("value:", value_raw); + const int16_t value_raw = swap16(*(int16_t*)val_ptr); + DEBUG_ECHOLNPAIR_F("value_raw:", value_raw); *(int16_t*)var.memadr = value_raw; settings.save(); skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel - return; } void DGUSScreenHandler::HandleStepPerMMChanged_MKS(DGUS_VP_Variable &var, void *val_ptr) { DEBUG_ECHOLNPGM("HandleStepPerMMChanged"); - uint16_t value_raw = swap16(*(uint16_t*)val_ptr); + const uint16_t value_raw = swap16(*(uint16_t*)val_ptr); + const float value = (float)value_raw; DEBUG_ECHOLNPAIR("value_raw:", value_raw); - float value = (float)value_raw; + DEBUG_ECHOLNPAIR_F("value:", value); + ExtUI::axis_t axis; switch (var.VP) { + default: return; case VP_X_STEP_PER_MM: axis = ExtUI::axis_t::X; break; case VP_Y_STEP_PER_MM: axis = ExtUI::axis_t::Y; break; case VP_Z_STEP_PER_MM: axis = ExtUI::axis_t::Z; break; - default: return; } - DEBUG_ECHOLNPAIR_F("value:", value); ExtUI::setAxisSteps_per_mm(value, axis); DEBUG_ECHOLNPAIR_F("value_set:", ExtUI::getAxisSteps_per_mm(axis)); settings.save(); skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel - return; } void DGUSScreenHandler::HandleStepPerMMExtruderChanged_MKS(DGUS_VP_Variable &var, void *val_ptr) { DEBUG_ECHOLNPGM("HandleStepPerMMExtruderChanged"); - uint16_t value_raw = swap16(*(uint16_t*)val_ptr); + const uint16_t value_raw = swap16(*(uint16_t*)val_ptr); + const float value = (float)value_raw; + DEBUG_ECHOLNPAIR("value_raw:", value_raw); - float value = (float)value_raw; + DEBUG_ECHOLNPAIR_F("value:", value); + ExtUI::extruder_t extruder; switch (var.VP) { default: return; - #if HOTENDS >= 1 - case VP_E0_STEP_PER_MM: extruder = ExtUI::extruder_t::E0; break; - #endif - #if HOTENDS >= 2 - #endif - case VP_E1_STEP_PER_MM: extruder = ExtUI::extruder_t::E1; break; + #if HAS_HOTEND + case VP_E0_STEP_PER_MM: extruder = ExtUI::extruder_t::E0; break; + #endif + #if HAS_MULTI_HOTEND + case VP_E1_STEP_PER_MM: extruder = ExtUI::extruder_t::E1; break; + #endif } - DEBUG_ECHOLNPAIR_F("value:", value); ExtUI::setAxisSteps_per_mm(value, extruder); DEBUG_ECHOLNPAIR_F("value_set:", ExtUI::getAxisSteps_per_mm(extruder)); settings.save(); skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel - return; } void DGUSScreenHandler::HandleMaxSpeedChange_MKS(DGUS_VP_Variable &var, void *val_ptr) { DEBUG_ECHOLNPGM("HandleMaxSpeedChange_MKS"); - uint16_t value_raw = swap16(*(uint16_t*)val_ptr); + const uint16_t value_raw = swap16(*(uint16_t*)val_ptr); + const float value = (float)value_raw; + DEBUG_ECHOLNPAIR("value_raw:", value_raw); - float value = (float)value_raw; + DEBUG_ECHOLNPAIR_F("value:", value); + ExtUI::axis_t axis; switch (var.VP) { case VP_X_MAX_SPEED: axis = ExtUI::axis_t::X; break; @@ -1015,59 +1012,57 @@ void DGUSScreenHandler::HandleMaxSpeedChange_MKS(DGUS_VP_Variable &var, void *va case VP_Z_MAX_SPEED: axis = ExtUI::axis_t::Z; break; default: return; } - DEBUG_ECHOLNPAIR_F("value:", value); - // ExtUI::setAxisSteps_per_mm(value,extruder); ExtUI::setAxisMaxFeedrate_mm_s(value, axis); DEBUG_ECHOLNPAIR_F("value_set:", ExtUI::getAxisMaxFeedrate_mm_s(axis)); settings.save(); skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel - return; } void DGUSScreenHandler::HandleExtruderMaxSpeedChange_MKS(DGUS_VP_Variable &var, void *val_ptr) { DEBUG_ECHOLNPGM("HandleMaxSpeedChange_MKS"); - uint16_t value_raw = swap16(*(uint16_t*)val_ptr); + const uint16_t value_raw = swap16(*(uint16_t*)val_ptr); + const float value = (float)value_raw; + DEBUG_ECHOLNPAIR("value_raw:", value_raw); - float value = (float)value_raw; + DEBUG_ECHOLNPAIR_F("value:", value); + ExtUI::extruder_t extruder; switch (var.VP) { default: return; - #if HOTENDS >= 1 + #if HAS_HOTEND case VP_E0_MAX_SPEED: extruder = ExtUI::extruder_t::E0; break; #endif - #if HOTENDS >= 2 + #if HAS_MULTI_HOTEND #endif case VP_E1_MAX_SPEED: extruder = ExtUI::extruder_t::E1; break; } - DEBUG_ECHOLNPAIR_F("value:", value); - // ExtUI::setAxisSteps_per_mm(value,extruder); ExtUI::setAxisMaxFeedrate_mm_s(value, extruder); DEBUG_ECHOLNPAIR_F("value_set:", ExtUI::getAxisMaxFeedrate_mm_s(extruder)); settings.save(); skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel - return; } void DGUSScreenHandler::HandleMaxAccChange_MKS(DGUS_VP_Variable &var, void *val_ptr) { DEBUG_ECHOLNPGM("HandleMaxSpeedChange_MKS"); - uint16_t value_raw = swap16(*(uint16_t*)val_ptr); + const uint16_t value_raw = swap16(*(uint16_t*)val_ptr); + const float value = (float)value_raw; + DEBUG_ECHOLNPAIR("value_raw:", value_raw); - float value = (float)value_raw; + DEBUG_ECHOLNPAIR_F("value:", value); + ExtUI::axis_t axis; switch (var.VP) { + default: return; case VP_X_ACC_MAX_SPEED: axis = ExtUI::axis_t::X; break; case VP_Y_ACC_MAX_SPEED: axis = ExtUI::axis_t::Y; break; case VP_Z_ACC_MAX_SPEED: axis = ExtUI::axis_t::Z; break; - default: return; } - DEBUG_ECHOLNPAIR_F("value:", value); ExtUI::setAxisMaxAcceleration_mm_s2(value, axis); DEBUG_ECHOLNPAIR_F("value_set:", ExtUI::getAxisMaxAcceleration_mm_s2(axis)); settings.save(); skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel - return; } void DGUSScreenHandler::HandleExtruderAccChange_MKS(DGUS_VP_Variable &var, void *val_ptr) { @@ -1079,76 +1074,66 @@ void DGUSScreenHandler::HandleExtruderAccChange_MKS(DGUS_VP_Variable &var, void ExtUI::extruder_t extruder; switch (var.VP) { default: return; - #if HOTENDS >= 1 - case VP_E0_ACC_MAX_SPEED: extruder = ExtUI::extruder_t::E0; settings.load(); break; - #endif - #if HOTENDS >= 2 - #endif - case VP_E1_ACC_MAX_SPEED: extruder = ExtUI::extruder_t::E1; settings.load(); break; + #if HAS_HOTEND + case VP_E0_ACC_MAX_SPEED: extruder = ExtUI::extruder_t::E0; settings.load(); break; + #endif + #if HAS_MULTI_HOTEND + case VP_E1_ACC_MAX_SPEED: extruder = ExtUI::extruder_t::E1; settings.load(); break; + #endif } DEBUG_ECHOLNPAIR_F("value:", value); - // ExtUI::setAxisSteps_per_mm(value,extruder); ExtUI::setAxisMaxAcceleration_mm_s2(value, extruder); DEBUG_ECHOLNPAIR_F("value_set:", ExtUI::getAxisMaxAcceleration_mm_s2(extruder)); settings.save(); skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel - return; } void DGUSScreenHandler::HandleTravelAccChange_MKS(DGUS_VP_Variable &var, void *val_ptr) { uint16_t value_travel = swap16(*(uint16_t*)val_ptr); - float value = (float)value_travel; - planner.settings.travel_acceleration = value; + planner.settings.travel_acceleration = (float)value_travel; skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel - return; } void DGUSScreenHandler::HandleFeedRateMinChange_MKS(DGUS_VP_Variable &var, void *val_ptr) { uint16_t value_t = swap16(*(uint16_t*)val_ptr); - float value = (float)value_t; - planner.settings.min_feedrate_mm_s = value; + planner.settings.min_feedrate_mm_s = (float)value_t; skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel - return; } void DGUSScreenHandler::HandleMin_T_F_MKS(DGUS_VP_Variable &var, void *val_ptr) { uint16_t value_t_f = swap16(*(uint16_t*)val_ptr); - float value = (float)value_t_f; - planner.settings.min_travel_feedrate_mm_s = value; + planner.settings.min_travel_feedrate_mm_s = (float)value_t_f; skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel - return; } void DGUSScreenHandler::HandleAccChange_MKS(DGUS_VP_Variable &var, void *val_ptr) { uint16_t value_acc = swap16(*(uint16_t*)val_ptr); - float value = (float)value_acc; - planner.settings.acceleration = value; + planner.settings.acceleration = (float)value_acc; skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel - return; } void DGUSScreenHandler::HandleGetExMinTemp_MKS(DGUS_VP_Variable &var, void *val_ptr) { - uint16_t value_ex_min_temp = swap16(*(uint16_t*)val_ptr); + const uint16_t value_ex_min_temp = swap16(*(uint16_t*)val_ptr); thermalManager.extrude_min_temp = value_ex_min_temp; skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel } #if HAS_PID_HEATING void DGUSScreenHandler::HandleTemperaturePIDChanged(DGUS_VP_Variable &var, void *val_ptr) { - uint16_t rawvalue = swap16(*(uint16_t*)val_ptr); + const uint16_t rawvalue = swap16(*(uint16_t*)val_ptr); DEBUG_ECHOLNPAIR("V1:", rawvalue); - float value = (float)rawvalue / 10; + const float value = 1.0f * rawvalue; DEBUG_ECHOLNPAIR("V2:", value); float newvalue = 0; switch (var.VP) { default: return; - #if HOTENDS >= 1 + #if HAS_HOTEND case VP_E0_PID_P: newvalue = value; break; case VP_E0_PID_I: newvalue = scalePID_i(value); break; case VP_E0_PID_D: newvalue = scalePID_d(value); break; #endif - #if HOTENDS >= 2 + #if HAS_MULTI_HOTEND case VP_E1_PID_P: newvalue = value; break; case VP_E1_PID_I: newvalue = scalePID_i(value); break; case VP_E1_PID_D: newvalue = scalePID_d(value); break; @@ -1224,7 +1209,6 @@ void DGUSScreenHandler::GetManualFilament(DGUS_VP_Variable &var, void *val_ptr) distanceFilament = value; skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel - return; } void DGUSScreenHandler::GetManualFilamentSpeed(DGUS_VP_Variable &var, void *val_ptr) { @@ -1237,137 +1221,65 @@ void DGUSScreenHandler::GetManualFilamentSpeed(DGUS_VP_Variable &var, void *val_ FilamentSpeed = value_len; skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel - return; } -void DGUSScreenHandler::MKS_FilamentLoad(DGUS_VP_Variable &var, void *val_ptr) { - DEBUG_ECHOLNPGM("Load Filament"); - char buf[40]; - - uint16_t val_t = swap16(*(uint16_t*)val_ptr); +void DGUSScreenHandler::MKS_FilamentLoadUnload(DGUS_VP_Variable &var, void *val_ptr, const int filamentDir) { + #if EITHER(HAS_MULTI_HOTEND, SINGLENOZZLE) + uint8_t swap_tool = 0; + #endif + #if HAS_HOTEND + uint8_t hotend_too_cold = 0; + #endif if (!print_job_timer.isPaused() && !queue.ring_buffer.empty()) return; + char buf[40]; + const uint16_t val_t = swap16(*(uint16_t*)val_ptr); switch (val_t) { + default: break; case 0: - #if HOTENDS >= 1 - if (thermalManager.degHotend(0) < thermalManager.extrude_min_temp) { - if (thermalManager.degTargetHotend(0) < thermalManager.extrude_min_temp) - thermalManager.setTargetHotend(thermalManager.extrude_min_temp, 0); - sendinfoscreen(PSTR("NOTICE"), nullptr, PSTR("Please wait."), PSTR("Nozzle heating!"), true, true, true, true); - SetupConfirmAction(nullptr); - GotoScreen(DGUSLCD_SCREEN_POPUP); - } - else { - queue.enqueue_now_P(PSTR("T0")); - queue.enqueue_now_P(PSTR("G91")); - snprintf_P(buf,40,PSTR("G1 E%d F%d"),(int)distanceFilament,FilamentSpeed * 60); - queue.enqueue_one_now(buf); - queue.enqueue_now_P(PSTR("G90")); - } + #if HAS_HOTEND + if (thermalManager.tooColdToExtrude(0)) hotend_too_cold = 1; else swap_tool = 1; #endif break; - case 1: - #if HOTENDS >= 2 - if (thermalManager.degHotend(1) < thermalManager.extrude_min_temp) { - if (thermalManager.degTargetHotend(1) < thermalManager.extrude_min_temp) - thermalManager.setTargetHotend(thermalManager.extrude_min_temp, 1); - sendinfoscreen(PSTR("NOTICE"), nullptr, PSTR("Please wait."), PSTR("Nozzle heating!"), true, true, true, true); - SetupConfirmAction(nullptr); - GotoScreen(DGUSLCD_SCREEN_POPUP); - } - else { - queue.enqueue_now_P(PSTR("T1")); - queue.enqueue_now_P(PSTR("G91")); - snprintf_P(buf,40,PSTR("G1 E%d F%d"),(int)distanceFilament,FilamentSpeed * 60); - queue.enqueue_one_now(buf); - queue.enqueue_now_P(PSTR("G90")); - } + #if HAS_MULTI_HOTEND + if (thermalManager.tooColdToExtrude(1)) hotend_too_cold = 2; else swap_tool = 2; + #elif ENABLED(SINGLENOZZLE) + if (thermalManager.tooColdToExtrude(0)) hotend_too_cold = 1; else swap_tool = 2; #endif - #if ENABLED(SINGLENOZZLE) - if (thermalManager.degHotend(0) < thermalManager.extrude_min_temp) { - if (thermalManager.degTargetHotend(0) < thermalManager.extrude_min_temp) - thermalManager.setTargetHotend(thermalManager.extrude_min_temp, 0); - sendinfoscreen(PSTR("NOTICE"), nullptr, PSTR("Please wait."), PSTR("Nozzle heating!"), true, true, true, true); - SetupConfirmAction(nullptr); - GotoScreen(DGUSLCD_SCREEN_POPUP); - } - else { - queue.enqueue_now_P(PSTR("T1")); - queue.enqueue_now_P(PSTR("G91")); - snprintf_P(buf,40,PSTR("G1 E%d F%d"),(int)distanceFilament,FilamentSpeed * 60); - queue.enqueue_one_now(buf); - queue.enqueue_now_P(PSTR("G90")); - } - #endif - break; - - default: break; } + + #if HAS_HOTEND + if (hotend_too_cold) { + if (thermalManager.targetTooColdToExtrude(hotend_too_cold - 1)) thermalManager.setTargetHotend(thermalManager.extrude_min_temp, hotend_too_cold - 1); + sendinfoscreen(PSTR("NOTICE"), nullptr, PSTR("Please wait."), PSTR("Nozzle heating!"), true, true, true, true); + SetupConfirmAction(nullptr); + GotoScreen(DGUSLCD_SCREEN_POPUP); + } + #endif + + #if EITHER(HAS_MULTI_HOTEND, SINGLENOZZLE) + if (swap_tool) { + queue.enqueue_now_P(swap_tool == 2 ? PSTR("T1") : PSTR("T0")); + queue.enqueue_now_P(PSTR("G91")); + snprintf_P(buf, 40, PSTR("G1 E%d F%d"), (int)distanceFilament * filamentDir, FilamentSpeed * 60); + queue.enqueue_one_now(buf); + queue.enqueue_now_P(PSTR("G90")); + } + #endif +} + +void DGUSScreenHandler::MKS_FilamentLoad(DGUS_VP_Variable &var, void *val_ptr) { + DEBUG_ECHOLNPGM("Load Filament"); + MKS_FilamentLoadUnload(var, val_ptr, 1); } void DGUSScreenHandler::MKS_FilamentUnLoad(DGUS_VP_Variable &var, void *val_ptr) { DEBUG_ECHOLNPGM("UnLoad Filament"); - char buf[40]; - uint16_t val_t = swap16(*(uint16_t*)val_ptr); - switch (val_t) { - case 0: - #if HOTENDS >= 1 - if (thermalManager.degHotend(0) < thermalManager.extrude_min_temp) { - if (thermalManager.degTargetHotend(0) < thermalManager.extrude_min_temp) - thermalManager.setTargetHotend(thermalManager.extrude_min_temp, 0); - sendinfoscreen(PSTR("NOTICE"), nullptr, PSTR("Please wait."), PSTR("Nozzle heating!"), true, true, true, true); - SetupConfirmAction(nullptr); - GotoScreen(DGUSLCD_SCREEN_POPUP); - } - else { - queue.enqueue_now_P(PSTR("T0")); - queue.enqueue_now_P(PSTR("G91")); - snprintf_P(buf,40,PSTR("G1 E-%d F%d"),(int)distanceFilament,FilamentSpeed * 60); - queue.enqueue_one_now(buf); - queue.enqueue_now_P(PSTR("G90")); - } - #endif - break; - case 1: - #if HOTENDS >= 2 - if (thermalManager.degHotend(1) < thermalManager.extrude_min_temp) { - if (thermalManager.degTargetHotend(1) < thermalManager.extrude_min_temp) - thermalManager.setTargetHotend(thermalManager.extrude_min_temp, 1); - sendinfoscreen(PSTR("NOTICE"), nullptr, PSTR("Please wait."), PSTR("Nozzle heating!"), true, true, true, true); - SetupConfirmAction(nullptr); - GotoScreen(DGUSLCD_SCREEN_POPUP); - } - else { - queue.enqueue_now_P(PSTR("T1")); - queue.enqueue_now_P(PSTR("G91")); - snprintf_P(buf,40,PSTR("G1 E-%d F%d"),(int)distanceFilament,FilamentSpeed * 60); - queue.enqueue_one_now(buf); - queue.enqueue_now_P(PSTR("G90")); - } - #endif - - #if ENABLED(SINGLENOZZLE) - if (thermalManager.degHotend(0) < thermalManager.extrude_min_temp) { - if (thermalManager.degTargetHotend(0) < thermalManager.extrude_min_temp) - thermalManager.setTargetHotend(thermalManager.extrude_min_temp, 0); - sendinfoscreen(PSTR("NOTICE"), nullptr, PSTR("Please wait."), PSTR("Nozzle heating!"), true, true, true, true); - SetupConfirmAction(nullptr); - GotoScreen(DGUSLCD_SCREEN_POPUP); - } - else { - queue.enqueue_now_P(PSTR("T1")); - queue.enqueue_now_P(PSTR("G91")); - snprintf_P(buf,40,PSTR("G1 E-%d F%d"),(int)distanceFilament,FilamentSpeed * 60); - queue.enqueue_one_now(buf); - queue.enqueue_now_P(PSTR("G90")); - } - #endif - break; - } + MKS_FilamentLoadUnload(var, val_ptr, -1); } #if ENABLED(DGUS_FILAMENT_LOADUNLOAD) @@ -1378,17 +1290,15 @@ void DGUSScreenHandler::MKS_FilamentUnLoad(DGUS_VP_Variable &var, void *val_ptr) uint8_t e_temp = 0; filament_data.heated = false; uint16_t preheat_option = swap16(*(uint16_t*)val_ptr); - if (preheat_option <= 8) { // Load filament type - filament_data.action = 1; - } - else if (preheat_option >= 10) { // Unload filament type + if (preheat_option >= 10) { // Unload filament type preheat_option -= 10; filament_data.action = 2; filament_data.purge_length = DGUS_FILAMENT_PURGE_LENGTH; } - else { // Cancel filament operation + else if (preheat_option <= 8) // Load filament type + filament_data.action = 1; + else // Cancel filament operation filament_data.action = 0; - } switch (preheat_option) { case 0: // Load PLA @@ -1416,10 +1326,10 @@ void DGUSScreenHandler::MKS_FilamentUnLoad(DGUS_VP_Variable &var, void *val_ptr) } if (filament_data.action == 0) { // Go back to utility screen - #if HOTENDS >= 1 + #if HAS_HOTEND thermalManager.setTargetHotend(e_temp, ExtUI::extruder_t::E0); #endif - #if HOTENDS >= 2 + #if HAS_MULTI_HOTEND thermalManager.setTargetHotend(e_temp, ExtUI::extruder_t::E1); #endif GotoScreen(DGUSLCD_SCREEN_UTILITY); @@ -1427,13 +1337,13 @@ void DGUSScreenHandler::MKS_FilamentUnLoad(DGUS_VP_Variable &var, void *val_ptr) else { // Go to the preheat screen to show the heating progress switch (var.VP) { default: return; - #if HOTENDS >= 1 + #if HAS_HOTEND case VP_E0_FILAMENT_LOAD_UNLOAD: filament_data.extruder = ExtUI::extruder_t::E0; thermalManager.setTargetHotend(e_temp, filament_data.extruder); break; #endif - #if HOTENDS >= 2 + #if HAS_MULTI_HOTEND case VP_E1_FILAMENT_LOAD_UNLOAD: filament_data.extruder = ExtUI::extruder_t::E1; thermalManager.setTargetHotend(e_temp, filament_data.extruder); @@ -1475,6 +1385,7 @@ void DGUSScreenHandler::MKS_FilamentUnLoad(DGUS_VP_Variable &var, void *val_ptr) ExtUI::setAxisPosition_mm(movevalue, filament_data.extruder); } } + #endif // DGUS_FILAMENT_LOADUNLOAD bool DGUSScreenHandler::loop() { diff --git a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.h b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.h index 15e232e413..bfec3c4572 100644 --- a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.h +++ b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.h @@ -149,6 +149,7 @@ public: // Hook for filament load and unload static void HandleFilamentLoadUnload(DGUS_VP_Variable &var); + static void MKS_FilamentLoadUnload(DGUS_VP_Variable &var, void *val_ptr, const int filamentDir); static void MKS_FilamentLoad(DGUS_VP_Variable &var, void *val_ptr); static void MKS_FilamentUnLoad(DGUS_VP_Variable &var, void *val_ptr); static void MKS_LOAD_UNLOAD_IDLE(); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp index 5d02f79fd1..767d9c6738 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp @@ -514,13 +514,13 @@ void filament_dialog_handle() { queue.inject(public_buf_m); } - if ( ((abs((int)((int)thermalManager.degHotend(uiCfg.extruderIndex) - gCfgItems.filament_limit_temper)) <= 1) - || ((int)thermalManager.degHotend(uiCfg.extruderIndex) > gCfgItems.filament_limit_temper)) - && uiCfg.filament_load_heat_flg - ) { - uiCfg.filament_load_heat_flg = false; - lv_clear_dialog(); - lv_draw_dialog(DIALOG_TYPE_FILAMENT_HEAT_LOAD_COMPLETED); + if (uiCfg.filament_load_heat_flg) { + const int16_t diff = thermalManager.degHotend(uiCfg.extruderIndex) - gCfgItems.filament_limit_temp; + if (abs(diff) < 2 || diff > 0) { + uiCfg.filament_load_heat_flg = false; + lv_clear_dialog(); + lv_draw_dialog(DIALOG_TYPE_FILAMENT_HEAT_LOAD_COMPLETED); + } } if (uiCfg.filament_loading_completed) { @@ -529,13 +529,14 @@ void filament_dialog_handle() { lv_clear_dialog(); lv_draw_dialog(DIALOG_TYPE_FILAMENT_LOAD_COMPLETED); } - if (((abs((int)((int)thermalManager.degHotend(uiCfg.extruderIndex) - gCfgItems.filament_limit_temper)) <= 1) - || ((int)thermalManager.degHotend(uiCfg.extruderIndex) > gCfgItems.filament_limit_temper)) - && uiCfg.filament_unload_heat_flg - ) { - uiCfg.filament_unload_heat_flg = false; - lv_clear_dialog(); - lv_draw_dialog(DIALOG_TYPE_FILAMENT_HEAT_UNLOAD_COMPLETED); + + if (uiCfg.filament_unload_heat_flg) { + const int16_t diff = thermalManager.degHotend(uiCfg.extruderIndex) - gCfgItems.filament_limit_temp; + if (abs(diff) < 2 || diff > 0) { + uiCfg.filament_unload_heat_flg = false; + lv_clear_dialog(); + lv_draw_dialog(DIALOG_TYPE_FILAMENT_HEAT_UNLOAD_COMPLETED); + } } if (uiCfg.filament_unloading_completed) { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.cpp index e12a4b82cf..56a776c79e 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.cpp @@ -51,15 +51,15 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { case ID_FILAMNT_IN: uiCfg.filament_load_heat_flg = true; if ((abs(thermalManager.degTargetHotend(uiCfg.extruderIndex) - thermalManager.degHotend(uiCfg.extruderIndex)) <= 1) - || (gCfgItems.filament_limit_temper <= thermalManager.degHotend(uiCfg.extruderIndex))) { + || (gCfgItems.filament_limit_temp <= thermalManager.degHotend(uiCfg.extruderIndex))) { lv_clear_filament_change(); lv_draw_dialog(DIALOG_TYPE_FILAMENT_HEAT_LOAD_COMPLETED); } else { lv_clear_filament_change(); lv_draw_dialog(DIALOG_TYPE_FILAMENT_LOAD_HEAT); - if (thermalManager.degTargetHotend(uiCfg.extruderIndex) < gCfgItems.filament_limit_temper) { - thermalManager.setTargetHotend(gCfgItems.filament_limit_temper, uiCfg.extruderIndex); + if (thermalManager.degTargetHotend(uiCfg.extruderIndex) < gCfgItems.filament_limit_temp) { + thermalManager.setTargetHotend(gCfgItems.filament_limit_temp, uiCfg.extruderIndex); thermalManager.start_watching_hotend(uiCfg.extruderIndex); } } @@ -68,7 +68,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { uiCfg.filament_unload_heat_flg = true; if (thermalManager.degTargetHotend(uiCfg.extruderIndex) && ((abs((int)((int)thermalManager.degTargetHotend(uiCfg.extruderIndex) - thermalManager.degHotend(uiCfg.extruderIndex))) <= 1) - || ((int)thermalManager.degHotend(uiCfg.extruderIndex) >= gCfgItems.filament_limit_temper)) + || ((int)thermalManager.degHotend(uiCfg.extruderIndex) >= gCfgItems.filament_limit_temp)) ) { lv_clear_filament_change(); lv_draw_dialog(DIALOG_TYPE_FILAMENT_HEAT_UNLOAD_COMPLETED); @@ -76,8 +76,8 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { else { lv_clear_filament_change(); lv_draw_dialog(DIALOG_TYPE_FILAMENT_UNLOAD_HEAT); - if (thermalManager.degTargetHotend(uiCfg.extruderIndex) < gCfgItems.filament_limit_temper) { - thermalManager.setTargetHotend(gCfgItems.filament_limit_temper, uiCfg.extruderIndex); + if (thermalManager.degTargetHotend(uiCfg.extruderIndex) < gCfgItems.filament_limit_temp) { + thermalManager.setTargetHotend(gCfgItems.filament_limit_temp, uiCfg.extruderIndex); thermalManager.start_watching_hotend(uiCfg.extruderIndex); } filament_sprayer_temp(); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_settings.cpp index 128989a27c..553cb29895 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_settings.cpp @@ -107,7 +107,7 @@ void lv_draw_filament_settings() { lv_big_button_create(scr, "F:/bmp_back70x40.bin", machine_menu.next, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y, event_handler, ID_FILAMENT_SET_DOWN, true); } else { - sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.filament_limit_temper); + sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.filament_limit_temp); lv_screen_menu_item_1_edit(scr, machine_menu.FilamentTemperature, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_FILAMENT_SET_TEMP, 0, public_buf_l); lv_big_button_create(scr, "F:/bmp_back70x40.bin", machine_menu.previous, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y, event_handler, ID_FILAMENT_SET_UP, true); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.cpp index d001175915..91a1fce28d 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.cpp @@ -261,7 +261,7 @@ static void disp_key_value() { sprintf_P(public_buf_m, PSTR("%d"), gCfgItems.filamentchange_unload_speed); break; case filament_temp: - sprintf_P(public_buf_m, PSTR("%d"), gCfgItems.filament_limit_temper); + sprintf_P(public_buf_m, PSTR("%d"), gCfgItems.filament_limit_temp); break; case x_sensitivity: #if X_SENSORLESS @@ -505,7 +505,7 @@ static void set_value_confirm() { update_spi_flash(); break; case filament_temp: - gCfgItems.filament_limit_temper = atoi(key_value); + gCfgItems.filament_limit_temp = atoi(key_value); update_spi_flash(); break; case x_sensitivity: diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp index 9b7fea0a45..12e060aa01 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp @@ -143,7 +143,7 @@ void gCfgItems_init() { gCfgItems.filamentchange_load_speed = 1000; gCfgItems.filamentchange_unload_length = 200; gCfgItems.filamentchange_unload_speed = 1000; - gCfgItems.filament_limit_temper = 200; + gCfgItems.filament_limit_temp = 200; gCfgItems.encoder_enable = true; @@ -226,8 +226,8 @@ void ui_cfg_init() { uiCfg.cloud_port = 10086; #endif - uiCfg.filament_loading_time = (uint32_t)((gCfgItems.filamentchange_load_length * 60.0 / gCfgItems.filamentchange_load_speed) + 0.5); - uiCfg.filament_unloading_time = (uint32_t)((gCfgItems.filamentchange_unload_length * 60.0 / gCfgItems.filamentchange_unload_speed) + 0.5); + uiCfg.filament_loading_time = (uint32_t)((gCfgItems.filamentchange_load_length * 60.0f / gCfgItems.filamentchange_load_speed) + 0.5f); + uiCfg.filament_unloading_time = (uint32_t)((gCfgItems.filamentchange_unload_length * 60.0f / gCfgItems.filamentchange_unload_speed) + 0.5f); } void update_spi_flash() { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h index 4b0ce2b4d8..a7f219965a 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h @@ -184,29 +184,27 @@ extern char public_buf_m[100]; extern char public_buf_l[30]; typedef struct { - uint32_t spi_flash_flag; - uint8_t disp_rotation_180; - bool multiple_language; - uint8_t language; - uint8_t leveling_mode; - bool from_flash_pic; - bool finish_power_off; - bool pause_reprint; - uint8_t wifi_mode_sel; - uint8_t fileSysType; - uint8_t wifi_type; - bool cloud_enable, - encoder_enable; - int levelingPos[5][2]; - int filamentchange_load_length, - filamentchange_load_speed, - filamentchange_unload_length, - filamentchange_unload_speed, - filament_limit_temper; - float pausePosX, - pausePosY, - pausePosZ; - uint32_t curFilesize; + uint32_t spi_flash_flag; + uint8_t disp_rotation_180; + bool multiple_language; + uint8_t language; + uint8_t leveling_mode; + bool from_flash_pic; + bool finish_power_off; + bool pause_reprint; + uint8_t wifi_mode_sel; + uint8_t fileSysType; + uint8_t wifi_type; + bool cloud_enable, + encoder_enable; + int levelingPos[5][2]; + int filamentchange_load_length, + filamentchange_load_speed, + filamentchange_unload_length, + filamentchange_unload_speed; + int16_t filament_limit_temp; + float pausePosX, pausePosY, pausePosZ; + uint32_t curFilesize; } CFG_ITMES; typedef struct { From a8ea6e646301756f138373112479713f0dfbe4dc Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 23 Mar 2021 10:55:30 -0500 Subject: [PATCH 184/253] Max temp/target followup --- Marlin/src/lcd/menu/menu_advanced.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Marlin/src/lcd/menu/menu_advanced.cpp b/Marlin/src/lcd/menu/menu_advanced.cpp index b6d55a5de6..463433685e 100644 --- a/Marlin/src/lcd/menu/menu_advanced.cpp +++ b/Marlin/src/lcd/menu/menu_advanced.cpp @@ -261,8 +261,8 @@ void menu_backlash(); // #if BOTH(AUTOTEMP, HAS_TEMP_HOTEND) EDIT_ITEM(bool, MSG_AUTOTEMP, &planner.autotemp_enabled); - EDIT_ITEM(float3, MSG_MIN, &planner.autotemp_min, 0, float(HEATER_0_MAXTEMP) - HOTEND_OVERSHOOT); - EDIT_ITEM(float3, MSG_MAX, &planner.autotemp_max, 0, float(HEATER_0_MAXTEMP) - HOTEND_OVERSHOOT); + EDIT_ITEM(int3, MSG_MIN, &planner.autotemp_min, 0, thermalManager.hotend_max_target(0)); + EDIT_ITEM(int3, MSG_MAX, &planner.autotemp_max, 0, thermalManager.hotend_max_target(0)); EDIT_ITEM(float42_52, MSG_FACTOR, &planner.autotemp_factor, 0, 10); #endif From 07c24e72ac0deba0a9229a3cbcd8694279b102ab Mon Sep 17 00:00:00 2001 From: MarlinFirmware Date: Wed, 24 Mar 2021 00:13:49 +0000 Subject: [PATCH 185/253] [cron] Bump distribution date (2021-03-24) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 2f91dfd927..7d3f6d8a64 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2021-03-23" + #define STRING_DISTRIBUTION_DATE "2021-03-24" #endif /** From e5ff55a1be7646b6159e6dedac50bfbe57e6dfa0 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 24 Mar 2021 04:11:43 -0500 Subject: [PATCH 186/253] Add typedef celsius_t (#21374) --- Marlin/src/core/types.h | 6 + Marlin/src/feature/mmu/mmu2.cpp | 2 +- Marlin/src/feature/pause.cpp | 5 +- Marlin/src/feature/pause.h | 2 +- Marlin/src/feature/powerloss.cpp | 8 +- Marlin/src/feature/powerloss.h | 4 +- Marlin/src/gcode/bedlevel/G26.cpp | 4 +- Marlin/src/gcode/lcd/M145.cpp | 6 +- Marlin/src/gcode/parser.h | 61 +++++---- Marlin/src/gcode/temp/M104_M109.cpp | 6 +- Marlin/src/gcode/temp/M140_M190.cpp | 6 +- Marlin/src/lcd/HD44780/marlinui_HD44780.cpp | 10 +- Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp | 19 ++- Marlin/src/lcd/dogm/status_screen_DOGM.cpp | 22 ++-- .../lcd/dogm/status_screen_lite_ST7920.cpp | 32 ++--- Marlin/src/lcd/dwin/e3v2/dwin.cpp | 26 ++-- Marlin/src/lcd/dwin/e3v2/dwin.h | 4 +- .../lcd/extui/lib/dgus/DGUSScreenHandler.cpp | 10 +- .../extui/lib/dgus/fysetc/DGUSDisplayDef.cpp | 6 +- .../extui/lib/dgus/hiprecy/DGUSDisplayDef.cpp | 10 +- .../lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp | 6 +- .../extui/lib/dgus/origin/DGUSDisplayDef.cpp | 4 +- .../src/lcd/extui/lib/mks_ui/draw_dialog.cpp | 4 +- Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h | 4 +- Marlin/src/lcd/marlinui.h | 6 +- Marlin/src/lcd/menu/menu_configuration.cpp | 4 +- Marlin/src/lcd/tft/ui_320x240.cpp | 6 +- Marlin/src/lcd/tft/ui_480x320.cpp | 6 +- Marlin/src/module/motion.cpp | 6 +- Marlin/src/module/motion.h | 14 +-- Marlin/src/module/planner.cpp | 8 +- Marlin/src/module/planner.h | 3 +- Marlin/src/module/temperature.cpp | 110 +++++++--------- Marlin/src/module/temperature.h | 118 +++++++----------- Marlin/src/module/thermistor/thermistors.h | 2 +- 35 files changed, 252 insertions(+), 298 deletions(-) diff --git a/Marlin/src/core/types.h b/Marlin/src/core/types.h index 20519e1888..d77dba38d9 100644 --- a/Marlin/src/core/types.h +++ b/Marlin/src/core/types.h @@ -72,6 +72,12 @@ struct IF { typedef L type; }; // typedef float feedRate_t; +// +// celsius_t is the native unit of temperature. Signed to handle a disconnected thermistor value (-14). +// For more resolition (e.g., for a chocolate printer) this may later be changed to Celsius x 100 +// +typedef int16_t celsius_t; + // Conversion macros #define MMM_TO_MMS(MM_M) feedRate_t(float(MM_M) / 60.0f) #define MMS_TO_MMM(MM_S) (float(MM_S) * 60.0f) diff --git a/Marlin/src/feature/mmu/mmu2.cpp b/Marlin/src/feature/mmu/mmu2.cpp index a1bec36e45..d4238400c7 100644 --- a/Marlin/src/feature/mmu/mmu2.cpp +++ b/Marlin/src/feature/mmu/mmu2.cpp @@ -775,7 +775,7 @@ void MMU2::manage_response(const bool move_axes, const bool turn_off_nozzle) { bool response = false; mmu_print_saved = false; xyz_pos_t resume_position; - int16_t resume_hotend_temp = thermalManager.degTargetHotend(active_extruder); + celsius_t resume_hotend_temp = thermalManager.degTargetHotend(active_extruder); KEEPALIVE_STATE(PAUSED_FOR_USER); diff --git a/Marlin/src/feature/pause.cpp b/Marlin/src/feature/pause.cpp index a6a28925ed..5f3338139a 100644 --- a/Marlin/src/feature/pause.cpp +++ b/Marlin/src/feature/pause.cpp @@ -555,7 +555,7 @@ void wait_for_confirmation(const bool is_reload/*=false*/, const int8_t max_beep * - Send host action for resume, if configured * - Resume the current SD print job, if any */ -void resume_print(const float &slow_load_length/*=0*/, const float &fast_load_length/*=0*/, const float &purge_length/*=ADVANCED_PAUSE_PURGE_LENGTH*/, const int8_t max_beep_count/*=0*/, int16_t targetTemp/*=0*/ DXC_ARGS) { +void resume_print(const float &slow_load_length/*=0*/, const float &fast_load_length/*=0*/, const float &purge_length/*=ADVANCED_PAUSE_PURGE_LENGTH*/, const int8_t max_beep_count/*=0*/, const celsius_t targetTemp/*=0*/ DXC_ARGS) { DEBUG_SECTION(rp, "resume_print", true); DEBUG_ECHOLNPAIR("... slowlen:", slow_load_length, " fastlen:", fast_load_length, " purgelen:", purge_length, " maxbeep:", max_beep_count, " targetTemp:", targetTemp DXC_SAY); @@ -577,9 +577,8 @@ void resume_print(const float &slow_load_length/*=0*/, const float &fast_load_le thermalManager.reset_hotend_idle_timer(e); } - if (targetTemp > thermalManager.degTargetHotend(active_extruder)) { + if (targetTemp > thermalManager.degTargetHotend(active_extruder)) thermalManager.setTargetHotend(targetTemp, active_extruder); - } // Load the new filament load_filament(slow_load_length, fast_load_length, purge_length, max_beep_count, true, nozzle_timed_out, PAUSE_MODE_SAME DXC_PASS); diff --git a/Marlin/src/feature/pause.h b/Marlin/src/feature/pause.h index 7e58d4564e..4ab33ac519 100644 --- a/Marlin/src/feature/pause.h +++ b/Marlin/src/feature/pause.h @@ -90,7 +90,7 @@ bool pause_print(const float &retract, const xyz_pos_t &park_point, const float void wait_for_confirmation(const bool is_reload=false, const int8_t max_beep_count=0 DXC_PARAMS); void resume_print(const float &slow_load_length=0, const float &fast_load_length=0, const float &extrude_length=ADVANCED_PAUSE_PURGE_LENGTH, - const int8_t max_beep_count=0, int16_t targetTemp=0 DXC_PARAMS); + const int8_t max_beep_count=0, const celsius_t targetTemp=0 DXC_PARAMS); bool load_filament(const float &slow_load_length=0, const float &fast_load_length=0, const float &extrude_length=0, const int8_t max_beep_count=0, const bool show_lcd=false, const bool pause_for_user=false, const PauseMode mode=PAUSE_MODE_PAUSE_PRINT DXC_PARAMS); diff --git a/Marlin/src/feature/powerloss.cpp b/Marlin/src/feature/powerloss.cpp index 1bb3a7e915..cc45d6ecf0 100644 --- a/Marlin/src/feature/powerloss.cpp +++ b/Marlin/src/feature/powerloss.cpp @@ -201,10 +201,10 @@ void PrintJobRecovery::save(const bool force/*=false*/, const float zraise/*=0*/ #endif #if EXTRUDERS - HOTEND_LOOP() info.target_temperature[e] = thermalManager.temp_hotend[e].target; + HOTEND_LOOP() info.target_temperature[e] = thermalManager.degTargetHotend(e); #endif - TERN_(HAS_HEATED_BED, info.target_temperature_bed = thermalManager.temp_bed.target); + TERN_(HAS_HEATED_BED, info.target_temperature_bed = thermalManager.degTargetBed()); #if HAS_FAN COPY(info.fan_speed, thermalManager.fan_speed); @@ -343,7 +343,7 @@ void PrintJobRecovery::resume() { #endif #if HAS_HEATED_BED - const int16_t bt = info.target_temperature_bed; + const celsius_t bt = info.target_temperature_bed; if (bt) { // Restore the bed temperature sprintf_P(cmd, PSTR("M190 S%i"), bt); @@ -354,7 +354,7 @@ void PrintJobRecovery::resume() { // Restore all hotend temperatures #if HAS_HOTEND HOTEND_LOOP() { - const int16_t et = info.target_temperature[e]; + const celsius_t et = info.target_temperature[e]; if (et) { #if HAS_MULTI_HOTEND sprintf_P(cmd, PSTR("T%i S"), e); diff --git a/Marlin/src/feature/powerloss.h b/Marlin/src/feature/powerloss.h index 25581e1723..12d11b141e 100644 --- a/Marlin/src/feature/powerloss.h +++ b/Marlin/src/feature/powerloss.h @@ -66,8 +66,8 @@ typedef struct { float filament_size[EXTRUDERS]; #endif - TERN_(HAS_HOTEND, int16_t target_temperature[HOTENDS]); - TERN_(HAS_HEATED_BED, int16_t target_temperature_bed); + TERN_(HAS_HOTEND, celsius_t target_temperature[HOTENDS]); + TERN_(HAS_HEATED_BED, celsius_t target_temperature_bed); TERN_(HAS_FAN, uint8_t fan_speed[FAN_COUNT]); TERN_(HAS_LEVELING, float fade); diff --git a/Marlin/src/gcode/bedlevel/G26.cpp b/Marlin/src/gcode/bedlevel/G26.cpp index ed29959055..0468b79363 100644 --- a/Marlin/src/gcode/bedlevel/G26.cpp +++ b/Marlin/src/gcode/bedlevel/G26.cpp @@ -533,7 +533,7 @@ void GcodeSuite::G26() { #if HAS_HEATED_BED // Get a temperature from 'I' or 'B' - int16_t bedtemp = 0; + celsius_t bedtemp = 0; // Use the 'I' index if temperature presets are defined #if PREHEAT_COUNT @@ -616,7 +616,7 @@ void GcodeSuite::G26() { g26_extrusion_multiplier *= g26_filament_diameter * sq(g26_nozzle) / sq(0.3); // Scale up by nozzle size // Get a temperature from 'I' or 'H' - int16_t noztemp = 0; + celsius_t noztemp = 0; // Accept 'I' if temperature presets are defined #if PREHEAT_COUNT diff --git a/Marlin/src/gcode/lcd/M145.cpp b/Marlin/src/gcode/lcd/M145.cpp index 84a7e75aa4..d6a57d2215 100644 --- a/Marlin/src/gcode/lcd/M145.cpp +++ b/Marlin/src/gcode/lcd/M145.cpp @@ -27,6 +27,10 @@ #include "../gcode.h" #include "../../lcd/marlinui.h" +#if HAS_HOTEND + #include "../../module/temperature.h" +#endif + /** * M145: Set the heatup state for a material in the LCD menu * @@ -43,7 +47,7 @@ void GcodeSuite::M145() { preheat_t &mat = ui.material_preset[material]; #if HAS_HOTEND if (parser.seenval('H')) - mat.hotend_temp = constrain(parser.value_int(), EXTRUDE_MINTEMP, (HEATER_0_MAXTEMP) - (HOTEND_OVERSHOOT)); + mat.hotend_temp = constrain(parser.value_int(), EXTRUDE_MINTEMP, thermalManager.hotend_max_target(0)); #endif #if HAS_HEATED_BED if (parser.seenval('B')) diff --git a/Marlin/src/gcode/parser.h b/Marlin/src/gcode/parser.h index 221500e076..b21c930cfa 100644 --- a/Marlin/src/gcode/parser.h +++ b/Marlin/src/gcode/parser.h @@ -352,50 +352,45 @@ public: static inline PGM_P temp_units_name() { return input_temp_units == TEMPUNIT_K ? PSTR("Kelvin") : input_temp_units == TEMPUNIT_F ? PSTR("Fahrenheit") : PSTR("Celsius"); } - static inline float to_temp_units(const float &f) { + static inline float to_temp_units(celsius_t c) { switch (input_temp_units) { - case TEMPUNIT_F: - return f * 0.5555555556f + 32; - case TEMPUNIT_K: - return f + 273.15f; - case TEMPUNIT_C: default: - return f; + case TEMPUNIT_C: return c; + case TEMPUNIT_K: return c + 273.15f; + case TEMPUNIT_F: return c * 0.5555555556f + 32; } } #endif // HAS_LCD_MENU && !DISABLE_M503 - static inline float value_celsius() { - const float f = value_float(); + static inline celsius_t value_celsius() { + float f = value_float(); switch (input_temp_units) { - case TEMPUNIT_F: - return (f - 32) * 0.5555555556f; - case TEMPUNIT_K: - return f - 273.15f; - case TEMPUNIT_C: default: - return f; + case TEMPUNIT_C: break; + case TEMPUNIT_K: f -= 273.15f; + case TEMPUNIT_F: f = (f - 32) * 0.5555555556f; } + return LROUND(f + 0.5f); } - static inline float value_celsius_diff() { + static inline celsius_t value_celsius_diff() { + float f = value_float(); switch (input_temp_units) { - case TEMPUNIT_F: - return value_float() * 0.5555555556f; - case TEMPUNIT_C: - case TEMPUNIT_K: default: - return value_float(); + case TEMPUNIT_C: + case TEMPUNIT_K: break; + case TEMPUNIT_F: f *= 0.5555555556f; } + return LROUND(f + 0.5f); } #else // !TEMPERATURE_UNITS_SUPPORT static inline float to_temp_units(int16_t c) { return (float)c; } - static inline float value_celsius() { return value_float(); } - static inline float value_celsius_diff() { return value_float(); } + static inline celsius_t value_celsius() { return value_int(); } + static inline celsius_t value_celsius_diff() { return value_int(); } #endif // !TEMPERATURE_UNITS_SUPPORT @@ -404,16 +399,16 @@ public: void unknown_command_warning(); // Provide simple value accessors with default option - static inline char* stringval(const char c, char * const dval=nullptr) { return seenval(c) ? value_string() : dval; } - static inline float floatval(const char c, const float dval=0.0) { return seenval(c) ? value_float() : dval; } - static inline bool boolval(const char c, const bool dval=false) { return seenval(c) ? value_bool() : (seen(c) ? true : dval); } - static inline uint8_t byteval(const char c, const uint8_t dval=0) { return seenval(c) ? value_byte() : dval; } - static inline int16_t intval(const char c, const int16_t dval=0) { return seenval(c) ? value_int() : dval; } - static inline uint16_t ushortval(const char c, const uint16_t dval=0) { return seenval(c) ? value_ushort() : dval; } - static inline int32_t longval(const char c, const int32_t dval=0) { return seenval(c) ? value_long() : dval; } - static inline uint32_t ulongval(const char c, const uint32_t dval=0) { return seenval(c) ? value_ulong() : dval; } - static inline float linearval(const char c, const float dval=0) { return seenval(c) ? value_linear_units() : dval; } - static inline float celsiusval(const char c, const float dval=0) { return seenval(c) ? value_celsius() : dval; } + static inline char* stringval(const char c, char * const dval=nullptr) { return seenval(c) ? value_string() : dval; } + static inline float floatval(const char c, const float dval=0.0) { return seenval(c) ? value_float() : dval; } + static inline bool boolval(const char c, const bool dval=false) { return seenval(c) ? value_bool() : (seen(c) ? true : dval); } + static inline uint8_t byteval(const char c, const uint8_t dval=0) { return seenval(c) ? value_byte() : dval; } + static inline int16_t intval(const char c, const int16_t dval=0) { return seenval(c) ? value_int() : dval; } + static inline uint16_t ushortval(const char c, const uint16_t dval=0) { return seenval(c) ? value_ushort() : dval; } + static inline int32_t longval(const char c, const int32_t dval=0) { return seenval(c) ? value_long() : dval; } + static inline uint32_t ulongval(const char c, const uint32_t dval=0) { return seenval(c) ? value_ulong() : dval; } + static inline float linearval(const char c, const float dval=0) { return seenval(c) ? value_linear_units() : dval; } + static inline celsius_t celsiusval(const char c, const float dval=0) { return seenval(c) ? value_celsius() : dval; } #if ENABLED(MARLIN_DEV_MODE) diff --git a/Marlin/src/gcode/temp/M104_M109.cpp b/Marlin/src/gcode/temp/M104_M109.cpp index 07e46e1775..fe1e834656 100644 --- a/Marlin/src/gcode/temp/M104_M109.cpp +++ b/Marlin/src/gcode/temp/M104_M109.cpp @@ -69,7 +69,7 @@ void GcodeSuite::M104() { #endif bool got_temp = false; - int16_t temp = 0; + celsius_t temp = 0; // Accept 'I' if temperature presets are defined #if PREHEAT_COUNT @@ -145,7 +145,7 @@ void GcodeSuite::M109() { #endif bool got_temp = false; - int16_t temp = 0; + celsius_t temp = 0; // Accept 'I' if temperature presets are defined #if PREHEAT_COUNT @@ -161,7 +161,7 @@ void GcodeSuite::M109() { if (!got_temp) { no_wait_for_cooling = parser.seenval('S'); got_temp = no_wait_for_cooling || parser.seenval('R'); - if (got_temp) temp = int16_t(parser.value_celsius()); + if (got_temp) temp = parser.value_celsius(); } if (got_temp) { diff --git a/Marlin/src/gcode/temp/M140_M190.cpp b/Marlin/src/gcode/temp/M140_M190.cpp index 9a1a0287d9..3aed878a03 100644 --- a/Marlin/src/gcode/temp/M140_M190.cpp +++ b/Marlin/src/gcode/temp/M140_M190.cpp @@ -44,7 +44,7 @@ void GcodeSuite::M140() { if (DEBUGGING(DRYRUN)) return; bool got_temp = false; - int16_t temp = 0; + celsius_t temp = 0; // Accept 'I' if temperature presets are defined #if PREHEAT_COUNT @@ -94,7 +94,7 @@ void GcodeSuite::M190() { if (DEBUGGING(DRYRUN)) return; bool got_temp = false; - int16_t temp = 0; + celsius_t temp = 0; // Accept 'I' if temperature presets are defined #if PREHEAT_COUNT @@ -110,7 +110,7 @@ void GcodeSuite::M190() { if (!got_temp) { no_wait_for_cooling = parser.seenval('S'); got_temp = no_wait_for_cooling || parser.seenval('R'); - if (got_temp) temp = int16_t(parser.value_celsius()); + if (got_temp) temp = parser.value_celsius(); } if (!got_temp) return; diff --git a/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp b/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp index 653a384120..3f4cc23aba 100644 --- a/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp +++ b/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp @@ -520,15 +520,15 @@ FORCE_INLINE void _draw_axis_value(const AxisEnum axis, const char *value, const FORCE_INLINE void _draw_heater_status(const heater_id_t heater_id, const char prefix, const bool blink) { #if HAS_HEATED_BED const bool isBed = TERN(HAS_HEATED_CHAMBER, heater_id == H_BED, heater_id < 0); - const float t1 = (isBed ? thermalManager.degBed() : thermalManager.degHotend(heater_id)), - t2 = (isBed ? thermalManager.degTargetBed() : thermalManager.degTargetHotend(heater_id)); + const celsius_t t1 = (isBed ? thermalManager.degBed() : thermalManager.degHotend(heater_id)), + t2 = (isBed ? thermalManager.degTargetBed() : thermalManager.degTargetHotend(heater_id)); #else - const float t1 = thermalManager.degHotend(heater_id), t2 = thermalManager.degTargetHotend(heater_id); + const celsius_t t1 = thermalManager.degHotend(heater_id), t2 = thermalManager.degTargetHotend(heater_id); #endif if (prefix >= 0) lcd_put_wchar(prefix); - lcd_put_u8str(i16tostr3rj(t1 + 0.5)); + lcd_put_u8str(i16tostr3rj(t1)); lcd_put_wchar('/'); #if !HEATER_IDLE_HANDLER @@ -541,7 +541,7 @@ FORCE_INLINE void _draw_heater_status(const heater_id_t heater_id, const char pr } else #endif - lcd_put_u8str(i16tostr3left(t2 + 0.5)); + lcd_put_u8str(i16tostr3left(t2)); if (prefix >= 0) { lcd_put_wchar(LCD_STR_DEGREE[0]); diff --git a/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp b/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp index 44128cc9f8..fd72f94862 100644 --- a/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp +++ b/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp @@ -434,33 +434,32 @@ FORCE_INLINE void _draw_heater_status(const heater_id_t heater_id, const char *p uint8_t pic_hot_bits; #if HAS_HEATED_BED const bool isBed = heater_id < 0; - const float t1 = (isBed ? thermalManager.degBed() : thermalManager.degHotend(heater_id)); - const float t2 = (isBed ? thermalManager.degTargetBed() : thermalManager.degTargetHotend(heater_id)); + const celsius_t t1 = (isBed ? thermalManager.degBed() : thermalManager.degHotend(heater_id)), + t2 = (isBed ? thermalManager.degTargetBed() : thermalManager.degTargetHotend(heater_id)); #else - const float t1 = thermalManager.degHotend(heater_id); - const float t2 = thermalManager.degTargetHotend(heater_id); + const celsius_t t1 = thermalManager.degHotend(heater_id), t2 = thermalManager.degTargetHotend(heater_id); #endif #if HOTENDS < 2 if (heater_id == H_E0) { lcd.setCursor(2, 5); lcd.print(prefix); //HE - lcd.setCursor(1, 6); lcd.print(i16tostr3rj(t1 + 0.5)); + lcd.setCursor(1, 6); lcd.print(i16tostr3rj(t1)); lcd.setCursor(1, 7); } else { lcd.setCursor(6, 5); lcd.print(prefix); //BED - lcd.setCursor(6, 6); lcd.print(i16tostr3rj(t1 + 0.5)); + lcd.setCursor(6, 6); lcd.print(i16tostr3rj(t1)); lcd.setCursor(6, 7); } #else if (heater_id > H_BED) { - lcd.setCursor(heater_id * 4, 5); lcd.print(prefix); //HE1 or HE2 or HE3 - lcd.setCursor(heater_id * 4, 6); lcd.print(i16tostr3rj(t1 + 0.5)); + lcd.setCursor(heater_id * 4, 5); lcd.print(prefix); // HE1 or HE2 or HE3 + lcd.setCursor(heater_id * 4, 6); lcd.print(i16tostr3rj(t1)); lcd.setCursor(heater_id * 4, 7); } else { lcd.setCursor(13, 5); lcd.print(prefix); //BED - lcd.setCursor(13, 6); lcd.print(i16tostr3rj(t1 + 0.5)); + lcd.setCursor(13, 6); lcd.print(i16tostr3rj(t1)); lcd.setCursor(13, 7); } #endif // HOTENDS <= 1 @@ -475,7 +474,7 @@ FORCE_INLINE void _draw_heater_status(const heater_id_t heater_id, const char *p } else #endif // !HEATER_IDLE_HANDLER - lcd.print(i16tostr3rj(t2 + 0.5)); + lcd.print(i16tostr3rj(t2)); switch (heater_id) { case H_BED: pic_hot_bits = ICON_BED; break; diff --git a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp index 892ab5218b..7d97a1cdcf 100644 --- a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp +++ b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp @@ -187,7 +187,7 @@ #define PROGRESS_BAR_Y (EXTRAS_BASELINE + 1) #define PROGRESS_BAR_WIDTH (LCD_PIXEL_WIDTH - PROGRESS_BAR_X) -FORCE_INLINE void _draw_centered_temp(const int16_t temp, const uint8_t tx, const uint8_t ty) { +FORCE_INLINE void _draw_centered_temp(const celsius_t temp, const uint8_t tx, const uint8_t ty) { const char *str = i16tostr3rj(temp); const uint8_t len = str[0] != ' ' ? 3 : str[1] != ' ' ? 2 : 1; lcd_put_u8str(tx - len * (INFO_FONT_WIDTH) / 2 + 1, ty, &str[3-len]); @@ -206,8 +206,8 @@ FORCE_INLINE void _draw_centered_temp(const int16_t temp, const uint8_t tx, cons const uint8_t tx = STATUS_HOTEND_TEXT_X(heater_id); - const float temp = thermalManager.degHotend(heater_id), - target = thermalManager.degTargetHotend(heater_id); + const celsius_t temp = thermalManager.degHotend(heater_id), + target = thermalManager.degTargetHotend(heater_id); #if DISABLED(STATUS_HOTEND_ANIM) #define STATIC_HOTEND true @@ -277,11 +277,11 @@ FORCE_INLINE void _draw_centered_temp(const int16_t temp, const uint8_t tx, cons #else constexpr bool dodraw = true; #endif - if (dodraw) _draw_centered_temp(target + 0.5, tx, 7); + if (dodraw) _draw_centered_temp(target, tx, 7); } if (PAGE_CONTAINS(28 - INFO_FONT_ASCENT, 28 - 1)) - _draw_centered_temp(temp + 0.5f, tx, 28); + _draw_centered_temp(temp, tx, 28); if (STATIC_HOTEND && HOTEND_DOT && PAGE_CONTAINS(17, 19)) { u8g.setColorIndex(0); // set to white on black @@ -303,8 +303,8 @@ FORCE_INLINE void _draw_centered_temp(const int16_t temp, const uint8_t tx, cons const uint8_t tx = STATUS_BED_TEXT_X; - const float temp = thermalManager.degBed(), - target = thermalManager.degTargetBed(); + const celsius_t temp = thermalManager.degBed(), + target = thermalManager.degTargetBed(); #if ENABLED(STATUS_HEAT_PERCENT) || DISABLED(STATUS_BED_ANIM) const bool isHeat = BED_ALT(); @@ -350,11 +350,11 @@ FORCE_INLINE void _draw_centered_temp(const int16_t temp, const uint8_t tx, cons #else constexpr bool dodraw = true; #endif - if (dodraw) _draw_centered_temp(target + 0.5, tx, 7); + if (dodraw) _draw_centered_temp(target, tx, 7); } if (PAGE_CONTAINS(28 - INFO_FONT_ASCENT, 28 - 1)) - _draw_centered_temp(temp + 0.5f, tx, 28); + _draw_centered_temp(temp, tx, 28); if (STATIC_BED && BED_DOT && PAGE_CONTAINS(17, 19)) { u8g.setColorIndex(0); // set to white on black @@ -370,10 +370,10 @@ FORCE_INLINE void _draw_centered_temp(const int16_t temp, const uint8_t tx, cons FORCE_INLINE void _draw_chamber_status() { #if HAS_HEATED_CHAMBER if (PAGE_UNDER(7)) - _draw_centered_temp(thermalManager.degTargetChamber() + 0.5f, STATUS_CHAMBER_TEXT_X, 7); + _draw_centered_temp(thermalManager.degTargetChamber(), STATUS_CHAMBER_TEXT_X, 7); #endif if (PAGE_CONTAINS(28 - INFO_FONT_ASCENT, 28 - 1)) - _draw_centered_temp(thermalManager.degChamber() + 0.5f, STATUS_CHAMBER_TEXT_X, 28); + _draw_centered_temp(thermalManager.degChamber(), STATUS_CHAMBER_TEXT_X, 28); } #endif diff --git a/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp b/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp index a538121d2c..dcb65f676d 100644 --- a/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp +++ b/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp @@ -691,15 +691,15 @@ bool ST7920_Lite_Status_Screen::indicators_changed() { // We only add the target temperatures to the checksum // because the actual temps fluctuate so by updating // them only during blinks we gain a bit of stability. - const bool blink = ui.get_blink(); - const uint16_t feedrate_perc = feedrate_percentage; - const uint16_t fs = thermalManager.scaledFanSpeed(0); - const int16_t extruder_1_target = thermalManager.degTargetHotend(0); + const bool blink = ui.get_blink(); + const uint16_t feedrate_perc = feedrate_percentage; + const uint16_t fs = thermalManager.scaledFanSpeed(0); + const celsius_t extruder_1_target = thermalManager.degTargetHotend(0); #if HAS_MULTI_HOTEND - const int16_t extruder_2_target = thermalManager.degTargetHotend(1); + const celsius_t extruder_2_target = thermalManager.degTargetHotend(1); #endif #if HAS_HEATED_BED - const int16_t bed_target = thermalManager.degTargetBed(); + const celsius_t bed_target = thermalManager.degTargetBed(); #endif static uint16_t last_checksum = 0; const uint16_t checksum = blink ^ feedrate_perc ^ fs ^ extruder_1_target @@ -712,19 +712,19 @@ bool ST7920_Lite_Status_Screen::indicators_changed() { void ST7920_Lite_Status_Screen::update_indicators(const bool forceUpdate) { if (forceUpdate || indicators_changed()) { - const bool blink = ui.get_blink(); - const duration_t elapsed = print_job_timer.duration(); - duration_t remaining = TERN0(USE_M73_REMAINING_TIME, ui.get_remaining_time()); - const uint16_t feedrate_perc = feedrate_percentage; - const int16_t extruder_1_temp = thermalManager.degHotend(0), - extruder_1_target = thermalManager.degTargetHotend(0); + const bool blink = ui.get_blink(); + const duration_t elapsed = print_job_timer.duration(); + duration_t remaining = TERN0(USE_M73_REMAINING_TIME, ui.get_remaining_time()); + const uint16_t feedrate_perc = feedrate_percentage; + const celsius_t extruder_1_temp = thermalManager.degHotend(0), + extruder_1_target = thermalManager.degTargetHotend(0); #if HAS_MULTI_HOTEND - const int16_t extruder_2_temp = thermalManager.degHotend(1), - extruder_2_target = thermalManager.degTargetHotend(1); + const celsius_t extruder_2_temp = thermalManager.degHotend(1), + extruder_2_target = thermalManager.degTargetHotend(1); #endif #if HAS_HEATED_BED - const int16_t bed_temp = thermalManager.degBed(), - bed_target = thermalManager.degTargetBed(); + const celsius_t bed_temp = thermalManager.degBed(), + bed_target = thermalManager.degTargetBed(); #endif draw_extruder_1_temp(extruder_1_temp, extruder_1_target, forceUpdate); diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.cpp b/Marlin/src/lcd/dwin/e3v2/dwin.cpp index 60a22f22f1..0e9b93525d 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.cpp +++ b/Marlin/src/lcd/dwin/e3v2/dwin.cpp @@ -1578,20 +1578,22 @@ void _draw_xyz_position(const bool force) { void update_variable() { #if HAS_HOTEND - static float _hotendtemp = 0; - const bool _new_hotend_temp = _hotendtemp != thermalManager.temp_hotend[0].celsius; - if (_new_hotend_temp) _hotendtemp = thermalManager.temp_hotend[0].celsius; - static int16_t _hotendtarget = 0; - const bool _new_hotend_target = _hotendtarget != thermalManager.temp_hotend[0].target; - if (_new_hotend_target) _hotendtarget = thermalManager.temp_hotend[0].target; + static celsius_t _hotendtemp = 0, _hotendtarget = 0; + const celsius_t hc = thermalManager.degHotend(0), + ht = thermalManager.degTargetHotend(0); + const bool _new_hotend_temp = _hotendtemp != hc, + _new_hotend_target = _hotendtarget != ht; + if (_new_hotend_temp) _hotendtemp = hc; + if (_new_hotend_target) _hotendtarget = ht; #endif #if HAS_HEATED_BED - static float _bedtemp = 0; - const bool _new_bed_temp = _bedtemp != thermalManager.temp_bed.celsius; - if (_new_bed_temp) _bedtemp = thermalManager.temp_bed.celsius; - static int16_t _bedtarget = 0; - const bool _new_bed_target = _bedtarget != thermalManager.temp_bed.target; - if (_new_bed_target) _bedtarget = thermalManager.temp_bed.target; + static celsius_t _bedtemp = 0, _bedtarget = 0; + const celsius_t bc = thermalManager.degBed(), + bt = thermalManager.degTargetBed(); + const bool _new_bed_temp = _bedtemp != bc, + _new_bed_target = _bedtarget != bt; + if (_new_bed_temp) _bedtemp = bc; + if (_new_bed_target) _bedtarget = bt; #endif #if HAS_FAN static uint8_t _fanspeed = 0; diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.h b/Marlin/src/lcd/dwin/e3v2/dwin.h index 217127ed11..9e0cda86c2 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.h +++ b/Marlin/src/lcd/dwin/e3v2/dwin.h @@ -234,8 +234,8 @@ extern char print_filename[16]; extern millis_t dwin_heat_time; typedef struct { - TERN_(HAS_HOTEND, int16_t E_Temp = 0); - TERN_(HAS_HEATED_BED, int16_t Bed_Temp = 0); + TERN_(HAS_HOTEND, celsius_t E_Temp = 0); + TERN_(HAS_HEATED_BED, celsius_t Bed_Temp = 0); TERN_(HAS_FAN, int16_t Fan_speed = 0); int16_t print_speed = 100; float Max_Feedspeed = 0; diff --git a/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp index 93a7de14a1..473fcb954c 100644 --- a/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp @@ -388,28 +388,28 @@ void DGUSScreenHandler::HandleAllHeatersOff(DGUS_VP_Variable &var, void *val_ptr } void DGUSScreenHandler::HandleTemperatureChanged(DGUS_VP_Variable &var, void *val_ptr) { - uint16_t newvalue = swap16(*(uint16_t*)val_ptr); - uint16_t acceptedvalue; + celsius_t newvalue = swap16(*(uint16_t*)val_ptr); + celsius_t acceptedvalue; switch (var.VP) { default: return; #if HOTENDS >= 1 case VP_T_E0_Set: - NOMORE(newvalue, (uint16_t)HEATER_0_MAXTEMP); + NOMORE(newvalue, HEATER_0_MAXTEMP); thermalManager.setTargetHotend(newvalue, 0); acceptedvalue = thermalManager.degTargetHotend(0); break; #endif #if HOTENDS >= 2 case VP_T_E1_Set: - NOMORE(newvalue, (uint16_t)HEATER_1_MAXTEMP); + NOMORE(newvalue, HEATER_1_MAXTEMP); thermalManager.setTargetHotend(newvalue, 1); acceptedvalue = thermalManager.degTargetHotend(1); break; #endif #if HAS_HEATED_BED case VP_T_Bed_Set: - NOMORE(newvalue, (uint16_t)BED_MAXTEMP); + NOMORE(newvalue, BED_MAXTEMP); thermalManager.setTargetBed(newvalue); acceptedvalue = thermalManager.degTargetBed(); break; diff --git a/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSDisplayDef.cpp b/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSDisplayDef.cpp index 467444c214..ee0a1c749f 100644 --- a/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSDisplayDef.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSDisplayDef.cpp @@ -367,7 +367,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { // Temperature Data #if HOTENDS >= 1 - VPHELPER(VP_T_E0_Is, &thermalManager.temp_hotend[0].celsius, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<0>), + VPHELPER(VP_T_E0_Is, &thermalManager.temp_hotend[0].celsius, nullptr, ScreenHandler.DGUSLCD_SendWordValueToDisplay), VPHELPER(VP_T_E0_Set, &thermalManager.temp_hotend[0].target, ScreenHandler.HandleTemperatureChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), VPHELPER(VP_Flowrate_E0, &planner.flow_percentage[ExtUI::extruder_t::E0], ScreenHandler.HandleFlowRateChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), VPHELPER(VP_EPos, &destination.e, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<2>), @@ -388,7 +388,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { #endif #endif #if HOTENDS >= 2 - VPHELPER(VP_T_E1_Is, &thermalManager.temp_hotend[1].celsius, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<0>), + VPHELPER(VP_T_E1_Is, &thermalManager.temp_hotend[1].celsius, nullptr, ScreenHandler.DGUSLCD_SendWordValueToDisplay), VPHELPER(VP_T_E1_Set, &thermalManager.temp_hotend[1].target, ScreenHandler.HandleTemperatureChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), VPHELPER(VP_Flowrate_E1, &planner.flow_percentage[ExtUI::extruder_t::E1], ScreenHandler.HandleFlowRateChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), VPHELPER(VP_MOVE_E1, nullptr, &ScreenHandler.HandleManualExtrude, nullptr), @@ -400,7 +400,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { VPHELPER(VP_E1_FILAMENT_LOAD_UNLOAD, nullptr, &ScreenHandler.HandleFilamentOption, &ScreenHandler.HandleFilamentLoadUnload), #endif #if HAS_HEATED_BED - VPHELPER(VP_T_Bed_Is, &thermalManager.temp_bed.celsius, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<0>), + VPHELPER(VP_T_Bed_Is, &thermalManager.temp_bed.celsius, nullptr, ScreenHandler.DGUSLCD_SendWordValueToDisplay), VPHELPER(VP_T_Bed_Set, &thermalManager.temp_bed.target, ScreenHandler.HandleTemperatureChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), VPHELPER(VP_BED_CONTROL, &thermalManager.temp_bed.target, &ScreenHandler.HandleHeaterControl, nullptr), VPHELPER(VP_BED_STATUS, &thermalManager.temp_bed.target, nullptr, &ScreenHandler.DGUSLCD_SendHeaterStatusToDisplay), diff --git a/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSDisplayDef.cpp b/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSDisplayDef.cpp index 536640ec95..d3c4510fb3 100644 --- a/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSDisplayDef.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSDisplayDef.cpp @@ -364,13 +364,13 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { VPHELPER(VP_Z_FIRST_LAYER_CAL, nullptr, &ScreenHandler.HandleFirstLayerCal, nullptr), #endif - { .VP = VP_MARLIN_VERSION, .memadr = (void*)MarlinVersion, .size = VP_MARLIN_VERSION_LEN, .set_by_display_handler = nullptr, .send_to_display_handler =&ScreenHandler.DGUSLCD_SendStringToDisplayPGM }, + { .VP = VP_MARLIN_VERSION, .memadr = (void*)MarlinVersion, .size = VP_MARLIN_VERSION_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = &ScreenHandler.DGUSLCD_SendStringToDisplayPGM }, // M117 LCD String (We don't need the string in memory but "just" push it to the display on demand, hence the nullptr - { .VP = VP_M117, .memadr = nullptr, .size = VP_M117_LEN, .set_by_display_handler = nullptr, .send_to_display_handler =&ScreenHandler.DGUSLCD_SendStringToDisplay }, + { .VP = VP_M117, .memadr = nullptr, .size = VP_M117_LEN, .set_by_display_handler = nullptr, .send_to_display_handler = &ScreenHandler.DGUSLCD_SendStringToDisplay }, // Temperature Data #if HOTENDS >= 1 - VPHELPER(VP_T_E0_Is, &thermalManager.temp_hotend[0].celsius, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<0>), + VPHELPER(VP_T_E0_Is, &thermalManager.temp_hotend[0].celsius, nullptr, ScreenHandler.DGUSLCD_SendWordValueToDisplay), VPHELPER(VP_T_E0_Set, &thermalManager.temp_hotend[0].target, ScreenHandler.HandleTemperatureChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), VPHELPER(VP_Flowrate_E0, &planner.flow_percentage[ExtUI::extruder_t::E0], ScreenHandler.HandleFlowRateChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), VPHELPER(VP_EPos, &destination.e, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<2>), @@ -391,7 +391,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { #endif #endif #if HOTENDS >= 2 - VPHELPER(VP_T_E1_Is, &thermalManager.temp_hotend[1].celsius, nullptr, DGUSLCD_SendFloatAsLongValueToDisplay<0>), + VPHELPER(VP_T_E1_Is, &thermalManager.temp_hotend[1].celsius, nullptr, ScreenHandler.DGUSLCD_SendWordValueToDisplay), VPHELPER(VP_T_E1_Set, &thermalManager.temp_hotend[1].target, ScreenHandler.HandleTemperatureChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), VPHELPER(VP_Flowrate_E1, nullptr, ScreenHandler.HandleFlowRateChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), VPHELPER(VP_MOVE_E1, nullptr, &ScreenHandler.HandleManualExtrude, nullptr), @@ -399,7 +399,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { VPHELPER(VP_E1_STATUS, &thermalManager.temp_hotend[1].target, nullptr, &ScreenHandler.DGUSLCD_SendHeaterStatusToDisplay), #endif #if HAS_HEATED_BED - VPHELPER(VP_T_Bed_Is, &thermalManager.temp_bed.celsius, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<0>), + VPHELPER(VP_T_Bed_Is, &thermalManager.temp_bed.celsius, nullptr, ScreenHandler.DGUSLCD_SendWordValueToDisplay), VPHELPER(VP_T_Bed_Set, &thermalManager.temp_bed.target, ScreenHandler.HandleTemperatureChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), VPHELPER(VP_BED_CONTROL, &thermalManager.temp_bed.target, &ScreenHandler.HandleHeaterControl, nullptr), VPHELPER(VP_BED_STATUS, &thermalManager.temp_bed.target, nullptr, &ScreenHandler.DGUSLCD_SendHeaterStatusToDisplay), diff --git a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp index 9f436a356c..25e1670740 100644 --- a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp @@ -548,7 +548,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { // Temperature Data #if HOTENDS >= 1 - VPHELPER(VP_T_E0_Is, &thermalManager.temp_hotend[0].celsius, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<0>), + VPHELPER(VP_T_E0_Is, &thermalManager.temp_hotend[0].celsius, nullptr, ScreenHandler.DGUSLCD_SendWordValueToDisplay), VPHELPER(VP_T_E0_Set, &thermalManager.temp_hotend[0].target, ScreenHandler.HandleTemperatureChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), VPHELPER(VP_Flowrate_E0, &planner.flow_percentage[ExtUI::extruder_t::E0], ScreenHandler.HandleFlowRateChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), VPHELPER(VP_EPos, &destination.e, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<2>), @@ -573,7 +573,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { #endif #if HOTENDS >= 2 - VPHELPER(VP_T_E1_Is, &thermalManager.temp_hotend[1].celsius, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<0>), + VPHELPER(VP_T_E1_Is, &thermalManager.temp_hotend[1].celsius, nullptr, ScreenHandler.DGUSLCD_SendWordValueToDisplay), VPHELPER(VP_T_E1_Set, &thermalManager.temp_hotend[1].target, ScreenHandler.HandleTemperatureChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), VPHELPER(VP_Flowrate_E1, &planner.flow_percentage[ExtUI::extruder_t::E1], ScreenHandler.HandleFlowRateChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), VPHELPER(VP_MOVE_E1, nullptr, &ScreenHandler.HandleManualExtrude, nullptr), @@ -593,7 +593,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { #endif #if HAS_HEATED_BED - VPHELPER(VP_T_Bed_Is, &thermalManager.temp_bed.celsius, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<0>), + VPHELPER(VP_T_Bed_Is, &thermalManager.temp_bed.celsius, nullptr, ScreenHandler.DGUSLCD_SendWordValueToDisplay), VPHELPER(VP_T_Bed_Set, &thermalManager.temp_bed.target, ScreenHandler.HandleTemperatureChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), VPHELPER(VP_BED_CONTROL, &thermalManager.temp_bed.target, &ScreenHandler.HandleHeaterControl, nullptr), VPHELPER(VP_BED_STATUS, &thermalManager.temp_bed.target, nullptr, &ScreenHandler.DGUSLCD_SendHeaterStatusToDisplay), diff --git a/Marlin/src/lcd/extui/lib/dgus/origin/DGUSDisplayDef.cpp b/Marlin/src/lcd/extui/lib/dgus/origin/DGUSDisplayDef.cpp index 8d89de3e33..e232bf9b96 100644 --- a/Marlin/src/lcd/extui/lib/dgus/origin/DGUSDisplayDef.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/origin/DGUSDisplayDef.cpp @@ -216,7 +216,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { #endif #endif #if HOTENDS >= 2 - VPHELPER(VP_T_E1_Is, &thermalManager.temp_hotend[1].celsius, nullptr, DGUSLCD_SendFloatAsLongValueToDisplay<0>), + VPHELPER(VP_T_E1_Is, &thermalManager.temp_hotend[1].celsius, nullptr, DGUSLCD_SendWordValueToDisplay), VPHELPER(VP_T_E1_Set, &thermalManager.temp_hotend[1].target, ScreenHandler.HandleTemperatureChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), VPHELPER(VP_Flowrate_E1, nullptr, ScreenHandler.HandleFlowRateChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), VPHELPER(VP_MOVE_E1, nullptr, &ScreenHandler.HandleManualExtrude, nullptr), @@ -227,7 +227,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { #endif #endif #if HAS_HEATED_BED - VPHELPER(VP_T_Bed_Is, &thermalManager.temp_bed.celsius, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<0>), + VPHELPER(VP_T_Bed_Is, &thermalManager.temp_bed.celsius, nullptr, ScreenHandler.DGUSLCD_SendWordValueToDisplay), VPHELPER(VP_T_Bed_Set, &thermalManager.temp_bed.target, ScreenHandler.HandleTemperatureChanged, &ScreenHandler.DGUSLCD_SendWordValueToDisplay), VPHELPER(VP_BED_CONTROL, &thermalManager.temp_bed.target, &ScreenHandler.HandleHeaterControl, nullptr), VPHELPER(VP_BED_STATUS, &thermalManager.temp_bed.target, nullptr, &ScreenHandler.DGUSLCD_SendHeaterStatusToDisplay), diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp index 767d9c6738..3fed4cc385 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp @@ -515,7 +515,7 @@ void filament_dialog_handle() { } if (uiCfg.filament_load_heat_flg) { - const int16_t diff = thermalManager.degHotend(uiCfg.extruderIndex) - gCfgItems.filament_limit_temp; + const celsius_t diff = thermalManager.degHotend(uiCfg.extruderIndex) - gCfgItems.filament_limit_temp; if (abs(diff) < 2 || diff > 0) { uiCfg.filament_load_heat_flg = false; lv_clear_dialog(); @@ -531,7 +531,7 @@ void filament_dialog_handle() { } if (uiCfg.filament_unload_heat_flg) { - const int16_t diff = thermalManager.degHotend(uiCfg.extruderIndex) - gCfgItems.filament_limit_temp; + const celsius_t diff = thermalManager.degHotend(uiCfg.extruderIndex) - gCfgItems.filament_limit_temp; if (abs(diff) < 2 || diff > 0) { uiCfg.filament_unload_heat_flg = false; lv_clear_dialog(); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h index a7f219965a..3098a6666c 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h @@ -202,7 +202,7 @@ typedef struct { filamentchange_load_speed, filamentchange_unload_length, filamentchange_unload_speed; - int16_t filament_limit_temp; + celsius_t filament_limit_temp; float pausePosX, pausePosY, pausePosZ; uint32_t curFilesize; } CFG_ITMES; @@ -244,7 +244,7 @@ typedef struct { filament_loading_time_cnt, filament_unloading_time_cnt; float move_dist; - float hotendTargetTempBak; + celsius_t hotendTargetTempBak; float current_x_position_bak, current_y_position_bak, current_z_position_bak, diff --git a/Marlin/src/lcd/marlinui.h b/Marlin/src/lcd/marlinui.h index 1c9e80c75e..6f5703e622 100644 --- a/Marlin/src/lcd/marlinui.h +++ b/Marlin/src/lcd/marlinui.h @@ -110,9 +110,9 @@ #if PREHEAT_COUNT typedef struct { - TERN_(HAS_HOTEND, uint16_t hotend_temp); - TERN_(HAS_HEATED_BED, uint16_t bed_temp ); - TERN_(HAS_FAN, uint16_t fan_speed ); + TERN_(HAS_HOTEND, celsius_t hotend_temp); + TERN_(HAS_HEATED_BED, celsius_t bed_temp ); + TERN_(HAS_FAN, uint16_t fan_speed ); } preheat_t; #endif diff --git a/Marlin/src/lcd/menu/menu_configuration.cpp b/Marlin/src/lcd/menu/menu_configuration.cpp index 71f09a5aee..7ef49f0cf8 100644 --- a/Marlin/src/lcd/menu/menu_configuration.cpp +++ b/Marlin/src/lcd/menu/menu_configuration.cpp @@ -325,10 +325,10 @@ void menu_advanced_settings(); EDIT_ITEM_N(percent, m, MSG_FAN_SPEED, &editable.uint8, 0, 255, []{ ui.material_preset[MenuItemBase::itemIndex].fan_speed = editable.uint8; }); #endif #if HAS_TEMP_HOTEND - EDIT_ITEM(uint16_3, MSG_NOZZLE, &ui.material_preset[m].hotend_temp, MINTEMP_ALL, MAXTEMP_ALL - HOTEND_OVERSHOOT); + EDIT_ITEM(int3, MSG_NOZZLE, &ui.material_preset[m].hotend_temp, MINTEMP_ALL, MAXTEMP_ALL - (HOTEND_OVERSHOOT)); #endif #if HAS_HEATED_BED - EDIT_ITEM(uint16_3, MSG_BED, &ui.material_preset[m].bed_temp, BED_MINTEMP, BED_MAX_TARGET); + EDIT_ITEM(int3, MSG_BED, &ui.material_preset[m].bed_temp, BED_MINTEMP, BED_MAX_TARGET); #endif #if ENABLED(EEPROM_SETTINGS) ACTION_ITEM(MSG_STORE_EEPROM, ui.store_settings); diff --git a/Marlin/src/lcd/tft/ui_320x240.cpp b/Marlin/src/lcd/tft/ui_320x240.cpp index fb82188645..37a44f51b4 100644 --- a/Marlin/src/lcd/tft/ui_320x240.cpp +++ b/Marlin/src/lcd/tft/ui_320x240.cpp @@ -114,7 +114,7 @@ void MarlinUI::draw_kill_screen() { void draw_heater_status(uint16_t x, uint16_t y, const int8_t Heater) { MarlinImage image = imgHotEnd; uint16_t Color; - float currentTemperature, targetTemperature; + celsius_t currentTemperature, targetTemperature; if (Heater >= 0) { // HotEnd currentTemperature = thermalManager.degHotend(Heater); @@ -175,13 +175,13 @@ void draw_heater_status(uint16_t x, uint16_t y, const int8_t Heater) { tft.add_image(0, 18, image, Color); - tft_string.set((uint8_t *)i16tostr3rj(currentTemperature + 0.5)); + tft_string.set((uint8_t *)i16tostr3rj(currentTemperature)); tft_string.add(LCD_STR_DEGREE); tft_string.trim(); tft.add_text(tft_string.center(64) + 2, 72, Color, tft_string); if (targetTemperature >= 0) { - tft_string.set((uint8_t *)i16tostr3rj(targetTemperature + 0.5)); + tft_string.set((uint8_t *)i16tostr3rj(targetTemperature)); tft_string.add(LCD_STR_DEGREE); tft_string.trim(); tft.add_text(tft_string.center(64) + 2, 8, Color, tft_string); diff --git a/Marlin/src/lcd/tft/ui_480x320.cpp b/Marlin/src/lcd/tft/ui_480x320.cpp index 164785a229..81e4603ea4 100644 --- a/Marlin/src/lcd/tft/ui_480x320.cpp +++ b/Marlin/src/lcd/tft/ui_480x320.cpp @@ -114,7 +114,7 @@ void MarlinUI::draw_kill_screen() { void draw_heater_status(uint16_t x, uint16_t y, const int8_t Heater) { MarlinImage image = imgHotEnd; uint16_t Color; - float currentTemperature, targetTemperature; + celsius_t currentTemperature, targetTemperature; if (Heater >= 0) { // HotEnd currentTemperature = thermalManager.degHotend(Heater); @@ -168,13 +168,13 @@ void draw_heater_status(uint16_t x, uint16_t y, const int8_t Heater) { tft.add_image(8, 28, image, Color); - tft_string.set((uint8_t *)i16tostr3rj(currentTemperature + 0.5)); + tft_string.set((uint8_t *)i16tostr3rj(currentTemperature)); tft_string.add(LCD_STR_DEGREE); tft_string.trim(); tft.add_text(tft_string.center(80) + 2, 82, Color, tft_string); if (targetTemperature >= 0) { - tft_string.set((uint8_t *)i16tostr3rj(targetTemperature + 0.5)); + tft_string.set((uint8_t *)i16tostr3rj(targetTemperature)); tft_string.add(LCD_STR_DEGREE); tft_string.trim(); tft.add_text(tft_string.center(80) + 2, 8, Color, tft_string); diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index 2f4f5e283a..b0a4890e07 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -940,11 +940,11 @@ FORCE_INLINE void segment_idle(millis_t &next_idle_ms) { DualXMode dual_x_carriage_mode = DEFAULT_DUAL_X_CARRIAGE_MODE; float inactive_extruder_x = X2_MAX_POS, // Used in mode 0 & 1 - duplicate_extruder_x_offset = DEFAULT_DUPLICATION_X_OFFSET; // Used in mode 2 + duplicate_extruder_x_offset = DEFAULT_DUPLICATION_X_OFFSET; // Used in mode 2 & 3 xyz_pos_t raised_parked_position; // Used in mode 1 - bool active_extruder_parked = false; // Used in mode 1 & 2 + bool active_extruder_parked = false; // Used in mode 1, 2 & 3 millis_t delayed_move_time = 0; // Used in mode 1 - int16_t duplicate_extruder_temp_offset = 0; // Used in mode 2 + celsius_t duplicate_extruder_temp_offset = 0; // Used in mode 2 & 3 bool idex_mirrored_mode = false; // Used in mode 3 float x_home_pos(const uint8_t extruder) { diff --git a/Marlin/src/module/motion.h b/Marlin/src/module/motion.h index 0328d015a4..7b8d2f2018 100644 --- a/Marlin/src/module/motion.h +++ b/Marlin/src/module/motion.h @@ -463,13 +463,13 @@ FORCE_INLINE bool all_axes_trusted() { return xyz_bits == }; extern DualXMode dual_x_carriage_mode; - extern float inactive_extruder_x, // Used in mode 0 & 1 - duplicate_extruder_x_offset; // Used in mode 2 & 3 - extern xyz_pos_t raised_parked_position; // Used in mode 1 - extern bool active_extruder_parked; // Used in mode 1, 2 & 3 - extern millis_t delayed_move_time; // Used in mode 1 - extern int16_t duplicate_extruder_temp_offset; // Used in mode 2 & 3 - extern bool idex_mirrored_mode; // Used in mode 3 + extern float inactive_extruder_x, // Used in mode 0 & 1 + duplicate_extruder_x_offset; // Used in mode 2 & 3 + extern xyz_pos_t raised_parked_position; // Used in mode 1 + extern bool active_extruder_parked; // Used in mode 1, 2 & 3 + extern millis_t delayed_move_time; // Used in mode 1 + extern celsius_t duplicate_extruder_temp_offset; // Used in mode 2 & 3 + extern bool idex_mirrored_mode; // Used in mode 3 FORCE_INLINE bool idex_is_duplicating() { return dual_x_carriage_mode >= DXC_DUPLICATION_MODE; } diff --git a/Marlin/src/module/planner.cpp b/Marlin/src/module/planner.cpp index 594671f87a..8c320925be 100644 --- a/Marlin/src/module/planner.cpp +++ b/Marlin/src/module/planner.cpp @@ -197,9 +197,9 @@ float Planner::steps_to_mm[XYZE_N]; // (mm) Millimeters per step skew_factor_t Planner::skew_factor; // Initialized by settings.load() #if ENABLED(AUTOTEMP) - float Planner::autotemp_max = 250, - Planner::autotemp_min = 210, - Planner::autotemp_factor = 0.1f; + celsius_t Planner::autotemp_max = 250, + Planner::autotemp_min = 210; + float Planner::autotemp_factor = 0.1f; bool Planner::autotemp_enabled = false; #endif @@ -1376,7 +1376,7 @@ void Planner::check_axes_activity() { #if ENABLED(AUTOTEMP_PROPORTIONAL) void Planner::_autotemp_update_from_hotend() { - const int16_t target = thermalManager.degTargetHotend(active_extruder); + const celsius_t target = thermalManager.degTargetHotend(active_extruder); autotemp_min = target + AUTOTEMP_MIN_P; autotemp_max = target + AUTOTEMP_MAX_P; } diff --git a/Marlin/src/module/planner.h b/Marlin/src/module/planner.h index 7ebba1e342..769967d4a6 100644 --- a/Marlin/src/module/planner.h +++ b/Marlin/src/module/planner.h @@ -896,7 +896,8 @@ class Planner { #endif #if ENABLED(AUTOTEMP) - static float autotemp_min, autotemp_max, autotemp_factor; + static celsius_t autotemp_min, autotemp_max; + static float autotemp_factor; static bool autotemp_enabled; static void autotemp_update(); static void autotemp_M104_M109(); diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index dd7a36a82a..6d1f3bd0a3 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -253,7 +253,7 @@ const char str_t_thermal_runaway[] PROGMEM = STR_T_THERMAL_RUNAWAY, #if HAS_HOTEND hotend_info_t Temperature::temp_hotend[HOTEND_TEMPS]; // = { 0 } - const uint16_t Temperature::hotend_maxtemp[HOTENDS] = ARRAY_BY_HOTENDS(HEATER_0_MAXTEMP, HEATER_1_MAXTEMP, HEATER_2_MAXTEMP, HEATER_3_MAXTEMP, HEATER_4_MAXTEMP, HEATER_5_MAXTEMP, HEATER_6_MAXTEMP, HEATER_7_MAXTEMP); + const celsius_t Temperature::hotend_maxtemp[HOTENDS] = ARRAY_BY_HOTENDS(HEATER_0_MAXTEMP, HEATER_1_MAXTEMP, HEATER_2_MAXTEMP, HEATER_3_MAXTEMP, HEATER_4_MAXTEMP, HEATER_5_MAXTEMP, HEATER_6_MAXTEMP, HEATER_7_MAXTEMP); #endif #if ENABLED(AUTO_POWER_E_FANS) @@ -368,12 +368,8 @@ const char str_t_thermal_runaway[] PROGMEM = STR_T_THERMAL_RUNAWAY, #if HAS_HEATED_BED bed_info_t Temperature::temp_bed; // = { 0 } // Init min and max temp with extreme values to prevent false errors during startup - #ifdef BED_MINTEMP - int16_t Temperature::mintemp_raw_BED = TEMP_SENSOR_BED_RAW_LO_TEMP; - #endif - #ifdef BED_MAXTEMP - int16_t Temperature::maxtemp_raw_BED = TEMP_SENSOR_BED_RAW_HI_TEMP; - #endif + int16_t Temperature::mintemp_raw_BED = TEMP_SENSOR_BED_RAW_LO_TEMP, + Temperature::maxtemp_raw_BED = TEMP_SENSOR_BED_RAW_HI_TEMP; TERN_(WATCH_BED, bed_watch_t Temperature::watch_bed); // = { 0 } IF_DISABLED(PIDTEMPBED, millis_t Temperature::next_bed_check_ms); #endif @@ -383,12 +379,8 @@ const char str_t_thermal_runaway[] PROGMEM = STR_T_THERMAL_RUNAWAY, #if HAS_HEATED_CHAMBER millis_t next_cool_check_ms_2 = 0; float old_temp = 9999; - #ifdef CHAMBER_MINTEMP - int16_t Temperature::mintemp_raw_CHAMBER = TEMP_SENSOR_CHAMBER_RAW_LO_TEMP; - #endif - #ifdef CHAMBER_MAXTEMP - int16_t Temperature::maxtemp_raw_CHAMBER = TEMP_SENSOR_CHAMBER_RAW_HI_TEMP; - #endif + int16_t Temperature::mintemp_raw_CHAMBER = TEMP_SENSOR_CHAMBER_RAW_LO_TEMP, + Temperature::maxtemp_raw_CHAMBER = TEMP_SENSOR_CHAMBER_RAW_HI_TEMP; TERN_(WATCH_CHAMBER, chamber_watch_t Temperature::watch_chamber{0}); IF_DISABLED(PIDTEMPCHAMBER, millis_t Temperature::next_chamber_check_ms); #endif @@ -400,12 +392,8 @@ const char str_t_thermal_runaway[] PROGMEM = STR_T_THERMAL_RUNAWAY, bool flag_cooler_state; //bool flag_cooler_excess = false; float previous_temp = 9999; - #ifdef COOLER_MINTEMP - int16_t Temperature::mintemp_raw_COOLER = TEMP_SENSOR_COOLER_RAW_LO_TEMP; - #endif - #ifdef COOLER_MAXTEMP - int16_t Temperature::maxtemp_raw_COOLER = TEMP_SENSOR_COOLER_RAW_HI_TEMP; - #endif + int16_t Temperature::mintemp_raw_COOLER = TEMP_SENSOR_COOLER_RAW_LO_TEMP, + Temperature::maxtemp_raw_COOLER = TEMP_SENSOR_COOLER_RAW_HI_TEMP; #if WATCH_COOLER cooler_watch_t Temperature::watch_cooler{0}; #endif @@ -419,7 +407,7 @@ const char str_t_thermal_runaway[] PROGMEM = STR_T_THERMAL_RUNAWAY, #if ENABLED(PREVENT_COLD_EXTRUSION) bool Temperature::allow_cold_extrude = false; - int16_t Temperature::extrude_min_temp = EXTRUDE_MINTEMP; + celsius_t Temperature::extrude_min_temp = EXTRUDE_MINTEMP; #endif // private: @@ -429,7 +417,7 @@ const char str_t_thermal_runaway[] PROGMEM = STR_T_THERMAL_RUNAWAY, #endif #if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT) - uint16_t Temperature::redundant_temperature_raw = 0; + celsius_t Temperature::redundant_temperature_raw = 0; float Temperature::redundant_temperature = 0.0; #endif @@ -474,7 +462,7 @@ volatile bool Temperature::raw_temps_ready = false; #endif #if ENABLED(SINGLENOZZLE_STANDBY_TEMP) - uint16_t Temperature::singlenozzle_temp[EXTRUDERS]; + celsius_t Temperature::singlenozzle_temp[EXTRUDERS]; #if HAS_FAN uint8_t Temperature::singlenozzle_fan_speed[EXTRUDERS]; #endif @@ -1566,22 +1554,22 @@ void Temperature::manage_heater() { * Bisect search for the range of the 'raw' value, then interpolate * proportionally between the under and over values. */ -#define SCAN_THERMISTOR_TABLE(TBL,LEN) do{ \ - uint8_t l = 0, r = LEN, m; \ - for (;;) { \ - m = (l + r) >> 1; \ - if (!m) return int16_t(pgm_read_word(&TBL[0].celsius)); \ - if (m == l || m == r) return int16_t(pgm_read_word(&TBL[LEN-1].celsius)); \ - int16_t v00 = pgm_read_word(&TBL[m-1].value), \ - v10 = pgm_read_word(&TBL[m-0].value); \ - if (raw < v00) r = m; \ - else if (raw > v10) l = m; \ - else { \ - const int16_t v01 = int16_t(pgm_read_word(&TBL[m-1].celsius)), \ - v11 = int16_t(pgm_read_word(&TBL[m-0].celsius)); \ - return v01 + (raw - v00) * float(v11 - v01) / float(v10 - v00); \ - } \ - } \ +#define SCAN_THERMISTOR_TABLE(TBL,LEN) do{ \ + uint8_t l = 0, r = LEN, m; \ + for (;;) { \ + m = (l + r) >> 1; \ + if (!m) return celsius_t(pgm_read_word(&TBL[0].celsius)); \ + if (m == l || m == r) return celsius_t(pgm_read_word(&TBL[LEN-1].celsius)); \ + int16_t v00 = pgm_read_word(&TBL[m-1].value), \ + v10 = pgm_read_word(&TBL[m-0].value); \ + if (raw < v00) r = m; \ + else if (raw > v10) l = m; \ + else { \ + const celsius_t v01 = celsius_t(pgm_read_word(&TBL[m-1].celsius)), \ + v11 = celsius_t(pgm_read_word(&TBL[m-0].celsius)); \ + return v01 + (raw - v00) * float(v11 - v01) / float(v10 - v00); \ + } \ + } \ }while(0) #if HAS_USER_THERMISTORS @@ -1663,7 +1651,7 @@ void Temperature::manage_heater() { SERIAL_EOL(); } - float Temperature::user_thermistor_to_deg_c(const uint8_t t_index, const int raw) { + celsius_t Temperature::user_thermistor_to_deg_c(const uint8_t t_index, const int raw) { //#if (MOTHERBOARD == BOARD_RAMPS_14_EFB) // static uint32_t clocks_total = 0; // static uint32_t calls = 0; @@ -1712,7 +1700,7 @@ void Temperature::manage_heater() { #if HAS_HOTEND // Derived from RepRap FiveD extruder::getTemperature() // For hot end temperature measurement. - float Temperature::analog_to_celsius_hotend(const int raw, const uint8_t e) { + celsius_t Temperature::analog_to_celsius_hotend(const int raw, const uint8_t e) { if (e > HOTENDS - DISABLED(TEMP_SENSOR_1_AS_REDUNDANT)) { SERIAL_ERROR_START(); SERIAL_ECHO(e); @@ -1821,7 +1809,7 @@ void Temperature::manage_heater() { #if HAS_HEATED_BED // For bed temperature measurement. - float Temperature::analog_to_celsius_bed(const int raw) { + celsius_t Temperature::analog_to_celsius_bed(const int raw) { #if TEMP_SENSOR_BED_IS_CUSTOM return user_thermistor_to_deg_c(CTI_BED, raw); #elif TEMP_SENSOR_BED_IS_THERMISTOR @@ -1839,7 +1827,7 @@ void Temperature::manage_heater() { #if HAS_TEMP_CHAMBER // For chamber temperature measurement. - float Temperature::analog_to_celsius_chamber(const int raw) { + celsius_t Temperature::analog_to_celsius_chamber(const int raw) { #if TEMP_SENSOR_CHAMBER_IS_CUSTOM return user_thermistor_to_deg_c(CTI_CHAMBER, raw); #elif TEMP_SENSOR_CHAMBER_IS_THERMISTOR @@ -1857,7 +1845,7 @@ void Temperature::manage_heater() { #if HAS_TEMP_COOLER // For cooler temperature measurement. - float Temperature::analog_to_celsius_cooler(const int raw) { + celsius_t Temperature::analog_to_celsius_cooler(const int raw) { #if TEMP_SENSOR_COOLER_IS_CUSTOM return user_thermistor_to_deg_c(CTI_COOLER, raw); #elif TEMP_SENSOR_COOLER_IS_THERMISTOR @@ -1875,7 +1863,7 @@ void Temperature::manage_heater() { #if HAS_TEMP_PROBE // For probe temperature measurement. - float Temperature::analog_to_celsius_probe(const int raw) { + celsius_t Temperature::analog_to_celsius_probe(const int raw) { #if TEMP_SENSOR_PROBE_IS_CUSTOM return user_thermistor_to_deg_c(CTI_PROBE, raw); #elif TEMP_SENSOR_PROBE_IS_THERMISTOR @@ -2191,13 +2179,13 @@ void Temperature::init() { #if HAS_HOTEND #define _TEMP_MIN_E(NR) do{ \ - const int16_t tmin = _MAX(HEATER_##NR##_MINTEMP, TERN(TEMP_SENSOR_##NR##_IS_CUSTOM, 0, (int16_t)pgm_read_word(&TEMPTABLE_##NR [TEMP_SENSOR_##NR##_MINTEMP_IND].celsius))); \ + const celsius_t tmin = _MAX(HEATER_##NR##_MINTEMP, TERN(TEMP_SENSOR_##NR##_IS_CUSTOM, 0, pgm_read_word(&TEMPTABLE_##NR [TEMP_SENSOR_##NR##_MINTEMP_IND].celsius))); \ temp_range[NR].mintemp = tmin; \ while (analog_to_celsius_hotend(temp_range[NR].raw_min, NR) < tmin) \ temp_range[NR].raw_min += TEMPDIR(NR) * (OVERSAMPLENR); \ }while(0) #define _TEMP_MAX_E(NR) do{ \ - const int16_t tmax = _MIN(HEATER_##NR##_MAXTEMP, TERN(TEMP_SENSOR_##NR##_IS_CUSTOM, 2000, (int16_t)pgm_read_word(&TEMPTABLE_##NR [TEMP_SENSOR_##NR##_MAXTEMP_IND].celsius) - 1)); \ + const celsius_t tmax = _MIN(HEATER_##NR##_MAXTEMP, TERN(TEMP_SENSOR_##NR##_IS_CUSTOM, 2000, pgm_read_word(&TEMPTABLE_##NR [TEMP_SENSOR_##NR##_MAXTEMP_IND].celsius) - 1)); \ temp_range[NR].maxtemp = tmax; \ while (analog_to_celsius_hotend(temp_range[NR].raw_max, NR) > tmax) \ temp_range[NR].raw_max -= TEMPDIR(NR) * (OVERSAMPLENR); \ @@ -2257,30 +2245,18 @@ void Temperature::init() { #endif // HAS_HOTEND #if HAS_HEATED_BED - #ifdef BED_MINTEMP - while (analog_to_celsius_bed(mintemp_raw_BED) < BED_MINTEMP) mintemp_raw_BED += TEMPDIR(BED) * (OVERSAMPLENR); - #endif - #ifdef BED_MAXTEMP - while (analog_to_celsius_bed(maxtemp_raw_BED) > BED_MAXTEMP) maxtemp_raw_BED -= TEMPDIR(BED) * (OVERSAMPLENR); - #endif - #endif // HAS_HEATED_BED + while (analog_to_celsius_bed(mintemp_raw_BED) < BED_MINTEMP) mintemp_raw_BED += TEMPDIR(BED) * (OVERSAMPLENR); + while (analog_to_celsius_bed(maxtemp_raw_BED) > BED_MAXTEMP) maxtemp_raw_BED -= TEMPDIR(BED) * (OVERSAMPLENR); + #endif #if HAS_HEATED_CHAMBER - #ifdef CHAMBER_MINTEMP - while (analog_to_celsius_chamber(mintemp_raw_CHAMBER) < CHAMBER_MINTEMP) mintemp_raw_CHAMBER += TEMPDIR(CHAMBER) * (OVERSAMPLENR); - #endif - #ifdef CHAMBER_MAXTEMP - while (analog_to_celsius_chamber(maxtemp_raw_CHAMBER) > CHAMBER_MAXTEMP) maxtemp_raw_CHAMBER -= TEMPDIR(CHAMBER) * (OVERSAMPLENR); - #endif + while (analog_to_celsius_chamber(mintemp_raw_CHAMBER) < CHAMBER_MINTEMP) mintemp_raw_CHAMBER += TEMPDIR(CHAMBER) * (OVERSAMPLENR); + while (analog_to_celsius_chamber(maxtemp_raw_CHAMBER) > CHAMBER_MAXTEMP) maxtemp_raw_CHAMBER -= TEMPDIR(CHAMBER) * (OVERSAMPLENR); #endif #if HAS_COOLER - #ifdef COOLER_MINTEMP - while (analog_to_celsius_cooler(mintemp_raw_COOLER) > COOLER_MINTEMP) mintemp_raw_COOLER += TEMPDIR(COOLER) * (OVERSAMPLENR); - #endif - #ifdef COOLER_MAXTEMP - while (analog_to_celsius_cooler(maxtemp_raw_COOLER) < COOLER_MAXTEMP) maxtemp_raw_COOLER -= TEMPDIR(COOLER) * (OVERSAMPLENR); - #endif + while (analog_to_celsius_cooler(mintemp_raw_COOLER) > COOLER_MINTEMP) mintemp_raw_COOLER += TEMPDIR(COOLER) * (OVERSAMPLENR); + while (analog_to_celsius_cooler(maxtemp_raw_COOLER) < COOLER_MAXTEMP) maxtemp_raw_COOLER -= TEMPDIR(COOLER) * (OVERSAMPLENR); #endif TERN_(PROBING_HEATERS_OFF, paused = false); @@ -2345,7 +2321,7 @@ void Temperature::init() { * * TODO: Embed the last 3 parameters during init, if not less optimal */ - void Temperature::tr_state_machine_t::run(const float ¤t, const float &target, const heater_id_t heater_id, const uint16_t period_seconds, const uint16_t hysteresis_degc) { + void Temperature::tr_state_machine_t::run(const float ¤t, const float &target, const heater_id_t heater_id, const uint16_t period_seconds, const celsius_t hysteresis_degc) { #if HEATER_IDLE_HANDLER // Convert the given heater_id_t to an idle array index @@ -2554,7 +2530,7 @@ void Temperature::disable_all_heaters() { #if HAS_MULTI_MAX_TC // Needed to return the correct temp when this is called between readings - static uint16_t max_tc_temp_previous[MAX_TC_COUNT] = { 0 }; + static celsius_t max_tc_temp_previous[MAX_TC_COUNT] = { 0 }; #define THERMO_TEMP(I) max_tc_temp_previous[I] #define THERMO_SEL(A,B) (hindex ? (B) : (A)) #define MAX6675_WRITE(V) do{ switch (hindex) { case 1: WRITE(MAX6675_SS2_PIN, V); break; default: WRITE(MAX6675_SS_PIN, V); } }while(0) diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index 38270fc9c4..c9e3575257 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -179,7 +179,7 @@ enum ADCSensorState : char { typedef struct TempInfo { uint16_t acc; int16_t raw; - float celsius; + celsius_t celsius; inline void reset() { acc = 0; } inline void sample(const uint16_t s) { acc += s; } inline void update() { raw = acc; } @@ -187,7 +187,7 @@ typedef struct TempInfo { // A PWM heater with temperature sensor typedef struct HeaterInfo : public TempInfo { - int16_t target; + celsius_t target; uint8_t soft_pwm_amount; } heater_info_t; @@ -228,14 +228,14 @@ struct PIDHeaterInfo : public HeaterInfo { // Heater watch handling template struct HeaterWatch { - uint16_t target; + celsius_t target; millis_t next_ms; inline bool elapsed(const millis_t &ms) { return next_ms && ELAPSED(ms, next_ms); } inline bool elapsed() { return elapsed(millis()); } - inline void restart(const int16_t curr, const int16_t tgt) { + inline void restart(const celsius_t curr, const celsius_t tgt) { if (tgt) { - const int16_t newtarget = curr + INCREASE; + const celsius_t newtarget = curr + INCREASE; if (newtarget < tgt - HYSTERESIS - 1) { target = newtarget; next_ms = millis() + SEC_TO_MS(PERIOD); @@ -261,8 +261,8 @@ struct HeaterWatch { // Temperature sensor read value ranges typedef struct { int16_t raw_min, raw_max; } raw_range_t; -typedef struct { int16_t mintemp, maxtemp; } celsius_range_t; -typedef struct { int16_t raw_min, raw_max, mintemp, maxtemp; } temp_range_t; +typedef struct { celsius_t mintemp, maxtemp; } celsius_range_t; +typedef struct { int16_t raw_min, raw_max; celsius_t mintemp, maxtemp; } temp_range_t; #define THERMISTOR_ABS_ZERO_C -273.15f // bbbbrrrrr cold ! #define THERMISTOR_RESISTANCE_NOMINAL_C 25.0f // mmmmm comfortable @@ -323,8 +323,8 @@ class Temperature { #if HAS_HOTEND #define HOTEND_TEMPS (HOTENDS + ENABLED(TEMP_SENSOR_1_AS_REDUNDANT)) static hotend_info_t temp_hotend[HOTEND_TEMPS]; - static const uint16_t hotend_maxtemp[HOTENDS]; - FORCE_INLINE static uint16_t hotend_max_target(const uint8_t e) { return hotend_maxtemp[e] - (HOTEND_OVERSHOOT); } + static const celsius_t hotend_maxtemp[HOTENDS]; + FORCE_INLINE static celsius_t hotend_max_target(const uint8_t e) { return hotend_maxtemp[e] - (HOTEND_OVERSHOOT); } #endif TERN_(HAS_HEATED_BED, static bed_info_t temp_bed); TERN_(HAS_TEMP_PROBE, static probe_info_t temp_probe); @@ -342,8 +342,8 @@ class Temperature { #if ENABLED(PREVENT_COLD_EXTRUSION) static bool allow_cold_extrude; - static int16_t extrude_min_temp; - FORCE_INLINE static bool tooCold(const int16_t temp) { return allow_cold_extrude ? false : temp < extrude_min_temp - (TEMP_WINDOW); } + static celsius_t extrude_min_temp; + FORCE_INLINE static bool tooCold(const celsius_t temp) { return allow_cold_extrude ? false : temp < extrude_min_temp - (TEMP_WINDOW); } FORCE_INLINE static bool tooColdToExtrude(const uint8_t E_NAME) { return tooCold(degHotend(HOTEND_INDEX)); } @@ -359,7 +359,7 @@ class Temperature { FORCE_INLINE static bool targetHotEnoughToExtrude(const uint8_t e) { return !targetTooColdToExtrude(e); } #if ENABLED(SINGLENOZZLE_STANDBY_FAN) - static uint16_t singlenozzle_temp[EXTRUDERS]; + static celsius_t singlenozzle_temp[EXTRUDERS]; #if HAS_FAN static uint8_t singlenozzle_fan_speed[EXTRUDERS]; #endif @@ -411,7 +411,7 @@ class Temperature { #if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT) static uint16_t redundant_temperature_raw; - static float redundant_temperature; + static celsius_t redundant_temperature; #endif #if ENABLED(PID_EXTRUSION_SCALING) @@ -424,34 +424,19 @@ class Temperature { #if HAS_HEATED_BED TERN_(WATCH_BED, static bed_watch_t watch_bed); IF_DISABLED(PIDTEMPBED, static millis_t next_bed_check_ms); - #ifdef BED_MINTEMP - static int16_t mintemp_raw_BED; - #endif - #ifdef BED_MAXTEMP - static int16_t maxtemp_raw_BED; - #endif + static int16_t mintemp_raw_BED, maxtemp_raw_BED; #endif #if HAS_HEATED_CHAMBER TERN_(WATCH_CHAMBER, static chamber_watch_t watch_chamber); TERN(PIDTEMPCHAMBER,,static millis_t next_chamber_check_ms); - #ifdef CHAMBER_MINTEMP - static int16_t mintemp_raw_CHAMBER; - #endif - #ifdef CHAMBER_MAXTEMP - static int16_t maxtemp_raw_CHAMBER; - #endif + static int16_t mintemp_raw_CHAMBER, maxtemp_raw_CHAMBER; #endif #if HAS_COOLER TERN_(WATCH_COOLER, static cooler_watch_t watch_cooler); static millis_t next_cooler_check_ms, cooler_fan_flush_ms; - #ifdef COOLER_MINTEMP - static int16_t mintemp_raw_COOLER; - #endif - #ifdef COOLER_MAXTEMP - static int16_t maxtemp_raw_COOLER; - #endif + static int16_t mintemp_raw_COOLER, maxtemp_raw_COOLER; #endif #ifdef MAX_CONSECUTIVE_LOW_TEMPERATURE_ERROR_ALLOWED @@ -488,7 +473,7 @@ class Temperature { static user_thermistor_t user_thermistor[USER_THERMISTORS]; static void log_user_thermistor(const uint8_t t_index, const bool eprom=false); static void reset_user_thermistors(); - static float user_thermistor_to_deg_c(const uint8_t t_index, const int raw); + static celsius_t user_thermistor_to_deg_c(const uint8_t t_index, const int raw); static bool set_pull_up_res(int8_t t_index, float value) { //if (!WITHIN(t_index, 0, USER_THERMISTORS - 1)) return false; if (!WITHIN(value, 1, 1000000)) return false; @@ -516,19 +501,19 @@ class Temperature { #endif #if HAS_HOTEND - static float analog_to_celsius_hotend(const int raw, const uint8_t e); + static celsius_t analog_to_celsius_hotend(const int raw, const uint8_t e); #endif #if HAS_HEATED_BED - static float analog_to_celsius_bed(const int raw); + static celsius_t analog_to_celsius_bed(const int raw); #endif #if HAS_TEMP_PROBE - static float analog_to_celsius_probe(const int raw); + static celsius_t analog_to_celsius_probe(const int raw); #endif #if HAS_TEMP_CHAMBER - static float analog_to_celsius_chamber(const int raw); + static celsius_t analog_to_celsius_chamber(const int raw); #endif #if HAS_TEMP_COOLER - static float analog_to_celsius_cooler(const int raw); + static celsius_t analog_to_celsius_cooler(const int raw); #endif #if HAS_FAN @@ -620,7 +605,7 @@ class Temperature { } #endif - FORCE_INLINE static int16_t degTargetHotend(const uint8_t E_NAME) { + FORCE_INLINE static celsius_t degTargetHotend(const uint8_t E_NAME) { return TERN0(HAS_HOTEND, temp_hotend[HOTEND_INDEX].target); } @@ -632,7 +617,7 @@ class Temperature { #if HAS_HOTEND - static void setTargetHotend(const int16_t celsius, const uint8_t E_NAME) { + static void setTargetHotend(const celsius_t celsius, const uint8_t E_NAME) { const uint8_t ee = HOTEND_INDEX; #ifdef MILLISECONDS_PREHEAT_TIME if (celsius == 0) @@ -678,12 +663,12 @@ class Temperature { #if HAS_HEATED_BED #if ENABLED(SHOW_TEMP_ADC_VALUES) - FORCE_INLINE static int16_t rawBedTemp() { return temp_bed.raw; } + FORCE_INLINE static int16_t rawBedTemp() { return temp_bed.raw; } #endif - FORCE_INLINE static float degBed() { return temp_bed.celsius; } - FORCE_INLINE static int16_t degTargetBed() { return temp_bed.target; } - FORCE_INLINE static bool isHeatingBed() { return temp_bed.target > temp_bed.celsius; } - FORCE_INLINE static bool isCoolingBed() { return temp_bed.target < temp_bed.celsius; } + FORCE_INLINE static celsius_t degBed() { return temp_bed.celsius; } + FORCE_INLINE static celsius_t degTargetBed() { return temp_bed.target; } + FORCE_INLINE static bool isHeatingBed() { return temp_bed.target > temp_bed.celsius; } + FORCE_INLINE static bool isCoolingBed() { return temp_bed.target < temp_bed.celsius; } #if WATCH_BED static void start_watching_bed(); @@ -691,15 +676,9 @@ class Temperature { static inline void start_watching_bed() {} #endif - static void setTargetBed(const int16_t celsius) { + static void setTargetBed(const celsius_t celsius) { TERN_(AUTO_POWER_CONTROL, if (celsius) powerManager.power_on()); - temp_bed.target = - #ifdef BED_MAX_TARGET - _MIN(celsius, BED_MAX_TARGET) - #else - celsius - #endif - ; + temp_bed.target = _MIN(celsius, BED_MAX_TARGET); start_watching_bed(); } @@ -735,14 +714,13 @@ class Temperature { #if HAS_TEMP_CHAMBER #if ENABLED(SHOW_TEMP_ADC_VALUES) - FORCE_INLINE static int16_t rawChamberTemp() { return temp_chamber.raw; } + FORCE_INLINE static int16_t rawChamberTemp() { return temp_chamber.raw; } #endif - FORCE_INLINE static float degChamber() { return temp_chamber.celsius; } + FORCE_INLINE static float degChamber() { return temp_chamber.celsius; } #if HAS_HEATED_CHAMBER - FORCE_INLINE static int16_t degTargetChamber() { return temp_chamber.target; } - FORCE_INLINE static bool isHeatingChamber() { return temp_chamber.target > temp_chamber.celsius; } - FORCE_INLINE static bool isCoolingChamber() { return temp_chamber.target < temp_chamber.celsius; } - + FORCE_INLINE static celsius_t degTargetChamber() { return temp_chamber.target; } + FORCE_INLINE static bool isHeatingChamber() { return temp_chamber.target > temp_chamber.celsius; } + FORCE_INLINE static bool isCoolingChamber() { return temp_chamber.target < temp_chamber.celsius; } static bool wait_for_chamber(const bool no_wait_for_cooling=true); #endif #endif @@ -754,27 +732,21 @@ class Temperature { #endif #if HAS_HEATED_CHAMBER - static void setTargetChamber(const int16_t celsius) { - temp_chamber.target = - #ifdef CHAMBER_MAXTEMP - _MIN(celsius, CHAMBER_MAXTEMP - 10) - #else - celsius - #endif - ; + static void setTargetChamber(const celsius_t celsius) { + temp_chamber.target = _MIN(celsius, CHAMBER_MAX_TARGET); start_watching_chamber(); } #endif #if HAS_TEMP_COOLER #if ENABLED(SHOW_TEMP_ADC_VALUES) - FORCE_INLINE static int16_t rawCoolerTemp() { return temp_cooler.raw; } + FORCE_INLINE static int16_t rawCoolerTemp() { return temp_cooler.raw; } #endif - FORCE_INLINE static float degCooler() { return temp_cooler.celsius; } + FORCE_INLINE static float degCooler() { return temp_cooler.celsius; } #if HAS_COOLER - FORCE_INLINE static int16_t degTargetCooler() { return temp_cooler.target; } - FORCE_INLINE static bool isLaserHeating() { return temp_cooler.target > temp_cooler.celsius; } - FORCE_INLINE static bool isLaserCooling() { return temp_cooler.target < temp_cooler.celsius; } + FORCE_INLINE static celsius_t degTargetCooler() { return temp_cooler.target; } + FORCE_INLINE static bool isLaserHeating() { return temp_cooler.target > temp_cooler.celsius; } + FORCE_INLINE static bool isLaserCooling() { return temp_cooler.target < temp_cooler.celsius; } static bool wait_for_cooler(const bool no_wait_for_cooling=true); #endif #endif @@ -786,7 +758,7 @@ class Temperature { #endif #if HAS_COOLER - static void setTargetCooler(const int16_t celsius) { + static void setTargetCooler(const celsius_t celsius) { temp_cooler.target = constrain(celsius, COOLER_MIN_TARGET, COOLER_MAX_TARGET); start_watching_cooler(); } @@ -945,7 +917,7 @@ class Temperature { millis_t timer = 0; TRState state = TRInactive; float running_temp; - void run(const float ¤t, const float &target, const heater_id_t heater_id, const uint16_t period_seconds, const uint16_t hysteresis_degc); + void run(const float ¤t, const float &target, const heater_id_t heater_id, const uint16_t period_seconds, const celsius_t hysteresis_degc); } tr_state_machine_t; static tr_state_machine_t tr_state_machine[NR_HEATER_RUNAWAY]; diff --git a/Marlin/src/module/thermistor/thermistors.h b/Marlin/src/module/thermistor/thermistors.h index f0ec289dfe..0871844e39 100644 --- a/Marlin/src/module/thermistor/thermistors.h +++ b/Marlin/src/module/thermistor/thermistors.h @@ -44,7 +44,7 @@ #define ANY_THERMISTOR_IS(n) (TEMP_SENSOR_0_THERMISTOR_ID == n || TEMP_SENSOR_1_THERMISTOR_ID == n || TEMP_SENSOR_2_THERMISTOR_ID == n || TEMP_SENSOR_3_THERMISTOR_ID == n || TEMP_SENSOR_4_THERMISTOR_ID == n || TEMP_SENSOR_5_THERMISTOR_ID == n || TEMP_SENSOR_6_THERMISTOR_ID == n || TEMP_SENSOR_7_THERMISTOR_ID == n || TEMP_SENSOR_BED_THERMISTOR_ID == n || TEMP_SENSOR_CHAMBER_THERMISTOR_ID == n || TEMP_SENSOR_COOLER_THERMISTOR_ID == n || TEMP_SENSOR_PROBE_THERMISTOR_ID == n) -typedef struct { int16_t value, celsius; } temp_entry_t; +typedef struct { int16_t value; celsius_t celsius; } temp_entry_t; // Pt1000 and Pt100 handling // From 155dea6f14d18f6b0f272cb2718ba4c28f3afe1d Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 23 Mar 2021 23:58:53 -0500 Subject: [PATCH 187/253] Tweak mf helper scripts --- buildroot/bin/mftest | 14 ++++++++------ buildroot/share/git/mfqp | 5 +++-- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/buildroot/bin/mftest b/buildroot/bin/mftest index 4cecf4f3a5..906e2abf87 100755 --- a/buildroot/bin/mftest +++ b/buildroot/bin/mftest @@ -28,6 +28,7 @@ OPTIONS -a --autobuild PIO Build using the MOTHERBOARD environment. -u --autoupload PIO Upload using the MOTHERBOARD environment. -v --verbose Extra output for debugging. + -s --silent Silence build output from PlatformIO. env shortcuts: tree due esp lin lpc|lpc8 lpc9 m128 m256|mega stm|f1 f4 f7 s6 teensy|t31|t32 t35|t36 t40|t41 " @@ -62,6 +63,7 @@ while getopts 'abhmruvyn:t:-:' OFLAG; do esac ;; r) REBUILD=1 ; bugout "Rebuilding previous..." ;; + s) SILENT_FLAG="-s" ;; t) TESTENV="$OPTARG" ; bugout "Got a target: $TESTENV" ;; u) AUTO_BUILD=2 ; bugout "Auto-Upload target..." ;; v) DEBUG=1 ; bugout "Debug ON" ;; @@ -105,8 +107,8 @@ if ((REBUILD)); then # Build with the last-built env [[ -f "$STATE_FILE" ]] || { errout "No previous (-r) build state found." ; exit 1 ; } read TESTENV <"$STATE_FILE" - pio run -s -d . -e $TESTENV - exit + pio run $SILENT_FLAG -d . -e $TESTENV + exit 0 fi case $TESTENV in @@ -189,12 +191,12 @@ if ((AUTO_BUILD)); then if ((AUTO_BUILD == 2)); then echo "Uploading environment $TARGET for board $MB ($BNUM)..." ; echo - pio run -t upload -e $TARGET + pio run $SILENT_FLAG -t upload -e $TARGET else echo "Building environment $TARGET for board $MB ($BNUM)..." ; echo - pio run -s -e $TARGET + pio run $SILENT_FLAG -e $TARGET fi - exit + exit 0 fi # @@ -306,6 +308,6 @@ fi [[ $BUILD_YES == 'Y' || $BUILD_YES == 'Yes' ]] && { ((USE_MAKE)) && make tests-single-local TEST_TARGET=$TESTENV ONLY_TEST=$CHOICE - ((USE_MAKE)) || pio run -s -d . -e $TESTENV + ((USE_MAKE)) || pio run $SILENT_FLAG -d . -e $TESTENV echo "$TESTENV" >"$STATE_FILE" } diff --git a/buildroot/share/git/mfqp b/buildroot/share/git/mfqp index 5650d08252..f0c4446a21 100755 --- a/buildroot/share/git/mfqp +++ b/buildroot/share/git/mfqp @@ -4,7 +4,7 @@ # # - git add . # - git commit --amend -# - ghpc +# - git push -f # MFINFO=$(mfinfo "$@") || exit 1 @@ -17,6 +17,7 @@ IND=6 while [ $IND -lt ${#INFO[@]} ]; do ARG=${INFO[$IND]} case "$ARG" in + -f|--force ) FORCE=1 ;; -h|--help ) USAGE=1 ;; * ) USAGE=1 ; echo "unknown option: $ARG" ;; esac @@ -25,6 +26,6 @@ done [[ $USAGE == 1 ]] && { echo "usage: `basename $0` [1|2|3]" 1>&2 ; exit 1 ; } -[[ $CURR == $TARG && $REPO != "MarlinDocumentation" ]] && { echo "Don't alter the PR Target branch."; exit 1 ; } +[[ $FORCE != 1 && $CURR == $TARG && $REPO != "MarlinDocumentation" ]] && { echo "Don't alter the PR Target branch."; exit 1 ; } git add . && git commit --amend && git push -f From 8fca37f3737e66150c1ed5b5793e2c48dd108b23 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 23 Mar 2021 23:54:23 -0500 Subject: [PATCH 188/253] Misc LCD cleanup --- Marlin/src/lcd/dogm/marlinui_DOGM.cpp | 35 +- .../extui/lib/mks_ui/draw_level_settings.cpp | 4 +- .../lcd/extui/lib/mks_ui/draw_manuaLevel.cpp | 2 +- .../lcd/extui/lib/mks_ui/draw_number_key.cpp | 392 ++++-------------- ...ngs.cpp => draw_tramming_pos_settings.cpp} | 36 +- ...ettings.h => draw_tramming_pos_settings.h} | 4 +- Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp | 24 +- Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h | 4 +- .../lcd/extui/lib/mks_ui/tft_Language_en.h | 2 +- .../lcd/extui/lib/mks_ui/tft_Language_ru.h | 2 +- .../lcd/extui/lib/mks_ui/tft_Language_s_cn.h | 2 +- .../lcd/extui/lib/mks_ui/tft_Language_t_cn.h | 2 +- .../extui/lib/mks_ui/tft_multi_language.cpp | 8 +- .../lcd/extui/lib/mks_ui/tft_multi_language.h | 2 +- Marlin/src/lcd/menu/menu_bed_corners.cpp | 7 +- 15 files changed, 151 insertions(+), 375 deletions(-) rename Marlin/src/lcd/extui/lib/mks_ui/{draw_manual_level_pos_settings.cpp => draw_tramming_pos_settings.cpp} (80%) rename Marlin/src/lcd/extui/lib/mks_ui/{draw_manual_level_pos_settings.h => draw_tramming_pos_settings.h} (91%) diff --git a/Marlin/src/lcd/dogm/marlinui_DOGM.cpp b/Marlin/src/lcd/dogm/marlinui_DOGM.cpp index 7334ba5f26..a3b14d8609 100644 --- a/Marlin/src/lcd/dogm/marlinui_DOGM.cpp +++ b/Marlin/src/lcd/dogm/marlinui_DOGM.cpp @@ -574,6 +574,12 @@ void MarlinUI::clear_lcd() { } // Automatically cleared by Picture Loop #if EITHER(BABYSTEP_ZPROBE_GFX_OVERLAY, MESH_EDIT_GFX_OVERLAY) + // + // Draw knob rotation => Z motion key for: + // - menu.cpp:lcd_babystep_zoffset + // - menu_ubl.cpp:_lcd_mesh_fine_tune + // + const unsigned char cw_bmp[] PROGMEM = { B00000000,B11111110,B00000000, B00000011,B11111111,B10000000, @@ -672,28 +678,23 @@ void MarlinUI::clear_lcd() { } // Automatically cleared by Picture Loop old_zvalue = zvalue; } - #if ENABLED(OVERLAY_GFX_REVERSE) - const unsigned char *rot_up = ccw_bmp, *rot_down = cw_bmp; - #else - const unsigned char *rot_up = cw_bmp, *rot_down = ccw_bmp; - #endif + const unsigned char *rot_up = TERN(OVERLAY_GFX_REVERSE, ccw_bmp, cw_bmp), + *rot_down = TERN(OVERLAY_GFX_REVERSE, cw_bmp, ccw_bmp); - #if ENABLED(USE_BIG_EDIT_FONT) - const int left = 0, right = 45, nozzle = 95; - #else - const int left = 5, right = 90, nozzle = 60; - #endif + const int left = TERN(USE_BIG_EDIT_FONT, 0, 5), + right = TERN(USE_BIG_EDIT_FONT, 45, 90), + nozzle = TERN(USE_BIG_EDIT_FONT, 95, 60); - // Draw a representation of the nozzle - if (PAGE_CONTAINS(3, 16)) u8g.drawBitmapP(nozzle + 6, 4 - dir, 2, 12, nozzle_bmp); - if (PAGE_CONTAINS(20, 20)) u8g.drawBitmapP(nozzle + 0, 20, 3, 1, offset_bedline_bmp); + // Draw nozzle lowered or raised according to direction moved + if (PAGE_CONTAINS( 3, 16)) u8g.drawBitmapP(nozzle + 6, 4 - dir, 2, 12, nozzle_bmp); + if (PAGE_CONTAINS(20, 20)) u8g.drawBitmapP(nozzle + 0, 20 , 3, 1, offset_bedline_bmp); // Draw cw/ccw indicator and up/down arrows. if (PAGE_CONTAINS(47, 62)) { - u8g.drawBitmapP(right + 0, 48 - dir, 2, 13, up_arrow_bmp); - u8g.drawBitmapP(left + 0, 49 - dir, 2, 13, down_arrow_bmp); - u8g.drawBitmapP(left + 13, 47, 3, 16, rot_down); - u8g.drawBitmapP(right + 13, 47, 3, 16, rot_up); + u8g.drawBitmapP(right + 0, 48 - dir, 2, 13, up_arrow_bmp); + u8g.drawBitmapP(left + 0, 49 - dir, 2, 13, down_arrow_bmp); + u8g.drawBitmapP(left + 13, 47 , 3, 16, rot_down); + u8g.drawBitmapP(right + 13, 47 , 3, 16, rot_up); } } diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_level_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_level_settings.cpp index b5c1890309..015c95a68f 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_level_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_level_settings.cpp @@ -46,7 +46,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { draw_return_ui(); break; case ID_LEVEL_POSITION: - lv_draw_manual_level_pos_settings(); + lv_draw_tramming_pos_settings(); break; case ID_LEVEL_COMMAND: keyboard_value = autoLevelGcodeCommand; @@ -62,7 +62,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { void lv_draw_level_settings() { scr = lv_screen_create(LEVELING_PARA_UI, machine_menu.LevelingParaConfTitle); - lv_screen_menu_item(scr, machine_menu.LevelingManuPosConf, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_LEVEL_POSITION, 0); + lv_screen_menu_item(scr, machine_menu.TrammingPosConf, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_LEVEL_POSITION, 0); lv_screen_menu_item(scr, machine_menu.LevelingAutoCommandConf, PARA_UI_POS_X, PARA_UI_POS_Y * 2, event_handler, ID_LEVEL_COMMAND, 1); #if HAS_BED_PROBE lv_screen_menu_item(scr, machine_menu.LevelingAutoZoffsetConf, PARA_UI_POS_X, PARA_UI_POS_Y * 3, event_handler, ID_LEVEL_ZOFFSET, 2); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp index 039591b03e..9734dd94ae 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.cpp @@ -54,7 +54,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { queue.inject_P(G28_STR); } const int ind = obj->mks_obj_id - ID_M_POINT1; - sprintf_P(public_buf_l, PSTR("G1 Z10\nG1 X%d Y%d\nG1 Z0"), (int)gCfgItems.levelingPos[ind][0], (int)gCfgItems.levelingPos[ind][1]); + sprintf_P(public_buf_l, PSTR("G1 Z10\nG1 X%d Y%d\nG1 Z0"), (int)gCfgItems.trammingPos[ind][X_AXIS], (int)gCfgItems.trammingPos[ind][Y_AXIS]); queue.inject(public_buf_l); } break; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.cpp index 91a1fce28d..092dcce083 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.cpp @@ -204,44 +204,44 @@ static void disp_key_value() { sprintf_P(public_buf_m, PSTR("%s"), dtostrf(gCfgItems.pausePosZ, 1, 1, str_1)); break; case level_pos_x1: - sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.levelingPos[0][0]); + sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.trammingPos[0][X_AXIS]); break; case level_pos_y1: - sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.levelingPos[0][1]); + sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.trammingPos[0][Y_AXIS]); break; case level_pos_x2: - sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.levelingPos[1][0]); + sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.trammingPos[1][X_AXIS]); break; case level_pos_y2: - sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.levelingPos[1][1]); + sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.trammingPos[1][Y_AXIS]); break; case level_pos_x3: - sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.levelingPos[2][0]); + sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.trammingPos[2][X_AXIS]); break; case level_pos_y3: - sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.levelingPos[2][1]); + sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.trammingPos[2][Y_AXIS]); break; case level_pos_x4: - sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.levelingPos[3][0]); + sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.trammingPos[3][X_AXIS]); break; case level_pos_y4: - sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.levelingPos[3][1]); + sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.trammingPos[3][Y_AXIS]); break; case level_pos_x5: - sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.levelingPos[4][0]); + sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.trammingPos[4][X_AXIS]); break; case level_pos_y5: - sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.levelingPos[4][1]); + sprintf_P(public_buf_m, PSTR("%d"), (int)gCfgItems.trammingPos[4][Y_AXIS]); break; #if HAS_BED_PROBE case x_offset: #if HAS_PROBE_XY_OFFSET - sprintf_P(public_buf_m, PSTR("%s"), dtostrf(probe.offset.x, 1, 3, str_1)); + sprintf_P(public_buf_m, PSTR("%s"), dtostrf(probe.offset.x, 1, 3, str_1)); #endif break; case y_offset: #if HAS_PROBE_XY_OFFSET - sprintf_P(public_buf_m, PSTR("%s"), dtostrf(probe.offset.y, 1, 3, str_1)); + sprintf_P(public_buf_m, PSTR("%s"), dtostrf(probe.offset.y, 1, 3, str_1)); #endif break; case z_offset: @@ -295,194 +295,87 @@ static void disp_key_value() { } static void set_value_confirm() { - #if HAS_TRINAMIC_CONFIG - uint16_t current_mA; - #endif switch (value) { - case PrintAcceleration: - planner.settings.acceleration = atof(key_value); - break; - case RetractAcceleration: - planner.settings.retract_acceleration = atof(key_value); - break; - case TravelAcceleration: - planner.settings.travel_acceleration = atof(key_value); - break; - case XAcceleration: - planner.settings.max_acceleration_mm_per_s2[X_AXIS] = atof(key_value); - break; - case YAcceleration: - planner.settings.max_acceleration_mm_per_s2[Y_AXIS] = atof(key_value); - break; - case ZAcceleration: - planner.settings.max_acceleration_mm_per_s2[Z_AXIS] = atof(key_value); - break; - case E0Acceleration: - planner.settings.max_acceleration_mm_per_s2[E_AXIS] = atof(key_value); - break; - case E1Acceleration: - planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(1)] = atof(key_value); - break; - case XMaxFeedRate: - planner.settings.max_feedrate_mm_s[X_AXIS] = atof(key_value); - break; - case YMaxFeedRate: - planner.settings.max_feedrate_mm_s[Y_AXIS] = atof(key_value); - break; - case ZMaxFeedRate: - planner.settings.max_feedrate_mm_s[Z_AXIS] = atof(key_value); - break; - case E0MaxFeedRate: - planner.settings.max_feedrate_mm_s[E_AXIS] = atof(key_value); - break; - case E1MaxFeedRate: - planner.settings.max_feedrate_mm_s[E_AXIS_N(1)] = atof(key_value); - break; - case XJerk: - #if HAS_CLASSIC_JERK - planner.max_jerk[X_AXIS] = atof(key_value); - #endif - break; - case YJerk: - #if HAS_CLASSIC_JERK - planner.max_jerk[Y_AXIS] = atof(key_value); - #endif - break; - case ZJerk: - #if HAS_CLASSIC_JERK - planner.max_jerk[Z_AXIS] = atof(key_value); - #endif - break; - case EJerk: - #if HAS_CLASSIC_JERK - planner.max_jerk[E_AXIS] = atof(key_value); - #endif - break; - case Xstep: - planner.settings.axis_steps_per_mm[X_AXIS] = atof(key_value); - planner.refresh_positioning(); - break; - case Ystep: - planner.settings.axis_steps_per_mm[Y_AXIS] = atof(key_value); - planner.refresh_positioning(); - break; - case Zstep: - planner.settings.axis_steps_per_mm[Z_AXIS] = atof(key_value); - planner.refresh_positioning(); - break; - case E0step: - planner.settings.axis_steps_per_mm[E_AXIS] = atof(key_value); - planner.refresh_positioning(); - break; - case E1step: - planner.settings.axis_steps_per_mm[E_AXIS_N(1)] = atof(key_value); - planner.refresh_positioning(); - break; + case PrintAcceleration: planner.settings.acceleration = atof(key_value); break; + case RetractAcceleration: planner.settings.retract_acceleration = atof(key_value); break; + case TravelAcceleration: planner.settings.travel_acceleration = atof(key_value); break; + case XAcceleration: planner.settings.max_acceleration_mm_per_s2[X_AXIS] = atof(key_value); break; + case YAcceleration: planner.settings.max_acceleration_mm_per_s2[Y_AXIS] = atof(key_value); break; + case ZAcceleration: planner.settings.max_acceleration_mm_per_s2[Z_AXIS] = atof(key_value); break; + case E0Acceleration: planner.settings.max_acceleration_mm_per_s2[E_AXIS] = atof(key_value); break; + case E1Acceleration: planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(1)] = atof(key_value); break; + case XMaxFeedRate: planner.settings.max_feedrate_mm_s[X_AXIS] = atof(key_value); break; + case YMaxFeedRate: planner.settings.max_feedrate_mm_s[Y_AXIS] = atof(key_value); break; + case ZMaxFeedRate: planner.settings.max_feedrate_mm_s[Z_AXIS] = atof(key_value); break; + case E0MaxFeedRate: planner.settings.max_feedrate_mm_s[E_AXIS] = atof(key_value); break; + case E1MaxFeedRate: planner.settings.max_feedrate_mm_s[E_AXIS_N(1)] = atof(key_value); break; + case XJerk: TERN_(HAS_CLASSIC_JERK, planner.max_jerk[X_AXIS] = atof(key_value)); break; + case YJerk: TERN_(HAS_CLASSIC_JERK, planner.max_jerk[Y_AXIS] = atof(key_value)); break; + case ZJerk: TERN_(HAS_CLASSIC_JERK, planner.max_jerk[Z_AXIS] = atof(key_value)); break; + case EJerk: TERN_(HAS_CLASSIC_JERK, planner.max_jerk[E_AXIS] = atof(key_value)); break; + case Xstep: planner.settings.axis_steps_per_mm[X_AXIS] = atof(key_value); planner.refresh_positioning(); break; + case Ystep: planner.settings.axis_steps_per_mm[Y_AXIS] = atof(key_value); planner.refresh_positioning(); break; + case Zstep: planner.settings.axis_steps_per_mm[Z_AXIS] = atof(key_value); planner.refresh_positioning(); break; + case E0step: planner.settings.axis_steps_per_mm[E_AXIS] = atof(key_value); planner.refresh_positioning(); break; + case E1step: planner.settings.axis_steps_per_mm[E_AXIS_N(1)] = atof(key_value); planner.refresh_positioning(); break; case Xcurrent: #if AXIS_IS_TMC(X) - current_mA = atoi(key_value); - stepperX.rms_current(current_mA); + stepperX.rms_current(atoi(key_value)); #endif break; case Ycurrent: #if AXIS_IS_TMC(Y) - current_mA = atoi(key_value); - stepperY.rms_current(current_mA); + stepperY.rms_current(atoi(key_value)); #endif break; case Zcurrent: #if AXIS_IS_TMC(Z) - current_mA = atoi(key_value); - stepperZ.rms_current(current_mA); + stepperZ.rms_current(atoi(key_value)); #endif break; case E0current: #if AXIS_IS_TMC(E0) - current_mA = atoi(key_value); - stepperE0.rms_current(current_mA); + stepperE0.rms_current(atoi(key_value)); #endif break; case E1current: #if AXIS_IS_TMC(E1) - current_mA = atoi(key_value); - stepperE1.rms_current(current_mA); + stepperE1.rms_current(atoi(key_value)); #endif break; - case pause_pos_x: - gCfgItems.pausePosX = atof(key_value); - update_spi_flash(); - break; - case pause_pos_y: - gCfgItems.pausePosY = atof(key_value); - update_spi_flash(); - break; - case pause_pos_z: - gCfgItems.pausePosZ = atof(key_value); - update_spi_flash(); - break; - case level_pos_x1: - gCfgItems.levelingPos[0][0] = atoi(key_value); - update_spi_flash(); - break; - case level_pos_y1: - gCfgItems.levelingPos[0][1] = atoi(key_value); - update_spi_flash(); - break; - case level_pos_x2: - gCfgItems.levelingPos[1][0] = atoi(key_value); - update_spi_flash(); - break; - case level_pos_y2: - gCfgItems.levelingPos[1][1] = atoi(key_value); - update_spi_flash(); - break; - case level_pos_x3: - gCfgItems.levelingPos[2][0] = atoi(key_value); - update_spi_flash(); - break; - case level_pos_y3: - gCfgItems.levelingPos[2][1] = atoi(key_value); - update_spi_flash(); - break; - case level_pos_x4: - gCfgItems.levelingPos[3][0] = atoi(key_value); - update_spi_flash(); - break; - case level_pos_y4: - gCfgItems.levelingPos[3][1] = atoi(key_value); - update_spi_flash(); - break; - case level_pos_x5: - gCfgItems.levelingPos[4][0] = atoi(key_value); - update_spi_flash(); - break; - case level_pos_y5: - gCfgItems.levelingPos[4][1] = atoi(key_value); - update_spi_flash(); - break; + case pause_pos_x: gCfgItems.pausePosX = atof(key_value); update_spi_flash(); break; + case pause_pos_y: gCfgItems.pausePosY = atof(key_value); update_spi_flash(); break; + case pause_pos_z: gCfgItems.pausePosZ = atof(key_value); update_spi_flash(); break; + case level_pos_x1: gCfgItems.trammingPos[0][X_AXIS] = atoi(key_value); update_spi_flash(); break; + case level_pos_y1: gCfgItems.trammingPos[0][Y_AXIS] = atoi(key_value); update_spi_flash(); break; + case level_pos_x2: gCfgItems.trammingPos[1][X_AXIS] = atoi(key_value); update_spi_flash(); break; + case level_pos_y2: gCfgItems.trammingPos[1][Y_AXIS] = atoi(key_value); update_spi_flash(); break; + case level_pos_x3: gCfgItems.trammingPos[2][X_AXIS] = atoi(key_value); update_spi_flash(); break; + case level_pos_y3: gCfgItems.trammingPos[2][Y_AXIS] = atoi(key_value); update_spi_flash(); break; + case level_pos_x4: gCfgItems.trammingPos[3][X_AXIS] = atoi(key_value); update_spi_flash(); break; + case level_pos_y4: gCfgItems.trammingPos[3][Y_AXIS] = atoi(key_value); update_spi_flash(); break; + case level_pos_x5: gCfgItems.trammingPos[4][X_AXIS] = atoi(key_value); update_spi_flash(); break; + case level_pos_y5: gCfgItems.trammingPos[4][Y_AXIS] = atoi(key_value); update_spi_flash(); break; #if HAS_BED_PROBE - case x_offset: + case x_offset: { #if HAS_PROBE_XY_OFFSET - float x; - x = atof(key_value); + const float x = atof(key_value); if (WITHIN(x, -(X_BED_SIZE), X_BED_SIZE)) probe.offset.x = x; #endif - break; - case y_offset: + } break; + case y_offset: { #if HAS_PROBE_XY_OFFSET - float y; - y = atof(key_value); + const float y = atof(key_value); if (WITHIN(y, -(Y_BED_SIZE), Y_BED_SIZE)) probe.offset.y = y; #endif - break; - case z_offset: - float z; - z = atof(key_value); + } break; + case z_offset: { + const float z = atof(key_value); if (WITHIN(z, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX)) probe.offset.z = z; - break; + } break; #endif case load_length: gCfgItems.filamentchange_load_length = atoi(key_value); @@ -508,26 +401,10 @@ static void set_value_confirm() { gCfgItems.filament_limit_temp = atoi(key_value); update_spi_flash(); break; - case x_sensitivity: - #if X_SENSORLESS - stepperX.homing_threshold(atoi(key_value)); - #endif - break; - case y_sensitivity: - #if Y_SENSORLESS - stepperY.homing_threshold(atoi(key_value)); - #endif - break; - case z_sensitivity: - #if Z_SENSORLESS - stepperZ.homing_threshold(atoi(key_value)); - #endif - break; - case z2_sensitivity: - #if Z2_SENSORLESS - stepperZ2.homing_threshold(atoi(key_value)); - #endif - break; + case x_sensitivity: TERN_(X_SENSORLESS, stepperX.homing_threshold(atoi(key_value))); break; + case y_sensitivity: TERN_(Y_SENSORLESS, stepperY.homing_threshold(atoi(key_value))); break; + case z_sensitivity: TERN_(Z_SENSORLESS, stepperZ.homing_threshold(atoi(key_value))); break; + case z2_sensitivity: TERN_(Z2_SENSORLESS, stepperZ2.homing_threshold(atoi(key_value))); break; } gcode.process_subcommands_now_P(PSTR("M500")); } @@ -535,81 +412,9 @@ static void set_value_confirm() { static void event_handler(lv_obj_t *obj, lv_event_t event) { if (event != LV_EVENT_RELEASED) return; switch (obj->mks_obj_id) { - case ID_NUM_KEY1: + case ID_NUM_KEY1 ... ID_NUM_KEY0: if (cnt <= 10) { - key_value[cnt] = (char)'1'; - lv_label_set_text(labelValue, key_value); - lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); - cnt++; - } - break; - case ID_NUM_KEY2: - if (cnt <= 10) { - key_value[cnt] = (char)'2'; - lv_label_set_text(labelValue, key_value); - lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); - cnt++; - } - break; - case ID_NUM_KEY3: - if (cnt <= 10) { - key_value[cnt] = (char)'3'; - lv_label_set_text(labelValue, key_value); - lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); - cnt++; - } - break; - case ID_NUM_KEY4: - if (cnt <= 10) { - key_value[cnt] = (char)'4'; - lv_label_set_text(labelValue, key_value); - lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); - cnt++; - } - break; - case ID_NUM_KEY5: - if (cnt <= 10) { - key_value[cnt] = (char)'5'; - lv_label_set_text(labelValue, key_value); - lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); - cnt++; - } - break; - case ID_NUM_KEY6: - if (cnt <= 10) { - key_value[cnt] = (char)'6'; - lv_label_set_text(labelValue, key_value); - lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); - cnt++; - } - break; - case ID_NUM_KEY7: - if (cnt <= 10) { - key_value[cnt] = (char)'7'; - lv_label_set_text(labelValue, key_value); - lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); - cnt++; - } - break; - case ID_NUM_KEY8: - if (cnt <= 10) { - key_value[cnt] = (char)'8'; - lv_label_set_text(labelValue, key_value); - lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); - cnt++; - } - break; - case ID_NUM_KEY9: - if (cnt <= 10) { - key_value[cnt] = (char)'9'; - lv_label_set_text(labelValue, key_value); - lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); - cnt++; - } - break; - case ID_NUM_KEY0: - if (cnt <= 10) { - key_value[cnt] = (char)'0'; + key_value[cnt] = (obj->mks_obj_id == ID_NUM_KEY0) ? (char)'0' : char('1' + obj->mks_obj_id - ID_NUM_KEY1); lv_label_set_text(labelValue, key_value); lv_obj_align(labelValue, buttonValue, LV_ALIGN_CENTER, 0, 0); cnt++; @@ -662,55 +467,22 @@ void lv_draw_number_key() { buttonValue = lv_btn_create(scr, 92, 40, 296, 40, event_handler, ID_NUM_KEY1, &style_num_text); labelValue = lv_label_create_empty(buttonValue); - lv_obj_t *NumberKey_1 = lv_btn_create(scr, 92, 90, 68, 40, event_handler, ID_NUM_KEY1, &style_num_key_pre); - lv_obj_t *labelKey_1 = lv_label_create_empty(NumberKey_1); - lv_label_set_text(labelKey_1, machine_menu.key_1); - lv_obj_align(labelKey_1, NumberKey_1, LV_ALIGN_CENTER, 0, 0); + #define DRAW_NUMBER_KEY(N,X,Y) \ + lv_obj_t *NumberKey_##N = lv_btn_create(scr, X, Y, 68, 40, event_handler, ID_NUM_KEY##N, &style_num_key_pre); \ + lv_obj_t *labelKey_##N = lv_label_create_empty(NumberKey_##N); \ + lv_label_set_text(labelKey_##N, machine_menu.key_##N); \ + lv_obj_align(labelKey_##N, NumberKey_##N, LV_ALIGN_CENTER, 0, 0) - lv_obj_t *NumberKey_2 = lv_btn_create(scr, 168, 90, 68, 40, event_handler, ID_NUM_KEY2, &style_num_key_pre); - lv_obj_t *labelKey_2 = lv_label_create_empty(NumberKey_2); - lv_label_set_text(labelKey_2, machine_menu.key_2); - lv_obj_align(labelKey_2, NumberKey_2, LV_ALIGN_CENTER, 0, 0); - - lv_obj_t *NumberKey_3 = lv_btn_create(scr, 244, 90, 68, 40, event_handler, ID_NUM_KEY3, &style_num_key_pre); - lv_obj_t *labelKey_3 = lv_label_create_empty(NumberKey_3); - lv_label_set_text(labelKey_3, machine_menu.key_3); - lv_obj_align(labelKey_3, NumberKey_3, LV_ALIGN_CENTER, 0, 0); - - lv_obj_t *NumberKey_4 = lv_btn_create(scr, 92, 140, 68, 40, event_handler, ID_NUM_KEY4, &style_num_key_pre); - lv_obj_t *labelKey_4 = lv_label_create_empty(NumberKey_4); - lv_label_set_text(labelKey_4, machine_menu.key_4); - lv_obj_align(labelKey_4, NumberKey_4, LV_ALIGN_CENTER, 0, 0); - - lv_obj_t *NumberKey_5 = lv_btn_create(scr, 168, 140, 68, 40, event_handler, ID_NUM_KEY5, &style_num_key_pre); - lv_obj_t *labelKey_5 = lv_label_create_empty(NumberKey_5); - lv_label_set_text(labelKey_5, machine_menu.key_5); - lv_obj_align(labelKey_5, NumberKey_5, LV_ALIGN_CENTER, 0, 0); - - lv_obj_t *NumberKey_6 = lv_btn_create(scr, 244, 140, 68, 40, event_handler, ID_NUM_KEY6, &style_num_key_pre); - lv_obj_t *labelKey_6 = lv_label_create_empty(NumberKey_6); - lv_label_set_text(labelKey_6, machine_menu.key_6); - lv_obj_align(labelKey_6, NumberKey_6, LV_ALIGN_CENTER, 0, 0); - - lv_obj_t *NumberKey_7 = lv_btn_create(scr, 92, 190, 68, 40, event_handler, ID_NUM_KEY7, &style_num_key_pre); - lv_obj_t *labelKey_7 = lv_label_create_empty(NumberKey_7); - lv_label_set_text(labelKey_7, machine_menu.key_7); - lv_obj_align(labelKey_7, NumberKey_7, LV_ALIGN_CENTER, 0, 0); - - lv_obj_t *NumberKey_8 = lv_btn_create(scr, 168, 190, 68, 40, event_handler, ID_NUM_KEY8, &style_num_key_pre); - lv_obj_t *labelKey_8 = lv_label_create_empty(NumberKey_8); - lv_label_set_text(labelKey_8, machine_menu.key_8); - lv_obj_align(labelKey_8, NumberKey_8, LV_ALIGN_CENTER, 0, 0); - - lv_obj_t *NumberKey_9 = lv_btn_create(scr, 244, 190, 68, 40, event_handler, ID_NUM_KEY9, &style_num_key_pre); - lv_obj_t *labelKey_9 = lv_label_create_empty(NumberKey_9); - lv_label_set_text(labelKey_9, machine_menu.key_9); - lv_obj_align(labelKey_9, NumberKey_9, LV_ALIGN_CENTER, 0, 0); - - lv_obj_t *NumberKey_0 = lv_btn_create(scr, 92, 240, 68, 40, event_handler, ID_NUM_KEY0, &style_num_key_pre); - lv_obj_t *labelKey_0 = lv_label_create_empty(NumberKey_0); - lv_label_set_text(labelKey_0, machine_menu.key_0); - lv_obj_align(labelKey_0, NumberKey_0, LV_ALIGN_CENTER, 0, 0); + DRAW_NUMBER_KEY(1, 92, 90); + DRAW_NUMBER_KEY(2, 168, 90); + DRAW_NUMBER_KEY(3, 244, 90); + DRAW_NUMBER_KEY(4, 92, 140); + DRAW_NUMBER_KEY(5, 168, 140); + DRAW_NUMBER_KEY(6, 244, 140); + DRAW_NUMBER_KEY(7, 92, 190); + DRAW_NUMBER_KEY(8, 168, 190); + DRAW_NUMBER_KEY(9, 244, 190); + DRAW_NUMBER_KEY(0, 92, 240); lv_obj_t *KeyBack = lv_btn_create(scr, 320, 90, 68, 40, event_handler, ID_NUM_BACK, &style_num_key_pre); lv_obj_t *labelKeyBack = lv_label_create_empty(KeyBack); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_manual_level_pos_settings.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_tramming_pos_settings.cpp similarity index 80% rename from Marlin/src/lcd/extui/lib/mks_ui/draw_manual_level_pos_settings.cpp rename to Marlin/src/lcd/extui/lib/mks_ui/draw_tramming_pos_settings.cpp index 6cbd703f9c..d5307232d6 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_manual_level_pos_settings.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_tramming_pos_settings.cpp @@ -53,7 +53,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { switch (obj->mks_obj_id) { case ID_MANUAL_POS_RETURN: uiCfg.para_ui_page = false; - lv_clear_manual_level_pos_settings(); + lv_clear_tramming_pos_settings(); draw_return_ui(); return; case ID_MANUAL_POS_X1: @@ -88,46 +88,46 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { break; case ID_MANUAL_POS_UP: uiCfg.para_ui_page = false; - lv_clear_manual_level_pos_settings(); - lv_draw_manual_level_pos_settings(); + lv_clear_tramming_pos_settings(); + lv_draw_tramming_pos_settings(); return; case ID_MANUAL_POS_DOWN: uiCfg.para_ui_page = true; - lv_clear_manual_level_pos_settings(); - lv_draw_manual_level_pos_settings(); + lv_clear_tramming_pos_settings(); + lv_draw_tramming_pos_settings(); return; } - lv_clear_manual_level_pos_settings(); + lv_clear_tramming_pos_settings(); lv_draw_number_key(); } -void lv_draw_manual_level_pos_settings() { +void lv_draw_tramming_pos_settings() { char buf2[50]; scr = lv_screen_create(MANUAL_LEVELING_POSIGION_UI, machine_menu.LevelingParaConfTitle); if (!uiCfg.para_ui_page) { - sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.levelingPos[0][0]); - sprintf_P(buf2, PSTR("%d"), gCfgItems.levelingPos[0][1]); + sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.trammingPos[0][X_AXIS]); + sprintf_P(buf2, PSTR("%d"), gCfgItems.trammingPos[0][Y_AXIS]); lv_screen_menu_item_2_edit(scr, leveling_menu.position1, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_MANUAL_POS_Y1, 0, buf2, ID_MANUAL_POS_X1, public_buf_l); - sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.levelingPos[1][0]); - sprintf_P(buf2, PSTR("%d"), gCfgItems.levelingPos[1][1]); + sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.trammingPos[1][X_AXIS]); + sprintf_P(buf2, PSTR("%d"), gCfgItems.trammingPos[1][Y_AXIS]); lv_screen_menu_item_2_edit(scr, leveling_menu.position2, PARA_UI_POS_X, PARA_UI_POS_Y * 2, event_handler, ID_MANUAL_POS_Y2, 1, buf2, ID_MANUAL_POS_X2, public_buf_l); - sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.levelingPos[2][0]); - sprintf_P(buf2, PSTR("%d"), gCfgItems.levelingPos[2][1]); + sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.trammingPos[2][X_AXIS]); + sprintf_P(buf2, PSTR("%d"), gCfgItems.trammingPos[2][Y_AXIS]); lv_screen_menu_item_2_edit(scr, leveling_menu.position3, PARA_UI_POS_X, PARA_UI_POS_Y * 3, event_handler, ID_MANUAL_POS_Y3, 2, buf2, ID_MANUAL_POS_X3, public_buf_l); - sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.levelingPos[3][0]); - sprintf_P(buf2, PSTR("%d"), gCfgItems.levelingPos[3][1]); + sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.trammingPos[3][X_AXIS]); + sprintf_P(buf2, PSTR("%d"), gCfgItems.trammingPos[3][Y_AXIS]); lv_screen_menu_item_2_edit(scr, leveling_menu.position4, PARA_UI_POS_X, PARA_UI_POS_Y * 4, event_handler, ID_MANUAL_POS_Y4, 3, buf2, ID_MANUAL_POS_X4, public_buf_l); lv_big_button_create(scr, "F:/bmp_back70x40.bin", machine_menu.next, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y, event_handler, ID_MANUAL_POS_DOWN, true); } else { - sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.levelingPos[4][0]); - sprintf_P(buf2, PSTR("%d"), gCfgItems.levelingPos[4][1]); + sprintf_P(public_buf_l, PSTR("%d"), gCfgItems.trammingPos[4][X_AXIS]); + sprintf_P(buf2, PSTR("%d"), gCfgItems.trammingPos[4][Y_AXIS]); lv_screen_menu_item_2_edit(scr, leveling_menu.position4, PARA_UI_POS_X, PARA_UI_POS_Y, event_handler, ID_MANUAL_POS_Y5, 0, buf2, ID_MANUAL_POS_X5, public_buf_l); lv_big_button_create(scr, "F:/bmp_back70x40.bin", machine_menu.previous, PARA_UI_TURN_PAGE_POS_X, PARA_UI_TURN_PAGE_POS_Y, event_handler, ID_MANUAL_POS_UP, true); @@ -136,7 +136,7 @@ void lv_draw_manual_level_pos_settings() { lv_big_button_create(scr, "F:/bmp_back70x40.bin", common_menu.text_back, PARA_UI_BACL_POS_X + 10, PARA_UI_BACL_POS_Y, event_handler, ID_MANUAL_POS_RETURN, true); } -void lv_clear_manual_level_pos_settings() { +void lv_clear_tramming_pos_settings() { #if HAS_ROTARY_ENCODER if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_manual_level_pos_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_tramming_pos_settings.h similarity index 91% rename from Marlin/src/lcd/extui/lib/mks_ui/draw_manual_level_pos_settings.h rename to Marlin/src/lcd/extui/lib/mks_ui/draw_tramming_pos_settings.h index 83fd225bd3..3ebb8ae731 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_manual_level_pos_settings.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_tramming_pos_settings.h @@ -25,8 +25,8 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_manual_level_pos_settings(); -extern void lv_clear_manual_level_pos_settings(); +extern void lv_draw_tramming_pos_settings(); +extern void lv_clear_tramming_pos_settings(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp index 12e060aa01..0c574b1e15 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp @@ -125,16 +125,16 @@ void gCfgItems_init() { gCfgItems.pausePosX = -1; gCfgItems.pausePosY = -1; gCfgItems.pausePosZ = 5; - gCfgItems.levelingPos[0][0] = X_MIN_POS + 30; - gCfgItems.levelingPos[0][1] = Y_MIN_POS + 30; - gCfgItems.levelingPos[1][0] = X_MAX_POS - 30; - gCfgItems.levelingPos[1][1] = Y_MIN_POS + 30; - gCfgItems.levelingPos[2][0] = X_MAX_POS - 30; - gCfgItems.levelingPos[2][1] = Y_MAX_POS - 30; - gCfgItems.levelingPos[3][0] = X_MIN_POS + 30; - gCfgItems.levelingPos[3][1] = Y_MAX_POS - 30; - gCfgItems.levelingPos[4][0] = X_BED_SIZE / 2; - gCfgItems.levelingPos[4][1] = Y_BED_SIZE / 2; + gCfgItems.trammingPos[0][X_AXIS] = X_MIN_POS + 30; + gCfgItems.trammingPos[0][Y_AXIS] = Y_MIN_POS + 30; + gCfgItems.trammingPos[1][X_AXIS] = X_MAX_POS - 30; + gCfgItems.trammingPos[1][Y_AXIS] = Y_MIN_POS + 30; + gCfgItems.trammingPos[2][X_AXIS] = X_MAX_POS - 30; + gCfgItems.trammingPos[2][Y_AXIS] = Y_MAX_POS - 30; + gCfgItems.trammingPos[3][X_AXIS] = X_MIN_POS + 30; + gCfgItems.trammingPos[3][Y_AXIS] = Y_MAX_POS - 30; + gCfgItems.trammingPos[4][X_AXIS] = X_BED_SIZE / 2; + gCfgItems.trammingPos[4][Y_AXIS] = Y_BED_SIZE / 2; gCfgItems.cloud_enable = false; gCfgItems.wifi_mode_sel = STA_MODEL; gCfgItems.fileSysType = FILE_SYS_SD; @@ -994,7 +994,7 @@ void clear_cur_ui() { case LEVELING_SETTIGNS_UI: break; case LEVELING_PARA_UI: lv_clear_level_settings(); break; case DELTA_LEVELING_PARA_UI: break; - case MANUAL_LEVELING_POSIGION_UI: lv_clear_manual_level_pos_settings(); break; + case MANUAL_LEVELING_POSIGION_UI: lv_clear_tramming_pos_settings(); break; case MAXFEEDRATE_UI: lv_clear_max_feedrate_settings(); break; case STEPS_UI: lv_clear_step_settings(); break; case ACCELERATION_UI: lv_clear_acceleration_settings(); break; @@ -1099,7 +1099,7 @@ void draw_return_ui() { case LEVELING_SETTIGNS_UI: break; case LEVELING_PARA_UI: lv_draw_level_settings(); break; case DELTA_LEVELING_PARA_UI: break; - case MANUAL_LEVELING_POSIGION_UI: lv_draw_manual_level_pos_settings(); break; + case MANUAL_LEVELING_POSIGION_UI: lv_draw_tramming_pos_settings(); break; case MAXFEEDRATE_UI: lv_draw_max_feedrate_settings(); break; case STEPS_UI: lv_draw_step_settings(); break; case ACCELERATION_UI: lv_draw_acceleration_settings(); break; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h index 3098a6666c..0690e59570 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h @@ -69,7 +69,7 @@ #include "draw_max_feedrate_settings.h" #include "draw_tmc_step_mode_settings.h" #include "draw_level_settings.h" -#include "draw_manual_level_pos_settings.h" +#include "draw_tramming_pos_settings.h" #include "draw_auto_level_offset_settings.h" #include "draw_filament_change.h" #include "draw_filament_settings.h" @@ -197,7 +197,7 @@ typedef struct { uint8_t wifi_type; bool cloud_enable, encoder_enable; - int levelingPos[5][2]; + int trammingPos[5][2]; // XY int filamentchange_load_length, filamentchange_load_speed, filamentchange_unload_length, diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h index 12a57bd548..104e1fdcaf 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_en.h @@ -99,7 +99,7 @@ #define LEVELING_CONF_TITLE_EN "Machine Settings>Leveling settings" #define LEVELING_PARA_CONF_EN "Leveling settings" -#define LEVELING_MANUAL_POS_EN "Manual leveling coordinate settings" +#define TRAMMING_POS_EN "Manual leveling coordinate settings" #define LEVELING_AUTO_COMMAND_EN "AutoLeveling command settings" #define LEVELING_AUTO_ZOFFSET_EN "Nozzle-to-probe offsets settings" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_ru.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_ru.h index 50e32ac05c..f6b3231737 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_ru.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_ru.h @@ -283,7 +283,7 @@ #define LEVELING_CONF_TITLE_RU "Hастройки принтера>Hастройки уровня" #define LEVELING_PARA_CONF_RU "настройки уровня" -#define LEVELING_MANUAL_POS_RU "настройки координат для уровня" +#define TRAMMING_POS_RU "настройки координат для уровня" #define LEVELING_AUTO_COMMAND_RU "настройки комманд увтоуровня" #define LEVELING_AUTO_ZOFFSET_RU "координаты смещения сопла" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_s_cn.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_s_cn.h index f204933e25..b50761fde0 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_s_cn.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_s_cn.h @@ -84,7 +84,7 @@ #define LEVELING_CONF_TITLE_CN "机器参数>调平设置" #define LEVELING_PARA_CONF_CN "调平设置" -#define LEVELING_MANUAL_POS_CN "手动调平坐标设置" +#define TRAMMING_POS_CN "手动调平坐标设置" #define LEVELING_AUTO_COMMAND_CN "自动调平指令设置" #define LEVELING_AUTO_ZOFFSET_CN "挤出头与调平开关偏移设置" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_t_cn.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_t_cn.h index 76da2de907..3f58a9afd2 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_t_cn.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_Language_t_cn.h @@ -84,7 +84,7 @@ #define LEVELING_CONF_TITLE_T_CN "機器參數>調平設置" #define LEVELING_PARA_CONF_T_CN "調平設置" -#define LEVELING_MANUAL_POS_T_CN "手動調平坐標設置" +#define TRAMMING_POS_T_CN "手動調平坐標設置" #define LEVELING_AUTO_COMMAND_T_CN "自動調平指令設置" #define LEVELING_AUTO_ZOFFSET_T_CN "擠出頭與調平開關偏移設置" diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp index 5ee184571f..7caae5cd3a 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp @@ -119,7 +119,7 @@ void machine_setting_disp() { machine_menu.LevelingParaConfTitle = LEVELING_CONF_TITLE_CN; machine_menu.LevelingParaConf = LEVELING_PARA_CONF_CN; - machine_menu.LevelingManuPosConf = LEVELING_MANUAL_POS_CN; + machine_menu.TrammingPosConf = TRAMMING_POS_CN; machine_menu.LevelingAutoCommandConf = LEVELING_AUTO_COMMAND_CN; machine_menu.LevelingAutoZoffsetConf = LEVELING_AUTO_ZOFFSET_CN; @@ -347,7 +347,7 @@ void machine_setting_disp() { machine_menu.LevelingParaConfTitle = LEVELING_CONF_TITLE_T_CN; machine_menu.LevelingParaConf = LEVELING_PARA_CONF_T_CN; - machine_menu.LevelingManuPosConf = LEVELING_MANUAL_POS_T_CN; + machine_menu.TrammingPosConf = TRAMMING_POS_T_CN; machine_menu.LevelingAutoCommandConf = LEVELING_AUTO_COMMAND_T_CN; machine_menu.LevelingAutoZoffsetConf = LEVELING_AUTO_ZOFFSET_T_CN; @@ -576,7 +576,7 @@ void machine_setting_disp() { machine_menu.LevelingParaConfTitle = LEVELING_CONF_TITLE_EN; machine_menu.LevelingParaConf = LEVELING_PARA_CONF_EN; - machine_menu.LevelingManuPosConf = LEVELING_MANUAL_POS_EN; + machine_menu.TrammingPosConf = TRAMMING_POS_EN; machine_menu.LevelingAutoCommandConf = LEVELING_AUTO_COMMAND_EN; machine_menu.LevelingAutoZoffsetConf = LEVELING_AUTO_ZOFFSET_EN; @@ -1708,7 +1708,7 @@ void disp_language_init() { machine_menu.LevelingParaConfTitle = LEVELING_CONF_TITLE_RU; machine_menu.LevelingParaConf = LEVELING_PARA_CONF_RU; - machine_menu.LevelingManuPosConf = LEVELING_MANUAL_POS_RU; + machine_menu.TrammingPosConf = TRAMMING_POS_RU; machine_menu.LevelingAutoCommandConf = LEVELING_AUTO_COMMAND_RU; machine_menu.LevelingAutoZoffsetConf = LEVELING_AUTO_ZOFFSET_RU; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.h index 731b2eaecd..82d3e18f74 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.h @@ -103,7 +103,7 @@ typedef struct machine_common_disp{ const char *LevelingParaConfTitle; const char *LevelingParaConf; - const char *LevelingManuPosConf; + const char *TrammingPosConf; const char *LevelingAutoCommandConf; const char *LevelingAutoZoffsetConf; diff --git a/Marlin/src/lcd/menu/menu_bed_corners.cpp b/Marlin/src/lcd/menu/menu_bed_corners.cpp index 0dae8dbf41..4cfb4e411b 100644 --- a/Marlin/src/lcd/menu/menu_bed_corners.cpp +++ b/Marlin/src/lcd/menu/menu_bed_corners.cpp @@ -296,8 +296,11 @@ static inline void _lcd_level_bed_corners_get_next_position() { } while (good_points < nr_edge_points); // loop until all points within tolerance - TERN_(BLTOUCH_HS_MODE, do_blocking_move_to_z(current_position.z + LEVEL_CORNERS_Z_HOP)); // Do clearance in HIGH SPEED MODE at the very end - TERN_(BLTOUCH_HS_MODE, bltouch.stow()); // Stow in HIGH SPEED MODE at the very end + #if ENABLED(BLTOUCH_HS_MODE) + // In HIGH SPEED MODE do clearance and stow at the very end + do_blocking_move_to_z(current_position.z + LEVEL_CORNERS_Z_HOP); + bltouch.stow(); + #endif ui.goto_screen(_lcd_draw_level_prompt); // prompt for bed leveling ui.set_selection(true); From da4b6896f7e4f102d8c2164e7aecf22cf2922fe2 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 24 Mar 2021 03:28:48 -0500 Subject: [PATCH 189/253] Group UBL parameters, add comments --- Marlin/src/feature/bedlevel/ubl/ubl.h | 35 +- Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp | 335 ++++++++++---------- Marlin/src/gcode/bedlevel/M420.cpp | 6 +- Marlin/src/lcd/marlinui.h | 10 +- Marlin/src/lcd/menu/menu_ubl.cpp | 46 +-- 5 files changed, 223 insertions(+), 209 deletions(-) diff --git a/Marlin/src/feature/bedlevel/ubl/ubl.h b/Marlin/src/feature/bedlevel/ubl/ubl.h index 0c4667eed8..67a9b0a60e 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl.h +++ b/Marlin/src/feature/bedlevel/ubl/ubl.h @@ -45,23 +45,26 @@ struct mesh_index_pair; typedef int16_t mesh_store_t[GRID_MAX_POINTS_X][GRID_MAX_POINTS_Y]; #endif +typedef struct { + bool C_seen; + int8_t V_verbosity, + P_phase, + R_repetition, + KLS_storage_slot, + T_map_type; + float B_shim_thickness, + C_constant; + xy_pos_t XY_pos; + xy_bool_t XY_seen; + #if HAS_BED_PROBE + int grid_size; + #endif +} G29_parameters_t; + class unified_bed_leveling { private: - static int g29_verbose_level, - g29_phase_value, - g29_repetition_cnt, - g29_storage_slot, - g29_map_type; - static bool g29_c_flag; - static float g29_card_thickness, - g29_constant; - static xy_pos_t g29_pos; - static xy_bool_t xy_seen; - - #if HAS_BED_PROBE - static int g29_grid_size; - #endif + static G29_parameters_t param; #if IS_NEWPANEL static void move_z_with_encoder(const float &multiplier); @@ -71,7 +74,7 @@ private: static void fine_tune_mesh(const xy_pos_t &pos, const bool do_ubl_mesh_map) _O0; #endif - static bool g29_parameter_parsing() _O0; + static bool G29_parse_parameters() _O0; static void shift_mesh_height(); static void probe_entire_mesh(const xy_pos_t &near, const bool do_ubl_mesh_map, const bool stow_probe, const bool do_furthest) _O0; static void tilt_mesh_based_on_3pts(const float &z1, const float &z2, const float &z3); @@ -129,7 +132,7 @@ public: static inline void steppers_were_disabled() {} #endif - static volatile int16_t encoder_diff; // Volatile because buttons may changed it at interrupt time + static volatile int16_t encoder_diff; // Volatile because buttons may change it at interrupt time unified_bed_leveling(); diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp index bcda183366..42a3018561 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp @@ -71,21 +71,6 @@ #define SIZE_OF_LITTLE_RAISE 1 #define BIG_RAISE_NOT_NEEDED 0 -int unified_bed_leveling::g29_verbose_level, - unified_bed_leveling::g29_phase_value, - unified_bed_leveling::g29_repetition_cnt, - unified_bed_leveling::g29_storage_slot = 0, - unified_bed_leveling::g29_map_type; -bool unified_bed_leveling::g29_c_flag; -float unified_bed_leveling::g29_card_thickness = 0, - unified_bed_leveling::g29_constant = 0; -xy_bool_t unified_bed_leveling::xy_seen; -xy_pos_t unified_bed_leveling::g29_pos; - -#if HAS_BED_PROBE - int unified_bed_leveling::g29_grid_size; -#endif - /** * G29: Unified Bed Leveling by Roxy * @@ -309,10 +294,12 @@ xy_pos_t unified_bed_leveling::g29_pos; * features of all three systems combined. */ +G29_parameters_t unified_bed_leveling::param; + void unified_bed_leveling::G29() { bool probe_deployed = false; - if (g29_parameter_parsing()) return; // Abort on parameter error + if (G29_parse_parameters()) return; // Abort on parameter error const int8_t p_val = parser.intval('P', -1); const bool may_move = p_val == 1 || p_val == 2 || p_val == 4 || parser.seen('J'); @@ -326,33 +313,29 @@ void unified_bed_leveling::G29() { TERN_(HAS_MULTI_HOTEND, if (active_extruder) tool_change(0)); } - // Invalidate Mesh Points. This command is a little bit asymmetrical because - // it directly specifies the repetition count and does not use the 'R' parameter. + // Invalidate one or more nearby mesh points, possibly all. if (parser.seen('I')) { - uint8_t cnt = 0; - g29_repetition_cnt = parser.has_value() ? parser.value_int() : 1; - if (g29_repetition_cnt >= GRID_MAX_POINTS) { - set_all_mesh_points_to_value(NAN); - } - else { - while (g29_repetition_cnt--) { - if (cnt > 20) { cnt = 0; idle(); } - const mesh_index_pair closest = find_closest_mesh_point_of_type(REAL, g29_pos); - const xy_int8_t &cpos = closest.pos; - if (cpos.x < 0) { - // No more REAL mesh points to invalidate, so we ASSUME the user - // meant to invalidate the ENTIRE mesh, which cannot be done with - // find_closest_mesh_point loop which only returns REAL points. - set_all_mesh_points_to_value(NAN); - SERIAL_ECHOLNPGM("Entire Mesh invalidated.\n"); - break; // No more invalid Mesh Points to populate - } - z_values[cpos.x][cpos.y] = NAN; - TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(cpos, 0.0f)); - cnt++; + int16_t count = parser.has_value() ? parser.value_int() : 1; + bool invalidate_all = count >= GRID_MAX_POINTS; + if (!invalidate_all) { + while (count--) { + if ((count & 0x0F) == 0x0F) idle(); + const mesh_index_pair closest = find_closest_mesh_point_of_type(REAL, param.XY_pos); + // No more REAL mesh points to invalidate? Assume the user meant + // to invalidate the ENTIRE mesh, which can't be done with + // find_closest_mesh_point (which only returns REAL points). + if (closest.pos.x < 0) { invalidate_all = true; break; } + z_values[closest.pos.x][closest.pos.y] = NAN; + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(closest.pos, 0.0f)); } } - SERIAL_ECHOLNPGM("Locations invalidated.\n"); + if (invalidate_all) { + invalidate(); + SERIAL_ECHOPGM("Entire Mesh"); + } + else + SERIAL_ECHOPGM("Locations"); + SERIAL_ECHOLNPGM(" invalidated.\n"); } if (parser.seen('Q')) { @@ -364,11 +347,7 @@ void unified_bed_leveling::G29() { SERIAL_ECHOLNPGM("Loading test_pattern values.\n"); switch (test_pattern) { - #if ENABLED(UBL_DEVEL_DEBUGGING) - case -1: - g29_eeprom_dump(); - break; - #endif + case -1: TERN_(UBL_DEVEL_DEBUGGING, g29_eeprom_dump()); break; case 0: GRID_LOOP(x, y) { // Create a bowl shape similar to a poorly-calibrated Delta @@ -395,7 +374,7 @@ void unified_bed_leveling::G29() { // Allow the user to specify the height because 10mm is a little extreme in some cases. for (uint8_t x = (GRID_MAX_POINTS_X) / 3; x < 2 * (GRID_MAX_POINTS_X) / 3; x++) // Create a rectangular raised area in for (uint8_t y = (GRID_MAX_POINTS_Y) / 3; y < 2 * (GRID_MAX_POINTS_Y) / 3; y++) { // the center of the bed - z_values[x][y] += parser.seen('C') ? g29_constant : 9.99f; + z_values[x][y] += parser.seen('C') ? param.C_constant : 9.99f; TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(x, y, z_values[x][y])); } break; @@ -406,7 +385,7 @@ void unified_bed_leveling::G29() { if (parser.seen('J')) { save_ubl_active_state_and_disable(); - tilt_mesh_based_on_probed_grid(g29_grid_size == 0); // Zero size does 3-Point + tilt_mesh_based_on_probed_grid(param.grid_size == 0); // Zero size does 3-Point restore_ubl_active_state_and_leave(); #if ENABLED(UBL_G29_J_RECENTER) do_blocking_move_to_xy(0.5f * ((MESH_MIN_X) + (MESH_MAX_X)), 0.5f * ((MESH_MIN_Y) + (MESH_MAX_Y))); @@ -418,12 +397,12 @@ void unified_bed_leveling::G29() { #endif // HAS_BED_PROBE if (parser.seen('P')) { - if (WITHIN(g29_phase_value, 0, 1) && storage_slot == -1) { + if (WITHIN(param.P_phase, 0, 1) && storage_slot == -1) { storage_slot = 0; SERIAL_ECHOLNPGM("Default storage slot 0 selected."); } - switch (g29_phase_value) { + switch (param.P_phase) { case 0: // // Zero Mesh Data @@ -442,13 +421,13 @@ void unified_bed_leveling::G29() { invalidate(); SERIAL_ECHOLNPGM("Mesh invalidated. Probing mesh."); } - if (g29_verbose_level > 1) { - SERIAL_ECHOPAIR("Probing around (", g29_pos.x); + if (param.V_verbosity > 1) { + SERIAL_ECHOPAIR("Probing around (", param.XY_pos.x); SERIAL_CHAR(','); - SERIAL_DECIMAL(g29_pos.y); + SERIAL_DECIMAL(param.XY_pos.y); SERIAL_ECHOLNPGM(").\n"); } - const xy_pos_t near_probe_xy = g29_pos + probe.offset_xy; + const xy_pos_t near_probe_xy = param.XY_pos + probe.offset_xy; probe_entire_mesh(near_probe_xy, parser.seen('T'), parser.seen('E'), parser.seen('U')); report_current_position(); @@ -465,7 +444,7 @@ void unified_bed_leveling::G29() { SERIAL_ECHOLNPGM("Manually probing unreachable points."); do_z_clearance(Z_CLEARANCE_BETWEEN_PROBES); - if (parser.seen('C') && !xy_seen) { + if (parser.seen('C') && !param.XY_seen) { /** * Use a good default location for the path. @@ -474,7 +453,7 @@ void unified_bed_leveling::G29() { * It may make sense to have Delta printers default to the center of the bed. * Until that is decided, this can be forced with the X and Y parameters. */ - g29_pos.set( + param.XY_pos.set( #if IS_KINEMATIC X_HOME_POS, Y_HOME_POS #else @@ -485,21 +464,21 @@ void unified_bed_leveling::G29() { } if (parser.seen('B')) { - g29_card_thickness = parser.has_value() ? parser.value_float() : measure_business_card_thickness(); - if (ABS(g29_card_thickness) > 1.5f) { + param.B_shim_thickness = parser.has_value() ? parser.value_float() : measure_business_card_thickness(); + if (ABS(param.B_shim_thickness) > 1.5f) { SERIAL_ECHOLNPGM("?Error in Business Card measurement."); return; } probe_deployed = true; } - if (!position_is_reachable(g29_pos)) { + if (!position_is_reachable(param.XY_pos)) { SERIAL_ECHOLNPGM("XY outside printable radius."); return; } const float height = parser.floatval('H', Z_CLEARANCE_BETWEEN_PROBES); - manually_probe_remaining_mesh(g29_pos, height, g29_card_thickness, parser.seen('T')); + manually_probe_remaining_mesh(param.XY_pos, height, param.B_shim_thickness, parser.seen('T')); SERIAL_ECHOLNPGM("G29 P2 finished."); @@ -521,23 +500,23 @@ void unified_bed_leveling::G29() { * - Allow 'G29 P3' to choose a 'reasonable' constant. */ - if (g29_c_flag) { - if (g29_repetition_cnt >= GRID_MAX_POINTS) { - set_all_mesh_points_to_value(g29_constant); + if (param.C_seen) { + if (param.R_repetition >= GRID_MAX_POINTS) { + set_all_mesh_points_to_value(param.C_constant); } else { - while (g29_repetition_cnt--) { // this only populates reachable mesh points near - const mesh_index_pair closest = find_closest_mesh_point_of_type(INVALID, g29_pos); + while (param.R_repetition--) { // this only populates reachable mesh points near + const mesh_index_pair closest = find_closest_mesh_point_of_type(INVALID, param.XY_pos); const xy_int8_t &cpos = closest.pos; if (cpos.x < 0) { // No more REAL INVALID mesh points to populate, so we ASSUME // user meant to populate ALL INVALID mesh points to value - GRID_LOOP(x, y) if (isnan(z_values[x][y])) z_values[x][y] = g29_constant; + GRID_LOOP(x, y) if (isnan(z_values[x][y])) z_values[x][y] = param.C_constant; break; // No more invalid Mesh Points to populate } else { - z_values[cpos.x][cpos.y] = g29_constant; - TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(cpos, g29_constant)); + z_values[cpos.x][cpos.y] = param.C_constant; + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(cpos, param.C_constant)); } } } @@ -571,14 +550,14 @@ void unified_bed_leveling::G29() { case 4: // Fine Tune (i.e., Edit) the Mesh #if HAS_LCD_MENU - fine_tune_mesh(g29_pos, parser.seen('T')); + fine_tune_mesh(param.XY_pos, parser.seen('T')); #else SERIAL_ECHOLNPGM("?P4 is only available when an LCD is present."); return; #endif break; - case 5: adjust_mesh_to_mean(g29_c_flag, g29_constant); break; + case 5: adjust_mesh_to_mean(param.C_seen, param.C_constant); break; case 6: shift_mesh_height(); break; } @@ -608,7 +587,7 @@ void unified_bed_leveling::G29() { // if (parser.seen('L')) { // Load Current Mesh Data - g29_storage_slot = parser.has_value() ? parser.value_int() : storage_slot; + param.KLS_storage_slot = parser.has_value() ? parser.value_int() : storage_slot; int16_t a = settings.calc_num_meshes(); @@ -617,13 +596,13 @@ void unified_bed_leveling::G29() { return; } - if (!WITHIN(g29_storage_slot, 0, a - 1)) { + if (!WITHIN(param.KLS_storage_slot, 0, a - 1)) { SERIAL_ECHOLNPAIR("?Invalid storage slot.\n?Use 0 to ", a - 1); return; } - settings.load_mesh(g29_storage_slot); - storage_slot = g29_storage_slot; + settings.load_mesh(param.KLS_storage_slot); + storage_slot = param.KLS_storage_slot; SERIAL_ECHOLNPGM("Done."); } @@ -633,9 +612,9 @@ void unified_bed_leveling::G29() { // if (parser.seen('S')) { // Store (or Save) Current Mesh Data - g29_storage_slot = parser.has_value() ? parser.value_int() : storage_slot; + param.KLS_storage_slot = parser.has_value() ? parser.value_int() : storage_slot; - if (g29_storage_slot == -1) // Special case, the user wants to 'Export' the mesh to the + if (param.KLS_storage_slot == -1) // Special case, the user wants to 'Export' the mesh to the return report_current_mesh(); // host program to be saved on the user's computer int16_t a = settings.calc_num_meshes(); @@ -645,19 +624,19 @@ void unified_bed_leveling::G29() { goto LEAVE; } - if (!WITHIN(g29_storage_slot, 0, a - 1)) { + if (!WITHIN(param.KLS_storage_slot, 0, a - 1)) { SERIAL_ECHOLNPAIR("?Invalid storage slot.\n?Use 0 to ", a - 1); goto LEAVE; } - settings.store_mesh(g29_storage_slot); - storage_slot = g29_storage_slot; + settings.store_mesh(param.KLS_storage_slot); + storage_slot = param.KLS_storage_slot; SERIAL_ECHOLNPGM("Done."); } if (parser.seen('T')) - display_map(g29_map_type); + display_map(param.T_map_type); LEAVE: @@ -682,7 +661,12 @@ void unified_bed_leveling::G29() { return; } -void unified_bed_leveling::adjust_mesh_to_mean(const bool cflag, const float value) { +/** + * M420 C + * G29 P5 C : Adjust Mesh To Mean (and subtract the given offset). + * Find the mean average and shift the mesh to center on that value. + */ +void unified_bed_leveling::adjust_mesh_to_mean(const bool cflag, const float offset) { float sum = 0; int n = 0; GRID_LOOP(x, y) @@ -710,23 +694,27 @@ void unified_bed_leveling::adjust_mesh_to_mean(const bool cflag, const float val if (cflag) GRID_LOOP(x, y) if (!isnan(z_values[x][y])) { - z_values[x][y] -= mean + value; + z_values[x][y] -= mean + offset; TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(x, y, z_values[x][y])); } } +/** + * G29 P6 C : Shift Mesh Height by a uniform constant. + */ void unified_bed_leveling::shift_mesh_height() { GRID_LOOP(x, y) if (!isnan(z_values[x][y])) { - z_values[x][y] += g29_constant; + z_values[x][y] += param.C_constant; TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(x, y, z_values[x][y])); } } #if HAS_BED_PROBE /** - * Probe all invalidated locations of the mesh that can be reached by the probe. - * This attempts to fill in locations closest to the nozzle's start location first. + * G29 P1 T V : Probe Entire Mesh + * Probe all invalidated locations of the mesh that can be reached by the probe. + * This attempts to fill in locations closest to the nozzle's start location first. */ void unified_bed_leveling::probe_entire_mesh(const xy_pos_t &nearby, const bool do_ubl_mesh_map, const bool stow_probe, const bool do_furthest) { probe.deploy(); // Deploy before ui.capture() to allow for PAUSE_BEFORE_DEPLOY_STOW @@ -739,7 +727,7 @@ void unified_bed_leveling::shift_mesh_height() { mesh_index_pair best; TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(best.pos, ExtUI::MESH_START)); do { - if (do_ubl_mesh_map) display_map(g29_map_type); + if (do_ubl_mesh_map) display_map(param.T_map_type); const int point_num = (GRID_MAX_POINTS) - count + 1; SERIAL_ECHOLNPAIR("Probing mesh point ", point_num, "/", GRID_MAX_POINTS, "."); @@ -767,7 +755,7 @@ void unified_bed_leveling::shift_mesh_height() { TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(best.pos, ExtUI::PROBE_START)); const float measured_z = probe.probe_at_point( best.meshpos(), - stow_probe ? PROBE_PT_STOW : PROBE_PT_RAISE, g29_verbose_level + stow_probe ? PROBE_PT_STOW : PROBE_PT_RAISE, param.V_verbosity ); z_values[best.pos.x][best.pos.y] = measured_z; #if ENABLED(EXTENSIBLE_UI) @@ -798,11 +786,20 @@ void unified_bed_leveling::shift_mesh_height() { #endif // HAS_BED_PROBE +void set_message_with_feedback(PGM_P const msg_P) { + #if HAS_LCD_MENU + ui.set_status_P(msg_P); + ui.quick_feedback(); + #else + UNUSED(msg_P); + #endif +} + #if HAS_LCD_MENU typedef void (*clickFunc_t)(); - bool click_and_hold(const clickFunc_t func=nullptr) { + bool _click_and_hold(const clickFunc_t func=nullptr) { if (ui.button_pressed()) { ui.quick_feedback(false); // Preserve button state for click-and-hold const millis_t nxt = millis() + 1500UL; @@ -834,7 +831,8 @@ void unified_bed_leveling::shift_mesh_height() { float unified_bed_leveling::measure_point_with_encoder() { KEEPALIVE_STATE(PAUSED_FOR_USER); - move_z_with_encoder(0.01f); + const float z_step = 0.01f; + move_z_with_encoder(z_step); return current_position.z; } @@ -866,7 +864,7 @@ void unified_bed_leveling::shift_mesh_height() { const float thickness = ABS(z1 - z2); - if (g29_verbose_level > 1) { + if (param.V_verbosity > 1) { SERIAL_ECHOPAIR_F("Business Card is ", thickness, 4); SERIAL_ECHOLNPGM("mm thick."); } @@ -876,6 +874,11 @@ void unified_bed_leveling::shift_mesh_height() { return thickness; } + /** + * G29 P2 : Manually Probe Remaining Mesh Points. + * Move to INVALID points and + * NOTE: Blocks the G-code queue and captures Marlin UI during use. + */ void unified_bed_leveling::manually_probe_remaining_mesh(const xy_pos_t &pos, const float &z_clearance, const float &thick, const bool do_ubl_mesh_map) { ui.capture(); @@ -907,7 +910,7 @@ void unified_bed_leveling::shift_mesh_height() { KEEPALIVE_STATE(PAUSED_FOR_USER); ui.capture(); - if (do_ubl_mesh_map) display_map(g29_map_type); // show user where we're probing + if (do_ubl_mesh_map) display_map(param.T_map_type); // Show user where we're probing if (parser.seen('B')) { SERIAL_ECHOPGM_P(GET_TEXT(MSG_UBL_BC_INSERT)); @@ -918,45 +921,38 @@ void unified_bed_leveling::shift_mesh_height() { LCD_MESSAGEPGM(MSG_UBL_BC_INSERT2); } - const float z_step = 0.01f; // existing behavior: 0.01mm per click, occasionally step - //const float z_step = planner.steps_to_mm[Z_AXIS]; // approx one step each click - + const float z_step = 0.01f; // 0.01mm per encoder tick, occasionally step move_z_with_encoder(z_step); - if (click_and_hold()) { + if (_click_and_hold([]{ SERIAL_ECHOLNPGM("\nMesh only partially populated."); do_z_clearance(Z_CLEARANCE_DEPLOY_PROBE); - return restore_ubl_active_state_and_leave(); - } + })) return restore_ubl_active_state_and_leave(); + // Store the Z position minus the shim height z_values[lpos.x][lpos.y] = current_position.z - thick; + + // Tell the external UI to update TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(location, z_values[lpos.x][lpos.y])); - if (g29_verbose_level > 2) + if (param.V_verbosity > 2) SERIAL_ECHOLNPAIR_F("Mesh Point Measured at: ", z_values[lpos.x][lpos.y], 6); SERIAL_FLUSH(); // Prevent host M105 buffer overrun. } while (location.valid()); - if (do_ubl_mesh_map) display_map(g29_map_type); // show user where we're probing + if (do_ubl_mesh_map) display_map(param.T_map_type); // show user where we're probing restore_ubl_active_state_and_leave(); do_blocking_move_to_xy_z(pos, Z_CLEARANCE_DEPLOY_PROBE); } - inline void set_message_with_feedback(PGM_P const msg_P) { - ui.set_status_P(msg_P); - ui.quick_feedback(); - } - - void abort_fine_tune() { - ui.return_to_status(); - do_z_clearance(Z_CLEARANCE_BETWEEN_PROBES); - set_message_with_feedback(GET_TEXT(MSG_EDITING_STOPPED)); - } - + /** + * G29 P4 : Mesh Fine-Tuning. Go to point(s) and adjust values with the LCD. + * NOTE: Blocks the G-code queue and captures Marlin UI during use. + */ void unified_bed_leveling::fine_tune_mesh(const xy_pos_t &pos, const bool do_ubl_mesh_map) { - if (!parser.seen('R')) // fine_tune_mesh() is special. If no repetition count flag is specified - g29_repetition_cnt = 1; // do exactly one mesh location. Otherwise use what the parser decided. + if (!parser.seen('R')) // fine_tune_mesh() is special. If no repetition count flag is specified + param.R_repetition = 1; // do exactly one mesh location. Otherwise use what the parser decided. #if ENABLED(UBL_MESH_EDIT_MOVES_Z) const float h_offset = parser.seenval('H') ? parser.value_linear_units() : MANUAL_PROBE_START_Z; @@ -984,7 +980,7 @@ void unified_bed_leveling::shift_mesh_height() { const xy_int8_t &lpos = location.pos; #if IS_TFTGLCD_PANEL - lcd_mesh_edit_setup(0); // Change current screen before calling ui.ubl_plot + ui.ubl_mesh_edit_start(0); // Change current screen before calling ui.ubl_plot safe_delay(50); #endif @@ -1009,7 +1005,7 @@ void unified_bed_leveling::shift_mesh_height() { KEEPALIVE_STATE(PAUSED_FOR_USER); - if (do_ubl_mesh_map) display_map(g29_map_type); // Display the current point + if (do_ubl_mesh_map) display_map(param.T_map_type); // Display the current point #if IS_TFTGLCD_PANEL ui.ubl_plot(lpos.x, lpos.y); // update plot screen @@ -1021,13 +1017,13 @@ void unified_bed_leveling::shift_mesh_height() { if (isnan(new_z)) new_z = 0; // Invalid points begin at 0 new_z = FLOOR(new_z * 1000) * 0.001f; // Chop off digits after the 1000ths place - lcd_mesh_edit_setup(new_z); + ui.ubl_mesh_edit_start(new_z); SET_SOFT_ENDSTOP_LOOSE(true); do { idle(); - new_z = lcd_mesh_edit(); + new_z = ui.ubl_mesh_value(); TERN_(UBL_MESH_EDIT_MOVES_Z, do_blocking_move_to_z(h_offset + new_z)); // Move the nozzle as the point is edited SERIAL_FLUSH(); // Prevent host M105 buffer overrun. } while (!ui.button_pressed()); @@ -1036,17 +1032,27 @@ void unified_bed_leveling::shift_mesh_height() { if (!lcd_map_control) ui.return_to_status(); // Just editing a single point? Return to status - if (click_and_hold(abort_fine_tune)) break; // Button held down? Abort editing + // Button held down? Abort editing + if (_click_and_hold([]{ + ui.return_to_status(); + do_z_clearance(Z_CLEARANCE_BETWEEN_PROBES); + set_message_with_feedback(GET_TEXT(MSG_EDITING_STOPPED)); + })) break; + + // TODO: Disable leveling here so the Z value becomes the 'native' Z value. z_values[lpos.x][lpos.y] = new_z; // Save the updated Z value + + // TODO: Re-enable leveling here so Z is correctly based on the updated mesh. + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(location, new_z)); serial_delay(20); // No switch noise ui.refresh(); - } while (lpos.x >= 0 && --g29_repetition_cnt > 0); + } while (lpos.x >= 0 && --param.R_repetition > 0); - if (do_ubl_mesh_map) display_map(g29_map_type); + if (do_ubl_mesh_map) display_map(param.T_map_type); restore_ubl_active_state_and_leave(); do_blocking_move_to_xy_z(pos, Z_CLEARANCE_BETWEEN_PROBES); @@ -1062,25 +1068,28 @@ void unified_bed_leveling::shift_mesh_height() { #endif // HAS_LCD_MENU -bool unified_bed_leveling::g29_parameter_parsing() { +/** + * Parse and validate most G29 parameters, store for use by G29 functions. + */ +bool unified_bed_leveling::G29_parse_parameters() { bool err_flag = false; - TERN_(HAS_LCD_MENU, set_message_with_feedback(GET_TEXT(MSG_UBL_DOING_G29))); + set_message_with_feedback(GET_TEXT(MSG_UBL_DOING_G29)); - g29_constant = 0; - g29_repetition_cnt = 0; + param.C_constant = 0; + param.R_repetition = 0; if (parser.seen('R')) { - g29_repetition_cnt = parser.has_value() ? parser.value_int() : GRID_MAX_POINTS; - NOMORE(g29_repetition_cnt, GRID_MAX_POINTS); - if (g29_repetition_cnt < 1) { + param.R_repetition = parser.has_value() ? parser.value_int() : GRID_MAX_POINTS; + NOMORE(param.R_repetition, GRID_MAX_POINTS); + if (param.R_repetition < 1) { SERIAL_ECHOLNPGM("?(R)epetition count invalid (1+).\n"); return UBL_ERR; } } - g29_verbose_level = parser.seen('V') ? parser.value_int() : 0; - if (!WITHIN(g29_verbose_level, 0, 4)) { + param.V_verbosity = parser.seen('V') ? parser.value_int() : 0; + if (!WITHIN(param.V_verbosity, 0, 4)) { SERIAL_ECHOLNPGM("?(V)erbose level implausible (0-4).\n"); err_flag = true; } @@ -1095,8 +1104,8 @@ bool unified_bed_leveling::g29_parameter_parsing() { else #endif { - g29_phase_value = pv; - if (!WITHIN(g29_phase_value, 0, 6)) { + param.P_phase = pv; + if (!WITHIN(param.P_phase, 0, 6)) { SERIAL_ECHOLNPGM("?(P)hase value invalid (0-6).\n"); err_flag = true; } @@ -1105,8 +1114,8 @@ bool unified_bed_leveling::g29_parameter_parsing() { if (parser.seen('J')) { #if HAS_BED_PROBE - g29_grid_size = parser.has_value() ? parser.value_int() : 0; - if (g29_grid_size && !WITHIN(g29_grid_size, 2, 9)) { + param.grid_size = parser.has_value() ? parser.value_int() : 0; + if (param.grid_size && !WITHIN(param.grid_size, 2, 9)) { SERIAL_ECHOLNPGM("?Invalid grid size (J) specified (2-9).\n"); err_flag = true; } @@ -1116,12 +1125,12 @@ bool unified_bed_leveling::g29_parameter_parsing() { #endif } - xy_seen.x = parser.seenval('X'); - float sx = xy_seen.x ? parser.value_float() : current_position.x; - xy_seen.y = parser.seenval('Y'); - float sy = xy_seen.y ? parser.value_float() : current_position.y; + param.XY_seen.x = parser.seenval('X'); + float sx = param.XY_seen.x ? parser.value_float() : current_position.x; + param.XY_seen.y = parser.seenval('Y'); + float sy = param.XY_seen.y ? parser.value_float() : current_position.y; - if (xy_seen.x != xy_seen.y) { + if (param.XY_seen.x != param.XY_seen.y) { SERIAL_ECHOLNPGM("Both X & Y locations must be specified.\n"); err_flag = true; } @@ -1132,7 +1141,7 @@ bool unified_bed_leveling::g29_parameter_parsing() { if (err_flag) return UBL_ERR; - g29_pos.set(sx, sy); + param.XY_pos.set(sx, sy); /** * Activate or deactivate UBL @@ -1154,8 +1163,8 @@ bool unified_bed_leveling::g29_parameter_parsing() { } // Set global 'C' flag and its value - if ((g29_c_flag = parser.seen('C'))) - g29_constant = parser.value_float(); + if ((param.C_seen = parser.seen('C'))) + param.C_constant = parser.value_float(); #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) if (parser.seenval('F')) { @@ -1168,8 +1177,8 @@ bool unified_bed_leveling::g29_parameter_parsing() { } #endif - g29_map_type = parser.intval('T'); - if (!WITHIN(g29_map_type, 0, 2)) { + param.T_map_type = parser.intval('T'); + if (!WITHIN(param.T_map_type, 0, 2)) { SERIAL_ECHOLNPGM("Invalid map type.\n"); return UBL_ERR; } @@ -1187,7 +1196,7 @@ void unified_bed_leveling::save_ubl_active_state_and_disable() { ubl_state_recursion_chk++; if (ubl_state_recursion_chk != 1) { SERIAL_ECHOLNPGM("save_ubl_active_state_and_disabled() called multiple times in a row."); - TERN_(HAS_LCD_MENU, set_message_with_feedback(GET_TEXT(MSG_UBL_SAVE_ERROR))); + set_message_with_feedback(GET_TEXT(MSG_UBL_SAVE_ERROR)); return; } #endif @@ -1200,7 +1209,7 @@ void unified_bed_leveling::restore_ubl_active_state_and_leave() { #if ENABLED(UBL_DEVEL_DEBUGGING) if (--ubl_state_recursion_chk) { SERIAL_ECHOLNPGM("restore_ubl_active_state_and_leave() called too many times."); - TERN_(HAS_LCD_MENU, set_message_with_feedback(GET_TEXT(MSG_UBL_RESTORE_ERROR))); + set_message_with_feedback(GET_TEXT(MSG_UBL_RESTORE_ERROR)); return; } #endif @@ -1411,8 +1420,8 @@ void unified_bed_leveling::smart_fill_mesh() { void unified_bed_leveling::tilt_mesh_based_on_probed_grid(const bool do_3_pt_leveling) { const float x_min = probe.min_x(), x_max = probe.max_x(), y_min = probe.min_y(), y_max = probe.max_y(), - dx = (x_max - x_min) / (g29_grid_size - 1), - dy = (y_max - y_min) / (g29_grid_size - 1); + dx = (x_max - x_min) / (param.grid_size - 1), + dy = (y_max - y_min) / (param.grid_size - 1); xy_float_t points[3]; probe.get_three_points(points); @@ -1431,7 +1440,7 @@ void unified_bed_leveling::smart_fill_mesh() { SERIAL_ECHOLNPGM("Tilting mesh (1/3)"); TERN_(HAS_DISPLAY, ui.status_printf_P(0, PSTR(S_FMT " 1/3"), GET_TEXT(MSG_LCD_TILTING_MESH))); - measured_z = probe.probe_at_point(points[0], PROBE_PT_RAISE, g29_verbose_level); + measured_z = probe.probe_at_point(points[0], PROBE_PT_RAISE, param.V_verbosity); if (isnan(measured_z)) abort_flag = true; else { @@ -1439,7 +1448,7 @@ void unified_bed_leveling::smart_fill_mesh() { #ifdef VALIDATE_MESH_TILT z1 = measured_z; #endif - if (g29_verbose_level > 3) { + if (param.V_verbosity > 3) { serial_spaces(16); SERIAL_ECHOLNPAIR("Corrected_Z=", measured_z); } @@ -1450,7 +1459,7 @@ void unified_bed_leveling::smart_fill_mesh() { SERIAL_ECHOLNPGM("Tilting mesh (2/3)"); TERN_(HAS_DISPLAY, ui.status_printf_P(0, PSTR(S_FMT " 2/3"), GET_TEXT(MSG_LCD_TILTING_MESH))); - measured_z = probe.probe_at_point(points[1], PROBE_PT_RAISE, g29_verbose_level); + measured_z = probe.probe_at_point(points[1], PROBE_PT_RAISE, param.V_verbosity); #ifdef VALIDATE_MESH_TILT z2 = measured_z; #endif @@ -1458,7 +1467,7 @@ void unified_bed_leveling::smart_fill_mesh() { abort_flag = true; else { measured_z -= get_z_correction(points[1]); - if (g29_verbose_level > 3) { + if (param.V_verbosity > 3) { serial_spaces(16); SERIAL_ECHOLNPAIR("Corrected_Z=", measured_z); } @@ -1470,7 +1479,7 @@ void unified_bed_leveling::smart_fill_mesh() { SERIAL_ECHOLNPGM("Tilting mesh (3/3)"); TERN_(HAS_DISPLAY, ui.status_printf_P(0, PSTR(S_FMT " 3/3"), GET_TEXT(MSG_LCD_TILTING_MESH))); - measured_z = probe.probe_at_point(points[2], PROBE_PT_STOW, g29_verbose_level); + measured_z = probe.probe_at_point(points[2], PROBE_PT_STOW, param.V_verbosity); #ifdef VALIDATE_MESH_TILT z3 = measured_z; #endif @@ -1478,7 +1487,7 @@ void unified_bed_leveling::smart_fill_mesh() { abort_flag = true; else { measured_z -= get_z_correction(points[2]); - if (g29_verbose_level > 3) { + if (param.V_verbosity > 3) { serial_spaces(16); SERIAL_ECHOLNPAIR("Corrected_Z=", measured_z); } @@ -1498,20 +1507,20 @@ void unified_bed_leveling::smart_fill_mesh() { bool zig_zag = false; - const uint16_t total_points = sq(g29_grid_size); + const uint16_t total_points = sq(param.grid_size); uint16_t point_num = 1; xy_pos_t rpos; - LOOP_L_N(ix, g29_grid_size) { + LOOP_L_N(ix, param.grid_size) { rpos.x = x_min + ix * dx; - LOOP_L_N(iy, g29_grid_size) { - rpos.y = y_min + dy * (zig_zag ? g29_grid_size - 1 - iy : iy); + LOOP_L_N(iy, param.grid_size) { + rpos.y = y_min + dy * (zig_zag ? param.grid_size - 1 - iy : iy); if (!abort_flag) { SERIAL_ECHOLNPAIR("Tilting mesh point ", point_num, "/", total_points, "\n"); TERN_(HAS_DISPLAY, ui.status_printf_P(0, PSTR(S_FMT " %i/%i"), GET_TEXT(MSG_LCD_TILTING_MESH), point_num, total_points)); - measured_z = probe.probe_at_point(rpos, parser.seen('E') ? PROBE_PT_STOW : PROBE_PT_RAISE, g29_verbose_level); // TODO: Needs error handling + measured_z = probe.probe_at_point(rpos, parser.seen('E') ? PROBE_PT_STOW : PROBE_PT_RAISE, param.V_verbosity); // TODO: Needs error handling abort_flag = isnan(measured_z); @@ -1534,7 +1543,7 @@ void unified_bed_leveling::smart_fill_mesh() { if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR_F(" final >>>---> ", measured_z, 7); - if (g29_verbose_level > 3) { + if (param.V_verbosity > 3) { serial_spaces(16); SERIAL_ECHOLNPAIR("Corrected_Z=", measured_z); } @@ -1557,7 +1566,7 @@ void unified_bed_leveling::smart_fill_mesh() { vector_3 normal = vector_3(lsf_results.A, lsf_results.B, 1).get_normal(); - if (g29_verbose_level > 2) { + if (param.V_verbosity > 2) { SERIAL_ECHOPAIR_F("bed plane normal = [", normal.x, 7); SERIAL_CHAR(','); SERIAL_ECHO_F(normal.y, 7); @@ -1721,7 +1730,7 @@ void unified_bed_leveling::smart_fill_mesh() { SERIAL_ECHOLNPAIR_F("Fade Height M420 Z", planner.z_fade_height, 4); #endif - adjust_mesh_to_mean(g29_c_flag, g29_constant); + adjust_mesh_to_mean(param.C_seen, param.C_constant); #if HAS_BED_PROBE SERIAL_ECHOLNPAIR_F("Probe Offset M851 Z", probe.offset.z, 7); @@ -1819,17 +1828,17 @@ void unified_bed_leveling::smart_fill_mesh() { return; } - if (!parser.has_value() || !WITHIN(g29_storage_slot, 0, a - 1)) { + if (!parser.has_value() || !WITHIN(parser.value_int(), 0, a - 1)) { SERIAL_ECHOLNPAIR("?Invalid storage slot.\n?Use 0 to ", a - 1); return; } - g29_storage_slot = parser.value_int(); + param.KLS_storage_slot = parser.value_int(); float tmp_z_values[GRID_MAX_POINTS_X][GRID_MAX_POINTS_Y]; - settings.load_mesh(g29_storage_slot, &tmp_z_values); + settings.load_mesh(param.KLS_storage_slot, &tmp_z_values); - SERIAL_ECHOLNPAIR("Subtracting mesh in slot ", g29_storage_slot, " from current mesh."); + SERIAL_ECHOLNPAIR("Subtracting mesh in slot ", param.KLS_storage_slot, " from current mesh."); GRID_LOOP(x, y) { z_values[x][y] -= tmp_z_values[x][y]; diff --git a/Marlin/src/gcode/bedlevel/M420.cpp b/Marlin/src/gcode/bedlevel/M420.cpp index 96122c18f8..55b14c19dc 100644 --- a/Marlin/src/gcode/bedlevel/M420.cpp +++ b/Marlin/src/gcode/bedlevel/M420.cpp @@ -156,16 +156,16 @@ void GcodeSuite::M420() { GRID_LOOP(x, y) mesh_sum += Z_VALUES(x, y); const float zmean = mesh_sum / float(GRID_MAX_POINTS); - #else + #else // midrange - // Find the low and high mesh values + // Find the low and high mesh values. float lo_val = 100, hi_val = -100; GRID_LOOP(x, y) { const float z = Z_VALUES(x, y); NOMORE(lo_val, z); NOLESS(hi_val, z); } - // Take the mean of the lowest and highest + // Get the midrange plus C value. (The median may be better.) const float zmean = (lo_val + hi_val) / 2.0 + cval; #endif diff --git a/Marlin/src/lcd/marlinui.h b/Marlin/src/lcd/marlinui.h index 6f5703e622..a18a3384af 100644 --- a/Marlin/src/lcd/marlinui.h +++ b/Marlin/src/lcd/marlinui.h @@ -85,11 +85,6 @@ typedef void (*screenFunc_t)(); typedef void (*menuAction_t)(); - #if ENABLED(AUTO_BED_LEVELING_UBL) - void lcd_mesh_edit_setup(const float &initial); - float lcd_mesh_edit(); - #endif - #endif // HAS_LCD_MENU #endif // HAS_WIRED_LCD @@ -488,6 +483,11 @@ public: static void ubl_plot(const uint8_t x_plot, const uint8_t y_plot); #endif + #if ENABLED(AUTO_BED_LEVELING_UBL) + static void ubl_mesh_edit_start(const float &initial); + static float ubl_mesh_value(); + #endif + static void draw_select_screen_prompt(PGM_P const pref, const char * const string=nullptr, PGM_P const suff=nullptr); #elif HAS_WIRED_LCD diff --git a/Marlin/src/lcd/menu/menu_ubl.cpp b/Marlin/src/lcd/menu/menu_ubl.cpp index 6c6076cf74..565e6725a7 100644 --- a/Marlin/src/lcd/menu/menu_ubl.cpp +++ b/Marlin/src/lcd/menu/menu_ubl.cpp @@ -56,12 +56,24 @@ inline float rounded_mesh_value() { return float(rounded - (rounded % 5L)) / 1000; } -static void _lcd_mesh_fine_tune(PGM_P const msg) { +/** + * This screen displays the temporary mesh value and updates it based on encoder + * movement. While this screen is active ubl.fine_tune_mesh sits in a loop getting + * the current value via ubl_mesh_value, moves the Z axis, and updates the mesh + * value until the encoder button is pressed. + * + * - Update the 'mesh_edit_accumulator' from encoder rotation + * - Draw the mesh value (with draw_edit_screen) + * - Draw the graphical overlay, if enabled. + * - Update the 'refresh' state according to the display type + */ +void _lcd_mesh_fine_tune(PGM_P const msg) { + constexpr float mesh_edit_step = 1.0f / 200.0f; ui.defer_status_screen(); if (ubl.encoder_diff) { mesh_edit_accumulator += TERN(IS_TFTGLCD_PANEL, - ubl.encoder_diff * 0.005f / ENCODER_PULSES_PER_STEP, - ubl.encoder_diff > 0 ? 0.005f : -0.005f + ubl.encoder_diff * mesh_edit_step / ENCODER_PULSES_PER_STEP, + ubl.encoder_diff > 0 ? mesh_edit_step : -mesh_edit_step ); ubl.encoder_diff = 0; IF_DISABLED(IS_TFTGLCD_PANEL, ui.refresh(LCDVIEW_CALL_REDRAW_NEXT)); @@ -77,29 +89,19 @@ static void _lcd_mesh_fine_tune(PGM_P const msg) { } // -// Called external to the menu system to acquire the result of an edit. +// Init mesh editing and go to the fine tuning screen (ubl.fine_tune_mesh) +// To capture encoder events UBL will also call ui.capture and ui.release. // -float lcd_mesh_edit() { return rounded_mesh_value(); } - -void lcd_mesh_edit_setup(const float &initial) { - TERN_(HAS_GRAPHICAL_TFT, ui.clear_lcd()); +void MarlinUI::ubl_mesh_edit_start(const float &initial) { + TERN_(HAS_GRAPHICAL_TFT, clear_lcd()); mesh_edit_accumulator = initial; - ui.goto_screen([]{ _lcd_mesh_fine_tune(GET_TEXT(MSG_MESH_EDIT_Z)); }); + goto_screen([]{ _lcd_mesh_fine_tune(GET_TEXT(MSG_MESH_EDIT_Z)); }); } -void _lcd_z_offset_edit() { - _lcd_mesh_fine_tune(GET_TEXT(MSG_UBL_Z_OFFSET)); -} - -float lcd_z_offset_edit() { - ui.goto_screen(_lcd_z_offset_edit); - return rounded_mesh_value(); -} - -void lcd_z_offset_edit_setup(const float &initial) { - mesh_edit_accumulator = initial; - ui.goto_screen(_lcd_z_offset_edit); -} +// +// Get the mesh value within a Z adjustment loop (ubl.fine_tune_mesh) +// +float MarlinUI::ubl_mesh_value() { return rounded_mesh_value(); } /** * UBL Build Custom Mesh Command From 2d2291d00eab6159de24eb7ff74001b1d6dd29e4 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Wed, 24 Mar 2021 05:40:28 -0500 Subject: [PATCH 190/253] More IntelliSense-friendly declarations --- Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp | 4 +- Marlin/src/feature/caselight.h | 10 +- Marlin/src/feature/joystick.h | 16 +- Marlin/src/feature/meatpack.cpp | 4 +- Marlin/src/feature/mixing.h | 9 +- Marlin/src/feature/powerloss.h | 40 ++- Marlin/src/feature/tmc_util.h | 16 +- Marlin/src/gcode/bedlevel/G35.cpp | 4 +- Marlin/src/gcode/calibrate/G33.cpp | 4 +- Marlin/src/gcode/calibrate/G34_M422.cpp | 4 +- Marlin/src/gcode/gcode.h | 336 +++++++++++++----- Marlin/src/gcode/queue.h | 14 +- .../lcd/dogm/status_screen_lite_ST7920.cpp | 4 +- Marlin/src/lcd/dwin/e3v2/dwin.cpp | 8 +- Marlin/src/lcd/dwin/e3v2/dwin.h | 24 +- .../lcd/extui/lib/dgus/DGUSScreenHandler.cpp | 4 +- .../lcd/extui/lib/mks_ui/draw_printing.cpp | 4 +- Marlin/src/lcd/extui/ui_api.cpp | 76 ++-- Marlin/src/lcd/marlinui.cpp | 4 +- Marlin/src/lcd/marlinui.h | 20 +- Marlin/src/lcd/menu/game/game.h | 16 +- Marlin/src/lcd/menu/menu_delta_calibrate.cpp | 4 +- Marlin/src/lcd/menu/menu_probe_offset.cpp | 4 +- Marlin/src/libs/nozzle.cpp | 12 +- Marlin/src/module/endstops.h | 12 +- Marlin/src/module/planner.cpp | 4 +- Marlin/src/module/planner.h | 4 +- Marlin/src/module/servo.cpp | 4 +- Marlin/src/module/stepper.cpp | 4 +- Marlin/src/module/temperature.h | 84 +++-- Marlin/src/module/tool_change.h | 8 +- Marlin/src/sd/cardreader.cpp | 4 +- 32 files changed, 562 insertions(+), 203 deletions(-) diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp index 42a3018561..06b91002b8 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp @@ -303,7 +303,9 @@ void unified_bed_leveling::G29() { const int8_t p_val = parser.intval('P', -1); const bool may_move = p_val == 1 || p_val == 2 || p_val == 4 || parser.seen('J'); - TERN_(HAS_MULTI_HOTEND, const uint8_t old_tool_index = active_extruder); + #if ENABLED(HAS_MULTI_HOTEND) + const uint8_t old_tool_index = active_extruder; + #endif // Check for commands that require the printer to be homed if (may_move) { diff --git a/Marlin/src/feature/caselight.h b/Marlin/src/feature/caselight.h index 25bcb486fa..05385ad0cb 100644 --- a/Marlin/src/feature/caselight.h +++ b/Marlin/src/feature/caselight.h @@ -34,7 +34,9 @@ class CaseLight { public: static bool on; - TERN_(CASELIGHT_USES_BRIGHTNESS, static uint8_t brightness); + #if ENABLED(CASELIGHT_USES_BRIGHTNESS) + static uint8_t brightness; + #endif static bool pin_is_pwm() { return TERN0(NEED_CASE_LIGHT_PIN, PWM_PIN(CASE_LIGHT_PIN)); } static bool has_brightness() { return TERN0(CASELIGHT_USES_BRIGHTNESS, TERN(CASE_LIGHT_USE_NEOPIXEL, true, pin_is_pwm())); } @@ -50,8 +52,10 @@ public: static inline void update_brightness() { update(false); } static inline void update_enabled() { update(true); } -private: - TERN_(CASE_LIGHT_IS_COLOR_LED, static LEDColor color); + #if ENABLED(CASE_LIGHT_IS_COLOR_LED) + private: + static LEDColor color; + #endif }; extern CaseLight caselight; diff --git a/Marlin/src/feature/joystick.h b/Marlin/src/feature/joystick.h index e8e218b2f9..d1c4fbd314 100644 --- a/Marlin/src/feature/joystick.h +++ b/Marlin/src/feature/joystick.h @@ -32,11 +32,19 @@ class Joystick { friend class Temperature; private: - TERN_(HAS_JOY_ADC_X, static temp_info_t x); - TERN_(HAS_JOY_ADC_Y, static temp_info_t y); - TERN_(HAS_JOY_ADC_Z, static temp_info_t z); + #if ENABLED(HAS_JOY_ADC_X) + static temp_info_t x; + #endif + #if ENABLED(HAS_JOY_ADC_Y) + static temp_info_t y; + #endif + #if ENABLED(HAS_JOY_ADC_Z) + static temp_info_t z; + #endif public: - TERN_(JOYSTICK_DEBUG, static void report()); + #if ENABLED(JOYSTICK_DEBUG) + static void report(); + #endif static void calculate(xyz_float_t &norm_jog); static void inject_jog_moves(); }; diff --git a/Marlin/src/feature/meatpack.cpp b/Marlin/src/feature/meatpack.cpp index 44567ac482..0742f82350 100644 --- a/Marlin/src/feature/meatpack.cpp +++ b/Marlin/src/feature/meatpack.cpp @@ -57,7 +57,9 @@ uint8_t meatPackLookupTable[16] = { '\0' // Unused. 0b1111 indicates a literal character }; -TERN_(MP_DEBUG, uint8_t chars_decoded = 0); // Log the first 64 bytes after each reset +#if ENABLED(MP_DEBUG) + uint8_t chars_decoded = 0; // Log the first 64 bytes after each reset +#endif void MeatPack::reset_state() { state = 0; diff --git a/Marlin/src/feature/mixing.h b/Marlin/src/feature/mixing.h index 65d1f1bf95..5de039985d 100644 --- a/Marlin/src/feature/mixing.h +++ b/Marlin/src/feature/mixing.h @@ -61,9 +61,6 @@ enum MixTool { #define MAX_VTOOLS TERN(HAS_MIXER_SYNC_CHANNEL, 254, 255) static_assert(NR_MIXING_VIRTUAL_TOOLS <= MAX_VTOOLS, "MIXING_VIRTUAL_TOOLS must be <= " STRINGIFY(MAX_VTOOLS) "!"); -#define MIXER_BLOCK_FIELD mixer_comp_t b_color[MIXING_STEPPERS] -#define MIXER_POPULATE_BLOCK() mixer.populate_block(block->b_color) -#define MIXER_STEPPER_SETUP() mixer.stepper_setup(current_block->b_color) #define MIXER_STEPPER_LOOP(VAR) for (uint_fast8_t VAR = 0; VAR < MIXING_STEPPERS; VAR++) #if ENABLED(GRADIENT_MIX) @@ -73,9 +70,11 @@ static_assert(NR_MIXING_VIRTUAL_TOOLS <= MAX_VTOOLS, "MIXING_VIRTUAL_TOOLS must mixer_comp_t color[MIXING_STEPPERS]; // The current gradient color float start_z, end_z; // Region for gradient int8_t start_vtool, end_vtool; // Start and end virtual tools - mixer_perc_t start_mix[MIXING_STEPPERS], // Start and end mixes from those tools + mixer_perc_t start_mix[MIXING_STEPPERS], // Start and end mixes from those tools end_mix[MIXING_STEPPERS]; - TERN_(GRADIENT_VTOOL, int8_t vtool_index); // Use this virtual tool number as index + #if ENABLED(GRADIENT_VTOOL) + int8_t vtool_index; // Use this virtual tool number as index + #endif } gradient_t; #endif diff --git a/Marlin/src/feature/powerloss.h b/Marlin/src/feature/powerloss.h index 12d11b141e..7c09c0f3cf 100644 --- a/Marlin/src/feature/powerloss.h +++ b/Marlin/src/feature/powerloss.h @@ -55,22 +55,38 @@ typedef struct { float zraise; // Repeat information - TERN_(GCODE_REPEAT_MARKERS, Repeat stored_repeat); + #if ENABLED(GCODE_REPEAT_MARKERS) + Repeat stored_repeat; + #endif - TERN_(HAS_HOME_OFFSET, xyz_pos_t home_offset); - TERN_(HAS_POSITION_SHIFT, xyz_pos_t position_shift); - TERN_(HAS_MULTI_EXTRUDER, uint8_t active_extruder); + #if ENABLED(HAS_HOME_OFFSET) + xyz_pos_t home_offset; + #endif + #if ENABLED(HAS_POSITION_SHIFT) + xyz_pos_t position_shift; + #endif + #if ENABLED(HAS_MULTI_EXTRUDER) + uint8_t active_extruder; + #endif #if DISABLED(NO_VOLUMETRICS) bool volumetric_enabled; float filament_size[EXTRUDERS]; #endif - TERN_(HAS_HOTEND, celsius_t target_temperature[HOTENDS]); - TERN_(HAS_HEATED_BED, celsius_t target_temperature_bed); - TERN_(HAS_FAN, uint8_t fan_speed[FAN_COUNT]); + #if ENABLED(HAS_HOTEND) + celsius_t target_temperature[HOTENDS]; + #endif + #if ENABLED(HAS_HEATED_BED) + celsius_t target_temperature_bed; + #endif + #if ENABLED(HAS_FAN) + uint8_t fan_speed[FAN_COUNT]; + #endif - TERN_(HAS_LEVELING, float fade); + #if ENABLED(HAS_LEVELING) + float fade; + #endif #if ENABLED(FWRETRACT) float retract[EXTRUDERS], retract_hop; @@ -80,7 +96,9 @@ typedef struct { #if ENABLED(MIXING_EXTRUDER) //uint_fast8_t selected_vtool; //mixer_comp_t color[NR_MIXING_VIRTUAL_TOOLS][MIXING_STEPPERS]; - TERN_(GRADIENT_MIX, gradient_t gradient); + #if ENABLED(GRADIENT_MIX) + gradient_t gradient; + #endif #endif // SD Filename and position @@ -97,7 +115,9 @@ typedef struct { struct { bool dryrun:1; // M111 S8 bool allow_cold_extrusion:1; // M302 P1 - TERN_(HAS_LEVELING, bool leveling:1); + #if ENABLED(HAS_LEVELING) + bool leveling:1; + #endif } flag; uint8_t valid_foot; diff --git a/Marlin/src/feature/tmc_util.h b/Marlin/src/feature/tmc_util.h index b21b89f68b..1767313ba2 100644 --- a/Marlin/src/feature/tmc_util.h +++ b/Marlin/src/feature/tmc_util.h @@ -70,9 +70,15 @@ class TMCStorage { } struct { - TERN_(HAS_STEALTHCHOP, bool stealthChop_enabled = false); - TERN_(HYBRID_THRESHOLD, uint8_t hybrid_thrs = 0); - TERN_(USE_SENSORLESS, int16_t homing_thrs = 0); + #if ENABLED(HAS_STEALTHCHOP) + bool stealthChop_enabled = false; + #endif + #if ENABLED(HYBRID_THRESHOLD) + uint8_t hybrid_thrs = 0; + #endif + #if ENABLED(USE_SENSORLESS) + int16_t homing_thrs = 0; + #endif } stored; }; @@ -363,7 +369,9 @@ void test_tmc_connection(const bool test_x, const bool test_y, const bool test_z struct slow_homing_t { xy_ulong_t acceleration; - TERN_(HAS_CLASSIC_JERK, xy_float_t jerk_xy); + #if ENABLED(HAS_CLASSIC_JERK) + xy_float_t jerk_xy; + #endif }; #endif diff --git a/Marlin/src/gcode/bedlevel/G35.cpp b/Marlin/src/gcode/bedlevel/G35.cpp index 88f02e6de2..0fab747618 100644 --- a/Marlin/src/gcode/bedlevel/G35.cpp +++ b/Marlin/src/gcode/bedlevel/G35.cpp @@ -72,7 +72,9 @@ void GcodeSuite::G35() { // Disable the leveling matrix before auto-aligning #if HAS_LEVELING - TERN_(RESTORE_LEVELING_AFTER_G35, const bool leveling_was_active = planner.leveling_active); + #if ENABLED(RESTORE_LEVELING_AFTER_G35) + const bool leveling_was_active = planner.leveling_active; + #endif set_bed_leveling_enabled(false); #endif diff --git a/Marlin/src/gcode/calibrate/G33.cpp b/Marlin/src/gcode/calibrate/G33.cpp index 5530bc7089..902711397d 100644 --- a/Marlin/src/gcode/calibrate/G33.cpp +++ b/Marlin/src/gcode/calibrate/G33.cpp @@ -63,7 +63,9 @@ enum CalEnum : char { // the 7 main calibration points - #define LOOP_CAL_RAD(VAR) LOOP_CAL_PT(VAR, __A, _7P_STEP) #define LOOP_CAL_ACT(VAR, _4P, _OP) LOOP_CAL_PT(VAR, _OP ? _AB : __A, _4P ? _4P_STEP : _7P_STEP) -TERN_(HAS_MULTI_HOTEND, const uint8_t old_tool_index = active_extruder); +#if ENABLED(HAS_MULTI_HOTEND) + const uint8_t old_tool_index = active_extruder; +#endif float lcd_probe_pt(const xy_pos_t &xy); diff --git a/Marlin/src/gcode/calibrate/G34_M422.cpp b/Marlin/src/gcode/calibrate/G34_M422.cpp index bee6aaedeb..d2075fedce 100644 --- a/Marlin/src/gcode/calibrate/G34_M422.cpp +++ b/Marlin/src/gcode/calibrate/G34_M422.cpp @@ -130,7 +130,9 @@ void GcodeSuite::G34() { // Disable the leveling matrix before auto-aligning #if HAS_LEVELING - TERN_(RESTORE_LEVELING_AFTER_G34, const bool leveling_was_active = planner.leveling_active); + #if ENABLED(RESTORE_LEVELING_AFTER_G34) + const bool leveling_was_active = planner.leveling_active; + #endif set_bed_leveling_enabled(false); #endif diff --git a/Marlin/src/gcode/gcode.h b/Marlin/src/gcode/gcode.h index 52570ff83f..7ea2489584 100644 --- a/Marlin/src/gcode/gcode.h +++ b/Marlin/src/gcode/gcode.h @@ -418,24 +418,34 @@ public: private: - TERN_(MARLIN_DEV_MODE, static void D(const int16_t dcode)); + #if ENABLED(MARLIN_DEV_MODE) + static void D(const int16_t dcode); + #endif static void G0_G1(TERN_(HAS_FAST_MOVES, const bool fast_move=false)); - TERN_(ARC_SUPPORT, static void G2_G3(const bool clockwise)); + #if ENABLED(ARC_SUPPORT) + static void G2_G3(const bool clockwise); + #endif static void G4(); - TERN_(BEZIER_CURVE_SUPPORT, static void G5()); + #if ENABLED(BEZIER_CURVE_SUPPORT) + static void G5(); + #endif - TERN_(DIRECT_STEPPING, static void G6()); + #if ENABLED(DIRECT_STEPPING) + static void G6(); + #endif #if ENABLED(FWRETRACT) static void G10(); static void G11(); #endif - TERN_(NOZZLE_CLEAN_FEATURE, static void G12()); + #if ENABLED(NOZZLE_CLEAN_FEATURE) + static void G12(); + #endif #if ENABLED(CNC_WORKSPACE_PLANES) static void G17(); @@ -448,9 +458,13 @@ private: static void G21(); #endif - TERN_(G26_MESH_VALIDATION, static void G26()); + #if ENABLED(G26_MESH_VALIDATION) + static void G26(); + #endif - TERN_(NOZZLE_PARK_FEATURE, static void G27()); + #if ENABLED(NOZZLE_PARK_FEATURE) + static void G27(); + #endif static void G28(); @@ -474,19 +488,29 @@ private: #endif #endif - TERN_(DELTA_AUTO_CALIBRATION, static void G33()); + #if ENABLED(DELTA_AUTO_CALIBRATION) + static void G33(); + #endif #if ANY(Z_MULTI_ENDSTOPS, Z_STEPPER_AUTO_ALIGN, MECHANICAL_GANTRY_CALIBRATION) static void G34(); #endif - TERN_(Z_STEPPER_AUTO_ALIGN, static void M422()); + #if ENABLED(Z_STEPPER_AUTO_ALIGN) + static void M422(); + #endif - TERN_(ASSISTED_TRAMMING, static void G35()); + #if ENABLED(ASSISTED_TRAMMING) + static void G35(); + #endif - TERN_(G38_PROBE_TARGET, static void G38(const int8_t subcode)); + #if ENABLED(G38_PROBE_TARGET) + static void G38(const int8_t subcode); + #endif - TERN_(HAS_MESH, static void G42()); + #if ENABLED(HAS_MESH) + static void G42(); + #endif #if ENABLED(CNC_COORDINATE_SYSTEMS) static void G53(); @@ -498,20 +522,28 @@ private: static void G59(); #endif - TERN_(PROBE_TEMP_COMPENSATION, static void G76()); + #if ENABLED(PROBE_TEMP_COMPENSATION) + static void G76(); + #endif #if SAVED_POSITIONS static void G60(); static void G61(); #endif - TERN_(GCODE_MOTION_MODES, static void G80()); + #if ENABLED(GCODE_MOTION_MODES) + static void G80(); + #endif static void G92(); - TERN_(CALIBRATION_GCODE, static void G425()); + #if ENABLED(CALIBRATION_GCODE) + static void G425(); + #endif - TERN_(HAS_RESUME_CONTINUE, static void M0_M1()); + #if ENABLED(HAS_RESUME_CONTINUE) + static void M0_M1(); + #endif #if HAS_CUTTER static void M3_M4(const bool is_M4); @@ -519,14 +551,22 @@ private: #endif #if ENABLED(COOLANT_CONTROL) - TERN_(COOLANT_MIST, static void M7()); - TERN_(COOLANT_FLOOD, static void M8()); + #if ENABLED(COOLANT_MIST) + static void M7(); + #endif + #if ENABLED(COOLANT_FLOOD) + static void M8(); + #endif static void M9(); #endif - TERN_(EXTERNAL_CLOSED_LOOP_CONTROLLER, static void M12()); + #if ENABLED(EXTERNAL_CLOSED_LOOP_CONTROLLER) + static void M12(); + #endif - TERN_(EXPECTED_PRINTER_CHECK, static void M16()); + #if ENABLED(EXPECTED_PRINTER_CHECK) + static void M16(); + #endif static void M17(); @@ -549,27 +589,43 @@ private: static void M31(); #if ENABLED(SDSUPPORT) - TERN_(HAS_MEDIA_SUBCALLS, static void M32()); - TERN_(LONG_FILENAME_HOST_SUPPORT, static void M33()); + #if ENABLED(HAS_MEDIA_SUBCALLS) + static void M32(); + #endif + #if ENABLED(LONG_FILENAME_HOST_SUPPORT) + static void M33(); + #endif #if BOTH(SDCARD_SORT_ALPHA, SDSORT_GCODE) static void M34(); #endif #endif - TERN_(DIRECT_PIN_CONTROL, static void M42()); - TERN_(PINS_DEBUGGING, static void M43()); + #if ENABLED(DIRECT_PIN_CONTROL) + static void M42(); + #endif + #if ENABLED(PINS_DEBUGGING) + static void M43(); + #endif - TERN_(Z_MIN_PROBE_REPEATABILITY_TEST, static void M48()); + #if ENABLED(Z_MIN_PROBE_REPEATABILITY_TEST) + static void M48(); + #endif - TERN_(LCD_SET_PROGRESS_MANUALLY, static void M73()); + #if ENABLED(LCD_SET_PROGRESS_MANUALLY) + static void M73(); + #endif static void M75(); static void M76(); static void M77(); - TERN_(PRINTCOUNTER, static void M78()); + #if ENABLED(PRINTCOUNTER) + static void M78(); + #endif - TERN_(PSU_CONTROL, static void M80()); + #if ENABLED(PSU_CONTROL) + static void M80(); + #endif static void M81(); static void M82(); @@ -577,7 +633,9 @@ private: static void M85(); static void M92(); - TERN_(M100_FREE_MEMORY_WATCHER, static void M100()); + #if ENABLED(M100_FREE_MEMORY_WATCHER) + static void M100(); + #endif #if EXTRUDERS static void M104(); @@ -595,13 +653,17 @@ private: static void M108(); static void M112(); static void M410(); - TERN_(HOST_PROMPT_SUPPORT, static void M876()); + #if ENABLED(HOST_PROMPT_SUPPORT) + static void M876(); + #endif #endif static void M110(); static void M111(); - TERN_(HOST_KEEPALIVE_FEATURE, static void M113()); + #if ENABLED(HOST_KEEPALIVE_FEATURE) + static void M113(); + #endif static void M114(); static void M115(); @@ -611,7 +673,9 @@ private: static void M120(); static void M121(); - TERN_(PARK_HEAD_ON_PAUSE, static void M125()); + #if ENABLED(PARK_HEAD_ON_PAUSE) + static void M125(); + #endif #if ENABLED(BARICUDA) #if HAS_HEATER_1 @@ -643,9 +707,13 @@ private: static void M145(); #endif - TERN_(TEMPERATURE_UNITS_SUPPORT, static void M149()); + #if ENABLED(TEMPERATURE_UNITS_SUPPORT) + static void M149(); + #endif - TERN_(HAS_COLOR_LEDS, static void M150()); + #if ENABLED(HAS_COLOR_LEDS) + static void M150(); + #endif #if BOTH(AUTO_REPORT_TEMPERATURES, HAS_TEMP_SENSOR) static void M155(); @@ -654,8 +722,12 @@ private: #if ENABLED(MIXING_EXTRUDER) static void M163(); static void M164(); - TERN_(DIRECT_MIXING_IN_G1, static void M165()); - TERN_(GRADIENT_MIX, static void M166()); + #if ENABLED(DIRECT_MIXING_IN_G1) + static void M165(); + #endif + #if ENABLED(GRADIENT_MIX) + static void M166(); + #endif #endif static void M200(); @@ -669,19 +741,27 @@ private: static void M204(); static void M205(); - TERN_(HAS_M206_COMMAND, static void M206()); + #if ENABLED(HAS_M206_COMMAND) + static void M206(); + #endif #if ENABLED(FWRETRACT) static void M207(); static void M208(); - TERN_(FWRETRACT_AUTORETRACT, static void M209()); + #if ENABLED(FWRETRACT_AUTORETRACT) + static void M209(); + #endif #endif static void M211(); - TERN_(HAS_MULTI_EXTRUDER, static void M217()); + #if ENABLED(HAS_MULTI_EXTRUDER) + static void M217(); + #endif - TERN_(HAS_HOTEND_OFFSET, static void M218()); + #if ENABLED(HAS_HOTEND_OFFSET) + static void M218(); + #endif static void M220(); @@ -689,11 +769,17 @@ private: static void M221(); #endif - TERN_(DIRECT_PIN_CONTROL, static void M226()); + #if ENABLED(DIRECT_PIN_CONTROL) + static void M226(); + #endif - TERN_(PHOTO_GCODE, static void M240()); + #if ENABLED(PHOTO_GCODE) + static void M240(); + #endif - TERN_(HAS_LCD_CONTRAST, static void M250()); + #if ENABLED(HAS_LCD_CONTRAST) + static void M250(); + #endif #if ENABLED(EXPERIMENTAL_I2CBUS) static void M260(); @@ -702,33 +788,55 @@ private: #if HAS_SERVOS static void M280(); - TERN_(EDITABLE_SERVO_ANGLES, static void M281()); + #if ENABLED(EDITABLE_SERVO_ANGLES) + static void M281(); + #endif #endif - TERN_(BABYSTEPPING, static void M290()); + #if ENABLED(BABYSTEPPING) + static void M290(); + #endif - TERN_(HAS_BUZZER, static void M300()); + #if ENABLED(HAS_BUZZER) + static void M300(); + #endif - TERN_(PIDTEMP, static void M301()); + #if ENABLED(PIDTEMP) + static void M301(); + #endif - TERN_(PREVENT_COLD_EXTRUSION, static void M302()); + #if ENABLED(PREVENT_COLD_EXTRUSION) + static void M302(); + #endif - TERN_(HAS_PID_HEATING, static void M303()); + #if ENABLED(HAS_PID_HEATING) + static void M303(); + #endif - TERN_(PIDTEMPBED, static void M304()); + #if ENABLED(PIDTEMPBED) + static void M304(); + #endif - TERN_(HAS_USER_THERMISTORS, static void M305()); + #if ENABLED(HAS_USER_THERMISTORS) + static void M305(); + #endif - TERN_(PIDTEMPCHAMBER, static void M309()); + #if ENABLED(PIDTEMPCHAMBER) + static void M309(); + #endif #if HAS_MICROSTEPS static void M350(); static void M351(); #endif - TERN_(CASE_LIGHT_ENABLE, static void M355()); + #if ENABLED(CASE_LIGHT_ENABLE) + static void M355(); + #endif - TERN_(REPETIER_GCODE_M360, static void M360()); + #if ENABLED(REPETIER_GCODE_M360) + static void M360(); + #endif #if ENABLED(MORGAN_SCARA) static bool M360(); @@ -750,7 +858,9 @@ private: static void M402(); #endif - TERN_(HAS_PRUSA_MMU2, static void M403()); + #if ENABLED(HAS_PRUSA_MMU2) + static void M403(); + #endif #if ENABLED(FILAMENT_WIDTH_SENSOR) static void M404(); @@ -759,22 +869,34 @@ private: static void M407(); #endif - TERN_(HAS_FILAMENT_SENSOR, static void M412()); + #if ENABLED(HAS_FILAMENT_SENSOR) + static void M412(); + #endif - TERN_(HAS_MULTI_LANGUAGE, static void M414()); + #if ENABLED(HAS_MULTI_LANGUAGE) + static void M414(); + #endif #if HAS_LEVELING static void M420(); static void M421(); #endif - TERN_(BACKLASH_GCODE, static void M425()); + #if ENABLED(BACKLASH_GCODE) + static void M425(); + #endif - TERN_(HAS_M206_COMMAND, static void M428()); + #if ENABLED(HAS_M206_COMMAND) + static void M428(); + #endif - TERN_(HAS_POWER_MONITOR, static void M430()); + #if ENABLED(HAS_POWER_MONITOR) + static void M430(); + #endif - TERN_(CANCEL_OBJECTS, static void M486()); + #if ENABLED(CANCEL_OBJECTS) + static void M486(); + #endif static void M500(); static void M501(); @@ -782,17 +904,27 @@ private: #if DISABLED(DISABLE_M503) static void M503(); #endif - TERN_(EEPROM_SETTINGS, static void M504()); + #if ENABLED(EEPROM_SETTINGS) + static void M504(); + #endif #if ENABLED(PASSWORD_FEATURE) static void M510(); - TERN_(PASSWORD_UNLOCK_GCODE, static void M511()); - TERN_(PASSWORD_CHANGE_GCODE, static void M512()); + #if ENABLED(PASSWORD_UNLOCK_GCODE) + static void M511(); + #endif + #if ENABLED(PASSWORD_CHANGE_GCODE) + static void M512(); + #endif #endif - TERN_(SDSUPPORT, static void M524()); + #if ENABLED(SDSUPPORT) + static void M524(); + #endif - TERN_(SD_ABORT_ON_ENDSTOP_HIT, static void M540()); + #if ENABLED(SD_ABORT_ON_ENDSTOP_HIT) + static void M540(); + #endif #if HAS_ETHERNET static void M552(); @@ -800,16 +932,22 @@ private: static void M554(); #endif - TERN_(BAUD_RATE_GCODE, static void M575()); + #if ENABLED(BAUD_RATE_GCODE) + static void M575(); + #endif #if ENABLED(ADVANCED_PAUSE_FEATURE) static void M600(); static void M603(); #endif - TERN_(HAS_DUPLICATION_MODE, static void M605()); + #if ENABLED(HAS_DUPLICATION_MODE) + static void M605(); + #endif - TERN_(IS_KINEMATIC, static void M665()); + #if ENABLED(IS_KINEMATIC) + static void M665(); + #endif #if ENABLED(DELTA) || HAS_EXTRA_ENDSTOPS static void M666(); @@ -824,13 +962,21 @@ private: static void M702(); #endif - TERN_(GCODE_REPEAT_MARKERS, static void M808()); + #if ENABLED(GCODE_REPEAT_MARKERS) + static void M808(); + #endif - TERN_(GCODE_MACROS, static void M810_819()); + #if ENABLED(GCODE_MACROS) + static void M810_819(); + #endif - TERN_(HAS_BED_PROBE, static void M851()); + #if ENABLED(HAS_BED_PROBE) + static void M851(); + #endif - TERN_(SKEW_CORRECTION_GCODE, static void M852()); + #if ENABLED(SKEW_CORRECTION_GCODE) + static void M852(); + #endif #if ENABLED(I2C_POSITION_ENCODERS) FORCE_INLINE static void M860() { I2CPEM.M860(); } @@ -850,18 +996,26 @@ private: static void M871(); #endif - TERN_(LIN_ADVANCE, static void M900()); + #if ENABLED(LIN_ADVANCE) + static void M900(); + #endif #if HAS_TRINAMIC_CONFIG static void M122(); static void M906(); - TERN_(HAS_STEALTHCHOP, static void M569()); + #if ENABLED(HAS_STEALTHCHOP) + static void M569(); + #endif #if ENABLED(MONITOR_DRIVER_STATUS) static void M911(); static void M912(); #endif - TERN_(HYBRID_THRESHOLD, static void M913()); - TERN_(USE_SENSORLESS, static void M914()); + #if ENABLED(HYBRID_THRESHOLD) + static void M913(); + #endif + #if ENABLED(USE_SENSORLESS) + static void M914(); + #endif #endif #if HAS_L64XX @@ -883,18 +1037,26 @@ private: #endif #endif - TERN_(SDSUPPORT, static void M928()); + #if ENABLED(SDSUPPORT) + static void M928(); + #endif - TERN_(MAGNETIC_PARKING_EXTRUDER, static void M951()); + #if ENABLED(MAGNETIC_PARKING_EXTRUDER) + static void M951(); + #endif - TERN_(TOUCH_SCREEN_CALIBRATION, static void M995()); + #if ENABLED(TOUCH_SCREEN_CALIBRATION) + static void M995(); + #endif #if BOTH(HAS_SPI_FLASH, SDSUPPORT) static void M993(); static void M994(); #endif - TERN_(PLATFORM_M997_SUPPORT, static void M997()); + #if ENABLED(PLATFORM_M997_SUPPORT) + static void M997(); + #endif static void M999(); @@ -903,11 +1065,17 @@ private: static void M1000(); #endif - TERN_(SDSUPPORT, static void M1001()); + #if ENABLED(SDSUPPORT) + static void M1001(); + #endif - TERN_(MAX7219_GCODE, static void M7219()); + #if ENABLED(MAX7219_GCODE) + static void M7219(); + #endif - TERN_(CONTROLLER_FAN_EDITABLE, static void M710()); + #if ENABLED(CONTROLLER_FAN_EDITABLE) + static void M710(); + #endif static void T(const int8_t tool_index); diff --git a/Marlin/src/gcode/queue.h b/Marlin/src/gcode/queue.h index 8e87d114eb..4d3ccb364e 100644 --- a/Marlin/src/gcode/queue.h +++ b/Marlin/src/gcode/queue.h @@ -40,9 +40,9 @@ public: * M110 N sets the current line number. */ long last_N; - int count; //!< Number of characters read in the current line of serial input - char line_buffer[MAX_CMD_SIZE]; //!< The current line accumulator - uint8_t input_state; //!< The input state + int count; //!< Number of characters read in the current line of serial input + char line_buffer[MAX_CMD_SIZE]; //!< The current line accumulator + uint8_t input_state; //!< The input state }; static SerialState serial_state[NUM_SERIAL]; //!< Serial states for each serial port @@ -57,9 +57,11 @@ public: * command and hands off execution to individual handler functions. */ struct CommandLine { - char buffer[MAX_CMD_SIZE]; //!< The command buffer - bool skip_ok; //!< Skip sending ok when command is processed? - TERN_(HAS_MULTI_SERIAL, serial_index_t port); //!< Serial port the command was received on + char buffer[MAX_CMD_SIZE]; //!< The command buffer + bool skip_ok; //!< Skip sending ok when command is processed? + #if ENABLED(HAS_MULTI_SERIAL) + serial_index_t port; //!< Serial port the command was received on + #endif }; /** diff --git a/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp b/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp index dcb65f676d..a2dfb74a57 100644 --- a/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp +++ b/Marlin/src/lcd/dogm/status_screen_lite_ST7920.cpp @@ -536,7 +536,9 @@ void ST7920_Lite_Status_Screen::draw_heat_icon(const bool whichIcon, const bool static struct { bool E1_show_target : 1; bool E2_show_target : 1; - TERN_(HAS_HEATED_BED, bool bed_show_target : 1); + #if ENABLED(HAS_HEATED_BED) + bool bed_show_target : 1; + #endif } display_state = { true, true, TERN_(HAS_HEATED_BED, true) }; diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.cpp b/Marlin/src/lcd/dwin/e3v2/dwin.cpp index 0e9b93525d..d543ff0508 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.cpp +++ b/Marlin/src/lcd/dwin/e3v2/dwin.cpp @@ -180,8 +180,12 @@ static uint8_t _card_percent = 0; static uint16_t _remain_time = 0; #if ENABLED(PAUSE_HEAT) - TERN_(HAS_HOTEND, uint16_t resume_hotend_temp = 0); - TERN_(HAS_HEATED_BED, uint16_t resume_bed_temp = 0); + #if ENABLED(HAS_HOTEND) + uint16_t resume_hotend_temp = 0; + #endif + #if ENABLED(HAS_HEATED_BED) + uint16_t resume_bed_temp = 0; + #endif #endif #if HAS_ZOFFSET_ITEM diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.h b/Marlin/src/lcd/dwin/e3v2/dwin.h index 9e0cda86c2..dd2d1cbc01 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.h +++ b/Marlin/src/lcd/dwin/e3v2/dwin.h @@ -234,9 +234,15 @@ extern char print_filename[16]; extern millis_t dwin_heat_time; typedef struct { - TERN_(HAS_HOTEND, celsius_t E_Temp = 0); - TERN_(HAS_HEATED_BED, celsius_t Bed_Temp = 0); - TERN_(HAS_FAN, int16_t Fan_speed = 0); + #if ENABLED(HAS_HOTEND) + celsius_t E_Temp = 0; + #endif + #if ENABLED(HAS_HEATED_BED) + celsius_t Bed_Temp = 0; + #endif + #if ENABLED(HAS_FAN) + int16_t Fan_speed = 0; + #endif int16_t print_speed = 100; float Max_Feedspeed = 0; float Max_Acceleration = 0; @@ -312,9 +318,15 @@ void HMI_Move_E(); void HMI_Zoffset(); -TERN_(HAS_HOTEND, void HMI_ETemp()); -TERN_(HAS_HEATED_BED, void HMI_BedTemp()); -TERN_(HAS_FAN, void HMI_FanSpeed()); +#if ENABLED(HAS_HOTEND) + void HMI_ETemp(); +#endif +#if ENABLED(HAS_HEATED_BED) + void HMI_BedTemp(); +#endif +#if ENABLED(HAS_FAN) + void HMI_FanSpeed(); +#endif void HMI_PrintSpeed(); diff --git a/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp index 473fcb954c..a585ef670a 100644 --- a/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp @@ -624,7 +624,9 @@ void DGUSScreenHandler::HandleHeaterControl(DGUS_VP_Variable &var, void *val_ptr DEBUG_ECHOLNPGM("HandlePreheat"); uint8_t e_temp = 0; - TERN_(HAS_HEATED_BED, uint8_t bed_temp = 0); + #if ENABLED(HAS_HEATED_BED) + uint8_t bed_temp = 0; + #endif const uint16_t preheat_option = swap16(*(uint16_t*)val_ptr); switch (preheat_option) { default: diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp index 2cc6d19cc5..e9e501ae5f 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp @@ -49,7 +49,9 @@ static lv_obj_t *labelPause, *labelStop, *labelOperat; static lv_obj_t *bar1, *bar1ValueText; static lv_obj_t *buttonPause, *buttonOperat, *buttonStop; -TERN_(HAS_MULTI_EXTRUDER, static lv_obj_t *labelExt2); +#if ENABLED(HAS_MULTI_EXTRUDER) + static lv_obj_t *labelExt2; +#endif #if HAS_HEATED_BED static lv_obj_t* labelBed; diff --git a/Marlin/src/lcd/extui/ui_api.cpp b/Marlin/src/lcd/extui/ui_api.cpp index 9e5e0b6a62..cfd48e5dd9 100644 --- a/Marlin/src/lcd/extui/ui_api.cpp +++ b/Marlin/src/lcd/extui/ui_api.cpp @@ -103,8 +103,12 @@ namespace ExtUI { static struct { uint8_t printer_killed : 1; - TERN_(JOYSTICK, uint8_t jogging : 1); - TERN_(SDSUPPORT, uint8_t was_sd_printing : 1); + #if ENABLED(JOYSTICK) + uint8_t jogging : 1; + #endif + #if ENABLED(SDSUPPORT) + uint8_t was_sd_printing : 1; + #endif } flags; #ifdef __SAM3X8E__ @@ -175,8 +179,12 @@ namespace ExtUI { #if HAS_HEATED_BED case BED: thermalManager.reset_bed_idle_timer(); return; #endif - TERN_(HAS_HEATED_CHAMBER, case CHAMBER: return); // Chamber has no idle timer - TERN_(HAS_COOLER, case COOLER: return); // Cooler has no idle timer + #if ENABLED(HAS_HEATED_CHAMBER) + case CHAMBER: return; // Chamber has no idle timer + #endif + #if ENABLED(HAS_COOLER) + case COOLER: return; // Cooler has no idle timer + #endif default: TERN_(HAS_HOTEND, thermalManager.reset_hotend_idle_timer(heater - H0)); break; @@ -234,8 +242,12 @@ namespace ExtUI { bool isHeaterIdle(const heater_t heater) { #if HEATER_IDLE_HANDLER switch (heater) { - TERN_(HAS_HEATED_BED, case BED: return thermalManager.heater_idle[thermalManager.IDLE_INDEX_BED].timed_out); - TERN_(HAS_HEATED_CHAMBER, case CHAMBER: return false); // Chamber has no idle timer + #if ENABLED(HAS_HEATED_BED) + case BED: return thermalManager.heater_idle[thermalManager.IDLE_INDEX_BED].timed_out; + #endif + #if ENABLED(HAS_HEATED_CHAMBER) + case CHAMBER: return false; // Chamber has no idle timer + #endif default: return TERN0(HAS_HOTEND, thermalManager.heater_idle[heater - H0].timed_out); } @@ -253,8 +265,12 @@ namespace ExtUI { float getActualTemp_celsius(const heater_t heater) { switch (heater) { - TERN_(HAS_HEATED_BED, case BED: return GET_TEMP_ADJUSTMENT(thermalManager.degBed())); - TERN_(HAS_HEATED_CHAMBER, case CHAMBER: return GET_TEMP_ADJUSTMENT(thermalManager.degChamber())); + #if ENABLED(HAS_HEATED_BED) + case BED: return GET_TEMP_ADJUSTMENT(thermalManager.degBed()); + #endif + #if ENABLED(HAS_HEATED_CHAMBER) + case CHAMBER: return GET_TEMP_ADJUSTMENT(thermalManager.degChamber()); + #endif default: return GET_TEMP_ADJUSTMENT(thermalManager.degHotend(heater - H0)); } } @@ -265,8 +281,12 @@ namespace ExtUI { float getTargetTemp_celsius(const heater_t heater) { switch (heater) { - TERN_(HAS_HEATED_BED, case BED: return GET_TEMP_ADJUSTMENT(thermalManager.degTargetBed())); - TERN_(HAS_HEATED_CHAMBER, case CHAMBER: return GET_TEMP_ADJUSTMENT(thermalManager.degTargetChamber())); + #if ENABLED(HAS_HEATED_BED) + case BED: return GET_TEMP_ADJUSTMENT(thermalManager.degTargetBed()); + #endif + #if ENABLED(HAS_HEATED_CHAMBER) + case CHAMBER: return GET_TEMP_ADJUSTMENT(thermalManager.degTargetChamber()); + #endif default: return GET_TEMP_ADJUSTMENT(thermalManager.degTargetHotend(heater - H0)); } } @@ -294,13 +314,13 @@ namespace ExtUI { } float getAxisPosition_mm(const axis_t axis) { - return TERN_(JOYSTICK, flags.jogging ? destination[axis] :) current_position[axis]; + return TERN0(JOYSTICK, flags.jogging) ? destination[axis] : current_position[axis]; } float getAxisPosition_mm(const extruder_t extruder) { const extruder_t old_tool = getActiveTool(); setActiveTool(extruder, true); - const float epos = TERN_(JOYSTICK, flags.jogging ? destination.e :) current_position.e; + const float epos = TERN0(JOYSTICK, flags.jogging) ? destination.e : current_position.e; setActiveTool(old_tool, true); return epos; } @@ -491,14 +511,30 @@ namespace ExtUI { int getTMCBumpSensitivity(const axis_t axis) { switch (axis) { - TERN_(X_SENSORLESS, case X: return stepperX.homing_threshold()); - TERN_(X2_SENSORLESS, case X2: return stepperX2.homing_threshold()); - TERN_(Y_SENSORLESS, case Y: return stepperY.homing_threshold()); - TERN_(Y2_SENSORLESS, case Y2: return stepperY2.homing_threshold()); - TERN_(Z_SENSORLESS, case Z: return stepperZ.homing_threshold()); - TERN_(Z2_SENSORLESS, case Z2: return stepperZ2.homing_threshold()); - TERN_(Z3_SENSORLESS, case Z3: return stepperZ3.homing_threshold()); - TERN_(Z4_SENSORLESS, case Z4: return stepperZ4.homing_threshold()); + #if ENABLED(X_SENSORLESS) + case X: return stepperX.homing_threshold(); + #endif + #if ENABLED(X2_SENSORLESS) + case X2: return stepperX2.homing_threshold(); + #endif + #if ENABLED(Y_SENSORLESS) + case Y: return stepperY.homing_threshold(); + #endif + #if ENABLED(Y2_SENSORLESS) + case Y2: return stepperY2.homing_threshold(); + #endif + #if ENABLED(Z_SENSORLESS) + case Z: return stepperZ.homing_threshold(); + #endif + #if ENABLED(Z2_SENSORLESS) + case Z2: return stepperZ2.homing_threshold(); + #endif + #if ENABLED(Z3_SENSORLESS) + case Z3: return stepperZ3.homing_threshold(); + #endif + #if ENABLED(Z4_SENSORLESS) + case Z4: return stepperZ4.homing_threshold(); + #endif default: return 0; } } diff --git a/Marlin/src/lcd/marlinui.cpp b/Marlin/src/lcd/marlinui.cpp index 88566713a4..0be30efad8 100644 --- a/Marlin/src/lcd/marlinui.cpp +++ b/Marlin/src/lcd/marlinui.cpp @@ -688,7 +688,9 @@ void MarlinUI::quick_feedback(const bool clear_buttons/*=true*/) { xyze_pos_t ManualMove::all_axes_destination = { 0 }; bool ManualMove::processing = false; #endif - TERN_(MULTI_MANUAL, int8_t ManualMove::e_index = 0); + #if ENABLED(MULTI_MANUAL) + int8_t ManualMove::e_index = 0; + #endif AxisEnum ManualMove::axis = NO_AXIS; /** diff --git a/Marlin/src/lcd/marlinui.h b/Marlin/src/lcd/marlinui.h index a18a3384af..490d78401e 100644 --- a/Marlin/src/lcd/marlinui.h +++ b/Marlin/src/lcd/marlinui.h @@ -105,9 +105,15 @@ #if PREHEAT_COUNT typedef struct { - TERN_(HAS_HOTEND, celsius_t hotend_temp); - TERN_(HAS_HEATED_BED, celsius_t bed_temp ); - TERN_(HAS_FAN, uint16_t fan_speed ); + #if ENABLED(HAS_HOTEND) + celsius_t hotend_temp; + #endif + #if ENABLED(HAS_HEATED_BED) + celsius_t bed_temp; + #endif + #if ENABLED(HAS_FAN) + uint16_t fan_speed; + #endif } preheat_t; #endif @@ -123,10 +129,14 @@ static int8_t constexpr e_index = 0; #endif static millis_t start_time; - TERN_(IS_KINEMATIC, static xyze_pos_t all_axes_destination); + #if ENABLED(IS_KINEMATIC) + static xyze_pos_t all_axes_destination; + #endif public: static float menu_scale; - TERN_(IS_KINEMATIC, static float offset); + #if ENABLED(IS_KINEMATIC) + static float offset; + #endif template void set_destination(const T& dest) { #if IS_KINEMATIC diff --git a/Marlin/src/lcd/menu/game/game.h b/Marlin/src/lcd/menu/game/game.h index cba79e4f28..999aa78100 100644 --- a/Marlin/src/lcd/menu/game/game.h +++ b/Marlin/src/lcd/menu/game/game.h @@ -53,10 +53,18 @@ // Pool game data to save SRAM union MarlinGameData { - TERN_(MARLIN_BRICKOUT, brickout_data_t brickout); - TERN_(MARLIN_INVADERS, invaders_data_t invaders); - TERN_(MARLIN_SNAKE, snake_data_t snake); - TERN_(MARLIN_MAZE, maze_data_t maze); + #if ENABLED(MARLIN_BRICKOUT) + brickout_data_t brickout; + #endif + #if ENABLED(MARLIN_INVADERS) + invaders_data_t invaders; + #endif + #if ENABLED(MARLIN_SNAKE) + snake_data_t snake; + #endif + #if ENABLED(MARLIN_MAZE) + maze_data_t maze; + #endif }; extern MarlinGameData marlin_game_data; diff --git a/Marlin/src/lcd/menu/menu_delta_calibrate.cpp b/Marlin/src/lcd/menu/menu_delta_calibrate.cpp index a86ae74fce..ef9f2246c2 100644 --- a/Marlin/src/lcd/menu/menu_delta_calibrate.cpp +++ b/Marlin/src/lcd/menu/menu_delta_calibrate.cpp @@ -119,7 +119,9 @@ void lcd_delta_settings() { } void menu_delta_calibrate() { - TERN_(DELTA_CALIBRATION_MENU, const bool all_homed = all_axes_homed()); // Acquire ahead of loop + #if ENABLED(DELTA_CALIBRATION_MENU) + const bool all_homed = all_axes_homed(); // Acquire ahead of loop + #endif START_MENU(); BACK_ITEM(MSG_MAIN); diff --git a/Marlin/src/lcd/menu/menu_probe_offset.cpp b/Marlin/src/lcd/menu/menu_probe_offset.cpp index 3b3fa0fd2a..1d62ada327 100644 --- a/Marlin/src/lcd/menu/menu_probe_offset.cpp +++ b/Marlin/src/lcd/menu/menu_probe_offset.cpp @@ -42,7 +42,9 @@ // Global storage float z_offset_backup, calculated_z_offset, z_offset_ref; -TERN_(HAS_LEVELING, bool leveling_was_active); +#if ENABLED(HAS_LEVELING) + bool leveling_was_active; +#endif inline void z_clearance_move() { do_z_clearance( diff --git a/Marlin/src/libs/nozzle.cpp b/Marlin/src/libs/nozzle.cpp index 4277e8d8d0..c56f45c70b 100644 --- a/Marlin/src/libs/nozzle.cpp +++ b/Marlin/src/libs/nozzle.cpp @@ -46,7 +46,9 @@ Nozzle nozzle; * @param strokes number of strokes to execute */ void Nozzle::stroke(const xyz_pos_t &start, const xyz_pos_t &end, const uint8_t &strokes) { - TERN_(NOZZLE_CLEAN_GOBACK, const xyz_pos_t oldpos = current_position); + #if ENABLED(NOZZLE_CLEAN_GOBACK) + const xyz_pos_t oldpos = current_position; + #endif // Move to the starting point #if ENABLED(NOZZLE_CLEAN_NO_Z) @@ -86,7 +88,9 @@ Nozzle nozzle; const xy_pos_t diff = end - start; if (!diff.x || !diff.y) return; - TERN_(NOZZLE_CLEAN_GOBACK, const xyz_pos_t back = current_position); + #if ENABLED(NOZZLE_CLEAN_GOBACK) + const xyz_pos_t back = current_position; + #endif #if ENABLED(NOZZLE_CLEAN_NO_Z) do_blocking_move_to_xy(start); @@ -129,7 +133,9 @@ Nozzle nozzle; void Nozzle::circle(const xyz_pos_t &start, const xyz_pos_t &middle, const uint8_t &strokes, const float &radius) { if (strokes == 0) return; - TERN_(NOZZLE_CLEAN_GOBACK, const xyz_pos_t back = current_position); + #if ENABLED(NOZZLE_CLEAN_GOBACK) + const xyz_pos_t back = current_position; + #endif TERN(NOZZLE_CLEAN_NO_Z, do_blocking_move_to_xy, do_blocking_move_to)(start); LOOP_L_N(s, strokes) diff --git a/Marlin/src/module/endstops.h b/Marlin/src/module/endstops.h index c0cc9cdb8e..13e814aa1f 100644 --- a/Marlin/src/module/endstops.h +++ b/Marlin/src/module/endstops.h @@ -46,9 +46,15 @@ class Endstops { public: #if HAS_EXTRA_ENDSTOPS typedef uint16_t esbits_t; - TERN_(X_DUAL_ENDSTOPS, static float x2_endstop_adj); - TERN_(Y_DUAL_ENDSTOPS, static float y2_endstop_adj); - TERN_(Z_MULTI_ENDSTOPS, static float z2_endstop_adj); + #if ENABLED(X_DUAL_ENDSTOPS) + static float x2_endstop_adj; + #endif + #if ENABLED(Y_DUAL_ENDSTOPS) + static float y2_endstop_adj; + #endif + #if ENABLED(Z_MULTI_ENDSTOPS) + static float z2_endstop_adj; + #endif #if ENABLED(Z_MULTI_ENDSTOPS) && NUM_Z_STEPPER_DRIVERS >= 3 static float z3_endstop_adj; #endif diff --git a/Marlin/src/module/planner.cpp b/Marlin/src/module/planner.cpp index 8c320925be..84c93e5296 100644 --- a/Marlin/src/module/planner.cpp +++ b/Marlin/src/module/planner.cpp @@ -2019,9 +2019,7 @@ bool Planner::_populate_block(block_t * const block, bool split_move, // Bail if this is a zero-length block if (block->step_event_count < MIN_STEPS_PER_SEGMENT) return false; - #if ENABLED(MIXING_EXTRUDER) - MIXER_POPULATE_BLOCK(); - #endif + TERN_(MIXING_EXTRUDER, mixer.populate_block(block->b_color)) TERN_(HAS_CUTTER, block->cutter_power = cutter.power); diff --git a/Marlin/src/module/planner.h b/Marlin/src/module/planner.h index 769967d4a6..24c814e851 100644 --- a/Marlin/src/module/planner.h +++ b/Marlin/src/module/planner.h @@ -170,7 +170,9 @@ typedef struct block_t { static constexpr uint8_t extruder = 0; #endif - TERN_(MIXING_EXTRUDER, MIXER_BLOCK_FIELD); // Normalized color for the mixing steppers + #if ENABLED(MIXING_EXTRUDER) + mixer_comp_t b_color[MIXING_STEPPERS]; // Normalized color for the mixing steppers + #endif // Settings for the trapezoid generator uint32_t accelerate_until, // The index of the step event on which to stop acceleration diff --git a/Marlin/src/module/servo.cpp b/Marlin/src/module/servo.cpp index 27e5a2af2e..9b71dd390f 100644 --- a/Marlin/src/module/servo.cpp +++ b/Marlin/src/module/servo.cpp @@ -32,7 +32,9 @@ HAL_SERVO_LIB servo[NUM_SERVOS]; -TERN_(EDITABLE_SERVO_ANGLES, uint16_t servo_angles[NUM_SERVOS][2]); +#if ENABLED(EDITABLE_SERVO_ANGLES) + uint16_t servo_angles[NUM_SERVOS][2]; +#endif void servo_init() { #if NUM_SERVOS >= 1 && HAS_SERVO_0 diff --git a/Marlin/src/module/stepper.cpp b/Marlin/src/module/stepper.cpp index 466f4f333a..77fa6539bc 100644 --- a/Marlin/src/module/stepper.cpp +++ b/Marlin/src/module/stepper.cpp @@ -2130,9 +2130,7 @@ uint32_t Stepper::block_phase_isr() { accelerate_until = current_block->accelerate_until << oversampling; decelerate_after = current_block->decelerate_after << oversampling; - #if ENABLED(MIXING_EXTRUDER) - MIXER_STEPPER_SETUP(); - #endif + TERN_(MIXING_EXTRUDER, mixer.stepper_setup(current_block->b_color)) TERN_(HAS_MULTI_EXTRUDER, stepper_extruder = current_block->extruder); diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index c9e3575257..8092f1f7e2 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -326,14 +326,28 @@ class Temperature { static const celsius_t hotend_maxtemp[HOTENDS]; FORCE_INLINE static celsius_t hotend_max_target(const uint8_t e) { return hotend_maxtemp[e] - (HOTEND_OVERSHOOT); } #endif - TERN_(HAS_HEATED_BED, static bed_info_t temp_bed); - TERN_(HAS_TEMP_PROBE, static probe_info_t temp_probe); - TERN_(HAS_TEMP_CHAMBER, static chamber_info_t temp_chamber); - TERN_(HAS_TEMP_COOLER, static cooler_info_t temp_cooler); + #if ENABLED(HAS_HEATED_BED) + static bed_info_t temp_bed; + #endif + #if ENABLED(HAS_TEMP_PROBE) + static probe_info_t temp_probe; + #endif + #if ENABLED(HAS_TEMP_CHAMBER) + static chamber_info_t temp_chamber; + #endif + #if ENABLED(HAS_TEMP_COOLER) + static cooler_info_t temp_cooler; + #endif - TERN_(AUTO_POWER_E_FANS, static uint8_t autofan_speed[HOTENDS]); - TERN_(AUTO_POWER_CHAMBER_FAN, static uint8_t chamberfan_speed); - TERN_(AUTO_POWER_COOLER_FAN, static uint8_t coolerfan_speed); + #if ENABLED(AUTO_POWER_E_FANS) + static uint8_t autofan_speed[HOTENDS]; + #endif + #if ENABLED(AUTO_POWER_CHAMBER_FAN) + static uint8_t chamberfan_speed; + #endif + #if ENABLED(AUTO_POWER_COOLER_FAN) + static uint8_t coolerfan_speed; + #endif #if ENABLED(FAN_SOFT_PWM) static uint8_t soft_pwm_amount_fan[FAN_COUNT], @@ -403,11 +417,15 @@ class Temperature { private: - TERN_(EARLY_WATCHDOG, static bool inited); // If temperature controller is running + #if ENABLED(EARLY_WATCHDOG) + static bool inited; // If temperature controller is running + #endif static volatile bool raw_temps_ready; - TERN_(WATCH_HOTENDS, static hotend_watch_t watch_hotend[HOTENDS]); + #if ENABLED(WATCH_HOTENDS) + static hotend_watch_t watch_hotend[HOTENDS]; + #endif #if ENABLED(TEMP_SENSOR_1_AS_REDUNDANT) static uint16_t redundant_temperature_raw; @@ -419,22 +437,30 @@ class Temperature { static lpq_ptr_t lpq_ptr; #endif - TERN_(HAS_HOTEND, static temp_range_t temp_range[HOTENDS]); + #if ENABLED(HAS_HOTEND) + static temp_range_t temp_range[HOTENDS]; + #endif #if HAS_HEATED_BED - TERN_(WATCH_BED, static bed_watch_t watch_bed); + #if ENABLED(WATCH_BED) + static bed_watch_t watch_bed; + #endif IF_DISABLED(PIDTEMPBED, static millis_t next_bed_check_ms); static int16_t mintemp_raw_BED, maxtemp_raw_BED; #endif #if HAS_HEATED_CHAMBER - TERN_(WATCH_CHAMBER, static chamber_watch_t watch_chamber); + #if ENABLED(WATCH_CHAMBER) + static chamber_watch_t watch_chamber; + #endif TERN(PIDTEMPCHAMBER,,static millis_t next_chamber_check_ms); static int16_t mintemp_raw_CHAMBER, maxtemp_raw_CHAMBER; #endif #if HAS_COOLER - TERN_(WATCH_COOLER, static cooler_watch_t watch_cooler); + #if ENABLED(WATCH_COOLER) + static cooler_watch_t watch_cooler; + #endif static millis_t next_cooler_check_ms, cooler_fan_flush_ms; static int16_t mintemp_raw_COOLER, maxtemp_raw_COOLER; #endif @@ -447,9 +473,13 @@ class Temperature { static millis_t preheat_end_time[HOTENDS]; #endif - TERN_(HAS_AUTO_FAN, static millis_t next_auto_fan_check_ms); + #if ENABLED(HAS_AUTO_FAN) + static millis_t next_auto_fan_check_ms; + #endif - TERN_(PROBING_HEATERS_OFF, static bool paused); + #if ENABLED(PROBING_HEATERS_OFF) + static bool paused; + #endif public: #if HAS_ADC_BUTTONS @@ -457,7 +487,9 @@ class Temperature { static uint16_t ADCKey_count; #endif - TERN_(PID_EXTRUSION_SCALING, static int16_t lpq_len); + #if ENABLED(PID_EXTRUSION_SCALING) + static int16_t lpq_len; + #endif /** * Instance Methods @@ -534,7 +566,9 @@ class Temperature { static constexpr inline uint8_t fanPercent(const uint8_t speed) { return ui8_to_percent(speed); } - TERN_(ADAPTIVE_FAN_SLOWING, static uint8_t fan_speed_scaler[FAN_COUNT]); + #if ENABLED(ADAPTIVE_FAN_SLOWING) + static uint8_t fan_speed_scaler[FAN_COUNT]; + #endif static inline uint8_t scaledFanSpeed(const uint8_t target, const uint8_t fs) { UNUSED(target); // Potentially unused! @@ -843,7 +877,9 @@ class Temperature { #endif #endif - TERN_(HAS_DISPLAY, static void set_heating_message(const uint8_t e)); + #if ENABLED(HAS_DISPLAY) + static void set_heating_message(const uint8_t e); + #endif #if HAS_LCD_MENU && HAS_TEMPERATURE static void lcd_preheat(const uint8_t e, const int8_t indh, const int8_t indb); @@ -866,9 +902,15 @@ class Temperature { static void checkExtruderAutoFans(); - TERN_(HAS_HOTEND, static float get_pid_output_hotend(const uint8_t e)); - TERN_(PIDTEMPBED, static float get_pid_output_bed()); - TERN_(PIDTEMPCHAMBER, static float get_pid_output_chamber()); + #if ENABLED(HAS_HOTEND) + static float get_pid_output_hotend(const uint8_t e); + #endif + #if ENABLED(PIDTEMPBED) + static float get_pid_output_bed(); + #endif + #if ENABLED(PIDTEMPCHAMBER) + static float get_pid_output_chamber(); + #endif static void _temp_error(const heater_id_t e, PGM_P const serial_msg, PGM_P const lcd_msg); static void min_temp_error(const heater_id_t e); diff --git a/Marlin/src/module/tool_change.h b/Marlin/src/module/tool_change.h index 5361451c82..a97b09fd89 100644 --- a/Marlin/src/module/tool_change.h +++ b/Marlin/src/module/tool_change.h @@ -109,9 +109,11 @@ #endif -TERN_(ELECTROMAGNETIC_SWITCHING_TOOLHEAD, void est_init()); - -TERN_(SWITCHING_TOOLHEAD, void swt_init()); +#if ENABLED(ELECTROMAGNETIC_SWITCHING_TOOLHEAD) + void est_init(); +#elif ENABLED(SWITCHING_TOOLHEAD) + void swt_init(); +#endif /** * Perform a tool-change, which may result in moving the diff --git a/Marlin/src/sd/cardreader.cpp b/Marlin/src/sd/cardreader.cpp index a3e0577031..53053e88dc 100644 --- a/Marlin/src/sd/cardreader.cpp +++ b/Marlin/src/sd/cardreader.cpp @@ -1084,7 +1084,9 @@ void CardReader::cdroot() { #if DISABLED(SDSORT_USES_RAM) selectFileByIndex(o1); // Pre-fetch the first entry and save it strcpy(name1, longest_filename()); // so the loop only needs one fetch - TERN_(HAS_FOLDER_SORTING, bool dir1 = flag.filenameIsDir); + #if ENABLED(HAS_FOLDER_SORTING) + bool dir1 = flag.filenameIsDir; + #endif #endif for (uint16_t j = 0; j < i; ++j) { From 3ced55aa930076c912bad5df2ec5b4376a0eaba9 Mon Sep 17 00:00:00 2001 From: Ramiro Polla Date: Wed, 24 Mar 2021 13:32:08 +0100 Subject: [PATCH 191/253] Optimize MarlinSettings with template methods (#21426) --- Marlin/src/module/settings.cpp | 23 ++++++------------ Marlin/src/module/settings.h | 44 +++++++++++++++++++++++++++++++--- 2 files changed, 48 insertions(+), 19 deletions(-) diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index bf10902c60..d98ee3c218 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -572,13 +572,6 @@ void MarlinSettings::postprocess() { #if ENABLED(EEPROM_SETTINGS) - #define EEPROM_START() if (!persistentStore.access_start()) { SERIAL_ECHO_MSG("No EEPROM."); return false; } \ - int eeprom_index = EEPROM_OFFSET - #define EEPROM_FINISH() persistentStore.access_finish() - #define EEPROM_SKIP(VAR) (eeprom_index += sizeof(VAR)) - #define EEPROM_WRITE(VAR) do{ persistentStore.write_data(eeprom_index, (uint8_t*)&VAR, sizeof(VAR), &working_crc); }while(0) - #define EEPROM_READ(VAR) do{ persistentStore.read_data(eeprom_index, (uint8_t*)&VAR, sizeof(VAR), &working_crc, !validating); }while(0) - #define EEPROM_READ_ALWAYS(VAR) do{ persistentStore.read_data(eeprom_index, (uint8_t*)&VAR, sizeof(VAR), &working_crc); }while(0) #define EEPROM_ASSERT(TST,ERR) do{ if (!(TST)) { SERIAL_ERROR_MSG(ERR); eeprom_error = true; } }while(0) #if ENABLED(DEBUG_EEPROM_READWRITE) @@ -594,6 +587,8 @@ void MarlinSettings::postprocess() { const char version[4] = EEPROM_VERSION; bool MarlinSettings::eeprom_error, MarlinSettings::validating; + int MarlinSettings::eeprom_index; + uint16_t MarlinSettings::working_crc; bool MarlinSettings::size_error(const uint16_t size) { if (size != datasize()) { @@ -610,9 +605,7 @@ void MarlinSettings::postprocess() { float dummyf = 0; char ver[4] = "ERR"; - uint16_t working_crc = 0; - - EEPROM_START(); + if (!EEPROM_START(EEPROM_OFFSET)) return false; eeprom_error = false; @@ -1456,9 +1449,7 @@ void MarlinSettings::postprocess() { * M501 - Retrieve Configuration */ bool MarlinSettings::_load() { - uint16_t working_crc = 0; - - EEPROM_START(); + if (!EEPROM_START(EEPROM_OFFSET)) return false; char stored_ver[4]; EEPROM_READ_ALWAYS(stored_ver); @@ -1496,10 +1487,10 @@ void MarlinSettings::postprocess() { uint32_t tmp1[XYZ + esteppers]; float tmp2[XYZ + esteppers]; feedRate_t tmp3[XYZ + esteppers]; - EEPROM_READ(tmp1); // max_acceleration_mm_per_s2 + EEPROM_READ((uint8_t *)tmp1, sizeof(tmp1)); // max_acceleration_mm_per_s2 EEPROM_READ(planner.settings.min_segment_time_us); - EEPROM_READ(tmp2); // axis_steps_per_mm - EEPROM_READ(tmp3); // max_feedrate_mm_s + EEPROM_READ((uint8_t *)tmp2, sizeof(tmp2)); // axis_steps_per_mm + EEPROM_READ((uint8_t *)tmp3, sizeof(tmp3)); // max_feedrate_mm_s if (!validating) LOOP_XYZE_N(i) { const bool in = (i < esteppers + XYZ); diff --git a/Marlin/src/module/settings.h b/Marlin/src/module/settings.h index b213de93a4..967d49c073 100644 --- a/Marlin/src/module/settings.h +++ b/Marlin/src/module/settings.h @@ -76,12 +76,15 @@ class MarlinSettings { //static void delete_mesh(); // necessary if we have a MAT //static void defrag_meshes(); // " #endif - #else + + #else // !EEPROM_SETTINGS + FORCE_INLINE static bool load() { reset(); report(); return true; } FORCE_INLINE static void first_load() { (void)load(); } - #endif + + #endif // !EEPROM_SETTINGS #if DISABLED(DISABLE_M503) static void report(const bool forReplay=false); @@ -105,7 +108,42 @@ class MarlinSettings { static bool _load(); static bool size_error(const uint16_t size); - #endif + + static int eeprom_index; + static uint16_t working_crc; + + static bool EEPROM_START(int eeprom_offset) { + if (!persistentStore.access_start()) { SERIAL_ECHO_MSG("No EEPROM."); return false; } + eeprom_index = eeprom_offset; + working_crc = 0; + return true; + } + + static void EEPROM_FINISH(void) { persistentStore.access_finish(); } + + template + static void EEPROM_SKIP(const T &VAR) { eeprom_index += sizeof(VAR); } + + template + static void EEPROM_WRITE(const T &VAR) { + persistentStore.write_data(eeprom_index, (const uint8_t *) &VAR, sizeof(VAR), &working_crc); + } + + template + static void EEPROM_READ(T &VAR) { + persistentStore.read_data(eeprom_index, (uint8_t *) &VAR, sizeof(VAR), &working_crc, !validating); + } + + static void EEPROM_READ(uint8_t *VAR, size_t sizeof_VAR) { + persistentStore.read_data(eeprom_index, VAR, sizeof_VAR, &working_crc, !validating); + } + + template + static void EEPROM_READ_ALWAYS(T &VAR) { + persistentStore.read_data(eeprom_index, (uint8_t *) &VAR, sizeof(VAR), &working_crc); + } + + #endif // EEPROM_SETTINGS }; extern MarlinSettings settings; From e7596d92c79134e342e2a3d5e6981fc562925231 Mon Sep 17 00:00:00 2001 From: Ramiro Polla Date: Wed, 24 Mar 2021 13:45:43 +0100 Subject: [PATCH 192/253] Update Anet V1.0 display timing (#21425) --- Marlin/src/pins/sanguino/pins_ANET_10.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/pins/sanguino/pins_ANET_10.h b/Marlin/src/pins/sanguino/pins_ANET_10.h index fb1b6dbb3c..ac8fa80eb8 100644 --- a/Marlin/src/pins/sanguino/pins_ANET_10.h +++ b/Marlin/src/pins/sanguino/pins_ANET_10.h @@ -191,7 +191,7 @@ #define BTN_EN1 11 #define BTN_EN2 10 #define BTN_ENC 16 - #define BOARD_ST7920_DELAY_1 DELAY_NS(0) + #define BOARD_ST7920_DELAY_1 DELAY_NS(125) #define BOARD_ST7920_DELAY_2 DELAY_NS(63) #define BOARD_ST7920_DELAY_3 DELAY_NS(125) #endif From fd8207dd9a1368c6bb75acd5fead76e6fbc0830f Mon Sep 17 00:00:00 2001 From: kpishere Date: Wed, 24 Mar 2021 10:14:11 -0400 Subject: [PATCH 193/253] Misc build fixes (#21413) Co-authored-by: Scott Lahteine --- Marlin/src/core/bug_on.h | 3 ++- Marlin/src/gcode/bedlevel/mbl/G29.cpp | 2 +- Marlin/src/pins/ramps/pins_RAMPS.h | 7 ++++--- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/Marlin/src/core/bug_on.h b/Marlin/src/core/bug_on.h index 8869be8d28..dc32f0385a 100644 --- a/Marlin/src/core/bug_on.h +++ b/Marlin/src/core/bug_on.h @@ -30,7 +30,8 @@ #define BUG_ON(V...) do { SERIAL_ECHOPAIR(ONLY_FILENAME, __LINE__, ": "); SERIAL_ECHOLNPAIR(V); SERIAL_FLUSHTX(); *(char*)0 = 42; } while(0) #elif ENABLED(MARLIN_DEV_MODE) // Don't stop the CPU here, but at least dump the bug on the serial port - #define BUG_ON(V...) do { SERIAL_ECHOPAIR(ONLY_FILENAME, __LINE__, ": BUG!\n"); SERIAL_ECHOLNPAIR(V); SERIAL_FLUSHTX(); } while(0) + //#define BUG_ON(V...) do { SERIAL_ECHOPAIR(ONLY_FILENAME, __LINE__, ": BUG!\n"); SERIAL_ECHOLNPAIR(V); SERIAL_FLUSHTX(); } while(0) + #define BUG_ON(V...) NOOP #else // Release mode, let's ignore the bug #define BUG_ON(V...) NOOP diff --git a/Marlin/src/gcode/bedlevel/mbl/G29.cpp b/Marlin/src/gcode/bedlevel/mbl/G29.cpp index c16338a692..c4c6eb1423 100644 --- a/Marlin/src/gcode/bedlevel/mbl/G29.cpp +++ b/Marlin/src/gcode/bedlevel/mbl/G29.cpp @@ -98,7 +98,7 @@ void GcodeSuite::G29() { // For each G29 S2... if (mbl_probe_index == 0) { // Move close to the bed before the first point - do_blocking_move_to_z(0); + do_blocking_move_to_z(MANUAL_PROBE_START_Z); } else { // Save Z for the previous mesh position diff --git a/Marlin/src/pins/ramps/pins_RAMPS.h b/Marlin/src/pins/ramps/pins_RAMPS.h index 805c92d71a..f30a235626 100644 --- a/Marlin/src/pins/ramps/pins_RAMPS.h +++ b/Marlin/src/pins/ramps/pins_RAMPS.h @@ -45,6 +45,10 @@ * 7 | 11 */ +#if ENABLED(AZSMZ_12864) && DISABLED(ALLOW_SAM3X8E) + #error "No pins defined for RAMPS with AZSMZ_12864." +#endif + #include "env_validate.h" // Custom flags and defines for the build @@ -720,9 +724,6 @@ #elif ENABLED(AZSMZ_12864) // Pins only defined for RAMPS_SMART currently - #if DISABLED(IS_RAMPS_SMART) - #error "No pins defined for RAMPS with AZSMZ_12864." - #endif #elif IS_TFTGLCD_PANEL From d172c71376d3adf199e8de90593a135e6f49e427 Mon Sep 17 00:00:00 2001 From: ldursw <37294448+ldursw@users.noreply.github.com> Date: Wed, 24 Mar 2021 11:30:19 -0300 Subject: [PATCH 194/253] Fix SDIO buffer alignment (#21396) --- Marlin/src/feature/binary_stream.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Marlin/src/feature/binary_stream.h b/Marlin/src/feature/binary_stream.h index 80f26cc7ce..4bfa3998f1 100644 --- a/Marlin/src/feature/binary_stream.h +++ b/Marlin/src/feature/binary_stream.h @@ -39,7 +39,12 @@ inline int bs_read_serial(const serial_index_t index) { #if ENABLED(BINARY_STREAM_COMPRESSION) static heatshrink_decoder hsd; - static uint8_t decode_buffer[512] = {}; + #ifdef BOTH(ARDUINO_ARCH_STM32F1, SDIO_SUPPORT) + // STM32 requires a word-aligned buffer for SD card transfers via DMA + static __attribute__((aligned(sizeof(size_t)))) uint8_t decode_buffer[512] = {}; + #else + static uint8_t decode_buffer[512] = {}; + #endif #endif class SDFileTransferProtocol { From 930752d46e6aacb484ea89dacae6baf823d78d62 Mon Sep 17 00:00:00 2001 From: Miguel Risco-Castillo Date: Wed, 24 Mar 2021 10:12:57 -0500 Subject: [PATCH 195/253] Ender 3 V2 Status Line (#21369) Co-authored-by: Scott Lahteine --- Marlin/src/MarlinCore.cpp | 3 +- Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp | 10 ++--- Marlin/src/feature/cancel_object.cpp | 2 +- Marlin/src/feature/pause.cpp | 2 +- Marlin/src/gcode/bedlevel/abl/G29.cpp | 8 ++-- Marlin/src/gcode/bedlevel/mbl/G29.cpp | 5 ++- Marlin/src/gcode/calibrate/G34_M422.cpp | 6 +-- Marlin/src/gcode/calibrate/M48.cpp | 4 +- Marlin/src/gcode/temp/M104_M109.cpp | 2 +- Marlin/src/inc/Conditionals_LCD.h | 2 +- Marlin/src/lcd/dwin/e3v2/dwin.cpp | 9 ++++- Marlin/src/lcd/dwin/e3v2/dwin.h | 1 + Marlin/src/lcd/language/language_en.h | 1 + Marlin/src/lcd/lcdprint.h | 1 - Marlin/src/lcd/marlinui.cpp | 41 ++++++++++++--------- Marlin/src/module/endstops.cpp | 4 +- Marlin/src/module/motion.cpp | 4 +- Marlin/src/module/temperature.cpp | 4 +- Marlin/src/module/temperature.h | 2 +- Marlin/src/module/tool_change.cpp | 2 +- 20 files changed, 66 insertions(+), 47 deletions(-) diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp index 26ca8305f4..738f9a8d78 100644 --- a/Marlin/src/MarlinCore.cpp +++ b/Marlin/src/MarlinCore.cpp @@ -76,7 +76,6 @@ #if ENABLED(DWIN_CREALITY_LCD) #include "lcd/dwin/e3v2/dwin.h" - #include "lcd/dwin/dwin_lcd.h" #include "lcd/dwin/e3v2/rotary_encoder.h" #endif @@ -1476,7 +1475,9 @@ void setup() { #if ENABLED(DWIN_CREALITY_LCD) Encoder_Configuration(); HMI_Init(); + DWIN_JPG_CacheTo1(Language_English); HMI_StartFrame(true); + DWIN_StatusChanged(GET_TEXT(WELCOME_MSG)); #endif #if HAS_SERVICE_INTERVALS && DISABLED(DWIN_CREALITY_LCD) diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp index 06b91002b8..c1f824714c 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp @@ -733,7 +733,7 @@ void unified_bed_leveling::shift_mesh_height() { const int point_num = (GRID_MAX_POINTS) - count + 1; SERIAL_ECHOLNPAIR("Probing mesh point ", point_num, "/", GRID_MAX_POINTS, "."); - TERN_(HAS_DISPLAY, ui.status_printf_P(0, PSTR(S_FMT " %i/%i"), GET_TEXT(MSG_PROBING_MESH), point_num, int(GRID_MAX_POINTS))); + TERN_(HAS_STATUS_MESSAGE, ui.status_printf_P(0, PSTR(S_FMT " %i/%i"), GET_TEXT(MSG_PROBING_MESH), point_num, int(GRID_MAX_POINTS))); #if HAS_LCD_MENU if (ui.button_pressed()) { @@ -1440,7 +1440,7 @@ void unified_bed_leveling::smart_fill_mesh() { if (do_3_pt_leveling) { SERIAL_ECHOLNPGM("Tilting mesh (1/3)"); - TERN_(HAS_DISPLAY, ui.status_printf_P(0, PSTR(S_FMT " 1/3"), GET_TEXT(MSG_LCD_TILTING_MESH))); + TERN_(HAS_STATUS_MESSAGE, ui.status_printf_P(0, PSTR(S_FMT " 1/3"), GET_TEXT(MSG_LCD_TILTING_MESH))); measured_z = probe.probe_at_point(points[0], PROBE_PT_RAISE, param.V_verbosity); if (isnan(measured_z)) @@ -1459,7 +1459,7 @@ void unified_bed_leveling::smart_fill_mesh() { if (!abort_flag) { SERIAL_ECHOLNPGM("Tilting mesh (2/3)"); - TERN_(HAS_DISPLAY, ui.status_printf_P(0, PSTR(S_FMT " 2/3"), GET_TEXT(MSG_LCD_TILTING_MESH))); + TERN_(HAS_STATUS_MESSAGE, ui.status_printf_P(0, PSTR(S_FMT " 2/3"), GET_TEXT(MSG_LCD_TILTING_MESH))); measured_z = probe.probe_at_point(points[1], PROBE_PT_RAISE, param.V_verbosity); #ifdef VALIDATE_MESH_TILT @@ -1479,7 +1479,7 @@ void unified_bed_leveling::smart_fill_mesh() { if (!abort_flag) { SERIAL_ECHOLNPGM("Tilting mesh (3/3)"); - TERN_(HAS_DISPLAY, ui.status_printf_P(0, PSTR(S_FMT " 3/3"), GET_TEXT(MSG_LCD_TILTING_MESH))); + TERN_(HAS_STATUS_MESSAGE, ui.status_printf_P(0, PSTR(S_FMT " 3/3"), GET_TEXT(MSG_LCD_TILTING_MESH))); measured_z = probe.probe_at_point(points[2], PROBE_PT_STOW, param.V_verbosity); #ifdef VALIDATE_MESH_TILT @@ -1520,7 +1520,7 @@ void unified_bed_leveling::smart_fill_mesh() { if (!abort_flag) { SERIAL_ECHOLNPAIR("Tilting mesh point ", point_num, "/", total_points, "\n"); - TERN_(HAS_DISPLAY, ui.status_printf_P(0, PSTR(S_FMT " %i/%i"), GET_TEXT(MSG_LCD_TILTING_MESH), point_num, total_points)); + TERN_(HAS_STATUS_MESSAGE, ui.status_printf_P(0, PSTR(S_FMT " %i/%i"), GET_TEXT(MSG_LCD_TILTING_MESH), point_num, total_points)); measured_z = probe.probe_at_point(rpos, parser.seen('E') ? PROBE_PT_STOW : PROBE_PT_RAISE, param.V_verbosity); // TODO: Needs error handling diff --git a/Marlin/src/feature/cancel_object.cpp b/Marlin/src/feature/cancel_object.cpp index e2e429ea10..1f92ac5843 100644 --- a/Marlin/src/feature/cancel_object.cpp +++ b/Marlin/src/feature/cancel_object.cpp @@ -43,7 +43,7 @@ void CancelObject::set_active_object(const int8_t obj) { else skipping = false; - #if HAS_DISPLAY + #if HAS_STATUS_MESSAGE if (active_object >= 0) ui.status_printf_P(0, PSTR(S_FMT " %i"), GET_TEXT(MSG_PRINTING_OBJECT), int(active_object)); else diff --git a/Marlin/src/feature/pause.cpp b/Marlin/src/feature/pause.cpp index 5f3338139a..a934b0ead0 100644 --- a/Marlin/src/feature/pause.cpp +++ b/Marlin/src/feature/pause.cpp @@ -652,7 +652,7 @@ void resume_print(const float &slow_load_length/*=0*/, const float &fast_load_le // Resume the print job timer if it was running if (print_job_timer.isPaused()) print_job_timer.start(); - TERN_(HAS_DISPLAY, ui.reset_status()); + TERN_(HAS_STATUS_MESSAGE, ui.reset_status()); TERN_(HAS_LCD_MENU, ui.return_to_status()); } diff --git a/Marlin/src/gcode/bedlevel/abl/G29.cpp b/Marlin/src/gcode/bedlevel/abl/G29.cpp index e642c1ccf2..a746b86108 100644 --- a/Marlin/src/gcode/bedlevel/abl/G29.cpp +++ b/Marlin/src/gcode/bedlevel/abl/G29.cpp @@ -41,7 +41,7 @@ #include "../../../module/temperature.h" #endif -#if HAS_DISPLAY +#if HAS_STATUS_MESSAGE #include "../../../lcd/marlinui.h" #endif @@ -638,7 +638,7 @@ G29_TYPE GcodeSuite::G29() { if (TERN0(IS_KINEMATIC, !probe.can_reach(probePos))) continue; if (verbose_level) SERIAL_ECHOLNPAIR("Probing mesh point ", pt_index, "/", abl_points, "."); - TERN_(HAS_DISPLAY, ui.status_printf_P(0, PSTR(S_FMT " %i/%i"), GET_TEXT(MSG_PROBING_MESH), int(pt_index), int(abl_points))); + TERN_(HAS_STATUS_MESSAGE, ui.status_printf_P(0, PSTR(S_FMT " %i/%i"), GET_TEXT(MSG_PROBING_MESH), int(pt_index), int(abl_points))); measured_z = faux ? 0.001f * random(-100, 101) : probe.probe_at_point(probePos, raise_after, verbose_level); @@ -683,7 +683,7 @@ G29_TYPE GcodeSuite::G29() { LOOP_L_N(i, 3) { if (verbose_level) SERIAL_ECHOLNPAIR("Probing point ", i + 1, "/3."); - TERN_(HAS_DISPLAY, ui.status_printf_P(0, PSTR(S_FMT " %i/3"), GET_TEXT(MSG_PROBING_MESH), int(i + 1))); + TERN_(HAS_STATUS_MESSAGE, ui.status_printf_P(0, PSTR(S_FMT " %i/3"), GET_TEXT(MSG_PROBING_MESH), int(i + 1))); // Retain the last probe position probePos = points[i]; @@ -706,7 +706,7 @@ G29_TYPE GcodeSuite::G29() { #endif // AUTO_BED_LEVELING_3POINT - TERN_(HAS_DISPLAY, ui.reset_status()); + TERN_(HAS_STATUS_MESSAGE, ui.reset_status()); // Stow the probe. No raise for FIX_MOUNTED_PROBE. if (probe.stow()) { diff --git a/Marlin/src/gcode/bedlevel/mbl/G29.cpp b/Marlin/src/gcode/bedlevel/mbl/G29.cpp index c4c6eb1423..278a39b4f8 100644 --- a/Marlin/src/gcode/bedlevel/mbl/G29.cpp +++ b/Marlin/src/gcode/bedlevel/mbl/G29.cpp @@ -122,6 +122,7 @@ void GcodeSuite::G29() { // After recording the last point, activate home and activate mbl_probe_index = -1; SERIAL_ECHOLNPGM("Mesh probing done."); + TERN_(HAS_STATUS_MESSAGE, ui.set_status(GET_TEXT(MSG_MESH_DONE))); BUZZ(100, 659); BUZZ(100, 698); @@ -180,8 +181,10 @@ void GcodeSuite::G29() { } // switch(state) - if (state == MeshNext) + if (state == MeshNext) { SERIAL_ECHOLNPAIR("MBL G29 point ", _MIN(mbl_probe_index, GRID_MAX_POINTS), " of ", GRID_MAX_POINTS); + if (mbl_probe_index > 0) TERN_(HAS_STATUS_MESSAGE, ui.status_printf_P(0, PSTR(S_FMT " %i/%i"), GET_TEXT(MSG_PROBING_MESH), _MIN(mbl_probe_index, GRID_MAX_POINTS), int(GRID_MAX_POINTS))); + } report_current_position(); } diff --git a/Marlin/src/gcode/calibrate/G34_M422.cpp b/Marlin/src/gcode/calibrate/G34_M422.cpp index d2075fedce..a97283b3e7 100644 --- a/Marlin/src/gcode/calibrate/G34_M422.cpp +++ b/Marlin/src/gcode/calibrate/G34_M422.cpp @@ -190,7 +190,7 @@ void GcodeSuite::G34() { bool adjustment_reverse = false; #endif - #if HAS_DISPLAY + #if HAS_STATUS_MESSAGE PGM_P const msg_iteration = GET_TEXT(MSG_ITERATION); const uint8_t iter_str_len = strlen_P(msg_iteration); #endif @@ -204,7 +204,7 @@ void GcodeSuite::G34() { const int iter = iteration + 1; SERIAL_ECHOLNPAIR("\nG34 Iteration: ", iter); - #if HAS_DISPLAY + #if HAS_STATUS_MESSAGE char str[iter_str_len + 2 + 1]; sprintf_P(str, msg_iteration, iter); ui.set_status(str); @@ -290,7 +290,7 @@ void GcodeSuite::G34() { , " Z3-Z1=", ABS(z_measured[2] - z_measured[0]) #endif ); - #if HAS_DISPLAY + #if HAS_STATUS_MESSAGE char fstr1[10]; #if NUM_Z_STEPPER_DRIVERS == 2 char msg[6 + (6 + 5) * 1 + 1]; diff --git a/Marlin/src/gcode/calibrate/M48.cpp b/Marlin/src/gcode/calibrate/M48.cpp index 0c6176173c..0c3da13bf9 100644 --- a/Marlin/src/gcode/calibrate/M48.cpp +++ b/Marlin/src/gcode/calibrate/M48.cpp @@ -142,7 +142,7 @@ void GcodeSuite::M48() { float sample_sum = 0.0; LOOP_L_N(n, n_samples) { - #if HAS_WIRED_LCD + #if HAS_STATUS_MESSAGE // Display M48 progress in the status bar ui.status_printf_P(0, PSTR(S_FMT ": %d/%d"), GET_TEXT(MSG_M48_POINT), int(n + 1), int(n_samples)); #endif @@ -257,7 +257,7 @@ void GcodeSuite::M48() { SERIAL_ECHOLNPGM("Finished!"); dev_report(verbose_level > 0, mean, sigma, min, max, true); - #if HAS_WIRED_LCD + #if HAS_STATUS_MESSAGE // Display M48 results in the status bar char sigma_str[8]; ui.status_printf_P(0, PSTR(S_FMT ": %s"), GET_TEXT(MSG_M48_DEVIATION), dtostrf(sigma, 2, 6, sigma_str)); diff --git a/Marlin/src/gcode/temp/M104_M109.cpp b/Marlin/src/gcode/temp/M104_M109.cpp index fe1e834656..e54f784153 100644 --- a/Marlin/src/gcode/temp/M104_M109.cpp +++ b/Marlin/src/gcode/temp/M104_M109.cpp @@ -185,7 +185,7 @@ void GcodeSuite::M109() { thermalManager.auto_job_check_timer(true, true); #endif - #if HAS_DISPLAY + #if HAS_STATUS_MESSAGE if (thermalManager.isHeatingHotend(target_extruder) || !no_wait_for_cooling) thermalManager.set_heating_message(target_extruder); #endif diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index fc83a1ff87..af902481f3 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -481,7 +481,7 @@ #endif #endif -#if EITHER(HAS_DISPLAY, GLOBAL_STATUS_MESSAGE) +#if ANY(HAS_DISPLAY, DWIN_CREALITY_LCD, GLOBAL_STATUS_MESSAGE) #define HAS_STATUS_MESSAGE 1 #endif diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.cpp b/Marlin/src/lcd/dwin/e3v2/dwin.cpp index d543ff0508..87ad93cf1d 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.cpp +++ b/Marlin/src/lcd/dwin/e3v2/dwin.cpp @@ -402,7 +402,7 @@ void Draw_Title(const __FlashStringHelper * title) { } void Clear_Menu_Area() { - DWIN_Draw_Rectangle(1, Color_Bg_Black, 0, 31, DWIN_WIDTH, STATUS_Y); + DWIN_Draw_Rectangle(1, Color_Bg_Black, 0, 31, DWIN_WIDTH, STATUS_Y - 1); } void Clear_Main_Window() { @@ -3794,4 +3794,11 @@ void DWIN_CompletedLeveling() { if (checkkey == Leveling) Goto_MainMenu(); } +void DWIN_StatusChanged(const char *text) { + DWIN_Draw_Rectangle(1, Color_Bg_Blue, 0, STATUS_Y, DWIN_WIDTH, STATUS_Y + 20); + const int8_t x = _MAX(0U, DWIN_WIDTH - strlen_P(text) * MENU_CHR_W) / 2; + DWIN_Draw_String(false, false, font8x16, Color_White, Color_Bg_Blue, x, STATUS_Y + 2, F(text)); + DWIN_UpdateLCD(); +} + #endif // DWIN_CREALITY_LCD diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.h b/Marlin/src/lcd/dwin/e3v2/dwin.h index dd2d1cbc01..7f7c007eed 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.h +++ b/Marlin/src/lcd/dwin/e3v2/dwin.h @@ -377,6 +377,7 @@ void HMI_Init(); void DWIN_Update(); void EachMomentUpdate(); void DWIN_HandleScreen(); +void DWIN_StatusChanged(const char *text); inline void DWIN_StartHoming() { HMI_flag.home_flag = true; } diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index a37f5aa790..78d446dd99 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -522,6 +522,7 @@ namespace Language_en { PROGMEM Language_Str MSG_BILINEAR_LEVELING = _UxGT("Bilinear Leveling"); PROGMEM Language_Str MSG_UBL_LEVELING = _UxGT("Unified Bed Leveling"); PROGMEM Language_Str MSG_MESH_LEVELING = _UxGT("Mesh Leveling"); + PROGMEM Language_Str MSG_MESH_DONE = _UxGT("Mesh probing done"); PROGMEM Language_Str MSG_INFO_STATS_MENU = _UxGT("Printer Stats"); PROGMEM Language_Str MSG_INFO_BOARD_MENU = _UxGT("Board Info"); PROGMEM Language_Str MSG_INFO_THERMISTOR_MENU = _UxGT("Thermistors"); diff --git a/Marlin/src/lcd/lcdprint.h b/Marlin/src/lcd/lcdprint.h index b7732d3198..90ffa14ad1 100644 --- a/Marlin/src/lcd/lcdprint.h +++ b/Marlin/src/lcd/lcdprint.h @@ -105,7 +105,6 @@ #define SETCURSOR_RJ(len, row) lcd_moveto(LCD_COL_X_RJ(len), LCD_ROW_Y(row)) #define SETCURSOR_X(col) SETCURSOR(col, _lcdLineNr) #define SETCURSOR_X_RJ(len) SETCURSOR_RJ(len, _lcdLineNr) -#define START_OF_UTF8_CHAR(C) (((C) & 0xC0u) != 0x80U) int lcd_glyph_height(); diff --git a/Marlin/src/lcd/marlinui.cpp b/Marlin/src/lcd/marlinui.cpp index 0be30efad8..4133e04832 100644 --- a/Marlin/src/lcd/marlinui.cpp +++ b/Marlin/src/lcd/marlinui.cpp @@ -44,9 +44,16 @@ MarlinUI ui; #include "../gcode/queue.h" #include "fontutils.h" #include "../sd/cardreader.h" - #if EITHER(EXTENSIBLE_UI, DWIN_CREALITY_LCD) - #define START_OF_UTF8_CHAR(C) (((C) & 0xC0u) != 0x80U) - #endif +#endif + +#if ENABLED(DWIN_CREALITY_LCD) + #include "../module/printcounter.h" + #include "../MarlinCore.h" + #include "dwin/e3v2/dwin.h" +#endif + +#if HAS_STATUS_MESSAGE + #define START_OF_UTF8_CHAR(C) (((C) & 0xC0u) != 0x80U) #endif #if LCD_HAS_WAIT_FOR_MOVE @@ -55,25 +62,24 @@ MarlinUI ui; constexpr uint8_t epps = ENCODER_PULSES_PER_STEP; -#if HAS_WIRED_LCD - #if ENABLED(STATUS_MESSAGE_SCROLLING) - uint8_t MarlinUI::status_scroll_offset; // = 0 - constexpr uint8_t MAX_MESSAGE_LENGTH = _MAX(LONG_FILENAME_LENGTH, MAX_LANG_CHARSIZE * 2 * (LCD_WIDTH)); +#if HAS_STATUS_MESSAGE + #if HAS_WIRED_LCD + #if ENABLED(STATUS_MESSAGE_SCROLLING) + uint8_t MarlinUI::status_scroll_offset; // = 0 + constexpr uint8_t MAX_MESSAGE_LENGTH = _MAX(LONG_FILENAME_LENGTH, MAX_LANG_CHARSIZE * 2 * (LCD_WIDTH)); + #else + constexpr uint8_t MAX_MESSAGE_LENGTH = MAX_LANG_CHARSIZE * (LCD_WIDTH); + #endif #else - constexpr uint8_t MAX_MESSAGE_LENGTH = MAX_LANG_CHARSIZE * (LCD_WIDTH); + constexpr uint8_t MAX_MESSAGE_LENGTH = 63; #endif -#elif EITHER(EXTENSIBLE_UI, DWIN_CREALITY_LCD) - constexpr uint8_t MAX_MESSAGE_LENGTH = 63; -#endif - -#if EITHER(HAS_WIRED_LCD, EXTENSIBLE_UI) - uint8_t MarlinUI::alert_level; // = 0 char MarlinUI::status_message[MAX_MESSAGE_LENGTH + 1]; + uint8_t MarlinUI::alert_level; // = 0 #endif #if ENABLED(LCD_SET_PROGRESS_MANUALLY) MarlinUI::progress_t MarlinUI::progress_override; // = 0 - #if BOTH(LCD_SET_PROGRESS_MANUALLY, USE_M73_REMAINING_TIME) + #if ENABLED(USE_M73_REMAINING_TIME) uint32_t MarlinUI::remaining_time; #endif #endif @@ -1461,6 +1467,7 @@ void MarlinUI::update() { #endif TERN_(EXTENSIBLE_UI, ExtUI::onStatusChanged(status_message)); + TERN_(DWIN_CREALITY_LCD, DWIN_StatusChanged(status_message)); } #if ENABLED(STATUS_MESSAGE_SCROLLING) @@ -1581,7 +1588,7 @@ void MarlinUI::update() { #endif -#else // !HAS_DISPLAY +#elif !HAS_STATUS_MESSAGE // && !HAS_DISPLAY // // Send the status line as a host notification @@ -1596,7 +1603,7 @@ void MarlinUI::update() { TERN(HOST_PROMPT_SUPPORT, host_action_notify_P(message), UNUSED(message)); } -#endif // !HAS_DISPLAY +#endif // !HAS_DISPLAY && !HAS_STATUS_MESSAGE #if ENABLED(SDSUPPORT) diff --git a/Marlin/src/module/endstops.cpp b/Marlin/src/module/endstops.cpp index 4192b444bb..e11c4605e4 100644 --- a/Marlin/src/module/endstops.cpp +++ b/Marlin/src/module/endstops.cpp @@ -360,7 +360,7 @@ void Endstops::event_handler() { if (hit_state == prev_hit_state) return; prev_hit_state = hit_state; if (hit_state) { - #if HAS_WIRED_LCD + #if HAS_STATUS_MESSAGE char chrX = ' ', chrY = ' ', chrZ = ' ', chrP = ' '; #define _SET_STOP_CHAR(A,C) (chr## A = C) #else @@ -391,7 +391,7 @@ void Endstops::event_handler() { #endif SERIAL_EOL(); - TERN_(HAS_WIRED_LCD, ui.status_printf_P(0, PSTR(S_FMT " %c %c %c %c"), GET_TEXT(MSG_LCD_ENDSTOPS), chrX, chrY, chrZ, chrP)); + TERN_(HAS_STATUS_MESSAGE, ui.status_printf_P(0, PSTR(S_FMT " %c %c %c %c"), GET_TEXT(MSG_LCD_ENDSTOPS), chrX, chrY, chrZ, chrP)); #if BOTH(SD_ABORT_ON_ENDSTOP_HIT, SDSUPPORT) if (planner.abort_on_endstop_hit) { diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index b0a4890e07..28ad9cf761 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -51,7 +51,7 @@ #include "../feature/bltouch.h" #endif -#if HAS_DISPLAY +#if HAS_STATUS_MESSAGE #include "../lcd/marlinui.h" #endif @@ -1144,7 +1144,7 @@ void prepare_line_to_destination() { ); SERIAL_ECHO_START(); SERIAL_ECHOLN(msg); - TERN_(HAS_DISPLAY, ui.set_status(msg)); + TERN_(HAS_STATUS_MESSAGE, ui.set_status(msg)); return true; } return false; diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 6d1f3bd0a3..da792db833 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -2495,7 +2495,7 @@ void Temperature::disable_all_heaters() { if (singlenozzle_temp[new_tool] && singlenozzle_temp[new_tool] != singlenozzle_temp[old_tool]) { setTargetHotend(singlenozzle_temp[new_tool], 0); TERN_(AUTOTEMP, planner.autotemp_update()); - TERN_(HAS_DISPLAY, set_heating_message(0)); + TERN_(HAS_STATUS_MESSAGE, set_heating_message(0)); (void)wait_for_hotend(0, false); // Wait for heating or cooling } } @@ -3492,7 +3492,7 @@ void Temperature::tick() { } #endif - #if HAS_HOTEND && HAS_DISPLAY + #if HAS_HOTEND && HAS_STATUS_MESSAGE void Temperature::set_heating_message(const uint8_t e) { const bool heating = isHeatingHotend(e); ui.status_printf_P(0, diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index 8092f1f7e2..ec603b5217 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -877,7 +877,7 @@ class Temperature { #endif #endif - #if ENABLED(HAS_DISPLAY) + #if HAS_STATUS_MESSAGE static void set_heating_message(const uint8_t e); #endif diff --git a/Marlin/src/module/tool_change.cpp b/Marlin/src/module/tool_change.cpp index 0ed3d15b45..71dd6d40ec 100644 --- a/Marlin/src/module/tool_change.cpp +++ b/Marlin/src/module/tool_change.cpp @@ -1262,7 +1262,7 @@ void tool_change(const uint8_t new_tool, bool no_move/*=false*/) { #if HAS_MULTI_HOTEND thermalManager.setTargetHotend(thermalManager.temp_hotend[active_extruder].target, migration_extruder); TERN_(AUTOTEMP, planner.autotemp_update()); - TERN_(HAS_DISPLAY, thermalManager.set_heating_message(0)); + TERN_(HAS_STATUS_MESSAGE, thermalManager.set_heating_message(0)); thermalManager.wait_for_hotend(active_extruder); #endif From 3ae892bf91566abcda3b3d54577175b5f50683ea Mon Sep 17 00:00:00 2001 From: Bryan Hunwardsen Date: Wed, 24 Mar 2021 10:05:46 -0700 Subject: [PATCH 196/253] SKR E3 Mini V2.0 Fan Bug Fix (#21079) Co-authored-by: Scott Lahteine --- Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_V2_0.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_V2_0.h b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_V2_0.h index af2821f809..c51e7f48d9 100644 --- a/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_V2_0.h +++ b/Marlin/src/pins/stm32f1/pins_BTT_SKR_MINI_E3_V2_0.h @@ -23,6 +23,8 @@ #define SKR_MINI_E3_V2 +#define BOARD_CUSTOM_BUILD_FLAGS -DTONE_CHANNEL=4 -DTONE_TIMER=4 + // Onboard I2C EEPROM #if NO_EEPROM_SELECTED #define I2C_EEPROM From 30e7e2c2766d7dbbe0144344287994f1969dfadd Mon Sep 17 00:00:00 2001 From: Martijn Bosgraaf Date: Wed, 24 Mar 2021 18:21:11 +0100 Subject: [PATCH 197/253] Extend M106/M107 for better laser module support (#16082) Co-authored-by: Scott Lahteine --- Marlin/Configuration_adv.h | 12 ++ Marlin/src/gcode/temp/M106_M107.cpp | 18 ++- Marlin/src/inc/SanityCheck.h | 11 ++ Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp | 4 +- Marlin/src/lcd/dwin/e3v2/dwin.cpp | 2 +- Marlin/src/lcd/marlinui.cpp | 29 ++-- Marlin/src/lcd/marlinui.h | 2 + Marlin/src/module/planner.cpp | 143 +++++++++++------- Marlin/src/module/planner.h | 27 +++- Marlin/src/module/stepper.cpp | 15 +- Marlin/src/module/temperature.cpp | 2 +- .../src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h | 6 +- .../src/pins/stm32f4/pins_MKS_ROBIN_PRO_V2.h | 6 +- buildroot/tests/ARMED | 1 + 14 files changed, 189 insertions(+), 89 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index 328056cb84..a7af076155 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -3217,6 +3217,18 @@ #endif #endif +/** + * Synchronous Laser Control with M106/M107 + * + * Marlin normally applies M106/M107 fan speeds at a time "soon after" processing + * a planner block. This is too inaccurate for a PWM/TTL laser attached to the fan + * header (as with some add-on laser kits). Enable this option to set fan/laser + * speeds with much more exact timing for improved print fidelity. + * + * NOTE: This option sacrifices some cooling fan speed options. + */ +//#define LASER_SYNCHRONOUS_M106_M107 + /** * Coolant Control * diff --git a/Marlin/src/gcode/temp/M106_M107.cpp b/Marlin/src/gcode/temp/M106_M107.cpp index b7d64c99ea..3ce08aafb6 100644 --- a/Marlin/src/gcode/temp/M106_M107.cpp +++ b/Marlin/src/gcode/temp/M106_M107.cpp @@ -28,6 +28,10 @@ #include "../../module/motion.h" #include "../../module/temperature.h" +#if ENABLED(LASER_SYNCHRONOUS_M106_M107) + #include "../../module/planner.h" +#endif + #if PREHEAT_COUNT #include "../../lcd/marlinui.h" #endif @@ -82,6 +86,8 @@ void GcodeSuite::M106() { // Set speed, with constraint thermalManager.set_fan_speed(pfan, speed); + TERN_(LASER_SYNCHRONOUS_M106_M107, planner.buffer_sync_block(BLOCK_FLAG_SYNC_FANS)); + if (TERN0(DUAL_X_CARRIAGE, idex_is_duplicating())) // pfan == 0 when duplicating thermalManager.set_fan_speed(1 - pfan, speed); } @@ -92,12 +98,14 @@ void GcodeSuite::M106() { */ void GcodeSuite::M107() { const uint8_t pfan = parser.byteval('P', _ALT_P); - if (pfan < _CNT_P) { - thermalManager.set_fan_speed(pfan, 0); + if (pfan >= _CNT_P) return; - if (TERN0(DUAL_X_CARRIAGE, idex_is_duplicating())) // pfan == 0 when duplicating - thermalManager.set_fan_speed(1 - pfan, 0); - } + thermalManager.set_fan_speed(pfan, 0); + + if (TERN0(DUAL_X_CARRIAGE, idex_is_duplicating())) // pfan == 0 when duplicating + thermalManager.set_fan_speed(1 - pfan, 0); + + TERN_(LASER_SYNCHRONOUS_M106_M107, planner.buffer_sync_block(BLOCK_FLAG_SYNC_FANS)); } #endif // HAS_FAN diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index a7f726c4b2..704163e2b2 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -1217,6 +1217,17 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #error "To use BED_LIMIT_SWITCHING you must disable PIDTEMPBED." #endif +/** + * Synchronous M106/M107 checks + */ +#if ENABLED(LASER_SYNCHRONOUS_M106_M107) + #if FAN_KICKSTART_TIME + #error "FAN_KICKSTART_TIME must be 0 with LASER_SYNCHRONOUS_M106_M107 (because the laser will always come on at FULL power)." + #elif FAN_MIN_PWM + #error "FAN_MIN_PWM must be 0 with LASER_SYNCHRONOUS_M106_M107 (otherwise the laser will never turn OFF)." + #endif +#endif + /** * Chamber Heating Options - PID vs Limit Switching */ diff --git a/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp b/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp index fd72f94862..e645a76611 100644 --- a/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp +++ b/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp @@ -760,7 +760,7 @@ void MarlinUI::draw_status_screen() { #endif #endif // HAS_HEATED_BED - #if FAN_COUNT > 0 + #if HAS_FAN uint16_t spd = thermalManager.fan_speed[0]; #if ENABLED(ADAPTIVE_FAN_SLOWING) @@ -783,7 +783,7 @@ void MarlinUI::draw_status_screen() { else picBits &= ~ICON_FAN; - #endif // FAN_COUNT > 0 + #endif // HAS_FAN // // Line 9, 10 - icons diff --git a/Marlin/src/lcd/dwin/e3v2/dwin.cpp b/Marlin/src/lcd/dwin/e3v2/dwin.cpp index 87ad93cf1d..b86e7cbe60 100644 --- a/Marlin/src/lcd/dwin/e3v2/dwin.cpp +++ b/Marlin/src/lcd/dwin/e3v2/dwin.cpp @@ -2152,7 +2152,7 @@ void HMI_SelectFile() { card.openAndPrintFile(card.filename); - #if FAN_COUNT > 0 + #if HAS_FAN // All fans on for Ender 3 v2 ? // The slicer should manage this for us. //for (uint8_t i = 0; i < FAN_COUNT; i++) diff --git a/Marlin/src/lcd/marlinui.cpp b/Marlin/src/lcd/marlinui.cpp index 4133e04832..8fef36e25a 100644 --- a/Marlin/src/lcd/marlinui.cpp +++ b/Marlin/src/lcd/marlinui.cpp @@ -22,6 +22,8 @@ #include "../inc/MarlinConfig.h" +#include "../MarlinCore.h" // for printingIsPaused + #ifdef LED_BACKLIGHT_TIMEOUT #include "../feature/leds/leds.h" #endif @@ -39,21 +41,21 @@ MarlinUI ui; #if HAS_DISPLAY - #include "../module/printcounter.h" - #include "../MarlinCore.h" #include "../gcode/queue.h" #include "fontutils.h" #include "../sd/cardreader.h" #endif #if ENABLED(DWIN_CREALITY_LCD) - #include "../module/printcounter.h" - #include "../MarlinCore.h" #include "dwin/e3v2/dwin.h" #endif -#if HAS_STATUS_MESSAGE - #define START_OF_UTF8_CHAR(C) (((C) & 0xC0u) != 0x80U) +#if ENABLED(LCD_PROGRESS_BAR) && !IS_TFTGLCD_PANEL + #define BASIC_PROGRESS_BAR 1 +#endif + +#if ANY(HAS_DISPLAY, HAS_STATUS_MESSAGE, BASIC_PROGRESS_BAR) + #include "../module/printcounter.h" #endif #if LCD_HAS_WAIT_FOR_MOVE @@ -535,7 +537,7 @@ bool MarlinUI::get_blink() { * This is very display-dependent, so the lcd implementation draws this. */ -#if ENABLED(LCD_PROGRESS_BAR) && !IS_TFTGLCD_PANEL +#if BASIC_PROGRESS_BAR millis_t MarlinUI::progress_bar_ms; // = 0 #if PROGRESS_MSG_EXPIRE > 0 millis_t MarlinUI::expire_status_ms; // = 0 @@ -546,7 +548,7 @@ void MarlinUI::status_screen() { TERN_(HAS_LCD_MENU, ENCODER_RATE_MULTIPLY(false)); - #if ENABLED(LCD_PROGRESS_BAR) && !IS_TFTGLCD_PANEL + #if BASIC_PROGRESS_BAR // // HD44780 implements the following message blinking and @@ -586,7 +588,7 @@ void MarlinUI::status_screen() { #endif // PROGRESS_MSG_EXPIRE - #endif // LCD_PROGRESS_BAR + #endif // BASIC_PROGRESS_BAR #if HAS_LCD_MENU if (use_click()) { @@ -1353,6 +1355,7 @@ void MarlinUI::update() { /** * Reset the status message */ + void MarlinUI::reset_status(const bool no_welcome) { #if SERVICE_INTERVAL_1 > 0 static PGMSTR(service1, "> " SERVICE_NAME_1 "!"); @@ -1438,9 +1441,9 @@ void MarlinUI::update() { void MarlinUI::finish_status(const bool persist) { - #if HAS_SPI_LCD + #if HAS_WIRED_LCD - #if !(ENABLED(LCD_PROGRESS_BAR) && (PROGRESS_MSG_EXPIRE) > 0) + #if !(BASIC_PROGRESS_BAR && (PROGRESS_MSG_EXPIRE) > 0) UNUSED(persist); #endif @@ -1448,7 +1451,7 @@ void MarlinUI::update() { const millis_t ms = millis(); #endif - #if ENABLED(LCD_PROGRESS_BAR) + #if BASIC_PROGRESS_BAR progress_bar_ms = ms; #if PROGRESS_MSG_EXPIRE > 0 expire_status_ms = persist ? 0 : ms + PROGRESS_MSG_EXPIRE; @@ -1462,7 +1465,7 @@ void MarlinUI::update() { #if ENABLED(STATUS_MESSAGE_SCROLLING) status_scroll_offset = 0; #endif - #else // HAS_SPI_LCD + #else // HAS_WIRED_LCD UNUSED(persist); #endif diff --git a/Marlin/src/lcd/marlinui.h b/Marlin/src/lcd/marlinui.h index 490d78401e..cc08284d17 100644 --- a/Marlin/src/lcd/marlinui.h +++ b/Marlin/src/lcd/marlinui.h @@ -56,6 +56,8 @@ #include "../module/motion.h" // for active_extruder #endif +#define START_OF_UTF8_CHAR(C) (((C) & 0xC0u) != 0x80U) + #if HAS_WIRED_LCD enum LCDViewAction : uint8_t { diff --git a/Marlin/src/module/planner.cpp b/Marlin/src/module/planner.cpp index 84c93e5296..b20d1e273b 100644 --- a/Marlin/src/module/planner.cpp +++ b/Marlin/src/module/planner.cpp @@ -1015,8 +1015,8 @@ void Planner::reverse_pass() { // Perform the reverse pass block_t *current = &block_buffer[block_index]; - // Only consider non sync and page blocks - if (!TEST(current->flag, BLOCK_BIT_SYNC_POSITION) && !IS_PAGE(current)) { + // Only consider non sync-and-page blocks + if (!(current->flag & BLOCK_MASK_SYNC) && !IS_PAGE(current)) { reverse_pass_kernel(current, next); next = current; } @@ -1111,7 +1111,7 @@ void Planner::forward_pass() { block = &block_buffer[block_index]; // Skip SYNC and page blocks - if (!TEST(block->flag, BLOCK_BIT_SYNC_POSITION) && !IS_PAGE(block)) { + if (!(block->flag & BLOCK_MASK_SYNC) && !IS_PAGE(block)) { // If there's no previous block or the previous block is not // BUSY (thus, modifiable) run the forward_pass_kernel. Otherwise, // the previous block became BUSY, so assume the current block's @@ -1147,7 +1147,7 @@ void Planner::recalculate_trapezoids() { block_t *prev = &block_buffer[prev_index]; // If not dealing with a sync block, we are done. The last block is not a SYNC block - if (!TEST(prev->flag, BLOCK_BIT_SYNC_POSITION)) break; + if (!(prev->flag & BLOCK_MASK_SYNC)) break; // Examine the previous block. This and all following are SYNC blocks head_block_index = prev_index; @@ -1161,7 +1161,7 @@ void Planner::recalculate_trapezoids() { next = &block_buffer[block_index]; // Skip sync and page blocks - if (!TEST(next->flag, BLOCK_BIT_SYNC_POSITION) && !IS_PAGE(next)) { + if (!(next->flag & BLOCK_MASK_SYNC) && !IS_PAGE(next)) { next_entry_speed = SQRT(next->entry_speed_sqr); if (block) { @@ -1248,6 +1248,63 @@ void Planner::recalculate() { recalculate_trapezoids(); } +#if HAS_FAN && DISABLED(LASER_SYNCHRONOUS_M106_M107) + #define HAS_TAIL_FAN_SPEED 1 +#endif + +/** + * Apply fan speeds + */ +#if HAS_FAN + + void Planner::sync_fan_speeds(uint8_t (&fan_speed)[FAN_COUNT]) { + + #if FAN_MIN_PWM != 0 || FAN_MAX_PWM != 255 + #define CALC_FAN_SPEED(f) (fan_speed[f] ? map(fan_speed[f], 1, 255, FAN_MIN_PWM, FAN_MAX_PWM) : FAN_OFF_PWM) + #else + #define CALC_FAN_SPEED(f) (fan_speed[f] ?: FAN_OFF_PWM) + #endif + + #if ENABLED(FAN_SOFT_PWM) + #define _FAN_SET(F) thermalManager.soft_pwm_amount_fan[F] = CALC_FAN_SPEED(F); + #elif ENABLED(FAST_PWM_FAN) + #define _FAN_SET(F) set_pwm_duty(FAN##F##_PIN, CALC_FAN_SPEED(F)); + #else + #define _FAN_SET(F) analogWrite(pin_t(FAN##F##_PIN), CALC_FAN_SPEED(F)); + #endif + #define FAN_SET(F) do{ kickstart_fan(fan_speed, ms, F); _FAN_SET(F); }while(0) + + const millis_t ms = millis(); + TERN_(HAS_FAN0, FAN_SET(0)); + TERN_(HAS_FAN1, FAN_SET(1)); + TERN_(HAS_FAN2, FAN_SET(2)); + TERN_(HAS_FAN3, FAN_SET(3)); + TERN_(HAS_FAN4, FAN_SET(4)); + TERN_(HAS_FAN5, FAN_SET(5)); + TERN_(HAS_FAN6, FAN_SET(6)); + TERN_(HAS_FAN7, FAN_SET(7)); + } + + #if FAN_KICKSTART_TIME + + void Planner::kickstart_fan(uint8_t (&fan_speed)[FAN_COUNT], const millis_t &ms, const uint8_t f) { + static millis_t fan_kick_end[FAN_COUNT] = { 0 }; + if (fan_speed[f]) { + if (fan_kick_end[f] == 0) { + fan_kick_end[f] = ms + FAN_KICKSTART_TIME; + fan_speed[f] = 255; + } + else if (PENDING(ms, fan_kick_end[f])) + fan_speed[f] = 255; + } + else + fan_kick_end[f] = 0; + } + + #endif + +#endif // HAS_FAN + /** * Maintain fans, paste extruder pressure, */ @@ -1257,7 +1314,7 @@ void Planner::check_axes_activity() { xyze_bool_t axis_active = { false }; #endif - #if HAS_FAN + #if HAS_TAIL_FAN_SPEED uint8_t tail_fan_speed[FAN_COUNT]; #endif @@ -1272,13 +1329,12 @@ void Planner::check_axes_activity() { if (has_blocks_queued()) { - #if HAS_FAN || ENABLED(BARICUDA) + #if EITHER(HAS_TAIL_FAN_SPEED, BARICUDA) block_t *block = &block_buffer[block_buffer_tail]; #endif - #if HAS_FAN - FANS_LOOP(i) - tail_fan_speed[i] = thermalManager.scaledFanSpeed(i, block->fan_speed[i]); + #if HAS_TAIL_FAN_SPEED + FANS_LOOP(i) tail_fan_speed[i] = thermalManager.scaledFanSpeed(i, block->fan_speed[i]); #endif #if ENABLED(BARICUDA) @@ -1300,9 +1356,8 @@ void Planner::check_axes_activity() { TERN_(HAS_CUTTER, cutter.refresh()); - #if HAS_FAN - FANS_LOOP(i) - tail_fan_speed[i] = thermalManager.scaledFanSpeed(i); + #if HAS_TAIL_FAN_SPEED + FANS_LOOP(i) tail_fan_speed[i] = thermalManager.scaledFanSpeed(i); #endif #if ENABLED(BARICUDA) @@ -1321,48 +1376,11 @@ void Planner::check_axes_activity() { // // Update Fan speeds + // Only if synchronous M106/M107 is disabled // - #if HAS_FAN - - #if FAN_KICKSTART_TIME > 0 - static millis_t fan_kick_end[FAN_COUNT] = { 0 }; - #define KICKSTART_FAN(f) \ - if (tail_fan_speed[f]) { \ - millis_t ms = millis(); \ - if (fan_kick_end[f] == 0) { \ - fan_kick_end[f] = ms + FAN_KICKSTART_TIME; \ - tail_fan_speed[f] = 255; \ - } else if (PENDING(ms, fan_kick_end[f])) \ - tail_fan_speed[f] = 255; \ - } else fan_kick_end[f] = 0 - #else - #define KICKSTART_FAN(f) NOOP - #endif - - #if FAN_MIN_PWM != 0 || FAN_MAX_PWM != 255 - #define CALC_FAN_SPEED(f) (tail_fan_speed[f] ? map(tail_fan_speed[f], 1, 255, FAN_MIN_PWM, FAN_MAX_PWM) : FAN_OFF_PWM) - #else - #define CALC_FAN_SPEED(f) (tail_fan_speed[f] ?: FAN_OFF_PWM) - #endif - - #if ENABLED(FAN_SOFT_PWM) - #define _FAN_SET(F) thermalManager.soft_pwm_amount_fan[F] = CALC_FAN_SPEED(F); - #elif ENABLED(FAST_PWM_FAN) - #define _FAN_SET(F) set_pwm_duty(FAN##F##_PIN, CALC_FAN_SPEED(F)); - #else - #define _FAN_SET(F) analogWrite(pin_t(FAN##F##_PIN), CALC_FAN_SPEED(F)); - #endif - #define FAN_SET(F) do{ KICKSTART_FAN(F); _FAN_SET(F); }while(0) - - TERN_(HAS_FAN0, FAN_SET(0)); - TERN_(HAS_FAN1, FAN_SET(1)); - TERN_(HAS_FAN2, FAN_SET(2)); - TERN_(HAS_FAN3, FAN_SET(3)); - TERN_(HAS_FAN4, FAN_SET(4)); - TERN_(HAS_FAN5, FAN_SET(5)); - TERN_(HAS_FAN6, FAN_SET(6)); - TERN_(HAS_FAN7, FAN_SET(7)); - #endif // HAS_FAN + #if HAS_TAIL_FAN_SPEED + sync_fan_speeds(tail_fan_speed); + #endif TERN_(AUTOTEMP, getHighESpeed()); @@ -2675,9 +2693,14 @@ bool Planner::_populate_block(block_t * const block, bool split_move, /** * Planner::buffer_sync_block - * Add a block to the buffer that just updates the position + * Add a block to the buffer that just updates the position, + * or in case of LASER_SYNCHRONOUS_M106_M107 the fan PWM */ -void Planner::buffer_sync_block() { +void Planner::buffer_sync_block(TERN_(LASER_SYNCHRONOUS_M106_M107, uint8_t sync_flag)) { + #if DISABLED(LASER_SYNCHRONOUS_M106_M107) + constexpr uint8_t sync_flag = BLOCK_FLAG_SYNC_POSITION; + #endif + // Wait for the next available block uint8_t next_buffer_head; block_t * const block = get_next_free_block(next_buffer_head); @@ -2685,10 +2708,14 @@ void Planner::buffer_sync_block() { // Clear block memset(block, 0, sizeof(block_t)); - block->flag = BLOCK_FLAG_SYNC_POSITION; + block->flag = sync_flag; block->position = position; + #if BOTH(HAS_FAN, LASER_SYNCHRONOUS_M106_M107) + FANS_LOOP(i) block->fan_speed[i] = thermalManager.fan_speed[i]; + #endif + // If this is the first added movement, reload the delay, otherwise, cancel it. if (block_buffer_head == block_buffer_tail) { // If it was the first queued block, restart the 1st block delivery delay, to @@ -2876,7 +2903,7 @@ bool Planner::buffer_line(const float &rx, const float &ry, const float &rz, con block->flag = BLOCK_FLAG_IS_PAGE; - #if FAN_COUNT > 0 + #if HAS_FAN FANS_LOOP(i) block->fan_speed[i] = thermalManager.fan_speed[i]; #endif diff --git a/Marlin/src/module/planner.h b/Marlin/src/module/planner.h index 24c814e851..da9e202cdf 100644 --- a/Marlin/src/module/planner.h +++ b/Marlin/src/module/planner.h @@ -102,6 +102,11 @@ enum BlockFlagBit : char { #if ENABLED(DIRECT_STEPPING) , BLOCK_BIT_IS_PAGE #endif + + // Sync the fan speeds from the block + #if ENABLED(LASER_SYNCHRONOUS_M106_M107) + , BLOCK_BIT_SYNC_FANS + #endif }; enum BlockFlag : char { @@ -112,8 +117,13 @@ enum BlockFlag : char { #if ENABLED(DIRECT_STEPPING) , BLOCK_FLAG_IS_PAGE = _BV(BLOCK_BIT_IS_PAGE) #endif + #if ENABLED(LASER_SYNCHRONOUS_M106_M107) + , BLOCK_FLAG_SYNC_FANS = _BV(BLOCK_BIT_SYNC_FANS) + #endif }; +#define BLOCK_MASK_SYNC ( BLOCK_FLAG_SYNC_POSITION | TERN0(LASER_SYNCHRONOUS_M106_M107, BLOCK_FLAG_SYNC_FANS) ) + #if ENABLED(LASER_POWER_INLINE) typedef struct { @@ -499,6 +509,16 @@ class Planner { // Manage fans, paste pressure, etc. static void check_axes_activity(); + // Apply fan speeds + #if HAS_FAN + static void sync_fan_speeds(uint8_t (&fan_speed)[FAN_COUNT]); + #if FAN_KICKSTART_TIME + static void kickstart_fan(uint8_t (&fan_speed)[FAN_COUNT], const millis_t &ms, const uint8_t f); + #else + FORCE_INLINE static void kickstart_fan(uint8_t (&)[FAN_COUNT], const millis_t &, const uint8_t) {} + #endif + #endif + #if ENABLED(FILAMENT_WIDTH_SENSOR) void apply_filament_width_sensor(const int8_t encoded_ratio); @@ -721,9 +741,12 @@ class Planner { /** * Planner::buffer_sync_block - * Add a block to the buffer that just updates the position + * Add a block to the buffer that just updates the position or in + * case of LASER_SYNCHRONOUS_M106_M107 the fan pwm */ - static void buffer_sync_block(); + static void buffer_sync_block( + TERN_(LASER_SYNCHRONOUS_M106_M107, uint8_t sync_flag=BLOCK_FLAG_SYNC_POSITION) + ); #if IS_KINEMATIC private: diff --git a/Marlin/src/module/stepper.cpp b/Marlin/src/module/stepper.cpp index 77fa6539bc..49eca7047c 100644 --- a/Marlin/src/module/stepper.cpp +++ b/Marlin/src/module/stepper.cpp @@ -1988,9 +1988,18 @@ uint32_t Stepper::block_phase_isr() { // Anything in the buffer? if ((current_block = planner.get_current_block())) { - // Sync block? Sync the stepper counts and return - while (TEST(current_block->flag, BLOCK_BIT_SYNC_POSITION)) { - _set_position(current_block->position); + // Sync block? Sync the stepper counts or fan speeds and return + while (current_block->flag & BLOCK_MASK_SYNC) { + + #if ENABLED(LASER_SYNCHRONOUS_M106_M107) + const bool is_sync_fans = TEST(current_block->flag, BLOCK_BIT_SYNC_FANS); + if (is_sync_fans) planner.sync_fan_speeds(current_block->fan_speed); + #else + constexpr bool is_sync_fans = false; + #endif + + if (!is_sync_fans) _set_position(current_block->position); + discard_current_block(); // Try to get a new block diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index da792db833..a9b7ab13eb 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -197,7 +197,7 @@ #endif #if HAS_SERVOS - #include "./servo.h" + #include "servo.h" #endif #if ANY(TEMP_SENSOR_0_IS_THERMISTOR, TEMP_SENSOR_1_IS_THERMISTOR, TEMP_SENSOR_2_IS_THERMISTOR, TEMP_SENSOR_3_IS_THERMISTOR, \ diff --git a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h index f9e85c4919..726e9a6586 100644 --- a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h +++ b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_NANO_V3.h @@ -322,7 +322,8 @@ #define TFT_BUFFER_SIZE 14400 -#elif HAS_SPI_LCD +#elif HAS_WIRED_LCD + #define BEEPER_PIN PC5 #define BTN_ENC PE13 #define LCD_PINS_ENABLE PD13 @@ -358,4 +359,5 @@ #define BOARD_ST7920_DELAY_3 DELAY_NS(600) #endif // !MKS_MINI_12864 -#endif // HAS_SPI_LCD + +#endif // HAS_WIRED_LCD diff --git a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_PRO_V2.h b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_PRO_V2.h index f2ddfc2b52..1000326dad 100644 --- a/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_PRO_V2.h +++ b/Marlin/src/pins/stm32f4/pins_MKS_ROBIN_PRO_V2.h @@ -327,7 +327,8 @@ //#define TFT_DRIVER ST7796 #define TFT_BUFFER_SIZE 14400 -#elif HAS_SPI_LCD +#elif HAS_WIRED_LCD + #define BEEPER_PIN PC5 #define BTN_ENC PE13 #define LCD_PINS_ENABLE PD13 @@ -369,4 +370,5 @@ #endif #endif // !MKS_MINI_12864 -#endif // HAS_SPI_LCD + +#endif // HAS_WIRED_LCD diff --git a/buildroot/tests/ARMED b/buildroot/tests/ARMED index 8764d47e84..7b9fef1eeb 100755 --- a/buildroot/tests/ARMED +++ b/buildroot/tests/ARMED @@ -12,6 +12,7 @@ set -e restore_configs use_example_configs ArmEd opt_set X_DRIVER_TYPE TMC2130 Y_DRIVER_TYPE TMC2208 +opt_enable LASER_SYNCHRONOUS_M106_M107 exec_test $1 $2 "ArmEd Example Configuration with mixed TMC Drivers" "$3" # clean up From 832059967c4cfbd48d82282c2e700b8d4b805492 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 22 Mar 2021 23:58:03 -0500 Subject: [PATCH 198/253] Comment, clean up some PlatformIO scripts --- buildroot/share/PlatformIO/ldscripts/lerdge.ld | 6 +++--- buildroot/share/PlatformIO/scripts/openblt.py | 7 ++++--- .../share/PlatformIO/scripts/stm32_bootloader.py | 14 +++++++++++++- .../PlatformIO/variants/MARLIN_F4x7Vx/ldscript.ld | 6 +++--- 4 files changed, 23 insertions(+), 10 deletions(-) diff --git a/buildroot/share/PlatformIO/ldscripts/lerdge.ld b/buildroot/share/PlatformIO/ldscripts/lerdge.ld index aa0b1dd9cb..f36ebcdea1 100644 --- a/buildroot/share/PlatformIO/ldscripts/lerdge.ld +++ b/buildroot/share/PlatformIO/ldscripts/lerdge.ld @@ -40,9 +40,9 @@ _Min_Stack_Size = 0x400;; /* required amount of stack */ /* Specify the memory areas */ MEMORY { -FLASH (rx) : ORIGIN = 0x8000000 + LD_FLASH_OFFSET, LENGTH = LD_MAX_SIZE - LD_FLASH_OFFSET -RAM (xrw) : ORIGIN = 0x20000000, LENGTH = LD_MAX_DATA_SIZE -CCMRAM (rw) : ORIGIN = 0x10000000, LENGTH = 64K +FLASH (rx) : ORIGIN = 0x08000000 + LD_FLASH_OFFSET, LENGTH = LD_MAX_SIZE - LD_FLASH_OFFSET +RAM (xrw) : ORIGIN = 0x20000000, LENGTH = LD_MAX_DATA_SIZE +CCMRAM (rw) : ORIGIN = 0x10000000, LENGTH = 64K } /* Define output sections */ diff --git a/buildroot/share/PlatformIO/scripts/openblt.py b/buildroot/share/PlatformIO/scripts/openblt.py index 2911a28e78..01cd9c9ef2 100644 --- a/buildroot/share/PlatformIO/scripts/openblt.py +++ b/buildroot/share/PlatformIO/scripts/openblt.py @@ -1,5 +1,6 @@ -# Generate the firmware as OpenBLT needs - +# +# Convert the ELF to an SREC file suitable for some bootloaders +# import os,sys from os.path import join @@ -10,5 +11,5 @@ env.AddPostAction( env.VerboseAction(" ".join([ "$OBJCOPY", "-O", "srec", "\"$BUILD_DIR/${PROGNAME}.elf\"", "\"$BUILD_DIR/${PROGNAME}.srec\"" - ]), "Building " + join("$BUILD_DIR","${PROGNAME}.srec")) + ]), "Building " + join("$BUILD_DIR", "${PROGNAME}.srec")) ) diff --git a/buildroot/share/PlatformIO/scripts/stm32_bootloader.py b/buildroot/share/PlatformIO/scripts/stm32_bootloader.py index bbec61750c..1ceff84b8f 100644 --- a/buildroot/share/PlatformIO/scripts/stm32_bootloader.py +++ b/buildroot/share/PlatformIO/scripts/stm32_bootloader.py @@ -7,18 +7,28 @@ Import("env") from SCons.Script import DefaultEnvironment board = DefaultEnvironment().BoardConfig() +# +# Copy the firmware.bin file to build.firmware, no encryption +# def noencrypt(source, target, env): firmware = os.path.join(target[0].dir.path, board.get("build.firmware")) shutil.copy(target[0].path, firmware) +# +# For build.offset define LD_FLASH_OFFSET, used by ldscript.ld +# if 'offset' in board.get("build").keys(): LD_FLASH_OFFSET = board.get("build.offset") + # Remove an existing VECT_TAB_OFFSET from CPPDEFINES for define in env['CPPDEFINES']: if define[0] == "VECT_TAB_OFFSET": env['CPPDEFINES'].remove(define) + + # Replace VECT_TAB_OFFSET with our LD_FLASH_OFFSET env['CPPDEFINES'].append(("VECT_TAB_OFFSET", LD_FLASH_OFFSET)) + # Get upload.maximum_ram_size (defined by /buildroot/share/PlatformIO/boards/VARIOUS.json) maximum_ram_size = board.get("upload.maximum_ram_size") for i, flag in enumerate(env["LINKFLAGS"]): @@ -27,7 +37,9 @@ if 'offset' in board.get("build").keys(): if "-Wl,--defsym=LD_MAX_DATA_SIZE" in flag: env["LINKFLAGS"][i] = "-Wl,--defsym=LD_MAX_DATA_SIZE=" + str(maximum_ram_size - 40) +# +# Only copy the file if there's no encrypt +# board_keys = board.get("build").keys() -# Only copy file if there's no encryptation if 'firmware' in board_keys and not 'encrypt' in board_keys: env.AddPostAction("$BUILD_DIR/${PROGNAME}.bin", noencrypt) diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F4x7Vx/ldscript.ld b/buildroot/share/PlatformIO/variants/MARLIN_F4x7Vx/ldscript.ld index 19eec62fba..aa685e8111 100644 --- a/buildroot/share/PlatformIO/variants/MARLIN_F4x7Vx/ldscript.ld +++ b/buildroot/share/PlatformIO/variants/MARLIN_F4x7Vx/ldscript.ld @@ -58,9 +58,9 @@ _Min_Stack_Size = 0x400; /* required amount of stack */ /* Specify the memory areas */ MEMORY { -RAM (xrw) : ORIGIN = 0x20000000, LENGTH = LD_MAX_DATA_SIZE -CCMRAM (rw) : ORIGIN = 0x10000000, LENGTH = 64K -FLASH (rx) : ORIGIN = 0x8000000 + LD_FLASH_OFFSET, LENGTH = LD_MAX_SIZE - LD_FLASH_OFFSET +RAM (xrw) : ORIGIN = 0x20000000, LENGTH = LD_MAX_DATA_SIZE +CCMRAM (rw) : ORIGIN = 0x10000000, LENGTH = 64K +FLASH (rx) : ORIGIN = 0x08000000 + LD_FLASH_OFFSET, LENGTH = LD_MAX_SIZE - LD_FLASH_OFFSET } /* Define output sections */ From b59a4331fa05c41ea2004f959ae3d75a36bc5dd5 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 20 Mar 2021 22:43:47 -0500 Subject: [PATCH 199/253] Update common-cxxflags.py comment --- buildroot/share/PlatformIO/scripts/common-cxxflags.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/buildroot/share/PlatformIO/scripts/common-cxxflags.py b/buildroot/share/PlatformIO/scripts/common-cxxflags.py index 36704af283..856a246fba 100644 --- a/buildroot/share/PlatformIO/scripts/common-cxxflags.py +++ b/buildroot/share/PlatformIO/scripts/common-cxxflags.py @@ -20,10 +20,10 @@ def add_cpu_freq(): # Useful for JTAG debugging # -# It will separe release and debug build folders. -# It useful when we need keep two live versions: one debug, for debugging, -# other release, for flashing (when upload is not done automatically by jlink/stlink). -# Without this, PIO will recompile everything twice for any small change. +# It will separate release and debug build folders. +# It useful to keep two live versions: a debug version for debugging and another for +# release, for flashing when upload is not done automatically by jlink/stlink. +# Without this, PIO needs to recompile everything twice for any small change. if env.GetBuildType() == "debug" and env.get('UPLOAD_PROTOCOL') not in ['jlink', 'stlink']: env['BUILD_DIR'] = '$PROJECT_BUILD_DIR/$PIOENV/debug' From 589bb921aeaac73c5056d7adfa157412b5ebe273 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Sat, 20 Mar 2021 22:39:13 -0500 Subject: [PATCH 200/253] Tweak disabled variant options --- .../variants/BIGTREE_GTR_V1/hal_conf_extra.h | 68 +++++++++--------- .../BIGTREE_SKR_PRO_1v1/hal_conf_extra.h | 68 +++++++++--------- .../FYSETC_CHEETAH_V20/hal_conf_custom.h | 64 ++++++++--------- .../variants/MARLIN_F4x7Vx/hal_conf_extra.h | 72 +++++++++---------- 4 files changed, 136 insertions(+), 136 deletions(-) diff --git a/buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/hal_conf_extra.h b/buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/hal_conf_extra.h index f7f9e23e99..cbce513d1b 100644 --- a/buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/hal_conf_extra.h +++ b/buildroot/share/PlatformIO/variants/BIGTREE_GTR_V1/hal_conf_extra.h @@ -16,37 +16,37 @@ //#define HAL_UART_MODULE_ENABLED // by default //#define HAL_PCD_MODULE_ENABLED // Since STM32 v3.10700.191028 this is automatically added if any type of USB is enabled (as in Arduino IDE) -#undef HAL_SD_MODULE_ENABLED -#undef HAL_DAC_MODULE_ENABLED -#undef HAL_FLASH_MODULE_ENABLED -#undef HAL_CAN_MODULE_ENABLED -#undef HAL_CAN_LEGACY_MODULE_ENABLED -#undef HAL_CEC_MODULE_ENABLED -#undef HAL_CRYP_MODULE_ENABLED -#undef HAL_DCMI_MODULE_ENABLED -#undef HAL_DMA2D_MODULE_ENABLED -#undef HAL_ETH_MODULE_ENABLED -#undef HAL_NAND_MODULE_ENABLED -#undef HAL_NOR_MODULE_ENABLED -#undef HAL_PCCARD_MODULE_ENABLED -#undef HAL_SRAM_MODULE_ENABLED -#undef HAL_SDRAM_MODULE_ENABLED -#undef HAL_HASH_MODULE_ENABLED -#undef HAL_EXTI_MODULE_ENABLED -#undef HAL_SMBUS_MODULE_ENABLED -#undef HAL_I2S_MODULE_ENABLED -#undef HAL_IWDG_MODULE_ENABLED -#undef HAL_LTDC_MODULE_ENABLED -#undef HAL_DSI_MODULE_ENABLED -#undef HAL_QSPI_MODULE_ENABLED -#undef HAL_RNG_MODULE_ENABLED -#undef HAL_SAI_MODULE_ENABLED -#undef HAL_IRDA_MODULE_ENABLED -#undef HAL_SMARTCARD_MODULE_ENABLED -#undef HAL_WWDG_MODULE_ENABLED -//#undef HAL_HCD_MODULE_ENABLED -#undef HAL_FMPI2C_MODULE_ENABLED -#undef HAL_SPDIFRX_MODULE_ENABLED -#undef HAL_DFSDM_MODULE_ENABLED -#undef HAL_LPTIM_MODULE_ENABLED -#undef HAL_MMC_MODULE_ENABLED +//#define HAL_SD_MODULE_ENABLED +//#define HAL_DAC_MODULE_ENABLED +//#define HAL_FLASH_MODULE_ENABLED +//#define HAL_CAN_MODULE_ENABLED +//#define HAL_CAN_LEGACY_MODULE_ENABLED +//#define HAL_CEC_MODULE_ENABLED +//#define HAL_CRYP_MODULE_ENABLED +//#define HAL_DCMI_MODULE_ENABLED +//#define HAL_DMA2D_MODULE_ENABLED +//#define HAL_ETH_MODULE_ENABLED +//#define HAL_NAND_MODULE_ENABLED +//#define HAL_NOR_MODULE_ENABLED +//#define HAL_PCCARD_MODULE_ENABLED +//#define HAL_SRAM_MODULE_ENABLED +//#define HAL_SDRAM_MODULE_ENABLED +//#define HAL_HASH_MODULE_ENABLED +//#define HAL_EXTI_MODULE_ENABLED +//#define HAL_SMBUS_MODULE_ENABLED +//#define HAL_I2S_MODULE_ENABLED +//#define HAL_IWDG_MODULE_ENABLED +//#define HAL_LTDC_MODULE_ENABLED +//#define HAL_DSI_MODULE_ENABLED +//#define HAL_QSPI_MODULE_ENABLED +//#define HAL_RNG_MODULE_ENABLED +//#define HAL_SAI_MODULE_ENABLED +//#define HAL_IRDA_MODULE_ENABLED +//#define HAL_SMARTCARD_MODULE_ENABLED +//#define HAL_WWDG_MODULE_ENABLED +//#define HAL_HCD_MODULE_ENABLED +//#define HAL_FMPI2C_MODULE_ENABLED +//#define HAL_SPDIFRX_MODULE_ENABLED +//#define HAL_DFSDM_MODULE_ENABLED +//#define HAL_LPTIM_MODULE_ENABLED +//#define HAL_MMC_MODULE_ENABLED diff --git a/buildroot/share/PlatformIO/variants/BIGTREE_SKR_PRO_1v1/hal_conf_extra.h b/buildroot/share/PlatformIO/variants/BIGTREE_SKR_PRO_1v1/hal_conf_extra.h index f7f9e23e99..cbce513d1b 100644 --- a/buildroot/share/PlatformIO/variants/BIGTREE_SKR_PRO_1v1/hal_conf_extra.h +++ b/buildroot/share/PlatformIO/variants/BIGTREE_SKR_PRO_1v1/hal_conf_extra.h @@ -16,37 +16,37 @@ //#define HAL_UART_MODULE_ENABLED // by default //#define HAL_PCD_MODULE_ENABLED // Since STM32 v3.10700.191028 this is automatically added if any type of USB is enabled (as in Arduino IDE) -#undef HAL_SD_MODULE_ENABLED -#undef HAL_DAC_MODULE_ENABLED -#undef HAL_FLASH_MODULE_ENABLED -#undef HAL_CAN_MODULE_ENABLED -#undef HAL_CAN_LEGACY_MODULE_ENABLED -#undef HAL_CEC_MODULE_ENABLED -#undef HAL_CRYP_MODULE_ENABLED -#undef HAL_DCMI_MODULE_ENABLED -#undef HAL_DMA2D_MODULE_ENABLED -#undef HAL_ETH_MODULE_ENABLED -#undef HAL_NAND_MODULE_ENABLED -#undef HAL_NOR_MODULE_ENABLED -#undef HAL_PCCARD_MODULE_ENABLED -#undef HAL_SRAM_MODULE_ENABLED -#undef HAL_SDRAM_MODULE_ENABLED -#undef HAL_HASH_MODULE_ENABLED -#undef HAL_EXTI_MODULE_ENABLED -#undef HAL_SMBUS_MODULE_ENABLED -#undef HAL_I2S_MODULE_ENABLED -#undef HAL_IWDG_MODULE_ENABLED -#undef HAL_LTDC_MODULE_ENABLED -#undef HAL_DSI_MODULE_ENABLED -#undef HAL_QSPI_MODULE_ENABLED -#undef HAL_RNG_MODULE_ENABLED -#undef HAL_SAI_MODULE_ENABLED -#undef HAL_IRDA_MODULE_ENABLED -#undef HAL_SMARTCARD_MODULE_ENABLED -#undef HAL_WWDG_MODULE_ENABLED -//#undef HAL_HCD_MODULE_ENABLED -#undef HAL_FMPI2C_MODULE_ENABLED -#undef HAL_SPDIFRX_MODULE_ENABLED -#undef HAL_DFSDM_MODULE_ENABLED -#undef HAL_LPTIM_MODULE_ENABLED -#undef HAL_MMC_MODULE_ENABLED +//#define HAL_SD_MODULE_ENABLED +//#define HAL_DAC_MODULE_ENABLED +//#define HAL_FLASH_MODULE_ENABLED +//#define HAL_CAN_MODULE_ENABLED +//#define HAL_CAN_LEGACY_MODULE_ENABLED +//#define HAL_CEC_MODULE_ENABLED +//#define HAL_CRYP_MODULE_ENABLED +//#define HAL_DCMI_MODULE_ENABLED +//#define HAL_DMA2D_MODULE_ENABLED +//#define HAL_ETH_MODULE_ENABLED +//#define HAL_NAND_MODULE_ENABLED +//#define HAL_NOR_MODULE_ENABLED +//#define HAL_PCCARD_MODULE_ENABLED +//#define HAL_SRAM_MODULE_ENABLED +//#define HAL_SDRAM_MODULE_ENABLED +//#define HAL_HASH_MODULE_ENABLED +//#define HAL_EXTI_MODULE_ENABLED +//#define HAL_SMBUS_MODULE_ENABLED +//#define HAL_I2S_MODULE_ENABLED +//#define HAL_IWDG_MODULE_ENABLED +//#define HAL_LTDC_MODULE_ENABLED +//#define HAL_DSI_MODULE_ENABLED +//#define HAL_QSPI_MODULE_ENABLED +//#define HAL_RNG_MODULE_ENABLED +//#define HAL_SAI_MODULE_ENABLED +//#define HAL_IRDA_MODULE_ENABLED +//#define HAL_SMARTCARD_MODULE_ENABLED +//#define HAL_WWDG_MODULE_ENABLED +//#define HAL_HCD_MODULE_ENABLED +//#define HAL_FMPI2C_MODULE_ENABLED +//#define HAL_SPDIFRX_MODULE_ENABLED +//#define HAL_DFSDM_MODULE_ENABLED +//#define HAL_LPTIM_MODULE_ENABLED +//#define HAL_MMC_MODULE_ENABLED diff --git a/buildroot/share/PlatformIO/variants/FYSETC_CHEETAH_V20/hal_conf_custom.h b/buildroot/share/PlatformIO/variants/FYSETC_CHEETAH_V20/hal_conf_custom.h index 1b9df2b47a..6c56b97a74 100644 --- a/buildroot/share/PlatformIO/variants/FYSETC_CHEETAH_V20/hal_conf_custom.h +++ b/buildroot/share/PlatformIO/variants/FYSETC_CHEETAH_V20/hal_conf_custom.h @@ -33,55 +33,55 @@ extern "C" { */ #define HAL_MODULE_ENABLED #define HAL_ADC_MODULE_ENABLED -/* #define HAL_CAN_MODULE_ENABLED */ -/* #define HAL_CAN_LEGACY_MODULE_ENABLED */ +//#define HAL_CAN_MODULE_ENABLED +//#define HAL_CAN_LEGACY_MODULE_ENABLED #define HAL_CRC_MODULE_ENABLED -/* #define HAL_CEC_MODULE_ENABLED */ -/* #define HAL_CRYP_MODULE_ENABLED */ +//#define HAL_CEC_MODULE_ENABLED +//#define HAL_CRYP_MODULE_ENABLED //#define HAL_DAC_MODULE_ENABLED -/* #define HAL_DCMI_MODULE_ENABLED */ +//#define HAL_DCMI_MODULE_ENABLED #define HAL_DMA_MODULE_ENABLED -/* #define HAL_DMA2D_MODULE_ENABLED */ -/* #define HAL_ETH_MODULE_ENABLED */ +//#define HAL_DMA2D_MODULE_ENABLED +//#define HAL_ETH_MODULE_ENABLED #define HAL_FLASH_MODULE_ENABLED -/* #define HAL_NAND_MODULE_ENABLED */ -/* #define HAL_NOR_MODULE_ENABLED */ -/* #define HAL_PCCARD_MODULE_ENABLED */ -/* #define HAL_SRAM_MODULE_ENABLED */ -/* #define HAL_SDRAM_MODULE_ENABLED */ -/* #define HAL_HASH_MODULE_ENABLED */ +//#define HAL_NAND_MODULE_ENABLED +//#define HAL_NOR_MODULE_ENABLED +//#define HAL_PCCARD_MODULE_ENABLED +//#define HAL_SRAM_MODULE_ENABLED +//#define HAL_SDRAM_MODULE_ENABLED +//#define HAL_HASH_MODULE_ENABLED #define HAL_GPIO_MODULE_ENABLED -/* #define HAL_EXTI_MODULE_ENABLED */ +//#define HAL_EXTI_MODULE_ENABLED #define HAL_I2C_MODULE_ENABLED -/* #define HAL_SMBUS_MODULE_ENABLED */ -/* #define HAL_I2S_MODULE_ENABLED */ +//#define HAL_SMBUS_MODULE_ENABLED +//#define HAL_I2S_MODULE_ENABLED #define HAL_IWDG_MODULE_ENABLED -/* #define HAL_LTDC_MODULE_ENABLED */ -/* #define HAL_DSI_MODULE_ENABLED */ +//#define HAL_LTDC_MODULE_ENABLED +//#define HAL_DSI_MODULE_ENABLED #define HAL_PWR_MODULE_ENABLED -/* #define HAL_QSPI_MODULE_ENABLED */ +//#define HAL_QSPI_MODULE_ENABLED #define HAL_RCC_MODULE_ENABLED -/* #define HAL_RNG_MODULE_ENABLED */ +//#define HAL_RNG_MODULE_ENABLED #define HAL_RTC_MODULE_ENABLED -/* #define HAL_SAI_MODULE_ENABLED */ +//#define HAL_SAI_MODULE_ENABLED //#define HAL_SD_MODULE_ENABLED #define HAL_SPI_MODULE_ENABLED #define HAL_TIM_MODULE_ENABLED -/* #define HAL_UART_MODULE_ENABLED */ -/* #define HAL_USART_MODULE_ENABLED */ -/* #define HAL_IRDA_MODULE_ENABLED */ -/* #define HAL_SMARTCARD_MODULE_ENABLED */ -/* #define HAL_WWDG_MODULE_ENABLED */ +//#define HAL_UART_MODULE_ENABLED +//#define HAL_USART_MODULE_ENABLED +//#define HAL_IRDA_MODULE_ENABLED +//#define HAL_SMARTCARD_MODULE_ENABLED +//#define HAL_WWDG_MODULE_ENABLED #define HAL_CORTEX_MODULE_ENABLED #ifndef HAL_PCD_MODULE_ENABLED #define HAL_PCD_MODULE_ENABLED //Since STM32 v3.10700.191028 this is automatically added if any type of USB is enabled (as in Arduino IDE) #endif -/* #define HAL_HCD_MODULE_ENABLED */ -/* #define HAL_FMPI2C_MODULE_ENABLED */ -/* #define HAL_SPDIFRX_MODULE_ENABLED */ -/* #define HAL_DFSDM_MODULE_ENABLED */ -/* #define HAL_LPTIM_MODULE_ENABLED */ -/* #define HAL_MMC_MODULE_ENABLED */ +//#define HAL_HCD_MODULE_ENABLED +//#define HAL_FMPI2C_MODULE_ENABLED +//#define HAL_SPDIFRX_MODULE_ENABLED +//#define HAL_DFSDM_MODULE_ENABLED +//#define HAL_LPTIM_MODULE_ENABLED +//#define HAL_MMC_MODULE_ENABLED /* ########################## HSE/HSI Values adaptation ##################### */ /** diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F4x7Vx/hal_conf_extra.h b/buildroot/share/PlatformIO/variants/MARLIN_F4x7Vx/hal_conf_extra.h index d3c2f6bd02..abac2b08b3 100644 --- a/buildroot/share/PlatformIO/variants/MARLIN_F4x7Vx/hal_conf_extra.h +++ b/buildroot/share/PlatformIO/variants/MARLIN_F4x7Vx/hal_conf_extra.h @@ -36,53 +36,53 @@ */ #define HAL_MODULE_ENABLED #define HAL_ADC_MODULE_ENABLED -// #define HAL_CAN_MODULE_ENABLED -/* #define HAL_CAN_LEGACY_MODULE_ENABLED */ +//#define HAL_CAN_MODULE_ENABLED +#define HAL_CAN_LEGACY_MODULE_ENABLED #define HAL_CRC_MODULE_ENABLED -// #define HAL_CEC_MODULE_ENABLED -// #define HAL_CRYP_MODULE_ENABLED +//#define HAL_CEC_MODULE_ENABLED +//#define HAL_CRYP_MODULE_ENABLED #define HAL_DAC_MODULE_ENABLED -// #define HAL_DCMI_MODULE_ENABLED +//#define HAL_DCMI_MODULE_ENABLED #define HAL_DMA_MODULE_ENABLED -// #define HAL_DMA2D_MODULE_ENABLED -// #define HAL_ETH_MODULE_ENABLED -// #define HAL_FLASH_MODULE_ENABLED -// #define HAL_NAND_MODULE_ENABLED -// #define HAL_NOR_MODULE_ENABLED -// #define HAL_PCCARD_MODULE_ENABLED -// #define HAL_SRAM_MODULE_ENABLED -// #define HAL_SDRAM_MODULE_ENABLED -// #define HAL_HASH_MODULE_ENABLED +//#define HAL_DMA2D_MODULE_ENABLED +//#define HAL_ETH_MODULE_ENABLED +//#define HAL_FLASH_MODULE_ENABLED +//#define HAL_NAND_MODULE_ENABLED +//#define HAL_NOR_MODULE_ENABLED +//#define HAL_PCCARD_MODULE_ENABLED +//#define HAL_SRAM_MODULE_ENABLED +//#define HAL_SDRAM_MODULE_ENABLED +//#define HAL_HASH_MODULE_ENABLED #define HAL_GPIO_MODULE_ENABLED -// #define HAL_EXTI_MODULE_ENABLED +//#define HAL_EXTI_MODULE_ENABLED #define HAL_I2C_MODULE_ENABLED -// #define HAL_SMBUS_MODULE_ENABLED -// #define HAL_I2S_MODULE_ENABLED -// #define HAL_IWDG_MODULE_ENABLED -// #define HAL_LTDC_MODULE_ENABLED -// #define HAL_DSI_MODULE_ENABLED +//#define HAL_SMBUS_MODULE_ENABLED +//#define HAL_I2S_MODULE_ENABLED +//#define HAL_IWDG_MODULE_ENABLED +//#define HAL_LTDC_MODULE_ENABLED +//#define HAL_DSI_MODULE_ENABLED #define HAL_PWR_MODULE_ENABLED -// #define HAL_QSPI_MODULE_ENABLED +//#define HAL_QSPI_MODULE_ENABLED #define HAL_RCC_MODULE_ENABLED -// #define HAL_RNG_MODULE_ENABLED -// #define HAL_RTC_MODULE_ENABLED -// #define HAL_SAI_MODULE_ENABLED -// #define HAL_SD_MODULE_ENABLED +//#define HAL_RNG_MODULE_ENABLED +//#define HAL_RTC_MODULE_ENABLED +//#define HAL_SAI_MODULE_ENABLED +//#define HAL_SD_MODULE_ENABLED #define HAL_SPI_MODULE_ENABLED #define HAL_TIM_MODULE_ENABLED -// #define HAL_UART_MODULE_ENABLED +//#define HAL_UART_MODULE_ENABLED #define HAL_USART_MODULE_ENABLED -// #define HAL_IRDA_MODULE_ENABLED -// #define HAL_SMARTCARD_MODULE_ENABLED -// #define HAL_WWDG_MODULE_ENABLED +//#define HAL_IRDA_MODULE_ENABLED +//#define HAL_SMARTCARD_MODULE_ENABLED +//#define HAL_WWDG_MODULE_ENABLED #define HAL_CORTEX_MODULE_ENABLED -// #define HAL_PCD_MODULE_ENABLED -// #define HAL_HCD_MODULE_ENABLED -// #define HAL_FMPI2C_MODULE_ENABLED -// #define HAL_SPDIFRX_MODULE_ENABLED -// #define HAL_DFSDM_MODULE_ENABLED -// #define HAL_LPTIM_MODULE_ENABLED -// #define HAL_MMC_MODULE_ENABLED +//#define HAL_PCD_MODULE_ENABLED +//#define HAL_HCD_MODULE_ENABLED +//#define HAL_FMPI2C_MODULE_ENABLED +//#define HAL_SPDIFRX_MODULE_ENABLED +//#define HAL_DFSDM_MODULE_ENABLED +//#define HAL_LPTIM_MODULE_ENABLED +//#define HAL_MMC_MODULE_ENABLED /* ########################## HSE/HSI Values adaptation ##################### */ /** From de1161536bb25743266564d0ecba2554ccbef48e Mon Sep 17 00:00:00 2001 From: MarlinFirmware Date: Thu, 25 Mar 2021 00:27:01 +0000 Subject: [PATCH 201/253] [cron] Bump distribution date (2021-03-25) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 7d3f6d8a64..8ed540d0f6 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2021-03-24" + #define STRING_DISTRIBUTION_DATE "2021-03-25" #endif /** From cfdeab70cdacc9949eadc23b91d8e7c2a1fe63d8 Mon Sep 17 00:00:00 2001 From: espr14 Date: Thu, 25 Mar 2021 04:39:10 +0100 Subject: [PATCH 202/253] Endstops always on after delta homing (#21442) --- Marlin/src/module/delta.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/module/delta.cpp b/Marlin/src/module/delta.cpp index a1676b3ba3..2312e1a012 100644 --- a/Marlin/src/module/delta.cpp +++ b/Marlin/src/module/delta.cpp @@ -253,7 +253,7 @@ void home_delta() { planner.synchronize(); // Re-enable stealthChop if used. Disable diag1 pin on driver. - #if ENABLED(SENSORLESS_HOMING) + #if ENABLED(SENSORLESS_HOMING) && DISABLED(ENDSTOPS_ALWAYS_ON_DEFAULT) TERN_(X_SENSORLESS, end_sensorless_homing_per_axis(X_AXIS, stealth_states_x)); TERN_(Y_SENSORLESS, end_sensorless_homing_per_axis(Y_AXIS, stealth_states_y)); TERN_(Z_SENSORLESS, end_sensorless_homing_per_axis(Z_AXIS, stealth_states_z)); From e989bf3b0ed79156c094f6e298b5ff326a53e3fb Mon Sep 17 00:00:00 2001 From: espr14 Date: Thu, 25 Mar 2021 04:39:29 +0100 Subject: [PATCH 203/253] Endstops always on in G28 (#21441) --- Marlin/src/gcode/calibrate/G28.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/gcode/calibrate/G28.cpp b/Marlin/src/gcode/calibrate/G28.cpp index 9470678872..73bfc3bdc6 100644 --- a/Marlin/src/gcode/calibrate/G28.cpp +++ b/Marlin/src/gcode/calibrate/G28.cpp @@ -102,7 +102,7 @@ current_position.set(0.0, 0.0); - #if ENABLED(SENSORLESS_HOMING) + #if ENABLED(SENSORLESS_HOMING) && DISABLED(ENDSTOPS_ALWAYS_ON_DEFAULT) tmc_disable_stallguard(stepperX, stealth_states.x); tmc_disable_stallguard(stepperY, stealth_states.y); #if AXIS_HAS_STALLGUARD(X2) From 69c6ffa90b017d31bf70dc174c716232ca2752ee Mon Sep 17 00:00:00 2001 From: ldursw <37294448+ldursw@users.noreply.github.com> Date: Thu, 25 Mar 2021 00:40:48 -0300 Subject: [PATCH 204/253] Followup to SDIO patch (#21440) --- Marlin/src/feature/binary_stream.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/feature/binary_stream.h b/Marlin/src/feature/binary_stream.h index 4bfa3998f1..b5d68196ae 100644 --- a/Marlin/src/feature/binary_stream.h +++ b/Marlin/src/feature/binary_stream.h @@ -39,7 +39,7 @@ inline int bs_read_serial(const serial_index_t index) { #if ENABLED(BINARY_STREAM_COMPRESSION) static heatshrink_decoder hsd; - #ifdef BOTH(ARDUINO_ARCH_STM32F1, SDIO_SUPPORT) + #if BOTH(ARDUINO_ARCH_STM32F1, SDIO_SUPPORT) // STM32 requires a word-aligned buffer for SD card transfers via DMA static __attribute__((aligned(sizeof(size_t)))) uint8_t decode_buffer[512] = {}; #else From 8bf6b190ff074ae9aa76734389cf7612a1e0fb0c Mon Sep 17 00:00:00 2001 From: Ramiro Polla Date: Thu, 25 Mar 2021 04:56:48 +0100 Subject: [PATCH 205/253] Optimize LSF for size, efficiency (#21443) --- Marlin/src/libs/least_squares_fit.cpp | 26 +++++++++++++------------- Marlin/src/libs/least_squares_fit.h | 4 +--- 2 files changed, 14 insertions(+), 16 deletions(-) diff --git a/Marlin/src/libs/least_squares_fit.cpp b/Marlin/src/libs/least_squares_fit.cpp index c7593c049f..aac21c0192 100644 --- a/Marlin/src/libs/least_squares_fit.cpp +++ b/Marlin/src/libs/least_squares_fit.cpp @@ -46,23 +46,23 @@ int finish_incremental_LSF(struct linear_fit_data *lsf) { if (N == 0.0) return 1; - lsf->xbar /= N; - lsf->ybar /= N; - lsf->zbar /= N; - lsf->x2bar = lsf->x2bar / N - sq(lsf->xbar); - lsf->y2bar = lsf->y2bar / N - sq(lsf->ybar); - lsf->z2bar = lsf->z2bar / N - sq(lsf->zbar); - lsf->xybar = lsf->xybar / N - lsf->xbar * lsf->ybar; - lsf->yzbar = lsf->yzbar / N - lsf->ybar * lsf->zbar; - lsf->xzbar = lsf->xzbar / N - lsf->xbar * lsf->zbar; - const float DD = lsf->x2bar * lsf->y2bar - sq(lsf->xybar); + const float RN = 1.0f / N, + xbar = lsf->xbar * RN, + ybar = lsf->ybar * RN, + zbar = lsf->zbar * RN, + x2bar = lsf->x2bar * RN - sq(xbar), + y2bar = lsf->y2bar * RN - sq(ybar), + xybar = lsf->xybar * RN - xbar * ybar, + yzbar = lsf->yzbar * RN - ybar * zbar, + xzbar = lsf->xzbar * RN - xbar * zbar, + DD = x2bar * y2bar - sq(xybar); if (ABS(DD) <= 1e-10 * (lsf->max_absx + lsf->max_absy)) return 1; - lsf->A = (lsf->yzbar * lsf->xybar - lsf->xzbar * lsf->y2bar) / DD; - lsf->B = (lsf->xzbar * lsf->xybar - lsf->yzbar * lsf->x2bar) / DD; - lsf->D = -(lsf->zbar + lsf->A * lsf->xbar + lsf->B * lsf->ybar); + lsf->A = (yzbar * xybar - xzbar * y2bar) / DD; + lsf->B = (xzbar * xybar - yzbar * x2bar) / DD; + lsf->D = -(zbar + lsf->A * xbar + lsf->B * ybar); return 0; } diff --git a/Marlin/src/libs/least_squares_fit.h b/Marlin/src/libs/least_squares_fit.h index 44ca8afc76..dbbab0a55e 100644 --- a/Marlin/src/libs/least_squares_fit.h +++ b/Marlin/src/libs/least_squares_fit.h @@ -37,7 +37,7 @@ struct linear_fit_data { float xbar, ybar, zbar, - x2bar, y2bar, z2bar, + x2bar, y2bar, xybar, xzbar, yzbar, max_absx, max_absy, A, B, D, N; @@ -56,7 +56,6 @@ inline void incremental_WLSF(struct linear_fit_data *lsf, const float &x, const lsf->zbar += wz; lsf->x2bar += wx * x; lsf->y2bar += wy * y; - lsf->z2bar += wz * z; lsf->xybar += wx * y; lsf->xzbar += wx * z; lsf->yzbar += wy * z; @@ -74,7 +73,6 @@ inline void incremental_LSF(struct linear_fit_data *lsf, const float &x, const f lsf->zbar += z; lsf->x2bar += sq(x); lsf->y2bar += sq(y); - lsf->z2bar += sq(z); lsf->xybar += x * y; lsf->xzbar += x * z; lsf->yzbar += y * z; From 84b961cb20a4f0b2c1ad67a71d6c507a12f9da2a Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 25 Mar 2021 16:19:03 -0500 Subject: [PATCH 206/253] Define HW serial ports needed for TMC UART (#21446) --- Marlin/src/HAL/DUE/HAL.cpp | 8 +- Marlin/src/HAL/DUE/MarlinSerial.h | 2 +- Marlin/src/HAL/LPC1768/MarlinSerial.cpp | 19 ++-- Marlin/src/HAL/LPC1768/inc/SanityCheck.h | 8 +- Marlin/src/HAL/SAMD51/HAL.cpp | 10 +- Marlin/src/HAL/SAMD51/MarlinSerial_AGCM4.cpp | 6 +- Marlin/src/HAL/STM32/MarlinSerial.cpp | 4 - Marlin/src/inc/Conditionals_adv.h | 6 -- Marlin/src/inc/Conditionals_post.h | 106 +++++++++++++++++++ buildroot/share/extras/header.h | 2 +- 10 files changed, 134 insertions(+), 37 deletions(-) diff --git a/Marlin/src/HAL/DUE/HAL.cpp b/Marlin/src/HAL/DUE/HAL.cpp index 0e4caa47ac..249535723f 100644 --- a/Marlin/src/HAL/DUE/HAL.cpp +++ b/Marlin/src/HAL/DUE/HAL.cpp @@ -106,16 +106,16 @@ uint16_t HAL_adc_get_result() { } // Forward the default serial ports -#if ANY_SERIAL_IS(0) +#if USING_HW_SERIAL0 DefaultSerial1 MSerial0(false, Serial); #endif -#if ANY_SERIAL_IS(1) +#if USING_HW_SERIAL1 DefaultSerial2 MSerial1(false, Serial1); #endif -#if ANY_SERIAL_IS(2) +#if USING_HW_SERIAL2 DefaultSerial3 MSerial2(false, Serial2); #endif -#if ANY_SERIAL_IS(3) +#if USING_HW_SERIAL3 DefaultSerial4 MSerial3(false, Serial3); #endif diff --git a/Marlin/src/HAL/DUE/MarlinSerial.h b/Marlin/src/HAL/DUE/MarlinSerial.h index e74d234b4a..0fb15cf8ad 100644 --- a/Marlin/src/HAL/DUE/MarlinSerial.h +++ b/Marlin/src/HAL/DUE/MarlinSerial.h @@ -140,7 +140,7 @@ struct MarlinSerialCfg { static constexpr bool MAX_RX_QUEUED = ENABLED(SERIAL_STATS_MAX_RX_QUEUED); }; -#if SERIAL_PORT >= 0 +#if defined(SERIAL_PORT) && SERIAL_PORT >= 0 typedef Serial1Class< MarlinSerial< MarlinSerialCfg > > MSerialT; extern MSerialT customizedSerial1; #endif diff --git a/Marlin/src/HAL/LPC1768/MarlinSerial.cpp b/Marlin/src/HAL/LPC1768/MarlinSerial.cpp index be42c7f960..f35328d22f 100644 --- a/Marlin/src/HAL/LPC1768/MarlinSerial.cpp +++ b/Marlin/src/HAL/LPC1768/MarlinSerial.cpp @@ -21,25 +21,26 @@ */ #ifdef TARGET_LPC1768 -#include "../../inc/MarlinConfigPre.h" #include "MarlinSerial.h" -#if ANY_SERIAL_IS(0) +#include "../../inc/MarlinConfig.h" + +#if USING_HW_SERIAL0 MarlinSerial _MSerial(LPC_UART0); MSerialT MSerial0(true, _MSerial); extern "C" void UART0_IRQHandler() { _MSerial.IRQHandler(); } #endif -#if ANY_SERIAL_IS(1) +#if USING_HW_SERIAL1 MarlinSerial _MSerial1((LPC_UART_TypeDef *) LPC_UART1); MSerialT MSerial1(true, _MSerial1); extern "C" void UART1_IRQHandler() { _MSerial1.IRQHandler(); } #endif -#if ANY_SERIAL_IS(2) +#if USING_HW_SERIAL2 MarlinSerial _MSerial2(LPC_UART2); MSerialT MSerial2(true, _MSerial2); extern "C" void UART2_IRQHandler() { _MSerial2.IRQHandler(); } #endif -#if ANY_SERIAL_IS(3) +#if USING_HW_SERIAL3 MarlinSerial _MSerial3(LPC_UART3); MSerialT MSerial3(true, _MSerial3); extern "C" void UART3_IRQHandler() { _MSerial3.IRQHandler(); } @@ -50,16 +51,16 @@ bool MarlinSerial::recv_callback(const char c) { // Need to figure out which serial port we are and react in consequence (Marlin does not have CONTAINER_OF macro) if (false) {} - #if ANY_SERIAL_IS(0) + #if USING_HW_SERIAL0 else if (this == &_MSerial) emergency_parser.update(MSerial0.emergency_state, c); #endif - #if ANY_SERIAL_IS(1) + #if USING_HW_SERIAL1 else if (this == &_MSerial1) emergency_parser.update(MSerial1.emergency_state, c); #endif - #if ANY_SERIAL_IS(2) + #if USING_HW_SERIAL2 else if (this == &_MSerial2) emergency_parser.update(MSerial2.emergency_state, c); #endif - #if ANY_SERIAL_IS(3) + #if USING_HW_SERIAL3 else if (this == &_MSerial3) emergency_parser.update(MSerial3.emergency_state, c); #endif return true; diff --git a/Marlin/src/HAL/LPC1768/inc/SanityCheck.h b/Marlin/src/HAL/LPC1768/inc/SanityCheck.h index dda1c640fa..a6286ba6f4 100644 --- a/Marlin/src/HAL/LPC1768/inc/SanityCheck.h +++ b/Marlin/src/HAL/LPC1768/inc/SanityCheck.h @@ -92,7 +92,7 @@ static_assert(DISABLED(BAUD_RATE_GCODE), "BAUD_RATE_GCODE is not yet supported o #define ANY_TX(N,V...) DO(IS_TX##N,||,V) #define ANY_RX(N,V...) DO(IS_RX##N,||,V) -#if ANY_SERIAL_IS(0) +#if USING_HW_SERIAL0 #define IS_TX0(P) (P == P0_02) #define IS_RX0(P) (P == P0_03) #if IS_TX0(TMC_SW_MISO) || IS_RX0(TMC_SW_MOSI) @@ -106,7 +106,7 @@ static_assert(DISABLED(BAUD_RATE_GCODE), "BAUD_RATE_GCODE is not yet supported o #undef IS_RX0 #endif -#if ANY_SERIAL_IS(1) +#if USING_HW_SERIAL1 #define IS_TX1(P) (P == P0_15) #define IS_RX1(P) (P == P0_16) #define _IS_TX1_1 IS_TX1 @@ -127,7 +127,7 @@ static_assert(DISABLED(BAUD_RATE_GCODE), "BAUD_RATE_GCODE is not yet supported o #undef _IS_RX1_1 #endif -#if ANY_SERIAL_IS(2) +#if USING_HW_SERIAL2 #define IS_TX2(P) (P == P0_10) #define IS_RX2(P) (P == P0_11) #define _IS_TX2_1 IS_TX2 @@ -161,7 +161,7 @@ static_assert(DISABLED(BAUD_RATE_GCODE), "BAUD_RATE_GCODE is not yet supported o #undef _IS_RX2_1 #endif -#if ANY_SERIAL_IS(3) +#if USING_HW_SERIAL3 #define PIN_IS_TX3(P) (PIN_EXISTS(P) && P##_PIN == P0_00) #define PIN_IS_RX3(P) (P##_PIN == P0_01) #if PIN_IS_TX3(X_MIN) || PIN_IS_RX3(X_MAX) diff --git a/Marlin/src/HAL/SAMD51/HAL.cpp b/Marlin/src/HAL/SAMD51/HAL.cpp index 8dd2fefd0a..39167fc467 100644 --- a/Marlin/src/HAL/SAMD51/HAL.cpp +++ b/Marlin/src/HAL/SAMD51/HAL.cpp @@ -25,19 +25,19 @@ #include #ifdef ADAFRUIT_GRAND_CENTRAL_M4 - #if ANY_SERIAL_IS(-1) + #if USING_HW_SERIALUSB DefaultSerial1 MSerial0(false, Serial); #endif - #if ANY_SERIAL_IS(0) + #if USING_HW_SERIAL0 DefaultSerial2 MSerial1(false, Serial1); #endif - #if ANY_SERIAL_IS(1) + #if USING_HW_SERIAL1 DefaultSerial3 MSerial2(false, Serial2); #endif - #if ANY_SERIAL_IS(2) + #if USING_HW_SERIAL2 DefaultSerial4 MSerial3(false, Serial3); #endif - #if ANY_SERIAL_IS(3) + #if USING_HW_SERIAL3 DefaultSerial5 MSerial4(false, Serial4); #endif #endif diff --git a/Marlin/src/HAL/SAMD51/MarlinSerial_AGCM4.cpp b/Marlin/src/HAL/SAMD51/MarlinSerial_AGCM4.cpp index 3f43585cf2..a16ea2f758 100644 --- a/Marlin/src/HAL/SAMD51/MarlinSerial_AGCM4.cpp +++ b/Marlin/src/HAL/SAMD51/MarlinSerial_AGCM4.cpp @@ -27,7 +27,7 @@ #include "../../inc/MarlinConfig.h" -#if ANY_SERIAL_IS(1) +#if USING_HW_SERIAL1 UartT Serial2(false, &sercom4, PIN_SERIAL2_RX, PIN_SERIAL2_TX, PAD_SERIAL2_RX, PAD_SERIAL2_TX); void SERCOM4_0_Handler() { Serial2.IrqHandler(); } void SERCOM4_1_Handler() { Serial2.IrqHandler(); } @@ -35,7 +35,7 @@ void SERCOM4_3_Handler() { Serial2.IrqHandler(); } #endif -#if ANY_SERIAL_IS(2) +#if USING_HW_SERIAL2 UartT Serial3(false, &sercom1, PIN_SERIAL3_RX, PIN_SERIAL3_TX, PAD_SERIAL3_RX, PAD_SERIAL3_TX); void SERCOM1_0_Handler() { Serial3.IrqHandler(); } void SERCOM1_1_Handler() { Serial3.IrqHandler(); } @@ -43,7 +43,7 @@ void SERCOM1_3_Handler() { Serial3.IrqHandler(); } #endif -#if ANY_SERIAL_IS(3) +#if USING_HW_SERIAL3 UartT Serial4(false, &sercom5, PIN_SERIAL4_RX, PIN_SERIAL4_TX, PAD_SERIAL4_RX, PAD_SERIAL4_TX); void SERCOM5_0_Handler() { Serial4.IrqHandler(); } void SERCOM5_1_Handler() { Serial4.IrqHandler(); } diff --git a/Marlin/src/HAL/STM32/MarlinSerial.cpp b/Marlin/src/HAL/STM32/MarlinSerial.cpp index cfb13f5bb5..132c602a0c 100644 --- a/Marlin/src/HAL/STM32/MarlinSerial.cpp +++ b/Marlin/src/HAL/STM32/MarlinSerial.cpp @@ -28,7 +28,6 @@ #ifndef USART4 #define USART4 UART4 #endif - #ifndef USART5 #define USART5 UART5 #endif @@ -43,15 +42,12 @@ #if defined(SERIAL_PORT) && SERIAL_PORT >= 0 DECLARE_SERIAL_PORT_EXP(SERIAL_PORT) #endif - #if defined(SERIAL_PORT_2) && SERIAL_PORT_2 >= 0 DECLARE_SERIAL_PORT_EXP(SERIAL_PORT_2) #endif - #if defined(MMU2_SERIAL_PORT) && MMU2_SERIAL_PORT >= 0 DECLARE_SERIAL_PORT_EXP(MMU2_SERIAL_PORT) #endif - #if defined(LCD_SERIAL_PORT) && LCD_SERIAL_PORT >= 0 DECLARE_SERIAL_PORT_EXP(LCD_SERIAL_PORT) #endif diff --git a/Marlin/src/inc/Conditionals_adv.h b/Marlin/src/inc/Conditionals_adv.h index 5ef0efa968..2177dc4861 100644 --- a/Marlin/src/inc/Conditionals_adv.h +++ b/Marlin/src/inc/Conditionals_adv.h @@ -530,12 +530,6 @@ #define NEED_LSF 1 #endif -// Flag the indexed serial ports that are in use -#define ANY_SERIAL_IS(N) (defined(SERIAL_PORT) && SERIAL_PORT == (N)) || \ - (defined(SERIAL_PORT_2) && SERIAL_PORT_2 == (N)) || \ - (defined(MMU2_SERIAL_PORT) && MMU2_SERIAL_PORT == (N)) || \ - (defined(LCD_SERIAL_PORT) && LCD_SERIAL_PORT == (N)) - #if BOTH(HAS_TFT_LVGL_UI, CUSTOM_MENU_MAIN) #define _HAS_1(N) (defined(USER_DESC_##N) && defined(USER_GCODE_##N)) #define HAS_USER_ITEM(V...) DO(HAS,||,V) diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index 1cd7e5f0e9..84e9cf8955 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -1838,6 +1838,112 @@ #define HAS_TMC_SW_SERIAL 1 #endif +// +// Set USING_HW_SERIALn flags for used Serial Ports +// + +// ... HW_SerialX +#define _SERIAL_ID(P) _CAT(HW_,P) + +// ... (HW_Serial1 == HW_SerialX || HW_Serial1 == HW_MSerialX) +#define _TMC_UART_IS(P,N) ( _SERIAL_ID(P##_HARDWARE_SERIAL) == _SERIAL_ID(Serial##N) || _SERIAL_ID(P) == _SERIAL_ID(MSerial##N) ) +#define TMC_UART_IS(A,N) (defined(A##_HARDWARE_SERIAL) && _TMC_UART_IS(A, N)) + +// Flag the indexed hardware serial ports in use +#define CONF_SERIAL_IS(N) ( (defined(SERIAL_PORT) && SERIAL_PORT == N) \ + || (defined(SERIAL_PORT_2) && SERIAL_PORT_2 == N) \ + || (defined(MMU2_SERIAL_PORT) && MMU2_SERIAL_PORT == N) \ + || (defined(LCD_SERIAL_PORT) && LCD_SERIAL_PORT == N) ) + +// Flag the named hardware serial ports in use +#define ANY_SERIAL_IS(N) ( CONF_SERIAL_IS(N) \ + || TMC_UART_IS(X, N) || TMC_UART_IS(Y , N) || TMC_UART_IS(Z , N) \ + || TMC_UART_IS(X2, N) || TMC_UART_IS(Y2, N) || TMC_UART_IS(Z2, N) || TMC_UART_IS(Z3, N) || TMC_UART_IS(Z4, N) \ + || TMC_UART_IS(E0, N) || TMC_UART_IS(E1, N) || TMC_UART_IS(E2, N) || TMC_UART_IS(E3, N) || TMC_UART_IS(E4, N) ) + +#define HW_Serial 501 +#define HW_Serial0 502 +#define HW_Serial1 503 +#define HW_Serial2 504 +#define HW_Serial3 505 +#define HW_Serial4 506 +#define HW_Serial5 507 +#define HW_Serial6 508 +#define HW_MSerial0 509 +#define HW_MSerial1 510 +#define HW_MSerial2 511 +#define HW_MSerial3 512 +#define HW_MSerial4 513 +#define HW_MSerial5 514 +#define HW_MSerial6 515 +#define HW_MSerial7 516 +#define HW_MSerial8 517 +#define HW_MSerial9 518 +#define HW_MSerial10 519 + +#if CONF_SERIAL_IS(-1) + #define USING_HW_SERIALUSB 1 +#endif +#if ANY_SERIAL_IS(0) + #define USING_HW_SERIAL0 1 +#endif +#if ANY_SERIAL_IS(1) + #define USING_HW_SERIAL1 1 +#endif +#if ANY_SERIAL_IS(2) + #define USING_HW_SERIAL2 1 +#endif +#if ANY_SERIAL_IS(3) + #define USING_HW_SERIAL3 1 +#endif +#if ANY_SERIAL_IS(4) + #define USING_HW_SERIAL4 1 +#endif +#if ANY_SERIAL_IS(5) + #define USING_HW_SERIAL5 1 +#endif +#if ANY_SERIAL_IS(6) + #define USING_HW_SERIAL6 1 +#endif +#if ANY_SERIAL_IS(7) + #define USING_HW_SERIAL7 1 +#endif +#if ANY_SERIAL_IS(8) + #define USING_HW_SERIAL8 1 +#endif +#if ANY_SERIAL_IS(9) + #define USING_HW_SERIAL9 1 +#endif +#if ANY_SERIAL_IS(10) + #define USING_HW_SERIAL10 1 +#endif + +#undef HW_Serial +#undef HW_Serial0 +#undef HW_Serial1 +#undef HW_Serial2 +#undef HW_Serial3 +#undef HW_Serial4 +#undef HW_Serial5 +#undef HW_Serial6 +#undef HW_MSerial0 +#undef HW_MSerial1 +#undef HW_MSerial2 +#undef HW_MSerial3 +#undef HW_MSerial4 +#undef HW_MSerial5 +#undef HW_MSerial6 +#undef HW_MSerial7 +#undef HW_MSerial8 +#undef HW_MSerial9 +#undef HW_MSerial10 + +#undef _SERIAL_ID +#undef _TMC_UART_IS +#undef TMC_UART_IS +#undef CONF_SERIAL_IS +#undef ANY_SERIAL_IS + // // Endstops and bed probe // diff --git a/buildroot/share/extras/header.h b/buildroot/share/extras/header.h index 5d2c73dfbe..e40471dfac 100644 --- a/buildroot/share/extras/header.h +++ b/buildroot/share/extras/header.h @@ -1,6 +1,6 @@ /** * Marlin 3D Printer Firmware - * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] + * Copyright (c) 2021 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm From 704b8cd83c507675d6f71621e1c35172779ac9d1 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 25 Mar 2021 16:49:04 -0500 Subject: [PATCH 207/253] Apply TMC UART to STM32, simplify --- Marlin/src/HAL/DUE/MarlinSerial.cpp | 2 +- Marlin/src/HAL/STM32/MarlinSerial.cpp | 39 ++++++++++++++++++++------- Marlin/src/inc/Conditionals_post.h | 8 +----- 3 files changed, 31 insertions(+), 18 deletions(-) diff --git a/Marlin/src/HAL/DUE/MarlinSerial.cpp b/Marlin/src/HAL/DUE/MarlinSerial.cpp index 50b84c0b1d..5b333fbeb5 100644 --- a/Marlin/src/HAL/DUE/MarlinSerial.cpp +++ b/Marlin/src/HAL/DUE/MarlinSerial.cpp @@ -476,7 +476,7 @@ void MarlinSerial::flushTX() { // If not using the USB port as serial port -#if SERIAL_PORT >= 0 +#if defined(SERIAL_PORT) && SERIAL_PORT >= 0 template class MarlinSerial< MarlinSerialCfg >; MSerialT customizedSerial1(MarlinSerialCfg::EMERGENCYPARSER); #endif diff --git a/Marlin/src/HAL/STM32/MarlinSerial.cpp b/Marlin/src/HAL/STM32/MarlinSerial.cpp index 132c602a0c..265e8b5ab6 100644 --- a/Marlin/src/HAL/STM32/MarlinSerial.cpp +++ b/Marlin/src/HAL/STM32/MarlinSerial.cpp @@ -37,19 +37,38 @@ MSerialT MSerial ## ser_num (true, USART ## ser_num, &_rx_complete_irq_ ## ser_num); \ void _rx_complete_irq_ ## ser_num (serial_t * obj) { MSerial ## ser_num ._rx_complete_irq(obj); } -#define DECLARE_SERIAL_PORT_EXP(ser_num) DECLARE_SERIAL_PORT(ser_num) - -#if defined(SERIAL_PORT) && SERIAL_PORT >= 0 - DECLARE_SERIAL_PORT_EXP(SERIAL_PORT) +#if USING_HW_SERIAL1 + DECLARE_SERIAL_PORT(1) #endif -#if defined(SERIAL_PORT_2) && SERIAL_PORT_2 >= 0 - DECLARE_SERIAL_PORT_EXP(SERIAL_PORT_2) +#if USING_HW_SERIAL2 + DECLARE_SERIAL_PORT(2) #endif -#if defined(MMU2_SERIAL_PORT) && MMU2_SERIAL_PORT >= 0 - DECLARE_SERIAL_PORT_EXP(MMU2_SERIAL_PORT) +#if USING_HW_SERIAL3 + DECLARE_SERIAL_PORT(3) #endif -#if defined(LCD_SERIAL_PORT) && LCD_SERIAL_PORT >= 0 - DECLARE_SERIAL_PORT_EXP(LCD_SERIAL_PORT) +#if USING_HW_SERIAL4 + DECLARE_SERIAL_PORT(4) +#endif +#if USING_HW_SERIAL5 + DECLARE_SERIAL_PORT(5) +#endif +#if USING_HW_SERIAL6 + DECLARE_SERIAL_PORT(6) +#endif +#if USING_HW_SERIAL7 + DECLARE_SERIAL_PORT(7) +#endif +#if USING_HW_SERIAL8 + DECLARE_SERIAL_PORT(8) +#endif +#if USING_HW_SERIAL9 + DECLARE_SERIAL_PORT(9) +#endif +#if USING_HW_SERIAL10 + DECLARE_SERIAL_PORT(10) +#endif +#if USING_HW_SERIALLP1 + DECLARE_SERIAL_PORT(LP1) #endif void MarlinSerial::begin(unsigned long baud, uint8_t config) { diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index 84e9cf8955..2433050528 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -1842,13 +1842,6 @@ // Set USING_HW_SERIALn flags for used Serial Ports // -// ... HW_SerialX -#define _SERIAL_ID(P) _CAT(HW_,P) - -// ... (HW_Serial1 == HW_SerialX || HW_Serial1 == HW_MSerialX) -#define _TMC_UART_IS(P,N) ( _SERIAL_ID(P##_HARDWARE_SERIAL) == _SERIAL_ID(Serial##N) || _SERIAL_ID(P) == _SERIAL_ID(MSerial##N) ) -#define TMC_UART_IS(A,N) (defined(A##_HARDWARE_SERIAL) && _TMC_UART_IS(A, N)) - // Flag the indexed hardware serial ports in use #define CONF_SERIAL_IS(N) ( (defined(SERIAL_PORT) && SERIAL_PORT == N) \ || (defined(SERIAL_PORT_2) && SERIAL_PORT_2 == N) \ @@ -1856,6 +1849,7 @@ || (defined(LCD_SERIAL_PORT) && LCD_SERIAL_PORT == N) ) // Flag the named hardware serial ports in use +#define TMC_UART_IS(A,N) (defined(A##_HARDWARE_SERIAL) && (CAT(HW_,A##_HARDWARE_SERIAL) == HW_Serial##N || CAT(HW_,A##_HARDWARE_SERIAL) == HW_MSerial##N)) #define ANY_SERIAL_IS(N) ( CONF_SERIAL_IS(N) \ || TMC_UART_IS(X, N) || TMC_UART_IS(Y , N) || TMC_UART_IS(Z , N) \ || TMC_UART_IS(X2, N) || TMC_UART_IS(Y2, N) || TMC_UART_IS(Z2, N) || TMC_UART_IS(Z3, N) || TMC_UART_IS(Z4, N) \ From 8a67846872d1748611c0a32a246310df7ffc4d6a Mon Sep 17 00:00:00 2001 From: Tomas Rimkus Date: Fri, 26 Mar 2021 01:16:45 +0100 Subject: [PATCH 208/253] Avoid watchdog reset in all wired EEPROMs (#21436) Co-authored-by: Scott Lahteine --- Marlin/src/HAL/AVR/eeprom.cpp | 6 +++--- Marlin/src/HAL/DUE/eeprom_flash.cpp | 7 +++---- Marlin/src/HAL/DUE/eeprom_wired.cpp | 7 +++---- Marlin/src/HAL/LPC1768/eeprom_wired.cpp | 12 ++++-------- Marlin/src/HAL/SAMD51/eeprom_wired.cpp | 5 +++-- Marlin/src/HAL/STM32/eeprom_wired.cpp | 11 ++++------- Marlin/src/HAL/STM32F1/eeprom_bl24cxx.cpp | 9 +++------ Marlin/src/HAL/STM32F1/eeprom_wired.cpp | 6 +++--- Marlin/src/HAL/TEENSY31_32/eeprom.cpp | 14 +++++++------- Marlin/src/HAL/TEENSY35_36/eeprom.cpp | 6 +++--- Marlin/src/HAL/TEENSY40_41/eeprom.cpp | 14 +++++++------- 11 files changed, 43 insertions(+), 54 deletions(-) diff --git a/Marlin/src/HAL/AVR/eeprom.cpp b/Marlin/src/HAL/AVR/eeprom.cpp index ee2a73e410..8d084dec7f 100644 --- a/Marlin/src/HAL/AVR/eeprom.cpp +++ b/Marlin/src/HAL/AVR/eeprom.cpp @@ -40,13 +40,13 @@ bool PersistentStore::access_start() { return true; } bool PersistentStore::access_finish() { return true; } bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { + uint16_t written = 0; while (size--) { uint8_t * const p = (uint8_t * const)pos; uint8_t v = *value; - // EEPROM has only ~100,000 write cycles, - // so only write bytes that have changed! - if (v != eeprom_read_byte(p)) { + if (v != eeprom_read_byte(p)) { // EEPROM has only ~100,000 write cycles, so only write bytes that have changed! eeprom_write_byte(p, v); + if (++written & 0x7F) delay(2); else safe_delay(2); // Avoid triggering watchdog during long EEPROM writes if (eeprom_read_byte(p) != v) { SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE); return true; diff --git a/Marlin/src/HAL/DUE/eeprom_flash.cpp b/Marlin/src/HAL/DUE/eeprom_flash.cpp index 209a5161ae..738f44acc9 100644 --- a/Marlin/src/HAL/DUE/eeprom_flash.cpp +++ b/Marlin/src/HAL/DUE/eeprom_flash.cpp @@ -976,14 +976,13 @@ bool PersistentStore::access_start() { ee_Init(); return true; } bool PersistentStore::access_finish() { ee_Flush(); return true; } bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { + uint16_t written = 0; while (size--) { uint8_t * const p = (uint8_t * const)pos; uint8_t v = *value; - // EEPROM has only ~100,000 write cycles, - // so only write bytes that have changed! - if (v != ee_Read(uint32_t(p))) { + if (v != ee_Read(uint32_t(p))) { // EEPROM has only ~100,000 write cycles, so only write bytes that have changed! ee_Write(uint32_t(p), v); - delay(2); + if (++written & 0x7F) delay(2); else safe_delay(2); // Avoid triggering watchdog during long EEPROM writes if (ee_Read(uint32_t(p)) != v) { SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE); return true; diff --git a/Marlin/src/HAL/DUE/eeprom_wired.cpp b/Marlin/src/HAL/DUE/eeprom_wired.cpp index b488c36f16..557a2f2cff 100644 --- a/Marlin/src/HAL/DUE/eeprom_wired.cpp +++ b/Marlin/src/HAL/DUE/eeprom_wired.cpp @@ -42,14 +42,13 @@ bool PersistentStore::access_start() { eeprom_init(); return true; } bool PersistentStore::access_finish() { return true; } bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { + uint16_t written = 0; while (size--) { uint8_t * const p = (uint8_t * const)pos; uint8_t v = *value; - // EEPROM has only ~100,000 write cycles, - // so only write bytes that have changed! - if (v != eeprom_read_byte(p)) { + if (v != eeprom_read_byte(p)) { // EEPROM has only ~100,000 write cycles, so only write bytes that have changed! eeprom_write_byte(p, v); - delay(2); + if (++written & 0x7F) delay(2); else safe_delay(2); // Avoid triggering watchdog during long EEPROM writes if (eeprom_read_byte(p) != v) { SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE); return true; diff --git a/Marlin/src/HAL/LPC1768/eeprom_wired.cpp b/Marlin/src/HAL/LPC1768/eeprom_wired.cpp index d94aba6119..f9286a74ac 100644 --- a/Marlin/src/HAL/LPC1768/eeprom_wired.cpp +++ b/Marlin/src/HAL/LPC1768/eeprom_wired.cpp @@ -42,25 +42,22 @@ bool PersistentStore::access_start() { eeprom_init(); return true; } bool PersistentStore::access_finish() { return true; } bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { + uint16_t written = 0; while (size--) { uint8_t v = *value; - - // EEPROM has only ~100,000 write cycles, - // so only write bytes that have changed! uint8_t * const p = (uint8_t * const)pos; - if (v != eeprom_read_byte(p)) { + if (v != eeprom_read_byte(p)) { // EEPROM has only ~100,000 write cycles, so only write bytes that have changed! eeprom_write_byte(p, v); + if (++written & 0x7F) delay(2); else safe_delay(2); // Avoid triggering watchdog during long EEPROM writes if (eeprom_read_byte(p) != v) { SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE); return true; } } - crc16(crc, &v, 1); pos++; value++; - }; - + } return false; } @@ -68,7 +65,6 @@ bool PersistentStore::read_data(int &pos, uint8_t *value, size_t size, uint16_t do { // Read from external EEPROM const uint8_t c = eeprom_read_byte((uint8_t*)pos); - if (writing) *value = c; crc16(crc, &c, 1); pos++; diff --git a/Marlin/src/HAL/SAMD51/eeprom_wired.cpp b/Marlin/src/HAL/SAMD51/eeprom_wired.cpp index d9a0225a7a..3481fe539c 100644 --- a/Marlin/src/HAL/SAMD51/eeprom_wired.cpp +++ b/Marlin/src/HAL/SAMD51/eeprom_wired.cpp @@ -41,12 +41,13 @@ bool PersistentStore::access_start() { eeprom_init(); return true; } bool PersistentStore::access_finish() { return true; } bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { + uint16_t written = 0; while (size--) { const uint8_t v = *value; uint8_t * const p = (uint8_t * const)pos; - if (v != eeprom_read_byte(p)) { + if (v != eeprom_read_byte(p)) { // EEPROM has only ~100,000 write cycles, so only write bytes that have changed! eeprom_write_byte(p, v); - delay(2); + if (++written & 0x7F) delay(2); else safe_delay(2); // Avoid triggering watchdog during long EEPROM writes if (eeprom_read_byte(p) != v) { SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE); return true; diff --git a/Marlin/src/HAL/STM32/eeprom_wired.cpp b/Marlin/src/HAL/STM32/eeprom_wired.cpp index ad54c12c47..6aa2f1d360 100644 --- a/Marlin/src/HAL/STM32/eeprom_wired.cpp +++ b/Marlin/src/HAL/STM32/eeprom_wired.cpp @@ -43,25 +43,22 @@ bool PersistentStore::access_start() { eeprom_init(); return true; } bool PersistentStore::access_finish() { return true; } bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { + uint16_t written = 0; while (size--) { uint8_t v = *value; - - // EEPROM has only ~100,000 write cycles, - // so only write bytes that have changed! uint8_t * const p = (uint8_t * const)pos; - if (v != eeprom_read_byte(p)) { + if (v != eeprom_read_byte(p)) { // EEPROM has only ~100,000 write cycles, so only write bytes that have changed! eeprom_write_byte(p, v); + if (++written & 0x7F) delay(2); else safe_delay(2); // Avoid triggering watchdog during long EEPROM writes if (eeprom_read_byte(p) != v) { SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE); return true; } } - crc16(crc, &v, 1); pos++; value++; - }; - + } return false; } diff --git a/Marlin/src/HAL/STM32F1/eeprom_bl24cxx.cpp b/Marlin/src/HAL/STM32F1/eeprom_bl24cxx.cpp index a6395698aa..4e25bc69da 100644 --- a/Marlin/src/HAL/STM32F1/eeprom_bl24cxx.cpp +++ b/Marlin/src/HAL/STM32F1/eeprom_bl24cxx.cpp @@ -19,14 +19,13 @@ * along with this program. If not, see . * */ +#ifdef __STM32F1__ /** * PersistentStore for Arduino-style EEPROM interface * with simple implementations supplied by Marlin. */ -#ifdef __STM32F1__ - #include "../../inc/MarlinConfig.h" #if ENABLED(IIC_BL24CXX_EEPROM) @@ -48,13 +47,11 @@ bool PersistentStore::access_start() { eeprom_init(); return true; } bool PersistentStore::access_finish() { return true; } bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { - size_t written = 0; + uint16_t written = 0; while (size--) { uint8_t v = *value; uint8_t * const p = (uint8_t * const)pos; - // EEPROM has only ~100,000 write cycles, - // so only write bytes that have changed! - if (v != eeprom_read_byte(p)) { + if (v != eeprom_read_byte(p)) { // EEPROM has only ~100,000 write cycles, so only write bytes that have changed! eeprom_write_byte(p, v); if (++written & 0x7F) delay(2); else safe_delay(2); // Avoid triggering watchdog during long EEPROM writes if (eeprom_read_byte(p) != v) { diff --git a/Marlin/src/HAL/STM32F1/eeprom_wired.cpp b/Marlin/src/HAL/STM32F1/eeprom_wired.cpp index 16cfc24af6..0ad69065cf 100644 --- a/Marlin/src/HAL/STM32F1/eeprom_wired.cpp +++ b/Marlin/src/HAL/STM32F1/eeprom_wired.cpp @@ -52,13 +52,13 @@ bool PersistentStore::access_start() { } bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { + uint16_t written = 0; while (size--) { uint8_t * const p = (uint8_t * const)pos; uint8_t v = *value; - // EEPROM has only ~100,000 write cycles, - // so only write bytes that have changed! - if (v != eeprom_read_byte(p)) { + if (v != eeprom_read_byte(p)) { // EEPROM has only ~100,000 write cycles, so only write bytes that have changed! eeprom_write_byte(p, v); + if (++written & 0x7F) delay(2); else safe_delay(2); // Avoid triggering watchdog during long EEPROM writes if (eeprom_read_byte(p) != v) { SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE); return true; diff --git a/Marlin/src/HAL/TEENSY31_32/eeprom.cpp b/Marlin/src/HAL/TEENSY31_32/eeprom.cpp index f2ae5dd534..85febebebc 100644 --- a/Marlin/src/HAL/TEENSY31_32/eeprom.cpp +++ b/Marlin/src/HAL/TEENSY31_32/eeprom.cpp @@ -18,14 +18,14 @@ */ #ifdef __MK20DX256__ -#include "../../inc/MarlinConfig.h" - -#if USE_WIRED_EEPROM - /** * HAL PersistentStore for Teensy 3.2 (MK20DX256) */ +#include "../../inc/MarlinConfig.h" + +#if USE_WIRED_EEPROM + #include "../shared/eeprom_api.h" #include @@ -38,13 +38,13 @@ bool PersistentStore::access_start() { return true; } bool PersistentStore::access_finish() { return true; } bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { + uint16_t written = 0; while (size--) { uint8_t * const p = (uint8_t * const)pos; uint8_t v = *value; - // EEPROM has only ~100,000 write cycles, - // so only write bytes that have changed! - if (v != eeprom_read_byte(p)) { + if (v != eeprom_read_byte(p)) { // EEPROM has only ~100,000 write cycles, so only write bytes that have changed! eeprom_write_byte(p, v); + if (++written & 0x7F) delay(2); else safe_delay(2); // Avoid triggering watchdog during long EEPROM writes if (eeprom_read_byte(p) != v) { SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE); return true; diff --git a/Marlin/src/HAL/TEENSY35_36/eeprom.cpp b/Marlin/src/HAL/TEENSY35_36/eeprom.cpp index 8cd6b4ff41..b80e93b536 100644 --- a/Marlin/src/HAL/TEENSY35_36/eeprom.cpp +++ b/Marlin/src/HAL/TEENSY35_36/eeprom.cpp @@ -42,13 +42,13 @@ bool PersistentStore::access_start() { return true; } bool PersistentStore::access_finish() { return true; } bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { + uint16_t written = 0; while (size--) { uint8_t * const p = (uint8_t * const)pos; uint8_t v = *value; - // EEPROM has only ~100,000 write cycles, - // so only write bytes that have changed! - if (v != eeprom_read_byte(p)) { + if (v != eeprom_read_byte(p)) { // EEPROM has only ~100,000 write cycles, so only write bytes that have changed! eeprom_write_byte(p, v); + if (++written & 0x7F) delay(2); else safe_delay(2); // Avoid triggering watchdog during long EEPROM writes if (eeprom_read_byte(p) != v) { SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE); return true; diff --git a/Marlin/src/HAL/TEENSY40_41/eeprom.cpp b/Marlin/src/HAL/TEENSY40_41/eeprom.cpp index fe2de388a7..3cd376edce 100644 --- a/Marlin/src/HAL/TEENSY40_41/eeprom.cpp +++ b/Marlin/src/HAL/TEENSY40_41/eeprom.cpp @@ -22,14 +22,14 @@ */ #ifdef __IMXRT1062__ -#include "../../inc/MarlinConfig.h" - -#if USE_WIRED_EEPROM - /** * HAL PersistentStore for Teensy 4.0 (IMXRT1062DVL6A) / 4.1 (IMXRT1062DVJ6A) */ +#include "../../inc/MarlinConfig.h" + +#if USE_WIRED_EEPROM + #include "../shared/eeprom_api.h" #include @@ -42,13 +42,13 @@ bool PersistentStore::access_start() { return true; } bool PersistentStore::access_finish() { return true; } bool PersistentStore::write_data(int &pos, const uint8_t *value, size_t size, uint16_t *crc) { + uint16_t written = 0; while (size--) { uint8_t * const p = (uint8_t * const)pos; uint8_t v = *value; - // EEPROM has only ~100,000 write cycles, - // so only write bytes that have changed! - if (v != eeprom_read_byte(p)) { + if (v != eeprom_read_byte(p)) { // EEPROM has only ~100,000 write cycles, so only write bytes that have changed! eeprom_write_byte(p, v); + if (++written & 0x7F) delay(2); else safe_delay(2); // Avoid triggering watchdog during long EEPROM writes if (eeprom_read_byte(p) != v) { SERIAL_ECHO_MSG(STR_ERR_EEPROM_WRITE); return true; From c55d53daa649c93d71a314726fd287c056975a23 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Fri, 26 Mar 2021 00:31:14 +0000 Subject: [PATCH 209/253] [cron] Bump distribution date (2021-03-26) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 8ed540d0f6..08ded6d031 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2021-03-25" + #define STRING_DISTRIBUTION_DATE "2021-03-26" #endif /** From 241d2e3fa38aad0396d29a339def244bc23ea47b Mon Sep 17 00:00:00 2001 From: Vert <45634861+Vertabreak@users.noreply.github.com> Date: Thu, 25 Mar 2021 21:44:35 -0400 Subject: [PATCH 210/253] Fix for YHCB2004 (#21450) --- Marlin/src/pins/mega/pins_GT2560_V3.h | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/Marlin/src/pins/mega/pins_GT2560_V3.h b/Marlin/src/pins/mega/pins_GT2560_V3.h index 65642464d9..11824fae4a 100644 --- a/Marlin/src/pins/mega/pins_GT2560_V3.h +++ b/Marlin/src/pins/mega/pins_GT2560_V3.h @@ -158,12 +158,15 @@ #if ENABLED(YHCB2004) #ifndef YHCB2004_CLK #define YHCB2004_CLK 5 + #define DIO52 YHCB2004_CLK #endif #ifndef YHCB2004_MOSI - #define YHCB2004_MOSI 21 + #define YHCB2004_MOSI 36 + #define DIO51 YHCB2004_MOSI #endif #ifndef YHCB2004_MISO - #define YHCB2004_MISO 36 + #define YHCB2004_MISO 21 + #define DIO50 YHCB2004_MISO #endif #elif HAS_WIRED_LCD #ifndef LCD_PINS_RS @@ -206,4 +209,4 @@ #ifndef BTN_ENC #define BTN_ENC 19 #endif -#endif +#endif \ No newline at end of file From 532df198da6a9cadb441a1993b4b482e69e317ce Mon Sep 17 00:00:00 2001 From: Leoric Date: Fri, 26 Mar 2021 23:41:55 +0300 Subject: [PATCH 211/253] MKS UI: Monitor state when idle (#21452) Co-authored-by: Scott Lahteine --- .../src/lcd/extui/lib/mks_ui/draw_dialog.cpp | 7 + Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.h | 5 - .../lcd/extui/lib/mks_ui/draw_printing.cpp | 2 +- .../lcd/extui/lib/mks_ui/draw_ready_print.cpp | 184 ++++++++++++------ .../extui/lib/mks_ui/tft_multi_language.cpp | 6 +- .../lcd/extui/lib/mks_ui/tft_multi_language.h | 1 + 6 files changed, 141 insertions(+), 64 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp index 3fed4cc385..c4ae6e221d 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp @@ -65,6 +65,13 @@ extern uint32_t upload_time; extern uint32_t upload_size; extern bool temps_update_flag; +//#define CANCEL_ON_RIGHT // Put 'Cancel' on the right (as it was before) + +#define BTN_OK_X TERN(CANCEL_ON_RIGHT, 100, 280) +#define BTN_CANCEL_X TERN(CANCEL_ON_RIGHT, 280, 100) +#define BTN_OK_Y 180 +#define BTN_CANCEL_Y 180 + static void btn_ok_event_cb(lv_obj_t *btn, lv_event_t event) { if (event != LV_EVENT_RELEASED) return; if (DIALOG_IS(TYPE_PRINT_FILE)) { diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.h index c43a79a141..38f5fa0635 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.h @@ -74,11 +74,6 @@ enum { DIALOG_TRANSFER_NO_DEVICE }; -#define BTN_OK_X 100 -#define BTN_OK_Y 180 -#define BTN_CANCEL_X 280 -#define BTN_CANCEL_Y 180 - extern void lv_draw_dialog(uint8_t type); extern void lv_clear_dialog(); extern void filament_sprayer_temp(); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp index e9e501ae5f..70c57f4af8 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp @@ -222,7 +222,7 @@ void disp_bed_temp() { } void disp_fan_speed() { - sprintf_P(public_buf_l, PSTR("%3d"), thermalManager.fan_speed[0]); + sprintf_P(public_buf_l, PSTR("%d%%"), thermalManager.fanPercent(thermalManager.fan_speed[0])); lv_label_set_text(labelFan, public_buf_l); } diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp index 7554f746ca..acdfa24f1b 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp @@ -42,32 +42,36 @@ #include +#define ICON_POS_Y 38 +#define TARGET_LABEL_MOD_Y -36 +#define LABEL_MOD_Y 30 +#define SECOND_EXT_MOD_Y 100 + extern lv_group_t* g; static lv_obj_t *scr; +static lv_obj_t *labelExt1, *labelExt1Target, *labelFan; + +#if HAS_MULTI_EXTRUDER + static lv_obj_t *labelExt2, *labelExt2Target; +#endif + +#if HAS_HEATED_BED + static lv_obj_t *labelBed, *labelBedTarget; +#endif + #if ENABLED(MKS_TEST) uint8_t curent_disp_ui = 0; #endif -enum { - ID_TOOL = 1, - ID_SET, - ID_PRINT -}; +enum { ID_TOOL = 1, ID_SET, ID_PRINT }; static void event_handler(lv_obj_t *obj, lv_event_t event) { if (event != LV_EVENT_RELEASED) return; lv_clear_ready_print(); - switch (obj->mks_obj_id) { - case ID_TOOL: - lv_draw_tool(); - break; - case ID_SET: - lv_draw_set(); - break; - case ID_PRINT: - lv_draw_print_file(); - break; + case ID_TOOL: lv_draw_tool(); break; + case ID_SET: lv_draw_set(); break; + case ID_PRINT: lv_draw_print_file(); break; } } @@ -98,14 +102,14 @@ void disp_det_error() { lv_obj_t *e1, *e2, *e3, *bed; void mks_disp_test() { char buf[30] = {0}; - sprintf_P(buf, PSTR("e1:%d"), (int)thermalManager.degHotend(0)); + sprintf_P(buf, PSTR("e1:%d"), thermalManager.degHotend(0)); lv_label_set_text(e1, buf); #if HAS_MULTI_HOTEND - sprintf_P(buf, PSTR("e2:%d"), (int)thermalManager.degHotend(1)); + sprintf_P(buf, PSTR("e2:%d"), thermalManager.degHotend(1)); lv_label_set_text(e2, buf); #endif #if HAS_HEATED_BED - sprintf_P(buf, PSTR("bed:%d"), (int)thermalManager.temp_bed.celsius); + sprintf_P(buf, PSTR("bed:%d"), thermalManager.degBed()); lv_label_set_text(bed, buf); #endif } @@ -130,53 +134,123 @@ void lv_draw_ready_print() { lv_obj_align(label_tool, buttonTool, LV_ALIGN_IN_BOTTOM_MID, 0, BUTTON_TEXT_Y_OFFSET); } - #if 1 - e1 = lv_label_create_empty(scr); - lv_obj_set_pos(e1, 20, 20); - sprintf_P(buf, PSTR("e1: %d"), (int)thermalManager.degHotend(0)); - lv_label_set_text(e1, buf); - #if HAS_MULTI_HOTEND - e2 = lv_label_create_empty(scr); - lv_obj_set_pos(e2, 20, 45); - sprintf_P(buf, PSTR("e1: %d"), (int)thermalManager.degHotend(1)); - lv_label_set_text(e2, buf); - #endif + e1 = lv_label_create_empty(scr); + lv_obj_set_pos(e1, 20, 20); + sprintf_P(buf, PSTR("e1: %d"), thermalManager.degHotend(0)); + lv_label_set_text(e1, buf); - #if HAS_HEATED_BED - bed = lv_label_create_empty(scr); - lv_obj_set_pos(bed, 20, 95); - sprintf_P(buf, PSTR("bed: %d"), (int)thermalManager.temp_bed.celsius); - lv_label_set_text(bed, buf); - #endif + #if HAS_MULTI_HOTEND + e2 = lv_label_create_empty(scr); + lv_obj_set_pos(e2, 20, 45); + sprintf_P(buf, PSTR("e1: %d"), thermalManager.degHotend(1)); + lv_label_set_text(e2, buf); + #endif - limit_info = lv_label_create_empty(scr); + #if HAS_HEATED_BED + bed = lv_label_create_empty(scr); + lv_obj_set_pos(bed, 20, 95); + sprintf_P(buf, PSTR("bed: %d"), thermalManager.degBed()); + lv_label_set_text(bed, buf); + #endif - lv_style_copy(&limit_style, &lv_style_scr); - limit_style.body.main_color.full = 0x0000; - limit_style.body.grad_color.full = 0x0000; - limit_style.text.color.full = 0xffff; - lv_obj_set_style(limit_info, &limit_style); + limit_info = lv_label_create_empty(scr); - lv_obj_set_pos(limit_info, 20, 120); - lv_label_set_text(limit_info, " "); + lv_style_copy(&limit_style, &lv_style_scr); + limit_style.body.main_color.full = 0x0000; + limit_style.body.grad_color.full = 0x0000; + limit_style.text.color.full = 0xFFFF; + lv_obj_set_style(limit_info, &limit_style); - det_info = lv_label_create_empty(scr); + lv_obj_set_pos(limit_info, 20, 120); + lv_label_set_text(limit_info, " "); - lv_style_copy(&det_style, &lv_style_scr); - det_style.body.main_color.full = 0x0000; - det_style.body.grad_color.full = 0x0000; - det_style.text.color.full = 0xffff; - lv_obj_set_style(det_info, &det_style); + det_info = lv_label_create_empty(scr); - lv_obj_set_pos(det_info, 20, 145); - lv_label_set_text(det_info, " "); - #endif // if 1 + lv_style_copy(&det_style, &lv_style_scr); + det_style.body.main_color.full = 0x0000; + det_style.body.grad_color.full = 0x0000; + det_style.text.color.full = 0xFFFF; + lv_obj_set_style(det_info, &det_style); + lv_obj_set_pos(det_info, 20, 145); + lv_label_set_text(det_info, " "); } else { - lv_big_button_create(scr, "F:/bmp_tool.bin", main_menu.tool, 20, 90, event_handler, ID_TOOL); - lv_big_button_create(scr, "F:/bmp_set.bin", main_menu.set, 180, 90, event_handler, ID_SET); - lv_big_button_create(scr, "F:/bmp_printing.bin", main_menu.print, 340, 90, event_handler, ID_PRINT); + lv_big_button_create(scr, "F:/bmp_tool.bin", main_menu.tool, 20, 180, event_handler, ID_TOOL); + lv_big_button_create(scr, "F:/bmp_set.bin", main_menu.set, 180, 180, event_handler, ID_SET); + lv_big_button_create(scr, "F:/bmp_printing.bin", main_menu.print, 340, 180, event_handler, ID_PRINT); + + // Monitoring + lv_obj_t *buttonExt1 = lv_img_create(scr, NULL); + #if HAS_MULTI_EXTRUDER + lv_obj_t *buttonExt2 = lv_img_create(scr, NULL); + #endif + #if HAS_HEATED_BED + lv_obj_t *buttonBedstate = lv_img_create(scr, NULL); + #endif + lv_obj_t *buttonFanstate = lv_img_create(scr, NULL); + + lv_img_set_src(buttonExt1, "F:/bmp_ext1_state.bin"); + #if HAS_MULTI_EXTRUDER + lv_img_set_src(buttonExt2, "F:/bmp_ext2_state.bin"); + #endif + #if HAS_HEATED_BED + lv_img_set_src(buttonBedstate, "F:/bmp_bed_state.bin"); + #endif + lv_img_set_src(buttonFanstate, "F:/bmp_fan_state.bin"); + + lv_obj_set_pos(buttonExt1, 55, ICON_POS_Y); + #if HAS_MULTI_EXTRUDER + lv_obj_set_pos(buttonExt2, 55, ICON_POS_Y + SECOND_EXT_MOD_Y); + #endif + #if HAS_HEATED_BED + lv_obj_set_pos(buttonBedstate, 210, ICON_POS_Y); + #endif + lv_obj_set_pos(buttonFanstate, 380, ICON_POS_Y); + + labelExt1 = lv_label_create(scr, 55, LABEL_MOD_Y, nullptr); + labelExt1Target = lv_label_create(scr, 55, LABEL_MOD_Y, nullptr); + + #if HAS_MULTI_EXTRUDER + labelExt2 = lv_label_create(scr, 55, LABEL_MOD_Y + SECOND_EXT_MOD_Y, nullptr); + labelExt2Target = lv_label_create(scr, 55, LABEL_MOD_Y + SECOND_EXT_MOD_Y, nullptr); + #endif + + #if HAS_HEATED_BED + labelBed = lv_label_create(scr, 210, LABEL_MOD_Y, nullptr); + labelBedTarget = lv_label_create(scr, 210, LABEL_MOD_Y, nullptr); + #endif + + labelFan = lv_label_create(scr, 380, 80, nullptr); + + sprintf_P(buf, PSTR("%d"), thermalManager.degHotend(0)); + lv_label_set_text(labelExt1, buf); + lv_obj_align(labelExt1, buttonExt1, LV_ALIGN_CENTER, 0, LABEL_MOD_Y); + sprintf_P(buf, PSTR("-> %d"), thermalManager.degTargetHotend(0)); + lv_label_set_text(labelExt1Target, buf); + lv_obj_align(labelExt1Target, buttonExt1, LV_ALIGN_CENTER, 0, TARGET_LABEL_MOD_Y); + + #if HAS_MULTI_EXTRUDER + sprintf_P(buf, PSTR("%d"), thermalManager.degHotend(1)); + lv_label_set_text(labelExt2, buf); + lv_obj_align(labelExt2, buttonExt2, LV_ALIGN_CENTER, 0, LABEL_MOD_Y); + sprintf_P(buf, PSTR("-> %d"), thermalManager.degTargetHotend(1)); + lv_label_set_text(labelExt2Target, buf); + lv_obj_align(labelExt2Target, buttonExt2, LV_ALIGN_CENTER, 0, TARGET_LABEL_MOD_Y); + #endif + + #if HAS_HEATED_BED + sprintf_P(buf, PSTR("%d"), thermalManager.degBed()); + lv_label_set_text(labelBed, buf); + lv_obj_align(labelBed, buttonBedstate, LV_ALIGN_CENTER, 0, LABEL_MOD_Y); + sprintf_P(buf, PSTR("-> %d"), thermalManager.degTargetBed()); + lv_label_set_text(labelBedTarget, buf); + lv_obj_align(labelBedTarget, buttonBedstate, LV_ALIGN_CENTER, 0, TARGET_LABEL_MOD_Y); + #endif + + sprintf_P(buf, PSTR("%d%%"), thermalManager.fanPercent(thermalManager.fan_speed[0])); + lv_label_set_text(labelFan, buf); + lv_obj_align(labelFan, buttonFanstate, LV_ALIGN_CENTER, 0, LABEL_MOD_Y); } #if ENABLED(TOUCH_SCREEN_CALIBRATION) diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp index 7caae5cd3a..20b7d5f606 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.cpp @@ -815,9 +815,9 @@ void disp_language_init() { wifi_menu.disconnected = WIFI_DISCONNECTED_TEXT; wifi_menu.exception = WIFI_EXCEPTION_TEXT; - printing_menu.temp1 = TEXT_VALUE; - printing_menu.temp2 = TEXT_VALUE; - printing_menu.bed_temp = TEXT_VALUE; + printing_menu.temp1 = TEXT_VALUE_TARGET; + printing_menu.temp2 = TEXT_VALUE_TARGET; + printing_menu.bed_temp = TEXT_VALUE_TARGET; filament_menu.stat_temp = TEXT_VALUE; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.h index 82d3e18f74..61c46a648f 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.h @@ -748,6 +748,7 @@ extern eeprom_def eeprom_menu; /*****************************************/ // #define TEXT_VALUE "%d/%d" +#define TEXT_VALUE_TARGET "%d -> %d" #define TEXT_VALUE_T ": %d℃" #define TEXT_VALUE_mm ": %dmm" From 5991836e1fdd73f7a668cfc4221bfe3017a2580d Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Sat, 27 Mar 2021 00:32:48 +0000 Subject: [PATCH 212/253] [cron] Bump distribution date (2021-03-27) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 08ded6d031..bfec7939bf 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2021-03-26" + #define STRING_DISTRIBUTION_DATE "2021-03-27" #endif /** From 5d0e6c21aa54d5b6439dfa2f57daadd2be973505 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Sun, 28 Mar 2021 00:34:16 +0000 Subject: [PATCH 213/253] [cron] Bump distribution date (2021-03-28) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index bfec7939bf..d3190bb612 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2021-03-27" + #define STRING_DISTRIBUTION_DATE "2021-03-28" #endif /** From c45b91aa94c7008e3fd8ea297df57948af9158a3 Mon Sep 17 00:00:00 2001 From: Marcio T Date: Sat, 27 Mar 2021 21:57:12 -0600 Subject: [PATCH 214/253] Refactor Hilbert curve. Enhance Touch UI Bed Level Screen. (#21453) --- Marlin/src/feature/bedlevel/hilbert_curve.cpp | 112 +++++++++++++ Marlin/src/feature/bedlevel/hilbert_curve.h | 32 ++++ Marlin/src/feature/bedlevel/ubl/ubl.h | 5 - Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp | 158 +++++++++--------- .../ftdi_eve_lib/extras/adjuster_widget.cpp | 41 ++--- .../ftdi_eve_lib/extras/adjuster_widget.h | 7 + .../ftdi_eve_touch_ui/language/language_en.h | 5 +- .../screens/bed_mesh_screen.cpp | 21 ++- .../screens/bed_mesh_screen.h | 2 + .../screens/leveling_menu.cpp | 67 +++++--- .../ftdi_eve_touch_ui/screens/tune_menu.cpp | 2 +- Marlin/src/lcd/extui/ui_api.cpp | 31 ++-- platformio.ini | 2 + 13 files changed, 341 insertions(+), 144 deletions(-) create mode 100644 Marlin/src/feature/bedlevel/hilbert_curve.cpp create mode 100644 Marlin/src/feature/bedlevel/hilbert_curve.h diff --git a/Marlin/src/feature/bedlevel/hilbert_curve.cpp b/Marlin/src/feature/bedlevel/hilbert_curve.cpp new file mode 100644 index 0000000000..6150226e0b --- /dev/null +++ b/Marlin/src/feature/bedlevel/hilbert_curve.cpp @@ -0,0 +1,112 @@ +/********************* + * hilbert_curve.cpp * + *********************/ + +/**************************************************************************** + * Written By Marcio Teixeira 2021 - SynDaver Labs, 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/MarlinConfig.h" + +#if ENABLED(UBL_HILBERT_CURVE) + +#include "bedlevel.h" +#include "hilbert_curve.h" + +constexpr int8_t to_fix(int8_t v) { return v * 2; } +constexpr int8_t to_int(int8_t v) { return v / 2; } +constexpr uint8_t log2(uint8_t n) { return (n > 1) ? 1 + log2(n >> 1) : 0; } +constexpr uint8_t order(uint8_t n) { return uint8_t(log2(n - 1)) + 1; } +constexpr uint8_t ord = order(_MAX(GRID_MAX_POINTS_X, GRID_MAX_POINTS_Y)); +constexpr uint8_t dim = _BV(ord); + +static inline bool eval_candidate(int8_t x, int8_t y, hilbert_curve::callback_ptr func, void *data) { + // The print bed likely has fewer points than the full Hilbert + // curve, so cull unecessary points + return x < GRID_MAX_POINTS_X && y < GRID_MAX_POINTS_Y ? func(x, y, data) : false; +} + +bool hilbert_curve::hilbert(int8_t x, int8_t y, int8_t xi, int8_t xj, int8_t yi, int8_t yj, uint8_t n, hilbert_curve::callback_ptr func, void *data) { + /** + * Hilbert space-filling curve implementation + * + * x and y : coordinates of the bottom left corner + * xi and xj : i and j components of the unit x vector of the frame + * yi and yj : i and j components of the unit y vector of the frame + * + * From: http://www.fundza.com/algorithmic/space_filling/hilbert/basics/index.html + */ + if (n) + return hilbert(x, y, yi/2, yj/2, xi/2, xj/2, n-1, func, data) || + hilbert(x+xi/2, y+xj/2, xi/2, xj/2, yi/2, yj/2, n-1, func, data) || + hilbert(x+xi/2+yi/2, y+xj/2+yj/2, xi/2, xj/2, yi/2, yj/2, n-1, func, data) || + hilbert(x+xi/2+yi, y+xj/2+yj, -yi/2, -yj/2, -xi/2, -xj/2, n-1, func, data); + else + return eval_candidate(to_int(x+(xi+yi)/2), to_int(y+(xj+yj)/2), func, data); +} + +/** + * Calls func(x, y, data) for all points in the Hilbert curve. + * If that function returns true, the search is terminated. + */ +bool hilbert_curve::search(hilbert_curve::callback_ptr func, void *data) { + return hilbert(to_fix(0), to_fix(0),to_fix(dim), to_fix(0), to_fix(0), to_fix(dim), ord, func, data); +} + +/* Helper function for starting the search at a particular point */ + +typedef struct { + uint8_t x, y; + bool found_1st; + hilbert_curve::callback_ptr func; + void *data; +} search_from_t; + +static bool search_from_helper(uint8_t x, uint8_t y, void *data) { + search_from_t *d = (search_from_t *) data; + if (d->x == x && d->y == y) + d->found_1st = true; + return d->found_1st ? d->func(x, y, d->data) : false; +} + +/** + * Same as search, except start at a specific grid intersection point. + */ +bool hilbert_curve::search_from(uint8_t x, uint8_t y, hilbert_curve::callback_ptr func, void *data) { + search_from_t d; + d.x = x; + d.y = y; + d.found_1st = false; + d.func = func; + d.data = data; + // Call twice to allow search to wrap back to the beginning and picked up points prior to the start. + return search(search_from_helper, &d) || search(search_from_helper, &d); +} + +/** + * Like search_from, but takes a bed position and starts from the nearest + * point on the Hilbert curve. + */ +bool hilbert_curve::search_from_closest(const xy_pos_t &pos, hilbert_curve::callback_ptr func, void *data) { + // Find closest grid intersection + uint8_t grid_x = LROUND(float(pos.x - MESH_MIN_X) / MESH_X_DIST); + uint8_t grid_y = LROUND(float(pos.y - MESH_MIN_Y) / MESH_Y_DIST); + LIMIT(grid_x, 0, GRID_MAX_POINTS_X); + LIMIT(grid_y, 0, GRID_MAX_POINTS_Y); + return search_from(grid_x, grid_y, func, data); +} + +#endif // UBL_HILBERT_CURVE diff --git a/Marlin/src/feature/bedlevel/hilbert_curve.h b/Marlin/src/feature/bedlevel/hilbert_curve.h new file mode 100644 index 0000000000..a5dce8a22d --- /dev/null +++ b/Marlin/src/feature/bedlevel/hilbert_curve.h @@ -0,0 +1,32 @@ +/******************* + * hilbert_curve.h * + *******************/ + +/**************************************************************************** + * Written By Marcio Teixeira 2021 - SynDaver Labs, 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 + +class hilbert_curve { + public: + typedef bool (*callback_ptr)(uint8_t x, uint8_t y, void *data); + static bool search(callback_ptr func, void *data); + static bool search_from(uint8_t x, uint8_t y, callback_ptr func, void *data); + static bool search_from_closest(const xy_pos_t &pos, callback_ptr func, void *data); + private: + static bool hilbert(int8_t x, int8_t y, int8_t xi, int8_t xj, int8_t yi, int8_t yj, uint8_t n, callback_ptr func, void *data); +}; diff --git a/Marlin/src/feature/bedlevel/ubl/ubl.h b/Marlin/src/feature/bedlevel/ubl/ubl.h index 67a9b0a60e..56de4e45ba 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl.h +++ b/Marlin/src/feature/bedlevel/ubl/ubl.h @@ -101,11 +101,6 @@ public: static void display_map(const int) _O0; static mesh_index_pair find_closest_mesh_point_of_type(const MeshPointType, const xy_pos_t&, const bool=false, MeshFlags *done_flags=nullptr) _O0; static mesh_index_pair find_furthest_invalid_mesh_point() _O0; - #if ENABLED(UBL_HILBERT_CURVE) - static void check_if_missing(mesh_index_pair &pt, int x, int y); - static void hilbert(mesh_index_pair &pt, int8_t x, int8_t y, int8_t xi, int8_t xj, int8_t yi, int8_t yj, uint8_t n); - static mesh_index_pair find_next_mesh_point(); - #endif static void reset(); static void invalidate(); static void set_all_mesh_points_to_value(const float value); diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp index c1f824714c..2003e9b6f5 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp @@ -49,6 +49,10 @@ #include "../../../lcd/extui/ui_api.h" #endif +#if ENABLED(UBL_HILBERT_CURVE) + #include "../hilbert_curve.h" +#endif + #include #define UBL_G29_P31 @@ -747,11 +751,9 @@ void unified_bed_leveling::shift_mesh_height() { } #endif - best = do_furthest ? find_furthest_invalid_mesh_point() - : TERN(UBL_HILBERT_CURVE, - find_next_mesh_point(), - find_closest_mesh_point_of_type(INVALID, nearby, true) - ); + best = do_furthest + ? find_furthest_invalid_mesh_point() + : find_closest_mesh_point_of_type(INVALID, nearby, true); if (best.pos.x >= 0) { // mesh point found and is reachable by probe TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(best.pos, ExtUI::PROBE_START)); @@ -1269,97 +1271,93 @@ mesh_index_pair unified_bed_leveling::find_furthest_invalid_mesh_point() { return farthest; } -mesh_index_pair unified_bed_leveling::find_closest_mesh_point_of_type(const MeshPointType type, const xy_pos_t &pos, const bool probe_relative/*=false*/, MeshFlags *done_flags/*=nullptr*/) { - mesh_index_pair closest; - closest.invalidate(); - closest.distance = -99999.9f; +#if ENABLED(UBL_HILBERT_CURVE) - // Get the reference position, either nozzle or probe - const xy_pos_t ref = probe_relative ? pos + probe.offset_xy : pos; + typedef struct { + MeshPointType type; + MeshFlags *done_flags; + bool probe_relative; + mesh_index_pair closest; + } find_closest_t; - float best_so_far = 99999.99f; - - GRID_LOOP(i, j) { - if ( (type == (isnan(z_values[i][j]) ? INVALID : REAL)) - || (type == SET_IN_BITMAP && !done_flags->marked(i, j)) + static bool test_func(uint8_t i, uint8_t j, void *data) { + find_closest_t *d = (find_closest_t*)data; + if ( (d->type == (isnan(ubl.z_values[i][j]) ? INVALID : REAL)) + || (d->type == SET_IN_BITMAP && !d->done_flags->marked(i, j)) ) { // Found a Mesh Point of the specified type! - const xy_pos_t mpos = { mesh_index_to_xpos(i), mesh_index_to_ypos(j) }; + const xy_pos_t mpos = { ubl.mesh_index_to_xpos(i), ubl.mesh_index_to_ypos(j) }; // If using the probe as the reference there are some unreachable locations. // Also for round beds, there are grid points outside the bed the nozzle can't reach. // Prune them from the list and ignore them till the next Phase (manual nozzle probing). - if (!(probe_relative ? probe.can_reach(mpos) : position_is_reachable(mpos))) - continue; - - // Reachable. Check if it's the best_so_far location to the nozzle. - - const xy_pos_t diff = current_position - mpos; - const float distance = (ref - mpos).magnitude() + diff.magnitude() * 0.1f; - - // factor in the distance from the current location for the normal case - // so the nozzle isn't running all over the bed. - if (distance < best_so_far) { - best_so_far = distance; // Found a closer location with the desired value type. - closest.pos.set(i, j); - closest.distance = best_so_far; - } - } - } // GRID_LOOP - - return closest; -} - -#if ENABLED(UBL_HILBERT_CURVE) - - constexpr int8_t to_fix(int8_t v) { return v << 1; } - constexpr int8_t to_int(int8_t v) { return v >> 1; } - constexpr uint8_t log2(uint8_t n) { return (n > 1) ? 1 + log2(n >> 1) : 0; } - constexpr uint8_t order(uint8_t n) { return uint8_t(log2(n - 1)) + 1; } - - void unified_bed_leveling::hilbert(mesh_index_pair &pt, int8_t x, int8_t y, int8_t xi, int8_t xj, int8_t yi, int8_t yj, uint8_t n) { - /* Hilbert space filling curve implementation - * - * x and y are the coordinates of the bottom left corner - * xi & xj are the i & j components of the unit x vector of the frame - * similarly yi and yj - * - * From: http://www.fundza.com/algorithmic/space_filling/hilbert/basics/index.html - */ - if (n <= 0) - check_if_missing(pt, to_int(x+(xi+yi)/2),to_int(y+(xj+yj)/2)); - else { - hilbert(pt, x, y, yi/2, yj/2, xi/2, xj/2, n-1); - hilbert(pt, x+xi/2, y+xj/2, xi/2, xj/2, yi/2, yj/2, n-1); - hilbert(pt, x+xi/2+yi/2, y+xj/2+yj/2, xi/2, xj/2, yi/2, yj/2, n-1); - hilbert(pt, x+xi/2+yi, y+xj/2+yj, -yi/2, -yj/2, -xi/2, -xj/2, n-1); + if (!(d->probe_relative ? probe.can_reach(mpos) : position_is_reachable(mpos))) + return false; + d->closest.pos.set(i, j); + return true; } + return false; } - void unified_bed_leveling::check_if_missing(mesh_index_pair &pt, int x, int y) { - if ( pt.distance < 0 - && x < GRID_MAX_POINTS_X - && y < GRID_MAX_POINTS_Y - && isnan(z_values[x][y]) - && probe.can_reach(mesh_index_to_xpos(x), mesh_index_to_ypos(y)) +#endif + +mesh_index_pair unified_bed_leveling::find_closest_mesh_point_of_type(const MeshPointType type, const xy_pos_t &pos, const bool probe_relative/*=false*/, MeshFlags *done_flags/*=nullptr*/) { + + #if ENABLED(UBL_HILBERT_CURVE) + + find_closest_t d; + d.type = type; + d.done_flags = done_flags; + d.probe_relative = probe_relative; + d.closest.invalidate(); + hilbert_curve::search_from_closest(pos, test_func, &d); + return d.closest; + + #else + + mesh_index_pair closest; + closest.invalidate(); + closest.distance = -99999.9f; + + // Get the reference position, either nozzle or probe + const xy_pos_t ref = probe_relative ? pos + probe.offset_xy : pos; + + float best_so_far = 99999.99f; + + GRID_LOOP(i, j) { + if ( (type == (isnan(z_values[i][j]) ? INVALID : REAL)) + || (type == SET_IN_BITMAP && !done_flags->marked(i, j)) ) { - pt.pos.set(x, y); - pt.distance = 1; + // Found a Mesh Point of the specified type! + const xy_pos_t mpos = { mesh_index_to_xpos(i), mesh_index_to_ypos(j) }; + + // If using the probe as the reference there are some unreachable locations. + // Also for round beds, there are grid points outside the bed the nozzle can't reach. + // Prune them from the list and ignore them till the next Phase (manual nozzle probing). + + if (!(probe_relative ? probe.can_reach(mpos) : position_is_reachable(mpos))) + continue; + + // Reachable. Check if it's the best_so_far location to the nozzle. + + const xy_pos_t diff = current_position - mpos; + const float distance = (ref - mpos).magnitude() + diff.magnitude() * 0.1f; + + // factor in the distance from the current location for the normal case + // so the nozzle isn't running all over the bed. + if (distance < best_so_far) { + best_so_far = distance; // Found a closer location with the desired value type. + closest.pos.set(i, j); + closest.distance = best_so_far; + } } - } + } // GRID_LOOP - mesh_index_pair unified_bed_leveling::find_next_mesh_point() { - mesh_index_pair pt; - pt.invalidate(); - pt.distance = -99999.9f; - constexpr uint8_t ord = order(_MAX(GRID_MAX_POINTS_X, GRID_MAX_POINTS_Y)); - constexpr uint8_t dim = _BV(ord); - hilbert(pt, to_fix(0), to_fix(0), to_fix(dim), to_fix(0), to_fix(0), to_fix(dim), ord); - return pt; - } + return closest; -#endif // UBL_HILBERT_CURVE + #endif +} /** * 'Smart Fill': Scan from the outward edges of the mesh towards the center. diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/adjuster_widget.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/adjuster_widget.cpp index 084c9c014f..ef3cb565d2 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/adjuster_widget.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/adjuster_widget.cpp @@ -30,25 +30,28 @@ #define INC_POS SUB_POS(6,1), SUB_SIZE(2,1) #define DEC_POS SUB_POS(8,1), SUB_SIZE(2,1) -void draw_adjuster(CommandProcessor& cmd, int16_t x, int16_t y, int16_t w, int16_t h, uint8_t tag, float value, progmem_str units, int8_t width, uint8_t precision, draw_mode_t what) { - if (what & BACKGROUND) - cmd.tag(0).button(VAL_POS, F(""), FTDI::OPT_FLAT); +void draw_adjuster_value(CommandProcessor& cmd, int16_t x, int16_t y, int16_t w, int16_t h, float value, progmem_str units, int8_t width, uint8_t precision) { + char str[width + precision + 10 + (units ? strlen_P((const char*) units) : 0)]; + if (isnan(value)) + strcpy_P(str, PSTR("-")); + else + dtostrf(value, width, precision, str); - if (what & FOREGROUND) { - char str[width + precision + 10 + (units ? strlen_P((const char*) units) : 0)]; - if (isnan(value)) - strcpy_P(str, PSTR("-")); - else - dtostrf(value, width, precision, str); + if (units) { + strcat_P(str, PSTR(" ")); + strcat_P(str, (const char*) units); + } - if (units) { - strcat_P(str, PSTR(" ")); - strcat_P(str, (const char*) units); - } - - cmd.tag(0) - .text(VAL_POS, str) - .tag(tag ).button(INC_POS, F("-")) - .tag(tag+1).button(DEC_POS, F("+")); - } + cmd.text(VAL_POS, str); +} + +void draw_adjuster(CommandProcessor& cmd, int16_t x, int16_t y, int16_t w, int16_t h, uint8_t tag, float value, progmem_str units, int8_t width, uint8_t precision, draw_mode_t what) { + if (what & BACKGROUND) + cmd.tag(0).button(VAL_POS, F(""), FTDI::OPT_FLAT); + + if (what & FOREGROUND) { + draw_adjuster_value(cmd, x, y, w, h, value, units, width, precision); + cmd.tag(tag ).button(INC_POS, F("-")) + .tag(tag+1).button(DEC_POS, F("+")); + } } diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/adjuster_widget.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/adjuster_widget.h index c48e37f620..9b5cab0dfb 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/adjuster_widget.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/adjuster_widget.h @@ -22,6 +22,13 @@ #pragma once #include "../extended/screen_types.h" +void draw_adjuster_value( + CommandProcessor& cmd, + int16_t x, int16_t y, int16_t w, int16_t h, + float value, progmem_str units = nullptr, + int8_t width = 5, uint8_t precision = 1 +); + void draw_adjuster( CommandProcessor& cmd, int16_t x, int16_t y, int16_t w, int16_t h, diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h index f6603e514a..c34d5b7756 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/language/language_en.h @@ -140,10 +140,13 @@ namespace Language_en { PROGMEM Language_Str MSG_TOUCH_CALIBRATION_START = u8"Release to begin screen calibration"; PROGMEM Language_Str MSG_TOUCH_CALIBRATION_PROMPT = u8"Touch the dots to calibrate"; - PROGMEM Language_Str MSG_AUTOLEVEL_X_AXIS = u8"Level X Axis"; PROGMEM Language_Str MSG_BED_MAPPING_DONE = u8"Bed mapping finished"; PROGMEM Language_Str MSG_BED_MAPPING_INCOMPLETE = u8"Not all points probed"; PROGMEM Language_Str MSG_LEVELING = u8"Leveling"; + PROGMEM Language_Str MSG_AXIS_LEVELING = u8"Axis Leveling"; + PROGMEM Language_Str MSG_PROBE_BED = u8"Probe Mesh"; + PROGMEM Language_Str MSG_SHOW_MESH = u8"View Mesh"; + PROGMEM Language_Str MSG_PRINT_TEST = u8"Print Test"; #if ENABLED(TOUCH_UI_LULZBOT_BIO) PROGMEM Language_Str MSG_MOVE_TO_HOME = u8"Move to Home"; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp index c87329ebe2..053f4ebd72 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp @@ -225,6 +225,7 @@ bool BedMeshScreen::tagToPoint(uint8_t tag, xy_uint8_t &pt) { } void BedMeshScreen::onEntry() { + mydata.allowEditing = true; mydata.highlightedTag = 0; mydata.zAdjustment = 0; mydata.count = GRID_MAX_POINTS; @@ -259,16 +260,16 @@ void BedMeshScreen::adjustHighlightedValue(float increment) { } void BedMeshScreen::saveAdjustedHighlightedValue() { - if(mydata.zAdjustment) { + if (mydata.zAdjustment) { BedMeshScreen::setHighlightedValue(BedMeshScreen::getHighlightedValue(true) + mydata.zAdjustment); mydata.zAdjustment = 0; } } void BedMeshScreen::changeHighlightedValue(uint8_t tag) { - saveAdjustedHighlightedValue(); + if (mydata.allowEditing) saveAdjustedHighlightedValue(); mydata.highlightedTag = tag; - moveToHighlightedValue(); + if (mydata.allowEditing) moveToHighlightedValue(); } void BedMeshScreen::drawHighlightedPointValue() { @@ -277,7 +278,12 @@ void BedMeshScreen::drawHighlightedPointValue() { .colors(normal_btn) .text(Z_LABEL_POS, GET_TEXT_F(MSG_MESH_EDIT_Z)) .font(font_small); - draw_adjuster(cmd, Z_VALUE_POS, 2, getHighlightedValue(true) + mydata.zAdjustment, GET_TEXT_F(MSG_UNITS_MM), 4, 3); + + if (mydata.allowEditing) + draw_adjuster(cmd, Z_VALUE_POS, 2, getHighlightedValue(true) + mydata.zAdjustment, GET_TEXT_F(MSG_UNITS_MM), 4, 3); + else + draw_adjuster_value(cmd, Z_VALUE_POS, getHighlightedValue(true) + mydata.zAdjustment, GET_TEXT_F(MSG_UNITS_MM), 4, 3); + cmd.colors(action_btn) .tag(1).button(OKAY_POS, GET_TEXT_F(MSG_BUTTON_OKAY)) .tag(0); @@ -347,6 +353,7 @@ void BedMeshScreen::onMeshUpdate(const int8_t, const int8_t, const float) { void BedMeshScreen::onMeshUpdate(const int8_t x, const int8_t y, const ExtUI::probe_state_t state) { switch (state) { case ExtUI::MESH_START: + mydata.allowEditing = false; mydata.count = 0; mydata.message = mydata.MSG_NONE; break; @@ -369,10 +376,16 @@ void BedMeshScreen::onMeshUpdate(const int8_t x, const int8_t y, const ExtUI::pr void BedMeshScreen::startMeshProbe() { GOTO_SCREEN(BedMeshScreen); + mydata.allowEditing = false; mydata.count = 0; injectCommands_P(PSTR(BED_LEVELING_COMMANDS)); } +void BedMeshScreen::showMesh() { + GOTO_SCREEN(BedMeshScreen); + mydata.allowEditing = false; +} + void BedMeshScreen::showMeshEditor() { SpinnerDialogBox::enqueueAndWait_P(ExtUI::isMachineHomed() ? F("M420 S1") : F("G28\nM420 S1")); // After the spinner, go to this screen. diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.h index 804bb57ad0..21a7a73729 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.h @@ -33,6 +33,7 @@ struct BedMeshScreenData { uint8_t count; uint8_t highlightedTag; float zAdjustment; + bool allowEditing; }; class BedMeshScreen : public BaseScreen, public CachedScreen { @@ -63,5 +64,6 @@ class BedMeshScreen : public BaseScreen, public CachedScreen - - + - - - - - - + - - - - - - @@ -306,6 +307,7 @@ AUTO_BED_LEVELING_BILINEAR = src_filter=+ AUTO_BED_LEVELING_(3POINT|(BI)?LINEAR) = src_filter=+ MESH_BED_LEVELING = src_filter=+ + AUTO_BED_LEVELING_UBL = src_filter=+ + +UBL_HILBERT_CURVE = src_filter=+ BACKLASH_COMPENSATION = src_filter=+ BARICUDA = src_filter=+ + BINARY_FILE_TRANSFER = src_filter=+ + From 001c77d1f7b5f9d6069494a5cb7aae976231fd09 Mon Sep 17 00:00:00 2001 From: Vert <45634861+Vertabreak@users.noreply.github.com> Date: Sun, 28 Mar 2021 20:27:02 -0400 Subject: [PATCH 215/253] YHCB2004 pins followup (#21472) --- Marlin/src/pins/mega/pins_GT2560_V3.h | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Marlin/src/pins/mega/pins_GT2560_V3.h b/Marlin/src/pins/mega/pins_GT2560_V3.h index 11824fae4a..dd2d1d0f65 100644 --- a/Marlin/src/pins/mega/pins_GT2560_V3.h +++ b/Marlin/src/pins/mega/pins_GT2560_V3.h @@ -157,16 +157,16 @@ #if ENABLED(YHCB2004) #ifndef YHCB2004_CLK - #define YHCB2004_CLK 5 - #define DIO52 YHCB2004_CLK + #define YHCB2004_CLK 5 + #define DIO52 YHCB2004_CLK #endif #ifndef YHCB2004_MOSI - #define YHCB2004_MOSI 36 - #define DIO51 YHCB2004_MOSI + #define YHCB2004_MOSI 21 + #define DIO50 YHCB2004_MOSI #endif #ifndef YHCB2004_MISO - #define YHCB2004_MISO 21 - #define DIO50 YHCB2004_MISO + #define YHCB2004_MISO 36 + #define DIO51 YHCB2004_MISO #endif #elif HAS_WIRED_LCD #ifndef LCD_PINS_RS @@ -209,4 +209,4 @@ #ifndef BTN_ENC #define BTN_ENC 19 #endif -#endif \ No newline at end of file +#endif From 8f509b0ae0827510a32d39e3788bc43a8ab7a2fd Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Mon, 29 Mar 2021 00:45:48 +0000 Subject: [PATCH 216/253] [cron] Bump distribution date (2021-03-29) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index d3190bb612..86f557bd52 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2021-03-28" + #define STRING_DISTRIBUTION_DATE "2021-03-29" #endif /** From ccdbffbf3f599f0860c643647ce6c40f1eb5a4cd Mon Sep 17 00:00:00 2001 From: Mike La Spina Date: Mon, 29 Mar 2021 01:41:56 -0500 Subject: [PATCH 217/253] Laser Coolant Flow Meter / Safety Shutdown (#21431) Co-authored-by: Scott Lahteine --- Marlin/Configuration_adv.h | 15 ++ Marlin/src/core/language.h | 1 + Marlin/src/feature/cooler.cpp | 22 ++- Marlin/src/feature/cooler.h | 95 ++++++++-- Marlin/src/feature/spindle_laser.h | 5 +- Marlin/src/gcode/gcode.cpp | 11 ++ Marlin/src/inc/SanityCheck.h | 4 + Marlin/src/lcd/HD44780/marlinui_HD44780.cpp | 93 +++++++--- Marlin/src/lcd/dogm/dogm_Statusscreen.h | 182 +++++++++++++------- Marlin/src/lcd/dogm/status/cooler.h | 94 +++++++--- Marlin/src/lcd/dogm/status_screen_DOGM.cpp | 80 +++++---- Marlin/src/lcd/language/language_en.h | 3 +- Marlin/src/lcd/marlinui.cpp | 6 + Marlin/src/lcd/marlinui.h | 5 + Marlin/src/lcd/menu/menu_temperature.cpp | 14 +- Marlin/src/libs/numtostr.cpp | 9 + Marlin/src/libs/numtostr.h | 3 + Marlin/src/module/temperature.cpp | 19 +- buildroot/tests/mega2560 | 20 +++ platformio.ini | 4 +- 20 files changed, 512 insertions(+), 173 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index a7af076155..d3ad971e6d 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -204,6 +204,20 @@ #endif #endif +// +// Laser Coolant Flow Meter +// +//#define LASER_COOLANT_FLOW_METER +#if ENABLED(LASER_COOLANT_FLOW_METER) + #define FLOWMETER_PIN 20 // Requires an external interrupt-enabled pin (e.g., RAMPS 2,3,18,19,20,21) + #define FLOWMETER_PPL 5880 // (pulses/liter) Flow meter pulses-per-liter on the input pin + #define FLOWMETER_INTERVAL 1000 // (ms) Flow rate calculation interval in milliseconds + #define FLOWMETER_SAFETY // Prevent running the laser without the minimum flow rate set below + #if ENABLED(FLOWMETER_SAFETY) + #define FLOWMETER_MIN_LITERS_PER_MINUTE 1.5 // (liters/min) Minimum flow required when enabled + #endif +#endif + /** * Thermal Protection provides additional protection to your printer from damage * and fire. Marlin always includes safe min and max temperature ranges which @@ -1539,6 +1553,7 @@ #define STATUS_CHAMBER_ANIM // Use a second bitmap to indicate chamber heating //#define STATUS_CUTTER_ANIM // Use a second bitmap to indicate spindle / laser active //#define STATUS_COOLER_ANIM // Use a second bitmap to indicate laser cooling + //#define STATUS_FLOWMETER_ANIM // Use multiple bitmaps to indicate coolant flow //#define STATUS_ALT_BED_BITMAP // Use the alternative bed bitmap //#define STATUS_ALT_FAN_BITMAP // Use the alternative fan bitmap //#define STATUS_FAN_FRAMES 3 // :[0,1,2,3,4] Number of fan animation frames diff --git a/Marlin/src/core/language.h b/Marlin/src/core/language.h index 71e8ea524c..de29535f87 100644 --- a/Marlin/src/core/language.h +++ b/Marlin/src/core/language.h @@ -130,6 +130,7 @@ #define STR_COUNT_A " Count A:" #define STR_WATCHDOG_FIRED "Watchdog timeout. Reset required." #define STR_ERR_KILLED "Printer halted. kill() called!" +#define STR_FLOWMETER_FAULT "Coolant flow fault. Flowmeter safety is active. Attention required." #define STR_ERR_STOPPED "Printer stopped due to errors. Fix the error and use M999 to restart. (Temperature is reset. Set it after restarting)" #define STR_ERR_SERIAL_MISMATCH "Serial status mismatch" #define STR_BUSY_PROCESSING "busy: processing" diff --git a/Marlin/src/feature/cooler.cpp b/Marlin/src/feature/cooler.cpp index 03640df487..a1f25c5fad 100644 --- a/Marlin/src/feature/cooler.cpp +++ b/Marlin/src/feature/cooler.cpp @@ -27,11 +27,21 @@ #include "cooler.h" Cooler cooler; -uint16_t Cooler::flowrate; // Flow meter reading in liters, 0 will result in shutdown if equiped -uint8_t Cooler::mode = 0; // 0 = CO2 Liquid cooling, 1 = Laser Diode TEC Heatsink Cooling -uint16_t Cooler::capacity; // Cooling capacity in watts -uint16_t Cooler::load; // Cooling load in watts -bool Cooler::flowmeter = false; -bool Cooler::state = false; // on = true, off = false +uint8_t Cooler::mode = 0; +uint16_t Cooler::capacity; +uint16_t Cooler::load; +bool Cooler::enabled = false; +#if ENABLED(LASER_COOLANT_FLOW_METER) + bool Cooler::flowmeter = false; + millis_t Cooler::flowmeter_next_ms; // = 0 + volatile uint16_t Cooler::flowpulses; + float Cooler::flowrate; #endif + +#if ENABLED(FLOWMETER_SAFETY) + bool Cooler::flowsafety_enabled = true; + bool Cooler::fault = false; +#endif + +#endif // HAS_COOLER diff --git a/Marlin/src/feature/cooler.h b/Marlin/src/feature/cooler.h index 42a95ccb63..1e24c729f3 100644 --- a/Marlin/src/feature/cooler.h +++ b/Marlin/src/feature/cooler.h @@ -21,30 +21,91 @@ */ #pragma once -#include +#include "../inc/MarlinConfigPre.h" -#define _MSG_COOLER(M) MSG_COOLER_##M -#define MSG_COOLER(M) _MSG_COOLER(M) +#ifndef FLOWMETER_PPL + #define FLOWMETER_PPL 5880 // Pulses per liter +#endif +#ifndef FLOWMETER_INTERVAL + #define FLOWMETER_INTERVAL 1000 // milliseconds +#endif // Cooling device class Cooler { public: - static uint16_t flowrate; // Flow meter reading in liters, 0 will result in shutdown if equiped - static uint8_t mode; // 0 = CO2 Liquid cooling, 1 = Laser Diode TEC Heatsink Cooling - static uint16_t capacity; // Cooling capacity in watts - static uint16_t load; // Cooling load in watts - static bool flowmeter; - static bool state; // on = true, off = false + static uint16_t capacity; // Cooling capacity in watts + static uint16_t load; // Cooling load in watts - static bool is_enabled() { return state; } - static void enable() { state = true; } - static void disable() { state = false; } - static void set_mode(const uint8_t m) { mode = m; } - static void set_flowmeter(const bool sflag) { flowmeter = sflag; } - static uint16_t get_flowrate() { return flowrate; } - static void update_flowrate(uint16_t flow) { flowrate = flow; } - //static void init() { set_state(false); } + static bool enabled; + static void enable() { enabled = true; } + static void disable() { enabled = false; } + static void toggle() { enabled = !enabled; } + + static uint8_t mode; // 0 = CO2 Liquid cooling, 1 = Laser Diode TEC Heatsink Cooling + static void set_mode(const uint8_t m) { mode = m; } + + #if ENABLED(LASER_COOLANT_FLOW_METER) + static float flowrate; // Flow meter reading in liters-per-minute. + static bool flowmeter; // Flag to monitor the flow + static volatile uint16_t flowpulses; // Flowmeter IRQ pulse count + static millis_t flowmeter_next_ms; // Next time at which to calculate flow + + static void set_flowmeter(const bool sflag) { + if (flowmeter != sflag) { + flowmeter = sflag; + if (sflag) { + flowpulses = 0; + flowmeter_next_ms = millis() + FLOWMETER_INTERVAL; + } + } + } + + // To calculate flow we only need to count pulses + static void flowmeter_ISR() { flowpulses++; } + + // Enable / Disable the flow meter interrupt + static void flowmeter_interrupt_enable() { + attachInterrupt(digitalPinToInterrupt(FLOWMETER_PIN), flowmeter_ISR, RISING); + } + static void flowmeter_interrupt_disable() { + detachInterrupt(digitalPinToInterrupt(FLOWMETER_PIN)); + } + + // Enable / Disable the flow meter interrupt + static void flowmeter_enable() { set_flowmeter(true); flowpulses = 0; flowmeter_interrupt_enable(); } + static void flowmeter_disable() { set_flowmeter(false); flowmeter_interrupt_disable(); flowpulses = 0; } + + // Get the total flow (in liters per minute) since the last reading + static void calc_flowrate() { + //flowmeter_interrupt_disable(); + // const uint16_t pulses = flowpulses; + //flowmeter_interrupt_enable(); + flowrate = flowpulses * 60.0f * (1000.0f / (FLOWMETER_INTERVAL)) * (1000.0f / (FLOWMETER_PPL)); + flowpulses = 0; + } + + // Userland task to update the flow meter + static void flowmeter_task(const millis_t ms=millis()) { + if (!flowmeter) // !! The flow meter must always be on !! + flowmeter_enable(); // Init and prime + if (ELAPSED(ms, flowmeter_next_ms)) { + calc_flowrate(); + flowmeter_next_ms = ms + FLOWMETER_INTERVAL; + } + } + + #if ENABLED(FLOWMETER_SAFETY) + static bool fault; // Flag that the cooler is in a fault state + static bool flowsafety_enabled; // Flag to disable the cutter if flow rate is too low + static void flowsafety_toggle() { flowsafety_enabled = !flowsafety_enabled; } + static bool check_flow_too_low() { + const bool too_low = flowsafety_enabled && flowrate < (FLOWMETER_MIN_LITERS_PER_MINUTE); + if (too_low) fault = true; + return too_low; + } + #endif + #endif }; extern Cooler cooler; diff --git a/Marlin/src/feature/spindle_laser.h b/Marlin/src/feature/spindle_laser.h index d50bc7eb42..b3d008851c 100644 --- a/Marlin/src/feature/spindle_laser.h +++ b/Marlin/src/feature/spindle_laser.h @@ -215,8 +215,7 @@ public: static inline void disable() { isReady = false; set_enabled(false); } #if HAS_LCD_MENU - - static inline void enable_with_dir(const bool reverse) { + static inline void enable_with_dir(const bool reverse) { isReady = true; const uint8_t ocr = TERN(SPINDLE_LASER_PWM, upower_to_ocr(menuPower), 255); if (menuPower) @@ -245,8 +244,8 @@ public: * If not set defaults to 80% power */ static inline void test_fire_pulse() { - enable_forward(); // Turn Laser on (Spindle speak but same funct) TERN_(USE_BEEPER, buzzer.tone(30, 3000)); + enable_forward(); // Turn Laser on (Spindle speak but same funct) delay(testPulse); // Delay for time set by user in pulse ms menu screen. disable(); // Turn laser off } diff --git a/Marlin/src/gcode/gcode.cpp b/Marlin/src/gcode/gcode.cpp index aa206bfeba..cdf11e870b 100644 --- a/Marlin/src/gcode/gcode.cpp +++ b/Marlin/src/gcode/gcode.cpp @@ -57,6 +57,10 @@ GcodeSuite gcode; #include "../feature/spindle_laser.h" #endif +#if ENABLED(FLOWMETER_SAFETY) + #include "../feature/cooler.h" +#endif + #if ENABLED(PASSWORD_FEATURE) #include "../feature/password/password.h" #endif @@ -278,6 +282,13 @@ void GcodeSuite::process_parsed_command(const bool no_ok/*=false*/) { } #endif + #if ENABLED(FLOWMETER_SAFETY) + if (cooler.fault) { + SERIAL_ECHO_MSG(STR_FLOWMETER_FAULT); + return; + } + #endif + // Handle a known G, M, or T switch (parser.command_letter) { case 'G': switch (parser.codenum) { diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 704163e2b2..6ed0f53245 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -1895,6 +1895,10 @@ static_assert(hbm[Z_AXIS] >= 0, "HOMING_BUMP_MM.Z must be greater than or equal #error "TEMP_SENSOR_COOLER requires LASER_FEATURE and TEMP_COOLER_PIN." #endif +#if ENABLED(LASER_COOLANT_FLOW_METER) && !(PIN_EXISTS(FLOWMETER) && ENABLED(LASER_FEATURE)) + #error "LASER_COOLANT_FLOW_METER requires FLOWMETER_PIN and LASER_FEATURE." +#endif + #if ENABLED(CHAMBER_FAN) && !(defined(CHAMBER_FAN_MODE) && WITHIN(CHAMBER_FAN_MODE, 0, 2)) #error "CHAMBER_FAN_MODE must be between 0 and 2." #endif diff --git a/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp b/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp index 3f4cc23aba..683c1c0884 100644 --- a/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp +++ b/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp @@ -46,6 +46,10 @@ #include "../../gcode/parser.h" #endif +#if HAS_COOLER || HAS_FLOWMETER + #include "../../feature/cooler.h" +#endif + #if ENABLED(AUTO_BED_LEVELING_UBL) #include "../../feature/bedlevel/bedlevel.h" #endif @@ -517,6 +521,7 @@ FORCE_INLINE void _draw_axis_value(const AxisEnum axis, const char *value, const lcd_put_u8str(value); } + FORCE_INLINE void _draw_heater_status(const heater_id_t heater_id, const char prefix, const bool blink) { #if HAS_HEATED_BED const bool isBed = TERN(HAS_HEATED_CHAMBER, heater_id == H_BED, heater_id < 0); @@ -550,6 +555,43 @@ FORCE_INLINE void _draw_heater_status(const heater_id_t heater_id, const char pr } } +#if HAS_COOLER +FORCE_INLINE void _draw_cooler_status(const char prefix, const bool blink) { + const float t1 = thermalManager.degCooler(), t2 = thermalManager.degTargetCooler(); + + if (prefix >= 0) lcd_put_wchar(prefix); + + lcd_put_u8str(i16tostr3rj(t1 + 0.5)); + lcd_put_wchar('/'); + + #if !HEATER_IDLE_HANDLER + UNUSED(blink); + #else + if (!blink && thermalManager.heater_idle[thermalManager.idle_index_for_id(heater_id)].timed_out) { + lcd_put_wchar(' '); + if (t2 >= 10) lcd_put_wchar(' '); + if (t2 >= 100) lcd_put_wchar(' '); + } + else + #endif + lcd_put_u8str(i16tostr3left(t2 + 0.5)); + + if (prefix >= 0) { + lcd_put_wchar(LCD_STR_DEGREE[0]); + lcd_put_wchar(' '); + if (t2 < 10) lcd_put_wchar(' '); + } +} +#endif + +#if HAS_FLOWMETER + FORCE_INLINE void _draw_flowmeter_status() { + lcd_put_u8str("~ "); + lcd_put_u8str(ftostr11ns(cooler.flowrate)); + lcd_put_wchar('L'); + } +#endif + FORCE_INLINE void _draw_bed_status(const bool blink) { _draw_heater_status(H_BED, TERN0(HAS_LEVELING, blink && planner.leveling_active) ? '_' : LCD_STR_BEDTEMP[0], blink); } @@ -747,17 +789,19 @@ void MarlinUI::draw_status_screen() { // // Hotend 0 Temperature // - _draw_heater_status(H_E0, -1, blink); + #if HAS_HOTEND + _draw_heater_status(H_E0, -1, blink); - // - // Hotend 1 or Bed Temperature - // - #if HAS_MULTI_HOTEND - lcd_moveto(8, 0); - _draw_heater_status(H_E1, LCD_STR_THERMOMETER[0], blink); - #elif HAS_HEATED_BED - lcd_moveto(8, 0); - _draw_bed_status(blink); + // + // Hotend 1 or Bed Temperature + // + #if HAS_MULTI_HOTEND + lcd_moveto(8, 0); + _draw_heater_status(H_E1, LCD_STR_THERMOMETER[0], blink); + #elif HAS_HEATED_BED + lcd_moveto(8, 0); + _draw_bed_status(blink); + #endif #endif #else // LCD_WIDTH >= 20 @@ -765,17 +809,26 @@ void MarlinUI::draw_status_screen() { // // Hotend 0 Temperature // - _draw_heater_status(H_E0, LCD_STR_THERMOMETER[0], blink); + #if HAS_HOTEND + _draw_heater_status(H_E0, LCD_STR_THERMOMETER[0], blink); - // - // Hotend 1 or Bed Temperature - // - #if HAS_MULTI_HOTEND - lcd_moveto(10, 0); - _draw_heater_status(H_E1, LCD_STR_THERMOMETER[0], blink); - #elif HAS_HEATED_BED - lcd_moveto(10, 0); - _draw_bed_status(blink); + // + // Hotend 1 or Bed Temperature + // + #if HAS_MULTI_HOTEND + lcd_moveto(10, 0); + _draw_heater_status(H_E1, LCD_STR_THERMOMETER[0], blink); + #elif HAS_HEATED_BED + lcd_moveto(10, 0); + _draw_bed_status(blink); + #endif + #endif + + #if HAS_COOLER + _draw_cooler_status('*', blink); + #endif + #if HAS_FLOWMETER + _draw_flowmeter_status(); #endif #endif // LCD_WIDTH >= 20 diff --git a/Marlin/src/lcd/dogm/dogm_Statusscreen.h b/Marlin/src/lcd/dogm/dogm_Statusscreen.h index d0dc288613..396b05b084 100644 --- a/Marlin/src/lcd/dogm/dogm_Statusscreen.h +++ b/Marlin/src/lcd/dogm/dogm_Statusscreen.h @@ -77,9 +77,12 @@ #ifndef STATUS_CUTTER_WIDTH #define STATUS_CUTTER_WIDTH 0 #endif + #ifndef STATUS_CUTTER_BYTEWIDTH + #define STATUS_CUTTER_BYTEWIDTH BW(STATUS_CUTTER_WIDTH) + #endif // -// Laser Cooler +// Laser cooler // #if !STATUS_COOLER_WIDTH && HAS_COOLER #include "status/cooler.h" @@ -87,6 +90,24 @@ #ifndef STATUS_COOLER_WIDTH #define STATUS_COOLER_WIDTH 0 #endif +#ifndef STATUS_COOLER_BYTEWIDTH + #define STATUS_COOLER_BYTEWIDTH BW(STATUS_COOLER_WIDTH) +#endif + +// +// Laser Flowmeter +// +#if !STATUS_FLOWMETER_WIDTH && HAS_FLOWMETER + #include "status/cooler.h" +#endif +#ifndef STATUS_FLOWMETER_WIDTH + #define STATUS_FLOWMETER_WIDTH 0 +#endif +#ifndef STATUS_FLOWMETER_BYTEWIDTH + #define STATUS_FLOWMETER_BYTEWIDTH BW(STATUS_FLOWMETER_WIDTH) +#endif + + // // Bed @@ -425,46 +446,45 @@ // // Cutter Bitmap Properties // -#ifndef STATUS_CUTTER_BYTEWIDTH - #define STATUS_CUTTER_BYTEWIDTH BW(STATUS_CUTTER_WIDTH) -#endif -#if STATUS_CUTTER_WIDTH +#if HAS_CUTTER + #if STATUS_CUTTER_WIDTH - #ifndef STATUS_CUTTER_X - #define STATUS_CUTTER_X (LCD_PIXEL_WIDTH - (STATUS_CUTTER_BYTEWIDTH + STATUS_CUTTER_BYTEWIDTH) * 8) - #endif - - #ifndef STATUS_CUTTER_HEIGHT - #ifdef STATUS_CUTTER_ANIM - #define STATUS_CUTTER_HEIGHT(S) ((S) ? sizeof(status_cutter_on_bmp) / (STATUS_CUTTER_BYTEWIDTH) : sizeof(status_cutter_bmp) / (STATUS_CUTTER_BYTEWIDTH)) - #else - #define STATUS_CUTTER_HEIGHT(S) (sizeof(status_cutter_bmp) / (STATUS_CUTTER_BYTEWIDTH)) + #ifndef STATUS_CUTTER_X + #define STATUS_CUTTER_X (LCD_PIXEL_WIDTH - (STATUS_CUTTER_BYTEWIDTH + STATUS_CUTTER_BYTEWIDTH) * 8) #endif - #endif - #ifndef STATUS_CUTTER_Y - #define STATUS_CUTTER_Y(S) 4 - #endif + #ifndef STATUS_CUTTER_HEIGHT + #ifdef STATUS_CUTTER_ANIM + #define STATUS_CUTTER_HEIGHT(S) ((S) ? sizeof(status_cutter_on_bmp) / (STATUS_CUTTER_BYTEWIDTH) : sizeof(status_cutter_bmp) / (STATUS_CUTTER_BYTEWIDTH)) + #else + #define STATUS_CUTTER_HEIGHT(S) (sizeof(status_cutter_bmp) / (STATUS_CUTTER_BYTEWIDTH)) + #endif + #endif - #ifndef STATUS_CUTTER_TEXT_X - #define STATUS_CUTTER_TEXT_X (STATUS_CUTTER_X -1) - #endif + #ifndef STATUS_CUTTER_Y + #define STATUS_CUTTER_Y(S) 4 + #endif - #ifndef STATUS_CUTTER_TEXT_Y - #define STATUS_CUTTER_TEXT_Y 28 - #endif + #ifndef STATUS_CUTTER_TEXT_X + #define STATUS_CUTTER_TEXT_X (STATUS_CUTTER_X -1) + #endif + + #ifndef STATUS_CUTTER_TEXT_Y + #define STATUS_CUTTER_TEXT_Y 28 + #endif - static_assert( - sizeof(status_cutter_bmp) == (STATUS_CUTTER_BYTEWIDTH) * (STATUS_CUTTER_HEIGHT(0)), - "Status cutter bitmap (status_cutter_bmp) dimensions don't match data." - ); - #ifdef STATUS_CUTTER_ANIM static_assert( - sizeof(status_cutter_on_bmp) == (STATUS_CUTTER_BYTEWIDTH) * (STATUS_CUTTER_HEIGHT(1)), - "Status cutter bitmap (status_cutter_on_bmp) dimensions don't match data." + sizeof(status_cutter_bmp) == (STATUS_CUTTER_BYTEWIDTH) * (STATUS_CUTTER_HEIGHT(0)), + "Status cutter bitmap (status_cutter_bmp) dimensions don't match data." ); - #endif + #ifdef STATUS_CUTTER_ANIM + static_assert( + sizeof(status_cutter_on_bmp) == (STATUS_CUTTER_BYTEWIDTH) * (STATUS_CUTTER_HEIGHT(1)), + "Status cutter bitmap (status_cutter_on_bmp) dimensions don't match data." + ); + #endif + #endif #endif // @@ -511,42 +531,72 @@ // // Cooler Bitmap Properties // -#ifndef STATUS_COOLER_BYTEWIDTH - #define STATUS_COOLER_BYTEWIDTH BW(STATUS_COOLER_WIDTH) -#endif -#if STATUS_COOLER_WIDTH +#if HAS_COOLER + #if STATUS_COOLER_WIDTH - #ifndef STATUS_COOLER_X - #define STATUS_COOLER_X (LCD_PIXEL_WIDTH - (STATUS_COOLER_BYTEWIDTH + STATUS_FAN_BYTEWIDTH + STATUS_CUTTER_BYTEWIDTH) * 8) - #endif + #ifndef STATUS_COOLER_X + #define STATUS_COOLER_X (LCD_PIXEL_WIDTH - (STATUS_COOLER_BYTEWIDTH + STATUS_FAN_BYTEWIDTH + STATUS_CUTTER_BYTEWIDTH) * 8) + #endif - #ifndef STATUS_COOLER_HEIGHT + #ifndef STATUS_COOLER_HEIGHT + #define STATUS_COOLER_HEIGHT(S) (sizeof(status_cooler_bmp1) / (STATUS_COOLER_BYTEWIDTH)) + #endif + + #ifndef STATUS_COOLER_Y + #define STATUS_COOLER_Y(S) (18 - STATUS_COOLER_HEIGHT(S)) + #endif + + #ifndef STATUS_COOLER_TEXT_X + #define STATUS_COOLER_TEXT_X (STATUS_COOLER_X + 8) + #endif + + static_assert( + sizeof(status_cooler_bmp1) == (STATUS_COOLER_BYTEWIDTH) * (STATUS_COOLER_HEIGHT(0)), + "Status cooler bitmap (status_cooler_bmp1) dimensions don't match data." + ); #ifdef STATUS_COOLER_ANIM - #define STATUS_COOLER_HEIGHT(S) ((S) ? sizeof(status_cooler_on_bmp) / (STATUS_COOLER_BYTEWIDTH) : sizeof(status_cooler_bmp) / (STATUS_COOLER_BYTEWIDTH)) - #else - #define STATUS_COOLER_HEIGHT(S) (sizeof(status_cooler_bmp) / (STATUS_COOLER_BYTEWIDTH)) + static_assert( + sizeof(status_cooler_bmp2) == (STATUS_COOLER_BYTEWIDTH) * (STATUS_COOLER_HEIGHT(1)), + "Status cooler bitmap (status_cooler_bmp2) dimensions don't match data." + ); + #endif + + #endif +#endif + +// +// Flowmeter Bitmap Properties +// +#if HAS_FLOWMETER + #if STATUS_FLOWMETER_WIDTH + + #ifndef STATUS_FLOWMETER_X + #define STATUS_FLOWMETER_X (LCD_PIXEL_WIDTH - (STATUS_FLOWMETER_BYTEWIDTH + STATUS_FAN_BYTEWIDTH + STATUS_CUTTER_BYTEWIDTH + STATUS_COOLER_BYTEWIDTH) * 8) + #endif + + #ifndef STATUS_FLOWMETER_HEIGHT + #define STATUS_FLOWMETER_HEIGHT(S) (sizeof(status_flowmeter_bmp1) / (STATUS_FLOWMETER_BYTEWIDTH)) + #endif + + #ifndef STATUS_FLOWMETER_Y + #define STATUS_FLOWMETER_Y(S) (20 - STATUS_FLOWMETER_HEIGHT(S)) + #endif + + #ifndef STATUS_FLOWMETER_TEXT_X + #define STATUS_FLOWMETER_TEXT_X (STATUS_FLOWMETER_X + 8) + #endif + + static_assert( + sizeof(status_flowmeter_bmp1) == (STATUS_FLOWMETER_BYTEWIDTH) * STATUS_FLOWMETER_HEIGHT(0), + "Status flowmeter bitmap (status_flowmeter_bmp1) dimensions don't match data." + ); + #ifdef STATUS_COOLER_ANIM + static_assert( + sizeof(status_flowmeter_bmp2) == (STATUS_FLOWMETER_BYTEWIDTH) * STATUS_FLOWMETER_HEIGHT(1), + "Status flowmeter bitmap (status_flowmeter_bmp2) dimensions don't match data." + ); #endif #endif - - #ifndef STATUS_COOLER_Y - #define STATUS_COOLER_Y(S) (18 - STATUS_COOLER_HEIGHT(S)) - #endif - - #ifndef STATUS_COOLER_TEXT_X - #define STATUS_COOLER_TEXT_X (STATUS_COOLER_X + 8) - #endif - - static_assert( - sizeof(status_cooler_bmp) == (STATUS_COOLER_BYTEWIDTH) * (STATUS_COOLER_HEIGHT(0)), - "Status cooler bitmap (status_cooler_bmp) dimensions don't match data." - ); - #ifdef STATUS_COOLER_ANIM - static_assert( - sizeof(status_cooler_on_bmp) == (STATUS_COOLER_BYTEWIDTH) * (STATUS_COOLER_HEIGHT(1)), - "Status cooler bitmap (status_cooler_on_bmp) dimensions don't match data." - ); - #endif - #endif // @@ -639,6 +689,9 @@ #if HAS_COOLER #define DO_DRAW_COOLER 1 #endif +#if HAS_FLOWMETER + #define DO_DRAW_FLOWMETER 1 +#endif #if HAS_TEMP_CHAMBER && STATUS_CHAMBER_WIDTH && HOTENDS <= 4 #define DO_DRAW_CHAMBER 1 @@ -661,6 +714,9 @@ #if BOTH(DO_DRAW_COOLER, STATUS_COOLER_ANIM) #define ANIM_COOLER 1 #endif +#if BOTH(DO_DRAW_FLOWMETER, STATUS_FLOWMETER_ANIM) + #define ANIM_FLOWMETER 1 +#endif #if ANIM_HOTEND || ANIM_BED || ANIM_CHAMBER || ANIM_CUTTER #define ANIM_HBCC 1 #endif diff --git a/Marlin/src/lcd/dogm/status/cooler.h b/Marlin/src/lcd/dogm/status/cooler.h index 4e59e237a2..0d72efea72 100644 --- a/Marlin/src/lcd/dogm/status/cooler.h +++ b/Marlin/src/lcd/dogm/status/cooler.h @@ -24,12 +24,9 @@ // // lcd/dogm/status/cooler.h - Status Screen Laser Cooler bitmaps // - -#define STATUS_COOLER_WIDTH 16 - -#ifdef STATUS_COOLER_ANIM - - const unsigned char status_cooler_on_bmp[] PROGMEM = { +#if HAS_COOLER + #define STATUS_COOLER_WIDTH 16 + const unsigned char status_cooler_bmp2[] PROGMEM = { B00010000,B00001000, B00010010,B01001001, B01010100,B00101010, @@ -47,24 +44,71 @@ B00000010,B10100000, B00000100,B10010000 }; - + const unsigned char status_cooler_bmp1[] PROGMEM = { + B00010000,B00001000, + B00010010,B01001001, + B01010100,B00101010, + B00101000,B00010100, + B11000111,B01100011, + B00101000,B00010100, + B01010100,B00101010, + B10010000,B10001001, + B00010000,B10000000, + B00000100,B10010000, + B00000010,B10100000, + B00000001,B01000000, + B00011110,B00111100, + B00000001,B01000000, + B00000010,B10100000, + B00000100,B10010000 + }; +#endif + +#if HAS_FLOWMETER + #define STATUS_FLOWMETER_WIDTH 24 + const unsigned char status_flowmeter_bmp2[] PROGMEM = { + B00000001,B11111000,B00000000, + B00000110,B00000110,B00000000, + B00001000,B01100001,B00000000, + B00010000,B01100000,B10000000, + B00100000,B01100000,B01000000, + B00100000,B01100000,B01000000, + B01000000,B01100000,B00100000, + B01000000,B01100000,B00100000, + B01011111,B11111111,B10100000, + B01011111,B11111111,B10100000, + B01000000,B01100000,B00100000, + B01000000,B01100000,B00100000, + B00100000,B01100000,B01000000, + B00100000,B01100000,B01000000, + B00010000,B01100000,B10000000, + B00001000,B01100001,B00000000, + B00000110,B00000110,B00000000, + B00000001,B11111000,B00000000, + B00000000,B01100000,B00000000, + B00011111,B11111111,B10000000 + }; + const unsigned char status_flowmeter_bmp1[] PROGMEM = { + B00000001,B11111000,B00000000, + B00000110,B00000110,B00000000, + B00001000,B00000001,B00000000, + B00010100,B00000010,B10000000, + B00101110,B00000111,B01000000, + B00100111,B00001110,B01000000, + B01000011,B10011100,B00100000, + B01000001,B11111000,B00100000, + B01000000,B11110000,B00100000, + B01000000,B11110000,B00100000, + B01000001,B11111000,B00100000, + B01000011,B10011100,B00100000, + B00100111,B00001110,B01000000, + B00101110,B00000111,B01000000, + B00010100,B00000010,B10000000, + B00001000,B00000001,B00000000, + B00000110,B00000110,B00000000, + B00000001,B11111000,B00000000, + B00000000,B01100000,B00000000, + B00011111,B11111111,B10000000 + }; #endif -const unsigned char status_cooler_bmp[] PROGMEM = { - B00010000,B00001000, - B00010010,B01001001, - B01010100,B00101010, - B00101000,B00010100, - B11000111,B01100011, - B00101000,B00010100, - B01010100,B00101010, - B10010000,B10001001, - B00010000,B10000000, - B00000100,B10010000, - B00000010,B10100000, - B00000001,B01000000, - B00011110,B00111100, - B00000001,B01000000, - B00000010,B10100000, - B00000100,B10010000 -}; diff --git a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp index 7d97a1cdcf..2ec462c34a 100644 --- a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp +++ b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp @@ -53,6 +53,10 @@ #include "../../feature/spindle_laser.h" #endif +#if HAS_COOLER || HAS_FLOWMETER + #include "../../feature/cooler.h" +#endif + #if HAS_POWER_MONITOR #include "../../feature/power_monitor.h" #endif @@ -83,40 +87,34 @@ #if ANIM_HBCC enum HeatBits : uint8_t { - HEATBIT_HOTEND, - HEATBIT_BED = HOTENDS, - HEATBIT_CHAMBER, - HEATBIT_COOLER, - HEATBIT_CUTTER + DRAWBIT_HOTEND, + DRAWBIT_BED = HOTENDS, + DRAWBIT_CHAMBER, + DRAWBIT_CUTTER }; - IF<(HEATBIT_CUTTER > 7), uint16_t, uint8_t>::type heat_bits; + IF<(DRAWBIT_CUTTER > 7), uint16_t, uint8_t>::type draw_bits; #endif #if ANIM_HOTEND - #define HOTEND_ALT(N) TEST(heat_bits, HEATBIT_HOTEND + N) + #define HOTEND_ALT(N) TEST(draw_bits, DRAWBIT_HOTEND + N) #else #define HOTEND_ALT(N) false #endif #if ANIM_BED - #define BED_ALT() TEST(heat_bits, HEATBIT_BED) + #define BED_ALT() TEST(draw_bits, DRAWBIT_BED) #else #define BED_ALT() false #endif #if ANIM_CHAMBER - #define CHAMBER_ALT() TEST(heat_bits, HEATBIT_CHAMBER) + #define CHAMBER_ALT() TEST(draw_bits, DRAWBIT_CHAMBER) #else #define CHAMBER_ALT() false #endif #if ANIM_CUTTER - #define CUTTER_ALT(N) TEST(heat_bits, HEATBIT_CUTTER) + #define CUTTER_ALT(N) TEST(draw_bits, DRAWBIT_CUTTER) #else #define CUTTER_ALT() false #endif -#if ANIM_COOLER - #define COOLER_ALT(N) TEST(heat_bits, HEATBIT_COOLER) -#else - #define COOLER_ALT() false -#endif #if DO_DRAW_HOTENDS #define MAX_HOTEND_DRAW _MIN(HOTENDS, ((LCD_PIXEL_WIDTH - (STATUS_LOGO_BYTEWIDTH + STATUS_FAN_BYTEWIDTH) * 8) / (STATUS_HEATERS_XSPACE))) @@ -194,6 +192,15 @@ FORCE_INLINE void _draw_centered_temp(const celsius_t temp, const uint8_t tx, co lcd_put_wchar(LCD_STR_DEGREE[0]); } +#if DO_DRAW_FLOWMETER + FORCE_INLINE void _draw_centered_flowrate(const float flow, const uint8_t tx, const uint8_t ty) { + const char *str = ftostr11ns(flow); + const uint8_t len = str[0] != ' ' ? 3 : str[1] != ' ' ? 2 : 1; + lcd_put_u8str(tx - len * (INFO_FONT_WIDTH) / 2 + 1, ty, &str[3-len]); + lcd_put_u8str("L"); + } +#endif + #if DO_DRAW_HOTENDS // Draw hotend bitmap with current and target temperatures @@ -384,6 +391,13 @@ FORCE_INLINE void _draw_centered_temp(const celsius_t temp, const uint8_t tx, co } #endif +#if DO_DRAW_FLOWMETER + FORCE_INLINE void _draw_flowmeter_status() { + if (PAGE_CONTAINS(28 - INFO_FONT_ASCENT, 28 - 1)) + _draw_centered_flowrate(cooler.flowrate, STATUS_FLOWMETER_TEXT_X, 28); + } +#endif + // // Before homing, blink '123' <-> '???'. // Homed but unknown... '123' <-> ' '. @@ -451,17 +465,14 @@ void MarlinUI::draw_status_screen() { #if ANIM_HBCC uint8_t new_bits = 0; #if ANIM_HOTEND - HOTEND_LOOP() if (thermalManager.isHeatingHotend(e)) SBI(new_bits, HEATBIT_HOTEND + e); + HOTEND_LOOP() if (thermalManager.isHeatingHotend(e)) SBI(new_bits, DRAWBIT_HOTEND + e); #endif - if (TERN0(ANIM_BED, thermalManager.isHeatingBed())) SBI(new_bits, HEATBIT_BED); + if (TERN0(ANIM_BED, thermalManager.isHeatingBed())) SBI(new_bits, DRAWBIT_BED); #if DO_DRAW_CHAMBER && HAS_HEATED_CHAMBER - if (thermalManager.isHeatingChamber()) SBI(new_bits, HEATBIT_CHAMBER); + if (thermalManager.isHeatingChamber()) SBI(new_bits, DRAWBIT_CHAMBER); #endif - #if DO_DRAW_COOLER && HAS_COOLER - if (thermalManager.isLaserCooling()) SBI(new_bits, HEATBIT_COOLER); - #endif - if (TERN0(ANIM_CUTTER, cutter.enabled())) SBI(new_bits, HEATBIT_CUTTER); - heat_bits = new_bits; + if (TERN0(ANIM_CUTTER, cutter.enabled())) SBI(new_bits, DRAWBIT_CUTTER); + draw_bits = new_bits; #endif const xyz_pos_t lpos = current_position.asLogical(); @@ -646,17 +657,21 @@ void MarlinUI::draw_status_screen() { // Laser Cooler #if DO_DRAW_COOLER - #if ANIM_COOLER - #define COOLER_BITMAP(S) ((S) ? status_cooler_bmp : status_cooler_on_bmp) - #else - #define COOLER_BITMAP(S) status_cooler_bmp - #endif - const uint8_t coolery = STATUS_COOLER_Y(COOLER_ALT()), - coolerh = STATUS_COOLER_HEIGHT(COOLER_ALT()); + const uint8_t coolery = STATUS_COOLER_Y(status_cooler_bmp1), + coolerh = STATUS_COOLER_HEIGHT(status_cooler_bmp1); if (PAGE_CONTAINS(coolery, coolery + coolerh - 1)) - u8g.drawBitmapP(STATUS_COOLER_X, coolery, STATUS_COOLER_BYTEWIDTH, coolerh, COOLER_BITMAP(COOLER_ALT())); + u8g.drawBitmapP(STATUS_COOLER_X, coolery, STATUS_COOLER_BYTEWIDTH, coolerh, blink && cooler.enabled ? status_cooler_bmp2 : status_cooler_bmp1); #endif + // Laser Cooler Flow Meter + #if DO_DRAW_FLOWMETER + const uint8_t flowmetery = STATUS_FLOWMETER_Y(status_flowmeter_bmp1), + flowmeterh = STATUS_FLOWMETER_HEIGHT(status_flowmeter_bmp1); + if (PAGE_CONTAINS(flowmetery, flowmetery + flowmeterh - 1)) + u8g.drawBitmapP(STATUS_FLOWMETER_X, flowmetery, STATUS_FLOWMETER_BYTEWIDTH, flowmeterh, blink && cooler.flowpulses ? status_flowmeter_bmp2 : status_flowmeter_bmp1); + #endif + + // Heated Bed TERN_(DO_DRAW_BED, _draw_bed_status(blink)); @@ -666,6 +681,9 @@ void MarlinUI::draw_status_screen() { // Cooler TERN_(DO_DRAW_COOLER, _draw_cooler_status()); + // Flowmeter + TERN_(DO_DRAW_FLOWMETER, _draw_flowmeter_status()); + // Fan, if a bitmap was provided #if DO_DRAW_FAN if (PAGE_CONTAINS(STATUS_FAN_TEXT_Y - INFO_FONT_ASCENT, STATUS_FAN_TEXT_Y - 1)) { diff --git a/Marlin/src/lcd/language/language_en.h b/Marlin/src/lcd/language/language_en.h index 78d446dd99..81450d7385 100644 --- a/Marlin/src/lcd/language/language_en.h +++ b/Marlin/src/lcd/language/language_en.h @@ -116,10 +116,10 @@ namespace Language_en { PROGMEM Language_Str MSG_LASER_TOGGLE = _UxGT("Toggle Laser"); PROGMEM Language_Str MSG_LASER_PULSE_MS = _UxGT("Test Pulse ms"); PROGMEM Language_Str MSG_LASER_FIRE_PULSE = _UxGT("Fire Pulse"); + PROGMEM Language_Str MSG_FLOWMETER_FAULT = _UxGT("Coolant Flow Fault"); PROGMEM Language_Str MSG_SPINDLE_TOGGLE = _UxGT("Toggle Spindle"); PROGMEM Language_Str MSG_SPINDLE_FORWARD = _UxGT("Spindle Forward"); PROGMEM Language_Str MSG_SPINDLE_REVERSE = _UxGT("Spindle Reverse"); - PROGMEM Language_Str MSG_SWITCH_PS_ON = _UxGT("Switch Power On"); PROGMEM Language_Str MSG_SWITCH_PS_OFF = _UxGT("Switch Power Off"); PROGMEM Language_Str MSG_EXTRUDE = _UxGT("Extrude"); @@ -278,6 +278,7 @@ namespace Language_en { PROGMEM Language_Str MSG_CHAMBER = _UxGT("Enclosure"); PROGMEM Language_Str MSG_COOLER = _UxGT("Laser Coolant"); PROGMEM Language_Str MSG_COOLER_TOGGLE = _UxGT("Toggle Cooler"); + PROGMEM Language_Str MSG_FLOWMETER_SAFETY = _UxGT("Flow Safety"); PROGMEM Language_Str MSG_LASER = _UxGT("Laser"); PROGMEM Language_Str MSG_FAN_SPEED = _UxGT("Fan Speed"); PROGMEM Language_Str MSG_FAN_SPEED_N = _UxGT("Fan Speed ~"); diff --git a/Marlin/src/lcd/marlinui.cpp b/Marlin/src/lcd/marlinui.cpp index 8fef36e25a..4d457dc6aa 100644 --- a/Marlin/src/lcd/marlinui.cpp +++ b/Marlin/src/lcd/marlinui.cpp @@ -1513,6 +1513,12 @@ void MarlinUI::update() { TERN_(HAS_LCD_MENU, return_to_status()); } + void MarlinUI::flow_fault() { + LCD_ALERTMESSAGEPGM(MSG_FLOWMETER_FAULT); + TERN_(HAS_BUZZER, buzz(1000, 440)); + TERN_(HAS_LCD_MENU, return_to_status()); + } + #if ANY(PARK_HEAD_ON_PAUSE, SDSUPPORT) #include "../gcode/queue.h" #endif diff --git a/Marlin/src/lcd/marlinui.h b/Marlin/src/lcd/marlinui.h index cc08284d17..f85771f562 100644 --- a/Marlin/src/lcd/marlinui.h +++ b/Marlin/src/lcd/marlinui.h @@ -43,6 +43,10 @@ #define HAS_ENCODER_ACTION 1 #endif +#if HAS_STATUS_MESSAGE + #define START_OF_UTF8_CHAR(C) (((C) & 0xC0u) != 0x80U) +#endif + #if E_MANUAL > 1 #define MULTI_MANUAL 1 #endif @@ -311,6 +315,7 @@ public: static void abort_print(); static void pause_print(); static void resume_print(); + static void flow_fault(); #if HAS_WIRED_LCD diff --git a/Marlin/src/lcd/menu/menu_temperature.cpp b/Marlin/src/lcd/menu/menu_temperature.cpp index 8caf87d33b..fb47c22ce9 100644 --- a/Marlin/src/lcd/menu/menu_temperature.cpp +++ b/Marlin/src/lcd/menu/menu_temperature.cpp @@ -35,7 +35,7 @@ #include "../../module/motion.h" #endif -#if HAS_COOLER +#if HAS_COOLER || HAS_FLOWMETER #include "../../feature/cooler.h" #endif @@ -192,11 +192,19 @@ void menu_temperature() { // Cooler: // #if HAS_COOLER - editable.state = cooler.is_enabled(); - EDIT_ITEM(bool, MSG_COOLER(TOGGLE), &cooler.state, []{ if (editable.state) cooler.disable(); else cooler.enable(); }); + bool cstate = cooler.enabled; + EDIT_ITEM(bool, MSG_COOLER_TOGGLE, &cstate, cooler.toggle); EDIT_ITEM_FAST(int3, MSG_COOLER, &thermalManager.temp_cooler.target, COOLER_MIN_TARGET, COOLER_MAX_TARGET, thermalManager.start_watching_cooler); #endif + // + // Flow Meter Safety Shutdown: + // + #if ENABLED(FLOWMETER_SAFETY) + bool fstate = cooler.flowsafety_enabled; + EDIT_ITEM(bool, MSG_FLOWMETER_SAFETY, &fstate, cooler.flowsafety_toggle); + #endif + // // Fan Speed: // diff --git a/Marlin/src/libs/numtostr.cpp b/Marlin/src/libs/numtostr.cpp index 90696e9ad3..283734faab 100644 --- a/Marlin/src/libs/numtostr.cpp +++ b/Marlin/src/libs/numtostr.cpp @@ -177,6 +177,15 @@ const char* i16tostr4signrj(const int16_t i) { return &conv[3]; } +// Convert unsigned float to string with 1.1 format +const char* ftostr11ns(const float &f) { + const long i = UINTFLOAT(f, 1); + conv[4] = DIGIMOD(i, 10); + conv[5] = '.'; + conv[6] = DIGIMOD(i, 1); + return &conv[4]; +} + // Convert unsigned float to string with 1.23 format const char* ftostr12ns(const float &f) { const long i = UINTFLOAT(f, 2); diff --git a/Marlin/src/libs/numtostr.h b/Marlin/src/libs/numtostr.h index 40c298af42..54cebab252 100644 --- a/Marlin/src/libs/numtostr.h +++ b/Marlin/src/libs/numtostr.h @@ -61,6 +61,9 @@ const char* i16tostr3left(const int16_t xx); // Convert signed int to rj string with _123, -123, _-12, or __-1 format const char* i16tostr4signrj(const int16_t x); +// Convert unsigned float to string with 1.2 format +const char* ftostr11ns(const float &x); + // Convert unsigned float to string with 1.23 format const char* ftostr12ns(const float &x); diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index a9b7ab13eb..5a8704d3ba 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -35,7 +35,7 @@ #include "endstops.h" #include "planner.h" -#if HAS_COOLER +#if HAS_COOLER || HAS_FLOWMETER #include "../feature/cooler.h" #include "../feature/spindle_laser.h" #endif @@ -52,6 +52,10 @@ #include "../lcd/extui/ui_api.h" #endif +#if ENABLED(HOST_PROMPT_SUPPORT) + #include "../feature/host_actions.h" +#endif + // LIB_MAX31855 can be added to the build_flags in platformio.ini to use a user-defined library #if LIB_USR_MAX31855 #include @@ -1506,7 +1510,7 @@ void Temperature::manage_heater() { static bool flag_cooler_state; // = false - if (cooler.is_enabled()) { + if (cooler.enabled) { flag_cooler_state = true; // used to allow M106 fan control when cooler is disabled if (temp_cooler.target == 0) temp_cooler.target = COOLER_MIN_TARGET; if (ELAPSED(ms, next_cooler_check_ms)) { @@ -1542,8 +1546,19 @@ void Temperature::manage_heater() { #if ENABLED(THERMAL_PROTECTION_COOLER) tr_state_machine[RUNAWAY_IND_COOLER].run(temp_cooler.celsius, temp_cooler.target, H_COOLER, THERMAL_PROTECTION_COOLER_PERIOD, THERMAL_PROTECTION_COOLER_HYSTERESIS); #endif + #endif // HAS_COOLER + #if HAS_FLOWMETER + cooler.flowmeter_task(ms); + #if ENABLED(FLOWMETER_SAFETY) + if (cutter.enabled() && cooler.check_flow_too_low()) { + cutter.disable(); + ui.flow_fault(); + } + #endif + #endif + UNUSED(ms); } diff --git a/buildroot/tests/mega2560 b/buildroot/tests/mega2560 index 4498492ba5..3c8f720238 100755 --- a/buildroot/tests/mega2560 +++ b/buildroot/tests/mega2560 @@ -167,6 +167,26 @@ exec_test $1 $2 "Azteeg X3 | Mixing Extruder (x5) | Gradient Mix | Greek" "$3" #opt_enable LCM1602 #exec_test $1 $2 "Stuff" "$3" +# +# Test Laser features with 12864 LCD +# +restore_configs +opt_set MOTHERBOARD BOARD_RAMPS_14_EFB LCD_LANGUAGE en TEMP_SENSOR_COOLER 1 EXTRUDERS 0 TEMP_SENSOR_1 0 +opt_enable REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER SDSUPPORT EEPROM_SETTINGS EEPROM_BOOT_SILENT EEPROM_AUTO_INIT \ + LASER_FEATURE LASER_COOLANT_FLOW_METER + +exec_test $1 $2 "REPRAP MEGA2560 RAMPS | Laser Feature | Cooler | Flowmeter | 12864 LCD " "$3" + +# +# Test Laser features with 44780 LCD +# +restore_configs +opt_set MOTHERBOARD BOARD_RAMPS_14_EFB LCD_LANGUAGE en TEMP_SENSOR_COOLER 1 EXTRUDERS 0 TEMP_SENSOR_1 0 +opt_enable REPRAP_DISCOUNT_SMART_CONTROLLER SDSUPPORT EEPROM_SETTINGS EEPROM_BOOT_SILENT EEPROM_AUTO_INIT \ + LASER_FEATURE LASER_COOLANT_FLOW_METER + +exec_test $1 $2 "REPRAP MEGA2560 RAMPS | Laser Feature | Cooler | Flowmeter | 44780 LCD " "$3" + # # Language files test with REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CONTROLLER # diff --git a/platformio.ini b/platformio.ini index 82c11c2b6d..26b27bbf99 100644 --- a/platformio.ini +++ b/platformio.ini @@ -82,6 +82,7 @@ default_src_filter = + - - + - - - - - + - - - - - - - @@ -198,7 +199,6 @@ default_src_filter = + - - + - - - - - - - - @@ -411,7 +411,7 @@ SDSUPPORT = src_filter=+ + GCODE_REPEAT_MARKERS = src_filter=+ + HAS_EXTRUDERS = src_filter=+ + -HAS_COOLER = src_filter=- +HAS_COOLER = src_filter=+ + AUTO_REPORT_TEMPERATURES = src_filter=+ INCH_MODE_SUPPORT = src_filter=+ TEMPERATURE_UNITS_SUPPORT = src_filter=+ From 33ccf1b9310ad2f1100d67346404a2e91a7b205a Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 29 Mar 2021 01:49:35 -0500 Subject: [PATCH 218/253] Adjust mfconfig script --- buildroot/share/git/mfconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildroot/share/git/mfconfig b/buildroot/share/git/mfconfig index 3fd5e399cc..fe99d6b247 100755 --- a/buildroot/share/git/mfconfig +++ b/buildroot/share/git/mfconfig @@ -83,7 +83,7 @@ if [[ $ACTION == "init" ]]; then TEMP=$( mktemp -d ) ; cp -R config $TEMP # Make sure we're not on the 'BASE' branch... - git checkout master >/dev/null 2>&1 || exit + git checkout init-repo >/dev/null 2>&1 || exit # Create 'BASE' as a copy of 'init-repo' (README, LICENSE, etc.) git branch -D BASE 2>/dev/null From a335cf2edf66db08ab12d3800784b58ad992f6a9 Mon Sep 17 00:00:00 2001 From: Malderin <52313714+Malderin@users.noreply.github.com> Date: Mon, 29 Mar 2021 11:19:38 +0300 Subject: [PATCH 219/253] Fix MKS LVGL UI Main screen / print buttons (#21468) --- .../src/lcd/extui/lib/mks_ui/draw_dialog.cpp | 2 +- .../lcd/extui/lib/mks_ui/draw_extrusion.cpp | 2 +- .../extui/lib/mks_ui/draw_filament_change.cpp | 10 ++-- .../src/lcd/extui/lib/mks_ui/draw_preHeat.cpp | 8 +-- .../lcd/extui/lib/mks_ui/draw_printing.cpp | 58 ++++++++++++------- .../lcd/extui/lib/mks_ui/draw_ready_print.cpp | 46 +++++++-------- .../lcd/extui/lib/mks_ui/draw_ready_print.h | 1 + Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp | 6 +- .../src/lcd/extui/lib/mks_ui/wifi_module.cpp | 12 ++-- 9 files changed, 82 insertions(+), 63 deletions(-) diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp index c4ae6e221d..c4056f392a 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.cpp @@ -486,7 +486,7 @@ void lv_draw_dialog(uint8_t type) { void filament_sprayer_temp() { char buf[20] = {0}; - sprintf(buf, preheat_menu.value_state, (int)thermalManager.degHotend(uiCfg.extruderIndex), (int)thermalManager.degTargetHotend(uiCfg.extruderIndex)); + sprintf(buf, preheat_menu.value_state, thermalManager.degHotend(uiCfg.extruderIndex), thermalManager.degTargetHotend(uiCfg.extruderIndex)); strcpy(public_buf_l, uiCfg.extruderIndex < 1 ? extrude_menu.ext1 : extrude_menu.ext2); strcat_P(public_buf_l, PSTR(": ")); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp index 43ed214199..056e2e5d54 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.cpp @@ -195,7 +195,7 @@ void disp_ext_speed() { void disp_hotend_temp() { char buf[20] = {0}; - sprintf(buf, extrude_menu.temp_value, (int)thermalManager.degHotend(uiCfg.extruderIndex), (int)thermalManager.degTargetHotend(uiCfg.extruderIndex)); + sprintf(buf, extrude_menu.temp_value, thermalManager.degHotend(uiCfg.extruderIndex), thermalManager.degTargetHotend(uiCfg.extruderIndex)); strcpy(public_buf_l, extrude_menu.temper_text); strcat(public_buf_l, buf); lv_label_set_text(tempText, public_buf_l); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.cpp index 56a776c79e..296359bc53 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.cpp @@ -50,8 +50,8 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { switch (obj->mks_obj_id) { case ID_FILAMNT_IN: uiCfg.filament_load_heat_flg = true; - if ((abs(thermalManager.degTargetHotend(uiCfg.extruderIndex) - thermalManager.degHotend(uiCfg.extruderIndex)) <= 1) - || (gCfgItems.filament_limit_temp <= thermalManager.degHotend(uiCfg.extruderIndex))) { + if (abs(thermalManager.degTargetHotend(uiCfg.extruderIndex) - thermalManager.degHotend(uiCfg.extruderIndex)) <= 1 + || gCfgItems.filament_limit_temp <= thermalManager.degHotend(uiCfg.extruderIndex)) { lv_clear_filament_change(); lv_draw_dialog(DIALOG_TYPE_FILAMENT_HEAT_LOAD_COMPLETED); } @@ -67,8 +67,8 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { case ID_FILAMNT_OUT: uiCfg.filament_unload_heat_flg = true; if (thermalManager.degTargetHotend(uiCfg.extruderIndex) - && ((abs((int)((int)thermalManager.degTargetHotend(uiCfg.extruderIndex) - thermalManager.degHotend(uiCfg.extruderIndex))) <= 1) - || ((int)thermalManager.degHotend(uiCfg.extruderIndex) >= gCfgItems.filament_limit_temp)) + && (abs((int)(thermalManager.degTargetHotend(uiCfg.extruderIndex) - thermalManager.degHotend(uiCfg.extruderIndex))) <= 1 + || thermalManager.degHotend(uiCfg.extruderIndex) >= gCfgItems.filament_limit_temp) ) { lv_clear_filament_change(); lv_draw_dialog(DIALOG_TYPE_FILAMENT_HEAT_UNLOAD_COMPLETED); @@ -154,7 +154,7 @@ void disp_filament_temp() { public_buf_l[0] = '\0'; strcat(public_buf_l, uiCfg.extruderIndex < 1 ? preheat_menu.ext1 : preheat_menu.ext2); - sprintf(buf, preheat_menu.value_state, (int)thermalManager.degHotend(uiCfg.extruderIndex), (int)thermalManager.degTargetHotend(uiCfg.extruderIndex)); + sprintf(buf, preheat_menu.value_state, thermalManager.degHotend(uiCfg.extruderIndex), thermalManager.degTargetHotend(uiCfg.extruderIndex)); strcat_P(public_buf_l, PSTR(": ")); strcat(public_buf_l, buf); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp index 73a0808e9c..d23ed0b05f 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.cpp @@ -76,7 +76,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { case ID_P_DEC: if (uiCfg.curTempType == 0) { - if ((int)thermalManager.degTargetHotend(uiCfg.extruderIndex) > uiCfg.stepHeat) + if (thermalManager.degTargetHotend(uiCfg.extruderIndex) > uiCfg.stepHeat) thermalManager.temp_hotend[uiCfg.extruderIndex].target -= uiCfg.stepHeat; else thermalManager.setTargetHotend(0, uiCfg.extruderIndex); @@ -84,7 +84,7 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } #if HAS_HEATED_BED else { - if ((int)thermalManager.temp_bed.target > uiCfg.stepHeat) + if (thermalManager.degTargetBed() > uiCfg.stepHeat) thermalManager.temp_bed.target -= uiCfg.stepHeat; else thermalManager.setTargetBed(0); @@ -217,12 +217,12 @@ void disp_desire_temp() { if (uiCfg.curTempType == 0) { strcat(public_buf_l, uiCfg.extruderIndex < 1 ? preheat_menu.ext1 : preheat_menu.ext2); - sprintf(buf, preheat_menu.value_state, (int)thermalManager.degHotend(uiCfg.extruderIndex), (int)thermalManager.degTargetHotend(uiCfg.extruderIndex)); + sprintf(buf, preheat_menu.value_state, thermalManager.degHotend(uiCfg.extruderIndex), thermalManager.degTargetHotend(uiCfg.extruderIndex)); } #if HAS_HEATED_BED else { strcat(public_buf_l, preheat_menu.hotbed); - sprintf(buf, preheat_menu.value_state, (int)thermalManager.temp_bed.celsius, (int)thermalManager.temp_bed.target); + sprintf(buf, preheat_menu.value_state, thermalManager.degBed(), thermalManager.degTargetBed()); } #endif strcat_P(public_buf_l, PSTR(": ")); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp index 70c57f4af8..9bd120ce15 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.cpp @@ -47,7 +47,7 @@ static lv_obj_t *scr; static lv_obj_t *labelExt1, *labelFan, *labelZpos, *labelTime; static lv_obj_t *labelPause, *labelStop, *labelOperat; static lv_obj_t *bar1, *bar1ValueText; -static lv_obj_t *buttonPause, *buttonOperat, *buttonStop; +static lv_obj_t *buttonPause, *buttonOperat, *buttonStop, *buttonExt1, *buttonExt2, *buttonBedstate, *buttonFanstate, *buttonZpos; #if ENABLED(HAS_MULTI_EXTRUDER) static lv_obj_t *labelExt2; @@ -60,7 +60,11 @@ static lv_obj_t *buttonPause, *buttonOperat, *buttonStop; enum { ID_PAUSE = 1, ID_STOP, - ID_OPTION + ID_OPTION, + ID_TEMP_EXT, + ID_TEMP_BED, + ID_BABYSTEP, + ID_FAN }; bool once_flag; // = false @@ -100,7 +104,6 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { } #endif break; - case ID_STOP: lv_clear_printing(); lv_draw_dialog(DIALOG_TYPE_STOP); @@ -109,6 +112,24 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { lv_clear_printing(); lv_draw_operation(); break; + case ID_TEMP_EXT: + uiCfg.curTempType = 0; + lv_clear_printing(); + lv_draw_preHeat(); + break; + case ID_TEMP_BED: + uiCfg.curTempType = 1; + lv_clear_printing(); + lv_draw_preHeat(); + break; + case ID_BABYSTEP: + lv_clear_printing(); + lv_draw_baby_stepping(); + break; + case ID_FAN: + lv_clear_printing(); + lv_draw_fan(); + break; } } @@ -118,33 +139,23 @@ void lv_draw_printing() { scr = lv_screen_create(PRINTING_UI); // Create image buttons - lv_obj_t *buttonExt1 = lv_img_create(scr, nullptr); - lv_img_set_src(buttonExt1, "F:/bmp_ext1_state.bin"); - lv_obj_set_pos(buttonExt1, 205, 136); + buttonExt1 = lv_imgbtn_create(scr, "F:/bmp_ext1_state.bin", 206, 136, event_handler, ID_TEMP_EXT); #if HAS_MULTI_EXTRUDER - lv_obj_t *buttonExt2 = lv_img_create(scr, nullptr); - lv_img_set_src(buttonExt2, "F:/bmp_ext2_state.bin"); - lv_obj_set_pos(buttonExt2, 350, 136); + buttonExt2 = lv_imgbtn_create(scr, "F:/bmp_ext2_state.bin", 350, 136, event_handler, ID_TEMP_EXT); #endif #if HAS_HEATED_BED - lv_obj_t *buttonBedstate = lv_img_create(scr, nullptr); - lv_img_set_src(buttonBedstate, "F:/bmp_bed_state.bin"); - lv_obj_set_pos(buttonBedstate, 205, 186); + buttonBedstate = lv_imgbtn_create(scr, "F:/bmp_bed_state.bin", 206, 186, event_handler, ID_TEMP_BED); #endif - lv_obj_t *buttonFanstate = lv_img_create(scr, nullptr); - lv_img_set_src(buttonFanstate, "F:/bmp_fan_state.bin"); - lv_obj_set_pos(buttonFanstate, 350, 186); + buttonFanstate = lv_imgbtn_create(scr, "F:/bmp_fan_state.bin", 350, 186, event_handler, ID_FAN); lv_obj_t *buttonTime = lv_img_create(scr, nullptr); lv_img_set_src(buttonTime, "F:/bmp_time_state.bin"); - lv_obj_set_pos(buttonTime, 205, 86); + lv_obj_set_pos(buttonTime, 206, 86); - lv_obj_t *buttonZpos = lv_img_create(scr, nullptr); - lv_img_set_src(buttonZpos, "F:/bmp_zpos_state.bin"); - lv_obj_set_pos(buttonZpos, 350, 86); + buttonZpos = lv_imgbtn_create(scr, "F:/bmp_zpos_state.bin", 350, 86, event_handler, ID_BABYSTEP); buttonPause = lv_imgbtn_create(scr, uiCfg.print_state == WORKING ? "F:/bmp_pause.bin" : "F:/bmp_resume.bin", 5, 240, event_handler, ID_PAUSE); buttonStop = lv_imgbtn_create(scr, "F:/bmp_stop.bin", 165, 240, event_handler, ID_STOP); @@ -155,6 +166,9 @@ void lv_draw_printing() { lv_group_add_obj(g, buttonPause); lv_group_add_obj(g, buttonStop); lv_group_add_obj(g, buttonOperat); + lv_group_add_obj(g, buttonPause); + lv_group_add_obj(g, buttonPause); + lv_group_add_obj(g, buttonPause); } #endif @@ -205,18 +219,18 @@ void lv_draw_printing() { } void disp_ext_temp() { - sprintf(public_buf_l, printing_menu.temp1, (int)thermalManager.degHotend(0), (int)thermalManager.degTargetHotend(0)); + sprintf(public_buf_l, printing_menu.temp1, thermalManager.degHotend(0), thermalManager.degTargetHotend(0)); lv_label_set_text(labelExt1, public_buf_l); #if HAS_MULTI_EXTRUDER - sprintf(public_buf_l, printing_menu.temp1, (int)thermalManager.degHotend(1), (int)thermalManager.degTargetHotend(1)); + sprintf(public_buf_l, printing_menu.temp1, thermalManager.degHotend(1), thermalManager.degTargetHotend(1)); lv_label_set_text(labelExt2, public_buf_l); #endif } void disp_bed_temp() { #if HAS_HEATED_BED - sprintf(public_buf_l, printing_menu.bed_temp, (int)thermalManager.temp_bed.celsius, (int)thermalManager.temp_bed.target); + sprintf(public_buf_l, printing_menu.bed_temp, thermalManager.degBed(), thermalManager.degTargetBed()); lv_label_set_text(labelBed, public_buf_l); #endif } diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp index acdfa24f1b..5787cfb009 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.cpp @@ -63,7 +63,7 @@ static lv_obj_t *labelExt1, *labelExt1Target, *labelFan; uint8_t curent_disp_ui = 0; #endif -enum { ID_TOOL = 1, ID_SET, ID_PRINT }; +enum { ID_TOOL = 1, ID_SET, ID_PRINT, ID_INFO_EXT, ID_INFO_BED, ID_INFO_FAN }; static void event_handler(lv_obj_t *obj, lv_event_t event) { if (event != LV_EVENT_RELEASED) return; @@ -71,6 +71,9 @@ static void event_handler(lv_obj_t *obj, lv_event_t event) { switch (obj->mks_obj_id) { case ID_TOOL: lv_draw_tool(); break; case ID_SET: lv_draw_set(); break; + case ID_INFO_EXT: uiCfg.curTempType = 0; lv_draw_preHeat(); break; + case ID_INFO_BED: uiCfg.curTempType = 1; lv_draw_preHeat(); break; + case ID_INFO_FAN: lv_draw_fan(); break; case ID_PRINT: lv_draw_print_file(); break; } } @@ -181,32 +184,14 @@ void lv_draw_ready_print() { lv_big_button_create(scr, "F:/bmp_printing.bin", main_menu.print, 340, 180, event_handler, ID_PRINT); // Monitoring - lv_obj_t *buttonExt1 = lv_img_create(scr, NULL); + lv_obj_t *buttonExt1 = lv_big_button_create(scr, "F:/bmp_ext1_state.bin", " ", 55, ICON_POS_Y, event_handler, ID_INFO_EXT); #if HAS_MULTI_EXTRUDER - lv_obj_t *buttonExt2 = lv_img_create(scr, NULL); + lv_obj_t *buttonExt2 = lv_big_button_create(scr, "F:/bmp_ext2_state.bin", " ", 55, ICON_POS_Y + SECOND_EXT_MOD_Y, event_handler, ID_INFO_EXT); #endif #if HAS_HEATED_BED - lv_obj_t *buttonBedstate = lv_img_create(scr, NULL); + lv_obj_t *buttonBedstate = lv_big_button_create(scr, "F:/bmp_bed_state.bin", " ", 210, ICON_POS_Y, event_handler, ID_INFO_BED); #endif - lv_obj_t *buttonFanstate = lv_img_create(scr, NULL); - - lv_img_set_src(buttonExt1, "F:/bmp_ext1_state.bin"); - #if HAS_MULTI_EXTRUDER - lv_img_set_src(buttonExt2, "F:/bmp_ext2_state.bin"); - #endif - #if HAS_HEATED_BED - lv_img_set_src(buttonBedstate, "F:/bmp_bed_state.bin"); - #endif - lv_img_set_src(buttonFanstate, "F:/bmp_fan_state.bin"); - - lv_obj_set_pos(buttonExt1, 55, ICON_POS_Y); - #if HAS_MULTI_EXTRUDER - lv_obj_set_pos(buttonExt2, 55, ICON_POS_Y + SECOND_EXT_MOD_Y); - #endif - #if HAS_HEATED_BED - lv_obj_set_pos(buttonBedstate, 210, ICON_POS_Y); - #endif - lv_obj_set_pos(buttonFanstate, 380, ICON_POS_Y); + lv_obj_t *buttonFanstate = lv_big_button_create(scr, "F:/bmp_fan_state.bin", " ", 380, ICON_POS_Y, event_handler, ID_INFO_FAN); labelExt1 = lv_label_create(scr, 55, LABEL_MOD_Y, nullptr); labelExt1Target = lv_label_create(scr, 55, LABEL_MOD_Y, nullptr); @@ -262,6 +247,21 @@ void lv_draw_ready_print() { #endif } +void lv_temp_refr() { + #if HAS_HEATED_BED + sprintf(public_buf_l, printing_menu.bed_temp, thermalManager.degBed(), thermalManager.degTargetBed()); + lv_label_set_text(labelBed, public_buf_l); + #endif + + sprintf(public_buf_l, printing_menu.temp1, thermalManager.degHotend(0), thermalManager.degTargetHotend(0)); + lv_label_set_text(labelExt1, public_buf_l); + + #if HAS_MULTI_EXTRUDER + sprintf(public_buf_l, printing_menu.temp1, thermalManager.degHotend(1), thermalManager.degTargetHotend(1)); + lv_label_set_text(labelExt2, public_buf_l); + #endif +} + void lv_clear_ready_print() { #if HAS_ROTARY_ENCODER if (gCfgItems.encoder_enable) lv_group_remove_all_objs(g); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.h index a3cfd67665..56077e5dec 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.h @@ -32,6 +32,7 @@ extern void disp_Limit_error(); extern void disp_det_error(); extern void disp_det_ok(); extern void lv_clear_ready_print(); +extern void lv_temp_refr(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp index 0c574b1e15..8d560a19a4 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp @@ -805,6 +805,10 @@ void GUI_RefreshPage() { } break; case PRINT_READY_UI: + if (temps_update_flag) { + temps_update_flag = false; + lv_temp_refr(); + } break; case PRINT_FILE_UI: break; @@ -843,8 +847,8 @@ void GUI_RefreshPage() { #if ENABLED(MKS_WIFI_MODULE) case WIFI_UI: if (temps_update_flag) { - disp_wifi_state(); temps_update_flag = false; + disp_wifi_state(); } break; diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp index ddf7173297..44aa2300e2 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp @@ -897,9 +897,9 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { strcpy_P(outBuf, PSTR(" B:")); outBuf += 3; #if HAS_HEATED_BED - strcpy(outBuf, dtostrf(thermalManager.temp_bed.celsius, 1, 1, str_1)); + strcpy(outBuf, dtostrf(thermalManager.degBed(), 1, 1, str_1)); strcat_P(outBuf, PSTR(" /")); - strcat(outBuf, dtostrf(thermalManager.temp_bed.target, 1, 1, str_1)); + strcat(outBuf, dtostrf(thermalManager.degTargetBed(), 1, 1, str_1)); #else strcpy_P(outBuf, PSTR("0 /0")); #endif @@ -924,15 +924,15 @@ static void wifi_gcode_exec(uint8_t *cmd_line) { } else { sprintf_P((char *)tempBuf, PSTR("T:%d /%d B:%d /%d T0:%d /%d T1:%d /%d @:0 B@:0\r\n"), - (int)thermalManager.degHotend(0), (int)thermalManager.degTargetHotend(0), + thermalManager.degHotend(0), thermalManager.degTargetHotend(0), #if HAS_HEATED_BED - (int)thermalManager.temp_bed.celsius, (int)thermalManager.temp_bed.target, + thermalManager.degBed(), thermalManager.degTargetBed(), #else 0, 0, #endif - (int)thermalManager.degHotend(0), (int)thermalManager.degTargetHotend(0), + thermalManager.degHotend(0), thermalManager.degTargetHotend(0), #if HAS_MULTI_HOTEND - (int)thermalManager.degHotend(1), (int)thermalManager.degTargetHotend(1) + thermalManager.degHotend(1), thermalManager.degTargetHotend(1) #else 0, 0 #endif From 86ba0cde35537dd9a7c0978beb7dcc059b3e72f7 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 29 Mar 2021 03:32:34 -0500 Subject: [PATCH 220/253] reduced verbiage --- Marlin/Makefile | 2 +- Marlin/src/core/boards.h | 20 ++++++++++---------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Marlin/Makefile b/Marlin/Makefile index 19c2d0b329..a3ca81abdd 100644 --- a/Marlin/Makefile +++ b/Marlin/Makefile @@ -219,7 +219,7 @@ else ifeq ($(HARDWARE_MOTHERBOARD),1111) else ifeq ($(HARDWARE_MOTHERBOARD),1112) # MKS GEN L else ifeq ($(HARDWARE_MOTHERBOARD),1113) -# zrib V2.0 control board (Chinese knock off RAMPS replica) +# zrib V2.0 control board (Chinese RAMPS replica) else ifeq ($(HARDWARE_MOTHERBOARD),1114) # BigTreeTech or BIQU KFB2.0 else ifeq ($(HARDWARE_MOTHERBOARD),1115) diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index f0d967c763..46c198a0ed 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -68,8 +68,8 @@ #define BOARD_MKS_GEN_13 1112 // MKS GEN v1.3 or 1.4 #define BOARD_MKS_GEN_L 1113 // MKS GEN L #define BOARD_KFB_2 1114 // BigTreeTech or BIQU KFB2.0 -#define BOARD_ZRIB_V20 1115 // zrib V2.0 control board (Chinese knock off RAMPS replica) -#define BOARD_ZRIB_V52 1116 // zrib V5.2 control board (Chinese knock off RAMPS replica) +#define BOARD_ZRIB_V20 1115 // zrib V2.0 (Chinese RAMPS replica) +#define BOARD_ZRIB_V52 1116 // zrib V5.2 (Chinese RAMPS replica) #define BOARD_FELIX2 1117 // Felix 2.0+ Electronics Board (RAMPS like) #define BOARD_RIGIDBOARD 1118 // Invent-A-Part RigidBoard #define BOARD_RIGIDBOARD_V2 1119 // Invent-A-Part RigidBoard V2 @@ -87,7 +87,7 @@ #define BOARD_FORMBOT_RAPTOR 1131 // Formbot Raptor #define BOARD_FORMBOT_RAPTOR2 1132 // Formbot Raptor 2 #define BOARD_BQ_ZUM_MEGA_3D 1133 // bq ZUM Mega 3D -#define BOARD_MAKEBOARD_MINI 1134 // MakeBoard Mini v2.1.2 is a control board sold by MicroMake +#define BOARD_MAKEBOARD_MINI 1134 // MakeBoard Mini v2.1.2 by MicroMake #define BOARD_TRIGORILLA_13 1135 // TriGorilla Anycubic version 1.3-based on RAMPS EFB #define BOARD_TRIGORILLA_14 1136 // ... Ver 1.4 #define BOARD_TRIGORILLA_14_11 1137 // ... Rev 1.1 (new servo pin order) @@ -174,8 +174,8 @@ #define BOARD_MELZI 1502 // Melzi #define BOARD_MELZI_V2 1503 // Melzi V2 #define BOARD_MELZI_MAKR3D 1504 // Melzi with ATmega1284 (MaKr3d version) -#define BOARD_MELZI_CREALITY 1505 // Melzi Creality3D board (for CR-10 etc) -#define BOARD_MELZI_MALYAN 1506 // Melzi Malyan M150 board +#define BOARD_MELZI_CREALITY 1505 // Melzi Creality3D (for CR-10 etc) +#define BOARD_MELZI_MALYAN 1506 // Melzi Malyan M150 #define BOARD_MELZI_TRONXY 1507 // Tronxy X5S #define BOARD_STB_11 1508 // STB V1.1 #define BOARD_AZTEEG_X1 1509 // Azteeg X1 @@ -194,8 +194,8 @@ #define BOARD_GEN7_12 1605 // Gen7 v1.1, v1.2 #define BOARD_GEN7_13 1606 // Gen7 v1.3 #define BOARD_GEN7_14 1607 // Gen7 v1.4 -#define BOARD_OMCA_A 1608 // Alpha OMCA board -#define BOARD_OMCA 1609 // Final OMCA board +#define BOARD_OMCA_A 1608 // Alpha OMCA +#define BOARD_OMCA 1609 // Final OMCA #define BOARD_SETHI 1610 // Sethi 3D_1 // @@ -226,7 +226,7 @@ #define BOARD_SELENA_COMPACT 2008 // Selena Compact (Power outputs: Hotend0, Hotend1, Bed0, Bed1, Fan0, Fan1) #define BOARD_BIQU_B300_V1_0 2009 // BIQU B300_V1.0 (Power outputs: Hotend0, Fan, Bed, SPI Driver) #define BOARD_MKS_SGEN_L 2010 // MKS-SGen-L (Power outputs: Hotend0, Hotend1, Bed, Fan) -#define BOARD_GMARSH_X6_REV1 2011 // GMARSH X6 board, revision 1 prototype +#define BOARD_GMARSH_X6_REV1 2011 // GMARSH X6, revision 1 prototype #define BOARD_BTT_SKR_V1_1 2012 // BigTreeTech SKR v1.1 (Power outputs: Hotend0, Hotend1, Fan, Bed) #define BOARD_BTT_SKR_V1_3 2013 // BigTreeTech SKR v1.3 (Power outputs: Hotend0, Hotend1, Fan, Bed) #define BOARD_BTT_SKR_V1_4 2014 // BigTreeTech SKR v1.4 (Power outputs: Hotend0, Hotend1, Fan, Bed) @@ -392,8 +392,8 @@ // #define BOARD_ESPRESSIF_ESP32 6000 // Generic ESP32 -#define BOARD_MRR_ESPA 6001 // MRR ESPA board based on ESP32 (native pins only) -#define BOARD_MRR_ESPE 6002 // MRR ESPE board based on ESP32 (with I2S stepper stream) +#define BOARD_MRR_ESPA 6001 // MRR ESPA based on ESP32 (native pins only) +#define BOARD_MRR_ESPE 6002 // MRR ESPE based on ESP32 (with I2S stepper stream) #define BOARD_E4D_BOX 6003 // E4d@BOX #define BOARD_FYSETC_E4 6004 // FYSETC E4 From 1d3f28da2e9e7ecbecc4a25fffb120645a5b6ae1 Mon Sep 17 00:00:00 2001 From: George Fu Date: Mon, 29 Mar 2021 17:38:28 +0800 Subject: [PATCH 221/253] FYSETC Spider board (#21458) --- Marlin/src/core/boards.h | 19 ++-- Marlin/src/pins/pins.h | 2 + Marlin/src/pins/stm32f4/pins_FYSETC_S6.h | 18 ++- Marlin/src/pins/stm32f4/pins_FYSETC_SPIDER.h | 110 +++++++++++++++++++ 4 files changed, 135 insertions(+), 14 deletions(-) create mode 100644 Marlin/src/pins/stm32f4/pins_FYSETC_SPIDER.h diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index 46c198a0ed..a7ee18d6eb 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -368,15 +368,16 @@ #define BOARD_LERDGE_S 4212 // Lerdge S (STM32F407VE) #define BOARD_LERDGE_X 4213 // Lerdge X (STM32F407VE) #define BOARD_VAKE403D 4214 // VAkE 403D (STM32F446VET6) -#define BOARD_FYSETC_S6 4215 // FYSETC S6 board -#define BOARD_FYSETC_S6_V2_0 4216 // FYSETC S6 v2.0 board -#define BOARD_FLYF407ZG 4217 // FLYF407ZG board (STM32F407ZG) -#define BOARD_MKS_ROBIN2 4218 // MKS_ROBIN2 (STM32F407ZE) -#define BOARD_MKS_ROBIN_PRO_V2 4219 // MKS Robin Pro V2 (STM32F407VE) -#define BOARD_MKS_ROBIN_NANO_V3 4220 // MKS Robin Nano V3 (STM32F407VG) -#define BOARD_ANET_ET4 4221 // ANET ET4 V1.x (STM32F407VGT6) -#define BOARD_ANET_ET4P 4222 // ANET ET4P V1.x (STM32F407VGT6) -#define BOARD_FYSETC_CHEETAH_V20 4223 // FYSETC Cheetah V2.0 +#define BOARD_FYSETC_S6 4215 // FYSETC S6 (STM32F446VET6) +#define BOARD_FYSETC_S6_V2_0 4216 // FYSETC S6 v2.0 (STM32F446VET6) +#define BOARD_FYSETC_SPIDER 4217 // FYSETC Spider (STM32F446VET6) +#define BOARD_FLYF407ZG 4218 // FLYF407ZG (STM32F407ZG) +#define BOARD_MKS_ROBIN2 4219 // MKS_ROBIN2 (STM32F407ZE) +#define BOARD_MKS_ROBIN_PRO_V2 4220 // MKS Robin Pro V2 (STM32F407VE) +#define BOARD_MKS_ROBIN_NANO_V3 4221 // MKS Robin Nano V3 (STM32F407VG) +#define BOARD_ANET_ET4 4222 // ANET ET4 V1.x (STM32F407VGT6) +#define BOARD_ANET_ET4P 4223 // ANET ET4P V1.x (STM32F407VGT6) +#define BOARD_FYSETC_CHEETAH_V20 4224 // FYSETC Cheetah V2.0 // // ARM Cortex M7 diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 58a87f2313..8eecce2c17 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -600,6 +600,8 @@ #include "stm32f4/pins_FYSETC_S6.h" // STM32F4 env:FYSETC_S6 #elif MB(FYSETC_S6_V2_0) #include "stm32f4/pins_FYSETC_S6_V2_0.h" // STM32F4 env:FYSETC_S6 +#elif MB(FYSETC_SPIDER) + #include "stm32f4/pins_FYSETC_SPIDER.h" // STM32F4 env:FYSETC_S6 #elif MB(FLYF407ZG) #include "stm32f4/pins_FLYF407ZG.h" // STM32F4 env:FLYF407ZG #elif MB(MKS_ROBIN2) diff --git a/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h b/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h index d617087e9d..e6420dc238 100644 --- a/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h +++ b/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h @@ -24,7 +24,7 @@ #include "env_validate.h" #if HOTENDS > 3 || E_STEPPERS > 3 - #error "RUMBA32 supports up to 3 hotends / E-steppers." + #error "FYSETC S6 supports up to 3 hotends / E-steppers." #endif #ifndef BOARD_INFO_NAME @@ -168,10 +168,18 @@ // // Heaters / Fans // -#define HEATER_0_PIN PB3 -#define HEATER_1_PIN PB4 -#define HEATER_2_PIN PB15 -#define HEATER_BED_PIN PC8 +#ifndef HEATER_0_PIN + #define HEATER_0_PIN PB3 +#endif +#ifndef HEATER_0_PIN + #define HEATER_1_PIN PB4 +#endif +#ifndef HEATER_0_PIN + #define HEATER_2_PIN PB15 +#endif +#ifndef HEATER_0_PIN + #define HEATER_BED_PIN PC8 +#endif #define FAN_PIN PB0 #define FAN1_PIN PB1 diff --git a/Marlin/src/pins/stm32f4/pins_FYSETC_SPIDER.h b/Marlin/src/pins/stm32f4/pins_FYSETC_SPIDER.h new file mode 100644 index 0000000000..a33f35bd55 --- /dev/null +++ b/Marlin/src/pins/stm32f4/pins_FYSETC_SPIDER.h @@ -0,0 +1,110 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 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 + +#ifndef BOARD_INFO_NAME + #define BOARD_INFO_NAME "FYSETC SPIDER" +#endif +#ifndef DEFAULT_MACHINE_NAME + #define DEFAULT_MACHINE_NAME BOARD_INFO_NAME +#endif + +// +// EEPROM Emulation +// +#if NO_EEPROM_SELECTED + #undef NO_EEPROM_SELECTED + //#define FLASH_EEPROM_EMULATION + //#define SRAM_EEPROM_EMULATION + #define I2C_EEPROM +#endif + +#if ENABLED(I2C_EEPROM) + #define MARLIN_EEPROM_SIZE 0x1000 // 4KB +#endif + +// +// Steppers +// +#define X2_STEP_PIN PD12 +#define X2_DIR_PIN PC4 +#define X2_ENABLE_PIN PE8 +#define X2_CS_PIN PA15 + +#define Z2_STEP_PIN PE1 +#define Z2_DIR_PIN PE0 +#define Z2_ENABLE_PIN PC5 +#define Z2_CS_PIN PD11 + +// +// Heaters / Fans +// +#define HEATER_0_PIN PB15 +#define HEATER_1_PIN PC8 +#define HEATER_2_PIN PB3 +#define HEATER_BED_PIN PB4 + +// +// Steppers +// +#define X_ENABLE_PIN PE9 + +#if HAS_TMC_UART + #define X_SERIAL_TX_PIN PE7 + #define X_SERIAL_RX_PIN PE7 + #define Y_SERIAL_TX_PIN PE15 + #define Y_SERIAL_RX_PIN PE15 + #define Z_SERIAL_TX_PIN PD10 + #define Z_SERIAL_RX_PIN PD10 + #define E0_SERIAL_TX_PIN PD7 + #define E0_SERIAL_RX_PIN PD7 + #define E1_SERIAL_TX_PIN PC14 + #define E1_SERIAL_RX_PIN PC14 + #define E2_SERIAL_TX_PIN PC15 + #define E2_SERIAL_RX_PIN PC15 + #define X2_SERIAL_TX_PIN PA15 + #define X2_SERIAL_RX_PIN PA15 + #define Z2_SERIAL_TX_PIN PD11 + #define Z2_SERIAL_RX_PIN PD11 +#endif + +// +// Software SPI pins for TMC2130 stepper drivers +// +#define TMC_USE_SW_SPI +#if ENABLED(TMC_USE_SW_SPI) + #ifndef TMC_SW_MOSI + #define TMC_SW_MOSI PE14 + #endif + #ifndef TMC_SW_MISO + #define TMC_SW_MISO PE13 + #endif + #ifndef TMC_SW_SCK + #define TMC_SW_SCK PE12 + #endif +#endif + +#if HOTENDS > 3 || E_STEPPERS > 3 + #error "FYSETC SPIDER supports up to 3 hotends / E-steppers." +#else + #include "pins_FYSETC_S6.h" +#endif From 1caf8a1f5b1aaaca01e10af2a918a264ed549a1b Mon Sep 17 00:00:00 2001 From: ellensp Date: Mon, 29 Mar 2021 22:43:07 +1300 Subject: [PATCH 222/253] GT2560 Rev.A Plus Z Max Pin with BLTouch (#21375) --- Marlin/src/pins/mega/pins_GT2560_REV_A.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Marlin/src/pins/mega/pins_GT2560_REV_A.h b/Marlin/src/pins/mega/pins_GT2560_REV_A.h index 2fb43a299f..1adf8d3079 100644 --- a/Marlin/src/pins/mega/pins_GT2560_REV_A.h +++ b/Marlin/src/pins/mega/pins_GT2560_REV_A.h @@ -47,10 +47,11 @@ #if ENABLED(BLTOUCH) #if MB(GT2560_REV_A_PLUS) #define SERVO0_PIN 11 + #define Z_MAX_PIN 32 #else #define SERVO0_PIN 32 + #define Z_MAX_PIN -1 #endif - #define Z_MAX_PIN -1 #else #define Z_MAX_PIN 32 #endif From 71e789943ea28ff7fddb1eb07295e75460703cb7 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Tue, 30 Mar 2021 00:32:47 +0000 Subject: [PATCH 223/253] [cron] Bump distribution date (2021-03-30) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 86f557bd52..2e71c2231b 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2021-03-29" + #define STRING_DISTRIBUTION_DATE "2021-03-30" #endif /** From 3b73b115ca9366f0155986b717d4c85c31ed2f80 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 29 Mar 2021 20:36:37 -0500 Subject: [PATCH 224/253] Apply pointer formatting --- Marlin/src/HAL/AVR/HAL_SPI.cpp | 8 +- Marlin/src/HAL/DUE/HAL_SPI.cpp | 30 ++++---- Marlin/src/HAL/DUE/eeprom_flash.cpp | 14 ++-- Marlin/src/HAL/DUE/usb/udi_cdc.h | 4 +- Marlin/src/HAL/DUE/usb/usb_task.c | 2 +- Marlin/src/HAL/ESP32/HAL_SPI.cpp | 4 +- Marlin/src/HAL/ESP32/WebSocketSerial.cpp | 2 +- Marlin/src/HAL/ESP32/WebSocketSerial.h | 4 +- Marlin/src/HAL/LPC1768/HAL_SPI.cpp | 10 +-- .../u8g/u8g_com_HAL_LPC1768_st7920_hw_spi.cpp | 2 +- Marlin/src/HAL/SAMD51/HAL_SPI.cpp | 4 +- Marlin/src/HAL/STM32/HAL_SPI.cpp | 4 +- Marlin/src/HAL/STM32/MarlinSerial.h | 2 +- Marlin/src/HAL/STM32F1/HAL_SPI.cpp | 6 +- Marlin/src/HAL/STM32F1/eeprom_flash.cpp | 4 +- Marlin/src/HAL/TEENSY31_32/HAL_SPI.cpp | 4 +- Marlin/src/HAL/TEENSY35_36/HAL_SPI.cpp | 4 +- Marlin/src/HAL/TEENSY40_41/HAL_SPI.cpp | 4 +- Marlin/src/HAL/shared/HAL_MinSerial.h | 2 +- Marlin/src/HAL/shared/HAL_SPI.h | 6 +- Marlin/src/HAL/shared/backtrace/backtrace.cpp | 2 +- Marlin/src/HAL/shared/eeprom_api.h | 6 +- Marlin/src/HAL/shared/eeprom_if_spi.cpp | 2 +- Marlin/src/core/macros.h | 4 +- Marlin/src/core/serial_base.h | 6 +- Marlin/src/feature/binary_stream.h | 10 +-- Marlin/src/feature/meatpack.cpp | 2 +- Marlin/src/feature/meatpack.h | 2 +- Marlin/src/feature/mmu/mmu2.cpp | 14 ++-- Marlin/src/feature/mmu/mmu2.h | 10 +-- Marlin/src/feature/runout.h | 10 +-- Marlin/src/gcode/queue.cpp | 6 +- Marlin/src/gcode/queue.h | 6 +- Marlin/src/lcd/HD44780/marlinui_HD44780.cpp | 4 +- Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp | 4 +- Marlin/src/lcd/dogm/marlinui_DOGM.cpp | 4 +- .../dogm/u8g_dev_tft_upscale_from_128x64.cpp | 6 +- .../dogm/ultralcd_st7920_u8glib_rrd_AVR.cpp | 4 +- .../lcd/extui/lib/dgus/DGUSScreenHandler.cpp | 4 +- .../extui/lib/dgus/fysetc/DGUSScreenHandler.h | 6 +- .../lib/dgus/hiprecy/DGUSScreenHandler.h | 6 +- .../extui/lib/dgus/mks/DGUSScreenHandler.cpp | 4 +- .../extui/lib/dgus/mks/DGUSScreenHandler.h | 10 +-- .../extui/lib/dgus/origin/DGUSScreenHandler.h | 6 +- .../archim2-flash/media_file_reader.cpp | 2 +- .../archim2-flash/media_file_reader.h | 2 +- .../ftdi_eve_lib/basic/spi.cpp | 4 +- .../ftdi_eve_lib/basic/spi.h | 4 +- .../ftdi_eve_lib/extended/sound_list.h | 2 +- .../ftdi_eve_lib/extended/sound_player.cpp | 2 +- .../ftdi_eve_lib/extended/sound_player.h | 2 +- .../ftdi_eve_lib/extended/text_ellipsis.cpp | 2 +- .../lib/ftdi_eve_touch_ui/marlin_events.cpp | 2 +- .../screens/bio_printing_dialog_box.cpp | 4 +- .../confirm_user_request_alert_box.cpp | 2 +- .../screens/files_screen.cpp | 2 +- .../ftdi_eve_touch_ui/screens/files_screen.h | 2 +- .../screens/status_screen.cpp | 4 +- .../lcd/extui/lib/mks_ui/SPIFlashStorage.cpp | 12 +-- .../lcd/extui/lib/mks_ui/SPIFlashStorage.h | 12 +-- Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp | 20 ++--- Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h | 2 +- .../src/lcd/extui/lib/mks_ui/pic_manager.cpp | 4 +- .../src/lcd/extui/lib/mks_ui/wifi_module.cpp | 4 +- .../src/lcd/extui/lib/nextion/nextion_tft.cpp | 4 +- Marlin/src/lcd/extui/malyan_lcd.cpp | 14 ++-- Marlin/src/lcd/lcdprint.h | 2 +- Marlin/src/lcd/marlinui.h | 4 +- Marlin/src/lcd/menu/menu.h | 6 +- Marlin/src/lcd/tft/ui_320x240.cpp | 2 +- Marlin/src/lcd/tft/ui_480x320.cpp | 4 +- Marlin/src/lcd/tft/ui_common.cpp | 2 +- Marlin/src/libs/W25Qxx.cpp | 10 +-- Marlin/src/libs/W25Qxx.h | 10 +-- Marlin/src/libs/softspi.h | 4 +- Marlin/src/module/planner.cpp | 10 +-- Marlin/src/module/planner.h | 6 +- Marlin/src/module/stepper.cpp | 4 +- Marlin/src/module/stepper.h | 4 +- Marlin/src/module/stepper/trinamic.cpp | 6 +- Marlin/src/sd/Sd2Card.cpp | 22 +++--- Marlin/src/sd/Sd2Card.h | 16 ++-- Marlin/src/sd/SdBaseFile.cpp | 74 +++++++++---------- Marlin/src/sd/SdBaseFile.h | 38 +++++----- Marlin/src/sd/SdFatStructs.h | 8 +- Marlin/src/sd/SdFile.cpp | 4 +- Marlin/src/sd/SdFile.h | 4 +- Marlin/src/sd/SdVolume.cpp | 10 +-- Marlin/src/sd/SdVolume.h | 12 +-- Marlin/src/sd/cardreader.h | 2 +- .../sd/usb_flashdrive/Sd2Card_FlashDrive.cpp | 4 +- .../sd/usb_flashdrive/Sd2Card_FlashDrive.h | 8 +- Marlin/src/sd/usb_flashdrive/lib-uhs2/Usb.cpp | 14 ++-- .../src/sd/usb_flashdrive/lib-uhs2/UsbCore.h | 20 ++--- .../sd/usb_flashdrive/lib-uhs2/usbhost.cpp | 4 +- .../src/sd/usb_flashdrive/lib-uhs2/usbhost.h | 4 +- .../lib-uhs3/UHS_host/UHS_host_INLINE.h | 12 +-- .../lib-uhs3/UHS_host/UHS_usbhost.h | 14 ++-- .../USB_HOST_SHIELD/USB_HOST_SHIELD.h | 6 +- .../USB_HOST_SHIELD/USB_HOST_SHIELD_INLINE.h | 6 +- .../variants/MARLIN_F4x7Vx/hal_conf_extra.h | 2 +- buildroot/share/fonts/genpages.c | 4 +- 102 files changed, 364 insertions(+), 364 deletions(-) diff --git a/Marlin/src/HAL/AVR/HAL_SPI.cpp b/Marlin/src/HAL/AVR/HAL_SPI.cpp index 3e5572e559..1a1b98b3dd 100644 --- a/Marlin/src/HAL/AVR/HAL_SPI.cpp +++ b/Marlin/src/HAL/AVR/HAL_SPI.cpp @@ -88,7 +88,7 @@ void spiBegin() { } /** SPI read data */ - void spiRead(uint8_t* buf, uint16_t nbyte) { + void spiRead(uint8_t *buf, uint16_t nbyte) { if (nbyte-- == 0) return; SPDR = 0xFF; for (uint16_t i = 0; i < nbyte; i++) { @@ -107,7 +107,7 @@ void spiBegin() { } /** SPI send block */ - void spiSendBlock(uint8_t token, const uint8_t* buf) { + void spiSendBlock(uint8_t token, const uint8_t *buf) { SPDR = token; for (uint16_t i = 0; i < 512; i += 2) { while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } @@ -215,7 +215,7 @@ void spiBegin() { } // Soft SPI read data - void spiRead(uint8_t* buf, uint16_t nbyte) { + void spiRead(uint8_t *buf, uint16_t nbyte) { for (uint16_t i = 0; i < nbyte; i++) buf[i] = spiRec(); } @@ -242,7 +242,7 @@ void spiBegin() { } // Soft SPI send block - void spiSendBlock(uint8_t token, const uint8_t* buf) { + void spiSendBlock(uint8_t token, const uint8_t *buf) { spiSend(token); for (uint16_t i = 0; i < 512; i++) spiSend(buf[i]); diff --git a/Marlin/src/HAL/DUE/HAL_SPI.cpp b/Marlin/src/HAL/DUE/HAL_SPI.cpp index 6cb2912c12..f42e8a9802 100644 --- a/Marlin/src/HAL/DUE/HAL_SPI.cpp +++ b/Marlin/src/HAL/DUE/HAL_SPI.cpp @@ -56,8 +56,8 @@ #pragma GCC optimize (3) typedef uint8_t (*pfnSpiTransfer)(uint8_t b); - typedef void (*pfnSpiRxBlock)(uint8_t* buf, uint32_t nbyte); - typedef void (*pfnSpiTxBlock)(const uint8_t* buf, uint32_t nbyte); + typedef void (*pfnSpiRxBlock)(uint8_t *buf, uint32_t nbyte); + typedef void (*pfnSpiTxBlock)(const uint8_t *buf, uint32_t nbyte); /* ---------------- Macros to be able to access definitions from asm */ #define _PORT(IO) DIO ## IO ## _WPORT @@ -270,7 +270,7 @@ static pfnSpiTransfer spiTransferTx = (pfnSpiTransfer)spiTransferX; // Block transfers run at ~8 .. ~10Mhz - Tx version (Rx data discarded) - static void spiTxBlock0(const uint8_t* ptr, uint32_t todo) { + static void spiTxBlock0(const uint8_t *ptr, uint32_t todo) { uint32_t MOSI_PORT_PLUS30 = ((uint32_t) PORT(SD_MOSI_PIN)) + 0x30; /* SODR of port */ uint32_t MOSI_MASK = PIN_MASK(SD_MOSI_PIN); uint32_t SCK_PORT_PLUS30 = ((uint32_t) PORT(SD_SCK_PIN)) + 0x30; /* SODR of port */ @@ -349,7 +349,7 @@ ); } - static void spiRxBlock0(uint8_t* ptr, uint32_t todo) { + static void spiRxBlock0(uint8_t *ptr, uint32_t todo) { uint32_t bin = 0; uint32_t work = 0; uint32_t BITBAND_MISO_PORT = BITBAND_ADDRESS( ((uint32_t)PORT(SD_MISO_PIN))+0x3C, PIN_SHIFT(SD_MISO_PIN)); /* PDSR of port in bitband area */ @@ -425,13 +425,13 @@ ); } - static void spiTxBlockX(const uint8_t* buf, uint32_t todo) { + static void spiTxBlockX(const uint8_t *buf, uint32_t todo) { do { (void)spiTransferTx(*buf++); } while (--todo); } - static void spiRxBlockX(uint8_t* buf, uint32_t todo) { + static void spiRxBlockX(uint8_t *buf, uint32_t todo) { do { *buf++ = spiTransferRx(0xFF); } while (--todo); @@ -463,7 +463,7 @@ return b; } - void spiRead(uint8_t* buf, uint16_t nbyte) { + void spiRead(uint8_t *buf, uint16_t nbyte) { if (nbyte) { _SS_WRITE(LOW); WRITE(SD_MOSI_PIN, HIGH); // Output 1s 1 @@ -478,7 +478,7 @@ _SS_WRITE(HIGH); } - void spiSendBlock(uint8_t token, const uint8_t* buf) { + void spiSendBlock(uint8_t token, const uint8_t *buf) { _SS_WRITE(LOW); (void)spiTransferTx(token); spiTxBlock(buf, 512); @@ -645,7 +645,7 @@ } // Read from SPI into buffer - void spiRead(uint8_t* buf, uint16_t nbyte) { + void spiRead(uint8_t *buf, uint16_t nbyte) { if (!nbyte) return; --nbyte; for (int i = 0; i < nbyte; i++) { @@ -668,7 +668,7 @@ //DELAY_US(1U); } - void spiSend(const uint8_t* buf, size_t nbyte) { + void spiSend(const uint8_t *buf, size_t nbyte) { if (!nbyte) return; --nbyte; for (size_t i = 0; i < nbyte; i++) { @@ -689,7 +689,7 @@ FLUSH_RX(); } - void spiSend(uint32_t chan, const uint8_t* buf, size_t nbyte) { + void spiSend(uint32_t chan, const uint8_t *buf, size_t nbyte) { if (!nbyte) return; --nbyte; for (size_t i = 0; i < nbyte; i++) { @@ -702,7 +702,7 @@ } // Write from buffer to SPI - void spiSendBlock(uint8_t token, const uint8_t* buf) { + void spiSendBlock(uint8_t token, const uint8_t *buf) { SPI0->SPI_TDR = (uint32_t)token | SPI_PCS(SPI_CHAN); WHILE_TX(0); //WHILE_RX(0); @@ -801,19 +801,19 @@ uint8_t spiRec() { return (uint8_t)spiTransfer(0xFF); } - void spiRead(uint8_t* buf, uint16_t nbyte) { + void spiRead(uint8_t *buf, uint16_t nbyte) { for (int i = 0; i < nbyte; i++) buf[i] = spiTransfer(0xFF); } void spiSend(uint8_t data) { spiTransfer(data); } - void spiSend(const uint8_t* buf, size_t nbyte) { + void spiSend(const uint8_t *buf, size_t nbyte) { for (uint16_t i = 0; i < nbyte; i++) spiTransfer(buf[i]); } - void spiSendBlock(uint8_t token, const uint8_t* buf) { + void spiSendBlock(uint8_t token, const uint8_t *buf) { spiTransfer(token); for (uint16_t i = 0; i < 512; i++) spiTransfer(buf[i]); diff --git a/Marlin/src/HAL/DUE/eeprom_flash.cpp b/Marlin/src/HAL/DUE/eeprom_flash.cpp index 738f44acc9..14c843576c 100644 --- a/Marlin/src/HAL/DUE/eeprom_flash.cpp +++ b/Marlin/src/HAL/DUE/eeprom_flash.cpp @@ -139,7 +139,7 @@ static void ee_Dump(const int page, const void* data) { #ifdef EE_EMU_DEBUG - const uint8_t* c = (const uint8_t*) data; + const uint8_t *c = (const uint8_t*) data; char buffer[80]; sprintf_P(buffer, PSTR("Page: %d (0x%04x)\n"), page, page); @@ -293,8 +293,8 @@ static bool ee_PageWrite(uint16_t page, const void* data) { ee_Dump(-page, data); // Calculate count of changed bits - uint32_t* p1 = (uint32_t*)addrflash; - uint32_t* p2 = (uint32_t*)data; + uint32_t *p1 = (uint32_t*)addrflash; + uint32_t *p2 = (uint32_t*)data; int count = 0; for (i =0; i> 2; i++) { if (p1[i] != p2[i]) { @@ -470,7 +470,7 @@ static uint8_t ee_Read(uint32_t address, bool excludeRAMBuffer=false) { for (int page = curPage - 1; page >= 0; --page) { // Get a pointer to the flash page - uint8_t* pflash = (uint8_t*)getFlashStorage(page + curGroup * PagesPerGroup); + uint8_t *pflash = (uint8_t*)getFlashStorage(page + curGroup * PagesPerGroup); uint16_t i = 0; while (i <= (PageSize - 4)) { /* (PageSize - 4) because otherwise, there is not enough room for data and headers */ @@ -550,7 +550,7 @@ static uint32_t ee_GetAddrRange(uint32_t address, bool excludeRAMBuffer=false) { for (int page = curPage - 1; page >= 0; --page) { // Get a pointer to the flash page - uint8_t* pflash = (uint8_t*)getFlashStorage(page + curGroup * PagesPerGroup); + uint8_t *pflash = (uint8_t*)getFlashStorage(page + curGroup * PagesPerGroup); uint16_t i = 0; while (i <= (PageSize - 4)) { /* (PageSize - 4) because otherwise, there is not enough room for data and headers */ @@ -589,7 +589,7 @@ static uint32_t ee_GetAddrRange(uint32_t address, bool excludeRAMBuffer=false) { } static bool ee_IsPageClean(int page) { - uint32_t* pflash = (uint32_t*) getFlashStorage(page); + uint32_t *pflash = (uint32_t*) getFlashStorage(page); for (uint16_t i = 0; i < (PageSize >> 2); ++i) if (*pflash++ != 0xFFFFFFFF) return false; return true; @@ -599,7 +599,7 @@ static bool ee_Flush(uint32_t overrideAddress = 0xFFFFFFFF, uint8_t overrideData // Check if RAM buffer has something to be written bool isEmpty = true; - uint32_t* p = (uint32_t*) &buffer[0]; + uint32_t *p = (uint32_t*) &buffer[0]; for (uint16_t j = 0; j < (PageSize >> 2); j++) { if (*p++ != 0xFFFFFFFF) { isEmpty = false; diff --git a/Marlin/src/HAL/DUE/usb/udi_cdc.h b/Marlin/src/HAL/DUE/usb/udi_cdc.h index 0ecf7bb00e..b61845011a 100644 --- a/Marlin/src/HAL/DUE/usb/udi_cdc.h +++ b/Marlin/src/HAL/DUE/usb/udi_cdc.h @@ -675,11 +675,11 @@ iram_size_t udi_cdc_multi_write_buf(uint8_t port, const void* buf, iram_size_t s * - \code // Waits and gets a value on CDC line int udi_cdc_getc(void); // Reads a RAM buffer on CDC line - iram_size_t udi_cdc_read_buf(int* buf, iram_size_t size); + iram_size_t udi_cdc_read_buf(int *buf, iram_size_t size); // Puts a byte on CDC line int udi_cdc_putc(int value); // Writes a RAM buffer on CDC line - iram_size_t udi_cdc_write_buf(const int* buf, iram_size_t size); \endcode + iram_size_t udi_cdc_write_buf(const int *buf, iram_size_t size); \endcode * * \section udi_cdc_use_cases Advanced use cases * For more advanced use of the UDI CDC module, see the following use cases: diff --git a/Marlin/src/HAL/DUE/usb/usb_task.c b/Marlin/src/HAL/DUE/usb/usb_task.c index 66bdb265d8..acb1d5b933 100644 --- a/Marlin/src/HAL/DUE/usb/usb_task.c +++ b/Marlin/src/HAL/DUE/usb/usb_task.c @@ -264,7 +264,7 @@ bool usb_task_extra_string(void) { ** Handle device requests that the ASF stack doesn't */ bool usb_task_other_requests(void) { - uint8_t* ptr = 0; + uint8_t *ptr = 0; uint16_t size = 0; if (Udd_setup_type() == USB_REQ_TYPE_VENDOR) { diff --git a/Marlin/src/HAL/ESP32/HAL_SPI.cpp b/Marlin/src/HAL/ESP32/HAL_SPI.cpp index 8ee837ba15..8743ac5be2 100644 --- a/Marlin/src/HAL/ESP32/HAL_SPI.cpp +++ b/Marlin/src/HAL/ESP32/HAL_SPI.cpp @@ -85,7 +85,7 @@ uint8_t spiRec() { return returnByte; } -void spiRead(uint8_t* buf, uint16_t nbyte) { +void spiRead(uint8_t *buf, uint16_t nbyte) { SPI.beginTransaction(spiConfig); SPI.transferBytes(0, buf, nbyte); SPI.endTransaction(); @@ -97,7 +97,7 @@ void spiSend(uint8_t b) { SPI.endTransaction(); } -void spiSendBlock(uint8_t token, const uint8_t* buf) { +void spiSendBlock(uint8_t token, const uint8_t *buf) { SPI.beginTransaction(spiConfig); SPI.transfer(token); SPI.writeBytes(const_cast(buf), 512); diff --git a/Marlin/src/HAL/ESP32/WebSocketSerial.cpp b/Marlin/src/HAL/ESP32/WebSocketSerial.cpp index 8825742d38..96769f261f 100644 --- a/Marlin/src/HAL/ESP32/WebSocketSerial.cpp +++ b/Marlin/src/HAL/ESP32/WebSocketSerial.cpp @@ -137,7 +137,7 @@ size_t WebSocketSerial::write(const uint8_t c) { return ret; } -size_t WebSocketSerial::write(const uint8_t* buffer, size_t size) { +size_t WebSocketSerial::write(const uint8_t *buffer, size_t size) { size_t written = 0; for (size_t i = 0; i < size; i++) written += write(buffer[i]); diff --git a/Marlin/src/HAL/ESP32/WebSocketSerial.h b/Marlin/src/HAL/ESP32/WebSocketSerial.h index 924d36f15c..574f7b10f0 100644 --- a/Marlin/src/HAL/ESP32/WebSocketSerial.h +++ b/Marlin/src/HAL/ESP32/WebSocketSerial.h @@ -54,7 +54,7 @@ public: ring_buffer_pos_t read(uint8_t *buffer); void flush(); ring_buffer_pos_t write(const uint8_t c); - ring_buffer_pos_t write(const uint8_t* buffer, ring_buffer_pos_t size); + ring_buffer_pos_t write(const uint8_t *buffer, ring_buffer_pos_t size); }; class WebSocketSerial: public Stream { @@ -70,7 +70,7 @@ public: int read(); void flush(); size_t write(const uint8_t c); - size_t write(const uint8_t* buffer, size_t size); + size_t write(const uint8_t *buffer, size_t size); #if ENABLED(SERIAL_STATS_DROPPED_RX) FORCE_INLINE uint32_t dropped() { return 0; } diff --git a/Marlin/src/HAL/LPC1768/HAL_SPI.cpp b/Marlin/src/HAL/LPC1768/HAL_SPI.cpp index dbc89a33f5..99db15f6e9 100644 --- a/Marlin/src/HAL/LPC1768/HAL_SPI.cpp +++ b/Marlin/src/HAL/LPC1768/HAL_SPI.cpp @@ -93,12 +93,12 @@ void spiSend(uint8_t b) { (void)spiTransfer(b); } - void spiSend(const uint8_t* buf, size_t nbyte) { + void spiSend(const uint8_t *buf, size_t nbyte) { for (uint16_t i = 0; i < nbyte; i++) (void)spiTransfer(buf[i]); } - void spiSendBlock(uint8_t token, const uint8_t* buf) { + void spiSendBlock(uint8_t token, const uint8_t *buf) { (void)spiTransfer(token); for (uint16_t i = 0; i < 512; i++) (void)spiTransfer(buf[i]); @@ -135,13 +135,13 @@ void spiSend(uint8_t b) { doio(b); } - void spiSend(const uint8_t* buf, size_t nbyte) { + void spiSend(const uint8_t *buf, size_t nbyte) { for (uint16_t i = 0; i < nbyte; i++) doio(buf[i]); } void spiSend(uint32_t chan, byte b) {} - void spiSend(uint32_t chan, const uint8_t* buf, size_t nbyte) {} + void spiSend(uint32_t chan, const uint8_t *buf, size_t nbyte) {} // Read single byte from SPI uint8_t spiRec() { return doio(0xFF); } @@ -156,7 +156,7 @@ uint8_t spiTransfer(uint8_t b) { return doio(b); } // Write from buffer to SPI - void spiSendBlock(uint8_t token, const uint8_t* buf) { + void spiSendBlock(uint8_t token, const uint8_t *buf) { (void)spiTransfer(token); for (uint16_t i = 0; i < 512; i++) (void)spiTransfer(buf[i]); diff --git a/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_st7920_hw_spi.cpp b/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_st7920_hw_spi.cpp index 592e27f6c0..0b0626de79 100644 --- a/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_st7920_hw_spi.cpp +++ b/Marlin/src/HAL/LPC1768/u8g/u8g_com_HAL_LPC1768_st7920_hw_spi.cpp @@ -66,7 +66,7 @@ void spiBegin(); void spiInit(uint8_t spiRate); void spiSend(uint8_t b); -void spiSend(const uint8_t* buf, size_t n); +void spiSend(const uint8_t *buf, size_t n); static uint8_t rs_last_state = 255; diff --git a/Marlin/src/HAL/SAMD51/HAL_SPI.cpp b/Marlin/src/HAL/SAMD51/HAL_SPI.cpp index c3acd38237..77f4d5ecd5 100644 --- a/Marlin/src/HAL/SAMD51/HAL_SPI.cpp +++ b/Marlin/src/HAL/SAMD51/HAL_SPI.cpp @@ -103,7 +103,7 @@ * @param nbyte Number of bytes to receive. * @return Nothing */ - void spiRead(uint8_t* buf, uint16_t nbyte) { + void spiRead(uint8_t *buf, uint16_t nbyte) { if (nbyte == 0) return; memset(buf, 0xFF, nbyte); sdSPI.beginTransaction(spiConfig); @@ -132,7 +132,7 @@ * * @details Uses DMA */ - void spiSendBlock(uint8_t token, const uint8_t* buf) { + void spiSendBlock(uint8_t token, const uint8_t *buf) { sdSPI.beginTransaction(spiConfig); sdSPI.transfer(token); sdSPI.transfer((uint8_t*)buf, nullptr, 512); diff --git a/Marlin/src/HAL/STM32/HAL_SPI.cpp b/Marlin/src/HAL/STM32/HAL_SPI.cpp index c9f23e6fa3..80347e115d 100644 --- a/Marlin/src/HAL/STM32/HAL_SPI.cpp +++ b/Marlin/src/HAL/STM32/HAL_SPI.cpp @@ -193,7 +193,7 @@ static SPISettings spiConfig; * * @details Uses DMA */ - void spiRead(uint8_t* buf, uint16_t nbyte) { + void spiRead(uint8_t *buf, uint16_t nbyte) { if (nbyte == 0) return; memset(buf, 0xFF, nbyte); SPI.transfer(buf, nbyte); @@ -218,7 +218,7 @@ static SPISettings spiConfig; * * @details Use DMA */ - void spiSendBlock(uint8_t token, const uint8_t* buf) { + void spiSendBlock(uint8_t token, const uint8_t *buf) { uint8_t rxBuf[512]; SPI.transfer(token); SPI.transfer((uint8_t*)buf, &rxBuf, 512); diff --git a/Marlin/src/HAL/STM32/MarlinSerial.h b/Marlin/src/HAL/STM32/MarlinSerial.h index 7b0529cfd2..d9e8457017 100644 --- a/Marlin/src/HAL/STM32/MarlinSerial.h +++ b/Marlin/src/HAL/STM32/MarlinSerial.h @@ -36,7 +36,7 @@ struct MarlinSerial : public HardwareSerial { void begin(unsigned long baud, uint8_t config); inline void begin(unsigned long baud) { begin(baud, SERIAL_8N1); } - void _rx_complete_irq(serial_t* obj); + void _rx_complete_irq(serial_t *obj); protected: usart_rx_callback_t _rx_callback; diff --git a/Marlin/src/HAL/STM32F1/HAL_SPI.cpp b/Marlin/src/HAL/STM32F1/HAL_SPI.cpp index 7e876f765f..abb348d743 100644 --- a/Marlin/src/HAL/STM32F1/HAL_SPI.cpp +++ b/Marlin/src/HAL/STM32F1/HAL_SPI.cpp @@ -123,7 +123,7 @@ uint8_t spiRec() { * * @details Uses DMA */ -void spiRead(uint8_t* buf, uint16_t nbyte) { +void spiRead(uint8_t *buf, uint16_t nbyte) { SPI.dmaTransfer(0, const_cast(buf), nbyte); } @@ -146,7 +146,7 @@ void spiSend(uint8_t b) { * * @details Use DMA */ -void spiSendBlock(uint8_t token, const uint8_t* buf) { +void spiSendBlock(uint8_t token, const uint8_t *buf) { SPI.send(token); SPI.dmaSend(const_cast(buf), 512); } @@ -160,7 +160,7 @@ uint8_t spiRec(uint32_t chan) { return SPI.transfer(0xFF); } void spiSend(uint32_t chan, byte b) { SPI.send(b); } // Write buffer to specified SPI channel -void spiSend(uint32_t chan, const uint8_t* buf, size_t n) { +void spiSend(uint32_t chan, const uint8_t *buf, size_t n) { for (size_t p = 0; p < n; p++) spiSend(chan, buf[p]); } diff --git a/Marlin/src/HAL/STM32F1/eeprom_flash.cpp b/Marlin/src/HAL/STM32F1/eeprom_flash.cpp index dfcaaaf29f..e7d9dd29e2 100644 --- a/Marlin/src/HAL/STM32F1/eeprom_flash.cpp +++ b/Marlin/src/HAL/STM32F1/eeprom_flash.cpp @@ -48,8 +48,8 @@ static uint8_t ram_eeprom[MARLIN_EEPROM_SIZE] __attribute__((aligned(4))) = {0}; static bool eeprom_dirty = false; bool PersistentStore::access_start() { - const uint32_t* source = reinterpret_cast(EEPROM_PAGE0_BASE); - uint32_t* destination = reinterpret_cast(ram_eeprom); + const uint32_t *source = reinterpret_cast(EEPROM_PAGE0_BASE); + uint32_t *destination = reinterpret_cast(ram_eeprom); static_assert(0 == (MARLIN_EEPROM_SIZE) % 4, "MARLIN_EEPROM_SIZE is corrupted. (Must be a multiple of 4.)"); // Ensure copying as uint32_t is safe constexpr size_t eeprom_size_u32 = (MARLIN_EEPROM_SIZE) / 4; diff --git a/Marlin/src/HAL/TEENSY31_32/HAL_SPI.cpp b/Marlin/src/HAL/TEENSY31_32/HAL_SPI.cpp index dce236ef6b..21330eaac1 100644 --- a/Marlin/src/HAL/TEENSY31_32/HAL_SPI.cpp +++ b/Marlin/src/HAL/TEENSY31_32/HAL_SPI.cpp @@ -82,7 +82,7 @@ uint8_t spiRec() { } // SPI read data -void spiRead(uint8_t* buf, uint16_t nbyte) { +void spiRead(uint8_t *buf, uint16_t nbyte) { SPI.beginTransaction(spiConfig); SPI.transfer(buf, nbyte); SPI.endTransaction(); @@ -107,7 +107,7 @@ void spiSend(uint8_t b) { } // SPI send block -void spiSendBlock(uint8_t token, const uint8_t* buf) { +void spiSendBlock(uint8_t token, const uint8_t *buf) { SPI.beginTransaction(spiConfig); SPDR = token; for (uint16_t i = 0; i < 512; i += 2) { diff --git a/Marlin/src/HAL/TEENSY35_36/HAL_SPI.cpp b/Marlin/src/HAL/TEENSY35_36/HAL_SPI.cpp index 84852cd358..5b22668fce 100644 --- a/Marlin/src/HAL/TEENSY35_36/HAL_SPI.cpp +++ b/Marlin/src/HAL/TEENSY35_36/HAL_SPI.cpp @@ -80,7 +80,7 @@ uint8_t spiRec() { //return SPDR; } -void spiRead(uint8_t* buf, uint16_t nbyte) { +void spiRead(uint8_t *buf, uint16_t nbyte) { SPI.beginTransaction(spiConfig); SPI.transfer(buf, nbyte); SPI.endTransaction(); @@ -103,7 +103,7 @@ void spiSend(uint8_t b) { //while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } } -void spiSendBlock(uint8_t token, const uint8_t* buf) { +void spiSendBlock(uint8_t token, const uint8_t *buf) { SPI.beginTransaction(spiConfig); SPDR = token; for (uint16_t i = 0; i < 512; i += 2) { diff --git a/Marlin/src/HAL/TEENSY40_41/HAL_SPI.cpp b/Marlin/src/HAL/TEENSY40_41/HAL_SPI.cpp index 8c93049027..e4335ff74f 100644 --- a/Marlin/src/HAL/TEENSY40_41/HAL_SPI.cpp +++ b/Marlin/src/HAL/TEENSY40_41/HAL_SPI.cpp @@ -97,7 +97,7 @@ uint8_t spiRec() { //return SPDR; } -void spiRead(uint8_t* buf, uint16_t nbyte) { +void spiRead(uint8_t *buf, uint16_t nbyte) { SPI.beginTransaction(spiConfig); SPI.transfer(buf, nbyte); SPI.endTransaction(); @@ -120,7 +120,7 @@ void spiSend(uint8_t b) { //while (!TEST(SPSR, SPIF)) { /* Intentionally left empty */ } } -void spiSendBlock(uint8_t token, const uint8_t* buf) { +void spiSendBlock(uint8_t token, const uint8_t *buf) { SPI.beginTransaction(spiConfig); SPDR = token; for (uint16_t i = 0; i < 512; i += 2) { diff --git a/Marlin/src/HAL/shared/HAL_MinSerial.h b/Marlin/src/HAL/shared/HAL_MinSerial.h index 04643c1ab3..3089b8aa06 100644 --- a/Marlin/src/HAL/shared/HAL_MinSerial.h +++ b/Marlin/src/HAL/shared/HAL_MinSerial.h @@ -42,7 +42,7 @@ struct MinSerial { HAL_min_serial_out(ch); } // Send String through UART - static void TX(const char* s) { while (*s) TX(*s++); } + static void TX(const char *s) { while (*s) TX(*s++); } // Send a digit through UART static void TXDigit(uint32_t d) { if (d < 10) TX((char)(d+'0')); diff --git a/Marlin/src/HAL/shared/HAL_SPI.h b/Marlin/src/HAL/shared/HAL_SPI.h index 59af554806..6611f9ec4e 100644 --- a/Marlin/src/HAL/shared/HAL_SPI.h +++ b/Marlin/src/HAL/shared/HAL_SPI.h @@ -71,10 +71,10 @@ void spiSend(uint8_t b); uint8_t spiRec(); // Read from SPI into buffer -void spiRead(uint8_t* buf, uint16_t nbyte); +void spiRead(uint8_t *buf, uint16_t nbyte); // Write token and then write from 512 byte buffer to SPI (for SD card) -void spiSendBlock(uint8_t token, const uint8_t* buf); +void spiSendBlock(uint8_t token, const uint8_t *buf); // Begin SPI transaction, set clock, bit order, data mode void spiBeginTransaction(uint32_t spiClock, uint8_t bitOrder, uint8_t dataMode); @@ -87,7 +87,7 @@ void spiBeginTransaction(uint32_t spiClock, uint8_t bitOrder, uint8_t dataMode); void spiSend(uint32_t chan, byte b); // Write buffer to specified SPI channel -void spiSend(uint32_t chan, const uint8_t* buf, size_t n); +void spiSend(uint32_t chan, const uint8_t *buf, size_t n); // Read single byte from specified SPI channel uint8_t spiRec(uint32_t chan); diff --git a/Marlin/src/HAL/shared/backtrace/backtrace.cpp b/Marlin/src/HAL/shared/backtrace/backtrace.cpp index 8320f47509..e4ae502a88 100644 --- a/Marlin/src/HAL/shared/backtrace/backtrace.cpp +++ b/Marlin/src/HAL/shared/backtrace/backtrace.cpp @@ -44,7 +44,7 @@ static bool UnwReportOut(void* ctx, const UnwReport* bte) { } #ifdef UNW_DEBUG - void UnwPrintf(const char* format, ...) { + void UnwPrintf(const char *format, ...) { char dest[256]; va_list argptr; va_start(argptr, format); diff --git a/Marlin/src/HAL/shared/eeprom_api.h b/Marlin/src/HAL/shared/eeprom_api.h index 6445f7a4aa..1f38639930 100644 --- a/Marlin/src/HAL/shared/eeprom_api.h +++ b/Marlin/src/HAL/shared/eeprom_api.h @@ -45,11 +45,11 @@ public: // Read one or more bytes of data and update the CRC // Return 'true' on read error - static bool read_data(int &pos, uint8_t* value, size_t size, uint16_t *crc, const bool writing=true); + static bool read_data(int &pos, uint8_t *value, size_t size, uint16_t *crc, const bool writing=true); // Write one or more bytes of data // Return 'true' on write error - static inline bool write_data(const int pos, const uint8_t* value, const size_t size=sizeof(uint8_t)) { + static inline bool write_data(const int pos, const uint8_t *value, const size_t size=sizeof(uint8_t)) { int data_pos = pos; uint16_t crc = 0; return write_data(data_pos, value, size, &crc); @@ -61,7 +61,7 @@ public: // Read one or more bytes of data // Return 'true' on read error - static inline bool read_data(const int pos, uint8_t* value, const size_t size=1) { + static inline bool read_data(const int pos, uint8_t *value, const size_t size=1) { int data_pos = pos; uint16_t crc = 0; return read_data(data_pos, value, size, &crc); diff --git a/Marlin/src/HAL/shared/eeprom_if_spi.cpp b/Marlin/src/HAL/shared/eeprom_if_spi.cpp index e162f6fedc..6aa6e09096 100644 --- a/Marlin/src/HAL/shared/eeprom_if_spi.cpp +++ b/Marlin/src/HAL/shared/eeprom_if_spi.cpp @@ -55,7 +55,7 @@ static void _eeprom_begin(uint8_t * const pos, const uint8_t cmd) { // Leave the Bus in-use } -uint8_t eeprom_read_byte(uint8_t* pos) { +uint8_t eeprom_read_byte(uint8_t *pos) { _eeprom_begin(pos, CMD_READ); // Set read location and begin transmission const uint8_t v = spiRec(SPI_CHAN_EEPROM1); // After READ a value sits on the Bus diff --git a/Marlin/src/core/macros.h b/Marlin/src/core/macros.h index d7043ba523..f900993784 100644 --- a/Marlin/src/core/macros.h +++ b/Marlin/src/core/macros.h @@ -362,13 +362,13 @@ return *str == '/' ? true : (*str ? containsSlash(str + 1) : false); } // Find the last position of the slash - constexpr const char* findLastSlashPos(const char* str) { + constexpr const char* findLastSlashPos(const char *str) { return *str == '/' ? (str + 1) : findLastSlashPos(str - 1); } // Compile-time evaluation of the last part of a file path // Typically used to shorten the path to file in compiled strings // CompileTimeString::baseName(__FILE__) returns "macros.h" and not /path/to/Marlin/src/core/macros.h - constexpr const char* baseName(const char* str) { + constexpr const char* baseName(const char *str) { return containsSlash(str) ? findLastSlashPos(findStringEnd(str)) : str; } } diff --git a/Marlin/src/core/serial_base.h b/Marlin/src/core/serial_base.h index f8fe3a181d..78721c6f14 100644 --- a/Marlin/src/core/serial_base.h +++ b/Marlin/src/core/serial_base.h @@ -108,9 +108,9 @@ struct SerialBase { void flushTX() { CALL_IF_EXISTS(void, static_cast(this), flushTX); } // Glue code here - FORCE_INLINE void write(const char* str) { while (*str) write(*str++); } - FORCE_INLINE void write(const uint8_t* buffer, size_t size) { while (size--) write(*buffer++); } - FORCE_INLINE void print(const char* str) { write(str); } + FORCE_INLINE void write(const char *str) { while (*str) write(*str++); } + FORCE_INLINE void write(const uint8_t *buffer, size_t size) { while (size--) write(*buffer++); } + FORCE_INLINE void print(const char *str) { write(str); } // No default argument to avoid ambiguity NO_INLINE void print(char c, PrintBase base) { printNumber((signed long)c, (uint8_t)base); } NO_INLINE void print(unsigned char c, PrintBase base) { printNumber((unsigned long)c, (uint8_t)base); } diff --git a/Marlin/src/feature/binary_stream.h b/Marlin/src/feature/binary_stream.h index b5d68196ae..9eb151b27f 100644 --- a/Marlin/src/feature/binary_stream.h +++ b/Marlin/src/feature/binary_stream.h @@ -51,10 +51,10 @@ class SDFileTransferProtocol { private: struct Packet { struct [[gnu::packed]] Open { - static bool validate(char* buffer, size_t length) { + static bool validate(char *buffer, size_t length) { return (length > sizeof(Open) && buffer[length - 1] == '\0'); } - static Open& decode(char* buffer) { + static Open& decode(char *buffer) { data = &buffer[2]; return *reinterpret_cast(buffer); } @@ -67,7 +67,7 @@ private: }; }; - static bool file_open(char* filename) { + static bool file_open(char *filename) { if (!dummy_transfer) { card.mount(); card.openFileWrite(filename); @@ -79,7 +79,7 @@ private: return true; } - static bool file_write(char* buffer, const size_t length) { + static bool file_write(char *buffer, const size_t length) { #if ENABLED(BINARY_STREAM_COMPRESSION) if (compression) { size_t total_processed = 0, processed_count = 0; @@ -150,7 +150,7 @@ public: } } - static void process(uint8_t packet_type, char* buffer, const uint16_t length) { + static void process(uint8_t packet_type, char *buffer, const uint16_t length) { transfer_timeout = millis() + TIMEOUT; switch (static_cast(packet_type)) { case FileTransfer::QUERY: diff --git a/Marlin/src/feature/meatpack.cpp b/Marlin/src/feature/meatpack.cpp index 0742f82350..6803a0de7d 100644 --- a/Marlin/src/feature/meatpack.cpp +++ b/Marlin/src/feature/meatpack.cpp @@ -205,7 +205,7 @@ void MeatPack::handle_rx_char(const uint8_t c, const serial_index_t serial_ind) handle_rx_char_inner(c); // Other characters are passed on for MeatPack decoding } -uint8_t MeatPack::get_result_char(char* const __restrict out) { +uint8_t MeatPack::get_result_char(char * const __restrict out) { uint8_t res = 0; if (char_out_count) { res = char_out_count; diff --git a/Marlin/src/feature/meatpack.h b/Marlin/src/feature/meatpack.h index 80f4570e03..2c4c4686d8 100644 --- a/Marlin/src/feature/meatpack.h +++ b/Marlin/src/feature/meatpack.h @@ -109,7 +109,7 @@ public: * @param out [in] Output pointer for unpacked/processed data. * @return Number of characters returned. Range from 0 to 2. */ - uint8_t get_result_char(char* const __restrict out); + uint8_t get_result_char(char * const __restrict out); void reset_state(); void report_state(); diff --git a/Marlin/src/feature/mmu/mmu2.cpp b/Marlin/src/feature/mmu/mmu2.cpp index d4238400c7..c1c34f8eee 100644 --- a/Marlin/src/feature/mmu/mmu2.cpp +++ b/Marlin/src/feature/mmu/mmu2.cpp @@ -362,7 +362,7 @@ bool MMU2::rx_start() { /** * Check if the data received ends with the given string. */ -bool MMU2::rx_str_P(const char* str) { +bool MMU2::rx_str_P(const char *str) { uint8_t i = strlen(rx_buffer); while (MMU2_SERIAL.available()) { @@ -394,7 +394,7 @@ bool MMU2::rx_str_P(const char* str) { /** * Transfer data to MMU, no argument */ -void MMU2::tx_str_P(const char* str) { +void MMU2::tx_str_P(const char *str) { clear_rx_buffer(); uint8_t len = strlen_P(str); LOOP_L_N(i, len) MMU2_SERIAL.write(pgm_read_byte(str++)); @@ -404,7 +404,7 @@ void MMU2::tx_str_P(const char* str) { /** * Transfer data to MMU, single argument */ -void MMU2::tx_printf_P(const char* format, int argument = -1) { +void MMU2::tx_printf_P(const char *format, int argument = -1) { clear_rx_buffer(); uint8_t len = sprintf_P(tx_buffer, format, argument); LOOP_L_N(i, len) MMU2_SERIAL.write(tx_buffer[i]); @@ -414,7 +414,7 @@ void MMU2::tx_printf_P(const char* format, int argument = -1) { /** * Transfer data to MMU, two arguments */ -void MMU2::tx_printf_P(const char* format, int argument1, int argument2) { +void MMU2::tx_printf_P(const char *format, int argument1, int argument2) { clear_rx_buffer(); uint8_t len = sprintf_P(tx_buffer, format, argument1, argument2); LOOP_L_N(i, len) MMU2_SERIAL.write(tx_buffer[i]); @@ -511,7 +511,7 @@ static void mmu2_not_responding() { * Tx Same as T?, except nozzle doesn't have to be preheated. Tc must be placed after extruder nozzle is preheated to finish filament load. * Tc Load to nozzle after filament was prepared by Tx and extruder nozzle is already heated. */ - void MMU2::tool_change(const char* special) { + void MMU2::tool_change(const char *special) { if (!enabled) return; set_runout_valid(false); @@ -598,7 +598,7 @@ static void mmu2_not_responding() { * Tx Same as T?, except nozzle doesn't have to be preheated. Tc must be placed after extruder nozzle is preheated to finish filament load. * Tc Load to nozzle after filament was prepared by Tx and extruder nozzle is already heated. */ - void MMU2::tool_change(const char* special) { + void MMU2::tool_change(const char *special) { if (!enabled) return; set_runout_valid(false); @@ -692,7 +692,7 @@ static void mmu2_not_responding() { * Tx Same as T?, except nozzle doesn't have to be preheated. Tc must be placed after extruder nozzle is preheated to finish filament load. * Tc Load to nozzle after filament was prepared by Tx and extruder nozzle is already heated. */ - void MMU2::tool_change(const char* special) { + void MMU2::tool_change(const char *special) { if (!enabled) return; set_runout_valid(false); diff --git a/Marlin/src/feature/mmu/mmu2.h b/Marlin/src/feature/mmu/mmu2.h index 4326989a74..079a6ef79a 100644 --- a/Marlin/src/feature/mmu/mmu2.h +++ b/Marlin/src/feature/mmu/mmu2.h @@ -45,7 +45,7 @@ public: static void reset(); static void mmu_loop(); static void tool_change(const uint8_t index); - static void tool_change(const char* special); + static void tool_change(const char *special); static uint8_t get_current_tool(); static void set_filament_type(const uint8_t index, const uint8_t type); @@ -56,10 +56,10 @@ public: static bool eject_filament(const uint8_t index, const bool recover); private: - static bool rx_str_P(const char* str); - static void tx_str_P(const char* str); - static void tx_printf_P(const char* format, const int argument); - static void tx_printf_P(const char* format, const int argument1, const int argument2); + static bool rx_str_P(const char *str); + static void tx_str_P(const char *str); + static void tx_printf_P(const char *format, const int argument); + static void tx_printf_P(const char *format, const int argument1, const int argument2); static void clear_rx_buffer(); static bool rx_ok(); diff --git a/Marlin/src/feature/runout.h b/Marlin/src/feature/runout.h index 34ae67899b..0c35ef6659 100644 --- a/Marlin/src/feature/runout.h +++ b/Marlin/src/feature/runout.h @@ -106,7 +106,7 @@ class TFilamentMonitor : public FilamentMonitorBase { // Handle a block completion. RunoutResponseDelayed uses this to // add up the length of filament moved while the filament is out. - static inline void block_completed(const block_t* const b) { + static inline void block_completed(const block_t * const b) { if (enabled) { response.block_completed(b); sensor.block_completed(b); @@ -273,7 +273,7 @@ class FilamentSensorBase { } public: - static inline void block_completed(const block_t* const b) { + static inline void block_completed(const block_t * const b) { // If the sensor wheel has moved since the last call to // this method reset the runout counter for the extruder. if (TEST(motion_detected, b->extruder)) @@ -307,7 +307,7 @@ class FilamentSensorBase { } public: - static inline void block_completed(const block_t* const) {} + static inline void block_completed(const block_t * const) {} static inline void run() { LOOP_L_N(s, NUM_RUNOUT_SENSORS) { @@ -368,7 +368,7 @@ class FilamentSensorBase { runout_mm_countdown[extruder] = runout_distance_mm; } - static inline void block_completed(const block_t* const b) { + static inline void block_completed(const block_t * const b) { if (b->steps.x || b->steps.y || b->steps.z || did_pause_print) { // Allow pause purge move to re-trigger runout state // Only trigger on extrusion with XYZ movement to allow filament change and retract/recover. const uint8_t e = b->extruder; @@ -403,7 +403,7 @@ class FilamentSensorBase { return runout_flags; } - static inline void block_completed(const block_t* const) { } + static inline void block_completed(const block_t * const) { } static inline void filament_present(const uint8_t extruder) { runout_count[extruder] = runout_threshold; diff --git a/Marlin/src/gcode/queue.cpp b/Marlin/src/gcode/queue.cpp index 7845b01ad6..a79909917e 100644 --- a/Marlin/src/gcode/queue.cpp +++ b/Marlin/src/gcode/queue.cpp @@ -99,7 +99,7 @@ void GCodeQueue::RingBuffer::commit_command(bool skip_ok * Return true if the command was successfully added. * Return false for a full buffer, or if the 'command' is a comment. */ -bool GCodeQueue::RingBuffer::enqueue(const char* cmd, bool skip_ok/*=true*/ +bool GCodeQueue::RingBuffer::enqueue(const char *cmd, bool skip_ok/*=true*/ #if HAS_MULTI_SERIAL , serial_index_t serial_ind/*=-1*/ #endif @@ -118,7 +118,7 @@ bool GCodeQueue::RingBuffer::enqueue(const char* cmd, bool skip_ok/*=true*/ * Enqueue with Serial Echo * Return true if the command was consumed */ -bool GCodeQueue::enqueue_one(const char* cmd) { +bool GCodeQueue::enqueue_one(const char *cmd) { //SERIAL_ECHOLNPAIR("enqueue_one(\"", cmd, "\")"); if (*cmd == 0 || ISEOL(*cmd)) return true; @@ -187,7 +187,7 @@ bool GCodeQueue::process_injected_command() { * Enqueue and return only when commands are actually enqueued. * Never call this from a G-code handler! */ -void GCodeQueue::enqueue_one_now(const char* cmd) { while (!enqueue_one(cmd)) idle(); } +void GCodeQueue::enqueue_one_now(const char *cmd) { while (!enqueue_one(cmd)) idle(); } /** * Attempt to enqueue a single G-code command diff --git a/Marlin/src/gcode/queue.h b/Marlin/src/gcode/queue.h index 4d3ccb364e..5df4a0104c 100644 --- a/Marlin/src/gcode/queue.h +++ b/Marlin/src/gcode/queue.h @@ -85,7 +85,7 @@ public: #endif ); - bool enqueue(const char* cmd, bool skip_ok = true + bool enqueue(const char *cmd, bool skip_ok = true #if HAS_MULTI_SERIAL , serial_index_t serial_ind = serial_index_t() #endif @@ -143,7 +143,7 @@ public: /** * Enqueue and return only when commands are actually enqueued */ - static void enqueue_one_now(const char* cmd); + static void enqueue_one_now(const char *cmd); /** * Attempt to enqueue a single G-code command @@ -219,7 +219,7 @@ private: * Enqueue with Serial Echo * Return true on success */ - static bool enqueue_one(const char* cmd); + static bool enqueue_one(const char *cmd); static void gcode_line_error(PGM_P const err, const serial_index_t serial_ind); diff --git a/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp b/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp index 683c1c0884..e18ed7273c 100644 --- a/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp +++ b/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp @@ -1076,7 +1076,7 @@ void MarlinUI::draw_status_screen() { } // Draw a menu item with a (potentially) editable value - void MenuEditItemBase::draw(const bool sel, const uint8_t row, PGM_P const pstr, const char* const inStr, const bool pgm) { + void MenuEditItemBase::draw(const bool sel, const uint8_t row, PGM_P const pstr, const char * const inStr, const bool pgm) { const uint8_t vlen = inStr ? (pgm ? utf8_strlen_P(inStr) : utf8_strlen(inStr)) : 0; lcd_put_wchar(0, row, sel ? LCD_STR_ARROW_RIGHT[0] : ' '); uint8_t n = lcd_put_u8str_ind_P(pstr, itemIndex, itemString, LCD_WIDTH - 2 - vlen); @@ -1088,7 +1088,7 @@ void MarlinUI::draw_status_screen() { } // Low-level draw_edit_screen can be used to draw an edit screen from anyplace - void MenuEditItemBase::draw_edit_screen(PGM_P const pstr, const char* const value/*=nullptr*/) { + void MenuEditItemBase::draw_edit_screen(PGM_P const pstr, const char * const value/*=nullptr*/) { ui.encoder_direction_normal(); uint8_t n = lcd_put_u8str_ind_P(0, 1, pstr, itemIndex, itemString, LCD_WIDTH - 1); if (value) { diff --git a/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp b/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp index e645a76611..6976bfed22 100644 --- a/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp +++ b/Marlin/src/lcd/TFTGLCD/marlinui_TFTGLCD.cpp @@ -835,7 +835,7 @@ void MarlinUI::draw_status_screen() { } // Draw a menu item with a (potentially) editable value - void MenuEditItemBase::draw(const bool sel, const uint8_t row, PGM_P const pstr, const char* const data, const bool pgm) { + void MenuEditItemBase::draw(const bool sel, const uint8_t row, PGM_P const pstr, const char * const data, const bool pgm) { if (!PanelDetected) return; const uint8_t vlen = data ? (pgm ? utf8_strlen_P(data) : utf8_strlen(data)) : 0; lcd.setCursor(0, row); @@ -851,7 +851,7 @@ void MarlinUI::draw_status_screen() { // Low-level draw_edit_screen can be used to draw an edit screen from anyplace // This line moves to the last line of the screen for UBL plot screen on the panel side - void MenuEditItemBase::draw_edit_screen(PGM_P const pstr, const char* const value/*=nullptr*/) { + void MenuEditItemBase::draw_edit_screen(PGM_P const pstr, const char * const value/*=nullptr*/) { if (!PanelDetected) return; ui.encoder_direction_normal(); const uint8_t y = TERN0(AUTO_BED_LEVELING_UBL, ui.external_control) ? LCD_HEIGHT - 1 : MIDDLE_Y; diff --git a/Marlin/src/lcd/dogm/marlinui_DOGM.cpp b/Marlin/src/lcd/dogm/marlinui_DOGM.cpp index a3b14d8609..c2d2cf43af 100644 --- a/Marlin/src/lcd/dogm/marlinui_DOGM.cpp +++ b/Marlin/src/lcd/dogm/marlinui_DOGM.cpp @@ -385,7 +385,7 @@ void MarlinUI::clear_lcd() { } // Automatically cleared by Picture Loop } // Draw a menu item with an editable value - void MenuEditItemBase::draw(const bool sel, const uint8_t row, PGM_P const pstr, const char* const inStr, const bool pgm) { + void MenuEditItemBase::draw(const bool sel, const uint8_t row, PGM_P const pstr, const char * const inStr, const bool pgm) { if (mark_as_selected(row, sel)) { const uint8_t vallen = (pgm ? utf8_strlen_P(inStr) : utf8_strlen((char*)inStr)), pixelwidth = (pgm ? uxg_GetUtf8StrPixelWidthP(u8g.getU8g(), inStr) : uxg_GetUtf8StrPixelWidth(u8g.getU8g(), (char*)inStr)); @@ -400,7 +400,7 @@ void MarlinUI::clear_lcd() { } // Automatically cleared by Picture Loop } } - void MenuEditItemBase::draw_edit_screen(PGM_P const pstr, const char* const value/*=nullptr*/) { + void MenuEditItemBase::draw_edit_screen(PGM_P const pstr, const char * const value/*=nullptr*/) { ui.encoder_direction_normal(); const u8g_uint_t labellen = utf8_strlen_P(pstr), vallen = utf8_strlen(value); diff --git a/Marlin/src/lcd/dogm/u8g_dev_tft_upscale_from_128x64.cpp b/Marlin/src/lcd/dogm/u8g_dev_tft_upscale_from_128x64.cpp index 7f88df7bc4..3842611fdf 100644 --- a/Marlin/src/lcd/dogm/u8g_dev_tft_upscale_from_128x64.cpp +++ b/Marlin/src/lcd/dogm/u8g_dev_tft_upscale_from_128x64.cpp @@ -311,7 +311,7 @@ static void setWindow(u8g_t *u8g, u8g_dev_t *dev, uint16_t Xmin, uint16_t Ymin, // Used to fill RGB565 (16bits) background inline void memset2(const void *ptr, uint16_t fill, size_t cnt) { - uint16_t* wptr = (uint16_t*)ptr; + uint16_t *wptr = (uint16_t*)ptr; for (size_t i = 0; i < cnt; i += 2) { *wptr = fill; wptr++; } } @@ -346,7 +346,7 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u #if HAS_LCD_IO static uint16_t bufferA[WIDTH * sq(GRAPHICAL_TFT_UPSCALE)], bufferB[WIDTH * sq(GRAPHICAL_TFT_UPSCALE)]; - uint16_t* buffer = &bufferA[0]; + uint16_t *buffer = &bufferA[0]; #else uint16_t buffer[WIDTH * GRAPHICAL_TFT_UPSCALE]; // 16-bit RGB 565 pixel line buffer #endif @@ -404,7 +404,7 @@ uint8_t u8g_dev_tft_320x240_upscale_from_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, u tftio.WriteSequence(buffer, COUNT(bufferA)); #else - uint8_t* bufptr = (uint8_t*) buffer; + uint8_t *bufptr = (uint8_t*) buffer; for (uint8_t i = GRAPHICAL_TFT_UPSCALE; i--;) { LOOP_S_L_N(n, 0, GRAPHICAL_TFT_UPSCALE * 2) { u8g_WriteSequence(u8g, dev, WIDTH, &bufptr[WIDTH * n]); 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 8542424d7e..1e19bf85e5 100644 --- a/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.cpp +++ b/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.cpp @@ -148,8 +148,8 @@ uint8_t u8g_dev_rrd_st7920_128x64_fn(u8g_t *u8g, u8g_dev_t *dev, uint8_t msg, vo case U8G_DEV_MSG_STOP: break; case U8G_DEV_MSG_PAGE_NEXT: { - uint8_t* ptr; - u8g_pb_t* pb = (u8g_pb_t*)(dev->dev_mem); + uint8_t *ptr; + u8g_pb_t *pb = (u8g_pb_t*)(dev->dev_mem); y = pb->p.page_y0; ptr = (uint8_t*)pb->buf; diff --git a/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp index a585ef670a..b4e876ce4c 100644 --- a/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp @@ -62,7 +62,7 @@ void (*DGUSScreenHandler::confirm_action_cb)() = nullptr; filament_data_t filament_data; #endif -void DGUSScreenHandler::sendinfoscreen(const char* line1, const char* line2, const char* line3, const char* line4, bool l1inflash, bool l2inflash, bool l3inflash, bool l4inflash) { +void DGUSScreenHandler::sendinfoscreen(const char *line1, const char *line2, const char *line3, const char *line4, bool l1inflash, bool l2inflash, bool l3inflash, bool l4inflash) { DGUS_VP_Variable ramcopy; if (populate_VPVar(VP_MSGSTR1, &ramcopy)) { ramcopy.memadr = (void*) line1; @@ -82,7 +82,7 @@ void DGUSScreenHandler::sendinfoscreen(const char* line1, const char* line2, con } } -void DGUSScreenHandler::HandleUserConfirmationPopUp(uint16_t VP, const char* line1, const char* line2, const char* line3, const char* line4, bool l1, bool l2, bool l3, bool l4) { +void DGUSScreenHandler::HandleUserConfirmationPopUp(uint16_t VP, const char *line1, const char *line2, const char *line3, const char *line4, bool l1, bool l2, bool l3, bool l4) { if (current_screen == DGUSLCD_SCREEN_CONFIRM) // Already showing a pop up, so we need to cancel that first. PopToOldScreen(); diff --git a/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSScreenHandler.h b/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSScreenHandler.h index 28ab952e53..24965597a5 100644 --- a/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSScreenHandler.h +++ b/Marlin/src/lcd/extui/lib/dgus/fysetc/DGUSScreenHandler.h @@ -37,12 +37,12 @@ public: // Send all 4 strings that are displayed on the infoscreen, confirmation screen and kill screen // The bools specifing whether the strings are in RAM or FLASH. - static void sendinfoscreen(const char* line1, const char* line2, const char* line3, const char* line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash); + static void sendinfoscreen(const char *line1, const char *line2, const char *line3, const char *line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash); - static void HandleUserConfirmationPopUp(uint16_t ConfirmVP, const char* line1, const char* line2, const char* line3, const char* line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash); + static void HandleUserConfirmationPopUp(uint16_t ConfirmVP, const char *line1, const char *line2, const char *line3, const char *line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash); // "M117" Message -- msg is a RAM ptr. - static void setstatusmessage(const char* msg); + static void setstatusmessage(const char *msg); // The same for messages from Flash static void setstatusmessagePGM(PGM_P const msg); // Callback for VP "Display wants to change screen on idle printer" diff --git a/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSScreenHandler.h b/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSScreenHandler.h index 28ab952e53..24965597a5 100644 --- a/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSScreenHandler.h +++ b/Marlin/src/lcd/extui/lib/dgus/hiprecy/DGUSScreenHandler.h @@ -37,12 +37,12 @@ public: // Send all 4 strings that are displayed on the infoscreen, confirmation screen and kill screen // The bools specifing whether the strings are in RAM or FLASH. - static void sendinfoscreen(const char* line1, const char* line2, const char* line3, const char* line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash); + static void sendinfoscreen(const char *line1, const char *line2, const char *line3, const char *line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash); - static void HandleUserConfirmationPopUp(uint16_t ConfirmVP, const char* line1, const char* line2, const char* line3, const char* line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash); + static void HandleUserConfirmationPopUp(uint16_t ConfirmVP, const char *line1, const char *line2, const char *line3, const char *line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash); // "M117" Message -- msg is a RAM ptr. - static void setstatusmessage(const char* msg); + static void setstatusmessage(const char *msg); // The same for messages from Flash static void setstatusmessagePGM(PGM_P const msg); // Callback for VP "Display wants to change screen on idle printer" diff --git a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp index 0efb70b686..d956ec4c52 100644 --- a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp @@ -61,14 +61,14 @@ uint8_t DGUSLanguageSwitch = 0; // Switch language for MKS DGUS uint32_t swap32(const uint32_t value) { return (value & 0x000000FFU) << 24U | (value & 0x0000FF00U) << 8U | (value & 0x00FF0000U) >> 8U | (value & 0xFF000000U) >> 24U; } #if 0 -void DGUSScreenHandler::sendinfoscreen_ch_mks(const uint16_t* line1, const uint16_t* line2, const uint16_t* line3, const uint16_t* line4) { +void DGUSScreenHandler::sendinfoscreen_ch_mks(const uint16_t *line1, const uint16_t *line2, const uint16_t *line3, const uint16_t *line4) { dgusdisplay.WriteVariable(VP_MSGSTR1, line1, 32, true); dgusdisplay.WriteVariable(VP_MSGSTR2, line2, 32, true); dgusdisplay.WriteVariable(VP_MSGSTR3, line3, 32, true); dgusdisplay.WriteVariable(VP_MSGSTR4, line4, 32, true); } -void DGUSScreenHandler::sendinfoscreen_en_mks(const char* line1, const char* line2, const char* line3, const char* line4) { +void DGUSScreenHandler::sendinfoscreen_en_mks(const char *line1, const char *line2, const char *line3, const char *line4) { dgusdisplay.WriteVariable(VP_MSGSTR1, line1, 32, true); dgusdisplay.WriteVariable(VP_MSGSTR2, line2, 32, true); dgusdisplay.WriteVariable(VP_MSGSTR3, line3, 32, true); diff --git a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.h b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.h index bfec3c4572..dc656326ac 100644 --- a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.h +++ b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.h @@ -37,18 +37,18 @@ public: // Send all 4 strings that are displayed on the infoscreen, confirmation screen and kill screen // The bools specifing whether the strings are in RAM or FLASH. - static void sendinfoscreen(const char* line1, const char* line2, const char* line3, const char* line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash); + static void sendinfoscreen(const char *line1, const char *line2, const char *line3, const char *line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash); - static void HandleUserConfirmationPopUp(uint16_t ConfirmVP, const char* line1, const char* line2, const char* line3, const char* line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash); + static void HandleUserConfirmationPopUp(uint16_t ConfirmVP, const char *line1, const char *line2, const char *line3, const char *line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash); #if 0 - static void sendinfoscreen_ch_mks(const uint16_t* line1, const uint16_t* line2, const uint16_t* line3, const uint16_t* line4); - static void sendinfoscreen_en_mks(const char* line1, const char* line2, const char* line3, const char* line4) ; + static void sendinfoscreen_ch_mks(const uint16_t *line1, const uint16_t *line2, const uint16_t *line3, const uint16_t *line4); + static void sendinfoscreen_en_mks(const char *line1, const char *line2, const char *line3, const char *line4) ; static void sendinfoscreen_mks(const void* line1, const void* line2, const void* line3, const void* line4,uint16_t language); #endif // "M117" Message -- msg is a RAM ptr. - static void setstatusmessage(const char* msg); + static void setstatusmessage(const char *msg); // The same for messages from Flash static void setstatusmessagePGM(PGM_P const msg); // Callback for VP "Display wants to change screen on idle printer" diff --git a/Marlin/src/lcd/extui/lib/dgus/origin/DGUSScreenHandler.h b/Marlin/src/lcd/extui/lib/dgus/origin/DGUSScreenHandler.h index 28ab952e53..24965597a5 100644 --- a/Marlin/src/lcd/extui/lib/dgus/origin/DGUSScreenHandler.h +++ b/Marlin/src/lcd/extui/lib/dgus/origin/DGUSScreenHandler.h @@ -37,12 +37,12 @@ public: // Send all 4 strings that are displayed on the infoscreen, confirmation screen and kill screen // The bools specifing whether the strings are in RAM or FLASH. - static void sendinfoscreen(const char* line1, const char* line2, const char* line3, const char* line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash); + static void sendinfoscreen(const char *line1, const char *line2, const char *line3, const char *line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash); - static void HandleUserConfirmationPopUp(uint16_t ConfirmVP, const char* line1, const char* line2, const char* line3, const char* line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash); + static void HandleUserConfirmationPopUp(uint16_t ConfirmVP, const char *line1, const char *line2, const char *line3, const char *line4, bool l1inflash, bool l2inflash, bool l3inflash, bool liinflash); // "M117" Message -- msg is a RAM ptr. - static void setstatusmessage(const char* msg); + static void setstatusmessage(const char *msg); // The same for messages from Flash static void setstatusmessagePGM(PGM_P const msg); // Callback for VP "Display wants to change screen on idle printer" diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/media_file_reader.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/media_file_reader.cpp index 9868492d81..ab60579700 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/media_file_reader.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/media_file_reader.cpp @@ -26,7 +26,7 @@ #include "media_file_reader.h" #if ENABLED(SDSUPPORT) - bool MediaFileReader::open(const char* filename) { + bool MediaFileReader::open(const char *filename) { card.init(SD_SPI_SPEED, SDSS); volume.init(&card); root.openRoot(&volume); diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/media_file_reader.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/media_file_reader.h index be393a952c..d9edea8388 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/media_file_reader.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/archim2-flash/media_file_reader.h @@ -38,7 +38,7 @@ class MediaFileReader { #endif public: - bool open(const char* filename); + bool open(const char *filename); int16_t read(void *buff, size_t bytes); uint32_t size(); void rewind(); diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/spi.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/spi.cpp index 006cbe872c..30f778e9f5 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/spi.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/spi.cpp @@ -103,12 +103,12 @@ namespace FTDI { #endif void SPI::spi_read_bulk(void *data, uint16_t len) { - uint8_t* p = (uint8_t *)data; + uint8_t *p = (uint8_t *)data; while (len--) *p++ = spi_recv(); } bool SPI::spi_verify_bulk(const void *data, uint16_t len) { - const uint8_t* p = (const uint8_t *)data; + const uint8_t *p = (const uint8_t *)data; while (len--) if (*p++ != spi_recv()) return false; return true; } diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/spi.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/spi.h index e3a23d768f..7adf7e9c53 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/spi.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/basic/spi.h @@ -116,14 +116,14 @@ namespace FTDI { template void spi_write_bulk(const void *data, uint16_t len, uint8_t padding) { - const uint8_t* p = (const uint8_t *)data; + const uint8_t *p = (const uint8_t *)data; while (len--) spi_send(byte_op(p++)); while (padding--) spi_send(0); } template void spi_write_bulk(const void *data, uint16_t len) { - const uint8_t* p = (const uint8_t *)data; + const uint8_t *p = (const uint8_t *)data; while (len--) spi_send(byte_op(p++)); } diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_list.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_list.h index 20df15a91e..2ddab1b818 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_list.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_list.h @@ -24,7 +24,7 @@ class SoundList { private: static PROGMEM const struct list_t { - const char *const PROGMEM name; + const char * const PROGMEM name; const FTDI::SoundPlayer::sound_t* data; } list[]; public: diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_player.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_player.cpp index f48448eb84..47bf79e467 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_player.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_player.cpp @@ -62,7 +62,7 @@ namespace FTDI { timer.start(); } - void SoundPlayer::play(const sound_t* seq, play_mode_t mode) { + void SoundPlayer::play(const sound_t *seq, play_mode_t mode) { sequence = seq; wait = 250; // Adding this delay causes the note to not be clipped, not sure why. timer.start(); diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_player.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_player.h index fcfe70bd76..3ba39b8c57 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_player.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/sound_player.h @@ -55,7 +55,7 @@ namespace FTDI { static void play(effect_t effect, note_t note = NOTE_C4); static bool is_sound_playing(); - void play(const sound_t* seq, play_mode_t mode = PLAY_SYNCHRONOUS); + void play(const sound_t *seq, play_mode_t mode = PLAY_SYNCHRONOUS); void play_tone(const uint16_t frequency_hz, const uint16_t duration_ms); bool has_more_notes() {return sequence != 0;}; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_ellipsis.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_ellipsis.cpp index 5fc89f1fa9..6a58dd2e49 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_ellipsis.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/text_ellipsis.cpp @@ -47,7 +47,7 @@ namespace FTDI { break; } #else - for (char* c = str; *c; c++) { + for (char *c = str; *c; c++) { lineWidth += fm.get_char_width(*c); if (lineWidth + ellipsisWidth < w) breakPoint = c; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/marlin_events.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/marlin_events.cpp index 902ede025c..d8abfcd29a 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/marlin_events.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/marlin_events.cpp @@ -71,7 +71,7 @@ namespace ExtUI { AlertDialogBox::showError(F("Unable to read media.")); } - void onStatusChanged(const char* lcd_msg) { + void onStatusChanged(const char *lcd_msg) { StatusScreen::setStatusMessage(lcd_msg); } diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_printing_dialog_box.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_printing_dialog_box.cpp index 7f81d49a27..a812f0f3d0 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_printing_dialog_box.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_printing_dialog_box.cpp @@ -34,7 +34,7 @@ using namespace Theme; #define GRID_COLS 2 #define GRID_ROWS 9 -void BioPrintingDialogBox::draw_status_message(draw_mode_t what, const char* message) { +void BioPrintingDialogBox::draw_status_message(draw_mode_t what, const char *message) { if (what & BACKGROUND) { CommandProcessor cmd; cmd.cmd(COLOR_RGB(bg_text_enabled)) @@ -113,7 +113,7 @@ void BioPrintingDialogBox::setStatusMessage(progmem_str message) { setStatusMessage(buff); } -void BioPrintingDialogBox::setStatusMessage(const char* message) { +void BioPrintingDialogBox::setStatusMessage(const char *message) { CommandProcessor cmd; cmd.cmd(CMD_DLSTART) .cmd(CLEAR_COLOR_RGB(bg_color)) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_user_request_alert_box.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_user_request_alert_box.cpp index e3892217a5..d514015058 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_user_request_alert_box.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/confirm_user_request_alert_box.cpp @@ -56,7 +56,7 @@ void ConfirmUserRequestAlertBox::onIdle() { } } -void ConfirmUserRequestAlertBox::show(const char* msg) { +void ConfirmUserRequestAlertBox::show(const char *msg) { drawMessage(msg); storeBackground(); screen_data.AlertDialogBox.isError = false; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/files_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/files_screen.cpp index c8febfd7d8..f9057ae88e 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/files_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/files_screen.cpp @@ -76,7 +76,7 @@ uint16_t FilesScreen::getFileForTag(uint8_t tag) { #define GRID_ROWS (files_per_page + header_h + footer_h) #endif -void FilesScreen::drawFileButton(const char* filename, uint8_t tag, bool is_dir, bool is_highlighted) { +void FilesScreen::drawFileButton(const char *filename, uint8_t tag, bool is_dir, bool is_highlighted) { const uint8_t line = getLineForTag(tag)+1; CommandProcessor cmd; cmd.tag(tag); diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/files_screen.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/files_screen.h index a4fb37cc14..06ae88a45a 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/files_screen.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/files_screen.h @@ -60,7 +60,7 @@ class FilesScreen : public BaseScreen, public CachedScreen -void j_move_axis(const char* command, const T axis) { +void j_move_axis(const char *command, const T axis) { const float dist = atof(command + 1) / 10.0; ExtUI::setAxisPosition_mm(ExtUI::getAxisPosition_mm(axis) + dist, axis); }; -void process_lcd_j_command(const char* command) { +void process_lcd_j_command(const char *command) { switch (command[0]) { case 'E': break; case 'A': j_move_axis(command, ExtUI::extruder_t::E0); break; @@ -241,7 +241,7 @@ void process_lcd_j_command(const char* command) { * T:-2537.4 E:0 * Note only the curly brace stuff matters. */ -void process_lcd_p_command(const char* command) { +void process_lcd_p_command(const char *command) { switch (command[0]) { case 'P': @@ -301,7 +301,7 @@ void process_lcd_p_command(const char* command) { * {FILE:fcupdate.flg} * {SYS:OK} */ -void process_lcd_s_command(const char* command) { +void process_lcd_s_command(const char *command) { switch (command[0]) { case 'I': { // temperature information @@ -348,7 +348,7 @@ void process_lcd_s_command(const char* command) { * Currently {E:0} is not handled. Its function is unknown, * but it occurs during the temp window after a sys build. */ -void process_lcd_command(const char* command) { +void process_lcd_command(const char *command) { const char *current = command; byte command_code = *current++; diff --git a/Marlin/src/lcd/lcdprint.h b/Marlin/src/lcd/lcdprint.h index 90ffa14ad1..fe856535b0 100644 --- a/Marlin/src/lcd/lcdprint.h +++ b/Marlin/src/lcd/lcdprint.h @@ -161,7 +161,7 @@ inline lcd_uint_t lcd_put_u8str_ind_P(const lcd_uint_t col, const lcd_uint_t row return lcd_put_u8str_ind_P(pstr, ind, inStr, maxlen); } -inline int lcd_put_u8str(const char* str) { return lcd_put_u8str_max(str, PIXEL_LEN_NOLIMIT); } +inline int lcd_put_u8str(const char *str) { return lcd_put_u8str_max(str, PIXEL_LEN_NOLIMIT); } inline int lcd_put_u8str(const lcd_uint_t col, const lcd_uint_t row, PGM_P const str) { lcd_moveto(col, row); return lcd_put_u8str(str); diff --git a/Marlin/src/lcd/marlinui.h b/Marlin/src/lcd/marlinui.h index f85771f562..57e6fc26e6 100644 --- a/Marlin/src/lcd/marlinui.h +++ b/Marlin/src/lcd/marlinui.h @@ -292,7 +292,7 @@ public: static bool has_status(); static void reset_status(const bool no_welcome=false); - static void set_status(const char* const message, const bool persist=false); + static void set_status(const char * const message, const bool persist=false); static void set_status_P(PGM_P const message, const int8_t level=0); static void status_printf_P(const uint8_t level, PGM_P const fmt, ...); static void set_alert_status_P(PGM_P const message); @@ -300,7 +300,7 @@ public: #else static constexpr bool has_status() { return false; } static inline void reset_status(const bool=false) {} - static void set_status(const char* message, const bool=false); + static void set_status(const char *message, const bool=false); static void set_status_P(PGM_P message, const int8_t=0); static void status_printf_P(const uint8_t, PGM_P message, ...); static inline void set_alert_status_P(PGM_P const) {} diff --git a/Marlin/src/lcd/menu/menu.h b/Marlin/src/lcd/menu/menu.h index de11ee3a5a..cbef9b50c9 100644 --- a/Marlin/src/lcd/menu/menu.h +++ b/Marlin/src/lcd/menu/menu.h @@ -172,14 +172,14 @@ class MenuEditItemBase : public MenuItemBase { public: // Implemented for HD44780 and DOGM // Draw the current item at specified row with edit data - static void draw(const bool sel, const uint8_t row, PGM_P const pstr, const char* const inStr, const bool pgm=false); + static void draw(const bool sel, const uint8_t row, PGM_P const pstr, const char * const inStr, const bool pgm=false); // Implemented for HD44780 and DOGM // This low-level method is good to draw from anywhere - static void draw_edit_screen(PGM_P const pstr, const char* const value); + static void draw_edit_screen(PGM_P const pstr, const char * const value); // This method is for the current menu item - static inline void draw_edit_screen(const char* const value) { draw_edit_screen(editLabel, value); } + static inline void draw_edit_screen(const char * const value) { draw_edit_screen(editLabel, value); } }; #if ENABLED(SDSUPPORT) diff --git a/Marlin/src/lcd/tft/ui_320x240.cpp b/Marlin/src/lcd/tft/ui_320x240.cpp index 37a44f51b4..793ee60847 100644 --- a/Marlin/src/lcd/tft/ui_320x240.cpp +++ b/Marlin/src/lcd/tft/ui_320x240.cpp @@ -326,7 +326,7 @@ void MarlinUI::draw_status_screen() { } // Low-level draw_edit_screen can be used to draw an edit screen from anyplace -void MenuEditItemBase::draw_edit_screen(PGM_P const pstr, const char* const value/*=nullptr*/) { +void MenuEditItemBase::draw_edit_screen(PGM_P const pstr, const char * const value/*=nullptr*/) { ui.encoder_direction_normal(); TERN_(TOUCH_SCREEN, touch.clear()); diff --git a/Marlin/src/lcd/tft/ui_480x320.cpp b/Marlin/src/lcd/tft/ui_480x320.cpp index 81e4603ea4..a8979d0ca6 100644 --- a/Marlin/src/lcd/tft/ui_480x320.cpp +++ b/Marlin/src/lcd/tft/ui_480x320.cpp @@ -326,7 +326,7 @@ void MarlinUI::draw_status_screen() { } // Low-level draw_edit_screen can be used to draw an edit screen from anyplace -void MenuEditItemBase::draw_edit_screen(PGM_P const pstr, const char* const value/*=nullptr*/) { +void MenuEditItemBase::draw_edit_screen(PGM_P const pstr, const char * const value/*=nullptr*/) { ui.encoder_direction_normal(); TERN_(TOUCH_SCREEN, touch.clear()); @@ -779,7 +779,7 @@ static void disable_steppers() { queue.inject_P(PSTR("M84")); } -static void drawBtn(int x, int y, const char* label, intptr_t data, MarlinImage img, uint16_t bgColor, bool enabled = true) { +static void drawBtn(int x, int y, const char *label, intptr_t data, MarlinImage img, uint16_t bgColor, bool enabled = true) { uint16_t width = Images[imgBtn52Rounded].width; uint16_t height = Images[imgBtn52Rounded].height; diff --git a/Marlin/src/lcd/tft/ui_common.cpp b/Marlin/src/lcd/tft/ui_common.cpp index 842fc3909c..7c053e7be7 100644 --- a/Marlin/src/lcd/tft/ui_common.cpp +++ b/Marlin/src/lcd/tft/ui_common.cpp @@ -131,7 +131,7 @@ void MenuItemBase::_draw(const bool sel, const uint8_t row, PGM_P const pstr, co } // Draw a menu item with a (potentially) editable value -void MenuEditItemBase::draw(const bool sel, const uint8_t row, PGM_P const pstr, const char* const data, const bool pgm) { +void MenuEditItemBase::draw(const bool sel, const uint8_t row, PGM_P const pstr, const char * const data, const bool pgm) { menu_item(row, sel); tft_string.set(pstr, itemIndex, itemString); diff --git a/Marlin/src/libs/W25Qxx.cpp b/Marlin/src/libs/W25Qxx.cpp index 0eb40a1441..fd7804cb27 100644 --- a/Marlin/src/libs/W25Qxx.cpp +++ b/Marlin/src/libs/W25Qxx.cpp @@ -106,7 +106,7 @@ uint8_t W25QXXFlash::spi_flash_read_write_byte(uint8_t data) { * * @details Uses DMA */ -void W25QXXFlash::spi_flash_Read(uint8_t* buf, uint16_t nbyte) { +void W25QXXFlash::spi_flash_Read(uint8_t *buf, uint16_t nbyte) { mySPI.dmaTransfer(0, const_cast(buf), nbyte); } @@ -127,7 +127,7 @@ void W25QXXFlash::spi_flash_Send(uint8_t b) { mySPI.transfer(b); } * * @details Use DMA */ -void W25QXXFlash::spi_flash_SendBlock(uint8_t token, const uint8_t* buf) { +void W25QXXFlash::spi_flash_SendBlock(uint8_t token, const uint8_t *buf) { mySPI.transfer(token); mySPI.dmaSend(const_cast(buf), 512); } @@ -257,7 +257,7 @@ void W25QXXFlash::SPI_FLASH_BulkErase(void) { * Output : None * Return : None *******************************************************************************/ -void W25QXXFlash::SPI_FLASH_PageWrite(uint8_t* pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite) { +void W25QXXFlash::SPI_FLASH_PageWrite(uint8_t *pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite) { // Enable the write access to the FLASH SPI_FLASH_WriteEnable(); @@ -300,7 +300,7 @@ void W25QXXFlash::SPI_FLASH_PageWrite(uint8_t* pBuffer, uint32_t WriteAddr, uint * Output : None * Return : None *******************************************************************************/ -void W25QXXFlash::SPI_FLASH_BufferWrite(uint8_t* pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite) { +void W25QXXFlash::SPI_FLASH_BufferWrite(uint8_t *pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite) { uint8_t NumOfPage = 0, NumOfSingle = 0, Addr = 0, count = 0, temp = 0; Addr = WriteAddr % SPI_FLASH_PageSize; @@ -364,7 +364,7 @@ void W25QXXFlash::SPI_FLASH_BufferWrite(uint8_t* pBuffer, uint32_t WriteAddr, ui * Output : None * Return : None *******************************************************************************/ -void W25QXXFlash::SPI_FLASH_BufferRead(uint8_t* pBuffer, uint32_t ReadAddr, uint16_t NumByteToRead) { +void W25QXXFlash::SPI_FLASH_BufferRead(uint8_t *pBuffer, uint32_t ReadAddr, uint16_t NumByteToRead) { // Select the FLASH: Chip Select low W25QXX_CS_L; diff --git a/Marlin/src/libs/W25Qxx.h b/Marlin/src/libs/W25Qxx.h index eddae6b1f2..1133af2e74 100644 --- a/Marlin/src/libs/W25Qxx.h +++ b/Marlin/src/libs/W25Qxx.h @@ -57,18 +57,18 @@ public: void init(uint8_t spiRate); static uint8_t spi_flash_Rec(); static uint8_t spi_flash_read_write_byte(uint8_t data); - static void spi_flash_Read(uint8_t* buf, uint16_t nbyte); + static void spi_flash_Read(uint8_t *buf, uint16_t nbyte); static void spi_flash_Send(uint8_t b); - static void spi_flash_SendBlock(uint8_t token, const uint8_t* buf); + static void spi_flash_SendBlock(uint8_t token, const uint8_t *buf); static uint16_t W25QXX_ReadID(void); static void SPI_FLASH_WriteEnable(void); static void SPI_FLASH_WaitForWriteEnd(void); static void SPI_FLASH_SectorErase(uint32_t SectorAddr); static void SPI_FLASH_BlockErase(uint32_t BlockAddr); static void SPI_FLASH_BulkErase(void); - static void SPI_FLASH_PageWrite(uint8_t* pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite); - static void SPI_FLASH_BufferWrite(uint8_t* pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite); - static void SPI_FLASH_BufferRead(uint8_t* pBuffer, uint32_t ReadAddr, uint16_t NumByteToRead); + static void SPI_FLASH_PageWrite(uint8_t *pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite); + static void SPI_FLASH_BufferWrite(uint8_t *pBuffer, uint32_t WriteAddr, uint16_t NumByteToWrite); + static void SPI_FLASH_BufferRead(uint8_t *pBuffer, uint32_t ReadAddr, uint16_t NumByteToRead); }; extern W25QXXFlash W25QXX; diff --git a/Marlin/src/libs/softspi.h b/Marlin/src/libs/softspi.h index 5d48f9fd8c..fb02de8653 100644 --- a/Marlin/src/libs/softspi.h +++ b/Marlin/src/libs/softspi.h @@ -715,7 +715,7 @@ class SoftSPI { FORCE_INLINE bool MODE_CPHA(uint8_t mode) { return bool(mode & 1); } FORCE_INLINE bool MODE_CPOL(uint8_t mode) { return bool(mode & 2); } - FORCE_INLINE void receiveBit(uint8_t bit, uint8_t* data) { + FORCE_INLINE void receiveBit(uint8_t bit, uint8_t *data) { if (MODE_CPHA(Mode)) fastDigitalWrite(SckPin, !MODE_CPOL(Mode)); nop; nop; @@ -734,7 +734,7 @@ class SoftSPI { if (!MODE_CPHA(Mode)) fastDigitalWrite(SckPin, MODE_CPOL(Mode)); } - FORCE_INLINE void transferBit(uint8_t bit, uint8_t* rxData, uint8_t txData) { + FORCE_INLINE void transferBit(uint8_t bit, uint8_t *rxData, uint8_t txData) { if (MODE_CPHA(Mode)) fastDigitalWrite(SckPin, !MODE_CPOL(Mode)); fastDigitalWrite(MosiPin, txData & _BV(bit)); fastDigitalWrite(SckPin, diff --git a/Marlin/src/module/planner.cpp b/Marlin/src/module/planner.cpp index b20d1e273b..832d6e316a 100644 --- a/Marlin/src/module/planner.cpp +++ b/Marlin/src/module/planner.cpp @@ -381,7 +381,7 @@ void Planner::init() { r9 = (d >> 8) & 0xFF, r10 = (d >> 16) & 0xFF, r2,r3,r4,r5,r6,r7,r11,r12,r13,r14,r15,r16,r17,r18; - const uint8_t* ptab = inv_tab; + const uint8_t *ptab = inv_tab; __asm__ __volatile__( // %8:%7:%6 = interval @@ -775,7 +775,7 @@ block_t* Planner::get_current_block() { * is not and will not use the block while we modify it, so it is safe to * alter its values. */ -void Planner::calculate_trapezoid_for_block(block_t* const block, const float &entry_factor, const float &exit_factor) { +void Planner::calculate_trapezoid_for_block(block_t * const block, const float &entry_factor, const float &exit_factor) { uint32_t initial_rate = CEIL(block->nominal_rate * entry_factor), final_rate = CEIL(block->nominal_rate * exit_factor); // (steps per second) @@ -942,7 +942,7 @@ void Planner::calculate_trapezoid_for_block(block_t* const block, const float &e */ // The kernel called by recalculate() when scanning the plan from last to first entry. -void Planner::reverse_pass_kernel(block_t* const current, const block_t * const next) { +void Planner::reverse_pass_kernel(block_t * const current, const block_t * const next) { if (current) { // If entry speed is already at the maximum entry speed, and there was no change of speed // in the next block, there is no need to recheck. Block is cruising and there is no need to @@ -1039,7 +1039,7 @@ void Planner::reverse_pass() { } // The kernel called by recalculate() when scanning the plan from first to last entry. -void Planner::forward_pass_kernel(const block_t* const previous, block_t* const current, const uint8_t block_index) { +void Planner::forward_pass_kernel(const block_t * const previous, block_t * const current, const uint8_t block_index) { if (previous) { // If the previous block is an acceleration block, too short to complete the full speed // change, adjust the entry speed accordingly. Entry speeds have already been reset, @@ -1440,7 +1440,7 @@ void Planner::check_axes_activity() { float high = 0.0; for (uint8_t b = block_buffer_tail; b != block_buffer_head; b = next_block_index(b)) { - block_t* block = &block_buffer[b]; + block_t *block = &block_buffer[b]; if (block->steps.x || block->steps.y || block->steps.z) { const float se = (float)block->steps.e / block->step_event_count * SQRT(block->nominal_speed_sqr); // mm/sec; NOLESS(high, se); diff --git a/Marlin/src/module/planner.h b/Marlin/src/module/planner.h index da9e202cdf..768bf29e2f 100644 --- a/Marlin/src/module/planner.h +++ b/Marlin/src/module/planner.h @@ -993,10 +993,10 @@ class Planner { } #endif - static void calculate_trapezoid_for_block(block_t* const block, const float &entry_factor, const float &exit_factor); + static void calculate_trapezoid_for_block(block_t * const block, const float &entry_factor, const float &exit_factor); - static void reverse_pass_kernel(block_t* const current, const block_t * const next); - static void forward_pass_kernel(const block_t * const previous, block_t* const current, uint8_t block_index); + static void reverse_pass_kernel(block_t * const current, const block_t * const next); + static void forward_pass_kernel(const block_t * const previous, block_t * const current, uint8_t block_index); static void reverse_pass(); static void forward_pass(); diff --git a/Marlin/src/module/stepper.cpp b/Marlin/src/module/stepper.cpp index 49eca7047c..8c377bf7bf 100644 --- a/Marlin/src/module/stepper.cpp +++ b/Marlin/src/module/stepper.cpp @@ -2362,7 +2362,7 @@ uint32_t Stepper::block_phase_isr() { // Check if the given block is busy or not - Must not be called from ISR contexts // The current_block could change in the middle of the read by an Stepper ISR, so // we must explicitly prevent that! -bool Stepper::is_block_busy(const block_t* const block) { +bool Stepper::is_block_busy(const block_t * const block) { #ifdef __AVR__ // A SW memory barrier, to ensure GCC does not overoptimize loops #define sw_barrier() asm volatile("": : :"memory"); @@ -2372,7 +2372,7 @@ bool Stepper::is_block_busy(const block_t* const block) { // This works because stepper ISRs happen at a slower rate than // successive reads of a variable, so 2 consecutive reads with // the same value means no interrupt updated it. - block_t* vold, *vnew = current_block; + block_t *vold, *vnew = current_block; sw_barrier(); do { vold = vnew; diff --git a/Marlin/src/module/stepper.h b/Marlin/src/module/stepper.h index 639a1b2650..ca1781fb9c 100644 --- a/Marlin/src/module/stepper.h +++ b/Marlin/src/module/stepper.h @@ -423,7 +423,7 @@ class Stepper { #endif // Check if the given block is busy or not - Must not be called from ISR contexts - static bool is_block_busy(const block_t* const block); + static bool is_block_busy(const block_t * const block); // Get the position of a stepper, in steps static int32_t position(const AxisEnum axis); @@ -529,7 +529,7 @@ class Stepper { static void _set_position(const int32_t &a, const int32_t &b, const int32_t &c, const int32_t &e); FORCE_INLINE static void _set_position(const abce_long_t &spos) { _set_position(spos.a, spos.b, spos.c, spos.e); } - FORCE_INLINE static uint32_t calc_timer_interval(uint32_t step_rate, uint8_t* loops) { + FORCE_INLINE static uint32_t calc_timer_interval(uint32_t step_rate, uint8_t *loops) { uint32_t timer; // Scale the frequency, as requested by the caller diff --git a/Marlin/src/module/stepper/trinamic.cpp b/Marlin/src/module/stepper/trinamic.cpp index c33581d132..de3d45e4b6 100644 --- a/Marlin/src/module/stepper/trinamic.cpp +++ b/Marlin/src/module/stepper/trinamic.cpp @@ -830,11 +830,11 @@ void reset_trinamic_drivers() { } constexpr bool sc_hw_done(size_t start, size_t end) { return start == end; } - constexpr bool sc_hw_skip(const char* port_name) { return !(*port_name); } - constexpr bool sc_hw_match(const char* port_name, uint32_t address, size_t start, size_t end) { + constexpr bool sc_hw_skip(const char *port_name) { return !(*port_name); } + constexpr bool sc_hw_match(const char *port_name, uint32_t address, size_t start, size_t end) { return !sc_hw_done(start, end) && !sc_hw_skip(port_name) && (address == sanity_tmc_hw_details[start].address && str_eq_ce(port_name, sanity_tmc_hw_details[start].port)); } - constexpr int count_tmc_hw_serial_matches(const char* port_name, uint32_t address, size_t start, size_t end) { + constexpr int count_tmc_hw_serial_matches(const char *port_name, uint32_t address, size_t start, size_t end) { return sc_hw_done(start, end) ? 0 : ((sc_hw_skip(port_name) ? 0 : (sc_hw_match(port_name, address, start, end) ? 1 : 0)) + count_tmc_hw_serial_matches(port_name, address, start + 1, end)); } diff --git a/Marlin/src/sd/Sd2Card.cpp b/Marlin/src/sd/Sd2Card.cpp index 491c0692c7..b914b29635 100644 --- a/Marlin/src/sd/Sd2Card.cpp +++ b/Marlin/src/sd/Sd2Card.cpp @@ -63,7 +63,7 @@ 0x0E,0x07,0x1C,0x15,0x2A,0x23,0x38,0x31,0x46,0x4F,0x54,0x5D,0x62,0x6B,0x70,0x79 }; - static uint8_t CRC7(const uint8_t* data, uint8_t n) { + static uint8_t CRC7(const uint8_t *data, uint8_t n) { uint8_t crc = 0; while (n > 0) { crc = pgm_read_byte(&crctab7[ (crc << 1) ^ *data++ ]); @@ -72,7 +72,7 @@ return (crc << 1) | 1; } #else - static uint8_t CRC7(const uint8_t* data, uint8_t n) { + static uint8_t CRC7(const uint8_t *data, uint8_t n) { uint8_t crc = 0; LOOP_L_N(i, n) { uint8_t d = data[i]; @@ -338,7 +338,7 @@ bool Sd2Card::init(const uint8_t sckRateID, const pin_t chipSelectPin) { * \param[out] dst Pointer to the location that will receive the data. * \return true for success, false for failure. */ -bool Sd2Card::readBlock(uint32_t blockNumber, uint8_t* dst) { +bool Sd2Card::readBlock(uint32_t blockNumber, uint8_t *dst) { #if IS_TEENSY_35_36 || IS_TEENSY_40_41 return 0 == SDHC_CardReadBlock(dst, blockNumber); #endif @@ -378,7 +378,7 @@ bool Sd2Card::readBlock(uint32_t blockNumber, uint8_t* dst) { * * \return true for success, false for failure. */ -bool Sd2Card::readData(uint8_t* dst) { +bool Sd2Card::readData(uint8_t *dst) { chipSelect(); return readData(dst, 512); } @@ -421,7 +421,7 @@ bool Sd2Card::readData(uint8_t* dst) { }; // faster CRC-CCITT // uses the x^16,x^12,x^5,x^1 polynomial. - static uint16_t CRC_CCITT(const uint8_t* data, size_t n) { + static uint16_t CRC_CCITT(const uint8_t *data, size_t n) { uint16_t crc = 0; for (size_t i = 0; i < n; i++) { crc = pgm_read_word(&crctab16[(crc >> 8 ^ data[i]) & 0xFF]) ^ (crc << 8); @@ -431,7 +431,7 @@ bool Sd2Card::readData(uint8_t* dst) { #else // slower CRC-CCITT // uses the x^16,x^12,x^5,x^1 polynomial. - static uint16_t CRC_CCITT(const uint8_t* data, size_t n) { + static uint16_t CRC_CCITT(const uint8_t *data, size_t n) { uint16_t crc = 0; for (size_t i = 0; i < n; i++) { crc = (uint8_t)(crc >> 8) | (crc << 8); @@ -445,7 +445,7 @@ bool Sd2Card::readData(uint8_t* dst) { #endif #endif // SD_CHECK_AND_RETRY -bool Sd2Card::readData(uint8_t* dst, const uint16_t count) { +bool Sd2Card::readData(uint8_t *dst, const uint16_t count) { bool success = false; const millis_t read_timeout = millis() + SD_READ_TIMEOUT; @@ -478,7 +478,7 @@ bool Sd2Card::readData(uint8_t* dst, const uint16_t count) { /** read CID or CSR register */ bool Sd2Card::readRegister(const uint8_t cmd, void* buf) { - uint8_t* dst = reinterpret_cast(buf); + uint8_t *dst = reinterpret_cast(buf); if (cardCommand(cmd, 0)) { error(SD_CARD_ERROR_READ_REG); chipDeselect(); @@ -555,7 +555,7 @@ bool Sd2Card::waitNotBusy(const millis_t timeout_ms) { * \param[in] src Pointer to the location of the data to be written. * \return true for success, false for failure. */ -bool Sd2Card::writeBlock(uint32_t blockNumber, const uint8_t* src) { +bool Sd2Card::writeBlock(uint32_t blockNumber, const uint8_t *src) { if (ENABLED(SDCARD_READONLY)) return false; #if IS_TEENSY_35_36 || IS_TEENSY_40_41 @@ -586,7 +586,7 @@ bool Sd2Card::writeBlock(uint32_t blockNumber, const uint8_t* src) { * \param[in] src Pointer to the location of the data to be written. * \return true for success, false for failure. */ -bool Sd2Card::writeData(const uint8_t* src) { +bool Sd2Card::writeData(const uint8_t *src) { if (ENABLED(SDCARD_READONLY)) return false; bool success = true; @@ -601,7 +601,7 @@ bool Sd2Card::writeData(const uint8_t* src) { } // Send one block of data for write block or write multiple blocks -bool Sd2Card::writeData(const uint8_t token, const uint8_t* src) { +bool Sd2Card::writeData(const uint8_t token, const uint8_t *src) { if (ENABLED(SDCARD_READONLY)) return false; const uint16_t crc = TERN(SD_CHECK_AND_RETRY, CRC_CCITT(src, 512), 0xFFFF); diff --git a/Marlin/src/sd/Sd2Card.h b/Marlin/src/sd/Sd2Card.h index 6900502e03..d82cb10a1e 100644 --- a/Marlin/src/sd/Sd2Card.h +++ b/Marlin/src/sd/Sd2Card.h @@ -124,7 +124,7 @@ public: */ bool init(const uint8_t sckRateID, const pin_t chipSelectPin); - bool readBlock(uint32_t block, uint8_t* dst); + bool readBlock(uint32_t block, uint8_t *dst); /** * Read a card's CID register. The CID contains card identification @@ -135,7 +135,7 @@ public: * * \return true for success or false for failure. */ - bool readCID(cid_t* cid) { return readRegister(CMD10, cid); } + bool readCID(cid_t *cid) { return readRegister(CMD10, cid); } /** * Read a card's CSD register. The CSD contains Card-Specific Data that @@ -145,9 +145,9 @@ public: * * \return true for success or false for failure. */ - inline bool readCSD(csd_t* csd) { return readRegister(CMD9, csd); } + inline bool readCSD(csd_t *csd) { return readRegister(CMD9, csd); } - bool readData(uint8_t* dst); + bool readData(uint8_t *dst); bool readStart(uint32_t blockNumber); bool readStop(); bool setSckRate(const uint8_t sckRateID); @@ -157,8 +157,8 @@ public: * \return 0 - SD V1, 1 - SD V2, or 3 - SDHC. */ int type() const {return type_;} - bool writeBlock(uint32_t blockNumber, const uint8_t* src); - bool writeData(const uint8_t* src); + bool writeBlock(uint32_t blockNumber, const uint8_t *src); + bool writeData(const uint8_t *src); bool writeStart(uint32_t blockNumber, const uint32_t eraseCount); bool writeStop(); @@ -176,11 +176,11 @@ private: } uint8_t cardCommand(const uint8_t cmd, const uint32_t arg); - bool readData(uint8_t* dst, const uint16_t count); + bool readData(uint8_t *dst, const uint16_t count); bool readRegister(const uint8_t cmd, void* buf); void chipDeselect(); void chipSelect(); inline void type(const uint8_t value) { type_ = value; } bool waitNotBusy(const millis_t timeout_ms); - bool writeData(const uint8_t token, const uint8_t* src); + bool writeData(const uint8_t token, const uint8_t *src); }; diff --git a/Marlin/src/sd/SdBaseFile.cpp b/Marlin/src/sd/SdBaseFile.cpp index 3cd88318ff..120668baa8 100644 --- a/Marlin/src/sd/SdBaseFile.cpp +++ b/Marlin/src/sd/SdBaseFile.cpp @@ -43,7 +43,7 @@ SdBaseFile* SdBaseFile::cwd_ = 0; // Pointer to Current Working Directory // callback function for date/time -void (*SdBaseFile::dateTime_)(uint16_t* date, uint16_t* time) = 0; +void (*SdBaseFile::dateTime_)(uint16_t *date, uint16_t *time) = 0; // add a cluster to a file bool SdBaseFile::addCluster() { @@ -118,7 +118,7 @@ bool SdBaseFile::close() { * Reasons for failure include file is not contiguous, file has zero length * or an I/O error occurred. */ -bool SdBaseFile::contiguousRange(uint32_t* bgnBlock, uint32_t* endBlock) { +bool SdBaseFile::contiguousRange(uint32_t *bgnBlock, uint32_t *endBlock) { // error if no blocks if (firstCluster_ == 0) return false; @@ -155,7 +155,7 @@ bool SdBaseFile::contiguousRange(uint32_t* bgnBlock, uint32_t* endBlock) { * a file is already open, the file already exists, the root * directory is full or an I/O error. */ -bool SdBaseFile::createContiguous(SdBaseFile* dirFile, const char* path, uint32_t size) { +bool SdBaseFile::createContiguous(SdBaseFile* dirFile, const char *path, uint32_t size) { if (ENABLED(SDCARD_READONLY)) return false; uint32_t count; @@ -186,8 +186,8 @@ bool SdBaseFile::createContiguous(SdBaseFile* dirFile, const char* path, uint32_ * * \return true for success, false for failure. */ -bool SdBaseFile::dirEntry(dir_t* dir) { - dir_t* p; +bool SdBaseFile::dirEntry(dir_t *dir) { + dir_t *p; // make sure fields on SD are correct if (!sync()) return false; @@ -207,7 +207,7 @@ bool SdBaseFile::dirEntry(dir_t* dir) { * \param[in] dir The directory structure containing the name. * \param[out] name A 13 byte char array for the formatted name. */ -void SdBaseFile::dirName(const dir_t& dir, char* name) { +void SdBaseFile::dirName(const dir_t& dir, char *name) { uint8_t j = 0; LOOP_L_N(i, 11) { if (dir.name[i] == ' ')continue; @@ -229,7 +229,7 @@ void SdBaseFile::dirName(const dir_t& dir, char* name) { * * \return true if the file exists else false. */ -bool SdBaseFile::exists(const char* name) { +bool SdBaseFile::exists(const char *name) { SdBaseFile file; return file.open(this, name, O_READ); } @@ -254,7 +254,7 @@ bool SdBaseFile::exists(const char* name) { * \return For success fgets() returns the length of the string in \a str. * If no data is read, fgets() returns zero for EOF or -1 if an error occurred. **/ -int16_t SdBaseFile::fgets(char* str, int16_t num, char* delim) { +int16_t SdBaseFile::fgets(char *str, int16_t num, char *delim) { char ch; int16_t n = 0; int16_t r = -1; @@ -293,7 +293,7 @@ bool SdBaseFile::getDosName(char * const name) { return true; } // cache entry - dir_t* p = cacheDirEntry(SdVolume::CACHE_FOR_READ); + dir_t *p = cacheDirEntry(SdVolume::CACHE_FOR_READ); if (!p) return false; // format name @@ -301,7 +301,7 @@ bool SdBaseFile::getDosName(char * const name) { return true; } -void SdBaseFile::getpos(filepos_t* pos) { +void SdBaseFile::getpos(filepos_t *pos) { pos->position = curPosition_; pos->cluster = curCluster_; } @@ -386,7 +386,7 @@ int8_t SdBaseFile::lsPrintNext(uint8_t flags, uint8_t indent) { } // Format directory name field from a 8.3 name string -bool SdBaseFile::make83Name(const char* str, uint8_t* name, const char** ptr) { +bool SdBaseFile::make83Name(const char *str, uint8_t *name, const char** ptr) { uint8_t n = 7, // Max index until a dot is found i = 11; while (i) name[--i] = ' '; // Set whole FILENAME.EXT to spaces @@ -423,7 +423,7 @@ bool SdBaseFile::make83Name(const char* str, uint8_t* name, const char** ptr) { * Reasons for failure include this file is already open, \a parent is not a * directory, \a path is invalid or already exists in \a parent. */ -bool SdBaseFile::mkdir(SdBaseFile* parent, const char* path, bool pFlag) { +bool SdBaseFile::mkdir(SdBaseFile* parent, const char *path, bool pFlag) { if (ENABLED(SDCARD_READONLY)) return false; uint8_t dname[11]; @@ -460,7 +460,7 @@ bool SdBaseFile::mkdir(SdBaseFile* parent, const uint8_t dname[11]) { uint32_t block; dir_t d; - dir_t* p; + dir_t *p; if (!parent->isDir()) return false; @@ -523,7 +523,7 @@ bool SdBaseFile::mkdir(SdBaseFile* parent, const uint8_t dname[11]) { * * \return true for success, false for failure. */ -bool SdBaseFile::open(const char* path, uint8_t oflag) { +bool SdBaseFile::open(const char *path, uint8_t oflag) { return open(cwd_, path, oflag); } @@ -577,7 +577,7 @@ bool SdBaseFile::open(const char* path, uint8_t oflag) { * a directory, \a path is invalid, the file does not exist * or can't be opened in the access mode specified by oflag. */ -bool SdBaseFile::open(SdBaseFile* dirFile, const char* path, uint8_t oflag) { +bool SdBaseFile::open(SdBaseFile* dirFile, const char *path, uint8_t oflag) { uint8_t dname[11]; SdBaseFile dir1, dir2; SdBaseFile *parent = dirFile, *sub = &dir1; @@ -608,7 +608,7 @@ bool SdBaseFile::open(SdBaseFile* dirFile, const char* path, uint8_t oflag) { bool SdBaseFile::open(SdBaseFile* dirFile, const uint8_t dname[11], uint8_t oflag) { bool emptyFound = false, fileFound = false; uint8_t index; - dir_t* p; + dir_t *p; vol_ = dirFile->vol_; @@ -697,7 +697,7 @@ bool SdBaseFile::open(SdBaseFile* dirFile, const uint8_t dname[11], uint8_t ofla * \return true for success or false for failure. */ bool SdBaseFile::open(SdBaseFile* dirFile, uint16_t index, uint8_t oflag) { - dir_t* p; + dir_t *p; vol_ = dirFile->vol_; @@ -725,7 +725,7 @@ bool SdBaseFile::open(SdBaseFile* dirFile, uint16_t index, uint8_t oflag) { // open a cached directory entry. Assumes vol_ is initialized bool SdBaseFile::openCachedEntry(uint8_t dirIndex, uint8_t oflag) { - dir_t* p; + dir_t *p; #if ENABLED(SDCARD_READONLY) if (oflag & (O_WRITE | O_CREAT | O_TRUNC)) goto FAIL; @@ -785,7 +785,7 @@ bool SdBaseFile::openCachedEntry(uint8_t dirIndex, uint8_t oflag) { * \return true for success or false for failure. */ bool SdBaseFile::openNext(SdBaseFile* dirFile, uint8_t oflag) { - dir_t* p; + dir_t *p; uint8_t index; if (!dirFile) return false; @@ -827,7 +827,7 @@ bool SdBaseFile::openNext(SdBaseFile* dirFile, uint8_t oflag) { */ bool SdBaseFile::openParent(SdBaseFile* dir) { dir_t entry; - dir_t* p; + dir_t *p; SdBaseFile file; uint32_t c; uint32_t cluster; @@ -1009,7 +1009,7 @@ int16_t SdBaseFile::read() { * or an I/O error occurred. */ int16_t SdBaseFile::read(void* buf, uint16_t nbyte) { - uint8_t* dst = reinterpret_cast(buf); + uint8_t *dst = reinterpret_cast(buf); uint16_t offset, toRead; uint32_t block; // raw device block number @@ -1049,7 +1049,7 @@ int16_t SdBaseFile::read(void* buf, uint16_t nbyte) { else { // read block to cache and copy data to caller if (!vol_->cacheRawBlock(block, SdVolume::CACHE_FOR_READ)) return -1; - uint8_t* src = vol_->cache()->data + offset; + uint8_t *src = vol_->cache()->data + offset; memcpy(dst, src, n); } dst += n; @@ -1070,7 +1070,7 @@ int16_t SdBaseFile::read(void* buf, uint16_t nbyte) { * readDir() called before a directory has been opened, this is not * a directory file or an I/O error occurred. */ -int8_t SdBaseFile::readDir(dir_t* dir, char* longFilename) { +int8_t SdBaseFile::readDir(dir_t *dir, char *longFilename) { int16_t n; // if not a directory file or miss-positioned return an error if (!isDir() || (0x1F & curPosition_)) return -1; @@ -1096,7 +1096,7 @@ int8_t SdBaseFile::readDir(dir_t* dir, char* longFilename) { // Fill the long filename if we have a long filename entry. // Long filename entries are stored before the short filename. if (longFilename && DIR_IS_LONG_NAME(dir)) { - vfat_t* VFAT = (vfat_t*)dir; + vfat_t *VFAT = (vfat_t*)dir; // Sanity-check the VFAT entry. The first cluster is always set to zero. And the sequence number should be higher than 0 if (VFAT->firstClusterLow == 0) { const uint8_t seq = VFAT->sequenceNumber & 0x1F; @@ -1199,7 +1199,7 @@ dir_t* SdBaseFile::readDirCache() { bool SdBaseFile::remove() { if (ENABLED(SDCARD_READONLY)) return false; - dir_t* d; + dir_t *d; // free any clusters - will fail if read-only or directory if (!truncate(0)) return false; @@ -1235,7 +1235,7 @@ bool SdBaseFile::remove() { * \a dirFile is not a directory, \a path is not found * or an I/O error occurred. */ -bool SdBaseFile::remove(SdBaseFile* dirFile, const char* path) { +bool SdBaseFile::remove(SdBaseFile* dirFile, const char *path) { if (ENABLED(SDCARD_READONLY)) return false; SdBaseFile file; @@ -1252,13 +1252,13 @@ bool SdBaseFile::remove(SdBaseFile* dirFile, const char* path) { * Reasons for failure include \a dirFile is not open or is not a directory * file, newPath is invalid or already exists, or an I/O error occurs. */ -bool SdBaseFile::rename(SdBaseFile* dirFile, const char* newPath) { +bool SdBaseFile::rename(SdBaseFile* dirFile, const char *newPath) { if (ENABLED(SDCARD_READONLY)) return false; dir_t entry; uint32_t dirCluster = 0; SdBaseFile file; - dir_t* d; + dir_t *d; // must be an open file or subdirectory if (!(isFile() || isSubDir())) return false; @@ -1356,7 +1356,7 @@ bool SdBaseFile::rmdir() { // make sure directory is empty while (curPosition_ < fileSize_) { - dir_t* p = readDirCache(); + dir_t *p = readDirCache(); if (!p) return false; // done if past last used entry if (p->name[0] == DIR_NAME_FREE) break; @@ -1396,7 +1396,7 @@ bool SdBaseFile::rmRfStar() { // remember position index = curPosition_ / 32; - dir_t* p = readDirCache(); + dir_t *p = readDirCache(); if (!p) return false; // done if past last entry @@ -1438,7 +1438,7 @@ bool SdBaseFile::rmRfStar() { * \param[in] oflag Values for \a oflag are constructed by a bitwise-inclusive * OR of open flags. see SdBaseFile::open(SdBaseFile*, const char*, uint8_t). */ -SdBaseFile::SdBaseFile(const char* path, uint8_t oflag) { +SdBaseFile::SdBaseFile(const char *path, uint8_t oflag) { type_ = FAT_FILE_TYPE_CLOSED; writeError = false; open(path, oflag); @@ -1481,7 +1481,7 @@ bool SdBaseFile::seekSet(const uint32_t pos) { return true; } -void SdBaseFile::setpos(filepos_t* pos) { +void SdBaseFile::setpos(filepos_t *pos) { curPosition_ = pos->position; curCluster_ = pos->cluster; } @@ -1499,7 +1499,7 @@ bool SdBaseFile::sync() { if (ENABLED(SDCARD_READONLY) || !isOpen()) goto FAIL; if (flags_ & F_FILE_DIR_DIRTY) { - dir_t* d = cacheDirEntry(SdVolume::CACHE_FOR_WRITE); + dir_t *d = cacheDirEntry(SdVolume::CACHE_FOR_WRITE); // check for deleted by another open file object if (!d || d->name[0] == DIR_NAME_DELETED) goto FAIL; @@ -1537,7 +1537,7 @@ bool SdBaseFile::sync() { * \return true for success, false for failure. */ bool SdBaseFile::timestamp(SdBaseFile* file) { - dir_t* d; + dir_t *d; dir_t dir; // get timestamps @@ -1599,7 +1599,7 @@ bool SdBaseFile::timestamp(uint8_t flags, uint16_t year, uint8_t month, if (ENABLED(SDCARD_READONLY)) return false; uint16_t dirDate, dirTime; - dir_t* d; + dir_t *d; if (!isOpen() || year < 1980 @@ -1716,7 +1716,7 @@ int16_t SdBaseFile::write(const void* buf, uint16_t nbyte) { #endif // convert void* to uint8_t* - must be before goto statements - const uint8_t* src = reinterpret_cast(buf); + const uint8_t *src = reinterpret_cast(buf); // number of bytes left to write - must be before goto statements uint16_t nToWrite = nbyte; @@ -1782,7 +1782,7 @@ int16_t SdBaseFile::write(const void* buf, uint16_t nbyte) { // rewrite part of block if (!vol_->cacheRawBlock(block, SdVolume::CACHE_FOR_WRITE)) goto FAIL; } - uint8_t* dst = vol_->cache()->data + blockOffset; + uint8_t *dst = vol_->cache()->data + blockOffset; memcpy(dst, src, n); } curPosition_ += n; diff --git a/Marlin/src/sd/SdBaseFile.h b/Marlin/src/sd/SdBaseFile.h index 2f7dfb9f3b..1e2bc5d09e 100644 --- a/Marlin/src/sd/SdBaseFile.h +++ b/Marlin/src/sd/SdBaseFile.h @@ -163,7 +163,7 @@ uint16_t const FAT_DEFAULT_TIME = (1 << 11); class SdBaseFile { public: SdBaseFile() : writeError(false), type_(FAT_FILE_TYPE_CLOSED) {} - SdBaseFile(const char* path, uint8_t oflag); + SdBaseFile(const char *path, uint8_t oflag); ~SdBaseFile() { if (isOpen()) close(); } /** @@ -179,18 +179,18 @@ class SdBaseFile { * get position for streams * \param[out] pos struct to receive position */ - void getpos(filepos_t* pos); + void getpos(filepos_t *pos); /** * set position for streams * \param[out] pos struct with value for new position */ - void setpos(filepos_t* pos); + void setpos(filepos_t *pos); bool close(); - bool contiguousRange(uint32_t* bgnBlock, uint32_t* endBlock); + bool contiguousRange(uint32_t *bgnBlock, uint32_t *endBlock); bool createContiguous(SdBaseFile* dirFile, - const char* path, uint32_t size); + const char *path, uint32_t size); /** * \return The current cluster number for a file or directory. */ @@ -213,7 +213,7 @@ class SdBaseFile { * function is of the form: * * \code - * void dateTime(uint16_t* date, uint16_t* time) { + * void dateTime(uint16_t *date, uint16_t *time) { * uint16_t year; * uint8_t month, day, hour, minute, second; * @@ -235,7 +235,7 @@ class SdBaseFile { * See the timestamp() function. */ static void dateTimeCallback( - void (*dateTime)(uint16_t* date, uint16_t* time)) { + void (*dateTime)(uint16_t *date, uint16_t *time)) { dateTime_ = dateTime; } @@ -243,10 +243,10 @@ class SdBaseFile { * Cancel the date/time callback function. */ static void dateTimeCallbackCancel() { dateTime_ = 0; } - bool dirEntry(dir_t* dir); - static void dirName(const dir_t& dir, char* name); - bool exists(const char* name); - int16_t fgets(char* str, int16_t num, char* delim = 0); + bool dirEntry(dir_t *dir); + static void dirName(const dir_t& dir, char *name); + bool exists(const char *name); + int16_t fgets(char *str, int16_t num, char *delim = 0); /** * \return The total number of bytes in a file or directory. @@ -286,10 +286,10 @@ class SdBaseFile { bool getDosName(char * const name); void ls(uint8_t flags = 0, uint8_t indent = 0); - bool mkdir(SdBaseFile* dir, const char* path, bool pFlag = true); + bool mkdir(SdBaseFile* dir, const char *path, bool pFlag = true); bool open(SdBaseFile* dirFile, uint16_t index, uint8_t oflag); - bool open(SdBaseFile* dirFile, const char* path, uint8_t oflag); - bool open(const char* path, uint8_t oflag = O_READ); + bool open(SdBaseFile* dirFile, const char *path, uint8_t oflag); + bool open(const char *path, uint8_t oflag = O_READ); bool openNext(SdBaseFile* dirFile, uint8_t oflag); bool openRoot(SdVolume* vol); int peek(); @@ -298,15 +298,15 @@ class SdBaseFile { bool printName(); int16_t read(); int16_t read(void* buf, uint16_t nbyte); - int8_t readDir(dir_t* dir, char* longFilename); - static bool remove(SdBaseFile* dirFile, const char* path); + int8_t readDir(dir_t *dir, char *longFilename); + static bool remove(SdBaseFile* dirFile, const char *path); bool remove(); /** * Set the file's current position to zero. */ void rewind() { seekSet(0); } - bool rename(SdBaseFile* dirFile, const char* newPath); + bool rename(SdBaseFile* dirFile, const char *newPath); bool rmdir(); bool rmRfStar(); @@ -348,7 +348,7 @@ class SdBaseFile { static SdBaseFile* cwd_; // global pointer to cwd dir // data time callback function - static void (*dateTime_)(uint16_t* date, uint16_t* time); + static void (*dateTime_)(uint16_t *date, uint16_t *time); // bits defined in flags_ static uint8_t const F_OFLAG = (O_ACCMODE | O_APPEND | O_SYNC), // should be 0x0F @@ -376,7 +376,7 @@ class SdBaseFile { bool addDirCluster(); dir_t* cacheDirEntry(uint8_t action); int8_t lsPrintNext(uint8_t flags, uint8_t indent); - static bool make83Name(const char* str, uint8_t* name, const char** ptr); + static bool make83Name(const char *str, uint8_t *name, const char** ptr); bool mkdir(SdBaseFile* parent, const uint8_t dname[11]); bool open(SdBaseFile* dirFile, const uint8_t dname[11], uint8_t oflag); bool openCachedEntry(uint8_t cacheIndex, uint8_t oflags); diff --git a/Marlin/src/sd/SdFatStructs.h b/Marlin/src/sd/SdFatStructs.h index ac81f1d64e..03bbc1c194 100644 --- a/Marlin/src/sd/SdFatStructs.h +++ b/Marlin/src/sd/SdFatStructs.h @@ -571,7 +571,7 @@ uint8_t const DIR_NAME_0xE5 = 0x05, // escape for name[0] = 0xE5 * * \return true if the entry is for part of a long name else false. */ -static inline uint8_t DIR_IS_LONG_NAME(const dir_t* dir) { +static inline uint8_t DIR_IS_LONG_NAME(const dir_t *dir) { return (dir->attributes & DIR_ATT_LONG_NAME_MASK) == DIR_ATT_LONG_NAME; } @@ -584,7 +584,7 @@ uint8_t const DIR_ATT_FILE_TYPE_MASK = (DIR_ATT_VOLUME_ID | DIR_ATT_DIRECTORY); * * \return true if the entry is for a normal file else false. */ -static inline uint8_t DIR_IS_FILE(const dir_t* dir) { +static inline uint8_t DIR_IS_FILE(const dir_t *dir) { return (dir->attributes & DIR_ATT_FILE_TYPE_MASK) == 0; } @@ -594,7 +594,7 @@ static inline uint8_t DIR_IS_FILE(const dir_t* dir) { * * \return true if the entry is for a subdirectory else false. */ -static inline uint8_t DIR_IS_SUBDIR(const dir_t* dir) { +static inline uint8_t DIR_IS_SUBDIR(const dir_t *dir) { return (dir->attributes & DIR_ATT_FILE_TYPE_MASK) == DIR_ATT_DIRECTORY; } @@ -604,6 +604,6 @@ static inline uint8_t DIR_IS_SUBDIR(const dir_t* dir) { * * \return true if the entry is for a normal file or subdirectory else false. */ -static inline uint8_t DIR_IS_FILE_OR_SUBDIR(const dir_t* dir) { +static inline uint8_t DIR_IS_FILE_OR_SUBDIR(const dir_t *dir) { return (dir->attributes & DIR_ATT_VOLUME_ID) == 0; } diff --git a/Marlin/src/sd/SdFile.cpp b/Marlin/src/sd/SdFile.cpp index cba67e2bba..cc86ce819f 100644 --- a/Marlin/src/sd/SdFile.cpp +++ b/Marlin/src/sd/SdFile.cpp @@ -43,7 +43,7 @@ * \param[in] oflag Values for \a oflag are constructed by a bitwise-inclusive * OR of open flags. see SdBaseFile::open(SdBaseFile*, const char*, uint8_t). */ -SdFile::SdFile(const char* path, uint8_t oflag) : SdBaseFile(path, oflag) { } +SdFile::SdFile(const char *path, uint8_t oflag) : SdBaseFile(path, oflag) { } /** * Write data to an open file. @@ -78,7 +78,7 @@ int16_t SdFile::write(const void* buf, uint16_t nbyte) { return SdBaseFile::writ * \param[in] str Pointer to the string. * Use writeError to check for errors. */ -void SdFile::write(const char* str) { SdBaseFile::write(str, strlen(str)); } +void SdFile::write(const char *str) { SdBaseFile::write(str, strlen(str)); } /** * Write a PROGMEM string to a file. diff --git a/Marlin/src/sd/SdFile.h b/Marlin/src/sd/SdFile.h index 17256b47c8..69fe05b499 100644 --- a/Marlin/src/sd/SdFile.h +++ b/Marlin/src/sd/SdFile.h @@ -42,7 +42,7 @@ class SdFile : public SdBaseFile { public: SdFile() {} - SdFile(const char* name, uint8_t oflag); + SdFile(const char *name, uint8_t oflag); #if ARDUINO >= 100 size_t write(uint8_t b); #else @@ -50,7 +50,7 @@ class SdFile : public SdBaseFile { #endif int16_t write(const void* buf, uint16_t nbyte); - void write(const char* str); + void write(const char *str); void write_P(PGM_P str); void writeln_P(PGM_P str); }; diff --git a/Marlin/src/sd/SdVolume.cpp b/Marlin/src/sd/SdVolume.cpp index e262c8867a..7fcebd640d 100644 --- a/Marlin/src/sd/SdVolume.cpp +++ b/Marlin/src/sd/SdVolume.cpp @@ -47,7 +47,7 @@ #endif // USE_MULTIPLE_CARDS // find a contiguous group of clusters -bool SdVolume::allocContiguous(uint32_t count, uint32_t* curCluster) { +bool SdVolume::allocContiguous(uint32_t count, uint32_t *curCluster) { if (ENABLED(SDCARD_READONLY)) return false; // start of group @@ -149,7 +149,7 @@ bool SdVolume::cacheRawBlock(uint32_t blockNumber, bool dirty) { } // return the size in bytes of a cluster chain -bool SdVolume::chainSize(uint32_t cluster, uint32_t* size) { +bool SdVolume::chainSize(uint32_t cluster, uint32_t *size) { uint32_t s = 0; do { if (!fatGet(cluster, &cluster)) return false; @@ -160,7 +160,7 @@ bool SdVolume::chainSize(uint32_t cluster, uint32_t* size) { } // Fetch a FAT entry -bool SdVolume::fatGet(uint32_t cluster, uint32_t* value) { +bool SdVolume::fatGet(uint32_t cluster, uint32_t *value) { uint32_t lba; if (cluster > (clusterCount_ + 1)) return false; if (FAT12_SUPPORT && fatType_ == 12) { @@ -328,7 +328,7 @@ int32_t SdVolume::freeClusterCount() { */ bool SdVolume::init(Sd2Card* dev, uint8_t part) { uint32_t totalBlocks, volumeStartBlock = 0; - fat32_boot_t* fbs; + fat32_boot_t *fbs; sdCard_ = dev; fatType_ = 0; @@ -342,7 +342,7 @@ bool SdVolume::init(Sd2Card* dev, uint8_t part) { if (part) { if (part > 4) return false; if (!cacheRawBlock(volumeStartBlock, CACHE_FOR_READ)) return false; - part_t* p = &cacheBuffer_.mbr.part[part - 1]; + part_t *p = &cacheBuffer_.mbr.part[part - 1]; if ((p->boot & 0x7F) != 0 || p->totalSectors < 100 || p->firstSector == 0) return false; // not a valid partition volumeStartBlock = p->firstSector; diff --git a/Marlin/src/sd/SdVolume.h b/Marlin/src/sd/SdVolume.h index 2d57c681c4..8122087451 100644 --- a/Marlin/src/sd/SdVolume.h +++ b/Marlin/src/sd/SdVolume.h @@ -124,7 +124,7 @@ class SdVolume { * \param[out] v value of entry * \return true for success or false for failure */ - bool dbgFat(uint32_t n, uint32_t* v) { return fatGet(n, v); } + bool dbgFat(uint32_t n, uint32_t *v) { return fatGet(n, v); } private: // Allow SdBaseFile access to SdVolume private data. @@ -161,7 +161,7 @@ class SdVolume { uint16_t rootDirEntryCount_; // number of entries in FAT16 root dir uint32_t rootDirStart_; // root start block for FAT16, cluster for FAT32 - bool allocContiguous(uint32_t count, uint32_t* curCluster); + bool allocContiguous(uint32_t count, uint32_t *curCluster); uint8_t blockOfCluster(uint32_t position) const { return (position >> 9) & (blocksPerCluster_ - 1); } uint32_t clusterStartBlock(uint32_t cluster) const { return dataStartBlock_ + ((cluster - 2) << clusterSizeShift_); } uint32_t blockNumber(uint32_t cluster, uint32_t position) const { return clusterStartBlock(cluster) + blockOfCluster(position); } @@ -183,8 +183,8 @@ class SdVolume { cacheBlockNumber_ = blockNumber; } void cacheSetDirty() { cacheDirty_ |= CACHE_FOR_WRITE; } - bool chainSize(uint32_t beginCluster, uint32_t* size); - bool fatGet(uint32_t cluster, uint32_t* value); + bool chainSize(uint32_t beginCluster, uint32_t *size); + bool fatGet(uint32_t cluster, uint32_t *value); bool fatPut(uint32_t cluster, uint32_t value); bool fatPutEOC(uint32_t cluster) { return fatPut(cluster, 0x0FFFFFFF); } bool freeChain(uint32_t cluster); @@ -193,6 +193,6 @@ class SdVolume { if (fatType_ == 16) return cluster >= FAT16EOC_MIN; return cluster >= FAT32EOC_MIN; } - bool readBlock(uint32_t block, uint8_t* dst) { return sdCard_->readBlock(block, dst); } - bool writeBlock(uint32_t block, const uint8_t* dst) { return sdCard_->writeBlock(block, dst); } + bool readBlock(uint32_t block, uint8_t *dst) { return sdCard_->readBlock(block, dst); } + bool writeBlock(uint32_t block, const uint8_t *dst) { return sdCard_->writeBlock(block, dst); } }; diff --git a/Marlin/src/sd/cardreader.h b/Marlin/src/sd/cardreader.h index 4399d9a4b6..1f917f8576 100644 --- a/Marlin/src/sd/cardreader.h +++ b/Marlin/src/sd/cardreader.h @@ -122,7 +122,7 @@ public: // Select a file static void selectFileByIndex(const uint16_t nr); - static void selectFileByName(const char* const match); + static void selectFileByName(const char * const match); // Print job static void openAndPrintFile(const char *name); // (working directory) diff --git a/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.cpp b/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.cpp index 6dc7063122..dc9efcb672 100644 --- a/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.cpp +++ b/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.cpp @@ -295,7 +295,7 @@ uint32_t Sd2Card::cardSize() { return lun0_capacity; } -bool Sd2Card::readBlock(uint32_t block, uint8_t* dst) { +bool Sd2Card::readBlock(uint32_t block, uint8_t *dst) { if (!isInserted()) return false; #if USB_DEBUG >= 3 if (block >= lun0_capacity) { @@ -309,7 +309,7 @@ bool Sd2Card::readBlock(uint32_t block, uint8_t* dst) { return bulk.Read(0, block, 512, 1, dst) == 0; } -bool Sd2Card::writeBlock(uint32_t block, const uint8_t* src) { +bool Sd2Card::writeBlock(uint32_t block, const uint8_t *src) { if (!isInserted()) return false; #if USB_DEBUG >= 3 if (block >= lun0_capacity) { diff --git a/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.h b/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.h index 5789121367..320678d091 100644 --- a/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.h +++ b/Marlin/src/sd/usb_flashdrive/Sd2Card_FlashDrive.h @@ -60,15 +60,15 @@ class Sd2Card { static void idle(); inline bool readStart(const uint32_t block) { pos = block; return isReady(); } - inline bool readData(uint8_t* dst) { return readBlock(pos++, dst); } + inline bool readData(uint8_t *dst) { return readBlock(pos++, dst); } inline bool readStop() const { return true; } inline bool writeStart(const uint32_t block, const uint32_t) { pos = block; return isReady(); } - inline bool writeData(uint8_t* src) { return writeBlock(pos++, src); } + inline bool writeData(uint8_t *src) { return writeBlock(pos++, src); } inline bool writeStop() const { return true; } - bool readBlock(uint32_t block, uint8_t* dst); - bool writeBlock(uint32_t blockNumber, const uint8_t* src); + bool readBlock(uint32_t block, uint8_t *dst); + bool writeBlock(uint32_t blockNumber, const uint8_t *src); bool readCSD(csd_t*) { return true; } diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/Usb.cpp b/Marlin/src/sd/usb_flashdrive/lib-uhs2/Usb.cpp index f26e82b9c7..75421f4482 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/Usb.cpp +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/Usb.cpp @@ -133,7 +133,7 @@ uint8_t USB::SetAddress(uint8_t addr, uint8_t ep, EpInfo **ppep, uint16_t *nak_l /* 00 = success */ /* 01-0f = non-zero HRSLT */ uint8_t USB::ctrlReq(uint8_t addr, uint8_t ep, uint8_t bmReqType, uint8_t bRequest, uint8_t wValLo, uint8_t wValHi, - uint16_t wInd, uint16_t total, uint16_t nbytes, uint8_t* dataptr, USBReadParser *p) { + uint16_t wInd, uint16_t total, uint16_t nbytes, uint8_t *dataptr, USBReadParser *p) { bool direction = false; // Request direction, IN or OUT uint8_t rcode; SETUP_PKT setup_pkt; @@ -201,7 +201,7 @@ uint8_t USB::ctrlReq(uint8_t addr, uint8_t ep, uint8_t bmReqType, uint8_t bReque * Keep sending INs and writes data to memory area pointed by 'data' * rcode 0 if no errors. rcode 01-0f is relayed from dispatchPkt(). Rcode f0 means RCVDAVIRQ error, fe = USB xfer timeout */ -uint8_t USB::inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t* data, uint8_t bInterval /*= 0*/) { +uint8_t USB::inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t *data, uint8_t bInterval /*= 0*/) { EpInfo *pep = nullptr; uint16_t nak_limit = 0; @@ -215,7 +215,7 @@ uint8_t USB::inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t* return InTransfer(pep, nak_limit, nbytesptr, data, bInterval); } -uint8_t USB::InTransfer(EpInfo *pep, uint16_t nak_limit, uint16_t *nbytesptr, uint8_t* data, uint8_t bInterval /*= 0*/) { +uint8_t USB::InTransfer(EpInfo *pep, uint16_t nak_limit, uint16_t *nbytesptr, uint8_t *data, uint8_t bInterval /*= 0*/) { uint8_t rcode = 0; uint8_t pktsize; @@ -286,7 +286,7 @@ uint8_t USB::InTransfer(EpInfo *pep, uint16_t nak_limit, uint16_t *nbytesptr, ui * Handles NAK bug per Maxim Application Note 4000 for single buffer transfer * rcode 0 if no errors. rcode 01-0f is relayed from HRSL */ -uint8_t USB::outTransfer(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t* data) { +uint8_t USB::outTransfer(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *data) { EpInfo *pep = nullptr; uint16_t nak_limit = 0; @@ -743,12 +743,12 @@ uint8_t USB::ReleaseDevice(uint8_t addr) { } // Get device descriptor -uint8_t USB::getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t* dataptr) { +uint8_t USB::getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *dataptr) { return ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, 0x00, USB_DESCRIPTOR_DEVICE, 0x0000, nbytes, nbytes, dataptr, nullptr); } // Get configuration descriptor -uint8_t USB::getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t* dataptr) { +uint8_t USB::getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t *dataptr) { return ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, conf, USB_DESCRIPTOR_CONFIGURATION, 0x0000, nbytes, nbytes, dataptr, nullptr); } @@ -774,7 +774,7 @@ uint8_t USB::getConfDescr(uint8_t addr, uint8_t ep, uint8_t conf, USBReadParser } // Get string descriptor -uint8_t USB::getStrDescr(uint8_t addr, uint8_t ep, uint16_t ns, uint8_t index, uint16_t langid, uint8_t* dataptr) { +uint8_t USB::getStrDescr(uint8_t addr, uint8_t ep, uint16_t ns, uint8_t index, uint16_t langid, uint8_t *dataptr) { return ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, index, USB_DESCRIPTOR_STRING, langid, ns, ns, dataptr, nullptr); } diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/UsbCore.h b/Marlin/src/sd/usb_flashdrive/lib-uhs2/UsbCore.h index d94958dd54..5c76ffb758 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/UsbCore.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/UsbCore.h @@ -250,19 +250,19 @@ public: uint8_t setEpInfoEntry(uint8_t addr, uint8_t epcount, EpInfo* eprecord_ptr); /* Control requests */ - uint8_t getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t* dataptr); - uint8_t getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t* dataptr); + uint8_t getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *dataptr); + uint8_t getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t *dataptr); uint8_t getConfDescr(uint8_t addr, uint8_t ep, uint8_t conf, USBReadParser *p); - uint8_t getStrDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t index, uint16_t langid, uint8_t* dataptr); + uint8_t getStrDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t index, uint16_t langid, uint8_t *dataptr); uint8_t setAddr(uint8_t oldaddr, uint8_t ep, uint8_t newaddr); uint8_t setConf(uint8_t addr, uint8_t ep, uint8_t conf_value); /**/ - uint8_t ctrlData(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t* dataptr, bool direction); + uint8_t ctrlData(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *dataptr, bool direction); uint8_t ctrlStatus(uint8_t ep, bool direction, uint16_t nak_limit); - uint8_t inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t* data, uint8_t bInterval = 0); - uint8_t outTransfer(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t* data); + uint8_t inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t *data, uint8_t bInterval = 0); + uint8_t outTransfer(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *data); uint8_t dispatchPkt(uint8_t token, uint8_t ep, uint16_t nak_limit); void Task(); @@ -272,7 +272,7 @@ public: uint8_t ReleaseDevice(uint8_t addr); uint8_t ctrlReq(uint8_t addr, uint8_t ep, uint8_t bmReqType, uint8_t bRequest, uint8_t wValLo, uint8_t wValHi, - uint16_t wInd, uint16_t total, uint16_t nbytes, uint8_t* dataptr, USBReadParser *p); + uint16_t wInd, uint16_t total, uint16_t nbytes, uint8_t *dataptr, USBReadParser *p); private: void init(); @@ -285,17 +285,17 @@ private: #if 0 //defined(USB_METHODS_INLINE) //get device descriptor -inline uint8_t USB::getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t* dataptr) { +inline uint8_t USB::getDevDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *dataptr) { return ( ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, 0x00, USB_DESCRIPTOR_DEVICE, 0x0000, nbytes, dataptr)); } //get configuration descriptor -inline uint8_t USB::getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t* dataptr) { +inline uint8_t USB::getConfDescr(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t conf, uint8_t *dataptr) { return ( ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, conf, USB_DESCRIPTOR_CONFIGURATION, 0x0000, nbytes, dataptr)); } //get string descriptor -inline uint8_t USB::getStrDescr(uint8_t addr, uint8_t ep, uint16_t nuint8_ts, uint8_t index, uint16_t langid, uint8_t* dataptr) { +inline uint8_t USB::getStrDescr(uint8_t addr, uint8_t ep, uint16_t nuint8_ts, uint8_t index, uint16_t langid, uint8_t *dataptr) { return ( ctrlReq(addr, ep, bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, index, USB_DESCRIPTOR_STRING, langid, nuint8_ts, dataptr)); } //set address diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/usbhost.cpp b/Marlin/src/sd/usb_flashdrive/lib-uhs2/usbhost.cpp index 190a0f1a9e..4ee206bc32 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/usbhost.cpp +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/usbhost.cpp @@ -51,7 +51,7 @@ void MAX3421e::regWr(uint8_t reg, uint8_t data) { // multiple-byte write // return a pointer to memory position after last written -uint8_t* MAX3421e::bytesWr(uint8_t reg, uint8_t nbytes, uint8_t* data_p) { +uint8_t* MAX3421e::bytesWr(uint8_t reg, uint8_t nbytes, uint8_t *data_p) { cs(); spiSend(reg | 0x02); while (nbytes--) spiSend(*data_p++); @@ -79,7 +79,7 @@ uint8_t MAX3421e::regRd(uint8_t reg) { // multiple-byte register read // return a pointer to a memory position after last read -uint8_t* MAX3421e::bytesRd(uint8_t reg, uint8_t nbytes, uint8_t* data_p) { +uint8_t* MAX3421e::bytesRd(uint8_t reg, uint8_t nbytes, uint8_t *data_p) { cs(); spiSend(reg); while (nbytes--) *data_p++ = spiRec(); diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs2/usbhost.h b/Marlin/src/sd/usb_flashdrive/lib-uhs2/usbhost.h index 5c3b852d55..cbdd281858 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs2/usbhost.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs2/usbhost.h @@ -37,10 +37,10 @@ class MAX3421e { bool start(); void regWr(uint8_t reg, uint8_t data); - uint8_t* bytesWr(uint8_t reg, uint8_t nbytes, uint8_t* data_p); + uint8_t* bytesWr(uint8_t reg, uint8_t nbytes, uint8_t *data_p); void gpioWr(uint8_t data); uint8_t regRd(uint8_t reg); - uint8_t* bytesRd(uint8_t reg, uint8_t nbytes, uint8_t* data_p); + uint8_t* bytesRd(uint8_t reg, uint8_t nbytes, uint8_t *data_p); uint8_t gpioRd(); bool reset(); diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_host_INLINE.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_host_INLINE.h index 4ab1a6b8f9..3f758e7712 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_host_INLINE.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_host_INLINE.h @@ -594,7 +594,7 @@ void UHS_USB_HOST_BASE::ReleaseDevice(uint8_t addr) { * @param dataptr pointer to the data to return * @return status of the request, zero is success. */ -uint8_t UHS_USB_HOST_BASE::getDevDescr(uint8_t addr, uint16_t nbytes, uint8_t* dataptr) { +uint8_t UHS_USB_HOST_BASE::getDevDescr(uint8_t addr, uint16_t nbytes, uint8_t *dataptr) { return ( ctrlReq(addr, mkSETUP_PKT8(UHS_bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, 0x00, USB_DESCRIPTOR_DEVICE, 0x0000, nbytes), nbytes, dataptr)); } @@ -607,7 +607,7 @@ uint8_t UHS_USB_HOST_BASE::getDevDescr(uint8_t addr, uint16_t nbytes, uint8_t* d * @param dataptr ointer to the data to return * @return status of the request, zero is success. */ -uint8_t UHS_USB_HOST_BASE::getConfDescr(uint8_t addr, uint16_t nbytes, uint8_t conf, uint8_t* dataptr) { +uint8_t UHS_USB_HOST_BASE::getConfDescr(uint8_t addr, uint16_t nbytes, uint8_t conf, uint8_t *dataptr) { return ( ctrlReq(addr, mkSETUP_PKT8(UHS_bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, conf, USB_DESCRIPTOR_CONFIGURATION, 0x0000, nbytes), nbytes, dataptr)); } @@ -621,7 +621,7 @@ uint8_t UHS_USB_HOST_BASE::getConfDescr(uint8_t addr, uint16_t nbytes, uint8_t c * @param dataptr pointer to the data to return * @return status of the request, zero is success. */ -uint8_t UHS_USB_HOST_BASE::getStrDescr(uint8_t addr, uint16_t ns, uint8_t index, uint16_t langid, uint8_t* dataptr) { +uint8_t UHS_USB_HOST_BASE::getStrDescr(uint8_t addr, uint16_t ns, uint8_t index, uint16_t langid, uint8_t *dataptr) { return ( ctrlReq(addr, mkSETUP_PKT8(UHS_bmREQ_GET_DESCR, USB_REQUEST_GET_DESCRIPTOR, index, USB_DESCRIPTOR_STRING, langid, ns), ns, dataptr)); } @@ -668,7 +668,7 @@ uint8_t UHS_USB_HOST_BASE::setConf(uint8_t addr, uint8_t conf_value) { * @param data pointer to buffer to hold transfer * @return zero for success or error code */ -uint8_t UHS_USB_HOST_BASE::outTransfer(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t* data) { +uint8_t UHS_USB_HOST_BASE::outTransfer(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *data) { UHS_EpInfo *pep = NULL; uint16_t nak_limit = 0; HOST_DEBUG("outTransfer: addr: 0x%2.2x ep: 0x%2.2x nbytes: 0x%4.4x data: 0x%p\r\n", addr, ep, nbytes, data); @@ -689,7 +689,7 @@ uint8_t UHS_USB_HOST_BASE::outTransfer(uint8_t addr, uint8_t ep, uint16_t nbytes * @param data pointer to buffer to hold transfer * @return zero for success or error code */ -uint8_t UHS_USB_HOST_BASE::inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t* data) { +uint8_t UHS_USB_HOST_BASE::inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t *data) { UHS_EpInfo *pep = NULL; uint16_t nak_limit = 0; @@ -980,7 +980,7 @@ uint8_t UHS_USB_HOST_BASE::eat(UHS_EpInfo *pep, uint16_t *left, uint16_t *read, return rcode; } -uint8_t UHS_USB_HOST_BASE::ctrlReq(uint8_t addr, uint64_t Request, uint16_t nbytes, uint8_t* dataptr) { +uint8_t UHS_USB_HOST_BASE::ctrlReq(uint8_t addr, uint64_t Request, uint16_t nbytes, uint8_t *dataptr) { //bool direction = bmReqType & 0x80; //request direction, IN or OUT uint8_t rcode = 0; diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_usbhost.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_usbhost.h index b289a896ef..b81dbf2a28 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_usbhost.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/UHS_usbhost.h @@ -103,7 +103,7 @@ public: return (current_state == usb_task_state); }; - virtual UHS_EpInfo * UHS_NI ctrlReqOpen(NOTUSED(uint8_t addr), NOTUSED(uint64_t Request), NOTUSED(uint8_t* dataptr)) { + virtual UHS_EpInfo * UHS_NI ctrlReqOpen(NOTUSED(uint8_t addr), NOTUSED(uint64_t Request), NOTUSED(uint8_t *dataptr)) { return NULL; }; @@ -213,17 +213,17 @@ public: uint8_t UHS_NI EPClearHalt(uint8_t addr, uint8_t ep); - uint8_t UHS_NI ctrlReq(uint8_t addr, uint64_t Request, uint16_t nbytes, uint8_t* dataptr); + uint8_t UHS_NI ctrlReq(uint8_t addr, uint64_t Request, uint16_t nbytes, uint8_t *dataptr); - uint8_t UHS_NI getDevDescr(uint8_t addr, uint16_t nbytes, uint8_t* dataptr); + uint8_t UHS_NI getDevDescr(uint8_t addr, uint16_t nbytes, uint8_t *dataptr); - uint8_t UHS_NI getConfDescr(uint8_t addr, uint16_t nbytes, uint8_t conf, uint8_t* dataptr); + uint8_t UHS_NI getConfDescr(uint8_t addr, uint16_t nbytes, uint8_t conf, uint8_t *dataptr); uint8_t UHS_NI setAddr(uint8_t oldaddr, uint8_t newaddr); uint8_t UHS_NI setConf(uint8_t addr, uint8_t conf_value); - uint8_t UHS_NI getStrDescr(uint8_t addr, uint16_t nbytes, uint8_t index, uint16_t langid, uint8_t* dataptr); + uint8_t UHS_NI getStrDescr(uint8_t addr, uint16_t nbytes, uint8_t index, uint16_t langid, uint8_t *dataptr); void UHS_NI ReleaseDevice(uint8_t addr); @@ -262,8 +262,8 @@ public: uint8_t enumerateInterface(ENUMERATION_INFO *ei); uint8_t getNextInterface(ENUMERATION_INFO *ei, UHS_EpInfo *pep, uint8_t data[], uint16_t *left, uint16_t *read, uint8_t *offset); uint8_t initDescrStream(ENUMERATION_INFO *ei, USB_FD_CONFIGURATION_DESCRIPTOR *ucd, UHS_EpInfo *pep, uint8_t *data, uint16_t *left, uint16_t *read, uint8_t *offset); - uint8_t outTransfer(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t* data); - uint8_t inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t* data); + uint8_t outTransfer(uint8_t addr, uint8_t ep, uint16_t nbytes, uint8_t *data); + uint8_t inTransfer(uint8_t addr, uint8_t ep, uint16_t *nbytesptr, uint8_t *data); uint8_t doSoftReset(uint8_t parent, uint8_t port, uint8_t address); uint8_t getone(UHS_EpInfo *pep, uint16_t *left, uint16_t *read, uint8_t *dataptr, uint8_t *offset); uint8_t eat(UHS_EpInfo *pep, uint16_t *left, uint16_t *read, uint8_t *dataptr, uint8_t *offset, uint16_t *yum); diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/USB_HOST_SHIELD/USB_HOST_SHIELD.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/USB_HOST_SHIELD/USB_HOST_SHIELD.h index 56d6400979..7d17d626c1 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/USB_HOST_SHIELD/USB_HOST_SHIELD.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/USB_HOST_SHIELD/USB_HOST_SHIELD.h @@ -388,7 +388,7 @@ public: return (!condet); }; - virtual UHS_EpInfo *ctrlReqOpen(uint8_t addr, uint64_t Request, uint8_t* dataptr); + virtual UHS_EpInfo *ctrlReqOpen(uint8_t addr, uint64_t Request, uint8_t *dataptr); virtual void UHS_NI vbusPower(VBUS_t state) { regWr(rPINCTL, (bmFDUPSPI | bmIRQ_SENSE) | (uint8_t)(state)); @@ -483,8 +483,8 @@ public: void gpioWr(uint8_t data); uint8_t regRd(uint8_t reg); uint8_t gpioRd(); - uint8_t* bytesWr(uint8_t reg, uint8_t nbytes, uint8_t* data_p); - uint8_t* bytesRd(uint8_t reg, uint8_t nbytes, uint8_t* data_p); + uint8_t* bytesWr(uint8_t reg, uint8_t nbytes, uint8_t *data_p); + uint8_t* bytesRd(uint8_t reg, uint8_t nbytes, uint8_t *data_p); // ARM/NVIC specific, used to emulate reentrant ISR. #ifdef SWI_IRQ_NUM diff --git a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/USB_HOST_SHIELD/USB_HOST_SHIELD_INLINE.h b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/USB_HOST_SHIELD/USB_HOST_SHIELD_INLINE.h index 7fe48652fd..6cfc0152d0 100644 --- a/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/USB_HOST_SHIELD/USB_HOST_SHIELD_INLINE.h +++ b/Marlin/src/sd/usb_flashdrive/lib-uhs3/UHS_host/USB_HOST_SHIELD/USB_HOST_SHIELD_INLINE.h @@ -76,7 +76,7 @@ void UHS_NI MAX3421E_HOST::regWr(uint8_t reg, uint8_t data) { /* multiple-byte write */ /* returns a pointer to memory position after last written */ -uint8_t* UHS_NI MAX3421E_HOST::bytesWr(uint8_t reg, uint8_t nbytes, uint8_t* data_p) { +uint8_t* UHS_NI MAX3421E_HOST::bytesWr(uint8_t reg, uint8_t nbytes, uint8_t *data_p) { SPIclass.beginTransaction(MAX3421E_SPI_Settings); MARLIN_UHS_WRITE_SS(LOW); SPIclass.transfer(reg | 0x02); @@ -117,7 +117,7 @@ uint8_t UHS_NI MAX3421E_HOST::regRd(uint8_t reg) { /* multiple-byte register read */ /* returns a pointer to a memory position after last read */ -uint8_t* UHS_NI MAX3421E_HOST::bytesRd(uint8_t reg, uint8_t nbytes, uint8_t* data_p) { +uint8_t* UHS_NI MAX3421E_HOST::bytesRd(uint8_t reg, uint8_t nbytes, uint8_t *data_p) { SPIclass.beginTransaction(MAX3421E_SPI_Settings); MARLIN_UHS_WRITE_SS(LOW); SPIclass.transfer(reg); @@ -472,7 +472,7 @@ uint8_t UHS_NI MAX3421E_HOST::SetAddress(uint8_t addr, uint8_t ep, UHS_EpInfo ** * @param data pointer to data buffer * @return 0 on success */ -uint8_t UHS_NI MAX3421E_HOST::InTransfer(UHS_EpInfo *pep, uint16_t nak_limit, uint16_t *nbytesptr, uint8_t* data) { +uint8_t UHS_NI MAX3421E_HOST::InTransfer(UHS_EpInfo *pep, uint16_t nak_limit, uint16_t *nbytesptr, uint8_t *data) { uint8_t rcode = 0; uint8_t pktsize; diff --git a/buildroot/share/PlatformIO/variants/MARLIN_F4x7Vx/hal_conf_extra.h b/buildroot/share/PlatformIO/variants/MARLIN_F4x7Vx/hal_conf_extra.h index abac2b08b3..a8500c595f 100644 --- a/buildroot/share/PlatformIO/variants/MARLIN_F4x7Vx/hal_conf_extra.h +++ b/buildroot/share/PlatformIO/variants/MARLIN_F4x7Vx/hal_conf_extra.h @@ -479,7 +479,7 @@ */ #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__)) /* Exported functions ------------------------------------------------------- */ - void assert_failed(uint8_t* file, uint32_t line); + void assert_failed(uint8_t *file, uint32_t line); #else #define assert_param(expr) ((void)0U) #endif /* USE_FULL_ASSERT */ diff --git a/buildroot/share/fonts/genpages.c b/buildroot/share/fonts/genpages.c index c855ceac50..dea5b05c5c 100644 --- a/buildroot/share/fonts/genpages.c +++ b/buildroot/share/fonts/genpages.c @@ -142,12 +142,12 @@ uint8_t* get_utf8_value(uint8_t *pstart, wchar_t *pval) { return p; } -void usage(char* progname) { +void usage(char *progname) { fprintf(stderr, "usage: %s\n", progname); fprintf(stderr, " read data from stdin\n"); } -void utf8_parse(const char* msg, unsigned int len) { +void utf8_parse(const char *msg, unsigned int len) { uint8_t *pend = NULL; uint8_t *p; uint8_t *pre; From f587a4e3f30324789a50acc107047e430be1a172 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 29 Mar 2021 20:00:57 -0500 Subject: [PATCH 225/253] Improve uncrust script --- buildroot/bin/uncrust | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/buildroot/bin/uncrust b/buildroot/bin/uncrust index 9893b5c380..7898f73c8c 100755 --- a/buildroot/bin/uncrust +++ b/buildroot/bin/uncrust @@ -6,11 +6,12 @@ TMPDIR=`mktemp -d` # Reformat a single file to tmp/ -uncrustify -l CPP -c ./buildroot/share/extras/uncrustify.cfg -f "$1" >$TMPDIR/uncrustify.out - -# Replace the original file -cp "$TMPDIR/uncrustify.out" "$1" +if uncrustify -l CPP -c ./buildroot/share/extras/uncrustify.cfg -f "$1" >$TMPDIR/uncrustify.out ; then + cp "$TMPDIR/uncrustify.out" "$1" ; # Replace the original file +else + echo "Something went wrong with uncrustify." +fi # Clean up, deliberately -rm "$TMPDIR/uncrustify.out" +[[ -f "$TMPDIR/uncrustify.out" ]] && rm "$TMPDIR/uncrustify.out" rmdir "$TMPDIR" From d30b5481f5373559bc152d48a48ebabc5304acff Mon Sep 17 00:00:00 2001 From: Ramiro Polla Date: Tue, 30 Mar 2021 03:56:44 +0200 Subject: [PATCH 226/253] Optimize BLTouch code for size (#21477) --- Marlin/src/feature/bltouch.h | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/Marlin/src/feature/bltouch.h b/Marlin/src/feature/bltouch.h index 8bd41f03e4..9ecccb4256 100644 --- a/Marlin/src/feature/bltouch.h +++ b/Marlin/src/feature/bltouch.h @@ -74,33 +74,33 @@ public: static bool last_written_mode; // Initialized by settings.load, 0 = Open Drain; 1 = 5V Drain // DEPLOY and STOW are wrapped for error handling - these are used by homing and by probing - FORCE_INLINE static bool deploy() { return deploy_proc(); } - FORCE_INLINE static bool stow() { return stow_proc(); } - FORCE_INLINE static bool status() { return status_proc(); } + static bool deploy() { return deploy_proc(); } + static bool stow() { return stow_proc(); } + static bool status() { return status_proc(); } // Native BLTouch commands ("Underscore"...), used in lcd menus and internally - FORCE_INLINE static void _reset() { command(BLTOUCH_RESET, BLTOUCH_RESET_DELAY); } + static void _reset() { command(BLTOUCH_RESET, BLTOUCH_RESET_DELAY); } - FORCE_INLINE static void _selftest() { command(BLTOUCH_SELFTEST, BLTOUCH_DELAY); } + static void _selftest() { command(BLTOUCH_SELFTEST, BLTOUCH_DELAY); } - FORCE_INLINE static void _set_SW_mode() { command(BLTOUCH_SW_MODE, BLTOUCH_DELAY); } - FORCE_INLINE static void _reset_SW_mode() { if (triggered()) _stow(); else _deploy(); } + static void _set_SW_mode() { command(BLTOUCH_SW_MODE, BLTOUCH_DELAY); } + static void _reset_SW_mode() { if (triggered()) _stow(); else _deploy(); } - FORCE_INLINE static void _set_5V_mode() { command(BLTOUCH_5V_MODE, BLTOUCH_SET5V_DELAY); } - FORCE_INLINE static void _set_OD_mode() { command(BLTOUCH_OD_MODE, BLTOUCH_SETOD_DELAY); } - FORCE_INLINE static void _mode_store() { command(BLTOUCH_MODE_STORE, BLTOUCH_MODE_STORE_DELAY); } + static void _set_5V_mode() { command(BLTOUCH_5V_MODE, BLTOUCH_SET5V_DELAY); } + static void _set_OD_mode() { command(BLTOUCH_OD_MODE, BLTOUCH_SETOD_DELAY); } + static void _mode_store() { command(BLTOUCH_MODE_STORE, BLTOUCH_MODE_STORE_DELAY); } - FORCE_INLINE static void _deploy() { command(BLTOUCH_DEPLOY, BLTOUCH_DEPLOY_DELAY); } - FORCE_INLINE static void _stow() { command(BLTOUCH_STOW, BLTOUCH_STOW_DELAY); } + static void _deploy() { command(BLTOUCH_DEPLOY, BLTOUCH_DEPLOY_DELAY); } + static void _stow() { command(BLTOUCH_STOW, BLTOUCH_STOW_DELAY); } - FORCE_INLINE static void mode_conv_5V() { mode_conv_proc(true); } - FORCE_INLINE static void mode_conv_OD() { mode_conv_proc(false); } + static void mode_conv_5V() { mode_conv_proc(true); } + static void mode_conv_OD() { mode_conv_proc(false); } static bool triggered(); private: - FORCE_INLINE static bool _deploy_query_alarm() { return command(BLTOUCH_DEPLOY, BLTOUCH_DEPLOY_DELAY); } - FORCE_INLINE static bool _stow_query_alarm() { return command(BLTOUCH_STOW, BLTOUCH_STOW_DELAY) == STOW_ALARM; } + static bool _deploy_query_alarm() { return command(BLTOUCH_DEPLOY, BLTOUCH_DEPLOY_DELAY); } + static bool _stow_query_alarm() { return command(BLTOUCH_STOW, BLTOUCH_STOW_DELAY) == STOW_ALARM; } static void clear(); static bool command(const BLTCommand cmd, const millis_t &ms); From c298095000ac0ff5213dea2348b432779ad894ef Mon Sep 17 00:00:00 2001 From: Ste Date: Tue, 30 Mar 2021 04:07:21 +0200 Subject: [PATCH 227/253] Align temp settings (#21329) --- Marlin/Configuration.h | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index c9c83f9bb6..f333c3369b 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -437,17 +437,17 @@ //#define TEMP_SENSOR_1_AS_REDUNDANT #define MAX_REDUNDANT_TEMP_SENSOR_DIFF 10 -#define TEMP_RESIDENCY_TIME 10 // (seconds) Time to wait for hotend to "settle" in M109 -#define TEMP_WINDOW 1 // (°C) Temperature proximity for the "temperature reached" timer -#define TEMP_HYSTERESIS 3 // (°C) Temperature proximity considered "close enough" to the target +#define TEMP_RESIDENCY_TIME 10 // (seconds) Time to wait for hotend to "settle" in M109 +#define TEMP_WINDOW 1 // (°C) Temperature proximity for the "temperature reached" timer +#define TEMP_HYSTERESIS 3 // (°C) Temperature proximity considered "close enough" to the target -#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) Time to wait for bed to "settle" in M190 -#define TEMP_BED_WINDOW 1 // (°C) Temperature proximity for the "temperature reached" timer -#define TEMP_BED_HYSTERESIS 3 // (°C) Temperature proximity considered "close enough" to the target +#define TEMP_BED_RESIDENCY_TIME 10 // (seconds) Time to wait for bed to "settle" in M190 +#define TEMP_BED_WINDOW 1 // (°C) Temperature proximity for the "temperature reached" timer +#define TEMP_BED_HYSTERESIS 3 // (°C) Temperature proximity considered "close enough" to the target #define TEMP_CHAMBER_RESIDENCY_TIME 10 // (seconds) Time to wait for chamber to "settle" in M191 -#define TEMP_CHAMBER_WINDOW 1 // (°C) Temperature proximity for the "temperature reached" timer -#define TEMP_CHAMBER_HYSTERESIS 3 // (°C) Temperature proximity considered "close enough" to the target +#define TEMP_CHAMBER_WINDOW 1 // (°C) Temperature proximity for the "temperature reached" timer +#define TEMP_CHAMBER_HYSTERESIS 3 // (°C) Temperature proximity considered "close enough" to the target // Below this temperature the heater will be switched off // because it probably indicates a broken thermistor wire. From 3f7cd45df4b7159e92b37eb561fe4d7980d031af Mon Sep 17 00:00:00 2001 From: Giuliano Zaro <3684609+GMagician@users.noreply.github.com> Date: Tue, 30 Mar 2021 04:14:11 +0200 Subject: [PATCH 228/253] Generalize MMU (#21469) --- Marlin/Configuration.h | 10 +++++----- Marlin/src/gcode/control/T.cpp | 2 +- Marlin/src/inc/Conditionals_LCD.h | 20 ++++++++++---------- Marlin/src/inc/SanityCheck.h | 14 +++++++++----- Marlin/src/pins/pins.h | 4 ++-- 5 files changed, 27 insertions(+), 23 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index f333c3369b..93a60394c2 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -160,11 +160,11 @@ * Multi-Material Unit * Set to one of these predefined models: * - * PRUSA_MMU1 : Průša MMU1 (The "multiplexer" version) - * PRUSA_MMU2 : Průša MMU2 - * PRUSA_MMU2S : Průša MMU2S (Requires MK3S extruder with motion sensor, EXTRUDERS = 5) - * SMUFF_EMU_MMU2 : Technik Gegg SMuFF (Průša MMU2 emulation mode) - * SMUFF_EMU_MMU2S : Technik Gegg SMuFF (Průša MMU2S emulation mode) + * PRUSA_MMU1 : Průša MMU1 (The "multiplexer" version) + * PRUSA_MMU2 : Průša MMU2 + * PRUSA_MMU2S : Průša MMU2S (Requires MK3S extruder with motion sensor, EXTRUDERS = 5) + * EXTENDABLE_EMU_MMU2 : MMU with configurable number of filaments (ERCF, SMuFF or similar with Průša MMU2 compatible firmware) + * EXTENDABLE_EMU_MMU2S : MMUS with configurable number of filaments (ERCF, SMuFF or similar with Průša MMU2 compatible firmware) * * Requires NOZZLE_PARK_FEATURE to park print head in case MMU unit fails. * See additional options in Configuration_adv.h. diff --git a/Marlin/src/gcode/control/T.cpp b/Marlin/src/gcode/control/T.cpp index 3ce284f82e..6a084d83ad 100644 --- a/Marlin/src/gcode/control/T.cpp +++ b/Marlin/src/gcode/control/T.cpp @@ -40,7 +40,7 @@ * F[units/min] Set the movement feedrate * S1 Don't move the tool in XY after change * - * For PRUSA_MMU2(S) and SMUFF_EMU_MMU2(S) + * For PRUSA_MMU2(S) and EXTENDABLE_EMU_MMU2(S) * T[n] Gcode to extrude at least 38.10 mm at feedrate 19.02 mm/s must follow immediately to load to extruder wheels. * T? Gcode to extrude shouldn't have to follow. Load to extruder wheels is done automatically. * Tx Same as T?, but nozzle doesn't have to be preheated. Tc requires a preheated nozzle to finish filament load. diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index af902481f3..a0fced150f 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -501,11 +501,11 @@ /** * Multi-Material-Unit supported models */ -#define PRUSA_MMU1 1 -#define PRUSA_MMU2 2 -#define PRUSA_MMU2S 3 -#define SMUFF_EMU_MMU2 12 -#define SMUFF_EMU_MMU2S 13 +#define PRUSA_MMU1 1 +#define PRUSA_MMU2 2 +#define PRUSA_MMU2S 3 +#define EXTENDABLE_EMU_MMU2 12 +#define EXTENDABLE_EMU_MMU2S 13 #ifdef MMU_MODEL #define HAS_MMU 1 @@ -517,16 +517,16 @@ #define HAS_PRUSA_MMU2 1 #define HAS_PRUSA_MMU2S 1 #endif - #if MMU_MODEL == SMUFF_EMU_MMU2 || MMU_MODEL == SMUFF_EMU_MMU2S - #define HAS_SMUFF 1 + #if MMU_MODEL == EXTENDABLE_EMU_MMU2 || MMU_MODEL == EXTENDABLE_EMU_MMU2S + #define HAS_EXTENDABLE_MMU 1 #endif #endif #undef PRUSA_MMU1 #undef PRUSA_MMU2 #undef PRUSA_MMU2S -#undef SMUFF_EMU_MMU2 -#undef SMUFF_EMU_MMU2S +#undef EXTENDABLE_EMU_MMU2 +#undef EXTENDABLE_EMU_MMU2S /** * Extruders have some combination of stepper motors and hotends @@ -579,7 +579,7 @@ #undef DISABLE_INACTIVE_EXTRUDER #endif -// Průša MMU1, MMU 2.0, MMUS 2.0 and SMuFF force SINGLENOZZLE +// Průša MMU1, MMU(S) 2.0 and EXTENDABLE_EMU_MMU2(S) force SINGLENOZZLE #if HAS_MMU #define SINGLENOZZLE #endif diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 6ed0f53245..287f0c5600 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -920,10 +920,14 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #error "PRUSA_MMU2 is obsolete. Define MMU_MODEL as PRUSA_MMU2 instead." #elif ENABLED(PRUSA_MMU2_S_MODE) #error "PRUSA_MMU2_S_MODE is obsolete. Define MMU_MODEL as PRUSA_MMU2S instead." +#elif ENABLED(SMUFF_EMU_MMU2) + #error "SMUFF_EMU_MMU2 is obsolete. Define MMU_MODEL as EXTENDABLE_EMU_MMU2 instead." +#elif ENABLED(SMUFF_EMU_MMU2S) + #error "SMUFF_EMU_MMU2S is obsolete. Define MMU_MODEL as EXTENDABLE_EMU_MMU2S instead." #endif /** - * Multi-Material-Unit 2 / SMuFF requirements + * Multi-Material-Unit 2 / EXTENDABLE_EMU_MMU2 requirements */ #if HAS_PRUSA_MMU2 #if EXTRUDERS != 5 @@ -938,11 +942,11 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #elif ENABLED(MMU_EXTRUDER_SENSOR) && !HAS_LCD_MENU #error "MMU_EXTRUDER_SENSOR requires an LCD supporting MarlinUI to be enabled." #elif DISABLED(ADVANCED_PAUSE_FEATURE) - static_assert(nullptr == strstr(MMU2_FILAMENT_RUNOUT_SCRIPT, "M600"), "ADVANCED_PAUSE_FEATURE is required to use M600 with PRUSA_MMU2(S) / SMUFF_EMU_MMU2(S)."); + static_assert(nullptr == strstr(MMU2_FILAMENT_RUNOUT_SCRIPT, "M600"), "ADVANCED_PAUSE_FEATURE is required to use M600 with PRUSA_MMU2(S) / HAS_EXTENDABLE_MMU(S)."); #endif #endif -#if HAS_SMUFF && EXTRUDERS > 12 - #error "Too many extruders for SMUFF_EMU_MMU2(S). (12 maximum)." +#if HAS_EXTENDABLE_MMU && EXTRUDERS > 15 + #error "Too many extruders for MMU(S) emulation mode. (15 maximum)." #endif /** @@ -980,7 +984,7 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #error "TOOLCHANGE_ZRAISE required for EXTRUDERS > 1." #endif -#elif HAS_PRUSA_MMU1 || HAS_SMUFF +#elif HAS_PRUSA_MMU1 || HAS_EXTENDABLE_MMU #error "Multi-Material-Unit requires 2 or more EXTRUDERS." diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 8eecce2c17..35bfb266eb 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -35,8 +35,8 @@ * These numbers are the same in any pin mapping. */ -#if HAS_SMUFF - #define MAX_EXTRUDERS 12 +#if HAS_EXTENDABLE_MMU + #define MAX_EXTRUDERS 15 #else #define MAX_EXTRUDERS 8 #endif From 139c14948621adcaa227bcef67765a5228039cd3 Mon Sep 17 00:00:00 2001 From: X-Ryl669 Date: Tue, 30 Mar 2021 04:36:01 +0200 Subject: [PATCH 229/253] Flags for MarlinSerial instance features (#21318) --- Marlin/src/core/bug_on.h | 7 ++-- Marlin/src/core/macros.h | 44 ++++++++++++++++++---- Marlin/src/core/serial.h | 2 +- Marlin/src/core/serial_base.h | 68 ++++++++++++++++++++++++---------- Marlin/src/core/serial_hook.h | 27 ++++++++++++-- Marlin/src/feature/meatpack.h | 2 + Marlin/src/gcode/gcode_d.cpp | 5 +++ Marlin/src/gcode/host/M115.cpp | 9 ++++- 8 files changed, 127 insertions(+), 37 deletions(-) diff --git a/Marlin/src/core/bug_on.h b/Marlin/src/core/bug_on.h index dc32f0385a..3c9dec0f96 100644 --- a/Marlin/src/core/bug_on.h +++ b/Marlin/src/core/bug_on.h @@ -27,11 +27,12 @@ // Useful macro for stopping the CPU on an unexpected condition // This is used like SERIAL_ECHOPAIR, that is: a key-value call of the local variables you want // to dump to the serial port before stopping the CPU. - #define BUG_ON(V...) do { SERIAL_ECHOPAIR(ONLY_FILENAME, __LINE__, ": "); SERIAL_ECHOLNPAIR(V); SERIAL_FLUSHTX(); *(char*)0 = 42; } while(0) + // \/ Don't replace by SERIAL_ECHOPAIR since ONLY_FILENAME cannot be transformed to a PGM string on Arduino and it breaks building + #define BUG_ON(V...) do { SERIAL_ECHO(ONLY_FILENAME); SERIAL_ECHO(__LINE__); SERIAL_ECHOLN(": "); SERIAL_ECHOLNPAIR(V); SERIAL_FLUSHTX(); *(char*)0 = 42; } while(0) #elif ENABLED(MARLIN_DEV_MODE) // Don't stop the CPU here, but at least dump the bug on the serial port - //#define BUG_ON(V...) do { SERIAL_ECHOPAIR(ONLY_FILENAME, __LINE__, ": BUG!\n"); SERIAL_ECHOLNPAIR(V); SERIAL_FLUSHTX(); } while(0) - #define BUG_ON(V...) NOOP + // \/ Don't replace by SERIAL_ECHOPAIR since ONLY_FILENAME cannot be transformed to a PGM string on Arduino and it breaks building + #define BUG_ON(V...) do { SERIAL_ECHO(ONLY_FILENAME); SERIAL_ECHO(__LINE__); SERIAL_ECHOLN(": BUG!"); SERIAL_ECHOLNPAIR(V); SERIAL_FLUSHTX(); } while(0) #else // Release mode, let's ignore the bug #define BUG_ON(V...) NOOP diff --git a/Marlin/src/core/macros.h b/Marlin/src/core/macros.h index f900993784..fb129cd939 100644 --- a/Marlin/src/core/macros.h +++ b/Marlin/src/core/macros.h @@ -318,6 +318,16 @@ #endif + // Allow manipulating enumeration value like flags without ugly cast everywhere + #define ENUM_FLAGS(T) \ + FORCE_INLINE constexpr T operator&(T x, T y) { return static_cast(static_cast(x) & static_cast(y)); } \ + FORCE_INLINE constexpr T operator|(T x, T y) { return static_cast(static_cast(x) | static_cast(y)); } \ + FORCE_INLINE constexpr T operator^(T x, T y) { return static_cast(static_cast(x) ^ static_cast(y)); } \ + FORCE_INLINE constexpr T operator~(T x) { return static_cast(~static_cast(x)); } \ + FORCE_INLINE T & operator&=(T &x, T y) { return x &= y; } \ + FORCE_INLINE T & operator|=(T &x, T y) { return x |= y; } \ + FORCE_INLINE T & operator^=(T &x, T y) { return x ^= y; } + // C++11 solution that is standard compliant. is not available on all platform namespace Private { template struct enable_if { }; @@ -357,23 +367,43 @@ return *str ? findStringEnd(str + 1) : str; } - // Check whether a string contains a slash - constexpr bool containsSlash(const char *str) { - return *str == '/' ? true : (*str ? containsSlash(str + 1) : false); + // Check whether a string contains a specific character + constexpr bool contains(const char *str, const char ch) { + return *str == ch ? true : (*str ? contains(str + 1, ch) : false); } - // Find the last position of the slash - constexpr const char* findLastSlashPos(const char *str) { - return *str == '/' ? (str + 1) : findLastSlashPos(str - 1); + // Find the last position of the specific character (should be called with findStringEnd) + constexpr const char* findLastPos(const char *str, const char ch) { + return *str == ch ? (str + 1) : findLastPos(str - 1, ch); } // Compile-time evaluation of the last part of a file path // Typically used to shorten the path to file in compiled strings // CompileTimeString::baseName(__FILE__) returns "macros.h" and not /path/to/Marlin/src/core/macros.h constexpr const char* baseName(const char *str) { - return containsSlash(str) ? findLastSlashPos(findStringEnd(str)) : str; + return contains(str, '/') ? findLastPos(findStringEnd(str), '/') : str; + } + + // Find the first occurence of a character in a string (or return the last position in the string) + constexpr const char* findFirst(const char *str, const char ch) { + return *str == ch || *str == 0 ? (str + 1) : findFirst(str + 1, ch); + } + // Compute the string length at compile time + constexpr unsigned stringLen(const char *str) { + return *str == 0 ? 0 : 1 + stringLen(str + 1); } } #define ONLY_FILENAME CompileTimeString::baseName(__FILE__) + /** Get the templated type name. This does not depends on RTTI, but on the preprocessor, so it should be quite safe to use even on old compilers. + WARNING: DO NOT RENAME THIS FUNCTION (or change the text inside the function to match what the preprocessor will generate) + The name is chosen very short since the binary will store "const char* gtn(T*) [with T = YourTypeHere]" so avoid long function name here */ + template + inline const char* gtn(T*) { + // It works on GCC by instantiating __PRETTY_FUNCTION__ and parsing the result. So the syntax here is very limited to GCC output + constexpr unsigned verboseChatLen = sizeof("const char* gtn(T*) [with T = ") - 1; + static char templateType[sizeof(__PRETTY_FUNCTION__) - verboseChatLen] = {}; + __builtin_memcpy(templateType, __PRETTY_FUNCTION__ + verboseChatLen, sizeof(__PRETTY_FUNCTION__) - verboseChatLen - 2); + return templateType; + } #else diff --git a/Marlin/src/core/serial.h b/Marlin/src/core/serial.h index 2f23e4e3c2..43137f71d7 100644 --- a/Marlin/src/core/serial.h +++ b/Marlin/src/core/serial.h @@ -146,7 +146,7 @@ inline void SERIAL_ECHO(serial_char_t x) { SERIAL_IMPL.write(x.c); } #define AS_CHAR(C) serial_char_t(C) // SERIAL_ECHO_F prints a floating point value with optional precision -inline void SERIAL_ECHO_F(EnsureDouble x, int digit = 2) { SERIAL_IMPL.print(x, digit); } +inline void SERIAL_ECHO_F(EnsureDouble x, int digit=2) { SERIAL_IMPL.print(x, digit); } template void SERIAL_ECHOLN(T x) { SERIAL_IMPL.println(x); } diff --git a/Marlin/src/core/serial_base.h b/Marlin/src/core/serial_base.h index 78721c6f14..cdea70e2c5 100644 --- a/Marlin/src/core/serial_base.h +++ b/Marlin/src/core/serial_base.h @@ -45,10 +45,6 @@ struct serial_index_t { constexpr serial_index_t() : index(-1) {} }; -// flushTX is not implemented in all HAL, so use SFINAE to call the method where it is. -CALL_IF_EXISTS_IMPL(void, flushTX); -CALL_IF_EXISTS_IMPL(bool, connected, true); - // In order to catch usage errors in code, we make the base to encode number explicit // If given a number (and not this enum), the compiler will reject the overload, falling back to the (double, digit) version // We don't want hidden conversion of the first parameter to double, so it has to be as hard to do for the compiler as creating this enum @@ -59,19 +55,34 @@ enum class PrintBase { Bin = 2 }; -// A simple forward struct that prevent the compiler to select print(double, int) as a default overload for any type different than -// double or float. For double or float, a conversion exists so the call will be transparent +// A simple feature list enumeration +enum class SerialFeature { + None = 0x00, + MeatPack = 0x01, //!< Enabled when Meatpack is present + BinaryFileTransfer = 0x02, //!< Enabled for BinaryFile transfer support (in the future) + Virtual = 0x04, //!< Enabled for virtual serial port (like Telnet / Websocket / ...) + Hookable = 0x08, //!< Enabled if the serial class supports a setHook method +}; +ENUM_FLAGS(SerialFeature); + +// flushTX is not implemented in all HAL, so use SFINAE to call the method where it is. +CALL_IF_EXISTS_IMPL(void, flushTX); +CALL_IF_EXISTS_IMPL(bool, connected, true); +CALL_IF_EXISTS_IMPL(SerialFeature, features, SerialFeature::None); + +// A simple forward struct to prevent the compiler from selecting print(double, int) as a default overload +// for any type other than double/float. For double/float, a conversion exists so the call will be invisible. struct EnsureDouble { double a; FORCE_INLINE operator double() { return a; } - // If the compiler breaks on ambiguity here, it's likely because you're calling print(X, base) with X not a double or a float, and a - // base that's not one of PrintBase's value. This exact code is made to detect such error, you NEED to set a base explicitely like this: + // If the compiler breaks on ambiguity here, it's likely because print(X, base) is called with X not a double/float, and + // a base that's not a PrintBase value. This code is made to detect the error. You MUST set a base explicitly like this: // SERIAL_PRINT(v, PrintBase::Hex) FORCE_INLINE EnsureDouble(double a) : a(a) {} FORCE_INLINE EnsureDouble(float a) : a(a) {} }; -// Using Curiously Recurring Template Pattern here to avoid virtual table cost when compiling. +// Using Curiously-Recurring Template Pattern here to avoid virtual table cost when compiling. // Since the real serial class is known at compile time, this results in the compiler writing // a completely efficient code. template @@ -85,27 +96,44 @@ struct SerialBase { SerialBase(const bool) {} #endif + #define SerialChild static_cast(this) + // Static dispatch methods below: // The most important method here is where it all ends to: - size_t write(uint8_t c) { return static_cast(this)->write(c); } + size_t write(uint8_t c) { return SerialChild->write(c); } + // Called when the parser finished processing an instruction, usually build to nothing - void msgDone() { static_cast(this)->msgDone(); } - // Called upon initialization - void begin(const long baudRate) { static_cast(this)->begin(baudRate); } - // Called upon destruction - void end() { static_cast(this)->end(); } + void msgDone() const { SerialChild->msgDone(); } + + // Called on initialization + void begin(const long baudRate) { SerialChild->begin(baudRate); } + + // Called on destruction + void end() { SerialChild->end(); } + /** Check for available data from the port @param index The port index, usually 0 */ - int available(serial_index_t index = 0) { return static_cast(this)->available(index); } + int available(serial_index_t index=0) const { return SerialChild->available(index); } + /** Read a value from the port @param index The port index, usually 0 */ - int read(serial_index_t index = 0) { return static_cast(this)->read(index); } + int read(serial_index_t index=0) { return SerialChild->read(index); } + + /** Combine the features of this serial instance and return it + @param index The port index, usually 0 */ + SerialFeature features(serial_index_t index=0) const { return static_cast(this)->features(index); } + + // Check if the serial port has a feature + bool has_feature(serial_index_t index, SerialFeature flag) const { (features(index) & flag) != SerialFeature::None; } + // Check if the serial port is connected (usually bypassed) - bool connected() { return static_cast(this)->connected(); } + bool connected() const { return SerialChild->connected(); } + // Redirect flush - void flush() { static_cast(this)->flush(); } + void flush() { SerialChild->flush(); } + // Not all implementation have a flushTX, so let's call them only if the child has the implementation - void flushTX() { CALL_IF_EXISTS(void, static_cast(this), flushTX); } + void flushTX() { CALL_IF_EXISTS(void, SerialChild, flushTX); } // Glue code here FORCE_INLINE void write(const char *str) { while (*str) write(*str++); } diff --git a/Marlin/src/core/serial_hook.h b/Marlin/src/core/serial_hook.h index c687891fb4..7bc04a5e88 100644 --- a/Marlin/src/core/serial_hook.h +++ b/Marlin/src/core/serial_hook.h @@ -65,6 +65,8 @@ struct BaseSerial : public SerialBase< BaseSerial >, public SerialT { bool connected() { return CALL_IF_EXISTS(bool, static_cast(this), connected);; } void flushTX() { CALL_IF_EXISTS(void, static_cast(this), flushTX); } + SerialFeature features(serial_index_t index) const { return CALL_IF_EXISTS(SerialFeature, static_cast(this), features, index); } + // We have 2 implementation of the same method in both base class, let's say which one we want using SerialT::available; using SerialT::read; @@ -98,10 +100,11 @@ struct ConditionalSerial : public SerialBase< ConditionalSerial > { bool connected() { return CALL_IF_EXISTS(bool, &out, connected); } void flushTX() { CALL_IF_EXISTS(void, &out, flushTX); } - int available(serial_index_t ) { return (int)out.available(); } - int read(serial_index_t ) { return (int)out.read(); } + int available(serial_index_t) { return (int)out.available(); } + int read(serial_index_t) { return (int)out.read(); } int available() { return (int)out.available(); } int read() { return (int)out.read(); } + SerialFeature features(serial_index_t index) const { return CALL_IF_EXISTS(SerialFeature, &out, features, index); } ConditionalSerial(bool & conditionVariable, SerialT & out, const bool e) : BaseClassT(e), condition(conditionVariable), out(out) {} }; @@ -126,6 +129,7 @@ struct ForwardSerial : public SerialBase< ForwardSerial > { int read(serial_index_t) { return (int)out.read(); } int available() { return (int)out.available(); } int read() { return (int)out.read(); } + SerialFeature features(serial_index_t index) const { return CALL_IF_EXISTS(SerialFeature, &out, features, index); } ForwardSerial(const bool e, SerialT & out) : BaseClassT(e), out(out) {} }; @@ -163,9 +167,15 @@ struct RuntimeSerial : public SerialBase< RuntimeSerial >, public Seria // Underlying implementation might use Arduino's bool operator bool connected() { - return Private::HasMember_connected::value ? CALL_IF_EXISTS(bool, static_cast(this), connected) : static_cast(this)->operator bool(); + return Private::HasMember_connected::value + ? CALL_IF_EXISTS(bool, static_cast(this), connected) + : static_cast(this)->operator bool(); } - void flushTX() { CALL_IF_EXISTS(void, static_cast(this), flushTX); } + + void flushTX() { CALL_IF_EXISTS(void, static_cast(this), flushTX); } + + // Append Hookable for this class + SerialFeature features(serial_index_t index) const { return SerialFeature::Hookable | CALL_IF_EXISTS(SerialFeature, static_cast(this), features, index); } void setHook(WriteHook writeHook = 0, EndOfMessageHook eofHook = 0, void * userPointer = 0) { // Order is important here as serial code can be called inside interrupts @@ -251,6 +261,15 @@ struct MultiSerial : public SerialBase< MultiSerial> { // Existing instances implement Arduino's operator bool, so use that if it's available bool connected() { return Private::HasMember_connected::value ? CALL_IF_EXISTS(bool, &out, connected) : (bool)out; } void flushTX() { CALL_IF_EXISTS(void, &out, flushTX); } + SerialFeature features(serial_index_t index) const { return SerialFeature::MeatPack | CALL_IF_EXISTS(SerialFeature, &out, features, index); } + int available(serial_index_t index) { if (charCount) return charCount; // The buffer still has data diff --git a/Marlin/src/gcode/gcode_d.cpp b/Marlin/src/gcode/gcode_d.cpp index a683a330f1..8941523a16 100644 --- a/Marlin/src/gcode/gcode_d.cpp +++ b/Marlin/src/gcode/gcode_d.cpp @@ -167,6 +167,11 @@ dump_delay_accuracy_check(); break; + case 7: // D7 dump the current serial port type (hence configuration) + SERIAL_ECHOLNPAIR("Current serial configuration RX_BS:", RX_BUFFER_SIZE, ", TX_BS:", TX_BUFFER_SIZE); + SERIAL_ECHOLN(gtn(&SERIAL_IMPL)); + break; + case 100: { // D100 Disable heaters and attempt a hard hang (Watchdog Test) SERIAL_ECHOLNPGM("Disabling heaters and attempting to trigger Watchdog"); SERIAL_ECHOLNPGM("(USE_WATCHDOG " TERN(USE_WATCHDOG, "ENABLED", "DISABLED") ")"); diff --git a/Marlin/src/gcode/host/M115.cpp b/Marlin/src/gcode/host/M115.cpp index a518e68cf5..4f18e5504d 100644 --- a/Marlin/src/gcode/host/M115.cpp +++ b/Marlin/src/gcode/host/M115.cpp @@ -22,6 +22,8 @@ #include "../gcode.h" #include "../../inc/MarlinConfig.h" +#include "../queue.h" // for getting the command port + #if ENABLED(M115_GEOMETRY_REPORT) #include "../../module/motion.h" @@ -59,6 +61,9 @@ void GcodeSuite::M115() { #if ENABLED(EXTENDED_CAPABILITIES_REPORT) + // The port that sent M115 + serial_index_t port = queue.ring_buffer.command_port(); + // PAREN_COMMENTS TERN_(PAREN_COMMENTS, cap_line(PSTR("PAREN_COMMENTS"), true)); @@ -69,7 +74,7 @@ void GcodeSuite::M115() { cap_line(PSTR("SERIAL_XON_XOFF"), ENABLED(SERIAL_XON_XOFF)); // BINARY_FILE_TRANSFER (M28 B1) - cap_line(PSTR("BINARY_FILE_TRANSFER"), ENABLED(BINARY_FILE_TRANSFER)); + cap_line(PSTR("BINARY_FILE_TRANSFER"), ENABLED(BINARY_FILE_TRANSFER)); // TODO: Use SERIAL_IMPL.has_feature(port, SerialFeature::BinaryFileTransfer) once implemented // EEPROM (M500, M501) cap_line(PSTR("EEPROM"), ENABLED(EEPROM_SETTINGS)); @@ -148,7 +153,7 @@ void GcodeSuite::M115() { cap_line(PSTR("COOLER_TEMPERATURE"), ENABLED(HAS_COOLER)); // MEATPACK Compression - cap_line(PSTR("MEATPACK"), ENABLED(HAS_MEATPACK)); + cap_line(PSTR("MEATPACK"), SERIAL_IMPL.has_feature(port, SerialFeature::MeatPack)); // Machine Geometry #if ENABLED(M115_GEOMETRY_REPORT) From 6e0b79a33b7e6d5405be6d0ae5b16e5f3fd62fac Mon Sep 17 00:00:00 2001 From: Victor Oliveira Date: Mon, 29 Mar 2021 23:52:30 -0300 Subject: [PATCH 230/253] Fix and add STM32 SDIO DMA (#21476) --- .../src/HAL/STM32/Sd2Card_sdio_stm32duino.cpp | 219 ++++++++++-------- Marlin/src/gcode/gcode_d.cpp | 105 +++++++-- 2 files changed, 199 insertions(+), 125 deletions(-) diff --git a/Marlin/src/HAL/STM32/Sd2Card_sdio_stm32duino.cpp b/Marlin/src/HAL/STM32/Sd2Card_sdio_stm32duino.cpp index fc9b960c1c..824142b889 100644 --- a/Marlin/src/HAL/STM32/Sd2Card_sdio_stm32duino.cpp +++ b/Marlin/src/HAL/STM32/Sd2Card_sdio_stm32duino.cpp @@ -36,9 +36,10 @@ // use USB drivers - extern "C" { int8_t SD_MSC_Read(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len); - int8_t SD_MSC_Write(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len); - extern SD_HandleTypeDef hsd; + extern "C" { + int8_t SD_MSC_Read(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len); + int8_t SD_MSC_Write(uint8_t lun, uint8_t *buf, uint32_t blk_addr, uint16_t blk_len); + extern SD_HandleTypeDef hsd; } bool SDIO_Init() { @@ -75,7 +76,18 @@ #error "ERROR - Only STM32F103xE, STM32F103xG, STM32F4xx or STM32F7xx CPUs supported" #endif + // Fixed + #define SDIO_D0_PIN PC8 + #define SDIO_D1_PIN PC9 + #define SDIO_D2_PIN PC10 + #define SDIO_D3_PIN PC11 + #define SDIO_CK_PIN PC12 + #define SDIO_CMD_PIN PD2 + SD_HandleTypeDef hsd; // create SDIO structure + // F4 support one dma for RX and another for TX. + // But Marlin will never do read and write at same time, so we use always one dma for both. + DMA_HandleTypeDef hdma_sdio; /* SDIO_INIT_CLK_DIV is 118 @@ -96,12 +108,12 @@ // Target Clock, configurable. Default is 18MHz, from STM32F1 #ifndef SDIO_CLOCK - #define SDIO_CLOCK 18000000 /* 18 MHz */ + #define SDIO_CLOCK 18000000 // 18 MHz #endif // SDIO retries, configurable. Default is 3, from STM32F1 #ifndef SDIO_READ_RETRIES - #define SDIO_READ_RETRIES 3 + #define SDIO_READ_RETRIES 3 #endif // SDIO Max Clock (naming from STM Manual, don't change) @@ -120,24 +132,21 @@ } void go_to_transfer_speed() { - SD_InitTypeDef Init; - /* Default SDIO peripheral configuration for SD card initialization */ - Init.ClockEdge = hsd.Init.ClockEdge; - Init.ClockBypass = hsd.Init.ClockBypass; - Init.ClockPowerSave = hsd.Init.ClockPowerSave; - Init.BusWide = hsd.Init.BusWide; - Init.HardwareFlowControl = hsd.Init.HardwareFlowControl; - Init.ClockDiv = clock_to_divider(SDIO_CLOCK); + hsd.Init.ClockEdge = hsd.Init.ClockEdge; + hsd.Init.ClockBypass = hsd.Init.ClockBypass; + hsd.Init.ClockPowerSave = hsd.Init.ClockPowerSave; + hsd.Init.BusWide = hsd.Init.BusWide; + hsd.Init.HardwareFlowControl = hsd.Init.HardwareFlowControl; + hsd.Init.ClockDiv = clock_to_divider(SDIO_CLOCK); /* Initialize SDIO peripheral interface with default configuration */ - SDIO_Init(hsd.Instance, Init); + SDIO_Init(hsd.Instance, hsd.Init); } void SD_LowLevel_Init(void) { uint32_t tempreg; - __HAL_RCC_SDIO_CLK_ENABLE(); __HAL_RCC_GPIOC_CLK_ENABLE(); //enable GPIO clocks __HAL_RCC_GPIOD_CLK_ENABLE(); //enable GPIO clocks @@ -163,11 +172,45 @@ GPIO_InitStruct.Pin = GPIO_PIN_2; HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); - #if DISABLED(STM32F1xx) - // TODO: use __HAL_RCC_SDIO_RELEASE_RESET() and __HAL_RCC_SDIO_CLK_ENABLE(); - RCC->APB2RSTR &= ~RCC_APB2RSTR_SDIORST_Msk; // take SDIO out of reset - RCC->APB2ENR |= RCC_APB2RSTR_SDIORST_Msk; // enable SDIO clock - // Enable the DMA2 Clock + // Setup DMA + #if defined(STM32F1xx) + hdma_sdio.Init.Mode = DMA_NORMAL; + hdma_sdio.Instance = DMA2_Channel4; + HAL_NVIC_EnableIRQ(DMA2_Channel4_5_IRQn); + #elif defined(STM32F4xx) + hdma_sdio.Init.Mode = DMA_PFCTRL; + hdma_sdio.Instance = DMA2_Stream3; + hdma_sdio.Init.Channel = DMA_CHANNEL_4; + hdma_sdio.Init.FIFOMode = DMA_FIFOMODE_ENABLE; + hdma_sdio.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL; + hdma_sdio.Init.MemBurst = DMA_MBURST_INC4; + hdma_sdio.Init.PeriphBurst = DMA_PBURST_INC4; + HAL_NVIC_EnableIRQ(DMA2_Stream3_IRQn); + #endif + HAL_NVIC_EnableIRQ(SDIO_IRQn); + hdma_sdio.Init.PeriphInc = DMA_PINC_DISABLE; + hdma_sdio.Init.MemInc = DMA_MINC_ENABLE; + hdma_sdio.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD; + hdma_sdio.Init.MemDataAlignment = DMA_MDATAALIGN_WORD; + hdma_sdio.Init.Priority = DMA_PRIORITY_LOW; + __HAL_LINKDMA(&hsd, hdmarx, hdma_sdio); + __HAL_LINKDMA(&hsd, hdmatx, hdma_sdio); + + #if defined(STM32F1xx) + __HAL_RCC_SDIO_CLK_ENABLE(); + __HAL_RCC_DMA2_CLK_ENABLE(); + #else + __HAL_RCC_SDIO_FORCE_RESET(); + delay(2); + __HAL_RCC_SDIO_RELEASE_RESET(); + delay(2); + __HAL_RCC_SDIO_CLK_ENABLE(); + + __HAL_RCC_DMA2_FORCE_RESET(); + delay(2); + __HAL_RCC_DMA2_RELEASE_RESET(); + delay(2); + __HAL_RCC_DMA2_CLK_ENABLE(); #endif //Initialize the SDIO (with initial <400Khz Clock) @@ -179,6 +222,7 @@ // Power up the SDIO SDIO_PowerState_ON(SDIO); + hsd.Instance = SDIO; } void HAL_SD_MspInit(SD_HandleTypeDef *hsd) { // application specific init @@ -222,107 +266,82 @@ if (!status) break; if (!--retry_Cnt) return false; // return failing status if retries are exhausted } + go_to_transfer_speed(); } #endif return true; } - /* - void init_SDIO_pins(void) { - GPIO_InitTypeDef GPIO_InitStruct = {0}; - // SDIO GPIO Configuration - // PC8 ------> SDIO_D0 - // PC12 ------> SDIO_CK - // PD2 ------> SDIO_CMD + static bool SDIO_ReadWriteBlock_DMA(uint32_t block, const uint8_t *src, uint8_t *dst) { + if(HAL_SD_GetCardState(&hsd) != HAL_SD_CARD_TRANSFER) return false; - GPIO_InitStruct.Pin = GPIO_PIN_8; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; - GPIO_InitStruct.Alternate = GPIO_AF12_SDIO; - HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + TERN_(USE_WATCHDOG, HAL_watchdog_refresh()); - GPIO_InitStruct.Pin = GPIO_PIN_12; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; - GPIO_InitStruct.Alternate = GPIO_AF12_SDIO; - HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); - - GPIO_InitStruct.Pin = GPIO_PIN_2; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; - GPIO_InitStruct.Alternate = GPIO_AF12_SDIO; - HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); - } - */ - //bool SDIO_init() { return (bool) (SD_SDIO_Init() ? 1 : 0);} - //bool SDIO_Init_C() { return (bool) (SD_SDIO_Init() ? 1 : 0);} - - bool SDIO_ReadBlock(uint32_t block, uint8_t *dst) { - hsd.Instance = SDIO; - uint8_t retryCnt = SDIO_READ_RETRIES; - - bool status; - for (;;) { - TERN_(USE_WATCHDOG, HAL_watchdog_refresh()); - status = (bool) HAL_SD_ReadBlocks(&hsd, (uint8_t*)dst, block, 1, 1000); // read one 512 byte block with 500mS timeout - status |= (bool) HAL_SD_GetCardState(&hsd); // make sure all is OK - if (!status) break; // return passing status - if (!--retryCnt) break; // return failing status if retries are exhausted + HAL_StatusTypeDef ret; + if (src) { + hdma_sdio.Init.Direction = DMA_MEMORY_TO_PERIPH; + HAL_DMA_Init(&hdma_sdio); + ret = HAL_SD_WriteBlocks_DMA(&hsd, (uint8_t *)src, block, 1); + } + else { + hdma_sdio.Init.Direction = DMA_PERIPH_TO_MEMORY; + HAL_DMA_Init(&hdma_sdio); + ret = HAL_SD_ReadBlocks_DMA(&hsd, (uint8_t *)dst, block, 1); } - return status; - /* - return (bool) ((status_read | status_card) ? 1 : 0); - - if (SDIO_GetCardState() != SDIO_CARD_TRANSFER) return false; - if (blockAddress >= SdCard.LogBlockNbr) return false; - if ((0x03 & (uint32_t)data)) return false; // misaligned data - - if (SdCard.CardType != CARD_SDHC_SDXC) { blockAddress *= 512U; } - - if (!SDIO_CmdReadSingleBlock(blockAddress)) { - SDIO_CLEAR_FLAG(SDIO_ICR_CMD_FLAGS); - dma_disable(SDIO_DMA_DEV, SDIO_DMA_CHANNEL); + if (ret != HAL_OK) { + HAL_DMA_Abort_IT(&hdma_sdio); + HAL_DMA_DeInit(&hdma_sdio); return false; } - while (!SDIO_GET_FLAG(SDIO_STA_DATAEND | SDIO_STA_TRX_ERROR_FLAGS)) {} - - dma_disable(SDIO_DMA_DEV, SDIO_DMA_CHANNEL); - - if (SDIO->STA & SDIO_STA_RXDAVL) { - while (SDIO->STA & SDIO_STA_RXDAVL) (void)SDIO->FIFO; - SDIO_CLEAR_FLAG(SDIO_ICR_CMD_FLAGS | SDIO_ICR_DATA_FLAGS); - return false; + uint32_t timeout = millis() + 500; + // Wait the transfer + while (hsd.State != HAL_SD_STATE_READY) { + if (millis() > timeout) { + HAL_DMA_Abort_IT(&hdma_sdio); + HAL_DMA_DeInit(&hdma_sdio); + return false; + } } - if (SDIO_GET_FLAG(SDIO_STA_TRX_ERROR_FLAGS)) { - SDIO_CLEAR_FLAG(SDIO_ICR_CMD_FLAGS | SDIO_ICR_DATA_FLAGS); - return false; - } - SDIO_CLEAR_FLAG(SDIO_ICR_CMD_FLAGS | SDIO_ICR_DATA_FLAGS); - */ + while (__HAL_DMA_GET_FLAG(&hdma_sdio, __HAL_DMA_GET_TC_FLAG_INDEX(&hdma_sdio)) != 0 + || __HAL_DMA_GET_FLAG(&hdma_sdio, __HAL_DMA_GET_TE_FLAG_INDEX(&hdma_sdio)) != 0) { /* nada */ } + + HAL_DMA_Abort_IT(&hdma_sdio); + HAL_DMA_DeInit(&hdma_sdio); + + timeout = millis() + 500; + while (HAL_SD_GetCardState(&hsd) != HAL_SD_CARD_TRANSFER) + if (millis() > timeout) return false; return true; } - bool SDIO_WriteBlock(uint32_t block, const uint8_t *src) { - hsd.Instance = SDIO; - uint8_t retryCnt = SDIO_READ_RETRIES; - bool status; - for (;;) { - status = (bool) HAL_SD_WriteBlocks(&hsd, (uint8_t*)src, block, 1, 500); // write one 512 byte block with 500mS timeout - status |= (bool) HAL_SD_GetCardState(&hsd); // make sure all is OK - if (!status) break; // return passing status - if (!--retryCnt) break; // return failing status if retries are exhausted - } - return status; + bool SDIO_ReadBlock(uint32_t block, uint8_t *dst) { + uint8_t retries = SDIO_READ_RETRIES; + while (retries--) if (SDIO_ReadWriteBlock_DMA(block, NULL, dst)) return true; + return false; } + bool SDIO_WriteBlock(uint32_t block, const uint8_t *src) { + uint8_t retries = SDIO_READ_RETRIES; + while (retries--) if (SDIO_ReadWriteBlock_DMA(block, src, NULL)) return true; + return false; + } + + #if defined(STM32F1xx) + #define DMA_IRQ_HANDLER DMA2_Channel4_5_IRQHandler + #elif defined(STM32F4xx) + #define DMA_IRQ_HANDLER DMA2_Stream3_IRQHandler + #else + #error "Unknown STM32 architecture." + #endif + + extern "C" void SDIO_IRQHandler(void) { HAL_SD_IRQHandler(&hsd); } + extern "C" void DMA_IRQ_HANDLER(void) { HAL_DMA_IRQHandler(&hdma_sdio); } + #endif // !USBD_USE_CDC_COMPOSITE #endif // SDIO_SUPPORT #endif // ARDUINO_ARCH_STM32 && !STM32GENERIC diff --git a/Marlin/src/gcode/gcode_d.cpp b/Marlin/src/gcode/gcode_d.cpp index 8941523a16..f87cebc886 100644 --- a/Marlin/src/gcode/gcode_d.cpp +++ b/Marlin/src/gcode/gcode_d.cpp @@ -29,6 +29,7 @@ #include "../libs/hex_print.h" #include "../HAL/shared/eeprom_if.h" #include "../HAL/shared/Delay.h" + #include "../sd/cardreader.h" extern void dump_delay_accuracy_check(); @@ -126,19 +127,19 @@ #endif case 4: { // D4 Read / Write PIN - // const uint8_t pin = parser.byteval('P'); - // const bool is_out = parser.boolval('F'), - // val = parser.byteval('V', LOW); + //const bool is_out = parser.boolval('F'); + //const uint8_t pin = parser.byteval('P'), + // val = parser.byteval('V', LOW); if (parser.seenval('X')) { // TODO: Write the hex bytes after the X //while (len--) { //} } else { - // while (len--) { - // TODO: Read bytes from EEPROM - // print_hex_byte(eeprom_read_byte(*(adr++)); - // } + //while (len--) { + //// TODO: Read bytes from EEPROM + // print_hex_byte(eeprom_read_byte(adr++)); + //} SERIAL_EOL(); } } break; @@ -155,10 +156,10 @@ //while (len--) {} } else { - // while (len--) { - // TODO: Read bytes from EEPROM - // print_hex_byte(eeprom_read_byte(adr++)); - // } + //while (len--) { + //// TODO: Read bytes from EEPROM + // print_hex_byte(eeprom_read_byte(adr++)); + //} SERIAL_EOL(); } } break; @@ -186,22 +187,76 @@ SERIAL_ECHOLNPGM("FAILURE: Watchdog did not trigger board reset."); } break; - #if ENABLED(POSTMORTEM_DEBUGGING) - case 451: { // Trigger all kind of faults to test exception catcher - SERIAL_ECHOLNPGM("Disabling heaters"); - thermalManager.disable_all_heaters(); - delay(1000); // Allow time to print - volatile uint8_t type[5] = { parser.byteval('T', 1) }; + #if ENABLED(SDSUPPORT) - // The code below is obviously wrong and it's full of quirks to fool the compiler from optimizing away the code - switch (type[0]) { - case 1: default: *(int*)0 = 451; break; // Write at bad address - case 2: { volatile int a = 0; volatile int b = 452 / a; *(int*)&a = b; } break; // Divide by zero (some CPUs accept this, like ARM) - case 3: { *(uint32_t*)&type[1] = 453; volatile int a = *(int*)&type[1]; type[0] = a / 255; } break; // Unaligned access (some CPUs accept this) - case 4: { volatile void (*func)() = (volatile void (*)()) 0xE0000000; func(); } break; // Invalid instruction + case 101: { // D101 Test SD Write + card.openFileWrite("test.gco"); + if (!card.isFileOpen()) { + SERIAL_ECHOLNPAIR("Failed to open test.gco to write."); + return; + } + __attribute__((aligned(sizeof(size_t)))) uint8_t buf[512]; + + uint16_t c; + for (c = 0; c < COUNT(buf); c++) + buf[c] = 'A' + (c % ('Z' - 'A')); + + c = 1024 * 4; + while (c--) { + TERN_(USE_WATCHDOG, watchdog_refresh()); + card.write(buf, COUNT(buf)); + } + SERIAL_ECHOLNPGM(" done"); + card.closefile(); + } break; + + case 102: { // D102 Test SD Read + card.openFileRead("test.gco"); + if (!card.isFileOpen()) { + SERIAL_ECHOLNPAIR("Failed to open test.gco to read."); + return; + } + __attribute__((aligned(sizeof(size_t)))) uint8_t buf[512]; + uint16_t c = 1024 * 4; + while (c--) { + TERN_(USE_WATCHDOG, watchdog_refresh()); + card.read(buf, COUNT(buf)); + bool error = false; + for (uint16_t i = 0; i < COUNT(buf); i++) { + if (buf[i] != ('A' + (i % ('Z' - 'A')))) { + error = true; + break; + } + } + if (error) { + SERIAL_ECHOLNPGM(" Read error!"); + break; + } + } + SERIAL_ECHOLNPGM(" done"); + card.closefile(); + } break; + + #endif // SDSUPPORT + + #if ENABLED(POSTMORTEM_DEBUGGING) + + case 451: { // Trigger all kind of faults to test exception catcher + SERIAL_ECHOLNPGM("Disabling heaters"); + thermalManager.disable_all_heaters(); + delay(1000); // Allow time to print + volatile uint8_t type[5] = { parser.byteval('T', 1) }; + + // The code below is obviously wrong and it's full of quirks to fool the compiler from optimizing away the code + switch (type[0]) { + case 1: default: *(int*)0 = 451; break; // Write at bad address + case 2: { volatile int a = 0; volatile int b = 452 / a; *(int*)&a = b; } break; // Divide by zero (some CPUs accept this, like ARM) + case 3: { *(uint32_t*)&type[1] = 453; volatile int a = *(int*)&type[1]; type[0] = a / 255; } break; // Unaligned access (some CPUs accept this) + case 4: { volatile void (*func)() = (volatile void (*)()) 0xE0000000; func(); } break; // Invalid instruction + } + break; } - break; - } + #endif } } From f43b250ed2f32bf2423e234b1c40d655bf4c484c Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 29 Mar 2021 21:10:55 -0500 Subject: [PATCH 231/253] Adjust microsteps alignment --- Marlin/Configuration_adv.h | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/Marlin/Configuration_adv.h b/Marlin/Configuration_adv.h index d3ad971e6d..a2f357501b 100644 --- a/Marlin/Configuration_adv.h +++ b/Marlin/Configuration_adv.h @@ -2507,7 +2507,7 @@ #if AXIS_IS_TMC(E1) #define E1_CURRENT 800 - #define E1_MICROSTEPS E0_MICROSTEPS + #define E1_MICROSTEPS E0_MICROSTEPS #define E1_RSENSE 0.11 #define E1_CHAIN_POS -1 //#define E1_INTERPOLATE true @@ -2515,7 +2515,7 @@ #if AXIS_IS_TMC(E2) #define E2_CURRENT 800 - #define E2_MICROSTEPS E0_MICROSTEPS + #define E2_MICROSTEPS E0_MICROSTEPS #define E2_RSENSE 0.11 #define E2_CHAIN_POS -1 //#define E2_INTERPOLATE true @@ -2523,7 +2523,7 @@ #if AXIS_IS_TMC(E3) #define E3_CURRENT 800 - #define E3_MICROSTEPS E0_MICROSTEPS + #define E3_MICROSTEPS E0_MICROSTEPS #define E3_RSENSE 0.11 #define E3_CHAIN_POS -1 //#define E3_INTERPOLATE true @@ -2531,7 +2531,7 @@ #if AXIS_IS_TMC(E4) #define E4_CURRENT 800 - #define E4_MICROSTEPS E0_MICROSTEPS + #define E4_MICROSTEPS E0_MICROSTEPS #define E4_RSENSE 0.11 #define E4_CHAIN_POS -1 //#define E4_INTERPOLATE true @@ -2539,7 +2539,7 @@ #if AXIS_IS_TMC(E5) #define E5_CURRENT 800 - #define E5_MICROSTEPS E0_MICROSTEPS + #define E5_MICROSTEPS E0_MICROSTEPS #define E5_RSENSE 0.11 #define E5_CHAIN_POS -1 //#define E5_INTERPOLATE true @@ -2547,7 +2547,7 @@ #if AXIS_IS_TMC(E6) #define E6_CURRENT 800 - #define E6_MICROSTEPS E0_MICROSTEPS + #define E6_MICROSTEPS E0_MICROSTEPS #define E6_RSENSE 0.11 #define E6_CHAIN_POS -1 //#define E6_INTERPOLATE true @@ -2555,7 +2555,7 @@ #if AXIS_IS_TMC(E7) #define E7_CURRENT 800 - #define E7_MICROSTEPS E0_MICROSTEPS + #define E7_MICROSTEPS E0_MICROSTEPS #define E7_RSENSE 0.11 #define E7_CHAIN_POS -1 //#define E7_INTERPOLATE true From 0f2309054520f4186502a6ebd84042713359ac8a Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Mon, 29 Mar 2021 22:38:33 -0500 Subject: [PATCH 232/253] Serial flags followup Followup to #21318 --- Marlin/src/core/serial_base.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/core/serial_base.h b/Marlin/src/core/serial_base.h index cdea70e2c5..8b23816b17 100644 --- a/Marlin/src/core/serial_base.h +++ b/Marlin/src/core/serial_base.h @@ -124,7 +124,7 @@ struct SerialBase { SerialFeature features(serial_index_t index=0) const { return static_cast(this)->features(index); } // Check if the serial port has a feature - bool has_feature(serial_index_t index, SerialFeature flag) const { (features(index) & flag) != SerialFeature::None; } + bool has_feature(serial_index_t index, SerialFeature flag) const { return (features(index) & flag) != SerialFeature::None; } // Check if the serial port is connected (usually bypassed) bool connected() const { return SerialChild->connected(); } From 6175802693390509e812c31ba134949a4b6eaf6a Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Wed, 31 Mar 2021 00:29:24 +0000 Subject: [PATCH 233/253] [cron] Bump distribution date (2021-03-31) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 2e71c2231b..2930228b14 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2021-03-30" + #define STRING_DISTRIBUTION_DATE "2021-03-31" #endif /** From df297b6ca3bac1b65a36cf6af685cd7b11c34639 Mon Sep 17 00:00:00 2001 From: Marco van Wieringen Date: Wed, 31 Mar 2021 03:11:33 +0200 Subject: [PATCH 234/253] Fix FYSETC_S6 heaters pins (#21483) When adding support FYSETC Spider board the S6 pins file was broken. --- Marlin/src/pins/stm32f4/pins_FYSETC_S6.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h b/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h index e6420dc238..7aeab0196a 100644 --- a/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h +++ b/Marlin/src/pins/stm32f4/pins_FYSETC_S6.h @@ -171,13 +171,13 @@ #ifndef HEATER_0_PIN #define HEATER_0_PIN PB3 #endif -#ifndef HEATER_0_PIN +#ifndef HEATER_1_PIN #define HEATER_1_PIN PB4 #endif -#ifndef HEATER_0_PIN +#ifndef HEATER_2_PIN #define HEATER_2_PIN PB15 #endif -#ifndef HEATER_0_PIN +#ifndef HEATER_BED_PIN #define HEATER_BED_PIN PC8 #endif From 20d2061f22790bb30cf3b934bef2be54d931293e Mon Sep 17 00:00:00 2001 From: Ramiro Polla Date: Wed, 31 Mar 2021 04:20:33 +0200 Subject: [PATCH 235/253] Optimized string-to-number functions (#21484) --- Marlin/src/gcode/parser.cpp | 140 ++++++++++++++++++ Marlin/src/gcode/parser.h | 29 +--- Marlin/src/gcode/queue.cpp | 8 +- .../src/lcd/extui/lib/mks_ui/wifi_module.cpp | 2 +- 4 files changed, 153 insertions(+), 26 deletions(-) diff --git a/Marlin/src/gcode/parser.cpp b/Marlin/src/gcode/parser.cpp index ebe9d3b2cd..6eb56126e1 100644 --- a/Marlin/src/gcode/parser.cpp +++ b/Marlin/src/gcode/parser.cpp @@ -28,6 +28,146 @@ #include "../MarlinCore.h" +#ifdef __AVR__ + + static FORCE_INLINE uint32_t mult10(uint32_t val) { + uint32_t tmp = val; + __asm__ __volatile__ ( + "add %A[tmp], %A[tmp]\n" + "adc %B[tmp], %B[tmp]\n" + "adc %C[tmp], %C[tmp]\n" + "adc %D[tmp], %D[tmp]\n" + "add %A[tmp], %A[tmp]\n" + "adc %B[tmp], %B[tmp]\n" + "adc %C[tmp], %C[tmp]\n" + "adc %D[tmp], %D[tmp]\n" + "add %A[val], %A[tmp]\n" + "adc %B[val], %B[tmp]\n" + "adc %C[val], %C[tmp]\n" + "adc %D[val], %D[tmp]\n" + "add %A[val], %A[val]\n" + "adc %B[val], %B[val]\n" + "adc %C[val], %C[val]\n" + "adc %D[val], %D[val]\n" + : [val] "+&r" (val), + [tmp] "+&r" (tmp) + ); + return val; + } + +#else + + static FORCE_INLINE uint32_t mult10(uint32_t val) { return val * 10; } + +#endif + +// cheap base-10 strto(u)l. +// does not check for errors. +int32_t parse_int32(const char *buf) { + char c; + + // Get a char, skipping leading spaces + do { c = *buf++; } while (c == ' '); + + // check for sign + bool is_negative = (c == '-'); + if (is_negative || c == '+') + c = *buf++; + + // optimization for first digit (no multiplication) + uint8_t uc = c - '0'; + if (uc > 9) return 0; + + // read unsigned value + uint32_t uval = uc; + while (true) { + c = *buf++; + uc = c - '0'; + if (uc > 9) break; + uval = mult10(uval) + uc; + } + + return is_negative ? -uval : uval; +} + +// cheap strtof. +// does not support nan/infinity or exponent notation. +// does not check for errors. +float parse_float(const char *buf) { + char c; + + // Get a char, skipping leading spaces + do { c = *buf++; } while (c == ' '); + + // check for sign + bool is_negative = (c == '-'); + if (is_negative || c == '+') + c = *buf++; + + // read unsigned value and decimal point + uint32_t uval; + uint8_t exp_dec; + uint8_t uc = c - '0'; + if (uc <= 9) { + uval = uc; + exp_dec = 0; + } + else { + if (c != '.') return 0; + uval = 0; + exp_dec = 1; + } + + int8_t exp = 0; + while (true) { + c = *buf++; + uc = c - '0'; + if (uc <= 9) { + exp -= exp_dec; + uval = mult10(uval) + uc; + if (uval >= (UINT32_MAX - 9) / 10) { + // overflow. keep reading digits until decimal point. + while (exp_dec == 0) { + c = *buf++; + uc = c - '0'; + if (uc > 9) break; + exp++; + } + goto overflow; + } + } + else { + if (c != '.' || exp_dec != 0) break; + exp_dec = 1; + } + } + + // early return for 0 + if (uval == 0) return 0; + + overflow: + + // convert to float and apply sign + float fval = uval; + if (is_negative) fval *= -1; + + // apply exponent (up to 1e-15 / 1e+15) + if (exp < 0) { + if (exp <= -8) { fval *= 1e-8; exp += 8; } + if (exp <= -4) { fval *= 1e-4; exp += 4; } + if (exp <= -2) { fval *= 1e-2; exp += 2; } + if (exp <= -1) { fval *= 1e-1; exp += 1; } + } + else if (exp > 0) { + if (exp >= 8) { fval *= 1e+8; exp -= 8; } + if (exp >= 4) { fval *= 1e+4; exp -= 4; } + if (exp >= 2) { fval *= 1e+2; exp -= 2; } + if (exp >= 1) { fval *= 1e+1; exp -= 1; } + } + + return fval; +} + // Must be declared for allocation and to satisfy the linker // Zero values need no initialization. diff --git a/Marlin/src/gcode/parser.h b/Marlin/src/gcode/parser.h index b21c930cfa..ed503f8a90 100644 --- a/Marlin/src/gcode/parser.h +++ b/Marlin/src/gcode/parser.h @@ -42,6 +42,10 @@ typedef enum : uint8_t { LINEARUNIT_MM, LINEARUNIT_INCH } LinearUnit; #endif + +int32_t parse_int32(const char *buf); +float parse_float(const char *buf); + /** * GCode parser * @@ -256,29 +260,12 @@ public: // The value as a string static inline char* value_string() { return value_ptr; } - // Float removes 'E' to prevent scientific notation interpretation - static inline float value_float() { - if (value_ptr) { - char *e = value_ptr; - for (;;) { - const char c = *e; - if (c == '\0' || c == ' ') break; - if (c == 'E' || c == 'e') { - *e = '\0'; - const float ret = strtof(value_ptr, nullptr); - *e = c; - return ret; - } - ++e; - } - return strtof(value_ptr, nullptr); - } - return 0; - } + // Code value as float + static inline float value_float() { return value_ptr ? parse_float(value_ptr) : 0.0; } // Code value as a long or ulong - static inline int32_t value_long() { return value_ptr ? strtol(value_ptr, nullptr, 10) : 0L; } - static inline uint32_t value_ulong() { return value_ptr ? strtoul(value_ptr, nullptr, 10) : 0UL; } + static inline int32_t value_long() { return value_ptr ? parse_int32(value_ptr) : 0L; } + static inline uint32_t value_ulong() { return value_ptr ? parse_int32(value_ptr) : 0UL; } // Code value for use as time static inline millis_t value_millis() { return value_ulong(); } diff --git a/Marlin/src/gcode/queue.cpp b/Marlin/src/gcode/queue.cpp index a79909917e..eb7ad79102 100644 --- a/Marlin/src/gcode/queue.cpp +++ b/Marlin/src/gcode/queue.cpp @@ -445,7 +445,7 @@ void GCodeQueue::get_serial_commands() { if (process_line_done(serial.input_state, serial.line_buffer, serial.count)) continue; - char* command = serial.line_buffer; + char *command = serial.line_buffer; while (*command == ' ') command++; // Skip leading spaces char *npos = (*command == 'N') ? command : nullptr; // Require the N parameter to start the line @@ -459,7 +459,7 @@ void GCodeQueue::get_serial_commands() { if (n2pos) npos = n2pos; } - const long gcode_N = strtol(npos + 1, nullptr, 10); + const long gcode_N = parse_int32(npos + 1); if (gcode_N != serial.last_N + 1 && !M110) { // In case of error on a serial port, don't prevent other serial port from making progress @@ -471,7 +471,7 @@ void GCodeQueue::get_serial_commands() { if (apos) { uint8_t checksum = 0, count = uint8_t(apos - command); while (count) checksum ^= command[--count]; - if (strtol(apos + 1, nullptr, 10) != checksum) { + if (parse_int32(apos + 1) != checksum) { // In case of error on a serial port, don't prevent other serial port from making progress gcode_line_error(PSTR(STR_ERR_CHECKSUM_MISMATCH), p); break; @@ -500,7 +500,7 @@ void GCodeQueue::get_serial_commands() { if (IsStopped()) { char* gpos = strchr(command, 'G'); if (gpos) { - switch (strtol(gpos + 1, nullptr, 10)) { + switch (parse_int32(gpos + 1)) { case 0: case 1: #if ENABLED(ARC_SUPPORT) case 2: case 3: diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp index a74ecd2f1e..ac07dc0102 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.cpp @@ -1799,7 +1799,7 @@ void get_wifi_commands() { if (IsStopped()) { char* gpos = strchr(command, 'G'); if (gpos) { - switch (strtol(gpos + 1, nullptr, 10)) { + switch (parse_int32(gpos + 1)) { case 0 ... 1: #if ENABLED(ARC_SUPPORT) case 2 ... 3: From 7573524a1437faa7cecdd9e5611f61db667923ef Mon Sep 17 00:00:00 2001 From: Marcio T Date: Tue, 30 Mar 2021 20:23:43 -0600 Subject: [PATCH 236/253] FTDI Touch UI fix and reorganize (#21487) --- .../{extras => extended}/adjuster_widget.cpp | 49 ++++---- .../{extras => extended}/adjuster_widget.h | 31 ++--- .../extended/circular_progress.cpp | 108 ++++++++++++++++++ .../ftdi_eve_lib/extended/circular_progress.h | 27 +++++ .../ftdi_eve_lib/extended/ftdi_extended.h | 3 + .../{extras => extended}/poly_ui.h | 0 .../ftdi_eve_lib/extras/circular_progress.h | 105 ----------------- .../{extras => scripts}/bitmap2cpp.py | 0 .../{extras => scripts}/svg2cpp.py | 0 .../screens/bed_mesh_screen.cpp | 2 - .../screens/bio_printing_dialog_box.cpp | 2 - .../screens/bio_status_screen.cpp | 2 - .../ftdi_eve_touch_ui/screens/boot_screen.cpp | 1 - .../screens/cocoa_press_load_chocolate.cpp | 2 - .../screens/cocoa_press_preheat_screen.cpp | 2 - .../screens/cocoa_press_status_screen.cpp | 2 - .../lib/ftdi_eve_touch_ui/screens/screens.h | 4 + 17 files changed, 184 insertions(+), 156 deletions(-) rename Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/{extras => extended}/adjuster_widget.cpp (59%) rename Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/{extras => extended}/adjuster_widget.h (74%) create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/circular_progress.cpp create mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/circular_progress.h rename Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/{extras => extended}/poly_ui.h (100%) delete mode 100644 Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/circular_progress.h rename Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/{extras => scripts}/bitmap2cpp.py (100%) rename Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/{extras => scripts}/svg2cpp.py (100%) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/adjuster_widget.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/adjuster_widget.cpp similarity index 59% rename from Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/adjuster_widget.cpp rename to Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/adjuster_widget.cpp index ef3cb565d2..26be9f4e59 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/adjuster_widget.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/adjuster_widget.cpp @@ -19,10 +19,9 @@ * location: . * ****************************************************************************/ -#include "../ftdi_eve_lib.h" -#include "../extended/grid_layout.h" +#include "ftdi_extended.h" -#include "adjuster_widget.h" +#if ENABLED(FTDI_EXTENDED) #define SUB_COLS 9 #define SUB_ROWS 1 @@ -30,28 +29,32 @@ #define INC_POS SUB_POS(6,1), SUB_SIZE(2,1) #define DEC_POS SUB_POS(8,1), SUB_SIZE(2,1) -void draw_adjuster_value(CommandProcessor& cmd, int16_t x, int16_t y, int16_t w, int16_t h, float value, progmem_str units, int8_t width, uint8_t precision) { - char str[width + precision + 10 + (units ? strlen_P((const char*) units) : 0)]; - if (isnan(value)) - strcpy_P(str, PSTR("-")); - else - dtostrf(value, width, precision, str); +namespace FTDI { + void draw_adjuster_value(CommandProcessor& cmd, int16_t x, int16_t y, int16_t w, int16_t h, float value, progmem_str units, int8_t width, uint8_t precision) { + char str[width + precision + 10 + (units ? strlen_P((const char*) units) : 0)]; + if (isnan(value)) + strcpy_P(str, PSTR("-")); + else + dtostrf(value, width, precision, str); - if (units) { - strcat_P(str, PSTR(" ")); - strcat_P(str, (const char*) units); + if (units) { + strcat_P(str, PSTR(" ")); + strcat_P(str, (const char*) units); + } + + cmd.text(VAL_POS, str); } - cmd.text(VAL_POS, str); -} + void draw_adjuster(CommandProcessor& cmd, int16_t x, int16_t y, int16_t w, int16_t h, uint8_t tag, float value, progmem_str units, int8_t width, uint8_t precision, draw_mode_t what) { + if (what & BACKGROUND) + cmd.tag(0).button(VAL_POS, F(""), FTDI::OPT_FLAT); -void draw_adjuster(CommandProcessor& cmd, int16_t x, int16_t y, int16_t w, int16_t h, uint8_t tag, float value, progmem_str units, int8_t width, uint8_t precision, draw_mode_t what) { - if (what & BACKGROUND) - cmd.tag(0).button(VAL_POS, F(""), FTDI::OPT_FLAT); - - if (what & FOREGROUND) { - draw_adjuster_value(cmd, x, y, w, h, value, units, width, precision); - cmd.tag(tag ).button(INC_POS, F("-")) - .tag(tag+1).button(DEC_POS, F("+")); + if (what & FOREGROUND) { + draw_adjuster_value(cmd, x, y, w, h, value, units, width, precision); + cmd.tag(tag ).button(INC_POS, F("-")) + .tag(tag+1).button(DEC_POS, F("+")); + } } -} +} // namespace FTDI + +#endif // FTDI_EXTENDED diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/adjuster_widget.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/adjuster_widget.h similarity index 74% rename from Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/adjuster_widget.h rename to Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/adjuster_widget.h index 9b5cab0dfb..71f7398694 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/adjuster_widget.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/adjuster_widget.h @@ -20,20 +20,21 @@ ****************************************************************************/ #pragma once -#include "../extended/screen_types.h" -void draw_adjuster_value( - CommandProcessor& cmd, - int16_t x, int16_t y, int16_t w, int16_t h, - float value, progmem_str units = nullptr, - int8_t width = 5, uint8_t precision = 1 -); +namespace FTDI { + void draw_adjuster_value( + CommandProcessor& cmd, + int16_t x, int16_t y, int16_t w, int16_t h, + float value, progmem_str units = nullptr, + int8_t width = 5, uint8_t precision = 1 + ); -void draw_adjuster( - CommandProcessor& cmd, - int16_t x, int16_t y, int16_t w, int16_t h, - uint8_t tag, - float value, progmem_str units = nullptr, - int8_t width = 5, uint8_t precision = 1, - draw_mode_t what = BOTH -); + void draw_adjuster( + CommandProcessor& cmd, + int16_t x, int16_t y, int16_t w, int16_t h, + uint8_t tag, + float value, progmem_str units = nullptr, + int8_t width = 5, uint8_t precision = 1, + draw_mode_t what = BOTH + ); +} diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/circular_progress.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/circular_progress.cpp new file mode 100644 index 0000000000..32cc37d2e2 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/circular_progress.cpp @@ -0,0 +1,108 @@ +/************************* + * circular_progress.cpp * + *************************/ + +/**************************************************************************** + * Written By Marcio Teixeira 2019 - 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 "ftdi_extended.h" + +#if ENABLED(FTDI_EXTENDED) + +/* This function draws a circular progress "ring" */ +namespace FTDI { + void draw_circular_progress(CommandProcessor& cmd, int x, int y, int w, int h, float percent, char *text, uint32_t bgcolor, uint32_t fgcolor) { + const float rim = 0.3; + const float a = percent/100.0*2.0*PI; + const float a1 = min(PI/2, a); + const float a2 = min(PI/2, a-a1); + const float a3 = min(PI/2, a-a1-a2); + const float a4 = min(PI/2, a-a1-a2-a3); + + const int ro = min(w,h) * 8; + const int rr = ro * rim; + const int cx = x * 16 + w * 8; + const int cy = y * 16 + h * 8; + + // Load a rim shape into stencil buffer + cmd.cmd(SAVE_CONTEXT()); + cmd.cmd(TAG_MASK(0)); + cmd.cmd(CLEAR(0,1,0)); + cmd.cmd(COLOR_MASK(0,0,0,0)); + cmd.cmd(STENCIL_OP(STENCIL_OP_KEEP, STENCIL_OP_INVERT)); + cmd.cmd(STENCIL_FUNC(STENCIL_FUNC_ALWAYS, 255, 255)); + cmd.cmd(BEGIN(POINTS)); + cmd.cmd(POINT_SIZE(ro)); + cmd.cmd(VERTEX2F(cx, cy)); + cmd.cmd(POINT_SIZE(ro - rr)); + cmd.cmd(VERTEX2F(cx, cy)); + cmd.cmd(RESTORE_CONTEXT()); + + // Mask further drawing by stencil buffer + cmd.cmd(SAVE_CONTEXT()); + cmd.cmd(STENCIL_FUNC(STENCIL_FUNC_NOTEQUAL, 0, 255)); + + // Fill the background + cmd.cmd(COLOR_RGB(bgcolor)); + cmd.cmd(BEGIN(POINTS)); + cmd.cmd(POINT_SIZE(ro)); + cmd.cmd(VERTEX2F(cx, cy)); + cmd.cmd(COLOR_RGB(fgcolor)); + + // Paint upper-right quadrant + cmd.cmd(BEGIN(EDGE_STRIP_A)); + cmd.cmd(VERTEX2F(cx, cy)); + cmd.cmd(VERTEX2F(cx + ro*sin(a1) + 16,cy - ro*cos(a1) + 8)); + + // Paint lower-right quadrant + if (a > PI/2) { + cmd.cmd(BEGIN(EDGE_STRIP_R)); + cmd.cmd(VERTEX2F(cx, cy)); + cmd.cmd(VERTEX2F(cx + ro*cos(a2),cy + ro*sin(a2) + 16)); + } + + // Paint lower-left quadrant + if (a > PI) { + cmd.cmd(BEGIN(EDGE_STRIP_B)); + cmd.cmd(VERTEX2F(cx, cy)); + cmd.cmd(VERTEX2F(cx - ro*sin(a3) - 8,cy + ro*cos(a3))); + } + + // Paint upper-left quadrant + if (a > 1.5*PI) { + cmd.cmd(BEGIN(EDGE_STRIP_L)); + cmd.cmd(VERTEX2F(cx, cy)); + cmd.cmd(VERTEX2F(cx - ro*cos(a4),cy - ro*sin(a4))); + } + cmd.cmd(RESTORE_CONTEXT()); + + // Draw the text + + cmd.cmd(SAVE_CONTEXT()); + cmd.cmd(COLOR_RGB(fgcolor)); + cmd.text(x,y,w,h,text, OPT_CENTERX | OPT_CENTERY); + cmd.cmd(RESTORE_CONTEXT()); + } + + void draw_circular_progress(CommandProcessor& cmd, int x, int y, int w, int h, float percent, uint32_t bgcolor, uint32_t fgcolor) { + char str[5]; + sprintf(str,"%d\%%",int(percent)); + draw_circular_progress(cmd, x, y, w, h, percent, str, bgcolor, fgcolor); + } +} // namespace FTDI + +#endif // FTDI_EXTENDED diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/circular_progress.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/circular_progress.h new file mode 100644 index 0000000000..68fc06b4d9 --- /dev/null +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/circular_progress.h @@ -0,0 +1,27 @@ +/*********************** + * circular_progress.h * + ***********************/ + +/**************************************************************************** + * Written By Marcio Teixeira 2019 - 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 + +namespace FTDI { + void draw_circular_progress(CommandProcessor& cmd, int x, int y, int w, int h, float percent, char *text, uint32_t bgcolor, uint32_t fgcolor); + void draw_circular_progress(CommandProcessor& cmd, int x, int y, int w, int h, float percent, uint32_t bgcolor, uint32_t fgcolor); +} diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/ftdi_extended.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/ftdi_extended.h index fd84c795f1..bf9858f6eb 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/ftdi_extended.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/ftdi_extended.h @@ -47,6 +47,9 @@ #include "sound_player.h" #include "sound_list.h" #include "polygon.h" + #include "poly_ui.h" #include "text_box.h" #include "text_ellipsis.h" + #include "adjuster_widget.h" + #include "circular_progress.h" #endif diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/poly_ui.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/poly_ui.h similarity index 100% rename from Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/poly_ui.h rename to Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extended/poly_ui.h diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/circular_progress.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/circular_progress.h deleted file mode 100644 index 6695134046..0000000000 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/circular_progress.h +++ /dev/null @@ -1,105 +0,0 @@ -/*********************** - * circular_progress.h * - ***********************/ - -/**************************************************************************** - * Written By Marcio Teixeira 2019 - 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 - -/* This function draws a circular progress "ring" */ - -void draw_circular_progress(CommandProcessor& cmd, int x, int y, int w, int h, float percent, char *text, uint32_t bgcolor, uint32_t fgcolor) { - using namespace FTDI; - - const float rim = 0.3; - const float a = percent/100.0*2.0*PI; - const float a1 = min(PI/2, a); - const float a2 = min(PI/2, a-a1); - const float a3 = min(PI/2, a-a1-a2); - const float a4 = min(PI/2, a-a1-a2-a3); - - const int ro = min(w,h) * 8; - const int rr = ro * rim; - const int cx = x * 16 + w * 8; - const int cy = y * 16 + h * 8; - - // Load a rim shape into stencil buffer - cmd.cmd(SAVE_CONTEXT()); - cmd.cmd(TAG_MASK(0)); - cmd.cmd(CLEAR(0,1,0)); - cmd.cmd(COLOR_MASK(0,0,0,0)); - cmd.cmd(STENCIL_OP(STENCIL_OP_KEEP, STENCIL_OP_INVERT)); - cmd.cmd(STENCIL_FUNC(STENCIL_FUNC_ALWAYS, 255, 255)); - cmd.cmd(BEGIN(POINTS)); - cmd.cmd(POINT_SIZE(ro)); - cmd.cmd(VERTEX2F(cx, cy)); - cmd.cmd(POINT_SIZE(ro - rr)); - cmd.cmd(VERTEX2F(cx, cy)); - cmd.cmd(RESTORE_CONTEXT()); - - // Mask further drawing by stencil buffer - cmd.cmd(SAVE_CONTEXT()); - cmd.cmd(STENCIL_FUNC(STENCIL_FUNC_NOTEQUAL, 0, 255)); - - // Fill the background - cmd.cmd(COLOR_RGB(bgcolor)); - cmd.cmd(BEGIN(POINTS)); - cmd.cmd(POINT_SIZE(ro)); - cmd.cmd(VERTEX2F(cx, cy)); - cmd.cmd(COLOR_RGB(fgcolor)); - - // Paint upper-right quadrant - cmd.cmd(BEGIN(EDGE_STRIP_A)); - cmd.cmd(VERTEX2F(cx, cy)); - cmd.cmd(VERTEX2F(cx + ro*sin(a1) + 16,cy - ro*cos(a1) + 8)); - - // Paint lower-right quadrant - if (a > PI/2) { - cmd.cmd(BEGIN(EDGE_STRIP_R)); - cmd.cmd(VERTEX2F(cx, cy)); - cmd.cmd(VERTEX2F(cx + ro*cos(a2),cy + ro*sin(a2) + 16)); - } - - // Paint lower-left quadrant - if (a > PI) { - cmd.cmd(BEGIN(EDGE_STRIP_B)); - cmd.cmd(VERTEX2F(cx, cy)); - cmd.cmd(VERTEX2F(cx - ro*sin(a3) - 8,cy + ro*cos(a3))); - } - - // Paint upper-left quadrant - if (a > 1.5*PI) { - cmd.cmd(BEGIN(EDGE_STRIP_L)); - cmd.cmd(VERTEX2F(cx, cy)); - cmd.cmd(VERTEX2F(cx - ro*cos(a4),cy - ro*sin(a4))); - } - cmd.cmd(RESTORE_CONTEXT()); - - // Draw the text - - cmd.cmd(SAVE_CONTEXT()); - cmd.cmd(COLOR_RGB(fgcolor)); - cmd.text(x,y,w,h,text, OPT_CENTERX | OPT_CENTERY); - cmd.cmd(RESTORE_CONTEXT()); -} - -void draw_circular_progress(CommandProcessor& cmd, int x, int y, int w, int h, float percent, uint32_t bgcolor, uint32_t fgcolor) { - char str[5]; - sprintf(str,"%d\%%",int(percent)); - draw_circular_progress(cmd, x, y, w, h, percent, str, bgcolor, fgcolor); -} diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/bitmap2cpp.py b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/scripts/bitmap2cpp.py similarity index 100% rename from Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/bitmap2cpp.py rename to Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/scripts/bitmap2cpp.py diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/svg2cpp.py b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/scripts/svg2cpp.py similarity index 100% rename from Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/extras/svg2cpp.py rename to Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/ftdi_eve_lib/scripts/svg2cpp.py diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp index 053f4ebd72..f8b4b5b5d1 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp @@ -25,8 +25,6 @@ #ifdef FTDI_BED_MESH_SCREEN -#include "../ftdi_eve_lib/extras/adjuster_widget.h" - using namespace FTDI; using namespace Theme; using namespace ExtUI; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_printing_dialog_box.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_printing_dialog_box.cpp index a812f0f3d0..10ed6eb14a 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_printing_dialog_box.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_printing_dialog_box.cpp @@ -25,8 +25,6 @@ #ifdef FTDI_BIO_PRINTING_DIALOG_BOX -#include "../ftdi_eve_lib/extras/circular_progress.h" - using namespace FTDI; using namespace ExtUI; using namespace Theme; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_status_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_status_screen.cpp index f2bb5f3d3c..c66e4d94d8 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_status_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bio_status_screen.cpp @@ -26,8 +26,6 @@ #ifdef FTDI_BIO_STATUS_SCREEN -#include "../ftdi_eve_lib/extras/poly_ui.h" - #if ENABLED(TOUCH_UI_PORTRAIT) #include "bio_printer_ui_portrait.h" #else diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/boot_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/boot_screen.cpp index 236830dbc4..c8c7cdb5a5 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/boot_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/boot_screen.cpp @@ -26,7 +26,6 @@ #ifdef FTDI_BOOT_SCREEN -#include "../ftdi_eve_lib/extras/poly_ui.h" #include "../archim2-flash/flash_storage.h" #if ENABLED(SHOW_CUSTOM_BOOTSCREEN) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_load_chocolate.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_load_chocolate.cpp index d9c01366b9..ac49df0916 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_load_chocolate.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_load_chocolate.cpp @@ -27,8 +27,6 @@ #ifdef FTDI_COCOA_LOAD_CHOCOLATE_SCREEN -#include "../ftdi_eve_lib/extras/poly_ui.h" - #include "cocoa_press_ui.h" #define POLY(A) PolyUI::poly_reader_t(A, sizeof(A)/sizeof(A[0])) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_preheat_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_preheat_screen.cpp index 66256ab46f..a8a172b3da 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_preheat_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_preheat_screen.cpp @@ -25,8 +25,6 @@ #ifdef FTDI_COCOA_PREHEAT_SCREEN -#include "../ftdi_eve_lib/extras/circular_progress.h" - using namespace FTDI; using namespace ExtUI; using namespace Theme; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_status_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_status_screen.cpp index 5a0fe485f8..a0c8914589 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_status_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/cocoa_press_status_screen.cpp @@ -26,8 +26,6 @@ #ifdef FTDI_COCOA_STATUS_SCREEN -#include "../ftdi_eve_lib/extras/poly_ui.h" - #include "cocoa_press_ui.h" #define POLY(A) PolyUI::poly_reader_t(A, sizeof(A)/sizeof(A[0])) diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h index 3e69a3ad2f..7aca5800e1 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/screens.h @@ -22,6 +22,8 @@ #pragma once +#if ENABLED(TOUCH_UI_FTDI_EVE) + #include "../ftdi_eve_lib/ftdi_eve_lib.h" #include "../language/language.h" #include "../theme/theme.h" @@ -260,3 +262,5 @@ enum { #if NUM_LANGUAGES > 1 #include "language_menu.h" #endif + +#endif // TOUCH_UI_FTDI_EVE From 8d083eb2488c6e4bd19bec8090b1673d60d2da2a Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 30 Mar 2021 21:54:34 -0500 Subject: [PATCH 237/253] Put ABL state into a class --- Marlin/src/gcode/bedlevel/abl/G29.cpp | 424 +++++++++++++------------- Marlin/src/inc/Conditionals_LCD.h | 2 +- Marlin/src/inc/SanityCheck.h | 2 +- buildroot/tests/rambo | 2 +- 4 files changed, 216 insertions(+), 214 deletions(-) diff --git a/Marlin/src/gcode/bedlevel/abl/G29.cpp b/Marlin/src/gcode/bedlevel/abl/G29.cpp index a746b86108..f3cfe02e40 100644 --- a/Marlin/src/gcode/bedlevel/abl/G29.cpp +++ b/Marlin/src/gcode/bedlevel/abl/G29.cpp @@ -68,22 +68,77 @@ #include "../../../module/tool_change.h" #endif -#if ABL_GRID +#if ABL_USES_GRID #if ENABLED(PROBE_Y_FIRST) - #define PR_OUTER_VAR meshCount.x - #define PR_OUTER_END abl_grid_points.x - #define PR_INNER_VAR meshCount.y - #define PR_INNER_END abl_grid_points.y + #define PR_OUTER_VAR abl.meshCount.x + #define PR_OUTER_SIZE abl.grid_points.x + #define PR_INNER_VAR abl.meshCount.y + #define PR_INNER_SIZE abl.grid_points.y #else - #define PR_OUTER_VAR meshCount.y - #define PR_OUTER_END abl_grid_points.y - #define PR_INNER_VAR meshCount.x - #define PR_INNER_END abl_grid_points.x + #define PR_OUTER_VAR abl.meshCount.y + #define PR_OUTER_SIZE abl.grid_points.y + #define PR_INNER_VAR abl.meshCount.x + #define PR_INNER_SIZE abl.grid_points.x #endif #endif #define G29_RETURN(b) return TERN_(G29_RETRY_AND_RECOVER, b) +// For manual probing values persist over multiple G29 +class G29_State { +public: + int verbose_level; + xy_pos_t probePos; + float measured_z; + bool dryrun, + reenable; + + #if EITHER(PROBE_MANUALLY, AUTO_BED_LEVELING_LINEAR) + int abl_probe_index; + #endif + + #if ABL_USES_GRID + + xy_int8_t meshCount; + + xy_pos_t probe_position_lf, + probe_position_rb; + + xy_float_t gridSpacing; // = { 0.0f, 0.0f } + + #if ENABLED(AUTO_BED_LEVELING_LINEAR) + bool topography_map; + xy_uint8_t grid_points; + #else // Bilinear + static constexpr xy_uint8_t grid_points = { GRID_MAX_POINTS_X, GRID_MAX_POINTS_Y }; + #endif + + #if ENABLED(AUTO_BED_LEVELING_LINEAR) + int abl_points; + #elif ENABLED(AUTO_BED_LEVELING_3POINT) + static constexpr int abl_points = 3; + #else + static constexpr int abl_points = GRID_MAX_POINTS; + #endif + + #if ENABLED(AUTO_BED_LEVELING_BILINEAR) + float Z_offset; + #endif + + #if ENABLED(AUTO_BED_LEVELING_LINEAR) + int indexIntoAB[GRID_MAX_POINTS_X][GRID_MAX_POINTS_Y]; + float eqnAMatrix[(GRID_MAX_POINTS) * 3], // "A" matrix of the linear system of equations + eqnBVector[GRID_MAX_POINTS], // "B" vector of Z points + mean; + #endif + #endif +}; + +#if ABL_USES_GRID && EITHER(AUTO_BED_LEVELING_3POINT, AUTO_BED_LEVELING_BILINEAR) + constexpr xy_uint8_t G29_State::grid_points; + constexpr int G29_State::abl_points; +#endif + /** * G29: Detailed Z probe, probes the bed at 3 or more points. * Will fail if the printer has not been homed with G28. @@ -163,6 +218,8 @@ */ G29_TYPE GcodeSuite::G29() { + TERN_(PROBE_MANUALLY, static) G29_State abl; + reset_stepper_timeout(); const bool seenQ = EITHER(DEBUG_LEVELING_FEATURE, PROBE_MANUALLY) && parser.seen('Q'); @@ -193,63 +250,10 @@ G29_TYPE GcodeSuite::G29() { // Don't allow auto-leveling without homing first if (homing_needed_error()) G29_RETURN(false); - // Define local vars 'static' for manual probing, 'auto' otherwise - #define ABL_VAR TERN_(PROBE_MANUALLY, static) - - ABL_VAR int verbose_level; - ABL_VAR xy_pos_t probePos; - ABL_VAR float measured_z; - ABL_VAR bool dryrun, abl_should_enable; - - #if EITHER(PROBE_MANUALLY, AUTO_BED_LEVELING_LINEAR) - ABL_VAR int abl_probe_index; - #endif - - #if ABL_GRID - - #if ENABLED(PROBE_MANUALLY) - ABL_VAR xy_int8_t meshCount; - #endif - - ABL_VAR xy_pos_t probe_position_lf, probe_position_rb; - ABL_VAR xy_float_t gridSpacing = { 0, 0 }; - - #if ENABLED(AUTO_BED_LEVELING_LINEAR) - ABL_VAR bool do_topography_map; - ABL_VAR xy_uint8_t abl_grid_points; - #else // Bilinear - constexpr xy_uint8_t abl_grid_points = { GRID_MAX_POINTS_X, GRID_MAX_POINTS_Y }; - #endif - - #if ENABLED(AUTO_BED_LEVELING_LINEAR) - ABL_VAR int abl_points; - #else - int constexpr abl_points = GRID_MAX_POINTS; - #endif - - #if ENABLED(AUTO_BED_LEVELING_BILINEAR) - - ABL_VAR float zoffset; - - #elif ENABLED(AUTO_BED_LEVELING_LINEAR) - - ABL_VAR int indexIntoAB[GRID_MAX_POINTS_X][GRID_MAX_POINTS_Y]; - - ABL_VAR float eqnAMatrix[(GRID_MAX_POINTS) * 3], // "A" matrix of the linear system of equations - eqnBVector[GRID_MAX_POINTS], // "B" vector of Z points - mean; - #endif - - #elif ENABLED(AUTO_BED_LEVELING_3POINT) - - #if ENABLED(PROBE_MANUALLY) - int constexpr abl_points = 3; // used to show total points - #endif - + #if ENABLED(AUTO_BED_LEVELING_3POINT) vector_3 points[3]; probe.get_three_points(points); - - #endif // AUTO_BED_LEVELING_3POINT + #endif #if ENABLED(AUTO_BED_LEVELING_LINEAR) struct linear_fit_data lsf_results; @@ -263,10 +267,10 @@ G29_TYPE GcodeSuite::G29() { TERN_(HAS_MULTI_HOTEND, if (active_extruder) tool_change(0)); #if EITHER(PROBE_MANUALLY, AUTO_BED_LEVELING_LINEAR) - abl_probe_index = -1; + abl.abl_probe_index = -1; #endif - abl_should_enable = planner.leveling_active; + abl.reenable = planner.leveling_active; #if ENABLED(AUTO_BED_LEVELING_BILINEAR) @@ -289,8 +293,8 @@ G29_TYPE GcodeSuite::G29() { if (!isnan(rx) && !isnan(ry)) { // Get nearest i / j from rx / ry - i = (rx - bilinear_start.x + 0.5 * gridSpacing.x) / gridSpacing.x; - j = (ry - bilinear_start.y + 0.5 * gridSpacing.y) / gridSpacing.y; + i = (rx - bilinear_start.x + 0.5 * abl.gridSpacing.x) / abl.gridSpacing.x; + j = (ry - bilinear_start.y + 0.5 * abl.gridSpacing.y) / abl.gridSpacing.y; LIMIT(i, 0, GRID_MAX_POINTS_X - 1); LIMIT(j, 0, GRID_MAX_POINTS_Y - 1); } @@ -299,8 +303,8 @@ G29_TYPE GcodeSuite::G29() { z_values[i][j] = rz; TERN_(ABL_BILINEAR_SUBDIVISION, bed_level_virt_interpolate()); TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(i, j, rz)); - set_bed_leveling_enabled(abl_should_enable); - if (abl_should_enable) report_current_position(); + set_bed_leveling_enabled(abl.reenable); + if (abl.reenable) report_current_position(); } G29_RETURN(false); } // parser.seen('W') @@ -317,47 +321,47 @@ G29_TYPE GcodeSuite::G29() { G29_RETURN(false); } - verbose_level = parser.intval('V'); - if (!WITHIN(verbose_level, 0, 4)) { + abl.verbose_level = parser.intval('V'); + if (!WITHIN(abl.verbose_level, 0, 4)) { SERIAL_ECHOLNPGM("?(V)erbose level implausible (0-4)."); G29_RETURN(false); } - dryrun = parser.boolval('D') || TERN0(PROBE_MANUALLY, no_action); + abl.dryrun = parser.boolval('D') || TERN0(PROBE_MANUALLY, no_action); #if ENABLED(AUTO_BED_LEVELING_LINEAR) incremental_LSF_reset(&lsf_results); - do_topography_map = verbose_level > 2 || parser.boolval('T'); + abl.topography_map = abl.verbose_level > 2 || parser.boolval('T'); // X and Y specify points in each direction, overriding the default // These values may be saved with the completed mesh - abl_grid_points.set( + abl.grid_points.set( parser.byteval('X', GRID_MAX_POINTS_X), parser.byteval('Y', GRID_MAX_POINTS_Y) ); - if (parser.seenval('P')) abl_grid_points.x = abl_grid_points.y = parser.value_int(); + if (parser.seenval('P')) abl.grid_points.x = abl.grid_points.y = parser.value_int(); - if (!WITHIN(abl_grid_points.x, 2, GRID_MAX_POINTS_X)) { + if (!WITHIN(abl.grid_points.x, 2, GRID_MAX_POINTS_X)) { SERIAL_ECHOLNPGM("?Probe points (X) implausible (2-" STRINGIFY(GRID_MAX_POINTS_X) ")."); G29_RETURN(false); } - if (!WITHIN(abl_grid_points.y, 2, GRID_MAX_POINTS_Y)) { + if (!WITHIN(abl.grid_points.y, 2, GRID_MAX_POINTS_Y)) { SERIAL_ECHOLNPGM("?Probe points (Y) implausible (2-" STRINGIFY(GRID_MAX_POINTS_Y) ")."); G29_RETURN(false); } - abl_points = abl_grid_points.x * abl_grid_points.y; - mean = 0; + abl.abl_points = abl.grid_points.x * abl.grid_points.y; + abl.mean = 0; #elif ENABLED(AUTO_BED_LEVELING_BILINEAR) - zoffset = parser.linearval('Z'); + abl.Z_offset = parser.linearval('Z'); #endif - #if ABL_GRID + #if ABL_USES_GRID xy_probe_feedrate_mm_s = MMM_TO_MMS(parser.linearval('S', XY_PROBE_FEEDRATE)); @@ -366,32 +370,32 @@ G29_TYPE GcodeSuite::G29() { if (parser.seen('H')) { const int16_t size = (int16_t)parser.value_linear_units(); - probe_position_lf.set(_MAX((X_CENTER) - size / 2, x_min), _MAX((Y_CENTER) - size / 2, y_min)); - probe_position_rb.set(_MIN(probe_position_lf.x + size, x_max), _MIN(probe_position_lf.y + size, y_max)); + abl.probe_position_lf.set(_MAX((X_CENTER) - size / 2, x_min), _MAX((Y_CENTER) - size / 2, y_min)); + abl.probe_position_rb.set(_MIN(abl.probe_position_lf.x + size, x_max), _MIN(abl.probe_position_lf.y + size, y_max)); } else { - probe_position_lf.set(parser.linearval('L', x_min), parser.linearval('F', y_min)); - probe_position_rb.set(parser.linearval('R', x_max), parser.linearval('B', y_max)); + abl.probe_position_lf.set(parser.linearval('L', x_min), parser.linearval('F', y_min)); + abl.probe_position_rb.set(parser.linearval('R', x_max), parser.linearval('B', y_max)); } - if (!probe.good_bounds(probe_position_lf, probe_position_rb)) { + if (!probe.good_bounds(abl.probe_position_lf, abl.probe_position_rb)) { if (DEBUGGING(LEVELING)) { - DEBUG_ECHOLNPAIR("G29 L", probe_position_lf.x, " R", probe_position_rb.x, - " F", probe_position_lf.y, " B", probe_position_rb.y); + DEBUG_ECHOLNPAIR("G29 L", abl.probe_position_lf.x, " R", abl.probe_position_rb.x, + " F", abl.probe_position_lf.y, " B", abl.probe_position_rb.y); } SERIAL_ECHOLNPGM("? (L,R,F,B) out of bounds."); G29_RETURN(false); } // Probe at the points of a lattice grid - gridSpacing.set((probe_position_rb.x - probe_position_lf.x) / (abl_grid_points.x - 1), - (probe_position_rb.y - probe_position_lf.y) / (abl_grid_points.y - 1)); + abl.gridSpacing.set((abl.probe_position_rb.x - abl.probe_position_lf.x) / (abl.grid_points.x - 1), + (abl.probe_position_rb.y - abl.probe_position_lf.y) / (abl.grid_points.y - 1)); - #endif // ABL_GRID + #endif // ABL_USES_GRID - if (verbose_level > 0) { + if (abl.verbose_level > 0) { SERIAL_ECHOPGM("G29 Auto Bed Leveling"); - if (dryrun) SERIAL_ECHOPGM(" (DRYRUN)"); + if (abl.dryrun) SERIAL_ECHOPGM(" (DRYRUN)"); SERIAL_EOL(); } @@ -410,7 +414,7 @@ G29_TYPE GcodeSuite::G29() { remember_feedrate_scaling_off(); #if ENABLED(PREHEAT_BEFORE_LEVELING) - if (!dryrun) probe.preheat_for_probing(LEVELING_NOZZLE_TEMP, LEVELING_BED_TEMP); + if (!abl.dryrun) probe.preheat_for_probing(LEVELING_NOZZLE_TEMP, LEVELING_BED_TEMP); #endif } @@ -423,24 +427,24 @@ G29_TYPE GcodeSuite::G29() { if (ENABLED(BLTOUCH)) do_z_clearance(Z_CLEARANCE_DEPLOY_PROBE); else if (probe.deploy()) { - set_bed_leveling_enabled(abl_should_enable); + set_bed_leveling_enabled(abl.reenable); G29_RETURN(false); } #endif #if ENABLED(AUTO_BED_LEVELING_BILINEAR) if (TERN1(PROBE_MANUALLY, !no_action) - && (gridSpacing != bilinear_grid_spacing || probe_position_lf != bilinear_start) + && (abl.gridSpacing != bilinear_grid_spacing || abl.probe_position_lf != bilinear_start) ) { // Reset grid to 0.0 or "not probed". (Also disables ABL) reset_bed_level(); // Initialize a grid with the given dimensions - bilinear_grid_spacing = gridSpacing; - bilinear_start = probe_position_lf; + bilinear_grid_spacing = abl.gridSpacing; + bilinear_start = abl.probe_position_lf; // Can't re-enable (on error) until the new grid is written - abl_should_enable = false; + abl.reenable = false; } #endif // AUTO_BED_LEVELING_BILINEAR @@ -451,7 +455,7 @@ G29_TYPE GcodeSuite::G29() { // For manual probing, get the next index to probe now. // On the first probe this will be incremented to 0. if (!no_action) { - ++abl_probe_index; + ++abl.abl_probe_index; g29_in_progress = true; } @@ -459,17 +463,17 @@ G29_TYPE GcodeSuite::G29() { if (seenA && g29_in_progress) { SERIAL_ECHOLNPGM("Manual G29 aborted"); SET_SOFT_ENDSTOP_LOOSE(false); - set_bed_leveling_enabled(abl_should_enable); + set_bed_leveling_enabled(abl.reenable); g29_in_progress = false; TERN_(LCD_BED_LEVELING, ui.wait_for_move = false); } // Query G29 status - if (verbose_level || seenQ) { + if (abl.verbose_level || seenQ) { SERIAL_ECHOPGM("Manual G29 "); if (g29_in_progress) { - SERIAL_ECHOPAIR("point ", _MIN(abl_probe_index + 1, abl_points)); - SERIAL_ECHOLNPAIR(" of ", abl_points); + SERIAL_ECHOPAIR("point ", _MIN(abl.abl_probe_index + 1, abl.abl_points)); + SERIAL_ECHOLNPAIR(" of ", abl.abl_points); } else SERIAL_ECHOLNPGM("idle"); @@ -477,7 +481,7 @@ G29_TYPE GcodeSuite::G29() { if (no_action) G29_RETURN(false); - if (abl_probe_index == 0) { + if (abl.abl_probe_index == 0) { // For the initial G29 S2 save software endstop state SET_SOFT_ENDSTOP_LOOSE(true); // Move close to the bed before the first point @@ -486,34 +490,34 @@ G29_TYPE GcodeSuite::G29() { else { #if EITHER(AUTO_BED_LEVELING_LINEAR, AUTO_BED_LEVELING_3POINT) - const uint16_t index = abl_probe_index - 1; + const uint16_t index = abl.abl_probe_index - 1; #endif // For G29 after adjusting Z. // Save the previous Z before going to the next point - measured_z = current_position.z; + abl.measured_z = current_position.z; #if ENABLED(AUTO_BED_LEVELING_LINEAR) - mean += measured_z; - eqnBVector[index] = measured_z; - eqnAMatrix[index + 0 * abl_points] = probePos.x; - eqnAMatrix[index + 1 * abl_points] = probePos.y; - eqnAMatrix[index + 2 * abl_points] = 1; + abl.mean += abl.measured_z; + abl.eqnBVector[index] = abl.measured_z; + abl.eqnAMatrix[index + 0 * abl.abl_points] = abl.probePos.x; + abl.eqnAMatrix[index + 1 * abl.abl_points] = abl.probePos.y; + abl.eqnAMatrix[index + 2 * abl.abl_points] = 1; - incremental_LSF(&lsf_results, probePos, measured_z); + incremental_LSF(&lsf_results, abl.probePos, abl.measured_z); #elif ENABLED(AUTO_BED_LEVELING_3POINT) - points[index].z = measured_z; + points[index].z = abl.measured_z; #elif ENABLED(AUTO_BED_LEVELING_BILINEAR) - const float newz = measured_z + zoffset; - z_values[meshCount.x][meshCount.y] = newz; - TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(meshCount, newz)); + const float newz = abl.measured_z + abl.Z_offset; + z_values[abl.meshCount.x][abl.meshCount.y] = newz; + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(abl.meshCount, newz)); - if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR_P(PSTR("Save X"), meshCount.x, SP_Y_STR, meshCount.y, SP_Z_STR, measured_z + zoffset); + if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR_P(PSTR("Save X"), abl.meshCount.x, SP_Y_STR, abl.meshCount.y, SP_Z_STR, abl.measured_z + abl.Z_offset); #endif } @@ -522,31 +526,31 @@ G29_TYPE GcodeSuite::G29() { // If there's another point to sample, move there with optional lift. // - #if ABL_GRID + #if ABL_USES_GRID // Skip any unreachable points - while (abl_probe_index < abl_points) { + while (abl.abl_probe_index < abl.abl_points) { - // Set meshCount.x, meshCount.y based on abl_probe_index, with zig-zag - PR_OUTER_VAR = abl_probe_index / PR_INNER_END; - PR_INNER_VAR = abl_probe_index - (PR_OUTER_VAR * PR_INNER_END); + // Set abl.meshCount.x, abl.meshCount.y based on abl.abl_probe_index, with zig-zag + PR_OUTER_VAR = abl.abl_probe_index / PR_INNER_SIZE; + PR_INNER_VAR = abl.abl_probe_index - (PR_OUTER_VAR * PR_INNER_SIZE); // Probe in reverse order for every other row/column - const bool zig = (PR_OUTER_VAR & 1); // != ((PR_OUTER_END) & 1); - if (zig) PR_INNER_VAR = (PR_INNER_END - 1) - PR_INNER_VAR; + const bool zig = (PR_OUTER_VAR & 1); // != ((PR_OUTER_SIZE) & 1); + if (zig) PR_INNER_VAR = (PR_INNER_SIZE - 1) - PR_INNER_VAR; - probePos = probe_position_lf + gridSpacing * meshCount.asFloat(); + abl.probePos = abl.probe_position_lf + abl.gridSpacing * abl.meshCount.asFloat(); - TERN_(AUTO_BED_LEVELING_LINEAR, indexIntoAB[meshCount.x][meshCount.y] = abl_probe_index); + TERN_(AUTO_BED_LEVELING_LINEAR, abl.indexIntoAB[abl.meshCount.x][abl.meshCount.y] = abl.abl_probe_index); // Keep looping till a reachable point is found - if (position_is_reachable(probePos)) break; - ++abl_probe_index; + if (position_is_reachable(abl.probePos)) break; + ++abl.abl_probe_index; } // Is there a next point to move to? - if (abl_probe_index < abl_points) { - _manual_goto_xy(probePos); // Can be used here too! + if (abl.abl_probe_index < abl.abl_points) { + _manual_goto_xy(abl.probePos); // Can be used here too! // Disable software endstops to allow manual adjustment // If G29 is not completed, they will not be re-enabled SET_SOFT_ENDSTOP_LOOSE(true); @@ -562,9 +566,9 @@ G29_TYPE GcodeSuite::G29() { #elif ENABLED(AUTO_BED_LEVELING_3POINT) // Probe at 3 arbitrary points - if (abl_probe_index < abl_points) { - probePos = points[abl_probe_index]; - _manual_goto_xy(probePos); + if (abl.abl_probe_index < abl.abl_points) { + abl.probePos = points[abl.abl_probe_index]; + _manual_goto_xy(abl.probePos); // Disable software endstops to allow manual adjustment // If G29 is not completed, they will not be re-enabled SET_SOFT_ENDSTOP_LOOSE(true); @@ -577,13 +581,13 @@ G29_TYPE GcodeSuite::G29() { // Re-enable software endstops, if needed SET_SOFT_ENDSTOP_LOOSE(false); - if (!dryrun) { + if (!abl.dryrun) { vector_3 planeNormal = vector_3::cross(points[0] - points[1], points[2] - points[1]).get_normal(); if (planeNormal.z < 0) planeNormal *= -1; planner.bed_level_matrix = matrix_3x3::create_look_at(planeNormal); // Can't re-enable (on error) until the new grid is written - abl_should_enable = false; + abl.reenable = false; } } @@ -594,84 +598,82 @@ G29_TYPE GcodeSuite::G29() { { const ProbePtRaise raise_after = parser.boolval('E') ? PROBE_PT_STOW : PROBE_PT_RAISE; - measured_z = 0; + abl.measured_z = 0; - #if ABL_GRID + #if ABL_USES_GRID - bool zig = PR_OUTER_END & 1; // Always end at RIGHT and BACK_PROBE_BED_POSITION + bool zig = PR_OUTER_SIZE & 1; // Always end at RIGHT and BACK_PROBE_BED_POSITION - measured_z = 0; - - xy_int8_t meshCount; + abl.measured_z = 0; // Outer loop is X with PROBE_Y_FIRST enabled // Outer loop is Y with PROBE_Y_FIRST disabled - for (PR_OUTER_VAR = 0; PR_OUTER_VAR < PR_OUTER_END && !isnan(measured_z); PR_OUTER_VAR++) { + for (PR_OUTER_VAR = 0; PR_OUTER_VAR < PR_OUTER_SIZE && !isnan(abl.measured_z); PR_OUTER_VAR++) { int8_t inStart, inStop, inInc; - if (zig) { // Zig away from origin - inStart = 0; // Left or front - inStop = PR_INNER_END; // Right or back - inInc = 1; // Zig right + if (zig) { // Zig away from origin + inStart = 0; // Left or front + inStop = PR_INNER_SIZE; // Right or back + inInc = 1; // Zig right } - else { // Zag towards origin - inStart = PR_INNER_END - 1; // Right or back - inStop = -1; // Left or front - inInc = -1; // Zag left + else { // Zag towards origin + inStart = PR_INNER_SIZE - 1; // Right or back + inStop = -1; // Left or front + inInc = -1; // Zag left } zig ^= true; // zag // An index to print current state - uint8_t pt_index = (PR_OUTER_VAR) * (PR_INNER_END) + 1; + uint8_t pt_index = (PR_OUTER_VAR) * (PR_INNER_SIZE) + 1; // Inner loop is Y with PROBE_Y_FIRST enabled // Inner loop is X with PROBE_Y_FIRST disabled for (PR_INNER_VAR = inStart; PR_INNER_VAR != inStop; pt_index++, PR_INNER_VAR += inInc) { - probePos = probe_position_lf + gridSpacing * meshCount.asFloat(); + abl.probePos = abl.probe_position_lf + abl.gridSpacing * abl.meshCount.asFloat(); - TERN_(AUTO_BED_LEVELING_LINEAR, indexIntoAB[meshCount.x][meshCount.y] = ++abl_probe_index); // 0... + TERN_(AUTO_BED_LEVELING_LINEAR, abl.indexIntoAB[abl.meshCount.x][abl.meshCount.y] = ++abl.abl_probe_index); // 0... // Avoid probing outside the round or hexagonal area - if (TERN0(IS_KINEMATIC, !probe.can_reach(probePos))) continue; + if (TERN0(IS_KINEMATIC, !probe.can_reach(abl.probePos))) continue; - if (verbose_level) SERIAL_ECHOLNPAIR("Probing mesh point ", pt_index, "/", abl_points, "."); - TERN_(HAS_STATUS_MESSAGE, ui.status_printf_P(0, PSTR(S_FMT " %i/%i"), GET_TEXT(MSG_PROBING_MESH), int(pt_index), int(abl_points))); + if (abl.verbose_level) SERIAL_ECHOLNPAIR("Probing mesh point ", pt_index, "/", abl.abl_points, "."); + TERN_(HAS_STATUS_MESSAGE, ui.status_printf_P(0, PSTR(S_FMT " %i/%i"), GET_TEXT(MSG_PROBING_MESH), int(pt_index), int(abl.abl_points))); - measured_z = faux ? 0.001f * random(-100, 101) : probe.probe_at_point(probePos, raise_after, verbose_level); + abl.measured_z = faux ? 0.001f * random(-100, 101) : probe.probe_at_point(abl.probePos, raise_after, abl.verbose_level); - if (isnan(measured_z)) { - set_bed_leveling_enabled(abl_should_enable); + if (isnan(abl.measured_z)) { + set_bed_leveling_enabled(abl.reenable); break; // Breaks out of both loops } #if ENABLED(PROBE_TEMP_COMPENSATION) - temp_comp.compensate_measurement(TSI_BED, thermalManager.degBed(), measured_z); - temp_comp.compensate_measurement(TSI_PROBE, thermalManager.degProbe(), measured_z); - TERN_(USE_TEMP_EXT_COMPENSATION, temp_comp.compensate_measurement(TSI_EXT, thermalManager.degHotend(), measured_z)); + temp_comp.compensate_measurement(TSI_BED, thermalManager.degBed(), abl.measured_z); + temp_comp.compensate_measurement(TSI_PROBE, thermalManager.degProbe(), abl.measured_z); + TERN_(USE_TEMP_EXT_COMPENSATION, temp_comp.compensate_measurement(TSI_EXT, thermalManager.degHotend(), abl.measured_z)); #endif #if ENABLED(AUTO_BED_LEVELING_LINEAR) - mean += measured_z; - eqnBVector[abl_probe_index] = measured_z; - eqnAMatrix[abl_probe_index + 0 * abl_points] = probePos.x; - eqnAMatrix[abl_probe_index + 1 * abl_points] = probePos.y; - eqnAMatrix[abl_probe_index + 2 * abl_points] = 1; + abl.mean += abl.measured_z; + abl.eqnBVector[abl.abl_probe_index] = abl.measured_z; + abl.eqnAMatrix[abl.abl_probe_index + 0 * abl.abl_points] = abl.probePos.x; + abl.eqnAMatrix[abl.abl_probe_index + 1 * abl.abl_points] = abl.probePos.y; + abl.eqnAMatrix[abl.abl_probe_index + 2 * abl.abl_points] = 1; - incremental_LSF(&lsf_results, probePos, measured_z); + incremental_LSF(&lsf_results, abl.probePos, abl.measured_z); #elif ENABLED(AUTO_BED_LEVELING_BILINEAR) - const float z = measured_z + zoffset; - z_values[meshCount.x][meshCount.y] = z; - TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(meshCount, z)); + const float z = abl.measured_z + abl.Z_offset; + z_values[abl.meshCount.x][abl.meshCount.y] = z; + TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(abl.meshCount, z)); #endif - abl_should_enable = false; + abl.reenable = false; idle_no_sleep(); } // inner @@ -682,26 +684,26 @@ G29_TYPE GcodeSuite::G29() { // Probe at 3 arbitrary points LOOP_L_N(i, 3) { - if (verbose_level) SERIAL_ECHOLNPAIR("Probing point ", i + 1, "/3."); + if (abl.verbose_level) SERIAL_ECHOLNPAIR("Probing point ", i + 1, "/3."); TERN_(HAS_STATUS_MESSAGE, ui.status_printf_P(0, PSTR(S_FMT " %i/3"), GET_TEXT(MSG_PROBING_MESH), int(i + 1))); // Retain the last probe position - probePos = points[i]; - measured_z = faux ? 0.001 * random(-100, 101) : probe.probe_at_point(probePos, raise_after, verbose_level); - if (isnan(measured_z)) { - set_bed_leveling_enabled(abl_should_enable); + abl.probePos = points[i]; + abl.measured_z = faux ? 0.001 * random(-100, 101) : probe.probe_at_point(abl.probePos, raise_after, abl.verbose_level); + if (isnan(abl.measured_z)) { + set_bed_leveling_enabled(abl.reenable); break; } - points[i].z = measured_z; + points[i].z = abl.measured_z; } - if (!dryrun && !isnan(measured_z)) { + if (!abl.dryrun && !isnan(abl.measured_z)) { vector_3 planeNormal = vector_3::cross(points[0] - points[1], points[2] - points[1]).get_normal(); if (planeNormal.z < 0) planeNormal *= -1; planner.bed_level_matrix = matrix_3x3::create_look_at(planeNormal); // Can't re-enable (on error) until the new grid is written - abl_should_enable = false; + abl.reenable = false; } #endif // AUTO_BED_LEVELING_3POINT @@ -710,8 +712,8 @@ G29_TYPE GcodeSuite::G29() { // Stow the probe. No raise for FIX_MOUNTED_PROBE. if (probe.stow()) { - set_bed_leveling_enabled(abl_should_enable); - measured_z = NAN; + set_bed_leveling_enabled(abl.reenable); + abl.measured_z = NAN; } } #endif // !PROBE_MANUALLY @@ -734,10 +736,10 @@ G29_TYPE GcodeSuite::G29() { #endif // Calculate leveling, print reports, correct the position - if (!isnan(measured_z)) { + if (!isnan(abl.measured_z)) { #if ENABLED(AUTO_BED_LEVELING_BILINEAR) - if (!dryrun) extrapolate_unprobed_bed_level(); + if (!abl.dryrun) extrapolate_unprobed_bed_level(); print_bilinear_leveling_grid(); refresh_bed_level(); @@ -763,39 +765,39 @@ G29_TYPE GcodeSuite::G29() { plane_equation_coefficients.b = -lsf_results.B; // but that is not yet tested. plane_equation_coefficients.d = -lsf_results.D; - mean /= abl_points; + abl.mean /= abl.abl_points; - if (verbose_level) { + if (abl.verbose_level) { SERIAL_ECHOPAIR_F("Eqn coefficients: a: ", plane_equation_coefficients.a, 8); SERIAL_ECHOPAIR_F(" b: ", plane_equation_coefficients.b, 8); SERIAL_ECHOPAIR_F(" d: ", plane_equation_coefficients.d, 8); - if (verbose_level > 2) - SERIAL_ECHOPAIR_F("\nMean of sampled points: ", mean, 8); + if (abl.verbose_level > 2) + SERIAL_ECHOPAIR_F("\nMean of sampled points: ", abl.mean, 8); SERIAL_EOL(); } // Create the matrix but don't correct the position yet - if (!dryrun) + if (!abl.dryrun) planner.bed_level_matrix = matrix_3x3::create_look_at( vector_3(-plane_equation_coefficients.a, -plane_equation_coefficients.b, 1) // We can eliminate the '-' here and up above ); // Show the Topography map if enabled - if (do_topography_map) { + if (abl.topography_map) { float min_diff = 999; auto print_topo_map = [&](PGM_P const title, const bool get_min) { SERIAL_ECHOPGM_P(title); - for (int8_t yy = abl_grid_points.y - 1; yy >= 0; yy--) { - LOOP_L_N(xx, abl_grid_points.x) { - const int ind = indexIntoAB[xx][yy]; - xyz_float_t tmp = { eqnAMatrix[ind + 0 * abl_points], - eqnAMatrix[ind + 1 * abl_points], 0 }; + for (int8_t yy = abl.grid_points.y - 1; yy >= 0; yy--) { + LOOP_L_N(xx, abl.grid_points.x) { + const int ind = abl.indexIntoAB[xx][yy]; + xyz_float_t tmp = { abl.eqnAMatrix[ind + 0 * abl.abl_points], + abl.eqnAMatrix[ind + 1 * abl.abl_points], 0 }; apply_rotation_xyz(planner.bed_level_matrix, tmp); - if (get_min) NOMORE(min_diff, eqnBVector[ind] - tmp.z); - const float subval = get_min ? mean : tmp.z + min_diff, - diff = eqnBVector[ind] - subval; + if (get_min) NOMORE(min_diff, abl.eqnBVector[ind] - tmp.z); + const float subval = get_min ? abl.mean : tmp.z + min_diff, + diff = abl.eqnBVector[ind] - subval; SERIAL_CHAR(' '); if (diff >= 0.0) SERIAL_CHAR('+'); // Include + for column alignment SERIAL_ECHO_F(diff, 5); } // xx @@ -815,10 +817,10 @@ G29_TYPE GcodeSuite::G29() { " | |\n" " O-- FRONT --+\n" " (0,0)\n"), true); - if (verbose_level > 3) + if (abl.verbose_level > 3) print_topo_map(PSTR("\nCorrected Bed Height vs. Bed Topology:\n"), false); - } //do_topography_map + } // abl.topography_map #endif // AUTO_BED_LEVELING_LINEAR @@ -826,10 +828,10 @@ G29_TYPE GcodeSuite::G29() { // For LINEAR and 3POINT leveling correct the current position - if (verbose_level > 0) + if (abl.verbose_level > 0) planner.bed_level_matrix.debug(PSTR("\n\nBed Level Correction Matrix:")); - if (!dryrun) { + if (!abl.dryrun) { // // Correct the current XYZ position based on the tilted plane. // @@ -840,10 +842,10 @@ G29_TYPE GcodeSuite::G29() { planner.force_unapply_leveling(converted); // use conversion machinery // Use the last measured distance to the bed, if possible - if ( NEAR(current_position.x, probePos.x - probe.offset_xy.x) - && NEAR(current_position.y, probePos.y - probe.offset_xy.y) + if ( NEAR(current_position.x, abl.probePos.x - probe.offset_xy.x) + && NEAR(current_position.y, abl.probePos.y - probe.offset_xy.y) ) { - const float simple_z = current_position.z - measured_z; + const float simple_z = current_position.z - abl.measured_z; if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("Probed Z", simple_z, " Matrix Z", converted.z, " Discrepancy ", simple_z - converted.z); converted.z = simple_z; } @@ -856,7 +858,7 @@ G29_TYPE GcodeSuite::G29() { #elif ENABLED(AUTO_BED_LEVELING_BILINEAR) - if (!dryrun) { + if (!abl.dryrun) { if (DEBUGGING(LEVELING)) DEBUG_ECHOLNPAIR("G29 uncorrected Z:", current_position.z); // Unapply the offset because it is going to be immediately applied @@ -870,8 +872,8 @@ G29_TYPE GcodeSuite::G29() { #endif // ABL_PLANAR // Auto Bed Leveling is complete! Enable if possible. - planner.leveling_active = dryrun ? abl_should_enable : true; - } // !isnan(measured_z) + planner.leveling_active = !abl.dryrun || abl.reenable; + } // !isnan(abl.measured_z) // Restore state after probing if (!faux) restore_feedrate_and_scaling(); @@ -895,7 +897,7 @@ G29_TYPE GcodeSuite::G29() { report_current_position(); - G29_RETURN(isnan(measured_z)); + G29_RETURN(isnan(abl.measured_z)); } #endif // HAS_ABL_NOT_UBL diff --git a/Marlin/src/inc/Conditionals_LCD.h b/Marlin/src/inc/Conditionals_LCD.h index a0fced150f..88bd382020 100644 --- a/Marlin/src/inc/Conditionals_LCD.h +++ b/Marlin/src/inc/Conditionals_LCD.h @@ -842,7 +842,7 @@ #define ABL_PLANAR 1 #endif #if EITHER(AUTO_BED_LEVELING_LINEAR, AUTO_BED_LEVELING_BILINEAR) - #define ABL_GRID 1 + #define ABL_USES_GRID 1 #endif #if ANY(AUTO_BED_LEVELING_LINEAR, AUTO_BED_LEVELING_BILINEAR, AUTO_BED_LEVELING_3POINT) #define HAS_ABL_NOT_UBL 1 diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 287f0c5600..647e0d55dd 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -1262,7 +1262,7 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #error "DELTA_AUTO_CALIBRATION requires a probe or LCD Controller." #elif ENABLED(DELTA_CALIBRATION_MENU) && !HAS_LCD_MENU #error "DELTA_CALIBRATION_MENU requires an LCD Controller." - #elif ABL_GRID + #elif ABL_USES_GRID #if (GRID_MAX_POINTS_X & 1) == 0 || (GRID_MAX_POINTS_Y & 1) == 0 #error "DELTA requires GRID_MAX_POINTS_X and GRID_MAX_POINTS_Y to be odd numbers." #elif GRID_MAX_POINTS_X < 3 diff --git a/buildroot/tests/rambo b/buildroot/tests/rambo index 5da4eed9b4..95260e58b4 100755 --- a/buildroot/tests/rambo +++ b/buildroot/tests/rambo @@ -88,7 +88,7 @@ opt_enable EEPROM_SETTINGS EEPROM_CHITCHAT REPRAP_DISCOUNT_FULL_GRAPHIC_SMART_CO PRINTCOUNTER SERVICE_NAME_1 SERVICE_INTERVAL_1 M114_DETAIL opt_add M100_FREE_MEMORY_DUMPER opt_add M100_FREE_MEMORY_CORRUPTOR -exec_test $1 $2 "MINIRAMBO | RRDGFSC | M100 | PWM_MOTOR_CURRENT | PRINTCOUNTER | Advanced Pause ..." "$3" +exec_test $1 $2 "MINIRAMBO | RRDGFSC | ABL Bilinear Manual | M100 | PWM_MOTOR_CURRENT | M600..." "$3" # # Test many less common options From be775ed72db983ea150669ad6e0e094285b2fec2 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 30 Mar 2021 23:16:29 -0500 Subject: [PATCH 238/253] Move apply_rotation_xyz into matrix_3x3 --- Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp | 2 +- Marlin/src/gcode/bedlevel/abl/G29.cpp | 2 +- Marlin/src/libs/vector_3.cpp | 4 ++-- Marlin/src/libs/vector_3.h | 10 ++++------ Marlin/src/module/planner.cpp | 4 ++-- 5 files changed, 10 insertions(+), 12 deletions(-) diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp index 2003e9b6f5..c11962bf9d 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp @@ -1592,7 +1592,7 @@ void unified_bed_leveling::smart_fill_mesh() { DEBUG_DELAY(20); } - apply_rotation_xyz(rotation, mx, my, mz); + rotation.apply_rotation_xyz(mx, my, mz); if (DEBUGGING(LEVELING)) { DEBUG_ECHOPAIR_F("after rotation = [", mx, 7); diff --git a/Marlin/src/gcode/bedlevel/abl/G29.cpp b/Marlin/src/gcode/bedlevel/abl/G29.cpp index f3cfe02e40..42d3a75da1 100644 --- a/Marlin/src/gcode/bedlevel/abl/G29.cpp +++ b/Marlin/src/gcode/bedlevel/abl/G29.cpp @@ -794,7 +794,7 @@ G29_TYPE GcodeSuite::G29() { const int ind = abl.indexIntoAB[xx][yy]; xyz_float_t tmp = { abl.eqnAMatrix[ind + 0 * abl.abl_points], abl.eqnAMatrix[ind + 1 * abl.abl_points], 0 }; - apply_rotation_xyz(planner.bed_level_matrix, tmp); + planner.bed_level_matrix.apply_rotation_xyz(tmp); if (get_min) NOMORE(min_diff, abl.eqnBVector[ind] - tmp.z); const float subval = get_min ? abl.mean : tmp.z + min_diff, diff = abl.eqnBVector[ind] - subval; diff --git a/Marlin/src/libs/vector_3.cpp b/Marlin/src/libs/vector_3.cpp index 0ef29f33bd..f1bff7d4c6 100644 --- a/Marlin/src/libs/vector_3.cpp +++ b/Marlin/src/libs/vector_3.cpp @@ -87,8 +87,8 @@ void vector_3::debug(PGM_P const title) { * matrix_3x3 */ -void apply_rotation_xyz(const matrix_3x3 &matrix, float &_x, float &_y, float &_z) { - vector_3 vec = vector_3(_x, _y, _z); vec.apply_rotation(matrix); +void matrix_3x3::apply_rotation_xyz(float &_x, float &_y, float &_z) { + vector_3 vec = vector_3(_x, _y, _z); vec.apply_rotation(*this); _x = vec.x; _y = vec.y; _z = vec.z; } diff --git a/Marlin/src/libs/vector_3.h b/Marlin/src/libs/vector_3.h index 58428314d9..764e10accb 100644 --- a/Marlin/src/libs/vector_3.h +++ b/Marlin/src/libs/vector_3.h @@ -45,7 +45,6 @@ class matrix_3x3; struct vector_3 : xyz_float_t { - vector_3(const float &_x, const float &_y, const float &_z) { set(_x, _y, _z); } vector_3(const xy_float_t &in) { set(in.x, in.y); } vector_3(const xyz_float_t &in) { set(in.x, in.y, in.z); } @@ -82,9 +81,8 @@ struct matrix_3x3 { void set_to_identity(); void debug(PGM_P const title); -}; -void apply_rotation_xyz(const matrix_3x3 &rotationMatrix, float &x, float &y, float &z); -FORCE_INLINE void apply_rotation_xyz(const matrix_3x3 &rotationMatrix, xyz_pos_t &pos) { - apply_rotation_xyz(rotationMatrix, pos.x, pos.y, pos.z); -} + void apply_rotation_xyz(float &x, float &y, float &z); + + FORCE_INLINE void apply_rotation_xyz(xyz_pos_t &pos) { apply_rotation_xyz(pos.x, pos.y, pos.z); } +}; diff --git a/Marlin/src/module/planner.cpp b/Marlin/src/module/planner.cpp index 832d6e316a..eee1a9f269 100644 --- a/Marlin/src/module/planner.cpp +++ b/Marlin/src/module/planner.cpp @@ -1534,7 +1534,7 @@ void Planner::check_axes_activity() { #if ABL_PLANAR xy_pos_t d = raw - level_fulcrum; - apply_rotation_xyz(bed_level_matrix, d.x, d.y, raw.z); + bed_level_matrix.apply_rotation_xyz(d.x, d.y, raw.z); raw = d + level_fulcrum; #elif HAS_MESH @@ -1571,7 +1571,7 @@ void Planner::check_axes_activity() { matrix_3x3 inverse = matrix_3x3::transpose(bed_level_matrix); xy_pos_t d = raw - level_fulcrum; - apply_rotation_xyz(inverse, d.x, d.y, raw.z); + inverse.apply_rotation_xyz(d.x, d.y, raw.z); raw = d + level_fulcrum; #elif HAS_MESH From bfdd1f4662f74c9db1cb62cc4f134d4e66a2da4f Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Tue, 30 Mar 2021 23:57:57 -0500 Subject: [PATCH 239/253] Update UBL param --- Marlin/src/feature/bedlevel/ubl/ubl.h | 2 +- Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Marlin/src/feature/bedlevel/ubl/ubl.h b/Marlin/src/feature/bedlevel/ubl/ubl.h index 56de4e45ba..acc191908c 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl.h +++ b/Marlin/src/feature/bedlevel/ubl/ubl.h @@ -57,7 +57,7 @@ typedef struct { xy_pos_t XY_pos; xy_bool_t XY_seen; #if HAS_BED_PROBE - int grid_size; + uint8_t J_grid_size; #endif } G29_parameters_t; diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp index c11962bf9d..3282ebe620 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp @@ -391,7 +391,7 @@ void unified_bed_leveling::G29() { if (parser.seen('J')) { save_ubl_active_state_and_disable(); - tilt_mesh_based_on_probed_grid(param.grid_size == 0); // Zero size does 3-Point + tilt_mesh_based_on_probed_grid(param.J_grid_size == 0); // Zero size does 3-Point restore_ubl_active_state_and_leave(); #if ENABLED(UBL_G29_J_RECENTER) do_blocking_move_to_xy(0.5f * ((MESH_MIN_X) + (MESH_MAX_X)), 0.5f * ((MESH_MIN_Y) + (MESH_MAX_Y))); @@ -1118,8 +1118,8 @@ bool unified_bed_leveling::G29_parse_parameters() { if (parser.seen('J')) { #if HAS_BED_PROBE - param.grid_size = parser.has_value() ? parser.value_int() : 0; - if (param.grid_size && !WITHIN(param.grid_size, 2, 9)) { + param.J_grid_size = parser.value_byte(); + if (param.J_grid_size && !WITHIN(param.J_grid_size, 2, 9)) { SERIAL_ECHOLNPGM("?Invalid grid size (J) specified (2-9).\n"); err_flag = true; } @@ -1420,8 +1420,8 @@ void unified_bed_leveling::smart_fill_mesh() { void unified_bed_leveling::tilt_mesh_based_on_probed_grid(const bool do_3_pt_leveling) { const float x_min = probe.min_x(), x_max = probe.max_x(), y_min = probe.min_y(), y_max = probe.max_y(), - dx = (x_max - x_min) / (param.grid_size - 1), - dy = (y_max - y_min) / (param.grid_size - 1); + dx = (x_max - x_min) / (param.J_grid_size - 1), + dy = (y_max - y_min) / (param.J_grid_size - 1); xy_float_t points[3]; probe.get_three_points(points); @@ -1507,14 +1507,14 @@ void unified_bed_leveling::smart_fill_mesh() { bool zig_zag = false; - const uint16_t total_points = sq(param.grid_size); + const uint16_t total_points = sq(param.J_grid_size); uint16_t point_num = 1; xy_pos_t rpos; - LOOP_L_N(ix, param.grid_size) { + LOOP_L_N(ix, param.J_grid_size) { rpos.x = x_min + ix * dx; - LOOP_L_N(iy, param.grid_size) { - rpos.y = y_min + dy * (zig_zag ? param.grid_size - 1 - iy : iy); + LOOP_L_N(iy, param.J_grid_size) { + rpos.y = y_min + dy * (zig_zag ? param.J_grid_size - 1 - iy : iy); if (!abort_flag) { SERIAL_ECHOLNPAIR("Tilting mesh point ", point_num, "/", total_points, "\n"); From 4d17613050e7d77bb1bf229f9682743f3924caf4 Mon Sep 17 00:00:00 2001 From: Sola <42537573+solawc@users.noreply.github.com> Date: Wed, 31 Mar 2021 15:34:17 +0800 Subject: [PATCH 240/253] MKS H43 fix, cleanup (#21485) Co-authored-by: Scott Lahteine --- Marlin/Configuration.h | 6 +- Marlin/src/HAL/LPC1768/HAL.h | 3 + Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp | 8 +- .../lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp | 93 ++++---- .../lcd/extui/lib/dgus/mks/DGUSDisplayDef.h | 31 +-- .../extui/lib/dgus/mks/DGUSScreenHandler.cpp | 219 ++++++++---------- .../extui/lib/dgus/mks/DGUSScreenHandler.h | 6 +- Marlin/src/module/settings.cpp | 41 ++++ 8 files changed, 202 insertions(+), 205 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 93a60394c2..5f9b1782fc 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -2373,7 +2373,11 @@ //#define DGUS_LCD_UI_ORIGIN //#define DGUS_LCD_UI_FYSETC //#define DGUS_LCD_UI_HIPRECY -//#define DGUS_LCD_UI_MKS + +// #define DGUS_LCD_UI_MKS +#if ENABLED(DGUS_LCD_UI_MKS) + #define USE_MKS_GREEN_UI +#endif // // Touch-screen LCD for Malyan M200/M300 printers diff --git a/Marlin/src/HAL/LPC1768/HAL.h b/Marlin/src/HAL/LPC1768/HAL.h index 58f9cb71fb..828e126d70 100644 --- a/Marlin/src/HAL/LPC1768/HAL.h +++ b/Marlin/src/HAL/LPC1768/HAL.h @@ -102,6 +102,9 @@ extern DefaultSerial1 USBSerial; #else #error "LCD_SERIAL_PORT must be from -1 to 3. Please update your configuration." #endif + #if HAS_DGUS_LCD + #define SERIAL_GET_TX_BUFFER_FREE() MSerial0.available() + #endif #endif // diff --git a/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp b/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp index 702c5cc47e..2c283b1a92 100644 --- a/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.cpp @@ -62,9 +62,11 @@ void DGUSDisplay::InitDisplay() { #define LCD_BAUDRATE 115200 #endif LCD_SERIAL.begin(LCD_BAUDRATE); - #if BOTH(DGUS_LCD_UI_MKS, POWER_LOSS_RECOVERY) - if (!recovery.valid()) delay(LOGO_TIME_DELAY); - #endif + + if (TERN1(POWER_LOSS_RECOVERY, !recovery.valid())) { // If no Power-Loss Recovery is needed... + TERN_(DGUS_LCD_UI_MKS, delay(LOGO_TIME_DELAY)); // Show the logo for a little while + } + RequestScreen(TERN(SHOW_BOOTSCREEN, DGUSLCD_SCREEN_BOOT, DGUSLCD_SCREEN_MAIN)); } diff --git a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp index 25e1670740..a2ccdada36 100644 --- a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp @@ -43,58 +43,45 @@ uint16_t distanceToMove = 10; #endif -uint16_t distanceMove = 1; +uint16_t manualMoveStep = 1; float distanceFilament = 10; uint16_t FilamentSpeed = 25; float ZOffset_distance = 0.1; -float mesh_adj_distance = 0.1; +float mesh_adj_distance = 0.01; float Z_distance = 0.1; -int16_t level_1_x_point = 20; -int16_t level_1_y_point = 20; +//struct { uint16_t h, m, s; } dgus_time; -int16_t level_2_x_point = 20; -int16_t level_2_y_point = 20; +// +// Persistent settings +// +xy_int_t mks_corner_offsets[5]; // Initialized by settings.load() +xyz_int_t mks_park_pos; // Initialized by settings.load() +celsius_t mks_min_extrusion_temp; // Initialized by settings.load() -int16_t level_3_x_point = 20; -int16_t level_3_y_point = 20; - -int16_t level_4_x_point = 20; -int16_t level_4_y_point = 20; -int16_t level_5_x_point = X_MAX_POS / 2; -int16_t level_5_y_point = Y_MAX_POS / 2; - -uint16_t tim_h; -uint16_t tim_m; -uint16_t tim_s; - -uint16_t x_park_pos = 20; -uint16_t y_park_pos = 20; -uint16_t z_park_pos = 10; +void MKS_reset_settings() { + constexpr xy_int_t init_dgus_level_offsets[5] = { + { 20, 20 }, { 20, 20 }, + { 20, 20 }, { 20, 20 }, + { X_CENTER, Y_CENTER } + }; + mks_language_index = 0; + COPY(mks_corner_offsets, init_dgus_level_offsets); + mks_park_pos.set(20, 20, 10); + mks_min_extrusion_temp = 0; +} xyz_pos_t position_before_pause; - void MKS_pause_print_move() { queue.exhaust(); position_before_pause = current_position; - do_blocking_move_to(X_MIN_POS + x_park_pos, Y_MIN_POS + y_park_pos, current_position.z + z_park_pos); + do_blocking_move_to(X_MIN_POS + mks_park_pos.x, Y_MIN_POS + mks_park_pos.y, current_position.z + mks_park_pos.z); } - void MKS_resume_print_move() { do_blocking_move_to(position_before_pause); } -uint16_t min_ex_temp = 0; - float z_offset_add = 0; -#if ENABLED(SENSORLESS_HOMING) - uint16_t tmc_x_step = 0; - uint16_t tmc_y_step = 0; - uint16_t tmc_z_step = 0; -#else - uint16_t tmc_x_step = 0; - uint16_t tmc_y_step = 0; - uint16_t tmc_z_step = 0; -#endif +xyz_int_t tmc_step; // = { 0, 0, 0 } uint16_t lcd_default_light = 50; @@ -525,7 +512,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { VPHELPER(VP_Y_HOME, nullptr, &ScreenHandler.HandleManualMove, nullptr), VPHELPER(VP_Z_HOME, nullptr, &ScreenHandler.HandleManualMove, nullptr), - VPHELPER(VP_MOVE_DISTANCE, &distanceMove, &ScreenHandler.GetManualMovestep, nullptr), + VPHELPER(VP_MOVE_DISTANCE, &manualMoveStep, &ScreenHandler.GetManualMovestep, nullptr), VPHELPER(VP_MOTOR_LOCK_UNLOK, nullptr, &ScreenHandler.HandleManualMove, nullptr), VPHELPER(VP_LEVEL_POINT, nullptr, &ScreenHandler.ManualAssistLeveling, nullptr), @@ -567,7 +554,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { #if ENABLED(DGUS_FILAMENT_LOADUNLOAD) VPHELPER(VP_LOAD_Filament, nullptr, &ScreenHandler.MKS_FilamentLoad, nullptr), VPHELPER(VP_UNLOAD_Filament, nullptr, &ScreenHandler.MKS_FilamentUnLoad, nullptr), - VPHELPER(VP_Filament_distance, &distanceFilament, &ScreenHandler.GetManualFilament, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<0>), + VPHELPER(VP_Filament_distance, &distanceFilament, &ScreenHandler.GetManualFilament, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<0>), VPHELPER(VP_Filament_speed, &FilamentSpeed, &ScreenHandler.GetManualFilamentSpeed, ScreenHandler.DGUSLCD_SendWordValueToDisplay), #endif #endif @@ -623,16 +610,16 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { VPHELPER(VP_ZPos, ¤t_position.z, nullptr, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<2>), // Level Point Set - VPHELPER(VP_Level_Point_One_X, &level_1_x_point, ScreenHandler.HandleChangeLevelPoint_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), - VPHELPER(VP_Level_Point_One_Y, &level_1_y_point, ScreenHandler.HandleChangeLevelPoint_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), - VPHELPER(VP_Level_Point_Two_X, &level_2_x_point, ScreenHandler.HandleChangeLevelPoint_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), - VPHELPER(VP_Level_Point_Two_Y, &level_2_y_point, ScreenHandler.HandleChangeLevelPoint_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), - VPHELPER(VP_Level_Point_Three_X, &level_3_x_point, ScreenHandler.HandleChangeLevelPoint_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), - VPHELPER(VP_Level_Point_Three_Y, &level_3_y_point, ScreenHandler.HandleChangeLevelPoint_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), - VPHELPER(VP_Level_Point_Four_X, &level_4_x_point, ScreenHandler.HandleChangeLevelPoint_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), - VPHELPER(VP_Level_Point_Four_Y, &level_4_y_point, ScreenHandler.HandleChangeLevelPoint_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), - VPHELPER(VP_Level_Point_Five_X, &level_5_x_point, ScreenHandler.HandleChangeLevelPoint_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), - VPHELPER(VP_Level_Point_Five_Y, &level_5_y_point, ScreenHandler.HandleChangeLevelPoint_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_Level_Point_One_X, &mks_corner_offsets[0].x, ScreenHandler.HandleChangeLevelPoint_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_Level_Point_One_Y, &mks_corner_offsets[0].y, ScreenHandler.HandleChangeLevelPoint_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_Level_Point_Two_X, &mks_corner_offsets[1].x, ScreenHandler.HandleChangeLevelPoint_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_Level_Point_Two_Y, &mks_corner_offsets[1].y, ScreenHandler.HandleChangeLevelPoint_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_Level_Point_Three_X, &mks_corner_offsets[2].x, ScreenHandler.HandleChangeLevelPoint_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_Level_Point_Three_Y, &mks_corner_offsets[2].y, ScreenHandler.HandleChangeLevelPoint_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_Level_Point_Four_X, &mks_corner_offsets[3].x, ScreenHandler.HandleChangeLevelPoint_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_Level_Point_Four_Y, &mks_corner_offsets[3].y, ScreenHandler.HandleChangeLevelPoint_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_Level_Point_Five_X, &mks_corner_offsets[4].x, ScreenHandler.HandleChangeLevelPoint_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_Level_Point_Five_Y, &mks_corner_offsets[4].y, ScreenHandler.HandleChangeLevelPoint_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), // Print Progress VPHELPER(VP_PrintProgress_Percentage, nullptr, nullptr, ScreenHandler.DGUSLCD_SendPrintProgressToDisplay), @@ -679,20 +666,20 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { VPHELPER(VP_T_F_SPEED, (uint16_t *)&planner.settings.min_travel_feedrate_mm_s, ScreenHandler.HandleMin_T_F_MKS, ScreenHandler.DGUSLCD_SendFloatAsIntValueToDisplay<0>), VPHELPER(VP_ACC_SPEED, (uint16_t *)&planner.settings.acceleration, ScreenHandler.HandleAccChange_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), - VPHELPER(VP_X_PARK_POS, &x_park_pos, ScreenHandler.GetParkPos_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), - VPHELPER(VP_Y_PARK_POS, &y_park_pos, ScreenHandler.GetParkPos_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), - VPHELPER(VP_Z_PARK_POS, &z_park_pos, ScreenHandler.GetParkPos_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_X_PARK_POS, &mks_park_pos.x, ScreenHandler.GetParkPos_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_Y_PARK_POS, &mks_park_pos.y, ScreenHandler.GetParkPos_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), + VPHELPER(VP_Z_PARK_POS, &mks_park_pos.z, ScreenHandler.GetParkPos_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), VPHELPER(VP_MIN_EX_T, &thermalManager.extrude_min_temp, ScreenHandler.HandleGetExMinTemp_MKS, ScreenHandler.DGUSLCD_SendWordValueToDisplay), #if ENABLED(SENSORLESS_HOMING) // TMC SENSORLESS Setting #if AXIS_HAS_STEALTHCHOP(X) - VPHELPER(VP_TMC_X_STEP, &tmc_x_step, ScreenHandler.TMC_ChangeConfig, ScreenHandler.DGUSLCD_SendTMCStepValue), + VPHELPER(VP_TMC_X_STEP, &tmc_step.x, ScreenHandler.TMC_ChangeConfig, ScreenHandler.DGUSLCD_SendTMCStepValue), #endif #if AXIS_HAS_STEALTHCHOP(Y) - VPHELPER(VP_TMC_Y_STEP, &tmc_y_step, ScreenHandler.TMC_ChangeConfig, ScreenHandler.DGUSLCD_SendTMCStepValue), + VPHELPER(VP_TMC_Y_STEP, &tmc_step.y, ScreenHandler.TMC_ChangeConfig, ScreenHandler.DGUSLCD_SendTMCStepValue), #endif #if AXIS_HAS_STEALTHCHOP(Z) - VPHELPER(VP_TMC_Z_STEP, &tmc_z_step, ScreenHandler.TMC_ChangeConfig, ScreenHandler.DGUSLCD_SendTMCStepValue), + VPHELPER(VP_TMC_Z_STEP, &tmc_step.z, ScreenHandler.TMC_ChangeConfig, ScreenHandler.DGUSLCD_SendTMCStepValue), #endif #endif diff --git a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.h b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.h index c8915a3d25..9a3690f356 100644 --- a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.h +++ b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.h @@ -23,7 +23,6 @@ #include "../DGUSDisplayDef.h" -#define USE_MKS_GREEN_UI //#define DGUS_MKS_RUNOUT_SENSOR #define LOGO_TIME_DELAY TERN(USE_MKS_GREEN_UI, 8000, 1500) @@ -36,43 +35,27 @@ #define MKS_FINSH -extern uint16_t distanceMove; +extern uint16_t manualMoveStep; extern float distanceFilament; extern uint16_t FilamentSpeed; extern float ZOffset_distance; extern float mesh_adj_distance; extern float Z_distance; -extern int16_t level_1_x_point; -extern int16_t level_1_y_point; -extern int16_t level_2_x_point; -extern int16_t level_2_y_point; -extern int16_t level_3_x_point; -extern int16_t level_3_y_point; -extern int16_t level_4_x_point; -extern int16_t level_4_y_point; -extern int16_t level_5_x_point; -extern int16_t level_5_y_point; +//extern struct { uint16_t h, m, s; } dgus_time; -extern uint16_t tim_h; -extern uint16_t tim_m; -extern uint16_t tim_s; +extern xy_int_t mks_corner_offsets[5]; +extern xyz_int_t mks_park_pos; +extern celsius_t mks_min_extrusion_temp; -extern uint16_t x_park_pos; -extern uint16_t y_park_pos; -extern uint16_t z_park_pos; +void MKS_reset_settings(); // Restore persistent settings to defaults -extern xyz_pos_t position_before_pause; void MKS_pause_print_move(); void MKS_resume_print_move(); -extern uint16_t min_ex_temp; - extern float z_offset_add; -extern uint16_t tmc_x_step; -extern uint16_t tmc_y_step; -extern uint16_t tmc_z_step; +xyz_int_t tmc_step; extern uint16_t lcd_default_light; diff --git a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp index d956ec4c52..b6633d3a1f 100644 --- a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp @@ -55,7 +55,7 @@ #endif bool DGUSAutoTurnOff = false; -uint8_t DGUSLanguageSwitch = 0; // Switch language for MKS DGUS +uint8_t mks_language_index; // Initialized by settings.load() // endianness swap uint32_t swap32(const uint32_t value) { return (value & 0x000000FFU) << 24U | (value & 0x0000FF00U) << 8U | (value & 0x00FF0000U) >> 8U | (value & 0xFF000000U) >> 24U; } @@ -125,11 +125,11 @@ void DGUSScreenHandler::DGUSLCD_SendGbkToDisplay(DGUS_VP_Variable &var) { } void DGUSScreenHandler::DGUSLCD_SendStringToDisplay_Language_MKS(DGUS_VP_Variable &var) { - if (DGUSLanguageSwitch == MKS_English) { + if (mks_language_index == MKS_English) { char *tmp = (char*) var.memadr; dgusdisplay.WriteVariable(var.VP, tmp, var.size, true); } - else if (DGUSLanguageSwitch == MKS_SimpleChinese) { + else if (mks_language_index == MKS_SimpleChinese) { uint16_t *tmp = (uint16_t *)var.memadr; dgusdisplay.WriteVariable(var.VP, tmp, var.size, true); } @@ -138,15 +138,15 @@ void DGUSScreenHandler::DGUSLCD_SendStringToDisplay_Language_MKS(DGUS_VP_Variabl void DGUSScreenHandler::DGUSLCD_SendTMCStepValue(DGUS_VP_Variable &var) { #if ENABLED(SENSORLESS_HOMING) #if AXIS_HAS_STEALTHCHOP(X) - tmc_x_step = stepperX.homing_threshold(); + tmc_step.x = stepperX.homing_threshold(); dgusdisplay.WriteVariable(var.VP, *(int16_t*)var.memadr); #endif #if AXIS_HAS_STEALTHCHOP(Y) - tmc_y_step = stepperY.homing_threshold(); + tmc_step.y = stepperY.homing_threshold(); dgusdisplay.WriteVariable(var.VP, *(int16_t*)var.memadr); #endif #if AXIS_HAS_STEALTHCHOP(Z) - tmc_z_step = stepperZ.homing_threshold(); + tmc_step.z = stepperZ.homing_threshold(); dgusdisplay.WriteVariable(var.VP, *(int16_t*)var.memadr); #endif #endif @@ -329,7 +329,7 @@ void DGUSScreenHandler::ZoffsetConfirm(DGUS_VP_Variable &var, void *val_ptr) { } void DGUSScreenHandler::GetTurnOffCtrl(DGUS_VP_Variable &var, void *val_ptr) { - DEBUG_ECHOLNPGM("ctrl turn off\n"); + DEBUG_ECHOLNPGM("GetTurnOffCtrl\n"); const uint16_t value = swap16(*(uint16_t *)val_ptr); switch (value) { case 0 ... 1: DGUSAutoTurnOff = (bool)value; break; @@ -338,15 +338,15 @@ void DGUSScreenHandler::GetTurnOffCtrl(DGUS_VP_Variable &var, void *val_ptr) { } void DGUSScreenHandler::GetMinExtrudeTemp(DGUS_VP_Variable &var, void *val_ptr) { - DEBUG_ECHOLNPGM("MinExtrudeTempChange DistanceChange"); + DEBUG_ECHOLNPGM("GetMinExtrudeTemp"); const uint16_t value = swap16(*(uint16_t *)val_ptr); thermalManager.extrude_min_temp = value; - min_ex_temp = value; + mks_min_extrusion_temp = value; settings.save(); } void DGUSScreenHandler::GetZoffsetDistance(DGUS_VP_Variable &var, void *val_ptr) { - DEBUG_ECHOLNPGM("Zoffset DistanceChange"); + DEBUG_ECHOLNPGM("GetZoffsetDistance"); const uint16_t value = swap16(*(uint16_t *)val_ptr); float val_distance = 0; switch (value) { @@ -360,7 +360,7 @@ void DGUSScreenHandler::GetZoffsetDistance(DGUS_VP_Variable &var, void *val_ptr) } void DGUSScreenHandler::GetManualMovestep(DGUS_VP_Variable &var, void *val_ptr) { - DEBUG_ECHOLNPGM("\nMove DistanceChange"); + DEBUG_ECHOLNPGM("\nGetManualMovestep"); *(uint16_t *)var.memadr = swap16(*(uint16_t *)val_ptr); } @@ -414,14 +414,14 @@ void DGUSScreenHandler::LanguageChange_MKS(DGUS_VP_Variable &var, void *val_ptr) switch (lag_flag) { case MKS_SimpleChinese: DGUS_LanguageDisplay(MKS_SimpleChinese); - DGUSLanguageSwitch = MKS_SimpleChinese; + mks_language_index = MKS_SimpleChinese; dgusdisplay.MKS_WriteVariable(VP_LANGUAGE_CHANGE1, MKS_Language_Choose); dgusdisplay.MKS_WriteVariable(VP_LANGUAGE_CHANGE2, MKS_Language_NoChoose); settings.save(); break; case MKS_English: DGUS_LanguageDisplay(MKS_English); - DGUSLanguageSwitch = MKS_English; + mks_language_index = MKS_English; dgusdisplay.MKS_WriteVariable(VP_LANGUAGE_CHANGE1, MKS_Language_NoChoose); dgusdisplay.MKS_WriteVariable(VP_LANGUAGE_CHANGE2, MKS_Language_Choose); settings.save(); @@ -454,11 +454,11 @@ void DGUSScreenHandler::Level_Ctrl_MKS(DGUS_VP_Variable &var, void *val_ptr) { mesh_point_count = GRID_MAX_POINTS; - if (DGUSLanguageSwitch == MKS_English) { + if (mks_language_index == MKS_English) { const char level_buf_en[] = "Start Level"; dgusdisplay.WriteVariable(VP_AutoLevel_1_Dis, level_buf_en, 32, true); } - else if (DGUSLanguageSwitch == MKS_SimpleChinese) { + else if (mks_language_index == MKS_SimpleChinese) { const uint16_t level_buf_ch[] = {0xAABF, 0xBCCA, 0xF7B5, 0xBDC6, 0x2000}; dgusdisplay.WriteVariable(VP_AutoLevel_1_Dis, level_buf_ch, 32, true); } @@ -532,15 +532,17 @@ void DGUSScreenHandler::MeshLevel(DGUS_VP_Variable &var, void *val_ptr) { break; case 2: - if (mesh_point_count == GRID_MAX_POINTS) { // 第1个点 + if (mesh_point_count == GRID_MAX_POINTS) { // The first point + + queue.enqueue_now_P(PSTR("G28")); queue.enqueue_now_P(PSTR("G29S1")); mesh_point_count--; - if (DGUSLanguageSwitch == MKS_English) { + if (mks_language_index == MKS_English) { const char level_buf_en1[] = "Next Point"; dgusdisplay.WriteVariable(VP_AutoLevel_1_Dis, level_buf_en1, 32, true); } - else if (DGUSLanguageSwitch == MKS_SimpleChinese) { + else if (mks_language_index == MKS_SimpleChinese) { const uint16_t level_buf_ch1[] = {0xC2CF, 0xBBD2, 0xE3B5, 0x2000}; dgusdisplay.WriteVariable(VP_AutoLevel_1_Dis, level_buf_ch1, 32, true); } @@ -548,11 +550,11 @@ void DGUSScreenHandler::MeshLevel(DGUS_VP_Variable &var, void *val_ptr) { else if (mesh_point_count > 1) { // 倒数第二个点 queue.enqueue_now_P(PSTR("G29S2")); mesh_point_count--; - if (DGUSLanguageSwitch == MKS_English) { + if (mks_language_index == MKS_English) { const char level_buf_en2[] = "Next Point"; dgusdisplay.WriteVariable(VP_AutoLevel_1_Dis, level_buf_en2, 32, true); } - else if (DGUSLanguageSwitch == MKS_SimpleChinese) { + else if (mks_language_index == MKS_SimpleChinese) { const uint16_t level_buf_ch2[] = {0xC2CF, 0xBBD2, 0xE3B5, 0x2000}; dgusdisplay.WriteVariable(VP_AutoLevel_1_Dis, level_buf_ch2, 32, true); } @@ -560,11 +562,11 @@ void DGUSScreenHandler::MeshLevel(DGUS_VP_Variable &var, void *val_ptr) { else if (mesh_point_count == 1) { queue.enqueue_now_P(PSTR("G29S2")); mesh_point_count--; - if (DGUSLanguageSwitch == MKS_English) { + if (mks_language_index == MKS_English) { const char level_buf_en2[] = "Level Finsh"; dgusdisplay.WriteVariable(VP_AutoLevel_1_Dis, level_buf_en2, 32, true); } - else if (DGUSLanguageSwitch == MKS_SimpleChinese) { + else if (mks_language_index == MKS_SimpleChinese) { const uint16_t level_buf_ch2[] = {0xF7B5, 0xBDC6, 0xEACD, 0xC9B3, 0x2000}; dgusdisplay.WriteVariable(VP_AutoLevel_1_Dis, level_buf_ch2, 32, true); } @@ -597,85 +599,52 @@ void DGUSScreenHandler::LCD_BLK_Adjust(DGUS_VP_Variable &var, void *val_ptr) { void DGUSScreenHandler::ManualAssistLeveling(DGUS_VP_Variable &var, void *val_ptr) { const int16_t point_value = swap16(*(uint16_t *)val_ptr); - int16_t level_x_pos, level_y_pos; - char buf_level[32] = {0}; - unsigned int level_speed = 1500; + // Insist on leveling first time at this screen static bool first_level_flag = false; - - if (!first_level_flag) + if (!first_level_flag || point_value == 0x0001) { queue.enqueue_now_P(G28_STR); + first_level_flag = true; + } + + constexpr uint16_t level_speed = 1500; + + auto enqueue_corner_move = [](int16_t lx, int16_t ly, uint16_t fr) { + char buf_level[32]; + sprintf_P(buf_level, "G0X%dY%dF%d", lx, ly, fr); + queue.enqueue_one_now(buf_level); + }; + + if (WITHIN(point_value, 0x0001, 0x0005)) + queue.enqueue_now_P(PSTR("G1Z10")); switch (point_value) { case 0x0001: - if (first_level_flag) - queue.enqueue_now_P(G28_STR); - queue.enqueue_now_P(PSTR("G1 Z10")); - //level_x_pos = X_MIN_POS + 20; - //level_y_pos = Y_MIN_POS + 20; - level_x_pos = X_MIN_POS + abs(level_1_x_point); - level_y_pos = Y_MIN_POS + abs(level_1_y_point); - - memset(buf_level, 0, sizeof(buf_level)); - sprintf_P(buf_level, "G0 X%d Y%d F%d", level_x_pos, level_y_pos, level_speed); - queue.enqueue_one_now(buf_level); - queue.enqueue_now_P(PSTR("G28 Z")); + enqueue_corner_move(X_MIN_POS + abs(mks_corner_offsets[0].x), + Y_MIN_POS + abs(mks_corner_offsets[0].y), level_speed); + queue.enqueue_now_P(PSTR("G28Z")); break; case 0x0002: - queue.enqueue_now_P(PSTR("G1 Z10")); - - //level_x_pos = X_MAX_POS - 20; - //level_y_pos = Y_MIN_POS + 20; - - level_x_pos = X_MAX_POS - abs(level_2_x_point); - level_y_pos = Y_MIN_POS + abs(level_2_y_point); - - sprintf_P(buf_level, "G0 X%d Y%d F%d", level_x_pos, level_y_pos, level_speed); - queue.enqueue_one_now(buf_level); - //queue.enqueue_now_P(PSTR("G28Z")); - queue.enqueue_now_P(PSTR("G1 Z-10")); + enqueue_corner_move(X_MAX_POS - abs(mks_corner_offsets[1].x), + Y_MIN_POS + abs(mks_corner_offsets[1].y), level_speed); break; case 0x0003: - queue.enqueue_now_P(PSTR("G1 Z10")); - - //level_x_pos = X_MAX_POS - 20; - //level_y_pos = Y_MAX_POS - 20; - - level_x_pos = X_MAX_POS - abs(level_3_x_point); - level_y_pos = Y_MAX_POS - abs(level_3_y_point); - - sprintf_P(buf_level, "G0 X%d Y%d F%d", level_x_pos, level_y_pos, level_speed); - queue.enqueue_one_now(buf_level); - //sprintf_P(buf_level, PSTR("G28 Z")); - queue.enqueue_now_P(PSTR("G1 Z-10")); + enqueue_corner_move(X_MAX_POS - abs(mks_corner_offsets[2].x), + Y_MAX_POS - abs(mks_corner_offsets[2].y), level_speed); break; case 0x0004: - queue.enqueue_now_P(PSTR("G1 Z10")); - - //level_x_pos = X_MIN_POS + 20; - //level_y_pos = Y_MAX_POS - 20; - level_x_pos = X_MIN_POS + abs(level_4_x_point); - level_y_pos = Y_MAX_POS - abs(level_4_y_point); - - sprintf_P(buf_level, "G0 X%d Y%d F%d", level_x_pos, level_y_pos, level_speed); - queue.enqueue_one_now(buf_level); - //sprintf_P(buf_level, PSTR("G28 Z")); - queue.enqueue_now_P(PSTR("G1 Z-10")); + enqueue_corner_move(X_MIN_POS + abs(mks_corner_offsets[3].x), + Y_MAX_POS - abs(mks_corner_offsets[3].y), level_speed); break; case 0x0005: - queue.enqueue_now_P(PSTR("G1 Z10")); - //level_x_pos = (uint16_t)(X_MAX_POS / 2); - //level_y_pos = (uint16_t)(Y_MAX_POS / 2); - level_x_pos = abs(level_5_x_point); - level_y_pos = abs(level_5_y_point); - - sprintf_P(buf_level, "G0 X%d Y%d F%d", level_x_pos, level_y_pos, level_speed); - queue.enqueue_one_now(buf_level); - queue.enqueue_now_P(PSTR("G1 Z-10")); + enqueue_corner_move(abs(mks_corner_offsets[4].x), + abs(mks_corner_offsets[4].y), level_speed); break; } - // Only once - first_level_flag = true; + if (WITHIN(point_value, 0x0002, 0x0005)) { + //queue.enqueue_now_P(PSTR("G28Z")); + queue.enqueue_now_P(PSTR("G1Z-10")); + } } #define mks_min(a, b) ((a) < (b)) ? (a) : (b) @@ -691,7 +660,7 @@ void DGUSScreenHandler::TMC_ChangeConfig(DGUS_VP_Variable &var, void *val_ptr) { #if AXIS_HAS_STEALTHCHOP(X) stepperX.homing_threshold(mks_min(tmc_value, 255)); settings.save(); - //tmc_x_step = stepperX.homing_threshold(); + //tmc_step.x = stepperX.homing_threshold(); #endif #endif break; @@ -700,7 +669,7 @@ void DGUSScreenHandler::TMC_ChangeConfig(DGUS_VP_Variable &var, void *val_ptr) { #if AXIS_HAS_STEALTHCHOP(Y) stepperY.homing_threshold(mks_min(tmc_value, 255)); settings.save(); - //tmc_y_step = stepperY.homing_threshold(); + //tmc_step.y = stepperY.homing_threshold(); #endif #endif break; @@ -709,7 +678,7 @@ void DGUSScreenHandler::TMC_ChangeConfig(DGUS_VP_Variable &var, void *val_ptr) { #if AXIS_HAS_STEALTHCHOP(Z) stepperZ.homing_threshold(mks_min(tmc_value, 255)); settings.save(); - //tmc_z_step = stepperZ.homing_threshold(); + //tmc_step.z = stepperZ.homing_threshold(); #endif #endif break; @@ -767,13 +736,13 @@ void DGUSScreenHandler::TMC_ChangeConfig(DGUS_VP_Variable &var, void *val_ptr) { } #if USE_SENSORLESS #if AXIS_HAS_STEALTHCHOP(X) - tmc_x_step = stepperX.homing_threshold(); + tmc_step.x = stepperX.homing_threshold(); #endif #if AXIS_HAS_STEALTHCHOP(Y) - tmc_y_step = stepperY.homing_threshold(); + tmc_step.y = stepperY.homing_threshold(); #endif #if AXIS_HAS_STEALTHCHOP(Z) - tmc_z_step = stepperZ.homing_threshold(); + tmc_step.z = stepperZ.homing_threshold(); #endif #endif } @@ -784,9 +753,9 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { int16_t movevalue = swap16(*(uint16_t*)val_ptr); // Choose Move distance - if (distanceMove == 0x01) distanceMove = 10; - else if (distanceMove == 0x02) distanceMove = 100; - else if (distanceMove == 0x03) distanceMove = 1000; + if (manualMoveStep == 0x01) manualMoveStep = 10; + else if (manualMoveStep == 0x02) manualMoveStep = 100; + else if (manualMoveStep == 0x03) manualMoveStep = 1000; DEBUG_ECHOLNPAIR("QUEUE LEN:", queue.length); @@ -853,8 +822,8 @@ void DGUSScreenHandler::HandleManualMove(DGUS_VP_Variable &var, void *val_ptr) { DEBUG_ECHOPAIR("movevalue = ", movevalue); if (movevalue != 0 && movevalue != 5) { // get move distance switch (movevalue) { - case 0x0001: movevalue = distanceMove; break; - case 0x0002: movevalue = -distanceMove; break; + case 0x0001: movevalue = manualMoveStep; break; + case 0x0002: movevalue = -manualMoveStep; break; default: movevalue = 0; break; } } @@ -929,16 +898,16 @@ void DGUSScreenHandler::GetParkPos_MKS(DGUS_VP_Variable &var, void *val_ptr) { const int16_t value_pos = swap16(*(int16_t*)val_ptr); switch (var.VP) { - case VP_X_PARK_POS: x_park_pos = value_pos; break; - case VP_Y_PARK_POS: y_park_pos = value_pos; break; - case VP_Z_PARK_POS: z_park_pos = value_pos; break; + case VP_X_PARK_POS: mks_park_pos.x = value_pos; break; + case VP_Y_PARK_POS: mks_park_pos.y = value_pos; break; + case VP_Z_PARK_POS: mks_park_pos.z = value_pos; break; default: break; } skipVP = var.VP; // don't overwrite value the next update time as the display might autoincrement in parallel } void DGUSScreenHandler::HandleChangeLevelPoint_MKS(DGUS_VP_Variable &var, void *val_ptr) { - DEBUG_ECHOLNPGM("HandleStepPerMMChanged"); + DEBUG_ECHOLNPGM("HandleChangeLevelPoint_MKS"); const int16_t value_raw = swap16(*(int16_t*)val_ptr); DEBUG_ECHOLNPAIR_F("value_raw:", value_raw); @@ -950,7 +919,7 @@ void DGUSScreenHandler::HandleChangeLevelPoint_MKS(DGUS_VP_Variable &var, void * } void DGUSScreenHandler::HandleStepPerMMChanged_MKS(DGUS_VP_Variable &var, void *val_ptr) { - DEBUG_ECHOLNPGM("HandleStepPerMMChanged"); + DEBUG_ECHOLNPGM("HandleStepPerMMChanged_MKS"); const uint16_t value_raw = swap16(*(uint16_t*)val_ptr); const float value = (float)value_raw; @@ -972,7 +941,7 @@ void DGUSScreenHandler::HandleStepPerMMChanged_MKS(DGUS_VP_Variable &var, void * } void DGUSScreenHandler::HandleStepPerMMExtruderChanged_MKS(DGUS_VP_Variable &var, void *val_ptr) { - DEBUG_ECHOLNPGM("HandleStepPerMMExtruderChanged"); + DEBUG_ECHOLNPGM("HandleStepPerMMExtruderChanged_MKS"); const uint16_t value_raw = swap16(*(uint16_t*)val_ptr); const float value = (float)value_raw; @@ -1019,7 +988,7 @@ void DGUSScreenHandler::HandleMaxSpeedChange_MKS(DGUS_VP_Variable &var, void *va } void DGUSScreenHandler::HandleExtruderMaxSpeedChange_MKS(DGUS_VP_Variable &var, void *val_ptr) { - DEBUG_ECHOLNPGM("HandleMaxSpeedChange_MKS"); + DEBUG_ECHOLNPGM("HandleExtruderMaxSpeedChange_MKS"); const uint16_t value_raw = swap16(*(uint16_t*)val_ptr); const float value = (float)value_raw; @@ -1044,7 +1013,7 @@ void DGUSScreenHandler::HandleExtruderMaxSpeedChange_MKS(DGUS_VP_Variable &var, } void DGUSScreenHandler::HandleMaxAccChange_MKS(DGUS_VP_Variable &var, void *val_ptr) { - DEBUG_ECHOLNPGM("HandleMaxSpeedChange_MKS"); + DEBUG_ECHOLNPGM("HandleMaxAccChange_MKS"); const uint16_t value_raw = swap16(*(uint16_t*)val_ptr); const float value = (float)value_raw; @@ -1066,7 +1035,7 @@ void DGUSScreenHandler::HandleMaxAccChange_MKS(DGUS_VP_Variable &var, void *val_ } void DGUSScreenHandler::HandleExtruderAccChange_MKS(DGUS_VP_Variable &var, void *val_ptr) { - DEBUG_ECHOLNPGM("HandleMaxSpeedChange_MKS"); + DEBUG_ECHOLNPGM("HandleExtruderAccChange_MKS"); uint16_t value_raw = swap16(*(uint16_t*)val_ptr); DEBUG_ECHOLNPAIR("value_raw:", value_raw); @@ -1199,7 +1168,7 @@ void DGUSScreenHandler::HandleGetExMinTemp_MKS(DGUS_VP_Variable &var, void *val_ #endif // BABYSTEPPING void DGUSScreenHandler::GetManualFilament(DGUS_VP_Variable &var, void *val_ptr) { - DEBUG_ECHOLNPGM("HandleGetFilament"); + DEBUG_ECHOLNPGM("GetManualFilament"); uint16_t value_len = swap16(*(uint16_t*)val_ptr); @@ -1212,7 +1181,7 @@ void DGUSScreenHandler::GetManualFilament(DGUS_VP_Variable &var, void *val_ptr) } void DGUSScreenHandler::GetManualFilamentSpeed(DGUS_VP_Variable &var, void *val_ptr) { - DEBUG_ECHOLNPGM("HandleGetFilamentSpeed"); + DEBUG_ECHOLNPGM("GetManualFilamentSpeed"); uint16_t value_len = swap16(*(uint16_t*)val_ptr); @@ -1225,8 +1194,10 @@ void DGUSScreenHandler::GetManualFilamentSpeed(DGUS_VP_Variable &var, void *val_ void DGUSScreenHandler::MKS_FilamentLoadUnload(DGUS_VP_Variable &var, void *val_ptr, const int filamentDir) { #if EITHER(HAS_MULTI_HOTEND, SINGLENOZZLE) + char buf[40]; uint8_t swap_tool = 0; #endif + #if HAS_HOTEND uint8_t hotend_too_cold = 0; #endif @@ -1234,13 +1205,19 @@ void DGUSScreenHandler::MKS_FilamentLoadUnload(DGUS_VP_Variable &var, void *val_ if (!print_job_timer.isPaused() && !queue.ring_buffer.empty()) return; - char buf[40]; const uint16_t val_t = swap16(*(uint16_t*)val_ptr); switch (val_t) { default: break; case 0: #if HAS_HOTEND - if (thermalManager.tooColdToExtrude(0)) hotend_too_cold = 1; else swap_tool = 1; + if (thermalManager.tooColdToExtrude(0)) { + hotend_too_cold = 1; + } + else { + #if EITHER(HAS_MULTI_HOTEND, SINGLENOZZLE) + swap_tool = 2; + #endif + } #endif break; case 1: @@ -1273,12 +1250,12 @@ void DGUSScreenHandler::MKS_FilamentLoadUnload(DGUS_VP_Variable &var, void *val_ } void DGUSScreenHandler::MKS_FilamentLoad(DGUS_VP_Variable &var, void *val_ptr) { - DEBUG_ECHOLNPGM("Load Filament"); + DEBUG_ECHOLNPGM("MKS_FilamentLoad"); MKS_FilamentLoadUnload(var, val_ptr, 1); } void DGUSScreenHandler::MKS_FilamentUnLoad(DGUS_VP_Variable &var, void *val_ptr) { - DEBUG_ECHOLNPGM("UnLoad Filament"); + DEBUG_ECHOLNPGM("MKS_FilamentUnLoad"); MKS_FilamentLoadUnload(var, val_ptr, -1); } @@ -1403,7 +1380,7 @@ bool DGUSScreenHandler::loop() { if (language_times != 0) { LanguagePInit(); - DGUS_LanguageDisplay(DGUSLanguageSwitch); + DGUS_LanguageDisplay(mks_language_index); language_times--; } @@ -1413,18 +1390,18 @@ bool DGUSScreenHandler::loop() { booted = true; #if USE_SENSORLESS #if AXIS_HAS_STEALTHCHOP(X) - tmc_x_step = stepperX.homing_threshold(); + tmc_step.x = stepperX.homing_threshold(); #endif #if AXIS_HAS_STEALTHCHOP(Y) - tmc_y_step = stepperY.homing_threshold(); + tmc_step.y = stepperY.homing_threshold(); #endif #if AXIS_HAS_STEALTHCHOP(Z) - tmc_z_step = stepperZ.homing_threshold(); + tmc_step.z = stepperZ.homing_threshold(); #endif #endif - if (min_ex_temp != 0) - thermalManager.extrude_min_temp = min_ex_temp; + if (mks_min_extrusion_temp != 0) + thermalManager.extrude_min_temp = mks_min_extrusion_temp; DGUS_ExtrudeLoadInit(); @@ -1446,7 +1423,7 @@ bool DGUSScreenHandler::loop() { } void DGUSScreenHandler::LanguagePInit() { - switch (DGUSLanguageSwitch) { + switch (mks_language_index) { case MKS_SimpleChinese: dgusdisplay.MKS_WriteVariable(VP_LANGUAGE_CHANGE1, MKS_Language_Choose); dgusdisplay.MKS_WriteVariable(VP_LANGUAGE_CHANGE2, MKS_Language_NoChoose); @@ -1705,10 +1682,10 @@ void DGUSScreenHandler::DGUS_LanguageDisplay(uint8_t var) { const char Printing_buf_en[] = "Printing"; dgusdisplay.WriteVariable(VP_Printing_Dis, Printing_buf_en, 32, true); - const char Info_EEPROM_1_buf_en[] = "Store setting?"; + const char Info_EEPROM_1_buf_en[] = "Store setting?"; dgusdisplay.WriteVariable(VP_Info_EEPROM_1_Dis, Info_EEPROM_1_buf_en, 32, true); - const char Info_EEPROM_2_buf_en[] = "Revert setting?"; + const char Info_EEPROM_2_buf_en[] = "Revert setting?"; dgusdisplay.WriteVariable(VP_Info_EEPROM_2_Dis, Info_EEPROM_2_buf_en, 32, true); const char Info_PrinfFinsh_1_buf_en[] = "Print Done"; @@ -1963,7 +1940,7 @@ void DGUSScreenHandler::DGUS_LanguageDisplay(uint8_t var) { const uint16_t Info_EEPROM_1_buf_ch[] = { 0xC7CA, 0xF1B7, 0xA3B1, 0xE6B4, 0xE8C9, 0xC3D6, 0xBFA3, 0x2000 }; dgusdisplay.WriteVariable(VP_Info_EEPROM_1_Dis, Info_EEPROM_1_buf_ch, 32, true); - const uint16_t Info_EEPROM_2_buf_ch[] = { 0xC7CA, 0xF1B7, 0xD6BB, 0xB4B8, 0xF6B3, 0xA7B3, 0xE8C9, 0xC3D6, 0x2000 }; + const uint16_t Info_EEPROM_2_buf_ch[] = { 0xC7CA, 0xF1B7, 0xD6BB, 0xB4B8, 0xF6B3, 0xA7B3, 0xE8C9, 0xC3D6, 0xBFA3, 0x2000 }; dgusdisplay.WriteVariable(VP_Info_EEPROM_2_Dis, Info_EEPROM_2_buf_ch, 32, true); const uint16_t TMC_X_Step_buf_ch[] = { 0x2058, 0xE9C1, 0xF4C3, 0xC8B6, 0x2000 }; diff --git a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.h b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.h index dc656326ac..2d0678ca5b 100644 --- a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.h +++ b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.h @@ -158,13 +158,13 @@ public: static void GetManualFilamentSpeed(DGUS_VP_Variable &var, void *val_ptr); #endif + // File touched. + static void DGUSLCD_SD_FileSelected(DGUS_VP_Variable &var, void *val_ptr); #if ENABLED(SDSUPPORT) // Callback for VP "Display wants to change screen when there is a SD card" static void ScreenChangeHookIfSD(DGUS_VP_Variable &var, void *val_ptr); // Scroll buttons on the file listing screen. static void DGUSLCD_SD_ScrollFilelist(DGUS_VP_Variable &var, void *val_ptr); - // File touched. - static void DGUSLCD_SD_FileSelected(DGUS_VP_Variable &var, void *val_ptr); // start print after confirmation received. static void DGUSLCD_SD_StartPrint(DGUS_VP_Variable &var, void *val_ptr); // User hit the pause, resume or abort button. @@ -301,7 +301,7 @@ private: #define MKS_SimpleChinese 0 #define MKS_English 1 -extern uint8_t DGUSLanguageSwitch; +extern uint8_t mks_language_index; extern bool DGUSAutoTurnOff; #if ENABLED(POWER_LOSS_RECOVERY) diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index d98ee3c218..ced33a1986 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -153,6 +153,11 @@ #include "../libs/buzzer.h" #endif +#if ENABLED(DGUS_LCD_UI_MKS) + #include "../lcd/extui/lib/dgus/DGUSScreenHandler.h" + #include "../lcd/extui/lib/dgus/DGUSDisplayDef.h" +#endif + #pragma pack(push, 1) // No padding between variables #if HAS_ETHERNET @@ -461,6 +466,16 @@ typedef struct SettingsDataStruct { bool buzzer_enabled; #endif + // + // MKS UI controller + // + #if ENABLED(DGUS_LCD_UI_MKS) + uint8_t mks_language_index; // Display Language + xy_int_t mks_corner_offsets[5]; // Bed Tramming + xyz_int_t mks_park_pos; // Custom Parking (without NOZZLE_PARK) + celsius_t mks_min_extrusion_temp; // Min E Temp (shadow M302 value) + #endif + #if HAS_MULTI_LANGUAGE uint8_t ui_language; // M414 S #endif @@ -1402,6 +1417,16 @@ void MarlinSettings::postprocess() { EEPROM_WRITE(ui.buzzer_enabled); #endif + // + // MKS UI controller + // + #if ENABLED(DGUS_LCD_UI_MKS) + EEPROM_WRITE(mks_language_index); + EEPROM_WRITE(mks_corner_offsets); + EEPROM_WRITE(mks_park_pos); + EEPROM_WRITE(mks_min_extrusion_temp); + #endif + // // Selected LCD language // @@ -2302,6 +2327,17 @@ void MarlinSettings::postprocess() { EEPROM_READ(ui.buzzer_enabled); #endif + // + // MKS UI controller + // + #if ENABLED(DGUS_LCD_UI_MKS) + _FIELD_TEST(mks_language_index); + EEPROM_READ(mks_language_index); + EEPROM_READ(mks_corner_offsets); + EEPROM_READ(mks_park_pos); + EEPROM_READ(mks_min_extrusion_temp); + #endif + // // Selected LCD language // @@ -2967,6 +3003,11 @@ void MarlinSettings::reset() { #endif #endif + // + // MKS UI controller + // + TERN_(DGUS_LCD_UI_MKS, MKS_reset_settings()); + postprocess(); DEBUG_ECHO_START(); From 600ef1e47cf905bec1e76b35f3912863ade4fff0 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Thu, 1 Apr 2021 00:34:23 +0000 Subject: [PATCH 241/253] [cron] Bump distribution date (2021-04-01) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 2930228b14..361b647dd5 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2021-03-31" + #define STRING_DISTRIBUTION_DATE "2021-04-01" #endif /** From 62f37669dc506a6e579389ca549ce5993548944d Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 1 Apr 2021 17:59:57 -0500 Subject: [PATCH 242/253] Replace 'const float &' with 'const_float_t' (#21505) --- Marlin/src/HAL/AVR/fastio.cpp | 2 +- Marlin/src/core/serial.cpp | 2 +- Marlin/src/core/serial.h | 2 +- Marlin/src/core/types.h | 10 +++ Marlin/src/feature/babystep.cpp | 2 +- Marlin/src/feature/babystep.h | 2 +- Marlin/src/feature/backlash.h | 2 +- Marlin/src/feature/bedlevel/abl/abl.cpp | 4 +- Marlin/src/feature/bedlevel/abl/abl.h | 2 +- Marlin/src/feature/bedlevel/bedlevel.cpp | 2 +- Marlin/src/feature/bedlevel/bedlevel.h | 2 +- .../bedlevel/mbl/mesh_bed_leveling.cpp | 2 +- .../feature/bedlevel/mbl/mesh_bed_leveling.h | 22 +++--- Marlin/src/feature/bedlevel/ubl/ubl.cpp | 4 +- Marlin/src/feature/bedlevel/ubl/ubl.h | 44 +++++------ Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp | 12 +-- .../src/feature/bedlevel/ubl/ubl_motion.cpp | 4 +- Marlin/src/feature/encoder_i2c.h | 2 +- Marlin/src/feature/filwidth.h | 2 +- .../src/feature/leds/printer_event_leds.cpp | 8 +- Marlin/src/feature/leds/printer_event_leds.h | 6 +- Marlin/src/feature/max7219.cpp | 2 +- Marlin/src/feature/max7219.h | 7 ++ Marlin/src/feature/mixing.cpp | 2 +- Marlin/src/feature/mixing.h | 4 +- Marlin/src/feature/pause.cpp | 10 +-- Marlin/src/feature/pause.h | 10 +-- Marlin/src/feature/powerloss.cpp | 2 +- Marlin/src/feature/powerloss.h | 2 +- Marlin/src/feature/probe_temp_comp.cpp | 8 +- Marlin/src/feature/probe_temp_comp.h | 8 +- Marlin/src/feature/runout.h | 2 +- Marlin/src/feature/spindle_laser.h | 2 +- Marlin/src/gcode/bedlevel/G26.cpp | 4 +- Marlin/src/gcode/calibrate/G33.cpp | 2 +- Marlin/src/gcode/calibrate/G34_M422.cpp | 2 +- Marlin/src/gcode/calibrate/M48.cpp | 2 +- Marlin/src/gcode/feature/camera/M240.cpp | 2 +- Marlin/src/gcode/feature/mixing/M166.cpp | 2 +- Marlin/src/gcode/motion/M290.cpp | 2 +- Marlin/src/gcode/parser.h | 12 +-- Marlin/src/lcd/dogm/marlinui_DOGM.cpp | 2 +- Marlin/src/lcd/extui/anycubic_chiron_lcd.cpp | 2 +- Marlin/src/lcd/extui/anycubic_i3mega_lcd.cpp | 2 +- Marlin/src/lcd/extui/dgus_lcd.cpp | 2 +- Marlin/src/lcd/extui/example.cpp | 2 +- .../lib/ftdi_eve_touch_ui/marlin_events.cpp | 2 +- Marlin/src/lcd/extui/malyan_lcd.cpp | 2 +- Marlin/src/lcd/extui/ui_api.cpp | 70 +++++++++--------- Marlin/src/lcd/extui/ui_api.h | 74 +++++++++---------- Marlin/src/lcd/marlinui.h | 2 +- Marlin/src/lcd/menu/menu.cpp | 2 +- Marlin/src/lcd/menu/menu.h | 8 +- Marlin/src/lcd/menu/menu_delta_calibrate.cpp | 2 +- Marlin/src/lcd/menu/menu_item.h | 10 +-- Marlin/src/lcd/menu/menu_motion.cpp | 2 +- Marlin/src/lcd/menu/menu_probe_offset.cpp | 4 +- Marlin/src/lcd/menu/menu_ubl.cpp | 2 +- Marlin/src/libs/L64XX/L64XX_Marlin.cpp | 4 +- Marlin/src/libs/least_squares_fit.h | 8 +- Marlin/src/libs/nozzle.cpp | 4 +- Marlin/src/libs/nozzle.h | 4 +- Marlin/src/libs/numtostr.cpp | 38 +++++----- Marlin/src/libs/numtostr.h | 49 ++++++------ Marlin/src/libs/vector_3.h | 2 +- Marlin/src/module/delta.cpp | 2 +- Marlin/src/module/delta.h | 2 +- Marlin/src/module/motion.cpp | 32 ++++---- Marlin/src/module/motion.h | 46 ++++++------ Marlin/src/module/planner.cpp | 22 +++--- Marlin/src/module/planner.h | 56 +++++++------- Marlin/src/module/planner_bezier.cpp | 8 +- Marlin/src/module/planner_bezier.h | 2 +- Marlin/src/module/probe.cpp | 6 +- Marlin/src/module/probe.h | 12 +-- Marlin/src/module/scara.cpp | 4 +- Marlin/src/module/scara.h | 4 +- Marlin/src/module/temperature.cpp | 8 +- Marlin/src/module/temperature.h | 14 ++-- 79 files changed, 376 insertions(+), 366 deletions(-) diff --git a/Marlin/src/HAL/AVR/fastio.cpp b/Marlin/src/HAL/AVR/fastio.cpp index b51d7f9768..70132e71ee 100644 --- a/Marlin/src/HAL/AVR/fastio.cpp +++ b/Marlin/src/HAL/AVR/fastio.cpp @@ -241,7 +241,7 @@ uint8_t extDigitalRead(const int8_t pin) { * * DC values -1.0 to 1.0. Negative duty cycle inverts the pulse. */ -uint16_t set_pwm_frequency_hz(const float &hz, const float dca, const float dcb, const float dcc) { +uint16_t set_pwm_frequency_hz(const_float_t hz, const float dca, const float dcb, const float dcc) { float count = 0; if (hz > 0 && (dca || dcb || dcc)) { count = float(F_CPU) / hz; // 1x prescaler, TOP for 16MHz base freq. diff --git a/Marlin/src/core/serial.cpp b/Marlin/src/core/serial.cpp index dcbfd608bf..8af367c801 100644 --- a/Marlin/src/core/serial.cpp +++ b/Marlin/src/core/serial.cpp @@ -91,7 +91,7 @@ void print_bin(uint16_t val) { } } -void print_xyz(const float &x, const float &y, const float &z, PGM_P const prefix/*=nullptr*/, PGM_P const suffix/*=nullptr*/) { +void print_xyz(const_float_t x, const_float_t y, const_float_t z, PGM_P const prefix/*=nullptr*/, PGM_P const suffix/*=nullptr*/) { if (prefix) serialprintPGM(prefix); SERIAL_ECHOPAIR_P(SP_X_STR, x, SP_Y_STR, y, SP_Z_STR, z); if (suffix) serialprintPGM(suffix); else SERIAL_EOL(); diff --git a/Marlin/src/core/serial.h b/Marlin/src/core/serial.h index 43137f71d7..45a1ab012e 100644 --- a/Marlin/src/core/serial.h +++ b/Marlin/src/core/serial.h @@ -387,7 +387,7 @@ void serialprint_truefalse(const bool tf); void serial_spaces(uint8_t count); void print_bin(const uint16_t val); -void print_xyz(const float &x, const float &y, const float &z, PGM_P const prefix=nullptr, PGM_P const suffix=nullptr); +void print_xyz(const_float_t x, const_float_t y, const_float_t z, PGM_P const prefix=nullptr, PGM_P const suffix=nullptr); inline void print_xyz(const xyz_pos_t &xyz, PGM_P const prefix=nullptr, PGM_P const suffix=nullptr) { print_xyz(xyz.x, xyz.y, xyz.z, prefix, suffix); diff --git a/Marlin/src/core/types.h b/Marlin/src/core/types.h index d77dba38d9..687ec867d1 100644 --- a/Marlin/src/core/types.h +++ b/Marlin/src/core/types.h @@ -78,6 +78,16 @@ typedef float feedRate_t; // typedef int16_t celsius_t; +// +// On AVR pointers are only 2 bytes so use 'const float &' for 'const float' +// +#ifdef __AVR__ + typedef const float & const_float_t; +#else + typedef const float const_float_t; +#endif +typedef const_float_t const_feedRate_t; + // Conversion macros #define MMM_TO_MMS(MM_M) feedRate_t(float(MM_M) / 60.0f) #define MMS_TO_MMM(MM_S) (float(MM_S) * 60.0f) diff --git a/Marlin/src/feature/babystep.cpp b/Marlin/src/feature/babystep.cpp index b076881461..54ad9588f4 100644 --- a/Marlin/src/feature/babystep.cpp +++ b/Marlin/src/feature/babystep.cpp @@ -50,7 +50,7 @@ void Babystep::step_axis(const AxisEnum axis) { } } -void Babystep::add_mm(const AxisEnum axis, const float &mm) { +void Babystep::add_mm(const AxisEnum axis, const_float_t mm) { add_steps(axis, mm * planner.settings.axis_steps_per_mm[axis]); } diff --git a/Marlin/src/feature/babystep.h b/Marlin/src/feature/babystep.h index f85e5909ca..f8037678ca 100644 --- a/Marlin/src/feature/babystep.h +++ b/Marlin/src/feature/babystep.h @@ -61,7 +61,7 @@ public: #endif static void add_steps(const AxisEnum axis, const int16_t distance); - static void add_mm(const AxisEnum axis, const float &mm); + static void add_mm(const AxisEnum axis, const_float_t mm); static inline bool has_steps() { return steps[BS_AXIS_IND(X_AXIS)] || steps[BS_AXIS_IND(Y_AXIS)] || steps[BS_AXIS_IND(Z_AXIS)]; diff --git a/Marlin/src/feature/backlash.h b/Marlin/src/feature/backlash.h index 49857f1f99..500168b380 100644 --- a/Marlin/src/feature/backlash.h +++ b/Marlin/src/feature/backlash.h @@ -35,7 +35,7 @@ public: static float smoothing_mm; #endif - static inline void set_correction(const float &v) { correction = _MAX(0, _MIN(1.0, v)) * all_on; } + static inline void set_correction(const_float_t v) { correction = _MAX(0, _MIN(1.0, v)) * all_on; } static inline float get_correction() { return float(ui8_to_percent(correction)) / 100.0f; } #else static constexpr uint8_t correction = (BACKLASH_CORRECTION) * 0xFF; diff --git a/Marlin/src/feature/bedlevel/abl/abl.cpp b/Marlin/src/feature/bedlevel/abl/abl.cpp index a663ee571d..bc3aedb2f4 100644 --- a/Marlin/src/feature/bedlevel/abl/abl.cpp +++ b/Marlin/src/feature/bedlevel/abl/abl.cpp @@ -213,7 +213,7 @@ void print_bilinear_leveling_grid() { ) * 0.5f; } - static float bed_level_virt_2cmr(const uint8_t x, const uint8_t y, const float &tx, const float &ty) { + static float bed_level_virt_2cmr(const uint8_t x, const uint8_t y, const_float_t tx, const_float_t ty) { float row[4], column[4]; LOOP_L_N(i, 4) { LOOP_L_N(j, 4) { @@ -356,7 +356,7 @@ float bilinear_z_offset(const xy_pos_t &raw) { * Prepare a bilinear-leveled linear move on Cartesian, * splitting the move where it crosses grid borders. */ - void bilinear_line_to_destination(const feedRate_t &scaled_fr_mm_s, uint16_t x_splits, uint16_t y_splits) { + void bilinear_line_to_destination(const_feedRate_t scaled_fr_mm_s, uint16_t x_splits, uint16_t y_splits) { // Get current and destination cells for this line xy_int_t c1 { CELL_INDEX(x, current_position.x), CELL_INDEX(y, current_position.y) }, c2 { CELL_INDEX(x, destination.x), CELL_INDEX(y, destination.y) }; diff --git a/Marlin/src/feature/bedlevel/abl/abl.h b/Marlin/src/feature/bedlevel/abl/abl.h index bbe2411dc3..3d54c55695 100644 --- a/Marlin/src/feature/bedlevel/abl/abl.h +++ b/Marlin/src/feature/bedlevel/abl/abl.h @@ -37,7 +37,7 @@ void refresh_bed_level(); #endif #if IS_CARTESIAN && DISABLED(SEGMENT_LEVELED_MOVES) - void bilinear_line_to_destination(const feedRate_t &scaled_fr_mm_s, uint16_t x_splits=0xFFFF, uint16_t y_splits=0xFFFF); + void bilinear_line_to_destination(const_feedRate_t scaled_fr_mm_s, uint16_t x_splits=0xFFFF, uint16_t y_splits=0xFFFF); #endif #define _GET_MESH_X(I) float(bilinear_start.x + (I) * bilinear_grid_spacing.x) diff --git a/Marlin/src/feature/bedlevel/bedlevel.cpp b/Marlin/src/feature/bedlevel/bedlevel.cpp index 3680fbac05..30fafbf57b 100644 --- a/Marlin/src/feature/bedlevel/bedlevel.cpp +++ b/Marlin/src/feature/bedlevel/bedlevel.cpp @@ -98,7 +98,7 @@ TemporaryBedLevelingState::TemporaryBedLevelingState(const bool enable) : saved( #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) - void set_z_fade_height(const float &zfh, const bool do_report/*=true*/) { + void set_z_fade_height(const_float_t zfh, const bool do_report/*=true*/) { if (planner.z_fade_height == zfh) return; diff --git a/Marlin/src/feature/bedlevel/bedlevel.h b/Marlin/src/feature/bedlevel/bedlevel.h index 3e89a08802..9bab2fbd2f 100644 --- a/Marlin/src/feature/bedlevel/bedlevel.h +++ b/Marlin/src/feature/bedlevel/bedlevel.h @@ -38,7 +38,7 @@ void set_bed_leveling_enabled(const bool enable=true); void reset_bed_level(); #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) - void set_z_fade_height(const float &zfh, const bool do_report=true); + void set_z_fade_height(const_float_t zfh, const bool do_report=true); #endif #if EITHER(MESH_BED_LEVELING, PROBE_MANUALLY) diff --git a/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.cpp b/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.cpp index ec5b95c108..f51d83f996 100644 --- a/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.cpp +++ b/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.cpp @@ -61,7 +61,7 @@ * Prepare a mesh-leveled linear move in a Cartesian setup, * splitting the move where it crosses mesh borders. */ - void mesh_bed_leveling::line_to_destination(const feedRate_t &scaled_fr_mm_s, uint8_t x_splits, uint8_t y_splits) { + void mesh_bed_leveling::line_to_destination(const_feedRate_t scaled_fr_mm_s, uint8_t x_splits, uint8_t y_splits) { // Get current and destination cells for this line xy_int8_t scel = cell_indexes(current_position), ecel = cell_indexes(destination); NOMORE(scel.x, GRID_MAX_POINTS_X - 2); diff --git a/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.h b/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.h index ade7a93140..9932ce9e5c 100644 --- a/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.h +++ b/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.h @@ -56,7 +56,7 @@ public: return false; } - static void set_z(const int8_t px, const int8_t py, const float &z) { z_values[px][py] = z; } + static void set_z(const int8_t px, const int8_t py, const_float_t z) { z_values[px][py] = z; } static inline void zigzag(const int8_t index, int8_t &px, int8_t &py) { px = index % (GRID_MAX_POINTS_X); @@ -64,39 +64,39 @@ public: if (py & 1) px = (GRID_MAX_POINTS_X - 1) - px; // Zig zag } - static void set_zigzag_z(const int8_t index, const float &z) { + static void set_zigzag_z(const int8_t index, const_float_t z) { int8_t px, py; zigzag(index, px, py); set_z(px, py, z); } - static int8_t cell_index_x(const float &x) { + static int8_t cell_index_x(const_float_t x) { int8_t cx = (x - (MESH_MIN_X)) * RECIPROCAL(MESH_X_DIST); return constrain(cx, 0, (GRID_MAX_POINTS_X) - 2); } - static int8_t cell_index_y(const float &y) { + static int8_t cell_index_y(const_float_t y) { int8_t cy = (y - (MESH_MIN_Y)) * RECIPROCAL(MESH_Y_DIST); return constrain(cy, 0, (GRID_MAX_POINTS_Y) - 2); } - static inline xy_int8_t cell_indexes(const float &x, const float &y) { + static inline xy_int8_t cell_indexes(const_float_t x, const_float_t y) { return { cell_index_x(x), cell_index_y(y) }; } static inline xy_int8_t cell_indexes(const xy_pos_t &xy) { return cell_indexes(xy.x, xy.y); } - static int8_t probe_index_x(const float &x) { + static int8_t probe_index_x(const_float_t x) { int8_t px = (x - (MESH_MIN_X) + 0.5f * (MESH_X_DIST)) * RECIPROCAL(MESH_X_DIST); return WITHIN(px, 0, GRID_MAX_POINTS_X - 1) ? px : -1; } - static int8_t probe_index_y(const float &y) { + static int8_t probe_index_y(const_float_t y) { int8_t py = (y - (MESH_MIN_Y) + 0.5f * (MESH_Y_DIST)) * RECIPROCAL(MESH_Y_DIST); return WITHIN(py, 0, GRID_MAX_POINTS_Y - 1) ? py : -1; } - static inline xy_int8_t probe_indexes(const float &x, const float &y) { + static inline xy_int8_t probe_indexes(const_float_t x, const_float_t y) { return { probe_index_x(x), probe_index_y(y) }; } static inline xy_int8_t probe_indexes(const xy_pos_t &xy) { return probe_indexes(xy.x, xy.y); } - static float calc_z0(const float &a0, const float &a1, const float &z1, const float &a2, const float &z2) { + static float calc_z0(const_float_t a0, const_float_t a1, const_float_t z1, const_float_t a2, const_float_t z2) { const float delta_z = (z2 - z1) / (a2 - a1), delta_a = a0 - a1; return z1 + delta_a * delta_z; @@ -104,7 +104,7 @@ public: static float get_z(const xy_pos_t &pos #if ENABLED(ENABLE_LEVELING_FADE_HEIGHT) - , const float &factor=1.0f + , const_float_t factor=1.0f #endif ) { #if DISABLED(ENABLE_LEVELING_FADE_HEIGHT) @@ -120,7 +120,7 @@ public: } #if IS_CARTESIAN && DISABLED(SEGMENT_LEVELED_MOVES) - static void line_to_destination(const feedRate_t &scaled_fr_mm_s, uint8_t x_splits=0xFF, uint8_t y_splits=0xFF); + static void line_to_destination(const_feedRate_t scaled_fr_mm_s, uint8_t x_splits=0xFF, uint8_t y_splits=0xFF); #endif }; diff --git a/Marlin/src/feature/bedlevel/ubl/ubl.cpp b/Marlin/src/feature/bedlevel/ubl/ubl.cpp index 05b96daefa..14491bdd81 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl.cpp @@ -102,7 +102,7 @@ void unified_bed_leveling::invalidate() { set_all_mesh_points_to_value(NAN); } -void unified_bed_leveling::set_all_mesh_points_to_value(const float value) { +void unified_bed_leveling::set_all_mesh_points_to_value(const_float_t value) { GRID_LOOP(x, y) { z_values[x][y] = value; TERN_(EXTENSIBLE_UI, ExtUI::onMeshUpdate(x, y, value)); @@ -115,7 +115,7 @@ void unified_bed_leveling::set_all_mesh_points_to_value(const float value) { constexpr int16_t Z_STEPS_NAN = INT16_MAX; void unified_bed_leveling::set_store_from_mesh(const bed_mesh_t &in_values, mesh_store_t &stored_values) { - auto z_to_store = [](const float &z) { + auto z_to_store = [](const_float_t z) { if (isnan(z)) return Z_STEPS_NAN; const int32_t z_scaled = TRUNC(z * mesh_store_scaling); if (z_scaled == Z_STEPS_NAN || !WITHIN(z_scaled, INT16_MIN, INT16_MAX)) diff --git a/Marlin/src/feature/bedlevel/ubl/ubl.h b/Marlin/src/feature/bedlevel/ubl/ubl.h index acc191908c..222e7b0f20 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl.h +++ b/Marlin/src/feature/bedlevel/ubl/ubl.h @@ -67,17 +67,17 @@ private: static G29_parameters_t param; #if IS_NEWPANEL - static void move_z_with_encoder(const float &multiplier); + static void move_z_with_encoder(const_float_t multiplier); static float measure_point_with_encoder(); static float measure_business_card_thickness(); - static void manually_probe_remaining_mesh(const xy_pos_t&, const float&, const float&, const bool) _O0; + static void manually_probe_remaining_mesh(const xy_pos_t&, const_float_t , const_float_t , const bool) _O0; static void fine_tune_mesh(const xy_pos_t &pos, const bool do_ubl_mesh_map) _O0; #endif static bool G29_parse_parameters() _O0; static void shift_mesh_height(); static void probe_entire_mesh(const xy_pos_t &near, const bool do_ubl_mesh_map, const bool stow_probe, const bool do_furthest) _O0; - static void tilt_mesh_based_on_3pts(const float &z1, const float &z2, const float &z3); + static void tilt_mesh_based_on_3pts(const_float_t z1, const_float_t z2, const_float_t z3); static void tilt_mesh_based_on_probed_grid(const bool do_ubl_mesh_map); static bool smart_fill_one(const uint8_t x, const uint8_t y, const int8_t xdir, const int8_t ydir); static inline bool smart_fill_one(const xy_uint8_t &pos, const xy_uint8_t &dir) { @@ -103,12 +103,12 @@ public: static mesh_index_pair find_furthest_invalid_mesh_point() _O0; static void reset(); static void invalidate(); - static void set_all_mesh_points_to_value(const float value); - static void adjust_mesh_to_mean(const bool cflag, const float value); + static void set_all_mesh_points_to_value(const_float_t value); + static void adjust_mesh_to_mean(const bool cflag, const_float_t value); static bool sanity_check(); static void G29() _O0; // O0 for no optimization - static void smart_fill_wlsf(const float &) _O2; // O2 gives smaller code than Os on A2560 + static void smart_fill_wlsf(const_float_t ) _O2; // O2 gives smaller code than Os on A2560 static int8_t storage_slot; @@ -131,42 +131,42 @@ public: unified_bed_leveling(); - FORCE_INLINE static void set_z(const int8_t px, const int8_t py, const float &z) { z_values[px][py] = z; } + FORCE_INLINE static void set_z(const int8_t px, const int8_t py, const_float_t z) { z_values[px][py] = z; } - static int8_t cell_index_x_raw(const float &x) { + static int8_t cell_index_x_raw(const_float_t x) { return FLOOR((x - (MESH_MIN_X)) * RECIPROCAL(MESH_X_DIST)); } - static int8_t cell_index_y_raw(const float &y) { + static int8_t cell_index_y_raw(const_float_t y) { return FLOOR((y - (MESH_MIN_Y)) * RECIPROCAL(MESH_Y_DIST)); } - static int8_t cell_index_x_valid(const float &x) { + static int8_t cell_index_x_valid(const_float_t x) { return WITHIN(cell_index_x_raw(x), 0, (GRID_MAX_POINTS_X - 2)); } - static int8_t cell_index_y_valid(const float &y) { + static int8_t cell_index_y_valid(const_float_t y) { return WITHIN(cell_index_y_raw(y), 0, (GRID_MAX_POINTS_Y - 2)); } - static int8_t cell_index_x(const float &x) { + static int8_t cell_index_x(const_float_t x) { return constrain(cell_index_x_raw(x), 0, (GRID_MAX_POINTS_X) - 2); } - static int8_t cell_index_y(const float &y) { + static int8_t cell_index_y(const_float_t y) { return constrain(cell_index_y_raw(y), 0, (GRID_MAX_POINTS_Y) - 2); } - static inline xy_int8_t cell_indexes(const float &x, const float &y) { + static inline xy_int8_t cell_indexes(const_float_t x, const_float_t y) { return { cell_index_x(x), cell_index_y(y) }; } static inline xy_int8_t cell_indexes(const xy_pos_t &xy) { return cell_indexes(xy.x, xy.y); } - static int8_t closest_x_index(const float &x) { + static int8_t closest_x_index(const_float_t x) { const int8_t px = (x - (MESH_MIN_X) + (MESH_X_DIST) * 0.5) * RECIPROCAL(MESH_X_DIST); return WITHIN(px, 0, GRID_MAX_POINTS_X - 1) ? px : -1; } - static int8_t closest_y_index(const float &y) { + static int8_t closest_y_index(const_float_t y) { const int8_t py = (y - (MESH_MIN_Y) + (MESH_Y_DIST) * 0.5) * RECIPROCAL(MESH_Y_DIST); return WITHIN(py, 0, GRID_MAX_POINTS_Y - 1) ? py : -1; } @@ -189,7 +189,7 @@ public: * It is fairly expensive with its 4 floating point additions and 2 floating point * multiplications. */ - FORCE_INLINE static float calc_z0(const float &a0, const float &a1, const float &z1, const float &a2, const float &z2) { + FORCE_INLINE static float calc_z0(const_float_t a0, const_float_t a1, const_float_t z1, const_float_t a2, const_float_t z2) { return z1 + (z2 - z1) * (a0 - a1) / (a2 - a1); } @@ -203,7 +203,7 @@ public: * z_correction_for_x_on_horizontal_mesh_line is an optimization for * the case where the printer is making a vertical line that only crosses horizontal mesh lines. */ - static inline float z_correction_for_x_on_horizontal_mesh_line(const float &rx0, const int x1_i, const int yi) { + static inline float z_correction_for_x_on_horizontal_mesh_line(const_float_t rx0, const int x1_i, const int yi) { if (!WITHIN(x1_i, 0, GRID_MAX_POINTS_X - 1) || !WITHIN(yi, 0, GRID_MAX_POINTS_Y - 1)) { if (DEBUGGING(LEVELING)) { @@ -226,7 +226,7 @@ public: // // See comments above for z_correction_for_x_on_horizontal_mesh_line // - static inline float z_correction_for_y_on_vertical_mesh_line(const float &ry0, const int xi, const int y1_i) { + static inline float z_correction_for_y_on_vertical_mesh_line(const_float_t ry0, const int xi, const int y1_i) { if (!WITHIN(xi, 0, GRID_MAX_POINTS_X - 1) || !WITHIN(y1_i, 0, GRID_MAX_POINTS_Y - 1)) { if (DEBUGGING(LEVELING)) { @@ -252,7 +252,7 @@ public: * Z-Height at both ends. Then it does a linear interpolation of these heights based * on the Y position within the cell. */ - static float get_z_correction(const float &rx0, const float &ry0) { + static float get_z_correction(const_float_t rx0, const_float_t ry0) { const int8_t cx = cell_index_x(rx0), cy = cell_index_y(ry0); // return values are clamped /** @@ -309,9 +309,9 @@ public: } #if UBL_SEGMENTED - static bool line_to_destination_segmented(const feedRate_t &scaled_fr_mm_s); + static bool line_to_destination_segmented(const_feedRate_t scaled_fr_mm_s); #else - static void line_to_destination_cartesian(const feedRate_t &scaled_fr_mm_s, const uint8_t e); + static void line_to_destination_cartesian(const_feedRate_t scaled_fr_mm_s, const uint8_t e); #endif static inline bool mesh_is_valid() { diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp index 3282ebe620..545d95676e 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp @@ -672,7 +672,7 @@ void unified_bed_leveling::G29() { * G29 P5 C : Adjust Mesh To Mean (and subtract the given offset). * Find the mean average and shift the mesh to center on that value. */ -void unified_bed_leveling::adjust_mesh_to_mean(const bool cflag, const float offset) { +void unified_bed_leveling::adjust_mesh_to_mean(const bool cflag, const_float_t offset) { float sum = 0; int n = 0; GRID_LOOP(x, y) @@ -821,7 +821,7 @@ void set_message_with_feedback(PGM_P const msg_P) { return false; } - void unified_bed_leveling::move_z_with_encoder(const float &multiplier) { + void unified_bed_leveling::move_z_with_encoder(const_float_t multiplier) { ui.wait_for_release(); while (!ui.button_pressed()) { idle(); @@ -883,7 +883,7 @@ void set_message_with_feedback(PGM_P const msg_P) { * Move to INVALID points and * NOTE: Blocks the G-code queue and captures Marlin UI during use. */ - void unified_bed_leveling::manually_probe_remaining_mesh(const xy_pos_t &pos, const float &z_clearance, const float &thick, const bool do_ubl_mesh_map) { + void unified_bed_leveling::manually_probe_remaining_mesh(const xy_pos_t &pos, const_float_t z_clearance, const_float_t thick, const bool do_ubl_mesh_map) { ui.capture(); save_ubl_active_state_and_disable(); // No bed level correction so only raw data is obtained @@ -1633,10 +1633,10 @@ void unified_bed_leveling::smart_fill_mesh() { */ #ifdef VALIDATE_MESH_TILT auto d_from = []{ DEBUG_ECHOPGM("D from "); }; - auto normed = [&](const xy_pos_t &pos, const float &zadd) { + auto normed = [&](const xy_pos_t &pos, const_float_t zadd) { return normal.x * pos.x + normal.y * pos.y + zadd; }; - auto debug_pt = [](PGM_P const pre, const xy_pos_t &pos, const float &zadd) { + auto debug_pt = [](PGM_P const pre, const xy_pos_t &pos, const_float_t zadd) { d_from(); SERIAL_ECHOPGM_P(pre); DEBUG_ECHO_F(normed(pos, zadd), 6); DEBUG_ECHOLNPAIR_F(" Z error = ", zadd - get_z_correction(pos), 6); @@ -1658,7 +1658,7 @@ void unified_bed_leveling::smart_fill_mesh() { #endif // HAS_BED_PROBE #if ENABLED(UBL_G29_P31) - void unified_bed_leveling::smart_fill_wlsf(const float &weight_factor) { + void unified_bed_leveling::smart_fill_wlsf(const_float_t weight_factor) { // For each undefined mesh point, compute a distance-weighted least squares fit // from all the originally populated mesh points, weighted toward the point diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp index 33b4f03ac2..4e522210d0 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp @@ -37,7 +37,7 @@ #if !UBL_SEGMENTED - void unified_bed_leveling::line_to_destination_cartesian(const feedRate_t &scaled_fr_mm_s, const uint8_t extruder) { + void unified_bed_leveling::line_to_destination_cartesian(const_feedRate_t scaled_fr_mm_s, const uint8_t extruder) { /** * Much of the nozzle movement will be within the same cell. So we will do as little computation * as possible to determine if this is the case. If this move is within the same cell, we will @@ -323,7 +323,7 @@ * Returns true if did NOT move, false if moved (requires current_position update). */ - bool _O2 unified_bed_leveling::line_to_destination_segmented(const feedRate_t &scaled_fr_mm_s) { + bool _O2 unified_bed_leveling::line_to_destination_segmented(const_feedRate_t scaled_fr_mm_s) { if (!position_is_reachable(destination)) // fail if moving outside reachable boundary return true; // did not move, so current_position still accurate diff --git a/Marlin/src/feature/encoder_i2c.h b/Marlin/src/feature/encoder_i2c.h index e771130391..20871af98c 100644 --- a/Marlin/src/feature/encoder_i2c.h +++ b/Marlin/src/feature/encoder_i2c.h @@ -188,7 +188,7 @@ class I2CPositionEncoder { FORCE_INLINE void set_ec_method(const byte method) { ecMethod = method; } FORCE_INLINE float get_ec_threshold() { return ecThreshold; } - FORCE_INLINE void set_ec_threshold(const float newThreshold) { ecThreshold = newThreshold; } + FORCE_INLINE void set_ec_threshold(const_float_t newThreshold) { ecThreshold = newThreshold; } FORCE_INLINE int get_encoder_ticks_mm() { switch (type) { diff --git a/Marlin/src/feature/filwidth.h b/Marlin/src/feature/filwidth.h index ef3859df71..e63d3d719f 100644 --- a/Marlin/src/feature/filwidth.h +++ b/Marlin/src/feature/filwidth.h @@ -78,7 +78,7 @@ public: static inline void update_measured_mm() { measured_mm = raw_to_mm(); } // Update ring buffer used to delay filament measurements - static inline void advance_e(const float &e_move) { + static inline void advance_e(const_float_t e_move) { // Increment counters with the E distance e_count += e_move; diff --git a/Marlin/src/feature/leds/printer_event_leds.cpp b/Marlin/src/feature/leds/printer_event_leds.cpp index 32c6862704..fe7db9a8e4 100644 --- a/Marlin/src/feature/leds/printer_event_leds.cpp +++ b/Marlin/src/feature/leds/printer_event_leds.cpp @@ -40,7 +40,7 @@ PrinterEventLEDs printerEventLEDs; uint8_t PrinterEventLEDs::old_intensity = 0; - inline uint8_t pel_intensity(const float &start, const float ¤t, const float &target) { + inline uint8_t pel_intensity(const_float_t start, const_float_t current, const_float_t target) { if (uint16_t(start) == uint16_t(target)) return 255; return (uint8_t)map(constrain(current, start, target), start, target, 0.f, 255.f); } @@ -58,7 +58,7 @@ PrinterEventLEDs printerEventLEDs; #if HAS_TEMP_HOTEND - void PrinterEventLEDs::onHotendHeating(const float &start, const float ¤t, const float &target) { + void PrinterEventLEDs::onHotendHeating(const_float_t start, const_float_t current, const_float_t target) { const uint8_t blue = pel_intensity(start, current, target); if (blue != old_intensity) { old_intensity = blue; @@ -70,7 +70,7 @@ PrinterEventLEDs printerEventLEDs; #if HAS_HEATED_BED - void PrinterEventLEDs::onBedHeating(const float &start, const float ¤t, const float &target) { + void PrinterEventLEDs::onBedHeating(const_float_t start, const_float_t current, const_float_t target) { const uint8_t red = pel_intensity(start, current, target); if (red != old_intensity) { old_intensity = red; @@ -82,7 +82,7 @@ PrinterEventLEDs printerEventLEDs; #if HAS_HEATED_CHAMBER - void PrinterEventLEDs::onChamberHeating(const float &start, const float ¤t, const float &target) { + void PrinterEventLEDs::onChamberHeating(const_float_t start, const_float_t current, const_float_t target) { const uint8_t green = pel_intensity(start, current, target); if (green != old_intensity) { old_intensity = green; diff --git a/Marlin/src/feature/leds/printer_event_leds.h b/Marlin/src/feature/leds/printer_event_leds.h index 668c9c969b..a262ddf85e 100644 --- a/Marlin/src/feature/leds/printer_event_leds.h +++ b/Marlin/src/feature/leds/printer_event_leds.h @@ -47,17 +47,17 @@ private: public: #if HAS_TEMP_HOTEND static inline LEDColor onHotendHeatingStart() { old_intensity = 0; return leds.get_color(); } - static void onHotendHeating(const float &start, const float ¤t, const float &target); + static void onHotendHeating(const_float_t start, const_float_t current, const_float_t target); #endif #if HAS_HEATED_BED static inline LEDColor onBedHeatingStart() { old_intensity = 127; return leds.get_color(); } - static void onBedHeating(const float &start, const float ¤t, const float &target); + static void onBedHeating(const_float_t start, const_float_t current, const_float_t target); #endif #if HAS_HEATED_CHAMBER static inline LEDColor onChamberHeatingStart() { old_intensity = 127; return leds.get_color(); } - static void onChamberHeating(const float &start, const float ¤t, const float &target); + static void onChamberHeating(const_float_t start, const_float_t current, const_float_t target); #endif #if HAS_TEMP_HOTEND || HAS_HEATED_BED || HAS_HEATED_CHAMBER diff --git a/Marlin/src/feature/max7219.cpp b/Marlin/src/feature/max7219.cpp index d7433cb7d9..200e6b580d 100644 --- a/Marlin/src/feature/max7219.cpp +++ b/Marlin/src/feature/max7219.cpp @@ -256,7 +256,7 @@ void Max7219::set(const uint8_t line, const uint8_t bits) { } // Draw a float with a decimal point and optional digits - void Max7219::print(const uint8_t start, const float value, const uint8_t pre_size, const uint8_t post_size, const bool leadzero=false) { + void Max7219::print(const uint8_t start, const_float_t value, const uint8_t pre_size, const uint8_t post_size, const bool leadzero=false) { if (pre_size) print(start, value, pre_size, leadzero, !!post_size); if (post_size) { const int16_t after = ABS(value) * (10 ^ post_size); diff --git a/Marlin/src/feature/max7219.h b/Marlin/src/feature/max7219.h index 8e98c9456c..3e5b62db2f 100644 --- a/Marlin/src/feature/max7219.h +++ b/Marlin/src/feature/max7219.h @@ -100,6 +100,13 @@ public: // Update a single native line on just one unit static void refresh_unit_line(const uint8_t line); + #if ENABLED(MAX7219_NUMERIC) + // Draw an integer with optional leading zeros and optional decimal point + void print(const uint8_t start, int16_t value, uint8_t size, const bool leadzero=false, bool dec=false); + // Draw a float with a decimal point and optional digits + void print(const uint8_t start, const_float_t value, const uint8_t pre_size, const uint8_t post_size, const bool leadzero=false); + #endif + // Set a single LED by XY coordinate static void led_set(const uint8_t x, const uint8_t y, const bool on); static void led_on(const uint8_t x, const uint8_t y); diff --git a/Marlin/src/feature/mixing.cpp b/Marlin/src/feature/mixing.cpp index 722020ba8a..4823ac2c60 100644 --- a/Marlin/src/feature/mixing.cpp +++ b/Marlin/src/feature/mixing.cpp @@ -162,7 +162,7 @@ void Mixer::refresh_collector(const float proportion/*=1.0*/, const uint8_t t/*= float Mixer::prev_z; // = 0 - void Mixer::update_gradient_for_z(const float z) { + void Mixer::update_gradient_for_z(const_float_t z) { if (z == prev_z) return; prev_z = z; diff --git a/Marlin/src/feature/mixing.h b/Marlin/src/feature/mixing.h index 5de039985d..573b61cb68 100644 --- a/Marlin/src/feature/mixing.h +++ b/Marlin/src/feature/mixing.h @@ -180,9 +180,9 @@ class Mixer { static float prev_z; // Update the current mix from the gradient for a given Z - static void update_gradient_for_z(const float z); + static void update_gradient_for_z(const_float_t z); static void update_gradient_for_planner_z(); - static inline void gradient_control(const float z) { + static inline void gradient_control(const_float_t z) { if (gradient.enabled) { if (z >= gradient.end_z) T(gradient.end_vtool); diff --git a/Marlin/src/feature/pause.cpp b/Marlin/src/feature/pause.cpp index a934b0ead0..5990c09a90 100644 --- a/Marlin/src/feature/pause.cpp +++ b/Marlin/src/feature/pause.cpp @@ -170,7 +170,7 @@ static bool ensure_safe_temperature(const bool wait=true, const PauseMode mode=P * * Returns 'true' if load was completed, 'false' for abort */ -bool load_filament(const float &slow_load_length/*=0*/, const float &fast_load_length/*=0*/, const float &purge_length/*=0*/, const int8_t max_beep_count/*=0*/, +bool load_filament(const_float_t slow_load_length/*=0*/, const_float_t fast_load_length/*=0*/, const_float_t purge_length/*=0*/, const int8_t max_beep_count/*=0*/, const bool show_lcd/*=false*/, const bool pause_for_user/*=false*/, const PauseMode mode/*=PAUSE_MODE_PAUSE_PRINT*/ DXC_ARGS @@ -298,10 +298,10 @@ inline void disable_active_extruder() { * * Returns 'true' if unload was completed, 'false' for abort */ -bool unload_filament(const float &unload_length, const bool show_lcd/*=false*/, +bool unload_filament(const_float_t unload_length, const bool show_lcd/*=false*/, const PauseMode mode/*=PAUSE_MODE_PAUSE_PRINT*/ #if BOTH(FILAMENT_UNLOAD_ALL_EXTRUDERS, MIXING_EXTRUDER) - , const float &mix_multiplier/*=1.0*/ + , const_float_t mix_multiplier/*=1.0*/ #endif ) { DEBUG_SECTION(uf, "unload_filament", true); @@ -367,7 +367,7 @@ bool unload_filament(const float &unload_length, const bool show_lcd/*=false*/, */ uint8_t did_pause_print = 0; -bool pause_print(const float &retract, const xyz_pos_t &park_point, const float &unload_length/*=0*/, const bool show_lcd/*=false*/ DXC_ARGS) { +bool pause_print(const_float_t retract, const xyz_pos_t &park_point, const_float_t unload_length/*=0*/, const bool show_lcd/*=false*/ DXC_ARGS) { DEBUG_SECTION(pp, "pause_print", true); DEBUG_ECHOLNPAIR("... park.x:", park_point.x, " y:", park_point.y, " z:", park_point.z, " unloadlen:", unload_length, " showlcd:", show_lcd DXC_SAY); @@ -555,7 +555,7 @@ void wait_for_confirmation(const bool is_reload/*=false*/, const int8_t max_beep * - Send host action for resume, if configured * - Resume the current SD print job, if any */ -void resume_print(const float &slow_load_length/*=0*/, const float &fast_load_length/*=0*/, const float &purge_length/*=ADVANCED_PAUSE_PURGE_LENGTH*/, const int8_t max_beep_count/*=0*/, const celsius_t targetTemp/*=0*/ DXC_ARGS) { +void resume_print(const_float_t slow_load_length/*=0*/, const_float_t fast_load_length/*=0*/, const_float_t purge_length/*=ADVANCED_PAUSE_PURGE_LENGTH*/, const int8_t max_beep_count/*=0*/, const celsius_t targetTemp/*=0*/ DXC_ARGS) { DEBUG_SECTION(rp, "resume_print", true); DEBUG_ECHOLNPAIR("... slowlen:", slow_load_length, " fastlen:", fast_load_length, " purgelen:", purge_length, " maxbeep:", max_beep_count, " targetTemp:", targetTemp DXC_SAY); diff --git a/Marlin/src/feature/pause.h b/Marlin/src/feature/pause.h index 4ab33ac519..2a7ea40b83 100644 --- a/Marlin/src/feature/pause.h +++ b/Marlin/src/feature/pause.h @@ -85,19 +85,19 @@ extern uint8_t did_pause_print; #define DXC_SAY #endif -bool pause_print(const float &retract, const xyz_pos_t &park_point, const float &unload_length=0, const bool show_lcd=false DXC_PARAMS); +bool pause_print(const_float_t retract, const xyz_pos_t &park_point, const_float_t unload_length=0, const bool show_lcd=false DXC_PARAMS); void wait_for_confirmation(const bool is_reload=false, const int8_t max_beep_count=0 DXC_PARAMS); -void resume_print(const float &slow_load_length=0, const float &fast_load_length=0, const float &extrude_length=ADVANCED_PAUSE_PURGE_LENGTH, +void resume_print(const_float_t slow_load_length=0, const_float_t fast_load_length=0, const_float_t extrude_length=ADVANCED_PAUSE_PURGE_LENGTH, const int8_t max_beep_count=0, const celsius_t targetTemp=0 DXC_PARAMS); -bool load_filament(const float &slow_load_length=0, const float &fast_load_length=0, const float &extrude_length=0, const int8_t max_beep_count=0, +bool load_filament(const_float_t slow_load_length=0, const_float_t fast_load_length=0, const_float_t extrude_length=0, const int8_t max_beep_count=0, const bool show_lcd=false, const bool pause_for_user=false, const PauseMode mode=PAUSE_MODE_PAUSE_PRINT DXC_PARAMS); -bool unload_filament(const float &unload_length, const bool show_lcd=false, const PauseMode mode=PAUSE_MODE_PAUSE_PRINT +bool unload_filament(const_float_t unload_length, const bool show_lcd=false, const PauseMode mode=PAUSE_MODE_PAUSE_PRINT #if BOTH(FILAMENT_UNLOAD_ALL_EXTRUDERS, MIXING_EXTRUDER) - , const float &mix_multiplier=1.0 + , const_float_t mix_multiplier=1.0 #endif ); diff --git a/Marlin/src/feature/powerloss.cpp b/Marlin/src/feature/powerloss.cpp index cc45d6ecf0..e45864b484 100644 --- a/Marlin/src/feature/powerloss.cpp +++ b/Marlin/src/feature/powerloss.cpp @@ -240,7 +240,7 @@ void PrintJobRecovery::save(const bool force/*=false*/, const float zraise/*=0*/ #if ENABLED(BACKUP_POWER_SUPPLY) - void PrintJobRecovery::retract_and_lift(const float &zraise) { + void PrintJobRecovery::retract_and_lift(const_float_t zraise) { #if POWER_LOSS_RETRACT_LEN || POWER_LOSS_ZRAISE gcode.set_relative_mode(true); // Use relative coordinates diff --git a/Marlin/src/feature/powerloss.h b/Marlin/src/feature/powerloss.h index 7c09c0f3cf..ad34de6e53 100644 --- a/Marlin/src/feature/powerloss.h +++ b/Marlin/src/feature/powerloss.h @@ -199,7 +199,7 @@ class PrintJobRecovery { static void write(); #if ENABLED(BACKUP_POWER_SUPPLY) - static void retract_and_lift(const float &zraise); + static void retract_and_lift(const_float_t zraise); #endif #if PIN_EXISTS(POWER_LOSS) diff --git a/Marlin/src/feature/probe_temp_comp.cpp b/Marlin/src/feature/probe_temp_comp.cpp index 8fdf160d0f..b0867817b6 100644 --- a/Marlin/src/feature/probe_temp_comp.cpp +++ b/Marlin/src/feature/probe_temp_comp.cpp @@ -88,12 +88,12 @@ void ProbeTempComp::print_offsets() { } } -void ProbeTempComp::prepare_new_calibration(const float &init_meas_z) { +void ProbeTempComp::prepare_new_calibration(const_float_t init_meas_z) { calib_idx = 0; init_measurement = init_meas_z; } -void ProbeTempComp::push_back_new_measurement(const TempSensorID tsi, const float &meas_z) { +void ProbeTempComp::push_back_new_measurement(const TempSensorID tsi, const_float_t meas_z) { switch (tsi) { case TSI_PROBE: case TSI_BED: @@ -159,12 +159,12 @@ bool ProbeTempComp::finish_calibration(const TempSensorID tsi) { return true; } -void ProbeTempComp::compensate_measurement(const TempSensorID tsi, const float &temp, float &meas_z) { +void ProbeTempComp::compensate_measurement(const TempSensorID tsi, const_float_t temp, float &meas_z) { if (WITHIN(temp, cali_info[tsi].start_temp, cali_info[tsi].end_temp)) meas_z -= get_offset_for_temperature(tsi, temp); } -float ProbeTempComp::get_offset_for_temperature(const TempSensorID tsi, const float &temp) { +float ProbeTempComp::get_offset_for_temperature(const TempSensorID tsi, const_float_t temp) { const uint8_t measurements = cali_info[tsi].measurements; const float start_temp = cali_info[tsi].start_temp, res_temp = cali_info[tsi].temp_res; diff --git a/Marlin/src/feature/probe_temp_comp.h b/Marlin/src/feature/probe_temp_comp.h index 626dd87f94..e29da7ece1 100644 --- a/Marlin/src/feature/probe_temp_comp.h +++ b/Marlin/src/feature/probe_temp_comp.h @@ -121,10 +121,10 @@ class ProbeTempComp { } static bool set_offset(const TempSensorID tsi, const uint8_t idx, const int16_t offset); static void print_offsets(); - static void prepare_new_calibration(const float &init_meas_z); - static void push_back_new_measurement(const TempSensorID tsi, const float &meas_z); + static void prepare_new_calibration(const_float_t init_meas_z); + static void push_back_new_measurement(const TempSensorID tsi, const_float_t meas_z); static bool finish_calibration(const TempSensorID tsi); - static void compensate_measurement(const TempSensorID tsi, const float &temp, float &meas_z); + static void compensate_measurement(const TempSensorID tsi, const_float_t temp, float &meas_z); private: static uint8_t calib_idx; @@ -135,7 +135,7 @@ class ProbeTempComp { */ static float init_measurement; - static float get_offset_for_temperature(const TempSensorID tsi, const float &temp); + static float get_offset_for_temperature(const TempSensorID tsi, const_float_t temp); /** * Fit a linear function in measured temperature offsets diff --git a/Marlin/src/feature/runout.h b/Marlin/src/feature/runout.h index 0c35ef6659..15bf607550 100644 --- a/Marlin/src/feature/runout.h +++ b/Marlin/src/feature/runout.h @@ -101,7 +101,7 @@ class TFilamentMonitor : public FilamentMonitorBase { #if HAS_FILAMENT_RUNOUT_DISTANCE static inline float& runout_distance() { return response.runout_distance_mm; } - static inline void set_runout_distance(const float &mm) { response.runout_distance_mm = mm; } + static inline void set_runout_distance(const_float_t mm) { response.runout_distance_mm = mm; } #endif // Handle a block completion. RunoutResponseDelayed uses this to diff --git a/Marlin/src/feature/spindle_laser.h b/Marlin/src/feature/spindle_laser.h index b3d008851c..bf7106fab7 100644 --- a/Marlin/src/feature/spindle_laser.h +++ b/Marlin/src/feature/spindle_laser.h @@ -53,7 +53,7 @@ public: min_pct = TERN(CUTTER_POWER_RELATIVE, 0, TERN(SPINDLE_FEATURE, round(100.0f * (SPEED_POWER_MIN) / (SPEED_POWER_MAX)), SPEED_POWER_MIN)), max_pct = TERN(SPINDLE_FEATURE, 100, SPEED_POWER_MAX); - static const inline uint8_t pct_to_ocr(const float pct) { return uint8_t(PCT_TO_PWM(pct)); } + static const inline uint8_t pct_to_ocr(const_float_t pct) { return uint8_t(PCT_TO_PWM(pct)); } // cpower = configured values (e.g., SPEED_POWER_MAX) diff --git a/Marlin/src/gcode/bedlevel/G26.cpp b/Marlin/src/gcode/bedlevel/G26.cpp index 0468b79363..e05336d6c5 100644 --- a/Marlin/src/gcode/bedlevel/G26.cpp +++ b/Marlin/src/gcode/bedlevel/G26.cpp @@ -212,7 +212,7 @@ mesh_index_pair find_closest_circle_to_print(const xy_pos_t &pos) { return out_point; } -void move_to(const float &rx, const float &ry, const float &z, const float &e_delta) { +void move_to(const_float_t rx, const_float_t ry, const_float_t z, const_float_t e_delta) { static float last_z = -999.99; const xy_pos_t dest = { rx, ry }; @@ -239,7 +239,7 @@ void move_to(const float &rx, const float &ry, const float &z, const float &e_de prepare_internal_move_to_destination(fr_mm_s); } -FORCE_INLINE void move_to(const xyz_pos_t &where, const float &de) { move_to(where.x, where.y, where.z, de); } +FORCE_INLINE void move_to(const xyz_pos_t &where, const_float_t de) { move_to(where.x, where.y, where.z, de); } void retract_filament(const xyz_pos_t &where) { if (!g26_retracted) { // Only retract if we are not already retracted! diff --git a/Marlin/src/gcode/calibrate/G33.cpp b/Marlin/src/gcode/calibrate/G33.cpp index 902711397d..1b8eb889c6 100644 --- a/Marlin/src/gcode/calibrate/G33.cpp +++ b/Marlin/src/gcode/calibrate/G33.cpp @@ -93,7 +93,7 @@ void ac_cleanup(TERN_(HAS_MULTI_HOTEND, const uint8_t old_tool_index)) { TERN_(HAS_MULTI_HOTEND, tool_change(old_tool_index, true)); } -void print_signed_float(PGM_P const prefix, const float &f) { +void print_signed_float(PGM_P const prefix, const_float_t f) { SERIAL_ECHOPGM(" "); SERIAL_ECHOPGM_P(prefix); SERIAL_CHAR(':'); diff --git a/Marlin/src/gcode/calibrate/G34_M422.cpp b/Marlin/src/gcode/calibrate/G34_M422.cpp index a97283b3e7..1614dd6fbd 100644 --- a/Marlin/src/gcode/calibrate/G34_M422.cpp +++ b/Marlin/src/gcode/calibrate/G34_M422.cpp @@ -312,7 +312,7 @@ void GcodeSuite::G34() { ui.set_status(msg); #endif - auto decreasing_accuracy = [](const float &v1, const float &v2){ + auto decreasing_accuracy = [](const_float_t v1, const_float_t v2){ if (v1 < v2 * 0.7f) { SERIAL_ECHOLNPGM("Decreasing Accuracy Detected."); LCD_MESSAGEPGM(MSG_DECREASING_ACCURACY); diff --git a/Marlin/src/gcode/calibrate/M48.cpp b/Marlin/src/gcode/calibrate/M48.cpp index 0c3da13bf9..19b11f602a 100644 --- a/Marlin/src/gcode/calibrate/M48.cpp +++ b/Marlin/src/gcode/calibrate/M48.cpp @@ -117,7 +117,7 @@ void GcodeSuite::M48() { max = -99999.9, // Largest value sampled so far sample_set[n_samples]; // Storage for sampled values - auto dev_report = [](const bool verbose, const float &mean, const float &sigma, const float &min, const float &max, const bool final=false) { + auto dev_report = [](const bool verbose, const_float_t mean, const_float_t sigma, const_float_t min, const_float_t max, const bool final=false) { if (verbose) { SERIAL_ECHOPAIR_F("Mean: ", mean, 6); if (!final) SERIAL_ECHOPAIR_F(" Sigma: ", sigma, 6); diff --git a/Marlin/src/gcode/feature/camera/M240.cpp b/Marlin/src/gcode/feature/camera/M240.cpp index fc350d8a55..f5c910a9e9 100644 --- a/Marlin/src/gcode/feature/camera/M240.cpp +++ b/Marlin/src/gcode/feature/camera/M240.cpp @@ -47,7 +47,7 @@ #endif #ifdef PHOTO_RETRACT_MM - inline void e_move_m240(const float length, const feedRate_t &fr_mm_s) { + inline void e_move_m240(const float length, const_feedRate_t fr_mm_s) { if (length && thermalManager.hotEnoughToExtrude(active_extruder)) unscaled_e_move(length, fr_mm_s); } diff --git a/Marlin/src/gcode/feature/mixing/M166.cpp b/Marlin/src/gcode/feature/mixing/M166.cpp index 3f2b8b79e8..5f788344eb 100644 --- a/Marlin/src/gcode/feature/mixing/M166.cpp +++ b/Marlin/src/gcode/feature/mixing/M166.cpp @@ -33,7 +33,7 @@ inline void echo_mix() { SERIAL_ECHOPAIR(" (", mixer.mix[0], "%|", mixer.mix[1], "%)"); } -inline void echo_zt(const int t, const float &z) { +inline void echo_zt(const int t, const_float_t z) { mixer.update_mix_from_vtool(t); SERIAL_ECHOPAIR_P(SP_Z_STR, z, SP_T_STR, t); echo_mix(); diff --git a/Marlin/src/gcode/motion/M290.cpp b/Marlin/src/gcode/motion/M290.cpp index 1cae8d11a2..7dd89a6fac 100644 --- a/Marlin/src/gcode/motion/M290.cpp +++ b/Marlin/src/gcode/motion/M290.cpp @@ -39,7 +39,7 @@ #if ENABLED(BABYSTEP_ZPROBE_OFFSET) - FORCE_INLINE void mod_probe_offset(const float &offs) { + FORCE_INLINE void mod_probe_offset(const_float_t offs) { if (TERN1(BABYSTEP_HOTEND_Z_OFFSET, active_extruder == 0)) { probe.offset.z += offs; SERIAL_ECHO_MSG(STR_PROBE_OFFSET " " STR_Z, probe.offset.z); diff --git a/Marlin/src/gcode/parser.h b/Marlin/src/gcode/parser.h index ed503f8a90..a0fc67b9e5 100644 --- a/Marlin/src/gcode/parser.h +++ b/Marlin/src/gcode/parser.h @@ -282,8 +282,8 @@ public: // Units modes: Inches, Fahrenheit, Kelvin #if ENABLED(INCH_MODE_SUPPORT) - static inline float mm_to_linear_unit(const float mm) { return mm / linear_unit_factor; } - static inline float mm_to_volumetric_unit(const float mm) { return mm / (volumetric_enabled ? volumetric_unit_factor : linear_unit_factor); } + static inline float mm_to_linear_unit(const_float_t mm) { return mm / linear_unit_factor; } + static inline float mm_to_volumetric_unit(const_float_t mm) { return mm / (volumetric_enabled ? volumetric_unit_factor : linear_unit_factor); } // Init linear units by constructor GCodeParser() { set_input_linear_units(LINEARUNIT_MM); } @@ -301,16 +301,16 @@ public: return (axis >= E_AXIS && volumetric_enabled ? volumetric_unit_factor : linear_unit_factor); } - static inline float linear_value_to_mm(const float v) { return v * linear_unit_factor; } + static inline float linear_value_to_mm(const_float_t v) { return v * linear_unit_factor; } static inline float axis_value_to_mm(const AxisEnum axis, const float v) { return v * axis_unit_factor(axis); } static inline float per_axis_value(const AxisEnum axis, const float v) { return v / axis_unit_factor(axis); } #else - static inline float mm_to_linear_unit(const float mm) { return mm; } - static inline float mm_to_volumetric_unit(const float mm) { return mm; } + static inline float mm_to_linear_unit(const_float_t mm) { return mm; } + static inline float mm_to_volumetric_unit(const_float_t mm) { return mm; } - static inline float linear_value_to_mm(const float v) { return v; } + static inline float linear_value_to_mm(const_float_t v) { return v; } static inline float axis_value_to_mm(const AxisEnum, const float v) { return v; } static inline float per_axis_value(const AxisEnum, const float v) { return v; } diff --git a/Marlin/src/lcd/dogm/marlinui_DOGM.cpp b/Marlin/src/lcd/dogm/marlinui_DOGM.cpp index c2d2cf43af..e41ed62573 100644 --- a/Marlin/src/lcd/dogm/marlinui_DOGM.cpp +++ b/Marlin/src/lcd/dogm/marlinui_DOGM.cpp @@ -669,7 +669,7 @@ void MarlinUI::clear_lcd() { } // Automatically cleared by Picture Loop B00001100,B00000000 }; - void _lcd_zoffset_overlay_gfx(const float zvalue) { + void _lcd_zoffset_overlay_gfx(const_float_t zvalue) { // Determine whether the user is raising or lowering the nozzle. static int8_t dir; static float old_zvalue; diff --git a/Marlin/src/lcd/extui/anycubic_chiron_lcd.cpp b/Marlin/src/lcd/extui/anycubic_chiron_lcd.cpp index a424327b08..10c791cbc5 100644 --- a/Marlin/src/lcd/extui/anycubic_chiron_lcd.cpp +++ b/Marlin/src/lcd/extui/anycubic_chiron_lcd.cpp @@ -101,7 +101,7 @@ namespace ExtUI { #if HAS_MESH void onMeshLevelingStart() {} - void onMeshUpdate(const int8_t xpos, const int8_t ypos, const float &zval) { + void onMeshUpdate(const int8_t xpos, const int8_t ypos, const_float_t zval) { // Called when any mesh points are updated //SERIAL_ECHOLNPAIR("onMeshUpdate() x:", xpos, " y:", ypos, " z:", zval); } diff --git a/Marlin/src/lcd/extui/anycubic_i3mega_lcd.cpp b/Marlin/src/lcd/extui/anycubic_i3mega_lcd.cpp index 939199db93..a98da07959 100644 --- a/Marlin/src/lcd/extui/anycubic_i3mega_lcd.cpp +++ b/Marlin/src/lcd/extui/anycubic_i3mega_lcd.cpp @@ -93,7 +93,7 @@ namespace ExtUI { void onMeshLevelingStart() {} - void onMeshUpdate(const int8_t xpos, const int8_t ypos, const float &zval) { + void onMeshUpdate(const int8_t xpos, const int8_t ypos, const_float_t zval) { // Called when any mesh points are updated } #endif diff --git a/Marlin/src/lcd/extui/dgus_lcd.cpp b/Marlin/src/lcd/extui/dgus_lcd.cpp index 273a8d2d2a..73542090c5 100644 --- a/Marlin/src/lcd/extui/dgus_lcd.cpp +++ b/Marlin/src/lcd/extui/dgus_lcd.cpp @@ -111,7 +111,7 @@ namespace ExtUI { #if HAS_MESH void onMeshLevelingStart() {} - void onMeshUpdate(const int8_t xpos, const int8_t ypos, const float &zval) { + void onMeshUpdate(const int8_t xpos, const int8_t ypos, const_float_t zval) { // Called when any mesh points are updated } diff --git a/Marlin/src/lcd/extui/example.cpp b/Marlin/src/lcd/extui/example.cpp index 415d381dd6..38986fba73 100644 --- a/Marlin/src/lcd/extui/example.cpp +++ b/Marlin/src/lcd/extui/example.cpp @@ -97,7 +97,7 @@ namespace ExtUI { #if HAS_MESH void onMeshLevelingStart() {} - void onMeshUpdate(const int8_t xpos, const int8_t ypos, const float &zval) { + void onMeshUpdate(const int8_t xpos, const int8_t ypos, const_float_t zval) { // Called when any mesh points are updated } diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/marlin_events.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/marlin_events.cpp index d8abfcd29a..10c873d19c 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/marlin_events.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/marlin_events.cpp @@ -140,7 +140,7 @@ namespace ExtUI { #if HAS_LEVELING && HAS_MESH void onMeshLevelingStart() {} - void onMeshUpdate(const int8_t x, const int8_t y, const float &val) { + void onMeshUpdate(const int8_t x, const int8_t y, const_float_t val) { BedMeshScreen::onMeshUpdate(x, y, val); } diff --git a/Marlin/src/lcd/extui/malyan_lcd.cpp b/Marlin/src/lcd/extui/malyan_lcd.cpp index d684ebd017..780401964b 100644 --- a/Marlin/src/lcd/extui/malyan_lcd.cpp +++ b/Marlin/src/lcd/extui/malyan_lcd.cpp @@ -528,7 +528,7 @@ namespace ExtUI { #if HAS_MESH void onMeshLevelingStart() {} - void onMeshUpdate(const int8_t xpos, const int8_t ypos, const float &zval) {} + void onMeshUpdate(const int8_t xpos, const int8_t ypos, const_float_t zval) {} void onMeshUpdate(const int8_t xpos, const int8_t ypos, const ExtUI::probe_state_t state) {} #endif diff --git a/Marlin/src/lcd/extui/ui_api.cpp b/Marlin/src/lcd/extui/ui_api.cpp index 23930c04f3..2eecda9df0 100644 --- a/Marlin/src/lcd/extui/ui_api.cpp +++ b/Marlin/src/lcd/extui/ui_api.cpp @@ -325,7 +325,7 @@ namespace ExtUI { return epos; } - void setAxisPosition_mm(const float &position, const axis_t axis, const feedRate_t feedrate/*=0*/) { + void setAxisPosition_mm(const_float_t position, const axis_t axis, const feedRate_t feedrate/*=0*/) { // Get motion limit from software endstops, if any float min, max; soft_endstop.get_manual_axis_limits((AxisEnum)axis, min, max); @@ -343,7 +343,7 @@ namespace ExtUI { line_to_current_position(feedrate ?: manual_feedrate_mm_s[axis]); } - void setAxisPosition_mm(const float &position, const extruder_t extruder, const feedRate_t feedrate/*=0*/) { + void setAxisPosition_mm(const_float_t position, const extruder_t extruder, const feedRate_t feedrate/*=0*/) { setActiveTool(extruder, true); current_position.e = position; @@ -455,7 +455,7 @@ namespace ExtUI { }; } - void setAxisCurrent_mA(const float &mA, const axis_t axis) { + void setAxisCurrent_mA(const_float_t mA, const axis_t axis) { switch (axis) { #if AXIS_IS_TMC(X) case X: stepperX.rms_current(constrain(mA, 400, 1500)); break; @@ -479,7 +479,7 @@ namespace ExtUI { }; } - void setAxisCurrent_mA(const float &mA, const extruder_t extruder) { + void setAxisCurrent_mA(const_float_t mA, const extruder_t extruder) { switch (extruder) { #if AXIS_IS_TMC(E0) case E0: stepperE0.rms_current(constrain(mA, 400, 1500)); break; @@ -539,7 +539,7 @@ namespace ExtUI { } } - void setTMCBumpSensitivity(const float &value, const axis_t axis) { + void setTMCBumpSensitivity(const_float_t value, const axis_t axis) { switch (axis) { #if X_SENSORLESS || Y_SENSORLESS || Z_SENSORLESS #if X_SENSORLESS @@ -583,12 +583,12 @@ namespace ExtUI { return planner.settings.axis_steps_per_mm[E_AXIS_N(extruder - E0)]; } - void setAxisSteps_per_mm(const float &value, const axis_t axis) { + void setAxisSteps_per_mm(const_float_t value, const axis_t axis) { planner.settings.axis_steps_per_mm[axis] = value; planner.refresh_positioning(); } - void setAxisSteps_per_mm(const float &value, const extruder_t extruder) { + void setAxisSteps_per_mm(const_float_t value, const extruder_t extruder) { UNUSED_E(extruder); planner.settings.axis_steps_per_mm[E_AXIS_N(extruder - E0)] = value; planner.refresh_positioning(); @@ -621,11 +621,11 @@ namespace ExtUI { return planner.settings.max_acceleration_mm_per_s2[E_AXIS_N(extruder - E0)]; } - void setAxisMaxAcceleration_mm_s2(const float &value, const axis_t axis) { + void setAxisMaxAcceleration_mm_s2(const_float_t value, const axis_t axis) { planner.set_max_acceleration(axis, value); } - void setAxisMaxAcceleration_mm_s2(const float &value, const extruder_t extruder) { + void setAxisMaxAcceleration_mm_s2(const_float_t value, const extruder_t extruder) { UNUSED_E(extruder); planner.set_max_acceleration(E_AXIS_N(extruder - E0), value); } @@ -638,7 +638,7 @@ namespace ExtUI { #if HAS_FILAMENT_RUNOUT_DISTANCE float getFilamentRunoutDistance_mm() { return runout.runout_distance(); } - void setFilamentRunoutDistance_mm(const float &value) { runout.set_runout_distance(constrain(value, 0, 999)); } + void setFilamentRunoutDistance_mm(const_float_t value) { runout.set_runout_distance(constrain(value, 0, 999)); } #endif #endif @@ -651,7 +651,7 @@ namespace ExtUI { #if CASELIGHT_USES_BRIGHTNESS float getCaseLightBrightness_percent() { return ui8_to_percent(caselight.brightness); } - void setCaseLightBrightness_percent(const float &value) { + void setCaseLightBrightness_percent(const_float_t value) { caselight.brightness = map(constrain(value, 0, 100), 0, 100, 0, 255); caselight.update_brightness(); } @@ -663,7 +663,7 @@ namespace ExtUI { return (extruder < EXTRUDERS) ? planner.extruder_advance_K[extruder - E0] : 0; } - void setLinearAdvance_mm_mm_s(const float &value, const extruder_t extruder) { + void setLinearAdvance_mm_mm_s(const_float_t value, const extruder_t extruder) { if (extruder < EXTRUDERS) planner.extruder_advance_K[extruder - E0] = constrain(value, 0, 10); } @@ -675,7 +675,7 @@ namespace ExtUI { return planner.junction_deviation_mm; } - void setJunctionDeviation_mm(const float &value) { + void setJunctionDeviation_mm(const_float_t value) { planner.junction_deviation_mm = constrain(value, 0.001, 0.3); TERN_(LIN_ADVANCE, planner.recalculate_max_e_jerk()); } @@ -683,8 +683,8 @@ namespace ExtUI { #else float getAxisMaxJerk_mm_s(const axis_t axis) { return planner.max_jerk[axis]; } float getAxisMaxJerk_mm_s(const extruder_t) { return planner.max_jerk.e; } - void setAxisMaxJerk_mm_s(const float &value, const axis_t axis) { planner.set_max_jerk((AxisEnum)axis, value); } - void setAxisMaxJerk_mm_s(const float &value, const extruder_t) { planner.set_max_jerk(E_AXIS, value); } + void setAxisMaxJerk_mm_s(const_float_t value, const axis_t axis) { planner.set_max_jerk((AxisEnum)axis, value); } + void setAxisMaxJerk_mm_s(const_float_t value, const extruder_t) { planner.set_max_jerk(E_AXIS, value); } #endif #if ENABLED(DUAL_X_CARRIAGE) @@ -709,9 +709,9 @@ namespace ExtUI { void setFlow_percent(const int16_t flow, const extruder_t extr) { planner.set_flow(extr, flow); } void setMinFeedrate_mm_s(const feedRate_t fr) { planner.settings.min_feedrate_mm_s = fr; } void setMinTravelFeedrate_mm_s(const feedRate_t fr) { planner.settings.min_travel_feedrate_mm_s = fr; } - void setPrintingAcceleration_mm_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; } + void setPrintingAcceleration_mm_s2(const_float_t acc) { planner.settings.acceleration = acc; } + void setRetractAcceleration_mm_s2(const_float_t acc) { planner.settings.retract_acceleration = acc; } + void setTravelAcceleration_mm_s2(const_float_t acc) { planner.settings.travel_acceleration = acc; } #if ENABLED(BABYSTEPPING) @@ -772,7 +772,7 @@ namespace ExtUI { * Converts a mm displacement to a number of whole number of * steps that is at least mm long. */ - int16_t mmToWholeSteps(const float &mm, const axis_t axis) { + int16_t mmToWholeSteps(const_float_t mm, const axis_t axis) { const float steps = mm / planner.steps_to_mm[axis]; return steps > 0 ? CEIL(steps) : FLOOR(steps); } @@ -789,7 +789,7 @@ namespace ExtUI { ); } - void setZOffset_mm(const float &value) { + void setZOffset_mm(const_float_t value) { #if HAS_BED_PROBE if (WITHIN(value, Z_PROBE_OFFSET_RANGE_MIN, Z_PROBE_OFFSET_RANGE_MAX)) probe.offset.z = value; @@ -807,7 +807,7 @@ namespace ExtUI { return hotend_offset[extruder - E0][axis]; } - void setNozzleOffset_mm(const float &value, const axis_t axis, const extruder_t extruder) { + void setNozzleOffset_mm(const_float_t value, const axis_t axis, const extruder_t extruder) { if (extruder - E0 >= HOTENDS) return; hotend_offset[extruder - E0][axis] = value; } @@ -826,20 +826,20 @@ namespace ExtUI { #if HAS_BED_PROBE float getProbeOffset_mm(const axis_t axis) { return probe.offset.pos[axis]; } - void setProbeOffset_mm(const float &val, const axis_t axis) { probe.offset.pos[axis] = val; } + void setProbeOffset_mm(const_float_t val, const axis_t axis) { probe.offset.pos[axis] = val; } #endif #if ENABLED(BACKLASH_GCODE) float getAxisBacklash_mm(const axis_t axis) { return backlash.distance_mm[axis]; } - void setAxisBacklash_mm(const float &value, const axis_t axis) + void setAxisBacklash_mm(const_float_t value, const axis_t axis) { backlash.distance_mm[axis] = constrain(value,0,5); } float getBacklashCorrection_percent() { return ui8_to_percent(backlash.correction); } - void setBacklashCorrection_percent(const float &value) { backlash.correction = map(constrain(value, 0, 100), 0, 100, 0, 255); } + void setBacklashCorrection_percent(const_float_t value) { backlash.correction = map(constrain(value, 0, 100), 0, 100, 0, 255); } #ifdef BACKLASH_SMOOTHING_MM float getBacklashSmoothing_mm() { return backlash.smoothing_mm; } - void setBacklashSmoothing_mm(const float &value) { backlash.smoothing_mm = constrain(value, 0, 999); } + void setBacklashSmoothing_mm(const_float_t value) { backlash.smoothing_mm = constrain(value, 0, 999); } #endif #endif @@ -858,14 +858,14 @@ namespace ExtUI { bed_mesh_t& getMeshArray() { return Z_VALUES_ARR; } float getMeshPoint(const xy_uint8_t &pos) { return Z_VALUES(pos.x, pos.y); } - void setMeshPoint(const xy_uint8_t &pos, const float &zoff) { + void setMeshPoint(const xy_uint8_t &pos, const_float_t zoff) { if (WITHIN(pos.x, 0, GRID_MAX_POINTS_X) && WITHIN(pos.y, 0, GRID_MAX_POINTS_Y)) { Z_VALUES(pos.x, pos.y) = zoff; TERN_(ABL_BILINEAR_SUBDIVISION, bed_level_virt_interpolate()); } } - void moveToMeshPoint(const xy_uint8_t &pos, const float &z) { + void moveToMeshPoint(const xy_uint8_t &pos, const_float_t z) { #if EITHER(MESH_BED_LEVELING, AUTO_BED_LEVELING_UBL) const feedRate_t old_feedrate = feedrate_mm_s; const float x_target = MESH_MIN_X + pos.x * (MESH_X_DIST), @@ -919,14 +919,14 @@ namespace ExtUI { float getPIDValues_Ki(const extruder_t tool) { return unscalePID_i(PID_PARAM(Ki, tool)); } float getPIDValues_Kd(const extruder_t tool) { return unscalePID_d(PID_PARAM(Kd, tool)); } - void setPIDValues(const float &p, const float &i, const float &d, extruder_t tool) { + void setPIDValues(const_float_t p, const_float_t i, const_float_t d, extruder_t tool) { thermalManager.temp_hotend[tool].pid.Kp = p; thermalManager.temp_hotend[tool].pid.Ki = scalePID_i(i); thermalManager.temp_hotend[tool].pid.Kd = scalePID_d(d); thermalManager.updatePID(); } - void startPIDTune(const float &temp, extruder_t tool) { + void startPIDTune(const_float_t temp, extruder_t tool) { thermalManager.PID_autotune(temp, (heater_id_t)tool, 8, true); } #endif @@ -936,14 +936,14 @@ namespace ExtUI { float getBedPIDValues_Ki() { return unscalePID_i(thermalManager.temp_bed.pid.Ki); } float getBedPIDValues_Kd() { return unscalePID_d(thermalManager.temp_bed.pid.Kd); } - void setBedPIDValues(const float &p, const float &i, const float &d) { + void setBedPIDValues(const_float_t p, const_float_t i, const_float_t d) { thermalManager.temp_bed.pid.Kp = p; thermalManager.temp_bed.pid.Ki = scalePID_i(i); thermalManager.temp_bed.pid.Kd = scalePID_d(d); thermalManager.updatePID(); } - void startBedPIDTune(const float &temp) { + void startBedPIDTune(const_float_t temp) { thermalManager.PID_autotune(temp, H_BED, 4, true); } #endif @@ -963,7 +963,7 @@ namespace ExtUI { return firmware_name; } - void setTargetTemp_celsius(const float &inval, const heater_t heater) { + void setTargetTemp_celsius(const_float_t inval, const heater_t heater) { float value = inval; #ifdef TOUCH_UI_LCD_TEMP_SCALING value *= TOUCH_UI_LCD_TEMP_SCALING; @@ -988,7 +988,7 @@ namespace ExtUI { } } - void setTargetTemp_celsius(const float &inval, const extruder_t extruder) { + void setTargetTemp_celsius(const_float_t inval, const extruder_t extruder) { float value = inval; #ifdef TOUCH_UI_LCD_TEMP_SCALING value *= TOUCH_UI_LCD_TEMP_SCALING; @@ -1000,7 +1000,7 @@ namespace ExtUI { #endif } - void setTargetFan_percent(const float &value, const fan_t fan) { + void setTargetFan_percent(const_float_t value, const fan_t fan) { #if HAS_FAN if (fan < FAN_COUNT) thermalManager.set_fan_speed(fan - FAN0, map(constrain(value, 0, 100), 0, 100, 0, 255)); @@ -1010,7 +1010,7 @@ namespace ExtUI { #endif } - void setFeedrate_percent(const float &value) { feedrate_percentage = constrain(value, 10, 500); } + void setFeedrate_percent(const_float_t value) { feedrate_percentage = constrain(value, 10, 500); } void coolDown() { #if HAS_HOTEND diff --git a/Marlin/src/lcd/extui/ui_api.h b/Marlin/src/lcd/extui/ui_api.h index ea49a3b63d..24bf284648 100644 --- a/Marlin/src/lcd/extui/ui_api.h +++ b/Marlin/src/lcd/extui/ui_api.h @@ -102,11 +102,11 @@ namespace ExtUI { #if HAS_TRINAMIC_CONFIG float getAxisCurrent_mA(const axis_t); float getAxisCurrent_mA(const extruder_t); - void setAxisCurrent_mA(const float&, const axis_t); - void setAxisCurrent_mA(const float&, const extruder_t); + void setAxisCurrent_mA(const_float_t , const axis_t); + void setAxisCurrent_mA(const_float_t , const extruder_t); int getTMCBumpSensitivity(const axis_t); - void setTMCBumpSensitivity(const float&, const axis_t); + void setTMCBumpSensitivity(const_float_t , const axis_t); #endif float getActualTemp_celsius(const heater_t); @@ -161,11 +161,11 @@ namespace ExtUI { #if HAS_MESH bed_mesh_t& getMeshArray(); float getMeshPoint(const xy_uint8_t &pos); - void setMeshPoint(const xy_uint8_t &pos, const float &zval); - void moveToMeshPoint(const xy_uint8_t &pos, const float &z); + void setMeshPoint(const xy_uint8_t &pos, const_float_t zval); + void moveToMeshPoint(const xy_uint8_t &pos, const_float_t z); void onMeshLevelingStart(); - void onMeshUpdate(const int8_t xpos, const int8_t ypos, const float &zval); - inline void onMeshUpdate(const xy_int8_t &pos, const float &zval) { onMeshUpdate(pos.x, pos.y, zval); } + void onMeshUpdate(const int8_t xpos, const int8_t ypos, const_float_t zval); + inline void onMeshUpdate(const xy_int8_t &pos, const_float_t zval) { onMeshUpdate(pos.x, pos.y, zval); } typedef enum : uint8_t { MESH_START, // Prior to start of probe @@ -191,42 +191,42 @@ namespace ExtUI { char* getFilamentUsed_str(char buffer[21]); #endif - void setTargetTemp_celsius(const float&, const heater_t); - void setTargetTemp_celsius(const float&, const extruder_t); - void setTargetFan_percent(const float&, const fan_t); + void setTargetTemp_celsius(const_float_t , const heater_t); + void setTargetTemp_celsius(const_float_t , const extruder_t); + void setTargetFan_percent(const_float_t , const fan_t); void coolDown(); - void setAxisPosition_mm(const float&, const axis_t, const feedRate_t=0); - void setAxisPosition_mm(const float&, const extruder_t, const feedRate_t=0); - void setAxisSteps_per_mm(const float&, const axis_t); - void setAxisSteps_per_mm(const float&, const extruder_t); + void setAxisPosition_mm(const_float_t , const axis_t, const feedRate_t=0); + void setAxisPosition_mm(const_float_t , const extruder_t, const feedRate_t=0); + void setAxisSteps_per_mm(const_float_t , const axis_t); + void setAxisSteps_per_mm(const_float_t , const extruder_t); void setAxisMaxFeedrate_mm_s(const feedRate_t, const axis_t); void setAxisMaxFeedrate_mm_s(const feedRate_t, const extruder_t); - void setAxisMaxAcceleration_mm_s2(const float&, const axis_t); - void setAxisMaxAcceleration_mm_s2(const float&, const extruder_t); + void setAxisMaxAcceleration_mm_s2(const_float_t , const axis_t); + void setAxisMaxAcceleration_mm_s2(const_float_t , const extruder_t); void setFeedrate_mm_s(const feedRate_t); void setMinFeedrate_mm_s(const feedRate_t); void setMinTravelFeedrate_mm_s(const feedRate_t); - void setPrintingAcceleration_mm_s2(const float&); - void setRetractAcceleration_mm_s2(const float&); - void setTravelAcceleration_mm_s2(const float&); - void setFeedrate_percent(const float&); + void setPrintingAcceleration_mm_s2(const_float_t ); + void setRetractAcceleration_mm_s2(const_float_t ); + void setTravelAcceleration_mm_s2(const_float_t ); + void setFeedrate_percent(const_float_t ); void setFlow_percent(const int16_t, const extruder_t); bool awaitingUserConfirm(); void setUserConfirmed(); #if ENABLED(LIN_ADVANCE) float getLinearAdvance_mm_mm_s(const extruder_t); - void setLinearAdvance_mm_mm_s(const float&, const extruder_t); + void setLinearAdvance_mm_mm_s(const_float_t , const extruder_t); #endif #if HAS_JUNCTION_DEVIATION float getJunctionDeviation_mm(); - void setJunctionDeviation_mm(const float&); + void setJunctionDeviation_mm(const_float_t ); #else float getAxisMaxJerk_mm_s(const axis_t); float getAxisMaxJerk_mm_s(const extruder_t); - void setAxisMaxJerk_mm_s(const float&, const axis_t); - void setAxisMaxJerk_mm_s(const float&, const extruder_t); + void setAxisMaxJerk_mm_s(const_float_t , const axis_t); + void setAxisMaxJerk_mm_s(const_float_t , const extruder_t); #endif extruder_t getTool(const uint8_t extruder); @@ -234,7 +234,7 @@ namespace ExtUI { void setActiveTool(const extruder_t, bool no_move); #if ENABLED(BABYSTEPPING) - int16_t mmToWholeSteps(const float& mm, const axis_t axis); + int16_t mmToWholeSteps(const_float_t mm, const axis_t axis); bool babystepAxis_steps(const int16_t steps, const axis_t axis); void smartAdjustAxis_steps(const int16_t steps, const axis_t axis, bool linked_nozzles); @@ -242,28 +242,28 @@ namespace ExtUI { #if HAS_HOTEND_OFFSET float getNozzleOffset_mm(const axis_t, const extruder_t); - void setNozzleOffset_mm(const float&, const axis_t, const extruder_t); + void setNozzleOffset_mm(const_float_t , const axis_t, const extruder_t); void normalizeNozzleOffset(const axis_t axis); #endif float getZOffset_mm(); - void setZOffset_mm(const float&); + void setZOffset_mm(const_float_t ); #if HAS_BED_PROBE float getProbeOffset_mm(const axis_t); - void setProbeOffset_mm(const float&, const axis_t); + void setProbeOffset_mm(const_float_t , const axis_t); #endif #if ENABLED(BACKLASH_GCODE) float getAxisBacklash_mm(const axis_t); - void setAxisBacklash_mm(const float&, const axis_t); + void setAxisBacklash_mm(const_float_t , const axis_t); float getBacklashCorrection_percent(); - void setBacklashCorrection_percent(const float&); + void setBacklashCorrection_percent(const_float_t ); #ifdef BACKLASH_SMOOTHING_MM float getBacklashSmoothing_mm(); - void setBacklashSmoothing_mm(const float&); + void setBacklashSmoothing_mm(const_float_t ); #endif #endif @@ -275,7 +275,7 @@ namespace ExtUI { #if HAS_FILAMENT_RUNOUT_DISTANCE float getFilamentRunoutDistance_mm(); - void setFilamentRunoutDistance_mm(const float&); + void setFilamentRunoutDistance_mm(const_float_t ); #endif #endif @@ -285,7 +285,7 @@ namespace ExtUI { #if DISABLED(CASE_LIGHT_NO_BRIGHTNESS) float getCaseLightBrightness_percent(); - void setCaseLightBrightness_percent(const float&); + void setCaseLightBrightness_percent(const_float_t ); #endif #endif @@ -293,16 +293,16 @@ namespace ExtUI { float getPIDValues_Kp(const extruder_t); float getPIDValues_Ki(const extruder_t); float getPIDValues_Kd(const extruder_t); - void setPIDValues(const float&, const float&, const float&, extruder_t); - void startPIDTune(const float&, extruder_t); + void setPIDValues(const_float_t , const_float_t , const_float_t , extruder_t); + void startPIDTune(const_float_t , extruder_t); #endif #if ENABLED(PIDTEMPBED) float getBedPIDValues_Kp(); float getBedPIDValues_Ki(); float getBedPIDValues_Kd(); - void setBedPIDValues(const float&, const float&, const float&); - void startBedPIDTune(const float&); + void setBedPIDValues(const_float_t , const_float_t , const_float_t ); + void startBedPIDTune(const_float_t ); #endif /** diff --git a/Marlin/src/lcd/marlinui.h b/Marlin/src/lcd/marlinui.h index 57e6fc26e6..24fedb039e 100644 --- a/Marlin/src/lcd/marlinui.h +++ b/Marlin/src/lcd/marlinui.h @@ -501,7 +501,7 @@ public: #endif #if ENABLED(AUTO_BED_LEVELING_UBL) - static void ubl_mesh_edit_start(const float &initial); + static void ubl_mesh_edit_start(const_float_t initial); static float ubl_mesh_value(); #endif diff --git a/Marlin/src/lcd/menu/menu.cpp b/Marlin/src/lcd/menu/menu.cpp index add306b6e3..6143e8da1e 100644 --- a/Marlin/src/lcd/menu/menu.cpp +++ b/Marlin/src/lcd/menu/menu.cpp @@ -289,7 +289,7 @@ void scroll_screen(const uint8_t limit, const bool is_menu) { #if HAS_LINE_TO_Z - void line_to_z(const float &z) { + void line_to_z(const_float_t z) { current_position.z = z; line_to_current_position(manual_feedrate_mm_s.z); } diff --git a/Marlin/src/lcd/menu/menu.h b/Marlin/src/lcd/menu/menu.h index cbef9b50c9..290832c49c 100644 --- a/Marlin/src/lcd/menu/menu.h +++ b/Marlin/src/lcd/menu/menu.h @@ -40,7 +40,7 @@ typedef void (*selectFunc_t)(); #define SS_DEFAULT SS_CENTER #if HAS_MARLINUI_U8GLIB && EITHER(BABYSTEP_ZPROBE_GFX_OVERLAY, MESH_EDIT_GFX_OVERLAY) - void _lcd_zoffset_overlay_gfx(const float zvalue); + void _lcd_zoffset_overlay_gfx(const_float_t zvalue); #endif #if ENABLED(BABYSTEP_ZPROBE_OFFSET) && Z_PROBE_OFFSET_RANGE_MIN >= -9 && Z_PROBE_OFFSET_RANGE_MAX <= 9 @@ -212,11 +212,7 @@ void _lcd_draw_homing(); #define HAS_LINE_TO_Z ANY(DELTA, PROBE_MANUALLY, MESH_BED_LEVELING, LEVEL_BED_CORNERS) #if HAS_LINE_TO_Z - void line_to_z(const float &z); -#endif - -#if HAS_MARLINUI_U8GLIB && EITHER(BABYSTEP_ZPROBE_GFX_OVERLAY, MESH_EDIT_GFX_OVERLAY) - void _lcd_zoffset_overlay_gfx(const float zvalue); + void line_to_z(const_float_t z); #endif #if ENABLED(PROBE_OFFSET_WIZARD) diff --git a/Marlin/src/lcd/menu/menu_delta_calibrate.cpp b/Marlin/src/lcd/menu/menu_delta_calibrate.cpp index ef9f2246c2..b857b62de5 100644 --- a/Marlin/src/lcd/menu/menu_delta_calibrate.cpp +++ b/Marlin/src/lcd/menu/menu_delta_calibrate.cpp @@ -86,7 +86,7 @@ void _man_probe_pt(const xy_pos_t &xy) { ui.goto_screen(_lcd_calibrate_homing); } - void _goto_tower_a(const float &a) { + void _goto_tower_a(const_float_t a) { xy_pos_t tower_vec = { cos(RADIANS(a)), sin(RADIANS(a)) }; _man_probe_pt(tower_vec * delta_calibration_radius()); } diff --git a/Marlin/src/lcd/menu/menu_item.h b/Marlin/src/lcd/menu/menu_item.h index 945a892799..d3ec359fb1 100644 --- a/Marlin/src/lcd/menu/menu_item.h +++ b/Marlin/src/lcd/menu/menu_item.h @@ -77,8 +77,8 @@ template class TMenuEditItem : MenuEditItemBase { private: typedef typename NAME::type_t type_t; - static inline float scale(const float value) { return NAME::scale(value); } - static inline float unscale(const float value) { return NAME::unscale(value); } + static inline float scale(const_float_t value) { return NAME::scale(value); } + static inline float unscale(const_float_t value) { return NAME::unscale(value); } static const char* to_string(const int32_t value) { return NAME::strfunc(unscale(value)); } static void load(void *ptr, const int32_t value) { *((type_t*)ptr) = unscale(value); } public: @@ -114,9 +114,9 @@ class TMenuEditItem : MenuEditItemBase { #define DEFINE_MENU_EDIT_ITEM_TYPE(NAME, TYPE, STRFUNC, SCALE, V...) \ struct MenuEditItemInfo_##NAME { \ typedef TYPE type_t; \ - static inline float scale(const float value) { return value * (SCALE) + (V+0); } \ - static inline float unscale(const float value) { return value / (SCALE) + (V+0); } \ - static inline const char* strfunc(const float value) { return STRFUNC(_DOFIX(TYPE,value)); } \ + static inline float scale(const_float_t value) { return value * (SCALE) + (V+0); } \ + static inline float unscale(const_float_t value) { return value / (SCALE) + (V+0); } \ + static inline const char* strfunc(const_float_t value) { return STRFUNC(_DOFIX(TYPE,value)); } \ }; \ typedef TMenuEditItem MenuItem_##NAME diff --git a/Marlin/src/lcd/menu/menu_motion.cpp b/Marlin/src/lcd/menu/menu_motion.cpp index 71fc4246c7..dfa7b92a99 100644 --- a/Marlin/src/lcd/menu/menu_motion.cpp +++ b/Marlin/src/lcd/menu/menu_motion.cpp @@ -149,7 +149,7 @@ void lcd_move_z() { _lcd_move_xyz(GET_TEXT(MSG_MOVE_Z), Z_AXIS); } screenFunc_t _manual_move_func_ptr; -void _goto_manual_move(const float scale) { +void _goto_manual_move(const_float_t scale) { ui.defer_status_screen(); ui.manual_move.menu_scale = scale; ui.goto_screen(_manual_move_func_ptr); diff --git a/Marlin/src/lcd/menu/menu_probe_offset.cpp b/Marlin/src/lcd/menu/menu_probe_offset.cpp index 1d62ada327..008db6a8b8 100644 --- a/Marlin/src/lcd/menu/menu_probe_offset.cpp +++ b/Marlin/src/lcd/menu/menu_probe_offset.cpp @@ -58,14 +58,14 @@ inline void z_clearance_move() { ); } -void set_offset_and_go_back(const float &z) { +void set_offset_and_go_back(const_float_t z) { probe.offset.z = z; SET_SOFT_ENDSTOP_LOOSE(false); TERN_(HAS_LEVELING, set_bed_leveling_enabled(leveling_was_active)); ui.goto_previous_screen_no_defer(); } -void _goto_manual_move_z(const float scale) { +void _goto_manual_move_z(const_float_t scale) { ui.manual_move.menu_scale = scale; ui.goto_screen(lcd_move_z); } diff --git a/Marlin/src/lcd/menu/menu_ubl.cpp b/Marlin/src/lcd/menu/menu_ubl.cpp index 565e6725a7..876c9ae621 100644 --- a/Marlin/src/lcd/menu/menu_ubl.cpp +++ b/Marlin/src/lcd/menu/menu_ubl.cpp @@ -92,7 +92,7 @@ void _lcd_mesh_fine_tune(PGM_P const msg) { // Init mesh editing and go to the fine tuning screen (ubl.fine_tune_mesh) // To capture encoder events UBL will also call ui.capture and ui.release. // -void MarlinUI::ubl_mesh_edit_start(const float &initial) { +void MarlinUI::ubl_mesh_edit_start(const_float_t initial) { TERN_(HAS_GRAPHICAL_TFT, clear_lcd()); mesh_edit_accumulator = initial; goto_screen([]{ _lcd_mesh_fine_tune(GET_TEXT(MSG_MESH_EDIT_Z)); }); diff --git a/Marlin/src/libs/L64XX/L64XX_Marlin.cpp b/Marlin/src/libs/L64XX/L64XX_Marlin.cpp index d079e0b4b3..8f71d52ec8 100644 --- a/Marlin/src/libs/L64XX/L64XX_Marlin.cpp +++ b/Marlin/src/libs/L64XX/L64XX_Marlin.cpp @@ -368,12 +368,12 @@ void L64XX_Marlin::set_param(const L64XX_axis_t axis, const uint8_t param, const } } -inline void echo_min_max(const char a, const float &min, const float &max) { +inline void echo_min_max(const char a, const_float_t min, const_float_t max) { DEBUG_CHAR(' '); DEBUG_CHAR(a); DEBUG_ECHOPAIR(" min = ", min); DEBUG_ECHOLNPAIR(" max = ", max); } -inline void echo_oct_used(const float &oct, const uint8_t stall) { +inline void echo_oct_used(const_float_t oct, const uint8_t stall) { DEBUG_ECHOPAIR("over_current_threshold used : ", oct); DEBUG_ECHOPGM_P(stall ? PSTR(" (Stall") : PSTR(" (OCD")); DEBUG_ECHOLNPGM(" threshold)"); diff --git a/Marlin/src/libs/least_squares_fit.h b/Marlin/src/libs/least_squares_fit.h index dbbab0a55e..374a1f5ada 100644 --- a/Marlin/src/libs/least_squares_fit.h +++ b/Marlin/src/libs/least_squares_fit.h @@ -47,7 +47,7 @@ inline void incremental_LSF_reset(struct linear_fit_data *lsf) { memset(lsf, 0, sizeof(linear_fit_data)); } -inline void incremental_WLSF(struct linear_fit_data *lsf, const float &x, const float &y, const float &z, const float &w) { +inline void incremental_WLSF(struct linear_fit_data *lsf, const_float_t x, const_float_t y, const_float_t z, const_float_t w) { // weight each accumulator by factor w, including the "number" of samples // (analogous to calling inc_LSF twice with same values to weight it by 2X) const float wx = w * x, wy = w * y, wz = w * z; @@ -63,11 +63,11 @@ inline void incremental_WLSF(struct linear_fit_data *lsf, const float &x, const lsf->max_absx = _MAX(ABS(wx), lsf->max_absx); lsf->max_absy = _MAX(ABS(wy), lsf->max_absy); } -inline void incremental_WLSF(struct linear_fit_data *lsf, const xy_pos_t &pos, const float &z, const float &w) { +inline void incremental_WLSF(struct linear_fit_data *lsf, const xy_pos_t &pos, const_float_t z, const_float_t w) { incremental_WLSF(lsf, pos.x, pos.y, z, w); } -inline void incremental_LSF(struct linear_fit_data *lsf, const float &x, const float &y, const float &z) { +inline void incremental_LSF(struct linear_fit_data *lsf, const_float_t x, const_float_t y, const_float_t z) { lsf->xbar += x; lsf->ybar += y; lsf->zbar += z; @@ -80,7 +80,7 @@ inline void incremental_LSF(struct linear_fit_data *lsf, const float &x, const f lsf->max_absy = _MAX(ABS(y), lsf->max_absy); lsf->N += 1.0; } -inline void incremental_LSF(struct linear_fit_data *lsf, const xy_pos_t &pos, const float &z) { +inline void incremental_LSF(struct linear_fit_data *lsf, const xy_pos_t &pos, const_float_t z) { incremental_LSF(lsf, pos.x, pos.y, z); } diff --git a/Marlin/src/libs/nozzle.cpp b/Marlin/src/libs/nozzle.cpp index c56f45c70b..6918d2fd80 100644 --- a/Marlin/src/libs/nozzle.cpp +++ b/Marlin/src/libs/nozzle.cpp @@ -130,7 +130,7 @@ Nozzle nozzle; * @param strokes number of strokes to execute * @param radius radius of circle */ - void Nozzle::circle(const xyz_pos_t &start, const xyz_pos_t &middle, const uint8_t &strokes, const float &radius) { + void Nozzle::circle(const xyz_pos_t &start, const xyz_pos_t &middle, const uint8_t &strokes, const_float_t radius) { if (strokes == 0) return; #if ENABLED(NOZZLE_CLEAN_GOBACK) @@ -158,7 +158,7 @@ Nozzle nozzle; * @param pattern one of the available patterns * @param argument depends on the cleaning pattern */ - void Nozzle::clean(const uint8_t &pattern, const uint8_t &strokes, const float &radius, const uint8_t &objects, const uint8_t cleans) { + void Nozzle::clean(const uint8_t &pattern, const uint8_t &strokes, const_float_t radius, const uint8_t &objects, const uint8_t cleans) { xyz_pos_t start[HOTENDS] = NOZZLE_CLEAN_START_POINT, end[HOTENDS] = NOZZLE_CLEAN_END_POINT, middle[HOTENDS] = NOZZLE_CLEAN_CIRCLE_MIDDLE; const uint8_t arrPos = ANY(SINGLENOZZLE, MIXING_EXTRUDER) ? 0 : active_extruder; diff --git a/Marlin/src/libs/nozzle.h b/Marlin/src/libs/nozzle.h index 81594b1381..d1706f0b31 100644 --- a/Marlin/src/libs/nozzle.h +++ b/Marlin/src/libs/nozzle.h @@ -62,7 +62,7 @@ class Nozzle { * @param strokes number of strokes to execute * @param radius radius of circle */ - static void circle(const xyz_pos_t &start, const xyz_pos_t &middle, const uint8_t &strokes, const float &radius) _Os; + static void circle(const xyz_pos_t &start, const xyz_pos_t &middle, const uint8_t &strokes, const_float_t radius) _Os; #endif // NOZZLE_CLEAN_FEATURE @@ -77,7 +77,7 @@ class Nozzle { * @param pattern one of the available patterns * @param argument depends on the cleaning pattern */ - static void clean(const uint8_t &pattern, const uint8_t &strokes, const float &radius, const uint8_t &objects, const uint8_t cleans) _Os; + static void clean(const uint8_t &pattern, const uint8_t &strokes, const_float_t radius, const uint8_t &objects, const uint8_t cleans) _Os; #endif // NOZZLE_CLEAN_FEATURE diff --git a/Marlin/src/libs/numtostr.cpp b/Marlin/src/libs/numtostr.cpp index 283734faab..1e1ac05710 100644 --- a/Marlin/src/libs/numtostr.cpp +++ b/Marlin/src/libs/numtostr.cpp @@ -178,7 +178,7 @@ const char* i16tostr4signrj(const int16_t i) { } // Convert unsigned float to string with 1.1 format -const char* ftostr11ns(const float &f) { +const char* ftostr11ns(const_float_t f) { const long i = UINTFLOAT(f, 1); conv[4] = DIGIMOD(i, 10); conv[5] = '.'; @@ -187,7 +187,7 @@ const char* ftostr11ns(const float &f) { } // Convert unsigned float to string with 1.23 format -const char* ftostr12ns(const float &f) { +const char* ftostr12ns(const_float_t f) { const long i = UINTFLOAT(f, 2); conv[3] = DIGIMOD(i, 100); conv[4] = '.'; @@ -197,7 +197,7 @@ const char* ftostr12ns(const float &f) { } // Convert unsigned float to string with 12.3 format -const char* ftostr31ns(const float &f) { +const char* ftostr31ns(const_float_t f) { const long i = UINTFLOAT(f, 1); conv[3] = DIGIMOD(i, 100); conv[4] = DIGIMOD(i, 10); @@ -207,7 +207,7 @@ const char* ftostr31ns(const float &f) { } // Convert unsigned float to string with 123.4 format -const char* ftostr41ns(const float &f) { +const char* ftostr41ns(const_float_t f) { const long i = UINTFLOAT(f, 1); conv[2] = DIGIMOD(i, 1000); conv[3] = DIGIMOD(i, 100); @@ -218,7 +218,7 @@ const char* ftostr41ns(const float &f) { } // Convert signed float to fixed-length string with 12.34 / _2.34 / -2.34 or -23.45 / 123.45 format -const char* ftostr42_52(const float &f) { +const char* ftostr42_52(const_float_t f) { if (f <= -10 || f >= 100) return ftostr52(f); // -23.45 / 123.45 long i = INTFLOAT(f, 2); conv[2] = (f >= 0 && f < 10) ? ' ' : MINUSOR(i, DIGIMOD(i, 1000)); @@ -230,7 +230,7 @@ const char* ftostr42_52(const float &f) { } // Convert signed float to fixed-length string with 023.45 / -23.45 format -const char* ftostr52(const float &f) { +const char* ftostr52(const_float_t f) { long i = INTFLOAT(f, 2); conv[1] = MINUSOR(i, DIGIMOD(i, 10000)); conv[2] = DIGIMOD(i, 1000); @@ -242,7 +242,7 @@ const char* ftostr52(const float &f) { } // Convert signed float to fixed-length string with 12.345 / _2.345 / -2.345 or -23.45 / 123.45 format -const char* ftostr53_63(const float &f) { +const char* ftostr53_63(const_float_t f) { if (f <= -10 || f >= 100) return ftostr63(f); // -23.456 / 123.456 long i = INTFLOAT(f, 3); conv[1] = (f >= 0 && f < 10) ? ' ' : MINUSOR(i, DIGIMOD(i, 10000)); @@ -255,7 +255,7 @@ const char* ftostr53_63(const float &f) { } // Convert signed float to fixed-length string with 023.456 / -23.456 format -const char* ftostr63(const float &f) { +const char* ftostr63(const_float_t f) { long i = INTFLOAT(f, 3); conv[0] = MINUSOR(i, DIGIMOD(i, 100000)); conv[1] = DIGIMOD(i, 10000); @@ -270,7 +270,7 @@ const char* ftostr63(const float &f) { #if ENABLED(LCD_DECIMAL_SMALL_XY) // Convert float to rj string with 1234, _123, -123, _-12, 12.3, _1.2, or -1.2 format - const char* ftostr4sign(const float &f) { + const char* ftostr4sign(const_float_t f) { const int i = INTFLOAT(f, 1); if (!WITHIN(i, -99, 999)) return i16tostr4signrj((int)f); const bool neg = i < 0; @@ -285,7 +285,7 @@ const char* ftostr63(const float &f) { #endif // Convert float to fixed-length string with +12.3 / -12.3 format -const char* ftostr31sign(const float &f) { +const char* ftostr31sign(const_float_t f) { int i = INTFLOAT(f, 1); conv[2] = MINUSOR(i, '+'); conv[3] = DIGIMOD(i, 100); @@ -296,7 +296,7 @@ const char* ftostr31sign(const float &f) { } // Convert float to fixed-length string with +123.4 / -123.4 format -const char* ftostr41sign(const float &f) { +const char* ftostr41sign(const_float_t f) { int i = INTFLOAT(f, 1); conv[1] = MINUSOR(i, '+'); conv[2] = DIGIMOD(i, 1000); @@ -308,7 +308,7 @@ const char* ftostr41sign(const float &f) { } // Convert signed float to string (6 digit) with -1.234 / _0.000 / +1.234 format -const char* ftostr43sign(const float &f, char plus/*=' '*/) { +const char* ftostr43sign(const_float_t f, char plus/*=' '*/) { long i = INTFLOAT(f, 3); conv[1] = i ? MINUSOR(i, plus) : ' '; conv[2] = DIGIMOD(i, 1000); @@ -320,7 +320,7 @@ const char* ftostr43sign(const float &f, char plus/*=' '*/) { } // Convert signed float to string (5 digit) with -1.2345 / _0.0000 / +1.2345 format -const char* ftostr54sign(const float &f, char plus/*=' '*/) { +const char* ftostr54sign(const_float_t f, char plus/*=' '*/) { long i = INTFLOAT(f, 4); conv[0] = i ? MINUSOR(i, plus) : ' '; conv[1] = DIGIMOD(i, 10000); @@ -333,13 +333,13 @@ const char* ftostr54sign(const float &f, char plus/*=' '*/) { } // Convert unsigned float to rj string with 12345 format -const char* ftostr5rj(const float &f) { +const char* ftostr5rj(const_float_t f) { const long i = UINTFLOAT(f, 0); return ui16tostr5rj(i); } // Convert signed float to string with +1234.5 format -const char* ftostr51sign(const float &f) { +const char* ftostr51sign(const_float_t f) { long i = INTFLOAT(f, 1); conv[0] = MINUSOR(i, '+'); conv[1] = DIGIMOD(i, 10000); @@ -352,7 +352,7 @@ const char* ftostr51sign(const float &f) { } // Convert signed float to string with +123.45 format -const char* ftostr52sign(const float &f) { +const char* ftostr52sign(const_float_t f) { long i = INTFLOAT(f, 2); conv[0] = MINUSOR(i, '+'); conv[1] = DIGIMOD(i, 10000); @@ -365,7 +365,7 @@ const char* ftostr52sign(const float &f) { } // Convert signed float to string with +12.345 format -const char* ftostr53sign(const float &f) { +const char* ftostr53sign(const_float_t f) { long i = INTFLOAT(f, 3); conv[0] = MINUSOR(i, '+'); conv[1] = DIGIMOD(i, 10000); @@ -378,7 +378,7 @@ const char* ftostr53sign(const float &f) { } // Convert unsigned float to string with ____4.5, __34.5, _234.5, 1234.5 format -const char* ftostr51rj(const float &f) { +const char* ftostr51rj(const_float_t f) { const long i = UINTFLOAT(f, 1); conv[0] = ' '; conv[1] = RJDIGIT(i, 10000); @@ -391,7 +391,7 @@ const char* ftostr51rj(const float &f) { } // Convert signed float to space-padded string with -_23.4_ format -const char* ftostr52sp(const float &f) { +const char* ftostr52sp(const_float_t f) { long i = INTFLOAT(f, 2); uint8_t dig; conv[0] = MINUSOR(i, ' '); diff --git a/Marlin/src/libs/numtostr.h b/Marlin/src/libs/numtostr.h index 54cebab252..b058f3cdf6 100644 --- a/Marlin/src/libs/numtostr.h +++ b/Marlin/src/libs/numtostr.h @@ -21,7 +21,8 @@ */ #pragma once -#include +#include "../inc/MarlinConfigPre.h" +#include "../core/types.h" // Format uint8_t (0-100) as rj string with 123% / _12% / __1% format const char* pcttostrpctrj(const uint8_t i); @@ -62,70 +63,66 @@ const char* i16tostr3left(const int16_t xx); const char* i16tostr4signrj(const int16_t x); // Convert unsigned float to string with 1.2 format -const char* ftostr11ns(const float &x); +const char* ftostr11ns(const_float_t x); // Convert unsigned float to string with 1.23 format -const char* ftostr12ns(const float &x); +const char* ftostr12ns(const_float_t x); // Convert unsigned float to string with 12.3 format -const char* ftostr31ns(const float &x); +const char* ftostr31ns(const_float_t x); // Convert unsigned float to string with 123.4 format -const char* ftostr41ns(const float &x); +const char* ftostr41ns(const_float_t x); // Convert signed float to fixed-length string with 12.34 / _2.34 / -2.34 or -23.45 / 123.45 format -const char* ftostr42_52(const float &x); +const char* ftostr42_52(const_float_t x); // Convert signed float to fixed-length string with 023.45 / -23.45 format -const char* ftostr52(const float &x); +const char* ftostr52(const_float_t x); // Convert signed float to fixed-length string with 12.345 / -2.345 or 023.456 / -23.456 format -const char* ftostr53_63(const float &x); +const char* ftostr53_63(const_float_t x); // Convert signed float to fixed-length string with 023.456 / -23.456 format -const char* ftostr63(const float &x); +const char* ftostr63(const_float_t x); // Convert float to fixed-length string with +12.3 / -12.3 format -const char* ftostr31sign(const float &x); +const char* ftostr31sign(const_float_t x); // Convert float to fixed-length string with +123.4 / -123.4 format -const char* ftostr41sign(const float &x); +const char* ftostr41sign(const_float_t x); // Convert signed float to string (6 digit) with -1.234 / _0.000 / +1.234 format -const char* ftostr43sign(const float &x, char plus=' '); +const char* ftostr43sign(const_float_t x, char plus=' '); // Convert signed float to string (5 digit) with -1.2345 / _0.0000 / +1.2345 format -const char* ftostr54sign(const float &x, char plus=' '); +const char* ftostr54sign(const_float_t x, char plus=' '); // Convert unsigned float to rj string with 12345 format -const char* ftostr5rj(const float &x); +const char* ftostr5rj(const_float_t x); // Convert signed float to string with +1234.5 format -const char* ftostr51sign(const float &x); +const char* ftostr51sign(const_float_t x); // Convert signed float to space-padded string with -_23.4_ format -const char* ftostr52sp(const float &x); +const char* ftostr52sp(const_float_t x); // Convert signed float to string with +123.45 format -const char* ftostr52sign(const float &x); +const char* ftostr52sign(const_float_t x); // Convert signed float to string with +12.345 format -const char* ftostr53sign(const float &f); +const char* ftostr53sign(const_float_t f); // Convert unsigned float to string with 1234.5 format omitting trailing zeros -const char* ftostr51rj(const float &x); - -#include "../core/macros.h" +const char* ftostr51rj(const_float_t x); // Convert float to rj string with 123 or -12 format -FORCE_INLINE const char* ftostr3(const float &x) { return i16tostr3rj(int16_t(x + (x < 0 ? -0.5f : 0.5f))); } - -#include "../inc/MarlinConfigPre.h" +FORCE_INLINE const char* ftostr3(const_float_t x) { return i16tostr3rj(int16_t(x + (x < 0 ? -0.5f : 0.5f))); } #if ENABLED(LCD_DECIMAL_SMALL_XY) // Convert float to rj string with 1234, _123, 12.3, _1.2, -123, _-12, or -1.2 format - const char* ftostr4sign(const float &fx); + const char* ftostr4sign(const_float_t fx); #else // Convert float to rj string with 1234, _123, -123, __12, _-12, ___1, or __-1 format - FORCE_INLINE const char* ftostr4sign(const float &x) { return i16tostr4signrj(int16_t(x + (x < 0 ? -0.5f : 0.5f))); } + FORCE_INLINE const char* ftostr4sign(const_float_t x) { return i16tostr4signrj(int16_t(x + (x < 0 ? -0.5f : 0.5f))); } #endif diff --git a/Marlin/src/libs/vector_3.h b/Marlin/src/libs/vector_3.h index 764e10accb..5ce5914961 100644 --- a/Marlin/src/libs/vector_3.h +++ b/Marlin/src/libs/vector_3.h @@ -45,7 +45,7 @@ class matrix_3x3; struct vector_3 : xyz_float_t { - vector_3(const float &_x, const float &_y, const float &_z) { set(_x, _y, _z); } + vector_3(const_float_t _x, const_float_t _y, const_float_t _z) { set(_x, _y, _z); } vector_3(const xy_float_t &in) { set(in.x, in.y); } vector_3(const xyz_float_t &in) { set(in.x, in.y, in.z); } vector_3(const xyze_float_t &in) { set(in.x, in.y, in.z); } diff --git a/Marlin/src/module/delta.cpp b/Marlin/src/module/delta.cpp index 2312e1a012..6ba9f4e9f2 100644 --- a/Marlin/src/module/delta.cpp +++ b/Marlin/src/module/delta.cpp @@ -177,7 +177,7 @@ float delta_safe_distance_from_top() { * * The result is stored in the cartes[] array. */ -void forward_kinematics(const float &z1, const float &z2, const float &z3) { +void forward_kinematics(const_float_t z1, const_float_t z2, const_float_t z3) { // Create a vector in old coordinates along x axis of new coordinate const float p12[3] = { delta_tower[B_AXIS].x - delta_tower[A_AXIS].x, delta_tower[B_AXIS].y - delta_tower[A_AXIS].y, z2 - z1 }, diff --git a/Marlin/src/module/delta.h b/Marlin/src/module/delta.h index 9caec53028..308e206700 100644 --- a/Marlin/src/module/delta.h +++ b/Marlin/src/module/delta.h @@ -120,7 +120,7 @@ float delta_safe_distance_from_top(); * * The result is stored in the cartes[] array. */ -void forward_kinematics(const float &z1, const float &z2, const float &z3); +void forward_kinematics(const_float_t z1, const_float_t z2, const_float_t z3); FORCE_INLINE void forward_kinematics(const abc_float_t &point) { forward_kinematics(point.a, point.b, point.c); diff --git a/Marlin/src/module/motion.cpp b/Marlin/src/module/motion.cpp index 28ad9cf761..81c3a81fbe 100644 --- a/Marlin/src/module/motion.cpp +++ b/Marlin/src/module/motion.cpp @@ -311,12 +311,12 @@ void set_current_from_steppers_for_axis(const AxisEnum axis) { * Move the planner to the current position from wherever it last moved * (or from wherever it has been told it is located). */ -void line_to_current_position(const feedRate_t &fr_mm_s/*=feedrate_mm_s*/) { +void line_to_current_position(const_feedRate_t fr_mm_s/*=feedrate_mm_s*/) { planner.buffer_line(current_position, fr_mm_s, active_extruder); } #if EXTRUDERS - void unscaled_e_move(const float &length, const feedRate_t &fr_mm_s) { + void unscaled_e_move(const_float_t length, const_feedRate_t fr_mm_s) { TERN_(HAS_FILAMENT_SENSOR, runout.reset()); current_position.e += length / planner.e_factor[active_extruder]; line_to_current_position(fr_mm_s); @@ -329,7 +329,7 @@ void line_to_current_position(const feedRate_t &fr_mm_s/*=feedrate_mm_s*/) { /** * Buffer a fast move without interpolation. Set current_position to destination */ - void prepare_fast_move_to_destination(const feedRate_t &scaled_fr_mm_s/*=MMS_SCALED(feedrate_mm_s)*/) { + void prepare_fast_move_to_destination(const_feedRate_t scaled_fr_mm_s/*=MMS_SCALED(feedrate_mm_s)*/) { if (DEBUGGING(LEVELING)) DEBUG_POS("prepare_fast_move_to_destination", destination); #if UBL_SEGMENTED @@ -351,7 +351,7 @@ void line_to_current_position(const feedRate_t &fr_mm_s/*=feedrate_mm_s*/) { * - Move at normal speed regardless of feedrate percentage. * - Extrude the specified length regardless of flow percentage. */ -void _internal_move_to_destination(const feedRate_t &fr_mm_s/*=0.0f*/ +void _internal_move_to_destination(const_feedRate_t fr_mm_s/*=0.0f*/ #if IS_KINEMATIC , const bool is_fast/*=false*/ #endif @@ -384,7 +384,7 @@ void _internal_move_to_destination(const feedRate_t &fr_mm_s/*=0.0f*/ /** * Plan a move to (X, Y, Z) and set the current_position */ -void do_blocking_move_to(const float rx, const float ry, const float rz, const feedRate_t &fr_mm_s/*=0.0*/) { +void do_blocking_move_to(const float rx, const float ry, const float rz, const_feedRate_t fr_mm_s/*=0.0*/) { DEBUG_SECTION(log_move, "do_blocking_move_to", DEBUGGING(LEVELING)); if (DEBUGGING(LEVELING)) DEBUG_XYZ("> ", rx, ry, rz); @@ -473,38 +473,38 @@ void do_blocking_move_to(const float rx, const float ry, const float rz, const f planner.synchronize(); } -void do_blocking_move_to(const xy_pos_t &raw, const feedRate_t &fr_mm_s/*=0.0f*/) { +void do_blocking_move_to(const xy_pos_t &raw, const_feedRate_t fr_mm_s/*=0.0f*/) { do_blocking_move_to(raw.x, raw.y, current_position.z, fr_mm_s); } -void do_blocking_move_to(const xyz_pos_t &raw, const feedRate_t &fr_mm_s/*=0.0f*/) { +void do_blocking_move_to(const xyz_pos_t &raw, const_feedRate_t fr_mm_s/*=0.0f*/) { do_blocking_move_to(raw.x, raw.y, raw.z, fr_mm_s); } -void do_blocking_move_to(const xyze_pos_t &raw, const feedRate_t &fr_mm_s/*=0.0f*/) { +void do_blocking_move_to(const xyze_pos_t &raw, const_feedRate_t fr_mm_s/*=0.0f*/) { do_blocking_move_to(raw.x, raw.y, raw.z, fr_mm_s); } -void do_blocking_move_to_x(const float &rx, const feedRate_t &fr_mm_s/*=0.0*/) { +void do_blocking_move_to_x(const_float_t rx, const_feedRate_t fr_mm_s/*=0.0*/) { do_blocking_move_to(rx, current_position.y, current_position.z, fr_mm_s); } -void do_blocking_move_to_y(const float &ry, const feedRate_t &fr_mm_s/*=0.0*/) { +void do_blocking_move_to_y(const_float_t ry, const_feedRate_t fr_mm_s/*=0.0*/) { do_blocking_move_to(current_position.x, ry, current_position.z, fr_mm_s); } -void do_blocking_move_to_z(const float &rz, const feedRate_t &fr_mm_s/*=0.0*/) { +void do_blocking_move_to_z(const_float_t rz, const_feedRate_t fr_mm_s/*=0.0*/) { do_blocking_move_to_xy_z(current_position, rz, fr_mm_s); } -void do_blocking_move_to_xy(const float &rx, const float &ry, const feedRate_t &fr_mm_s/*=0.0*/) { +void do_blocking_move_to_xy(const_float_t rx, const_float_t ry, const_feedRate_t fr_mm_s/*=0.0*/) { do_blocking_move_to(rx, ry, current_position.z, fr_mm_s); } -void do_blocking_move_to_xy(const xy_pos_t &raw, const feedRate_t &fr_mm_s/*=0.0f*/) { +void do_blocking_move_to_xy(const xy_pos_t &raw, const_feedRate_t fr_mm_s/*=0.0f*/) { do_blocking_move_to_xy(raw.x, raw.y, fr_mm_s); } -void do_blocking_move_to_xy_z(const xy_pos_t &raw, const float &z, const feedRate_t &fr_mm_s/*=0.0f*/) { +void do_blocking_move_to_xy_z(const xy_pos_t &raw, const_float_t z, const_feedRate_t fr_mm_s/*=0.0f*/) { do_blocking_move_to(raw.x, raw.y, z, fr_mm_s); } -void do_z_clearance(const float &zclear, const bool lower_allowed/*=false*/) { +void do_z_clearance(const_float_t zclear, const bool lower_allowed/*=false*/) { float zdest = zclear; if (!lower_allowed) NOLESS(zdest, current_position.z); do_blocking_move_to_z(_MIN(zdest, Z_MAX_POS), TERN(HAS_BED_PROBE, z_probe_fast_mm_s, homing_feedrate(Z_AXIS))); @@ -826,7 +826,7 @@ FORCE_INLINE void segment_idle(millis_t &next_idle_ms) { * small incremental moves. This allows the planner to * apply more detailed bed leveling to the full move. */ - inline void segmented_line_to_destination(const feedRate_t &fr_mm_s, const float segment_size=LEVELED_SEGMENT_LENGTH) { + inline void segmented_line_to_destination(const_feedRate_t fr_mm_s, const float segment_size=LEVELED_SEGMENT_LENGTH) { const xyze_float_t diff = destination - current_position; diff --git a/Marlin/src/module/motion.h b/Marlin/src/module/motion.h index 7b8d2f2018..2cfc8406a5 100644 --- a/Marlin/src/module/motion.h +++ b/Marlin/src/module/motion.h @@ -229,28 +229,28 @@ void sync_plan_position_e(); * Move the planner to the current position from wherever it last moved * (or from wherever it has been told it is located). */ -void line_to_current_position(const feedRate_t &fr_mm_s=feedrate_mm_s); +void line_to_current_position(const_feedRate_t fr_mm_s=feedrate_mm_s); #if EXTRUDERS - void unscaled_e_move(const float &length, const feedRate_t &fr_mm_s); + void unscaled_e_move(const_float_t length, const_feedRate_t fr_mm_s); #endif void prepare_line_to_destination(); -void _internal_move_to_destination(const feedRate_t &fr_mm_s=0.0f +void _internal_move_to_destination(const_feedRate_t fr_mm_s=0.0f #if IS_KINEMATIC , const bool is_fast=false #endif ); -inline void prepare_internal_move_to_destination(const feedRate_t &fr_mm_s=0.0f) { +inline void prepare_internal_move_to_destination(const_feedRate_t fr_mm_s=0.0f) { _internal_move_to_destination(fr_mm_s); } #if IS_KINEMATIC - void prepare_fast_move_to_destination(const feedRate_t &scaled_fr_mm_s=MMS_SCALED(feedrate_mm_s)); + void prepare_fast_move_to_destination(const_feedRate_t scaled_fr_mm_s=MMS_SCALED(feedrate_mm_s)); - inline void prepare_internal_fast_move_to_destination(const feedRate_t &fr_mm_s=0.0f) { + inline void prepare_internal_fast_move_to_destination(const_feedRate_t fr_mm_s=0.0f) { _internal_move_to_destination(fr_mm_s, true); } #endif @@ -258,29 +258,29 @@ inline void prepare_internal_move_to_destination(const feedRate_t &fr_mm_s=0.0f) /** * Blocking movement and shorthand functions */ -void do_blocking_move_to(const float rx, const float ry, const float rz, const feedRate_t &fr_mm_s=0.0f); -void do_blocking_move_to(const xy_pos_t &raw, const feedRate_t &fr_mm_s=0.0f); -void do_blocking_move_to(const xyz_pos_t &raw, const feedRate_t &fr_mm_s=0.0f); -void do_blocking_move_to(const xyze_pos_t &raw, const feedRate_t &fr_mm_s=0.0f); +void do_blocking_move_to(const float rx, const float ry, const float rz, const_feedRate_t fr_mm_s=0.0f); +void do_blocking_move_to(const xy_pos_t &raw, const_feedRate_t fr_mm_s=0.0f); +void do_blocking_move_to(const xyz_pos_t &raw, const_feedRate_t fr_mm_s=0.0f); +void do_blocking_move_to(const xyze_pos_t &raw, const_feedRate_t fr_mm_s=0.0f); -void do_blocking_move_to_x(const float &rx, const feedRate_t &fr_mm_s=0.0f); -void do_blocking_move_to_y(const float &ry, const feedRate_t &fr_mm_s=0.0f); -void do_blocking_move_to_z(const float &rz, const feedRate_t &fr_mm_s=0.0f); +void do_blocking_move_to_x(const_float_t rx, const_feedRate_t fr_mm_s=0.0f); +void do_blocking_move_to_y(const_float_t ry, const_feedRate_t fr_mm_s=0.0f); +void do_blocking_move_to_z(const_float_t rz, const_feedRate_t fr_mm_s=0.0f); -void do_blocking_move_to_xy(const float &rx, const float &ry, const feedRate_t &fr_mm_s=0.0f); -void do_blocking_move_to_xy(const xy_pos_t &raw, const feedRate_t &fr_mm_s=0.0f); -FORCE_INLINE void do_blocking_move_to_xy(const xyz_pos_t &raw, const feedRate_t &fr_mm_s=0.0f) { do_blocking_move_to_xy(xy_pos_t(raw), fr_mm_s); } -FORCE_INLINE void do_blocking_move_to_xy(const xyze_pos_t &raw, const feedRate_t &fr_mm_s=0.0f) { do_blocking_move_to_xy(xy_pos_t(raw), fr_mm_s); } +void do_blocking_move_to_xy(const_float_t rx, const_float_t ry, const_feedRate_t fr_mm_s=0.0f); +void do_blocking_move_to_xy(const xy_pos_t &raw, const_feedRate_t fr_mm_s=0.0f); +FORCE_INLINE void do_blocking_move_to_xy(const xyz_pos_t &raw, const_feedRate_t fr_mm_s=0.0f) { do_blocking_move_to_xy(xy_pos_t(raw), fr_mm_s); } +FORCE_INLINE void do_blocking_move_to_xy(const xyze_pos_t &raw, const_feedRate_t fr_mm_s=0.0f) { do_blocking_move_to_xy(xy_pos_t(raw), fr_mm_s); } -void do_blocking_move_to_xy_z(const xy_pos_t &raw, const float &z, const feedRate_t &fr_mm_s=0.0f); -FORCE_INLINE void do_blocking_move_to_xy_z(const xyz_pos_t &raw, const float &z, const feedRate_t &fr_mm_s=0.0f) { do_blocking_move_to_xy_z(xy_pos_t(raw), z, fr_mm_s); } -FORCE_INLINE void do_blocking_move_to_xy_z(const xyze_pos_t &raw, const float &z, const feedRate_t &fr_mm_s=0.0f) { do_blocking_move_to_xy_z(xy_pos_t(raw), z, fr_mm_s); } +void do_blocking_move_to_xy_z(const xy_pos_t &raw, const_float_t z, const_feedRate_t fr_mm_s=0.0f); +FORCE_INLINE void do_blocking_move_to_xy_z(const xyz_pos_t &raw, const_float_t z, const_feedRate_t fr_mm_s=0.0f) { do_blocking_move_to_xy_z(xy_pos_t(raw), z, fr_mm_s); } +FORCE_INLINE void do_blocking_move_to_xy_z(const xyze_pos_t &raw, const_float_t z, const_feedRate_t fr_mm_s=0.0f) { do_blocking_move_to_xy_z(xy_pos_t(raw), z, fr_mm_s); } void remember_feedrate_and_scaling(); void remember_feedrate_scaling_off(); void restore_feedrate_and_scaling(); -void do_z_clearance(const float &zclear, const bool lower_allowed=false); +void do_z_clearance(const_float_t zclear, const bool lower_allowed=false); /** * Homing and Trusted Axes @@ -393,7 +393,7 @@ FORCE_INLINE bool all_axes_trusted() { return xyz_bits == #endif // Return true if the given point is within the printable area - inline bool position_is_reachable(const float &rx, const float &ry, const float inset=0) { + inline bool position_is_reachable(const_float_t rx, const_float_t ry, const float inset=0) { #if ENABLED(DELTA) return HYPOT2(rx, ry) <= sq(DELTA_PRINTABLE_RADIUS - inset + fslop); @@ -428,7 +428,7 @@ FORCE_INLINE bool all_axes_trusted() { return xyz_bits == #else // CARTESIAN // Return true if the given position is within the machine bounds. - inline bool position_is_reachable(const float &rx, const float &ry) { + inline bool position_is_reachable(const_float_t rx, const_float_t ry) { if (!COORDINATE_OKAY(ry, Y_MIN_POS - fslop, Y_MAX_POS + fslop)) return false; #if ENABLED(DUAL_X_CARRIAGE) if (active_extruder) diff --git a/Marlin/src/module/planner.cpp b/Marlin/src/module/planner.cpp index eee1a9f269..891f6a7ab0 100644 --- a/Marlin/src/module/planner.cpp +++ b/Marlin/src/module/planner.cpp @@ -775,7 +775,7 @@ block_t* Planner::get_current_block() { * is not and will not use the block while we modify it, so it is safe to * alter its values. */ -void Planner::calculate_trapezoid_for_block(block_t * const block, const float &entry_factor, const float &exit_factor) { +void Planner::calculate_trapezoid_for_block(block_t * const block, const_float_t entry_factor, const_float_t exit_factor) { uint32_t initial_rate = CEIL(block->nominal_rate * entry_factor), final_rate = CEIL(block->nominal_rate * exit_factor); // (steps per second) @@ -1463,7 +1463,7 @@ void Planner::check_axes_activity() { * This is the reciprocal of the circular cross-section area. * Return 1.0 with volumetric off or a diameter of 0.0. */ - inline float calculate_volumetric_multiplier(const float &diameter) { + inline float calculate_volumetric_multiplier(const_float_t diameter) { return (parser.volumetric_enabled && diameter) ? 1.0f / CIRCLE_AREA(diameter * 0.5f) : 1; } @@ -1745,7 +1745,7 @@ bool Planner::_buffer_steps(const xyze_long_t &target #if HAS_DIST_MM_ARG , const xyze_float_t &cart_dist_mm #endif - , feedRate_t fr_mm_s, const uint8_t extruder, const float &millimeters + , feedRate_t fr_mm_s, const uint8_t extruder, const_float_t millimeters ) { // Wait for the next available block @@ -1811,7 +1811,7 @@ bool Planner::_populate_block(block_t * const block, bool split_move, #if HAS_DIST_MM_ARG , const xyze_float_t &cart_dist_mm #endif - , feedRate_t fr_mm_s, const uint8_t extruder, const float &millimeters/*=0.0*/ + , feedRate_t fr_mm_s, const uint8_t extruder, const_float_t millimeters/*=0.0*/ ) { const int32_t da = target.a - position.a, @@ -2745,11 +2745,11 @@ void Planner::buffer_sync_block(TERN_(LASER_SYNCHRONOUS_M106_M107, uint8_t sync_ * * Return 'false' if no segment was queued due to cleaning, cold extrusion, full queue, etc. */ -bool Planner::buffer_segment(const float &a, const float &b, const float &c, const float &e +bool Planner::buffer_segment(const_float_t a, const_float_t b, const_float_t c, const_float_t e #if HAS_DIST_MM_ARG , const xyze_float_t &cart_dist_mm #endif - , const feedRate_t &fr_mm_s, const uint8_t extruder, const float &millimeters/*=0.0*/ + , const_feedRate_t fr_mm_s, const uint8_t extruder, const_float_t millimeters/*=0.0*/ ) { // If we are cleaning, do not accept queuing of movements @@ -2839,9 +2839,9 @@ bool Planner::buffer_segment(const float &a, const float &b, const float &c, con * millimeters - the length of the movement, if known * inv_duration - the reciprocal if the duration of the movement, if known (kinematic only if feeedrate scaling is enabled) */ -bool Planner::buffer_line(const float &rx, const float &ry, const float &rz, const float &e, const feedRate_t &fr_mm_s, const uint8_t extruder, const float millimeters +bool Planner::buffer_line(const_float_t rx, const_float_t ry, const_float_t rz, const_float_t e, const_feedRate_t fr_mm_s, const uint8_t extruder, const float millimeters #if ENABLED(SCARA_FEEDRATE_SCALING) - , const float &inv_duration + , const_float_t inv_duration #endif ) { xyze_pos_t machine = { rx, ry, rz, e }; @@ -2960,7 +2960,7 @@ bool Planner::buffer_line(const float &rx, const float &ry, const float &rz, con * The provided ABC position is in machine units. */ -void Planner::set_machine_position_mm(const float &a, const float &b, const float &c, const float &e) { +void Planner::set_machine_position_mm(const_float_t a, const_float_t b, const_float_t c, const_float_t e) { TERN_(DISTINCT_E_FACTORS, last_extruder = active_extruder); TERN_(HAS_POSITION_FLOAT, position_float.set(a, b, c, e)); position.set(LROUND(a * settings.axis_steps_per_mm[A_AXIS]), @@ -2976,7 +2976,7 @@ void Planner::set_machine_position_mm(const float &a, const float &b, const floa stepper.set_position(position); } -void Planner::set_position_mm(const float &rx, const float &ry, const float &rz, const float &e) { +void Planner::set_position_mm(const_float_t rx, const_float_t ry, const_float_t rz, const_float_t e) { xyze_pos_t machine = { rx, ry, rz, e }; #if HAS_POSITION_MODIFIERS apply_modifiers(machine, true); @@ -2993,7 +2993,7 @@ void Planner::set_position_mm(const float &rx, const float &ry, const float &rz, /** * Setters for planner position (also setting stepper position). */ -void Planner::set_e_position_mm(const float &e) { +void Planner::set_e_position_mm(const_float_t e) { const uint8_t axis_index = E_AXIS_N(active_extruder); TERN_(DISTINCT_E_FACTORS, last_extruder = active_extruder); diff --git a/Marlin/src/module/planner.h b/Marlin/src/module/planner.h index 768bf29e2f..6b99c8bcc1 100644 --- a/Marlin/src/module/planner.h +++ b/Marlin/src/module/planner.h @@ -491,7 +491,7 @@ class Planner { #if HAS_CLASSIC_JERK static void set_max_jerk(const AxisEnum axis, float inMaxJerkMMS); #else - static inline void set_max_jerk(const AxisEnum, const float&) {} + static inline void set_max_jerk(const AxisEnum, const_float_t ) {} #endif #if EXTRUDERS @@ -541,7 +541,7 @@ class Planner { static void calculate_volumetric_extruder_limits(); #endif - FORCE_INLINE static void set_filament_size(const uint8_t e, const float &v) { + FORCE_INLINE static void set_filament_size(const uint8_t e, const_float_t v) { filament_size[e] = v; if (v > 0) volumetric_area_nominal = CIRCLE_AREA(v * 0.5); //TODO: should it be per extruder // make sure all extruders have some sane value for the filament size @@ -552,7 +552,7 @@ class Planner { #endif #if ENABLED(VOLUMETRIC_EXTRUDER_LIMIT) - FORCE_INLINE static void set_volumetric_extruder_limit(const uint8_t e, const float &v) { + FORCE_INLINE static void set_volumetric_extruder_limit(const uint8_t e, const_float_t v) { volumetric_extruder_limit[e] = v; calculate_volumetric_extruder_limit(e); } @@ -567,7 +567,7 @@ class Planner { * Returns 1.0 if planner.z_fade_height is 0.0. * Returns 0.0 if Z is past the specified 'Fade Height'. */ - static inline float fade_scaling_factor_for_z(const float &rz) { + static inline float fade_scaling_factor_for_z(const_float_t rz) { static float z_fade_factor = 1; if (!z_fade_height) return 1; if (rz >= z_fade_height) return 0; @@ -580,27 +580,27 @@ class Planner { FORCE_INLINE static void force_fade_recalc() { last_fade_z = -999.999f; } - FORCE_INLINE static void set_z_fade_height(const float &zfh) { + FORCE_INLINE static void set_z_fade_height(const_float_t zfh) { z_fade_height = zfh > 0 ? zfh : 0; inverse_z_fade_height = RECIPROCAL(z_fade_height); force_fade_recalc(); } - FORCE_INLINE static bool leveling_active_at_z(const float &rz) { + FORCE_INLINE static bool leveling_active_at_z(const_float_t rz) { return !z_fade_height || rz < z_fade_height; } #else - FORCE_INLINE static float fade_scaling_factor_for_z(const float&) { return 1; } + FORCE_INLINE static float fade_scaling_factor_for_z(const_float_t ) { return 1; } - FORCE_INLINE static bool leveling_active_at_z(const float&) { return true; } + FORCE_INLINE static bool leveling_active_at_z(const_float_t ) { return true; } #endif #if ENABLED(SKEW_CORRECTION) - FORCE_INLINE static void skew(float &cx, float &cy, const float &cz) { + FORCE_INLINE static void skew(float &cx, float &cy, const_float_t cz) { if (COORDINATE_OKAY(cx, X_MIN_POS + 1, X_MAX_POS) && COORDINATE_OKAY(cy, Y_MIN_POS + 1, Y_MAX_POS)) { const float sx = cx - cy * skew_factor.xy - cz * (skew_factor.xz - (skew_factor.xy * skew_factor.yz)), sy = cy - cz * skew_factor.yz; @@ -611,7 +611,7 @@ class Planner { } FORCE_INLINE static void skew(xyz_pos_t &raw) { skew(raw.x, raw.y, raw.z); } - FORCE_INLINE static void unskew(float &cx, float &cy, const float &cz) { + FORCE_INLINE static void unskew(float &cx, float &cy, const_float_t cz) { if (COORDINATE_OKAY(cx, X_MIN_POS, X_MAX_POS) && COORDINATE_OKAY(cy, Y_MIN_POS, Y_MAX_POS)) { const float sx = cx + cy * skew_factor.xy + cz * skew_factor.xz, sy = cy + cz * skew_factor.yz; @@ -713,7 +713,7 @@ class Planner { #if HAS_DIST_MM_ARG , const xyze_float_t &cart_dist_mm #endif - , feedRate_t fr_mm_s, const uint8_t extruder, const float &millimeters=0.0 + , feedRate_t fr_mm_s, const uint8_t extruder, const_float_t millimeters=0.0 ); /** @@ -736,7 +736,7 @@ class Planner { #if HAS_DIST_MM_ARG , const xyze_float_t &cart_dist_mm #endif - , feedRate_t fr_mm_s, const uint8_t extruder, const float &millimeters=0.0 + , feedRate_t fr_mm_s, const uint8_t extruder, const_float_t millimeters=0.0 ); /** @@ -767,18 +767,18 @@ class Planner { * extruder - target extruder * millimeters - the length of the movement, if known */ - static bool buffer_segment(const float &a, const float &b, const float &c, const float &e + static bool buffer_segment(const_float_t a, const_float_t b, const_float_t c, const_float_t e #if HAS_DIST_MM_ARG , const xyze_float_t &cart_dist_mm #endif - , const feedRate_t &fr_mm_s, const uint8_t extruder, const float &millimeters=0.0 + , const_feedRate_t fr_mm_s, const uint8_t extruder, const_float_t millimeters=0.0 ); FORCE_INLINE static bool buffer_segment(abce_pos_t &abce #if HAS_DIST_MM_ARG , const xyze_float_t &cart_dist_mm #endif - , const feedRate_t &fr_mm_s, const uint8_t extruder, const float &millimeters=0.0 + , const_feedRate_t fr_mm_s, const uint8_t extruder, const_float_t millimeters=0.0 ) { return buffer_segment(abce.a, abce.b, abce.c, abce.e #if HAS_DIST_MM_ARG @@ -800,15 +800,15 @@ class Planner { * millimeters - the length of the movement, if known * inv_duration - the reciprocal if the duration of the movement, if known (kinematic only if feeedrate scaling is enabled) */ - static bool buffer_line(const float &rx, const float &ry, const float &rz, const float &e, const feedRate_t &fr_mm_s, const uint8_t extruder, const float millimeters=0.0 + static bool buffer_line(const_float_t rx, const_float_t ry, const_float_t rz, const_float_t e, const_feedRate_t fr_mm_s, const uint8_t extruder, const float millimeters=0.0 #if ENABLED(SCARA_FEEDRATE_SCALING) - , const float &inv_duration=0.0 + , const_float_t inv_duration=0.0 #endif ); - FORCE_INLINE static bool buffer_line(const xyze_pos_t &cart, const feedRate_t &fr_mm_s, const uint8_t extruder, const float millimeters=0.0 + FORCE_INLINE static bool buffer_line(const xyze_pos_t &cart, const_feedRate_t fr_mm_s, const uint8_t extruder, const float millimeters=0.0 #if ENABLED(SCARA_FEEDRATE_SCALING) - , const float &inv_duration=0.0 + , const_float_t inv_duration=0.0 #endif ) { return buffer_line(cart.x, cart.y, cart.z, cart.e, fr_mm_s, extruder, millimeters @@ -835,9 +835,9 @@ class Planner { * * Clears previous speed values. */ - static void set_position_mm(const float &rx, const float &ry, const float &rz, const float &e); + static void set_position_mm(const_float_t rx, const_float_t ry, const_float_t rz, const_float_t e); FORCE_INLINE static void set_position_mm(const xyze_pos_t &cart) { set_position_mm(cart.x, cart.y, cart.z, cart.e); } - static void set_e_position_mm(const float &e); + static void set_e_position_mm(const_float_t e); /** * Set the planner.position and individual stepper positions. @@ -845,7 +845,7 @@ class Planner { * The supplied position is in machine space, and no additional * conversions are applied. */ - static void set_machine_position_mm(const float &a, const float &b, const float &c, const float &e); + static void set_machine_position_mm(const_float_t a, const_float_t b, const_float_t c, const_float_t e); FORCE_INLINE static void set_machine_position_mm(const abce_pos_t &abce) { set_machine_position_mm(abce.a, abce.b, abce.c, abce.e); } /** @@ -957,7 +957,7 @@ class Planner { * Calculate the distance (not time) it takes to accelerate * from initial_rate to target_rate using the given acceleration: */ - static float estimate_acceleration_distance(const float &initial_rate, const float &target_rate, const float &accel) { + static float estimate_acceleration_distance(const_float_t initial_rate, const_float_t target_rate, const_float_t accel) { if (accel == 0) return 0; // accel was 0, set acceleration distance to 0 return (sq(target_rate) - sq(initial_rate)) / (accel * 2); } @@ -970,7 +970,7 @@ class Planner { * This is used to compute the intersection point between acceleration and deceleration * in cases where the "trapezoid" has no plateau (i.e., never reaches maximum speed) */ - static float intersection_distance(const float &initial_rate, const float &final_rate, const float &accel, const float &distance) { + static float intersection_distance(const_float_t initial_rate, const_float_t final_rate, const_float_t accel, const_float_t distance) { if (accel == 0) return 0; // accel was 0, set intersection distance to 0 return (accel * 2 * distance - sq(initial_rate) + sq(final_rate)) / (accel * 4); } @@ -980,7 +980,7 @@ class Planner { * to reach 'target_velocity_sqr' using 'acceleration' within a given * 'distance'. */ - static float max_allowable_speed_sqr(const float &accel, const float &target_velocity_sqr, const float &distance) { + static float max_allowable_speed_sqr(const_float_t accel, const_float_t target_velocity_sqr, const_float_t distance) { return target_velocity_sqr - 2 * accel * distance; } @@ -988,12 +988,12 @@ class Planner { /** * Calculate the speed reached given initial speed, acceleration and distance */ - static float final_speed(const float &initial_velocity, const float &accel, const float &distance) { + static float final_speed(const_float_t initial_velocity, const_float_t accel, const_float_t distance) { return SQRT(sq(initial_velocity) + 2 * accel * distance); } #endif - static void calculate_trapezoid_for_block(block_t * const block, const float &entry_factor, const float &exit_factor); + static void calculate_trapezoid_for_block(block_t * const block, const_float_t entry_factor, const_float_t exit_factor); static void reverse_pass_kernel(block_t * const current, const block_t * const next); static void forward_pass_kernel(const block_t * const previous, block_t * const current, uint8_t block_index); @@ -1013,7 +1013,7 @@ class Planner { vector *= RSQRT(magnitude_sq); } - FORCE_INLINE static float limit_value_by_axis_maximum(const float &max_value, xyze_float_t &unit_vec) { + FORCE_INLINE static float limit_value_by_axis_maximum(const_float_t max_value, xyze_float_t &unit_vec) { float limit_value = max_value; LOOP_XYZE(idx) { if (unit_vec[idx]) { diff --git a/Marlin/src/module/planner_bezier.cpp b/Marlin/src/module/planner_bezier.cpp index 02d878d5f5..be5ce4bbb4 100644 --- a/Marlin/src/module/planner_bezier.cpp +++ b/Marlin/src/module/planner_bezier.cpp @@ -43,7 +43,7 @@ #define SIGMA 0.1f // Compute the linear interpolation between two real numbers. -static inline float interp(const float &a, const float &b, const float &t) { return (1 - t) * a + t * b; } +static inline float interp(const_float_t a, const_float_t b, const_float_t t) { return (1 - t) * a + t * b; } /** * Compute a Bézier curve using the De Casteljau's algorithm (see @@ -51,7 +51,7 @@ static inline float interp(const float &a, const float &b, const float &t) { ret * easy to code and has good numerical stability (very important, * since Arudino works with limited precision real numbers). */ -static inline float eval_bezier(const float &a, const float &b, const float &c, const float &d, const float &t) { +static inline float eval_bezier(const_float_t a, const_float_t b, const_float_t c, const_float_t d, const_float_t t) { const float iab = interp(a, b, t), ibc = interp(b, c, t), icd = interp(c, d, t), @@ -64,7 +64,7 @@ static inline float eval_bezier(const float &a, const float &b, const float &c, * We approximate Euclidean distance with the sum of the coordinates * offset (so-called "norm 1"), which is quicker to compute. */ -static inline float dist1(const float &x1, const float &y1, const float &x2, const float &y2) { return ABS(x1 - x2) + ABS(y1 - y2); } +static inline float dist1(const_float_t x1, const_float_t y1, const_float_t x2, const_float_t y2) { return ABS(x1 - x2) + ABS(y1 - y2); } /** * The algorithm for computing the step is loosely based on the one in Kig @@ -109,7 +109,7 @@ void cubic_b_spline( const xyze_pos_t &position, // current position const xyze_pos_t &target, // target position const xy_pos_t (&offsets)[2], // a pair of offsets - const feedRate_t &scaled_fr_mm_s, // mm/s scaled by feedrate % + const_feedRate_t scaled_fr_mm_s, // mm/s scaled by feedrate % const uint8_t extruder ) { // Absolute first and second control points are recovered. diff --git a/Marlin/src/module/planner_bezier.h b/Marlin/src/module/planner_bezier.h index 72048c4273..eb48cf5e1a 100644 --- a/Marlin/src/module/planner_bezier.h +++ b/Marlin/src/module/planner_bezier.h @@ -33,6 +33,6 @@ void cubic_b_spline( const xyze_pos_t &position, // current position const xyze_pos_t &target, // target position const xy_pos_t (&offsets)[2], // a pair of offsets - const feedRate_t &scaled_fr_mm_s, // mm/s scaled by feedrate % + const_feedRate_t scaled_fr_mm_s, // mm/s scaled by feedrate % const uint8_t extruder ); diff --git a/Marlin/src/module/probe.cpp b/Marlin/src/module/probe.cpp index 28c89e7a00..d4b8409efa 100644 --- a/Marlin/src/module/probe.cpp +++ b/Marlin/src/module/probe.cpp @@ -475,7 +475,7 @@ bool Probe::set_deployed(const bool deploy) { * * @return TRUE if the probe failed to trigger. */ -bool Probe::probe_down_to_z(const float z, const feedRate_t fr_mm_s) { +bool Probe::probe_down_to_z(const_float_t z, const_feedRate_t fr_mm_s) { DEBUG_SECTION(log_probe, "Probe::probe_down_to_z", DEBUGGING(LEVELING)); #if BOTH(HAS_HEATED_BED, WAIT_FOR_BED_HEATER) @@ -588,7 +588,7 @@ bool Probe::probe_down_to_z(const float z, const feedRate_t fr_mm_s) { float Probe::run_z_probe(const bool sanity_check/*=true*/) { DEBUG_SECTION(log_probe, "Probe::run_z_probe", DEBUGGING(LEVELING)); - auto try_to_probe = [&](PGM_P const plbl, const float &z_probe_low_point, const feedRate_t fr_mm_s, const bool scheck, const float clearance) -> bool { + auto try_to_probe = [&](PGM_P const plbl, const_float_t z_probe_low_point, const feedRate_t fr_mm_s, const bool scheck, const float clearance) -> bool { // Tare the probe, if supported if (TERN0(PROBE_TARE, tare())) return true; @@ -743,7 +743,7 @@ float Probe::run_z_probe(const bool sanity_check/*=true*/) { * - Raise to the BETWEEN height * - Return the probed Z position */ -float Probe::probe_at_point(const float &rx, const float &ry, const ProbePtRaise raise_after/*=PROBE_PT_NONE*/, const uint8_t verbose_level/*=0*/, const bool probe_relative/*=true*/, const bool sanity_check/*=true*/) { +float Probe::probe_at_point(const_float_t rx, const_float_t ry, const ProbePtRaise raise_after/*=PROBE_PT_NONE*/, const uint8_t verbose_level/*=0*/, const bool probe_relative/*=true*/, const bool sanity_check/*=true*/) { DEBUG_SECTION(log_probe, "Probe::probe_at_point", DEBUGGING(LEVELING)); if (DEBUGGING(LEVELING)) { diff --git a/Marlin/src/module/probe.h b/Marlin/src/module/probe.h index b54bf00f00..d8272c31b6 100644 --- a/Marlin/src/module/probe.h +++ b/Marlin/src/module/probe.h @@ -71,12 +71,12 @@ public: #if HAS_PROBE_XY_OFFSET // Return true if the both nozzle and the probe can reach the given point. // Note: This won't work on SCARA since the probe offset rotates with the arm. - static bool can_reach(const float &rx, const float &ry) { + static bool can_reach(const_float_t rx, const_float_t ry) { return position_is_reachable(rx - offset_xy.x, ry - offset_xy.y) // The nozzle can go where it needs to go? && position_is_reachable(rx, ry, ABS(PROBING_MARGIN)); // Can the nozzle also go near there? } #else - static bool can_reach(const float &rx, const float &ry) { + static bool can_reach(const_float_t rx, const_float_t ry) { return position_is_reachable(rx, ry, PROBING_MARGIN); } #endif @@ -90,7 +90,7 @@ public: * Example: For a probe offset of -10,+10, then for the probe to reach 0,0 the * nozzle must be be able to reach +10,-10. */ - static bool can_reach(const float &rx, const float &ry) { + static bool can_reach(const_float_t rx, const_float_t ry) { return position_is_reachable(rx - offset_xy.x, ry - offset_xy.y) && COORDINATE_OKAY(rx, min_x() - fslop, max_x() + fslop) && COORDINATE_OKAY(ry, min_y() - fslop, max_y() + fslop); @@ -103,7 +103,7 @@ public: do_z_clearance(Z_AFTER_PROBING, true); // Move down still permitted #endif } - static float probe_at_point(const float &rx, const float &ry, const ProbePtRaise raise_after=PROBE_PT_NONE, const uint8_t verbose_level=0, const bool probe_relative=true, const bool sanity_check=true); + static float probe_at_point(const_float_t rx, const_float_t ry, const ProbePtRaise raise_after=PROBE_PT_NONE, const uint8_t verbose_level=0, const bool probe_relative=true, const bool sanity_check=true); static float probe_at_point(const xy_pos_t &pos, const ProbePtRaise raise_after=PROBE_PT_NONE, const uint8_t verbose_level=0, const bool probe_relative=true, const bool sanity_check=true) { return probe_at_point(pos.x, pos.y, raise_after, verbose_level, probe_relative, sanity_check); } @@ -114,7 +114,7 @@ public: static bool set_deployed(const bool) { return false; } - static bool can_reach(const float &rx, const float &ry) { return position_is_reachable(rx, ry); } + static bool can_reach(const_float_t rx, const_float_t ry) { return position_is_reachable(rx, ry); } #endif @@ -257,7 +257,7 @@ public: #endif private: - static bool probe_down_to_z(const float z, const feedRate_t fr_mm_s); + static bool probe_down_to_z(const_float_t z, const_feedRate_t fr_mm_s); static void do_z_raise(const float z_raise); static float run_z_probe(const bool sanity_check=true); }; diff --git a/Marlin/src/module/scara.cpp b/Marlin/src/module/scara.cpp index 1767e230c1..d02136039a 100644 --- a/Marlin/src/module/scara.cpp +++ b/Marlin/src/module/scara.cpp @@ -48,7 +48,7 @@ float segments_per_second = TERN(AXEL_TPARA, TPARA_SEGMENTS_PER_SECOND, SCARA_SE * Maths and first version by QHARLEY. * Integrated into Marlin and slightly restructured by Joachim Cerny. */ - void forward_kinematics(const float &a, const float &b) { + void forward_kinematics(const_float_t a, const_float_t b) { const float a_sin = sin(RADIANS(a)) * L1, a_cos = cos(RADIANS(a)) * L1, b_sin = sin(RADIANS(b + TERN0(MP_SCARA, a))) * L2, @@ -197,7 +197,7 @@ float segments_per_second = TERN(AXEL_TPARA, TPARA_SEGMENTS_PER_SECOND, SCARA_SE } // Convert ABC inputs in degrees to XYZ outputs in mm - void forward_kinematics(const float &a, const float &b, const float &c) { + void forward_kinematics(const_float_t a, const_float_t b, const_float_t c) { const float w = c - b, r = L1 * cos(RADIANS(b)) + L2 * sin(RADIANS(w - (90 - b))), x = r * cos(RADIANS(a)), diff --git a/Marlin/src/module/scara.h b/Marlin/src/module/scara.h index d24a4110fd..8ce50e55e1 100644 --- a/Marlin/src/module/scara.h +++ b/Marlin/src/module/scara.h @@ -35,7 +35,7 @@ extern float segments_per_second; L1_2 = sq(float(L1)), L1_2_2 = 2.0 * L1_2, L2_2 = sq(float(L2)); - void forward_kinematics(const float &a, const float &b, const float &c); + void forward_kinematics(const_float_t a, const_float_t b, const_float_t c); void home_TPARA(); #else @@ -44,7 +44,7 @@ extern float segments_per_second; L1_2 = sq(float(L1)), L1_2_2 = 2.0 * L1_2, L2_2 = sq(float(L2)); - void forward_kinematics(const float &a, const float &b); + void forward_kinematics(const_float_t a, const_float_t b); #endif diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 5a8704d3ba..02fe7588d9 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -499,7 +499,7 @@ volatile bool Temperature::raw_temps_ready = false; * Needs sufficient heater power to make some overshoot at target * temperature to succeed. */ - void Temperature::PID_autotune(const float &target, const heater_id_t heater_id, const int8_t ncycles, const bool set_result/*=false*/) { + void Temperature::PID_autotune(const_float_t target, const heater_id_t heater_id, const int8_t ncycles, const bool set_result/*=false*/) { float current_temp = 0.0; int cycles = 0; bool heating = true; @@ -2336,7 +2336,7 @@ void Temperature::init() { * * TODO: Embed the last 3 parameters during init, if not less optimal */ - void Temperature::tr_state_machine_t::run(const float ¤t, const float &target, const heater_id_t heater_id, const uint16_t period_seconds, const celsius_t hysteresis_degc) { + void Temperature::tr_state_machine_t::run(const_float_t current, const_float_t target, const heater_id_t heater_id, const uint16_t period_seconds, const celsius_t hysteresis_degc) { #if HEATER_IDLE_HANDLER // Convert the given heater_id_t to an idle array index @@ -3371,7 +3371,7 @@ void Temperature::tick() { #include "../gcode/gcode.h" - static void print_heater_state(const float &c, const float &t + static void print_heater_state(const_float_t c, const_float_t t #if ENABLED(SHOW_TEMP_ADC_VALUES) , const float r #endif @@ -3804,7 +3804,7 @@ void Temperature::tick() { #define MIN_DELTA_SLOPE_TIME_PROBE 600 #endif - bool Temperature::wait_for_probe(const float target_temp, bool no_wait_for_cooling/*=true*/) { + bool Temperature::wait_for_probe(const_float_t target_temp, bool no_wait_for_cooling/*=true*/) { const bool wants_to_cool = isProbeAboveTemp(target_temp); const bool will_wait = !(wants_to_cool && no_wait_for_cooling); diff --git a/Marlin/src/module/temperature.h b/Marlin/src/module/temperature.h index ec603b5217..92e436c73f 100644 --- a/Marlin/src/module/temperature.h +++ b/Marlin/src/module/temperature.h @@ -688,7 +688,7 @@ class Temperature { return degTargetHotend(e) > TEMP_HYSTERESIS && ABS(degHotend(e) - degTargetHotend(e)) > TEMP_HYSTERESIS; } - FORCE_INLINE static bool degHotendNear(const uint8_t e, const float &temp) { + FORCE_INLINE static bool degHotendNear(const uint8_t e, const_float_t temp) { return ABS(degHotend(e) - temp) < (TEMP_HYSTERESIS); } @@ -724,7 +724,7 @@ class Temperature { static void wait_for_bed_heating(); - FORCE_INLINE static bool degBedNear(const float &temp) { + FORCE_INLINE static bool degBedNear(const_float_t temp) { return ABS(degBed() - temp) < (TEMP_BED_HYSTERESIS); } @@ -735,9 +735,9 @@ class Temperature { FORCE_INLINE static int16_t rawProbeTemp() { return temp_probe.raw; } #endif FORCE_INLINE static float degProbe() { return temp_probe.celsius; } - FORCE_INLINE static bool isProbeBelowTemp(const float target_temp) { return temp_probe.celsius < target_temp; } - FORCE_INLINE static bool isProbeAboveTemp(const float target_temp) { return temp_probe.celsius > target_temp; } - static bool wait_for_probe(const float target_temp, bool no_wait_for_cooling=true); + FORCE_INLINE static bool isProbeBelowTemp(const_float_t target_temp) { return temp_probe.celsius < target_temp; } + FORCE_INLINE static bool isProbeAboveTemp(const_float_t target_temp) { return temp_probe.celsius > target_temp; } + static bool wait_for_probe(const_float_t target_temp, bool no_wait_for_cooling=true); #endif #if WATCH_PROBE @@ -825,7 +825,7 @@ class Temperature { static bool pid_debug_flag; #endif - static void PID_autotune(const float &target, const heater_id_t heater_id, const int8_t ncycles, const bool set_result=false); + static void PID_autotune(const_float_t target, const heater_id_t heater_id, const int8_t ncycles, const bool set_result=false); #if ENABLED(NO_FAN_SLOWING_IN_PID_TUNING) static bool adaptive_fan_slowing; @@ -959,7 +959,7 @@ class Temperature { millis_t timer = 0; TRState state = TRInactive; float running_temp; - void run(const float ¤t, const float &target, const heater_id_t heater_id, const uint16_t period_seconds, const celsius_t hysteresis_degc); + void run(const_float_t current, const_float_t target, const heater_id_t heater_id, const uint16_t period_seconds, const celsius_t hysteresis_degc); } tr_state_machine_t; static tr_state_machine_t tr_state_machine[NR_HEATER_RUNAWAY]; From 05b39623b0490f0c49593b10bcc04d4b0f10851d Mon Sep 17 00:00:00 2001 From: Vert <45634861+Vertabreak@users.noreply.github.com> Date: Thu, 1 Apr 2021 19:05:02 -0400 Subject: [PATCH 243/253] Board IDs for G2560 Rev B, G2560 v4, GTM32 VD (#21499) --- Marlin/src/core/boards.h | 25 +++++++++-------- Marlin/src/pins/mega/pins_GT2560_REV_B.h | 30 +++++++++++++++++++++ Marlin/src/pins/mega/pins_GT2560_V3.h | 6 +++-- Marlin/src/pins/mega/pins_GT2560_V4.h | 30 +++++++++++++++++++++ Marlin/src/pins/pins.h | 6 +++++ Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h | 8 ++++-- Marlin/src/pins/stm32f1/pins_GTM32_PRO_VD.h | 30 +++++++++++++++++++++ 7 files changed, 120 insertions(+), 15 deletions(-) create mode 100644 Marlin/src/pins/mega/pins_GT2560_REV_B.h create mode 100644 Marlin/src/pins/mega/pins_GT2560_V4.h create mode 100644 Marlin/src/pins/stm32f1/pins_GTM32_PRO_VD.h diff --git a/Marlin/src/core/boards.h b/Marlin/src/core/boards.h index a7ee18d6eb..d2e2236a14 100644 --- a/Marlin/src/core/boards.h +++ b/Marlin/src/core/boards.h @@ -146,17 +146,19 @@ #define BOARD_ELEFU_3 1311 // Elefu Ra Board (v3) #define BOARD_LEAPFROG 1312 // Leapfrog #define BOARD_MEGACONTROLLER 1313 // Mega controller -#define BOARD_GT2560_REV_A 1314 // Geeetech GT2560 Rev. A -#define BOARD_GT2560_REV_A_PLUS 1315 // Geeetech GT2560 Rev. A+ (with auto level probe) -#define BOARD_GT2560_V3 1316 // Geeetech GT2560 Rev B for A10(M/D) -#define BOARD_GT2560_V3_MC2 1317 // Geeetech GT2560 Rev B for Mecreator2 -#define BOARD_GT2560_V3_A20 1318 // Geeetech GT2560 Rev B for A20(M/D) -#define BOARD_EINSTART_S 1319 // Einstart retrofit -#define BOARD_WANHAO_ONEPLUS 1320 // Wanhao 0ne+ i3 Mini -#define BOARD_LEAPFROG_XEED2015 1321 // Leapfrog Xeed 2015 -#define BOARD_PICA_REVB 1322 // PICA Shield (original version) -#define BOARD_PICA 1323 // PICA Shield (rev C or later) -#define BOARD_INTAMSYS40 1324 // Intamsys 4.0 (Funmat HT) +#define BOARD_GT2560_REV_A 1314 // Geeetech GT2560 Rev A +#define BOARD_GT2560_REV_A_PLUS 1315 // Geeetech GT2560 Rev A+ (with auto level probe) +#define BOARD_GT2560_REV_B 1316 // Geeetech GT2560 Rev B +#define BOARD_GT2560_V3 1317 // Geeetech GT2560 Rev B for A10(M/D) +#define BOARD_GT2560_V4 1318 // Geeetech GT2560 Rev B for A10(M/D) +#define BOARD_GT2560_V3_MC2 1319 // Geeetech GT2560 Rev B for Mecreator2 +#define BOARD_GT2560_V3_A20 1320 // Geeetech GT2560 Rev B for A20(M/D) +#define BOARD_EINSTART_S 1321 // Einstart retrofit +#define BOARD_WANHAO_ONEPLUS 1322 // Wanhao 0ne+ i3 Mini +#define BOARD_LEAPFROG_XEED2015 1323 // Leapfrog Xeed 2015 +#define BOARD_PICA_REVB 1324 // PICA Shield (original version) +#define BOARD_PICA 1325 // PICA Shield (rev C or later) +#define BOARD_INTAMSYS40 1326 // Intamsys 4.0 (Funmat HT) // // ATmega1281, ATmega2561 @@ -341,6 +343,7 @@ #define BOARD_FLSUN_HISPEED 4046 // FLSUN HiSpeedV1 (STM32F103VET6) #define BOARD_BEAST 4047 // STM32F103RET6 Libmaple-based controller #define BOARD_MINGDA_MPX_ARM_MINI 4048 // STM32F103ZET6 Mingda MD-16 +#define BOARD_GTM32_PRO_VD 4049 // STM32F103VET6 controller // // ARM Cortex-M4F diff --git a/Marlin/src/pins/mega/pins_GT2560_REV_B.h b/Marlin/src/pins/mega/pins_GT2560_REV_B.h new file mode 100644 index 0000000000..be71ec4902 --- /dev/null +++ b/Marlin/src/pins/mega/pins_GT2560_REV_B.h @@ -0,0 +1,30 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 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 + +/** + * Geeetech GT2560 Rev B Pins + */ + +#define BOARD_INFO_NAME "GT2560 Rev B" + +#include "pins_GT2560_V3.h" diff --git a/Marlin/src/pins/mega/pins_GT2560_V3.h b/Marlin/src/pins/mega/pins_GT2560_V3.h index dd2d1d0f65..8490d5571d 100644 --- a/Marlin/src/pins/mega/pins_GT2560_V3.h +++ b/Marlin/src/pins/mega/pins_GT2560_V3.h @@ -22,14 +22,16 @@ #pragma once /** - * Geeetech GT2560 RevB + GT2560 3.0/3.1 + GT2560 4.0/4.1 pin assignments + * Geeetech GT2560 3.0/3.1 pin assignments + * + * Also GT2560 RevB and GT2560 4.0/4.1 */ #define ALLOW_MEGA1280 #include "env_validate.h" #ifndef BOARD_INFO_NAME - #define BOARD_INFO_NAME "GT2560 RevB/3.x/4.x" + #define BOARD_INFO_NAME "GT2560 3.x" #endif // diff --git a/Marlin/src/pins/mega/pins_GT2560_V4.h b/Marlin/src/pins/mega/pins_GT2560_V4.h new file mode 100644 index 0000000000..6ac07b70bf --- /dev/null +++ b/Marlin/src/pins/mega/pins_GT2560_V4.h @@ -0,0 +1,30 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 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 + +/** + * Geeetech GT2560 V4.X Pins + */ + +#define BOARD_INFO_NAME "GT2560 4.x" + +#include "pins_GT2560_V3.h" diff --git a/Marlin/src/pins/pins.h b/Marlin/src/pins/pins.h index 35bfb266eb..e4c692a3b9 100644 --- a/Marlin/src/pins/pins.h +++ b/Marlin/src/pins/pins.h @@ -244,6 +244,10 @@ #include "mega/pins_GT2560_REV_A_PLUS.h" // ATmega2560, ATmega1280 env:mega2560 env:mega1280 #elif MB(GT2560_V3) #include "mega/pins_GT2560_V3.h" // ATmega2560 env:mega2560 +#elif MB(GT2560_REV_B) + #include "mega/pins_GT2560_REV_B.h" // ATmega2560 env:mega2560 +#elif MB(GT2560_V4) + #include "mega/pins_GT2560_V4.h" // ATmega2560 env:mega2560 #elif MB(GT2560_V3_MC2) #include "mega/pins_GT2560_V3_MC2.h" // ATmega2560 env:mega2560 #elif MB(GT2560_V3_A20) @@ -470,6 +474,8 @@ #include "stm32f1/pins_STM3R_MINI.h" // STM32F1 env:STM32F103RE #elif MB(GTM32_PRO_VB) #include "stm32f1/pins_GTM32_PRO_VB.h" // STM32F1 env:STM32F103RE +#elif MB(GTM32_PRO_VD) + #include "stm32f1/pins_GTM32_PRO_VD.h" // STM32F1 env:STM32F103RE #elif MB(GTM32_MINI) #include "stm32f1/pins_GTM32_MINI.h" // STM32F1 env:STM32F103RE #elif MB(GTM32_MINI_A30) diff --git a/Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h b/Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h index 18156fc0ff..2545642bae 100644 --- a/Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h +++ b/Marlin/src/pins/stm32f1/pins_GTM32_PRO_VB.h @@ -22,13 +22,17 @@ #pragma once /** - * Geeetech GTM32 Pro VB/VD board pin assignments + * Geeetech GTM32 Pro VB board pin assignments * http://www.geeetech.com/wiki/index.php/File:Hardware_GTM32_PRO_VB.pdf + * + * Also applies to GTM32 Pro VD */ #include "env_validate.h" -#define BOARD_INFO_NAME "GTM32 Pro VB/VD" +#ifndef BOARD_INFO_NAME + #define BOARD_INFO_NAME "GTM32 Pro VB" +#endif #define DEFAULT_MACHINE_NAME "STM32F103VET6" #define BOARD_NO_NATIVE_USB diff --git a/Marlin/src/pins/stm32f1/pins_GTM32_PRO_VD.h b/Marlin/src/pins/stm32f1/pins_GTM32_PRO_VD.h new file mode 100644 index 0000000000..fb8c73c45f --- /dev/null +++ b/Marlin/src/pins/stm32f1/pins_GTM32_PRO_VD.h @@ -0,0 +1,30 @@ +/** + * Marlin 3D Printer Firmware + * Copyright (c) 2021 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 + +/** + * Geeetech GTM32 Pro VD board pin assignments + */ + +#define BOARD_INFO_NAME "GTM32 Pro VD" + +#include "pins_GTM32_PRO_VB.h" From 45c1432946547cef4cbe9ac832394ff68526687d Mon Sep 17 00:00:00 2001 From: Marcio T Date: Thu, 1 Apr 2021 18:12:00 -0600 Subject: [PATCH 244/253] G26 Hilbert Curve followup (#21480) --- Marlin/src/core/utility.h | 2 +- Marlin/src/feature/bedlevel/abl/abl.cpp | 38 +- Marlin/src/feature/bedlevel/hilbert_curve.cpp | 8 +- .../bedlevel/mbl/mesh_bed_leveling.cpp | 8 +- .../feature/bedlevel/mbl/mesh_bed_leveling.h | 14 +- Marlin/src/feature/bedlevel/ubl/ubl.cpp | 4 +- Marlin/src/feature/bedlevel/ubl/ubl.h | 46 +- Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp | 8 +- .../src/feature/bedlevel/ubl/ubl_motion.cpp | 4 +- Marlin/src/gcode/bedlevel/G26.cpp | 667 +++++++++--------- Marlin/src/gcode/bedlevel/M420.cpp | 4 +- Marlin/src/gcode/bedlevel/abl/G29.cpp | 6 +- Marlin/src/gcode/bedlevel/mbl/G29.cpp | 10 +- Marlin/src/inc/Conditionals_post.h | 5 + Marlin/src/inc/SanityCheck.h | 6 +- Marlin/src/lcd/HD44780/marlinui_HD44780.cpp | 2 +- Marlin/src/lcd/dogm/marlinui_DOGM.cpp | 2 +- .../screens/bed_mesh_screen.cpp | 10 +- Marlin/src/lcd/extui/ui_api.cpp | 2 +- Marlin/src/lcd/menu/menu_bed_leveling.cpp | 4 +- Marlin/src/lcd/menu/menu_ubl.cpp | 4 +- Marlin/src/lcd/tft/ui_320x240.cpp | 14 +- Marlin/src/lcd/tft/ui_480x320.cpp | 14 +- Marlin/src/module/settings.cpp | 4 +- 24 files changed, 442 insertions(+), 444 deletions(-) diff --git a/Marlin/src/core/utility.h b/Marlin/src/core/utility.h index 645a4be807..aaa241d460 100644 --- a/Marlin/src/core/utility.h +++ b/Marlin/src/core/utility.h @@ -34,7 +34,7 @@ void safe_delay(millis_t ms); inline void serial_delay(const millis_t) {} #endif -#if GRID_MAX_POINTS_X && GRID_MAX_POINTS_Y +#if (GRID_MAX_POINTS_X) && (GRID_MAX_POINTS_Y) // 16x16 bit arrays template diff --git a/Marlin/src/feature/bedlevel/abl/abl.cpp b/Marlin/src/feature/bedlevel/abl/abl.cpp index bc3aedb2f4..7390656563 100644 --- a/Marlin/src/feature/bedlevel/abl/abl.cpp +++ b/Marlin/src/feature/bedlevel/abl/abl.cpp @@ -85,9 +85,9 @@ static void extrapolate_one_point(const uint8_t x, const uint8_t y, const int8_t //#define EXTRAPOLATE_FROM_EDGE #if ENABLED(EXTRAPOLATE_FROM_EDGE) - #if GRID_MAX_POINTS_X < GRID_MAX_POINTS_Y + #if (GRID_MAX_POINTS_X) < (GRID_MAX_POINTS_Y) #define HALF_IN_X - #elif GRID_MAX_POINTS_Y < GRID_MAX_POINTS_X + #elif (GRID_MAX_POINTS_Y) < (GRID_MAX_POINTS_X) #define HALF_IN_Y #endif #endif @@ -98,23 +98,23 @@ static void extrapolate_one_point(const uint8_t x, const uint8_t y, const int8_t */ void extrapolate_unprobed_bed_level() { #ifdef HALF_IN_X - constexpr uint8_t ctrx2 = 0, xlen = GRID_MAX_POINTS_X - 1; + constexpr uint8_t ctrx2 = 0, xend = GRID_MAX_POINTS_X - 1; #else - constexpr uint8_t ctrx1 = (GRID_MAX_POINTS_X - 1) / 2, // left-of-center - ctrx2 = (GRID_MAX_POINTS_X) / 2, // right-of-center - xlen = ctrx1; + constexpr uint8_t ctrx1 = (GRID_MAX_CELLS_X) / 2, // left-of-center + ctrx2 = (GRID_MAX_POINTS_X) / 2, // right-of-center + xend = ctrx1; #endif #ifdef HALF_IN_Y - constexpr uint8_t ctry2 = 0, ylen = GRID_MAX_POINTS_Y - 1; + constexpr uint8_t ctry2 = 0, yend = GRID_MAX_POINTS_Y - 1; #else - constexpr uint8_t ctry1 = (GRID_MAX_POINTS_Y - 1) / 2, // top-of-center - ctry2 = (GRID_MAX_POINTS_Y) / 2, // bottom-of-center - ylen = ctry1; + constexpr uint8_t ctry1 = (GRID_MAX_CELLS_Y) / 2, // top-of-center + ctry2 = (GRID_MAX_POINTS_Y) / 2, // bottom-of-center + yend = ctry1; #endif - LOOP_LE_N(xo, xlen) - LOOP_LE_N(yo, ylen) { + LOOP_LE_N(xo, xend) + LOOP_LE_N(yo, yend) { uint8_t x2 = ctrx2 + xo, y2 = ctry2 + yo; #ifndef HALF_IN_X const uint8_t x1 = ctrx1 - xo; @@ -143,8 +143,8 @@ void print_bilinear_leveling_grid() { #if ENABLED(ABL_BILINEAR_SUBDIVISION) - #define ABL_GRID_POINTS_VIRT_X (GRID_MAX_POINTS_X - 1) * (BILINEAR_SUBDIVISIONS) + 1 - #define ABL_GRID_POINTS_VIRT_Y (GRID_MAX_POINTS_Y - 1) * (BILINEAR_SUBDIVISIONS) + 1 + #define ABL_GRID_POINTS_VIRT_X GRID_MAX_CELLS_X * (BILINEAR_SUBDIVISIONS) + 1 + #define ABL_GRID_POINTS_VIRT_Y GRID_MAX_CELLS_Y * (BILINEAR_SUBDIVISIONS) + 1 #define ABL_TEMP_POINTS_X (GRID_MAX_POINTS_X + 2) #define ABL_TEMP_POINTS_Y (GRID_MAX_POINTS_Y + 2) float z_values_virt[ABL_GRID_POINTS_VIRT_X][ABL_GRID_POINTS_VIRT_Y]; @@ -161,7 +161,7 @@ void print_bilinear_leveling_grid() { #define LINEAR_EXTRAPOLATION(E, I) ((E) * 2 - (I)) float bed_level_virt_coord(const uint8_t x, const uint8_t y) { uint8_t ep = 0, ip = 1; - if (x > GRID_MAX_POINTS_X + 1 || y > GRID_MAX_POINTS_Y + 1) { + if (x > (GRID_MAX_POINTS_X) + 1 || y > (GRID_MAX_POINTS_Y) + 1) { // The requested point requires extrapolating two points beyond the mesh. // These values are only requested for the edges of the mesh, which are always an actual mesh point, // and do not require interpolation. When interpolation is not needed, this "Mesh + 2" point is @@ -171,8 +171,8 @@ void print_bilinear_leveling_grid() { } if (!x || x == ABL_TEMP_POINTS_X - 1) { if (x) { - ep = GRID_MAX_POINTS_X - 1; - ip = GRID_MAX_POINTS_X - 2; + ep = (GRID_MAX_POINTS_X) - 1; + ip = GRID_MAX_CELLS_X - 1; } if (WITHIN(y, 1, ABL_TEMP_POINTS_Y - 2)) return LINEAR_EXTRAPOLATION( @@ -187,8 +187,8 @@ void print_bilinear_leveling_grid() { } if (!y || y == ABL_TEMP_POINTS_Y - 1) { if (y) { - ep = GRID_MAX_POINTS_Y - 1; - ip = GRID_MAX_POINTS_Y - 2; + ep = (GRID_MAX_POINTS_Y) - 1; + ip = GRID_MAX_CELLS_Y - 1; } if (WITHIN(x, 1, ABL_TEMP_POINTS_X - 2)) return LINEAR_EXTRAPOLATION( diff --git a/Marlin/src/feature/bedlevel/hilbert_curve.cpp b/Marlin/src/feature/bedlevel/hilbert_curve.cpp index 6150226e0b..e4bc3aa618 100644 --- a/Marlin/src/feature/bedlevel/hilbert_curve.cpp +++ b/Marlin/src/feature/bedlevel/hilbert_curve.cpp @@ -36,7 +36,7 @@ constexpr uint8_t dim = _BV(ord); static inline bool eval_candidate(int8_t x, int8_t y, hilbert_curve::callback_ptr func, void *data) { // The print bed likely has fewer points than the full Hilbert // curve, so cull unecessary points - return x < GRID_MAX_POINTS_X && y < GRID_MAX_POINTS_Y ? func(x, y, data) : false; + return x < (GRID_MAX_POINTS_X) && y < (GRID_MAX_POINTS_Y) ? func(x, y, data) : false; } bool hilbert_curve::hilbert(int8_t x, int8_t y, int8_t xi, int8_t xj, int8_t yi, int8_t yj, uint8_t n, hilbert_curve::callback_ptr func, void *data) { @@ -102,10 +102,8 @@ bool hilbert_curve::search_from(uint8_t x, uint8_t y, hilbert_curve::callback_pt */ bool hilbert_curve::search_from_closest(const xy_pos_t &pos, hilbert_curve::callback_ptr func, void *data) { // Find closest grid intersection - uint8_t grid_x = LROUND(float(pos.x - MESH_MIN_X) / MESH_X_DIST); - uint8_t grid_y = LROUND(float(pos.y - MESH_MIN_Y) / MESH_Y_DIST); - LIMIT(grid_x, 0, GRID_MAX_POINTS_X); - LIMIT(grid_y, 0, GRID_MAX_POINTS_Y); + const uint8_t grid_x = LROUND(constrain(float(pos.x - (MESH_MIN_X)) / (MESH_X_DIST), 0, (GRID_MAX_POINTS_X) - 1)); + const uint8_t grid_y = LROUND(constrain(float(pos.y - (MESH_MIN_Y)) / (MESH_Y_DIST), 0, (GRID_MAX_POINTS_Y) - 1)); return search_from(grid_x, grid_y, func, data); } diff --git a/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.cpp b/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.cpp index f51d83f996..51cf28f890 100644 --- a/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.cpp +++ b/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.cpp @@ -64,10 +64,10 @@ void mesh_bed_leveling::line_to_destination(const_feedRate_t scaled_fr_mm_s, uint8_t x_splits, uint8_t y_splits) { // Get current and destination cells for this line xy_int8_t scel = cell_indexes(current_position), ecel = cell_indexes(destination); - NOMORE(scel.x, GRID_MAX_POINTS_X - 2); - NOMORE(scel.y, GRID_MAX_POINTS_Y - 2); - NOMORE(ecel.x, GRID_MAX_POINTS_X - 2); - NOMORE(ecel.y, GRID_MAX_POINTS_Y - 2); + NOMORE(scel.x, GRID_MAX_CELLS_X - 1); + NOMORE(scel.y, GRID_MAX_CELLS_Y - 1); + NOMORE(ecel.x, GRID_MAX_CELLS_X - 1); + NOMORE(ecel.y, GRID_MAX_CELLS_Y - 1); // Start and end in the same cell? No split needed. if (scel == ecel) { diff --git a/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.h b/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.h index 9932ce9e5c..eadcc28aa4 100644 --- a/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.h +++ b/Marlin/src/feature/bedlevel/mbl/mesh_bed_leveling.h @@ -32,8 +32,8 @@ enum MeshLevelingState : char { MeshReset // G29 S5 }; -#define MESH_X_DIST (float(MESH_MAX_X - (MESH_MIN_X)) / float(GRID_MAX_POINTS_X - 1)) -#define MESH_Y_DIST (float(MESH_MAX_Y - (MESH_MIN_Y)) / float(GRID_MAX_POINTS_Y - 1)) +#define MESH_X_DIST (float(MESH_MAX_X - (MESH_MIN_X)) / (GRID_MAX_CELLS_X)) +#define MESH_Y_DIST (float(MESH_MAX_Y - (MESH_MIN_Y)) / (GRID_MAX_CELLS_Y)) #define _GET_MESH_X(I) mbl.index_to_xpos[I] #define _GET_MESH_Y(J) mbl.index_to_ypos[J] #define Z_VALUES_ARR mbl.z_values @@ -61,7 +61,7 @@ public: static inline void zigzag(const int8_t index, int8_t &px, int8_t &py) { px = index % (GRID_MAX_POINTS_X); py = index / (GRID_MAX_POINTS_X); - if (py & 1) px = (GRID_MAX_POINTS_X - 1) - px; // Zig zag + if (py & 1) px = (GRID_MAX_POINTS_X) - 1 - px; // Zig zag } static void set_zigzag_z(const int8_t index, const_float_t z) { @@ -72,11 +72,11 @@ public: static int8_t cell_index_x(const_float_t x) { int8_t cx = (x - (MESH_MIN_X)) * RECIPROCAL(MESH_X_DIST); - return constrain(cx, 0, (GRID_MAX_POINTS_X) - 2); + return constrain(cx, 0, GRID_MAX_CELLS_X - 1); } static int8_t cell_index_y(const_float_t y) { int8_t cy = (y - (MESH_MIN_Y)) * RECIPROCAL(MESH_Y_DIST); - return constrain(cy, 0, (GRID_MAX_POINTS_Y) - 2); + return constrain(cy, 0, GRID_MAX_CELLS_Y - 1); } static inline xy_int8_t cell_indexes(const_float_t x, const_float_t y) { return { cell_index_x(x), cell_index_y(y) }; @@ -85,11 +85,11 @@ public: static int8_t probe_index_x(const_float_t x) { int8_t px = (x - (MESH_MIN_X) + 0.5f * (MESH_X_DIST)) * RECIPROCAL(MESH_X_DIST); - return WITHIN(px, 0, GRID_MAX_POINTS_X - 1) ? px : -1; + return WITHIN(px, 0, (GRID_MAX_POINTS_X) - 1) ? px : -1; } static int8_t probe_index_y(const_float_t y) { int8_t py = (y - (MESH_MIN_Y) + 0.5f * (MESH_Y_DIST)) * RECIPROCAL(MESH_Y_DIST); - return WITHIN(py, 0, GRID_MAX_POINTS_Y - 1) ? py : -1; + return WITHIN(py, 0, (GRID_MAX_POINTS_Y) - 1) ? py : -1; } static inline xy_int8_t probe_indexes(const_float_t x, const_float_t y) { return { probe_index_x(x), probe_index_y(y) }; diff --git a/Marlin/src/feature/bedlevel/ubl/ubl.cpp b/Marlin/src/feature/bedlevel/ubl/ubl.cpp index 14491bdd81..164d267ceb 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl.cpp @@ -190,7 +190,7 @@ void unified_bed_leveling::display_map(const int map_type) { const xy_int8_t curr = closest_indexes(xy_pos_t(current_position) + probe.offset_xy); if (!lcd) SERIAL_EOL(); - for (int8_t j = GRID_MAX_POINTS_Y - 1; j >= 0; j--) { + for (int8_t j = (GRID_MAX_POINTS_Y) - 1; j >= 0; j--) { // Row Label (J index) if (human) { @@ -217,7 +217,7 @@ void unified_bed_leveling::display_map(const int map_type) { if (human && f >= 0.0) SERIAL_CHAR(f > 0 ? '+' : ' '); // Display sign also for positive numbers (' ' for 0) SERIAL_ECHO_F(f, 3); // Positive: 5 digits, Negative: 6 digits } - if (csv && i < GRID_MAX_POINTS_X - 1) SERIAL_CHAR('\t'); + if (csv && i < (GRID_MAX_POINTS_X) - 1) SERIAL_CHAR('\t'); // Closing Brace or Space if (human) SERIAL_CHAR(is_current ? ']' : ' '); diff --git a/Marlin/src/feature/bedlevel/ubl/ubl.h b/Marlin/src/feature/bedlevel/ubl/ubl.h index 222e7b0f20..dd6c261341 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl.h +++ b/Marlin/src/feature/bedlevel/ubl/ubl.h @@ -38,8 +38,8 @@ enum MeshPointType : char { INVALID, REAL, SET_IN_BITMAP }; struct mesh_index_pair; -#define MESH_X_DIST (float(MESH_MAX_X - (MESH_MIN_X)) / float(GRID_MAX_POINTS_X - 1)) -#define MESH_Y_DIST (float(MESH_MAX_Y - (MESH_MIN_Y)) / float(GRID_MAX_POINTS_Y - 1)) +#define MESH_X_DIST (float(MESH_MAX_X - (MESH_MIN_X)) / (GRID_MAX_CELLS_X)) +#define MESH_Y_DIST (float(MESH_MAX_Y - (MESH_MIN_Y)) / (GRID_MAX_CELLS_Y)) #if ENABLED(OPTIMIZED_MESH_STORAGE) typedef int16_t mesh_store_t[GRID_MAX_POINTS_X][GRID_MAX_POINTS_Y]; @@ -142,19 +142,19 @@ public: } static int8_t cell_index_x_valid(const_float_t x) { - return WITHIN(cell_index_x_raw(x), 0, (GRID_MAX_POINTS_X - 2)); + return WITHIN(cell_index_x_raw(x), 0, GRID_MAX_CELLS_X - 1); } static int8_t cell_index_y_valid(const_float_t y) { - return WITHIN(cell_index_y_raw(y), 0, (GRID_MAX_POINTS_Y - 2)); + return WITHIN(cell_index_y_raw(y), 0, GRID_MAX_CELLS_Y - 1); } static int8_t cell_index_x(const_float_t x) { - return constrain(cell_index_x_raw(x), 0, (GRID_MAX_POINTS_X) - 2); + return constrain(cell_index_x_raw(x), 0, GRID_MAX_CELLS_X - 1); } static int8_t cell_index_y(const_float_t y) { - return constrain(cell_index_y_raw(y), 0, (GRID_MAX_POINTS_Y) - 2); + return constrain(cell_index_y_raw(y), 0, GRID_MAX_CELLS_Y - 1); } static inline xy_int8_t cell_indexes(const_float_t x, const_float_t y) { @@ -164,11 +164,11 @@ public: static int8_t closest_x_index(const_float_t x) { const int8_t px = (x - (MESH_MIN_X) + (MESH_X_DIST) * 0.5) * RECIPROCAL(MESH_X_DIST); - return WITHIN(px, 0, GRID_MAX_POINTS_X - 1) ? px : -1; + return WITHIN(px, 0, (GRID_MAX_POINTS_X) - 1) ? px : -1; } static int8_t closest_y_index(const_float_t y) { const int8_t py = (y - (MESH_MIN_Y) + (MESH_Y_DIST) * 0.5) * RECIPROCAL(MESH_Y_DIST); - return WITHIN(py, 0, GRID_MAX_POINTS_Y - 1) ? py : -1; + return WITHIN(py, 0, (GRID_MAX_POINTS_Y) - 1) ? py : -1; } static inline xy_int8_t closest_indexes(const xy_pos_t &xy) { return { closest_x_index(xy.x), closest_y_index(xy.y) }; @@ -204,10 +204,10 @@ public: * the case where the printer is making a vertical line that only crosses horizontal mesh lines. */ static inline float z_correction_for_x_on_horizontal_mesh_line(const_float_t rx0, const int x1_i, const int yi) { - if (!WITHIN(x1_i, 0, GRID_MAX_POINTS_X - 1) || !WITHIN(yi, 0, GRID_MAX_POINTS_Y - 1)) { + if (!WITHIN(x1_i, 0, (GRID_MAX_POINTS_X) - 1) || !WITHIN(yi, 0, (GRID_MAX_POINTS_Y) - 1)) { if (DEBUGGING(LEVELING)) { - if (WITHIN(x1_i, 0, GRID_MAX_POINTS_X - 1)) DEBUG_ECHOPGM("yi"); else DEBUG_ECHOPGM("x1_i"); + if (WITHIN(x1_i, 0, (GRID_MAX_POINTS_X) - 1)) DEBUG_ECHOPGM("yi"); else DEBUG_ECHOPGM("x1_i"); DEBUG_ECHOLNPAIR(" out of bounds in z_correction_for_x_on_horizontal_mesh_line(rx0=", rx0, ",x1_i=", x1_i, ",yi=", yi, ")"); } @@ -218,19 +218,19 @@ public: const float xratio = (rx0 - mesh_index_to_xpos(x1_i)) * RECIPROCAL(MESH_X_DIST), z1 = z_values[x1_i][yi]; - return z1 + xratio * (z_values[_MIN(x1_i, GRID_MAX_POINTS_X - 2) + 1][yi] - z1); // Don't allow x1_i+1 to be past the end of the array - // If it is, it is clamped to the last element of the - // z_values[][] array and no correction is applied. + return z1 + xratio * (z_values[_MIN(x1_i, (GRID_MAX_POINTS_X) - 2) + 1][yi] - z1); // Don't allow x1_i+1 to be past the end of the array + // If it is, it is clamped to the last element of the + // z_values[][] array and no correction is applied. } // // See comments above for z_correction_for_x_on_horizontal_mesh_line // static inline float z_correction_for_y_on_vertical_mesh_line(const_float_t ry0, const int xi, const int y1_i) { - if (!WITHIN(xi, 0, GRID_MAX_POINTS_X - 1) || !WITHIN(y1_i, 0, GRID_MAX_POINTS_Y - 1)) { + if (!WITHIN(xi, 0, (GRID_MAX_POINTS_X) - 1) || !WITHIN(y1_i, 0, (GRID_MAX_POINTS_Y) - 1)) { if (DEBUGGING(LEVELING)) { - if (WITHIN(xi, 0, GRID_MAX_POINTS_X - 1)) DEBUG_ECHOPGM("y1_i"); else DEBUG_ECHOPGM("xi"); + if (WITHIN(xi, 0, (GRID_MAX_POINTS_X) - 1)) DEBUG_ECHOPGM("y1_i"); else DEBUG_ECHOPGM("xi"); DEBUG_ECHOLNPAIR(" out of bounds in z_correction_for_y_on_vertical_mesh_line(ry0=", ry0, ", xi=", xi, ", y1_i=", y1_i, ")"); } @@ -241,9 +241,9 @@ public: const float yratio = (ry0 - mesh_index_to_ypos(y1_i)) * RECIPROCAL(MESH_Y_DIST), z1 = z_values[xi][y1_i]; - return z1 + yratio * (z_values[xi][_MIN(y1_i, GRID_MAX_POINTS_Y - 2) + 1] - z1); // Don't allow y1_i+1 to be past the end of the array - // If it is, it is clamped to the last element of the - // z_values[][] array and no correction is applied. + return z1 + yratio * (z_values[xi][_MIN(y1_i, (GRID_MAX_POINTS_Y) - 2) + 1] - z1); // Don't allow y1_i+1 to be past the end of the array + // If it is, it is clamped to the last element of the + // z_values[][] array and no correction is applied. } /** @@ -266,11 +266,11 @@ public: const float z1 = calc_z0(rx0, mesh_index_to_xpos(cx), z_values[cx][cy], - mesh_index_to_xpos(cx + 1), z_values[_MIN(cx, GRID_MAX_POINTS_X - 2) + 1][cy]); + mesh_index_to_xpos(cx + 1), z_values[_MIN(cx, (GRID_MAX_POINTS_X) - 2) + 1][cy]); const float z2 = calc_z0(rx0, - mesh_index_to_xpos(cx), z_values[cx][_MIN(cy, GRID_MAX_POINTS_Y - 2) + 1], - mesh_index_to_xpos(cx + 1), z_values[_MIN(cx, GRID_MAX_POINTS_X - 2) + 1][_MIN(cy, GRID_MAX_POINTS_Y - 2) + 1]); + mesh_index_to_xpos(cx), z_values[cx][_MIN(cy, (GRID_MAX_POINTS_Y) - 2) + 1], + mesh_index_to_xpos(cx + 1), z_values[_MIN(cx, (GRID_MAX_POINTS_X) - 2) + 1][_MIN(cy, (GRID_MAX_POINTS_Y) - 2) + 1]); float z0 = calc_z0(ry0, mesh_index_to_ypos(cy), z1, @@ -302,10 +302,10 @@ public: static inline float get_z_correction(const xy_pos_t &pos) { return get_z_correction(pos.x, pos.y); } static inline float mesh_index_to_xpos(const uint8_t i) { - return i < GRID_MAX_POINTS_X ? pgm_read_float(&_mesh_index_to_xpos[i]) : MESH_MIN_X + i * (MESH_X_DIST); + return i < (GRID_MAX_POINTS_X) ? pgm_read_float(&_mesh_index_to_xpos[i]) : MESH_MIN_X + i * (MESH_X_DIST); } static inline float mesh_index_to_ypos(const uint8_t i) { - return i < GRID_MAX_POINTS_Y ? pgm_read_float(&_mesh_index_to_ypos[i]) : MESH_MIN_Y + i * (MESH_Y_DIST); + return i < (GRID_MAX_POINTS_Y) ? pgm_read_float(&_mesh_index_to_ypos[i]) : MESH_MIN_Y + i * (MESH_Y_DIST); } #if UBL_SEGMENTED diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp index 545d95676e..9153f369bd 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_G29.cpp @@ -433,8 +433,7 @@ void unified_bed_leveling::G29() { SERIAL_DECIMAL(param.XY_pos.y); SERIAL_ECHOLNPGM(").\n"); } - const xy_pos_t near_probe_xy = param.XY_pos + probe.offset_xy; - probe_entire_mesh(near_probe_xy, parser.seen('T'), parser.seen('E'), parser.seen('U')); + probe_entire_mesh(param.XY_pos, parser.seen('T'), parser.seen('E'), parser.seen('U')); report_current_position(); probe_deployed = true; @@ -1140,8 +1139,9 @@ bool unified_bed_leveling::G29_parse_parameters() { } // If X or Y are not valid, use center of the bed values - if (!COORDINATE_OKAY(sx, X_MIN_BED, X_MAX_BED)) sx = X_CENTER; - if (!COORDINATE_OKAY(sy, Y_MIN_BED, Y_MAX_BED)) sy = Y_CENTER; + // (for UBL_HILBERT_CURVE default to lower-left corner instead) + if (!COORDINATE_OKAY(sx, X_MIN_BED, X_MAX_BED)) sx = TERN(UBL_HILBERT_CURVE, 0, X_CENTER); + if (!COORDINATE_OKAY(sy, Y_MIN_BED, Y_MAX_BED)) sy = TERN(UBL_HILBERT_CURVE, 0, Y_CENTER); if (err_flag) return UBL_ERR; diff --git a/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp b/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp index 4e522210d0..3ebc5fc2bd 100644 --- a/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp +++ b/Marlin/src/feature/bedlevel/ubl/ubl_motion.cpp @@ -397,8 +397,8 @@ int8_t((raw.x - (MESH_MIN_X)) * RECIPROCAL(MESH_X_DIST)), int8_t((raw.y - (MESH_MIN_Y)) * RECIPROCAL(MESH_Y_DIST)) }; - LIMIT(icell.x, 0, (GRID_MAX_POINTS_X) - 1); - LIMIT(icell.y, 0, (GRID_MAX_POINTS_Y) - 1); + LIMIT(icell.x, 0, GRID_MAX_CELLS_X); + LIMIT(icell.y, 0, GRID_MAX_CELLS_Y); float z_x0y0 = z_values[icell.x ][icell.y ], // z at lower left corner z_x1y0 = z_values[icell.x+1][icell.y ], // z at upper left corner diff --git a/Marlin/src/gcode/bedlevel/G26.cpp b/Marlin/src/gcode/bedlevel/G26.cpp index e05336d6c5..f3e9a78178 100644 --- a/Marlin/src/gcode/bedlevel/G26.cpp +++ b/Marlin/src/gcode/bedlevel/G26.cpp @@ -113,6 +113,10 @@ #include "../../module/temperature.h" #include "../../lcd/marlinui.h" +#if ENABLED(UBL_HILBERT_CURVE) + #include "../../feature/bedlevel/hilbert_curve.h" +#endif + #define EXTRUSION_MULTIPLIER 1.0 #define PRIME_LENGTH 10.0 #define OOZE_AMOUNT 0.3 @@ -145,24 +149,9 @@ constexpr float g26_e_axis_feedrate = 0.025; -static MeshFlags circle_flags, horizontal_mesh_line_flags, vertical_mesh_line_flags; +static MeshFlags circle_flags; float g26_random_deviation = 0.0; -static bool g26_retracted = false; // Track the retracted state of the nozzle so mismatched - // retracts/recovers won't result in a bad state. - -float g26_extrusion_multiplier, - g26_retraction_multiplier, - g26_layer_height, - g26_prime_length; - -xy_pos_t g26_xy_pos; // = { 0, 0 } - -int16_t g26_bed_temp, - g26_hotend_temp; - -int8_t g26_prime_flag; - #if HAS_LCD_MENU /** @@ -178,52 +167,17 @@ int8_t g26_prime_flag; #endif -mesh_index_pair find_closest_circle_to_print(const xy_pos_t &pos) { - float closest = 99999.99; - mesh_index_pair out_point; - - out_point.pos = -1; - - GRID_LOOP(i, j) { - if (!circle_flags.marked(i, j)) { - // We found a circle that needs to be printed - const xy_pos_t m = { _GET_MESH_X(i), _GET_MESH_Y(j) }; - - // Get the distance to this intersection - float f = (pos - m).magnitude(); - - // It is possible that we are being called with the values - // to let us find the closest circle to the start position. - // But if this is not the case, add a small weighting to the - // distance calculation to help it choose a better place to continue. - f += (g26_xy_pos - m).magnitude() / 15.0f; - - // Add the specified amount of Random Noise to our search - if (g26_random_deviation > 1.0) f += random(0.0, g26_random_deviation); - - if (f < closest) { - closest = f; // Found a closer un-printed location - out_point.pos.set(i, j); // Save its data - out_point.distance = closest; - } - } - } - circle_flags.mark(out_point); // Mark this location as done. - return out_point; -} - void move_to(const_float_t rx, const_float_t ry, const_float_t z, const_float_t e_delta) { static float last_z = -999.99; const xy_pos_t dest = { rx, ry }; - const bool has_xy_component = dest != current_position; // Check if X or Y is involved in the movement. - const bool has_e_component = e_delta != 0.0; - - destination = current_position; + const bool has_xy_component = dest != current_position, // Check if X or Y is involved in the movement. + has_e_component = e_delta != 0.0; if (z != last_z) { - last_z = destination.z = z; + last_z = z; + destination.set(current_position.x, current_position.y, z, current_position.e); const feedRate_t fr_mm_s = planner.settings.max_feedrate_mm_s[Z_AXIS] * 0.5f; // Use half of the Z_AXIS max feed rate prepare_internal_move_to_destination(fr_mm_s); } @@ -239,241 +193,293 @@ void move_to(const_float_t rx, const_float_t ry, const_float_t z, const_float_t prepare_internal_move_to_destination(fr_mm_s); } -FORCE_INLINE void move_to(const xyz_pos_t &where, const_float_t de) { move_to(where.x, where.y, where.z, de); } +void move_to(const xyz_pos_t &where, const_float_t de) { move_to(where.x, where.y, where.z, de); } -void retract_filament(const xyz_pos_t &where) { - if (!g26_retracted) { // Only retract if we are not already retracted! - g26_retracted = true; - move_to(where, -1.0f * g26_retraction_multiplier); - } -} +typedef struct { + float extrusion_multiplier = EXTRUSION_MULTIPLIER, + retraction_multiplier = G26_RETRACT_MULTIPLIER, + layer_height = MESH_TEST_LAYER_HEIGHT, + prime_length = PRIME_LENGTH; -// TODO: Parameterize the Z lift with a define -void retract_lift_move(const xyz_pos_t &s) { - retract_filament(destination); - move_to(current_position.x, current_position.y, current_position.z + 0.5f, 0.0); // Z lift to minimize scraping - move_to(s.x, s.y, s.z + 0.5f, 0.0); // Get to the starting point with no extrusion while lifted -} + int16_t bed_temp = MESH_TEST_BED_TEMP, + hotend_temp = MESH_TEST_HOTEND_TEMP; -void recover_filament(const xyz_pos_t &where) { - if (g26_retracted) { // Only un-retract if we are retracted. - move_to(where, 1.2f * g26_retraction_multiplier); - g26_retracted = false; - } -} + float nozzle = MESH_TEST_NOZZLE_SIZE, + filament_diameter = DEFAULT_NOMINAL_FILAMENT_DIA, + ooze_amount; // 'O' ... OOZE_AMOUNT -/** - * print_line_from_here_to_there() takes two cartesian coordinates and draws a line from one - * to the other. But there are really three sets of coordinates involved. The first coordinate - * is the present location of the nozzle. We don't necessarily want to print from this location. - * We first need to move the nozzle to the start of line segment where we want to print. Once - * there, we can use the two coordinates supplied to draw the line. - * - * Note: Although we assume the first set of coordinates is the start of the line and the second - * set of coordinates is the end of the line, it does not always work out that way. This function - * optimizes the movement to minimize the travel distance before it can start printing. This saves - * a lot of time and eliminates a lot of nonsensical movement of the nozzle. However, it does - * cause a lot of very little short retracement of th nozzle when it draws the very first line - * segment of a 'circle'. The time this requires is very short and is easily saved by the other - * cases where the optimization comes into play. - */ -void print_line_from_here_to_there(const xyz_pos_t &s, const xyz_pos_t &e) { + bool continue_with_closest, // 'C' + keep_heaters_on; // 'K' - // Distances to the start / end of the line - xy_float_t svec = current_position - s, evec = current_position - e; + xy_pos_t xy_pos; // = { 0, 0 } - const float dist_start = HYPOT2(svec.x, svec.y), - dist_end = HYPOT2(evec.x, evec.y), - line_length = HYPOT(e.x - s.x, e.y - s.y); + int8_t prime_flag = 0; - // If the end point of the line is closer to the nozzle, flip the direction, - // moving from the end to the start. On very small lines the optimization isn't worth it. - if (dist_end < dist_start && (INTERSECTION_CIRCLE_RADIUS) < ABS(line_length)) - return print_line_from_here_to_there(e, s); + bool g26_retracted = false; // Track the retracted state during G26 so mismatched + // retracts/recovers don't result in a bad state. - // Decide whether to retract & lift - if (dist_start > 2.0) retract_lift_move(s); - - move_to(s, 0.0); // Get to the starting point with no extrusion / un-Z lift - - const float e_pos_delta = line_length * g26_e_axis_feedrate * g26_extrusion_multiplier; - - recover_filament(destination); - move_to(e, e_pos_delta); // Get to the ending point with an appropriate amount of extrusion -} - -inline bool look_for_lines_to_connect() { - xyz_pos_t s, e; - s.z = e.z = g26_layer_height; - - GRID_LOOP(i, j) { - - if (TERN0(HAS_LCD_MENU, user_canceled())) return true; - - if (i < (GRID_MAX_POINTS_X)) { // Can't connect to anything farther to the right than GRID_MAX_POINTS_X. - // Already a half circle at the edge of the bed. - - if (circle_flags.marked(i, j) && circle_flags.marked(i + 1, j)) { // Test whether a leftward line can be done - if (!horizontal_mesh_line_flags.marked(i, j)) { - // Two circles need a horizontal line to connect them - s.x = _GET_MESH_X( i ) + (INTERSECTION_CIRCLE_RADIUS - (CROSSHAIRS_SIZE)); // right edge - e.x = _GET_MESH_X(i + 1) - (INTERSECTION_CIRCLE_RADIUS - (CROSSHAIRS_SIZE)); // left edge - - #if HAS_ENDSTOPS - LIMIT(s.x, X_MIN_POS + 1, X_MAX_POS - 1); - s.y = e.y = constrain(_GET_MESH_Y(j), Y_MIN_POS + 1, Y_MAX_POS - 1); - LIMIT(e.x, X_MIN_POS + 1, X_MAX_POS - 1); - #else - s.y = e.y = _GET_MESH_Y(j); - #endif - - if (position_is_reachable(s.x, s.y) && position_is_reachable(e.x, e.y)) - print_line_from_here_to_there(s, e); - - horizontal_mesh_line_flags.mark(i, j); // Mark done, even if skipped - } - } - - if (j < (GRID_MAX_POINTS_Y)) { // Can't connect to anything further back than GRID_MAX_POINTS_Y. - // Already a half circle at the edge of the bed. - - if (circle_flags.marked(i, j) && circle_flags.marked(i, j + 1)) { // Test whether a downward line can be done - if (!vertical_mesh_line_flags.marked(i, j)) { - // Two circles that need a vertical line to connect them - s.y = _GET_MESH_Y( j ) + (INTERSECTION_CIRCLE_RADIUS - (CROSSHAIRS_SIZE)); // top edge - e.y = _GET_MESH_Y(j + 1) - (INTERSECTION_CIRCLE_RADIUS - (CROSSHAIRS_SIZE)); // bottom edge - - #if HAS_ENDSTOPS - s.x = e.x = constrain(_GET_MESH_X(i), X_MIN_POS + 1, X_MAX_POS - 1); - LIMIT(s.y, Y_MIN_POS + 1, Y_MAX_POS - 1); - LIMIT(e.y, Y_MIN_POS + 1, Y_MAX_POS - 1); - #else - s.x = e.x = _GET_MESH_X(i); - #endif - - if (position_is_reachable(s.x, s.y) && position_is_reachable(e.x, e.y)) - print_line_from_here_to_there(s, e); - - vertical_mesh_line_flags.mark(i, j); // Mark done, even if skipped - } - } - } + void retract_filament(const xyz_pos_t &where) { + if (!g26_retracted) { // Only retract if we are not already retracted! + g26_retracted = true; + move_to(where, -1.0f * retraction_multiplier); } } - return false; -} -/** - * Turn on the bed and nozzle heat and - * wait for them to get up to temperature. - */ -inline bool turn_on_heaters() { - - SERIAL_ECHOLNPGM("Waiting for heatup."); - - #if HAS_HEATED_BED - - if (g26_bed_temp > 25) { - #if HAS_WIRED_LCD - ui.set_status_P(GET_TEXT(MSG_G26_HEATING_BED), 99); - ui.quick_feedback(); - TERN_(HAS_LCD_MENU, ui.capture()); - #endif - thermalManager.setTargetBed(g26_bed_temp); - - // Wait for the temperature to stabilize - if (!thermalManager.wait_for_bed(true - #if G26_CLICK_CAN_CANCEL - , true - #endif - ) - ) return G26_ERR; - } - - #endif // HAS_HEATED_BED - - // Start heating the active nozzle - #if HAS_WIRED_LCD - ui.set_status_P(GET_TEXT(MSG_G26_HEATING_NOZZLE), 99); - ui.quick_feedback(); - #endif - thermalManager.setTargetHotend(g26_hotend_temp, active_extruder); - - // Wait for the temperature to stabilize - if (!thermalManager.wait_for_hotend(active_extruder, true - #if G26_CLICK_CAN_CANCEL - , true - #endif - )) return G26_ERR; - - #if HAS_WIRED_LCD - ui.reset_status(); - ui.quick_feedback(); - #endif - - return G26_OK; -} - -/** - * Prime the nozzle if needed. Return true on error. - */ -inline bool prime_nozzle() { - - const feedRate_t fr_slow_e = planner.settings.max_feedrate_mm_s[E_AXIS] / 15.0f; - #if HAS_LCD_MENU && !HAS_TOUCH_BUTTONS // ui.button_pressed issue with touchscreen - #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 - ui.capture(); - ui.set_status_P(GET_TEXT(MSG_G26_MANUAL_PRIME), 99); - ui.chirp(); - - destination = current_position; - - recover_filament(destination); // Make sure G26 doesn't think the filament is retracted(). - - while (!ui.button_pressed()) { - ui.chirp(); - destination.e += 0.25; - #if ENABLED(PREVENT_LENGTHY_EXTRUDE) - Total_Prime += 0.25; - if (Total_Prime >= EXTRUDE_MAXLENGTH) { - ui.release(); - return G26_ERR; - } - #endif - prepare_internal_move_to_destination(fr_slow_e); - destination = current_position; - planner.synchronize(); // Without this synchronize, the purge is more consistent, - // but because the planner has a buffer, we won't be able - // to stop as quickly. So we put up with the less smooth - // action to give the user a more responsive 'Stop'. - } - - ui.wait_for_release(); - - ui.set_status_P(GET_TEXT(MSG_G26_PRIME_DONE), 99); - ui.quick_feedback(); - ui.release(); - } - else - #endif - { - #if HAS_WIRED_LCD - ui.set_status_P(GET_TEXT(MSG_G26_FIXED_LENGTH), 99); - ui.quick_feedback(); - #endif - destination = current_position; - destination.e += g26_prime_length; - prepare_internal_move_to_destination(fr_slow_e); - destination.e -= g26_prime_length; + // TODO: Parameterize the Z lift with a define + void retract_lift_move(const xyz_pos_t &s) { retract_filament(destination); + move_to(current_position.x, current_position.y, current_position.z + 0.5f, 0.0f); // Z lift to minimize scraping + move_to(s.x, s.y, s.z + 0.5f, 0.0f); // Get to the starting point with no extrusion while lifted } - return G26_OK; -} + void recover_filament(const xyz_pos_t &where) { + if (g26_retracted) { // Only un-retract if we are retracted. + move_to(where, 1.2f * retraction_multiplier); + g26_retracted = false; + } + } + + /** + * print_line_from_here_to_there() takes two cartesian coordinates and draws a line from one + * to the other. But there are really three sets of coordinates involved. The first coordinate + * is the present location of the nozzle. We don't necessarily want to print from this location. + * We first need to move the nozzle to the start of line segment where we want to print. Once + * there, we can use the two coordinates supplied to draw the line. + * + * Note: Although we assume the first set of coordinates is the start of the line and the second + * set of coordinates is the end of the line, it does not always work out that way. This function + * optimizes the movement to minimize the travel distance before it can start printing. This saves + * a lot of time and eliminates a lot of nonsensical movement of the nozzle. However, it does + * cause a lot of very little short retracement of th nozzle when it draws the very first line + * segment of a 'circle'. The time this requires is very short and is easily saved by the other + * cases where the optimization comes into play. + */ + void print_line_from_here_to_there(const xyz_pos_t &s, const xyz_pos_t &e) { + + // Distances to the start / end of the line + xy_float_t svec = current_position - s, evec = current_position - e; + + const float dist_start = HYPOT2(svec.x, svec.y), + dist_end = HYPOT2(evec.x, evec.y), + line_length = HYPOT(e.x - s.x, e.y - s.y); + + // If the end point of the line is closer to the nozzle, flip the direction, + // moving from the end to the start. On very small lines the optimization isn't worth it. + if (dist_end < dist_start && (INTERSECTION_CIRCLE_RADIUS) < ABS(line_length)) + return print_line_from_here_to_there(e, s); + + // Decide whether to retract & lift + if (dist_start > 2.0) retract_lift_move(s); + + move_to(s, 0.0); // Get to the starting point with no extrusion / un-Z lift + + const float e_pos_delta = line_length * g26_e_axis_feedrate * extrusion_multiplier; + + recover_filament(destination); + move_to(e, e_pos_delta); // Get to the ending point with an appropriate amount of extrusion + } + + void connect_neighbor_with_line(const xy_int8_t &p1, int8_t dx, int8_t dy) { + xy_int8_t p2; + p2.x = p1.x + dx; + p2.y = p1.y + dy; + + if (p2.x < 0 || p2.x >= (GRID_MAX_POINTS_X)) return; + if (p2.y < 0 || p2.y >= (GRID_MAX_POINTS_Y)) return; + + if(circle_flags.marked(p1.x, p1.y) && circle_flags.marked(p2.x, p2.y)) { + xyz_pos_t s, e; + s.x = _GET_MESH_X(p1.x) + (INTERSECTION_CIRCLE_RADIUS - (CROSSHAIRS_SIZE)) * dx; + e.x = _GET_MESH_X(p2.x) - (INTERSECTION_CIRCLE_RADIUS - (CROSSHAIRS_SIZE)) * dx; + s.y = _GET_MESH_Y(p1.y) + (INTERSECTION_CIRCLE_RADIUS - (CROSSHAIRS_SIZE)) * dy; + e.y = _GET_MESH_Y(p2.y) - (INTERSECTION_CIRCLE_RADIUS - (CROSSHAIRS_SIZE)) * dy; + s.z = e.z = layer_height; + + #if HAS_ENDSTOPS + LIMIT(s.y, Y_MIN_POS + 1, Y_MAX_POS - 1); + LIMIT(e.y, Y_MIN_POS + 1, Y_MAX_POS - 1); + LIMIT(s.x, X_MIN_POS + 1, X_MAX_POS - 1); + LIMIT(e.x, X_MIN_POS + 1, X_MAX_POS - 1); + #endif + + if (position_is_reachable(s.x, s.y) && position_is_reachable(e.x, e.y)) + print_line_from_here_to_there(s, e); + } + } + + /** + * Turn on the bed and nozzle heat and + * wait for them to get up to temperature. + */ + bool turn_on_heaters() { + + SERIAL_ECHOLNPGM("Waiting for heatup."); + + #if HAS_HEATED_BED + + if (bed_temp > 25) { + #if HAS_WIRED_LCD + ui.set_status_P(GET_TEXT(MSG_G26_HEATING_BED), 99); + ui.quick_feedback(); + TERN_(HAS_LCD_MENU, ui.capture()); + #endif + thermalManager.setTargetBed(bed_temp); + + // Wait for the temperature to stabilize + if (!thermalManager.wait_for_bed(true + #if G26_CLICK_CAN_CANCEL + , true + #endif + ) + ) return G26_ERR; + } + + #else + + UNUSED(bed_temp); + + #endif // HAS_HEATED_BED + + // Start heating the active nozzle + #if HAS_WIRED_LCD + ui.set_status_P(GET_TEXT(MSG_G26_HEATING_NOZZLE), 99); + ui.quick_feedback(); + #endif + thermalManager.setTargetHotend(hotend_temp, active_extruder); + + // Wait for the temperature to stabilize + if (!thermalManager.wait_for_hotend(active_extruder, true + #if G26_CLICK_CAN_CANCEL + , true + #endif + )) return G26_ERR; + + #if HAS_WIRED_LCD + ui.reset_status(); + ui.quick_feedback(); + #endif + + return G26_OK; + } + + /** + * Prime the nozzle if needed. Return true on error. + */ + bool prime_nozzle() { + + const feedRate_t fr_slow_e = planner.settings.max_feedrate_mm_s[E_AXIS] / 15.0f; + #if HAS_LCD_MENU && !HAS_TOUCH_BUTTONS // ui.button_pressed issue with touchscreen + #if ENABLED(PREVENT_LENGTHY_EXTRUDE) + float Total_Prime = 0.0; + #endif + + if (prime_flag == -1) { // The user wants to control how much filament gets purged + ui.capture(); + ui.set_status_P(GET_TEXT(MSG_G26_MANUAL_PRIME), 99); + ui.chirp(); + + destination = current_position; + + recover_filament(destination); // Make sure G26 doesn't think the filament is retracted(). + + while (!ui.button_pressed()) { + ui.chirp(); + destination.e += 0.25; + #if ENABLED(PREVENT_LENGTHY_EXTRUDE) + Total_Prime += 0.25; + if (Total_Prime >= EXTRUDE_MAXLENGTH) { + ui.release(); + return G26_ERR; + } + #endif + prepare_internal_move_to_destination(fr_slow_e); + destination = current_position; + planner.synchronize(); // Without this synchronize, the purge is more consistent, + // but because the planner has a buffer, we won't be able + // to stop as quickly. So we put up with the less smooth + // action to give the user a more responsive 'Stop'. + } + + ui.wait_for_release(); + + ui.set_status_P(GET_TEXT(MSG_G26_PRIME_DONE), 99); + ui.quick_feedback(); + ui.release(); + } + else + #endif + { + #if HAS_WIRED_LCD + ui.set_status_P(GET_TEXT(MSG_G26_FIXED_LENGTH), 99); + ui.quick_feedback(); + #endif + destination = current_position; + destination.e += prime_length; + prepare_internal_move_to_destination(fr_slow_e); + destination.e -= prime_length; + retract_filament(destination); + } + + return G26_OK; + } + + /** + * Find the nearest point at which to print a circle + */ + mesh_index_pair find_closest_circle_to_print(const xy_pos_t &pos) { + + mesh_index_pair out_point; + out_point.pos = -1; + + #if ENABLED(UBL_HILBERT_CURVE) + + auto test_func = [](uint8_t i, uint8_t j, void *data) -> bool { + if (!circle_flags.marked(i, j)) { + mesh_index_pair *out_point = (mesh_index_pair*)data; + out_point->pos.set(i, j); // Save its data + return true; + } + return false; + }; + + hilbert_curve::search_from_closest(pos, test_func, &out_point); + + #else + + float closest = 99999.99; + + GRID_LOOP(i, j) { + if (!circle_flags.marked(i, j)) { + // We found a circle that needs to be printed + const xy_pos_t m = { _GET_MESH_X(i), _GET_MESH_Y(j) }; + + // Get the distance to this intersection + float f = (pos - m).magnitude(); + + // It is possible that we are being called with the values + // to let us find the closest circle to the start position. + // But if this is not the case, add a small weighting to the + // distance calculation to help it choose a better place to continue. + f += (xy_pos - m).magnitude() / 15.0f; + + // Add the specified amount of Random Noise to our search + if (g26_random_deviation > 1.0) f += random(0.0, g26_random_deviation); + + if (f < closest) { + closest = f; // Found a closer un-printed location + out_point.pos.set(i, j); // Save its data + out_point.distance = closest; + } + } + } + + #endif + + circle_flags.mark(out_point); // Mark this location as done. + return out_point; + } + +} g26_helper_t; /** * G26: Mesh Validation Pattern generation. @@ -510,20 +516,11 @@ void GcodeSuite::G26() { // Change the tool first, if specified if (parser.seenval('T')) tool_change(parser.value_int()); - g26_extrusion_multiplier = EXTRUSION_MULTIPLIER; - g26_retraction_multiplier = G26_RETRACT_MULTIPLIER; - g26_layer_height = MESH_TEST_LAYER_HEIGHT; - g26_prime_length = PRIME_LENGTH; - g26_bed_temp = MESH_TEST_BED_TEMP; - g26_hotend_temp = MESH_TEST_HOTEND_TEMP; - g26_prime_flag = 0; + g26_helper_t g26; - float g26_nozzle = MESH_TEST_NOZZLE_SIZE, - g26_filament_diameter = DEFAULT_NOMINAL_FILAMENT_DIA, - g26_ooze_amount = parser.linearval('O', OOZE_AMOUNT); - - bool g26_continue_with_closest = parser.boolval('C'), - g26_keep_heaters_on = parser.boolval('K'); + g26.ooze_amount = parser.linearval('O', OOZE_AMOUNT); + g26.continue_with_closest = parser.boolval('C'); + g26.keep_heaters_on = parser.boolval('K'); // Accept 'I' if temperature presets are defined #if PREHEAT_COUNT @@ -548,14 +545,14 @@ void GcodeSuite::G26() { SERIAL_ECHOLNPAIR("?Specified bed temperature not plausible (40-", BED_MAX_TARGET, "C)."); return; } - g26_bed_temp = bedtemp; + g26.bed_temp = bedtemp; } #endif // HAS_HEATED_BED if (parser.seenval('L')) { - g26_layer_height = parser.value_linear_units(); - if (!WITHIN(g26_layer_height, 0.0, 2.0)) { + g26.layer_height = parser.value_linear_units(); + if (!WITHIN(g26.layer_height, 0.0, 2.0)) { SERIAL_ECHOLNPGM("?Specified layer height not plausible."); return; } @@ -563,8 +560,8 @@ void GcodeSuite::G26() { if (parser.seen('Q')) { if (parser.has_value()) { - g26_retraction_multiplier = parser.value_float(); - if (!WITHIN(g26_retraction_multiplier, 0.05, 15.0)) { + g26.retraction_multiplier = parser.value_float(); + if (!WITHIN(g26.retraction_multiplier, 0.05, 15.0)) { SERIAL_ECHOLNPGM("?Specified Retraction Multiplier not plausible."); return; } @@ -576,8 +573,8 @@ void GcodeSuite::G26() { } if (parser.seenval('S')) { - g26_nozzle = parser.value_float(); - if (!WITHIN(g26_nozzle, 0.1, 2.0)) { + g26.nozzle = parser.value_float(); + if (!WITHIN(g26.nozzle, 0.1, 2.0)) { SERIAL_ECHOLNPGM("?Specified nozzle size not plausible."); return; } @@ -586,16 +583,16 @@ void GcodeSuite::G26() { if (parser.seen('P')) { if (!parser.has_value()) { #if HAS_LCD_MENU - g26_prime_flag = -1; + g26.prime_flag = -1; #else SERIAL_ECHOLNPGM("?Prime length must be specified when not using an LCD."); return; #endif } else { - g26_prime_flag++; - g26_prime_length = parser.value_linear_units(); - if (!WITHIN(g26_prime_length, 0.0, 25.0)) { + g26.prime_flag++; + g26.prime_length = parser.value_linear_units(); + if (!WITHIN(g26.prime_length, 0.0, 25.0)) { SERIAL_ECHOLNPGM("?Specified prime length not plausible."); return; } @@ -603,17 +600,17 @@ void GcodeSuite::G26() { } if (parser.seenval('F')) { - g26_filament_diameter = parser.value_linear_units(); - if (!WITHIN(g26_filament_diameter, 1.0, 4.0)) { + g26.filament_diameter = parser.value_linear_units(); + if (!WITHIN(g26.filament_diameter, 1.0, 4.0)) { SERIAL_ECHOLNPGM("?Specified filament size not plausible."); return; } } - g26_extrusion_multiplier *= sq(1.75) / sq(g26_filament_diameter); // If we aren't using 1.75mm filament, we need to + g26.extrusion_multiplier *= sq(1.75) / sq(g26.filament_diameter); // If we aren't using 1.75mm filament, we need to // scale up or down the length needed to get the // same volume of filament - g26_extrusion_multiplier *= g26_filament_diameter * sq(g26_nozzle) / sq(0.3); // Scale up by nozzle size + g26.extrusion_multiplier *= g26.filament_diameter * sq(g26.nozzle) / sq(0.3); // Scale up by nozzle size // Get a temperature from 'I' or 'H' celsius_t noztemp = 0; @@ -632,7 +629,7 @@ void GcodeSuite::G26() { SERIAL_ECHOLNPGM("?Specified nozzle temperature not plausible."); return; } - g26_hotend_temp = noztemp; + g26.hotend_temp = noztemp; } // 'U' to Randomize and optionally set circle deviation @@ -660,9 +657,9 @@ void GcodeSuite::G26() { } // Set a position with 'X' and/or 'Y'. Default: current_position - g26_xy_pos.set(parser.seenval('X') ? RAW_X_POSITION(parser.value_linear_units()) : current_position.x, + g26.xy_pos.set(parser.seenval('X') ? RAW_X_POSITION(parser.value_linear_units()) : current_position.x, parser.seenval('Y') ? RAW_Y_POSITION(parser.value_linear_units()) : current_position.y); - if (!position_is_reachable(g26_xy_pos)) { + if (!position_is_reachable(g26.xy_pos)) { SERIAL_ECHOLNPGM("?Specified X,Y coordinate out of bounds."); return; } @@ -680,12 +677,12 @@ void GcodeSuite::G26() { planner.calculate_volumetric_multipliers(); #endif - if (turn_on_heaters() != G26_OK) goto LEAVE; + if (g26.turn_on_heaters() != G26_OK) goto LEAVE; current_position.e = 0.0; sync_plan_position_e(); - if (g26_prime_flag && prime_nozzle() != G26_OK) goto LEAVE; + if (g26.prime_flag && g26.prime_nozzle() != G26_OK) goto LEAVE; /** * Bed is preheated @@ -698,14 +695,12 @@ void GcodeSuite::G26() { */ circle_flags.reset(); - horizontal_mesh_line_flags.reset(); - vertical_mesh_line_flags.reset(); // Move nozzle to the specified height for the first layer destination = current_position; - destination.z = g26_layer_height; + destination.z = g26.layer_height; move_to(destination, 0.0); - move_to(destination, g26_ooze_amount); + move_to(destination, g26.ooze_amount); TERN_(HAS_LCD_MENU, ui.capture()); @@ -732,7 +727,7 @@ void GcodeSuite::G26() { mesh_index_pair location; do { // Find the nearest confluence - location = find_closest_circle_to_print(g26_continue_with_closest ? xy_pos_t(current_position) : g26_xy_pos); + location = g26.find_closest_circle_to_print(g26.continue_with_closest ? xy_pos_t(current_position) : g26.xy_pos); if (location.valid()) { const xy_pos_t circle = _GET_MESH_POS(location.pos); @@ -762,7 +757,7 @@ void GcodeSuite::G26() { if (!b) { e.x = circle.x; e.y += INTERSECTION_CIRCLE_RADIUS; } arc_length = (f || b) ? ARC_LENGTH(1) : ARC_LENGTH(2); } - else if (r) { // right edge + else if (r) { // right edge if (b) s.set(circle.x - (INTERSECTION_CIRCLE_RADIUS), circle.y); else s.set(circle.x, circle.y + INTERSECTION_CIRCLE_RADIUS); if (f) e.set(circle.x - (INTERSECTION_CIRCLE_RADIUS), circle.y); @@ -782,25 +777,24 @@ void GcodeSuite::G26() { const xy_float_t dist = current_position - s; // Distance from the start of the actual circle const float dist_start = HYPOT2(dist.x, dist.y); const xyze_pos_t endpoint = { - e.x, e.y, g26_layer_height, - current_position.e + (arc_length * g26_e_axis_feedrate * g26_extrusion_multiplier) + e.x, e.y, g26.layer_height, + current_position.e + (arc_length * g26_e_axis_feedrate * g26.extrusion_multiplier) }; if (dist_start > 2.0) { - s.z = g26_layer_height + 0.5f; - retract_lift_move(s); + s.z = g26.layer_height + 0.5f; + g26.retract_lift_move(s); } - s.z = g26_layer_height; + s.z = g26.layer_height; move_to(s, 0.0); // Get to the starting point with no extrusion / un-Z lift - recover_filament(destination); + g26.recover_filament(destination); - const feedRate_t old_feedrate = feedrate_mm_s; - feedrate_mm_s = PLANNER_XY_FEEDRATE() * 0.1f; - plan_arc(endpoint, arc_offset, false, 0); // Draw a counter-clockwise arc - feedrate_mm_s = old_feedrate; - destination = current_position; + { REMEMBER(fr, feedrate_mm_s, PLANNER_XY_FEEDRATE() * 0.1f); + plan_arc(endpoint, arc_offset, false, 0); // Draw a counter-clockwise arc + destination = current_position; + } if (TERN0(HAS_LCD_MENU, user_canceled())) goto LEAVE; // Check if the user wants to stop the Mesh Validation @@ -828,8 +822,8 @@ void GcodeSuite::G26() { if (TERN0(HAS_LCD_MENU, user_canceled())) goto LEAVE; // Check if the user wants to stop the Mesh Validation - xyz_float_t p = { circle.x + _COS(ind ), circle.y + _SIN(ind ), g26_layer_height }, - q = { circle.x + _COS(ind + 1), circle.y + _SIN(ind + 1), g26_layer_height }; + xyz_float_t p = { circle.x + _COS(ind ), circle.y + _SIN(ind ), g26.layer_height }, + q = { circle.x + _COS(ind + 1), circle.y + _SIN(ind + 1), g26.layer_height }; #if IS_KINEMATIC // Check to make sure this segment is entirely on the bed, skip if not. @@ -841,13 +835,17 @@ void GcodeSuite::G26() { LIMIT(q.y, Y_MIN_POS + 1, Y_MAX_POS - 1); #endif - print_line_from_here_to_there(p, q); + g26.print_line_from_here_to_there(p, q); SERIAL_FLUSH(); // Prevent host M105 buffer overrun. } #endif // !ARC_SUPPORT - if (look_for_lines_to_connect()) goto LEAVE; + g26.connect_neighbor_with_line(location.pos, -1, 0); + g26.connect_neighbor_with_line(location.pos, 1, 0); + g26.connect_neighbor_with_line(location.pos, 0, -1); + g26.connect_neighbor_with_line(location.pos, 0, 1); + if (TERN0(HAS_LCD_MENU, user_canceled())) goto LEAVE; } SERIAL_FLUSH(); // Prevent host M105 buffer overrun. @@ -857,12 +855,9 @@ void GcodeSuite::G26() { LEAVE: ui.set_status_P(GET_TEXT(MSG_G26_LEAVING), -1); - retract_filament(destination); + g26.retract_filament(destination); destination.z = Z_CLEARANCE_BETWEEN_PROBES; - move_to(destination, 0); // Raise the nozzle - - destination = g26_xy_pos; // Move back to the starting XY position - move_to(destination, 0); // Move back to the starting position + move_to(destination, 0); // Raise the nozzle #if DISABLED(NO_VOLUMETRICS) parser.volumetric_enabled = volumetric_was_enabled; @@ -871,7 +866,7 @@ void GcodeSuite::G26() { TERN_(HAS_LCD_MENU, ui.release()); // Give back control of the LCD - if (!g26_keep_heaters_on) { + if (!g26.keep_heaters_on) { TERN_(HAS_HEATED_BED, thermalManager.setTargetBed(0)); thermalManager.setTargetHotend(active_extruder, 0); } diff --git a/Marlin/src/gcode/bedlevel/M420.cpp b/Marlin/src/gcode/bedlevel/M420.cpp index 55b14c19dc..e42a590265 100644 --- a/Marlin/src/gcode/bedlevel/M420.cpp +++ b/Marlin/src/gcode/bedlevel/M420.cpp @@ -68,8 +68,8 @@ void GcodeSuite::M420() { y_min = probe.min_y(), y_max = probe.max_y(); #if ENABLED(AUTO_BED_LEVELING_BILINEAR) bilinear_start.set(x_min, y_min); - bilinear_grid_spacing.set((x_max - x_min) / (GRID_MAX_POINTS_X - 1), - (y_max - y_min) / (GRID_MAX_POINTS_Y - 1)); + bilinear_grid_spacing.set((x_max - x_min) / (GRID_MAX_CELLS_X), + (y_max - y_min) / (GRID_MAX_CELLS_Y)); #endif GRID_LOOP(x, y) { Z_VALUES(x, y) = 0.001 * random(-200, 200); diff --git a/Marlin/src/gcode/bedlevel/abl/G29.cpp b/Marlin/src/gcode/bedlevel/abl/G29.cpp index 42d3a75da1..654a381383 100644 --- a/Marlin/src/gcode/bedlevel/abl/G29.cpp +++ b/Marlin/src/gcode/bedlevel/abl/G29.cpp @@ -295,10 +295,10 @@ G29_TYPE GcodeSuite::G29() { // Get nearest i / j from rx / ry i = (rx - bilinear_start.x + 0.5 * abl.gridSpacing.x) / abl.gridSpacing.x; j = (ry - bilinear_start.y + 0.5 * abl.gridSpacing.y) / abl.gridSpacing.y; - LIMIT(i, 0, GRID_MAX_POINTS_X - 1); - LIMIT(j, 0, GRID_MAX_POINTS_Y - 1); + LIMIT(i, 0, (GRID_MAX_POINTS_X) - 1); + LIMIT(j, 0, (GRID_MAX_POINTS_Y) - 1); } - if (WITHIN(i, 0, GRID_MAX_POINTS_X - 1) && WITHIN(j, 0, GRID_MAX_POINTS_Y)) { + if (WITHIN(i, 0, (GRID_MAX_POINTS_X) - 1) && WITHIN(j, 0, (GRID_MAX_POINTS_Y) - 1)) { set_bed_leveling_enabled(false); z_values[i][j] = rz; TERN_(ABL_BILINEAR_SUBDIVISION, bed_level_virt_interpolate()); diff --git a/Marlin/src/gcode/bedlevel/mbl/G29.cpp b/Marlin/src/gcode/bedlevel/mbl/G29.cpp index 278a39b4f8..1ec514c3ec 100644 --- a/Marlin/src/gcode/bedlevel/mbl/G29.cpp +++ b/Marlin/src/gcode/bedlevel/mbl/G29.cpp @@ -106,7 +106,7 @@ void GcodeSuite::G29() { SET_SOFT_ENDSTOP_LOOSE(false); } // If there's another point to sample, move there with optional lift. - if (mbl_probe_index < GRID_MAX_POINTS) { + if (mbl_probe_index < (GRID_MAX_POINTS)) { // Disable software endstops to allow manual adjustment // If G29 is left hanging without completion they won't be re-enabled! SET_SOFT_ENDSTOP_LOOSE(true); @@ -142,8 +142,8 @@ void GcodeSuite::G29() { case MeshSet: if (parser.seenval('I')) { ix = parser.value_int(); - if (!WITHIN(ix, 0, GRID_MAX_POINTS_X - 1)) { - SERIAL_ECHOLNPAIR("I out of range (0-", GRID_MAX_POINTS_X - 1, ")"); + if (!WITHIN(ix, 0, (GRID_MAX_POINTS_X) - 1)) { + SERIAL_ECHOLNPAIR("I out of range (0-", (GRID_MAX_POINTS_X) - 1, ")"); return; } } @@ -152,8 +152,8 @@ void GcodeSuite::G29() { if (parser.seenval('J')) { iy = parser.value_int(); - if (!WITHIN(iy, 0, GRID_MAX_POINTS_Y - 1)) { - SERIAL_ECHOLNPAIR("J out of range (0-", GRID_MAX_POINTS_Y - 1, ")"); + if (!WITHIN(iy, 0, (GRID_MAX_POINTS_Y) - 1)) { + SERIAL_ECHOLNPAIR("J out of range (0-", (GRID_MAX_POINTS_Y) - 1, ")"); return; } } diff --git a/Marlin/src/inc/Conditionals_post.h b/Marlin/src/inc/Conditionals_post.h index 2433050528..337cf2a950 100644 --- a/Marlin/src/inc/Conditionals_post.h +++ b/Marlin/src/inc/Conditionals_post.h @@ -224,6 +224,11 @@ #endif #endif +#ifdef GRID_MAX_POINTS_X + #define GRID_MAX_CELLS_X (GRID_MAX_POINTS_X - 1) + #define GRID_MAX_CELLS_Y (GRID_MAX_POINTS_Y - 1) +#endif + /** * Host keep alive */ diff --git a/Marlin/src/inc/SanityCheck.h b/Marlin/src/inc/SanityCheck.h index 647e0d55dd..48a536b531 100644 --- a/Marlin/src/inc/SanityCheck.h +++ b/Marlin/src/inc/SanityCheck.h @@ -1263,9 +1263,9 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS #elif ENABLED(DELTA_CALIBRATION_MENU) && !HAS_LCD_MENU #error "DELTA_CALIBRATION_MENU requires an LCD Controller." #elif ABL_USES_GRID - #if (GRID_MAX_POINTS_X & 1) == 0 || (GRID_MAX_POINTS_Y & 1) == 0 + #if ((GRID_MAX_POINTS_X) & 1) == 0 || ((GRID_MAX_POINTS_Y) & 1) == 0 #error "DELTA requires GRID_MAX_POINTS_X and GRID_MAX_POINTS_Y to be odd numbers." - #elif GRID_MAX_POINTS_X < 3 + #elif (GRID_MAX_POINTS_X) < 3 #error "DELTA requires GRID_MAX_POINTS_X and GRID_MAX_POINTS_Y to be 3 or higher." #endif #endif @@ -1518,7 +1518,7 @@ static_assert(Y_MAX_LENGTH >= Y_BED_SIZE, "Movement bounds (Y_MIN_POS, Y_MAX_POS // Mesh Bed Leveling #if ENABLED(DELTA) #error "MESH_BED_LEVELING is not compatible with DELTA printers." - #elif GRID_MAX_POINTS_X > 9 || GRID_MAX_POINTS_Y > 9 + #elif (GRID_MAX_POINTS_X) > 9 || (GRID_MAX_POINTS_Y) > 9 #error "GRID_MAX_POINTS_X and GRID_MAX_POINTS_Y must be less than 10 for MBL." #endif diff --git a/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp b/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp index e18ed7273c..61c7ce18d6 100644 --- a/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp +++ b/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp @@ -1279,7 +1279,7 @@ void MarlinUI::draw_status_screen() { pixels_per_x_mesh_pnt, pixels_per_y_mesh_pnt, suppress_x_offset = 0, suppress_y_offset = 0; - const uint8_t y_plot_inv = (GRID_MAX_POINTS_Y - 1) - y_plot; + const uint8_t y_plot_inv = (GRID_MAX_POINTS_Y) - 1 - y_plot; upper_left.column = 0; upper_left.row = 0; diff --git a/Marlin/src/lcd/dogm/marlinui_DOGM.cpp b/Marlin/src/lcd/dogm/marlinui_DOGM.cpp index e41ed62573..44ada03c7e 100644 --- a/Marlin/src/lcd/dogm/marlinui_DOGM.cpp +++ b/Marlin/src/lcd/dogm/marlinui_DOGM.cpp @@ -529,7 +529,7 @@ void MarlinUI::clear_lcd() { } // Automatically cleared by Picture Loop // Fill in the Specified Mesh Point - const uint8_t y_plot_inv = (GRID_MAX_POINTS_Y - 1) - y_plot; // The origin is typically in the lower right corner. We need to + const uint8_t y_plot_inv = (GRID_MAX_POINTS_Y) - 1 - y_plot; // The origin is typically in the lower right corner. We need to // invert the Y to get it to plot in the right location. const u8g_uint_t by = y_offset + y_plot_inv * pixels_per_y_mesh_pnt; diff --git a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp index f8b4b5b5d1..cba27931f2 100644 --- a/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp +++ b/Marlin/src/lcd/extui/lib/ftdi_eve_touch_ui/screens/bed_mesh_screen.cpp @@ -53,12 +53,12 @@ constexpr static float gaugeThickness = 0.25; #endif void BedMeshScreen::drawMesh(int16_t x, int16_t y, int16_t w, int16_t h, ExtUI::bed_mesh_t data, uint8_t opts, float autoscale_max) { - constexpr uint8_t rows = GRID_MAX_POINTS_Y; - constexpr uint8_t cols = GRID_MAX_POINTS_X; + constexpr uint8_t rows = GRID_MAX_POINTS_Y; + constexpr uint8_t cols = GRID_MAX_POINTS_X; - #define VALUE(X,Y) (data ? data[X][Y] : 0) - #define ISVAL(X,Y) (data ? !isnan(VALUE(X,Y)) : true) - #define HEIGHT(X,Y) (ISVAL(X,Y) ? (VALUE(X,Y) - val_min) * scale_z : 0) + #define VALUE(X,Y) (data ? data[X][Y] : 0) + #define ISVAL(X,Y) (data ? !isnan(VALUE(X,Y)) : true) + #define HEIGHT(X,Y) (ISVAL(X,Y) ? (VALUE(X,Y) - val_min) * scale_z : 0) // Compute the mean, min and max for the points diff --git a/Marlin/src/lcd/extui/ui_api.cpp b/Marlin/src/lcd/extui/ui_api.cpp index 2eecda9df0..2cac0f8e77 100644 --- a/Marlin/src/lcd/extui/ui_api.cpp +++ b/Marlin/src/lcd/extui/ui_api.cpp @@ -859,7 +859,7 @@ namespace ExtUI { bed_mesh_t& getMeshArray() { return Z_VALUES_ARR; } float getMeshPoint(const xy_uint8_t &pos) { return Z_VALUES(pos.x, pos.y); } void setMeshPoint(const xy_uint8_t &pos, const_float_t zoff) { - if (WITHIN(pos.x, 0, GRID_MAX_POINTS_X) && WITHIN(pos.y, 0, GRID_MAX_POINTS_Y)) { + if (WITHIN(pos.x, 0, (GRID_MAX_POINTS_X) - 1) && WITHIN(pos.y, 0, (GRID_MAX_POINTS_Y) - 1)) { Z_VALUES(pos.x, pos.y) = zoff; TERN_(ABL_BILINEAR_SUBDIVISION, bed_level_virt_interpolate()); } diff --git a/Marlin/src/lcd/menu/menu_bed_leveling.cpp b/Marlin/src/lcd/menu/menu_bed_leveling.cpp index 6a9f89f118..5fc9fbccbd 100644 --- a/Marlin/src/lcd/menu/menu_bed_leveling.cpp +++ b/Marlin/src/lcd/menu/menu_bed_leveling.cpp @@ -214,8 +214,8 @@ static uint8_t xind, yind; // =0 START_MENU(); BACK_ITEM(MSG_BED_LEVELING); - EDIT_ITEM(uint8, MSG_MESH_X, &xind, 0, GRID_MAX_POINTS_X - 1); - EDIT_ITEM(uint8, MSG_MESH_Y, &yind, 0, GRID_MAX_POINTS_Y - 1); + EDIT_ITEM(uint8, MSG_MESH_X, &xind, 0, (GRID_MAX_POINTS_X) - 1); + EDIT_ITEM(uint8, MSG_MESH_Y, &yind, 0, (GRID_MAX_POINTS_Y) - 1); EDIT_ITEM_FAST(float43, MSG_MESH_EDIT_Z, &Z_VALUES(xind, yind), -(LCD_PROBE_Z_RANGE) * 0.5, (LCD_PROBE_Z_RANGE) * 0.5, refresh_planner); END_MENU(); } diff --git a/Marlin/src/lcd/menu/menu_ubl.cpp b/Marlin/src/lcd/menu/menu_ubl.cpp index 876c9ae621..1ab44856dc 100644 --- a/Marlin/src/lcd/menu/menu_ubl.cpp +++ b/Marlin/src/lcd/menu/menu_ubl.cpp @@ -484,8 +484,8 @@ void ubl_map_screen() { #if IS_KINEMATIC n_edit_pts = 9; // TODO: Delta accessible edit points #else - const bool xc = WITHIN(x, 1, GRID_MAX_POINTS_X - 2), - yc = WITHIN(y, 1, GRID_MAX_POINTS_Y - 2); + const bool xc = WITHIN(x, 1, (GRID_MAX_POINTS_X) - 2), + yc = WITHIN(y, 1, (GRID_MAX_POINTS_Y) - 2); n_edit_pts = yc ? (xc ? 9 : 6) : (xc ? 6 : 4); // Corners #endif diff --git a/Marlin/src/lcd/tft/ui_320x240.cpp b/Marlin/src/lcd/tft/ui_320x240.cpp index 793ee60847..5563d3069b 100644 --- a/Marlin/src/lcd/tft/ui_320x240.cpp +++ b/Marlin/src/lcd/tft/ui_320x240.cpp @@ -462,12 +462,12 @@ void MenuItem_confirm::draw_select_screen(PGM_P const yes, PGM_P const no, const tft.set_background(COLOR_BACKGROUND); tft.add_rectangle(0, 0, GRID_WIDTH, GRID_HEIGHT, COLOR_WHITE); - for (uint16_t x = 0; x < GRID_MAX_POINTS_X ; x++) - for (uint16_t y = 0; y < GRID_MAX_POINTS_Y ; y++) + for (uint16_t x = 0; x < (GRID_MAX_POINTS_X); x++) + for (uint16_t y = 0; y < (GRID_MAX_POINTS_Y); y++) if (position_is_reachable({ ubl.mesh_index_to_xpos(x), ubl.mesh_index_to_ypos(y) })) - tft.add_bar(1 + (x * 2 + 1) * (GRID_WIDTH - 4) / GRID_MAX_POINTS_X / 2, GRID_HEIGHT - 3 - ((y * 2 + 1) * (GRID_HEIGHT - 4) / GRID_MAX_POINTS_Y / 2), 2, 2, COLOR_UBL); + tft.add_bar(1 + (x * 2 + 1) * (GRID_WIDTH - 4) / (GRID_MAX_POINTS_X) / 2, GRID_HEIGHT - 3 - ((y * 2 + 1) * (GRID_HEIGHT - 4) / (GRID_MAX_POINTS_Y) / 2), 2, 2, COLOR_UBL); - tft.add_rectangle((x_plot * 2 + 1) * (GRID_WIDTH - 4) / GRID_MAX_POINTS_X / 2 - 1, GRID_HEIGHT - 5 - ((y_plot * 2 + 1) * (GRID_HEIGHT - 4) / GRID_MAX_POINTS_Y / 2), 6, 6, COLOR_UBL); + tft.add_rectangle((x_plot * 2 + 1) * (GRID_WIDTH - 4) / (GRID_MAX_POINTS_X) / 2 - 1, GRID_HEIGHT - 5 - ((y_plot * 2 + 1) * (GRID_HEIGHT - 4) / (GRID_MAX_POINTS_Y) / 2), 6, 6, COLOR_UBL); const xy_pos_t pos = { ubl.mesh_index_to_xpos(x_plot), ubl.mesh_index_to_ypos(y_plot) }, lpos = pos.asLogical(); @@ -512,9 +512,9 @@ void MenuItem_confirm::draw_select_screen(PGM_P const yes, PGM_P const no, const #if ENABLED(TOUCH_SCREEN) touch.clear(); draw_menu_navigation = false; - add_control(GRID_OFFSET_X + GRID_WIDTH + CONTROL_OFFSET, GRID_OFFSET_Y + CONTROL_OFFSET, UBL, ENCODER_STEPS_PER_MENU_ITEM * GRID_MAX_POINTS_X, imgUp); - add_control(GRID_OFFSET_X + GRID_WIDTH + CONTROL_OFFSET, GRID_OFFSET_Y + GRID_HEIGHT - CONTROL_OFFSET - 32, UBL, - ENCODER_STEPS_PER_MENU_ITEM * GRID_MAX_POINTS_X, imgDown); - add_control(GRID_OFFSET_X + CONTROL_OFFSET, GRID_OFFSET_Y + GRID_HEIGHT + CONTROL_OFFSET, UBL, - ENCODER_STEPS_PER_MENU_ITEM, imgLeft); + add_control(GRID_OFFSET_X + GRID_WIDTH + CONTROL_OFFSET, GRID_OFFSET_Y + CONTROL_OFFSET, UBL, (ENCODER_STEPS_PER_MENU_ITEM) * (GRID_MAX_POINTS_X), imgUp); + add_control(GRID_OFFSET_X + GRID_WIDTH + CONTROL_OFFSET, GRID_OFFSET_Y + GRID_HEIGHT - CONTROL_OFFSET - 32, UBL, -(ENCODER_STEPS_PER_MENU_ITEM) * (GRID_MAX_POINTS_X), imgDown); + add_control(GRID_OFFSET_X + CONTROL_OFFSET, GRID_OFFSET_Y + GRID_HEIGHT + CONTROL_OFFSET, UBL, -(ENCODER_STEPS_PER_MENU_ITEM), imgLeft); add_control(GRID_OFFSET_X + GRID_WIDTH - CONTROL_OFFSET - 32, GRID_OFFSET_Y + GRID_HEIGHT + CONTROL_OFFSET, UBL, ENCODER_STEPS_PER_MENU_ITEM, imgRight); add_control(224, GRID_OFFSET_Y + GRID_HEIGHT + CONTROL_OFFSET, CLICK, imgLeveling); add_control(144, 206, BACK, imgBack); diff --git a/Marlin/src/lcd/tft/ui_480x320.cpp b/Marlin/src/lcd/tft/ui_480x320.cpp index a8979d0ca6..21b280ac75 100644 --- a/Marlin/src/lcd/tft/ui_480x320.cpp +++ b/Marlin/src/lcd/tft/ui_480x320.cpp @@ -462,12 +462,12 @@ void MenuItem_confirm::draw_select_screen(PGM_P const yes, PGM_P const no, const tft.set_background(COLOR_BACKGROUND); tft.add_rectangle(0, 0, GRID_WIDTH, GRID_HEIGHT, COLOR_WHITE); - for (uint16_t x = 0; x < GRID_MAX_POINTS_X ; x++) - for (uint16_t y = 0; y < GRID_MAX_POINTS_Y ; y++) + for (uint16_t x = 0; x < (GRID_MAX_POINTS_X); x++) + for (uint16_t y = 0; y < (GRID_MAX_POINTS_Y); y++) if (position_is_reachable({ ubl.mesh_index_to_xpos(x), ubl.mesh_index_to_ypos(y) })) - tft.add_bar(1 + (x * 2 + 1) * (GRID_WIDTH - 4) / GRID_MAX_POINTS_X / 2, GRID_HEIGHT - 3 - ((y * 2 + 1) * (GRID_HEIGHT - 4) / GRID_MAX_POINTS_Y / 2), 2, 2, COLOR_UBL); + tft.add_bar(1 + (x * 2 + 1) * (GRID_WIDTH - 4) / (GRID_MAX_POINTS_X) / 2, GRID_HEIGHT - 3 - ((y * 2 + 1) * (GRID_HEIGHT - 4) / (GRID_MAX_POINTS_Y) / 2), 2, 2, COLOR_UBL); - tft.add_rectangle((x_plot * 2 + 1) * (GRID_WIDTH - 4) / GRID_MAX_POINTS_X / 2 - 1, GRID_HEIGHT - 5 - ((y_plot * 2 + 1) * (GRID_HEIGHT - 4) / GRID_MAX_POINTS_Y / 2), 6, 6, COLOR_UBL); + tft.add_rectangle((x_plot * 2 + 1) * (GRID_WIDTH - 4) / (GRID_MAX_POINTS_X) / 2 - 1, GRID_HEIGHT - 5 - ((y_plot * 2 + 1) * (GRID_HEIGHT - 4) / (GRID_MAX_POINTS_Y) / 2), 6, 6, COLOR_UBL); const xy_pos_t pos = { ubl.mesh_index_to_xpos(x_plot), ubl.mesh_index_to_ypos(y_plot) }, lpos = pos.asLogical(); @@ -512,9 +512,9 @@ void MenuItem_confirm::draw_select_screen(PGM_P const yes, PGM_P const no, const #if ENABLED(TOUCH_SCREEN) touch.clear(); draw_menu_navigation = false; - add_control(GRID_OFFSET_X + GRID_WIDTH + CONTROL_OFFSET, GRID_OFFSET_Y + CONTROL_OFFSET, UBL, ENCODER_STEPS_PER_MENU_ITEM * GRID_MAX_POINTS_X, imgUp); - add_control(GRID_OFFSET_X + GRID_WIDTH + CONTROL_OFFSET, GRID_OFFSET_Y + GRID_HEIGHT - CONTROL_OFFSET - 32, UBL, - ENCODER_STEPS_PER_MENU_ITEM * GRID_MAX_POINTS_X, imgDown); - add_control(GRID_OFFSET_X + CONTROL_OFFSET, GRID_OFFSET_Y + GRID_HEIGHT + CONTROL_OFFSET, UBL, - ENCODER_STEPS_PER_MENU_ITEM, imgLeft); + add_control(GRID_OFFSET_X + GRID_WIDTH + CONTROL_OFFSET, GRID_OFFSET_Y + CONTROL_OFFSET, UBL, (ENCODER_STEPS_PER_MENU_ITEM) * (GRID_MAX_POINTS_X), imgUp); + add_control(GRID_OFFSET_X + GRID_WIDTH + CONTROL_OFFSET, GRID_OFFSET_Y + GRID_HEIGHT - CONTROL_OFFSET - 32, UBL, -(ENCODER_STEPS_PER_MENU_ITEM) * (GRID_MAX_POINTS_X), imgDown); + add_control(GRID_OFFSET_X + CONTROL_OFFSET, GRID_OFFSET_Y + GRID_HEIGHT + CONTROL_OFFSET, UBL, -(ENCODER_STEPS_PER_MENU_ITEM), imgLeft); add_control(GRID_OFFSET_X + GRID_WIDTH - CONTROL_OFFSET - 32, GRID_OFFSET_Y + GRID_HEIGHT + CONTROL_OFFSET, UBL, ENCODER_STEPS_PER_MENU_ITEM, imgRight); add_control(320, GRID_OFFSET_Y + GRID_HEIGHT + CONTROL_OFFSET, CLICK, imgLeveling); add_control(224, TFT_HEIGHT - 34, BACK, imgBack); diff --git a/Marlin/src/module/settings.cpp b/Marlin/src/module/settings.cpp index ced33a1986..915886fe4a 100644 --- a/Marlin/src/module/settings.cpp +++ b/Marlin/src/module/settings.cpp @@ -1605,7 +1605,7 @@ void MarlinSettings::postprocess() { #if ENABLED(MESH_BED_LEVELING) if (!validating) mbl.z_offset = dummyf; - if (mesh_num_x == GRID_MAX_POINTS_X && mesh_num_y == GRID_MAX_POINTS_Y) { + if (mesh_num_x == (GRID_MAX_POINTS_X) && mesh_num_y == (GRID_MAX_POINTS_Y)) { // EEPROM data fits the current mesh EEPROM_READ(mbl.z_values); } @@ -1652,7 +1652,7 @@ void MarlinSettings::postprocess() { EEPROM_READ_ALWAYS(grid_max_x); // 1 byte EEPROM_READ_ALWAYS(grid_max_y); // 1 byte #if ENABLED(AUTO_BED_LEVELING_BILINEAR) - if (grid_max_x == GRID_MAX_POINTS_X && grid_max_y == GRID_MAX_POINTS_Y) { + if (grid_max_x == (GRID_MAX_POINTS_X) && grid_max_y == (GRID_MAX_POINTS_Y)) { if (!validating) set_bed_leveling_enabled(false); EEPROM_READ(bilinear_grid_spacing); // 2 ints EEPROM_READ(bilinear_start); // 2 ints From 6747d350a53ff78be2e7679cb3e9afec0d9aca52 Mon Sep 17 00:00:00 2001 From: Sola <42537573+solawc@users.noreply.github.com> Date: Fri, 2 Apr 2021 08:19:22 +0800 Subject: [PATCH 245/253] MKS H43 fix, cleanup (#21500) Followup to #21485 --- Marlin/Configuration.h | 2 +- Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp | 2 +- Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp | 9 ++++++--- Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.h | 4 ++-- Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp | 7 ++++++- Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.h | 7 +++++-- 6 files changed, 21 insertions(+), 10 deletions(-) diff --git a/Marlin/Configuration.h b/Marlin/Configuration.h index 5f9b1782fc..0847892934 100644 --- a/Marlin/Configuration.h +++ b/Marlin/Configuration.h @@ -2374,7 +2374,7 @@ //#define DGUS_LCD_UI_FYSETC //#define DGUS_LCD_UI_HIPRECY -// #define DGUS_LCD_UI_MKS +//#define DGUS_LCD_UI_MKS #if ENABLED(DGUS_LCD_UI_MKS) #define USE_MKS_GREEN_UI #endif diff --git a/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp index b4e876ce4c..067ea482c7 100644 --- a/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/DGUSScreenHandler.cpp @@ -176,6 +176,7 @@ void DGUSScreenHandler::DGUSLCD_SendStringToDisplayPGM(DGUS_VP_Variable &var) { #if HAS_PID_HEATING void DGUSScreenHandler::DGUSLCD_SendTemperaturePID(DGUS_VP_Variable &var) { float value = *(float *)var.memadr; + value /= 10; float valuesend = 0; switch (var.VP) { default: return; @@ -343,7 +344,6 @@ void DGUSScreenHandler::DGUSLCD_SendHeaterStatusToDisplay(DGUS_VP_Variable &var) SetupConfirmAction(nullptr); GotoScreen(DGUSLCD_SCREEN_POPUP); } - #endif // SDSUPPORT void DGUSScreenHandler::ScreenConfirmedOK(DGUS_VP_Variable &var, void *val_ptr) { diff --git a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp index a2ccdada36..786d1821a6 100644 --- a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.cpp @@ -44,7 +44,7 @@ #endif uint16_t manualMoveStep = 1; -float distanceFilament = 10; +uint16_t distanceFilament = 10; uint16_t FilamentSpeed = 25; float ZOffset_distance = 0.1; float mesh_adj_distance = 0.01; @@ -554,7 +554,7 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { #if ENABLED(DGUS_FILAMENT_LOADUNLOAD) VPHELPER(VP_LOAD_Filament, nullptr, &ScreenHandler.MKS_FilamentLoad, nullptr), VPHELPER(VP_UNLOAD_Filament, nullptr, &ScreenHandler.MKS_FilamentUnLoad, nullptr), - VPHELPER(VP_Filament_distance, &distanceFilament, &ScreenHandler.GetManualFilament, ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<0>), + VPHELPER(VP_Filament_distance, &distanceFilament, &ScreenHandler.GetManualFilament, ScreenHandler.DGUSLCD_SendWordValueToDisplay), VPHELPER(VP_Filament_speed, &FilamentSpeed, &ScreenHandler.GetManualFilamentSpeed, ScreenHandler.DGUSLCD_SendWordValueToDisplay), #endif #endif @@ -733,8 +733,9 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { // SDCard File listing - VPHELPER(VP_SD_FileSelected, nullptr, ScreenHandler.DGUSLCD_SD_FileSelected, nullptr), + #if ENABLED(SDSUPPORT) + VPHELPER(VP_SD_FileSelected, nullptr, ScreenHandler.DGUSLCD_SD_FileSelected, nullptr), VPHELPER(VP_SD_ScrollEvent, nullptr, ScreenHandler.DGUSLCD_SD_ScrollFilelist, nullptr), VPHELPER(VP_SD_FileSelectConfirm, nullptr, ScreenHandler.DGUSLCD_SD_StartPrint, nullptr), VPHELPER_STR(VP_SD_FileName0, nullptr, VP_SD_FileName_LEN, nullptr, ScreenHandler.DGUSLCD_SD_SendFilename), @@ -759,6 +760,8 @@ const struct DGUS_VP_Variable ListOfVP[] PROGMEM = { VPHELPER(VP_OFFSET_Y, &probe.offset.y, ScreenHandler.GetOffsetValue,ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<2>), VPHELPER(VP_OFFSET_Z, &probe.offset.z, ScreenHandler.GetOffsetValue,ScreenHandler.DGUSLCD_SendFloatAsLongValueToDisplay<2>), #endif + #else + VPHELPER(VP_SD_FileSelected, nullptr, ScreenHandler.PrintReturn, nullptr), #endif #if ENABLED(DGUS_UI_WAITING) diff --git a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.h b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.h index 9a3690f356..ac0a482ede 100644 --- a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.h +++ b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSDisplayDef.h @@ -36,7 +36,7 @@ #define MKS_FINSH extern uint16_t manualMoveStep; -extern float distanceFilament; +extern uint16_t distanceFilament; extern uint16_t FilamentSpeed; extern float ZOffset_distance; extern float mesh_adj_distance; @@ -55,7 +55,7 @@ void MKS_resume_print_move(); extern float z_offset_add; -xyz_int_t tmc_step; +extern xyz_int_t tmc_step; extern uint16_t lcd_default_light; diff --git a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp index b6633d3a1f..54500011f8 100644 --- a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp +++ b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.cpp @@ -270,6 +270,11 @@ void DGUSScreenHandler::DGUSLCD_SendTMCStepValue(DGUS_VP_Variable &var) { GotoScreen(MKSLCD_SCREEN_PrintDone); } +#else + void DGUSScreenHandler::PrintReturn(DGUS_VP_Variable& var, void *val_ptr) { + uint16_t value = swap16(*(uint16_t*)val_ptr); + if (value == 0x0F) GotoScreen(DGUSLCD_SCREEN_MAIN); + } #endif // SDSUPPORT void DGUSScreenHandler::ScreenChangeHook(DGUS_VP_Variable &var, void *val_ptr) { @@ -1215,7 +1220,7 @@ void DGUSScreenHandler::MKS_FilamentLoadUnload(DGUS_VP_Variable &var, void *val_ } else { #if EITHER(HAS_MULTI_HOTEND, SINGLENOZZLE) - swap_tool = 2; + swap_tool = 1; #endif } #endif diff --git a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.h b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.h index 2d0678ca5b..07c123d928 100644 --- a/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.h +++ b/Marlin/src/lcd/extui/lib/dgus/mks/DGUSScreenHandler.h @@ -158,13 +158,14 @@ public: static void GetManualFilamentSpeed(DGUS_VP_Variable &var, void *val_ptr); #endif - // File touched. - static void DGUSLCD_SD_FileSelected(DGUS_VP_Variable &var, void *val_ptr); + #if ENABLED(SDSUPPORT) // Callback for VP "Display wants to change screen when there is a SD card" static void ScreenChangeHookIfSD(DGUS_VP_Variable &var, void *val_ptr); // Scroll buttons on the file listing screen. static void DGUSLCD_SD_ScrollFilelist(DGUS_VP_Variable &var, void *val_ptr); + // File touched. + static void DGUSLCD_SD_FileSelected(DGUS_VP_Variable &var, void *val_ptr); // start print after confirmation received. static void DGUSLCD_SD_StartPrint(DGUS_VP_Variable &var, void *val_ptr); // User hit the pause, resume or abort button. @@ -183,6 +184,8 @@ public: static void SDCardError(); // Marlin informed us about SD print completion. static void SDPrintingFinished(); + #else + static void PrintReturn(DGUS_VP_Variable &var, void *val_ptr); #endif // OK Button the Confirm screen. From 235ba926021709e293f33b7229690406761298e4 Mon Sep 17 00:00:00 2001 From: Mike La Spina Date: Thu, 1 Apr 2021 19:29:49 -0500 Subject: [PATCH 246/253] Followup to Laser Flow Meter (#21498) --- Marlin/src/lcd/HD44780/marlinui_HD44780.cpp | 6 +++--- Marlin/src/lcd/dogm/dogm_Statusscreen.h | 6 +++--- Marlin/src/lcd/dogm/status/cooler.h | 2 +- Marlin/src/lcd/dogm/status_screen_DOGM.cpp | 2 +- Marlin/src/lcd/menu/menu_temperature.cpp | 2 +- Marlin/src/module/temperature.cpp | 4 ++-- 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp b/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp index 61c7ce18d6..98ca1c0930 100644 --- a/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp +++ b/Marlin/src/lcd/HD44780/marlinui_HD44780.cpp @@ -46,7 +46,7 @@ #include "../../gcode/parser.h" #endif -#if HAS_COOLER || HAS_FLOWMETER +#if EITHER(HAS_COOLER, LASER_COOLANT_FLOW_METER) #include "../../feature/cooler.h" #endif @@ -584,7 +584,7 @@ FORCE_INLINE void _draw_cooler_status(const char prefix, const bool blink) { } #endif -#if HAS_FLOWMETER +#if ENABLED(LASER_COOLANT_FLOW_METER) FORCE_INLINE void _draw_flowmeter_status() { lcd_put_u8str("~ "); lcd_put_u8str(ftostr11ns(cooler.flowrate)); @@ -827,7 +827,7 @@ void MarlinUI::draw_status_screen() { #if HAS_COOLER _draw_cooler_status('*', blink); #endif - #if HAS_FLOWMETER + #if ENABLED(LASER_COOLANT_FLOW_METER) _draw_flowmeter_status(); #endif diff --git a/Marlin/src/lcd/dogm/dogm_Statusscreen.h b/Marlin/src/lcd/dogm/dogm_Statusscreen.h index 396b05b084..f0e37aa249 100644 --- a/Marlin/src/lcd/dogm/dogm_Statusscreen.h +++ b/Marlin/src/lcd/dogm/dogm_Statusscreen.h @@ -97,7 +97,7 @@ // // Laser Flowmeter // -#if !STATUS_FLOWMETER_WIDTH && HAS_FLOWMETER +#if !STATUS_FLOWMETER_WIDTH && ENABLED(LASER_COOLANT_FLOW_METER) #include "status/cooler.h" #endif #ifndef STATUS_FLOWMETER_WIDTH @@ -567,7 +567,7 @@ // // Flowmeter Bitmap Properties // -#if HAS_FLOWMETER +#if ENABLED(LASER_COOLANT_FLOW_METER) #if STATUS_FLOWMETER_WIDTH #ifndef STATUS_FLOWMETER_X @@ -689,7 +689,7 @@ #if HAS_COOLER #define DO_DRAW_COOLER 1 #endif -#if HAS_FLOWMETER +#if ENABLED(LASER_COOLANT_FLOW_METER) #define DO_DRAW_FLOWMETER 1 #endif diff --git a/Marlin/src/lcd/dogm/status/cooler.h b/Marlin/src/lcd/dogm/status/cooler.h index 0d72efea72..df596b5c5a 100644 --- a/Marlin/src/lcd/dogm/status/cooler.h +++ b/Marlin/src/lcd/dogm/status/cooler.h @@ -64,7 +64,7 @@ }; #endif -#if HAS_FLOWMETER +#if ENABLED(LASER_COOLANT_FLOW_METER) #define STATUS_FLOWMETER_WIDTH 24 const unsigned char status_flowmeter_bmp2[] PROGMEM = { B00000001,B11111000,B00000000, diff --git a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp index 2ec462c34a..921dee0e34 100644 --- a/Marlin/src/lcd/dogm/status_screen_DOGM.cpp +++ b/Marlin/src/lcd/dogm/status_screen_DOGM.cpp @@ -53,7 +53,7 @@ #include "../../feature/spindle_laser.h" #endif -#if HAS_COOLER || HAS_FLOWMETER +#if EITHER(HAS_COOLER, LASER_COOLANT_FLOW_METER) #include "../../feature/cooler.h" #endif diff --git a/Marlin/src/lcd/menu/menu_temperature.cpp b/Marlin/src/lcd/menu/menu_temperature.cpp index fb47c22ce9..85578ea351 100644 --- a/Marlin/src/lcd/menu/menu_temperature.cpp +++ b/Marlin/src/lcd/menu/menu_temperature.cpp @@ -35,7 +35,7 @@ #include "../../module/motion.h" #endif -#if HAS_COOLER || HAS_FLOWMETER +#if EITHER(HAS_COOLER, LASER_COOLANT_FLOW_METER) #include "../../feature/cooler.h" #endif diff --git a/Marlin/src/module/temperature.cpp b/Marlin/src/module/temperature.cpp index 02fe7588d9..992681632d 100644 --- a/Marlin/src/module/temperature.cpp +++ b/Marlin/src/module/temperature.cpp @@ -35,7 +35,7 @@ #include "endstops.h" #include "planner.h" -#if HAS_COOLER || HAS_FLOWMETER +#if EITHER(HAS_COOLER, LASER_COOLANT_FLOW_METER) #include "../feature/cooler.h" #include "../feature/spindle_laser.h" #endif @@ -1549,7 +1549,7 @@ void Temperature::manage_heater() { #endif // HAS_COOLER - #if HAS_FLOWMETER + #if ENABLED(LASER_COOLANT_FLOW_METER) cooler.flowmeter_task(ms); #if ENABLED(FLOWMETER_SAFETY) if (cutter.enabled() && cooler.check_flow_too_low()) { From 0dde8f89682245eba48e553fd62bf0deb1f10e88 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Fri, 2 Apr 2021 01:13:58 +0000 Subject: [PATCH 247/253] [cron] Bump distribution date (2021-04-02) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 361b647dd5..994348eb76 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2021-04-01" + #define STRING_DISTRIBUTION_DATE "2021-04-02" #endif /** From 3229100025dc428d5038eca753c70f3c831d6336 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 1 Apr 2021 21:53:19 -0500 Subject: [PATCH 248/253] Split up platformio.ini (#21507) --- .../PlatformIO/scripts/common-dependencies.py | 37 +- ini/avr.ini | 174 ++ ini/due.ini | 43 + ini/esp32.ini | 29 + ini/features.ini | 218 +++ ini/lpc176x.ini | 44 + ini/native.ini | 23 + ini/samd51.ini | 27 + ini/stm32f0.ini | 42 + ini/stm32f1.ini | 439 +++++ ini/stm32f4.ini | 371 +++++ ini/stm32f7.ini | 30 + ini/teensy.ini | 42 + platformio.ini | 1426 +---------------- 14 files changed, 1504 insertions(+), 1441 deletions(-) create mode 100644 ini/avr.ini create mode 100644 ini/due.ini create mode 100644 ini/esp32.ini create mode 100644 ini/features.ini create mode 100644 ini/lpc176x.ini create mode 100644 ini/native.ini create mode 100644 ini/samd51.ini create mode 100644 ini/stm32f0.ini create mode 100644 ini/stm32f1.ini create mode 100644 ini/stm32f4.ini create mode 100644 ini/stm32f7.ini create mode 100644 ini/teensy.ini diff --git a/buildroot/share/PlatformIO/scripts/common-dependencies.py b/buildroot/share/PlatformIO/scripts/common-dependencies.py index 3844d8298a..fe6ae7dba5 100644 --- a/buildroot/share/PlatformIO/scripts/common-dependencies.py +++ b/buildroot/share/PlatformIO/scripts/common-dependencies.py @@ -3,16 +3,6 @@ # Convenience script to check dependencies and add libs and sources for Marlin Enabled Features # import subprocess,os,re -try: - import configparser -except ImportError: - import ConfigParser as configparser -try: - # PIO < 4.4 - from platformio.managers.package import PackageManager -except ImportError: - # PIO >= 4.4 - from platformio.package.meta import PackageSpec as PackageManager PIO_VERSION_MIN = (5, 0, 3) try: @@ -38,6 +28,9 @@ except SystemExit: except: print("Can't detect PlatformIO Version") +from platformio.package.meta import PackageSpec +from platformio.project.config import ProjectConfig + Import("env") #print(env.Dump()) @@ -51,13 +44,6 @@ def blab(str): if verbose: print(str) -def parse_pkg_uri(spec): - if PackageManager.__name__ == 'PackageSpec': - return PackageManager(spec).name - else: - name, _, _ = PackageManager.parse_pkg_uri(spec) - return name - FEATURE_CONFIG = {} def add_to_feat_cnf(feature, flines): @@ -86,9 +72,7 @@ def add_to_feat_cnf(feature, flines): feat['lib_deps'] = list(filter(lib_re.match, feat['lib_deps'])) + [dep] def load_config(): - config = configparser.ConfigParser() - config.read("platformio.ini") - items = config.items('features') + items = ProjectConfig().items('features') for key in items: feature = key[0].upper() if not feature in FEATURE_CONFIG: @@ -114,16 +98,14 @@ def get_all_known_libs(): if not 'lib_deps' in feat: continue for dep in feat['lib_deps']: - name = parse_pkg_uri(dep) - known_libs.append(name) + known_libs.append(PackageSpec(dep).name) return known_libs def get_all_env_libs(): env_libs = [] lib_deps = env.GetProjectOption('lib_deps') for dep in lib_deps: - name = parse_pkg_uri(dep) - env_libs.append(name) + env_libs.append(PackageSpec(dep).name) return env_libs def set_env_field(field, value): @@ -154,20 +136,19 @@ def apply_features_config(): # feat to add deps_to_add = {} for dep in feat['lib_deps']: - name = parse_pkg_uri(dep) - deps_to_add[name] = dep + deps_to_add[PackageSpec(dep).name] = dep # Does the env already have the dependency? deps = env.GetProjectOption('lib_deps') for dep in deps: - name = parse_pkg_uri(dep) + name = PackageSpec(dep).name if name in deps_to_add: del deps_to_add[name] # Are there any libraries that should be ignored? lib_ignore = env.GetProjectOption('lib_ignore') for dep in deps: - name = parse_pkg_uri(dep) + name = PackageSpec(dep).name if name in deps_to_add: del deps_to_add[name] diff --git a/ini/avr.ini b/ini/avr.ini new file mode 100644 index 0000000000..944646190a --- /dev/null +++ b/ini/avr.ini @@ -0,0 +1,174 @@ +# +# Marlin Firmware +# PlatformIO Configuration File +# + +################################# +# # +# AVR Architecture # +# # +################################# + +# +# AVR (8-bit) Common Environment values +# +[common_avr8] +board_build.f_cpu = 16000000L +src_filter = ${common.default_src_filter} + + +# +# ATmega2560 +# +[env:mega2560] +platform = atmelavr +extends = common_avr8 +board = megaatmega2560 + +# +# ATmega2560 with extended pins 70-85 defined +# BOARD_BQ_ZUM_MEGA_3D +# BOARD_ULTIMAIN_2 +# BOARD_MIGHTYBOARD_REVE +# BOARD_EINSTART_S +# +[env:mega2560ext] +platform = atmelavr +extends = env:mega2560 +board_build.variant = megaextendedpins +extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py + +# +# ATmega1280 +# +[env:mega1280] +platform = atmelavr +extends = common_avr8 +board = megaatmega1280 + +# +# MightyBoard AVR with extended pins +# +[mega_extended_optimized] +extends = common_avr8 +board_build.variant = megaextendedpins +extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py +upload_speed = 57600 +build_flags = ${common.build_flags} -fno-tree-scev-cprop -fno-split-wide-types -Wl,--relax -mcall-prologues + +# +# MightyBoard ATmega1280 +# +[env:MightyBoard1280] +platform = atmelavr +extends = mega_extended_optimized +board = megaatmega1280 + +# +# MightyBoard ATmega2560 +# +[env:MightyBoard2560] +platform = atmelavr +extends = mega_extended_optimized +board = megaatmega2560 + +# +# RAMBo +# +[env:rambo] +platform = atmelavr +extends = common_avr8 +board = reprap_rambo + +# +# FYSETC F6 V1.3 / V1.4 +# +[env:FYSETC_F6] +platform = atmelavr +extends = common_avr8 +board = fysetc_f6 + +# +# Sanguinololu (ATmega644p) +# +[env:sanguino644p] +platform = atmelavr +extends = common_avr8 +board = sanguino_atmega644p + +# +# Sanguinololu (ATmega1284p) +# +[env:sanguino1284p] +platform = atmelavr +extends = common_avr8 +board = sanguino_atmega1284p +board_upload.maximum_size = 126976 + +# +# Melzi and clones (ATmega1284p) +# +[env:melzi] +platform = atmelavr +extends = env:sanguino1284p +upload_speed = 57600 + +# +# Sanguinololu (ATmega1284p stock bootloader with tuned flags) +# + +[tuned_1284p] +build_flags = ${common.build_flags} -fno-tree-scev-cprop -fno-split-wide-types -Wl,--relax -mcall-prologues + +[env:sanguino1284p_optimized] +platform = atmelavr +extends = env:melzi +build_flags = ${tuned_1284p.build_flags} + +# +# Melzi and clones (alias for sanguino1284p_optimized) +# +[env:melzi_optimized] +platform = atmelavr +extends = env:sanguino1284p_optimized + +# +# Melzi and clones (Optiboot bootloader) +# +[env:melzi_optiboot] +platform = atmelavr +extends = common_avr8 +board = sanguino_atmega1284p +upload_speed = 115200 + +# +# Melzi and clones (Zonestar Melzi2 with tuned flags) +# +[env:melzi_optiboot_optimized] +platform = atmelavr +extends = env:melzi_optiboot +build_flags = ${tuned_1284p.build_flags} + +# +# AT90USB1286 boards using CDC bootloader +# - BRAINWAVE +# - BRAINWAVE_PRO +# - SAV_MKI +# - TEENSYLU +# +[env:at90usb1286_cdc] +platform = teensy +extends = common_avr8 +board = at90usb1286 +lib_ignore = ${env:common_avr8.lib_ignore}, Teensy_ADC, NativeEthernet + +# +# AT90USB1286 boards using DFU bootloader +# - Printrboard +# - Printrboard Rev.F +# - ? 5DPRINT ? +# +[env:at90usb1286_dfu] +platform = teensy +extends = env:at90usb1286_cdc diff --git a/ini/due.ini b/ini/due.ini new file mode 100644 index 0000000000..7abc262eb4 --- /dev/null +++ b/ini/due.ini @@ -0,0 +1,43 @@ +# +# Marlin Firmware +# PlatformIO Configuration File +# + +################################# +# # +# DUE Architecture # +# # +################################# + +# +# Due (Atmel SAM3X8E ARM Cortex-M3) +# +# - RAMPS4DUE +# - RADDS +# +[env:DUE] +platform = atmelsam +board = due +src_filter = ${common.default_src_filter} + + + +[env:DUE_USB] +platform = atmelsam +extends = env:DUE +board = dueUSB + +# +# Archim SAM +# +[common_DUE_archim] +platform = atmelsam +extends = env:DUE +board = archim +build_flags = ${common.build_flags} + -DARDUINO_SAM_ARCHIM -DARDUINO_ARCH_SAM -D__SAM3X8E__ -DUSBCON +board_build.variants_dir = buildroot/share/PlatformIO/variants/ +extra_scripts = ${common.extra_scripts} + Marlin/src/HAL/DUE/upload_extra_script.py + +[env:DUE_archim] +platform = ${common_DUE_archim.platform} +extends = common_DUE_archim diff --git a/ini/esp32.ini b/ini/esp32.ini new file mode 100644 index 0000000000..1aee88f692 --- /dev/null +++ b/ini/esp32.ini @@ -0,0 +1,29 @@ +# +# Marlin Firmware +# PlatformIO Configuration File +# + +################################# +# # +# ESP32 Architecture # +# # +################################# + +# +# Espressif ESP32 +# +[env:esp32] +platform = espressif32@2.1.0 +board = esp32dev +build_flags = ${common.build_flags} -DCORE_DEBUG_LEVEL=0 +src_filter = ${common.default_src_filter} + +lib_ignore = NativeEthernet +upload_speed = 500000 +monitor_speed = 250000 +#upload_port = marlinesp.local +#board_build.flash_mode = qio + +[env:FYSETC_E4] +platform = espressif32@1.11.2 +extends = env:esp32 +board_build.partitions = default_16MB.csv diff --git a/ini/features.ini b/ini/features.ini new file mode 100644 index 0000000000..7399a22446 --- /dev/null +++ b/ini/features.ini @@ -0,0 +1,218 @@ +# +# Marlin Firmware +# PlatformIO Configuration File +# + +################################# +# # +# Features Dependencies # +# # +################################# + +[features] +YHCB2004 = red-scorp/LiquidCrystal_AIP31068@^1.0.4, red-scorp/SoftSPIB@^1.1.1 +HAS_TFT_LVGL_UI = lvgl=https://github.com/makerbase-mks/LVGL-6.1.1-MKS/archive/master.zip + src_filter=+ + extra_scripts=download_mks_assets.py +POSTMORTEM_DEBUGGING = src_filter=+ + + build_flags=-funwind-tables +MKS_WIFI_MODULE = QRCode=https://github.com/makerbase-mks/QRCode/archive/master.zip +HAS_TRINAMIC_CONFIG = TMCStepper@~0.7.1 + src_filter=+ + + + + +HAS_STEALTHCHOP = src_filter=+ +SR_LCD_3W_NL = SailfishLCD=https://github.com/mikeshub/SailfishLCD/archive/master.zip +HAS_MOTOR_CURRENT_I2C = SlowSoftI2CMaster + src_filter=+ +HAS_TMC26X = TMC26XStepper=https://github.com/trinamic/TMC26XStepper/archive/master.zip + src_filter=+ +HAS_L64XX = Arduino-L6470@0.8.0 + src_filter=+ + + + +NEOPIXEL_LED = Adafruit NeoPixel@1.5.0 + src_filter=+ +TEMP_.+_IS_MAX31865 = Adafruit MAX31865 library@~1.1.0 +USES_LIQUIDCRYSTAL = bitbucket-fmalpartida/LiquidCrystal@1.5.0 +USES_LIQUIDCRYSTAL_I2C = marcoschwartz/LiquidCrystal_I2C@1.1.4 +USES_LIQUIDTWI2 = LiquidTWI2@1.2.7 +HAS_WIRED_LCD = src_filter=+ +HAS_MARLINUI_HD44780 = src_filter=+ +HAS_MARLINUI_U8GLIB = U8glib-HAL@~0.4.1 + src_filter=+ +HAS_(FSMC|SPI)_TFT = src_filter=+ + + +HAS_FSMC_TFT = src_filter=+ + +HAS_SPI_TFT = src_filter=+ + +I2C_EEPROM = src_filter=+ +SPI_EEPROM = src_filter=+ +HAS_GRAPHICAL_TFT = src_filter=+ +DWIN_CREALITY_LCD = src_filter=+ +IS_TFTGLCD_PANEL = src_filter=+ +HAS_TOUCH_BUTTONS = src_filter=+ +HAS_LCD_MENU = src_filter=+ +HAS_GAMES = src_filter=+ +MARLIN_BRICKOUT = src_filter=+ +MARLIN_INVADERS = src_filter=+ +MARLIN_MAZE = src_filter=+ +MARLIN_SNAKE = src_filter=+ +HAS_MENU_BACKLASH = src_filter=+ +HAS_MENU_BED_CORNERS = src_filter=+ +LCD_BED_LEVELING = src_filter=+ +HAS_MENU_CANCELOBJECT = src_filter=+ +HAS_MENU_DELTA_CALIBRATE = src_filter=+ +HAS_MENU_FILAMENT = src_filter=+ +LCD_INFO_MENU = src_filter=+ +HAS_MENU_JOB_RECOVERY = src_filter=+ +HAS_MULTI_LANGUAGE = src_filter=+ +HAS_MENU_LED = src_filter=+ +HAS_MENU_MEDIA = src_filter=+ +HAS_MENU_MIXER = src_filter=+ +HAS_MENU_MMU2 = src_filter=+ +HAS_MENU_PASSWORD = src_filter=+ +HAS_MENU_POWER_MONITOR = src_filter=+ +HAS_MENU_CUTTER = src_filter=+ +HAS_MENU_TEMPERATURE = src_filter=+ +HAS_MENU_TMC = src_filter=+ +HAS_MENU_TOUCH_SCREEN = src_filter=+ +HAS_MENU_TRAMMING = src_filter=+ +HAS_MENU_UBL = src_filter=+ +ANYCUBIC_LCD_CHIRON = src_filter=+ + +ANYCUBIC_LCD_I3MEGA = src_filter=+ + +NEXTION_TFT = src_filter=+ + +HAS_DGUS_LCD = src_filter=+ + +DGUS_LCD_UI_FYSETC = src_filter=+ +DGUS_LCD_UI_HIPRECY = src_filter=+ +DGUS_LCD_UI_MKS = src_filter=+ +DGUS_LCD_UI_ORIGIN = src_filter=+ +TOUCH_UI_FTDI_EVE = src_filter=+ +EXTUI_EXAMPLE = src_filter=+ +MALYAN_LCD = src_filter=+ +USE_UHS2_USB = src_filter=+ +USE_UHS3_USB = src_filter=+ +USB_FLASH_DRIVE_SUPPORT = src_filter=+ +AUTO_BED_LEVELING_BILINEAR = src_filter=+ +AUTO_BED_LEVELING_(3POINT|(BI)?LINEAR) = src_filter=+ +MESH_BED_LEVELING = src_filter=+ + +AUTO_BED_LEVELING_UBL = src_filter=+ + +UBL_HILBERT_CURVE = src_filter=+ +BACKLASH_COMPENSATION = src_filter=+ +BARICUDA = src_filter=+ + +BINARY_FILE_TRANSFER = src_filter=+ + +BLTOUCH = src_filter=+ +CANCEL_OBJECTS = src_filter=+ + +CASE_LIGHT_ENABLE = src_filter=+ + +EXTERNAL_CLOSED_LOOP_CONTROLLER = src_filter=+ + +USE_CONTROLLER_FAN = src_filter=+ +HAS_MOTOR_CURRENT_DAC = src_filter=+ +DIRECT_STEPPING = src_filter=+ + +EMERGENCY_PARSER = src_filter=+ - +I2C_POSITION_ENCODERS = src_filter=+ +IIC_BL24CXX_EEPROM = src_filter=+ +HAS_SPI_FLASH = src_filter=+ +HAS_ETHERNET = src_filter=+ + +HAS_FANMUX = src_filter=+ +FILAMENT_WIDTH_SENSOR = src_filter=+ + +FWRETRACT = src_filter=+ + +HOST_ACTION_COMMANDS = src_filter=+ +HOTEND_IDLE_TIMEOUT = src_filter=+ +JOYSTICK = src_filter=+ +BLINKM = src_filter=+ +HAS_COLOR_LEDS = src_filter=+ + +PCA9533 = src_filter=+ +PCA9632 = src_filter=+ +PRINTER_EVENT_LEDS = src_filter=+ +TEMP_STAT_LEDS = src_filter=+ +MAX7219_DEBUG = src_filter=+ + +HAS_MEATPACK = src_filter=+ +MIXING_EXTRUDER = src_filter=+ + +HAS_PRUSA_MMU1 = src_filter=+ +HAS_PRUSA_MMU2 = src_filter=+ + +PASSWORD_FEATURE = src_filter=+ + +ADVANCED_PAUSE_FEATURE = src_filter=+ + + +AUTO_POWER_CONTROL = src_filter=+ +HAS_POWER_MONITOR = src_filter=+ + +POWER_LOSS_RECOVERY = src_filter=+ + +PROBE_TEMP_COMPENSATION = src_filter=+ + +HAS_FILAMENT_SENSOR = src_filter=+ + +(EXT|MANUAL)_SOLENOID.* = src_filter=+ + +MK2_MULTIPLEXER = src_filter=+ +HAS_CUTTER = src_filter=+ + +EXPERIMENTAL_I2CBUS = src_filter=+ + +MECHANICAL_GANTRY_CAL.+ = src_filter=+ +Z_MULTI_ENDSTOPS = src_filter=+ +Z_STEPPER_AUTO_ALIGN = src_filter=+ + +G26_MESH_VALIDATION = src_filter=+ +ASSISTED_TRAMMING = src_filter=+ + +HAS_MESH = src_filter=+ +HAS_LEVELING = src_filter=+ + +DELTA_AUTO_CALIBRATION = src_filter=+ +CALIBRATION_GCODE = src_filter=+ +Z_MIN_PROBE_REPEATABILITY_TEST = src_filter=+ +M100_FREE_MEMORY_WATCHER = src_filter=+ +BACKLASH_GCODE = src_filter=+ +IS_KINEMATIC = src_filter=+ +HAS_EXTRA_ENDSTOPS = src_filter=+ +SKEW_CORRECTION_GCODE = src_filter=+ +DIRECT_PIN_CONTROL = src_filter=+ + +PINS_DEBUGGING = src_filter=+ +NO_VOLUMETRICS = src_filter=- +HAS_MULTI_EXTRUDER = src_filter=+ +HAS_HOTEND_OFFSET = src_filter=+ +EDITABLE_SERVO_ANGLES = src_filter=+ +PIDTEMP = src_filter=+ +PREVENT_COLD_EXTRUSION = src_filter=+ +PIDTEMPBED = src_filter=+ +HAS_USER_THERMISTORS = src_filter=+ +SD_ABORT_ON_ENDSTOP_HIT = src_filter=+ +BAUD_RATE_GCODE = src_filter=+ +HAS_SMART_EFF_MOD = src_filter=+ +COOLANT_CONTROL = src_filter=+ +HAS_SOFTWARE_ENDSTOPS = src_filter=+ +HAS_DUPLICATION_MODE = src_filter=+ +LIN_ADVANCE = src_filter=+ +PHOTO_GCODE = src_filter=+ +CONTROLLER_FAN_EDITABLE = src_filter=+ +GCODE_MACROS = src_filter=+ +GRADIENT_MIX = src_filter=+ +HAS_SAVED_POSITIONS = src_filter=+ + +PARK_HEAD_ON_PAUSE = src_filter=+ +FILAMENT_LOAD_UNLOAD_GCODES = src_filter=+ +CNC_WORKSPACE_PLANES = src_filter=+ +CNC_COORDINATE_SYSTEMS = src_filter=+ +HAS_M206_COMMAND = src_filter=+ +EXPECTED_PRINTER_CHECK = src_filter=+ +HOST_KEEPALIVE_FEATURE = src_filter=+ +REPETIER_GCODE_M360 = src_filter=+ +HAS_GCODE_M876 = src_filter=+ +HAS_RESUME_CONTINUE = src_filter=+ +HAS_LCD_CONTRAST = src_filter=+ +LCD_SET_PROGRESS_MANUALLY = src_filter=+ +TOUCH_SCREEN_CALIBRATION = src_filter=+ +ARC_SUPPORT = src_filter=+ +GCODE_MOTION_MODES = src_filter=+ +BABYSTEPPING = src_filter=+ + +Z_PROBE_SLED = src_filter=+ +G38_PROBE_TARGET = src_filter=+ +MAGNETIC_PARKING_EXTRUDER = src_filter=+ +SDSUPPORT = src_filter=+ + + + + + + +HAS_MEDIA_SUBCALLS = src_filter=+ +GCODE_REPEAT_MARKERS = src_filter=+ + +HAS_EXTRUDERS = src_filter=+ + +HAS_COOLER = src_filter=+ + +AUTO_REPORT_TEMPERATURES = src_filter=+ +INCH_MODE_SUPPORT = src_filter=+ +TEMPERATURE_UNITS_SUPPORT = src_filter=+ +NEED_HEX_PRINT = src_filter=+ +NEED_LSF = src_filter=+ +NOZZLE_PARK_FEATURE = src_filter=+ + +NOZZLE_CLEAN_FEATURE = src_filter=+ + +DELTA = src_filter=+ + +BEZIER_CURVE_SUPPORT = src_filter=+ + +PRINTCOUNTER = src_filter=+ +HAS_BED_PROBE = src_filter=+ + + + +IS_SCARA = src_filter=+ +HAS_SERVOS = src_filter=+ + +MORGAN_SCARA = src_filter=+ +HAS_MICROSTEPS = src_filter=+ +(ESP3D_)?WIFISUPPORT = AsyncTCP, ESP Async WebServer + ESP3DLib=https://github.com/luc-github/ESP3DLib/archive/master.zip + arduinoWebSockets=links2004/WebSockets@2.3.4 + luc-github/ESP32SSDP@^1.1.1 + lib_ignore=ESPAsyncTCP diff --git a/ini/lpc176x.ini b/ini/lpc176x.ini new file mode 100644 index 0000000000..2a59ba7f50 --- /dev/null +++ b/ini/lpc176x.ini @@ -0,0 +1,44 @@ +# +# Marlin Firmware +# PlatformIO Configuration File +# + +################################# +# # +# LPC176x Architecture # +# # +################################# + +# +# NXP LPC176x ARM Cortex-M3 +# +[common_LPC] +platform = https://github.com/p3p/pio-nxplpc-arduino-lpc176x/archive/0.1.3.zip +platform_packages = framework-arduino-lpc176x@^0.2.6 +board = nxp_lpc1768 +lib_ldf_mode = off +lib_compat_mode = strict +extra_scripts = ${common.extra_scripts} + Marlin/src/HAL/LPC1768/upload_extra_script.py +src_filter = ${common.default_src_filter} + + +lib_deps = ${common.lib_deps} + Servo +custom_marlin.USES_LIQUIDCRYSTAL = arduino-libraries/LiquidCrystal@~1.0.7 +custom_marlin.NEOPIXEL_LED = Adafruit NeoPixel=https://github.com/p3p/Adafruit_NeoPixel/archive/1.5.0.zip +build_flags = ${common.build_flags} -DU8G_HAL_LINKS -IMarlin/src/HAL/LPC1768/include -IMarlin/src/HAL/LPC1768/u8g + # debug options for backtrace + #-funwind-tables + #-mpoke-function-name + +# +# NXP LPC176x ARM Cortex-M3 +# +[env:LPC1768] +platform = ${common_LPC.platform} +extends = common_LPC +board = nxp_lpc1768 + +[env:LPC1769] +platform = ${common_LPC.platform} +extends = common_LPC +board = nxp_lpc1769 diff --git a/ini/native.ini b/ini/native.ini new file mode 100644 index 0000000000..dbdfd26f8b --- /dev/null +++ b/ini/native.ini @@ -0,0 +1,23 @@ +# +# Marlin Firmware +# PlatformIO Configuration File +# + +################################# +# # +# Native / Simulation # +# # +################################# + +# +# No supported Arduino libraries, base Marlin only +# +[env:linux_native] +platform = native +framework = +build_flags = -D__PLAT_LINUX__ -std=gnu++17 -ggdb -g -lrt -lpthread -D__MARLIN_FIRMWARE__ -Wno-expansion-to-defined +src_build_flags = -Wall -IMarlin/src/HAL/LINUX/include +build_unflags = -Wall +lib_ldf_mode = off +lib_deps = +src_filter = ${common.default_src_filter} + diff --git a/ini/samd51.ini b/ini/samd51.ini new file mode 100644 index 0000000000..8e8682da94 --- /dev/null +++ b/ini/samd51.ini @@ -0,0 +1,27 @@ +# +# Marlin Firmware +# PlatformIO Configuration File +# + +################################# +# # +# SAMD51 Architecture # +# # +################################# + +# +# Adafruit Grand Central M4 (Atmel SAMD51P20A ARM Cortex-M4) +# +[env:SAMD51_grandcentral_m4] +platform = atmelsam +board = adafruit_grandcentral_m4 +build_flags = ${common.build_flags} -std=gnu++17 +build_unflags = -std=gnu++11 +src_filter = ${common.default_src_filter} + +lib_deps = ${common.lib_deps} + SoftwareSerialM + Adafruit SPIFlash +extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/SAMD51_grandcentral_m4.py +custom_marlin.SDSUPPORT = SdFat - Adafruit Fork +debug_tool = jlink diff --git a/ini/stm32f0.ini b/ini/stm32f0.ini new file mode 100644 index 0000000000..fb6ce00dd0 --- /dev/null +++ b/ini/stm32f0.ini @@ -0,0 +1,42 @@ +# +# Marlin Firmware +# PlatformIO Configuration File +# + +################################# +# # +# STM32F0 Architecture # +# # +################################# + +# +# Malyan M200 v2 (STM32F070RB) +# +[env:STM32F070RB_malyan] +platform = ${common_stm32.platform} +extends = common_stm32 +board = malyanM200v2 +build_flags = ${common_stm32.build_flags} -DHAL_PCD_MODULE_ENABLED + -O2 -ffreestanding -fsigned-char -fno-move-loop-invariants -fno-strict-aliasing + -DCUSTOM_STARTUP_FILE + +# +# Malyan M200 v2 (STM32F070CB) +# +[env:STM32F070CB_malyan] +platform = ${common_stm32.platform} +extends = common_stm32 +board = malyanm200_f070cb +build_flags = ${common_stm32.build_flags} + -DHAL_PCD_MODULE_ENABLED -DDISABLE_GENERIC_SERIALUSB -DHAL_UART_MODULE_ENABLED -DCUSTOM_STARTUP_FILE + +# +# Malyan M300 (STM32F070CB) +# +[env:malyan_M300] +platform = ${common_stm32.platform} +extends = common_stm32 +board = malyanm300_f070cb +build_flags = ${common_stm32.build_flags} + -DHAL_PCD_MODULE_ENABLED -DDISABLE_GENERIC_SERIALUSB -DHAL_UART_MODULE_ENABLED +src_filter = ${common.default_src_filter} + diff --git a/ini/stm32f1.ini b/ini/stm32f1.ini new file mode 100644 index 0000000000..2ba3d84862 --- /dev/null +++ b/ini/stm32f1.ini @@ -0,0 +1,439 @@ +# +# Marlin Firmware +# PlatformIO Configuration File +# + +################################# +# # +# STM32F1 Architecture # +# # +################################# + +# +# HAL/STM32 Base Environment values +# +[common_stm32] +platform = ststm32@~12.0 +build_flags = ${common.build_flags} + -std=gnu++14 + -DUSBCON -DUSBD_USE_CDC + -DTIM_IRQ_PRIO=13 + -DADC_RESOLUTION=12 +build_unflags = -std=gnu++11 +src_filter = ${common.default_src_filter} + + + +# +# HAL/STM32F1 Common Environment values +# +[common_stm32f1] +platform = ststm32@~12.0 +board_build.core = maple +build_flags = !python Marlin/src/HAL/STM32F1/build_flags.py + ${common.build_flags} + -DARDUINO_ARCH_STM32 +build_unflags = -std=gnu11 -std=gnu++11 +src_filter = ${common.default_src_filter} + +lib_ignore = SPI, FreeRTOS701, FreeRTOS821 +lib_deps = ${common.lib_deps} + SoftwareSerialM +platform_packages = tool-stm32duino +extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/fix_framework_weakness.py + +# +# STM32F103RC +# +[env:STM32F103RC] +platform = ${common_stm32f1.platform} +extends = common_stm32f1 +board = genericSTM32F103RC +monitor_speed = 115200 + +# +# MEEB_3DP (STM32F103RCT6 with 512K) +# +[env:STM32F103RC_meeb] +platform = ${common_stm32f1.platform} +extends = common_stm32f1 +board = MEEB_3DP +build_flags = ${common_stm32f1.build_flags} + -DDEBUG_LEVEL=0 + -DSS_TIMER=4 + -DSTM32_FLASH_SIZE=512 + -DHSE_VALUE=12000000U + -DUSE_USB_COMPOSITE + -DVECT_TAB_OFFSET=0x2000 + -DGENERIC_BOOTLOADER +extra_scripts = ${common_stm32f1.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/STM32F1_create_variant.py + buildroot/share/PlatformIO/scripts/STM32F103RC_MEEB_3DP.py +lib_deps = ${common.lib_deps} + SoftwareSerialM + USBComposite for STM32F1@0.91 +custom_marlin.NEOPIXEL_LED = Adafruit NeoPixel=https://github.com/ccccmagicboy/Adafruit_NeoPixel#meeb_3dp_use +debug_tool = stlink +upload_protocol = dfu + +# +# STM32F103RC_fysetc +# +[env:STM32F103RC_fysetc] +platform = ${common_stm32f1.platform} +extends = env:STM32F103RC +extra_scripts = ${common_stm32f1.extra_scripts} + buildroot/share/PlatformIO/scripts/STM32F103RC_fysetc.py +build_flags = ${common_stm32f1.build_flags} -DDEBUG_LEVEL=0 +lib_ldf_mode = chain +debug_tool = stlink +upload_protocol = serial + +# +# BigTree SKR Mini V1.1 / SKR mini E3 / SKR E3 DIP (STM32F103RCT6 ARM Cortex-M3) +# +# STM32F103RC_btt ............. RCT6 with 256K +# STM32F103RC_btt_USB ......... RCT6 with 256K (USB mass storage) +# STM32F103RC_btt_512K ........ RCT6 with 512K +# STM32F103RC_btt_512K_USB .... RCT6 with 512K (USB mass storage) +# +# WARNING! If you have an SKR Mini v1.1 or an SKR Mini E3 1.0 / 1.2 / 2.0 / DIP +# and experience a printer freeze, re-flash Marlin using the regular (non-512K) +# build option. 256K chips may be re-branded 512K chips, but this means the +# upper 256K is sketchy, and failure is very likely. +# + +[env:STM32F103RC_btt] +platform = ${common_stm32f1.platform} +extends = env:STM32F103RC +extra_scripts = ${common_stm32f1.extra_scripts} + buildroot/share/PlatformIO/scripts/STM32F103RC_SKR_MINI.py +build_flags = ${common_stm32f1.build_flags} + -DDEBUG_LEVEL=0 -DSS_TIMER=4 +monitor_speed = 115200 + +[env:STM32F103RC_btt_USB] +platform = ${common_stm32f1.platform} +extends = env:STM32F103RC_btt +build_flags = ${env:STM32F103RC_btt.build_flags} -DUSE_USB_COMPOSITE +lib_deps = ${env:STM32F103RC_btt.lib_deps} + USBComposite for STM32F1@0.91 + +[env:STM32F103RC_btt_512K] +platform = ${common_stm32f1.platform} +extends = env:STM32F103RC_btt +board_upload.maximum_size=524288 +build_flags = ${env:STM32F103RC_btt.build_flags} -DSTM32_FLASH_SIZE=512 + +[env:STM32F103RC_btt_512K_USB] +platform = ${common_stm32f1.platform} +extends = env:STM32F103RC_btt_512K +build_flags = ${env:STM32F103RC_btt_512K.build_flags} -DUSE_USB_COMPOSITE +lib_deps = ${env:STM32F103RC_btt_512K.lib_deps} + USBComposite for STM32F1@0.91 + +# +# STM32F103RE +# +[env:STM32F103RE] +platform = ${common_stm32f1.platform} +extends = common_stm32f1 +board = genericSTM32F103RE +monitor_speed = 115200 + +# +# STM32F103RE_btt ............. RET6 +# STM32F103RE_btt_USB ......... RET6 (USB mass storage) +# +[env:STM32F103RE_btt] +platform = ${common_stm32f1.platform} +extends = env:STM32F103RE +extra_scripts = ${common_stm32f1.extra_scripts} + buildroot/share/PlatformIO/scripts/STM32F103RE_SKR_E3_DIP.py +build_flags = ${common_stm32f1.build_flags} -DDEBUG_LEVEL=0 -DSS_TIMER=4 +debug_tool = stlink +upload_protocol = stlink + +[env:STM32F103RE_btt_USB] +platform = ${common_stm32f1.platform} +extends = env:STM32F103RE_btt +build_flags = ${env:STM32F103RE_btt.build_flags} -DUSE_USB_COMPOSITE +lib_deps = ${common_stm32f1.lib_deps} + USBComposite for STM32F1@0.91 + +# +# Geeetech GTM32 (STM32F103VET6) +# +[env:STM32F103VE_GTM32] +platform = ${common_stm32f1.platform} +extends = common_stm32f1 +board = genericSTM32F103VE +build_flags = ${common_stm32f1.build_flags} + -ffunction-sections -fdata-sections -nostdlib -MMD + -DMCU_STM32F103VE -DARDUINO_GENERIC_STM32F103V -DARDUINO_ARCH_STM32F1 -DBOARD_generic_stm32f103v + -DDEBUG_LEVEL=DEBUG_NONE -DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG=1 -DVECT_TAB_ADDR=0x8000000 + -DERROR_LED_PORT=GPIOE -DERROR_LED_PIN=6 +upload_protocol = serial + +# +# Longer 3D board in Alfawise U20 (STM32F103VET6) +# +[env:STM32F103VE_longer] +platform = ${common_stm32f1.platform} +extends = common_stm32f1 +board = genericSTM32F103VE +extra_scripts = ${common_stm32f1.extra_scripts} + buildroot/share/PlatformIO/scripts/STM32F103VE_longer.py +build_flags = ${common_stm32f1.build_flags} + -DMCU_STM32F103VE -DSTM32F1xx -USERIAL_USB -DU20 -DTS_V12 +build_unflags = ${common_stm32f1.build_unflags} + -DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG=1 -DERROR_LED_PORT=GPIOE -DERROR_LED_PIN=6 + +# +# MKS Robin Mini (STM32F103VET6) +# +[env:mks_robin_mini] +platform = ${common_stm32f1.platform} +extends = common_stm32f1 +board = genericSTM32F103VE +extra_scripts = ${common_stm32f1.extra_scripts} + buildroot/share/PlatformIO/scripts/mks_robin_mini.py +build_flags = ${common_stm32f1.build_flags} + -DMCU_STM32F103VE + +# +# MKS Robin Nano (STM32F103VET6) +# +[env:mks_robin_nano35] +platform = ${common_stm32f1.platform} +extends = common_stm32f1 +board = genericSTM32F103VE +extra_scripts = ${common_stm32f1.extra_scripts} + buildroot/share/PlatformIO/scripts/mks_robin_nano35.py +build_flags = ${common_stm32f1.build_flags} + -DMCU_STM32F103VE -DSS_TIMER=4 +debug_tool = jlink +upload_protocol = jlink + +# +# MKS Robin (STM32F103ZET6) +# +[env:mks_robin] +platform = ${common_stm32f1.platform} +extends = common_stm32f1 +board = genericSTM32F103ZE +extra_scripts = ${common_stm32f1.extra_scripts} + buildroot/share/PlatformIO/scripts/mks_robin.py +build_flags = ${common_stm32f1.build_flags} + -DSS_TIMER=4 -DSTM32_XL_DENSITY + +# MKS Robin (STM32F103ZET6) +# Uses HAL STM32 to support Marlin UI for TFT screen with optional touch panel +# +[env:mks_robin_stm32] +platform = ${common_stm32.platform} +extends = common_stm32 +board = genericSTM32F103ZE +board_build.core = stm32 +board_build.variant = MARLIN_F103Zx +board_build.ldscript = ldscript.ld +board_build.offset = 0x7000 +board_build.encrypt = Yes +board_build.firmware = Robin.bin +build_flags = ${common_stm32.build_flags} + -DENABLE_HWSERIAL3 -DTIMER_SERIAL=TIM5 +build_unflags = ${common_stm32.build_unflags} + -DUSBCON -DUSBD_USE_CDC +extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py + buildroot/share/PlatformIO/scripts/stm32_bootloader.py + buildroot/share/PlatformIO/scripts/mks_encrypt.py +lib_deps = + +# +# MKS Robin Pro (STM32F103ZET6) +# +[env:mks_robin_pro] +platform = ${common_stm32f1.platform} +extends = env:mks_robin +extra_scripts = ${common_stm32f1.extra_scripts} + buildroot/share/PlatformIO/scripts/mks_robin_pro.py + +# +# TRIGORILLA PRO (STM32F103ZET6) +# +[env:trigorilla_pro] +platform = ${common_stm32f1.platform} +extends = env:mks_robin +extra_scripts = ${common_stm32f1.extra_scripts} + +# +# MKS Robin E3D (STM32F103RCT6) and +# MKS Robin E3 with TMC2209 +# +[env:mks_robin_e3] +platform = ${common_stm32f1.platform} +extends = common_stm32f1 +board = genericSTM32F103RC +platform_packages = tool-stm32duino +extra_scripts = ${common_stm32f1.extra_scripts} + buildroot/share/PlatformIO/scripts/mks_robin_e3.py +build_flags = ${common_stm32f1.build_flags} + -DDEBUG_LEVEL=0 -DSS_TIMER=4 + +# +# MKS Robin E3p (STM32F103VET6) +# - LVGL UI +# +[env:mks_robin_e3p] +platform = ${common_stm32f1.platform} +extends = common_stm32f1 +board = genericSTM32F103VE +extra_scripts = ${common_stm32f1.extra_scripts} + buildroot/share/PlatformIO/scripts/mks_robin_e3p.py +build_flags = ${common_stm32f1.build_flags} + -DMCU_STM32F103VE -DSS_TIMER=4 +debug_tool = jlink +upload_protocol = jlink + +# +# MKS Robin Lite/Lite2 (STM32F103RCT6) +# +[env:mks_robin_lite] +platform = ${common_stm32f1.platform} +extends = common_stm32f1 +board = genericSTM32F103RC +extra_scripts = ${common_stm32f1.extra_scripts} + buildroot/share/PlatformIO/scripts/mks_robin_lite.py + +# +# MKS ROBIN LITE3 (STM32F103RCT6) +# +[env:mks_robin_lite3] +platform = ${common_stm32f1.platform} +extends = common_stm32f1 +board = genericSTM32F103RC +extra_scripts = ${common_stm32f1.extra_scripts} + buildroot/share/PlatformIO/scripts/mks_robin_lite3.py + +# +# JGAurora A5S A1 (STM32F103ZET6) +# +[env:jgaurora_a5s_a1] +platform = ${common_stm32f1.platform} +extends = common_stm32f1 +board = genericSTM32F103ZE +extra_scripts = ${common_stm32f1.extra_scripts} + buildroot/share/PlatformIO/scripts/jgaurora_a5s_a1_with_bootloader.py +build_flags = ${common_stm32f1.build_flags} + -DSTM32F1xx -DSTM32_XL_DENSITY + +# +# Malyan M200 (STM32F103CB) +# +[env:STM32F103CB_malyan] +platform = ${common_stm32f1.platform} +extends = common_stm32f1 +board = malyanM200 +build_flags = ${common_stm32f1.build_flags} + -DMCU_STM32F103CB -D__STM32F1__=1 -std=c++1y -DSERIAL_USB -ffunction-sections -fdata-sections + -Wl,--gc-sections -DDEBUG_LEVEL=0 -D__MARLIN_FIRMWARE__ +lib_ignore = ${common_stm32f1.lib_ignore} + SoftwareSerialM + +# +# Chitu boards like Tronxy X5s (STM32F103ZET6) +# +[env:chitu_f103] +platform = ${common_stm32f1.platform} +extends = common_stm32f1 +board = CHITU_F103 +extra_scripts = pre:buildroot/share/PlatformIO/scripts/common-dependencies.py + pre:buildroot/share/PlatformIO/scripts/STM32F1_create_variant.py + buildroot/share/PlatformIO/scripts/chitu_crypt.py +build_flags = ${common_stm32f1.build_flags} + -DSTM32F1xx -DSTM32_XL_DENSITY +build_unflags = ${common_stm32f1.build_unflags} + -DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG= -DERROR_LED_PORT=GPIOE -DERROR_LED_PIN=6 + +# +# Some Chitu V5 boards have a problem with GPIO init. +# Use this target if G28 or G29 are always failing. +# +[env:chitu_v5_gpio_init] +platform = ${common_stm32f1.platform} +extends = env:chitu_f103 +build_flags = ${env:chitu_f103.build_flags} -DCHITU_V5_Z_MIN_BUGFIX + +# +# Creality (STM32F103RET6) +# +[env:STM32F103RET6_creality] +platform = ${env:STM32F103RE.platform} +extends = env:STM32F103RE +build_flags = ${env:STM32F103RE.build_flags} -DTEMP_TIMER_CHAN=4 +extra_scripts = ${env:STM32F103RE.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/random-bin.py + buildroot/share/PlatformIO/scripts/STM32F103RET6_creality.py +debug_tool = jlink +upload_protocol = jlink + +# +# FLSUN QQS Pro (STM32F103VET6) using hal STM32 +# board Hispeedv1 +# +[env:flsun_hispeedv1] +platform = ${common_stm32.platform} +extends = common_stm32 +build_flags = ${common_stm32.build_flags} -DMCU_STM32F103VE -DSS_TIMER=4 -DENABLE_HWSERIAL3 +board = genericSTM32F103VE +board_build.core = stm32 +board_build.variant = MARLIN_F103Vx +board_build.ldscript = ldscript.ld +board_build.offset = 0x7000 +board_build.firmware = Robin_mini.bin +board_build.encrypt = Yes +board_upload.offset_address = 0x08007000 +build_unflags = ${common_stm32.build_unflags} -DUSBCON -DUSBD_USE_CDC +extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py + buildroot/share/PlatformIO/scripts/stm32_bootloader.py + buildroot/share/PlatformIO/scripts/mks_encrypt.py + +# +# MKS Robin Nano V1.2 and V2 using hal STM32 +# +[env:mks_robin_nano35_stm32] +platform = ${common_stm32.platform} +extends = common_stm32 +build_flags = ${common_stm32.build_flags} -DMCU_STM32F103VE -DSS_TIMER=4 -DENABLE_HWSERIAL3 +board = genericSTM32F103VE +board_build.core = stm32 +board_build.variant = MARLIN_F103Vx +board_build.ldscript = ldscript.ld +board_build.offset = 0x7000 +board_build.encrypt = Yes +board_build.firmware = Robin_nano35.bin +board_upload.offset_address = 0x08007000 +build_unflags = ${common_stm32.build_unflags} -DUSBCON -DUSBD_USE_CDC +debug_tool = jlink +upload_protocol = jlink +extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py + buildroot/share/PlatformIO/scripts/stm32_bootloader.py + buildroot/share/PlatformIO/scripts/mks_encrypt.py + +# +# Mingda MPX_ARM_MINI +# +[env:mingda_mpx_arm_mini] +platform = ${common_stm32.platform} +extends = common_stm32 +board = genericSTM32F103ZE +board_build.core = stm32 +board_build.variant = MARLIN_F103Zx +board_build.ldscript = ldscript.ld +board_build.offset = 0x10000 +build_flags = ${common_stm32.build_flags} -DENABLE_HWSERIAL3 -DTIMER_SERIAL=TIM5 +build_unflags = ${common_stm32.build_unflags} -DUSBCON -DUSBD_USE_CDC +extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py + buildroot/share/PlatformIO/scripts/stm32_bootloader.py diff --git a/ini/stm32f4.ini b/ini/stm32f4.ini new file mode 100644 index 0000000000..a15dc8b056 --- /dev/null +++ b/ini/stm32f4.ini @@ -0,0 +1,371 @@ +# +# Marlin Firmware +# PlatformIO Configuration File +# + +################################# +# # +# STM32F4 Architecture # +# # +################################# + +# +# ARMED (STM32) +# +[env:ARMED] +platform = ${common_stm32.platform} +extends = common_stm32 +board = armed_v1 +build_flags = ${common_stm32.build_flags} + -O2 -ffreestanding -fsigned-char -fno-move-loop-invariants -fno-strict-aliasing + +# +# STM32F401VE +# 'STEVAL-3DP001V1' STM32F401VE board - https://www.st.com/en/evaluation-tools/steval-3dp001v1.html +# +[env:STM32F401VE_STEVAL] +platform = ${common_stm32.platform} +extends = common_stm32 +board = STEVAL_STM32F401VE +build_flags = ${common_stm32.build_flags} + -DARDUINO_STEVAL -DSTM32F401xE + -DDISABLE_GENERIC_SERIALUSB -DUSBD_USE_CDC_COMPOSITE -DUSE_USB_FS +extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py + buildroot/share/PlatformIO/scripts/STM32F401VE_STEVAL.py + +# +# STM32F401RC +# +[env:FYSETC_CHEETAH_V20] +platform = ${common_stm32.platform} +extends = common_stm32 +board = FYSETC_CHEETAH_V20 +build_flags = ${common_stm32.build_flags} -DSTM32F401xC -DVECT_TAB_OFFSET=0xC000 +extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py + buildroot/share/PlatformIO/scripts/FYSETC_CHEETAH_V20.py + +# +# FLYF407ZG +# +[env:FLYF407ZG] +platform = ${common_stm32.platform} +extends = common_stm32 +board = FLYF407ZG +build_flags = ${common_stm32.build_flags} + -DVECT_TAB_OFFSET=0x8000 +extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py + +# +# FLY MINI(stm32f103rct6) +# +[env:FLY_MINI] +platform = ${common_stm32f1.platform} +extends = common_stm32f1 +board = genericSTM32F103RC +extra_scripts = ${common_stm32f1.extra_scripts} + buildroot/share/PlatformIO/scripts/fly_mini.py +build_flags = ${common_stm32f1.build_flags} + -DDEBUG_LEVEL=0 -DSS_TIMER=4 + +# +# FYSETC S6 (STM32F446VET6 ARM Cortex-M4) +# +[env:FYSETC_S6] +platform = ${common_stm32.platform} +extends = common_stm32 +platform_packages = tool-stm32duino +board = marlin_fysetc_s6 +build_flags = ${common_stm32.build_flags} + -DVECT_TAB_OFFSET=0x10000 + -DHAL_PCD_MODULE_ENABLED +extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py +debug_tool = stlink +upload_protocol = dfu +upload_command = dfu-util -a 0 -s 0x08010000:leave -D "$SOURCE" + +# +# STM32F407VET6 with RAMPS-like shield +# 'Black' STM32F407VET6 board - https://wiki.stm32duino.com/index.php?title=STM32F407 +# Shield - https://github.com/jmz52/Hardware +# +[env:STM32F407VE_black] +platform = ${common_stm32.platform} +extends = common_stm32 +board = blackSTM32F407VET6 +build_flags = ${common_stm32.build_flags} + -DARDUINO_BLACK_F407VE + -DUSBD_USE_CDC_COMPOSITE -DUSE_USB_FS +extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py + +# +# Anet ET4-MB_V1.x/ET4P-MB_V1.x (STM32F407VGT6 ARM Cortex-M4) +# For use with with davidtgbe's OpenBLT bootloader https://github.com/davidtgbe/openblt/releases +# Comment out board_build.offset = 0x10000 if you don't plan to use OpenBLT/flashing directly to 0x08000000. +# +[env:Anet_ET4_OpenBLT] +platform = ${common_stm32.platform} +extends = common_stm32 +build_flags = ${common_stm32.build_flags} -DHAL_SD_MODULE_ENABLED -DHAL_SRAM_MODULE_ENABLED +board = genericSTM32F407VGT6 +board_build.core = stm32 +board_build.variant = MARLIN_F4x7Vx +board_build.ldscript = ldscript.ld +board_build.firmware = firmware.srec +# Just openblt.py (not stm32_bootloader.py) generates the file +board_build.encrypt = Yes +board_build.offset = 0x10000 +board_upload.offset_address = 0x08010000 +build_unflags = ${common_stm32.build_unflags} -DUSBCON -DUSBD_USE_CDC -DUSBD_VID=0x0483 +debug_tool = jlink +upload_protocol = jlink +extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py + buildroot/share/PlatformIO/scripts/stm32_bootloader.py + buildroot/share/PlatformIO/scripts/openblt.py + +# +# BigTreeTech SKR Pro (STM32F407ZGT6 ARM Cortex-M4) +# +[env:BIGTREE_SKR_PRO] +platform = ${common_stm32.platform} +extends = common_stm32 +board = BigTree_SKR_Pro +build_flags = ${common_stm32.build_flags} + -DSTM32F407_5ZX -DVECT_TAB_OFFSET=0x8000 +extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py +#upload_protocol = stlink +#upload_command = "$PROJECT_PACKAGES_DIR/tool-stm32duino/stlink/ST-LINK_CLI.exe" -c SWD -P "$BUILD_DIR/firmware.bin" 0x8008000 -Rst -Run +debug_tool = stlink +debug_init_break = + +# +# USB Flash Drive mix-ins for STM32 +# +[stm_flash_drive] +platform_packages = framework-arduinoststm32@https://github.com/rhapsodyv/Arduino_Core_STM32/archive/usb-host-msc.zip +build_flags = ${common_stm32.build_flags} + -DHAL_PCD_MODULE_ENABLED -DHAL_HCD_MODULE_ENABLED + -DUSBHOST -DUSBH_IRQ_PRIO=3 -DUSBH_IRQ_SUBPRIO=4 + +# +# BigTreeTech SKR Pro (STM32F407ZGT6 ARM Cortex-M4) with USB Flash Drive Support +# +[env:BIGTREE_SKR_PRO_usb_flash_drive] +extends = env:BIGTREE_SKR_PRO +platform_packages = ${stm_flash_drive.platform_packages} +build_unflags = -DUSBCON -DUSBD_USE_CDC +build_flags = ${stm_flash_drive.build_flags} + -DSTM32F407_5ZX -DVECT_TAB_OFFSET=0x8000 + +# +# Bigtreetech GTR V1.0 (STM32F407IGT6 ARM Cortex-M4) +# +[env:BIGTREE_GTR_V1_0] +platform = ${common_stm32.platform} +extends = common_stm32 +board = BigTree_GTR_v1 +extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py +build_flags = ${common_stm32.build_flags} + -DSTM32F407IX -DVECT_TAB_OFFSET=0x8000 + +# +# Bigtreetech GTR V1.0 (STM32F407IGT6 ARM Cortex-M4) with USB Flash Drive Support +# +[env:BIGTREE_GTR_V1_0_usb_flash_drive] +extends = env:BIGTREE_GTR_V1_0 +platform_packages = ${stm_flash_drive.platform_packages} +build_unflags = -DUSBCON -DUSBD_USE_CDC +build_flags = ${stm_flash_drive.build_flags} + -DSTM32F407IX -DVECT_TAB_OFFSET=0x8000 + +# +# BigTreeTech BTT002 V1.0 (STM32F407VGT6 ARM Cortex-M4) +# +[env:BIGTREE_BTT002] +platform = ${common_stm32.platform} +extends = common_stm32 +board = BigTree_Btt002 +build_flags = ${common_stm32.build_flags} + -DSTM32F407_5VX -DVECT_TAB_OFFSET=0x8000 + -DHAVE_HWSERIAL2 + -DHAVE_HWSERIAL3 + -DPIN_SERIAL2_RX=PD_6 + -DPIN_SERIAL2_TX=PD_5 +extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py + +# +# Lerdge base +# +[lerdge_common] +platform = ${common_stm32.platform} +extends = common_stm32 +board = LERDGE +board_build.offset = 0x10000 +board_build.encrypt = Yes +extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py + buildroot/share/PlatformIO/scripts/stm32_bootloader.py + buildroot/share/PlatformIO/scripts/lerdge.py +build_flags = ${common_stm32.build_flags} + -DSTM32F4 -DSTM32F4xx -DTARGET_STM32F4 + -DDISABLE_GENERIC_SERIALUSB -DARDUINO_ARCH_STM32 -DARDUINO_LERDGE + -DHAL_SRAM_MODULE_ENABLED +build_unflags = ${common_stm32.build_unflags} -DUSBCON -DUSBD_USE_CDC -DUSBD_VID=0x0483 + +# +# Lerdge X +# +[env:LERDGEX] +platform = ${lerdge_common.platform} +extends = lerdge_common +board_build.firmware = Lerdge_X_firmware_force.bin + +# +# Lerdge X with USB Flash Drive Support +# +[env:LERDGEX_usb_flash_drive] +platform = ${env:LERDGEX.platform} +extends = env:LERDGEX +platform_packages = ${stm_flash_drive.platform_packages} +build_flags = ${stm_flash_drive.build_flags} + +# +# Lerdge S +# +[env:LERDGES] +platform = ${lerdge_common.platform} +extends = lerdge_common +board_build.firmware = Lerdge_firmware_force.bin + +# +# Lerdge S with USB Flash Drive Support +# +[env:LERDGES_usb_flash_drive] +platform = ${env:LERDGES.platform} +extends = env:LERDGES +platform_packages = ${stm_flash_drive.platform_packages} +build_flags = ${stm_flash_drive.build_flags} + +# +# Lerdge K +# +[env:LERDGEK] +platform = ${lerdge_common.platform} +extends = lerdge_common +board_build.firmware = Lerdge_K_firmware_force.bin +build_flags = ${lerdge_common.build_flags} + -DLERDGEK + +# +# Lerdge K with USB Flash Drive Support +# +[env:LERDGEK_usb_flash_drive] +platform = ${env:LERDGEK.platform} +extends = env:LERDGEK +platform_packages = ${stm_flash_drive.platform_packages} +build_flags = ${stm_flash_drive.build_flags} + +# +# RUMBA32 +# +[env:rumba32] +platform = ${common_stm32.platform} +extends = common_stm32 +build_flags = ${common_stm32.build_flags} + -Os + -DHAL_PCD_MODULE_ENABLED + -DDISABLE_GENERIC_SERIALUSB + -DHAL_UART_MODULE_ENABLED + -DTIMER_SERIAL=TIM9 +board = rumba32_f446ve +upload_protocol = dfu +monitor_speed = 500000 + +# +# MKS Robin Pro V2 +# +[env:mks_robin_pro2] +platform = ${common_stm32.platform} +platform_packages = ${stm_flash_drive.platform_packages} +extends = common_stm32 +build_flags = ${stm_flash_drive.build_flags} +board = genericSTM32F407VET6 +board_build.core = stm32 +board_build.variant = MARLIN_F4x7Vx +board_build.ldscript = ldscript.ld +board_build.firmware = firmware.bin +board_build.offset = 0x0000 +board_upload.offset_address = 0x08000000 +build_unflags = ${common_stm32.build_unflags} -DUSBCON -DUSBD_USE_CDC +debug_tool = jlink +upload_protocol = jlink +extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py + buildroot/share/PlatformIO/scripts/stm32_bootloader.py + +# +# This SPI is used by Robin Nano V3 +# +[stm32f4_I2C1] +build_flags = -DPIN_WIRE_SCL=PB6 -DPIN_WIRE_SDA=PB7 + +# +# MKS Robin Nano V3 +# +[env:mks_robin_nano_v3] +platform = ${common_stm32.platform} +extends = common_stm32 +build_flags = ${common_stm32.build_flags} ${stm32f4_I2C1.build_flags} -DHAL_PCD_MODULE_ENABLED -DUSBCON -DUSBD_USE_CDC +board = genericSTM32F407VGT6 +board_build.core = stm32 +board_build.variant = MARLIN_F4x7Vx +board_build.ldscript = ldscript.ld +board_build.firmware = Robin_nano_v3.bin +board_build.offset = 0xC000 +board_upload.offset_address = 0x0800C000 +build_unflags = ${common_stm32.build_unflags} +debug_tool = jlink +upload_protocol = jlink +extra_scripts = ${common.extra_scripts} + pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py + buildroot/share/PlatformIO/scripts/stm32_bootloader.py + +# +# MKS Robin Nano V3 with USB Flash Drive Support +# Currently, using a STM32duino fork, until USB Host get merged +# +[env:mks_robin_nano_v3_usb_flash_drive] +extends = env:mks_robin_nano_v3 +platform_packages = ${stm_flash_drive.platform_packages} +build_flags = ${stm_flash_drive.build_flags} ${stm32f4_I2C1.build_flags} + -DUSBCON + -DUSE_USBHOST_HS + -DUSBD_IRQ_PRIO=5 + -DUSBD_IRQ_SUBPRIO=6 + -DUSE_USB_HS_IN_FS + -DUSBD_USE_CDC + +# +# MKS Robin Nano V3 with USB Flash Drive Support and Shared Media +# Currently, using a STM32duino fork, until USB Host and USB Device MSC get merged +# +[env:mks_robin_nano_v3_usb_flash_drive_msc] +platform = ${common_stm32.platform} +extends = env:mks_robin_nano_v3 +platform_packages = framework-arduinoststm32@https://github.com/rhapsodyv/Arduino_Core_STM32/archive/usb-host-msc-cdc-msc.zip +build_unflags = ${common_stm32.build_unflags} -DUSBD_USE_CDC +build_flags = ${stm_flash_drive.build_flags} ${stm32f4_I2C1.build_flags} + -DUSBCON + -DUSE_USBHOST_HS + -DUSBD_IRQ_PRIO=5 + -DUSBD_IRQ_SUBPRIO=6 + -DUSE_USB_HS_IN_FS + -DUSBD_USE_CDC_MSC diff --git a/ini/stm32f7.ini b/ini/stm32f7.ini new file mode 100644 index 0000000000..442ef5f9b0 --- /dev/null +++ b/ini/stm32f7.ini @@ -0,0 +1,30 @@ +# +# Marlin Firmware +# PlatformIO Configuration File +# + +################################# +# # +# STM32F7 Architecture # +# # +################################# + +# +# ST NUCLEO-F767ZI Development Board +# This environment is for testing purposes prior to control boards +# being readily available based on STM32F7 MCUs +# +[env:NUCLEO_F767ZI] +platform = ${common_stm32.platform} +extends = common_stm32 +board = nucleo_f767zi +build_flags = ${common_stm32.build_flags} -DTIMER_SERIAL=TIM9 + +# +# REMRAM_V1 +# +[env:REMRAM_V1] +platform = ${common_stm32.platform} +extends = common_stm32 +board = remram_v1 +build_flags = ${common_stm32.build_flags} diff --git a/ini/teensy.ini b/ini/teensy.ini new file mode 100644 index 0000000000..ae33cc7a02 --- /dev/null +++ b/ini/teensy.ini @@ -0,0 +1,42 @@ +# +# Marlin Firmware +# PlatformIO Configuration File +# + +################################# +# # +# Teensy Architectures # +# # +################################# + +# +# Teensy 3.1 / 3.2 (ARM Cortex-M4) +# +[env:teensy31] +platform = teensy +board = teensy31 +src_filter = ${common.default_src_filter} + +lib_ignore = NativeEthernet + +# +# Teensy 3.5 / 3.6 (ARM Cortex-M4) +# +[env:teensy35] +platform = teensy +board = teensy35 +src_filter = ${common.default_src_filter} + +lib_ignore = NativeEthernet + +[env:teensy36] +platform = teensy +board = teensy36 +src_filter = ${common.default_src_filter} + +lib_ignore = NativeEthernet + +# +# Teensy 4.0 / 4.1 (ARM Cortex-M7) +# +[env:teensy41] +platform = teensy +board = teensy41 +src_filter = ${common.default_src_filter} + diff --git a/platformio.ini b/platformio.ini index 26b27bbf99..913bb44ae0 100644 --- a/platformio.ini +++ b/platformio.ini @@ -20,6 +20,19 @@ src_dir = Marlin boards_dir = buildroot/share/PlatformIO/boards default_envs = mega2560 include_dir = Marlin +extra_configs = + ini/avr.ini + ini/due.ini + ini/esp32.ini + ini/features.ini + ini/lpc176x.ini + ini/native.ini + ini/samd51.ini + ini/stm32f0.ini + ini/stm32f1.ini + ini/stm32f4.ini + ini/stm32f7.ini + ini/teensy.ini # # The 'common' values are used for most Marlin builds @@ -222,217 +235,6 @@ extra_scripts = build_flags = -fmax-errors=5 -g3 -D__MARLIN_FIRMWARE__ -fmerge-constants lib_deps = -# -# Feature Dependencies -# -[features] -YHCB2004 = red-scorp/LiquidCrystal_AIP31068@^1.0.4, red-scorp/SoftSPIB@^1.1.1 -HAS_TFT_LVGL_UI = lvgl=https://github.com/makerbase-mks/LVGL-6.1.1-MKS/archive/master.zip - src_filter=+ - extra_scripts=download_mks_assets.py -POSTMORTEM_DEBUGGING = src_filter=+ + - build_flags=-funwind-tables -MKS_WIFI_MODULE = QRCode=https://github.com/makerbase-mks/QRCode/archive/master.zip -HAS_TRINAMIC_CONFIG = TMCStepper@~0.7.1 - src_filter=+ + + + + -HAS_STEALTHCHOP = src_filter=+ -SR_LCD_3W_NL = SailfishLCD=https://github.com/mikeshub/SailfishLCD/archive/master.zip -HAS_MOTOR_CURRENT_I2C = SlowSoftI2CMaster - src_filter=+ -HAS_TMC26X = TMC26XStepper=https://github.com/trinamic/TMC26XStepper/archive/master.zip - src_filter=+ -HAS_L64XX = Arduino-L6470@0.8.0 - src_filter=+ + + + -NEOPIXEL_LED = Adafruit NeoPixel@1.5.0 - src_filter=+ -TEMP_.+_IS_MAX31865 = Adafruit MAX31865 library@~1.1.0 -USES_LIQUIDCRYSTAL = bitbucket-fmalpartida/LiquidCrystal@1.5.0 -USES_LIQUIDCRYSTAL_I2C = marcoschwartz/LiquidCrystal_I2C@1.1.4 -USES_LIQUIDTWI2 = LiquidTWI2@1.2.7 -HAS_WIRED_LCD = src_filter=+ -HAS_MARLINUI_HD44780 = src_filter=+ -HAS_MARLINUI_U8GLIB = U8glib-HAL@~0.4.1 - src_filter=+ -HAS_(FSMC|SPI)_TFT = src_filter=+ + + -HAS_FSMC_TFT = src_filter=+ + -HAS_SPI_TFT = src_filter=+ + -I2C_EEPROM = src_filter=+ -SPI_EEPROM = src_filter=+ -HAS_GRAPHICAL_TFT = src_filter=+ -DWIN_CREALITY_LCD = src_filter=+ -IS_TFTGLCD_PANEL = src_filter=+ -HAS_TOUCH_BUTTONS = src_filter=+ -HAS_LCD_MENU = src_filter=+ -HAS_GAMES = src_filter=+ -MARLIN_BRICKOUT = src_filter=+ -MARLIN_INVADERS = src_filter=+ -MARLIN_MAZE = src_filter=+ -MARLIN_SNAKE = src_filter=+ -HAS_MENU_BACKLASH = src_filter=+ -HAS_MENU_BED_CORNERS = src_filter=+ -LCD_BED_LEVELING = src_filter=+ -HAS_MENU_CANCELOBJECT = src_filter=+ -HAS_MENU_DELTA_CALIBRATE = src_filter=+ -HAS_MENU_FILAMENT = src_filter=+ -LCD_INFO_MENU = src_filter=+ -HAS_MENU_JOB_RECOVERY = src_filter=+ -HAS_MULTI_LANGUAGE = src_filter=+ -HAS_MENU_LED = src_filter=+ -HAS_MENU_MEDIA = src_filter=+ -HAS_MENU_MIXER = src_filter=+ -HAS_MENU_MMU2 = src_filter=+ -HAS_MENU_PASSWORD = src_filter=+ -HAS_MENU_POWER_MONITOR = src_filter=+ -HAS_MENU_CUTTER = src_filter=+ -HAS_MENU_TEMPERATURE = src_filter=+ -HAS_MENU_TMC = src_filter=+ -HAS_MENU_TOUCH_SCREEN = src_filter=+ -HAS_MENU_TRAMMING = src_filter=+ -HAS_MENU_UBL = src_filter=+ -ANYCUBIC_LCD_CHIRON = src_filter=+ + -ANYCUBIC_LCD_I3MEGA = src_filter=+ + -NEXTION_TFT = src_filter=+ + -HAS_DGUS_LCD = src_filter=+ + -DGUS_LCD_UI_FYSETC = src_filter=+ -DGUS_LCD_UI_HIPRECY = src_filter=+ -DGUS_LCD_UI_MKS = src_filter=+ -DGUS_LCD_UI_ORIGIN = src_filter=+ -TOUCH_UI_FTDI_EVE = src_filter=+ -EXTUI_EXAMPLE = src_filter=+ -MALYAN_LCD = src_filter=+ -USE_UHS2_USB = src_filter=+ -USE_UHS3_USB = src_filter=+ -USB_FLASH_DRIVE_SUPPORT = src_filter=+ -AUTO_BED_LEVELING_BILINEAR = src_filter=+ -AUTO_BED_LEVELING_(3POINT|(BI)?LINEAR) = src_filter=+ -MESH_BED_LEVELING = src_filter=+ + -AUTO_BED_LEVELING_UBL = src_filter=+ + -UBL_HILBERT_CURVE = src_filter=+ -BACKLASH_COMPENSATION = src_filter=+ -BARICUDA = src_filter=+ + -BINARY_FILE_TRANSFER = src_filter=+ + -BLTOUCH = src_filter=+ -CANCEL_OBJECTS = src_filter=+ + -CASE_LIGHT_ENABLE = src_filter=+ + -EXTERNAL_CLOSED_LOOP_CONTROLLER = src_filter=+ + -USE_CONTROLLER_FAN = src_filter=+ -HAS_MOTOR_CURRENT_DAC = src_filter=+ -DIRECT_STEPPING = src_filter=+ + -EMERGENCY_PARSER = src_filter=+ - -I2C_POSITION_ENCODERS = src_filter=+ -IIC_BL24CXX_EEPROM = src_filter=+ -HAS_SPI_FLASH = src_filter=+ -HAS_ETHERNET = src_filter=+ + -HAS_FANMUX = src_filter=+ -FILAMENT_WIDTH_SENSOR = src_filter=+ + -FWRETRACT = src_filter=+ + -HOST_ACTION_COMMANDS = src_filter=+ -HOTEND_IDLE_TIMEOUT = src_filter=+ -JOYSTICK = src_filter=+ -BLINKM = src_filter=+ -HAS_COLOR_LEDS = src_filter=+ + -PCA9533 = src_filter=+ -PCA9632 = src_filter=+ -PRINTER_EVENT_LEDS = src_filter=+ -TEMP_STAT_LEDS = src_filter=+ -MAX7219_DEBUG = src_filter=+ + -HAS_MEATPACK = src_filter=+ -MIXING_EXTRUDER = src_filter=+ + -HAS_PRUSA_MMU1 = src_filter=+ -HAS_PRUSA_MMU2 = src_filter=+ + -PASSWORD_FEATURE = src_filter=+ + -ADVANCED_PAUSE_FEATURE = src_filter=+ + + -AUTO_POWER_CONTROL = src_filter=+ -HAS_POWER_MONITOR = src_filter=+ + -POWER_LOSS_RECOVERY = src_filter=+ + -PROBE_TEMP_COMPENSATION = src_filter=+ + -HAS_FILAMENT_SENSOR = src_filter=+ + -(EXT|MANUAL)_SOLENOID.* = src_filter=+ + -MK2_MULTIPLEXER = src_filter=+ -HAS_CUTTER = src_filter=+ + -EXPERIMENTAL_I2CBUS = src_filter=+ + -MECHANICAL_GANTRY_CAL.+ = src_filter=+ -Z_MULTI_ENDSTOPS = src_filter=+ -Z_STEPPER_AUTO_ALIGN = src_filter=+ + -G26_MESH_VALIDATION = src_filter=+ -ASSISTED_TRAMMING = src_filter=+ + -HAS_MESH = src_filter=+ -HAS_LEVELING = src_filter=+ + -DELTA_AUTO_CALIBRATION = src_filter=+ -CALIBRATION_GCODE = src_filter=+ -Z_MIN_PROBE_REPEATABILITY_TEST = src_filter=+ -M100_FREE_MEMORY_WATCHER = src_filter=+ -BACKLASH_GCODE = src_filter=+ -IS_KINEMATIC = src_filter=+ -HAS_EXTRA_ENDSTOPS = src_filter=+ -SKEW_CORRECTION_GCODE = src_filter=+ -DIRECT_PIN_CONTROL = src_filter=+ + -PINS_DEBUGGING = src_filter=+ -NO_VOLUMETRICS = src_filter=- -HAS_MULTI_EXTRUDER = src_filter=+ -HAS_HOTEND_OFFSET = src_filter=+ -EDITABLE_SERVO_ANGLES = src_filter=+ -PIDTEMP = src_filter=+ -PREVENT_COLD_EXTRUSION = src_filter=+ -PIDTEMPBED = src_filter=+ -HAS_USER_THERMISTORS = src_filter=+ -SD_ABORT_ON_ENDSTOP_HIT = src_filter=+ -BAUD_RATE_GCODE = src_filter=+ -HAS_SMART_EFF_MOD = src_filter=+ -COOLANT_CONTROL = src_filter=+ -HAS_SOFTWARE_ENDSTOPS = src_filter=+ -HAS_DUPLICATION_MODE = src_filter=+ -LIN_ADVANCE = src_filter=+ -PHOTO_GCODE = src_filter=+ -CONTROLLER_FAN_EDITABLE = src_filter=+ -GCODE_MACROS = src_filter=+ -GRADIENT_MIX = src_filter=+ -HAS_SAVED_POSITIONS = src_filter=+ + -PARK_HEAD_ON_PAUSE = src_filter=+ -FILAMENT_LOAD_UNLOAD_GCODES = src_filter=+ -CNC_WORKSPACE_PLANES = src_filter=+ -CNC_COORDINATE_SYSTEMS = src_filter=+ -HAS_M206_COMMAND = src_filter=+ -EXPECTED_PRINTER_CHECK = src_filter=+ -HOST_KEEPALIVE_FEATURE = src_filter=+ -REPETIER_GCODE_M360 = src_filter=+ -HAS_GCODE_M876 = src_filter=+ -HAS_RESUME_CONTINUE = src_filter=+ -HAS_LCD_CONTRAST = src_filter=+ -LCD_SET_PROGRESS_MANUALLY = src_filter=+ -TOUCH_SCREEN_CALIBRATION = src_filter=+ -ARC_SUPPORT = src_filter=+ -GCODE_MOTION_MODES = src_filter=+ -BABYSTEPPING = src_filter=+ + -Z_PROBE_SLED = src_filter=+ -G38_PROBE_TARGET = src_filter=+ -MAGNETIC_PARKING_EXTRUDER = src_filter=+ -SDSUPPORT = src_filter=+ + + + + + + -HAS_MEDIA_SUBCALLS = src_filter=+ -GCODE_REPEAT_MARKERS = src_filter=+ + -HAS_EXTRUDERS = src_filter=+ + -HAS_COOLER = src_filter=+ + -AUTO_REPORT_TEMPERATURES = src_filter=+ -INCH_MODE_SUPPORT = src_filter=+ -TEMPERATURE_UNITS_SUPPORT = src_filter=+ -NEED_HEX_PRINT = src_filter=+ -NEED_LSF = src_filter=+ -NOZZLE_PARK_FEATURE = src_filter=+ + -NOZZLE_CLEAN_FEATURE = src_filter=+ + -DELTA = src_filter=+ + -BEZIER_CURVE_SUPPORT = src_filter=+ + -PRINTCOUNTER = src_filter=+ -HAS_BED_PROBE = src_filter=+ + + + -IS_SCARA = src_filter=+ -HAS_SERVOS = src_filter=+ + -MORGAN_SCARA = src_filter=+ -HAS_MICROSTEPS = src_filter=+ -(ESP3D_)?WIFISUPPORT = AsyncTCP, ESP Async WebServer - ESP3DLib=https://github.com/luc-github/ESP3DLib/archive/master.zip - arduinoWebSockets=links2004/WebSockets@2.3.4 - luc-github/ESP32SSDP@^1.1.1 - lib_ignore=ESPAsyncTCP - # # Default values apply to all 'env:' prefixed environments # @@ -452,1208 +254,6 @@ monitor_flags = --filter time -################################# -# # -# Unique Core Architectures # -# # -# Add a new "env" below if no # -# entry has values suitable to # -# build for a given board. # -# # -################################# - -################################# -# # -# AVR Architecture # -# # -################################# - -# -# AVR (8-bit) Common Environment values -# -[common_avr8] -board_build.f_cpu = 16000000L -src_filter = ${common.default_src_filter} + - -# -# ATmega2560 -# -[env:mega2560] -platform = atmelavr -extends = common_avr8 -board = megaatmega2560 - -# -# ATmega2560 with extended pins 70-85 defined -# BOARD_BQ_ZUM_MEGA_3D -# BOARD_ULTIMAIN_2 -# BOARD_MIGHTYBOARD_REVE -# BOARD_EINSTART_S -# -[env:mega2560ext] -platform = atmelavr -extends = env:mega2560 -board_build.variant = megaextendedpins -extra_scripts = ${common.extra_scripts} - pre:buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py - -# -# ATmega1280 -# -[env:mega1280] -platform = atmelavr -extends = common_avr8 -board = megaatmega1280 - -# -# MightyBoard AVR with extended pins -# -[mega_extended_optimized] -extends = common_avr8 -board_build.variant = megaextendedpins -extra_scripts = ${common.extra_scripts} - pre:buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py -upload_speed = 57600 -build_flags = ${common.build_flags} -fno-tree-scev-cprop -fno-split-wide-types -Wl,--relax -mcall-prologues - -# -# MightyBoard ATmega1280 -# -[env:MightyBoard1280] -platform = atmelavr -extends = mega_extended_optimized -board = megaatmega1280 - -# -# MightyBoard ATmega2560 -# -[env:MightyBoard2560] -platform = atmelavr -extends = mega_extended_optimized -board = megaatmega2560 - -# -# RAMBo -# -[env:rambo] -platform = atmelavr -extends = common_avr8 -board = reprap_rambo - -# -# FYSETC F6 V1.3 / V1.4 -# -[env:FYSETC_F6] -platform = atmelavr -extends = common_avr8 -board = fysetc_f6 - -# -# Sanguinololu (ATmega644p) -# -[env:sanguino644p] -platform = atmelavr -extends = common_avr8 -board = sanguino_atmega644p - -# -# Sanguinololu (ATmega1284p) -# -[env:sanguino1284p] -platform = atmelavr -extends = common_avr8 -board = sanguino_atmega1284p -board_upload.maximum_size = 126976 - -# -# Melzi and clones (ATmega1284p) -# -[env:melzi] -platform = atmelavr -extends = env:sanguino1284p -upload_speed = 57600 - -# -# Sanguinololu (ATmega1284p stock bootloader with tuned flags) -# - -[tuned_1284p] -build_flags = ${common.build_flags} -fno-tree-scev-cprop -fno-split-wide-types -Wl,--relax -mcall-prologues - -[env:sanguino1284p_optimized] -platform = atmelavr -extends = env:melzi -build_flags = ${tuned_1284p.build_flags} - -# -# Melzi and clones (alias for sanguino1284p_optimized) -# -[env:melzi_optimized] -platform = atmelavr -extends = env:sanguino1284p_optimized - -# -# Melzi and clones (Optiboot bootloader) -# -[env:melzi_optiboot] -platform = atmelavr -extends = common_avr8 -board = sanguino_atmega1284p -upload_speed = 115200 - -# -# Melzi and clones (Zonestar Melzi2 with tuned flags) -# -[env:melzi_optiboot_optimized] -platform = atmelavr -extends = env:melzi_optiboot -build_flags = ${tuned_1284p.build_flags} - -# -# AT90USB1286 boards using CDC bootloader -# - BRAINWAVE -# - BRAINWAVE_PRO -# - SAV_MKI -# - TEENSYLU -# -[env:at90usb1286_cdc] -platform = teensy -extends = common_avr8 -board = at90usb1286 -lib_ignore = ${env:common_avr8.lib_ignore}, Teensy_ADC, NativeEthernet - -# -# AT90USB1286 boards using DFU bootloader -# - Printrboard -# - Printrboard Rev.F -# - ? 5DPRINT ? -# -[env:at90usb1286_dfu] -platform = teensy -extends = env:at90usb1286_cdc - -################################# -# # -# DUE Architecture # -# # -################################# - -# -# Due (Atmel SAM3X8E ARM Cortex-M3) -# -# - RAMPS4DUE -# - RADDS -# -[env:DUE] -platform = atmelsam -board = due -src_filter = ${common.default_src_filter} + + - -[env:DUE_USB] -platform = atmelsam -extends = env:DUE -board = dueUSB - -# -# Archim SAM -# -[common_DUE_archim] -platform = atmelsam -extends = env:DUE -board = archim -build_flags = ${common.build_flags} - -DARDUINO_SAM_ARCHIM -DARDUINO_ARCH_SAM -D__SAM3X8E__ -DUSBCON -board_build.variants_dir = buildroot/share/PlatformIO/variants/ -extra_scripts = ${common.extra_scripts} - Marlin/src/HAL/DUE/upload_extra_script.py - -[env:DUE_archim] -platform = ${common_DUE_archim.platform} -extends = common_DUE_archim - -################################# -# # -# SAMD51 Architecture # -# # -################################# - -# -# Adafruit Grand Central M4 (Atmel SAMD51P20A ARM Cortex-M4) -# -[env:SAMD51_grandcentral_m4] -platform = atmelsam -board = adafruit_grandcentral_m4 -build_flags = ${common.build_flags} -std=gnu++17 -build_unflags = -std=gnu++11 -src_filter = ${common.default_src_filter} + -lib_deps = ${common.lib_deps} - SoftwareSerialM - Adafruit SPIFlash -extra_scripts = ${common.extra_scripts} - pre:buildroot/share/PlatformIO/scripts/SAMD51_grandcentral_m4.py -custom_marlin.SDSUPPORT = SdFat - Adafruit Fork -debug_tool = jlink - -################################# -# # -# LPC176x Architecture # -# # -################################# - -# -# NXP LPC176x ARM Cortex-M3 -# -[common_LPC] -platform = https://github.com/p3p/pio-nxplpc-arduino-lpc176x/archive/0.1.3.zip -platform_packages = framework-arduino-lpc176x@^0.2.6 -board = nxp_lpc1768 -lib_ldf_mode = off -lib_compat_mode = strict -extra_scripts = ${common.extra_scripts} - Marlin/src/HAL/LPC1768/upload_extra_script.py -src_filter = ${common.default_src_filter} + + -lib_deps = ${common.lib_deps} - Servo -custom_marlin.USES_LIQUIDCRYSTAL = arduino-libraries/LiquidCrystal@~1.0.7 -custom_marlin.NEOPIXEL_LED = Adafruit NeoPixel=https://github.com/p3p/Adafruit_NeoPixel/archive/1.5.0.zip -build_flags = ${common.build_flags} -DU8G_HAL_LINKS -IMarlin/src/HAL/LPC1768/include -IMarlin/src/HAL/LPC1768/u8g - # debug options for backtrace - #-funwind-tables - #-mpoke-function-name - -# -# NXP LPC176x ARM Cortex-M3 -# -[env:LPC1768] -platform = ${common_LPC.platform} -extends = common_LPC -board = nxp_lpc1768 - -[env:LPC1769] -platform = ${common_LPC.platform} -extends = common_LPC -board = nxp_lpc1769 - -################################# -# # -# STM32 Architecture # -# # -################################# - -# -# HAL/STM32 Base Environment values -# -[common_stm32] -platform = ststm32@~12.0 -build_flags = ${common.build_flags} - -std=gnu++14 - -DUSBCON -DUSBD_USE_CDC - -DTIM_IRQ_PRIO=13 - -DADC_RESOLUTION=12 -build_unflags = -std=gnu++11 -src_filter = ${common.default_src_filter} + + - -# -# HAL/STM32F1 Common Environment values -# -[common_stm32f1] -platform = ststm32@~12.0 -board_build.core = maple -build_flags = !python Marlin/src/HAL/STM32F1/build_flags.py - ${common.build_flags} - -DARDUINO_ARCH_STM32 -build_unflags = -std=gnu11 -std=gnu++11 -src_filter = ${common.default_src_filter} + -lib_ignore = SPI, FreeRTOS701, FreeRTOS821 -lib_deps = ${common.lib_deps} - SoftwareSerialM -platform_packages = tool-stm32duino -extra_scripts = ${common.extra_scripts} - pre:buildroot/share/PlatformIO/scripts/fix_framework_weakness.py - -# -# STM32F103RC -# -[env:STM32F103RC] -platform = ${common_stm32f1.platform} -extends = common_stm32f1 -board = genericSTM32F103RC -monitor_speed = 115200 - -# -# MEEB_3DP (STM32F103RCT6 with 512K) -# -[env:STM32F103RC_meeb] -platform = ${common_stm32f1.platform} -extends = common_stm32f1 -board = MEEB_3DP -build_flags = ${common_stm32f1.build_flags} - -DDEBUG_LEVEL=0 - -DSS_TIMER=4 - -DSTM32_FLASH_SIZE=512 - -DHSE_VALUE=12000000U - -DUSE_USB_COMPOSITE - -DVECT_TAB_OFFSET=0x2000 - -DGENERIC_BOOTLOADER -extra_scripts = ${common_stm32f1.extra_scripts} - pre:buildroot/share/PlatformIO/scripts/STM32F1_create_variant.py - buildroot/share/PlatformIO/scripts/STM32F103RC_MEEB_3DP.py -lib_deps = ${common.lib_deps} - SoftwareSerialM - USBComposite for STM32F1@0.91 -custom_marlin.NEOPIXEL_LED = Adafruit NeoPixel=https://github.com/ccccmagicboy/Adafruit_NeoPixel#meeb_3dp_use -debug_tool = stlink -upload_protocol = dfu - -# -# STM32F103RC_fysetc -# -[env:STM32F103RC_fysetc] -platform = ${common_stm32f1.platform} -extends = env:STM32F103RC -extra_scripts = ${common_stm32f1.extra_scripts} - buildroot/share/PlatformIO/scripts/STM32F103RC_fysetc.py -build_flags = ${common_stm32f1.build_flags} -DDEBUG_LEVEL=0 -lib_ldf_mode = chain -debug_tool = stlink -upload_protocol = serial - -# -# BigTree SKR Mini V1.1 / SKR mini E3 / SKR E3 DIP (STM32F103RCT6 ARM Cortex-M3) -# -# STM32F103RC_btt ............. RCT6 with 256K -# STM32F103RC_btt_USB ......... RCT6 with 256K (USB mass storage) -# STM32F103RC_btt_512K ........ RCT6 with 512K -# STM32F103RC_btt_512K_USB .... RCT6 with 512K (USB mass storage) -# -# WARNING! If you have an SKR Mini v1.1 or an SKR Mini E3 1.0 / 1.2 / 2.0 / DIP -# and experience a printer freeze, re-flash Marlin using the regular (non-512K) -# build option. 256K chips may be re-branded 512K chips, but this means the -# upper 256K is sketchy, and failure is very likely. -# - -[env:STM32F103RC_btt] -platform = ${common_stm32f1.platform} -extends = env:STM32F103RC -extra_scripts = ${common_stm32f1.extra_scripts} - buildroot/share/PlatformIO/scripts/STM32F103RC_SKR_MINI.py -build_flags = ${common_stm32f1.build_flags} - -DDEBUG_LEVEL=0 -DSS_TIMER=4 -monitor_speed = 115200 - -[env:STM32F103RC_btt_USB] -platform = ${common_stm32f1.platform} -extends = env:STM32F103RC_btt -build_flags = ${env:STM32F103RC_btt.build_flags} -DUSE_USB_COMPOSITE -lib_deps = ${env:STM32F103RC_btt.lib_deps} - USBComposite for STM32F1@0.91 - -[env:STM32F103RC_btt_512K] -platform = ${common_stm32f1.platform} -extends = env:STM32F103RC_btt -board_upload.maximum_size=524288 -build_flags = ${env:STM32F103RC_btt.build_flags} -DSTM32_FLASH_SIZE=512 - -[env:STM32F103RC_btt_512K_USB] -platform = ${common_stm32f1.platform} -extends = env:STM32F103RC_btt_512K -build_flags = ${env:STM32F103RC_btt_512K.build_flags} -DUSE_USB_COMPOSITE -lib_deps = ${env:STM32F103RC_btt_512K.lib_deps} - USBComposite for STM32F1@0.91 - -# -# STM32F103RE -# -[env:STM32F103RE] -platform = ${common_stm32f1.platform} -extends = common_stm32f1 -board = genericSTM32F103RE -monitor_speed = 115200 - -# -# STM32F103RE_btt ............. RET6 -# STM32F103RE_btt_USB ......... RET6 (USB mass storage) -# -[env:STM32F103RE_btt] -platform = ${common_stm32f1.platform} -extends = env:STM32F103RE -extra_scripts = ${common_stm32f1.extra_scripts} - buildroot/share/PlatformIO/scripts/STM32F103RE_SKR_E3_DIP.py -build_flags = ${common_stm32f1.build_flags} -DDEBUG_LEVEL=0 -DSS_TIMER=4 -debug_tool = stlink -upload_protocol = stlink - -[env:STM32F103RE_btt_USB] -platform = ${common_stm32f1.platform} -extends = env:STM32F103RE_btt -build_flags = ${env:STM32F103RE_btt.build_flags} -DUSE_USB_COMPOSITE -lib_deps = ${common_stm32f1.lib_deps} - USBComposite for STM32F1@0.91 - -# -# REMRAM_V1 -# -[env:REMRAM_V1] -platform = ${common_stm32.platform} -extends = common_stm32 -board = remram_v1 -build_flags = ${common_stm32.build_flags} - -# -# ST NUCLEO-F767ZI Development Board -# This environment is for testing purposes prior to control boards -# being readily available based on STM32F7 MCUs -# -[env:NUCLEO_F767ZI] -platform = ${common_stm32.platform} -extends = common_stm32 -board = nucleo_f767zi -build_flags = ${common_stm32.build_flags} -DTIMER_SERIAL=TIM9 - -# -# ARMED (STM32) -# -[env:ARMED] -platform = ${common_stm32.platform} -extends = common_stm32 -board = armed_v1 -build_flags = ${common_stm32.build_flags} - -O2 -ffreestanding -fsigned-char -fno-move-loop-invariants -fno-strict-aliasing - -# -# Geeetech GTM32 (STM32F103VET6) -# -[env:STM32F103VE_GTM32] -platform = ${common_stm32f1.platform} -extends = common_stm32f1 -board = genericSTM32F103VE -build_flags = ${common_stm32f1.build_flags} - -ffunction-sections -fdata-sections -nostdlib -MMD - -DMCU_STM32F103VE -DARDUINO_GENERIC_STM32F103V -DARDUINO_ARCH_STM32F1 -DBOARD_generic_stm32f103v - -DDEBUG_LEVEL=DEBUG_NONE -DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG=1 -DVECT_TAB_ADDR=0x8000000 - -DERROR_LED_PORT=GPIOE -DERROR_LED_PIN=6 -upload_protocol = serial - -# -# Longer 3D board in Alfawise U20 (STM32F103VET6) -# -[env:STM32F103VE_longer] -platform = ${common_stm32f1.platform} -extends = common_stm32f1 -board = genericSTM32F103VE -extra_scripts = ${common_stm32f1.extra_scripts} - buildroot/share/PlatformIO/scripts/STM32F103VE_longer.py -build_flags = ${common_stm32f1.build_flags} - -DMCU_STM32F103VE -DSTM32F1xx -USERIAL_USB -DU20 -DTS_V12 -build_unflags = ${common_stm32f1.build_unflags} - -DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG=1 -DERROR_LED_PORT=GPIOE -DERROR_LED_PIN=6 - -# -# MKS Robin Mini (STM32F103VET6) -# -[env:mks_robin_mini] -platform = ${common_stm32f1.platform} -extends = common_stm32f1 -board = genericSTM32F103VE -extra_scripts = ${common_stm32f1.extra_scripts} - buildroot/share/PlatformIO/scripts/mks_robin_mini.py -build_flags = ${common_stm32f1.build_flags} - -DMCU_STM32F103VE - -# -# MKS Robin Nano (STM32F103VET6) -# -[env:mks_robin_nano35] -platform = ${common_stm32f1.platform} -extends = common_stm32f1 -board = genericSTM32F103VE -extra_scripts = ${common_stm32f1.extra_scripts} - buildroot/share/PlatformIO/scripts/mks_robin_nano35.py -build_flags = ${common_stm32f1.build_flags} - -DMCU_STM32F103VE -DSS_TIMER=4 -debug_tool = jlink -upload_protocol = jlink - -# -# MKS Robin (STM32F103ZET6) -# -[env:mks_robin] -platform = ${common_stm32f1.platform} -extends = common_stm32f1 -board = genericSTM32F103ZE -extra_scripts = ${common_stm32f1.extra_scripts} - buildroot/share/PlatformIO/scripts/mks_robin.py -build_flags = ${common_stm32f1.build_flags} - -DSS_TIMER=4 -DSTM32_XL_DENSITY - -# MKS Robin (STM32F103ZET6) -# Uses HAL STM32 to support Marlin UI for TFT screen with optional touch panel -# -[env:mks_robin_stm32] -platform = ${common_stm32.platform} -extends = common_stm32 -board = genericSTM32F103ZE -board_build.core = stm32 -board_build.variant = MARLIN_F103Zx -board_build.ldscript = ldscript.ld -board_build.offset = 0x7000 -board_build.encrypt = Yes -board_build.firmware = Robin.bin -build_flags = ${common_stm32.build_flags} - -DENABLE_HWSERIAL3 -DTIMER_SERIAL=TIM5 -build_unflags = ${common_stm32.build_unflags} - -DUSBCON -DUSBD_USE_CDC -extra_scripts = ${common.extra_scripts} - pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py - buildroot/share/PlatformIO/scripts/stm32_bootloader.py - buildroot/share/PlatformIO/scripts/mks_encrypt.py -lib_deps = - -# -# MKS Robin Pro (STM32F103ZET6) -# -[env:mks_robin_pro] -platform = ${common_stm32f1.platform} -extends = env:mks_robin -extra_scripts = ${common_stm32f1.extra_scripts} - buildroot/share/PlatformIO/scripts/mks_robin_pro.py - -# -# TRIGORILLA PRO (STM32F103ZET6) -# -[env:trigorilla_pro] -platform = ${common_stm32f1.platform} -extends = env:mks_robin -extra_scripts = ${common_stm32f1.extra_scripts} - -# -# MKS Robin E3D (STM32F103RCT6) and -# MKS Robin E3 with TMC2209 -# -[env:mks_robin_e3] -platform = ${common_stm32f1.platform} -extends = common_stm32f1 -board = genericSTM32F103RC -platform_packages = tool-stm32duino -extra_scripts = ${common_stm32f1.extra_scripts} - buildroot/share/PlatformIO/scripts/mks_robin_e3.py -build_flags = ${common_stm32f1.build_flags} - -DDEBUG_LEVEL=0 -DSS_TIMER=4 - -# -# MKS Robin E3p (STM32F103VET6) -# - LVGL UI -# -[env:mks_robin_e3p] -platform = ${common_stm32f1.platform} -extends = common_stm32f1 -board = genericSTM32F103VE -extra_scripts = ${common_stm32f1.extra_scripts} - buildroot/share/PlatformIO/scripts/mks_robin_e3p.py -build_flags = ${common_stm32f1.build_flags} - -DMCU_STM32F103VE -DSS_TIMER=4 -debug_tool = jlink -upload_protocol = jlink - -# -# MKS Robin Lite/Lite2 (STM32F103RCT6) -# -[env:mks_robin_lite] -platform = ${common_stm32f1.platform} -extends = common_stm32f1 -board = genericSTM32F103RC -extra_scripts = ${common_stm32f1.extra_scripts} - buildroot/share/PlatformIO/scripts/mks_robin_lite.py - -# -# MKS ROBIN LITE3 (STM32F103RCT6) -# -[env:mks_robin_lite3] -platform = ${common_stm32f1.platform} -extends = common_stm32f1 -board = genericSTM32F103RC -extra_scripts = ${common_stm32f1.extra_scripts} - buildroot/share/PlatformIO/scripts/mks_robin_lite3.py - -# -# JGAurora A5S A1 (STM32F103ZET6) -# -[env:jgaurora_a5s_a1] -platform = ${common_stm32f1.platform} -extends = common_stm32f1 -board = genericSTM32F103ZE -extra_scripts = ${common_stm32f1.extra_scripts} - buildroot/share/PlatformIO/scripts/jgaurora_a5s_a1_with_bootloader.py -build_flags = ${common_stm32f1.build_flags} - -DSTM32F1xx -DSTM32_XL_DENSITY - -# -# Malyan M200 (STM32F103CB) -# -[env:STM32F103CB_malyan] -platform = ${common_stm32f1.platform} -extends = common_stm32f1 -board = malyanM200 -build_flags = ${common_stm32f1.build_flags} - -DMCU_STM32F103CB -D__STM32F1__=1 -std=c++1y -DSERIAL_USB -ffunction-sections -fdata-sections - -Wl,--gc-sections -DDEBUG_LEVEL=0 -D__MARLIN_FIRMWARE__ -lib_ignore = ${common_stm32f1.lib_ignore} - SoftwareSerialM - -# -# Malyan M200 v2 (STM32F070RB) -# -[env:STM32F070RB_malyan] -platform = ${common_stm32.platform} -extends = common_stm32 -board = malyanM200v2 -build_flags = ${common_stm32.build_flags} -DHAL_PCD_MODULE_ENABLED - -O2 -ffreestanding -fsigned-char -fno-move-loop-invariants -fno-strict-aliasing - -DCUSTOM_STARTUP_FILE - -# -# Malyan M200 v2 (STM32F070CB) -# -[env:STM32F070CB_malyan] -platform = ${common_stm32.platform} -extends = common_stm32 -board = malyanm200_f070cb -build_flags = ${common_stm32.build_flags} - -DHAL_PCD_MODULE_ENABLED -DDISABLE_GENERIC_SERIALUSB -DHAL_UART_MODULE_ENABLED -DCUSTOM_STARTUP_FILE - -# -# Malyan M300 (STM32F070CB) -# -[env:malyan_M300] -platform = ${common_stm32.platform} -extends = common_stm32 -board = malyanm300_f070cb -build_flags = ${common_stm32.build_flags} - -DHAL_PCD_MODULE_ENABLED -DDISABLE_GENERIC_SERIALUSB -DHAL_UART_MODULE_ENABLED -src_filter = ${common.default_src_filter} + - -# -# Chitu boards like Tronxy X5s (STM32F103ZET6) -# -[env:chitu_f103] -platform = ${common_stm32f1.platform} -extends = common_stm32f1 -board = CHITU_F103 -extra_scripts = pre:buildroot/share/PlatformIO/scripts/common-dependencies.py - pre:buildroot/share/PlatformIO/scripts/STM32F1_create_variant.py - buildroot/share/PlatformIO/scripts/chitu_crypt.py -build_flags = ${common_stm32f1.build_flags} - -DSTM32F1xx -DSTM32_XL_DENSITY -build_unflags = ${common_stm32f1.build_unflags} - -DCONFIG_MAPLE_MINI_NO_DISABLE_DEBUG= -DERROR_LED_PORT=GPIOE -DERROR_LED_PIN=6 - -# -# Some Chitu V5 boards have a problem with GPIO init. -# Use this target if G28 or G29 are always failing. -# -[env:chitu_v5_gpio_init] -platform = ${common_stm32f1.platform} -extends = env:chitu_f103 -build_flags = ${env:chitu_f103.build_flags} -DCHITU_V5_Z_MIN_BUGFIX - -# -# Creality (STM32F103RET6) -# -[env:STM32F103RET6_creality] -platform = ${env:STM32F103RE.platform} -extends = env:STM32F103RE -build_flags = ${env:STM32F103RE.build_flags} -DTEMP_TIMER_CHAN=4 -extra_scripts = ${env:STM32F103RE.extra_scripts} - pre:buildroot/share/PlatformIO/scripts/random-bin.py - buildroot/share/PlatformIO/scripts/STM32F103RET6_creality.py -debug_tool = jlink -upload_protocol = jlink - -# -# FLSUN QQS Pro (STM32F103VET6) using hal STM32 -# board Hispeedv1 -# -[env:flsun_hispeedv1] -platform = ${common_stm32.platform} -extends = common_stm32 -build_flags = ${common_stm32.build_flags} -DMCU_STM32F103VE -DSS_TIMER=4 -DENABLE_HWSERIAL3 -board = genericSTM32F103VE -board_build.core = stm32 -board_build.variant = MARLIN_F103Vx -board_build.ldscript = ldscript.ld -board_build.offset = 0x7000 -board_build.firmware = Robin_mini.bin -board_build.encrypt = Yes -board_upload.offset_address = 0x08007000 -build_unflags = ${common_stm32.build_unflags} -DUSBCON -DUSBD_USE_CDC -extra_scripts = ${common.extra_scripts} - pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py - buildroot/share/PlatformIO/scripts/stm32_bootloader.py - buildroot/share/PlatformIO/scripts/mks_encrypt.py - -# -# STM32F401VE -# 'STEVAL-3DP001V1' STM32F401VE board - https://www.st.com/en/evaluation-tools/steval-3dp001v1.html -# -[env:STM32F401VE_STEVAL] -platform = ${common_stm32.platform} -extends = common_stm32 -board = STEVAL_STM32F401VE -build_flags = ${common_stm32.build_flags} - -DARDUINO_STEVAL -DSTM32F401xE - -DDISABLE_GENERIC_SERIALUSB -DUSBD_USE_CDC_COMPOSITE -DUSE_USB_FS -extra_scripts = ${common.extra_scripts} - pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py - buildroot/share/PlatformIO/scripts/STM32F401VE_STEVAL.py - -# -# STM32F401RC -# -[env:FYSETC_CHEETAH_V20] -platform = ${common_stm32.platform} -extends = common_stm32 -board = FYSETC_CHEETAH_V20 -build_flags = ${common_stm32.build_flags} -DSTM32F401xC -DVECT_TAB_OFFSET=0xC000 -extra_scripts = ${common.extra_scripts} - pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py - buildroot/share/PlatformIO/scripts/FYSETC_CHEETAH_V20.py - -# -# FLYF407ZG -# -[env:FLYF407ZG] -platform = ${common_stm32.platform} -extends = common_stm32 -board = FLYF407ZG -build_flags = ${common_stm32.build_flags} - -DVECT_TAB_OFFSET=0x8000 -extra_scripts = ${common.extra_scripts} - pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py - -# -# FLY MINI(stm32f103rct6) -# -[env:FLY_MINI] -platform = ${common_stm32f1.platform} -extends = common_stm32f1 -board = genericSTM32F103RC -extra_scripts = ${common_stm32f1.extra_scripts} - buildroot/share/PlatformIO/scripts/fly_mini.py -build_flags = ${common_stm32f1.build_flags} - -DDEBUG_LEVEL=0 -DSS_TIMER=4 - -# -# FYSETC S6 (STM32F446VET6 ARM Cortex-M4) -# -[env:FYSETC_S6] -platform = ${common_stm32.platform} -extends = common_stm32 -platform_packages = tool-stm32duino -board = marlin_fysetc_s6 -build_flags = ${common_stm32.build_flags} - -DVECT_TAB_OFFSET=0x10000 - -DHAL_PCD_MODULE_ENABLED -extra_scripts = ${common.extra_scripts} - pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py -debug_tool = stlink -upload_protocol = dfu -upload_command = dfu-util -a 0 -s 0x08010000:leave -D "$SOURCE" - -# -# STM32F407VET6 with RAMPS-like shield -# 'Black' STM32F407VET6 board - https://wiki.stm32duino.com/index.php?title=STM32F407 -# Shield - https://github.com/jmz52/Hardware -# -[env:STM32F407VE_black] -platform = ${common_stm32.platform} -extends = common_stm32 -board = blackSTM32F407VET6 -build_flags = ${common_stm32.build_flags} - -DARDUINO_BLACK_F407VE - -DUSBD_USE_CDC_COMPOSITE -DUSE_USB_FS -extra_scripts = ${common.extra_scripts} - pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py - -# -# Anet ET4-MB_V1.x/ET4P-MB_V1.x (STM32F407VGT6 ARM Cortex-M4) -# For use with with davidtgbe's OpenBLT bootloader https://github.com/davidtgbe/openblt/releases -# Comment out board_build.offset = 0x10000 if you don't plan to use OpenBLT/flashing directly to 0x08000000. -# -[env:Anet_ET4_OpenBLT] -platform = ${common_stm32.platform} -extends = common_stm32 -build_flags = ${common_stm32.build_flags} -DHAL_SD_MODULE_ENABLED -DHAL_SRAM_MODULE_ENABLED -board = genericSTM32F407VGT6 -board_build.core = stm32 -board_build.variant = MARLIN_F4x7Vx -board_build.ldscript = ldscript.ld -board_build.firmware = firmware.srec -# Just openblt.py (not stm32_bootloader.py) generates the file -board_build.encrypt = Yes -board_build.offset = 0x10000 -board_upload.offset_address = 0x08010000 -build_unflags = ${common_stm32.build_unflags} -DUSBCON -DUSBD_USE_CDC -DUSBD_VID=0x0483 -debug_tool = jlink -upload_protocol = jlink -extra_scripts = ${common.extra_scripts} - pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py - buildroot/share/PlatformIO/scripts/stm32_bootloader.py - buildroot/share/PlatformIO/scripts/openblt.py - -# -# BigTreeTech SKR Pro (STM32F407ZGT6 ARM Cortex-M4) -# -[env:BIGTREE_SKR_PRO] -platform = ${common_stm32.platform} -extends = common_stm32 -board = BigTree_SKR_Pro -build_flags = ${common_stm32.build_flags} - -DSTM32F407_5ZX -DVECT_TAB_OFFSET=0x8000 -extra_scripts = ${common.extra_scripts} - pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py -#upload_protocol = stlink -#upload_command = "$PROJECT_PACKAGES_DIR/tool-stm32duino/stlink/ST-LINK_CLI.exe" -c SWD -P "$BUILD_DIR/firmware.bin" 0x8008000 -Rst -Run -debug_tool = stlink -debug_init_break = - -# -# USB Flash Drive mix-ins for STM32 -# -[stm32_flash_drive] -platform_packages = framework-arduinoststm32@https://github.com/rhapsodyv/Arduino_Core_STM32/archive/usb-host-msc.zip -build_flags = ${common_stm32.build_flags} - -DHAL_PCD_MODULE_ENABLED -DHAL_HCD_MODULE_ENABLED - -DUSBHOST -DUSBH_IRQ_PRIO=3 -DUSBH_IRQ_SUBPRIO=4 - -# -# BigTreeTech SKR Pro (STM32F407ZGT6 ARM Cortex-M4) with USB Flash Drive Support -# -[env:BIGTREE_SKR_PRO_usb_flash_drive] -extends = env:BIGTREE_SKR_PRO -platform_packages = ${stm32_flash_drive.platform_packages} -build_unflags = -DUSBCON -DUSBD_USE_CDC -build_flags = ${stm32_flash_drive.build_flags} - -DSTM32F407_5ZX -DVECT_TAB_OFFSET=0x8000 - -# -# Bigtreetech GTR V1.0 (STM32F407IGT6 ARM Cortex-M4) -# -[env:BIGTREE_GTR_V1_0] -platform = ${common_stm32.platform} -extends = common_stm32 -board = BigTree_GTR_v1 -extra_scripts = ${common.extra_scripts} - pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py -build_flags = ${common_stm32.build_flags} - -DSTM32F407IX -DVECT_TAB_OFFSET=0x8000 - -# -# Bigtreetech GTR V1.0 (STM32F407IGT6 ARM Cortex-M4) with USB Flash Drive Support -# -[env:BIGTREE_GTR_V1_0_usb_flash_drive] -extends = env:BIGTREE_GTR_V1_0 -platform_packages = ${stm32_flash_drive.platform_packages} -build_unflags = -DUSBCON -DUSBD_USE_CDC -build_flags = ${stm32_flash_drive.build_flags} - -DSTM32F407IX -DVECT_TAB_OFFSET=0x8000 - -# -# BigTreeTech BTT002 V1.0 (STM32F407VGT6 ARM Cortex-M4) -# -[env:BIGTREE_BTT002] -platform = ${common_stm32.platform} -extends = common_stm32 -board = BigTree_Btt002 -build_flags = ${common_stm32.build_flags} - -DSTM32F407_5VX -DVECT_TAB_OFFSET=0x8000 - -DHAVE_HWSERIAL2 - -DHAVE_HWSERIAL3 - -DPIN_SERIAL2_RX=PD_6 - -DPIN_SERIAL2_TX=PD_5 -extra_scripts = ${common.extra_scripts} - pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py - -# -# Lerdge base -# -[lerdge_common] -platform = ${common_stm32.platform} -extends = common_stm32 -board = LERDGE -board_build.offset = 0x10000 -board_build.encrypt = Yes -extra_scripts = ${common.extra_scripts} - pre:buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py - buildroot/share/PlatformIO/scripts/stm32_bootloader.py - buildroot/share/PlatformIO/scripts/lerdge.py -build_flags = ${common_stm32.build_flags} - -DSTM32F4 -DSTM32F4xx -DTARGET_STM32F4 - -DDISABLE_GENERIC_SERIALUSB -DARDUINO_ARCH_STM32 -DARDUINO_LERDGE - -DHAL_SRAM_MODULE_ENABLED -build_unflags = ${common_stm32.build_unflags} -DUSBCON -DUSBD_USE_CDC -DUSBD_VID=0x0483 - -# -# Lerdge X -# -[env:LERDGEX] -platform = ${lerdge_common.platform} -extends = lerdge_common -board_build.firmware = Lerdge_X_firmware_force.bin - -# -# Lerdge X with USB Flash Drive Support -# -[env:LERDGEX_usb_flash_drive] -platform = ${env:LERDGEX.platform} -extends = env:LERDGEX -platform_packages = ${stm32_flash_drive.platform_packages} -build_flags = ${stm32_flash_drive.build_flags} - -# -# Lerdge S -# -[env:LERDGES] -platform = ${lerdge_common.platform} -extends = lerdge_common -board_build.firmware = Lerdge_firmware_force.bin - -# -# Lerdge S with USB Flash Drive Support -# -[env:LERDGES_usb_flash_drive] -platform = ${env:LERDGES.platform} -extends = env:LERDGES -platform_packages = ${stm32_flash_drive.platform_packages} -build_flags = ${stm32_flash_drive.build_flags} - -# -# Lerdge K -# -[env:LERDGEK] -platform = ${lerdge_common.platform} -extends = lerdge_common -board_build.firmware = Lerdge_K_firmware_force.bin -build_flags = ${lerdge_common.build_flags} - -DLERDGEK - -# -# Lerdge K with USB Flash Drive Support -# -[env:LERDGEK_usb_flash_drive] -platform = ${env:LERDGEK.platform} -extends = env:LERDGEK -platform_packages = ${stm32_flash_drive.platform_packages} -build_flags = ${stm32_flash_drive.build_flags} - -# -# RUMBA32 -# -[env:rumba32] -platform = ${common_stm32.platform} -extends = common_stm32 -build_flags = ${common_stm32.build_flags} - -Os - -DHAL_PCD_MODULE_ENABLED - -DDISABLE_GENERIC_SERIALUSB - -DHAL_UART_MODULE_ENABLED - -DTIMER_SERIAL=TIM9 -board = rumba32_f446ve -upload_protocol = dfu -monitor_speed = 500000 - -# -# MKS Robin Nano V1.2 and V2 using hal STM32 -# -[env:mks_robin_nano35_stm32] -platform = ${common_stm32.platform} -extends = common_stm32 -build_flags = ${common_stm32.build_flags} -DMCU_STM32F103VE -DSS_TIMER=4 -DENABLE_HWSERIAL3 -board = genericSTM32F103VE -board_build.core = stm32 -board_build.variant = MARLIN_F103Vx -board_build.ldscript = ldscript.ld -board_build.offset = 0x7000 -board_build.encrypt = Yes -board_build.firmware = Robin_nano35.bin -board_upload.offset_address = 0x08007000 -build_unflags = ${common_stm32.build_unflags} -DUSBCON -DUSBD_USE_CDC -debug_tool = jlink -upload_protocol = jlink -extra_scripts = ${common.extra_scripts} - pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py - buildroot/share/PlatformIO/scripts/stm32_bootloader.py - buildroot/share/PlatformIO/scripts/mks_encrypt.py - -# -# MKS Robin Pro V2 -# -[env:mks_robin_pro2] -platform = ${common_stm32.platform} -platform_packages = ${stm32_flash_drive.platform_packages} -extends = common_stm32 -build_flags = ${stm32_flash_drive.build_flags} -board = genericSTM32F407VET6 -board_build.core = stm32 -board_build.variant = MARLIN_F4x7Vx -board_build.ldscript = ldscript.ld -board_build.firmware = firmware.bin -board_build.offset = 0x0000 -board_upload.offset_address = 0x08000000 -build_unflags = ${common_stm32.build_unflags} -DUSBCON -DUSBD_USE_CDC -debug_tool = jlink -upload_protocol = jlink -extra_scripts = ${common.extra_scripts} - pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py - buildroot/share/PlatformIO/scripts/stm32_bootloader.py - -# -# This SPI is used by Robin Nano V3 -# -[stm32f4_I2C1] -build_flags = -DPIN_WIRE_SCL=PB6 -DPIN_WIRE_SDA=PB7 - -# -# MKS Robin Nano V3 -# -[env:mks_robin_nano_v3] -platform = ${common_stm32.platform} -extends = common_stm32 -build_flags = ${common_stm32.build_flags} ${stm32f4_I2C1.build_flags} -DHAL_PCD_MODULE_ENABLED -DUSBCON -DUSBD_USE_CDC -board = genericSTM32F407VGT6 -board_build.core = stm32 -board_build.variant = MARLIN_F4x7Vx -board_build.ldscript = ldscript.ld -board_build.firmware = Robin_nano_v3.bin -board_build.offset = 0xC000 -board_upload.offset_address = 0x0800C000 -build_unflags = ${common_stm32.build_unflags} -debug_tool = jlink -upload_protocol = jlink -extra_scripts = ${common.extra_scripts} - pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py - buildroot/share/PlatformIO/scripts/stm32_bootloader.py - -# -# MKS Robin Nano V3 with USB Flash Drive Support -# Currently, using a STM32duino fork, until USB Host get merged -# -[env:mks_robin_nano_v3_usb_flash_drive] -extends = env:mks_robin_nano_v3 -platform_packages = ${stm32_flash_drive.platform_packages} -build_flags = ${stm32_flash_drive.build_flags} ${stm32f4_I2C1.build_flags} - -DUSBCON - -DUSE_USBHOST_HS - -DUSBD_IRQ_PRIO=5 - -DUSBD_IRQ_SUBPRIO=6 - -DUSE_USB_HS_IN_FS - -DUSBD_USE_CDC - -# -# MKS Robin Nano V3 with USB Flash Drive Support and Shared Media -# Currently, using a STM32duino fork, until USB Host and USB Device MSC get merged -# -[env:mks_robin_nano_v3_usb_flash_drive_msc] -platform = ${common_stm32.platform} -extends = env:mks_robin_nano_v3 -platform_packages = framework-arduinoststm32@https://github.com/rhapsodyv/Arduino_Core_STM32/archive/usb-host-msc-cdc-msc.zip -build_unflags = ${common_stm32.build_unflags} -DUSBD_USE_CDC -build_flags = ${stm32_flash_drive.build_flags} ${stm32f4_I2C1.build_flags} - -DUSBCON - -DUSE_USBHOST_HS - -DUSBD_IRQ_PRIO=5 - -DUSBD_IRQ_SUBPRIO=6 - -DUSE_USB_HS_IN_FS - -DUSBD_USE_CDC_MSC - -# -# Mingda MPX_ARM_MINI -# - -[env:mingda_mpx_arm_mini] -platform = ${common_stm32.platform} -extends = common_stm32 -board = genericSTM32F103ZE -board_build.core = stm32 -board_build.variant = MARLIN_F103Zx -board_build.ldscript = ldscript.ld -board_build.offset = 0x10000 -build_flags = ${common_stm32.build_flags} -DENABLE_HWSERIAL3 -DTIMER_SERIAL=TIM5 -build_unflags = ${common_stm32.build_unflags} -DUSBCON -DUSBD_USE_CDC -extra_scripts = ${common.extra_scripts} - pre:buildroot/share/PlatformIO/scripts/generic_create_variant.py - buildroot/share/PlatformIO/scripts/stm32_bootloader.py - -################################# -# # -# Other Architectures # -# # -################################# - -# -# Espressif ESP32 -# -[env:esp32] -platform = espressif32@2.1.0 -board = esp32dev -build_flags = ${common.build_flags} -DCORE_DEBUG_LEVEL=0 -src_filter = ${common.default_src_filter} + -lib_ignore = NativeEthernet -upload_speed = 500000 -monitor_speed = 250000 -#upload_port = marlinesp.local -#board_build.flash_mode = qio - -[env:FYSETC_E4] -platform = espressif32@1.11.2 -extends = env:esp32 -board_build.partitions = default_16MB.csv - -# -# Teensy 3.1 / 3.2 (ARM Cortex-M4) -# -[env:teensy31] -platform = teensy -board = teensy31 -src_filter = ${common.default_src_filter} + -lib_ignore = NativeEthernet - -# -# Teensy 3.5 / 3.6 (ARM Cortex-M4) -# -[env:teensy35] -platform = teensy -board = teensy35 -src_filter = ${common.default_src_filter} + -lib_ignore = NativeEthernet - -[env:teensy36] -platform = teensy -board = teensy36 -src_filter = ${common.default_src_filter} + -lib_ignore = NativeEthernet - -# -# Teensy 4.0 / 4.1 (ARM Cortex-M7) -# -[env:teensy41] -platform = teensy -board = teensy41 -src_filter = ${common.default_src_filter} + - -# -# Native -# No supported Arduino libraries, base Marlin only -# -[env:linux_native] -platform = native -framework = -build_flags = -D__PLAT_LINUX__ -std=gnu++17 -ggdb -g -lrt -lpthread -D__MARLIN_FIRMWARE__ -Wno-expansion-to-defined -src_build_flags = -Wall -IMarlin/src/HAL/LINUX/include -build_unflags = -Wall -lib_ldf_mode = off -lib_deps = -src_filter = ${common.default_src_filter} + - # # Just print the dependency tree # From 9d0b6c5730e55298b6a94fb07542502a147e84f3 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Thu, 1 Apr 2021 21:54:34 -0500 Subject: [PATCH 249/253] Requiring PIO >= 5.0.3 --- .../PlatformIO/scripts/STM32F1_create_variant.py | 6 ++++-- .../scripts/copy_marlin_variant_to_framework.py | 16 ++-------------- 2 files changed, 6 insertions(+), 16 deletions(-) diff --git a/buildroot/share/PlatformIO/scripts/STM32F1_create_variant.py b/buildroot/share/PlatformIO/scripts/STM32F1_create_variant.py index 0ba5d71f26..91522a9d06 100644 --- a/buildroot/share/PlatformIO/scripts/STM32F1_create_variant.py +++ b/buildroot/share/PlatformIO/scripts/STM32F1_create_variant.py @@ -20,12 +20,14 @@ board = env.BoardConfig() FRAMEWORK_DIR = platform.get_package_dir("framework-arduinoststm32-maple") assert os.path.isdir(FRAMEWORK_DIR) -assert os.path.isdir("buildroot/share/PlatformIO/variants") + +source_root = os.path.join("buildroot", "share", "PlatformIO", "variants") +assert os.path.isdir(source_root) variant = board.get("build.variant") variant_dir = os.path.join(FRAMEWORK_DIR, "STM32F1", "variants", variant) -source_dir = os.path.join("buildroot/share/PlatformIO/variants", variant) +source_dir = os.path.join(source_root, variant) assert os.path.isdir(source_dir) if os.path.isdir(variant_dir): diff --git a/buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py b/buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py index 7ea7ac57f3..15c953156c 100644 --- a/buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py +++ b/buildroot/share/PlatformIO/scripts/copy_marlin_variant_to_framework.py @@ -4,19 +4,7 @@ import os,shutil from SCons.Script import DefaultEnvironment from platformio import util -try: - # PIO < 4.4 - from platformio.managers.package import PackageManager -except ImportError: - # PIO >= 4.4 - from platformio.package.meta import PackageSpec as PackageManager - -def parse_pkg_uri(spec): - if PackageManager.__name__ == 'PackageSpec': - return PackageManager(spec).name - else: - name, _, _ = PackageManager.parse_pkg_uri(spec) - return name +from platformio.package.meta import PackageSpec def copytree(src, dst, symlinks=False, ignore=None): for item in os.listdir(src): @@ -41,7 +29,7 @@ framewords = { if len(platform_packages) == 0: platform_name = framewords[platform.__class__.__name__] else: - platform_name = parse_pkg_uri(platform_packages[0]) + platform_name = PackageSpec(platform_packages[0]).name FRAMEWORK_DIR = platform.get_package_dir(platform_name) assert os.path.isdir(FRAMEWORK_DIR) From c2b72c0e73a59c7b0915253c775eb6253032f0b0 Mon Sep 17 00:00:00 2001 From: Scott Lahteine Date: Fri, 2 Apr 2021 14:22:43 -0500 Subject: [PATCH 250/253] Remove extraneous 'extern' hints (#21516) --- Marlin/src/feature/fanmux.h | 4 +- Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.h | 4 +- Marlin/src/lcd/extui/lib/mks_ui/draw_about.h | 4 +- .../lib/mks_ui/draw_acceleration_settings.h | 4 +- .../extui/lib/mks_ui/draw_advance_settings.h | 4 +- .../mks_ui/draw_auto_level_offset_settings.h | 4 +- .../lcd/extui/lib/mks_ui/draw_baby_stepping.h | 8 ++-- .../lcd/extui/lib/mks_ui/draw_change_speed.h | 10 ++--- .../lcd/extui/lib/mks_ui/draw_cloud_bind.h | 12 ++--- Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.h | 10 ++--- .../extui/lib/mks_ui/draw_eeprom_settings.h | 4 +- .../extui/lib/mks_ui/draw_encoder_settings.h | 4 +- .../lcd/extui/lib/mks_ui/draw_error_message.h | 4 +- .../src/lcd/extui/lib/mks_ui/draw_extrusion.h | 14 +++--- Marlin/src/lcd/extui/lib/mks_ui/draw_fan.h | 6 +-- .../extui/lib/mks_ui/draw_filament_change.h | 8 ++-- .../extui/lib/mks_ui/draw_filament_settings.h | 4 +- Marlin/src/lcd/extui/lib/mks_ui/draw_gcode.h | 4 +- Marlin/src/lcd/extui/lib/mks_ui/draw_home.h | 4 +- .../mks_ui/draw_homing_sensitivity_settings.h | 4 +- .../lcd/extui/lib/mks_ui/draw_jerk_settings.h | 4 +- .../src/lcd/extui/lib/mks_ui/draw_keyboard.h | 4 +- .../src/lcd/extui/lib/mks_ui/draw_language.h | 4 +- .../extui/lib/mks_ui/draw_level_settings.h | 4 +- .../lcd/extui/lib/mks_ui/draw_machine_para.h | 4 +- .../extui/lib/mks_ui/draw_machine_settings.h | 4 +- .../lcd/extui/lib/mks_ui/draw_manuaLevel.h | 4 +- .../lib/mks_ui/draw_max_feedrate_settings.h | 4 +- Marlin/src/lcd/extui/lib/mks_ui/draw_more.h | 4 +- .../extui/lib/mks_ui/draw_motor_settings.h | 4 +- .../lcd/extui/lib/mks_ui/draw_move_motor.h | 6 +-- .../lcd/extui/lib/mks_ui/draw_number_key.h | 4 +- .../src/lcd/extui/lib/mks_ui/draw_operation.h | 4 +- .../lcd/extui/lib/mks_ui/draw_pause_message.h | 2 +- .../extui/lib/mks_ui/draw_pause_position.h | 4 +- .../src/lcd/extui/lib/mks_ui/draw_preHeat.h | 10 ++--- .../lcd/extui/lib/mks_ui/draw_print_file.h | 18 ++++---- .../src/lcd/extui/lib/mks_ui/draw_printing.h | 22 +++++----- .../lcd/extui/lib/mks_ui/draw_ready_print.h | 16 +++---- Marlin/src/lcd/extui/lib/mks_ui/draw_set.h | 4 +- .../lcd/extui/lib/mks_ui/draw_step_settings.h | 4 +- .../lib/mks_ui/draw_tmc_current_settings.h | 4 +- .../lib/mks_ui/draw_tmc_step_mode_settings.h | 4 +- Marlin/src/lcd/extui/lib/mks_ui/draw_tool.h | 4 +- .../extui/lib/mks_ui/draw_touch_calibration.h | 6 +-- .../lib/mks_ui/draw_tramming_pos_settings.h | 4 +- Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp | 2 +- Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h | 36 +++++++-------- Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.h | 6 +-- .../src/lcd/extui/lib/mks_ui/draw_wifi_list.h | 10 ++--- .../lcd/extui/lib/mks_ui/draw_wifi_settings.h | 4 +- .../src/lcd/extui/lib/mks_ui/draw_wifi_tips.h | 4 +- Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h | 16 +++---- .../lcd/extui/lib/mks_ui/printer_operation.h | 6 +-- .../lib/mks_ui/tft_lvgl_configuration.cpp | 8 ++-- .../extui/lib/mks_ui/tft_lvgl_configuration.h | 44 +++++++++---------- .../lcd/extui/lib/mks_ui/tft_multi_language.h | 2 +- Marlin/src/lcd/extui/lib/mks_ui/wifi_module.h | 10 ++--- .../src/lcd/extui/lib/mks_ui/wifi_upload.cpp | 4 +- Marlin/src/module/servo.h | 2 +- Marlin/src/module/tool_change.h | 2 +- 61 files changed, 215 insertions(+), 217 deletions(-) diff --git a/Marlin/src/feature/fanmux.h b/Marlin/src/feature/fanmux.h index b1b0c67a55..efb92cf198 100644 --- a/Marlin/src/feature/fanmux.h +++ b/Marlin/src/feature/fanmux.h @@ -25,5 +25,5 @@ * feature/fanmux.h - Cooling Fan Multiplexer support functions */ -extern void fanmux_switch(const uint8_t e); -extern void fanmux_init(); +void fanmux_switch(const uint8_t e); +void fanmux_init(); diff --git a/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.h b/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.h index 6e0ee3053f..c017d69dae 100644 --- a/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.h +++ b/Marlin/src/lcd/extui/lib/dgus/DGUSDisplay.h @@ -117,7 +117,7 @@ extern DGUSDisplay dgusdisplay; constexpr float cpow(const float x, const int y) { return y == 0 ? 1.0 : x * cpow(x, y - 1); } /// Find the flash address of a DGUS_VP_Variable for the VP. -extern const DGUS_VP_Variable* DGUSLCD_FindVPVar(const uint16_t vp); +const DGUS_VP_Variable* DGUSLCD_FindVPVar(const uint16_t vp); /// Helper to populate a DGUS_VP_Variable for a given VP. Return false if not found. -extern bool populate_VPVar(const uint16_t VP, DGUS_VP_Variable * const ramcopy); +bool populate_VPVar(const uint16_t VP, DGUS_VP_Variable * const ramcopy); diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_about.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_about.h index 77d66aef11..4e7b318eda 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_about.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_about.h @@ -25,8 +25,8 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_about(); -extern void lv_clear_about(); +void lv_draw_about(); +void lv_clear_about(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_acceleration_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_acceleration_settings.h index dc72739106..e333e0ae51 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_acceleration_settings.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_acceleration_settings.h @@ -25,8 +25,8 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_acceleration_settings(); -extern void lv_clear_acceleration_settings(); +void lv_draw_acceleration_settings(); +void lv_clear_acceleration_settings(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_advance_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_advance_settings.h index 8885fc6a4e..8848c34451 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_advance_settings.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_advance_settings.h @@ -25,8 +25,8 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_advance_settings(); -extern void lv_clear_advance_settings(); +void lv_draw_advance_settings(); +void lv_clear_advance_settings(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_auto_level_offset_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_auto_level_offset_settings.h index ec61862a24..38314f6bc2 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_auto_level_offset_settings.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_auto_level_offset_settings.h @@ -25,8 +25,8 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_auto_level_offset_settings(); -extern void lv_clear_auto_level_offset_settings(); +void lv_draw_auto_level_offset_settings(); +void lv_clear_auto_level_offset_settings(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_baby_stepping.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_baby_stepping.h index 8793ad772f..f8efeabc40 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_baby_stepping.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_baby_stepping.h @@ -25,10 +25,10 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_baby_stepping(); -extern void lv_clear_baby_stepping(); -extern void disp_baby_step_dist(); -extern void disp_z_offset_value(); +void lv_draw_baby_stepping(); +void lv_clear_baby_stepping(); +void disp_baby_step_dist(); +void disp_z_offset_value(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.h index 75e4fe3099..66662d8811 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_change_speed.h @@ -28,11 +28,11 @@ #define MIN_EXT_SPEED_PERCENT 10 #define MAX_EXT_SPEED_PERCENT 999 -extern void lv_draw_change_speed(); -extern void lv_clear_change_speed(); -extern void disp_speed_step(); -extern void disp_print_speed(); -extern void disp_speed_type(); +void lv_draw_change_speed(); +void lv_clear_change_speed(); +void disp_speed_step(); +void disp_print_speed(); +void disp_speed_type(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_cloud_bind.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_cloud_bind.h index 1626680051..917b52ab0a 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_cloud_bind.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_cloud_bind.h @@ -25,12 +25,12 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_cloud_bind(); -extern void lv_clear_cloud_bind(); -extern void disp_bind_state(); -extern void refresh_bind_ui(); -extern void display_qrcode(uint8_t *qrcode_data); -extern void cloud_unbind(); +void lv_draw_cloud_bind(); +void lv_clear_cloud_bind(); +void disp_bind_state(); +void refresh_bind_ui(); +void display_qrcode(uint8_t *qrcode_data); +void cloud_unbind(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.h index 38f5fa0635..e53d48a2b8 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_dialog.h @@ -74,11 +74,11 @@ enum { DIALOG_TRANSFER_NO_DEVICE }; -extern void lv_draw_dialog(uint8_t type); -extern void lv_clear_dialog(); -extern void filament_sprayer_temp(); -extern void filament_dialog_handle(); -extern void lv_filament_setbar(); +void lv_draw_dialog(uint8_t type); +void lv_clear_dialog(); +void filament_sprayer_temp(); +void filament_dialog_handle(); +void lv_filament_setbar(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_eeprom_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_eeprom_settings.h index 3d9f7cae00..575ebbc6a2 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_eeprom_settings.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_eeprom_settings.h @@ -25,8 +25,8 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_eeprom_settings(); -extern void lv_clear_eeprom_settings(); +void lv_draw_eeprom_settings(); +void lv_clear_eeprom_settings(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_encoder_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_encoder_settings.h index 392dc67db7..bbf0c34858 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_encoder_settings.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_encoder_settings.h @@ -25,8 +25,8 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_encoder_settings(); -extern void lv_clear_encoder_settings(); +void lv_draw_encoder_settings(); +void lv_clear_encoder_settings(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.h index 35e3bd6cf5..6999ecf5e4 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_error_message.h @@ -29,8 +29,8 @@ #define PGM_P const char * #endif -extern void lv_draw_error_message(PGM_P const msg); -extern void lv_clear_error_message(); +void lv_draw_error_message(PGM_P const msg); +void lv_clear_error_message(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.h index 75db2fbab5..0252767767 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_extrusion.h @@ -25,13 +25,13 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_extrusion(); -extern void lv_clear_extrusion(); -extern void disp_ext_type(); -extern void disp_ext_step(); -extern void disp_ext_speed(); -extern void disp_hotend_temp(); -extern void disp_extru_amount(); +void lv_draw_extrusion(); +void lv_clear_extrusion(); +void disp_ext_type(); +void disp_ext_step(); +void disp_ext_speed(); +void disp_hotend_temp(); +void disp_extru_amount(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.h index d9b23fbbe4..0db87eb4f6 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_fan.h @@ -25,9 +25,9 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_fan(); -extern void lv_clear_fan(); -extern void disp_fan_value(); +void lv_draw_fan(); +void lv_clear_fan(); +void disp_fan_value(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.h index 9c1c9a8767..d3536a380a 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_change.h @@ -25,10 +25,10 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_filament_change(); -extern void lv_clear_filament_change(); -extern void disp_filament_type(); -extern void disp_filament_temp(); +void lv_draw_filament_change(); +void lv_clear_filament_change(); +void disp_filament_type(); +void disp_filament_temp(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_settings.h index f9967df31f..3d190e99c7 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_settings.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_filament_settings.h @@ -25,8 +25,8 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_filament_settings(); -extern void lv_clear_filament_settings(); +void lv_draw_filament_settings(); +void lv_clear_filament_settings(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_gcode.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_gcode.h index 30a378a15a..4e1610431e 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_gcode.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_gcode.h @@ -25,8 +25,8 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_gcode(bool clear = false); -extern void lv_clear_gcode(); +void lv_draw_gcode(bool clear = false); +void lv_clear_gcode(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_home.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_home.h index 779cbb0130..7375dc7aa8 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_home.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_home.h @@ -25,8 +25,8 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_home(); -extern void lv_clear_home(); +void lv_draw_home(); +void lv_clear_home(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_homing_sensitivity_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_homing_sensitivity_settings.h index c6f0e11457..e086391373 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_homing_sensitivity_settings.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_homing_sensitivity_settings.h @@ -25,8 +25,8 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_homing_sensitivity_settings(); -extern void lv_clear_homing_sensitivity_settings(); +void lv_draw_homing_sensitivity_settings(); +void lv_clear_homing_sensitivity_settings(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_jerk_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_jerk_settings.h index 69fd344609..7f5ffc3ac5 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_jerk_settings.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_jerk_settings.h @@ -25,8 +25,8 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_jerk_settings(); -extern void lv_clear_jerk_settings(); +void lv_draw_jerk_settings(); +void lv_clear_jerk_settings(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.h index 0013dc4030..d89806c272 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_keyboard.h @@ -25,8 +25,8 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_keyboard(); -extern void lv_clear_keyboard(); +void lv_draw_keyboard(); +void lv_clear_keyboard(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_language.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_language.h index 9e769e3692..4f51856f4f 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_language.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_language.h @@ -25,8 +25,8 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_language(); -extern void lv_clear_language(); +void lv_draw_language(); +void lv_clear_language(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_level_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_level_settings.h index 95a4e2e2e5..06283d2095 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_level_settings.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_level_settings.h @@ -25,8 +25,8 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_level_settings(); -extern void lv_clear_level_settings(); +void lv_draw_level_settings(); +void lv_clear_level_settings(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_para.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_para.h index 652a7e1eb7..f495e8b35e 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_para.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_para.h @@ -25,8 +25,8 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_machine_para(); -extern void lv_clear_machine_para(); +void lv_draw_machine_para(); +void lv_clear_machine_para(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_settings.h index dd988ede72..f113f65fc1 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_settings.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_machine_settings.h @@ -25,8 +25,8 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_machine_settings(); -extern void lv_clear_machine_settings(); +void lv_draw_machine_settings(); +void lv_clear_machine_settings(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.h index 4e9b8275ba..29c8fa144e 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_manuaLevel.h @@ -25,8 +25,8 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_manualLevel(); -extern void lv_clear_manualLevel(); +void lv_draw_manualLevel(); +void lv_clear_manualLevel(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_max_feedrate_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_max_feedrate_settings.h index f82ffd0eaa..45c3fd29db 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_max_feedrate_settings.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_max_feedrate_settings.h @@ -25,8 +25,8 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_max_feedrate_settings(); -extern void lv_clear_max_feedrate_settings(); +void lv_draw_max_feedrate_settings(); +void lv_clear_max_feedrate_settings(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_more.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_more.h index 2a68d3da99..74ac7e994d 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_more.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_more.h @@ -25,8 +25,8 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_more(); -extern void lv_clear_more(); +void lv_draw_more(); +void lv_clear_more(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_motor_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_motor_settings.h index 632f7bd24d..5d26a402d0 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_motor_settings.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_motor_settings.h @@ -25,8 +25,8 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_motor_settings(); -extern void lv_clear_motor_settings(); +void lv_draw_motor_settings(); +void lv_clear_motor_settings(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.h index a9b75c1d13..133a0444c1 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_move_motor.h @@ -25,9 +25,9 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_move_motor(); -extern void lv_clear_move_motor(); -extern void disp_move_dist(); +void lv_draw_move_motor(); +void lv_clear_move_motor(); +void disp_move_dist(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.h index dbf9015452..fcff280d3b 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_number_key.h @@ -25,8 +25,8 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_number_key(); -extern void lv_clear_number_key(); +void lv_draw_number_key(); +void lv_clear_number_key(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.h index e034f7070b..d58b3307b8 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_operation.h @@ -25,8 +25,8 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_operation(); -extern void lv_clear_operation(); +void lv_draw_operation(); +void lv_clear_operation(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_message.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_message.h index 88222f0e1a..c3df8118a4 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_message.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_message.h @@ -25,7 +25,7 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_pause_message(const PauseMessage msg); +void lv_draw_pause_message(const PauseMessage msg); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_position.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_position.h index e7c92a7396..fd5459c647 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_position.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_pause_position.h @@ -25,8 +25,8 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_pause_position(); -extern void lv_clear_pause_position(); +void lv_draw_pause_position(); +void lv_clear_pause_position(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.h index da3ce88384..2993a95f00 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_preHeat.h @@ -25,11 +25,11 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_preHeat(); -extern void lv_clear_preHeat(); -extern void disp_temp_type(); -extern void disp_step_heat(); -extern void disp_desire_temp(); +void lv_draw_preHeat(); +void lv_clear_preHeat(); +void disp_temp_type(); +void disp_step_heat(); +void disp_desire_temp(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.h index 759ccdc1c0..85eadc0a6b 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_print_file.h @@ -49,15 +49,15 @@ typedef struct { } LIST_FILE; extern LIST_FILE list_file; -extern void disp_gcode_icon(uint8_t file_num); -extern void lv_draw_print_file(); -extern uint32_t lv_open_gcode_file(char *path); -extern void lv_gcode_file_read(uint8_t *data_buf); -extern void lv_close_gcode_file(); -extern void cutFileName(char *path, int len, int bytePerLine, char *outStr); -extern int ascii2dec_test(char *ascii); -extern void lv_clear_print_file(); -extern void lv_gcode_file_seek(uint32_t pos); +void disp_gcode_icon(uint8_t file_num); +void lv_draw_print_file(); +uint32_t lv_open_gcode_file(char *path); +void lv_gcode_file_read(uint8_t *data_buf); +void lv_close_gcode_file(); +void cutFileName(char *path, int len, int bytePerLine, char *outStr); +int ascii2dec_test(char *ascii); +void lv_clear_print_file(); +void lv_gcode_file_seek(uint32_t pos); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.h index 7c98fd767b..b2a02a62da 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_printing.h @@ -36,17 +36,17 @@ enum { STOP }; -extern void lv_draw_printing(); -extern void lv_clear_printing(); -extern void disp_ext_temp(); -extern void disp_bed_temp(); -extern void disp_fan_speed(); -extern void disp_print_time(); -extern void disp_fan_Zpos(); -extern void reset_print_time(); -extern void start_print_time(); -extern void stop_print_time(); -extern void setProBarRate(); +void lv_draw_printing(); +void lv_clear_printing(); +void disp_ext_temp(); +void disp_bed_temp(); +void disp_fan_speed(); +void disp_print_time(); +void disp_fan_Zpos(); +void reset_print_time(); +void start_print_time(); +void stop_print_time(); +void setProBarRate(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.h index 56077e5dec..873be528ed 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ready_print.h @@ -25,14 +25,14 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_ready_print(); -extern void mks_disp_test(); -extern void disp_Limit_ok(); -extern void disp_Limit_error(); -extern void disp_det_error(); -extern void disp_det_ok(); -extern void lv_clear_ready_print(); -extern void lv_temp_refr(); +void lv_draw_ready_print(); +void mks_disp_test(); +void disp_Limit_ok(); +void disp_Limit_error(); +void disp_det_error(); +void disp_det_ok(); +void lv_clear_ready_print(); +void lv_temp_refr(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_set.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_set.h index 8ad8b9f2ea..a270308e07 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_set.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_set.h @@ -25,8 +25,8 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_set(); -extern void lv_clear_set(); +void lv_draw_set(); +void lv_clear_set(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_step_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_step_settings.h index 249e5a7942..4f32f0a6c2 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_step_settings.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_step_settings.h @@ -25,8 +25,8 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_step_settings(); -extern void lv_clear_step_settings(); +void lv_draw_step_settings(); +void lv_clear_step_settings(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.h index 92a2fb12b5..99589a3a17 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_current_settings.h @@ -25,8 +25,8 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_tmc_current_settings(); -extern void lv_clear_tmc_current_settings(); +void lv_draw_tmc_current_settings(); +void lv_clear_tmc_current_settings(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_step_mode_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_step_mode_settings.h index a15baf21e8..aa42d9b87d 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_step_mode_settings.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_tmc_step_mode_settings.h @@ -25,8 +25,8 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_tmc_step_mode_settings(); -extern void lv_clear_tmc_step_mode_settings(); +void lv_draw_tmc_step_mode_settings(); +void lv_clear_tmc_step_mode_settings(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.h index 1cfd297aba..0dc86b7030 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_tool.h @@ -25,8 +25,8 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_tool(); -extern void lv_clear_tool(); +void lv_draw_tool(); +void lv_clear_tool(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_touch_calibration.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_touch_calibration.h index 63749a2b3c..567256a792 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_touch_calibration.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_touch_calibration.h @@ -25,9 +25,9 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_touch_calibration_screen(); -extern void lv_clear_touch_calibration_screen(); -extern void lv_update_touch_calibration_screen(); +void lv_draw_touch_calibration_screen(); +void lv_clear_touch_calibration_screen(); +void lv_update_touch_calibration_screen(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_tramming_pos_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_tramming_pos_settings.h index 3ebb8ae731..863ff6fc7e 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_tramming_pos_settings.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_tramming_pos_settings.h @@ -25,8 +25,8 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_tramming_pos_settings(); -extern void lv_clear_tramming_pos_settings(); +void lv_draw_tramming_pos_settings(); +void lv_clear_tramming_pos_settings(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp index e65ba788f5..68baea30c7 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.cpp @@ -72,7 +72,7 @@ extern bool once_flag; extern uint8_t sel_id; extern lv_group_t *g; -extern void LCD_IO_WriteData(uint16_t RegValue); +void LCD_IO_WriteData(uint16_t RegValue); static const char custom_gcode_command[][100] = { "G29N\nM500", diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h index f4a6d71ea0..2be4f7d70b 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_ui.h @@ -442,28 +442,28 @@ extern lv_style_t style_btn_rel; extern lv_point_t line_points[4][2]; -extern void gCfgItems_init(); -extern void ui_cfg_init(); -extern void tft_style_init(); +void gCfgItems_init(); +void ui_cfg_init(); +void tft_style_init(); extern char *creat_title_text(); -extern void preview_gcode_prehandle(char *path); -extern void update_spi_flash(); -extern void update_gcode_command(int addr,uint8_t *s); -extern void get_gcode_command(int addr,uint8_t *d); -extern void lv_serial_capt_hook(void *, uint8_t); -extern void lv_eom_hook(void *); +void preview_gcode_prehandle(char *path); +void update_spi_flash(); +void update_gcode_command(int addr,uint8_t *s); +void get_gcode_command(int addr,uint8_t *d); +void lv_serial_capt_hook(void *, uint8_t); +void lv_eom_hook(void *); #if HAS_GCODE_PREVIEW - extern void disp_pre_gcode(int xpos_pixel, int ypos_pixel); + void disp_pre_gcode(int xpos_pixel, int ypos_pixel); #endif -extern void GUI_RefreshPage(); -extern void clear_cur_ui(); -extern void draw_return_ui(); -extern void sd_detection(); -extern void gCfg_to_spiFlah(); -extern void print_time_count(); +void GUI_RefreshPage(); +void clear_cur_ui(); +void draw_return_ui(); +void sd_detection(); +void gCfg_to_spiFlah(); +void print_time_count(); -extern void LV_TASK_HANDLER(); -extern void lv_ex_line(lv_obj_t *line, lv_point_t *points); +void LV_TASK_HANDLER(); +void lv_ex_line(lv_obj_t *line, lv_point_t *points); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.h index 77ba5925a3..4fa642b39c 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi.h @@ -26,9 +26,9 @@ #endif -extern void lv_draw_wifi(); -extern void lv_clear_wifi(); -extern void disp_wifi_state(); +void lv_draw_wifi(); +void lv_clear_wifi(); +void disp_wifi_state(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_list.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_list.h index e42b738f14..e2005d5cbc 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_list.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_list.h @@ -25,11 +25,11 @@ extern "C" { /* C-declarations for C++ */ #endif -extern void lv_draw_wifi_list(); -extern void lv_clear_wifi_list(); -extern void disp_wifi_list(); -extern void cutWifiName(char *name, int len,char *outStr); -extern void wifi_scan_handle(); +void lv_draw_wifi_list(); +void lv_clear_wifi_list(); +void disp_wifi_list(); +void cutWifiName(char *name, int len,char *outStr); +void wifi_scan_handle(); #define NUMBER_OF_PAGE 5 diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_settings.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_settings.h index 605423b131..ff27397049 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_settings.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_settings.h @@ -28,8 +28,8 @@ #define WIFI_AP_TEXT "AP" #define WIFI_STA_TEXT "STA" -extern void lv_draw_wifi_settings(); -extern void lv_clear_wifi_settings(); +void lv_draw_wifi_settings(); +void lv_clear_wifi_settings(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_tips.h b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_tips.h index 2f9c9f5745..4ffe6c1312 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_tips.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/draw_wifi_tips.h @@ -26,8 +26,8 @@ #endif -extern void lv_draw_wifi_tips(); -extern void lv_clear_wifi_tips(); +void lv_draw_wifi_tips(); +void lv_clear_wifi_tips(); typedef enum { TIPS_TYPE_JOINING, diff --git a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h index 19c93468e4..e9960fc73a 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/pic_manager.h @@ -154,14 +154,14 @@ typedef struct pic_msg PIC_MSG; #define PIC_SIZE_xM 6 #define FONT_SIZE_xM 2 -extern void Pic_Read(uint8_t *Pname, uint8_t *P_Rbuff); -extern void Pic_Logo_Read(uint8_t *LogoName,uint8_t *Logo_Rbuff,uint32_t LogoReadsize); -extern void lv_pic_test(uint8_t *P_Rbuff, uint32_t addr, uint32_t size); -extern uint32_t lv_get_pic_addr(uint8_t *Pname); -extern void get_spi_flash_data(const char *rec_buf, int offset, int size); -extern void spi_flash_read_test(); -extern void default_view_Read(uint8_t *default_view_Rbuff, uint32_t default_view_Readsize); -extern void flash_view_Read(uint8_t *flash_view_Rbuff, uint32_t flash_view_Readsize); +void Pic_Read(uint8_t *Pname, uint8_t *P_Rbuff); +void Pic_Logo_Read(uint8_t *LogoName,uint8_t *Logo_Rbuff,uint32_t LogoReadsize); +void lv_pic_test(uint8_t *P_Rbuff, uint32_t addr, uint32_t size); +uint32_t lv_get_pic_addr(uint8_t *Pname); +void get_spi_flash_data(const char *rec_buf, int offset, int size); +void spi_flash_read_test(); +void default_view_Read(uint8_t *default_view_Rbuff, uint32_t default_view_Readsize); +void flash_view_Read(uint8_t *flash_view_Rbuff, uint32_t flash_view_Readsize); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.h b/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.h index f304158824..499799c6c7 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/printer_operation.h @@ -27,9 +27,9 @@ #define MIN_FILE_PRINTED 100 //5000 -extern void printer_state_polling(); -extern void filament_pin_setup(); -extern void filament_check(); +void printer_state_polling(); +void filament_pin_setup(); +void filament_check(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp index b7441f71f4..f54b290c13 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.cpp @@ -64,13 +64,13 @@ XPT2046 touch; #endif #if HAS_SPI_FLASH_FONT - extern void init_gb2312_font(); + void init_gb2312_font(); #endif static lv_disp_buf_t disp_buf; lv_group_t* g; #if ENABLED(SDSUPPORT) - extern void UpdateAssets(); + void UpdateAssets(); #endif uint16_t DeviceCode = 0x9488; extern uint8_t sel_id; @@ -190,9 +190,7 @@ void tft_lvgl_init() { #endif tft_style_init(); - filament_pin_setup(); - lv_encoder_pin_init(); TERN_(MKS_WIFI_MODULE, mks_wifi_firmware_update()); @@ -211,7 +209,7 @@ void tft_lvgl_init() { strncpy(public_buf_m, recovery.info.sd_filename, sizeof(public_buf_m)); card.printLongPath(public_buf_m); - strncpy(list_file.long_name[sel_id], card.longFilename, sizeof(list_file.long_name[sel_id])); + strncpy(list_file.long_name[sel_id], card.longFilename, sizeof(list_file.long_name[0])); lv_draw_printing(); } #endif diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.h index d0ea4e376f..308162b799 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_lvgl_configuration.h @@ -37,32 +37,32 @@ extern uint8_t bmp_public_buf[14 * 1024]; extern uint8_t public_buf[513]; -extern void tft_lvgl_init(); -extern void my_disp_flush(lv_disp_drv_t * disp, const lv_area_t * area, lv_color_t * color_p); -extern bool my_touchpad_read(lv_indev_drv_t * indev_driver, lv_indev_data_t * data); -extern bool my_mousewheel_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data); +void tft_lvgl_init(); +void my_disp_flush(lv_disp_drv_t * disp, const lv_area_t * area, lv_color_t * color_p); +bool my_touchpad_read(lv_indev_drv_t * indev_driver, lv_indev_data_t * data); +bool my_mousewheel_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data); -extern void LCD_Clear(uint16_t Color); -extern void tft_set_point(uint16_t x, uint16_t y, uint16_t point); -extern void LCD_setWindowArea(uint16_t StartX, uint16_t StartY, uint16_t width, uint16_t heigh); -extern void LCD_WriteRAM_Prepare(); -extern void lcd_draw_logo(); -extern void lv_encoder_pin_init(); -extern void lv_update_encoder(); +void LCD_Clear(uint16_t Color); +void tft_set_point(uint16_t x, uint16_t y, uint16_t point); +void LCD_setWindowArea(uint16_t StartX, uint16_t StartY, uint16_t width, uint16_t heigh); +void LCD_WriteRAM_Prepare(); +void lcd_draw_logo(); +void lv_encoder_pin_init(); +void lv_update_encoder(); -extern lv_fs_res_t spi_flash_open_cb (lv_fs_drv_t * drv, void * file_p, const char * path, lv_fs_mode_t mode); -extern lv_fs_res_t spi_flash_close_cb (lv_fs_drv_t * drv, void * file_p); -extern lv_fs_res_t spi_flash_read_cb (lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br); -extern lv_fs_res_t spi_flash_seek_cb(lv_fs_drv_t * drv, void * file_p, uint32_t pos); -extern lv_fs_res_t spi_flash_tell_cb(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p); +lv_fs_res_t spi_flash_open_cb(lv_fs_drv_t * drv, void * file_p, const char * path, lv_fs_mode_t mode); +lv_fs_res_t spi_flash_close_cb(lv_fs_drv_t * drv, void * file_p); +lv_fs_res_t spi_flash_read_cb(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br); +lv_fs_res_t spi_flash_seek_cb(lv_fs_drv_t * drv, void * file_p, uint32_t pos); +lv_fs_res_t spi_flash_tell_cb(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p); -extern lv_fs_res_t sd_open_cb (lv_fs_drv_t * drv, void * file_p, const char * path, lv_fs_mode_t mode); -extern lv_fs_res_t sd_close_cb (lv_fs_drv_t * drv, void * file_p); -extern lv_fs_res_t sd_read_cb (lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br); -extern lv_fs_res_t sd_seek_cb(lv_fs_drv_t * drv, void * file_p, uint32_t pos); -extern lv_fs_res_t sd_tell_cb(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p); +lv_fs_res_t sd_open_cb(lv_fs_drv_t * drv, void * file_p, const char * path, lv_fs_mode_t mode); +lv_fs_res_t sd_close_cb(lv_fs_drv_t * drv, void * file_p); +lv_fs_res_t sd_read_cb(lv_fs_drv_t * drv, void * file_p, void * buf, uint32_t btr, uint32_t * br); +lv_fs_res_t sd_seek_cb(lv_fs_drv_t * drv, void * file_p, uint32_t pos); +lv_fs_res_t sd_tell_cb(lv_fs_drv_t * drv, void * file_p, uint32_t * pos_p); -extern void lv_fill_rect(lv_coord_t x1, lv_coord_t y1, lv_coord_t x2, lv_coord_t y2, lv_color_t bk_color); +void lv_fill_rect(lv_coord_t x1, lv_coord_t y1, lv_coord_t x2, lv_coord_t y2, lv_color_t bk_color); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.h b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.h index 61c46a648f..61e3524c58 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/tft_multi_language.h @@ -29,7 +29,7 @@ #include "tft_Language_sp.h" #include "tft_Language_it.h" -extern void disp_language_init(); +void disp_language_init(); #define LANG_SIMPLE_CHINESE 1 #define LANG_COMPLEX_CHINESE 2 diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.h b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.h index 07ae6f72db..048996e919 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.h +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifi_module.h @@ -181,16 +181,16 @@ extern WIFI_GCODE_BUFFER espGcodeFifo; extern uint32_t getWifiTick(); extern uint32_t getWifiTickDiff(int32_t lastTick, int32_t curTick); -extern void mks_esp_wifi_init(); +void mks_esp_wifi_init(); extern int cfg_cloud_flag; extern int send_to_wifi(uint8_t *buf, int len); -extern void wifi_looping(); +void wifi_looping(); extern int raw_send_to_wifi(uint8_t *buf, int len); extern int package_to_wifi(WIFI_RET_TYPE type, uint8_t *buf, int len); -extern void get_wifi_list_command_send(); -extern void get_wifi_commands(); +void get_wifi_list_command_send(); +void get_wifi_commands(); extern int readWifiBuf(int8_t *buf, int32_t len); -extern void mks_wifi_firmware_update(); +void mks_wifi_firmware_update(); #ifdef __cplusplus } /* C-declarations for C++ */ diff --git a/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.cpp b/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.cpp index 378de6d584..e41d473c11 100644 --- a/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.cpp +++ b/Marlin/src/lcd/extui/lib/mks_ui/wifi_upload.cpp @@ -39,9 +39,9 @@ extern SZ_USART_FIFO WifiRxFifo; extern int readUsartFifo(SZ_USART_FIFO *fifo, int8_t *buf, int32_t len); extern int writeUsartFifo(SZ_USART_FIFO * fifo, int8_t * buf, int32_t len); -extern void esp_port_begin(uint8_t interrupt); +void esp_port_begin(uint8_t interrupt); extern int usartFifoAvailable(SZ_USART_FIFO *fifo); -extern void wifi_delay(int n); +void wifi_delay(int n); #define ARRAY_SIZE(a) sizeof(a) / sizeof((a)[0]) diff --git a/Marlin/src/module/servo.h b/Marlin/src/module/servo.h index 29bd3b8798..3b5a5e7e2c 100644 --- a/Marlin/src/module/servo.h +++ b/Marlin/src/module/servo.h @@ -112,4 +112,4 @@ #define MOVE_SERVO(I, P) servo[I].move(P) extern HAL_SERVO_LIB servo[NUM_SERVOS]; -extern void servo_init(); +void servo_init(); diff --git a/Marlin/src/module/tool_change.h b/Marlin/src/module/tool_change.h index a97b09fd89..b79ec676a0 100644 --- a/Marlin/src/module/tool_change.h +++ b/Marlin/src/module/tool_change.h @@ -42,7 +42,7 @@ extern toolchange_settings_t toolchange_settings; #if ENABLED(TOOLCHANGE_FILAMENT_SWAP) - extern void tool_change_prime(); + void tool_change_prime(); #endif #if ENABLED(TOOLCHANGE_FS_PRIME_FIRST_USED) From d0d5003f45eacfba6101ad57fd86d6c25f9691d8 Mon Sep 17 00:00:00 2001 From: Vert <45634861+Vertabreak@users.noreply.github.com> Date: Fri, 2 Apr 2021 20:06:43 -0400 Subject: [PATCH 251/253] GT2560 V3 followup (#21512) --- Marlin/src/pins/mega/pins_GT2560_V3.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Marlin/src/pins/mega/pins_GT2560_V3.h b/Marlin/src/pins/mega/pins_GT2560_V3.h index 8490d5571d..46b4ebf428 100644 --- a/Marlin/src/pins/mega/pins_GT2560_V3.h +++ b/Marlin/src/pins/mega/pins_GT2560_V3.h @@ -83,6 +83,9 @@ #ifndef FIL_RUNOUT2_PIN #define FIL_RUNOUT2_PIN 67 #endif +#ifndef FIL_RUNOUT3_PIN + #define FIL_RUNOUT3_PIN 54 +#endif // // Power Recovery From 9d0e82788a754367cd16d6e1faf21a9bede2e957 Mon Sep 17 00:00:00 2001 From: XDA-Bam <1209896+XDA-Bam@users.noreply.github.com> Date: Sat, 3 Apr 2021 02:11:22 +0200 Subject: [PATCH 252/253] Update u8g / AVR display timing defaults (#21518) --- Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) 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 1e19bf85e5..24baae221e 100644 --- a/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.cpp +++ b/Marlin/src/lcd/dogm/ultralcd_st7920_u8glib_rrd_AVR.cpp @@ -34,9 +34,9 @@ #include "ultralcd_st7920_u8glib_rrd_AVR.h" #if F_CPU >= 20000000 - #define CPU_ST7920_DELAY_1 DELAY_NS(0) + #define CPU_ST7920_DELAY_1 DELAY_NS(150) #define CPU_ST7920_DELAY_2 DELAY_NS(0) - #define CPU_ST7920_DELAY_3 DELAY_NS(50) + #define CPU_ST7920_DELAY_3 DELAY_NS(150) #elif MB(3DRAG, K8200, K8400) #define CPU_ST7920_DELAY_1 DELAY_NS(0) #define CPU_ST7920_DELAY_2 DELAY_NS(188) @@ -58,9 +58,9 @@ #define CPU_ST7920_DELAY_2 DELAY_NS(40) #define CPU_ST7920_DELAY_3 DELAY_NS(340) #elif F_CPU == 16000000 - #define CPU_ST7920_DELAY_1 DELAY_NS(0) + #define CPU_ST7920_DELAY_1 DELAY_NS(125) #define CPU_ST7920_DELAY_2 DELAY_NS(0) - #define CPU_ST7920_DELAY_3 DELAY_NS(63) + #define CPU_ST7920_DELAY_3 DELAY_NS(125) #else #error "No valid condition for delays in 'ultralcd_st7920_u8glib_rrd_AVR.h'" #endif From dd76a50683358732ec3c1a9dadeef479d42d3c94 Mon Sep 17 00:00:00 2001 From: thinkyhead Date: Sat, 3 Apr 2021 00:33:51 +0000 Subject: [PATCH 253/253] [cron] Bump distribution date (2021-04-03) --- Marlin/src/inc/Version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marlin/src/inc/Version.h b/Marlin/src/inc/Version.h index 994348eb76..928e18dae2 100644 --- a/Marlin/src/inc/Version.h +++ b/Marlin/src/inc/Version.h @@ -42,7 +42,7 @@ * version was tagged. */ #ifndef STRING_DISTRIBUTION_DATE - #define STRING_DISTRIBUTION_DATE "2021-04-02" + #define STRING_DISTRIBUTION_DATE "2021-04-03" #endif /**